Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

$$ \newcommand \VRF {\mathrm{VRF}} \newcommand \RewardsRate {\mathrm{RewardsRate}} \newcommand \RewardUnits {\mathrm{RewardUnits}} $$

Block Header

An Algorand Ledger can be minimally defined by a sequence of block headers linked by the prevHash field, as the header contains a cryptographic commitment to the contents of the block body (the payset).

The following diagram illustrates the minimal Ledger definition:

Minimal Ledger

Genesis Identifier and Genesis Hash

A string and a 32-byte array, respectively.

They ensure the block belongs to the correct blockchain. These match the genesis information about the chain’s state.

📎 EXAMPLE

For the MainNet:

  • Genesis ID: mainnet-v1.0
  • Genesis Hash: wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8= (base64 encoding of the 32-byte array).

For the TestNet:

  • Genesis ID: testnet-v1.0
  • Genesis Hash: SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI= (base64 encoding of the 32-byte array).

Previous Hash

Cryptographic commitment (hash) of the previous block header, linking blocks into a chain. The genesis block has this field set to \( 0 \).

Round

A 64-bit unsigned integer value that identifies the block’s round. The genesis block has round \( 0 \). For all other cases, it must be equal to the round of the previous block plus one (that is, they must be sequential and monotonically increasing).

Seed

A 32-byte array holding a random value used as a seed for cryptographic processes (e.g., block proposer selection).

The seed calculation algorithm (see ABFT normative specification) defines implicitly a sequence of seeds, whose values alternate according to:

  • The seed lookup constant \( \delta_s \),

  • Some round-specific computation that depends, amongst other things, on the seed refresh interval \( \delta_r \), the period \( p \) during which the block was assembled, and on the \( \VRF \) value obtained by the block proposer.

📎 EXAMPLE

Example a valid seed chain computation.

Timestamp

A 64-bit unsigned integer.

The timestamp is purely informational and states when a block was proposed, expressed in seconds since UNIX Epoch (00:00:00 Thursday, 1 January 1970, at UTC).

The difference between consecutive timestamps cannot be greater than \( t_{\delta} = 25 \) seconds

See the formal definition in the Ledger normative specification.

📎 EXAMPLE

In the reference implementation, checks on the timestamp are performed during block assembly. See the MakeBlock function.

Consensus protocol does not guarantee the accuracy of the timestamp!

Transaction Commitment

Cryptographic commitments (hash) to the block’s transaction sequence. Internally, it uses a Merkle Tree and commits to the tree’s root.

Two different hashes are provided:

⚙️ IMPLEMENTATION

Transactions (payset) commit reference implementation.

Proposer Payout

The amount in μALGO paid to the proposer is the sum of a fee component and a bonus component. The payout is subject to eligibility criteria and protocol limits.

For further details, refer to the rewards non-normative specification.

  • FeeCollected
    Total transaction fees collected in the block expressed in μALGO.

  • Bonus
    A potential extra reward component of the block proposer payout, in addition to the fee component, expressed in μALGO. Subject to change during upgrades and to decrease every millionth round, according to an exponential decay curve.

Proposer

Address of the account that proposed this block.

Rewards

A structure representing the reward state. It contains the following fields:

  • FeeSink
    A 32-byte array holding a constant address. This address collects transaction fees and pays block rewards.

📎 EXAMPLE

MainNet FeeSink address: Y76M3MSY6DKBRHBL7C3NNDXGS5IIMQVQVUAB6MP4XEMMGVF2QWNPL226CA.

This legacy rewards distribution mechanism is currently inactive. See the non-normative section for further details on the active reward mechanism.

  • RewardsPool (legacy)
    A 32-byte array holding a constant address. This address pays distribution rewards (legacy system, currently inactive).

📎 EXAMPLE

MainNet RewardsPool address: 737777777777777777777777777777777777777777777777777UFEJ2CI.

  • RewardsLevel (legacy)
    A 64-bit unsigned integer holding the amount of μALGO distributed to each participant account since the genesis block.

  • RewardsRate (legacy)
    A 64-bit unsigned integer indicating the amount of μALGO added to the participation stake from the RewardsPool in the next round (legacy system, currently set to \( 0 \) for every block).

  • RewardsResidue (legacy)
    A 64-bit unsigned integer holding the leftover amount of μALGO after the distribution of \( \frac{\RewardsRate}{\RewardUnits} \) for every reward unit in the next round.

  • RewardsRecalculationRound (legacy)
    A 64-bit unsigned integer holding the round at which the \( \RewardsRate \) will be recalculated.

Transaction Counter

A 64-bit unsigned integer counting transactions committed before this block. It is initialized at \( 0 \) or \( 1000 \) in the genesis block, depending on the AppForbidLowResources consensus parameter.

Upgrade State

This field tracks the protocol upgrade state machine. It contains a link to the currently active version of this specification.

  • CurrentProtocol
    A link to the commit in the Algorand Formal Specification repository of the currently active protocol version.

  • NextProtocol
    A link to the commit in the Algorand Formal Specification repository of a new protocol version being voted on.

  • NextProtocolApprovals
    An uint64 integer that represents the vote count for a next protocol upgrade. Set to 0 unless a vote is ongoing.

  • NextProtocolSwitchOn
    Round number at which the next protocol would be adopted. Set to 0 unless a vote is ongoing.

  • NextProtocolVoteBefore
    Round number before which a vote for the next protocol version should be issued and computed. Set to 0 unless a vote is ongoing.

Upgrade Vote

This field represents the vote of the block proposer on the new protocol version.

It contains two fields:

  • UpgradeApprove
    A boolean flag that indicates an affirmative vote for the new protocol version. Usually set to false unless a protocol upgrade vote is ongoing.

  • UpgradeDelay
    The delay in rounds between the approval of a new protocol version and its execution. Usually set to \( 0 \) unless an upgrade vote is ongoing.

Participation Updates

A structure with two optional fields:

  • Expired Participation Accounts
    An optional list of account addresses to be removed from consensus participation, due to expired participation keys (from the end of this round). Limited to \( 32 \) accounts.

  • Absent Participation Accounts
    An optional list of online account addresses to be removed from consensus participation, due to long-lasting absenteeism in the expected block proposals. Limited to \( 32 \) accounts.

Block Header Examples

With Protocol Upgrade Proposal, Without Payout

{
    "genesis-hash":"wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=",
    "genesis-id":"mainnet-v1.0",
    "previous-block-hash":"owhv6q/adgf0AvSNw9cC6Va7blSQUeCRaNaVKb0bqY0=",
    "round":46000000,
    "seed":"6Sv0nt/y7Wltt+nbwMpPZwLADmNURXmFHkrihTpqKYE=",
    "timestamp":1736228624,
    "transactions-root":"4V2mkvL+vDuQcN2Vq8x4HJzZCtNd/+pChJfFW9YVxNU=",
    "transactions-root-sha256":"/nZs/lsL98Lw9NaqdT+3rdlKsFJyLqM8u4AKm42yIzg=",
    "rewards":{
        "fee-sink":"Y76M3MSY6DKBRHBL7C3NNDXGS5IIMQVQVUAB6MP4XEMMGVF2QWNPL226CA",
        "rewards-calculation-round":46500000,
        "rewards-level":218288,
        "rewards-pool":"737777777777777777777777777777777777777777777777777UFEJ2CI",
        "rewards-rate":0,
        "rewards-residue":6886250026
    },
    "state-proof-tracking":[
        {
            "next-round":45999872,
            "online-total-weight":0,
            "type":0
        }
    ],
    "txn-counter":2667677491,
    "upgrade-state":{
        "current-protocol":"https://github.com/algorandfoundation/specs/tree/925a46433742afb0b51bb939354bd907fa88bf95",
        "next-protocol":"https://github.com/algorandfoundation/specs/tree/236dcc18c9c507d794813ab768e467ea42d1b4d9",
        "next-protocol-approvals":2,
        "next-protocol-switch-on":46210138,
        "next-protocol-vote-before":46002138
    },
    "upgrade-vote":{
        "upgrade-approve":false,
        "upgrade-delay":0
    }
}

Without Protocol Upgrade Proposal, With Payout

{
    "genesis-hash":"wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8=",
    "genesis-id":"mainnet-v1.0",
    "previous-block-hash":"kl2qk0j7kUVQIfB53HeQMXr0aVjSQpUfLqlD0o9s/rE=",
    "round":49920000,
    "seed":"dwdIvSTHCglZ17+C/ukJMgj6zRMsh50H+4SlLaa9mO0=",
    "timestamp":1747224224,
    "transactions-root":"kgdfSAlEK8escojfUfgsiINgrVZcjghYLGBfyfDVL6Y=",
    "transactions-root-sha256":"bpefFXuYuJ2SdzUIHk8zZ9WhVd+qNMwriFjIUMNpz2Q=",
    "bonus":9702990,
    "fees-collected":673000,
    "proposer":"2R5FTTVDIAQ55I5SPW5BE6R2SVYY45O5W64XGIVBLHQYWMZARRXTO4VIHQ",
    "proposer-payout":10039490,
    "rewards":{
        "fee-sink":"Y76M3MSY6DKBRHBL7C3NNDXGS5IIMQVQVUAB6MP4XEMMGVF2QWNPL226CA",
        "rewards-calculation-round":50000000,
        "rewards-level":218288,
        "rewards-pool":"737777777777777777777777777777777777777777777777777UFEJ2CI",
        "rewards-rate":0,
        "rewards-residue":6886250026
    },
    "state-proof-tracking":[
        {
            "next-round":49920000,
            "online-total-weight":1950063504685967,
            "type":0,
            "voters-commitment":"Zw1ruItyLxO/Y8L8iFaOZhW6yUOMO1KeCVDOPyK9kPvGxFRF5c/kCxihruqVsiO9ptYcqq6FnRx9X6sZpS1PBw=="
        }
    ],
    "txn-counter":2993570351,
    "upgrade-state":{
        "current-protocol":"https://github.com/algorandfoundation/specs/tree/236dcc18c9c507d794813ab768e467ea42d1b4d9",
        "next-protocol-approvals":0,
        "next-protocol-switch-on":0,
        "next-protocol-vote-before":0
    },
    "upgrade-vote":{
        "upgrade-approve":false,
        "upgrade-delay":0
    }
}