Base unit (O-2.6): the design's section 8 as landed (the seventeen fork commits, the suites, the Igneum side, the B10 gate and what is left), spec 2.5 and O-2.6 as Decided and implemented, ledger E22 status, bench-log addendum, fork-divergence row
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
39b8e599eb
commit
c67df8dd4e
6 changed files with 61 additions and 27 deletions
|
|
@ -2619,3 +2619,8 @@ a second (110 MB a day) with two varints and twice that with the fixed field; at
|
|||
design picks two varints and keeps the existing field number for the low word (a message under 2^64 is byte-identical to today's).
|
||||
The fork's suites after the change: `kaspa-consensus-core` 129 passed (the 18 new tests among them), the rest in the O-2.6 report.
|
||||
|
||||
Addendum, 7 October 2026, 00:3x UK (branch `decimals`, B4 as built): on the real p2p messages the two-word form costs +12 B
|
||||
on a fixed two-output transaction (233 to 245 B; +6.0 per output: +7 B above 2^64, +5 B below it) and +7 B on a UTXO entry
|
||||
message (48 to 55 B); the 8-decimal bytes are asserted equal to a fixture encoded on the untouched tree. The suites of the
|
||||
merged phase-B tree are in `docs/design/base-unit.md` section 8.
|
||||
|
||||
|
|
|
|||
|
|
@ -141,29 +141,58 @@ retired at the widening; `pool/src/payout.rs` and `prover.rs` keep `as f64 / 1e1
|
|||
| A half-widened binary starts the testnet | the coinbase, the UTXO value and the wire still carry u64 | `IMPLEMENTED_DECIMALS` = [8]; `igneumd` refuses to start a network whose unit it cannot mint (section 8) |
|
||||
| Postgres `bigint` in the observer | i64 overflows at one 18-decimal block | `numeric` at the widening |
|
||||
|
||||
## 8. What is in the tree tonight and what is left
|
||||
## 8. What landed (phase B, 6 to 7 October 2026) and what is left
|
||||
|
||||
In the tree (fork branch `decimals` from eec34ac3 on the box mirror: 3158571c the type, fa61e035 the parameter and the schedule, fcd6b6e9 the mass rule, 6d5f2488 the measurement; each commit tested on its own on igneum-build-1, the first two by a stash-and-run: 120 and 126 consensus-core tests; the final tree: kaspa-consensus-core 129 passed, igneum-exec 21, igneum-miner 18, kaspa-p2p-flows 33, kaspa-pow 15, kaspad 2 + 7; kaspa-consensus 102 passed and 1 failed, `igneum_m20_tests::witnesses_are_checked_in_epoch_order_under_their_own_seeds` under the `igneum-pow` feature, which fails identically on the untouched eec34ac3 and is not this lane's):
|
||||
the parameter in `Params`, `OverrideParams`, the digest (once not 8), all four networks (devnet and simnet 8, testnet and
|
||||
mainnet 18); `unit::Amount` with every byte form and the round-trip test above `u64::MAX` first; the schedule at any
|
||||
unit (`block_subsidy_units` and family) asserted bit for bit against the u64 schedule at 8 and under the cap at 18;
|
||||
`calc_storage_mass_units` with the same-answer test; `Params::unit`, `wei_per_unit`, `storage_mass_parameter_units`,
|
||||
`supply_cap_units`; the daemon's base-unit line and its refusal to start on a unit the binary cannot mint; the
|
||||
measurement. The devnet's digest is unchanged (tested: an explicit 8 in the override file gives the same digest).
|
||||
Fork branch `decimals` on the box mirror (every commit built and its crates' suites run on igneum-build-1; the two
|
||||
pre-existing reds `igneum_m20_tests::witnesses_are_checked_in_epoch_order_under_their_own_seeds` and the
|
||||
`ban_is_decided_by_the_carrying_block` flake skipped, both red on the untouched eec34ac3):
|
||||
|
||||
Left (phase B, the widening proper; every row is a commit that compiles and passes on its own, in this order):
|
||||
|
||||
| Step | Files | Hours |
|
||||
| Step | Commit | What |
|
||||
|---|---|---|
|
||||
| B1 `TransactionOutput.value`, `UtxoEntry.amount`, `UtxoCell` to `Amount`; tx version 2 in `hashing/tx.rs` and the sighash; `MAX_SOMPI` to the params | consensus-core (tx, utxo, hashing, mass, errors, sign) | 4 |
|
||||
| B2 coinbase: `CoinbaseManager` on `block_subsidy_units`, payload 16 bytes under version 2, `BlockRewardData`, the validators | consensus (coinbase, body validation, tx validation, utxo validation, test consensus) | 3 |
|
||||
| B3 the UTXO store schema version with the legacy decode, utxo diffs, muhash, the UTXO index | consensus stores, database, indexes | 2 |
|
||||
| B4 p2p: `value_hi` and `amount_hi`, protocol version 17, converters | protocol/p2p, flows | 2 |
|
||||
| B5 RPC: gRPC pair, rpc-core model, wRPC serializer version, JSON strings, wasm BigInt | rpc, consensus/client, wasm | 3 |
|
||||
| B6 mempool and mining: fee rate keys, relay floor at the unit, dust, templates | mining | 2 |
|
||||
| B7 exec bridge: `execute_segment(Amount)`, `wei_per_unit`, the guest input type, the shard program id re-pinned for the testnet genesis only | igneum/exec, proving/igneum-prove | 2 |
|
||||
| B8 txscript: the two introspection opcodes at 16-byte numbers or refused above 2^63 | crypto/txscript | 2 |
|
||||
| B9 wallet, cli, pool, observer, public stats, the app's display on `format_ign` | wallet, cli, pool, tools/observer, app | 3 |
|
||||
| B10 flip `IMPLEMENTED_DECIMALS` to [8, 18]; the six-crate suite and a Devnet 2 crossing at 8 (nothing moves); a two-node testnet-params chain at 18 mining for ten minutes with the coinbase, the explorer and viem reading the same number | tools/fleet, the gate | 3 |
|
||||
| the type | 3158571c | `unit::Amount` and every byte form |
|
||||
| the parameter and the schedule | fa61e035 | `base_unit_decimals` in Params, overrides, the digest once not 8; the schedule at any unit |
|
||||
| the mass rule | fcd6b6e9 | `calc_storage_mass_units` |
|
||||
| the measurement | 6d5f2488 | section 5 |
|
||||
| the economy lane | 6ffd5451 | merge of `tail-emission-node` 486895d6: one schedule, rescaled to the unit |
|
||||
| the width rule | a91fb532 | every amount form follows the network's unit; the devnet byte-identical |
|
||||
| B1 | 472664dc | output value, entry amount, mass cells, fees in Amount; hashes through `consensus_bytes`; u128 rules |
|
||||
| B2 | eea7971a | the coinbase: subsidy, payload width, manager on the u128 table |
|
||||
| B6 | 20a6fd64 | the mempool: fee keys, relay floor at the unit, template fees |
|
||||
| B9a | c217eff0 | the inherited wallet crates compile at the boundary |
|
||||
| B7 | 637dbfab | the exec bridge: `execute_segment(Amount)`, `to_wei` at the installed unit, the guest untouched |
|
||||
| B3 | fa40457a (d98e4f8c, 431390e2) | stores and the UTXO index |
|
||||
| B4 | 8d642f53 | p2p: the low and high words, no protocol version bump |
|
||||
| B5 | b8e5b627 (ec3560da) | RPC: model, converters, gRPC pairs, wRPC, JSON, wasm |
|
||||
| B8 | 23851be1 (65961e3c) | script numbers at the network's width |
|
||||
| B10a | 0f649f6b | `IMPLEMENTED_DECIMALS` = [8, 18]; the genesis payloads at 16 bytes; the daemon's genesis check |
|
||||
| the miner | df2fbd03 | `inspect` at the network's width; testnet and mainnet prefixes |
|
||||
|
||||
26 hours of lane work, now running (coordinator's go, 6 October 2026, 23:2x UK): B1 first, B3, B4, B5 and B8 fanned out to sub-agents on separate fork branches from the B1 commit, B2 and B6 in this lane, then B7, B9 and B10. The devnet needs none of it to keep running; the testnet genesis needs all of it, B10 is the gate, and the tree ships as 0.3.17.
|
||||
Suites on the merged tree (release, igneum-build-1): consensus-core 139, consensus 109, txscript 158 + 3, mining 52,
|
||||
rpc-core 134, grpc-core 14, p2p 22 and 33, pow 15, miner 18, exec 22, utxoindex 9, index-core 9, database 22, pskt 5,
|
||||
kaspad 2, db_compat 7; the workspace checks with every target but the two inherited `rpc_core_mock.rs` files (the
|
||||
finality methods, red on the base tree). `tools/ci/base-unit-pending-check.sh`: no `pending_u64()` site in anything
|
||||
the node runs; 26 remain in the inherited Kaspa wallet, cli and rothschild, excluded by rule (Igneum ships none of
|
||||
them; the Igneum wallet is the testnet-wallet lane's).
|
||||
|
||||
The Igneum side (repository branch `decimals`): the observer reads the payload at the network's width and keeps
|
||||
amounts in `numeric`; the pool reads the subsidy from the installed table in u128 and bridges by the installed unit
|
||||
(it builds against `vendor/igneum-node`, so it compiles once the fork lands there: unverified tonight); the app's user
|
||||
strings are hash rates and addresses, its reward lines log wei as f64 (no change); `site/api/public-stats` keeps
|
||||
`decimals_consensus: 8` for the devnet it serves and reads the network's unit when the testnet observer exists.
|
||||
|
||||
B10, the gate (`tools/fleet/base-unit-gate.sh`): two nodes on the testnet params on igneum-build-1 start at 18
|
||||
decimals (the daemon prints `Base unit: 10^18 base units per IGN (wei, the EVM's unit)`, digest 57c4c924...), peer,
|
||||
and mine with the CPU engine; the checks are in the script's header. The CPU engine does 0.147 MH/s on 32 threads
|
||||
against the testnet's 2^28 expected hashes a block, so a block takes 10 to 30 minutes on the box: the hour-long CPU
|
||||
form (MIN_BLOCKS 3) is what runs tonight; the ten-minute, hundreds-of-blocks form needs a GPU wave box from the fleet
|
||||
lane and the same script. Result: appended below when the run ends.
|
||||
|
||||
What is left after B10:
|
||||
- igneum-testnet-1's genesis: the testnet lane re-cuts it on the 16-byte payload layout (the hash in this tree,
|
||||
494fc9a3..., is the PROPOSED genesis re-laid; the lane's FINAL genesis 87617621... was cut on the 8-byte layout and
|
||||
cannot start at 18).
|
||||
- the pool's build against the fork (one `cargo check` when the fork lands in `vendor/igneum-node`).
|
||||
- the Igneum wallet lane: amounts as `Amount`, `format_ign` for display, `parse_ign` for input (section 6).
|
||||
- the inherited Kaspa wallet and cli: 26 `pending_u64()` sites, if they are ever shipped.
|
||||
- the exec layer pays producer shares to blue blocks only while the UTXO coinbase pays a red's share to the merging
|
||||
miner (pre-existing; the exec lane's).
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ Implements `docs/design/execution-layer.md` D1 to D10 and section 8.2 on a 3-nod
|
|||
| `igneum/evm-types/` (new crate `igneum-evm-types`) | Decoding through alloy (`TxEnvelope::decode_2718`), sender recovery, Cancun intrinsic gas, the per-transaction and per-body state-free rules; depends on alloy only so consensus and the executor share one decoder | Design 1.5 state-free class in one place | None to consensus beyond its use above | New crate. Pins `alloy-consensus 2.5`, `alloy-primitives 1.7`, `alloy-eips 2.5`. |
|
||||
| `igneum/exec/` (new crate `igneum-exec`) | The execution layer: `service.rs` chain follower (polls `get_virtual_chain_from_block`, builds segment(C) from `get_block_acceptance_data` which is written in `consensus_ordered_mergeset` order, unwinds reorgs from a 64-deep snapshot ring), `executor.rs` (revm 43 over the segment, rewards by rule, two-dimensional gas, fee flows, skip rule), `pgas.rs` (the prototype pgas table and the per-frame attribution inspector, CREATE rule for the registry), `state.rs` (in-memory revm `CacheDB`, MPT state root through alloy-trie as an output), `pool.rs` (EVM mempool), `rpc.rs` (`eth_*` and `igneum_*` JSON-RPC on axum), `registry.rs` and `contracts/DeveloperRegistry.sol` (system contract at `0x...0210`, runtime bytecode embedded), `bin/diff.rs` (`igneum-exec-diff`, the plain-revm differential harness) | Design sections 1 to 4 and 8.2 | None to consensus (the node runs without it under `--evm-disable`) | New crate. Pins `revm 43`, `alloy-trie 0.9`, `axum 0.8`. The in-memory state and the full-recompute state root are devnet scope (see "what is missing"). |
|
||||
| `igneum/miner/src/main.rs` | `--vote-key-hash <hex32>` (so a miner's EVM address, the low 20 bytes, is a key it holds), `--hold-ms <n>` (paces the stub miner on a network without proof of work), `--network simnet` (simnet address prefix for label addresses) | Test-network tooling | None | Internal tool. |
|
||||
| `consensus/core/src/unit.rs` (new), `consensus/core/src/igneum.rs`, `consensus/core/src/mass/mod.rs`, `consensus/core/src/config/params.rs`, `kaspad/src/daemon.rs`, `consensus/core/src/unit_measure.rs` (new, an ignored measurement) | O-2.6 (6 October 2026, branch `decimals`): `Params::base_unit_decimals` (8 devnet and simnet, 18 testnet and mainnet; `OverrideParams`; in the digest once not 8); `unit::Amount(u128)` with borsh 16 LE, serde (string in JSON, u128 in bincode), the 16-byte and legacy 8-byte wire forms, `rescale`, `to_wei`, `format_ign` (8 visible digits) and `parse_ign`; the schedule at any unit (`block_subsidy_units`, `base_subsidy_per_second_units`, `subsidy_periods_units`, `launch_ramp_units`, the 80/20 split on `Amount`); `calc_storage_mass_units` and `UtxoCellUnits`; `Params::unit`, `wei_per_unit`, `storage_mass_parameter_units`, `supply_cap_units`, `base_unit_valid`, `base_unit_implemented`; the daemon prints the unit and refuses a unit outside `unit::IMPLEMENTED_DECIMALS` ([8] until the widening) | One IGN is 10^18 base units on every public network so the EVM bridge is the identity; the devnet keeps 8 and its digest does not move; nothing in the type depends on the cap | Low tonight (additive; the u64 schedule and mass rule are untouched and asserted equal at 8). High at phase B (`docs/design/base-unit.md` section 8: the UTXO value, the coinbase payload, the stores, p2p, RPC, mempool, exec bridge, txscript, wallet) | Pure addition beside Kaspa's `SOMPI_PER_KASPA`; upstream's u64 amount stays until phase B replaces it with `Amount`. |
|
||||
| `consensus/core/src/unit.rs` (new), `consensus/core/src/igneum.rs`, `consensus/core/src/mass/mod.rs`, `consensus/core/src/config/params.rs`, `kaspad/src/daemon.rs`, `consensus/core/src/unit_measure.rs` (new, an ignored measurement) | O-2.6 (6 October 2026, branch `decimals`): `Params::base_unit_decimals` (8 devnet and simnet, 18 testnet and mainnet; `OverrideParams`; in the digest once not 8); `unit::Amount(u128)` with borsh 16 LE, serde (string in JSON, u128 in bincode), the 16-byte and legacy 8-byte wire forms, `rescale`, `to_wei`, `format_ign` (8 visible digits) and `parse_ign`; the schedule at any unit (`block_subsidy_units`, `base_subsidy_per_second_units`, `subsidy_periods_units`, `launch_ramp_units`, the 80/20 split on `Amount`); `calc_storage_mass_units` and `UtxoCellUnits`; `Params::unit`, `wei_per_unit`, `storage_mass_parameter_units`, `supply_cap_units`, `base_unit_valid`, `base_unit_implemented`; the daemon prints the unit and refuses a unit outside `unit::IMPLEMENTED_DECIMALS` ([8] until the widening) | One IGN is 10^18 base units on every public network so the EVM bridge is the identity; the devnet keeps 8 and its digest does not move; nothing in the type depends on the cap | Low tonight (additive; the u64 schedule and mass rule are untouched and asserted equal at 8). High at phase B (`docs/design/base-unit.md` section 8: the UTXO value, the coinbase payload, the stores, p2p, RPC, mempool, exec bridge, txscript, wallet) | Pure addition beside Kaspa's `SOMPI_PER_KASPA` on the night of 6 October; phase B (7 October 2026, the same branch, B1 to B10a in `docs/design/base-unit.md` section 8) replaced upstream's u64 amount with `Amount` in the output, the entry, the coinbase and its payload, the fees, the mass cells, the stores, the UTXO index, the p2p and gRPC wires (low and high words), the RPC model, the mempool, the exec bridge and the script numbers, every byte form keyed on the network's unit so the devnet is unchanged byte for byte; upstream merges touch every one of those sites. |
|
||||
|
||||
## Decisions recorded as open
|
||||
|
||||
|
|
|
|||
|
|
@ -577,9 +577,9 @@ Evidence: `docs/analysis/horizon/economy-and-utility.md` section 4.4 (`devfee_ou
|
|||
### E22. Eight decimals on a chain that calls itself EVM-native
|
||||
"Your coinbase pays sompi, your EVM shows wei, and your own stats API has to carry two `decimals` fields to explain it. Every wallet and bridge assumes 18. Either the UTXO side is a second ledger nobody reconciles to the unit, or you widen every u64 in a Kaspa fork the week before a testnet."
|
||||
|
||||
Status: Proposed Decided (6 October 2026, 22:xx UK; the project lead's word "18" in `docs/plans/ledger-decisions.md` row 5, the implementation lane's gate pending): 10^18 base units per IGN on the testnet and mainnet, 10^8 on the devnet; a genesis parameter, per network, in the consensus digest once it leaves 8; every amount a `u128` behind one type. Spec 2.5 carries the sentence; `docs/design/base-unit.md` is the design. Was: Open (O-2.6), 8 decimals in the code.
|
||||
Status: Decided and implemented (6 to 7 October 2026; the project lead's word "18" in `docs/plans/ledger-decisions.md` row 5, the coordinator's approval of the design at 23:2x UK; phase B landed in the fork on 7 October 2026, `docs/design/base-unit.md` section 8; the B10 gate's line follows): 10^18 base units per IGN on the testnet and mainnet, 10^8 on the devnet; a genesis parameter, per network, in the consensus digest once it leaves 8; every amount a `u128` behind one type. Spec 2.5 carries the sentence; `docs/design/base-unit.md` is the design. Was: Open (O-2.6), 8 decimals in the code.
|
||||
|
||||
Answer: Correct on both counts, and the second is the work. The unit is 18 on every public network, so a consensus amount and an EVM balance are the same number and the bridge is the identity (`Params::wei_per_unit()` = 1; the devnet's 10^10 is the same function at 8). The widening is real: at 18 decimals the first full-rate block is 31,688,087,814,028,950,237 base units, above `u64::MAX` (18,446,744,073,709,551,615), so no u64 in the fork can hold one coinbase, and the type is `u128` with 10^19 seconds of headroom at that rate, so the emission lane's cap or tail never meets the type again. What is in the tree tonight (fork branch `decimals`): the parameter in all four networks (devnet and simnet 8, testnet and mainnet 18), the type with every byte form and a round-trip test above `u64::MAX` as the first test, the schedule at any unit asserted bit for bit against the u64 schedule at 8 and under the cap at 18, the u128 storage mass rule with the same answer at both units, and a daemon that refuses to start a network at a unit the binary cannot mint (`unit::IMPLEMENTED_DECIMALS` = [8] until the widening lands). What the widening costs (measured on igneum-build-1, 1,000,000 synthetic UTXOs): +8 B per entry on disk (97 to 105 B, 8.25 percent), +17 B per entry in memory (151 to 168 B), +6.4 B per output on the wire with two varints (6.0 to 12.4 B). For a node at 10,000,000 UTXOs that is 80 MB of disk and 170 MB of memory, which changes no tier's class on any card or OS. What is left: 26 hours of lane work in ten commits (the design's section 8), gated by a two-node chain at 18 whose coinbase, explorer and an EVM wallet read one number; it ships as 0.3.17 with the economy lane's schedule, which is written at 8 decimals and rescaled to the network's unit (one schedule, one amount type).
|
||||
Answer: Correct on both counts, and the second is the work. The unit is 18 on every public network, so a consensus amount and an EVM balance are the same number and the bridge is the identity (`Params::wei_per_unit()` = 1; the devnet's 10^10 is the same function at 8). The widening is real: at 18 decimals the first full-rate block is 31,688,087,814,028,950,237 base units, above `u64::MAX` (18,446,744,073,709,551,615), so no u64 in the fork can hold one coinbase, and the type is `u128` with 10^19 seconds of headroom at that rate, so the emission lane's cap or tail never meets the type again. What is in the tree tonight (fork branch `decimals`): the parameter in all four networks (devnet and simnet 8, testnet and mainnet 18), the type with every byte form and a round-trip test above `u64::MAX` as the first test, the schedule at any unit asserted bit for bit against the u64 schedule at 8 and under the cap at 18, the u128 storage mass rule with the same answer at both units, and a daemon that refuses to start a network at a unit the binary cannot mint (`unit::IMPLEMENTED_DECIMALS` = [8] until the widening lands). What the widening costs (measured on igneum-build-1, 1,000,000 synthetic UTXOs): +8 B per entry on disk (97 to 105 B, 8.25 percent), +17 B per entry in memory (151 to 168 B), +6.4 B per output on the wire with two varints (6.0 to 12.4 B). For a node at 10,000,000 UTXOs that is 80 MB of disk and 170 MB of memory, which changes no tier's class on any card or OS. Phase B landed the same night (the design's section 8, seventeen commits, the four lanes B3, B4, B5 and B8 fanned out and merged): every form of an amount follows the network's unit, 8 bytes at 8 decimals so the devnet is byte-identical, 16 at 18; no protocol, store or serializer version moved; the genesis payloads of the 18-decimal networks carry a 16-byte subsidy; the economy lane's schedule is written at 8 decimals and rescaled to the unit (one schedule, one amount type); it ships as 0.3.18.
|
||||
|
||||
Evidence: `docs/design/base-unit.md` (the inventory of every amount, the serialisation table, the hostile review); the fork's `consensus/core/src/unit.rs`, `igneum.rs` (`schedule_units_tests`), `mass/mod.rs` (`units_tests`), `config/params.rs` (`base_unit_is_per_network_and_in_the_digest_once_not_eight`); `docs/bench-log.md`, "Base unit widening cost".
|
||||
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ Designed (design document, "The token" and "Difficulty, block timing and proving
|
|||
| Halving interval | 63,115,200 DAA s (2 years of 365.25 days), for ever | Decided (ledger E9), `HALVING_INTERVAL_SECONDS` |
|
||||
| Launch ramp | linear from 10% at genesis to 100% at DAA second 2,592,000 (30 days) | Designed |
|
||||
| Split | 80% block producer, 20% proving pool. A red block inside the DAA window pays its 80% to the miner of the block that merges it and its 20% to the pool | Designed; the red rule Decided 3 October 2026 (ledger E10, round 3), `coinbase.rs:102 to 109` |
|
||||
| Base unit | 10^18 base units per IGN on the testnet and mainnet (the EVM's wei, so a consensus amount and an EVM balance are one number and the exec bridge is the identity); the devnet keeps 10^8 (Kaspa's sompi, what it mints). A genesis parameter, `Params::base_unit_decimals`, per network, in the consensus digest once it leaves 8. Every amount is a `u128` behind `unit::Amount`, so nothing depends on the cap fitting any type. Proposed Decided 6 October 2026 (O-2.6; the project lead's word "18" in `docs/plans/ledger-decisions.md` row 5; design `docs/design/base-unit.md`; the parameter, the type and the schedule at any unit are in the fork at branch `decimals`, the widening of the UTXO value and the wire is phase B, gated by `unit::IMPLEMENTED_DECIMALS`, which the daemon enforces; ships as 0.3.17). The emission schedule (`Params::emission`, the economy lane) is written at 8 decimals and rescaled to the network's unit, so one schedule reads the same at every unit (the 18-decimal rate is exactly 10^10 times the 8-decimal floor. Was: Open, 8 decimals in the code, `docs/fork-map.md` b2 `cap_sompi = 4e9 x 1e8` |
|
||||
| Base unit | 10^18 base units per IGN on the testnet and mainnet (the EVM's wei, so a consensus amount and an EVM balance are one number and the exec bridge is the identity); the devnet keeps 10^8 (Kaspa's sompi, what it mints). A genesis parameter, `Params::base_unit_decimals`, per network, in the consensus digest once it leaves 8. Every amount is a `u128` behind `unit::Amount`, so nothing depends on the cap fitting any type. Decided 6 October 2026 (O-2.6; the project lead's word "18", `docs/plans/ledger-decisions.md` row 5; the coordinator's approval of the design, 23:2x UK; design `docs/design/base-unit.md`). Implemented end to end in the fork on 7 October 2026 (branch `decimals`, phase B: the UTXO value and entry, the coinbase and its payload, the fees, the mass rule, the stores, the p2p and gRPC wires, the mempool, the exec bridge and the script numbers all carry `unit::Amount` at the network's width: 8 bytes at 8 decimals so the devnet is byte-identical, 16 bytes at 18; `unit::IMPLEMENTED_DECIMALS` = [8, 18]; the mainnet and testnet genesis coinbase payloads carry a 16-byte subsidy, so igneum-testnet-1's genesis is re-cut on that layout). Ships as 0.3.18 (0.3.17 went without it). The emission schedule (`Params::emission`, the economy lane) is written at 8 decimals and rescaled to the network's unit, so one schedule reads the same at every unit (the 18-decimal rate is exactly 10^10 times the 8-decimal floor. Was: Open, 8 decimals in the code, `docs/fork-map.md` b2 `cap_sompi = 4e9 x 1e8` |
|
||||
|
||||
Emission per DAA second at DAA score `t`:
|
||||
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ An item closes when its measurement is in `docs/bench-log.md` or its decision is
|
|||
| O-2.3 | Pruning depth must stay above the longest checkpoint gap and never pass the latest lock (section 2.1, F3) | Define the bound once the first-month rule (O-3.1) and the stall behaviour (section 3.3.1) fix the longest gap; implement in `block_depth.rs` and the virtual processor | 2, with 3 |
|
||||
| O-2.4 | Mapping of the 64-bit hash into the 256-bit target and the block level for pruning proofs (fork map a3) | Decision: `target64 = target256 >> 192`, `level = leading_zeros(hash64)` capped at 64, or widen the output; check `calc_level_from_pow` callers | 2 |
|
||||
| O-2.5 | Header validation gains a chain-state dependency (the epoch seed) and must stay deterministic from headers plus certificates during IBD and pruning-proof validation (fork map a4, risk High) | Implement `seed_source` validation; sync a node from genesis and from a pruning point on the devnet | 2 |
|
||||
| O-2.6 (decided, proposed) | **Proposed Decided 6 October 2026 (the project lead's answer "18", `docs/plans/ledger-decisions.md` row 5): 10^18 base units per IGN on the testnet and mainnet, 10^8 on the devnet; a genesis parameter `base_unit_decimals`, per network, in the digest once not 8; every amount a `u128` behind `unit::Amount`, so no cap or tail has to fit any type.** Design `docs/design/base-unit.md`. In the fork (branch `decimals` on eec34ac3): the parameter in all four networks, the type with every byte form (an amount above u64::MAX round-trips borsh, bincode, JSON, the wire; the known-failed case first), the schedule at any unit (bit for bit the u64 schedule at 8; the first full-rate block at 18 is 3.17 x 10^19, above u64::MAX; the full schedule under the cap in checked u128), the u128 storage mass rule (same answer at both units), the daemon's refusal to start a unit the binary cannot mint. Measured: +8 B per UTXO on disk, +17 B in memory, +6.4 B per output on the wire with two varints | Closes at phase B of the design (26 hours: the UTXO value, the coinbase, the stores, p2p, RPC, mempool, the exec bridge, txscript, the wallet and tools) and its gate B10: a two-node testnet-params chain at 18 mining ten minutes with the coinbase, the explorer and viem reading one number; then `IMPLEMENTED_DECIMALS` gains 18 and spec 2.5 drops "proposed" | 2, before the testnet genesis |
|
||||
| O-2.6 (decided) | **Decided 6 October 2026 (the project lead's answer "18", `docs/plans/ledger-decisions.md` row 5): 10^18 base units per IGN on the testnet and mainnet, 10^8 on the devnet; a genesis parameter `base_unit_decimals`, per network, in the digest once not 8; every amount a `u128` behind `unit::Amount`, so no cap or tail has to fit any type.** Design `docs/design/base-unit.md`. In the fork (branch `decimals` on eec34ac3): the parameter in all four networks, the type with every byte form (an amount above u64::MAX round-trips borsh, bincode, JSON, the wire; the known-failed case first), the schedule at any unit (bit for bit the u64 schedule at 8; the first full-rate block at 18 is 3.17 x 10^19, above u64::MAX; the full schedule under the cap in checked u128), the u128 storage mass rule (same answer at both units), the daemon's refusal to start a unit the binary cannot mint. Measured: +8 B per UTXO on disk, +17 B in memory, +6.4 B per output on the wire with two varints | Phase B landed 7 October 2026 (fork branch `decimals`, B1 to B10a, design section 8): `IMPLEMENTED_DECIMALS` = [8, 18], no `pending_u64()` site in anything the node runs, the genesis payloads at 16 bytes, the B10 gate script in `tools/fleet/base-unit-gate.sh` (two testnet-params nodes at 18 on igneum-build-1; the hour-long CPU form tonight, the ten-minute GPU form on a wave box). Left: the testnet lane re-cuts igneum-testnet-1's genesis on the 16-byte payload; the pool's build against the fork; the Igneum wallet's display | 2, closed pending the gate line |
|
||||
| O-2.7 | Apportioning the DAA-score increment among several blue blocks in one mergeset at higher block rates (section 2.5) | Define before the first block-rate step; at 1 BPS the mergeset is usually one block | 2, before the 4 BPS step |
|
||||
| O-2.9 | `docs/fork-divergence.md` does not exist | Write it as the fork is made | 2 |
|
||||
| O-2.10 | Block-rate steps to 4 and 10 BPS each re-derive k, parents and mergeset limit and are hard forks (hostile review table) | Each step has its own test campaign, as Kaspa's Crescendo | later, consensus engineer |
|
||||
|
|
|
|||
Loading…
Reference in a new issue