diff --git a/.github/workflows/general.yml b/.github/workflows/general.yml index 73e6d85..fe8bdbf 100644 --- a/.github/workflows/general.yml +++ b/.github/workflows/general.yml @@ -23,7 +23,7 @@ jobs: components: rustfmt, clippy - name: cargo test - run: cargo test + run: RUST_MIN_STACK=8388608 cargo test - name: cargo fmt run: cargo fmt --all -- --check diff --git a/Cargo.lock b/Cargo.lock index 5b6e96c..7828dbd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -105,6 +114,32 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.1", + "object", + "rustc-demangle", +] + +[[package]] +name = "backtrace-on-stack-overflow" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd2d70527f3737a1ad17355e260706c1badebabd1fa06a7a053407380df841b" +dependencies = [ + "backtrace", + "libc", + "nix", +] + [[package]] name = "base16ct" version = "0.1.1" @@ -467,7 +502,7 @@ dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", + "memoffset 0.8.0", "scopeguard", ] @@ -908,7 +943,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.6.2", ] [[package]] @@ -971,7 +1006,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.28", ] [[package]] @@ -1026,6 +1061,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + [[package]] name = "glob" version = "0.3.1" @@ -1364,6 +1405,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "justerror" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "befab2078d3ff679889e32730a1e9107b06a60a18ed7dfa3384f66ebe5e1062a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.107", +] + [[package]] name = "k256" version = "0.11.6" @@ -1448,9 +1500,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libloading" @@ -1502,6 +1554,15 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + [[package]] name = "memoffset" version = "0.8.0" @@ -1526,6 +1587,15 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" version = "0.8.6" @@ -1544,6 +1614,19 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nix" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3790c00a0150112de0f4cd161e3d7fc4b2d8a5542ffc35f099a2562aecb35c" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + [[package]] name = "nom" version = "5.1.2" @@ -1676,6 +1759,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.17.0" @@ -1972,18 +2064,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.56" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.26" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" dependencies = [ "proc-macro2", ] @@ -2256,6 +2348,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62cc5760263ea229d367e7dff3c0cbf09e4797a125bd87059a6c095804f3b2d1" +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2413,8 +2511,10 @@ dependencies = [ name = "ser" version = "0.1.0" dependencies = [ + "backtrace-on-stack-overflow", "ethers-solc", "hex", + "justerror", "once_cell", "paste", "rand", @@ -2423,6 +2523,7 @@ dependencies = [ "ruint", "serde", "smallvec", + "thiserror", "uuid", "z3", ] @@ -2444,7 +2545,7 @@ checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.13", + "syn 2.0.28", ] [[package]] @@ -2739,9 +2840,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.13" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c9da457c5285ac1f936ebd076af6dac17a61cfe7826f2076b4d015cf47bc8ec" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ "proc-macro2", "quote", @@ -2814,22 +2915,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 2.0.28", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 094fefa..f7b0e5e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,6 +24,9 @@ ethers-solc = { git = "https://github.com/gakonst/ethers-rs", features = ["full" paste = "1.0.12" rlp = "0.5.2" serde = "1.0.164" +backtrace-on-stack-overflow = "0.3.0" +justerror = "1.1.0" +thiserror = "1.0.44" [target.'cfg(any(target_os = "windows", target_os = "macos"))'.dependencies] z3 = {version = "0.11.2", features = ["static-link-z3"]} diff --git a/examples/simple_token.rs b/examples/simple_token.rs index f89772f..df1192f 100644 --- a/examples/simple_token.rs +++ b/examples/simple_token.rs @@ -8,7 +8,6 @@ use z3::ast::*; pub const SIMPLE_TOKEN: &str = r#"608060405234801561001057600080fd5b50600436106100415760003560e01c806327e235e314610046578063a9059cbb14610078578063f8b2cb4f1461008d575b600080fd5b610066610054366004610143565b60006020819052908152604090205481565b60405190815260200160405180910390f35b61008b610086366004610165565b6100b6565b005b61006661009b366004610143565b6001600160a01b031660009081526020819052604090205490565b336000908152602081905260409020548111156100d257600080fd5b33600090815260208190526040812080548392906100f19084906101a5565b90915550506001600160a01b0382166000908152602081905260408120805483929061011e9084906101be565b90915550505050565b80356001600160a01b038116811461013e57600080fd5b919050565b60006020828403121561015557600080fd5b61015e82610127565b9392505050565b6000806040838503121561017857600080fd5b61018183610127565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156101b8576101b861018f565b92915050565b808201808211156101b8576101b861018f56fea264697066735822122041d29a76727a31c9e4ec86703553a675712f98921d6c4bc9b23f274a963de18264736f6c63430008130033"#; fn main() { - unsafe {backtrace_on_stack_overflow::enable();} let pgm = Parser::with_pgm(SIMPLE_TOKEN).parse(); let mut evm = Evm::new(pgm); diff --git a/src/instruction/mod.rs b/src/instruction/mod.rs index 4081d4b..45c328a 100644 --- a/src/instruction/mod.rs +++ b/src/instruction/mod.rs @@ -27,7 +27,6 @@ use super::smt::*; #[Error] pub enum InstructionError { StackEmpty{ - instruction: Instruction, pc: usize, } } @@ -252,16 +251,16 @@ impl Instruction { } impl<'ctx> MachineInstruction<'ctx, 32> for Instruction { type Error = InstructionError; - fn exec(&self, mach: &EvmState) -> Result, InstructionError> { + fn exec(&self, mach: &EvmState) -> MachineRecord<32> { match self { - Instruction::Stop => Ok(MachineRecord { + Instruction::Stop => MachineRecord { halt: true, stack: None, mem: None, constraints: None, storage: None, pc: (mach.pc(), mach.pc()), - }), + }, Instruction::Add => { let stack = mach.stack(); let [stack_top, stack_top2] = stack.peek_top().unwrap(); diff --git a/src/traits.rs b/src/traits.rs index 09452bf..ce58fe8 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -43,7 +43,7 @@ pub trait Machine { pub trait MachineInstruction<'ctx, const SZ: usize> { type Error; - fn exec(&self, mach: &EvmState) -> Result, Self::Error>; + fn exec(&self, mach: &EvmState) -> MachineRecord; } pub trait MachineComponent { diff --git a/tests/lib.rs b/tests/lib.rs index 8bfcee6..3cb9306 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -33,8 +33,12 @@ fn can_run_simple_storage_pgm() { let execution = evm.exec(); let leaf = execution.states.leaves(); - assert_eq!(2, leaf.len()); - eprintln!("LEAVES: {:#?}", leaf); + + { + let leaf = execution.states.leaves(); + // as seen here https://bytegraph.xyz/bytecode/e5987a6f24f8af926faddae88de7980f/graph + assert_eq!(7, leaf.len()); + } let final_tree = leaf.get(1).unwrap().clone(); // eprintln!("FINAL TREE: {:#?}", final_tree); let mut mem_val = final_tree.val.mem_read(bvi(64));