Merge pull request #22 from vacp2p/zkvm_add

Zkvm Execute fucntionality
This commit is contained in:
tyshko-rostyslav 2024-11-26 00:50:07 -05:00 committed by GitHub
commit a7c5f01e2c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 122 additions and 60 deletions

View File

@ -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

View File

@ -0,0 +1,4 @@
set -e
curl -L https://risczero.com/install | bash
/Users/runner/.risc0/bin/rzup install
cargo build

View File

@ -0,0 +1,4 @@
set -e
curl -L https://risczero.com/install | bash
/home/runner/.risc0/bin/rzup install
cargo build

View File

@ -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

View File

@ -0,0 +1,6 @@
set -e
curl -L https://risczero.com/install | bash
/home/runner/.risc0/bin/rzup install
cargo test --release

View File

@ -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<T: serde::ser::Serialize>(input_vec: Vec<T>, elf: &[u8]) -> (u64, Receipt) {
let mut builder = ExecutorEnv::builder();
@ -17,6 +17,28 @@ pub fn prove<T: serde::ser::Serialize>(input_vec: Vec<T>, elf: &[u8]) -> (u64, R
(digest, receipt)
}
// This only executes the program and does not generate a receipt.
pub fn execute<T: serde::ser::Serialize + for<'de> serde::Deserialize<'de>>(
input_vec: Vec<T>,
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<Digest>) {
receipt
.verify(image_id)
@ -26,11 +48,12 @@ pub fn verify(receipt: Receipt, image_id: impl Into<Digest>) {
#[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
}
}

View File

@ -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));
}