diff --git a/Cargo.lock b/Cargo.lock index 2bb314a..887a3e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -76,9 +76,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.33" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805f7a974de5804f5c053edc6ca43b20883bdd3a733b3691200ae3a4b454a2db" +checksum = "94c225801d42099570d0674701dddd4142f0ef715282aeb5985042e2ec962df7" dependencies = [ "num_enum", "strum", @@ -301,7 +301,7 @@ checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -385,21 +385,21 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "alloy-sol-macro" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0458ccb02a564228fcd76efb8eb5a520521a8347becde37b402afec9a1b83859" +checksum = "0409e3ba5d1de409997a7db8b8e9d679d52088c1dee042a85033affd3cadeab4" dependencies = [ - "alloy-sol-macro-expander 0.8.3", - "alloy-sol-macro-input 0.8.3", + "alloy-sol-macro-expander 0.8.6", + "alloy-sol-macro-input 0.8.6", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -410,30 +410,30 @@ dependencies = [ "alloy-sol-macro-input 0.8.0", "const-hex", "heck", - "indexmap 2.5.0", + "indexmap 2.6.0", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "syn-solidity 0.8.0", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc65475025fc1e84bf86fc840f04f63fcccdcf3cf12053c99918e4054dfbc69" +checksum = "a18372ef450d59f74c7a64a738f546ba82c92f816597fed1802ef559304c81f1" dependencies = [ - "alloy-sol-macro-input 0.8.3", + "alloy-sol-macro-input 0.8.6", "const-hex", "heck", - "indexmap 2.5.0", + "indexmap 2.6.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.77", - "syn-solidity 0.8.3", + "syn 2.0.79", + "syn-solidity 0.8.6", "tiny-keccak", ] @@ -447,23 +447,23 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "syn-solidity 0.8.0", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed10f0715a0b69fde3236ff3b9ae5f6f7c97db5a387747100070d3016b9266b" +checksum = "f7bad89dd0d5f109e8feeaf787a9ed7a05a91a9a0efc6687d147a70ebca8eff7" dependencies = [ "const-hex", "dunce", "heck", "proc-macro2", "quote", - "syn 2.0.77", - "syn-solidity 0.8.3", + "syn 2.0.79", + "syn-solidity 0.8.6", ] [[package]] @@ -482,7 +482,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "577e262966e92112edbd15b1b2c0947cc434d6e8311df96d3329793fe8047da9" dependencies = [ "alloy-primitives", - "alloy-sol-macro 0.8.3", + "alloy-sol-macro 0.8.6", "const-hex", ] @@ -744,9 +744,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -755,24 +755,24 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -799,14 +799,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 = "backtrace" @@ -908,7 +908,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", "getrandom", @@ -989,9 +989,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.21" +version = "1.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" dependencies = [ "shlex", ] @@ -1017,9 +1017,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.18" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" dependencies = [ "clap_builder", "clap_derive", @@ -1027,9 +1027,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.18" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" dependencies = [ "anstream", "anstyle", @@ -1046,7 +1046,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1072,9 +1072,9 @@ dependencies = [ [[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", @@ -1191,7 +1191,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1215,7 +1215,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1226,7 +1226,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1293,7 +1293,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1391,7 +1391,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1488,6 +1488,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1520,9 +1526,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1535,9 +1541,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1545,15 +1551,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1562,38 +1568,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1637,9 +1643,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -1670,7 +1676,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -1697,6 +1703,17 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + [[package]] name = "heck" version = "0.5.0" @@ -1775,9 +1792,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1841,9 +1858,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", @@ -1854,7 +1871,6 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] @@ -1931,12 +1947,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", "serde", ] @@ -1947,7 +1963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ "ahash 0.8.11", - "indexmap 2.5.0", + "indexmap 2.6.0", "is-terminal", "itoa", "log", @@ -1960,9 +1976,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -2048,9 +2064,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" @@ -2082,11 +2098,11 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.0", ] [[package]] @@ -2225,7 +2241,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2306,23 +2322,23 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[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 = "openssl" @@ -2347,7 +2363,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2454,22 +2470,22 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2608,14 +2624,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[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", ] @@ -2640,7 +2656,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2657,7 +2673,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -2754,23 +2770,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[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]] @@ -2784,13 +2800,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]] @@ -2801,9 +2817,9 @@ 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" @@ -2816,9 +2832,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64", "bytes", @@ -3074,9 +3090,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "rustls-pki-types", @@ -3087,19 +3103,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" [[package]] name = "rustls-webpki" @@ -3199,9 +3214,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -3315,7 +3330,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3324,7 +3339,7 @@ version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "itoa", "memchr", "ryu", @@ -3345,15 +3360,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -3363,14 +3378,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3538,7 +3553,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3562,9 +3577,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "symbolic-common" -version = "12.11.1" +version = "12.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fdf97c441f18a4f92425b896a4ec7a27e03631a0b1047ec4e34e9916a9a167e" +checksum = "366f1b4c6baf6cfefc234bbd4899535fca0b06c74443039a73f6dfb2fad88d77" dependencies = [ "debugid", "memmap2", @@ -3574,9 +3589,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.11.1" +version = "12.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc8ece6b129e97e53d1fbb3f61d33a6a9e5369b11d01228c068094d6d134eaea" +checksum = "aba05ba5b9962ea5617baf556293720a8b2d0a282aa14ee4bf10e22efc7da8c8" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -3596,9 +3611,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", @@ -3613,19 +3628,19 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "syn-solidity" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b95156f8b577cb59dc0b1df15c6f29a10afc5f8a7ac9786b0b5c68c19149278" +checksum = "f3a850d65181df41b83c6be01a7d91f5e9377c43d48faa5af7d95816f437f5a3" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3666,9 +3681,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", @@ -3694,7 +3709,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3796,7 +3811,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3853,11 +3868,11 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.21" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "toml_datetime", "winnow", ] @@ -3872,7 +3887,6 @@ dependencies = [ "futures-util", "pin-project", "pin-project-lite", - "tokio", "tower-layer", "tower-service", "tracing", @@ -3910,7 +3924,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3966,9 +3980,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" @@ -3990,9 +4004,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" @@ -4102,7 +4116,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -4136,7 +4150,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4302,9 +4316,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", ] @@ -4336,7 +4350,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4356,13 +4370,13 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "zktrie-ng" version = "0.1.0" -source = "git+https://github.com/scroll-tech/zktrie-ng?branch=master#4d884b22c52d69ed4959d9b8353870e2eae4e405" +source = "git+https://github.com/scroll-tech/zktrie-ng?branch=master#0804d10ae6f721bed397fc3524602bba15d2589e" dependencies = [ "alloy-primitives", "hashbrown 0.14.5", @@ -4372,6 +4386,7 @@ dependencies = [ "once_cell", "poseidon-bn254", "revm-primitives", + "rkyv", "strum", "thiserror", "tracing", diff --git a/crates/bin/src/commands/run_file.rs b/crates/bin/src/commands/run_file.rs index c8badcf..7ea23a1 100644 --- a/crates/bin/src/commands/run_file.rs +++ b/crates/bin/src/commands/run_file.rs @@ -3,9 +3,8 @@ use anyhow::bail; use clap::Args; use sbv::{ core::{ChunkInfo, EvmExecutorBuilder, HardforkConfig}, - primitives::{types::BlockTrace, zk_trie::db::HashMapDb, Block, B256}, + primitives::{types::BlockTrace, zk_trie::db::kv::HashMapDb, Block, B256}, }; -use std::rc::Rc; use std::{cell::RefCell, path::PathBuf}; use tiny_keccak::{Hasher, Keccak}; use tokio::task::JoinSet; @@ -75,12 +74,11 @@ impl RunFileCommand { } let fork_config = fork_config(traces[0].chain_id()); - let (chunk_info, zktrie_db) = ChunkInfo::from_block_traces(&traces); - let zktrie_db = Rc::new(RefCell::new(zktrie_db)); + let (chunk_info, mut zktrie_db) = ChunkInfo::from_block_traces(&traces); let tx_bytes_hasher = RefCell::new(Keccak::v256()); - let mut executor = EvmExecutorBuilder::new(HashMapDb::default(), zktrie_db.clone()) + let mut executor = EvmExecutorBuilder::new(HashMapDb::default(), &mut zktrie_db) .hardfork_config(fork_config) .with_hooks(&traces[0], |hooks| { hooks.add_tx_rlp_handler(|_, rlp| { @@ -94,7 +92,7 @@ impl RunFileCommand { executor.handle_block(trace)?; } - let post_state_root = executor.commit_changes(zktrie_db.clone())?; + let post_state_root = executor.commit_changes()?; if post_state_root != chunk_info.post_state_root() { bail!("post state root mismatch"); } diff --git a/crates/bin/src/utils.rs b/crates/bin/src/utils.rs index 36ab091..7782a80 100644 --- a/crates/bin/src/utils.rs +++ b/crates/bin/src/utils.rs @@ -1,9 +1,8 @@ +use sbv::primitives::zk_trie::db::NodeDb; use sbv::{ core::{EvmExecutorBuilder, HardforkConfig, VerificationError}, - primitives::{zk_trie::db::HashMapDb, Block}, + primitives::{zk_trie::db::kv::HashMapDb, Block}, }; -use std::cell::RefCell; -use std::rc::Rc; pub fn verify( l2_trace: T, @@ -37,19 +36,19 @@ fn verify_inner( .build() .unwrap(); - let zktrie_db = cycle_track!( + let mut zktrie_db = cycle_track!( { - let mut zktrie_db = HashMapDb::default(); + let mut zktrie_db = NodeDb::new(HashMapDb::default()); measure_duration_millis!( build_zktrie_db_duration_milliseconds, l2_trace.build_zktrie_db(&mut zktrie_db).unwrap() ); - Rc::new(RefCell::new(zktrie_db)) + zktrie_db }, "build ZktrieState" ); - let mut executor = EvmExecutorBuilder::new(HashMapDb::default(), zktrie_db.clone()) + let mut executor = EvmExecutorBuilder::new(HashMapDb::default(), &mut zktrie_db) .hardfork_config(*fork_config) .build(&l2_trace)?; @@ -66,7 +65,7 @@ fn verify_inner( update_metrics_counter!(verification_error); e })?; - let revm_root_after = executor.commit_changes(zktrie_db.clone())?; + let revm_root_after = executor.commit_changes()?; #[cfg(feature = "profiling")] if let Ok(report) = guard.report().build() { diff --git a/crates/core/src/chunk.rs b/crates/core/src/chunk.rs index e04aeea..ef875bc 100644 --- a/crates/core/src/chunk.rs +++ b/crates/core/src/chunk.rs @@ -1,5 +1,6 @@ use revm::primitives::B256; -use sbv_primitives::{zk_trie::db::HashMapDb, Block}; +use sbv_primitives::zk_trie::db::NodeDb; +use sbv_primitives::{zk_trie::db::kv::HashMapDb, Block}; use tiny_keccak::{Hasher, Keccak}; /// A chunk is a set of continuous blocks. @@ -21,7 +22,7 @@ pub struct ChunkInfo { impl ChunkInfo { /// Construct by block traces - pub fn from_block_traces(traces: &[T]) -> (Self, HashMapDb) { + pub fn from_block_traces(traces: &[T]) -> (Self, NodeDb) { let chain_id = traces.first().unwrap().chain_id(); let prev_state_root = traces .first() @@ -40,7 +41,7 @@ impl ChunkInfo { let mut data_hash = B256::ZERO; data_hasher.finalize(&mut data_hash.0); - let mut zktrie_db = HashMapDb::default(); + let mut zktrie_db = NodeDb::new(HashMapDb::default()); for trace in traces.iter() { measure_duration_millis!( build_zktrie_db_duration_milliseconds, @@ -116,7 +117,6 @@ mod tests { use revm::primitives::b256; use sbv_primitives::types::BlockTrace; use std::cell::RefCell; - use std::rc::Rc; const TRACES_STR: [&str; 4] = [ include_str!("../../../testdata/mainnet_blocks/8370400.json"), @@ -138,12 +138,11 @@ mod tests { }); let fork_config = HardforkConfig::default_from_chain_id(traces[0].chain_id()); - let (chunk_info, zktrie_db) = ChunkInfo::from_block_traces(&traces); - let zktrie_db = Rc::new(RefCell::new(zktrie_db)); + let (chunk_info, mut zktrie_db) = ChunkInfo::from_block_traces(&traces); let tx_bytes_hasher = RefCell::new(Keccak::v256()); - let mut executor = EvmExecutorBuilder::new(HashMapDb::default(), zktrie_db.clone()) + let mut executor = EvmExecutorBuilder::new(HashMapDb::default(), &mut zktrie_db) .hardfork_config(fork_config) .with_hooks(&traces[0], |hooks| { hooks.add_tx_rlp_handler(|_, rlp| { @@ -158,7 +157,7 @@ mod tests { executor.handle_block(trace).unwrap(); } - let post_state_root = executor.commit_changes(zktrie_db.clone()).unwrap(); + let post_state_root = executor.commit_changes().unwrap(); assert_eq!(post_state_root, chunk_info.post_state_root); drop(executor); // drop executor to release Rc diff --git a/crates/core/src/database.rs b/crates/core/src/database.rs index 63c3811..7256fa7 100644 --- a/crates/core/src/database.rs +++ b/crates/core/src/database.rs @@ -1,12 +1,13 @@ use crate::error::DatabaseError; -use once_cell::sync::Lazy; use revm::{ db::DatabaseRef, primitives::{AccountInfo, Address, Bytecode, B256, U256}, }; +use sbv_primitives::zk_trie::db::NodeDb; +use sbv_primitives::zk_trie::hash::ZkHash; use sbv_primitives::{ zk_trie::{ - db::{KVDatabase, KVDatabaseItem}, + db::kv::{KVDatabase, KVDatabaseItem}, hash::{key_hasher::NoCacheHasher, poseidon::Poseidon}, scroll_types::Account, trie::ZkTrie, @@ -17,28 +18,24 @@ use std::{cell::RefCell, collections::HashMap, fmt}; type Result = std::result::Result; -type StorageTrieLazyFn = Box ZkTrie>; -type LazyStorageTrie = Lazy, StorageTrieLazyFn>; - /// A database that consists of account and storage information. -pub struct EvmDatabase { +pub struct EvmDatabase<'a, CodeDb, ZkDb> { /// Map of code hash to bytecode. code_db: CodeDb, - /// The initial storage roots of accounts, used for after commit. - /// Need to be updated after zkTrie commit. - prev_storage_roots: RefCell>, + /// Storage root cache, avoid re-query account when storage root is needed + storage_root_caches: RefCell>, /// Storage trie cache, avoid re-creating trie for the same account. - /// Need to invalidate before `update`, otherwise the trie root may be outdated. - storage_trie_refs: RefCell>>, + /// Need to invalidate before `update`, otherwise the trie root may be outdated + storage_trie_caches: RefCell>>, /// Current uncommitted zkTrie root based on the block trace. committed_zktrie_root: B256, /// The underlying zkTrie database. - zktrie_db: ZkDb, + pub(crate) zktrie_db: &'a mut NodeDb, /// Current view of zkTrie database. - zktrie: ZkTrie, + zktrie: ZkTrie, } -impl fmt::Debug for EvmDatabase { +impl fmt::Debug for EvmDatabase<'_, CodeDb, Db> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("EvmDatabase") .field("committed_zktrie_root", &self.committed_zktrie_root) @@ -46,9 +43,13 @@ impl fmt::Debug for EvmDatabase { } } -impl EvmDatabase { +impl<'a, CodeDb: KVDatabase, ZkDb: KVDatabase + 'static> EvmDatabase<'a, CodeDb, ZkDb> { /// Initialize an EVM database from a block trace. - pub fn new(l2_trace: T, mut code_db: CodeDb, zktrie_db: ZkDb) -> Result { + pub fn new( + l2_trace: T, + mut code_db: CodeDb, + zktrie_db: &'a mut NodeDb, + ) -> Result { cycle_tracker_start!("insert CodeDB"); for code in l2_trace.codes() { let hash = revm::primitives::keccak256(code); @@ -60,43 +61,45 @@ impl EvmDatabase Option { - self.prev_storage_roots - .borrow_mut() - .insert(address, storage_root) - } - /// Get the previous storage root of an account. #[inline] pub(crate) fn prev_storage_root(&self, address: &Address) -> B256 { - self.prev_storage_roots + self.storage_root_caches .borrow() .get(address) .copied() .unwrap_or_default() } + #[inline] + pub(crate) fn update_storage_root_cache(&self, address: Address, storage_root: ZkTrie) { + let new_root = *storage_root.root().unwrap_ref(); + let old = self + .storage_root_caches + .borrow_mut() + .insert(address, new_root); + + let mut storage_trie_caches = self.storage_trie_caches.borrow_mut(); + if let Some(old) = old { + storage_trie_caches.remove(&old); + } + + storage_trie_caches.insert(new_root, storage_root); + } + /// Get the committed zkTrie root. #[inline] pub(crate) fn committed_zktrie_root(&self) -> B256 { @@ -125,11 +128,7 @@ impl EvmDatabase EvmDatabase DatabaseRef - for EvmDatabase -{ +impl DatabaseRef for EvmDatabase<'_, CodeDb, ZkDb> { type Error = DatabaseError; /// Get basic account information. fn basic_ref(&self, address: Address) -> Result> { let Some(account) = measure_duration_micros!( zktrie_get_duration_microseconds, - self.zktrie.get::(address) + self.zktrie.get::<_, Account, _>(self.zktrie_db, address) ) .map_err(DatabaseError::zk_trie)? else { return Ok(None); }; - self.prev_storage_roots + self.storage_root_caches .borrow_mut() - .entry(address) - .or_insert(account.storage_root); - let zktrie_db = self.zktrie_db.clone(); - self.storage_trie_refs - .borrow_mut() - .entry(address) - .or_insert_with(|| { - Lazy::new(Box::new(move || { - ZkTrie::new_with_root(zktrie_db.clone(), NoCacheHasher, account.storage_root) - .expect("storage trie associated with account not found") - })) - }); + .insert(address, account.storage_root); let mut info = AccountInfo::from(account); info.code = self @@ -201,24 +187,27 @@ impl DatabaseRef /// Get storage value of address at index. fn storage_ref(&self, address: Address, index: U256) -> Result { dev_trace!("get storage of {:?} at index {:?}", address, index); - let mut storage_trie_refs = self.storage_trie_refs.borrow_mut(); - let trie = storage_trie_refs + let storage_root = *self + .storage_root_caches + .borrow_mut() .entry(address) .or_insert_with_key(|address| { - let storage_root = measure_duration_micros!( - zktrie_get_duration_microseconds, - self.zktrie.get::(address) - ) - .expect("unexpected zktrie error") - .map(|acc| acc.storage_root) - .unwrap_or_default(); + self.zktrie + .get::<_, Account, _>(self.zktrie_db, address) + .expect("unexpected zktrie error") + .map(|acc| acc.storage_root) + .unwrap_or_default() + }); + + let mut storage_trie_caches = self.storage_trie_caches.borrow_mut(); + + let trie = storage_trie_caches + .entry(storage_root) + .or_insert_with_key(|storage_root| { dev_debug!("storage root of {:?} is {:?}", address, storage_root); - let zktrie_db = self.zktrie_db.clone(); - Lazy::new(Box::new(move || { - ZkTrie::new_with_root(zktrie_db.clone(), NoCacheHasher, storage_root) - .expect("storage trie associated with account not found") - })) + ZkTrie::new_with_root(self.zktrie_db, NoCacheHasher, *storage_root) + .expect("storage trie associated with account not found") }); #[cfg(debug_assertions)] @@ -226,7 +215,7 @@ impl DatabaseRef let current_root = trie.root().unwrap_ref(); let expected_root = self .zktrie - .get::(address) + .get::<_, Account, _>(self.zktrie_db, address) .expect("unexpected zktrie error") .map(|acc| acc.storage_root) .unwrap_or_default(); @@ -235,7 +224,7 @@ impl DatabaseRef Ok(measure_duration_micros!( zktrie_get_duration_microseconds, - trie.get::(index.to_be_bytes::<32>()) + trie.get::<_, U256, _>(self.zktrie_db, index.to_be_bytes::<32>()) ) .map_err(DatabaseError::zk_trie)? .unwrap_or_default()) diff --git a/crates/core/src/executor/builder.rs b/crates/core/src/executor/builder.rs index b17fdd0..de796f7 100644 --- a/crates/core/src/executor/builder.rs +++ b/crates/core/src/executor/builder.rs @@ -1,18 +1,19 @@ use crate::error::DatabaseError; use crate::{executor::hooks::ExecuteHooks, EvmDatabase, EvmExecutor, HardforkConfig}; use revm::db::CacheDB; -use sbv_primitives::zk_trie::db::KVDatabase; +use sbv_primitives::zk_trie::db::kv::KVDatabase; +use sbv_primitives::zk_trie::db::NodeDb; use sbv_primitives::Block; use std::fmt::{self, Debug}; /// Builder for EVM executor. -pub struct EvmExecutorBuilder { +pub struct EvmExecutorBuilder<'a, H, CodeDb, ZkDb> { hardfork_config: H, code_db: CodeDb, - zktrie_db: ZkDb, + zktrie_db: &'a mut NodeDb, } -impl Debug for EvmExecutorBuilder { +impl Debug for EvmExecutorBuilder<'_, H, CodeDb, ZkDb> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("EvmExecutorBuilder") .field("hardfork_config", &self.hardfork_config) @@ -22,9 +23,9 @@ impl Debug for EvmExecutorBuilder { } } -impl EvmExecutorBuilder<(), CodeDb, ZkDb> { +impl<'a, CodeDb, ZkDb> EvmExecutorBuilder<'a, (), CodeDb, ZkDb> { /// Create a new builder. - pub fn new(code_db: CodeDb, zktrie_db: ZkDb) -> Self { + pub fn new(code_db: CodeDb, zktrie_db: &'a mut NodeDb) -> Self { Self { hardfork_config: (), code_db, @@ -33,9 +34,12 @@ impl EvmExecutorBuilder<(), CodeDb, ZkDb> { } } -impl EvmExecutorBuilder { +impl<'a, H, CodeDb, ZkDb> EvmExecutorBuilder<'a, H, CodeDb, ZkDb> { /// Set hardfork config. - pub fn hardfork_config

(self, hardfork_config: H1) -> EvmExecutorBuilder { + pub fn hardfork_config

( + self, + hardfork_config: H1, + ) -> EvmExecutorBuilder<'a, H1, CodeDb, ZkDb> { EvmExecutorBuilder { hardfork_config, code_db: self.code_db, @@ -44,7 +48,7 @@ impl EvmExecutorBuilder { } /// Set code db. - pub fn code_db(self, code_db: CodeDb1) -> EvmExecutorBuilder { + pub fn code_db(self, code_db: CodeDb1) -> EvmExecutorBuilder<'a, H, CodeDb1, ZkDb> { EvmExecutorBuilder { hardfork_config: self.hardfork_config, code_db, @@ -53,7 +57,10 @@ impl EvmExecutorBuilder { } /// Set zktrie db. - pub fn zktrie_db(self, zktrie_db: ZkDb1) -> EvmExecutorBuilder { + pub fn zktrie_db( + self, + zktrie_db: &mut NodeDb, + ) -> EvmExecutorBuilder { EvmExecutorBuilder { hardfork_config: self.hardfork_config, code_db: self.code_db, @@ -62,15 +69,15 @@ impl EvmExecutorBuilder { } } -impl - EvmExecutorBuilder +impl<'a, CodeDb: KVDatabase, ZkDb: KVDatabase + 'static> + EvmExecutorBuilder<'a, HardforkConfig, CodeDb, ZkDb> { /// Initialize an EVM executor from a block trace as the initial state. - pub fn with_hooks<'e, T: Block, F: FnOnce(&mut ExecuteHooks<'e, CodeDb, ZkDb>)>( + pub fn with_hooks<'h, T: Block, F: FnOnce(&mut ExecuteHooks<'h, CodeDb, ZkDb>)>( self, l2_trace: &T, with_execute_hooks: F, - ) -> Result, DatabaseError> { + ) -> Result, DatabaseError> { let mut execute_hooks = ExecuteHooks::new(); with_execute_hooks(&mut execute_hooks); @@ -96,7 +103,7 @@ impl pub fn build<'e, T: Block>( self, l2_trace: &T, - ) -> Result, DatabaseError> { + ) -> Result, DatabaseError> { self.with_hooks(l2_trace, |_| {}) } } diff --git a/crates/core/src/executor/mod.rs b/crates/core/src/executor/mod.rs index 49f52aa..562fb37 100644 --- a/crates/core/src/executor/mod.rs +++ b/crates/core/src/executor/mod.rs @@ -9,11 +9,12 @@ use revm::{ }; use sbv_primitives::{ zk_trie::{ - db::KVDatabase, + db::kv::KVDatabase, hash::{ key_hasher::NoCacheHasher, poseidon::{Poseidon, PoseidonError}, }, + scroll_types::Account, trie::{ZkTrie, ZkTrieError}, }, Block, Transaction, TxTrace, @@ -22,20 +23,19 @@ use std::fmt::Debug; mod builder; pub use builder::EvmExecutorBuilder; -use sbv_primitives::zk_trie::scroll_types::Account; /// Execute hooks pub mod hooks; /// EVM executor that handles the block. -pub struct EvmExecutor<'a, CodeDb, ZkDb> { +pub struct EvmExecutor<'db, 'h, CodeDb, ZkDb> { hardfork_config: HardforkConfig, - db: CacheDB>, + db: CacheDB>, spec_id: SpecId, - hooks: hooks::ExecuteHooks<'a, CodeDb, ZkDb>, + hooks: hooks::ExecuteHooks<'h, CodeDb, ZkDb>, } -impl EvmExecutor<'_, CodeDb, ZkDb> { +impl EvmExecutor<'_, '_, CodeDb, ZkDb> { /// Get reference to the DB pub fn db(&self) -> &CacheDB> { &self.db @@ -170,23 +170,19 @@ impl EvmExecutor<'_, Cod } /// Commit pending changes in cache db to zktrie - pub fn commit_changes(&mut self, zktrie_db: ZkDb) -> Result { + pub fn commit_changes(&mut self) -> Result { measure_duration_millis!( commit_changes_duration_milliseconds, cycle_track!( - self.commit_changes_inner(zktrie_db) - .map_err(DatabaseError::zk_trie), + self.commit_changes_inner().map_err(DatabaseError::zk_trie), "commit_changes" ) ) } - fn commit_changes_inner( - &mut self, - zktrie_db: ZkDb, - ) -> Result> { - let mut zktrie = ZkTrie::::new_with_root( - zktrie_db.clone(), + fn commit_changes_inner(&mut self) -> Result> { + let mut zktrie = ZkTrie::::new_with_root( + self.db.db.zktrie_db, NoCacheHasher, self.db.db.committed_zktrie_root(), ) @@ -218,8 +214,8 @@ impl EvmExecutor<'_, Cod // get storage tire cycle_tracker_start!("update storage_tire"); let mut storage_trie = cycle_track!( - ZkTrie::::new_with_root( - zktrie_db.clone(), + ZkTrie::::new_with_root( + self.db.db.zktrie_db, NoCacheHasher, storage_root_before, ), @@ -231,7 +227,11 @@ impl EvmExecutor<'_, Cod measure_duration_micros!( zktrie_update_duration_microseconds, cycle_track!( - storage_trie.update(key.to_be_bytes::<32>(), value)?, + storage_trie.update( + self.db.db.zktrie_db, + key.to_be_bytes::<32>(), + value + )?, "Zktrie::update_store" ) ); @@ -239,7 +239,8 @@ impl EvmExecutor<'_, Cod measure_duration_micros!( zktrie_delete_duration_microseconds, cycle_track!( - storage_trie.delete(key.to_be_bytes::<32>())?, + storage_trie + .delete(self.db.db.zktrie_db, key.to_be_bytes::<32>())?, "Zktrie::delete" ) ); @@ -251,16 +252,16 @@ impl EvmExecutor<'_, Cod measure_duration_micros!( zktrie_commit_duration_microseconds, - cycle_track!(storage_trie.commit()?, "Zktrie::commit") + cycle_track!(storage_trie.commit(self.db.db.zktrie_db)?, "Zktrie::commit") ); cycle_tracker_end!("update storage_tire"); storage_root = *storage_trie.root().unwrap_ref(); + self.db.db.update_storage_root_cache(*addr, storage_trie); + #[cfg(feature = "debug-storage")] debug_recorder.record_storage_root(*addr, storage_root); - - self.db.db.set_prev_storage_root(*addr, storage_root); } if !info.is_empty() { // if account not exist, all fields will be zero. @@ -288,7 +289,7 @@ impl EvmExecutor<'_, Cod zktrie_update_duration_microseconds, cycle_track!( zktrie - .update(addr, acc_data) + .update(self.db.db.zktrie_db, addr, acc_data) .expect("failed to update account"), "Zktrie::update_account" ) @@ -299,7 +300,7 @@ impl EvmExecutor<'_, Cod measure_duration_micros!( zktrie_commit_duration_microseconds, - cycle_track!(zktrie.commit()?, "Zktrie::commit") + cycle_track!(zktrie.commit(self.db.db.zktrie_db)?, "Zktrie::commit") ); let root_after = *zktrie.root().unwrap_ref(); @@ -310,7 +311,7 @@ impl EvmExecutor<'_, Cod } } -impl Debug for EvmExecutor<'_, CodeDb, ZkDb> { +impl Debug for EvmExecutor<'_, '_, CodeDb, ZkDb> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("EvmExecutor") .field("db", &self.db) diff --git a/crates/primitives/src/lib.rs b/crates/primitives/src/lib.rs index 333298a..b81b592 100644 --- a/crates/primitives/src/lib.rs +++ b/crates/primitives/src/lib.rs @@ -10,7 +10,7 @@ use alloy::{ }; use std::fmt::Debug; use zktrie_ng::{ - db::KVDatabase, + db::kv::KVDatabase, hash::poseidon::Poseidon, trie::{Node, MAGIC_NODE_BYTES}, }; @@ -25,6 +25,7 @@ pub use alloy::consensus::Transaction; pub use alloy::primitives as alloy_primitives; pub use alloy::primitives::{Address, B256, U256}; pub use zktrie_ng as zk_trie; +use zktrie_ng::db::NodeDb; /// Blanket trait for block trace extensions. pub trait Block: Debug { @@ -80,24 +81,20 @@ pub trait Block: Debug { /// Update zktrie state from trace #[inline] - fn build_zktrie_db(&self, db: &mut Db) -> Result<(), Db::Error> { + 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"); - let node_hash = cycle_track!( + cycle_track!( node.get_or_calculate_node_hash(), "Node::get_or_calculate_node_hash" ) .expect("infallible"); dev_trace!("put zktrie node: {:?}", node); - let node_bytes = cycle_track!(node.canonical_value(false), "Node::canonical_value"); - cycle_track!( - db.put_owned(node_hash.as_slice(), node_bytes)?, - "KVDatabase::put_owned" - ); + cycle_track!(db.put_node(&node)?, "NodeDb::put_node"); } Ok(()) }