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 Jun 2, 2023
1 parent 7e5254c commit cc1f677
Show file tree
Hide file tree
Showing 20 changed files with 107 additions and 1,992 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 --version 0.2.22 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 --all-features -- --nocapture
Expand Down
2 changes: 1 addition & 1 deletion rust-toolchain
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.64.0
1.69.0
22 changes: 3 additions & 19 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_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 @@ -180,23 +179,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
11 changes: 2 additions & 9 deletions snark-verifier/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,7 @@ halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2",

# loader_evm
sha3 = { version = "0.10", optional = true }
bytes = { version = "1.1.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 }
revm = { version = "3.3.0", optional = true }

# loader_halo2
halo2_wrong_ecc = { git = "https://github.com/privacy-scaling-explorations/halo2wrong", tag = "v2023_04_20", package = "ecc", optional = true }
Expand All @@ -40,17 +37,13 @@ paste = "1.0.7"
# system_halo2
halo2_wrong_ecc = { git = "https://github.com/privacy-scaling-explorations/halo2wrong", tag = "v2023_04_20", package = "ecc" }

# loader_evm
crossterm = { version = "0.25" }
tui = { version = "0.19", default-features = false, features = ["crossterm"] }

[features]
default = ["loader_evm", "loader_halo2", "system_halo2"]

parallel = ["dep:rayon"]

# loaders
loader_evm = ["dep:bytes", "dep:sha3", "dep:primitive-types", "dep:rlp", "dep:revm"]
loader_evm = ["dep:sha3", "dep:revm"]
loader_halo2 = ["dep:halo2_proofs", "dep:halo2_wrong_ecc", "dep:poseidon"]

# systems
Expand Down
21 changes: 3 additions & 18 deletions snark-verifier/examples/evm-verifier-with-accumulator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,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 @@ -587,23 +587,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
21 changes: 3 additions & 18 deletions snark-verifier/examples/evm-verifier.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,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 @@ -230,23 +230,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;
48 changes: 16 additions & 32 deletions snark-verifier/src/loader/evm/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,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 @@ -83,8 +79,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 @@ -326,11 +320,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 @@ -401,8 +395,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(
Expand All @@ -424,8 +418,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(
Expand All @@ -445,26 +439,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 @@ -681,7 +665,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 @@ -696,7 +680,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 cc1f677

Please sign in to comment.