Patches 0006 (AIP-20, native post-quantum transactions, type 0x50) and 0007 (AIP-21, per-block post-quantum finality record): the recipe now reproduces the chain-2800 fleet distribution of 2026-09-22 (wt3f12ef0d) class for class on consensus and on both AIPs, with the Apache 4(b) notice inside every modified upstream file and 20 lines of context; run-node.sh arms aere.pqtx.forkBlock=19900000 for followers of chain 2800; SPEC 2.7 and 5.3; RUN-A-NODE carries the measured record; LICENSING regenerated

This commit is contained in:
Aere Network 2026-09-23 01:28:43 +03:00
parent 54774eb719
commit 0d22adbd62
6 changed files with 6025 additions and 5 deletions

View File

@ -123,7 +123,7 @@ the section 4(b) notice of changed files), and each keeps its original notice pe
<!-- GENERAT: lista de mai jos se rescrie de unealta de licentiere din depozitul de constructie --> <!-- GENERAT: lista de mai jos se rescrie de unealta de licentiere din depozitul de constructie -->
## anchor/: every file that carries someone else's copyright (generated 2026-09-17) ## anchor/: every file that carries someone else's copyright (generated 2026-09-23)
This list is **generated from the files this package actually ships**, not written by hand: the This list is **generated from the files this package actually ships**, not written by hand: the
previous hand-written table fell behind the tree on 2026-09-12 and seven upstream files went previous hand-written table fell behind the tree on 2026-09-12 and seven upstream files went
@ -132,7 +132,7 @@ repository, and the publisher refuses to ship a package whose list disagrees wit
You do not need that tool to check the list: every row below names a file in this package, and You do not need that tool to check the list: every row below names a file in this package, and
`grep -i copyright` on it shows the same line. `grep -i copyright` on it shows the same line.
Measured 2026-09-17 over `anchor/`: **179 files**. **90** carry someone Measured 2026-09-23 over `anchor/`: **179 files**. **90** carry someone
else's copyright alone, **45** carry a shared notice naming both upstream and us, and **11** name only else's copyright alone, **45** carry a shared notice naming both upstream and us, and **11** name only
`contributors to the AERE Network`; 33 carry no copyright line at all. `contributors to the AERE Network`; 33 carry no copyright line at all.
The first two groups are the table below. A shared notice is listed too: those are precisely the The first two groups are the table below. A shared notice is listed too: those are precisely the

View File

@ -150,8 +150,9 @@ The anchor ships in this repository both as source, under `anchor/`, and as
`patches/0003-aere-pq-anchor.patch`. A node built without it has not been shown to import `patches/0003-aere-pq-anchor.patch`. A node built without it has not been shown to import
headers past block 13,014,000: the second client needed an explicit change to accept the sixth headers past block 13,014,000: the second client needed an explicit change to accept the sixth
element, and no floor-only build has been observed following the chain past that height. Apply element, and no floor-only build has been observed following the chain past that height. Apply
`0001`, `0003`, `0004` and `0005` together and treat a build missing any of them as unable to `0001`, `0003`, `0004`, `0005`, `0006` and `0007` together and treat a build missing any of them as
follow the current chain. unable to follow the current chain (from 2026-09-22 the last two are part of the recipe; see the
section on them below).
## Patch 0005 exists because the import proof was actually attempted ## Patch 0005 exists because the import proof was actually attempted
@ -188,6 +189,45 @@ has NOT yet been repeated against this revision (the last measured run is the on
previous revision). What is measured for this revision is that the same code follows the live tip on previous revision). What is measured for this revision is that the same code follows the live tip on
the network's reading nodes, and validates every hybrid anchor there, since 2026-09-05. **Revision note, 2026-09-10:** patches `0001`, `0003` and `0004` were regenerated from the production tree over the same file sets (the source files now carry the Apache-2.0 section 4(b) modification notices that production carries; `0003` keeps its 169 files). Measured the same day: a build from this recipe reproduces the fleet's three consensus jars class by class, and `LondonFeeMarket` and the precompile classes byte for byte. What the recipe still does not ship is the fleet's parallel block processor (a separate package and one hunk in `MainnetProtocolSpecs`), which does not change consensus; it is listed by the comparison, not hidden. the network's reading nodes, and validates every hybrid anchor there, since 2026-09-05. **Revision note, 2026-09-10:** patches `0001`, `0003` and `0004` were regenerated from the production tree over the same file sets (the source files now carry the Apache-2.0 section 4(b) modification notices that production carries; `0003` keeps its 169 files). Measured the same day: a build from this recipe reproduces the fleet's three consensus jars class by class, and `LondonFeeMarket` and the precompile classes byte for byte. What the recipe still does not ship is the fleet's parallel block processor (a separate package and one hunk in `MainnetProtocolSpecs`), which does not change consensus; it is listed by the comparison, not hidden.
## Patches 0006 and 0007: native post-quantum transactions and verifiable per-block finality (2026-09-22)
Since 2026-09-22 21:45Z every node of chain 2800 that validates or reads blocks runs a
distribution that carries two more Aere changes, and the recipe here carries them as
`patches/0006-aere-pq-transactions.patch` (AIP-20) and `patches/0007-aere-pq-finality.patch`
(AIP-21), generated as exact deltas over the tree that `0001+0003+0004+0005` produce.
- **0006, AIP-20.** Transaction type `0x50`, authorized by an ML-DSA (FIPS 204) signature, sender
derived from the post-quantum public key. Activation is the per-node property
`aere.pqtx.forkBlock`, which `run-node.sh` now sets to **19,900,000** for chain 2800. Below that
height the node behaves exactly as before. **From that height a node without this patch, or
without the property, rejects the first block that carries such a transaction and stops
following the chain.** That is the one reason this revision is not optional.
- **0007, AIP-21.** The JSON-RPC method `aere_getPqFinality` and the on-disk window of Falcon seals
behind it. It changes nothing about block validity, so it has no activation height; a follower
built with it answers `unavailable` for every block (it hears no seals; only validators do),
which is the honest answer, and the method exists.
Measured 2026-09-22 22:16Z: the six patches applied in order with plain `git apply` on a pristine
`d2032017` checkout (187 files changed), `./gradlew --no-daemon installDist -x spotlessJavaCheck
-x test` exited 0, and the resulting jars were compared class by class, in both directions, with
the fleet distribution running on every chain-2800 node (`wt3f12ef0d`): 3,503 classes in the
public build, 3,529 in the fleet; nothing only in the public build; **every consensus class and
every AIP-20/21 class has identical code** (`javap -p -c` on each pair whose bytes differ). Of the
44 classes whose bytes differ, 38 differ only in their line-number table, because the public
patches carry the Apache 4(b) modification notice at the top of each modified upstream file and
the fleet build of 22 September does not yet; the other 6 are the same known non-consensus
differences the recipe carried before this revision: the Block-STM wiring hunk in
`MainnetProtocolSpecs` (its 26 classes exist only in the fleet, as an optional parallel processor)
and five RPC read-path classes (`EthGetBalance`, `EthGetCode`, `EthGetStorageAt`,
`EthGetTransactionCount`, `BlockchainQueries`: the fleet's fix for `latest` resolving to a null
state during import, 2026-09-10). None of those touches block validity; they are listed here
rather than hidden. The from-genesis import proof has NOT been repeated with this revision yet; what is
measured is that the same code follows the live tip on the network's own readers since 2026-09-22.
The Apache-2.0 section 4(b) statement for the upstream files these patches modify is in each
patch message; the in-file "Modifications Copyright" blocks for those files are deliberately not in
the delta (it is exact to the fleet sources) and enter the production sources with the next fleet
distribution.
--- ---
## Sizing the JVM heap: bigger is not faster ## Sizing the JVM heap: bigger is not faster

61
SPEC.md
View File

@ -1,6 +1,6 @@
# Aere Network chain 2800: full protocol specification # Aere Network chain 2800: full protocol specification
Version: 1.2.0, written 2026-08-25, amended 2026-09-02 (section 2.6, D8, G11), 2026-09-05 (sections 2.6 and 3.1: the message-layer arming heights, the v2 hybrid certificate, the anchor interval schedule) and 2026-09-17 (sections 2.6 and 3.1: the four enforcement heights have passed, hybrid keys are live; the "emission only" qualification is dated history). Scope: everything a third party needs to implement a client Version: 1.2.0, written 2026-08-25, amended 2026-09-02 (section 2.6, D8, G11), 2026-09-05 (sections 2.6 and 3.1: the message-layer arming heights, the v2 hybrid certificate, the anchor interval schedule) and 2026-09-17 (sections 2.6 and 3.1: the four enforcement heights have passed, hybrid keys are live; the "emission only" qualification is dated history), and 2026-09-22 (sections 2.7 and 5.3: AIP-21 verifiable per-block post-quantum finality live on chain 2800; AIP-20 native post-quantum transactions armed for height 19,900,000, patches 0006 and 0007 added to the recipe). Scope: everything a third party needs to implement a client
that follows chain 2800 from block 0 to the live head and validates what the network validates, that follows chain 2800 from block 0 to the live head and validates what the network validates,
without reading Aere source code. It specifies the follower (validation) protocol completely; it without reading Aere source code. It specifies the follower (validation) protocol completely; it
describes seal production only where a follower must understand it to validate. describes seal production only where a follower must understand it to validate.
@ -373,6 +373,40 @@ every anchor certificate is v2 since block 17,047,600 (2026-09-04). Between 2026
2026-09-08 this paragraph read "post-quantum in EMISSION only"; that was true for those days and 2026-09-08 this paragraph read "post-quantum in EMISSION only"; that was true for those days and
is history now. What remains classical is named in section 3.1. is history now. What remains classical is named in section 3.1.
### 2.7 Verifiable post-quantum finality of every block (AIP-21; live on chain 2800 since 2026-09-22)
Normative for a validator-capable build; informative for a pure follower, which answers honestly
that it has nothing to report.
- Every validator keeps the Falcon-512 seals it hears on QBFT COMMIT messages (section 2.6) in a
retention window of the last 256 heights, keyed by the canonical block hash (not by the QBFT
message digest, which carries the round and differs from the on-chain hash for any block
finalised in a round above zero; source: `patches/0007-aere-pq-finality.patch`, `PqSealCache`).
The window is persisted under `<data-path>/aere-pq-seal-window` in segments of 64 heights (frame:
`length(4 BE) || RLP[domain, chainId, height, hash, certificate] || crc32(4 BE)`), restored at
startup only for frames whose hash is the node's own canonical hash at that height and whose
seals verify now; `-Daere.pq.finality.persist=false` disables the journal.
- JSON-RPC method `aere_getPqFinality(blockParameter)` (QBFT method set; `blockParameter` is a hex
quantity or `latest`) returns, for a block in the window: `blockNumber`, `blockHash`, `quorum`
(ceil(2N/3) of the validator set at that height), `falconSealsHeard`, `falconSealsVerified` (each
seal re-verified now against the registry epoch of that height, section 3.5), `finality` in
{`post-quantum`, `partial`, `none`, `unavailable`, `unverifiable-form`}, `retentionBlocks` (256)
and a `note`. An unknown block returns `null`; a block outside the window, or any block on a node
that hears no seals (a reader, a follower), returns `unavailable`. `post-quantum` means: at least
the commit quorum of distinct validators sealed this block hash with Falcon-512 and every counted
seal verifies.
- Nothing here changes block validity, so there is no activation height and no fork: a build
without patch 0007 follows the chain exactly as before; it only lacks the method and the window.
The permanent, header-committed record remains the anchor certificate (section 3); this record is
the per-block complement, held by validators.
[MEASURED 2026-09-22 21:45Z] on chain 2800, `deploy/validators/aip2021-2026-09-22/dovedeste-aip2021-2800.sh`
(Aere repository): all nine Besu-derived validators answer `post-quantum` for head minus 16 with
`falconSealsVerified` 10 of 10 heard and `quorum` 7; the Nethermind-derived validator answers the
same verdict, hash and quorum for the same block; the two public readers answer `unavailable`.
Specification and the two-client conformance record: `aips/AIP-21.md`, `aips/aip21-conformitate/`
in the Aere repository.
--- ---
## 3. The post-quantum certificate anchor ## 3. The post-quantum certificate anchor
@ -824,6 +858,31 @@ endpoints since the floor went live.
- `--min-gas-price` is a local mempool policy, not consensus; the Foundation nodes run it at zero - `--min-gas-price` is a local mempool policy, not consensus; the Foundation nodes run it at zero
(source: `RUN-A-NODE.md`). (source: `RUN-A-NODE.md`).
### 5.3 Native post-quantum transactions, type 0x50 (AIP-20; activation height 19,900,000). Normative.
- From block **19,900,000** chain 2800 accepts EIP-2718 transaction type `0x50`. Its sender is not
recovered from a secp256k1 signature: it is derived from an ML-DSA (FIPS 204) public key carried
in the transaction, and the authorization is an ML-DSA signature over a signing pre-image that
includes the chain id (so the same key yields the same address on 28001 and 2800, and the chain
id prevents replay). Algorithm ids: 1 = ML-DSA-44, 2 = ML-DSA-65, 3 = ML-DSA-87 (source:
`patches/0006-aere-pq-transactions.patch`, `AerePqAlgorithm`; the exact RLP layout, the signing
pre-image and the 14 conformance vectors are in the same patch under
`ethereum/core/src/test/resources/aere/pqtx/`, and in `aips/AIP-20.md` in the Aere repository).
- The activation is per node, by the system property `aere.pqtx.forkBlock` (absent means never):
`run-node.sh` sets `-Daere.pqtx.forkBlock=19900000` for chain 2800. Below the height the type is
refused at the transaction pool ("not enabled until H"); a build without patch 0006 does not know
the type at all and answers `Invalid params` to such a raw transaction.
- Consequence for a follower: **a build without patch 0006, or with it but without the property, rejects
the first block that carries a type-0x50 transaction after 19,900,000 and stops following the chain.**
Apply `0001`, `0003`, `0004`, `0005`, `0006` and `0007` together.
[MEASURED 2026-09-22 21:45Z] every node that validates or reads blocks on chain 2800 (nine Besu-derived
validators, the Nethermind-derived validator, both public readers, the archive unit) runs the same
distribution with `aere.pqtx.forkBlock=19900000`; a type-0x50 vector for chain 28001 sent through the
public door is refused with `Wrong chainId` (the binary knows the type). [NOT MEASURED] as of this
revision: a block carrying a type-0x50 transaction imported by every node after 19,900,000; that
is the next dated record.
--- ---
## 6. Sync requirements: what a third-party client must implement to follow the chain ## 6. Sync requirements: what a third-party client must implement to follow the chain

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -47,6 +47,8 @@ PATCHES=(
"0003-aere-pq-anchor.patch" "0003-aere-pq-anchor.patch"
"0004-aere-basefee-floor.patch" "0004-aere-basefee-floor.patch"
"0005-aere-eip2935-futureeips.patch" "0005-aere-eip2935-futureeips.patch"
"0006-aere-pq-transactions.patch"
"0007-aere-pq-finality.patch"
) )
# --- locate self ------------------------------------------------------------------------------- # --- locate self -------------------------------------------------------------------------------
@ -269,6 +271,7 @@ export BESU_OPTS="\
-Daere.pq.chainId=2800 \ -Daere.pq.chainId=2800 \
-Daere.pq.hybridRegistry=$REG/hibrid-10.properties \ -Daere.pq.hybridRegistry=$REG/hibrid-10.properties \
-Daere.pq.schemeSchedule=17047568:falcon-512+slh-dsa-sha2-128s \ -Daere.pq.schemeSchedule=17047568:falcon-512+slh-dsa-sha2-128s \
-Daere.pqtx.forkBlock=19900000 \
-Daere.pq.anchor.minSealsCeiling=$ANCHOR_MIN_SEALS_CEILING" -Daere.pq.anchor.minSealsCeiling=$ANCHOR_MIN_SEALS_CEILING"
# <<< OPTIUNI DERIVATE # <<< OPTIUNI DERIVATE