From 8ad8038e39f9b88abfe8680e32bba19ac4497a1d Mon Sep 17 00:00:00 2001 From: Akase Haruka Date: Thu, 10 Oct 2024 16:20:03 +0800 Subject: [PATCH] feat: add archived import support (#7) * add archived import support * upgrade rkyv * fix * fix clippy * update ci --- .github/workflows/ci.yml | 2 +- Cargo.lock | 279 ++++++++++++----------- Cargo.toml | 9 +- src/db/kv/mod.rs | 8 + src/db/kv/sled.rs | 7 + src/db/mod.rs | 20 +- src/trie/node/imp.rs | 12 +- src/trie/node/mod.rs | 8 +- src/trie/node/rkyv_imp.rs | 468 ++++++++++---------------------------- src/trie/zktrie/imp.rs | 18 +- 10 files changed, 327 insertions(+), 504 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da710db..f89b413 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,7 +57,7 @@ jobs: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@master with: - toolchain: "1.75" + toolchain: "1.81" components: clippy - name: cargo cache uses: Swatinem/rust-cache@v2 diff --git a/Cargo.lock b/Cargo.lock index cdea75e..deab990 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,17 +2,6 @@ # It is not intended for manual editing. version = 3 -[[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" @@ -43,7 +32,7 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[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", @@ -52,7 +41,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", @@ -73,7 +62,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", @@ -111,7 +100,7 @@ checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -252,9 +241,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -270,14 +259,14 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "base16ct" @@ -353,7 +342,7 @@ dependencies = [ [[package]] name = "bn254" version = "0.1.0" -source = "git+https://github.com/scroll-tech/bn254#c9f170c6e39cfbc1ff14b9648f125823978041b3" +source = "git+https://github.com/scroll-tech/bn254#3653980f712ad44d4e079fa8f0199c5678104ef4" dependencies = [ "ff 0.13.0 (git+https://github.com/scroll-tech/ff?branch=feat/sp1)", "getrandom", @@ -376,24 +365,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]] @@ -404,9 +394,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cast" @@ -416,9 +406,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.18" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "jobserver", "libc", @@ -460,18 +450,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.17" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstyle", "clap_lex", @@ -485,9 +475,9 @@ checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "const-hex" -version = "1.12.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" dependencies = [ "cfg-if", "cpufeatures", @@ -628,7 +618,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -662,7 +652,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -739,7 +729,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -930,22 +920,19 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "ahash 0.7.8", + "ahash", + "allocator-api2", ] [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.11", - "allocator-api2", -] +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "heck" @@ -1008,12 +995,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -1071,18 +1058,18 @@ dependencies = [ [[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", ] [[package]] name = "k256" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" dependencies = [ "cfg-if", "ecdsa", @@ -1112,9 +1099,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libm" @@ -1159,6 +1146,26 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[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 = "nu-ansi-term" version = "0.46.0" @@ -1221,7 +1228,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1267,9 +1274,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oorandom" @@ -1357,9 +1364,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pest" -version = "2.7.12" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c73c26c01b8c87956cea613c907c9d6ecffd8d18a2a5908e5de0adfaa185cea" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" dependencies = [ "memchr", "thiserror", @@ -1452,9 +1459,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] @@ -1473,7 +1480,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -1481,22 +1488,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]] @@ -1520,6 +1527,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" @@ -1590,14 +1606,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] @@ -1611,13 +1627,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -1628,15 +1644,15 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +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", ] @@ -1644,7 +1660,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", @@ -1671,31 +1687,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", + "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]] @@ -1711,7 +1728,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", @@ -1735,7 +1752,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-hex" @@ -1813,12 +1830,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" @@ -1874,7 +1885,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2024,7 +2035,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2046,9 +2057,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -2063,9 +2074,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -2076,22 +2087,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2146,9 +2157,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap", "toml_datetime", @@ -2174,7 +2185,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2224,9 +2235,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -2297,9 +2308,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", @@ -2308,24 +2319,24 @@ 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", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] [[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", @@ -2333,28 +2344,28 @@ 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", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[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", @@ -2475,9 +2486,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -2509,7 +2520,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2529,13 +2540,13 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "zktrie" version = "0.3.0" -source = "git+https://github.com/scroll-tech/zktrie.git?branch=main#bd52e599148cb6634d8a994fa875f6d2ba03ea45" +source = "git+https://github.com/scroll-tech/zktrie.git?branch=main#0527b14b29abde8ba9fbaf34315d545cf32618a0" dependencies = [ "gobuild", "zktrie_rust", @@ -2569,7 +2580,7 @@ dependencies = [ [[package]] name = "zktrie_rust" version = "0.3.0" -source = "git+https://github.com/scroll-tech/zktrie.git?branch=main#bd52e599148cb6634d8a994fa875f6d2ba03ea45" +source = "git+https://github.com/scroll-tech/zktrie.git?branch=main#0527b14b29abde8ba9fbaf34315d545cf32618a0" dependencies = [ "hex", "lazy_static", diff --git a/Cargo.toml b/Cargo.toml index 2cb4d8a..a9b3516 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "zktrie-ng" version = "0.1.0" edition = "2021" -rust-version = "1.75" +rust-version = "1.81" [package.metadata.docs.rs] features = ["sled"] @@ -23,7 +23,7 @@ num-derive = "0.4" num-traits = "0.2" once_cell = "1.19" poseidon-bn254 = { git = "https://github.com/scroll-tech/poseidon-bn254", branch = "master" } -rkyv = { version = "0.7", features = ["validation"] } +rkyv = "0.8" sled = { version = "0.34", optional = true } strum = { version = "0.26", features = ["derive"] } thiserror = "1.0" @@ -66,10 +66,13 @@ scroll = ["dep:revm-primitives"] sled = ["dep:sled"] sled_compression = ["sled", "sled/zstd"] -# MSRV 1.75 & rkyv patch +# patched add rkyv support & MSRV 1.77 [patch.crates-io] ruint = { git = "https://github.com/scroll-tech/uint.git", branch = "v1.12.3" } + alloy-eips = { git = "https://github.com/scroll-tech/alloy.git", branch = "v0.3.0" } + 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-primitives = { git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0" } \ No newline at end of file diff --git a/src/db/kv/mod.rs b/src/db/kv/mod.rs index 011e3f7..d7a3381 100644 --- a/src/db/kv/mod.rs +++ b/src/db/kv/mod.rs @@ -24,6 +24,9 @@ pub trait KVDatabaseItem: From> + AsRef<[u8]> + Clone { value.to_vec().into() } + /// Construct a value from bytes. + fn from_bytes(bytes: Bytes) -> Self; + /// Turn the value into a [`Bytes`]. fn into_bytes(self) -> Bytes; } @@ -138,6 +141,11 @@ pub trait KVDatabase { } impl KVDatabaseItem for Bytes { + #[inline] + fn from_bytes(bytes: Bytes) -> Self { + bytes + } + #[inline] fn into_bytes(self) -> Bytes { self diff --git a/src/db/kv/sled.rs b/src/db/kv/sled.rs index eb3a4a5..9243ccb 100644 --- a/src/db/kv/sled.rs +++ b/src/db/kv/sled.rs @@ -56,10 +56,17 @@ impl SledDb { } impl KVDatabaseItem for IVec { + #[inline] fn from_slice(value: &[u8]) -> Self { IVec::from(value) } + #[inline] + fn from_bytes(bytes: Bytes) -> Self { + IVec::from(bytes.to_vec()) + } + + #[inline] fn into_bytes(self) -> Bytes { Bytes::from(self.to_vec()) } diff --git a/src/db/mod.rs b/src/db/mod.rs index 192dcfb..3673e61 100644 --- a/src/db/mod.rs +++ b/src/db/mod.rs @@ -58,18 +58,32 @@ impl NodeDb { } /// Put a node into the database. - pub fn put_node(&mut self, node: &Node) -> Result<(), KvDb::Error> { - let node_hash = node.node_hash.get().expect("Node hash not calculated"); + pub fn put_node(&mut self, node: Node) -> Result<(), KvDb::Error> { + let node_hash = *node.node_hash.get().expect("Node hash not calculated"); if let NodeKind::Branch(branch) = node.data.as_ref() { if !branch.child_right().is_resolved() || !branch.child_left().is_resolved() { panic!("Cannot archive branch node with unresolved child hash"); } } - let bytes = rkyv::to_bytes::<_, 1024>(node).expect("infallible"); + let bytes = node.archived(); self.db.put(node_hash.as_ref(), bytes.as_ref())?; Ok(()) } + /// Put a archived node bytes into the database. + /// + /// # Safety + /// + /// The bytes must be valid rkyv archived `Node` bytes and the hash must be the hash of the node. + pub unsafe fn put_archived_node_unchecked( + &mut self, + node_hash: ZkHash, + bytes: Vec, + ) -> Result<(), KvDb::Error> { + self.db.put_owned(node_hash.0, bytes)?; + Ok(()) + } + /// Get a node from the database. pub fn get_node(&self, hash: &ZkHash) -> Result, KvDb::Error> { Ok(self.db.get(hash)?.map(|b| NodeViewer { diff --git a/src/trie/node/imp.rs b/src/trie/node/imp.rs index 987fb5d..c3a6553 100644 --- a/src/trie/node/imp.rs +++ b/src/trie/node/imp.rs @@ -90,8 +90,8 @@ impl Eq for LazyNodeHash {} impl LeafNode { /// Get the `node_key` stored in a leaf node. #[inline] - pub fn node_key(&self) -> &ZkHash { - &self.node_key + pub fn node_key(&self) -> ZkHash { + self.node_key } /// Get the original key value that derives the `node_key`, kept here only for proof. @@ -114,15 +114,15 @@ impl LeafNode { /// Get the `value_hash` of the leaf node. #[inline] - pub fn value_hash(&self) -> Option<&ZkHash> { - self.value_hash.get() + pub fn value_hash(&self) -> Option { + self.value_hash.get().copied() } /// Get the `value_hash` #[inline] pub fn get_or_calc_value_hash(&self) -> Result { match self.value_hash() { - Some(hash) => Ok(*hash), + Some(hash) => Ok(hash), None => H::hash_bytes_array(self.value_preimages(), self.compress_flags()), } } @@ -299,7 +299,7 @@ impl Node { let value_hash = leaf.get_or_calc_value_hash::()?; return self .node_hash - .get_or_try_init(|| H::hash(Leaf as u64, [*leaf.node_key(), value_hash])); + .get_or_try_init(|| H::hash(Leaf as u64, [leaf.node_key(), value_hash])); } let branch = self.data.as_branch().expect("infallible"); let left = branch.child_left.unwrap_ref(); diff --git a/src/trie/node/mod.rs b/src/trie/node/mod.rs index e9c0a4b..077e5c2 100644 --- a/src/trie/node/mod.rs +++ b/src/trie/node/mod.rs @@ -10,7 +10,9 @@ mod imp; mod rkyv_imp; use crate::hash::poseidon::Poseidon; -pub use rkyv_imp::*; +pub use rkyv_imp::{ + ArchivedBranchNode, ArchivedLeafNode, ArchivedNode, IBranchNode, ILeafNode, INode, NodeViewer, +}; #[cfg(test)] mod tests; @@ -90,9 +92,7 @@ pub struct BranchNode { } /// Three kinds of nodes in the merkle tree. -#[derive(Clone, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)] -#[archive(check_bytes)] -#[archive_attr(derive(Debug))] +#[derive(Clone)] pub enum NodeKind { /// An empty node. Empty, diff --git a/src/trie/node/rkyv_imp.rs b/src/trie/node/rkyv_imp.rs index 268be6d..1c05038 100644 --- a/src/trie/node/rkyv_imp.rs +++ b/src/trie/node/rkyv_imp.rs @@ -3,12 +3,91 @@ use super::*; use alloy_primitives::bytes::Bytes; -use rkyv::{ - bytecheck::StructCheckError, out_field, Archive, Archived, CheckBytes, Deserialize, Fallible, - Serialize, -}; -use std::fmt::{self, Debug, Formatter}; -use std::marker::PhantomData; +use rkyv::rancor; +use rkyv::util::AlignedVec; +use std::fmt::Debug; + +/// An archived [`Node`]. +#[derive(Clone, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)] +#[rkyv(archived = ArchivedNode, derive(Debug, Hash, PartialEq, Eq))] +pub struct NodeForArchive { + node_hash: Option, + data: NodeKindForArchive, +} + +impl From> for NodeForArchive { + fn from(node: Node) -> Self { + Self { + node_hash: node.node_hash.get().copied(), + data: if node.data.is_empty() { + NodeKindForArchive::Empty + } else if node.data.is_leaf() { + NodeKindForArchive::Leaf(node.data.as_leaf().unwrap().clone().into()) + } else { + NodeKindForArchive::Branch(node.data.as_branch().unwrap().clone().into()) + }, + } + } +} + +impl Node { + /// Archive the node into bytes + pub fn archived(self) -> AlignedVec { + rkyv::to_bytes::(&NodeForArchive::from(self)).expect("infallible") + } +} + +/// Three kinds of nodes in the merkle tree. +#[derive(Clone, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)] +#[rkyv(archived = ArchivedNodeKind, derive(Debug, Hash, PartialEq, Eq))] +pub enum NodeKindForArchive { + /// An empty node. + Empty, + /// A leaf node. + Leaf(LeafNodeForArchive), + /// A branch node. + Branch(BranchNodeForArchive), +} + +#[derive(Clone, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)] +#[rkyv(archived = ArchivedLeafNode, derive(Debug, Hash, PartialEq, Eq))] +pub struct LeafNodeForArchive { + node_key: ZkHash, + node_key_preimage: Option<[u8; 32]>, + value_preimages: Vec<[u8; 32]>, + compress_flags: u32, + value_hash: Option, +} + +impl From for LeafNodeForArchive { + fn from(node: LeafNode) -> Self { + Self { + node_key: node.node_key, + node_key_preimage: node.node_key_preimage, + value_preimages: node.value_preimages, + compress_flags: node.compress_flags, + value_hash: node.value_hash.get().copied(), + } + } +} + +#[derive(Clone, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)] +#[rkyv(archived = ArchivedBranchNode, derive(Debug, Hash, PartialEq, Eq))] +pub struct BranchNodeForArchive { + node_type: u8, + child_left: ZkHash, + child_right: ZkHash, +} + +impl From for BranchNodeForArchive { + fn from(node: BranchNode) -> Self { + Self { + node_type: node.node_type as u8, + child_left: *node.child_left.unwrap_ref(), + child_right: *node.child_right.unwrap_ref(), + } + } +} impl ArchivedNodeKind { /// is empty node @@ -48,18 +127,8 @@ impl ArchivedNodeKind { } } -/// An archived [`LeafNode`]. -#[derive(Debug)] -pub struct ArchivedLeafNode { - pub(crate) node_key: Archived, - pub(crate) node_key_preimage: Archived>, - pub(crate) value_preimages: Archived>, - pub(crate) compress_flags: Archived, - pub(crate) value_hash: Archived>, -} - /// A leaf node that may be archived. -#[derive(Clone, Debug)] +#[derive(Clone)] pub enum ILeafNode<'a> { /// Owned leaf node. Owned(&'a LeafNode), @@ -67,25 +136,8 @@ pub enum ILeafNode<'a> { Archived(&'a ArchivedLeafNode), } -/// A resolver for [`LeafNode`]. -pub struct LeafNodeResolver { - node_key: rkyv::Resolver, - node_key_preimage: rkyv::Resolver>, - value_preimages: rkyv::Resolver>, - compress_flags: rkyv::Resolver, - value_hash: rkyv::Resolver>, -} - -/// An archived [`BranchNode`]. -#[derive(Copy, Clone, Debug)] -pub struct ArchivedBranchNode { - pub(crate) node_type: Archived, - pub(crate) child_left: Archived, - pub(crate) child_right: Archived, -} - /// A branch node that may be archived. -#[derive(Clone, Debug)] +#[derive(Clone)] pub enum IBranchNode<'a> { /// Owned branch node. Owned(&'a BranchNode), @@ -93,26 +145,6 @@ pub enum IBranchNode<'a> { Archived(&'a ArchivedBranchNode), } -/// A resolver for [`BranchNode`]. -pub struct BranchNodeResolver { - node_type: rkyv::Resolver, - child_left: rkyv::Resolver, - child_right: rkyv::Resolver, -} - -/// An archived [`Node`]. -#[derive(Debug)] -pub struct ArchivedNode { - node_hash: Archived>, - data: Archived, -} - -/// A node that may be archived. -pub struct NodeResolver { - node_hash: rkyv::Resolver>, - data: rkyv::Resolver, -} - /// A viewer to a chunk of archived bytes that represents a node. #[derive(Clone, Debug)] pub struct NodeViewer { @@ -129,80 +161,11 @@ pub enum INode { Archived(NodeViewer), } -impl Archive for LeafNode { - type Archived = ArchivedLeafNode; - type Resolver = LeafNodeResolver; - - unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { - let (fp, fo) = out_field!(out.node_key); - self.node_key.resolve(pos + fp, resolver.node_key, fo); - let (fp, fo) = out_field!(out.node_key_preimage); - self.node_key_preimage - .resolve(pos + fp, resolver.node_key_preimage, fo); - let (fp, fo) = out_field!(out.value_preimages); - self.value_preimages - .resolve(pos + fp, resolver.value_preimages, fo); - let (fp, fo) = out_field!(out.compress_flags); - self.compress_flags - .resolve(pos + fp, resolver.compress_flags, fo); - let (fp, fo) = out_field!(out.value_hash); - self.value_hash - .get() - .copied() - .resolve(pos + fp, resolver.value_hash, fo); - } -} - -impl Serialize for LeafNode -where - [u8; 32]: Serialize, - Vec<[u8; 32]>: Serialize, -{ - #[inline] - fn serialize(&self, serializer: &mut S) -> Result { - Ok(LeafNodeResolver { - node_key: Serialize::::serialize(&self.node_key, serializer)?, - node_key_preimage: Serialize::::serialize(&self.node_key_preimage, serializer)?, - value_preimages: Serialize::::serialize(&self.value_preimages, serializer)?, - compress_flags: Serialize::::serialize(&self.compress_flags, serializer)?, - value_hash: Serialize::::serialize(&self.value_hash.get().copied(), serializer)?, - }) - } -} - -impl Deserialize for Archived { - #[inline] - fn deserialize(&self, deserializer: &mut D) -> Result { - Ok(LeafNode { - node_key: Deserialize::::deserialize(&self.node_key, deserializer)?, - node_key_preimage: Deserialize::, D>::deserialize( - &self.node_key_preimage, - deserializer, - )?, - value_preimages: Deserialize::, D>::deserialize( - &self.value_preimages, - deserializer, - )?, - compress_flags: Deserialize::::deserialize(&self.compress_flags, deserializer)?, - value_hash: { - let value_hash = OnceCell::new(); - if let Some(hash) = - Deserialize::, D>::deserialize(&self.value_hash, deserializer)? - { - value_hash.set(hash).expect("infalible"); - } - - value_hash - }, - }) - } -} - impl ArchivedLeafNode { /// Get the `node_key` stored in a leaf node. #[inline] - pub fn node_key(&self) -> &ZkHash { - &self.node_key + pub fn node_key(&self) -> ZkHash { + (&self.node_key).into() } /// Get the original key value that derives the `node_key`, kept here only for proof. @@ -220,29 +183,35 @@ impl ArchivedLeafNode { /// Get the compress flags stored in a leaf node. #[inline] pub fn compress_flags(&self) -> u32 { - self.compress_flags + self.compress_flags.into() } /// Get the `value_hash` of the leaf node. #[inline] - pub fn value_hash(&self) -> Option<&ZkHash> { - self.value_hash.as_ref() + pub fn value_hash(&self) -> Option { + self.value_hash.as_ref().map(|hash| hash.into()) } /// Get the `value_hash` #[inline] pub fn get_or_calc_value_hash(&self) -> Result { match self.value_hash() { - Some(hash) => Ok(*hash), - None => H::hash_bytes_array(self.value_preimages(), self.compress_flags()), + Some(hash) => Ok(hash), + None => self.calc_value_hash::(), } } + + /// Calculate the `value_hash` + #[inline] + pub fn calc_value_hash(&self) -> Result { + H::hash_bytes_array(self.value_preimages(), self.compress_flags()) + } } impl ILeafNode<'_> { /// Get the `node_key` stored in a leaf node. #[inline] - pub fn node_key(&self) -> &ZkHash { + pub fn node_key(&self) -> ZkHash { match self { ILeafNode::Owned(leaf) => leaf.node_key(), ILeafNode::Archived(leaf) => leaf.node_key(), @@ -278,7 +247,7 @@ impl ILeafNode<'_> { /// Get the `value_hash` of the leaf node. #[inline] - pub fn value_hash(&self) -> Option<&ZkHash> { + pub fn value_hash(&self) -> Option { match self { ILeafNode::Owned(leaf) => leaf.value_hash(), ILeafNode::Archived(leaf) => leaf.value_hash(), @@ -295,125 +264,6 @@ impl ILeafNode<'_> { } } -impl CheckBytes for ArchivedLeafNode -where - Archived>: CheckBytes, -{ - type Error = StructCheckError; - unsafe fn check_bytes<'c>( - value: *const Self, - context: &mut C, - ) -> Result<&'c Self, StructCheckError> { - Archived::::check_bytes(&(*value).node_key, context).map_err(|e| { - StructCheckError { - field_name: "node_key", - inner: Box::new(e), - } - })?; - Archived::>::check_bytes(&(*value).node_key_preimage, context).map_err( - |e| StructCheckError { - field_name: "node_key_preimage", - inner: Box::new(e), - }, - )?; - Archived::>::check_bytes(&(*value).value_preimages, context).map_err( - |e| StructCheckError { - field_name: "value_preimages", - inner: Box::new(e), - }, - )?; - Archived::::check_bytes(&(*value).compress_flags, context).map_err(|e| { - StructCheckError { - field_name: "compress_flags", - inner: Box::new(e), - } - })?; - Archived::>::check_bytes(&(*value).value_hash, context).map_err(|e| { - StructCheckError { - field_name: "value_hash", - inner: Box::new(e), - } - })?; - Ok(&*value) - } -} - -impl Archive for BranchNode { - type Archived = ArchivedBranchNode; - type Resolver = BranchNodeResolver; - - unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { - let (fp, fo) = out_field!(out.node_type); - (self.node_type as u8).resolve(pos + fp, resolver.node_type, fo); - let (fp, fo) = out_field!(out.child_left); - self.child_left - .try_as_hash() - .expect("cannot archive a lazy hash") - .resolve(pos + fp, resolver.child_left, fo); - let (fp, fo) = out_field!(out.child_right); - self.child_right - .try_as_hash() - .expect("cannot archive a lazy hash") - .resolve(pos + fp, resolver.child_right, fo); - } -} - -impl Serialize for BranchNode { - #[inline] - fn serialize(&self, serializer: &mut S) -> Result { - Ok(BranchNodeResolver { - node_type: Serialize::::serialize(&(self.node_type as u8), serializer)?, - child_left: Serialize::::serialize(self.child_left.unwrap_ref(), serializer)?, - child_right: Serialize::::serialize(self.child_right.unwrap_ref(), serializer)?, - }) - } -} - -impl Deserialize for Archived { - #[inline] - fn deserialize(&self, deserializer: &mut D) -> Result { - Ok(BranchNode { - node_type: NodeType::from_u8(self.node_type).expect("invalid node type"), - child_left: LazyNodeHash::Hash(Deserialize::::deserialize( - &self.child_left, - deserializer, - )?), - child_right: LazyNodeHash::Hash(Deserialize::::deserialize( - &self.child_right, - deserializer, - )?), - }) - } -} - -impl CheckBytes for ArchivedBranchNode { - type Error = StructCheckError; - unsafe fn check_bytes<'c>( - value: *const Self, - context: &mut C, - ) -> Result<&'c Self, StructCheckError> { - Archived::::check_bytes(&(*value).node_type, context).map_err(|e| { - StructCheckError { - field_name: "node_type", - inner: Box::new(e), - } - })?; - Archived::::check_bytes(&(*value).child_left, context).map_err(|e| { - StructCheckError { - field_name: "child_left", - inner: Box::new(e), - } - })?; - Archived::::check_bytes(&(*value).child_right, context).map_err(|e| { - StructCheckError { - field_name: "child_right", - inner: Box::new(e), - } - })?; - Ok(&*value) - } -} - impl<'a> IBranchNode<'a> { /// Get the node type. #[inline] @@ -459,13 +309,13 @@ impl ArchivedBranchNode { /// Get the left child hash. #[inline] pub fn child_left(&self) -> LazyNodeHash { - LazyNodeHash::Hash(self.child_left) + LazyNodeHash::Hash((&self.child_left).into()) } /// Get the right child hash. #[inline] pub fn child_right(&self) -> LazyNodeHash { - LazyNodeHash::Hash(self.child_right) + LazyNodeHash::Hash((&self.child_right).into()) } /// As the parts @@ -475,83 +325,6 @@ impl ArchivedBranchNode { } } -impl Archive for Node { - type Archived = ArchivedNode; - type Resolver = NodeResolver; - - unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) { - let (fp, fo) = out_field!(out.node_hash); - self.node_hash - .get() - .copied() - .resolve(pos + fp, resolver.node_hash, fo); - let (fp, fo) = out_field!(out.data); - self.data.as_ref().resolve(pos + fp, resolver.data, fo); - } -} - -impl Serialize for Node -where - LeafNode: Serialize, - BranchNode: Serialize, -{ - #[inline] - fn serialize(&self, serializer: &mut S) -> Result { - Ok(NodeResolver { - node_hash: Serialize::::serialize(&self.node_hash.get().copied(), serializer)?, - data: Serialize::::serialize(self.data.as_ref(), serializer)?, - }) - } -} - -impl Deserialize, D> for Archived> { - #[inline] - fn deserialize(&self, deserializer: &mut D) -> Result, D::Error> { - Ok(Node { - node_hash: { - let node_hash = OnceCell::new(); - if let Some(hash) = - Deserialize::, D>::deserialize(&self.node_hash, deserializer)? - { - node_hash.set(hash).expect("infalible"); - } - - Arc::new(node_hash) - }, - data: Arc::new(Deserialize::::deserialize( - &self.data, - deserializer, - )?), - _hash_scheme: PhantomData, - }) - } -} - -impl CheckBytes for ArchivedNode -where - Archived: CheckBytes, -{ - type Error = StructCheckError; - unsafe fn check_bytes<'c>( - value: *const Self, - context: &mut C, - ) -> Result<&'c Self, StructCheckError> { - Archived::>::check_bytes(&(*value).node_hash, context).map_err(|e| { - StructCheckError { - field_name: "node_hash", - inner: Box::new(e), - } - })?; - Archived::::check_bytes(&(*value).data, context).map_err(|e| { - StructCheckError { - field_name: "data", - inner: Box::new(e), - } - })?; - Ok(&*value) - } -} - impl ArchivedNode { /// Get the node type. #[inline] @@ -600,7 +373,7 @@ impl ArchivedNode { + 1, ); bytes.push(Leaf as u8); - bytes.extend_from_slice(leaf.node_key.as_ref()); + bytes.extend_from_slice(leaf.node_key.0.as_ref()); let mark = (leaf.compress_flags << 8) + leaf.value_preimages.len() as u32; bytes.extend_from_slice(&mark.to_le_bytes()); for preimage in leaf.value_preimages.iter() { @@ -619,8 +392,8 @@ impl ArchivedNode { ArchivedNodeKind::Branch(branch) => { let mut bytes = Vec::with_capacity(1 + 2 * HASH_SIZE); bytes.push(branch.node_type); - bytes.extend_from_slice(branch.child_left.as_ref()); - bytes.extend_from_slice(branch.child_right.as_ref()); + bytes.extend_from_slice(branch.child_left.0.as_ref()); + bytes.extend_from_slice(branch.child_right.0.as_ref()); bytes } ArchivedNodeKind::Empty => { @@ -628,13 +401,29 @@ impl ArchivedNode { } } } + + /// Calculate the node hash. + pub fn calculate_node_hash(&self) -> Result { + if self.data.is_empty() { + return Ok(ZkHash::ZERO); + } + if let Some(leaf) = self.as_leaf() { + let value_hash = leaf.calc_value_hash::()?; + return H::hash(Leaf as u64, [leaf.node_key(), value_hash]); + } + let branch = self.as_branch().unwrap(); + H::hash( + branch.node_type() as u64, + [(&branch.child_left).into(), (&branch.child_right).into()], + ) + } } impl NodeViewer { /// View the archived node. pub fn view(&self) -> &ArchivedNode { // SAFETY: The bytes are guaranteed to be a valid archived node - unsafe { rkyv::archived_root::(self.data.as_ref()) } + unsafe { rkyv::access_unchecked::(self.data.as_ref()) } } } @@ -731,12 +520,3 @@ impl INode { } } } - -impl Debug for INode { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - INode::Owned(node) => Debug::fmt(node, f), - INode::Archived(node) => Debug::fmt(node.view(), f), - } - } -} diff --git a/src/trie/zktrie/imp.rs b/src/trie/zktrie/imp.rs index f3dbb2b..eea6d23 100644 --- a/src/trie/zktrie/imp.rs +++ b/src/trie/zktrie/imp.rs @@ -342,7 +342,7 @@ impl> ZkTrie { } /// Get a node from the trie by node hash - #[instrument(level = "trace", skip(self, db, node_hash), ret)] + #[instrument(level = "trace", skip(self, db, node_hash))] pub fn get_node_by_hash( &self, db: &NodeDb, @@ -376,7 +376,7 @@ impl> ZkTrie { } /// Get a node from the trie by node key - #[instrument(level = "trace", skip(self, db, node_key), ret)] + #[instrument(level = "trace", skip(self, db, node_key))] pub fn get_node_by_key( &self, db: &NodeDb, @@ -389,7 +389,7 @@ impl> ZkTrie { NodeType::Empty => return Ok(INode::Owned(Node::::empty())), NodeType::Leaf => { let leaf = n.as_leaf().unwrap(); - return if leaf.node_key() == node_key { + return if leaf.node_key() == *node_key { Ok(n) } else if i != H::TRIE_MAX_LEVELS - 1 { // the node is compressed, we just reached another leaf node @@ -461,7 +461,7 @@ impl> ZkTrie { n.as_branch().unwrap().as_parts(); let leaf_node_key = leaf.as_leaf().unwrap().node_key(); - let new_parent_node = if get_path(leaf_node_key, level) { + let new_parent_node = if get_path(&leaf_node_key, level) { // go right let (new_node_hash, is_terminal) = self.add_leaf(db, leaf, current_node_right_child.clone(), level + 1)?; @@ -532,8 +532,8 @@ impl> ZkTrie { return Err(ZkTrieError::MaxLevelReached); } - let old_leaf_node_key = *old_leaf.as_leaf().unwrap().node_key(); - let new_leaf_node_key = *new_leaf.as_leaf().unwrap().node_key(); + let old_leaf_node_key = old_leaf.as_leaf().unwrap().node_key(); + let new_leaf_node_key = new_leaf.as_leaf().unwrap().node_key(); let old_leaf_path = get_path(&old_leaf_node_key, level); let new_leaf_path = get_path(&new_leaf_node_key, level); @@ -592,7 +592,7 @@ impl> ZkTrie { match root.node_type() { NodeType::Empty => Err(ZkTrieError::NodeNotFound), NodeType::Leaf => { - if root.as_leaf().unwrap().node_key() != &node_key { + if root.as_leaf().unwrap().node_key() != node_key { Err(ZkTrieError::NodeNotFound) } else { self.gc_nodes.insert(root_hash); @@ -679,7 +679,7 @@ impl> ZkTrie { match node_hash { LazyNodeHash::Hash(node_hash) => { if let Some(node) = self.dirty_leafs.remove(&node_hash) { - db.put_node(&node).map_err(ZkTrieError::Db)?; + db.put_node(node).map_err(ZkTrieError::Db)?; } Ok(node_hash) } @@ -691,7 +691,7 @@ impl> ZkTrie { let node_hash = *node .get_or_calculate_node_hash() .map_err(ZkTrieError::Hash)?; - db.put_node(&node).map_err(ZkTrieError::Db)?; + db.put_node(node).map_err(ZkTrieError::Db)?; Ok(node_hash) } INode::Archived(viewer) => Ok(viewer.node_hash),