Skip to content

Commit

Permalink
feat: upgrade revm to support lastest hardfork (#40)
Browse files Browse the repository at this point in the history
  • Loading branch information
han0110 authored and jonathanpwang committed Aug 18, 2023
1 parent 9d98145 commit f309ede
Show file tree
Hide file tree
Showing 16 changed files with 97 additions and 1,854 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
cache-on-failure: true

- name: Install solc
run: (hash svm 2>/dev/null || cargo install svm-rs) && svm install 0.8.17 && solc --version
run: (hash svm 2>/dev/null || cargo install --version 0.2.23 svm-rs) && svm install 0.8.20 && solc --version

- name: Run test
run: cargo test --all -- --nocapture
Expand Down
2 changes: 1 addition & 1 deletion rust-toolchain
Original file line number Diff line number Diff line change
@@ -1 +1 @@
nightly-2023-08-12
nightly-2023-08-12
17 changes: 3 additions & 14 deletions snark-verifier-sdk/src/evm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ use crate::{GWC, SHPLONK};
use super::{CircuitExt, PlonkVerifier};
#[cfg(feature = "display")]
use ark_std::{end_timer, start_timer};
use ethereum_types::Address;
use halo2_base::halo2_proofs::{
halo2curves::bn256::{Bn256, Fq, Fr, G1Affine},
plonk::{create_proof, verify_proof, Circuit, ProvingKey, VerifyingKey},
Expand All @@ -23,7 +22,7 @@ use itertools::Itertools;
use rand::{rngs::StdRng, SeedableRng};
pub use snark_verifier::loader::evm::encode_calldata;
use snark_verifier::{
loader::evm::{compile_yul, EvmLoader, ExecutorBuilder},
loader::evm::{compile_yul, deploy_and_call, EvmLoader},
pcs::{
kzg::{KzgAccumulator, KzgAsVerifyingKey, KzgDecidingKey, KzgSuccinctVerifyingKey},
AccumulationDecider, AccumulationScheme, PolynomialCommitmentScheme,
Expand Down Expand Up @@ -177,18 +176,8 @@ pub fn gen_evm_verifier_shplonk<C: CircuitExt<Fr>>(

pub fn evm_verify(deployment_code: Vec<u8>, instances: Vec<Vec<Fr>>, proof: Vec<u8>) {
let calldata = encode_calldata(&instances, &proof);
let success = {
let mut evm = ExecutorBuilder::default().with_gas_limit(u64::MAX.into()).build();

let caller = Address::from_low_u64_be(0xfe);
let verifier = evm.deploy(caller, deployment_code.into(), 0.into()).address.unwrap();
let result = evm.call_raw(caller, verifier, calldata.into(), 0.into());

dbg!(result.gas_used);

!result.reverted
};
assert!(success);
let gas_cost = deploy_and_call(deployment_code, calldata).unwrap();
dbg!(gas_cost);
}

pub fn write_calldata(instances: &[Vec<Fr>], proof: &[u8], path: &Path) -> io::Result<String> {
Expand Down
9 changes: 3 additions & 6 deletions snark-verifier/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,8 @@ poseidon-rs = { git = "https://github.com/axiom-crypto/poseidon-circuit.git", re
rayon = { version = "1.7", optional = true }

# loader_evm
sha3 = { version = "0.10.8", optional = true }
bytes = { version = "1.4.0", default-features = false, optional = true }
primitive-types = { version = "0.12.1", default-features = false, features = ["std"], optional = true }
rlp = { version = "0.5.2", default-features = false, features = ["std"], optional = true }
revm = { version = "2.3.1", optional = true }
sha3 = { version = "0.10", optional = true }
revm = { version = "3.3.0", optional = true }

# loader_halo2
halo2-ecc = { git = "https://github.com/axiom-crypto/halo2-lib.git", branch = "develop", default-features = false, optional = true }
Expand All @@ -47,7 +44,7 @@ tui = { version = "0.19", default-features = false, features = ["crossterm"] }
[features]
default = ["loader_evm", "loader_halo2", "halo2-axiom", "display"]
display = ["halo2-base/display", "halo2-ecc?/display"]
loader_evm = ["dep:primitive-types", "dep:sha3", "dep:revm", "dep:bytes", "dep:rlp"]
loader_evm = ["dep:sha3", "dep:revm"]
loader_halo2 = ["halo2-ecc"]
parallel = ["dep:rayon"]
# EXACTLY one of halo2-pse / halo2-axiom should always be turned on; not sure how to enforce this with Cargo
Expand Down
16 changes: 3 additions & 13 deletions snark-verifier/examples/evm-verifier-with-accumulator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ use itertools::Itertools;
use rand::rngs::OsRng;
use snark_verifier::{
loader::{
evm::{self, encode_calldata, Address, EvmLoader, ExecutorBuilder},
evm::{self, deploy_and_call, encode_calldata, EvmLoader},
native::NativeLoader,
},
pcs::kzg::{Gwc19, KzgAs, LimbsEncoding},
Expand Down Expand Up @@ -559,18 +559,8 @@ fn gen_aggregation_evm_verifier(

fn evm_verify(deployment_code: Vec<u8>, instances: Vec<Vec<Fr>>, proof: Vec<u8>) {
let calldata = encode_calldata(&instances, &proof);
let success = {
let mut evm = ExecutorBuilder::default().with_gas_limit(u64::MAX.into()).build();

let caller = Address::from_low_u64_be(0xfe);
let verifier = evm.deploy(caller, deployment_code.into(), 0.into()).address.unwrap();
let result = evm.call_raw(caller, verifier, calldata.into(), 0.into());

dbg!(result.gas_used);

!result.reverted
};
assert!(success);
let gas_cost = deploy_and_call(deployment_code, calldata).unwrap();
dbg!(gas_cost);
}

fn main() {
Expand Down
16 changes: 3 additions & 13 deletions snark-verifier/examples/evm-verifier.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use halo2_proofs::{
use itertools::Itertools;
use rand::{rngs::OsRng, RngCore};
use snark_verifier::{
loader::evm::{self, encode_calldata, Address, EvmLoader, ExecutorBuilder},
loader::evm::{self, deploy_and_call, encode_calldata, EvmLoader},
pcs::kzg::{Gwc19, KzgAs},
system::halo2::{compile, transcript::evm::EvmTranscript, Config},
verifier::{self, SnarkVerifier},
Expand Down Expand Up @@ -242,18 +242,8 @@ fn gen_evm_verifier(

fn evm_verify(deployment_code: Vec<u8>, instances: Vec<Vec<Fr>>, proof: Vec<u8>) {
let calldata = encode_calldata(&instances, &proof);
let success = {
let mut evm = ExecutorBuilder::default().with_gas_limit(u64::MAX.into()).build();

let caller = Address::from_low_u64_be(0xfe);
let verifier = evm.deploy(caller, deployment_code.into(), 0.into()).address.unwrap();
let result = evm.call_raw(caller, verifier, calldata.into(), 0.into());

dbg!(result.gas_used);

!result.reverted
};
assert!(success);
let gas_cost = deploy_and_call(deployment_code, calldata).unwrap();
dbg!(gas_cost);
}

fn main() {
Expand Down
10 changes: 2 additions & 8 deletions snark-verifier/src/loader/evm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,8 @@ mod code;
pub(crate) mod loader;
pub(crate) mod util;

#[cfg(test)]
mod test;

pub use loader::{EcPoint, EvmLoader, Scalar};
pub use util::{
compile_yul, encode_calldata, estimate_gas, fe_to_u256, modulus, u256_to_fe, Address,
ExecutorBuilder, H256, U256, U512,
compile_yul, deploy_and_call, encode_calldata, estimate_gas, fe_to_u256, modulus, u256_to_fe,
Address, B256, U256, U512,
};

#[cfg(test)]
pub use test::execute;
44 changes: 16 additions & 28 deletions snark-verifier/src/loader/evm/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,10 @@ pub struct EvmLoader {
code: RefCell<YulCode>,
ptr: RefCell<usize>,
cache: RefCell<HashMap<String, usize>>,
#[cfg(test)]
gas_metering_ids: RefCell<Vec<String>>,
}

fn hex_encode_u256(value: &U256) -> String {
let mut bytes = [0; 32];
value.to_big_endian(&mut bytes);
format!("0x{}", hex::encode(bytes))
format!("0x{}", hex::encode(value.to_be_bytes::<32>()))
}

impl EvmLoader {
Expand All @@ -82,8 +78,6 @@ impl EvmLoader {
code: RefCell::new(code),
ptr: Default::default(),
cache: Default::default(),
#[cfg(test)]
gas_metering_ids: RefCell::new(Vec::new()),
})
}

Expand Down Expand Up @@ -308,11 +302,11 @@ impl EvmLoader {
fn invert(self: &Rc<Self>, scalar: &Scalar) -> Scalar {
let rd_ptr = self.allocate(0x20);
let [cd_ptr, ..] = [
&self.scalar(Value::Constant(0x20.into())),
&self.scalar(Value::Constant(0x20.into())),
&self.scalar(Value::Constant(0x20.into())),
&self.scalar(Value::Constant(U256::from(0x20))),
&self.scalar(Value::Constant(U256::from(0x20))),
&self.scalar(Value::Constant(U256::from(0x20))),
scalar,
&self.scalar(Value::Constant(self.scalar_modulus - 2)),
&self.scalar(Value::Constant(self.scalar_modulus - U256::from(2))),
&self.scalar(Value::Constant(self.scalar_modulus)),
]
.map(|value| self.dup_scalar(value).ptr());
Expand Down Expand Up @@ -383,8 +377,8 @@ impl EvmLoader {

fn add(self: &Rc<Self>, lhs: &Scalar, rhs: &Scalar) -> Scalar {
if let (Value::Constant(lhs), Value::Constant(rhs)) = (&lhs.value, &rhs.value) {
let out = (U512::from(lhs) + U512::from(rhs)) % U512::from(self.scalar_modulus);
return self.scalar(Value::Constant(out.try_into().unwrap()));
let out = (U512::from(*lhs) + U512::from(*rhs)) % U512::from(self.scalar_modulus);
return self.scalar(Value::Constant(U256::from(out)));
}

self.scalar(Value::Sum(Box::new(lhs.value.clone()), Box::new(rhs.value.clone())))
Expand All @@ -403,8 +397,8 @@ impl EvmLoader {

fn mul(self: &Rc<Self>, lhs: &Scalar, rhs: &Scalar) -> Scalar {
if let (Value::Constant(lhs), Value::Constant(rhs)) = (&lhs.value, &rhs.value) {
let out = (U512::from(lhs) * U512::from(rhs)) % U512::from(self.scalar_modulus);
return self.scalar(Value::Constant(out.try_into().unwrap()));
let out = (U512::from(*lhs) * U512::from(*rhs)) % U512::from(self.scalar_modulus);
return self.scalar(Value::Constant(U256::from(out)));
}

self.scalar(Value::Product(Box::new(lhs.value.clone()), Box::new(rhs.value.clone())))
Expand All @@ -421,22 +415,16 @@ impl EvmLoader {

#[cfg(test)]
impl EvmLoader {
fn start_gas_metering(self: &Rc<Self>, identifier: &str) {
self.gas_metering_ids.borrow_mut().push(identifier.to_string());
let code = format!("let {identifier} := gas()");
self.code.borrow_mut().runtime_append(code);
fn start_gas_metering(self: &Rc<Self>, _: &str) {
// unimplemented
}

fn end_gas_metering(self: &Rc<Self>) {
let code =
format!("log1(0, 0, sub({}, gas()))", self.gas_metering_ids.borrow().last().unwrap());
self.code.borrow_mut().runtime_append(code);
// unimplemented
}

pub fn print_gas_metering(self: &Rc<Self>, costs: Vec<u64>) {
for (identifier, cost) in self.gas_metering_ids.borrow().iter().zip(costs) {
println!("{identifier}: {cost}");
}
pub fn print_gas_metering(self: &Rc<Self>, _: Vec<u64>) {
// unimplemented
}
}

Expand Down Expand Up @@ -648,7 +636,7 @@ where
fn ec_point_load_const(&self, value: &C) -> EcPoint {
let coordinates = value.coordinates().unwrap();
let [x, y] = [coordinates.x(), coordinates.y()]
.map(|coordinate| U256::from_little_endian(coordinate.to_repr().as_ref()));
.map(|coordinate| U256::try_from_le_slice(coordinate.to_repr().as_ref()).unwrap());
self.ec_point(Value::Constant((x, y)))
}

Expand All @@ -663,7 +651,7 @@ where
.iter()
.cloned()
.map(|(scalar, ec_point)| match scalar.value {
Value::Constant(constant) if U256::one() == constant => ec_point.clone(),
Value::Constant(constant) if U256::from(1) == constant => ec_point.clone(),
_ => ec_point.loader.ec_point_scalar_mul(ec_point, scalar),
})
.reduce(|acc, ec_point| acc.loader.ec_point_add(&acc, &ec_point))
Expand Down
48 changes: 0 additions & 48 deletions snark-verifier/src/loader/evm/test.rs

This file was deleted.

Loading

0 comments on commit f309ede

Please sign in to comment.