diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0606958..660b52f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,7 +83,7 @@ jobs: matrix: network: [ "mainnet" ] hardfork: [ "pre-bernoulli", "bernoulli", "curie", "darwin" ] - rust: [ "1.75", "nightly-2024-07-07" ] + rust: [ "1.81", "nightly-2024-07-07" ] steps: - uses: actions/checkout@v4 diff --git a/Cargo.lock b/Cargo.lock index 887a3e8..b56661a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,17 +17,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.11" @@ -100,24 +89,24 @@ dependencies = [ [[package]] name = "alloy-core" version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", "alloy-primitives", "alloy-rlp", - "alloy-sol-types 0.8.0 (git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0)", + "alloy-sol-types", ] [[package]] name = "alloy-dyn-abi" version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ "alloy-json-abi", "alloy-primitives", "alloy-sol-type-parser", - "alloy-sol-types 0.8.0 (git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0)", + "alloy-sol-types", "const-hex", "itoa", "serde", @@ -128,7 +117,7 @@ dependencies = [ [[package]] name = "alloy-eip2930" version = "0.1.0" -source = "git+https://github.com/scroll-tech/alloy-eips?branch=v0.1.0#f8d7bec6cb9d38320742b89e54c3d8be59937918" +source = "git+https://github.com/scroll-tech/alloy-eips?branch=v0.1.0#06cb417f8b3df8c29a8bf69a8a10663ceb5a2c37" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -139,7 +128,7 @@ dependencies = [ [[package]] name = "alloy-eip7702" version = "0.1.0" -source = "git+https://github.com/scroll-tech/alloy-eips?branch=v0.1.0#f8d7bec6cb9d38320742b89e54c3d8be59937918" +source = "git+https://github.com/scroll-tech/alloy-eips?branch=v0.1.0#06cb417f8b3df8c29a8bf69a8a10663ceb5a2c37" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -176,7 +165,7 @@ dependencies = [ [[package]] name = "alloy-json-abi" version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -190,7 +179,7 @@ version = "0.3.0" source = "git+https://github.com/scroll-tech/alloy.git?branch=v0.3.0#41bbe34a38a2b1536c58b7c938313a2db4e9369a" dependencies = [ "alloy-primitives", - "alloy-sol-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "alloy-sol-types", "serde", "serde_json", "thiserror", @@ -210,7 +199,7 @@ dependencies = [ "alloy-rpc-types-eth", "alloy-serde", "alloy-signer", - "alloy-sol-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "alloy-sol-types", "async-trait", "auto_impl", "futures-utils-wasm", @@ -230,7 +219,7 @@ dependencies = [ [[package]] name = "alloy-primitives" version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ "alloy-rlp", "bytes", @@ -345,7 +334,7 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-serde", - "alloy-sol-types 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "alloy-sol-types", "itertools 0.13.0", "serde", "serde_json", @@ -378,36 +367,22 @@ dependencies = [ [[package]] name = "alloy-sol-macro" version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ - "alloy-sol-macro-expander 0.8.0", - "alloy-sol-macro-input 0.8.0", + "alloy-sol-macro-expander", + "alloy-sol-macro-input", "proc-macro-error", "proc-macro2", "quote", "syn 2.0.79", ] -[[package]] -name = "alloy-sol-macro" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0409e3ba5d1de409997a7db8b8e9d679d52088c1dee042a85033affd3cadeab4" -dependencies = [ - "alloy-sol-macro-expander 0.8.6", - "alloy-sol-macro-input 0.8.6", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.79", -] - [[package]] name = "alloy-sol-macro-expander" version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ - "alloy-sol-macro-input 0.8.0", + "alloy-sol-macro-input", "const-hex", "heck", "indexmap 2.6.0", @@ -415,32 +390,14 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.79", - "syn-solidity 0.8.0", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18372ef450d59f74c7a64a738f546ba82c92f816597fed1802ef559304c81f1" -dependencies = [ - "alloy-sol-macro-input 0.8.6", - "const-hex", - "heck", - "indexmap 2.6.0", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.79", - "syn-solidity 0.8.6", + "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ "const-hex", "dunce", @@ -448,28 +405,13 @@ dependencies = [ "proc-macro2", "quote", "syn 2.0.79", - "syn-solidity 0.8.0", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7bad89dd0d5f109e8feeaf787a9ed7a05a91a9a0efc6687d147a70ebca8eff7" -dependencies = [ - "const-hex", - "dunce", - "heck", - "proc-macro2", - "quote", - "syn 2.0.79", - "syn-solidity 0.8.6", + "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ "serde", "winnow", @@ -478,22 +420,11 @@ dependencies = [ [[package]] name = "alloy-sol-types" version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "577e262966e92112edbd15b1b2c0947cc434d6e8311df96d3329793fe8047da9" -dependencies = [ - "alloy-primitives", - "alloy-sol-macro 0.8.6", - "const-hex", -] - -[[package]] -name = "alloy-sol-types" -version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ "alloy-json-abi", "alloy-primitives", - "alloy-sol-macro 0.8.0", + "alloy-sol-macro", "const-hex", "serde", ] @@ -931,24 +862,25 @@ checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" [[package]] name = "bytecheck" -version = "0.6.12" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +checksum = "50c8f430744b23b54ad15161fcbc22d82a29b73eacbe425fea23ec822600bc6f" dependencies = [ "bytecheck_derive", "ptr_meta", + "rancor", "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.12" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +checksum = "523363cbe1df49b68215efdf500b103ac3b0fb4836aed6d15689a076eadb8fff" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.79", ] [[package]] @@ -1017,9 +949,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.19" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -1027,9 +959,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.19" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -1688,9 +1620,6 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] [[package]] name = "hashbrown" @@ -1698,7 +1627,7 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.8.11", + "ahash", "allocator-api2", "serde", ] @@ -1962,7 +1891,7 @@ version = "0.11.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ - "ahash 0.8.11", + "ahash", "indexmap 2.6.0", "is-terminal", "itoa", @@ -2023,9 +1952,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "0cb94a0ffd3f3ee755c20f7d8752f45cac88605a4dcf808abcff72873296ec7b" dependencies = [ "wasm-bindgen", ] @@ -2156,6 +2085,26 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "munge" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64142d38c84badf60abf06ff9bd80ad2174306a5b11bd4706535090a30a419df" +dependencies = [ + "munge_macro", +] + +[[package]] +name = "munge_macro" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb5c1d8184f13f7d0ccbeeca0def2f9a181bce2624302793005f5ca8aa62e5e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "native-tls" version = "0.2.12" @@ -2605,28 +2554,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.79", -] - [[package]] name = "proc-macro2" version = "1.0.87" @@ -2681,22 +2608,22 @@ dependencies = [ [[package]] name = "ptr_meta" -version = "0.1.4" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90" dependencies = [ "ptr_meta_derive", ] [[package]] name = "ptr_meta_derive" -version = "0.1.4" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +checksum = "ca414edb151b4c8d125c12566ab0d74dc9cdba36fb80eb7b848c15f495fd32d1" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.79", ] [[package]] @@ -2729,6 +2656,15 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +[[package]] +name = "rancor" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf5f7161924b9d1cea0e4cabc97c372cea92b5f927fc13c6bca67157a0ad947" +dependencies = [ + "ptr_meta", +] + [[package]] name = "rand" version = "0.8.5" @@ -2823,9 +2759,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "rend" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +checksum = "a31c1f1959e4db12c985c0283656be0925f1539549db1e47c4bd0b8b599e1ef7" dependencies = [ "bytecheck", ] @@ -2876,7 +2812,7 @@ dependencies = [ [[package]] name = "revm" version = "14.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=scroll-evm-executor/v42#921525ab7b132414fe1ba1df2b6b2941fceb8f4d" +source = "git+https://github.com/scroll-tech/revm?branch=scroll-evm-executor/v42#f7f0745a46b16097a274c2def9d1334cbdd9da26" dependencies = [ "auto_impl", "cfg-if", @@ -2890,7 +2826,7 @@ dependencies = [ [[package]] name = "revm-interpreter" version = "10.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=scroll-evm-executor/v42#921525ab7b132414fe1ba1df2b6b2941fceb8f4d" +source = "git+https://github.com/scroll-tech/revm?branch=scroll-evm-executor/v42#f7f0745a46b16097a274c2def9d1334cbdd9da26" dependencies = [ "cfg-if", "revm-primitives", @@ -2900,7 +2836,7 @@ dependencies = [ [[package]] name = "revm-precompile" version = "11.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=scroll-evm-executor/v42#921525ab7b132414fe1ba1df2b6b2941fceb8f4d" +source = "git+https://github.com/scroll-tech/revm?branch=scroll-evm-executor/v42#f7f0745a46b16097a274c2def9d1334cbdd9da26" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -2917,7 +2853,7 @@ dependencies = [ [[package]] name = "revm-primitives" version = "9.0.0" -source = "git+https://github.com/scroll-tech/revm?branch=scroll-evm-executor/v42#921525ab7b132414fe1ba1df2b6b2941fceb8f4d" +source = "git+https://github.com/scroll-tech/revm?branch=scroll-evm-executor/v42#f7f0745a46b16097a274c2def9d1334cbdd9da26" dependencies = [ "alloy-eips", "alloy-primitives", @@ -2979,31 +2915,32 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.7.45" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +checksum = "395027076c569819ea6035ee62e664f5e03d74e281744f55261dd1afd939212b" dependencies = [ - "bitvec", "bytecheck", "bytes", - "hashbrown 0.12.3", + "hashbrown 0.14.5", + "indexmap 2.6.0", + "munge", "ptr_meta", + "rancor", "rend", "rkyv_derive", - "seahash", "tinyvec", "uuid", ] [[package]] name = "rkyv_derive" -version = "0.7.45" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +checksum = "09cb82b74b4810f07e460852c32f522e979787691b0b7b7439fe473e49d49b2f" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.79", ] [[package]] @@ -3019,7 +2956,7 @@ dependencies = [ [[package]] name = "ruint" version = "1.12.3" -source = "git+https://github.com/scroll-tech/uint.git?branch=v1.12.3#6d6f74be1169bdc41052f50ddfb66ae96bf78475" +source = "git+https://github.com/scroll-tech/uint.git?branch=v1.12.3#d26b1f2a4412bba2b9b366f43f7684fd32ac1c8a" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", @@ -3043,7 +2980,7 @@ dependencies = [ [[package]] name = "ruint-macro" version = "1.2.1" -source = "git+https://github.com/scroll-tech/uint.git?branch=v1.12.3#6d6f74be1169bdc41052f50ddfb66ae96bf78475" +source = "git+https://github.com/scroll-tech/uint.git?branch=v1.12.3#d26b1f2a4412bba2b9b366f43f7684fd32ac1c8a" [[package]] name = "rustc-demangle" @@ -3227,12 +3164,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - [[package]] name = "sec1" version = "0.7.3" @@ -3623,19 +3554,7 @@ dependencies = [ [[package]] name = "syn-solidity" version = "0.8.0" -source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#3c8299a45f4722c024a0c34a1ef9b6453b7b3f45" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "syn-solidity" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a850d65181df41b83c6be01a7d91f5e9377c43d48faa5af7d95816f437f5a3" +source = "git+https://github.com/scroll-tech/alloy-core?branch=v0.8.0#4642d710a73aec9513222db586498951f84534cd" dependencies = [ "paste", "proc-macro2", @@ -4096,9 +4015,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "ef073ced962d62984fb38a36e5fdc1a2b23c9e0e1fa0689bb97afa4202ef6887" dependencies = [ "cfg-if", "once_cell", @@ -4107,9 +4026,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "c4bfab14ef75323f4eb75fa52ee0a3fb59611977fd3240da19b2cf36ff85030e" dependencies = [ "bumpalo", "log", @@ -4122,9 +4041,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "65471f79c1022ffa5291d33520cbbb53b7687b01c2f8e83b57d102eed7ed479d" dependencies = [ "cfg-if", "js-sys", @@ -4134,9 +4053,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "a7bec9830f60924d9ceb3ef99d55c155be8afa76954edffbb5936ff4509474e7" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4144,9 +4063,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "4c74f6e152a76a2ad448e223b0fc0b6b5747649c3d769cc6bf45737bf97d0ed6" dependencies = [ "proc-macro2", "quote", @@ -4157,15 +4076,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "a42f6c679374623f295a8623adfe63d9284091245c3504bde47c17a3ce2777d9" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "44188d185b5bdcae1052d08bcbcf9091a5524038d4572cc4f4f2bb9d5554ddd9" dependencies = [ "js-sys", "wasm-bindgen", @@ -4376,7 +4295,7 @@ dependencies = [ [[package]] name = "zktrie-ng" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zktrie-ng?branch=master#0804d10ae6f721bed397fc3524602bba15d2589e" +source = "git+https://github.com/scroll-tech/zktrie-ng?branch=master#8ad8038e39f9b88abfe8680e32bba19ac4497a1d" dependencies = [ "alloy-primitives", "hashbrown 0.14.5", diff --git a/Cargo.toml b/Cargo.toml index f91e7d5..a5839db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ repository = "https://github.com/scroll-tech/stateless-block-verifier" alloy = "0.3" hex = "0.4" once_cell = "1.19" -rkyv = { version = "0.7", features = ["validation"] } +rkyv = "0.8" thiserror = "1.0" tiny-keccak = "2.0" @@ -85,7 +85,7 @@ missing-debug-implementations = "deny" [patch.crates-io] ff = { git = "https://github.com/scroll-tech/ff", branch = "feat/sp1" } -# patched add rkyv support & MSRV 1.75 +# patched add rkyv support & MSRV 1.77 ruint = { git = "https://github.com/scroll-tech/uint.git", branch = "v1.12.3" } alloy = { git = "https://github.com/scroll-tech/alloy.git", branch = "v0.3.0" } @@ -94,8 +94,9 @@ alloy-eips = { git = "https://github.com/scroll-tech/alloy.git", branch = "v0.3. alloy-eip2930 = { git = "https://github.com/scroll-tech/alloy-eips", branch = "v0.1.0" } alloy-eip7702 = { git = "https://github.com/scroll-tech/alloy-eips", branch = "v0.1.0" } -alloy-core = { git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0"} -alloy-primitives = { git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0"} +alloy-core = { git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0" } +alloy-primitives = { git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0" } +alloy-sol-types = {git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0" } # for local development # [patch."https://github.com/scroll-tech/revm"] diff --git a/crates/core/src/chunk.rs b/crates/core/src/chunk.rs index ef875bc..0fb3578 100644 --- a/crates/core/src/chunk.rs +++ b/crates/core/src/chunk.rs @@ -31,6 +31,7 @@ impl ChunkInfo { let post_state_root = traces.last().expect("at least 1 block needed").root_after(); let withdraw_root = traces.last().unwrap().withdraw_root(); + cycle_tracker_start!("Keccak::v256"); let mut data_hasher = Keccak::v256(); for trace in traces.iter() { trace.hash_da_header(&mut data_hasher); @@ -40,14 +41,17 @@ impl ChunkInfo { } let mut data_hash = B256::ZERO; data_hasher.finalize(&mut data_hash.0); + cycle_tracker_end!("Keccak::v256"); let mut zktrie_db = NodeDb::new(HashMapDb::default()); + cycle_tracker_start!("Block::build_zktrie_db"); for trace in traces.iter() { measure_duration_millis!( build_zktrie_db_duration_milliseconds, trace.build_zktrie_db(&mut zktrie_db).unwrap() ); } + cycle_tracker_end!("Block::build_zktrie_db"); let info = ChunkInfo { chain_id, diff --git a/crates/primitives/src/lib.rs b/crates/primitives/src/lib.rs index b81b592..939f994 100644 --- a/crates/primitives/src/lib.rs +++ b/crates/primitives/src/lib.rs @@ -9,11 +9,7 @@ use alloy::{ primitives::{Bytes, ChainId, Signature, SignatureError, TxKind}, }; use std::fmt::Debug; -use zktrie_ng::{ - db::kv::KVDatabase, - hash::poseidon::Poseidon, - trie::{Node, MAGIC_NODE_BYTES}, -}; +use zktrie_ng::db::kv::KVDatabase; /// Predeployed contracts pub mod predeployed; @@ -27,8 +23,16 @@ pub use alloy::primitives::{Address, B256, U256}; pub use zktrie_ng as zk_trie; use zktrie_ng::db::NodeDb; +/// Node proof trait +pub trait NodeProof { + /// Import itself into zktrie db + fn import_node(&self, db: &mut NodeDb) -> Result<(), Db::Error>; +} + /// Blanket trait for block trace extensions. pub trait Block: Debug { + /// Node proof type + type Node: NodeProof; /// transaction type type Tx: TxTrace; @@ -76,25 +80,14 @@ pub trait Block: Debug { /// start l1 queue index fn start_l1_queue_index(&self) -> u64; - /// flatten proofs - fn flatten_proofs(&self) -> impl Iterator; + /// node proofs + fn node_proofs(&self) -> impl Iterator; /// Update zktrie state from trace #[inline] fn build_zktrie_db(&self, db: &mut NodeDb) -> Result<(), Db::Error> { - for bytes in self.flatten_proofs() { - if bytes == MAGIC_NODE_BYTES { - continue; - } - let node = cycle_track!(Node::::try_from(bytes), "Node::try_from") - .expect("invalid node"); - cycle_track!( - node.get_or_calculate_node_hash(), - "Node::get_or_calculate_node_hash" - ) - .expect("infallible"); - dev_trace!("put zktrie node: {:?}", node); - cycle_track!(db.put_node(&node)?, "NodeDb::put_node"); + for node in self.node_proofs() { + node.import_node(db)?; } Ok(()) } @@ -273,6 +266,7 @@ pub trait TxTrace { } impl Block for &T { + type Node = ::Node; type Tx = ::Tx; fn number(&self) -> u64 { @@ -339,8 +333,8 @@ impl Block for &T { (*self).start_l1_queue_index() } - fn flatten_proofs(&self) -> impl Iterator { - (*self).flatten_proofs() + fn node_proofs(&self) -> impl Iterator { + (*self).node_proofs() } } diff --git a/crates/primitives/src/types/mod.rs b/crates/primitives/src/types/mod.rs index 74bb09d..4f6fd73 100644 --- a/crates/primitives/src/types/mod.rs +++ b/crates/primitives/src/types/mod.rs @@ -1,11 +1,16 @@ -use crate::Block; +use crate::{Block, NodeProof}; use alloy::primitives::{Address, Bytes, B256, U256}; -use rkyv::Archive; -use serde::{Deserialize, Deserializer, Serialize}; +use rkyv::vec::ArchivedVec; +use rkyv::{rancor, Archive}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_with::{serde_as, Map}; use std::collections::{BTreeSet, HashMap}; use std::fmt::Debug; -use std::hash::Hash; +use std::hash::{Hash, Hasher}; +use zktrie_ng::db::kv::KVDatabase; +use zktrie_ng::db::NodeDb; +use zktrie_ng::hash::poseidon::Poseidon; +use zktrie_ng::trie::{ArchivedNode, Node, MAGIC_NODE_BYTES}; mod tx; pub use tx::{ArchivedTransactionTrace, TransactionTrace, TxL1Msg, TypedTransaction}; @@ -14,27 +19,34 @@ pub use tx::{ArchivedTransactionTrace, TransactionTrace, TxL1Msg, TypedTransacti #[derive( rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Serialize, Deserialize, Default, Debug, Clone, )] -#[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[rkyv(derive(Debug, Hash, PartialEq, Eq))] pub struct BlockHeader { /// block number + #[rkyv(attr(doc = "block number"))] pub number: U256, /// block hash + #[rkyv(attr(doc = "block hash"))] pub hash: B256, /// timestamp + #[rkyv(attr(doc = "timestamp"))] pub timestamp: U256, /// gas limit #[serde(rename = "gasLimit")] + #[rkyv(attr(doc = "gas limit"))] pub gas_limit: U256, /// gas used #[serde(rename = "gasUsed")] + #[rkyv(attr(doc = "gas used"))] pub gas_used: U256, /// base fee per gas #[serde(rename = "baseFeePerGas")] + #[rkyv(attr(doc = "base fee per gas"))] pub base_fee_per_gas: Option, /// difficulty + #[rkyv(attr(doc = "difficulty"))] pub difficulty: U256, /// mix hash + #[rkyv(attr(doc = "mix hash"))] #[serde(rename = "mixHash")] pub mix_hash: Option, } @@ -43,10 +55,10 @@ pub struct BlockHeader { #[derive( rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Serialize, Deserialize, Default, Debug, Clone, )] -#[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[rkyv(derive(Debug, Hash, PartialEq, Eq))] pub struct Coinbase { /// address of coinbase + #[rkyv(attr(doc = "address of coinbase"))] pub address: Address, } @@ -54,10 +66,10 @@ pub struct Coinbase { #[derive( rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Serialize, Deserialize, Default, Debug, Clone, )] -#[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[rkyv(derive(Debug, Hash, PartialEq, Eq))] pub struct BytecodeTrace { /// bytecode + #[rkyv(attr(doc = "bytecode"))] pub code: Bytes, } @@ -74,20 +86,33 @@ pub struct BytecodeTrace { Eq, PartialEq, )] -#[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] -pub struct StorageTrace { +#[rkyv(derive(Debug, Hash, PartialEq, Eq))] +pub struct StorageTrace +where + N: Archive, + Vec: Archive::Archived>>, + as Archive>::Archived: Debug + Hash + PartialEq + Eq, +{ /// root before + #[rkyv(attr(doc = "root before"))] #[serde(rename = "rootBefore")] pub root_before: B256, /// root after + #[rkyv(attr(doc = "root after"))] #[serde(rename = "rootAfter")] pub root_after: B256, /// proofs #[serde(rename = "flattenProofs")] - pub flatten_proofs: Vec, + #[rkyv(attr(doc = "proofs"))] + pub flatten_proofs: Vec, } +/// rkyv serialized node bytes +#[derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Default, Debug, Clone)] +#[rkyv(derive(Debug, Hash, PartialEq, Eq))] +#[repr(C, align(4))] +pub struct ArchivedNodeBytes(Vec); + /// legacy storage trace #[serde_as] #[derive( @@ -103,26 +128,30 @@ pub struct StorageTrace { Eq, PartialEq, )] -#[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[rkyv(derive(Debug, Hash, PartialEq, Eq))] #[allow(clippy::type_complexity)] pub struct LegacyStorageTrace { /// root before + #[rkyv(attr(doc = "root before"))] #[serde(rename = "rootBefore")] pub root_before: B256, /// root after + #[rkyv(attr(doc = "root after"))] #[serde(rename = "rootAfter")] pub root_after: B256, /// account proofs + #[rkyv(attr(doc = "account proofs"))] #[serde(default)] #[serde_as(as = "Map<_, _>")] pub proofs: Vec<(Address, Vec)>, + /// storage proofs for each account + #[rkyv(attr(doc = "storage proofs for each account"))] #[serde(rename = "storageProofs", default)] #[serde_as(as = "Map<_, Map<_, _>>")] - /// storage proofs for each account pub storage_proofs: Vec<(Address, Vec<(B256, Vec)>)>, - #[serde(rename = "deletionProofs", default)] /// additional deletion proofs + #[rkyv(attr(doc = "additional deletion proofs"))] + #[serde(rename = "deletionProofs", default)] pub deletion_proofs: Vec, } @@ -132,34 +161,65 @@ pub struct LegacyStorageTrace { #[derive( rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Serialize, Deserialize, Default, Debug, Clone, )] -#[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[rkyv(derive(Debug, Hash, PartialEq, Eq))] pub struct BlockTrace where S: Archive, ::Archived: Debug + Hash + PartialEq + Eq, { /// chain id + #[rkyv(attr(doc = "chain id"))] #[serde(rename = "chainID", default)] pub chain_id: u64, /// coinbase + #[rkyv(attr(doc = "coinbase"))] pub coinbase: Coinbase, /// block + #[rkyv(attr(doc = "block"))] pub header: BlockHeader, /// txs + #[rkyv(attr(doc = "txs"))] pub transactions: Vec, /// bytecodes + #[rkyv(attr(doc = "bytecodes"))] pub codes: Vec, /// storage trace BEFORE execution + #[rkyv(attr(doc = "storage trace BEFORE execution"))] #[serde(rename = "storageTrace")] pub storage_trace: S, /// l1 tx queue + #[rkyv(attr(doc = "l1 tx queue"))] #[serde(rename = "startL1QueueIndex", default)] pub start_l1_queue_index: u64, - /// Withdraw root + /// withdraw root + #[rkyv(attr(doc = "withdraw root"))] pub withdraw_trie_root: B256, } +impl Hash for ArchivedNodeBytes { + fn hash(&self, state: &mut H) { + state.write_usize(self.0.len()); + Hash::hash_slice(self.0.as_ref(), state) + } +} + +impl PartialEq for ArchivedNodeBytes { + fn eq(&self, other: &Self) -> bool { + self.0.as_slice().eq(other.0.as_slice()) + } +} + +impl Eq for ArchivedNodeBytes {} + +impl Serialize for ArchivedNodeBytes { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.0.as_slice().serialize(serializer) + } +} + impl<'de> Deserialize<'de> for StorageTrace { fn deserialize(deserializer: D) -> Result where @@ -196,6 +256,28 @@ impl<'de> Deserialize<'de> for StorageTrace { } } +impl From for StorageTrace { + fn from(trace: StorageTrace) -> Self { + StorageTrace { + root_before: trace.root_before, + root_after: trace.root_after, + flatten_proofs: trace + .flatten_proofs + .into_iter() + .filter(|proof| proof.as_ref() != MAGIC_NODE_BYTES) + .map(|proof| { + ArchivedNodeBytes( + Node::::try_from(proof.as_ref()) + .expect("invalid node") + .archived() + .to_vec(), + ) + }) + .collect(), + } + } +} + impl From for StorageTrace { fn from(trace: LegacyStorageTrace) -> Self { let mut flatten_proofs = BTreeSet::new(); @@ -217,6 +299,21 @@ impl From for StorageTrace { } } +impl From for BlockTrace> { + fn from(trace: BlockTrace) -> Self { + BlockTrace { + chain_id: trace.chain_id, + coinbase: trace.coinbase, + header: trace.header, + transactions: trace.transactions, + codes: trace.codes, + storage_trace: trace.storage_trace.into(), + start_l1_queue_index: trace.start_l1_queue_index, + withdraw_trie_root: trace.withdraw_trie_root, + } + } +} + impl From> for BlockTrace { fn from(trace: BlockTrace) -> Self { BlockTrace { @@ -232,7 +329,13 @@ impl From> for BlockTrace { } } -impl Block for BlockTrace { +impl Block for BlockTrace +where + S: StorageTraceExt + Archive + Debug, + ::Archived: Debug + Hash + PartialEq + Eq, + ::Node: NodeProof, +{ + type Node = S::Node; type Tx = TransactionTrace; fn number(&self) -> u64 { @@ -276,11 +379,11 @@ impl Block for BlockTrace { } fn root_before(&self) -> B256 { - self.storage_trace.root_before + self.storage_trace.root_before() } fn root_after(&self) -> B256 { - self.storage_trace.root_after + self.storage_trace.root_after() } fn withdraw_root(&self) -> B256 { @@ -295,52 +398,59 @@ impl Block for BlockTrace { self.start_l1_queue_index } - fn flatten_proofs(&self) -> impl Iterator { - self.storage_trace.flatten_proofs.iter().map(|v| v.as_ref()) + fn node_proofs(&self) -> impl Iterator { + self.storage_trace.node_proofs() } } -impl Block for ArchivedBlockTrace { +impl Block for ArchivedBlockTrace +where + S: Archive + Debug, + ::Archived: StorageTraceExt + Debug + Hash + PartialEq + Eq, + <::Archived as StorageTraceExt>::Node: NodeProof, +{ + type Node = <::Archived as StorageTraceExt>::Node; type Tx = ArchivedTransactionTrace; fn number(&self) -> u64 { - self.header.number.to() + let number: U256 = self.header.number.into(); + number.to() } fn block_hash(&self) -> B256 { - self.header.hash + self.header.hash.into() } fn chain_id(&self) -> u64 { - self.chain_id + self.chain_id.into() } fn coinbase(&self) -> Address { - self.coinbase.address + self.coinbase.address.into() } fn timestamp(&self) -> U256 { - self.header.timestamp + self.header.timestamp.into() } fn gas_limit(&self) -> U256 { - self.header.gas_limit + self.header.gas_limit.into() } fn gas_used(&self) -> U256 { - self.header.gas_used + self.header.gas_used.into() } fn base_fee_per_gas(&self) -> Option { - self.header.base_fee_per_gas.as_ref().copied() + self.header.base_fee_per_gas.as_ref().map(|p| p.into()) } fn difficulty(&self) -> U256 { - self.header.difficulty + self.header.difficulty.into() } fn prevrandao(&self) -> Option { - self.header.mix_hash.as_ref().copied() + self.header.mix_hash.as_ref().map(|p| p.into()) } fn transactions(&self) -> impl Iterator { @@ -348,15 +458,15 @@ impl Block for ArchivedBlockTrace { } fn root_before(&self) -> B256 { - self.storage_trace.root_before + self.storage_trace.root_before() } fn root_after(&self) -> B256 { - self.storage_trace.root_after + self.storage_trace.root_after() } fn withdraw_root(&self) -> B256 { - self.withdraw_trie_root + self.withdraw_trie_root.into() } fn codes(&self) -> impl ExactSizeIterator { @@ -364,11 +474,150 @@ impl Block for ArchivedBlockTrace { } fn start_l1_queue_index(&self) -> u64 { - self.start_l1_queue_index + self.start_l1_queue_index.into() } - fn flatten_proofs(&self) -> impl Iterator { - self.storage_trace.flatten_proofs.iter().map(|v| v.as_ref()) + fn node_proofs(&self) -> impl Iterator { + self.storage_trace.node_proofs() + } +} + +/// Extension trait for storage trace +pub trait StorageTraceExt { + /// Node type + type Node: Debug; + + /// Get root before + fn root_before(&self) -> B256; + + /// Get root after + fn root_after(&self) -> B256; + + /// Get node proofs + fn node_proofs(&self) -> impl Iterator; +} + +impl StorageTraceExt for StorageTrace +where + N: Archive + Debug, + Vec: Archive::Archived>>, + as Archive>::Archived: Debug + Hash + PartialEq + Eq, +{ + type Node = N; + + fn root_before(&self) -> B256 { + self.root_before + } + + fn root_after(&self) -> B256 { + self.root_after + } + + fn node_proofs(&self) -> impl Iterator { + self.flatten_proofs.iter() + } +} + +impl StorageTraceExt for ArchivedStorageTrace +where + N: Archive + Debug, + ::Archived: Debug, + Vec: Archive::Archived>>, + as Archive>::Archived: Debug + Hash + PartialEq + Eq, +{ + type Node = ::Archived; + + fn root_before(&self) -> B256 { + self.root_before.into() + } + + fn root_after(&self) -> B256 { + self.root_after.into() + } + + fn node_proofs(&self) -> impl Iterator { + self.flatten_proofs.as_ref().iter() + } +} + +impl StorageTraceExt for LegacyStorageTrace { + type Node = Bytes; + + fn root_before(&self) -> B256 { + self.root_before + } + + fn root_after(&self) -> B256 { + self.root_after + } + + fn node_proofs(&self) -> impl Iterator { + self.proofs.iter().flat_map(|(_, proofs)| proofs.iter()) + } +} + +fn import_serialized_node, Db: KVDatabase>( + node: N, + db: &mut NodeDb, +) -> Result<(), Db::Error> { + let bytes = node.as_ref(); + if bytes == MAGIC_NODE_BYTES { + return Ok(()); + } + let node = + cycle_track!(Node::::try_from(bytes), "Node::try_from").expect("invalid node"); + cycle_track!( + node.get_or_calculate_node_hash(), + "Node::get_or_calculate_node_hash" + ) + .expect("infallible"); + dev_trace!("put zktrie node: {:?}", node); + cycle_track!(db.put_node(node), "NodeDb::put_node") +} + +fn import_archived_node, Db: KVDatabase>( + node: N, + db: &mut NodeDb, +) -> Result<(), Db::Error> { + let bytes = node.as_ref(); + let node = cycle_track!( + rkyv::access::(bytes), + "rkyv::access" + ) + .expect("invalid node"); + let node_hash = cycle_track!( + node.calculate_node_hash::(), + "Node::calculate_node_hash" + ) + .expect("infallible"); + dev_trace!("put zktrie node: {:?}", node); + cycle_track!( + unsafe { db.put_archived_node_unchecked(node_hash, bytes.to_owned()) }, + "NodeDb::put_archived_node_unchecked" + ) +} + +impl NodeProof for Bytes { + fn import_node(&self, db: &mut NodeDb) -> Result<(), Db::Error> { + import_serialized_node(self, db) + } +} + +impl NodeProof for ArchivedVec { + fn import_node(&self, db: &mut NodeDb) -> Result<(), Db::Error> { + import_serialized_node(self, db) + } +} + +impl NodeProof for ArchivedNodeBytes { + fn import_node(&self, db: &mut NodeDb) -> Result<(), Db::Error> { + import_archived_node(&self.0, db) + } +} + +impl NodeProof for ArchivedArchivedNodeBytes { + fn import_node(&self, db: &mut NodeDb) -> Result<(), Db::Error> { + import_archived_node(&self.0, db) } } @@ -466,23 +715,42 @@ mod tests { fn test_rkyv() { let trace = serde_json::from_str::(TRACE).unwrap()["result"].clone(); let block: BlockTrace = serde_json::from_value(trace).unwrap(); - let archived_bytes = rkyv::to_bytes::<_, 4096>(&block).unwrap(); + let archived_bytes = rkyv::to_bytes::(&block).unwrap(); let archived_block = - rkyv::check_archived_root::(archived_bytes.as_ref()).unwrap(); + rkyv::access::(archived_bytes.as_ref()).unwrap(); assert_eq!(block.chain_id, archived_block.chain_id); - assert_eq!(block.coinbase.address, archived_block.coinbase.address); + assert_eq!( + block.coinbase.address, + Address::from(archived_block.coinbase.address) + ); - assert_eq!(block.header.number, archived_block.header.number); - assert_eq!(block.header.hash, archived_block.header.hash); - assert_eq!(block.header.timestamp, archived_block.header.timestamp); - assert_eq!(block.header.gas_limit, archived_block.header.gas_limit); + assert_eq!(block.header.number, archived_block.header.number.into()); + assert_eq!(block.header.hash, B256::from(archived_block.header.hash)); + assert_eq!( + block.header.timestamp, + archived_block.header.timestamp.into() + ); + assert_eq!( + block.header.gas_limit, + archived_block.header.gas_limit.into() + ); assert_eq!( block.header.base_fee_per_gas, - archived_block.header.base_fee_per_gas + archived_block + .header + .base_fee_per_gas + .as_ref() + .map(|p| p.into()) + ); + assert_eq!( + block.header.difficulty, + archived_block.header.difficulty.into() + ); + assert_eq!( + block.header.mix_hash, + archived_block.header.mix_hash.as_ref().map(|p| p.into()) ); - assert_eq!(block.header.difficulty, archived_block.header.difficulty); - assert_eq!(block.header.mix_hash, archived_block.header.mix_hash); let txs = block .transactions @@ -502,11 +770,11 @@ mod tests { assert_eq!( block.storage_trace.root_before, - archived_block.storage_trace.root_before + B256::from(archived_block.storage_trace.root_before) ); assert_eq!( block.storage_trace.root_after, - archived_block.storage_trace.root_after + B256::from(archived_block.storage_trace.root_after) ); for (proof, archived_proof) in block .storage_trace diff --git a/crates/primitives/src/types/tx.rs b/crates/primitives/src/types/tx.rs index 443d59e..3220eb8 100644 --- a/crates/primitives/src/types/tx.rs +++ b/crates/primitives/src/types/tx.rs @@ -6,6 +6,7 @@ use alloy::{ primitives::{Address, Bytes, ChainId, Signature, SignatureError, TxKind, B256, U256, U64}, rlp::{BufMut, BytesMut, Encodable, Header}, }; +use rkyv::rancor; use serde_with::{serde_as, DefaultOnNull}; /// Wrapped Ethereum Transaction @@ -60,51 +61,68 @@ pub struct TxL1Msg { Debug, Clone, )] -#[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[rkyv(attr(doc = "Archived `TransactionTrace`"))] +#[rkyv(derive(Debug, Hash, PartialEq, Eq))] pub struct TransactionTrace { /// tx hash + #[rkyv(attr(doc = "tx hash"))] #[serde(default, rename = "txHash")] pub tx_hash: B256, /// tx type (in raw from) + #[rkyv(attr(doc = "tx type (in raw from)"))] #[serde(rename = "type")] pub ty: u8, /// nonce + #[rkyv(attr(doc = "nonce"))] pub nonce: u64, /// gas limit + #[rkyv(attr(doc = "gas limit"))] pub gas: u64, - #[serde(rename = "gasPrice")] /// gas price + #[rkyv(attr(doc = "gas price"))] + #[serde(rename = "gasPrice")] pub gas_price: U256, - #[serde(rename = "gasTipCap")] /// gas tip cap + #[rkyv(attr(doc = "gas tip cap"))] + #[serde(rename = "gasTipCap")] pub gas_tip_cap: Option, - #[serde(rename = "gasFeeCap")] /// gas fee cap + #[rkyv(attr(doc = "gas fee cap"))] + #[serde(rename = "gasFeeCap")] pub gas_fee_cap: Option, /// from + #[rkyv(attr(doc = "from"))] pub from: Address, /// to, NONE for creation (0 addr) + #[rkyv(attr(doc = "to, NONE for creation (0 addr)"))] pub to: Option
, /// chain id + #[rkyv(attr(doc = "chain id"))] #[serde(rename = "chainId")] pub chain_id: U64, /// value amount + #[rkyv(attr(doc = "value amount"))] pub value: U256, /// call data + #[rkyv(attr(doc = "call data"))] pub data: Bytes, /// is creation + #[rkyv(attr(doc = "is creation"))] #[serde(rename = "isCreate")] pub is_create: bool, /// access list + #[rkyv(attr(doc = "access list"))] #[serde(rename = "accessList")] #[serde_as(as = "DefaultOnNull")] pub access_list: AccessList, /// signature v + #[rkyv(attr(doc = "signature v"))] pub v: U64, /// signature r + #[rkyv(attr(doc = "signature r"))] pub r: U256, /// signature s + #[rkyv(attr(doc = "signature s"))] pub s: U256, } @@ -173,7 +191,7 @@ impl TxTrace for TransactionTrace { impl TxTrace for ArchivedTransactionTrace { fn tx_hash(&self) -> B256 { - self.tx_hash + self.tx_hash.into() } fn ty(&self) -> u8 { @@ -181,50 +199,59 @@ impl TxTrace for ArchivedTransactionTrace { } fn nonce(&self) -> u64 { - self.nonce + self.nonce.into() } fn gas_limit(&self) -> u128 { - self.gas as u128 + u64::from(self.gas) as u128 } fn gas_price(&self) -> u128 { - self.gas_price.to() + let gas_price: U256 = self.gas_price.into(); + gas_price.to() } fn max_fee_per_gas(&self) -> u128 { self.gas_fee_cap .as_ref() - .map(|v| v.to()) + .map(|g| { + let gas_fee_cap: U256 = g.into(); + gas_fee_cap.to() + }) .unwrap_or_default() } fn max_priority_fee_per_gas(&self) -> u128 { self.gas_tip_cap .as_ref() - .map(|v| v.to()) + .map(|g| { + let gas_tip_cap: U256 = g.into(); + gas_tip_cap.to() + }) .unwrap_or_default() } unsafe fn get_from_unchecked(&self) -> Address { - self.from + self.from.into() } fn to(&self) -> TxKind { if self.is_create { TxKind::Create } else { - debug_assert!(self.to.as_ref().map(|a| !a.is_zero()).unwrap_or(false)); - TxKind::Call(*self.to.as_ref().expect("to address must be present")) + let to: Address = self.to.as_ref().expect("to address must be present").into(); + debug_assert!(!to.is_zero()); + TxKind::Call(to) } } fn chain_id(&self) -> ChainId { - self.chain_id.to() + let chain_id: U64 = self.chain_id.into(); + chain_id.to() } fn value(&self) -> U256 { - self.value + self.value.into() } fn data(&self) -> Bytes { @@ -232,12 +259,12 @@ impl TxTrace for ArchivedTransactionTrace { } fn access_list(&self) -> AccessList { - rkyv::Deserialize::::deserialize(&self.access_list, &mut rkyv::Infallible) - .unwrap() + rkyv::deserialize::<_, rancor::Error>(&self.access_list).unwrap() } fn signature(&self) -> Result { - Signature::from_rs_and_parity(self.r, self.s, self.v) + let v: U64 = self.v.into(); + Signature::from_rs_and_parity(self.r.into(), self.s.into(), v) } }