ZooBC wiki
Economics and governance

Price votes

A handful of ZooBC prices are not fixed for ever: the seats of the node registry and its seats vote on them. From version 0.5.8 one rule covers every votable price. Once per snapshot cycle, 30 days on mainnet, each price moves to the average over the counted seats, a silent seat counting at the standing price, after every vote has been limited to at most 20 % above the standing price and at least half of it. Everything else, from the emission schedule to the balances, is out of reach of any vote.

What can be voted

PriceStarting value on mainnetBounds
transfer fee (the fee scale)1.0, written 0.01 ZBC in the voteone atomic unit to 1 ZBC, that is up to 100 times the start
account rent0.01 ZBC per periodone atomic unit to 10 ZBC per period
token upkeep0.1 ZBC per periodone atomic unit to 10 ZBC per period
dataset storage price0.05 ZBC per MiB per periodfrom one atomic unit
storage multiplier1.0its own bounds
gateway stake10 ZBCfrom one atomic unit
market creation cost50 ZBCfrom one atomic unit
market taker fee0.1 %1 to 100 basis points
queue minimum100 ZBCone atomic unit to 250 ZBC

The transfer fee multiplies the base action fee of 0.025 ZBC in every transaction's floor (fees). The queue minimum is the smallest stake a node can enter the queue with (registering a node). The other prices are explained with their features: Account rent and pruning, token upkeep (persistence), datasets, gateways and markets and orders.

How a price moves

Every registered seat that is not suspended has one voice; these are the counted seats. During a cycle a seat may vote as often as it likes, and its latest vote counts. At the end of the cycle:

  1. Each vote is limited: at most 20 % above the standing price, at least half of it, and always inside the price's floor and ceiling.
  2. The new price is the average over all counted seats, every silent seat counting at the standing price.

If nobody votes, nothing changes. A median of the votes cast, an exact two-thirds agreement or the highest vote decide nothing.

Ten seats: two vote 120 and eight silent seats count as keeping 100; 240 + 800 = 1,040, divided by 10 gives a new price of 104.
Ten seats: two vote 120 and eight silent seats count as keeping 100; 240 + 800 = 1,040, divided by 10 gives a new price of 104.

Worked examples

Ten counted seats, and a price standing at 100:

VotesEach vote counts asNew price
two seats vote 120, eight are silent120, 120, and 100 for each silent seat(2 × 120 + 8 × 100) ÷ 10 = 104
one seat votes 10,000, nine are silent120(120 + 9 × 100) ÷ 10 = 102
one seat votes 0, nine are silent50(50 + 9 × 100) ÷ 10 = 95

Without the limit, the vote of 10,000 would give a plain average of 1,090. With the limit applied first, one seat moves the price by at most a tenth of the full step on a registry of ten seats, and by 0.2 % on a registry of 100.

A vote of 10,000 passes the limit of half to +20 % and counts as 120; with nine silent seats at 100 the average is (120 + 9 × 100) ÷ 10 = 102.
A vote of 10,000 passes the limit of half to +20 % and counts as 120; with nine silent seats at 100 the average is (120 + 9 × 100) ÷ 10 = 102.

How fast prices can move

Even when every seat votes the full step, a price rises by at most 20 % in a cycle and falls at most by half. A tenfold rise takes about 13 cycles, a tenfold cut about 4.

Every price counted in ZBC can be voted down to one atomic unit (0.00000001 ZBC). If ZBC becomes very valuable, these prices can follow it down, so that keeping an account or a dataset does not become absurdly expensive in real terms. From the account rent's 0.01 ZBC, reaching one unit takes about 20 halvings, so at least 20 cycles. Nothing becomes free: every computed charge is rounded up to at least one atomic unit.

Casting a vote

Votes are fee-free duty transactions signed with the seat's node key (keys of a node). Every price except the transfer fee is voted with SetConsensusParam (type 51).

The transfer fee is the one price with a two-step vote:

  • in the first half of the cycle, a seat sends a FeeVoteCommitment (type 7) carrying only a 32-byte hash of its vote, so the value stays hidden;
  • in the second half, it sends a FeeVoteReveal (type 263) with the value.

A reveal counts only if it hashes to a commitment the same seat made in the same cycle, and a seat's latest valid vote is the one used. The new fee is then computed like every other price.

Safeguards

  • Registry floor. No registry-wide decision resolves while the registry has fewer than max(3, its genesis minimum) seats or distinct owner accounts, which is 7 on mainnet. Two seats of one operator are one voice in that count.
  • Once per cycle. A parameter changes at most once per cycle, and always stays within its bounds.
  • The money stays with the seats. Whatever these prices charge reaches the registered nodes: rents through the longevity pool, fees through the lottery (pools, coinbase lottery).

What no vote can change

The emission schedule, against which every node checks each block's coinbase (supply and emission); the balance of any account; the consensus rules and the heights at which they apply; and the genesis. These come with the genesis and the node software, and no vote or key moves them (ZooBC Foundation). The seats have one more vote outside prices: two thirds of them can veto a software release (releases and updates).

See also