From fd08ce5478248b9b4fd4cf4b06e8d9811368f0cb Mon Sep 17 00:00:00 2001 From: 0xKitsune <0xKitsune@protonmail.com> Date: Tue, 7 Nov 2023 16:56:18 -0500 Subject: [PATCH 1/7] refactored, changed crate name to "world-tree" --- Cargo.lock | 360 +++++------------- Cargo.toml | 43 ++- README.md | 2 +- bin/state_bridge_service.rs | 34 +- crates/common/Cargo.toml | 2 +- crates/common/src/tracing.rs | 8 +- crates/sequencer/Cargo.toml | 7 - crates/sequencer/src/main.rs | 3 - crates/state_bridge/Cargo.toml | 24 -- crates/state_bridge/README.md | 0 crates/state_bridge/src/abi.rs | 23 -- crates/state_bridge/src/root.rs | 141 ------- crates/tree_availability/Cargo.toml | 35 -- crates/tree_availability/README.md | 0 crates/tree_availability/src/error.rs | 44 --- .../src/server/middleware/mod.rs | 1 - crates/tree_availability/src/server/mod.rs | 148 ------- .../src/world_tree => src}/abi.rs | 15 +- src/lib.rs | 3 + .../src => src/state_bridge}/error.rs | 4 +- .../src/bridge.rs => src/state_bridge/mod.rs | 7 +- .../src/lib.rs => src/state_bridge/service.rs | 51 ++- .../world_tree => src/tree}/block_scanner.rs | 10 +- .../src/world_tree => src/tree}/error.rs | 2 + .../src/world_tree => src/tree}/mod.rs | 5 +- .../tree/service/logging_middleware.rs | 0 .../src/lib.rs => src/tree/service/mod.rs | 121 +++++- .../src/world_tree => src/tree}/tree_data.rs | 50 ++- .../world_tree => src/tree}/tree_updater.rs | 13 +- .../tests => tests}/bridge_service.rs | 27 +- .../tests => tests}/inclusion_proof.rs | 10 +- 31 files changed, 379 insertions(+), 814 deletions(-) delete mode 100644 crates/sequencer/Cargo.toml delete mode 100644 crates/sequencer/src/main.rs delete mode 100644 crates/state_bridge/Cargo.toml delete mode 100644 crates/state_bridge/README.md delete mode 100644 crates/state_bridge/src/abi.rs delete mode 100644 crates/state_bridge/src/root.rs delete mode 100644 crates/tree_availability/Cargo.toml delete mode 100644 crates/tree_availability/README.md delete mode 100644 crates/tree_availability/src/error.rs delete mode 100644 crates/tree_availability/src/server/middleware/mod.rs delete mode 100644 crates/tree_availability/src/server/mod.rs rename {crates/tree_availability/src/world_tree => src}/abi.rs (62%) create mode 100644 src/lib.rs rename {crates/state_bridge/src => src/state_bridge}/error.rs (91%) rename crates/state_bridge/src/bridge.rs => src/state_bridge/mod.rs (98%) rename crates/state_bridge/src/lib.rs => src/state_bridge/service.rs (57%) rename {crates/tree_availability/src/world_tree => src/tree}/block_scanner.rs (90%) rename {crates/tree_availability/src/world_tree => src/tree}/error.rs (98%) rename {crates/tree_availability/src/world_tree => src/tree}/mod.rs (97%) rename crates/tree_availability/src/server/middleware/logging.rs => src/tree/service/logging_middleware.rs (100%) rename crates/tree_availability/src/lib.rs => src/tree/service/mod.rs (54%) rename {crates/tree_availability/src/world_tree => src/tree}/tree_data.rs (90%) rename {crates/tree_availability/src/world_tree => src/tree}/tree_updater.rs (96%) rename {crates/state_bridge/tests => tests}/bridge_service.rs (84%) rename {crates/tree_availability/tests => tests}/inclusion_proof.rs (92%) diff --git a/Cargo.lock b/Cargo.lock index 8c1416cd..b215c04e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -96,54 +96,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anstream" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" - -[[package]] -name = "anstyle-parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" -dependencies = [ - "anstyle", - "windows-sys 0.48.0", -] - [[package]] name = "anyhow" version = "1.0.75" @@ -434,7 +386,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -817,46 +769,6 @@ dependencies = [ "unicode-width", ] -[[package]] -name = "clap" -version = "4.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "clap_lex" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" - [[package]] name = "coins-bip32" version = "0.8.7" @@ -963,12 +875,6 @@ dependencies = [ "tracing-error 0.2.0", ] -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - [[package]] name = "combine" version = "4.6.6" @@ -1142,7 +1048,7 @@ checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" dependencies = [ "atty", "cast", - "clap 2.34.0", + "clap", "criterion-plot", "csv", "itertools 0.10.5", @@ -1301,7 +1207,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1312,7 +1218,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1521,7 +1427,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1562,7 +1468,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1573,9 +1479,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" dependencies = [ "libc", "windows-sys 0.48.0", @@ -1717,8 +1623,8 @@ dependencies = [ "reqwest", "serde", "serde_json", - "syn 2.0.38", - "toml 0.7.8", + "syn 2.0.39", + "toml", "walkdir", ] @@ -1735,7 +1641,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -1761,7 +1667,7 @@ dependencies = [ "serde", "serde_json", "strum", - "syn 2.0.38", + "syn 2.0.39", "tempfile", "thiserror", "tiny-keccak", @@ -1771,7 +1677,7 @@ dependencies = [ [[package]] name = "ethers-core" version = "2.0.10" -source = "git+https://github.com/gakonst/ethers-rs#841ff8c47980798fbb47991e047f8481b1d5eb39" +source = "git+https://github.com/gakonst/ethers-rs#1840aee6fdb23ae4b2c43e51f151bea8a2a38472" dependencies = [ "arrayvec", "bytes", @@ -2109,7 +2015,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -2452,23 +2358,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "identity-sequencer" -version = "0.1.0" -dependencies = [ - "clap 4.4.7", - "common", - "ethers", - "eyre", - "futures", - "serde", - "state_bridge", - "tokio", - "toml 0.8.6", - "tracing", - "tree_availability", -] - [[package]] name = "idna" version = "0.4.0" @@ -2700,9 +2589,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" [[package]] name = "libloading" @@ -2720,6 +2609,17 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + [[package]] name = "linux-raw-sys" version = "0.4.10" @@ -2878,7 +2778,7 @@ checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3083,7 +2983,7 @@ dependencies = [ "proc-macro-crate 2.0.0", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3152,9 +3052,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.58" +version = "0.10.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dfc0783362704e97ef3bd24261995a699468440099ef95d869b4d9732f829a" +checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -3173,7 +3073,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3184,9 +3084,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.94" +version = "0.9.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f55da20b29f956fb01f0add8683eb26ee13ebe3ebd935e49898717c6b4b2830" +checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" dependencies = [ "cc", "libc", @@ -3361,7 +3261,7 @@ checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall", "smallvec", "windows-targets 0.48.5", ] @@ -3487,7 +3387,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3525,7 +3425,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3615,7 +3515,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -3794,15 +3694,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -3814,12 +3705,12 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ "getrandom", - "redox_syscall 0.2.16", + "libredox", "thiserror", ] @@ -4350,7 +4241,7 @@ dependencies = [ "proc-macro2", "quote", "semaphore-depth-config", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4392,15 +4283,11 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" -[[package]] -name = "sequencer" -version = "0.1.0" - [[package]] name = "serde" -version = "1.0.190" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" dependencies = [ "serde_derive", ] @@ -4426,13 +4313,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.192" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4518,15 +4405,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - [[package]] name = "signature" version = "2.1.0" @@ -4647,25 +4525,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" -[[package]] -name = "state_bridge" -version = "0.1.0" -dependencies = [ - "anyhow", - "common", - "ethers", - "eyre", - "hex", - "ruint", - "semaphore", - "serde", - "serde_json", - "take_mut", - "thiserror", - "tokio", - "tracing", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -4685,12 +4544,6 @@ dependencies = [ "precomputed-hash", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strum" version = "0.25.0" @@ -4710,7 +4563,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4752,9 +4605,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" dependencies = [ "proc-macro2", "quote", @@ -4828,7 +4681,7 @@ checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.4.1", + "redox_syscall", "rustix", "windows-sys 0.48.0", ] @@ -4870,7 +4723,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -4957,9 +4810,7 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", @@ -4973,7 +4824,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5050,18 +4901,6 @@ dependencies = [ "toml_edit 0.19.15", ] -[[package]] -name = "toml" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ff9e3abce27ee2c9a37f9ad37238c1bdd4e789c84ba37df76aa4d528f5072cc" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit 0.20.7", -] - [[package]] name = "toml_datetime" version = "0.6.5" @@ -5091,8 +4930,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ "indexmap 2.1.0", - "serde", - "serde_spanned", "toml_datetime", "winnow", ] @@ -5156,7 +4993,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -5268,30 +5105,6 @@ dependencies = [ "tracing-serde", ] -[[package]] -name = "tree_availability" -version = "0.1.0" -dependencies = [ - "axum", - "bytes", - "common", - "ethers", - "eyre", - "futures", - "futures-util", - "hyper", - "metrics", - "opentelemetry", - "reqwest", - "semaphore", - "serde", - "serde_json", - "take_mut", - "thiserror", - "tokio", - "tracing", -] - [[package]] name = "try-lock" version = "0.2.4" @@ -5417,12 +5230,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - [[package]] name = "uuid" version = "0.8.2" @@ -5503,7 +5310,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-shared", ] @@ -5537,7 +5344,7 @@ checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5550,9 +5357,9 @@ checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" [[package]] name = "wasm-encoder" -version = "0.36.1" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53ae0be20bf87918df4fa831bfbbd0b491d24aee407ed86360eae4c2c5608d38" +checksum = "822b645bf4f2446b949776ffca47e2af60b167209ffb70814ef8779d299cd421" dependencies = [ "leb128", ] @@ -5796,9 +5603,9 @@ checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" [[package]] name = "wast" -version = "67.0.0" +version = "67.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c2933efd77ff2398b83817a98984ffe4b67aefd9aa1d2c8e68e19b553f1c38" +checksum = "a974d82fac092b5227c1663e16514e7a85f32014e22e6fdcb08b71aec9d3fb1e" dependencies = [ "leb128", "memchr", @@ -5808,9 +5615,9 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.78" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02905d13751dcb18f4e19f489d37a1bf139f519feaeef28d072a41a78e69a74" +checksum = "adb220934f92f8551144c0003d1bc57a060674c99139f45ed623fbbf6d9262e7" dependencies = [ "wast", ] @@ -6066,9 +5873,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.18" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176b6138793677221d420fd2f0aeeced263f197688b36484660da767bca2fa32" +checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" dependencies = [ "memchr", ] @@ -6083,6 +5890,33 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "world-tree" +version = "0.1.0" +dependencies = [ + "anyhow", + "axum", + "bytes", + "common", + "ethers", + "eyre", + "futures", + "futures-util", + "hex", + "hyper", + "metrics", + "opentelemetry", + "reqwest", + "ruint", + "semaphore", + "serde", + "serde_json", + "take_mut", + "thiserror", + "tokio", + "tracing", +] + [[package]] name = "ws_stream_wasm" version = "0.7.4" @@ -6119,22 +5953,22 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zerocopy" -version = "0.7.23" +version = "0.7.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e50cbb27c30666a6108abd6bc7577556265b44f243e2be89a8bc4e07a528c107" +checksum = "8cd369a67c0edfef15010f980c3cbe45d7f651deac2cd67ce097cd801de16557" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.23" +version = "0.7.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25f293fe55f0a48e7010d65552bb63704f6ceb55a1a385da10d41d8f78e4a3d" +checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] @@ -6154,7 +5988,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.39", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 65f1bea4..82768e44 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,28 +1,37 @@ [package] -name = "identity-sequencer" +name = "world-tree" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[workspace] -members = [ - "crates/common", - "crates/sequencer", - "crates/state_bridge", - "crates/tree_availability"] +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { version = "4.4.6", features = ["derive"] } -common = { path = "./crates/common" } -ethers = "2.0.10" +anyhow = "1.0.75" +ethers = { version = "2.0.10", features = ["abigen", "ws", "ipc", "rustls", "openssl"] } eyre = "0.6.8" +hex = "0.4.3" +ruint = "1.10.1" +semaphore = { git = "https://github.com/worldcoin/semaphore-rs", branch = "main", features = [ + "depth_20", +] } +serde = { version = "1.0.189", features = ["derive"] } +serde_json = "1.0.107" +take_mut = "0.2.2" +thiserror = "1.0.49" +tokio = { version = "1.32.0", features = ["sync", "macros"] } +tracing = "0.1.37" +axum = "0.6.20" futures = "0.3.28" -serde = "1.0.188" -state_bridge = { path = "crates/state_bridge" } -tokio = { version = "1.33.0", features = ["full"] } -toml = "0.8.4" -tracing = "0.1.40" -tree_availability = { path = "crates/tree_availability" } +hyper = { version = "^0.14.27", features = ["server", "tcp", "http1", "http2"] } +metrics = "0.21.1" +opentelemetry = "0.20.0" +common = { path = "crates/common" } +bytes = "1.5.0" +futures-util = "0.3.29" + +[dev-dependencies] +reqwest = { version = "0.11.22", features = ["json"] } + [[bin]] name = "tree-availability-service" diff --git a/README.md b/README.md index 50518c91..9d8118ae 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# identity-sequencer \ No newline at end of file +# world-tree \ No newline at end of file diff --git a/bin/state_bridge_service.rs b/bin/state_bridge_service.rs index e0a50b43..fcd14aa1 100644 --- a/bin/state_bridge_service.rs +++ b/bin/state_bridge_service.rs @@ -7,16 +7,13 @@ use clap::Parser; use common::tracing::{init_datadog_subscriber, init_subscriber}; use ethers::abi::Address; use ethers::prelude::{ - Http, LocalWallet, NonceManagerMiddleware, Provider, Signer, - SignerMiddleware, H160, + Http, LocalWallet, NonceManagerMiddleware, Provider, Signer, SignerMiddleware, H160, }; use ethers::providers::Middleware; use futures::stream::FuturesUnordered; use futures::StreamExt; use serde::{Deserialize, Serialize}; -use state_bridge::abi::{ - IBridgedWorldID, IStateBridge, IWorldIDIdentityManager, -}; +use state_bridge::abi::{IBridgedWorldID, IStateBridge, IWorldIDIdentityManager}; use state_bridge::bridge::StateBridge; use state_bridge::StateBridgeService; use tracing::Level; @@ -118,8 +115,7 @@ async fn spawn_state_bridge_service( relaying_period: Duration, block_confirmations: usize, ) -> eyre::Result<()> { - let provider = Provider::::try_from(rpc_url) - .expect("failed to initialize Http provider"); + let provider = Provider::::try_from(rpc_url).expect("failed to initialize Http provider"); let chain_id = provider.get_chainid().await?.as_u64(); @@ -127,15 +123,12 @@ async fn spawn_state_bridge_service( let wallet_address = wallet.address(); let signer_middleware = SignerMiddleware::new(provider, wallet); - let nonce_manager_middleware = - NonceManagerMiddleware::new(signer_middleware, wallet_address); + let nonce_manager_middleware = NonceManagerMiddleware::new(signer_middleware, wallet_address); let middleware = Arc::new(nonce_manager_middleware); - let world_id_interface = - IWorldIDIdentityManager::new(world_id_address, middleware.clone()); + let world_id_interface = IWorldIDIdentityManager::new(world_id_address, middleware.clone()); - let mut state_bridge_service = - StateBridgeService::new(world_id_interface).await?; + let mut state_bridge_service = StateBridgeService::new(world_id_interface).await?; for bridge_config in bridge_configs { let BridgeConfig { @@ -156,19 +149,14 @@ async fn spawn_state_bridge_service( .with_chain_id(chain_id); let wallet_address = wallet.address(); - let bridged_middleware = - SignerMiddleware::new(bridged_provider, wallet); - let bridged_middleware = - NonceManagerMiddleware::new(bridged_middleware, wallet_address); + let bridged_middleware = SignerMiddleware::new(bridged_provider, wallet); + let bridged_middleware = NonceManagerMiddleware::new(bridged_middleware, wallet_address); let bridged_middleware = Arc::new(bridged_middleware); - let state_bridge_interface = - IStateBridge::new(state_bridge_address, middleware.clone()); + let state_bridge_interface = IStateBridge::new(state_bridge_address, middleware.clone()); - let bridged_world_id_interface = IBridgedWorldID::new( - bridged_world_id_address, - bridged_middleware.clone(), - ); + let bridged_world_id_interface = + IBridgedWorldID::new(bridged_world_id_address, bridged_middleware.clone()); let state_bridge = StateBridge::new( state_bridge_interface, diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 2e515c0e..4e81b8bc 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -15,7 +15,7 @@ eyre = "0.6.8" serde = "1.0.189" metrics = "0.21.1" opentelemetry = { version = "0.20.0", features = ["rt-tokio"] } -opentelemetry-datadog = {verison = "0.8.0", features = ["reqwest-client"]} +opentelemetry-datadog = {version = "0.8.0", features = ["reqwest-client"]} tracing = "0.1.40" tracing-opentelemetry = "0.21.0" tracing-subscriber = {version = "0.3.17", features = ["env-filter", "json"]} diff --git a/crates/common/src/tracing.rs b/crates/common/src/tracing.rs index 317326da..66630f14 100644 --- a/crates/common/src/tracing.rs +++ b/crates/common/src/tracing.rs @@ -5,20 +5,20 @@ use chrono::Utc; use opentelemetry::sdk::trace; use opentelemetry::sdk::trace::Sampler; use opentelemetry::trace::TraceContextExt; -use serde::ser::{SerializeMap, Serializer as _}; +use serde::ser::SerializeMap; +use serde::Serializer; use tokio::sync::OnceCell; use tracing::{Event, Level, Subscriber}; use tracing_appender::non_blocking::WorkerGuard; use tracing_opentelemetry::{OpenTelemetrySpanExt, OtelData}; use tracing_serde::fields::AsMap; use tracing_serde::AsSerde; -use tracing_subscriber::filter::EnvFilter; -use tracing_subscriber::fmt; use tracing_subscriber::fmt::format::Writer; use tracing_subscriber::fmt::{FmtContext, FormatEvent, FormatFields}; use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; use tracing_subscriber::registry::{LookupSpan, SpanRef}; use tracing_subscriber::util::SubscriberInitExt; +use tracing_subscriber::{fmt, EnvFilter}; static WORKER_GUARD: OnceCell = OnceCell::const_new(); @@ -53,7 +53,7 @@ pub fn init_datadog_subscriber(service_name: &str, level: Level) { let file_appender = tracing_appender::rolling::RollingFileAppender::new( //TODO: do we want this to be dynamic tracing_appender::rolling::Rotation::DAILY, - get_log_directory(), + get_log_directory().expect("TODO:handle this error"), format!("{service_name}.log"), ); diff --git a/crates/sequencer/Cargo.toml b/crates/sequencer/Cargo.toml deleted file mode 100644 index f51150fa..00000000 --- a/crates/sequencer/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "sequencer" -version = "0.1.0" -edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] diff --git a/crates/sequencer/src/main.rs b/crates/sequencer/src/main.rs deleted file mode 100644 index e7a11a96..00000000 --- a/crates/sequencer/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -} diff --git a/crates/state_bridge/Cargo.toml b/crates/state_bridge/Cargo.toml deleted file mode 100644 index 1524b266..00000000 --- a/crates/state_bridge/Cargo.toml +++ /dev/null @@ -1,24 +0,0 @@ -[package] -name = "state_bridge" -version = "0.1.0" -edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -anyhow = "1.0.75" -ethers = { version = "2.0.10", features = ["abigen", "ws", "ipc", "rustls", "openssl"] } -eyre = "0.6.8" -hex = "0.4.3" -ruint = "1.10.1" -semaphore = { git = "https://github.com/worldcoin/semaphore-rs", branch = "main", features = [ - "depth_20", -] } -serde = { version = "1.0.189", features = ["derive"] } -serde_json = "1.0.107" -take_mut = "0.2.2" -thiserror = "1.0.49" -tokio = { version = "1.32.0", features = ["sync", "macros"] } -tracing = "0.1.37" - -[dev-dependencies] -common = { path = "../common" } diff --git a/crates/state_bridge/README.md b/crates/state_bridge/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/crates/state_bridge/src/abi.rs b/crates/state_bridge/src/abi.rs deleted file mode 100644 index a2a9d84a..00000000 --- a/crates/state_bridge/src/abi.rs +++ /dev/null @@ -1,23 +0,0 @@ -use ethers::middleware::contract::abigen; - -abigen!( - IWorldIDIdentityManager, - r#"[ - function latestRoot() external returns (uint256) - event TreeChanged(uint256 indexed preRoot, uint8 indexed kind, uint256 indexed postRoot) - ]"#; - - IStateBridge, - r#"[ - function propagateRoot() external - ]"#; - - IBridgedWorldID, - r#"[ - event RootAdded(uint256 root, uint128 timestamp) - function latestRoot() public view virtual returns (uint256) - function receiveRoot(uint256 newRoot) external - ]"#, - event_derives(serde::Deserialize, serde::Serialize) - -); diff --git a/crates/state_bridge/src/root.rs b/crates/state_bridge/src/root.rs deleted file mode 100644 index 8ebaa449..00000000 --- a/crates/state_bridge/src/root.rs +++ /dev/null @@ -1,141 +0,0 @@ -use std::sync::Arc; - -use ethers::middleware::Middleware; -use ethers::providers::StreamExt; -use ethers::types::H160; -use ruint::Uint; -use semaphore::merkle_tree::Hasher; -use semaphore::poseidon_tree::PoseidonHash; -use tokio::task::JoinHandle; -use tracing::instrument; - -use crate::abi::{IWorldIDIdentityManager, TreeChangedFilter}; -use crate::error::StateBridgeError; - -pub type Hash = ::Hash; - -/// Monitors `TreeChanged` events from `WorldIDIdentityManager` and broadcasts new roots to through the `root_tx`. -pub struct WorldTreeRoot { - pub world_id_identity_manager: IWorldIDIdentityManager, - pub root_tx: tokio::sync::broadcast::Sender, -} - -impl WorldTreeRoot -where - M: Middleware, -{ - pub async fn new( - world_id_identity_manager: IWorldIDIdentityManager, - ) -> Result> { - let (root_tx, _) = tokio::sync::broadcast::channel::(1000); - - Ok(Self { - world_id_identity_manager, - root_tx, - }) - } - - pub async fn new_from_parts( - world_tree_address: H160, - middleware: Arc, - ) -> Result> { - let (root_tx, _) = tokio::sync::broadcast::channel::(1000); - - let world_id_identity_manager = IWorldIDIdentityManager::new( - world_tree_address, - middleware.clone(), - ); - - Ok(Self { - world_id_identity_manager, - root_tx, - }) - } - - /// Spawns the `WorldTreeRoot` task which will listen to changes to the `WorldIDIdentityManager` - /// [merkle tree root](https://github.com/worldcoin/world-id-contracts/blob/852790da8f348d6a2dbb58d1e29123a644f4aece/src/WorldIDIdentityManagerImplV1.sol#L63). - #[allow(clippy::async_yields_async)] - #[instrument(skip(self))] - pub async fn spawn(&self) -> JoinHandle>> { - let root_tx = self.root_tx.clone(); - let world_id_identity_manager = self.world_id_identity_manager.clone(); - - let world_id_identity_manager_address = - world_id_identity_manager.address(); - tracing::info!(?world_id_identity_manager_address, "Spawning root"); - - tokio::spawn(async move { - // Event emitted when insertions or deletions are made to the tree - let filter = world_id_identity_manager.event::(); - - let mut event_stream = filter.stream().await?.with_meta(); - - // Listen to a stream of events, when a new event is received, update the root and block number - while let Some(Ok((event, _))) = event_stream.next().await { - let new_root = event.post_root.0; - tracing::info!(?new_root, "New root from chain"); - root_tx.send(Uint::from_limbs(event.post_root.0))?; - } - - Ok(()) - }) - } -} - -#[cfg(test)] - -mod tests { - use std::str::FromStr; - - use common::test_utilities::chain_mock::{spawn_mock_chain, MockChain}; - use ethers::types::U256; - use tokio::time::Duration; - - use super::*; - - #[tokio::test] - async fn listen_and_propagate_root() -> eyre::Result<()> { - // we need anvil to be in scope for the provider to not be dropped - #[allow(unused_variables)] - let MockChain { - mock_world_id, - middleware, - anvil, - .. - } = spawn_mock_chain().await?; - - let world_id = IWorldIDIdentityManager::new( - mock_world_id.address(), - middleware.clone(), - ); - - let tree_root = WorldTreeRoot::new(world_id).await?; - - tree_root.spawn().await; - - let test_root = U256::from_str("0x222").unwrap(); - - mock_world_id.insert_root(test_root).send().await?.await?; - - let mut root_rx = tree_root.root_tx.subscribe(); - - let relaying_period = Duration::from_secs(5); - - tokio::spawn(async move { - loop { - // Process all of the updates and get the latest root - while let Ok(root) = root_rx.recv().await { - if root == Uint::from_limbs(test_root.0) { - break; - } - // Check if the latest root is different than on L2 and if so, update the root - tokio::time::sleep(relaying_period).await; - } - - tokio::time::sleep(Duration::from_secs(5)).await; - } - }); - - Ok(()) - } -} diff --git a/crates/tree_availability/Cargo.toml b/crates/tree_availability/Cargo.toml deleted file mode 100644 index 0beadb3a..00000000 --- a/crates/tree_availability/Cargo.toml +++ /dev/null @@ -1,35 +0,0 @@ -[package] -name = "tree_availability" -version = "0.1.0" -edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -axum = "0.6.20" -ethers = { version = "2.0.10", features = [ - "abigen", - "ws", - "ipc", - "rustls", - "openssl", -] } -eyre = "0.6.8" -futures = "0.3.28" -hyper = { version = "^0.14.27", features = ["server", "tcp", "http1", "http2"] } -metrics = "0.21.1" -semaphore = { git = "https://github.com/worldcoin/semaphore-rs", branch = "main", features = [ - "depth_20", -] } -serde = { version = "1.0.189", features = ["derive"] } -serde_json = "1.0.107" -take_mut = "0.2.2" -thiserror = "1.0.49" -tokio = { version = "1.32.0", features = ["sync", "macros"] } -tracing = {version = "0.1.37", features = ["attributes"]} -opentelemetry = "0.20.0" -common = { path = "../common" } -bytes = "1.5.0" -futures-util = "0.3.29" - -[dev-dependencies] -reqwest = { version = "0.11.22", features = ["json"] } diff --git a/crates/tree_availability/README.md b/crates/tree_availability/README.md deleted file mode 100644 index e69de29b..00000000 diff --git a/crates/tree_availability/src/error.rs b/crates/tree_availability/src/error.rs deleted file mode 100644 index 4a653f7b..00000000 --- a/crates/tree_availability/src/error.rs +++ /dev/null @@ -1,44 +0,0 @@ -use ethers::prelude::{AbiError, ContractError}; -use ethers::providers::{Middleware, ProviderError}; -use ethers::types::Log; -use thiserror::Error; -use tokio::sync::mpsc::error::SendError; - -#[derive(Error, Debug)] -pub enum TreeAvailabilityError -where - M: Middleware + 'static, -{ - #[error("Missing transaction on log")] - MissingTransaction, - #[error("Unrecognized transaction")] - UnrecognizedTransaction, - #[error("Transaction hash was not found")] - TransactionHashNotFound, - #[error("Block number was not found")] - BlockNumberNotFound, - #[error("Transaction was not found from hash")] - TransactionNotFound, - #[error("Unrecognized function selector")] - UnrecognizedFunctionSelector, - #[error("Middleware error")] - MiddlewareError(::Error), - #[error("Provider error")] - ProviderError(#[from] ProviderError), - #[error("Contract error")] - ContractError(#[from] ContractError), - #[error("ABI Codec error")] - ABICodecError(#[from] AbiError), - #[error("Eth ABI error")] - EthABIError(#[from] ethers::abi::Error), - #[error(transparent)] - HyperError(#[from] hyper::Error), - #[error(transparent)] - SendLogError(#[from] SendError), -} - -#[derive(Error, Debug)] -pub enum TreeError { - #[error("The world tree is not fully synced")] - TreeNotSynced, -} diff --git a/crates/tree_availability/src/server/middleware/mod.rs b/crates/tree_availability/src/server/middleware/mod.rs deleted file mode 100644 index 31348d2f..00000000 --- a/crates/tree_availability/src/server/middleware/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod logging; diff --git a/crates/tree_availability/src/server/mod.rs b/crates/tree_availability/src/server/mod.rs deleted file mode 100644 index df09f22c..00000000 --- a/crates/tree_availability/src/server/mod.rs +++ /dev/null @@ -1,148 +0,0 @@ -use std::sync::atomic::Ordering; -use std::sync::Arc; - -pub mod middleware; - -use axum::extract::State; -use axum::http::StatusCode; -use axum::response::IntoResponse; -use axum::Json; -use ethers::providers::Middleware; -use semaphore::poseidon_tree::{Branch, Proof}; -use semaphore::Field; -use serde::de::Error; -use serde::{Deserialize, Deserializer, Serialize}; -use serde_json::Value; - -use crate::error::TreeError; -use crate::world_tree::{Hash, WorldTree}; - -#[derive(Serialize, Deserialize, Debug)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct InclusionProofRequest { - pub identity_commitment: Hash, - pub root: Option, -} - -impl InclusionProofRequest { - pub fn new( - identity_commitment: Hash, - root: Option, - ) -> InclusionProofRequest { - Self { - identity_commitment, - root, - } - } -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct InclusionProof { - pub root: Field, - #[serde(deserialize_with = "deserialize_proof")] - pub proof: Proof, - pub message: Option, -} - -impl InclusionProof { - pub fn new( - root: Field, - proof: Proof, - message: Option, - ) -> InclusionProof { - Self { - root, - proof, - message, - } - } -} - -fn deserialize_proof<'de, D>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - let value: Value = Deserialize::deserialize(deserializer)?; - if let Value::Array(array) = value { - let mut branches = vec![]; - for value in array { - let branch = serde_json::from_value::(value) - .map_err(serde::de::Error::custom)?; - branches.push(branch); - } - - Ok(semaphore::merkle_tree::Proof(branches)) - } else { - Err(D::Error::custom("Expected an array")) - } -} - -#[tracing::instrument(level = "debug", skip(world_tree))] -pub async fn inclusion_proof( - State(world_tree): State>>, - Json(req): Json, -) -> Result<(StatusCode, Json>), TreeError> { - if world_tree.synced.load(Ordering::Relaxed) { - let inclusion_proof = world_tree - .tree_data - .get_inclusion_proof(req.identity_commitment, req.root) - .await; - - Ok((StatusCode::OK, inclusion_proof.into())) - } else { - Err(TreeError::TreeNotSynced) - } -} - -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct SyncResponse { - pub synced: bool, - pub block_number: Option, -} - -impl SyncResponse { - pub fn new(synced: bool, block_number: Option) -> SyncResponse { - Self { - synced, - block_number, - } - } -} - -#[tracing::instrument(level = "debug", skip(world_tree))] -pub async fn synced( - State(world_tree): State>>, -) -> (StatusCode, Json) { - if world_tree.synced.load(Ordering::Relaxed) { - (StatusCode::OK, SyncResponse::new(true, None).into()) - } else { - let latest_synced_block = Some( - world_tree - .tree_updater - .latest_synced_block - .load(Ordering::SeqCst), - ); - ( - StatusCode::OK, - SyncResponse::new(false, latest_synced_block).into(), - ) - } -} - -impl TreeError { - fn to_status_code(&self) -> StatusCode { - match self { - TreeError::TreeNotSynced => StatusCode::SERVICE_UNAVAILABLE, - } - } -} - -impl IntoResponse for TreeError { - fn into_response(self) -> axum::response::Response { - let status_code = self.to_status_code(); - let response_body = self.to_string(); - (status_code, response_body).into_response() - } -} diff --git a/crates/tree_availability/src/world_tree/abi.rs b/src/abi.rs similarity index 62% rename from crates/tree_availability/src/world_tree/abi.rs rename to src/abi.rs index d30890d2..1dac7f7a 100644 --- a/crates/tree_availability/src/world_tree/abi.rs +++ b/src/abi.rs @@ -1,13 +1,26 @@ use ethers::middleware::contract::abigen; -//TODO: Update staging deployment and remove `deleteIdentities` containing a batch size from the abi below abigen!( IWorldIDIdentityManager, r#"[ + function latestRoot() external returns (uint256) event TreeChanged(uint256 indexed preRoot, uint8 indexed kind, uint256 indexed postRoot) function registerIdentities(uint256[8] calldata insertionProof, uint256 preRoot, uint32 startIndex, uint256[] calldata identityCommitments, uint256 postRoot) external function deleteIdentities(uint256[8] calldata deletionProof, bytes calldata packedDeletionIndices, uint256 preRoot, uint256 postRoot) external function deleteIdentities(uint256[8] calldata deletionProof, uint32 batchSize, bytes calldata packedDeletionIndices, uint256 preRoot, uint256 postRoot) external + ]"#; + IStateBridge, + r#"[ + function propagateRoot() external ]"#; + + IBridgedWorldID, + r#"[ + event RootAdded(uint256 root, uint128 timestamp) + function latestRoot() public view virtual returns (uint256) + function receiveRoot(uint256 newRoot) external + ]"#, + event_derives(serde::Deserialize, serde::Serialize) + ); diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 00000000..dd666b5e --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,3 @@ +pub mod abi; +pub mod state_bridge; +pub mod tree; diff --git a/crates/state_bridge/src/error.rs b/src/state_bridge/error.rs similarity index 91% rename from crates/state_bridge/src/error.rs rename to src/state_bridge/error.rs index cbc65608..5db0d995 100644 --- a/crates/state_bridge/src/error.rs +++ b/src/state_bridge/error.rs @@ -1,8 +1,10 @@ use ethers::prelude::{AbiError, ContractError}; use ethers::providers::{Middleware, ProviderError}; +use ethers::types::Log; use thiserror::Error; +use tokio::sync::mpsc::error::SendError; -use crate::root::Hash; +use crate::tree::Hash; #[derive(Error, Debug)] pub enum StateBridgeError diff --git a/crates/state_bridge/src/bridge.rs b/src/state_bridge/mod.rs similarity index 98% rename from crates/state_bridge/src/bridge.rs rename to src/state_bridge/mod.rs index 22a7969f..9f58c146 100644 --- a/crates/state_bridge/src/bridge.rs +++ b/src/state_bridge/mod.rs @@ -1,3 +1,6 @@ +pub mod error; +pub mod service; + use std::sync::Arc; use ethers::providers::Middleware; @@ -8,9 +11,9 @@ use tokio::task::JoinHandle; use tokio::time::{Duration, Instant}; use tracing::instrument; +use self::error::StateBridgeError; use crate::abi::{IBridgedWorldID, IStateBridge}; -use crate::error::StateBridgeError; -use crate::root::Hash; +use crate::tree::Hash; /// The `StateBridge` is responsible for monitoring root changes from the `WorldRoot`, propagating the root to the corresponding Layer 2. pub struct StateBridge { diff --git a/crates/state_bridge/src/lib.rs b/src/state_bridge/service.rs similarity index 57% rename from crates/state_bridge/src/lib.rs rename to src/state_bridge/service.rs index 680f4aff..448d7c32 100644 --- a/crates/state_bridge/src/lib.rs +++ b/src/state_bridge/service.rs @@ -1,24 +1,14 @@ -//! # State Bridge Service -//! -//! ### Description -//! -//! The state bridge service for the World ID protocol takes care of periodically relaying the latest roots from the World ID Identity Manager onto L2 networks or sidechains that implement native bridge on Ethereum or have an integration with third party messaging protocol. The state bridge service requires a deployment of the [`world-id-state-bridge`](github.com/worldcoin/world-id-state-bridge/) contracts which in turn also have to be connected to a valid [`world-id-contracts`](https://github.com/worldcoin/world-id-contracts/) deployment. - -pub mod abi; -pub mod bridge; -pub mod error; -pub mod root; - use std::sync::Arc; -use abi::IWorldIDIdentityManager; -use bridge::StateBridge; -use error::StateBridgeError; use ethers::providers::Middleware; use ethers::types::H160; -use root::WorldTreeRoot; use tokio::task::JoinHandle; +use super::error::StateBridgeError; +use super::StateBridge; +use crate::abi::IWorldIDIdentityManager; + +//TODO: we dont need this root field and we can spawn the root logic so that this doesnt need to be here, we can simplify this service /// Monitors the world tree root for changes and propagates new roots to target Layer 2s pub struct StateBridgeService { /// Local state of the world tree root, responsible for listening to TreeChanged events from the`WorldIDIdentityManager`. @@ -58,6 +48,37 @@ where self.state_bridges.push(state_bridge); } + /// Spawns the `WorldTreeRoot` task which will listen to changes to the `WorldIDIdentityManager` + /// [merkle tree root](https://github.com/worldcoin/world-id-contracts/blob/852790da8f348d6a2dbb58d1e29123a644f4aece/src/WorldIDIdentityManagerImplV1.sol#L63). + #[allow(clippy::async_yields_async)] + #[instrument(skip(self))] + pub async fn spawn_listener( + &self, + ) -> JoinHandle>> { + let root_tx = self.root_tx.clone(); + let world_id_identity_manager = self.world_id_identity_manager.clone(); + + let world_id_identity_manager_address = + world_id_identity_manager.address(); + tracing::info!(?world_id_identity_manager_address, "Spawning root"); + + tokio::spawn(async move { + // Event emitted when insertions or deletions are made to the tree + let filter = world_id_identity_manager.event::(); + + let mut event_stream = filter.stream().await?.with_meta(); + + // Listen to a stream of events, when a new event is received, update the root and block number + while let Some(Ok((event, _))) = event_stream.next().await { + let new_root = event.post_root.0; + tracing::info!(?new_root, "New root from chain"); + root_tx.send(Uint::from_limbs(event.post_root.0))?; + } + + Ok(()) + }) + } + /// Spawns the `StateBridgeService`. pub async fn spawn( &mut self, diff --git a/crates/tree_availability/src/world_tree/block_scanner.rs b/src/tree/block_scanner.rs similarity index 90% rename from crates/tree_availability/src/world_tree/block_scanner.rs rename to src/tree/block_scanner.rs index 99a2789e..b1bf59d3 100644 --- a/crates/tree_availability/src/world_tree/block_scanner.rs +++ b/src/tree/block_scanner.rs @@ -1,9 +1,7 @@ use std::sync::atomic::{AtomicU64, Ordering}; use ethers::providers::Middleware; -use ethers::types::{ - Address, BlockNumber, Filter, FilterBlockOption, Log, Topic, ValueOrArray, -}; +use ethers::types::{Address, BlockNumber, Filter, FilterBlockOption, Log, Topic, ValueOrArray}; /// The `BlockScanner` utility tool enables allows parsing arbitrary onchain events pub struct BlockScanner { @@ -20,11 +18,7 @@ where M: Middleware, { /// Initializes a new `BlockScanner` - pub const fn new( - middleware: M, - window_size: u64, - current_block: u64, - ) -> Self { + pub const fn new(middleware: M, window_size: u64, current_block: u64) -> Self { Self { middleware, last_synced_block: AtomicU64::new(current_block), diff --git a/crates/tree_availability/src/world_tree/error.rs b/src/tree/error.rs similarity index 98% rename from crates/tree_availability/src/world_tree/error.rs rename to src/tree/error.rs index 4a653f7b..ff4af3ce 100644 --- a/crates/tree_availability/src/world_tree/error.rs +++ b/src/tree/error.rs @@ -4,6 +4,8 @@ use ethers::types::Log; use thiserror::Error; use tokio::sync::mpsc::error::SendError; +use crate::tree::Hash; + #[derive(Error, Debug)] pub enum TreeAvailabilityError where diff --git a/crates/tree_availability/src/world_tree/mod.rs b/src/tree/mod.rs similarity index 97% rename from crates/tree_availability/src/world_tree/mod.rs rename to src/tree/mod.rs index 1e8ea244..5fa343f8 100644 --- a/crates/tree_availability/src/world_tree/mod.rs +++ b/src/tree/mod.rs @@ -1,5 +1,6 @@ -pub mod abi; pub mod block_scanner; +pub mod error; +pub mod service; pub mod tree_data; pub mod tree_updater; @@ -7,6 +8,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::time::Duration; +use error::TreeAvailabilityError; use ethers::providers::Middleware; use ethers::types::H160; use semaphore::lazy_merkle_tree::{Canonical, LazyMerkleTree}; @@ -17,7 +19,6 @@ use tracing::instrument; use self::tree_data::TreeData; use self::tree_updater::TreeUpdater; -use crate::error::TreeAvailabilityError; pub type PoseidonTree = LazyMerkleTree; pub type Hash = ::Hash; diff --git a/crates/tree_availability/src/server/middleware/logging.rs b/src/tree/service/logging_middleware.rs similarity index 100% rename from crates/tree_availability/src/server/middleware/logging.rs rename to src/tree/service/logging_middleware.rs diff --git a/crates/tree_availability/src/lib.rs b/src/tree/service/mod.rs similarity index 54% rename from crates/tree_availability/src/lib.rs rename to src/tree/service/mod.rs index 91b50763..31f03aa8 100644 --- a/crates/tree_availability/src/lib.rs +++ b/src/tree/service/mod.rs @@ -1,29 +1,26 @@ -//! # Tree Availability Service -//! -//! The tree availability service is able to create an in-memory representation of the World ID -//! merkle tree by syncing the state of the World ID contract `registerIdentities` and `deleteIdentities` -//! function calldata and `TreeChanged` events. Once it syncs the latest state of the state of the tree, it -//! is able to serve inclusion proofs on the `/inclusionProof` endpoint. It also keeps a historical roots list -//! of `tree_history_size` size in order to serve proofs against older tree roots (including the roots of -//! World IDs bridged to other networks). - -pub mod error; -pub mod server; -pub mod world_tree; +pub mod logging_middleware; use std::net::{IpAddr, Ipv4Addr, SocketAddr}; +use std::sync::atomic::Ordering; use std::sync::Arc; -use axum::middleware; -use error::TreeAvailabilityError; +use axum::extract::State; +use axum::http::StatusCode; +use axum::response::IntoResponse; +use axum::{middleware, Json}; use ethers::providers::Middleware; use ethers::types::H160; use semaphore::lazy_merkle_tree::Canonical; +use semaphore::poseidon_tree::{Branch, Proof}; +use semaphore::Field; +use serde::de::Error; +use serde::{Deserialize, Deserializer, Serialize}; +use serde_json::Value; use tokio::task::JoinHandle; -use tracing::instrument; -use world_tree::{Hash, PoseidonTree, WorldTree}; -use crate::server::{inclusion_proof, synced}; +use super::error::{TreeAvailabilityError, TreeError}; +use super::tree_data::InclusionProof; +use super::{Hash, PoseidonTree, WorldTree}; /// Service that keeps the World Tree synced with `WorldIDIdentityManager` and exposes an API endpoint to serve inclusion proofs for a given World ID. pub struct TreeAvailabilityService { @@ -94,7 +91,7 @@ impl TreeAvailabilityService { let router = axum::Router::new() .route("/inclusionProof", axum::routing::post(inclusion_proof)) .route("/synced", axum::routing::post(synced)) - .layer(middleware::from_fn(server::middleware::logging::middleware)) + .layer(middleware::from_fn(logging_middleware::middleware)) .with_state(self.world_tree.clone()); let address = @@ -119,3 +116,91 @@ impl TreeAvailabilityService { handles } } + +#[derive(Serialize, Deserialize, Debug)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct InclusionProofRequest { + pub identity_commitment: Hash, + pub root: Option, +} + +impl InclusionProofRequest { + pub fn new( + identity_commitment: Hash, + root: Option, + ) -> InclusionProofRequest { + Self { + identity_commitment, + root, + } + } +} + +#[tracing::instrument(level = "debug", skip(world_tree))] +pub async fn inclusion_proof( + State(world_tree): State>>, + Json(req): Json, +) -> Result<(StatusCode, Json>), TreeError> { + if world_tree.synced.load(Ordering::Relaxed) { + let inclusion_proof = world_tree + .tree_data + .get_inclusion_proof(req.identity_commitment, req.root) + .await; + + Ok((StatusCode::OK, inclusion_proof.into())) + } else { + Err(TreeError::TreeNotSynced) + } +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SyncResponse { + pub synced: bool, + pub block_number: Option, +} + +impl SyncResponse { + pub fn new(synced: bool, block_number: Option) -> SyncResponse { + Self { + synced, + block_number, + } + } +} + +#[tracing::instrument(level = "debug", skip(world_tree))] +pub async fn synced( + State(world_tree): State>>, +) -> (StatusCode, Json) { + if world_tree.synced.load(Ordering::Relaxed) { + (StatusCode::OK, SyncResponse::new(true, None).into()) + } else { + let latest_synced_block = Some( + world_tree + .tree_updater + .latest_synced_block + .load(Ordering::SeqCst), + ); + ( + StatusCode::OK, + SyncResponse::new(false, latest_synced_block).into(), + ) + } +} + +impl TreeError { + fn to_status_code(&self) -> StatusCode { + match self { + TreeError::TreeNotSynced => StatusCode::SERVICE_UNAVAILABLE, + } + } +} + +impl IntoResponse for TreeError { + fn into_response(self) -> axum::response::Response { + let status_code = self.to_status_code(); + let response_body = self.to_string(); + (status_code, response_body).into_response() + } +} diff --git a/crates/tree_availability/src/world_tree/tree_data.rs b/src/tree/tree_data.rs similarity index 90% rename from crates/tree_availability/src/world_tree/tree_data.rs rename to src/tree/tree_data.rs index a36250d7..8f7ba352 100644 --- a/crates/tree_availability/src/world_tree/tree_data.rs +++ b/src/tree/tree_data.rs @@ -1,11 +1,14 @@ use std::collections::VecDeque; use semaphore::lazy_merkle_tree::{Canonical, Derived, VersionMarker}; -use semaphore::poseidon_tree::Proof; +use semaphore::poseidon_tree::{Branch, Proof}; +use semaphore::Field; +use serde::de::Error; +use serde::{Deserialize, Deserializer, Serialize}; +use serde_json::Value; use tokio::sync::RwLock; use super::{Hash, PoseidonTree}; -use crate::server::InclusionProof; /// Represents the in-memory state of the World Tree, caching historical roots up to `tree_history_size`. pub struct TreeData { @@ -172,6 +175,49 @@ impl TreeData { } } +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct InclusionProof { + pub root: Field, + //TODO: Open a PR to semaphore-rs to deserialize proof instead of implementing deserialization here + #[serde(deserialize_with = "deserialize_proof")] + pub proof: Proof, + pub message: Option, +} + +impl InclusionProof { + pub fn new( + root: Field, + proof: Proof, + message: Option, + ) -> InclusionProof { + Self { + root, + proof, + message, + } + } +} + +fn deserialize_proof<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + let value: Value = Deserialize::deserialize(deserializer)?; + if let Value::Array(array) = value { + let mut branches = vec![]; + for value in array { + let branch = serde_json::from_value::(value) + .map_err(serde::de::Error::custom)?; + branches.push(branch); + } + + Ok(semaphore::merkle_tree::Proof(branches)) + } else { + Err(D::Error::custom("Expected an array")) + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/crates/tree_availability/src/world_tree/tree_updater.rs b/src/tree/tree_updater.rs similarity index 96% rename from crates/tree_availability/src/world_tree/tree_updater.rs rename to src/tree/tree_updater.rs index eeca0d8a..4a49e18c 100644 --- a/crates/tree_availability/src/world_tree/tree_updater.rs +++ b/src/tree/tree_updater.rs @@ -9,14 +9,15 @@ use ethers::types::{Selector, Transaction, H160, U256}; use futures::stream::FuturesOrdered; use tracing::instrument; -use super::abi::{ - DeleteIdentitiesCall, RegisterIdentitiesCall, TreeChangedFilter, -}; use super::block_scanner::BlockScanner; +use super::error::TreeAvailabilityError; use super::tree_data::TreeData; -use crate::error::TreeAvailabilityError; -use crate::world_tree::abi::DeleteIdentitiesWithDeletionProofAndBatchSizeAndPackedDeletionIndicesAndPreRootCall; -use crate::world_tree::Hash; +use crate::abi::{ + DeleteIdentitiesCall, + DeleteIdentitiesWithDeletionProofAndBatchSizeAndPackedDeletionIndicesAndPreRootCall, + RegisterIdentitiesCall, TreeChangedFilter, +}; +use crate::tree::Hash; /// Manages the synchronization of the World Tree with it's onchain representation. pub struct TreeUpdater { diff --git a/crates/state_bridge/tests/bridge_service.rs b/tests/bridge_service.rs similarity index 84% rename from crates/state_bridge/tests/bridge_service.rs rename to tests/bridge_service.rs index a5a40da2..6432b15c 100644 --- a/crates/state_bridge/tests/bridge_service.rs +++ b/tests/bridge_service.rs @@ -8,17 +8,15 @@ pub use ethers::core::abi::Abi; pub use ethers::core::k256::ecdsa::SigningKey; pub use ethers::core::rand; pub use ethers::prelude::{ - ContractFactory, Http, LocalWallet, NonceManagerMiddleware, Provider, - Signer, SignerMiddleware, Wallet, + ContractFactory, Http, LocalWallet, NonceManagerMiddleware, Provider, Signer, SignerMiddleware, + Wallet, }; pub use ethers::providers::{Middleware, StreamExt}; pub use ethers::types::{Bytes, H256, U256}; pub use ethers::utils::{Anvil, AnvilInstance}; pub use serde::{Deserialize, Serialize}; pub use serde_json::json; -use state_bridge::abi::{ - IBridgedWorldID, IStateBridge, IWorldIDIdentityManager, -}; +use state_bridge::abi::{IBridgedWorldID, IStateBridge, IWorldIDIdentityManager}; use state_bridge::bridge::StateBridge; use state_bridge::error::StateBridgeError; use state_bridge::StateBridgeService; @@ -42,10 +40,7 @@ pub async fn test_relay_root() -> eyre::Result<()> { let relaying_period = std::time::Duration::from_secs(5); - let world_id = IWorldIDIdentityManager::new( - mock_world_id.address(), - middleware.clone(), - ); + let world_id = IWorldIDIdentityManager::new(mock_world_id.address(), middleware.clone()); mock_state_bridge.propagate_root().send().await?.await?; @@ -57,11 +52,9 @@ pub async fn test_relay_root() -> eyre::Result<()> { .await .expect("couldn't create StateBridgeService"); - let state_bridge = - IStateBridge::new(state_bridge_address, middleware.clone()); + let state_bridge = IStateBridge::new(state_bridge_address, middleware.clone()); - let bridged_world_id = - IBridgedWorldID::new(bridged_world_id_address, middleware.clone()); + let bridged_world_id = IBridgedWorldID::new(bridged_world_id_address, middleware.clone()); let block_confirmations: usize = 6usize; @@ -80,8 +73,7 @@ pub async fn test_relay_root() -> eyre::Result<()> { .await .expect("failed to spawn a state bridge service"); - let latest_root = - U256::from_str("0x12312321321").expect("couldn't parse hexstring"); + let latest_root = U256::from_str("0x12312321321").expect("couldn't parse hexstring"); mock_world_id.insert_root(latest_root).send().await?.await?; @@ -122,10 +114,7 @@ pub async fn test_no_state_bridge_relay_fails() -> eyre::Result<()> { .. } = spawn_mock_chain().await?; - let world_id = IWorldIDIdentityManager::new( - mock_world_id.address(), - middleware.clone(), - ); + let world_id = IWorldIDIdentityManager::new(mock_world_id.address(), middleware.clone()); let mut state_bridge_service = StateBridgeService::new(world_id) .await diff --git a/crates/tree_availability/tests/inclusion_proof.rs b/tests/inclusion_proof.rs similarity index 92% rename from crates/tree_availability/tests/inclusion_proof.rs rename to tests/inclusion_proof.rs index 1d2ab1fa..0241359b 100644 --- a/crates/tree_availability/tests/inclusion_proof.rs +++ b/tests/inclusion_proof.rs @@ -22,11 +22,9 @@ async fn test_inclusion_proof() -> eyre::Result<()> { } = spawn_mock_chain().await?; // Register identities - let identity_commitments = - vec![U256::from(1), U256::from(2), U256::from(3)]; + let identity_commitments = vec![U256::from(1), U256::from(2), U256::from(3)]; - let world_tree_creation_block = - middleware.get_block_number().await?.as_u64() - 1; + let world_tree_creation_block = middleware.get_block_number().await?.as_u64() - 1; mock_world_id .register_identities( @@ -109,7 +107,9 @@ async fn test_inclusion_proof() -> eyre::Result<()> { .post("http://127.0.0.1:8080/inclusionProof") .json(&InclusionProofRequest { identity_commitment: Hash::from(0x01), - root: Some(Hash::from_str("0x05c1e52b41a571293b30efacd2afdb7173b20cfaf1f646c4ac9f96eb75848270")?), + root: Some(Hash::from_str( + "0x05c1e52b41a571293b30efacd2afdb7173b20cfaf1f646c4ac9f96eb75848270", + )?), }) .send() .await?; From 13ae9eb1e35f066db609dda951ed36bb187a63c0 Mon Sep 17 00:00:00 2001 From: 0xKitsune <0xKitsune@protonmail.com> Date: Wed, 8 Nov 2023 08:43:16 -0500 Subject: [PATCH 2/7] removed world tree root and unneeded async --- Cargo.lock | 137 +++++++++++++++++++++++++++++++++++- Cargo.toml | 2 + bin/state_bridge_service.rs | 35 +++++---- src/state_bridge/mod.rs | 3 +- src/state_bridge/service.rs | 49 ++++++------- src/tree/service/mod.rs | 2 +- 6 files changed, 182 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b215c04e..b31945d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -96,6 +96,54 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +dependencies = [ + "anstyle", + "windows-sys 0.48.0", +] + [[package]] name = "anyhow" version = "1.0.75" @@ -769,6 +817,46 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "clap" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + [[package]] name = "coins-bip32" version = "0.8.7" @@ -875,6 +963,12 @@ dependencies = [ "tracing-error 0.2.0", ] +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "combine" version = "4.6.6" @@ -1048,7 +1142,7 @@ checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" dependencies = [ "atty", "cast", - "clap", + "clap 2.34.0", "criterion-plot", "csv", "itertools 0.10.5", @@ -1624,7 +1718,7 @@ dependencies = [ "serde", "serde_json", "syn 2.0.39", - "toml", + "toml 0.7.8", "walkdir", ] @@ -4544,6 +4638,12 @@ dependencies = [ "precomputed-hash", ] +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "strum" version = "0.25.0" @@ -4901,6 +5001,18 @@ dependencies = [ "toml_edit 0.19.15", ] +[[package]] +name = "toml" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.21.0", +] + [[package]] name = "toml_datetime" version = "0.6.5" @@ -4934,6 +5046,19 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_edit" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap 2.1.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower" version = "0.4.13" @@ -5230,6 +5355,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "uuid" version = "0.8.2" @@ -5897,6 +6028,7 @@ dependencies = [ "anyhow", "axum", "bytes", + "clap 4.4.7", "common", "ethers", "eyre", @@ -5914,6 +6046,7 @@ dependencies = [ "take_mut", "thiserror", "tokio", + "toml 0.8.8", "tracing", ] diff --git a/Cargo.toml b/Cargo.toml index 82768e44..3fc459e0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,8 @@ opentelemetry = "0.20.0" common = { path = "crates/common" } bytes = "1.5.0" futures-util = "0.3.29" +clap = {version = "4.4.7" , features = ["derive"]} +toml = "0.8.8" [dev-dependencies] reqwest = { version = "0.11.22", features = ["json"] } diff --git a/bin/state_bridge_service.rs b/bin/state_bridge_service.rs index fcd14aa1..7663037a 100644 --- a/bin/state_bridge_service.rs +++ b/bin/state_bridge_service.rs @@ -7,16 +7,16 @@ use clap::Parser; use common::tracing::{init_datadog_subscriber, init_subscriber}; use ethers::abi::Address; use ethers::prelude::{ - Http, LocalWallet, NonceManagerMiddleware, Provider, Signer, SignerMiddleware, H160, + Http, LocalWallet, NonceManagerMiddleware, Provider, Signer, + SignerMiddleware, H160, }; use ethers::providers::Middleware; use futures::stream::FuturesUnordered; use futures::StreamExt; +use opentelemetry::global::shutdown_tracer_provider; use serde::{Deserialize, Serialize}; -use state_bridge::abi::{IBridgedWorldID, IStateBridge, IWorldIDIdentityManager}; -use state_bridge::bridge::StateBridge; -use state_bridge::StateBridgeService; use tracing::Level; +use world_tree::abi::{IBridgedWorldID, IStateBridge, IWorldIDIdentityManager}; #[derive(Parser, Debug)] #[clap( @@ -115,7 +115,8 @@ async fn spawn_state_bridge_service( relaying_period: Duration, block_confirmations: usize, ) -> eyre::Result<()> { - let provider = Provider::::try_from(rpc_url).expect("failed to initialize Http provider"); + let provider = Provider::::try_from(rpc_url) + .expect("failed to initialize Http provider"); let chain_id = provider.get_chainid().await?.as_u64(); @@ -123,12 +124,15 @@ async fn spawn_state_bridge_service( let wallet_address = wallet.address(); let signer_middleware = SignerMiddleware::new(provider, wallet); - let nonce_manager_middleware = NonceManagerMiddleware::new(signer_middleware, wallet_address); + let nonce_manager_middleware = + NonceManagerMiddleware::new(signer_middleware, wallet_address); let middleware = Arc::new(nonce_manager_middleware); - let world_id_interface = IWorldIDIdentityManager::new(world_id_address, middleware.clone()); + let world_id_interface = + IWorldIDIdentityManager::new(world_id_address, middleware.clone()); - let mut state_bridge_service = StateBridgeService::new(world_id_interface).await?; + let mut state_bridge_service = + StateBridgeService::new(world_id_interface).await?; for bridge_config in bridge_configs { let BridgeConfig { @@ -149,14 +153,19 @@ async fn spawn_state_bridge_service( .with_chain_id(chain_id); let wallet_address = wallet.address(); - let bridged_middleware = SignerMiddleware::new(bridged_provider, wallet); - let bridged_middleware = NonceManagerMiddleware::new(bridged_middleware, wallet_address); + let bridged_middleware = + SignerMiddleware::new(bridged_provider, wallet); + let bridged_middleware = + NonceManagerMiddleware::new(bridged_middleware, wallet_address); let bridged_middleware = Arc::new(bridged_middleware); - let state_bridge_interface = IStateBridge::new(state_bridge_address, middleware.clone()); + let state_bridge_interface = + IStateBridge::new(state_bridge_address, middleware.clone()); - let bridged_world_id_interface = - IBridgedWorldID::new(bridged_world_id_address, bridged_middleware.clone()); + let bridged_world_id_interface = IBridgedWorldID::new( + bridged_world_id_address, + bridged_middleware.clone(), + ); let state_bridge = StateBridge::new( state_bridge_interface, diff --git a/src/state_bridge/mod.rs b/src/state_bridge/mod.rs index 9f58c146..a9027946 100644 --- a/src/state_bridge/mod.rs +++ b/src/state_bridge/mod.rs @@ -85,9 +85,8 @@ impl StateBridge { /// # Arguments /// /// * `root_rx` - Receiver channel for roots from `WorldRoot`. - #[allow(clippy::async_yields_async)] #[instrument(skip(self, root_rx))] - pub async fn spawn( + pub fn spawn( &self, mut root_rx: tokio::sync::broadcast::Receiver, ) -> JoinHandle>> { diff --git a/src/state_bridge/service.rs b/src/state_bridge/service.rs index 448d7c32..5f2d797d 100644 --- a/src/state_bridge/service.rs +++ b/src/state_bridge/service.rs @@ -1,18 +1,20 @@ use std::sync::Arc; -use ethers::providers::Middleware; +use ethers::providers::{Middleware, StreamExt}; use ethers::types::H160; +use ruint::Uint; use tokio::task::JoinHandle; +use tracing::instrument; use super::error::StateBridgeError; use super::StateBridge; -use crate::abi::IWorldIDIdentityManager; +use crate::abi::{IWorldIDIdentityManager, TreeChangedFilter}; +use crate::tree::Hash; -//TODO: we dont need this root field and we can spawn the root logic so that this doesnt need to be here, we can simplify this service /// Monitors the world tree root for changes and propagates new roots to target Layer 2s pub struct StateBridgeService { - /// Local state of the world tree root, responsible for listening to TreeChanged events from the`WorldIDIdentityManager`. - pub canonical_root: WorldTreeRoot, + /// Monitors `TreeChanged` events from `WorldIDIdentityManager` and broadcasts new roots to through the `root_tx`. + pub world_id_identity_manager: IWorldIDIdentityManager, /// Vec of `StateBridge`, responsible for root propagation to target Layer 2s. pub state_bridges: Vec>, } @@ -22,23 +24,15 @@ where M: Middleware, { pub async fn new( - world_tree: IWorldIDIdentityManager, - ) -> Result> { - Ok(Self { - canonical_root: WorldTreeRoot::new(world_tree).await?, - state_bridges: vec![], - }) - } - - pub async fn new_from_parts( world_tree_address: H160, middleware: Arc, ) -> Result> { - let world_tree = - IWorldIDIdentityManager::new(world_tree_address, middleware); - + let world_id_identity_manager = IWorldIDIdentityManager::new( + world_tree_address, + middleware.clone(), + ); Ok(Self { - canonical_root: WorldTreeRoot::new(world_tree).await?, + world_id_identity_manager, state_bridges: vec![], }) } @@ -50,18 +44,18 @@ where /// Spawns the `WorldTreeRoot` task which will listen to changes to the `WorldIDIdentityManager` /// [merkle tree root](https://github.com/worldcoin/world-id-contracts/blob/852790da8f348d6a2dbb58d1e29123a644f4aece/src/WorldIDIdentityManagerImplV1.sol#L63). - #[allow(clippy::async_yields_async)] #[instrument(skip(self))] - pub async fn spawn_listener( + pub fn listen_for_new_roots( &self, + root_tx: tokio::sync::broadcast::Sender, ) -> JoinHandle>> { - let root_tx = self.root_tx.clone(); let world_id_identity_manager = self.world_id_identity_manager.clone(); let world_id_identity_manager_address = world_id_identity_manager.address(); tracing::info!(?world_id_identity_manager_address, "Spawning root"); + let root_tx_clone = root_tx.clone(); tokio::spawn(async move { // Event emitted when insertions or deletions are made to the tree let filter = world_id_identity_manager.event::(); @@ -72,7 +66,7 @@ where while let Some(Ok((event, _))) = event_stream.next().await { let new_root = event.post_root.0; tracing::info!(?new_root, "New root from chain"); - root_tx.send(Uint::from_limbs(event.post_root.0))?; + root_tx_clone.send(Uint::from_limbs(event.post_root.0))?; } Ok(()) @@ -80,7 +74,7 @@ where } /// Spawns the `StateBridgeService`. - pub async fn spawn( + pub fn spawn( &mut self, ) -> Result< Vec>>>, @@ -90,16 +84,15 @@ where return Err(StateBridgeError::BridgesNotInitialized); } - let mut handles = vec![]; + let (root_tx, _) = tokio::sync::broadcast::channel::(1000); + let mut handles = vec![]; // Bridges are spawned before the root so that the broadcast channel has active subscribers before the sender is spawned to avoid a SendError for bridge in self.state_bridges.iter() { - handles.push( - bridge.spawn(self.canonical_root.root_tx.subscribe()).await, - ); + handles.push(bridge.spawn(root_tx.subscribe())); } - handles.push(self.canonical_root.spawn().await); + handles.push(self.listen_for_new_roots(root_tx)); Ok(handles) } diff --git a/src/tree/service/mod.rs b/src/tree/service/mod.rs index 31f03aa8..6aa37bc7 100644 --- a/src/tree/service/mod.rs +++ b/src/tree/service/mod.rs @@ -79,7 +79,7 @@ impl TreeAvailabilityService { /// # Returns /// /// Vector of `JoinHandle`s for the spawned tasks. - pub async fn serve( + pub fn serve( self, port: u16, ) -> Vec>>> { From 6e1b4612c9d87870d5fa2b053ef3ba765d5906e0 Mon Sep 17 00:00:00 2001 From: 0xKitsune <0xKitsune@protonmail.com> Date: Wed, 8 Nov 2023 09:01:04 -0500 Subject: [PATCH 3/7] updating state bridge service binary --- bin/state_bridge_service.rs | 59 +++++++++++++++++++------------- bin/tree_availability_service.rs | 5 ++- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/bin/state_bridge_service.rs b/bin/state_bridge_service.rs index 7663037a..d12abd08 100644 --- a/bin/state_bridge_service.rs +++ b/bin/state_bridge_service.rs @@ -17,6 +17,8 @@ use opentelemetry::global::shutdown_tracer_provider; use serde::{Deserialize, Serialize}; use tracing::Level; use world_tree::abi::{IBridgedWorldID, IStateBridge, IWorldIDIdentityManager}; +use world_tree::state_bridge::service::StateBridgeService; +use world_tree::state_bridge::StateBridge; #[derive(Parser, Debug)] #[clap( @@ -128,11 +130,12 @@ async fn spawn_state_bridge_service( NonceManagerMiddleware::new(signer_middleware, wallet_address); let middleware = Arc::new(nonce_manager_middleware); - let world_id_interface = - IWorldIDIdentityManager::new(world_id_address, middleware.clone()); - let mut state_bridge_service = - StateBridgeService::new(world_id_interface).await?; + StateBridgeService::new(world_id_address, middleware).await?; + + let wallet = private_key + .parse::() + .expect("couldn't instantiate wallet from private key"); for bridge_config in bridge_configs { let BridgeConfig { @@ -142,29 +145,15 @@ async fn spawn_state_bridge_service( .. } = bridge_config; - let bridged_provider = Provider::::try_from(bridged_rpc_url) - .expect("failed to initialize Http provider"); - - let chain_id = bridged_provider.get_chainid().await?.as_u64(); - - let wallet = private_key - .parse::() - .expect("couldn't instantiate wallet from private key") - .with_chain_id(chain_id); - let wallet_address = wallet.address(); - - let bridged_middleware = - SignerMiddleware::new(bridged_provider, wallet); - let bridged_middleware = - NonceManagerMiddleware::new(bridged_middleware, wallet_address); - let bridged_middleware = Arc::new(bridged_middleware); + let l2_middleware = + initialize_l2_middleware(&bridged_rpc_url, wallet.clone()).await?; let state_bridge_interface = - IStateBridge::new(state_bridge_address, middleware.clone()); + IStateBridge::new(state_bridge_address, l2_middleware.clone()); let bridged_world_id_interface = IBridgedWorldID::new( bridged_world_id_address, - bridged_middleware.clone(), + l2_middleware.clone(), ); let state_bridge = StateBridge::new( @@ -178,12 +167,36 @@ async fn spawn_state_bridge_service( } tracing::info!("Spawning state bridge service"); - let handles = state_bridge_service.spawn().await?; + let handles = state_bridge_service.spawn()?; let mut handles = handles.into_iter().collect::>(); while let Some(result) = handles.next().await { + tracing::error!("StateBridgeError: {:?}", result); + result??; } Ok(()) } + +pub async fn initialize_l2_middleware( + l2_rpc_endpoint: &str, + wallet: LocalWallet, +) -> eyre::Result< + Arc, LocalWallet>>>, +> { + let l2_provider = Provider::::try_from(l2_rpc_endpoint)?; + let chain_id = l2_provider.get_chainid().await?.as_u64(); + + let wallet = wallet.with_chain_id(chain_id); + let wallet_address = wallet.address(); + + let signer_middleware = SignerMiddleware::new(l2_provider, wallet); + + let nonce_manager_middleware = + NonceManagerMiddleware::new(signer_middleware, wallet_address); + + let l2_middleware = Arc::new(nonce_manager_middleware); + + Ok(l2_middleware) +} diff --git a/bin/tree_availability_service.rs b/bin/tree_availability_service.rs index 5f5466eb..0d684fbf 100644 --- a/bin/tree_availability_service.rs +++ b/bin/tree_availability_service.rs @@ -9,7 +9,7 @@ use ethers::types::H160; use futures::stream::FuturesUnordered; use futures::StreamExt; use tracing::Level; -use tree_availability::TreeAvailabilityService; +use world_tree::tree::service::TreeAvailabilityService; #[derive(Parser, Debug)] #[clap( @@ -79,8 +79,7 @@ pub async fn main() -> eyre::Result<()> { opts.window_size, middleware, ) - .serve(opts.port) - .await; + .serve(opts.port); let mut handles = handles.into_iter().collect::>(); while let Some(result) = handles.next().await { From 3df561aef5c39dc0135bc47446849cc3efe41ebd Mon Sep 17 00:00:00 2001 From: 0xKitsune <0xKitsune@protonmail.com> Date: Wed, 8 Nov 2023 09:03:32 -0500 Subject: [PATCH 4/7] fixing tests --- tests/bridge_service.rs | 42 ++++++++++++++++++++-------------------- tests/inclusion_proof.rs | 21 ++++++++++++-------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/tests/bridge_service.rs b/tests/bridge_service.rs index 6432b15c..248f4214 100644 --- a/tests/bridge_service.rs +++ b/tests/bridge_service.rs @@ -8,21 +8,21 @@ pub use ethers::core::abi::Abi; pub use ethers::core::k256::ecdsa::SigningKey; pub use ethers::core::rand; pub use ethers::prelude::{ - ContractFactory, Http, LocalWallet, NonceManagerMiddleware, Provider, Signer, SignerMiddleware, - Wallet, + ContractFactory, Http, LocalWallet, NonceManagerMiddleware, Provider, + Signer, SignerMiddleware, Wallet, }; pub use ethers::providers::{Middleware, StreamExt}; pub use ethers::types::{Bytes, H256, U256}; pub use ethers::utils::{Anvil, AnvilInstance}; pub use serde::{Deserialize, Serialize}; pub use serde_json::json; -use state_bridge::abi::{IBridgedWorldID, IStateBridge, IWorldIDIdentityManager}; -use state_bridge::bridge::StateBridge; -use state_bridge::error::StateBridgeError; -use state_bridge::StateBridgeService; pub use tokio::spawn; pub use tokio::task::JoinHandle; pub use tracing::{error, info, instrument}; +use world_tree::abi::{IBridgedWorldID, IStateBridge, IWorldIDIdentityManager}; +use world_tree::state_bridge::error::StateBridgeError; +use world_tree::state_bridge::service::StateBridgeService; +use world_tree::state_bridge::StateBridge; // test that spawns a mock anvil chain, deploys world id contracts, instantiates a `StateBridgeService` // and propagates a root in order to see if the `StateBridgeService` works as intended. @@ -40,21 +40,22 @@ pub async fn test_relay_root() -> eyre::Result<()> { let relaying_period = std::time::Duration::from_secs(5); - let world_id = IWorldIDIdentityManager::new(mock_world_id.address(), middleware.clone()); - mock_state_bridge.propagate_root().send().await?.await?; let state_bridge_address = mock_state_bridge.address(); let bridged_world_id_address = mock_bridged_world_id.address(); - let mut state_bridge_service = StateBridgeService::new(world_id) - .await - .expect("couldn't create StateBridgeService"); + let mut state_bridge_service = + StateBridgeService::new(mock_world_id.address(), middleware.clone()) + .await + .expect("couldn't create StateBridgeService"); - let state_bridge = IStateBridge::new(state_bridge_address, middleware.clone()); + let state_bridge = + IStateBridge::new(state_bridge_address, middleware.clone()); - let bridged_world_id = IBridgedWorldID::new(bridged_world_id_address, middleware.clone()); + let bridged_world_id = + IBridgedWorldID::new(bridged_world_id_address, middleware.clone()); let block_confirmations: usize = 6usize; @@ -70,10 +71,10 @@ pub async fn test_relay_root() -> eyre::Result<()> { state_bridge_service .spawn() - .await .expect("failed to spawn a state bridge service"); - let latest_root = U256::from_str("0x12312321321").expect("couldn't parse hexstring"); + let latest_root = + U256::from_str("0x12312321321").expect("couldn't parse hexstring"); mock_world_id.insert_root(latest_root).send().await?.await?; @@ -114,13 +115,12 @@ pub async fn test_no_state_bridge_relay_fails() -> eyre::Result<()> { .. } = spawn_mock_chain().await?; - let world_id = IWorldIDIdentityManager::new(mock_world_id.address(), middleware.clone()); - - let mut state_bridge_service = StateBridgeService::new(world_id) - .await - .expect("couldn't create StateBridgeService"); + let mut state_bridge_service = + StateBridgeService::new(mock_world_id.address(), middleware.clone()) + .await + .expect("couldn't create StateBridgeService"); - let error = state_bridge_service.spawn().await.unwrap_err(); + let error = state_bridge_service.spawn().unwrap_err(); assert!( matches!(error, StateBridgeError::BridgesNotInitialized), diff --git a/tests/inclusion_proof.rs b/tests/inclusion_proof.rs index 0241359b..2e718f93 100644 --- a/tests/inclusion_proof.rs +++ b/tests/inclusion_proof.rs @@ -6,11 +6,14 @@ use ethers::types::U256; use futures::stream::FuturesUnordered; use futures::StreamExt; use hyper::StatusCode; -use tree_availability::error::TreeAvailabilityError; -use tree_availability::server::{InclusionProof, InclusionProofRequest}; -use tree_availability::world_tree::tree_updater::pack_indices; -use tree_availability::world_tree::Hash; -use tree_availability::TreeAvailabilityService; +use world_tree::tree::error::TreeAvailabilityError; +use world_tree::tree::service::{ + InclusionProofRequest, TreeAvailabilityService, +}; +use world_tree::tree::tree_data::InclusionProof; +use world_tree::tree::tree_updater::pack_indices; +use world_tree::tree::Hash; + #[tokio::test] async fn test_inclusion_proof() -> eyre::Result<()> { // Initialize a new mock tree @@ -22,9 +25,11 @@ async fn test_inclusion_proof() -> eyre::Result<()> { } = spawn_mock_chain().await?; // Register identities - let identity_commitments = vec![U256::from(1), U256::from(2), U256::from(3)]; + let identity_commitments = + vec![U256::from(1), U256::from(2), U256::from(3)]; - let world_tree_creation_block = middleware.get_block_number().await?.as_u64() - 1; + let world_tree_creation_block = + middleware.get_block_number().await?.as_u64() - 1; mock_world_id .register_identities( @@ -66,7 +71,7 @@ async fn test_inclusion_proof() -> eyre::Result<()> { // Spawn the service in a separate task let server_handle = tokio::spawn(async move { - let handles = tree_availability_service.serve(8080).await; + let handles = tree_availability_service.serve(8080); let mut handles = handles.into_iter().collect::>(); while let Some(result) = handles.next().await { From 4251762437826c68cd5abfb85df4d6bf757109e9 Mon Sep 17 00:00:00 2001 From: 0xKitsune <0xKitsune@protonmail.com> Date: Wed, 8 Nov 2023 09:13:27 -0500 Subject: [PATCH 5/7] moved axum middleware to separate crate --- Cargo.lock | 15 +++++++++++++-- Cargo.toml | 3 +-- crates/axum_middleware/Cargo.toml | 12 ++++++++++++ crates/axum_middleware/src/lib.rs | 1 + .../axum_middleware/src/logging.rs | 0 src/tree/{service/mod.rs => service.rs} | 5 ++--- 6 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 crates/axum_middleware/Cargo.toml create mode 100644 crates/axum_middleware/src/lib.rs rename src/tree/service/logging_middleware.rs => crates/axum_middleware/src/logging.rs (100%) rename src/tree/{service/mod.rs => service.rs} (98%) diff --git a/Cargo.lock b/Cargo.lock index b31945d1..94c1c08d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -526,6 +526,18 @@ dependencies = [ "tower-service", ] +[[package]] +name = "axum-middleware" +version = "0.1.0" +dependencies = [ + "axum", + "bytes", + "common", + "futures-util", + "hyper", + "tracing", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -6027,13 +6039,12 @@ version = "0.1.0" dependencies = [ "anyhow", "axum", - "bytes", + "axum-middleware", "clap 4.4.7", "common", "ethers", "eyre", "futures", - "futures-util", "hex", "hyper", "metrics", diff --git a/Cargo.toml b/Cargo.toml index 3fc459e0..bb855f7b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,8 +26,7 @@ hyper = { version = "^0.14.27", features = ["server", "tcp", "http1", "http2"] } metrics = "0.21.1" opentelemetry = "0.20.0" common = { path = "crates/common" } -bytes = "1.5.0" -futures-util = "0.3.29" +axum-middleware = {path = "crates/axum_middleware"} clap = {version = "4.4.7" , features = ["derive"]} toml = "0.8.8" diff --git a/crates/axum_middleware/Cargo.toml b/crates/axum_middleware/Cargo.toml new file mode 100644 index 00000000..a155c278 --- /dev/null +++ b/crates/axum_middleware/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "axum-middleware" +version = "0.1.0" +edition = "2021" + +[dependencies] +tracing = "0.1.40" +axum = "0.6.20" +hyper = { version = "^0.14.27", features = ["server", "tcp", "http1", "http2"] } +bytes = "1.5.0" +futures-util = "0.3.29" +common = { path = "../common" } diff --git a/crates/axum_middleware/src/lib.rs b/crates/axum_middleware/src/lib.rs new file mode 100644 index 00000000..31348d2f --- /dev/null +++ b/crates/axum_middleware/src/lib.rs @@ -0,0 +1 @@ +pub mod logging; diff --git a/src/tree/service/logging_middleware.rs b/crates/axum_middleware/src/logging.rs similarity index 100% rename from src/tree/service/logging_middleware.rs rename to crates/axum_middleware/src/logging.rs diff --git a/src/tree/service/mod.rs b/src/tree/service.rs similarity index 98% rename from src/tree/service/mod.rs rename to src/tree/service.rs index 6aa37bc7..fae53018 100644 --- a/src/tree/service/mod.rs +++ b/src/tree/service.rs @@ -1,5 +1,3 @@ -pub mod logging_middleware; - use std::net::{IpAddr, Ipv4Addr, SocketAddr}; use std::sync::atomic::Ordering; use std::sync::Arc; @@ -8,6 +6,7 @@ use axum::extract::State; use axum::http::StatusCode; use axum::response::IntoResponse; use axum::{middleware, Json}; +use axum_middleware::logging; use ethers::providers::Middleware; use ethers::types::H160; use semaphore::lazy_merkle_tree::Canonical; @@ -91,7 +90,7 @@ impl TreeAvailabilityService { let router = axum::Router::new() .route("/inclusionProof", axum::routing::post(inclusion_proof)) .route("/synced", axum::routing::post(synced)) - .layer(middleware::from_fn(logging_middleware::middleware)) + .layer(middleware::from_fn(logging::middleware)) .with_state(self.world_tree.clone()); let address = From 24d329a564ae10369c55bb748905283615c94c86 Mon Sep 17 00:00:00 2001 From: 0xKitsune <0xKitsune@protonmail.com> Date: Wed, 8 Nov 2023 09:14:20 -0500 Subject: [PATCH 6/7] cargo clippy --- bin/state_bridge_service.rs | 2 +- src/state_bridge/error.rs | 2 -- src/tree/block_scanner.rs | 10 ++++++++-- src/tree/error.rs | 2 -- src/tree/service.rs | 6 +----- tests/bridge_service.rs | 2 +- 6 files changed, 11 insertions(+), 13 deletions(-) diff --git a/bin/state_bridge_service.rs b/bin/state_bridge_service.rs index d12abd08..e62334da 100644 --- a/bin/state_bridge_service.rs +++ b/bin/state_bridge_service.rs @@ -16,7 +16,7 @@ use futures::StreamExt; use opentelemetry::global::shutdown_tracer_provider; use serde::{Deserialize, Serialize}; use tracing::Level; -use world_tree::abi::{IBridgedWorldID, IStateBridge, IWorldIDIdentityManager}; +use world_tree::abi::{IBridgedWorldID, IStateBridge}; use world_tree::state_bridge::service::StateBridgeService; use world_tree::state_bridge::StateBridge; diff --git a/src/state_bridge/error.rs b/src/state_bridge/error.rs index 5db0d995..a701c9bb 100644 --- a/src/state_bridge/error.rs +++ b/src/state_bridge/error.rs @@ -1,8 +1,6 @@ use ethers::prelude::{AbiError, ContractError}; use ethers::providers::{Middleware, ProviderError}; -use ethers::types::Log; use thiserror::Error; -use tokio::sync::mpsc::error::SendError; use crate::tree::Hash; diff --git a/src/tree/block_scanner.rs b/src/tree/block_scanner.rs index b1bf59d3..99a2789e 100644 --- a/src/tree/block_scanner.rs +++ b/src/tree/block_scanner.rs @@ -1,7 +1,9 @@ use std::sync::atomic::{AtomicU64, Ordering}; use ethers::providers::Middleware; -use ethers::types::{Address, BlockNumber, Filter, FilterBlockOption, Log, Topic, ValueOrArray}; +use ethers::types::{ + Address, BlockNumber, Filter, FilterBlockOption, Log, Topic, ValueOrArray, +}; /// The `BlockScanner` utility tool enables allows parsing arbitrary onchain events pub struct BlockScanner { @@ -18,7 +20,11 @@ where M: Middleware, { /// Initializes a new `BlockScanner` - pub const fn new(middleware: M, window_size: u64, current_block: u64) -> Self { + pub const fn new( + middleware: M, + window_size: u64, + current_block: u64, + ) -> Self { Self { middleware, last_synced_block: AtomicU64::new(current_block), diff --git a/src/tree/error.rs b/src/tree/error.rs index ff4af3ce..4a653f7b 100644 --- a/src/tree/error.rs +++ b/src/tree/error.rs @@ -4,8 +4,6 @@ use ethers::types::Log; use thiserror::Error; use tokio::sync::mpsc::error::SendError; -use crate::tree::Hash; - #[derive(Error, Debug)] pub enum TreeAvailabilityError where diff --git a/src/tree/service.rs b/src/tree/service.rs index fae53018..80dd3d27 100644 --- a/src/tree/service.rs +++ b/src/tree/service.rs @@ -10,11 +10,7 @@ use axum_middleware::logging; use ethers::providers::Middleware; use ethers::types::H160; use semaphore::lazy_merkle_tree::Canonical; -use semaphore::poseidon_tree::{Branch, Proof}; -use semaphore::Field; -use serde::de::Error; -use serde::{Deserialize, Deserializer, Serialize}; -use serde_json::Value; +use serde::{Deserialize, Serialize}; use tokio::task::JoinHandle; use super::error::{TreeAvailabilityError, TreeError}; diff --git a/tests/bridge_service.rs b/tests/bridge_service.rs index 248f4214..20123d25 100644 --- a/tests/bridge_service.rs +++ b/tests/bridge_service.rs @@ -19,7 +19,7 @@ pub use serde_json::json; pub use tokio::spawn; pub use tokio::task::JoinHandle; pub use tracing::{error, info, instrument}; -use world_tree::abi::{IBridgedWorldID, IStateBridge, IWorldIDIdentityManager}; +use world_tree::abi::{IBridgedWorldID, IStateBridge}; use world_tree::state_bridge::error::StateBridgeError; use world_tree::state_bridge::service::StateBridgeService; use world_tree::state_bridge::StateBridge; From 319b9538f789c8c75f7f704b9b9d5bdfc1d3feab Mon Sep 17 00:00:00 2001 From: 0xKitsune <0xKitsune@protonmail.com> Date: Wed, 8 Nov 2023 09:42:09 -0500 Subject: [PATCH 7/7] cargo sort --- Cargo.toml | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bb855f7b..550b5168 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,14 +2,21 @@ name = "world-tree" version = "0.1.0" edition = "2021" - # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] anyhow = "1.0.75" +axum = "0.6.20" +axum-middleware = { path = "crates/axum_middleware" } +clap = { version = "4.4.7", features = ["derive"] } +common = { path = "crates/common" } ethers = { version = "2.0.10", features = ["abigen", "ws", "ipc", "rustls", "openssl"] } eyre = "0.6.8" +futures = "0.3.28" hex = "0.4.3" +hyper = { version = "^0.14.27", features = ["server", "tcp", "http1", "http2"] } +metrics = "0.21.1" +opentelemetry = "0.20.0" ruint = "1.10.1" semaphore = { git = "https://github.com/worldcoin/semaphore-rs", branch = "main", features = [ "depth_20", @@ -19,21 +26,12 @@ serde_json = "1.0.107" take_mut = "0.2.2" thiserror = "1.0.49" tokio = { version = "1.32.0", features = ["sync", "macros"] } -tracing = "0.1.37" -axum = "0.6.20" -futures = "0.3.28" -hyper = { version = "^0.14.27", features = ["server", "tcp", "http1", "http2"] } -metrics = "0.21.1" -opentelemetry = "0.20.0" -common = { path = "crates/common" } -axum-middleware = {path = "crates/axum_middleware"} -clap = {version = "4.4.7" , features = ["derive"]} toml = "0.8.8" +tracing = "0.1.37" [dev-dependencies] reqwest = { version = "0.11.22", features = ["json"] } - [[bin]] name = "tree-availability-service" path = "bin/tree_availability_service.rs"