E46 chain design (draft 1)¶
Date: 7 October 2026 Status: Draft 1, parameters confirmed by the project owner on 7 Oct 2026 (section 6). No code yet; nothing here is audited. Values marked “retune after prototype” may change once measured. Scope: an experimental testnet, launched from zero hashrate, to complement established chains and invite people to test new algorithms. It is not a competitor to Bitcoin, has no value and makes no promise of value.
0. Names¶
Name |
Meaning |
|---|---|
E46 |
the coin (testnet units) |
E46 / Tessera |
the toolkit and art ( |
Radium / Rad |
the collision-event feature of each block |
Z-level |
a Rad’s radiation level: how many leading bits its two hashes share |
E46 Life Tokens |
the per-miner record of earned Z-level, usable for staking rewards |
Refracting Light v3 |
the proof-of-work hash |
QTL |
optional wallet-file lock, test data only |
Names and tickers must be checked for conflicts before any announcement (RAD may be in use; an older “Radium” coin may exist).
1. Primitives: experiment where a break is survivable¶
Job |
Primitive |
Status |
|---|---|---|
Proof-of-work |
Refracting Light v3 ( |
Experimental. Passed Phase 3, including real truncated collisions up to 64 bits at the ideal birthday cost ( |
Transaction and block IDs, Merkle roots, shared addresses, domain hashing |
SHAKE256 (SHA-3 family, FIPS 202), 256-bit output (decided) |
Standard |
No SHA-2 anywhere |
SHA-256 and SHA-256d are not used by the chain (decided 7 Oct 2026) |
Policy |
Single-owner addresses |
RL v3 128 ‖ SHAKE256 128 (section 2a) |
256-bit payload; preimage ≈ 2^128 classical and quantum |
Rad IDs |
Refracting Light v3, 128-bit |
Labels only |
Signatures |
SLH-DSA-SHAKE-128s, FIPS 205 (stateless, hash-based, no lattices, no SHA-2) |
Standard. Signature size ≈ 7.9 KB (verify against FIPS 205 before publishing) |
Wallet-file protection (optional) |
QTL v2 guarded ( |
Experimental, test data only |
The project’s “inverse” theme: Bitcoin is preparing to defend against quantum attacks (Shor). This project explores quantum entanglement as inspiration for classical tools. Nothing here uses or claims real quantum hardware.
2. Blocks and timing¶
Parameter |
Value |
|---|---|
Target block time |
150 s (576 blocks/day) |
Block size limit |
4 MB (≈ 3 tx/s with one SLH-DSA-128s signature per transaction) |
Header PoW |
|
Difficulty |
defined directly from the 256-bit target (not Bitcoin’s difficulty-1 constant) |
Difficulty algorithm |
ASERT (exponential), half-life ≈ 2 h (≈ 48 blocks) |
Genesis difficulty |
one-laptop level (≈ 2^24.6 expected hashes: 120-byte headers at an estimated 44k per second per core, 4 cores; section 2b), so the first block arrives in about 150 s, not years |
Minimum-difficulty fallback rule |
none. Bitcoin testnet3’s 20-minute rule was abused for block storms |
ASERT, integer form (as in Bitcoin Cash’s aserti3-2d):
next_target = anchor_target × 2^((parent_time − anchor_parent_time − 150 × (height − anchor_height)) / half_life)
Exact consensus rule (decision #16, 8 Oct 2026): BCH aserti3-2d, E46 numbers.
anchor = genesis: anchor_height 0, anchor_bits = genesis bits, anchor_parent_time = genesis.time − 150
time_diff = parent.time − anchor_parent_time (signed 64-bit)
height_diff = parent.height − anchor_height
exponent = ((time_diff − 150 × (height_diff + 1)) × 65536) / 7200 (division truncates toward zero)
shifts = exponent >> 16 (arithmetic shift, floors)
frac = exponent & 0xFFFF
factor = 65536 + ((195766423245049·frac + 971821376·frac² + 5127·frac³ + 2^47) >> 48)
next = (anchor_target × factor) shifted by `shifts` (left if ≥ 0, right if < 0), then >> 16
if next == 0 → next = 1
if next > MAX_TARGET → next = MAX_TARGET (decide this BEFORE shifting in fixed-width math: an overflowed
256-bit value wraps to a small number = a near-impossible target)
bits = canonical compact(next)
Constant |
Mainnet |
Testnet |
|---|---|---|
MAX_TARGET (pow limit) |
|
same |
Genesis bits |
= MAX_TARGET (re-measure on the launch machine) |
same |
Compact bits are accepted only in canonical form; negative, overflowing, zero-mantissa or above-MAX_TARGET values are invalid.
It is evaluated with fixed-point integer arithmetic only. Floating point is forbidden in consensus code.
2a. Addresses and IDs (decided 7 Oct 2026)¶
All addresses and IDs use Bech32m (BIP-350): a readable prefix, the separator 1, a version character, the payload, and a 6-character checksum that always catches a mistyped character. Bech32m is case-insensitive, so case never distinguishes networks: every network has its own prefix. The version character names the hash version: q = v0 (today), p = v1 (reserved for a future hash switch).
Kind |
Mainnet |
Testnet |
Payload (v0) |
Bits |
|---|---|---|---|---|
Single-owner address |
|
|
|
256 |
Shared address (k-of-n) |
|
|
|
256 |
Transaction ID |
|
|
|
256 |
Witness transaction ID (wtxid) |
none: raw 32 bytes / plain hex only, never shown to users (#15). |
|
256 |
|
Block ID |
|
|
|
256 |
Rad ID |
|
|
|
128 |
Examples (stand-in public key; real SLH-DSA keys will differ):
e46 e461qd8q86chzlafsxsvwsnstt99leappd9m9u03txle073k5u70dgaqqnjq8w0
te46 te461qd8q86chzlafsxsvwsnstt99leappd9m9u03txle073k5u70dgaqq7kqphr
tes tes1q8l5y4uynd5pjkdgqfu8rkddvsnyuazdpmetha7xc42ny2r739suqm2c32j
tess tess1q8l5y4uynd5pjkdgqfu8rkddvsnyuazdpmetha7xc42ny2r739suqtyerjz
e46tx e46tx1q6gmauc2zmel9p2mmxg3dg9lw0ayhmfm5q8u287vu4hw32wxtp4pqyjwz62
te46tx te46tx1q6gmauc2zmel9p2mmxg3dg9lw0ayhmfm5q8u287vu4hw32wxtp4pq5azwqr
e46blk e46blk1qjun46mpt0zvnczlqsm8whz9acjscgtzwtjuwrv9e0m4e4w4zgxeq6ujsrs
te46blk te46blk1qjun46mpt0zvnczlqsm8whz9acjscgtzwtjuwrv9e0m4e4w4zgxeqmx7gu3
e46rad e46rad1qhjj0xzkudmyw5r67uc7qfjntmvjjqd40
te46rad te46rad1qhjj0xzkudmyw5r67uc7qfjntmv0smf2q
Rules and reasons:
Single-owner addresses (S12, decided: Option 1). The Refracting Light half keeps the hash visible in every address. The SHAKE256 half means a thief must find a preimage of both halves at once: about 2^128 classically and about 2^128 with Grover, compared with about 2^64 for a 128-bit address.
Shared addresses, tx and block IDs and Merkle roots use SHAKE256 from the start. These need collision resistance; SHAKE256 at 256 bits gives about 2^128 classically and about 2^85 with the BHT quantum algorithm. SHA-3 is a completely different design from SHA-2 (a Keccak sponge), so a SHA-2 break doesn’t carry over.
Domain tags (
"E46-address\0","E46-shared\0","E46-txid\0","E46-block\0") keep every kind of hash separate.No double hashing. SHAKE256 is a sponge with no length-extension weakness, so Bitcoin’s SHA-256d workaround isn’t needed.
Prefixes must be checked against other projects before the ANN.
2b. Block header, Merkle roots and the genesis block (proposed for review)¶
Header: 120 bytes, fixed serialization¶
Field |
Size |
Encoding |
Notes |
|---|---|---|---|
version |
4 |
uint32 little-endian |
soft-fork signalling bits, as in Bitcoin |
prev_block |
32 |
bytes |
block ID of the parent (SHAKE256) |
merkle_root |
32 |
bytes |
transaction Merkle root |
event_root |
32 |
bytes |
event Merkle root (Rads and Block QTL commitments, section 2f); all zero bytes until events are enabled |
time |
8 |
uint64 little-endian |
Unix seconds; 64-bit because the chain is designed for 100+ years (Bitcoin’s 32-bit field ends in 2106) |
bits |
4 |
uint32 compact target |
Bitcoin’s compact form, written by ASERT |
nonce |
8 |
uint64 little-endian |
larger than Bitcoin’s 32 bits, so miners rarely need an extra-nonce |
Proof-of-work:
RL_v3(header) ≤ target, comparing the 128-bit folded digest with the top 128 bits of the 256-bit target. 120 bytes is 1,512 RL v3 steps; the estimated speed is about 44,000 headers per second per M1 core.Block ID:
SHAKE256("E46-block\0" ‖ header), 256 bits. The PoW hash and the ID are deliberately different functions, the way Litecoin pairs scrypt PoW with SHA-256d IDs.Transaction ID:
SHAKE256("E46-txid\0" ‖ transaction without signatures), so signatures can’t change an ID. A separate ID (wtxid) covers the signatures, for relay.
Merkle roots: tagged, no duplication¶
leaf(x) = SHAKE256( "E46-merkle\0" ‖ 0x00 ‖ x ) x = txid (or Rad leaf bytes), 256-bit output
node(L, R) = SHAKE256( "E46-merkle\0" ‖ 0x01 ‖ L ‖ R )
odd count : the last node is carried up unchanged (never duplicated)
tree_root = the root of the tree above
bound root = SHAKE256( "E46-merkle\0" ‖ 0x02 ‖ u64 leaf_count (LE) ‖ tree_root ) if leaf_count > 0
= 32 zero bytes if leaf_count = 0
merkle_root = bound root over the block's txids in block order (coinbase first)
event_root = bound root over event leaves (type ‖ body; 0x02 Rad, 0x03 Block QTL commitment), sorted by type then ID
proofs = (leaf, index, leaf_count, siblings); the verifier recomputes the bound root, so a wrong count fails
Why the count is bound (approved 7 Oct 2026, found during WO-03): with the odd node carried up, a tree’s shape depends on its leaf count, and a Merkle path alone can’t prove the count. Binding the count into the root lets a light wallet verify proofs from headers alone. Tag 0x02 keeps this wrapper distinct from leaves (0x00) and nodes (0x01), in the spirit of RFC 6962/9162, which also commit to the tree size.
Why this differs from Bitcoin: Bitcoin duplicates the last node on odd levels, which allowed two different transaction lists to give the same root (CVE-2012-2459). It also uses the same hash for leaves and inner nodes, which makes 64-byte transactions ambiguous. The 0x00/0x01 tags (the RFC 6962 convention) and carrying the odd node up instead of duplicating it remove both problems.
Genesis block¶
Item |
Rule |
|---|---|
pszTimestamp |
|
Coinbase |
one null-prevout input; one or two 0 E46 Data outputs (type 0x03) carry pszTimestamp, followed by the 0 E46 witness commitment Data output (type 0x03) as the final output. Genesis has two or three outputs. No premine, and anyone can verify that |
Block 1 |
the first spendable reward (43.87 E46), open to anyone who mines it |
prev_block |
32 zero bytes |
bits |
one-laptop level: about 2^24.6 expected hashes, the first block in about 150 s on a 4-core M1 (estimate; re-measure on the launch machine) |
time |
the actual time of mining, which must be after the headline’s date |
Genesis hashing function |
|
ASERT anchor |
the genesis block (height 0, its time and its target) |
2c. Checkpoints (proposed for review)¶
Hard-coded checkpoints: each client release lists
(height, block ID)pairs. The node rejects any chain that contradicts one. This protects a young, low-hashrate chain against someone rewriting deep history with rented CPUs.Policy: a new checkpoint is added in each release, at a block at least 1,000 blocks (about 42 hours) deep. Checkpoints are listed publicly in the release notes.
No automatic rolling checkpoints. Nodes that refuse deep reorganizations on their own can split the network permanently if they see different chains.
Honest trade-off: checkpoints mean trusting whoever publishes the release. That is acceptable for a testnet and is stated plainly in the ANN.
2d. Chain parameters (chainparams)¶
Parameter |
Mainnet |
Testnet |
|---|---|---|
Address / ID prefixes |
|
|
Target spacing |
150 s |
150 s |
ASERT half-life |
7,200 s |
7,200 s |
Max block size |
4,000,000 bytes |
4,000,000 bytes |
Coinbase maturity |
100 blocks (≈ 4.2 h) |
100 blocks |
Median time past |
median of the last 11 blocks; a new block’s time must be later |
same |
Max future block time |
node’s adjusted time + 15 min (6 block intervals) |
same |
Decay epoch |
17,280 blocks |
17,280 blocks |
k / T / NEUTRINO |
20 / 46,000,000 E46 / 1 base unit |
same (testnet coins have no value) |
Reward split / N / Z / L |
80-10-10 / 576 / 0.1 / 200 |
same |
Genesis |
from |
separate genesis with its own pszTimestamp |
Checkpoints |
per release |
per release |
Soft-fork activation |
version bits (BIP-9 style) |
same |
Network magic, ports, seeds |
deferred to the peer-to-peer section (last) |
deferred |
2e. Transactions, coinbase, public keys and scriptPubKey (proposed for review)¶
UTXO model, as in Bitcoin: coins live in unspent outputs, and a transaction spends whole outputs and creates new ones.
Public keys and signatures¶
Item |
Value |
|---|---|
Scheme |
SLH-DSA-SHAKE-128s (FIPS 205), stateless, hash-based, built on SHAKE (no SHA-2) |
Public key |
32 bytes |
Private key |
64 bytes (never leaves the wallet) |
Signature |
7,856 bytes |
Library |
a maintained implementation (liboqs or equivalent); never custom code |
Wallet keys |
32-byte |
Sizes follow FIPS 205. Hash-based keys have no Bitcoin-style public derivation (BIP32 xpub), so a watch-only wallet needs its addresses precomputed by the full wallet.
Transaction format¶
transaction
version uint32 LE
inputs[] prev_txid (32) ‖ prev_index (uint32 LE) ‖ sequence (uint32 LE)
outputs[] value (uint64 LE, base units) ‖ type (uint8) ‖ payload (length-prefixed bytes)
lock_time uint64 LE (block height if < 500,000,000, else Unix time)
witnesses[] one per input, kept separate: public key(s) ‖ signature(s)
txid = SHAKE256( "E46-txid\0" ‖ version ‖ inputs ‖ outputs ‖ lock_time ) -- signatures excluded: no malleability
wtxid = SHAKE256( "E46-wtxid\0" ‖ whole transaction including witnesses ) -- for relay and the witness commitment
What a signature signs (sighash): SHAKE256("E46-sighash\0" ‖ version ‖ all inputs ‖ all outputs ‖ lock_time ‖ input index ‖ the value, type and lock payload of every coin being spent) (exact bytes in §2g). Committing to the spent values means a wallet can’t be tricked about the fee (a lesson from Bitcoin’s Taproot design). Launch supports one mode only: sign everything.
Size check: 1 input + 1 output ≈ 8.0 KB, almost all of it signature. That is about 500 transactions per 4 MB block, about 3.3 per second at 150 s blocks.
scriptPubKey: fixed output types, no general script at launch¶
Each output’s type byte selects a template. A general-purpose script language is left for a later soft fork, so launch has far less to get wrong.
Type |
Name |
Payload (scriptPubKey) |
To spend (witness) |
|---|---|---|---|
0x00 |
Single-owner ( |
256-bit address payload: RL v3 128 ‖ SHAKE256 128 |
public key whose hash matches + signature |
0x01 |
Shared k-of-n ( |
|
the n public keys + k signatures; n ≤ 15 |
0x02 |
Stake lock |
owner payload ‖ origin height |
not spendable by signature; released by consensus at the collision block (with any N-pool payout) or at timeout L |
0x03 |
Data (OP_RETURN) |
≤ 80 bytes, value must be 0 |
never spendable (genesis pszTimestamp, notes) |
0x04 |
Block QTL single-owner ( |
same 256-bit payload as 0x00 |
public key + signature, and a matching commitment at least 6 blocks deep (section 2f) |
0x05–0xFF |
reserved |
— |
valid in consensus but not relayed, so future soft forks can define them |
Coinbase transaction (first transaction of every block)¶
Rule |
Reason |
|---|---|
Exactly one input: prev_txid = 32 zero bytes, prev_index = 0xFFFFFFFF |
marks it as new coins |
|
the height is inside the txid, so every coinbase txid is unique. Bitcoin once had duplicate coinbase txids (fixed by BIP30/BIP34) |
Genesis: one or two leading 0-E46 Data outputs (type 0x03, each payload ≤80 bytes) contain the pszTimestamp parts; concatenate their payloads in order with no added bytes. The final output is the witness commitment |
the full headline is inside the txid, so |
Miner outputs: total ≤ miner share (80% of reward) + all transaction fees |
the miner chooses the addresses |
Pool outputs at collision blocks: the N-pool and Z-pool payouts as consensus-computed outputs, sorted by recipient payload |
every validator recomputes them and rejects the block if they differ |
The last coinbase output is the witness commitment: type 0x03, value 0, payload exactly the 32-byte bound Merkle root of the block’s wtxids in block order, with the coinbase’s own wtxid replaced by 32 zero bytes (decisions #20a and #23) |
validators have one fixed location to check; the zero placeholder avoids a circular definition, as in Bitcoin |
Amounts (decision #20d): every output value ≤ T; all sums use checked arithmetic; a transaction whose outputs exceed its inputs, or any sum above T, is invalid |
blocks Bitcoin’s 2010 value-overflow bug (184 billion BTC created) |
Maturity: outputs spendable only after 100 blocks |
a reorganized-away coinbase can’t have been spent already |
Locks¶
Absolute:
lock_time(height or time) on the whole transaction, exactly as in Bitcoin (decision #22): valid only in a block whose height (if lock_time < 500,000,000) or median-time-past (otherwise) is strictly greater than lock_time; ignored when every input’s sequence is0xFFFFFFFF, so a wallet that wants the lock sets a sequence to0xFFFFFFFE. The coinbase (lock_time = height, #20) is exempt. This is what makes post-dated payments possible.Relative locks (Bitcoin’s BIP68/112 style) are left for a soft fork.
Stake locks are their own output type (0x02), so staking never relies on general scripts.
2f. Block QTL: commit–delay–reveal (opt-in, decided 7 Oct 2026)¶
The block-level version of the Quantum Time Lock. On a chain, block height is a clock everyone agrees on, so a delay measured in blocks is truly enforced. Based on the Guy Fawkes protocol (Anderson et al., 1998), as used in FawkesCoin (Bonneau and Miller, 2014).
Who uses it: coins held in a Block QTL address, output type 0x04, address version z (v2): e461z… on mainnet, te461z… on testnet. Ordinary e461q… addresses spend immediately, as before. (p, v1, stays reserved for a future hash switch.)
1. COMMIT (block h):
C = SHAKE256("E46-commit\0" ‖ txid ‖ SHAKE256(witnesses) ‖ salt) -- 32 bytes: no key, no signature
event leaf = 0x03 ‖ C ‖ nonce, valid only if RL_v3("E46-commit-pow\0" ‖ C ‖ nonce) has ≥ Z_commit leading zero bits
-> placed in event_root; no fee and no signature needed (the small proof-of-work is the spam fee)
2. DELAY: d = 6 blocks (≈ 15 min at 150 s)
3. REVEAL (block ≥ h + 6):
the full transaction with witnesses; valid only if a commitment C matching (txid, witnesses, salt) is in a block
at least 6 and at most 2,016 blocks deep (expiry ≈ 3.5 days); the transaction also reveals salt
Rule |
Purpose |
|---|---|
The commitment hides the public key and signature |
nothing to copy, forge or front-run while the spend is pending |
Reveal needs a commitment ≥ 6 blocks deep |
a forger who only sees the key at reveal time would have to backdate a commitment, which means rewriting 6+ blocks of history |
Commitments expire after 2,016 blocks |
no unlimited stockpiles of pending commitments |
Commitment proof-of-work (Z_commit) |
spam control without a fee: Rad-style RL v3 work, set to about 1 second of laptop time; adjusted by ASERT like Rads; per-block limit on commitment leaves |
Ordinary double-spend rules apply to reveals |
the first valid reveal in the chain wins |
What it protects: mempool racing and front-running; future weaknesses in SLH-DSA or in the RL half of an address (a forger must also backdate a commitment); keys exposed by earlier spends. Cost: at least 6 blocks per spend and two steps (commit, then reveal). Opt-in, so ordinary payments stay fast.
2g. Serialization: exact bytes (proposed 7 Oct 2026, for review)¶
Bitcoin’s conventions unless stated otherwise. Every consensus structure has exactly one valid encoding; anything else is invalid.
Primitives
Name |
Encoding |
|---|---|
|
fixed width, little-endian |
|
Bitcoin’s: |
|
exactly n raw bytes |
|
|
hashes and digests |
stored as the raw output bytes (SHAKE256 output as produced; RL v3 in its canonical big-endian form). Hex display = byte order (no Bitcoin-style reversal) |
Block
block = header[120] ‖ CompactSize(tx_count) ‖ tx × tx_count ‖ CompactSize(event_count) ‖ event × event_count
Transaction
tx = u32 version ‖ CompactSize(n_in) ‖ input × n_in ‖ CompactSize(n_out) ‖ output × n_out ‖ u64 lock_time
‖ witness × n_in -- one witness per input, in input order
input = prev_txid[32] ‖ u32 prev_index ‖ u32 sequence
output = u64 value ‖ u8 type ‖ varbytes payload -- payload = the scriptPubKey for that type
txid = SHAKE256("E46-txid\0" ‖ tx without the witness section) (32 bytes)
wtxid = SHAKE256("E46-wtxid\0" ‖ full tx) (32 bytes)
scriptPubKey payloads (fixed per output type)
Type |
Payload |
Bytes |
|---|---|---|
0x00 single-owner |
|
32 |
0x01 shared k-of-n |
|
32 |
0x02 stake lock |
|
40 |
0x03 data |
0–80 bytes, value must be 0 |
≤ 80 |
0x04 Block QTL single-owner |
same as 0x00 |
32 |
Witnesses (keys and signatures)
Spent type |
Witness |
|---|---|
0x00 |
|
0x01 |
|
0x04 |
as 0x00, then |
coinbase input |
|
Coinbase input: prev_txid = 32 zero bytes, prev_index = 0xFFFFFFFF. Private keys never appear on chain; the wallet key-export format is decided with the GUI.
Signature message (sighash)
sighash(i) = SHAKE256("E46-sighash\0" ‖ tx without witnesses ‖ u32 i ‖ (u64 value ‖ u8 type ‖ varbytes payload) for every input's spent coin, in input order) -- payload added by decision #20c
Events (event_root leaves)
rad_event = u8 0x02 ‖ miner_payload[32] ‖ u64 window_index ‖ u64 nonce ‖ a[16] ‖ b[16] ‖ u8 Z
a, b = u64 LE index ‖ 8 zero bytes; index_a < index_b < S = 2^20 (else invalid); several distinct pairs from one nonce are all valid (82 bytes)
stamp = SHAKE256("E46-rad\0" ‖ prev_block_id ‖ u64 window_index ‖ miner_payload ‖ u64 nonce) (32 bytes)
Rad ID = RL_v3_128(stamp ‖ a ‖ b) (16 bytes)
commit_event = u8 0x03 ‖ C[32] ‖ u64 nonce (41 bytes)
Commitment ID = C (32 bytes)
order = ascending by (type byte, then ID bytes); a repeated (type, ID) makes the block invalid
event leaf = the full serialized event (type byte included), hashed by the tagged Merkle rule (section 2b)
Still to define (later): peer-to-peer messages (with the P2P section, last) and signed-message format for “prove you own this address” (with the GUI).
3. Emission: monthly decay events (no halvings)¶
The block reward is constant within each decay epoch of 17,280 blocks (30 days at 150 s). At every epoch boundary a decay event lowers it along an exponential curve:
epoch(h) = floor(h / 17,280)
E_0 = 0 -- coins emitted before epoch 0
remaining_e = max( MAX_SUPPLY − E_e , 0 ) -- MUST clamp: E_e exceeds MAX_SUPPLY in the tail
r_e = max( remaining_e >> k , NEUTRINO ) -- reward per block during epoch e
E_{e+1} = E_e + 17,280 × r_e
reward(h) = r_{epoch(h)}
NEUTRINO = 1 base unit (10^-8 E46) -- the reward never reaches zero
Integer arithmetic only, so every node computes identical rewards. Each decay event lowers the reward by about 1.6% (k = 20).
Option |
Half-life |
First reward |
After 10 y |
After 50 y |
After 100 y |
|---|---|---|---|---|---|
k = 20, T = 46 M (confirmed) |
3.46 y |
43.87 E46 |
5.97 E46 |
0.00205 E46 |
≈ 10 base units |
k = 20, T = 21 M (charted 7 Oct 2026) |
3.46 y |
20.03 E46 |
2.73 E46 |
0.00094 E46 |
≈ 3 base units |
k = 21, T = 46 M |
6.91 y |
≈ 21.9 E46 |
— |
— |
— |
The neutrino era: tail emission forever (Option A, chosen 7 Oct 2026). A neutrino (1 base unit) can’t be split, which shapes the ending (T = 46 M, k = 20):
Year |
Event |
|---|---|
~100 |
Reward falls below 10 base units. The 10% pool shares round to zero, so the N-pool and Z-pool stop receiving new coins; their remaining balances still pay out until empty |
~114 |
The decay curve reaches zero; the neutrino floor takes over: every block pays exactly 1 base unit, all to the miner |
~118 |
The last of T is emitted: the final decay event, which opens the neutrino era |
forever |
Every block pays 1 neutrino plus fees. Supply grows by about 0.0021 E46 per year (≈ 2.1 E46 per thousand years, about 0.0000046% of T per century) |
There is no last neutrino, so miners always have a block reward and never depend on fees alone (Monero’s tail-emission reasoning, scaled down to a neutrino). Rejected alternatives: a hard stop at T with fees only (Bitcoin-style security-budget risk), and letting the final block’s type choose the ending (one miner would set monetary policy forever).
Implementation guard. remaining must be clamped at zero before the shift. In unsigned C or Rust, MAX_SUPPLY − E would otherwise wrap to an enormous value once the tail pushes E past T, and a block would mint billions. Consensus tests must cover the epochs around years 100, 114 and 118, and a 1,000-year simulation.
Decay events and miners. Miners know each step date in advance. The steps are small (~1.6%), so there is little to gain by timing, but the event is visible: suitable for the art and for announcements (“decay event #12”).
MAX_SUPPLY = T = 46,000,000 E46 × 10^8 base units (confirmed). Half-life: k = 20, 3.46 years (confirmed). Tail: the neutrino era (confirmed).
4. Radium: collision events (Rads) and Z-level¶
A Rad is a truncated collision found inside a block’s decay window:
window_prefix = SHAKE256( "E46-rad\0" ‖ prev_block_hash ‖ window_index ‖ miner_address ‖ nonce )
Rad = (nonce, a, b) with a < b, fixed length, and
the top Z bits of RL_v3(window_prefix ‖ a) == the top Z bits of RL_v3(window_prefix ‖ b), Z ≥ Z_base
Rule |
Purpose |
|---|---|
The prefix binds the previous block hash and the window |
no precomputation; events expire with the window |
The prefix binds the miner’s address |
a published pair can’t be stolen: changing the address changes both hashes |
Fixed puzzle size (decided 7 Oct 2026, #11): each nonce defines exactly S = 2^20 candidates, |
each puzzle costs exactly S hashes, then the miner moves to the next nonce: memoryless and fair, Rads scale linearly with hashrate (a nonce alone would not limit the search) |
Canonical form |
no duplicates or trivial events |
|
stable event rate |
Z-level (rarity). Each extra matching bit beyond Z_base is half as likely: +1 is 1 in 2, +8 is 1 in 256. Energy of a Rad ≈ 1.25 × 2^(Z/2) hashes, matching the measured birthday cost. Anyone can verify a Rad with 2 hashes.
Rad tiers and collision blocks (decided 7 Oct 2026). Matches are counted on the leading bits only, never the tail. Tiers sit on byte boundaries: 8, 16, 24, 32, 40, 48, 56, 64, … bits, each 256× rarer than the one below; tiers are also the Life Token rarity classes. A collision block is a block containing at least one Rad whose leading-bit match reaches the next byte tier strictly above Z_base: collision_tier(Z_base) = 8 × (⌊Z_base / 8⌋ + 1) (decided 7 Oct 2026, #13). Z_base 41 → 48; Z_base 48 → 56. At Z_base = 128 the next tier is 136, which a 128-bit match cannot reach, so no wrap-around is defined. A Rad with Z_base ≤ Z below that tier is still a valid Rad (it earns Z-level) but does not by itself make a collision block. Collision blocks trigger the N-pool and Z-pool payouts.
Paradox A: the measured cost is not the mined cost (7 Oct 2026). Our collision measurements (PHASE3-RESULTS §K) used 12-byte messages in one big parallel search, so they look like Rads. But a real Rad hashes 48 bytes (stamp ‖ a, 3× more RL steps), a commitment stamp hashes 55 bytes (3.44×), and Rads are small independent nonce-bound puzzles whose cost depends on the puzzle size, not one big birthday search. Thresholds chosen from the measurements alone came out wrong (Z_base 46 gave 6.6 Rads per block, not 18.6). Rule: every difficulty constant is provisional until it is measured on the exact message format and puzzle shape the chain uses. WO-08 and WO-09 make those measurements.
Rad kinds. RRAD (regular Rad): a Refracting Light collision, the default from phase 2. QRAD (quantum Rad): Shor factoring, switched on later by consensus.
Block Z-level. The block’s total Z-level is the sum of its Rads’ normalized energies (normalization TBD). Each miner’s Z share is the fraction contributed by their own Rads.
Commitment. The header carries event_root, a tagged SHAKE256 Merkle root (section 2b) whose type-0x02 leaves are the window’s Rads. Each leaf is (miner_address, window_index, nonce, a, b, Z), provable with a short Merkle path like a transaction.
Built-in alarm. The network publicly observes Rad rates against the birthday bound. A sustained excess is visible evidence of a hash weakness.
Launch plan: blocks and ASERT first; Rads are enabled once the event rules are reviewed (a phase-2 fork), so a flaw in the new mechanism cannot halt the launch.
5. Supply partition, E46 Life Tokens and the two reward pools¶
5.2 N-pool: staking rewards (N × subsidy)¶
At each collision block c:
Pool_N(c) = N_shares accumulated since the previous collision block (+ carry-over)
staker i locked s_i coins at origin block o, against their mining-earned Z share z_i at o
s_i ≤ N × subsidy(o) -- stake cap, N = 576 (one day of blocks)
w_i = s_i × z_i
p_i = Pool_N(c) × w_i / Σ_j w_j -- pro-rata
lock timeout: no collision block within L blocks of o -> s_i unlocks, no payout
N = 576 stake cap |
Year 0 |
Year 10 |
Year 25 |
Year 50 |
|---|---|---|---|---|
Max stake per staker |
25,269 E46 (0.055% of T) |
3,440 E46 |
173 E46 |
1.18 E46 |
5.3 Z-pool: Rad rewards for Life Token finders (Z × subsidy)¶
At each collision block c:
Pool_Z(c) = Z_shares accumulated since the previous collision block (+ carry-over)
finder j's energy e_j = Σ over their Rads in the window of 2^(Z_level − Z_base)
q_j = Pool_Z(c) × e_j / Σ_k e_k -- pro-rata by Rad energy (rarer = bigger share)
q_j ≤ Z × subsidy(c) -- per-finder cap, Z = 0.1; excess stays in Pool_Z
At year 0, Z × subsidy = 4.387 E46 per finder per collision block. With a collision block about every 10 blocks, each Z-pool holds about one subsidy (≈ 43.9 E46), so the cap spreads it across at least about 10 finders. Both the collision interval and the energy normalization are to be measured on the Rad prototype; Z may be retuned afterwards.
5.3a Irradiated E46 (E46i): Rad rewards decay with a half-life (decided 7 Oct 2026)¶
Z-pool payouts are paid as irradiated outputs (E46i). Their spendable value halves at every monthly decay event (section 3) until they are spent:
paid at block h, in decay epoch e₀ = floor(h / 17,280), amount v
spendable at block h' (epoch e = floor(h' / 17,280)): value = v >> (e − e₀)
spending (to anyone, including yourself) converts what remains into ordinary E46
the difference v − value is burnt
Epochs after payment |
Remaining |
|---|---|
0 |
100% |
1 (≈ 30 days) |
50% |
2 |
25% |
≈ 27 (≈ 2.2 years) |
0 for a 1 E46i output |
Only Rad rewards are irradiated. Ordinary E46 never decays.
Lazy evaluation: nodes never scan or time anything; the value is computed only when the output is spent (one subtraction, one bit-shift).
Independent of how soon or late the next collision block comes; aligned with the monthly decay events.
Burnt amounts are permanently removed, so the true supply can end slightly below T. Wallets show the next halving date of each E46i output.
Life Token fusion (decided 7 Oct 2026): two Life Tokens of the same tier can be fused into one token of the next tier; both inputs are burnt and no coins are created.
5.4 Worked example (staking)¶
Block 7483 has Z-level 1.2. Your Rads earned z = 0.0000012 of it. You lock 0.0001000 E46 (well under the cap). The next collision block is 7493: Pool_N = 10 blocks × 4.3869 ≈ 43.87 E46. If the total weight is 0.5, your payout is 43.87 × (0.0001 × 0.0000012 / 0.5) ≈ 0.0000000105 E46, and your 0.0001 E46 unlocks.
5.5 Rules¶
Not Proof of Stake consensus. Proof-of-work alone secures the chain. Staking only shares out the N-pool.
Sybil resistance. z and Rad energy are earned by mining work and can’t be split into more across addresses.
No lockout. The lock timeout L (200 blocks) guarantees every stake unlocks.
Wording. Testnet “points / experiment rewards”, never “yield” or “multiply your coins”.
Parameter |
Value (confirmed 7 Oct 2026) |
|---|---|
T (MAX_SUPPLY) |
46,000,000 E46 |
Split miner / N-pool / Z-pool |
80% / 10% / 10% |
N (stake cap, N × subsidy) |
576 |
Z (per-finder Rad cap, Z × subsidy) |
0.1 (retune after prototype: depends on the measured collision-block rate) |
L (lock timeout) |
200 blocks |
6. Decisions¶
Confirmed 7 Oct 2026
Decision |
Value |
|---|---|
Coin / feature names |
E46 coin; Radium Rads; E46 Life Tokens; Z-level |
Proof-of-work |
Refracting Light v3 |
Signatures |
SLH-DSA-128s (FIPS 205), no lattices |
Block time / size |
150 s / 4 MB |
Difficulty |
ASERT, 2 h half-life, one-laptop genesis, no min-difficulty fallback |
Emission |
monthly decay events (17,280 blocks), k = 20 (3.46 y half-life) |
Total supply T |
46,000,000 E46 |
Tail |
neutrino era forever (1 base unit per block after year ~114) |
Reward split |
miner 80% / N-pool 10% / Z-pool 10% |
N (stake cap) |
576 × subsidy |
Z (per-finder Rad cap) |
0.1 × subsidy (retune after prototype) |
L (lock timeout) |
200 blocks |
Irradiated E46 (E46i) |
Z-pool (Rad) rewards halve at each monthly decay event until spent (value = v >> epochs elapsed); ordinary E46 never decays (section 5.3a) |
Licence |
MIT (same as Bitcoin Core) |
Checkpoints / release signing |
a dedicated offline release laptop holds the signing keys and is used for nothing else; reproducible builds so others can verify |
Emergency forks |
small changes: the project owner decides; big changes (anything touching supply, rewards or the proof-of-work hash): consensus of contributors |
Genesis pszTimestamp |
|
Peer-to-peer privacy |
Tor and I2P support kept in the source behind build flags (CMake / Makefile), off by default, not advertised |
QTL dual delay |
50/50: half the delay in the Shor lock (squaring), half in the hash-chain lock; applies to local and live testnet, revisit in test-production |
Collision block |
a block with ≥ 1 Rad whose Z reaches the next byte tier strictly above Z_base: 8 × (⌊Z_base / 8⌋ + 1), e.g. 41 → 48 (#13) |
Rad puzzle size |
S = 2^20 candidates per nonce (runtime parameter until calibrated); all distinct pairs accepted (#11) |
Rad kinds |
RRAD (regular, default) and QRAD (quantum, later by consensus) |
Coin name |
E46 (final, 7 Oct 2026) |
Emergency / change decisions |
testnet: the project owner decides all changes; revisit only if the chain ever carries value |
Starting Rad difficulty |
Z_base ≈ 41 bits (provisional, 7 Oct 2026, after #11): with S = 2^20 candidates per puzzle, ≈ 18.7 Rads per 150 s block on a 4-core M1 (one puzzle ≈ 2.6 s, ≈ 1 Rad per 3 puzzles, ≈ 20 MB). Collision-block trigger 48-bit tier (the next tier above Z_base, #13). Replaces 43, which assumed one big birthday search (“Paradox A”). WO-08 measures the final value |
Commitment stamp |
Z_commit = 18 leading zero bits (provisional): median ≈ 0.5 s on 4 cores, ≈ 2 s on 1 core for the real 55-byte stamp hash (744 RL steps). Corrected from 20; WO-08/09 measure the final value |
Commitment limit |
1,000 commitment leaves per block (≈ 45 KB) |
Life Token fusion |
yes: 2 tokens of one tier → 1 of the next, inputs burnt |
Block QTL letter |
|
Build order |
Rad prototype first |
Quantum Rads switch-on |
by contributor consensus, activated as a version-bit soft fork |
Hardware keys |
FIDO2 optional in wallets, at the end of the GUI design |
Hash upgrades |
local testnet runs on RL v3 first; RL W only after that |
Block QTL |
opt-in commit–delay–reveal, address version |
IDs and addresses |
Bech32m; |
Hash policy |
No SHA-2. SHAKE256 for IDs, Merkle, shared addresses, domain hashing; SLH-DSA-SHAKE; KMAC256 for key derivation |
Still open
# |
Decision |
Notes |
|---|---|---|
1 |
Peer-to-peer details |
magic bytes, ports, seeds, fees (last) |
2 |
Refracting Light W, shard variants |
after the local testnet |
The starting Rad and stamp values above come from measured collision data; the Rad prototype confirms them on real Rad puzzles before launch.
7. Security review checklist¶
Every item needs a reviewer before launch.
# |
Threat |
Mitigation in this design |
Status |
|---|---|---|---|
S1 |
51% / deep reorganization from rented CPUs or GPUs (no RL v3 ASICs exist; cloud CPUs are rentable). Bitcoin’s SHA-256 ASIC fleet cannot attack E46: those chips are hard-wired to SHA-256d |
checkpoints (2c); recommend ≥ 30 confirmations (≈ 75 min) for anything meaningful; publish a hashrate monitor |
proposed |
S2 |
Timestamp games / timewarp to lower ASERT difficulty |
median-time-past rule; 15-min future limit; ASERT uses the parent’s timestamp, so the gain is bounded |
proposed |
S3 |
Selfish mining |
standard risk for any proof-of-work chain; documented, not solved |
known |
S4 |
Merkle malleability (CVE-2012-2459) and 64-byte transaction ambiguity |
tagged leaves and nodes; odd node carried up, never duplicated (2b) |
designed |
S5 |
Refracting Light weakness |
used only for proof-of-work and 128-bit addresses; the Rad rate is a public alarm; a pre-written emergency fork to switch proof-of-work to SHAKE256 is prepared before launch |
proposed |
S6 |
Supply bugs (Bitcoin’s 2010 value-overflow incident created about 184 billion BTC) |
integer-only emission; clamp |
designed |
S7 |
Pool accounting (N-pool, Z-pool) |
pools never mint; carry-over balances tracked in consensus state; invariant Σ payouts ≤ Σ shares |
designed |
S8 |
Staking abuse (Sybil, grinding, locked funds) |
z earned by mining; stake cap N × subsidy; lock timeout L; nonce-bound Rads |
designed |
S9 |
Genesis fairness |
pszTimestamp; 0-E46 genesis output; published |
designed |
S10 |
Consensus determinism |
fixed serialization; integer arithmetic; test vectors; two implementations must agree (Python reference and |
partly done |
S11 |
Signatures |
SLH-DSA-128s (FIPS 205), stateless, from a maintained library (liboqs); never a custom scheme |
proposed |
S12 |
Quantum preimage of 128-bit addresses (Grover ≈ 2^64) |
decided: 256-bit payload RL v3 128 ‖ SHAKE256 128 (≈ 2^128) |
decided |
S13 |
Peer-to-peer (eclipse, denial of service, relay of 4 MB blocks) |
deferred to the peer section (last) |
deferred |
S14 |
QTL wallet lock |
test data only, never physical access; anti-lockout design ( |
designed |
S17 |
RL v3 is ASIC-friendly: its multipliers 17, 257 and 65537 are a shift plus an add, rotations are free wiring, and there is no memory-hard step, so a custom chip would far outrun CPUs and GPUs |
irrelevant while the chain has no value; a memory-hard proof-of-work layer (Argon2/RandomX style) is a possible later option and would need full testing |
noted |
S18 |
Seeded SLH-DSA keygen relies on an OpenSSL option documented “for testing purposes”: a future OpenSSL could change or remove it, and wallets could no longer re-derive their keys from the master seed |
pinned OpenSSL version; NIST ACVP seeded-keygen KAT in CI and as a wallet startup self-test that refuses key generation on mismatch (decision #19) |
testnet accepted; revisit before mainnet |
S15: the E2 scenario (future universe: large quantum computers exist and SHA-2 collisions are broken).
# |
Part |
Algorithm |
Bits |
Classical cost |
Quantum cost |
In E2 |
|---|---|---|---|---|---|---|
1 |
Mining |
RL v3 |
128 |
proof-of-work |
Grover speeds up search; difficulty adjusts |
works |
2 |
Single-owner address |
RL v3 128 ‖ SHAKE256 128 |
256 |
preimage ≈ 2^128 |
Grover ≈ 2^128 |
safe |
3 |
Shared address |
SHAKE256 |
256 |
collision ≈ 2^128 |
BHT ≈ 2^85 |
safe (no SHA-2 dependency) |
4 |
Tx / block IDs |
SHAKE256 |
256 |
collision ≈ 2^128 |
BHT ≈ 2^85 |
safe |
5 |
Merkle roots |
tagged SHAKE256 |
256 |
collision ≈ 2^128 |
BHT ≈ 2^85 |
safe |
6 |
Signatures |
SLH-DSA-SHAKE-128s |
128-bit level |
≈ 2^128 |
NIST category 1; Shor-immune |
safe |
7 |
Rad IDs |
RL v3 |
128 |
collision ≈ 2^64 |
BHT ≈ 2^43 |
fine (labels) |
8 |
Quantum Rads (E2 only) |
factoring by Shor |
grows |
hard classically |
solvable by quantum machines |
reward stream, never a dependency |
9 |
Key derivation |
KMAC256 |
256 |
PRF |
Grover ≈ 2^128 |
safe |
10 |
QTL password |
Argon2id (BLAKE2b inside) |
256 |
memory-hard guessing |
Grover on guesses only |
strong password, later the 2FA key |
11 |
QTL encryption |
AES-256-GCM |
256 |
2^256 |
Grover ≈ 2^128 |
safe |
12 |
QTL time delay |
dual delay (S16) |
— |
both locks sequential |
Shor opens lock A only; lock B stays sequential |
delay survives |
13 |
Address checksum |
Bech32m |
30 |
error detection only |
— |
unchanged |
The version character p (v1) stays reserved: if SHAKE256 itself ever weakened, IDs and addresses switch versions without changing the format.
S16: QTL dual delay, Shor-aware (proposed). The current QTL delay (RSW squaring mod N) is opened instantly by anyone who can factor N, which Shor does. Proposed replacement for the wallet lock:
Lock A (Shor hunt): y_A = x^(2^T_A) mod N -- creator: instant via the factors of N; others: T_A sequential squarings
-- a quantum attacker runs Shor (period finding) to factor N and skips Lock A
Lock B (search back): y_B = SHAKE256^(T_B)(seed) -- a sequential hash chain; Shor gives no shortcut, Grover doesn't help
-- sequential work, so the attacker must walk the whole chain
K = KMAC256(Argon2id(password) ‖ y_A ‖ y_B, "E46-QTL-2")
Lock B has no creator shortcut: there is a proof (Mahmoody–Moran–Vadhan) that hash-only time locks can’t give the creator a trapdoor. The fix is a chain bank: while idle, the wallet precomputes a few chains with their checkpoints and stores them encrypted. Sealing then just takes the next banked chain, so creating a lock stays instant.
Checkpoints on both locks keep the anti-lockout guarantees (QTL-V2-ANTI-LOCKOUT.md): damage is caught early and progress can resume.
Split: for example half the target time in each lock, so a classical attacker faces the full delay and a quantum attacker still faces at least half.
Shor as an experiment, not a toy: a classical simulation of Shor’s period finding on small N, to show exactly what a quantum attacker does to Lock A, and real Quantum Rads (row 8) once quantum hardware outgrows classical factoring.
Status: design only; nothing built.
9. Planned: Refracting Light W (1024-bit state, 512-bit output)¶
Decided direction, 7 Oct 2026: expand Refracting Light from a 512-bit state with 128-bit output to a 1024-bit state folded to 512 bits (8 lanes instead of 4, the same step function). This replaces the idea of a 256-bit fold of v3.
v3 (today) |
W (planned) |
|
|---|---|---|
Internal state |
512 bits (4 lanes) |
1024 bits (8 lanes) |
Output |
128 bits |
512 bits |
Hidden state bits |
384 |
512 |
Collision (classical / quantum) |
2^64 / ≈2^43 |
2^256 / ≈2^171 |
Preimage (classical / Grover) |
2^128 / 2^64 |
2^256 / 2^256 |
256-bit address from it (Grover) |
— |
≈ 2^128 |
Speed |
1× |
≈ 2× slower |
Throwaway sketch measurements (scratch, not project code): full mixing after 2 steps, avalanche 255.6 / 512 bits. W is not used anywhere until it passes the full Phase 3 suite, the step-reversal test and outside review. Until then the chain stays as decided: RL v3 for proof-of-work and Rad IDs, RL v3 128 ‖ SHAKE256 128 for addresses. Once W passes, it can take over addresses (version p) and possibly proof-of-work.
Security rule (section 7): collision ≈ min(output/2, hidden/2), preimage ≈ min(output, hidden/2). W meets both with room to spare.
Status: paused by the project owner on 7 Oct 2026. Nothing built.
8. What this document does not claim¶
No security proof, no audit, no external cryptanalysis of Refracting Light, no real quantum or nuclear process, no monetary value. Every throughput and timing figure is an estimate from the measurements in PHASE3-RESULTS.md and the C benchmark, to be re-measured on the prototype.