From 99f664f306c8ddec70b7a56078316a4914b620d0 Mon Sep 17 00:00:00 2001 From: noelwei Date: Wed, 9 Oct 2024 16:26:08 +0900 Subject: [PATCH 1/3] add test for evm verifier Signed-off-by: noelwei --- integration/tests/bundle_tests.rs | 38 +++++++++++++++++++ .../test_data/recursion_snark_layer5.json | 1 + 2 files changed, 39 insertions(+) create mode 100644 integration/tests/test_data/recursion_snark_layer5.json diff --git a/integration/tests/bundle_tests.rs b/integration/tests/bundle_tests.rs index 82a62593..7402eecc 100644 --- a/integration/tests/bundle_tests.rs +++ b/integration/tests/bundle_tests.rs @@ -37,3 +37,41 @@ fn gen_bundle_proving_task(batch_proof_files: &[&str]) -> BundleProvingTask { BundleProvingTask { batch_proofs } } + +#[test] +fn test_evm_verifier_from_layer5() { + use prover::{ + io::load_snark, + config::LayerId, + utils::read_env_var, + }; + use integration::test_util::PARAMS_DIR; + use itertools::Itertools; + use prover::config::AGG_DEGREES; + + let output_dir = init_env_and_log("test_evm_verifer"); + + let layer5_snark_path = read_env_var( + "LAYER5_SNARK", + "tests/test_data/recursion_snark_layer5.json".to_string()); + let snark = load_snark(&layer5_snark_path).ok().flatten().unwrap(); + + let params_map = prover::common::Prover::load_params_map( + PARAMS_DIR, + &AGG_DEGREES.iter().copied().collect_vec(), + ); + + let mut evm_prover = prover::common::Prover::from_params_map(¶ms_map); + + // enforce general yul + std::env::set_var("SCROLL_PROVER_DUMP_YUL", "true"); + evm_prover.load_or_gen_comp_evm_proof( + "0", + LayerId::Layer6.id(), + true, + LayerId::Layer6.degree(), + snark, + Some(output_dir.as_str()), + ).unwrap(); + +} \ No newline at end of file diff --git a/integration/tests/test_data/recursion_snark_layer5.json b/integration/tests/test_data/recursion_snark_layer5.json new file mode 100644 index 00000000..92e8e667 --- /dev/null +++ b/integration/tests/test_data/recursion_snark_layer5.json @@ -0,0 +1 @@ +{"protocol":{"domain":{"k":21,"n":2097152,"n_inv":[0,0,0,8796093022208],"gen":[7063725442162364797,10456422038513750871,610002596162631866,1686867808588488897],"gen_inv":[7419436655583739328,4546061169868866527,17077186631929237990,2356479378029159210]},"preprocessed":[{"x":[2616552819020248169,16095393938038418711,10623563002395528404,729779610741019906],"y":[8105463505553873789,3200730201010695567,6377099458083627403,635185237131992488]},{"x":[8392945536826060821,14639572720744116563,8356147499961184824,2272488727425754478],"y":[1428144718591132410,6991364563135825491,17388153608233287623,96815142861927012]},{"x":[1195307082763716939,149623979353095983,2375337380701393966,2203464005012997481],"y":[16446659385721814029,17166775121123248650,16709005181208641119,3209793123265133110]},{"x":[1029660743511130521,144410537024266809,12373979665078349683,527746655848330707],"y":[3082920784521317160,12843359897827053995,11158454495180050300,2922676413725226724]},{"x":[3879400020451212987,4001725629366913555,12274115123672583679,1209523536745971483],"y":[2760229717550202277,10635558992560220433,15487029908306872100,520613320292885055]},{"x":[9738444172808963693,13898390870676619012,2815368781741357663,1384494088901585849],"y":[16464180938776557062,3666267023483616516,14208733377357186927,1865438730407912457]},{"x":[9920121043770385991,6504979782439643684,87796557420631967,2413235861662372688],"y":[10337281944253582175,6302589212987012996,9114946392265677880,2677035347302627415]},{"x":[14401077569591970014,12215302443157895892,10265900739393511731,3256860456676527561],"y":[13337112090474162988,158426052977347729,1284062802927891343,70642630734564596]},{"x":[15419454152903911589,8891913849551340499,18247791752433920795,458272488487320748],"y":[3023927089193402280,7163446978986064218,14139135844820920971,611439487857199940]},{"x":[10020936274150480686,6105250534732519245,10769614877069505436,2677893758393662585],"y":[12544114794592896019,15296993343311128524,11397928720935563016,2669082321581783469]},{"x":[14586134654568617931,9292498942219711354,13500742076282688985,1256239146196521414],"y":[1315757588324963852,3480411076288339834,17151517986117727082,8506196934571623]},{"x":[5805426904845918063,14023266143857825113,7757022867327340365,486938710782816189],"y":[6961028424986835575,3622144683521016065,5673034195039546563,405191485524067823]},{"x":[1486442539855601418,16347604366366340930,11328174993222201343,3042177370845687192],"y":[5787518420110633938,9658702512651906403,6117505726050537188,2403180134239277085]}],"num_instance":[25],"num_witness":[5,1,5],"num_challenge":[1,2,1],"evaluations":[{"poly":14,"rotation":0},{"poly":14,"rotation":1},{"poly":14,"rotation":2},{"poly":14,"rotation":3},{"poly":15,"rotation":0},{"poly":15,"rotation":1},{"poly":15,"rotation":2},{"poly":15,"rotation":3},{"poly":16,"rotation":0},{"poly":16,"rotation":1},{"poly":16,"rotation":2},{"poly":16,"rotation":3},{"poly":17,"rotation":0},{"poly":17,"rotation":1},{"poly":17,"rotation":2},{"poly":17,"rotation":3},{"poly":18,"rotation":0},{"poly":1,"rotation":0},{"poly":0,"rotation":0},{"poly":2,"rotation":0},{"poly":3,"rotation":0},{"poly":4,"rotation":0},{"poly":5,"rotation":0},{"poly":24,"rotation":0},{"poly":6,"rotation":0},{"poly":7,"rotation":0},{"poly":8,"rotation":0},{"poly":9,"rotation":0},{"poly":10,"rotation":0},{"poly":11,"rotation":0},{"poly":12,"rotation":0},{"poly":20,"rotation":0},{"poly":20,"rotation":1},{"poly":20,"rotation":-7},{"poly":21,"rotation":0},{"poly":21,"rotation":1},{"poly":21,"rotation":-7},{"poly":22,"rotation":0},{"poly":22,"rotation":1},{"poly":23,"rotation":0},{"poly":23,"rotation":1},{"poly":19,"rotation":0}],"queries":[{"poly":14,"rotation":0},{"poly":14,"rotation":1},{"poly":14,"rotation":2},{"poly":14,"rotation":3},{"poly":15,"rotation":0},{"poly":15,"rotation":1},{"poly":15,"rotation":2},{"poly":15,"rotation":3},{"poly":16,"rotation":0},{"poly":16,"rotation":1},{"poly":16,"rotation":2},{"poly":16,"rotation":3},{"poly":17,"rotation":0},{"poly":17,"rotation":1},{"poly":17,"rotation":2},{"poly":17,"rotation":3},{"poly":18,"rotation":0},{"poly":20,"rotation":0},{"poly":20,"rotation":1},{"poly":21,"rotation":0},{"poly":21,"rotation":1},{"poly":22,"rotation":0},{"poly":22,"rotation":1},{"poly":21,"rotation":-7},{"poly":20,"rotation":-7},{"poly":23,"rotation":0},{"poly":23,"rotation":1},{"poly":19,"rotation":0},{"poly":1,"rotation":0},{"poly":0,"rotation":0},{"poly":2,"rotation":0},{"poly":3,"rotation":0},{"poly":4,"rotation":0},{"poly":5,"rotation":0},{"poly":6,"rotation":0},{"poly":7,"rotation":0},{"poly":8,"rotation":0},{"poly":9,"rotation":0},{"poly":10,"rotation":0},{"poly":11,"rotation":0},{"poly":12,"rotation":0},{"poly":25,"rotation":0},{"poly":24,"rotation":0}],"quotient":{"num_chunk":4,"chunk_degree":1,"numerator":{"DistributePowers":[[{"Product":[{"Polynomial":{"poly":2,"rotation":0}},{"Sum":[{"Sum":[{"Polynomial":{"poly":14,"rotation":0}},{"Product":[{"Polynomial":{"poly":14,"rotation":1}},{"Polynomial":{"poly":14,"rotation":2}}]}]},{"Negated":{"Polynomial":{"poly":14,"rotation":3}}}]}]},{"Product":[{"Polynomial":{"poly":3,"rotation":0}},{"Sum":[{"Sum":[{"Polynomial":{"poly":15,"rotation":0}},{"Product":[{"Polynomial":{"poly":15,"rotation":1}},{"Polynomial":{"poly":15,"rotation":2}}]}]},{"Negated":{"Polynomial":{"poly":15,"rotation":3}}}]}]},{"Product":[{"Polynomial":{"poly":4,"rotation":0}},{"Sum":[{"Sum":[{"Polynomial":{"poly":16,"rotation":0}},{"Product":[{"Polynomial":{"poly":16,"rotation":1}},{"Polynomial":{"poly":16,"rotation":2}}]}]},{"Negated":{"Polynomial":{"poly":16,"rotation":3}}}]}]},{"Product":[{"Polynomial":{"poly":5,"rotation":0}},{"Sum":[{"Sum":[{"Polynomial":{"poly":17,"rotation":0}},{"Product":[{"Polynomial":{"poly":17,"rotation":1}},{"Polynomial":{"poly":17,"rotation":2}}]}]},{"Negated":{"Polynomial":{"poly":17,"rotation":3}}}]}]},{"Product":[{"CommonPolynomial":{"Lagrange":0}},{"Sum":[{"Constant":[12436184717236109307,3962172157175319849,7381016538464732718,1011752739694698287]},{"Negated":{"Polynomial":{"poly":20,"rotation":0}}}]}]},{"Product":[{"CommonPolynomial":{"Lagrange":-7}},{"Sum":[{"Product":[{"Polynomial":{"poly":22,"rotation":0}},{"Polynomial":{"poly":22,"rotation":0}}]},{"Negated":{"Polynomial":{"poly":22,"rotation":0}}}]}]},{"Product":[{"CommonPolynomial":{"Lagrange":0}},{"Sum":[{"Polynomial":{"poly":21,"rotation":0}},{"Negated":{"Polynomial":{"poly":20,"rotation":-7}}}]}]},{"Product":[{"CommonPolynomial":{"Lagrange":0}},{"Sum":[{"Polynomial":{"poly":22,"rotation":0}},{"Negated":{"Polynomial":{"poly":21,"rotation":-7}}}]}]},{"Product":[{"Sum":[{"Sum":[{"Constant":[12436184717236109307,3962172157175319849,7381016538464732718,1011752739694698287]},{"Negated":{"CommonPolynomial":{"Lagrange":-7}}}]},{"Negated":{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"CommonPolynomial":{"Lagrange":-6}},{"CommonPolynomial":{"Lagrange":-5}}]},{"CommonPolynomial":{"Lagrange":-4}}]},{"CommonPolynomial":{"Lagrange":-3}}]},{"CommonPolynomial":{"Lagrange":-2}}]},{"CommonPolynomial":{"Lagrange":-1}}]}}]},{"Sum":[{"Product":[{"Polynomial":{"poly":20,"rotation":1}},{"Product":[{"Product":[{"Sum":[{"Sum":[{"Polynomial":{"poly":1,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":6,"rotation":0}}]}]},{"Challenge":2}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":14,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":7,"rotation":0}}]}]},{"Challenge":2}]}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":15,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":8,"rotation":0}}]}]},{"Challenge":2}]}]}]},{"Negated":{"Product":[{"Polynomial":{"poly":20,"rotation":0}},{"Product":[{"Product":[{"Sum":[{"Sum":[{"Polynomial":{"poly":1,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":[12436184717236109307,3962172157175319849,7381016538464732718,1011752739694698287]}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":14,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":[11100302345850292309,5109383341788583484,6450182039226333095,2498166472155664813]}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":15,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":[11922143911221101039,4762855335879493275,9634852812984583437,2104342265551292894]}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]}]}]}}]}]},{"Product":[{"Sum":[{"Sum":[{"Constant":[12436184717236109307,3962172157175319849,7381016538464732718,1011752739694698287]},{"Negated":{"CommonPolynomial":{"Lagrange":-7}}}]},{"Negated":{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"CommonPolynomial":{"Lagrange":-6}},{"CommonPolynomial":{"Lagrange":-5}}]},{"CommonPolynomial":{"Lagrange":-4}}]},{"CommonPolynomial":{"Lagrange":-3}}]},{"CommonPolynomial":{"Lagrange":-2}}]},{"CommonPolynomial":{"Lagrange":-1}}]}}]},{"Sum":[{"Product":[{"Polynomial":{"poly":21,"rotation":1}},{"Product":[{"Product":[{"Sum":[{"Sum":[{"Polynomial":{"poly":16,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":9,"rotation":0}}]}]},{"Challenge":2}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":17,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":10,"rotation":0}}]}]},{"Challenge":2}]}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":18,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":11,"rotation":0}}]}]},{"Challenge":2}]}]}]},{"Negated":{"Product":[{"Polynomial":{"poly":21,"rotation":0}},{"Product":[{"Product":[{"Sum":[{"Sum":[{"Polynomial":{"poly":16,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":[6393076176221150738,7283021187728417300,15472188617747294665,3366061389777165561]}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":17,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":[5185504448716010194,13473122879869045206,7110214824824105482,296185565312886903]}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]}]},{"Sum":[{"Sum":[{"Polynomial":{"poly":18,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":[3788189710366593638,12364756977029776224,17445039711624853376,2145282486335891750]}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]}]}]}}]}]},{"Product":[{"Sum":[{"Sum":[{"Constant":[12436184717236109307,3962172157175319849,7381016538464732718,1011752739694698287]},{"Negated":{"CommonPolynomial":{"Lagrange":-7}}}]},{"Negated":{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"CommonPolynomial":{"Lagrange":-6}},{"CommonPolynomial":{"Lagrange":-5}}]},{"CommonPolynomial":{"Lagrange":-4}}]},{"CommonPolynomial":{"Lagrange":-3}}]},{"CommonPolynomial":{"Lagrange":-2}}]},{"CommonPolynomial":{"Lagrange":-1}}]}}]},{"Sum":[{"Product":[{"Polynomial":{"poly":22,"rotation":1}},{"Sum":[{"Sum":[{"Polynomial":{"poly":13,"rotation":0}},{"Product":[{"Challenge":1},{"Polynomial":{"poly":12,"rotation":0}}]}]},{"Challenge":2}]}]},{"Negated":{"Product":[{"Polynomial":{"poly":22,"rotation":0}},{"Sum":[{"Sum":[{"Polynomial":{"poly":13,"rotation":0}},{"Product":[{"Product":[{"Challenge":1},{"Constant":[4313891821910826284,3017229878821944834,2706732049417028840,1207705578258863476]}]},{"CommonPolynomial":"Identity"}]}]},{"Challenge":2}]}]}}]}]},{"Product":[{"CommonPolynomial":{"Lagrange":0}},{"Polynomial":{"poly":23,"rotation":0}}]},{"Product":[{"CommonPolynomial":{"Lagrange":-7}},{"Polynomial":{"poly":23,"rotation":0}}]},{"Product":[{"Sum":[{"Sum":[{"Constant":[12436184717236109307,3962172157175319849,7381016538464732718,1011752739694698287]},{"Negated":{"CommonPolynomial":{"Lagrange":-7}}}]},{"Negated":{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"Sum":[{"CommonPolynomial":{"Lagrange":-6}},{"CommonPolynomial":{"Lagrange":-5}}]},{"CommonPolynomial":{"Lagrange":-4}}]},{"CommonPolynomial":{"Lagrange":-3}}]},{"CommonPolynomial":{"Lagrange":-2}}]},{"CommonPolynomial":{"Lagrange":-1}}]}}]},{"Sum":[{"Product":[{"Product":[{"Sum":[{"DistributePowers":[[{"Polynomial":{"poly":0,"rotation":0}}],{"Challenge":0}]},{"Challenge":1}]},{"Sum":[{"DistributePowers":[[{"Polynomial":{"poly":18,"rotation":0}}],{"Challenge":0}]},{"Challenge":1}]}]},{"Sum":[{"Polynomial":{"poly":23,"rotation":1}},{"Negated":{"Polynomial":{"poly":23,"rotation":0}}}]}]},{"Negated":{"Sum":[{"Sum":[{"DistributePowers":[[{"Polynomial":{"poly":0,"rotation":0}}],{"Challenge":0}]},{"Challenge":1}]},{"Negated":{"Product":[{"Polynomial":{"poly":19,"rotation":0}},{"Sum":[{"DistributePowers":[[{"Polynomial":{"poly":18,"rotation":0}}],{"Challenge":0}]},{"Challenge":1}]}]}}]}}]}]}],{"Challenge":3}]}},"transcript_initial_state":[11384782782798886082,17548447433523307999,18223228148853077847,2996190557667960771],"instance_committing_key":null,"linearization":null,"accumulator_indices":[[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11]]]},"instances":[[[8801775492413980821,17400022462986134813,18408158102823277961,2641417797454235901],[4666517438286639926,11923454396566713872,119981337535560821,2784772775306396308],[11238154447264557080,11715639482994802824,8348626633671473843,2646549988744194848],[9431751275103436135,1066842961535293695,12981324229132530519,1372140549018494160],[6071576375087043930,3657098403013320439,9066377526037536949,2471553870774882535],[15744979205635696068,15535224699887784823,2863367641439193674,1051963488752625421],[16260903739204362633,4434907298175192994,7748872793540472123,1474560493474339261],[2557421121814259039,1276170658836417052,15905780432879675878,1670148696154423404],[6539830904924430390,10000821662787317525,5045096952601183825,414541330394283389],[7202862098673953261,14611287774579408582,11469527774986650064,2829688139227477538],[1881671251261855783,17985754324248793310,4883996459939838184,1122340621446714559],[17154472274846242373,658344718348187976,12355016246972435097,2383171428281064222],[16390568101794740923,9606174735783647687,6414309107988428687,2021201482770891225],[1760089402187244996,17813366477070249344,17621109891630025127,1544843052900276006],[14206527316099028363,3492481270273291832,18391119714438624876,1275046015705614942],[15094767699371277697,9120686552601859276,16465758319924276414,1064384412749691875],[0,0,0,0],[6462927090390312982,12150230156281681221,14123299451418547262,202931824493040806],[1628037619151495075,764124131247586956,1917534445461147386,1784923378427110624],[10164609876305672480,7502048118884020013,9017708133561248047,2322550682132076908],[8332017877241725246,10460943039302057284,8587092857442139069,1546153331919034487],[1347373102724865492,3318591326366659856,17530831872750432238,3389925202349586653],[3408372270502721297,16076921260008871763,5807841952848169403,2693739030719058534],[7286812232241102057,5348893360761593240,5419437401285327140,1052536019425684254],[0,0,0,0]]],"proof":[222,48,66,131,176,138,38,211,203,89,16,18,195,41,110,0,183,154,80,80,104,115,9,208,69,222,86,15,92,175,103,71,240,41,72,157,32,98,53,173,18,18,253,102,147,26,113,65,204,129,110,39,153,220,157,116,69,109,50,43,37,181,125,19,55,106,101,125,11,193,43,146,198,153,59,249,96,119,147,191,55,201,244,42,9,163,125,175,48,255,69,89,3,232,96,4,100,71,24,52,179,56,224,34,12,106,161,14,3,205,51,248,157,89,248,78,25,235,56,235,95,103,196,247,52,248,65,38,108,181,91,149,3,49,122,90,56,122,56,125,44,133,159,199,3,247,56,141,119,75,166,14,113,44,250,11,148,43,206,87,235,235,12,238,175,147,3,97,103,3,229,147,187,108,83,168,125,168,194,72,83,89,160,13,53,232,34,60,94,15,27,105,188,75,129,169,35,24,26,89,229,85,14,35,40,58,114,152,127,93,213,185,173,54,76,67,127,250,121,177,245,176,56,109,88,61,226,68,75,88,140,211,117,3,207,137,149,16,28,225,69,17,216,79,165,94,231,11,19,240,83,0,52,189,129,21,68,246,252,104,76,58,191,149,128,197,132,246,223,53,143,139,168,3,144,132,178,237,85,172,237,126,58,240,101,203,208,92,3,30,118,162,25,238,229,241,60,71,254,238,129,34,52,228,176,66,94,255,220,111,253,4,89,167,234,138,48,100,197,102,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,213,179,124,204,43,142,243,73,191,94,14,191,161,148,14,96,215,156,47,188,116,162,120,115,154,220,117,55,61,57,102,80,139,61,207,220,190,37,197,203,116,176,173,228,177,91,242,108,211,182,194,52,129,173,197,1,66,234,190,208,23,46,68,236,146,108,158,176,139,55,223,66,47,24,167,151,141,216,28,124,111,2,131,13,204,60,126,133,40,174,250,38,227,241,31,192,113,27,50,100,192,36,202,159,161,160,251,224,223,208,47,141,71,197,121,131,150,247,231,10,16,169,141,111,64,61,10,212,191,121,154,43,211,74,224,118,45,249,197,6,43,162,48,247,6,53,143,188,137,196,133,241,172,14,204,15,232,22,32,26,132,134,164,243,183,113,125,85,133,173,250,77,182,32,161,42,162,239,91,180,232,27,213,29,106,148,196,229,1,28,0,215,75,51,29,185,92,146,1,63,50,58,143,92,156,79,14,178,79,210,35,13,84,142,116,209,129,244,193,171,193,231,23,237,8,138,120,43,199,45,220,149,32,200,74,0,218,157,239,230,163,205,212,79,52,242,72,0,113,42,215,251,159,69,34,27,225,28,41,112,162,164,234,181,139,238,47,133,130,56,95,208,238,130,246,57,47,29,129,176,66,50,165,210,2,213,10,182,161,196,165,202,63,244,129,204,222,167,150,155,122,42,254,131,252,7,206,68,79,8,102,128,63,86,154,95,46,62,21,232,226,213,156,182,23,9,105,143,74,122,105,245,164,81,248,51,57,134,136,184,192,187,35,204,235,110,59,169,160,32,24,103,176,3,211,125,191,120,96,167,169,165,155,245,203,39,155,228,132,25,208,49,238,86,84,83,243,64,221,222,54,14,35,252,156,12,49,32,135,164,180,175,90,244,219,31,222,122,100,174,130,65,126,197,25,146,123,79,182,113,221,13,241,93,3,82,96,215,223,8,120,70,66,212,247,143,218,29,185,161,1,51,168,66,72,246,173,179,149,197,27,30,161,10,194,21,0,73,99,236,175,23,248,176,69,201,71,102,173,2,119,112,88,54,118,213,212,193,115,242,89,141,212,26,205,154,20,72,11,213,228,23,255,222,22,172,10,50,28,77,152,219,150,133,189,8,174,61,37,73,23,205,79,231,79,143,7,110,214,51,20,62,133,56,213,31,202,212,105,138,206,161,21,116,245,244,99,245,197,208,58,189,32,254,202,219,89,130,225,47,213,178,21,194,91,244,106,197,133,246,206,76,119,224,158,35,242,131,139,107,136,164,194,35,41,38,126,44,214,168,243,134,78,47,32,170,68,47,6,194,83,7,95,62,228,144,210,175,49,79,50,240,129,192,196,171,38,222,88,114,19,179,191,207,121,120,5,101,106,234,121,89,149,142,152,190,175,166,134,83,101,31,148,165,197,156,58,80,141,33,171,12,234,245,123,212,8,29,23,151,39,80,103,61,66,224,60,30,5,96,224,21,209,133,25,31,215,224,210,57,87,186,73,30,42,216,82,29,56,212,23,118,252,49,187,41,14,20,68,84,181,31,34,250,237,53,113,107,22,220,190,118,28,65,219,69,13,28,119,139,137,167,40,142,241,8,213,47,27,233,169,128,78,101,58,126,164,217,67,22,207,167,207,67,22,182,114,165,57,111,255,34,216,236,38,248,21,158,232,198,38,201,182,255,21,9,229,94,89,43,211,187,87,42,60,233,192,44,126,25,236,103,117,248,156,120,16,29,201,206,59,38,2,184,19,81,163,83,21,254,106,224,194,242,108,240,58,10,125,196,7,153,64,223,181,117,228,139,36,55,119,93,108,49,187,49,9,95,75,160,203,4,208,161,26,115,40,68,58,87,206,141,196,157,193,6,188,77,114,163,29,6,169,117,1,173,115,247,241,120,134,24,100,208,71,48,52,241,150,115,227,174,0,93,90,228,203,215,0,0,240,147,43,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,115,152,232,106,144,227,45,183,145,93,9,2,88,200,205,102,54,36,22,207,144,24,66,170,160,243,92,80,140,180,63,46,233,26,224,247,52,247,5,71,52,68,61,168,118,174,155,191,145,37,124,89,29,71,187,94,139,92,127,1,174,124,102,19,106,179,7,143,133,109,213,13,158,181,160,246,149,44,54,129,237,37,55,127,54,187,40,3,209,56,41,142,173,25,14,18,198,26,154,13,233,35,18,58,116,247,42,112,71,163,25,70,118,224,17,155,144,34,235,172,109,17,205,102,70,232,180,19,195,254,112,185,102,226,92,143,67,170,80,166,16,1,24,65,224,188,200,205,149,165,75,113,99,142,116,215,180,7,115,4,243,148,48,153,183,135,111,77,9,116,70,179,32,250,106,74,252,147,87,143,21,41,243,129,91,229,145,146,232,30,182,10,153,65,167,137,181,106,203,46,243,168,203,95,150,21,6,55,184,196,60,68,87,19,247,152,115,208,101,204,14,97,69,15,58,200,144,99,67,255,198,116,184,74,208,188,161,227,137,249,142,39,232,93,168,44,187,164,139,192,133,148,165,54,80,4,61,75,83,60,252,4,15,36,204,65,174,179,133,159,55,57,126,132,167,46,1,176,32,236,38,35,196,10,145,236,34,18,188,2,172,236,81,14,104,90,240,26,129,47,16,178,224,221,227,121,11,222,21,159,114,23,19,85,111,94,76,208,100,36,64,119,1,138,240,78,107,41,112,100,191,7,102,203,222,146,146,169,74,226,222,77,88,189,53,208,251,169,155,177,146,40,213,253,161,22,81,89,194,216,231,97,110,112,193,217,55,187,65,82,168,96,6,19,44,245,218,137,99,193,0,107,203,45,98,23,24,173,85,122,61,136,135,43,184,120,219,90,51,224,58,70,185,117,150,146,33,88,55,105,211,205,56,50,129,46,57,77,242,122,57,149,67,104,181,110,69,235,165,224,176,119,2,51,254,31,28,89,19,153,135,177,115,22,86,252,27,2,67,88,6,236,132,121,89,42,90,3,149,16,193,52,20,148,90,31,223,37,127,248,194,21,44,156,70,155,229,104,7,37,116,28,128,99,197,90,125,129,140,113,224,242,141,165,129,162,72,209,208,49,2,130,65,194,67,190,109,1,212,183,77,30,111,3,219,59,238,77,98,29,253,232,17,199,70,14,174,197,100,223,171,144,22,91,136,113,62,2,46,242,210,177,165,13,44,174,118,126,38,45,68,204,131,133,219,248,215,12,49,254,204,135,200,222,118,26,12,190,237,207,163,73,236,208,248,26,219,29,193,38,164,240,138,213,133,110,7,4,163,178,143,228,24,82,242,157,224,101,27,130,81,93,41,5,9,166,128,74,16,160,94,184,110,227,119,152,159,165,242,189,111,99,184,31,104,162,186,148,82,1,181,12,17,3,168,98,208,19,78,46]} \ No newline at end of file From 121d4ee9c85f0661d48c294ebab781f72bdd6b54 Mon Sep 17 00:00:00 2001 From: noelwei Date: Wed, 9 Oct 2024 17:29:08 +0900 Subject: [PATCH 2/3] bin test Signed-off-by: noelwei --- integration/tests/bundle_tests.rs | 50 +++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/integration/tests/bundle_tests.rs b/integration/tests/bundle_tests.rs index 7402eecc..51916b70 100644 --- a/integration/tests/bundle_tests.rs +++ b/integration/tests/bundle_tests.rs @@ -38,6 +38,7 @@ fn gen_bundle_proving_task(batch_proof_files: &[&str]) -> BundleProvingTask { BundleProvingTask { batch_proofs } } + #[test] fn test_evm_verifier_from_layer5() { use prover::{ @@ -74,4 +75,53 @@ fn test_evm_verifier_from_layer5() { Some(output_dir.as_str()), ).unwrap(); +} + +#[ignore] +#[test] +fn test_evm_verifier_from_bin() { + use prover::io::read_all; + use revm::{ + primitives::{CreateScheme, ExecutionResult, Output, TransactTo, TxEnv}, + InMemoryDB, EVM, + }; + + let output_dir = init_env_and_log("test_evm_verifer"); + + let bytecode = read_all(&format!("{output_dir}/evm_verifier.bin")); + log::info!("bytecode len {}", bytecode.len()); + + let mut evm = EVM { + env: Default::default(), + db: Some(InMemoryDB::default()), + }; + + // only deployment code + evm.env.tx = TxEnv { + gas_limit: u64::MAX, + transact_to: TransactTo::Create(CreateScheme::Create), + data: bytecode.into(), + ..Default::default() + }; + + let result = evm.transact_commit().unwrap(); + let contract = match result { + ExecutionResult::Success { + output: Output::Create(_, Some(contract)), + .. + } => contract, + ExecutionResult::Revert { gas_used, output } => { + panic!( + "Contract deployment transaction reverts with gas_used {gas_used} and output {:#x}", + output + ) + } + ExecutionResult::Halt { reason, gas_used } => panic!( + "Contract deployment transaction halts unexpectedly with gas_used {gas_used} and reason {:?}", + reason + ), + _ => unreachable!(), + }; + + log::info!("contrace done at {}", contract); } \ No newline at end of file From 11b1b43bf6a3bc7f1b9b47e24d1ea1c79a4c7da4 Mon Sep 17 00:00:00 2001 From: noelwei Date: Wed, 9 Oct 2024 17:29:50 +0900 Subject: [PATCH 3/3] test for issue evm bin Signed-off-by: noelwei --- Cargo.lock | 1 + integration/Cargo.toml | 1 + release-v0.12.0-rc.2/evm_verifier.bin | Bin 0 -> 14050 bytes release-v0.12.0-rc.2/log.txt | 6 ++++++ release-v0.12.0-rc.2/proof.json | 1 + 5 files changed, 9 insertions(+) create mode 100644 release-v0.12.0-rc.2/evm_verifier.bin create mode 100644 release-v0.12.0-rc.2/log.txt create mode 100644 release-v0.12.0-rc.2/proof.json diff --git a/Cargo.lock b/Cargo.lock index 597bb987..160a1255 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2184,6 +2184,7 @@ dependencies = [ name = "integration" version = "0.13.0" dependencies = [ + "aggregator", "anyhow", "ethers-providers", "glob", diff --git a/integration/Cargo.toml b/integration/Cargo.toml index 50b80afa..26ce54e3 100644 --- a/integration/Cargo.toml +++ b/integration/Cargo.toml @@ -20,6 +20,7 @@ tokio.workspace = true revm = { version = "3.5.0", default-features = false, features = ["std"] } snark-verifier = { git = "https://github.com/scroll-tech/snark-verifier", branch = "develop" } snark-verifier-sdk = { git = "https://github.com/scroll-tech/snark-verifier", branch = "develop", default-features = false, features = ["loader_halo2", "loader_evm", "halo2-pse"] } +aggregator = { git = "https://github.com/scroll-tech/zkevm-circuits.git", branch = "v0.13"} halo2_proofs.workspace = true prover.workspace = true diff --git a/release-v0.12.0-rc.2/evm_verifier.bin b/release-v0.12.0-rc.2/evm_verifier.bin new file mode 100644 index 0000000000000000000000000000000000000000..a1937158919f6104a4ebd3156233f4e6c7e62c07 GIT binary patch literal 14050 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