Prover/beta v2 release (#1043)

* bump to beta v2.1-rc16

* add a prover config file for devnet

* update srs url

* bump constraints to cbc6bcb and go-corset to v1.1.1

* use go-corset v1.1.1

* use go-corset v1.1.3

* feat(state-manager): insertion and ephemeral filters .

* chores(versions): align the constraints version

* chores(version): align the corset version

* chores(version): update the zkevm.bin

* chores(version): update the zkevm.bin

* fix(limits): removes discrepancy between the sepolia and the mainnet config file

* chores(release): update the verifier contracts

* testing(contract): updates the post-release testdata

* chores(contracts): update the contracts

* chores(constraints): updates constraints and corset to use the right value

* chores(mod): updates the corset dependency and zkevm.bin

* testing(contract): updates the testdata

* chores(config): update the sample config to use the right version

---------

Co-authored-by: gusiri <dreamerty@postech.ac.kr>
Co-authored-by: Bogdan Ursu <bogdanursuoffice@gmail.com>
This commit is contained in:
AlexandreBelling
2025-05-26 15:03:43 +02:00
committed by GitHub
parent f113d49580
commit 05d14d8df7
15 changed files with 442 additions and 189 deletions

View File

@@ -43,10 +43,10 @@ contract PlonkVerifierMainnetFull {
uint256 private constant VK_INV_DOMAIN_SIZE =
21888242219518804655518433051623070663413851959604507555939307129453691614729;
uint256 private constant VK_OMEGA = 19200870435978225707111062059747084165650991997241425080699860725083300967194;
uint256 private constant VK_QL_COM_X = 16763721632302187064245116535318993406793422693670709276397395043117985043396;
uint256 private constant VK_QL_COM_Y = 21704519434294991344748680408475309717320132372621249588391334885901175870089;
uint256 private constant VK_QR_COM_X = 4659174267124804103032945565127374540672993228651562455767923366230378925207;
uint256 private constant VK_QR_COM_Y = 10075466426568401715266713487428009727978964696508926491453956484207585528204;
uint256 private constant VK_QL_COM_X = 19140160744730932168843702983189796718246703028852332924599880595140340744294;
uint256 private constant VK_QL_COM_Y = 16186514129294932389859278650990364364369281954479520668556508665052023533527;
uint256 private constant VK_QR_COM_X = 19941542879445624812979727787710043915366017402350479530185724916143710325553;
uint256 private constant VK_QR_COM_Y = 7601250913608609305104269620204410936660457632846454493447045082466166696693;
uint256 private constant VK_QM_COM_X = 5553410513240938543232634851474389708189012141911611575921923499176928976035;
uint256 private constant VK_QM_COM_Y = 21267989559503205894532435033155162591528358593663117280327683708498106399392;
uint256 private constant VK_QO_COM_X = 13140407506194185536762256003490074009791461766528862809770970563406607579309;

View File

@@ -43,10 +43,10 @@ contract PlonkVerifierSepoliaFull {
uint256 private constant VK_INV_DOMAIN_SIZE =
21888242219518804655518433051623070663413851959604507555939307129453691614729;
uint256 private constant VK_OMEGA = 19200870435978225707111062059747084165650991997241425080699860725083300967194;
uint256 private constant VK_QL_COM_X = 3511624111547342756712450888649315655574299737071572931449186092917508751115;
uint256 private constant VK_QL_COM_Y = 4450925408361574070118070087893406410804142563998631907603248600269055878587;
uint256 private constant VK_QR_COM_X = 16811709085260881363700682541955322953859105829393419176289064014786813158854;
uint256 private constant VK_QR_COM_Y = 12615843206799133624845320265059938705761455976479029844654559305921656138535;
uint256 private constant VK_QL_COM_X = 15582055358398575274260084414301435523487074126491256668699193658331738500814;
uint256 private constant VK_QL_COM_Y = 296011539922014006856424812425425139435424569757635039765507738877437690528;
uint256 private constant VK_QR_COM_X = 9395841435160250695501254616439674208546449862664033280720259728433672759330;
uint256 private constant VK_QR_COM_Y = 10693368561927368724840503813958338497457185198111248652756192647263040471483;
uint256 private constant VK_QM_COM_X = 5553410513240938543232634851474389708189012141911611575921923499176928976035;
uint256 private constant VK_QM_COM_Y = 21267989559503205894532435033155162591528358593663117280327683708498106399392;
uint256 private constant VK_QO_COM_X = 13140407506194185536762256003490074009791461766528862809770970563406607579309;

View File

@@ -1,44 +1,45 @@
{
"finalShnarf": "0xc6bd71cc98f5ff2c1efffaf749b13cf7d1b13b86f9b4074da60079cab9c7f068",
"parentAggregationFinalShnarf": "0x34e6f29838a27a3621773b58efc778ada8ad0626a660f8bbcf7f2315f97fcd14",
"aggregatedProof": "0x1a1fc4101b83d093cb5547d909c1de5464f3b2aa12b2040f8de33f8358caf0c71a7b6177c2d2010dec09541eea7c665c2dabd0c0005fde862917bef43de1dd1625798f450eaf4a8271fefdb762a0a2d0113fadea8190181ee9040dcd4dccdc8c29f40f06b1ae60df4fa1f1f4f0f67035b82695699d79f596fc17c2fad7f6d4ac2b6fe21cfe8922f83cb6d05e9012a9c85dd0f30cf82a4af885e47abc028ee7990f19363737210b70a91017c118103bfe83990176bd747fbb149ed28c08d8567d171a871a47a566aba5d9353d0be6d589da4951ee8ed9a104d93e2c5d3cc8aa3e05eec8e44d1e2abbe355fe500acdb50855488c3ba59019d3b77fb9eaae5cb3b0035c8f14e2d7cb10f3d5892f34bd9193939688907935cacc2d383b35e869539321fd9227aebb4f87d6efc10edb7e72a5b6ac890bbacbaaea056f24e8d5e009151f2dfa8e346da714c2b4b785927ddb2f830d128f1edc9085c88ea9d5bfe040d508eeb8d3b149418e416b8ac03db1c3e652e0d7be0cdc3da2cb6a5d1caa6b80522e41edd4eef3aa3632f55da78d32f2573cc7892ca77b166cf20ccd39635b195a1e280a8b26642df465cdedfecdef416ec62316cca8f52d93031c86aa2787381f02a80cc97178727fc8b7779f721f250b6ce1930ffa615662e479c7e89eb2abc025ef2e00672d93a85554c562cf5fe3861d106d9d2f7769c0ff79196b970541722953e7411257e826e9be62d67fbe7540256ace84998201bc0b1f81d74d1b77a125e05509651dacb90bd5ee7a6aceeb3bcdfe422b48dfdd807847dda2c0bbc3491bd05ee349d2c78219fcdbaa489545c5c5d11af4b30685c1b06ad20e9eaad93b28074bb7b1d3173275347e537c0672b021c334cb4a3e568f55f6154afff733ab27ade7044f6ef43b2de54592ba27035e25844c2e550f4957858ef614c61c0900236d40a58ee0edd904eb1527b02d8c01a43c55507909a5e5c9c2465a5cad7db10f34aa8a2626310c93d8f17253ceda8f259b4fe71bc03621564c49ce86c718e21fe96f4fd599ae79574de2fff3ba8d5e9549fc433f7c2134d2cdfc6989e7f34e2d02d93ddeb0ba05dc56c31ae36f5ef59b88db465a1c5793ee063b091bb64a231c3c95a3dcdb9e08b1b274aeab2e61bb33525e2d091d8070f71cdb7edcb256131a6b96a605dcca291ff285568ad2a63c992d63f0b1aaea1245e0c7677378ce25",
"aggregatedProverVersion": "5.0.2",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x183bc76cd3a4282e86cc93d62b2b2527bdbcd60f3c13b32ed599f2e8bb9bfc65",
"dataHashes": [
"0x019e44b475cf05ca347516891e17260dff2412275509aef778c024a497c7e2a4",
"0x01fa1a8d120e026e6377cdfb9632bbd68456bf2ecc23af50450d20a7c01dc41a",
"0x01d162e6ecf3bcf28ae4f881c333477b00353b17bcb31b8f3334b1a9acafd8a1",
"0x01d715d0e82b6e86a879eac16ace09a1e94b96931b630c4356bd10df0f00a6c9",
"0x019a910e87c05baa04238585af6060788328470fb4593acba1f2ce9e19222600",
"0x01330f4997c36a73900d0e9342ad51824995229fa51c7a6b5c9ddf9281fe5716",
"0x018272c603f97c2033c4b30f52d87a896f0787580a61be50b116ee66bc2619e4",
"0x018a4625acdc76c4545068a3e7e57a10e7106b7ed811bcb2eed76b946cb28047",
"0x0184a7ce85f4f376e7abde1640680cfaf9f90b6b6466e5c3ada9850ecf65fdd7",
"0x010621dcac35228ed31399e848dc2f1219ff8df85c86212004a37870890309b9",
"0x01c1ff87d5e8189b456513f40da2f35843ec4349aca460f499b1d1660a0bde4e",
"0x01c491ac4c44bf3f3ca3dce3eb538314de834003d7065ae75f438957bca3f54d",
"0x018d54800edc45d622454c6237624842de3f278642cce52ed67f5484b008f7ba",
"0x01a03ddeb3bca9a6f2e8c840111982fccf41eae9e9658c918a79c89cfd86dbab",
"0x01d32e99f8f2b1c8bff3146a2a1436dca70d5671bdf19ead3abdaacf64ee6b56",
"0x01732fdd98bc572032135ba9aeaf293b0f8066d51ca33bbf2369e68bcad587e0",
"0x01a3013d06d4cdbf3be3010ef1c1277b57acfcf4471e54313e5834319af4fd42",
"0x0122304911d6cd6d501b4ee49c5703cfd4bd06669c81fda2cf7b840cd940780d",
"0x017a3f3a158e514c2054803f510fb3eeaaa010e3f76fd6b58c2fc31296d42723",
"0x019213dfa9c3ad91bf7e3ba15296e06e4128a476234cf876dd5ae6fd0cbc566e",
"0x01b789c8b27d3c02656ed95117e1efa39f4a5a0e312200b7a2ae7c7b7a1f149a"
],
"dataParentHash": "0x0103e5484c3b431ba5b51cd097739a8da2a37d97bff0b9a932739369d02a57a8",
"parentStateRootHash": "0x00f63f481879c7682c1eacfcca3626e0e9b3bc26d38d734925c2706c4d6fd2ac",
"parentAggregationLastBlockTimestamp": 1744196722,
"lastFinalizedBlockNumber": 17865637,
"finalTimestamp": 1744196953,
"finalBlockNumber": 17865747,
"l1RollingHash": "0x14b1f596bf51d4cfcaf194c498f53c40a94bcebddb5a892c52c3fc5e713c46ed",
"l1RollingHashMessageNumber": 737506,
"l2MerkleRoots": [],
"l2MerkleTreesDepth": 5,
"l2MessagingBlocksOffsets": "0x",
"parentAggregationLastL1RollingHash": "0x14b1f596bf51d4cfcaf194c498f53c40a94bcebddb5a892c52c3fc5e713c46ed",
"parentAggregationLastL1RollingHashMessageNumber": 737506
}
"finalShnarf": "0xc6bd71cc98f5ff2c1efffaf749b13cf7d1b13b86f9b4074da60079cab9c7f068",
"parentAggregationFinalShnarf": "0x34e6f29838a27a3621773b58efc778ada8ad0626a660f8bbcf7f2315f97fcd14",
"aggregatedProof": "0x01c926f5b24d874914acc6f0e7fae09e8d501954babe9ac2fe464063c0d33f9e178c1b3c59e35d29c39177cac3b1ed24b7e7cc9177668f9e1016b825a4cef4b70dd0c38b4e59b5c4fe7b2d6489687d37391513faed34ccb49c4c10b363f0100418f68607cf7f36558c041c0b8462c965e779681d88c5ca34ca64607273bfb9c507f8620bdfa21cf9379037e4044960de08eddc8e9cdafe26d876e5881f1e5e020629359a34f913d93670f204ee7317c087fa40213d8e10a6efdd91c7af5b6a8407c6206273b1a51565b02c306596a9d5ea4af51c526fe080a2f2cb218412d37927ee9a212add17fd9318340ddba99e808dc44bc8ed8742e4053a36e7a1e15d161ade19122fad1910150da410dcc499b6887ed950558c3a551c4aa5ef3a9bf87a245a8300946a410bb4d9ba61a1892b0d96084de11c446994f3b8c94962fa8fb6016b4cefe5b0d83c2eb7fe02f58bdca601ff3960fd33b4b44d4aa19797da203b2c0628d7957b943d2068c8ef5110c91cc10286a0f86c16378d5a43cda6bf1d1f09183891002ee7fe16d63097dc2658fddc3e91dfd2cd8db82d21c503e21b20bb1c09748909982bba093f69392a59e0fe0e6589466a9e7412fc65763d69e084222e3304ed34c7c2da52bcb897ff3a8dabf5ca3fa0578b451c219bc6d3014f22cd2ecb244c8b48c238c6c6dbbf8232ff63cf154fc0693e9c39fa3509503e3e22ff0f23060b21f1ad7e06fdb0a570483bfd84512e96bd9cf9100d6148024dbb55320dea365dda3504f07ce1af4d08214930ffae3fcf1840814d71babaeac99acad81c299bd777664fadba91032308bfcdc9acdd2f9c61c7c0e753006679f703923509072dc5cbd7bda93ad5b0924e687698adaff00d6cd82f283174c7df19a504c82b7aabc2f4f3ca9ed1e6b03a00a819230acb87ad6edca48b048e88fbc23fc6df0747e577bdda59a8397a1d05a5c0fb418d801e7df1f7f58ce504086628ecb58b04350fa4e329ade9589507bec1ac48e2c655142a8d49bab3f07e4c4e15c4bd681db481af72d8ff5c3199c6226c9b1e181c76775525f5ccd865a7f2103a81271a042abe387b143be70dedda3bf6ecfc4fa276170c6c3e25d73e66d86a6cecd49404b61401ad15c8fb8724ef6578cd2dd7b1f8bf59b00e325ff5499c02a7d089ec2b31f528834f880efc61289609b506a0f3123d471ce279c3cb3f18a958b3349e",
"aggregatedProverVersion": "5.1.1",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x183bc76cd3a4282e86cc93d62b2b2527bdbcd60f3c13b32ed599f2e8bb9bfc65",
"dataHashes": [
"0x019e44b475cf05ca347516891e17260dff2412275509aef778c024a497c7e2a4",
"0x01fa1a8d120e026e6377cdfb9632bbd68456bf2ecc23af50450d20a7c01dc41a",
"0x01d162e6ecf3bcf28ae4f881c333477b00353b17bcb31b8f3334b1a9acafd8a1",
"0x01d715d0e82b6e86a879eac16ace09a1e94b96931b630c4356bd10df0f00a6c9",
"0x019a910e87c05baa04238585af6060788328470fb4593acba1f2ce9e19222600",
"0x01330f4997c36a73900d0e9342ad51824995229fa51c7a6b5c9ddf9281fe5716",
"0x018272c603f97c2033c4b30f52d87a896f0787580a61be50b116ee66bc2619e4",
"0x018a4625acdc76c4545068a3e7e57a10e7106b7ed811bcb2eed76b946cb28047",
"0x0184a7ce85f4f376e7abde1640680cfaf9f90b6b6466e5c3ada9850ecf65fdd7",
"0x010621dcac35228ed31399e848dc2f1219ff8df85c86212004a37870890309b9",
"0x01c1ff87d5e8189b456513f40da2f35843ec4349aca460f499b1d1660a0bde4e",
"0x01c491ac4c44bf3f3ca3dce3eb538314de834003d7065ae75f438957bca3f54d",
"0x018d54800edc45d622454c6237624842de3f278642cce52ed67f5484b008f7ba",
"0x01a03ddeb3bca9a6f2e8c840111982fccf41eae9e9658c918a79c89cfd86dbab",
"0x01d32e99f8f2b1c8bff3146a2a1436dca70d5671bdf19ead3abdaacf64ee6b56",
"0x01732fdd98bc572032135ba9aeaf293b0f8066d51ca33bbf2369e68bcad587e0",
"0x01a3013d06d4cdbf3be3010ef1c1277b57acfcf4471e54313e5834319af4fd42",
"0x0122304911d6cd6d501b4ee49c5703cfd4bd06669c81fda2cf7b840cd940780d",
"0x017a3f3a158e514c2054803f510fb3eeaaa010e3f76fd6b58c2fc31296d42723",
"0x019213dfa9c3ad91bf7e3ba15296e06e4128a476234cf876dd5ae6fd0cbc566e",
"0x01b789c8b27d3c02656ed95117e1efa39f4a5a0e312200b7a2ae7c7b7a1f149a"
],
"dataParentHash": "0x0103e5484c3b431ba5b51cd097739a8da2a37d97bff0b9a932739369d02a57a8",
"parentStateRootHash": "0x00f63f481879c7682c1eacfcca3626e0e9b3bc26d38d734925c2706c4d6fd2ac",
"parentAggregationLastBlockTimestamp": 1744196722,
"lastFinalizedBlockNumber": 17865637,
"finalTimestamp": 1744196953,
"finalBlockNumber": 17865747,
"l1RollingHash": "0x14b1f596bf51d4cfcaf194c498f53c40a94bcebddb5a892c52c3fc5e713c46ed",
"l1RollingHashMessageNumber": 737506,
"l2MerkleRoots": [],
"l2MerkleTreesDepth": 5,
"l2MessagingBlocksOffsets": "0x",
"parentAggregationLastL1RollingHash": "0x14b1f596bf51d4cfcaf194c498f53c40a94bcebddb5a892c52c3fc5e713c46ed",
"parentAggregationLastL1RollingHashMessageNumber": 737506
}

View File

@@ -61,7 +61,7 @@ copy-prover-assets:
aws s3 sync --exclude "*prover/dev*" --exclude "*05b9ef1*" --exclude "*05b9ef1*" --exclude "*96e3a19*" --exclude "*a9e4681*" prover-assets s3://zk-uat-prover/prover-assets/ --profile=zk-uat-s3-access
download-srs:
aws s3 sync s3://gnark-ignition/with_lines/ ./prover-assets/kzgsrs --exclude "*" --include "*.memdump"
aws s3 sync s3://prover-assets/kzgsrs/ ./prover-assets/kzgsrs --exclude "*" --include "*.memdump"
###
### Controller

View File

@@ -0,0 +1,135 @@
environment = "devnet"
version = "5.0.2" # TODO @gbotrel hunt all version definitions.
assets_dir = "./prover-assets"
log_level = 4 # TODO @gbotrel will be refactored with new logger.
[controller]
retry_delays = [0, 1]
[execution]
prover_mode = "full"
conflated_traces_dir = "./"
requests_root_dir = "./"
ignore_compatibility_check=true
[blob_decompression]
prover_mode = "full"
[aggregation]
prover_mode = "full"
requests_root_dir = "/home/ubuntu/sepolia-testing-full/prover-aggregation"
num_proofs = [10, 20, 50, 100, 200, 400]
allowed_inputs = ["execution-dummy", "execution", "execution-large", "blob-decompression-dummy", "blob-decompression-v0", "blob-decompression-v1"]
verifier_id = 0
[public_input_interconnection]
max_nb_decompression = 400
max_nb_execution = 400
max_nb_circuits = 400
execution_max_nb_msg = 16
l2_msg_merkle_depth = 5
l2_msg_max_nb_merkle = 200
[layer2]
chain_id = 59139
message_service_contract = "0x33bf916373159a8c1b54b025202517bfdbb7863d"
[traces_limits]
ADD = 524288
BIN = 262144
BLAKE_MODEXP_DATA = 16384
BLOCK_DATA = 4096
BLOCK_HASH = 512
EC_DATA = 262144
EUC = 65536
EXP = 16384
EXT = 1048576
GAS = 65536
HUB = 2097152
LOG_DATA = 65536
LOG_INFO = 4096
MMIO = 4194304
MMU = 4194304
MOD = 131072
MUL = 65536
MXP = 524288
OOB = 262144
RLP_ADDR = 4096
RLP_TXN = 131072
RLP_TXN_RCPT = 65536
ROM = 4194304
ROM_LEX = 1024
SHAKIRA_DATA = 32768
SHF = 65536
STP = 16384
TRM = 32768
TXN_DATA = 8192
WCP = 262144
PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 128
PRECOMPILE_SHA2_BLOCKS = 671
PRECOMPILE_RIPEMD_BLOCKS = 0
PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 8
PRECOMPILE_ECADD_EFFECTIVE_CALLS = 16384
PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 64
PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16
PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64
PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS = 64
PRECOMPILE_BLAKE_EFFECTIVE_CALLS = 0
PRECOMPILE_BLAKE_ROUNDS = 0
BLOCK_KECCAK = 8192
BLOCK_L1_SIZE = 1000000
BLOCK_L2_L1_LOGS = 16
BLOCK_TRANSACTIONS = 200
BIN_REFERENCE_TABLE = 262144
SHF_REFERENCE_TABLE = 4096
INSTRUCTION_DECODER = 512
[traces_limits_large]
ADD = 1048576
BIN = 524288
BLAKE_MODEXP_DATA = 32768
BLOCK_DATA = 8192
BLOCK_HASH = 1024
EC_DATA = 524288
EUC = 131072
EXP = 16384
EXT = 2097152
GAS = 131072
HUB = 4194304
LOG_DATA = 131072
LOG_INFO = 8192
MMIO = 8388608
MMU = 8388608
MOD = 262144
MUL = 131072
MXP = 1048576
OOB = 524288
RLP_ADDR = 8192
RLP_TXN = 262144
RLP_TXN_RCPT = 131072
ROM = 8388608
ROM_LEX = 2048
SHAKIRA_DATA = 65536
SHF = 131072
STP = 32768
TRM = 65536
TXN_DATA = 16384
WCP = 524288
PRECOMPILE_ECRECOVER_EFFECTIVE_CALLS = 256
PRECOMPILE_SHA2_BLOCKS = 671
PRECOMPILE_RIPEMD_BLOCKS = 0
PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 8
PRECOMPILE_ECADD_EFFECTIVE_CALLS = 32768
PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 64
PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32
PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128
PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS = 128
PRECOMPILE_BLAKE_EFFECTIVE_CALLS = 0
PRECOMPILE_BLAKE_ROUNDS = 0
BLOCK_KECCAK = 8192
BLOCK_L1_SIZE = 1000000
BLOCK_L2_L1_LOGS = 16
BLOCK_TRANSACTIONS = 200
BIN_REFERENCE_TABLE = 262144
SHF_REFERENCE_TABLE = 4096
INSTRUCTION_DECODER = 512

View File

@@ -1,5 +1,5 @@
environment = "mainnet"
version = "5.0.2" # TODO @gbotrel hunt all version definitions.
version = "5.1.1" # TODO @gbotrel hunt all version definitions.
assets_dir = "./prover-assets"
log_level = 4 # TODO @gbotrel will be refactored with new logger.
@@ -8,18 +8,18 @@ retry_delays = [0, 1]
[execution]
prover_mode = "full"
conflated_traces_dir = "/home/ubuntu/testing-mainnet-beta-v2/conflated"
requests_root_dir = "/home/ubuntu/testing-mainnet-beta-v2/prover-execution"
conflated_traces_dir = "/home/ubuntu/mainnet-test-2/conflated"
requests_root_dir = "/home/ubuntu/mainnet-test-2/v2/execution"
[blob_decompression]
prover_mode = "full"
requests_root_dir = "/home/ubuntu/testing-mainnet-beta-v2/prover-compression"
requests_root_dir = "/home/ubuntu/mainnet-test-2/v2/compression"
dict_paths = ["lib/compressor/compressor_dict.bin", "lib/compressor/dict/25-04-21.bin"]
[aggregation]
prover_mode = "full"
requests_root_dir = "/home/ubuntu/testing-mainnet-beta-v2/prover-aggregation"
requests_root_dir = "/home/ubuntu/mainnet-test-2/v2/aggregation"
num_proofs = [10, 20, 50, 100, 200, 400]
allowed_inputs = ["execution-dummy", "execution", "execution-large", "blob-decompression-dummy", "blob-decompression-v0", "blob-decompression-v1"]
verifier_id = 1
@@ -72,7 +72,7 @@ PRECOMPILE_SHA2_BLOCKS = 200
PRECOMPILE_RIPEMD_BLOCKS = 0
PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 32
PRECOMPILE_ECADD_EFFECTIVE_CALLS = 1024
PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 32
PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 40
PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 16
PRECOMPILE_ECPAIRING_MILLER_LOOPS = 64
PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS = 64
@@ -122,7 +122,7 @@ PRECOMPILE_SHA2_BLOCKS = 400
PRECOMPILE_RIPEMD_BLOCKS = 0
PRECOMPILE_MODEXP_EFFECTIVE_CALLS = 64
PRECOMPILE_ECADD_EFFECTIVE_CALLS = 32768
PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 64
PRECOMPILE_ECMUL_EFFECTIVE_CALLS = 80
PRECOMPILE_ECPAIRING_FINAL_EXPONENTIATIONS = 32
PRECOMPILE_ECPAIRING_MILLER_LOOPS = 128
PRECOMPILE_ECPAIRING_G2_MEMBERSHIP_CALLS = 128

View File

@@ -1,5 +1,5 @@
environment = "sepolia"
version = "5.0.2" # TODO @gbotrel hunt all version definitions.
version = "5.1.1" # TODO @gbotrel hunt all version definitions.
assets_dir = "./prover-assets"
log_level = 4 # TODO @gbotrel will be refactored with new logger.
@@ -8,18 +8,18 @@ retry_delays = [0, 1]
[execution]
prover_mode = "full"
conflated_traces_dir = "/home/ubuntu/testing-sepolia-0.8.0-rc8.1/traces/conflated"
requests_root_dir = "/home/ubuntu/testing-sepolia-0.8.0-rc8.1/prover-execution"
conflated_traces_dir = "/home/ubuntu/testing-sepolia-beta-v2"
requests_root_dir = "/home/ubuntu/testing-sepolia-beta-v2/prover-execution"
[blob_decompression]
prover_mode = "full"
requests_root_dir = "/home/ubuntu/testing-sepolia-0.8.0-rc8.1/prover-compression"
requests_root_dir = "/home/ubuntu/mainnet-test-2/v1/prover-compression"
dict_paths = ["lib/compressor/compressor_dict.bin", "lib/compressor/dict/25-04-21.bin"]
[aggregation]
prover_mode = "full"
requests_root_dir = "/home/ubuntu/testing-sepolia-0.8.0-rc8.1/prover-aggregation"
requests_root_dir = "/home/ubuntu/mainnet-test-2/v1/prover-aggregation"
num_proofs = [10, 20, 50, 100, 200, 400]
allowed_inputs = ["execution-dummy", "execution", "execution-large", "blob-decompression-dummy", "blob-decompression-v0", "blob-decompression-v1"]
verifier_id = 1

View File

@@ -10,7 +10,7 @@ require (
github.com/consensys/compress v0.2.5
github.com/consensys/gnark v0.11.1-0.20250107100237-2cb190338a01
github.com/consensys/gnark-crypto v0.14.1-0.20250515163241-5b554443cce2
github.com/consensys/go-corset v1.0.3
github.com/consensys/go-corset v1.0.7
github.com/crate-crypto/go-kzg-4844 v1.1.0
github.com/dlclark/regexp2 v1.11.2
github.com/fxamacker/cbor/v2 v2.7.0

View File

@@ -100,8 +100,8 @@ github.com/consensys/gnark v0.11.1-0.20250107100237-2cb190338a01 h1:YCHI04nMKFC6
github.com/consensys/gnark v0.11.1-0.20250107100237-2cb190338a01/go.mod h1:8YNyW/+XsYiLRzROLaj/PSktYO4VAdv6YW1b1P3UsZk=
github.com/consensys/gnark-crypto v0.14.1-0.20250515163241-5b554443cce2 h1:N3OCv+VoCn4CEvhRc3vKXyE3S1Si7OSoFTO3bv6ZEgQ=
github.com/consensys/gnark-crypto v0.14.1-0.20250515163241-5b554443cce2/go.mod h1:ePFa23CZLMRMHxQpY5nMaiAZ3yuEIayaB8ElEvlwLEs=
github.com/consensys/go-corset v1.0.3 h1:CZ04qi9NaMkMJnfv19UUHGhEXJZwpDNrAo5fwDbT1OM=
github.com/consensys/go-corset v1.0.3/go.mod h1:JKJTywyjBE0Goco4DokW4BAkF6R+jtoo3XgkICwxrcw=
github.com/consensys/go-corset v1.0.7 h1:Ym3vjHtVSk59/q7p9/VFvwQkIqyCy1m61DgkNcKlyg4=
github.com/consensys/go-corset v1.0.7/go.mod h1:JKJTywyjBE0Goco4DokW4BAkF6R+jtoo3XgkICwxrcw=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=

View File

@@ -0,0 +1 @@
package prover

View File

@@ -70,6 +70,7 @@ func (ss *Module) assignArithmetizationLink(run *wizard.ProverRuntime) {
ss.arithmetizationLink.scpSelector.ComputeSelectorEmptySTValueNextLo,
ss.arithmetizationLink.scpSelector.ComputeSelectorSTKeyDiffHi,
ss.arithmetizationLink.scpSelector.ComputeSelectorSTKeyDiffLo,
ss.arithmetizationLink.scpSelector.ComputeSelectorAccountAddressDiff,
ss.arithmetizationLink.scpSelector.ComputeSelectorBlockNoDiff,
})
@@ -127,6 +128,9 @@ type scpSelector struct {
// storage key difference selectors
SelectorSTKeyDiffHi, SelectorSTKeyDiffLo ifaces.Column
ComputeSelectorSTKeyDiffHi, ComputeSelectorSTKeyDiffLo wizard.ProverAction
// Account Address Diff
SelectorAccountAddressDiff ifaces.Column
ComputeSelectorAccountAddressDiff wizard.ProverAction
// block number key difference selectors
SelectorBlockNoDiff ifaces.Column
ComputeSelectorBlockNoDiff wizard.ProverAction
@@ -182,6 +186,16 @@ func newScpSelector(comp *wizard.CompiledIOP, smc HubColumnSet) scpSelector {
column.Shift(smc.KeyLO, -1),
),
)
// compute selectors for the ethereum address difference
SelectorAccountAddressDiff, ComputeSelectorAccountAddressDiff := dedicated.IsZero(
comp,
sym.Sub(
smc.Address,
column.Shift(smc.Address, -1),
),
)
// compute selectors for the block number difference
SelectorBlockNoDiff, ComputeSelectorBlockNoDiff := dedicated.IsZero(
comp,
@@ -211,6 +225,9 @@ func newScpSelector(comp *wizard.CompiledIOP, smc HubColumnSet) scpSelector {
SelectorSTKeyDiffLo: SelectorSTKeyDiffLo,
ComputeSelectorSTKeyDiffHi: ComputeSelectorSTKeyDiffHi,
ComputeSelectorSTKeyDiffLo: ComputeSelectorSTKeyDiffLo,
// Address Number Diff, account address difference selectors
SelectorAccountAddressDiff: SelectorAccountAddressDiff,
ComputeSelectorAccountAddressDiff: ComputeSelectorAccountAddressDiff,
// Block Number Diff
SelectorBlockNoDiff: SelectorBlockNoDiff,
ComputeSelectorBlockNoDiff: ComputeSelectorBlockNoDiff,
@@ -260,13 +277,13 @@ func accountIntegrationDefineInitial(comp *wizard.CompiledIOP, ss Module, smc Hu
}
)
// comp.InsertInclusionDoubleConditional(0,
// "LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_INIT_ACCOUNT",
// stateSummaryTable,
// arithTable,
// filterSummary,
// filterArith,
// )
comp.InsertInclusionDoubleConditional(0,
"LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_INIT_ACCOUNT",
stateSummaryTable,
arithTable,
filterSummary,
filterArith,
)
comp.InsertInclusionDoubleConditional(0,
"LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_INIT_ACCOUNT_REVERSED",
@@ -364,7 +381,7 @@ func accountIntegrationDefineFinal(comp *wizard.CompiledIOP, ss Module, smc HubC
smc.ExistsNew,
}
// comp.InsertInclusionDoubleConditional(0, "LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_FINAL_ACCOUNT", stateSummaryTable, arithTable, filterSummary, filterArith)
comp.InsertInclusionDoubleConditional(0, "LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_FINAL_ACCOUNT", stateSummaryTable, arithTable, filterSummary, filterArith)
comp.InsertInclusionDoubleConditional(0, "LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_FINAL_ACCOUNT_REVERSED", arithTable, stateSummaryTable, filterArith, filterSummary)
// Now we define the constraints for our filters
@@ -435,8 +452,6 @@ func storageIntegrationDefineInitial(comp *wizard.CompiledIOP, ss Module, smc Hu
filterArithReversed := comp.InsertCommit(0, "FILTER_CONNECTOR_SUMMARY_ARITHMETIZATION_STORAGE_INITIAL_ARITHMETIZATION_REVERSED", smc.AddressHI.Size())
isExceptionalOperation := comp.Columns.GetHandle("hub.scp_EXCEPTIONAL_OPERATION")
summaryTable := []ifaces.Column{
ss.Account.Address,
ss.Storage.Key.Hi,
@@ -453,14 +468,14 @@ func storageIntegrationDefineInitial(comp *wizard.CompiledIOP, ss Module, smc Hu
smc.ValueLOCurr,
smc.BlockNumber,
}
// comp.InsertInclusionDoubleConditional(
// 0,
// "LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_INIT_STORAGE",
// summaryTable,
// arithTable,
// filterSummary,
// filterArith,
// )
comp.InsertInclusionDoubleConditional(
0,
"LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_INIT_STORAGE",
summaryTable,
arithTable,
filterSummary,
filterArith,
)
comp.InsertInclusionDoubleConditional(
0,
"LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_INIT_STORAGE_REVERSE",
@@ -470,6 +485,7 @@ func storageIntegrationDefineInitial(comp *wizard.CompiledIOP, ss Module, smc Hu
filterSummary,
)
filterEphemeralAccounts := defineEphemeralAccountFilterStorage(comp, smc, sc)
// Now we define the constraints for our filters
comp.InsertGlobal(
0,
@@ -480,10 +496,7 @@ func storageIntegrationDefineInitial(comp *wizard.CompiledIOP, ss Module, smc Hu
sc.SelectorMinDeplBlock,
smc.PeekAtStorage,
smc.FirstKOCBlock,
sym.Sub(
1,
isExceptionalOperation,
),
filterEphemeralAccounts,
),
),
)
@@ -531,20 +544,13 @@ func storageIntegrationAssignInitial(run *wizard.ProverRuntime, ss Module, smc H
}
svSelectorMinDeplBlock := smartvectors.NewRegular(selectorMinDeplBlock)
isExceptionalOperation := run.Spec.Columns.GetHandle("hub.scp_EXCEPTIONAL_OPERATION")
isNotExceptionalOperation := make([]field.Element, smc.AddressHI.Size())
for i := range isNotExceptionalOperation {
fieldOne := field.One()
isExceptionElem := isExceptionalOperation.GetColAssignmentAt(run, i)
isNotExceptionalOperation[i].Sub(&fieldOne, &isExceptionElem)
}
filterEphemeralAccounts := assignEphemeralAccountFilterStorage(run, smc)
filterArith := smartvectors.Mul(
svSelectorMinDeplBlock,
smc.PeekAtStorage.GetColAssignment(run),
smc.FirstKOCBlock.GetColAssignment(run),
smartvectors.NewRegular(isNotExceptionalOperation),
filterEphemeralAccounts,
)
run.AssignColumn(
"FILTER_CONNECTOR_SUMMARY_ARITHMETIZATION_STORAGE_INITIAL_ARITHMETIZATION",
@@ -604,19 +610,17 @@ func storageIntegrationDefineFinal(comp *wizard.CompiledIOP, ss Module, smc HubC
ss.Account.Address.Size(),
)
filterAccountInsert = comp.InsertCommit(0,
"FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_INSERT_FILTER",
smc.AddressHI.Size(),
)
filterAccountInsert = defineInsertionFilterForFinalStorage(comp, smc, sc)
filterEphemeralAccounts = comp.Columns.GetHandle("FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_EPHEMERAL_FILTER")
)
// comp.InsertInclusionDoubleConditional(0,
// "LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_FINAL_STORAGE",
// summaryTable,
// arithTable,
// filterSummary,
// filterArith,
// )
comp.InsertInclusionDoubleConditional(0,
"LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_FINAL_STORAGE",
summaryTable,
arithTable,
filterSummary,
filterArith,
)
comp.InsertInclusionDoubleConditional(0,
"LOOKUP_STATE_MGR_ARITH_TO_STATE_SUMMARY_FINAL_STORAGE_REVERSED",
@@ -626,9 +630,6 @@ func storageIntegrationDefineFinal(comp *wizard.CompiledIOP, ss Module, smc HubC
filterSummary,
)
isSLoad := comp.Columns.GetHandle("hub.scp_SLOAD_OPERATION")
isExceptionalOperation := comp.Columns.GetHandle("hub.scp_EXCEPTIONAL_OPERATION")
comp.InsertGlobal(
0,
ifaces.QueryIDf("CONSTRAINT_FILTER_CONNECTOR_SUMMARY_ARITHMETIZATION_STORAGE_FINAL_ARITHMETIZATION"),
@@ -639,16 +640,7 @@ func storageIntegrationDefineFinal(comp *wizard.CompiledIOP, ss Module, smc HubC
smc.PeekAtStorage,
smc.LastKOCBlock,
filterAccountInsert,
sym.Sub(
1,
sym.Mul(
// in this paranthesis, we have a filter for SLOADS that generate exceptions,
// and will not appear on Shomei's side. Currently, the SSTORE behavior seems to match
// betwen HUB and Shomei, so we do not filter or create separate lookups for SSTOREs
isSLoad,
isExceptionalOperation,
),
),
filterEphemeralAccounts,
),
),
)
@@ -677,6 +669,61 @@ func storageIntegrationDefineFinal(comp *wizard.CompiledIOP, ss Module, smc HubC
),
),
)
}
/*
storageIntegrationAssignFinal assigns the columns used to check initial storage data consistency using the lookups from StorageIntegrationDefineFinal
*/
func storageIntegrationAssignFinal(run *wizard.ProverRuntime, ss Module, smc HubColumnSet) {
selectorMaxDeplBlock := make([]field.Element, smc.AddressHI.Size())
for index := range selectorMaxDeplBlock {
maxDeplBlock := smc.MaxDeplBlock.GetColAssignmentAt(run, index)
deplNumber := smc.DeploymentNumber.GetColAssignmentAt(run, index)
if maxDeplBlock.Equal(&deplNumber) {
selectorMaxDeplBlock[index].SetOne()
}
}
svSelectorMaxDeplBlock := smartvectors.NewRegular(selectorMaxDeplBlock)
filterSummary := smartvectors.Mul(
ss.IsStorage.GetColAssignment(run),
ss.IsFinalDeployment.GetColAssignment(run),
)
run.AssignColumn("FILTER_CONNECTOR_SUMMARY_ARITHMETIZATION_STORAGE_FINAL_SUMMARY", filterSummary)
// assign the insertion filter
filterAccountInsert := assignInsertionFilterForFinalStorage(run, smc)
filterEphemeralAccounts := run.GetColumn("FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_EPHEMERAL_FILTER")
filterArith := smartvectors.Mul(
svSelectorMaxDeplBlock,
smc.PeekAtStorage.GetColAssignment(run),
smc.LastKOCBlock.GetColAssignment(run),
filterAccountInsert,
filterEphemeralAccounts,
)
run.AssignColumn("FILTER_CONNECTOR_SUMMARY_ARITHMETIZATION_STORAGE_FINAL_ARITHMETIZATION", filterArith)
filterArithReversed := smartvectors.Mul(
svSelectorMaxDeplBlock,
smc.PeekAtStorage.GetColAssignment(run),
smc.LastKOCBlock.GetColAssignment(run),
)
run.AssignColumn("FILTER_CONNECTOR_SUMMARY_ARITHMETIZATION_STORAGE_FINAL_ARITHMETIZATION_REVERSED", filterArithReversed)
}
/*
defineInsertionFilterForFinalStorage defines an insertion filter for the edge case of
missing storage keys that get created but then wiped when an account that did not exist is
not added to the state
*/
func defineInsertionFilterForFinalStorage(comp *wizard.CompiledIOP, smc HubColumnSet, sc scpSelector) ifaces.Column {
// create the filter
filterAccountInsert := comp.InsertCommit(0,
"FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_INSERT_FILTER",
smc.AddressHI.Size(),
)
// constraint the insertion selector filter
// on storage rows, we enforce that filterAccountInsert is 0 then (existsFirstInBlock = 0 and existsFinalInBlock = 1)
@@ -702,11 +749,14 @@ func storageIntegrationDefineFinal(comp *wizard.CompiledIOP, ss Module, smc HubC
),
)
// if the filter is set to 0, then all the emoty value selectors must be 1.
// but this only must be true for the last values seen in the relevant segment.
// afterwards the keys are allowed to fluctuate
comp.InsertGlobal(
0,
ifaces.QueryIDf("GLOBAL_CONSTRAINT_FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_INSERT_FILTER_VALUE_ZEROIZATION"),
sym.Mul(
smc.PeekAtStorage,
smc.LastKOCBlock, // Very important, only check the wiping on the last row of the storage key
sym.Sub(
1,
filterAccountInsert,
@@ -714,8 +764,6 @@ func storageIntegrationDefineFinal(comp *wizard.CompiledIOP, ss Module, smc HubC
sym.Sub(
1,
sym.Mul(
sc.SelectorEmptySTValueHi,
sc.SelectorEmptySTValueLo,
sc.SelectorEmptySTValueNextHi,
sc.SelectorEmptySTValueNextLo,
),
@@ -723,16 +771,18 @@ func storageIntegrationDefineFinal(comp *wizard.CompiledIOP, ss Module, smc HubC
),
)
// filter must be constant as long as the storage key does not change
// and the address and block number also does not change
comp.InsertGlobal(
0,
ifaces.QueryIDf("GLOBAL_CONSTRAINT_HUB_STATE_SUMMARY__ACCOUNT_INSERT_FILTER_CONSTANCY"),
sym.Mul(
sc.SelectorSTKeyDiffHi, // 1 if ST key HI is the same as in the previous index
sc.SelectorSTKeyDiffLo, // 1 if ST key LO is the same as in the previous index
sc.SelectorBlockNoDiff, // 1 if the block number is the same, meaning that we are in the same storage key segment
sc.SelectorSTKeyDiffHi, // 1 if ST key HI is the same as in the previous index
sc.SelectorSTKeyDiffLo, // 1 if ST key LO is the same as in the previous index
sc.SelectorAccountAddressDiff, // 1 if the account address is the same, meaning that our storage segment is within the same account segment
sc.SelectorBlockNoDiff, // 1 if the block number is the same, meaning that we are in the same storage key segment
sym.Sub(
filterAccountInsert,
column.Shift(filterAccountInsert, -1), // the filter remains constant if the ST key is the same, and block is the same
column.Shift(filterAccountInsert, -1), // the filter remains constant if the ST key is the same, account address, and block is the same
),
),
)
@@ -752,28 +802,16 @@ func storageIntegrationDefineFinal(comp *wizard.CompiledIOP, ss Module, smc HubC
)
// constrain the filter to be binary
mustBeBinary(comp, filterAccountInsert)
return filterAccountInsert
}
/*
storageIntegrationAssignFinal assigns the columns used to check initial storage data consistency using the lookups from StorageIntegrationDefineFinal
assignInsertionFilterForFinalStorage assigns the insertion filter for the edge case of
missing storage keys that get created but then wiped when an account that did not exist is
not added to the state
*/
func storageIntegrationAssignFinal(run *wizard.ProverRuntime, ss Module, smc HubColumnSet) {
selectorMaxDeplBlock := make([]field.Element, smc.AddressHI.Size())
for index := range selectorMaxDeplBlock {
maxDeplBlock := smc.MaxDeplBlock.GetColAssignmentAt(run, index)
deplNumber := smc.DeploymentNumber.GetColAssignmentAt(run, index)
if maxDeplBlock.Equal(&deplNumber) {
selectorMaxDeplBlock[index].SetOne()
}
}
svSelectorMaxDeplBlock := smartvectors.NewRegular(selectorMaxDeplBlock)
filterSummary := smartvectors.Mul(
ss.IsStorage.GetColAssignment(run),
ss.IsFinalDeployment.GetColAssignment(run),
)
run.AssignColumn("FILTER_CONNECTOR_SUMMARY_ARITHMETIZATION_STORAGE_FINAL_SUMMARY", filterSummary)
func assignInsertionFilterForFinalStorage(run *wizard.ProverRuntime, smc HubColumnSet) smartvectors.SmartVector {
// compute the filter that detects account inserts in order to exclude those key reads from the
// arithmetization to state summary lookups.
filterAccountInsert := make([]field.Element, smc.AddressHI.Size())
@@ -793,19 +831,11 @@ func storageIntegrationAssignFinal(run *wizard.ProverRuntime, ss Module, smc Hub
if lastKOCBlock.IsOne() && existsAtBlockEnd.IsOne() {
existsAtBlockStart := smc.ExistsFirstInBlock.GetColAssignmentAt(run, lastSegmentStart)
if existsAtBlockStart.IsZero() {
// we are indeed dealing with an insertion segment, check if indeed all the storage values are 0
allStorageIsZero := true
for j := lastSegmentStart; j <= index; j++ {
valueCurrentHi := smc.ValueHICurr.GetColAssignmentAt(run, j)
valueCurrentLo := smc.ValueLOCurr.GetColAssignmentAt(run, j)
valueNextHi := smc.ValueHINext.GetColAssignmentAt(run, j)
valueNextLo := smc.ValueLONext.GetColAssignmentAt(run, j)
if !valueCurrentHi.IsZero() || !valueCurrentLo.IsZero() || !valueNextHi.IsZero() || !valueNextLo.IsZero() {
allStorageIsZero = false
}
}
if allStorageIsZero {
// we are indeed dealing with an insertion segment
// now check if indeed all the storage values on the last row are 0
valueNextHi := smc.ValueHINext.GetColAssignmentAt(run, index)
valueNextLo := smc.ValueLONext.GetColAssignmentAt(run, index)
if valueNextHi.IsZero() && valueNextLo.IsZero() {
// indeed we are dealing with a zeroed insertion segment
for j := lastSegmentStart; j <= index; j++ {
// set the filter to zeros on the insertion segment
@@ -829,32 +859,117 @@ func storageIntegrationAssignFinal(run *wizard.ProverRuntime, ss Module, smc Hub
//
svfilterAccountInsert := smartvectors.NewConstant(field.One(), smc.AddressHI.Size())
run.AssignColumn("FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_INSERT_FILTER", svfilterAccountInsert)
isSLoad := run.Spec.Columns.GetHandle("hub.scp_SLOAD_OPERATION")
isExceptionalOperation := run.Spec.Columns.GetHandle("hub.scp_EXCEPTIONAL_OPERATION")
isNotExceptionalSLoad := make([]field.Element, smc.AddressHI.Size())
for i := range isNotExceptionalSLoad {
fieldOne := field.One()
isExceptionElem := isExceptionalOperation.GetColAssignmentAt(run, i)
isSLoadElem := isSLoad.GetColAssignmentAt(run, i)
multiplied := new(field.Element).Mul(&isSLoadElem, &isExceptionElem)
isNotExceptionalSLoad[i].Sub(&fieldOne, multiplied)
}
filterArith := smartvectors.Mul(
svSelectorMaxDeplBlock,
smc.PeekAtStorage.GetColAssignment(run),
smc.LastKOCBlock.GetColAssignment(run),
svfilterAccountInsert,
smartvectors.NewRegular(isNotExceptionalSLoad),
)
run.AssignColumn("FILTER_CONNECTOR_SUMMARY_ARITHMETIZATION_STORAGE_FINAL_ARITHMETIZATION", filterArith)
filterArithReversed := smartvectors.Mul(
svSelectorMaxDeplBlock,
smc.PeekAtStorage.GetColAssignment(run),
smc.LastKOCBlock.GetColAssignment(run),
)
run.AssignColumn("FILTER_CONNECTOR_SUMMARY_ARITHMETIZATION_STORAGE_FINAL_ARITHMETIZATION_REVERSED", filterArithReversed)
return svfilterAccountInsert
}
/*
defineEphemeralAccountFilterStorage defines an ephemeral filter for the edge case of
missing storage keys that belogn to accounts which do not exist at the beginning/end of
a block, but exist in-between
*/
func defineEphemeralAccountFilterStorage(comp *wizard.CompiledIOP, smc HubColumnSet, sc scpSelector) ifaces.Column {
// create the filter
filterEphemeralAccounts := comp.InsertCommit(0,
"FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_EPHEMERAL_FILTER",
smc.AddressHI.Size(),
)
// constraint the ephemeral selector filter
// on storage rows, we enforce that filterEphemeralAccounts is 0 then (existsFirstInBlock = 0 and existsFinalInBlock = 0)
// security of the following constraint relies on the fact that the underlying marker columns are binary
comp.InsertGlobal(
0,
ifaces.QueryIDf("GLOBAL_CONSTRAINT_FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_EPHEMERAL_FILTER"),
sym.Mul(
smc.PeekAtStorage, // when we are dealing with storage segments
sym.Mul(
sym.Sub(
1,
filterEphemeralAccounts,
), // if filterEphemeralAccounts = 0 it must be that the conditions of the filter are both satisfied
sym.Add(
smc.ExistsFirstInBlock,
smc.ExistsFinalInBlock,
),
),
),
)
// filter must be constant as long as the storage key does not change
// and the address and block number also does not change
comp.InsertGlobal(
0,
ifaces.QueryIDf("GLOBAL_CONSTRAINT_HUB_STATE_SUMMARY__ACCOUNT_EPHEMERAL_FILTER_CONSTANCY"),
sym.Mul(
sc.SelectorSTKeyDiffHi, // 1 if ST key HI is the same as in the previous index
sc.SelectorSTKeyDiffLo, // 1 if ST key LO is the same as in the previous index
sc.SelectorAccountAddressDiff, // 1 if the account address is the same, meaning that our storage segment is within the same account segment
sc.SelectorBlockNoDiff, // 1 if the block number is the same, meaning that we are in the same storage key segment
sym.Sub(
filterEphemeralAccounts,
column.Shift(filterEphemeralAccounts, -1), // the filter remains constant if the ST key is the same, account address, and block is the same
),
),
)
comp.InsertGlobal(
0,
ifaces.QueryIDf("GLOBAL_CONSTRAINT_FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_EPHEMERAL_FILTER_NON_ZEROIZATION"),
sym.Mul(
sym.Sub(
1,
smc.PeekAtStorage,
), // when we are not dealing with storage segments
sym.Sub(
1,
filterEphemeralAccounts,
), // filterEphemeralAccounts must be 1
),
)
// constrain the filter to be binary
mustBeBinary(comp, filterEphemeralAccounts)
return filterEphemeralAccounts
}
/*
assignEphemeralAccountFilterStorage assigns a filter that removes the storage from ephemeral accounts
that do not exist at the beginning&end of a block, but are deployed inside.
The filter will be 0 when the keys must be removed, and 1 elsewhere
*/
func assignEphemeralAccountFilterStorage(run *wizard.ProverRuntime, smc HubColumnSet) smartvectors.SmartVector {
// compute the filter that detects storage keys of ephemeral accounts to exclude those key reads from the
// arithmetization to state summary lookups.
filterEphemeralAccounts := make([]field.Element, smc.AddressHI.Size())
lastSegmentStart := 0
for index := range filterEphemeralAccounts {
filterEphemeralAccounts[index].SetOne() // always set the filter as one, unless we detect an insertion segment
isStorage := smc.PeekAtStorage.GetColAssignmentAt(run, index)
if isStorage.IsOne() {
firstKOCBlock := smc.FirstKOCBlock.GetColAssignmentAt(run, index)
lastKOCBlock := smc.LastKOCBlock.GetColAssignmentAt(run, index)
existsAtBlockEnd := smc.ExistsFinalInBlock.GetColAssignmentAt(run, index)
if firstKOCBlock.IsOne() {
// remember when the segment starts
lastSegmentStart = index
}
if lastKOCBlock.IsOne() && existsAtBlockEnd.IsZero() {
existsAtBlockStart := smc.ExistsFirstInBlock.GetColAssignmentAt(run, lastSegmentStart)
if existsAtBlockStart.IsZero() {
// we are indeed dealing with an ephemeral account, that does not exist
// at the beginning of the block, nor at the end
// indeed we are dealing with a zeroed ephemeral segment
for j := lastSegmentStart; j <= index; j++ {
// set the filter to zeros on the ephemeral segment
filterEphemeralAccounts[j].SetZero()
}
}
}
}
}
svFilterEphemeralAccounts := smartvectors.NewRegular(filterEphemeralAccounts)
run.AssignColumn("FILTER_CONNECTOR_HUB_STATE_SUMMARY_ACCOUNT_EPHEMERAL_FILTER", svFilterEphemeralAccounts)
return svFilterEphemeralAccounts
}

View File

@@ -0,0 +1 @@
package statemanager