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
| Price | Starting value on mainnet | Bounds |
|---|---|---|
| transfer fee (the fee scale) | 1.0, written 0.01 ZBC in the vote | one atomic unit to 1 ZBC, that is up to 100 times the start |
| account rent | 0.01 ZBC per period | one atomic unit to 10 ZBC per period |
| token upkeep | 0.1 ZBC per period | one atomic unit to 10 ZBC per period |
| dataset storage price | 0.05 ZBC per MiB per period | from one atomic unit |
| storage multiplier | 1.0 | its own bounds |
| gateway stake | 10 ZBC | from one atomic unit |
| market creation cost | 50 ZBC | from one atomic unit |
| market taker fee | 0.1 % | 1 to 100 basis points |
| queue minimum | 100 ZBC | one 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:
- 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.
- 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.
Worked examples
Ten counted seats, and a price standing at 100:
| Votes | Each vote counts as | New price |
|---|---|---|
| two seats vote 120, eight are silent | 120, 120, and 100 for each silent seat | (2 × 120 + 8 × 100) ÷ 10 = 104 |
| one seat votes 10,000, nine are silent | 120 | (120 + 9 × 100) ÷ 10 = 102 |
| one seat votes 0, nine are silent | 50 | (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.
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).