Skip to content

Commit

Permalink
Add base64 example for gate counts
Browse files Browse the repository at this point in the history
  • Loading branch information
jzaki committed Nov 1, 2024
1 parent 9db1477 commit 8e7b198
Show file tree
Hide file tree
Showing 10 changed files with 90 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.vscode
1 change: 1 addition & 0 deletions lib_examples/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
target
4 changes: 4 additions & 0 deletions lib_examples/Nargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[workspace]
members = [
"base64_example",
]
8 changes: 8 additions & 0 deletions lib_examples/base64_example/Nargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[package]
name = "base64_example"
type = "bin"
authors = [""]
compiler_version = ">=0.36.0"

[dependencies]
base64 = {tag = "v0.3.0", git = "https://github.com/noir-lang/noir_base64.git"}
2 changes: 2 additions & 0 deletions lib_examples/base64_example/Prover.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
base64_encoded = ""
input = ""
2 changes: 2 additions & 0 deletions lib_examples/base64_example/Prover_LONG.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
input = "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox."
base64_encoded = "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZywgd2hpbGUgNDIgcmF2ZW5zIHBlcmNoIGF0b3AgYSBydXN0eSBtYWlsYm94Lg=="
2 changes: 2 additions & 0 deletions lib_examples/base64_example/Prover_SHORT.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
input = "The quick br"
base64_encoded = "VGhlIHF1aWNrIGJy"
25 changes: 25 additions & 0 deletions lib_examples/base64_example/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Base64 example use and bb benchmarking

This makes use of [this](https://github.com/noir-lang/noir_base64.git) base64 library (see Nargo.toml for version)

The lib covers several encode/decode tests, whereas this program has some extra code to facilitate benchmarking the gate counts of a proving backend. Comparisons can be made against other proving backends if desired.

## Test setups for gate counts

Assuming you have `nargo` and a compatible proving backend (eg nargo v0.36.0 and barretenberg bb v0.58.0):

- Choose the desired number of encode/decode runs by setting the corresponding `global` variables in src/main.nr
- Choose the input strings via the `comptime global` variables (the lengths are managed automatically at compile time)
- To ensure the test values are expected lengths:
- `nargo test`
- Ensure these test values are in a corresponding Prover toml file eg (`Prover_SHORT.toml`)
- Execute the program referring to the prover toml file for inputs:
- `nargo execute -p Prover_SHORT.toml`
- Note there's an optional param that you can use to specify the name of the witness file generated
- Optional: `nargo execute -p Prover_SHORT.toml base64_example_SHORT.gz`
- If using barretenberg, check the gate count referring to the newly created program:
- `bb gates -b ../target/base64_example.json`
- Note: you can similarly specify a non-default witness file to use with the program
- Optional: `bb gates -b ../target/base64_example.json -w ../target/base64_example_SHORT`
- Repeat this for different runs of encoding and decoding, of different length inputs to collect results
- (Automating this is left as an exercise for the reader ;)
32 changes: 32 additions & 0 deletions lib_examples/base64_example/src/main.nr
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
mod test_inputs;
use base64::{BASE64_ENCODER, BASE64_DECODER};

// Choose number of encode and/or decode runs
pub global ENCODE_RUNS: u32 = 3;
pub global DECODE_RUNS: u32 = 0;

// Choose size, and use corresponding Prover.toml during execution
comptime global TEST_INPUT = test_inputs::TEST_INPUT_SHORT;
comptime global TEST_BASE64_ENCODED = test_inputs::TEST_BASE64_ENCODED_SHORT;

comptime global U: u32 = comptime { TEST_INPUT.as_bytes().len() };
comptime global B: u32 = comptime {
let mut q = U / 3;
let r = U - q * 3;
if (r > 0) { q += 1; }; // round up since encoded base64 gets padded
q * 4
};

fn main(input: str<U>, base64_encoded: str<B>) {
for _ in 0..ENCODE_RUNS {
let _encoded: [u8; B] = BASE64_ENCODER.encode(input.as_bytes());
}
for _ in 0..DECODE_RUNS {
let _decoded: [u8; U] = BASE64_DECODER.decode(base64_encoded.as_bytes());
}
}

#[test]
fn test() {
main(TEST_INPUT, TEST_BASE64_ENCODED);
}
13 changes: 13 additions & 0 deletions lib_examples/base64_example/src/test_inputs.nr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//SHORT
pub comptime global TEST_INPUT_SHORT = "The quick br";
pub comptime global TEST_BASE64_ENCODED_SHORT = "VGhlIHF1aWNrIGJy";

//LONG
pub comptime global TEST_INPUT_LONG =
"The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox.";
pub comptime global TEST_BASE64_ENCODED_LONG = "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZywgd2hpbGUgNDIgcmF2ZW5zIHBlcmNoIGF0b3AgYSBydXN0eSBtYWlsYm94Lg==";

//LONG LONG
// pub comptime global TEST_INPUT_LONG_LONG =
// "The quick brown fox jumps over the lazy dog, while 42 ravens perch atop a rusty mailbox.";
// pub comptime global TEST_BASE64_ENCODED_LONG_LONG = "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZywgd2hpbGUgNDIgcmF2ZW5zIHBlcmNoIGF0b3AgYSBydXN0eSBtYWlsYm94Lg==";

0 comments on commit 8e7b198

Please sign in to comment.