From 7dba8251820c9148f9b8a54e5314544055af1022 Mon Sep 17 00:00:00 2001 From: JinHwan Date: Mon, 11 Dec 2023 16:36:07 +0900 Subject: [PATCH] Orchestrator, Executor and Executor Spawners (#3) * feat: initial orchestrator struct with simple test code * feat: orchestrator, executor and executor spawner * feat: added basic test cases * chore: remove unused csv files * fix: use default csv file on test * fix: test cases * feat: error handling with cancellation * feat: created mock spawner and added more test cases * chore: cancel when occur error * chore: Update README * chore: renamed spanwers and small updates on README * fix: warnings; Update README * chore: update README with diagram * fix: refactor; updated README * fix: assign unused port on mock server * feat: finish cloud spawner * feat: added test case for CloudSpawner; Update README * feat: added aggregation example * fix: clippy; feature flag to use nightly in example * fix: applied latest v1 improvement * fix: example; README * fix: retrieving preimage from sibling mini tree on AggregationMerkleSumTree * fix: example; updated README * fix: more error handling; added retry on executor * chore: added description as in-line comments * fix: update README for mini tree server; removed some part on main README * chore: update README and added description as in-line * fix: latest v1; minor changes on comments * chore: update README; move csv folder to root * fix: return a ref of empty array on un-intended fn on AggregationMerkleSumTree * fix: the container now using unused port on host * fix: applied latest v1-improvement; updated README; fixed minor --- .github/workflows/rust.yml | 23 ++ Cargo.lock | 574 ++++++++++++++++++++--------- Cargo.toml | 14 +- Orchestrator-diagram.png | Bin 0 -> 111722 bytes README.md | 173 ++++----- bin/README.md | 77 ++++ bin/mini_tree_server.rs | 83 +---- csv/entry_16.csv | 17 + csv/entry_16_1.csv | 17 + csv/entry_16_2.csv | 17 + csv/entry_16_3.csv | 17 + csv/entry_16_4.csv | 17 + csv/entry_16_no_overflow.csv | 17 + csv/entry_64.csv | 65 ++++ docker-compose.yml | 20 + examples/aggregation_flow.rs | 106 ++++++ examples/hermez-raw-11 | Bin 0 -> 262404 bytes scripts/test_sending_entry.sh | 27 +- src/aggregation_merkle_sum_tree.rs | 198 ++++++---- src/data/entry_16_1.csv | 17 - src/data/entry_16_2.csv | 17 - src/data/entry_16_3.csv | 17 - src/executor/cloud_spawner.rs | 188 ++++++++++ src/executor/local_spawner.rs | 214 +++++++++++ src/executor/mock_spawner.rs | 114 ++++++ src/executor/mod.rs | 87 +++++ src/executor/spawner.rs | 70 ++++ src/executor/test.rs | 80 ++++ src/executor/utils.rs | 159 ++++++++ src/json_mst.rs | 175 +++++++++ src/lib.rs | 5 +- src/mini_tree_generator.rs | 61 +++ src/orchestrator/mod.rs | 258 +++++++++++++ src/orchestrator/test.rs | 106 ++++++ 34 files changed, 2564 insertions(+), 466 deletions(-) create mode 100644 .github/workflows/rust.yml create mode 100644 Orchestrator-diagram.png create mode 100644 bin/README.md create mode 100644 csv/entry_16.csv create mode 100644 csv/entry_16_1.csv create mode 100644 csv/entry_16_2.csv create mode 100644 csv/entry_16_3.csv create mode 100644 csv/entry_16_4.csv create mode 100644 csv/entry_16_no_overflow.csv create mode 100644 csv/entry_64.csv create mode 100644 docker-compose.yml create mode 100644 examples/aggregation_flow.rs create mode 100644 examples/hermez-raw-11 delete mode 100644 src/data/entry_16_1.csv delete mode 100644 src/data/entry_16_2.csv delete mode 100644 src/data/entry_16_3.csv create mode 100644 src/executor/cloud_spawner.rs create mode 100644 src/executor/local_spawner.rs create mode 100644 src/executor/mock_spawner.rs create mode 100644 src/executor/mod.rs create mode 100644 src/executor/spawner.rs create mode 100644 src/executor/test.rs create mode 100644 src/executor/utils.rs create mode 100644 src/json_mst.rs create mode 100644 src/mini_tree_generator.rs create mode 100644 src/orchestrator/mod.rs create mode 100644 src/orchestrator/test.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..f7ffac5 --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,23 @@ +name: Aggregation Test + +on: + push: + branches: ["*"] + pull_request: + branches: ["*"] + +env: + CARGO_TERM_COLOR: always + +jobs: + build-and-test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Pull mini-tree image + run: docker pull summadev/summa-aggregation-mini-tree:latest + + - name: Run tests + run: cargo test --features docker diff --git a/Cargo.lock b/Cargo.lock index f432263..fbf3065 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -114,6 +114,21 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.75" @@ -408,7 +423,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ "block-padding", - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -417,7 +432,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -454,6 +469,46 @@ dependencies = [ "subtle", ] +[[package]] +name = "bollard" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f03db470b3c0213c47e978da93200259a1eb4dae2e5512cba9955e2b540a6fc6" +dependencies = [ + "base64 0.21.5", + "bollard-stubs", + "bytes", + "futures-core", + "futures-util", + "hex", + "http", + "hyper", + "hyperlocal", + "log", + "pin-project-lite", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "serde_urlencoded", + "thiserror", + "tokio", + "tokio-util", + "url", + "winapi", +] + +[[package]] +name = "bollard-stubs" +version = "1.43.0-rc.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58071e8fd9ec1e930efd28e3a90c1251015872a2ce49f81f36421b86466932e" +dependencies = [ + "serde", + "serde_repr", + "serde_with", +] + [[package]] name = "bs58" version = "0.5.0" @@ -502,18 +557,18 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12024c4645c97566567129c204f65d5815a8c9aecf30fcbe682b2fe034996d36" +checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" -version = "0.17.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", @@ -544,7 +599,11 @@ version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ + "android-tzdata", + "iana-time-zone", "num-traits", + "serde", + "windows-targets 0.48.5", ] [[package]] @@ -599,7 +658,7 @@ dependencies = [ "bech32", "bs58", "digest 0.10.7", - "generic-array", + "generic-array 0.14.7", "hex", "ripemd", "serde", @@ -617,7 +676,7 @@ checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" dependencies = [ "is-terminal", "lazy_static", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -679,9 +738,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -689,9 +748,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.4" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" @@ -762,11 +821,11 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "crypto-bigint" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f85c3514d2a6e64160359b45a3918c3b4178bcbf4ae5d03ab2d02e521c479a" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ - "generic-array", + "generic-array 0.14.7", "rand_core 0.6.4", "subtle", "zeroize", @@ -778,7 +837,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ - "generic-array", + "generic-array 0.14.7", "typenum", ] @@ -824,11 +883,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -856,7 +916,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -899,7 +959,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -962,9 +1022,9 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.16.8" +version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", "digest 0.10.7", @@ -982,15 +1042,15 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "elliptic-curve" -version = "0.13.6" +version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97ca172ae9dc9f9b779a6e3a65d308f2af74e5b8c921299075bdb4a0370e914" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", "digest 0.10.7", "ff", - "generic-array", + "generic-array 0.14.7", "group", "pkcs8", "rand_core 0.6.4", @@ -1054,12 +1114,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1134,9 +1194,9 @@ dependencies = [ [[package]] name = "ethers" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad13497f6e0a24292fc7b408e30d22fe9dc262da1f40d7b542c3a44e7fc0476" +checksum = "1a5344eea9b20effb5efeaad29418215c4d27017639fd1f908260f59cbbd226e" dependencies = [ "ethers-addressbook", "ethers-contract", @@ -1150,9 +1210,9 @@ dependencies = [ [[package]] name = "ethers-addressbook" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e9e8acd0ed348403cc73a670c24daba3226c40b98dc1a41903766b3ab6240a" +checksum = "8c405f24ea3a517899ba7985385c43dc4a7eb1209af3b1e0a1a32d7dcc7f8d09" dependencies = [ "ethers-core", "once_cell", @@ -1162,9 +1222,9 @@ dependencies = [ [[package]] name = "ethers-contract" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79269278125006bb0552349c03593ffa9702112ca88bc7046cc669f148fb47c" +checksum = "0111ead599d17a7bff6985fd5756f39ca7033edc79a31b23026a8d5d64fa95cd" dependencies = [ "const-hex", "ethers-contract-abigen", @@ -1181,9 +1241,9 @@ dependencies = [ [[package]] name = "ethers-contract-abigen" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce95a43c939b2e4e2f3191c5ad4a1f279780b8a39139c9905b43a7433531e2ab" +checksum = "51258120c6b47ea9d9bec0d90f9e8af71c977fbefbef8213c91bfed385fe45eb" dependencies = [ "Inflector", "const-hex", @@ -1203,9 +1263,9 @@ dependencies = [ [[package]] name = "ethers-contract-derive" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9ce44906fc871b3ee8c69a695ca7ec7f70e50cb379c9b9cb5e532269e492f6" +checksum = "936e7a0f1197cee2b62dc89f63eff3201dbf87c283ff7e18d86d38f83b845483" dependencies = [ "Inflector", "const-hex", @@ -1219,9 +1279,9 @@ dependencies = [ [[package]] name = "ethers-core" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0a17f0708692024db9956b31d7a20163607d2745953f5ae8125ab368ba280ad" +checksum = "2f03e0bdc216eeb9e355b90cf610ef6c5bb8aca631f97b5ae9980ce34ea7878d" dependencies = [ "arrayvec 0.7.4", "bytes", @@ -1230,7 +1290,7 @@ dependencies = [ "const-hex", "elliptic-curve", "ethabi", - "generic-array", + "generic-array 0.14.7", "k256", "num_enum", "once_cell", @@ -1249,10 +1309,11 @@ dependencies = [ [[package]] name = "ethers-etherscan" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e53451ea4a8128fbce33966da71132cf9e1040dcfd2a2084fd7733ada7b2045" +checksum = "abbac2c890bdbe0f1b8e549a53b00e2c4c1de86bb077c1094d1f38cdf9381a56" dependencies = [ + "chrono", "ethers-core", "ethers-solc", "reqwest", @@ -1265,15 +1326,14 @@ dependencies = [ [[package]] name = "ethers-middleware" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473f1ccd0c793871bbc248729fa8df7e6d2981d6226e4343e3bbaa9281074d5d" +checksum = "681ece6eb1d10f7cf4f873059a77c04ff1de4f35c63dd7bccde8f438374fcb93" dependencies = [ "async-trait", "auto_impl", "ethers-contract", "ethers-core", - "ethers-etherscan", "ethers-providers", "ethers-signers", "futures-channel", @@ -1292,9 +1352,9 @@ dependencies = [ [[package]] name = "ethers-providers" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6838fa110e57d572336178b7c79e94ff88ef976306852d8cb87d9e5b1fc7c0b5" +checksum = "25d6c0c9455d93d4990c06e049abf9b30daf148cf461ee939c11d88907c60816" dependencies = [ "async-trait", "auto_impl", @@ -1328,9 +1388,9 @@ dependencies = [ [[package]] name = "ethers-signers" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ea44bec930f12292866166f9ddbea6aa76304850e4d8dcd66dc492b43d00ff1" +checksum = "0cb1b714e227bbd2d8c53528adb580b203009728b17d0d0e4119353aa9bc5532" dependencies = [ "async-trait", "coins-bip32", @@ -1347,9 +1407,9 @@ dependencies = [ [[package]] name = "ethers-solc" -version = "2.0.10" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de34e484e7ae3cab99fbfd013d6c5dc7f9013676a4e0e414d8b12e1213e8b3ba" +checksum = "a64f710586d147864cff66540a6d64518b9ff37d73ef827fee430538265b595f" dependencies = [ "cfg-if", "const-hex", @@ -1378,29 +1438,29 @@ dependencies = [ [[package]] name = "execute" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d9a9ea4c04632c16bc5c71a2fcc63d308481f7fc67eb1a1ce6315c44a426ae" +checksum = "3a82608ee96ce76aeab659e9b8d3c2b787bffd223199af88c674923d861ada10" dependencies = [ "execute-command-macro", "execute-command-tokens", - "generic-array", + "generic-array 1.0.0", ] [[package]] name = "execute-command-macro" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5fbc65a0cf735106743f4c38c9a3671c1e734b5c2c20d21a3c93c696daa3157" +checksum = "90dec53d547564e911dc4ff3ecb726a64cf41a6fa01a2370ebc0d95175dd08bd" dependencies = [ "execute-command-macro-impl", ] [[package]] name = "execute-command-macro-impl" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55a9a55d1dab3b07854648d48e366f684aefe2ac78ae28cec3bf65e3cd53d9a3" +checksum = "ce8cd46a041ad005ab9c71263f9a0ff5b529eac0fe4cc9b4a20f4f0765d8cf4b" dependencies = [ "execute-command-tokens", "quote", @@ -1409,15 +1469,15 @@ dependencies = [ [[package]] name = "execute-command-tokens" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ba569491c70ec8471e34aa7e9c0b9e82bb5d2464c0398442d17d3c4af814e5a" +checksum = "69dc321eb6be977f44674620ca3aa21703cb20ffbe560e1ae97da08401ffbcad" [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "80f656be11ddf91bd709454d15d5bd896fbaf4cc3314e69349e4d1569f5b46cd" dependencies = [ "indenter", "once_cell", @@ -1544,9 +1604,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1692,6 +1752,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "generic-array" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe739944a5406424e080edccb6add95685130b9f160d5407c639c7df0c5836b0" +dependencies = [ + "typenum", +] + [[package]] name = "getrandom" version = "0.2.11" @@ -1707,9 +1776,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "glob" @@ -1744,9 +1813,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -1754,7 +1823,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -1854,9 +1923,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ "ahash", "allocator-api2", @@ -1919,14 +1988,14 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -1993,11 +2062,47 @@ dependencies = [ "tokio-native-tls", ] +[[package]] +name = "hyperlocal" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c" +dependencies = [ + "futures-util", + "hex", + "hyper", + "pin-project", + "tokio", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2055,6 +2160,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -2064,7 +2170,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", + "serde", ] [[package]] @@ -2073,7 +2180,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "generic-array", + "generic-array 0.14.7", ] [[package]] @@ -2112,7 +2219,7 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2159,9 +2266,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -2182,9 +2289,9 @@ dependencies = [ [[package]] name = "k256" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +checksum = "3f01b677d82ef7a676aa37e099defd83a28e15687112cafdd112d60236b6115b" dependencies = [ "cfg-if", "ecdsa", @@ -2265,9 +2372,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" @@ -2361,7 +2468,7 @@ checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2393,7 +2500,7 @@ dependencies = [ "blstrs", "byteorder", "ff", - "generic-array", + "generic-array 0.14.7", "itertools 0.8.2", "log", "pasta_curves", @@ -2444,7 +2551,7 @@ dependencies = [ "digest 0.10.7", "ff", "flate2", - "generic-array", + "generic-array 0.14.7", "getrandom", "halo2curves 0.1.0", "itertools 0.11.0", @@ -2643,9 +2750,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.59" +version = "0.10.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" +checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -2675,9 +2782,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.95" +version = "0.9.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" +checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" dependencies = [ "cc", "libc", @@ -2702,9 +2809,9 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec 0.7.4", "bitvec", @@ -2716,11 +2823,11 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ - "proc-macro-crate 1.3.1", + "proc-macro-crate 2.0.0", "proc-macro2", "quote", "syn 1.0.109", @@ -2746,7 +2853,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -2821,9 +2928,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" @@ -3050,9 +3157,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -3324,7 +3431,7 @@ dependencies = [ "bitflags 2.4.1", "bitvec", "enumn", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "hex", ] @@ -3386,9 +3493,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "724fd11728a3804e9944b14cab63825024c40bf42f8af87c8b5d97c4bbacf426" +checksum = "608a5726529f2f0ef81b8fde9873c4bb829d6b5b5ca6be4d97345ddf0749c825" dependencies = [ "alloy-rlp", "proptest", @@ -3428,15 +3535,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" dependencies = [ "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -3499,7 +3606,7 @@ version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3528,7 +3635,7 @@ checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ "base16ct", "der", - "generic-array", + "generic-array 0.14.7", "pkcs8", "subtle", "zeroize", @@ -3590,9 +3697,9 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] @@ -3608,9 +3715,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.192" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", @@ -3638,6 +3745,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "serde_spanned" version = "0.6.4" @@ -3659,6 +3777,35 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +dependencies = [ + "base64 0.21.5", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.1.0", + "serde", + "serde_json", + "time", +] + +[[package]] +name = "serde_yaml" +version = "0.9.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +dependencies = [ + "indexmap 2.1.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "sha2" version = "0.10.8" @@ -3703,9 +3850,9 @@ dependencies = [ [[package]] name = "signature" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", "rand_core 0.6.4", @@ -3747,7 +3894,7 @@ checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "snark-verifier" version = "0.1.1" -source = "git+https://github.com/privacy-scaling-explorations/snark-verifier#fedd7a8ffa44082c20a63e101484e0991ee7cce0" +source = "git+https://github.com/privacy-scaling-explorations/snark-verifier#9feead7d4dbad951e6aa1d572230b1c098ec8040" dependencies = [ "ecc", "halo2_proofs", @@ -3768,7 +3915,7 @@ dependencies = [ [[package]] name = "snark-verifier-sdk" version = "0.1.2" -source = "git+https://github.com/privacy-scaling-explorations/snark-verifier#fedd7a8ffa44082c20a63e101484e0991ee7cce0" +source = "git+https://github.com/privacy-scaling-explorations/snark-verifier#9feead7d4dbad951e6aa1d572230b1c098ec8040" dependencies = [ "ark-std", "bincode", @@ -3807,14 +3954,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "solang-parser" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cb9fa2fa2fa6837be8a2495486ff92e3ffe68a99b6eeba288e139efdd842457" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" dependencies = [ "itertools 0.11.0", "lalrpop", @@ -3841,9 +3988,9 @@ dependencies = [ [[package]] name = "spki" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", "der", @@ -3930,20 +4077,26 @@ name = "summa-aggregation" version = "0.1.0" dependencies = [ "axum", + "bollard", "const_env", + "csv", + "futures", "halo2_proofs", "num-bigint 0.4.4", "rand 0.8.5", + "reqwest", "serde", "serde_json", + "serde_yaml", "summa-backend", "tokio", + "tokio-util", ] [[package]] name = "summa-backend" version = "0.1.0" -source = "git+https://github.com/summa-dev/summa-solvency?branch=v1-improvements-and-consolidation#8ab0b07587ced37d341266a73c187bb22e03560e" +source = "git+https://github.com/summa-dev/summa-solvency?branch=v1-improvements-and-consolidation#89c228dee2c41b9592016789717446c71ff06bec" dependencies = [ "base64 0.13.1", "bincode", @@ -3952,6 +4105,7 @@ dependencies = [ "futures", "halo2_proofs", "num-bigint 0.4.4", + "num-traits", "reqwest", "serde", "serde_json", @@ -3963,7 +4117,7 @@ dependencies = [ [[package]] name = "summa-solvency" version = "0.1.0" -source = "git+https://github.com/summa-dev/summa-solvency?branch=v1-improvements-and-consolidation#8ab0b07587ced37d341266a73c187bb22e03560e" +source = "git+https://github.com/summa-dev/summa-solvency?branch=v1-improvements-and-consolidation#89c228dee2c41b9592016789717446c71ff06bec" dependencies = [ "ark-std", "csv", @@ -4053,7 +4207,7 @@ dependencies = [ "fastrand", "redox_syscall", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4165,7 +4319,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.5.5", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4205,14 +4359,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.8" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.19.15", + "toml_edit 0.21.0", ] [[package]] @@ -4231,8 +4385,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.1.0", - "serde", - "serde_spanned", "toml_datetime", "winnow", ] @@ -4248,6 +4400,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" @@ -4386,6 +4551,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "unsafe-libyaml" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" + [[package]] name = "untrusted" version = "0.7.1" @@ -4394,9 +4565,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -4458,9 +4629,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "serde", @@ -4470,9 +4641,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", @@ -4485,9 +4656,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", @@ -4497,9 +4668,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4507,9 +4678,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", @@ -4532,15 +4703,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", @@ -4589,13 +4760,31 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -4604,13 +4793,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -4619,42 +4823,84 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" version = "0.5.19" @@ -4671,7 +4917,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ "cfg-if", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4720,18 +4966,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.25" +version = "0.7.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd369a67c0edfef15010f980c3cbe45d7f651deac2cd67ce097cd801de16557" +checksum = "7d6f15f7ade05d2a4935e34a457b936c23dc70a05cc1d97133dc99e7a3fe0f0e" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.25" +version = "0.7.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b" +checksum = "dbbad221e3f78500350ecbd7dfa4e63ef945c05f4c61cb7f4d3f84cd0bba649b" dependencies = [ "proc-macro2", "quote", @@ -4740,9 +4986,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" dependencies = [ "zeroize_derive", ] diff --git a/Cargo.toml b/Cargo.toml index 7883a98..657c5ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,11 +11,21 @@ const_env = "0.1.2" num-bigint = "0.4.4" serde = { version = "1.0.192", features = ["derive"] } serde_json = "1.0.108" -summa-backend = { git = "https://github.com/summa-dev/summa-solvency", branch = "v1-improvements-and-consolidation", version = "0.1.0" } +summa-backend = { git = "https://github.com/summa-dev/summa-solvency", branch = "v1-improvements-and-consolidation" } halo2_proofs = { git = "https://github.com/privacy-scaling-explorations/halo2", tag = "v2023_04_20"} tokio = { version = "1.34.0", features = ["full"] } -rand = "0.8" +reqwest = "0.11.22" +csv = "1.3.0" +rand = "0.8.5" +futures = "0.3.29" +bollard = "0.15.0" +tokio-util = "0.7.10" +serde_yaml = "0.9.27" [[bin]] name = "mini-tree-server" path = "bin/mini_tree_server.rs" + +[features] +docker = [] +docker-swarm = [] diff --git a/Orchestrator-diagram.png b/Orchestrator-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..b4c807f6ba1f9259de5ce636f93c2d784cb44d9b GIT binary patch literal 111722 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index d00879f..065bc9a 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,90 @@ # Summa Aggregation -## Orchestrator - -WIP - -## Mini Tree Generator - -- Build the Image - - To build the image, run the following command: - ``` - docker build . -t summa-aggregation/mini-tree - ``` - -- Run the `Mini Tree Generator Container` - - Use the command below to start the Mini Tree Generator container: - - ``` - docker run -d -p 4000:4000 --name mini-tree-generator summa-aggretaion/mini-tree - ``` - -- Test with a Script - - To test, execute the provided script that send two `Entry` data to server: - ``` - bash ./scripts/test_sending_entry.sh - ``` - - Upon successful execution, you will receive a response similar to the following - (JSON output is prettified for clarity): - ```Json - { - "root": { - "hash": "0x2a4a7ae82b45b3800bdcd6364409e7ba9cac3d4598c546bd48952c234b5d2fb9", - "balances": [ - "0x000000000000000000000000000000000000000000000000000000000001375f", - "0x000000000000000000000000000000000000000000000000000000000000e9a6" - ] - }, - "nodes": [ - [ - { - "hash": "0x0e113acd03b98f0bab0ef6f577245d5d008cbcc19ef2dab3608aa4f37f72a407", - "balances": [ - "0x0000000000000000000000000000000000000000000000000000000000002e70", - "0x000000000000000000000000000000000000000000000000000000000000a0cb" - ] - }, - { - "hash": "0x17ef9d8ee0e2c8470814651413b71009a607a020214f749687384a7b7a7eb67a", - "balances": [ - "0x00000000000000000000000000000000000000000000000000000000000108ef", - "0x00000000000000000000000000000000000000000000000000000000000048db" - ] - } - ], - [ - { - "hash": "0x2a4a7ae82b45b3800bdcd6364409e7ba9cac3d4598c546bd48952c234b5d2fb9", - "balances": [ - "0x000000000000000000000000000000000000000000000000000000000001375f", - "0x000000000000000000000000000000000000000000000000000000000000e9a6" - ] - } - ] - ], - "depth": 1, - "entries": [ - { - "balances": [ - "11888", - "41163" - ], - "username": "dxGaEAii" - }, - { - "balances": [ - "67823", - "18651" - ], - "username": "MBlfbBGI" - } - ], - "is_sorted": false - } - ``` +Summa Aggregation is a scalable solution specifically designed to accelerate the process of building Merkle sum tree. It addresses the time-intensive challenge of constructing these trees by enabling efficient scaling through parallelization and distributed computation across multiple machines. +## Running test + +Tests can be run using the following command: + +```bash +cargo test --release +``` + +Note: The Worker will run locally and uses port 4000 as the default for its server. +Please ensure that this port is not already in use to avoid errors. + +## Running Additional Tests Involving Docker and Docker Swarm + +For additional tests involving Docker and Docker Swarm mode, the presence of the "summadev/summa-aggregation-mini-tree" image in the local Docker registry is required. Please refer to the [Mini Tree Server](bin/README.md) for more information about the mini tree. + +### Building the docker image + +Build the image using the following command: + +```bash +docker build . -t summadev/summa-aggregation-mini-tree +``` + +### Downloading the Docker Image + +Alternatively, the image can be downloaded from Docker Hub: + +```bash +docker pull summadev/summa-aggregation-mini-tree +``` + +### Testing with LocalSpawner + +The following command runs an additional test case using the LocalSpawner, which spawns worker containers in the local Docker environment. This extra test case involves running two containers during the testing process: + +```bash +cargo test --features docker +``` + +### Testing with CloudSpawner + +For Summa-Aggregation, it's necessary to prepare a distributed environment where Workers can operate on remote machines, referred to as 'Nodes'. For guidance on setting up swarm nodes, please see [Getting Started with swarm mode](https://docs.docker.com/engine/swarm/swarm-tutorial) + +When the Docker environment is running successfully in Swarm mode, an additional test case that spawns workers on Swarm nodes using the `CloudSpawner` can be run: + +```bash +cargo test --features docker-swarm +``` + +It is critical to ensure that the Docker Swarm includes at least one node connected to the manager node. Additionally, each worker node in the swarm must have the "summadev/summa-aggregation-mini-tree" image in its Docker registry. Without this image on nodes connected to the manager node, spawning workers on that node is not possible. + +## Summa Aggregation Example + +This example demonstrates the setup and operation of a distributed environment using Summa Aggregation, including the initialization of round and generating inclusion proof. A notable aspect of this demonstration is how the AggregationMerkleSumTree can produce the generation of inclusion proofs, similarly to the MerkleSumTree. + +### 1. Setup Distributed Environment + +Custodians can leverage any cloud infrastructure to establish worker nodes. In this example, we use two local servers running mini-tree services as workers, rather than deploying worker containers on remote nodes. + +Key steps: + +- **Spawning Worker Nodes**: Two local servers are spawned, each running a mini-tree service. + +- **Worker URLs**: It is crucial to ensure the number of worker URLs matches the number of executors. In this example, we use `127.0.0.1:4000` and `127.0.0.1:4001`. + +### 2. Initialize the Round with Aggregation Merkle Sum Tree + +Initiating the round with an `AggregationMerkleSumTree` is a key step after setting up the distributed environment with worker nodes. This process involves the `Orchestrator` and the `Round`. + +- **Orchestrator and AggregationMerkleSumTree**: The `Orchestrator` is initialized with the `CloudSpawner` and paths to the CSV files containing entry data. It uses this information to generate the `AggregationMerkleSumTree`, which forms the basis for the round's operations. + +- **Round Initialization**: Subsequently, the `Round` is initialized using the aggregation merkle sum tree. The `Round` is integral for interactions with the Summa contract and relies on the setup performed by the `Orchestrator`. + +### 3. Interact with the Summa Contract and Generate Proof of Inclusion + +The actual example only shows the creation of an inclusion proof. + +For detailed information on interaction patterns similar to those in the `summa-backend` example, refer to the ['summa_solvency_flow'](https://github.com/summa-dev/summa-solvency/blob/master/backend/examples/summa_solvency_flow.rs). + +### Example Execution + +Run the example using the following command: + +```bash +cargo run --release --example aggregation_flow +``` diff --git a/bin/README.md b/bin/README.md new file mode 100644 index 0000000..e252863 --- /dev/null +++ b/bin/README.md @@ -0,0 +1,77 @@ +# Mini Tree Server + +Mini Tree Server is an Axum-based server that encapsulates the functionality of the Mini Tree Generator. + +## Test Mini Tree Server + +First, to start the Mini Tree Server, use the command: + +```bash + cargo run --release --bin mini-tree-server +``` + +Alternatively, if you have the summa-aggregation-mini-tree image locally, can run the server with this command: + + ```bash + docker run -d -p 4000:4000 --name mini-tree-server-test summadev/summa-aggregation-mini-tree + ``` + +For details on obtaining the summadev/summa-aggregation-mini-tree image, please refer to the [Building Image](../README.md#building-the-docker-image) and [Downloading Image](../README.md#downloading-the-docker-image) sections in the README. + +Second, send two entries to the Mini Tree Server, execute the following script: + + ```bash + bash ./scripts/test_sending_entry.sh + ``` + +Note: Execute this command from the project's root folder to ensure proper functioning of scripts. + +Upon successful execution, you will receive a response similar to the following: +
+Click View Response + +```Json +{ + "root": { + "hash": "0x2a4a7ae82b45b3800bdcd6364409e7ba9cac3d4598c546bd48952c234b5d2fb9", + "balances": [ + "0x000000000000000000000000000000000000000000000000000000000001375f", + "0x000000000000000000000000000000000000000000000000000000000000e9a6" + ] + }, + "nodes": [ + [ + { + "hash": "0x0e113acd03b98f0bab0ef6f577245d5d008cbcc19ef2dab3608aa4f37f72a407", + "balances": [ + "0x0000000000000000000000000000000000000000000000000000000000002e70", + "0x000000000000000000000000000000000000000000000000000000000000a0cb" + ] + }, + { + "hash": "0x17ef9d8ee0e2c8470814651413b71009a607a020214f749687384a7b7a7eb67a", + "balances": [ + "0x00000000000000000000000000000000000000000000000000000000000108ef", + "0x00000000000000000000000000000000000000000000000000000000000048db" + ] + } + ], + [ + { + "hash": "0x2a4a7ae82b45b3800bdcd6364409e7ba9cac3d4598c546bd48952c234b5d2fb9", + "balances": [ + "0x000000000000000000000000000000000000000000000000000000000001375f", + "0x000000000000000000000000000000000000000000000000000000000000e9a6" + ] + } + ] + ], + "depth": 1, + "is_sorted": false +} +``` + +this JSON output is prettified for clarity + +
+ diff --git a/bin/mini_tree_server.rs b/bin/mini_tree_server.rs index 709e4d2..ee67b05 100644 --- a/bin/mini_tree_server.rs +++ b/bin/mini_tree_server.rs @@ -1,36 +1,7 @@ -use axum::{extract::Json, http::StatusCode, response::IntoResponse, routing::post, Router}; -use const_env::from_env; -use num_bigint::BigUint; +use axum::{routing::post, Router}; use std::net::SocketAddr; -use summa_backend::merkle_sum_tree::{Entry, MerkleSumTree, Node, Tree}; -use serde::{Deserialize, Serialize}; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct JsonNode { - pub hash: String, - pub balances: Vec, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct JsonEntry { - balances: Vec, - username: String, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct JsonMerkleSumTree { - root: JsonNode, - nodes: Vec>, - depth: usize, - entries: Vec, - is_sorted: bool, -} - -#[from_env] -const N_ASSETS: usize = 2; -#[from_env] -const N_BYTES: usize = 14; +use summa_aggregation::mini_tree_generator::create_mst; #[tokio::main] async fn main() { @@ -38,7 +9,7 @@ async fn main() { let app = Router::new().route("/", post(create_mst)); // Define the address to serve on - let addr = SocketAddr::from(([0, 0, 0, 0], 4000)); // TODO: assign ports from env variable + let addr = SocketAddr::from(([0, 0, 0, 0], 4000)); // Start the server axum::Server::bind(&addr) @@ -46,51 +17,3 @@ async fn main() { .await .unwrap(); } - -fn convert_node_to_json(node: &Node) -> JsonNode { - JsonNode { - hash: format!("{:?}", node.hash), - balances: node.balances.iter().map(|b| format!("{:?}", b)).collect(), - } -} - -async fn create_mst( - Json(json_entries): Json>, -) -> Result)> { - // Convert `JsonEntry` -> `Entry` - let entries = json_entries - .iter() - .map(|entry| { - let mut balances: [BigUint; N_ASSETS] = std::array::from_fn(|_| BigUint::from(0u32)); - entry.balances.iter().enumerate().for_each(|(i, balance)| { - balances[i] = balance.parse::().unwrap(); - }); - Entry::new(entry.username.clone(), balances).unwrap() - }) - .collect::>>(); - - // Create `MerkleSumTree` from `parsed_entries` - let tree = MerkleSumTree::::from_entries(entries, false).unwrap(); - - // Convert `MerkleSumTree` to `JsonMerkleSumTree` - let json_tree = JsonMerkleSumTree { - root: convert_node_to_json(&tree.root()), - nodes: tree - .nodes() - .iter() - .map(|layer| layer.iter().map(convert_node_to_json).collect()) - .collect(), - depth: tree.depth().clone(), - entries: tree - .entries() - .iter() - .map(|entry| JsonEntry { - balances: entry.balances().iter().map(|b| b.to_string()).collect(), - username: entry.username().to_string(), - }) - .collect(), - is_sorted: false, // TODO: assign from request data - }; - - Ok((StatusCode::OK, Json(json_tree))) -} diff --git a/csv/entry_16.csv b/csv/entry_16.csv new file mode 100644 index 0000000..83b2d1d --- /dev/null +++ b/csv/entry_16.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,11888,41163 +MBlfbBGI,67823,18651 +lAhWlEWZ,18651,2087 +nuZweYtO,22073,55683 +gbdSwiuY,34897,83296 +RZNneNuP,83296,16881 +YsscHXkp,31699,35479 +RkLzkDun,2087,79731 +HlQlnEYI,30605,11888 +RqkZOFYe,16881,14874 +NjCSRAfD,41163,67823 +pHniJMQY,14874,22073 +dOGIMzKR,10032,10032 +HfMDmNLp,55683,34897 +xPLKzCBl,79731,30605 +AtwIxZHo,35479,31699 diff --git a/csv/entry_16_1.csv b/csv/entry_16_1.csv new file mode 100644 index 0000000..83b2d1d --- /dev/null +++ b/csv/entry_16_1.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,11888,41163 +MBlfbBGI,67823,18651 +lAhWlEWZ,18651,2087 +nuZweYtO,22073,55683 +gbdSwiuY,34897,83296 +RZNneNuP,83296,16881 +YsscHXkp,31699,35479 +RkLzkDun,2087,79731 +HlQlnEYI,30605,11888 +RqkZOFYe,16881,14874 +NjCSRAfD,41163,67823 +pHniJMQY,14874,22073 +dOGIMzKR,10032,10032 +HfMDmNLp,55683,34897 +xPLKzCBl,79731,30605 +AtwIxZHo,35479,31699 diff --git a/csv/entry_16_2.csv b/csv/entry_16_2.csv new file mode 100644 index 0000000..273c579 --- /dev/null +++ b/csv/entry_16_2.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +aaGaEAaa,11888,41163 +bblfbBGI,67823,18651 +cchWlEWZ,18651,2087 +ddZweYtO,22073,55683 +eedSwiuY,34897,83296 +ffNneNuP,83296,16881 +ggscHXkp,31699,35479 +hhLzkDun,2087,79731 +iiQlnEYI,30605,11888 +llkZOFYe,16881,14874 +mmCSRAfD,41163,67823 +nnniJMQY,14874,22073 +ooGIMzKR,10032,10032 +ppMDmNLp,55683,34897 +qqLKzCBl,79731,30605 +rrwIxZHo,35479,31699 diff --git a/csv/entry_16_3.csv b/csv/entry_16_3.csv new file mode 100644 index 0000000..a280358 --- /dev/null +++ b/csv/entry_16_3.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +a1GaEAaa,11888,41163 +b2lfbBGI,67823,18651 +c3hWlEWZ,18651,2087 +d4ZweYtO,22073,55683 +e5dSwiuY,34897,83296 +f6NneNuP,83296,16881 +g7scHXkp,31699,35479 +h8LzkDun,2087,79731 +i9QlnEYI,30605,11888 +l0kZOFYe,16881,14874 +m1CSRAfD,41163,67823 +n2niJMQY,14874,22073 +o3GIMzKR,10032,10032 +p4MDmNLp,55683,34897 +q5LKzCBl,79731,30605 +r6wIxZHo,35479,31699 diff --git a/csv/entry_16_4.csv b/csv/entry_16_4.csv new file mode 100644 index 0000000..880e9b3 --- /dev/null +++ b/csv/entry_16_4.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +a17aEAaa,11888,41163 +b28fbBGI,67823,18651 +c39WlEWZ,18651,2087 +d40weYtO,22073,55683 +e51SwiuY,34897,83296 +f62neNuP,83296,16881 +g73cHXkp,31699,35479 +h84zkDun,2087,79731 +i95lnEYI,30605,11888 +l06ZOFYe,16881,14874 +m17SRAfD,41163,67823 +n28iJMQY,14874,22073 +o39IMzKR,10032,10032 +p40DmNLp,55683,34897 +q51KzCBl,79731,30605 +r62IxZHo,35479,31699 diff --git a/csv/entry_16_no_overflow.csv b/csv/entry_16_no_overflow.csv new file mode 100644 index 0000000..f55f626 --- /dev/null +++ b/csv/entry_16_no_overflow.csv @@ -0,0 +1,17 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,18446744073709551615,0 +MBlfbBGI,0,18446744073709551615 +lAhWlEWZ,0,0 +nuZweYtO,0,0 +gbdSwiuY,0,0 +RZNneNuP,0,0 +YsscHXkp,0,0 +RkLzkDun,0,0 +HlQlnEYI,0,0 +RqkZOFYe,0,0 +NjCSRAfD,0,0 +pHniJMQY,0,0 +dOGIMzKR,0,0 +HfMDmNLp,0,0 +xPLKzCBl,0,0 +AtwIxZHo,0,0 diff --git a/csv/entry_64.csv b/csv/entry_64.csv new file mode 100644 index 0000000..56b7f39 --- /dev/null +++ b/csv/entry_64.csv @@ -0,0 +1,65 @@ +username,balance_ETH_ETH,balance_USDT_ETH +dxGaEAii,11888,41163 +MBlfbBGI,67823,18651 +lAhWlEWZ,18651,2087 +nuZweYtO,22073,55683 +gbdSwiuY,34897,83296 +RZNneNuP,83296,16881 +YsscHXkp,31699,35479 +RkLzkDun,2087,79731 +HlQlnEYI,30605,11888 +RqkZOFYe,16881,14874 +NjCSRAfD,41163,67823 +pHniJMQY,14874,22073 +dOGIMzKR,10032,10032 +HfMDmNLp,55683,34897 +xPLKzCBl,79731,30605 +AtwIxZHo,35479,31699 +aaGaEAaa,11888,41163 +bblfbBGI,67823,18651 +cchWlEWZ,18651,2087 +ddZweYtO,22073,55683 +eedSwiuY,34897,83296 +ffNneNuP,83296,16881 +ggscHXkp,31699,35479 +hhLzkDun,2087,79731 +iiQlnEYI,30605,11888 +llkZOFYe,16881,14874 +mmCSRAfD,41163,67823 +nnniJMQY,14874,22073 +ooGIMzKR,10032,10032 +ppMDmNLp,55683,34897 +qqLKzCBl,79731,30605 +rrwIxZHo,35479,31699 +a1GaEAaa,11888,41163 +b2lfbBGI,67823,18651 +c3hWlEWZ,18651,2087 +d4ZweYtO,22073,55683 +e5dSwiuY,34897,83296 +f6NneNuP,83296,16881 +g7scHXkp,31699,35479 +h8LzkDun,2087,79731 +i9QlnEYI,30605,11888 +l0kZOFYe,16881,14874 +m1CSRAfD,41163,67823 +n2niJMQY,14874,22073 +o3GIMzKR,10032,10032 +p4MDmNLp,55683,34897 +q5LKzCBl,79731,30605 +r6wIxZHo,35479,31699 +a17aEAaa,11888,41163 +b28fbBGI,67823,18651 +c39WlEWZ,18651,2087 +d40weYtO,22073,55683 +e51SwiuY,34897,83296 +f62neNuP,83296,16881 +g73cHXkp,31699,35479 +h84zkDun,2087,79731 +i95lnEYI,30605,11888 +l06ZOFYe,16881,14874 +m17SRAfD,41163,67823 +n28iJMQY,14874,22073 +o39IMzKR,10032,10032 +p40DmNLp,55683,34897 +q51KzCBl,79731,30605 +r62IxZHo,35479,31699 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..6155cd4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,20 @@ +version: '3.8' + +# CloudSpawner only reads from the first element of lists +services: + mini_tree: + image: summadev/summa-aggregation-mini-tree:latest + ports: + - published: 4000 + target: 4000 + deploy: + replicas: 2 + placement: + constraints: + - node.role == worker + networks: + - mini_tree + +networks: + mini_tree: + driver: overlay diff --git a/examples/aggregation_flow.rs b/examples/aggregation_flow.rs new file mode 100644 index 0000000..7a3ec44 --- /dev/null +++ b/examples/aggregation_flow.rs @@ -0,0 +1,106 @@ +#![feature(generic_const_exprs)] +use axum::{routing::post, Router}; +use std::error::Error; +use std::net::SocketAddr; + +use summa_aggregation::{ + executor::CloudSpawner, mini_tree_generator::create_mst, orchestrator::Orchestrator, +}; +use summa_backend::{ + apis::round::Round, + contracts::signer::{AddressInput, SummaSigner}, + tests::initialize_test_env, +}; + +#[tokio::main] +async fn main() -> Result<(), Box> { + // 1. Setup Distributed Environment + // + // Custodians can use any cloud infrastructure to set up worker nodes. + // In this example, instead of spawning worker containers on remote nodes, we will use two local servers running mini-tree services as workers. + + // Spawning Worker_1 + tokio::spawn(async move { + let app = Router::new().route("/", post(create_mst)); + let addr = SocketAddr::from(([0, 0, 0, 0], 4000)); + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .unwrap(); + }); + + // Spawning Worker_2 + tokio::spawn(async move { + let app = Router::new().route("/", post(create_mst)); + let addr = SocketAddr::from(([0, 0, 0, 0], 4001)); + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .unwrap(); + }); + + // We assume that custodians, when setting up their distributed environment, will obtain the URLs of worker nodes. + // In this example, we use two worker URLs corresponding to the workers spawned earlier. + // It is important to ensure that the number of URLs matches the number of executors. + let worker_node_urls = vec!["127.0.0.1:4000".to_string(), "127.0.0.1:4001".to_string()]; + + // To initiate the Round, a SummaSigner instance and its corresponding SummaContract instance are required. + // Here, we initialize the signer with a specified private key and the Summa contract's address. + let (anvil, _, _, _, summa_contract) = initialize_test_env(None).await; + let signer = SummaSigner::new( + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + anvil.endpoint().as_str(), + AddressInput::Address(summa_contract.address()), + ) + .await?; + // Up to this point, the above code logic can be viewed as the Custodian's cloud infra structure setup process for Summa-Aggregation. + + // 2. Initialize the Round with Aggregtaion Merkle Sum Tree + // + // Setting parameters for the aggregation merkle sum tree: + // + // LEVELS: This defines the number of levels in the aggregation merkle sum tree, including the mini-tree level. + const LEVELS: usize = 5; + // N_CURRENCIES: Specifies the number of currencies in the entry data. + const N_CURRENCIES: usize = 2; + // N_BYTES: Determines the maximum total balance allowed for each currency, calculated as 1 << (8 * 14) = 2^112. + const N_BYTES: usize = 14; + // Note: These parameters should match those in the Summa contract. + + // CloudSpawner does not depend on a `docker-compose.yml` file or a `service_name` for creating workers. + // This implies that `service_info` is not necessary. When `service_info` is absent, CloudSpawner creates an Executor solely based on the `worker_node_url`. + let spawner = CloudSpawner::new(None, worker_node_urls, 4000); + let orchestrator = Orchestrator::::new( + Box::new(spawner), + vec![ + "csv/entry_16_1.csv".to_string(), + "csv/entry_16_2.csv".to_string(), + ], + ); + + // The number of Executors must match the number of worker_node_urls. + let aggregation_merkle_sum_tree = orchestrator.create_aggregation_mst(2).await.unwrap(); + + // After obtaining the aggregation merkle sum tree, we proceed to initialize the round. + let timestamp = 1u64; + let params_path = "examples/hermez-raw-11"; + let round = Round::::new( + &signer, + Box::new(aggregation_merkle_sum_tree), + params_path, + timestamp, + ) + .unwrap(); + + // 3. Interact with the Summa Contract and Generate Proof of Inclusion + // + // Interactions with the Summa contract, such as sending Commitment or AddressOwnership, are similar to those in the `summa-backend` example, particularly 'summa_solvency_flow'. + // For detailed information, refer to the example at: https://github.com/summa-dev/summa-solvency/blob/master/backend/examples/summa_solvency_flow.rs + // + // Here, we demonstrate generating the proof of inclusion for User 0. + let inclusion_proof_of_user0 = round.get_proof_of_inclusion(0).unwrap(); + assert!(!inclusion_proof_of_user0.get_public_inputs().is_empty()); // Check public input counts + + println!("Generated User 0 proof of inclusion"); + Ok(()) +} diff --git a/examples/hermez-raw-11 b/examples/hermez-raw-11 new file mode 100644 index 0000000000000000000000000000000000000000..2205b7297824a5a183a80a1988d429d6848e486b GIT binary patch literal 262404 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

|WTpeNn*<=0S`2VFfYFnI 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 z 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

gB;i#1r?>tsogN}W&>t~OmK6FgRZLptcK<* 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

|D{W5sA8&6rFE!X5 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 literal 0 HcmV?d00001 diff --git a/scripts/test_sending_entry.sh b/scripts/test_sending_entry.sh index 3e13652..034378a 100644 --- a/scripts/test_sending_entry.sh +++ b/scripts/test_sending_entry.sh @@ -10,13 +10,38 @@ else fi # The curl command with the variable PORT -curl -X POST http://localhost:$PORT/ \ +curl -X POST http://localhost:$PORT \ + -vvv \ -H "Content-Type: application/json" \ -d '[ { "balances": ["11888", "41163"], "username": "dxGaEAii" }, + { + "balances": ["67823", "18651"], + "username": "MBlfbBGI" + }, + { + "balances": ["11888", "41163"], + "username": "dxGaEAii" + }, + { + "balances": ["67823", "18651"], + "username": "MBlfbBGI" + }, + { + "balances": ["11888", "41163"], + "username": "dxGaEAii" + }, + { + "balances": ["67823", "18651"], + "username": "MBlfbBGI" + }, + { + "balances": ["11888", "41163"], + "username": "dxGaEAii" + }, { "balances": ["67823", "18651"], "username": "MBlfbBGI" diff --git a/src/aggregation_merkle_sum_tree.rs b/src/aggregation_merkle_sum_tree.rs index 5eacc4c..0e4e884 100644 --- a/src/aggregation_merkle_sum_tree.rs +++ b/src/aggregation_merkle_sum_tree.rs @@ -1,29 +1,32 @@ use halo2_proofs::halo2curves::bn256::Fr as Fp; -use num_bigint::BigUint; -use summa_backend::merkle_sum_tree::utils::{build_merkle_tree_from_leaves, fp_to_big_uint}; -use summa_backend::merkle_sum_tree::{Entry, MerkleProof, MerkleSumTree, Node, Tree}; +use std::error::Error; +use summa_backend::merkle_sum_tree::utils::build_merkle_tree_from_leaves; +use summa_backend::merkle_sum_tree::{ + Cryptocurrency, Entry, MerkleProof, MerkleSumTree, Node, Tree, +}; /// Aggregation Merkle Sum Tree Data Structure. /// -/// Starting from a set of "mini" Merkle Sum Trees of equal depth, N_ASSETS and N_BYTES, the Aggregation Merkle Sum Tree inherits the properties of a Merkle Sum Tree and adds the following: +/// Starting from a set of "mini" Merkle Sum Tree of equal depth, N_CURRENCIES and N_BYTES, the Aggregation Merkle Sum Tree inherits the properties of a Merkle Sum Tree and adds the following: /// * Each Leaf of the Aggregation Merkle Sum Tree is the root of a "mini" Merkle Sum Tree made of `hash` and `balances` /// /// # Type Parameters /// -/// * `N_ASSETS`: The number of assets for each user account +/// * `N_CURRENCIES`: The number of assets for each user account /// * `N_BYTES`: Range in which each node balance should lie #[derive(Debug, Clone)] -pub struct AggregationMerkleSumTree { - root: Node, - nodes: Vec>>, +pub struct AggregationMerkleSumTree { + root: Node, + nodes: Vec>>, depth: usize, - mini_trees: Vec>, + cryptocurrencies: Vec, + mini_trees: Vec>, } -impl Tree - for AggregationMerkleSumTree +impl Tree + for AggregationMerkleSumTree { - fn root(&self) -> &Node { + fn root(&self) -> &Node { &self.root } @@ -31,15 +34,15 @@ impl Tree &self.depth } - fn leaves(&self) -> &[Node] { - &self.nodes[0] + fn nodes(&self) -> &[Vec>] { + &self.nodes } - fn nodes(&self) -> &[Vec>] { - &self.nodes + fn cryptocurrencies(&self) -> &[Cryptocurrency] { + &self.cryptocurrencies } - fn get_entry(&self, user_index: usize) -> &Entry { + fn get_entry(&self, user_index: usize) -> &Entry { let (mini_tree_index, entry_index) = self.get_entry_location(user_index); // Retrieve the mini tree @@ -49,42 +52,61 @@ impl Tree mini_tree.get_entry(entry_index) } - fn generate_proof(&self, index: usize) -> Result, &'static str> { + fn generate_proof( + &self, + index: usize, + ) -> Result, Box> + where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, + { let (mini_tree_index, entry_index) = self.get_entry_location(index); // Retrieve the mini tree let mini_tree = &self.mini_trees[mini_tree_index]; + // Retrieve sibling mini tree + let sibling_mini_tree_index = if mini_tree_index % 2 == 0 { + mini_tree_index + 1 + } else { + mini_tree_index - 1 + }; + let sibling_mini_tree = &self.mini_trees[sibling_mini_tree_index]; + // Build the partial proof, namely from the leaf to the root of the mini tree let mut partial_proof = mini_tree.generate_proof(entry_index)?; + let mut sibling_middle_node_hash_preimages = Vec::new(); + + // Retrieve sibling mini tree root hash preimage + let sibling_mini_tree_node_preimage = sibling_mini_tree + .get_middle_node_hash_preimage(*sibling_mini_tree.depth(), 0) + .unwrap(); + + sibling_middle_node_hash_preimages.push(sibling_mini_tree_node_preimage); // Build the rest of the proof (top_proof), namely from the root of the mini tree to the root of the aggregation tree let mut current_index = mini_tree_index; - - let mut sibling_hashes = vec![Fp::from(0); self.depth]; - let mut sibling_sums = vec![[Fp::from(0); N_ASSETS]; self.depth]; let mut path_indices = vec![Fp::from(0); self.depth]; + #[allow(clippy::needless_range_loop)] for level in 0..self.depth { let position = current_index % 2; - let level_start_index = current_index - position; - let level_end_index = level_start_index + 2; - path_indices[level] = Fp::from(position as u64); - for i in level_start_index..level_end_index { - if i != current_index { - sibling_hashes[level] = self.nodes[level][i].hash; - sibling_sums[level] = self.nodes[level][i].balances; - } + let sibling_index = current_index - position + (1 - position); + if sibling_index < self.nodes[level].len() && level != 0 { + // Fetch hash preimage for sibling middle nodes + let sibling_node_preimage = + self.get_middle_node_hash_preimage(level, sibling_index)?; + sibling_middle_node_hash_preimages.push(sibling_node_preimage); } current_index /= 2; } - // append the top_proof to the partial_proof - partial_proof.sibling_hashes.extend(sibling_hashes); - partial_proof.sibling_sums.extend(sibling_sums); partial_proof.path_indices.extend(path_indices); + partial_proof + .sibling_middle_node_hash_preimages + .extend(sibling_middle_node_hash_preimages); // replace the root of the partial proof with the root of the aggregation tree partial_proof.root = self.root.clone(); @@ -93,40 +115,37 @@ impl Tree } } -impl AggregationMerkleSumTree { - /// Builds a AggregationMerkleSumTree from a set of mini MerkleSumTrees - /// The leaves of the AggregationMerkleSumTree are the roots of the mini MerkleSumTrees +impl + AggregationMerkleSumTree +{ + /// Builds a AggregationMerkleSumTree from a set of mini MerkleSumTree + /// The leaves of the AggregationMerkleSumTree are the roots of the mini MerkleSumTree pub fn new( - mini_trees: Vec>, - ) -> Result> + mini_trees: Vec>, + cryptocurrencies: Vec, + ) -> Result, Box> where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, { + if mini_trees.is_empty() { + return Err("Empty mini tree inputs".into()); + } + // assert that all mini trees have the same depth let depth = mini_trees[0].depth(); assert!(mini_trees.iter().all(|x| x.depth() == depth)); - Self::build_tree(mini_trees) - } - - fn build_tree( - mini_trees: Vec>, - ) -> Result, Box> - where - [usize; N_ASSETS + 1]: Sized, - [usize; 2 * (1 + N_ASSETS)]: Sized, - { // extract all the roots of the mini trees let roots = mini_trees .iter() .map(|x| x.root().clone()) - .collect::>>(); + .collect::>>(); let depth = (roots.len() as f64).log2().ceil() as usize; // Calculate the accumulated balances for each asset - let mut balances_acc: Vec = vec![Fp::from(0); N_ASSETS]; + let mut balances_acc: Vec = vec![Fp::from(0); N_CURRENCIES]; for root in &roots { for (i, balance) in root.balances.iter().enumerate() { @@ -134,19 +153,6 @@ impl AggregationMerkleSumTree= BigUint::from(2_usize).pow(8 * N_BYTES as u32) { - return Err( - "Accumulated balance is not in the expected range, proof generation will fail!" - .into(), - ); - } - } - let mut nodes = vec![]; let root = build_merkle_tree_from_leaves(&roots, depth, &mut nodes)?; @@ -154,11 +160,12 @@ impl AggregationMerkleSumTree &MerkleSumTree { + pub fn mini_tree(&self, tree_index: usize) -> &MerkleSumTree { &self.mini_trees[tree_index] } @@ -178,27 +185,26 @@ impl AggregationMerkleSumTree::new("src/data/entry_16_1.csv").unwrap(); + MerkleSumTree::::from_csv("csv/entry_16_1.csv").unwrap(); let mini_tree_2 = - MerkleSumTree::::new("src/data/entry_16_2.csv").unwrap(); + MerkleSumTree::::from_csv("csv/entry_16_2.csv").unwrap(); - let aggregation_mst = AggregationMerkleSumTree::::new(vec![ - mini_tree_1.clone(), - mini_tree_2.clone(), - ]) + let aggregation_mst = AggregationMerkleSumTree::::new( + vec![mini_tree_1.clone(), mini_tree_2.clone()], + mini_tree_1.cryptocurrencies().to_owned().to_vec(), + ) .unwrap(); // get root @@ -235,21 +241,51 @@ mod test { assert!(aggregation_mst.verify_proof(&proof)); } + #[test] + fn test_aggregation_mst_compare_mst_result() { + // create new mini merkle sum tree + let mut mini_trees = Vec::new(); + for i in 1..=4 { + let mini_tree = MerkleSumTree::::from_csv(&format!( + "csv/entry_16_{}.csv", + i + )) + .unwrap(); + mini_trees.push(mini_tree); + } + let cryptocurrencies = mini_trees[0].cryptocurrencies().to_owned().to_vec(); + let aggregation_mst = + AggregationMerkleSumTree::::new(mini_trees, cryptocurrencies) + .unwrap(); + + let aggregation_mst_root = aggregation_mst.root(); + + // The entry_64.csv file is the aggregation of entry_16_1, entry_16_2, entry_16_3, entry_16_4 + let single_merkle_sum_tree = + MerkleSumTree::::from_csv("csv/entry_64.csv").unwrap(); + + assert_eq!( + aggregation_mst_root.hash, + single_merkle_sum_tree.root().hash + ); + } + #[test] fn test_aggregation_mst_overflow() { - // create new mini merkle sum trees. The accumulated balance for each mini tree is in the expected range - // note that the accumulated balance of the tree generated from entry_16_3 is just in the expected range for 1 unit + // create new mini merkle sum tree. The accumulated balance for each mini tree is in the expected range + // note that the accumulated balance of the tree generated from entry_16_4 is just in the expected range for 1 unit let merkle_sum_tree_1 = - MerkleSumTree::::new("src/data/entry_16_1.csv").unwrap(); + MerkleSumTree::::from_csv("csv/entry_16.csv").unwrap(); let merkle_sum_tree_2 = - MerkleSumTree::::new("src/data/entry_16_.csv").unwrap(); + MerkleSumTree::::from_csv("csv/entry_16_no_overflow.csv") + .unwrap(); // When creating the aggregation merkle sum tree, the accumulated balance of the two mini trees is not in the expected range, an error is thrown - let result = AggregationMerkleSumTree::::new(vec![ - merkle_sum_tree_1, - merkle_sum_tree_2.clone(), - ]); + let result = AggregationMerkleSumTree::::new( + vec![merkle_sum_tree_1, merkle_sum_tree_2.clone()], + merkle_sum_tree_2.cryptocurrencies().to_vec(), + ); if let Err(e) = result { assert_eq!( diff --git a/src/data/entry_16_1.csv b/src/data/entry_16_1.csv deleted file mode 100644 index 228b1db..0000000 --- a/src/data/entry_16_1.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -dxGaEAii;11888,41163 -MBlfbBGI;67823,18651 -lAhWlEWZ;18651,2087 -nuZweYtO;22073,55683 -gbdSwiuY;34897,83296 -RZNneNuP;83296,16881 -YsscHXkp;31699,35479 -RkLzkDun;2087,79731 -HlQlnEYI;30605,11888 -RqkZOFYe;16881,14874 -NjCSRAfD;41163,67823 -pHniJMQY;14874,22073 -dOGIMzKR;10032,10032 -HfMDmNLp;55683,34897 -xPLKzCBl;79731,30605 -AtwIxZHo;35479,31699 diff --git a/src/data/entry_16_2.csv b/src/data/entry_16_2.csv deleted file mode 100644 index b2183a2..0000000 --- a/src/data/entry_16_2.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -aaGaEAaa;11888,41163 -bblfbBGI;67823,18651 -cchWlEWZ;18651,2087 -ddZweYtO;22073,55683 -eedSwiuY;34897,83296 -ffNneNuP;83296,16881 -ggscHXkp;31699,35479 -hhLzkDun;2087,79731 -iiQlnEYI;30605,11888 -llkZOFYe;16881,14874 -mmCSRAfD;41163,67823 -nnniJMQY;14874,22073 -ooGIMzKR;10032,10032 -ppMDmNLp;55683,34897 -qqLKzCBl;79731,30605 -rrwIxZHo;35479,31699 \ No newline at end of file diff --git a/src/data/entry_16_3.csv b/src/data/entry_16_3.csv deleted file mode 100644 index 49dc935..0000000 --- a/src/data/entry_16_3.csv +++ /dev/null @@ -1,17 +0,0 @@ -username;balances -dxGaEAii;18446744073709551615,0 -MBlfbBGI;0,18446744073709551615 -lAhWlEWZ;0,0 -nuZweYtO;0,0 -gbdSwiuY;0,0 -RZNneNuP;0,0 -YsscHXkp;0,0 -RkLzkDun;0,0 -HlQlnEYI;0,0 -RqkZOFYe;0,0 -NjCSRAfD;0,0 -pHniJMQY;0,0 -dOGIMzKR;0,0 -HfMDmNLp;0,0 -xPLKzCBl;0,0 -AtwIxZHo;0,0 diff --git a/src/executor/cloud_spawner.rs b/src/executor/cloud_spawner.rs new file mode 100644 index 0000000..d98d975 --- /dev/null +++ b/src/executor/cloud_spawner.rs @@ -0,0 +1,188 @@ +use std::error::Error; +use std::sync::{ + atomic::{AtomicUsize, Ordering}, + Arc, +}; +use std::{future::Future, pin::Pin}; + +use bollard::network::ListNetworksOptions; +use bollard::service::{ListServicesOptions, UpdateServiceOptions}; +use tokio::sync::oneshot; + +use crate::executor::utils::get_specs_from_compose; +use crate::executor::{Executor, ExecutorSpawner}; + +pub struct CloudSpawner { + service_info: Option<(String, String)>, + worker_counter: Arc, + worker_node_url: Vec, + default_port: i64, +} + +/// CloudSpawner +/// +/// Designed for cloud-based resources and Docker Swarm, CloudSpawner is optimized for scalability and high availability. +/// While functioning similarly to LocalSpawner, it extends its capabilities by initializing workers on remote machines, making it particularly suitable for Swarm network setups. +/// +/// CloudSpawner can be utilized in two ways: +/// +/// - Without `service_info`, CloudSpawner does not directly manage Worker instances. +/// In this mode, it does not control or interact with the Docker API for worker management. +/// +/// - With `service_info`, CloudSpawner requires a `docker-compose` file. When provided with `service_info`, +/// it manages Docker services and networks, enabling dynamic scaling and orchestration of workers. +impl CloudSpawner { + pub fn new( + service_info: Option<(String, String)>, // If the user want to use docker-compose.yml for docker swarm + worker_node_url: Vec, + default_port: i64, + ) -> Self { + assert!(!worker_node_url.is_empty(), "Worker node url is empty"); + CloudSpawner { + service_info, + worker_counter: Arc::new(AtomicUsize::new(0)), + worker_node_url, + default_port, + } + } + + async fn create_service(service_name: &str, compose_path: &str) -> Result<(), Box> { + let docker = bollard::Docker::connect_with_local_defaults().unwrap(); + + // Retrieve network options and service spec from docker-compose.yml + let (network_options, service_spec) = + get_specs_from_compose(service_name, compose_path).unwrap(); + + // Check network exist then create if not exist + let list_network = docker + .list_networks(None::>) + .await?; + + let mut found_target_network = false; + list_network.iter().for_each(|network| { + if service_name == *network.name.as_ref().unwrap() { + found_target_network = true; + } + }); + + if !found_target_network { + match docker.create_network(network_options).await { + Ok(result) => println!("Network created: {:?}", result), + Err(error) => eprintln!("Error creating network: {}", error), + } + } + + // Checking service exist then create if not exist + let services = docker + .list_services(None::>) + .await?; + + let mut found_exist_service = false; + let mut service_version = 0; + + services.iter().for_each(|service| { + let retrieved_service_spec = service + .spec + .as_ref() + .ok_or::>("No spec in service on Docker".into()) + .unwrap(); + let retrieved_service_name = retrieved_service_spec + .name + .as_ref() + .ok_or::>("No name in service.spec on Docker".into()) + .unwrap(); + + if service_name == *retrieved_service_name { + found_exist_service = true; + + // Update service version + let retrieved_service_version = service + .version + .as_ref() + .ok_or::>("No version in service on Docker".into()) + .unwrap(); + if let Some(exist_version) = retrieved_service_version.index { + service_version = exist_version + 1; + } + } + }); + + if !found_exist_service { + docker.create_service(service_spec, None).await?; + println!("Service {:?} created", service_name); + } else { + println!( + "Service {:?} already exists, Will use the service", + service_name + ); + let update_service_options = UpdateServiceOptions { + version: service_version, + ..Default::default() + }; + let update_response = docker + .update_service(service_name, service_spec, update_service_options, None) + .await?; + update_response.warnings.iter().for_each(|warning| { + println!("warning: {:?}", warning); + }); + }; + Ok(()) + } +} + +impl ExecutorSpawner for CloudSpawner { + fn spawn_executor(&self) -> Pin + Send>> { + let (tx, rx) = oneshot::channel(); + + let current_worker_counter = self.worker_counter.load(Ordering::SeqCst); + + // Create service if the worker counter is 0, which means no executor is spawned. + if current_worker_counter == 0 && self.service_info.is_some() { + let (service_name, compose_path) = self.service_info.clone().unwrap(); + tokio::spawn(async move { + if let Err(e) = CloudSpawner::create_service(&service_name, &compose_path).await { + eprintln!("Error creating service: {}", e); + } else { + // Sleep for 5 seconds to wait for the service to be ready + std::thread::sleep(std::time::Duration::from_secs(5)); + let _ = tx.send(service_name.clone()); + println!("Service {} created", service_name); + } + }); + } + + // The traffic is routed to the service by the swarm manager. + // So, All executor can use the same exposed endpoint for distributing task to multiple workers. + let port = self.default_port; + let node_url = self.worker_node_url[current_worker_counter].clone(); + let worker_counter = self.worker_counter.clone(); + Box::pin(async move { + if worker_counter.load(Ordering::SeqCst) == 0 { + let _ = rx.await; + } + // Check if the URL already contains a port + let has_port = node_url.split(':').last().unwrap().parse::().is_ok(); + + // Append the port if it's not there + let final_url = if has_port { + node_url.clone() + } else { + format!("{}:{}", node_url, port) + }; + worker_counter.fetch_add(1, Ordering::SeqCst); + Executor::new(format!("http://{}", final_url), None) + }) + } + + fn terminate_executors(&self) -> Pin + Send>> { + let service_info = self.service_info.clone(); + Box::pin(async move { + if let Some((service_name, _)) = service_info.clone() { + let docker = bollard::Docker::connect_with_local_defaults().unwrap(); + + docker.delete_service(&service_name).await.unwrap(); + docker.remove_network(&service_name).await.unwrap(); + } + }) + } +} diff --git a/src/executor/local_spawner.rs b/src/executor/local_spawner.rs new file mode 100644 index 0000000..0ace6fe --- /dev/null +++ b/src/executor/local_spawner.rs @@ -0,0 +1,214 @@ +use bollard::{ + container::{Config, CreateContainerOptions, RemoveContainerOptions, StartContainerOptions}, + models::{HostConfig, PortBinding}, + service::ContainerInspectResponse, + Docker, +}; +use std::{ + collections::HashMap, + default::Default, + env, + error::Error, + future::Future, + net::{SocketAddr, TcpListener, IpAddr}, + pin::Pin, + sync::atomic::{AtomicUsize, Ordering}, str::FromStr, +}; +use tokio; +use tokio::sync::oneshot; + +use crate::executor::{Executor, ExecutorSpawner}; + +/// LocalSpawner +/// +/// The LocalSpawner is to use cases closer to actual deployment. It enables the initialization of Executors +/// and Workers within a local Docker environment. This spawner is ideal for development and testing phases, +/// where simplicity and direct control over the containers are beneficial. +pub struct LocalSpawner { + docker: Docker, + worker_counter: AtomicUsize, + image_name: String, + container_name: String, +} + +impl LocalSpawner { + pub fn new(image_name: String, container_name: String) -> Self { + let docker = match env::var("DOCKER_HOST") { + // Read `DOCKER_HOST` environment variable as default + Ok(host) => Docker::connect_with_http_defaults() + .unwrap_or_else(|_| panic!("Failed to connect to {} for using Docker", host)), + _ => Docker::connect_with_local_defaults() + .unwrap_or_else(|_| panic!("Failed to connect to Docker")), + }; + + LocalSpawner { + docker, + worker_counter: AtomicUsize::new(0), + image_name, + container_name, + } + } + + fn find_unused_port() -> Result { + // Bind to address with port 0. + // The OS will assign an available ephemeral port. + let listener = TcpListener::bind("127.0.0.1:0")?; + + // Retrieve the assigned port. + match listener.local_addr() { + Ok(SocketAddr::V4(addr)) => Ok(addr.port()), + Ok(SocketAddr::V6(addr)) => Ok(addr.port()), + Err(e) => Err(e), + } + } + + // Create a Docker instance connected to the local Docker daemon. + pub async fn create_container( + docker: Docker, + image_name: String, + container_name: String, + id: usize, + desirable_port: u16, + ) -> Result> { + let container_name = format!("{}_{}", container_name, id); + + // Define port mapping (container_port -> host_port) + let port_bindings = { + let mut port_bindings = HashMap::new(); + port_bindings.insert( + "4000/tcp".to_string(), // Container port + Some(vec![PortBinding { + host_ip: Some(IpAddr::from_str("127.0.0.1").unwrap().to_string()), // Host IP + host_port: Some(desirable_port.to_string()), // Host port + }]), + ); + port_bindings + }; + + let config = Config { + image: Some(image_name), + exposed_ports: Some(HashMap::from([("4000/tcp".to_string(), HashMap::<(), ()>::new())])), // Expose the container port + host_config: Some(HostConfig { + port_bindings: Some(port_bindings), + ..Default::default() + }), + ..Default::default() + }; + + // Create the container. + let create_container_options = CreateContainerOptions { + name: container_name.clone(), + platform: None, + }; + + docker + .create_container(Some(create_container_options), config.clone()) + .await?; + + docker + .start_container( + &container_name.clone(), + None::>, + ) + .await?; + + let container_info: ContainerInspectResponse = + docker.inspect_container(&container_name, None).await?; + + Ok(container_info) + } +} + +impl ExecutorSpawner for LocalSpawner { + fn spawn_executor(&self) -> Pin + Send>> { + // Using channel that onetime use, `oneshot`, to send container information + let (tx, rx) = oneshot::channel(); + + // These variables has to be cloned because these are moved into the async block + let docker_clone = self.docker.clone(); + let image_name = self.image_name.clone(); + let container_name = self.container_name.clone(); + let id = self.worker_counter.fetch_add(1, Ordering::SeqCst); + tokio::spawn(async move { + let desirable_port = LocalSpawner::find_unused_port().unwrap_or_default(); + let res = LocalSpawner::create_container( + docker_clone, + image_name, + container_name, + id, + desirable_port, + ) + .await; + match res { + Ok(container_info) => { + // the desirable_port is the port that is exposed to the host + let _ = tx.send((desirable_port, container_info)); + } + Err(e) => { + eprintln!("Error creating container: {}", e); + } + } + }); + + // Return a Future that resolves to Executor + Box::pin(async move { + // the container_info also has exposed port as 'host_port` field but it looks ugly to use it + let (exposed_port, container_info) = rx.await.expect("Failed to receive worker URL"); + let worker_url = format!( + "http://127.0.0.1:{}", // This port is exposed to the host + exposed_port + ); + Executor::new(worker_url, container_info.name) + }) + } + + fn terminate_executors(&self) -> Pin + Send>> { + let docker_clone = self.docker.clone(); + + let container_name = self.container_name.clone(); + let worker_counter = self.worker_counter.load(Ordering::SeqCst); + Box::pin(async move { + // Remove the container + let remove_options = RemoveContainerOptions { + force: true, // Force the removal of the container + ..Default::default() + }; + + for i in 0..worker_counter { + let container_name_with_id = format!("{}_{}", container_name, i); + if let Err(e) = docker_clone + .remove_container(&container_name_with_id, Some(remove_options)) + .await + { + eprintln!("Error removing container: {}", e); + } + } + }) + } +} + +#[cfg(feature = "docker")] +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn test_executor_spawner() { + let spawner = LocalSpawner::new( + "summadev/summa-aggregation-mini-tree:latest".to_string(), + "executor_test".to_string(), + ); + + // Spawn 2 executors + let executor_1 = spawner.spawn_executor().await; + let executor_2 = spawner.spawn_executor().await; + + // Sleep 2 seconds for the container to be ready + tokio::time::sleep(tokio::time::Duration::from_secs(2)).await; + assert!(!executor_1.get_url().is_empty()); + assert!(!executor_2.get_url().is_empty()); + + // Teardown + spawner.terminate_executors().await; + } +} diff --git a/src/executor/mock_spawner.rs b/src/executor/mock_spawner.rs new file mode 100644 index 0000000..d94f0a8 --- /dev/null +++ b/src/executor/mock_spawner.rs @@ -0,0 +1,114 @@ +use axum::{routing::post, Router}; +use std::{ + future::Future, + net::SocketAddr, + pin::Pin, + str::FromStr, + sync::atomic::{AtomicUsize, Ordering}, +}; +use tokio; +use tokio::sync::oneshot; + +use crate::executor::{Executor, ExecutorSpawner}; +use crate::mini_tree_generator::create_mst; + +/// MockSpawner +/// +/// Primarily used for testing purposes, the MockSpawner initializes Executors suitable for various test scenarios, +/// including negative test cases. It runs the `mini-tree-server` locally, allowing for a controlled testing environment. +pub struct MockSpawner { + urls: Option>, + worker_counter: AtomicUsize, +} + +impl MockSpawner { + pub fn new(urls: Option>) -> Self { + MockSpawner { + urls, + worker_counter: AtomicUsize::new(0), + } + } +} + +impl ExecutorSpawner for MockSpawner { + fn spawn_executor(&self) -> Pin + Send>> { + let (tx, rx) = oneshot::channel(); + + let id = self.worker_counter.fetch_add(1, Ordering::SeqCst); + + // If urls is not None, use the urls to spawn executors + if self.urls.is_some() && self.urls.as_ref().unwrap().len() > id { + let url = self.urls.as_ref().unwrap()[id].clone(); + let _ = tx.send(SocketAddr::from_str(&url).unwrap()); + + return Box::pin(async move { + let url = rx.await.expect("Failed to receive worker URL"); + let worker_url = format!("http://{}", url); + Executor::new(worker_url, None) + }); + } + + // if there is no url or already used all urls, spawn a new executor + tokio::spawn(async move { + let app = Router::new().route("/", post(create_mst)); + + // Bind to port 0 to let the OS choose a random port + let addr = SocketAddr::from(([127, 0, 0, 1], 0)); + + let server = axum::Server::bind(&addr).serve(app.into_make_service()); + + // Send worker url to rx + let _ = tx.send(server.local_addr()); + + // Start server + server.await.unwrap(); + }); + + // Return a Future that resolves to Executor + Box::pin(async move { + // load currnet worker counter + let url = rx.await.expect("Failed to receive worker URL"); + let worker_url = format!("http://{}", url); + Executor::new(worker_url, None) + }) + } + + fn terminate_executors(&self) -> Pin + Send>> { + Box::pin(async move { + // Nothing to do if no executors are running + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn test_new_urls() { + let spawner = MockSpawner::new(None); + + // Spawn 2 executors + let executor_1 = spawner.spawn_executor().await; + let executor_2 = spawner.spawn_executor().await; + + // Sleep 2 seconds for the container to be ready + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + assert!(!executor_1.get_url().is_empty()); + assert!(!executor_2.get_url().is_empty()); + } + + #[tokio::test] + async fn test_with_given_url() { + let urls = vec!["192.168.0.1:65535".to_string()]; + let spawner = MockSpawner::new(Some(urls)); + + // Spawn 2 executors + let executor_1 = spawner.spawn_executor().await; + let executor_2 = spawner.spawn_executor().await; + + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + assert_eq!(executor_1.get_url(), "http://192.168.0.1:65535"); + assert_ne!(executor_2.get_url(), "http://192.168.0.1:65535"); + } +} diff --git a/src/executor/mod.rs b/src/executor/mod.rs new file mode 100644 index 0000000..e0e7870 --- /dev/null +++ b/src/executor/mod.rs @@ -0,0 +1,87 @@ +mod cloud_spawner; +mod local_spawner; +mod mock_spawner; +mod spawner; +mod test; +mod utils; + +pub use cloud_spawner::CloudSpawner; +pub use local_spawner::LocalSpawner; +pub use mock_spawner::MockSpawner; +pub use spawner::ExecutorSpawner; + +use reqwest::Client; +use std::error::Error; +use tokio::time::{sleep, Duration}; + +use crate::json_mst::{JsonEntry, JsonMerkleSumTree}; +use summa_backend::merkle_sum_tree::MerkleSumTree; + +/// Executor role and functionality. +/// Acts as an intermediary between the Orchestrator and Workers, facilitating the data processing workflow. +/// Each Executor operates in a one-to-one relationship with a Worker, processing entry data into `mini-tree`. +/// +/// Key aspects of the Executor's role include: +/// - **Spawning and Connection**: Executors connect with Workers to execute tasks, enhancing the system's scalability. +/// - **Data Handling and Task Distribution**: Executors manage and distribute data entries, ensuring smooth workflow +/// - **Communication Bridge**: They facilitate communication within the data pipeline, relaying 'mini-tree' from Workers to the Orchestrator. +/// +/// Executors are dynamically spawned and connected to Workers for task execution. +#[derive(Clone)] +pub struct Executor { + client: Client, + url: String, + id: Option, +} + +impl Executor { + pub fn new(url: String, id: Option) -> Self { + Executor { + client: Client::new(), + url, + id, + } + } + + pub fn get_url(&self) -> String { + self.url.clone() + } + + pub fn get_name(&self) -> Option { + self.id.clone() + } + + pub async fn generate_tree( + &self, + json_entries: Vec, + ) -> Result, Box> + where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, + { + const MAX_RETRIES: u32 = 5; + const RETRY_DELAY: Duration = Duration::from_secs(1); + + let mut attempts = 0; + loop { + attempts += 1; + let response = self.client.post(&self.url).json(&json_entries).send().await; + + match response { + Ok(response) => { + let json_tree = response + .json::() + .await + .map_err(|err| Box::new(err) as Box)?; + + let tree = json_tree.to_mst().unwrap(); + return Ok(tree); + } + Err(_err) if attempts < MAX_RETRIES => { + sleep(RETRY_DELAY).await; + } + Err(err) => return Err(Box::new(err) as Box), + } + } + } +} diff --git a/src/executor/spawner.rs b/src/executor/spawner.rs new file mode 100644 index 0000000..64d5939 --- /dev/null +++ b/src/executor/spawner.rs @@ -0,0 +1,70 @@ +use std::{future::Future, pin::Pin}; + +use crate::executor::Executor; + +/// ExecutorSpawner responsibility and types. +/// +/// Responsible for initializing and terminating Executors, serving as a management point for creating Executor instances and Workers. +/// +/// Types include: +/// - MockSpawner: For testing, runs `mini-tree-server` locally. +/// - LocalSpawner: Initializes Executors and Workers in local Docker environments. +/// - CloudSpawner: Optimized for cloud resources and Docker Swarm, manages containers as services for scalability. +/// +/// Note: ExecutorSpawner is a trait with key methods `spawn_executor` and `terminate_executor`. +/// +pub trait ExecutorSpawner { + /// Spawns an executor asynchronously. + // + /// This method initializes an Executor and returns a Future that resolves to the Executor. + /// + /// To achieve this asynchronously (outside of an async trait function), we use a one-time channel ('oneshot`) to deliver the variables to the Future. + /// + /// Internally, it performs the following codelines: + /// + /// 1. Uses a 'oneshot'channel for sending the variables from the spawned async task. + /// ```ignore + /// let (tx, rx) = oneshot::channel(); + /// ``` + /// 2. Clones necessary variables (url, name and so on) to move them into the async block. + /// ```ignore + /// let url = self.url.clone(); + /// ``` + /// 3. Spawns an asynchronous task (`tokio::spawn`) that asynchronously creates a worker and sends back its information. + /// ```ignore + /// tokio::spawn(async move { + /// if let Ok(worker_info) = + /// Spawner::create_worker(url).await + /// { + /// let _ = tx.send(worker_info); + /// } + /// }); + /// Note that, the "create_worker" is typically declared in the "Spawner" struct that has "ExecutorSpawner"trait. + /// 4. Returns a Future that, upon completion, provides an Executor connected to the newly spawned worker. + /// ```ignore + /// Box::pin(async move { + /// let url = rx.await.expect("Failed to receive worker URL"); + /// Executor::new(url, None); + /// }); + /// ``` + /// + /// + // Returns: + // - "Pin + Send>>": A Future that, when awaited, yields an Executor instance and spawns a worker. + fn spawn_executor(&self) -> Pin + Send>>; + + /// Terminates all spawned executors (and/or workers) asynchronously. + /// + /// This method is responsible for gracefully shutting down all active executors (and/or workers) by calling + /// To do this, the "Spawner"may needs some fields for storing some accessing point to the workers, which are spawned with the executors. + /// For deliver variables to Future results, use a channel like the pattern at 'spawn_executor'. + /// + /// The termination process typically involves: + /// - Iterating through all active Executors and workers. + /// - Invoking kind of 'shutdown'on each executors and workers to initiate their shutdown. + /// - Awaiting the completion of all shutdown operations. + /// + // Returns: + // - "Pin + Send>>": A Future that, when awaited, indicates that all executors (and/or workers) have been terminated. + fn terminate_executors(&self) -> Pin + Send>>; +} diff --git a/src/executor/test.rs b/src/executor/test.rs new file mode 100644 index 0000000..e415ff2 --- /dev/null +++ b/src/executor/test.rs @@ -0,0 +1,80 @@ +#![allow(unused_imports)] +use futures::future; +use std::error::Error; + +use bollard::models::TaskSpecContainerSpec; + +use crate::executor::{spawner::ExecutorSpawner, utils::get_specs_from_compose, MockSpawner}; +use crate::json_mst::JsonEntry; +use summa_backend::merkle_sum_tree::utils::parse_csv_to_entries; + +#[test] +fn test_util_get_specs_from_compose() { + let (network_options, service_spec) = + get_specs_from_compose("mini_tree", "docker-compose.yml").unwrap(); + + let service_name = "mini_tree"; + assert_eq!(network_options.name, service_name); + assert_eq!(network_options.driver, "overlay"); + + assert_eq!(service_spec.name.unwrap(), service_name); + assert!(service_spec.mode.is_some()); + assert!(service_spec.task_template.is_some()); + assert!(service_spec.endpoint_spec.is_some()); + assert_eq!( + service_spec.task_template.unwrap().container_spec.unwrap(), + TaskSpecContainerSpec { + image: Some("summadev/summa-aggregation-mini-tree:latest".to_string()), + ..Default::default() + } + ); +} + +#[tokio::test] +async fn test_executor() -> Result<(), Box> { + let spawner = MockSpawner::new(None); + let executor = spawner.spawn_executor().await; + + let (_, entries) = parse_csv_to_entries::<_, 2, 14>("csv/entry_16.csv").unwrap(); + let json_entries = entries + .iter() + .map(JsonEntry::from_entry) + .collect::>(); + let merkle_sum_tree = executor.generate_tree::<2, 14>(json_entries).await.unwrap(); + + spawner.terminate_executors().await; + + assert_eq!(merkle_sum_tree.index_of_username("dxGaEAii").unwrap(), 0); + Ok(()) +} + +#[tokio::test] +async fn test_executor_block() -> Result<(), Box> { + let spawner = MockSpawner::new(None); + let executor = spawner.spawn_executor().await; + + // Parse two csv files + let (_, entries_1) = parse_csv_to_entries::<_, 2, 14>("csv/entry_16.csv").unwrap(); + let (_, entries_2) = parse_csv_to_entries::<_, 2, 14>("csv/entry_16.csv").unwrap(); + + // Convert entries to json_entries + let json_entries_1 = entries_1 + .iter() + .map(JsonEntry::from_entry) + .collect::>(); + let json_entries_2 = entries_2 + .iter() + .map(JsonEntry::from_entry) + .collect::>(); + + let merkle_tree_1 = executor.generate_tree::<2, 14>(json_entries_1); + let merkle_tree_2 = executor.generate_tree::<2, 14>(json_entries_2); + + let all_tree = future::join_all([merkle_tree_1, merkle_tree_2]).await; + + spawner.terminate_executors().await; + + assert_eq!(all_tree.len(), 2); + + Ok(()) +} diff --git a/src/executor/utils.rs b/src/executor/utils.rs new file mode 100644 index 0000000..ecc0482 --- /dev/null +++ b/src/executor/utils.rs @@ -0,0 +1,159 @@ +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::error::Error; + +use bollard::models::{ + NetworkAttachmentConfig, ServiceSpec, ServiceSpecMode, ServiceSpecModeReplicated, TaskSpec, + TaskSpecContainerSpec, TaskSpecPlacement, +}; +use bollard::network::CreateNetworkOptions; +use bollard::service::{EndpointPortConfig, EndpointPortConfigPublishModeEnum, EndpointSpec}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct DockerCompose { + pub version: String, + pub services: HashMap, + pub networks: Option>, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Service { + pub image: String, + pub ports: Option>, + pub deploy: Option, + pub networks: Option>, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Port { + pub target: i64, + pub published: i64, + pub published_mode: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Deploy { + pub mode: Option, + pub placement: Option, + pub replicas: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Placement { + pub constraints: Option>, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Network { + driver: Option, +} + +// This helper function return `CreateNetworkOptions` and `ServiceSpec` from `docker-compose.yml` +pub fn get_specs_from_compose( + service_name: &str, + file_path: &str, +) -> Result<(CreateNetworkOptions, ServiceSpec), Box> { + let file_content = std::fs::read_to_string(file_path).expect("Unable to read file"); + let compose = serde_yaml::from_str::(&file_content)?; + + // Declare docker client & default labels + let mut labels = HashMap::new(); + labels.insert( + String::from("Summa"), + String::from("Dummy key / value for bollard"), + ); + + // Retrieve network options from docker-compose.yml + let mut network_options = CreateNetworkOptions::::default(); + compose + .networks + .ok_or("There is no network configuration") + .unwrap() + .iter() + .for_each(|(network_name, network)| { + if network_name == service_name { + network_options.name = network_name.to_string(); + network_options.driver = network.driver.clone().unwrap_or("overlay".to_string()); + network_options.labels = labels.clone(); + } + }); + + if network_options.name.is_empty() { + return Err(format!( + "Network name is empty, It may not exist network name: '{}' in docker-compose file", + service_name + ) + .into()); + } + + // Retrieve service spec from docker-compose.yml + let service_spec = match compose.services.get(service_name) { + Some(service) => { + // Parse these variables from docker-compose.yml + let ports = service.ports.as_ref().ok_or("There is no 'ports' field")?; + let endpoint_port_config = ports + .iter() + .map(|port| EndpointPortConfig { + target_port: Some(port.target), + published_port: Some(port.published), + publish_mode: Some(EndpointPortConfigPublishModeEnum::INGRESS), + ..Default::default() + }) + .collect::>(); + + let deploy = service + .deploy + .as_ref() + .ok_or("There is no 'deploy' field")?; + let parsed_replicas = deploy + .replicas + .ok_or("There is no 'replicas' under 'deploy' field")?; + let parsed_contraint = deploy + .placement + .as_ref() + .ok_or("There is no 'placement' field")? + .constraints + .as_ref() + .ok_or("There is no 'constraints' under 'placement' field")?; + + ServiceSpec { + name: Some(String::from(service_name)), + mode: Some(ServiceSpecMode { + replicated: Some(ServiceSpecModeReplicated { + replicas: Some(parsed_replicas), + }), + ..Default::default() + }), + task_template: Some(TaskSpec { + placement: Some(TaskSpecPlacement { + constraints: Some(parsed_contraint.to_owned()), + ..Default::default() + }), + container_spec: Some(TaskSpecContainerSpec { + image: Some(service.image.clone()), + ..Default::default() + }), + ..Default::default() + }), + endpoint_spec: Some(EndpointSpec { + mode: None, + ports: Some(endpoint_port_config), + }), + networks: Some(vec![NetworkAttachmentConfig { + target: Some(service_name.to_string()), + ..Default::default() + }]), + ..Default::default() + } + } + None => { + return Err(format!( + "Service name: '{}' not found in docker-compose file", + service_name + ) + .into()) + } + }; + + Ok((network_options, service_spec)) +} diff --git a/src/json_mst.rs b/src/json_mst.rs new file mode 100644 index 0000000..82f4790 --- /dev/null +++ b/src/json_mst.rs @@ -0,0 +1,175 @@ +use num_bigint::BigUint; +use serde::{Deserialize, Serialize}; +use std::error::Error; + +use halo2_proofs::halo2curves::{bn256::Fr as Fp, group::ff::PrimeField}; + +use summa_backend::merkle_sum_tree::{Cryptocurrency, Entry, MerkleSumTree, Node, Tree}; + +/// JsonNode +/// Represents a entry in the Merkle Sum Tree in JSON format. +/// The balance in the Merkle Sum Tree was presented BigUint format, but in the JSON format, it is presented as a string. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct JsonEntry { + pub username: String, + pub balances: Vec, +} + +/// JsonNode +/// Represents a node in the Merkle Sum Tree in JSON format. +/// The balance in the Merkle Sum Tree was presented BigUint format, but in the JSON format, it is presented as a string. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct JsonNode { + pub hash: String, + pub balances: Vec, +} + +/// JsonMerkleSumTree +/// Represents the entire Merkle Sum Tree in JSON format. +/// It is used for transmitting tree data between the executor and mini-tree-server. +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct JsonMerkleSumTree { + pub root: JsonNode, + pub nodes: Vec>, + pub depth: usize, + pub entries: Vec, + pub is_sorted: bool, +} + +pub fn convert_node_to_json(node: &Node) -> JsonNode { + JsonNode { + hash: format!("{:?}", node.hash), + balances: node.balances.iter().map(|b| format!("{:?}", b)).collect(), + } +} + +fn parse_fp_from_hex(hex_str: &str) -> Fp { + let bigint = BigUint::parse_bytes(hex_str[2..].as_bytes(), 16).unwrap(); + Fp::from_str_vartime(&bigint.to_str_radix(10)).unwrap() +} + +impl JsonEntry { + pub fn new(username: String, balances: Vec) -> Self { + JsonEntry { username, balances } + } + + /// Converts an `Entry` to a `JsonEntry`. + /// + /// This method translates an `Entry` into its JSON format. + /// It is used by the Executor to send Entry data to the mini-tree-server in JSON format. + pub fn from_entry(entry: &Entry) -> Self { + JsonEntry::new( + entry.username().to_string(), + entry + .balances() + .iter() + .map(|balance| balance.to_string()) + .collect(), + ) + } + + /// Converts a `JsonEntry` back to an `Entry`. + /// + /// This method is utilized by the mini-tree-server when processing data received from the executor in JSON format. + /// It converts `JsonEntry` objects back to the `Entry` struct, facilitating the construction of the Merkle Sum Tree. + pub fn to_entry(&self) -> Entry { + let mut balances: [BigUint; N_CURRENCIES] = std::array::from_fn(|_| BigUint::from(0u32)); + self.balances.iter().enumerate().for_each(|(i, balance)| { + balances[i] = balance.parse::().unwrap(); + }); + + Entry::::new(self.username.clone(), balances).unwrap() + } +} + +/// Converts a `JsonNode` back to a `Node` for reconstructing the Merkle Sum Tree from JSON data. +impl JsonNode { + pub fn to_node(&self) -> Node { + let hash = parse_fp_from_hex(&self.hash); + let balances = self + .balances + .iter() + .map(|balance| parse_fp_from_hex(balance)) + .collect::>() + .try_into() + .expect("Incorrect number of balances"); + + Node { hash, balances } + } +} + +impl JsonMerkleSumTree { + /// Converts a MerkleSumTree to its JSON representation. + /// + /// This function is essential for the mini-tree-server to send the Merkle Sum Tree results back to the executor in JSON format, + /// facilitating the translation of the tree structure into a universally readable JSON form. + pub fn from_tree( + tree: MerkleSumTree, + ) -> Self { + let root = convert_node_to_json(tree.root()); + let nodes = tree + .nodes() + .iter() + .map(|node| node.iter().map(convert_node_to_json).collect()) + .collect(); + let entries = tree + .entries() + .iter() + .map(|entry| { + JsonEntry::new( + entry.username().to_string(), + entry.balances().iter().map(|b| b.to_string()).collect(), + ) + }) + .collect(); + + JsonMerkleSumTree { + root, + nodes, + depth: *tree.depth(), + entries, + is_sorted: false, + } + } + + /// Converts a JsonMerkleSumTree back to a MerkleSumTree. + /// + /// This function is crucial when handling data received in JSON format from the mini-tree-server. + /// It rebuilds the MerkleSumTree on the main machine using the `from_params` method. + /// This method is preferred over `from_entries` as the nodes are pre-computed by the mini-tree-server, thus the tree doesn't need to be recomputed from scratch. + pub fn to_mst( + &self, + ) -> Result, Box> + where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, + { + let root: Node = self.root.to_node::(); + let nodes = self + .nodes + .iter() + .map(|node| node.iter().map(|n| n.to_node()).collect()) + .collect(); + let entries = self + .entries + .iter() + .map(|entry| entry.to_entry::()) + .collect(); + let cryptocurrencies = vec![ + Cryptocurrency { + name: "Dummy".to_string(), + chain: "ETH".to_string(), + }; + N_CURRENCIES + ]; + + MerkleSumTree::::from_params( + root, + nodes, + self.depth, + entries, + cryptocurrencies, + self.is_sorted, + ) + } +} diff --git a/src/lib.rs b/src/lib.rs index cc00c82..bd2a152 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,6 @@ #![feature(generic_const_exprs)] - pub mod aggregation_merkle_sum_tree; +pub mod executor; +pub mod json_mst; +pub mod mini_tree_generator; +pub mod orchestrator; diff --git a/src/mini_tree_generator.rs b/src/mini_tree_generator.rs new file mode 100644 index 0000000..bfb84df --- /dev/null +++ b/src/mini_tree_generator.rs @@ -0,0 +1,61 @@ +use axum::{extract::Json, http::StatusCode, response::IntoResponse}; +use const_env::from_env; + +use crate::json_mst::{JsonEntry, JsonMerkleSumTree}; +use summa_backend::merkle_sum_tree::{Cryptocurrency, Entry, MerkleSumTree}; + +/// Mini Tree Generator is designed to create Merkle Sum Tree using the Axum web framework. +/// It primarily handles HTTP requests to generate tree based on provided JSON entries. +/// +/// Constants: +/// - `N_CURRENCIES`: The number of cryptocurrencies involved. Set via environment variables. +/// - `N_BYTES`: The byte size for each entry. Set via environment variables. +/// +/// Functions: +/// - `create_mst`: An asynchronous function that processes incoming JSON requests to generate a Merkle Sum Tree. +/// It converts `JsonEntry` objects into `Entry` instances and then constructs the `MerkleSumTree`. +/// The function handles the conversion of the `MerkleSumTree` into a JSON format (`JsonMerkleSumTree`) for the response. +/// +#[from_env] +const N_CURRENCIES: usize = 2; +#[from_env] +const N_BYTES: usize = 14; + +pub async fn create_mst( + Json(json_entries): Json>, +) -> Result)> { + // Convert `JsonEntry` -> `Entry` + let entries = json_entries + .iter() + .map(|json_entry| json_entry.to_entry()) + .collect::>>(); + let crypcocurrencies = vec![ + Cryptocurrency { + name: "DUMMY".to_string(), + chain: "ETH".to_string(), + }; + N_CURRENCIES + ]; + + #[cfg(not(test))] + let entries_length = entries.len(); + #[cfg(not(test))] + let starting_time = std::time::Instant::now(); + + // Create `MerkleSumTree` from `parsed_entries` + let tree = + MerkleSumTree::::from_entries(entries, crypcocurrencies, false) + .unwrap(); + + #[cfg(not(test))] + println!( + "Time to create tree({} entries): {}ms", + entries_length, + starting_time.elapsed().as_millis() + ); + + // Convert `MerkleSumTree` to `JsonMerkleSumTree` + let json_tree = JsonMerkleSumTree::from_tree(tree); + + Ok((StatusCode::OK, Json(json_tree))) +} diff --git a/src/orchestrator/mod.rs b/src/orchestrator/mod.rs new file mode 100644 index 0000000..d2e9b05 --- /dev/null +++ b/src/orchestrator/mod.rs @@ -0,0 +1,258 @@ +mod test; + +use futures::future::join_all; +use std::{cmp::min, error::Error}; +use summa_backend::merkle_sum_tree::{utils::parse_csv_to_entries, Cryptocurrency, MerkleSumTree}; +use tokio::sync::mpsc; +use tokio_util::sync::CancellationToken; + +use crate::aggregation_merkle_sum_tree::AggregationMerkleSumTree; +use crate::executor::ExecutorSpawner; +use crate::json_mst::JsonEntry; + +/// The Orchestrator in Summa Aggregation +/// +/// It serves as the central management component, coordinating data processing activities +/// between Executors and Workers, thereby improving the efficiency of building the Merkle sum tree. +/// +/// Functions include dynamically spawning Executors, managing task distribution, +/// handling errors and pipeline control, and building the `AggregationMerkleSumTree` +/// by aggregating mini-trees constructed by the Workers. +pub struct Orchestrator { + executor_spawner: Box, + entry_csvs: Vec, +} + +impl Orchestrator { + pub fn new(executor_spawner: Box, entry_csvs: Vec) -> Self { + Self { + executor_spawner, + entry_csvs, + } + } + + /// Calculate the range of tasks to be assigned to a executor. + /// + /// Parameters: + /// * `executor_index` - The index of the executor. + /// * `total_executors` - The total number of executors. + /// + /// Returns: + /// (start, end) + /// A tuple representing the start and end indices of the tasks assigned to the executor + /// + /// The first value in the tuple, the `start` index, indicates the beginning of the task range for the executor, + /// while the second value, the `end` index, specifies the end of the range (exclusive). + /// + /// This calculation divides the total number of tasks by the number of executors to distribute tasks evenly. + /// For instance, if there are 5 tasks and 2 executors, the tasks will be split as follows: + /// Executor_1: [1, 2, 3] (start index 0, end index 3) + /// Executor_2: [4, 5] (start index 3, end index 5) + fn calculate_task_range( + &self, + executor_index: usize, + total_executors: usize, + ) -> (usize, usize) { + let total_tasks = self.entry_csvs.len(); + let base_tasks_per_executor = total_tasks / total_executors; + let extra_tasks = total_tasks % total_executors; + + let start = executor_index * base_tasks_per_executor + min(executor_index, extra_tasks); + let end = + (executor_index + 1) * base_tasks_per_executor + min(executor_index + 1, extra_tasks); + + (start, min(end, total_tasks)) + } + + /// Processes a list of CSV files concurrently using executors and aggregates the results. + /// This involves splitting the CSV files based on available executors, distributing tasks, + /// and aggregating the results into an `AggregationMerkleSumTree`. + /// + /// * `executor_count` - The number of executors to use.\ + /// + /// Note: After processing, executors are terminated to release resources. + /// + /// Data flow + /// + /// 1. Splits the list of CSV files into segments based on the number of available executors. + /// 2. A distribution thread loads each CSV file, parses it into `entries`, and sends these to `entries_tx`. + /// 3. Each executor receives `entries` from `entries_rx`, requests tasks to Worker, and sends results back through `tree_tx`. + /// 4. The processed data from all executors, collected from `tree_rx`, is aggregated into an `AggregationMerkleSumTree`. + /// 5. After processing, executors are terminated to release resources. + /// + pub async fn create_aggregation_mst( + self, + executor_count: usize, + ) -> Result, Box> + where + [usize; N_CURRENCIES + 1]: Sized, + [usize; N_CURRENCIES + 2]: Sized, + { + let entries_per_executor = self.entry_csvs.len() / executor_count; + + let mut executors = Vec::new(); + let mut result_collectors = Vec::new(); + + let channel_size = std::env::var("CHANNEL_SIZE") + .unwrap_or_default() + .parse::() + .unwrap_or(32); + + let cancel_token = CancellationToken::new(); + let actual_number_of_workers = min(executor_count, self.entry_csvs.len()); + for i in 0..actual_number_of_workers { + // Declare channels for communication + // + // There are three channels are used inthis method. + // + // - A `entries_tx` receives parsed data from the entry parser to distribute tasks to executors. + // - A `tree_tx` channel is used by the executors to send the results of the tasks. + // + let (entries_tx, mut entries_rx) = mpsc::channel(channel_size); + let (tree_tx, tree_rx) = mpsc::channel(channel_size); + // Executor + // + // Spawn executors that process entries with Worker. + // + // - Receives 'entries' from [entries_rx] channel. + // - Processes 'entries' to build a merkle sum tree (done by worker). + // - Sends the resulting 'tree' back via [tree_tx] channel. + // + let executor = self.executor_spawner.spawn_executor().await; + result_collectors.push((i, tree_rx)); + + let cloned_cancel_token = cancel_token.clone(); + executors.push(tokio::spawn(async move { + loop { + tokio::select! { + entries_data = entries_rx.recv() => { + // When the distribution thread is finished, the channel will be closed. + let entries = match entries_data { + Some(entries) => entries, + None => break, + }; + let processed_task = match executor.generate_tree::(entries).await { + Ok(entries) => entries, + Err(e) => { + eprintln!("Executor_{:?}: error while processing entries {:?}", i, e); + cloned_cancel_token.cancel(); + break; + } + }; + if tree_tx.send(processed_task).await.is_err() { + eprintln!("Executor_{:?}: Error while sending tree result", i); + cloned_cancel_token.cancel(); + break; + } + }, + _ = cloned_cancel_token.cancelled() => { + eprintln!("Executor_{:?}: cancel signal received, terminating.", i); + break; + }, + } + } + })); + + // Distributing Tasks + // + // Spawn a distribution thread that distributes entries to executors + // + // - Loads CSV file from [csv_file_path]. + // - Parses CSV file into 'entries'. + // - Sends 'entries' to executors via [entries_tx] channel. + // + let (start, end) = self.calculate_task_range(i, executor_count); + let entry_csvs_slice = self.entry_csvs[start..end].to_vec(); // Clone only the necessary slice + + let cloned_cancel_token = cancel_token.clone(); + tokio::spawn(async move { + for file_path in entry_csvs_slice.iter() { + let entries = match parse_csv_to_entries::<_, N_CURRENCIES, N_BYTES>(file_path) + { + Ok((_, entries)) => entries + .iter() + .map(JsonEntry::from_entry) + .collect::>(), + Err(e) => { + eprintln!( + "Executor_{:?}: Error while processing file {:?}: {:?}", + i, file_path, e + ); + cloned_cancel_token.cancel(); + break; + } + }; + + tokio::select! { + _ = cloned_cancel_token.cancelled() => { + eprintln!("Executor_{:?}: cancel signal received, terminating distributor.", i); + break; + }, + send_entries = entries_tx.send(entries) => { + if let Err(e) = send_entries { + eprintln!("Executor_{:?}: Error while sending entries: {:?}", i, e); + cloned_cancel_token.cancel(); + break; + } + } + } + } + drop(entries_tx); + }); + } + + // Collecting Results + // + // Collect `tree` results from executors + // + // - Receives processed 'tree' from [tree_rx] channel. + // - Collects all 'tree' results into 'all_tree_results'. + // - Aggregates 'all_tree_results' into 'ordered_tree_results'. + // + let mut all_tree_responses = Vec::new(); + for (index, mut tree_rx) in result_collectors { + let executor_results = tokio::spawn(async move { + let mut trees = Vec::new(); + while let Some(result) = tree_rx.recv().await { + trees.push(result); + } + (index, trees) + }); + all_tree_responses.push(executor_results); + } + + let all_tree_results = join_all(all_tree_responses).await; + + // Aggregate results from all workers in order + let mut ordered_tree_results = vec![None; self.entry_csvs.len()]; + for result in all_tree_results { + let (index, worker_results) = result.unwrap(); + let start = index * entries_per_executor; + for (i, res) in worker_results.iter().enumerate() { + ordered_tree_results[start + i] = Some(res.clone()); + } + } + + // Terminate executors + self.executor_spawner.terminate_executors().await; + + let all_merkle_sum_tree: Vec> = + ordered_tree_results.into_iter().flatten().collect(); + + // Occur error if the number of mini_tree in 'all_merkle_sum_tree' is not equal to the number of entry_csvs. + if all_merkle_sum_tree.len() != self.entry_csvs.len() { + return Err("Mismatch in generated mini tree counts and given CSV counts".into()); + } + + AggregationMerkleSumTree::new( + all_merkle_sum_tree, + vec![ + Cryptocurrency { + name: "DUMMY".to_string(), + chain: "ETH".to_string(), + }; + N_CURRENCIES + ], + ) + } +} diff --git a/src/orchestrator/test.rs b/src/orchestrator/test.rs new file mode 100644 index 0000000..aff5cca --- /dev/null +++ b/src/orchestrator/test.rs @@ -0,0 +1,106 @@ +#![allow(unused_imports)] +use crate::executor::{CloudSpawner, LocalSpawner, MockSpawner}; +use crate::orchestrator::Orchestrator; +use summa_backend::merkle_sum_tree::Tree; + +#[tokio::test] +async fn test_single_mock_worker() { + let spawner = MockSpawner::new(None); + + let orchestrator = Orchestrator::<2, 14>::new( + Box::new(spawner), + vec![ + "csv/entry_16_1.csv".to_string(), + "csv/entry_16_2.csv".to_string(), + ], + ); + let aggregation_merkle_sum_tree = orchestrator.create_aggregation_mst(1).await.unwrap(); + + assert_eq!(16, aggregation_merkle_sum_tree.mini_tree(0).entries().len()); + assert_eq!(16, aggregation_merkle_sum_tree.mini_tree(1).entries().len()); +} + +#[tokio::test] +async fn test_none_exist_csv() { + let spawner = MockSpawner::new(None); + let orchestrator = Orchestrator::<2, 14>::new( + Box::new(spawner), + vec![ + "csv/entry_16.csv".to_string(), + "csv/no_exist.csv".to_string(), + ], + ); + match orchestrator.create_aggregation_mst(2).await { + Ok(_) => panic!("Expected an error"), + Err(e) => { + assert!(e + .to_string() + .contains("Mismatch in generated mini tree counts and given CSV counts")); + } + } +} + +#[tokio::test] +async fn test_none_exist_worker() { + let non_exist_worker_url = vec!["127.0.0.1:40".to_string()]; // unsignable port + let spawner = MockSpawner::new(Some(non_exist_worker_url)); + + let orchestrator = Orchestrator::<2, 14>::new( + Box::new(spawner), + vec![ + "csv/entry_16_1.csv".to_string(), + "csv/entry_16_2.csv".to_string(), + ], + ); + + match orchestrator.create_aggregation_mst(2).await { + Ok(_) => panic!("Expected an error"), + Err(e) => { + assert!(e + .to_string() + .contains("Mismatch in generated mini tree counts and given CSV counts")); + } + } +} + +// #[cfg(feature = "docker")] +#[tokio::test] +async fn test_with_containers() { + let spawner = LocalSpawner::new( + "summadev/summa-aggregation-mini-tree:latest".to_string(), + "orchestrator_test".to_string(), + ); + + let orchestrator = Orchestrator::<2, 14>::new( + Box::new(spawner), + vec![ + "csv/entry_16_1.csv".to_string(), + "csv/entry_16_2.csv".to_string(), + ], + ); + let aggregation_merkle_sum_tree = orchestrator.create_aggregation_mst(2).await.unwrap(); + + assert_eq!(16, aggregation_merkle_sum_tree.mini_tree(0).entries().len()); + assert_eq!(16, aggregation_merkle_sum_tree.mini_tree(1).entries().len()); +} + +#[cfg(feature = "docker-swarm")] +#[tokio::test] +async fn test_with_swarm_service() { + let spawner = CloudSpawner::new( + Some(("mini_tree".to_string(), "docker-compose.yml".to_string())), + vec!["10.0.0.1".to_string(), "10.0.0.2".to_string()], + 4000, + ); + + let orchestrator = Orchestrator::<2, 14>::new( + Box::new(spawner), + vec![ + "csv/entry_16_1.csv".to_string(), + "csv/entry_16_2.csv".to_string(), + ], + ); + let aggregation_merkle_sum_tree = orchestrator.create_aggregation_mst(2).await.unwrap(); + assert_eq!(16, aggregation_merkle_sum_tree.mini_tree(0).entries().len()); + assert_eq!(16, aggregation_merkle_sum_tree.mini_tree(1).entries().len()); +}