From f6211b5dc52969d616b9e26a3d4d1a3f3fc347d1 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Tue, 4 Jun 2019 18:07:36 +0200 Subject: [PATCH 01/10] Add simple script that uses bellman --- Makefile | 2 + scripts/zk/.cargo/config | 2 + scripts/zk/Cargo.toml | 24 +++++++++ scripts/zk/chisel.toml | 6 +++ scripts/zk/src/lib.rs | 104 +++++++++++++++++++++++++++++++++++++++ zk.yaml | 12 +++++ 6 files changed, 150 insertions(+) create mode 100644 scripts/zk/.cargo/config create mode 100644 scripts/zk/Cargo.toml create mode 100644 scripts/zk/chisel.toml create mode 100644 scripts/zk/src/lib.rs create mode 100644 zk.yaml diff --git a/Makefile b/Makefile index a9c89e8..82efdbf 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,10 @@ all: build test build: cd scripts/helloworld && cargo build --release && chisel run --config chisel.toml cd scripts/bazaar && cargo build --release && chisel run --config chisel.toml + cd scripts/zk && cargo build --release && chisel run --config chisel.toml cargo build --release test: target/release/phase2-scout target/release/phase2-scout bazaar.yaml + target/release/phase2-scout zk.yaml diff --git a/scripts/zk/.cargo/config b/scripts/zk/.cargo/config new file mode 100644 index 0000000..435ed75 --- /dev/null +++ b/scripts/zk/.cargo/config @@ -0,0 +1,2 @@ +[build] +target = "wasm32-unknown-unknown" \ No newline at end of file diff --git a/scripts/zk/Cargo.toml b/scripts/zk/Cargo.toml new file mode 100644 index 0000000..b5cb181 --- /dev/null +++ b/scripts/zk/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "phase2-zk" +version = "0.0.0" +license = "Apache-2.0" +repository = "https://github.com/ewasm/scout" +description = "Eth 2.0 Phase 2 execution script: zk" +publish = false +edition = "2018" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +bellman = "0.1" + +[dependencies.pairing] +version = "0.14" +features = ["u128-support"] + +[dependencies.ewasm_api] +git = "https://github.com/ewasm/ewasm-rust-api" +rev = "1c01982" +default-features = false +features = ["std", "eth2", "wee_alloc"] diff --git a/scripts/zk/chisel.toml b/scripts/zk/chisel.toml new file mode 100644 index 0000000..75f2aad --- /dev/null +++ b/scripts/zk/chisel.toml @@ -0,0 +1,6 @@ +zk: + file: "target/wasm32-unknown-unknown/release/phase2_zk.wasm" + trimexports: + preset: "ewasm" + verifyexports: + preset: "ewasm" diff --git a/scripts/zk/src/lib.rs b/scripts/zk/src/lib.rs new file mode 100644 index 0000000..652f6d2 --- /dev/null +++ b/scripts/zk/src/lib.rs @@ -0,0 +1,104 @@ +//! Verifies proof and modifies state root. +//! Used the https://github.com/ebfull/bellman-demo example +//! to generate proof for a dummy circuit. + +extern crate bellman; +extern crate ewasm_api; +extern crate pairing; +use bellman::groth16::{prepare_verifying_key, verify_proof, Proof, VerifyingKey}; +use ewasm_api::*; +use pairing::bls12_381::{Bls12, Fr}; +use pairing::Field; + +const VERIFYING_KEY: [u8; 1060] = [ + 24, 41, 202, 68, 46, 46, 1, 49, 196, 124, 167, 254, 34, 42, 79, 231, 184, 11, 52, 73, 157, 140, + 195, 63, 62, 141, 52, 70, 46, 157, 227, 21, 10, 99, 119, 91, 102, 55, 147, 213, 244, 224, 21, + 15, 159, 74, 31, 225, 1, 197, 163, 112, 61, 188, 44, 55, 183, 203, 141, 192, 44, 196, 232, 112, + 125, 0, 140, 198, 55, 189, 50, 148, 168, 117, 84, 43, 12, 130, 9, 71, 17, 58, 45, 116, 81, 51, + 83, 57, 9, 144, 44, 85, 117, 146, 204, 75, 11, 211, 69, 113, 14, 53, 33, 1, 8, 197, 248, 93, + 31, 158, 189, 44, 20, 209, 149, 71, 246, 83, 163, 180, 215, 63, 160, 6, 231, 85, 44, 209, 24, + 60, 68, 98, 28, 232, 202, 138, 146, 239, 209, 39, 175, 82, 225, 81, 22, 126, 237, 42, 61, 232, + 134, 21, 220, 129, 172, 104, 80, 11, 115, 99, 49, 8, 63, 57, 4, 69, 167, 226, 96, 8, 143, 176, + 245, 173, 13, 46, 88, 59, 228, 169, 152, 241, 221, 188, 73, 67, 197, 219, 233, 148, 171, 229, + 19, 254, 53, 61, 162, 133, 229, 89, 232, 162, 178, 1, 51, 197, 169, 223, 49, 81, 134, 202, 1, + 231, 209, 11, 125, 19, 172, 127, 61, 190, 221, 152, 50, 132, 243, 144, 187, 12, 87, 254, 57, + 184, 16, 170, 49, 173, 156, 146, 15, 55, 49, 205, 163, 18, 130, 186, 143, 65, 131, 239, 210, + 186, 196, 173, 45, 151, 253, 20, 116, 13, 60, 13, 211, 52, 47, 5, 11, 210, 21, 34, 25, 26, 21, + 239, 167, 139, 15, 227, 152, 145, 158, 201, 94, 195, 30, 198, 12, 40, 152, 252, 65, 161, 100, + 62, 190, 245, 168, 64, 25, 218, 12, 10, 129, 244, 246, 199, 91, 21, 253, 251, 204, 154, 153, + 86, 102, 213, 54, 210, 137, 116, 193, 244, 129, 62, 207, 165, 31, 23, 112, 29, 112, 181, 98, + 171, 18, 117, 237, 165, 171, 55, 177, 120, 151, 113, 104, 95, 90, 42, 158, 215, 81, 24, 170, + 70, 84, 231, 122, 216, 107, 70, 126, 150, 247, 99, 183, 220, 76, 227, 171, 219, 65, 148, 102, + 164, 178, 7, 168, 202, 228, 117, 216, 80, 4, 50, 198, 183, 233, 136, 79, 146, 15, 93, 18, 24, + 253, 216, 109, 52, 107, 202, 76, 182, 230, 195, 242, 255, 235, 235, 29, 200, 211, 47, 124, 75, + 55, 1, 227, 56, 61, 197, 63, 128, 7, 93, 141, 94, 43, 237, 147, 5, 3, 154, 41, 215, 218, 22, + 146, 141, 221, 216, 172, 30, 36, 122, 172, 5, 215, 42, 129, 163, 236, 226, 39, 243, 212, 98, + 55, 94, 243, 140, 44, 28, 193, 233, 123, 112, 225, 145, 35, 208, 212, 171, 198, 18, 50, 146, + 179, 183, 22, 202, 219, 149, 235, 16, 197, 198, 248, 249, 0, 188, 156, 159, 109, 171, 54, 244, + 169, 83, 78, 200, 107, 15, 23, 137, 192, 44, 134, 177, 39, 90, 119, 83, 216, 14, 227, 218, 137, + 30, 243, 153, 69, 86, 244, 186, 233, 93, 20, 29, 131, 219, 142, 46, 183, 195, 59, 74, 52, 57, + 109, 59, 118, 58, 119, 54, 201, 29, 101, 213, 163, 56, 113, 144, 187, 30, 246, 130, 180, 45, + 239, 12, 220, 136, 122, 159, 49, 200, 199, 51, 60, 74, 178, 169, 236, 42, 6, 18, 208, 159, 3, + 218, 184, 173, 162, 42, 100, 132, 98, 99, 7, 69, 11, 33, 31, 228, 53, 85, 84, 152, 75, 210, + 141, 198, 176, 87, 211, 121, 237, 38, 58, 106, 210, 152, 100, 206, 35, 109, 177, 8, 127, 177, + 128, 68, 10, 167, 164, 124, 194, 253, 180, 15, 227, 166, 0, 70, 101, 199, 48, 77, 75, 74, 24, + 255, 255, 163, 9, 21, 3, 34, 243, 123, 154, 152, 225, 252, 55, 240, 85, 245, 20, 243, 251, 26, + 30, 19, 24, 109, 100, 59, 238, 169, 10, 218, 206, 83, 1, 199, 98, 183, 166, 235, 155, 97, 208, + 247, 130, 35, 128, 228, 193, 236, 4, 28, 120, 248, 38, 204, 10, 57, 52, 174, 103, 50, 44, 214, + 33, 114, 147, 207, 237, 165, 181, 88, 154, 92, 162, 39, 230, 237, 16, 124, 200, 72, 188, 25, + 80, 84, 139, 20, 7, 157, 46, 31, 222, 106, 182, 30, 40, 252, 112, 71, 184, 184, 223, 25, 66, + 143, 197, 168, 237, 70, 46, 77, 244, 113, 136, 116, 99, 251, 121, 113, 99, 58, 23, 163, 47, 33, + 1, 60, 69, 159, 81, 226, 85, 42, 194, 35, 252, 236, 185, 245, 77, 204, 245, 218, 130, 15, 241, + 32, 255, 55, 56, 117, 134, 64, 119, 222, 180, 105, 109, 229, 116, 231, 110, 190, 221, 128, 182, + 121, 74, 143, 208, 165, 157, 84, 5, 213, 241, 11, 81, 187, 19, 112, 116, 88, 43, 22, 127, 201, + 64, 127, 121, 31, 55, 170, 152, 77, 182, 2, 198, 165, 122, 197, 143, 192, 192, 142, 91, 214, + 46, 228, 166, 177, 205, 228, 110, 149, 17, 166, 131, 150, 182, 186, 0, 0, 0, 2, 1, 19, 250, + 235, 146, 16, 108, 175, 122, 162, 30, 154, 204, 230, 98, 135, 125, 166, 201, 118, 232, 56, 37, + 172, 71, 137, 44, 154, 84, 10, 69, 176, 98, 103, 2, 249, 138, 32, 111, 58, 191, 184, 207, 203, + 79, 168, 228, 147, 8, 146, 93, 45, 19, 193, 51, 219, 8, 191, 145, 62, 118, 140, 224, 20, 41, + 151, 19, 72, 187, 171, 97, 31, 217, 161, 177, 211, 79, 213, 142, 112, 94, 135, 106, 236, 125, + 79, 150, 128, 241, 10, 26, 97, 83, 95, 168, 188, 4, 137, 149, 173, 37, 72, 216, 178, 97, 144, + 3, 163, 21, 6, 217, 239, 67, 15, 132, 57, 71, 196, 17, 12, 66, 126, 42, 13, 20, 38, 154, 11, + 125, 233, 229, 199, 207, 61, 162, 211, 153, 136, 252, 153, 25, 51, 137, 69, 11, 204, 32, 52, + 159, 83, 3, 101, 158, 144, 80, 29, 171, 219, 209, 164, 163, 20, 76, 77, 60, 21, 227, 168, 186, + 110, 30, 90, 180, 212, 118, 88, 210, 178, 210, 235, 35, 82, 192, 147, 54, 170, 18, 205, 79, + 187, 28, 118, +]; + +#[cfg(not(test))] +#[no_mangle] +pub extern "C" fn main() { + let pre_state_root = eth2::load_pre_state_root(); + let mut post_state_root = pre_state_root; + + /*let serialized_proof = vec![ + 177, 24, 52, 73, 107, 0, 66, 81, 89, 20, 180, 163, 242, 151, 148, 148, 111, 235, 109, 218, + 233, 75, 118, 147, 25, 124, 168, 94, 182, 49, 106, 232, 241, 255, 68, 180, 48, 94, 149, 15, + 171, 3, 78, 184, 73, 151, 215, 108, 131, 65, 224, 172, 120, 171, 234, 145, 230, 50, 84, 55, + 152, 130, 208, 138, 218, 54, 48, 170, 201, 224, 118, 17, 86, 235, 140, 155, 71, 232, 30, + 118, 155, 51, 26, 243, 167, 90, 204, 147, 228, 47, 10, 14, 246, 31, 220, 0, 4, 91, 47, 163, + 27, 231, 57, 23, 241, 54, 229, 184, 164, 214, 108, 252, 209, 141, 249, 9, 43, 176, 74, 146, + 237, 7, 135, 28, 108, 105, 230, 112, 182, 99, 31, 220, 116, 137, 154, 159, 43, 13, 255, 97, + 146, 84, 147, 162, 179, 208, 168, 82, 179, 169, 178, 10, 55, 116, 212, 212, 21, 246, 160, + 237, 178, 120, 59, 229, 177, 196, 24, 28, 8, 255, 25, 36, 94, 159, 145, 118, 26, 98, 202, + 249, 153, 55, 37, 213, 83, 100, 47, 139, 233, 220, 216, 68, + ];*/ + + assert!(eth2::block_data_size() > 0); + + // Block data only contains serialized proof + let block_data = eth2::acquire_block_data(); + let serialized_proof = block_data; + let proof = Proof::read(serialized_proof.as_slice()).unwrap(); + + // Prepare verifying key + let pk = VerifyingKey::::read(VERIFYING_KEY.as_ref()).unwrap(); + let pvk = prepare_verifying_key(&pk); + + // If proof is valid, mark last byte of post state root + if verify_proof(&pvk, &proof, &[Fr::one()]).unwrap() { + post_state_root.bytes[31] = 1; + } + + eth2::save_post_state_root(post_state_root) +} diff --git a/zk.yaml b/zk.yaml new file mode 100644 index 0000000..1354d6b --- /dev/null +++ b/zk.yaml @@ -0,0 +1,12 @@ +beacon_state: + execution_scripts: + - scripts/zk/target/wasm32-unknown-unknown/release/phase2_zk.wasm +shard_pre_state: + exec_env_states: + - "0000000000000000000000000000000000000000000000000000000000000000" +shard_blocks: + - env: 0 + data: "b11834496b0042515914b4a3f29794946feb6ddae94b7693197ca85eb6316ae8f1ff44b4305e950fab034eb84997d76c8341e0ac78abea91e63254379882d08ada3630aac9e0761156eb8c9b47e81e769b331af3a75acc93e42f0a0ef61fdc00045b2fa31be73917f136e5b8a4d66cfcd18df9092bb04a92ed07871c6c69e670b6631fdc74899a9f2b0dff61925493a2b3d0a852b3a9b20a3774d4d415f6a0edb2783be5b1c4181c08ff19245e9f91761a62caf9993725d553642f8be9dcd844" +shard_post_state: + exec_env_states: + - "0000000000000000000000000000000000000000000000000000000000000001" From 4f550a60438fcbdcfd8a5fd2d98668b4a3e2bdae Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Thu, 6 Jun 2019 17:15:01 +0200 Subject: [PATCH 02/10] zk: add lto flag, chisel repack task --- scripts/zk/Cargo.toml | 4 ++++ scripts/zk/chisel.toml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/scripts/zk/Cargo.toml b/scripts/zk/Cargo.toml index b5cb181..bf2fe07 100644 --- a/scripts/zk/Cargo.toml +++ b/scripts/zk/Cargo.toml @@ -22,3 +22,7 @@ git = "https://github.com/ewasm/ewasm-rust-api" rev = "1c01982" default-features = false features = ["std", "eth2", "wee_alloc"] + +[profile.release] +lto = true +debug = false diff --git a/scripts/zk/chisel.toml b/scripts/zk/chisel.toml index 75f2aad..e0a625d 100644 --- a/scripts/zk/chisel.toml +++ b/scripts/zk/chisel.toml @@ -4,3 +4,5 @@ zk: preset: "ewasm" verifyexports: preset: "ewasm" + repack: + preset: "ewasm" From f47873e2a7a1fd684a52087a0b859aaf2ce91423 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Fri, 7 Jun 2019 11:31:11 +0200 Subject: [PATCH 03/10] zk: use bn256 curve, update dummy circuit --- scripts/zk/Cargo.toml | 7 +-- scripts/zk/src/lib.rs | 137 +++++++++++++++++++----------------------- 2 files changed, 65 insertions(+), 79 deletions(-) diff --git a/scripts/zk/Cargo.toml b/scripts/zk/Cargo.toml index bf2fe07..3e2f643 100644 --- a/scripts/zk/Cargo.toml +++ b/scripts/zk/Cargo.toml @@ -11,11 +11,8 @@ edition = "2018" crate-type = ["cdylib"] [dependencies] -bellman = "0.1" - -[dependencies.pairing] -version = "0.14" -features = ["u128-support"] +bellman_ce = "0.3" +pairing_ce = "0.17" [dependencies.ewasm_api] git = "https://github.com/ewasm/ewasm-rust-api" diff --git a/scripts/zk/src/lib.rs b/scripts/zk/src/lib.rs index 652f6d2..89c91e2 100644 --- a/scripts/zk/src/lib.rs +++ b/scripts/zk/src/lib.rs @@ -1,68 +1,54 @@ //! Verifies proof and modifies state root. //! Used the https://github.com/ebfull/bellman-demo example -//! to generate proof for a dummy circuit. +//! to generate proof for a dummy circuit (_a * b = c) -extern crate bellman; +extern crate bellman_ce; extern crate ewasm_api; -extern crate pairing; -use bellman::groth16::{prepare_verifying_key, verify_proof, Proof, VerifyingKey}; +extern crate pairing_ce; +use bellman_ce::groth16::{prepare_verifying_key, verify_proof, Proof, VerifyingKey}; use ewasm_api::*; -use pairing::bls12_381::{Bls12, Fr}; -use pairing::Field; +use pairing_ce::bn256::{Bn256, Fr}; +use pairing_ce::ff::PrimeField; -const VERIFYING_KEY: [u8; 1060] = [ - 24, 41, 202, 68, 46, 46, 1, 49, 196, 124, 167, 254, 34, 42, 79, 231, 184, 11, 52, 73, 157, 140, - 195, 63, 62, 141, 52, 70, 46, 157, 227, 21, 10, 99, 119, 91, 102, 55, 147, 213, 244, 224, 21, - 15, 159, 74, 31, 225, 1, 197, 163, 112, 61, 188, 44, 55, 183, 203, 141, 192, 44, 196, 232, 112, - 125, 0, 140, 198, 55, 189, 50, 148, 168, 117, 84, 43, 12, 130, 9, 71, 17, 58, 45, 116, 81, 51, - 83, 57, 9, 144, 44, 85, 117, 146, 204, 75, 11, 211, 69, 113, 14, 53, 33, 1, 8, 197, 248, 93, - 31, 158, 189, 44, 20, 209, 149, 71, 246, 83, 163, 180, 215, 63, 160, 6, 231, 85, 44, 209, 24, - 60, 68, 98, 28, 232, 202, 138, 146, 239, 209, 39, 175, 82, 225, 81, 22, 126, 237, 42, 61, 232, - 134, 21, 220, 129, 172, 104, 80, 11, 115, 99, 49, 8, 63, 57, 4, 69, 167, 226, 96, 8, 143, 176, - 245, 173, 13, 46, 88, 59, 228, 169, 152, 241, 221, 188, 73, 67, 197, 219, 233, 148, 171, 229, - 19, 254, 53, 61, 162, 133, 229, 89, 232, 162, 178, 1, 51, 197, 169, 223, 49, 81, 134, 202, 1, - 231, 209, 11, 125, 19, 172, 127, 61, 190, 221, 152, 50, 132, 243, 144, 187, 12, 87, 254, 57, - 184, 16, 170, 49, 173, 156, 146, 15, 55, 49, 205, 163, 18, 130, 186, 143, 65, 131, 239, 210, - 186, 196, 173, 45, 151, 253, 20, 116, 13, 60, 13, 211, 52, 47, 5, 11, 210, 21, 34, 25, 26, 21, - 239, 167, 139, 15, 227, 152, 145, 158, 201, 94, 195, 30, 198, 12, 40, 152, 252, 65, 161, 100, - 62, 190, 245, 168, 64, 25, 218, 12, 10, 129, 244, 246, 199, 91, 21, 253, 251, 204, 154, 153, - 86, 102, 213, 54, 210, 137, 116, 193, 244, 129, 62, 207, 165, 31, 23, 112, 29, 112, 181, 98, - 171, 18, 117, 237, 165, 171, 55, 177, 120, 151, 113, 104, 95, 90, 42, 158, 215, 81, 24, 170, - 70, 84, 231, 122, 216, 107, 70, 126, 150, 247, 99, 183, 220, 76, 227, 171, 219, 65, 148, 102, - 164, 178, 7, 168, 202, 228, 117, 216, 80, 4, 50, 198, 183, 233, 136, 79, 146, 15, 93, 18, 24, - 253, 216, 109, 52, 107, 202, 76, 182, 230, 195, 242, 255, 235, 235, 29, 200, 211, 47, 124, 75, - 55, 1, 227, 56, 61, 197, 63, 128, 7, 93, 141, 94, 43, 237, 147, 5, 3, 154, 41, 215, 218, 22, - 146, 141, 221, 216, 172, 30, 36, 122, 172, 5, 215, 42, 129, 163, 236, 226, 39, 243, 212, 98, - 55, 94, 243, 140, 44, 28, 193, 233, 123, 112, 225, 145, 35, 208, 212, 171, 198, 18, 50, 146, - 179, 183, 22, 202, 219, 149, 235, 16, 197, 198, 248, 249, 0, 188, 156, 159, 109, 171, 54, 244, - 169, 83, 78, 200, 107, 15, 23, 137, 192, 44, 134, 177, 39, 90, 119, 83, 216, 14, 227, 218, 137, - 30, 243, 153, 69, 86, 244, 186, 233, 93, 20, 29, 131, 219, 142, 46, 183, 195, 59, 74, 52, 57, - 109, 59, 118, 58, 119, 54, 201, 29, 101, 213, 163, 56, 113, 144, 187, 30, 246, 130, 180, 45, - 239, 12, 220, 136, 122, 159, 49, 200, 199, 51, 60, 74, 178, 169, 236, 42, 6, 18, 208, 159, 3, - 218, 184, 173, 162, 42, 100, 132, 98, 99, 7, 69, 11, 33, 31, 228, 53, 85, 84, 152, 75, 210, - 141, 198, 176, 87, 211, 121, 237, 38, 58, 106, 210, 152, 100, 206, 35, 109, 177, 8, 127, 177, - 128, 68, 10, 167, 164, 124, 194, 253, 180, 15, 227, 166, 0, 70, 101, 199, 48, 77, 75, 74, 24, - 255, 255, 163, 9, 21, 3, 34, 243, 123, 154, 152, 225, 252, 55, 240, 85, 245, 20, 243, 251, 26, - 30, 19, 24, 109, 100, 59, 238, 169, 10, 218, 206, 83, 1, 199, 98, 183, 166, 235, 155, 97, 208, - 247, 130, 35, 128, 228, 193, 236, 4, 28, 120, 248, 38, 204, 10, 57, 52, 174, 103, 50, 44, 214, - 33, 114, 147, 207, 237, 165, 181, 88, 154, 92, 162, 39, 230, 237, 16, 124, 200, 72, 188, 25, - 80, 84, 139, 20, 7, 157, 46, 31, 222, 106, 182, 30, 40, 252, 112, 71, 184, 184, 223, 25, 66, - 143, 197, 168, 237, 70, 46, 77, 244, 113, 136, 116, 99, 251, 121, 113, 99, 58, 23, 163, 47, 33, - 1, 60, 69, 159, 81, 226, 85, 42, 194, 35, 252, 236, 185, 245, 77, 204, 245, 218, 130, 15, 241, - 32, 255, 55, 56, 117, 134, 64, 119, 222, 180, 105, 109, 229, 116, 231, 110, 190, 221, 128, 182, - 121, 74, 143, 208, 165, 157, 84, 5, 213, 241, 11, 81, 187, 19, 112, 116, 88, 43, 22, 127, 201, - 64, 127, 121, 31, 55, 170, 152, 77, 182, 2, 198, 165, 122, 197, 143, 192, 192, 142, 91, 214, - 46, 228, 166, 177, 205, 228, 110, 149, 17, 166, 131, 150, 182, 186, 0, 0, 0, 2, 1, 19, 250, - 235, 146, 16, 108, 175, 122, 162, 30, 154, 204, 230, 98, 135, 125, 166, 201, 118, 232, 56, 37, - 172, 71, 137, 44, 154, 84, 10, 69, 176, 98, 103, 2, 249, 138, 32, 111, 58, 191, 184, 207, 203, - 79, 168, 228, 147, 8, 146, 93, 45, 19, 193, 51, 219, 8, 191, 145, 62, 118, 140, 224, 20, 41, - 151, 19, 72, 187, 171, 97, 31, 217, 161, 177, 211, 79, 213, 142, 112, 94, 135, 106, 236, 125, - 79, 150, 128, 241, 10, 26, 97, 83, 95, 168, 188, 4, 137, 149, 173, 37, 72, 216, 178, 97, 144, - 3, 163, 21, 6, 217, 239, 67, 15, 132, 57, 71, 196, 17, 12, 66, 126, 42, 13, 20, 38, 154, 11, - 125, 233, 229, 199, 207, 61, 162, 211, 153, 136, 252, 153, 25, 51, 137, 69, 11, 204, 32, 52, - 159, 83, 3, 101, 158, 144, 80, 29, 171, 219, 209, 164, 163, 20, 76, 77, 60, 21, 227, 168, 186, - 110, 30, 90, 180, 212, 118, 88, 210, 178, 210, 235, 35, 82, 192, 147, 54, 170, 18, 205, 79, - 187, 28, 118, +const VERIFYING_KEY: [u8; 772] = [ + 42, 33, 239, 204, 227, 131, 165, 97, 197, 144, 23, 191, 105, 95, 71, 191, 12, 201, 89, 216, 11, + 0, 12, 64, 71, 68, 81, 184, 84, 220, 175, 254, 0, 149, 163, 139, 214, 68, 58, 0, 0, 129, 103, + 85, 143, 61, 64, 91, 128, 195, 107, 210, 213, 245, 116, 16, 127, 174, 44, 231, 91, 245, 9, 246, + 27, 208, 181, 50, 7, 43, 163, 112, 97, 173, 39, 64, 96, 195, 197, 173, 213, 130, 92, 223, 125, + 183, 220, 103, 160, 63, 72, 34, 229, 3, 244, 193, 25, 166, 128, 162, 11, 72, 192, 91, 87, 241, + 89, 112, 88, 193, 102, 229, 21, 58, 62, 208, 214, 104, 189, 203, 99, 67, 188, 199, 244, 147, + 133, 245, 48, 22, 170, 118, 105, 48, 60, 229, 51, 210, 13, 98, 121, 151, 66, 84, 250, 23, 141, + 143, 45, 152, 13, 246, 122, 189, 232, 243, 162, 176, 62, 16, 33, 83, 217, 97, 243, 241, 129, + 190, 25, 110, 203, 93, 8, 156, 37, 225, 150, 159, 180, 51, 201, 98, 133, 208, 138, 82, 246, 4, + 122, 94, 169, 147, 5, 142, 110, 19, 77, 31, 134, 123, 45, 188, 30, 213, 247, 85, 243, 225, 19, + 236, 218, 18, 179, 173, 135, 207, 95, 24, 240, 24, 145, 48, 214, 131, 38, 44, 143, 75, 24, 227, + 83, 185, 174, 216, 131, 37, 212, 220, 40, 53, 231, 176, 85, 121, 36, 235, 216, 126, 137, 225, + 226, 64, 138, 153, 39, 139, 21, 11, 22, 48, 124, 121, 49, 141, 127, 100, 28, 139, 132, 50, 115, + 245, 217, 155, 140, 34, 246, 219, 241, 201, 209, 120, 147, 226, 97, 183, 225, 178, 23, 123, + 172, 194, 235, 69, 175, 195, 99, 156, 237, 56, 170, 132, 151, 114, 42, 220, 138, 134, 223, 161, + 29, 184, 140, 242, 82, 40, 224, 11, 93, 169, 36, 203, 236, 168, 255, 230, 184, 59, 162, 54, + 106, 213, 39, 56, 109, 10, 167, 132, 11, 78, 60, 249, 74, 246, 132, 153, 239, 48, 84, 41, 179, + 56, 41, 195, 97, 55, 179, 134, 1, 81, 213, 23, 212, 46, 94, 59, 230, 208, 197, 161, 47, 147, + 115, 235, 251, 126, 130, 17, 141, 179, 211, 126, 25, 20, 46, 85, 141, 136, 20, 204, 89, 122, + 92, 130, 107, 70, 211, 83, 28, 115, 28, 109, 98, 75, 253, 200, 34, 235, 81, 173, 88, 180, 66, + 85, 158, 223, 45, 188, 135, 166, 52, 32, 214, 144, 79, 220, 52, 28, 3, 35, 220, 121, 34, 18, + 71, 115, 18, 38, 49, 62, 219, 244, 91, 150, 110, 189, 228, 207, 31, 77, 136, 59, 65, 46, 80, + 215, 42, 43, 206, 224, 106, 230, 21, 219, 82, 11, 197, 246, 217, 166, 46, 169, 52, 217, 83, + 195, 176, 55, 154, 239, 39, 129, 83, 153, 207, 244, 98, 207, 255, 134, 66, 1, 120, 131, 11, 12, + 123, 146, 153, 182, 111, 54, 185, 108, 140, 240, 124, 53, 166, 204, 2, 121, 18, 73, 89, 73, + 100, 10, 45, 201, 230, 65, 202, 140, 201, 101, 237, 24, 116, 155, 13, 169, 25, 138, 79, 192, + 93, 46, 104, 11, 3, 168, 129, 227, 20, 138, 93, 118, 144, 220, 239, 206, 35, 199, 58, 175, 179, + 37, 124, 40, 39, 126, 173, 244, 149, 23, 30, 107, 230, 210, 27, 63, 230, 67, 217, 169, 0, 0, 0, + 3, 45, 247, 3, 189, 32, 213, 202, 25, 141, 195, 126, 108, 162, 79, 172, 76, 93, 242, 50, 117, + 198, 224, 136, 2, 104, 196, 127, 80, 251, 116, 27, 241, 38, 42, 110, 21, 99, 137, 77, 88, 125, + 110, 243, 116, 61, 187, 33, 12, 161, 134, 52, 33, 54, 22, 198, 235, 91, 209, 194, 235, 239, 87, + 39, 86, 35, 244, 248, 76, 209, 27, 194, 97, 176, 127, 236, 90, 60, 59, 196, 211, 164, 133, 231, + 232, 22, 98, 208, 5, 11, 211, 14, 166, 164, 115, 45, 54, 17, 206, 179, 175, 100, 57, 118, 98, + 216, 90, 199, 232, 96, 137, 192, 198, 225, 92, 169, 235, 101, 65, 239, 33, 11, 177, 176, 99, + 156, 78, 238, 198, 20, 139, 177, 60, 202, 137, 126, 87, 213, 100, 185, 167, 179, 156, 87, 40, + 25, 104, 66, 246, 130, 109, 114, 118, 12, 206, 244, 123, 95, 191, 85, 93, 13, 112, 209, 118, + 207, 127, 145, 38, 156, 184, 198, 71, 135, 150, 150, 241, 26, 51, 26, 144, 219, 201, 145, 39, + 222, 143, 86, 110, 197, 245, 163, 235, ]; #[cfg(not(test))] @@ -71,32 +57,35 @@ pub extern "C" fn main() { let pre_state_root = eth2::load_pre_state_root(); let mut post_state_root = pre_state_root; - /*let serialized_proof = vec![ - 177, 24, 52, 73, 107, 0, 66, 81, 89, 20, 180, 163, 242, 151, 148, 148, 111, 235, 109, 218, - 233, 75, 118, 147, 25, 124, 168, 94, 182, 49, 106, 232, 241, 255, 68, 180, 48, 94, 149, 15, - 171, 3, 78, 184, 73, 151, 215, 108, 131, 65, 224, 172, 120, 171, 234, 145, 230, 50, 84, 55, - 152, 130, 208, 138, 218, 54, 48, 170, 201, 224, 118, 17, 86, 235, 140, 155, 71, 232, 30, - 118, 155, 51, 26, 243, 167, 90, 204, 147, 228, 47, 10, 14, 246, 31, 220, 0, 4, 91, 47, 163, - 27, 231, 57, 23, 241, 54, 229, 184, 164, 214, 108, 252, 209, 141, 249, 9, 43, 176, 74, 146, - 237, 7, 135, 28, 108, 105, 230, 112, 182, 99, 31, 220, 116, 137, 154, 159, 43, 13, 255, 97, - 146, 84, 147, 162, 179, 208, 168, 82, 179, 169, 178, 10, 55, 116, 212, 212, 21, 246, 160, - 237, 178, 120, 59, 229, 177, 196, 24, 28, 8, 255, 25, 36, 94, 159, 145, 118, 26, 98, 202, - 249, 153, 55, 37, 213, 83, 100, 47, 139, 233, 220, 216, 68, - ];*/ + let serialized_proof = vec![ + 172, 2, 162, 201, 157, 209, 71, 92, 22, 54, 179, 104, 208, 244, 81, 44, 247, 131, 1, 61, + 39, 111, 5, 90, 30, 142, 36, 20, 189, 209, 158, 228, 44, 54, 4, 214, 108, 49, 23, 212, 195, + 173, 63, 100, 68, 229, 19, 134, 140, 185, 215, 221, 59, 105, 236, 54, 183, 213, 133, 207, + 207, 176, 241, 185, 40, 205, 25, 206, 71, 110, 21, 43, 29, 8, 29, 227, 82, 166, 98, 121, + 32, 210, 61, 254, 28, 1, 102, 242, 248, 201, 237, 179, 103, 160, 23, 159, 21, 76, 163, 3, + 248, 118, 191, 23, 120, 113, 112, 193, 90, 71, 42, 180, 69, 56, 84, 204, 115, 9, 64, 6, + 190, 61, 34, 22, 45, 92, 11, 84, + ]; assert!(eth2::block_data_size() > 0); // Block data only contains serialized proof let block_data = eth2::acquire_block_data(); - let serialized_proof = block_data; + //let serialized_proof = block_data; let proof = Proof::read(serialized_proof.as_slice()).unwrap(); // Prepare verifying key - let pk = VerifyingKey::::read(VERIFYING_KEY.as_ref()).unwrap(); + let pk = VerifyingKey::::read(VERIFYING_KEY.as_ref()).unwrap(); let pvk = prepare_verifying_key(&pk); // If proof is valid, mark last byte of post state root - if verify_proof(&pvk, &proof, &[Fr::one()]).unwrap() { + if verify_proof( + &pvk, + &proof, + &[Fr::from_str("4").unwrap(), Fr::from_str("12").unwrap()], + ) + .unwrap() + { post_state_root.bytes[31] = 1; } From 16cba992a3a20689c16b6ad35a504581e59ab836 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Fri, 7 Jun 2019 12:03:49 +0200 Subject: [PATCH 04/10] Measure exec time, add methods for benchmarking --- scripts/zk/src/lib.rs | 15 +++++++++++++++ src/main.rs | 25 ++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/scripts/zk/src/lib.rs b/scripts/zk/src/lib.rs index 89c91e2..aed6258 100644 --- a/scripts/zk/src/lib.rs +++ b/scripts/zk/src/lib.rs @@ -10,6 +10,11 @@ use ewasm_api::*; use pairing_ce::bn256::{Bn256, Fr}; use pairing_ce::ff::PrimeField; +extern "C" { + fn debug_startTimer(); + fn debug_endTimer(); +} + const VERIFYING_KEY: [u8; 772] = [ 42, 33, 239, 204, 227, 131, 165, 97, 197, 144, 23, 191, 105, 95, 71, 191, 12, 201, 89, 216, 11, 0, 12, 64, 71, 68, 81, 184, 84, 220, 175, 254, 0, 149, 163, 139, 214, 68, 58, 0, 0, 129, 103, @@ -71,6 +76,7 @@ pub extern "C" fn main() { // Block data only contains serialized proof let block_data = eth2::acquire_block_data(); + //let serialized_proof = block_data; let proof = Proof::read(serialized_proof.as_slice()).unwrap(); @@ -78,6 +84,11 @@ pub extern "C" fn main() { let pk = VerifyingKey::::read(VERIFYING_KEY.as_ref()).unwrap(); let pvk = prepare_verifying_key(&pk); + // Start benchmarking timer + unsafe { + debug_startTimer(); + } + // If proof is valid, mark last byte of post state root if verify_proof( &pvk, @@ -89,5 +100,9 @@ pub extern "C" fn main() { post_state_root.bytes[31] = 1; } + unsafe { + debug_endTimer(); + } + eth2::save_post_state_root(post_state_root) } diff --git a/src/main.rs b/src/main.rs index dfd6c21..df15ab2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ use rustc_hex::FromHex; use serde::{Deserialize, Serialize}; use std::env; use std::fs::File; +use std::time::{Duration, Instant}; use wasmi::memory_units::Pages; use wasmi::{ Error as InterpreterError, Externals, FuncInstance, FuncRef, ImportsBuilder, MemoryInstance, @@ -20,12 +21,15 @@ const BLOCKDATASIZE_FUNC_INDEX: usize = 1; const BLOCKDATACOPY_FUNC_INDEX: usize = 2; const SAVEPOSTSTATEROOT_FUNC_INDEX: usize = 3; const PUSHNEWDEPOSIT_FUNC_INDEX: usize = 4; +const STARTTIMER_FUNC_INDEX: usize = 5; +const ENDTIMER_FUNC_INDEX: usize = 6; struct Runtime<'a> { memory: Option, pre_state: &'a Bytes32, block_data: &'a ShardBlockBody, post_state: Bytes32, + timer_start: Instant, } impl<'a> Runtime<'a> { @@ -44,6 +48,7 @@ impl<'a> Runtime<'a> { pre_state: pre_state, block_data: block_data, post_state: Bytes32::default(), + timer_start: Instant::now(), } } @@ -110,6 +115,17 @@ impl<'a> Externals for Runtime<'a> { Ok(None) } PUSHNEWDEPOSIT_FUNC_INDEX => unimplemented!(), + STARTTIMER_FUNC_INDEX => { + self.timer_start = Instant::now(); + Ok(None) + } + ENDTIMER_FUNC_INDEX => { + println!( + "End timer, duration is: {} ms", + self.timer_start.elapsed().as_millis() + ); + Ok(None) + } _ => panic!("unknown function index"), } } @@ -144,6 +160,12 @@ impl<'a> ModuleImportResolver for RuntimeModuleImportResolver { Signature::new(&[ValueType::I32][..], None), PUSHNEWDEPOSIT_FUNC_INDEX, ), + "debug_startTimer" => { + FuncInstance::alloc_host(Signature::new(&[][..], None), STARTTIMER_FUNC_INDEX) + } + "debug_endTimer" => { + FuncInstance::alloc_host(Signature::new(&[][..], None), ENDTIMER_FUNC_INDEX) + } _ => { return Err(InterpreterError::Function(format!( "host module doesn't export function with name {}", @@ -231,12 +253,13 @@ pub fn execute_code( let mut runtime = Runtime::new(pre_state, block_data, Some(internal_mem)); + let now = Instant::now(); let result = instance .invoke_export("main", &[], &mut runtime) .expect("Executed 'main'"); println!("Result: {:?}", result); - println!("Execution finished"); + println!("Execution finished in {} ms", now.elapsed().as_millis()); (runtime.get_post_state(), vec![Deposit {}]) } From 300f917c4dfaf9a54f276c438826a55de046f582 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Fri, 7 Jun 2019 13:11:02 +0200 Subject: [PATCH 05/10] zk: accept ssz serialized block data for proof & public inputs --- scripts/zk/Cargo.toml | 2 ++ scripts/zk/src/lib.rs | 30 +++++++++++++++++------------- zk.yaml | 2 +- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/scripts/zk/Cargo.toml b/scripts/zk/Cargo.toml index 3e2f643..2634946 100644 --- a/scripts/zk/Cargo.toml +++ b/scripts/zk/Cargo.toml @@ -13,6 +13,8 @@ crate-type = ["cdylib"] [dependencies] bellman_ce = "0.3" pairing_ce = "0.17" +ssz = "0.1.2" +ssz-derive = "0.1.2" [dependencies.ewasm_api] git = "https://github.com/ewasm/ewasm-rust-api" diff --git a/scripts/zk/src/lib.rs b/scripts/zk/src/lib.rs index aed6258..e5f60c6 100644 --- a/scripts/zk/src/lib.rs +++ b/scripts/zk/src/lib.rs @@ -2,13 +2,17 @@ //! Used the https://github.com/ebfull/bellman-demo example //! to generate proof for a dummy circuit (_a * b = c) -extern crate bellman_ce; extern crate ewasm_api; +extern crate ssz; +#[macro_use] +extern crate ssz_derive; +extern crate bellman_ce; extern crate pairing_ce; use bellman_ce::groth16::{prepare_verifying_key, verify_proof, Proof, VerifyingKey}; use ewasm_api::*; use pairing_ce::bn256::{Bn256, Fr}; use pairing_ce::ff::PrimeField; +use ssz::Decode; extern "C" { fn debug_startTimer(); @@ -56,29 +60,26 @@ const VERIFYING_KEY: [u8; 772] = [ 222, 143, 86, 110, 197, 245, 163, 235, ]; +#[derive(Ssz)] +struct InputBlock { + pub proof: [u8; 128], + pub public_inputs: [u64; 2], +} + #[cfg(not(test))] #[no_mangle] pub extern "C" fn main() { let pre_state_root = eth2::load_pre_state_root(); let mut post_state_root = pre_state_root; - let serialized_proof = vec![ - 172, 2, 162, 201, 157, 209, 71, 92, 22, 54, 179, 104, 208, 244, 81, 44, 247, 131, 1, 61, - 39, 111, 5, 90, 30, 142, 36, 20, 189, 209, 158, 228, 44, 54, 4, 214, 108, 49, 23, 212, 195, - 173, 63, 100, 68, 229, 19, 134, 140, 185, 215, 221, 59, 105, 236, 54, 183, 213, 133, 207, - 207, 176, 241, 185, 40, 205, 25, 206, 71, 110, 21, 43, 29, 8, 29, 227, 82, 166, 98, 121, - 32, 210, 61, 254, 28, 1, 102, 242, 248, 201, 237, 179, 103, 160, 23, 159, 21, 76, 163, 3, - 248, 118, 191, 23, 120, 113, 112, 193, 90, 71, 42, 180, 69, 56, 84, 204, 115, 9, 64, 6, - 190, 61, 34, 22, 45, 92, 11, 84, - ]; - assert!(eth2::block_data_size() > 0); // Block data only contains serialized proof let block_data = eth2::acquire_block_data(); + let block = InputBlock::decode(&mut block_data.as_slice()).expect("valid input"); //let serialized_proof = block_data; - let proof = Proof::read(serialized_proof.as_slice()).unwrap(); + let proof = Proof::read(&block.proof[..]).unwrap(); // Prepare verifying key let pk = VerifyingKey::::read(VERIFYING_KEY.as_ref()).unwrap(); @@ -93,7 +94,10 @@ pub extern "C" fn main() { if verify_proof( &pvk, &proof, - &[Fr::from_str("4").unwrap(), Fr::from_str("12").unwrap()], + &[ + Fr::from_str(block.public_inputs[0].to_string().as_str()).unwrap(), + Fr::from_str(block.public_inputs[1].to_string().as_str()).unwrap(), + ], ) .unwrap() { diff --git a/zk.yaml b/zk.yaml index 1354d6b..6265282 100644 --- a/zk.yaml +++ b/zk.yaml @@ -6,7 +6,7 @@ shard_pre_state: - "0000000000000000000000000000000000000000000000000000000000000000" shard_blocks: - env: 0 - data: "b11834496b0042515914b4a3f29794946feb6ddae94b7693197ca85eb6316ae8f1ff44b4305e950fab034eb84997d76c8341e0ac78abea91e63254379882d08ada3630aac9e0761156eb8c9b47e81e769b331af3a75acc93e42f0a0ef61fdc00045b2fa31be73917f136e5b8a4d66cfcd18df9092bb04a92ed07871c6c69e670b6631fdc74899a9f2b0dff61925493a2b3d0a852b3a9b20a3774d4d415f6a0edb2783be5b1c4181c08ff19245e9f91761a62caf9993725d553642f8be9dcd844" + data: "ac02a2c99dd1475c1636b368d0f4512cf783013d276f055a1e8e2414bdd19ee42c3604d66c3117d4c3ad3f6444e513868cb9d7dd3b69ec36b7d585cfcfb0f1b928cd19ce476e152b1d081de352a6627920d23dfe1c0166f2f8c9edb367a0179f154ca303f876bf17787170c15a472ab4453854cc73094006be3d22162d5c0b5404000000000000000c00000000000000" shard_post_state: exec_env_states: - "0000000000000000000000000000000000000000000000000000000000000001" From fc3404775987792a8eff1c0182aaf90e59e78bef Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Fri, 7 Jun 2019 14:35:31 +0200 Subject: [PATCH 06/10] zk: mv logic to process_block func --- scripts/zk/src/lib.rs | 44 +++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/scripts/zk/src/lib.rs b/scripts/zk/src/lib.rs index e5f60c6..ab94baf 100644 --- a/scripts/zk/src/lib.rs +++ b/scripts/zk/src/lib.rs @@ -66,41 +66,29 @@ struct InputBlock { pub public_inputs: [u64; 2], } -#[cfg(not(test))] -#[no_mangle] -pub extern "C" fn main() { - let pre_state_root = eth2::load_pre_state_root(); - let mut post_state_root = pre_state_root; +fn process_block(pre_state_root: types::Bytes32, mut block_data: &[u8]) -> types::Bytes32 { + let block = InputBlock::decode(&mut block_data).expect("valid input"); - assert!(eth2::block_data_size() > 0); - - // Block data only contains serialized proof - let block_data = eth2::acquire_block_data(); - let block = InputBlock::decode(&mut block_data.as_slice()).expect("valid input"); - - //let serialized_proof = block_data; let proof = Proof::read(&block.proof[..]).unwrap(); // Prepare verifying key let pk = VerifyingKey::::read(VERIFYING_KEY.as_ref()).unwrap(); let pvk = prepare_verifying_key(&pk); + // Prepare public inputs + let public_inputs = [ + Fr::from_str(block.public_inputs[0].to_string().as_str()).unwrap(), + Fr::from_str(block.public_inputs[1].to_string().as_str()).unwrap(), + ]; + // Start benchmarking timer unsafe { debug_startTimer(); } + let mut post_state_root = pre_state_root; // If proof is valid, mark last byte of post state root - if verify_proof( - &pvk, - &proof, - &[ - Fr::from_str(block.public_inputs[0].to_string().as_str()).unwrap(), - Fr::from_str(block.public_inputs[1].to_string().as_str()).unwrap(), - ], - ) - .unwrap() - { + if verify_proof(&pvk, &proof, &public_inputs).unwrap() { post_state_root.bytes[31] = 1; } @@ -108,5 +96,17 @@ pub extern "C" fn main() { debug_endTimer(); } + post_state_root +} + +#[cfg(not(test))] +#[no_mangle] +pub extern "C" fn main() { + assert!(eth2::block_data_size() > 0); + + let pre_state_root = eth2::load_pre_state_root(); + let block_data = eth2::acquire_block_data(); + let post_state_root = process_block(pre_state_root, &block_data); + eth2::save_post_state_root(post_state_root) } From 054f6e3c6ed9efb4bcc65e58e0ad64e0b3a03302 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Fri, 7 Jun 2019 14:46:12 +0200 Subject: [PATCH 07/10] zk: use public inputs as pre/post state root --- scripts/zk/src/lib.rs | 9 ++++++--- zk.yaml | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/scripts/zk/src/lib.rs b/scripts/zk/src/lib.rs index ab94baf..a88cf2c 100644 --- a/scripts/zk/src/lib.rs +++ b/scripts/zk/src/lib.rs @@ -1,6 +1,6 @@ -//! Verifies proof and modifies state root. +//! Verifies proof and modifies state root based on public inputs. //! Used the https://github.com/ebfull/bellman-demo example -//! to generate proof for a dummy circuit (_a * b = c) +//! to generate proof for a dummy circuit (_a * b = c). extern crate ewasm_api; extern crate ssz; @@ -13,6 +13,7 @@ use ewasm_api::*; use pairing_ce::bn256::{Bn256, Fr}; use pairing_ce::ff::PrimeField; use ssz::Decode; +use std::convert::TryInto; extern "C" { fn debug_startTimer(); @@ -69,6 +70,8 @@ struct InputBlock { fn process_block(pre_state_root: types::Bytes32, mut block_data: &[u8]) -> types::Bytes32 { let block = InputBlock::decode(&mut block_data).expect("valid input"); + assert!(pre_state_root.bytes[31] == TryInto::::try_into(block.public_inputs[0]).unwrap()); + let proof = Proof::read(&block.proof[..]).unwrap(); // Prepare verifying key @@ -89,7 +92,7 @@ fn process_block(pre_state_root: types::Bytes32, mut block_data: &[u8]) -> types let mut post_state_root = pre_state_root; // If proof is valid, mark last byte of post state root if verify_proof(&pvk, &proof, &public_inputs).unwrap() { - post_state_root.bytes[31] = 1; + post_state_root.bytes[31] = TryInto::::try_into(block.public_inputs[1]).unwrap(); } unsafe { diff --git a/zk.yaml b/zk.yaml index 6265282..1d63639 100644 --- a/zk.yaml +++ b/zk.yaml @@ -3,10 +3,10 @@ beacon_state: - scripts/zk/target/wasm32-unknown-unknown/release/phase2_zk.wasm shard_pre_state: exec_env_states: - - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000004" shard_blocks: - env: 0 data: "ac02a2c99dd1475c1636b368d0f4512cf783013d276f055a1e8e2414bdd19ee42c3604d66c3117d4c3ad3f6444e513868cb9d7dd3b69ec36b7d585cfcfb0f1b928cd19ce476e152b1d081de352a6627920d23dfe1c0166f2f8c9edb367a0179f154ca303f876bf17787170c15a472ab4453854cc73094006be3d22162d5c0b5404000000000000000c00000000000000" shard_post_state: exec_env_states: - - "0000000000000000000000000000000000000000000000000000000000000001" + - "000000000000000000000000000000000000000000000000000000000000000c" From d4049aa794cde07cd874a29be8c28227d0faf79b Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Thu, 4 Jul 2019 14:52:53 +0200 Subject: [PATCH 08/10] Rm extra import --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index df15ab2..11c05ff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ use rustc_hex::FromHex; use serde::{Deserialize, Serialize}; use std::env; use std::fs::File; -use std::time::{Duration, Instant}; +use std::time::Instant; use wasmi::memory_units::Pages; use wasmi::{ Error as InterpreterError, Externals, FuncInstance, FuncRef, ImportsBuilder, MemoryInstance, From 056198edea27fba840ac029d3530e4b03419bb30 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Thu, 4 Jul 2019 14:57:44 +0200 Subject: [PATCH 09/10] Rename zk script to snark-verifier --- Makefile | 4 ++-- scripts/{zk => snark-verifier}/.cargo/config | 0 scripts/{zk => snark-verifier}/Cargo.toml | 4 ++-- scripts/{zk => snark-verifier}/chisel.toml | 4 ++-- scripts/{zk => snark-verifier}/src/lib.rs | 0 zk.yaml => snark-verifier.yaml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) rename scripts/{zk => snark-verifier}/.cargo/config (100%) rename scripts/{zk => snark-verifier}/Cargo.toml (82%) rename scripts/{zk => snark-verifier}/chisel.toml (54%) rename scripts/{zk => snark-verifier}/src/lib.rs (100%) rename zk.yaml => snark-verifier.yaml (86%) diff --git a/Makefile b/Makefile index 82efdbf..1203eb7 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,10 @@ all: build test build: cd scripts/helloworld && cargo build --release && chisel run --config chisel.toml cd scripts/bazaar && cargo build --release && chisel run --config chisel.toml - cd scripts/zk && cargo build --release && chisel run --config chisel.toml + cd scripts/snark-verifier && cargo build --release && chisel run --config chisel.toml cargo build --release test: target/release/phase2-scout target/release/phase2-scout bazaar.yaml - target/release/phase2-scout zk.yaml + target/release/phase2-scout snark-verifier.yaml diff --git a/scripts/zk/.cargo/config b/scripts/snark-verifier/.cargo/config similarity index 100% rename from scripts/zk/.cargo/config rename to scripts/snark-verifier/.cargo/config diff --git a/scripts/zk/Cargo.toml b/scripts/snark-verifier/Cargo.toml similarity index 82% rename from scripts/zk/Cargo.toml rename to scripts/snark-verifier/Cargo.toml index 2634946..191f01d 100644 --- a/scripts/zk/Cargo.toml +++ b/scripts/snark-verifier/Cargo.toml @@ -1,9 +1,9 @@ [package] -name = "phase2-zk" +name = "snark-verifier" version = "0.0.0" license = "Apache-2.0" repository = "https://github.com/ewasm/scout" -description = "Eth 2.0 Phase 2 execution script: zk" +description = "Eth 2.0 Phase 2 execution script: Simple SNARK verifier" publish = false edition = "2018" diff --git a/scripts/zk/chisel.toml b/scripts/snark-verifier/chisel.toml similarity index 54% rename from scripts/zk/chisel.toml rename to scripts/snark-verifier/chisel.toml index e0a625d..da9237e 100644 --- a/scripts/zk/chisel.toml +++ b/scripts/snark-verifier/chisel.toml @@ -1,5 +1,5 @@ -zk: - file: "target/wasm32-unknown-unknown/release/phase2_zk.wasm" +snark_verifier: + file: "target/wasm32-unknown-unknown/release/snark_verifier.wasm" trimexports: preset: "ewasm" verifyexports: diff --git a/scripts/zk/src/lib.rs b/scripts/snark-verifier/src/lib.rs similarity index 100% rename from scripts/zk/src/lib.rs rename to scripts/snark-verifier/src/lib.rs diff --git a/zk.yaml b/snark-verifier.yaml similarity index 86% rename from zk.yaml rename to snark-verifier.yaml index 1d63639..8f84f39 100644 --- a/zk.yaml +++ b/snark-verifier.yaml @@ -1,6 +1,6 @@ beacon_state: execution_scripts: - - scripts/zk/target/wasm32-unknown-unknown/release/phase2_zk.wasm + - scripts/snark-verifier/target/wasm32-unknown-unknown/release/snark_verifier.wasm shard_pre_state: exec_env_states: - "0000000000000000000000000000000000000000000000000000000000000004" From 36ca4a13e02cc8cac9138b5f4de30031400ed340 Mon Sep 17 00:00:00 2001 From: Sina Mahmoodi Date: Thu, 4 Jul 2019 14:59:37 +0200 Subject: [PATCH 10/10] snark-verifier: update ewasm_api to v0.10.0 --- scripts/snark-verifier/Cargo.toml | 3 +-- scripts/snark-verifier/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/snark-verifier/Cargo.toml b/scripts/snark-verifier/Cargo.toml index 191f01d..358d309 100644 --- a/scripts/snark-verifier/Cargo.toml +++ b/scripts/snark-verifier/Cargo.toml @@ -17,8 +17,7 @@ ssz = "0.1.2" ssz-derive = "0.1.2" [dependencies.ewasm_api] -git = "https://github.com/ewasm/ewasm-rust-api" -rev = "1c01982" +version = "0.10.0" default-features = false features = ["std", "eth2", "wee_alloc"] diff --git a/scripts/snark-verifier/src/lib.rs b/scripts/snark-verifier/src/lib.rs index a88cf2c..be827a6 100644 --- a/scripts/snark-verifier/src/lib.rs +++ b/scripts/snark-verifier/src/lib.rs @@ -111,5 +111,5 @@ pub extern "C" fn main() { let block_data = eth2::acquire_block_data(); let post_state_root = process_block(pre_state_root, &block_data); - eth2::save_post_state_root(post_state_root) + eth2::save_post_state_root(&post_state_root) }