From c0e30c61402b536ebed34e0916e1dc82b58c0fba Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Sun, 25 Feb 2024 08:25:03 -0700 Subject: [PATCH 01/11] feat: global_db --- Cargo.lock | 229 +++++++++++++------------- core/src/coprocessor.rs | 2 +- core/src/database/inspector.rs | 18 +- core/src/database/mod.rs | 8 +- core/src/environment/mod.rs | 28 +++- core/tests/environment_integration.rs | 36 ++++ 6 files changed, 187 insertions(+), 134 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 79eac064..26f1f638 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,9 +40,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if", "getrandom", @@ -100,9 +100,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4b6fb2b432ff223d513db7f908937f63c252bee0af9b82bfd25b0a5dd1eb0d8" +checksum = "ef197eb250c64962003cb08b90b17f0882c192f4a6f2f544809d424fd7cb0e7d" dependencies = [ "alloy-rlp", "bytes", @@ -159,9 +159,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" dependencies = [ "anstyle", "anstyle-parse", @@ -217,10 +217,10 @@ version = "0.4.18" dependencies = [ "Inflector", "anyhow", - "arbiter-bindings 0.1.4", - "arbiter-core 0.10.2", - "arbiter-engine 0.3.0", - "arbiter-macros 0.1.1", + "arbiter-bindings 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "arbiter-core 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", + "arbiter-engine 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "arbiter-macros 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "assert_cmd", "async-trait", "clap", @@ -244,9 +244,7 @@ dependencies = [ [[package]] name = "arbiter-bindings" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0333ea5e6f32bef018cd4a035ff0241899947d8e0c87346c868ec5d4bb51fc" +version = "0.1.6" dependencies = [ "ethers", "serde", @@ -255,6 +253,8 @@ dependencies = [ [[package]] name = "arbiter-bindings" version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7189a325b0e3e56b5e695d3c2fbe8dd70fffcb04b13678ff2be1ad2bb754a38" dependencies = [ "ethers", "serde", @@ -262,16 +262,18 @@ dependencies = [ [[package]] name = "arbiter-core" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6168baef0eb9e7c22d4b02e1edf526a4588edc97551b0cde96ec296f9b801b" +version = "0.10.3" dependencies = [ - "arbiter-bindings 0.1.4", + "arbiter-bindings 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "assert_matches", "async-stream", "async-trait", "bytes", + "cargo_metadata", + "chrono", "crossbeam-channel", "ethers", + "futures", "futures-locks", "futures-timer", "futures-util", @@ -286,23 +288,22 @@ dependencies = [ "thiserror", "tokio", "tracing", + "tracing-subscriber", "uint", ] [[package]] name = "arbiter-core" version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1761b5f12d6e4bb74264a863a0612031555817d78334513c40a0677c4ef6a596" dependencies = [ - "arbiter-bindings 0.1.4", - "assert_matches", + "arbiter-bindings 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "async-stream", "async-trait", "bytes", - "cargo_metadata", - "chrono", "crossbeam-channel", "ethers", - "futures", "futures-locks", "futures-timer", "futures-util", @@ -317,20 +318,17 @@ dependencies = [ "thiserror", "tokio", "tracing", - "tracing-subscriber", "uint", ] [[package]] name = "arbiter-engine" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc9898f9526886e1d16c677a95f257eb529c02232556925a59e1ec57e31b4d4" +version = "0.3.1" dependencies = [ "anyhow", - "arbiter-bindings 0.1.4", - "arbiter-core 0.10.2", - "arbiter-macros 0.1.1", + "arbiter-bindings 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "arbiter-core 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", + "arbiter-macros 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "async-stream", "async-trait", "crossbeam-channel", @@ -344,16 +342,20 @@ dependencies = [ "tokio-stream", "toml 0.8.10", "tracing", + "tracing-subscriber", + "tracing-test", ] [[package]] name = "arbiter-engine" version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0553d66d507f24b9a7f63b783e9a2a37edaa5d93bfc9f23a3587dfcd65c0c3a6" dependencies = [ "anyhow", - "arbiter-bindings 0.1.4", - "arbiter-core 0.10.2", - "arbiter-macros 0.1.1", + "arbiter-bindings 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "arbiter-core 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", + "arbiter-macros 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "async-stream", "async-trait", "crossbeam-channel", @@ -367,15 +369,11 @@ dependencies = [ "tokio-stream", "toml 0.8.10", "tracing", - "tracing-subscriber", - "tracing-test", ] [[package]] name = "arbiter-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a685a9ee2090c7113919cb78d9e87e294b4f65e22f43c5938c301b853b78e411" +version = "0.1.3" dependencies = [ "quote", "syn 2.0.50", @@ -384,6 +382,8 @@ dependencies = [ [[package]] name = "arbiter-macros" version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac4a04ffa19e2845c4ea58bb8470d19b13d3c95a8c846e7524d718b7dc182020" dependencies = [ "quote", "syn 2.0.50", @@ -801,9 +801,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" +checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" dependencies = [ "memchr", "regex-automata 0.4.5", @@ -818,9 +818,9 @@ checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" [[package]] name = "byte-slice-cast" @@ -886,9 +886,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d8c306be83ec04bf5f73710badd8edf56dea23f2f0d8b7f9fe4644d371c758" +checksum = "94a4bc5367b6284358d2a6a6a1dc2d92ec4b86034561c3b9d3341909752fd848" dependencies = [ "blst", "cc", @@ -924,7 +924,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.21", + "semver 1.0.22", "serde", "serde_json", "thiserror", @@ -932,11 +932,10 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "3286b845d0fccbdd15af433f61c5970e711987036cb468f437ff6badd70f4e24" dependencies = [ - "jobserver", "libc", ] @@ -957,7 +956,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.0", + "windows-targets 0.52.3", ] [[package]] @@ -1124,9 +1123,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d59688ad0945eaf6b84cb44fedbe93484c81b48970e98f09db8a22832d7961" +checksum = "efbd12d49ab0eaf8193ba9175e45f56bbc2e4b27d57b8cfe62aa47942a46b9a9" dependencies = [ "cfg-if", "cpufeatures", @@ -1779,7 +1778,7 @@ dependencies = [ "chrono", "ethers-core", "reqwest", - "semver 1.0.21", + "semver 1.0.22", "serde", "serde_json", "thiserror", @@ -1890,7 +1889,7 @@ dependencies = [ "path-slash", "rayon", "regex", - "semver 1.0.21", + "semver 1.0.22", "serde", "serde_json", "sha2", @@ -2053,7 +2052,7 @@ dependencies = [ "regex", "reqwest", "revm-primitives 1.3.0", - "semver 1.0.21", + "semver 1.0.22", "serde", "serde_json", "serde_regex", @@ -2338,9 +2337,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "379dada1584ad501b383485dd706b8afb7a70fcbc7f4da7d780638a5a6124a60" [[package]] name = "hex" @@ -2605,15 +2604,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" -[[package]] -name = "jobserver" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" -dependencies = [ - "libc", -] - [[package]] name = "js-sys" version = "0.3.68" @@ -4311,7 +4301,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b3683a40f1e94e7389c8e81e5f26bb5d30875ed0b48ab07985ec32eb6d6c712" dependencies = [ - "alloy-primitives 0.6.2", + "alloy-primitives 0.6.3", "auto_impl", "bitflags 2.4.2", "bitvec", @@ -4353,16 +4343,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if", "getrandom", "libc", "spin 0.9.8", "untrusted 0.9.0", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -4475,7 +4466,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.21", + "semver 1.0.22", ] [[package]] @@ -4498,7 +4489,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", - "ring 0.17.7", + "ring 0.17.8", "rustls-webpki", "sct", ] @@ -4518,7 +4509,7 @@ version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring 0.17.7", + "ring 0.17.8", "untrusted 0.9.0", ] @@ -4542,9 +4533,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "salsa20" @@ -4612,7 +4603,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring 0.17.7", + "ring 0.17.8", "untrusted 0.9.0", ] @@ -4659,9 +4650,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" dependencies = [ "serde", ] @@ -4902,12 +4893,12 @@ checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -5053,7 +5044,7 @@ dependencies = [ "hex", "once_cell", "reqwest", - "semver 1.0.21", + "semver 1.0.22", "serde", "serde_json", "sha2", @@ -5070,7 +5061,7 @@ checksum = "aa64b5e8eecd3a8af7cfc311e29db31a268a62d5953233d3e8243ec77a71c4e3" dependencies = [ "build_const", "hex", - "semver 1.0.21", + "semver 1.0.22", "serde_json", "svm-rs", ] @@ -5201,9 +5192,9 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if", "once_cell", @@ -5375,7 +5366,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.5", + "toml_edit 0.22.6", ] [[package]] @@ -5424,15 +5415,15 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.5" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e68c159e8f5ba8a28c4eb7b0c0c190d77bb479047ca713270048145a9ad28a" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.1", + "winnow 0.6.2", ] [[package]] @@ -5614,9 +5605,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -5871,7 +5862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ "windows-core", - "windows-targets 0.52.0", + "windows-targets 0.52.3", ] [[package]] @@ -5880,7 +5871,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.3", ] [[package]] @@ -5898,7 +5889,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.3", ] [[package]] @@ -5918,17 +5909,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.3", + "windows_aarch64_msvc 0.52.3", + "windows_i686_gnu 0.52.3", + "windows_i686_msvc 0.52.3", + "windows_x86_64_gnu 0.52.3", + "windows_x86_64_gnullvm 0.52.3", + "windows_x86_64_msvc 0.52.3", ] [[package]] @@ -5939,9 +5930,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" [[package]] name = "windows_aarch64_msvc" @@ -5951,9 +5942,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" [[package]] name = "windows_i686_gnu" @@ -5963,9 +5954,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" [[package]] name = "windows_i686_msvc" @@ -5975,9 +5966,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" [[package]] name = "windows_x86_64_gnu" @@ -5987,9 +5978,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" [[package]] name = "windows_x86_64_gnullvm" @@ -5999,9 +5990,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" [[package]] name = "windows_x86_64_msvc" @@ -6011,9 +6002,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" [[package]] name = "winnow" @@ -6026,9 +6017,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d90f4e0f530c4c69f62b80d839e9ef3855edc9cba471a160c4d692deed62b401" +checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" dependencies = [ "memchr", ] @@ -6073,9 +6064,9 @@ dependencies = [ [[package]] name = "xxhash-rust" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53be06678ed9e83edb1745eb72efc0bbcd7b5c3c35711a860906aed827a13d61" +checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" [[package]] name = "yaml-rust" diff --git a/core/src/coprocessor.rs b/core/src/coprocessor.rs index 2686d60b..b4d64c51 100644 --- a/core/src/coprocessor.rs +++ b/core/src/coprocessor.rs @@ -21,7 +21,7 @@ pub struct Coprocessor<'a> { impl<'a> Coprocessor<'a> { /// Create a new `Coprocessor` with the given `Environment`. pub fn new(environment: &Environment) -> Self { - let db = environment.db.clone(); + let db = environment.tip_db.clone(); let evm = Evm::builder().with_db(db).build(); Self { evm } } diff --git a/core/src/database/inspector.rs b/core/src/database/inspector.rs index 51f80e17..f40e8379 100644 --- a/core/src/database/inspector.rs +++ b/core/src/database/inspector.rs @@ -42,16 +42,16 @@ impl ArbiterInspector { } } -impl Inspector for ArbiterInspector { +impl Inspector for ArbiterInspector { #[inline] - fn initialize_interp(&mut self, interp: &mut Interpreter, context: &mut EvmContext) { + fn initialize_interp(&mut self, interp: &mut Interpreter, context: &mut EvmContext) { if let Some(gas) = &mut self.gas { gas.initialize_interp(interp, context); } } #[inline] - fn step_end(&mut self, interp: &mut Interpreter, context: &mut EvmContext) { + fn step_end(&mut self, interp: &mut Interpreter, context: &mut EvmContext) { if let Some(gas) = &mut self.gas { gas.step_end(interp, context); } @@ -60,7 +60,7 @@ impl Inspector for ArbiterInspector { #[inline] fn call( &mut self, - context: &mut EvmContext, + context: &mut EvmContext, inputs: &mut CallInputs, return_memory_offset: Range, ) -> Option { @@ -74,7 +74,7 @@ impl Inspector for ArbiterInspector { #[inline] fn call_end( &mut self, - context: &mut EvmContext, + context: &mut EvmContext, inputs: &CallInputs, outcome: CallOutcome, ) -> CallOutcome { @@ -88,10 +88,16 @@ impl Inspector for ArbiterInspector { #[inline] fn create_end( &mut self, - _context: &mut EvmContext, + _context: &mut EvmContext, _inputs: &CreateInputs, outcome: CreateOutcome, ) -> CreateOutcome { outcome } + + #[inline] + fn log(&mut self, context: &mut EvmContext, log: &Log) { + let mut db = context.db.0.write().unwrap(); + db.logs.push(log.clone()); + } } diff --git a/core/src/database/mod.rs b/core/src/database/mod.rs index 10e9ab1a..99890b41 100644 --- a/core/src/database/mod.rs +++ b/core/src/database/mod.rs @@ -24,9 +24,15 @@ pub mod inspector; /// A [`ArbiterDB`] is a wrapper around a [`CacheDB`] that is used to provide /// access to the [`environment::Environment`]'s database to multiple /// [`coprocessor::Coprocessor`]s. -#[derive(Clone, Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize)] pub struct ArbiterDB(pub Arc>>); +impl Clone for ArbiterDB { + fn clone(&self) -> Self { + Self(self.0.clone()) + } +} + impl ArbiterDB { /// Create a new `ArbiterDB`. pub fn new() -> Self { diff --git a/core/src/environment/mod.rs b/core/src/environment/mod.rs index a4ba178c..c880c13d 100644 --- a/core/src/environment/mod.rs +++ b/core/src/environment/mod.rs @@ -72,7 +72,9 @@ pub struct Environment { /// The [`EVM`] that is used as an execution environment and database for /// calls and transactions. - pub(crate) db: ArbiterDB, + pub(crate) tip_db: ArbiterDB, + + pub global_db: Arc>>>, inspector: Option, @@ -196,7 +198,8 @@ impl Environment { socket, inspector, parameters, - db, + tip_db: db, + global_db: Arc::new(RwLock::new(BTreeMap::new())), handle: None, } } @@ -208,7 +211,8 @@ impl Environment { let label = self.parameters.label.clone(); // Bring in the EVM db by cloning the interior Arc (lightweight). - let db = self.db.clone(); + let db = self.tip_db.clone(); + let global_db = self.global_db.clone(); // Bring in the EVM ENV let mut env = Env::default(); @@ -273,12 +277,20 @@ impl Environment { outcome_sender, } => { // Return the old block data in a `ReceiptData` + let old_block_number = evm.block().number; let receipt_data = ReceiptData { - block_number: convert_uint_to_u64(evm.block().number).unwrap(), + block_number: convert_uint_to_u64(old_block_number).unwrap(), transaction_index, cumulative_gas_per_block, }; - outcome_sender.send(Ok(Outcome::BlockUpdateCompleted(receipt_data)))?; + + let mut db = evm.context.evm.db.0.write().unwrap(); + global_db + .write() + .unwrap() + .insert(old_block_number, db.clone()); + db.logs.clear(); + drop(db); // Update the block number and timestamp evm.block_mut().number = U256::from_limbs(block_number.0); @@ -287,6 +299,9 @@ impl Environment { // Reset the counters. transaction_index = U64::from(0); cumulative_gas_per_block = eU256::from(0); + + // Return the old block data in a `ReceiptData` after the block update. + outcome_sender.send(Ok(Outcome::BlockUpdateCompleted(receipt_data)))?; } Instruction::Cheatcode { cheatcode, @@ -455,8 +470,7 @@ impl Environment { continue; } }; - cumulative_gas_per_block += - eU256::from(execution_result.clone().gas_used()); + cumulative_gas_per_block += eU256::from(execution_result.gas_used()); let block_number = convert_uint_to_u64(evm.block().number)?; let receipt_data = ReceiptData { block_number, diff --git a/core/tests/environment_integration.rs b/core/tests/environment_integration.rs index 29eed338..c0dbc4de 100644 --- a/core/tests/environment_integration.rs +++ b/core/tests/environment_integration.rs @@ -148,3 +148,39 @@ async fn env_returns_db() { let db = environment.stop().unwrap(); assert!(!db.0.read().unwrap().accounts.is_empty()) } + +#[tokio::test] +async fn block_logs() { + let (environment, client) = startup(); + let global_db = environment.global_db.clone(); + + let arbiter_token = deploy_arbx(client.clone()).await; + arbiter_token + .mint(Address::zero(), eU256::from(1000)) + .send() + .await + .unwrap() + .await + .unwrap(); + + println!("Global DB: {:?}\n", global_db.read().unwrap()); + + // UPDATE BLOCK + let new_block_number = 69; + let new_block_timestamp = 420; + + client + .update_block(new_block_number, new_block_timestamp) + .unwrap(); + println!("Global DB: {:?}\n", global_db.read().unwrap()); + + arbiter_token + .approve(Address::zero(), eU256::from(1000)) + .send() + .await + .unwrap() + .await + .unwrap(); + client.update_block(6969, 420420).unwrap(); + println!("Global DB: {:?}\n", global_db.read().unwrap()); +} From 3c80448bd1199aca5e870f48d73e1d2a9699e4fb Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Tue, 27 Feb 2024 10:01:25 -0700 Subject: [PATCH 02/11] simpler way to collect just logs --- core/src/coprocessor.rs | 2 +- core/src/database/inspector.rs | 6 ----- core/src/environment/mod.rs | 49 ++++++++++++++++++++++------------ core/src/lib.rs | 2 +- 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/core/src/coprocessor.rs b/core/src/coprocessor.rs index b4d64c51..2686d60b 100644 --- a/core/src/coprocessor.rs +++ b/core/src/coprocessor.rs @@ -21,7 +21,7 @@ pub struct Coprocessor<'a> { impl<'a> Coprocessor<'a> { /// Create a new `Coprocessor` with the given `Environment`. pub fn new(environment: &Environment) -> Self { - let db = environment.tip_db.clone(); + let db = environment.db.clone(); let evm = Evm::builder().with_db(db).build(); Self { evm } } diff --git a/core/src/database/inspector.rs b/core/src/database/inspector.rs index f40e8379..c1c1a22c 100644 --- a/core/src/database/inspector.rs +++ b/core/src/database/inspector.rs @@ -94,10 +94,4 @@ impl Inspector for ArbiterInspector { ) -> CreateOutcome { outcome } - - #[inline] - fn log(&mut self, context: &mut EvmContext, log: &Log) { - let mut db = context.db.0.write().unwrap(); - db.logs.push(log.clone()); - } } diff --git a/core/src/environment/mod.rs b/core/src/environment/mod.rs index c880c13d..d818976d 100644 --- a/core/src/environment/mod.rs +++ b/core/src/environment/mod.rs @@ -33,7 +33,10 @@ use super::*; #[cfg_attr(doc, allow(unused_imports))] #[cfg(doc)] use crate::middleware::ArbiterMiddleware; -use crate::{console::abi::HardhatConsoleCalls, database::inspector::ArbiterInspector}; +use crate::{ + console::abi::HardhatConsoleCalls, database::inspector::ArbiterInspector, + middleware::connection::revm_logs_to_ethers_logs, +}; pub mod instruction; use instruction::*; @@ -72,9 +75,9 @@ pub struct Environment { /// The [`EVM`] that is used as an execution environment and database for /// calls and transactions. - pub(crate) tip_db: ArbiterDB, + pub(crate) db: ArbiterDB, - pub global_db: Arc>>>, + pub(crate) log_storage: Arc>>>, inspector: Option, @@ -198,8 +201,8 @@ impl Environment { socket, inspector, parameters, - tip_db: db, - global_db: Arc::new(RwLock::new(BTreeMap::new())), + db, + log_storage: Arc::new(RwLock::new(BTreeMap::new())), handle: None, } } @@ -210,9 +213,9 @@ impl Environment { // Bring in parameters for the `Environment`. let label = self.parameters.label.clone(); - // Bring in the EVM db by cloning the interior Arc (lightweight). - let db = self.tip_db.clone(); - let global_db = self.global_db.clone(); + // Bring in the EVM db and log storage by cloning the interior Arc (lightweight). + let db = self.db.clone(); + let log_storage = self.log_storage.clone(); // Bring in the EVM ENV let mut env = Env::default(); @@ -284,14 +287,6 @@ impl Environment { cumulative_gas_per_block, }; - let mut db = evm.context.evm.db.0.write().unwrap(); - global_db - .write() - .unwrap() - .insert(old_block_number, db.clone()); - db.logs.clear(); - drop(db); - // Update the block number and timestamp evm.block_mut().number = U256::from_limbs(block_number.0); evm.block_mut().timestamp = U256::from_limbs(block_timestamp.0); @@ -423,7 +418,6 @@ impl Environment { // Set the tx_env and prepare to process it *evm.tx_mut() = tx_env; - // TODO: Is `transact()` the function we want? let result = evm.transact()?.result; if let Some(console_log) = &mut evm.context.external.console_log { @@ -477,6 +471,27 @@ impl Environment { transaction_index, cumulative_gas_per_block, }; + + // TODO: Don't unwrap this. + let mut logs = log_storage.write().unwrap(); + match logs.get_mut(&evm.block().number) { + Some(log_vec) => { + log_vec.extend(revm_logs_to_ethers_logs( + execution_result.logs(), + &receipt_data, + )); + } + None => { + logs.insert( + evm.block().number, + revm_logs_to_ethers_logs( + execution_result.logs(), + &receipt_data, + ), + ); + } + } + match event_broadcaster.send(Broadcast::Event( execution_result.logs(), receipt_data.clone(), diff --git a/core/src/lib.rs b/core/src/lib.rs index 8a9399e2..b8cab2c2 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -46,7 +46,7 @@ use std::{ }; use async_trait::async_trait; -use ethers::types::{Address as eAddress, Filter, H256, U256 as eU256, U64}; +use ethers::types::{Address as eAddress, Filter, Log as eLog, H256, U256 as eU256, U64}; use revm::{ db::{CacheDB, EmptyDB}, interpreter::{CallInputs, CallOutcome}, From 55cf847501be3f967c314426124e6ade817ad4e5 Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Tue, 27 Feb 2024 10:19:05 -0700 Subject: [PATCH 03/11] prepped to implement --- core/src/environment/instruction.rs | 6 ++++++ core/src/environment/mod.rs | 31 ++++++++++++++++++++++++++++- core/src/middleware/mod.rs | 8 ++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/core/src/environment/instruction.rs b/core/src/environment/instruction.rs index e9e159e8..f6fd2473 100644 --- a/core/src/environment/instruction.rs +++ b/core/src/environment/instruction.rs @@ -161,6 +161,12 @@ pub(crate) enum EnvironmentData { // TODO: Rename this to `Nonce`? /// The query is for the nonce of an account given by the inner `Address`. TransactionCount(eAddress), + + /// Query for logs in a range of blocks. + Logs { + /// The filter to use to query for logs + filter: Filter, + }, } /// [`ReceiptData`] is a structure that holds the block number, transaction diff --git a/core/src/environment/mod.rs b/core/src/environment/mod.rs index d818976d..7006cf1f 100644 --- a/core/src/environment/mod.rs +++ b/core/src/environment/mod.rs @@ -540,7 +540,6 @@ impl Environment { None => Err(ArbiterCoreError::AccountDoesNotExistError), } } - EnvironmentData::TransactionCount(address) => { let db = &mut evm.context.evm.db; match db @@ -556,6 +555,36 @@ impl Environment { None => Err(ArbiterCoreError::AccountDoesNotExistError), } } + EnvironmentData::Logs { filter } => { + let logs = log_storage.read().unwrap(); + let from_block = U256::from( + filter + .block_option + .get_from_block() + .ok_or(ArbiterCoreError::MissingDataError)? + .as_number() + .ok_or(ArbiterCoreError::MissingDataError)? + .0[0], + ); + let to_block = U256::from( + filter + .block_option + .get_from_block() + .ok_or(ArbiterCoreError::MissingDataError)? + .as_number() + .ok_or(ArbiterCoreError::MissingDataError)? + .0[0], + ); + let mut return_logs = Vec::new(); + logs.keys().for_each(|blocknum| { + if blocknum >= &from_block && blocknum <= &to_block { + return_logs.extend(logs.get(blocknum).cloned().unwrap()); + } + }); + Ok(Outcome::QueryReturn( + serde_json::to_string(&return_logs).unwrap(), + )) + } }; outcome_sender.send(outcome)?; } diff --git a/core/src/middleware/mod.rs b/core/src/middleware/mod.rs index 42bd5224..1daed145 100644 --- a/core/src/middleware/mod.rs +++ b/core/src/middleware/mod.rs @@ -27,8 +27,8 @@ use ethers::{ signers::{Signer, Wallet}, types::{ transaction::{eip2718::TypedTransaction, eip712::Eip712}, - Address as eAddress, BlockId, Bloom, Bytes as eBytes, FilteredParams, Log as eLog, - NameOrAddress, Signature, Transaction, TransactionReceipt, + Address as eAddress, BlockId, Bloom, Bytes as eBytes, FilteredParams, NameOrAddress, + Signature, Transaction, TransactionReceipt, }, }; use futures_timer::Delay; @@ -709,6 +709,10 @@ impl Middleware for ArbiterMiddleware { Ok(id) } + async fn get_logs(&self, filter: &Filter) -> Result, Self::Error> { + todo!() + } + /// Starts watching for logs that match a specific filter. /// /// This method creates a filter watcher that continuously checks for new From 6c44aff9c9de535bb23f74c6aa0d1277252302cc Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Tue, 27 Feb 2024 10:36:43 -0700 Subject: [PATCH 04/11] filter on logs --- core/src/environment/mod.rs | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/core/src/environment/mod.rs b/core/src/environment/mod.rs index 7006cf1f..c27139b5 100644 --- a/core/src/environment/mod.rs +++ b/core/src/environment/mod.rs @@ -20,7 +20,7 @@ use std::thread::{self, JoinHandle}; use crossbeam_channel::{bounded, unbounded, Receiver, Sender}; -use ethers::abi::AbiDecode; +use ethers::{abi::AbiDecode, types::ValueOrArray}; use revm::{ db::AccountState, inspector_handle_register, @@ -581,6 +581,34 @@ impl Environment { return_logs.extend(logs.get(blocknum).cloned().unwrap()); } }); + return_logs.retain(|log| { + filter.topics.iter().any(|topic_option| match topic_option { + Some(topic_val_or_array) => match topic_val_or_array { + ValueOrArray::Value(topic) => match topic { + Some(topic) => log.topics.contains(topic), + None => true, + }, + ValueOrArray::Array(topics) => { + topics.iter().any(|topic| match topic { + Some(topic) => log.topics.contains(topic), + None => true, + }) + } + }, + None => true, + }) + }); + return_logs.retain(|log| { + filter.address.iter().any(|address_value_or_array| { + match address_value_or_array { + ValueOrArray::Value(address) => &log.address == address, + + ValueOrArray::Array(addresses) => { + addresses.iter().any(|addr| &log.address == addr) + } + } + }) + }); Ok(Outcome::QueryReturn( serde_json::to_string(&return_logs).unwrap(), )) From 135dc598e447bf928920ef85dbf5602baee1c2f5 Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Tue, 27 Feb 2024 10:41:18 -0700 Subject: [PATCH 05/11] feat: --- core/src/environment/instruction.rs | 1 + core/src/middleware/mod.rs | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/core/src/environment/instruction.rs b/core/src/environment/instruction.rs index f6fd2473..e655a6bf 100644 --- a/core/src/environment/instruction.rs +++ b/core/src/environment/instruction.rs @@ -145,6 +145,7 @@ pub(crate) enum Outcome { /// Currently this may be the block number, block timestamp, gas price, or /// balance of an account. #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[allow(clippy::large_enum_variant)] pub(crate) enum EnvironmentData { /// The query is for the block number of the [`EVM`]. BlockNumber, diff --git a/core/src/middleware/mod.rs b/core/src/middleware/mod.rs index 1daed145..69cb0f16 100644 --- a/core/src/middleware/mod.rs +++ b/core/src/middleware/mod.rs @@ -710,7 +710,25 @@ impl Middleware for ArbiterMiddleware { } async fn get_logs(&self, filter: &Filter) -> Result, Self::Error> { - todo!() + let provider = self.provider.as_ref(); + provider + .instruction_sender + .upgrade() + .ok_or(ArbiterCoreError::UpgradeSenderError)? + .send(Instruction::Query { + environment_data: EnvironmentData::Logs { + filter: filter.clone(), + }, + outcome_sender: provider.outcome_sender.clone(), + })?; + let outcome = provider.outcome_receiver.recv()??; + match outcome { + Outcome::QueryReturn(outcome) => { + let logs: Vec = serde_json::from_str(outcome.as_ref())?; + Ok(logs) + } + _ => unreachable!(), + } } /// Starts watching for logs that match a specific filter. From 93ff285ba14604f5719c753195e6dd324ec43e56 Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Tue, 27 Feb 2024 11:00:30 -0700 Subject: [PATCH 06/11] fix test --- core/src/environment/mod.rs | 2 +- core/tests/middleware_integration.rs | 36 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/core/src/environment/mod.rs b/core/src/environment/mod.rs index c27139b5..a171e706 100644 --- a/core/src/environment/mod.rs +++ b/core/src/environment/mod.rs @@ -569,7 +569,7 @@ impl Environment { let to_block = U256::from( filter .block_option - .get_from_block() + .get_to_block() .ok_or(ArbiterCoreError::MissingDataError)? .as_number() .ok_or(ArbiterCoreError::MissingDataError)? diff --git a/core/tests/middleware_integration.rs b/core/tests/middleware_integration.rs index e9d95f42..c1705cfe 100644 --- a/core/tests/middleware_integration.rs +++ b/core/tests/middleware_integration.rs @@ -625,3 +625,39 @@ async fn stream_with_meta() { assert_eq!(format!("{:?}", stream.next().await), "Some(Ok((ApprovalFilter(ApprovalFilter { owner: 0x2efdc9eecfee3a776209fcb8e9a83a6b221d74f5, spender: 0x2efdc9eecfee3a776209fcb8e9a83a6b221d74f5, amount: 1 }), LogMeta { address: 0x067ea9e44c76a2620f10b39a1b51d5124a299192, block_number: 0, block_hash: 0x0000000000000000000000000000000000000000000000000000000000000000, transaction_hash: 0x0000000000000000000000000000000000000000000000000000000000000000, transaction_index: 2, log_index: 0 })))"); assert_eq!(format!("{:?}", stream.next().await), "Some(Ok((ApprovalFilter(ApprovalFilter { owner: 0x2efdc9eecfee3a776209fcb8e9a83a6b221d74f5, spender: 0x2efdc9eecfee3a776209fcb8e9a83a6b221d74f5, amount: 1 }), LogMeta { address: 0x067ea9e44c76a2620f10b39a1b51d5124a299192, block_number: 1, block_hash: 0x0000000000000000000000000000000000000000000000000000000000000000, transaction_hash: 0x0000000000000000000000000000000000000000000000000000000000000000, transaction_index: 0, log_index: 0 })))"); } + +#[tokio::test] +async fn get_logs() { + let (_environment, client) = startup(); + + let arbx = deploy_arbx(client.clone()).await; + + for _ in 0..2 { + arbx.approve(client.address(), eU256::from(1)) + .send() + .await + .unwrap() + .await + .unwrap(); + } + + client.update_block(1, 1).unwrap(); + + arbx.approve(client.address(), eU256::from(1)) + .send() + .await + .unwrap() + .await + .unwrap(); + + let filter = arbx + .approval_filter() + .filter + .from_block(0) + .to_block(1) + .address(arbx.address()); + println!("filter: {:#?}", filter); + let logs = client.get_logs(&filter).await.unwrap(); + println!("logs: {:#?}", logs); + assert_eq!(logs.len(), 3); +} From 72bff89feb570fae8fe293a47a21fe124c47fcd7 Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Wed, 28 Feb 2024 17:12:40 -0700 Subject: [PATCH 07/11] refactor: `ArbiterDB` and `Environment` --- core/src/database/mod.rs | 59 +++++++++++++++++++++++---------- core/src/environment/mod.rs | 66 +++++++++++++++---------------------- core/src/errors.rs | 11 +++++++ 3 files changed, 80 insertions(+), 56 deletions(-) diff --git a/core/src/database/mod.rs b/core/src/database/mod.rs index 99890b41..5bba5204 100644 --- a/core/src/database/mod.rs +++ b/core/src/database/mod.rs @@ -21,25 +21,41 @@ use super::*; pub mod fork; pub mod inspector; -/// A [`ArbiterDB`] is a wrapper around a [`CacheDB`] that is used to provide -/// access to the [`environment::Environment`]'s database to multiple +/// A [`ArbiterDB`] is contains both a [`CacheDB`] that is used to provide +/// state for the [`environment::Environment`]'s as well as for multiple /// [`coprocessor::Coprocessor`]s. +/// The `logs` field is a [`BTreeMap`] to store [`ethers::types::Log`]s that can be queried from at any point. #[derive(Debug, Serialize, Deserialize)] -pub struct ArbiterDB(pub Arc>>); +pub struct ArbiterDB { + /// The state of the `ArbiterDB`. This is a `CacheDB` that is used to provide + /// a db for the `Environment` to use. + pub state: Arc>>, + + /// The logs of the `ArbiterDB`. This is a `BTreeMap` that is used to store + /// logs that can be queried from at any point. + pub logs: Arc>>>, +} +// Implement `Clone` by hand so we utilize the `Arc`'s `Clone` implementation. impl Clone for ArbiterDB { fn clone(&self) -> Self { - Self(self.0.clone()) + Self { + state: self.state.clone(), + logs: self.logs.clone(), + } } } impl ArbiterDB { /// Create a new `ArbiterDB`. pub fn new() -> Self { - Self(Arc::new(RwLock::new(CacheDB::new(EmptyDB::new())))) + Self { + state: Arc::new(RwLock::new(CacheDB::new(EmptyDB::new()))), + logs: Arc::new(RwLock::new(BTreeMap::new())), + } } - /// Write the `ArbiterDB` to a file at the given path. + /// Write the `ArbiterDB` to a file at the given path.`` pub fn write_to_file(&self, path: &str) -> io::Result<()> { // Serialize the ArbiterDB let serialized = serde_json::to_string(self)?; @@ -55,9 +71,18 @@ impl ArbiterDB { let mut file = fs::File::open(path)?; let mut contents = String::new(); file.read_to_string(&mut contents)?; + // Deserialize the content into ArbiterDB - let cache_db = serde_json::from_str(&contents)?; - Ok(Self(Arc::new(RwLock::new(cache_db)))) + #[derive(Deserialize)] + struct TempDB { + state: Option>, + logs: Option>>, + } + let temp_db: TempDB = serde_json::from_str(&contents)?; + Ok(Self { + state: Arc::new(RwLock::new(temp_db.state.unwrap_or_default())), + logs: Arc::new(RwLock::new(temp_db.logs.unwrap_or_default())), + }) } } @@ -83,11 +108,11 @@ impl Database for ArbiterDB { &mut self, address: revm::primitives::Address, ) -> Result, Self::Error> { - self.0.write().unwrap().basic(address) + self.state.write().unwrap().basic(address) } fn code_by_hash(&mut self, code_hash: B256) -> Result { - self.0.write().unwrap().code_by_hash(code_hash) + self.state.write().unwrap().code_by_hash(code_hash) } fn storage( @@ -95,11 +120,11 @@ impl Database for ArbiterDB { address: revm::primitives::Address, index: U256, ) -> Result { - self.0.write().unwrap().storage(address, index) + self.state.write().unwrap().storage(address, index) } fn block_hash(&mut self, number: U256) -> Result { - self.0.write().unwrap().block_hash(number) + self.state.write().unwrap().block_hash(number) } } @@ -110,11 +135,11 @@ impl DatabaseRef for ArbiterDB { &self, address: revm::primitives::Address, ) -> Result, Self::Error> { - self.0.read().unwrap().basic_ref(address) + self.state.read().unwrap().basic_ref(address) } fn code_by_hash_ref(&self, code_hash: B256) -> Result { - self.0.read().unwrap().code_by_hash_ref(code_hash) + self.state.read().unwrap().code_by_hash_ref(code_hash) } fn storage_ref( @@ -122,11 +147,11 @@ impl DatabaseRef for ArbiterDB { address: revm::primitives::Address, index: U256, ) -> Result { - self.0.read().unwrap().storage_ref(address, index) + self.state.read().unwrap().storage_ref(address, index) } fn block_hash_ref(&self, number: U256) -> Result { - self.0.read().unwrap().block_hash_ref(number) + self.state.read().unwrap().block_hash_ref(number) } } @@ -135,7 +160,7 @@ impl DatabaseCommit for ArbiterDB { &mut self, changes: hashbrown::HashMap, ) { - self.0.write().unwrap().commit(changes) + self.state.write().unwrap().commit(changes) } } diff --git a/core/src/environment/mod.rs b/core/src/environment/mod.rs index a171e706..9289f95a 100644 --- a/core/src/environment/mod.rs +++ b/core/src/environment/mod.rs @@ -77,8 +77,6 @@ pub struct Environment { /// calls and transactions. pub(crate) db: ArbiterDB, - pub(crate) log_storage: Arc>>>, - inspector: Option, /// This gives a means of letting the "outside world" connect to the @@ -147,10 +145,22 @@ impl EnvironmentBuilder { self } - /// Sets the database for the [`Environment`]. This can come from a - /// [`fork::Fork`]. - pub fn with_db(mut self, db: impl Into>) -> Self { - self.db = ArbiterDB(Arc::new(RwLock::new(db.into()))); + /// Sets the state for the [`Environment`]. This can come from a saved state of a simulation + /// or a [`database::fork::Fork`]. + pub fn with_state(mut self, state: impl Into>) -> Self { + self.db.state = Arc::new(RwLock::new(state.into())); + self + } + + /// Sets the logs for the [`Environment`]. This can come from a saved state of a simulation and can be useful for doing analysis. + pub fn with_logs(mut self, logs: impl Into>>) -> Self { + self.db.logs = Arc::new(RwLock::new(logs.into())); + self + } + + /// Sets the entire database for the [`Environment`] including both the state and logs. This can come from the saved state of a simulation and can be useful for doing analysis. + pub fn with_arbiter_db(mut self, db: ArbiterDB) -> Self { + self.db = db; self } @@ -175,7 +185,7 @@ impl Environment { pub fn builder() -> EnvironmentBuilder { EnvironmentBuilder { parameters: EnvironmentParameters::default(), - db: ArbiterDB(Arc::new(RwLock::new(CacheDB::new(EmptyDB::new())))), + db: ArbiterDB::default(), } } @@ -202,7 +212,6 @@ impl Environment { inspector, parameters, db, - log_storage: Arc::new(RwLock::new(BTreeMap::new())), handle: None, } } @@ -215,7 +224,6 @@ impl Environment { // Bring in the EVM db and log storage by cloning the interior Arc (lightweight). let db = self.db.clone(); - let log_storage = self.log_storage.clone(); // Bring in the EVM ENV let mut env = Env::default(); @@ -232,7 +240,7 @@ impl Environment { let handle = thread::spawn(move || { // Create a new EVM builder let mut evm = Evm::builder() - .with_db(db) + .with_db(db.clone()) .with_env(Box::new(env)) .with_external_context(inspector) .append_handler_register(inspector_handle_register) @@ -260,14 +268,7 @@ impl Environment { account_state: AccountState::None, storage: HashMap::new(), }; - let db = &mut evm.context.evm.db; - match db - .0 - .write() - .unwrap() - .accounts - .insert(recast_address, account) - { + match db.state.write()?.accounts.insert(recast_address, account) { None => outcome_sender.send(Ok(Outcome::AddAccountCompleted))?, Some(_) => { outcome_sender.send(Err(ArbiterCoreError::AccountCreationError))?; @@ -307,13 +308,11 @@ impl Environment { key, block: _, } => { - let db = &mut evm.context.evm.db; - let recast_address = Address::from(account.as_fixed_bytes()); let recast_key = B256::from(key.as_fixed_bytes()).into(); // Get the account storage value at the key in the db. - match db.0.write().unwrap().accounts.get_mut(&recast_address) { + match db.state.write().unwrap().accounts.get_mut(&recast_address) { Some(account) => { // Returns zero if the account is missing. let value: U256 = match account.storage.get::(&recast_key) @@ -336,16 +335,13 @@ impl Environment { key, value, } => { - // Get the underlying database - let db = &mut evm.context.evm.db; - let recast_address = Address::from(account.as_fixed_bytes()); let recast_key = B256::from(key.as_fixed_bytes()); let recast_value = B256::from(value.as_fixed_bytes()); // Mutate the db by inserting the new key-value pair into the account's // storage and send the successful CheatcodeCompleted outcome. - match db.0.write().unwrap().accounts.get_mut(&recast_address) { + match db.state.write().unwrap().accounts.get_mut(&recast_address) { Some(account) => { account .storage @@ -362,9 +358,8 @@ impl Environment { }; } Cheatcodes::Deal { address, amount } => { - let db = &mut evm.context.evm.db; let recast_address = Address::from(address.as_fixed_bytes()); - match db.0.write().unwrap().accounts.get_mut(&recast_address) { + match db.state.write().unwrap().accounts.get_mut(&recast_address) { Some(account) => { account.info.balance += U256::from_limbs(amount.0); outcome_sender.send(Ok(Outcome::CheatcodeReturn( @@ -378,10 +373,8 @@ impl Environment { }; } Cheatcodes::Access { address } => { - let db = &mut evm.context.evm.db; let recast_address = Address::from(address.as_fixed_bytes()); - - match db.0.write().unwrap().accounts.get(&recast_address) { + match db.state.write().unwrap().accounts.get(&recast_address) { Some(account) => { let account_state = match account.account_state { AccountState::None => AccountStateSerializable::None, @@ -472,8 +465,7 @@ impl Environment { cumulative_gas_per_block, }; - // TODO: Don't unwrap this. - let mut logs = log_storage.write().unwrap(); + let mut logs = db.logs.write()?; match logs.get_mut(&evm.block().number) { Some(log_vec) => { log_vec.extend(revm_logs_to_ethers_logs( @@ -525,10 +517,8 @@ impl Environment { Ok(Outcome::QueryReturn(evm.tx().gas_price.to_string())) } EnvironmentData::Balance(address) => { - // This unwrap should never fail. - let db = &mut evm.context.evm.db; match db - .0 + .state .read() .unwrap() .accounts @@ -541,9 +531,8 @@ impl Environment { } } EnvironmentData::TransactionCount(address) => { - let db = &mut evm.context.evm.db; match db - .0 + .state .read() .unwrap() .accounts @@ -556,7 +545,7 @@ impl Environment { } } EnvironmentData::Logs { filter } => { - let logs = log_storage.read().unwrap(); + let logs = db.logs.read().unwrap(); let from_block = U256::from( filter .block_option @@ -623,7 +612,6 @@ impl Environment { warn!("Stop signal was not sent to any listeners. Are there any listeners?") } } - let (db, _) = evm.into_db_and_env_with_handler_cfg(); outcome_sender.send(Ok(Outcome::StopCompleted(db)))?; break; } diff --git a/core/src/errors.rs b/core/src/errors.rs index 3a67728a..d9e33299 100644 --- a/core/src/errors.rs +++ b/core/src/errors.rs @@ -1,6 +1,8 @@ //! Errors that can occur when managing or interfacing with Arbiter's sandboxed //! Ethereum environment. +use std::sync::{PoisonError, RwLockWriteGuard}; + // use crossbeam_channel::SendError; use crossbeam_channel::{RecvError, SendError}; use ethers::{ @@ -101,6 +103,9 @@ pub enum ArbiterCoreError { /// Failed to reply to instruction. #[error("{0}")] ReplyError(String), + + #[error("{0}")] + RwLockError(String), } impl From>> for ArbiterCoreError { @@ -109,6 +114,12 @@ impl From>> for ArbiterCoreError { } } +impl From>> for ArbiterCoreError { + fn from(e: PoisonError>) -> Self { + ArbiterCoreError::RwLockError(e.to_string()) + } +} + impl MiddlewareError for ArbiterCoreError { type Inner = ProviderError; From 73c0f7301d7095796f2bb263d22d14919996e221 Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Wed, 28 Feb 2024 17:25:32 -0700 Subject: [PATCH 08/11] remove some unwraps --- core/src/environment/mod.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/core/src/environment/mod.rs b/core/src/environment/mod.rs index 9289f95a..90fec692 100644 --- a/core/src/environment/mod.rs +++ b/core/src/environment/mod.rs @@ -258,10 +258,7 @@ impl Environment { label ); match instruction { - Instruction::AddAccount { - address, - outcome_sender, - } => { + Instruction::AddAccount { address, .. } => { let recast_address = Address::from(address.as_fixed_bytes()); let account = revm::db::DbAccount { info: AccountInfo::default(), @@ -283,7 +280,7 @@ impl Environment { // Return the old block data in a `ReceiptData` let old_block_number = evm.block().number; let receipt_data = ReceiptData { - block_number: convert_uint_to_u64(old_block_number).unwrap(), + block_number: convert_uint_to_u64(old_block_number)?, transaction_index, cumulative_gas_per_block, }; @@ -312,7 +309,7 @@ impl Environment { let recast_key = B256::from(key.as_fixed_bytes()).into(); // Get the account storage value at the key in the db. - match db.state.write().unwrap().accounts.get_mut(&recast_address) { + match db.state.write()?.accounts.get_mut(&recast_address) { Some(account) => { // Returns zero if the account is missing. let value: U256 = match account.storage.get::(&recast_key) @@ -341,7 +338,7 @@ impl Environment { // Mutate the db by inserting the new key-value pair into the account's // storage and send the successful CheatcodeCompleted outcome. - match db.state.write().unwrap().accounts.get_mut(&recast_address) { + match db.state.write()?.accounts.get_mut(&recast_address) { Some(account) => { account .storage @@ -359,7 +356,7 @@ impl Environment { } Cheatcodes::Deal { address, amount } => { let recast_address = Address::from(address.as_fixed_bytes()); - match db.state.write().unwrap().accounts.get_mut(&recast_address) { + match db.state.write()?.accounts.get_mut(&recast_address) { Some(account) => { account.info.balance += U256::from_limbs(amount.0); outcome_sender.send(Ok(Outcome::CheatcodeReturn( @@ -374,7 +371,7 @@ impl Environment { } Cheatcodes::Access { address } => { let recast_address = Address::from(address.as_fixed_bytes()); - match db.state.write().unwrap().accounts.get(&recast_address) { + match db.state.write()?.accounts.get(&recast_address) { Some(account) => { let account_state = match account.account_state { AccountState::None => AccountStateSerializable::None, @@ -415,6 +412,8 @@ impl Environment { if let Some(console_log) = &mut evm.context.external.console_log { console_log.0.drain(..).for_each(|log| { + // This unwrap is safe because the logs are guaranteed to be + // `HardhatConsoleCalls` by the `ArbiterInspector`. trace!( "Console logs: {:?}", HardhatConsoleCalls::decode(log).unwrap().to_string() @@ -444,6 +443,8 @@ impl Environment { Ok(result) => { if let Some(console_log) = &mut evm.context.external.console_log { console_log.0.drain(..).for_each(|log| { + // This unwrap is safe because the logs are guaranteed to be + // `HardhatConsoleCalls` by the `ArbiterInspector`. trace!( "Console logs: {:?}", HardhatConsoleCalls::decode(log).unwrap().to_string() From e91a13ec3b39841d836e461005eae1feaa1c5f26 Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Wed, 28 Feb 2024 17:39:20 -0700 Subject: [PATCH 09/11] fix tests --- core/src/environment/mod.rs | 5 ++++- core/src/errors.rs | 1 + core/tests/environment_integration.rs | 21 +++++++++++--------- examples/minter/behaviors/token_admin.rs | 4 ++-- examples/minter/behaviors/token_requester.rs | 4 ++-- examples/template | 2 +- 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/core/src/environment/mod.rs b/core/src/environment/mod.rs index 90fec692..cd6a9730 100644 --- a/core/src/environment/mod.rs +++ b/core/src/environment/mod.rs @@ -258,7 +258,10 @@ impl Environment { label ); match instruction { - Instruction::AddAccount { address, .. } => { + Instruction::AddAccount { + address, + outcome_sender, + } => { let recast_address = Address::from(address.as_fixed_bytes()); let account = revm::db::DbAccount { info: AccountInfo::default(), diff --git a/core/src/errors.rs b/core/src/errors.rs index d9e33299..0a9a6fe0 100644 --- a/core/src/errors.rs +++ b/core/src/errors.rs @@ -104,6 +104,7 @@ pub enum ArbiterCoreError { #[error("{0}")] ReplyError(String), + /// Failed to grab a lock. #[error("{0}")] RwLockError(String), } diff --git a/core/tests/environment_integration.rs b/core/tests/environment_integration.rs index c0dbc4de..30611405 100644 --- a/core/tests/environment_integration.rs +++ b/core/tests/environment_integration.rs @@ -86,7 +86,7 @@ async fn fork_into_arbiter() { let fork = Fork::from_disk("tests/fork.json").unwrap(); // Get the environment going - let environment = Environment::builder().with_db(fork.db).build(); + let environment = Environment::builder().with_state(fork.db).build(); // Create a client let client = ArbiterMiddleware::new(&environment, Some("name")).unwrap(); @@ -118,7 +118,7 @@ async fn middleware_from_forked_eo() { let fork = Fork::from_disk("tests/fork.json").unwrap(); // Get the environment going - let environment = Environment::builder().with_db(fork.db).build(); + let environment = Environment::builder().with_state(fork.db).build(); let vitalik_address = fork.eoa.get("vitalik").unwrap(); let vitalik_as_a_client = @@ -146,13 +146,12 @@ async fn env_returns_db() { let (environment, client) = startup(); deploy_arbx(client).await; let db = environment.stop().unwrap(); - assert!(!db.0.read().unwrap().accounts.is_empty()) + assert!(!db.state.read().unwrap().accounts.is_empty()) } #[tokio::test] async fn block_logs() { let (environment, client) = startup(); - let global_db = environment.global_db.clone(); let arbiter_token = deploy_arbx(client.clone()).await; arbiter_token @@ -163,16 +162,12 @@ async fn block_logs() { .await .unwrap(); - println!("Global DB: {:?}\n", global_db.read().unwrap()); - - // UPDATE BLOCK let new_block_number = 69; let new_block_timestamp = 420; client .update_block(new_block_number, new_block_timestamp) .unwrap(); - println!("Global DB: {:?}\n", global_db.read().unwrap()); arbiter_token .approve(Address::zero(), eU256::from(1000)) @@ -182,5 +177,13 @@ async fn block_logs() { .await .unwrap(); client.update_block(6969, 420420).unwrap(); - println!("Global DB: {:?}\n", global_db.read().unwrap()); + + let db = environment.stop().unwrap(); + let logs = db.logs.read().unwrap(); + println!("DB Logs: {:?}\n", logs); + assert_eq!(logs.get(&revm::primitives::U256::from(0)).unwrap().len(), 1); + assert_eq!( + logs.get(&revm::primitives::U256::from(69)).unwrap().len(), + 1 + ); } diff --git a/examples/minter/behaviors/token_admin.rs b/examples/minter/behaviors/token_admin.rs index f6669605..496f1901 100644 --- a/examples/minter/behaviors/token_admin.rs +++ b/examples/minter/behaviors/token_admin.rs @@ -52,7 +52,7 @@ impl Behavior for TokenAdmin { &mut self, client: Arc, messager: Messager, - ) -> Result> { + ) -> Result>> { self.messager = Some(messager.clone()); self.client = Some(client.clone()); for token_data in self.token_data.values_mut() { @@ -74,7 +74,7 @@ impl Behavior for TokenAdmin { .get_or_insert_with(HashMap::new) .insert(token_data.name.clone(), token.clone()); } - Ok(messager.stream()?) + Ok(Some(messager.stream()?)) } #[tracing::instrument(skip(self), fields(id = diff --git a/examples/minter/behaviors/token_requester.rs b/examples/minter/behaviors/token_requester.rs index 03c9d9db..e8fcb741 100644 --- a/examples/minter/behaviors/token_requester.rs +++ b/examples/minter/behaviors/token_requester.rs @@ -35,7 +35,7 @@ impl Behavior for TokenRequester { &mut self, client: Arc, mut messager: Messager, - ) -> Result> { + ) -> Result>> { messager .send( To::Agent(self.request_to.clone()), @@ -59,7 +59,7 @@ impl Behavior for TokenRequester { self.messager = Some(messager.clone()); self.client = Some(client.clone()); let transfer_stream = stream_event(token.transfer_filter()); - Ok(transfer_stream) + Ok(Some(transfer_stream)) } #[tracing::instrument(skip(self), fields(id = diff --git a/examples/template b/examples/template index c04df2a2..6211811e 160000 --- a/examples/template +++ b/examples/template @@ -1 +1 @@ -Subproject commit c04df2a2c8d8a06ab1f4339142de1d1fa940d196 +Subproject commit 6211811ee2748d803fa27a755d51f5298a80f9e4 From 8c007b5e2804712c238aa9f8908b43a94618cefa Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Wed, 28 Feb 2024 17:46:25 -0700 Subject: [PATCH 10/11] change: `BTreeMap` -> `HashMap` --- core/src/database/mod.rs | 15 ++++++++------- core/src/environment/mod.rs | 19 +++++++++++++------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/core/src/database/mod.rs b/core/src/database/mod.rs index 5bba5204..19a9edf2 100644 --- a/core/src/database/mod.rs +++ b/core/src/database/mod.rs @@ -24,16 +24,17 @@ pub mod inspector; /// A [`ArbiterDB`] is contains both a [`CacheDB`] that is used to provide /// state for the [`environment::Environment`]'s as well as for multiple /// [`coprocessor::Coprocessor`]s. -/// The `logs` field is a [`BTreeMap`] to store [`ethers::types::Log`]s that can be queried from at any point. +/// The `logs` field is a [`HashMap`] to store [`ethers::types::Log`]s that can +/// be queried from at any point. #[derive(Debug, Serialize, Deserialize)] pub struct ArbiterDB { - /// The state of the `ArbiterDB`. This is a `CacheDB` that is used to provide - /// a db for the `Environment` to use. + /// The state of the `ArbiterDB`. This is a `CacheDB` that is used to + /// provide a db for the `Environment` to use. pub state: Arc>>, - /// The logs of the `ArbiterDB`. This is a `BTreeMap` that is used to store + /// The logs of the `ArbiterDB`. This is a `HashMap` that is used to store /// logs that can be queried from at any point. - pub logs: Arc>>>, + pub logs: Arc>>>, } // Implement `Clone` by hand so we utilize the `Arc`'s `Clone` implementation. @@ -51,7 +52,7 @@ impl ArbiterDB { pub fn new() -> Self { Self { state: Arc::new(RwLock::new(CacheDB::new(EmptyDB::new()))), - logs: Arc::new(RwLock::new(BTreeMap::new())), + logs: Arc::new(RwLock::new(HashMap::new())), } } @@ -76,7 +77,7 @@ impl ArbiterDB { #[derive(Deserialize)] struct TempDB { state: Option>, - logs: Option>>, + logs: Option>>, } let temp_db: TempDB = serde_json::from_str(&contents)?; Ok(Self { diff --git a/core/src/environment/mod.rs b/core/src/environment/mod.rs index cd6a9730..d47eada8 100644 --- a/core/src/environment/mod.rs +++ b/core/src/environment/mod.rs @@ -145,20 +145,26 @@ impl EnvironmentBuilder { self } - /// Sets the state for the [`Environment`]. This can come from a saved state of a simulation - /// or a [`database::fork::Fork`]. + /// Sets the state for the [`Environment`]. This can come from a saved state + /// of a simulation or a [`database::fork::Fork`]. pub fn with_state(mut self, state: impl Into>) -> Self { self.db.state = Arc::new(RwLock::new(state.into())); self } - /// Sets the logs for the [`Environment`]. This can come from a saved state of a simulation and can be useful for doing analysis. - pub fn with_logs(mut self, logs: impl Into>>) -> Self { + /// Sets the logs for the [`Environment`]. This can come from a saved state + /// of a simulation and can be useful for doing analysis. + pub fn with_logs( + mut self, + logs: impl Into>>, + ) -> Self { self.db.logs = Arc::new(RwLock::new(logs.into())); self } - /// Sets the entire database for the [`Environment`] including both the state and logs. This can come from the saved state of a simulation and can be useful for doing analysis. + /// Sets the entire database for the [`Environment`] including both the + /// state and logs. This can come from the saved state of a simulation and + /// can be useful for doing analysis. pub fn with_arbiter_db(mut self, db: ArbiterDB) -> Self { self.db = db; self @@ -222,7 +228,8 @@ impl Environment { // Bring in parameters for the `Environment`. let label = self.parameters.label.clone(); - // Bring in the EVM db and log storage by cloning the interior Arc (lightweight). + // Bring in the EVM db and log storage by cloning the interior Arc + // (lightweight). let db = self.db.clone(); // Bring in the EVM ENV From 430435ecd601c49425c82fa0f44ef5ea2ddc6006 Mon Sep 17 00:00:00 2001 From: Colin Roberts Date: Wed, 28 Feb 2024 19:54:50 -0700 Subject: [PATCH 11/11] Squashed commit of the following: commit dbca2d41adf78ff19810b8a19a3a5f94ebe0471e Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Feb 28 14:05:43 2024 -0700 build(deps): bump crossbeam-channel from 0.5.11 to 0.5.12 (#919) Bumps [crossbeam-channel](https://github.com/crossbeam-rs/crossbeam) from 0.5.11 to 0.5.12. - [Release notes](https://github.com/crossbeam-rs/crossbeam/releases) - [Changelog](https://github.com/crossbeam-rs/crossbeam/blob/master/CHANGELOG.md) - [Commits](https://github.com/crossbeam-rs/crossbeam/compare/crossbeam-channel-0.5.11...crossbeam-channel-0.5.12) --- updated-dependencies: - dependency-name: crossbeam-channel dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 63f167b0152e535cee5647e681c52ca11580562f Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Feb 28 14:05:33 2024 -0700 build(deps): bump syn from 2.0.51 to 2.0.52 (#920) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.51 to 2.0.52. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.51...2.0.52) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit de894a38388d6301328ecac21d24bf2c8656d396 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed Feb 28 14:05:20 2024 -0700 build(deps): bump tempfile from 3.10.0 to 3.10.1 (#917) Bumps [tempfile](https://github.com/Stebalien/tempfile) from 3.10.0 to 3.10.1. - [Changelog](https://github.com/Stebalien/tempfile/blob/master/CHANGELOG.md) - [Commits](https://github.com/Stebalien/tempfile/compare/v3.10.0...v3.10.1) --- updated-dependencies: - dependency-name: tempfile dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 50bfbd31ff4a437f0e29c3f8cec41fb5b4667763 Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon Feb 26 13:38:48 2024 -0700 build(deps): bump syn from 2.0.50 to 2.0.51 (#915) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.50 to 2.0.51. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.50...2.0.51) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> commit 1db6bece8476aec5e650da32b17295dd8d4e9813 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Feb 26 10:47:13 2024 -0700 chore: release (#914) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit 8211c6ea175e43f9ca22f283607db21cee5b600b Author: Colin Roberts Date: Mon Feb 26 10:42:46 2024 -0700 feat: `error!` output from behavior (#913) * feat: `error!` output from behavior * submodule: update `template` * fix: `minter` example * fix: clippy --- CHANGELOG.md | 5 +++ Cargo.lock | 80 +++++++++++++++++++++---------------------- Cargo.toml | 8 ++--- engine/CHANGELOG.md | 5 +++ engine/Cargo.toml | 2 +- engine/src/machine.rs | 26 +++++++++++--- 6 files changed, 77 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c683d303..f033c731 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.4.19](https://github.com/primitivefinance/arbiter/compare/arbiter-v0.4.18...arbiter-v0.4.19) - 2024-02-26 + +### Added +- `error!` output from behavior ([#913](https://github.com/primitivefinance/arbiter/pull/913)) + ## [0.4.18](https://github.com/primitivefinance/arbiter/compare/arbiter-v0.4.17...arbiter-v0.4.18) - 2024-02-20 ### Other diff --git a/Cargo.lock b/Cargo.lock index 26f1f638..267acd45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -139,7 +139,7 @@ checksum = "1a047897373be4bbb0224c1afdabca92648dc57a9c9ef6e7b0be3aff7a859c83" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -213,7 +213,7 @@ checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "arbiter" -version = "0.4.18" +version = "0.4.19" dependencies = [ "Inflector", "anyhow", @@ -233,7 +233,7 @@ dependencies = [ "revm-primitives 2.0.0", "serde", "serde_json", - "syn 2.0.50", + "syn 2.0.52", "tempfile", "thiserror", "tokio", @@ -323,7 +323,7 @@ dependencies = [ [[package]] name = "arbiter-engine" -version = "0.3.1" +version = "0.3.2" dependencies = [ "anyhow", "arbiter-bindings 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -376,7 +376,7 @@ name = "arbiter-macros" version = "0.1.3" dependencies = [ "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -386,7 +386,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac4a04ffa19e2845c4ea58bb8470d19b13d3c95a8c846e7524d718b7dc182020" dependencies = [ "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -583,7 +583,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -594,7 +594,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -650,7 +650,7 @@ checksum = "823b8bb275161044e2ac7a25879cb3e2480cb403e3943022c7c769c599b756aa" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -845,7 +845,7 @@ checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1022,7 +1022,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1217,9 +1217,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" dependencies = [ "crossbeam-utils", ] @@ -1552,7 +1552,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1563,7 +1563,7 @@ checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1718,7 +1718,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "syn 2.0.50", + "syn 2.0.52", "toml 0.8.10", "walkdir", ] @@ -1736,7 +1736,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -1762,7 +1762,7 @@ dependencies = [ "serde", "serde_json", "strum", - "syn 2.0.50", + "syn 2.0.52", "tempfile", "thiserror", "tiny-keccak", @@ -2146,7 +2146,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -3085,7 +3085,7 @@ dependencies = [ "proc-macro-crate 3.1.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -3295,7 +3295,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -3344,7 +3344,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -3418,7 +3418,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -3456,7 +3456,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -3925,7 +3925,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -3987,7 +3987,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", "version_check", "yansi 1.0.0-rc.1", ] @@ -4139,7 +4139,7 @@ checksum = "5fddb4f8d99b0a2ebafc65a87a69a7b9875e4b1ae1f00db265d300ef7f28bccc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -4701,7 +4701,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -5011,7 +5011,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -5079,9 +5079,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.50" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -5143,9 +5143,9 @@ checksum = "cfb5fa503293557c5158bd215fdc225695e567a77e453f5d4452a50a193969bd" [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", "fastrand", @@ -5187,7 +5187,7 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -5291,7 +5291,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -5451,7 +5451,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -5763,7 +5763,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", "wasm-bindgen-shared", ] @@ -5797,7 +5797,7 @@ checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6106,7 +6106,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] @@ -6126,7 +6126,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.52", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 12580a5f..ced92266 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ exclude = ["benches", "docs"] # Package configuration [package] name = "arbiter" -version = "0.4.18" +version = "0.4.19" edition = "2021" authors = [ "Waylon Jepsen ", @@ -58,9 +58,9 @@ futures = "0.3.30" futures-util = { version = "0.3.30" } async-stream = "0.3.5" async-trait = { version = "0.1.77" } -crossbeam-channel = { version = "0.5.11" } +crossbeam-channel = { version = "0.5.12" } -syn = { version = "2.0.50", features = ["full"] } +syn = { version = "2.0.52", features = ["full"] } proc-macro2 = { version = "1.0.78" } tracing = "0.1.40" @@ -85,7 +85,7 @@ Inflector = { version = "=0.11.4" } # Building files foundry-config = { version = "=0.2.0" } -tempfile = { version = "3.10.0" } +tempfile = { version = "3.10.1" } # Errors thiserror.workspace = true diff --git a/engine/CHANGELOG.md b/engine/CHANGELOG.md index cb552f5a..f5d82788 100644 --- a/engine/CHANGELOG.md +++ b/engine/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.2](https://github.com/primitivefinance/arbiter/compare/arbiter-engine-v0.3.1...arbiter-engine-v0.3.2) - 2024-02-26 + +### Added +- `error!` output from behavior ([#913](https://github.com/primitivefinance/arbiter/pull/913)) + ## [0.3.1](https://github.com/primitivefinance/arbiter/compare/arbiter-engine-v0.3.0...arbiter-engine-v0.3.1) - 2024-02-20 ### Other diff --git a/engine/Cargo.toml b/engine/Cargo.toml index ce766755..69996c26 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "arbiter-engine" -version = "0.3.1" +version = "0.3.2" edition = "2021" authors = [ "Waylon Jepsen ", diff --git a/engine/src/machine.rs b/engine/src/machine.rs index 38084dca..d6e3d888 100644 --- a/engine/src/machine.rs +++ b/engine/src/machine.rs @@ -7,6 +7,7 @@ use anyhow::Result; use arbiter_core::middleware::ArbiterMiddleware; use futures_util::{Stream, StreamExt}; use tokio::task::JoinHandle; +use tracing::error; use super::*; @@ -216,15 +217,27 @@ where async fn execute(&mut self, instruction: MachineInstruction) -> Result<()> { // NOTE: The unwraps here are safe because the `Behavior` in an engine is only // accessed here and it is private. + let id: Option; match instruction { MachineInstruction::Start(client, messager) => { + id = messager.id.clone(); + let id_clone = id.clone(); self.state = State::Starting; let mut behavior = self.behavior.take().unwrap(); let behavior_task: JoinHandle>, B)>> = tokio::spawn(async move { - let id = messager.id.clone(); - let stream = behavior.startup(client, messager).await?; - debug!("startup complete for behavior {:?}", id); + let stream = match behavior.startup(client, messager).await { + Ok(stream) => stream, + Err(e) => { + error!( + "startup failed for behavior {:?}: \n reason: {:?}", + id_clone, e + ); + // Throw a panic as we cannot recover from this for now. + panic!(); + } + }; + debug!("startup complete for behavior {:?}", id_clone); Ok((stream, behavior)) }); let (stream, behavior) = behavior_task.await??; @@ -232,7 +245,12 @@ where Some(stream) => { self.event_stream = Some(stream); self.behavior = Some(behavior); - self.execute(MachineInstruction::Process).await?; + match self.execute(MachineInstruction::Process).await { + Ok(_) => {} + Err(e) => { + error!("process failed for behavior {:?}: \n reason: {:?}", id, e); + } + } Ok(()) } None => {