aere-research/aips/AIP-7.md
Aere Network 4a0b48588c Initial public release
Aere Network public source. Everything here can be checked against the live
chain (chain id 2800, https://rpc.aere.network).

Scope note, stated up front rather than buried: consensus on chain 2800 is
classical secp256k1 ECDSA QBFT. The post-quantum work in this repository is at
the signature, precompile, account and transport layers. Nothing here makes the
consensus post-quantum, and no document in it should be read as claiming so.
2026-07-20 01:02:30 +03:00

240 lines
13 KiB
Markdown

# AIP-7: AerePQC Hard-Fork Activation (Native PQC Precompiles and Extended EIP-2935 Lookback)
## Preamble
| Field | Value |
| --- | --- |
| AIP | 7 |
| Title | AerePQC Hard-Fork Activation (Native PQC Precompiles and Extended EIP-2935 Lookback) |
| Author | AERE Foundation |
| Type | Standards Track |
| Category | Core |
| Status | Final |
| Created | 2026-07-16 |
| Requires | 4 |
| Ratification | Foundation-ratified (pre-decentralization) |
## Abstract
This AIP documents the AerePQC hard fork, a coordinated, client-only activation on
mainnet chain 2800 at block 9,189,161 (2026-07-12) that added two Core changes: five
native post-quantum verification precompiles at the address band `0x0AE1`..`0x0AE5`
(Falcon-512, Falcon-1024, ML-DSA-44, SLH-DSA-SHA2-128s, and SHAKE256), and the
native EIP-2935 8191-block historical-block-hash lookback. It is a retro-filed
record of a change already live on chain 2800. It is explicit that this fork
changed only the execution layer; AERE consensus is still classical secp256k1
ECDSA QBFT and is not post-quantum.
## Motivation
AIP-4 documents AERE's pure-Solidity post-quantum verifier suite. Two of those
schemes, Falcon-1024 and ML-DSA-44, cannot record a verification result in a
state-changing transaction in pure Solidity, because a recording transaction
exceeds the EIP-7825 per-transaction gas cap of 16,777,216 (2^24). Their
verification is correct but was reachable only as a read-only `eth_call` view,
which is only as trustworthy as the node answering it and is not consensus
anchored. The other schemes that do fit under the cap (notably Falcon-512, at
roughly 10.5M gas inside a full userOp) are correct but expensive.
The fix that removes both limits is a native precompile: the dominant cost inside
every one of these verifiers is SHAKE / Keccak-f[1600] streaming plus lattice ring
arithmetic, and moving that into audited native code, wrapped as an EVM precompile,
reduces each verification by more than an order of magnitude. This is the same
approach Ethereum uses for other heavy primitives (RIP-7951 for native P-256,
EIP-2537 for native BLS12-381). Bundling the native EIP-2935 write path into the
same fork gave the network extended trustless block-hash lookback in one scheduled
activation instead of two.
The goal was to make Falcon-1024 and ML-DSA-44 record on-chain within the same
16,777,216 per-transaction cap AERE keeps as a functional peer of Ethereum L1, to
make the schemes that already fit far cheaper, and to do so as a client-only fork
with no re-genesis and no state migration.
## Specification
### Activation point
The AerePQC hard fork activated on mainnet chain 2800 at **block 9,189,161**
(2026-07-12). It is configured as a Besu `futureEips` milestone with activation
timestamp `futureEipsTime = 1783820272` (2026-07-12 01:37:52 UTC). Activation added
precompile behavior and the EIP-2935 write path only. It did NOT change how blocks
are proposed, signed, or committed: blocks are still produced and committed by the
QBFT validator set signing classical secp256k1 ECDSA committed seals.
### Native PQC precompiles
The fork registers five native precompiles that wrap the audited Bouncy Castle 1.83
BCPQC verifiers already present on the client classpath, behind a dedicated
classloader-isolation boundary so that Bouncy Castle 1.83 cannot collide with the
older Bouncy Castle that Besu bundles. There is zero new hand-rolled cryptography.
| Address | Precompile | Standard | Output |
| --- | --- | --- | --- |
| `0x0000000000000000000000000000000000000AE1` | Falcon-512 verify | NIST round-3 Falcon | valid / invalid |
| `0x0000000000000000000000000000000000000AE2` | Falcon-1024 verify | NIST round-3 Falcon | valid / invalid |
| `0x0000000000000000000000000000000000000AE3` | ML-DSA-44 verify | FIPS 204 (internal interface) | valid / invalid |
| `0x0000000000000000000000000000000000000AE4` | SLH-DSA-SHA2-128s verify | FIPS 205 (internal interface) | valid / invalid |
| `0x0000000000000000000000000000000000000AE5` | SHAKE256 | FIPS 202 XOF | requested output bytes |
Each verify precompile is a pure function of its input bytes: it parses a packed,
length-prefixed public key, signature, and message; reverts deterministically on
malformed structure; and otherwise returns a valid/invalid decision. SHAKE256
returns the requested number of output bytes. Because a precompile result feeds a
consensus-critical state transition, every node MUST return byte-identical output
for identical input; the verify paths used are deterministic and integer-only
(Falcon verification never touches the floating-point signing path).
The full input encodings, per-scheme parameters, revert-versus-`0x00` semantics, and
gas model are specified in `research/aip-draft-pqc-precompiles.md`. Gas figures
below are the values measured on the pre-activation scratch fork (chain 28099) and
carried to mainnet.
| Scheme | Marginal verify-op gas | Full verify-and-record tx gasUsed | Share of 16,777,216 cap |
| --- | --- | --- | --- |
| SHAKE256 | 60 + 12/word | 21,470 | 0.13% |
| Falcon-512 | 40,000 | 86,336 | 0.51% |
| Falcon-1024 | 75,000 | 145,496 | 0.87% |
| ML-DSA-44 | 55,000 | 351,050 | 2.09% |
| SLH-DSA-SHA2-128s | 350,000 | 558,276 | 3.33% |
These figures move Falcon-1024 (about 21.7M gas in pure Solidity) and ML-DSA-44
(about 52.9M gas) from view-only to record-on-chain, and drop Falcon-512 from about
10.49M gas to 86,336.
### Native EIP-2935 (extended block-hash lookback)
The fork also activates the native EIP-2935 history-storage system contract at the
canonical address `0x0000F90827F1C53a10cb7A02335B175320002935`, a ring buffer of
the last 8191 block hashes. At the start of every block, the parent block hash is
written into slot `(number - 1) % 8191` by a consensus system call, before any user
transaction runs. There is no keeper, relayer, or Foundation key involved; the
write is a condition of block validity. Contracts read a hash by `STATICCALL` with
the 32-byte block number; a query outside the served window `[number - 8191,
number - 1]` reverts. At AERE's 0.5-second block time, 8191 blocks is roughly 68
minutes of trustless lookback, against the roughly 128 seconds the 256-block
`BLOCKHASH` opcode gives. The system contract's runtime bytecode is byte-identical
to Ethereum's Pectra deployment and was deployed post-genesis via the canonical
keyless "Nick's-method" transaction, so the block-0 state root is unchanged.
## Rationale
Native precompiles rather than more Solidity optimization: the pure-Solidity
verifiers are already heavily optimized (hand-written Keccak-f assembly) and the
remaining cost is intrinsic. Only native code removes it, which is the same
reasoning that justified RIP-7951 and EIP-2537 on Ethereum.
Wrapping a maintained, audited native library (Bouncy Castle) rather than
hand-rolling the verify keeps the security boundary at a reviewed implementation
plus a thin parsing adapter. The classloader-isolation boundary exists because Besu
bundles an older Bouncy Castle, and a naive classpath addition risks silently
binding the wrong implementation.
A single coordinated hard fork with no re-genesis was chosen over a chain restart
so the network kept its entire history, state, and validator keys, consistent with
the same discipline applied in AIP-3. Bundling EIP-2935 into the same activation
gave the network extended lookback and post-quantum verification in one scheduled
event. Keeping the same 16,777,216 per-transaction gas cap as Ethereum L1, rather
than raising a local gas limit, is deliberate: it is why the native precompile,
not an unbounded gas budget, is the correct fix.
The precompiles were placed at the `0x0AE1`..`0x0AE5` band already used on the
scratch fork, above the Ethereum standard precompiles, the EIP-2537 BLS12-381
range, and the RIP-7951 P-256 precompile at `0x100`, so upstream precompile
allocations do not collide. If upstream Ethereum later allocates into this band,
AERE will re-evaluate to preserve equivalence.
## Backwards Compatibility
None that breaks existing contracts. Before activation the five band addresses were
empty accounts and the EIP-2935 system address had no code; a call to any of them
behaved as a call to an empty address. After block 9,189,161 they behave as
precompiles and as the consensus-written history ring buffer. The pure-Solidity
verifiers documented in AIP-4 remain deployed and unchanged; contracts MAY migrate
to the precompiles for lower gas but are not required to. Integrators SHOULD gate
precompile use on chain height (past the activation block), not on probing.
Because AERE runs all validators under one operator and one client today,
activation was a flag-day upgrade of the client build across the validator set at
the fork block. A node that had not upgraded would compute different results for
calls into the band and fork off, so the upgrade was mandatory for all validators
and archive/RPC nodes at the fork block.
## Security Considerations
**This fork does not make AERE consensus post-quantum.** Validators continue to sign
classical secp256k1 QBFT committed seals. The precompiles are an application and
account layer capability. Any claim of post-quantum consensus on the basis of this
fork would be false and must not be made. Isolated-testnet work on a Falcon quorum
certificate and a second execution client is separate R&D and is not live on chain
2800.
**Single operator, one client.** Chain 2800 runs seven QBFT validators (f=2,
quorum 5-of-7), all Foundation-operated, on a single execution client (Hyperledger
Besu). Even at f=2, the validators are one operator and one client, so a consensus
bug in a precompile is not caught by client diversity, because there is no second
live client. This raises, not lowers, the bar for an external audit and for
extensive differential testing.
**Determinism and gas agreement.** Every node must compute the identical
accept/reject and the identical gas charge. The verify paths are deterministic and
integer-only, and the adapter reads no chain state or block context. Gas is priced
from native microbenchmarks so a precompile call cannot consume disproportionate
wall-clock time for its gas; malformed input reverts and consumes all supplied gas,
so it cannot be used as a cheap probe.
**A valid signature is not authorization.** A valid decision from a verify
precompile establishes only that the signature is valid for the given public key and
message. It does not establish freshness, ordering, replay protection, or key
ownership; consuming contracts (for example AerePQCAttestation) add their own nonce
and domain separation. For hash-based schemes with one-time-per-leaf state (XMSS,
WOTS+), a valid verification does not prove the signer has not reused a leaf.
**External audit pending.** The fork, the five precompiles, and the consuming
contracts carry an internal self-audit only. They have not undergone an external
security audit. Their assurance today rests on bit-for-bit agreement with the
official NIST KAT and ACVP vectors, cross-checks against independent
reimplementations (including a second execution client that runs the precompiles
byte-identically on an isolated testnet), and an on-chain end-to-end attestation.
They should not secure material value until an external audit lands.
## Reference Implementation and On-Chain Deployment
This is a client and chain-configuration change, so the precompile band and the
EIP-2935 system contract have no per-scheme deployment artifact of their own; the
authoritative artifact is the AERE Besu fork (base `hyperledger/besu:26.4.0`, gold
binary SHA-256 `7c5c0743088e9fa765d54c745814601b3c7a27a892e396156f88092b34c80772`)
and the chain history from block 9,189,161 onward.
On-chain evidence:
- **AerePQCAttestation** at `0x465d9E3b476BF98Aa1393079e240Db5D2a9bEA6A` (verbatim
from `sdk-js/src/addresses.ts`) is a permissionless, no-custody attestation
registry that verifies through the live precompiles. A real Falcon-1024 signature
(Bouncy Castle 1.83) was verified through the `0x0AE2` precompile and recorded on
mainnet: attestation tx `0xb659…9ec1`, block 9,200,542, gasUsed 692,206, status 1.
A transaction success alone proves the live precompile returned valid, because the
contract reverts `PQCVerificationFailed` otherwise.
- **AereCryptoRegistry** at `0xaE6fC596bb3eCcbf5c5D02D67B0Ef065b3Afbaa5`, a
crypto-agility registry over the five live precompiles.
- **AerePQCKeyRegistry** at `0x1eCa3c5ADcBD0b22636D8672b00faC6D89363691`
(proof-of-possession; `precompileFor(1) == 0x0ae1` confirmed on-chain), and
**AereThresholdPQCRegistry** at `0x9a6096F6FB3a7E54cF70DE12Cb3903Ae79D1C213`
(t-of-n post-quantum authorization via the precompiles).
- **EIP-2935 history contract** at `0x0000F90827F1C53a10cb7A02335B175320002935`,
deployed via the canonical keyless transaction
`0x67139a552b0d3fffc30c0fa7d0c20d42144138c8fe07fc5691f09c1cce632e15` (mined at
block 9,182,379, status 1); `eth_getCode` returns the canonical Pectra runtime,
which encodes the 8191-block (`0x1fff`) ring buffer.
All addresses above are copied verbatim from `sdk-js/src/addresses.ts`. The live
precompile band, its activation block, and the EIP-2935 window are verifiable on
`https://rpc.aere.network` (chain ID 2800): the current head is well past block
9,189,161, `eth_getCode` at the EIP-2935 address returns the 8191-block runtime, and
the recorded Falcon-1024 attestation is retrievable at block 9,200,542. The design
and gas model are specified in `research/aip-draft-pqc-precompiles.md`; the
pure-Solidity verifier suite that the precompiles accelerate is documented in AIP-4.
## Copyright
Released to the public domain (CC0). No rights reserved.