diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 752af4a..b717c10 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,14 +14,11 @@ on: name: General jobs: - build: - strategy: - matrix: - platform: [ ubuntu-latest, macos-latest ] - runs-on: ${{ matrix.platform }} + build-ubuntu-latest: + runs-on: ubuntu-latest timeout-minutes: 60 - name: build - ${{ matrix.platform }} + name: build - ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install stable toolchain @@ -30,16 +27,10 @@ jobs: profile: minimal toolchain: nightly override: true - - name: install risc0 + - name: build - ubuntu-latest if: success() || failure() - run: | - curl -L https://risczero.com/install | bash - - name: install risc0 step 2 - if: success() || failure() - run: | - source /home/runner/.bashrc && rzup install && source /home/runner/.bashrc - - uses: Swatinem/rust-cache@v2 - - run: cargo build + run: chmod 777 ./ci_scripts/build-ubuntu.sh && ./ci_scripts/build-ubuntu.sh + lint: strategy: @@ -59,30 +50,11 @@ jobs: toolchain: nightly override: true components: rustfmt, clippy - - uses: Swatinem/rust-cache@v2 - - name: cargo fmt + - name: lint - ubuntu-latest if: success() || failure() - run: cargo fmt -- --check - - name: cargo clippy - if: success() || failure() - run: | - cargo clippy --release -- -D warnings - - name: install risc0 - if: success() || failure() - run: | - curl -L https://risczero.com/install | bash - - name: install risc0 step 2 - if: success() || failure() - run: | - source /home/runner/.bashrc && rzup install && source /home/runner/.bashrc - - name: install taplo - if: success() || failure() - run: | - cargo install taplo-cli --locked - - name: taplo fmt - if: success() || failure() - run: | - taplo fmt --check + run: chmod 777 ./ci_scripts/lint-ubuntu.sh && ./ci_scripts/lint-ubuntu.sh + + test: strategy: matrix: @@ -100,21 +72,6 @@ jobs: profile: minimal toolchain: nightly override: true - - uses: Swatinem/rust-cache@v2 - - name: install risc0 + - name: test ubuntu-latest if: success() || failure() - run: | - curl -L https://risczero.com/install | bash - - name: install risc0 step 2 - if: success() || failure() - run: | - source /home/runner/.bashrc && rzup install && source /home/runner/.bashrc - - name: test mempool - if: success() || failure() - run: cargo test -p mempool - - name: test storage - if: success() || failure() - run: cargo test -p storage - - name: test zkvm - if: success() || failure() - run: cargo test -p zkvm + run: chmod 777 ./ci_scripts/test-ubuntu.sh && ./ci_scripts/test-ubuntu.sh diff --git a/ci_scripts/build-macos.sh b/ci_scripts/build-macos.sh new file mode 100644 index 0000000..e3332f6 --- /dev/null +++ b/ci_scripts/build-macos.sh @@ -0,0 +1,4 @@ +set -e +curl -L https://risczero.com/install | bash +/Users/runner/.risc0/bin/rzup install +cargo build \ No newline at end of file diff --git a/ci_scripts/build-ubuntu.sh b/ci_scripts/build-ubuntu.sh new file mode 100644 index 0000000..bf71a72 --- /dev/null +++ b/ci_scripts/build-ubuntu.sh @@ -0,0 +1,4 @@ +set -e +curl -L https://risczero.com/install | bash +/home/runner/.risc0/bin/rzup install +cargo build \ No newline at end of file diff --git a/ci_scripts/lint-ubuntu.sh b/ci_scripts/lint-ubuntu.sh new file mode 100644 index 0000000..6f71b24 --- /dev/null +++ b/ci_scripts/lint-ubuntu.sh @@ -0,0 +1,8 @@ +set -e + +curl -L https://risczero.com/install | bash +/home/runner/.risc0/bin/rzup install +cargo install taplo-cli --locked + +cargo fmt -- --check +taplo fmt --check \ No newline at end of file diff --git a/ci_scripts/test-ubuntu.sh b/ci_scripts/test-ubuntu.sh new file mode 100644 index 0000000..53fc7bc --- /dev/null +++ b/ci_scripts/test-ubuntu.sh @@ -0,0 +1,6 @@ +set -e + +curl -L https://risczero.com/install | bash +/home/runner/.risc0/bin/rzup install + +cargo test --release \ No newline at end of file diff --git a/zkvm/src/lib.rs b/zkvm/src/lib.rs index 175d77c..14841d3 100644 --- a/zkvm/src/lib.rs +++ b/zkvm/src/lib.rs @@ -1,4 +1,4 @@ -use risc0_zkvm::{default_prover, sha::Digest, ExecutorEnv, Receipt}; +use risc0_zkvm::{default_executor, default_prover, sha::Digest, ExecutorEnv, Receipt}; pub fn prove(input_vec: Vec, elf: &[u8]) -> (u64, Receipt) { let mut builder = ExecutorEnv::builder(); @@ -17,6 +17,28 @@ pub fn prove(input_vec: Vec, elf: &[u8]) -> (u64, R (digest, receipt) } +// This only executes the program and does not generate a receipt. +pub fn execute serde::Deserialize<'de>>( + input_vec: Vec, + elf: &[u8], +) -> T { + let mut builder = ExecutorEnv::builder(); + + for input in input_vec { + builder.write(&input).unwrap(); + } + + let env = builder.build().unwrap(); + + let exec = default_executor(); + let session = exec.execute(env, elf).unwrap(); + + // We read the result committed to the journal by the guest code. + let result: T = session.journal.decode().unwrap(); + + result +} + pub fn verify(receipt: Receipt, image_id: impl Into) { receipt .verify(image_id) @@ -26,11 +48,12 @@ pub fn verify(receipt: Receipt, image_id: impl Into) { #[cfg(test)] mod tests { use super::*; + use test_methods::{BIG_CALCULATION_ELF, BIG_CALCULATION_ID}; use test_methods::{MULTIPLICATION_ELF, MULTIPLICATION_ID}; use test_methods::{SUMMATION_ELF, SUMMATION_ID}; #[test] - fn simple_sum() { + fn prove_simple_sum() { let message = 1; let message_2 = 2; @@ -41,7 +64,7 @@ mod tests { } #[test] - fn bigger_sum() { + fn prove_bigger_sum() { let message = 123476; let message_2 = 2342384; @@ -52,7 +75,7 @@ mod tests { } #[test] - fn simple_multiplication() { + fn prove_simple_multiplication() { let message = 1; let message_2 = 2; @@ -63,7 +86,7 @@ mod tests { } #[test] - fn bigger_multiplication() { + fn prove_bigger_multiplication() { let message = 3498; let message_2 = 438563; @@ -72,4 +95,50 @@ mod tests { verify(receipt, MULTIPLICATION_ID); assert_eq!(digest, message * message_2); } + + #[test] + fn execute_simple_sum() { + let message: u64 = 1; + let message_2: u64 = 2; + + let result = execute(vec![message, message_2], SUMMATION_ELF); + assert_eq!(result, message + message_2); + } + + #[test] + fn execute_bigger_sum() { + let message: u64 = 123476; + let message_2: u64 = 2342384; + + let result = execute(vec![message, message_2], SUMMATION_ELF); + assert_eq!(result, message + message_2); + } + + #[test] + fn execute_big_calculation() { + let message: u128 = 1; + let message_2: u128 = 2; + + let result = execute(vec![message, message_2], BIG_CALCULATION_ELF); + assert_eq!(result, big_calculation(message, message_2)); + } + + #[test] + fn execute_big_calculation_long() { + let message: u128 = 20; + let message_2: u128 = 10; + + let result = execute(vec![message, message_2], BIG_CALCULATION_ELF); + assert_eq!(result, big_calculation(message, message_2)); + } + + fn big_calculation(lhs: u128, rhs: u128) -> u128 { + let mut res = 1_u128; + for _ in 0..lhs { + res *= rhs; + res += lhs; + } + + res + } } diff --git a/zkvm/test_methods/guest/src/bin/big_calculation.rs b/zkvm/test_methods/guest/src/bin/big_calculation.rs new file mode 100644 index 0000000..b546857 --- /dev/null +++ b/zkvm/test_methods/guest/src/bin/big_calculation.rs @@ -0,0 +1,14 @@ +use risc0_zkvm::{ + guest::env, +}; + +fn main() { + let lhs: u128 = env::read(); + let rhs: u128 = env::read(); + let mut res = 1; + for i in 0..lhs { + res *= rhs; + res += lhs; + } + env::commit(&(res)); +}