AereZkQbftLightClient canonic = V2 0xc35A4D38 (setul viu de noua); V1 0xCaDA54FA marcat mort pentru setul viu din 9 august (D-309)
This commit is contained in:
parent
291ac716fb
commit
bc0edfe70e
@ -164,7 +164,8 @@ export const AERE_MAINNET = {
|
|||||||
AereOutboundVerifierV2: '0x08b68bd553116Dffb99E648cb764AA93930da96F', // CANONICAL outbound (AERE -> destination) zk bridge verifier. REPLACES the forgeable AereOutboundVerifier 0x8E89…074e. Admits an AERE outbound message on an SP1/Groth16 proof that the AereOutboundOutbox 0xd43F…7936 log was included in a QBFT-final block, then delivers it exactly once to the target handler. THE FIX (vs V1): the zk-interop guest was rewritten to COMMIT `validatorSetRoot` (keccak256 over the set the finality obligation was actually discharged against) and to commit `chainId` from a COMPILE-TIME CONSTANT instead of echoing the prover's input; this contract then BINDS that committed root to TRUSTED_VALIDATOR_SET_ROOT 0x5fa93ba7730cdb599fd814c0497565f320f10d808b6ed485c3e02fb1a1e2dd79 — an IMMUTABLE anchor = keccak256 over the LIVE N=7 validator set in ascending order (re-derived from qbft_getValidatorsByBlockNumber inside the deploy script, which would have aborted on mismatch before spending gas). Without that bind, `finalized==true` means only "final under a set the PROVER chose" — which is why V1 was forgeable. Also adds: MIN_SOURCE_BLOCK 9,312,565 (first block sealed by the anchored set = the anchor's validity window), an exact 288-byte publicValues length check, a non-zero-vkey constructor guard (V1 could be deployed with programVKey==0x0 — fail-closed but a trap), a code-less-verifier guard, and exactly-once replay by messageId. PROGRAM_VKEY 0x00a71f7d74d3a503326a93c88b0f6a6d3bfe4609e79959cc5cad56a0d5f208d0 = the REAL vkey of the compiled zk-interop-guest ELF (sha256 0b14f9bf…c691, 363,432 bytes, SP1 6.3.1, cargo-prove 8252c29), derived deterministically via client.setup(ELF) on a dedicated non-infra prover (deleted after use) — NOT a placeholder. Deploy tx 0x03a67d48e772284c117cb23f4732209fec5ba087fa5e97e8ec98fdd462a252f0 (block 10,073,049, gas 617,696, deployer 0xbeB33D20…6465). PROVEN BOTH DIRECTIONS ON MAINNET (2026-07-17): (+) POSITIVE — a REAL Groth16 proof (356 bytes, 288-byte publicValues, selector 0x4388a21c) that a genuine AereOutboundOutbox log emitted in chain-2800 block 10,073,141 (sealed by a real 5-of-7 committed-seal quorum of the live set) is QBFT-final and included, DELIVERED via deliver() tx 0xc27f09365e9bbeb37225bc42d1fc194228326f57352d1c8842159fb7f5a62b2b (block 10,074,980, gas 471,507, far under the EIP-7825 2^24 cap): deliveryCount 0 -> 1, delivered[0x759ce49f…a927]==true, and AereOutboundDeliveryRecorder recorded the payload. (-) ATTACK REJECTED — a REAL Groth16 proof over a FORGED header (7 attacker-generated keys named as the validator set, self-sealed to a 5-of-7 quorum, attacker-built receiptsRoot carrying a forged message ascribed to the real Outbox; the guest verifies it HONESTLY because the circuit cannot know which set is real) REVERTS with ValidatorSetMismatch(0x4f2c0cf7…23ee, 0x5fa93ba7…dd79) — committed attacker root != anchored root. PAIRED CONTROL: that same forged proof is ACCEPTED as cryptographically VALID by the REAL LIVE SP1VerifierGateway 0x9ca479…0628 (eth_call, V1-design vkey 0x00123374…66f5), and the V1 gate logic delivers it (test/outbound-verifier-v2-anchor-fix.test.js, 10/10) — i.e. the old design really would have minted a forged bridge message; no forgeable verifier was ever deployed live to show it. HONEST SCOPE: APPLICATION/INTEROP layer only — does NOT change or touch AERE consensus (still classical ECDSA QBFT) and is NOT post-quantum (secp256k1 seals + Groth16/BN254 wrap; falconVerified must be false and is rejected if true). TRUST-MINIMIZED, NOT TRUSTLESS: security reduces to >= 5-of-7 of AERE's QBFT validators being honest (ALL Foundation-operated, so an operator assumption, not an economic one) PLUS the pinned vkey PLUS the SP1 gateway PLUS the anchor being the right set. THE ANCHOR DOES NOT TRACK ROTATION: a validator-set change requires a fresh deployment; consumers MUST check TRUSTED_VALIDATOR_SET_ROOT still equals keccak256 over the live set before trusting this contract (treat it as an expiring credential). Immutable, no owner, no funds. [@status CANONICAL]
|
AereOutboundVerifierV2: '0x08b68bd553116Dffb99E648cb764AA93930da96F', // CANONICAL outbound (AERE -> destination) zk bridge verifier. REPLACES the forgeable AereOutboundVerifier 0x8E89…074e. Admits an AERE outbound message on an SP1/Groth16 proof that the AereOutboundOutbox 0xd43F…7936 log was included in a QBFT-final block, then delivers it exactly once to the target handler. THE FIX (vs V1): the zk-interop guest was rewritten to COMMIT `validatorSetRoot` (keccak256 over the set the finality obligation was actually discharged against) and to commit `chainId` from a COMPILE-TIME CONSTANT instead of echoing the prover's input; this contract then BINDS that committed root to TRUSTED_VALIDATOR_SET_ROOT 0x5fa93ba7730cdb599fd814c0497565f320f10d808b6ed485c3e02fb1a1e2dd79 — an IMMUTABLE anchor = keccak256 over the LIVE N=7 validator set in ascending order (re-derived from qbft_getValidatorsByBlockNumber inside the deploy script, which would have aborted on mismatch before spending gas). Without that bind, `finalized==true` means only "final under a set the PROVER chose" — which is why V1 was forgeable. Also adds: MIN_SOURCE_BLOCK 9,312,565 (first block sealed by the anchored set = the anchor's validity window), an exact 288-byte publicValues length check, a non-zero-vkey constructor guard (V1 could be deployed with programVKey==0x0 — fail-closed but a trap), a code-less-verifier guard, and exactly-once replay by messageId. PROGRAM_VKEY 0x00a71f7d74d3a503326a93c88b0f6a6d3bfe4609e79959cc5cad56a0d5f208d0 = the REAL vkey of the compiled zk-interop-guest ELF (sha256 0b14f9bf…c691, 363,432 bytes, SP1 6.3.1, cargo-prove 8252c29), derived deterministically via client.setup(ELF) on a dedicated non-infra prover (deleted after use) — NOT a placeholder. Deploy tx 0x03a67d48e772284c117cb23f4732209fec5ba087fa5e97e8ec98fdd462a252f0 (block 10,073,049, gas 617,696, deployer 0xbeB33D20…6465). PROVEN BOTH DIRECTIONS ON MAINNET (2026-07-17): (+) POSITIVE — a REAL Groth16 proof (356 bytes, 288-byte publicValues, selector 0x4388a21c) that a genuine AereOutboundOutbox log emitted in chain-2800 block 10,073,141 (sealed by a real 5-of-7 committed-seal quorum of the live set) is QBFT-final and included, DELIVERED via deliver() tx 0xc27f09365e9bbeb37225bc42d1fc194228326f57352d1c8842159fb7f5a62b2b (block 10,074,980, gas 471,507, far under the EIP-7825 2^24 cap): deliveryCount 0 -> 1, delivered[0x759ce49f…a927]==true, and AereOutboundDeliveryRecorder recorded the payload. (-) ATTACK REJECTED — a REAL Groth16 proof over a FORGED header (7 attacker-generated keys named as the validator set, self-sealed to a 5-of-7 quorum, attacker-built receiptsRoot carrying a forged message ascribed to the real Outbox; the guest verifies it HONESTLY because the circuit cannot know which set is real) REVERTS with ValidatorSetMismatch(0x4f2c0cf7…23ee, 0x5fa93ba7…dd79) — committed attacker root != anchored root. PAIRED CONTROL: that same forged proof is ACCEPTED as cryptographically VALID by the REAL LIVE SP1VerifierGateway 0x9ca479…0628 (eth_call, V1-design vkey 0x00123374…66f5), and the V1 gate logic delivers it (test/outbound-verifier-v2-anchor-fix.test.js, 10/10) — i.e. the old design really would have minted a forged bridge message; no forgeable verifier was ever deployed live to show it. HONEST SCOPE: APPLICATION/INTEROP layer only — does NOT change or touch AERE consensus (still classical ECDSA QBFT) and is NOT post-quantum (secp256k1 seals + Groth16/BN254 wrap; falconVerified must be false and is rejected if true). TRUST-MINIMIZED, NOT TRUSTLESS: security reduces to >= 5-of-7 of AERE's QBFT validators being honest (ALL Foundation-operated, so an operator assumption, not an economic one) PLUS the pinned vkey PLUS the SP1 gateway PLUS the anchor being the right set. THE ANCHOR DOES NOT TRACK ROTATION: a validator-set change requires a fresh deployment; consumers MUST check TRUSTED_VALIDATOR_SET_ROOT still equals keccak256 over the live set before trusting this contract (treat it as an expiring credential). Immutable, no owner, no funds. [@status CANONICAL]
|
||||||
AereOutboundDeliveryRecorder: '0x98fa803a58e6B4A726C1d783eA91f06826226813', // The demonstration delivery target for AereOutboundVerifierV2 — records each delivered message so the outbound loop is auditable end-to-end on chain. Deploy tx 0x4e68736b15ae81cc1cd7ae98a635fb2e4f0a6d0be1ede38dfa57cc098cbe1f9f (block 10,073,047, gas 368,519). DELIBERATELY UNAUTHENTICATED: anyone can call handleAereMessage directly and record an arbitrary entry, so its contents are NOT evidence of a proven message — the trust-minimised guarantee lives in the verifier, not here. A REAL application handler MUST gate on msg.sender == the verifier. No owner, no funds. [@status CANONICAL]
|
AereOutboundDeliveryRecorder: '0x98fa803a58e6B4A726C1d783eA91f06826226813', // The demonstration delivery target for AereOutboundVerifierV2 — records each delivered message so the outbound loop is auditable end-to-end on chain. Deploy tx 0x4e68736b15ae81cc1cd7ae98a635fb2e4f0a6d0be1ede38dfa57cc098cbe1f9f (block 10,073,047, gas 368,519). DELIBERATELY UNAUTHENTICATED: anyone can call handleAereMessage directly and record an arbitrary entry, so its contents are NOT evidence of a proven message — the trust-minimised guarantee lives in the verifier, not here. A REAL application handler MUST gate on msg.sender == the verifier. No owner, no funds. [@status CANONICAL]
|
||||||
// ── CANONICAL outbound zk QBFT light client — 7-SET ANCHORED (deployed 2026-07-16) ──
|
// ── CANONICAL outbound zk QBFT light client — 7-SET ANCHORED (deployed 2026-07-16) ──
|
||||||
AereZkQbftLightClient: '0xCaDA54FAb6E7AE311d240Cf0C2Df45e974156488', // CANONICAL. Outbound direction of AERE's zk light-client stack: ANY external chain/verifier can advance a trust-minimized view of AERE's OWN QBFT finality via processProof(publicValues, proof) — a permissionless ~313k-gas SP1 Groth16 verify through the live SP1VerifierGateway 0x9ca479…0628 (route 0x4388a21c -> SP1VerifierGroth16 v6.1.0 0xb5456d48…71aD), binding blockHash/blockNumber/committedSealHash/validatorSetRoot/finalized/falconVerified to a fixed anchor and requiring blockNumber to STRICTLY advance. REPLACES 0xc9A2…B1c2, which is permanently frozen at a STALE N=3 anchor (see DEPRECATED entry below). Deploy tx 0xb3b0f8f5dfd121370874e6c7baea96b107be8305e1805f60ba26e7acb60eeae4 (block 9,991,201, gas 502,790, deployer 0xbeB33D20…6465). PROGRAM_VKEY 0x00c802837538e13424d93e43ac4b9d8005d23f62359317096c40d43d5ab7adc1 = the REAL vkey of the compiled qbft-lightclient-guest ELF (sha256 e8aa1369…9dba, SP1 6.3.1, cargo-prove 8252c29), derived deterministically from the ELF on a dedicated non-infra prover — NOT a placeholder. trustedValidatorSetRoot 0x5fa93ba7730cdb599fd814c0497565f320f10d808b6ed485c3e02fb1a1e2dd79 = keccak256 over the LIVE N=7 validator set in ascending order, independently reproduced three ways (node from qbft_getValidatorsByBlockNumber at 'latest' AND at the bootstrap block, and by the Rust guest/host) and re-verified against the live chain inside the deploy script before it spent gas. Weakly-subjective bootstrap = block 9,312,565 (0xdbb9ee56…f474) = the FIRST block sealed by this 7-set (N=6 at 9,312,564), i.e. the honest start of the anchor's validity window. PROVEN END-TO-END ON-CHAIN (2026-07-16): a REAL SP1 Groth16 proof (356 bytes, selector 0x4388a21c) that chain-2800 block 9,989,005 carries a valid 5-of-7 (2f+1, quorum=ceil(2*7/3)) ECDSA committed-seal quorum under the live set was generated on a dedicated non-infra Hetzner box (deleted after use) and submitted via processProof tx 0xc606be93490b9944b16c6f1743fd9ed3de046765831d84ec904fdd95a5102903 (block 9,991,732, gasUsed 313,462 — far under the EIP-7825 2^24 cap): finalizedNumber ADVANCED 9,312,565 -> 9,989,005, finalizedBlockHash = 0x0c787718…77f0 (== the real chain hash of 9,989,005, cross-checked via eth_getBlockByNumber), updateCount 0 -> 1. Tamper-reject verified live: tampered proof, tampered publicValues, a stale-N=3-anchor publicValues, and a replay of the same proof ALL revert. HONEST SCOPE: this is an APPLICATION/INTEROP-layer contract — it does NOT change or touch AERE consensus (still classical ECDSA QBFT) and is NOT post-quantum (secp256k1 seals + Groth16/BN254 wrap; falconVerified is recorded but never required and is false). TRUST-MINIMIZED, NOT TRUSTLESS: security reduces to >= 5-of-7 of AERE's QBFT validators being honest (ALL Foundation-operated today, so this is an operator assumption, not an economic one) PLUS the pinned vkey PLUS the SP1 gateway PLUS the immutable validator-set anchor. The anchor does NOT track rotation: a future validator-set change requires a fresh deployment (this redeploy is exactly that event happening). Advancing is permissionless but not automatic — the head moves only when someone submits a proof. No owner, no funds. [@status CANONICAL]
|
AereZkQbftLightClient: '0xc35A4D3828Af3fBD36c791EB1ca4B72C6Eb20384', // CANONICAL since 2026-09-02 (D-309): AereZkQbftLightClientV2, IMMUTABLY anchored to the LIVE nine-validator set (trustedValidatorSetRoot 0x1cd37f04…efd9 = keccak256 of the nine addresses, ascending); one proof processed on chain (finalizedNumber 13124151, updateCount 1, that proof's Falcon flag false). Still a fixed-set anchor: the next validator-set change will strand it too (D-312), until a set-transition light client exists.
|
||||||
|
AereZkQbftLightClient_v1_SEVEN_SET_ANCHOR_DEAD_SINCE_2026_08_09: '0xCaDA54FAb6E7AE311d240Cf0C2Df45e974156488', // NOT USABLE FOR THE LIVE SET: immutable trustedValidatorSetRoot = keccak256 of the July SEVEN-validator set; since the set grew to nine on 2026-08-09 every proof for the live set reverts with ValidatorSetMismatch. Kept for history. Original note: CANONICAL. Outbound direction of AERE's zk light-client stack: ANY external chain/verifier can advance a trust-minimized view of AERE's OWN QBFT finality via processProof(publicValues, proof) — a permissionless ~313k-gas SP1 Groth16 verify through the live SP1VerifierGateway 0x9ca479…0628 (route 0x4388a21c -> SP1VerifierGroth16 v6.1.0 0xb5456d48…71aD), binding blockHash/blockNumber/committedSealHash/validatorSetRoot/finalized/falconVerified to a fixed anchor and requiring blockNumber to STRICTLY advance. REPLACES 0xc9A2…B1c2, which is permanently frozen at a STALE N=3 anchor (see DEPRECATED entry below). Deploy tx 0xb3b0f8f5dfd121370874e6c7baea96b107be8305e1805f60ba26e7acb60eeae4 (block 9,991,201, gas 502,790, deployer 0xbeB33D20…6465). PROGRAM_VKEY 0x00c802837538e13424d93e43ac4b9d8005d23f62359317096c40d43d5ab7adc1 = the REAL vkey of the compiled qbft-lightclient-guest ELF (sha256 e8aa1369…9dba, SP1 6.3.1, cargo-prove 8252c29), derived deterministically from the ELF on a dedicated non-infra prover — NOT a placeholder. trustedValidatorSetRoot 0x5fa93ba7730cdb599fd814c0497565f320f10d808b6ed485c3e02fb1a1e2dd79 = keccak256 over the LIVE N=7 validator set in ascending order, independently reproduced three ways (node from qbft_getValidatorsByBlockNumber at 'latest' AND at the bootstrap block, and by the Rust guest/host) and re-verified against the live chain inside the deploy script before it spent gas. Weakly-subjective bootstrap = block 9,312,565 (0xdbb9ee56…f474) = the FIRST block sealed by this 7-set (N=6 at 9,312,564), i.e. the honest start of the anchor's validity window. PROVEN END-TO-END ON-CHAIN (2026-07-16): a REAL SP1 Groth16 proof (356 bytes, selector 0x4388a21c) that chain-2800 block 9,989,005 carries a valid 5-of-7 (2f+1, quorum=ceil(2*7/3)) ECDSA committed-seal quorum under the live set was generated on a dedicated non-infra Hetzner box (deleted after use) and submitted via processProof tx 0xc606be93490b9944b16c6f1743fd9ed3de046765831d84ec904fdd95a5102903 (block 9,991,732, gasUsed 313,462 — far under the EIP-7825 2^24 cap): finalizedNumber ADVANCED 9,312,565 -> 9,989,005, finalizedBlockHash = 0x0c787718…77f0 (== the real chain hash of 9,989,005, cross-checked via eth_getBlockByNumber), updateCount 0 -> 1. Tamper-reject verified live: tampered proof, tampered publicValues, a stale-N=3-anchor publicValues, and a replay of the same proof ALL revert. HONEST SCOPE: this is an APPLICATION/INTEROP-layer contract — it does NOT change or touch AERE consensus (still classical ECDSA QBFT) and is NOT post-quantum (secp256k1 seals + Groth16/BN254 wrap; falconVerified is recorded but never required and is false). TRUST-MINIMIZED, NOT TRUSTLESS: security reduces to >= 5-of-7 of AERE's QBFT validators being honest (ALL Foundation-operated today, so this is an operator assumption, not an economic one) PLUS the pinned vkey PLUS the SP1 gateway PLUS the immutable validator-set anchor. The anchor does NOT track rotation: a future validator-set change requires a fresh deployment (this redeploy is exactly that event happening). Advancing is permissionless but not automatic — the head moves only when someone submits a proof. No owner, no funds. [@status CANONICAL]
|
||||||
AereZkQbftLightClient_DEPRECATED_STALE_ANCHOR: '0xc9A2DCaeD0Ceb2B400Dd705a75cbabEBf5aBB1c2', // DEPRECATED — STALE ANCHOR, DO NOT USE AS A LIVE FINALITY ORACLE. Same contract code, but its IMMUTABLE trustedValidatorSetRoot is 0x694a716bc7af1e5e7939cc03c5f7e6e9d32f388d4805d54ee9787903d898dc2f = the HISTORICAL N=3 set (0x4bf6…0044 / 0xb5e7…c2a8 / 0xf73b…c00d), reproduced exactly on 2026-07-16 as keccak256 of those three addresses in that order. The live set became N=7 at block 9,312,565, so this client can NEVER verify a header sealed by the current set: the guest commits validatorSetRoot over the real set and processProof reverts with ValidatorSetMismatch. Verified live 2026-07-16 via eth_call on https://rpc.aere.network: finalizedNumber() = 9,241,622, finalizedBlockHash() = 0x00e9cda8…6f63 (== the REAL chain hash of block 9,241,622, cross-checked), updateCount() = 1, PROGRAM_VKEY() = 0x002c6293…71f2, SP1_VERIFIER() = 0x9ca479…0628. That single advance WAS backed by a real Groth16 proof (the gateway's 0x4388a21c route points at the real SP1VerifierGroth16 v6.1.0 and processProof reverts on any verify failure, so no advance is possible without one), and block 9,241,622 was itself sealed under the N=3 set — self-consistent. But it is FROZEN at that historical head (~750k blocks behind), tracks a validator set that no longer exists, and is superseded by 0xCaDA54FA…6488. Left on-chain (immutable, no owner, no funds, harmless). Note: its PROGRAM_VKEY 0x002c6293…71f2 was NOT reproducible from a clean 2026-07-16 rebuild of the same guest source (a fresh build yields 0x00c80283…adc1) — SP1 ELFs are not byte-reproducible across toolchain/dependency-resolution differences, so the old vkey's provenance cannot be independently re-derived today; the new deployment's vkey CAN be, and was proven end-to-end. [@status DEPRECATED @reason immutable-anchor-frozen-at-historical-n3-set @replacement AereZkQbftLightClient]
|
AereZkQbftLightClient_DEPRECATED_STALE_ANCHOR: '0xc9A2DCaeD0Ceb2B400Dd705a75cbabEBf5aBB1c2', // DEPRECATED — STALE ANCHOR, DO NOT USE AS A LIVE FINALITY ORACLE. Same contract code, but its IMMUTABLE trustedValidatorSetRoot is 0x694a716bc7af1e5e7939cc03c5f7e6e9d32f388d4805d54ee9787903d898dc2f = the HISTORICAL N=3 set (0x4bf6…0044 / 0xb5e7…c2a8 / 0xf73b…c00d), reproduced exactly on 2026-07-16 as keccak256 of those three addresses in that order. The live set became N=7 at block 9,312,565, so this client can NEVER verify a header sealed by the current set: the guest commits validatorSetRoot over the real set and processProof reverts with ValidatorSetMismatch. Verified live 2026-07-16 via eth_call on https://rpc.aere.network: finalizedNumber() = 9,241,622, finalizedBlockHash() = 0x00e9cda8…6f63 (== the REAL chain hash of block 9,241,622, cross-checked), updateCount() = 1, PROGRAM_VKEY() = 0x002c6293…71f2, SP1_VERIFIER() = 0x9ca479…0628. That single advance WAS backed by a real Groth16 proof (the gateway's 0x4388a21c route points at the real SP1VerifierGroth16 v6.1.0 and processProof reverts on any verify failure, so no advance is possible without one), and block 9,241,622 was itself sealed under the N=3 set — self-consistent. But it is FROZEN at that historical head (~750k blocks behind), tracks a validator set that no longer exists, and is superseded by 0xCaDA54FA…6488. Left on-chain (immutable, no owner, no funds, harmless). Note: its PROGRAM_VKEY 0x002c6293…71f2 was NOT reproducible from a clean 2026-07-16 rebuild of the same guest source (a fresh build yields 0x00c80283…adc1) — SP1 ELFs are not byte-reproducible across toolchain/dependency-resolution differences, so the old vkey's provenance cannot be independently re-derived today; the new deployment's vkey CAN be, and was proven end-to-end. [@status DEPRECATED @reason immutable-anchor-frozen-at-historical-n3-set @replacement AereZkQbftLightClient]
|
||||||
AereCompliancePoolSP1Verifier: '0xE2D3fa91b680E835c971761ba75Fde0204AEF95E', // vkey 0x00aa183a…. [@status CANONICAL]
|
AereCompliancePoolSP1Verifier: '0xE2D3fa91b680E835c971761ba75Fde0204AEF95E', // vkey 0x00aa183a…. [@status CANONICAL]
|
||||||
AereAIProof: '0xFf92c669AbF4C1DAE31eBFCC017764036d9D97e6', // [@status CANONICAL]
|
AereAIProof: '0xFf92c669AbF4C1DAE31eBFCC017764036d9D97e6', // [@status CANONICAL]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user