Prover: connect the codehash and the statesummary module (#463)

* clean(prover): more hilo into zkevm/prover/common

* feat(codehash): implements the module connecting the codehash and the statesummary

* clean(ss): apply the changes for the statesummary

* feat(rand): moves everything to use rand/v2

* feat(csv): adds WriteExplicit

* feat(codehash): implements the consistency module

* fix(rng): Int31n -> Int32N

* fix(lint): pass the use of test-rng

* clean: clean one of the comment to remove debugging data

* fix(test): fix conversion test and also simplify the use of rng

* feat(codehash): enable the codehash consistency module

* reconnect the execution data hasher with the public input

* revert the rand/v2 for the testcase-gen of the contracts
This commit is contained in:
AlexandreBelling
2025-01-16 22:31:15 +01:00
committed by GitHub
parent be18423769
commit aeb86855ae
63 changed files with 1771 additions and 738 deletions

View File

@@ -19,29 +19,28 @@
pragma solidity 0.8.26;
contract PlonkVerifierForDataAggregation {
uint256 private constant R_MOD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
uint256 private constant R_MOD_MINUS_ONE =
21888242871839275222246405745257275088548364400416034343698204186575808495616;
uint256 private constant P_MOD = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
uint256 private constant R_MOD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
uint256 private constant R_MOD_MINUS_ONE = 21888242871839275222246405745257275088548364400416034343698204186575808495616;
uint256 private constant P_MOD = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
uint256 private constant G2_SRS_0_X_0 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
uint256 private constant G2_SRS_0_X_1 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
uint256 private constant G2_SRS_0_Y_0 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
uint256 private constant G2_SRS_0_Y_1 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;
uint256 private constant G2_SRS_1_X_0 = 15805639136721018565402881920352193254830339253282065586954346329754995870280;
uint256 private constant G2_SRS_1_X_1 = 19089565590083334368588890253123139704298730990782503769911324779715431555531;
uint256 private constant G2_SRS_1_Y_0 = 9779648407879205346559610309258181044130619080926897934572699915909528404984;
uint256 private constant G2_SRS_1_Y_1 = 6779728121489434657638426458390319301070371227460768374343986326751507916979;
uint256 private constant G1_SRS_X = 14312776538779914388377568895031746459131577658076416373430523308756343304251;
uint256 private constant G1_SRS_Y = 11763105256161367503191792604679297387056316997144156930871823008787082098465;
// ----------------------- vk ---------------------
uint256 private constant VK_NB_PUBLIC_INPUTS = 1;
uint256 private constant VK_DOMAIN_SIZE = 16;
uint256 private constant VK_INV_DOMAIN_SIZE =
20520227692349320520856005386178695395514091625390032197217066424914820464641;
uint256 private constant VK_INV_DOMAIN_SIZE = 20520227692349320520856005386178695395514091625390032197217066424914820464641;
uint256 private constant VK_OMEGA = 14940766826517323942636479241147756311199852622225275649687664389641784935947;
uint256 private constant VK_QL_COM_X = 3767637989833674092151354229632559107224950590673664856842061399469467338879;
uint256 private constant VK_QL_COM_Y = 18545409996679466114224178746162553880737296402729089689774308937082946761979;
@@ -53,21 +52,23 @@ contract PlonkVerifierForDataAggregation {
uint256 private constant VK_QO_COM_Y = 10782414695040549646706468913781794882209258381887890407509684555513355143197;
uint256 private constant VK_QK_COM_X = 309591480144351325314158474719361148480191595146291661238142838254651436989;
uint256 private constant VK_QK_COM_Y = 12063173869829536468830946547606069911666129778788708678515573607390482939756;
uint256 private constant VK_S1_COM_X = 12287072751694848944507699577006619791724925439540371477056092891137357229312;
uint256 private constant VK_S1_COM_Y = 2469356406782415219782253630635766217009619642857495098799013714324696399305;
uint256 private constant VK_S2_COM_X = 17261757720471042341269061128759148572672168808566386603388432325173708264418;
uint256 private constant VK_S2_COM_Y = 20976565876611279190744172824963243461988367679364518747954008723085439460611;
uint256 private constant VK_S3_COM_X = 18758025488249277181117376239193628449359868741625564388668468130204669284937;
uint256 private constant VK_S3_COM_Y = 15566903578741238761792344329051427316196307361197991677131114502821508927172;
uint256 private constant VK_COSET_SHIFT = 5;
uint256 private constant VK_QCP_0_X = 4559262075452024065272338216146989708834054079507534161096300708463935456394;
uint256 private constant VK_QCP_0_Y = 1898950104727986554890445533779776634695458253078091580309593009754027486622;
uint256 private constant VK_INDEX_COMMIT_API_0 = 5;
uint256 private constant VK_NB_CUSTOM_GATES = 1;
@@ -77,7 +78,7 @@ contract PlonkVerifierForDataAggregation {
uint256 private constant FIXED_PROOF_SIZE = 0x300;
// offset proof
uint256 private constant PROOF_L_COM_X = 0x0;
uint256 private constant PROOF_L_COM_Y = 0x20;
uint256 private constant PROOF_R_COM_X = 0x40;
@@ -121,7 +122,7 @@ contract PlonkVerifierForDataAggregation {
// -------- offset state
// challenges to check the claimed quotient
uint256 private constant STATE_ALPHA = 0x0;
uint256 private constant STATE_BETA = 0x20;
uint256 private constant STATE_GAMMA = 0x40;
@@ -152,13 +153,15 @@ contract PlonkVerifierForDataAggregation {
// -------- errors
uint256 private constant ERROR_STRING_ID = 0x08c379a000000000000000000000000000000000000000000000000000000000; // selector for function Error(string)
// -------- utils (for hash_fr)
uint256 private constant HASH_FR_BB = 340282366920938463463374607431768211456; // 2**128
uint256 private constant HASH_FR_ZERO_UINT256 = 0;
uint8 private constant HASH_FR_LEN_IN_BYTES = 48;
uint8 private constant HASH_FR_SIZE_DOMAIN = 11;
uint8 private constant HASH_FR_ONE = 1;
uint8 private constant HASH_FR_TWO = 2;
uint256 private constant HASH_FR_BB = 340282366920938463463374607431768211456; // 2**128
uint256 private constant HASH_FR_ZERO_UINT256 = 0;
uint8 private constant HASH_FR_LEN_IN_BYTES = 48;
uint8 private constant HASH_FR_SIZE_DOMAIN = 11;
uint8 private constant HASH_FR_ONE = 1;
uint8 private constant HASH_FR_TWO = 2;
// -------- precompiles
uint8 private constant SHA2 = 0x2;
@@ -166,14 +169,17 @@ contract PlonkVerifierForDataAggregation {
uint8 private constant EC_ADD = 0x6;
uint8 private constant EC_MUL = 0x7;
uint8 private constant EC_PAIR = 0x8;
/// Verify a Plonk proof.
/// Reverts if the proof or the public inputs are malformed.
/// @param proof serialised plonk proof (using gnark's MarshalSolidity)
/// @param public_inputs (must be reduced)
/// @return success true if the proof passes false otherwise
function Verify(bytes calldata proof, uint256[] calldata public_inputs) public view returns (bool success) {
function Verify(bytes calldata proof, uint256[] calldata public_inputs)
public view returns(bool success) {
assembly {
let mem := mload(0x40)
let freeMem := add(mem, STATE_LAST_MEM)
@@ -305,23 +311,20 @@ contract PlonkVerifierForDataAggregation {
// end errors -------------------------------------------------
// Beginning checks -------------------------------------------------
/// @param s actual number of public inputs
function check_number_of_public_inputs(s) {
if iszero(eq(s, VK_NB_PUBLIC_INPUTS)) {
error_nb_public_inputs()
}
}
/// Checks that the public inputs are < R_MOD.
/// @param s number of public inputs
/// @param p pointer to the public inputs array
function check_inputs_size(s, p) {
for {
let i
} lt(i, s) {
i := add(i, 1)
} {
for {let i} lt(i, s) {i:=add(i,1)}
{
if gt(calldataload(p), R_MOD_MINUS_ONE) {
error_inputs_size()
}
@@ -332,16 +335,17 @@ contract PlonkVerifierForDataAggregation {
/// Checks if the proof is of the correct size
/// @param actual_proof_size size of the proof (not the expected size)
function check_proof_size(actual_proof_size) {
let expected_proof_size := add(FIXED_PROOF_SIZE, mul(VK_NB_CUSTOM_GATES, 0x60))
let expected_proof_size := add(FIXED_PROOF_SIZE, mul(VK_NB_CUSTOM_GATES,0x60))
if iszero(eq(actual_proof_size, expected_proof_size)) {
error_proof_size()
error_proof_size()
}
}
/// Checks if the multiple openings of the polynomials are < R_MOD.
/// @param aproof pointer to the beginning of the proof
/// @dev the 'a' prepending proof is to have a local name
function check_proof_openings_size(aproof) {
// PROOF_L_AT_ZETA
let p := add(aproof, PROOF_L_AT_ZETA)
if gt(calldataload(p), R_MOD_MINUS_ONE) {
@@ -365,7 +369,7 @@ contract PlonkVerifierForDataAggregation {
if gt(calldataload(p), R_MOD_MINUS_ONE) {
error_proof_openings_size()
}
// PROOF_S2_AT_ZETA
p := add(aproof, PROOF_S2_AT_ZETA)
if gt(calldataload(p), R_MOD_MINUS_ONE) {
@@ -379,18 +383,16 @@ contract PlonkVerifierForDataAggregation {
}
// PROOF_OPENING_QCP_AT_ZETA
p := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
for {
let i := 0
} lt(i, VK_NB_CUSTOM_GATES) {
i := add(i, 1)
} {
for {let i:=0} lt(i, VK_NB_CUSTOM_GATES) {i:=add(i,1)}
{
if gt(calldataload(p), R_MOD_MINUS_ONE) {
error_proof_openings_size()
}
p := add(p, 0x20)
}
}
// end checks -------------------------------------------------
@@ -412,32 +414,34 @@ contract PlonkVerifierForDataAggregation {
/// and is encoded as a uint256 number n. In basis b = 256, the number looks like this
/// [0 0 0 .. 0x67 0x61 0x6d, 0x6d, 0x61]. The first non zero entry is at position 27=0x1b
/// Gamma reduced (the actual challenge) is stored at add(state, state_gamma)
function derive_gamma(aproof, nb_pi, pi) -> gamma_not_reduced {
function derive_gamma(aproof, nb_pi, pi)->gamma_not_reduced {
let state := mload(0x40)
let mPtr := add(state, STATE_LAST_MEM)
mstore(mPtr, FS_GAMMA) // "gamma"
mstore(add(mPtr, 0x20), VK_S1_COM_X)
mstore(add(mPtr, 0x40), VK_S1_COM_Y)
mstore(add(mPtr, 0x60), VK_S2_COM_X)
mstore(add(mPtr, 0x80), VK_S2_COM_Y)
mstore(add(mPtr, 0xa0), VK_S3_COM_X)
mstore(add(mPtr, 0xc0), VK_S3_COM_Y)
mstore(add(mPtr, 0xe0), VK_QL_COM_X)
mstore(add(mPtr, 0x100), VK_QL_COM_Y)
mstore(add(mPtr, 0x120), VK_QR_COM_X)
mstore(add(mPtr, 0x140), VK_QR_COM_Y)
mstore(add(mPtr, 0x160), VK_QM_COM_X)
mstore(add(mPtr, 0x180), VK_QM_COM_Y)
mstore(add(mPtr, 0x1a0), VK_QO_COM_X)
mstore(add(mPtr, 0x1c0), VK_QO_COM_Y)
mstore(add(mPtr, 0x1e0), VK_QK_COM_X)
mstore(add(mPtr, 0x200), VK_QK_COM_Y)
mstore(add(mPtr, 0x220), VK_QCP_0_X)
mstore(add(mPtr, 0x240), VK_QCP_0_Y)
mstore(add(mPtr, 0x20), VK_S1_COM_X)
mstore(add(mPtr, 0x40), VK_S1_COM_Y)
mstore(add(mPtr, 0x60), VK_S2_COM_X)
mstore(add(mPtr, 0x80), VK_S2_COM_Y)
mstore(add(mPtr, 0xa0), VK_S3_COM_X)
mstore(add(mPtr, 0xc0), VK_S3_COM_Y)
mstore(add(mPtr, 0xe0), VK_QL_COM_X)
mstore(add(mPtr, 0x100), VK_QL_COM_Y)
mstore(add(mPtr, 0x120), VK_QR_COM_X)
mstore(add(mPtr, 0x140), VK_QR_COM_Y)
mstore(add(mPtr, 0x160), VK_QM_COM_X)
mstore(add(mPtr, 0x180), VK_QM_COM_Y)
mstore(add(mPtr, 0x1a0), VK_QO_COM_X)
mstore(add(mPtr, 0x1c0), VK_QO_COM_Y)
mstore(add(mPtr, 0x1e0), VK_QK_COM_X)
mstore(add(mPtr, 0x200), VK_QK_COM_Y)
mstore(add(mPtr, 0x220), VK_QCP_0_X)
mstore(add(mPtr, 0x240), VK_QCP_0_Y)
// public inputs
let _mPtr := add(mPtr, 0x260)
let size_pi_in_bytes := mul(nb_pi, 0x20)
@@ -454,7 +458,7 @@ contract PlonkVerifierForDataAggregation {
// + nb_public_inputs*0x20
// + nb_custom gates*0x40
let size := add(0x2c5, size_pi_in_bytes)
size := add(size, mul(VK_NB_CUSTOM_GATES, 0x40))
let l_success := staticcall(gas(), SHA2, add(mPtr, 0x1b), size, mPtr, 0x20) //0x1b -> 000.."gamma"
if iszero(l_success) {
@@ -469,7 +473,8 @@ contract PlonkVerifierForDataAggregation {
/// @return beta_not_reduced the next challenge, beta, not reduced
/// @notice the transcript consists of the previous challenge only.
/// The reduced version of beta is stored at add(state, state_beta)
function derive_beta(gamma_not_reduced) -> beta_not_reduced {
function derive_beta(gamma_not_reduced)->beta_not_reduced{
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
@@ -490,8 +495,9 @@ contract PlonkVerifierForDataAggregation {
/// @return alpha_not_reduced the next challenge, alpha, not reduced
/// @notice the transcript consists of the previous challenge (beta)
/// not reduced, the commitments to the wires associated to the QCP_i,
/// and the commitment to the grand product polynomial
function derive_alpha(aproof, beta_not_reduced) -> alpha_not_reduced {
/// and the commitment to the grand product polynomial
function derive_alpha(aproof, beta_not_reduced)->alpha_not_reduced {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
let full_size := 0x65 // size("alpha") + 0x20 (previous challenge)
@@ -501,14 +507,14 @@ contract PlonkVerifierForDataAggregation {
let _mPtr := add(mPtr, 0x20)
mstore(_mPtr, beta_not_reduced)
_mPtr := add(_mPtr, 0x20)
// Bsb22Commitments
let proof_bsb_commitments := add(aproof, PROOF_BSB_COMMITMENTS)
let size_bsb_commitments := mul(0x40, VK_NB_CUSTOM_GATES)
calldatacopy(_mPtr, proof_bsb_commitments, size_bsb_commitments)
_mPtr := add(_mPtr, size_bsb_commitments)
full_size := add(full_size, size_bsb_commitments)
// [Z], the commitment to the grand product polynomial
calldatacopy(_mPtr, add(aproof, PROOF_GRAND_PRODUCT_COMMITMENT_X), 0x40)
let l_success := staticcall(gas(), SHA2, add(mPtr, 0x1b), full_size, mPtr, 0x20)
@@ -526,6 +532,7 @@ contract PlonkVerifierForDataAggregation {
/// The transcript consists of the previous challenge and the commitment to
/// the quotient polynomial h.
function derive_zeta(aproof, alpha_not_reduced) {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
@@ -550,7 +557,8 @@ contract PlonkVerifierForDataAggregation {
/// @param n number of public inputs
/// @param mPtr free memory
/// @return pi_wo_commit public inputs contribution (except the public inputs coming from the custom gate)
function sum_pi_wo_api_commit(ins, n, mPtr) -> pi_wo_commit {
function sum_pi_wo_api_commit(ins, n, mPtr)->pi_wo_commit {
let state := mload(0x40)
let z := mload(add(state, STATE_ZETA))
let zpnmo := mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE))
@@ -559,16 +567,14 @@ contract PlonkVerifierForDataAggregation {
batch_compute_lagranges_at_z(z, zpnmo, n, li)
let tmp := 0
for {
let i := 0
} lt(i, n) {
i := add(i, 1)
} {
for {let i:=0} lt(i,n) {i:=add(i,1)}
{
tmp := mulmod(mload(li), calldataload(ins), R_MOD)
pi_wo_commit := addmod(pi_wo_commit, tmp, R_MOD)
li := add(li, 0x20)
ins := add(ins, 0x20)
}
}
/// batch_compute_lagranges_at_z computes [L_0(z), .., L_{n-1}(z)]
@@ -577,32 +583,27 @@ contract PlonkVerifierForDataAggregation {
/// @param n_pub number of public inputs (number of Lagranges to compute)
/// @param mPtr pointer to which the results are stored
function batch_compute_lagranges_at_z(z, zpnmo, n_pub, mPtr) {
let zn := mulmod(zpnmo, VK_INV_DOMAIN_SIZE, R_MOD) // 1/n * (ζⁿ - 1)
let zn := mulmod(zpnmo, VK_INV_DOMAIN_SIZE, R_MOD) // 1/n * (ζⁿ - 1)
let _w := 1
let _mPtr := mPtr
for {
let i := 0
} lt(i, n_pub) {
i := add(i, 1)
} {
mstore(_mPtr, addmod(z, sub(R_MOD, _w), R_MOD))
for {let i:=0} lt(i,n_pub) {i:=add(i,1)}
{
mstore(_mPtr, addmod(z,sub(R_MOD, _w), R_MOD))
_w := mulmod(_w, VK_OMEGA, R_MOD)
_mPtr := add(_mPtr, 0x20)
}
batch_invert(mPtr, n_pub, _mPtr)
_mPtr := mPtr
_w := 1
for {
let i := 0
} lt(i, n_pub) {
i := add(i, 1)
} {
mstore(_mPtr, mulmod(mulmod(mload(_mPtr), zn, R_MOD), _w, R_MOD))
for {let i:=0} lt(i,n_pub) {i:=add(i,1)}
{
mstore(_mPtr, mulmod(mulmod(mload(_mPtr), zn , R_MOD), _w, R_MOD))
_mPtr := add(_mPtr, 0x20)
_w := mulmod(_w, VK_OMEGA, R_MOD)
}
}
}
/// @notice Montgomery trick for batch inversion mod R_MOD
/// @param ins pointer to the data to batch invert
@@ -611,11 +612,8 @@ contract PlonkVerifierForDataAggregation {
function batch_invert(ins, nb_ins, mPtr) {
mstore(mPtr, 1)
let offset := 0
for {
let i := 0
} lt(i, nb_ins) {
i := add(i, 1)
} {
for {let i:=0} lt(i, nb_ins) {i:=add(i,1)}
{
let prev := mload(add(mPtr, offset))
let cur := mload(add(ins, offset))
cur := mulmod(prev, cur, R_MOD)
@@ -624,12 +622,9 @@ contract PlonkVerifierForDataAggregation {
}
ins := add(ins, sub(offset, 0x20))
mPtr := add(mPtr, offset)
let inv := pow(mload(mPtr), sub(R_MOD, 2), add(mPtr, 0x20))
for {
let i := 0
} lt(i, nb_ins) {
i := add(i, 1)
} {
let inv := pow(mload(mPtr), sub(R_MOD,2), add(mPtr, 0x20))
for {let i:=0} lt(i, nb_ins) {i:=add(i,1)}
{
mPtr := sub(mPtr, 0x20)
let tmp := mload(ins)
let cur := mulmod(inv, mload(mPtr), R_MOD)
@@ -639,12 +634,14 @@ contract PlonkVerifierForDataAggregation {
}
}
/// Public inputs (the ones coming from the custom gate) contribution
/// @param aproof pointer to the proof
/// @param nb_public_inputs number of public inputs
/// @param mPtr pointer to free memory
/// @return pi_commit custom gate public inputs contribution
function sum_pi_commit(aproof, nb_public_inputs, mPtr) -> pi_commit {
function sum_pi_commit(aproof, nb_public_inputs, mPtr)->pi_commit {
let state := mload(0x40)
let z := mload(add(state, STATE_ZETA))
let zpnmo := mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE))
@@ -652,10 +649,14 @@ contract PlonkVerifierForDataAggregation {
let p := add(aproof, PROOF_BSB_COMMITMENTS)
let h_fr, ith_lagrange
h_fr := hash_fr(calldataload(p), calldataload(add(p, 0x20)), mPtr)
ith_lagrange := compute_ith_lagrange_at_z(z, zpnmo, add(nb_public_inputs, VK_INDEX_COMMIT_API_0), mPtr)
pi_commit := addmod(pi_commit, mulmod(h_fr, ith_lagrange, R_MOD), R_MOD)
}
/// Computes L_i(zeta) = ωⁱ/n * (ζⁿ-1)/(ζ-ωⁱ) where:
@@ -663,14 +664,16 @@ contract PlonkVerifierForDataAggregation {
/// @param zpmno ζⁿ-1
/// @param i i-th lagrange
/// @param mPtr free memory
/// @return res = ωⁱ/n * (ζⁿ-1)/(ζ-ωⁱ)
function compute_ith_lagrange_at_z(z, zpnmo, i, mPtr) -> res {
/// @return res = ωⁱ/n * (ζⁿ-1)/(ζ-ωⁱ)
function compute_ith_lagrange_at_z(z, zpnmo, i, mPtr)->res {
let w := pow(VK_OMEGA, i, mPtr) // w**i
i := addmod(z, sub(R_MOD, w), R_MOD) // z-w**i
w := mulmod(w, VK_INV_DOMAIN_SIZE, R_MOD) // w**i/n
i := pow(i, sub(R_MOD, 2), mPtr) // (z-w**i)**-1
i := pow(i, sub(R_MOD,2), mPtr) // (z-w**i)**-1
w := mulmod(w, i, R_MOD) // w**i/n*(z-w)**-1
res := mulmod(w, zpnmo, R_MOD)
}
/// @dev https://tools.ietf.org/html/draft-irtf-cfrg-hash-to-curve-06#section-5.2
@@ -678,14 +681,15 @@ contract PlonkVerifierForDataAggregation {
/// @param y y coordinate of a point on Bn254(𝔽_p)
/// @param mPtr free memory
/// @return res an element mod R_MOD
function hash_fr(x, y, mPtr) -> res {
function hash_fr(x, y, mPtr)->res {
// [0x00, .. , 0x00 || x, y, || 0, 48, 0, dst, HASH_FR_SIZE_DOMAIN]
// <- 64 bytes -> <-64b -> <- 1 bytes each ->
// [0x00, .., 0x00] 64 bytes of zero
mstore(mPtr, HASH_FR_ZERO_UINT256)
mstore(add(mPtr, 0x20), HASH_FR_ZERO_UINT256)
// msg = x || y , both on 32 bytes
mstore(add(mPtr, 0x40), x)
mstore(add(mPtr, 0x60), y)
@@ -721,7 +725,7 @@ contract PlonkVerifierForDataAggregation {
// [b0 || one || dst || HASH_FR_SIZE_DOMAIN]
// <-64bytes -> <- 1 byte each ->
mstore8(add(mPtr, 0x20), HASH_FR_ONE) // 1
mstore8(add(mPtr, 0x21), 0x42) // dst
mstore8(add(mPtr, 0x22), 0x53)
mstore8(add(mPtr, 0x23), 0x42)
@@ -773,8 +777,9 @@ contract PlonkVerifierForDataAggregation {
res := mulmod(mload(mPtr), HASH_FR_BB, R_MOD) // <- res = 2**128 * mPtr[:32]
let b1 := shr(128, mload(add(mPtr, 0x20))) // b1 <- [0, 0, .., 0 || b2[:16] ]
res := addmod(res, b1, R_MOD)
}
}
// END compute_pi -------------------------------------------------
/// @notice compute α² * 1/n * (ζ{n}-1)/(ζ - 1) where
@@ -782,7 +787,7 @@ contract PlonkVerifierForDataAggregation {
/// * n = vk_domain_size
/// * ω = vk_omega (generator of the multiplicative cyclic group of order n in (/r)*)
/// * ζ = zeta (challenge derived with Fiat Shamir)
function compute_alpha_square_lagrange_0() {
function compute_alpha_square_lagrange_0() {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
@@ -822,7 +827,7 @@ contract PlonkVerifierForDataAggregation {
mstore(add(mPtr, 0x100), mload(add(state, STATE_ZETA)))
mstore(add(mPtr, 0x120), mload(add(state, STATE_GAMMA_KZG)))
let random := staticcall(gas(), SHA2, mPtr, 0x140, mPtr, 0x20)
if iszero(random) {
if iszero(random){
error_random_generation()
}
random := mod(mload(mPtr), R_MOD) // use the same variable as we are one variable away from getting stack-too-deep error...
@@ -871,18 +876,18 @@ contract PlonkVerifierForDataAggregation {
mstore(folded_quotients_y, sub(P_MOD, mload(folded_quotients_y)))
mstore(mPtr, mload(folded_digests))
mstore(add(mPtr, 0x20), mload(add(folded_digests, 0x20)))
mstore(add(mPtr, 0x40), G2_SRS_0_X_0) // the 4 lines are the canonical G2 point on BN254
mstore(add(mPtr, 0x60), G2_SRS_0_X_1)
mstore(add(mPtr, 0x80), G2_SRS_0_Y_0)
mstore(add(mPtr, 0xa0), G2_SRS_0_Y_1)
mstore(add(mPtr, 0xc0), mload(folded_quotients))
mstore(add(mPtr, 0xe0), mload(add(folded_quotients, 0x20)))
mstore(add(mPtr, 0x100), G2_SRS_1_X_0)
mstore(add(mPtr, 0x120), G2_SRS_1_X_1)
mstore(add(mPtr, 0x140), G2_SRS_1_Y_0)
mstore(add(mPtr, 0x160), G2_SRS_1_Y_1)
mstore(add(mPtr, 0x20), mload(add(folded_digests, 0x20)))
mstore(add(mPtr, 0x40), G2_SRS_0_X_0) // the 4 lines are the canonical G2 point on BN254
mstore(add(mPtr, 0x60), G2_SRS_0_X_1)
mstore(add(mPtr, 0x80), G2_SRS_0_Y_0)
mstore(add(mPtr, 0xa0), G2_SRS_0_Y_1)
mstore(add(mPtr, 0xc0), mload(folded_quotients))
mstore(add(mPtr, 0xe0), mload(add(folded_quotients, 0x20)))
mstore(add(mPtr, 0x100), G2_SRS_1_X_0)
mstore(add(mPtr, 0x120), G2_SRS_1_X_1)
mstore(add(mPtr, 0x140), G2_SRS_1_Y_0)
mstore(add(mPtr, 0x160), G2_SRS_1_Y_1)
check_pairing_kzg(mPtr)
}
@@ -907,6 +912,7 @@ contract PlonkVerifierForDataAggregation {
/// @param aproof pointer to the proof
/// acc_gamma stores the γⁱ
function fold_state(aproof) {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
let mPtr20 := add(mPtr, 0x20)
@@ -943,14 +949,15 @@ contract PlonkVerifierForDataAggregation {
point_acc_mul(state_folded_digests, mPtr, acc_gamma, mPtr40)
fr_acc_mul_calldata(add(state, STATE_FOLDED_CLAIMED_VALUES), add(aproof, PROOF_S2_AT_ZETA), acc_gamma)
let poqaz := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
acc_gamma := mulmod(acc_gamma, l_gamma_kzg, R_MOD)
mstore(mPtr, VK_QCP_0_X)
mstore(mPtr20, VK_QCP_0_Y)
point_acc_mul(state_folded_digests, mPtr, acc_gamma, mPtr40)
fr_acc_mul_calldata(add(state, STATE_FOLDED_CLAIMED_VALUES), poqaz, acc_gamma)
poqaz := add(poqaz, 0x20)
}
}
/// @notice generate the challenge (using Fiat Shamir) to fold the opening proofs
/// at ζ.
@@ -968,22 +975,23 @@ contract PlonkVerifierForDataAggregation {
/// * Z(ζω)
/// @param aproof pointer to the proof
function compute_gamma_kzg(aproof) {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
mstore(mPtr, FS_GAMMA_KZG) // "gamma"
mstore(add(mPtr, 0x20), mload(add(state, STATE_ZETA)))
mstore(add(mPtr, 0x40), mload(add(state, STATE_LINEARISED_POLYNOMIAL_X)))
mstore(add(mPtr, 0x60), mload(add(state, STATE_LINEARISED_POLYNOMIAL_Y)))
mstore(add(mPtr,0x40), mload(add(state, STATE_LINEARISED_POLYNOMIAL_X)))
mstore(add(mPtr,0x60), mload(add(state, STATE_LINEARISED_POLYNOMIAL_Y)))
calldatacopy(add(mPtr, 0x80), add(aproof, PROOF_L_COM_X), 0xc0)
mstore(add(mPtr, 0x140), VK_S1_COM_X)
mstore(add(mPtr, 0x160), VK_S1_COM_Y)
mstore(add(mPtr, 0x180), VK_S2_COM_X)
mstore(add(mPtr, 0x1a0), VK_S2_COM_Y)
mstore(add(mPtr,0x140), VK_S1_COM_X)
mstore(add(mPtr,0x160), VK_S1_COM_Y)
mstore(add(mPtr,0x180), VK_S2_COM_X)
mstore(add(mPtr,0x1a0), VK_S2_COM_Y)
let offset := 0x1c0
mstore(add(mPtr, offset), VK_QCP_0_X)
mstore(add(mPtr, add(offset, 0x20)), VK_QCP_0_Y)
mstore(add(mPtr,offset), VK_QCP_0_X)
mstore(add(mPtr,add(offset, 0x20)), VK_QCP_0_Y)
offset := add(offset, 0x40)
mstore(add(mPtr, offset), mload(add(state, STATE_OPENING_LINEARISED_POLYNOMIAL_ZETA)))
mstore(add(mPtr, add(offset, 0x20)), calldataload(add(aproof, PROOF_L_AT_ZETA)))
@@ -994,23 +1002,18 @@ contract PlonkVerifierForDataAggregation {
let _mPtr := add(mPtr, add(offset, 0xc0))
let _poqaz := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
calldatacopy(_mPtr, _poqaz, mul(VK_NB_CUSTOM_GATES, 0x20))
_mPtr := add(_mPtr, mul(VK_NB_CUSTOM_GATES, 0x20))
mstore(_mPtr, calldataload(add(aproof, PROOF_GRAND_PRODUCT_AT_ZETA_OMEGA)))
let start_input := 0x1b // 00.."gamma"
let size_input := add(0x14, mul(VK_NB_CUSTOM_GATES, 3)) // number of 32bytes elmts = 0x14 (zeta+3*6 for the digests+openings) + 3*VK_NB_CUSTOM_GATES (for the commitments of the selectors) + 1 (opening of Z at ζω)
let size_input := add(0x14, mul(VK_NB_CUSTOM_GATES,3)) // number of 32bytes elmts = 0x14 (zeta+3*6 for the digests+openings) + 3*VK_NB_CUSTOM_GATES (for the commitments of the selectors) + 1 (opening of Z at ζω)
size_input := add(0x5, mul(size_input, 0x20)) // size in bytes: 15*32 bytes + 5 bytes for gamma
let check_staticcall := staticcall(
gas(),
SHA2,
add(mPtr, start_input),
size_input,
add(state, STATE_GAMMA_KZG),
0x20
)
let check_staticcall := staticcall(gas(), SHA2, add(mPtr,start_input), size_input, add(state, STATE_GAMMA_KZG), 0x20)
if iszero(check_staticcall) {
error_verify()
}
@@ -1018,6 +1021,7 @@ contract PlonkVerifierForDataAggregation {
}
function compute_commitment_linearised_polynomial_ec(aproof, s1, s2) {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
@@ -1062,6 +1066,7 @@ contract PlonkVerifierForDataAggregation {
add(mPtr, 0x40)
)
let qcp_opening_at_zeta := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
let bsb_commitments := add(aproof, PROOF_BSB_COMMITMENTS)
for {
@@ -1080,6 +1085,7 @@ contract PlonkVerifierForDataAggregation {
qcp_opening_at_zeta := add(qcp_opening_at_zeta, 0x20)
bsb_commitments := add(bsb_commitments, 0x40)
}
mstore(mPtr, VK_S3_COM_X)
mstore(add(mPtr, 0x20), VK_S3_COM_Y)
@@ -1090,11 +1096,10 @@ contract PlonkVerifierForDataAggregation {
point_acc_mul(add(state, STATE_LINEARISED_POLYNOMIAL_X), mPtr, s2, add(mPtr, 0x40))
point_add(
add(state, STATE_LINEARISED_POLYNOMIAL_X),
add(state, STATE_LINEARISED_POLYNOMIAL_X),
add(state, STATE_FOLDED_H_X),
mPtr
)
add(state, STATE_LINEARISED_POLYNOMIAL_X),
add(state, STATE_LINEARISED_POLYNOMIAL_X),
add(state, STATE_FOLDED_H_X),
mPtr)
}
/// @notice Compute the commitment to the linearized polynomial equal to
@@ -1161,25 +1166,10 @@ contract PlonkVerifierForDataAggregation {
let mPtr := add(mload(0x40), STATE_LAST_MEM)
let zeta_power_n_plus_two := pow(mload(add(state, STATE_ZETA)), n_plus_two, mPtr)
point_mul_calldata(add(state, STATE_FOLDED_H_X), add(aproof, PROOF_H_2_COM_X), zeta_power_n_plus_two, mPtr)
point_add_calldata(
add(state, STATE_FOLDED_H_X),
add(state, STATE_FOLDED_H_X),
add(aproof, PROOF_H_1_COM_X),
mPtr
)
point_add_calldata(add(state, STATE_FOLDED_H_X), add(state, STATE_FOLDED_H_X), add(aproof, PROOF_H_1_COM_X), mPtr)
point_mul(add(state, STATE_FOLDED_H_X), add(state, STATE_FOLDED_H_X), zeta_power_n_plus_two, mPtr)
point_add_calldata(
add(state, STATE_FOLDED_H_X),
add(state, STATE_FOLDED_H_X),
add(aproof, PROOF_H_0_COM_X),
mPtr
)
point_mul(
add(state, STATE_FOLDED_H_X),
add(state, STATE_FOLDED_H_X),
mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE)),
mPtr
)
point_add_calldata(add(state, STATE_FOLDED_H_X), add(state, STATE_FOLDED_H_X), add(aproof, PROOF_H_0_COM_X), mPtr)
point_mul(add(state, STATE_FOLDED_H_X), add(state, STATE_FOLDED_H_X), mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE)), mPtr)
let folded_h_y := mload(add(state, STATE_FOLDED_H_Y))
folded_h_y := sub(P_MOD, folded_h_y)
mstore(add(state, STATE_FOLDED_H_Y), folded_h_y)
@@ -1189,6 +1179,7 @@ contract PlonkVerifierForDataAggregation {
/// - [ PI(ζ) - α²*L₁(ζ) + α(l(ζ)+β*s1(ζ)+γ)(r(ζ)+β*s2(ζ)+γ)(o(ζ)+γ)*z(ωζ) ]
/// @param aproof pointer to the proof
function compute_opening_linearised_polynomial(aproof) {
let state := mload(0x40)
// (l(ζ)+β*s1(ζ)+γ)
@@ -1224,7 +1215,7 @@ contract PlonkVerifierForDataAggregation {
}
// BEGINNING utils math functions -------------------------------------------------
/// @param dst pointer storing the result
/// @param p pointer to the first point
/// @param q pointer to the second point
@@ -1234,7 +1225,7 @@ contract PlonkVerifierForDataAggregation {
mstore(add(mPtr, 0x20), mload(add(p, 0x20)))
mstore(add(mPtr, 0x40), mload(q))
mstore(add(mPtr, 0x60), mload(add(q, 0x20)))
let l_success := staticcall(gas(), EC_ADD, mPtr, 0x80, dst, 0x40)
let l_success := staticcall(gas(),EC_ADD,mPtr,0x80,dst,0x40)
if iszero(l_success) {
error_ec_op()
}
@@ -1259,11 +1250,11 @@ contract PlonkVerifierForDataAggregation {
/// @param src pointer to a point on Bn254(𝔽_p)
/// @param s scalar
/// @param mPtr free memory
function point_mul(dst, src, s, mPtr) {
mstore(mPtr, mload(src))
mstore(add(mPtr, 0x20), mload(add(src, 0x20)))
mstore(add(mPtr, 0x40), s)
let l_success := staticcall(gas(), EC_MUL, mPtr, 0x60, dst, 0x40)
function point_mul(dst,src,s, mPtr) {
mstore(mPtr,mload(src))
mstore(add(mPtr,0x20),mload(add(src,0x20)))
mstore(add(mPtr,0x40),s)
let l_success := staticcall(gas(),EC_MUL,mPtr,0x60,dst,0x40)
if iszero(l_success) {
error_ec_op()
}
@@ -1288,14 +1279,14 @@ contract PlonkVerifierForDataAggregation {
/// @param src pointer to the point to multiply and add
/// @param s scalar
/// @param mPtr free memory
function point_acc_mul(dst, src, s, mPtr) {
mstore(mPtr, mload(src))
mstore(add(mPtr, 0x20), mload(add(src, 0x20)))
mstore(add(mPtr, 0x40), s)
let l_success := staticcall(gas(), 7, mPtr, 0x60, mPtr, 0x40)
mstore(add(mPtr, 0x40), mload(dst))
mstore(add(mPtr, 0x60), mload(add(dst, 0x20)))
l_success := and(l_success, staticcall(gas(), EC_ADD, mPtr, 0x80, dst, 0x40))
function point_acc_mul(dst,src,s, mPtr) {
mstore(mPtr,mload(src))
mstore(add(mPtr,0x20),mload(add(src,0x20)))
mstore(add(mPtr,0x40),s)
let l_success := staticcall(gas(),7,mPtr,0x60,mPtr,0x40)
mstore(add(mPtr,0x40),mload(dst))
mstore(add(mPtr,0x60),mload(add(dst,0x20)))
l_success := and(l_success, staticcall(gas(),EC_ADD,mPtr,0x80,dst, 0x40))
if iszero(l_success) {
error_ec_op()
}
@@ -1324,7 +1315,7 @@ contract PlonkVerifierForDataAggregation {
/// @param src pointer to the scalar to multiply and add (on calldata)
/// @param s scalar
function fr_acc_mul_calldata(dst, src, s) {
let tmp := mulmod(calldataload(src), s, R_MOD)
let tmp := mulmod(calldataload(src), s, R_MOD)
mstore(dst, addmod(mload(dst), tmp, R_MOD))
}
@@ -1332,16 +1323,16 @@ contract PlonkVerifierForDataAggregation {
/// @param e exponent
/// @param mPtr free memory
/// @return res x ** e mod r
function pow(x, e, mPtr) -> res {
function pow(x, e, mPtr)->res {
mstore(mPtr, 0x20)
mstore(add(mPtr, 0x20), 0x20)
mstore(add(mPtr, 0x40), 0x20)
mstore(add(mPtr, 0x60), x)
mstore(add(mPtr, 0x80), e)
mstore(add(mPtr, 0xa0), R_MOD)
let check_staticcall := staticcall(gas(), MOD_EXP, mPtr, 0xc0, mPtr, 0x20)
let check_staticcall := staticcall(gas(),MOD_EXP,mPtr,0xc0,mPtr,0x20)
if eq(check_staticcall, 0) {
error_mod_exp()
error_mod_exp()
}
res := mload(mPtr)
}

View File

@@ -19,29 +19,28 @@
pragma solidity 0.8.26;
contract TestPlonkVerifierForDataAggregation {
uint256 private constant R_MOD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
uint256 private constant R_MOD_MINUS_ONE =
21888242871839275222246405745257275088548364400416034343698204186575808495616;
uint256 private constant P_MOD = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
uint256 private constant R_MOD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
uint256 private constant R_MOD_MINUS_ONE = 21888242871839275222246405745257275088548364400416034343698204186575808495616;
uint256 private constant P_MOD = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
uint256 private constant G2_SRS_0_X_0 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;
uint256 private constant G2_SRS_0_X_1 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;
uint256 private constant G2_SRS_0_Y_0 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
uint256 private constant G2_SRS_0_Y_1 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;
uint256 private constant G2_SRS_1_X_0 = 15805639136721018565402881920352193254830339253282065586954346329754995870280;
uint256 private constant G2_SRS_1_X_1 = 19089565590083334368588890253123139704298730990782503769911324779715431555531;
uint256 private constant G2_SRS_1_Y_0 = 9779648407879205346559610309258181044130619080926897934572699915909528404984;
uint256 private constant G2_SRS_1_Y_1 = 6779728121489434657638426458390319301070371227460768374343986326751507916979;
uint256 private constant G1_SRS_X = 14312776538779914388377568895031746459131577658076416373430523308756343304251;
uint256 private constant G1_SRS_Y = 11763105256161367503191792604679297387056316997144156930871823008787082098465;
// ----------------------- vk ---------------------
uint256 private constant VK_NB_PUBLIC_INPUTS = 1;
uint256 private constant VK_DOMAIN_SIZE = 16;
uint256 private constant VK_INV_DOMAIN_SIZE =
20520227692349320520856005386178695395514091625390032197217066424914820464641;
uint256 private constant VK_INV_DOMAIN_SIZE = 20520227692349320520856005386178695395514091625390032197217066424914820464641;
uint256 private constant VK_OMEGA = 14940766826517323942636479241147756311199852622225275649687664389641784935947;
uint256 private constant VK_QL_COM_X = 3767637989833674092151354229632559107224950590673664856842061399469467338879;
uint256 private constant VK_QL_COM_Y = 18545409996679466114224178746162553880737296402729089689774308937082946761979;
@@ -53,21 +52,23 @@ contract TestPlonkVerifierForDataAggregation {
uint256 private constant VK_QO_COM_Y = 10782414695040549646706468913781794882209258381887890407509684555513355143197;
uint256 private constant VK_QK_COM_X = 309591480144351325314158474719361148480191595146291661238142838254651436989;
uint256 private constant VK_QK_COM_Y = 12063173869829536468830946547606069911666129778788708678515573607390482939756;
uint256 private constant VK_S1_COM_X = 12287072751694848944507699577006619791724925439540371477056092891137357229312;
uint256 private constant VK_S1_COM_Y = 2469356406782415219782253630635766217009619642857495098799013714324696399305;
uint256 private constant VK_S2_COM_X = 17261757720471042341269061128759148572672168808566386603388432325173708264418;
uint256 private constant VK_S2_COM_Y = 20976565876611279190744172824963243461988367679364518747954008723085439460611;
uint256 private constant VK_S3_COM_X = 18758025488249277181117376239193628449359868741625564388668468130204669284937;
uint256 private constant VK_S3_COM_Y = 15566903578741238761792344329051427316196307361197991677131114502821508927172;
uint256 private constant VK_COSET_SHIFT = 5;
uint256 private constant VK_QCP_0_X = 4559262075452024065272338216146989708834054079507534161096300708463935456394;
uint256 private constant VK_QCP_0_Y = 1898950104727986554890445533779776634695458253078091580309593009754027486622;
uint256 private constant VK_INDEX_COMMIT_API_0 = 5;
uint256 private constant VK_NB_CUSTOM_GATES = 1;
@@ -77,7 +78,7 @@ contract TestPlonkVerifierForDataAggregation {
uint256 private constant FIXED_PROOF_SIZE = 0x300;
// offset proof
uint256 private constant PROOF_L_COM_X = 0x0;
uint256 private constant PROOF_L_COM_Y = 0x20;
uint256 private constant PROOF_R_COM_X = 0x40;
@@ -121,7 +122,7 @@ contract TestPlonkVerifierForDataAggregation {
// -------- offset state
// challenges to check the claimed quotient
uint256 private constant STATE_ALPHA = 0x0;
uint256 private constant STATE_BETA = 0x20;
uint256 private constant STATE_GAMMA = 0x40;
@@ -152,13 +153,15 @@ contract TestPlonkVerifierForDataAggregation {
// -------- errors
uint256 private constant ERROR_STRING_ID = 0x08c379a000000000000000000000000000000000000000000000000000000000; // selector for function Error(string)
// -------- utils (for hash_fr)
uint256 private constant HASH_FR_BB = 340282366920938463463374607431768211456; // 2**128
uint256 private constant HASH_FR_ZERO_UINT256 = 0;
uint8 private constant HASH_FR_LEN_IN_BYTES = 48;
uint8 private constant HASH_FR_SIZE_DOMAIN = 11;
uint8 private constant HASH_FR_ONE = 1;
uint8 private constant HASH_FR_TWO = 2;
uint256 private constant HASH_FR_BB = 340282366920938463463374607431768211456; // 2**128
uint256 private constant HASH_FR_ZERO_UINT256 = 0;
uint8 private constant HASH_FR_LEN_IN_BYTES = 48;
uint8 private constant HASH_FR_SIZE_DOMAIN = 11;
uint8 private constant HASH_FR_ONE = 1;
uint8 private constant HASH_FR_TWO = 2;
// -------- precompiles
uint8 private constant SHA2 = 0x2;
@@ -166,14 +169,17 @@ contract TestPlonkVerifierForDataAggregation {
uint8 private constant EC_ADD = 0x6;
uint8 private constant EC_MUL = 0x7;
uint8 private constant EC_PAIR = 0x8;
/// Verify a Plonk proof.
/// Reverts if the proof or the public inputs are malformed.
/// @param proof serialised plonk proof (using gnark's MarshalSolidity)
/// @param public_inputs (must be reduced)
/// @return success true if the proof passes false otherwise
function Verify(bytes calldata proof, uint256[] calldata public_inputs) public view returns (bool success) {
function Verify(bytes calldata proof, uint256[] calldata public_inputs)
public view returns(bool success) {
assembly {
let mem := mload(0x40)
let freeMem := add(mem, STATE_LAST_MEM)
@@ -305,23 +311,20 @@ contract TestPlonkVerifierForDataAggregation {
// end errors -------------------------------------------------
// Beginning checks -------------------------------------------------
/// @param s actual number of public inputs
function check_number_of_public_inputs(s) {
if iszero(eq(s, VK_NB_PUBLIC_INPUTS)) {
error_nb_public_inputs()
}
}
/// Checks that the public inputs are < R_MOD.
/// @param s number of public inputs
/// @param p pointer to the public inputs array
function check_inputs_size(s, p) {
for {
let i
} lt(i, s) {
i := add(i, 1)
} {
for {let i} lt(i, s) {i:=add(i,1)}
{
if gt(calldataload(p), R_MOD_MINUS_ONE) {
error_inputs_size()
}
@@ -332,16 +335,17 @@ contract TestPlonkVerifierForDataAggregation {
/// Checks if the proof is of the correct size
/// @param actual_proof_size size of the proof (not the expected size)
function check_proof_size(actual_proof_size) {
let expected_proof_size := add(FIXED_PROOF_SIZE, mul(VK_NB_CUSTOM_GATES, 0x60))
let expected_proof_size := add(FIXED_PROOF_SIZE, mul(VK_NB_CUSTOM_GATES,0x60))
if iszero(eq(actual_proof_size, expected_proof_size)) {
error_proof_size()
error_proof_size()
}
}
/// Checks if the multiple openings of the polynomials are < R_MOD.
/// @param aproof pointer to the beginning of the proof
/// @dev the 'a' prepending proof is to have a local name
function check_proof_openings_size(aproof) {
// PROOF_L_AT_ZETA
let p := add(aproof, PROOF_L_AT_ZETA)
if gt(calldataload(p), R_MOD_MINUS_ONE) {
@@ -365,7 +369,7 @@ contract TestPlonkVerifierForDataAggregation {
if gt(calldataload(p), R_MOD_MINUS_ONE) {
error_proof_openings_size()
}
// PROOF_S2_AT_ZETA
p := add(aproof, PROOF_S2_AT_ZETA)
if gt(calldataload(p), R_MOD_MINUS_ONE) {
@@ -379,18 +383,16 @@ contract TestPlonkVerifierForDataAggregation {
}
// PROOF_OPENING_QCP_AT_ZETA
p := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
for {
let i := 0
} lt(i, VK_NB_CUSTOM_GATES) {
i := add(i, 1)
} {
for {let i:=0} lt(i, VK_NB_CUSTOM_GATES) {i:=add(i,1)}
{
if gt(calldataload(p), R_MOD_MINUS_ONE) {
error_proof_openings_size()
}
p := add(p, 0x20)
}
}
// end checks -------------------------------------------------
@@ -412,32 +414,34 @@ contract TestPlonkVerifierForDataAggregation {
/// and is encoded as a uint256 number n. In basis b = 256, the number looks like this
/// [0 0 0 .. 0x67 0x61 0x6d, 0x6d, 0x61]. The first non zero entry is at position 27=0x1b
/// Gamma reduced (the actual challenge) is stored at add(state, state_gamma)
function derive_gamma(aproof, nb_pi, pi) -> gamma_not_reduced {
function derive_gamma(aproof, nb_pi, pi)->gamma_not_reduced {
let state := mload(0x40)
let mPtr := add(state, STATE_LAST_MEM)
mstore(mPtr, FS_GAMMA) // "gamma"
mstore(add(mPtr, 0x20), VK_S1_COM_X)
mstore(add(mPtr, 0x40), VK_S1_COM_Y)
mstore(add(mPtr, 0x60), VK_S2_COM_X)
mstore(add(mPtr, 0x80), VK_S2_COM_Y)
mstore(add(mPtr, 0xa0), VK_S3_COM_X)
mstore(add(mPtr, 0xc0), VK_S3_COM_Y)
mstore(add(mPtr, 0xe0), VK_QL_COM_X)
mstore(add(mPtr, 0x100), VK_QL_COM_Y)
mstore(add(mPtr, 0x120), VK_QR_COM_X)
mstore(add(mPtr, 0x140), VK_QR_COM_Y)
mstore(add(mPtr, 0x160), VK_QM_COM_X)
mstore(add(mPtr, 0x180), VK_QM_COM_Y)
mstore(add(mPtr, 0x1a0), VK_QO_COM_X)
mstore(add(mPtr, 0x1c0), VK_QO_COM_Y)
mstore(add(mPtr, 0x1e0), VK_QK_COM_X)
mstore(add(mPtr, 0x200), VK_QK_COM_Y)
mstore(add(mPtr, 0x220), VK_QCP_0_X)
mstore(add(mPtr, 0x240), VK_QCP_0_Y)
mstore(add(mPtr, 0x20), VK_S1_COM_X)
mstore(add(mPtr, 0x40), VK_S1_COM_Y)
mstore(add(mPtr, 0x60), VK_S2_COM_X)
mstore(add(mPtr, 0x80), VK_S2_COM_Y)
mstore(add(mPtr, 0xa0), VK_S3_COM_X)
mstore(add(mPtr, 0xc0), VK_S3_COM_Y)
mstore(add(mPtr, 0xe0), VK_QL_COM_X)
mstore(add(mPtr, 0x100), VK_QL_COM_Y)
mstore(add(mPtr, 0x120), VK_QR_COM_X)
mstore(add(mPtr, 0x140), VK_QR_COM_Y)
mstore(add(mPtr, 0x160), VK_QM_COM_X)
mstore(add(mPtr, 0x180), VK_QM_COM_Y)
mstore(add(mPtr, 0x1a0), VK_QO_COM_X)
mstore(add(mPtr, 0x1c0), VK_QO_COM_Y)
mstore(add(mPtr, 0x1e0), VK_QK_COM_X)
mstore(add(mPtr, 0x200), VK_QK_COM_Y)
mstore(add(mPtr, 0x220), VK_QCP_0_X)
mstore(add(mPtr, 0x240), VK_QCP_0_Y)
// public inputs
let _mPtr := add(mPtr, 0x260)
let size_pi_in_bytes := mul(nb_pi, 0x20)
@@ -454,7 +458,7 @@ contract TestPlonkVerifierForDataAggregation {
// + nb_public_inputs*0x20
// + nb_custom gates*0x40
let size := add(0x2c5, size_pi_in_bytes)
size := add(size, mul(VK_NB_CUSTOM_GATES, 0x40))
let l_success := staticcall(gas(), SHA2, add(mPtr, 0x1b), size, mPtr, 0x20) //0x1b -> 000.."gamma"
if iszero(l_success) {
@@ -469,7 +473,8 @@ contract TestPlonkVerifierForDataAggregation {
/// @return beta_not_reduced the next challenge, beta, not reduced
/// @notice the transcript consists of the previous challenge only.
/// The reduced version of beta is stored at add(state, state_beta)
function derive_beta(gamma_not_reduced) -> beta_not_reduced {
function derive_beta(gamma_not_reduced)->beta_not_reduced{
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
@@ -490,8 +495,9 @@ contract TestPlonkVerifierForDataAggregation {
/// @return alpha_not_reduced the next challenge, alpha, not reduced
/// @notice the transcript consists of the previous challenge (beta)
/// not reduced, the commitments to the wires associated to the QCP_i,
/// and the commitment to the grand product polynomial
function derive_alpha(aproof, beta_not_reduced) -> alpha_not_reduced {
/// and the commitment to the grand product polynomial
function derive_alpha(aproof, beta_not_reduced)->alpha_not_reduced {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
let full_size := 0x65 // size("alpha") + 0x20 (previous challenge)
@@ -501,14 +507,14 @@ contract TestPlonkVerifierForDataAggregation {
let _mPtr := add(mPtr, 0x20)
mstore(_mPtr, beta_not_reduced)
_mPtr := add(_mPtr, 0x20)
// Bsb22Commitments
let proof_bsb_commitments := add(aproof, PROOF_BSB_COMMITMENTS)
let size_bsb_commitments := mul(0x40, VK_NB_CUSTOM_GATES)
calldatacopy(_mPtr, proof_bsb_commitments, size_bsb_commitments)
_mPtr := add(_mPtr, size_bsb_commitments)
full_size := add(full_size, size_bsb_commitments)
// [Z], the commitment to the grand product polynomial
calldatacopy(_mPtr, add(aproof, PROOF_GRAND_PRODUCT_COMMITMENT_X), 0x40)
let l_success := staticcall(gas(), SHA2, add(mPtr, 0x1b), full_size, mPtr, 0x20)
@@ -526,6 +532,7 @@ contract TestPlonkVerifierForDataAggregation {
/// The transcript consists of the previous challenge and the commitment to
/// the quotient polynomial h.
function derive_zeta(aproof, alpha_not_reduced) {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
@@ -550,7 +557,8 @@ contract TestPlonkVerifierForDataAggregation {
/// @param n number of public inputs
/// @param mPtr free memory
/// @return pi_wo_commit public inputs contribution (except the public inputs coming from the custom gate)
function sum_pi_wo_api_commit(ins, n, mPtr) -> pi_wo_commit {
function sum_pi_wo_api_commit(ins, n, mPtr)->pi_wo_commit {
let state := mload(0x40)
let z := mload(add(state, STATE_ZETA))
let zpnmo := mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE))
@@ -559,16 +567,14 @@ contract TestPlonkVerifierForDataAggregation {
batch_compute_lagranges_at_z(z, zpnmo, n, li)
let tmp := 0
for {
let i := 0
} lt(i, n) {
i := add(i, 1)
} {
for {let i:=0} lt(i,n) {i:=add(i,1)}
{
tmp := mulmod(mload(li), calldataload(ins), R_MOD)
pi_wo_commit := addmod(pi_wo_commit, tmp, R_MOD)
li := add(li, 0x20)
ins := add(ins, 0x20)
}
}
/// batch_compute_lagranges_at_z computes [L_0(z), .., L_{n-1}(z)]
@@ -577,32 +583,27 @@ contract TestPlonkVerifierForDataAggregation {
/// @param n_pub number of public inputs (number of Lagranges to compute)
/// @param mPtr pointer to which the results are stored
function batch_compute_lagranges_at_z(z, zpnmo, n_pub, mPtr) {
let zn := mulmod(zpnmo, VK_INV_DOMAIN_SIZE, R_MOD) // 1/n * (ζⁿ - 1)
let zn := mulmod(zpnmo, VK_INV_DOMAIN_SIZE, R_MOD) // 1/n * (ζⁿ - 1)
let _w := 1
let _mPtr := mPtr
for {
let i := 0
} lt(i, n_pub) {
i := add(i, 1)
} {
mstore(_mPtr, addmod(z, sub(R_MOD, _w), R_MOD))
for {let i:=0} lt(i,n_pub) {i:=add(i,1)}
{
mstore(_mPtr, addmod(z,sub(R_MOD, _w), R_MOD))
_w := mulmod(_w, VK_OMEGA, R_MOD)
_mPtr := add(_mPtr, 0x20)
}
batch_invert(mPtr, n_pub, _mPtr)
_mPtr := mPtr
_w := 1
for {
let i := 0
} lt(i, n_pub) {
i := add(i, 1)
} {
mstore(_mPtr, mulmod(mulmod(mload(_mPtr), zn, R_MOD), _w, R_MOD))
for {let i:=0} lt(i,n_pub) {i:=add(i,1)}
{
mstore(_mPtr, mulmod(mulmod(mload(_mPtr), zn , R_MOD), _w, R_MOD))
_mPtr := add(_mPtr, 0x20)
_w := mulmod(_w, VK_OMEGA, R_MOD)
}
}
}
/// @notice Montgomery trick for batch inversion mod R_MOD
/// @param ins pointer to the data to batch invert
@@ -611,11 +612,8 @@ contract TestPlonkVerifierForDataAggregation {
function batch_invert(ins, nb_ins, mPtr) {
mstore(mPtr, 1)
let offset := 0
for {
let i := 0
} lt(i, nb_ins) {
i := add(i, 1)
} {
for {let i:=0} lt(i, nb_ins) {i:=add(i,1)}
{
let prev := mload(add(mPtr, offset))
let cur := mload(add(ins, offset))
cur := mulmod(prev, cur, R_MOD)
@@ -624,12 +622,9 @@ contract TestPlonkVerifierForDataAggregation {
}
ins := add(ins, sub(offset, 0x20))
mPtr := add(mPtr, offset)
let inv := pow(mload(mPtr), sub(R_MOD, 2), add(mPtr, 0x20))
for {
let i := 0
} lt(i, nb_ins) {
i := add(i, 1)
} {
let inv := pow(mload(mPtr), sub(R_MOD,2), add(mPtr, 0x20))
for {let i:=0} lt(i, nb_ins) {i:=add(i,1)}
{
mPtr := sub(mPtr, 0x20)
let tmp := mload(ins)
let cur := mulmod(inv, mload(mPtr), R_MOD)
@@ -639,12 +634,14 @@ contract TestPlonkVerifierForDataAggregation {
}
}
/// Public inputs (the ones coming from the custom gate) contribution
/// @param aproof pointer to the proof
/// @param nb_public_inputs number of public inputs
/// @param mPtr pointer to free memory
/// @return pi_commit custom gate public inputs contribution
function sum_pi_commit(aproof, nb_public_inputs, mPtr) -> pi_commit {
function sum_pi_commit(aproof, nb_public_inputs, mPtr)->pi_commit {
let state := mload(0x40)
let z := mload(add(state, STATE_ZETA))
let zpnmo := mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE))
@@ -652,10 +649,14 @@ contract TestPlonkVerifierForDataAggregation {
let p := add(aproof, PROOF_BSB_COMMITMENTS)
let h_fr, ith_lagrange
h_fr := hash_fr(calldataload(p), calldataload(add(p, 0x20)), mPtr)
ith_lagrange := compute_ith_lagrange_at_z(z, zpnmo, add(nb_public_inputs, VK_INDEX_COMMIT_API_0), mPtr)
pi_commit := addmod(pi_commit, mulmod(h_fr, ith_lagrange, R_MOD), R_MOD)
}
/// Computes L_i(zeta) = ωⁱ/n * (ζⁿ-1)/(ζ-ωⁱ) where:
@@ -663,14 +664,16 @@ contract TestPlonkVerifierForDataAggregation {
/// @param zpmno ζⁿ-1
/// @param i i-th lagrange
/// @param mPtr free memory
/// @return res = ωⁱ/n * (ζⁿ-1)/(ζ-ωⁱ)
function compute_ith_lagrange_at_z(z, zpnmo, i, mPtr) -> res {
/// @return res = ωⁱ/n * (ζⁿ-1)/(ζ-ωⁱ)
function compute_ith_lagrange_at_z(z, zpnmo, i, mPtr)->res {
let w := pow(VK_OMEGA, i, mPtr) // w**i
i := addmod(z, sub(R_MOD, w), R_MOD) // z-w**i
w := mulmod(w, VK_INV_DOMAIN_SIZE, R_MOD) // w**i/n
i := pow(i, sub(R_MOD, 2), mPtr) // (z-w**i)**-1
i := pow(i, sub(R_MOD,2), mPtr) // (z-w**i)**-1
w := mulmod(w, i, R_MOD) // w**i/n*(z-w)**-1
res := mulmod(w, zpnmo, R_MOD)
}
/// @dev https://tools.ietf.org/html/draft-irtf-cfrg-hash-to-curve-06#section-5.2
@@ -678,14 +681,15 @@ contract TestPlonkVerifierForDataAggregation {
/// @param y y coordinate of a point on Bn254(𝔽_p)
/// @param mPtr free memory
/// @return res an element mod R_MOD
function hash_fr(x, y, mPtr) -> res {
function hash_fr(x, y, mPtr)->res {
// [0x00, .. , 0x00 || x, y, || 0, 48, 0, dst, HASH_FR_SIZE_DOMAIN]
// <- 64 bytes -> <-64b -> <- 1 bytes each ->
// [0x00, .., 0x00] 64 bytes of zero
mstore(mPtr, HASH_FR_ZERO_UINT256)
mstore(add(mPtr, 0x20), HASH_FR_ZERO_UINT256)
// msg = x || y , both on 32 bytes
mstore(add(mPtr, 0x40), x)
mstore(add(mPtr, 0x60), y)
@@ -721,7 +725,7 @@ contract TestPlonkVerifierForDataAggregation {
// [b0 || one || dst || HASH_FR_SIZE_DOMAIN]
// <-64bytes -> <- 1 byte each ->
mstore8(add(mPtr, 0x20), HASH_FR_ONE) // 1
mstore8(add(mPtr, 0x21), 0x42) // dst
mstore8(add(mPtr, 0x22), 0x53)
mstore8(add(mPtr, 0x23), 0x42)
@@ -773,8 +777,9 @@ contract TestPlonkVerifierForDataAggregation {
res := mulmod(mload(mPtr), HASH_FR_BB, R_MOD) // <- res = 2**128 * mPtr[:32]
let b1 := shr(128, mload(add(mPtr, 0x20))) // b1 <- [0, 0, .., 0 || b2[:16] ]
res := addmod(res, b1, R_MOD)
}
}
// END compute_pi -------------------------------------------------
/// @notice compute α² * 1/n * (ζ{n}-1)/(ζ - 1) where
@@ -782,7 +787,7 @@ contract TestPlonkVerifierForDataAggregation {
/// * n = vk_domain_size
/// * ω = vk_omega (generator of the multiplicative cyclic group of order n in (/r)*)
/// * ζ = zeta (challenge derived with Fiat Shamir)
function compute_alpha_square_lagrange_0() {
function compute_alpha_square_lagrange_0() {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
@@ -822,7 +827,7 @@ contract TestPlonkVerifierForDataAggregation {
mstore(add(mPtr, 0x100), mload(add(state, STATE_ZETA)))
mstore(add(mPtr, 0x120), mload(add(state, STATE_GAMMA_KZG)))
let random := staticcall(gas(), SHA2, mPtr, 0x140, mPtr, 0x20)
if iszero(random) {
if iszero(random){
error_random_generation()
}
random := mod(mload(mPtr), R_MOD) // use the same variable as we are one variable away from getting stack-too-deep error...
@@ -871,18 +876,18 @@ contract TestPlonkVerifierForDataAggregation {
mstore(folded_quotients_y, sub(P_MOD, mload(folded_quotients_y)))
mstore(mPtr, mload(folded_digests))
mstore(add(mPtr, 0x20), mload(add(folded_digests, 0x20)))
mstore(add(mPtr, 0x40), G2_SRS_0_X_0) // the 4 lines are the canonical G2 point on BN254
mstore(add(mPtr, 0x60), G2_SRS_0_X_1)
mstore(add(mPtr, 0x80), G2_SRS_0_Y_0)
mstore(add(mPtr, 0xa0), G2_SRS_0_Y_1)
mstore(add(mPtr, 0xc0), mload(folded_quotients))
mstore(add(mPtr, 0xe0), mload(add(folded_quotients, 0x20)))
mstore(add(mPtr, 0x100), G2_SRS_1_X_0)
mstore(add(mPtr, 0x120), G2_SRS_1_X_1)
mstore(add(mPtr, 0x140), G2_SRS_1_Y_0)
mstore(add(mPtr, 0x160), G2_SRS_1_Y_1)
mstore(add(mPtr, 0x20), mload(add(folded_digests, 0x20)))
mstore(add(mPtr, 0x40), G2_SRS_0_X_0) // the 4 lines are the canonical G2 point on BN254
mstore(add(mPtr, 0x60), G2_SRS_0_X_1)
mstore(add(mPtr, 0x80), G2_SRS_0_Y_0)
mstore(add(mPtr, 0xa0), G2_SRS_0_Y_1)
mstore(add(mPtr, 0xc0), mload(folded_quotients))
mstore(add(mPtr, 0xe0), mload(add(folded_quotients, 0x20)))
mstore(add(mPtr, 0x100), G2_SRS_1_X_0)
mstore(add(mPtr, 0x120), G2_SRS_1_X_1)
mstore(add(mPtr, 0x140), G2_SRS_1_Y_0)
mstore(add(mPtr, 0x160), G2_SRS_1_Y_1)
check_pairing_kzg(mPtr)
}
@@ -907,6 +912,7 @@ contract TestPlonkVerifierForDataAggregation {
/// @param aproof pointer to the proof
/// acc_gamma stores the γⁱ
function fold_state(aproof) {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
let mPtr20 := add(mPtr, 0x20)
@@ -943,14 +949,15 @@ contract TestPlonkVerifierForDataAggregation {
point_acc_mul(state_folded_digests, mPtr, acc_gamma, mPtr40)
fr_acc_mul_calldata(add(state, STATE_FOLDED_CLAIMED_VALUES), add(aproof, PROOF_S2_AT_ZETA), acc_gamma)
let poqaz := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
acc_gamma := mulmod(acc_gamma, l_gamma_kzg, R_MOD)
mstore(mPtr, VK_QCP_0_X)
mstore(mPtr20, VK_QCP_0_Y)
point_acc_mul(state_folded_digests, mPtr, acc_gamma, mPtr40)
fr_acc_mul_calldata(add(state, STATE_FOLDED_CLAIMED_VALUES), poqaz, acc_gamma)
poqaz := add(poqaz, 0x20)
}
}
/// @notice generate the challenge (using Fiat Shamir) to fold the opening proofs
/// at ζ.
@@ -968,22 +975,23 @@ contract TestPlonkVerifierForDataAggregation {
/// * Z(ζω)
/// @param aproof pointer to the proof
function compute_gamma_kzg(aproof) {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
mstore(mPtr, FS_GAMMA_KZG) // "gamma"
mstore(add(mPtr, 0x20), mload(add(state, STATE_ZETA)))
mstore(add(mPtr, 0x40), mload(add(state, STATE_LINEARISED_POLYNOMIAL_X)))
mstore(add(mPtr, 0x60), mload(add(state, STATE_LINEARISED_POLYNOMIAL_Y)))
mstore(add(mPtr,0x40), mload(add(state, STATE_LINEARISED_POLYNOMIAL_X)))
mstore(add(mPtr,0x60), mload(add(state, STATE_LINEARISED_POLYNOMIAL_Y)))
calldatacopy(add(mPtr, 0x80), add(aproof, PROOF_L_COM_X), 0xc0)
mstore(add(mPtr, 0x140), VK_S1_COM_X)
mstore(add(mPtr, 0x160), VK_S1_COM_Y)
mstore(add(mPtr, 0x180), VK_S2_COM_X)
mstore(add(mPtr, 0x1a0), VK_S2_COM_Y)
mstore(add(mPtr,0x140), VK_S1_COM_X)
mstore(add(mPtr,0x160), VK_S1_COM_Y)
mstore(add(mPtr,0x180), VK_S2_COM_X)
mstore(add(mPtr,0x1a0), VK_S2_COM_Y)
let offset := 0x1c0
mstore(add(mPtr, offset), VK_QCP_0_X)
mstore(add(mPtr, add(offset, 0x20)), VK_QCP_0_Y)
mstore(add(mPtr,offset), VK_QCP_0_X)
mstore(add(mPtr,add(offset, 0x20)), VK_QCP_0_Y)
offset := add(offset, 0x40)
mstore(add(mPtr, offset), mload(add(state, STATE_OPENING_LINEARISED_POLYNOMIAL_ZETA)))
mstore(add(mPtr, add(offset, 0x20)), calldataload(add(aproof, PROOF_L_AT_ZETA)))
@@ -994,23 +1002,18 @@ contract TestPlonkVerifierForDataAggregation {
let _mPtr := add(mPtr, add(offset, 0xc0))
let _poqaz := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
calldatacopy(_mPtr, _poqaz, mul(VK_NB_CUSTOM_GATES, 0x20))
_mPtr := add(_mPtr, mul(VK_NB_CUSTOM_GATES, 0x20))
mstore(_mPtr, calldataload(add(aproof, PROOF_GRAND_PRODUCT_AT_ZETA_OMEGA)))
let start_input := 0x1b // 00.."gamma"
let size_input := add(0x14, mul(VK_NB_CUSTOM_GATES, 3)) // number of 32bytes elmts = 0x14 (zeta+3*6 for the digests+openings) + 3*VK_NB_CUSTOM_GATES (for the commitments of the selectors) + 1 (opening of Z at ζω)
let size_input := add(0x14, mul(VK_NB_CUSTOM_GATES,3)) // number of 32bytes elmts = 0x14 (zeta+3*6 for the digests+openings) + 3*VK_NB_CUSTOM_GATES (for the commitments of the selectors) + 1 (opening of Z at ζω)
size_input := add(0x5, mul(size_input, 0x20)) // size in bytes: 15*32 bytes + 5 bytes for gamma
let check_staticcall := staticcall(
gas(),
SHA2,
add(mPtr, start_input),
size_input,
add(state, STATE_GAMMA_KZG),
0x20
)
let check_staticcall := staticcall(gas(), SHA2, add(mPtr,start_input), size_input, add(state, STATE_GAMMA_KZG), 0x20)
if iszero(check_staticcall) {
error_verify()
}
@@ -1018,6 +1021,7 @@ contract TestPlonkVerifierForDataAggregation {
}
function compute_commitment_linearised_polynomial_ec(aproof, s1, s2) {
let state := mload(0x40)
let mPtr := add(mload(0x40), STATE_LAST_MEM)
@@ -1062,6 +1066,7 @@ contract TestPlonkVerifierForDataAggregation {
add(mPtr, 0x40)
)
let qcp_opening_at_zeta := add(aproof, PROOF_OPENING_QCP_AT_ZETA)
let bsb_commitments := add(aproof, PROOF_BSB_COMMITMENTS)
for {
@@ -1080,6 +1085,7 @@ contract TestPlonkVerifierForDataAggregation {
qcp_opening_at_zeta := add(qcp_opening_at_zeta, 0x20)
bsb_commitments := add(bsb_commitments, 0x40)
}
mstore(mPtr, VK_S3_COM_X)
mstore(add(mPtr, 0x20), VK_S3_COM_Y)
@@ -1090,11 +1096,10 @@ contract TestPlonkVerifierForDataAggregation {
point_acc_mul(add(state, STATE_LINEARISED_POLYNOMIAL_X), mPtr, s2, add(mPtr, 0x40))
point_add(
add(state, STATE_LINEARISED_POLYNOMIAL_X),
add(state, STATE_LINEARISED_POLYNOMIAL_X),
add(state, STATE_FOLDED_H_X),
mPtr
)
add(state, STATE_LINEARISED_POLYNOMIAL_X),
add(state, STATE_LINEARISED_POLYNOMIAL_X),
add(state, STATE_FOLDED_H_X),
mPtr)
}
/// @notice Compute the commitment to the linearized polynomial equal to
@@ -1161,25 +1166,10 @@ contract TestPlonkVerifierForDataAggregation {
let mPtr := add(mload(0x40), STATE_LAST_MEM)
let zeta_power_n_plus_two := pow(mload(add(state, STATE_ZETA)), n_plus_two, mPtr)
point_mul_calldata(add(state, STATE_FOLDED_H_X), add(aproof, PROOF_H_2_COM_X), zeta_power_n_plus_two, mPtr)
point_add_calldata(
add(state, STATE_FOLDED_H_X),
add(state, STATE_FOLDED_H_X),
add(aproof, PROOF_H_1_COM_X),
mPtr
)
point_add_calldata(add(state, STATE_FOLDED_H_X), add(state, STATE_FOLDED_H_X), add(aproof, PROOF_H_1_COM_X), mPtr)
point_mul(add(state, STATE_FOLDED_H_X), add(state, STATE_FOLDED_H_X), zeta_power_n_plus_two, mPtr)
point_add_calldata(
add(state, STATE_FOLDED_H_X),
add(state, STATE_FOLDED_H_X),
add(aproof, PROOF_H_0_COM_X),
mPtr
)
point_mul(
add(state, STATE_FOLDED_H_X),
add(state, STATE_FOLDED_H_X),
mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE)),
mPtr
)
point_add_calldata(add(state, STATE_FOLDED_H_X), add(state, STATE_FOLDED_H_X), add(aproof, PROOF_H_0_COM_X), mPtr)
point_mul(add(state, STATE_FOLDED_H_X), add(state, STATE_FOLDED_H_X), mload(add(state, STATE_ZETA_POWER_N_MINUS_ONE)), mPtr)
let folded_h_y := mload(add(state, STATE_FOLDED_H_Y))
folded_h_y := sub(P_MOD, folded_h_y)
mstore(add(state, STATE_FOLDED_H_Y), folded_h_y)
@@ -1189,6 +1179,7 @@ contract TestPlonkVerifierForDataAggregation {
/// - [ PI(ζ) - α²*L₁(ζ) + α(l(ζ)+β*s1(ζ)+γ)(r(ζ)+β*s2(ζ)+γ)(o(ζ)+γ)*z(ωζ) ]
/// @param aproof pointer to the proof
function compute_opening_linearised_polynomial(aproof) {
let state := mload(0x40)
// (l(ζ)+β*s1(ζ)+γ)
@@ -1224,7 +1215,7 @@ contract TestPlonkVerifierForDataAggregation {
}
// BEGINNING utils math functions -------------------------------------------------
/// @param dst pointer storing the result
/// @param p pointer to the first point
/// @param q pointer to the second point
@@ -1234,7 +1225,7 @@ contract TestPlonkVerifierForDataAggregation {
mstore(add(mPtr, 0x20), mload(add(p, 0x20)))
mstore(add(mPtr, 0x40), mload(q))
mstore(add(mPtr, 0x60), mload(add(q, 0x20)))
let l_success := staticcall(gas(), EC_ADD, mPtr, 0x80, dst, 0x40)
let l_success := staticcall(gas(),EC_ADD,mPtr,0x80,dst,0x40)
if iszero(l_success) {
error_ec_op()
}
@@ -1259,11 +1250,11 @@ contract TestPlonkVerifierForDataAggregation {
/// @param src pointer to a point on Bn254(𝔽_p)
/// @param s scalar
/// @param mPtr free memory
function point_mul(dst, src, s, mPtr) {
mstore(mPtr, mload(src))
mstore(add(mPtr, 0x20), mload(add(src, 0x20)))
mstore(add(mPtr, 0x40), s)
let l_success := staticcall(gas(), EC_MUL, mPtr, 0x60, dst, 0x40)
function point_mul(dst,src,s, mPtr) {
mstore(mPtr,mload(src))
mstore(add(mPtr,0x20),mload(add(src,0x20)))
mstore(add(mPtr,0x40),s)
let l_success := staticcall(gas(),EC_MUL,mPtr,0x60,dst,0x40)
if iszero(l_success) {
error_ec_op()
}
@@ -1288,14 +1279,14 @@ contract TestPlonkVerifierForDataAggregation {
/// @param src pointer to the point to multiply and add
/// @param s scalar
/// @param mPtr free memory
function point_acc_mul(dst, src, s, mPtr) {
mstore(mPtr, mload(src))
mstore(add(mPtr, 0x20), mload(add(src, 0x20)))
mstore(add(mPtr, 0x40), s)
let l_success := staticcall(gas(), 7, mPtr, 0x60, mPtr, 0x40)
mstore(add(mPtr, 0x40), mload(dst))
mstore(add(mPtr, 0x60), mload(add(dst, 0x20)))
l_success := and(l_success, staticcall(gas(), EC_ADD, mPtr, 0x80, dst, 0x40))
function point_acc_mul(dst,src,s, mPtr) {
mstore(mPtr,mload(src))
mstore(add(mPtr,0x20),mload(add(src,0x20)))
mstore(add(mPtr,0x40),s)
let l_success := staticcall(gas(),7,mPtr,0x60,mPtr,0x40)
mstore(add(mPtr,0x40),mload(dst))
mstore(add(mPtr,0x60),mload(add(dst,0x20)))
l_success := and(l_success, staticcall(gas(),EC_ADD,mPtr,0x80,dst, 0x40))
if iszero(l_success) {
error_ec_op()
}
@@ -1324,7 +1315,7 @@ contract TestPlonkVerifierForDataAggregation {
/// @param src pointer to the scalar to multiply and add (on calldata)
/// @param s scalar
function fr_acc_mul_calldata(dst, src, s) {
let tmp := mulmod(calldataload(src), s, R_MOD)
let tmp := mulmod(calldataload(src), s, R_MOD)
mstore(dst, addmod(mload(dst), tmp, R_MOD))
}
@@ -1332,16 +1323,16 @@ contract TestPlonkVerifierForDataAggregation {
/// @param e exponent
/// @param mPtr free memory
/// @return res x ** e mod r
function pow(x, e, mPtr) -> res {
function pow(x, e, mPtr)->res {
mstore(mPtr, 0x20)
mstore(add(mPtr, 0x20), 0x20)
mstore(add(mPtr, 0x40), 0x20)
mstore(add(mPtr, 0x60), x)
mstore(add(mPtr, 0x80), e)
mstore(add(mPtr, 0xa0), R_MOD)
let check_staticcall := staticcall(gas(), MOD_EXP, mPtr, 0xc0, mPtr, 0x20)
let check_staticcall := staticcall(gas(),MOD_EXP,mPtr,0xc0,mPtr,0x20)
if eq(check_staticcall, 0) {
error_mod_exp()
error_mod_exp()
}
res := mload(mPtr)
}

View File

@@ -1,7 +1,7 @@
{
"finalShnarf": "0xdf1e9f621e3a89f02d44dbc266056d50d5d1524dc4d135f93b81619f3d674b7c",
"parentAggregationFinalShnarf": "0x47452a1b9ebadfe02bdd02f580fa1eba17680d57eec968a591644d05d78ee84f",
"aggregatedProof": "0x2e6431c2cbb8021cc213885d08b39ccb38215789c2fdced773bd4d46d41a6b8217d476fbffa85477a18981fe0ec8c776171a656b8a12a746a3319e2b54c87a400f102032e51da42427391a70286fbc85fd0dd0a49c5ae890e485ff64c0b8ab9d14ec859fdf2eaeff4997e0eb0f429bda9cdf4afef98021dab7853ede9bf3983d28d3b6b08cc253e8ac6dfd36da607ac729f97bfe52da6722c9b9b994db805934143c5c006b101df5174557240204dec4a34cacf76108e7899304c565ac4d6a18086d779a0f60c70925556824c13ac6c269eefc7aa1c1c71b9d534c5e3da6663b04d66f0539ba5396c86e1a823874b7930cd5e5e724456401bc4ec78fef893f7603312b8200ff4885183eb18caa39f3cc5addf3fa269ac3779d2e3147ef8c2e3b2e8a57e79f5817343b1a003c3aff6a8c1472b43c7bb4294ef21e8c6b32e374f901f8067adb88e2fa5acfab716e76c16c25ab3b65cbfcb45b20c376de1b52849316fdca7b5b33aa27b93047fabd81c90de25f77af21746e9323857db6c2228bf12e642cdee60640d21c1fa93085a188757e4d1af7979797c8009d2e94ae08201712498ebb4ba0dd28ce715c09af2849d9b5f3b52f366be9f677291a7adc16e13127a5d239e8a0f92ee532763c46ea4736067653048c57e2b195a73abbdbdf487f2c5fd68152c9df7e5f1bfe20c650b3db1c2c0a595df56221295092bc5847326c1779d7179390ee89f6167e3ab5af2e7183fab9e9e7790c78f0068ee2c958b20f05a975167f7e6b69c1a780b05e9b0dd82ed462bde24a9e0aee2efcbc6c28f4bb199070367e57150fcb771669cf4ba8bc68085ab13e92f1866fba6c3bea5b2e2201a4de8bece0731c62ee90a9d701ac99645f15ead828cb880f8b35f6036e463e12cc0a7c346ba3b8803e53d119d8543569d743723d88e99a4154871153d37399173bd6539f441ca603501f8f402e7b5836c7960550e137dbef5bc7c8c20d7da823aa871781f2f61565ef75bbcb703f3d7dff21322921d93e5c7a071778576aa3180c347201bfcac60ffe35ee3b5054ddf149af7a841a05fcdc7b554cbea8d6362635ba41d6b779fc01e850b450f576a34c528e850868d43764dd71755d4fe770010928c3f6c62450523d5bdfbdda93586d6dfc3ec9e685e2d247502d3836fc7910db1865595094ec3c49a5ab8f84b9c432bc1d6191354dfed12feb07415fc3fa",
"aggregatedProof": "0x07355eb937c8508eec66315f4dd00809eab5d8ba3c6925d37edde93fc248e28c2dcbf2f29c3c0c60ada0c0ceac4c1c975f6887a7ced528804bb7a325e27b083012495f11884b911377a39f615feace8faf16dfc9f09ea7d0d0965d341b15b98c1610eff44a2a0d49e0dfc890c1d644e985579d6f489e4d8c21d8be5ff34deb9f179a29899b9eb178c33d2c433dc5e41b66f559f9b6f5e352778623a2b1ee77a51a11fea1a2dfb86dc3823c2e3e6601f9db41feab3de68c78c40a492781f2d7860451260674f076a9c8904a4d27a3b97511926950dfbebfd0a229cbe7c4d1ef6f26305ca8ee096bf2811669ca7b92a1d855c9fb11f42f0600f1775a2c745f523d0639fc44208a1ca5a955afc117fd47d7140f848171cbffb2e3a2af1523df73912fa007d9bde44a42529a3190c549a24be7947d7595d07fa2b1db6a741e955ca52c752c5953a87568229e7b2b54cafd00826fd4f048c662f7449aae87e42294d0063216d8c848ef8078771d255d5301c4a3dea3b3297d1c27eb535019518c3ad709770da25f7d789926c583295940405cbf2d1dad4de41e5ad63d2f0273a8febc2a704b00af0e74f7a4f25a35830b8f7d7e32b86546dfa931ec39db123d40e4c205266587fb9763785bb4494a1bc48b586e5ec8b417207b9458a3e6b09539d07929604002ae4c2b5492c7e191628206381eea6b19bfb15350760e10e2e8f2341f1f042a8800ed238a0372f91cb257c7f534f39d3b285e951c1d737a737390a43a26f56a0f11f32a194a85132f65e6487a391e244c21f1b848297728e277fb3c7d1815881d4d3745e91644d58b1a08b958cf0ff004d6cf3b7fe2c127012c797df01133268df0088e623dbff2e96a221e87ab909530bcb268721bf9bbe172a990322d5ff2132fce29d2d65b73697461280ad9bc0a9133a8802e0c0dcecdd6f09baa0512c4466c1848edc04e7d6a615050c10c13c6d7d600be64df9e8aa0bb371d0b0413d35d18cc70887b13c6f6e7ccbc2363f8dd60ebe93d51c15ce5601312981e200f0c9d52d84c8e7e62295db03e47c0b68e71bbe244405c4ab2eef2c524989f21d4bec0c7b91db34c06ec92226bc4845e21777c65d72c731801c576f7945f301f9aa761d088f427fbd1672cefe35a13a899ae2d52673823f11e0a34d4f849802e367e4d5c92e09a8f6309c75af52fae72040e5708080541c3ff745c2375cdc6",
"aggregatedProverVersion": "test",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x233fd3d94f86264d6b666cdcb455c1cb144d3dc399edc9d17bd50aa42ae789a2",

View File

@@ -1,7 +1,7 @@
{
"finalShnarf": "0x6d2b3535e06f4778e03c8439145dd9b8e4ae312953b9ccc154ef73b8a00c26c1",
"parentAggregationFinalShnarf": "0x47452a1b9ebadfe02bdd02f580fa1eba17680d57eec968a591644d05d78ee84f",
"aggregatedProof": "0x008e483358dc0ac1d3f6a27b43f6332e88c4196151b2a1ce6c8575013cec2cbe2f666e5649165dfc5a88ede985203341f5910ec2f4e3d4e9fa2a0a2621e4b0a70a91e0f995a8d754a3ddec1698800be83da8815650488540d2ffb699eaf3518d14bff479974f1f5f8bef7687f89c6301247cd92a4ccfa76a868bd24090a670f20eb06513431e74411648ab8c02a270353146bc759451d00cf2a59477d6106b9d11df3e18bca0d3a36951e31699b21a73e22a77fb7fe43a33b717a23dd06a889a102e4143d1e024e053e4318f903c3dbd0ec0f6e49672dd0ccb10749ac00adaf311149a24bf2c2ee4cfe7ed1db713526c6f7c0893f2ec153e5f55a4b390ce135a0d3ebe372c1beea8142afebdc96fe2764b8b5a33efc0457b9ad65f678c8b9ede196eb1fe34a82e0f370fe1d53e5cfc34bc77f38a64eddbb74f6530a82feb0e0a148de4d309b179697ff8a3c97a5516a1bbffc36d8cf153e9f5ee8fdc98002fd1136a2a12603aa1c7a985b34c5dc6774a5efd6270eac180406b4f03c7ef08eee428bb45d04a3c6635a0225aae76c0522049df5080045629cd6a686c2d50d8b7fe10e6facded652c8d75d4a67d5f8f4c3c6b491f44cc23c307064ec94f7c3a44eb1d1dcd369464960e54a88ad3f9edbdd818f2ac711d6c8f49efe224fb2616f2ac0005ca0c753c801d9e2df1133cdd4de5e54554197ac3e2f42d0b140261a12796050d64ec14bb22355173d157a7a2a9a5c0a20d47430819b4c106fda54923f9bf273cbc4145962e07b853279e64e198d3da5919814935c4cf12ffc03128d0e4fc24e8f35180d257253c0ce33725cb665a81141f16418fb20cf2abb96fa65a03bc0fa8e1e842123e2a2590f423e34c1db2c51c9e872ea41942d44d94d735cf8b4b0ccc265c6bdc41dd6f1167da133450a5ea0c07ea4704c9ca377cd201d8a63f932f7d4c9edb88269008bfe08d91d576cbf1a46c2da88b13d2a38e68f66f330552114f37a226c38ed3a9acd35b75f5852e6879eb3c8746ed2676f9e3957d32bbee1493ac055f03a56e964c4ea278d323abde55b36439b5460897771bf5ef3be1992448a5479f3515d5605d403a51391c6c6db94a90b3353aa956a5ba6f7b951fee2b7657ab431f90220c84820c2db8e4b57eaa5c3ea13e8d1f4ed31b9434c5df5c083dbb24fdf9dc5a64ba7416e6d154e6b17727a3acaa9f59820e926196efd232",
"aggregatedProof": "0x24a763a8f31f6fc38a69c22e50e52834ec7d81dec39a242788f2d58346cf26a012f9746c9b1a1495044290332e888efd1b2d2aa2c725b8bab9c144fd7aae58b40516025862d6f66f14a94fa21056ff77852b13f490f464a72c6761f9fbaeaabd129cf08f08e796cda5731ab08ce868b3188c749363ecea66e940fa5ae7d1ac7d2a50649642f8b92a0da2e46e428c9b7e0d690ab1b55fc94166b8b8e13af5bd5c2098836444656fcc2d5bf4ba30b334685bf8c8386a5ace5110c16ea47e425b4b098fe4587fe3477eac40fb3b044ce3c9ac3c8c63c2e0b9053e5bdc835d89f9dd114f6c6781bade139e4126c3aa018d4f8277d31bdb677d202bb88308248e67ee1db7a1c7735107ea60a9136e7a4d28984152f3ec601706761bdc2942afe4860e2ae4392e300e00fd27ed3736334320874bc118a135712bc92dee276b73b5715c218f03c694d832d1b10cbc2900d09fb3df9b7b8da7639c0db268074ff046affc11bb6b6699c06792e2dfeefb27d5145375850e34b1eb984dc2c87611952d9f872dba5559b64bdaee265c91a3b4f4c01c40f75381b6a2b99468364b1056a2cf3304e1c4622cf393a2a04c8dfba895c54b97cd081d0df7457fb35954740a16f97d2828a085da44352389651ddf83ef47152e5087d94b8475ba6772d2d37502a5ae1093727448560d452f7bd77f48e114855fe255a100f3d16199d8179876aa62ba1ea4af6ac5db7007410c09d970de717777db53739c5338347e9b9a5d24787239223bbe47ee17a38e3877d004f16e1c1ecd18ab12b163fd27b6beddca3700c7ec1470e3e921d13b8e705d4cf2511441e96b3391e1e53f4dee129481a9a9307c5911a0a8eec252ee62d1ce5823d24b152ebf9763d6a95c0cdf42fd00a45056f10025521191435a9f6b48c54e67ed081b8780ffcea6cf3c1cc8aa0159af38d599162216923680b8ee251ba11ccdd12f2bcf36eaa70892096a40847aada1b64de98e1e3b7a46c11f6e9908882d44adb3195766b316a84ceac2dcc88f987db38fe01f10bfd9d877bef3590ec9186a0ad140a3818818592e1377c2d03068118abbb17c210058369bf284117a6b8431967496b5c4ad4c48db1817e2b32fbb45a57f3f2c04cfba2a9cc42b95bc194c67dcedf375fadc10ffa3c697491220ffb5a780ab07220e499810f28776110f19a92490c51df664197f281aa5491dafb6bcf5bedf47",
"aggregatedProverVersion": "test",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x216ea864c4d4392d0315997af776dbc1856686e376a07c85ed67f8509c14328e",

View File

@@ -1,7 +1,7 @@
{
"finalShnarf": "0x4b7f110cbe7fcab315cd99683b2c7864bff2615903a3230d5bf2222b7a71a756",
"parentAggregationFinalShnarf": "0x6d2b3535e06f4778e03c8439145dd9b8e4ae312953b9ccc154ef73b8a00c26c1",
"aggregatedProof": "0x2ccd7bc052a4a3347fd0fc9134d62c37208cbf5af79ceda0a62bde3861db8329195f5d25f8fee76a7d37c45055766e059dd3750dec0b903783b5928b8a5e8c830a5336cd5876cb7c1a4cb5cf329f1f6c932a38121778a56a2a80d41cf75da03013a32e6ef9159e335e8943fd9daba6d58f48a68f47dd24585cf59e50ce79cf300d84d08f9db0c62db91f0b00f410acd88e1f6217ae3565db6535a086b781038d15bdb30229a0e1a191d5ea26f38cc27bec2ac3b9ddc00ca88ce0b27a745a7b271eb64a673306440b812ac79c53c345adb2c4a7d6d983dab3e8b00e83fc36e0ba3018527b30a861d10944d6d05b295a3dcfe956da4a6b42610ec703ffe74248fb0154a0dfc7bdc8dedcfc4e6bc884a10ba3aa3073efcacd66cf7d59e38a74aa1000a36354762974e610be1ee6988f91f58ea4fa7f3335736a8af7075ffb10ea2a0bede1074f138237a509373679a8d781308401b1ac283772ce163ad1efc5af2216899a8499375154809be8367318d7916933a34f02cf76d20d7715a289c174580229d78df12a39593212751e2e70f26909f7fafc6d63bc877d28278049406f3104b870a14218cf11b2422bb46dafb11aa4fecac8d7bd8570eb72b955688bbfc80cb0fb367fddb4826b6ff2285ddf6d147f38ba068e3d35cf0568a8141e3871b61eeabdbab18df69f0e8087484c2fa7eb15241b8d0e40d2883daf1addff7691e3241ad52968445fb97749bbe4ab7ab2e31717ed545c9d078a57eab2de9cd9db982377d1ba338e35fe231a05a1b81b4c9d4d1332c97cdfc1d0b6e3c6f190c932f201e8814a714bff8c37e80b1aac4ae26c8fe4fa68ca041713aacd705b3306926617503f4eca6c1893e6f5ced6ece0614e66624b9b817c664bc26e3bda711501980cf48324ee61112ac8105e1d645dd72ea6f99312a9f99f37e156b54f4d07f65c2d2dea5a66368fe0d42efbeb6983c81622c5e25eae779dd9ae3be074ca9772be1e65c0906da0e0f408b3daee7d505b99cfabaa3427a9a1abbfe78d273275fe2606f9e57936aad44f500f8ade2e3c0c350dcfbbeba3218205ee74818376bc87f70d0bb1ba55e09ba360aa28037bd8d99ba3ff700045c525b6c8a08acddbaf75d12e3a7863068be75c7e889962d10b6e0d40e0ae9c8334be7597e45936a12249ea0578371f6f0bc77cffeb47527760fcd3ead96ec5349779e8142b8cf6a9304eba",
"aggregatedProof": "0x3058be439578068164e57d400f4fb99fef6e787c4776d5a6ede3a472eb9db8550e7c675c2a6119e7fb9bbf689d106351f7258c1afb0a14e5698f8d7837dda0a7264718b9fe77f2c85fb9d470626a6879aa8c5606b319661ed6f473ffa904e18326aed08ba42ed28ddf241680eb7b91150829e103ca86fa0e8a5173a2d4df3db20290db040fdca9b1d110ed72785ea3136cabc7081086ff9bfa3ad5d888bb862c2fed2ebfa5dc1f369fec685b5186ab236749bfec901b401a0589034f9d91f23a01bf0d48361c739752d2ad2e126afe5cdd279f405686efe04534fa763f2228c0160be2ad00b52ea64866cc91f05b8c5a5ab13a2a7db94fdaca44dcfac37d882e074fbbfc17f2d31fdbcad3f64ac3dc97d7d0c75e1a0bc0f24fa6a61e04784e6c0d6a29ad5deaebce34f6baa476b04338db1b98fcbe6b304b444eaf2576fbf9de02071a9423b3180d56cc391aa53f897fa6c0680fc1da36e3987b8184be8d49ed1c25f3c6d1743818dedf5354b3dcdd4b0a3fe9eff46bff11de89ca345fde57b405d575c99531f75245753564e0e28bf79031680d5c49488ce3c53efdc7b9bbdb22b9edefd5cdf97d930bbe9a50da99e64b5681f916f5fbf3518d2268369437fa02634b634cc719745541d74c0b8931bcdfd0f58f242b42c523d172e7aadff17706dfcfb36d31bd7f47e9ce133b7fc8bfcb1fea34a663248f7a7cd2f0bc13013701d351aa4dbb5092ee7def90e9dbe4c2a5720f8a6124b173ac125bc7e0f5dcd42f011af66bc76e7eb4ebef3133f6a8bf64e53f66dfe4f87d3c526c7d227a860f21a8f1370c88e918332e9bccb39f447a09972b0354f23dc3e6b5f158d1ebac961b2739fe7f83f2b6ef3d123de66d542a3f34d4f9c78e1e2658510552d65fafb60078682146f1d4a0722af05a330e19c6d023e0df11049ff27353687f423c422f1785bbb23741318c996131bf1cd56e944bce6d30eef3c02eeb2340cdfe6e3b1616f4099da8287d8a583ffb9c8c1b3062000e4d02179c75c242d54bd5bda7e2fe23a3e64e83aeaf582ed679728a26b149dcfcf4ba430229eaf003ac9c45623efb0436569a67bab0e32235c2b17dd21ea42fd284c99d8645fce7f0d4cfd90ef5850c5dbd74eb3d464ae8331eab5c18309db40d731c6c21985890d86e839f0f244e163dfb108c8829e096308b53b143ab8bc0ad83eee2ddcdd9c1815fa634f5f9f4",
"aggregatedProverVersion": "test",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x0ecda6d6b122aa50210c937e14351066a6e98db71c066ace19abb75a3abdfda8",

View File

@@ -1,7 +1,7 @@
{
"finalShnarf": "0x9562fa89830a0ba0063a636ca96e52ce2f032b855336c95dd788321f4e193419",
"parentAggregationFinalShnarf": "0x47452a1b9ebadfe02bdd02f580fa1eba17680d57eec968a591644d05d78ee84f",
"aggregatedProof": "0x2b8a08e4b319c731ae97081a486f1194d72740fa1bc4a4bdcd310ddf50a75c2f02e6ae770debd31337489d9655d16ab026af7219695762a2475a4875263aa2c120fc987bcfb7e9fdeac64a1db6bc5c9d4d7731a583d84a5d8db3e69132b5583116bb7a6ac8f081a1c33fecf42b51b7f8f827066b79e19d45d587d368ebfee5421e6a8a0d63a2fe696e647088d81c1b6c96190432f42bf5f7cdedddc3fd0698581dc557b353523782c2f137f71cd76f790f4b8be7c5d3f200befaaca4cf95366328cc64b4c98566701bde2e5710cc84dbbaa50e2d1f29147bcbc506924adfd30e016218b1f40bcc6a0bac3faa9023f6855e217a5d98ac9fc7f14005adfc18d52c1368b188aaacf77ec4bbf81a6ebc567330eb405db0effdc9447f744d0595732b19322fcdba4be23e05844ecbda382ba93730fc21d9d12200f0bc625a2f5350840348893f7a0600fdd932e86a2b6c28500fb40eb578563061ce1a27bb401eb7f128233c28ecf4e3e35ed53657aaf820a4cfe9a4057c496e95fc23031c2717bf761fb7a6e471e57990f36187c93c8159929a0141ed568eb05b68dad58fc826c3f90364821de7e0cefeff209bcd7f5250efed7cb3d6ad435fc774161cfb6787916a0f669b7c1668e79d160c0e680d674279217c40b662ee91b5165f94d6939e2a5a05ab12b274c697e35d60943be8aa53ff762c1d52d3390a80f76664737de582e72430b98e07146717df294d8eb5ca704444917c6c9c3f819b929af0e44e34e9dd23c7fd04a541107fb3c74bd1fb583aaf401b6fde6a48e4d8fcb0347d04d73a280c7c5f2807c540474634d323d23d8fde9173b98008d03273a55a1d023093c4730a6ce93a60ee79aa6942c159a3ddf086311e51eafbc90fb81b919a0d588c8c6529f0df37ab008b965e10f1c6560063f0b07bc2299d519bfed68b7c45953726e90997da2b84436f4906546770fe651041208734586c090efa87488dd09ccec05b12f68cfa5f2984f4970801179d5335b2f28dc9303375811736d12041580abc0b10d35acfe032f08ead34481e70668c0efed88d5461529d24352fd6f6071e363703661d460e7edec53cc933b778ddabfab152a4d7aa736b3a361534aece194b15258a67556f07fe55fe84206331187ed3bc909775fb5b4174f16475fdba91a1e9037b49216246e4658fcf5a0b026a70a6316fa0c93f196c6b4cd4eea3904067d3",
"aggregatedProof": "0x2719f74a584ca862fc2c3b582e511bad7a37e5210741e66bc14e5d1665f3a28f0b7edd2bbb775c65515f5dd0a9b293a0f96a0146976829724cf703fa8aac0c7a22eb77c319a866b6b4c975c68ab99edb61a6d212701a3c72fd275b4b918d6449244e7f50d0e466ad3542f6174287d23ae83eb96eebded41e4ca5d7f89465663019fde4dd5409b006adac5b20f6195b68c0756d9261e3c2b16355c66f0f33e3492efc72c0571ea43547d6f724b3440239cc041d7b6aa210c165c63b5d63aec1101e4f24ad4e5d4fc96ffc727fe9e6d2453627e63140442ea4e9bdd30779a3cad11c11d5599c083d81273843eaa1f7eb12161adedc5ebd46eea265acbd7a9dc02b216acb6fca1aab70e89c445d41c6e851ba5dc2ab8d3512adbc383436da05d136102023ba2509c9de41512cdae952bf525d6629796551c0be80efb55976ee13c216353cc1d4d44768939ab9c4ce48a6b76e48fa8c194d49f0dec1d252b44439d3232f9db504aa9924083b63c1a00743132310b3963170d9e597403627971a0f742f67e29f6fb7f9d52f0a0b1472b4e7f228a65efd44b34e2021b19ff2db69540f2ae932f236b10d7644b921bbae4b9f72facfc16d431f83eeb02ac166947061360a48a6415092fd1724c710cd7301702ec8f203f5e34543f938ab08c081d12d73055c482d0960c3d55f0307fadcbb97de81865bb8ee801baa4ecd9e287950ae5328f7878b4479ee246095288b28c7a17de05ab2e1b567dcf0a1c375286ca149f2077f97cf81e28fd43e0015ec3258c607815c3efc00303b3a0ca3c9f58fecf1c72165546b105f6b603107c3f6bc9d0f16bef422d4f22c94a8cba572a588c6ea9027265a18fd4ec6f760af1a61ac048a964062967c26e4d52bf0057ee481420e0c09451b3db190d4aed0f934518b34ed70cf8653f6b324ae220a967dfb5b9a9e832e156fe1c51f961457f3f6406d1c9fa5c8f4b2620a69b93f27981e0b2d194bc3085ce2856619424a24094d151baf119c6d5bddfadaf68f499ff776a06f6740d013241fd4063c9d516f0261a69e1969b4a22c8c070afbe96f5a8d8cab1c06ede512fd0c2bafabcb388536b881ccae4dc666d6b5543d1c5bdf9d06124c880f76b90e673bd2fd9e64de2675def256eaaab7c8ff19172f1680cb4ac61292aafaa93d171abdc4169cd1cb83b1acd1328e3194b40ddfd19d12f77cbc9ccdb694f9e39b",
"aggregatedProverVersion": "test",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x1e77e4d1bba517cf992e7788a104fc5612e539ea2b459b532d69efe6c416235a",

View File

@@ -1,7 +1,7 @@
{
"finalShnarf": "0x602c8eeedd7f6dbb7bc0348da1b0dced846acf09586c9f27aa06b494a1c49249",
"parentAggregationFinalShnarf": "0x47452a1b9ebadfe02bdd02f580fa1eba17680d57eec968a591644d05d78ee84f",
"aggregatedProof": "0x1ef8ad12dc4e4b2e4e8979994ab16e0e907e3d594600fe66dff8cc3c25be910508ed51fed1de1cbc4d07869125eb137ede8f908cba8a1a97e26fb666a8ac1db02480bb12080c5ff9900b12963e3dd8a7d5719b3339326232465b232a4ba53c740860893232dc4545ad6b03bb56229a56dcc186710cf398525c18caa05f915459128d2f40878e15c9911904e3c3248d259993386f56c9929d81a3f4cf4b3305931e01e03e83334d62d8581fd5b510a37403e6f53d7b6ec7299ff1bba9f2b110812de395d4b19022f90760db5046e7305620dc64f52c4096d46729b01a397bb7b72cd3d6c66c24a5eef10d3ce870f0486d83c8ec0a9817ce0af0a1b9aa9c5792230469e2cf6d693e10d8a17d60985c9e3782f33fecbd6ed02a251815da2f4e2fc4147df40a7d4e2ceea00758ccd3df17cc20585327a9820d0108dd574f1fcf896c170deac4012eb89e3540a39f3a2b73bb449e9a46bfb9c991819cdf2905398ae00e6958a50ea58f137ec3c99d1a8877e3507920f55c317d6a5fc6718ea3bc255300f1d6325be2b5a5399562a4ffbd5059a483dfc807125d7cd75dd6d668b052cf2dbe0cd5dc3a93b6d9800bde7ba796a080a5281e7b42c38963e7a1e6647ec1eb219587e94ce96c3c258828fadaa0b76bc13f9194e120c3fa8f56847b136fcdd712851a384d0d3b5975152df354ec74847395dd3f6dd4c853f258d7a855fdb12c120c46b74b715273386a5ed3c44407797fbd09f0985c177137957a1342f38e9b090be0e96f7397b6eb380544923497f8dab1c0ef4fc1553bdbcc0fcdbcda8e8604ac0162ee8c60145e4b2fa05b4d3a0e748b6e4128a29842cbffd2992f6520a0163cac4f3fe3af4f901841db9b0a22f5882d3736a498aea2c787269fbc4589c42d71fd3a43dd1b31e8f2be1af62d75172daf970241448b44a91015a7ae4e18250cf54afc8cf67756f524a1bc245c72e2dc48cece0a18f810242f37ea2d9d26460f42e555df9e183031499fd813e666939759661eb772e077150bdfc4e5d1565a2e1e957b787fdda6b1defede8aa1405a9e376212f1be6a685f2bca487440d6f20141d2969b8a40a4144675c0eea6e13512d9c85bea1d6da212f50c5ee5b4e97e29f5131c114e0a3ef0e5702c56f61c0c6fee904aa873fd7d34301d909e9dfbe306ee6a593c2e33a691b3cc62b548c35fedf1761d856e54cf9483cc32b9849ecd",
"aggregatedProof": "0x0906688e6a1a937a5c699d7b8f19e13e959de6fc80d7da1c8299128e234310be272b5717e590f87c2132f4c71ec27f878b91e173590ea629ee56686a3a1d778522a4a4773e3df38af03c94dbf0ecf748dcbb37ef6eb39a94eaeb8b2475026a8909c380f50cb9bb8597ff47ee3dcef700a2d77382c6e700c615366497b880719b159661c3ed861a6978ceabf7c561bbf4a52e9ec784e757d62edfe3aa43efab36179fac19d79b8e2c99512b94312171b737f38e1c968429dd8995134e7daeb04a1edc9232884f434cc4c1fd797362a5200c04c9e930752027e503a8510ea25cb5257b6fa29629a3a0df4b467fd7bd6c3d16a82aee1ab66d1c616783b5c4ec9be30a07d5c76f3c8df8b32079ae8037ae5f4c27264e12fba2813d510ed3dd2de6ec080311df054fe5c3e356abd96de784cfac558c6b9b3547f5d17075caefb8e14b1d3ed6738602aa069e4f65f0a551e345c2d9272ef8bb3f6022c6b02f8f1cbcc02741dee96850cf09543a51e934502c0f3fdcdc357b61e4db2a279fa329fe708417c76e452a74e90a802f9181fc25a61f87a3a6d5d5bf49436f9045e884a29d9d0a0cda05bdbb88f4f10ad3c6141acdb82234624c6fe32e829e6d5b3877c061c60561f5c65055898a07bf00c71c7b86979b1c852725cdeb2bed3acb3bf3a51e5914f659346a2369a48697e58567fb65efcb7b35c2c53a8aff45f685f01671b6bd069d5d8c37e5219a2bfa88549693b0a2ce149a05423ca548c0fde4d18754a87a2ef4129038070351fbb496d47f0373e00177c117e1553eaed26e6a91f669795b0dbc0bc20697632cda6d3aa62497bc3b2b87378a7d6da71337586586676126c50a0af8221bcc5a24b21bb28788399eb50888cc48699fe7a2eb212a82efb552072dc6e2ed532b4ed115cc22ac05282530594b9b5036a0665a6f51114ae3b9a8310ab0c7f8ef62dd67260a2f00b203ebaa1c10308e231eb01581bc45c139e47a321ae6121cde0cb0c30924c27bc39387f19486e96076a703749e3bf4774eb4199419874514ea4fb276831fbe497a282d0d76677d71569e7fe121fd20ac16c1b42c25d3475a987e038f4f0714fc92150f56e40639ad88b4a5de092749854e5a5dbb28c633425d0d0886eb0ac24dacd849c5bd7be6a3e456d57a39ba07e8933234792708a29f3317dd2527f0c4ef68b60d78510d57eb2ea8bd8f9d8fc8eac8ce5de6",
"aggregatedProverVersion": "test",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x1538dc88156cbdf280326f52e33192924ff311be4abc0dede43a14fbfb160a55",

View File

@@ -1,7 +1,7 @@
{
"finalShnarf": "0xfd910670a8da6aaaf2431ce7345a605dc15dc41298b9410065d2f7bb1ba99fea",
"parentAggregationFinalShnarf": "0x47452a1b9ebadfe02bdd02f580fa1eba17680d57eec968a591644d05d78ee84f",
"aggregatedProof": "0x1bf64c1edf68a488be4029c17e6237e73300a294e09230f0d91265f00645526c2a1c08eaa28e37ac60621b21a3b592a7c65fd9809ef8ddec93050b384c78a03b253f40adaf8ec9ea0993ffbdb305ca570117c90f5b77b810f9f2fc46613dd7010ca7906b191f1658bcc6de9f22867053f26cc13dc34861a7a3934bcd328c97380c785972db98482eaf11c2f48acbb2e5e4291e77c81fe880a1eae39aa7e9b3640c3671c11caf5a72acefbd4455c8a329c7960149a9f87f71a9277a086820dd21074cca6872707e321a20dc2d9e4cca74e7e3be89035b131f8c8686510d369551120eab67ad7ab41337d4c497f7fa19f52ae643b5a5d5fe7bb4bd24f8721bbecc1d12fc89733af07f053d734e4224ed3e456eb4e3a77a0670521106792120c2451407b05a4a6848f0493e1d6e23042ca01eae8f8dfb8b2428482de113e6aa42901ce2a8417b812c67ece9a691e7cf663daa87f5453cd3dc2d738ec604fe6d7d5d0d71f96cb9df2cecd6b1cb0cc35bca85b464dac2c8f28580fe40399fa16488f00dfaacdf58ffc8e28d4a814a2ba70daad9f97c5d693a0e8bedbca897f3aa296907dfb6d1aa8b6803c5bf6d0feb7c2626719b752f0431961c5e16691a296da61a04d6253f5385c32144b0823c31b3fa6be1b6482b89941ceb5dc1ac128a36b7432cbd7de4f3acfb2aaf0e5621dd426882efbfb5b3552c079a0428fe0b0dd5b32e168db05568b22a25aa60b6f4601c918e76e7d508f32e88477f16dbff877acb6e13d99b4015b3b72255294f45b3b1d1ecad980ba0965e69ed99d5ae91d8284db00a387835b71a2afb1a3a9f0efec6c1e377229b1916a1a57b0f559bab41e7813113551b91607348eabfbfe6c4c465caad663e58b200cf8be71bdbb6f47571a94c2863bc18f4b1a7efa4f4be94400047414bf124d0f3a6c62bb329e28ee8c4bf2915b943a77934996c61a4bce84fd66ad709d30c6dfa32735bd502dad08cdf8ecd163615f6a5b1f1cbfe593aaed6dd393bcd9161ffdb8ee755035e033dc2b20d32043f12a37dd340e31d7caf70772766d83e643e3f28f0182180189911c2ba4c7f1184dfbc48d8a49f61b4447f07e3f3d7ebb35632c52de7c953a25d9643b560be02146a8064709ff90f5aee2e0cd9177442788f4548708817d3e6352078dd8a6f2fa628982fb431153c1a2b71f86627ab10026f46a35409bde3da57650eae74ae",
"aggregatedProof": "0x183f7ee0db45f17d02d4684cd659ead8f6878db6bb04d65ac30afcf702e4bd90130bc3e0c5519918df18c17c53283c36527063f7c83f676aaed3c1f6810f324922ec77ca53cf3211859775c594b1b99475d500a9801216c255b8273943c862aa1610cbfd2e8fb97d09f2a2a6c4dcea0d8e79b03b1f71257fea10582fa0e5ba9b1fe9de72729b19d9af9964b69e6580dd8ede5276bf904af0b0ff5ebfeb55951f1c3ea4233a450dc55a32e78b847b9d640f2e488f9a75f1426a974ebe85d262511bab1d0a63cc55eae774c73ad242f87033601eb2ecbaaa7fd386c8fe6aaa6631065f352aa3bb3c83b0941f2334f82a2f26ab9e6e4b9f2ef2298ef33565b0a96d2c2d76f0fce111fdfbfde8b253b211bfb5c9a0bd86d8b4d4d0b601f0bf8a0d40212beb9449b029d1c0ae293e0eae2badaaea56b869702b6bdc675281ac6f1a642c194c8a60c26dbe3a47ea105e8b93ee1d7d06cb5cd1f7f3567d0317883f9162176101be8d18fb7f7967c0faaa3b73a0a553f381aa6285197cae19df5b1886b222a89a8d01ce300701b4612e74e78bf4c19ce826dc07e0722f9f637818867598172229da2d98a53f77b72059b44119f4b8a4325e8088c8113205f97d8a6c98bc08c0d61fd392a0898aa2ab17b0c5c97743d5a8dda58fb7fa4c2ca0dc0b6e29b00488b1fa2ee99db2d883390efc6253291571071c9872a7128442e1653b71e515013653f00a535949a2cbaf08054eb858fa07113c920a4d43d7df01a28798c02c06855f361ab0b5332cdb1ded52352a25bcb4132193157c8be961272f34e2ff3f228ff8b914befd57a205934c95a7dd2f51df3d6c5154e856e8909f7c7c66f03215fac0ac620dbb10b60c3c0309ac06fc1a6483b98d4fab851539d3e96ac2a1cf2e847951877939666df9b67667f49fbf84e75edbf64f8af62751b01b39da54e8160a3b7e7cc46c0aef5bc9c27b2dcababa958531c529d7259f3e96138653656416b8e4a4a04245e5597ea79a779dc184ee4a99854fe493305bfe95fb106d155600c1bd6457506789323204f13e27ef53433f1d33bc52e2a150b82dee2bdfbcbb129bfe038db976ec2e85b305f963fdca3fba87889728258290b1ac1de8b297411846a69fbba38bd7eea0b67ea02d4fc0f7a88f2a21796033fb26fd042d2c105b12c6df3cc02c14989b9936bf0f5232a2fa75dc761b404a0cbcd5b0aae736155e",
"aggregatedProverVersion": "test",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x02df9c4f607afe80ac52003978e4a9e197a7a0b61b6601d5e0788a6fdec1c08d",

View File

@@ -1,7 +1,7 @@
{
"finalShnarf": "0x42d7511a7a880ac5c3a61a0f480e95ec7b0e2cfff1aa106ea0256aa94bf2b865",
"parentAggregationFinalShnarf": "0xfd910670a8da6aaaf2431ce7345a605dc15dc41298b9410065d2f7bb1ba99fea",
"aggregatedProof": "0x004d079dc1a3b7ab15b4180dfb1248061c53baf123b0b01cb317dfc6a79ede6104ae63614c13729ff4e937991ca9484d493750ed188427fbf2f80666289623fc1ef6e53c9123bccb4c4a3cf72f62d1e45b01b9d90e5b860c683523c108eeaa1c0364e7a18f985c6db601f25830015918cb61d5bac4f167d9180497242cda9e7315067a4af58faffdc88c8dd1ea503fb97a37b83821bc5c2c5abf2335680468810f3d56de44a398f6b81afc44cb088cf146d03570fed3a3e2fcbdafe62a1febd2211f6c32e6ccf9aabac8dfd8a45be5826e5275ff5e1ff5ee48055fd7f0d050881db23c024fe39e1e774dc5cc697bbe8340f84a1fdbbd4ca898067b51a69f7737017f66c55bb7caef98d7074c6abe644b45ce4d6b9e409f8be2bc75c8d6aa85d110413355c49ca3dd62221d4a8f0719ec633d9a6dcdaafeb2a8ddd93443302b9914b94cce67a74fe652760599efc1791dee4d81aad1244a02dc532340f0a1b31f1be9ca611ee98ba83d730ebcc68547926ce95cf6f9cc26ef67492f97d6f98dd229b9d895c6fd268ffab58751b60a3cb48db3b76f985923fef11e1de0a635616724c69edd2854429298d41e9c46c9282dbb503e26463b19d28a1d05958247899408e549c63032890a253b4c0baa0e34d89c66333ec7dbbbb3aeee1e910fba34ec01b0e31aa1a8b825f794b7f7acb0b6cbbe881ee99aa24fa1bca50f59ab5f31e7259ff3c6b279b2bc1f86e1e5d04d67feee7a4fd338fa0c1d9e1911582347c76317696ecc2a8ae3bf70b666636eb9f1ba0a4422757104c991f6f60d3454bb5fad222e14b451d5d5a0b217582cfd72e3f60e5b748d7b3ba9038cdeffae11170c062dd588da6de561ef8173474a2ac39b73e47fec9968773dec18875754ed40e91021d40b19f9a97bb95ff5531f5addb0331b70e8550614b209a2667ada653a6a18189bff192b99c946dd54dabc4f6c836c28750770484d2dd84b28cad3b2e2dd5b2d8536e48921ad151cc05fe0b9412b95dbbe631cf7484ad7f114e2222339d4fe0555cf70048fc7e1658fbf306e8c4d58b9a8e70707588a7ac8e4b393f13dba5e25b2070532365c46ad698e16b979f96cab0026c5c47fd8cbc1b2365fa94857780c5f581a30150ee802fd84ec53cf6a74ba390746d42147eb0e7132a8a61408f9016202b8704661389696d88ff769f9eaf48e84b0e3988e541e8a9d687a0d3910",
"aggregatedProof": "0x2a17576d9d695ec8bf824e897f07985be74e72a2a6f2c7d61d90fcdd100f301f120e42bcd2b39e1f12da4b006d2d67873c782edb54cb1abf79484c2541446db10dcc8684ca8b8d550ba27af2c718f48865b7358d5c8a49ecf8ac03dee69a0131242cf022404bee6441da3ae2ca740957379f897c77a8d23ffc4948371128af1305aa161d8721ea7ae2169f4e201a81e7dfdb0a768e13e3bd346b39061f15f2022dd77ee57331f7a9e0627a1148b76f1a2e691ed4a3d85129d813ad63471343bd03daad3c9866f4309d4deef03ddccc8edb93988f4d386943189440588b6dd066208b7b94ec3d5798758cf38d9a0ac9c835d736eb167b7616e572cc75ffbd287d287fb5a0ff50776148588014646b8bf0e34146c2db5567d9d0a72a7ed1f13714105a95cce24ad13141755c42bc24606e45d5b93da7b879cafdebbb5916aa0c0d22b193d5028703ec64043fbad6075c951c8a7faf68a99f707b347fc5741e1514141fd66bd2388c79de651091e5192440ab30eec03c8bb1ecc8c40f69eaf28e6d2fe183a379502565318a455e063468f7884795dd61267e045905e622fedb200f1d411a66637da04ec62bdaabb678b4af4e652b2cc58e68a0229f9ce457dc11372333ada4102a256fe38603955a12c033aec79c4f753c647a5bcf33e3e8d2d8140b09b157334aa51bb3e2ea074e082482d9bf4af75fbcf326445e5955b67c7d0b1b6d3119021fd0679ff81eef3916df35a0b782a0524efc860d44e4379a0d27811474ad4d645e6004c6f06deac43fbc5c815bf83171ee98066793e44b567b17fa1f1e0462073d07cd7e720ef2ab6cb97feaf5abaaefe4228bb643e79a46192c761ebf38d352855abd70b5ec007f5cd4dcc7b31c59ce05f3949d1515be529bf40301e9079fa20ba69e730693e28d9aa70eb6cd27f08d98ef9c3196e1219b6f2dd30f4d0ba156146d2d07a64d0cf0ac815ff23cdfb797116b8e6e91fb9904b827300281965dee3dfd20a1f666acd1da14c0e8fd8c5684e630f3f70e6b1fda8d145619af2d92c32f547e4a8cbc39b482dc507f4d039e241015e3f1fd1b92268e43f117fdb8a5c745b56b76f15b3e4d46a5522a183711f94c9b3cdafdc6baf5000d7624390c7d37b24373cfdf9e8501c2d89a0a6d4ce4b96f1d3d022ece0d91fbc5bf22a29b2f9f8ce2f7008c7c1cead9dee92fdfd935cd5076b788eb17b7444bb595",
"aggregatedProverVersion": "test",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x23151dfee9756b7eb4a018d5ef30730f20e05edfd3ce67a8f898c46cb2d79341",

View File

@@ -1,7 +1,7 @@
{
"finalShnarf": "0x4e584b910dc758442e58e56e0bb46c001addaffe770fb740ea0e1b90c0e2b056",
"parentAggregationFinalShnarf": "0x47452a1b9ebadfe02bdd02f580fa1eba17680d57eec968a591644d05d78ee84f",
"aggregatedProof": "0x22d33dbcffa57ac78ac3b3b3a2ff52d9304eecb1073c3675fcf8225048b47aa1123499604ff2c96d334772b6d94e661c7a1fbf7e99b3b4fa1f0b8a3febca98762a5734908afa886b37351314dd68ba2f7ceaf08bef33f52d463d64a23f8523572505e5aedf7e24f132e5f21c1e0577b19081113824788bc47e3fe90d5b3da24a0f9270bd3bcac9309b715f64336c1d124a177fee676d52ef87a76bcf71d3f6a8043d5203fd92a92f2a9590e93cdf904228ebf5589c2afe45014398f5035a07c4076050fab21846b77729fdfef13d0903a4baac5a30abf986f08e11d00fa64fd420247c7ae09b7cecca8e8ca928c8ce80689a8c90d86cc3c1494d98fdf37436000c9e5d3389ac4961e8b8e9ffe1059eb34c74d61d94e23c492f24b2199f18bd180f985d8108884282fec6aeee6d59821d2186978bda855f85cd265c56903a814a2975c552578b532a84e41d71cf78cbecbef72dc374862bc692d5959b84f595612b4d55bd40e8d7261eade62c2a1bba2af2c7ba507abda5cc5f09c625ff4746d92b4588f864863a1f7806aebebc5b09bbd845d200f6a1811fb82867c8ada8656422a312841a269a6a4e628ab52eb5b0cf7329c7f876116b178ff28c4c6f0768871eea9236e28a1142df986b01fbce5c7aedd0ccd27a87a4321321c9bf1bf28f7e1365c364a0e2b4806926a18df6ca43f69b967c0473b55d74a1866bb33bc292a4006487ecb843bd209697f55dcc96ee8e15199c988f9abea42d4ddf00204627891f56f82954d1021bf869508fc3c7d0459dc9ab3bbe8b7e0a8e02675bd59a583c234417b8ac05872b5015ef665da3fca0f966d40d6988777c5def1dd834b94da10d95547edf4d56dccbbaf06f0d24ffb20799e3679a06d4748b16c5dafe7c9ba300ed0e4d01ea54fa447318721bf1e3931b9c6e059bee4bbad9976f28f531a420244395e60823940a36bd202d82578420bce7e97b2edc3021e9951c54953a4f2119d6c8912675f81fcd4a3e679f6c88e4be02cfa91f7d311e140736b8b26ceb500c7e6439c1220d645711e9017027f5a078bfffb612a9bce540229148411804d621af256389ef537ace447641bf21b5ea16d0ccf290f6979d2cdd1b26d2f8c20b047cd1d430cd6a77512006fa547193400a34561883693dda58980cbd770af4a22b132ea5302357e3ad0daf767c7b7c4106ff9e33463ccf4feff85933c87faac0",
"aggregatedProof": "0x0b8bf5b2f5f68976b8fe683f68760defd695d2d10174a1e60fb11fb4a899bba327b6a0c38c9aca130f081a9dbaca2a4d374cff4e90663e2a717548e4fd417b02022017d0c46140df4d71941e70e32c77f2658a56a7d0c19f2754a6a12c7e159b14a578ea8487e9a500d21a596b6a848f5f1b4c5c86bed63e24341909e4f5af2c08cae0ed5c77c07a8d12e8c8db26ab1c859ba3f81be0c76fedb168c5ef6d2f670c0ba48016685b8b819c390de0027b9a052fc2618de7db4fb91c49ce4fd4944a1807307baf4c6c9df6db41c131971b2fd7f20447519a98185e0a9ee36b3b24d12ebd28942e577ac2a291b99b5276c5ef90b7b87cf2c0345f9d1f1a208718fbe52b4531348aa7684c1f87decbd82891b42b94b4a929fe064ddbebf1e9d0f7e9c62c96dad0f7a01a04efe951a08b3e3f01d73ca50f5e99b630f6d43a7521af04f313c5b5d64b38a40c1c2f790d6c2ae6693b248dc0751b00dae32fe636f06a82702852ac98790c94892251d4d57e2fc920bd8ce814fa05a7245fd2ddd775f679720d649052e70cb93a922ecbdfc42f3a24440f79045232d2726754f22c840e551d0e17b0290f34fdb4914f65e3a94bd8c98ae6f46ed848c3a7c3287644e5ba1a9116e5c0c6c3db9bf0c49fcdc46be713064ab2aad6397336b38ded36a60354a34a291c86708f79ecdd2d6a0ce0c1570ca6521bb6f3c8d2f11e68fe5dbb5f5a9092191a47f88f88ba0aa1bb9ca8b0addbab07a611bfb3ebf0b5e17e4b29a59472172523c8da1da79e75c42e8900b5322c7d8d988061e9b5bd67541cd76984f3130a0796fa53a7fc1aba307034a35305256e8fd70d4bc940d54b2e7f3f29f5712e6f146ccf06f05565401075657e6151059097c2d131ab799b6dc53384fc84c938e90add4a680d396da5ed790ba89068e04b600340d2c830b923bd53c808722d396c1fedaa9940d698a442caac2ad53d290adf26132928be8e876b7a1779b3a6910224119aab5da0a20b2eb1bd8195a4b99007d4a2b76bff16b38844cfcf2b9a8ffb26b39457e600db2ef22817d530603dcb78728a50d8a6996737b85092ac741fab05cdc5f5d781705c984765274fb7592087b18056fba9bb64403710ea35abe18406cb4ed9d94a62f435a425b9973d20f41f9d03867c1cf9b0f2c3ca5734e6040c009d2d968c55e42543ddd08b6956852bb69bd9b0a5d0cdd080d7d5e59bbe9c29",
"aggregatedProverVersion": "test",
"aggregatedVerifierIndex": 1,
"aggregatedProofPublicInput": "0x0c16c609b50fbc6f660b3fe38c5989ce059ea171048c99c0dad306cea570df61",

View File

@@ -4,7 +4,7 @@ import (
"bytes"
"fmt"
"math/big"
"math/rand"
"math/rand/v2"
"github.com/consensys/linea-monorepo/prover/backend/ethereum"
"github.com/consensys/linea-monorepo/prover/backend/execution"
@@ -30,7 +30,7 @@ type RandGen struct {
// Create a generator from the CLI
func MakeGeneratorFromCLI() (res RandGen) {
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
res = RandGen{Rand: *rand.New(rand.NewSource(Seed()))}
res = RandGen{Rand: *rand.New(utils.NewRandSource(Seed()))}
res.Params.SupTxPerBlock = MaxTxPerBlock() + 1
res.Params.SupL2L1LogsPerBlock = MaxL2L1LogsPerBlock() + 1
res.Params.SupMsgReceiptPerBlock = MaxL1L2ReceiptPerBlock() + 1
@@ -39,7 +39,7 @@ func MakeGeneratorFromCLI() (res RandGen) {
// Returns an non-zero integer in the range
func (g *RandGen) PositiveInt(sup int) int {
return utils.Max(1, g.Intn(sup))
return utils.Max(1, g.IntN(sup))
}
// Returns a random hex string representing n bytes
@@ -70,7 +70,7 @@ func (g *RandGen) TxRlp(numTxs int) ([]string, []uint16) {
var receptionPos []uint16
// overwrite one of the tx with a receipt confirmation one
txPos := g.Intn(numTxs)
txPos := g.IntN(numTxs)
rlpTxs[txPos] = g.MsgReceiptConfirmationTx()
receptionPos = append(receptionPos, utils.ToUint16(txPos))
@@ -136,13 +136,13 @@ func (g *RandGen) PopulateBlockData(
func (g *RandGen) Bytes(nb int) []byte {
res := make([]byte, nb)
g.Read(res)
utils.ReadPseudoRand(&g.Rand, res)
return res
}
// Generates a tx of any type
func (g *RandGen) AnyTypeTxRlp() (res string) {
switch g.Intn(3) {
switch g.IntN(3) {
case 0:
res = g.LegacyTxRLP()
case 1:
@@ -256,7 +256,7 @@ func (g *RandGen) MsgReceiptConfirmationTx() string {
// Craft the transaction, randomly from any of
var tx ethtypes.TxData
switch g.Intn(3) {
switch g.IntN(3) {
case 0:
tx = &ethtypes.LegacyTx{
Nonce: g.Nonce(),
@@ -338,7 +338,7 @@ func (g *RandGen) Nonce() uint64 {
// Generates a random tx value
func (g *RandGen) Value() *big.Int {
return big.NewInt(g.Int63n(1_000_000))
return big.NewInt(g.Int64N(1_000_000))
}
// Generate a random tx gas limit
@@ -348,13 +348,13 @@ func (g *RandGen) Gas() uint64 {
// Generate a random big int
func (g *RandGen) BigInt(n int64) *big.Int {
return big.NewInt(g.Int63n(n))
return big.NewInt(g.Int64N(n))
}
// Generates a list of L2 msg logs
func (g *RandGen) L2L1MsgHashes() (hashes []types.FullBytes32) {
hashes = []types.FullBytes32{}
n := g.Intn(g.Params.SupL2L1LogsPerBlock)
n := g.IntN(g.Params.SupL2L1LogsPerBlock)
for i := 0; i < n; i++ {
hashes = append(hashes, types.FullBytes32FromHex(g.HexStringForNBytes(32)))
}

View File

@@ -28,7 +28,7 @@ func checkPublicInputs(
// functional input (the txnrlp is incorrect). It should be converted into
// an [api.AssertIsEqual] once this is resolved.
//
shouldBeEqual(api, execDataHash, gnarkFuncInp.DataChecksum)
api.AssertIsEqual(execDataHash, gnarkFuncInp.DataChecksum)
api.AssertIsEqual(
wvc.GetPublicInput(api, publicInput.L2MessageHash),
@@ -154,10 +154,3 @@ func execDataHash(
return hsh.Sum()
}
// shouldBeEqual is a placeholder dummy function that generate fake constraints
// as a replacement for what should be an api.AssertIsEqual. If we just commented
// out the api.AssertIsEqual we might have an unconstrained variable.
func shouldBeEqual(api frontend.API, a, b frontend.Variable) {
_ = api.Sub(a, b)
}

View File

@@ -1,10 +1,11 @@
package keccak_test
import (
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/crypto/keccak"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/stretchr/testify/require"
)
@@ -12,14 +13,14 @@ func TestTraces(t *testing.T) {
numCases := 100
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rng := rand.New(rand.NewSource(0))
rng := rand.New(rand.NewChaCha8([32]byte{}))
maxSize := 1024
for i := 0; i < numCases; i++ {
// Populate a random string
data := make([]byte, rng.Intn(maxSize))
rng.Read(data)
data := make([]byte, rng.IntN(maxSize))
utils.ReadPseudoRand(rng, data)
// Initialize an empty trace
traces := keccak.PermTraces{}

View File

@@ -2,10 +2,11 @@ package keccak_test
import (
"fmt"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/crypto/keccak"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/sha3"
)
@@ -18,7 +19,7 @@ func TestFullHashAgainstRef(t *testing.T) {
// Create a deterministic random number generator for reproducibility.
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rng := rand.New(rand.NewSource(0))
rng := rand.New(rand.NewChaCha8([32]byte{}))
refHasher := sha3.NewLegacyKeccak256()
numCases := 50
@@ -30,7 +31,7 @@ func TestFullHashAgainstRef(t *testing.T) {
for _n := 0; _n < numCases; _n++ {
// Populate the sample with random values
inp := make([]byte, s)
_, err := rng.Read(inp)
_, err := utils.ReadPseudoRand(rng, inp)
require.NoError(t, err)
// Hash the input stream using the reference hasher
@@ -56,15 +57,15 @@ func TestFullHashAgainstRefFullRand(t *testing.T) {
// Create a deterministic random number generator for reproducibility.
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rng := rand.New(rand.NewSource(0))
rng := rand.New(rand.NewChaCha8([32]byte{}))
refHasher := sha3.NewLegacyKeccak256()
numCases := 500
maxSize := 1024
for _n := 0; _n < numCases; _n++ {
// Populate the sample with random values
inp := make([]byte, rng.Intn(maxSize))
_, err := rng.Read(inp)
inp := make([]byte, rng.IntN(maxSize))
_, err := utils.ReadPseudoRand(rng, inp)
require.NoError(t, err)
// Hash the input stream using the reference hasher

View File

@@ -4,7 +4,7 @@ package ringsis_32_8
import (
"math/big"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/maths/field"
@@ -15,14 +15,14 @@ func TestLimbDecompose(t *testing.T) {
var (
limbs = make([]int64, 32)
rng = rand.New(rand.NewSource(98790))
rng = rand.New(rand.NewChaCha8([32]byte{}))
inputs = make([]field.Element, 1)
obtainedLimbs = make([]field.Element, 32)
)
for i := range limbs {
if i%32 > 31 {
limbs[i] = int64(rng.Intn(1 << 8))
limbs[i] = int64(rng.IntN(1 << 8))
}
}

View File

@@ -4,7 +4,7 @@ package ringsis_32_8_test
import (
"fmt"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/gnark-crypto/ecc/bls12-377/fr/fft"
@@ -31,7 +31,7 @@ func randomRegularRow(rng *rand.Rand, size int) smartvectors.SmartVector {
func fullyRandomTestVector(rng *rand.Rand, numRow, numCols int) []smartvectors.SmartVector {
list := make([]smartvectors.SmartVector, numRow)
for i := range list {
coin := rng.Intn(2)
coin := rng.IntN(2)
switch {
case coin == 0:
list[i] = randomConstRow(rng, numCols)
@@ -63,7 +63,7 @@ func TestSmartVectorTransversalSisHash(t *testing.T) {
var (
numReps = 64
numCols = 16
rng = rand.New(rand.NewSource(786868))
rng = rand.New(rand.NewChaCha8([32]byte{}))
domain = fft.NewDomain(32, fft.WithShift(wfft.GetOmega(32*2)))
twiddles = ringsis_32_8.PrecomputeTwiddlesCoset(domain.Generator, domain.FrMultiplicativeGen)
params = ringsis.Params{LogTwoBound: 8, LogTwoDegree: 5}

View File

@@ -4,7 +4,7 @@ package ringsis_64_16
import (
"math/big"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/maths/field"
@@ -15,14 +15,14 @@ func TestLimbDecompose(t *testing.T) {
var (
limbs = make([]int64, 64)
rng = rand.New(rand.NewSource(98790))
rng = rand.New(rand.NewChaCha8([32]byte{}))
inputs = make([]field.Element, 4)
obtainedLimbs = make([]field.Element, 64)
)
for i := range limbs {
if i%16 > 15 {
limbs[i] = int64(rng.Intn(1 << 16))
limbs[i] = int64(rng.IntN(1 << 16))
}
}

View File

@@ -2,7 +2,7 @@ package ringsis_64_16_test
import (
"fmt"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/gnark-crypto/ecc/bls12-377/fr/fft"
@@ -11,6 +11,7 @@ import (
"github.com/consensys/linea-monorepo/prover/maths/common/smartvectors"
wfft "github.com/consensys/linea-monorepo/prover/maths/fft"
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/utils"
)
func BenchmarkTransversalHash(b *testing.B) {
@@ -18,7 +19,7 @@ func BenchmarkTransversalHash(b *testing.B) {
var (
numRow = 1024
numCols = 1024
rng = rand.New(rand.NewSource(786868)) // nolint
rng = rand.New(utils.NewRandSource(786868)) // nolint
domain = fft.NewDomain(64, fft.WithShift(wfft.GetOmega(64*2)))
twiddles = ringsis_64_16.PrecomputeTwiddlesCoset(domain.Generator, domain.FrMultiplicativeGen)
params = ringsis.Params{LogTwoBound: 16, LogTwoDegree: 6}

View File

@@ -4,7 +4,7 @@ package ringsis_64_16_test
import (
"fmt"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/gnark-crypto/ecc/bls12-377/fr/fft"
@@ -31,7 +31,7 @@ func randomRegularRow(rng *rand.Rand, size int) smartvectors.SmartVector {
func fullyRandomTestVector(rng *rand.Rand, numRow, numCols int) []smartvectors.SmartVector {
list := make([]smartvectors.SmartVector, numRow)
for i := range list {
coin := rng.Intn(2)
coin := rng.IntN(2)
switch {
case coin == 0:
list[i] = randomConstRow(rng, numCols)
@@ -63,7 +63,7 @@ func TestSmartVectorTransversalSisHash(t *testing.T) {
var (
numReps = 64
numCols = 16
rng = rand.New(rand.NewSource(786868))
rng = rand.New(rand.NewChaCha8([32]byte{}))
domain = fft.NewDomain(64, fft.WithShift(wfft.GetOmega(64*2)))
twiddles = ringsis_64_16.PrecomputeTwiddlesCoset(domain.Generator, domain.FrMultiplicativeGen)
params = ringsis.Params{LogTwoBound: 16, LogTwoDegree: 6}

View File

@@ -4,7 +4,7 @@ package ringsis_64_8
import (
"math/big"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/maths/field"
@@ -15,14 +15,14 @@ func TestLimbDecompose(t *testing.T) {
var (
limbs = make([]int64, 64)
rng = rand.New(rand.NewSource(98790))
rng = rand.New(rand.NewChaCha8([32]byte{}))
inputs = make([]field.Element, 2)
obtainedLimbs = make([]field.Element, 64)
)
for i := range limbs {
if i%32 > 31 {
limbs[i] = int64(rng.Intn(1 << 8))
limbs[i] = int64(rng.IntN(1 << 8))
}
}

View File

@@ -4,7 +4,7 @@ package ringsis_64_8_test
import (
"fmt"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/gnark-crypto/ecc/bls12-377/fr/fft"
@@ -31,7 +31,7 @@ func randomRegularRow(rng *rand.Rand, size int) smartvectors.SmartVector {
func fullyRandomTestVector(rng *rand.Rand, numRow, numCols int) []smartvectors.SmartVector {
list := make([]smartvectors.SmartVector, numRow)
for i := range list {
coin := rng.Intn(2)
coin := rng.IntN(2)
switch {
case coin == 0:
list[i] = randomConstRow(rng, numCols)
@@ -63,7 +63,7 @@ func TestSmartVectorTransversalSisHash(t *testing.T) {
var (
numReps = 64
numCols = 16
rng = rand.New(rand.NewSource(786868))
rng = rand.New(rand.NewChaCha8([32]byte{}))
domain = fft.NewDomain(64, fft.WithShift(wfft.GetOmega(64*2)))
twiddles = ringsis_64_8.PrecomputeTwiddlesCoset(domain.Generator, domain.FrMultiplicativeGen)
params = ringsis.Params{LogTwoBound: 8, LogTwoDegree: 6}

View File

@@ -2,7 +2,7 @@ package ringsis_{{.ModulusDegree}}_{{.LogTwoBound}}
import (
"math/big"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/maths/field"
@@ -18,14 +18,14 @@ func TestLimbDecompose(t *testing.T) {
var (
limbs = make([]int64, {{.ModulusDegree}})
rng = rand.New(rand.NewSource(98790))
rng = rand.New(rand.NewChaCha8([32]byte{}))
inputs = make([]field.Element, {{$fieldPerPoly}})
obtainedLimbs = make([]field.Element, {{.ModulusDegree}})
)
for i := range limbs {
if i%{{$limbPerField}} > {{sub $limbPerField 1}} {
limbs[i] = int64(rng.Intn(1 << {{.LogTwoBound}}))
limbs[i] = int64(rng.IntN(1 << {{.LogTwoBound}}))
}
}

View File

@@ -2,7 +2,7 @@ package ringsis_{{.ModulusDegree}}_{{.LogTwoBound}}_test
import (
"fmt"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/gnark-crypto/ecc/bls12-377/fr/fft"
@@ -33,7 +33,7 @@ func randomRegularRow(rng *rand.Rand, size int) smartvectors.SmartVector {
func fullyRandomTestVector(rng *rand.Rand, numRow, numCols int) []smartvectors.SmartVector {
list := make([]smartvectors.SmartVector, numRow)
for i := range list {
coin := rng.Intn(2)
coin := rng.IntN(2)
switch {
case coin == 0:
list[i] = randomConstRow(rng, numCols)
@@ -65,7 +65,7 @@ func TestSmartVectorTransversalSisHash(t *testing.T) {
var (
numReps = 64
numCols = 16
rng = rand.New(rand.NewSource(786868))
rng = rand.New(rand.NewChaCha8([32]byte{}))
domain = fft.NewDomain({{.ModulusDegree}}, fft.WithShift(wfft.GetOmega({{.ModulusDegree}}*2)))
twiddles = ringsis_{{.ModulusDegree}}_{{.LogTwoBound}}.PrecomputeTwiddlesCoset(domain.Generator, domain.FrMultiplicativeGen)
params = ringsis.Params{LogTwoBound: {{.LogTwoBound}}, LogTwoDegree: {{log2 .ModulusDegree}}}

View File

@@ -2,9 +2,10 @@ package sha2
import (
"crypto/sha256"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/stretchr/testify/assert"
)
@@ -18,7 +19,7 @@ func TestHash(t *testing.T) {
var (
maxSizeByte = 1000
// #nosec G404 -- we don't need a cryptographic PRNG for testing purposes
rng = rand.New(rand.NewSource(212678))
rng = rand.New(rand.NewChaCha8([32]byte{}))
)
for sizeByte := 0; sizeByte < maxSizeByte; sizeByte++ {
@@ -37,7 +38,7 @@ func TestHash(t *testing.T) {
func genTestCase(rng *rand.Rand, sizeByte int) testCase {
stream := make([]byte, sizeByte)
rng.Read(stream)
utils.ReadPseudoRand(rng, stream)
return testCase{
Stream: stream,

View File

@@ -8,16 +8,17 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/consensys/linea-monorepo/prover/lib/compressor/blob/dictionary"
encodeTesting "github.com/consensys/linea-monorepo/prover/lib/compressor/blob/encode/test_utils"
"github.com/consensys/linea-monorepo/prover/utils"
"io"
"math/big"
"math/rand"
"math/rand/v2"
"os"
"slices"
"testing"
"github.com/consensys/linea-monorepo/prover/lib/compressor/blob/dictionary"
encodeTesting "github.com/consensys/linea-monorepo/prover/lib/compressor/blob/encode/test_utils"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/consensys/linea-monorepo/prover/lib/compressor/blob/v0/compress/lzss"
"github.com/consensys/linea-monorepo/prover/backend/ethereum"
@@ -194,7 +195,7 @@ func TestCanWrite(t *testing.T) {
cptBlock := 0
for i, block := range testBlocks {
// get a random from 1 to 5
bSize := rand.Intn(3) + 1 // #nosec G404 -- false positive
bSize := rand.IntN(3) + 1 // #nosec G404 -- false positive
if cptBlock > bSize && i%3 == 0 {
nbBlocksPerBatch = append(nbBlocksPerBatch, uint16(cptBlock))
@@ -279,7 +280,7 @@ func TestCompressorWithBatches(t *testing.T) {
for i, block := range testBlocks {
t.Logf("processing block %d over %d", i, len(testBlocks))
// get a random from 1 to 5
bSize := rand.Intn(5) + 1 // #nosec G404 -- false positive
bSize := rand.IntN(5) + 1 // #nosec G404 -- false positive
if cptBlock > bSize && i%3 == 0 {
nbBlocksPerBatch = append(nbBlocksPerBatch, uint16(cptBlock))
@@ -726,17 +727,18 @@ func craftExpandingInput(dict []byte, size int) []byte {
func TestPack(t *testing.T) {
assert := require.New(t)
var buf bytes.Buffer
var rng = rand.New(rand.NewChaCha8([32]byte{}))
for i := 0; i < 100; i++ {
// create 2 random slices
n1 := rand.Intn(100) + 1 // #nosec G404 -- false positive
n2 := rand.Intn(100) + 1 // #nosec G404 -- false positive
n1 := rng.IntN(100) + 1 // #nosec G404 -- false positive
n2 := rng.IntN(100) + 1 // #nosec G404 -- false positive
s1 := make([]byte, n1)
s2 := make([]byte, n2)
rand.Read(s1)
rand.Read(s2)
utils.ReadPseudoRand(rng, s1)
utils.ReadPseudoRand(rng, s2)
// pack them
buf.Reset()

View File

@@ -1,7 +1,7 @@
package compress
import (
"math/rand"
"math/rand/v2"
"testing"
"github.com/stretchr/testify/assert"
@@ -11,8 +11,8 @@ func TestMarshalRoundTrip(t *testing.T) {
d := make([]int, 1000)
for i := 0; i < 1000; i++ {
var s Stream
s.D = d[:rand.Intn(len(d))+1] //#nosec G404 weak rng is fine here
s.NbSymbs = rand.Intn(510) + 2 //#nosec G404 weak rng is fine here
s.D = d[:rand.IntN(len(d))+1] //#nosec G404 weak rng is fine here
s.NbSymbs = rand.IntN(510) + 2 //#nosec G404 weak rng is fine here
testMarshal(t, s)
}
@@ -28,6 +28,6 @@ func testMarshal(t *testing.T, s Stream) {
func fillRandom(s Stream) {
for i := range s.D {
s.D[i] = rand.Intn(s.NbSymbs) //#nosec G404 weak rng is fine here
s.D[i] = rand.IntN(s.NbSymbs) //#nosec G404 weak rng is fine here
}
}

View File

@@ -8,7 +8,7 @@ import (
"encoding/binary"
"encoding/hex"
"math/big"
"math/rand"
"math/rand/v2"
"os"
"path/filepath"
"testing"
@@ -151,7 +151,7 @@ func TestCanWrite(t *testing.T) {
cptBlock := 0
for i, block := range testBlocks {
// get a random from 1 to 5
bSize := rand.Intn(3) + 1 // #nosec G404 -- false positive
bSize := rand.IntN(3) + 1 // #nosec G404 -- false positive
if cptBlock > bSize && i%3 == 0 {
nbBlocksPerBatch = append(nbBlocksPerBatch, uint16(cptBlock))
@@ -236,7 +236,7 @@ func TestCompressorWithBatches(t *testing.T) {
for i, block := range testBlocks {
t.Logf("processing block %d over %d", i, len(testBlocks))
// get a random from 1 to 5
bSize := rand.Intn(5) + 1 // #nosec G404 -- false positive
bSize := rand.IntN(5) + 1 // #nosec G404 -- false positive
if cptBlock > bSize && i%3 == 0 {
nbBlocksPerBatch = append(nbBlocksPerBatch, uint16(cptBlock))
@@ -624,8 +624,8 @@ func TestPack(t *testing.T) {
for i := 0; i < 100; i++ {
// create 2 random slices
n1 := rand.Intn(100) + 1 // #nosec G404 -- false positive
n2 := rand.Intn(100) + 1 // #nosec G404 -- false positive
n1 := rand.IntN(100) + 1 // #nosec G404 -- false positive
n2 := rand.IntN(100) + 1 // #nosec G404 -- false positive
s1 := make([]byte, n1)
s2 := make([]byte, n2)

View File

@@ -27,12 +27,12 @@ func TestFFTFuzzyDIFDIT(t *testing.T) {
v := tcase.svecs[0]
// Test the consistency of the FFT
oncoset := builder.gen.Intn(2) == 0
oncoset := builder.gen.IntN(2) == 0
ratio, cosetID := 0, 0
if oncoset {
ratio = 1 << builder.gen.Intn(4)
cosetID = builder.gen.Intn(ratio)
ratio = 1 << builder.gen.IntN(4)
cosetID = builder.gen.IntN(ratio)
}
t.Logf("Parameters are (vec %v - ratio %v - cosetID %v", v.Pretty(), ratio, cosetID)
@@ -66,12 +66,12 @@ func TestFFTFuzzyDITDIF(t *testing.T) {
v := tcase.svecs[0]
// Test the consistency of the FFT
oncoset := builder.gen.Intn(2) == 0
oncoset := builder.gen.IntN(2) == 0
ratio, cosetID := 0, 0
if oncoset {
ratio = 1 << builder.gen.Intn(4)
cosetID = builder.gen.Intn(ratio)
ratio = 1 << builder.gen.IntN(4)
cosetID = builder.gen.IntN(ratio)
}
t.Logf("Parameters are (vec %v - ratio %v - cosetID %v", v.Pretty(), ratio, cosetID)
@@ -105,12 +105,12 @@ func TestFFTFuzzyDIFDITBitReverse(t *testing.T) {
v := tcase.svecs[0]
// Test the consistency of the FFT
oncoset := builder.gen.Intn(2) == 0
oncoset := builder.gen.IntN(2) == 0
ratio, cosetID := 0, 0
if oncoset {
ratio = 1 << builder.gen.Intn(4)
cosetID = builder.gen.Intn(ratio)
ratio = 1 << builder.gen.IntN(4)
cosetID = builder.gen.IntN(ratio)
}
t.Logf("Parameters are (vec %v - ratio %v - cosetID %v", v.Pretty(), ratio, cosetID)
@@ -144,12 +144,12 @@ func TestFFTFuzzyDITDIFBitReverse(t *testing.T) {
v := tcase.svecs[0]
// Test the consistency of the FFT
oncoset := builder.gen.Intn(2) == 0
oncoset := builder.gen.IntN(2) == 0
ratio, cosetID := 0, 0
if oncoset {
ratio = 1 << builder.gen.Intn(4)
cosetID = builder.gen.Intn(ratio)
ratio = 1 << builder.gen.IntN(4)
cosetID = builder.gen.IntN(ratio)
}
t.Logf("Parameters are (vec %v - ratio %v - cosetID %v", v.Pretty(), ratio, cosetID)
@@ -183,19 +183,19 @@ func TestFFTFuzzyEvaluation(t *testing.T) {
coeffs := tcase.svecs[0]
// Test the consistency of the FFT
oncoset := builder.gen.Intn(2) == 0
oncoset := builder.gen.IntN(2) == 0
ratio, cosetID := 0, 0
if oncoset {
ratio = 1 << builder.gen.Intn(4)
cosetID = builder.gen.Intn(ratio)
ratio = 1 << builder.gen.IntN(4)
cosetID = builder.gen.IntN(ratio)
}
// ====== With bit reverse ======
// FFT DIT and IFFT DIF should be the identity
evals := FFT(coeffs, fft.DIT, true, ratio, cosetID, nil)
i := builder.gen.Intn(coeffs.Len())
i := builder.gen.IntN(coeffs.Len())
t.Logf("Parameters are (vec %v - ratio %v - cosetID %v - evalAt %v", coeffs.Pretty(), ratio, cosetID, i)
x := fft.GetOmega(evals.Len())
@@ -235,19 +235,19 @@ func TestFFTFuzzyConsistWithInterpolation(t *testing.T) {
coeffs := tcase.svecs[0]
// Test the consistency of the FFT
oncoset := builder.gen.Intn(2) == 0
oncoset := builder.gen.IntN(2) == 0
ratio, cosetID := 0, 0
if oncoset {
ratio = 1 << builder.gen.Intn(4)
cosetID = builder.gen.Intn(ratio)
ratio = 1 << builder.gen.IntN(4)
cosetID = builder.gen.IntN(ratio)
}
// ====== With bit reverse ======
// FFT DIT and IFFT DIF should be the identity
evals := FFT(coeffs, fft.DIT, true, ratio, cosetID, nil)
i := builder.gen.Intn(coeffs.Len())
i := builder.gen.IntN(coeffs.Len())
t.Logf("Parameters are (vec %v - ratio %v - cosetID %v - evalAt %v", coeffs.Pretty(), ratio, cosetID, i)
var xCoeff field.Element

View File

@@ -3,7 +3,7 @@ package smartvectors
import (
"fmt"
"math/big"
"math/rand"
"math/rand/v2"
"github.com/consensys/linea-monorepo/prover/maths/common/poly"
"github.com/consensys/linea-monorepo/prover/maths/common/vector"
@@ -61,24 +61,24 @@ func newTestBuilder(seed int) *testCaseGen {
// Use a deterministic randomness source
res := &testCaseGen{seed: seed}
// #nosec G404 --we don't need a cryptographic RNG for fuzzing purpose
res.gen = rand.New(rand.NewSource(int64(seed)))
res.gen = rand.New(utils.NewRandSource(int64(seed)))
// We should have some quarantee that the length is not too small
// for the test generation
res.fullLen = 1 << (res.gen.Intn(5) + 3)
res.numVec = res.gen.Intn(8) + 1
res.fullLen = 1 << (res.gen.IntN(5) + 3)
res.numVec = res.gen.IntN(8) + 1
// In the test, we may restrict the inputs vectors to have a certain type
allowedTypes := append([]smartVecType{}, smartVecTypeList...)
res.gen.Shuffle(len(allowedTypes), func(i, j int) {
allowedTypes[i], allowedTypes[j] = allowedTypes[j], allowedTypes[i]
})
res.allowedTypes = allowedTypes[:res.gen.Intn(len(allowedTypes)-1)+1]
res.allowedTypes = allowedTypes[:res.gen.IntN(len(allowedTypes)-1)+1]
// Generating the window : it should be roughly half of the total length
// this aims at maximizing the coverage.
res.windowWithLen = res.gen.Intn(res.fullLen-4)/2 + 2
res.windowMustStartAfter = res.gen.Intn(res.fullLen)
res.windowWithLen = res.gen.IntN(res.fullLen-4)/2 + 2
res.windowMustStartAfter = res.gen.IntN(res.fullLen)
return res
}
@@ -104,8 +104,8 @@ func (gen *testCaseGen) NewTestCaseForProd() (tcase testCase) {
for i := 0; i < gen.numVec; i++ {
// Generate one by one the different vectors
val := gen.genValue()
tcase.coeffs[i] = gen.gen.Intn(5)
chosenType := gen.allowedTypes[gen.gen.Intn(len(gen.allowedTypes))]
tcase.coeffs[i] = gen.gen.IntN(5)
chosenType := gen.allowedTypes[gen.gen.IntN(len(gen.allowedTypes))]
maxType = utils.Max(maxType, chosenType)
// Update the expected res value
@@ -184,8 +184,8 @@ func (gen *testCaseGen) NewTestCaseForLinComb() (tcase testCase) {
for i := 0; i < gen.numVec; i++ {
// Generate one by one the different vectors
val := gen.genValue()
tcase.coeffs[i] = gen.gen.Intn(10) - 5
chosenType := gen.allowedTypes[gen.gen.Intn(len(gen.allowedTypes))]
tcase.coeffs[i] = gen.gen.IntN(10) - 5
chosenType := gen.allowedTypes[gen.gen.IntN(len(gen.allowedTypes))]
maxType = utils.Max(maxType, chosenType)
// Update the expected res value
@@ -258,8 +258,8 @@ func (gen *testCaseGen) NewTestCaseForPolyEval() (tcase testCase) {
// Generate one by one the different vectors
val := gen.genValue()
vals = append(vals, val)
tcase.coeffs[i] = gen.gen.Intn(10) - 5
chosenType := gen.allowedTypes[gen.gen.Intn(len(gen.allowedTypes))]
tcase.coeffs[i] = gen.gen.IntN(10) - 5
chosenType := gen.allowedTypes[gen.gen.IntN(len(gen.allowedTypes))]
maxType = utils.Max(maxType, chosenType)
switch chosenType {
@@ -304,7 +304,7 @@ func (gen *testCaseGen) NewTestCaseForPolyEval() (tcase testCase) {
func (gen *testCaseGen) genValue() field.Element {
// May increase the ceil of the generator to increase the probability to pick
// an actually random value.
switch gen.gen.Intn(4) {
switch gen.gen.IntN(4) {
case 0:
return field.Zero()
case 1:
@@ -316,9 +316,9 @@ func (gen *testCaseGen) genValue() field.Element {
}
func (gen *testCaseGen) genWindow(val, paddingVal field.Element) *PaddedCircularWindow {
start := gen.windowMustStartAfter + gen.gen.Intn(gen.windowWithLen)/2
start := gen.windowMustStartAfter + gen.gen.IntN(gen.windowWithLen)/2
maxStop := gen.windowWithLen + gen.windowMustStartAfter
winLen := gen.gen.Intn(maxStop - start)
winLen := gen.gen.IntN(maxStop - start)
if winLen == 0 {
winLen = 1
}
@@ -330,6 +330,6 @@ func (gen *testCaseGen) genRegular(val field.Element) *Regular {
}
func (gen *testCaseGen) genRotated(val field.Element) *Rotated {
offset := gen.gen.Intn(gen.fullLen)
offset := gen.gen.IntN(gen.fullLen)
return NewRotated(*gen.genRegular(val), offset)
}

View File

@@ -32,7 +32,7 @@ func TestWriteInSlice(t *testing.T) {
}
// write in a random place of the slice
randPos := builder.gen.Intn(v.Len())
randPos := builder.gen.IntN(v.Len())
slice[randPos].SetRandom()
x := v.Get(randPos)
require.NotEqual(t, x.String(), randPos, "forbidden shallow copy")
@@ -55,7 +55,7 @@ func TestShiftingTest(t *testing.T) {
func(t *testing.T) {
v := tcase.svecs[0]
offset := builder.gen.Intn(v.Len())
offset := builder.gen.IntN(v.Len())
shifted := v.RotateRight(offset)
revShifted := v.RotateRight(-offset)
@@ -91,8 +91,8 @@ func TestSubvectorFuzzy(t *testing.T) {
v := tcase.svecs[0]
length := v.Len()
// generate the subvector window
stop := 1 + builder.gen.Intn(length-1)
start := builder.gen.Intn(stop)
stop := 1 + builder.gen.IntN(length-1)
start := builder.gen.IntN(stop)
sub := v.SubVector(start, stop)

View File

@@ -2,8 +2,9 @@ package smartvectors
import (
"fmt"
"math/rand/v2"
"github.com/consensys/linea-monorepo/prover/maths/field/fext"
"math/rand"
"github.com/consensys/gnark/frontend"
"github.com/consensys/linea-monorepo/prover/maths/common/vector"

View File

@@ -4,8 +4,9 @@ package vectorext
import (
"fmt"
"math/rand/v2"
"github.com/consensys/linea-monorepo/prover/maths/field/fext"
"math/rand"
"github.com/consensys/gnark/frontend"
"github.com/consensys/linea-monorepo/prover/utils"

View File

@@ -2,12 +2,13 @@ package smartvectorsext
import (
"fmt"
"math/big"
"math/rand/v2"
"github.com/consensys/linea-monorepo/prover/maths/common/polyext"
"github.com/consensys/linea-monorepo/prover/maths/common/smartvectors"
"github.com/consensys/linea-monorepo/prover/maths/common/smartvectors/vectorext"
"github.com/consensys/linea-monorepo/prover/maths/field/fext"
"math/big"
"math/rand"
"github.com/consensys/linea-monorepo/prover/utils"
)
@@ -62,24 +63,24 @@ func newTestBuilder(seed int) *testCaseGen {
// Use a deterministic randomness source
res := &testCaseGen{seed: seed}
// #nosec G404 --we don't need a cryptographic RNG for fuzzing purpose
res.gen = rand.New(rand.NewSource(int64(seed)))
res.gen = rand.New(utils.NewRandSource(int64(seed)))
// We should have some quarantee that the length is not too small
// for the test generation
res.fullLen = 1 << (res.gen.Intn(5) + 3)
res.numVec = res.gen.Intn(8) + 1
res.fullLen = 1 << (res.gen.IntN(5) + 3)
res.numVec = res.gen.IntN(8) + 1
// In the test, we may restrict the inputs vectors to have a certain type
allowedTypes := append([]smartVecType{}, smartVecTypeList...)
res.gen.Shuffle(len(allowedTypes), func(i, j int) {
allowedTypes[i], allowedTypes[j] = allowedTypes[j], allowedTypes[i]
})
res.allowedTypes = allowedTypes[:res.gen.Intn(len(allowedTypes)-1)+1]
res.allowedTypes = allowedTypes[:res.gen.IntN(len(allowedTypes)-1)+1]
// Generating the window : it should be roughly half of the total length
// this aims at maximizing the coverage.
res.windowWithLen = res.gen.Intn(res.fullLen-4)/2 + 2
res.windowMustStartAfter = res.gen.Intn(res.fullLen)
res.windowWithLen = res.gen.IntN(res.fullLen-4)/2 + 2
res.windowMustStartAfter = res.gen.IntN(res.fullLen)
return res
}
@@ -105,8 +106,8 @@ func (gen *testCaseGen) NewTestCaseForProd() (tcase testCase) {
for i := 0; i < gen.numVec; i++ {
// Generate one by one the different vectors
val := gen.genValue()
tcase.coeffs[i] = gen.gen.Intn(5)
chosenType := gen.allowedTypes[gen.gen.Intn(len(gen.allowedTypes))]
tcase.coeffs[i] = gen.gen.IntN(5)
chosenType := gen.allowedTypes[gen.gen.IntN(len(gen.allowedTypes))]
maxType = utils.Max(maxType, chosenType)
// Update the expected res value
@@ -185,8 +186,8 @@ func (gen *testCaseGen) NewTestCaseForLinComb() (tcase testCase) {
for i := 0; i < gen.numVec; i++ {
// Generate one by one the different vectors
val := gen.genValue()
tcase.coeffs[i] = gen.gen.Intn(10) - 5
chosenType := gen.allowedTypes[gen.gen.Intn(len(gen.allowedTypes))]
tcase.coeffs[i] = gen.gen.IntN(10) - 5
chosenType := gen.allowedTypes[gen.gen.IntN(len(gen.allowedTypes))]
maxType = utils.Max(maxType, chosenType)
// Update the expected res value
@@ -259,8 +260,8 @@ func (gen *testCaseGen) NewTestCaseForPolyEval() (tcase testCase) {
// Generate one by one the different vectors
val := gen.genValue()
vals = append(vals, val)
tcase.coeffs[i] = gen.gen.Intn(10) - 5
chosenType := gen.allowedTypes[gen.gen.Intn(len(gen.allowedTypes))]
tcase.coeffs[i] = gen.gen.IntN(10) - 5
chosenType := gen.allowedTypes[gen.gen.IntN(len(gen.allowedTypes))]
maxType = utils.Max(maxType, chosenType)
switch chosenType {
@@ -304,7 +305,7 @@ func (gen *testCaseGen) NewTestCaseForPolyEval() (tcase testCase) {
func (gen *testCaseGen) genValue() fext.Element {
// May increase the ceil of the generator to increase the probability to pick
// an actually random value.
switch gen.gen.Intn(4) {
switch gen.gen.IntN(4) {
case 0:
return fext.Zero()
case 1:
@@ -316,9 +317,9 @@ func (gen *testCaseGen) genValue() fext.Element {
}
func (gen *testCaseGen) genWindow(val, paddingVal fext.Element) *PaddedCircularWindowExt {
start := gen.windowMustStartAfter + gen.gen.Intn(gen.windowWithLen)/2
start := gen.windowMustStartAfter + gen.gen.IntN(gen.windowWithLen)/2
maxStop := gen.windowWithLen + gen.windowMustStartAfter
winLen := gen.gen.Intn(maxStop - start)
winLen := gen.gen.IntN(maxStop - start)
if winLen == 0 {
winLen = 1
}
@@ -330,6 +331,6 @@ func (gen *testCaseGen) genRegularExt(val fext.Element) *RegularExt {
}
func (gen *testCaseGen) genRotatedExt(val fext.Element) *RotatedExt {
offset := gen.gen.Intn(gen.fullLen)
offset := gen.gen.IntN(gen.fullLen)
return NewRotatedExt(*gen.genRegularExt(val), offset)
}

View File

@@ -4,7 +4,7 @@ package vector
import (
"fmt"
"math/rand"
"math/rand/v2"
"github.com/consensys/gnark-crypto/ecc/bls12-377/fr"
"github.com/consensys/gnark/frontend"

View File

@@ -2,11 +2,13 @@ package field
import (
"math/big"
"math/rand"
"math/rand/v2"
"unsafe"
"math/bits"
"github.com/consensys/gnark-crypto/ecc/bls12-377/fr"
"github.com/consensys/linea-monorepo/prover/utils"
"math/bits"
)
// Element aliases [fr.Element] and represents a field element in the scalar
@@ -113,15 +115,36 @@ func ExpToInt(z *Element, x Element, k int) *Element {
return z
}
// PseudoRandom generates a field using a pseudo-random number generator
// PseudoRand generates a field using a pseudo-random number generator
func PseudoRand(rng *rand.Rand) Element {
var (
slice = make([]byte, Bytes)
bigInt = &big.Int{}
res = Element{}
bigInt = &big.Int{}
res = Element{}
bareU64 = [4]uint64{rng.Uint64(), rng.Uint64(), rng.Uint64(), rng.Uint64()}
bareBytes = *(*[32]byte)(unsafe.Pointer(&bareU64))
)
rng.Read(slice)
bigInt.SetBytes(slice).Mod(bigInt, Modulus())
bigInt.SetBytes(bareBytes[:]).Mod(bigInt, Modulus())
res.SetBigInt(bigInt)
return res
}
// PseudoRandTruncated generates a field using a pseudo-random number generator
func PseudoRandTruncated(rng *rand.Rand, sizeByte int) Element {
if sizeByte > 32 {
utils.Panic("supplied a byteSize larger than 32 (%v), this must be a mistake. Please check that the supplied value is not instead a BIT-size.", sizeByte)
}
var (
bigInt = &big.Int{}
res = Element{}
bareU64 = [4]uint64{rng.Uint64(), rng.Uint64(), rng.Uint64(), rng.Uint64()}
bareBytes = *(*[32]byte)(unsafe.Pointer(&bareU64))
)
bigInt.SetBytes(bareBytes[:sizeByte]).Mod(bigInt, Modulus())
res.SetBigInt(bigInt)
return res
}

View File

@@ -21,7 +21,7 @@ import (
"github.com/consensys/gnark-crypto/ecc/bls12-377/fr"
"github.com/consensys/linea-monorepo/prover/maths/field"
"math/big"
"math/rand"
"math/rand/v2"
)
const noQNR = 11

View File

@@ -2,7 +2,7 @@ package lookup
import (
"fmt"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/maths/common/smartvectors"
@@ -58,7 +58,7 @@ func TestExhaustive(t *testing.T) {
var (
// #nosec G404 -- we don't need a cryptographic PRNG for testing purposes
rng = rand.New(rand.NewSource(43))
rng = rand.New(rand.NewChaCha8([32]byte{}))
smallNumbers = smartvectors.ForTest(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)
xorTable = [3]smartvectors.SmartVector{
smartvectors.ForTest(0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3),
@@ -114,7 +114,7 @@ func TestExhaustive(t *testing.T) {
for i := range cols {
vec := make([]int, size)
for j := range vec {
vec[j] = rng.Intn(2)
vec[j] = rng.IntN(2)
}
run.AssignColumn(cols[i].GetColID(), smartvectors.ForTest(vec...))
}
@@ -126,7 +126,7 @@ func TestExhaustive(t *testing.T) {
for i := range cols {
vec := make([]int, size)
for j := range vec {
vec[j] = rng.Intn(4)
vec[j] = rng.IntN(4)
}
run.AssignColumn(cols[i].GetColID(), smartvectors.ForTest(vec...))
}
@@ -140,7 +140,7 @@ func TestExhaustive(t *testing.T) {
size := cols[0].Size()
vecs := [3][]int{}
for j := 0; j < size; j++ {
x, y := rng.Intn(4), rng.Intn(4)
x, y := rng.IntN(4), rng.IntN(4)
z := x ^ y
vecs[0] = append(vecs[0], x)
vecs[1] = append(vecs[1], y)

View File

@@ -116,16 +116,7 @@ func FmtCsv(w io.Writer, run *wizard.ProverRuntime, cols []ifaces.Column, option
allZeroes = false
}
if assignment[c][r].IsUint64() {
if cfg.inHex {
fmtVals = append(fmtVals, "0x"+assignment[c][r].Text(16))
} else {
fmtVals = append(fmtVals, assignment[c][r].String())
}
continue
}
fmtVals = append(fmtVals, "0x"+assignment[c][r].Text(16))
fmtVals = append(fmtVals, fmtFieldElement(cfg.inHex, assignment[c][r]))
}
if !allZeroes {
@@ -261,3 +252,31 @@ func (c *CsvTrace) Len() int {
func (c *CsvTrace) LenPadded() int {
return utils.NextPowerOfTwo(c.nbRows)
}
// WritesExplicit format value-provided columns into a csv file. Unlike [FmtCsv]
// it does not need the columns to be registered as the assignmet of a wizard.
// It is suitable for test-case generation.
func WriteExplicit(w io.Writer, names []string, cols [][]field.Element, inHex bool) {
fmt.Fprintf(w, "%v\n", strings.Join(names, ","))
for i := range cols[0] {
row := []string{}
for j := range cols {
row = append(row, fmtFieldElement(inHex, cols[j][i]))
}
fmt.Fprintf(w, "%v\n", strings.Join(row, ","))
}
}
func fmtFieldElement(inHex bool, x field.Element) string {
if inHex || (x.IsUint64() && x.Uint64() < 1<<10) {
return x.String()
}
return "0x" + x.Text(16)
}

35
prover/utils/rand.go Normal file
View File

@@ -0,0 +1,35 @@
package utils
import (
"math/rand/v2"
"unsafe"
)
// NewRandSource returns a [rand.ChaCha8] initialized with an integer seed. The
// function is meant to sugar-coat the numerous testcases of the repo.
func NewRandSource(seed int64) *rand.ChaCha8 {
if seed < 0 {
seed = -seed
}
var (
seedU64 = uint64(seed)
seed8Bytes = *(*[8]byte)(unsafe.Pointer(&seedU64))
seed32Bytes = [32]byte{}
)
copy(seed32Bytes[:], seed8Bytes[:])
return rand.NewChaCha8(seed32Bytes)
}
// ReadPseudoRand populate slices with bytes generated from rand. It returns the
// number of bytes read and an error to match with [io.Read]. This function is
// intended as a drop-in replacement for [math/rand.Read]. `n` is always the
// len(slice) and err is always `nil`.
func ReadPseudoRand(rng *rand.Rand, slice []byte) (n int, err error) {
for i := range slice {
slice[i] = byte(rng.Uint32() & 0xff)
}
return len(slice), nil
}

View File

@@ -4,7 +4,7 @@ import (
"bytes"
"encoding/hex"
"math/big"
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/utils/types"
@@ -64,10 +64,10 @@ func TestReadWriteInt64(t *testing.T) {
const nIterations = 100
// #nosec G404 -- no need for a cryptographically strong PRNG for testing purposes
rng := rand.New(rand.NewSource(0))
rng := rand.New(rand.NewChaCha8([32]byte{}))
for _i := 0; _i < nIterations; _i++ {
n := rng.Int63()
n := rng.Int64()
buffer := &bytes.Buffer{}
types.WriteInt64On32Bytes(buffer, n)
n2, _, err := types.ReadInt64On32Bytes(buffer)
@@ -81,10 +81,10 @@ func TestReadWriteBigInt(t *testing.T) {
const nIterations = 100
// #nosec G404 -- no need for a cryptographically strong PRNG for testing purposes
rng := rand.New(rand.NewSource(0))
rng := rand.New(rand.NewChaCha8([32]byte{}))
for _i := 0; _i < nIterations; _i++ {
n := big.NewInt(rng.Int63())
n := big.NewInt(rng.Int64())
buffer := &bytes.Buffer{}
types.WriteBigIntOn32Bytes(buffer, n)
n2, err := types.ReadBigIntOn32Bytes(buffer)

View File

@@ -0,0 +1,67 @@
package common
import (
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/types"
)
// HiLoColumns represents a pair of column representing a sequence of bytes32
// element that do not fit in a single field element. The Hi columns stores the
// first 16 bytes of the column. And the Lo columns stores the last 16 bytes.
type HiLoColumns struct {
Hi, Lo ifaces.Column
}
// NewHiLoColumns returns a new HiLoColumns with initialized and unconstrained
// columns.
func NewHiLoColumns(comp *wizard.CompiledIOP, size int, name string) HiLoColumns {
return HiLoColumns{
Hi: comp.InsertCommit(
0,
ifaces.ColIDf("STATE_SUMMARY_%v_HI", name),
size,
),
Lo: comp.InsertCommit(
0,
ifaces.ColIDf("STATE_SUMMARY_%v_LO", name),
size,
),
}
}
// HiLoAssignmentBuilder is a convenience structure storing the column builders
// relating to an HiLoColumns.
type HiLoAssignmentBuilder struct {
Hi, Lo *VectorBuilder
}
// NewHiLoAssignmentBuilder returns a fresh [hiLoAssignmentBuilder]
func NewHiLoAssignmentBuilder(hiLo HiLoColumns) HiLoAssignmentBuilder {
return HiLoAssignmentBuilder{
Hi: NewVectorBuilder(hiLo.Hi),
Lo: NewVectorBuilder(hiLo.Lo),
}
}
// Push pushes a row representing `fb` onto `hl`
func (hl *HiLoAssignmentBuilder) Push(fb types.FullBytes32) {
hl.Hi.PushHi(fb)
hl.Lo.PushLo(fb)
}
// PushZeroes pushes a row representing 0 onto `hl`
func (hl *HiLoAssignmentBuilder) PushZeroes() {
hl.Hi.PushZero()
hl.Lo.PushZero()
}
// PadAssign pads `hl` with `fb` and assigns the resulting columns into `run`.
func (hl *HiLoAssignmentBuilder) PadAssign(run *wizard.ProverRuntime, fb types.FullBytes32) {
var f field.Element
f.SetBytes(fb[:16])
hl.Hi.PadAndAssign(run, f)
f.SetBytes(fb[16:])
hl.Lo.PadAndAssign(run, f)
}

View File

@@ -2,12 +2,13 @@ package testdata
import (
"fmt"
"math/rand"
"math/rand/v2"
"github.com/consensys/linea-monorepo/prover/backend/files"
"github.com/consensys/linea-monorepo/prover/crypto/keccak"
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/common"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/hash/generic"
)
@@ -23,7 +24,7 @@ func GenerateAndAssignGenDataModule(run *wizard.ProverRuntime, gdm *generic.GenD
toHash = make([]field.Element, size)
index = make([]field.Element, size)
hashNum = make([]field.Element, size)
rng = rand.New(rand.NewSource(68768))
rng = rand.New(rand.NewChaCha8([32]byte{}))
nByteCol = common.NewVectorBuilder(gdm.NBytes)
limbCol = common.NewVectorBuilder(gdm.Limb)
@@ -95,7 +96,7 @@ func randNBytes(rng *rand.Rand) (int, field.Element) {
// nBytesInt must be in 1..=16
var (
nBytesInt = rng.Int31n(16) + 1
nBytesInt = rng.Int32N(16) + 1
nBytesF = field.NewElement(uint64(nBytesInt))
)
@@ -106,7 +107,7 @@ func randLimbs(rng *rand.Rand, nBytes int) field.Element {
var (
resBytes = make([]byte, 16)
_, _ = rng.Read(resBytes[:nBytes])
_, _ = utils.ReadPseudoRand(rng, resBytes[:nBytes])
res = new(field.Element).SetBytes(resBytes)
)

View File

@@ -2,10 +2,11 @@ package main
import (
"fmt"
"math/rand"
"math/rand/v2"
"github.com/consensys/linea-monorepo/prover/backend/files"
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/utils"
)
func main() {
@@ -16,7 +17,7 @@ func main() {
toHash = make([]field.Element, 32)
index = make([]field.Element, 32)
hashNum = make([]field.Element, 32)
rng = rand.New(rand.NewSource(68768))
rng = rand.New(rand.NewChaCha8([32]byte{}))
hashNums = []int{0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0}
toHashInt = []int{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}
oF = files.MustOverwrite("./testdata/input.csv")
@@ -71,7 +72,7 @@ func randLimbs(rng *rand.Rand, nBytes int) field.Element {
var (
resBytes = make([]byte, 16)
_, _ = rng.Read(resBytes[:nBytes])
_, _ = utils.ReadPseudoRand(rng, resBytes[:nBytes])
res = new(field.Element).SetBytes(resBytes)
)

View File

@@ -1,7 +1,7 @@
package base_conversion
import (
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/maths/field"
@@ -53,6 +53,7 @@ func makeTestCaseBaseConversionOutput() (
}
return define, prover
}
func TestBaseConversionOutput(t *testing.T) {
define, prover := makeTestCaseBaseConversionOutput()
comp := wizard.Compile(define, dummy.Compile)
@@ -73,18 +74,15 @@ func (b *hashBaseConversion) assignInputs(run *wizard.ProverRuntime) {
sliceLoB[j] = common.NewVectorBuilder(b.Inputs.LimbsLoB[j])
}
// #nosec G404 -- we don't need a cryptographic PRNG for testing purposes
rng := rand.New(utils.NewRandSource(678988))
max := keccakf.BaseBPow4
for j := range sliceHiB {
for row := 0; row < size; row++ {
// generate a random value in baseB
// #nosec G404 -- we don't need a cryptographic PRNG for testing purposes
rng := rand.New(rand.NewSource(int64(row * j)))
// #nosec G404 -- we don't need a cryptographic PRNG for testing purposes
rngm := rand.New(rand.NewSource(int64((row + 3) * j)))
n := rng.Intn(max) + 1
m := rngm.Intn(max) + 1
sliceHiB[j].PushInt(n)
sliceLoB[j].PushInt(m)
sliceHiB[j].PushInt(rng.IntN(max))
sliceLoB[j].PushInt(rng.IntN(max))
}
}

View File

@@ -1,13 +1,14 @@
package base_conversion
import (
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/common"
"github.com/stretchr/testify/assert"
)
@@ -16,6 +17,8 @@ func makeTestCaseDecomposeBE() (
define wizard.DefineFunc,
prover wizard.ProverStep,
) {
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rand := rand.New(utils.NewRandSource(0))
size := 16
d := &decompositionCtx{}
define = func(build *wizard.Builder) {
@@ -35,7 +38,7 @@ func makeTestCaseDecomposeBE() (
)
for row := 0; row < size; row++ {
b := make([]byte, 8)
rand.Read(b) //nolint
utils.ReadPseudoRand(rand, b)
f := *new(field.Element).SetBytes(b)
col.PushField(f)
}

View File

@@ -1,13 +1,14 @@
package keccakf
import (
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/crypto/keccak"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/stretchr/testify/assert"
)
@@ -40,7 +41,7 @@ func MakeTestCaseInputOutputModule(maxNumKeccakF int) (
func TestInputOutputModule(t *testing.T) {
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rng := rand.New(rand.NewSource(0))
rng := rand.New(rand.NewChaCha8([32]byte{}))
numCases := 2
maxNumKeccakf := 64
// The -1 is here to prevent the generation of a padding block
@@ -51,9 +52,9 @@ func TestInputOutputModule(t *testing.T) {
for i := 0; i < numCases; i++ {
// Generate a random piece of data
dataSize := rng.Intn(maxInputSize + 1)
dataSize := rng.IntN(maxInputSize + 1)
data := make([]byte, dataSize)
rng.Read(data)
utils.ReadPseudoRand(rng, data)
// Generate permutation traces for the data
traces := keccak.PermTraces{}

View File

@@ -4,7 +4,7 @@ package keccakf
import (
"fmt"
"math/rand"
"math/rand/v2"
"sync"
"testing"
@@ -15,6 +15,7 @@ import (
"github.com/consensys/linea-monorepo/prover/protocol/compiler/permutation"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/specialqueries"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/stretchr/testify/assert"
)
@@ -72,7 +73,7 @@ func keccakfTestingModule(
func TestKeccakf(t *testing.T) {
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rng := rand.New(rand.NewSource(0))
rng := rand.New(rand.NewChaCha8([32]byte{}))
numCases := 15
maxNumKeccakf := 5
// The -1 is here to prevent the generation of a padding block
@@ -83,9 +84,9 @@ func TestKeccakf(t *testing.T) {
for i := 0; i < numCases; i++ {
// Generate a random piece of data
dataSize := rng.Intn(maxInputSize + 1)
dataSize := rng.IntN(maxInputSize + 1)
data := make([]byte, dataSize)
rng.Read(data)
utils.ReadPseudoRand(rng, data)
// Generate permutation traces for the data
traces := keccak.PermTraces{}

View File

@@ -3,7 +3,7 @@
package keccakf
import (
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/crypto/keccak"
@@ -141,7 +141,7 @@ func TestPiChiIota(t *testing.T) {
maxKeccaf := 10
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rnd := rand.New(rand.NewSource(0))
rnd := rand.New(rand.NewChaCha8([32]byte{}))
// Every time the prover function is called, the traces will be updated.
// Likewise, run will be set by the prover.

View File

@@ -3,7 +3,7 @@
package keccakf
import (
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/crypto/keccak"
@@ -145,7 +145,7 @@ func TestRho(t *testing.T) {
maxKeccaf := 10
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rnd := rand.New(rand.NewSource(0))
rnd := rand.New(rand.NewChaCha8([32]byte{}))
// Every time the prover function is called, the traces will be updated.
// Likewise, run will be set by the prover.

View File

@@ -3,7 +3,7 @@
package keccakf
import (
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/crypto/keccak"
@@ -90,9 +90,9 @@ func testInputProvider(rnd *rand.Rand, maxNumKeccakf int) InputWitnessProvider {
for len(res.Blocks) < effNumKeccak {
// Each hash is for a random string taking at most 3 permutations
streamLen := rnd.Intn(3*keccak.Rate-1) + 1
streamLen := rnd.IntN(3*keccak.Rate-1) + 1
stream := make([]byte, streamLen)
rnd.Read(stream)
utils.ReadPseudoRand(rnd, stream)
for i := 0; i < effNumKeccak; i++ {
keccak.Hash(stream, &res)
@@ -119,7 +119,7 @@ func TestTheta(t *testing.T) {
maxKeccaf := 10
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rnd := rand.New(rand.NewSource(0))
rnd := rand.New(rand.NewChaCha8([32]byte{}))
// Every time the prover function is called, the traces will be updated.
// Likewise, run will be set by the prover.

View File

@@ -3,7 +3,7 @@
package keccakf
import (
"math/rand"
"math/rand/v2"
"testing"
"github.com/consensys/linea-monorepo/prover/maths/field"
@@ -15,7 +15,7 @@ func TestU64FromToBase(t *testing.T) {
const numCases int = 100
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rnd := rand.New(rand.NewSource(0))
rnd := rand.New(rand.NewChaCha8([32]byte{}))
base1 := field.NewElement(uint64(BaseA))
base2 := field.NewElement(uint64(BaseB))
@@ -61,7 +61,7 @@ func TestBaseDecomposeRecompose(t *testing.T) {
const numCases int = 100
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rnd := rand.New(rand.NewSource(0))
rnd := rand.New(rand.NewChaCha8([32]byte{}))
base1 := field.NewElement(uint64(BaseA))
base2 := field.NewElement(uint64(BaseB))
@@ -93,7 +93,7 @@ func TestDecomposeInSlice(t *testing.T) {
const numCases int = 100
// #nosec G404 --we don't need a cryptographic RNG for testing purpose
rnd := rand.New(rand.NewSource(0))
rnd := rand.New(rand.NewChaCha8([32]byte{}))
base1 := field.NewElement(uint64(BaseA))
base2 := field.NewElement(uint64(BaseB))

View File

@@ -1,7 +1,7 @@
package packing
import (
"math/rand"
"math/rand/v2"
"github.com/consensys/linea-monorepo/prover/maths/common/smartvectors"
"github.com/consensys/linea-monorepo/prover/maths/common/vector"
@@ -27,6 +27,7 @@ func table(t *dataTraceImported, numHash, blockSize, size int) [][]byte {
limbs = make([][][]byte, numHash)
nByte = make([][]int, numHash)
isNewHash = make([][]int, numHash)
rand = rand.New(utils.NewRandSource(0)) // nolint
)
// build the stream for each hash.
@@ -39,17 +40,17 @@ func table(t *dataTraceImported, numHash, blockSize, size int) [][]byte {
m := size / (numHash * 15)
// number of limbs for the current hash
// added +1 to prevent edge-cases
nlimb := rand.Intn(m) + 1 //nolint
nlimb := rand.IntN(m) + 1 //nolint
s[i] = 0
for j := 0; j < nlimb; j++ {
// generate random bytes
// choose a random length for the slice
length := rand.Intn(MAXNBYTE) + 1 //nolint
length := rand.IntN(MAXNBYTE) + 1 //nolint
// generate random bytes
slice := make([]byte, length)
_, err := rand.Read(slice) //nolint
_, err := utils.ReadPseudoRand(rand, slice)
if err != nil {
logrus.Fatalf("error while generating random bytes: %s", err)
}
@@ -77,7 +78,7 @@ func table(t *dataTraceImported, numHash, blockSize, size int) [][]byte {
for n > MAXNBYTE {
// generate random bytes
slice := make([]byte, MAXNBYTE)
_, err := rand.Read(slice) //nolint
_, err := utils.ReadPseudoRand(rand, slice)
if err != nil {
logrus.Fatalf("error while generating random bytes: %s", err)
}
@@ -93,7 +94,7 @@ func table(t *dataTraceImported, numHash, blockSize, size int) [][]byte {
}
// generate random bytes
slice := make([]byte, n)
_, err := rand.Read(slice) //nolint
_, err := utils.ReadPseudoRand(rand, slice)
if err != nil {
logrus.Fatalf("error while generating random bytes: %s", err)
}

View File

@@ -4,7 +4,7 @@ import (
"fmt"
"io"
"math/big"
"math/rand"
"math/rand/v2"
"github.com/consensys/gnark/std/math/emulated/emparams"
"github.com/consensys/linea-monorepo/prover/backend/files"
@@ -29,7 +29,7 @@ var testCases = []struct {
var (
tab = make([][]*big.Int, 5)
rng = rand.New(rand.NewSource(87987559))
rng = rand.New(rand.NewChaCha8([32]byte{}))
inst = createRandomModexp(rng, false)
)
@@ -43,7 +43,7 @@ var testCases = []struct {
var (
tab = make([][]*big.Int, 5)
rng = rand.New(rand.NewSource(324480342))
rng = rand.New(rand.NewChaCha8([32]byte{}))
inst = createRandomModexp(rng, true)
)

View File

@@ -0,0 +1,198 @@
package codehashconsistency
import (
"slices"
"github.com/consensys/linea-monorepo/prover/maths/common/smartvectors"
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/common"
)
// Assign assigns the columns internally defined in `mod` into `run`.
func (mod Module) Assign(run *wizard.ProverRuntime) {
var (
ssInput = mod.StateSummaryInput
mchInput = mod.MimcCodeHashInput
)
externalSs := struct {
IsActive smartvectors.SmartVector
IsStorage smartvectors.SmartVector
InitMiMC smartvectors.SmartVector
InitKeccakLo smartvectors.SmartVector
InitKeccakHi smartvectors.SmartVector
FinalMiMC smartvectors.SmartVector
FinalKeccakLo smartvectors.SmartVector
FinalKeccakHi smartvectors.SmartVector
}{
IsActive: ssInput.IsActive.GetColAssignment(run),
IsStorage: ssInput.IsStorage.GetColAssignment(run),
InitMiMC: ssInput.Account.Initial.MiMCCodeHash.GetColAssignment(run),
InitKeccakHi: ssInput.Account.Initial.KeccakCodeHash.Hi.GetColAssignment(run),
InitKeccakLo: ssInput.Account.Initial.KeccakCodeHash.Lo.GetColAssignment(run),
FinalMiMC: ssInput.Account.Final.MiMCCodeHash.GetColAssignment(run),
FinalKeccakHi: ssInput.Account.Final.KeccakCodeHash.Hi.GetColAssignment(run),
FinalKeccakLo: ssInput.Account.Final.KeccakCodeHash.Lo.GetColAssignment(run),
}
externalRom := struct {
IsActive smartvectors.SmartVector
IsHashEnd smartvectors.SmartVector
NewState smartvectors.SmartVector
CodeHashHi smartvectors.SmartVector
CodeHashLo smartvectors.SmartVector
}{
IsActive: mchInput.IsActive.GetColAssignment(run),
IsHashEnd: mchInput.IsHashEnd.GetColAssignment(run),
NewState: mchInput.NewState.GetColAssignment(run),
CodeHashHi: mchInput.CodeHashHi.GetColAssignment(run),
CodeHashLo: mchInput.CodeHashLo.GetColAssignment(run),
}
var (
ssData = make([][3]field.Element, 0, 2*externalSs.InitMiMC.Len())
romData = make([][3]field.Element, 0, externalRom.IsHashEnd.Len())
)
for i := 0; i < externalSs.InitMiMC.Len(); i++ {
if isActive := externalSs.IsActive.Get(i); isActive.IsZero() {
break
}
if isStorage := externalSs.IsStorage.Get(i); isStorage.IsOne() {
continue
}
ssData = append(ssData,
[3]field.Element{
externalSs.InitMiMC.Get(i),
externalSs.InitKeccakHi.Get(i),
externalSs.InitKeccakLo.Get(i),
},
[3]field.Element{
externalSs.FinalMiMC.Get(i),
externalSs.FinalKeccakHi.Get(i),
externalSs.FinalKeccakLo.Get(i),
},
)
}
for i := 0; i < externalRom.NewState.Len(); i++ {
if isActive := externalRom.IsActive.Get(i); isActive.IsZero() {
break
}
if isHashEnd := externalRom.IsHashEnd.Get(i); isHashEnd.IsZero() {
continue
}
romData = append(romData,
[3]field.Element{
externalRom.NewState.Get(i),
externalRom.CodeHashHi.Get(i),
externalRom.CodeHashLo.Get(i),
},
)
}
cmp := func(a, b [3]field.Element) int {
if res := a[1].Cmp(&b[1]); res != 0 {
return res
}
return a[2].Cmp(&b[2])
}
slices.SortFunc(ssData, cmp)
slices.SortFunc(romData, cmp)
ssData = slices.Compact(ssData)
romData = slices.Compact(romData)
ssData = slices.Clip(ssData)
romData = slices.Clip(romData)
assignment := struct {
IsActive *common.VectorBuilder
StateSumKeccak common.HiLoAssignmentBuilder
StateSumMiMC *common.VectorBuilder
RomKeccak common.HiLoAssignmentBuilder
RomMiMC *common.VectorBuilder
RomOngoing *common.VectorBuilder
StateSumOngoing *common.VectorBuilder
}{
IsActive: common.NewVectorBuilder(mod.IsActive),
StateSumKeccak: common.NewHiLoAssignmentBuilder(mod.StateSumKeccak),
RomKeccak: common.NewHiLoAssignmentBuilder(mod.RomKeccak),
StateSumMiMC: common.NewVectorBuilder(mod.StateSumMiMC),
RomMiMC: common.NewVectorBuilder(mod.RomMiMC),
RomOngoing: common.NewVectorBuilder(mod.RomOngoing),
StateSumOngoing: common.NewVectorBuilder(mod.StateSumOngoing),
}
var (
cRom int = 0
cSS int = 0
nbRowMax = len(romData) + len(ssData)
)
assign_loop:
for i := 0; i < nbRowMax; i++ {
var (
romRow = romData[cRom]
ssRow = ssData[cSS]
romCmpSs = cmp(romRow, ssRow)
)
assignment.IsActive.PushOne()
assignment.RomMiMC.PushField(romRow[0])
assignment.RomKeccak.Hi.PushField(romRow[1])
assignment.RomKeccak.Lo.PushField(romRow[2])
assignment.RomOngoing.PushBoolean(cRom < len(romData)-1)
assignment.StateSumMiMC.PushField(ssRow[0])
assignment.StateSumKeccak.Hi.PushField(ssRow[1])
assignment.StateSumKeccak.Lo.PushField(ssRow[2])
assignment.StateSumOngoing.PushBoolean(cSS < len(ssData)-1)
var (
isLastSS = cSS >= len(ssData)-1
isLastRom = cRom >= len(romData)-1
)
switch {
case isLastSS && isLastRom:
break assign_loop
case !isLastSS && isLastRom:
cSS++
case isLastSS && !isLastRom:
cRom++
case romCmpSs < 0:
cRom++
case romCmpSs == 0:
cRom++
cSS++
case romCmpSs > 0:
cSS++
}
}
assignment.IsActive.PadAndAssign(run, field.Zero())
assignment.RomMiMC.PadAndAssign(run, field.Zero())
assignment.RomKeccak.Hi.PadAndAssign(run, field.Zero())
assignment.RomKeccak.Lo.PadAndAssign(run, field.Zero())
assignment.RomOngoing.PadAndAssign(run, field.Zero())
assignment.StateSumMiMC.PadAndAssign(run, field.Zero())
assignment.StateSumKeccak.Hi.PadAndAssign(run, field.Zero())
assignment.StateSumKeccak.Lo.PadAndAssign(run, field.Zero())
assignment.StateSumOngoing.PadAndAssign(run, field.Zero())
mod.CptStateSumKeccakLimbsHi.Run(run)
mod.CptStateSumKeccakLimbsLo.Run(run)
mod.CptRomKeccakLimbsHi.Run(run)
mod.CptRomKeccakLimbsLo.Run(run)
mod.CmpStateSumLimbs.Run(run)
mod.CmpRomLimbs.Run(run)
mod.CmpRomVsStateSumLimbs.Run(run)
}

View File

@@ -0,0 +1,307 @@
// codehashconsistency implements the necessary constraints to enforce consistency
// between the mimccodehash module and the statesummary module. The constraints
// generated in this package essentially aim at ensuring that
package codehashconsistency
import (
"github.com/consensys/linea-monorepo/prover/protocol/column"
"github.com/consensys/linea-monorepo/prover/protocol/dedicated/byte32cmp"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
sym "github.com/consensys/linea-monorepo/prover/symbolic"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/common"
commonconstraints "github.com/consensys/linea-monorepo/prover/zkevm/prover/common/common_constraints"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/mimccodehash"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/statesummary"
)
// Module stores the column expressing the consistency between the
// [mimccodehash.Module] (computing the MiMCCodeHash from the code in the ROM
// module and exposing the corresponding codehash) and the [statesummary.Module]
// (recording the access to the state, thus holding the KeccakCodeHash and the
// MiMCCode hash of the registered contracts). The consistency check is achieved
// by ensuring that if a Keccak is present in both the MiMCCodeHash and the
// StateSummary, then the corresponding KeccakCodeHash must be equal. This
// ensures that code exposed in the ROM module is the same as what is in the
// state.
type Module struct {
StateSummaryInput *statesummary.Module
MimcCodeHashInput *mimccodehash.Module
IsActive ifaces.Column
StateSumKeccak common.HiLoColumns
StateSumMiMC ifaces.Column
StateSumOngoing ifaces.Column
RomKeccak common.HiLoColumns
RomMiMC ifaces.Column
RomOngoing ifaces.Column
StateSumKeccakLimbs byte32cmp.LimbColumns
RomKeccakLimbs byte32cmp.LimbColumns
CptStateSumKeccakLimbsHi wizard.ProverAction
CptStateSumKeccakLimbsLo wizard.ProverAction
CptRomKeccakLimbsHi wizard.ProverAction
CptRomKeccakLimbsLo wizard.ProverAction
CmpStateSumLimbs wizard.ProverAction
CmpRomLimbs wizard.ProverAction
CmpRomVsStateSumLimbs wizard.ProverAction
StateSumIsGtRom, StateSumIsEqRom, StateSumIsLtRom ifaces.Column
StateSumIsConst, StateSumIncreased ifaces.Column
RomIsConst, RomIncreased ifaces.Column
}
// NewModule returns a constrained [Module] connecting `ss` with `mch`. `name`
// is used as a prefix for the name of all the generated columns and constraints.
func NewModule(comp *wizard.CompiledIOP, name string, ss *statesummary.Module, mch *mimccodehash.Module) Module {
name = name + "_CODEHASH_CONSISTENCY"
size := ss.IsActive.Size() + mch.IsActive.Size()
ch := Module{
StateSummaryInput: ss,
MimcCodeHashInput: mch,
IsActive: comp.InsertCommit(0, ifaces.ColIDf(name+"_IS_ACTIVE"), size),
StateSumKeccak: common.NewHiLoColumns(comp, size, name+"_STATE_SUMMARY_KECCAK"),
RomKeccak: common.NewHiLoColumns(comp, size, name+"_ROM_KECCAK"),
StateSumMiMC: comp.InsertCommit(0, ifaces.ColID(name+"_STATE_SUMMARY_MIMC"), size),
RomMiMC: comp.InsertCommit(0, ifaces.ColID(name+"_ROM_MIMC"), size),
RomOngoing: comp.InsertCommit(0, ifaces.ColID(name+"_ROM_ONGOING"), size),
StateSumOngoing: comp.InsertCommit(0, ifaces.ColID(name+"_STATE_SUM_ONGOING"), size),
}
commonconstraints.MustBeActivationColumns(comp, ch.IsActive)
commonconstraints.MustBeActivationColumns(comp, ch.RomOngoing)
commonconstraints.MustBeActivationColumns(comp, ch.StateSumOngoing)
commonconstraints.MustZeroWhenInactive(comp, ch.IsActive,
ch.StateSumKeccak.Hi,
ch.StateSumKeccak.Lo,
ch.StateSumMiMC,
ch.StateSumOngoing,
ch.RomKeccak.Hi,
ch.RomKeccak.Lo,
ch.RomMiMC,
ch.RomOngoing,
)
var (
romDecreased ifaces.Column
stateSumDecreased ifaces.Column
romLimbsHi, romLimbsLo byte32cmp.LimbColumns
stateSumLimbsHi, stateSumLimbsLo byte32cmp.LimbColumns
)
romLimbsHi, ch.CptRomKeccakLimbsHi = byte32cmp.Decompose(comp, ch.RomKeccak.Hi, 8, 16)
romLimbsLo, ch.CptRomKeccakLimbsLo = byte32cmp.Decompose(comp, ch.RomKeccak.Lo, 8, 16)
stateSumLimbsHi, ch.CptStateSumKeccakLimbsHi = byte32cmp.Decompose(comp, ch.StateSumKeccak.Hi, 8, 16)
stateSumLimbsLo, ch.CptStateSumKeccakLimbsLo = byte32cmp.Decompose(comp, ch.StateSumKeccak.Lo, 8, 16)
ch.RomKeccakLimbs = byte32cmp.FuseLimbs(romLimbsLo, romLimbsHi)
ch.StateSumKeccakLimbs = byte32cmp.FuseLimbs(stateSumLimbsLo, stateSumLimbsHi)
ch.RomIncreased, ch.RomIsConst, romDecreased, ch.CmpRomLimbs = byte32cmp.CmpMultiLimbs(
comp,
ch.RomKeccakLimbs,
ch.RomKeccakLimbs.Shift(-1),
)
ch.StateSumIncreased, ch.StateSumIsConst, stateSumDecreased, ch.CmpStateSumLimbs = byte32cmp.CmpMultiLimbs(
comp,
ch.StateSumKeccakLimbs,
ch.StateSumKeccakLimbs.Shift(-1),
)
ch.StateSumIsGtRom, ch.StateSumIsEqRom, ch.StateSumIsLtRom, ch.CmpRomVsStateSumLimbs = byte32cmp.CmpMultiLimbs(
comp,
ch.StateSumKeccakLimbs,
ch.RomKeccakLimbs,
)
comp.InsertGlobal(
0,
ifaces.QueryID(name+"_ROM_IS_SORTED"),
sym.Mul(ch.IsActive, romDecreased),
)
comp.InsertGlobal(
0,
ifaces.QueryID(name+"_STATE_SUMMARY_IS_SORTED"),
sym.Mul(ch.IsActive, stateSumDecreased),
)
// This constraint ensures that the state summary cursor. Is correctly
// updated. It follows the following rules:
//
// NB: Since we have sorting constraints. We know that ROM and SS may
// only increase or stay constant. Therefore, enforcing the constant
//
// switch {
// case IsActive == 0:
// // No constraints applied
// case IsSSOngoing == 0:
// assert ssMustBeConstant == 1
// case ss > rom:
// assert ssMustBeConstant == 1
// else:
// assert ssMustBeConstant == 0
// }
//
// The reciproqual constraint is enforced over the ROM module.
comp.InsertGlobal(
0,
ifaces.QueryID(name+"_STATE_SUM_STAY_SAME"),
sym.Mul(
ch.IsActive,
sym.Sub(
column.Shift(ch.StateSumIsConst, 1),
sym.Mul(
ch.RomOngoing,
sym.Add(
sym.Sub(1, ch.StateSumOngoing),
sym.Mul(
ch.StateSumOngoing,
ch.StateSumIsGtRom,
),
),
),
),
),
)
comp.InsertGlobal(
0,
ifaces.QueryID(name+"_ROM_STAY_SAME"),
sym.Mul(
ch.IsActive,
sym.Sub(
ch.RomIsConst,
sym.Mul(
column.Shift(ch.StateSumOngoing, -1),
sym.Add(
sym.Sub(1, column.Shift(ch.RomOngoing, -1)),
sym.Mul(
column.Shift(ch.RomOngoing, -1),
column.Shift(ch.StateSumIsLtRom, -1),
),
),
),
),
),
)
comp.InsertGlobal(
0,
ifaces.QueryID(name+"_KECCAK_CONSISTENCY_HI"),
sym.Mul(
ch.StateSumIsEqRom,
sym.Sub(ch.RomKeccak.Hi, ch.StateSumKeccak.Hi),
),
)
comp.InsertGlobal(
0,
ifaces.QueryID(name+"_KECCAK_CONSISTENCY_LO"),
sym.Mul(
ch.StateSumIsEqRom,
sym.Sub(ch.RomKeccak.Lo, ch.StateSumKeccak.Lo),
),
)
comp.GenericFragmentedConditionalInclusion(
0,
ifaces.QueryID(name+"_IMPORT_STATE_SUMMARY_BACK"),
[][]ifaces.Column{
{
ss.Account.Initial.MiMCCodeHash,
ss.Account.Initial.KeccakCodeHash.Hi,
ss.Account.Initial.KeccakCodeHash.Lo,
},
{
ss.Account.Final.MiMCCodeHash,
ss.Account.Final.KeccakCodeHash.Hi,
ss.Account.Final.KeccakCodeHash.Lo,
},
},
[]ifaces.Column{
ch.StateSumMiMC,
ch.StateSumKeccak.Hi,
ch.StateSumKeccak.Lo,
},
[]ifaces.Column{
ss.IsActive,
ss.IsActive,
},
ch.IsActive,
)
comp.InsertInclusionDoubleConditional(
0,
ifaces.QueryIDf(name+"_IMPORT_STATE_SUMMARY_FORTH_INITIAL"),
[]ifaces.Column{
ch.StateSumMiMC,
ch.StateSumKeccak.Hi,
ch.StateSumKeccak.Lo,
},
[]ifaces.Column{
ss.Account.Initial.MiMCCodeHash,
ss.Account.Initial.KeccakCodeHash.Hi,
ss.Account.Initial.KeccakCodeHash.Lo,
},
ch.IsActive,
ss.IsActive,
)
comp.InsertInclusionDoubleConditional(
0,
ifaces.QueryIDf(name+"_IMPORT_STATE_SUMMARY_FORTH_FINAL"),
[]ifaces.Column{
ch.StateSumMiMC,
ch.StateSumKeccak.Hi,
ch.StateSumKeccak.Lo,
},
[]ifaces.Column{
ss.Account.Final.MiMCCodeHash,
ss.Account.Final.KeccakCodeHash.Hi,
ss.Account.Final.KeccakCodeHash.Lo,
},
ch.IsActive,
ss.IsActive,
)
comp.InsertInclusionDoubleConditional(
0,
ifaces.QueryIDf(name+"_IMPORT_MIMC_CODE_HASH_FORTH"),
[]ifaces.Column{
ch.RomMiMC,
ch.RomKeccak.Hi,
ch.RomKeccak.Lo,
},
[]ifaces.Column{
mch.NewState,
mch.CodeHashHi,
mch.CodeHashLo,
},
ch.IsActive,
mch.IsHashEnd,
)
comp.InsertInclusionDoubleConditional(
0,
ifaces.QueryIDf(name+"_IMPORT_MIMC_CODE_HASH_BACK"),
[]ifaces.Column{
mch.NewState,
mch.CodeHashHi,
mch.CodeHashLo,
},
[]ifaces.Column{
ch.RomMiMC,
ch.RomKeccak.Hi,
ch.RomKeccak.Lo,
},
mch.IsHashEnd,
ch.IsActive,
)
return ch
}

View File

@@ -0,0 +1,240 @@
package codehashconsistency
import (
"fmt"
"math/rand/v2"
"slices"
"testing"
"github.com/consensys/linea-monorepo/prover/backend/files"
"github.com/consensys/linea-monorepo/prover/maths/common/smartvectors"
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/compiler/dummy"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/consensys/linea-monorepo/prover/utils/csvtraces"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/common"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/mimccodehash"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/statesummary"
)
func TestConsistency(t *testing.T) {
var (
stateSummary *statesummary.Module
mimcCodeHash *mimccodehash.Module
consistency Module
sizeStateSummary = 128
sizeMimcCodeHash = 128
)
define := func(b *wizard.Builder) {
stateSummary = &statesummary.Module{
IsActive: b.InsertCommit(0, "SS_IS_ACTIVE", sizeStateSummary),
IsStorage: b.InsertCommit(0, "SS_IS_STORAGE", sizeStateSummary),
Account: statesummary.AccountPeek{
Initial: statesummary.Account{
KeccakCodeHash: common.NewHiLoColumns(b.CompiledIOP, sizeStateSummary, "SS_INITIAL_KECCAK"),
MiMCCodeHash: b.InsertCommit(0, "SS_INITIAL_MIMC", sizeStateSummary),
},
Final: statesummary.Account{
KeccakCodeHash: common.NewHiLoColumns(b.CompiledIOP, sizeStateSummary, "SS_FINAL_KECCAK"),
MiMCCodeHash: b.InsertCommit(0, "SS_FINAL_MIMC", sizeStateSummary),
},
},
}
mimcCodeHash = &mimccodehash.Module{
IsActive: b.InsertCommit(0, "MCH_IS_ACTIVE", sizeMimcCodeHash),
IsHashEnd: b.InsertCommit(0, "MCH_IS_HASH_END", sizeMimcCodeHash),
NewState: b.InsertCommit(0, "MCH_NEW_STATE", sizeMimcCodeHash),
CodeHashHi: b.InsertCommit(0, "MCH_KECCAK_HI", sizeMimcCodeHash),
CodeHashLo: b.InsertCommit(0, "MCH_KECCAK_LO", sizeMimcCodeHash),
}
consistency = NewModule(b.CompiledIOP, "CONSISTENCY", stateSummary, mimcCodeHash)
}
prover := func(run *wizard.ProverRuntime) {
mchCt := csvtraces.MustOpenCsvFile("testdata/mimc-codehash.csv")
ssCt := csvtraces.MustOpenCsvFile("testdata/state-summary.csv")
run.AssignColumn(mimcCodeHash.IsActive.GetColID(), smartvectors.RightZeroPadded(mchCt.Get("IS_ACTIVE"), sizeMimcCodeHash))
run.AssignColumn(mimcCodeHash.IsHashEnd.GetColID(), smartvectors.RightZeroPadded(mchCt.Get("IS_HASH_END"), sizeMimcCodeHash))
run.AssignColumn(mimcCodeHash.NewState.GetColID(), smartvectors.RightZeroPadded(mchCt.Get("NEW_STATE"), sizeMimcCodeHash))
run.AssignColumn(mimcCodeHash.CodeHashHi.GetColID(), smartvectors.RightZeroPadded(mchCt.Get("KECCAK_HI"), sizeMimcCodeHash))
run.AssignColumn(mimcCodeHash.CodeHashLo.GetColID(), smartvectors.RightZeroPadded(mchCt.Get("KECCAK_LO"), sizeMimcCodeHash))
run.AssignColumn(stateSummary.IsActive.GetColID(), smartvectors.RightZeroPadded(ssCt.Get("IS_ACTIVE"), sizeStateSummary))
run.AssignColumn(stateSummary.IsStorage.GetColID(), smartvectors.RightZeroPadded(ssCt.Get("IS_STORAGE"), sizeStateSummary))
run.AssignColumn(stateSummary.Account.Initial.MiMCCodeHash.GetColID(), smartvectors.RightZeroPadded(ssCt.Get("INITIAL_MIMC"), sizeStateSummary))
run.AssignColumn(stateSummary.Account.Final.MiMCCodeHash.GetColID(), smartvectors.RightZeroPadded(ssCt.Get("FINAL_MIMC"), sizeStateSummary))
run.AssignColumn(stateSummary.Account.Initial.KeccakCodeHash.Hi.GetColID(), smartvectors.RightZeroPadded(ssCt.Get("INITIAL_KECCAK_HI"), sizeStateSummary))
run.AssignColumn(stateSummary.Account.Final.KeccakCodeHash.Hi.GetColID(), smartvectors.RightZeroPadded(ssCt.Get("FINAL_KECCAK_HI"), sizeStateSummary))
run.AssignColumn(stateSummary.Account.Initial.KeccakCodeHash.Lo.GetColID(), smartvectors.RightZeroPadded(ssCt.Get("INITIAL_KECCAK_LO"), sizeStateSummary))
run.AssignColumn(stateSummary.Account.Final.KeccakCodeHash.Lo.GetColID(), smartvectors.RightZeroPadded(ssCt.Get("FINAL_KECCAK_LO"), sizeStateSummary))
consistency.Assign(run)
}
comp := wizard.Compile(define, dummy.CompileAtProverLvl)
_ = wizard.Prove(comp, prover)
}
// TestCaseGeneration generates testdata csv and does not test anything per se.
// To re-generate the testcases, you need to unskip it.
func TestCaseGeneration(t *testing.T) {
t.Skip()
var (
rng = rand.New(utils.NewRandSource(67569)) // nolint
shared = [][3]field.Element{}
numSharedRow = 1
numStateSummaryRow = 128
numCodeHashRow = 128
)
randRow := func() [3]field.Element {
row := [3]field.Element{}
row[0] = field.PseudoRand(rng)
row[1] = field.PseudoRandTruncated(rng, 16)
row[2] = field.PseudoRandTruncated(rng, 16)
return row
}
for i := 0; i < numSharedRow; i++ {
shared = append(shared, randRow())
}
var (
ssIsActive = make([]field.Element, 0)
ssIsStorage = make([]field.Element, 0)
ssInitMimc = make([]field.Element, 0)
ssInitKeccakHi = make([]field.Element, 0)
ssInitKeccakLo = make([]field.Element, 0)
ssFinalMimc = make([]field.Element, 0)
ssFinalKeccakHi = make([]field.Element, 0)
ssFinalKeccakLo = make([]field.Element, 0)
)
for i := 0; i < numStateSummaryRow; i++ {
c := rng.IntN(4)
if i == 0 {
c = 0
}
switch {
default:
ssIsActive = append(ssIsActive, field.One())
ssIsStorage = append(ssIsStorage, field.One())
ssInitMimc = append(ssInitMimc, ssInitMimc[i-1])
ssInitKeccakHi = append(ssInitKeccakHi, ssInitKeccakHi[i-1])
ssInitKeccakLo = append(ssInitKeccakLo, ssInitKeccakLo[i-1])
ssFinalMimc = append(ssFinalMimc, ssFinalMimc[i-1])
ssFinalKeccakHi = append(ssFinalKeccakHi, ssFinalKeccakHi[i-1])
ssFinalKeccakLo = append(ssFinalKeccakLo, ssFinalKeccakLo[i-1])
case c == 0 || c == 1:
var newInit, newFinal [3]field.Element
if c == 0 {
newInit = randRow()
newFinal = randRow()
}
if c == 1 {
fmt.Printf("row %v of state summary is shared\n", i)
newInit = randChoose(rng, shared)
newFinal = randChoose(rng, shared)
}
ssIsActive = append(ssIsActive, field.One())
ssIsStorage = append(ssIsStorage, field.Zero())
ssInitMimc = append(ssInitMimc, newInit[0])
ssInitKeccakHi = append(ssInitKeccakHi, newInit[1])
ssInitKeccakLo = append(ssInitKeccakLo, newInit[2])
ssFinalMimc = append(ssFinalMimc, newFinal[0])
ssFinalKeccakHi = append(ssFinalKeccakHi, newFinal[1])
ssFinalKeccakLo = append(ssFinalKeccakLo, newFinal[2])
}
}
csvtraces.WriteExplicit(
files.MustOverwrite("./testdata/state-summary.csv"),
[]string{"IS_ACTIVE", "IS_STORAGE", "INITIAL_MIMC", "INITIAL_KECCAK_HI", "INITIAL_KECCAK_LO", "FINAL_MIMC", "FINAL_KECCAK_HI", "FINAL_KECCAK_LO"},
[][]field.Element{ssIsActive, ssIsStorage, ssInitMimc, ssInitKeccakHi, ssInitKeccakLo, ssFinalMimc, ssFinalKeccakHi, ssFinalKeccakLo},
false,
)
/*
For the codehash module, the rows are generated in reverse order and
then reverted.
*/
var (
romIsActive = make([]field.Element, 0)
romIsHashEnd = make([]field.Element, 0)
romNewState = make([]field.Element, 0)
romKeccakHi = make([]field.Element, 0)
romKeccakLo = make([]field.Element, 0)
)
for i := 0; i < numCodeHashRow; i++ {
c0 := rng.Int64N(4)
switch {
case c0 == 0 || c0 == 1 || i == 0:
row := randRow()
if c0 == 0 {
fmt.Printf("row %v of rom is shared\n", i)
row = randChoose(rng, shared)
}
romIsActive = append(romIsActive, field.One())
romIsHashEnd = append(romIsHashEnd, field.One())
romNewState = append(romNewState, row[0])
romKeccakHi = append(romKeccakHi, row[1])
romKeccakLo = append(romKeccakLo, row[2])
default:
romIsActive = append(romIsActive, field.One())
romIsHashEnd = append(romIsHashEnd, field.Zero())
romNewState = append(romNewState, field.PseudoRand(rng))
romKeccakHi = append(romKeccakHi, romKeccakHi[i-1])
romKeccakLo = append(romKeccakLo, romKeccakLo[i-1])
}
}
slices.Reverse(romIsActive)
slices.Reverse(romIsHashEnd)
slices.Reverse(romNewState)
slices.Reverse(romKeccakHi)
slices.Reverse(romKeccakLo)
csvtraces.WriteExplicit(
files.MustOverwrite("./testdata/mimc-codehash.csv"),
[]string{"IS_ACTIVE", "IS_HASH_END", "NEW_STATE", "KECCAK_HI", "KECCAK_LO"},
[][]field.Element{romIsActive, romIsHashEnd, romNewState, romKeccakHi, romKeccakLo},
false,
)
}
func randChoose[T any](rand *rand.Rand, slice []T) T {
return slice[rand.IntN(len(slice))]
}

View File

@@ -0,0 +1,129 @@
IS_ACTIVE,IS_HASH_END,NEW_STATE,KECCAK_HI,KECCAK_LO
1,1,0x2832c4ca6424810b7f8962bc82b269b30ba0ef55d7af69bf1b477ab403738c2,0x14aea944ed77b7b1fe8683f5bceacf51,0xd781f7985b442e59127381e5e1c05ade
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x2d349ff43a8c9e143fb581eb8525fae26eb4698c2227dcf0934b4daa8c011c7,0x79714203be4ed636b9108ae8d2374bf0,0x9550a055dc182cc874974f93de508583
1,0,0x9cea234e3013dfff332601b7a571d594e2fe104822879fc503287528b9fc229,0x79714203be4ed636b9108ae8d2374bf0,0x9550a055dc182cc874974f93de508583
1,1,0x2e84cb4461e289664e59e3d9689d1ab5a64224aee8929d13df4b726a594cfa1,0x79714203be4ed636b9108ae8d2374bf0,0x9550a055dc182cc874974f93de508583
1,1,0x83610901e4d6e423b977de6696ae0f49d777231edb2444e9f5fd85e2b8ea60e,0x62024c1946f6ef2cca948fff887bf5e6,0x265d12d57cae301508760a4347fd49e0
1,1,0x4ab59828ffb92e9f4f98b451e5e21bc24ef98aa84e0727dd95a9546f8c3d304,0xf254e78911585001cb46af647d7622c8,0x7415588aae25591d2596e6dca43a7ddf
1,0,0x95cabdc9867300211ab7dbe40ba6558a34373fc43e3a8afff2aa7edf84d53fd,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x86d360f854e36ef6aa79ecb4d254ecc393b7295b3d8b642abb002067aa35c9,0xff3b4bbf1228d0c66480ca570c0e2836,0xc489dc71db537c73d66b87d03bdbadc8
1,1,0x5b3e9eca9a53197f90ddee92b9b14f8f6b910df230d2815a256406d0cdd8cc6,0xff3b4bbf1228d0c66480ca570c0e2836,0xc489dc71db537c73d66b87d03bdbadc8
1,1,0xc0fd1538796df9e10ece1c3f56ed3786b2bd0a88b2213cb34e1e2c60940b8a4,0x9c61c6bd7f2a04447c79a8fc9b0c2542,0x8adf86a6f00a42efe3c59de42cb52954
1,1,0xb659e67c989e3042f5dcde437847ca8fb3c8d61a3ece108ffa6f30f1d85ce91,0xe979e4e4fa4dcdfe83b9a7e45ff551f5,0x84f1e54c209cf5cee0ecec07201fbef5
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x9f6797210b6ad51600bea6b7c84f6a8edf91528ecc39f2a64e76d1f653d92c4,0x66d12a9ed27c6badbdd47d6f9f694f56,0xa4e060f3be117d1aaddd96ee3cb14b2d
1,1,0x8b1bd6f6d708525938bb8a0f7bbe7ef1be37360cb77eb5eac04fa4948bd8878,0x66d12a9ed27c6badbdd47d6f9f694f56,0xa4e060f3be117d1aaddd96ee3cb14b2d
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xeb866994597936bcb901c618e2a33b2dc0124e176405a5d264da72940cc2bb0,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x3a43057017bfbe3358f142dd414030e7c0bfe7565317a69c6883720c28a8f3a,0xd8d36d61114978569cfb0199ee1d7f89,0x79370627678d3ce3d0336b5d09979af2
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xc49ebe8cc964ee24639ff4e52c053e2406265248c2f6e80dc9b094546c21c29,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xdc33289e546f939ce305d269f858d8da8764c5ef76831e2cb256115a65d4223,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x4c5a10ed4d4b1b04e2de461cf74c2b44d8a5f0d3463b1c1d7af87a1ca586f61,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xba751799d1bf7693ed86043ed16cec019bc1b5417f30fb81064347b8627dba9,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x43b9a75a4215934287b0ea6d936e1744d66af5eef2eec8eaa5c66a2b271757f,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xe91925d8b82ef3c5c634087e397067b68b37db97863c1f5f7ac9462fb9a0b7d,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xf855e8e20a4867d003c3ad42629898ad85bc647adc3051ae64da9f3b8f32889,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0xfd076eea08f46488cd6ae79d08e6fefd9d82b2045971a5a52c2b0e5698bb460,0xafe9d65cfc166cfd7bf46af3ff89bbd9,0xa996ba5b978e216f47c131e3da674bfd
1,0,0x1e4527158c19df59e9c4c108043e5524dd230d3919e83cc319285064e39a74,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x651f9296bb93ebc637cd3c26379038cd54f07953f233aebddb79e5503fdb356,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xf1446709c16ae1525f9660abd09488d2b47179c36be377a29a90fa99196c35c,0x1855a6982578165d87740597f9b5b35d,0x6d23598e46804cd51ffdd3d0feb3932b
1,0,0x12a77a3afbf21a1e416da88d9de3d75626cde62980c668699fd6d4f09351306b,0x1855a6982578165d87740597f9b5b35d,0x6d23598e46804cd51ffdd3d0feb3932b
1,1,0x30138b2bae643aaaab03506a166acff657d24dfe95c0a67f9723b2e6ed23767,0x1855a6982578165d87740597f9b5b35d,0x6d23598e46804cd51ffdd3d0feb3932b
1,0,0x8d0bca599168c0b59da7079fca9b61ccc5d21b83c99dc82a0bd8092eedb4445,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0xe252ff12f3524c3745525008b71ae2092eba2f4b4bf6d0b8ab3889403d3cd1a,0xda6e402480a0e50b12c65f6cc8031e1d,0xa2c277adb351c991bcf6439af30e4f12
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x71dafcf5ec63b13644306bb71c4ac57d8e470342e9bcd552c326c5a17ceff37,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x58ebd1e380fe9eda18409805958f386cb28cb422bf89af79e0721cbf4f79d5a,0xcfaa71df93a51358961acd94eade8647,0xccaaf1c0ace15f2125c4e5cda0b0d7b8
1,0,0xf7744edaa8ace0b289f7e9751e18fafc3913d5a4b06eb4a06c28d6eae237499,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xe1d6cfb1b4787f2d032eb859ecc832bc3d0e3c5aff68652dabbc4571f6ee860,0x52c3503b81f0862b427f462e5826de1d,0x4111819ba5d8cb87a26d03d9b824cd11
1,1,0xf5613c070ed5380836be1c4c23564fd5cfe5f8a153b64fd540c7b8a005a85f3,0x52c3503b81f0862b427f462e5826de1d,0x4111819ba5d8cb87a26d03d9b824cd11
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x59dc511f08afcdd19fa81e7cbcdaab89a34ff15e7a8f8361819f091e03f066f,0x608dcc50caf131c863f66fb8803b946e,0x81ecbb30d1d80da792a099ce60d9f23d
1,0,0xb8a7c39e258ac5156860e807482ac85380cc92e30bc5d30493337ed7e882085,0xbe9c605d31cc61d1a80abfba34c23f7d,0xe2222969e82cdebfc3606f0cd8fd3210
1,0,0x4824ba59ac9dd9ef4ec514375da692dadfff09657152d62fc1e163d02ee8e62,0xbe9c605d31cc61d1a80abfba34c23f7d,0xe2222969e82cdebfc3606f0cd8fd3210
1,0,0x12789c7d8d39b691ad989a220caa122bb6ad0cb758c3cfae3ae87f1079173340,0xbe9c605d31cc61d1a80abfba34c23f7d,0xe2222969e82cdebfc3606f0cd8fd3210
1,0,0x24a2a8dcb04e3d9ccd7bb9163cf0a8ea48f52e10e40b7577468f50c1fb1d23b,0xbe9c605d31cc61d1a80abfba34c23f7d,0xe2222969e82cdebfc3606f0cd8fd3210
1,0,0x594d891d759672cf94399400de941b2aca2f8c12893cb4fd9ce023bc24d5884,0xbe9c605d31cc61d1a80abfba34c23f7d,0xe2222969e82cdebfc3606f0cd8fd3210
1,1,0x35d6dd9683da65772f1e94409da6f6d6153fc0149b221ee21c86fd2a62b7907,0xbe9c605d31cc61d1a80abfba34c23f7d,0xe2222969e82cdebfc3606f0cd8fd3210
1,0,0xb265295621dfe78b8cd5baf103d03bd525f44a438041dc910724747045839ce,0xd184c3b234abf9c001aa33dc2da38984,0xe9590400e3371e7cc35ce26d137c8655
1,1,0x86eb194f9fea4a90bfaf01b0f812f9c26e2ce828be66e212fd5cceed0d63dd3,0xd184c3b234abf9c001aa33dc2da38984,0xe9590400e3371e7cc35ce26d137c8655
1,0,0x6b4c61b9fd915922206c893c488f5c773715b8d5f07273afc55d4bf56cd9b56,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x7c1b86150ee642073eb503a5416fc7b7ec037684d4386dc2c01fa823080a3d0,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x30fe890ea08bc033002c91aef5d7cc556a941fbe05be35beda3f2792b76e689,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xae4c7e0fbc1ca6e498e22367231f377539b60418424cd46f59d83b39c56a434,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x12629f3ce50315c2dd153299044e6c74dea3f414bde707d799f4a371786aae3a,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x7dc13a4d0d87827524316d2e28ee9351dc15b86911fa4bf9dbc74ec2d79648a,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x1007f4cd6fddb73047e02851a2fba9a25942480f8945aff4e8f4b0d73c3d8b48,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x8b97314bc36f5c77fa6e8a005116f1c264323ab93c100cfb3a1830c963d4e92,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x1037c9be0c5abfdb9ee38744b7b53864eecc01a04ed41c7b61d69a5f6c20402d,0x2800fbee4994e5e87413b6ac81b9ab33,0x19dd84f1d070a2db6ae6eb2f9eea3ae4
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x61e24f2334904bddfd66fe043b63adb4b2582fbe6acf5ddb84726dfa4b1071f,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x4c236e58bc754d17fb43941b01e5be3b4b52c1af40c8cf29ca9033c989dc9a,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x121ff96f89ed40a36ce111a38ffe904cfcddd7e7337f243541b34ea9aa8f114d,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xdb64780ef5a0c9ed256b6cc259a64e19c842b145a737901953df038123315cd,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xc40360e0769872ad1c2e6fd332de00fd88ee10422f6bf5dd7af31d3189d70e7,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0xd7b1393e1e10f8b6f7ae30e6edf0a29ff16bbf91f4ee62a117b5fc71d3c1762,0x895fd61778a1fb4ecb2eaa07e76b9048,0xfe50740d246929507c4701670384acd2
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xfa51ed33ff85797588f9db0733813388a2c87cf8f354ea7d0537dc39967a94c,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x9add699ee09c7b36455fb469e1f0e84c5df2604f497b47e4fec29fff6c0a908,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x688fa1ce962785323203f46b0bcf99b04ed43c65c4ccedb3887f81ba6acbf0e,0xa25a50884042ccead0659689eb4836d9,0xbf9ff925a22083ed7916037b9da66bee
1,1,0x5ab9709a7210e8db93a6ace274ff2760d073ed6102614de4012901dcdd90563,0xa25a50884042ccead0659689eb4836d9,0xbf9ff925a22083ed7916037b9da66bee
1,0,0x122aa98ee30bd3e306fe937f893f99185b64cfb07c35e08203ad9a51a1aed0ec,0xbe393e3c4c4bb3b10890a940dae5efe3,0x836c13ad4c6e5581ff3b2ef1fe19f685
1,0,0x26dce12d58f59f8464459acfbb4040f5abd91a2b9d329f26524c51697b70058,0xbe393e3c4c4bb3b10890a940dae5efe3,0x836c13ad4c6e5581ff3b2ef1fe19f685
1,1,0x124eb7f29335d8149a9e4e71194ffd5d7379191c42956374def956fce3a71833,0xbe393e3c4c4bb3b10890a940dae5efe3,0x836c13ad4c6e5581ff3b2ef1fe19f685
1,0,0xf56f0485ab4e4ea657419840b5323b32f7d0d988cffbae8427f7afc13b1d024,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0xe1bb796d962bb290a645cde8ce683bfbfcaa56245aa5223dcc4c31894e098a4,0x12d63513c76806cdb4df3bb326575ccd,0x226178f429eec54cd1e4da4b37fd621b
1,1,0xce9b88aa3c262a5295a454260226a95ea0a399b1a1b9b313300214d044d339,0x870492b3dba022a599dd29ca7688cb75,0x25bf2cf3bd683b15631ebbb2babf22cb
1,1,0x28ae6bf753e791cba13ec56a48f13d0b11a0af096247bb06a1d0373ce20873,0xe7ed1ae880b7667448c35beeff2723e7,0x76f9e61f4ed0a432f60aa572e4d69903
1,1,0x7d4fc138a20dec39e390409e7b0cae755d87ca94374170d10849478986ac60f,0x3024311e834a44d1e2fe9d46a5cc830a,0x766b8d0479e1ea7b8bc29da84082aef8
1,0,0x10002fec9e939c164aa8a413624fe966f1eb5f31a68d7a2b0c663519b7662d8d,0x93941c0cab71d164faa91d2e3bb94c38,0xda9848e163c53204dab35252d3b52373
1,0,0x10f2d45d2d7f035f8f5a8ac37af77afb43712598b2d598abf83c07b3f3b30d9,0x93941c0cab71d164faa91d2e3bb94c38,0xda9848e163c53204dab35252d3b52373
1,0,0x1030809553bbc7c634d10ec575a5fde6c85c180e71802f1b9950327ff0f61a9e,0x93941c0cab71d164faa91d2e3bb94c38,0xda9848e163c53204dab35252d3b52373
1,0,0x9deb075d4a655b278c11c69e23c9daa80c7f3c3eef51af9b519d53d01228e0,0x93941c0cab71d164faa91d2e3bb94c38,0xda9848e163c53204dab35252d3b52373
1,0,0x4a9fd78a2ba6f48f1a7629320acd8772b3fbdcb8f48febd34434710513a50fa,0x93941c0cab71d164faa91d2e3bb94c38,0xda9848e163c53204dab35252d3b52373
1,1,0x598b4ac7f2ccbe02940bd695f1156ac10a0f02add432be8119c98f60ec48c3c,0x93941c0cab71d164faa91d2e3bb94c38,0xda9848e163c53204dab35252d3b52373
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x414094feb06c95dfb5e0a54135627948184ea8a340f01910d873f2439f2a5cb,0x10b75bce54bfe41f2a00a9d265f320a1,0x46c1ded4ac951b6b38af3acde8d790f9
1,0,0xfaf6558dced12d5503800ab05da53d90664f8399806d7cba504f45c76871817,0x891c6d0bb61e20dad44e37bc8e85ad8c,0xeff2652d4ebc6743ccd98fbb233eadd2
1,1,0x93709de64583017b641980a46d2800db0bedcc92dca3f606160f653d0fb226c,0x891c6d0bb61e20dad44e37bc8e85ad8c,0xeff2652d4ebc6743ccd98fbb233eadd2
1,0,0x1146d904e61299dc2def3be6874903c8de1bb2f0a5202d6fefab8ae10245fe4d,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xb4bd12340567230d6fd81f56b05559a67c5d3a3685ec316b4b7482fd8a1d57b,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x83b248f95f4e2ff4b5416e516448fdfd6bb332c9037f11c155f402f402fcaf2,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x21e2c254f6f4524b3d5b715033fcd7b80673f257030c774683d702f73499cb7,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xe91be4276dfcef9c93f11bbd80236d2f9a0f1c1ac59059e71c5ba9b2fa6f1d2,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x8f2e54463630382f8d99954382e04e14cc66c91f2ce2d5ecefd1ed4e3b8e71,0x7d2dd654c588edca159208df14d2026,0x4eca3a942d95b81d30c81254ed3ac29e
1,1,0x133afb2a15866f07b49b94ec54890a4a3ed007fbd291c5dbc3b67d3d6f29e9c,0xb5e69ec4b627b34b6937443ae4d900b,0x6ee7ec06d37c2c28de50e3c98402ba08
1,0,0x69502ff78daf1e979011b944d272eb7abf23743dc46786dbf7c455de3a52c28,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x12914cc25732698a08ef4ff1740332aa05812a190765c8ab783e4a1c86e9a7a7,0xaf13f09c633136ebdf27cb5dab11db05,0xc7fe7e16f4e5a51d079a248d3cd2df0e
1 IS_ACTIVE IS_HASH_END NEW_STATE KECCAK_HI KECCAK_LO
2 1 1 0x2832c4ca6424810b7f8962bc82b269b30ba0ef55d7af69bf1b477ab403738c2 0x14aea944ed77b7b1fe8683f5bceacf51 0xd781f7985b442e59127381e5e1c05ade
3 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
4 1 0 0x2d349ff43a8c9e143fb581eb8525fae26eb4698c2227dcf0934b4daa8c011c7 0x79714203be4ed636b9108ae8d2374bf0 0x9550a055dc182cc874974f93de508583
5 1 0 0x9cea234e3013dfff332601b7a571d594e2fe104822879fc503287528b9fc229 0x79714203be4ed636b9108ae8d2374bf0 0x9550a055dc182cc874974f93de508583
6 1 1 0x2e84cb4461e289664e59e3d9689d1ab5a64224aee8929d13df4b726a594cfa1 0x79714203be4ed636b9108ae8d2374bf0 0x9550a055dc182cc874974f93de508583
7 1 1 0x83610901e4d6e423b977de6696ae0f49d777231edb2444e9f5fd85e2b8ea60e 0x62024c1946f6ef2cca948fff887bf5e6 0x265d12d57cae301508760a4347fd49e0
8 1 1 0x4ab59828ffb92e9f4f98b451e5e21bc24ef98aa84e0727dd95a9546f8c3d304 0xf254e78911585001cb46af647d7622c8 0x7415588aae25591d2596e6dca43a7ddf
9 1 0 0x95cabdc9867300211ab7dbe40ba6558a34373fc43e3a8afff2aa7edf84d53fd 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
10 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
11 1 0 0x86d360f854e36ef6aa79ecb4d254ecc393b7295b3d8b642abb002067aa35c9 0xff3b4bbf1228d0c66480ca570c0e2836 0xc489dc71db537c73d66b87d03bdbadc8
12 1 1 0x5b3e9eca9a53197f90ddee92b9b14f8f6b910df230d2815a256406d0cdd8cc6 0xff3b4bbf1228d0c66480ca570c0e2836 0xc489dc71db537c73d66b87d03bdbadc8
13 1 1 0xc0fd1538796df9e10ece1c3f56ed3786b2bd0a88b2213cb34e1e2c60940b8a4 0x9c61c6bd7f2a04447c79a8fc9b0c2542 0x8adf86a6f00a42efe3c59de42cb52954
14 1 1 0xb659e67c989e3042f5dcde437847ca8fb3c8d61a3ece108ffa6f30f1d85ce91 0xe979e4e4fa4dcdfe83b9a7e45ff551f5 0x84f1e54c209cf5cee0ecec07201fbef5
15 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
16 1 0 0x9f6797210b6ad51600bea6b7c84f6a8edf91528ecc39f2a64e76d1f653d92c4 0x66d12a9ed27c6badbdd47d6f9f694f56 0xa4e060f3be117d1aaddd96ee3cb14b2d
17 1 1 0x8b1bd6f6d708525938bb8a0f7bbe7ef1be37360cb77eb5eac04fa4948bd8878 0x66d12a9ed27c6badbdd47d6f9f694f56 0xa4e060f3be117d1aaddd96ee3cb14b2d
18 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
19 1 0 0xeb866994597936bcb901c618e2a33b2dc0124e176405a5d264da72940cc2bb0 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
20 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
21 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
22 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
23 1 1 0x3a43057017bfbe3358f142dd414030e7c0bfe7565317a69c6883720c28a8f3a 0xd8d36d61114978569cfb0199ee1d7f89 0x79370627678d3ce3d0336b5d09979af2
24 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
25 1 0 0xc49ebe8cc964ee24639ff4e52c053e2406265248c2f6e80dc9b094546c21c29 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
26 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
27 1 0 0xdc33289e546f939ce305d269f858d8da8764c5ef76831e2cb256115a65d4223 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
28 1 0 0x4c5a10ed4d4b1b04e2de461cf74c2b44d8a5f0d3463b1c1d7af87a1ca586f61 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
29 1 0 0xba751799d1bf7693ed86043ed16cec019bc1b5417f30fb81064347b8627dba9 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
30 1 0 0x43b9a75a4215934287b0ea6d936e1744d66af5eef2eec8eaa5c66a2b271757f 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
31 1 0 0xe91925d8b82ef3c5c634087e397067b68b37db97863c1f5f7ac9462fb9a0b7d 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
32 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
33 1 0 0xf855e8e20a4867d003c3ad42629898ad85bc647adc3051ae64da9f3b8f32889 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
34 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
35 1 1 0xfd076eea08f46488cd6ae79d08e6fefd9d82b2045971a5a52c2b0e5698bb460 0xafe9d65cfc166cfd7bf46af3ff89bbd9 0xa996ba5b978e216f47c131e3da674bfd
36 1 0 0x1e4527158c19df59e9c4c108043e5524dd230d3919e83cc319285064e39a74 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
37 1 0 0x651f9296bb93ebc637cd3c26379038cd54f07953f233aebddb79e5503fdb356 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
38 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
39 1 0 0xf1446709c16ae1525f9660abd09488d2b47179c36be377a29a90fa99196c35c 0x1855a6982578165d87740597f9b5b35d 0x6d23598e46804cd51ffdd3d0feb3932b
40 1 0 0x12a77a3afbf21a1e416da88d9de3d75626cde62980c668699fd6d4f09351306b 0x1855a6982578165d87740597f9b5b35d 0x6d23598e46804cd51ffdd3d0feb3932b
41 1 1 0x30138b2bae643aaaab03506a166acff657d24dfe95c0a67f9723b2e6ed23767 0x1855a6982578165d87740597f9b5b35d 0x6d23598e46804cd51ffdd3d0feb3932b
42 1 0 0x8d0bca599168c0b59da7079fca9b61ccc5d21b83c99dc82a0bd8092eedb4445 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
43 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
44 1 1 0xe252ff12f3524c3745525008b71ae2092eba2f4b4bf6d0b8ab3889403d3cd1a 0xda6e402480a0e50b12c65f6cc8031e1d 0xa2c277adb351c991bcf6439af30e4f12
45 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
46 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
47 1 0 0x71dafcf5ec63b13644306bb71c4ac57d8e470342e9bcd552c326c5a17ceff37 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
48 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
49 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
50 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
51 1 1 0x58ebd1e380fe9eda18409805958f386cb28cb422bf89af79e0721cbf4f79d5a 0xcfaa71df93a51358961acd94eade8647 0xccaaf1c0ace15f2125c4e5cda0b0d7b8
52 1 0 0xf7744edaa8ace0b289f7e9751e18fafc3913d5a4b06eb4a06c28d6eae237499 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
53 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
54 1 0 0xe1d6cfb1b4787f2d032eb859ecc832bc3d0e3c5aff68652dabbc4571f6ee860 0x52c3503b81f0862b427f462e5826de1d 0x4111819ba5d8cb87a26d03d9b824cd11
55 1 1 0xf5613c070ed5380836be1c4c23564fd5cfe5f8a153b64fd540c7b8a005a85f3 0x52c3503b81f0862b427f462e5826de1d 0x4111819ba5d8cb87a26d03d9b824cd11
56 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
57 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
58 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
59 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
60 1 1 0x59dc511f08afcdd19fa81e7cbcdaab89a34ff15e7a8f8361819f091e03f066f 0x608dcc50caf131c863f66fb8803b946e 0x81ecbb30d1d80da792a099ce60d9f23d
61 1 0 0xb8a7c39e258ac5156860e807482ac85380cc92e30bc5d30493337ed7e882085 0xbe9c605d31cc61d1a80abfba34c23f7d 0xe2222969e82cdebfc3606f0cd8fd3210
62 1 0 0x4824ba59ac9dd9ef4ec514375da692dadfff09657152d62fc1e163d02ee8e62 0xbe9c605d31cc61d1a80abfba34c23f7d 0xe2222969e82cdebfc3606f0cd8fd3210
63 1 0 0x12789c7d8d39b691ad989a220caa122bb6ad0cb758c3cfae3ae87f1079173340 0xbe9c605d31cc61d1a80abfba34c23f7d 0xe2222969e82cdebfc3606f0cd8fd3210
64 1 0 0x24a2a8dcb04e3d9ccd7bb9163cf0a8ea48f52e10e40b7577468f50c1fb1d23b 0xbe9c605d31cc61d1a80abfba34c23f7d 0xe2222969e82cdebfc3606f0cd8fd3210
65 1 0 0x594d891d759672cf94399400de941b2aca2f8c12893cb4fd9ce023bc24d5884 0xbe9c605d31cc61d1a80abfba34c23f7d 0xe2222969e82cdebfc3606f0cd8fd3210
66 1 1 0x35d6dd9683da65772f1e94409da6f6d6153fc0149b221ee21c86fd2a62b7907 0xbe9c605d31cc61d1a80abfba34c23f7d 0xe2222969e82cdebfc3606f0cd8fd3210
67 1 0 0xb265295621dfe78b8cd5baf103d03bd525f44a438041dc910724747045839ce 0xd184c3b234abf9c001aa33dc2da38984 0xe9590400e3371e7cc35ce26d137c8655
68 1 1 0x86eb194f9fea4a90bfaf01b0f812f9c26e2ce828be66e212fd5cceed0d63dd3 0xd184c3b234abf9c001aa33dc2da38984 0xe9590400e3371e7cc35ce26d137c8655
69 1 0 0x6b4c61b9fd915922206c893c488f5c773715b8d5f07273afc55d4bf56cd9b56 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
70 1 0 0x7c1b86150ee642073eb503a5416fc7b7ec037684d4386dc2c01fa823080a3d0 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
71 1 0 0x30fe890ea08bc033002c91aef5d7cc556a941fbe05be35beda3f2792b76e689 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
72 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
73 1 0 0xae4c7e0fbc1ca6e498e22367231f377539b60418424cd46f59d83b39c56a434 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
74 1 0 0x12629f3ce50315c2dd153299044e6c74dea3f414bde707d799f4a371786aae3a 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
75 1 0 0x7dc13a4d0d87827524316d2e28ee9351dc15b86911fa4bf9dbc74ec2d79648a 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
76 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
77 1 0 0x1007f4cd6fddb73047e02851a2fba9a25942480f8945aff4e8f4b0d73c3d8b48 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
78 1 0 0x8b97314bc36f5c77fa6e8a005116f1c264323ab93c100cfb3a1830c963d4e92 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
79 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
80 1 1 0x1037c9be0c5abfdb9ee38744b7b53864eecc01a04ed41c7b61d69a5f6c20402d 0x2800fbee4994e5e87413b6ac81b9ab33 0x19dd84f1d070a2db6ae6eb2f9eea3ae4
81 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
82 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
83 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
84 1 0 0x61e24f2334904bddfd66fe043b63adb4b2582fbe6acf5ddb84726dfa4b1071f 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
85 1 0 0x4c236e58bc754d17fb43941b01e5be3b4b52c1af40c8cf29ca9033c989dc9a 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
86 1 0 0x121ff96f89ed40a36ce111a38ffe904cfcddd7e7337f243541b34ea9aa8f114d 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
87 1 0 0xdb64780ef5a0c9ed256b6cc259a64e19c842b145a737901953df038123315cd 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
88 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
89 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
90 1 0 0xc40360e0769872ad1c2e6fd332de00fd88ee10422f6bf5dd7af31d3189d70e7 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
91 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
92 1 1 0xd7b1393e1e10f8b6f7ae30e6edf0a29ff16bbf91f4ee62a117b5fc71d3c1762 0x895fd61778a1fb4ecb2eaa07e76b9048 0xfe50740d246929507c4701670384acd2
93 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
94 1 0 0xfa51ed33ff85797588f9db0733813388a2c87cf8f354ea7d0537dc39967a94c 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
95 1 0 0x9add699ee09c7b36455fb469e1f0e84c5df2604f497b47e4fec29fff6c0a908 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
96 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
97 1 0 0x688fa1ce962785323203f46b0bcf99b04ed43c65c4ccedb3887f81ba6acbf0e 0xa25a50884042ccead0659689eb4836d9 0xbf9ff925a22083ed7916037b9da66bee
98 1 1 0x5ab9709a7210e8db93a6ace274ff2760d073ed6102614de4012901dcdd90563 0xa25a50884042ccead0659689eb4836d9 0xbf9ff925a22083ed7916037b9da66bee
99 1 0 0x122aa98ee30bd3e306fe937f893f99185b64cfb07c35e08203ad9a51a1aed0ec 0xbe393e3c4c4bb3b10890a940dae5efe3 0x836c13ad4c6e5581ff3b2ef1fe19f685
100 1 0 0x26dce12d58f59f8464459acfbb4040f5abd91a2b9d329f26524c51697b70058 0xbe393e3c4c4bb3b10890a940dae5efe3 0x836c13ad4c6e5581ff3b2ef1fe19f685
101 1 1 0x124eb7f29335d8149a9e4e71194ffd5d7379191c42956374def956fce3a71833 0xbe393e3c4c4bb3b10890a940dae5efe3 0x836c13ad4c6e5581ff3b2ef1fe19f685
102 1 0 0xf56f0485ab4e4ea657419840b5323b32f7d0d988cffbae8427f7afc13b1d024 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
103 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
104 1 1 0xe1bb796d962bb290a645cde8ce683bfbfcaa56245aa5223dcc4c31894e098a4 0x12d63513c76806cdb4df3bb326575ccd 0x226178f429eec54cd1e4da4b37fd621b
105 1 1 0xce9b88aa3c262a5295a454260226a95ea0a399b1a1b9b313300214d044d339 0x870492b3dba022a599dd29ca7688cb75 0x25bf2cf3bd683b15631ebbb2babf22cb
106 1 1 0x28ae6bf753e791cba13ec56a48f13d0b11a0af096247bb06a1d0373ce20873 0xe7ed1ae880b7667448c35beeff2723e7 0x76f9e61f4ed0a432f60aa572e4d69903
107 1 1 0x7d4fc138a20dec39e390409e7b0cae755d87ca94374170d10849478986ac60f 0x3024311e834a44d1e2fe9d46a5cc830a 0x766b8d0479e1ea7b8bc29da84082aef8
108 1 0 0x10002fec9e939c164aa8a413624fe966f1eb5f31a68d7a2b0c663519b7662d8d 0x93941c0cab71d164faa91d2e3bb94c38 0xda9848e163c53204dab35252d3b52373
109 1 0 0x10f2d45d2d7f035f8f5a8ac37af77afb43712598b2d598abf83c07b3f3b30d9 0x93941c0cab71d164faa91d2e3bb94c38 0xda9848e163c53204dab35252d3b52373
110 1 0 0x1030809553bbc7c634d10ec575a5fde6c85c180e71802f1b9950327ff0f61a9e 0x93941c0cab71d164faa91d2e3bb94c38 0xda9848e163c53204dab35252d3b52373
111 1 0 0x9deb075d4a655b278c11c69e23c9daa80c7f3c3eef51af9b519d53d01228e0 0x93941c0cab71d164faa91d2e3bb94c38 0xda9848e163c53204dab35252d3b52373
112 1 0 0x4a9fd78a2ba6f48f1a7629320acd8772b3fbdcb8f48febd34434710513a50fa 0x93941c0cab71d164faa91d2e3bb94c38 0xda9848e163c53204dab35252d3b52373
113 1 1 0x598b4ac7f2ccbe02940bd695f1156ac10a0f02add432be8119c98f60ec48c3c 0x93941c0cab71d164faa91d2e3bb94c38 0xda9848e163c53204dab35252d3b52373
114 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
115 1 1 0x414094feb06c95dfb5e0a54135627948184ea8a340f01910d873f2439f2a5cb 0x10b75bce54bfe41f2a00a9d265f320a1 0x46c1ded4ac951b6b38af3acde8d790f9
116 1 0 0xfaf6558dced12d5503800ab05da53d90664f8399806d7cba504f45c76871817 0x891c6d0bb61e20dad44e37bc8e85ad8c 0xeff2652d4ebc6743ccd98fbb233eadd2
117 1 1 0x93709de64583017b641980a46d2800db0bedcc92dca3f606160f653d0fb226c 0x891c6d0bb61e20dad44e37bc8e85ad8c 0xeff2652d4ebc6743ccd98fbb233eadd2
118 1 0 0x1146d904e61299dc2def3be6874903c8de1bb2f0a5202d6fefab8ae10245fe4d 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
119 1 0 0xb4bd12340567230d6fd81f56b05559a67c5d3a3685ec316b4b7482fd8a1d57b 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
120 1 0 0x83b248f95f4e2ff4b5416e516448fdfd6bb332c9037f11c155f402f402fcaf2 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
121 1 0 0x21e2c254f6f4524b3d5b715033fcd7b80673f257030c774683d702f73499cb7 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
122 1 0 0xe91be4276dfcef9c93f11bbd80236d2f9a0f1c1ac59059e71c5ba9b2fa6f1d2 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
123 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
124 1 1 0x8f2e54463630382f8d99954382e04e14cc66c91f2ce2d5ecefd1ed4e3b8e71 0x7d2dd654c588edca159208df14d2026 0x4eca3a942d95b81d30c81254ed3ac29e
125 1 1 0x133afb2a15866f07b49b94ec54890a4a3ed007fbd291c5dbc3b67d3d6f29e9c 0xb5e69ec4b627b34b6937443ae4d900b 0x6ee7ec06d37c2c28de50e3c98402ba08
126 1 0 0x69502ff78daf1e979011b944d272eb7abf23743dc46786dbf7c455de3a52c28 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
127 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
128 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
129 1 1 0x12914cc25732698a08ef4ff1740332aa05812a190765c8ab783e4a1c86e9a7a7 0xaf13f09c633136ebdf27cb5dab11db05 0xc7fe7e16f4e5a51d079a248d3cd2df0e

View File

@@ -0,0 +1,129 @@
IS_ACTIVE,IS_STORAGE,INITIAL_MIMC,INITIAL_KECCAK_HI,INITIAL_KECCAK_LO,FINAL_MIMC,FINAL_KECCAK_HI,FINAL_KECCAK_LO
1,0,0xf35f15cf8427806f2171633219038109a5f43284b97203f6c20e732726ec472,0xf67d4416da001d26653dd55376e67fee,0xe2ce9b5328ce33d0182d1c75c8fc25a3,0x2db71270903377ab92fc264fb9dc5b99e1fe19ba86ac18e4a46a0c0a5a9c4c3,0x5495f91c99165c6995f8ffe1451683f7,0x372bb525661a23dc742314241b4655eb
1,0,0x11a963f7c703bf098a29118e4d106429943393dd7a484487ba81dd928e314bd1,0x40e87503291ddfc9b2f71747668dc2b8,0xb476de901cb5ad656dbde606e9e7f28f,0x5d6f176a0bbd09237f1bda1639f17e936ba71ab877dd92ed53182dd0e0b74c0,0x3a43fa28fed192571758c03fb025ff34,0xcb2ac05bcdf8762915f005b05b7c84d7
1,1,0x11a963f7c703bf098a29118e4d106429943393dd7a484487ba81dd928e314bd1,0x40e87503291ddfc9b2f71747668dc2b8,0xb476de901cb5ad656dbde606e9e7f28f,0x5d6f176a0bbd09237f1bda1639f17e936ba71ab877dd92ed53182dd0e0b74c0,0x3a43fa28fed192571758c03fb025ff34,0xcb2ac05bcdf8762915f005b05b7c84d7
1,1,0x11a963f7c703bf098a29118e4d106429943393dd7a484487ba81dd928e314bd1,0x40e87503291ddfc9b2f71747668dc2b8,0xb476de901cb5ad656dbde606e9e7f28f,0x5d6f176a0bbd09237f1bda1639f17e936ba71ab877dd92ed53182dd0e0b74c0,0x3a43fa28fed192571758c03fb025ff34,0xcb2ac05bcdf8762915f005b05b7c84d7
1,1,0x11a963f7c703bf098a29118e4d106429943393dd7a484487ba81dd928e314bd1,0x40e87503291ddfc9b2f71747668dc2b8,0xb476de901cb5ad656dbde606e9e7f28f,0x5d6f176a0bbd09237f1bda1639f17e936ba71ab877dd92ed53182dd0e0b74c0,0x3a43fa28fed192571758c03fb025ff34,0xcb2ac05bcdf8762915f005b05b7c84d7
1,0,0x1d9d872e460e7c37df10661add2d6dbcc7a0db609ea345c9fe4fb679918ee6c,0x54df737ac005b708c1f320f8348b57c4,0x4f76a3e23b164eb958d985d00c464fce,0x104ccc9396a119a0bbe6c11033863e8c17819aaa4735190e2dcb4031fe748d8c,0x5e414bac8de6484b16c268906d21bfe6,0x64075d8db57307612ce42d52e4e13c74
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xc9ff2cb2ef8742d36f339e7034bda0c15daeefcb805548d9d9ce25aa2ffd4ef,0x7886f8ca4e034b7332123cee9d1777ea,0x566fa42788136176f7ae63016b12e2d8,0x1196860c768f1938d1da9c555b43352712bb4ddda46a4c840bfed2900341e55d,0x5c8257ad42351127abeb7228d64739bb,0x5b60fc5da377a2e2305d9d59b4cb8bb1
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xa0a821a3015df739289796a6dd9292052601bd4ded9d610329b60761d5153d,0x5eaccff3dd532e06b282e833ef119894,0xf6a3655bcb792dbc7acd191b76a8eb51,0xac2042d01900e17f4a2d1a25146b4442d4aaab042d81688369f14476e6923a8,0x8dd5dd3ac2363989d6e8567a4614ae5e,0x11a2f1dba2c693f34d45bc5ccd772a68
1,0,0xfece0dc962f980f98a40191def18ed12f5dae99402b8aac05e233ab908863e2,0x8e99ef8b7a659d365cd2e719e538ffa7,0xf69a644e48c8cba797b25bb44188f288,0x35ac282e8a94049f433423418ae6351d914d7a75b012ae5b9ec67df4c9406fc,0xf92a4e441a309d3510bfc5d4eb306186,0x1693b964f6e528063804cc04422dc3df
1,1,0xfece0dc962f980f98a40191def18ed12f5dae99402b8aac05e233ab908863e2,0x8e99ef8b7a659d365cd2e719e538ffa7,0xf69a644e48c8cba797b25bb44188f288,0x35ac282e8a94049f433423418ae6351d914d7a75b012ae5b9ec67df4c9406fc,0xf92a4e441a309d3510bfc5d4eb306186,0x1693b964f6e528063804cc04422dc3df
1,0,0x119419c6075b4599366943f66ecfc8c0815d244ff6cf3e9c6116b39f7ec1a953,0x4225a554197ee72cc6bd8e093bb53d16,0xae97f0821c43cf8718bb82c5f674e7a,0xa8765f64bdb87e1ad5f03d3d7f3b01cdc6636df1bc2a69461c7fdc9e2045df,0xfd6875223bcb0ea15b6d0c35a6725347,0x59a83d5e3e0f5ebdec57a05e2ea6e740
1,1,0x119419c6075b4599366943f66ecfc8c0815d244ff6cf3e9c6116b39f7ec1a953,0x4225a554197ee72cc6bd8e093bb53d16,0xae97f0821c43cf8718bb82c5f674e7a,0xa8765f64bdb87e1ad5f03d3d7f3b01cdc6636df1bc2a69461c7fdc9e2045df,0xfd6875223bcb0ea15b6d0c35a6725347,0x59a83d5e3e0f5ebdec57a05e2ea6e740
1,1,0x119419c6075b4599366943f66ecfc8c0815d244ff6cf3e9c6116b39f7ec1a953,0x4225a554197ee72cc6bd8e093bb53d16,0xae97f0821c43cf8718bb82c5f674e7a,0xa8765f64bdb87e1ad5f03d3d7f3b01cdc6636df1bc2a69461c7fdc9e2045df,0xfd6875223bcb0ea15b6d0c35a6725347,0x59a83d5e3e0f5ebdec57a05e2ea6e740
1,1,0x119419c6075b4599366943f66ecfc8c0815d244ff6cf3e9c6116b39f7ec1a953,0x4225a554197ee72cc6bd8e093bb53d16,0xae97f0821c43cf8718bb82c5f674e7a,0xa8765f64bdb87e1ad5f03d3d7f3b01cdc6636df1bc2a69461c7fdc9e2045df,0xfd6875223bcb0ea15b6d0c35a6725347,0x59a83d5e3e0f5ebdec57a05e2ea6e740
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x389b7c5e99d95d5bc81560caeab92f2871ab9357d4b75d8086ee85d25d13c61,0xa7fe20bbd3d3d8bf38bbba8bb767ddbc,0x69fa5906065ce2221ec867b3a8feaa20,0x48753db4c02bc3d7276488a335047033452c4e157bc7947337c1bdef49dbe29,0xde70496580bb8d949ceaa1eb86bb1b9b,0x90d49841377cb7e56ee771f68678299d
1,0,0xd63f76d025aad66c2e4637ffee81facc45d14a98494c0a876039297c0a8fb92,0x7b48e49951fb6ad5611a60f42eff4088,0xf5bb6cf530e7f1c44ea0044a9e12fa59,0x10b6c895212308d986f73f5987c6ac81b1c002afdfe374958fb5a84162baca5d,0xffb53b21b460953150751c841b3644ef,0x613d1ac523717f3b11bc6c3f837ce54b
1,0,0x10296e8da0aec25fee074b440964b2a1094056a0f31ba142e30089882155760e,0x95831128725c2b8e58eb85bb882d67e9,0x74a7d2db75ce50157cc057c2373581d7,0x22f2e52458e2f998998cf74206fe267cd3e79efefefcd17994285cee84e5a50,0x8902fc6c126f2045ce6c52618b5051bf,0xb2668ae6fd2462a8d96f71e51e8d164e
1,0,0x10d8562b94171f2dc124d4f5f9e83bf59ae831889792a12ec64e526a60c0971f,0x68028375c1cc6f4760037a584069cdd6,0x184890773df97552959f05c995c318c5,0x6d30229fd84d07298c7286d5600102d9627652db2667b04835f4d93586203dd,0xb782c18785d08f2d49739dd829ecc8ff,0x5915e72b790cf4cc918d315d4825139b
1,1,0x10d8562b94171f2dc124d4f5f9e83bf59ae831889792a12ec64e526a60c0971f,0x68028375c1cc6f4760037a584069cdd6,0x184890773df97552959f05c995c318c5,0x6d30229fd84d07298c7286d5600102d9627652db2667b04835f4d93586203dd,0xb782c18785d08f2d49739dd829ecc8ff,0x5915e72b790cf4cc918d315d4825139b
1,0,0xae81ebef405850eecf8717d7faea3dbd6a37d35d063d0367064880086a7a300,0x20c80df7e34096a6c0d73232df167e1a,0x32820e71aa1363f92a402f075777a37b,0xcbf0ece3106425fa5b6ee414fcc0b36e25957de00b49112e2d613105c248d55,0x7cbf1978c6635b53ef61e85fc4a88414,0x9231fa09e75f1b16b23225161bd15fe9
1,1,0xae81ebef405850eecf8717d7faea3dbd6a37d35d063d0367064880086a7a300,0x20c80df7e34096a6c0d73232df167e1a,0x32820e71aa1363f92a402f075777a37b,0xcbf0ece3106425fa5b6ee414fcc0b36e25957de00b49112e2d613105c248d55,0x7cbf1978c6635b53ef61e85fc4a88414,0x9231fa09e75f1b16b23225161bd15fe9
1,1,0xae81ebef405850eecf8717d7faea3dbd6a37d35d063d0367064880086a7a300,0x20c80df7e34096a6c0d73232df167e1a,0x32820e71aa1363f92a402f075777a37b,0xcbf0ece3106425fa5b6ee414fcc0b36e25957de00b49112e2d613105c248d55,0x7cbf1978c6635b53ef61e85fc4a88414,0x9231fa09e75f1b16b23225161bd15fe9
1,0,0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb,0x1e9b3ea8bae6461f76bc37f85c6f132e,0x17892407267738f48a0ae6c9e0999b95,0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc,0x99f65bee59ffa8f01819f6f7e7ca86a3,0x56d14a8af29b2e5517ef2158285dc744
1,1,0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb,0x1e9b3ea8bae6461f76bc37f85c6f132e,0x17892407267738f48a0ae6c9e0999b95,0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc,0x99f65bee59ffa8f01819f6f7e7ca86a3,0x56d14a8af29b2e5517ef2158285dc744
1,1,0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb,0x1e9b3ea8bae6461f76bc37f85c6f132e,0x17892407267738f48a0ae6c9e0999b95,0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc,0x99f65bee59ffa8f01819f6f7e7ca86a3,0x56d14a8af29b2e5517ef2158285dc744
1,1,0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb,0x1e9b3ea8bae6461f76bc37f85c6f132e,0x17892407267738f48a0ae6c9e0999b95,0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc,0x99f65bee59ffa8f01819f6f7e7ca86a3,0x56d14a8af29b2e5517ef2158285dc744
1,1,0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb,0x1e9b3ea8bae6461f76bc37f85c6f132e,0x17892407267738f48a0ae6c9e0999b95,0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc,0x99f65bee59ffa8f01819f6f7e7ca86a3,0x56d14a8af29b2e5517ef2158285dc744
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3,0x3868c49f634d7e9e9848d1051ee638ca,0xeaf936be0f8de68b2df4389a6afa26ba,0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f,0xda1ec13c405e5051bbb067d8abec1ed6,0xfa36e89d0255e89fc077770733552310
1,1,0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3,0x3868c49f634d7e9e9848d1051ee638ca,0xeaf936be0f8de68b2df4389a6afa26ba,0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f,0xda1ec13c405e5051bbb067d8abec1ed6,0xfa36e89d0255e89fc077770733552310
1,1,0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3,0x3868c49f634d7e9e9848d1051ee638ca,0xeaf936be0f8de68b2df4389a6afa26ba,0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f,0xda1ec13c405e5051bbb067d8abec1ed6,0xfa36e89d0255e89fc077770733552310
1,1,0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3,0x3868c49f634d7e9e9848d1051ee638ca,0xeaf936be0f8de68b2df4389a6afa26ba,0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f,0xda1ec13c405e5051bbb067d8abec1ed6,0xfa36e89d0255e89fc077770733552310
1,1,0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3,0x3868c49f634d7e9e9848d1051ee638ca,0xeaf936be0f8de68b2df4389a6afa26ba,0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f,0xda1ec13c405e5051bbb067d8abec1ed6,0xfa36e89d0255e89fc077770733552310
1,1,0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3,0x3868c49f634d7e9e9848d1051ee638ca,0xeaf936be0f8de68b2df4389a6afa26ba,0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f,0xda1ec13c405e5051bbb067d8abec1ed6,0xfa36e89d0255e89fc077770733552310
1,0,0x9497ed240a9c6e514c4dbd8e8164567504ace21dc6eb2b9f5f1ae2d5c1b0f22,0x2c20de668dcf93f6fd69f831358e3571,0x70f3d9a00b479d23014c16a17d3766de,0x26a96dc9d5dcab27131cea3781d9da59c033eee779c5ddae1714eb0dd4e5865,0x61e187a78b8461acc9e5af545bcb8852,0x59522414883bb2377e76680454c8acc3
1,1,0x9497ed240a9c6e514c4dbd8e8164567504ace21dc6eb2b9f5f1ae2d5c1b0f22,0x2c20de668dcf93f6fd69f831358e3571,0x70f3d9a00b479d23014c16a17d3766de,0x26a96dc9d5dcab27131cea3781d9da59c033eee779c5ddae1714eb0dd4e5865,0x61e187a78b8461acc9e5af545bcb8852,0x59522414883bb2377e76680454c8acc3
1,0,0x11dda97ffc1f7983ee52f7151c9303949b96de1c3ab8ba4d516122654e224647,0x68c466a3d0174b37b01a580a93d87fb2,0xe7d224676a2dffbbdd7f0e1e45cff7d5,0x40438172179d1952eb1ad99de5fe2c3763d17745b06a25793a9074380998114,0xb9117278fdeabb73206750b1996195ef,0x59dd2585b0b99f49609523ca09ce2f5e
1,0,0xf7fd0ff4d444bccb25eadb72ef91461ed68c8b0532be9040027b66fe9aeffcc,0xc4b793be5461375947575c0e7597b3fb,0xa165463eedd4dfaeeea186bc18ff03fd,0xb274c198dc60bd5a0c51ebc7e31cb8e06268dd2c3bdd7ca102c9224be74a733,0x6f6ee35f78e9136da33fc53515fb6aa,0x5c70b7e2444c5494b2cc6b29acf386ac
1,1,0xf7fd0ff4d444bccb25eadb72ef91461ed68c8b0532be9040027b66fe9aeffcc,0xc4b793be5461375947575c0e7597b3fb,0xa165463eedd4dfaeeea186bc18ff03fd,0xb274c198dc60bd5a0c51ebc7e31cb8e06268dd2c3bdd7ca102c9224be74a733,0x6f6ee35f78e9136da33fc53515fb6aa,0x5c70b7e2444c5494b2cc6b29acf386ac
1,1,0xf7fd0ff4d444bccb25eadb72ef91461ed68c8b0532be9040027b66fe9aeffcc,0xc4b793be5461375947575c0e7597b3fb,0xa165463eedd4dfaeeea186bc18ff03fd,0xb274c198dc60bd5a0c51ebc7e31cb8e06268dd2c3bdd7ca102c9224be74a733,0x6f6ee35f78e9136da33fc53515fb6aa,0x5c70b7e2444c5494b2cc6b29acf386ac
1,1,0xf7fd0ff4d444bccb25eadb72ef91461ed68c8b0532be9040027b66fe9aeffcc,0xc4b793be5461375947575c0e7597b3fb,0xa165463eedd4dfaeeea186bc18ff03fd,0xb274c198dc60bd5a0c51ebc7e31cb8e06268dd2c3bdd7ca102c9224be74a733,0x6f6ee35f78e9136da33fc53515fb6aa,0x5c70b7e2444c5494b2cc6b29acf386ac
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xeb96584feee735187fdfe6dca08405d0d5a5bcfd4e2be9da5dcae918289df88,0x67d154ee86baa855d8e1411e1b3a67e6,0xb736d099be0a74bbca098273ccdb94d0,0xda7a44e1ba86663370ef02b5e2a881e2888a05d4576b90fa6ff90fa50f9f2a4,0x1b4ac2371564eb5947b11bbcfa5365ec,0x2b2270e5bc144097708c79ade1db19b4
1,0,0xf4d62210aacfc47e33ac92588c56b322f90a4799062ebe005f52ef53fc4895b,0xb8eb745804c277dc8191729edd21776b,0x34ff0cf91f5d648aab5bf04b0f188710,0x88251783290549e6a3699c01b7d32219645207463a3b039f70a47082dd670a1,0x6fc458a5fd0fd081b8a92d855b77df3d,0x1d4b7830391d7dbe32365b83723891eb
1,1,0xf4d62210aacfc47e33ac92588c56b322f90a4799062ebe005f52ef53fc4895b,0xb8eb745804c277dc8191729edd21776b,0x34ff0cf91f5d648aab5bf04b0f188710,0x88251783290549e6a3699c01b7d32219645207463a3b039f70a47082dd670a1,0x6fc458a5fd0fd081b8a92d855b77df3d,0x1d4b7830391d7dbe32365b83723891eb
1,0,0x71443b42281d3358b22b9351b1fa56fc127b292f6dbdb913abb347ca497b28e,0x996677f0735322cf140c1981e51b67c7,0xefad2dffd7c676bdfb330b3a7e81f4f8,0xbfd86dee7d8d5a4eadf820d382b714f9b44d7f803b837f366cab8a984c40843,0xab60ad87028de4629952162c92cbe4b0,0xbae39935070b91b395c012c10e89e4ce
1,1,0x71443b42281d3358b22b9351b1fa56fc127b292f6dbdb913abb347ca497b28e,0x996677f0735322cf140c1981e51b67c7,0xefad2dffd7c676bdfb330b3a7e81f4f8,0xbfd86dee7d8d5a4eadf820d382b714f9b44d7f803b837f366cab8a984c40843,0xab60ad87028de4629952162c92cbe4b0,0xbae39935070b91b395c012c10e89e4ce
1,1,0x71443b42281d3358b22b9351b1fa56fc127b292f6dbdb913abb347ca497b28e,0x996677f0735322cf140c1981e51b67c7,0xefad2dffd7c676bdfb330b3a7e81f4f8,0xbfd86dee7d8d5a4eadf820d382b714f9b44d7f803b837f366cab8a984c40843,0xab60ad87028de4629952162c92cbe4b0,0xbae39935070b91b395c012c10e89e4ce
1,0,0xb06d8370b09f3ff606cbb032910e052a6e4c26e10c17d1fb4b9359cd7fbe24f,0x97f5fcd4008138508bf9038464cd9c99,0x408c6dd51203a28c0c6bd70a92b9cdeb,0x399d9f32081d01c83dddff43f46ba0b25e0686d3d81e219f37bdfc88de99c4c,0x176d53e8613d4f918eed1da5daf1ae3c,0xc22b82581a5c4dc3eb803bcfede92b4c
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xe65b3f3cb539f3ca72c26a5596475fbbbe8d6f582711383643a23220127d24d,0xaaf4faa1ae7c5ebf57efe71bcfb60e4f,0x4bdf2d4302bd5ab2ee330e6dfdae2ba0,0x67dee9731332c7fb1d32ef8009f8451b90acff8ca4e0a70950c1f6887cb115e,0x10f15d0c2d8e18c83cf98c35286a904,0x3b0702c068c3dce99a14dbf35878fa56
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x7f7975790e2cb0878d7eb8254173635b9cae59655d237539a1c9974a0581379,0x253528e4920284996a8925cefeeb0e6a,0x458606fd053a274064093569604f8e6e,0x27fe459b2bd85ef08ba7284be6a1b4fa9b4a545e59d261287ac028e35f6e82b,0x893a596ec6b203bf83584d8f2f4f02be,0xad76cab1a21ca92e17dd2ae037626842
1,1,0x7f7975790e2cb0878d7eb8254173635b9cae59655d237539a1c9974a0581379,0x253528e4920284996a8925cefeeb0e6a,0x458606fd053a274064093569604f8e6e,0x27fe459b2bd85ef08ba7284be6a1b4fa9b4a545e59d261287ac028e35f6e82b,0x893a596ec6b203bf83584d8f2f4f02be,0xad76cab1a21ca92e17dd2ae037626842
1,1,0x7f7975790e2cb0878d7eb8254173635b9cae59655d237539a1c9974a0581379,0x253528e4920284996a8925cefeeb0e6a,0x458606fd053a274064093569604f8e6e,0x27fe459b2bd85ef08ba7284be6a1b4fa9b4a545e59d261287ac028e35f6e82b,0x893a596ec6b203bf83584d8f2f4f02be,0xad76cab1a21ca92e17dd2ae037626842
1,0,0xd99a7da9e56fb98b4ea6eed3c97850cb421c0c9677b1ea3b63e0c01c4b483ce,0x34fa32e467be6484e68a4161ac4c5e4a,0x2719eea179e0b75a5d46f518e9351695,0xaf8e105eaad4d16fca08d01c00fd61aaf123407d64915027112b3c60cfd8831,0x93e25146b19d25035c45442b7f816564,0xfdd7f4f78ecf1751db322e4f433ebddb
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x5bea17a563b11a2269eb0f03ad5640c66575c8bae12198b49231d8f31ecd0b2,0x1ff3ae2c5fc2d6ad2ff3dc351037ac48,0xf3554d4be537e7149f0270673d57603e,0x26837f96bf42dfb9a3d712aec8a78efede1c2338dc39b0242de37fea474921b,0x4e9372bf2252d05c0db52ea436e3041c,0x5a713dec54f94b5f7dc61cdb72b1d4e4
1,0,0xa1cc247b921723ca53a59d813f2adb7ca47f8eff00ba49e55550e1f1e544241,0x213aecda3ce19fb0b492f2d261020584,0x1ac635fdda33542e83a1fe01fd6b31d0,0xa3c2340721f49260c1bfe6f137f4b47931e5e10a3783b38d6217452c5e3631b,0x6e9d2bbb52f7afa4b0f564fd8caab588,0x221b66157dade849dedb61e4320e84aa
1,1,0xa1cc247b921723ca53a59d813f2adb7ca47f8eff00ba49e55550e1f1e544241,0x213aecda3ce19fb0b492f2d261020584,0x1ac635fdda33542e83a1fe01fd6b31d0,0xa3c2340721f49260c1bfe6f137f4b47931e5e10a3783b38d6217452c5e3631b,0x6e9d2bbb52f7afa4b0f564fd8caab588,0x221b66157dade849dedb61e4320e84aa
1,0,0x796ae7f0e7768674a2636592ea0bca75714cb4d4c3f7136485959f676f7c5e7,0xec791d783bdfbfba883e15d0ee0dfda4,0x6e075d26559c95292b391dcd90bacae2,0xacd579a3134ccf1d08f14c0e5d4de343266be87db4912debc405af578b7dcee,0xcccb598ed1a6a22627830dabe31ad2d9,0x98c4bf81d0af2bd0bd53664239dc195a
1,0,0x116239c90f29dea8eb2eb35ce5d58473547a3a9ed792e4d6290f835d6bb5784,0x822d955a6ed1f14ba562bd305aa42637,0x9f9958424fbb5350bf6f30b0613b2bfb,0x17b347f7033c75fd492236e39d09e5cc2c69efdae6769eb9f79f33b1bb115fb,0x87cbb16677016c9697796469e2147c37,0xbffa57a3216752a0ee51fa1db31f57c7
1,1,0x116239c90f29dea8eb2eb35ce5d58473547a3a9ed792e4d6290f835d6bb5784,0x822d955a6ed1f14ba562bd305aa42637,0x9f9958424fbb5350bf6f30b0613b2bfb,0x17b347f7033c75fd492236e39d09e5cc2c69efdae6769eb9f79f33b1bb115fb,0x87cbb16677016c9697796469e2147c37,0xbffa57a3216752a0ee51fa1db31f57c7
1,1,0x116239c90f29dea8eb2eb35ce5d58473547a3a9ed792e4d6290f835d6bb5784,0x822d955a6ed1f14ba562bd305aa42637,0x9f9958424fbb5350bf6f30b0613b2bfb,0x17b347f7033c75fd492236e39d09e5cc2c69efdae6769eb9f79f33b1bb115fb,0x87cbb16677016c9697796469e2147c37,0xbffa57a3216752a0ee51fa1db31f57c7
1,1,0x116239c90f29dea8eb2eb35ce5d58473547a3a9ed792e4d6290f835d6bb5784,0x822d955a6ed1f14ba562bd305aa42637,0x9f9958424fbb5350bf6f30b0613b2bfb,0x17b347f7033c75fd492236e39d09e5cc2c69efdae6769eb9f79f33b1bb115fb,0x87cbb16677016c9697796469e2147c37,0xbffa57a3216752a0ee51fa1db31f57c7
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704,0x367de3aa93d6405aa1979452414d0cdc,0x6bf078a86cb81f1183a28736513743d,0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27,0xbfe496d60e90db539af391782c0670fe,0xa4f0d1cab3eec2f400490037c5ba0169
1,1,0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704,0x367de3aa93d6405aa1979452414d0cdc,0x6bf078a86cb81f1183a28736513743d,0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27,0xbfe496d60e90db539af391782c0670fe,0xa4f0d1cab3eec2f400490037c5ba0169
1,1,0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704,0x367de3aa93d6405aa1979452414d0cdc,0x6bf078a86cb81f1183a28736513743d,0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27,0xbfe496d60e90db539af391782c0670fe,0xa4f0d1cab3eec2f400490037c5ba0169
1,1,0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704,0x367de3aa93d6405aa1979452414d0cdc,0x6bf078a86cb81f1183a28736513743d,0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27,0xbfe496d60e90db539af391782c0670fe,0xa4f0d1cab3eec2f400490037c5ba0169
1,1,0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704,0x367de3aa93d6405aa1979452414d0cdc,0x6bf078a86cb81f1183a28736513743d,0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27,0xbfe496d60e90db539af391782c0670fe,0xa4f0d1cab3eec2f400490037c5ba0169
1,0,0x420d1987d554b6040ffba354fd3a6576573e7f3810ba3b3b2f736e2c00e9dda,0x45f250aaf0d881ad86fd62235b890968,0x161cfd2a0b591cdec5d674da238d44ec,0x81014394cb2b477fdf0397ba51717657ed1a993e7e63adec55566a48b8514e3,0xa42d146920d3d2b1c04e35e6d5e9ac35,0x538bcdb7739f910e8a0f6fe3debc5b63
1,0,0xf145fbeb995facc396b62d73b9e1c297c83d119979e46ae16c4c0ba90e9e7f0,0xc18d0cb6b60e7b046159269197812020,0x58219a1662aaf165a8ab4347b2ebb7cb,0x793fd3a2d8d31c45f9a7a6061e30e86f155b66c957857d3d9730a89838e0005,0x1218bf4befbdf3e2ed280eee79c6244b,0xb87e7320bd4f43381dd6fab8225ee35b
1,0,0xd6a6e52cbcaa5cae42454038466557a5cd4abb2f1f506c38058f99534656c2b,0x693ffec3234e977ec90a1621671fc139,0xab030541519cc12965b9a5cbf2c77a1e,0xddd15c05722d7a7dc6bdfd70148fb4e3c7def7827ee62ae03ef58254ff2606d,0x1890b5f936f617ac7113888c43869db5,0x7d23a9e21d81075a387f257cef69fe5c
1,1,0xd6a6e52cbcaa5cae42454038466557a5cd4abb2f1f506c38058f99534656c2b,0x693ffec3234e977ec90a1621671fc139,0xab030541519cc12965b9a5cbf2c77a1e,0xddd15c05722d7a7dc6bdfd70148fb4e3c7def7827ee62ae03ef58254ff2606d,0x1890b5f936f617ac7113888c43869db5,0x7d23a9e21d81075a387f257cef69fe5c
1,1,0xd6a6e52cbcaa5cae42454038466557a5cd4abb2f1f506c38058f99534656c2b,0x693ffec3234e977ec90a1621671fc139,0xab030541519cc12965b9a5cbf2c77a1e,0xddd15c05722d7a7dc6bdfd70148fb4e3c7def7827ee62ae03ef58254ff2606d,0x1890b5f936f617ac7113888c43869db5,0x7d23a9e21d81075a387f257cef69fe5c
1,0,0x8f086a265ddaf5da1a35f983e62bbec4ec4dfdf413039443259f52fb23ea4eb,0xfd91aec846780f1852cd426d65d44855,0xe718a2a754d056208c69b68459c3b26f,0xc946b7b62e3bca7c3f058a6f859e049360260f986fc355cd1cbea6ac1fd8fb,0x99ab3b350754f7e6ce970feda3d868d1,0x25eaa8907d9362650dafa0ccf15a92ee
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x4e2c8d4fabfff1e591ab2acdd75674750c586ecc05f542cfb86233dc2ed5eaa,0x9e41a5832437ba0671ae6d781779d3d7,0x29f117b1828ab9c05f55d192b367e7be,0x69a4895fc7362c6c7798ad803b824c400b247fae0fbcfeda2b416fdec3c716f,0x969a1b2e513f1ddbb09b13ebb6b89bc6,0xbccff59d5aedff5844b8dcc41e9c0f1f
1,1,0x4e2c8d4fabfff1e591ab2acdd75674750c586ecc05f542cfb86233dc2ed5eaa,0x9e41a5832437ba0671ae6d781779d3d7,0x29f117b1828ab9c05f55d192b367e7be,0x69a4895fc7362c6c7798ad803b824c400b247fae0fbcfeda2b416fdec3c716f,0x969a1b2e513f1ddbb09b13ebb6b89bc6,0xbccff59d5aedff5844b8dcc41e9c0f1f
1,0,0x2862cfaf050a1d322c3f7d18d456beb01be8ba64ad1264470c30c17e7e1790e,0x261e5ce06c9c233678bd07d3e525811d,0x85b04ea749f468f87cc2a5b094573cd4,0x121121cf43252bc791c61474300d6f0b2e20c3b0a3f83abef1d3f2b624501aa3,0x4fec8a94b5955ef50c4bc2938adc5b43,0x51f54908c4ec3ff9edbe10f6eb2258a2
1,0,0x5a5d5dec422a16c0c12c66b484e8fc60548e70be104d8ef619d41897ca2eebe,0xd0def8949c5f9ec76796b37b49fb50a1,0x367c115fbc0d7ccb87ef7ed68916a6c4,0x3fb628afd3f9b4f19d5d7796090d2ad6f54b1847f500f05c84e1ee7132738df,0xf2ced2092bce766fcbeeb41786388267,0x9ecfa5aa99914e46fde587c3e3297d92
1,0,0x3070970d5198b56e2eecc42efee353fdf0e43695bf647d9f09ea2d1764409c8,0x812fe3c9b5d115fa99cd91af1e9d5845,0x9b3848d64d3c8886632807df3bef85ac,0x3427471c4b44e9a3b05d740e993b2fb2be6eae715b36d6f84424769c4d79566,0x2c3ba52aa2c409fcb2195d8cbf7f3a91,0x44d41978512d9944495774ad0de481c
1,1,0x3070970d5198b56e2eecc42efee353fdf0e43695bf647d9f09ea2d1764409c8,0x812fe3c9b5d115fa99cd91af1e9d5845,0x9b3848d64d3c8886632807df3bef85ac,0x3427471c4b44e9a3b05d740e993b2fb2be6eae715b36d6f84424769c4d79566,0x2c3ba52aa2c409fcb2195d8cbf7f3a91,0x44d41978512d9944495774ad0de481c
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xe81a73fb7fc1d5f975a0de58e37a3b32e77aa8e1ebf824828010167b7d2e596,0x7c2d2cada376264dc0d4c2817d81c4cc,0xe4cb9b7db79b0d56d57cd4d431ac0dc4,0x371a1c7d8773ffc74132a9b5b4a29cc42426066f085347901ba75d2baf8e4a8,0x41e7bc4990bbfa88b2a2d2f5947c7b02,0x3cb483e4076d7dc2913f20ef5483ea80
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0xa9792e72211e53e07acc386714411841e3e18857851749e1db4a8534521ab3b,0xea43ba6d00ff5ff081c2a2f50871046a,0xa659b39355270b717571c1c037aa746b,0x5b8ed2eb2864e98cce0e9a02cabfd8602747c9a693f90dcd12dca32080729f9,0xa2a469704b2f6ea77e4261cca30328ce,0x51bc6a4e45ea73ead9a9707672edef88
1,1,0xa9792e72211e53e07acc386714411841e3e18857851749e1db4a8534521ab3b,0xea43ba6d00ff5ff081c2a2f50871046a,0xa659b39355270b717571c1c037aa746b,0x5b8ed2eb2864e98cce0e9a02cabfd8602747c9a693f90dcd12dca32080729f9,0xa2a469704b2f6ea77e4261cca30328ce,0x51bc6a4e45ea73ead9a9707672edef88
1,0,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,1,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee,0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218,0x7b58305eb2aa3ff8e9b49192b4822685,0x84e6417582b82df64c84659a39513fee
1,0,0x71ba533388576c9a957c746457e4feb21de3260fa61c5230fb40c59f2534493,0x30a7c00888e0041fedddd38732d3af98,0xa287c298774bc224c4ec8aac432d3474,0x6e437929ba3096222cc08f6a10bfca20537ba78298548dc76126ee83960be74,0xdb637f3876071b109b6a9e4fbb961259,0xf841c2c1c3fa07ae3984fac6a8ad4ddb
1,1,0x71ba533388576c9a957c746457e4feb21de3260fa61c5230fb40c59f2534493,0x30a7c00888e0041fedddd38732d3af98,0xa287c298774bc224c4ec8aac432d3474,0x6e437929ba3096222cc08f6a10bfca20537ba78298548dc76126ee83960be74,0xdb637f3876071b109b6a9e4fbb961259,0xf841c2c1c3fa07ae3984fac6a8ad4ddb
1,1,0x71ba533388576c9a957c746457e4feb21de3260fa61c5230fb40c59f2534493,0x30a7c00888e0041fedddd38732d3af98,0xa287c298774bc224c4ec8aac432d3474,0x6e437929ba3096222cc08f6a10bfca20537ba78298548dc76126ee83960be74,0xdb637f3876071b109b6a9e4fbb961259,0xf841c2c1c3fa07ae3984fac6a8ad4ddb
1,1,0x71ba533388576c9a957c746457e4feb21de3260fa61c5230fb40c59f2534493,0x30a7c00888e0041fedddd38732d3af98,0xa287c298774bc224c4ec8aac432d3474,0x6e437929ba3096222cc08f6a10bfca20537ba78298548dc76126ee83960be74,0xdb637f3876071b109b6a9e4fbb961259,0xf841c2c1c3fa07ae3984fac6a8ad4ddb
1,0,0x9348320796205bdacdf734d12dd7d0add3ac27e87caddf99f1765bb89886a5a,0x3de923a685d5e3f2d634b891db64403d,0xe8460a5be4c18d2f5fc5ca8c6e0ef209,0x249cb31042b5b8b0f19a18a04239ae5691442c48b329e488680be2897b4f839,0x66f127bb16fe5c6d85fe3fe55c1adadb,0x87b6a3c85d0b22d5ffaad98f65515163
1 IS_ACTIVE IS_STORAGE INITIAL_MIMC INITIAL_KECCAK_HI INITIAL_KECCAK_LO FINAL_MIMC FINAL_KECCAK_HI FINAL_KECCAK_LO
2 1 0 0xf35f15cf8427806f2171633219038109a5f43284b97203f6c20e732726ec472 0xf67d4416da001d26653dd55376e67fee 0xe2ce9b5328ce33d0182d1c75c8fc25a3 0x2db71270903377ab92fc264fb9dc5b99e1fe19ba86ac18e4a46a0c0a5a9c4c3 0x5495f91c99165c6995f8ffe1451683f7 0x372bb525661a23dc742314241b4655eb
3 1 0 0x11a963f7c703bf098a29118e4d106429943393dd7a484487ba81dd928e314bd1 0x40e87503291ddfc9b2f71747668dc2b8 0xb476de901cb5ad656dbde606e9e7f28f 0x5d6f176a0bbd09237f1bda1639f17e936ba71ab877dd92ed53182dd0e0b74c0 0x3a43fa28fed192571758c03fb025ff34 0xcb2ac05bcdf8762915f005b05b7c84d7
4 1 1 0x11a963f7c703bf098a29118e4d106429943393dd7a484487ba81dd928e314bd1 0x40e87503291ddfc9b2f71747668dc2b8 0xb476de901cb5ad656dbde606e9e7f28f 0x5d6f176a0bbd09237f1bda1639f17e936ba71ab877dd92ed53182dd0e0b74c0 0x3a43fa28fed192571758c03fb025ff34 0xcb2ac05bcdf8762915f005b05b7c84d7
5 1 1 0x11a963f7c703bf098a29118e4d106429943393dd7a484487ba81dd928e314bd1 0x40e87503291ddfc9b2f71747668dc2b8 0xb476de901cb5ad656dbde606e9e7f28f 0x5d6f176a0bbd09237f1bda1639f17e936ba71ab877dd92ed53182dd0e0b74c0 0x3a43fa28fed192571758c03fb025ff34 0xcb2ac05bcdf8762915f005b05b7c84d7
6 1 1 0x11a963f7c703bf098a29118e4d106429943393dd7a484487ba81dd928e314bd1 0x40e87503291ddfc9b2f71747668dc2b8 0xb476de901cb5ad656dbde606e9e7f28f 0x5d6f176a0bbd09237f1bda1639f17e936ba71ab877dd92ed53182dd0e0b74c0 0x3a43fa28fed192571758c03fb025ff34 0xcb2ac05bcdf8762915f005b05b7c84d7
7 1 0 0x1d9d872e460e7c37df10661add2d6dbcc7a0db609ea345c9fe4fb679918ee6c 0x54df737ac005b708c1f320f8348b57c4 0x4f76a3e23b164eb958d985d00c464fce 0x104ccc9396a119a0bbe6c11033863e8c17819aaa4735190e2dcb4031fe748d8c 0x5e414bac8de6484b16c268906d21bfe6 0x64075d8db57307612ce42d52e4e13c74
8 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
9 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
10 1 0 0xc9ff2cb2ef8742d36f339e7034bda0c15daeefcb805548d9d9ce25aa2ffd4ef 0x7886f8ca4e034b7332123cee9d1777ea 0x566fa42788136176f7ae63016b12e2d8 0x1196860c768f1938d1da9c555b43352712bb4ddda46a4c840bfed2900341e55d 0x5c8257ad42351127abeb7228d64739bb 0x5b60fc5da377a2e2305d9d59b4cb8bb1
11 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
12 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
13 1 0 0xa0a821a3015df739289796a6dd9292052601bd4ded9d610329b60761d5153d 0x5eaccff3dd532e06b282e833ef119894 0xf6a3655bcb792dbc7acd191b76a8eb51 0xac2042d01900e17f4a2d1a25146b4442d4aaab042d81688369f14476e6923a8 0x8dd5dd3ac2363989d6e8567a4614ae5e 0x11a2f1dba2c693f34d45bc5ccd772a68
14 1 0 0xfece0dc962f980f98a40191def18ed12f5dae99402b8aac05e233ab908863e2 0x8e99ef8b7a659d365cd2e719e538ffa7 0xf69a644e48c8cba797b25bb44188f288 0x35ac282e8a94049f433423418ae6351d914d7a75b012ae5b9ec67df4c9406fc 0xf92a4e441a309d3510bfc5d4eb306186 0x1693b964f6e528063804cc04422dc3df
15 1 1 0xfece0dc962f980f98a40191def18ed12f5dae99402b8aac05e233ab908863e2 0x8e99ef8b7a659d365cd2e719e538ffa7 0xf69a644e48c8cba797b25bb44188f288 0x35ac282e8a94049f433423418ae6351d914d7a75b012ae5b9ec67df4c9406fc 0xf92a4e441a309d3510bfc5d4eb306186 0x1693b964f6e528063804cc04422dc3df
16 1 0 0x119419c6075b4599366943f66ecfc8c0815d244ff6cf3e9c6116b39f7ec1a953 0x4225a554197ee72cc6bd8e093bb53d16 0xae97f0821c43cf8718bb82c5f674e7a 0xa8765f64bdb87e1ad5f03d3d7f3b01cdc6636df1bc2a69461c7fdc9e2045df 0xfd6875223bcb0ea15b6d0c35a6725347 0x59a83d5e3e0f5ebdec57a05e2ea6e740
17 1 1 0x119419c6075b4599366943f66ecfc8c0815d244ff6cf3e9c6116b39f7ec1a953 0x4225a554197ee72cc6bd8e093bb53d16 0xae97f0821c43cf8718bb82c5f674e7a 0xa8765f64bdb87e1ad5f03d3d7f3b01cdc6636df1bc2a69461c7fdc9e2045df 0xfd6875223bcb0ea15b6d0c35a6725347 0x59a83d5e3e0f5ebdec57a05e2ea6e740
18 1 1 0x119419c6075b4599366943f66ecfc8c0815d244ff6cf3e9c6116b39f7ec1a953 0x4225a554197ee72cc6bd8e093bb53d16 0xae97f0821c43cf8718bb82c5f674e7a 0xa8765f64bdb87e1ad5f03d3d7f3b01cdc6636df1bc2a69461c7fdc9e2045df 0xfd6875223bcb0ea15b6d0c35a6725347 0x59a83d5e3e0f5ebdec57a05e2ea6e740
19 1 1 0x119419c6075b4599366943f66ecfc8c0815d244ff6cf3e9c6116b39f7ec1a953 0x4225a554197ee72cc6bd8e093bb53d16 0xae97f0821c43cf8718bb82c5f674e7a 0xa8765f64bdb87e1ad5f03d3d7f3b01cdc6636df1bc2a69461c7fdc9e2045df 0xfd6875223bcb0ea15b6d0c35a6725347 0x59a83d5e3e0f5ebdec57a05e2ea6e740
20 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
21 1 0 0x389b7c5e99d95d5bc81560caeab92f2871ab9357d4b75d8086ee85d25d13c61 0xa7fe20bbd3d3d8bf38bbba8bb767ddbc 0x69fa5906065ce2221ec867b3a8feaa20 0x48753db4c02bc3d7276488a335047033452c4e157bc7947337c1bdef49dbe29 0xde70496580bb8d949ceaa1eb86bb1b9b 0x90d49841377cb7e56ee771f68678299d
22 1 0 0xd63f76d025aad66c2e4637ffee81facc45d14a98494c0a876039297c0a8fb92 0x7b48e49951fb6ad5611a60f42eff4088 0xf5bb6cf530e7f1c44ea0044a9e12fa59 0x10b6c895212308d986f73f5987c6ac81b1c002afdfe374958fb5a84162baca5d 0xffb53b21b460953150751c841b3644ef 0x613d1ac523717f3b11bc6c3f837ce54b
23 1 0 0x10296e8da0aec25fee074b440964b2a1094056a0f31ba142e30089882155760e 0x95831128725c2b8e58eb85bb882d67e9 0x74a7d2db75ce50157cc057c2373581d7 0x22f2e52458e2f998998cf74206fe267cd3e79efefefcd17994285cee84e5a50 0x8902fc6c126f2045ce6c52618b5051bf 0xb2668ae6fd2462a8d96f71e51e8d164e
24 1 0 0x10d8562b94171f2dc124d4f5f9e83bf59ae831889792a12ec64e526a60c0971f 0x68028375c1cc6f4760037a584069cdd6 0x184890773df97552959f05c995c318c5 0x6d30229fd84d07298c7286d5600102d9627652db2667b04835f4d93586203dd 0xb782c18785d08f2d49739dd829ecc8ff 0x5915e72b790cf4cc918d315d4825139b
25 1 1 0x10d8562b94171f2dc124d4f5f9e83bf59ae831889792a12ec64e526a60c0971f 0x68028375c1cc6f4760037a584069cdd6 0x184890773df97552959f05c995c318c5 0x6d30229fd84d07298c7286d5600102d9627652db2667b04835f4d93586203dd 0xb782c18785d08f2d49739dd829ecc8ff 0x5915e72b790cf4cc918d315d4825139b
26 1 0 0xae81ebef405850eecf8717d7faea3dbd6a37d35d063d0367064880086a7a300 0x20c80df7e34096a6c0d73232df167e1a 0x32820e71aa1363f92a402f075777a37b 0xcbf0ece3106425fa5b6ee414fcc0b36e25957de00b49112e2d613105c248d55 0x7cbf1978c6635b53ef61e85fc4a88414 0x9231fa09e75f1b16b23225161bd15fe9
27 1 1 0xae81ebef405850eecf8717d7faea3dbd6a37d35d063d0367064880086a7a300 0x20c80df7e34096a6c0d73232df167e1a 0x32820e71aa1363f92a402f075777a37b 0xcbf0ece3106425fa5b6ee414fcc0b36e25957de00b49112e2d613105c248d55 0x7cbf1978c6635b53ef61e85fc4a88414 0x9231fa09e75f1b16b23225161bd15fe9
28 1 1 0xae81ebef405850eecf8717d7faea3dbd6a37d35d063d0367064880086a7a300 0x20c80df7e34096a6c0d73232df167e1a 0x32820e71aa1363f92a402f075777a37b 0xcbf0ece3106425fa5b6ee414fcc0b36e25957de00b49112e2d613105c248d55 0x7cbf1978c6635b53ef61e85fc4a88414 0x9231fa09e75f1b16b23225161bd15fe9
29 1 0 0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb 0x1e9b3ea8bae6461f76bc37f85c6f132e 0x17892407267738f48a0ae6c9e0999b95 0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc 0x99f65bee59ffa8f01819f6f7e7ca86a3 0x56d14a8af29b2e5517ef2158285dc744
30 1 1 0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb 0x1e9b3ea8bae6461f76bc37f85c6f132e 0x17892407267738f48a0ae6c9e0999b95 0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc 0x99f65bee59ffa8f01819f6f7e7ca86a3 0x56d14a8af29b2e5517ef2158285dc744
31 1 1 0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb 0x1e9b3ea8bae6461f76bc37f85c6f132e 0x17892407267738f48a0ae6c9e0999b95 0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc 0x99f65bee59ffa8f01819f6f7e7ca86a3 0x56d14a8af29b2e5517ef2158285dc744
32 1 1 0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb 0x1e9b3ea8bae6461f76bc37f85c6f132e 0x17892407267738f48a0ae6c9e0999b95 0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc 0x99f65bee59ffa8f01819f6f7e7ca86a3 0x56d14a8af29b2e5517ef2158285dc744
33 1 1 0xf3379db7f2f8d74284712d99bf6b643a1e66f6d7e524384981550cf41ea2bbb 0x1e9b3ea8bae6461f76bc37f85c6f132e 0x17892407267738f48a0ae6c9e0999b95 0xc100a2fdcc4ec6657590effb1548813ff5e05d554623e9f1852e275d3f3bfc 0x99f65bee59ffa8f01819f6f7e7ca86a3 0x56d14a8af29b2e5517ef2158285dc744
34 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
35 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
36 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
37 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
38 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
39 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
40 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
41 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
42 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
43 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
44 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
45 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
46 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
47 1 0 0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3 0x3868c49f634d7e9e9848d1051ee638ca 0xeaf936be0f8de68b2df4389a6afa26ba 0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f 0xda1ec13c405e5051bbb067d8abec1ed6 0xfa36e89d0255e89fc077770733552310
48 1 1 0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3 0x3868c49f634d7e9e9848d1051ee638ca 0xeaf936be0f8de68b2df4389a6afa26ba 0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f 0xda1ec13c405e5051bbb067d8abec1ed6 0xfa36e89d0255e89fc077770733552310
49 1 1 0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3 0x3868c49f634d7e9e9848d1051ee638ca 0xeaf936be0f8de68b2df4389a6afa26ba 0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f 0xda1ec13c405e5051bbb067d8abec1ed6 0xfa36e89d0255e89fc077770733552310
50 1 1 0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3 0x3868c49f634d7e9e9848d1051ee638ca 0xeaf936be0f8de68b2df4389a6afa26ba 0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f 0xda1ec13c405e5051bbb067d8abec1ed6 0xfa36e89d0255e89fc077770733552310
51 1 1 0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3 0x3868c49f634d7e9e9848d1051ee638ca 0xeaf936be0f8de68b2df4389a6afa26ba 0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f 0xda1ec13c405e5051bbb067d8abec1ed6 0xfa36e89d0255e89fc077770733552310
52 1 1 0xeba5a7f494bb2b134d0909f243adac86042f21fe7f5137180a52a331ccd14e3 0x3868c49f634d7e9e9848d1051ee638ca 0xeaf936be0f8de68b2df4389a6afa26ba 0x1f5ea3f47bf1bbc6ccd74fd280c92dc7148a823c104358e5a45e421baf4636f 0xda1ec13c405e5051bbb067d8abec1ed6 0xfa36e89d0255e89fc077770733552310
53 1 0 0x9497ed240a9c6e514c4dbd8e8164567504ace21dc6eb2b9f5f1ae2d5c1b0f22 0x2c20de668dcf93f6fd69f831358e3571 0x70f3d9a00b479d23014c16a17d3766de 0x26a96dc9d5dcab27131cea3781d9da59c033eee779c5ddae1714eb0dd4e5865 0x61e187a78b8461acc9e5af545bcb8852 0x59522414883bb2377e76680454c8acc3
54 1 1 0x9497ed240a9c6e514c4dbd8e8164567504ace21dc6eb2b9f5f1ae2d5c1b0f22 0x2c20de668dcf93f6fd69f831358e3571 0x70f3d9a00b479d23014c16a17d3766de 0x26a96dc9d5dcab27131cea3781d9da59c033eee779c5ddae1714eb0dd4e5865 0x61e187a78b8461acc9e5af545bcb8852 0x59522414883bb2377e76680454c8acc3
55 1 0 0x11dda97ffc1f7983ee52f7151c9303949b96de1c3ab8ba4d516122654e224647 0x68c466a3d0174b37b01a580a93d87fb2 0xe7d224676a2dffbbdd7f0e1e45cff7d5 0x40438172179d1952eb1ad99de5fe2c3763d17745b06a25793a9074380998114 0xb9117278fdeabb73206750b1996195ef 0x59dd2585b0b99f49609523ca09ce2f5e
56 1 0 0xf7fd0ff4d444bccb25eadb72ef91461ed68c8b0532be9040027b66fe9aeffcc 0xc4b793be5461375947575c0e7597b3fb 0xa165463eedd4dfaeeea186bc18ff03fd 0xb274c198dc60bd5a0c51ebc7e31cb8e06268dd2c3bdd7ca102c9224be74a733 0x6f6ee35f78e9136da33fc53515fb6aa 0x5c70b7e2444c5494b2cc6b29acf386ac
57 1 1 0xf7fd0ff4d444bccb25eadb72ef91461ed68c8b0532be9040027b66fe9aeffcc 0xc4b793be5461375947575c0e7597b3fb 0xa165463eedd4dfaeeea186bc18ff03fd 0xb274c198dc60bd5a0c51ebc7e31cb8e06268dd2c3bdd7ca102c9224be74a733 0x6f6ee35f78e9136da33fc53515fb6aa 0x5c70b7e2444c5494b2cc6b29acf386ac
58 1 1 0xf7fd0ff4d444bccb25eadb72ef91461ed68c8b0532be9040027b66fe9aeffcc 0xc4b793be5461375947575c0e7597b3fb 0xa165463eedd4dfaeeea186bc18ff03fd 0xb274c198dc60bd5a0c51ebc7e31cb8e06268dd2c3bdd7ca102c9224be74a733 0x6f6ee35f78e9136da33fc53515fb6aa 0x5c70b7e2444c5494b2cc6b29acf386ac
59 1 1 0xf7fd0ff4d444bccb25eadb72ef91461ed68c8b0532be9040027b66fe9aeffcc 0xc4b793be5461375947575c0e7597b3fb 0xa165463eedd4dfaeeea186bc18ff03fd 0xb274c198dc60bd5a0c51ebc7e31cb8e06268dd2c3bdd7ca102c9224be74a733 0x6f6ee35f78e9136da33fc53515fb6aa 0x5c70b7e2444c5494b2cc6b29acf386ac
60 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
61 1 0 0xeb96584feee735187fdfe6dca08405d0d5a5bcfd4e2be9da5dcae918289df88 0x67d154ee86baa855d8e1411e1b3a67e6 0xb736d099be0a74bbca098273ccdb94d0 0xda7a44e1ba86663370ef02b5e2a881e2888a05d4576b90fa6ff90fa50f9f2a4 0x1b4ac2371564eb5947b11bbcfa5365ec 0x2b2270e5bc144097708c79ade1db19b4
62 1 0 0xf4d62210aacfc47e33ac92588c56b322f90a4799062ebe005f52ef53fc4895b 0xb8eb745804c277dc8191729edd21776b 0x34ff0cf91f5d648aab5bf04b0f188710 0x88251783290549e6a3699c01b7d32219645207463a3b039f70a47082dd670a1 0x6fc458a5fd0fd081b8a92d855b77df3d 0x1d4b7830391d7dbe32365b83723891eb
63 1 1 0xf4d62210aacfc47e33ac92588c56b322f90a4799062ebe005f52ef53fc4895b 0xb8eb745804c277dc8191729edd21776b 0x34ff0cf91f5d648aab5bf04b0f188710 0x88251783290549e6a3699c01b7d32219645207463a3b039f70a47082dd670a1 0x6fc458a5fd0fd081b8a92d855b77df3d 0x1d4b7830391d7dbe32365b83723891eb
64 1 0 0x71443b42281d3358b22b9351b1fa56fc127b292f6dbdb913abb347ca497b28e 0x996677f0735322cf140c1981e51b67c7 0xefad2dffd7c676bdfb330b3a7e81f4f8 0xbfd86dee7d8d5a4eadf820d382b714f9b44d7f803b837f366cab8a984c40843 0xab60ad87028de4629952162c92cbe4b0 0xbae39935070b91b395c012c10e89e4ce
65 1 1 0x71443b42281d3358b22b9351b1fa56fc127b292f6dbdb913abb347ca497b28e 0x996677f0735322cf140c1981e51b67c7 0xefad2dffd7c676bdfb330b3a7e81f4f8 0xbfd86dee7d8d5a4eadf820d382b714f9b44d7f803b837f366cab8a984c40843 0xab60ad87028de4629952162c92cbe4b0 0xbae39935070b91b395c012c10e89e4ce
66 1 1 0x71443b42281d3358b22b9351b1fa56fc127b292f6dbdb913abb347ca497b28e 0x996677f0735322cf140c1981e51b67c7 0xefad2dffd7c676bdfb330b3a7e81f4f8 0xbfd86dee7d8d5a4eadf820d382b714f9b44d7f803b837f366cab8a984c40843 0xab60ad87028de4629952162c92cbe4b0 0xbae39935070b91b395c012c10e89e4ce
67 1 0 0xb06d8370b09f3ff606cbb032910e052a6e4c26e10c17d1fb4b9359cd7fbe24f 0x97f5fcd4008138508bf9038464cd9c99 0x408c6dd51203a28c0c6bd70a92b9cdeb 0x399d9f32081d01c83dddff43f46ba0b25e0686d3d81e219f37bdfc88de99c4c 0x176d53e8613d4f918eed1da5daf1ae3c 0xc22b82581a5c4dc3eb803bcfede92b4c
68 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
69 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
70 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
71 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
72 1 0 0xe65b3f3cb539f3ca72c26a5596475fbbbe8d6f582711383643a23220127d24d 0xaaf4faa1ae7c5ebf57efe71bcfb60e4f 0x4bdf2d4302bd5ab2ee330e6dfdae2ba0 0x67dee9731332c7fb1d32ef8009f8451b90acff8ca4e0a70950c1f6887cb115e 0x10f15d0c2d8e18c83cf98c35286a904 0x3b0702c068c3dce99a14dbf35878fa56
73 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
74 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
75 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
76 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
77 1 0 0x7f7975790e2cb0878d7eb8254173635b9cae59655d237539a1c9974a0581379 0x253528e4920284996a8925cefeeb0e6a 0x458606fd053a274064093569604f8e6e 0x27fe459b2bd85ef08ba7284be6a1b4fa9b4a545e59d261287ac028e35f6e82b 0x893a596ec6b203bf83584d8f2f4f02be 0xad76cab1a21ca92e17dd2ae037626842
78 1 1 0x7f7975790e2cb0878d7eb8254173635b9cae59655d237539a1c9974a0581379 0x253528e4920284996a8925cefeeb0e6a 0x458606fd053a274064093569604f8e6e 0x27fe459b2bd85ef08ba7284be6a1b4fa9b4a545e59d261287ac028e35f6e82b 0x893a596ec6b203bf83584d8f2f4f02be 0xad76cab1a21ca92e17dd2ae037626842
79 1 1 0x7f7975790e2cb0878d7eb8254173635b9cae59655d237539a1c9974a0581379 0x253528e4920284996a8925cefeeb0e6a 0x458606fd053a274064093569604f8e6e 0x27fe459b2bd85ef08ba7284be6a1b4fa9b4a545e59d261287ac028e35f6e82b 0x893a596ec6b203bf83584d8f2f4f02be 0xad76cab1a21ca92e17dd2ae037626842
80 1 0 0xd99a7da9e56fb98b4ea6eed3c97850cb421c0c9677b1ea3b63e0c01c4b483ce 0x34fa32e467be6484e68a4161ac4c5e4a 0x2719eea179e0b75a5d46f518e9351695 0xaf8e105eaad4d16fca08d01c00fd61aaf123407d64915027112b3c60cfd8831 0x93e25146b19d25035c45442b7f816564 0xfdd7f4f78ecf1751db322e4f433ebddb
81 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
82 1 0 0x5bea17a563b11a2269eb0f03ad5640c66575c8bae12198b49231d8f31ecd0b2 0x1ff3ae2c5fc2d6ad2ff3dc351037ac48 0xf3554d4be537e7149f0270673d57603e 0x26837f96bf42dfb9a3d712aec8a78efede1c2338dc39b0242de37fea474921b 0x4e9372bf2252d05c0db52ea436e3041c 0x5a713dec54f94b5f7dc61cdb72b1d4e4
83 1 0 0xa1cc247b921723ca53a59d813f2adb7ca47f8eff00ba49e55550e1f1e544241 0x213aecda3ce19fb0b492f2d261020584 0x1ac635fdda33542e83a1fe01fd6b31d0 0xa3c2340721f49260c1bfe6f137f4b47931e5e10a3783b38d6217452c5e3631b 0x6e9d2bbb52f7afa4b0f564fd8caab588 0x221b66157dade849dedb61e4320e84aa
84 1 1 0xa1cc247b921723ca53a59d813f2adb7ca47f8eff00ba49e55550e1f1e544241 0x213aecda3ce19fb0b492f2d261020584 0x1ac635fdda33542e83a1fe01fd6b31d0 0xa3c2340721f49260c1bfe6f137f4b47931e5e10a3783b38d6217452c5e3631b 0x6e9d2bbb52f7afa4b0f564fd8caab588 0x221b66157dade849dedb61e4320e84aa
85 1 0 0x796ae7f0e7768674a2636592ea0bca75714cb4d4c3f7136485959f676f7c5e7 0xec791d783bdfbfba883e15d0ee0dfda4 0x6e075d26559c95292b391dcd90bacae2 0xacd579a3134ccf1d08f14c0e5d4de343266be87db4912debc405af578b7dcee 0xcccb598ed1a6a22627830dabe31ad2d9 0x98c4bf81d0af2bd0bd53664239dc195a
86 1 0 0x116239c90f29dea8eb2eb35ce5d58473547a3a9ed792e4d6290f835d6bb5784 0x822d955a6ed1f14ba562bd305aa42637 0x9f9958424fbb5350bf6f30b0613b2bfb 0x17b347f7033c75fd492236e39d09e5cc2c69efdae6769eb9f79f33b1bb115fb 0x87cbb16677016c9697796469e2147c37 0xbffa57a3216752a0ee51fa1db31f57c7
87 1 1 0x116239c90f29dea8eb2eb35ce5d58473547a3a9ed792e4d6290f835d6bb5784 0x822d955a6ed1f14ba562bd305aa42637 0x9f9958424fbb5350bf6f30b0613b2bfb 0x17b347f7033c75fd492236e39d09e5cc2c69efdae6769eb9f79f33b1bb115fb 0x87cbb16677016c9697796469e2147c37 0xbffa57a3216752a0ee51fa1db31f57c7
88 1 1 0x116239c90f29dea8eb2eb35ce5d58473547a3a9ed792e4d6290f835d6bb5784 0x822d955a6ed1f14ba562bd305aa42637 0x9f9958424fbb5350bf6f30b0613b2bfb 0x17b347f7033c75fd492236e39d09e5cc2c69efdae6769eb9f79f33b1bb115fb 0x87cbb16677016c9697796469e2147c37 0xbffa57a3216752a0ee51fa1db31f57c7
89 1 1 0x116239c90f29dea8eb2eb35ce5d58473547a3a9ed792e4d6290f835d6bb5784 0x822d955a6ed1f14ba562bd305aa42637 0x9f9958424fbb5350bf6f30b0613b2bfb 0x17b347f7033c75fd492236e39d09e5cc2c69efdae6769eb9f79f33b1bb115fb 0x87cbb16677016c9697796469e2147c37 0xbffa57a3216752a0ee51fa1db31f57c7
90 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
91 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
92 1 0 0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704 0x367de3aa93d6405aa1979452414d0cdc 0x6bf078a86cb81f1183a28736513743d 0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27 0xbfe496d60e90db539af391782c0670fe 0xa4f0d1cab3eec2f400490037c5ba0169
93 1 1 0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704 0x367de3aa93d6405aa1979452414d0cdc 0x6bf078a86cb81f1183a28736513743d 0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27 0xbfe496d60e90db539af391782c0670fe 0xa4f0d1cab3eec2f400490037c5ba0169
94 1 1 0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704 0x367de3aa93d6405aa1979452414d0cdc 0x6bf078a86cb81f1183a28736513743d 0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27 0xbfe496d60e90db539af391782c0670fe 0xa4f0d1cab3eec2f400490037c5ba0169
95 1 1 0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704 0x367de3aa93d6405aa1979452414d0cdc 0x6bf078a86cb81f1183a28736513743d 0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27 0xbfe496d60e90db539af391782c0670fe 0xa4f0d1cab3eec2f400490037c5ba0169
96 1 1 0xd1d5e6d96a0e33007d3daebfa972d03b7bb67b8a4fba812376fafd30b814704 0x367de3aa93d6405aa1979452414d0cdc 0x6bf078a86cb81f1183a28736513743d 0x9cd2fb59f7dad863b6b37a8c3c9528f06ec271a54c93a71092721eec697ac27 0xbfe496d60e90db539af391782c0670fe 0xa4f0d1cab3eec2f400490037c5ba0169
97 1 0 0x420d1987d554b6040ffba354fd3a6576573e7f3810ba3b3b2f736e2c00e9dda 0x45f250aaf0d881ad86fd62235b890968 0x161cfd2a0b591cdec5d674da238d44ec 0x81014394cb2b477fdf0397ba51717657ed1a993e7e63adec55566a48b8514e3 0xa42d146920d3d2b1c04e35e6d5e9ac35 0x538bcdb7739f910e8a0f6fe3debc5b63
98 1 0 0xf145fbeb995facc396b62d73b9e1c297c83d119979e46ae16c4c0ba90e9e7f0 0xc18d0cb6b60e7b046159269197812020 0x58219a1662aaf165a8ab4347b2ebb7cb 0x793fd3a2d8d31c45f9a7a6061e30e86f155b66c957857d3d9730a89838e0005 0x1218bf4befbdf3e2ed280eee79c6244b 0xb87e7320bd4f43381dd6fab8225ee35b
99 1 0 0xd6a6e52cbcaa5cae42454038466557a5cd4abb2f1f506c38058f99534656c2b 0x693ffec3234e977ec90a1621671fc139 0xab030541519cc12965b9a5cbf2c77a1e 0xddd15c05722d7a7dc6bdfd70148fb4e3c7def7827ee62ae03ef58254ff2606d 0x1890b5f936f617ac7113888c43869db5 0x7d23a9e21d81075a387f257cef69fe5c
100 1 1 0xd6a6e52cbcaa5cae42454038466557a5cd4abb2f1f506c38058f99534656c2b 0x693ffec3234e977ec90a1621671fc139 0xab030541519cc12965b9a5cbf2c77a1e 0xddd15c05722d7a7dc6bdfd70148fb4e3c7def7827ee62ae03ef58254ff2606d 0x1890b5f936f617ac7113888c43869db5 0x7d23a9e21d81075a387f257cef69fe5c
101 1 1 0xd6a6e52cbcaa5cae42454038466557a5cd4abb2f1f506c38058f99534656c2b 0x693ffec3234e977ec90a1621671fc139 0xab030541519cc12965b9a5cbf2c77a1e 0xddd15c05722d7a7dc6bdfd70148fb4e3c7def7827ee62ae03ef58254ff2606d 0x1890b5f936f617ac7113888c43869db5 0x7d23a9e21d81075a387f257cef69fe5c
102 1 0 0x8f086a265ddaf5da1a35f983e62bbec4ec4dfdf413039443259f52fb23ea4eb 0xfd91aec846780f1852cd426d65d44855 0xe718a2a754d056208c69b68459c3b26f 0xc946b7b62e3bca7c3f058a6f859e049360260f986fc355cd1cbea6ac1fd8fb 0x99ab3b350754f7e6ce970feda3d868d1 0x25eaa8907d9362650dafa0ccf15a92ee
103 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
104 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
105 1 0 0x4e2c8d4fabfff1e591ab2acdd75674750c586ecc05f542cfb86233dc2ed5eaa 0x9e41a5832437ba0671ae6d781779d3d7 0x29f117b1828ab9c05f55d192b367e7be 0x69a4895fc7362c6c7798ad803b824c400b247fae0fbcfeda2b416fdec3c716f 0x969a1b2e513f1ddbb09b13ebb6b89bc6 0xbccff59d5aedff5844b8dcc41e9c0f1f
106 1 1 0x4e2c8d4fabfff1e591ab2acdd75674750c586ecc05f542cfb86233dc2ed5eaa 0x9e41a5832437ba0671ae6d781779d3d7 0x29f117b1828ab9c05f55d192b367e7be 0x69a4895fc7362c6c7798ad803b824c400b247fae0fbcfeda2b416fdec3c716f 0x969a1b2e513f1ddbb09b13ebb6b89bc6 0xbccff59d5aedff5844b8dcc41e9c0f1f
107 1 0 0x2862cfaf050a1d322c3f7d18d456beb01be8ba64ad1264470c30c17e7e1790e 0x261e5ce06c9c233678bd07d3e525811d 0x85b04ea749f468f87cc2a5b094573cd4 0x121121cf43252bc791c61474300d6f0b2e20c3b0a3f83abef1d3f2b624501aa3 0x4fec8a94b5955ef50c4bc2938adc5b43 0x51f54908c4ec3ff9edbe10f6eb2258a2
108 1 0 0x5a5d5dec422a16c0c12c66b484e8fc60548e70be104d8ef619d41897ca2eebe 0xd0def8949c5f9ec76796b37b49fb50a1 0x367c115fbc0d7ccb87ef7ed68916a6c4 0x3fb628afd3f9b4f19d5d7796090d2ad6f54b1847f500f05c84e1ee7132738df 0xf2ced2092bce766fcbeeb41786388267 0x9ecfa5aa99914e46fde587c3e3297d92
109 1 0 0x3070970d5198b56e2eecc42efee353fdf0e43695bf647d9f09ea2d1764409c8 0x812fe3c9b5d115fa99cd91af1e9d5845 0x9b3848d64d3c8886632807df3bef85ac 0x3427471c4b44e9a3b05d740e993b2fb2be6eae715b36d6f84424769c4d79566 0x2c3ba52aa2c409fcb2195d8cbf7f3a91 0x44d41978512d9944495774ad0de481c
110 1 1 0x3070970d5198b56e2eecc42efee353fdf0e43695bf647d9f09ea2d1764409c8 0x812fe3c9b5d115fa99cd91af1e9d5845 0x9b3848d64d3c8886632807df3bef85ac 0x3427471c4b44e9a3b05d740e993b2fb2be6eae715b36d6f84424769c4d79566 0x2c3ba52aa2c409fcb2195d8cbf7f3a91 0x44d41978512d9944495774ad0de481c
111 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
112 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
113 1 0 0xe81a73fb7fc1d5f975a0de58e37a3b32e77aa8e1ebf824828010167b7d2e596 0x7c2d2cada376264dc0d4c2817d81c4cc 0xe4cb9b7db79b0d56d57cd4d431ac0dc4 0x371a1c7d8773ffc74132a9b5b4a29cc42426066f085347901ba75d2baf8e4a8 0x41e7bc4990bbfa88b2a2d2f5947c7b02 0x3cb483e4076d7dc2913f20ef5483ea80
114 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
115 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
116 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
117 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
118 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
119 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
120 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
121 1 0 0xa9792e72211e53e07acc386714411841e3e18857851749e1db4a8534521ab3b 0xea43ba6d00ff5ff081c2a2f50871046a 0xa659b39355270b717571c1c037aa746b 0x5b8ed2eb2864e98cce0e9a02cabfd8602747c9a693f90dcd12dca32080729f9 0xa2a469704b2f6ea77e4261cca30328ce 0x51bc6a4e45ea73ead9a9707672edef88
122 1 1 0xa9792e72211e53e07acc386714411841e3e18857851749e1db4a8534521ab3b 0xea43ba6d00ff5ff081c2a2f50871046a 0xa659b39355270b717571c1c037aa746b 0x5b8ed2eb2864e98cce0e9a02cabfd8602747c9a693f90dcd12dca32080729f9 0xa2a469704b2f6ea77e4261cca30328ce 0x51bc6a4e45ea73ead9a9707672edef88
123 1 0 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
124 1 1 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee 0x11f4cf9cf92cbd4e55cb49097909d1eb7ef4e232efd287a7ce617ea2fdf5e218 0x7b58305eb2aa3ff8e9b49192b4822685 0x84e6417582b82df64c84659a39513fee
125 1 0 0x71ba533388576c9a957c746457e4feb21de3260fa61c5230fb40c59f2534493 0x30a7c00888e0041fedddd38732d3af98 0xa287c298774bc224c4ec8aac432d3474 0x6e437929ba3096222cc08f6a10bfca20537ba78298548dc76126ee83960be74 0xdb637f3876071b109b6a9e4fbb961259 0xf841c2c1c3fa07ae3984fac6a8ad4ddb
126 1 1 0x71ba533388576c9a957c746457e4feb21de3260fa61c5230fb40c59f2534493 0x30a7c00888e0041fedddd38732d3af98 0xa287c298774bc224c4ec8aac432d3474 0x6e437929ba3096222cc08f6a10bfca20537ba78298548dc76126ee83960be74 0xdb637f3876071b109b6a9e4fbb961259 0xf841c2c1c3fa07ae3984fac6a8ad4ddb
127 1 1 0x71ba533388576c9a957c746457e4feb21de3260fa61c5230fb40c59f2534493 0x30a7c00888e0041fedddd38732d3af98 0xa287c298774bc224c4ec8aac432d3474 0x6e437929ba3096222cc08f6a10bfca20537ba78298548dc76126ee83960be74 0xdb637f3876071b109b6a9e4fbb961259 0xf841c2c1c3fa07ae3984fac6a8ad4ddb
128 1 1 0x71ba533388576c9a957c746457e4feb21de3260fa61c5230fb40c59f2534493 0x30a7c00888e0041fedddd38732d3af98 0xa287c298774bc224c4ec8aac432d3474 0x6e437929ba3096222cc08f6a10bfca20537ba78298548dc76126ee83960be74 0xdb637f3876071b109b6a9e4fbb961259 0xf841c2c1c3fa07ae3984fac6a8ad4ddb
129 1 0 0x9348320796205bdacdf734d12dd7d0add3ac27e87caddf99f1765bb89886a5a 0x3de923a685d5e3f2d634b891db64403d 0xe8460a5be4c18d2f5fc5ca8c6e0ef209 0x249cb31042b5b8b0f19a18a04239ae5691442c48b329e488680be2897b4f839 0x66f127bb16fe5c6d85fe3fe55c1adadb 0x87b6a3c85d0b22d5ffaad98f65515163

View File

@@ -1,36 +0,0 @@
package statemanager
import (
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
mimcCodeHash "github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/mimccodehash"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/statesummary"
)
// lookupStateSummaryCodeHash adds the lookup constraints to ensure the MiMC
// CodeHash module and the StateSummary module contains consistent consistent
// pairs of (MiMCCodeHash, KeccakCodeHash)
func lookupStateSummaryCodeHash(comp *wizard.CompiledIOP,
accountPeek *statesummary.AccountPeek,
codeHash *mimcCodeHash.Module) {
// All the state manager operations are performed in round zero
round := 0
// Lookup between code hashes (Keccak and MiMC) between state summary initial account and MiMC code hash module
comp.InsertInclusionDoubleConditional(round,
ifaces.QueryID("LOOKUP_MIMC_CODEHASH_INITIAL_ACCOUNT_INTO_STATE_SUMMARY"),
[]ifaces.Column{accountPeek.Initial.KeccakCodeHash.Hi, accountPeek.Initial.KeccakCodeHash.Lo, accountPeek.Initial.MiMCCodeHash, accountPeek.Initial.CodeSize},
[]ifaces.Column{codeHash.CodeHashHi, codeHash.CodeHashLo, codeHash.NewState, codeHash.CodeSize},
accountPeek.Initial.ExistsAndHasNonEmptyCodeHash,
codeHash.IsHashEnd,
)
// Lookup between code hashes (Keccak and MiMC) between state summary final account and MiMC code hash module
comp.InsertInclusionDoubleConditional(round,
ifaces.QueryIDf("LOOKUP_MIMC_CODEHASH_FINAL_ACCOUNT_INTO_STATE_SUMMARY"),
[]ifaces.Column{accountPeek.Final.KeccakCodeHash.Hi, accountPeek.Final.KeccakCodeHash.Lo, accountPeek.Final.MiMCCodeHash, accountPeek.Final.CodeSize},
[]ifaces.Column{codeHash.CodeHashHi, codeHash.CodeHashLo, codeHash.NewState, codeHash.CodeSize},
accountPeek.Final.ExistsAndHasNonEmptyCodeHash,
codeHash.IsHashEnd,
)
}

View File

@@ -6,6 +6,7 @@ import (
"github.com/consensys/linea-monorepo/prover/utils"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/accumulator"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/accumulatorsummary"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/codehashconsistency"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/mimccodehash"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/statemanager/statesummary"
)
@@ -18,6 +19,7 @@ type StateManager struct {
accumulatorSummaryConnector accumulatorsummary.Module
StateSummary statesummary.Module // exported because needed by the public input module
mimcCodeHash mimccodehash.Module
codeHashConsistency codehashconsistency.Module
}
// Settings stores all the setting to construct a StateManager and is passed to
@@ -51,7 +53,7 @@ func NewStateManager(comp *wizard.CompiledIOP, settings Settings) *StateManager
sm.accumulatorSummaryConnector.ConnectToStateSummary(comp, &sm.StateSummary)
sm.mimcCodeHash.ConnectToRom(comp, rom(comp), romLex(comp))
sm.StateSummary.ConnectToHub(comp, acp(comp), scp(comp))
lookupStateSummaryCodeHash(comp, &sm.StateSummary.Account, &sm.mimcCodeHash)
sm.codeHashConsistency = codehashconsistency.NewModule(comp, "CODEHASHCONSISTENCY", &sm.StateSummary, &sm.mimcCodeHash)
return sm
}
@@ -79,10 +81,7 @@ func NewStateManagerNoHub(comp *wizard.CompiledIOP, settings Settings) *StateMan
sm.accumulatorSummaryConnector.ConnectToStateSummary(comp, &sm.StateSummary)
sm.mimcCodeHash.ConnectToRom(comp, rom(comp), romLex(comp))
// Waiting for the resolution of the mimc code hash issue
//
// lookupStateSummaryCodeHash(comp, &sm.StateSummary.Account, &sm.mimcCodeHash)
sm.codeHashConsistency = codehashconsistency.NewModule(comp, "CODEHASHCONSISTENCY", &sm.StateSummary, &sm.mimcCodeHash)
return sm
}
@@ -95,6 +94,7 @@ func (sm *StateManager) Assign(run *wizard.ProverRuntime, shomeiTraces [][]state
sm.accumulator.Assign(run, utils.Join(shomeiTraces...))
sm.accumulatorSummaryConnector.Assign(run)
sm.mimcCodeHash.Assign(run)
sm.codeHashConsistency.Assign(run)
}

View File

@@ -151,7 +151,7 @@ type Account struct {
// single column each.
Exists, Nonce, Balance, MiMCCodeHash, CodeSize, StorageRoot ifaces.Column
// KeccakCodeHash stores the keccak code hash of the account.
KeccakCodeHash HiLoColumns
KeccakCodeHash common.HiLoColumns
// HasEmptyCodeHash is an indicator column indicating whether the current
// account has an empty codehash
HasEmptyCodeHash ifaces.Column
@@ -178,7 +178,7 @@ func newAccount(comp *wizard.CompiledIOP, size int, name string) Account {
MiMCCodeHash: createCol("MIMC_CODEHASH"),
CodeSize: createCol("CODESIZE"),
StorageRoot: createCol("STORAGE_ROOT"),
KeccakCodeHash: newHiLoColumns(comp, size, name+"_KECCAK_CODE_HASH"),
KeccakCodeHash: common.NewHiLoColumns(comp, size, name+"_KECCAK_CODE_HASH"),
ExistsAndHasNonEmptyCodeHash: createCol("EXISTS_AND_NON_EMPTY_CODEHASH"),
}
@@ -231,7 +231,7 @@ func newAccountPeekAssignmentBuilder(ap *AccountPeek) accountPeekAssignmentBuild
// builders relating to the an Account.
type accountAssignmentBuilder struct {
exists, nonce, balance, miMCCodeHash, codeSize, storageRoot *common.VectorBuilder
keccakCodeHash hiLoAssignmentBuilder
keccakCodeHash common.HiLoAssignmentBuilder
existsAndHasNonEmptyCodeHash *common.VectorBuilder
}
@@ -246,7 +246,7 @@ func newAccountAssignmentBuilder(ap *Account) accountAssignmentBuilder {
codeSize: common.NewVectorBuilder(ap.CodeSize),
storageRoot: common.NewVectorBuilder(ap.StorageRoot),
existsAndHasNonEmptyCodeHash: common.NewVectorBuilder(ap.ExistsAndHasNonEmptyCodeHash),
keccakCodeHash: newHiLoAssignmentBuilder(ap.KeccakCodeHash),
keccakCodeHash: common.NewHiLoAssignmentBuilder(ap.KeccakCodeHash),
}
}
@@ -261,11 +261,11 @@ func (ss *accountAssignmentBuilder) pushAll(acc types.Account) {
if accountExists {
ss.balance.PushBytes32(types.LeftPadToBytes32(acc.Balance.Bytes()))
ss.exists.PushOne()
ss.keccakCodeHash.push(acc.KeccakCodeHash)
ss.keccakCodeHash.Push(acc.KeccakCodeHash)
} else {
ss.balance.PushZero()
ss.exists.PushZero()
ss.keccakCodeHash.push(types.FullBytes32(statemanager.LEGACY_KECCAK_EMPTY_CODEHASH))
ss.keccakCodeHash.Push(types.FullBytes32(statemanager.LEGACY_KECCAK_EMPTY_CODEHASH))
}
ss.codeSize.PushInt(int(acc.CodeSize))
@@ -289,11 +289,11 @@ func (ss *accountAssignmentBuilder) pushOverrideStorageRoot(
if accountExists {
ss.balance.PushBytes32(types.LeftPadToBytes32(acc.Balance.Bytes()))
ss.exists.PushOne()
ss.keccakCodeHash.push(acc.KeccakCodeHash)
ss.keccakCodeHash.Push(acc.KeccakCodeHash)
} else {
ss.balance.PushZero()
ss.exists.PushZero()
ss.keccakCodeHash.push(types.FullBytes32(statemanager.LEGACY_KECCAK_EMPTY_CODEHASH))
ss.keccakCodeHash.Push(types.FullBytes32(statemanager.LEGACY_KECCAK_EMPTY_CODEHASH))
}
ss.codeSize.PushInt(int(acc.CodeSize))
@@ -309,7 +309,7 @@ func (ss *accountAssignmentBuilder) PadAndAssign(run *wizard.ProverRuntime) {
ss.exists.PadAndAssign(run)
ss.nonce.PadAndAssign(run)
ss.balance.PadAndAssign(run)
ss.keccakCodeHash.padAssign(run, types.FullBytes32{})
ss.keccakCodeHash.PadAssign(run, types.FullBytes32{})
ss.miMCCodeHash.PadAndAssign(run)
ss.storageRoot.PadAndAssign(run)
ss.codeSize.PadAndAssign(run)

View File

@@ -1,68 +0,0 @@
package statesummary
import (
"github.com/consensys/linea-monorepo/prover/maths/field"
"github.com/consensys/linea-monorepo/prover/protocol/ifaces"
"github.com/consensys/linea-monorepo/prover/protocol/wizard"
"github.com/consensys/linea-monorepo/prover/utils/types"
"github.com/consensys/linea-monorepo/prover/zkevm/prover/common"
)
// HiLoColumns represents a pair of column representing a sequence of bytes32
// element that do not fit in a single field element. The Hi columns stores the
// first 16 bytes of the column. And the Lo columns stores the last 16 bytes.
type HiLoColumns struct {
Hi, Lo ifaces.Column
}
// newHiLoColumns returns a new HiLoColumns with initialized and unconstrained
// columns.
func newHiLoColumns(comp *wizard.CompiledIOP, size int, name string) HiLoColumns {
return HiLoColumns{
Hi: comp.InsertCommit(
0,
ifaces.ColIDf("STATE_SUMMARY_%v_HI", name),
size,
),
Lo: comp.InsertCommit(
0,
ifaces.ColIDf("STATE_SUMMARY_%v_LO", name),
size,
),
}
}
// hiLoAssignmentBuilder is a convenience structure storing the column builders
// relating to an HiLoColumns.
type hiLoAssignmentBuilder struct {
hi, lo *common.VectorBuilder
}
// newHiLoAssignmentBuilder returns a fresh [hiLoAssignmentBuilder]
func newHiLoAssignmentBuilder(hiLo HiLoColumns) hiLoAssignmentBuilder {
return hiLoAssignmentBuilder{
hi: common.NewVectorBuilder(hiLo.Hi),
lo: common.NewVectorBuilder(hiLo.Lo),
}
}
// push pushes a row representing `fb` onto `hl`
func (hl *hiLoAssignmentBuilder) push(fb types.FullBytes32) {
hl.hi.PushHi(fb)
hl.lo.PushLo(fb)
}
// pushZeroes pushes a row representing 0 onto `hl`
func (hl *hiLoAssignmentBuilder) pushZeroes() {
hl.hi.PushZero()
hl.lo.PushZero()
}
// padAssign pads `hl` with `fb` and assigns the resulting columns into `run`.
func (hl *hiLoAssignmentBuilder) padAssign(run *wizard.ProverRuntime, fb types.FullBytes32) {
var f field.Element
f.SetBytes(fb[:16])
hl.hi.PadAndAssign(run, f)
f.SetBytes(fb[16:])
hl.lo.PadAndAssign(run, f)
}

View File

@@ -16,11 +16,11 @@ import (
// slot.
type StoragePeek struct {
// StorageKey stores the storage key of the peeked slot
Key HiLoColumns
Key common.HiLoColumns
// OldValue represents the storage value that is being peeked at.
OldValue HiLoColumns
OldValue common.HiLoColumns
// NewValue represents the new value of the storage slot.
NewValue HiLoColumns
NewValue common.HiLoColumns
// OldValueIsZero and NewValueIsZero are indicator columns set to 1 when the
// old/new value is set to zero and 0 otherwise.
@@ -71,9 +71,9 @@ type StoragePeek struct {
// unconstrained columns.
func newStoragePeek(comp *wizard.CompiledIOP, size int, name string) StoragePeek {
res := StoragePeek{
Key: newHiLoColumns(comp, size, name+"_KEY"),
OldValue: newHiLoColumns(comp, size, name+"_OLD_VALUE"),
NewValue: newHiLoColumns(comp, size, name+"_NEW_VALUE"),
Key: common.NewHiLoColumns(comp, size, name+"_KEY"),
OldValue: common.NewHiLoColumns(comp, size, name+"_OLD_VALUE"),
NewValue: common.NewHiLoColumns(comp, size, name+"_NEW_VALUE"),
}
res.OldValueHash, res.ComputeOldValueHash = common.HashOf(
@@ -128,63 +128,63 @@ func newStoragePeek(comp *wizard.CompiledIOP, size int, name string) StoragePeek
// storagePeekAssignmentBuilder is a convenience structure storing the column
// builders relating to a StoragePeek.
type storagePeekAssignmentBuilder struct {
key, oldValue, newValue hiLoAssignmentBuilder
key, oldValue, newValue common.HiLoAssignmentBuilder
}
// newStoragePeekAssignmentBuilder constructs a fresh [storagePeekAssignmentBuilder]
// with empty columns.
func newStoragePeekAssignmentBuilder(sp *StoragePeek) storagePeekAssignmentBuilder {
return storagePeekAssignmentBuilder{
key: newHiLoAssignmentBuilder(sp.Key),
oldValue: newHiLoAssignmentBuilder(sp.OldValue),
newValue: newHiLoAssignmentBuilder(sp.NewValue),
key: common.NewHiLoAssignmentBuilder(sp.Key),
oldValue: common.NewHiLoAssignmentBuilder(sp.OldValue),
newValue: common.NewHiLoAssignmentBuilder(sp.NewValue),
}
}
// pushAllZeroes pushes a zero row onto the receiver
func (sh *storagePeekAssignmentBuilder) pushAllZeroes() {
sh.key.pushZeroes()
sh.oldValue.pushZeroes()
sh.newValue.pushZeroes()
sh.key.PushZeroes()
sh.oldValue.PushZeroes()
sh.newValue.PushZeroes()
}
// pushOnlyKey pushes the key onto the the "key" columns builder and zero on
// the others
func (sh *storagePeekAssignmentBuilder) pushOnlyKey(key types.FullBytes32) {
sh.key.push(key)
sh.oldValue.pushZeroes()
sh.newValue.pushZeroes()
sh.key.Push(key)
sh.oldValue.PushZeroes()
sh.newValue.PushZeroes()
}
// pushOnlyOld pushes a row where the keys and the old value are the one provided
// by the caller and the new value is zero.
func (sh *storagePeekAssignmentBuilder) pushOnlyOld(key, oldVal types.FullBytes32) {
sh.key.push(key)
sh.oldValue.push(oldVal)
sh.newValue.pushZeroes()
sh.key.Push(key)
sh.oldValue.Push(oldVal)
sh.newValue.PushZeroes()
}
// pushOnlyNew pushes a row where the key and the new value are the one provided
// by the caller and the old value is set to zero.
func (sh *storagePeekAssignmentBuilder) pushOnlyNew(key, newVal types.FullBytes32) {
sh.key.push(key)
sh.oldValue.pushZeroes()
sh.newValue.push(newVal)
sh.key.Push(key)
sh.oldValue.PushZeroes()
sh.newValue.Push(newVal)
}
// push pushes a row where the key, the old value and the new value are the
// one provided by the caller.
func (sh *storagePeekAssignmentBuilder) push(key, oldVal, newVal types.FullBytes32) {
sh.key.push(key)
sh.oldValue.push(oldVal)
sh.newValue.push(newVal)
sh.key.Push(key)
sh.oldValue.Push(oldVal)
sh.newValue.Push(newVal)
}
// padAssign pads and assigns the columns of the storage peek into `run`.
func (sh *storagePeekAssignmentBuilder) padAssign(run *wizard.ProverRuntime) {
sh.key.padAssign(run, types.FullBytes32{})
sh.oldValue.padAssign(run, types.FullBytes32{})
sh.newValue.padAssign(run, types.FullBytes32{})
sh.key.PadAssign(run, types.FullBytes32{})
sh.oldValue.PadAssign(run, types.FullBytes32{})
sh.newValue.PadAssign(run, types.FullBytes32{})
}
// hashOfZeroStorage returns the hash of (0, 0) which is what we use for empty