Base unit (O-2.6): the B10 gate PASSED on the GPU form (RunPod 3090, 7 October 2026, 03:13 UK: 414 chain blocks at 18 decimals, 585 rewards against the schedule with 0 wrong, the balance equal on both nodes and to the sum of the rewards; the known-failed form fails 30 of 30); O-2.6 closed in the open items, the spec sentence, the ledger and the bench-log
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
47d0b8a15c
commit
33b307a005
5 changed files with 39 additions and 7 deletions
|
|
@ -2624,3 +2624,25 @@ on a fixed two-output transaction (233 to 245 B; +6.0 per output: +7 B above 2^6
|
|||
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.
|
||||
|
||||
## Base unit gate, GPU form, 7 October 2026, 03:03 to 03:13 UK (branch `decimals`, fork df2fbd03; RunPod RTX 3090 24 GB, CUDA 12.8, glibc 2.39, USD 0.22/h, rented by the fleet lane)
|
||||
|
||||
`tools/fleet/base-unit-gate.sh` with `WORKER=igneum-worker-cuda` (compiled on the pod from proto-cuda/nvrtc): two igneumd on the
|
||||
testnet params (18 decimals, `--enable-unsynced-mining`, digest 57c4c924...), both nodes and the miner on the pod on 127.0.0.1,
|
||||
no peer outside it.
|
||||
|
||||
| | Value |
|
||||
|---|---|
|
||||
| Hash rate | 51.8 MH/s wall, 56.1 MH/s inside jobs, 1,854 jobs in 600.8 s |
|
||||
| Blocks found / rejected | 585 / 0 (0.97 a second against 2^28 expected hashes a block) |
|
||||
| Chain blocks (exec tip) | 414 on both nodes; sink identical |
|
||||
| Coinbase payloads inspected (last 30) | 30 equal to the 18-decimal schedule (day-0 block 10 IGN = 10^19 base units, 16-byte field); 80/20 exact on 10 of 10 single-payee coinbases |
|
||||
| Segment rewards checked against the schedule | 585, 0 wrong |
|
||||
| `eth_getBalance` of the miner | 4,681,583,333,333,333,333,339 wei = 4,681.58333333 IGN, equal on both nodes and to the sum of the rewards (the identity bridge) |
|
||||
| Known-failed form (the schedule at 8 against the recorded chain) | 30 of 30 payloads wrong |
|
||||
| CPU form on igneum-build-1 | 0.31 MH/s; 0 blocks in an hour (4.2 expected, a 1.5 percent chance); the wrong tool for 2^28 a block |
|
||||
|
||||
Consequences: a 3090 alone mines the testnet at genesis bits at one block a second, so the testnet genesis bits (2^28, sized
|
||||
for a few hundred MH/s) hold for the announced fleet and are far too easy for one card: the testnet lane's sizing stands as
|
||||
written (re-sized to the launch fleet before the cut). For users nothing changes by tier: the 18-decimal node paid 414 blocks
|
||||
of rewards into the EVM at the identity bridge with no extra cost beyond the measured +8 B per UTXO and +6 B per output.
|
||||
|
||||
|
|
|
|||
|
|
@ -185,13 +185,23 @@ decimals (the daemon prints `Base unit: 10^18 base units per IGN (wei, the EVM's
|
|||
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. Results so far (7 October 2026): run 1 (00:3x UK, 32 then 64 threads, 31 min) found two
|
||||
lane and the same script. PASSED on the GPU form, 7 October 2026, 03:13 UK (RunPod RTX 3090 rented by the fleet lane
|
||||
for the hour, the CUDA worker compiled on it from proto-cuda/nvrtc, both nodes and the miner on the pod on their own
|
||||
digest): 585 blocks found in 600 s at 51.8 MH/s (0.97 blocks a second against 2^28 hashes a block), 414 chain blocks,
|
||||
the sink identical on both nodes, every one of the 30 inspected coinbase payloads equal to the 18-decimal testnet
|
||||
schedule (a day-0 block is 10 IGN, 10^19 base units), 80/20 exact on every single-payee coinbase, 585 segment rewards
|
||||
checked against the schedule with 0 wrong, `eth_getBalance` 4,681.58333333 IGN (4,681,583,333,333,333,333,339 wei)
|
||||
equal on both nodes and equal to the sum of the rewards: the bridge is the identity. The known-failed form (the same
|
||||
checks with the schedule at 8 decimals against the recorded chain) fails 30 of 30 payloads. Run 1 on the pod had
|
||||
found the same chain shape (551 blocks, 4,409.40467592 IGN) and failed on two faults of the script itself, fixed in
|
||||
67d87c39: the "above u64::MAX" payload check (a day-0 block fits a u64; the right check is the schedule) and the
|
||||
segment tag (a hex quantity). The CPU runs before it, on igneum-build-1: run 1 (00:3x UK, 32 then 64 threads, 31 min) found two
|
||||
blocks and the node refused both with `IsInIBD`, since a fresh chain's sink is the two-day-old genesis and the mining
|
||||
rule never calls it synced; fixed by `--enable-unsynced-mining` on both nodes (the devnet's first node runs the same);
|
||||
run 2 (01:31 to 02:32 UK, 90 threads, 0.314 MH/s, 1.13 x 10^9 hashes, 4.2 expected blocks) found none (a 1.5 percent
|
||||
chance at that rate; the nodes peered, agreed on the sink, exec tips equal at 0); run 3 (02:33 UK, two hours, 64
|
||||
threads, two-block minimum) in flight. The GPU form on a wave box is the gate that counts and is chipped to the fleet
|
||||
lane; until it passes, O-2.6 stays "closed pending the gate line" and no testnet genesis is cut on this tree.
|
||||
chance at that rate; the nodes peered, agreed on the sink, exec tips equal at 0); run 3 was stopped once the GPU form
|
||||
passed. O-2.6 is closed; the testnet genesis can be cut on this tree once the testnet lane re-cuts igneum-testnet-1's
|
||||
genesis on the 16-byte payload layout.
|
||||
|
||||
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,
|
||||
|
|
|
|||
|
|
@ -577,7 +577,7 @@ 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: 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.
|
||||
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 PASSED at 03:13 UK on a rented RTX 3090: 414 chain blocks at 18 decimals, the coinbase, the gRPC and the execution layer reading one number, 4,681.58333333 IGN on both nodes): 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. 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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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. 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` |
|
||||
| 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). The two-node gate at 18 decimals passed on 7 October 2026, 03:13 UK (`tools/fleet/base-unit-gate.sh`, design section 8). 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) | **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.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: the gate PASSED 7 October 2026, 03:13 UK (GPU form, RunPod 3090: 414 chain blocks at 18 decimals, 585 rewards against the schedule with 0 wrong, the balance equal on both nodes and to the sum of the rewards) |
|
||||
| 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