21 KiB
Dovada PQC verificabila. Tested commands and real output
Nota adaugata 2026-08-19. Afirmatiile de aici ca pe lantul 2800 consensul e (sau ramane) clasic ECDSA secp256k1 QBFT au fost scrise inainte de ancora post-cuantica din antet si raman adevarate pentru finalitatea bloc cu bloc. De la blocul 13.014.000 fiecare al 32-lea bloc poarta, sub amprenta lui, un certificat de sigilii Falcon-512 ale validatorilor, iar de la 13.034.000 un nod respinge un astfel de bloc de ancora cu mai putin de 3 sigilii valide (f+1 din 9; 8-9 purtate in practica). E un punct de control post-cuantic la ~16 secunde, nu un cvorum pe fiecare bloc: afirmatia publicata pe 15 august ca de la 14.050.000 niciun bloc nu se finalizeaza fara cvorum post-cuantic era gresita (regula armata atunci e retrasa in codul livrat in favoarea regulilor ancorei) si a fost retrasa pe 19 august. Detalii: https://aere.network/quantum.html si depozitul aere-node, anchor/README.md.
Date: 2026-07-20
Chain: AERE mainnet, chain ID 2800 (0xaf0)
Endpoints used: https://rpc.aere.network and https://rpc2.aere.network
Head at time of measurement: 10,615,742 rising to 10,617,158 during the run
Every command below was executed against the live public RPC before being written down. Output is pasted verbatim. Where something did not verify, this document says so explicitly.
0. The problem this document fixes
We publish "the post-quantum precompiles activated at block 9,189,161" and invite the reader to check it. A stranger who follows that pointer finds an empty block. The activation is real, the number is correct, but the pointer is useless as evidence, because the activation was a fork configuration change and not a transaction. There is no artifact in that block to look at.
The number stays. The evidence changes.
1. Confirmed: block 9,189,161 is empty, on both endpoints
curl -s -X POST https://rpc.aere.network -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["0x8c3729",false]}'
0x8c3729 is 9,189,161. Measured, both endpoints, identical:
| Block | Timestamp | Tx count | gasUsed | Hash |
|---|---|---|---|---|
| 9,189,160 | 1783820271 | 0 | 0x0 |
0x6ecfa50257f2de5953d22baa27843ce55fd09a3f26adbc060264b97f09ee804a |
| 9,189,161 | 1783820272 | 0 | 0x0 |
0x3cb61a23dfc7065cce44fb62108a36bb3f4147bb851ddd9bdec374eba4a337cf |
| 9,189,162 | 1783820272 | 0 | 0x0 |
0x999acabe0c2add28977ab78ccf2f8f16b245a2e110d5934ddedabe14d11a0aa4 |
rpc.aere.network and rpc2.aere.network returned byte-identical hashes for all three blocks.
The finding is confirmed. Block 9,189,161 contains zero transactions. Pointing a reader at
explorer.aere.network/block/9189161 as proof of the activation hands a critic a working
counterexample.
2. What survives as evidence. Four candidates, all tested
2.1 eth_config. SOLID, and the single best artifact
This was not used anywhere in our public copy. It is the strongest and simplest proof, because the
live node states the activation time and the active precompile set in one call, at latest, with no
historical state involved.
curl -s -X POST https://rpc.aere.network -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_config","params":[]}'
Real output, abbreviated to the relevant fields, identical on both endpoints:
{ "result": { "current": {
"activationTime": 1783820272,
"chainId": "0xaf0",
"forkId": "0xce69e400",
"precompiles": {
"AereFalcon512": "0x0000000000000000000000000000000000000ae1",
"AereFalcon1024": "0x0000000000000000000000000000000000000ae2",
"AereMLDSA44": "0x0000000000000000000000000000000000000ae3",
"AereSLHDSA128s": "0x0000000000000000000000000000000000000ae4",
"AereSHAKE256": "0x0000000000000000000000000000000000000ae5",
"P256VERIFY": "0x0000000000000000000000000000000000000100",
"ECREC": "0x...01", "SHA256": "0x...02", "RIPEMD160": "0x...03", "ID": "0x...04",
"MODEXP": "0x...05", "BN254_ADD": "0x...06", "BN254_MUL": "0x...07",
"BN254_PAIRING": "0x...08", "BLAKE2F": "0x...09", "KZG_POINT_EVALUATION": "0x...0a",
"BLS12_G1ADD": "0x...0b", "BLS12_G1MSM": "0x...0c", "BLS12_G2ADD": "0x...0d",
"BLS12_G2MSM": "0x...0e", "BLS12_PAIRING_CHECK": "0x...0f",
"BLS12_MAP_FP_TO_G1": "0x...10", "BLS12_MAP_FP2_TO_G2": "0x...11"
},
"systemContracts": {
"BEACON_ROOTS_ADDRESS": "0x000f3df6d732807ef1319fb7b8bb8522d0beac02",
"HISTORY_STORAGE_ADDRESS":"0x0000f90827f1c53a10cb7a02335b175320002935"
}
}, "next": null, "last": null } }
Two things this proves at once:
activationTimeis 1783820272, which is exactly the timestamp of block 9,189,161 in section 1.- The active precompile set contains exactly five Aere entries,
0x0AE1through0x0AE5.0x0AE6and0x0AE7are not in the list. The live node itself confirms they are not on mainnet.
2.2 First block at or after activationTime. SOLID
The link from the timestamp to the block number is a binary search over header timestamps. Headers are full history, so this works at any depth and needs no state.
# 23 eth_getBlockByNumber calls, binary search for the first block with timestamp >= 1783820272
Real output:
binary search for first block with timestamp >= 1783820272
result block : 9189161 (23 rpc calls)
ts(block) : 1783820272
ts(block-1) : 1783820271
matches claim 9189161: True
This is what makes the published number defensible. 9,189,161 is not an assertion taken from a
config file that the reader must trust. It is the block the reader derives themselves from
activationTime, which the node publishes. The block is empty, and that is expected and fine, because
its significance is its timestamp, not its contents.
2.3 Attestation receipt at block 9,200,532. SOLID
Receipts and logs are full history and are unaffected by the 512-block state window.
curl -s -X POST https://rpc.aere.network -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_getTransactionReceipt","params":["0xcd1350372f0a61e26e8a3228da599be9211839f378eef0ea49f2025a20920660"],"id":1}'
Measured:
| Field | Value |
|---|---|
| Status | 0x1 (success) |
| Block | 9,200,532 |
| Block hash | 0x719402887c204b4e6674a34911259ead10986efa744b550b209ea571d986a88a |
| To | 0x465d9e3b476bf98aa1393079e240db5d2a9bea6a (AerePQCAttestation) |
| Gas used | 1,386,367 |
| Logs | 1, topic0 0x8cf3c7a52148b21f2af90768d73b55c8115c55af53d5d36f5c14b39108789648 |
Why a successful receipt is proof. AerePQCAttestation.attest() reverts unless the precompile
returns a 32-byte word ending in 0x01. A staticcall to an address with no precompile succeeds
with empty return data, which fails the ret.length >= 32 check, which reverts the transaction.
A recorded status 0x1 therefore cannot happen on a chain where the precompile is absent.
Corroboration, measured at latest: the contract runtime bytecode is 4,402 bytes and contains
references to 0x0AE1, 0x0AE2, 0x0AE3 and 0x0AE4.
2.4 Live gas differential at latest. SOLID, and the strongest live proof
Full method and results in section 3.
2.5 What did NOT work, stated explicitly
eth_callto0x0AE1at block 9,189,161 returns-32603 Internal error. Historical state is pruned. Do not put this in any instruction.eth_getCode/eth_getBalance/eth_getStorageAtat that height returnnull. Same reason.- The return-value test ("live returns a 32-byte word, absent returns
0x") is not sound and must not be published as the liveness proof. See section 3.1.
3. The gas differential, done correctly
3.1 Why the previous attempt recorded a bad proof
A previous run concluded 0x0AE6 and 0x0AE7 were "not live" because they "returned empty 0x".
That reasoning is invalid. A live precompile that rejects malformed input can also return empty, and
a codeless address returns empty while reporting success, so the two cases are indistinguishable
from the return value alone.
Measured demonstration:
0x0AE1 (LIVE, garbage input) -> 0x0000...0000 (32-byte zero word)
0x0AE6 (ABSENT) -> 0x
0xdead (codeless control) -> 0x
In this particular instance 0x0AE1 happens to return a zero word rather than empty, so the test
appears to work. That is incidental to how this one precompile handles malformed input. It is not a
general discriminator, and the conclusion must not rest on it. Gas is the sound discriminator,
because a codeless address consumes zero execution gas and a live precompile cannot.
3.2 The method
Deploy a probe via eth_call state override. The probe reads GAS, performs a CALL to the target,
reads GAS again, and returns the difference. Two corrections matter and were both applied:
- Pre-expand memory before the first
GASreading, withMSTORE(0xA000, 0). Without this, theCALL's memory expansion charge (about 7,040 gas) lands inside the measurement and varies with input length, which swamps the signal. - Pre-warm the target address with a throwaway
CALLbefore the firstGASreading. Without this, EIP-2929 charges 2,600 for a cold address and 100 for a warm one. Standard precompiles are pre-warmed and an arbitrary control address is not, which produces a false negative delta.
The measured value is then target_cost - control_cost, which is pure execution gas.
Probe bytecode, for target T (20 bytes, no 0x):
0x366000600037 6000 61a000 52 6000600060006000600073<T>612710f150
5a 612000 618000 36 6000 6000 73<T> 6305f5e100 f1 50 5a 90 03 600052 60206000f3
Copy-pasteable form, Falcon-512 at 0x0AE1:
curl -s -X POST https://rpc.aere.network -H 'content-type: application/json' -d '{
"jsonrpc":"2.0","id":1,"method":"eth_call","params":[
{"to":"0x000000000000000000000000000000000000b0b0",
"data":"0x3333333333333333333333333333333333333333333333333333333333333333",
"gas":"0x1c9c380"},
"latest",
{"0x000000000000000000000000000000000000b0b0":{"code":"0x366000600037600061a0005260006000600060006000730000000000000000000000000000000000000ae1612710f1505a6120006180003660006000730000000000000000000000000000000000000ae16305f5e100f1505a900360005260206000f3"}}]}'
Swap the two occurrences of 0000000000000000000000000000000000000ae1 for any other address to
measure that address. Use 000000000000000000000000000000000000dead as the codeless control.
3.3 Calibration. Run this FIRST, before trusting any number
The IDENTITY precompile at 0x04 costs exactly 15 + 3*ceil(len/32). If the probe does not
reproduce that formula, the probe is wrong and every other number from it is worthless.
Real output:
CALIBRATION: IDENTITY 0x04, expected = 15 + 3*ceil(len/32)
len raw(0x04) raw(ctrl) measured expected
32 142 124 18 18 MATCH
320 169 124 45 45 MATCH
1024 235 124 111 111 MATCH
4096 523 124 399 399 MATCH
calibration PASSED
Second calibration on SHA256 at 0x02, which costs 60 + 12*ceil(len/32):
len=32 measured=72 expected=72
len=320 measured=180 expected=180
Both calibrations are exact at every length tested. The probe is trustworthy.
3.4 Results, measured at block 10,615,742 at latest
Input 0x33 repeated, at three lengths, on rpc.aere.network:
| Precompile | len=32 | len=1024 | len=2048 | Verdict |
|---|---|---|---|---|
0x0AE1 Falcon-512 |
40,000 | 40,000 | 40,000 | LIVE |
0x0AE2 Falcon-1024 |
75,000 | 75,000 | 75,000 | LIVE |
0x0AE3 ML-DSA-44 |
55,000 | 55,000 | 55,000 | LIVE |
0x0AE4 SLH-DSA-128s |
350,000 | 350,000 | 350,000 | LIVE |
0x0AE5 SHAKE256 |
24,636 | 25,008 | 25,392 | LIVE (length dependent) |
0x0AE6 ML-KEM-768 |
0 | 0 | 0 | ABSENT, identical to codeless control |
0x0AE7 Falcon HashToPoint |
0 | 0 | 0 | ABSENT, identical to codeless control |
Independently reproduced on rpc2.aere.network, identical values: 40,000 / 75,000 / 55,000 /
350,000 / 24,636 / 0 / 0.
3.5 Cross-check against the node source. Independent corroboration
The measured constants match the gas schedule in
aere-node/patches/0001-aere-pqc-precompiles-mainnet.patch:
line 279: private static final long GAS = 40_000L; // Falcon-512 0x0AE1
line 211: private static final long GAS = 75_000L; // Falcon-1024 0x0AE2
line 352: private static final long GAS = 55_000L; // ML-DSA-44 0x0AE3
line 562: private static final long GAS = 350_000L; // SLH-DSA-128s 0x0AE4
line 460: static final int MAX_OUTPUT = 1 << 16; // SHAKE256 0x0AE5
line 462: private static final int BASE_GAS = 60;
line 463: private static final int GAS_PER_WORD = 12;
SHAKE256 is BASE_GAS + GAS_PER_WORD * (ceil(dataLen/32) + ceil(outLen/32)). The 0x33-filled input
above encodes a huge output length, which the contract caps at MAX_OUTPUT = 65,536 = 2,048 words,
giving 60 + 12*2048 = 24,636, exactly the measured value.
Verified with well-formed inputs, outLen as a 32-byte big-endian prefix:
outLen=32 dataLen=32 measured=84 expected=84 MATCH
outLen=32 dataLen=1024 measured=456 expected=456 MATCH
outLen=64 dataLen=0 measured=84 expected=84 MATCH
outLen=256 dataLen=256 measured=252 expected=252 MATCH
On-chain measured gas equals the published source constants. This is the corroboration that makes the live proof self-contained: a stranger measures the gas, reads the source, and the two agree.
3.6 Correction to the previously recorded numbers
Prior record: control 23,897; 0x0AE1 62,853; 0x0AE2 97,992; 0x0AE3 77,913; 0x0AE4 376,144;
0x0AE5 47,055; 0x0AE6 and 0x0AE7 both 23,897.
Those absolutes were whole-call totals, including the 21,000 intrinsic transaction cost, calldata cost and probe overhead. They are not precompile execution costs. A separate review recorded a control of 61,825, different again, for the same reason. Subtracting each run's own control gets close to the true values but not exactly, because the overhead does not cancel cleanly.
Corrected: the execution costs are 40,000 / 75,000 / 55,000 / 350,000 and
60 + 12*words for SHAKE256. These are round numbers because they are literal constants in the
client, and they now match the source line for line.
Confirmed unchanged: the conclusion that 0x0AE6 and 0x0AE7 are absent on mainnet. They
measure exactly the codeless control in both the old run and this one, and eth_config independently
omits them from the precompile list. Two independent methods agree.
4. Why this document does not reconstruct block hashes
A proposed replacement wording instructed the reader to re-encode extraData with the seals list
emptied and the round set to zero, and to recover each committed seal by ECDSA. As written it would
fail at block 1, and it is not needed for the PQC claim. Measured header field sets:
| Block | Optional header fields present |
|---|---|
| 1 | baseFeePerGas, withdrawalsRoot (2 fields) |
| 9,189,161 | baseFeePerGas, withdrawalsRoot, blobGasUsed, excessBlobGas, parentBeaconBlockRoot, requestsHash (6 fields) |
| latest | same 6 fields |
extraData is also 238 bytes at blocks 1 and 9,189,161 but 525 bytes at latest, because the
validator set grew and the seal list with it. Any instruction that hardcodes one field set or one
extraData layout breaks on the other era.
Header reconstruction is a real capability and it does work, at 2 fields for pre-Pectra blocks and 6 for post-Pectra blocks. It is simply the wrong tool for proving precompile activation, and it adds a large failure surface to an instruction that does not need it. It is out of scope here and should be documented separately, with the field count stated per era and tested at both eras.
5. The corrected instruction, for publication
Verify the post-quantum precompiles yourself
No wallet, no gas, no account. Two commands.
1. Ask the network what is active.
curl -s -X POST https://rpc.aere.network -H 'content-type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"eth_config","params":[]}'The response lists
activationTime: 1783820272and the five Aere precompiles at0x0AE1through0x0AE5. Block 9,189,161 is the first block whose timestamp is at or after that activation time, which you can confirm by binary search overeth_getBlockByNumbertimestamps. That block contains no transactions, because the activation was a fork configuration change and not a transaction. Its significance is its timestamp, not its contents. Repeat againsthttps://rpc2.aere.networkfor an independent second endpoint.2. Prove they are executing right now, by measuring gas.
A live precompile consumes gas. An address with nothing at it consumes none. Return values do not settle this, because an empty address returns empty data and reports success. Gas does.
The command in section 3.2 deploys a throwaway measuring probe via
eth_callstate override and returns the gas consumed by one call to the target. Calibrate it first against the IDENTITY precompile at0x04, whose cost is fixed by the EVM specification at15 + 3*ceil(len/32). For a 32-byte input it must read exactly 18 more than the codeless control. Then measure:
Address Measured gas above control Meaning 0x04IDENTITY18 calibration, matches the EVM spec 0x0AE1Falcon-51240,000 live 0x0AE2Falcon-102475,000 live 0x0AE3ML-DSA-4455,000 live 0x0AE4SLH-DSA-128s350,000 live 0x0AE5SHAKE25660 + 12 per word live 0x0AE6,0x0AE70 not on mainnet, testnet only Those constants are in the client source, so your measurement and our published code can be compared directly.
Optional, to check the past. Historical account state is pruned after 512 blocks, so a historical
eth_callwill not work. Receipts are kept in full. Receipt0xcd1350372f0a61e26e8a3228da599be9211839f378eef0ea49f2025a20920660is a successful post-quantum attestation at block 9,200,532, status0x1, 1,386,367 gas. That contract reverts unless the precompile returns a valid result, so a successful receipt could not exist on a chain without the precompile.Scope, stated plainly. Post-quantum signature verification is live on mainnet at the execution layer, and any contract can require it. AERE consensus remains classical secp256k1 ECDSA under QBFT and is not post-quantum. Hybrid post-quantum consensus exists only on an isolated testnet and is audit-gated.
0x0AE6and0x0AE7are testnet only.
6. Provable and not provable
Provable today, by a stranger, measured above:
- Five NIST post-quantum precompiles execute on mainnet right now, at
0x0AE1to0x0AE5, with gas costs matching published source constants. - The fork activation time is 1783820272 and block 9,189,161 is the first block at or after it.
- Post-quantum signature verification recorded successfully on-chain at block 9,200,532.
0x0AE6and0x0AE7are not active on mainnet, by two independent methods.- Both public endpoints agree on every value in this document.
Not provable, and must never be claimed:
- Consensus is not post-quantum. It is classical secp256k1 ECDSA under Hyperledger Besu QBFT.
- The activation height cannot be proven from block contents, only from the activation timestamp plus header timestamps. The block is empty and always will be.
- Historical account state before the 512-block window cannot be queried.
eth_getBalancereturnsnullandeth_getTransactionCountreturns a false0x0rather than erroring.
Not verified in this pass, stated so it is not mistaken for verified:
- I did not read the live QBFT
transitionsconfiguration on the validators.activationTimecame from theeth_configRPC response, not from a node config file. - I did not re-verify the NIST KAT vector replay on
quantum.html. A prior review recorded 27/27 passing; I did not independently rerun it. - I did not verify the sub-second transition block number. That is a separate open finding.
7. Infrastructure safety
No transaction was sent, no contract deployed, no node touched, no configuration changed. All calls
were read-only JSON-RPC (eth_blockNumber, eth_chainId, eth_getBlockByNumber,
eth_getTransactionReceipt, eth_getCode, eth_call, eth_config). The eth_call state overrides
are simulation-only and write nothing.
RPC health measured after all activity:
rpc.aere.network attempt 1: 381 ms {"result":"0xa1fd42"}
rpc.aere.network attempt 2: 371 ms {"result":"0xa1fd43"}
rpc.aere.network attempt 3: 437 ms {"result":"0xa1fd44"}
rpc2.aere.network attempt 1: 459 ms {"result":"0xa1fd45"}
rpc2.aere.network attempt 2: 444 ms {"result":"0xa1fd46"}
All responses well under one second, block height advancing normally.