diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..4174590aa --- /dev/null +++ b/.dockerignore @@ -0,0 +1,19 @@ +# Ignore everything +* + +# Allow files and directories +!/Cargo.lock +!/Cargo.toml +!/config.toml +!/docker/entrypoint.sh +!/lib +!/primitives +!/raiko-guest +!/raiko-host +!/rust-toolchain +!/sgx-ra +!/taiko.toml + +# Ignore unnecessary files inside allowed directories +# This should go after the allowed directories +**/raiko-host/guests/sgx diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index deb5b107a..38f96b0fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: - branches: [ "main" ] + branches: ["main"] pull_request: env: @@ -18,36 +18,36 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - uses: risc0/risc0/.github/actions/rustup@release-0.18 - - uses: risc0/risc0/.github/actions/sccache@release-0.18 - - run: cargo install cargo-risczero && cargo risczero install - - run: cargo test --workspace --all-targets --all-features + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: risc0/risc0/.github/actions/rustup@release-0.18 + - uses: risc0/risc0/.github/actions/sccache@release-0.18 + # - run: cargo install cargo-risczero && cargo risczero install + - run: cargo test --workspace --all-targets --all-features --exclude sgx-ra clippy: name: clippy runs-on: ubuntu-latest timeout-minutes: 30 steps: - - uses: actions/checkout@v3 - with: - submodules: recursive - - uses: risc0/risc0/.github/actions/rustup@release-0.18 - - uses: risc0/risc0/.github/actions/sccache@release-0.18 - - uses: risc0/clippy-action@main - with: - reporter: 'github-pr-check' - fail_on_error: true - github_token: ${{ secrets.GITHUB_TOKEN }} - clippy_flags: --workspace --all-targets --all-features -- -Dwarnings + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: risc0/risc0/.github/actions/rustup@release-0.18 + - uses: risc0/risc0/.github/actions/sccache@release-0.18 + - uses: risc0/clippy-action@main + with: + reporter: "github-pr-check" + fail_on_error: true + github_token: ${{ secrets.GITHUB_TOKEN }} + clippy_flags: --workspace --all-targets --all-features -- -Dwarnings fmt: name: fmt runs-on: ubuntu-latest timeout-minutes: 10 steps: - - uses: actions/checkout@v3 - - uses: risc0/risc0/.github/actions/rustup@release-0.18 - - run: cargo fmt --all --check + - uses: actions/checkout@v3 + - uses: risc0/risc0/.github/actions/rustup@release-0.18 + - run: cargo fmt --all --check diff --git a/.gitignore b/.gitignore index 80d138c41..b953fc87c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ tmp/ log.txt *.pb rpc_cache.json -.idea \ No newline at end of file +.idea +*.json.gz +raiko-host/guests/sgx/raiko-guest diff --git a/.vscode/settings.json b/.vscode/settings.json index 74729e90e..e3c59b6bd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,4 @@ { - "rust-analyzer.cargo.features": "all", - "rust-analyzer.linkedProjects": [ - "./Cargo.toml", - "./guests/eth-block/Cargo.toml", - "./testing/ef-tests/testguest/Cargo.toml" - ] -} \ No newline at end of file + "rust-analyzer.cargo.features": "all", + "rust-analyzer.linkedProjects": ["./Cargo.toml"] +} diff --git a/Cargo.lock b/Cargo.lock index 8168d4503..5cc254d87 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,39 +2,13 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "addchain" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2e69442aa5628ea6951fa33e24efe8313f4321a91bd729fc2f75bdfc858570" -dependencies = [ - "num-bigint 0.3.3", - "num-integer", - "num-traits", -] - -[[package]] -name = "addr2line" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" -dependencies = [ - "cpp_demangle", - "fallible-iterator", - "gimli 0.27.3", - "memmap2", - "object 0.31.1", - "rustc-demangle", - "smallvec", -] - [[package]] name = "addr2line" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ - "gimli 0.28.0", + "gimli", ] [[package]] @@ -45,13 +19,14 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -69,6 +44,34 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "alloy-dyn-abi" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e0daba57ddaba12dc9b21f608b843251f3de017f94a431dca4e7f4f72e5ba9" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-type-parser", + "alloy-sol-types", + "const-hex", + "itoa", + "serde", + "serde_json", +] + +[[package]] +name = "alloy-json-abi" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63c9319ad8b2b623c6a3ac15899f8ffb71479224762dbaedc385c16efbb6cfe3" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + [[package]] name = "alloy-primitives" version = "0.4.2" @@ -112,6 +115,44 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "alloy-sol-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a98ad1696a2e17f010ae8e43e9f2a1e930ed176a8e3ff77acfeff6dfb07b42c" +dependencies = [ + "const-hex", + "dunce", + "heck 0.4.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.38", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81c61ccc29e7c58bf16a2f780898852348183f58b127bde03ced6d07ad544787" +dependencies = [ + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98d7107bed88e8f09f0ddcc3335622d87bfb6821f3e0c7473329fb1cfad5e015" +dependencies = [ + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -127,6 +168,15 @@ dependencies = [ "libc", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anstream" version = "0.6.4" @@ -328,9 +378,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", @@ -348,6 +398,17 @@ dependencies = [ "rustc_version 0.4.0", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + [[package]] name = "auto_impl" version = "1.1.0" @@ -366,27 +427,18 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "autotools" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef8da1805e028a172334c3b680f93e71126f2327622faef2ec3d893c0a4ad77" -dependencies = [ - "cc", -] - [[package]] name = "backtrace" version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ - "addr2line 0.21.0", + "addr2line", "cc", "cfg-if", "libc", "miniz_oxide", - "object 0.32.1", + "object", "rustc-demangle", ] @@ -404,9 +456,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "base64ct" @@ -423,13 +475,36 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.65.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" +dependencies = [ + "bitflags 1.3.2", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.38", + "which", +] + [[package]] name = "bindgen" version = "0.66.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "cexpr", "clang-sys", "lazy_static", @@ -452,9 +527,15 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "bit-vec", + "bit-vec 0.6.3", ] +[[package]] +name = "bit-vec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f59bbe95d4e52a6398ec21238d31577f2b28a9d86807f06ca59d191d8440d0bb" + [[package]] name = "bit-vec" version = "0.6.3" @@ -469,9 +550,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" dependencies = [ "serde", ] @@ -537,7 +618,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c79ad7fb2dd38f3dabd76b09c6a5a20c038fc0213ef1e9afd30eb777f120f019" dependencies = [ "memchr", - "regex-automata", + "regex-automata 0.4.3", "serde", ] @@ -553,6 +634,12 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" +[[package]] +name = "bytecount" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" + [[package]] name = "bytemuck" version = "1.14.0" @@ -594,11 +681,11 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac926d808fb72fe09ebf471a091d6d72918876ccf0b4989766093d2d0d24a0ef" dependencies = [ - "bindgen", + "bindgen 0.66.1", "blst", "cc", "glob", - "hex", + "hex 0.4.3", "libc", "serde", ] @@ -614,25 +701,24 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12024c4645c97566567129c204f65d5815a8c9aecf30fcbe682b2fe034996d36" +checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" dependencies = [ "serde", ] [[package]] name = "cargo_metadata" -version = "0.17.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7daec1a2a2129eeba1644b220b4647ec537b0b5d4bfd6876fcc5a540056b592" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" dependencies = [ "camino", "cargo-platform", "semver 1.0.20", "serde", "serde_json", - "thiserror", ] [[package]] @@ -641,7 +727,6 @@ version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ - "jobserver", "libc", ] @@ -668,8 +753,10 @@ checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-targets", ] @@ -686,9 +773,24 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.6" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim 0.8.0", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" +checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" dependencies = [ "clap_builder", "clap_derive", @@ -696,23 +798,23 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.6" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" +checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.10.0", ] [[package]] name = "clap_derive" -version = "4.4.2" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "syn 2.0.38", @@ -720,9 +822,18 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "cmake" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] [[package]] name = "colorchoice" @@ -738,7 +849,7 @@ checksum = "c37be52ef5e3b394db27a2341010685ad5103c72ac15ce2e9420a7e8f93f342c" dependencies = [ "cfg-if", "cpufeatures", - "hex", + "hex 0.4.3", "serde", ] @@ -770,20 +881,11 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" -[[package]] -name = "cpp_demangle" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" -dependencies = [ - "cfg-if", -] - [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -798,27 +900,13 @@ dependencies = [ ] [[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" +name = "crossbeam-channel" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ - "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] @@ -878,7 +966,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim", + "strsim 0.10.0", "syn 2.0.38", ] @@ -911,10 +999,11 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" dependencies = [ + "powerfmt", "serde", ] @@ -969,27 +1058,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "directories" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys", -] - [[package]] name = "doc-comment" version = "0.3.3" @@ -997,10 +1065,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] -name = "downcast-rs" -version = "1.2.0" +name = "dunce" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "ecdsa" @@ -1062,9 +1130,9 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe81b5c06ecfdbc71dd845216f225f53b62a10cb8a16c946836a3467f701d05b" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "bytes", - "hex", + "hex 0.4.3", "k256", "log", "rand", @@ -1085,34 +1153,12 @@ dependencies = [ "syn 2.0.38", ] -[[package]] -name = "env_logger" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - [[package]] name = "equivalent" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" -[[package]] -name = "erased-serde" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" -dependencies = [ - "serde", -] - [[package]] name = "errno" version = "0.3.5" @@ -1123,6 +1169,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + [[package]] name = "ethabi" version = "18.0.0" @@ -1130,7 +1185,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ "ethereum-types", - "hex", + "hex 0.4.3", "once_cell", "regex", "serde", @@ -1206,7 +1261,7 @@ checksum = "6838fa110e57d572336178b7c79e94ff88ef976306852d8cb87d9e5b1fc7c0b5" dependencies = [ "async-trait", "auto_impl", - "base64 0.21.4", + "base64 0.21.5", "bytes", "const-hex", "enr", @@ -1236,12 +1291,6 @@ dependencies = [ "ws_stream_wasm", ] -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - [[package]] name = "fastrand" version = "2.0.1" @@ -1265,29 +1314,10 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "bitvec", - "byteorder", - "ff_derive", "rand_core", "subtle", ] -[[package]] -name = "ff_derive" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f54704be45ed286151c5e11531316eaef5b8f5af7d597b806fdb8af108d84a" -dependencies = [ - "addchain", - "cfg-if", - "num-bigint 0.3.3", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "fixed-hash" version = "0.8.0" @@ -1300,17 +1330,11 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - [[package]] name = "flate2" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -1354,9 +1378,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1369,9 +1393,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1379,15 +1403,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1396,15 +1420,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", @@ -1413,15 +1437,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-timer" @@ -1435,9 +1459,9 @@ dependencies = [ [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -1482,17 +1506,6 @@ dependencies = [ "wasi", ] -[[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" -dependencies = [ - "fallible-iterator", - "indexmap 1.9.3", - "stable_deref_trait", -] - [[package]] name = "gimli" version = "0.28.0" @@ -1555,9 +1568,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" dependencies = [ "ahash", "allocator-api2", @@ -1573,18 +1586,52 @@ dependencies = [ "fxhash", ] +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "byteorder", + "num-traits", +] + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + [[package]] name = "hermit-abi" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +[[package]] +name = "hex" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" + [[package]] name = "hex" version = "0.4.3" @@ -1652,12 +1699,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "hyper" version = "0.14.27" @@ -1675,7 +1716,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -1684,9 +1725,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http", @@ -1711,16 +1752,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -1804,7 +1845,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", - "hashbrown 0.14.1", + "hashbrown 0.14.2", "serde", ] @@ -1817,28 +1858,11 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "inventory" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1be380c410bf0595e94992a648ea89db4dd3f3354ba54af206fd2a68cf5ac8e" - [[package]] name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "is-terminal" -version = "0.4.9" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi", - "rustix", - "windows-sys", -] +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itertools" @@ -1864,15 +1888,6 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" -[[package]] -name = "jobserver" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" -dependencies = [ - "libc", -] - [[package]] name = "js-sys" version = "0.3.64" @@ -1888,9 +1903,9 @@ version = "8.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "pem", - "ring", + "ring 0.16.20", "serde", "serde_json", "simple_asn1", @@ -1919,36 +1934,13 @@ dependencies = [ "cpufeatures", ] -[[package]] -name = "lazy-regex" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff63c423c68ea6814b7da9e88ce585f793c87ddd9e78f646970891769c8235d4" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8edfc11b8f56ce85e207e62ea21557cfa09bb24a8f6b04ae181b086ff8611c22" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn 1.0.109", -] - [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "spin", + "spin 0.5.2", ] [[package]] @@ -1987,9 +1979,9 @@ checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -2002,39 +1994,69 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] -name = "matrixmultiply" -version = "0.3.8" +name = "lru_time_cache" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9106e1d747ffd48e6be5bb2d97fa706ed25b144fbee4d5c02eae110cd8d6badd" + +[[package]] +name = "matchers" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "autocfg", - "rawpointer", + "regex-automata 0.1.10", ] [[package]] -name = "memchr" -version = "2.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +name = "mbedtls" +version = "0.12.1" +source = "git+https://github.com/fortanix/rust-mbedtls.git#51429f1db35d986ddb3f43bbefc078df74be62ff" +dependencies = [ + "bitflags 1.3.2", + "byteorder", + "cc", + "cfg-if", + "mbedtls-platform-support", + "mbedtls-sys-auto", + "rs-libc", + "serde", + "serde_derive", + "yasna", +] [[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +name = "mbedtls-platform-support" +version = "0.1.1" +source = "git+https://github.com/fortanix/rust-mbedtls.git#51429f1db35d986ddb3f43bbefc078df74be62ff" dependencies = [ - "libc", + "cc", + "cfg-if", + "chrono", + "mbedtls-sys-auto", ] [[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +name = "mbedtls-sys-auto" +version = "2.28.4+mbedtls-2.28.3" +source = "git+https://github.com/fortanix/rust-mbedtls.git#51429f1db35d986ddb3f43bbefc078df74be62ff" dependencies = [ - "autocfg", + "bindgen 0.65.1", + "cc", + "cfg-if", + "cmake", + "lazy_static", + "libc", + "quote", + "syn 1.0.109", ] +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + [[package]] name = "mime" version = "0.3.17" @@ -2058,21 +2080,15 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", "windows-sys", ] -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" - [[package]] name = "native-tls" version = "0.2.11" @@ -2091,20 +2107,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "ndarray" -version = "0.15.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb12d4e967ec485a5f71c6311fe28158e9d6f4bc4a447b474184d0f91a8fa32" -dependencies = [ - "matrixmultiply", - "num-complex", - "num-integer", - "num-traits", - "rawpointer", - "rayon", -] - [[package]] name = "nom" version = "7.1.3" @@ -2115,6 +2117,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num" version = "0.4.1" @@ -2131,9 +2143,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.3.3" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ "autocfg", "num-integer", @@ -2220,7 +2232,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.3", "libc", ] @@ -2245,17 +2257,6 @@ dependencies = [ "syn 2.0.38", ] -[[package]] -name = "object" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" -dependencies = [ - "flate2", - "memchr", - "ruzstd", -] - [[package]] name = "object" version = "0.32.1" @@ -2302,7 +2303,7 @@ version = "0.10.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", @@ -2341,10 +2342,10 @@ dependencies = [ ] [[package]] -name = "option-ext" -version = "0.2.0" +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "parity-scale-codec" @@ -2384,13 +2385,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall 0.4.1", "smallvec", "windows-targets", ] @@ -2424,25 +2425,15 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ "memchr", "thiserror", "ucd-trie", ] -[[package]] -name = "petgraph" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" -dependencies = [ - "fixedbitset", - "indexmap 2.0.2", -] - [[package]] name = "pharos" version = "0.5.3" @@ -2501,6 +2492,12 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2602,6 +2599,21 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prometheus" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c" +dependencies = [ + "cfg-if", + "fnv", + "lazy_static", + "memchr", + "parking_lot", + "protobuf", + "thiserror", +] + [[package]] name = "proptest" version = "1.3.1" @@ -2609,8 +2621,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c003ac8c77cb07bb74f5f198bce836a689bcd5a42574612bf14d17bfd08c20e" dependencies = [ "bit-set", - "bit-vec", - "bitflags 2.4.0", + "bit-vec 0.6.3", + "bitflags 2.4.1", "lazy_static", "num-traits", "rand", @@ -2623,66 +2635,20 @@ dependencies = [ ] [[package]] -name = "prost" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fdd22f3b9c31b53c060df4a0613a1c7f062d4115a2b984dd15b1858f7e340d" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bdf592881d821b83d471f8af290226c8d51402259e9bb5be7f9f8bdebbb11ac" -dependencies = [ - "bytes", - "heck", - "itertools 0.11.0", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.38", - "tempfile", - "which", -] - -[[package]] -name = "prost-derive" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "265baba7fabd416cf5078179f7d2cbeca4ce7a9041111900675ea7c4cb8a4c32" -dependencies = [ - "anyhow", - "itertools 0.11.0", - "proc-macro2", - "quote", - "syn 2.0.38", -] - -[[package]] -name = "prost-types" -version = "0.12.1" +name = "protobuf" +version = "2.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e081b29f63d83a4bc75cfc9f3fe424f9156cf92d8a4f0c9407cce9a1b67327cf" -dependencies = [ - "prost", -] +checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94" [[package]] -name = "protobuf-src" -version = "1.1.0+21.5" +name = "pulldown-cmark" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7ac8852baeb3cc6fb83b93646fb93c0ffe5d14bf138c945ceb4b9948ee0e3c1" +checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" dependencies = [ - "autotools", + "bitflags 1.3.2", + "memchr", + "unicase", ] [[package]] @@ -2706,6 +2672,59 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" +[[package]] +name = "raiko-guest" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap 4.4.7", + "ethers-core", + "hex 0.4.3", + "rand", + "rand_core", + "risc0-zkvm", + "secp256k1", + "sgx-ra", + "sha3", + "tokio", + "zeth-lib", + "zeth-primitives", +] + +[[package]] +name = "raiko-host" +version = "0.1.0" +dependencies = [ + "anyhow", + "assert_cmd", + "bincode", + "bonsai-sdk", + "bytemuck", + "clap 4.4.7", + "ethers-core", + "hex 0.4.3", + "hyper", + "lazy_static", + "lru_time_cache", + "once_cell", + "prometheus", + "revm", + "rstest", + "serde", + "serde_json", + "serde_with", + "structopt", + "structopt-toml", + "tempfile", + "tokio", + "tower", + "tracing", + "tracing-appender", + "tracing-subscriber", + "zeth-lib", + "zeth-primitives", +] + [[package]] name = "rand" version = "0.8.5" @@ -2745,84 +2764,62 @@ dependencies = [ "rand_core", ] -[[package]] -name = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ "bitflags 1.3.2", ] [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] -name = "redox_users" -version = "0.4.3" +name = "regex" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ - "getrandom", - "redox_syscall 0.2.16", - "thiserror", + "aho-corasick", + "memchr", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] [[package]] -name = "regex" -version = "1.10.0" +name = "regex-automata" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax 0.8.1", + "regex-syntax 0.6.29", ] [[package]] name = "regex-automata" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.1", + "regex-syntax 0.8.2", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.7.5" @@ -2831,9 +2828,9 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "regex-syntax" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d84fdd47036b038fc80dd333d10b6aab10d5d31f4a366e20014def75328d33" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "relative-path" @@ -2847,7 +2844,7 @@ version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "bytes", "encoding_rs", "futures-core", @@ -2887,8 +2884,7 @@ dependencies = [ [[package]] name = "revm" version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f4ca8ae0345104523b4af1a8a7ea97cfa1865cdb7a7c25d23c1a18d9b48598" +source = "git+https://github.com/johntaiko/revm?branch=feat/taiko#327dc05411c59db6520ba3782a4d1cdab992f479" dependencies = [ "auto_impl", "revm-interpreter", @@ -2900,8 +2896,7 @@ dependencies = [ [[package]] name = "revm-interpreter" version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f959cafdf64a7f89b014fa73dc2325001cf654b3d9400260b212d19a2ebe3da0" +source = "git+https://github.com/johntaiko/revm?branch=feat/taiko#327dc05411c59db6520ba3782a4d1cdab992f479" dependencies = [ "revm-primitives", "serde", @@ -2910,8 +2905,7 @@ dependencies = [ [[package]] name = "revm-precompile" version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d360a88223d85709d2e95d4609eb1e19c649c47e28954bfabae5e92bb37e83e" +source = "git+https://github.com/johntaiko/revm?branch=feat/taiko#327dc05411c59db6520ba3782a4d1cdab992f479" dependencies = [ "c-kzg", "k256", @@ -2927,18 +2921,17 @@ dependencies = [ [[package]] name = "revm-primitives" version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51187b852d9e458816a2e19c81f1dd6c924077e1a8fccd16e4f044f865f299d7" +source = "git+https://github.com/johntaiko/revm?branch=feat/taiko#327dc05411c59db6520ba3782a4d1cdab992f479" dependencies = [ "alloy-primitives", "alloy-rlp", "auto_impl", - "bitflags 2.4.0", + "bitflags 2.4.1", "bitvec", "c-kzg", "enumn", - "hashbrown 0.14.1", - "hex", + "hashbrown 0.14.2", + "hex 0.4.3", "serde", ] @@ -2961,12 +2954,26 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys", +] + [[package]] name = "ripemd" version = "0.1.3" @@ -2990,34 +2997,6 @@ dependencies = [ "serde", ] -[[package]] -name = "risc0-build" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703b79671cd148f6535e1f78b8a74f665c920493eb6546c516c67ab0bc0bbde1" -dependencies = [ - "cargo_metadata", - "risc0-binfmt", - "risc0-zkp", - "risc0-zkvm-platform", - "serde", - "serde_json", -] - -[[package]] -name = "risc0-build-kernel" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80b88d565a721641f355cb889fee75c12c719dec7b910aa42ecabffa30d99f87" -dependencies = [ - "cc", - "directories", - "glob", - "hex", - "sha2", - "tempfile", -] - [[package]] name = "risc0-circuit-rv32im" version = "0.18.0" @@ -3026,28 +3005,12 @@ checksum = "68e00222152fdc94cacc9b6682b5c0cbe8138f1ee82e80c24a64d9ad2c6d7415" dependencies = [ "anyhow", "log", - "rand", - "rayon", - "risc0-circuit-rv32im-sys", "risc0-core", - "risc0-sys", "risc0-zkp", "risc0-zkvm-platform", "tracing", ] -[[package]] -name = "risc0-circuit-rv32im-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ca6ec6b1a7aad859af0009d19946ffdded8e3bd5d9accf893846b6bf996ac08" -dependencies = [ - "glob", - "risc0-build-kernel", - "risc0-core", - "risc0-sys", -] - [[package]] name = "risc0-core" version = "0.18.0" @@ -3058,18 +3021,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "risc0-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6d308c2ebc79e32c100f57722914b3172d2f0d69321703b684ea0c302e4f3a9" -dependencies = [ - "cc", - "glob", - "risc0-build-kernel", - "risc0-core", -] - [[package]] name = "risc0-zkp" version = "0.18.0" @@ -3080,17 +3031,11 @@ dependencies = [ "blake2", "bytemuck", "digest 0.10.7", - "ff", - "hex", - "lazy_static", + "hex 0.4.3", "log", - "ndarray", "paste", - "rand", "rand_core", - "rayon", "risc0-core", - "risc0-sys", "risc0-zkvm-platform", "serde", "sha2", @@ -3103,40 +3048,23 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec972152bcaa1a2967e412e22a84f6e2984a95c701bcc7943ca8ca10126ee0a2" dependencies = [ - "addr2line 0.20.0", "anyhow", - "bincode", - "bonsai-sdk", "bytemuck", - "bytes", "cfg-if", - "crypto-bigint", - "generic-array", "getrandom", - "gimli 0.27.3", - "hex", - "lazy-regex", + "hex 0.4.3", "libm", "log", "num-derive", "num-traits", - "prost", - "prost-build", - "protobuf-src", - "rand", - "rayon", "risc0-binfmt", "risc0-circuit-rv32im", "risc0-core", "risc0-zkp", "risc0-zkvm-platform", - "rrs-lib", "serde", - "sha2", "tempfile", - "thiserror", "tracing", - "typetag", ] [[package]] @@ -3168,13 +3096,13 @@ dependencies = [ ] [[package]] -name = "rrs-lib" -version = "0.1.0" +name = "rs-libc" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4382d3af3a4ebdae7f64ba6edd9114fff92c89808004c4943b393377a25d001" +checksum = "683e8c8e8aac6ffa4b2287bac3c69575d5346accac4f218ae1e084303bb174ca" dependencies = [ - "downcast-rs", - "paste", + "cc", + "zeroize", ] [[package]] @@ -3273,11 +3201,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.19" +version = "0.38.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" +checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", @@ -3286,12 +3214,12 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c" dependencies = [ "log", - "ring", + "ring 0.17.5", "rustls-webpki", "sct", ] @@ -3302,17 +3230,17 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", ] [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "ring", - "untrusted", + "ring 0.17.5", + "untrusted 0.9.0", ] [[package]] @@ -3333,28 +3261,26 @@ dependencies = [ "wait-timeout", ] -[[package]] -name = "ruzstd" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a15e661f0f9dac21f3494fe5d23a6338c0ac116a2d22c2b63010acd89467ffe" -dependencies = [ - "byteorder", - "thiserror", - "twox-hash", -] - [[package]] name = "ryu" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "scale-info" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" +checksum = "7f7d66a1128282b7ef025a8ead62a4a9fcf017382ec53b8ffbf4d7bf77bd3c60" dependencies = [ "cfg-if", "derive_more", @@ -3364,9 +3290,9 @@ dependencies = [ [[package]] name = "scale-info-derive" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" +checksum = "abf2c68b89cafb3b8d918dd07b42be0da66ff202cf1155c5739a4e0c1ea0dc19" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -3391,12 +3317,12 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ - "ring", - "untrusted", + "ring 0.17.5", + "untrusted 0.9.0", ] [[package]] @@ -3419,6 +3345,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" dependencies = [ + "rand", "secp256k1-sys", ] @@ -3495,18 +3422,18 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2", "quote", @@ -3539,13 +3466,13 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca3b16a3d82c4088f343b7480a93550b3eabe1a358569c2dfe38bbcead07237" +checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" dependencies = [ - "base64 0.21.4", + "base64 0.21.5", "chrono", - "hex", + "hex 0.4.3", "indexmap 1.9.3", "indexmap 2.0.2", "serde", @@ -3556,9 +3483,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e6be15c453eb305019bfa438b1593c731f36a289a7853f7707ee29e870b3b3c" +checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" dependencies = [ "darling", "proc-macro2", @@ -3566,6 +3493,14 @@ dependencies = [ "syn 2.0.38", ] +[[package]] +name = "sgx-ra" +version = "0.1.0" +dependencies = [ + "hex 0.3.2", + "mbedtls", +] + [[package]] name = "sha1" version = "0.10.6" @@ -3598,6 +3533,15 @@ dependencies = [ "keccak", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.2.0" @@ -3635,6 +3579,21 @@ dependencies = [ "time", ] +[[package]] +name = "skeptic" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" +dependencies = [ + "bytecount", + "cargo_metadata", + "error-chain", + "glob", + "pulldown-cmark", + "tempfile", + "walkdir", +] + [[package]] name = "slab" version = "0.4.9" @@ -3661,9 +3620,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -3671,9 +3630,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys", @@ -3685,6 +3644,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.7.2" @@ -3695,24 +3660,76 @@ dependencies = [ "der", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "structopt" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" +dependencies = [ + "clap 2.34.0", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" +dependencies = [ + "heck 0.3.3", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "structopt-toml" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d887e6156acb1f4e2d2968d61d1d3b6c5e102af5f23c3ca606723b5ac2c45cb" +dependencies = [ + "anyhow", + "clap 2.34.0", + "serde", + "serde_derive", + "skeptic", + "structopt", + "structopt-toml-derive", + "toml", +] + +[[package]] +name = "structopt-toml-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216c57b49178d22a3ec2f0ce5e961219d11772f7ca70b00c08879d15827d6daf" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "strum" version = "0.25.0" @@ -3724,11 +3741,11 @@ dependencies = [ [[package]] name = "strum_macros" -version = "0.25.2" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "rustversion", @@ -3776,6 +3793,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b837ef12ab88835251726eb12237655e61ec8dc8a280085d1961cdc3dfd047" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.38", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -3816,41 +3845,51 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "termcolor" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" -dependencies = [ - "winapi-util", -] - [[package]] name = "termtree" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", "syn 2.0.38", ] +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "threadpool" version = "1.8.1" @@ -3862,12 +3901,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", "itoa", + "powerfmt", "serde", "time-core", "time-macros", @@ -3926,7 +3966,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.4", + "socket2 0.5.5", "tokio-macros", "windows-sys", ] @@ -3979,9 +4019,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -3991,11 +4031,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" [[package]] name = "toml_edit" @@ -4008,6 +4057,33 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "hdrhistogram", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -4016,21 +4092,33 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + [[package]] name = "tracing-attributes" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", @@ -4039,11 +4127,12 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", + "valuable", ] [[package]] @@ -4056,6 +4145,48 @@ dependencies = [ "tracing", ] +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + [[package]] name = "try-lock" version = "0.2.4" @@ -4082,46 +4213,12 @@ dependencies = [ "utf-8", ] -[[package]] -name = "twox-hash" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" -dependencies = [ - "cfg-if", - "static_assertions", -] - [[package]] name = "typenum" version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" -[[package]] -name = "typetag" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80960fd143d4c96275c0e60b08f14b81fbb468e79bc0ef8fbda69fb0afafae43" -dependencies = [ - "erased-serde", - "inventory", - "once_cell", - "serde", - "typetag-impl", -] - -[[package]] -name = "typetag-impl" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfc13d450dc4a695200da3074dacf43d449b968baee95e341920e47f61a3b40f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "ucd-trie" version = "0.1.6" @@ -4136,7 +4233,7 @@ checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" dependencies = [ "byteorder", "crunchy", - "hex", + "hex 0.4.3", "static_assertions", ] @@ -4146,6 +4243,15 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -4167,6 +4273,18 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + [[package]] name = "unicode-xid" version = "0.2.4" @@ -4179,6 +4297,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.4.1" @@ -4214,6 +4338,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version_check" version = "0.9.4" @@ -4229,6 +4359,16 @@ dependencies = [ "libc", ] +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -4370,10 +4510,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ "windows-targets", ] @@ -4446,9 +4586,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.16" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711d82167854aff2018dfd193aa0fef5370f456732f0d5a0c59b0f1b4b907" +checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" dependencies = [ "memchr", ] @@ -4492,19 +4632,29 @@ dependencies = [ ] [[package]] -name = "zeroize" -version = "1.6.0" +name = "yasna" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "79af3189e6b0484c9fd54208f8eeb8818cadee00ec81438b67a64c8e6f2f3694" dependencies = [ - "zeroize_derive", + "bit-vec 0.5.1", + "num-bigint 0.2.6", ] [[package]] -name = "zeroize_derive" -version = "1.4.2" +name = "zerocopy" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "81ba595b9f2772fbee2312de30eeb80ec773b4cb2f1e8098db024afadda6c06f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772666c41fb6dceaf520b564b962d738a8e1a83b41bd48945f50837aed78bb1d" dependencies = [ "proc-macro2", "quote", @@ -4512,35 +4662,23 @@ dependencies = [ ] [[package]] -name = "zeth" -version = "0.1.0" +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ - "anyhow", - "assert_cmd", - "bincode", - "bonsai-sdk", - "bytemuck", - "clap", - "env_logger", - "ethers-core", - "hex", - "log", - "revm", - "risc0-zkvm", - "rstest", - "serde", - "tempfile", - "tokio", - "zeth-guests", - "zeth-lib", - "zeth-primitives", + "zeroize_derive", ] [[package]] -name = "zeth-guests" -version = "0.1.0" +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "risc0-build", + "proc-macro2", + "quote", + "syn 2.0.38", ] [[package]] @@ -4553,16 +4691,19 @@ dependencies = [ "ethers-core", "ethers-providers", "flate2", - "hashbrown 0.14.1", + "hashbrown 0.14.2", + "hex 0.4.3", "log", "once_cell", "revm", + "rlp", "ruint", "serde", "serde_json", "serde_with", "thiserror", "tokio", + "tracing", "zeth-primitives", ] @@ -4570,40 +4711,24 @@ dependencies = [ name = "zeth-primitives" version = "0.1.0" dependencies = [ + "alloy-dyn-abi", "alloy-primitives", "alloy-rlp", "alloy-rlp-derive", + "alloy-sol-types", "anyhow", "bincode", "bytes", "ethers-core", + "hex 0.4.3", "hex-literal", "k256", + "once_cell", "revm-primitives", "rlp", + "ruint", "serde", "serde_json", "sha3", "thiserror", ] - -[[package]] -name = "zeth-testeth" -version = "0.1.0" -dependencies = [ - "anyhow", - "env_logger", - "ethers-core", - "hashbrown 0.14.1", - "log", - "revm", - "risc0-build", - "risc0-zkvm", - "rstest", - "serde", - "serde_json", - "serde_with", - "tempfile", - "zeth-lib", - "zeth-primitives", -] diff --git a/Cargo.toml b/Cargo.toml index a1d2b17bd..3879fa515 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,6 @@ [workspace] resolver = "2" -members = [ - "guests", - "host", - "lib", - "primitives", - "testing/ef-tests" -] +members = ["lib", "primitives", "raiko-guest", "raiko-host", "sgx-ra"] # Always optimize; building and running the guest takes much longer without optimization. [profile.dev] @@ -22,9 +16,24 @@ lto = true [profile.release.build-override] opt-level = 3 +[patch.crates-io] +# use optimized risc0 circuit +revm = { git = "https://github.com/johntaiko/revm", branch = "feat/taiko" } +revm-primitives = { git = "https://github.com/johntaiko/revm", branch = "feat/taiko" } + + [workspace.dependencies] bonsai-sdk = "0.4" hashbrown = { version = "0.14", features = ["inline-more"] } risc0-build = "0.18" risc0-zkvm = { version = "0.18", default-features = false } -revm = { version = "3.5", default-features = false, features = ["std", "serde", "optional_no_base_fee", "optional_balance_check"] } +revm = { version = "3.5", default-features = false, features = [ + "std", + "serde", + "taiko", + "optional_no_base_fee", + "optional_balance_check", +] } +revm-primitives = { version = "1.3", default_features = false, features = [ + "taiko", +] } diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..5e9445bcf --- /dev/null +++ b/Dockerfile @@ -0,0 +1,44 @@ +FROM rust:1.75.0 as builder + +ENV DEBIAN_FRONTEND=noninteractive +ARG BUILD_FLAGS="" +WORKDIR /opt/raiko +COPY . . +RUN apt-get update && \ + apt-get install -y \ + cmake \ + libclang-dev && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* +RUN cargo build --release ${BUILD_FLAGS} + +FROM gramineproject/gramine:1.6-jammy as runtime +WORKDIR /opt/raiko + +RUN apt-get update && \ + apt-get install -y sudo && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +RUN mkdir -p \ + ./bin \ + ./guests/sgx \ + ./secrets \ + /etc/opt/raiko \ + /tmp/sgx \ + /var/log/raiko + +COPY --from=builder /opt/raiko/target/release/raiko-guest ./guests/sgx/ +COPY --from=builder /opt/raiko/raiko-guest/config/raiko-guest.manifest.template ./guests/sgx/ +COPY --from=builder /opt/raiko/target/release/raiko-host ./bin +COPY --from=builder /opt/raiko/raiko-host/config/config.toml /etc/opt/raiko/ +COPY --from=builder /opt/raiko/docker/entrypoint.sh ./bin +COPY ./sgx-ra/src/*.so /usr/lib/ + +RUN cd ./guests/sgx && \ + gramine-manifest -Dlog_level=error -Darch_libdir=/lib/x86_64-linux-gnu/ raiko-guest.manifest.template raiko-guest.manifest && \ + gramine-sgx-gen-private-key && \ + gramine-sgx-sign --manifest raiko-guest.manifest --output raiko-guest.manifest.sgx && \ + cd - + +ENTRYPOINT [ "/opt/raiko/bin/entrypoint.sh" ] diff --git a/README_Docker.md b/README_Docker.md new file mode 100644 index 000000000..bcd6dabce --- /dev/null +++ b/README_Docker.md @@ -0,0 +1,139 @@ +# Raiko Docker tutorial + +This tutorial was created to help you set up Raiko using a Docker container. + +Raiko leverages [Intel SGX][sgx] through [Gramine][gramine]. Since Gramine supports only [a few distributions][gramine-distros] including Ubuntu, the Docker image is based on Ubuntu. + +[gramine-distros]: https://github.com/gramineproject/gramine/discussions/1555#discussioncomment-7016800 +[gramine]: https://gramineproject.io/ + +## Prerequisites + +### SGX-enabled CPU + +Ensure your machine has an [SGX][sgx]-enabled CPU to run raiko. You can check if your CPU supports SGX (Software Guard Extensions) on Linux by using the [`cpuid`][cpuid] tool. + +1. Install `cpuid` if it's not already installed. On Ubuntu, you can do this with the following command: + + sudo apt-get install cpuid + +1. Run `cpuid` and `grep` for SGX: + + cpuid | grep -i sgx + + If your CPU supports SGX, you should see output similar to this: + + ``` + SGX: Software Guard Extensions supported = true + ``` + + If you don't see this line, your CPU does not support SGX. + +Alternatively, you can run `grep sgx /proc/cpuinfo`. If the command returns no output, your CPU doesn't support SGX. + +[sgx]: https://www.intel.com/content/www/us/en/architecture-and-technology/software-guard-extensions.html +[cpuid]: https://manpages.ubuntu.com/manpages/noble/en/man1/cpuid.1.html + +### Modern Linux kernel + +Starting with Linux kernel version [`5.11`][kernel-5.11], the kernel provides out-of-the-box support for SGX. However, it doesn't support [EDMM][edmm] (Enclave Dynamic Memory Management), which Raiko requires. EDMM support first appeared in Linux `6.0`, so ensure that you have Linux kernel `6.0` or above. + +To check version of your kernel run: + +``` +uname -a +``` + +If you are using Ubuntu and you want to find what are the available Linux kernel versions, run: + +``` +apt search linux-image +``` + +[kernel-5.11]: https://www.intel.com/content/www/us/en/developer/tools/software-guard-extensions/linux-overview.html +[edmm]: https://gramine.readthedocs.io/en/stable/manifest-syntax.html#edmm + +## Building Docker image + +Taiko doesn't provide prebuilt Docker image (yet). You need to build it yourself. + +1. Clone `raiko` repository: + ``` + git clone git@github.com:taikoxyz/raiko.git + ``` +1. Change active directory: + ``` + cd raiko/docker + ``` +1. Build the image: + ``` + docker compose build + ``` +1. That's it! You should now be able to find the `raiko:latest` in the list of all Docker images: + ``` + docker image ls + ``` + +## Running Docker container + +After successfully building Docker image, you are now able to bootstrap and run Raiko as a daemon. + +### Raiko bootstrapping + +Bootstrapping is the process of generating a public-private key pair, which will be used for doing signatures within the SGX enclave. The private key is stored in an [encrypted][gramine-encrypted-files] format in the `~/.config/raiko/secrets/priv.key` file. Encryption and decryption are performed inside the enclave, providing protection against malicious attacks. + +1. Make sure you haven't generated Raiko's public-private key pair yet: + ``` + ls ~/.config/raiko/secrets + ``` + If you `secrets` directory is not empty, you can skip Raiko bootstrapping. +1. Bootstrap Raiko: + ``` + docker compose run --rm raiko --init + ``` + It creates a new, encrypted private key in `~/.config/raiko/secrets` directory. It also prints a public key that you need to send to the Taiko team for registration. + Register the "Instance address"(pinted by `--init` command) with the Taiko team. Once the Taiko team registers your instance, you will be able to use it to sign proofs. + +[gramine-encrypted-files]: https://gramine.readthedocs.io/en/stable/manifest-syntax.html#encrypted-files + +### Running Raiko daemon + +Once you have Raiko bootstrapped, you can start Raiko daemon. + +``` +docker compose up raiko -d +``` + +Start the Raiko daemon. Skip `-d` (which stands for _daemon_) to run in the foreground instead. + +### Test Raiko + +Now, once you have Raiko up and running, you can test it to make sure it is serving requests as expected. + +1. Open new terminal and run: + ``` + tail -f /var/log/raiko/raiko.log.dd-mm-yyyy + ``` + to monitor requests that you will be sending. Replace `dd-mm-yyyy` placeholder with the current date. +1. Send a sample request to Raiko: + ``` + curl --location --request POST 'http://localhost:8080' --header 'Content-Type: application/json' --data-raw '{ + "jsonrpc": "2.0", + "id": 1, + "method": "proof", + "params": [ + { + "type": "Sgx", + "l2Rpc": "https://rpc.internal.taiko.xyz", + "l1Rpc": "https://l1rpc.internal.taiko.xyz", + "block": 2, + "prover": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] + }' + ``` + If the request was served correctly, you should see a lot of logs being produced in the log file and an SGX proof printed on the standard output: + ``` + {"jsonrpc":"2.0","id":1,"result":{"type":"Sgx","proof":"0x000000006cbe8f8cb4c319f5beba9a4fa66923105dc90aec3c5214eed022323b9200097b647208956cc1b7ce0d8c0777df657caace329cc73f2398b137095128c7717167fc52d6474887e98e0f97149c9be2ca63a458dc8a1b"}} + ``` diff --git a/README_Raiko.md b/README_Raiko.md new file mode 100644 index 000000000..c7a1580da --- /dev/null +++ b/README_Raiko.md @@ -0,0 +1,284 @@ +# Raiko + +This project is Taiko-specific, SGX-enabled fork of [Zeth][zeth] called _Raiko_. It consists of 2 'modules': `raiko-guest` and `raiko-host`. + +- `raiko-host` is capable of fetching relevant block data and saving it to the `*.json.gz` file. `raiko-host` is _not_ being run inside SGX enclave. +- `raiko-guest` is responsible for generating public-private key pair and signing. It can run inside SGX enclave. + +[zeth]: https://github.com/risc0/zeth + +## Building + +To build the project make sure you have correct toolchain selected: + +```console +ubuntu@ubuntu:~/zeth$ rustup default +nightly-x86_64-unknown-linux-gnu (default) +``` + +and compile the project: + +```console +ubuntu@ubuntu:~/zeth$ cargo build +``` + +The above command creates `/target` directory with `raiko-host` and `raiko-guest` compilation artifacts. + +## Running + +You can either run `raiko-guest` directly, or indirectly by running `raiko-host` JSON-RPC server. In any case running it requires some [Gramine][gramine]-specific preconfiguration before you can run the binary. This can be automated in the future. + +If you are running `raiko-guest` directly, you can either use _one-shot_ mode, or a _long-running RA-TLS server_ (which is experimental). Production environment uses `raiko-host` JSON-RPC server that starts `raiko-guest` in _one-shot_ mode. + +To sum up, these are the ways to run `raiko-guest`: + +- Run `raiko-guest` directly in: + - _one-shot_ mode, or: + - _long-running_ mode (RA-TLS server). +- Run `raiko-host` that in turn runs `raiko-guest` in _one-shot_ mode. + +[gramine]: https://github.com/gramineproject/gramine + +### One-shot mode + +To run `raiko-guest` in _one-shot_ mode with SGX using Gramine: + +1. Compile Gramine's configuration file: + ```console + ubuntu@ubuntu:~/zeth$ cd target/debug + ubuntu@ubuntu:~/zeth/target/debug$ cp ../../raiko-guest/config/raiko-guest.manifest.template . + ubuntu@ubuntu:~/zeth/target/debug$ gramine-manifest -Dlog_level=error -Darch_libdir=/lib/x86_64-linux-gnu/ raiko-guest.manifest.template raiko-guest.manifest + ``` +1. Sign Gramine's configuration file. [`MRENCLAVE`][mrenclave] – a.k.a. [_measurement_][measurement] – is also calculated at this stage (see last line of the below log): + + ```console + ubuntu@ubuntu:~/zeth/target/debug$ gramine-sgx-sign --manifest raiko-guest.manifest --output raiko-guest.manifest.sgx + Attributes: + size: 0x10000000000 + edmm: True + max_threads: 16 + isv_prod_id: 0 + isv_svn: 0 + attr.flags: 0x4 + attr.xfrm: 0x3 + misc_select: 0x0 + SGX remote attestation: + DCAP/ECDSA + Memory: + 000000ffffff3000-0000010000000000 [REG:R--] (manifest) measured + 000000fffff73000-000000ffffff3000 [REG:RW-] (ssa) measured + 000000fffff63000-000000fffff73000 [TCS:---] (tcs) measured + 000000fffff53000-000000fffff63000 [REG:RW-] (tls) measured + 000000fffff13000-000000fffff53000 [REG:RW-] (stack) measured + 000000ffffed3000-000000fffff13000 [REG:RW-] (stack) measured + 000000ffffe93000-000000ffffed3000 [REG:RW-] (stack) measured + 000000ffffe53000-000000ffffe93000 [REG:RW-] (stack) measured + 000000ffffe13000-000000ffffe53000 [REG:RW-] (stack) measured + 000000ffffdd3000-000000ffffe13000 [REG:RW-] (stack) measured + 000000ffffd93000-000000ffffdd3000 [REG:RW-] (stack) measured + 000000ffffd53000-000000ffffd93000 [REG:RW-] (stack) measured + 000000ffffd13000-000000ffffd53000 [REG:RW-] (stack) measured + 000000ffffc53000-000000ffffc93000 [REG:RW-] (stack) measured + 000000ffffc13000-000000ffffc53000 [REG:RW-] (stack) measured + 000000ffffbd3000-000000ffffc13000 [REG:RW-] (stack) measured + 000000ffffb93000-000000ffffbd3000 [REG:RW-] (stack) measured + 000000ffffb53000-000000ffffb93000 [REG:RW-] (stack) measured + 000000ffffb43000-000000ffffb53000 [REG:RW-] (sig_stack) measured + 000000ffffb33000-000000ffffb43000 [REG:RW-] (sig_stack) measured + 000000ffffa49000-000000ffffa53000 [REG:RW-] (data) measured + Measurement: + 3c2ef3d06dfb2ebb3ba664d82439f4636138c8d0cfd63793d47bb030f07125ca + ``` + + The above command creates `raiko-guest.sig` file (next to `raiko-guest.manifest.sgx`). You can check [`MRSIGNER`][mrsigner] and [`MRENCLAVE`][mrenclave] values by running: + + ``` + ubuntu@ubuntu:~/zeth/target/debug$ gramine-sgx-sigstruct-view ./raiko-guest.sig + Attributes: + mr_signer: 669b80648c2d9c97f32263fa1961f95f83818682d6359758221f0e7acb9584c0 + mr_enclave: 3c2ef3d06dfb2ebb3ba664d82439f4636138c8d0cfd63793d47bb030f07125ca + isv_prod_id: 0 + isv_svn: 0 + debug_enclave: False + ``` + +1. Initialize `secrets` directory where the encrypted (or more precisely, [sealed][sealing]) private keys will be saved and rotated: + ``` + ubuntu@ubuntu:~/zeth/target/debug$ mkdir secrets + ubuntu@ubuntu:~/zeth/target/debug$ gramine-sgx ./raiko-guest bootstrap + Gramine is starting. Parsing TOML manifest file, this may take some time... + ----------------------------------------------------------------------------------------------------------------------- + Gramine detected the following insecure configurations: + - loader.insecure__use_cmdline_argv = true (forwarding command-line args from untrusted host to the app) + - sys.insecure__allow_eventfd = true (host-based eventfd is enabled) + - sgx.allowed_files = [ ... ] (some files are passed through from untrusted host without verification) + Gramine will continue application execution, but this configuration must not be used in production! + ----------------------------------------------------------------------------------------------------------------------- + Bootstrapping the app + Next public key: 0x021d90eee5c402692fa3a3d3edd43a052367efbd6e4d26b9ca14099516525b9d09 + Entry: /secrets/priv.key + ``` +1. Run `raiko-guest` with the input file of your choice: + + ``` + ubuntu@ubuntu:~/zeth/target/debug$ gramine-sgx ./raiko-guest one-shot --blocks-data-file /tmp/ethereum/173.json.gz + Gramine is starting. Parsing TOML manifest file, this may take some time... + ----------------------------------------------------------------------------------------------------------------------- + Gramine detected the following insecure configurations: + + - loader.insecure__use_cmdline_argv = true (forwarding command-line args from untrusted host to the app) + - sys.insecure__allow_eventfd = true (host-based eventfd is enabled) + - sgx.allowed_files = [ ... ] (some files are passed through from untrusted host without verification) + Gramine will continue application execution, but this configuration must not be used in production! + ----------------------------------------------------------------------------------------------------------------------- + Starting one shot mode + Reading input file /tmp/ethereum/173.json.gz (block no: 173) + Current public key: 0x021d90eee5c402692fa3a3d3edd43a052367efbd6e4d26b9ca14099516525b9d09 + Next public key: 0x02ed03055d75c4c5260fe93b067e6ed7c22232fc7b520b1b5367dfde093c06e92f + Signature: 0x3045022100d88304d2538f3ebb80a8b4be1e20fd1516abe543031aede7fce90561303bf7e002203ca644544386f41259cfb491dcc1a40ae3f09435e2bb136cf0baf0baf6969eb0 + Detected attestation type: dcap + Extracted SGX quote with size = 4734 and the following fields: + Quote: 03000200649434154452d2d2d2d2d0a00 + ATTRIBUTES.FLAGS: 0500000000000000 [ Debug bit: false ] + ATTRIBUTES.XFRM: e700000000000000 + MRENCLAVE: 3c2ef3d06dfb2ebb3ba664d82439f4636138c8d0cfd63793d47bb030f07125ca + MRSIGNER: 669b80648c2d9c97f32263fa1961f95f83818682d6359758221f0e7acb9584c0 + ISVPRODID: 0000 + ISVSVN: 0000 + REPORTDATA: 3032656430333035356437356334633532363066653933623036376536656437 + 6332323233326663376235323062316235333637646664653039336330366539 + ``` + +ECDSA key pair is rotated every run as presented in the diagram below: + +![key rotation](img/key_rotation_diagram.png "SGX key rotation") + +[measurement]: https://sgx101.gitbook.io/sgx101/sgx-bootstrap/attestation#enclave-measurement-aka-software-tcb +[sealing]: https://sgx101.gitbook.io/sgx101/sgx-bootstrap/sealing +[mrenclave]: https://sidsbits.com/Intel-SGX-Attestation-Part-1/#Secure-Enclave-Instantiation +[mrsigner]: https://sidsbits.com/Intel-SGX-Attestation-Part-1/#Secure-Enclave-Instantiation + +### RA-TLS server + +To run RA-TLS server listening on port `8080`, run the same commands as in section [`raiko-guest`](#raiko-guest-one-shot-mode) but instead of running `gramine-sgx ./raiko-guest one-shot (...)` run `gramine-sgx ./raiko-guest server`: + +```console +ubuntu@ubuntu:~/zeth/target/debug$ gramine-sgx ./raiko-guest server +Gramine is starting. Parsing TOML manifest file, this may take some time... +----------------------------------------------------------------------------------------------------------------------- +Gramine detected the following insecure configurations: + - loader.insecure__use_cmdline_argv = true (forwarding command-line args from untrusted host to the app) + - sys.insecure__allow_eventfd = true (host-based eventfd is enabled) + - sgx.allowed_files = [ ... ] (some files are passed through from untrusted host without verification) + +Gramine will continue application execution, but this configuration must not be used in production! +----------------------------------------------------------------------------------------------------------------------- + +Starting RA-TLS server - listening on 127.0.0.1:8080 +Detected attestation type: dcap +Successfully obtained key and certificate data. +DER Key: [48, 129, , 193, 232, 90, 45] +DER Certificate: [48, 130, , 118, 143] +``` + +### RA-TLS client + +To run RA-TLS client, you need to use the following PR: https://github.com/pbeza/rust-mbedtls/pull/1 and run: + +``` +RUST_BACKTRACE=1 ./client 127.0.0.1:8080 [MRENCLAVE] [MRSIGNER] 0 0 +``` + +In the above case, run: + +``` +RUST_BACKTRACE=1 ./client 127.0.0.1:8080 3c2ef3d06dfb2ebb3ba664d82439f4636138c8d0cfd63793d47bb030f07125ca 669b80648c2d9c97f32263fa1961f95f83818682d6359758221f0e7acb9584c0 0 0 +``` + +In case you get the following errors when running the above command: + +``` +ra_tls_verify_callback: Quote: verification failed with error OUT_OF_DATE_CONFIG_NEEDED +ra_tls_verify_callback_extended_der returned -9984 +``` + +try to run: + +``` +export RA_TLS_ALLOW_DEBUG_ENCLAVE_INSECURE=1 +export RA_TLS_ALLOW_HW_CONFIG_NEEDED=1 +export RA_TLS_ALLOW_OUTDATED_TCB_INSECURE=1 +export RA_TLS_ALLOW_SW_HARDENING_NEEDED=1 +``` + +You _may_ also need to rebuild the project: + +``` +cargo build --example client --verbose +``` + +### `raiko-host` + +Copy `raiko-guest` binary: + +```console +cargo build +cp target/debug/raiko-guest raiko-host/guests/sgx +cd raiko-host/guests/sgx +gramine-manifest -Dlog_level=error -Darch_libdir=/lib/x86_64-linux-gnu/ raiko-guest.manifest.template raiko-guest.manifest +gramine-sgx-sign --manifest raiko-guest.manifest --output raiko-guest.manifest.sgx +cd - +``` + +Start `raiko-host` JSON-RPC server: + +```console +RUST_LOG=debug cargo run --bin raiko-host -- --sgx-instance-id=123 +// or with specific log path +RUST_LOG=debug cargo run --bin raiko-host -- --sgx-instance-id=123 --log-path=/var/log/raiko +``` + +Send a request to the server: + +```console +curl --location --request POST 'http://127.0.0.1:8080/' \ +--header 'Content-Type: application/json' \ +--data-raw '{ + "jsonrpc": "2.0", + "id": 1, + "method": "proof", + "params": [ + { + "type": "Sgx", + "l2Rpc": "https://rpc.internal.taiko.xyz", + "l1Rpc": "https://l1rpc.internal.taiko.xyz", + "block": 2, + "prover": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "graffiti": "0000000000000000000000000000000000000000000000000000000000000000" + } + ] +}' +``` + +Result + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "type": "Sgx", + "proof": "0000007b00ea54fe7dfc5f3ea32b9c9f3398c8ee19998987597d80627c3e227cbfb798111adaf1a8b4332c98f06c4acabb06a34f8fadc04d44596e43fb764c4d2c58752f37722b4e734a323374fa9ef5d41b2669ef1194b8" + } +} +``` + +## Troubleshooting + +If you are getting the following error: + +```console +[P1:T1:] error: libos_init() failed in init_exec_handle: Permission denied (EACCES) +``` + +make sure to rerun `gramine-sgx-sign` command. diff --git a/docker/docker-compose-pos.yml b/docker/docker-compose-pos.yml new file mode 100644 index 000000000..50acaf04f --- /dev/null +++ b/docker/docker-compose-pos.yml @@ -0,0 +1,16 @@ +version: "3.9" +services: + raiko: + image: gcr.io/evmchain/raiko:latest-pos + container_name: raiko + command: --config-path=/etc/opt/raiko/config.toml + devices: + - "/dev/sgx_enclave:/dev/sgx_enclave" + - "/dev/sgx_provision:/dev/sgx_provision" + volumes: + - ${HOME}/.config/raiko/secrets:/opt/raiko/secrets + - /tmp/sgx:/tmp/sgx + - /var/log/raiko:/var/log/raiko + # - YOUR_CONFIG_PATH:/etc/opt/raiko/config.toml + ports: + - "8080:8080" diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 000000000..4680a39fe --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,15 @@ +version: "3.9" +services: + raiko: + image: gcr.io/evmchain/raiko:latest + container_name: raiko + command: --config-path=/etc/opt/raiko/config.toml + devices: + - "/dev/sgx_enclave:/dev/sgx_enclave" + - "/dev/sgx_provision:/dev/sgx_provision" + volumes: + - ${HOME}/.config/raiko/secrets:/opt/raiko/secrets + - /tmp/sgx:/tmp/sgx + - /var/log/raiko:/var/log/raiko + ports: + - "8080:8080" diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100755 index 000000000..10e57ccb7 --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -ex + +/restart_aesm.sh + +if [[ $# -eq 1 && $1 == "--init" ]]; then + cd /opt/raiko/guests/sgx + gramine-sgx ./raiko-guest bootstrap +else + /opt/raiko/bin/raiko-host "$@" +fi diff --git a/guests/Cargo.toml b/guests/Cargo.toml deleted file mode 100644 index 598a89ccb..000000000 --- a/guests/Cargo.toml +++ /dev/null @@ -1,10 +0,0 @@ -[package] -name = "zeth-guests" -version = "0.1.0" -edition = "2021" - -[build-dependencies] -risc0-build = { workspace = true } - -[package.metadata.risc0] -methods = ["eth-block", "op-block"] diff --git a/guests/build.rs b/guests/build.rs deleted file mode 100644 index 42c6db8ec..000000000 --- a/guests/build.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2023 RISC Zero, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -fn main() { - risc0_build::embed_methods(); -} diff --git a/guests/eth-block/Cargo.lock b/guests/eth-block/Cargo.lock deleted file mode 100644 index b59755129..000000000 --- a/guests/eth-block/Cargo.lock +++ /dev/null @@ -1,3337 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "alloy-primitives" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4084879b7257d5b95b9009837c07a1868bd7d60e66418a7764b9b580ae64e0" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "hex-literal", - "itoa", - "proptest", - "rand", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f938f00332d63a5b0ac687bd6f46d03884638948921d9f8b50c59563d421ae25" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", - "smol_str", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa5bb468bc7c46e0c5074d418f575262ff79451242e5ac1380121ed4e23c4fd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[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.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-trait" -version = "0.1.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version", -] - -[[package]] -name = "auto_impl" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bindgen" -version = "0.66.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" -dependencies = [ - "bitflags 2.4.0", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.25", - "which", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" -dependencies = [ - "serde", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "serde", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "bytemuck" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac926d808fb72fe09ebf471a091d6d72918876ccf0b4989766093d2d0d24a0ef" -dependencies = [ - "bindgen", - "blst", - "cc", - "glob", - "hex", - "libc", - "serde", -] - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "winapi", -] - -[[package]] -name = "clang-sys" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "const-hex" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "268f52aae268980d03dd9544c1ea591965b2735b038d6998d6e4ab37c8c24445" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.2" -source = "git+https://github.com/risc0/RustCrypto-crypto-bigint?tag=v0.5.2-risczero.0#8b30304277cfe553b51a78a0e693f48bbb059eb3" -dependencies = [ - "generic-array", - "getrandom", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.25", -] - -[[package]] -name = "darling_macro" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "data-encoding" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" - -[[package]] -name = "der" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "ecdsa" -version = "0.16.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" -dependencies = [ - "der", - "digest", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "elf" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b183d6ce6ca4cf30e3db37abf5b52568b5f9015c97d9fbdd7026aa5dcdd758" - -[[package]] -name = "elliptic-curve" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf56acd72bb22d2824e66ae8e9e5ada4d0de17a69c7fd35569dde2ada8ec9116" -dependencies = [ - "base64 0.13.1", - "bytes", - "hex", - "k256", - "log", - "rand", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[package]] -name = "enumn" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9838a970f5de399d3070ae1739e131986b2f5dcc223c7423ca0927e3a878522" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "eth-block" -version = "0.1.0" -dependencies = [ - "k256", - "risc0-zkvm", - "zeth-lib", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers-core" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "elliptic-curve", - "ethabi", - "generic-array", - "hex", - "k256", - "num_enum", - "open-fastrlp", - "rand", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-providers" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b498fd2a6c019d023e43e83488cd1fb0721f299055975aa6bac8dbf1e95f2c" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.2", - "bytes", - "enr", - "ethers-core", - "futures-channel", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "hex", - "http", - "instant", - "once_cell", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-tungstenite", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core", - "subtle", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "flate2" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 1.9.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" -dependencies = [ - "ahash", - "allocator-api2", - "serde", -] - -[[package]] -name = "hashers" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" -dependencies = [ - "fxhash", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "hyper" -version = "0.14.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" -dependencies = [ - "futures-util", - "http", - "hyper", - "rustls", - "tokio", - "tokio-rustls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows", -] - -[[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 = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] - -[[package]] -name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "itoa" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.1" -source = "git+https://github.com/risc0/RustCrypto-elliptic-curves?tag=k256/v0.13.1-risczero.1#5fea17d53fbaa0ff72dbe16da3ee2c2d02f2490c" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.148" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libm" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi", - "windows-sys", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "object" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parity-scale-codec" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756d439303e94fae44f288ba881ad29670c65b0c4b0e05674ca81061bb65f2c5" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d884d78fcf214d70b1e239fcd1c6e5e95aa3be1881918da2e488cc946c7a476" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version", -] - -[[package]] -name = "pin-project" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" -dependencies = [ - "proc-macro2", - "syn 2.0.25", -] - -[[package]] -name = "primitive-types" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" -dependencies = [ - "bit-set", - "bitflags 1.3.2", - "byteorder", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax 0.6.29", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "regex" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax 0.7.4", -] - -[[package]] -name = "regex-automata" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.7.4", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - -[[package]] -name = "reqwest" -version = "0.11.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" -dependencies = [ - "base64 0.21.2", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-rustls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.22.6", - "winreg", -] - -[[package]] -name = "revm" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f4ca8ae0345104523b4af1a8a7ea97cfa1865cdb7a7c25d23c1a18d9b48598" -dependencies = [ - "auto_impl", - "revm-interpreter", - "revm-precompile", - "serde", - "serde_json", -] - -[[package]] -name = "revm-interpreter" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f959cafdf64a7f89b014fa73dc2325001cf654b3d9400260b212d19a2ebe3da0" -dependencies = [ - "revm-primitives", - "serde", -] - -[[package]] -name = "revm-precompile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d360a88223d85709d2e95d4609eb1e19c649c47e28954bfabae5e92bb37e83e" -dependencies = [ - "c-kzg", - "k256", - "num", - "once_cell", - "revm-primitives", - "ripemd", - "secp256k1", - "sha2", - "substrate-bn", -] - -[[package]] -name = "revm-primitives" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51187b852d9e458816a2e19c81f1dd6c924077e1a8fccd16e4f044f865f299d7" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "auto_impl", - "bitflags 2.4.0", - "bitvec", - "c-kzg", - "enumn", - "hashbrown 0.14.0", - "hex", - "serde", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest", -] - -[[package]] -name = "risc0-binfmt" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede27631e6b2a946a43db812063453c9701d5d2544d82f9abec2cc12574ebb8e" -dependencies = [ - "anyhow", - "elf", - "log", - "risc0-zkp", - "risc0-zkvm-platform", - "serde", -] - -[[package]] -name = "risc0-circuit-rv32im" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e00222152fdc94cacc9b6682b5c0cbe8138f1ee82e80c24a64d9ad2c6d7415" -dependencies = [ - "anyhow", - "log", - "risc0-core", - "risc0-zkp", - "risc0-zkvm-platform", - "tracing", -] - -[[package]] -name = "risc0-core" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08605aec93ea22ed83f7f81f42e2d7287a5b0c749d8671f94de9d5994020045c" -dependencies = [ - "bytemuck", - "rand_core", -] - -[[package]] -name = "risc0-zkp" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28166926bb177824939f4e91083198f9f3da8137aeac32361bd34548c0526fa5" -dependencies = [ - "anyhow", - "blake2", - "bytemuck", - "digest", - "hex", - "log", - "paste", - "rand_core", - "risc0-core", - "risc0-zkvm-platform", - "serde", - "sha2", - "tracing", -] - -[[package]] -name = "risc0-zkvm" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec972152bcaa1a2967e412e22a84f6e2984a95c701bcc7943ca8ca10126ee0a2" -dependencies = [ - "anyhow", - "bytemuck", - "cfg-if", - "getrandom", - "hex", - "libm", - "log", - "num-derive", - "num-traits", - "risc0-binfmt", - "risc0-circuit-rv32im", - "risc0-core", - "risc0-zkp", - "risc0-zkvm-platform", - "serde", - "tempfile", - "tracing", -] - -[[package]] -name = "risc0-zkvm-platform" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8524b46783b58b00e9b2a4712e837093c975b23cf25bfaf99e1cf69e9011bf6b" - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rlp-derive", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ruint" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95294d6e3a6192f3aabf91c38f56505a625aa495533442744185a36d75a790c4" -dependencies = [ - "alloy-rlp", - "proptest", - "rand", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e666a5496a0b2186dbcd0ff6106e29e093c15591bde62c20d3842007c6978a09" - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.37.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys", -] - -[[package]] -name = "rustix" -version = "0.38.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25469e9ae0f3d0047ca8b93fc56843f38e6774f0914a107ff8b41be8be8e0b7" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys 0.4.8", - "windows-sys", -] - -[[package]] -name = "rustls" -version = "0.21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.1", - "sct", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" -dependencies = [ - "base64 0.21.2", -] - -[[package]] -name = "rustls-webpki" -version = "0.100.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f36a6828982f422756984e47912a7a51dcbc2a197aa791158f8ca61cd8204e" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" - -[[package]] -name = "scale-info" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sec1" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" -dependencies = [ - "cc", -] - -[[package]] -name = "semver" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "serde_json" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed" -dependencies = [ - "indexmap 2.0.0", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f02d8aa6e3c385bf084924f660ce2a3a6bd333ba55b35e8590b321f35d88513" -dependencies = [ - "base64 0.21.2", - "chrono", - "hex", - "indexmap 1.9.3", - "serde", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc7d5d3932fb12ce722ee5e64dd38c504efba37567f0c402f6ca728c3b8b070" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.6" -source = "git+https://github.com/risc0/RustCrypto-hashes?tag=sha2-v0.10.6-risczero.0#7fd6900c4f637bd15ee2642dfa77110f8f1ad065" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest", - "keccak", -] - -[[package]] -name = "shlex" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "smol_str" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "substrate-bn" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b5bbfa79abbae15dd642ea8176a21a635ff3c00059961d1ea27ad04e5b441c" -dependencies = [ - "byteorder", - "crunchy", - "lazy_static", - "rand", - "rustc-hex", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" -dependencies = [ - "autocfg", - "cfg-if", - "fastrand", - "redox_syscall", - "rustix 0.37.23", - "windows-sys", -] - -[[package]] -name = "thiserror" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" -dependencies = [ - "itoa", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" -dependencies = [ - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" -dependencies = [ - "autocfg", - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec509ac96e9a0c43427c74f003127d953a265737636129424288d27cb5c4b12c" -dependencies = [ - "futures-util", - "log", - "rustls", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.23.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" - -[[package]] -name = "toml_edit" -version = "0.19.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" -dependencies = [ - "indexmap 2.0.0", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "tracing-core" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "tungstenite" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15fba1a6d6bb030745759a9a2a588bfe8490fc8b4751a277db3a0be1c9ebbf67" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls", - "sha1", - "thiserror", - "url", - "utf-8", - "webpki", -] - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.25", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] - -[[package]] -name = "webpki-roots" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" -dependencies = [ - "rustls-webpki 0.100.1", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.17", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" -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", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - -[[package]] -name = "winnow" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version", - "send_wrapper 0.6.0", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "zeth-lib" -version = "0.1.0" -dependencies = [ - "anyhow", - "chrono", - "ethers-core", - "ethers-providers", - "flate2", - "hashbrown 0.14.0", - "log", - "once_cell", - "revm", - "ruint", - "serde", - "serde_json", - "serde_with", - "thiserror", - "tokio", - "zeth-primitives", -] - -[[package]] -name = "zeth-primitives" -version = "0.1.0" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-rlp-derive", - "anyhow", - "bytes", - "ethers-core", - "k256", - "revm-primitives", - "rlp", - "serde", - "sha3", - "thiserror", -] diff --git a/guests/eth-block/Cargo.toml b/guests/eth-block/Cargo.toml deleted file mode 100644 index 259aa976f..000000000 --- a/guests/eth-block/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "eth-block" -version = "0.1.0" -edition = "2021" - -[workspace] - -[dependencies] -k256 = { version = "=0.13.1", features = ["std", "ecdsa"], default_features = false } -risc0-zkvm = { version = "0.18", default-features = false, features = ['std'] } -zeth-lib = { path = "../../lib", default-features = false } - -[patch.crates-io] -# use optimized risc0 circuit -crypto-bigint = { git = "https://github.com/risc0/RustCrypto-crypto-bigint", tag = "v0.5.2-risczero.0" } -k256 = { git = "https://github.com/risc0/RustCrypto-elliptic-curves", tag = "k256/v0.13.1-risczero.1" } -sha2 = { git = "https://github.com/risc0/RustCrypto-hashes", tag = "sha2-v0.10.6-risczero.0" } - -[profile.release] -codegen-units = 1 -panic = "abort" -lto = "thin" diff --git a/guests/eth-block/src/main.rs b/guests/eth-block/src/main.rs deleted file mode 100644 index 383668121..000000000 --- a/guests/eth-block/src/main.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2023 RISC Zero, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#![no_main] - -use risc0_zkvm::guest::env; -use zeth_lib::{block_builder::EthereumBlockBuilder, consts::ETH_MAINNET_CHAIN_SPEC}; - -risc0_zkvm::guest::entry!(main); - -pub fn main() { - // Read the input previous block and transaction data - let input = env::read(); - // Build the resulting block - let output = EthereumBlockBuilder::build_from(Ð_MAINNET_CHAIN_SPEC, input) - .expect("Failed to build the resulting block"); - // Output the resulting block's hash to the journal - env::commit(&output.hash()); - // Leak memory, save cycles - core::mem::forget(output); -} diff --git a/guests/op-block/Cargo.lock b/guests/op-block/Cargo.lock deleted file mode 100644 index 02c66b76b..000000000 --- a/guests/op-block/Cargo.lock +++ /dev/null @@ -1,3337 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "alloy-primitives" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4084879b7257d5b95b9009837c07a1868bd7d60e66418a7764b9b580ae64e0" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "hex-literal", - "itoa", - "proptest", - "rand", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f938f00332d63a5b0ac687bd6f46d03884638948921d9f8b50c59563d421ae25" -dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", - "smol_str", -] - -[[package]] -name = "alloy-rlp-derive" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa5bb468bc7c46e0c5074d418f575262ff79451242e5ac1380121ed4e23c4fd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[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.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-trait" -version = "0.1.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "async_io_stream" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" -dependencies = [ - "futures", - "pharos", - "rustc_version", -] - -[[package]] -name = "auto_impl" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bindgen" -version = "0.66.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" -dependencies = [ - "bitflags 2.4.0", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.25", - "which", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" -dependencies = [ - "serde", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "serde", - "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blst" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94087b935a822949d3291a9989ad2b2051ea141eda0fd4e478a75f6aa3e604b" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "bumpalo" -version = "3.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" - -[[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "bytemuck" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdde5c9cd29ebd706ce1b35600920a33550e402fc998a2e53ad3b42c3c47a192" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -dependencies = [ - "serde", -] - -[[package]] -name = "c-kzg" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac926d808fb72fe09ebf471a091d6d72918876ccf0b4989766093d2d0d24a0ef" -dependencies = [ - "bindgen", - "blst", - "cc", - "glob", - "hex", - "libc", - "serde", -] - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "winapi", -] - -[[package]] -name = "clang-sys" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "const-hex" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "268f52aae268980d03dd9544c1ea591965b2735b038d6998d6e4ab37c8c24445" -dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "serde", -] - -[[package]] -name = "const-oid" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "795bc6e66a8e340f075fcf6227e417a2dc976b92b91f3cdc778bb858778b6747" - -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.2" -source = "git+https://github.com/risc0/RustCrypto-crypto-bigint?tag=v0.5.2-risc0#8b30304277cfe553b51a78a0e693f48bbb059eb3" -dependencies = [ - "generic-array", - "getrandom", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.25", -] - -[[package]] -name = "darling_macro" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "data-encoding" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" - -[[package]] -name = "der" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7ed52955ce76b1554f509074bb357d3fb8ac9b51288a65a3fd480d1dfba946" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "derive_more" -version = "0.99.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "ecdsa" -version = "0.16.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0997c976637b606099b9985693efa3581e84e41f5c11ba5255f88711058ad428" -dependencies = [ - "der", - "digest", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "elf" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b183d6ce6ca4cf30e3db37abf5b52568b5f9015c97d9fbdd7026aa5dcdd758" - -[[package]] -name = "elliptic-curve" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "encoding_rs" -version = "0.8.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enr" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf56acd72bb22d2824e66ae8e9e5ada4d0de17a69c7fd35569dde2ada8ec9116" -dependencies = [ - "base64 0.13.1", - "bytes", - "hex", - "k256", - "log", - "rand", - "rlp", - "serde", - "sha3", - "zeroize", -] - -[[package]] -name = "enumn" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9838a970f5de399d3070ae1739e131986b2f5dcc223c7423ca0927e3a878522" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "ethabi" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" -dependencies = [ - "ethereum-types", - "hex", - "once_cell", - "regex", - "serde", - "serde_json", - "sha3", - "thiserror", - "uint", -] - -[[package]] -name = "ethbloom" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" -dependencies = [ - "crunchy", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "tiny-keccak", -] - -[[package]] -name = "ethereum-types" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" -dependencies = [ - "ethbloom", - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "primitive-types", - "scale-info", - "uint", -] - -[[package]] -name = "ethers-core" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "elliptic-curve", - "ethabi", - "generic-array", - "hex", - "k256", - "num_enum", - "open-fastrlp", - "rand", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "ethers-providers" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b498fd2a6c019d023e43e83488cd1fb0721f299055975aa6bac8dbf1e95f2c" -dependencies = [ - "async-trait", - "auto_impl", - "base64 0.21.2", - "bytes", - "enr", - "ethers-core", - "futures-channel", - "futures-core", - "futures-timer", - "futures-util", - "hashers", - "hex", - "http", - "instant", - "once_cell", - "pin-project", - "reqwest", - "serde", - "serde_json", - "thiserror", - "tokio", - "tokio-tungstenite", - "tracing", - "tracing-futures", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "ws_stream_wasm", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core", - "subtle", -] - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "flate2" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-timer" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" -dependencies = [ - "gloo-timers", - "send_wrapper 0.4.0", -] - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gloo-timers" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "h2" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 1.9.3", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" -dependencies = [ - "ahash", - "allocator-api2", - "serde", -] - -[[package]] -name = "hashers" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" -dependencies = [ - "fxhash", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "home" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "hyper" -version = "0.14.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" -dependencies = [ - "futures-util", - "http", - "hyper", - "rustls", - "tokio", - "tokio-rustls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows", -] - -[[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 = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-rlp" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" -dependencies = [ - "rlp", -] - -[[package]] -name = "impl-serde" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" -dependencies = [ - "serde", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" -dependencies = [ - "equivalent", - "hashbrown 0.14.0", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys", -] - -[[package]] -name = "ipnet" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "itoa" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "k256" -version = "0.13.1" -source = "git+https://github.com/risc0/RustCrypto-elliptic-curves?tag=k256/v0.13.1-risc0#44b1fc2b317e76bb150636cf67d0fbdfcac39601" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2", - "signature", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -dependencies = [ - "spin", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "libc" -version = "0.2.148" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libm" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3852614a3bd9ca9804678ba6be5e3b8ce76dfc902cae004e3e0c44051b6e88db" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" -dependencies = [ - "libc", - "wasi", - "windows-sys", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "object" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "op-block" -version = "0.1.0" -dependencies = [ - "k256", - "risc0-zkvm", - "zeth-lib", -] - -[[package]] -name = "open-fastrlp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", - "ethereum-types", - "open-fastrlp-derive", -] - -[[package]] -name = "open-fastrlp-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" -dependencies = [ - "bytes", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parity-scale-codec" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756d439303e94fae44f288ba881ad29670c65b0c4b0e05674ca81061bb65f2c5" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d884d78fcf214d70b1e239fcd1c6e5e95aa3be1881918da2e488cc946c7a476" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pharos" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" -dependencies = [ - "futures", - "rustc_version", -] - -[[package]] -name = "pin-project" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "prettyplease" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" -dependencies = [ - "proc-macro2", - "syn 2.0.25", -] - -[[package]] -name = "primitive-types" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" -dependencies = [ - "fixed-hash", - "impl-codec", - "impl-rlp", - "impl-serde", - "scale-info", - "uint", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proptest" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" -dependencies = [ - "bit-set", - "bitflags 1.3.2", - "byteorder", - "lazy_static", - "num-traits", - "rand", - "rand_chacha", - "rand_xorshift", - "regex-syntax 0.6.29", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rand_xorshift" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" -dependencies = [ - "rand_core", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "regex" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax 0.7.4", -] - -[[package]] -name = "regex-automata" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.7.4", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" - -[[package]] -name = "reqwest" -version = "0.11.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" -dependencies = [ - "base64 0.21.2", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-rustls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.22.6", - "winreg", -] - -[[package]] -name = "revm" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f4ca8ae0345104523b4af1a8a7ea97cfa1865cdb7a7c25d23c1a18d9b48598" -dependencies = [ - "auto_impl", - "revm-interpreter", - "revm-precompile", - "serde", - "serde_json", -] - -[[package]] -name = "revm-interpreter" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f959cafdf64a7f89b014fa73dc2325001cf654b3d9400260b212d19a2ebe3da0" -dependencies = [ - "revm-primitives", - "serde", -] - -[[package]] -name = "revm-precompile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d360a88223d85709d2e95d4609eb1e19c649c47e28954bfabae5e92bb37e83e" -dependencies = [ - "c-kzg", - "k256", - "num", - "once_cell", - "revm-primitives", - "ripemd", - "secp256k1", - "sha2", - "substrate-bn", -] - -[[package]] -name = "revm-primitives" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51187b852d9e458816a2e19c81f1dd6c924077e1a8fccd16e4f044f865f299d7" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "auto_impl", - "bitflags 2.4.0", - "bitvec", - "c-kzg", - "enumn", - "hashbrown 0.14.0", - "hex", - "serde", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest", -] - -[[package]] -name = "risc0-binfmt" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede27631e6b2a946a43db812063453c9701d5d2544d82f9abec2cc12574ebb8e" -dependencies = [ - "anyhow", - "elf", - "log", - "risc0-zkp", - "risc0-zkvm-platform", - "serde", -] - -[[package]] -name = "risc0-circuit-rv32im" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e00222152fdc94cacc9b6682b5c0cbe8138f1ee82e80c24a64d9ad2c6d7415" -dependencies = [ - "anyhow", - "log", - "risc0-core", - "risc0-zkp", - "risc0-zkvm-platform", - "tracing", -] - -[[package]] -name = "risc0-core" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08605aec93ea22ed83f7f81f42e2d7287a5b0c749d8671f94de9d5994020045c" -dependencies = [ - "bytemuck", - "rand_core", -] - -[[package]] -name = "risc0-zkp" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28166926bb177824939f4e91083198f9f3da8137aeac32361bd34548c0526fa5" -dependencies = [ - "anyhow", - "blake2", - "bytemuck", - "digest", - "hex", - "log", - "paste", - "rand_core", - "risc0-core", - "risc0-zkvm-platform", - "serde", - "sha2", - "tracing", -] - -[[package]] -name = "risc0-zkvm" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec972152bcaa1a2967e412e22a84f6e2984a95c701bcc7943ca8ca10126ee0a2" -dependencies = [ - "anyhow", - "bytemuck", - "cfg-if", - "getrandom", - "hex", - "libm", - "log", - "num-derive", - "num-traits", - "risc0-binfmt", - "risc0-circuit-rv32im", - "risc0-core", - "risc0-zkp", - "risc0-zkvm-platform", - "serde", - "tempfile", - "tracing", -] - -[[package]] -name = "risc0-zkvm-platform" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8524b46783b58b00e9b2a4712e837093c975b23cf25bfaf99e1cf69e9011bf6b" - -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rlp-derive", - "rustc-hex", -] - -[[package]] -name = "rlp-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ruint" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95294d6e3a6192f3aabf91c38f56505a625aa495533442744185a36d75a790c4" -dependencies = [ - "alloy-rlp", - "proptest", - "rand", - "ruint-macro", - "serde", - "valuable", - "zeroize", -] - -[[package]] -name = "ruint-macro" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e666a5496a0b2186dbcd0ff6106e29e093c15591bde62c20d3842007c6978a09" - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "0.37.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys", -] - -[[package]] -name = "rustix" -version = "0.38.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25469e9ae0f3d0047ca8b93fc56843f38e6774f0914a107ff8b41be8be8e0b7" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys 0.4.8", - "windows-sys", -] - -[[package]] -name = "rustls" -version = "0.21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ea77c539259495ce8ca47f53e66ae0330a8819f67e23ac96ca02f50e7b7d36" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.1", - "sct", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" -dependencies = [ - "base64 0.21.2", -] - -[[package]] -name = "rustls-webpki" -version = "0.100.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustls-webpki" -version = "0.101.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f36a6828982f422756984e47912a7a51dcbc2a197aa791158f8ca61cd8204e" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" - -[[package]] -name = "rusty-fork" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - -[[package]] -name = "ryu" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" - -[[package]] -name = "scale-info" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" -dependencies = [ - "cfg-if", - "derive_more", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "sct" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "sec1" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0aec48e813d6b90b15f0b8948af3c63483992dee44c03e9930b3eebdabe046e" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" -dependencies = [ - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" -dependencies = [ - "cc", -] - -[[package]] -name = "semver" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" - -[[package]] -name = "send_wrapper" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" - -[[package]] -name = "send_wrapper" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" - -[[package]] -name = "serde" -version = "1.0.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.171" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "serde_json" -version = "1.0.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed" -dependencies = [ - "indexmap 2.0.0", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f02d8aa6e3c385bf084924f660ce2a3a6bd333ba55b35e8590b321f35d88513" -dependencies = [ - "base64 0.21.2", - "chrono", - "hex", - "indexmap 1.9.3", - "serde", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc7d5d3932fb12ce722ee5e64dd38c504efba37567f0c402f6ca728c3b8b070" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "sha1" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.6" -source = "git+https://github.com/risc0/RustCrypto-hashes?tag=sha2/v0.10.6-risc0#e75cafd9f55da196061f6fadf8bc8a86778192b7" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest", - "keccak", -] - -[[package]] -name = "shlex" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" -dependencies = [ - "digest", - "rand_core", -] - -[[package]] -name = "slab" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "smol_str" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" -dependencies = [ - "serde", -] - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spki" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "substrate-bn" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b5bbfa79abbae15dd642ea8176a21a635ff3c00059961d1ea27ad04e5b441c" -dependencies = [ - "byteorder", - "crunchy", - "lazy_static", - "rand", - "rustc-hex", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" -dependencies = [ - "autocfg", - "cfg-if", - "fastrand", - "redox_syscall", - "rustix 0.37.23", - "windows-sys", -] - -[[package]] -name = "thiserror" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35fc5b8971143ca348fa6df4f024d4d55264f3468c71ad1c2f365b0a4d58c42" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" -dependencies = [ - "itoa", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" -dependencies = [ - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" -dependencies = [ - "autocfg", - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec509ac96e9a0c43427c74f003127d953a265737636129424288d27cb5c4b12c" -dependencies = [ - "futures-util", - "log", - "rustls", - "tokio", - "tokio-rustls", - "tungstenite", - "webpki-roots 0.23.1", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml_datetime" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" - -[[package]] -name = "toml_edit" -version = "0.19.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" -dependencies = [ - "indexmap 2.0.0", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" -dependencies = [ - "cfg-if", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "tracing-core" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - -[[package]] -name = "tungstenite" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15fba1a6d6bb030745759a9a2a588bfe8490fc8b4751a277db3a0be1c9ebbf67" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand", - "rustls", - "sha1", - "thiserror", - "url", - "utf-8", - "webpki", -] - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.25", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - -[[package]] -name = "webpki-roots" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] - -[[package]] -name = "webpki-roots" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" -dependencies = [ - "rustls-webpki 0.100.1", -] - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.17", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" -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", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - -[[package]] -name = "winnow" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "ws_stream_wasm" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" -dependencies = [ - "async_io_stream", - "futures", - "js-sys", - "log", - "pharos", - "rustc_version", - "send_wrapper 0.6.0", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.25", -] - -[[package]] -name = "zeth-lib" -version = "0.1.0" -dependencies = [ - "anyhow", - "chrono", - "ethers-core", - "ethers-providers", - "flate2", - "hashbrown 0.14.0", - "log", - "once_cell", - "revm", - "ruint", - "serde", - "serde_json", - "serde_with", - "thiserror", - "tokio", - "zeth-primitives", -] - -[[package]] -name = "zeth-primitives" -version = "0.1.0" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "alloy-rlp-derive", - "anyhow", - "bytes", - "ethers-core", - "k256", - "revm-primitives", - "rlp", - "serde", - "sha3", - "thiserror", -] diff --git a/guests/op-block/Cargo.toml b/guests/op-block/Cargo.toml deleted file mode 100644 index 3cc3496f2..000000000 --- a/guests/op-block/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "op-block" -version = "0.1.0" -edition = "2021" - -[workspace] - -[dependencies] -k256 = { version = "=0.13.1", features = ["std", "ecdsa"], default_features = false } -risc0-zkvm = { version = "0.18", default-features = false, features = ['std'] } -zeth-lib = { path = "../../lib", default-features = false } - -[patch.crates-io] -# use optimized risc0 circuit -crypto-bigint = { git = "https://github.com/risc0/RustCrypto-crypto-bigint", tag = "v0.5.2-risc0" } -k256 = { git = "https://github.com/risc0/RustCrypto-elliptic-curves", tag = "k256/v0.13.1-risc0" } -sha2 = { git = "https://github.com/risc0/RustCrypto-hashes", tag = "sha2/v0.10.6-risc0" } - -[profile.release] -codegen-units = 1 -panic = "abort" -lto = "thin" diff --git a/guests/op-block/src/main.rs b/guests/op-block/src/main.rs deleted file mode 100644 index c3f8b9c9e..000000000 --- a/guests/op-block/src/main.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2023 RISC Zero, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#![no_main] - -use risc0_zkvm::guest::env; -use zeth_lib::{block_builder::OptimismBlockBuilder, consts::OP_MAINNET_CHAIN_SPEC}; - -risc0_zkvm::guest::entry!(main); - -pub fn main() { - // Read the input previous block and transaction data - let input = env::read(); - // Build the resulting block - let output = OptimismBlockBuilder::build_from(&OP_MAINNET_CHAIN_SPEC, input) - .expect("Failed to build the resulting block"); - // Output the resulting block's hash to the journal - env::commit(&output.hash()); - // Leak memory, save cycles - core::mem::forget(output); -} diff --git a/guests/src/lib.rs b/guests/src/lib.rs deleted file mode 100644 index 0c7a9dd66..000000000 --- a/guests/src/lib.rs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2023 RISC Zero, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -include!(concat!(env!("OUT_DIR"), "/methods.rs")); diff --git a/host/Cargo.toml b/host/Cargo.toml deleted file mode 100644 index b9b730d89..000000000 --- a/host/Cargo.toml +++ /dev/null @@ -1,27 +0,0 @@ -[package] -name = "zeth" -version = "0.1.0" -edition = "2021" - -[dependencies] -anyhow = "1.0" -bincode = "1.3.3" -bonsai-sdk = { workspace = true } -bytemuck = "1.13" -clap = { version = "4.0", features = ["derive"] } -env_logger = "0.10" -ethers-core = { version = "2.0", features = ["optimism"] } -hex = "0.4.3" -log = "0.4" -revm = { workspace = true } -risc0-zkvm = { workspace = true, features = ["prove", "profiler"] } -serde = "1.0" -tempfile = "3.6" -tokio = { version = "1.23", features = ["full"] } -zeth-guests = { path = "../guests" } -zeth-lib = { path = "../lib" } -zeth-primitives = { path = "../primitives" } - -[dev-dependencies] -assert_cmd = "2.0" -rstest = "0.18" diff --git a/host/src/main.rs b/host/src/main.rs deleted file mode 100644 index 2bca2c86f..000000000 --- a/host/src/main.rs +++ /dev/null @@ -1,422 +0,0 @@ -// Copyright 2023 RISC Zero, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -extern crate core; - -use std::{fmt::Debug, time::Instant}; - -use anyhow::{bail, Result}; -use bonsai_sdk::alpha as bonsai_sdk; -use clap::Parser; -use ethers_core::types::Transaction as EthersTransaction; -use log::{error, info}; -use risc0_zkvm::{ - serde::{from_slice, to_vec}, - Executor, ExecutorEnv, FileSegmentRef, MemoryImage, Program, Receipt, -}; -use serde::{Deserialize, Serialize}; -use tempfile::tempdir; -use zeth_guests::{ - ETH_BLOCK_ELF, ETH_BLOCK_ID, ETH_BLOCK_PATH, OP_BLOCK_ELF, OP_BLOCK_ID, OP_BLOCK_PATH, -}; -use zeth_lib::{ - block_builder::{ - BlockBuilder, EthereumStrategyBundle, NetworkStrategyBundle, OptimismStrategyBundle, - }, - consts::{ChainSpec, Network, ETH_MAINNET_CHAIN_SPEC, OP_MAINNET_CHAIN_SPEC}, - finalization::DebugBuildFromMemDbStrategy, - initialization::MemDbInitStrategy, - input::Input, -}; -use zeth_primitives::BlockHash; - -#[derive(Parser, Debug)] -#[clap(author, version, about, long_about = None)] -struct Args { - #[clap(short, long, require_equals = true)] - /// URL of the chain RPC node. - rpc_url: Option, - - #[clap(short, long, require_equals = true, num_args = 0..=1, default_missing_value = "host/testdata")] - /// Use a local directory as a cache for RPC calls. Accepts a custom directory. - /// [default: host/testdata] - cache: Option, - - #[clap( - short, - long, - require_equals = true, - value_enum, - default_value = "ethereum" - )] - /// Network name. - network: Network, - - #[clap(short, long, require_equals = true)] - /// Block number to validate. - block_no: u64, - - #[clap(short, long, require_equals = true, num_args = 0..=1, default_missing_value = "20")] - /// Runs the verification inside the zkvm executor locally. Accepts a custom maximum - /// segment cycle count as a power of 2. [default: 20] - local_exec: Option, - - #[clap(short, long, default_value_t = false)] - /// Whether to submit the proving workload to Bonsai. - submit_to_bonsai: bool, - - #[clap(short, long, require_equals = true)] - /// Bonsai Session UUID to use for receipt verification. - verify_bonsai_receipt_uuid: Option, - - #[clap(short, long, default_value_t = false)] - /// Whether to profile the zkVM execution - profile: bool, -} - -fn cache_file_path(cache_path: &String, network: &String, block_no: u64, ext: &str) -> String { - format!("{}/{}/{}.{}", cache_path, network, block_no, ext) -} - -#[tokio::main] -async fn main() -> Result<()> { - env_logger::init(); - let args = Args::parse(); - - match args.network { - Network::Ethereum => { - run_with_bundle::( - args, - ETH_MAINNET_CHAIN_SPEC.clone(), - ETH_BLOCK_ELF, - ETH_BLOCK_ID, - ETH_BLOCK_PATH, - ) - .await - } - Network::Optimism => { - run_with_bundle::( - args, - OP_MAINNET_CHAIN_SPEC.clone(), - OP_BLOCK_ELF, - OP_BLOCK_ID, - OP_BLOCK_PATH, - ) - .await - } - } -} - -async fn run_with_bundle( - args: Args, - chain_spec: ChainSpec, - guest_elf: &[u8], - guest_id: [u32; risc0_zkvm::sha::DIGEST_WORDS], - guest_path: &str, -) -> Result<()> -where - N::TxEssence: 'static + Send + TryFrom + Serialize + Deserialize<'static>, - >::Error: Debug, - ::Error: Debug, -{ - // Fetch all of the initial data - let rpc_cache = args - .cache - .as_ref() - .map(|dir| cache_file_path(dir, &args.network.to_string(), args.block_no, "json.gz")); - - let init_spec = chain_spec.clone(); - let init = tokio::task::spawn_blocking(move || { - zeth_lib::host::get_initial_data::(init_spec, rpc_cache, args.rpc_url, args.block_no) - .expect("Could not init") - }) - .await?; - - let input: Input = init.clone().into(); - - // Verify that the transactions run correctly - { - info!("Running from memory ..."); - - // todo: extend to use [ConfiguredBlockBuilder] - let block_builder = BlockBuilder::new(&chain_spec, input.clone()) - .initialize_database::() - .expect("Error initializing MemDb from Input") - .prepare_header::() - .expect("Error creating initial block header") - .execute_transactions::() - .expect("Error while running transactions"); - - let fini_db = block_builder.db().unwrap().clone(); - let accounts_len = fini_db.accounts_len(); - - let (validated_header, storage_deltas) = block_builder - .build::() - .expect("Error while verifying final state"); - - info!( - "Memory-backed execution is Done! Database contains {} accounts", - accounts_len - ); - - // Verify final state - info!("Verifying final state using provider data ..."); - let errors = zeth_lib::host::verify_state(fini_db, init.fini_proofs, storage_deltas) - .expect("Could not verify final state!"); - for (address, address_errors) in &errors { - error!( - "Verify found {:?} error(s) for address {:?}", - address_errors.len(), - address - ); - for error in address_errors { - match error { - zeth_lib::host::VerifyError::BalanceMismatch { - rpc_value, - our_value, - difference, - } => error!( - " Error: BalanceMismatch: rpc_value={} our_value={} difference={}", - rpc_value, our_value, difference - ), - _ => error!(" Error: {:?}", error), - } - } - } - - let errors_len = errors.len(); - if errors_len > 0 { - error!( - "Verify found {:?} account(s) with error(s) ({}% correct)", - errors_len, - (100.0 * (accounts_len - errors_len) as f64 / accounts_len as f64) - ); - } - - if validated_header.base_fee_per_gas != init.fini_block.base_fee_per_gas { - error!( - "Base fee mismatch {} (expected {})", - validated_header.base_fee_per_gas, init.fini_block.base_fee_per_gas - ); - } - - if validated_header.state_root != init.fini_block.state_root { - error!( - "State root mismatch {} (expected {})", - validated_header.state_root, init.fini_block.state_root - ); - } - - if validated_header.transactions_root != init.fini_block.transactions_root { - error!( - "Transactions root mismatch {} (expected {})", - validated_header.transactions_root, init.fini_block.transactions_root - ); - } - - if validated_header.receipts_root != init.fini_block.receipts_root { - error!( - "Receipts root mismatch {} (expected {})", - validated_header.receipts_root, init.fini_block.receipts_root - ); - } - - if validated_header.withdrawals_root != init.fini_block.withdrawals_root { - error!( - "Withdrawals root mismatch {:?} (expected {:?})", - validated_header.withdrawals_root, init.fini_block.withdrawals_root - ); - } - - let found_hash = validated_header.hash(); - let expected_hash = init.fini_block.hash(); - if found_hash.as_slice() != expected_hash.as_slice() { - error!( - "Final block hash mismatch {} (expected {})", - found_hash, expected_hash, - ); - - bail!("Invalid block hash"); - } - - info!("Final block hash derived successfully. {}", found_hash) - } - - // Run in the executor (if requested) - if let Some(segment_limit_po2) = args.local_exec { - info!( - "Running in executor with segment_limit_po2 = {:?}", - segment_limit_po2 - ); - - let input = to_vec(&input).expect("Could not serialize input!"); - info!( - "Input size: {} words ( {} MB )", - input.len(), - input.len() * 4 / 1_000_000 - ); - - let mut profiler = risc0_zkvm::Profiler::new(guest_path, guest_elf).unwrap(); - - info!("Running the executor..."); - let start_time = Instant::now(); - let session = { - let mut builder = ExecutorEnv::builder(); - builder - .session_limit(None) - .segment_limit_po2(segment_limit_po2) - .add_input(&input); - - if args.profile { - builder.trace_callback(profiler.make_trace_callback()); - } - - let env = builder.build().unwrap(); - let mut exec = Executor::from_elf(env, guest_elf).unwrap(); - - let segment_dir = tempdir().unwrap(); - - exec.run_with_callback(|segment| { - Ok(Box::new(FileSegmentRef::new(&segment, segment_dir.path())?)) - }) - .unwrap() - }; - info!( - "Generated {:?} segments; elapsed time: {:?}", - session.segments.len(), - start_time.elapsed() - ); - - if args.profile { - profiler.finalize(); - - let sys_time = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap(); - tokio::fs::write( - format!("profile_{}.pb", sys_time.as_secs()), - &profiler.encode_to_vec(), - ) - .await - .expect("Failed to write profiling output"); - } - - info!( - "Executor ran in (roughly) {} cycles", - session.segments.len() * (1 << segment_limit_po2) - ); - - let expected_hash = init.fini_block.hash(); - let found_hash: BlockHash = from_slice(&session.journal).unwrap(); - - if found_hash == expected_hash { - info!("Block hash (from executor): {}", found_hash); - } else { - error!( - "Final block hash mismatch (from executor) {} (expected {})", - found_hash, expected_hash, - ); - } - } - - let mut bonsai_session_uuid = args.verify_bonsai_receipt_uuid; - - // Run in Bonsai (if requested) - if bonsai_session_uuid.is_none() && args.submit_to_bonsai { - info!("Creating Bonsai client"); - let client = bonsai_sdk::Client::from_env().expect("Could not create Bonsai client"); - - // create the memoryImg, upload it and return the imageId - info!("Uploading memory image"); - let img_id = { - let program = Program::load_elf(guest_elf, risc0_zkvm::MEM_SIZE as u32) - .expect("Could not load ELF"); - let image = MemoryImage::new(&program, risc0_zkvm::PAGE_SIZE as u32) - .expect("Could not create memory image"); - let image_id = hex::encode(image.compute_id()); - let image = bincode::serialize(&image).expect("Failed to serialize memory img"); - - client - .upload_img(&image_id, image) - .expect("Could not upload ELF"); - image_id - }; - - // Prepare input data and upload it. - info!("Uploading inputs"); - let input_data = to_vec(&input).unwrap(); - let input_data = bytemuck::cast_slice(&input_data).to_vec(); - let input_id = client - .upload_input(input_data) - .expect("Could not upload inputs"); - - // Start a session running the prover - info!("Starting session"); - let session = client - .create_session(img_id, input_id) - .expect("Could not create Bonsai session"); - - println!("Bonsai session UUID: {}", session.uuid); - bonsai_session_uuid = Some(session.uuid) - } - - // Verify receipt from Bonsai (if requested) - if let Some(session_uuid) = bonsai_session_uuid { - let client = bonsai_sdk::Client::from_env().expect("Could not create Bonsai client"); - let session = bonsai_sdk::SessionId { uuid: session_uuid }; - - loop { - let res = session - .status(&client) - .expect("Could not fetch Bonsai status"); - if res.status == "RUNNING" { - tokio::time::sleep(std::time::Duration::from_secs(15)).await; - continue; - } - if res.status == "SUCCEEDED" { - // Download the receipt, containing the output - let receipt_url = res - .receipt_url - .expect("API error, missing receipt on completed session"); - - let receipt_buf = client - .download(&receipt_url) - .expect("Could not download receipt"); - let receipt: Receipt = - bincode::deserialize(&receipt_buf).expect("Could not deserialize receipt"); - receipt - .verify(guest_id) - .expect("Receipt verification failed"); - - let expected_hash = init.fini_block.hash(); - let found_hash: BlockHash = from_slice(&receipt.journal).unwrap(); - - if found_hash == expected_hash { - info!("Block hash (from Bonsai): {}", found_hash); - } else { - error!( - "Final block hash mismatch (from Bonsai) {} (expected {})", - found_hash, expected_hash, - ); - } - } else { - panic!("Workflow exited: {}", res.status); - } - - break; - } - } - - Ok(()) -} diff --git a/host/testdata/ethereum/16424130.json.gz b/host/testdata/ethereum/16424130.json.gz deleted file mode 100644 index f3b271e84..000000000 Binary files a/host/testdata/ethereum/16424130.json.gz and /dev/null differ diff --git a/host/testdata/ethereum/17034871.json.gz b/host/testdata/ethereum/17034871.json.gz deleted file mode 100644 index e653eb252..000000000 Binary files a/host/testdata/ethereum/17034871.json.gz and /dev/null differ diff --git a/host/testdata/optimism/107728767.json.gz b/host/testdata/optimism/107728767.json.gz deleted file mode 100644 index d4039ddfb..000000000 Binary files a/host/testdata/optimism/107728767.json.gz and /dev/null differ diff --git a/host/testdata/optimism/109194691.json.gz b/host/testdata/optimism/109194691.json.gz deleted file mode 100644 index a062e0f9f..000000000 Binary files a/host/testdata/optimism/109194691.json.gz and /dev/null differ diff --git a/host/tests/blocks.rs b/host/tests/blocks.rs deleted file mode 100644 index 07954126b..000000000 --- a/host/tests/blocks.rs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2023 RISC Zero, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use std::{path::PathBuf, str::FromStr}; - -use assert_cmd::Command; -use risc0_zkvm::{serde::to_vec, Executor, ExecutorEnv, FileSegmentRef}; -use rstest::rstest; -use tempfile::tempdir; -use zeth_guests::ETH_BLOCK_ELF; -use zeth_lib::{ - block_builder::EthereumStrategyBundle, consts::ETH_MAINNET_CHAIN_SPEC, input::Input, -}; -use zeth_primitives::{transactions::ethereum::EthereumTxEssence, trie::MptNodeData}; - -#[rstest] -fn block_cli_ethereum(#[files("testdata/ethereum/*.json.gz")] path: PathBuf) { - let block_no = file_prefix(&path); - - Command::cargo_bin("zeth") - .unwrap() - .args(["--cache=testdata", &format!("--block-no={}", block_no)]) - .assert() - .success(); -} - -#[rstest] -fn empty_blocks(#[files("testdata/ethereum/*.json.gz")] path: PathBuf) { - let block_no = u64::from_str(file_prefix(&path)).unwrap(); - // Set block cache directory - let rpc_cache = Some(format!("testdata/ethereum/{}.json.gz", block_no)); - // Fetch all of the initial data - let init = zeth_lib::host::get_initial_data::( - ETH_MAINNET_CHAIN_SPEC.clone(), - rpc_cache, - None, - block_no, - ) - .expect("Could not init"); - // Create input object - let mut input: Input = init.clone().into(); - // Take out transaction and withdrawal execution data - input.transactions = Default::default(); - input.withdrawals = Default::default(); - input.contracts = Default::default(); - input.parent_state_trie = MptNodeData::Digest(input.parent_state_trie.hash()).into(); - input.parent_storage = Default::default(); - input.ancestor_headers = Default::default(); - // Prepare executor - let env = ExecutorEnv::builder() - .session_limit(None) - .segment_limit_po2(20) - .add_input(&to_vec(&input).unwrap()) - .build() - .unwrap(); - let mut exec = Executor::from_elf(env, ETH_BLOCK_ELF).unwrap(); - // Run Executor - let segment_dir = tempdir().unwrap(); - let session = exec - .run_with_callback(|segment| { - Ok(Box::new(FileSegmentRef::new(&segment, segment_dir.path())?)) - }) - .unwrap(); - // Output segment count - println!("Generated {} segments", session.segments.len()); -} - -fn file_prefix(path: &PathBuf) -> &str { - let file_name = path.file_name().unwrap().to_str().unwrap(); - file_name.split('.').next().unwrap() -} diff --git a/img/key_rotation_diagram.png b/img/key_rotation_diagram.png new file mode 100644 index 000000000..9e15b41f9 Binary files /dev/null and b/img/key_rotation_diagram.png differ diff --git a/lib/Cargo.toml b/lib/Cargo.toml index bb7845d3b..c27b1b14c 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -13,6 +13,9 @@ ruint = { version = "1.10", default-features = false } serde = "1.0" thiserror = "1.0" zeth-primitives = { path = "../primitives", features = ["revm"] } +hex = "0.4.3" +rlp = "0.5.2" +tracing = "0.1" [target.'cfg(not(target_os = "zkvm"))'.dependencies] chrono = { version = "0.4", default-features = false } @@ -27,3 +30,8 @@ zeth-primitives = { path = "../primitives", features = ["revm", "ethers"] } [dev-dependencies] bincode = "1.3" serde_with = "3.1" + +[features] +taiko = ["zeth-primitives/taiko"] +pos = [] +server = [] diff --git a/lib/src/consts.rs b/lib/src/consts.rs index 0bfbf408d..8c4257009 100644 --- a/lib/src/consts.rs +++ b/lib/src/consts.rs @@ -21,7 +21,7 @@ use anyhow::bail; use once_cell::sync::Lazy; use revm::primitives::SpecId; use serde::{Deserialize, Serialize}; -use zeth_primitives::{uint, BlockNumber, ChainId, U256}; +use zeth_primitives::{uint, Address, BlockNumber, ChainId, U256}; /// U256 representation of 0. pub const ZERO: U256 = U256::ZERO; @@ -62,9 +62,51 @@ pub static ETH_MAINNET_CHAIN_SPEC: Lazy = Lazy::new(|| { base_fee_max_decrease_denominator: uint!(8_U256), elasticity_multiplier: uint!(2_U256), }, + l1_contract: None, + l1_signal_service: None, + l2_contract: None, + l2_signal_service: None, } }); +macro_rules! taiko_chain_spec { + ($a:ident, $b:ident ) => { + pub static $a: Lazy = Lazy::new(|| { + use zeth_primitives::taiko::$b::*; + ChainSpec { + chain_id: CHAIN_ID, + hard_forks: BTreeMap::from([ + (SpecId::SHANGHAI, ForkCondition::Block(0)), + (SpecId::CANCUN, ForkCondition::TBD), + ]), + eip_1559_constants: Eip1559Constants { + base_fee_change_denominator: uint!(8_U256), + base_fee_max_increase_denominator: uint!(8_U256), + base_fee_max_decrease_denominator: uint!(8_U256), + elasticity_multiplier: uint!(2_U256), + }, + l1_contract: Some(*L1_CONTRACT), + l1_signal_service: Some(*L1_SIGNAL_SERVICE), + l2_contract: Some(*L2_CONTRACT), + l2_signal_service: Some(*L2_SIGNAL_SERVICE), + } + }); + }; +} + +taiko_chain_spec!(TAIKO_TESTNET_CHAIN_SPEC, testnet); +taiko_chain_spec!(TAIKO_INTERNAL_DEVNET_A_CHAIN_SPEC, internal_devnet_a); +taiko_chain_spec!(TAIKO_INTERNAL_DEVNET_B_CHAIN_SPEC, internal_devnet_b); + +pub fn get_taiko_chain_spec(chain: &str) -> ChainSpec { + match chain { + "testnet" => TAIKO_TESTNET_CHAIN_SPEC.clone(), + "internal_devnet_a" => TAIKO_INTERNAL_DEVNET_A_CHAIN_SPEC.clone(), + "internal_devnet_b" => TAIKO_INTERNAL_DEVNET_B_CHAIN_SPEC.clone(), + _ => panic!("unknown chain"), + } +} + /// The optimism mainnet specification. pub static OP_MAINNET_CHAIN_SPEC: Lazy = Lazy::new(|| ChainSpec { chain_id: 10, @@ -75,6 +117,10 @@ pub static OP_MAINNET_CHAIN_SPEC: Lazy = Lazy::new(|| ChainSpec { base_fee_max_decrease_denominator: uint!(50_U256), elasticity_multiplier: uint!(6_U256), }, + l1_contract: None, + l1_signal_service: None, + l2_contract: None, + l2_signal_service: None, }); /// The condition at which a fork is activated. @@ -123,6 +169,10 @@ pub struct ChainSpec { chain_id: ChainId, hard_forks: BTreeMap, eip_1559_constants: Eip1559Constants, + pub l1_contract: Option
, + pub l1_signal_service: Option
, + pub l2_contract: Option
, + pub l2_signal_service: Option
, } impl ChainSpec { @@ -136,6 +186,10 @@ impl ChainSpec { chain_id, hard_forks: BTreeMap::from([(spec_id, ForkCondition::Block(0))]), eip_1559_constants, + l1_contract: None, + l1_signal_service: None, + l2_contract: None, + l2_signal_service: None, } } /// Returns the network chain ID. diff --git a/lib/src/host/mod.rs b/lib/src/host/mod.rs index 051d5fca3..317a5c8f6 100644 --- a/lib/src/host/mod.rs +++ b/lib/src/host/mod.rs @@ -122,6 +122,7 @@ where contracts: vec![], parent_header: init_block.clone().try_into()?, ancestor_headers: vec![], + base_fee_per_gas: Default::default(), }; // Create the block builder, run the transactions and extract the DB @@ -363,7 +364,7 @@ fn proofs_to_tries( let root_node = if let Some(root_node) = root_node { root_node - } else if proof.storage_hash.0 == EMPTY_ROOT.0 { + } else if proof.storage_hash.0 == EMPTY_ROOT.0 || proof.storage_hash.is_zero() { MptNode::default() } else { // if there are no storage proofs but the root is non-empty, create a dummy @@ -469,6 +470,7 @@ impl From> for Input { parent_storage: storage.into_iter().collect(), contracts: contracts.into_values().collect(), ancestor_headers: value.ancestor_headers, + base_fee_per_gas: value.fini_block.base_fee_per_gas, } } } diff --git a/lib/src/host/provider/cached_rpc_provider.rs b/lib/src/host/provider/cached_rpc_provider.rs index 762d74bfc..8a8871183 100644 --- a/lib/src/host/provider/cached_rpc_provider.rs +++ b/lib/src/host/provider/cached_rpc_provider.rs @@ -14,6 +14,8 @@ use anyhow::Result; use ethers_core::types::{Block, Bytes, EIP1186ProofResponse, Transaction, H256, U256}; +#[cfg(feature = "taiko")] +use zeth_primitives::taiko::BlockProposed; use super::{ file_provider::FileProvider, rpc_provider::RpcProvider, AccountQuery, BlockQuery, MutProvider, @@ -125,4 +127,36 @@ impl Provider for CachedRpcProvider { Ok(out) } + + #[cfg(feature = "taiko")] + fn get_propose(&mut self, query: &super::ProposeQuery) -> Result<(Transaction, BlockProposed)> { + let cache_out = self.cache.get_propose(query); + if cache_out.is_ok() { + return cache_out; + } + + let out = self.rpc.get_propose(query)?; + self.cache.insert_propose(query.clone(), out.clone()); + + Ok(out) + } + + #[cfg(feature = "taiko")] + fn batch_get_partial_blocks(&mut self, query: &BlockQuery) -> Result>> { + let cache_out = self.cache.batch_get_partial_blocks(query); + if cache_out.is_ok() { + return cache_out; + } + + let out = self.rpc.batch_get_partial_blocks(query)?; + for block in out.iter() { + self.cache.insert_partial_block( + BlockQuery { + block_no: block.number.unwrap().as_u64(), + }, + block.clone(), + ); + } + Ok(out) + } } diff --git a/lib/src/host/provider/file_provider.rs b/lib/src/host/provider/file_provider.rs index c927f2904..a8cf08fa4 100644 --- a/lib/src/host/provider/file_provider.rs +++ b/lib/src/host/provider/file_provider.rs @@ -13,7 +13,7 @@ // limitations under the License. use std::{ - collections::HashMap, + collections::{BTreeMap, HashMap}, fs::File, io::{Read, Write}, }; @@ -22,6 +22,8 @@ use anyhow::{anyhow, Result}; use ethers_core::types::{Block, Bytes, EIP1186ProofResponse, Transaction, H256, U256}; use serde::{Deserialize, Serialize}; use serde_with::serde_as; +#[cfg(feature = "taiko")] +use zeth_primitives::taiko::BlockProposed; use super::{AccountQuery, BlockQuery, MutProvider, ProofQuery, Provider, StorageQuery}; @@ -35,7 +37,7 @@ pub struct FileProvider { #[serde_as(as = "Vec<(_, _)>")] full_blocks: HashMap>, #[serde_as(as = "Vec<(_, _)>")] - partial_blocks: HashMap>, + partial_blocks: BTreeMap>, #[serde_as(as = "Vec<(_, _)>")] proofs: HashMap, #[serde_as(as = "Vec<(_, _)>")] @@ -46,6 +48,8 @@ pub struct FileProvider { code: HashMap, #[serde_as(as = "Vec<(_, _)>")] storage: HashMap, + #[cfg(feature = "taiko")] + propose: Option<(Transaction, BlockProposed)>, } impl FileProvider { @@ -54,12 +58,14 @@ impl FileProvider { file_path, dirty: false, full_blocks: HashMap::new(), - partial_blocks: HashMap::new(), + partial_blocks: BTreeMap::new(), proofs: HashMap::new(), transaction_count: HashMap::new(), balance: HashMap::new(), code: HashMap::new(), storage: HashMap::new(), + #[cfg(feature = "taiko")] + propose: Default::default(), } } @@ -142,6 +148,23 @@ impl Provider for FileProvider { None => Err(anyhow!("No data for {:?}", query)), } } + + #[cfg(feature = "taiko")] + fn get_propose(&mut self, query: &super::ProposeQuery) -> Result<(Transaction, BlockProposed)> { + match self.propose { + Some(ref val) => Ok(val.clone()), + None => Err(anyhow!("No data for {:?}", query)), + } + } + + #[cfg(feature = "taiko")] + fn batch_get_partial_blocks(&mut self, _: &BlockQuery) -> Result>> { + if self.partial_blocks.is_empty() { + Err(anyhow!("No data for partial blocks")) + } else { + Ok(self.partial_blocks.values().cloned().collect()) + } + } } impl MutProvider for FileProvider { @@ -179,4 +202,10 @@ impl MutProvider for FileProvider { self.storage.insert(query, val); self.dirty = true; } + + #[cfg(feature = "taiko")] + fn insert_propose(&mut self, _query: super::ProposeQuery, val: (Transaction, BlockProposed)) { + self.propose = Some(val); + self.dirty = true; + } } diff --git a/lib/src/host/provider/mod.rs b/lib/src/host/provider/mod.rs index 8500ffa56..0ffe659f0 100644 --- a/lib/src/host/provider/mod.rs +++ b/lib/src/host/provider/mod.rs @@ -17,6 +17,8 @@ use std::collections::BTreeSet; use anyhow::{anyhow, Result}; use ethers_core::types::{Block, Bytes, EIP1186ProofResponse, Transaction, H160, H256, U256}; use serde::{Deserialize, Serialize}; +#[cfg(feature = "taiko")] +use zeth_primitives::taiko::BlockProposed; pub mod cached_rpc_provider; pub mod file_provider; @@ -28,7 +30,7 @@ pub struct AccountQuery { pub address: H160, } -#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] +#[derive(Clone, Debug, Deserialize, PartialOrd, Ord, Eq, Hash, PartialEq, Serialize)] pub struct BlockQuery { pub block_no: u64, } @@ -47,6 +49,14 @@ pub struct StorageQuery { pub index: H256, } +#[cfg(feature = "taiko")] +#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] +pub struct ProposeQuery { + pub l1_contract: H160, + pub l1_block_no: u64, + pub l2_block_no: u64, +} + pub trait Provider: Send { fn save(&self) -> Result<()>; @@ -57,6 +67,12 @@ pub trait Provider: Send { fn get_balance(&mut self, query: &AccountQuery) -> Result; fn get_code(&mut self, query: &AccountQuery) -> Result; fn get_storage(&mut self, query: &StorageQuery) -> Result; + + #[cfg(feature = "taiko")] + fn get_propose(&mut self, query: &ProposeQuery) -> Result<(Transaction, BlockProposed)>; + #[cfg(feature = "taiko")] + /// get 256 blocks one time to reduce the fetch time cost + fn batch_get_partial_blocks(&mut self, query: &BlockQuery) -> Result>>; } pub trait MutProvider: Provider { @@ -67,6 +83,9 @@ pub trait MutProvider: Provider { fn insert_balance(&mut self, query: AccountQuery, val: U256); fn insert_code(&mut self, query: AccountQuery, val: Bytes); fn insert_storage(&mut self, query: StorageQuery, val: H256); + + #[cfg(feature = "taiko")] + fn insert_propose(&mut self, query: ProposeQuery, val: (Transaction, BlockProposed)); } pub fn new_file_provider(file_path: String) -> Result> { diff --git a/lib/src/host/provider/rpc_provider.rs b/lib/src/host/provider/rpc_provider.rs index d092d9d2a..02ded1642 100644 --- a/lib/src/host/provider/rpc_provider.rs +++ b/lib/src/host/provider/rpc_provider.rs @@ -13,9 +13,16 @@ // limitations under the License. use anyhow::{anyhow, Result}; +#[cfg(feature = "taiko")] +use ethers_core::types::Filter; use ethers_core::types::{Block, Bytes, EIP1186ProofResponse, Transaction, H256, U256}; use ethers_providers::{Http, Middleware}; +#[cfg(not(feature = "taiko"))] use log::info; +#[cfg(feature = "taiko")] +use tracing::info; +#[cfg(feature = "taiko")] +use zeth_primitives::taiko::{filter_propose_block_event, BlockProposed}; use super::{AccountQuery, BlockQuery, ProofQuery, Provider, StorageQuery}; @@ -130,4 +137,43 @@ impl Provider for RpcProvider { Ok(out) } + + #[cfg(feature = "taiko")] + fn get_propose(&mut self, query: &super::ProposeQuery) -> Result<(Transaction, BlockProposed)> { + info!("Querying RPC for propose: {:?}", query); + + let filter = Filter::new() + .address(query.l1_contract) + .from_block(query.l1_block_no) + .to_block(query.l1_block_no); + let logs = self + .tokio_handle + .block_on(async { self.http_client.get_logs(&filter).await })?; + let result = + filter_propose_block_event(&logs, zeth_primitives::U256::from(query.l2_block_no))?; + let (tx_hash, block_proposed) = + result.ok_or_else(|| anyhow!("No propose block event for {:?}", query))?; + let response = self + .tokio_handle + .block_on(async { self.http_client.get_transaction(tx_hash).await })?; + match response { + Some(out) => Ok((out, block_proposed)), + None => Err(anyhow!("No data for {:?}", query)), + } + } + + #[cfg(feature = "taiko")] + /// get 256 blocks one time to reduce the fetch time cost + fn batch_get_partial_blocks(&mut self, query: &BlockQuery) -> Result>> { + info!("Querying RPC for partial blocks: {:?}", query); + + let out = self.tokio_handle.block_on(async { + use ethers_core::utils; + let id = utils::serialize(&query.block_no); + self.http_client + .request("taiko_getL2ParentHeaders", [id]) + .await + })?; + Ok(out) + } } diff --git a/lib/src/input.rs b/lib/src/input.rs index d6a59bfed..d0583db73 100644 --- a/lib/src/input.rs +++ b/lib/src/input.rs @@ -51,6 +51,8 @@ pub struct Input { pub contracts: Vec, /// List of at most 256 previous block headers pub ancestor_headers: Vec
, + /// Base fee per gas + pub base_fee_per_gas: U256, } pub type StorageEntry = (MptNode, Vec); @@ -76,6 +78,7 @@ mod tests { parent_storage: Default::default(), contracts: vec![], ancestor_headers: vec![], + base_fee_per_gas: Default::default(), }; let _: Input = bincode::deserialize(&bincode::serialize(&input).unwrap()).unwrap(); diff --git a/lib/src/lib.rs b/lib/src/lib.rs index e98600838..a542f3107 100644 --- a/lib/src/lib.rs +++ b/lib/src/lib.rs @@ -11,6 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +#![feature(async_closure)] extern crate core; @@ -26,6 +27,9 @@ pub mod input; pub mod mem_db; pub mod preparation; +#[cfg(feature = "taiko")] +pub mod taiko; + pub use zeth_primitives::transactions::ethereum::EthereumTxEssence; /// call forget only if running inside the guest diff --git a/lib/src/preparation.rs b/lib/src/preparation.rs index 6435d7c85..bcf08c733 100644 --- a/lib/src/preparation.rs +++ b/lib/src/preparation.rs @@ -72,7 +72,7 @@ impl HeaderPrepStrategy for EthHeaderPrepStrategy { } // Validate extra data let extra_data_bytes = block_builder.input.extra_data.len(); - if extra_data_bytes >= MAX_EXTRA_DATA_BYTES { + if extra_data_bytes > MAX_EXTRA_DATA_BYTES { bail!( "Invalid extra data: expected <= {}, got {}", MAX_EXTRA_DATA_BYTES, diff --git a/lib/src/taiko/block_builder.rs b/lib/src/taiko/block_builder.rs new file mode 100644 index 000000000..43fb16430 --- /dev/null +++ b/lib/src/taiko/block_builder.rs @@ -0,0 +1,22 @@ +use zeth_primitives::transactions::ethereum::EthereumTxEssence; + +use crate::{ + block_builder::{ConfiguredBlockBuilder, NetworkStrategyBundle}, + finalization::BuildFromMemDbStrategy, + initialization::MemDbInitStrategy, + mem_db::MemDb, + taiko::{execute::TaikoTxExecStrategy, prepare::TaikoHeaderPrepStrategy}, +}; + +pub struct TaikoStrategyBundle {} + +impl NetworkStrategyBundle for TaikoStrategyBundle { + type Database = MemDb; + type TxEssence = EthereumTxEssence; + type DbInitStrategy = MemDbInitStrategy; + type HeaderPrepStrategy = TaikoHeaderPrepStrategy; + type TxExecStrategy = TaikoTxExecStrategy; + type BlockBuildStrategy = BuildFromMemDbStrategy; +} + +pub type TaikoBlockBuilder<'a> = ConfiguredBlockBuilder<'a, TaikoStrategyBundle>; diff --git a/lib/src/taiko/execute.rs b/lib/src/taiko/execute.rs new file mode 100644 index 000000000..654140fc1 --- /dev/null +++ b/lib/src/taiko/execute.rs @@ -0,0 +1,395 @@ +// Copyright 2023 RISC Zero, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::{fmt::Debug, mem::take, str::from_utf8}; + +use anyhow::{anyhow, bail, Context}; +#[cfg(all(not(target_os = "zkvm"), not(feature = "server")))] +use log::debug; +use revm::{ + primitives::{Account, Address, ResultAndState, SpecId, TransactTo, TxEnv, U256}, + Database, DatabaseCommit, EVM, +}; +#[cfg(all(not(target_os = "zkvm"), feature = "server"))] +use tracing::debug; +use zeth_primitives::{ + receipt::Receipt, + transactions::{ + ethereum::{EthereumTxEssence, TransactionKind}, + TxEssence, + }, + trie::MptNode, + Bloom, RlpBytes, +}; + +use crate::{ + block_builder::BlockBuilder, + consts, + consts::{ChainSpec, GWEI_TO_WEI, MIN_SPEC_ID}, + execution::TxExecStrategy, + guest_mem_forget, +}; + +pub struct TaikoTxExecStrategy {} + +impl TxExecStrategy for TaikoTxExecStrategy { + fn execute_transactions( + mut block_builder: BlockBuilder, + ) -> anyhow::Result> + where + D: Database + DatabaseCommit, + ::Error: Debug, + { + let header = block_builder + .header + .as_mut() + .expect("Header is not initialized"); + // Compute the spec id + let spec_id = block_builder.chain_spec.spec_id(header.number); + if !SpecId::enabled(spec_id, MIN_SPEC_ID) { + bail!( + "Invalid protocol version: expected >= {:?}, got {:?}", + MIN_SPEC_ID, + spec_id, + ) + } + + #[cfg(not(target_os = "zkvm"))] + { + use chrono::{TimeZone, Utc}; + use log::info; + let dt = Utc + .timestamp_opt(block_builder.input.timestamp.try_into().unwrap(), 0) + .unwrap(); + + info!("Block no. {}", header.number); + info!(" EVM spec ID: {:?}", spec_id); + info!(" Timestamp: {}", dt); + info!(" Transactions: {}", block_builder.input.transactions.len()); + info!(" Withdrawals: {}", block_builder.input.withdrawals.len()); + info!(" Fee Recipient: {:?}", block_builder.input.beneficiary); + info!(" Gas limit: {}", block_builder.input.gas_limit); + info!(" Base fee per gas: {}", header.base_fee_per_gas); + info!(" Extra data: {:?}", block_builder.input.extra_data); + } + + // initialize the EVM + let mut evm = EVM::new(); + + // set the EVM configuration + evm.env.cfg.chain_id = block_builder.chain_spec.chain_id(); + evm.env.cfg.spec_id = spec_id; + + // set the EVM block environment + evm.env.block.number = header.number.try_into().unwrap(); + evm.env.block.coinbase = block_builder.input.beneficiary; + evm.env.block.timestamp = header.timestamp; + evm.env.block.difficulty = U256::ZERO; + evm.env.block.prevrandao = Some(header.mix_hash); + evm.env.block.basefee = header.base_fee_per_gas; + evm.env.block.gas_limit = block_builder.input.gas_limit; + + evm.database(block_builder.db.take().unwrap()); + + // bloom filter over all transaction logs + let mut logs_bloom = Bloom::default(); + // keep track of the gas used over all transactions + let mut cumulative_gas_used = consts::ZERO; + + // process all the transactions + let mut tx_trie = MptNode::default(); + let mut receipt_trie = MptNode::default(); + for (tx_no, tx) in take(&mut block_builder.input.transactions) + .into_iter() + .enumerate() + { + // anchor transaction must be executed successfully + let is_anchor = tx_no == 0; + // verify the transaction signature + let tx_from = match tx.recover_from() { + Ok(tx_from) => tx_from, + Err(err) => { + if is_anchor { + bail!("Error recovering anchor signature: {}", err); + } + #[cfg(not(target_os = "zkvm"))] + debug!( + "Error recovering address for transaction {}, error: {}", + tx_no, err + ); + continue; + } + }; + + #[cfg(not(target_os = "zkvm"))] + { + let tx_hash = tx.hash(); + debug!("Tx no. {} (hash: {})", tx_no, tx_hash); + debug!(" Type: {}", tx.essence.tx_type()); + debug!(" Fr: {:?}", tx_from); + debug!(" To: {:?}", tx.essence.to().unwrap_or_default()); + } + + // verify transaction gas + let block_available_gas = block_builder.input.gas_limit - cumulative_gas_used; + if block_available_gas < tx.essence.gas_limit() { + if is_anchor { + bail!("Error at transaction {}: gas exceeds block limit", tx_no); + } + #[cfg(not(target_os = "zkvm"))] + debug!("Error at transaction {}: gas exceeds block limit", tx_no); + continue; + } + + // process the transaction + fill_eth_tx_env( + block_builder.chain_spec, + &mut evm.env.tx, + &tx.essence, + tx_from, + is_anchor, + ); + let ResultAndState { result, state } = match evm.transact() { + Ok(result) => result, + Err(err) => { + if is_anchor { + bail!("Error at transaction {}: {:?}", tx_no, err); + } + #[cfg(not(target_os = "zkvm"))] + debug!("Error at transaction {}: {:?}", tx_no, err); + continue; + } + }; + + if is_anchor && !result.is_success() { + bail!( + "Error at transaction {}: execute anchor failed {:?}, output {:?}", + tx_no, + result, + result.output().map(|o| from_utf8(o).unwrap_or_default()) + ); + } + + let gas_used = result.gas_used().try_into().unwrap(); + cumulative_gas_used = cumulative_gas_used.checked_add(gas_used).unwrap(); + + #[cfg(not(target_os = "zkvm"))] + debug!(" Ok: {:?}", result); + + // create the receipt from the EVM result + let receipt = Receipt::new( + tx.essence.tx_type(), + result.is_success(), + cumulative_gas_used, + result.logs().into_iter().map(|log| log.into()).collect(), + ); + + // accumulate logs to the block bloom filter + logs_bloom.accrue_bloom(&receipt.payload.logs_bloom); + + // Add receipt and tx to tries + let trie_key = tx_no.to_rlp(); + match tx_trie.insert_rlp(&trie_key, tx) { + Ok(_) => (), + Err(err) => { + if is_anchor { + bail!("Failed to insert transaction {}: {:?}", tx_no, err); + } + #[cfg(not(target_os = "zkvm"))] + debug!("Failed to insert transaction {}: {:?}", tx_no, err); + continue; + } + } + match receipt_trie.insert_rlp(&trie_key, receipt) { + Ok(_) => (), + Err(err) => { + if is_anchor { + bail!("Failed to insert receipt {}: {:?}", tx_no, err); + } + #[cfg(not(target_os = "zkvm"))] + debug!("Failed to insert receipt {}: {:?}", tx_no, err); + continue; + } + } + + // update account states + #[cfg(not(target_os = "zkvm"))] + for (address, account) in &state { + if account.is_touched() { + // log account + debug!( + " State {:?} (is_selfdestructed={}, is_loaded_as_not_existing={}, is_created={}, is_empty={})", + address, + account.is_selfdestructed(), + account.is_loaded_as_not_existing(), + account.is_created(), + account.is_empty(), + ); + // log balance changes + debug!( + " After balance: {} (Nonce: {})", + account.info.balance, account.info.nonce + ); + + // log state changes + for (addr, slot) in &account.storage { + if slot.is_changed() { + debug!(" Storage address: {:?}", addr); + debug!(" Before: {:?}", slot.original_value()); + debug!(" After: {:?}", slot.present_value()); + } + } + } + } + + evm.db().unwrap().commit(state); + } + + let mut db = evm.take_db(); + + // process withdrawals unconditionally after any transactions + let mut withdrawals_trie = MptNode::default(); + for (i, withdrawal) in take(&mut block_builder.input.withdrawals) + .into_iter() + .enumerate() + { + // the withdrawal amount is given in Gwei + let amount_wei = GWEI_TO_WEI + .checked_mul(withdrawal.amount.try_into().unwrap()) + .unwrap(); + + #[cfg(not(target_os = "zkvm"))] + { + debug!("Withdrawal no. {}", withdrawal.index); + debug!(" Recipient: {:?}", withdrawal.address); + debug!(" Value: {}", amount_wei); + } + // Credit withdrawal amount + increase_account_balance(&mut db, withdrawal.address, amount_wei)?; + // Add withdrawal to trie + withdrawals_trie + .insert_rlp(&i.to_rlp(), withdrawal) + .with_context(|| "failed to insert withdrawal")?; + } + + // Update result header with computed values + header.transactions_root = tx_trie.hash(); + header.receipts_root = receipt_trie.hash(); + header.logs_bloom = logs_bloom; + header.gas_used = cumulative_gas_used; + header.withdrawals_root = if spec_id < SpecId::SHANGHAI { + None + } else { + Some(withdrawals_trie.hash()) + }; + + // Leak memory, save cycles + guest_mem_forget([tx_trie, receipt_trie, withdrawals_trie]); + // Return block builder with updated database + Ok(block_builder.with_db(db)) + } +} + +pub fn fill_eth_tx_env( + l2_chain_spec: &ChainSpec, + tx_env: &mut TxEnv, + essence: &EthereumTxEssence, + caller: Address, + is_anchor: bool, +) { + // claim the anchor + tx_env.taiko.is_anchor = is_anchor; + // set the treasury address + tx_env.taiko.treasury = l2_chain_spec.l2_contract.unwrap(); + match essence { + EthereumTxEssence::Legacy(tx) => { + tx_env.caller = caller; + tx_env.gas_limit = tx.gas_limit.try_into().unwrap(); + tx_env.gas_price = tx.gas_price; + tx_env.gas_priority_fee = None; + tx_env.transact_to = if let TransactionKind::Call(to_addr) = tx.to { + TransactTo::Call(to_addr) + } else { + TransactTo::create() + }; + tx_env.value = tx.value; + tx_env.data = tx.data.clone(); + tx_env.chain_id = tx.chain_id; + tx_env.nonce = Some(tx.nonce); + tx_env.access_list.clear(); + } + EthereumTxEssence::Eip2930(tx) => { + tx_env.caller = caller; + tx_env.gas_limit = tx.gas_limit.try_into().unwrap(); + tx_env.gas_price = tx.gas_price; + tx_env.gas_priority_fee = None; + tx_env.transact_to = if let TransactionKind::Call(to_addr) = tx.to { + TransactTo::Call(to_addr) + } else { + TransactTo::create() + }; + tx_env.value = tx.value; + tx_env.data = tx.data.clone(); + tx_env.chain_id = Some(tx.chain_id); + tx_env.nonce = Some(tx.nonce); + tx_env.access_list = tx.access_list.clone().into(); + } + EthereumTxEssence::Eip1559(tx) => { + tx_env.caller = caller; + tx_env.gas_limit = tx.gas_limit.try_into().unwrap(); + tx_env.gas_price = tx.max_fee_per_gas; + tx_env.gas_priority_fee = Some(tx.max_priority_fee_per_gas); + tx_env.transact_to = if let TransactionKind::Call(to_addr) = tx.to { + TransactTo::Call(to_addr) + } else { + TransactTo::create() + }; + tx_env.value = tx.value; + tx_env.data = tx.data.clone(); + tx_env.chain_id = Some(tx.chain_id); + tx_env.nonce = Some(tx.nonce); + tx_env.access_list = tx.access_list.clone().into(); + } + }; +} + +pub fn increase_account_balance( + db: &mut D, + address: Address, + amount_wei: U256, +) -> anyhow::Result<()> +where + D: Database + DatabaseCommit, + ::Error: Debug, +{ + // Read account from database + let mut account: Account = db + .basic(address) + .map_err(|db_err| { + anyhow!( + "Error increasing account balance for {}: {:?}", + address, + db_err + ) + })? + .unwrap_or_default() + .into(); + // Credit withdrawal amount + account.info.balance = account.info.balance.checked_add(amount_wei).unwrap(); + account.mark_touch(); + // Commit changes to database + db.commit([(address, account)].into()); + + Ok(()) +} diff --git a/lib/src/taiko/host.rs b/lib/src/taiko/host.rs new file mode 100644 index 000000000..921f58acc --- /dev/null +++ b/lib/src/taiko/host.rs @@ -0,0 +1,311 @@ +use anyhow::Result; +use ethers_core::types::{Block, Transaction as EthersTransaction, H160, H256, U256}; +use tracing::info; +use zeth_primitives::{ + ethers::{from_ethers_h160, from_ethers_h256, from_ethers_u256}, + taiko::*, + transactions::ethereum::EthereumTxEssence, + withdrawal::Withdrawal, + Address, B256, +}; + +use crate::{ + block_builder::{BlockBuilder, NetworkStrategyBundle}, + consts::ChainSpec, + host::{ + provider::{new_provider, BlockQuery, ProofQuery, ProposeQuery, Provider}, + Init, + }, + input::Input, + taiko::{precheck::rebuild_and_precheck_block, Layer}, +}; + +#[derive(Debug)] +pub struct TaikoExtra { + pub l1_hash: B256, + pub l1_height: u64, + pub l2_tx_list: Vec, + pub prover: Address, + pub graffiti: B256, + pub l1_signal_root: B256, + pub l2_signal_root: B256, + pub l2_withdrawals: Vec, + pub block_proposed: BlockProposed, + pub l1_next_block: Block, +} + +#[allow(clippy::type_complexity)] +fn fetch_data( + annotation: &str, + cache_path: Option, + rpc_url: Option, + block_no: u64, + signal_service: Address, + layer: Layer, +) -> Result<( + Box, + Block, + Block, + B256, + Input, +)> { + let mut provider = new_provider(cache_path, rpc_url)?; + + let fini_query = BlockQuery { block_no }; + match layer { + Layer::L1 => {} + Layer::L2 => { + provider.batch_get_partial_blocks(&fini_query)?; + } + } + // Fetch the initial block + let init_block = provider.get_partial_block(&BlockQuery { + block_no: block_no - 1, + })?; + + info!( + "Initial {} block: {:?} ({:?})", + annotation, + init_block.number.unwrap(), + init_block.hash.unwrap() + ); + + // Fetch the finished block + let fini_block = provider.get_full_block(&fini_query)?; + + info!( + "Final {} block number: {:?} ({:?})", + annotation, + fini_block.number.unwrap(), + fini_block.hash.unwrap() + ); + info!("Transaction count: {:?}", fini_block.transactions.len()); + + // Get l2 signal root by signal service + let proof = provider.get_proof(&ProofQuery { + block_no, + address: H160::from_slice(signal_service.as_slice()), + indices: Default::default(), + })?; + let signal_root = from_ethers_h256(proof.storage_hash); + + info!( + "Final {} signal root: {:?} ({:?})", + annotation, + fini_block.number.unwrap(), + signal_root, + ); + + // Create input + let input = Input { + beneficiary: fini_block.author.map(from_ethers_h160).unwrap_or_default(), + gas_limit: from_ethers_u256(fini_block.gas_limit), + timestamp: from_ethers_u256(fini_block.timestamp), + extra_data: fini_block.extra_data.0.clone().into(), + mix_hash: from_ethers_h256(fini_block.mix_hash.unwrap()), + transactions: fini_block + .transactions + .clone() + .into_iter() + .map(|tx| tx.try_into().unwrap()) + .collect(), + withdrawals: fini_block + .withdrawals + .clone() + .unwrap_or_default() + .into_iter() + .map(|w| w.try_into().unwrap()) + .collect(), + parent_state_trie: Default::default(), + parent_storage: Default::default(), + contracts: vec![], + parent_header: init_block.clone().try_into()?, + ancestor_headers: vec![], + base_fee_per_gas: from_ethers_u256(fini_block.base_fee_per_gas.unwrap_or_default()), + }; + + Ok((provider, init_block, fini_block, signal_root, input)) +} + +fn execute_data>( + provider: Box, + chain_spec: ChainSpec, + init_block: Block, + input: Input, + fini_block: Block, +) -> Result> { + // Create the provider DB + let provider_db = + crate::host::provider_db::ProviderDb::new(provider, init_block.number.unwrap().as_u64()); + // Create the block builder, run the transactions and extract the DB + let mut builder = BlockBuilder::new(&chain_spec, input) + .with_db(provider_db) + .prepare_header::()? + .execute_transactions::()?; + let provider_db = builder.mut_db().unwrap(); + + info!("Gathering inclusion proofs ..."); + + // Gather inclusion proofs for the initial and final state + let init_proofs = provider_db.get_initial_proofs()?; + let fini_proofs = provider_db.get_latest_proofs()?; + + // Gather proofs for block history + let history_headers = provider_db.provider.batch_get_partial_blocks(&BlockQuery { + block_no: fini_block.number.unwrap().as_u64(), + })?; + // ancestors == history - current - parent + let ancestor_headers = if history_headers.len() > 2 { + history_headers + .into_iter() + .rev() + .skip(2) + .map(|header| { + header + .try_into() + .expect("Failed to convert ancestor headers") + }) + .collect() + } else { + vec![] + }; + + info!("Saving provider cache ..."); + + // Save the provider cache + provider_db.get_provider().save()?; + info!("Provider-backed execution is Done!"); + // assemble init + let transactions = fini_block + .transactions + .clone() + .into_iter() + .map(|tx| tx.try_into().unwrap()) + .collect(); + let withdrawals = fini_block + .withdrawals + .clone() + .unwrap_or_default() + .into_iter() + .map(|w| w.try_into().unwrap()) + .collect(); + + let init = Init { + db: provider_db.get_initial_db().clone(), + init_block: init_block.try_into()?, + init_proofs, + fini_block: fini_block.try_into()?, + fini_transactions: transactions, + fini_withdrawals: withdrawals, + fini_proofs, + ancestor_headers, + }; + Ok(init) +} + +#[allow(clippy::too_many_arguments)] +pub fn get_taiko_initial_data>( + l1_cache_path: Option, + _l1_chain_spec: ChainSpec, + l1_rpc_url: Option, + prover: Address, + l2_cache_path: Option, + l2_chain_spec: ChainSpec, + l2_rpc_url: Option, + l2_block_no: u64, + graffiti: B256, +) -> Result<(Init, TaikoExtra)> { + let (l2_provider, l2_init_block, mut l2_fini_block, l2_signal_root, l2_input) = fetch_data( + "L2", + l2_cache_path, + l2_rpc_url, + l2_block_no, + l2_chain_spec.l2_signal_service.unwrap(), + Layer::L2, + )?; + // Get anchor call parameters + let anchorCall { + l1Hash: anchor_l1_hash, + l1SignalRoot: anchor_l1_signal_root, + l1Height: l1_block_no, + parentGasUsed: l2_parent_gas_used, + } = decode_anchor_call_args(&l2_fini_block.transactions[0].input)?; + + let (mut l1_provider, _l1_init_block, l1_fini_block, l1_signal_root, _l1_input) = fetch_data( + "L1", + l1_cache_path, + l1_rpc_url, + l1_block_no, + l2_chain_spec.l1_signal_service.unwrap(), + Layer::L1, + )?; + + let (propose_tx, block_metadata) = l1_provider.get_propose(&ProposeQuery { + l1_contract: H160::from_slice(l2_chain_spec.l1_contract.unwrap().as_slice()), + l1_block_no: l1_block_no + 1, + l2_block_no, + })?; + + let l1_next_block = l1_provider.get_full_block(&BlockQuery { + block_no: l1_block_no + 1, + })?; + + // save l1 data + l1_provider.save()?; + + let proposeBlockCall { + params: _, + txList: l2_tx_list, + } = decode_propose_block_call_args(&propose_tx.input)?; + + // 1. check l2 parent gas used + if l2_init_block.gas_used != U256::from(l2_parent_gas_used) { + return Err(anyhow::anyhow!( + "parent gas used mismatch, expect: {}, got: {}", + l2_init_block.gas_used, + l2_parent_gas_used + )); + } + // 2. check l1 signal root + if anchor_l1_signal_root != l1_signal_root { + return Err(anyhow::anyhow!( + "l1 signal root mismatch, expect: {}, got: {}", + anchor_l1_signal_root, + l1_signal_root + )); + } + // 3. check l1 block hash + if Some(anchor_l1_hash) != l1_fini_block.hash.map(from_ethers_h256) { + return Err(anyhow::anyhow!( + "l1 block hash mismatch, expect: {}, got: {:?}", + anchor_l1_hash, + l1_fini_block.hash + )); + } + + let extra = TaikoExtra { + l1_hash: anchor_l1_hash, + l1_height: l1_block_no, + l2_tx_list, + prover, + graffiti, + l1_signal_root, + l2_signal_root, + l2_withdrawals: l2_input.withdrawals.clone(), + block_proposed: block_metadata, + l1_next_block, + }; + + // rebuild transaction list by tx_list from l1 contract + rebuild_and_precheck_block(&l2_chain_spec, &mut l2_fini_block, &extra)?; + + // execute transactions and get states + let init = execute_data::( + l2_provider, + l2_chain_spec, + l2_init_block, + l2_input, + l2_fini_block, + )?; + Ok((init, extra)) +} diff --git a/lib/src/taiko/mod.rs b/lib/src/taiko/mod.rs new file mode 100644 index 000000000..9e1a50187 --- /dev/null +++ b/lib/src/taiko/mod.rs @@ -0,0 +1,14 @@ +pub mod block_builder; +#[cfg(not(target_os = "zkvm"))] +pub mod execute; +#[cfg(not(target_os = "zkvm"))] +pub mod host; +pub mod precheck; +pub mod prepare; +pub mod protocol_instance; +pub mod utils; + +pub enum Layer { + L1, + L2, +} diff --git a/lib/src/taiko/precheck.rs b/lib/src/taiko/precheck.rs new file mode 100644 index 000000000..88c5ca67e --- /dev/null +++ b/lib/src/taiko/precheck.rs @@ -0,0 +1,164 @@ +use std::error::Error; + +use anyhow::{bail, Context, Result}; +use ethers_core::types::{Block, Transaction as EthersTransaction, U256 as EthersU256, U64}; +use zeth_primitives::{ + ethers::from_ethers_h160, + taiko::{ + anchor::check_anchor_signature, ANCHOR_GAS_LIMIT, GOLDEN_TOUCH_ACCOUNT, MAX_TX_LIST, + MAX_TX_LIST_BYTES, + }, + transactions::EthereumTransaction, + Address, +}; + +use crate::{ + consts::ChainSpec, + taiko::{host::TaikoExtra, utils::rlp_decode_list}, +}; + +// rebuild the block with anchor transaction and txlist from l1 contract, then precheck it +pub fn rebuild_and_precheck_block( + l2_chain_spec: &ChainSpec, + l2_fini: &mut Block, + extra: &TaikoExtra, +) -> Result<()> { + let Some(anchor) = l2_fini.transactions.first().cloned() else { + bail!("no anchor transaction found"); + }; + // - check anchor transaction + precheck_anchor(l2_chain_spec, l2_fini, &anchor).with_context(|| "precheck anchor error")?; + + let mut txs: Vec = vec![]; + // - tx list bytes must be less than MAX_TX_LIST_BYTES + if extra.l2_tx_list.len() <= MAX_TX_LIST_BYTES { + txs = rlp_decode_list(&extra.l2_tx_list).unwrap_or_else(|err| { + tracing::error!("decode tx list error: {}", err); + vec![] + }); + } else { + tracing::error!( + "tx list bytes must be not more than MAX_TX_LIST_BYTES, got: {}", + extra.l2_tx_list.len() + ); + } + // - tx list must be less than MAX_TX_LIST + if txs.len() > MAX_TX_LIST { + tracing::error!( + "tx list must be not more than MAX_TX_LIST, got: {}", + txs.len() + ); + // reset to empty + txs.clear(); + } + // - patch anchor transaction into tx list instead of those from l2 node's + // insert the anchor transaction into the tx list at the first position + txs.insert(0, anchor); + // reset transactions + l2_fini.transactions = txs; + Ok(()) +} + +#[derive(Debug)] +pub enum AnchorError { + AnchorTypeMisMatch { + expected: u8, + got: u8, + }, + AnchorFromMisMatch { + expected: Address, + got: Option
, + }, + AnchorToMisMatch { + expected: Address, + got: Option
, + }, + AnchorValueMisMatch { + expected: EthersU256, + got: EthersU256, + }, + AnchorGasLimitMisMatch { + expected: EthersU256, + got: EthersU256, + }, + AnchorFeeCapMisMatch { + expected: Option, + got: Option, + }, + AnchorSignatureMismatch { + msg: String, + }, + Anyhow(anyhow::Error), +} + +impl From for AnchorError { + fn from(e: anyhow::Error) -> Self { + AnchorError::Anyhow(e) + } +} + +impl std::fmt::Display for AnchorError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:#?}", self) + } +} + +impl Error for AnchorError {} + +pub fn precheck_anchor( + l2_chain_spec: &ChainSpec, + l2_fini: &Block, + anchor: &EthersTransaction, +) -> Result<(), AnchorError> { + let tx1559_type = U64::from(0x2); + if anchor.transaction_type != Some(tx1559_type) { + return Err(AnchorError::AnchorTypeMisMatch { + expected: tx1559_type.as_u64() as u8, + got: anchor.transaction_type.unwrap_or_default().as_u64() as u8, + }); + } + let tx: EthereumTransaction = anchor.clone().try_into()?; + // verify transaction + check_anchor_signature(&tx)?; + // verify the transaction signature + let from = from_ethers_h160(anchor.from); + if from != *GOLDEN_TOUCH_ACCOUNT { + return Err(AnchorError::AnchorFromMisMatch { + expected: *GOLDEN_TOUCH_ACCOUNT, + got: Some(from), + }); + } + let Some(to) = anchor.to else { + return Err(AnchorError::AnchorToMisMatch { + expected: l2_chain_spec.l2_contract.unwrap(), + got: None, + }); + }; + let to = from_ethers_h160(to); + if to != l2_chain_spec.l2_contract.unwrap() { + return Err(AnchorError::AnchorFromMisMatch { + expected: l2_chain_spec.l2_contract.unwrap(), + got: Some(to), + }); + } + if anchor.value != EthersU256::zero() { + return Err(AnchorError::AnchorValueMisMatch { + expected: EthersU256::zero(), + got: anchor.value, + }); + } + if anchor.gas != EthersU256::from(ANCHOR_GAS_LIMIT) { + return Err(AnchorError::AnchorGasLimitMisMatch { + expected: EthersU256::from(ANCHOR_GAS_LIMIT), + got: anchor.gas, + }); + } + // anchor's gas price should be the same as the block's + if anchor.max_fee_per_gas != l2_fini.base_fee_per_gas { + return Err(AnchorError::AnchorFeeCapMisMatch { + expected: l2_fini.base_fee_per_gas, + got: anchor.max_fee_per_gas, + }); + } + Ok(()) +} diff --git a/lib/src/taiko/prepare.rs b/lib/src/taiko/prepare.rs new file mode 100644 index 000000000..6e35131b7 --- /dev/null +++ b/lib/src/taiko/prepare.rs @@ -0,0 +1,67 @@ +use std::fmt::Debug; + +use anyhow::{bail, Context, Result}; +use revm::{Database, DatabaseCommit}; +use zeth_primitives::{block::Header, taiko::BLOCK_GAS_LIMIT, transactions::TxEssence}; + +use crate::{ + block_builder::BlockBuilder, consts::MAX_EXTRA_DATA_BYTES, preparation::HeaderPrepStrategy, +}; + +pub struct TaikoHeaderPrepStrategy {} + +impl HeaderPrepStrategy for TaikoHeaderPrepStrategy { + fn prepare_header(mut block_builder: BlockBuilder) -> Result> + where + D: Database + DatabaseCommit, + ::Error: Debug, + E: TxEssence, + { + // Validate gas limit + if block_builder.input.gas_limit != *BLOCK_GAS_LIMIT { + bail!( + "Invalid gas limit: expected == {}, got {}", + *BLOCK_GAS_LIMIT, + block_builder.input.gas_limit, + ); + } + // Validate timestamp + if block_builder.input.timestamp < block_builder.input.parent_header.timestamp { + bail!( + "Invalid timestamp: expected >= {}, got {}", + block_builder.input.parent_header.timestamp, + block_builder.input.timestamp, + ); + } + // Validate extra data + let extra_data_bytes = block_builder.input.extra_data.len(); + if extra_data_bytes > MAX_EXTRA_DATA_BYTES { + bail!( + "Invalid extra data: expected <= {}, got {}", + MAX_EXTRA_DATA_BYTES, + extra_data_bytes, + ) + } + // Derive header + block_builder.header = Some(Header { + // Initialize fields that we can compute from the parent + parent_hash: block_builder.input.parent_header.hash(), + number: block_builder + .input + .parent_header + .number + .checked_add(1) + .with_context(|| "Invalid block number: too large")?, + base_fee_per_gas: block_builder.input.base_fee_per_gas, + // Initialize metadata from input + beneficiary: block_builder.input.beneficiary, + gas_limit: block_builder.input.gas_limit, + timestamp: block_builder.input.timestamp, + mix_hash: block_builder.input.mix_hash, + extra_data: block_builder.input.extra_data.clone(), + // do not fill the remaining fields + ..Default::default() + }); + Ok(block_builder) + } +} diff --git a/lib/src/taiko/protocol_instance.rs b/lib/src/taiko/protocol_instance.rs new file mode 100644 index 000000000..e39b29056 --- /dev/null +++ b/lib/src/taiko/protocol_instance.rs @@ -0,0 +1,76 @@ +use anyhow::Result; +use zeth_primitives::{ + block::Header, + ethers::{from_ethers_h256, from_ethers_u256}, + keccak, + taiko::{ + deposits_hash, string_to_bytes32, BlockMetadata, EthDeposit, ProtocolInstance, Transition, + ANCHOR_GAS_LIMIT, + }, + TxHash, U256, +}; + +use crate::taiko::host::TaikoExtra; + +pub fn assemble_protocol_instance(extra: &TaikoExtra, header: &Header) -> Result { + let tx_list_hash = TxHash::from(keccak::keccak(extra.l2_tx_list.as_slice())); + let deposits: Vec = extra + .l2_withdrawals + .iter() + .map(|w| EthDeposit { + recipient: w.address, + amount: w.amount as u128, + id: w.index, + }) + .collect(); + let deposits_hash = deposits_hash(&deposits); + let extra_data = string_to_bytes32(&header.extra_data); + // meta.difficulty = meta.blobHash ^ bytes32(block.prevrandao * b.numBlocks * + // block.number); + let block_hash = tx_list_hash; + let block_hash_h256: U256 = block_hash.into(); + let prevrando = if cfg!(feature = "pos") { + from_ethers_h256(extra.l1_next_block.mix_hash.unwrap_or_default()).into() + } else { + from_ethers_u256(extra.l1_next_block.difficulty) + }; + let difficulty = block_hash_h256 + ^ (prevrando + * U256::from(header.number) + * U256::from(extra.l1_next_block.number.unwrap_or_default().as_u64())); + let gas_limit: u64 = header.gas_limit.try_into().unwrap(); + let pi = ProtocolInstance { + transition: Transition { + parentHash: header.parent_hash, + blockHash: header.hash(), + signalRoot: extra.l2_signal_root, + graffiti: extra.graffiti, + }, + block_metadata: BlockMetadata { + l1Hash: extra.l1_hash, + difficulty: difficulty.into(), + blobHash: tx_list_hash, + extraData: extra_data.into(), + depositsHash: deposits_hash, + coinbase: header.beneficiary, + id: header.number, + gasLimit: (gas_limit - ANCHOR_GAS_LIMIT) as u32, + timestamp: header.timestamp.try_into().unwrap(), + l1Height: extra.l1_height, + txListByteOffset: 0u32, + txListByteSize: extra.l2_tx_list.len() as u32, + minTier: extra.block_proposed.meta.minTier, + blobUsed: extra.l2_tx_list.is_empty(), + parentMetaHash: extra.block_proposed.meta.parentMetaHash, + }, + prover: extra.prover, + }; + #[cfg(not(target_os = "zkvm"))] + { + use zeth_primitives::taiko::assert_pi_and_bp; + assert_pi_and_bp(&pi, &extra.block_proposed)?; + println!("Protocol instance Transition: {:?}", pi.transition); + println!("Protocol instance Metahash: {}", pi.meta_hash()); + } + Ok(pi) +} diff --git a/lib/src/taiko/utils.rs b/lib/src/taiko/utils.rs new file mode 100644 index 000000000..15609c8d0 --- /dev/null +++ b/lib/src/taiko/utils.rs @@ -0,0 +1,9 @@ +use rlp::{Decodable, DecoderError, Rlp}; + +pub fn rlp_decode_list(bytes: &[u8]) -> Result, DecoderError> +where + T: Decodable, +{ + let rlp = Rlp::new(bytes); + rlp.as_list() +} diff --git a/primitives/Cargo.toml b/primitives/Cargo.toml index adce8e5d4..80612862e 100644 --- a/primitives/Cargo.toml +++ b/primitives/Cargo.toml @@ -4,18 +4,30 @@ version = "0.1.0" edition = "2021" [dependencies] -alloy-primitives = { version = "0.4", default-features = false, features = ["rlp", "serde", "std"] } +alloy-primitives = { version = "0.4", default-features = false, features = [ + "rlp", + "serde", + "std", +] } +alloy-sol-types = { version = "0.4", optional = true } +alloy-dyn-abi = { version = "0.4", optional = true } alloy-rlp = { version = "0.3", default-features = false } alloy-rlp-derive = { version = "0.3", default-features = false } anyhow = "1.0" bytes = { version = "1.1", default-features = false } ethers-core = { version = "2.0", optional = true, features = ["optimism"] } -k256 = { version = "=0.13.1", features = ["std", "ecdsa"], default_features = false } -revm-primitives = { version = "1.3", optional = true, default_features = false } +k256 = { version = "=0.13.1", features = [ + "std", + "ecdsa", +], default_features = false } +revm-primitives = { workspace = true, optional = true } rlp = "0.5.2" serde = { version = "1.0", features = ["derive"] } sha3 = "0.10" thiserror = "1.0" +once_cell = { version = "1.18", default-features = false, optional = true } +hex = { version = "0.4", features = ["serde"] } +ruint = { version = "1.10", default-features = false } [dev-dependencies] bincode = "1.3" @@ -25,3 +37,9 @@ serde_json = "1.0" [features] ethers = ["dep:ethers-core"] revm = ["dep:revm-primitives"] +taiko = [ + "revm-primitives/taiko", + "dep:alloy-sol-types", + "dep:alloy-dyn-abi", + "dep:once_cell", +] diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index 0675a5901..b71df4606 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -19,6 +19,8 @@ pub mod block; pub mod keccak; pub mod receipt; pub mod signature; +#[cfg(feature = "taiko")] +pub mod taiko; pub mod transactions; pub mod trie; pub mod withdrawal; diff --git a/primitives/src/signature.rs b/primitives/src/signature.rs index 23a29b61d..7feb94944 100644 --- a/primitives/src/signature.rs +++ b/primitives/src/signature.rs @@ -33,4 +33,12 @@ impl TxSignature { pub fn payload_length(&self) -> usize { self._alloy_rlp_payload_length() } + + pub fn to_bytes(&self) -> [u8; 65] { + let mut sig = [0u8; 65]; + sig[..32].copy_from_slice(&self.r.to_be_bytes::<32>()); + sig[32..64].copy_from_slice(&self.s.to_be_bytes::<32>()); + sig[64] = (self.v + 27) as u8; + sig + } } diff --git a/primitives/src/taiko/anchor.rs b/primitives/src/taiko/anchor.rs new file mode 100644 index 000000000..8409b1958 --- /dev/null +++ b/primitives/src/taiko/anchor.rs @@ -0,0 +1,59 @@ +use alloy_sol_types::{sol, SolCall}; +use anyhow::{anyhow, bail, Context, Result}; +use once_cell::sync::Lazy; + +use crate::{transactions::EthereumTransaction, uint, U256}; + +static GX1: Lazy = + Lazy::new(|| uint!(0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798_U256)); +static N: Lazy = + Lazy::new(|| uint!(0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141_U256)); +static GX1_MUL_PRIVATEKEY: Lazy = + Lazy::new(|| uint!(0x4341adf5a780b4a87939938fd7a032f6e6664c7da553c121d3b4947429639122_U256)); +static GX2: Lazy = + Lazy::new(|| uint!(0xc6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5_U256)); + +sol! { + function anchor( + bytes32 l1Hash, + bytes32 l1SignalRoot, + uint64 l1Height, + uint32 parentGasUsed + ) + external + {} +} + +/// decode anchor arguments from anchor transaction +pub fn decode_anchor_call_args(data: &[u8]) -> Result { + let anchor_call = + anchorCall::abi_decode(data, false).with_context(|| "failed to decode anchor call")?; + Ok(anchor_call) +} + +/// check the anchor signature with fixed K value +pub fn check_anchor_signature(anchor: &EthereumTransaction) -> Result<()> { + let sign = &anchor.signature; + if sign.r == *GX1 { + return Ok(()); + } + let msg_hash = anchor.essence.signing_hash(); + let msg_hash: U256 = msg_hash.into(); + if sign.r == *GX2 { + // when r == GX2 require s == 0 if k == 1 + // alias: when r == GX2 require N == msg_hash + GX1_MUL_PRIVATEKEY + if *N != msg_hash + *GX1_MUL_PRIVATEKEY { + bail!( + "r == GX2, but N != msg_hash + GX1_MUL_PRIVATEKEY, N: {}, msg_hash: {}, GX1_MUL_PRIVATEKEY: {}", + *N, msg_hash, *GX1_MUL_PRIVATEKEY + ); + } + return Ok(()); + } + Err(anyhow!( + "r != GX1 && r != GX2, r: {}, GX1: {}, GX2: {}", + sign.r, + *GX1, + *GX2 + )) +} diff --git a/primitives/src/taiko/consts.rs b/primitives/src/taiko/consts.rs new file mode 100644 index 000000000..35bf4a70f --- /dev/null +++ b/primitives/src/taiko/consts.rs @@ -0,0 +1,81 @@ +use std::str::FromStr; + +use alloy_primitives::{uint, Address, U256}; +use once_cell::sync::Lazy; + +pub const ANCHOR_GAS_LIMIT: u64 = 250_000; +pub const MAX_TX_LIST: usize = 79; +pub const MAX_TX_LIST_BYTES: usize = 120_000; +pub static BLOCK_GAS_LIMIT: Lazy = Lazy::new(|| uint!(15250000_U256)); +pub static GOLDEN_TOUCH_ACCOUNT: Lazy
= Lazy::new(|| { + Address::from_str("0x0000777735367b36bC9B61C50022d9D0700dB4Ec") + .expect("invalid golden touch account") +}); + +pub mod testnet { + use super::*; + pub const CHAIN_ID: u64 = 167008; + pub static L1_CONTRACT: Lazy
= Lazy::new(|| { + Address::from_str("0xB20BB9105e007Bd3E0F73d63D4D3dA2c8f736b77") + .expect("invalid l1 contract address") + }); + + pub static L1_SIGNAL_SERVICE: Lazy
= Lazy::new(|| { + Address::from_str("0x08a3f537c4bbe8B6176420f4Cd0C84b02172dC65") + .expect("invalid l1 signal service") + }); + pub static L2_CONTRACT: Lazy
= Lazy::new(|| { + Address::from_str("0x1670080000000000000000000000000000010001") + .expect("invalid l2 contract address") + }); + + pub static L2_SIGNAL_SERVICE: Lazy
= Lazy::new(|| { + Address::from_str("0x1670080000000000000000000000000000000005") + .expect("invalid l2 signal service") + }); +} + +pub mod internal_devnet_a { + use super::*; + pub const CHAIN_ID: u64 = 167001; + pub static L1_CONTRACT: Lazy
= Lazy::new(|| { + Address::from_str("0xbE71D121291517c85Ab4d3ac65d70F6b1FD57118") + .expect("invalid l1 contract address") + }); + pub static L1_SIGNAL_SERVICE: Lazy
= Lazy::new(|| { + Address::from_str("0x83e383dec6E3C2CD167E3bF6aA8c36F0e55Ad910") + .expect("invalid l1 signal service") + }); + + pub static L2_CONTRACT: Lazy
= Lazy::new(|| { + Address::from_str("0x1670010000000000000000000000000000010001") + .expect("invalid l2 contract address") + }); + + pub static L2_SIGNAL_SERVICE: Lazy
= Lazy::new(|| { + Address::from_str("0x1670010000000000000000000000000000000005") + .expect("invalid l2 signal service") + }); +} + +pub mod internal_devnet_b { + use super::*; + pub const CHAIN_ID: u64 = 167002; + pub static L1_CONTRACT: Lazy
= Lazy::new(|| { + Address::from_str("0x674313F932cc0cE272154a288cf3De474D44e14F") + .expect("invalid l1 contract address") + }); + pub static L1_SIGNAL_SERVICE: Lazy
= Lazy::new(|| { + Address::from_str("0x83e383dec6E3C2CD167E3bF6aA8c36F0e55Ad910") + .expect("invalid l1 signal service") + }); + + pub static L2_CONTRACT: Lazy
= Lazy::new(|| { + Address::from_str("0x1670020000000000000000000000000000010001") + .expect("invalid l2 contract address") + }); + pub static L2_SIGNAL_SERVICE: Lazy
= Lazy::new(|| { + Address::from_str("0x1670020000000000000000000000000000000005") + .expect("invalid l2 signal service") + }); +} diff --git a/primitives/src/taiko/mod.rs b/primitives/src/taiko/mod.rs new file mode 100644 index 000000000..22f6e6f19 --- /dev/null +++ b/primitives/src/taiko/mod.rs @@ -0,0 +1,11 @@ +pub mod anchor; +pub mod consts; +pub mod proposal; +pub mod protocol_instance; +pub mod utils; + +pub use anchor::*; +pub use consts::*; +pub use proposal::*; +pub use protocol_instance::*; +pub use utils::*; diff --git a/primitives/src/taiko/proposal.rs b/primitives/src/taiko/proposal.rs new file mode 100644 index 000000000..3fa097cd9 --- /dev/null +++ b/primitives/src/taiko/proposal.rs @@ -0,0 +1,16 @@ +use alloy_sol_types::{sol, SolCall}; +use anyhow::{Context, Result}; + +sol! { + function proposeBlock( + bytes calldata params, + bytes calldata txList + ) + {} +} + +pub fn decode_propose_block_call_args(data: &[u8]) -> Result { + let propose_block_call = proposeBlockCall::abi_decode(data, false) + .with_context(|| "failed to decode propose block call")?; + Ok(propose_block_call) +} diff --git a/primitives/src/taiko/protocol_instance.rs b/primitives/src/taiko/protocol_instance.rs new file mode 100644 index 000000000..c2e7006f2 --- /dev/null +++ b/primitives/src/taiko/protocol_instance.rs @@ -0,0 +1,159 @@ +use alloy_primitives::{Address, B256, U256}; +use alloy_sol_types::{sol, SolEvent, SolValue, TopicList}; +use anyhow::{anyhow, Context, Result}; +use ethers_core::types::{Log, H256}; +use serde::{Deserialize, Serialize}; + +use crate::{ethers::from_ethers_h256, keccak}; + +sol! { + #[derive(Debug, Default, Deserialize, Serialize)] + struct EthDeposit { + address recipient; + uint96 amount; + uint64 id; + } + + #[derive(Debug, Default, Deserialize, Serialize)] + struct BlockMetadata { + bytes32 l1Hash; // slot 1 + bytes32 difficulty; // slot 2 + bytes32 blobHash; //or txListHash (if Blob not yet supported), // slot 3 + bytes32 extraData; // slot 4 + bytes32 depositsHash; // slot 5 + address coinbase; // L2 coinbase, // slot 6 + uint64 id; + uint32 gasLimit; + uint64 timestamp; // slot 7 + uint64 l1Height; + uint24 txListByteOffset; + uint24 txListByteSize; + uint16 minTier; + bool blobUsed; + bytes32 parentMetaHash; // slot 8 + } + + #[derive(Debug)] + struct Transition { + bytes32 parentHash; + bytes32 blockHash; + bytes32 signalRoot; + bytes32 graffiti; + } + + #[derive(Debug, Default, Clone, Deserialize, Serialize)] + event BlockProposed( + uint256 indexed blockId, + address indexed prover, + uint96 livenessBond, + BlockMetadata meta, + EthDeposit[] depositsProcessed + ); + + #[derive(Debug)] + struct TierProof { + uint16 tier; + bytes data; + } + + function proveBlock(uint64 blockId, bytes calldata input) {} +} + +// require equal with the assembled protocol instance and the block proposed event +pub fn assert_pi_and_bp(pi: &ProtocolInstance, bp: &BlockProposed) -> Result<()> { + if pi.block_metadata.abi_encode() != bp.meta.abi_encode() { + return Err(anyhow!( + "block metadata mismatch, expected: {:?}, got: {:?}", + bp.meta, + pi.block_metadata + )); + } + Ok(()) +} + +pub fn filter_propose_block_event( + logs: &[Log], + block_id: U256, +) -> Result> { + for log in logs { + if log.topics.len() != <::TopicList as TopicList>::COUNT { + continue; + } + if from_ethers_h256(log.topics[0]) != BlockProposed::SIGNATURE_HASH { + continue; + } + let topics = log.topics.iter().map(|topic| from_ethers_h256(*topic)); + let result = BlockProposed::decode_log(topics, &log.data, false); + let block_proposed = result.with_context(|| "decode log failed")?; + if block_proposed.blockId == block_id { + return Ok(log.transaction_hash.map(|h| (h, block_proposed))); + } + } + Ok(None) +} + +#[derive(Debug)] +pub enum EvidenceType { + Sgx { + new_pubkey: Address, // the evidence signature public key + }, + PseZk, +} + +#[derive(Debug)] +pub struct ProtocolInstance { + pub transition: Transition, + pub block_metadata: BlockMetadata, + pub prover: Address, +} + +impl ProtocolInstance { + pub fn meta_hash(&self) -> B256 { + keccak::keccak(self.block_metadata.abi_encode()).into() + } + + // keccak256(abi.encode(tran, newInstance, prover, metaHash)) + pub fn hash(&self, evidence_type: EvidenceType) -> B256 { + match evidence_type { + EvidenceType::Sgx { new_pubkey } => keccak::keccak( + ( + self.transition.clone(), + new_pubkey, + self.prover, + self.meta_hash(), + ) + .abi_encode(), + ) + .into(), + EvidenceType::PseZk => todo!(), + } + } +} + +pub fn deposits_hash(deposits: &[EthDeposit]) -> B256 { + keccak::keccak(deposits.abi_encode()).into() +} + +#[cfg(test)] +mod tests { + use alloy_sol_types::SolCall; + + use super::*; + #[test] + fn test_prove_block_call() { + let input = "0x10d008bd0000000000000000000000000000000000000000000000000000000000000dde00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000001520ae895e6a3433ccd2376cc3e5c8e0322e06ee6b9217e6f425c396f65f107d5a77022e3849ff0f1543490a2cefc8532d7b7b2ea1b9915d2e02eb358124d6c8d746022e3849ff0f1543490a2cefc8532d7b7b2ea1b9915d2e02eb358124d43b5cce302e31382e302d64657600000000000000000000000000000000000000000000569e75fc77c1a856f6daaf9e69d8a9566ca34aa47f9133711ce065a571af0cfd0000000000000000000000003c44cdddb6a900fa2b585dd299e03d12fa4293bc0000000000000000000000000000000000000000000000000000000000000dde0000000000000000000000000000000000000000000000000000000000e4e1c000000000000000000000000000000000000000000000000000000000657fe4b70000000000000000000000000000000000000000000000000000000000001b3d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000476000000000000000000000000000000000000000000000000000000000000019000000000000000000000000000000000000000000000000000000000000000008c00b6905368def45ccddf491cb43ba2e435d75ba15e3b8fe5d2b95e3501de7cc06da8ec383ebc353dc98758c163c0445309ec0aa5b8301ccc90190863075a6b5bb9f5f54b41bab7fdc7e838772417c22c6520c5df87c6c274d6e9c37114de35cfeb69aedff62e72f50d0b09ee4672b1d83bb7bc4ea22a028417518dbf7599790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000001900000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000123900000000c13bd882edb37ffbabc9f9e34a0d9789633b850fe092bfcc0dcb8fe13204acd685d0c903e10876d4bc3ed3bebb4c969a820b742a0a3cc2e063f446964e725694210b9625a7c1aa7054223085650075dcbe232c671b00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000011a0000000000000000000000000000000000000000000000000000000000000112000000000000000000000000000000000015de480f002f2e5740f0dcc50b21b900000000000000000000000000000000017de5935d9c18e4ded5175cfb52b157200000000000000000000000000000000000000000000000eb4119c59d32ee00e0000000000000000000000000000000000000000000000070ce003b4a34d0b650000000000000000000000000000000000000000000000021e8b152cf70337b80000000000000000000000000000000000000000000000000002fde76d3f51f800000000000000000000000000000000000000000000000e23381c2abb532941000000000000000000000000000000000000000000000004a009049b49a5c45000000000000000000000000000000000000000000000000fe6293fb97672327400000000000000000000000000000000000000000000000000022294630dd6e700000000000000000000000000000000000000000000000c2507a25a60e2792100000000000000000000000000000000000000000000000d46a828c5377156cb000000000000000000000000000000000000000000000008c756363f92746daf0000000000000000000000000000000000000000000000000001dbd739a7c7ba000000000000000000000000000000000000000000000005e8a25b1458ad038a000000000000000000000000000000000000000000000000ae17145c18d93f31000000000000000000000000000000000000000000000006189e2563e91605170000000000000000000000000000000000000000000000000000ffbb894e8afd29e096a7e557a12ffa5d5c90792520f182db31fa2426a9f4d625f363e7a24b532f144190a462cc19fc8bb4f69fc0e3049752da1717cf5023d541f87cb570084c2d1ae6ef5035e9c6eb75ec266755a9b4fe0991be5689c057926631de0649e3b40bcc50ee72c7f55bff55a2bde0285034bac5110262c115020f3f1ac1a2862c770a1db045f5f52d46f4d0d27e7479845501c6bf03a39dac3a3ef0d50edf20c3810ef712b8a4ad7e1e9c0bc9c265eba279bbbfbaf1a277c28fc14a476ab2735ab805cea8ccc6d7e55d2d8d8bfd1a1a536eb52a1e271743b6dd20413d6d1f980ad3163775e27493b64c9f288308feb6ce85a94912e5ac8e8fc675690bd06f2e364b00c7399d7748c7487b3a984361826655a45c05d38014fe226cf36dec781eb9cf1e0ca51052021c23a93561ea92f934210d39ae3a4dc749bc29ee0173e65b616026a4f3435b3cb478197105c839f6654f6eb2dbd02f0d5c47e70d3c9c8b4c84630cfaa6e27a815797eb17e04a6e14b5607268391de6cf9c114d811f7ed0fd65352ec2d1cb8d18952b390d17ca78f41355980b75fd44b3573a50ec73f826d7a0552e59bc4f3b10927981cbe01c877e86bce8a4c07b6a7fdd4f8ed5d3c4346e275413ed50e35b872659ba43bb9cc75631205fbcb018227febda17107544f06a2aad181d6a00593b5898e0a76940388f253e0886e311394051d899f13b4190698e2c1ea71dba3f6e932af1526337820b79ddbbeaa672acccdb2519f072222f5fa8461bb50252720e3d6f130e93bc801294b9259db612cadbb7915ea0653190f4bba724752c3e6d12db407ef7538d740517afd098afc285debe23ab4bbd3f125543382391dbd465633b338193eede7acb36080a3c2ab7dcdb123997f37bc2986e4a481381dbc4aa14f5795f1a64b11c48ade7089328269a73daf2b474a26802c1a6740a49ddb02d7a6558186055bd0ce82eb363de8c081b0a468d5f7ebb03848fc18b184fd912633ae26fadac67d02b3536ccd850a4865bf081820bcc2b7936269ac91cbdcc18ea5882bf18c17551d1a981406ea72eaa521a26a92706637fcd2c16e61d20dbbf9bdb50ae1e4ec00eb3300e96b0f8e0ce9bb5a5c432861e2ba421456a2e3c6ff87a6ce3a3f8d9f2c27a71c7e40e588969305ae3991c8d00b5b186234317f7631ae9486e057196d240b6f75564337030ed8a0d29b33131c994e40eeec408277e7591f3f6d6af13852f764ec1dc0f1d4356f260b29a9278dc3f7a86a68c166d95154adf425c954827480168a91e4f7ddf1d5b75c698a40746506995dda30626255c9e9d43c23004259de7c4b5251d25651e8c55aad4fb857b917910a69211074896979f6723c8bb5086a303e94b3a25a763e973b32e2fad09eb23949b03172dd8b02e1927ff03883103d1c4819a9ace36916f637455f5f2c840693dc4370fd03233ceaab5131bf7c8c3c18ab63215aa7f177d3ed7192ac9e3af2dc0f97b161a9aa45fc4a92e352465e2f241630bcfdf768be7e8e81cb6656594528472941739343ec5adb59d4f8c856e724f2d51d5789739576666ba23f1122213a703271da5ca8e0c9edb5a25e9797c55fb244676ad5bfc244c65099dc0c1f30d2ce51f21eb4708ed5a8fb668331a79e1302de46ad8c345c10a86bdcb9b3b6f226f920e203adef5a0bb98c3856a01ee17a741bddd9b8dbb44dd92ceef80c6c62f5a184511e1696f501447d3b161004f7f26a87d48c47c72b6456d27ae7a1919cb460af32a82cd3604f51bd54504824a05feee799b621f18b73b53b118aeaf131d29a8d908b87831871d4c94826459d9cb6b463883a70925c702ba77e69450d0909fd76125d19e4e3ad8db7ec2e538f8f827b05cb314bf5736890e9d5672199e1f26c61505c4fb973fd087b491a1b65f1825073cf3788d9d69e73fcda65342821f0abe4e1c8081c0478624344086ba501a8e04b1473cf9966797344b20984cc126338b230b0cf876f6c0c9d187ad93f4ac92ea04ad8c66c4db7e7cc0eaa2b8f483696d2313c5deb63345e029f2e3c4f5b352f8850e0b52ca0a3ce5e71a9bab7748c6b1ee1732042497cb309ff651958a9668e8e9b84efcdc6671fb369bfeb2d50c72e93c19f38c741e1c5e4c5b1bea0ba7915ecdd46f63766c4e30722c737e89354c4d892fe9aa910be4a25a93976ec13c78387d16f2a6dfd69c5f724948a871c630e06618169652459225042fa8c3966aa0b72d07ec1081ba872d44dbbb5c7bee3f070825f86321897cf53db57a85fffdf138d188dd9ef0f985e74dfbcf6cc3075fd0000689ae45a53d2851f759b18e2d7aec7bdc18500edcf3a98f16efb856cc3295011d95919b7a062bb9a7046e4ac4a0c1cddbea3d850ac8a7d98cb8fc39689f87680df37173eedba9935ee5fa3250d185942988db232792f3f4dc6e1aaf4045ac4f258282c85c9f02d0e1f9d51d2ad0ef3eff3f00d9223c36c89316bcef09c84abf1d219e899df526e0b08b41c26cacdc9185c43896572d318675b96f68ec3ea753236af2068dd218923d5f0bf07d941d85bc6103bf81cc563c41e1ac0c4afd53e01b08f66e9cc3f27b8827ff31cf1f9de9711f503af9200fa39ccba7eac36c753d2e7f71c7c7af6cd189ec5be50f46925542970cc7754e606dec97956a4687c89c23b053e39a99b40570911e17bdfda81de4af733c2b189fe75b74be225da417d613af4632e36ef93ebe1136e12723ff443c972550bc2be2494f0926a8dd957e8c2cd842b7cfad29c42b433c89d425fa481ee8ab49e1828af61bbf6c72a7f0d188245d01051162b0becbe046c03ba281957962c3bba9cf027ea6ee7b120b7edcdb1f1d13695122b2fac08e1493799b0ee0d4d240bd02af1f416a87ba77b59d698706a0eabbd1caed596e576e05f11f7b56f295b3aa24e2d29becd869ac1509161a028b9a8294d20cf3d934fdceb614bea7c2a0c975b438d179e4e999eec2efb4fc0723a5fc8e394a961eb195c03cd2032d830de7fc0687e233149e02e744250f94206ba1bb96a9c1a09a16960806e1b57273acea244a33c373446ae164f5c1f0250ef1488b62be1943afd29721569a7d9e84570ad3561cadac43f5e5601bd1b909045906b788f3e5a65b2b258eaa71ab8555893773e0e5430ceb3e9410aecc3d432900e399454708f093f249a61ab60b82dba3b37f4bd46a47a0bb4c0ce81d847e1449ef54dc055b891d71427e470ce64e93b8c8e2ab0523fd049faa933588b6ff026f5ac681b72627e25eba30e37714e732c7a43822f550a3a4f12ee0a13cedf11e5005aaf6930c928a3b664b47b8c9d9bedf157b009fbf6789f012acc316a60321ec9833e839f47bc06532dff617e86efc9b173c16f02d2b1cdf663a4fb92ed0037f3573c6f83bdbc321cbd98f20a6034e20c7b2a3cb87b0ed6a85f3fd8c3d732d5ff3b311865a590c2b9472f32d9b005ac77652933460de42f037b8b0eff666203d42c2af27656ff45e6956d6f6ff88fed6cf303a968b53bf3ab1ba3f07e61b2a1362b36b689be600aabe6cc38627648831c10ae9a32c672610328a5037837402c133efe8454bd2852def0642cd449ec97b6a7b7cbd3f61278e34076ff28d012ba11c0a429301337ea80746d5b7efb0b28c89b0e0f85bb1b4deab54038eb7db21dfd0a12521e6696b64567b1e3cf6d288e5a414b8e7d40d3153d31deb63e37c1d8ce797a1a046ff6c9a07c06efecd12cb89cb106b1171bc1970cd3d39cf778116196c1d8b554e95006475cc0f82b39859043672ac2b691d504e24f0c40848dd0e48fc6a9a9def5d6551daa6a87cadc91f6948d97ea1121abed472c48baffdac04799284ff24ffea5c7de0e27e9b72624ced2903fe6b2ff0aac3a95fe07eddda1f1fcaed3806817756b976dc00a766946db414460cea4191f7903125c15efeb4010e1c3078621f9608b9e4d3fc3dd6e64acf83fe9f4d88230ce3dbda6e4a04ac13835a3a66b5ecb33288ff6fbe9ca3a3ab7dab53031864deeab202098d52ab6a1438b08d702864fa292eaa1c994ec7ba66fc35211a9baa9bf409c9c4d7710b2c0fa83dbda08166f10282dd71c4040bd13f43db46955fe6b52c9ac2d047be497a0791734838f15e788ec582f0732dc5d368c308843e1ad2fa2fb45a353151c81e1aeedc8020574b360e906808594636123b087e981f75a6cc4f86bc1f68b4ebc42a001a744f7f498c9918319b299e1c13cc3973533e7b1610872573aa31f9aa55143b30806fa2d4dd323f333aa984b07d110992016683500d69360615b164579407152e035dc0dbc12f067ec313327c3254085d22e9e993683c7a8590d7be79cc26e568e5972a6c0ec1f419ad2de74cee5f76ed7158352d6884847e56884089192f97e1076cb94f4135a23caafb91a0f3d2e5b40f5893cdc6cf4b3b6f40246ccf2860c1c38fda15716aec5d31de3144846c541efbda6d24d9c91215e00984839e2bc06e5203f4737005ade0f0286d97bfb293b3f3a79aa8680d192c8da9428d8413160030d59998da92acbacefd5fb654eed0d400e928bd2284721d0329ed673f1064502ef4dcf4d2fac9167de531bcd6f6dae5740081e50bdd247b7f3b659ee505338fc87a8f419f127b170606f298ddfc904319d8a9f6a0f926d11b8d3601121849fbfbbba3ae75beb3a12ccd46e79b2c96a4e34c9a4c67274dd820525f573d09676ad06b834dc63dd707bb9b278a01763e8cb66fd19f380d3bfd91e2e6f2000183c02b68db5dbf66f2f87b56fbb4e468d48340a99566a26cbbe0115791261100ad1f2d53b034f40c8c73cf78513251329f3cac8980b0ba8358b5b49a6b9e8f20d302554848fa29bf972065afbc4b579563baa050a5aeda1ced72b5198996e62fcb0c970e8197bb16848d7429053d4774d4d5cae1db2ae412c2ff57afa88c840fa077a49627c295caa2583fe60d17e374779733dad873f69c21827774afedd72677d67048dfb1904ea4dded021adf47b67428adf213cfc196aaa174c90a87df22f16b715e7b3e8d07f33d45160086c38b0c62d3f4654513336b22b5fdd84573272143fd75b9feaf24e68b131eb880dea31f231c9817ec0b34d5a9a5cbca7168219a10dea3579cbc0ca6808ad2afaa3e60c5b3a7f2ea004afedaf464e30a6697238b3284aad3ac6df6368d0d975f8e6914900b9b7aa1aeac40a289d731a406a502d9e62b9d8caf4eab1971c541cde8c63007adad95fcdab6c4c5ea2fe63040a80ec730cac911e10c1aa7f817afecda3c73b01a0d7ed1f7c1483e6f71ee22c49d0f2eb4b8626b1bfe2f8b92b7b3a4e5f530ecb5b090e748517f9f2206d267eab205add1aa9a52c58f03b187f07a4ed050cc07bdb64de1f96343a9a4599dda34eb000000000000000000000000000000000000000000000000000000000000000000000000000000"; + + let input_data = hex::decode(&input[2..]).unwrap(); + let proveBlockCall { blockId, input } = + proveBlockCall::abi_decode(&input_data, false).unwrap(); + println!("blockId: {}", blockId); + let (meta, trans, proof) = + <(BlockMetadata, Transition, TierProof)>::abi_decode_params(&input, false).unwrap(); + println!("meta: {:?}", meta); + let meta_hash: B256 = keccak::keccak(meta.abi_encode()).into(); + println!("meta_hash: {:?}", meta_hash); + println!("trans: {:?}", trans); + println!("proof: {:?}", proof.tier); + println!("proof: {:?}", hex::encode(proof.data)); + } +} diff --git a/primitives/src/taiko/utils.rs b/primitives/src/taiko/utils.rs new file mode 100644 index 000000000..40a505c94 --- /dev/null +++ b/primitives/src/taiko/utils.rs @@ -0,0 +1,25 @@ +use std::cmp::min; + +pub fn string_to_bytes32(input: &[u8]) -> [u8; 32] { + let mut bytes = [0u8; 32]; + let len = min(input.len(), 32); + bytes[..len].copy_from_slice(&input[..len]); + bytes +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn string_to_bytes32_test() { + let input = ""; + let byte = string_to_bytes32(input.as_bytes()); + assert_eq!( + byte, + [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 + ] + ); + } +} diff --git a/raiko-guest/Cargo.toml b/raiko-guest/Cargo.toml new file mode 100644 index 000000000..20bf7a1c7 --- /dev/null +++ b/raiko-guest/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "raiko-guest" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +risc0-zkvm = { version = "0.18", default-features = false, features = ["std"] } +zeth-lib = { path = "../lib", default-features = false, features = ["taiko"] } +sgx-ra = { optional = true, path = "../sgx-ra" } +tokio = { version = "1.23", features = ["full"] } +anyhow = "1.0" +secp256k1 = { version = "0.27.0", features = [ + 'rand-std', + 'global-context', + "recovery", +] } +rand = "0.8.5" +hex = "0.4.3" +clap = { version = "4.4.6", features = ["derive"] } +ethers-core = { version = "2.0", features = ["optimism"] } +zeth-primitives = { path = "../primitives", features = ["taiko"] } +rand_core = "0.6.4" +sha3 = "0.10.8" + +[features] +sgx-ra = ["dep:sgx-ra"] diff --git a/raiko-guest/config/raiko-guest.manifest.template b/raiko-guest/config/raiko-guest.manifest.template new file mode 100644 index 000000000..e5f52faae --- /dev/null +++ b/raiko-guest/config/raiko-guest.manifest.template @@ -0,0 +1,50 @@ +# This is Gramine's manifest file. +# To learn more see: https://gramine.readthedocs.io/en/stable/manifest-syntax.html +# +# How to use it? +# +# 1. Build the app with `cargo build`. +# 2. Copy this file `target/debug`. +# 3. Run: +# export SECRETS_DIR="./secrets" +# export INPUT_FILES_DIR="/tmp" +# gramine-manifest -Dlog_level=error -Darch_libdir=/lib/x86_64-linux-gnu/ raiko-guest.manifest.template raiko-guest.manifest +# gramine-sgx-sign --manifest raiko-guest.manifest --output raiko-guest.manifest.sgx +# gramine-sgx ./raiko-guest + +loader.entrypoint = "file:{{ gramine.libos }}" +libos.entrypoint = "/raiko-guest" +loader.log_level = "{{ log_level }}" +loader.env.LD_LIBRARY_PATH = "/lib:{{ arch_libdir }}" +loader.env.RUST_LOG = "info" + +fs.mounts = [ + { path = "/lib", uri = "file:{{ gramine.runtimedir() }}" }, + { path = "/raiko-guest", uri = "file:raiko-guest" }, + { path = "{{ arch_libdir }}", uri = "file:{{ arch_libdir }}" }, + { path = "/usr/lib/ssl/certs/", uri = "file:/usr/lib/ssl/certs/" }, + { path = "/tmp", uri = "file:/tmp" }, + { path = "/secrets/", uri = "file:{{ env.get('SECRETS_DIR', '../../secrets') }}", type = "encrypted", key_name = "_sgx_mrsigner" }, +] +sys.insecure__allow_eventfd = true +loader.insecure__use_cmdline_argv = true + +sgx.debug = false +sgx.edmm_enable = true + +sgx.trusted_files = [ + "file:{{ gramine.libos }}", + "file:raiko-guest", + "file:{{ gramine.runtimedir() }}/", + "file:{{ arch_libdir }}/libgcc_s.so.1", + "file:{{ arch_libdir }}/libssl.so.3", + "file:{{ arch_libdir }}/libcrypto.so.3", + "file:/usr/lib/ssl/certs/", +] +sgx.max_threads = 16 +sys.enable_extra_runtime_domain_names_conf = true +sgx.remote_attestation = "dcap" + +sgx.allowed_files = [ + "file:{{ env.get('INPUT_FILES_DIR', '/tmp') }}", +] diff --git a/raiko-guest/src/app_args.rs b/raiko-guest/src/app_args.rs new file mode 100644 index 000000000..c3fd8a72f --- /dev/null +++ b/raiko-guest/src/app_args.rs @@ -0,0 +1,57 @@ +use std::path::PathBuf; + +use clap::{ArgAction, Args, Parser, Subcommand}; +use zeth_primitives::{Address, B256}; + +#[derive(Debug, Parser)] +pub struct App { + #[clap(flatten)] + pub global_opts: GlobalOpts, + + #[clap(subcommand)] + pub command: Command, +} + +#[derive(Debug, Subcommand)] +pub enum Command { + Server(ServerArgs), + OneShot(OneShotArgs), + /// Bootstrap the application and exit. Bootstraping process creates the first + /// public-private key pair and saves it on disk in encrypted form. + Bootstrap, +} + +#[derive(Debug, Args)] +pub struct ServerArgs { + #[clap(short, long, require_equals = true, default_value = "127.0.0.1:8080")] + pub addr: String, +} + +#[derive(Debug, Args)] +pub struct OneShotArgs { + #[clap(long)] + /// Path of the *.json.gz file with the block data. + pub blocks_data_file: PathBuf, + #[clap(long)] + pub l1_blocks_data_file: PathBuf, + #[clap(long)] + pub prover: Address, + #[clap(long)] + pub graffiti: B256, + #[clap(long)] + pub sgx_instance_id: u32, + #[clap(long, default_value = "internal_devnet_a")] + pub l2_chain: Option, +} + +#[derive(Debug, Args)] +pub struct GlobalOpts { + #[clap(short, long, default_value = "/secrets")] + /// Path to the directory with the encrypted private keys being used to sign the + /// blocks. + pub secrets_dir: PathBuf, + + #[clap(long, short, global = true, action = ArgAction::Count)] + /// Verbosity of the application. Use multiple times to increase verbosity. + pub verbose: u8, +} diff --git a/raiko-guest/src/main.rs b/raiko-guest/src/main.rs new file mode 100644 index 000000000..c5f9644a3 --- /dev/null +++ b/raiko-guest/src/main.rs @@ -0,0 +1,37 @@ +#![feature(path_file_prefix)] + +mod app_args; +mod one_shot; +mod ratls_server; +mod signature; + +extern crate rand; +extern crate secp256k1; + +use anyhow::Result; +use app_args::{App, Command}; +use clap::Parser; +use one_shot::{bootstrap, one_shot}; +use ratls_server::ratls_server; + +#[tokio::main] +pub async fn main() -> Result<()> { + let args = App::parse(); + + match args.command { + Command::Server(server_args) => { + println!("Starting RA-TLS server - listening on {}", server_args.addr); + ratls_server(args.global_opts, server_args); + } + Command::OneShot(one_shot_args) => { + println!("Starting one shot mode"); + one_shot(args.global_opts, one_shot_args).await? + } + Command::Bootstrap => { + println!("Bootstrapping the app"); + bootstrap(args.global_opts)? + } + } + + Ok(()) +} diff --git a/raiko-guest/src/one_shot.rs b/raiko-guest/src/one_shot.rs new file mode 100644 index 000000000..2c85a6560 --- /dev/null +++ b/raiko-guest/src/one_shot.rs @@ -0,0 +1,239 @@ +use std::{ + fs::{self, File, OpenOptions}, + io::prelude::*, + os::unix::fs::PermissionsExt, + path::Path, + str::FromStr, +}; + +use anyhow::{anyhow, bail, Context, Error, Result}; +use zeth_lib::{ + consts::{get_taiko_chain_spec, ChainSpec, ETH_MAINNET_CHAIN_SPEC}, + host::Init, + input::Input, + taiko::{ + block_builder::{TaikoBlockBuilder, TaikoStrategyBundle}, + host::TaikoExtra, + }, + EthereumTxEssence, +}; +use zeth_primitives::{taiko::EvidenceType, Address, B256}; + +use crate::{ + app_args::{GlobalOpts, OneShotArgs}, + signature::*, +}; + +pub const ATTESTATION_QUOTE_DEVICE_FILE: &str = "/dev/attestation/quote"; +pub const ATTESTATION_TYPE_DEVICE_FILE: &str = "/dev/attestation/attestation_type"; +pub const ATTESTATION_USER_REPORT_DATA_DEVICE_FILE: &str = "/dev/attestation/user_report_data"; +pub const PRIV_KEY_FILENAME: &str = "priv.key"; + +pub fn bootstrap(global_opts: GlobalOpts) -> Result<()> { + let privkey_path = global_opts.secrets_dir.join(PRIV_KEY_FILENAME); + let key_pair = generate_key(); + let mut file = + fs::File::create(&privkey_path).with_context(|| "Failed to create private key file")?; + let permissions = std::fs::Permissions::from_mode(0o600); + file.set_permissions(permissions) + .with_context(|| "Failed to set permissions to private key file")?; + file.write_all(&key_pair.secret_bytes()) + .with_context(|| format!("Failed to write to {}", privkey_path.display()))?; + println!("Public key: 0x{}", key_pair.public_key()); + let new_instance = public_key_to_address(&key_pair.public_key()); + println!("Instance address: {}", new_instance); + Ok(()) +} + +pub async fn one_shot(global_opts: GlobalOpts, args: OneShotArgs) -> Result<()> { + if !is_bootstrapped(&global_opts.secrets_dir) { + bail!("Application was not bootstrapped. Bootstrap it first.") + } + + println!( + "Global options: {:?}, OneShot options: {:?}", + global_opts, args + ); + + let path_str = args.blocks_data_file.to_string_lossy().to_string(); + let block_no = u64::from_str(&String::from( + args.blocks_data_file + .file_prefix() + .unwrap() + .to_str() + .unwrap(), + ))?; + + println!("Reading input file {} (block no: {})", path_str, block_no); + + let privkey_path = global_opts.secrets_dir.join(PRIV_KEY_FILENAME); + let prev_privkey = load_private_key(&privkey_path)?; + // println!("Private key: {}", prev_privkey.display_secret()); + // let (new_privkey, new_pubkey) = generate_new_keypair()?; + let new_pubkey = public_key(&prev_privkey); + let new_instance = public_key_to_address(&new_pubkey); + + let l2_chain_spec = get_taiko_chain_spec(&args.l2_chain.unwrap()); + + // fs::write(privkey_path, new_privkey.to_bytes())?; + let pi_hash = get_data_to_sign( + &l2_chain_spec, + path_str, + args.l1_blocks_data_file.to_string_lossy().to_string(), + args.prover, + args.graffiti, + block_no, + new_instance, + ) + .await?; + + println!("Data to be signed: {}", pi_hash); + + let sig = sign_message(&prev_privkey, pi_hash)?; + + const SGX_PROOF_LEN: usize = 89; + + let mut proof = Vec::with_capacity(SGX_PROOF_LEN); + proof.extend(args.sgx_instance_id.to_be_bytes()); + proof.extend(new_instance); + proof.extend(sig.to_bytes()); + let proof = hex::encode(proof); + println!("Proof: 0x{}", proof); + println!("Public key: 0x{}", new_pubkey); + println!("Instance address: {}", new_instance); + + save_attestation_user_report_data(new_instance)?; + print_sgx_info() +} + +fn is_bootstrapped(secrets_dir: &Path) -> bool { + let privkey_path = secrets_dir.join(PRIV_KEY_FILENAME); + privkey_path.is_file() && !privkey_path.metadata().unwrap().permissions().readonly() +} + +async fn get_data_to_sign( + l2_chain_spec: &ChainSpec, + path_str: String, + l1_blocks_path: String, + prover: Address, + graffiti: B256, + block_no: u64, + new_pubkey: Address, +) -> Result { + let (init, extra) = parse_to_init( + l2_chain_spec, + path_str, + l1_blocks_path, + prover, + block_no, + graffiti, + ) + .await?; + let input: Input = init.clone().into(); + let output = TaikoBlockBuilder::build_from(l2_chain_spec, input) + .expect("Failed to build the resulting block"); + let pi = zeth_lib::taiko::protocol_instance::assemble_protocol_instance(&extra, &output)?; + let pi_hash = pi.hash(EvidenceType::Sgx { new_pubkey }); + Ok(pi_hash) +} + +async fn parse_to_init( + l2_chain_spec: &ChainSpec, + blocks_path: String, + l1_blocks_path: String, + prover: Address, + block_no: u64, + graffiti: B256, +) -> Result<(Init, TaikoExtra), Error> { + let l2_chain_spec = l2_chain_spec.clone(); + let (init, extra) = tokio::task::spawn_blocking(move || { + zeth_lib::taiko::host::get_taiko_initial_data::( + Some(l1_blocks_path), + ETH_MAINNET_CHAIN_SPEC.clone(), + None, + prover, + Some(blocks_path), + l2_chain_spec, + None, + block_no, + graffiti, + ) + .expect("Could not init") + }) + .await?; + + Ok::<(Init, TaikoExtra), _>((init, extra)) +} + +fn save_attestation_user_report_data(pubkey: Address) -> Result<()> { + let mut extended_pubkey = pubkey.to_vec(); + extended_pubkey.resize(64, 0); + let mut user_report_data_file = OpenOptions::new() + .write(true) + .open(ATTESTATION_USER_REPORT_DATA_DEVICE_FILE)?; + user_report_data_file + .write_all(&extended_pubkey) + .map_err(|err| anyhow!("Failed to save user report data: {}", err)) +} + +fn print_sgx_info() -> Result<()> { + let attestation_type = get_sgx_attestation_type()?; + println!("Detected attestation type: {}", attestation_type.trim()); + + let mut quote_file = File::open(ATTESTATION_QUOTE_DEVICE_FILE)?; + let mut quote = Vec::new(); + quote_file.read_to_end(&mut quote)?; + println!( + "Extracted SGX quote with size = {} and the following fields:", + quote.len() + ); + // println!("Quote: {}", hex::encode("e)); + println!( + " ATTRIBUTES.FLAGS: {} [ Debug bit: {} ]", + hex::encode("e[96..104]), + quote[96] & 2 > 0 + ); + println!(" ATTRIBUTES.XFRM: {}", hex::encode("e[104..112])); + // Enclave's measurement (hash of code and data). MRENCLAVE is a 256-bit value that + // represents the hash (message digest) of the code and data within an enclave. It is a + // critical security feature of SGX and provides integrity protection for the enclave's + // contents. When an enclave is instantiated, its MRENCLAVE value is computed and stored + // in the SGX quote. This value can be used to ensure that the enclave being run is the + // intended and correct version. + println!(" MRENCLAVE: {}", hex::encode("e[112..144])); + // MRSIGNER is a 256-bit value that identifies the entity or signer responsible for + // signing the enclave code. It represents the microcode revision of the software entity + // that created the enclave. Each entity or signer, such as a software vendor or + // developer, has a unique MRSIGNER value associated with their signed enclaves. The + // MRSIGNER value provides a way to differentiate between different signers or entities, + // allowing applications to make trust decisions based on the signer's identity and + // trustworthiness. + println!(" MRSIGNER: {}", hex::encode("e[176..208])); + println!(" ISVPRODID: {}", hex::encode("e[304..306])); + println!(" ISVSVN: {}", hex::encode("e[306..308])); + // The REPORTDATA field in the SGX report structure is a 64-byte array used for + // providing additional data to the reporting process. The contents of this field are + // application-defined and can be used to convey information that the application + // considers relevant for its security model. The REPORTDATA field allows the + // application to include additional contextual information that might be necessary for + // the particular security model or usage scenario. + println!(" REPORTDATA: {}", hex::encode("e[368..400])); + println!(" {}", hex::encode("e[400..432])); + + Ok(()) +} + +fn get_sgx_attestation_type() -> Result { + let mut attestation_type = String::new(); + if File::open(ATTESTATION_TYPE_DEVICE_FILE) + .and_then(|mut file| file.read_to_string(&mut attestation_type)) + .is_ok() + { + return Ok(attestation_type.trim().to_string()); + } + + bail!( + "Cannot find `{}`; are you running under SGX, with remote attestation enabled?", + ATTESTATION_TYPE_DEVICE_FILE + ); +} diff --git a/raiko-guest/src/ratls_server.rs b/raiko-guest/src/ratls_server.rs new file mode 100644 index 000000000..94db9f281 --- /dev/null +++ b/raiko-guest/src/ratls_server.rs @@ -0,0 +1,6 @@ +use crate::app_args::{GlobalOpts, ServerArgs}; + +pub fn ratls_server(_: GlobalOpts, args: ServerArgs) { + #[cfg(feature = "sgx")] + let _ = server_sgx::result_main(args.addr); +} diff --git a/raiko-guest/src/signature.rs b/raiko-guest/src/signature.rs new file mode 100644 index 000000000..a249c5281 --- /dev/null +++ b/raiko-guest/src/signature.rs @@ -0,0 +1,88 @@ +use std::{fs, path::Path}; + +use rand_core::OsRng; +use secp256k1::{ + ecdsa::{RecoverableSignature, RecoveryId}, + Error, KeyPair, Message, PublicKey, Secp256k1, SecretKey, SECP256K1, +}; +use zeth_primitives::{keccak256, signature::TxSignature, Address, B256, U256}; + +pub fn generate_key() -> KeyPair { + KeyPair::new(&Secp256k1::new(), &mut OsRng) +} + +/// Recovers the address of the sender using secp256k1 pubkey recovery. +/// +/// Converts the public key into an ethereum address by hashing the public key with +/// keccak256. +/// +/// This does not ensure that the `s` value in the signature is low, and _just_ wraps the +/// underlying secp256k1 library. +#[allow(dead_code)] +pub fn recover_signer_unchecked(sig: &[u8; 65], msg: &[u8; 32]) -> Result { + let sig = + RecoverableSignature::from_compact(&sig[0..64], RecoveryId::from_i32(sig[64] as i32)?)?; + + let public = SECP256K1.recover_ecdsa(&Message::from_slice(&msg[..32])?, &sig)?; + Ok(public_key_to_address(&public)) +} + +/// Signs message with the given secret key. +/// Returns the corresponding signature. +pub fn sign_message(secret_key: &SecretKey, message: B256) -> Result { + let secret = B256::from_slice(&secret_key.secret_bytes()[..]); + let sec = SecretKey::from_slice(secret.as_ref())?; + let s = SECP256K1.sign_ecdsa_recoverable(&Message::from_slice(&message[..])?, &sec); + let (rec_id, data) = s.serialize_compact(); + + let signature = TxSignature { + r: U256::try_from_be_slice(&data[..32]).expect("The slice has at most 32 bytes"), + s: U256::try_from_be_slice(&data[32..64]).expect("The slice has at most 32 bytes"), + v: (rec_id.to_i32() != 0) as u64, + }; + Ok(signature) +} + +/// Converts a public key into an ethereum address by hashing the encoded public key with +/// keccak256. +pub fn public_key_to_address(public: &PublicKey) -> Address { + // strip out the first byte because that should be the SECP256K1_TAG_PUBKEY_UNCOMPRESSED + // tag returned by libsecp's uncompressed pubkey serialization + let hash = keccak256(&public.serialize_uncompressed()[1..]); + Address::from_slice(&hash[12..]) +} + +pub fn load_private_key>(path: T) -> Result { + let data = fs::read(path).unwrap(); + SecretKey::from_slice(data.as_ref()) +} + +pub fn public_key(secret: &SecretKey) -> PublicKey { + PublicKey::from_secret_key(&Secp256k1::new(), secret) +} + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use super::*; + #[test] + fn recover() { + let proof = "01000000c13bd882edb37ffbabc9f9e34a0d9789633b850fe55e625b768cc8e5feed7d9f7ab536cbc210c2fcc1385aaf88d8a91d8adc2740245f9deee5fd3d61dd2a71662fb6639515f1e2f3354361a82d86c1952352c1a800"; + let proof_bytes = hex::decode(proof).unwrap(); + let msg = "216ac5cd5a5e13b0c9a81efb1ad04526b9f4ddd2fe6ebc02819c5097dfb0958c"; + let msg_bytes = hex::decode(msg).unwrap(); + let proof_addr = recover_signer_unchecked( + &proof_bytes[24..].try_into().unwrap(), + &msg_bytes.try_into().unwrap(), + ) + .unwrap(); + let priv_key = "324b5d1744ec27d6ac458350ce6a6248680bb0209521b2c730c1fe82a433eb54"; + let priv_key = SecretKey::from_str(priv_key).unwrap(); + let pubkey = public_key(&priv_key); + let pub_addr = public_key_to_address(&pubkey); + assert_eq!(pub_addr, proof_addr); + println!("Public address: {}", pub_addr); + println!("Proof public address: {}", proof_addr); + } +} diff --git a/raiko-host/Cargo.toml b/raiko-host/Cargo.toml new file mode 100644 index 000000000..c56755f33 --- /dev/null +++ b/raiko-host/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "raiko-host" +version = "0.1.0" +edition = "2021" + +[dependencies] +anyhow = "1.0" +bincode = "1.3.3" +bonsai-sdk = { workspace = true } +bytemuck = "1.13" +clap = { version = "4.0", features = ["derive"] } +structopt = "0.3.26" +structopt-toml = "0.5.1" +ethers-core = { version = "2.0" } +hex = "0.4.3" +revm = { workspace = true } +serde = "1.0" +serde_with = "3.4.0" +tempfile = "3.6" +tokio = { version = "1.23", features = ["full"] } +zeth-lib = { path = "../lib", features = ["taiko", "server"] } +zeth-primitives = { path = "../primitives", features = ["taiko"] } +serde_json = "1.0" +hyper = { version = "0.14.27", features = ["server"] } +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } +tracing-appender = "0.2" +tower = { version = "0.4.13", features = ["full"] } +lru_time_cache = "0.11.11" +prometheus = "0.13.3" +lazy_static = "1.4.0" +once_cell = "1.8.0" + +[dev-dependencies] +assert_cmd = "2.0" +rstest = "0.18" diff --git a/raiko-host/config/config.toml b/raiko-host/config/config.toml new file mode 120000 index 000000000..d8a1bfca9 --- /dev/null +++ b/raiko-host/config/config.toml @@ -0,0 +1 @@ +docker_config.toml \ No newline at end of file diff --git a/raiko-host/config/docker_config.toml b/raiko-host/config/docker_config.toml new file mode 100644 index 000000000..b497020c8 --- /dev/null +++ b/raiko-host/config/docker_config.toml @@ -0,0 +1,11 @@ +# Prod config file for raiko-host to be used with Docker container + +bind = "0.0.0.0:8080" +cache = "/tmp/sgx" +guest = "./guests" +log_path = "/var/log/raiko" +concurrency_limit = 10 +max_log_days = 7 +l2_chain = "internal_devnet_a" # "internal_devnet_b" or "testnet" +log_level = "info" +sgx_instance_id = 0 # your registered SGX instance ID, default 0 diff --git a/host/testdata/.gitkeep b/raiko-host/guests/.gitkeep similarity index 100% rename from host/testdata/.gitkeep rename to raiko-host/guests/.gitkeep diff --git a/host/testdata/ethereum/.gitkeep b/raiko-host/guests/sgx/.gitkeep similarity index 100% rename from host/testdata/ethereum/.gitkeep rename to raiko-host/guests/sgx/.gitkeep diff --git a/raiko-host/guests/sgx/raiko-guest.manifest.template b/raiko-host/guests/sgx/raiko-guest.manifest.template new file mode 120000 index 000000000..b0dde7057 --- /dev/null +++ b/raiko-host/guests/sgx/raiko-guest.manifest.template @@ -0,0 +1 @@ +../../../raiko-guest/config/raiko-guest.manifest.template \ No newline at end of file diff --git a/raiko-host/src/main.rs b/raiko-host/src/main.rs new file mode 100644 index 000000000..4ab3a1779 --- /dev/null +++ b/raiko-host/src/main.rs @@ -0,0 +1,122 @@ +#![feature(path_file_prefix)] +#![feature(absolute_path)] +// Copyright 2023 RISC Zero, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod metrics; +mod prover; +#[allow(dead_code)] +mod rolling; +use std::{fmt::Debug, path::PathBuf}; + +use anyhow::{Context, Result}; +use prover::server::serve; +use serde::Deserialize; +use structopt::StructOpt; +use structopt_toml::StructOptToml; +use tracing::info; + +#[derive(StructOpt, StructOptToml, Deserialize, Debug)] +#[serde(default)] +struct Opt { + #[structopt(long, require_equals = true, default_value = "0.0.0.0:8080")] + /// Server bind address + /// [default: 0.0.0.0:8080] + bind: String, + + #[structopt(long, require_equals = true, default_value = "/tmp")] + /// Use a local directory as a cache for RPC calls. Accepts a custom directory. + cache: PathBuf, + + #[structopt(long, require_equals = true, default_value = "raiko-host/guests")] + /// The guests path + guest: PathBuf, + + #[structopt(long, require_equals = true, default_value = "0")] + sgx_instance_id: u32, + + #[structopt(long, require_equals = true)] + log_path: Option, + + #[structopt(long, require_equals = true, default_value = "1000")] + proof_cache: usize, + + #[structopt(long, require_equals = true, default_value = "10")] + concurrency_limit: usize, + + #[structopt(long, require_equals = true, default_value = "7")] + max_log_days: usize, + + #[structopt(long, require_equals = true, default_value = "internal_devnet_a")] + l2_chain: String, + + #[structopt(long, require_equals = true, default_value = "20")] + // WARNING: must large than concurrency_limit + max_caches: usize, + + #[structopt(long, require_equals = true)] + config_path: Option, + + #[structopt(long, require_equals = true, env = "RUST_LOG", default_value = "info")] + log_level: String, +} + +#[tokio::main] +async fn main() -> Result<()> { + let mut opt = Opt::from_args(); + + if let Some(config_path) = opt.config_path { + let config_raw = std::fs::read(&config_path) + .context(format!("read config file {:?} failed", config_path))?; + opt = + Opt::from_args_with_toml(std::str::from_utf8(&config_raw).context("str parse failed")?) + .context("toml parse failed")?; + }; + + let subscriber_builder = tracing_subscriber::FmtSubscriber::builder() + .with_env_filter(&opt.log_level) + .with_test_writer(); + let _guard = match opt.log_path { + Some(ref log_path) => { + let file_appender = tracing_appender::rolling::Builder::new() + .rotation(tracing_appender::rolling::Rotation::DAILY) + .filename_prefix("raiko.log") + .max_log_files(opt.max_log_days) + .build(log_path) + .expect("initializing rolling file appender failed"); + let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender); + let subscriber = subscriber_builder.json().with_writer(non_blocking).finish(); + tracing::subscriber::set_global_default(subscriber).unwrap(); + Some(_guard) + } + None => { + let subscriber = subscriber_builder.finish(); + tracing::subscriber::set_global_default(subscriber).unwrap(); + None + } + }; + info!("Start args: {:?}", opt); + serve( + &opt.bind, + &opt.guest, + &opt.cache, + &opt.l2_chain, + opt.sgx_instance_id, + opt.proof_cache, + opt.concurrency_limit, + opt.max_caches, + ) + .await?; + Ok(()) +} diff --git a/raiko-host/src/metrics.rs b/raiko-host/src/metrics.rs new file mode 100644 index 000000000..c6d139ffc --- /dev/null +++ b/raiko-host/src/metrics.rs @@ -0,0 +1,59 @@ +use lazy_static::lazy_static; +use prometheus::{ + labels, register_int_counter_vec, register_int_gauge, register_int_gauge_vec, IntCounterVec, + IntGauge, IntGaugeVec, +}; + +lazy_static! { + pub static ref SGX_PROOF_GEN_TIME: IntGaugeVec = register_int_gauge_vec!( + "sgx_proof_time_gauge", + "time taken for sgx proof generation", + &["blockid"] + ) + .unwrap(); + pub static ref SGX_PROOF_SUCCESS_COUNTER: IntCounterVec = register_int_counter_vec!( + "sgx_proof_success_counter", + "number of successful sgx proof calls", + &["blockid"] + ) + .unwrap(); + pub static ref SGX_PROOF_ERROR_COUNTER: IntCounterVec = register_int_counter_vec!( + "sgx_proof_error_counter", + "number of failed sgx proof calls", + &["blockid"] + ) + .unwrap(); + pub static ref PREPARE_INPUT_TIME: IntGauge = register_int_gauge!( + "prepare_input_time_gauge", + "time taken for preparing input before proof generation" + ) + .unwrap(); +} + +pub fn observe_sgx_gen(block: u64, time: i64) { + let bid = &block.to_string()[..]; + let label = labels! { + "blockid" => bid, + }; + SGX_PROOF_GEN_TIME.with(&label).set(time); +} + +pub fn inc_sgx_success(block: u64) { + let bid = &block.to_string()[..]; + let label = labels! { + "blockid" => bid, + }; + SGX_PROOF_SUCCESS_COUNTER.with(&label).inc(); +} + +pub fn inc_sgx_error(block: u64) { + let bid = &block.to_string()[..]; + let label = labels! { + "blockid" => bid, + }; + SGX_PROOF_ERROR_COUNTER.with(&label).inc(); +} + +pub fn observe_input(time: i64) { + PREPARE_INPUT_TIME.set(time); +} diff --git a/raiko-host/src/prover/consts.rs b/raiko-host/src/prover/consts.rs new file mode 100644 index 000000000..d0116763a --- /dev/null +++ b/raiko-host/src/prover/consts.rs @@ -0,0 +1,6 @@ +#[allow(dead_code)] +pub const SGX_PROOF_PREFIX: &str = "Proof:"; +pub const SGX_PARENT_DIR: &str = "sgx"; +#[allow(dead_code)] +pub const PSE_ZK_PARENT_DIR: &str = "pse-zk"; +pub const RAIKO_GUEST_EXECUTABLE: &str = "raiko-guest"; diff --git a/raiko-host/src/prover/context.rs b/raiko-host/src/prover/context.rs new file mode 100644 index 000000000..b98f762b0 --- /dev/null +++ b/raiko-host/src/prover/context.rs @@ -0,0 +1,43 @@ +use std::path::{absolute, PathBuf}; + +use tracing::debug; + +#[derive(Debug, Default, Clone)] +pub struct Context { + /// guest executable path + pub guest_path: PathBuf, + /// cache for public input + pub cache_path: PathBuf, + pub l2_chain: String, + pub sgx_context: SgxContext, + pub max_caches: usize, +} + +#[derive(Debug, Default, Clone)] +pub struct SgxContext { + pub instance_id: u32, +} + +impl Context { + pub fn new( + guest_path: PathBuf, + cache_path: PathBuf, + l2_chain: String, + sgx_instance_id: u32, + max_caches: usize, + ) -> Self { + let guest_path = absolute(guest_path).unwrap(); + debug!("Guest path: {:?}", guest_path); + let cache_path = absolute(cache_path).unwrap(); + debug!("Cache path: {:?}", cache_path); + Self { + guest_path, + cache_path, + l2_chain, + sgx_context: SgxContext { + instance_id: sgx_instance_id, + }, + max_caches, + } + } +} diff --git a/raiko-host/src/prover/error.rs b/raiko-host/src/prover/error.rs new file mode 100644 index 000000000..42914c187 --- /dev/null +++ b/raiko-host/src/prover/error.rs @@ -0,0 +1,54 @@ +use std::fmt; + +#[derive(Debug)] +pub enum Error { + Io(std::io::Error), + Anyhow(anyhow::Error), + Serde(serde_json::Error), + JoinHandle(tokio::task::JoinError), + String(String), +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Error::Io(e) => e.fmt(f), + Error::Anyhow(e) => e.fmt(f), + Error::Serde(e) => e.fmt(f), + Error::JoinHandle(e) => e.fmt(f), + Error::String(e) => e.fmt(f), + } + } +} + +impl From for Error { + fn from(e: std::io::Error) -> Self { + Error::Io(e) + } +} + +impl From for Error { + fn from(e: anyhow::Error) -> Self { + Error::Anyhow(e) + } +} + +impl From for Error { + fn from(e: serde_json::Error) -> Self { + Error::Serde(e) + } +} + +impl From for Error { + fn from(e: tokio::task::JoinError) -> Self { + Error::JoinHandle(e) + } +} + +impl From for Error { + fn from(e: String) -> Self { + Error::String(e) + } +} + +pub type Result = core::result::Result; diff --git a/raiko-host/src/prover/execution.rs b/raiko-host/src/prover/execution.rs new file mode 100644 index 000000000..d37a7800d --- /dev/null +++ b/raiko-host/src/prover/execution.rs @@ -0,0 +1,35 @@ +use std::time::Instant; + +use zeth_lib::taiko::block_builder::TaikoStrategyBundle; + +use super::{ + context::Context, + error::Result, + prepare_input::prepare_input, + proof::{cache::Cache, sgx::execute_sgx}, + request::{ProofRequest, ProofResponse}, +}; +use crate::metrics::{inc_sgx_success, observe_input, observe_sgx_gen}; +// use crate::rolling::prune_old_caches; + +pub async fn execute(_cache: &Cache, ctx: &Context, req: &ProofRequest) -> Result { + // 1. load input data into cache path + let start = Instant::now(); + let _ = prepare_input::(ctx, req).await?; + let elapsed = Instant::now().duration_since(start).as_millis() as i64; + observe_input(elapsed); + // 2. run proof + // prune_old_caches(&ctx.cache_path, ctx.max_caches); + match req { + ProofRequest::Sgx(req) => { + let start = Instant::now(); + let bid = req.block.clone(); + let resp = execute_sgx(ctx, req).await?; + let time_elapsed = Instant::now().duration_since(start).as_millis() as i64; + observe_sgx_gen(bid, time_elapsed); + inc_sgx_success(bid); + Ok(ProofResponse::Sgx(resp)) + } + ProofRequest::PseZk(_) => todo!(), + } +} diff --git a/raiko-host/src/prover/json_rpc.rs b/raiko-host/src/prover/json_rpc.rs new file mode 100644 index 000000000..94c6d883e --- /dev/null +++ b/raiko-host/src/prover/json_rpc.rs @@ -0,0 +1,31 @@ +/// Common utilities for json-rpc +use serde::Deserialize; +use serde::Serialize; + +#[derive(Debug, Serialize, Deserialize)] +pub struct JsonRpcError { + pub code: i32, + pub message: String, +} + +#[derive(Debug, Serialize)] +pub struct JsonRpcResponseError { + pub jsonrpc: String, + pub id: serde_json::Value, + pub error: JsonRpcError, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct JsonRpcResponse { + pub jsonrpc: String, + pub id: serde_json::Value, + pub result: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct JsonRpcRequest { + pub jsonrpc: String, + pub id: serde_json::Value, + pub method: String, + pub params: T, +} diff --git a/raiko-host/src/prover/mod.rs b/raiko-host/src/prover/mod.rs new file mode 100644 index 000000000..f7cc1b181 --- /dev/null +++ b/raiko-host/src/prover/mod.rs @@ -0,0 +1,10 @@ +pub mod consts; +pub mod context; +pub mod error; +pub mod execution; +pub mod json_rpc; +pub mod prepare_input; +pub mod proof; +pub mod request; +pub mod server; +pub mod utils; diff --git a/raiko-host/src/prover/prepare_input.rs b/raiko-host/src/prover/prepare_input.rs new file mode 100644 index 000000000..27dd17129 --- /dev/null +++ b/raiko-host/src/prover/prepare_input.rs @@ -0,0 +1,65 @@ +//! Prepare Input for guest +use std::fmt::Debug; + +use zeth_lib::{ + block_builder::NetworkStrategyBundle, + consts::{get_taiko_chain_spec, ETH_MAINNET_CHAIN_SPEC}, + host::Init, + taiko::host::TaikoExtra, + EthereumTxEssence, +}; + +use super::{ + context::Context, + error::Result, + request::{ProofRequest, PseZkRequest, SgxRequest}, + utils::cache_file_path, +}; + +/// prepare input data for guests +pub async fn prepare_input>( + ctx: &Context, + req: &ProofRequest, +) -> Result<(Init, TaikoExtra)> +where + ::Error: Debug, +{ + match req { + ProofRequest::Sgx(SgxRequest { + block, + l1_rpc, + l2_rpc, + prover, + graffiti, + }) => { + let l2_block = *block; + let l2_cache_path = cache_file_path(&ctx.cache_path, l2_block, false); + + let l2_spec = get_taiko_chain_spec(&ctx.l2_chain); + let l2_rpc = l2_rpc.to_owned(); + + let l1_spec = ETH_MAINNET_CHAIN_SPEC.clone(); + let l1_cache_path = cache_file_path(&ctx.cache_path, l2_block, true); + let l1_rpc = l1_rpc.to_owned(); + let prover = prover.to_owned(); + let graffiti = *graffiti; + // run sync task in blocking mode + tokio::task::spawn_blocking(move || { + zeth_lib::taiko::host::get_taiko_initial_data::( + Some(l1_cache_path.into_os_string().into_string().unwrap()), + l1_spec, + Some(l1_rpc), + prover, + Some(l2_cache_path.into_os_string().into_string().unwrap()), + l2_spec, + Some(l2_rpc), + l2_block, + graffiti, + ) + }) + .await? + .map_err(Into::into) + } + ProofRequest::PseZk(PseZkRequest { .. }) => todo!(), + } +} diff --git a/raiko-host/src/prover/proof/cache.rs b/raiko-host/src/prover/proof/cache.rs new file mode 100644 index 000000000..00cf1d772 --- /dev/null +++ b/raiko-host/src/prover/proof/cache.rs @@ -0,0 +1,52 @@ +use std::sync::{Arc, Mutex}; + +use lru_time_cache::LruCache; +use zeth_primitives::{Address, B256}; + +use super::ProofType; +pub struct CachedProof { + proof: String, +} + +#[derive(PartialEq, Eq, PartialOrd, Ord, Clone)] +pub struct CacheKey { + pub proof_type: ProofType, + pub block: u64, + pub prover: Address, + pub graffiti: B256, +} + +impl AsRef for CacheKey { + fn as_ref(&self) -> &CacheKey { + self + } +} + +#[derive(Clone)] +pub struct Cache { + lru_cache: Arc>>, +} + +impl Cache { + pub fn new(capacity: usize) -> Self { + let lru_cache = LruCache::with_capacity(capacity); + Cache { + lru_cache: Arc::new(Mutex::new(lru_cache)), + } + } + + pub fn get>(&self, cache_key: T) -> Option { + let cache_key = cache_key.as_ref(); + let mut inner_cache = self.lru_cache.lock().unwrap(); + match inner_cache.get(cache_key) { + Some(entry) => Some(entry.proof.clone()), + None => None, + } + } + + pub fn set(&self, cache_key: CacheKey, proof: String) { + let mut inner_cache = self.lru_cache.lock().unwrap(); + let entry = CachedProof { proof }; + inner_cache.insert(cache_key, entry); + } +} diff --git a/raiko-host/src/prover/proof/mod.rs b/raiko-host/src/prover/proof/mod.rs new file mode 100644 index 000000000..803c75f77 --- /dev/null +++ b/raiko-host/src/prover/proof/mod.rs @@ -0,0 +1,13 @@ +//! Generate different proofs for the taiko protocol. + +#[allow(dead_code)] +pub mod cache; +pub mod pse_zk; +pub mod sgx; + +#[allow(dead_code)] +#[derive(PartialEq, Eq, PartialOrd, Ord, Clone)] +pub enum ProofType { + PseZk, + Sgx, +} diff --git a/raiko-host/src/prover/proof/pse_zk.rs b/raiko-host/src/prover/proof/pse_zk.rs new file mode 100644 index 000000000..00a177f66 --- /dev/null +++ b/raiko-host/src/prover/proof/pse_zk.rs @@ -0,0 +1 @@ +//! Pse zkevm proof diff --git a/raiko-host/src/prover/proof/sgx.rs b/raiko-host/src/prover/proof/sgx.rs new file mode 100644 index 000000000..2d17866d5 --- /dev/null +++ b/raiko-host/src/prover/proof/sgx.rs @@ -0,0 +1,74 @@ +use std::str; + +use tokio::{fs, process::Command}; +use tracing::{debug, info}; + +use crate::{ + metrics::inc_sgx_error, + prover::{ + consts::*, + context::Context, + request::{SgxRequest, SgxResponse}, + utils::{cache_file_path, guest_executable_path}, + }, +}; + +pub async fn execute_sgx(ctx: &Context, req: &SgxRequest) -> Result { + let guest_path = guest_executable_path(&ctx.guest_path, SGX_PARENT_DIR); + debug!("Guest path: {:?}", guest_path); + let mut cmd = { + let bin_directory = guest_path + .parent() + .ok_or(String::from("missing sgx executable directory"))?; + let bin = guest_path + .file_name() + .ok_or(String::from("missing sgx executable"))?; + let mut cmd = Command::new("sudo"); + cmd.current_dir(bin_directory) + .arg("gramine-sgx") + .arg(bin) + .arg("one-shot"); + cmd + }; + let l1_cache_file = cache_file_path(&ctx.cache_path, req.block, true); + let l2_cache_file = cache_file_path(&ctx.cache_path, req.block, false); + let output = cmd + .arg("--blocks-data-file") + .arg(&l2_cache_file) + .arg("--l1-blocks-data-file") + .arg(&l1_cache_file) + .arg("--prover") + .arg(req.prover.to_string()) + .arg("--graffiti") + .arg(req.graffiti.to_string()) + .arg("--sgx-instance-id") + .arg(ctx.sgx_context.instance_id.to_string()) + .arg("--l2-chain") + .arg(&ctx.l2_chain) + .output() + .await + .map_err(|e| e.to_string())?; + info!("Sgx execution stderr: {:?}", str::from_utf8(&output.stderr)); + info!("Sgx execution stdout: {:?}", str::from_utf8(&output.stdout)); + // clean cache file, avoid reorg error + for file in &[l1_cache_file, l2_cache_file] { + fs::remove_file(file).await.map_err(|e| e.to_string())?; + } + if !output.status.success() { + inc_sgx_error(req.block); + return Err(output.status.to_string()); + } + parse_sgx_result(output.stdout) +} + +fn parse_sgx_result(output: Vec) -> Result { + // parse result of sgx execution + let output = String::from_utf8(output).map_err(|e| e.to_string())?; + let mut proof = String::new(); + for line in output.lines() { + if let Some(_proof) = line.trim().strip_prefix(SGX_PROOF_PREFIX) { + proof = _proof.trim().to_owned(); + } + } + Ok(SgxResponse { proof }) +} diff --git a/raiko-host/src/prover/request.rs b/raiko-host/src/prover/request.rs new file mode 100644 index 000000000..6dbbbf230 --- /dev/null +++ b/raiko-host/src/prover/request.rs @@ -0,0 +1,47 @@ +use serde::{Deserialize, Serialize}; +use serde_with::{serde_as, DisplayFromStr}; +use zeth_primitives::{Address, B256}; + +#[derive(Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +#[allow(clippy::large_enum_variant)] +pub enum ProofRequest { + Sgx(SgxRequest), + PseZk(PseZkRequest), +} + +#[serde_as] +#[derive(Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SgxRequest { + /// the l2 block number + pub block: u64, + /// l2 node for get block by number + pub l2_rpc: String, + /// l1 node for signal root verify and get txlist from proposed transaction. + pub l1_rpc: String, + /// the protocol instance data + #[serde_as(as = "DisplayFromStr")] + pub prover: Address, + pub graffiti: B256, +} + +#[derive(Clone, Serialize, Deserialize)] +pub struct PseZkRequest {} + +#[derive(Clone, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum ProofResponse { + Sgx(SgxResponse), + PseZk(PseZkResponse), +} + +#[derive(Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SgxResponse { + /// proof format: 4b(id)+20b(pubkey)+65b(signature) + pub proof: String, +} + +#[derive(Clone, Serialize, Deserialize)] +pub struct PseZkResponse {} diff --git a/raiko-host/src/prover/server.rs b/raiko-host/src/prover/server.rs new file mode 100644 index 000000000..0f30f53c5 --- /dev/null +++ b/raiko-host/src/prover/server.rs @@ -0,0 +1,238 @@ +use std::path::{Path, PathBuf}; + +use hyper::{ + body::{Buf, HttpBody}, + header::HeaderValue, + service::{make_service_fn, service_fn}, + Body, Method, Request, Response, Server, StatusCode, +}; +use prometheus::{Encoder, TextEncoder}; +use tower::ServiceBuilder; +use tracing::info; + +use crate::prover::{ + context::Context, + execution::execute, + json_rpc::{JsonRpcError, JsonRpcRequest, JsonRpcResponse, JsonRpcResponseError}, + proof::cache::Cache, + request::*, +}; + +/// Starts the proverd json-rpc server. +/// Note: the server may not immediately listening after returning the +/// `JoinHandle`. +pub fn serve( + addr: &str, + guest_path: &Path, + cache_path: &Path, + l2_chain: &str, + sgx_instance_id: u32, + proof_cache: usize, + concurrency_limit: usize, + max_caches: usize, +) -> tokio::task::JoinHandle<()> { + let addr = addr + .parse::() + .expect("valid socket address"); + let guest_path = guest_path.to_owned(); + let cache_path = cache_path.to_owned(); + let l2_chain = l2_chain.to_owned(); + tokio::spawn(async move { + let handler = Handler::new( + guest_path.clone(), + cache_path.clone(), + l2_chain.clone(), + sgx_instance_id, + proof_cache, + max_caches, + ); + let service = service_fn(move |req| { + let handler = handler.clone(); + handler.handle_request(req) + }); + + let service = ServiceBuilder::new() + .concurrency_limit(concurrency_limit) + .service(service); + + let service = make_service_fn(|_| { + let service = service.clone(); + async move { Ok::<_, hyper::Error>(service) } + }); + + let server = Server::bind(&addr).serve(service); + info!("Listening on http://{}", addr); + server.await.expect("server should be serving"); + }) +} + +/// sets default headers for CORS requests +fn set_headers(headers: &mut hyper::HeaderMap, extended: bool) { + headers.insert("content-type", HeaderValue::from_static("application/json")); + headers.insert("access-control-allow-origin", HeaderValue::from_static("*")); + + if extended { + headers.insert( + "access-control-allow-methods", + HeaderValue::from_static("post, get, options"), + ); + headers.insert( + "access-control-allow-headers", + HeaderValue::from_static("origin, content-type, accept, x-requested-with"), + ); + headers.insert("access-control-max-age", HeaderValue::from_static("300")); + } +} + +#[derive(Clone)] +struct Handler { + ctx: Context, + cache: Cache, +} + +impl Handler { + fn new( + guest_path: PathBuf, + cache_path: PathBuf, + l2_chain: String, + sgx_instance_id: u32, + capacity: usize, + max_caches: usize, + ) -> Self { + Self { + ctx: Context::new( + guest_path, + cache_path, + l2_chain, + sgx_instance_id, + max_caches, + ), + cache: Cache::new(capacity), + } + } + + async fn handle_request(self, req: Request) -> Result, hyper::Error> { + { + // limits the request size + const MAX_BODY_SIZE: u64 = 1 << 20; + let response_content_length = match req.body().size_hint().upper() { + Some(v) => v, + None => MAX_BODY_SIZE + 1, + }; + + if response_content_length > MAX_BODY_SIZE { + let mut resp = Response::new(Body::from("request too large")); + *resp.status_mut() = StatusCode::BAD_REQUEST; + return Ok(resp); + } + } + + match (req.method(), req.uri().path()) { + (&Method::GET, "/health") => { + // nothing to report yet - healthy by default + let mut resp = Response::default(); + set_headers(resp.headers_mut(), false); + Ok(resp) + } + + // json-rpc + (&Method::POST, "/") => { + let body_bytes = hyper::body::aggregate(req.into_body()) + .await + .unwrap() + .reader(); + let json_req: Result>, serde_json::Error> = + serde_json::from_reader(body_bytes); + + if let Err(err) = json_req { + let payload = serde_json::to_vec(&JsonRpcResponseError { + jsonrpc: "2.0".to_string(), + id: 0.into(), + error: JsonRpcError { + // parser error + code: -32700, + message: err.to_string(), + }, + }) + .unwrap(); + let mut resp = Response::new(Body::from(payload)); + set_headers(resp.headers_mut(), false); + return Ok(resp); + } + + let json_req = json_req.unwrap(); + let result: Result = self + .handle_method(json_req.method.as_str(), &json_req.params) + .await; + let payload = match result { + Err(err) => { + serde_json::to_vec(&JsonRpcResponseError { + jsonrpc: "2.0".to_string(), + id: json_req.id, + error: JsonRpcError { + // internal server error + code: -32000, + message: err, + }, + }) + } + Ok(val) => serde_json::to_vec(&JsonRpcResponse { + jsonrpc: "2.0".to_string(), + id: json_req.id, + result: Some(val), + }), + }; + let mut resp = Response::new(Body::from(payload.unwrap())); + set_headers(resp.headers_mut(), false); + Ok(resp) + } + + // serve CORS headers + (&Method::OPTIONS, "/") => { + let mut resp = Response::default(); + set_headers(resp.headers_mut(), true); + Ok(resp) + } + + // serve metrics + (&Method::GET, "/metrics") => { + let encoder = TextEncoder::new(); + let mut buffer = vec![]; + let mf = prometheus::gather(); + encoder.encode(&mf, &mut buffer).unwrap(); + let resp = Response::builder() + .header(hyper::header::CONTENT_TYPE, encoder.format_type()) + .body(Body::from(buffer)) + .unwrap(); + Ok(resp) + } + + // everything else + _ => { + let mut not_found = Response::default(); + *not_found.status_mut() = StatusCode::NOT_FOUND; + Ok(not_found) + } + } + } + + async fn handle_method( + &self, + method: &str, + params: &[serde_json::Value], + ) -> Result { + match method { + // enqueues a task for computating proof for any given block + "proof" => { + let options = params.first().ok_or("expected struct ProofRequest")?; + let req: ProofRequest = + serde_json::from_value(options.to_owned()).map_err(|e| e.to_string())?; + execute(&self.cache, &self.ctx, &req) + .await + .and_then(|result| serde_json::to_value(result).map_err(Into::into)) + .map_err(|e| e.to_string()) + } + _ => todo!(), + } + } +} diff --git a/raiko-host/src/prover/utils.rs b/raiko-host/src/prover/utils.rs new file mode 100644 index 000000000..76421df3b --- /dev/null +++ b/raiko-host/src/prover/utils.rs @@ -0,0 +1,23 @@ +use std::path::{Path, PathBuf}; + +use super::consts::RAIKO_GUEST_EXECUTABLE; + +pub fn cache_file_path(cache_path: &Path, block_no: u64, is_l1: bool) -> PathBuf { + let prefix = if is_l1 { "l1" } else { "l2" }; + let file_name = format!("{}.{}.json.gz", block_no, prefix); + cache_path.join(file_name) +} + +pub fn guest_executable_path(guest_path: &Path, proof_type: &str) -> PathBuf { + guest_path.join(proof_type).join(RAIKO_GUEST_EXECUTABLE) +} + +#[cfg(test)] +mod tests { + #[test] + fn test_file_prefix() { + let path = std::path::Path::new("/tmp/ethereum/1234.l1.json.gz"); + let prefix = path.file_prefix().unwrap(); + assert_eq!(prefix, "1234"); + } +} diff --git a/raiko-host/src/rolling.rs b/raiko-host/src/rolling.rs new file mode 100644 index 000000000..479529c8b --- /dev/null +++ b/raiko-host/src/rolling.rs @@ -0,0 +1,74 @@ +use std::{fs, path::Path, sync::Mutex}; + +use once_cell::sync::Lazy; + +const L1_CACHE_FILE_SUFFIX: &str = ".l1.json.gz"; +const L2_CACHE_FILE_SUFFIX: &str = ".l2.json.gz"; + +static MUTEX: Lazy> = Lazy::new(|| Mutex::new(())); + +// delete old cache files +pub fn prune_old_caches>(cache_dir: T, max_blocks: usize) { + let _guard = MUTEX.lock().unwrap(); + let cache_dir = cache_dir.as_ref(); + let files = fs::read_dir(cache_dir).map(|dir| { + dir.filter_map(|entry| { + let entry = entry.ok()?; + let metadata = entry.metadata().ok()?; + + // the appender only creates files, not directories or symlinks, + // so we should never delete a dir or symlink. + if !metadata.is_file() { + return None; + } + + let filename = entry.file_name(); + // if the filename is not a UTF-8 string, skip it. + let filename = filename.to_str()?; + let block_no_l1 = filename.strip_suffix(L1_CACHE_FILE_SUFFIX); + let block_no_l2 = filename.strip_suffix(L2_CACHE_FILE_SUFFIX); + if block_no_l1.is_none() && block_no_l2.is_none() { + return None; + } + let block_no = block_no_l1.or(block_no_l2)?; + let block_no = block_no.parse::().ok()?; + + Some((entry, block_no)) + }) + .collect::>() + }); + + let mut files = match files { + Ok(files) => files, + Err(error) => { + eprintln!("Error reading the log directory/files: {}", error); + return; + } + }; + let max_files = max_blocks * 2; + if files.len() < max_files { + return; + } + + // sort the files by their creation timestamps. + files.sort_by_key(|(_, block_no)| *block_no); + + for (file, _) in files.iter().take(files.len() - max_files) { + if let Err(error) = fs::remove_file(file.path()) { + eprintln!( + "Failed to remove old log file {}: {}", + file.path().display(), + error + ); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + #[test] + fn test_prune_old_caches() { + prune_old_caches("./testdata/rolling_caches/", 2); + } +} diff --git a/rust-toolchain b/rust-toolchain index 3fd281156..1c9ebd79f 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1,4 +1,4 @@ [toolchain] -channel = "stable" +channel = "nightly" components = ["clippy", "rustfmt", "rust-src"] profile = "minimal" diff --git a/scripts/build-and-push-image.sh b/scripts/build-and-push-image.sh new file mode 100755 index 000000000..d065def4b --- /dev/null +++ b/scripts/build-and-push-image.sh @@ -0,0 +1,38 @@ +#!/bin/bash +set -x +set -eo pipefail + +features=( + "pos" + "none" +) + +for feature in "${features[@]}"; do + if [[ "${feature}" != "$1" ]]; then + continue + fi + + tag=$2 + + if [[ -z "$tag" ]]; then + tag="latest" + fi + + build_flags="" + if [[ "$feature" != "none" ]]; then + tag="${tag}-${feature}" + build_flags="--build-arg BUILD_FLAGS=--features=${feature}" + fi + + echo "Build and push $1:$tag..." + docker buildx build --no-cache ./ \ + --platform linux/amd64 \ + -t raiko:$tag \ + $build_flags \ + --build-arg TARGETPLATFORM=linux/amd64 + + docker tag raiko:$tag gcr.io/evmchain/raiko:$tag + docker push gcr.io/evmchain/raiko:$tag + + echo "Done" +done diff --git a/sgx-ra/Cargo.toml b/sgx-ra/Cargo.toml new file mode 100644 index 000000000..2927138a2 --- /dev/null +++ b/sgx-ra/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "sgx-ra" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +mbedtls = { git = "https://github.com/fortanix/rust-mbedtls.git", features = [ + "ssl", +] } +hex = "0.3" + +[lib] +name = "server_sgx" +path = "src/server_sgx.rs" diff --git a/sgx-ra/src/client.rs b/sgx-ra/src/client.rs new file mode 100644 index 000000000..54ffd2d43 --- /dev/null +++ b/sgx-ra/src/client.rs @@ -0,0 +1,319 @@ +// Copyright (c) Fortanix, Inc. +// +// Licensed under the GNU General Public License, version 2 or the Apache License, Version +// 2.0 , at your +// option. This file may not be copied, modified, or distributed except +// according to those terms. + +#![feature(c_size_t)] + +extern crate mbedtls; + +use core::ffi::{c_char, c_int, c_size_t, c_uchar, c_uint}; +use std::{ + ffi::CStr, + io::{self, stdin, stdout, Write}, + net::TcpStream, + sync::Arc, +}; + +use clap::Parser; +use mbedtls::{ + error::LoError::Asn1InvalidData, + rng::CtrDrbg, + ssl::{ + config::{Endpoint, Preset, Transport}, + Config, Context, + }, + x509::{Certificate, VerifyError}, + Result as TlsResult, +}; + +#[path = "../tests/support/mod.rs"] +mod support; +use support::{entropy::entropy_new, keys}; + +// **************************** Beginning of the FFI section **************************** + +// FFI stuff for the functions defined in libra_tls_verify_dcap_gramine.so (if run in SGX +// enclave) and libra_tls_verify_dcap.so (if run outside of SGX enclave). +// See: https://github.com/gramineproject/gramine/blob/master/tools/sgx/ra-tls/ra_tls.h + +// FFI for `ra_tls_verify_callback_extended_der` function + +pub type RATLSAttestationScheme = c_uint; +pub const RA_TLS_ATTESTATION_SCHEME_T_RA_TLS_ATTESTATION_SCHEME_UNKNOWN: RATLSAttestationScheme = 0; +pub const RA_TLS_ATTESTATION_SCHEME_T_RA_TLS_ATTESTATION_SCHEME_EPID: RATLSAttestationScheme = 1; +pub const RA_TLS_ATTESTATION_SCHEME_T_RA_TLS_ATTESTATION_SCHEME_DCAP: RATLSAttestationScheme = 2; + +pub type RATLSErrLoc = c_uint; +pub const RA_TLS_ERR_LOC_T_AT_NONE: RATLSErrLoc = 0; +pub const RA_TLS_ERR_LOC_T_AT_INIT: RATLSErrLoc = 1; +pub const RA_TLS_ERR_LOC_T_AT_EXTRACT_QUOTE: RATLSErrLoc = 2; +pub const RA_TLS_ERR_LOC_T_AT_VERIFY_EXTERNAL: RATLSErrLoc = 3; +pub const RA_TLS_ERR_LOC_T_AT_VERIFY_ENCLAVE_ATTRS: RATLSErrLoc = 4; +pub const RA_TLS_ERR_LOC_T_AT_VERIFY_ENCLAVE_MEASUREMENTS: RATLSErrLoc = 5; + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RATLSverifyCallbackResultsEPID { + pub ias_enclave_quote_status: [c_char; 128usize], +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RATLSVerifyCallbackResultsDCAP { + pub func_verify_quote_result: c_int, + pub quote_verification_result: c_int, +} + +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct RATLSVerifyCallbackResultsMisc { + pub reserved: [c_char; 128usize], +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub union ra_tls_verify_callback_results_union { + pub epid: RATLSverifyCallbackResultsEPID, + pub dcap: RATLSVerifyCallbackResultsDCAP, + pub misc: RATLSVerifyCallbackResultsMisc, +} + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct RATLSVerifyCallbackResults { + pub attestation_scheme: RATLSAttestationScheme, + pub err_loc: RATLSErrLoc, + pub __bindgen_anon_1: ra_tls_verify_callback_results_union, +} + +extern "C" { + /// Generic verification callback for EPID-based (IAS) or ECDSA-based (DCAP) quote + /// verification (DER format) with additional information. + /// + /// * `der_crt` - Self-signed RA-TLS certificate with SGX quote embedded in DER + /// format. + /// * `der_crt_size` - Size of the RA-TLS certificate. + /// * `results` - (Optional) Verification callback results for retrieving + /// additional verification results from RA-TLS. + /// + /// Returns 0 on success, specific mbedTLS error code (negative int) otherwise. This + /// function must be called from a non-mbedTLS verification callback, e.g., from a + /// user-defined OpenSSL callback for SSL_CTX_set_cert_verify_callback(). All + /// parameters required for the SGX quote, IAS attestation report verification, + /// and/or DCAP quote verification must be passed in the corresponding RA-TLS + /// environment variables. + /// + /// Originally defined as: int ra_tls_verify_callback_extended_der(uint8_t* der_crt, + /// size_t der_crt_size, struct ra_tls_verify_callback_results* results); + /// + /// See: + /// https://raw.githubusercontent.com/gramineproject/gramine/master/tools/sgx/ra-tls/ra_tls.h + pub fn ra_tls_verify_callback_extended_der( + der_crt: *mut c_uchar, + der_crt_size: c_size_t, + results: *mut RATLSVerifyCallbackResults, + ) -> c_int; +} + +// FFI for `ra_tls_set_measurement_callback` function + +pub type VerifyMeasurementsCallback = Option< + unsafe extern "C" fn( + mrenclave: *const c_char, + mrsigner: *const c_char, + isv_prod_id: *const c_char, + isv_svn: *const c_char, + ) -> c_int, +>; + +extern "C" { + /// Callback for user-specific verification of measurements in SGX quote. + /// + /// * `f_cb` - Callback for user-specific verification; RA-TLS passes pointers to + /// MRENCLAVE, MRSIGNER, ISV_PROD_ID, ISV_SVN measurements in SGX quote. Use NULL to + /// revert to default behavior of RA-TLS. + /// + /// Returns 0 on success, specific error code (negative int) otherwise. + /// + /// If this callback is registered before RA-TLS session, then RA-TLS verification + /// will invoke this callback to allow for user-specific checks on SGX measurements + /// reported in the SGX quote. If no callback is registered (or registered as NULL), + /// then RA-TLS defaults to verifying SGX measurements against `RA_TLS_*` + /// environment variables (if any). + pub fn ra_tls_set_measurement_callback(f_cb: VerifyMeasurementsCallback); +} + +fn are_equal_u8_array_and_c_string(u8_array: &[u8], c_string_ptr: *const c_char) -> bool { + let c_str_from_ptr = unsafe { CStr::from_ptr(c_string_ptr) }; + + let arr_as_str = unsafe { + let len = u8_array + .iter() + .position(|&c| c == 0) + .unwrap_or(u8_array.len()); + std::str::from_utf8_unchecked(&u8_array[..len]) + }; + + c_str_from_ptr.to_bytes() == arr_as_str.as_bytes() +} + +static mut MRENCLAVE_ARR: [u8; 32] = [0; 32]; +static mut MRSIGNER_ARR: [u8; 32] = [0; 32]; +static mut ISV_PROD_ID_ARR: [u8; 2] = [0; 2]; +static mut ISV_SVN_ARR: [u8; 2] = [0; 2]; + +unsafe extern "C" fn measurement_verification_callback( + mrenclave: *const c_char, + mrsigner: *const c_char, + isv_prod_id: *const c_char, + isv_svn: *const c_char, +) -> c_int { + assert!(!mrenclave.is_null()); + assert!(!mrsigner.is_null()); + assert!(!isv_prod_id.is_null()); + assert!(!isv_svn.is_null()); + + let pairs = [(&MRENCLAVE_ARR, mrenclave), (&MRSIGNER_ARR, mrsigner)]; + + for &(arr, c_str_ptr) in &pairs { + if are_equal_u8_array_and_c_string(arr, c_str_ptr) == false { + return -1; + } + } + + let pairs2 = [(&ISV_PROD_ID_ARR, isv_prod_id), (&ISV_SVN_ARR, isv_svn)]; + + for &(arr, c_str_ptr) in &pairs2 { + if are_equal_u8_array_and_c_string(arr, c_str_ptr) == false { + return -1; + } + } + + 0 +} + +// **************************** End of the FFI section **************************** + +fn parse_hex(hex: &str, buffer: &mut [u8; 32]) -> Result<(), &'static str> { + if hex.len() != buffer.len() * 2 { + return Err("Hex string length does not match buffer size"); + } + + for i in 0..buffer.len() { + let hex_byte = &hex[i * 2..i * 2 + 2]; + + if !hex_byte.chars().all(|c| c.is_ascii_hexdigit()) { + return Err("Invalid hexadecimal character detected"); + } + + if let Ok(parsed_byte) = u8::from_str_radix(hex_byte, 16) { + buffer[i] = parsed_byte; + } else { + return Err("Failed to parse hexadecimal byte"); + } + } + + Ok(()) +} + +fn result_main(addr: &str) -> TlsResult<()> { + let entropy = Arc::new(entropy_new()); // mbedtls::rng::Rdseed or mbedtls::rng::OsEntropy::new() + let rng: Arc = Arc::new(CtrDrbg::new(entropy, None)?); + let cert = Arc::new(Certificate::from_pem_multiple( + keys::ROOT_CA_CERT.as_bytes(), + )?); + + let verify_callback = move |crt: &Certificate, depth: i32, verify_flags: &mut VerifyError| { + if depth != 0 { + println!("Depth should be 0 but is {}", depth); + // the cert chain in RA-TLS consists of single self-signed cert, so we expect depth 0 */ + return Err(Asn1InvalidData.into()); // MBEDTLS_ERR_X509_INVALID_FORMAT + } + if *verify_flags != VerifyError::empty() { + // mbedTLS sets flags to signal that the cert is not to be trusted (e.g., it is not + // correctly signed by a trusted CA; since RA-TLS uses self-signed certs, we don't care + // what mbedTLS thinks and ignore internal cert verification logic of mbedTLS + *verify_flags = VerifyError::empty(); + } + let mut ratls_verify_results: RATLSVerifyCallbackResults = unsafe { std::mem::zeroed() }; + let mut der_data: Vec = crt.as_der().to_vec(); + println!("DER data: {:?}", der_data); // prints the same DER that was generated by the server + let der_ptr = der_data.as_mut_ptr(); + let der_len = der_data.len(); + unsafe { + let ret = ra_tls_verify_callback_extended_der( + der_ptr, + der_len, + &mut ratls_verify_results as *mut RATLSVerifyCallbackResults, + ); + println!("debug_info: {:?}", ratls_verify_results.err_loc); + if ret != 0 { + println!("ra_tls_verify_callback_extended_der returned {}", ret); + return Err(Asn1InvalidData.into()); + } + } + + Ok(()) + }; + + let mut config = Config::new(Endpoint::Client, Transport::Stream, Preset::Default); + config.set_rng(rng); + // https://github.com/fortanix/rust-mbedtls/blob/52476eed8af2824cc331acbd5ec84151a836291a/mbedtls/tests/ssl_conf_verify.rs#L54 + config.set_verify_callback(verify_callback); + config.set_ca_list(cert, None); // TODO needed? + let mut ctx = Context::new(Arc::new(config)); + + let conn = TcpStream::connect(addr).unwrap(); + ctx.establish(conn, None)?; + + let mut line = String::new(); + stdin().read_line(&mut line).unwrap(); + ctx.write_all(line.as_bytes()).unwrap(); + io::copy(&mut ctx, &mut stdout()).unwrap(); + + Ok(()) +} + +#[derive(Parser)] +struct Cli { + address: String, + mrenclave: String, + mrsigner: String, + isv_prod_id: u16, + isv_svn: u16, +} + +fn main() { + let args = Cli::parse(); + + // Convert arguments to the format expected by FFI + + unsafe { + match parse_hex(&args.mrenclave, &mut MRENCLAVE_ARR) { + Ok(_) => println!( + "Mrenclave hex string parsed successfully: {:?}", + MRENCLAVE_ARR + ), + Err(err) => println!("Error: {}", err), + } + match parse_hex(&args.mrsigner, &mut MRSIGNER_ARR) { + Ok(_) => println!( + "Mrsigner hex string parsed successfully: {:?}", + MRSIGNER_ARR + ), + Err(err) => println!("Error: {}", err), + } + ISV_PROD_ID_ARR.copy_from_slice(&args.isv_prod_id.to_le_bytes()); + ISV_SVN_ARR.copy_from_slice(&args.isv_svn.to_le_bytes()); + } + + unsafe { + ra_tls_set_measurement_callback(Some(measurement_verification_callback)); + } + + result_main(&args.address).unwrap(); +} diff --git a/sgx-ra/src/libra_tls_attest.so b/sgx-ra/src/libra_tls_attest.so new file mode 100755 index 000000000..5ecc5cf80 Binary files /dev/null and b/sgx-ra/src/libra_tls_attest.so differ diff --git a/sgx-ra/src/libra_tls_verify_dcap.so b/sgx-ra/src/libra_tls_verify_dcap.so new file mode 100755 index 000000000..a1e7fd70e Binary files /dev/null and b/sgx-ra/src/libra_tls_verify_dcap.so differ diff --git a/sgx-ra/src/libra_tls_verify_dcap_gramine.so b/sgx-ra/src/libra_tls_verify_dcap_gramine.so new file mode 100755 index 000000000..24964e1aa Binary files /dev/null and b/sgx-ra/src/libra_tls_verify_dcap_gramine.so differ diff --git a/sgx-ra/src/libsgx_urts.so b/sgx-ra/src/libsgx_urts.so new file mode 100644 index 000000000..3be7471d7 Binary files /dev/null and b/sgx-ra/src/libsgx_urts.so differ diff --git a/sgx-ra/src/server_sgx.rs b/sgx-ra/src/server_sgx.rs new file mode 100644 index 000000000..8afb80534 --- /dev/null +++ b/sgx-ra/src/server_sgx.rs @@ -0,0 +1,165 @@ +// Copyright (c) Fortanix, Inc. +// +// Licensed under the GNU General Public License, version 2 or the Apache License, Version +// 2.0 , at your +// option. This file may not be copied, modified, or distributed except +// according to those terms. + +#![feature(c_size_t)] + +extern crate mbedtls; + +use core::ffi::{c_int, c_size_t, c_uchar}; +use std::{ + fs::File, + io::{prelude::*, BufRead, BufReader, Write}, + net::{TcpListener, TcpStream, ToSocketAddrs}, + sync::Arc, +}; + +use mbedtls::{ + alloc::List as MbedtlsList, + pk::Pk, + rng::CtrDrbg, + ssl::{ + config::{Endpoint, Preset, Transport}, + Config, Context, + }, + x509::Certificate, + Result as TlsResult, +}; + +// Define functions exported from Gramine's libra_tls_attest.so (RA-TLS) +#[link(name = "ra_tls_attest")] +extern "C" { + fn ra_tls_create_key_and_crt_der( + der_key: *mut *mut c_uchar, + der_key_size: *mut c_size_t, + der_crt: *mut *mut c_uchar, + der_crt_size: *mut c_size_t, + ) -> c_int; +} + +fn listen Result<(), E>>( + addr: A, + mut handle_client: F, +) -> Result<(), E> { + let sock = TcpListener::bind(addr).unwrap(); + for conn in sock.incoming().map(Result::unwrap) { + println!("Connection from {}", conn.peer_addr().unwrap()); + handle_client(conn)?; + } + Ok(()) +} + +// inspired by: +// - https://github.com/Mbed-TLS/mbedtls/blob/development/programs/ssl/ssl_server.c +// - https://github.com/pbeza/rust-mbedtls/blob/master/mbedtls/examples/server.rs +pub fn result_main(addr: A) -> TlsResult<()> { + // assert /dev/attestation/attestation_type == "dcap" + + if let Ok(mut attestation_type_file) = File::open("/dev/attestation/attestation_type") { + let mut attestation_type = String::new(); + if attestation_type_file + .read_to_string(&mut attestation_type) + .is_ok() + { + println!("Detected attestation type: {}", attestation_type.trim()); + } + assert_eq!(attestation_type, "dcap"); + } + + // Seeding the random number generator: + // 4. ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const + // unsigned char*)pers, strlen(pers)); + + // let entropy = entropy_new(); // mbedtls::rng::Rdseed or + // mbedtls::rng::OsEntropy::new() + let entropy = mbedtls::rng::OsEntropy::new(); + let rng = Arc::new(CtrDrbg::new(Arc::new(entropy), None)?); + + // Creating the RA-TLS server cert and key: + // 5. ret = (*ra_tls_create_key_and_crt_der_f)(&der_key, &der_key_size, &der_crt, + // &der_crt_size); + + let mut der_key: *mut c_uchar = std::ptr::null_mut(); + let der_key_ptr: *mut *mut c_uchar = &mut der_key; + let mut der_key_size: c_size_t = 0; + let mut der_crt: *mut c_uchar = std::ptr::null_mut(); + let der_crt_ptr: *mut *mut c_uchar = &mut der_crt; + let mut der_crt_size: c_size_t = 0; + + // throws MBEDTLS_ERR_X509_FILE_IO_ERROR (-10496) if you run it without gramine-sgx + let result = unsafe { + ra_tls_create_key_and_crt_der( + der_key_ptr, + &mut der_key_size, + der_crt_ptr, + &mut der_crt_size, + ) + }; + + if result != 0 { + panic!( + "Failed to obtain key and certificate data (error code: {})", + result + ); + } + + println!("Successfully obtained key and certificate data."); + + let der_key_slice = unsafe { std::slice::from_raw_parts(der_key, der_key_size as usize) }; + let der_crt_slice = unsafe { std::slice::from_raw_parts(der_crt, der_crt_size as usize) }; + + println!("DER Key: {:?}", der_key_slice); + println!("DER Certificate: {:?}", der_crt_slice); + + // Ensure to free the allocated memory in the C function + // unsafe { + // libc::free(der_key_ptr as *mut c_void); + // libc::free(der_crt_ptr as *mut c_void); + // } + + // 6. ret = mbedtls_x509_crt_parse(&srvcert, (unsigned char*)der_crt, der_crt_size); + let cert = Certificate::from_der(der_crt_slice)?; + // 7. ret = mbedtls_pk_parse_key(&pkey, (unsigned char*)der_key, der_key_size, + // /*pwd=*/NULL, 0, mbedtls_ctr_drbg_random, &ctr_drbg); + + let key = Pk::from_private_key(der_key_slice, None)?; + + // Bind on https://localhost:4433/: + // 8. ret = mbedtls_net_bind(&listen_fd, NULL, "4433", MBEDTLS_NET_PROTO_TCP); + // Setting up the SSL data: + // 9. ret = mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_SERVER, + // MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); + // 10. mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg); + // 11. mbedtls_ssl_conf_dbg(&conf, my_debug, stdout); + // 12. ret = mbedtls_ssl_conf_own_cert(&conf, &srvcert, &pkey); + // 13. ret = mbedtls_ssl_setup(&ssl, &conf); + + let mut config = Config::new(Endpoint::Server, Transport::Stream, Preset::Default); + config.set_rng(rng); + let mut cert_list = MbedtlsList::::new(); + cert_list.push(cert); + let arc_cert_list = Arc::new(cert_list); + config.push_cert(arc_cert_list, key.into())?; + + let rc_config = Arc::new(config); + + // Waiting for a remote connection: + // 14. ret = mbedtls_net_accept(&listen_fd, &client_fd, NULL, 0, NULL); + // 15. mbedtls_ssl_set_bio(&ssl, &client_fd, mbedtls_net_send, mbedtls_net_recv, NULL); + + listen(addr, move |conn| { + let mut ctx = Context::new(rc_config.clone()); + ctx.establish(conn, None)?; + let mut session = BufReader::new(ctx); + let mut line = Vec::new(); + session.read_until(b'\n', &mut line).unwrap(); + let s = String::from_utf8(line.clone()).expect("Found invalid UTF-8"); + println!("result: {}", s); + session.get_mut().write_all(&line).unwrap(); + Ok(()) + }) +} diff --git a/sgx-ra/src/support/custom_write_all.rs b/sgx-ra/src/support/custom_write_all.rs new file mode 100644 index 000000000..ec475ca0f --- /dev/null +++ b/sgx-ra/src/support/custom_write_all.rs @@ -0,0 +1,102 @@ +#![cfg(all(feature = "std", feature = "async"))] +use tokio::io::AsyncWrite; + +use pin_project_lite::pin_project; +use std::future::Future; +use std::io; +use std::marker::PhantomPinned; +use std::pin::Pin; +use std::task::{Context, Poll}; + +pin_project! { + /// A future returned by `custom_write_all` function that writes all data from a buffer to an AsyncWrite stream. + /// + /// This struct is used to control the behavior of writing data to the stream when it returns `Poll::Pending`. + /// The buffer size will be adjusted based on the percentage specified in `buffer_change_percent`. + #[derive(Debug)] + #[must_use = "futures do nothing unless you `.await` or poll them"] + pub struct CustomWriteAll<'a, W: ?Sized> { + writer: &'a mut W, + // The buffer containing the data to be written. + buf: &'a [u8], + // The left index of the current buffer. + l: usize, + // The right index of the current buffer (inclusive). + r: usize, + // The percentage number used to control how the buffer is changed when `poll_write` returns `Poll::Pending`. + buffer_change_percent: i8, + // Make this future `!Unpin` for compatibility with async trait methods. + #[pin] + _pin: PhantomPinned, + } +} + +/// This function will create a custom Future is for writing all data from a +/// buffer to an AsyncWrite stream. When [`AsyncWrite::poll_write`] returns +/// [`Poll::Pending`], this future will change the size of the buffer passed to +/// [`AsyncWrite::poll_write`] by `buffer_change_percent` percents. +/// +/// This behavior is mainly for testing whether the underlying IO implementation +/// can resolve the limitation that comes from `mbedtls_ssl_write`. When +/// `mbedtls_ssl_write` returns `Error::SslWantWrite`, it needs to be called +/// again with the same arguments. +pub(crate) fn custom_write_all<'a, W>(writer: &'a mut W, buf: &'a [u8], buffer_change_percent: i8) -> CustomWriteAll<'a, W> +where + W: AsyncWrite + Unpin + ?Sized, +{ + let min_len = 8 * 1024; + assert!(buf.len() > min_len, "Please provide a buffer with length > {}", min_len); + CustomWriteAll { + writer, + buf, + l: 0, + r: min_len, + buffer_change_percent, + _pin: PhantomPinned, + } +} + +/// This custom Future is for writing all data from a buffer to an AsyncWrite +/// stream. When [`AsyncWrite::poll_write`] returns [`Poll::Pending`], this +/// future will change the size of the buffer passed to +/// [`AsyncWrite::poll_write`]. +/// +/// This behavior is mainly for testing whether the underlying IO implementation +/// can resolve the limitation that comes from `mbedtls_ssl_write`. When +/// `mbedtls_ssl_write` returns `Error::SslWantWrite`, it needs to be called +/// again with the same arguments. +impl Future for CustomWriteAll<'_, W> +where + W: AsyncWrite + Unpin + ?Sized, +{ + type Output = io::Result<()>; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + let me = self.project(); + while me.l < me.r { + let buf_len = me.buf.len(); + match Pin::new(&mut *me.writer).poll_write(cx, &me.buf[*me.l..*me.r]) { + Poll::Ready(Ok(n)) => { + if n == 0 { + return Poll::Ready(Err(io::ErrorKind::WriteZero.into())); + } + *me.l += n; + *me.r += n; + if *me.r > buf_len { + *me.r = buf_len; + } + } + Poll::Ready(Err(e)) => return Poll::Ready(Err(e)), + Poll::Pending => { + *me.r = *me.l + (*me.r - *me.l) * (100 + *me.buffer_change_percent) as usize / 100; + if *me.r > buf_len { + *me.r = buf_len; + } + return Poll::Pending; + } + } + } + + Poll::Ready(Ok(())) + } +} diff --git a/sgx-ra/src/support/debug.rs b/sgx-ra/src/support/debug.rs new file mode 100644 index 000000000..b47474f8e --- /dev/null +++ b/sgx-ra/src/support/debug.rs @@ -0,0 +1,46 @@ +/* Copyright (c) Fortanix, Inc. + * + * Licensed under the GNU General Public License, version 2 or the Apache License, Version + * 2.0 , at your + * option. This file may not be copied, modified, or distributed except + * according to those terms. */ + +use crate::mbedtls::ssl::Config; +use std::borrow::Cow; + +#[cfg(feature = "debug")] +pub const DEFAULT_MBEDTLS_DEBUG_LEVEL: i32 = 3; + +#[cfg(feature = "debug")] +static MBEDTLS_DEBUG_LEVEL: std::sync::OnceLock = std::sync::OnceLock::new(); + +/// Mbed TLS has a feature to show the TLS handshake logs, filtering with +/// certain debug level. Note that [`DEFAULT_MBEDTLS_DEBUG_LEVEL`] is the default +/// level of debug logs if you did not specify it through `MBEDTLS_DEBUG` +/// environment variable. +#[cfg(feature = "debug")] +pub fn get_mbedtls_debug_level() -> i32 { + *MBEDTLS_DEBUG_LEVEL.get_or_init(|| { + std::env::var("MBEDTLS_DEBUG") + .unwrap_or_default() + .parse() + .unwrap_or(DEFAULT_MBEDTLS_DEBUG_LEVEL) + }) +} + +pub fn set_config_debug(config: &mut Config, prefix: &str) { + let prefix = prefix.to_owned(); + // This is mostly as an example - how to debug mbedtls + let dbg_callback = move |level: i32, file: Cow<'_, str>, line: i32, message: Cow<'_, str>| { + println!("{}{} {}:{} {}", prefix, level, file, line, message); + }; + config.set_dbg_callback(dbg_callback); + + #[cfg(feature = "debug")] + unsafe { crate::mbedtls::set_global_debug_threshold(get_mbedtls_debug_level()); } +} + +pub fn init_env_logger() { + let _ = env_logger::builder().is_test(true).try_init(); +} diff --git a/sgx-ra/src/support/entropy.rs b/sgx-ra/src/support/entropy.rs new file mode 100644 index 000000000..8825a5527 --- /dev/null +++ b/sgx-ra/src/support/entropy.rs @@ -0,0 +1,23 @@ +/* Copyright (c) Fortanix, Inc. + * + * Licensed under the GNU General Public License, version 2 or the Apache License, Version + * 2.0 , at your + * option. This file may not be copied, modified, or distributed except + * according to those terms. */ + +cfg_if::cfg_if! { + if #[cfg(any(feature = "rdrand", target_env = "sgx"))] { + pub fn entropy_new() -> crate::mbedtls::rng::Rdseed { + crate::mbedtls::rng::Rdseed + } + } else if #[cfg(feature = "std")] { + pub fn entropy_new() -> crate::mbedtls::rng::OsEntropy { + crate::mbedtls::rng::OsEntropy::new() + } + } else { + pub fn entropy_new() -> ! { + panic!("Unable to run test without entropy source") + } + } +} diff --git a/sgx-ra/src/support/keys.rs b/sgx-ra/src/support/keys.rs new file mode 100644 index 000000000..c899f35c6 --- /dev/null +++ b/sgx-ra/src/support/keys.rs @@ -0,0 +1,94 @@ +/* Copyright (c) Fortanix, Inc. + * + * Licensed under the GNU General Public License, version 2 or the Apache License, Version + * 2.0 , at your + * option. This file may not be copied, modified, or distributed except + * according to those terms. */ + +#![allow(dead_code)] + +pub const PEM_SELF_SIGNED_KEY: &'static [u8] = b"-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDFjAgmCJUmKAQ/ +OAg0MBh3E2+l5asSHdBNmTm0gr3vmnmFcUqlIpUG3BGd85o0c9X5qnxBKJafTJLu +2xRqjx1TMlBdtVpP0CXy5qPYwvO8UWIGyrsniy8GfpDjXGkUFbm91Cw1c/lCD7R1 +6lLHK+7Npq9oxpk3KfMHivQorFd31byo0VxZv/sFYViCbDtOYmMifQX/qkqsbvkx +SuPklzpxAxF824mtKMRimwGQbZ4tbLlAFNugO02eV0Hq8xHxfbmNrblSqIy68/Ud +jg4Y9feFi8NVfYg/rsFjuL+Fv/3dLBBhaMffyV9J0eULXgVw5ZXNaQgKb6sSBQqi +U3LftHDTAgMBAAECggEBAKzBKN8Z4lTb6drfRU1eQgbgGGMb1d6h8+fod25EZ5WB +oYPw7zY6Z9j32vAmeFQmeJk9XiwdMptce6ImNFR7k0mOVnmcfr4NaSJiUCbfVgb5 +pKAL6l9KeHVVeZ9a0Qmfdi9rvL2CDhiXY1k68ej7onp1qjAWfSagqMeP3LU1Acjo +tYnt42QNa/x4spOCx9EoMuKrEiBNYoll7lW6iuIqTO9Oodkh7ZHVEYNe3y4RHIpj +QmMxVrjt9Pe26cesNajkM2OWMxZW8MEeyL7DqUenxNluRrMG2lP5ZtEBuDFRTWEL +xrh89UQcFN0MZPL+HmMunS+ztu0vOh2UQw8zORSw+AECgYEA/DNK/kTJeRC0N4xh +ErcwTUBx2vtYdD/lWo4dRBanw218mXnzu25l8CjOQm0OircELy/UG0eBGCGXaxhh +H274KQqgM7ibSJHTP2J17wfbS3PxIgF75uf7UNP0M2yX/t2bjgfCsaqNckHBIrxN +Ym/FWUN884zrgapaYtiPzjTUF3MCgYEAyIXyguElCI7iYIN0qreSHvt+2qKyKhVO +6NdPf19ZvhT7vk03P6YXt/VCg+eNDeh5EBwHUWG2JQYznIK2jRLFwoFLdIlIjapq +kG9s2NWQ99HpY0mnhTUFptTEpiuyFDbEyhXhWBja5zOn1ZuqW/V9bgCglGoxOckV +2vGv4YX0KSECgYEA0YUTcnZXItr7vYJESzYhTKyTaieR7tH+iuKx8ZUYvsTA1Qh5 +smcfDQv5fzn28MrnEQSdJCSdXRzbHL/eQC0CwaXwPcfKSdnMNEZqT7CpQOALngK5 +mrVzFk1f/TDkfXpB9xb/anaUmC2EdIUXjQXqYCQvNG8IYGrUOHZN0jQVV30CgYAV +HW209GpG5WzXBuChHWVol8j60sj5/3ZotEttuSelCWac2lqn/CBhQZU4eIh033bo +CFuI6UYZzfZfU7BPWJu0aJL+eXpHWJuSC/mlN4/lWJg/2UCnmTa4I411hgJheIbu +VLF+6lcao2jX6GVe+5GypKREHI6EbDU98dc4YzeboQKBgF/R6wCxhVt9kqSLYeGq +nGQmHqj2/0m7M9O/QS5a4L/3Oyu5YyNuPR6OBMdjivOdz4RwUi6+o9IEepzmN1cV +okcspBUohwqnqHwvdiQjB+RygIpmnXhchXxRok3wc745S1NBCbAL5V3sa6/61/1C +YLT4mPYORlR4AgzvpNOJiI3T +-----END PRIVATE KEY-----\0"; + +pub const PEM_SELF_SIGNED_CERT_SUBJECT: &'static str = "CN=mbedtls.example"; + +pub const PEM_SELF_SIGNED_CERT: &'static [u8] = b"-----BEGIN CERTIFICATE----- +MIIDCTCCAfGgAwIBAgIJALWh9vlifeRuMA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV +BAMTD21iZWR0bHMuZXhhbXBsZTAgFw0xODExMjMwNTQ5MTBaGA8yMTAwMDEwMTA1 +NDkxMFowGjEYMBYGA1UEAxMPbWJlZHRscy5leGFtcGxlMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAxYwIJgiVJigEPzgINDAYdxNvpeWrEh3QTZk5tIK9 +75p5hXFKpSKVBtwRnfOaNHPV+ap8QSiWn0yS7tsUao8dUzJQXbVaT9Al8uaj2MLz +vFFiBsq7J4svBn6Q41xpFBW5vdQsNXP5Qg+0depSxyvuzaavaMaZNynzB4r0KKxX +d9W8qNFcWb/7BWFYgmw7TmJjIn0F/6pKrG75MUrj5Jc6cQMRfNuJrSjEYpsBkG2e +LWy5QBTboDtNnldB6vMR8X25ja25UqiMuvP1HY4OGPX3hYvDVX2IP67BY7i/hb/9 +3SwQYWjH38lfSdHlC14FcOWVzWkICm+rEgUKolNy37Rw0wIDAQABo1AwTjAdBgNV +HQ4EFgQUbkS8taBrhQDq7t19qFfRzi8q86kwHwYDVR0jBBgwFoAUbkS8taBrhQDq +7t19qFfRzi8q86kwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAD8JW +PJrqtwaTtmmpFv8Xn8K2Tq7BBKg7ANtEs9Ca2SstR9J0idH8YYq69+CHbihO0cVS +QYgkos9FA7NU8eV8twNBBrgSS30ZkIVRCZn72476lHQTWnctqHTqkNmypt5Bdosr +yC9+dy8UCm9UhjW100vu0Oi++/7LU3GOcEuFX65pz4cjFFRLCKmA0mvSiBV4UwWu +HYDzyrZMYYcIpPBj9S7gvoQDeHrpw7yfA5Of+60cZZjwPY9Ebud5ETWnkFqqcShE +PVTB987Vm6hLu5/oHF+JVW05ZdXID1BZvukBYXnwY9OHvU7fin8N/eT/SBTd2HxO +d1SSYr2U5pj0tNqaDQ== +-----END CERTIFICATE-----\0"; + +// This is PEM_SELF_SIGNED_CERT with a change in the second-to-last +// byte of the signature from 0x9a to 0x9b. +pub const PEM_SELF_SIGNED_CERT_INVALID_SIG: &'static [u8] = b"-----BEGIN CERTIFICATE----- +MIIDCTCCAfGgAwIBAgIJALWh9vlifeRuMA0GCSqGSIb3DQEBCwUAMBoxGDAWBgNV +BAMTD21iZWR0bHMuZXhhbXBsZTAgFw0xODExMjMwNTQ5MTBaGA8yMTAwMDEwMTA1 +NDkxMFowGjEYMBYGA1UEAxMPbWJlZHRscy5leGFtcGxlMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAxYwIJgiVJigEPzgINDAYdxNvpeWrEh3QTZk5tIK9 +75p5hXFKpSKVBtwRnfOaNHPV+ap8QSiWn0yS7tsUao8dUzJQXbVaT9Al8uaj2MLz +vFFiBsq7J4svBn6Q41xpFBW5vdQsNXP5Qg+0depSxyvuzaavaMaZNynzB4r0KKxX +d9W8qNFcWb/7BWFYgmw7TmJjIn0F/6pKrG75MUrj5Jc6cQMRfNuJrSjEYpsBkG2e +LWy5QBTboDtNnldB6vMR8X25ja25UqiMuvP1HY4OGPX3hYvDVX2IP67BY7i/hb/9 +3SwQYWjH38lfSdHlC14FcOWVzWkICm+rEgUKolNy37Rw0wIDAQABo1AwTjAdBgNV +HQ4EFgQUbkS8taBrhQDq7t19qFfRzi8q86kwHwYDVR0jBBgwFoAUbkS8taBrhQDq +7t19qFfRzi8q86kwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAD8JW +PJrqtwaTtmmpFv8Xn8K2Tq7BBKg7ANtEs9Ca2SstR9J0idH8YYq69+CHbihO0cVS +QYgkos9FA7NU8eV8twNBBrgSS30ZkIVRCZn72476lHQTWnctqHTqkNmypt5Bdosr +yC9+dy8UCm9UhjW100vu0Oi++/7LU3GOcEuFX65pz4cjFFRLCKmA0mvSiBV4UwWu +HYDzyrZMYYcIpPBj9S7gvoQDeHrpw7yfA5Of+60cZZjwPY9Ebud5ETWnkFqqcShE +PVTB987Vm6hLu5/oHF+JVW05ZdXID1BZvukBYXnwY9OHvU7fin8N/eT/SBTd2HxO +d1SSYr2U5pj0tNqbDQ== +-----END CERTIFICATE-----\0"; + +pub const PEM_KEY: &'static str = concat!(include_str!("./keys/user.key"),"\0"); +pub const PEM_CERT_SUBJECT: &'static str = "CN=mbedtls.example"; +pub const PEM_CERT: &'static str = concat!(include_str!("./keys/user.crt"),"\0"); + +pub const ROOT_CA_CERT_SUBJECT: &'static str = "CN=RootCA"; +pub const ROOT_CA_CERT: &'static str = concat!(include_str!("./keys/ca.crt"),"\0"); +pub const ROOT_CA_KEY: &'static str = concat!(include_str!("./keys/ca.key"),"\0"); + +pub const EXPIRED_CERT_SUBJECT: &'static str = "CN=ExpiredNode"; +pub const EXPIRED_CERT: &'static str = concat!(include_str!("./keys/expired.crt"),"\0"); +pub const EXPIRED_KEY: &'static str = concat!(include_str!("./keys/expired.key"),"\0"); diff --git a/sgx-ra/src/support/keys/ca.crt b/sgx-ra/src/support/keys/ca.crt new file mode 100644 index 000000000..646b1c77d --- /dev/null +++ b/sgx-ra/src/support/keys/ca.crt @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIIE9zCCAt+gAwIBAgIJAO9k749HB1DfMA0GCSqGSIb3DQEBCwUAMBExDzANBgNV +BAMMBlJvb3RDQTAgFw0yMTAzMTIwOTMzMTZaGA8yMTIxMDIxNjA5MzMxNlowETEP +MA0GA1UEAwwGUm9vdENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +6qb82RrPv8ekB0dtIxpXrWo8Co+1UCNaTwLDwKBCDEhabqMLIsVHZ+dI+noTK+Uf +HKDUAECAddEvFjfAAyC/bicRxpaVeg0Z1sQt0UFUbG3pa9JV8hfQ3lppZSBEV/MT +qAl3jrX6Sfl9JYZdb6yBoHuMGVKNnXEYKDSXpgYjcmdQAtqSfMIJ8Bo1t6CoCDQQ +X8EtseMKsKmHffc0ijvGbjM2g/H28h2haZ10SQqLhLtV1MUD4Gj85CTjneq42VXT +IsPBBG12fPJlbMSqXT7eeeVJVtUG+u74bdYM5UsqxRtwHgg6WQBFoUdu8rAcSPOd +8XFfLbcx4PSJ2mxIDIycgB0KHlS00qFoLFk3t8hBXdrzPp8hWFQNAlduPnZqkxKH +QQsPYE6GtwFZWHuzf4ayD4z+lZfOXRU5PmXR0voFcHjMi6/SD//oBCKDIb66eBXy +TXgsaO5KvQ8D6RDaFHFG6dDD6Dwct2lXgKCJax7qV5Xc+jPeexg/Elz4iZiHE9ew +AUwgqmCPgvRxM13uF10K1sxDi5fs/DdVz0TWVpG6ppfe3xf5AokjdbR5t9LDjkGp +NX+qP9cZD350vzngFqja1S9aB7twR/bavopZg5kwkSH2mSFlf/Ket4dt44Mz4gql +qW8VAg/6B/HuSHMPso8IxcXXZ0dp6crb2z1C+vOttqMCAwEAAaNQME4wHQYDVR0O +BBYEFCyVVVBz4V11aVOadRLxpvp6I40MMB8GA1UdIwQYMBaAFCyVVVBz4V11aVOa +dRLxpvp6I40MMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAKFGpC+y +cG3DctQgweadtkb3RAGwgmlVNf+B2rjt9bVOObFV23dwREhQALCgowAdVqmzRzjs +UbNARWLeYZY1Nk4h8so3qmZp+5zGl9kV7//qPxI+qXhW6pTEoMfQvWx7oFHrfJCx +2CE5Sf/QZhgVfgbRP+k+D58kNgoOwYaAwo6ddHQGkwbULInqJu/+QJGHNgdygpvM +wePy0FgdT6qFxVIeLJ5ZhsGV/om7twOfIesK3JVp9f8QesJw2kYdj4rcH+Io8jzR +reybz9GkinK+iMtGTeL2wLDAYsQu7RAoR8i1h/9KbwWPN22fVdSyYii0RRisMcha +LHRrvJrDRo0QMqWNmlzA5jO/N5n6/fES0zMbuizhUl2HuOYZaJlZ6fx58Js8oW/D +XCoYGa3TCKswkb22gOxaOZmo7zCGG3KvJihwriAelXlbJnDodG7e8x9PSIn+pu1T +HmjMVK8ZH/x20hnLzU2qlE+62paxAd2jfOQ5B43oXSwYA0PaZR51RdjvEW8LZb7P +GT+uxL0JlGDmlw654qKU0P08chlW3W5hSCJqyyk7JY8kzVrtcJ9Lwz1her+GUfo8 +Xf5ze3YdPEzl7NS8Opnw2vfHQpu4nbnVrlPQuoKvU/5eNONDuzHTskGhUfjN1NSU +rMpW5s8dGCGaX+QVffSPcyoqqLK9pLa5lDqi +-----END CERTIFICATE----- diff --git a/sgx-ra/src/support/keys/ca.key b/sgx-ra/src/support/keys/ca.key new file mode 100644 index 000000000..cbc1af825 --- /dev/null +++ b/sgx-ra/src/support/keys/ca.key @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIJJwIBAAKCAgEA6qb82RrPv8ekB0dtIxpXrWo8Co+1UCNaTwLDwKBCDEhabqML +IsVHZ+dI+noTK+UfHKDUAECAddEvFjfAAyC/bicRxpaVeg0Z1sQt0UFUbG3pa9JV +8hfQ3lppZSBEV/MTqAl3jrX6Sfl9JYZdb6yBoHuMGVKNnXEYKDSXpgYjcmdQAtqS +fMIJ8Bo1t6CoCDQQX8EtseMKsKmHffc0ijvGbjM2g/H28h2haZ10SQqLhLtV1MUD +4Gj85CTjneq42VXTIsPBBG12fPJlbMSqXT7eeeVJVtUG+u74bdYM5UsqxRtwHgg6 +WQBFoUdu8rAcSPOd8XFfLbcx4PSJ2mxIDIycgB0KHlS00qFoLFk3t8hBXdrzPp8h +WFQNAlduPnZqkxKHQQsPYE6GtwFZWHuzf4ayD4z+lZfOXRU5PmXR0voFcHjMi6/S +D//oBCKDIb66eBXyTXgsaO5KvQ8D6RDaFHFG6dDD6Dwct2lXgKCJax7qV5Xc+jPe +exg/Elz4iZiHE9ewAUwgqmCPgvRxM13uF10K1sxDi5fs/DdVz0TWVpG6ppfe3xf5 +AokjdbR5t9LDjkGpNX+qP9cZD350vzngFqja1S9aB7twR/bavopZg5kwkSH2mSFl +f/Ket4dt44Mz4gqlqW8VAg/6B/HuSHMPso8IxcXXZ0dp6crb2z1C+vOttqMCAwEA +AQKCAgBKR7Y+27fsE7ye+UNZG1up77k19qwExEwwOsXQ0mpWDQljgIVj6mNiRtrZ +P4+WE5+3pkm2ErUXlrJ7LAbCdrlim0eLP9vtmPwW+l8uoKmi8WA0246NZnCeEqzO +cFpyJOaSCP0p1f13MV0mZdRqJ4eZT8LXuURPFJ/7Cjr/OW47Ju0zGhHJIHuY4BMl +H9xRTHnqdfKLHz4hEmlrvLeLEsUL2XZmalAr8KlKD6fh/06PI+ZVxlAl19ZGOk87 +jDQbyIlftewCBMy/XNQyjEcJ4X73w1dl/2WIReGqk1nds9/EKZ1iRGSEDAv+s+gx +NwKdLVFQPv1MMXO+rGp/FEvyfQiFAnq05ts/EF381UOOU+4DgTLGY4kYCPj0nwAf +Eicj40/UAYaTVCC6LFqlk2E3kRxGBbqOHdarvgyExclzbWvjMYjsQYZJ3Cq3f8L5 +u+V9Qgp9LKCUOCTISk/1rePYz5Gt++oLJl8PnDq6HLdWuoM65gsF0CZ6xC6Lkygi +F4+PG7k93GqDAUXB2WEihL897uteUGbTqqDP0dAOiCQOVD5lKAikMgxhBePYOOdl +e3Ss740X+Qmu985BvzrShuIq1GjJGKvHA7xUxPxBGq64h+XmLKjQM+mJlyBKB4gx +UvxYt8TyXkMx87TZog35kUs078wmyqbM7wOCGyOwG92f0UjXoQKCAQEA+R50M3HL +wBkDwQJqwtdynXwhG1SXQsXpKigbVX7XdeI0bO1EkI+y/MQKV57tDZvkYC2kXcX1 +hGXzmeqf2JoRJTPIVBxPg662Q5OovySyOh8DxHJpFrEjeBdSDYKCLmPoEMZbITvz +0MYPxZdL1OgPQTfOFzQEmNOZs5GmwWSh1woSfZLdcPpBegKBRx9Nsy1WxyMyoKPA +1zuKZEpeEQq1ZbZ7cFbyceRt7SRPf+V3qwSbTBihHCLQqGvkdC3mZn21PvaO4FO5 +OQfx/sAbrFiMqruGZRU6QhZRXy6BDRiB+AowPYDCjk43PXwrC7hvn12iD0DjJAW7 +Z7zSutFiMVUUawKCAQEA8SI9DVf7EDyPZMvNHSay9LtCp1Hntvafp99SXJfYzVc+ +TjB2Fblvze7LN1IPyo4yD4O44O4mmbs+huvZYqGJQ5per2p8tbhIu0rd7TVcVctZ +zdDXlMFzsW1EyHAkt2R0wuCpwLJXm4A12oIiOlAz7gEa5VsId/NPYG2oVEOB7fx2 +0c6XXAPhQ4IrREUw/pLg/QrG3sxS3M827kk0/QNwr0j87i89pVCswGdFSwR8EUys +4dWvl7qsvXJjDktgn7TK04cKAHWrOuLjj0dU8GRxUec594wmldTEiJ4969T+PeyE +4HaOWKTdIdR3l2gp/2A65upVLO/UE7reXM+Ueni0qQKCAQBIFvT/ch3JIDQC5YUp +jxk+043tD8SZ8RWxOlv2mLcXCPes0dh2kO710HFBu97TglpLLsoSzNdokew1jTzm +fGcbwell1a945tUdpxw8/AyLXzBC5+zbQTWHahA3kp3DeOvN9uimLGg48SfdQRQT +r3fCoriD5Gy0IP+ohCyiaFGhHewN5LMqH3FVMmZgw4FDqYokJF5hOCH05uj8brzb +56Jopa8A6lhMdxMMfeZ3l1rS5YlfMv1kW/rP0jERIbs7y4Lojob4CaJfC5qO4t7f +N9y1B4EzvTnXqAeyKI310TLDKYeeNKWYcq/vngAC60N59amRCnDwmqwJsA23PCJT +LlCzAoIBABFTeXmM+dA32cHPVwSiNDebgPWO0Ax4eg5Q4JUgoAZZH3P0zXdQJLVy +VA28ir/uKbCtsUoQMpvXNW3yYmNQ4hEGdYk7KIzSGf/DKGET9XeArgo42FSq9coo +5MlWLX0z7aPXCrt61QqqUrRJp3XzL1gJokoamWgtBmYSWwb69soH2u3GX1/QM45r +Ovqj0hpoqVvlO1bk7YtKJFNI1VLcvWsK3omqwU4wlskYYoU6ZEPF86IifYR0eFcA +chej2OSA1BYQ3Oodilkn1lwELxk6zl2pNKQR4O/hIuICJMbePgprBT0vp5i899qn +bpRleqcL3g+bhNU+wklMow+eJrgKFkkCggEAa4/qlP/AdH3E+Y6UiMD8GnFs1RqH +NqtZnsGYjQIYt90tpY2uK7OnyBvkwbP62DtJHAsfC+efByiVlca1op1JFvhyfXom +Yt/NpTjVxC2gSIQd1jxsGsOWCmiOBKsjbAEnccEfy8II9EdZysuIGNyQW10g735P +jq6SuEPqWexm8RvzXizb2+WpPW54QWYQ8OQu9g6pjVNMwy9Q7pk5FWYKoI3ZK6go +FlA+BzOedBD8G/chlqdHPIUnstz6j9UFnqaNaUGbdrJDLOrJORlUZpAs6f2xSNaf +8wwlyv72eFVhgy2L/FaYf/tYjQU6fLuw2muo7OZS+eqoNbhDcxkLyZF7fg== +-----END RSA PRIVATE KEY----- diff --git a/sgx-ra/src/support/keys/ca.srl b/sgx-ra/src/support/keys/ca.srl new file mode 100644 index 000000000..1578454c4 --- /dev/null +++ b/sgx-ra/src/support/keys/ca.srl @@ -0,0 +1 @@ +DBA0C754CAAE4F83 diff --git a/sgx-ra/src/support/keys/expired.crt b/sgx-ra/src/support/keys/expired.crt new file mode 100644 index 000000000..8f2fc8c9d --- /dev/null +++ b/sgx-ra/src/support/keys/expired.crt @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE----- +MIIEozCCAosCCQDboMdUyq5PgzANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZS +b290Q0EwHhcNMDgxMjI0MDgxNTQyWhcNMDgxMjI1MDgxNTQyWjAWMRQwEgYDVQQD +DAtFeHBpcmVkTm9kZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOsP +3bBKNfOAAlfStB3cDGCUOPzl/VdFX7LhdufQE7HTTsseEBypOmt3JoF/ptNJAI1p +Q6ROugUSXUHn1i3NH0GDGTvo/RGAQ7vCT8bfV3xArlkotIWS4Pj7KNSQ8ZgTrxpn +DIXvwRx0qDQHEVjT1VCwvq27ybZ7JihtTxl2FUXkf4FshqjScJ8Zwd3IY8I2GFIz +xowJ46yneSNYiusbDTvNXQO4pvbzB3EwpKg3P1Isy+xFJR9+DC+q+UQh9z7A7I3T +CYKbtBnbD+LQnYLEMV5oaD3T5MhPilaoV7HnkwTQL1m/Mps0tUaWmiFvHdg3bWO4 ++HFVrStUklifzx4toZI25+j4uwNlrfP35e+nHFmjHgAPNfsJ6yC4nxh16ohLQCF+ +VCZQQ31axxXuEWFGMUTIwdgXU5+4/5U4TpGxD6tBxSEDZV073J5aQdnewX04oDic +KwnkaiSF9xBp5sQ/tMRwu+yKc+KbQXQkpgWvL4YUaxDeF/6/6Vi2P+Cn71lJBZ/I +8e5X0/uqzhnH5pdAXebdlrrZQ0eg7/dQv28kTT+XW2s3k7Z0uuRZjKLrTyjdlGeb +jsxIYJwBCNs+1JnYO49tTWzImkaN6P65CnGP/8jQ7TpkzQJkgDw65K7NZFyP2/D+ +YU4JE489JZUeoKlThk3NmHIMsux8mEowNtleRCKrAgMBAAEwDQYJKoZIhvcNAQEL +BQADggIBALY6Zq91Zgouhi2wlqtBK/JeapMvB2tm8R3YtcpOYxvVtX7BWFDlhV3l +Q5PTtFwCwjyCtHP6Bm/AxrT/KAXp2XB7y9slOcosS7snP3Nw3yqnuUW2G6yToAL1 +QqAqve0HoU4Snjs00ork4tAlzSiXPvaWzFN5or+NT/9ibwG4KnM+BI8llg8mudDb +tbXIJ1jWmHlL2dKgbwa5QgrF93N0zwTtVPV9SH48F5jNRLBxevH8DyVadFysDEaY +yUSD4jt7Eysu9kY+pICVZyDXxbrvK/n2L2dIu7VYSnUaWPEy7o6JlaAD2R1axLis +dWDivAZhN1pK3xwzLGC2RwVXIVpyT8JhCx7+owgZozQZXv4aMVfi6xRqrs6JU1UC +63QT/4dSaiGwa2WHsFgFg1QOLR4imA24H3jNwBEVu+M+xwdVqruzisSGI0qElx17 +487meRPBBTPRjnPG5JpaFPHIwAR2Jagr3kOjRKHT0U5T3pljftvTJFV2sfICOCZw +KZ6D8Gbl+3+rQQY0ruOkLT5N5psXI4+QZ8KwV3rMPWZ+VYJO5XsNjbq4S9JScB6q +sVD3sOaGDDJucXSAFjHRZFweau14Ai/Sq8dCOjCWH9+eGKMutow7g7dhuwpiJF+g +V6rqZaPn9tvoL0ITu06BOT1XQ6SB81lct+EGMwTE8qj5WFWyiNpD +-----END CERTIFICATE----- diff --git a/sgx-ra/src/support/keys/expired.key b/sgx-ra/src/support/keys/expired.key new file mode 100644 index 000000000..7114cc35b --- /dev/null +++ b/sgx-ra/src/support/keys/expired.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDrD92wSjXzgAJX +0rQd3AxglDj85f1XRV+y4Xbn0BOx007LHhAcqTprdyaBf6bTSQCNaUOkTroFEl1B +59YtzR9Bgxk76P0RgEO7wk/G31d8QK5ZKLSFkuD4+yjUkPGYE68aZwyF78EcdKg0 +BxFY09VQsL6tu8m2eyYobU8ZdhVF5H+BbIao0nCfGcHdyGPCNhhSM8aMCeOsp3kj +WIrrGw07zV0DuKb28wdxMKSoNz9SLMvsRSUffgwvqvlEIfc+wOyN0wmCm7QZ2w/i +0J2CxDFeaGg90+TIT4pWqFex55ME0C9ZvzKbNLVGlpohbx3YN21juPhxVa0rVJJY +n88eLaGSNufo+LsDZa3z9+XvpxxZox4ADzX7CesguJ8YdeqIS0AhflQmUEN9WscV +7hFhRjFEyMHYF1OfuP+VOE6RsQ+rQcUhA2VdO9yeWkHZ3sF9OKA4nCsJ5GokhfcQ +aebEP7TEcLvsinPim0F0JKYFry+GFGsQ3hf+v+lYtj/gp+9ZSQWfyPHuV9P7qs4Z +x+aXQF3m3Za62UNHoO/3UL9vJE0/l1trN5O2dLrkWYyi608o3ZRnm47MSGCcAQjb +PtSZ2DuPbU1syJpGjej+uQpxj//I0O06ZM0CZIA8OuSuzWRcj9vw/mFOCROPPSWV +HqCpU4ZNzZhyDLLsfJhKMDbZXkQiqwIDAQABAoICAAO+mPV5+SoL2/2yKZRgMQJI +2i+NKl/9huy+krpWojmu+A5cSD1spLWZjE97zRiIjS2zg5RWfLgf9sRaARtxrRHK +GNjPeViSBoIzMjokzKv6C8z3zQhjspnExn28YVze02dERPrNOvJNGXDau/gCR9+l +MSRrXWc+xvjV5PCu5N/cJ/vT0sFVuN2P93qk+pHZcsG8eWk5rxrNAC0D+BKOt8NA +Hj807dP5QyEWeUkEuEmC1SzKXTEHPQJ1YssnD108jYgk2H3wJQpUZwhh8mBm57Jt +T1vMyFQ4kCeZPuximAD3oAl59kBqsoiRVZs6ver31xJDnBGSH9QU4M/wm8gLSguW +aic+H9o88wgI/AgiVWLerQ2zpOACGP5WZATaAwyKvuS051S4aopluec9aOfp7xig +6Yij1i/iiN2KTVH1XKpVcbFEvi0Qd8hCcNODJKqOIFJK1FQ8jH9lCfHy5+h3T91j +wNY044gz57vlova9cntUEiSOnvUGz/9pc2MbZjZ9aYHH2lFwJlYvLUvMFKFHCnl/ +Hk48YF3Pp37wzPXS7XJhdYZLM79eQGX00Y/q8juzp50n0we5YGFwsxDK0qaQacRg +7k/C1FTKbenKizIXPGhGq45pmcml8Vm0da+rEKPwhl60BnOtlwr2zO/qB/Isji8W +N5kwBGmvPi9RUTFWt1whAoIBAQD+mBithjhrbOp1lRyMtVa4foi2l/yC1Yh6W5Ce +JtnBB4H1u1cIezjonZNYHgIC28H63KOn2ZJbJIdTziJKpno/NlxojqPEol8hCNws +Yti0RyDIsR02DlzyjoCTiNECUVGch3Fk8AXZPWME5YUWGCTJY2kfLvMgJ00LFhFz +5V9En9WlUW/op/sBEOunFaSZW7ZuMqFo7xjBRCFXq1R/GL1OS9SQamOsHH37FJQe +/+A+gbeo/f6L3pB3cmsqTH0jI7uwHih2hE+62lDLTZb+pbAACH0Wb4bL2s1ydQy9 +bdO04jKYY08Gi0wrhvU0uYVO4bkLIWUWBUgUg92IN3p5OZ49AoIBAQDsXCiAZMPq +P9Cdw08XFkmFnWlxfLsZ9xT2FZ3ne3Q66U8ne/eOlY3xmRbciR3UvdUxaTztT/G5 +3vWTXwXKy1mwKRN0uNslnCcjYLoGrayo6ie6T/oyl5/3IDpLnODLh5FUJkTG7YaU +6aHz5LOARUoblrRPNp5RChUfMoANdmMPMAqKl1mJtbqm7IMfuwlK3r8/YNMkKnOH +Eys7zNb+pAEVGXUgSQ+YnV45UKS+DOr6dY3BelrgxgNtBOhCxJWUpN/UELDqGATc +M+W5gtQWIk79EpLYnWv4CJWSo5YbqE+uRXU6jUWezMj+Bui/wsyZpKs4fRTnkr3+ +LkeBnpjJZ/sHAoIBACQE8LjcHG9WYXVxOzDNFw/TFxR+PENmYoCtI7C8XmJo5YIW +lyGkDVEbuhTlafNtk+wh+yVsKsCqUlsQ9tkI5JK85iYEyDaxojPSRRQih/Y5efHq +3O8g6RWIA7jbynZBewJiRzC4pJsvjCrNLh8KG2pCnkTDJ7KM3OGMpbt34BqdYmSZ +OPP5kBF+i1iAP2FTEGRW1W87JI1zTiRRIQs6PM4u/EvSQXfAMDKtnqckHF27jHhk +Nvci7d14WqEJYUrva0ZnfeIGpiERcgzRVWOBnXzjto7OCIwe0KI43SyPtTwKJI5a +vnt2ibg+x8JF3Q5j8QIaH2sWJDSC03zKHJG6DSECggEAIIbyP/EeEQ+lKwDk0n2L +sqqeBzMuIH2jUdZZu7B+p1jSPtHNmL62IQh7X/AyvcM+IqWj79ivoG+xhg1uo6Dm +f9q3Rbnm1r8tl63JDAA8oaZPv1EgUnQRXJX/z8YQHZJTiqwVjPbFLZsVYZYYqc9f +Snqr57bRhL+JdpihjLi9Gyr2WGpJtSzgOfaUePppZfdPhG5TwEdjTLRzn7Ap6jMx +vvCY8M99KPiHLgYOFeV7NOqWjojDFunJMOia+g1JtIIYF3wQjLavfIpb0/LQMxeX +nTZAJTVM1X6A7wQ6NSYtiQMgBeXJLfhqtKLIxxMMyxwhQA3eoZvNL7y4tHrZ9eWs +YwKCAQEAsnVxiwa++56roRF0IOOQS85KMuQHEIJrbiS8gBpTJdy4KGK3nZinIRxE +4l1X9eZunGtOjP+tJA6eTLBdJBZGafIqhETstJeylbcEjCE0oz24zbksG3HM0jgd +UmnyAO5yl2Fy1lEoNYKkymcoCcu2UgQweTqnjqvpx1YI8OE/cN0ixe8+Q25f2pkB +nWQ4bugQwSHPxl+A2AEPgx9PlEhs4vwQ7bvstH0u8SeBMfKohTnGbxBB6lVc0ECa +vrIambdMv29AorxHVsThgHAbF025IVDSXiMfnhlW9lopta/OEx2GcFm2xX+ifgux +UBmxY3SiqIOwAQCFsNnlqz3CG1VMkg== +-----END PRIVATE KEY----- diff --git a/sgx-ra/src/support/keys/roots.pem b/sgx-ra/src/support/keys/roots.pem new file mode 100644 index 000000000..f5f842c5a --- /dev/null +++ b/sgx-ra/src/support/keys/roots.pem @@ -0,0 +1,1130 @@ +# Operating CA: DigiCert +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Operating CA: DigiCert +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Operating CA: DigiCert +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Operating CA: DigiCert +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Operating CA: DigiCert +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Operating CA: DigiCert +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Operating CA: DigiCert +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Operating CA: DigiCert +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Operating CA: DigiCert +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Operating CA: Entrust Datacard +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Operating CA: Entrust Datacard +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Operating CA: Entrust Datacard +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Operating CA: Entrust Datacard +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Operating CA: Entrust Datacard +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Operating CA: Entrust Datacard +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Operating CA: Entrust Datacard +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Operating CA: Entrust Datacard +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Operating CA: GlobalSign +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Operating CA: GlobalSign +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Operating CA: GlobalSign +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Operating CA: GlobalSign +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Note: "GlobalSign Root CA - R7" not added on purpose. It is P-521. + +# Operating CA: GoDaddy +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Operating CA: GoDaddy +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Operating CA: GoDaddy +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Operating CA: GoDaddy +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Operating CA: Sectigo +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Operating CA: Sectigo +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Operating CA: Sectigo +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Operating CA: Sectigo +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Operating CA: Sectigo +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Operating CA: Sectigo +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Operating CA: Google Trust Services LLC +# Subject: C = US, O = Google Trust Services LLC, CN = GTS Root R1 +# Issuer: C = US, O = Google Trust Services LLC, CN = GTS Root R1 +# Label: "GTS Root R1" +# Serial: 0203E5936F31B01349886BA217 +# MD5 Fingerprint: 05:FE:D0:BF:71:A8:A3:76:63:DA:01:E0:D8:52:DC:40 +# SHA1 Fingerprint: E5:8C:1C:C4:91:3B:38:63:4B:E9:10:6E:E3:AD:8E:6B:9D:D9:81:4A +# SHA256 Fingerprint: D9:47:43:2A:BD:E7:B7:FA:90:FC:2E:6B:59:10:1B:12:80:E0:E1:C7:E4:E4:0F:A3:C6:88:7F:FF:57:A7:F4:CF +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo +27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w +Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw +TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl +qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH +szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 +Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk +MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 +wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p +aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN +VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb +C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy +h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 +7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J +ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef +MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ +Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT +6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ +0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm +2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb +bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c +-----END CERTIFICATE----- + +# Operating CA: Google Trust Services LLC +# Subject: C = US, O = Google Trust Services LLC, CN = GTS Root R2 +# Issuer: C = US, O = Google Trust Services LLC, CN = GTS Root R2 +# Label: "GTS Root R2" +# Serial: 0203E5AEC58D04251AAB1125AA +# MD5 Fingerprint=1E:39:C0:53:E6:1E:29:82:0B:CA:52:55:36:5D:57:DC +# SHA1 Fingerprint=9A:44:49:76:32:DB:DE:FA:D0:BC:FB:5A:7B:17:BD:9E:56:09:24:94 +# SHA256 Fingerprint=8D:25:CD:97:22:9D:BF:70:35:6B:DA:4E:B3:CC:73:40:31:E2:4C:F0:0F:AF:CF:D3:2D:C7:6E:B5:84:1C:7E:A8 +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3LvCvpt +nfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY +6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAu +MC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7k +RXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWg +f9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1mKPV ++3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K8Yzo +dDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW +Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKa +G73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCq +gc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwID +AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBAB/Kzt3H +vqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyC +B19m3H0Q/gxhswWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2u +NmSRXbBoGOqKYcl3qJfEycel/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMg +yALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVnjWQye+mew4K6Ki3pHrTgSAai/Gev +HyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y59PYjJbigapordwj6 +xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M7YNR +TOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924Sg +JPFI/2R80L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV +7LXTWtiBmelDGDfrs7vRWGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl +6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjWHYbL +-----END CERTIFICATE----- + +# Operating CA: Google Trust Services LLC +# Subject: C = US, O = Google Trust Services LLC, CN = GTS Root R3 +# Issuer: C = US, O = Google Trust Services LLC, CN = GTS Root R3 +# Label: "GTS Root R3" +# Serial: 0203E5B882EB20F825276D3D66 +# MD5 Fingerprint: 3E:E7:9D:58:02:94:46:51:94:E5:E0:22:4A:8B:E7:73 +# SHA1 Fingerprint: ED:E5:71:80:2B:C8:92:B9:5B:83:3C:D2:32:68:3F:09:CD:A0:1E:46 +# SHA256 Fingerprint: 34:D8:A7:3E:E2:08:D9:BC:DB:0D:95:65:20:93:4B:4E:40:E6:94:82:59:6E:8B:6F:73:C8:42:6B:01:0A:6F:48 +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G +jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 +4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 +VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm +ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X +-----END CERTIFICATE----- + +# Operating CA: Google Trust Services LLC +# Subject: C = US, O = Google Trust Services LLC, CN = GTS Root R4 +# Issuer: C = US, O = Google Trust Services LLC, CN = GTS Root R4 +# Label: "GTS Root R4" +# Serial: 0203E5C068EF631A9C72905052 +# MD5 Fingerprint=43:96:83:77:19:4D:76:B3:9D:65:52:E4:1D:22:A5:E8 +# SHA1 Fingerprint=77:D3:03:67:B5:E0:0C:15:F6:0C:38:61:DF:7C:E1:3B:92:46:4D:47 +# SHA256 Fingerprint=34:9D:FA:40:58:C5:E2:63:12:3B:39:8A:E7:95:57:3C:4E:13:13:C8:3F:E6:8F:93:55:6C:D5:E8:03:1B:3C:7D +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD +VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG +A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw +WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz +IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi +QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR +HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D +9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 +p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +# Operating CA: Google Trust Services LLC +# Subject: OU = GlobalSign ECC Root CA - R4, O = GlobalSign, CN = GlobalSign +# Issuer: OU = GlobalSign ECC Root CA - R4, O = GlobalSign, CN = GlobalSign +# Label: "GlobalSign R4" +# Serial: 0203E57EF53F93FDA50921B2A6 +# MD5 Fingerprint: 26:29:F8:6D:E1:88:BF:A2:65:7F:AA:C4:CD:0F:7F:FC +# SHA1 Fingerprint: 6B:A0:B0:98:E1:71:EF:5A:AD:FE:48:15:80:77:10:F4:BD:6F:0B:28 +# SHA256 Fingerprint: B0:85:D7:0B:96:4F:19:1A:73:E4:AF:0D:54:AE:7A:0E:07:AA:FD:AF:9B:71:DD:08:62:13:8A:B7:32:5A:24:A2 +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD +VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw +MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g +UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT +BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx +uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV +HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ ++wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 +bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- diff --git a/sgx-ra/src/support/keys/script.sh b/sgx-ra/src/support/keys/script.sh new file mode 100755 index 000000000..1f921a3fc --- /dev/null +++ b/sgx-ra/src/support/keys/script.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -x +openssl genrsa -out ca.key 4096 +openssl req -new -key ca.key -x509 -out ca.crt -days 36500 -subj "/CN=RootCA" +openssl req -new -nodes -newkey rsa:4096 -keyout user.key -out user.req -batch -subj "/CN=mbedtls.example" +openssl x509 -req -in user.req -CA ca.crt -CAkey ca.key -CAcreateserial -out user.crt -days 36500 -sha256 + +faketime '2008-12-24 08:15:42' openssl req -new -nodes -newkey rsa:4096 -keyout expired.key -out expired.req -batch -subj "/CN=ExpiredNode" +faketime '2008-12-24 08:15:42' openssl x509 -req -in expired.req -CA ca.crt -CAkey ca.key -CAcreateserial -out expired.crt -days 1 -sha256 +rm -f *.req \ No newline at end of file diff --git a/sgx-ra/src/support/keys/user.crt b/sgx-ra/src/support/keys/user.crt new file mode 100644 index 000000000..499087683 --- /dev/null +++ b/sgx-ra/src/support/keys/user.crt @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE----- +MIIEqTCCApECCQDboMdUyq5PgjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZS +b290Q0EwIBcNMjEwMzEyMDkzMzE2WhgPMjEyMTAyMTYwOTMzMTZaMBoxGDAWBgNV +BAMMD21iZWR0bHMuZXhhbXBsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAKwJrS9Wm5z09C20Fe1e6+es7Js8x1CkSuvBcUIWSfDOJr4eobrHyClsb4Xk +qrZ/l4XkRVyQcLU4li28fule78OItPcUU1CBTsKWtFfUm7qlm9FHmBTyXuvR04mf +zEin5CEfAs5GwJlpeu+ivPfxLwg8ef1Jlc9E8AKtvmN6PAei8/A6qjEcQAZY0dt4 +E+8Hvf5SVDX9hDIXABnstBS8rnInYi0161rv3lcY0/Mw9DttJIcinBGJvRdXjSeF +QsOH2v7VHyrJzx+AYTnOsU46fgyWLn8Ceb0CFPwRnnBW35y4qX6Nn8hy0xtOYYzC +YgVDHth/wzIg90seIZpcPAk49K1IKW5XlbjTEVpQ/Bhfke9iOYtj1jV0wzJNG+hZ +le4HDYciHVmwd8kxfR9owV/4UBVhG6jtXUrVbCfSZ7XmpXDu+5rh6SoB1FJJIJOP +NVJBsSQUIcPo09AIs5/PRIpG1k+1A2buod2bqCs8D+4ZdD18QMwYLOPojmi8wrGR +Fc/W+qePtFFdqtLW9ww0o8O7NRdpawMt3P3S88I4zE26yuEU7e7xOIxZRnkrZL23 +70xgzOuNKXk63R7v4XG1bNbnQVPbw8QQxaIfaYtpk+sURYpsyJjE4wUzzQIaWcpL +/fM2n+b/gjtW2AqVRGycyVrwsNf9lXYlp74cad40uaScrCvjAgMBAAEwDQYJKoZI +hvcNAQELBQADggIBAJQiiRZvAUiKbytuo9WK03COqPVbai46Vx9WOQX5EB/DSamm +NHYWNEuX2ttWNWsHBGK2rAWPXrZDsUmMqis6ipXiGsmHyJyIy6xqK4Jg+Z0kQrli +6Yv5Q+LssEar9vTinuPrYAHA9LEe6FXduM2dbTNfKXCdS3u6z2RS/uXjrK3gviGC +ncuwqRapfLWWugHit5GQ9faNgNbYIRtH01xwP0i0WEyMfqsXPGc4ITsNFJghuB65 +AM0BBIpzU+Z9Wx/2Y8vpLcyQBq2tfhQj9kngdCzRaNTSZ9N9ONjQHDznMvqQALai +sfw62/1W7UPCuy68QN0KOIq6Nc+qI3NLPuCrM9+vY/60/sMGla9I3gzLx2nU7DLc +uSf6mX9IJlS2x5yP4afpPnF+vGXKRtC6JJo/BCfY5ciNqrZrHi4+Q9QapFOYU0Hz +lnpHtHes0ybR/TZt4DPFwPx9dT8AEcX/xk7RtmJtMii544snQE9pWwGydTTvZ0s8 +7qsShKIkDWDbu4g5fZOYh6b7vHFaYKN5nGj5wTDsEfsA/EcrJCMQBK2id0s7PF2L +7RmXnRidc9ZwOMUYc+y7pN2wUv1++AD8lF1NIPNNsseVHPXP7gluN1ZaYzgFQLZS +zpZI4jTI6WjY/be1LCWwPgyNVVsX0DYj5nyzNp3kpEMFGR8NNrIjH0HPBh6T +-----END CERTIFICATE----- diff --git a/sgx-ra/src/support/keys/user.key b/sgx-ra/src/support/keys/user.key new file mode 100644 index 000000000..ed4525cc0 --- /dev/null +++ b/sgx-ra/src/support/keys/user.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCsCa0vVpuc9PQt +tBXtXuvnrOybPMdQpErrwXFCFknwzia+HqG6x8gpbG+F5Kq2f5eF5EVckHC1OJYt +vH7pXu/DiLT3FFNQgU7ClrRX1Ju6pZvRR5gU8l7r0dOJn8xIp+QhHwLORsCZaXrv +orz38S8IPHn9SZXPRPACrb5jejwHovPwOqoxHEAGWNHbeBPvB73+UlQ1/YQyFwAZ +7LQUvK5yJ2ItNeta795XGNPzMPQ7bSSHIpwRib0XV40nhULDh9r+1R8qyc8fgGE5 +zrFOOn4Mli5/Anm9AhT8EZ5wVt+cuKl+jZ/IctMbTmGMwmIFQx7Yf8MyIPdLHiGa +XDwJOPStSCluV5W40xFaUPwYX5HvYjmLY9Y1dMMyTRvoWZXuBw2HIh1ZsHfJMX0f +aMFf+FAVYRuo7V1K1Wwn0me15qVw7vua4ekqAdRSSSCTjzVSQbEkFCHD6NPQCLOf +z0SKRtZPtQNm7qHdm6grPA/uGXQ9fEDMGCzj6I5ovMKxkRXP1vqnj7RRXarS1vcM +NKPDuzUXaWsDLdz90vPCOMxNusrhFO3u8TiMWUZ5K2S9t+9MYMzrjSl5Ot0e7+Fx +tWzW50FT28PEEMWiH2mLaZPrFEWKbMiYxOMFM80CGlnKS/3zNp/m/4I7VtgKlURs +nMla8LDX/ZV2Jae+HGneNLmknKwr4wIDAQABAoICABzSsjVQKVouoApYNaRDVvrF +ug54LFySagr9qeAMo+64Wz1XHHmSpzJpfHXOTdutnNFN4WEUwg1aoa6f+hNXWIxG +ByuuOBcw0uU/Io/kiwLGZEi32f8IbGbODMbuAufZWRtDetDcgcAyL+qeNVLFEcAr +gbSx82t6fUu1mERKYmxVHNGOwpzfwspNbzt57r0JaweE+57gDpnlyJqPUcx3oDJ3 +7rbsZbYiofmtqzT/aqvaKViKr+MwVIHopTmN1hW0WTiAtGwSy6TXeXKZ8pLMsfmh +38Bfxc2o36MrwIPJykUTmzIcwDxxIHVeuHFAz/NZv30+SpHHfCcVsUOPWG+jHzry +gV6eoI1pkZGpEllLdlBuOomlkVBRXMCvKOqwnWPeggwhFKHn+NSLETflz7zTQNnq +L/hfVdwK5XkuWMCRzYZ+uXEbBsieGbBtWt9bA0OBtnm9tywikD/o3xS8uINqauc4 +figXwfjdqiEsQYmcr1K2Rh7d5mlmc+kZ43gYkZtvM1ZGwJPDsbp+H8gVNrpsTVDe +QM5xGCK2rv2/fOypBkfBweFULNdsFKCHAyAgRRLkd42CXObl2zugFBPAt6kRp+sy +rE33cvAoVu5ir3Oevp2rcsLdTSpChoNYXkFRXSaBQeACMhrFrYGUvhvQ0zR+LFEx +l1Rme+mUxcCNxmZY3VBhAoIBAQDeB4YbUB/QrRmDDSsk7242vR3HPpSNBDQYRoCL +Bm0QRCEMntU55WhclEEWn6MhylPnSHo97sDx1S5Pc0yLkY+4lF8gJioZ09aHrNeV +ok7mH4DTFz6LA+aCFWIMMgjC3WNiccWtBFJjHKXEMV0hD1i6K5PEwClUV1GLUFlS +3DgrYUmBZjHQJJyK57PNtCxU4GTnM+hEEzMont/QV6LDthut+THsC3T782FOyFBL +F7In0RY0sjQqxnOUWVMARTwWa95u2xb877DHbCLxvz22WyIbUX7Zvi4Zw0k28c+b +S/y0aVo2spvVRh8GWOayWDiZaWfn3QsobcF5qB5F/v4seiBlAoIBAQDGXBNSZNbK +pUYPB2YlSYldN8qXBVomw+NZcpl6n9Ak/80oOMg/23uBriNzD61JeTtL5ZaX+KwB +NhNBcNimMl50nAXXZpY4tjBsajSESOfStaYkBAr33pb21YHYxde2jwjH86IND8X7 +wzmXg8fBcR/w+Tcc7kiwEcv7tx/psPc+U5L6p2h5555JNYfZNSwUXGkfadKXkNBh +vDT6oDeOd7PGaqQSXleZeff5n4Zu3a8Ttz2ozNp+vTKxzfnZ6bs9XbE8/A8xeLEC +xWNk8wbAoFlZMiC5nzVNUC77bhhbHiXsDgud9IgaUvySkHzk9l9k+C5ijgf/XTzg +UwTFEOnKG0KnAoIBADCDlFoDd/Aw4pIwHm1Do+FyET+n/O2TLY7gWNYH4Wzcdhw7 +2Ht+FP+lpVM8LnkDrLGstIkz0hUFb8kMeH1GoRDD2sU7kZdzIj0jFzgq7vJ5j7yQ +J6pYf9WMto/TnvZ1SXIJShg0CYx+hfoIj0DaCZkkTHWBR4aWTcsTE3F3jQ5tg5Iy +sk+4sDvpxO/9nnItVd7vCKFXUKZfkKgFfhslf4bUHIRnPHiRBYIhYuoFk3f/x8pb +5eoy0q5nlitI9YgwqbmvRaae+RGaH0iTcPiXkSxG8mDBnXEjqqvGyoY0ZFNHcd7h +yAsh90V7x2zQug1LatjPA9EhqlTa10KUJRWy2cECggEAcmol0v7LTjQqxvxzlMpn +61cFCjtSFs4i0zNhB/QqsUzDX5HxH7RP9ysk03eVcq304ABb7ujG/iPc04Bt1t9y +0Dw2ulo4CBo+sCpKhIsw/L8+R8P1N6gy18mrjggANxMl83+6V2JjxqaDD7w5eoDv +9aUqfwuK7dQ2HskwJTGoS1EVlHL/tmE9UekIpOcgt9Xd5Pq7OCWVrOpMfMvxf8HX +9nkIjnfQe3x45ol3l3dTR0II1NbkqPokxZ6ToXhKQklKtGyHrvd40qpcfJwZpv5W +yzY43hjRO/kmQGzuq5AmO5SWatPjtZtsiHXDNKZPvAPTbZGTV17GgHYiaDErSSKU +PQKCAQAqRg0HYlHd+l1rQv929MeHNkndsU5+hwoANbkOImzyHgEF/Yi/Pkfreb/x +BWbDT5hIlwqTB3j0hlF5D9U+Du+q0vkn7s0q4/7C9rVGpKHLbb34SngN1ixAuNWp +Y6/aDq4HU43dcmKNFpJMkiqOyo3XiD2jTFcBdBupMDMK2crEkZhSJQNRVLL6aMmN +H/FdN7GOSGlHOq01eMmmMZvrSeyKNoaXN90QSUWYWmzRgyeB35ou82UIbqTUp+xc +YeA6sXYEihKEWuH7/L0oF3AifHUX04O4WVgfuCG/eU7LTjcK5fKHqPZyGlCDdOEs +hXT+qgtAqqk0zUrwh434d60AlOui +-----END PRIVATE KEY----- diff --git a/sgx-ra/src/support/mod.rs b/sgx-ra/src/support/mod.rs new file mode 100644 index 000000000..57e1d7bdd --- /dev/null +++ b/sgx-ra/src/support/mod.rs @@ -0,0 +1,19 @@ +/* Copyright (c) Fortanix, Inc. + * + * Licensed under the GNU General Public License, version 2 or the Apache License, Version + * 2.0 , at your + * option. This file may not be copied, modified, or distributed except + * according to those terms. */ + +#![allow(dead_code)] +pub mod entropy; +pub mod keys; +#[cfg(unix)] +#[cfg(sys_std_component = "net")] +pub mod net; +pub mod rand; +#[cfg(feature = "std")] +pub mod debug; +#[cfg(all(feature = "std", feature = "async"))] +pub mod custom_write_all; diff --git a/sgx-ra/src/support/net.rs b/sgx-ra/src/support/net.rs new file mode 100644 index 000000000..99e87066d --- /dev/null +++ b/sgx-ra/src/support/net.rs @@ -0,0 +1,33 @@ +/* Copyright (c) Fortanix, Inc. + * + * Licensed under the GNU General Public License, version 2 or the Apache License, Version + * 2.0 , at your + * option. This file may not be copied, modified, or distributed except + * according to those terms. */ + +use std::io::{Error as IoError, Result as IoResult}; +use std::net::TcpStream; +use std::os::unix::io::FromRawFd; + +pub fn create_tcp_pair() -> IoResult<(TcpStream, TcpStream)> { + let mut fds: [libc::c_int; 2] = [0; 2]; + unsafe { + // one might consider creating a TcpStream from a UNIX socket a hack + // most socket operations should work the same way, and UnixSocket + // is too new to be used + if libc::socketpair(libc::AF_UNIX, libc::SOCK_STREAM, 0, fds.as_mut_ptr()) == 0 { + Ok((TcpStream::from_raw_fd(fds[0]), TcpStream::from_raw_fd(fds[1]))) + } else { + Err(IoError::last_os_error()) + } + } +} + +#[cfg(feature = "tokio")] +pub fn create_tcp_pair_async() -> IoResult<(tokio::net::TcpStream, tokio::net::TcpStream)> { + let (c, s) = create_tcp_pair()?; + c.set_nonblocking(true)?; + s.set_nonblocking(true)?; + Ok((tokio::net::TcpStream::from_std(c)?, tokio::net::TcpStream::from_std(s)?)) +} diff --git a/sgx-ra/src/support/rand.rs b/sgx-ra/src/support/rand.rs new file mode 100644 index 000000000..b6fe67246 --- /dev/null +++ b/sgx-ra/src/support/rand.rs @@ -0,0 +1,47 @@ +/* Copyright (c) Fortanix, Inc. + * + * Licensed under the GNU General Public License, version 2 or the Apache License, Version + * 2.0 , at your + * option. This file may not be copied, modified, or distributed except + * according to those terms. */ + +use mbedtls_sys::types::raw_types::{c_int, c_uchar, c_void}; +use mbedtls_sys::types::size_t; + +use rand::{Rng, XorShiftRng}; + +/// Not cryptographically secure!!! Use for testing only!!! +pub struct TestRandom(XorShiftRng); + +impl crate::mbedtls::rng::RngCallbackMut for TestRandom { + unsafe extern "C" fn call_mut(p_rng: *mut c_void, data: *mut c_uchar, len: size_t) -> c_int { + (*(p_rng as *mut TestRandom)) + .0 + .fill_bytes(core::slice::from_raw_parts_mut(data, len)); + 0 + } + + fn data_ptr_mut(&mut self) -> *mut c_void { + self as *const _ as *mut _ + } +} + +impl crate::mbedtls::rng::RngCallback for TestRandom { + unsafe extern "C" fn call(p_rng: *mut c_void, data: *mut c_uchar, len: size_t) -> c_int { + (*(p_rng as *mut TestRandom)) + .0 + .fill_bytes(core::slice::from_raw_parts_mut(data, len)); + 0 + } + + fn data_ptr(&self) -> *mut c_void { + self as *const _ as *mut _ + } +} + + +/// Not cryptographically secure!!! Use for testing only!!! +pub fn test_rng() -> TestRandom { + TestRandom(XorShiftRng::new_unseeded()) +} diff --git a/taiko.toml b/taiko.toml new file mode 100644 index 000000000..398e71fcb --- /dev/null +++ b/taiko.toml @@ -0,0 +1,8 @@ +[base] +anchor_gas_limit = 250_000 +[l1] +contract = "0xB261C6fACc0707B674c7491338412FDF44733A4B" +signal_service = "0xf7f1b1Cf92f24aa4BFf028eAAEF15a6159045fC7" +[l2] +contract = "0x1670010000000000000000000000000000010001" +signal_service = "0x1670010000000000000000000000000000000005" diff --git a/testing/ef-tests/testguest/Cargo.lock b/testing/ef-tests/testguest/Cargo.lock index a5857d415..a0e246635 100644 --- a/testing/ef-tests/testguest/Cargo.lock +++ b/testing/ef-tests/testguest/Cargo.lock @@ -3327,9 +3327,11 @@ dependencies = [ "ethers-providers", "flate2", "hashbrown 0.14.0", + "hex", "log", "once_cell", "revm", + "rlp", "ruint", "serde", "serde_json", @@ -3349,9 +3351,11 @@ dependencies = [ "anyhow", "bytes", "ethers-core", + "hex", "k256", "revm-primitives", "rlp", + "ruint", "serde", "sha3", "thiserror", diff --git a/testing/ef-tests/testguest/Cargo.toml b/testing/ef-tests/testguest/Cargo.toml index 59730a321..eefde440f 100644 --- a/testing/ef-tests/testguest/Cargo.toml +++ b/testing/ef-tests/testguest/Cargo.toml @@ -14,4 +14,4 @@ zeth-lib = { path = "../../../lib", default-features = false } # use optimized risc0 circuit crypto-bigint = { git = "https://github.com/risc0/RustCrypto-crypto-bigint", tag = "v0.5.2-risczero.0" } k256 = { git = "https://github.com/risc0/RustCrypto-elliptic-curves", tag = "k256/v0.13.1-risczero.1" } -sha2 = { git = "https://github.com/risc0/RustCrypto-hashes", tag = "sha2-v0.10.6-risczero.0" } +sha2 = { git = "https://github.com/risc0/RustCrypto-hashes", tag = "sha2-v0.10.6-risczero.0" } \ No newline at end of file