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:
parent
54774eb719
commit
0d22adbd62
@ -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 -->
|
||||
|
||||
## 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
|
||||
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
|
||||
`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
|
||||
`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
|
||||
|
||||
@ -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
|
||||
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
|
||||
`0001`, `0003`, `0004` and `0005` together and treat a build missing any of them as unable to
|
||||
follow the current chain.
|
||||
`0001`, `0003`, `0004`, `0005`, `0006` and `0007` together and treat a build missing any of them as
|
||||
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
|
||||
|
||||
@ -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
|
||||
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
|
||||
|
||||
61
SPEC.md
61
SPEC.md
@ -1,6 +1,6 @@
|
||||
# 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,
|
||||
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.
|
||||
@ -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
|
||||
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
|
||||
@ -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
|
||||
(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
|
||||
|
||||
3853
patches/0006-aere-pq-transactions.patch
Normal file
3853
patches/0006-aere-pq-transactions.patch
Normal file
File diff suppressed because one or more lines are too long
2065
patches/0007-aere-pq-finality.patch
Normal file
2065
patches/0007-aere-pq-finality.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -47,6 +47,8 @@ PATCHES=(
|
||||
"0003-aere-pq-anchor.patch"
|
||||
"0004-aere-basefee-floor.patch"
|
||||
"0005-aere-eip2935-futureeips.patch"
|
||||
"0006-aere-pq-transactions.patch"
|
||||
"0007-aere-pq-finality.patch"
|
||||
)
|
||||
|
||||
# --- locate self -------------------------------------------------------------------------------
|
||||
@ -269,6 +271,7 @@ export BESU_OPTS="\
|
||||
-Daere.pq.chainId=2800 \
|
||||
-Daere.pq.hybridRegistry=$REG/hibrid-10.properties \
|
||||
-Daere.pq.schemeSchedule=17047568:falcon-512+slh-dsa-sha2-128s \
|
||||
-Daere.pqtx.forkBlock=19900000 \
|
||||
-Daere.pq.anchor.minSealsCeiling=$ANCHOR_MIN_SEALS_CEILING"
|
||||
# <<< OPTIUNI DERIVATE
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user