From 13b20d0396aff05b77670298c2d06afc0faf14e2 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Mon, 2 Jun 2025 17:46:43 +0000 Subject: [PATCH 1/3] feat: update noir version being benchmarked to `1.0.0-beta.6` --- PLONK/noir/.dockerignore | 3 +++ PLONK/noir/Dockerfile | 24 +++++++----------- PLONK/noir/hash/sha256/Nargo.toml | 7 ++++-- PLONK/noir/hash/sha256/run.py | 34 +++++++++++++++++++++----- PLONK/noir/hash/sha256/src/main.nr | 6 ++--- PLONK/noir/matmult/Nargo.toml | 6 +++-- PLONK/noir/matmult/out/vk | Bin 0 -> 1764 bytes PLONK/noir/matmult/run.py | 38 +++++++++++++++++++++++------ PLONK/noir/matmult/src/main.nr | 8 +++--- 9 files changed, 85 insertions(+), 41 deletions(-) create mode 100644 PLONK/noir/.dockerignore create mode 100644 PLONK/noir/matmult/out/vk diff --git a/PLONK/noir/.dockerignore b/PLONK/noir/.dockerignore new file mode 100644 index 0000000..5e31262 --- /dev/null +++ b/PLONK/noir/.dockerignore @@ -0,0 +1,3 @@ +hash/sha256/target +hello_world/target +matmult/target diff --git a/PLONK/noir/Dockerfile b/PLONK/noir/Dockerfile index b12c8b0..fa08367 100644 --- a/PLONK/noir/Dockerfile +++ b/PLONK/noir/Dockerfile @@ -1,28 +1,22 @@ -FROM ubuntu:22.04 as base +FROM ubuntu:24.04 AS base RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install \ - -y build-essential cmake git libgmp3-dev libprocps-dev libboost-all-dev libssl-dev libsodium-dev nano wget clang lld libomp-dev curl bash xxd + -y build-essential cmake git nano wget curl bash xxd jq python3 -RUN curl https://sh.rustup.rs -sSf | bash -s -- -y -ENV PATH="/root/.cargo/bin:${PATH}" -RUN git clone https://github.com/noir-lang/noir.git +RUN curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash -WORKDIR noir +ENV PATH="$PATH:/root/.nargo/bin" -RUN git checkout tags/v0.3.2 +RUN noirup -v 1.0.0-beta.6 -RUN cargo install --locked --path=crates/nargo --no-default-features --features plonk_bn254 - -# RUN curl -L https://raw.githubusercontent.com/noir-lang/noirup/main/install | bash - -# RUN cd /root/.nargo/bin/ && rm noirup && wget https://raw.githubusercontent.com/noir-lang/noirup/main/noirup && chmod +x noirup +RUN nargo --version -# ENV PATH="${PATH}:/root/.nargo/bin" +RUN curl -L https://raw.githubusercontent.com/AztecProtocol/aztec-packages/refs/heads/master/barretenberg/bbup/install | bash -# RUN noirup +ENV PATH="$PATH:/root/.bb" -RUN nargo --version +RUN bbup -v 0.87.0 # If you want to avoid downloading fresh Ignite SRS everytime, download it from http://aztec-ignition.s3.amazonaws.com/MAIN%20IGNITION/sealed/transcript00.dat and inject into container. # COPY transcript00.dat /root/noir_cache/ignition/transcript00.dat diff --git a/PLONK/noir/hash/sha256/Nargo.toml b/PLONK/noir/hash/sha256/Nargo.toml index e0b467c..49a79dd 100644 --- a/PLONK/noir/hash/sha256/Nargo.toml +++ b/PLONK/noir/hash/sha256/Nargo.toml @@ -1,5 +1,8 @@ [package] +name = "sha256" +type = "bin" authors = [""] -compiler_version = "0.1" +compiler_version = ">=1.0.0" -[dependencies] \ No newline at end of file +[dependencies] +sha256 = { tag = "v0.1.4", git = "https://github.com/noir-lang/sha256" } diff --git a/PLONK/noir/hash/sha256/run.py b/PLONK/noir/hash/sha256/run.py index b2200a0..ae34e1f 100755 --- a/PLONK/noir/hash/sha256/run.py +++ b/PLONK/noir/hash/sha256/run.py @@ -30,13 +30,26 @@ def echo(*string): def main(): print('Running benchmarks for sha256') + setup_time = 0 proof_time = 0 proof_size = 0 verify_time = 0 + + echo("Running preliminary checks...") + subprocess.check_call(["nargo", "check"]) + echo("Done") + + echo("Compiling circuit...") + subprocess.check_call(["nargo", "compile"]) + echo("Done") + for _ in range(BENCHMARK_ROUNDS): - echo("Running preliminary checks...") - subprocess.check_call(["nargo", "check"]) + echo("Generating vk...") + time_start = time.time() + subprocess.check_call(["bb", "write_vk", "-b", "./target/sha256.json", "-o", "./target"]) + time_duration = time.time() - time_start echo("Done") + setup_time += time_duration echo("Generating Prover.toml file with random circuit inputs...") msg = gen_random_bytes(HASH_INPUT_LEN // 8) @@ -48,26 +61,35 @@ def main(): open(prover_toml_path, "w").write(prover_toml) echo("Done") + echo("Performing witness generation...") + time_start = time.time() + subprocess.check_call(["nargo", "execute"]) + time_duration = time.time() - time_start + echo("Done") + proof_time += time_duration + echo("Generating proof...") time_start = time.time() - subprocess.check_call(["nargo", "prove", "p"]) + subprocess.check_call(["bb", "prove", "-b", "./target/sha256.json", "-w", "./target/sha256.gz", "-o", "./target"]) time_duration = time.time() - time_start echo("Done") proof_time += time_duration - proof_path = get_project_dir() / "proofs" / "p.proof" + proof_path = get_project_dir() / "target" / "proof" proof_size = proof_path.stat().st_size echo("Verifying proof...") time_start = time.time() - subprocess.check_call(["nargo", "verify", "p"]) + subprocess.check_call(["bb", "verify", "-k", "./target/vk", "-p", "./target/proof", "-i", "./target/public_inputs"]) time_duration = time.time() - time_start echo("Done") verify_time += time_duration + avg_setup_time = (setup_time * 10**6) / BENCHMARK_ROUNDS avg_proof_time = (proof_time * 10**6) / BENCHMARK_ROUNDS avg_verify_time = (verify_time * 10**6) / BENCHMARK_ROUNDS - echo(f"(Setup +) Proof time: {avg_proof_time:.0f} us") + echo(f"Setup time: {avg_setup_time:.0f} us") + echo(f"Proof time: {avg_proof_time:.0f} us") echo(f"Proof size: {proof_size} B") echo(f"Verify time: {avg_verify_time:.0f} us") diff --git a/PLONK/noir/hash/sha256/src/main.nr b/PLONK/noir/hash/sha256/src/main.nr index 49a1417..229254d 100644 --- a/PLONK/noir/hash/sha256/src/main.nr +++ b/PLONK/noir/hash/sha256/src/main.nr @@ -1,6 +1,4 @@ -use dep::std; - fn main(msg: [u8; 64], known_hash: pub [u8; 32]) { - let calc_hash = std::hash::sha256(msg); - constrain calc_hash == known_hash; + let calc_hash = sha256::digest(msg); + assert_eq(calc_hash, known_hash); } diff --git a/PLONK/noir/matmult/Nargo.toml b/PLONK/noir/matmult/Nargo.toml index e0b467c..1c23aff 100644 --- a/PLONK/noir/matmult/Nargo.toml +++ b/PLONK/noir/matmult/Nargo.toml @@ -1,5 +1,7 @@ [package] +name = "matmult" +type = "bin" authors = [""] -compiler_version = "0.1" +compiler_version = ">=1.0.0" -[dependencies] \ No newline at end of file +[dependencies] diff --git a/PLONK/noir/matmult/out/vk b/PLONK/noir/matmult/out/vk new file mode 100644 index 0000000000000000000000000000000000000000..6ef70bac52171d248df8b15967376073bcf14687 GIT binary patch literal 1764 zcmZ{lXFMB<0>xwR#xAKyiJcg+YSq?g6I<+{MvbBrm$*u=*`kzdlo~}zN{w4Js$z?a z)}FDiTD`PJXr&VG-uLeB_rAP$KAiuDbAIRR0Ra9I!{7FA@%{(Q|M2gG834{$NqdnQ z3{LFy*;H>DlsY;Z_gA$KR}D=nP?;6R$x4qTpk`B#E5b%@BUW-B&Pt@%LCpwr5}o_( zD}y{gJ4>$5#O(YWWW+|jrfND-TU8lFx|K53_SYg3h40U!%8|8vxH?IP;>Nw-jaqA5 z8tHdet08f^wu_3<$^hRiF`lFEhZ+WYlWjny?b@Y4-Asz-Pmv0B&I zcHE&}aX^^8d|!y%=ud;9HAhD%eRC{Fs^*O>iO3Ddz5VFxJW~3Ea1nOmV|`XrerxZM zjQe~?B|y?cQJ~+!+6D*2+VT^5l3l(l%xpPAqGw)vC}r$j_kL2Ugcvck|GmI=^BQ-O zOTzS$Gxs`IULB8TM0#&r>K&$b7HP=`(fpP137=Y(dmpUs6$YwTT<-c9w0&U#GN%e` zv6y`N4K~Q$R0w5L=)030Oy+5jOum=9!oPI?F$HgyEu2j5k0s*qa>w6*`@R86!@r&k zw7Vy`FZ>`UZ{5HQ%AQdOR*C~d${Z@#B<+^ZrggEOBM{LN(Lq!0V8-WTpkeadPs(w9 zQ51+)=J8j{mbMu)Fh6UI*B{|SykoULARCqVU>VHCaAxm#*o_dkQTd7_4BqKv0h`vk z{0XKmUa^6^k9A=Z7JOoYt_ieLHPA&0KZg7wdx5)FT~;gw>j)M$8U!`vB|6pjcvY#B zr6z3ZfbJ1w8uh#(*EUDC1MNI|#qY<$4JdB*ty7OHlDAv^?KWdbVEdMiFdhl7_amDI zzZZWcpzV0GsmYI%RwTPEUhKoQ&{f}^zW@`)CwwC(3rUh<0MK+WXmR< z66%So{{Z=g_vP198<3U{EuXkeQ^IG3wEJfI1(l()8n>+!wq%qPe@B&%Im1=2B2XWj zURd!}4BQkQq^C&gR~6yXoG$^1J%~R2vF6`BybcV@(C&Qh87?jun-|0>w>0a4EfJxd zg8EPi`dJP%r>fLwax-m0#ee$r%1#(HUJu?Y35+O#yuHhl8aEDYg{$n?emVE5mU*8R zb4E4M23s?POHVVvod)D=W(mp-4Qem%qE5708E~(^XrKzl?wyN^DAkZ~dupS(K+lUd zszI4XGisRkHP28#&Tp+WJo0H5PvX`12HgD)nQyj=YT5HP>Y}^tP6%JvRo(zr@<;c6JjK2c_tv_3G9`zhP-0QfI2k^Thn~m zlgRQ!fiPP8RPYS|nhDwP)C#RsIhEI$_?BhVL50VTdJHWP_~>8O0wSg4QSe^Vq6zYw zUh^RSH+0K<#gY$vBZsBvvVG~Dvkpyw7UbQ`Q9~FFK={=|;ep;JGs{Ik*0*KokMcz| z5oY3bS$L^Ia{w@uG$QQ(S*}Gh2_0-|pQ3Zyhcy6+OgHk*hcxP%mq#wmMz+F<%f$#L zM(0DLyjx0iP3;{4%3)5BczacA;gV4l>AYv+w8MWxnrnXs#8s4|eHaGWnR`f5;YQAZ zL>s)4U$*8b&duVpWW(srevCNVOlueb5HK@sxH{y>MX76R!` zuTvLSDR^%Lvz=J7clMW-XF|&IujJey0#S>piHAJkZq`78|1Rs&XI|3B-)hR9PxALo~o02RCI!lAQ<|3h0~^jJd=qC0I7W>;=s% z`LS3nI#Lcc-XFj0QNb1u;k0MM7XI@s{}2Ctpa0!plzvn!mq53`rgI#-`Tq&`uBm4@ xpN-^v0QA=>anPMtyHXyOD!23w$##trc+la6#Q1!;-T*&Ezuw*Sl%5=P`xk7zCiegU literal 0 HcmV?d00001 diff --git a/PLONK/noir/matmult/run.py b/PLONK/noir/matmult/run.py index 6dd66ad..d3f77c9 100755 --- a/PLONK/noir/matmult/run.py +++ b/PLONK/noir/matmult/run.py @@ -29,40 +29,62 @@ def echo(*string): def main(): print('Running benchmarks for matmult') + setup_time = 0 proof_time = 0 proof_size = 0 verify_time = 0 - for _ in range(BENCHMARK_ROUNDS): - echo("Running preliminary checks...") - subprocess.check_call(["nargo", "check"]) - echo("Done") + echo("Running preliminary checks...") + subprocess.check_call(["nargo", "check"]) + echo("Done") + + echo("Compiling circuit...") + subprocess.check_call(["nargo", "compile"]) + echo("Done") + + for _ in range(BENCHMARK_ROUNDS): # echo("Generating Prover.toml file with random circuit inputs...") # prover_toml = f"a = {array_a}\nb = {array_b}\nc = {array_c}\n" # prover_toml_path = get_project_dir() / "Prover.toml" # open(prover_toml_path, "w").write(prover_toml) # echo("Done") + echo("Generating vk...") + time_start = time.time() + subprocess.check_call(["bb", "write_vk", "-b", "./target/matmult.json", "-o", "./target"]) + time_duration = time.time() - time_start + echo("Done") + setup_time += time_duration + + echo("Performing witness generation...") + time_start = time.time() + subprocess.check_call(["nargo", "execute"]) + time_duration = time.time() - time_start + echo("Done") + proof_time += time_duration + echo("Generating proof...") time_start = time.time() - subprocess.check_call(["nargo", "prove", "p"]) + subprocess.check_call(["bb", "prove", "-b", "./target/matmult.json", "-w", "./target/matmult.gz", "-o", "./target"]) time_duration = time.time() - time_start echo("Done") proof_time += time_duration - proof_path = get_project_dir() / "proofs" / "p.proof" + proof_path = get_project_dir() / "target" / "proof" proof_size = proof_path.stat().st_size echo("Verifying proof...") time_start = time.time() - subprocess.check_call(["nargo", "verify", "p"]) + subprocess.check_call(["bb", "verify", "-k", "./target/vk", "-p", "./target/proof", "-i", "./target/public_inputs"]) time_duration = time.time() - time_start echo("Done") verify_time += time_duration + avg_setup_time = (setup_time * 10**6) / BENCHMARK_ROUNDS avg_proof_time = (proof_time * 10**6) / BENCHMARK_ROUNDS avg_verify_time = (verify_time * 10**6) / BENCHMARK_ROUNDS - echo(f"(Setup +) Proof time: {avg_proof_time:.0f} us") + echo(f"Setup time: {avg_setup_time:.0f} us") + echo(f"Proof time: {avg_proof_time:.0f} us") echo(f"Proof size: {proof_size} B") echo(f"Verify time: {avg_verify_time:.0f} us") diff --git a/PLONK/noir/matmult/src/main.nr b/PLONK/noir/matmult/src/main.nr index bba5f74..60d7f29 100644 --- a/PLONK/noir/matmult/src/main.nr +++ b/PLONK/noir/matmult/src/main.nr @@ -1,14 +1,14 @@ -fn main(a : [Field; 1024], b : [Field; 1024], c : pub [Field; 1024]) { +fn main(a: [Field; 1024], b: [Field; 1024], c: pub [Field; 1024]) { let mut temp_field = [0; 1024]; for i in 0..32 { for j in 0..32 { for k in 0..32 { - temp_field[i*32 + j] += temp_field[i*32 + j] + a[i * 32 + k] * b[k * 32 + j]; + temp_field[i * 32 + j] += temp_field[i * 32 + j] + a[i * 32 + k] * b[k * 32 + j]; } } } for i in 0..1024 { - constrain c[i] == temp_field[i]; + assert_eq(c[i], temp_field[i]); } -} \ No newline at end of file +} From 93786b2e9fbb59be51f2c793fbee5e72ac8434b3 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:00:03 +0000 Subject: [PATCH 2/3] chore: include public inputs as part of the proof size --- PLONK/noir/hash/sha256/run.py | 3 ++- PLONK/noir/matmult/run.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/PLONK/noir/hash/sha256/run.py b/PLONK/noir/hash/sha256/run.py index ae34e1f..2148fbb 100755 --- a/PLONK/noir/hash/sha256/run.py +++ b/PLONK/noir/hash/sha256/run.py @@ -76,7 +76,8 @@ def main(): proof_time += time_duration proof_path = get_project_dir() / "target" / "proof" - proof_size = proof_path.stat().st_size + public_inputs_path = get_project_dir() / "target" / "public_inputs" + proof_size = proof_path.stat().st_size + public_inputs_path.stat().st_size echo("Verifying proof...") time_start = time.time() diff --git a/PLONK/noir/matmult/run.py b/PLONK/noir/matmult/run.py index d3f77c9..6db6d91 100755 --- a/PLONK/noir/matmult/run.py +++ b/PLONK/noir/matmult/run.py @@ -72,6 +72,8 @@ def main(): proof_path = get_project_dir() / "target" / "proof" proof_size = proof_path.stat().st_size + public_inputs_path = get_project_dir() / "target" / "public_inputs" + proof_size = proof_path.stat().st_size + public_inputs_path.stat().st_size echo("Verifying proof...") time_start = time.time() From 888347a8dc0b508e82ad142e7d3f90e710d52b79 Mon Sep 17 00:00:00 2001 From: Tom French <15848336+TomAFrench@users.noreply.github.com> Date: Mon, 2 Jun 2025 22:44:13 +0000 Subject: [PATCH 3/3] remove redundant code --- PLONK/noir/matmult/run.py | 1 - 1 file changed, 1 deletion(-) diff --git a/PLONK/noir/matmult/run.py b/PLONK/noir/matmult/run.py index 6db6d91..6630e4f 100755 --- a/PLONK/noir/matmult/run.py +++ b/PLONK/noir/matmult/run.py @@ -71,7 +71,6 @@ def main(): proof_time += time_duration proof_path = get_project_dir() / "target" / "proof" - proof_size = proof_path.stat().st_size public_inputs_path = get_project_dir() / "target" / "public_inputs" proof_size = proof_path.stat().st_size + public_inputs_path.stat().st_size