protocol.md (36474B)
1 # iuna protocol in simple terms 2 3 iuna is an experimental mainnet-candidate protocol that combines three mechanisms: 4 5 - Burn lottery: burning IUNA creates tickets for future block finalization. 6 - VDF timing: the selected finalizer must do sequential delay work before publishing a block. 7 - Proof-of-work issuance: new IUNA enters the chain through PoW mine actions. 8 9 The goal is to make network power scale linearly rather than superlinearly. 10 11 Existing consensus models can amplify existing advantages: 12 13 - Proof of Work: economies of scale and specialized hardware such as ASICs can amplify advantages in capital and infrastructure. 14 - Proof of Stake: existing stake directly increases a participant's influence and rewards, creating a wealth-compounding dynamic. 15 16 iuna uses self-burn Proof of Burn (PoB), where block-finalization power scales directly with the amount burned. VDFs impose a verifiable time cost that limits the feasibility of low-cost attacks. PoW keeps new coin issuance permissionless, allowing anyone capable of producing valid work to earn newly issued coins. 17 18 Burns do not remove wealth advantage. More capital can still buy more lottery weight. The difference from stake is that burn power is paid again and again: it expires, does not unbond, and does not accumulate into a permanent stake position. The design converts wealth-bias from a growing asset into a recurring cost. 19 20 This is still experimental. The rules below describe the frozen mainnet-candidate protocol, not a proven mainnet design. 21 22 ## Mainnet-Candidate Frozen Parameters 23 24 The current mainnet-candidate parameter set is intentionally close to Bitcoin where that is useful for operator expectations: 25 26 - P2P network ID: iuna-mainnet-candidate; 27 - genesis hash: 3d677cd7ced1c04d3a276cbee7ea38076e34ac65f18a2c9b8286a4872d986a9a; 28 - protocol version: 2; 29 - launch profile ID: iuna-mainnet-candidate; 30 - launch profile hash: eb2f67e9d735474859ceb1fe124fe270977214f6e2f4cd855a4d8c3b5ecac558; 31 - target block time: 10 minutes; 32 - maximum compact stored block-body size: 1,000,000 bytes; 33 - maximum transaction items per block: 1,000; 34 - maximum pending transactions per node: 10,000; 35 - maximum pending transaction pool bytes per node: 8 MiB; 36 - maximum orphan transactions per node: 1,024; 37 - ticket maturity delay: 3 blocks; 38 - ticket expiry window: 3 block heights; 39 - objective finality quorum: strictly more than 2/3 of the selected committee; 40 - recovery delay: 6 target block times; 41 - future timestamp drift limit: 2 minutes; 42 - VDF retarget window: 20 rank 0 ticket blocks; 43 - VDF retarget deadband: 10%; 44 - VDF maximum retarget step: 2%; 45 - PoW mine difficulty start: 12 bits; 46 - PoW retarget window: 10 blocks; 47 - PoW target mine actions: 10 per retarget window; 48 - PoW maximum retarget step: 2 bits; 49 - PoW minimum difficulty: 10 bits; 50 - maximum mine actions per anchor: 2; 51 - burn committee size: 5 slots; 52 - maximum signed burn bundle size: 10,000 bytes; 53 - burn committee lineage maturity: 20 blocks; 54 - transaction signing format: 1. 55 56 Changing any value in this section requires a conscious mainnet-candidate reset or later hard-fork process. 57 58 The consensus block-size limit is the exact number of bytes produced by the current compact snapshot block-body encoder when the block is appended to its parent chain. The encoder's reference tables are seeded by genesis allocations and extended in chain order, so all nodes calculate the same context-dependent size. The snapshot header, launch profile, block-count field, SQLite row metadata, and SQLite page overhead are not charged to an individual block. 59 60 The compact representation stores binary hashes, addresses, signatures, and VDF data instead of their hexadecimal text. It uses base-128 varints for integers, chain-wide references for repeated addresses and protocol IDs, a single shared owner and signature for legacy transaction inputs, implicit legacy burn change where possible, and transaction indexes for legacy and v2 burns repeated by the burn-bundle section. Heights, parent hashes, and block hashes are reconstructed from chain order and canonical block contents rather than repeated in each stored block body. Burns benefit most from this layout, followed by transfers and mine actions. Snapshot v9 stores authenticated hybrid reward destinations and v2 burn attestations while retaining v7 and v8 read compatibility. 61 62 P2P messages and management API responses still use JSON. Their byte length is not the consensus block size. Transaction fee-rate ordering uses a separate compact economic transaction weight, so changing JSON whitespace, key order, or hexadecimal formatting cannot change consensus size or fee priority. 63 64 ## Wallet address format 65 66 Wallets display and accept version 0 legacy and version 1 hybrid Bech32m addresses. Mainnet and the 67 mainnet-candidate use the human-readable prefix iuna; local testnet uses 68 tiuna. A version 0 payload contains the wallet's exact 32-byte Ed25519 69 verifying key. A version 1 payload contains a commitment to the wallet's 70 Ed25519 and ML-DSA-44 public keys. Decoding verifies the Bech32m constant, 71 rejects mixed case and non-zero padding, and requires the expected network, 72 version, and payload length. An all-uppercase address is accepted and normalized 73 to lowercase; mixed uppercase/lowercase is invalid. 74 75 Consensus identity is the exact 32-byte Ed25519 verifying key, represented in 76 consensus objects and persisted chainstate as canonical 64-character lowercase 77 hexadecimal. The management wallet, address book, transfer endpoints, and 78 Stratum worker usernames accept Bech32m addresses and decode them to that 79 internal key before constructing a transaction. Recipient, address-book, and 80 Stratum username input rejects raw hexadecimal keys. This boundary keeps the 81 checksum and network distinction out of consensus identity. 82 83 ## Coins and Transactions 84 85 iuna uses a UTXO-style ledger. The main transaction types are: 86 87 1. Transfer: moves IUNA from one address to another and pays a sender-chosen fee. 88 2. Burn: destroys an amount of IUNA, pays a sender-chosen fee, and creates a future lottery ticket. 89 3. Mine action: proves SHA-256-style PoW against the current chain tip. A valid mine action mints a fixed 1 IUNA reward to its recipient and pays a fixed 1 IUNA fee to the block finalizer. Starting at height 3750, the recipient must be a version-1 hybrid address. 90 91 Burn and transfer fees are chosen by the sender. Mine action reward and mine action fee are deterministic protocol values. 92 93 ### Transaction signing format v1 94 95 Every transfer, burn, and mine action is cryptographically scoped to one chain. Its signing or proof preimage starts with the fixed IUNA-TX type tag, the big-endian signing-format version 1, a length-prefixed UTF-8 chain ID, and the length-prefixed 32-byte genesis block hash. The remaining payload uses an explicit one-byte transaction type and canonical binary fields: big-endian fixed-width integers, length-prefixed decoded hashes, signatures and Ed25519 keys, and ordered input/output counts. JSON spelling, field order, and separators never enter the sighash. Hexadecimal fields committed by format v1 must use canonical lowercase encoding; alternate casing is rejected during signature or proof validation. 96 97 Legacy transfers and burns use Ed25519 over this binary preimage. Transaction-v2 spends from version-1 addresses use both Ed25519 and ML-DSA-44 over one canonical v2 payload; this includes hybrid transfers and burns. Native and Stratum mine proofs commit the same domain and logical mine fields before proof-specific hashing. Validators reconstruct the domain from their local launch profile and genesis block, so a transaction valid on candidate, mainnet, testnet, or another genesis fails signature/proof validation everywhere else. Only the defined legacy and v2 formats are accepted. 98 99 A block is invalid if any transaction ID already occurred earlier on that chain. This is especially important for inputless mine actions: without this check, someone could replay an included proof after spending its reward, recreate the same outpoint, and inflate the supply. 100 101 Synthetic genesis-allocation outpoints keep their address-based derivation for the lifetime of the chain. Chain isolation is applied through transaction signatures and proofs. 102 103 ## Burns Become Tickets 104 105 A burn does not immediately select its own block. Instead: 106 107 1. A burn is included in a block. 108 2. It becomes a ticket after the maturity delay. 109 3. The ticket stays eligible for a short expiry window. 110 4. Its lottery weight is the burned amount. 111 112 In the mainnet-candidate profile, tickets mature after 3 blocks and remain eligible for 3 block heights. 113 114 The lottery draw for the next height is deterministic. Nodes rank all eligible burn tickets using the parent's VDF seed and output, the target height, and the ticket amounts. More burned IUNA means more weight, but the winner is still drawn by the protocol. 115 116 Blocks commit the finalizer identity, mode, rank, reward, VDF rounds, leader ticket, transactions, and burn-bundle section into their VDF seed. This prevents a finalizer from completing one VDF and then cheaply changing transactions or the publication timestamp to search for a favorable next leader or committee. Ticket-block timestamps can still reflect the actual completion time, but they do not affect either draw. 117 118 ## Finalizing Blocks 119 120 For each block height, eligible tickets are ranked: 121 122 - Rank 0 is the primary finalizer. 123 - Rank 1, 2, and later ranks are fallback finalizers. 124 125 The selected finalizer must prove ownership of the selected ticket, respect its rank time slot, and run the required VDF work. A block is valid only if the finalizer matches its ranked ticket, carries the correct leader proof, has a valid timestamp for its rank, includes a valid VDF output, and follows the transaction selection rules. 126 127 Fallback finalization invalidates missed ticket opportunities. If a ticket block is finalized by rank 1 or higher, nodes invalidate all tickets ranked from 0 through the finalizing rank for that height. They also invalidate any other currently eligible tickets owned by those same addresses. Future tickets from those addresses that are not yet eligible remain pending. Rank 0 ticket blocks consume only the winning ticket. 128 129 Every normal block must include at least one burn. This keeps the future ticket pool alive even during quiet periods. A node that may finalize prepares a local anchor burn for the next block from the finalizer wallet, and that anchor burn appears directly in the block. 130 131 Burns use a one-block admission pipeline. A public burn is signed against the current chain tip, then queued while the child of that tip is produced. It may appear only in the following block. Validators require its signed anchor to equal the containing block's grandparent hash (the containing block's parent prev_hash). This gives the burn a full VDF interval plus the next burn-collection window to propagate without allowing the finalizer to change the transaction list after starting its VDF. A queued burn survives the first tip change and expires after its single inclusion height if it was not included. The finalizer's mandatory local burn is signed directly for the next block using the same grandparent anchor rule. 132 133 Legacy and v2 burns follow the same admission, fee, inclusion, maturity, and expiry rules. A v2 burn spends hybrid outputs with dual signatures. Its ticket owner is the legacy Ed25519 component of that same hybrid wallet identity, so existing leader proofs and ticket ownership remain compatible while the funds being destroyed are protected by the hybrid authorization. 134 135 The anchor burn is not a fairness mechanism. By itself, it would mostly help the current finalizer keep creating future tickets. Fairness against self-serving finalizers comes from the burn inclusion committee described below. 136 137 ## VDF Timing 138 139 The VDF is there to make block production sequential and time-based. It uses a Chia-compatible Wesolowski proof over a class group of imaginary quadratic forms. The 1024-bit class-group discriminant is derived deterministically from the block VDF seed, so the protocol does not rely on an RSA trusted setup or on anyone destroying hidden factors. 140 141 VDF solutions are encoded with the classgroup-wesolowski-bqfc-v1 prefix followed by two 100-byte Chia BQFC forms in hexadecimal: the output y and the Wesolowski proof pi. The implementation is Rust-only and has no GMP, MPIR, or other native runtime dependency. Proof generation uses a Chia-compatible checkpoint-and-bucket time-memory tradeoff. For large workloads, the prover increases its internal pass count to keep the checkpoints within a fixed memory budget; a bounded-memory constant-space fallback remains available when no checkpoint configuration fits the allocation limits. These internal strategies produce the same proof and do not change verification or the wire format. 142 143 In a local Apple Silicon release benchmark, the Rust-only checkpoint prover completed 100,000 rounds in about 0.9s. Its lower-memory fallback took about 1.8s, while the official Python/C++ Chia reference took about 0.67s. These measurements are only a performance snapshot on one machine; they do not affect consensus or the VDF wire format. 144 145 The target block time is 10 minutes. The protocol retargets VDF rounds from recent observed block times: 146 147 - It uses a 20 block observation window. 148 - It uses rank 0 ticket blocks for retargeting. 149 - It ignores fallback and recovery blocks for retargeting because their timestamps include intentional waiting. 150 - It has a 10% deadband and a maximum 2% retarget step per adjustment. 151 - Extremely fast or slow samples are clamped before they affect the next target. 152 153 Fallback finalizers use more VDF work: rank 0 uses the base rounds, rank 1 uses 2x, rank 2 uses 3x, and so on. This gives the primary finalizer the first chance while still allowing the network to move if the primary does not publish. 154 155 VDF rounds alone are not the fallback gate. Faster hardware could otherwise finish a lower-ranked VDF before a slower primary finalizer. iuna therefore also uses rank time slots: 156 157 - rank 0 blocks are valid as soon as their timestamp is greater than the parent timestamp; 158 - rank 1 blocks are valid from parent timestamp + 2 * target block time; 159 - rank 2 blocks are valid from parent timestamp + 4 * target block time; 160 - and so on. 161 162 If a fallback finalizer finishes the VDF early, it must wait until its slot opens before publishing. Rank 0 does not wait on a rank slot; that keeps the primary path useful as the clean VDF-speed signal for retargeting. If a rank 0 finalizer finishes late, the block timestamp should reflect that later completion/publication time so VDF retargeting can observe slow rounds. Other nodes reject fallback blocks whose timestamp is before their rank slot. 163 164 ## Timestamp Checks 165 166 Rank slots depend on block timestamps, so timestamps are constrained by consensus: 167 168 - a block timestamp must be greater than its parent timestamp; 169 - it must exceed median-time-past; 170 - it must not be too far in the future relative to the validating node's network-adjusted clock; 171 - for fallback ticket blocks, it must be at or after the finalizer rank slot. 172 173 The future drift limit is 2 minutes. A finalizer can lie within that small margin, but cannot skip an entire 10 minute fallback rank slot by claiming a far-future timestamp. P2P treats too-early future/slot blocks as temporal errors rather than peer-banning evidence. 174 175 ## Recovery Blocks 176 177 If the ticket path does not produce a valid block for long enough, recovery finalization becomes available. This can happen because selected ticket finalizers do not publish, or because they cannot satisfy the rules needed for a valid ticket block. The recovery delay is 6 target block times. 178 179 A recovery block: 180 181 - does not use a burn-ticket leader proof; 182 - must include at least one burn from the recovery finalizer; 183 - uses normal base VDF rounds; 184 - is ignored by VDF retarget observations. 185 186 Recovery is a liveness mechanism. It is not meant to be the normal block path. 187 188 ## Proof-of-Work Issuance 189 190 Mine actions are how new IUNA is minted after genesis. 191 192 A mine action is anchored to a recent chain tip and must meet the current PoW difficulty. It creates 1 IUNA for the recipient when included in a block, and pays a fixed 1 IUNA fee to the block finalizer. 193 194 Difficulty targets about one mine action per block: 195 196 - The retarget window is 10 blocks. 197 - The target is 10 mine actions per window. 198 - Difficulty can move by at most 2 bits per window. 199 - Difficulty has a minimum of 10 bits in the mainnet-candidate profile. 200 - Mine actions expire when their anchor is too old. 201 202 This keeps issuance separate from finalization. PoW miners compete to create mine actions; burn-ticket finalizers decide blocks. 203 204 A block may contain at most 2 mine actions for the same anchor. This leaves room for the difficulty retarget to move upward when PoW regularly fills both slots, while still bounding issuance from any single anchor. 205 206 Each mine proof may be included only once in the chain under the transaction-ID uniqueness rule above. Spending a mine reward never makes its proof eligible for inclusion again. 207 208 ## Fair Burn Inclusion 209 210 The central censorship risk is simple: what if a finalizer only includes its own burns and ignores everyone else's burns? 211 212 Burn fairness is enforced by a burn inclusion committee. The committee gives independently observed burns a path into the next block, even when the block finalizer would rather ignore them. 213 214 The idea is: 215 216 1. Burns are ordinary mempool transactions. 217 2. Committee members look at the valid burns they have seen. 218 3. Each committee member signs a burn bundle for the next block height. 219 4. The finalizer must include enough committee attestations for its rank. 220 5. Every burn in the required burn list must appear in the block. 221 222 So a censoring finalizer cannot simply leave out third-party burns that the committee witnessed. To keep censoring, it must either keep those burns away from committee members, control enough committee influence, or disrupt the normal ticket path until weaker liveness rules take over. 223 224 Each block has one burn-selected finalizer and up to four additional burn committee members. The finalizer is committee slot 0; the finalizer's block signature counts as its slot 0 burn-list attestation. Additional committee selection is root-first: mature UTXO lineage weight selects a group, then a wallet with a valid ticket for the target height is selected from within that lineage. 225 226 Why not weight the whole committee directly by burn tickets? Because then a large burner could buy both block production and the inclusion watchdog with the same weight. Instead, mature mined-coin lineage value determines which root groups can win additional slots. A valid ticket only determines which wallet may represent a winning group; its burn amount does not determine that root's committee weight. 227 228 A UTXO lineage is a lightweight ancestry tag: 229 230 1. A mine action output starts a lineage root. 231 2. Transfer and change outputs carry that root forward. 232 3. If a transaction spends outputs from multiple roots, descendants inherit the newest root. 233 4. Deterministic tie-breaks handle roots with the same age. 234 5. Outputs with no mine root have no burn-committee lineage weight. 235 236 A lineage root is eligible for burn committee selection only when its mine action is at least 20 blocks old at the parent tip. 237 238 Node implementation note: nodes cache this root tag on every UTXO and maintain an index from root to total unspent value, so normal validation does not need to search full ancestry. 239 240 Committee selection is root-first. For each eligible lineage root, validators sum the unspent value currently tagged with that root: 241 242 root_value = sum(unspent_value_micro_iuna_tagged_with_root) 243 244 The root's committee weight is: 245 246 root_weight = floor(log2(1 + root_value)) 247 248 Splitting one large root across many addresses does not multiply committee influence, because the root is weighted once and can win at most one additional burn committee slot. Merging roots deliberately collapses future descendant lineage to the newest root; lineage is a Sybil-resistance tag, not full coin-provenance accounting. 249 250 The lineage weight is logarithmic. A larger root has more chance to be selected, but doubling value does not double influence forever. This keeps committee selection from becoming a simple rich-get-richer vote while still giving larger, older mined lineages some weight. 251 252 For a target height and committee slot, validators derive a deterministic committee seed from the parent hash, parent VDF output, target height, and slot number. Slot 0 is assigned to the actual block finalizer. Every ticket rank can derive up to four additional slots, while the rank-dependent quorum determines how many attestations are required. Lower-ranked ticket owners that missed their slot are skipped for fallback committee selection. Extra slots are assigned without replacement by weighted deterministic draws over eligible lineage roots using root_weight. 253 254 After a lineage root wins, validators deterministically choose one representative from the owners of unspent outputs tagged with that root. The representative must own a valid ticket for the target height. Non-ticket owners cannot sign for the group, even when they hold the root's largest output. The finalizer, missed fallback owners, and addresses already selected for an earlier slot are skipped. If no eligible ticket-owning representative remains for a root, that root cannot provide a committee slot. 255 256 The protocol can detect addresses and lineage roots, not hidden common control, so a finalizer using unrelated addresses is still a social and economic risk rather than something this rule can perfectly identify. 257 258 If fewer eligible roots contain an eligible non-finalizer ticket wallet, the committee is smaller. If none exists, burn inclusion quorum falls back to 1-of-1 through the finalizer's implicit slot 0 attestation. 259 260 ### Burn Committee Reward Split 261 262 The block reward is the total fee reward for the block. It remains a single deterministic amount in the block, but validators credit it as one or more implicit reward outputs. 263 264 For normal ticket blocks, lower-rank finalization pays more to the independent burn-inclusion committee: 265 266 - rank 0: the finalizer receives 50%; the non-finalizer members whose attestations are included split the other 50% equally; 267 - rank 1: the finalizer receives 50%; the non-finalizer members whose attestations are included split the other 50% equally; 268 - rank 2 and later: the finalizer receives 100%. 269 270 Recovery blocks pay 100% to the recovery finalizer. 271 272 Only attestations actually included in the block earn a committee share. If no extra committee attestation is required, the finalizer receives the full reward. Integer amounts are rounded down into the committee half (reward / 2), so the finalizer receives the remainder when the reward is odd. Committee reward outputs do not create UTXO lineage; lineage selection remains based on mature mine-action descendants. Starting at height 3750, finalizer and rewarded committee outputs use authenticated version-1 hybrid payout addresses. The finalizer signs its block payout address with its legacy identity; each committee member binds its payout address into its signed burn bundle. 273 274 A committee member can sign one burn bundle for its slot, height, and parent hash. A bundle is at most 10,000 bytes and lists valid fee-paying pending legacy and v2 burns eligible at that height, ordered by absolute fee and then transaction identifier. Burns queued for the following height are not included yet. Honest committee policy is to include every valid burn it selects by that canonical ordering, or to sign an empty bundle only when the signer knows no valid burn for that height. Empty bundles are an honest-policy signal, not something validators can prove from their own mempools. Consensus checks committee membership, signature validity, lineage assignment, ordering, and threshold. 275 276 Automatic nodes wait about 30 seconds after seeing pending burns for the next height before signing a burn bundle or starting the burn-list-bound VDF. This gives burn gossip time to settle and avoids locking in an underfilled bundle from the first partial batch a node received. 277 278 A block contains legacy and v2 transactions plus one compact burn-bundle section. The finalizer's anchor burn is reserved before optional transactions, whether it uses legacy or hybrid funds. 279 280 The compact burn-bundle section stores: 281 282 - up to four explicit burn committee bundle signatures for non-finalizer slots, in slot order; 283 - deduplicated required legacy and v2 burn lists; and 284 - a small bitmask per burn saying which of the included committee bundles contained that burn. 285 286 The required burn list is the union of fee-paying burns contained in the attestations the block uses. If one committee member signs an empty bundle and another signs a bundle with burns, the required list still includes the burns from the non-empty bundle. 287 288 Required burns must fit in the block. Nodes reject burn bundles or attestation sets whose deduplicated required burn list cannot fit within the block size and transaction count limits. 289 290 Validators reconstruct each signed committee bundle from this compact section before checking signatures, bundle size, slot assignment, lineage-based slot assignment, and fee ordering. The finalizer's block signature is treated as its committee attestation for slot 0. Slot 0 does not have a separate burn bundle signature; it attests to the block's deduplicated required burn list as included by the finalizer. This keeps consensus bound to the independent burn attestations without storing the same burn payload multiple times when multiple committee members selected it. 291 292 Block validity is not allowed to depend on a validator's local mempool. Validators decide the required burn-list threshold from deterministic chain and block data only. Pending burns can affect local relay, bundle-signing, and block-building policy, but they cannot make the same block valid on one node and invalid on another. 293 294 A block may contain at most one bundle per slot. If a block includes one valid bundle for a slot, validators check that included bundle and do not need to know whether another bundle for the same slot existed elsewhere. If a block builder sees the same assigned member sign two different bundles for the same height, parent, and slot before block assembly, it ignores that member's bundles for the round as local safety policy. Different ticket ranks can assign different members to the same slot, so those bundles do not conflict. The current protocol does not have a separate slashing rule for this. 295 296 Ticket blocks need a rank-dependent threshold of burn-list attestations. Rank 0 has the strictest rule because it is the preferred path. Missed lower-rank ticket owners are excluded from fallback committees, but each rank can still select up to five committee members from the remaining eligible owners. 297 298 That is a deliberate liveness tradeoff. A block only commits to the bundles it includes, so burns seen exclusively by non-selected or omitted committee members are not required. Lower ranks use a smaller threshold and are therefore weaker for fairness, but preserve liveness when the preferred path is stuck. 299 300 The available committee size is the finalizer plus the selected non-finalizer committee members for that height: 301 302 - rank 0 needs min(3, committee size) attestations (3-of-5, 3-of-4, 3-of-3, 2-of-2, or 1-of-1), where the finalizer's block signature counts as the slot 0 attestation; 303 - rank 1 needs min(2, committee size) attestations (2-of-5 through 2-of-2, or 1-of-1); 304 - rank 2 and later ticket finalizers need only the finalizer's implicit slot 0 attestation (1-of-n). 305 306 Recovery blocks do not require burn-list signatures. They are the last liveness escape hatch after the ticket path has failed, so committee failure must not be able to stop the chain forever. Recovery is weaker for fairness and is not meant to be the normal block path. 307 308 Burn-committee lineage draws use the same ungrindable parent randomness as the leader lottery: the parent VDF seed and VDF output. The target height and committee slot are separate inputs to each draw. This prevents a completed ticket VDF from being reused with different publication timestamps to search for a favorable next committee. 309 310 The ticket-block VDF seed includes a content commitment that covers the finalizer, mode, rank, reward, VDF rounds, selected ticket, transactions, and burn-bundle section: 311 312 seed = hash(parent hash || height || content commitment || attestation_hash[0] || ... || attestation_hash[4]) 313 314 Recovery blocks also bind the block timestamp into the VDF seed: 315 316 seed = hash(parent hash || height || timestamp_ms || content commitment || attestation_hash[0] || ... || attestation_hash[4]) 317 318 The burn-list attestation hashes are part of the VDF seed. This forces the finalizer to choose the included burn-attestation set before doing the delay work. After the VDF is computed, changing that attestation set changes the seed and invalidates the work. 319 320 Slot 0 uses a synthetic finalizer attestation hash derived from the parent, height, finalizer address, and the block's canonical deduplicated required burn list. Slots 1 through 4 use the signed burn-bundle hash or the fixed default hash when absent. 321 322 For recovery blocks, missing burn-list attestations use the fixed default hashes. A recovery block may include available burn bundles, but it does not need burn bundles in order to be valid. 323 324 Every burn in the deduplicated required burn list must appear in the block. A required burn is executed only once even if multiple committee bundles contained it. The block may also include additional valid burns not present in the required list, but those additional burns do not count toward the committee attestation threshold. 325 326 Every transaction that consumes normal block space must pay a fee. Transfers and burns with zero fee are invalid; the finalizer's local anchor burn is an ordinary fee-paying burn. Mine actions pay the deterministic mine action fee. Genesis burns are the only zero-fee burn transactions, and they are valid only inside the genesis block. 327 328 This does not make censorship impossible. A finalizer can still censor burns that no committee member has seen, and a well-funded attacker can try to control enough UTXO lineage weight to dominate the burn committee. But the attack is no longer just "win the block and leave out everyone else." The attacker also has to beat the independent inclusion layer, or force the chain onto weaker liveness paths. 329 330 ## P2P Mempool Gossip 331 332 Nodes gossip: 333 334 - transfers; 335 - burns; 336 - canonical transaction-v2 envelopes, including hybrid transfers and burns; 337 - mine actions; 338 - signed burn bundles; 339 - burn-bundle requests for missing committee slots at a specific next-block height and parent hash; 340 - block inventory and blocks. 341 342 Legacy anchor burns are prepared locally by the finalizer. Hybrid anchor burns use the v2 mempool so they survive restart and can be relayed and attested before inclusion. 343 344 When a ticket finalizer is collecting burn-bundle attestations and has fewer signatures than its 345 rank requires, it may request the missing slots. Peers answer from their local cache with matching 346 signed burn bundles for that height, parent hash, and slot set. 347 348 Nodes only keep transactions in their local mempool when they are valid, fee-paying, and unexpired. Pending and orphan transaction pools are bounded by both item count and serialized byte size. A signed burn bundle is limited to 10,000 bytes, and nodes only cache valid bundles for the next height and current parent. 349 350 When the pending count or byte bound is reached, a node admits an independent transaction only if its fee rate is strictly higher than the lowest evictable pending package. Package eviction removes dependent pending transactions and orphan descendants together. This is local relay policy, not a block-consensus rule. 351 352 ## Block Selection 353 354 When a node builds a block, the flow is: 355 356 1. Collect valid signed burn bundles for the next height. 357 2. Reserve an eligible legacy or v2 anchor burn from the finalizer wallet. 358 3. For recovery blocks, ensure at least one anchor burn is from the recovery finalizer. 359 4. Include every legacy and v2 burn required by the selected burn-bundle attestations. 360 5. Fill remaining block space with valid fee-paying legacy and v2 transactions ordered by fee rate. Mine actions are limited to 2 actions per anchor. 361 6. Bind the VDF seed to the five burn-attestation slot hashes, using default hashes for missing slots. Slot 0 uses the synthetic finalizer attestation hash instead of a separate burn-bundle signature. 362 363 Blocks are bounded by transaction count and exact compact stored block-body size. The mainnet-candidate maximum is 1,000,000 bytes. Block admission checks the finished block with the parent chain's compact reference context. Block construction uses the same encoder while reserving mandatory anchor and attested burns before filling the remaining space. 364 365 ## Fork Choice 366 367 Nodes fully validate candidate blocks or snapshots before considering a reorg. A candidate chain must share the same genesis. 368 369 Burn inclusion is part of block validity. If a ticket block carries burn-list attestations but omits a burn required by those attestations, nodes reject the block before fork choice. The fork choice rule only compares chains made of valid blocks. 370 371 A rank 0 ticket block requires signatures from strictly more than two thirds of its selected burn committee. The leader counts as one signer through its leader proof; the other signers use burn-bundle signatures. Every signature commits to the child height and parent hash, so a valid rank 0 child certifies its parent. For a five-slot committee, this means the leader plus three explicit committee signatures. Smaller committees require floor(2n/3) + 1 total signatures. Rank 1, later ticket ranks, and recovery blocks use their liveness thresholds but do not create an objective finality checkpoint. 372 373 Fork choice compares the highest valid checkpoint before chain length. A higher checkpoint wins even when its current tip is shorter, so healthy partitions can converge after more than six blocks. When checkpoints are identical, the taller chain wins. Equal-height chains use the existing first-divergent leader-score comparison. If certificates conflict at the same height, nodes choose the lexicographically smaller checkpoint hash. A strictly higher conflicting certificate supersedes a lower checkpoint. 374 375 This is recoverable objective finality, not a promise that a finalized block can never be reorganized. “Finalized” means that the selected committee for the next rank 0 block signed the block's hash as its parent with a strict two-thirds quorum, and that no competing chain has a better checkpoint under the public rule above. Nodes do not use first-seen or first-peer trust to resolve a fork. 376 377 ## Genesis and Joining 378 379 Genesis is explicit. A normal node without a chain starts in setup mode and waits to join an existing chain from peers rather than silently creating a separate chain. 380 381 The genesis flow bootstraps the mainnet-candidate network with an initial burn ticket and a fixed 1 IUNA initial reward for the genesis wallet. New nodes fetch and validate chain snapshots from peers, then continue with normal block validation. 382 383 ## What This Design Is Trying to Achieve 384 385 iuna is trying to make these things true at the same time: 386 387 - Finalization should not require specialized mining hardware. 388 - New issuance should not require already owning a large stake. 389 - Burns should have real opportunity cost. 390 - Burn timing power should expire rather than accumulate into permanent control. 391 - Block timing should be hard to rush. 392 - Finalizers should have a consensus-level reason to include independently witnessed burn traffic. 393 394 The design is intentionally small and still evolving. The candidate exists to find out whether these assumptions hold under mainnet-like operation and where they break.