ZooBC wiki
Proof of Participation

Priority rounds, empty blocks and the previous producer

Two rules decide what a drawn producer may put in its block, and when. Only the producers of the first ten rounds may include transactions; later producers may make empty blocks only. And the node that made the previous block is demoted in the next draw, so it makes the next block only as a late fallback. Both rules keep the chain moving whatever happens, while keeping the important choices with the producers the draw put first.

Priority rounds

Each producer has a position: the index, counted from 0, of the draw that named it. The parameter max_priority_blocksmiths is 10, so:

  • positions 0 to 9, that is rounds 1 to 10, may carry transactions;
  • from position 10 on (round 11 and later), the block must carry no transactions. It may still carry receipts.

The rule is checked when the block is produced, in each node's pool of candidate blocks, and by every validator. A late block that includes transactions is refused.

Rounds 1 to 10 may carry transactions; rounds 11 to 14 make empty blocks only, receipts allowed. A round-12 producer makes an empty block and the coinbase is still paid.
Rounds 1 to 10 may carry transactions; rounds 11 to 14 make empty blocks only, receipts allowed. A round-12 producer makes an empty block and the coinbase is still paid.

The rule balances two goals. Liveness never depends on the top producers being online: even if many drawn nodes are down, someone further down the list keeps the chain growing. But the right to choose transactions stays with the highest-priority producers, so a low-ranked node gains nothing by racing a full block, or a block of hand-picked transactions, onto the chain.

An empty block is a complete block

An empty block is perfectly valid. It carries the receipts its producer earned, so the producer's relaying work still counts towards its participation score. It also pays the coinbase scheduled for its time like any other block: from version 0.5.8 every block's coinbase must equal the schedule exactly, so the coinbase lottery never misses a block (see supply and emission).

Pending transactions are not lost. They wait in the nodes' pools for the next block whose producer may include them.

The previous producer is demoted

The producer of block N stays in the draw for block N+1, but its draws count as no earlier than round 10, the last round that may carry transactions. Its block weight is capped the same way: in the weight formula its draw count k is never less than 10, so if it does make block N+1 as the fallback, the block adds at most a tenth of the weight of a first-round block (see fork choice and cumulative difficulty). In practice another drawn node makes block N+1 whenever one is able to.

The demotion is not a penalty. A demoted draw is never counted as a missed turn, and the node keeps its seat and its score.

The draw for block N+1: the previous producer D, drawn first, is moved down to round 10; node B, drawn second, makes the block. D is never removed, so the chain never halts.
The draw for block N+1: the previous producer D, drawn first, is moved down to round 10; node B, drawn second, makes the block. D is never removed, so the chain never halts.

Why not let it produce twice in a row?

The seed of block N+1 settles draws that depend on block N, such as the results of on-chain games and bets (see block seed (VRF) and apps on ZooBC). A node that made both blocks would hold a block's contents and the seed that settles them. The rule is that nobody should own both a bet and the seed that resolves it, as long as another node is able to answer.

Why not remove it from the draw?

Removing the previous producer would make a two-node chain alternate strictly between its nodes, and it would leave a chain with a single working node unable to produce at all. Demoted rather than removed, the previous producer remains the producer of last resort: if nobody else delivers, it can still make the block from round 10, whose target is 150 seconds after the previous block. The chain never halts because of this rule.

See also