From ce4526a230919c8c6be9151b43943c5d1b53b63d Mon Sep 17 00:00:00 2001 From: Roland Kuhn Date: Sat, 29 Mar 2025 12:17:33 +0100 Subject: [PATCH 01/10] feat: add downstream server Currently only keepalive and chainsync protocols are supported. There is a smoke test for the latter and the assumption that the former is tested in pallas. Some work has also been done in the Makefile to make it easier to have multiple Amaru nodes running in the project root directory. An architecture diagram has been added to the amaru-consensus README. Signed-Off-By: Roland Kuhn --- .gitignore | 8 +- Cargo.lock | 183 +- Cargo.toml | 1 + Makefile | 21 +- README.md | 21 +- crates/amaru-consensus/Cargo.lock | 2060 ----------------- crates/amaru-consensus/Cargo.toml | 3 + .../amaru-consensus/tests/data/chain41.json | 574 +++++ crates/amaru/Cargo.toml | 4 + crates/amaru/src/bin/amaru/cmd/daemon.rs | 6 + crates/amaru/src/bin/amaru/cmd/mod.rs | 3 + .../src/stages/consensus/chain_forward.rs | 233 +- .../stages/consensus/chain_forward/README.md | 38 + .../consensus/chain_forward/chain_forward.d2 | 126 + .../consensus/chain_forward/chain_forward.png | Bin 0 -> 563809 bytes .../chain_forward/client_protocol.rs | 236 ++ .../consensus/chain_forward/client_state.rs | 137 ++ .../stages/consensus/chain_forward/tests.rs | 289 +++ crates/amaru/src/stages/mod.rs | 9 +- 19 files changed, 1803 insertions(+), 2149 deletions(-) delete mode 100644 crates/amaru-consensus/Cargo.lock create mode 100644 crates/amaru-consensus/tests/data/chain41.json create mode 100644 crates/amaru/src/stages/consensus/chain_forward/README.md create mode 100644 crates/amaru/src/stages/consensus/chain_forward/chain_forward.d2 create mode 100644 crates/amaru/src/stages/consensus/chain_forward/chain_forward.png create mode 100644 crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs create mode 100644 crates/amaru/src/stages/consensus/chain_forward/client_state.rs create mode 100644 crates/amaru/src/stages/consensus/chain_forward/tests.rs diff --git a/.gitignore b/.gitignore index 9f04a5ed6..402b28b7c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,10 +14,10 @@ target/ *.pdb # Default database location for the ledger -ledger.db +/*ledger.db/ # Default database location for the consensus -chain.db +/*chain.db/ # Insta not-yet reviewed snapshots *.snap.new @@ -36,3 +36,7 @@ coverage/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. .idea/ *~ + +# Cardano node support files +/cardano-node-config/ +/snapshots/ diff --git a/Cargo.lock b/Cargo.lock index 436895921..4398e88e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,20 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "acto" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52632fc65e2b2dac7eb4f62e94c494a48ceecc8d2b81c5748dd19694850b548b" +dependencies = [ + "parking_lot", + "pin-project-lite", + "rustc_version", + "smol_str", + "tokio", + "tracing", +] + [[package]] name = "addr2line" version = "0.24.2" @@ -30,6 +44,7 @@ dependencies = [ name = "amaru" version = "0.1.0" dependencies = [ + "acto", "amaru-consensus", "amaru-kernel", "amaru-ledger", @@ -44,6 +59,7 @@ dependencies = [ "indicatif", "indoc", "insta", + "minicbor", "opentelemetry", "opentelemetry-otlp", "opentelemetry_sdk", @@ -54,6 +70,8 @@ dependencies = [ "pallas-traverse", "proptest", "rand 0.9.0", + "serde_json", + "slot-arithmetic", "sysinfo", "tempfile", "test-case", @@ -75,17 +93,20 @@ dependencies = [ "envpath", "hex", "insta", + "minicbor", "pallas-codec", "pallas-crypto", "pallas-math", "proptest", "rand 0.9.0", "rayon", + "serde_json", "slot-arithmetic", "tempfile", "thiserror 2.0.12", "tokio", "tracing", + "tracing-subscriber", ] [[package]] @@ -273,9 +294,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.97" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "assert-json-diff" @@ -462,9 +483,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.17" +version = "1.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" dependencies = [ "jobserver", "libc", @@ -499,9 +520,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.35" +version = "4.5.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8aa86934b44c19c50f87cc2790e19f54f7a67aedb64101c2e1a2e5ecfb73944" +checksum = "2df961d8c8a0d08aa9945718ccf584145eee3f3aa06cddbeac12933781102e04" dependencies = [ "clap_builder", "clap_derive", @@ -509,9 +530,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.35" +version = "4.5.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2414dbb2dd0695280da6ea9261e327479e9d37b0630f6b53ba2a11c60c679fd9" +checksum = "132dbda40fb6753878316a489d5a1242a8ef2f0d9e47ba01c951ea8aa7d013a5" dependencies = [ "anstream", "anstyle", @@ -601,9 +622,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -893,9 +914,9 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -1099,9 +1120,9 @@ checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "h2" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" dependencies = [ "atomic-waker", "bytes", @@ -1109,7 +1130,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.8.0", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -1118,9 +1139,9 @@ dependencies = [ [[package]] name = "half" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -1225,9 +1246,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", @@ -1235,6 +1256,7 @@ dependencies = [ "http", "http-body", "hyper", + "libc", "pin-project-lite", "socket2", "tokio", @@ -1283,9 +1305,9 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" @@ -1307,9 +1329,9 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_properties" @@ -1328,9 +1350,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_provider" @@ -1393,9 +1415,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -1488,10 +1510,11 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.2", "libc", ] @@ -1540,9 +1563,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.171" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libgit2-sys" @@ -1615,9 +1638,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" @@ -1625,11 +1648,21 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "matchers" @@ -1681,9 +1714,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] @@ -1843,9 +1876,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.1" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "opaque-debug" @@ -2049,6 +2082,29 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + [[package]] name = "paste" version = "1.0.15" @@ -2126,9 +2182,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -2295,6 +2351,15 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "redox_syscall" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.4.6" @@ -2420,9 +2485,9 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.3" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ "bitflags", "errno", @@ -2455,6 +2520,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "semver" version = "1.0.26" @@ -2610,15 +2681,21 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" + +[[package]] +name = "smol_str" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9" [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2810,9 +2887,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.44.1" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", @@ -3624,18 +3701,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd97444d05a4328b90e75e503a34bad781f14e28a823ad3557f0750df1ebcbc6" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.23" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6352c01d0edd5db859a63e2605f4ea3183ddbd15e2c4a9e7d32184df75e4f154" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 2d3b52abe..458ccf702 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,6 +15,7 @@ default-members = ["crates/*"] resolver = "2" [workspace.dependencies] +acto = { version = "0.7.2", features = ["tokio"] } anyhow = "1.0.95" async-trait = "0.1.83" bech32 = "0.11.0" diff --git a/Makefile b/Makefile index fc4d49ae5..27a61d78b 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,11 @@ DEMO_TARGET_EPOCH ?= 174 HASKELL_NODE_CONFIG_SOURCE := https://book.world.dev.cardano.org/environments COVERAGE_DIR ?= coverage COVERAGE_CRATES ?= +DB_PREFIX ?= amaru +LISTEN_ADDRESS ?= 0.0.0.0:0 + +LEDGER_DIR = $(DB_PREFIX)-ledger +CHAIN_DIR = $(DB_PREFIX)-chain .PHONY: help bootstrap run import-snapshots import-headers import-nonces download-haskell-config coverage-html coverage-lconv check-llvm-cov @@ -37,32 +42,44 @@ download-haskell-config: ## Download Cardano Haskell configuration for $NETWORK import-snapshots: snapshots ## Import PreProd snapshots for demo cargo run -- import-ledger-state \ + --ledger-dir $(LEDGER_DIR) \ --snapshot $^/69206375.6f99b5f3deaeae8dc43fce3db2f3cd36ad8ed174ca3400b5b1bed76fdf248912.cbor \ --snapshot $^/69638382.5da6ba37a4a07df015c4ea92c880e3600d7f098b97e73816f8df04bbb5fad3b7.cbor \ --snapshot $^/70070379.d6fe6439aed8bddc10eec22c1575bf0648e4a76125387d9e985e9a3f8342870d.cbor import-headers: ## Import headers from $AMARU_PEER_ADDRESS for demo cargo run -- import-headers \ + --chain-dir $(CHAIN_DIR) \ --peer-address ${AMARU_PEER_ADDRESS} \ --starting-point 69638365.4ec0f5a78431fdcc594eab7db91aff7dfd91c13cc93e9fbfe70cd15a86fadfb2 \ --count 2 cargo run -- import-headers \ + --chain-dir $(CHAIN_DIR) \ --peer-address ${AMARU_PEER_ADDRESS} \ --starting-point 70070331.076218aa483344e34620d3277542ecc9e7b382ae2407a60e177bc3700548364c \ --count 2 import-nonces: ## Import PreProd nonces for demo cargo run -- import-nonces \ + --chain-dir $(CHAIN_DIR) \ --at 70070379.d6fe6439aed8bddc10eec22c1575bf0648e4a76125387d9e985e9a3f8342870d \ --active a7c4477e9fcfd519bf7dcba0d4ffe35a399125534bc8c60fa89ff6b50a060a7a \ --candidate 74fe03b10c4f52dd41105a16b5f6a11015ec890a001a5253db78a779fe43f6b6 \ --evolving 24bb737ee28652cd99ca41f1f7be568353b4103d769c6e1ddb531fc874dd6718 \ --tail 5da6ba37a4a07df015c4ea92c880e3600d7f098b97e73816f8df04bbb5fad3b7 -bootstrap: import-headers import-nonces import-snapshots ## Bootstrap the node +clear-db: ## Clear the database + rm -rf $(LEDGER_DIR) $(CHAIN_DIR) + +bootstrap: clear-db import-headers import-nonces import-snapshots ## Bootstrap the node dev: ## Compile and run for development with default options - cargo run -- daemon --peer-address=$(AMARU_PEER_ADDRESS) --network=$(NETWORK) + cargo run -- daemon \ + --ledger-dir $(LEDGER_DIR) \ + --chain-dir $(CHAIN_DIR) \ + --peer-address=$(AMARU_PEER_ADDRESS) \ + --network=$(NETWORK) \ + --listen-address=$(LISTEN_ADDRESS) test-e2e: ## Run snapshot tests, assuming snapshots are available. cargo test -p amaru -- --ignored diff --git a/README.md b/README.md index 3b1407a05..2a39486d8 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ cargo build --release > [!IMPORTANT] > These instructions assume one starts from scratch, and has access to a running [cardano-node](https://github.com/IntersectMBO/cardano-node/) -on the [preprod](https://book.world.dev.cardano.org/env-preprod.html) network. +on the [preprod](https://book.world.dev.cardano.org/env-preprod.html) network (see bottom of page for more info). 1. Download at least three [ledger snapshots](./data/README.md#cardano-ledger-snapshots): @@ -127,3 +127,22 @@ Amaru is the integration point of several other projects / repositories. Amongst | Discord Discord

+ +## Spinning up a Cardano node on `preprod` + +One option to do this is by using the docker image mentioned above: + +```sh +docker pull ghcr.io/intersectmbo/cardano-node:8.9.1 +``` + +(you may want to check available versions) +This image requires two volumes: + +- `cardano-data:/data` for the blockchain db +- `cardano-ipc:/ipc` for IPC with other tools + +Since we want to use network connections to interact with this node, you’ll want to expose port 3001, at least on `localhost`. + +The final and crucial ingredient is to supply the environment variable `NETWORK=preprod`. +With this, the node with start up, fetch the required config files, and then start syncing blocks from the network; this will take some time. diff --git a/crates/amaru-consensus/Cargo.lock b/crates/amaru-consensus/Cargo.lock deleted file mode 100644 index 80f93c270..000000000 --- a/crates/amaru-consensus/Cargo.lock +++ /dev/null @@ -1,2060 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "amaru" -version = "0.1.0" -dependencies = [ - "async-trait", - "clap", - "gasket", - "hex", - "miette 7.2.0", - "ouroboros", - "ouroboros-praos", - "pallas-codec", - "pallas-crypto", - "pallas-math", - "pallas-network", - "pallas-primitives", - "pallas-traverse", - "thiserror", - "tokio", - "tokio-util", - "tracing", - "tracing-subscriber", - "uplc", -] - -[[package]] -name = "anstream" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" - -[[package]] -name = "anstyle-parse" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "async-trait" -version = "0.1.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "autocfg" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets", -] - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base58" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6107fe1be6682a68940da878d9e9f5e90ca5745b3dec9fd1bb393c8777d4f581" - -[[package]] -name = "base64ct" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" - -[[package]] -name = "bech32" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" - -[[package]] -name = "blake2" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[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.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" - -[[package]] -name = "cc" -version = "1.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" -dependencies = [ - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - -[[package]] -name = "colorchoice" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "cpufeatures" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crossbeam" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "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 = "cryptoxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382ce8820a5bb815055d3553a610e8cb542b2d767bbacea99038afda96cd760d" - -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "git+https://github.com/txpipe/curve25519-dalek?branch=ietf03_vrf_compat_ell2#70a36f41cfc3fbb7357ec3062201b911787decba" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[package]] -name = "downcast" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" -dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519", - "serde", - "sha2 0.10.8", - "subtle", - "zeroize", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "fragile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "gasket" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b60154514ed9e060f0b2b78819602fa5d68746d6b618efb2ea2fecc6f89f32" -dependencies = [ - "async-trait", - "crossbeam", - "gasket-derive", - "serde", - "signal-hook", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "gasket-derive" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16f3b9da5c685c55178b9749f79bf6a6c62d1bd07656a0c8eeddadb80ef29c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[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.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "gimli" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "half" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[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", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "sha2 0.10.8", - "signature", -] - -[[package]] -name = "kes-summed-ed25519" -version = "0.2.1" -source = "git+https://github.com/txpipe/kes?rev=f69fb357d46f6a18925543d785850059569d7e78#f69fb357d46f6a18925543d785850059569d7e78" -dependencies = [ - "blake2", - "ed25519-dalek", - "rand_core 0.6.4", - "thiserror", - "zeroize", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "libc" -version = "0.2.159" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "log" -version = "0.4.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "malachite" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5616515d632967cd329b6f6db96be9a03ea0b3a49cdbc45b0016803dad8a77b7" -dependencies = [ - "malachite-base", - "malachite-nz", - "malachite-q", -] - -[[package]] -name = "malachite-base" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46059721011b0458b7bd6d9179be5d0b60294281c23320c207adceaecc54d13b" -dependencies = [ - "hashbrown 0.14.5", - "itertools 0.11.0", - "libm", - "ryu", -] - -[[package]] -name = "malachite-nz" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1503b27e825cabd1c3d0ff1e95a39fb2ec9eab6fd3da6cfa41aec7091d273e78" -dependencies = [ - "itertools 0.11.0", - "libm", - "malachite-base", -] - -[[package]] -name = "malachite-q" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a475503a70a3679dbe3b9b230a23622516742528ba614a7b2490f180ea9cb514" -dependencies = [ - "itertools 0.11.0", - "malachite-base", - "malachite-nz", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "miette" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" -dependencies = [ - "miette-derive 5.10.0", - "once_cell", - "thiserror", - "unicode-width", -] - -[[package]] -name = "miette" -version = "7.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4edc8853320c2a0dab800fbda86253c8938f6ea88510dc92c5f1ed20e794afc1" -dependencies = [ - "cfg-if", - "miette-derive 7.2.0", - "thiserror", - "unicode-width", -] - -[[package]] -name = "miette-derive" -version = "5.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "miette-derive" -version = "7.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "minicbor" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d15f4203d71fdf90903c2696e55426ac97a363c67b218488a73b534ce7aca10" -dependencies = [ - "half", - "minicbor-derive", -] - -[[package]] -name = "minicbor-derive" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1154809406efdb7982841adb6311b3d095b46f78342dd646736122fe6b19e267" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" -dependencies = [ - "hermit-abi", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", -] - -[[package]] -name = "mockall" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c28b3fb6d753d28c20e826cd46ee611fda1cf3cde03a443a974043247c065a" -dependencies = [ - "cfg-if", - "downcast", - "fragile", - "mockall_derive", - "predicates", - "predicates-tree", -] - -[[package]] -name = "mockall_derive" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "341014e7f530314e9a1fdbc7400b244efea7122662c96bfa248c31da5bfb2020" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[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-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[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 = "object" -version = "0.36.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "ouroboros" -version = "0.1.0" -source = "git+https://github.com/pragma-org/ouroboros?rev=5d914a7e8435a1860cf7747d15db9692c2a06110#5d914a7e8435a1860cf7747d15db9692c2a06110" -dependencies = [ - "async-trait", - "hex", - "mockall", - "pallas-codec", - "pallas-crypto", - "serde", - "thiserror", -] - -[[package]] -name = "ouroboros-praos" -version = "0.1.0" -source = "git+https://github.com/pragma-org/ouroboros?rev=5d914a7e8435a1860cf7747d15db9692c2a06110#5d914a7e8435a1860cf7747d15db9692c2a06110" -dependencies = [ - "hex", - "ouroboros", - "pallas-crypto", - "pallas-math", - "pallas-primitives", - "rayon", - "tracing", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "pallas-addresses" -version = "0.30.2" -source = "git+https://github.com/txpipe/pallas?rev=4871342a8deffaceafb5e0f771e1623dfe57e25f#4871342a8deffaceafb5e0f771e1623dfe57e25f" -dependencies = [ - "base58", - "bech32", - "crc", - "cryptoxide", - "hex", - "pallas-codec", - "pallas-crypto", - "thiserror", -] - -[[package]] -name = "pallas-codec" -version = "0.30.2" -source = "git+https://github.com/txpipe/pallas?rev=4871342a8deffaceafb5e0f771e1623dfe57e25f#4871342a8deffaceafb5e0f771e1623dfe57e25f" -dependencies = [ - "hex", - "minicbor", - "num-bigint", - "serde", - "thiserror", -] - -[[package]] -name = "pallas-crypto" -version = "0.30.2" -source = "git+https://github.com/txpipe/pallas?rev=4871342a8deffaceafb5e0f771e1623dfe57e25f#4871342a8deffaceafb5e0f771e1623dfe57e25f" -dependencies = [ - "cryptoxide", - "hex", - "kes-summed-ed25519", - "pallas-codec", - "rand_core 0.6.4", - "serde", - "thiserror", - "vrf_dalek", - "zeroize", -] - -[[package]] -name = "pallas-math" -version = "0.30.2" -source = "git+https://github.com/txpipe/pallas?rev=4871342a8deffaceafb5e0f771e1623dfe57e25f#4871342a8deffaceafb5e0f771e1623dfe57e25f" -dependencies = [ - "malachite", - "malachite-base", - "once_cell", - "regex", - "thiserror", -] - -[[package]] -name = "pallas-network" -version = "0.30.2" -source = "git+https://github.com/txpipe/pallas?rev=4871342a8deffaceafb5e0f771e1623dfe57e25f#4871342a8deffaceafb5e0f771e1623dfe57e25f" -dependencies = [ - "byteorder", - "hex", - "itertools 0.13.0", - "pallas-codec", - "pallas-crypto", - "rand", - "socket2", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "pallas-primitives" -version = "0.30.2" -source = "git+https://github.com/txpipe/pallas?rev=4871342a8deffaceafb5e0f771e1623dfe57e25f#4871342a8deffaceafb5e0f771e1623dfe57e25f" -dependencies = [ - "base58", - "bech32", - "hex", - "log", - "pallas-codec", - "pallas-crypto", - "serde", - "serde_json", -] - -[[package]] -name = "pallas-traverse" -version = "0.30.2" -source = "git+https://github.com/txpipe/pallas?rev=4871342a8deffaceafb5e0f771e1623dfe57e25f#4871342a8deffaceafb5e0f771e1623dfe57e25f" -dependencies = [ - "hex", - "itertools 0.13.0", - "pallas-addresses", - "pallas-codec", - "pallas-crypto", - "pallas-primitives", - "paste", - "serde", - "thiserror", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "peg" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" -dependencies = [ - "peg-macros", - "peg-runtime", -] - -[[package]] -name = "peg-macros" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" -dependencies = [ - "peg-runtime", - "proc-macro2", - "quote", -] - -[[package]] -name = "peg-runtime" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[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.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "predicates" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" -dependencies = [ - "anstyle", - "predicates-core", -] - -[[package]] -name = "predicates-core" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" - -[[package]] -name = "predicates-tree" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" -dependencies = [ - "predicates-core", - "termtree", -] - -[[package]] -name = "pretty" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83f3aa1e3ca87d3b124db7461265ac176b40c277f37e503eaa29c9c75c037846" -dependencies = [ - "arrayvec", - "log", - "typed-arena", - "unicode-segmentation", -] - -[[package]] -name = "proc-macro2" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[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 0.6.4", -] - -[[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 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.15", -] - -[[package]] -name = "rayon" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "regex" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.8", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[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.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustversion" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4124a35fe33ae14259c490fd70fa199a32b9ce9502f2ee6bc4f81ec06fa65894" -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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "serde" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.210" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "serde_json" -version = "1.0.128" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[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.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" - -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[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.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "termtree" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" - -[[package]] -name = "thiserror" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "tokio" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "tokio-util" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[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-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", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "typed-arena" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "uplc" -version = "1.1.4" -source = "git+https://github.com/aiken-lang/aiken?branch=amaru-demo#310e0717a10670da57ff9923f6c78fddd1e16116" -dependencies = [ - "blst", - "cryptoxide", - "hex", - "indexmap", - "itertools 0.10.5", - "k256", - "miette 5.10.0", - "num-bigint", - "num-integer", - "num-traits", - "once_cell", - "pallas-addresses", - "pallas-codec", - "pallas-crypto", - "pallas-primitives", - "pallas-traverse", - "peg", - "pretty", - "secp256k1", - "serde", - "serde_json", - "strum", - "strum_macros", - "thiserror", -] - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[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.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "vrf_dalek" -version = "0.1.0" -source = "git+https://github.com/txpipe/vrf?rev=044b45a1a919ba9d9c2471fc5c4d441f13086676#044b45a1a919ba9d9c2471fc5c4d441f13086676" -dependencies = [ - "curve25519-dalek 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "curve25519-dalek 3.2.0 (git+https://github.com/txpipe/curve25519-dalek?branch=ietf03_vrf_compat_ell2)", - "rand_core 0.5.1", - "sha2 0.9.9", - "thiserror", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[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-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "byteorder", - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.79", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -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.79", -] diff --git a/crates/amaru-consensus/Cargo.toml b/crates/amaru-consensus/Cargo.toml index 9745b7d58..485cb0197 100644 --- a/crates/amaru-consensus/Cargo.toml +++ b/crates/amaru-consensus/Cargo.toml @@ -30,6 +30,9 @@ slot-arithmetic.workspace = true envpath.workspace = true hex.workspace = true insta.workspace = true +minicbor.workspace = true proptest.workspace = true rand.workspace = true +serde_json.workspace = true tempfile.workspace = true +tracing-subscriber.workspace = true diff --git a/crates/amaru-consensus/tests/data/chain41.json b/crates/amaru-consensus/tests/data/chain41.json new file mode 100644 index 000000000..729bd3ea1 --- /dev/null +++ b/crates/amaru-consensus/tests/data/chain41.json @@ -0,0 +1,574 @@ +{ + "context": { + "activeSlotCoeff": 5.0e-2, + "nonce": "ec08f270a044fb94bf61f9870e928a96cf75027d1f0e9f5dead0651b40849a89", + "praosMaxKESEvo": 63, + "praosSlotsPerKESPeriod": 2048 + }, + "stakePools": { + "chains": [ + { + "hash": "2487bd4f49c89e59bb3d2166510d3d49017674d3c3b430b95db2e260fedce45e", + "header": "828a01181ff6582022ff37595005fa65ad731d4fb112de050aa0ca910d9a3110f56f3879d449f88e5820da90997ba81483b3f2b4de751ba3ece6ba6d50f96598eb0940cc7d29452cdcb9825840d350e19abe11a25b28d4d1a846faa8f7792b6dc4a19679780dcdd3d98baf4e9738d82764c59b1c76f80b5ddbff2e145aa26f1652ab83f1f930fc430d1be960305850b444cc452b3fbc01a267ff526ea8a66cb57202303b4b1c22557cad8c1d8afbb47a34e55c5e0bee497f58c812e8b2fed95b40cb1f966ad77445ef573f289910debf5dcb4924cecce47d181f325b4d21040058200a9aa01fbdfe2cff3e49a3c02c2610691966075092f76bd26f5bddf85489ffd3845820499fc5dada1544be26d7cd3b2851fe955b44e560b50901abc71333d5d449eac9182e005840595a9a329b2637b8f2cb501aa793a159acc928a27c01e1ef586508492a68cabeae6ced714421be1f648bb05c7196f38e7aa4a8f616ad46e32c84e67951657a038200005901c0c00b0daf83dfc61a23fa9f6e4db5ad31428a7e98839aba420dbdbdc5ad90b72185cb03b5373b73fcd9c0128b3afcc7d14e5b51f4d5592d55a5d222314b590101472338fcc8b178f0ba10f8683725c5df444b7fc6a5afc3c7fbab82e00e7df2d247c673d066eacc1dc7860c10b134c413d71c5a073a5f3e66a17f0d25dabae2699d7b4a969e129d627cd7839995ddf40a3e6672b6d03936de782f5e0dc31bfafdccc5d5d2e5e9a5b3414bface59a824e3a574250474d633115af821b63232de753fddb638606b93b853144dd75692b02e73b2ef8621eb1bfa307cfda8acaa2c43f8b673c9ed749e472cdf2fced20c063a2507ccb985d2b5a9bc77699f42379fb349e1e3a1ab86d1bd510c6ee89720f860d55c208dd262f49746d8fb2a7817d038262a6b266f98f427fc8b958f11adb8c84cc96444b1f5f9d994a4fd1adae2f2be87d8c1dbc0206ace7871da50cc92476d3fced6a4fc2809c8bb47dff992b06259c21f78cd6e72b49b8fe101065aaf243003af67a11d5aabcebf1059b3c92493f954507573a01bf92047ef68f4e980df914b360307b78b3371138b4c1504e155f704df9fabf1bc87ac47b3d5cd563cee6017380e4df6529face9cf39b36277068e", + "height": 1, + "parent": null, + "slot": 31 + }, + { + "hash": "4fcd1d0fccd869c632d4af171b7f3011f51b11bd2e9870bebe8990cad4c5b8ba", + "header": "828a02182658202487bd4f49c89e59bb3d2166510d3d49017674d3c3b430b95db2e260fedce45e5820cf1d41b669559e9d30eaf310408a8dea605e3629c0dfd7b6d649d4861514d1bf582083f3206635b9182a411e2a9e870cc13f5974507b1f84476c8519ad9215ae4678825840e8cf431cf549890a0a9bc8203524e5722b7fe156f03d51386e4c0f58d18892df6b1349581935b299e0ef77db4ea00f06481e5430ddb5404562f6ebab6eaba868585035f6b33676d464d482f112d220d7bd4be183d1e6eecec8d68c876b624bc47fc51e7687d02651807ae63076f66bd1b964cf1ff2bcd99bbb7f7e769f835ba99fd5fe4c835a70ecb3ebcb7789d52a661c0c0058206cfbcf0fd018168133b31fa9b1ec0fe810f372004467f8ebbc444a78281ddb578458205474aa415f322607b193704e4c4c0554ec74fe68f7a0c880d65660a75c092e9d0d005840bbd78899a963f57f958f23ee2113f5acf830ce54a3733f7f5e9ec66459997dbbe4837e7706f415b8435ded9bedc37cf51e60177ff5d8e753c2638349cf01bf0d8200005901c0dc42cdf7c5f1b38716efafe1fc24449fee11f5b454d9e2b7c889a69a4b4bea23fbee709cce6a3873ae252f34840f3df5a4d155cd5445ed26398015b86f67a80ec240bf2a1681adcda82378b0cd9f0211c9f7ee6eb26e57ee2b0b92547793e5faa7f183ed48ff763de91c6324f355449b2d96e4f37efde9dc377751844b3314bb8d0e3c59befe2f1a5b7bc0045a164b8b9e1c5c9ee285bf6c2f6152826ef1252ab39577992ce208e5b172e9d03e46c268454a1502697162f175c586821d0fb5a8c0ffd4c56fb8c5cce2e1f7a0efc77a38277faa82580e983c87d4081dd8b5226bc8994114ec7a95f8be871726a6998dce138fc55377f022f84cc97eccdd18e7d61b557d7daea41d1d021e34aab3dac320758ba4f9c2d5fddc5a8072097be37af8f2e5fb4037a11632c6fd9d42c62a2e8263af2db7c83d992c933548e0f5d2593bface422b543cb5c1eb68fab55f0a77683d4532df74468dee8e18a1b32b92fde2dd6a8dad63af74be2f9c4d3a1d7b57711d09e38e97fb72551eedf3c215beb1c0cac6a938ca375bcb5ab7037955122f116659927bdbb741aec609c2c27e3d18c4d5751b52460d0914e68d40014f179d8400db188be2c34a7f98872070b86ad764", + "height": 2, + "parent": "2487bd4f49c89e59bb3d2166510d3d49017674d3c3b430b95db2e260fedce45e", + "slot": 38 + }, + { + "hash": "7393071a515238dec04e86ee45329121ae6a38051642d6548790ac3325b592ee", + "header": "828a03182958204fcd1d0fccd869c632d4af171b7f3011f51b11bd2e9870bebe8990cad4c5b8ba5820cf1d41b669559e9d30eaf310408a8dea605e3629c0dfd7b6d649d4861514d1bf582083f3206635b9182a411e2a9e870cc13f5974507b1f84476c8519ad9215ae4678825840c62b011f810bc9f6ed4ee0388463bead89231b2634c432824a388ed87f70b41d83ae5773c8fd02ca59954d0e3406eeae320bb5cc1ae456a8bee4933a32c2b2405850f328c6556b2ef586ef7743551bb02b272b39b4268aa0844caa1787a7bbc35a7e81cdc17fafb485217e71d24dda797df7d3b254dd3bd923a7c5d2db9e1240732602de00682ea42eebb8668d1b4e3b770f0058201ade370a2f2a38a9a82dce6ab97b8bee7c0c380e37ff23134d664a38a32e2ccc8458205474aa415f322607b193704e4c4c0554ec74fe68f7a0c880d65660a75c092e9d0d005840bbd78899a963f57f958f23ee2113f5acf830ce54a3733f7f5e9ec66459997dbbe4837e7706f415b8435ded9bedc37cf51e60177ff5d8e753c2638349cf01bf0d8200005901c0d65a20ebb86aa86a47ec2852babb715aea3dc0080cb845ac51a798bbf50909d999995811153da2c6a2d6cf569347098139e78f118979f1e5735671e382b1df0cc240bf2a1681adcda82378b0cd9f0211c9f7ee6eb26e57ee2b0b92547793e5faa7f183ed48ff763de91c6324f355449b2d96e4f37efde9dc377751844b3314bb8d0e3c59befe2f1a5b7bc0045a164b8b9e1c5c9ee285bf6c2f6152826ef1252ab39577992ce208e5b172e9d03e46c268454a1502697162f175c586821d0fb5a8c0ffd4c56fb8c5cce2e1f7a0efc77a38277faa82580e983c87d4081dd8b5226bc8994114ec7a95f8be871726a6998dce138fc55377f022f84cc97eccdd18e7d61b557d7daea41d1d021e34aab3dac320758ba4f9c2d5fddc5a8072097be37af8f2e5fb4037a11632c6fd9d42c62a2e8263af2db7c83d992c933548e0f5d2593bface422b543cb5c1eb68fab55f0a77683d4532df74468dee8e18a1b32b92fde2dd6a8dad63af74be2f9c4d3a1d7b57711d09e38e97fb72551eedf3c215beb1c0cac6a938ca375bcb5ab7037955122f116659927bdbb741aec609c2c27e3d18c4d5751b52460d0914e68d40014f179d8400db188be2c34a7f98872070b86ad764", + "height": 3, + "parent": "4fcd1d0fccd869c632d4af171b7f3011f51b11bd2e9870bebe8990cad4c5b8ba", + "slot": 41 + }, + { + "hash": "726ef3afa0721efd9f0b42103b45379869c859d3f20c62f9aeae99b557cbdfa4", + "header": "828a04183758207393071a515238dec04e86ee45329121ae6a38051642d6548790ac3325b592ee58209f6a9a363089819a4a011406addcd84e984210ca43f1f0b93f014bf4246b0fd05820349fa6de24709731a7f27d0e4f711d73018f285d2bf91fd0bcc67559c478a2e7825840b09f6a13c3f09e122605486c5a9bbbbde28bf88335006b0d3d980b4cd84852ff319c3ba4c5c1af4e333212b74744bc30a9eae9ca6ef2d19d676bd09a5adc7fab5850b53b6f4e2d0493976a580c32190628b876549b89163fe23d798cc2bb495ce7b72ed7638f00acb1361b67ffb2ecac7489ab8c639db6890a0f2809edd3171930877c25166fe2c6a84ea22cf2a553a43703005820102b9198f78d8dd2a7317bc9ea538806cfd6ae5588b29210cd9554ea904657da845820740dc0a0c3ab031ec83d2737df245cf634f5bb52c30e3f10d5784b498dceaa09184c0058402e844d232e5697feeb57d0e1e24f46f8de86f56d0bf7c984deb5130262fb3bc3119ddeb09933664ff423f419109154efe6bf5f2e30d7f59704fed09f178452078200005901c0ec7ead9e182a4043c8a04117761a9d8c0c4354ea7c9369ff69de42fb61373bbf25ba31aadbb8b5456eb70798f2c0abed98b489aacfebc6b76ad396a9696a2f045f172dc4077a26ab4fc58ef6de644079bcd76e7553b4468e3ec64a52c2bf5ccda05395e1cf6acb1d2b11d88202930f17e17e3233e55f2cc60fdccf05174901d5c655273b8dec2d0665a7473a84b905410e17a1f19a853d25b32f341e11e66e53f61b5bbbdce9419ff8b4a3438dc5f959cb3066161b4f51f848aca11fbaaa98afced6f3eb73033175d25410cdd7a018c8e15da090dd1d8cc71f36408ad6f69797b70eb348856734bfc2e11c083d84a92f997cc1a7399b6dd6ea38e1c82a535e9e64aa39875ef67c21415f076a39f22cb8b7607ff0c5e4d60dc393a7593bbfff567e3db58d6de8fe25f153d654184e24e8e3e71faffaca0fd480c83f96d6b66657c490b49bd76a543df7855949494093c385db0104f6f8711a163e2a9fae72841fb9eae2261808fb1436203b948a4a4b29be573a00fdea79962087ccc70e60fc368a254c6b20bc0f7ce151585fcd2ba76ae8ffdc4744204b5bc354f12b00927718c357791e112a4c26a02831faae28508f708944423e2a1d0c5c9c7a471ed30225", + "height": 4, + "parent": "7393071a515238dec04e86ee45329121ae6a38051642d6548790ac3325b592ee", + "slot": 55 + }, + { + "hash": "597ea69c905c502e35ea5bd693c74b3a0f6a1aab241ea117147588c2da1743fe", + "header": "828a05185d5820726ef3afa0721efd9f0b42103b45379869c859d3f20c62f9aeae99b557cbdfa4582022ff37595005fa65ad731d4fb112de050aa0ca910d9a3110f56f3879d449f88e5820da90997ba81483b3f2b4de751ba3ece6ba6d50f96598eb0940cc7d29452cdcb98258407f9c8e79dc3f5107b7f6848b6cc6840edc7460f62a77cd89d181688cf4bf72e060b4e18b9b4081ce7d87e9db14447722b18fedac8c14a1eeaafc8e5ac3bfdfcc5850e02240162fc946c3ab1bd96a1cbcec528012c133a7e53a485843749c9a58532728ea1ca792b4b1520cc9df28d6cddb85c1de90cfe728f891ed3ae37587b84fbf584be9d27bfa1e84fde943e1b6addc00005820dc6872b1b852fcf748b814ef7322e478f43f9ea5ce36cd55dc3c2969c9b8a336845820499fc5dada1544be26d7cd3b2851fe955b44e560b50901abc71333d5d449eac9182e005840595a9a329b2637b8f2cb501aa793a159acc928a27c01e1ef586508492a68cabeae6ced714421be1f648bb05c7196f38e7aa4a8f616ad46e32c84e67951657a038200005901c06317ac6fe141f1acc49ae94aecca9f48d74bd7e95feedaf9bf4ecb26e4e43ba5041cdd94cf53c57beb2fc819058c1183bf3c392e8bc1632368779be022222501472338fcc8b178f0ba10f8683725c5df444b7fc6a5afc3c7fbab82e00e7df2d247c673d066eacc1dc7860c10b134c413d71c5a073a5f3e66a17f0d25dabae2699d7b4a969e129d627cd7839995ddf40a3e6672b6d03936de782f5e0dc31bfafdccc5d5d2e5e9a5b3414bface59a824e3a574250474d633115af821b63232de753fddb638606b93b853144dd75692b02e73b2ef8621eb1bfa307cfda8acaa2c43f8b673c9ed749e472cdf2fced20c063a2507ccb985d2b5a9bc77699f42379fb349e1e3a1ab86d1bd510c6ee89720f860d55c208dd262f49746d8fb2a7817d038262a6b266f98f427fc8b958f11adb8c84cc96444b1f5f9d994a4fd1adae2f2be87d8c1dbc0206ace7871da50cc92476d3fced6a4fc2809c8bb47dff992b06259c21f78cd6e72b49b8fe101065aaf243003af67a11d5aabcebf1059b3c92493f954507573a01bf92047ef68f4e980df914b360307b78b3371138b4c1504e155f704df9fabf1bc87ac47b3d5cd563cee6017380e4df6529face9cf39b36277068e", + "height": 5, + "parent": "726ef3afa0721efd9f0b42103b45379869c859d3f20c62f9aeae99b557cbdfa4", + "slot": 93 + }, + { + "hash": "bfa96cd376052c78a93d1941f68bdfcf5abf51c1988091f52f2c568f0916eca8", + "header": "828a0618795820597ea69c905c502e35ea5bd693c74b3a0f6a1aab241ea117147588c2da1743fe58205a177476c40bb96ea1f9d241d0d1651ae08104bfc54337d356f951d59404a4d2582037264127bcb2df028319e576fbe8727a7d9b2d1cdcda8b30c6cd377f0630bbd882584001f839b792df22baccbf707c0e35f93e470ec6151039c50c0c97100f652657dfb71005376bbe41eca2610e539760427c664f236b4880d2e392bff3e21a5e079f5850ed7dcdabc128ff41e0cca9e1c5d2a1ffd57be159655d5fe1644ebcd215f4bd0d88373042b9f782fb7fce206e24ae8fd3180ddb57a22099264b4e74a1e1c8db43a68d7beff733f4b4390823170e337003005820a5087cbb3f5882c880ed581fcf0d38b7b6909a2a1cf8eefd8ed26de602825a7f845820338f92308f2f1d0dcabc1f1e3ad061c8b6e32679fee51431a43dc32efec5a0fc1818005840b3bd852c4a9a2d8f740ba727594f91c227a9dc638d2f27edce75b140bce7a12d62c0dcca2c832e3c8904e0149d2bc62e20e42605f6e0444835a9ecf2f462000e8200005901c0dc33c2ecd2baa2840228846d4dc991bedf0f2a22074496e28c007ac7d0a31fbc241d214d73d7406dad96f7cc755aa01cf5c0de2a2a74328e840053c7c01f95072a33fd2dc4086d99d1309eee46f49e76b5d9f86465fb0ae9f1b3dec4c8e2c15dcb0120b19dd9e1496fd9350141f284d40e2350e86404f031597cefa7063a4a35e92b198a7888cb9397d81e563e067f3e0f5709159027827cc74fd3ea0583051a1cbcb8f3cdb6280b50138328292f33b6b7dd202214124507fde1789777f1737fd390cef46fb8ae253be49c8d3b43aa48387f0e50a32c3f2b6fe25613e06e4d3873903f3ddbef0d2d520380966869fcf11a1dd7275b1b6cccc313d2a718de1b2ed2e5fc55f72a46076eaf27598525fe452ace332397e8a2687d494b086256933ebfd955443d19d647a98c17f0472d136b4ae46d4548cc837ae9ea18449b259f3eea3820cc09fd0ee8dacd88f36ea31d266dbab5ee6ae55142594774498e7e3a3ff3fad6228c6e1fe23e3ef39e2edbe258351d9a1b8b50aa35a9f5e3e6c4f376d16948885aae058502fd5d51b5f6bafa8ec285d1cac641488bdaf90d99331da3edd4e2db2ac63975bb6791ba02822a7d25ea87aa5b3756ed3decb5ef8f09970600", + "height": 6, + "parent": "597ea69c905c502e35ea5bd693c74b3a0f6a1aab241ea117147588c2da1743fe", + "slot": 121 + }, + { + "hash": "64565f22fb23476baaa6f82e0e2d68636ceadabded697099fb376c23226bdf03", + "header": "828a07188e5820bfa96cd376052c78a93d1941f68bdfcf5abf51c1988091f52f2c568f0916eca85820be62f79f3cfcaa5e6986b864daff9debcfae34ad53a36df2faee406c67ac290d582088a86b524b9f5f6b5319f1a3171c0031fa97842df2ffc5d29ff7ec4c0ecc05f18258404f5d48647954a38346a51a7e6eaeb78c4507cf445dee612c2a9a61d6e97e8460e0ed5420c2b58194ad84a1a1c6e5094448aedebe46d1143112a6cdf2e73628ad5850ec2f6916cdb9f6b78f2b96f08c07d2477fe09faaeaa10066afa382980b58a2e3fad742b3fa05875eceaad3da9c3622ca28182fc77ad7f9df85d2bea26b125b81010fd6298a7fbf9fd11d6f4a6dcdf20f005820493d8d892a8ab8e5387849b34d7954153b334a8a677bf16187db0e926210a7cb84582020a37cd965acd0de0280f5e0718b30bfc3b1aceb8600e370b39c43427f66e391182c005840c681c005d6df951680b4b490fa801a62780d96e9f71c3c8e2ca23ae6d2ee05c5d0bf87365103292cad2a469db8289f7ac3e451a1151dd6c38892fb6cf12bd4048200005901c084aa0fd95adf481f4bb1ffee3358719255066f127a36bad60ef9f6ac6ff18fc8955223a020cb0d03f942c9d42065281b249485e341d6333255ec50064075060eb1b31c4c85c89b7ac3440fc9032b7a482bcd59a86bdb03806b96b8dacfe77ec03fc82c59fbc5fc91eeeb54dcf090bf32c704e1bb2137fa582499fea349099a4229933a23f86307a1e0bfabd3be96ce88e1d8301ae9496f90faac04d4566febbf3f8734df4cb9d8b6cf956144e0b62b27e004a86101c8fc366b95afc64577986fc07595d4fb4957032c05c2ba22d00e2f77bf13efcb87b77a432490009d8a03920be66cdf82ea3dec218a5d4a95636996b696b66ede98c1b25703f9d8143c8d09bfc76ebd9985b443812739fcd161fe01b49c25ede6df49fd0a838f8b531644c9ac8f35e3c2872576916098c31a26110952b2f076c216a512bcb18e6b2003c1aad1b1b155842af6fdc031af4edaadd576eab871368b8fdac1386878e7883340cfebdf82d43ebe2654608eefcbef56ecc8eaf8bcf56fe1461e866cb7a1a8ae3b10ed3883a99a29b842c65f6ffa391aaef7d5178eecb4319eef91048772d1cebbaf28d30e5d28357a08504ed0250d1ee71fe0aea705a0c686a3cedfc35961620bea", + "height": 7, + "parent": "bfa96cd376052c78a93d1941f68bdfcf5abf51c1988091f52f2c568f0916eca8", + "slot": 142 + }, + { + "hash": "66c90f54f9073cfc03a334f5b15b1617f6bf6fe6c892fad8368e16abe20b0f4f", + "header": "828a0818bb582064565f22fb23476baaa6f82e0e2d68636ceadabded697099fb376c23226bdf035820cf1d41b669559e9d30eaf310408a8dea605e3629c0dfd7b6d649d4861514d1bf582083f3206635b9182a411e2a9e870cc13f5974507b1f84476c8519ad9215ae46788258409f61612d55b8a980fb443aef29ec5ebb6867e56daeef5ae31221cbdbe0cc73052932dc200074ad1dd7766ca08758c946f726572d9da96ae83e83cf590beb1dd858503823baaf691584230676f935604c98f66335891d6e89bf9ffeda97caa388130478631b982355366dcc7b196d1ca0df4fb62b37591e4a1f009ec353598eb878ca8ff08ad7089800d39b72f6658d1d0706005820b26dce4633b152af05ed751b9e1db5ae740d561842c26e815942654bc5da24f38458205474aa415f322607b193704e4c4c0554ec74fe68f7a0c880d65660a75c092e9d0d005840bbd78899a963f57f958f23ee2113f5acf830ce54a3733f7f5e9ec66459997dbbe4837e7706f415b8435ded9bedc37cf51e60177ff5d8e753c2638349cf01bf0d8200005901c0cdff07ce69ea86d952d8af47a8bac61863ae5b0a3ac5dc041603c1b523dff52c03a9132c0d25b0a09365489fa96d864322f3fdbd4ae3e2d64815440fa68a5d04c240bf2a1681adcda82378b0cd9f0211c9f7ee6eb26e57ee2b0b92547793e5faa7f183ed48ff763de91c6324f355449b2d96e4f37efde9dc377751844b3314bb8d0e3c59befe2f1a5b7bc0045a164b8b9e1c5c9ee285bf6c2f6152826ef1252ab39577992ce208e5b172e9d03e46c268454a1502697162f175c586821d0fb5a8c0ffd4c56fb8c5cce2e1f7a0efc77a38277faa82580e983c87d4081dd8b5226bc8994114ec7a95f8be871726a6998dce138fc55377f022f84cc97eccdd18e7d61b557d7daea41d1d021e34aab3dac320758ba4f9c2d5fddc5a8072097be37af8f2e5fb4037a11632c6fd9d42c62a2e8263af2db7c83d992c933548e0f5d2593bface422b543cb5c1eb68fab55f0a77683d4532df74468dee8e18a1b32b92fde2dd6a8dad63af74be2f9c4d3a1d7b57711d09e38e97fb72551eedf3c215beb1c0cac6a938ca375bcb5ab7037955122f116659927bdbb741aec609c2c27e3d18c4d5751b52460d0914e68d40014f179d8400db188be2c34a7f98872070b86ad764", + "height": 8, + "parent": "64565f22fb23476baaa6f82e0e2d68636ceadabded697099fb376c23226bdf03", + "slot": 187 + }, + { + "hash": "bd41b102018a21e068d504e64b282512a3b7d5c3883b743aa070ad9244691125", + "header": "828a0818bc582064565f22fb23476baaa6f82e0e2d68636ceadabded697099fb376c23226bdf03582005aa1852c06d7490878d753ded251014a78bccec57a808a3b86ef3bd82a75a3858206ee3a36d9b941fcbb53e647468d10b0ae958d8a77b9f60d2ebd247a05a654c6d8258402a75f0ac75d5a93d6f5e5b24707e5403aabf3a1d88eb3a070a70c3c97949c12a85a8809e28d371ddc64e78ca7c3b59cee5ade5a4051521817ef654f0b3af24625850ae5fc258f45d205aedfdb3e2b0d1dd9bd7efaa96f2f2007cedc128cfc89f4c6f9292f097dba5f857b3ceb1329cd97ffe1bcf72610191df7915d5f6275a985495c75f843513258fd9151f3dec45e41606005820c3f0c9ec15cb5ea301f49032b9a84afbf361caf3f78e81ba6b37f4436f9551108458206fc52b672c123b52948bd394596278019413c1731cc335cc3a61bf3121e6305e1831005840f319400afc6a8848e9feeaf3c9128fe8a5a1c980dea1cabbbee777a95fef1fefbb3095e87e0bbc277e9a4c5baf6b21655b2a984e4507e3e12e68f697f15aab098200005901c007e82466ec742c66bf7a3501515a94e7c7e2e04cab17a2d724e28c829433abc02eaf56018ed6ff9205be9fcb9addf806d7f15ab2db159f6dca17dd31d594ca09ac24643578b384023b70d7a93e3f2435e4f9e38dc65c40df258d7379228b6ea42ea108ce0f27da1e113e3017311451c8972eaf8127f19b900fab6c241f06dccaf57cced81eb964eff669ef38c7e5036eb8d4f8d664bd7b5a50f03dd56e0435ec017e92b07be6ec30c20724593c79648978fbe94501ef85f261eb38209f8a2f829352981606a4c6d22d3f14a0b4f2f37c4b8085974aed296379d80e66f83506b7513a9e3c8b9ad6268994e42fa50be81faae29e8cf62bd7bd75b09a06652f9e0e30b0f898800be71e896a06a157e8ad8801887a2777e10d1d3eb6065b2712946f51b89bd9d239ed01417eef7f09a94eb286a1a4c08e6ad99a767346ec031c3797b4c48e149cb0b5dea39cdf1ba4977433afea1261a9992f207e0b8589e048e85abc751c50b717dc2f3ddc099109d6637cc881d59fd58c865305bae525fc84de10f5728e848bfd0722355748f9dfe3765aad64cccf0c030442258fd81a6dba936803bedc6096ff1d90072ef1a24e231f60c43c3d4b5f31776fe56287ecf228013c", + "height": 8, + "parent": "64565f22fb23476baaa6f82e0e2d68636ceadabded697099fb376c23226bdf03", + "slot": 188 + }, + { + "hash": "3dcc0a38ffead472ed06463f34338d0624c2c19f5117f908c54d98a30c0d8df9", + "header": "828a0918cc582066c90f54f9073cfc03a334f5b15b1617f6bf6fe6c892fad8368e16abe20b0f4f5820a01fafb0394b73269f0ba718760133346a76e8e590ae0b876670c8c4b31e1bbf582092411f9a1a29cab8b4ed1ab4357a25b230c014e3045c221b3346b5a5a243783a82584000f3001eb6f5e99bff9025fc8a06e7db6372381e2f759b20a47dc12267ff6f75a757fadc539f5a516dc98bb0e67e4f390a672198d8addc64308769dfbc68603158500a51fa3fac186fe9ddd55b37670a275735346191359ac4039309d7a49e26180e2ad92a523f3c9fcd3e0c73a2e3c046db0ecb2725839b77268f21e3fc2ea9f040eb5144af9edea3cc94fff9255c99820d0058209c2187596b43e20f304ca797b40645b37e2ad3e6ccccd319eb34fa5032fcaed58458203ccd81ccc58fc2adc69ac3cb20e6ee56598cf0603e9564cca9aface763d94c3c18500058400c4b28e1ae2bd14f9399384d45ef9267e5ff2a0e74c56bb6de6263bca3dd25c50852642b40e1fe9ad3f2f6ec2878401e9d93066723cba83d54a34a2e2a59e5038200005901c0b2509739b3bd938fc74e88a14c9541cd930d866c66926c8aed835d994e0a6ea14461a445300561f400e0f9e2444fd3e99779543c4c48647bedae4760f3ebc90149a9eb6f25c6175b6d603ee15b913013fb75f9f4a4c5ecedb5bcb3f288fadd520a015063b56cae186454b21f05060a616dcc3753a0fa963791666a3c2359fe5bdc13a77c64d7e5eb106f1d8d9da0968747066add30c07d12eb9ee7fee29f2b0f762464642c1d35adb980792baa73c3e3eece676c9c82858a1fdd34094e6680e037153e75a055c876a511ecd1731111f8512b4edcd831fb1e6013c0e485b4215a2c0fa5639f33ff62a2455e80b6cb5e3cf0ed721aac66bf14ead70fbcaecf89672fe3698a8bc53de555cba5e21a29179e9e2c2b410c1d4b0fd703387ef89fe7af5733e2549c699ec466c25727d72934d38add039c9713fe348a7468ba7f53f2e68a96bcfd25d1119c55f533be28a25e9bcf5ed7f96e57920358e6f78602351b270d70591707c6c1dbb926009a5b19d0ee96aeb92f09125242875f33d74e1fc2cfb72ee67291edee6e5dd11afad4788ac84b136b681cfe905260170a2088933e36be2607ac986a15546931e4f0bbc5ef0d5824bc53af6539a762cb490fa7b168e2", + "height": 9, + "parent": "66c90f54f9073cfc03a334f5b15b1617f6bf6fe6c892fad8368e16abe20b0f4f", + "slot": 204 + }, + { + "hash": "1900c6991f15a9f7bf20bcfe5a5c6ed71e4ae2aeb4a19611920f37b4ed089287", + "header": "828a0a18e158203dcc0a38ffead472ed06463f34338d0624c2c19f5117f908c54d98a30c0d8df9582022ff37595005fa65ad731d4fb112de050aa0ca910d9a3110f56f3879d449f88e5820da90997ba81483b3f2b4de751ba3ece6ba6d50f96598eb0940cc7d29452cdcb9825840b493b5a348d4660639cfa1dfe0edf50f1a21f6c2b5ecb3b9c572a47a077f4d8833ade725215bb0fd1608a0019e865ec30cf30fc2e567282709aaafba721af5f6585091374dbe76596cd34499b2ea2abeec7cf5db3c35ab1185a4a5ed0ee410e70aeaf4de0b7f8439b627d60e9dbe9a9449d6424c3eadb510879f2ebe40da0d78984e9eb58b50d3ab7bb71c179e0779afee01005820536be626675025dd9288c0c2ede06ee5efe88ae43306d1656c67977aaf635529845820499fc5dada1544be26d7cd3b2851fe955b44e560b50901abc71333d5d449eac9182e005840595a9a329b2637b8f2cb501aa793a159acc928a27c01e1ef586508492a68cabeae6ced714421be1f648bb05c7196f38e7aa4a8f616ad46e32c84e67951657a038200005901c03fd82976a4cefd1dbc88a6905ba36e6e8cf177bce55166808d5ac7ff2bf8a31f6a02b6b0fb5369539444cd3e783c58bce85e98dbd0cc0ab67c8ae0d5940fbf0d472338fcc8b178f0ba10f8683725c5df444b7fc6a5afc3c7fbab82e00e7df2d247c673d066eacc1dc7860c10b134c413d71c5a073a5f3e66a17f0d25dabae2699d7b4a969e129d627cd7839995ddf40a3e6672b6d03936de782f5e0dc31bfafdccc5d5d2e5e9a5b3414bface59a824e3a574250474d633115af821b63232de753fddb638606b93b853144dd75692b02e73b2ef8621eb1bfa307cfda8acaa2c43f8b673c9ed749e472cdf2fced20c063a2507ccb985d2b5a9bc77699f42379fb349e1e3a1ab86d1bd510c6ee89720f860d55c208dd262f49746d8fb2a7817d038262a6b266f98f427fc8b958f11adb8c84cc96444b1f5f9d994a4fd1adae2f2be87d8c1dbc0206ace7871da50cc92476d3fced6a4fc2809c8bb47dff992b06259c21f78cd6e72b49b8fe101065aaf243003af67a11d5aabcebf1059b3c92493f954507573a01bf92047ef68f4e980df914b360307b78b3371138b4c1504e155f704df9fabf1bc87ac47b3d5cd563cee6017380e4df6529face9cf39b36277068e", + "height": 10, + "parent": "3dcc0a38ffead472ed06463f34338d0624c2c19f5117f908c54d98a30c0d8df9", + "slot": 225 + }, + { + "hash": "38fbcc947003d8b5e31c5d83e20881add97f96df1131f782978e414a89de4d49", + "header": "828a0b19011058201900c6991f15a9f7bf20bcfe5a5c6ed71e4ae2aeb4a19611920f37b4ed0892875820df541b1fbd09fc825a48cd82ea1b2788553b2d72db86c4397b017db6fb4ee6e05820f80ce1e74d580c078c2e6cceeaaf2af18c87d72e85df14897ced396a9e803bf48258402c0670be0f61fae80eabd8b35421cc93161b9be6aa450320c5fa9af6ac50c8c8ff9af28338e27abd683ccb22d3923936453fa3201de03d7f0b66e6192c19212d58504d7f1025985a78254928935a194767583b87e0e7ce4a3ed8e2cc5fdae33976851ac9be64d45faec0114779481b4239cd842ea9d82785b059c92295c476c273932ec635be2ee68548102c08db9a1b5c050058209030940586f6027d7423d1f541d379c14f4d2ccb067366797154a39901c3fb1e845820e2dce0eb82d7bb4ca48269ebb93b70374185d6dc9e0e9f10de35ce2d8fd355000c005840d1dc8482d252de52a3e8868ad0325d50a10d2de4aa2fe8508a81edfe26897d93db3ee72346158f1b136db7ed754ac7a46354b6ae357dc8ec4be9857e35aa7e0e8200005901c04382921e630a6bc368755ff723b0aec652043f550a3fbfa42ffe16507b1a942f10695f24f4155d88547a9ac447a5ceba2c409ed31d0db6f75da346a40aabea04123f03f1ba839244e816272ddebfaccd07b396c7d4e7e8127b65e28a34be2af6d99954122949e55f47def97ae436cb9975b8a70ec77c4e57f48ceec0f4c19093a99991ea07b4b34129340df6cba7f4e2a99036c15e2309de61d20d77ba801603cd42f57f6fc3fd127dbb2923dc40375f1d11d0b6df7a73e6178c42fb62221a907e2126561b88861eb6d764dd5abd0a02cce6dd3baf659acd10c78bb17c48f7035a0c97618c6252664b9ce9541451047d47b888f01b92fb499940b9a5570c7b5b5e938563dd88a5483aafec9d89e92d14aea22a0a9b8dd77e7fcf14b4f58ea4b24be7a3866f9e9fd4646be578a2ba3baf516b6cf5b543267cd8bbd9684d4516733b782437363ef2bbcca05cb0de5d5163d29645b1f58be7307037ad8ea25494c204906d3df79b42e8529a7e9a98a51d9e31f116ec499ebbab55f0eba55bfc8763cc3d6a9824fb4514cd46aaed452cade04436f0c26c5e156e3d9d5d6524cc85dff4676d1eceb7cde887cb25345e7447b36d36f62ae2e497ebdc03b2f05f167604", + "height": 11, + "parent": "1900c6991f15a9f7bf20bcfe5a5c6ed71e4ae2aeb4a19611920f37b4ed089287", + "slot": 272 + }, + { + "hash": "a7bafdeab754f4636be9e4fd6c227fd083ecdea14e313738015827fe303283d5", + "header": "828a0c190135582038fbcc947003d8b5e31c5d83e20881add97f96df1131f782978e414a89de4d49582005442bb4e671ee9f6adb69c74ca5b3af6b3a407c97429856e80d8c4090d64d3f5820e0c61af1967457770433454c2b27cd6b922427f8ae13148c8b09f53ee7a56710825840ade63f510e852ec2bb4f0c37a8b47530fee73b9cb0068a0227ed541cfca2287dfe59dd9175c30f81f63ad8553fcce9ef1034ca08cb271c1c03638968d4f815ad5850308371ac0e3ad80c173da27a0643a90a5588070830f39e142ad3e52dc632ae02b44a7e6144bdaa302fd5de903affea0c5297a4c798bedc269686e14091f8f3119c078492c8a767d64d8262cf78bc0b0d005820a8743cc85987efb48c6052334a6c68fa34fae1d96683856b5bae643abcf4a20f845820dcfdf1559b3dcaea552e088d31e2225f3798b682571e8693d88e8437fd42110a184d005840c12b51de34fea0bbd6c4979d581669913bf95dc4f16d13857c752af53b31d4080e2ce0ec2fb289ec32bd82aad457750ce35698052309ba2c386f67d48c6c2a0c8200005901c0dcccca6e93e4b0357eca51d96f23d6b812c61d8be1929eca53ba5d92526792d1bdba10d2283f926c6c932d4fdef176f41379016f986150ab1db2a4b9b3d11e061a3631680c81fd0642ee45aeedefa4ae83ebf2c78a681a3f831e50c628929c8b5897e0f273ecfab8671cda14da4d1a5d44d9337270b394b4c0a03e1912eb755291a64261efd6984933d34e22e5267056bbcb58ac74362e3b9bec47024ac873539faa3cfe89bb91571cb1bf47f14445ae3a7734afe96d6f7c683b64683e1ac525f1a8bdaf43285cf8ff621478980cb756ba86019bdf1baddc904298c573015a8971d8215977d748c327d9dfc06c1a65539feeebb7898cbfca7903088818a96bafc14119ebba5b1afbdee35c292389ebd0bd318f4b7d48adca59cb2b7ed66113575cd3bf11be8549bced3cfac0c66b6ce83b28238e0de549d46aaa281a0d39784b7b46a29fff240c7aacfd49b7d4a0ec4dd0b6dab0f1a08a51c3fd796cd1bda647208509138b9278bd30b0208bcbc683d7f58db1568c6b06d0a9aca741fe39aeef7c253a04279ba7a367b2b4a870c3e2581add3e5824bcc9dd53bbaee2aedcbd58fa8ef76c7c11b3b6df977e036ce5cbfc1f7c974e70abf035ad72b8a5e0be09ae", + "height": 12, + "parent": "38fbcc947003d8b5e31c5d83e20881add97f96df1131f782978e414a89de4d49", + "slot": 309 + }, + { + "hash": "a45d606f75c663d8eac869c590ada997bd51442c2581098daa3859ac021efd59", + "header": "828a0d19013a5820a7bafdeab754f4636be9e4fd6c227fd083ecdea14e313738015827fe303283d5582009b54b526e6c5afb4a3c4362f199f243bda856e248c2de99156b5186562c08a1582021e64e133738bbee188311034a4f03103e0821a6c0e632f499e96d45d379b30082584065006a42cc18c9b07cc4bd66f70334f2b553e8305aad09d43b086c373e4d5c3683c1965fbb4b037b7c2c42afb24cb128a1d980c63937dffdd0ce847a36cf9ece58502dd6b642368e25c6cb73f094e7987b52e84cd575454b097a07da5b6f144058d58c3a8c62605e899be6691f2edf8bfe71f1a962c735e493bb4897efee47600d77c10ec90d7fb78c421a77221e5aee7800005820e25498225dd37f6cc3a86e34e06fe41444226737fe1d77b7c9adbfc90a8c064d845820a7d564335ced2b5ee9edd8ecb349f31822001a398d0ba5859e57715d696c6ebc1818005840c697536217d7492be9a280e147c5ae4a22dd0bb8ba765f45027927c587993dcb3e080df2aa3ac218d53a1afd5a4e9215cbe79b390e28cd9ff405464824f2710e8200005901c05d3bbcbd11e28469beb6b355329b836cd0367d6bf3517ce065689735eb7ac41ac47c2717c13c88cc55985ce598ccefa5bece0046e1e34a5f047bc4c04830c108fe9063bb6c7ffb23f3a85e936f906a1e1478be1b5d015c8d3d78ce5a536558ac25177143dcf1dc132c17d29d3cbf0021f048f9efd73d5d54313adcacdf010db9006c13807ac6128d25f2ab28b755abf844e50c1cf772ee5314a79ee8ac338b28e154499794b6477d7daafca6a41ee1c3a3bbd86cd860f1702ce69d25d10b46aa9ec5e31a2e91a8db0322ff68a383f14d2560ffd1144a020ba8ba7312e314932cb1137e21fde4ffff49e6352a932bf2772ea2ae98dfaf881a80d369caaa2db1dc25ebf19f2710cbc4ca12bfa7fe5978dbb0e6018745dabcad22091655e66ba15c3bedbab0ff7cd73107dca9e44cbd79f79f42f4e4babc9311157a0f48befea2e122a23e940b0420c2dbea9b710d5e1df7cbf1f65e6f6576209d6f676b91ee38f374e8e34da0c4897935fd62eaa4414678d133b6c3a819015707fbc1be3f35f3917ee924cff5f0ebe56cc4e90bbf76c4c80d7b8da18c2cf98005f54955499da7a8f581e4c935a0f5ba5c61f1717662e80d7b82c3a4ca01b1284ff95e0522f50878", + "height": 13, + "parent": "a7bafdeab754f4636be9e4fd6c227fd083ecdea14e313738015827fe303283d5", + "slot": 314 + }, + { + "hash": "75114e641531fa9a1025d03ece87e26607eba1f96eb67958523c8967f9cd3f0e", + "header": "828a0e1901575820a45d606f75c663d8eac869c590ada997bd51442c2581098daa3859ac021efd595820df541b1fbd09fc825a48cd82ea1b2788553b2d72db86c4397b017db6fb4ee6e05820f80ce1e74d580c078c2e6cceeaaf2af18c87d72e85df14897ced396a9e803bf4825840e3b47ae41c37c61f47dcc581b12536edb2696b0ff06fe3779a7a362f94ecd9413a59c0b8ced1e1689a11b1244562e3b428ce085f551c3627bad1d62c8e2235b258508fea74157df620c0f5c316e8219ffdc51a53596cfbe5b65a24454760b27a34fc8abd2fa4aed0ab0b7f75ea0970081a71f32a9207d15c01f3668b34e410b6a5e8cba62d6c9f62737f11345327489590030058205f74198f469ad28a72766552a4fe6d6fa80cf0404eb29f43ea7383418d87c442845820e2dce0eb82d7bb4ca48269ebb93b70374185d6dc9e0e9f10de35ce2d8fd355000c005840d1dc8482d252de52a3e8868ad0325d50a10d2de4aa2fe8508a81edfe26897d93db3ee72346158f1b136db7ed754ac7a46354b6ae357dc8ec4be9857e35aa7e0e8200005901c010b118010d227fed6a55f92b4291d6fa82e5e2a20f8ea256263ff965e1ef91ac779eea20799fb1cee391bb33c5b036da40a6773322128c9b59f3f5434c638409123f03f1ba839244e816272ddebfaccd07b396c7d4e7e8127b65e28a34be2af6d99954122949e55f47def97ae436cb9975b8a70ec77c4e57f48ceec0f4c19093a99991ea07b4b34129340df6cba7f4e2a99036c15e2309de61d20d77ba801603cd42f57f6fc3fd127dbb2923dc40375f1d11d0b6df7a73e6178c42fb62221a907e2126561b88861eb6d764dd5abd0a02cce6dd3baf659acd10c78bb17c48f7035a0c97618c6252664b9ce9541451047d47b888f01b92fb499940b9a5570c7b5b5e938563dd88a5483aafec9d89e92d14aea22a0a9b8dd77e7fcf14b4f58ea4b24be7a3866f9e9fd4646be578a2ba3baf516b6cf5b543267cd8bbd9684d4516733b782437363ef2bbcca05cb0de5d5163d29645b1f58be7307037ad8ea25494c204906d3df79b42e8529a7e9a98a51d9e31f116ec499ebbab55f0eba55bfc8763cc3d6a9824fb4514cd46aaed452cade04436f0c26c5e156e3d9d5d6524cc85dff4676d1eceb7cde887cb25345e7447b36d36f62ae2e497ebdc03b2f05f167604", + "height": 14, + "parent": "a45d606f75c663d8eac869c590ada997bd51442c2581098daa3859ac021efd59", + "slot": 343 + }, + { + "hash": "5401ead94d19a9375621adbd04ab2faf4f8435ffccc567750688071a5f90401f", + "header": "828a0f190159582075114e641531fa9a1025d03ece87e26607eba1f96eb67958523c8967f9cd3f0e5820be62f79f3cfcaa5e6986b864daff9debcfae34ad53a36df2faee406c67ac290d582088a86b524b9f5f6b5319f1a3171c0031fa97842df2ffc5d29ff7ec4c0ecc05f18258408bdcb127efec7dae9902f779e23ae96fbe1a1804cad82711a9807a3c79b4d5cb4ce930fc61573b3b9aa5501552ef4eee8ce826cadb73660b4e542b0818ee7ed35850b72058773c0003b5aa13f36bbfbc676e65d7077c2fca6e2ee1e88b71426a35f8b675bb3dafc879fb363ff5e5b35819c9950411f0a181c7588f473b546532133988c60c220e202dd3759127997a31270d00582066ffb9be8ca75f501b6ae07db6ee7f7355f15ac307001c6f30305f526b7cb7c584582020a37cd965acd0de0280f5e0718b30bfc3b1aceb8600e370b39c43427f66e391182c005840c681c005d6df951680b4b490fa801a62780d96e9f71c3c8e2ca23ae6d2ee05c5d0bf87365103292cad2a469db8289f7ac3e451a1151dd6c38892fb6cf12bd4048200005901c0b1f6e3b830b128de88df804e43a24437f1004a57d6c6e92e9d53f0b82c4b0918f2465fe35507ca166474634a33dca95c096e2af44c7d8346c74eaa855ff0920db1b31c4c85c89b7ac3440fc9032b7a482bcd59a86bdb03806b96b8dacfe77ec03fc82c59fbc5fc91eeeb54dcf090bf32c704e1bb2137fa582499fea349099a4229933a23f86307a1e0bfabd3be96ce88e1d8301ae9496f90faac04d4566febbf3f8734df4cb9d8b6cf956144e0b62b27e004a86101c8fc366b95afc64577986fc07595d4fb4957032c05c2ba22d00e2f77bf13efcb87b77a432490009d8a03920be66cdf82ea3dec218a5d4a95636996b696b66ede98c1b25703f9d8143c8d09bfc76ebd9985b443812739fcd161fe01b49c25ede6df49fd0a838f8b531644c9ac8f35e3c2872576916098c31a26110952b2f076c216a512bcb18e6b2003c1aad1b1b155842af6fdc031af4edaadd576eab871368b8fdac1386878e7883340cfebdf82d43ebe2654608eefcbef56ecc8eaf8bcf56fe1461e866cb7a1a8ae3b10ed3883a99a29b842c65f6ffa391aaef7d5178eecb4319eef91048772d1cebbaf28d30e5d28357a08504ed0250d1ee71fe0aea705a0c686a3cedfc35961620bea", + "height": 15, + "parent": "75114e641531fa9a1025d03ece87e26607eba1f96eb67958523c8967f9cd3f0e", + "slot": 345 + }, + { + "hash": "dec730545b2ff80c3e6e83cffa91d90025fdcf8d254e0dde29edaa145fa75627", + "header": "828a1019017658205401ead94d19a9375621adbd04ab2faf4f8435ffccc567750688071a5f90401f58205a177476c40bb96ea1f9d241d0d1651ae08104bfc54337d356f951d59404a4d2582037264127bcb2df028319e576fbe8727a7d9b2d1cdcda8b30c6cd377f0630bbd8825840ca2117324454dcabb6883ae978674532de943b8011baa89f57b7703fe780a04c33570b92d05b9ae288d57ce2c72e2e5a18076c83467fc31c9e6ccc35bfd4c90758506f0d58c4c19a303d11f86a7b63a5317537b9d0d603cbac51dd5479a65c5485bfcc94128cf5f3795826ed155166234bac202456c80bd441abb9ad3cb69290843ec58dd08da8c53839982120d1aa52920000582068e1ac2203c6d60ed68db32f586c3695a0277272b17822a9622d0f5980a256b8845820338f92308f2f1d0dcabc1f1e3ad061c8b6e32679fee51431a43dc32efec5a0fc1818005840b3bd852c4a9a2d8f740ba727594f91c227a9dc638d2f27edce75b140bce7a12d62c0dcca2c832e3c8904e0149d2bc62e20e42605f6e0444835a9ecf2f462000e8200005901c00f40e59a0f07a2aafb3cd75c862fb1f742748283f81e23f0fc9487ec31734e4390dbe570b9d0fc0f89c52c1dd7d04c2b68554106b664635f6ca5d77c11801b092a33fd2dc4086d99d1309eee46f49e76b5d9f86465fb0ae9f1b3dec4c8e2c15dcb0120b19dd9e1496fd9350141f284d40e2350e86404f031597cefa7063a4a35e92b198a7888cb9397d81e563e067f3e0f5709159027827cc74fd3ea0583051a1cbcb8f3cdb6280b50138328292f33b6b7dd202214124507fde1789777f1737fd390cef46fb8ae253be49c8d3b43aa48387f0e50a32c3f2b6fe25613e06e4d3873903f3ddbef0d2d520380966869fcf11a1dd7275b1b6cccc313d2a718de1b2ed2e5fc55f72a46076eaf27598525fe452ace332397e8a2687d494b086256933ebfd955443d19d647a98c17f0472d136b4ae46d4548cc837ae9ea18449b259f3eea3820cc09fd0ee8dacd88f36ea31d266dbab5ee6ae55142594774498e7e3a3ff3fad6228c6e1fe23e3ef39e2edbe258351d9a1b8b50aa35a9f5e3e6c4f376d16948885aae058502fd5d51b5f6bafa8ec285d1cac641488bdaf90d99331da3edd4e2db2ac63975bb6791ba02822a7d25ea87aa5b3756ed3decb5ef8f09970600", + "height": 16, + "parent": "5401ead94d19a9375621adbd04ab2faf4f8435ffccc567750688071a5f90401f", + "slot": 374 + }, + { + "hash": "05c824474e5239b7718632c065389f0f9b1a4120a44ef27e4d2065478c50cb7d", + "header": "828a111901c65820dec730545b2ff80c3e6e83cffa91d90025fdcf8d254e0dde29edaa145fa756275820be62f79f3cfcaa5e6986b864daff9debcfae34ad53a36df2faee406c67ac290d582088a86b524b9f5f6b5319f1a3171c0031fa97842df2ffc5d29ff7ec4c0ecc05f182584073df48d337d6fbf497354c60ce817fc8014b67141ad83cb749f238a29a64a77eefdf9f5de9ab51c59d36f4c3fd3693e3167aa27a8b59bed5fe1024121433a4f0585099c4803602526a2a6790b6b3813a10fa5c195cd96597fefac74af095d93efd99bd9dd309160ad5b610c18f2e423832938524e409ba382fc709696180cc49661bae91858ee2b14cf51f9d7d0401289b07005820b4e57e88aa2b820449e415ccc452bd521d12c6eb70b03e406d7dd8ef3aacb73384582020a37cd965acd0de0280f5e0718b30bfc3b1aceb8600e370b39c43427f66e391182c005840c681c005d6df951680b4b490fa801a62780d96e9f71c3c8e2ca23ae6d2ee05c5d0bf87365103292cad2a469db8289f7ac3e451a1151dd6c38892fb6cf12bd4048200005901c04595fd571a430146f33b6a46bb4acdcc74e1d5d37595bab8840c5735d1869dc439db24485598e53551e5be231748ed2e2a0e39571418437ffdc2c76f965c6609b1b31c4c85c89b7ac3440fc9032b7a482bcd59a86bdb03806b96b8dacfe77ec03fc82c59fbc5fc91eeeb54dcf090bf32c704e1bb2137fa582499fea349099a4229933a23f86307a1e0bfabd3be96ce88e1d8301ae9496f90faac04d4566febbf3f8734df4cb9d8b6cf956144e0b62b27e004a86101c8fc366b95afc64577986fc07595d4fb4957032c05c2ba22d00e2f77bf13efcb87b77a432490009d8a03920be66cdf82ea3dec218a5d4a95636996b696b66ede98c1b25703f9d8143c8d09bfc76ebd9985b443812739fcd161fe01b49c25ede6df49fd0a838f8b531644c9ac8f35e3c2872576916098c31a26110952b2f076c216a512bcb18e6b2003c1aad1b1b155842af6fdc031af4edaadd576eab871368b8fdac1386878e7883340cfebdf82d43ebe2654608eefcbef56ecc8eaf8bcf56fe1461e866cb7a1a8ae3b10ed3883a99a29b842c65f6ffa391aaef7d5178eecb4319eef91048772d1cebbaf28d30e5d28357a08504ed0250d1ee71fe0aea705a0c686a3cedfc35961620bea", + "height": 17, + "parent": "dec730545b2ff80c3e6e83cffa91d90025fdcf8d254e0dde29edaa145fa75627", + "slot": 454 + }, + { + "hash": "b967de1463e411fe5368b544c4943d23a1f534a8f07ed959d0c971c014894b40", + "header": "828a121901d9582005c824474e5239b7718632c065389f0f9b1a4120a44ef27e4d2065478c50cb7d58205a487ec06ac8f9f228e54a21d81f494eda87a990504f5a980b1f71aa13d905c05820d68a44bed117a61e737741fc787b26135ca7e0d802115d5f389e9f068b55196882584001d1fa15c1411fe591ae1469ad4b932c9d4d2d9665db2a6ccdaf3b735c77f8e1f738bf46ca229694ab3776c9aa1dbd6d9b3019cddce2d857784a6f9936120a0e5850397fcbab605dfe622631e50ad83af397ec5c579880dd927ae394866c7e4ceedbe569d04a8fabf914683a832ba0e271daa40512c8b4ec6e07c51c3e396e1a221dcc0573f11f349f9cd8fdeb62e75fa90d0058209f8279b99e3c4d557b976e4c1b925eb4b6a604c4c55a7f6af7be1b39a658b2fb84582005fdbf2c95125a438bdcd229101252502e108f05ac0870d65494526602a23f731845005840fbd7a9357529a5691c0579f2500b386fde041aadeef632b321b7b8b522012256387680ac3f5090b2f2d03dc27b43df686af2c4c8ee98fe050dd0ea7c96f00a088200005901c0179d9a105f1e411feaf66152095d3213f14d8ac6acfaa6ce23db3708974aeb4df90c6c0c17c1f2b878cbdcc596c47c85f0f6ef44d3ae8ce838f6435471e60e0cc13235d0eb8ca973053893d3588f771b59046cc03fec46e11742086377edec80a495daaa579a6de588deb6fa4a7c0809595f93d68fda859c0ccfb011181dd49bd5f2e67c5626df00ffdc5c1bec266e91682cbc57333c7327cc1d567596db4607e7964e58e6a1dc6f6c9c24ae72243cf9f193f966bee38cbef934863625dde01a8956610bfe98c89429ab2270df7742983eef20dbbd1504a137c00a556ee708a444426f733c152fe8b19d6af50dfda6b3efacde9b71b3c90043a99f216e462af69144576b49bd708cf5c67d93160adf3ad1a39f0b118ad8f78adc7af45dcd4f28c42657fb8cde01fbd496ab6ace5ed6607eb73b610965ddbb78a7fd6714c4ed087fd69f5b133aed19db36919606390333f145b6e44a4ffba76fcf503c19b5afa897a9448beb350fafa9c6aaf29e5e105444d5732445b97170e628462da8969a163587d05081ef2618fe056df94defc1c70d21b41903d8bd77a171c67eb481ec2037260dc8c5ae867a61af91966b30ee9734b0b0b38d63d33c114471cf8dd5fc09", + "height": 18, + "parent": "05c824474e5239b7718632c065389f0f9b1a4120a44ef27e4d2065478c50cb7d", + "slot": 473 + }, + { + "hash": "42c0a5fe638f069eea72b788c9a8c7deba5c40b9b3f4aea09b41cd405d1edf4e", + "header": "828a131901ec5820b967de1463e411fe5368b544c4943d23a1f534a8f07ed959d0c971c014894b40582018837df064b6125a111e33ea813bad260fefc9b358c9a6f593efe6d414f6b1855820b6a49a80648fd97b79c4658137a21896c2cb965c5bfb5341b6bbc1ebd309eb4982584051c31cbb7a7544c95c735df6caf4a53490f0427fa5ac923083268edf42722c66dbf2c267e16c89e0534e2acb1f5b573d818293499e7441b03a2bfc2b1ea554a3585072e4aa905e5dbce296967336041a560de5d803dd43505c333c9187940a8720cc5226aac0c9f85b71895fa14cfba52f95952d3eceba7c40296f9f847bd5d68ec0a2e6ffc655294c08d2a21811cd87650f005820c3f7892c234df731ff838487153b89b6eaf70fdeefe81d784750f9806bcd40b08458206e87b3f3231bc816ab79dbf7ef9631ffa9750c074d56276a9d3537817ac418ed1840005840a1a5f068dee1cea50ecd3206b2cde96c3ffcd9e7101e365fe2a7308274660caa20e69815d37cc4e9d7b93609d4f7787d499c1e54f838fd5c3b5fb6de0d229b088200005901c0af7fba93be00bc441a52fa4cfb278c925cfce8bd338b36c43e07514713478d37f94769a7f1ed3f4ff424690c34ddcd9548ba84ae28b6a0dca5970643061af707ebeb4c8dd448ce09d675ca6291ef83f2b82371cb4c904960430e40d120365011d31daef6cdc3e3896ae2ebce0400f566484c73de8810d337d3c80bc5ae3af9cc68fa7f55478b6b8d3d7e5ac61b2587184899ffd1314e8bc2911a0004fa506e9369ccc438aef33bd13cb6c27766f0e8339304da66df13094b2e31b383d4794bd21c14710d97ac55bbd942952d2511466b9d9cfd9f1035df8bf7f079b8dced90be77f3adf4bbfad6ad2f63befb230b8c7a8ca3771dc1783d1deb0cf6b369e03ec2aa38454f09e9e2fa975ece0ec6711e0370c7e816230adadef96b3a4d6694ef12c7c9002b8371a09994caff169639bfa4e07abc1341a6708a59940df51c155cc1aebf196d8cf3705c9f22764d0bec98b52aff7d4939621dd576568554b854ea3bb80e4292f56f76bf2f68a98fa6e17f6824ba839c2f60905b81d4987195c69e5dda32c884a7112465e00938275fbfba9d331d8b1258110d730bd9fbecd6b6952f69e346e8e4e37a7f7ad035a0ebd89ccd901fcc1ebc80672696861af7bb2050db", + "height": 19, + "parent": "b967de1463e411fe5368b544c4943d23a1f534a8f07ed959d0c971c014894b40", + "slot": 492 + }, + { + "hash": "fdd5fbfbb966ee2632f3a01237498ab06f50ae882dd1836ead57be19321fe85e", + "header": "828a14190209582042c0a5fe638f069eea72b788c9a8c7deba5c40b9b3f4aea09b41cd405d1edf4e5820af9da86d95be558880436e0e16150e759a13937e427dee52508c94d67ef80eba58201f16763f1e6898d544d7f9e569294b0960b2d2c0a9c5effaf1b81aed6feb3cbe8258405c412ba9f09655e77c5bc4fe966e0414b6022919e981c668734644c951c7a60eec35b08e16118447798939d7e9530102735c9a54b0d23ecce4f12e028191369158504c1f616c1ecc096a9b51d33efd5277fb9301d3209e6ebe0698e652ab5e342cce186645523b831b2a216950faabc5fb860c769af9655f0f24d89d8dd29d61f02b4d0dcebad8e751b1ee64b2c535adc408005820ec1586e4785c719bb85223de9bee4db54eda6d1ea73102e0e766bec7f486a19984582033b4783491e8204211596cee996a92865a2a00761c4972ee0f0ee1cbb07dcfc00a005840d03083f0c14c4b60af4642ab1d5530e1b396127c57db5767d671044fb2a92cd55795e3df673f1a68958813bdf4fa09fa2e8d3a6c9bea623479ae2cc8bcef180c8200005901c02fb8d8c276dea8ba48ff07f9cec314f1f6d11ee1b91316c5c171c630add0b43e40604799197235d2f1fd54132019c188a46a3a82fc211a4e2eb2276ca51eae06b32b954dc94768de9dd6931a9bc97c59dd74567448ac09f5228862e2fff750b97ae0f60f555d80843b304b9ca963720a599d0e43626161b5879259bd07c47c57ae3c711d7faa1896c58fc200ad7a3f39c3ca8b5e89814ad8fce112782b8779b4a5f89b45244d3efc05c73121c211d6d233cd82cfaf3e1573ada54adb0f887fc96c797d37c54aa5d232dc72f987cb717f09b0ca199cf84c5ac63ed24baace4a8b322b535330362773743b0946f562cc370cdbef122b242e8c24b1d079bec1733e0d21e7bfaa739a8708ddb99540491e7fbbea15c90fe3079bcc568ab56e07a74e73bc2fa589593f7db9a3298a928a6f0de4971fef3e4964e6c4da7eecbfa3850bdf8402c758c86d91c8e35c1c318f9e5a3f6eae7fcc456e117edf87341334286fc00e692abc03595af3753258ac024429868e89e4d24e7bdabce43676bf25e05c1f05f5973b87da15a2a754cc29f27db5707867d7c9185dc5b1bf5a1865324134cd7ca504dd6bedbf48394755f16e10feac173ce9eaba2620c6f4cd10d24d9b03", + "height": 20, + "parent": "42c0a5fe638f069eea72b788c9a8c7deba5c40b9b3f4aea09b41cd405d1edf4e", + "slot": 521 + }, + { + "hash": "03409d444148026901b853cdc01ccfc2494cd0f18adf6cfe14ec13607d1e3e1e", + "header": "828a151902175820fdd5fbfbb966ee2632f3a01237498ab06f50ae882dd1836ead57be19321fe85e58205a177476c40bb96ea1f9d241d0d1651ae08104bfc54337d356f951d59404a4d2582037264127bcb2df028319e576fbe8727a7d9b2d1cdcda8b30c6cd377f0630bbd8825840160829dcd413a0f203cf02586588c713763bac34d9cdfa0d37a7ffe56d906a86437298c54238c01203b954e0b20d39c3ad7a40d109c71b4b26447682060ee93f585002282850d66e9e5085c9a1ad55ccdcdd077c8c2b786d48e3b935ab8d86e04504d27d46becdf3a9870178bcd7bc219d94304adc6573b1b8f0973a280f249728b1f360be4367ca2e45c0346d00178e0c07005820507b0380c4a36c78e6c90d410421f7fd1a766a983e1bbac668e7df2f7236bb7c845820338f92308f2f1d0dcabc1f1e3ad061c8b6e32679fee51431a43dc32efec5a0fc1818005840b3bd852c4a9a2d8f740ba727594f91c227a9dc638d2f27edce75b140bce7a12d62c0dcca2c832e3c8904e0149d2bc62e20e42605f6e0444835a9ecf2f462000e8200005901c010adaaf43ea6a45b499ddf747b41d082197bf2ccc741a45bc74e2fd505b4623fbea03e5820fc9d145f22690a0ce2adb7256382fa132f99d9801b1b6b7d39b60b2a33fd2dc4086d99d1309eee46f49e76b5d9f86465fb0ae9f1b3dec4c8e2c15dcb0120b19dd9e1496fd9350141f284d40e2350e86404f031597cefa7063a4a35e92b198a7888cb9397d81e563e067f3e0f5709159027827cc74fd3ea0583051a1cbcb8f3cdb6280b50138328292f33b6b7dd202214124507fde1789777f1737fd390cef46fb8ae253be49c8d3b43aa48387f0e50a32c3f2b6fe25613e06e4d3873903f3ddbef0d2d520380966869fcf11a1dd7275b1b6cccc313d2a718de1b2ed2e5fc55f72a46076eaf27598525fe452ace332397e8a2687d494b086256933ebfd955443d19d647a98c17f0472d136b4ae46d4548cc837ae9ea18449b259f3eea3820cc09fd0ee8dacd88f36ea31d266dbab5ee6ae55142594774498e7e3a3ff3fad6228c6e1fe23e3ef39e2edbe258351d9a1b8b50aa35a9f5e3e6c4f376d16948885aae058502fd5d51b5f6bafa8ec285d1cac641488bdaf90d99331da3edd4e2db2ac63975bb6791ba02822a7d25ea87aa5b3756ed3decb5ef8f09970600", + "height": 21, + "parent": "fdd5fbfbb966ee2632f3a01237498ab06f50ae882dd1836ead57be19321fe85e", + "slot": 535 + }, + { + "hash": "5d3cbe4d673988e02fbf1f87de1111896286a78a46e82650ecd3444796100a52", + "header": "828a1619021f582003409d444148026901b853cdc01ccfc2494cd0f18adf6cfe14ec13607d1e3e1e58205a487ec06ac8f9f228e54a21d81f494eda87a990504f5a980b1f71aa13d905c05820d68a44bed117a61e737741fc787b26135ca7e0d802115d5f389e9f068b55196882584014d6299e4813ef7d9d45454e6bf168d032d94e76a0948282ce48badab275fa8a92ab8211e98875dec8d106ba1ef34264f41ba68dca694af3c4a62fbe06076fd55850b212719c6cdb85f04ca70428ed23e54945da3553e777209a0945af7c4348908f0de5752788acc60d467351a6c800c1e1720b3affff1d7d8d5a01edea991faec60025dcab667cc1edd8b4246ceef76d0f005820cb0a3366a57ab3d112db06bee13da4c30c68f9ec1425cc08ca52fd5db97f16cf84582005fdbf2c95125a438bdcd229101252502e108f05ac0870d65494526602a23f731845005840fbd7a9357529a5691c0579f2500b386fde041aadeef632b321b7b8b522012256387680ac3f5090b2f2d03dc27b43df686af2c4c8ee98fe050dd0ea7c96f00a088200005901c0a1d99e5976c609814a2bafd5d871e53bc0ca6975c28d5bb43a8a7c4c67501222f02ad9b7c4fa2bcd252e3b54fd69d79a95dc14552ac51186499f0f4234841c00c13235d0eb8ca973053893d3588f771b59046cc03fec46e11742086377edec80a495daaa579a6de588deb6fa4a7c0809595f93d68fda859c0ccfb011181dd49bd5f2e67c5626df00ffdc5c1bec266e91682cbc57333c7327cc1d567596db4607e7964e58e6a1dc6f6c9c24ae72243cf9f193f966bee38cbef934863625dde01a8956610bfe98c89429ab2270df7742983eef20dbbd1504a137c00a556ee708a444426f733c152fe8b19d6af50dfda6b3efacde9b71b3c90043a99f216e462af69144576b49bd708cf5c67d93160adf3ad1a39f0b118ad8f78adc7af45dcd4f28c42657fb8cde01fbd496ab6ace5ed6607eb73b610965ddbb78a7fd6714c4ed087fd69f5b133aed19db36919606390333f145b6e44a4ffba76fcf503c19b5afa897a9448beb350fafa9c6aaf29e5e105444d5732445b97170e628462da8969a163587d05081ef2618fe056df94defc1c70d21b41903d8bd77a171c67eb481ec2037260dc8c5ae867a61af91966b30ee9734b0b0b38d63d33c114471cf8dd5fc09", + "height": 22, + "parent": "03409d444148026901b853cdc01ccfc2494cd0f18adf6cfe14ec13607d1e3e1e", + "slot": 543 + }, + { + "hash": "6f582e017fb4a4f996f2ad1965bc7a557551d3a0dc71d3081be5a8ecaf9c4a0d", + "header": "828a1719025058205d3cbe4d673988e02fbf1f87de1111896286a78a46e82650ecd3444796100a52582005aa1852c06d7490878d753ded251014a78bccec57a808a3b86ef3bd82a75a3858206ee3a36d9b941fcbb53e647468d10b0ae958d8a77b9f60d2ebd247a05a654c6d82584088ed43f8dba3883daca173d2f38fb77c9a4188b968706c45efc08a764bb55604af0ee7f2f539cf142846272b787d18dcc67249bbc6a58be5a6c2403149b3038858501499e42d6f56cbbca8e6042a9cc204776e5889e21f52b68c069dabd3dd7b59f934d0345ae6a6b3f34d2a673f50a0c5834190eb5435447e1f821ec3bd6dd96ce693b86175df367b63607e0f8a357f550f005820fd24ea061eae4f024b33beb3a7c5d7114fdb92e4344c6c2b3edb2d2af5a142158458206fc52b672c123b52948bd394596278019413c1731cc335cc3a61bf3121e6305e1831005840f319400afc6a8848e9feeaf3c9128fe8a5a1c980dea1cabbbee777a95fef1fefbb3095e87e0bbc277e9a4c5baf6b21655b2a984e4507e3e12e68f697f15aab098200005901c0c54604328a4fe389365226a8a1cd44d3168dc8b1dada4070868f2611be4657aead0e0240a163aa697d74a14fed30a45870fa414f4e330a6ed1ef93b321d69202ac24643578b384023b70d7a93e3f2435e4f9e38dc65c40df258d7379228b6ea42ea108ce0f27da1e113e3017311451c8972eaf8127f19b900fab6c241f06dccaf57cced81eb964eff669ef38c7e5036eb8d4f8d664bd7b5a50f03dd56e0435ec017e92b07be6ec30c20724593c79648978fbe94501ef85f261eb38209f8a2f829352981606a4c6d22d3f14a0b4f2f37c4b8085974aed296379d80e66f83506b7513a9e3c8b9ad6268994e42fa50be81faae29e8cf62bd7bd75b09a06652f9e0e30b0f898800be71e896a06a157e8ad8801887a2777e10d1d3eb6065b2712946f51b89bd9d239ed01417eef7f09a94eb286a1a4c08e6ad99a767346ec031c3797b4c48e149cb0b5dea39cdf1ba4977433afea1261a9992f207e0b8589e048e85abc751c50b717dc2f3ddc099109d6637cc881d59fd58c865305bae525fc84de10f5728e848bfd0722355748f9dfe3765aad64cccf0c030442258fd81a6dba936803bedc6096ff1d90072ef1a24e231f60c43c3d4b5f31776fe56287ecf228013c", + "height": 23, + "parent": "5d3cbe4d673988e02fbf1f87de1111896286a78a46e82650ecd3444796100a52", + "slot": 592 + }, + { + "hash": "387d52ca09e6699422dde1090864cdf4d5a44e8eeff34d740701dd4ed9ddaa1c", + "header": "828a181819026058206f582e017fb4a4f996f2ad1965bc7a557551d3a0dc71d3081be5a8ecaf9c4a0d582022ff37595005fa65ad731d4fb112de050aa0ca910d9a3110f56f3879d449f88e5820da90997ba81483b3f2b4de751ba3ece6ba6d50f96598eb0940cc7d29452cdcb9825840b99815aebf7de3461ec3f488398d664a09a7c0b51890b1afb0fd666517a86b71cabe08a3cf3181b2e615e92a9e308eefa8537ec76ff081aaf6bad7985d56a90158504771afe5b062bc2e41a14516e67eb0ee0f63c75f30253ab1f3de3cdfae95f740d704336f43cb1c7707aacc0b52af7f1921ddb599ff9b046f688e4bed1c2f542f14828536b10f2d5c8234404987f0a203005820b3e8adaff1a454ea11853b10cd5a4c1092f5b7952f933c5f22ebcf30cbee8d2c845820499fc5dada1544be26d7cd3b2851fe955b44e560b50901abc71333d5d449eac9182e005840595a9a329b2637b8f2cb501aa793a159acc928a27c01e1ef586508492a68cabeae6ced714421be1f648bb05c7196f38e7aa4a8f616ad46e32c84e67951657a038200005901c09920368c1cdba7c25fb286617b22aa002ffdc6d1c98d1c1538236210b9dde16d3d9acfd0cbe101918f090e6381ed1a20105a072216a1e31b4a0d3e90334d380a472338fcc8b178f0ba10f8683725c5df444b7fc6a5afc3c7fbab82e00e7df2d247c673d066eacc1dc7860c10b134c413d71c5a073a5f3e66a17f0d25dabae2699d7b4a969e129d627cd7839995ddf40a3e6672b6d03936de782f5e0dc31bfafdccc5d5d2e5e9a5b3414bface59a824e3a574250474d633115af821b63232de753fddb638606b93b853144dd75692b02e73b2ef8621eb1bfa307cfda8acaa2c43f8b673c9ed749e472cdf2fced20c063a2507ccb985d2b5a9bc77699f42379fb349e1e3a1ab86d1bd510c6ee89720f860d55c208dd262f49746d8fb2a7817d038262a6b266f98f427fc8b958f11adb8c84cc96444b1f5f9d994a4fd1adae2f2be87d8c1dbc0206ace7871da50cc92476d3fced6a4fc2809c8bb47dff992b06259c21f78cd6e72b49b8fe101065aaf243003af67a11d5aabcebf1059b3c92493f954507573a01bf92047ef68f4e980df914b360307b78b3371138b4c1504e155f704df9fabf1bc87ac47b3d5cd563cee6017380e4df6529face9cf39b36277068e", + "height": 24, + "parent": "6f582e017fb4a4f996f2ad1965bc7a557551d3a0dc71d3081be5a8ecaf9c4a0d", + "slot": 608 + }, + { + "hash": "fe7f705538bbf48aea35c51805fedce1ab3d295efd7f398e781f1747f1a01edf", + "header": "828a18191902635820387d52ca09e6699422dde1090864cdf4d5a44e8eeff34d740701dd4ed9ddaa1c582005aa1852c06d7490878d753ded251014a78bccec57a808a3b86ef3bd82a75a3858206ee3a36d9b941fcbb53e647468d10b0ae958d8a77b9f60d2ebd247a05a654c6d82584050f7566b01840ba8b28bd7d2fc6ff854f09ab9b3b4570df1f5caac623ca16c09b7e89c606337dbd69ceb11a1ee00ea0db87e3b8e57986db758391f14ea18d7a75850e34a2f719fd88cefb5a5af14ebf82c84a9003fbb3944e5e0dbe4fb9ce54c3cca54ef99069b730801f67dfa83df24fc41be19580842dfd902f90d678465b6a275242b32d464779000283947cc2c5efa0a005820d2a307e16f147ca219a0c2b9568b7dc5637bd970a522ef95544e153f8c296a548458206fc52b672c123b52948bd394596278019413c1731cc335cc3a61bf3121e6305e1831005840f319400afc6a8848e9feeaf3c9128fe8a5a1c980dea1cabbbee777a95fef1fefbb3095e87e0bbc277e9a4c5baf6b21655b2a984e4507e3e12e68f697f15aab098200005901c0d85fa7332293687ee12aded02622ffbce9e28b1fa70e910ecfa65c1375c3259f7ca7aaa1513bc10e1c268801063a5997770d6ee35872808405ab2e10bda3260bac24643578b384023b70d7a93e3f2435e4f9e38dc65c40df258d7379228b6ea42ea108ce0f27da1e113e3017311451c8972eaf8127f19b900fab6c241f06dccaf57cced81eb964eff669ef38c7e5036eb8d4f8d664bd7b5a50f03dd56e0435ec017e92b07be6ec30c20724593c79648978fbe94501ef85f261eb38209f8a2f829352981606a4c6d22d3f14a0b4f2f37c4b8085974aed296379d80e66f83506b7513a9e3c8b9ad6268994e42fa50be81faae29e8cf62bd7bd75b09a06652f9e0e30b0f898800be71e896a06a157e8ad8801887a2777e10d1d3eb6065b2712946f51b89bd9d239ed01417eef7f09a94eb286a1a4c08e6ad99a767346ec031c3797b4c48e149cb0b5dea39cdf1ba4977433afea1261a9992f207e0b8589e048e85abc751c50b717dc2f3ddc099109d6637cc881d59fd58c865305bae525fc84de10f5728e848bfd0722355748f9dfe3765aad64cccf0c030442258fd81a6dba936803bedc6096ff1d90072ef1a24e231f60c43c3d4b5f31776fe56287ecf228013c", + "height": 25, + "parent": "387d52ca09e6699422dde1090864cdf4d5a44e8eeff34d740701dd4ed9ddaa1c", + "slot": 611 + }, + { + "hash": "b30bf23d2954ac28a952a024a4a5619e137fce29eb908f3a2dcc6b4abb0fc0e6", + "header": "828a181a1902885820fe7f705538bbf48aea35c51805fedce1ab3d295efd7f398e781f1747f1a01edf582018837df064b6125a111e33ea813bad260fefc9b358c9a6f593efe6d414f6b1855820b6a49a80648fd97b79c4658137a21896c2cb965c5bfb5341b6bbc1ebd309eb49825840afc404865e2a40dd11009ddde20dbcaa52c66b8c9284fa25740df1abcfb43358de09de2f45ac56286ed273ff028974493e126ebff02107d2e1bf6e1c243737f558507b1d2bc98b7d45635735795105f52db9bf6516e152ef06a1a1622249d48fa3be42330bd3b0a6f723562b769c28645e8e825ae0814ff447a2b58bbb7227097fe146b91ef5962fc376cfa4608bbda28f01005820499fa283933d8cc6f31edc89ede3979762b26731caf022f8628e4f595f6222de8458206e87b3f3231bc816ab79dbf7ef9631ffa9750c074d56276a9d3537817ac418ed1840005840a1a5f068dee1cea50ecd3206b2cde96c3ffcd9e7101e365fe2a7308274660caa20e69815d37cc4e9d7b93609d4f7787d499c1e54f838fd5c3b5fb6de0d229b088200005901c05e0929974db62958d3b73a3387bec54b636b3682db1568d1313946c74b59724ecc930c0fe8148e314149cd8e62bbd9130029740ef08ced84f68774143ff74205ebeb4c8dd448ce09d675ca6291ef83f2b82371cb4c904960430e40d120365011d31daef6cdc3e3896ae2ebce0400f566484c73de8810d337d3c80bc5ae3af9cc68fa7f55478b6b8d3d7e5ac61b2587184899ffd1314e8bc2911a0004fa506e9369ccc438aef33bd13cb6c27766f0e8339304da66df13094b2e31b383d4794bd21c14710d97ac55bbd942952d2511466b9d9cfd9f1035df8bf7f079b8dced90be77f3adf4bbfad6ad2f63befb230b8c7a8ca3771dc1783d1deb0cf6b369e03ec2aa38454f09e9e2fa975ece0ec6711e0370c7e816230adadef96b3a4d6694ef12c7c9002b8371a09994caff169639bfa4e07abc1341a6708a59940df51c155cc1aebf196d8cf3705c9f22764d0bec98b52aff7d4939621dd576568554b854ea3bb80e4292f56f76bf2f68a98fa6e17f6824ba839c2f60905b81d4987195c69e5dda32c884a7112465e00938275fbfba9d331d8b1258110d730bd9fbecd6b6952f69e346e8e4e37a7f7ad035a0ebd89ccd901fcc1ebc80672696861af7bb2050db", + "height": 26, + "parent": "fe7f705538bbf48aea35c51805fedce1ab3d295efd7f398e781f1747f1a01edf", + "slot": 648 + }, + { + "hash": "03d2a8882e3b68fa3b5322d9561929132acdd0816d2f65435b6556683ef88bc5", + "header": "828a181b1902995820b30bf23d2954ac28a952a024a4a5619e137fce29eb908f3a2dcc6b4abb0fc0e65820e851ed72bf223065330da4b4c1aa9cdd64acf009e2ce9ccc3ec825c2598efd075820a8b99efbe8bd8fb6f1af06648ef394acda09d5f3acd65d22b316489b52691da7825840e2a33d385dae63a88debbd2cd327ffa056eb51a35058dbd9eb057f1e8e3e468cf41d4c407b8ac298873297bd5478adbbf7c7fdc405b9e3a914db313bddab7bd75850874bdae38ce5f51625cc11561235b601325f6d897b160f0e94d87b88f204f9b937cea019239f1020d4e2744f94f2bb05c06abc6b795213751cecc298f98cce284086bbd05b47aa7c2a2b273446da1b0d0058205b4b2f292da3a3b8f6b5a13be66c97884acdeb9345e5839a2c2a54234c9447b68458206b9f9a45e7ed4d48b431262d90180acc013d4cac89419a907fa280d3aeaca1f3183400584074e51331594815a1d2f549f667cab1aa88c9d0ad0dce619a5a3a1d5a714e5c5247b4bd9e3f8a84ea60f42fc9b326842ba000ce9eeb24b173685c86a3206944078200005901c0ec71e71b534faccfd0e7f688f9ddd425ec1143f5f2691627de0635ae22dfb21883123ca072ea81682d49ea3552a357ae124e6eef9d110eb189cc4f487665340f49e52e9b1d0ead0e54d857c5815ddda8179a71d8d7b8545e04f753d9b7e6d0f5ba91ad9b33beaf1e83d2afef9e37e3786639e16be5e953a1239a1c8323ecd721480e6b8494a0676c5da2745c2aa9dfeda302d8c284f528fcc41229a39455257cb667f4a3e728c95b38b0191bdaa14ffde3dd5c743ff7fd22ee1d5192dbf28722715f9f7a5657c06b1fd73e0da46f660020680004e9b76703f82bc36d6382363ad2ec04425c6e9031b2e1a19188f36b4d2dae71afb8b94fa27e129ede608b9d4628db96efee84ba8a4582f9c0a619807de4ace773edda4570f8021db7cc2c74a7c8a57d7dadfe159b3a52f2d478497a720535d348cf436857a6a55c610946b2a56563daf041aedbeeb426ba200bed4faf746a0361003e60cec7be069a0ad6e03444e0039a6124686c8f4df0fd22225f8ae00a86868cef64dc68d582307f23ed22964050c244e4241be08e766798496e0b6968e290c1ef50ef1805323e6ed9fe7a5bd78215e32b55b817b45145731de78b10f9afb4df0a89713b80a43b5dd8abe4", + "height": 27, + "parent": "b30bf23d2954ac28a952a024a4a5619e137fce29eb908f3a2dcc6b4abb0fc0e6", + "slot": 665 + }, + { + "hash": "52564738bc7b6cf07090cf658ddc4ba5fde59dce8f33ea3cc3f77217172d0e80", + "header": "828a181c19029e582003d2a8882e3b68fa3b5322d9561929132acdd0816d2f65435b6556683ef88bc5582022ff37595005fa65ad731d4fb112de050aa0ca910d9a3110f56f3879d449f88e5820da90997ba81483b3f2b4de751ba3ece6ba6d50f96598eb0940cc7d29452cdcb982584078d72213fb35e9a68e76fca7801267fab896033e15c596c9c280f82b2cba1d4423a9e11587f31651572d6dc2043ed7be2365bbdcc5d0a9adc55404208d79bf62585001c11f31d459a12dc282c59f52b74888283a25101b831b530076ed54159f2a27f23e949162b04e0a9b079ea33f2785f281293c5102b9a0a82ad421f0a1066e1c7abb9e13006490e7d2c27a66af39230d0058200f3dab2a48d0f344531e4aee3f38145a37c090e4e26fbeea82cd3519a23ae964845820499fc5dada1544be26d7cd3b2851fe955b44e560b50901abc71333d5d449eac9182e005840595a9a329b2637b8f2cb501aa793a159acc928a27c01e1ef586508492a68cabeae6ced714421be1f648bb05c7196f38e7aa4a8f616ad46e32c84e67951657a038200005901c06ccbd496300eb388da832f12af878753b5aff2d81b5aef2944ab2e406084665b9ee759440d1f785806de65a9861cbc23c2886f616a81da631ce7134fddb22b01472338fcc8b178f0ba10f8683725c5df444b7fc6a5afc3c7fbab82e00e7df2d247c673d066eacc1dc7860c10b134c413d71c5a073a5f3e66a17f0d25dabae2699d7b4a969e129d627cd7839995ddf40a3e6672b6d03936de782f5e0dc31bfafdccc5d5d2e5e9a5b3414bface59a824e3a574250474d633115af821b63232de753fddb638606b93b853144dd75692b02e73b2ef8621eb1bfa307cfda8acaa2c43f8b673c9ed749e472cdf2fced20c063a2507ccb985d2b5a9bc77699f42379fb349e1e3a1ab86d1bd510c6ee89720f860d55c208dd262f49746d8fb2a7817d038262a6b266f98f427fc8b958f11adb8c84cc96444b1f5f9d994a4fd1adae2f2be87d8c1dbc0206ace7871da50cc92476d3fced6a4fc2809c8bb47dff992b06259c21f78cd6e72b49b8fe101065aaf243003af67a11d5aabcebf1059b3c92493f954507573a01bf92047ef68f4e980df914b360307b78b3371138b4c1504e155f704df9fabf1bc87ac47b3d5cd563cee6017380e4df6529face9cf39b36277068e", + "height": 28, + "parent": "03d2a8882e3b68fa3b5322d9561929132acdd0816d2f65435b6556683ef88bc5", + "slot": 670 + }, + { + "hash": "65e5aaf928fe53e1e8a0774452a7bff4e984e8d17e77f76206b0112e1f657b85", + "header": "828a181d1902b6582052564738bc7b6cf07090cf658ddc4ba5fde59dce8f33ea3cc3f77217172d0e805820be62f79f3cfcaa5e6986b864daff9debcfae34ad53a36df2faee406c67ac290d582088a86b524b9f5f6b5319f1a3171c0031fa97842df2ffc5d29ff7ec4c0ecc05f1825840ddf7170a17e292cbc0eb2eda67fb197b078dba301e7a8a1169ad57d2866141e6a06124426b871e7086238725e26a2dfee5d5c818d789fd2e3cd60b3db7e138f75850776fb37ea5f8d889a63a66699747fac2f28e40b2402a5992894caea31abdb3d102fb65b787c1d19076424dbf054bf00f4bb9930cc5e2eeeb9eec53e213d1fe2386b8e3047e159ff0409dbbb6106a9100005820545118ff6db71ad2927564b10c2ce70bb5863c63d31fe72a59051440d9d4afbe84582020a37cd965acd0de0280f5e0718b30bfc3b1aceb8600e370b39c43427f66e391182c005840c681c005d6df951680b4b490fa801a62780d96e9f71c3c8e2ca23ae6d2ee05c5d0bf87365103292cad2a469db8289f7ac3e451a1151dd6c38892fb6cf12bd4048200005901c0b0ea9ce0cd4c7110ffe2375c8655dd18cb08d561e093e3af433ee65c12b652b725550929bdfd2b14e1d12ac13956927e9986dbdd7e1d1eb6836f1ec338f5760cb1b31c4c85c89b7ac3440fc9032b7a482bcd59a86bdb03806b96b8dacfe77ec03fc82c59fbc5fc91eeeb54dcf090bf32c704e1bb2137fa582499fea349099a4229933a23f86307a1e0bfabd3be96ce88e1d8301ae9496f90faac04d4566febbf3f8734df4cb9d8b6cf956144e0b62b27e004a86101c8fc366b95afc64577986fc07595d4fb4957032c05c2ba22d00e2f77bf13efcb87b77a432490009d8a03920be66cdf82ea3dec218a5d4a95636996b696b66ede98c1b25703f9d8143c8d09bfc76ebd9985b443812739fcd161fe01b49c25ede6df49fd0a838f8b531644c9ac8f35e3c2872576916098c31a26110952b2f076c216a512bcb18e6b2003c1aad1b1b155842af6fdc031af4edaadd576eab871368b8fdac1386878e7883340cfebdf82d43ebe2654608eefcbef56ecc8eaf8bcf56fe1461e866cb7a1a8ae3b10ed3883a99a29b842c65f6ffa391aaef7d5178eecb4319eef91048772d1cebbaf28d30e5d28357a08504ed0250d1ee71fe0aea705a0c686a3cedfc35961620bea", + "height": 29, + "parent": "52564738bc7b6cf07090cf658ddc4ba5fde59dce8f33ea3cc3f77217172d0e80", + "slot": 694 + }, + { + "hash": "8bd65ad6c00dd635aaf4afc45d5d2c3d51dcf7b4b5bdaac18e54ef37bc808da7", + "header": "828a181e1902bf582065e5aaf928fe53e1e8a0774452a7bff4e984e8d17e77f76206b0112e1f657b855820d134281383884d5fd42f0696fa7560fa620220d5e88a176681789151d760199b5820e2428fc1694882b7632ab35a7a9de5d7ca208299fd887d234857ea8061a65c72825840b8a3ff90649017c660f0470405ef2ec995e0906f0a5bafe369795b1a90d950f12b4436576f3863ca8117ab497b6134f71aac906dec5d87be6309a97d3d14593d5850f8e0e20646415fe0f427ba2932bdae556356c5c0eb80413af3a085f6c3d9158f960d9c06768a8146ae685426ab60d6a75ba5d5d04ce79ee4d6c1e5c317210cdf0672f3a579d93f91f32451399788270000582060bd9ab5ea07348183e0284481853a7d57635e0f5d910547ba755c54a148dc878458208caa0b3145e81f2c444a845a92cc804fb6306528822cc30ac3b61badac55a0d2184a005840787abc533e8c1cdbb12b576339670745848c6817502f5a29d35fa394a8ef564f1a661756129c705a0dd08be5c96b07a19ab31eed4dc4b1bf0a5a24469627e90e8200005901c09e9619f1719278993cedea436ad00172d6ad88e4bda3b1120fc62e9dd6c90baf944b13dd8860d83504456886ad92c6f0106f03f4efa953292ee6beab21db4200da41abb7a69d5448046d4741d0e195b91d7c984fb09f33bdd2f2a97ef4fa9e8922a2b0a7dda60412ec3224262779dbf5afbd6cc5c867dc1b36e19b72948f0b8102191d79de24ad6a5c32ac2c2aa03c75988f41b66ef9ebf2e5417c69857c8ab66422a18462fef15e424c2fc57fa8614a95318c3154e30c46b075f8e2724a6bd6aa8396e7791f24bf9dfc977e03899b8b89ed5c2a3cc994ac11823a9ec9ab81a13eddbe46298c27cf8ba29429e7e3372a57a6ef70c716e1126df589892c22f66938e009c0971bc3aafae05b88c7f6d127cc0d651b51c1b5bb79ae359815802dec45b6d750f9415fbc45a612aceb51fc9a8dc9ff2263810acb29a331a3fca427706f0a3192cdc22b23963fd1a315c774de8285b1adee80c609a4d5aceff8c27f86d37da061d6fdde1d35a4902a87d64f62a2f171a66351a88e34493850306eb81dbdf5f1c4ca39c567d3e12b2751d508abca8b94091b64d5e32e943777a961e236dce006446489d579811b83b0279d8f34454c64a266ccd66c188ef242970f96e1", + "height": 30, + "parent": "65e5aaf928fe53e1e8a0774452a7bff4e984e8d17e77f76206b0112e1f657b85", + "slot": 703 + }, + { + "hash": "a8e8db8fc5698b34a1c26889504af2df02c197dd42dfca6d17c3b8227fa06056", + "header": "828a181f1902d958208bd65ad6c00dd635aaf4afc45d5d2c3d51dcf7b4b5bdaac18e54ef37bc808da75820be62f79f3cfcaa5e6986b864daff9debcfae34ad53a36df2faee406c67ac290d582088a86b524b9f5f6b5319f1a3171c0031fa97842df2ffc5d29ff7ec4c0ecc05f1825840e81beb2b668992405f73268dd8217217d5ed1a170cc4e50fe5892df647d5b7e3372f8cc97febf3ad2f8d1cbadac836762fd0c27f7e94fd1fcad7adc42bb12cf45850c3a41e0f6dcdf4ddd2525b4ca9eb3ae46dc05ee848df521d991dac0a949b10181d61ef87eb41e3949304b32be836211ee856c97df9488596ee78500aed06ad934154de0e1c8b6cac578e4109621212010058208f1c87cd9ad29c9c5d6176dd5fd8a4c562c27eadfb7ba213f12002e7e98f7ea184582020a37cd965acd0de0280f5e0718b30bfc3b1aceb8600e370b39c43427f66e391182c005840c681c005d6df951680b4b490fa801a62780d96e9f71c3c8e2ca23ae6d2ee05c5d0bf87365103292cad2a469db8289f7ac3e451a1151dd6c38892fb6cf12bd4048200005901c0682b00ef48a3ff251805304e338c90c558360718ea1c9062ae27d9121fc9faf04154e866497403dd83c1029dec79acccb45baa9e522039f30845fd98525d5301b1b31c4c85c89b7ac3440fc9032b7a482bcd59a86bdb03806b96b8dacfe77ec03fc82c59fbc5fc91eeeb54dcf090bf32c704e1bb2137fa582499fea349099a4229933a23f86307a1e0bfabd3be96ce88e1d8301ae9496f90faac04d4566febbf3f8734df4cb9d8b6cf956144e0b62b27e004a86101c8fc366b95afc64577986fc07595d4fb4957032c05c2ba22d00e2f77bf13efcb87b77a432490009d8a03920be66cdf82ea3dec218a5d4a95636996b696b66ede98c1b25703f9d8143c8d09bfc76ebd9985b443812739fcd161fe01b49c25ede6df49fd0a838f8b531644c9ac8f35e3c2872576916098c31a26110952b2f076c216a512bcb18e6b2003c1aad1b1b155842af6fdc031af4edaadd576eab871368b8fdac1386878e7883340cfebdf82d43ebe2654608eefcbef56ecc8eaf8bcf56fe1461e866cb7a1a8ae3b10ed3883a99a29b842c65f6ffa391aaef7d5178eecb4319eef91048772d1cebbaf28d30e5d28357a08504ed0250d1ee71fe0aea705a0c686a3cedfc35961620bea", + "height": 31, + "parent": "8bd65ad6c00dd635aaf4afc45d5d2c3d51dcf7b4b5bdaac18e54ef37bc808da7", + "slot": 729 + }, + { + "hash": "3d9b4c5e8641fd386a115c53db3bb787123499682b38305e7ad166a5b1701244", + "header": "828a18201902ec5820a8e8db8fc5698b34a1c26889504af2df02c197dd42dfca6d17c3b8227fa060565820cf1d41b669559e9d30eaf310408a8dea605e3629c0dfd7b6d649d4861514d1bf582083f3206635b9182a411e2a9e870cc13f5974507b1f84476c8519ad9215ae4678825840c94198126e4434d15ca953d8f6eb7c4bb057ec4131d39216d6d8029e7a28e0edbcfa29feec00b88fdd7f9a6ddf560678d4b0f1eef333989ea0f03cbdab0fface585028098fb55c61fc06699d7132f8f759cac10eff66b9b0decd32d5853874ea2613224f8d506cce331e0d9b605271639637cc106c70102257e12be12cc200a0538f549bf5dab20193489020040a28370f070058207ef3e6fabb5eb64558bef484c22acf3c87c915df675ec257d07586cddd14450c8458205474aa415f322607b193704e4c4c0554ec74fe68f7a0c880d65660a75c092e9d0d005840bbd78899a963f57f958f23ee2113f5acf830ce54a3733f7f5e9ec66459997dbbe4837e7706f415b8435ded9bedc37cf51e60177ff5d8e753c2638349cf01bf0d8200005901c0da4814e9ea15ed24b3421ec6b648ea5f5a1f84a9dcd1c8afe59ef59bb94fa43eb074da1ba288680090c1ad248fec97061ca612f3bbdc4d3ef380ac8f2b75f005c240bf2a1681adcda82378b0cd9f0211c9f7ee6eb26e57ee2b0b92547793e5faa7f183ed48ff763de91c6324f355449b2d96e4f37efde9dc377751844b3314bb8d0e3c59befe2f1a5b7bc0045a164b8b9e1c5c9ee285bf6c2f6152826ef1252ab39577992ce208e5b172e9d03e46c268454a1502697162f175c586821d0fb5a8c0ffd4c56fb8c5cce2e1f7a0efc77a38277faa82580e983c87d4081dd8b5226bc8994114ec7a95f8be871726a6998dce138fc55377f022f84cc97eccdd18e7d61b557d7daea41d1d021e34aab3dac320758ba4f9c2d5fddc5a8072097be37af8f2e5fb4037a11632c6fd9d42c62a2e8263af2db7c83d992c933548e0f5d2593bface422b543cb5c1eb68fab55f0a77683d4532df74468dee8e18a1b32b92fde2dd6a8dad63af74be2f9c4d3a1d7b57711d09e38e97fb72551eedf3c215beb1c0cac6a938ca375bcb5ab7037955122f116659927bdbb741aec609c2c27e3d18c4d5751b52460d0914e68d40014f179d8400db188be2c34a7f98872070b86ad764", + "height": 32, + "parent": "a8e8db8fc5698b34a1c26889504af2df02c197dd42dfca6d17c3b8227fa06056", + "slot": 748 + }, + { + "hash": "ed6142c5bcd2afb0c012fdb4d2ffaf2979244a244e387cf4738c10c1a786ab07", + "header": "828a18211902fe58203d9b4c5e8641fd386a115c53db3bb787123499682b38305e7ad166a5b170124458205a177476c40bb96ea1f9d241d0d1651ae08104bfc54337d356f951d59404a4d2582037264127bcb2df028319e576fbe8727a7d9b2d1cdcda8b30c6cd377f0630bbd88258405385e7e8416ed813706e222920aed7484709f55cc379bebef8bb26e8f93d7e0fa4b52ced1104e39319752a6013486b1d6c06f39cb1ad68cb7c7b856513b91b21585028a407bfe464469740a7d65e268625a669db60bd2dce38af72a1d8e1cf064be88fcecc56c416df695488278e16b328ba6fd3fce5f0e77963ac0aeee6a79f6e8672f84a06e00c9b8a109a66b8f9a6d10e005820cd401ebeb304f27a56bfb5f1ad6fb94e986fcaaaf5a6fc9ab5eb6cd726199e9e845820338f92308f2f1d0dcabc1f1e3ad061c8b6e32679fee51431a43dc32efec5a0fc1818005840b3bd852c4a9a2d8f740ba727594f91c227a9dc638d2f27edce75b140bce7a12d62c0dcca2c832e3c8904e0149d2bc62e20e42605f6e0444835a9ecf2f462000e8200005901c07e89f83786748ce4c77eb2edb61a602c4b0c15d39e5e34c0cd91e811afd78223eef4692f0ede5291ac0666d98ea7b7f7eb0c8d64cf19c7e9c883552b4a74d1052a33fd2dc4086d99d1309eee46f49e76b5d9f86465fb0ae9f1b3dec4c8e2c15dcb0120b19dd9e1496fd9350141f284d40e2350e86404f031597cefa7063a4a35e92b198a7888cb9397d81e563e067f3e0f5709159027827cc74fd3ea0583051a1cbcb8f3cdb6280b50138328292f33b6b7dd202214124507fde1789777f1737fd390cef46fb8ae253be49c8d3b43aa48387f0e50a32c3f2b6fe25613e06e4d3873903f3ddbef0d2d520380966869fcf11a1dd7275b1b6cccc313d2a718de1b2ed2e5fc55f72a46076eaf27598525fe452ace332397e8a2687d494b086256933ebfd955443d19d647a98c17f0472d136b4ae46d4548cc837ae9ea18449b259f3eea3820cc09fd0ee8dacd88f36ea31d266dbab5ee6ae55142594774498e7e3a3ff3fad6228c6e1fe23e3ef39e2edbe258351d9a1b8b50aa35a9f5e3e6c4f376d16948885aae058502fd5d51b5f6bafa8ec285d1cac641488bdaf90d99331da3edd4e2db2ac63975bb6791ba02822a7d25ea87aa5b3756ed3decb5ef8f09970600", + "height": 33, + "parent": "3d9b4c5e8641fd386a115c53db3bb787123499682b38305e7ad166a5b1701244", + "slot": 766 + }, + { + "hash": "b4d19482383e055ec6d76faa41e95a982b7c53152c78fa3872a95ae200a446b7", + "header": "828a18221903095820ed6142c5bcd2afb0c012fdb4d2ffaf2979244a244e387cf4738c10c1a786ab075820d134281383884d5fd42f0696fa7560fa620220d5e88a176681789151d760199b5820e2428fc1694882b7632ab35a7a9de5d7ca208299fd887d234857ea8061a65c728258404a8cdec01f0815c90a2e1fbdf12a4e2b6179a0317c8dc813314f108b441d3e0cba79fc78c29a3e3c43d00952d2aca52eb996cbe444ce6bd02885db22c46aec5b5850fa1948dc933172d26e456221cd1c2da2dd783e1e4d87de024d3d54ab1eb5da9bec42edee9f1443855442cb44633218cb9d2de3eabc6944642c32d25d2be7a839ba4bf211620a1725ed7570a660d44d0900582070d7f2dbff4c24f725c52d373816314b18bb55bb38bc0f9cb64717ac9b474d9a8458208caa0b3145e81f2c444a845a92cc804fb6306528822cc30ac3b61badac55a0d2184a005840787abc533e8c1cdbb12b576339670745848c6817502f5a29d35fa394a8ef564f1a661756129c705a0dd08be5c96b07a19ab31eed4dc4b1bf0a5a24469627e90e8200005901c08ee6b63afb06dc3590019a826ddd70f38b88641ccb520a1a82f6c973db7db0c684228ee15149facbfc11c0546b9f9243a0c2e605bc911263e533ff7777fc490fda41abb7a69d5448046d4741d0e195b91d7c984fb09f33bdd2f2a97ef4fa9e8922a2b0a7dda60412ec3224262779dbf5afbd6cc5c867dc1b36e19b72948f0b8102191d79de24ad6a5c32ac2c2aa03c75988f41b66ef9ebf2e5417c69857c8ab66422a18462fef15e424c2fc57fa8614a95318c3154e30c46b075f8e2724a6bd6aa8396e7791f24bf9dfc977e03899b8b89ed5c2a3cc994ac11823a9ec9ab81a13eddbe46298c27cf8ba29429e7e3372a57a6ef70c716e1126df589892c22f66938e009c0971bc3aafae05b88c7f6d127cc0d651b51c1b5bb79ae359815802dec45b6d750f9415fbc45a612aceb51fc9a8dc9ff2263810acb29a331a3fca427706f0a3192cdc22b23963fd1a315c774de8285b1adee80c609a4d5aceff8c27f86d37da061d6fdde1d35a4902a87d64f62a2f171a66351a88e34493850306eb81dbdf5f1c4ca39c567d3e12b2751d508abca8b94091b64d5e32e943777a961e236dce006446489d579811b83b0279d8f34454c64a266ccd66c188ef242970f96e1", + "height": 34, + "parent": "ed6142c5bcd2afb0c012fdb4d2ffaf2979244a244e387cf4738c10c1a786ab07", + "slot": 777 + }, + { + "hash": "58be40ac0159d5183f10f2f528dc6c4b1282c82fb140569b4811c12b74d020e0", + "header": "828a182319030e5820b4d19482383e055ec6d76faa41e95a982b7c53152c78fa3872a95ae200a446b75820a01fafb0394b73269f0ba718760133346a76e8e590ae0b876670c8c4b31e1bbf582092411f9a1a29cab8b4ed1ab4357a25b230c014e3045c221b3346b5a5a243783a825840ffd9fd9b3a4ac612f64b9a0fed892cb06e637d7ad0c4ca8e4369a85830ea43d1695b9ced906684c1cc48d07a074b789d41f69c6cc4cfe413f51dd733729341f45850077067992e571f816e9da4d1b463d9b1430b6092afdb530c3332ee48ff8b4ea97248371005f1b3f8426751003ef3f357c1581e09f70167e55de3308584b7116907b276b00a51ec99cd9c140394e7670600582018ee24c7ebe294dd70f0ee0c53f959fe654e29ee3ace75e28996aa0aea0d208b8458203ccd81ccc58fc2adc69ac3cb20e6ee56598cf0603e9564cca9aface763d94c3c18500058400c4b28e1ae2bd14f9399384d45ef9267e5ff2a0e74c56bb6de6263bca3dd25c50852642b40e1fe9ad3f2f6ec2878401e9d93066723cba83d54a34a2e2a59e5038200005901c0676316a3a2417337c11c3b78b0b7cdfe3208d9e36b00e8ff87b7634352fdea67ec90e4c743ed039a7cbfc9b89b26dfca91765c21f80942e4e83f2b4c29bc0e0249a9eb6f25c6175b6d603ee15b913013fb75f9f4a4c5ecedb5bcb3f288fadd520a015063b56cae186454b21f05060a616dcc3753a0fa963791666a3c2359fe5bdc13a77c64d7e5eb106f1d8d9da0968747066add30c07d12eb9ee7fee29f2b0f762464642c1d35adb980792baa73c3e3eece676c9c82858a1fdd34094e6680e037153e75a055c876a511ecd1731111f8512b4edcd831fb1e6013c0e485b4215a2c0fa5639f33ff62a2455e80b6cb5e3cf0ed721aac66bf14ead70fbcaecf89672fe3698a8bc53de555cba5e21a29179e9e2c2b410c1d4b0fd703387ef89fe7af5733e2549c699ec466c25727d72934d38add039c9713fe348a7468ba7f53f2e68a96bcfd25d1119c55f533be28a25e9bcf5ed7f96e57920358e6f78602351b270d70591707c6c1dbb926009a5b19d0ee96aeb92f09125242875f33d74e1fc2cfb72ee67291edee6e5dd11afad4788ac84b136b681cfe905260170a2088933e36be2607ac986a15546931e4f0bbc5ef0d5824bc53af6539a762cb490fa7b168e2", + "height": 35, + "parent": "b4d19482383e055ec6d76faa41e95a982b7c53152c78fa3872a95ae200a446b7", + "slot": 782 + }, + { + "hash": "b0f841fd1b23611950338511eaa3f2a2118d11465e36231e6aa4269e1d511c11", + "header": "828a182419031e582058be40ac0159d5183f10f2f528dc6c4b1282c82fb140569b4811c12b74d020e058209f6a9a363089819a4a011406addcd84e984210ca43f1f0b93f014bf4246b0fd05820349fa6de24709731a7f27d0e4f711d73018f285d2bf91fd0bcc67559c478a2e7825840e6b2f05ae80e8e7ef504aece5e52f18170ecd14ae0b6336b2bf2895b52e9f3f817b639059e4c6142716427387a3aec71f3ed1225eaf1addc71f973ad2d7fd3c85850652c84469ce0205fc612b7886008ed2b641912b11ccf0361d9f370e2f6a23d1496366714ede28fd4306c9178120614ddbf266a89b5bc4fd7009663e2bb87f1a96536789b160a92959906072b234d8d08005820af21468b8ed2a8a88b5b4c1fa94f3c3b79acad6441c20e4b9edc5ba33b7c086e845820740dc0a0c3ab031ec83d2737df245cf634f5bb52c30e3f10d5784b498dceaa09184c0058402e844d232e5697feeb57d0e1e24f46f8de86f56d0bf7c984deb5130262fb3bc3119ddeb09933664ff423f419109154efe6bf5f2e30d7f59704fed09f178452078200005901c0d070b8e9d61264e7806239c9c1e8497e47f7fa82b6a9e772b6b97384cf0addaaeff44a6a01132c8fad52d9fc69e56c5d41bcd4d9a9cd33c3187af984f43fa4095f172dc4077a26ab4fc58ef6de644079bcd76e7553b4468e3ec64a52c2bf5ccda05395e1cf6acb1d2b11d88202930f17e17e3233e55f2cc60fdccf05174901d5c655273b8dec2d0665a7473a84b905410e17a1f19a853d25b32f341e11e66e53f61b5bbbdce9419ff8b4a3438dc5f959cb3066161b4f51f848aca11fbaaa98afced6f3eb73033175d25410cdd7a018c8e15da090dd1d8cc71f36408ad6f69797b70eb348856734bfc2e11c083d84a92f997cc1a7399b6dd6ea38e1c82a535e9e64aa39875ef67c21415f076a39f22cb8b7607ff0c5e4d60dc393a7593bbfff567e3db58d6de8fe25f153d654184e24e8e3e71faffaca0fd480c83f96d6b66657c490b49bd76a543df7855949494093c385db0104f6f8711a163e2a9fae72841fb9eae2261808fb1436203b948a4a4b29be573a00fdea79962087ccc70e60fc368a254c6b20bc0f7ce151585fcd2ba76ae8ffdc4744204b5bc354f12b00927718c357791e112a4c26a02831faae28508f708944423e2a1d0c5c9c7a471ed30225", + "height": 36, + "parent": "58be40ac0159d5183f10f2f528dc6c4b1282c82fb140569b4811c12b74d020e0", + "slot": 798 + }, + { + "hash": "2d628da6ea1e4e1353c1c40aa914f00285e2b375cb94b6a9fbd37f0a156a7efb", + "header": "828a18251903395820b0f841fd1b23611950338511eaa3f2a2118d11465e36231e6aa4269e1d511c11582009b54b526e6c5afb4a3c4362f199f243bda856e248c2de99156b5186562c08a1582021e64e133738bbee188311034a4f03103e0821a6c0e632f499e96d45d379b3008258407111558f92824242fbbceeb62f2b4dd7afe5f9e9137494c6d8f339c38ddf877ec8cc27d08e36a0754e55e7b98f19b1a91ae387a1bfdb532e0e6a57948ad1eeef58501fb69117ba4a5d0f91340100b5a0dc0d4704aee14fc9254dbee430e23f1b357d03a264bb5bc8d9a5dd867c3439ae610a74c639261d970f1c61289f63b4b57c4bd8ca4960348d7c16d5678b9261b5d90f00582060b2e00c99b11a3f2c5c6a6d92727b854a0081c1b43115141f73c264ed243e57845820a7d564335ced2b5ee9edd8ecb349f31822001a398d0ba5859e57715d696c6ebc1818005840c697536217d7492be9a280e147c5ae4a22dd0bb8ba765f45027927c587993dcb3e080df2aa3ac218d53a1afd5a4e9215cbe79b390e28cd9ff405464824f2710e8200005901c01de839fa901e64254c84bc9bcae0d606c7f7d138e30e86ebf24a234f7632716536f929a68d1929e5a2c4a40640d9d00c85db125428c9feb71eb7f59e38060403fe9063bb6c7ffb23f3a85e936f906a1e1478be1b5d015c8d3d78ce5a536558ac25177143dcf1dc132c17d29d3cbf0021f048f9efd73d5d54313adcacdf010db9006c13807ac6128d25f2ab28b755abf844e50c1cf772ee5314a79ee8ac338b28e154499794b6477d7daafca6a41ee1c3a3bbd86cd860f1702ce69d25d10b46aa9ec5e31a2e91a8db0322ff68a383f14d2560ffd1144a020ba8ba7312e314932cb1137e21fde4ffff49e6352a932bf2772ea2ae98dfaf881a80d369caaa2db1dc25ebf19f2710cbc4ca12bfa7fe5978dbb0e6018745dabcad22091655e66ba15c3bedbab0ff7cd73107dca9e44cbd79f79f42f4e4babc9311157a0f48befea2e122a23e940b0420c2dbea9b710d5e1df7cbf1f65e6f6576209d6f676b91ee38f374e8e34da0c4897935fd62eaa4414678d133b6c3a819015707fbc1be3f35f3917ee924cff5f0ebe56cc4e90bbf76c4c80d7b8da18c2cf98005f54955499da7a8f581e4c935a0f5ba5c61f1717662e80d7b82c3a4ca01b1284ff95e0522f50878", + "height": 37, + "parent": "b0f841fd1b23611950338511eaa3f2a2118d11465e36231e6aa4269e1d511c11", + "slot": 825 + }, + { + "hash": "8c54fee05c72dc31a08dd57d9c6252ea542197db2e8d7088e44cf709554c6483", + "header": "828a182619033b58202d628da6ea1e4e1353c1c40aa914f00285e2b375cb94b6a9fbd37f0a156a7efb5820df541b1fbd09fc825a48cd82ea1b2788553b2d72db86c4397b017db6fb4ee6e05820f80ce1e74d580c078c2e6cceeaaf2af18c87d72e85df14897ced396a9e803bf4825840d8b17cfecc2c5eae8e0ecdbb3ed957edd5ada9cb38a2cf3068a609ee8be83480a3fe2852be91364f41520d61b803a860a2914b26c0f362368b992d8e609e8e3d58505161f63d9f922c9961f8fac57c147121b1453c6211c6a81a81865e8d627a0487740731e8c9df9a3f35d56156b20bedd94598e00c8b239051dfb5eb18a70d2e64bf86e85d081d0bfd4f2ecfc72a475f0e0058201929d15a4eb2a70470f9304a27a4936327687cd9325ab68ae812c4abd6622c64845820e2dce0eb82d7bb4ca48269ebb93b70374185d6dc9e0e9f10de35ce2d8fd355000c005840d1dc8482d252de52a3e8868ad0325d50a10d2de4aa2fe8508a81edfe26897d93db3ee72346158f1b136db7ed754ac7a46354b6ae357dc8ec4be9857e35aa7e0e8200005901c0bea06a14b92d021a9c895b88926b94fe1b5b8d7673c3ef117dbd45230d360c4b543dc766c7057cf3d0e0986c0b050d74e9d13b76608cf8d5ee39a0d8b4f38401123f03f1ba839244e816272ddebfaccd07b396c7d4e7e8127b65e28a34be2af6d99954122949e55f47def97ae436cb9975b8a70ec77c4e57f48ceec0f4c19093a99991ea07b4b34129340df6cba7f4e2a99036c15e2309de61d20d77ba801603cd42f57f6fc3fd127dbb2923dc40375f1d11d0b6df7a73e6178c42fb62221a907e2126561b88861eb6d764dd5abd0a02cce6dd3baf659acd10c78bb17c48f7035a0c97618c6252664b9ce9541451047d47b888f01b92fb499940b9a5570c7b5b5e938563dd88a5483aafec9d89e92d14aea22a0a9b8dd77e7fcf14b4f58ea4b24be7a3866f9e9fd4646be578a2ba3baf516b6cf5b543267cd8bbd9684d4516733b782437363ef2bbcca05cb0de5d5163d29645b1f58be7307037ad8ea25494c204906d3df79b42e8529a7e9a98a51d9e31f116ec499ebbab55f0eba55bfc8763cc3d6a9824fb4514cd46aaed452cade04436f0c26c5e156e3d9d5d6524cc85dff4676d1eceb7cde887cb25345e7447b36d36f62ae2e497ebdc03b2f05f167604", + "height": 38, + "parent": "2d628da6ea1e4e1353c1c40aa914f00285e2b375cb94b6a9fbd37f0a156a7efb", + "slot": 827 + }, + { + "hash": "1c093639fdd9784a171dcb6f7cb0f99916b22fd554ee9cfabe79275ea79aae18", + "header": "828a182719034158208c54fee05c72dc31a08dd57d9c6252ea542197db2e8d7088e44cf709554c64835820af9da86d95be558880436e0e16150e759a13937e427dee52508c94d67ef80eba58201f16763f1e6898d544d7f9e569294b0960b2d2c0a9c5effaf1b81aed6feb3cbe825840d12db8df5ab22d567757ba1e4e642303dcc8ad3846a6e3d722f120bd087b61d9848cf8c6b8fbeb6b7685b12595b46bbd3614412c5972842ac50a074f9f8c3aa258503aac92505fde6972dae822cd3c8168b30b2b450b0e628f0f41cdb3504ad9af8f91bf59dd552fc48cc6d013a4e7a3d3d06da5b3b87e7e3ea8ae0b6e8bf3d19932c37c2d6b6204bb1f45a0c92af2491e0c0058209253a0de7eb629e3b125a0c2a1f31ad8c774e8279e26357ba8ada9dab4222fdb84582033b4783491e8204211596cee996a92865a2a00761c4972ee0f0ee1cbb07dcfc00a005840d03083f0c14c4b60af4642ab1d5530e1b396127c57db5767d671044fb2a92cd55795e3df673f1a68958813bdf4fa09fa2e8d3a6c9bea623479ae2cc8bcef180c8200005901c070210aa344a401dd2343c3004bad750d0671721951df836c84b051a49888a812816174a3ab396844d3b83725064ffd4112a46b78ab6cbf25f68a0b9d7daaf406b32b954dc94768de9dd6931a9bc97c59dd74567448ac09f5228862e2fff750b97ae0f60f555d80843b304b9ca963720a599d0e43626161b5879259bd07c47c57ae3c711d7faa1896c58fc200ad7a3f39c3ca8b5e89814ad8fce112782b8779b4a5f89b45244d3efc05c73121c211d6d233cd82cfaf3e1573ada54adb0f887fc96c797d37c54aa5d232dc72f987cb717f09b0ca199cf84c5ac63ed24baace4a8b322b535330362773743b0946f562cc370cdbef122b242e8c24b1d079bec1733e0d21e7bfaa739a8708ddb99540491e7fbbea15c90fe3079bcc568ab56e07a74e73bc2fa589593f7db9a3298a928a6f0de4971fef3e4964e6c4da7eecbfa3850bdf8402c758c86d91c8e35c1c318f9e5a3f6eae7fcc456e117edf87341334286fc00e692abc03595af3753258ac024429868e89e4d24e7bdabce43676bf25e05c1f05f5973b87da15a2a754cc29f27db5707867d7c9185dc5b1bf5a1865324134cd7ca504dd6bedbf48394755f16e10feac173ce9eaba2620c6f4cd10d24d9b03", + "height": 39, + "parent": "8c54fee05c72dc31a08dd57d9c6252ea542197db2e8d7088e44cf709554c6483", + "slot": 833 + }, + { + "hash": "c5a715ddede8aa7d824c98dc955bd63ba599ac30f8fe6c09914ae891466cad56", + "header": "828a182819035658201c093639fdd9784a171dcb6f7cb0f99916b22fd554ee9cfabe79275ea79aae185820cf1d41b669559e9d30eaf310408a8dea605e3629c0dfd7b6d649d4861514d1bf582083f3206635b9182a411e2a9e870cc13f5974507b1f84476c8519ad9215ae4678825840b826c538af9e69a0e7d4413e2319524fb1e71c8b547803370c611424449aadaa5c841a8acd0f3f2acb119948c0e8d53efc94fa1a55b1d4d7c027b9a896b2d75b5850909d06c330d44db47b4b0d85ba43d15a14199eed103aa572380d6851ebb49e9febfdf738210820ee9b26399f3e2a64e3ead6aecf844109d8c2fa42bea3911034c4d72e8a042a3aac3b5af4f78e604306005820743eea4e6ac4b9c880b522cf358dc5818ba69a23d01137bb88c8d080f9eb67368458205474aa415f322607b193704e4c4c0554ec74fe68f7a0c880d65660a75c092e9d0d005840bbd78899a963f57f958f23ee2113f5acf830ce54a3733f7f5e9ec66459997dbbe4837e7706f415b8435ded9bedc37cf51e60177ff5d8e753c2638349cf01bf0d8200005901c009dbf31ad03a5497e3529c13016ef5b4de61bc2283ea4aa8d6a72b2aa662eb634c1adbbbc21bf00b275a06ed2899ea5c26be0f45fbde05420bb1d58c544b7a06c240bf2a1681adcda82378b0cd9f0211c9f7ee6eb26e57ee2b0b92547793e5faa7f183ed48ff763de91c6324f355449b2d96e4f37efde9dc377751844b3314bb8d0e3c59befe2f1a5b7bc0045a164b8b9e1c5c9ee285bf6c2f6152826ef1252ab39577992ce208e5b172e9d03e46c268454a1502697162f175c586821d0fb5a8c0ffd4c56fb8c5cce2e1f7a0efc77a38277faa82580e983c87d4081dd8b5226bc8994114ec7a95f8be871726a6998dce138fc55377f022f84cc97eccdd18e7d61b557d7daea41d1d021e34aab3dac320758ba4f9c2d5fddc5a8072097be37af8f2e5fb4037a11632c6fd9d42c62a2e8263af2db7c83d992c933548e0f5d2593bface422b543cb5c1eb68fab55f0a77683d4532df74468dee8e18a1b32b92fde2dd6a8dad63af74be2f9c4d3a1d7b57711d09e38e97fb72551eedf3c215beb1c0cac6a938ca375bcb5ab7037955122f116659927bdbb741aec609c2c27e3d18c4d5751b52460d0914e68d40014f179d8400db188be2c34a7f98872070b86ad764", + "height": 40, + "parent": "1c093639fdd9784a171dcb6f7cb0f99916b22fd554ee9cfabe79275ea79aae18", + "slot": 854 + }, + { + "hash": "e2fdff3ced0d6414f4a29cd197f7c2ce6534637b86979353a3f19ff88782deb7", + "header": "828a182919035d5820c5a715ddede8aa7d824c98dc955bd63ba599ac30f8fe6c09914ae891466cad565820be62f79f3cfcaa5e6986b864daff9debcfae34ad53a36df2faee406c67ac290d582088a86b524b9f5f6b5319f1a3171c0031fa97842df2ffc5d29ff7ec4c0ecc05f1825840eee9d942c495bfd9a9ea9f44ace37fc51edae65598031f28dfbf937c36b92fc7380640db7eabd0f4a179e1fa09fde16ba921d9db08d22fe6df8e41f0f5e768dc585021ee742a2eac054c760fe1f1e0867a106ccbc224a80b916a1e90aeb6413126544a48b7d0db504df6949f3bdeb0226a69365e1b790cd6613f9300528d72b2d092aa688ccf2122dd7a6e79de14eb134f030058209d86547a7ee9b0b6ce01833870cc3b62df0d9dd1bd324bbaddd915105a98cccb84582020a37cd965acd0de0280f5e0718b30bfc3b1aceb8600e370b39c43427f66e391182c005840c681c005d6df951680b4b490fa801a62780d96e9f71c3c8e2ca23ae6d2ee05c5d0bf87365103292cad2a469db8289f7ac3e451a1151dd6c38892fb6cf12bd4048200005901c014d9532e338e079654d7016fefa33cb5de612614013f692fc427b7d030bf09ea0dc9f987e94ad42a8d8f615e91b98785646407e841e4171e297b54cdb846ce00b1b31c4c85c89b7ac3440fc9032b7a482bcd59a86bdb03806b96b8dacfe77ec03fc82c59fbc5fc91eeeb54dcf090bf32c704e1bb2137fa582499fea349099a4229933a23f86307a1e0bfabd3be96ce88e1d8301ae9496f90faac04d4566febbf3f8734df4cb9d8b6cf956144e0b62b27e004a86101c8fc366b95afc64577986fc07595d4fb4957032c05c2ba22d00e2f77bf13efcb87b77a432490009d8a03920be66cdf82ea3dec218a5d4a95636996b696b66ede98c1b25703f9d8143c8d09bfc76ebd9985b443812739fcd161fe01b49c25ede6df49fd0a838f8b531644c9ac8f35e3c2872576916098c31a26110952b2f076c216a512bcb18e6b2003c1aad1b1b155842af6fdc031af4edaadd576eab871368b8fdac1386878e7883340cfebdf82d43ebe2654608eefcbef56ecc8eaf8bcf56fe1461e866cb7a1a8ae3b10ed3883a99a29b842c65f6ffa391aaef7d5178eecb4319eef91048772d1cebbaf28d30e5d28357a08504ed0250d1ee71fe0aea705a0c686a3cedfc35961620bea", + "height": 41, + "parent": "c5a715ddede8aa7d824c98dc955bd63ba599ac30f8fe6c09914ae891466cad56", + "slot": 861 + }, + { + "hash": "00f0252e56298d1c18cf5e9854a44cafd1db98ccb2d21ee749d63799d6124e15", + "header": "828a182a19035f5820e2fdff3ced0d6414f4a29cd197f7c2ce6534637b86979353a3f19ff88782deb7582005442bb4e671ee9f6adb69c74ca5b3af6b3a407c97429856e80d8c4090d64d3f5820e0c61af1967457770433454c2b27cd6b922427f8ae13148c8b09f53ee7a56710825840f6ba404971c93680b4050c0494de5c11acc61c70178d70efcd17c4f3e513cb8c8977f69fca7ed269bc16f550240fa4210f0a5ac75406d7143b92346e2aed557e5850a67d6974c3124290e9381023d9aefbe9679fe15676df5d7ff007454c107598431d9fad33f6bb4a662ffc9b3cd9c703128f5c248eba9186e6da1403ab183b91070084dde320a636d866cf289111d95a010058200ef62ce43d0a3fa0018173f726ba62892cbe27cac4d0bfdc74eb7714935e82f5845820dcfdf1559b3dcaea552e088d31e2225f3798b682571e8693d88e8437fd42110a184d005840c12b51de34fea0bbd6c4979d581669913bf95dc4f16d13857c752af53b31d4080e2ce0ec2fb289ec32bd82aad457750ce35698052309ba2c386f67d48c6c2a0c8200005901c07c0a3b6ddb639bcf2cb4569c1522c01e44e2dc88313a75ad0bb349c189131bfd5ef40ed78ad2115c2ab7716cd540367db8a388baf6c193c4e8c2f657ae526a051a3631680c81fd0642ee45aeedefa4ae83ebf2c78a681a3f831e50c628929c8b5897e0f273ecfab8671cda14da4d1a5d44d9337270b394b4c0a03e1912eb755291a64261efd6984933d34e22e5267056bbcb58ac74362e3b9bec47024ac873539faa3cfe89bb91571cb1bf47f14445ae3a7734afe96d6f7c683b64683e1ac525f1a8bdaf43285cf8ff621478980cb756ba86019bdf1baddc904298c573015a8971d8215977d748c327d9dfc06c1a65539feeebb7898cbfca7903088818a96bafc14119ebba5b1afbdee35c292389ebd0bd318f4b7d48adca59cb2b7ed66113575cd3bf11be8549bced3cfac0c66b6ce83b28238e0de549d46aaa281a0d39784b7b46a29fff240c7aacfd49b7d4a0ec4dd0b6dab0f1a08a51c3fd796cd1bda647208509138b9278bd30b0208bcbc683d7f58db1568c6b06d0a9aca741fe39aeef7c253a04279ba7a367b2b4a870c3e2581add3e5824bcc9dd53bbaee2aedcbd58fa8ef76c7c11b3b6df977e036ce5cbfc1f7c974e70abf035ad72b8a5e0be09ae", + "height": 42, + "parent": "e2fdff3ced0d6414f4a29cd197f7c2ce6534637b86979353a3f19ff88782deb7", + "slot": 863 + }, + { + "hash": "5bb6b1804289c3528ce98913efb45644151d9a2c67f0cc4ee9472fab9dd46671", + "header": "828a182b19036a582000f0252e56298d1c18cf5e9854a44cafd1db98ccb2d21ee749d63799d6124e15582047fd0765b53736b30a6a5f08acdf816c52130e14d412fe6a68eee1709220eb895820a638c3df66df6a9d9848e807d5c640848f85d8e81d4c3adb0a549048a5fd445a8258408f7d0932cd15f7d0ff4d90ff8f2ef64ad0a0f49a49d94f4d87609263954bbab5ddf9fa0db43444f987dffb3648fdd533cc74bf393ec9c8d920a270f35882855b585043e64be9a837b8fa06ed28e182b03b992ba882a2b146f98b4fc79f28947d01c423c603102927d14100ac9506f0b3f43f9035b325c6f4b80c3cd6c99c3353af37373bd9b145385272f0d3fa62d90c8705005820a482141df7468c6574ce398d0e82d9964bd946d780140a87950ff196e7705243845820b0bd254dcd7defd5fd897ccfc8baac962918185d9beb01cc30c058b609b99ad21838005840baa184ff5ad3089cb1bb4cd6e3aa597da07898ceded22fcdc17a7df515057a8705b97441ab73ed8cd88b73bba7eb766595c0415ed60906cc9cd6b59be542ea0a8200005901c05f81b14d69c041416be10a79f93d2c1aed9652157c4e9aff97d59d9bacfdecfdf7a6099a076faf54d076253806b5ae962001c3136fc47d3064807aeff56d570a2a8a69d73897cb341ab6e2f71dacefee5f4f9a4bfd51c5b3e752c0548d86f1100c95b7b1f1f7f121f7f34f7e8fa2648cadb37e49e073f627e7d7f3172f9726d3703161fc3f826832df4112f9edf6c56fa82dbd6f3fa1b9b84329ef9522e1643ef335b41d01f1e032b48daff34323b0bf928c83e6b8ca0fe8966a99058bdcc71e4735027eb910b9b3ce08541855b5dd728a015eae8655bbd81f2741ff0ebea6a3d3129d520190357814d719ee4f34b2e952034e1f9c3a768fac1c3e7f113e45ec0e852475f16779f84fa8c007a2d3370ff9b424d2c0bdd1946599d85543fc1d519a44b1efe71391ec68a76c7ca9f6bdf103041bad0c5141c2af718d14f17b2ac74f6763c9deb8a0810deae879e7289b81ad159481ad0bef759a0ba3bfb64ec9c98b53df21b3869d488556ded542742a6cb702f1e1a5f7948510d544702909b256134afa1738d7509b7f1cd68fd1b7ef3fd078429c5433b0dcbbbe40c363b8516772311390ac6bdedee0a4347008b958e4570c7f81d5bf21e148195d583ee14593", + "height": 43, + "parent": "00f0252e56298d1c18cf5e9854a44cafd1db98ccb2d21ee749d63799d6124e15", + "slot": 874 + }, + { + "hash": "2a348c5a9ccb1648b70e9a3aa2e9cfadb262acf59f79ccd160528f23e8004736", + "header": "828a182c19039358205bb6b1804289c3528ce98913efb45644151d9a2c67f0cc4ee9472fab9dd4667158205a177476c40bb96ea1f9d241d0d1651ae08104bfc54337d356f951d59404a4d2582037264127bcb2df028319e576fbe8727a7d9b2d1cdcda8b30c6cd377f0630bbd8825840bef69f7a985a52d3e5cee244ae15fece386829607e07e41d86720a376b886d06e0ad95c4de3521ca5085556f72598d7e488c2c7b9b57e5dba28a4947f16fc0c1585002a8c844af45a7e04ca7992ed4764acbbc0a22ec116f5a3d001636999e8310af14e64f16fbc0b741c921c207cab80347242d2f8a420be5350e8c4b53b7b0579f327c9a76d1c65cc3f0206e5c03c3510d005820b0baa39f76bbbdb15dcf688bcf535a59b12c9a25a80c3bcb1b0a3cdda57c5f6a845820338f92308f2f1d0dcabc1f1e3ad061c8b6e32679fee51431a43dc32efec5a0fc1818005840b3bd852c4a9a2d8f740ba727594f91c227a9dc638d2f27edce75b140bce7a12d62c0dcca2c832e3c8904e0149d2bc62e20e42605f6e0444835a9ecf2f462000e8200005901c041860435d36c54c1d7f37ef98cd6d589805be9c65a14c0e9d2a2ba510e422aa7473122e3e6291d50253a77354a26db982860167c0d5a030c8f0589592cf502072a33fd2dc4086d99d1309eee46f49e76b5d9f86465fb0ae9f1b3dec4c8e2c15dcb0120b19dd9e1496fd9350141f284d40e2350e86404f031597cefa7063a4a35e92b198a7888cb9397d81e563e067f3e0f5709159027827cc74fd3ea0583051a1cbcb8f3cdb6280b50138328292f33b6b7dd202214124507fde1789777f1737fd390cef46fb8ae253be49c8d3b43aa48387f0e50a32c3f2b6fe25613e06e4d3873903f3ddbef0d2d520380966869fcf11a1dd7275b1b6cccc313d2a718de1b2ed2e5fc55f72a46076eaf27598525fe452ace332397e8a2687d494b086256933ebfd955443d19d647a98c17f0472d136b4ae46d4548cc837ae9ea18449b259f3eea3820cc09fd0ee8dacd88f36ea31d266dbab5ee6ae55142594774498e7e3a3ff3fad6228c6e1fe23e3ef39e2edbe258351d9a1b8b50aa35a9f5e3e6c4f376d16948885aae058502fd5d51b5f6bafa8ec285d1cac641488bdaf90d99331da3edd4e2db2ac63975bb6791ba02822a7d25ea87aa5b3756ed3decb5ef8f09970600", + "height": 44, + "parent": "5bb6b1804289c3528ce98913efb45644151d9a2c67f0cc4ee9472fab9dd46671", + "slot": 915 + }, + { + "hash": "218266f20942ccf7d0dba7e1a9ac9a5b6e168b27ead7dcb1ef4424e1764d5241", + "header": "828a182d1903b558202a348c5a9ccb1648b70e9a3aa2e9cfadb262acf59f79ccd160528f23e8004736582022ff37595005fa65ad731d4fb112de050aa0ca910d9a3110f56f3879d449f88e5820da90997ba81483b3f2b4de751ba3ece6ba6d50f96598eb0940cc7d29452cdcb98258403677f5fe36a0182a8a041c80472b982f3ce83618962013bf2bfed9ca2a9ccc5b25ec82188fc6179869b80254028fb5234f4902a8dec7c68b46fb3cd2ba96ffe85850e3f7be2a47360159ea331d8eb031586ec0a3fe396ba22a94eb7c5923292405ae78ff22ab2df0deba59272c111c466098b83b880bddf9d630e1fc9c94b89e71daf1f84135d67e7952befc8cc9af10b8080058206fc8296e6d7c07cf17975769769795020b480acb1a8a0dbd832a39faf1e9d984845820499fc5dada1544be26d7cd3b2851fe955b44e560b50901abc71333d5d449eac9182e005840595a9a329b2637b8f2cb501aa793a159acc928a27c01e1ef586508492a68cabeae6ced714421be1f648bb05c7196f38e7aa4a8f616ad46e32c84e67951657a038200005901c076879b387d02f961e8c989df1d5cc6016116240a3a55eb1ae03ccbabac31cc1a0412ed8efe34b09903e1a8be4815d2b076f38f7b335b095257a52612c694f40c472338fcc8b178f0ba10f8683725c5df444b7fc6a5afc3c7fbab82e00e7df2d247c673d066eacc1dc7860c10b134c413d71c5a073a5f3e66a17f0d25dabae2699d7b4a969e129d627cd7839995ddf40a3e6672b6d03936de782f5e0dc31bfafdccc5d5d2e5e9a5b3414bface59a824e3a574250474d633115af821b63232de753fddb638606b93b853144dd75692b02e73b2ef8621eb1bfa307cfda8acaa2c43f8b673c9ed749e472cdf2fced20c063a2507ccb985d2b5a9bc77699f42379fb349e1e3a1ab86d1bd510c6ee89720f860d55c208dd262f49746d8fb2a7817d038262a6b266f98f427fc8b958f11adb8c84cc96444b1f5f9d994a4fd1adae2f2be87d8c1dbc0206ace7871da50cc92476d3fced6a4fc2809c8bb47dff992b06259c21f78cd6e72b49b8fe101065aaf243003af67a11d5aabcebf1059b3c92493f954507573a01bf92047ef68f4e980df914b360307b78b3371138b4c1504e155f704df9fabf1bc87ac47b3d5cd563cee6017380e4df6529face9cf39b36277068e", + "height": 45, + "parent": "2a348c5a9ccb1648b70e9a3aa2e9cfadb262acf59f79ccd160528f23e8004736", + "slot": 949 + }, + { + "hash": "dc6018a6ca7f09656ca4202218dbddc60e624a91568484838cfcd56bd11eb524", + "header": "828a182e1903b75820218266f20942ccf7d0dba7e1a9ac9a5b6e168b27ead7dcb1ef4424e1764d52415820af9da86d95be558880436e0e16150e759a13937e427dee52508c94d67ef80eba58201f16763f1e6898d544d7f9e569294b0960b2d2c0a9c5effaf1b81aed6feb3cbe82584043b1bf0aa912c6f3096c92d4aacb9b20a313926ad46fcc711dc3558b0a5ed3b88048661a00ce0be7008a1c4bc03dc87517df34357848650dab057cc5ff0bbfa2585014afd91148344b24bba2d2e646d28190c15b7b403cacf7688bc864b23fc97402141ffa0a3bc4f913648248910d2dbd180d7ac712123f7b3c85023f7a1e7c546b02e3e70e059c56d9d899512ebdba5006005820b13e507bc808f3f3ce316288fdb5cb4c269f76d6c88f175a3ee9647fe61b225184582033b4783491e8204211596cee996a92865a2a00761c4972ee0f0ee1cbb07dcfc00a005840d03083f0c14c4b60af4642ab1d5530e1b396127c57db5767d671044fb2a92cd55795e3df673f1a68958813bdf4fa09fa2e8d3a6c9bea623479ae2cc8bcef180c8200005901c0c764aa7327643bad5d63c47b782c9558a4f6f62b0f7139959cb1f087660270cb72ab869360414cfcd3b5cf03af3337aa824bbfda3c97de9008ad8b882db0910db32b954dc94768de9dd6931a9bc97c59dd74567448ac09f5228862e2fff750b97ae0f60f555d80843b304b9ca963720a599d0e43626161b5879259bd07c47c57ae3c711d7faa1896c58fc200ad7a3f39c3ca8b5e89814ad8fce112782b8779b4a5f89b45244d3efc05c73121c211d6d233cd82cfaf3e1573ada54adb0f887fc96c797d37c54aa5d232dc72f987cb717f09b0ca199cf84c5ac63ed24baace4a8b322b535330362773743b0946f562cc370cdbef122b242e8c24b1d079bec1733e0d21e7bfaa739a8708ddb99540491e7fbbea15c90fe3079bcc568ab56e07a74e73bc2fa589593f7db9a3298a928a6f0de4971fef3e4964e6c4da7eecbfa3850bdf8402c758c86d91c8e35c1c318f9e5a3f6eae7fcc456e117edf87341334286fc00e692abc03595af3753258ac024429868e89e4d24e7bdabce43676bf25e05c1f05f5973b87da15a2a754cc29f27db5707867d7c9185dc5b1bf5a1865324134cd7ca504dd6bedbf48394755f16e10feac173ce9eaba2620c6f4cd10d24d9b03", + "height": 46, + "parent": "218266f20942ccf7d0dba7e1a9ac9a5b6e168b27ead7dcb1ef4424e1764d5241", + "slot": 951 + }, + { + "hash": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "header": "828a182f1903de5820dc6018a6ca7f09656ca4202218dbddc60e624a91568484838cfcd56bd11eb5245820e851ed72bf223065330da4b4c1aa9cdd64acf009e2ce9ccc3ec825c2598efd075820a8b99efbe8bd8fb6f1af06648ef394acda09d5f3acd65d22b316489b52691da782584084be7c06e16b8b2376eeda0c4f23afc695caf112f9b857b15f2cb45573cb458ce53ec2d98eaec1c6b40ca649ed0cf526aae16194b98ba329ec7987e9b57bfc36585075e8d1cf9e2266026877d3cfaef5d480b0afa0e1a5c5af66db8d1e1a58d8d0c5e4a6483553deff46ec96aa49d7739a9f00adf7bb70691b829a06570f208a23fdbb703a64de4a0729b9d98775883aa40200582013d623a8faad46e44e62e021993a948f0e2631be624d5f54856001a3427f8cca8458206b9f9a45e7ed4d48b431262d90180acc013d4cac89419a907fa280d3aeaca1f3183400584074e51331594815a1d2f549f667cab1aa88c9d0ad0dce619a5a3a1d5a714e5c5247b4bd9e3f8a84ea60f42fc9b326842ba000ce9eeb24b173685c86a3206944078200005901c0153651db8408ed31ebdc7fb6bb68d560394a4a5376531dd709d72229aed89fdc579ad5f1ef4967dfe4a0d082ef242d996bc5d9a0a45f983a9c5a9282560d2f0049e52e9b1d0ead0e54d857c5815ddda8179a71d8d7b8545e04f753d9b7e6d0f5ba91ad9b33beaf1e83d2afef9e37e3786639e16be5e953a1239a1c8323ecd721480e6b8494a0676c5da2745c2aa9dfeda302d8c284f528fcc41229a39455257cb667f4a3e728c95b38b0191bdaa14ffde3dd5c743ff7fd22ee1d5192dbf28722715f9f7a5657c06b1fd73e0da46f660020680004e9b76703f82bc36d6382363ad2ec04425c6e9031b2e1a19188f36b4d2dae71afb8b94fa27e129ede608b9d4628db96efee84ba8a4582f9c0a619807de4ace773edda4570f8021db7cc2c74a7c8a57d7dadfe159b3a52f2d478497a720535d348cf436857a6a55c610946b2a56563daf041aedbeeb426ba200bed4faf746a0361003e60cec7be069a0ad6e03444e0039a6124686c8f4df0fd22225f8ae00a86868cef64dc68d582307f23ed22964050c244e4241be08e766798496e0b6968e290c1ef50ef1805323e6ed9fe7a5bd78215e32b55b817b45145731de78b10f9afb4df0a89713b80a43b5dd8abe4", + "height": 47, + "parent": "dc6018a6ca7f09656ca4202218dbddc60e624a91568484838cfcd56bd11eb524", + "slot": 990 + } + ], + "spos": [ + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "7d69f26449fea78dd035fd88a360205ee15fe03d4e3f019814fc12cce0fac334", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "5e32e78311c07da914ac925dbfc4aecbb874245a72f94c2253dd64e39340b085", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "cba58fe1e36fbe608d047ba4f1774efebad8fbac39b53d9b73bc80a8f8dd4c44e8eb434c62d143454d85f5ece2a675cade637e20fe4cff3f11556ecde7ad2ff0ac24643578b384023b70d7a93e3f2435e4f9e38dc65c40df258d7379228b6ea42ea108ce0f27da1e113e3017311451c8972eaf8127f19b900fab6c241f06dcca4d1f153541b7cd87d47144f44c9bf945501f3ccb9de9e7664b473eedb7710a3af57cced81eb964eff669ef38c7e5036eb8d4f8d664bd7b5a50f03dd56e0435ec017e92b07be6ec30c20724593c79648978fbe94501ef85f261eb38209f8a2f8260b794ec16692996a80f7620b0e256c0bb45da1e701ce21bfd3edfaf908f1f6d9352981606a4c6d22d3f14a0b4f2f37c4b8085974aed296379d80e66f83506b7513a9e3c8b9ad6268994e42fa50be81faae29e8cf62bd7bd75b09a06652f9e0e5b0e52068251c13bdb85261d4aa9c22f18235f019c4e2cf4e94cb49c38f2eea330b0f898800be71e896a06a157e8ad8801887a2777e10d1d3eb6065b2712946f51b89bd9d239ed01417eef7f09a94eb286a1a4c08e6ad99a767346ec031c3797d9a18aef202ac7782b91a08fe3075afb79b4880613aa78210de4c5ba7a20c699b4c48e149cb0b5dea39cdf1ba4977433afea1261a9992f207e0b8589e048e85abc751c50b717dc2f3ddc099109d6637cc881d59fd58c865305bae525fc84de10c9aefa0f0b8a83da104138bd998daf300dad244a8ad10a42c2a61b372c34cb1ff5728e848bfd0722355748f9dfe3765aad64cccf0c030442258fd81a6dba936803bedc6096ff1d90072ef1a24e231f60c43c3d4b5f31776fe56287ecf228013c", + "ocertCounter": 49, + "poolId": "a0664cae7b12c6c64f08c08e9affef46b8d096c18bc7c3adba382f0f", + "poolIdx": 16, + "vrfSignKey": "82c7e81244a3bce96904feaeabaffc4270245f77b0d26e89ed0ce42a2a89b2af6ee3a36d9b941fcbb53e647468d10b0ae958d8a77b9f60d2ebd247a05a654c6d" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "c303bdd3b05c573acb624965c7ce2a5f0e144354fe4db65d643fbb477329446e", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "a54e9186510d3a0c046b7118fc288d2f28722d24350453d8eb149fdeccbcbb3c", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "5a2a5ea10aa2d95ca4bbf2e8def658624df5171224d89d25c62f901fe4658efef43217ed873c1b5c033e03e3f10c7179be68bb022a8f804a3c22d074fe5da817b1b31c4c85c89b7ac3440fc9032b7a482bcd59a86bdb03806b96b8dacfe77ec03fc82c59fbc5fc91eeeb54dcf090bf32c704e1bb2137fa582499fea349099a427fa67ab309b4db393742e9ec4fde0c85fddd8c651950819d0c023c919282b75529933a23f86307a1e0bfabd3be96ce88e1d8301ae9496f90faac04d4566febbf3f8734df4cb9d8b6cf956144e0b62b27e004a86101c8fc366b95afc64577986fe9f17bcac2422bb28ece7a4eb89a9f1391481ae485225b3c188e69c226f9d333c07595d4fb4957032c05c2ba22d00e2f77bf13efcb87b77a432490009d8a03920be66cdf82ea3dec218a5d4a95636996b696b66ede98c1b25703f9d8143c8d09ad74b201e3497617f11ffe522d539540048cb0cd00ca8002ecafbdff6ecf2c43bfc76ebd9985b443812739fcd161fe01b49c25ede6df49fd0a838f8b531644c9ac8f35e3c2872576916098c31a26110952b2f076c216a512bcb18e6b2003c1aa36674100e58677dca57569de9b6344117c059f25082806132e3527405716410cd1b1b155842af6fdc031af4edaadd576eab871368b8fdac1386878e7883340cfebdf82d43ebe2654608eefcbef56ecc8eaf8bcf56fe1461e866cb7a1a8ae3b10ba54941f55a390f518544e002748527f8ba0ce05800559f33a2c13c2ad6e555eed3883a99a29b842c65f6ffa391aaef7d5178eecb4319eef91048772d1cebbaf28d30e5d28357a08504ed0250d1ee71fe0aea705a0c686a3cedfc35961620bea", + "ocertCounter": 44, + "poolId": "c898e16a709c609c68b283377a6eeb67dabca025aae15c7ddb7d8705", + "poolIdx": 15, + "vrfSignKey": "bdf0b43993777d56f7c38c9b3b03fe6edecbe0455842e89104138e15f41624b188a86b524b9f5f6b5319f1a3171c0031fa97842df2ffc5d29ff7ec4c0ecc05f1" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "a7efd56ba64e9b07ca053d1d4d93f44cfdd1d41e0dc72222d1d97ebf0144f361", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "ae06f98f58ff9e92feda8df3468198828b0bbb8ced67a45577b880b3da1efa85", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "caac8524a1fbfb25d00949d0632caa3e80c77e1d1869e0f821be8d6b3d01527197325600ada480001a471ce443a619c60536a20e2eee814785d3bf5a3aa8f45d2a8a69d73897cb341ab6e2f71dacefee5f4f9a4bfd51c5b3e752c0548d86f1100c95b7b1f1f7f121f7f34f7e8fa2648cadb37e49e073f627e7d7f3172f9726d3fe0415a2b27f235bea1d1dd79299658a5db87e41b9755d4f568e8e4d83cb9160703161fc3f826832df4112f9edf6c56fa82dbd6f3fa1b9b84329ef9522e1643ef335b41d01f1e032b48daff34323b0bf928c83e6b8ca0fe8966a99058bdcc71e8ed56cc0cdb2a798bde06a79f286859a70e556215f40562808f21f59fcaefe384735027eb910b9b3ce08541855b5dd728a015eae8655bbd81f2741ff0ebea6a3d3129d520190357814d719ee4f34b2e952034e1f9c3a768fac1c3e7f113e45ecc5a3e0736611f3a23ea17f2729b8a6a29832a2aa60dd418500dd199e984f18190e852475f16779f84fa8c007a2d3370ff9b424d2c0bdd1946599d85543fc1d519a44b1efe71391ec68a76c7ca9f6bdf103041bad0c5141c2af718d14f17b2ac7a087eeea3cfe694bb02e5c2f14822f4e7a44e1a26acf749bcd738e77d359fd914f6763c9deb8a0810deae879e7289b81ad159481ad0bef759a0ba3bfb64ec9c98b53df21b3869d488556ded542742a6cb702f1e1a5f7948510d544702909b256239bccd2e2684e6f4db0923cbebe7d2de661ffc87e0e43956eb397738fb7b8f2134afa1738d7509b7f1cd68fd1b7ef3fd078429c5433b0dcbbbe40c363b8516772311390ac6bdedee0a4347008b958e4570c7f81d5bf21e148195d583ee14593", + "ocertCounter": 56, + "poolId": "355a834a2d1a42e8724f0bbf23b7ac561a30cac77ec82302509a4eaf", + "poolIdx": 14, + "vrfSignKey": "bff58e19c24ea2c85adcadf327f2aba0c1d08650ce57d4669bd408041a85e555a638c3df66df6a9d9848e807d5c640848f85d8e81d4c3adb0a549048a5fd445a" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "46e3d352ae36d796b04a46ab49e808aefdeb562281dc92f68d0be4d921f0ffcc", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "d1557bfbd616f7125e0b3a32ec77982ee05841d662f5d48f3da4d7a6fbd3b83b", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "dada054ec7b8dae7407daf65692b63353e6b822b948cf722bbf2dabaa71702936fa7c0fd5e05ff763d918ef1109fe993fe03044e5faae88914190c30dc969ebf472338fcc8b178f0ba10f8683725c5df444b7fc6a5afc3c7fbab82e00e7df2d247c673d066eacc1dc7860c10b134c413d71c5a073a5f3e66a17f0d25dabae269dfd458d342080da106e60e900e2a554c9a9bc90c6136b7e27eda1def7bed961d9d7b4a969e129d627cd7839995ddf40a3e6672b6d03936de782f5e0dc31bfafdccc5d5d2e5e9a5b3414bface59a824e3a574250474d633115af821b63232de754fc2207cb11ae82f8894d7b941683f30f02c8cccec44eca93ad50b21944b2f093fddb638606b93b853144dd75692b02e73b2ef8621eb1bfa307cfda8acaa2c43f8b673c9ed749e472cdf2fced20c063a2507ccb985d2b5a9bc77699f42379fb3c8535c22177e87df965f39d9d66d6c622b07b4122ebc5a5b1c14e3d55c89868f49e1e3a1ab86d1bd510c6ee89720f860d55c208dd262f49746d8fb2a7817d038262a6b266f98f427fc8b958f11adb8c84cc96444b1f5f9d994a4fd1adae2f2bef55cc4e8918740bb3335a14747e178b8c4f704cdf3bb0213583d78b74ee0bc4187d8c1dbc0206ace7871da50cc92476d3fced6a4fc2809c8bb47dff992b06259c21f78cd6e72b49b8fe101065aaf243003af67a11d5aabcebf1059b3c92493f9b3a5938c03eae42385cf38da53d3b472ae6c1460807b3b49025e7c38050d0c9554507573a01bf92047ef68f4e980df914b360307b78b3371138b4c1504e155f704df9fabf1bc87ac47b3d5cd563cee6017380e4df6529face9cf39b36277068e", + "ocertCounter": 46, + "poolId": "851c6131fa082970f7d3c6c8aef5a64653f3777fbf727040401e091b", + "poolIdx": 13, + "vrfSignKey": "b446304939ae34c7d9ee979903846cfab952b0b89bf46cdcb13847289f73fe9ada90997ba81483b3f2b4de751ba3ece6ba6d50f96598eb0940cc7d29452cdcb9" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "e9367b2aad550a0454072ece2183843bf492bb8dcbaf5120a17a462e884d290b", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "e53628f5b750706df604e38a76d9c71dd136cb50bef406b4597375f5b1183f02", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "4b5875ad14ece8e6fa3339cb8cc57b31b7252d4969940bd7df0a23ebe45eba8552559ba9613953227546efa5d15c5c386002231000ca84b62ec3f1660b903b48b32b954dc94768de9dd6931a9bc97c59dd74567448ac09f5228862e2fff750b97ae0f60f555d80843b304b9ca963720a599d0e43626161b5879259bd07c47c577dfdb3c8436b214781adfb201ed88099808acd9b1637574e4886e40fee1b6bffae3c711d7faa1896c58fc200ad7a3f39c3ca8b5e89814ad8fce112782b8779b4a5f89b45244d3efc05c73121c211d6d233cd82cfaf3e1573ada54adb0f887fc9c4a800d094474319367e1f393ed55f93615f09dc521f525a613606728305ad5f6c797d37c54aa5d232dc72f987cb717f09b0ca199cf84c5ac63ed24baace4a8b322b535330362773743b0946f562cc370cdbef122b242e8c24b1d079bec1733e2b22cdbbc1a4e9faa155d9c7579f8fe5b98b90830c43cd21dfd5ad7909e8f6b60d21e7bfaa739a8708ddb99540491e7fbbea15c90fe3079bcc568ab56e07a74e73bc2fa589593f7db9a3298a928a6f0de4971fef3e4964e6c4da7eecbfa3850b2f53b482617aced0246870702f6c08143d50fc6367a8fdcfa9e610d2ac5ebb30df8402c758c86d91c8e35c1c318f9e5a3f6eae7fcc456e117edf87341334286fc00e692abc03595af3753258ac024429868e89e4d24e7bdabce43676bf25e05c7cd39b1af9d88728da72093e67cbcd214708fde9314f4e99e53c83c7ffbf16731f05f5973b87da15a2a754cc29f27db5707867d7c9185dc5b1bf5a1865324134cd7ca504dd6bedbf48394755f16e10feac173ce9eaba2620c6f4cd10d24d9b03", + "ocertCounter": 10, + "poolId": "a455bec8c63c9243544206d36e291ff2660e3356d876620395e2d016", + "poolIdx": 12, + "vrfSignKey": "7e9fbc3710ed80fe663e619de3c8b3cd40890fa29eb6536cbd1bf45684cba8b01f16763f1e6898d544d7f9e569294b0960b2d2c0a9c5effaf1b81aed6feb3cbe" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "c28b125c2ddab91d96853b5bc6e26e118d6889ee46dc1987e7a8e67b06374900", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "52dbcac049ed285f823e6f9767b0bbf4eeb038409815ce6a8bfa322472c23e76", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "ff1178c924afc1360e50ea2a2007c9ac6cc9c74825bf1d794eca12e611c29a3dd14093c8b104f62a3704fd5d2fc847a0ede7509d4f17f19c96fc21efa144e759ebeb4c8dd448ce09d675ca6291ef83f2b82371cb4c904960430e40d120365011d31daef6cdc3e3896ae2ebce0400f566484c73de8810d337d3c80bc5ae3af9ccc3a9f58cc4bd7642e6825d30e4078844c71daca23a5f2a4b10eb16fa9dc3769668fa7f55478b6b8d3d7e5ac61b2587184899ffd1314e8bc2911a0004fa506e9369ccc438aef33bd13cb6c27766f0e8339304da66df13094b2e31b383d4794bd226157f46d2206683e1d35b3b1d2edb9b8e9dbcd9a054afc1d1d59dc8771180351c14710d97ac55bbd942952d2511466b9d9cfd9f1035df8bf7f079b8dced90be77f3adf4bbfad6ad2f63befb230b8c7a8ca3771dc1783d1deb0cf6b369e03ec2d78089f86e9a37521f583d5b8ac2fa7ff3ab6c1bae68374cd32a97db83e8030eaa38454f09e9e2fa975ece0ec6711e0370c7e816230adadef96b3a4d6694ef12c7c9002b8371a09994caff169639bfa4e07abc1341a6708a59940df51c155cc19bf2e3bd7e34af75245e61126a195302a53404109ee4416169d2fc53e8c11604aebf196d8cf3705c9f22764d0bec98b52aff7d4939621dd576568554b854ea3bb80e4292f56f76bf2f68a98fa6e17f6824ba839c2f60905b81d4987195c69e5d48a54278ebc0124eeef20ece974765fba5845a79e8a964aea7890a27a04dfc1bda32c884a7112465e00938275fbfba9d331d8b1258110d730bd9fbecd6b6952f69e346e8e4e37a7f7ad035a0ebd89ccd901fcc1ebc80672696861af7bb2050db", + "ocertCounter": 64, + "poolId": "51b564454672b17ade8e4da10428e570098f51867895eb59cfb157f1", + "poolIdx": 11, + "vrfSignKey": "0aec41be5ec325c2c7022a47c7b71a78e39d9b54dba4cac3d0350cf4c3ad0555b6a49a80648fd97b79c4658137a21896c2cb965c5bfb5341b6bbc1ebd309eb49" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "1c4e72a4c138eb96cb38c44531e17a25d00412851b427963e214a9ae4d19a4c7", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "cc6f41a4a721169f3547ca27d098a1b8475474cfb35b45319ca7e68c0cd35292", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "27442c7fa4ecdd1b0d855a1cb0f0efe35f05fa0bac7f4be77b65d15c9554f76701fd013d5b1197e018199ce3ef1366b9e188b6082645b23f03513dbfaeac678eda41abb7a69d5448046d4741d0e195b91d7c984fb09f33bdd2f2a97ef4fa9e8922a2b0a7dda60412ec3224262779dbf5afbd6cc5c867dc1b36e19b72948f0b81fc6ae3b5e2e24939195525c65815af80ffcb9954d3b9bdbc011ebfada1f53fe902191d79de24ad6a5c32ac2c2aa03c75988f41b66ef9ebf2e5417c69857c8ab66422a18462fef15e424c2fc57fa8614a95318c3154e30c46b075f8e2724a6bd6f22a93af773675cb4204025e6127eadbc6f09f38efa8d049987752a9184046e4aa8396e7791f24bf9dfc977e03899b8b89ed5c2a3cc994ac11823a9ec9ab81a13eddbe46298c27cf8ba29429e7e3372a57a6ef70c716e1126df589892c22f6690bebd27924f7b032658e53fa2c53675048604e93454c9108e2ea0553f991ba7238e009c0971bc3aafae05b88c7f6d127cc0d651b51c1b5bb79ae359815802dec45b6d750f9415fbc45a612aceb51fc9a8dc9ff2263810acb29a331a3fca42770dd59b3d32ddaad51932652eb9708f6262713adbe4ad56b9b772fe5464a357d376f0a3192cdc22b23963fd1a315c774de8285b1adee80c609a4d5aceff8c27f86d37da061d6fdde1d35a4902a87d64f62a2f171a66351a88e34493850306eb81d46686ea956db5d77294e4a07cbbc415b87b022de746380412751b22c41e4eaaebdf5f1c4ca39c567d3e12b2751d508abca8b94091b64d5e32e943777a961e236dce006446489d579811b83b0279d8f34454c64a266ccd66c188ef242970f96e1", + "ocertCounter": 74, + "poolId": "4a52e060a4c96d74c9f8a3e6e186f0ee3f8c2f53ec69acc2d1df8410", + "poolIdx": 10, + "vrfSignKey": "cd2348615836009788f7ee7b73ef524fe7376ba0492e9143d3ebad395d8c60bae2428fc1694882b7632ab35a7a9de5d7ca208299fd887d234857ea8061a65c72" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "fb0562769c453c9dd94f4c819ffb81fd2de9a069b230e8a75393483d3ac8b3d5", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "124c0c5a1ac018357710bee0e29e4d6f3084019fe7732c0f4159afa3bf465abf", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "baacd7b4c82b7fa86db135bfcd4dfef7f41396e4294545c3d7be1b11dfc884cfeaca79d6a3746e159b307b8bf886ef0b1584f6d3ffa70bfe4c37d28745753757c13235d0eb8ca973053893d3588f771b59046cc03fec46e11742086377edec80a495daaa579a6de588deb6fa4a7c0809595f93d68fda859c0ccfb011181dd49ba2999b0df8ea4dd899169f5b84ac91ea28785961e3ce74404818aed4cc0e685ad5f2e67c5626df00ffdc5c1bec266e91682cbc57333c7327cc1d567596db4607e7964e58e6a1dc6f6c9c24ae72243cf9f193f966bee38cbef934863625dde01aeba0999a6f192a679080e5e6118bce77436a48179ff6d68f0b80d202f8645bc58956610bfe98c89429ab2270df7742983eef20dbbd1504a137c00a556ee708a444426f733c152fe8b19d6af50dfda6b3efacde9b71b3c90043a99f216e462af6c7961bb06b97f71831d09852c9566840654324be8ada6ab6a4a83da6bca5e10e9144576b49bd708cf5c67d93160adf3ad1a39f0b118ad8f78adc7af45dcd4f28c42657fb8cde01fbd496ab6ace5ed6607eb73b610965ddbb78a7fd6714c4ed087314ade68accdd1ceb8d3d65f5c400140ddfcc0967d7f3ada05a2659a298a5667fd69f5b133aed19db36919606390333f145b6e44a4ffba76fcf503c19b5afa897a9448beb350fafa9c6aaf29e5e105444d5732445b97170e628462da8969a16de18975582ea03f9294acf8b097771c013203b8418885a7212d0344f7173b01f3587d05081ef2618fe056df94defc1c70d21b41903d8bd77a171c67eb481ec2037260dc8c5ae867a61af91966b30ee9734b0b0b38d63d33c114471cf8dd5fc09", + "ocertCounter": 69, + "poolId": "1e54471e137575c8463db3f7630cfae1bdd6387e9532fff846ca0eaa", + "poolIdx": 9, + "vrfSignKey": "20eee7bca6299f7f9eaaa8c94a2b873cfc78deb92052262ef08838884c8b3342d68a44bed117a61e737741fc787b26135ca7e0d802115d5f389e9f068b551968" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "3b94a4b2f286987f64e958d703d16011061e71353cef418e8cf9537f0d7cfb54", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "8f3983a01f458ba6256ee1c740b86416ffe02fb3cf45945911828626851e8446", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "a3014d408b3b34f73e10e0a971d5a5a710f5db97e5b9c97fa5b3221457cfc81a022e38331e03f95bf8069854afa5b932ce77c35673722425d719502520e68d5549a9eb6f25c6175b6d603ee15b913013fb75f9f4a4c5ecedb5bcb3f288fadd520a015063b56cae186454b21f05060a616dcc3753a0fa963791666a3c2359fe5be6d1c54c42bcf82a87aef1583b34df05bd98f23014dc9f61ac6197e0127ce996dc13a77c64d7e5eb106f1d8d9da0968747066add30c07d12eb9ee7fee29f2b0f762464642c1d35adb980792baa73c3e3eece676c9c82858a1fdd34094e6680e0ed050681c4bf39742849d2e8ea0337f4dce636d2e78b5449c365a269d82dc4e337153e75a055c876a511ecd1731111f8512b4edcd831fb1e6013c0e485b4215a2c0fa5639f33ff62a2455e80b6cb5e3cf0ed721aac66bf14ead70fbcaecf896775a4cca54fff0d04abedc36b6b809a8124b7887f8f81fd9f9ddcf19e163f2c002fe3698a8bc53de555cba5e21a29179e9e2c2b410c1d4b0fd703387ef89fe7af5733e2549c699ec466c25727d72934d38add039c9713fe348a7468ba7f53f2e696d28bfff3697234d1301764ef035c29e32a059d714a56b8c31469f2c6d6c1128a96bcfd25d1119c55f533be28a25e9bcf5ed7f96e57920358e6f78602351b270d70591707c6c1dbb926009a5b19d0ee96aeb92f09125242875f33d74e1fc2cf1bf847893bf853c75c4fc1c2bc38643c141600a103b0aa36a8bc86bc599bfe21b72ee67291edee6e5dd11afad4788ac84b136b681cfe905260170a2088933e36be2607ac986a15546931e4f0bbc5ef0d5824bc53af6539a762cb490fa7b168e2", + "ocertCounter": 80, + "poolId": "164b266eedc357d6d61081f90afa085228ea414c0d5ff83ebeee4cc2", + "poolIdx": 8, + "vrfSignKey": "7efb4ebec47faaded633f189a46d7de72468c70e7bb042f5f7d4cea86b6e9e9092411f9a1a29cab8b4ed1ab4357a25b230c014e3045c221b3346b5a5a243783a" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "09ae3d5b734dafaaec4efd982f44b6b2a48eff91380aca8cb854c46bae77d4df", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "adba69c9f91efff97763795c454d8e8c7777a19f467a46cda030880d4b9eae2d", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "62dfd14792df9f6f027997943f1659164839bb35a2ee29ca271d971327a556417b1cf4bff4325ad5a8675f9286253779386aea3a22ed9269382a458978465470c240bf2a1681adcda82378b0cd9f0211c9f7ee6eb26e57ee2b0b92547793e5faa7f183ed48ff763de91c6324f355449b2d96e4f37efde9dc377751844b3314bb196df3e75c4f9ace46f893902c60a911668ad1bc1e93d6a62ed4253594d49d098d0e3c59befe2f1a5b7bc0045a164b8b9e1c5c9ee285bf6c2f6152826ef1252ab39577992ce208e5b172e9d03e46c268454a1502697162f175c586821d0fb5a8f779e38845460603b27a0c2481be83f5613bc192cf58ba2c6ef0c71d20b38c65c0ffd4c56fb8c5cce2e1f7a0efc77a38277faa82580e983c87d4081dd8b5226bc8994114ec7a95f8be871726a6998dce138fc55377f022f84cc97eccdd18e7d6d57fed1211d5c1760ecb4af9b5b47cae934a122baaa6ad7c384219602a21bd2f1b557d7daea41d1d021e34aab3dac320758ba4f9c2d5fddc5a8072097be37af8f2e5fb4037a11632c6fd9d42c62a2e8263af2db7c83d992c933548e0f5d2593b872073cc6e81fe10de7db0508fe7cb27328ac021fd538e8f7254d8d6bda62472face422b543cb5c1eb68fab55f0a77683d4532df74468dee8e18a1b32b92fde2dd6a8dad63af74be2f9c4d3a1d7b57711d09e38e97fb72551eedf3c215beb1c002cd40718c24fe8ed816bd85595083783fa0cb54c0927fef761e74f12b3246eecac6a938ca375bcb5ab7037955122f116659927bdbb741aec609c2c27e3d18c4d5751b52460d0914e68d40014f179d8400db188be2c34a7f98872070b86ad764", + "ocertCounter": 13, + "poolId": "4b1f54a1437906009d347348126cbccf7a0651d67755d22187968e0d", + "poolIdx": 7, + "vrfSignKey": "c2eff0079b54054d22a0888443a45b44f32ef12e8c62679368d1c5128625820e83f3206635b9182a411e2a9e870cc13f5974507b1f84476c8519ad9215ae4678" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "5df347530a5de3f310ebd88248acc2c8683016dc6b18f2e3a7bbf52791a099b4", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "44d44e2a7c17cac92a3d8d3ea711c1a9e10f30e16049b5fa0bd6ea91b7e62719", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "407279cbdaaeb21b358e4392d4aa37938971bb09063a2ced069a5f13a6c6364607b56defde779469a8e58cb3158d879675b9d60f1cf7bf79a8a423439adec16bfe9063bb6c7ffb23f3a85e936f906a1e1478be1b5d015c8d3d78ce5a536558ac25177143dcf1dc132c17d29d3cbf0021f048f9efd73d5d54313adcacdf010db9ace2dd015006dd2ab3660bb567a5ce89cb67ba85e503388ec2c8e9052792f044006c13807ac6128d25f2ab28b755abf844e50c1cf772ee5314a79ee8ac338b28e154499794b6477d7daafca6a41ee1c3a3bbd86cd860f1702ce69d25d10b46aac512667a67f3a0e8c51cc9855dbce4e80c16edc9397f7eeb5ea5f8376d74b9f99ec5e31a2e91a8db0322ff68a383f14d2560ffd1144a020ba8ba7312e314932cb1137e21fde4ffff49e6352a932bf2772ea2ae98dfaf881a80d369caaa2db1dc20a9f0db4e49d0b68167d407b4b400b1327e15ff06c5f41ea131fc9f9c033fb325ebf19f2710cbc4ca12bfa7fe5978dbb0e6018745dabcad22091655e66ba15c3bedbab0ff7cd73107dca9e44cbd79f79f42f4e4babc9311157a0f48befea2e142fb5746f55b71d442ccc304370cdfedc1874f3e6548d8752f50c1c532b408d922a23e940b0420c2dbea9b710d5e1df7cbf1f65e6f6576209d6f676b91ee38f374e8e34da0c4897935fd62eaa4414678d133b6c3a819015707fbc1be3f35f391d84d3614299ab74f2dac5ef942c6930b66b065d2c6f946e9f706ee2a3494f1687ee924cff5f0ebe56cc4e90bbf76c4c80d7b8da18c2cf98005f54955499da7a8f581e4c935a0f5ba5c61f1717662e80d7b82c3a4ca01b1284ff95e0522f50878", + "ocertCounter": 24, + "poolId": "be13ccb4ce55235fe294a6494a3744766e8b2d5e076995fe55ea6f18", + "poolIdx": 6, + "vrfSignKey": "747ba8ee1211024ddac2e9a646ec6e9625667b17b8ee7e8b7f36724a197bbf1d21e64e133738bbee188311034a4f03103e0821a6c0e632f499e96d45d379b300" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "381bcef95d9a62eab8958977b119f57b688451e76855bd1387c7bd1f1fa44f32", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "138c33ffb1f6e3e22115d4b064b5481967c3c3aae52d7e82ea9ef0a8b49cba26", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "8354aa6cfef3fd254204e512d7bac1f2f5cad9648d44630db621b8c30d995b06f89e70c3247938cf8620946f228a641eddeff1006df949b7766fd4a2ddc51ff2123f03f1ba839244e816272ddebfaccd07b396c7d4e7e8127b65e28a34be2af6d99954122949e55f47def97ae436cb9975b8a70ec77c4e57f48ceec0f4c19093b16bccd77319595d472379e17132544772c6ba4c4e4fdde9beb3925353826544a99991ea07b4b34129340df6cba7f4e2a99036c15e2309de61d20d77ba801603cd42f57f6fc3fd127dbb2923dc40375f1d11d0b6df7a73e6178c42fb62221a9095ba2f062465e72d4f344fa3603c2b3eca3a734be85b70820c4c8e8bf91a47217e2126561b88861eb6d764dd5abd0a02cce6dd3baf659acd10c78bb17c48f7035a0c97618c6252664b9ce9541451047d47b888f01b92fb499940b9a5570c7b5b5f6ed566457eebde8295149c67a119da55d05d0d6ea888ae0ee6674420b806b05e938563dd88a5483aafec9d89e92d14aea22a0a9b8dd77e7fcf14b4f58ea4b24be7a3866f9e9fd4646be578a2ba3baf516b6cf5b543267cd8bbd9684d451673fa5a92583c2025c7213b2d0f5e3f6e99109691d043e4660b8a421a0b812aa6c63b782437363ef2bbcca05cb0de5d5163d29645b1f58be7307037ad8ea25494c204906d3df79b42e8529a7e9a98a51d9e31f116ec499ebbab55f0eba55bfc876320fd2f8d1ac593ea39020267f2a928b044458d85a5a2741dfdccee723650dff5cc3d6a9824fb4514cd46aaed452cade04436f0c26c5e156e3d9d5d6524cc85dff4676d1eceb7cde887cb25345e7447b36d36f62ae2e497ebdc03b2f05f167604", + "ocertCounter": 12, + "poolId": "7bb1305489fc4e4d22ead2b66c15faae1a45757deab7aec3d5729f31", + "poolIdx": 5, + "vrfSignKey": "00ac7a952c7872593dc50b04b0f4d9b7ee60fd89c52debe062c984a1e06d8f4ff80ce1e74d580c078c2e6cceeaaf2af18c87d72e85df14897ced396a9e803bf4" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "ac5898dccc3a60abec9582972f2354dabc89fe621bfde78ecc89e1abd40caa51", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "e46e61e80d2ab5699d2c16ba84d98e779826fec6dfeda7306f24a7a05c7f153d", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "970a71c9c861b207b2d68500e44967ab3b0e968d425dd89edd78415a045953383a58cb156c9bc19e4a54f4216cef2a8b49dbe70de3f32d8b90b046b6fce5291c2a33fd2dc4086d99d1309eee46f49e76b5d9f86465fb0ae9f1b3dec4c8e2c15dcb0120b19dd9e1496fd9350141f284d40e2350e86404f031597cefa7063a4a35f8963dcdeed26383d4f8ab03e0375232f2b3294a627536f1de626c915f5d736ae92b198a7888cb9397d81e563e067f3e0f5709159027827cc74fd3ea0583051a1cbcb8f3cdb6280b50138328292f33b6b7dd202214124507fde1789777f1737f0ed6715708fde69ed403fdc25320819b3aadccc490250c2ffef1097b8835e00bd390cef46fb8ae253be49c8d3b43aa48387f0e50a32c3f2b6fe25613e06e4d3873903f3ddbef0d2d520380966869fcf11a1dd7275b1b6cccc313d2a718de1b2ec97e97ade97d8c224f3b977911a6912791e9b69657a55f92e1db1df03ac7b6dfd2e5fc55f72a46076eaf27598525fe452ace332397e8a2687d494b086256933ebfd955443d19d647a98c17f0472d136b4ae46d4548cc837ae9ea18449b259f3ef4d10e5e9660595ba7403b4bd8b3719c8eb6bad093aaa5d53b88525bb442fd56ea3820cc09fd0ee8dacd88f36ea31d266dbab5ee6ae55142594774498e7e3a3ff3fad6228c6e1fe23e3ef39e2edbe258351d9a1b8b50aa35a9f5e3e6c4f376d1c3e7f55dbc2415f86bd23c1e720da6ee0b2f318900a16161c0f50fb90b75f98a6948885aae058502fd5d51b5f6bafa8ec285d1cac641488bdaf90d99331da3edd4e2db2ac63975bb6791ba02822a7d25ea87aa5b3756ed3decb5ef8f09970600", + "ocertCounter": 24, + "poolId": "3fcc6db066b66f2c99e9370d9730d142b79ba5653be961ca635ca1d9", + "poolIdx": 4, + "vrfSignKey": "6da9d197f081ab89f2087fd25035d6283df57da359bb9b6435110cb9ba86892d37264127bcb2df028319e576fbe8727a7d9b2d1cdcda8b30c6cd377f0630bbd8" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "6f56d355d2730d73d79e28d3d665571f7b49613d17e1517a8265b85df8a33a71", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "12bee8075ae5cc4989eaacefe9eed20778cf30d98b1cc23cd1624e441c1ce856", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "4c7087d0b7dfa86c4cbc585f83c469a9baad3963cbbc3bd2929580d33a8c7e4575aef5a63ef95c0ed641f54be124a45784b534a09ceb233ce864e49c22eb059f49e52e9b1d0ead0e54d857c5815ddda8179a71d8d7b8545e04f753d9b7e6d0f5ba91ad9b33beaf1e83d2afef9e37e3786639e16be5e953a1239a1c8323ecd721faaded26ce11bedbe08cd5946fc2142f0888464d394f3f17734d03de635cb1eb480e6b8494a0676c5da2745c2aa9dfeda302d8c284f528fcc41229a39455257cb667f4a3e728c95b38b0191bdaa14ffde3dd5c743ff7fd22ee1d5192dbf287225083759d8045a904fc9dfbdfabdba331cd4ce74ce4d7c0a02454c7bcf9532873715f9f7a5657c06b1fd73e0da46f660020680004e9b76703f82bc36d6382363ad2ec04425c6e9031b2e1a19188f36b4d2dae71afb8b94fa27e129ede608b9d4687768c78c7597b8204f60e91b43c8979883de8bfbbe85172e87af8122e02609528db96efee84ba8a4582f9c0a619807de4ace773edda4570f8021db7cc2c74a7c8a57d7dadfe159b3a52f2d478497a720535d348cf436857a6a55c610946b2a51ea170ddc9b6b6c0d8af59afccb2f7049f70be744277b84288d959936b98d13c6563daf041aedbeeb426ba200bed4faf746a0361003e60cec7be069a0ad6e03444e0039a6124686c8f4df0fd22225f8ae00a86868cef64dc68d582307f23ed220dd52fc17095d7d7d50658942a08d1525b1ba119715edf3d4d0a3cf003c3f0c2964050c244e4241be08e766798496e0b6968e290c1ef50ef1805323e6ed9fe7a5bd78215e32b55b817b45145731de78b10f9afb4df0a89713b80a43b5dd8abe4", + "ocertCounter": 52, + "poolId": "9f90fbe8b41ba352aafa77475f9e6dce79baf79491526e0696a0a7d8", + "poolIdx": 3, + "vrfSignKey": "d7fc9765f0284073f4e99615274bc11d2d2b6c06411e303d6c24f00cfda484e1a8b99efbe8bd8fb6f1af06648ef394acda09d5f3acd65d22b316489b52691da7" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "2e17e8915ffbdf9405e47a6b51ffde2d4b5c6ed19066ffe9895754da5875b54d", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "203ceb6a4565e4d27df332143319019aeeb48a8c4ebf6be4786711104e99e978", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "ae05f381a0fed52437dffcd02d0265bc09edfc40067c0da453108f9f595a9a5b7ade31ca8b1405caeb3d186449b6aeecf5a2c9a8eb7743b02d328e448759341b1a3631680c81fd0642ee45aeedefa4ae83ebf2c78a681a3f831e50c628929c8b5897e0f273ecfab8671cda14da4d1a5d44d9337270b394b4c0a03e1912eb75520304aec4ebad13e36c73f33121c7d2971cd37457541fd08804dabf6067eb57f191a64261efd6984933d34e22e5267056bbcb58ac74362e3b9bec47024ac873539faa3cfe89bb91571cb1bf47f14445ae3a7734afe96d6f7c683b64683e1ac5256a264dcd61f5b4d089e011825329ee0b0a8844340653c05d7e4864ca566fd1cdf1a8bdaf43285cf8ff621478980cb756ba86019bdf1baddc904298c573015a8971d8215977d748c327d9dfc06c1a65539feeebb7898cbfca7903088818a96baff4a5e2f5a645ec161eef5d98892c128286b49dd33d5412f2b3d37a6ea39b77cdc14119ebba5b1afbdee35c292389ebd0bd318f4b7d48adca59cb2b7ed66113575cd3bf11be8549bced3cfac0c66b6ce83b28238e0de549d46aaa281a0d39784b1277b6dcd403512cc55e34db3feffe145a6797dc967749679c595d154f5be7467b46a29fff240c7aacfd49b7d4a0ec4dd0b6dab0f1a08a51c3fd796cd1bda647208509138b9278bd30b0208bcbc683d7f58db1568c6b06d0a9aca741fe39aeef56bfaa8b67b17443b166cc94661135ebf6adb384380ae82dd0e80f3bfbebef8c7c253a04279ba7a367b2b4a870c3e2581add3e5824bcc9dd53bbaee2aedcbd58fa8ef76c7c11b3b6df977e036ce5cbfc1f7c974e70abf035ad72b8a5e0be09ae", + "ocertCounter": 77, + "poolId": "d4073ef01e18eed9bac3165a5268ae7229be38f5bc2360dc2830c603", + "poolIdx": 2, + "vrfSignKey": "0c2471a9c3208a3939aa9cc401d17371fd85567cf08e50944fceb560537b4b13e0c61af1967457770433454c2b27cd6b922427f8ae13148c8b09f53ee7a56710" + }, + { + "chain": "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6", + "coldSignKey": "a34ec398be1915ed731aff6fb6f4318383920bc9ae1f4fa87ace771e54d32383", + "individualStake": { + "individualPoolStake": { "denominator": 16, "numerator": 1 }, + "individualPoolStakeVrf": "65833b6a5fcd19f118f260922a0685620bcdead5b40753557aa7ff30bc9ec796", + "individualTotalPoolStake": 625000000000000 + }, + "kesSignKey": "6c493eaf81a3cb0b38e53ec237d7c3f297a891d5d87da1f6cc3ddb027fd6062b90f84030c57c607f6e45e7486e490318c02797394ccac496080a95a11102eec85f172dc4077a26ab4fc58ef6de644079bcd76e7553b4468e3ec64a52c2bf5ccda05395e1cf6acb1d2b11d88202930f17e17e3233e55f2cc60fdccf05174901d534b7b56896934558db7bfe245774f639fa5cc1683b241cc8aaca6a16efb5c5abc655273b8dec2d0665a7473a84b905410e17a1f19a853d25b32f341e11e66e53f61b5bbbdce9419ff8b4a3438dc5f959cb3066161b4f51f848aca11fbaaa98afadd3ace098ed97baa0105a3949bffe6a7f511c564c674aca7019121763ac7184ced6f3eb73033175d25410cdd7a018c8e15da090dd1d8cc71f36408ad6f69797b70eb348856734bfc2e11c083d84a92f997cc1a7399b6dd6ea38e1c82a535e9eef7881f194390cc1174ab17736fb4d3d24f229d4276219c3aed5e7bfaf2faaaf64aa39875ef67c21415f076a39f22cb8b7607ff0c5e4d60dc393a7593bbfff567e3db58d6de8fe25f153d654184e24e8e3e71faffaca0fd480c83f96d6b666577be9a37ddc646152aadc8de77508ecc5583ab2c2420640c82878b90ddb528bc2c490b49bd76a543df7855949494093c385db0104f6f8711a163e2a9fae72841fb9eae2261808fb1436203b948a4a4b29be573a00fdea79962087ccc70e60fc368e1b72d191d1acf8021a4570bc66395994a7ee10b6e22cb38e99831a2c2c119a8a254c6b20bc0f7ce151585fcd2ba76ae8ffdc4744204b5bc354f12b00927718c357791e112a4c26a02831faae28508f708944423e2a1d0c5c9c7a471ed30225", + "ocertCounter": 76, + "poolId": "50484a702b93327308d85f51f1831940fdddcb751bf43bc3376c42b9", + "poolIdx": 1, + "vrfSignKey": "ddd17f518daebb08a25d00b3913eb00777978b473d42f0b637eae26a41fb9c8c349fa6de24709731a7f27d0e4f711d73018f285d2bf91fd0bcc67559c478a2e7" + } + ] + } +} diff --git a/crates/amaru/Cargo.toml b/crates/amaru/Cargo.toml index 20ebb65e2..5e20b6efc 100644 --- a/crates/amaru/Cargo.toml +++ b/crates/amaru/Cargo.toml @@ -14,12 +14,14 @@ rust-version.workspace = true build = "build.rs" [dependencies] +acto.workspace = true async-trait.workspace = true clap.workspace = true gasket.workspace = true hex.workspace = true indicatif.workspace = true indoc.workspace = true +minicbor.workspace = true opentelemetry-otlp.workspace = true opentelemetry.workspace = true opentelemetry_sdk.workspace = true @@ -28,6 +30,8 @@ pallas-crypto.workspace = true pallas-network.workspace = true pallas-primitives.workspace = true pallas-traverse.workspace = true +serde_json.workspace = true +slot-arithmetic.workspace = true sysinfo.workspace = true thiserror.workspace = true tokio = { workspace = true, features = ["rt", "rt-multi-thread", "signal"] } diff --git a/crates/amaru/src/bin/amaru/cmd/daemon.rs b/crates/amaru/src/bin/amaru/cmd/daemon.rs index 17b2d4666..2e2cd776e 100644 --- a/crates/amaru/src/bin/amaru/cmd/daemon.rs +++ b/crates/amaru/src/bin/amaru/cmd/daemon.rs @@ -50,6 +50,10 @@ pub struct Args { /// Path of the chain on-disk storage. #[arg(long, value_name = "DIR", default_value = super::DEFAULT_CHAIN_DB_DIR)] chain_dir: PathBuf, + + /// The address to listen on for incoming connections. + #[arg(long, value_name = "LISTEN_ADDRESS", default_value = super::DEFAULT_LISTEN_ADDRESS)] + listen_address: String, } pub async fn run( @@ -106,5 +110,7 @@ fn parse_args(args: Args) -> Result> { chain_dir: args.chain_dir, upstream_peers: args.peer_address, network: args.network, + network_magic: args.network.to_network_magic(), + listen_address: args.listen_address, }) } diff --git a/crates/amaru/src/bin/amaru/cmd/mod.rs b/crates/amaru/src/bin/amaru/cmd/mod.rs index d37f02711..253aaeb96 100644 --- a/crates/amaru/src/bin/amaru/cmd/mod.rs +++ b/crates/amaru/src/bin/amaru/cmd/mod.rs @@ -25,6 +25,9 @@ pub(crate) const DEFAULT_LEDGER_DB_DIR: &str = "./ledger.db"; /// Default path to the on-disk chain storage. pub(crate) const DEFAULT_CHAIN_DB_DIR: &str = "./chain.db"; +/// Default address to listen on for incoming connections. +pub(crate) const DEFAULT_LISTEN_ADDRESS: &str = "0.0.0.0:3001"; + /// Utility function to parse a point from a string. /// /// Expects the input to be of the form '.', where `` is a number and `` diff --git a/crates/amaru/src/stages/consensus/chain_forward.rs b/crates/amaru/src/stages/consensus/chain_forward.rs index 1e96bb9f0..03bbcf5bf 100644 --- a/crates/amaru/src/stages/consensus/chain_forward.rs +++ b/crates/amaru/src/stages/consensus/chain_forward.rs @@ -12,13 +12,27 @@ // See the License for the specific language governing permissions and // limitations under the License. -use amaru_consensus::consensus::store::ChainStore; +use acto::{AcTokio, ActoCell, ActoMsgSuper, ActoRef, ActoRuntime}; +use amaru_consensus::{consensus::store::ChainStore, IsHeader}; use amaru_kernel::{Hash, Header}; use amaru_ledger::BlockValidationResult; +use client_protocol::{client_protocols, ClientProtocolMsg}; +use client_state::{to_pallas_point, ClientOp}; use gasket::framework::*; -use std::sync::Arc; -use tokio::sync::Mutex; -use tracing::trace_span; +use pallas_network::{ + facades::PeerServer, + miniprotocols::{chainsync::Tip, Point}, +}; +use std::{cell::RefCell, collections::HashMap, sync::Arc}; +use tokio::{ + net::TcpListener, + sync::{ + mpsc::{self, Receiver}, + Mutex, + }, + task::JoinHandle, +}; +use tracing::{error, info, trace_span}; pub type UpstreamPort = gasket::messaging::InputPort; @@ -31,49 +45,135 @@ pub const EVENT_TARGET: &str = "amaru::consensus::chain_forward"; /// forward new chain downstream #[derive(Stage)] -#[stage( - name = "consensus.forward", - unit = "BlockValidationResult", - worker = "Worker" -)] +#[stage(name = "consensus.forward", unit = "Unit", worker = "Worker")] pub struct ForwardStage { pub store: Arc>>, pub upstream: UpstreamPort, + pub network_magic: u64, + pub runtime: AcTokio, + pub listen_address: String, + pub downstream: Option>, +} + +#[derive(Debug, Clone)] +pub enum ForwardEvent { + Listening(u16), + Forward(Point), } impl ForwardStage { - pub fn new(store: Arc>>) -> Self { + pub fn new( + downstream: Option>, + store: Arc>>, + network_magic: u64, + listen_address: &str, + ) -> Self { + #[allow(clippy::expect_used)] + let runtime = + AcTokio::new("consensus.forward", 1).expect("failed to create AcTokio runtime"); Self { store, upstream: Default::default(), + network_magic, + runtime, + listen_address: listen_address.to_string(), + downstream, } } } -pub struct Worker {} +pub enum Unit { + Peer(RefCell>), + Block(BlockValidationResult), +} + +pub struct Worker { + server: JoinHandle<()>, + incoming_peers: Receiver, + tip: Tip, + clients: ActoRef, +} + +impl Drop for Worker { + fn drop(&mut self) { + self.server.abort(); + } +} #[async_trait::async_trait(?Send)] impl gasket::framework::Worker for Worker { - async fn bootstrap(_stage: &ForwardStage) -> Result { - Ok(Self {}) + async fn bootstrap(stage: &ForwardStage) -> Result { + let server = TcpListener::bind(&stage.listen_address).await.or_panic()?; + if let Some(downstream) = &stage.downstream { + tracing::debug!("sending listening event"); + downstream.send(ForwardEvent::Listening( + server.local_addr().or_panic()?.port(), + )); + } + + let (tx, incoming_peers) = mpsc::channel(10); + + let clients = stage + .runtime + .spawn_actor("chain_forward", |cell| { + client_supervisor(cell, stage.store.clone()) + }) + .me; + + let network_magic = stage.network_magic; + let server = tokio::spawn(async move { + loop { + // due to the signature of TcpListener::accept, this is the only way to use this API + // in particular, it isn’t possible to poll for new peers within the `schedule` method + let peer = match PeerServer::accept(&server, network_magic).await { + Ok(peer) => peer, + Err(e) => { + tracing::warn!( + target: EVENT_TARGET, + "error accepting peer: {e}", + ); + continue; + } + }; + + match tx.send(peer).await { + Ok(_) => {} + Err(e) => { + tracing::info!( + target: EVENT_TARGET, + "dropping incoming connection: {e}" + ); + } + } + } + }); + + Ok(Self { + server, + incoming_peers, + tip: Tip(Point::Origin, 0), + clients, + }) } async fn schedule( &mut self, stage: &mut ForwardStage, - ) -> Result, WorkerError> { - let unit = stage.upstream.recv().await.or_panic()?; - - Ok(WorkSchedule::Unit(unit.payload)) + ) -> Result, WorkerError> { + tokio::select! { + block = stage.upstream.recv() => Ok(WorkSchedule::Unit(Unit::Block(block.or_panic()?.payload))), + peer = self.incoming_peers.recv() => { + match peer { + Some(peer) => Ok(WorkSchedule::Unit(Unit::Peer(RefCell::new(Some(peer))))), + None => Err(WorkerError::Panic), + } + } + } } - async fn execute( - &mut self, - unit: &BlockValidationResult, - _stage: &mut ForwardStage, - ) -> Result<(), WorkerError> { + async fn execute(&mut self, unit: &Unit, stage: &mut ForwardStage) -> Result<(), WorkerError> { match unit { - BlockValidationResult::BlockValidated(point, span) => { + Unit::Block(BlockValidationResult::BlockValidated(point, span)) => { // FIXME: this span is just a placeholder to hold a link to t // the parent, it will be filled once we had the storage and // forwarding logic. @@ -85,30 +185,103 @@ impl gasket::framework::Worker for Worker { hash = %Hash::<32>::from(point), ); + // FIXME: block height should be part of BlockValidated message + let store = stage.store.lock().await; + if let Some(header) = store.load_header(&Hash::from(point)) { + self.tip = Tip(to_pallas_point(point), header.block_height()); + self.clients.send(ClientMsg::Op(ClientOp::Forward(header))); + } + + if let Some(downstream) = &stage.downstream { + downstream.send(ForwardEvent::Forward(to_pallas_point(point))); + } + Ok(()) } - BlockValidationResult::BlockValidationFailed(point, span) => { - let _span = trace_span!( + Unit::Block(BlockValidationResult::RolledBackTo(point, span)) => { + info!( target: EVENT_TARGET, parent: span, - "forward.block_validation_failed", slot = ?point.slot_or_default(), hash = %Hash::<32>::from(point), + "rolled_back_to" ); - Err(WorkerError::Panic) + // FIXME: block height should be part of BlockValidated message + let store = stage.store.lock().await; + if let Some(header) = store.load_header(&Hash::from(point)) { + self.tip = Tip(to_pallas_point(point), header.block_height()); + self.clients + .send(ClientMsg::Op(ClientOp::Backward(to_pallas_point(point)))); + } + + Ok(()) } - BlockValidationResult::RolledBackTo(point, span) => { - let _span = trace_span!( + Unit::Block(BlockValidationResult::BlockValidationFailed(point, span)) => { + error!( target: EVENT_TARGET, parent: span, - "rolled_back_to", slot = ?point.slot_or_default(), hash = %Hash::<32>::from(point), + "block_validation_failed" ); Ok(()) } + Unit::Peer(peer) => { + // FIXME: gasket design bug that we only get &Unit and thus cannot take values from it without internal mutability + let peer = peer.borrow_mut().take(); + if let Some(peer) = peer { + self.clients.send(ClientMsg::Peer(peer, self.tip.clone())); + } else { + tracing::error!(target: EVENT_TARGET, "Unit::Peer was empty in execute"); + } + Ok(()) + } } } } + +#[allow(clippy::large_enum_variant)] +enum ClientMsg { + Peer(PeerServer, Tip), + Op(ClientOp), +} + +async fn client_supervisor( + mut cell: ActoCell>, + store: Arc>>, +) { + let mut clients = HashMap::new(); + while let Some(msg) = cell.recv().await.has_senders() { + match msg { + ActoMsgSuper::Message(ClientMsg::Peer(peer, tip)) => { + let addr = peer + .accepted_address() + .map(|a| a.to_string()) + .unwrap_or_default(); + + let client = cell.spawn_supervised(&addr, { + let store = store.clone(); + move |cell| client_protocols(cell, peer, store, tip) + }); + clients.insert(client.id(), client); + } + ActoMsgSuper::Message(ClientMsg::Op(op)) => { + for client in clients.values() { + client.send(ClientProtocolMsg::Op(op.clone())); + } + } + ActoMsgSuper::Supervision { id, name, result } => { + tracing::info!(target: EVENT_TARGET, "client {} terminated: {:?}", name, result); + clients.remove(&id); + } + } + } +} + +mod client_protocol; +mod client_state; + +#[cfg(test)] +mod tests; diff --git a/crates/amaru/src/stages/consensus/chain_forward/README.md b/crates/amaru/src/stages/consensus/chain_forward/README.md new file mode 100644 index 000000000..3507ed0e4 --- /dev/null +++ b/crates/amaru/src/stages/consensus/chain_forward/README.md @@ -0,0 +1,38 @@ +# chain_forward: Downstream Server + +![diagram](./chain_forward.png) + +This stage needs to handle a high degree of concurrency due to + +- getting block validation results +- receiving new client connections +- receiving various requests from those clients + +Placing all these functions into one state machine is impractical due to the multiplicative state complexity explosion. +The current design therefore splits up the state into non-concurrent pieces and places each piece within an [`acto`](https://docs.rs/acto) actor. +Currently, only the chain sync and keep alive protocols are fully implemented. + +## Accepting client connections + +This functionality is given by the `PeerServer::accept` async function from Pallas, which in turn inherits its API design constraints from the Tokio [`TcpListener`](https://docs.rs/tokio/latest/tokio/net/struct.TcpListener.html). +Since its `accept` method borrows `self`, this async function cannot be spawned as a separate task, nor can its `Future` be stored within the `ForwardStage` without using `unsafe`; this API can only be used within another async function calling `accept` in a loop. +Therefore, such a task is spawned from the worker’s `bootstrap` hook and will send received connections to the worker via a bounded queue. + +## Handling client requests + +The `PeerServer` API bundles miniprotocol instances for each of the supported protocols, but unfortunately, using these instances via the `PeerServer` requires an exclusive reference, so the `PeerServer` needs to be deconstructed in order to allow concurrent usage of the protocols (like concurrently waiting for requests). +Each of the protocol instances is managed by one actor whose sole responsibility is to react to client requests as appropriate. +For `keepalive` this is trivial because no further information is needed to answer a request. +In the case of `chainsync` this actor needs to obtain information regarding the current best chain and consequently the list of outstanding header operations (roll forward or backward) in order to respond to requests for the next header. +Since it is impossible to await the next client request while staying responsive to incoming block validation updates, these two responsibilities need to be separated into two actors: + +- `chain_sync` handles block validation updates and tracks them relative to the latest communicated state with the client +- `chain_sync_handler` handles client requests + +Since `chain_sync` has no otherwise forbidding responsibilities, it stays responsive to requests from the `chain_sync_handler`. +This concurrency is the minimum required complexity to solve this problem, i.e. the split into these two actors should yield optimal readability and maintainability of the resulting code. +A further simplification of the communication between these two actors is achieved by performing the intersect part of the protocol — which must happen first — within the `chain_sync` actor before handing off the header requests part to the `chain_sync_handler`; +this is possible because I presume one intersection request to be a precondition for the first header request. + +Between the level of per-protocol actors for one client and the overall client supervisor there is an additional level of per-client supervision in the `client_protocols` actors that serves to bundle the miniprotocols spoken over one client connection. +The effect is that failure in one protocol will tear down the others and the connection as well. diff --git a/crates/amaru/src/stages/consensus/chain_forward/chain_forward.d2 b/crates/amaru/src/stages/consensus/chain_forward/chain_forward.d2 new file mode 100644 index 000000000..34f7e881d --- /dev/null +++ b/crates/amaru/src/stages/consensus/chain_forward/chain_forward.d2 @@ -0,0 +1,126 @@ +title: { + label: "internal design of the chain_forward stage" + near: top-center + shape: text + style.font-size: 24 + style.bold: true +} + +# Styles +classes: { + component: { + style: { + stroke: "#2a2a2a" + fill: "#ffffff" + font-color: "#2a2a2a" + border-radius: 10 + shadow: true + } + } + container: { + style: { + stroke: "#2a2a2a" + fill: "#f5f5f5" + font-color: "#2a2a2a" + border-radius: 10 + shadow: true + } + } + subcomponent: { + style: { + stroke: "#666666" + fill: "#ffffff" + font-color: "#2a2a2a" + border-radius: 5 + shadow: false + } + } +} + +prev: { + class: component + label: "BlockValidationResult" +} + +chain_forward: { + class: container + label: "chain_forward" + + accept: { + class: component + label: "TcpListener accept task" + } + + stage: { + class: component + label: "" + t: |md + ### ForwardStage / Worker + tracks current `tip` + | + } + + AcTokio: { + class: component + + client_supervisor: { + class: subcomponent + label: "" + t: |md + ### client_supervisor + maintains a map of live client actors + | + } + + client_protocols: { + class: subcomponent + label: "" + t: |md + ### client_protocols + supervises the per-miniprotocol actors + | + } + + chain_sync: { + class: subcomponent + label: "" + t: |md + ### chain_sync + performs initial intersection and
+ tracks outstanding messages to be sent to the client + | + } + chain_sync_handler: { + class: subcomponent + label: "" + t: |md + ### chain_sync_handler + runs the `chainsync::Server` mini-protocol + | + } + + block_fetch: {class: subcomponent} + tx_submission: {class: subcomponent} + keep_alive: { + class: subcomponent + label: "" + t: |md + ### keep_alive + runs the `keepalive` ping pong protocol + | + } + + client_supervisor -> client_protocols: "spawns for each client connection\nand forwards block updates to all" + client_protocols -> chain_sync: "forwards block updates" + chain_sync -> chain_sync_handler: "sends server responses" + chain_sync_handler -> chain_sync: "requests headers" + client_protocols -> block_fetch + client_protocols -> tx_submission + client_protocols -> keep_alive + } + + accept -> stage: "new connections as `PeerServer`" + stage -> AcTokio.client_supervisor: "forwards block updates or received connections" +} + +prev -> chain_forward.stage diff --git a/crates/amaru/src/stages/consensus/chain_forward/chain_forward.png b/crates/amaru/src/stages/consensus/chain_forward/chain_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..65b8342f4dec47e25e48ecc83ccb33cc2253a583 GIT binary patch literal 563809 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%0DL6Kq^k8L2|XG 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%0A5wizctDXbtjaCuH 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
  • 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

    {x;bB%;W^Z*roJ;etmJmz2)#e0 zr0($aNpRqW`!CozM!GEMaTrMzKQCSF7vXTf@t%fVTF8Q}l94!MxIX|h`>}$#?j+`au3DEcpB?J`JCs0Zet}sV$etVX7r4M2v$OsZN8N5{`;N(11Md{1<9ee6 z_rz~Ng$6%z%4Yi%yZ4+=+?P*=Br_*Ag%PGt0L5g)r%2zVn z%0A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

    bFwj3ThU``0;S}fBy6UP!1$^r-3Ny~h0*h3$ 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 H0&jAoB5UJT=JDh8m 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 literal 0 HcmV?d00001 diff --git a/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs b/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs new file mode 100644 index 000000000..df2768113 --- /dev/null +++ b/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs @@ -0,0 +1,236 @@ +use super::client_state::{find_headers_between, ClientOp, ClientState}; +use acto::{ActoCell, ActoInput, ActoRef, ActoRuntime, PanicOrAbort}; +use amaru_consensus::consensus::store::ChainStore; +use amaru_kernel::{to_cbor, Header}; +use pallas_network::{ + facades::PeerServer, + miniprotocols::{ + blockfetch, + chainsync::{self, ClientRequest, HeaderContent, Tip}, + keepalive, txsubmission, + }, +}; +use std::sync::Arc; +use tokio::sync::Mutex; + +#[derive(Debug, thiserror::Error)] +pub enum ClientError { + #[error("client asked for headers before intersection was found")] + EarlyRequestNext, + #[error("no intersection found")] + NoIntersection, + #[error("client asked for intersection after it was already found")] + LateIntersection, + #[error("client terminated")] + ClientTerminated, + #[error("handler failure: {0}")] + HandlerFailure(PanicOrAbort), + #[error("chainsync error: {0}")] + ChainSync(#[from] chainsync::ServerError), + #[error("block fetch error: {0}")] + BlockFetch(#[from] blockfetch::ServerError), + #[error("tx submission error: {0}")] + TxSubmission(#[from] txsubmission::Error), + #[error("keep alive error: {0}")] + KeepAlive(#[from] keepalive::ServerError), +} + +pub enum ClientProtocolMsg { + Op(ClientOp), +} + +pub async fn client_protocols( + mut cell: ActoCell>, + server: PeerServer, + store: Arc>>, + tip: Tip, +) -> Result<(), ClientError> { + let _block_fetch = cell.spawn_supervised("block_fetch", { + let store = store.clone(); + move |cell| block_fetch(cell, server.blockfetch, store) + }); + let _tx_submission = cell.spawn_supervised("tx_submission", move |cell| { + tx_submission(cell, server.txsubmission) + }); + let _keep_alive = + cell.spawn_supervised("keep_alive", move |cell| keep_alive(cell, server.keepalive)); + + let chain_sync = cell.spawn_supervised("chainsync", move |cell| { + chain_sync(cell, server.chainsync, tip, store) + }); + + while let ActoInput::Message(msg) = cell.recv().await { + match msg { + ClientProtocolMsg::Op(op) => chain_sync.send(ChainSyncMsg::Op(op)), + }; + } + + Ok(()) +} + +#[allow(clippy::large_enum_variant)] +pub enum ChainSyncMsg { + /// An operation coming in from the ledger + Op(ClientOp), + /// A request for data from the client + ReqNext, +} + +async fn chain_sync( + mut cell: ActoCell>, + mut server: chainsync::Server, + tip: Tip, + store: Arc>>, +) -> Result<(), ClientError> { + // TODO: do we need to handle validation updates already here in case the client is really slow to ask for intersection? + let Some(ClientRequest::Intersect(req)) = server.recv_while_idle().await? else { + // need an intersection point to start + return Err(ClientError::EarlyRequestNext); + }; + + tracing::debug!("finding headers between {:?} and {:?}", tip.0, req); + let Some((intersection, client_at)) = find_headers_between(&*store.lock().await, &tip.0, &req) + else { + tracing::debug!("no intersection found"); + server.send_intersect_not_found(tip).await?; + return Err(ClientError::NoIntersection); + }; + tracing::debug!("intersection found: {client_at:?}"); + server + .send_intersect_found(client_at.0.clone(), tip) + .await?; + + let mut state = ClientState::new(store, intersection.into(), client_at); + + let parent = cell.me(); + let handler = cell.spawn_supervised("chainsync_handler", move |cell| { + chain_sync_handler(cell, server, parent) + }); + + let mut waiting = false; + loop { + let input = cell.recv().await; + match input { + ActoInput::Message(ChainSyncMsg::Op(op)) => { + state.add_op(op); + if waiting { + if let Some((op, tip)) = state.next_op().await { + waiting = false; + handler.send(Some((op, tip))); + } + } + } + ActoInput::Message(ChainSyncMsg::ReqNext) => { + if let Some((op, tip)) = state.next_op().await { + handler.send(Some((op, tip))); + } else { + handler.send(None); + waiting = true; + } + } + ActoInput::NoMoreSenders => return Ok(()), + ActoInput::Supervision { result, .. } => { + return result.map_err(ClientError::HandlerFailure).and_then(|x| x); + } + } + } +} + +/// This actor handles the ReqNext part of the chainsync protocol. +/// It will ask the parent for the next operation whenever needed. +/// The parent may respond with None to indicate the need to await, then it will eventually send the next operation. +async fn chain_sync_handler( + mut cell: ActoCell, impl ActoRuntime>, + mut server: chainsync::Server, + parent: ActoRef, +) -> Result<(), ClientError> { + loop { + let Some(req) = server.recv_while_idle().await? else { + return Err(ClientError::ClientTerminated); + }; + if !matches!(req, ClientRequest::RequestNext) { + return Err(ClientError::LateIntersection); + }; + parent.send(ChainSyncMsg::ReqNext); + + if let ActoInput::Message(op) = cell.recv().await { + match op { + Some((ClientOp::Forward(header), tip)) => { + server + .send_roll_forward(to_header_content(header), tip) + .await?; + } + Some((ClientOp::Backward(point), tip)) => { + server.send_roll_backward(point, tip).await?; + } + None => { + server.send_await_reply().await?; + let ActoInput::Message(Some((op, tip))) = cell.recv().await else { + return Ok(()); + }; + match op { + ClientOp::Forward(header) => { + server + .send_roll_forward(to_header_content(header), tip) + .await?; + } + ClientOp::Backward(point) => { + server.send_roll_backward(point, tip).await?; + } + } + } + } + } else { + // parent terminated + return Ok(()); + } + } +} + +fn to_header_content(header: Header) -> HeaderContent { + HeaderContent { + variant: 1, + byron_prefix: None, + cbor: to_cbor(&header), + } +} + +enum BlockFetchMsg {} + +async fn block_fetch( + _cell: ActoCell, + mut server: blockfetch::Server, + _store: Arc>>, // TODO: need a block store here +) -> Result<(), ClientError> { + while let Some(req) = server.recv_while_idle().await? { + tracing::info!("block fetch request: {:?}", req); + // TODO: Implement block fetch + server.send_no_blocks().await?; + } + + Ok(()) +} + +enum TxSubmissionMsg {} + +async fn tx_submission( + _cell: ActoCell, + mut server: txsubmission::Server, +) -> Result<(), ClientError> { + server.wait_for_init().await?; + + // TODO: Implement tx submission + + Ok(()) +} + +enum KeepAliveMsg {} + +async fn keep_alive( + _cell: ActoCell, + mut server: keepalive::Server, +) -> Result<(), ClientError> { + loop { + server.keepalive_roundtrip().await?; + } +} diff --git a/crates/amaru/src/stages/consensus/chain_forward/client_state.rs b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs new file mode 100644 index 000000000..d47d88358 --- /dev/null +++ b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs @@ -0,0 +1,137 @@ +use amaru_consensus::{consensus::store::ChainStore, IsHeader}; +use amaru_kernel::{Hash, Header}; +use pallas_network::miniprotocols::{chainsync::Tip, Point}; +use std::{collections::VecDeque, sync::Arc}; +use tokio::sync::Mutex; + +#[allow(clippy::large_enum_variant)] +#[derive(Debug, Clone, PartialEq, Eq)] +pub(super) enum ClientOp { + Backward(Point), + Forward(Header), +} + +/// The state we track for one client. +/// +/// The `ops` list may contain up to one rollback at the front only. +pub(super) struct ClientState { + store: Arc>>, + /// The list of operations to send to the client. + ops: VecDeque, + /// The point we presume the client is at. + /// This is updated as soon as we send an operation to the client. + client_at: Tip, +} + +impl ClientState { + pub fn new( + store: Arc>>, + ops: VecDeque, + client_at: Tip, + ) -> Self { + Self { + store, + ops, + client_at, + } + } + + pub async fn next_op(&mut self) -> Option<(ClientOp, Tip)> { + let op = self.ops.pop_front()?; + let tip = self.tip().await; + Some((op, tip)) + } + + pub async fn tip(&self) -> Tip { + if let Some(op) = self.ops.back() { + match op { + ClientOp::Backward(point) => { + let store = self.store.lock().await; + #[allow(clippy::expect_used)] + let header = store + .load_header(&hash_point(point)) + .expect("rollback point was not in store"); + Tip(point.clone(), header.block_height()) + } + ClientOp::Forward(header) => { + Tip(to_pallas_point(&header.point()), header.block_height()) + } + } + } else { + self.client_at.clone() + } + } + + pub fn add_op(&mut self, op: ClientOp) { + match op { + ClientOp::Backward(point) => { + let needle = ClientOp::Backward(point.clone()); + if let Some(index) = self.ops.iter().rposition(|op| op == &needle) { + self.ops.truncate(index + 1); + } else { + self.ops.clear(); + self.ops.push_back(ClientOp::Backward(point)); + } + } + op @ ClientOp::Forward(_) => self.ops.push_back(op), + } + } +} + +/// Find headers between points in the chain store. +/// Returns None if none of the points in `points` lies in the past of `start_point`. +/// Otherwise returns Some(headers) where headers is a list of headers leading from +/// the first found point in the past of `start_point` matching a point from `points` +/// up to `start_point`. +pub(super) fn find_headers_between( + store: &dyn ChainStore

    , + start_point: &Point, + points: &[Point], +) -> Option<(Vec, Tip)> { + let start_header = store.load_header(&hash_point(start_point))?; + + if points.contains(start_point) { + return Some(( + vec![], + Tip(start_point.clone(), start_header.block_height()), + )); + } + + // Find the first point that is in the past of start_point + let mut current_header = start_header; + let mut headers = vec![ClientOp::Forward(current_header.clone())]; + + while let Some(parent_hash) = current_header.parent() { + match store.load_header(&parent_hash) { + Some(header) => { + if points.iter().any(|p| hash_point(p) == parent_hash) { + // Found a matching point, return the collected headers + return Some(( + headers, + Tip(to_pallas_point(&header.point()), header.block_height()), + )); + } + headers.push(ClientOp::Forward(header.clone())); + current_header = header; + } + None => return None, // Broken chain + } + } + + // Reached genesis without finding any matching point + Some((headers, Tip(Point::Origin, 0))) +} + +pub(super) fn hash_point(point: &Point) -> Hash<32> { + match point { + Point::Origin => Hash::from([0; 32]), + Point::Specific(_slot, hash) => Hash::from(hash.as_slice()), + } +} + +pub(super) fn to_pallas_point(point: &amaru_kernel::Point) -> Point { + match point { + amaru_kernel::Point::Origin => Point::Origin, + amaru_kernel::Point::Specific(slot, hash) => Point::Specific(*slot, hash.clone()), + } +} diff --git a/crates/amaru/src/stages/consensus/chain_forward/tests.rs b/crates/amaru/src/stages/consensus/chain_forward/tests.rs new file mode 100644 index 000000000..cd9a76c19 --- /dev/null +++ b/crates/amaru/src/stages/consensus/chain_forward/tests.rs @@ -0,0 +1,289 @@ +use super::{client_state::find_headers_between, ForwardEvent, ForwardStage}; +use acto::{AcTokio, AcTokioRuntime, ActoCell, ActoInput, ActoRuntime}; +use amaru_consensus::consensus::store::{ChainStore, Nonces, StoreError}; +use amaru_kernel::{Hash, Header}; +use amaru_ledger::BlockValidationResult; +use gasket::messaging::tokio::ChannelRecvAdapter; +use gasket::runtime::spawn_stage; +use pallas_network::facades::PeerClient; +use pallas_network::miniprotocols::chainsync::{NextResponse, Tip}; +use pallas_network::miniprotocols::Point; +use std::future::Future; +use std::sync::Arc; +use std::{collections::HashMap, fs::File, path::Path, str::FromStr}; +use tokio::sync::{mpsc, Mutex}; +use tracing_subscriber::EnvFilter; + +struct TestStore(HashMap, Header>); + +impl TestStore { + fn len(&self) -> usize { + self.0.len() + } + + fn get(&self, hash: &Hash<32>) -> Option<&Header> { + self.0.get(hash) + } +} + +impl ChainStore
    for TestStore { + fn load_header(&self, hash: &Hash<32>) -> Option
    { + self.0.get(hash).cloned() + } + + fn store_header(&mut self, hash: &Hash<32>, header: &Header) -> Result<(), StoreError> { + self.0.insert(*hash, header.clone()); + Ok(()) + } + + fn get_nonces(&self, _header: &Hash<32>) -> Option { + todo!() + } + + fn put_nonces(&mut self, _header: &Hash<32>, _nonces: Nonces) -> Result<(), StoreError> { + todo!() + } + + fn era_history(&self) -> &slot_arithmetic::EraHistory { + todo!() + } +} + +fn mk_store(path: impl AsRef) -> TestStore { + let f = File::open(path).unwrap(); + let json: serde_json::Value = serde_json::from_reader(f).unwrap(); + let headers = json + .pointer("/stakePools/chains") + .unwrap() + .as_array() + .unwrap(); + + let mut store = HashMap::new(); + + for header in headers { + let hash = header.pointer("/hash").unwrap().as_str().unwrap(); + let header = header.pointer("/header").unwrap().as_str().unwrap(); + let header = hex::decode(header).unwrap(); + store.insert(hash.parse().unwrap(), minicbor::decode(&header).unwrap()); + } + + TestStore(store) +} + +fn hash(s: &str) -> Hash<32> { + Hash::<32>::from_str(s).unwrap() +} + +fn hex(s: &str) -> Vec { + hex::decode(s).unwrap() +} + +const CHAIN_41: &str = "tests/data/chain41.json"; + +const TIP_41: &str = "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6"; +const TIP_41_SLOT: u64 = 990; +const TIP_41_HEIGHT: u64 = 47; + +const LOST_41: &str = "bd41b102018a21e068d504e64b282512a3b7d5c3883b743aa070ad9244691125"; +const LOST_41_SLOT: u64 = 188; + +const WINNER_41: &str = "66c90f54f9073cfc03a334f5b15b1617f6bf6fe6c892fad8368e16abe20b0f4f"; +const WINNER_41_SLOT: u64 = 187; +const WINNER_41_HEIGHT: u64 = 8; + +const BRANCH_41: &str = "64565f22fb23476baaa6f82e0e2d68636ceadabded697099fb376c23226bdf03"; +const BRANCH_41_SLOT: u64 = 142; +const BRANCH_41_HEIGHT: u64 = 7; + +const ROOT_41_SLOT: u64 = 31; + +fn point(slot: u64, hash: &str) -> Point { + Point::Specific(slot, hex(hash)) +} + +fn amaru_point(slot: u64, hash: &str) -> amaru_kernel::Point { + amaru_kernel::Point::Specific(slot, hex(hash)) +} + +#[test] +fn test_mk_store() { + let store = mk_store(CHAIN_41); + assert_eq!(store.len(), 48); + + let mut current = hash(TIP_41); + let mut chain = store.get(¤t).unwrap().clone(); + + assert_eq!(chain.header_body.slot, TIP_41_SLOT); + + while chain.header_body.prev_hash.is_some() { + current = chain.header_body.prev_hash.unwrap(); + chain = store.get(¤t).unwrap().clone(); + } + + assert_eq!(chain.header_body.slot, ROOT_41_SLOT); +} + +#[test] +fn find_headers_between_tip_and_tip() { + let store = mk_store(CHAIN_41); + + let tip = point(TIP_41_SLOT, TIP_41); + let points = [point(TIP_41_SLOT, TIP_41)]; + + let (ops, Tip(p, h)) = find_headers_between(&store, &tip, &points).unwrap(); + assert_eq!((ops, p, h), (vec![], tip, 47)); +} + +#[test] +fn find_headers_between_tip_and_branch() { + let store = mk_store(CHAIN_41); + + let tip = point(TIP_41_SLOT, TIP_41); + let points = [point(BRANCH_41_SLOT, BRANCH_41)]; + let peer = point(BRANCH_41_SLOT, BRANCH_41); + + let (ops, Tip(p, h)) = find_headers_between(&store, &tip, &points).unwrap(); + assert_eq!( + (ops.len() as u64, p, h), + (TIP_41_HEIGHT - BRANCH_41_HEIGHT, peer, BRANCH_41_HEIGHT) + ); +} + +#[test] +fn find_headers_between_tip_and_branches() { + let store = mk_store(CHAIN_41); + + let tip = point(TIP_41_SLOT, TIP_41); + // Note that the below scheme does not match the documented behaviour, which shall pick the first from + // the list that is on the same chain. But that doesn't make sense to me at all. + let points = [ + point(BRANCH_41_SLOT, BRANCH_41), // this will lose to the (taller) winner + point(LOST_41_SLOT, LOST_41), // this is not on the same chain + point(WINNER_41_SLOT, WINNER_41), // this is the winner after the branch + ]; + let peer = point(WINNER_41_SLOT, WINNER_41); + + let (ops, Tip(p, h)) = find_headers_between(&store, &tip, &points).unwrap(); + assert_eq!( + (ops.len() as u64, p, h), + (TIP_41_HEIGHT - WINNER_41_HEIGHT, peer, WINNER_41_HEIGHT) + ); +} + +#[test] +fn find_headers_between_tip_and_lost() { + let store = mk_store(CHAIN_41); + + let tip = point(TIP_41_SLOT, TIP_41); + let points = [point(LOST_41_SLOT, LOST_41)]; + + let result = find_headers_between(&store, &tip, &points); + assert!(result.is_none(), "{result:?}"); +} + +#[test] +fn test_chain_sync() { + let _ = tracing_subscriber::fmt() + .with_env_filter(EnvFilter::from_default_env()) + .with_test_writer() + .try_init(); + + // step 0a: prepare the store + let store = Arc::new(Mutex::new(mk_store(CHAIN_41))); + + // step 0b: prepare actor to forward downstream traffic + let runtime = AcTokio::new("test", 1).unwrap(); + let (port_tx, mut port_rx) = mpsc::channel(1); + let downstream = runtime + .spawn_actor( + "test", + |mut cell: ActoCell| async move { + while let ActoInput::Message(msg) = cell.recv().await { + port_tx.send(msg).await.unwrap(); + } + }, + ) + .me; + + // step 0c: prepare a little utility + fn block_on(runtime: &AcTokio, f: F) -> F::Output { + runtime.with_rt(|rt| rt.block_on(f)).unwrap() + } + + // step 1: prepare the stage + let (block_tx, block_rx) = mpsc::channel(1); + let mut stage = ForwardStage::new(Some(downstream), store, 42, "127.0.0.1:0"); + stage.upstream.connect(ChannelRecvAdapter::Mpsc(block_rx)); + let tether = spawn_stage(stage, Default::default()); + + // step 2: wait for the listening event + println!("stage state 1: {:?}", tether.check_state()); + let port = block_on(&runtime, port_rx.recv()).unwrap(); + let ForwardEvent::Listening(port) = port else { + panic!("expected listening event, got {:?}", port); + }; + assert_ne!(port, 0); + println!("stage state 2: {:?}", tether.check_state()); + + // step 3: send the block validated event to inform the stage of the current tip + let span = tracing::debug_span!("whatever"); + + let validated = block_on(&runtime, { + let block_tx = &block_tx; + async move { + println!("sending block validated"); + block_tx + .send( + BlockValidationResult::BlockValidated(amaru_point(TIP_41_SLOT, TIP_41), span) + .into(), + ) + .await + .unwrap(); + println!("waiting for forward event"); + port_rx.recv().await.unwrap() + } + }); + let ForwardEvent::Forward(p) = validated else { + panic!("expected forward event, got {:?}", validated); + }; + assert_eq!(p, point(TIP_41_SLOT, TIP_41)); + + // step 4a: connect to the stage and prove that it is still alive + println!("stage state 3: {:?}", tether.check_state()); + let mut client = block_on( + &runtime, + PeerClient::connect(&format!("127.0.0.1:{port}"), 42), + ) + .unwrap(); + + // step 4b: find the intersection point + let (p, t) = block_on(&runtime, { + client + .chainsync() + .find_intersect(vec![point(BRANCH_41_SLOT, BRANCH_41)]) + }) + .unwrap(); + + assert_eq!(p, Some(point(BRANCH_41_SLOT, BRANCH_41))); + assert_eq!(t.0, point(TIP_41_SLOT, TIP_41)); + assert_eq!(t.1, TIP_41_HEIGHT); + + // step 5: pull headers from the stage + let headers = block_on(&runtime, async move { + let mut headers = Vec::new(); + while let Ok(response) = client.chainsync().request_next().await { + match response { + NextResponse::RollForward(header, _) => headers.push(header), + NextResponse::RollBackward(_, _) => panic!("unexpected roll backward"), + NextResponse::Await => break, + } + } + headers + }); + assert_eq!(headers.len() as u64, TIP_41_HEIGHT - BRANCH_41_HEIGHT); + + // prove that this is still alive - otherwise gasket will kill the stage + drop(block_tx); + + // Note: there’s no way to shut down the gasket stage without logging to ERRORs, sorry +} diff --git a/crates/amaru/src/stages/mod.rs b/crates/amaru/src/stages/mod.rs index e86e99c22..4753d6f97 100644 --- a/crates/amaru/src/stages/mod.rs +++ b/crates/amaru/src/stages/mod.rs @@ -47,6 +47,8 @@ pub struct Config { pub chain_dir: PathBuf, pub upstream_peers: Vec, pub network: NetworkName, + pub network_magic: u32, + pub listen_address: String, } /// A session with a peer, including the peer itself and a client to communicate with it. @@ -95,7 +97,12 @@ pub fn bootstrap( ); let mut consensus_stage = HeaderStage::new(consensus); - let mut block_forward = ForwardStage::new(chain_ref.clone()); + let mut block_forward = ForwardStage::new( + None, + chain_ref.clone(), + config.network_magic as u64, + &config.listen_address, + ); let (to_block_fetch, from_consensus_stage) = gasket::messaging::tokio::mpsc_channel(50); let (to_ledger, from_block_fetch) = gasket::messaging::tokio::mpsc_channel(50); From 9b14f77a50ade35f93cf0cdc02deea07d18b8d46 Mon Sep 17 00:00:00 2001 From: Roland Kuhn Date: Thu, 17 Apr 2025 11:47:41 +0200 Subject: [PATCH 02/10] feat: add downstream peer limiting For now this is a simple cmdline argument that just ignores peers beyond a certain count. Proper handling will need to include idle timers etc. to kick out downstream peers that are just squatting. Signed-Off-By: Roland Kuhn --- crates/amaru/src/bin/amaru/cmd/daemon.rs | 5 +++++ crates/amaru/src/stages/consensus/chain_forward.rs | 11 ++++++++++- .../src/stages/consensus/chain_forward/tests.rs | 14 ++++++++------ crates/amaru/src/stages/mod.rs | 2 ++ .../tests/data/chain41.json | 0 5 files changed, 25 insertions(+), 7 deletions(-) rename crates/{amaru-consensus => amaru}/tests/data/chain41.json (100%) diff --git a/crates/amaru/src/bin/amaru/cmd/daemon.rs b/crates/amaru/src/bin/amaru/cmd/daemon.rs index 2e2cd776e..944a414bd 100644 --- a/crates/amaru/src/bin/amaru/cmd/daemon.rs +++ b/crates/amaru/src/bin/amaru/cmd/daemon.rs @@ -54,6 +54,10 @@ pub struct Args { /// The address to listen on for incoming connections. #[arg(long, value_name = "LISTEN_ADDRESS", default_value = super::DEFAULT_LISTEN_ADDRESS)] listen_address: String, + + /// The maximum number of downstream peers to connect to. + #[arg(long, value_name = "MAX_DOWNSTREAM_PEERS", default_value_t = 10)] + max_downstream_peers: usize, } pub async fn run( @@ -112,5 +116,6 @@ fn parse_args(args: Args) -> Result> { network: args.network, network_magic: args.network.to_network_magic(), listen_address: args.listen_address, + max_downstream_peers: args.max_downstream_peers, }) } diff --git a/crates/amaru/src/stages/consensus/chain_forward.rs b/crates/amaru/src/stages/consensus/chain_forward.rs index 03bbcf5bf..1d08ee2ff 100644 --- a/crates/amaru/src/stages/consensus/chain_forward.rs +++ b/crates/amaru/src/stages/consensus/chain_forward.rs @@ -53,6 +53,7 @@ pub struct ForwardStage { pub runtime: AcTokio, pub listen_address: String, pub downstream: Option>, + pub max_peers: usize, } #[derive(Debug, Clone)] @@ -67,6 +68,7 @@ impl ForwardStage { store: Arc>>, network_magic: u64, listen_address: &str, + max_peers: usize, ) -> Self { #[allow(clippy::expect_used)] let runtime = @@ -78,6 +80,7 @@ impl ForwardStage { runtime, listen_address: listen_address.to_string(), downstream, + max_peers, } } } @@ -116,7 +119,7 @@ impl gasket::framework::Worker for Worker { let clients = stage .runtime .spawn_actor("chain_forward", |cell| { - client_supervisor(cell, stage.store.clone()) + client_supervisor(cell, stage.store.clone(), stage.max_peers) }) .me; @@ -251,11 +254,17 @@ enum ClientMsg { async fn client_supervisor( mut cell: ActoCell>, store: Arc>>, + max_peers: usize, ) { let mut clients = HashMap::new(); while let Some(msg) = cell.recv().await.has_senders() { match msg { ActoMsgSuper::Message(ClientMsg::Peer(peer, tip)) => { + if clients.len() >= max_peers { + tracing::warn!(target: EVENT_TARGET, "max peers reached, dropping peer"); + continue; + } + let addr = peer .accepted_address() .map(|a| a.to_string()) diff --git a/crates/amaru/src/stages/consensus/chain_forward/tests.rs b/crates/amaru/src/stages/consensus/chain_forward/tests.rs index cd9a76c19..36809f8f3 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/tests.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/tests.rs @@ -37,15 +37,15 @@ impl ChainStore
    for TestStore { } fn get_nonces(&self, _header: &Hash<32>) -> Option { - todo!() + unimplemented!() } fn put_nonces(&mut self, _header: &Hash<32>, _nonces: Nonces) -> Result<(), StoreError> { - todo!() + unimplemented!() } fn era_history(&self) -> &slot_arithmetic::EraHistory { - todo!() + unimplemented!() } } @@ -177,8 +177,10 @@ fn find_headers_between_tip_and_lost() { let tip = point(TIP_41_SLOT, TIP_41); let points = [point(LOST_41_SLOT, LOST_41)]; - let result = find_headers_between(&store, &tip, &points); - assert!(result.is_none(), "{result:?}"); + let result = find_headers_between(&store, &tip, &points).unwrap(); + assert_eq!(result.0.len() as u64, TIP_41_HEIGHT); + assert_eq!(result.1 .0, Point::Origin); + assert_eq!(result.1 .1, 0); } #[test] @@ -212,7 +214,7 @@ fn test_chain_sync() { // step 1: prepare the stage let (block_tx, block_rx) = mpsc::channel(1); - let mut stage = ForwardStage::new(Some(downstream), store, 42, "127.0.0.1:0"); + let mut stage = ForwardStage::new(Some(downstream), store, 42, "127.0.0.1:0", 1); stage.upstream.connect(ChannelRecvAdapter::Mpsc(block_rx)); let tether = spawn_stage(stage, Default::default()); diff --git a/crates/amaru/src/stages/mod.rs b/crates/amaru/src/stages/mod.rs index 4753d6f97..fa76f15e7 100644 --- a/crates/amaru/src/stages/mod.rs +++ b/crates/amaru/src/stages/mod.rs @@ -49,6 +49,7 @@ pub struct Config { pub network: NetworkName, pub network_magic: u32, pub listen_address: String, + pub max_downstream_peers: usize, } /// A session with a peer, including the peer itself and a client to communicate with it. @@ -102,6 +103,7 @@ pub fn bootstrap( chain_ref.clone(), config.network_magic as u64, &config.listen_address, + config.max_downstream_peers, ); let (to_block_fetch, from_consensus_stage) = gasket::messaging::tokio::mpsc_channel(50); diff --git a/crates/amaru-consensus/tests/data/chain41.json b/crates/amaru/tests/data/chain41.json similarity index 100% rename from crates/amaru-consensus/tests/data/chain41.json rename to crates/amaru/tests/data/chain41.json From e62e425cb452226ff1cc313bad074631756148ec Mon Sep 17 00:00:00 2001 From: Roland Kuhn Date: Sat, 19 Apr 2025 10:46:54 +0200 Subject: [PATCH 03/10] chore: reorganise and add test infrastructure to make test readable also fix some bugs along the way, of course Signed-off-by: Roland Kuhn --- .../src/stages/consensus/chain_forward.rs | 112 +++++-- .../chain_forward/client_protocol.rs | 84 +++-- .../consensus/chain_forward/client_state.rs | 95 ++---- .../consensus/chain_forward/test_infra.rs | 315 ++++++++++++++++++ .../stages/consensus/chain_forward/tests.rs | 306 ++++------------- crates/amaru/src/stages/mod.rs | 50 ++- 6 files changed, 585 insertions(+), 377 deletions(-) create mode 100644 crates/amaru/src/stages/consensus/chain_forward/test_infra.rs diff --git a/crates/amaru/src/stages/consensus/chain_forward.rs b/crates/amaru/src/stages/consensus/chain_forward.rs index 1d08ee2ff..c9bb7afe0 100644 --- a/crates/amaru/src/stages/consensus/chain_forward.rs +++ b/crates/amaru/src/stages/consensus/chain_forward.rs @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::stages::PallasPoint; use acto::{AcTokio, ActoCell, ActoMsgSuper, ActoRef, ActoRuntime}; use amaru_consensus::{consensus::store::ChainStore, IsHeader}; use amaru_kernel::{Hash, Header}; use amaru_ledger::BlockValidationResult; use client_protocol::{client_protocols, ClientProtocolMsg}; -use client_state::{to_pallas_point, ClientOp}; use gasket::framework::*; use pallas_network::{ facades::PeerServer, @@ -40,9 +40,6 @@ pub const EVENT_TARGET: &str = "amaru::consensus::chain_forward"; /// Forwarding stage of the consensus where blocks are stored and made /// available to downstream peers. -/// -/// TODO: currently does nothing, should store block, update chain state, and -/// forward new chain downstream #[derive(Stage)] #[stage(name = "consensus.forward", unit = "Unit", worker = "Worker")] @@ -52,14 +49,16 @@ pub struct ForwardStage { pub network_magic: u64, pub runtime: AcTokio, pub listen_address: String, - pub downstream: Option>, + pub downstream: ActoRef, pub max_peers: usize, + pub our_tip: Tip, } #[derive(Debug, Clone)] pub enum ForwardEvent { Listening(u16), Forward(Point), + Backward(Point), } impl ForwardStage { @@ -69,6 +68,7 @@ impl ForwardStage { network_magic: u64, listen_address: &str, max_peers: usize, + our_tip: Tip, ) -> Self { #[allow(clippy::expect_used)] let runtime = @@ -79,8 +79,9 @@ impl ForwardStage { network_magic, runtime, listen_address: listen_address.to_string(), - downstream, + downstream: downstream.unwrap_or_else(ActoRef::blackhole), max_peers, + our_tip, } } } @@ -93,7 +94,7 @@ pub enum Unit { pub struct Worker { server: JoinHandle<()>, incoming_peers: Receiver, - tip: Tip, + our_tip: Tip, clients: ActoRef, } @@ -103,16 +104,46 @@ impl Drop for Worker { } } +#[allow(clippy::large_enum_variant)] +#[derive(Debug, Clone)] +enum ClientOp { + /// the tip to go back to + Backward(Tip), + /// the header to go forward to and the tip we will be at after sending this header + Forward(Header, Tip), +} + +impl PartialEq for ClientOp { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (Self::Backward(l0), Self::Backward(r0)) => (&l0.0, l0.1) == (&r0.0, r0.1), + (Self::Forward(l0, l1), Self::Forward(r0, r1)) => { + l0 == r0 && (&l1.0, l1.1) == (&r1.0, r1.1) + } + _ => false, + } + } +} + +impl Eq for ClientOp {} + +impl ClientOp { + pub fn tip(&self) -> Tip { + match self { + ClientOp::Backward(tip) => tip.clone(), + ClientOp::Forward(_, tip) => tip.clone(), + } + } +} + #[async_trait::async_trait(?Send)] impl gasket::framework::Worker for Worker { async fn bootstrap(stage: &ForwardStage) -> Result { let server = TcpListener::bind(&stage.listen_address).await.or_panic()?; - if let Some(downstream) = &stage.downstream { - tracing::debug!("sending listening event"); - downstream.send(ForwardEvent::Listening( - server.local_addr().or_panic()?.port(), - )); - } + tracing::debug!("sending listening event"); + stage.downstream.send(ForwardEvent::Listening( + server.local_addr().or_panic()?.port(), + )); let (tx, incoming_peers) = mpsc::channel(10); @@ -154,7 +185,7 @@ impl gasket::framework::Worker for Worker { Ok(Self { server, incoming_peers, - tip: Tip(Point::Origin, 0), + our_tip: stage.our_tip.clone(), clients, }) } @@ -191,12 +222,25 @@ impl gasket::framework::Worker for Worker { // FIXME: block height should be part of BlockValidated message let store = stage.store.lock().await; if let Some(header) = store.load_header(&Hash::from(point)) { - self.tip = Tip(to_pallas_point(point), header.block_height()); - self.clients.send(ClientMsg::Op(ClientOp::Forward(header))); - } + // assert that the new tip is a direct successor of the old tip + assert_eq!(header.block_height(), self.our_tip.1 + 1); + match header.parent() { + Some(parent) => assert_eq!( + Point::new(self.our_tip.0.slot_or_default(), parent.as_ref().to_vec()), + self.our_tip.0 + ), + None => assert_eq!(self.our_tip.0, Point::Origin), + } - if let Some(downstream) = &stage.downstream { - downstream.send(ForwardEvent::Forward(to_pallas_point(point))); + self.our_tip = Tip(point.pallas_point(), header.block_height()); + self.clients.send(ClientMsg::Op(ClientOp::Forward( + header, + self.our_tip.clone(), + ))); + + stage + .downstream + .send(ForwardEvent::Forward(point.pallas_point())); } Ok(()) @@ -213,9 +257,13 @@ impl gasket::framework::Worker for Worker { // FIXME: block height should be part of BlockValidated message let store = stage.store.lock().await; if let Some(header) = store.load_header(&Hash::from(point)) { - self.tip = Tip(to_pallas_point(point), header.block_height()); + self.our_tip = Tip(point.pallas_point(), header.block_height()); self.clients - .send(ClientMsg::Op(ClientOp::Backward(to_pallas_point(point)))); + .send(ClientMsg::Op(ClientOp::Backward(self.our_tip.clone()))); + + stage + .downstream + .send(ForwardEvent::Backward(point.pallas_point())); } Ok(()) @@ -235,7 +283,8 @@ impl gasket::framework::Worker for Worker { // FIXME: gasket design bug that we only get &Unit and thus cannot take values from it without internal mutability let peer = peer.borrow_mut().take(); if let Some(peer) = peer { - self.clients.send(ClientMsg::Peer(peer, self.tip.clone())); + self.clients + .send(ClientMsg::Peer(peer, self.our_tip.clone())); } else { tracing::error!(target: EVENT_TARGET, "Unit::Peer was empty in execute"); } @@ -247,12 +296,16 @@ impl gasket::framework::Worker for Worker { #[allow(clippy::large_enum_variant)] enum ClientMsg { + /// A new peer has connected to us. + /// + /// Our tip is included to get the connection handlers started correctly. Peer(PeerServer, Tip), + /// An operation to be executed on all clients. Op(ClientOp), } async fn client_supervisor( - mut cell: ActoCell>, + mut cell: ActoCell>, store: Arc>>, max_peers: usize, ) { @@ -260,16 +313,16 @@ async fn client_supervisor( while let Some(msg) = cell.recv().await.has_senders() { match msg { ActoMsgSuper::Message(ClientMsg::Peer(peer, tip)) => { - if clients.len() >= max_peers { - tracing::warn!(target: EVENT_TARGET, "max peers reached, dropping peer"); - continue; - } - let addr = peer .accepted_address() .map(|a| a.to_string()) .unwrap_or_default(); + if clients.len() >= max_peers { + tracing::warn!(target: EVENT_TARGET, "max peers reached, dropping peer from {addr}"); + continue; + } + let client = cell.spawn_supervised(&addr, { let store = store.clone(); move |cell| client_protocols(cell, peer, store, tip) @@ -294,3 +347,6 @@ mod client_state; #[cfg(test)] mod tests; + +#[cfg(test)] +mod test_infra; diff --git a/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs b/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs index df2768113..0182fe37b 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs @@ -1,5 +1,8 @@ -use super::client_state::{find_headers_between, ClientOp, ClientState}; -use acto::{ActoCell, ActoInput, ActoRef, ActoRuntime, PanicOrAbort}; +use super::{ + client_state::{find_headers_between, ClientState}, + ClientOp, +}; +use acto::{ActoCell, ActoInput, ActoRef, ActoRuntime}; use amaru_consensus::consensus::store::ChainStore; use amaru_kernel::{to_cbor, Header}; use pallas_network::{ @@ -24,15 +27,7 @@ pub enum ClientError { #[error("client terminated")] ClientTerminated, #[error("handler failure: {0}")] - HandlerFailure(PanicOrAbort), - #[error("chainsync error: {0}")] - ChainSync(#[from] chainsync::ServerError), - #[error("block fetch error: {0}")] - BlockFetch(#[from] blockfetch::ServerError), - #[error("tx submission error: {0}")] - TxSubmission(#[from] txsubmission::Error), - #[error("keep alive error: {0}")] - KeepAlive(#[from] keepalive::ServerError), + HandlerFailure(String), } pub enum ClientProtocolMsg { @@ -40,11 +35,11 @@ pub enum ClientProtocolMsg { } pub async fn client_protocols( - mut cell: ActoCell>, + mut cell: ActoCell>, server: PeerServer, store: Arc>>, - tip: Tip, -) -> Result<(), ClientError> { + our_tip: Tip, +) -> anyhow::Result<()> { let _block_fetch = cell.spawn_supervised("block_fetch", { let store = store.clone(); move |cell| block_fetch(cell, server.blockfetch, store) @@ -55,8 +50,8 @@ pub async fn client_protocols( let _keep_alive = cell.spawn_supervised("keep_alive", move |cell| keep_alive(cell, server.keepalive)); - let chain_sync = cell.spawn_supervised("chainsync", move |cell| { - chain_sync(cell, server.chainsync, tip, store) + let chain_sync = cell.spawn_supervised("chain_sync", move |cell| { + chain_sync(cell, server.chainsync, our_tip, store) }); while let ActoInput::Message(msg) = cell.recv().await { @@ -77,52 +72,53 @@ pub enum ChainSyncMsg { } async fn chain_sync( - mut cell: ActoCell>, + mut cell: ActoCell>, mut server: chainsync::Server, - tip: Tip, + our_tip: Tip, store: Arc>>, -) -> Result<(), ClientError> { +) -> anyhow::Result<()> { // TODO: do we need to handle validation updates already here in case the client is really slow to ask for intersection? let Some(ClientRequest::Intersect(req)) = server.recv_while_idle().await? else { // need an intersection point to start - return Err(ClientError::EarlyRequestNext); + return Err(ClientError::EarlyRequestNext.into()); }; - tracing::debug!("finding headers between {:?} and {:?}", tip.0, req); - let Some((intersection, client_at)) = find_headers_between(&*store.lock().await, &tip.0, &req) + tracing::debug!("finding headers between {:?} and {:?}", our_tip.0, req); + let Some((catch_up, client_at)) = find_headers_between(&*store.lock().await, &our_tip.0, &req) else { tracing::debug!("no intersection found"); - server.send_intersect_not_found(tip).await?; - return Err(ClientError::NoIntersection); + server.send_intersect_not_found(our_tip).await?; + return Err(ClientError::NoIntersection.into()); }; tracing::debug!("intersection found: {client_at:?}"); server - .send_intersect_found(client_at.0.clone(), tip) + .send_intersect_found(client_at.0.clone(), our_tip.clone()) .await?; - let mut state = ClientState::new(store, intersection.into(), client_at); - let parent = cell.me(); let handler = cell.spawn_supervised("chainsync_handler", move |cell| { chain_sync_handler(cell, server, parent) }); + let mut state = ClientState::new(catch_up.into()); + let mut our_tip = our_tip; let mut waiting = false; loop { let input = cell.recv().await; match input { ActoInput::Message(ChainSyncMsg::Op(op)) => { + our_tip = op.tip(); state.add_op(op); if waiting { - if let Some((op, tip)) = state.next_op().await { + if let Some(op) = state.next_op() { waiting = false; - handler.send(Some((op, tip))); + handler.send(Some((op, our_tip.clone()))); } } } ActoInput::Message(ChainSyncMsg::ReqNext) => { - if let Some((op, tip)) = state.next_op().await { - handler.send(Some((op, tip))); + if let Some(op) = state.next_op() { + handler.send(Some((op, our_tip.clone()))); } else { handler.send(None); waiting = true; @@ -130,7 +126,9 @@ async fn chain_sync( } ActoInput::NoMoreSenders => return Ok(()), ActoInput::Supervision { result, .. } => { - return result.map_err(ClientError::HandlerFailure).and_then(|x| x); + return result + .map_err(|e| anyhow::Error::from(ClientError::HandlerFailure(e.to_string()))) + .and_then(|x| x); } } } @@ -143,25 +141,25 @@ async fn chain_sync_handler( mut cell: ActoCell, impl ActoRuntime>, mut server: chainsync::Server, parent: ActoRef, -) -> Result<(), ClientError> { +) -> anyhow::Result<()> { loop { let Some(req) = server.recv_while_idle().await? else { - return Err(ClientError::ClientTerminated); + return Err(ClientError::ClientTerminated.into()); }; if !matches!(req, ClientRequest::RequestNext) { - return Err(ClientError::LateIntersection); + return Err(ClientError::LateIntersection.into()); }; parent.send(ChainSyncMsg::ReqNext); if let ActoInput::Message(op) = cell.recv().await { match op { - Some((ClientOp::Forward(header), tip)) => { + Some((ClientOp::Forward(header, _), tip)) => { server .send_roll_forward(to_header_content(header), tip) .await?; } Some((ClientOp::Backward(point), tip)) => { - server.send_roll_backward(point, tip).await?; + server.send_roll_backward(point.0, tip).await?; } None => { server.send_await_reply().await?; @@ -169,13 +167,13 @@ async fn chain_sync_handler( return Ok(()); }; match op { - ClientOp::Forward(header) => { + ClientOp::Forward(header, _) => { server .send_roll_forward(to_header_content(header), tip) .await?; } ClientOp::Backward(point) => { - server.send_roll_backward(point, tip).await?; + server.send_roll_backward(point.0, tip).await?; } } } @@ -187,7 +185,7 @@ async fn chain_sync_handler( } } -fn to_header_content(header: Header) -> HeaderContent { +pub(super) fn to_header_content(header: Header) -> HeaderContent { HeaderContent { variant: 1, byron_prefix: None, @@ -201,7 +199,7 @@ async fn block_fetch( _cell: ActoCell, mut server: blockfetch::Server, _store: Arc>>, // TODO: need a block store here -) -> Result<(), ClientError> { +) -> anyhow::Result<()> { while let Some(req) = server.recv_while_idle().await? { tracing::info!("block fetch request: {:?}", req); // TODO: Implement block fetch @@ -216,7 +214,7 @@ enum TxSubmissionMsg {} async fn tx_submission( _cell: ActoCell, mut server: txsubmission::Server, -) -> Result<(), ClientError> { +) -> anyhow::Result<()> { server.wait_for_init().await?; // TODO: Implement tx submission @@ -229,7 +227,7 @@ enum KeepAliveMsg {} async fn keep_alive( _cell: ActoCell, mut server: keepalive::Server, -) -> Result<(), ClientError> { +) -> anyhow::Result<()> { loop { server.keepalive_roundtrip().await?; } diff --git a/crates/amaru/src/stages/consensus/chain_forward/client_state.rs b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs index d47d88358..529529831 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/client_state.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs @@ -1,79 +1,44 @@ +use super::ClientOp; +use crate::stages::AsTip; use amaru_consensus::{consensus::store::ChainStore, IsHeader}; use amaru_kernel::{Hash, Header}; use pallas_network::miniprotocols::{chainsync::Tip, Point}; -use std::{collections::VecDeque, sync::Arc}; -use tokio::sync::Mutex; - -#[allow(clippy::large_enum_variant)] -#[derive(Debug, Clone, PartialEq, Eq)] -pub(super) enum ClientOp { - Backward(Point), - Forward(Header), -} +use std::collections::VecDeque; /// The state we track for one client. /// /// The `ops` list may contain up to one rollback at the front only. pub(super) struct ClientState { - store: Arc>>, /// The list of operations to send to the client. ops: VecDeque, - /// The point we presume the client is at. - /// This is updated as soon as we send an operation to the client. - client_at: Tip, } impl ClientState { - pub fn new( - store: Arc>>, - ops: VecDeque, - client_at: Tip, - ) -> Self { - Self { - store, - ops, - client_at, - } + pub fn new(ops: VecDeque) -> Self { + Self { ops } } - pub async fn next_op(&mut self) -> Option<(ClientOp, Tip)> { - let op = self.ops.pop_front()?; - let tip = self.tip().await; - Some((op, tip)) - } - - pub async fn tip(&self) -> Tip { - if let Some(op) = self.ops.back() { - match op { - ClientOp::Backward(point) => { - let store = self.store.lock().await; - #[allow(clippy::expect_used)] - let header = store - .load_header(&hash_point(point)) - .expect("rollback point was not in store"); - Tip(point.clone(), header.block_height()) - } - ClientOp::Forward(header) => { - Tip(to_pallas_point(&header.point()), header.block_height()) - } - } - } else { - self.client_at.clone() - } + pub fn next_op(&mut self) -> Option { + self.ops.pop_front() } pub fn add_op(&mut self, op: ClientOp) { match op { - ClientOp::Backward(point) => { - let needle = ClientOp::Backward(point.clone()); - if let Some(index) = self.ops.iter().rposition(|op| op == &needle) { + ClientOp::Backward(tip) => { + if let Some(index) = self + .ops + .iter() + .rposition(|op| matches!(op, ClientOp::Forward(_, tip) if &tip.0 == &tip.0)) + { self.ops.truncate(index + 1); } else { self.ops.clear(); - self.ops.push_back(ClientOp::Backward(point)); + self.ops.push_back(ClientOp::Backward(tip)); } } - op @ ClientOp::Forward(_) => self.ops.push_back(op), + op @ ClientOp::Forward(..) => { + self.ops.push_back(op); + } } } } @@ -91,27 +56,25 @@ pub(super) fn find_headers_between( let start_header = store.load_header(&hash_point(start_point))?; if points.contains(start_point) { - return Some(( - vec![], - Tip(start_point.clone(), start_header.block_height()), - )); + return Some((vec![], start_header.as_tip())); } // Find the first point that is in the past of start_point let mut current_header = start_header; - let mut headers = vec![ClientOp::Forward(current_header.clone())]; + let mut headers = vec![ClientOp::Forward( + current_header.clone(), + current_header.as_tip(), + )]; while let Some(parent_hash) = current_header.parent() { match store.load_header(&parent_hash) { Some(header) => { if points.iter().any(|p| hash_point(p) == parent_hash) { // Found a matching point, return the collected headers - return Some(( - headers, - Tip(to_pallas_point(&header.point()), header.block_height()), - )); + headers.reverse(); + return Some((headers, header.as_tip())); } - headers.push(ClientOp::Forward(header.clone())); + headers.push(ClientOp::Forward(header.clone(), header.as_tip())); current_header = header; } None => return None, // Broken chain @@ -119,6 +82,7 @@ pub(super) fn find_headers_between( } // Reached genesis without finding any matching point + headers.reverse(); Some((headers, Tip(Point::Origin, 0))) } @@ -128,10 +92,3 @@ pub(super) fn hash_point(point: &Point) -> Hash<32> { Point::Specific(_slot, hash) => Hash::from(hash.as_slice()), } } - -pub(super) fn to_pallas_point(point: &amaru_kernel::Point) -> Point { - match point { - amaru_kernel::Point::Origin => Point::Origin, - amaru_kernel::Point::Specific(slot, hash) => Point::Specific(*slot, hash.clone()), - } -} diff --git a/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs b/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs new file mode 100644 index 000000000..5c57bf935 --- /dev/null +++ b/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs @@ -0,0 +1,315 @@ +#![allow(dead_code)] + +use super::{ForwardEvent, ForwardStage}; +use crate::stages::PallasPoint; +use acto::{AcTokio, AcTokioRuntime, ActoCell, ActoInput, ActoRuntime}; +use amaru_consensus::consensus::store::{ChainStore, Nonces, StoreError}; +use amaru_consensus::IsHeader; +use amaru_kernel::{from_cbor, Hash, Header}; +use amaru_ledger::BlockValidationResult; +use gasket::messaging::tokio::ChannelRecvAdapter; +use gasket::runtime::{spawn_stage, Tether}; +use pallas_network::facades::PeerClient; +use pallas_network::miniprotocols::chainsync::{NextResponse, Tip}; +use pallas_network::miniprotocols::Point; +use std::future::Future; +use std::sync::Arc; +use std::time::Duration; +use std::{collections::HashMap, fs::File, path::Path, str::FromStr}; +use tokio::sync::{mpsc, Mutex}; +use tokio::time::timeout; +use tracing_subscriber::EnvFilter; + +#[derive(Debug, Clone)] +pub struct TestStore(HashMap, Header>); + +impl TestStore { + pub fn len(&self) -> usize { + self.0.len() + } + + pub fn get(&self, hash: &Hash<32>) -> Option<&Header> { + self.0.get(hash) + } + + pub fn get_chain(&self, h: &str) -> Vec
    { + let mut chain = Vec::new(); + let mut current = hash(h); + while let Some(header) = self.get(¤t) { + chain.push(header.clone()); + let Some(parent) = header.parent() else { + break; + }; + current = parent; + } + chain.reverse(); + chain + } + + pub fn get_tip(&self, h: &str) -> Tip { + let header = self.get(&hash(h)).unwrap(); + Tip(header.pallas_point(), header.block_height()) + } + + pub fn get_point(&self, h: &str) -> Point { + let header = self.get(&hash(h)).unwrap(); + header.pallas_point() + } + + pub fn get_height(&self, h: &str) -> u64 { + let header = self.get(&hash(h)).unwrap(); + header.block_height() + } +} + +impl ChainStore
    for TestStore { + fn load_header(&self, hash: &Hash<32>) -> Option
    { + self.0.get(hash).cloned() + } + + fn store_header(&mut self, hash: &Hash<32>, header: &Header) -> Result<(), StoreError> { + self.0.insert(*hash, header.clone()); + Ok(()) + } + + fn get_nonces(&self, _header: &Hash<32>) -> Option { + unimplemented!() + } + + fn put_nonces(&mut self, _header: &Hash<32>, _nonces: Nonces) -> Result<(), StoreError> { + unimplemented!() + } + + fn era_history(&self) -> &slot_arithmetic::EraHistory { + unimplemented!() + } +} + +pub const CHAIN_47: &str = "tests/data/chain41.json"; +pub const TIP_47: &str = "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6"; +pub const LOST_47: &str = "bd41b102018a21e068d504e64b282512a3b7d5c3883b743aa070ad9244691125"; +pub const BRANCH_47: &str = "64565f22fb23476baaa6f82e0e2d68636ceadabded697099fb376c23226bdf03"; +pub const WINNER_47: &str = "66c90f54f9073cfc03a334f5b15b1617f6bf6fe6c892fad8368e16abe20b0f4f"; + +pub fn mk_store(path: impl AsRef) -> TestStore { + let f = File::open(path).unwrap(); + let json: serde_json::Value = serde_json::from_reader(f).unwrap(); + let headers = json + .pointer("/stakePools/chains") + .unwrap() + .as_array() + .unwrap(); + + let mut store = HashMap::new(); + + for header in headers { + let hash = header.pointer("/hash").unwrap().as_str().unwrap(); + let header = header.pointer("/header").unwrap().as_str().unwrap(); + let header = hex::decode(header).unwrap(); + store.insert(hash.parse().unwrap(), minicbor::decode(&header).unwrap()); + } + + TestStore(store) +} + +pub fn hash(s: &str) -> Hash<32> { + Hash::<32>::from_str(s).unwrap() +} + +pub fn hex(s: &str) -> Vec { + hex::decode(s).unwrap() +} + +pub fn point(slot: u64, hash: &str) -> Point { + Point::Specific(slot, hex(hash)) +} + +pub fn amaru_point(slot: u64, hash: &str) -> amaru_kernel::Point { + amaru_kernel::Point::Specific(slot, hex(hash)) +} + +pub struct Setup { + pub store: TestStore, + runtime: AcTokio, + event: mpsc::Receiver, + block: mpsc::Sender>, + _tether: Tether, + port: u16, +} + +impl Setup { + pub fn new(our_tip: &str) -> Setup { + let _ = tracing_subscriber::fmt() + .with_env_filter(EnvFilter::from_default_env()) + .with_test_writer() + .try_init(); + + let store = mk_store(CHAIN_47); + let runtime = AcTokio::new("test", 1).unwrap(); + let (port_tx, mut port_rx) = mpsc::channel(1); + let downstream = runtime + .spawn_actor( + "test", + |mut cell: ActoCell| async move { + while let ActoInput::Message(msg) = cell.recv().await { + port_tx.send(msg).await.unwrap(); + } + }, + ) + .me; + let (block_tx, block_rx) = mpsc::channel(1); + let mut stage = ForwardStage::new( + Some(downstream), + Arc::new(Mutex::new(store.clone())), + 42, + "127.0.0.1:0", + 1, + store.get_tip(our_tip), + ); + stage.upstream.connect(ChannelRecvAdapter::Mpsc(block_rx)); + let tether = spawn_stage(stage, Default::default()); + + tracing::info!("stage state: {:?}", tether.check_state()); + let port = block_on(&runtime, port_rx.recv()).unwrap(); + let ForwardEvent::Listening(port) = port else { + panic!("expected listening event, got {:?}", port); + }; + assert_ne!(port, 0); + tracing::info!( + "stage ({:?}) listening on port {}", + tether.check_state(), + port + ); + + Setup { + store, + runtime, + event: port_rx, + block: block_tx, + _tether: tether, + port, + } + } + + pub fn send_validated(&mut self, s: &str) { + let point = self.store.get(&hash(s)).unwrap().point(); + let span = tracing::debug_span!("whatever"); + let f = self + .block + .send(BlockValidationResult::BlockValidated(point.clone(), span).into()); + tracing::info!("sending block validated"); + block_on(&self.runtime, f).unwrap(); + tracing::info!("waiting for forward event"); + let p = block_on(&self.runtime, self.event.recv()).unwrap(); + let ForwardEvent::Forward(p) = p else { + panic!("expected forward event, got {:?}", p); + }; + assert_eq!(p, point.pallas_point()); + } + + pub fn send_backward(&mut self, s: &str) { + let point = self.store.get(&hash(s)).unwrap().point(); + let span = tracing::debug_span!("whatever"); + let f = self + .block + .send(BlockValidationResult::RolledBackTo(point.clone(), span).into()); + tracing::info!("sending block roll backward"); + block_on(&self.runtime, f).unwrap(); + tracing::info!("waiting for backward event"); + let p = block_on(&self.runtime, self.event.recv()).unwrap(); + let ForwardEvent::Backward(p) = p else { + panic!("expected backward event, got {:?}", p); + }; + assert_eq!(p, point.pallas_point()); + } + + pub fn connect(&self) -> Client { + let client = block_on( + &self.runtime, + PeerClient::connect(&format!("127.0.0.1:{}", self.port), 42), + ) + .unwrap(); + Client { + runtime: self.runtime.clone(), + client, + } + } + + pub fn check_header(&self, s: &str, h: &Header) { + let header = self.store.get(&hash(s)).unwrap(); + assert_eq!(header.header_body, h.header_body); + } +} + +pub struct Client { + runtime: AcTokioRuntime, + client: PeerClient, +} + +impl Client { + pub fn find_intersect(&mut self, points: Vec) -> (Option, Tip) { + block_on( + &self.runtime, + self.client.chainsync().find_intersect(points), + ) + .unwrap() + } + + pub fn recv_until_await(&mut self) -> Vec { + let mut ops = Vec::new(); + while let Ok(response) = block_on(&self.runtime, self.client.chainsync().request_next()) { + match response { + NextResponse::RollForward(header, tip) => { + ops.push(ClientMsg::Forward(from_cbor(&header.cbor).unwrap(), tip)) + } + NextResponse::RollBackward(point, tip) => ops.push(ClientMsg::Backward(point, tip)), + NextResponse::Await => break, + } + } + ops + } + + pub fn recv_after_await(&mut self) -> ClientMsg { + let msg = block_on( + &self.runtime, + self.client.chainsync().recv_while_can_await(), + ) + .unwrap(); + match msg { + NextResponse::RollForward(header, tip) => { + ClientMsg::Forward(from_cbor(&header.cbor).unwrap(), tip) + } + NextResponse::RollBackward(point, tip) => ClientMsg::Backward(point, tip), + NextResponse::Await => panic!("unexpected await"), + } + } +} + +#[derive(Debug, Clone)] +pub enum ClientMsg { + Forward(Header, Tip), + Backward(Point, Tip), +} + +impl PartialEq for ClientMsg { + fn eq(&self, other: &Self) -> bool { + match (self, other) { + (ClientMsg::Forward(lh, lt), ClientMsg::Forward(rh, rt)) => { + lh == rh && (<.0, lt.1) == (&rt.0, rt.1) + } + (ClientMsg::Backward(lp, lt), ClientMsg::Backward(rp, rt)) => { + lp == rp && (<.0, lt.1) == (&rt.0, rt.1) + } + _ => false, + } + } +} +fn block_on(runtime: &AcTokioRuntime, f: F) -> F::Output { + runtime + .with_rt(|rt| { + let _x = rt.enter(); + rt.block_on(timeout(Duration::from_secs(1), f)) + }) + .unwrap() + .unwrap() +} diff --git a/crates/amaru/src/stages/consensus/chain_forward/tests.rs b/crates/amaru/src/stages/consensus/chain_forward/tests.rs index 36809f8f3..72cf89808 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/tests.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/tests.rs @@ -1,134 +1,31 @@ -use super::{client_state::find_headers_between, ForwardEvent, ForwardStage}; -use acto::{AcTokio, AcTokioRuntime, ActoCell, ActoInput, ActoRuntime}; -use amaru_consensus::consensus::store::{ChainStore, Nonces, StoreError}; -use amaru_kernel::{Hash, Header}; -use amaru_ledger::BlockValidationResult; -use gasket::messaging::tokio::ChannelRecvAdapter; -use gasket::runtime::spawn_stage; -use pallas_network::facades::PeerClient; -use pallas_network::miniprotocols::chainsync::{NextResponse, Tip}; +use super::{ + client_state::find_headers_between, + test_infra::{ + hash, mk_store, ClientMsg, Setup, BRANCH_47, CHAIN_47, LOST_47, TIP_47, WINNER_47, + }, +}; +use crate::stages::{AsTip, PallasPoint}; +use amaru_consensus::IsHeader; +use pallas_network::miniprotocols::chainsync::Tip; use pallas_network::miniprotocols::Point; -use std::future::Future; -use std::sync::Arc; -use std::{collections::HashMap, fs::File, path::Path, str::FromStr}; -use tokio::sync::{mpsc, Mutex}; -use tracing_subscriber::EnvFilter; - -struct TestStore(HashMap, Header>); - -impl TestStore { - fn len(&self) -> usize { - self.0.len() - } - - fn get(&self, hash: &Hash<32>) -> Option<&Header> { - self.0.get(hash) - } -} - -impl ChainStore
    for TestStore { - fn load_header(&self, hash: &Hash<32>) -> Option
    { - self.0.get(hash).cloned() - } - - fn store_header(&mut self, hash: &Hash<32>, header: &Header) -> Result<(), StoreError> { - self.0.insert(*hash, header.clone()); - Ok(()) - } - - fn get_nonces(&self, _header: &Hash<32>) -> Option { - unimplemented!() - } - - fn put_nonces(&mut self, _header: &Hash<32>, _nonces: Nonces) -> Result<(), StoreError> { - unimplemented!() - } - - fn era_history(&self) -> &slot_arithmetic::EraHistory { - unimplemented!() - } -} - -fn mk_store(path: impl AsRef) -> TestStore { - let f = File::open(path).unwrap(); - let json: serde_json::Value = serde_json::from_reader(f).unwrap(); - let headers = json - .pointer("/stakePools/chains") - .unwrap() - .as_array() - .unwrap(); - - let mut store = HashMap::new(); - - for header in headers { - let hash = header.pointer("/hash").unwrap().as_str().unwrap(); - let header = header.pointer("/header").unwrap().as_str().unwrap(); - let header = hex::decode(header).unwrap(); - store.insert(hash.parse().unwrap(), minicbor::decode(&header).unwrap()); - } - - TestStore(store) -} - -fn hash(s: &str) -> Hash<32> { - Hash::<32>::from_str(s).unwrap() -} - -fn hex(s: &str) -> Vec { - hex::decode(s).unwrap() -} - -const CHAIN_41: &str = "tests/data/chain41.json"; - -const TIP_41: &str = "fcb4a51804f14f3f5b5ad841199b557aed0187280f7855736bdb153b0d202bb6"; -const TIP_41_SLOT: u64 = 990; -const TIP_41_HEIGHT: u64 = 47; - -const LOST_41: &str = "bd41b102018a21e068d504e64b282512a3b7d5c3883b743aa070ad9244691125"; -const LOST_41_SLOT: u64 = 188; - -const WINNER_41: &str = "66c90f54f9073cfc03a334f5b15b1617f6bf6fe6c892fad8368e16abe20b0f4f"; -const WINNER_41_SLOT: u64 = 187; -const WINNER_41_HEIGHT: u64 = 8; - -const BRANCH_41: &str = "64565f22fb23476baaa6f82e0e2d68636ceadabded697099fb376c23226bdf03"; -const BRANCH_41_SLOT: u64 = 142; -const BRANCH_41_HEIGHT: u64 = 7; - -const ROOT_41_SLOT: u64 = 31; - -fn point(slot: u64, hash: &str) -> Point { - Point::Specific(slot, hex(hash)) -} - -fn amaru_point(slot: u64, hash: &str) -> amaru_kernel::Point { - amaru_kernel::Point::Specific(slot, hex(hash)) -} #[test] fn test_mk_store() { - let store = mk_store(CHAIN_41); + let store = mk_store(CHAIN_47); assert_eq!(store.len(), 48); - - let mut current = hash(TIP_41); - let mut chain = store.get(¤t).unwrap().clone(); - - assert_eq!(chain.header_body.slot, TIP_41_SLOT); - - while chain.header_body.prev_hash.is_some() { - current = chain.header_body.prev_hash.unwrap(); - chain = store.get(¤t).unwrap().clone(); - } - - assert_eq!(chain.header_body.slot, ROOT_41_SLOT); + let chain = store.get_chain(TIP_47); + assert_eq!(chain.len(), 47); + assert_eq!(chain[0].header_body.slot, 31); + assert_eq!(chain[46].header_body.slot, 990); + assert_eq!(chain[6].block_height(), 7); } #[test] fn find_headers_between_tip_and_tip() { - let store = mk_store(CHAIN_41); + let store = mk_store(CHAIN_47); - let tip = point(TIP_41_SLOT, TIP_41); - let points = [point(TIP_41_SLOT, TIP_41)]; + let tip = store.get_point(TIP_47); + let points = [store.get_point(TIP_47)]; let (ops, Tip(p, h)) = find_headers_between(&store, &tip, &points).unwrap(); assert_eq!((ops, p, h), (vec![], tip, 47)); @@ -136,156 +33,101 @@ fn find_headers_between_tip_and_tip() { #[test] fn find_headers_between_tip_and_branch() { - let store = mk_store(CHAIN_41); + let store = mk_store(CHAIN_47); - let tip = point(TIP_41_SLOT, TIP_41); - let points = [point(BRANCH_41_SLOT, BRANCH_41)]; - let peer = point(BRANCH_41_SLOT, BRANCH_41); + let tip = store.get_point(TIP_47); + let points = [store.get_point(BRANCH_47)]; + let peer = store.get_point(BRANCH_47); let (ops, Tip(p, h)) = find_headers_between(&store, &tip, &points).unwrap(); assert_eq!( (ops.len() as u64, p, h), - (TIP_41_HEIGHT - BRANCH_41_HEIGHT, peer, BRANCH_41_HEIGHT) + ( + store.get_height(TIP_47) - store.get_height(BRANCH_47), + peer, + store.get_height(BRANCH_47) + ) ); } #[test] fn find_headers_between_tip_and_branches() { - let store = mk_store(CHAIN_41); + let store = mk_store(CHAIN_47); - let tip = point(TIP_41_SLOT, TIP_41); + let tip = store.get_point(TIP_47); // Note that the below scheme does not match the documented behaviour, which shall pick the first from // the list that is on the same chain. But that doesn't make sense to me at all. let points = [ - point(BRANCH_41_SLOT, BRANCH_41), // this will lose to the (taller) winner - point(LOST_41_SLOT, LOST_41), // this is not on the same chain - point(WINNER_41_SLOT, WINNER_41), // this is the winner after the branch + store.get_point(BRANCH_47), // this will lose to the (taller) winner + store.get_point(LOST_47), // this is not on the same chain + store.get_point(WINNER_47), // this is the winner after the branch ]; - let peer = point(WINNER_41_SLOT, WINNER_41); + let peer = store.get_point(WINNER_47); let (ops, Tip(p, h)) = find_headers_between(&store, &tip, &points).unwrap(); assert_eq!( (ops.len() as u64, p, h), - (TIP_41_HEIGHT - WINNER_41_HEIGHT, peer, WINNER_41_HEIGHT) + ( + store.get_height(TIP_47) - store.get_height(WINNER_47), + peer, + store.get_height(WINNER_47) + ) ); } #[test] fn find_headers_between_tip_and_lost() { - let store = mk_store(CHAIN_41); + let store = mk_store(CHAIN_47); - let tip = point(TIP_41_SLOT, TIP_41); - let points = [point(LOST_41_SLOT, LOST_41)]; + let tip = store.get_point(TIP_47); + let points = [store.get_point(LOST_47)]; let result = find_headers_between(&store, &tip, &points).unwrap(); - assert_eq!(result.0.len() as u64, TIP_41_HEIGHT); + assert_eq!(result.0.len() as u64, store.get_height(TIP_47)); assert_eq!(result.1 .0, Point::Origin); assert_eq!(result.1 .1, 0); } #[test] fn test_chain_sync() { - let _ = tracing_subscriber::fmt() - .with_env_filter(EnvFilter::from_default_env()) - .with_test_writer() - .try_init(); - - // step 0a: prepare the store - let store = Arc::new(Mutex::new(mk_store(CHAIN_41))); + let mut setup = Setup::new(LOST_47); + let chain = setup.store.get_chain(TIP_47); + let lost = setup.store.get(&hash(LOST_47)).unwrap().clone(); - // step 0b: prepare actor to forward downstream traffic - let runtime = AcTokio::new("test", 1).unwrap(); - let (port_tx, mut port_rx) = mpsc::channel(1); - let downstream = runtime - .spawn_actor( - "test", - |mut cell: ActoCell| async move { - while let ActoInput::Message(msg) = cell.recv().await { - port_tx.send(msg).await.unwrap(); - } - }, - ) - .me; - - // step 0c: prepare a little utility - fn block_on(runtime: &AcTokio, f: F) -> F::Output { - runtime.with_rt(|rt| rt.block_on(f)).unwrap() - } - - // step 1: prepare the stage - let (block_tx, block_rx) = mpsc::channel(1); - let mut stage = ForwardStage::new(Some(downstream), store, 42, "127.0.0.1:0", 1); - stage.upstream.connect(ChannelRecvAdapter::Mpsc(block_rx)); - let tether = spawn_stage(stage, Default::default()); - - // step 2: wait for the listening event - println!("stage state 1: {:?}", tether.check_state()); - let port = block_on(&runtime, port_rx.recv()).unwrap(); - let ForwardEvent::Listening(port) = port else { - panic!("expected listening event, got {:?}", port); - }; - assert_ne!(port, 0); - println!("stage state 2: {:?}", tether.check_state()); - - // step 3: send the block validated event to inform the stage of the current tip - let span = tracing::debug_span!("whatever"); - - let validated = block_on(&runtime, { - let block_tx = &block_tx; - async move { - println!("sending block validated"); - block_tx - .send( - BlockValidationResult::BlockValidated(amaru_point(TIP_41_SLOT, TIP_41), span) - .into(), - ) - .await - .unwrap(); - println!("waiting for forward event"); - port_rx.recv().await.unwrap() - } - }); - let ForwardEvent::Forward(p) = validated else { - panic!("expected forward event, got {:?}", validated); - }; - assert_eq!(p, point(TIP_41_SLOT, TIP_41)); + let mut client = setup.connect(); - // step 4a: connect to the stage and prove that it is still alive - println!("stage state 3: {:?}", tether.check_state()); - let mut client = block_on( - &runtime, - PeerClient::connect(&format!("127.0.0.1:{port}"), 42), - ) - .unwrap(); + let (p, t) = client.find_intersect(vec![chain[6].pallas_point()]); - // step 4b: find the intersection point - let (p, t) = block_on(&runtime, { - client - .chainsync() - .find_intersect(vec![point(BRANCH_41_SLOT, BRANCH_41)]) - }) - .unwrap(); + assert_eq!(p, Some(setup.store.get_point(BRANCH_47))); + assert_eq!(t.0, lost.pallas_point()); + assert_eq!(t.1, lost.block_height()); - assert_eq!(p, Some(point(BRANCH_41_SLOT, BRANCH_41))); - assert_eq!(t.0, point(TIP_41_SLOT, TIP_41)); - assert_eq!(t.1, TIP_41_HEIGHT); + let headers = client.recv_until_await(); + assert_eq!( + headers, + vec![ClientMsg::Forward(lost.clone(), lost.as_tip())] + ); - // step 5: pull headers from the stage - let headers = block_on(&runtime, async move { - let mut headers = Vec::new(); - while let Ok(response) = client.chainsync().request_next().await { - match response { - NextResponse::RollForward(header, _) => headers.push(header), - NextResponse::RollBackward(_, _) => panic!("unexpected roll backward"), - NextResponse::Await => break, - } - } - headers - }); - assert_eq!(headers.len() as u64, TIP_41_HEIGHT - BRANCH_41_HEIGHT); + setup.send_backward(BRANCH_47); + setup.send_validated(WINNER_47); + setup.send_validated(&chain[8].hash().to_string()); + let msg = client.recv_after_await(); + assert_eq!( + msg, + // out tip comes out as chain[6] here because previously client.recv_until_await already + // asked for the next op, which means the Backward got sent before the BlockValidated + // updated the `our_tip` pointer + ClientMsg::Backward(chain[6].pallas_point(), chain[6].as_tip()) + ); - // prove that this is still alive - otherwise gasket will kill the stage - drop(block_tx); + let headers = client.recv_until_await(); + assert_eq!( + headers, + vec![ + ClientMsg::Forward(chain[7].clone(), chain[8].as_tip()), + ClientMsg::Forward(chain[8].clone(), chain[8].as_tip()), + ] + ); // Note: there’s no way to shut down the gasket stage without logging to ERRORs, sorry } diff --git a/crates/amaru/src/stages/mod.rs b/crates/amaru/src/stages/mod.rs index fa76f15e7..307553165 100644 --- a/crates/amaru/src/stages/mod.rs +++ b/crates/amaru/src/stages/mod.rs @@ -19,9 +19,9 @@ use amaru_consensus::{ store::ChainStore, }, peer::Peer, - ConsensusError, + ConsensusError, IsHeader, }; -use amaru_kernel::{network::NetworkName, EraHistory, Hash, Header, Point}; +use amaru_kernel::{network::NetworkName, EraHistory, Hash, Header}; use amaru_stores::rocksdb::{consensus::RocksDBStore, RocksDB}; use consensus::{ chain_forward::ForwardStage, @@ -32,7 +32,7 @@ use gasket::{ messaging::{tokio::funnel_ports, OutputPort}, runtime::Tether, }; -use pallas_network::facades::PeerClient; +use pallas_network::{facades::PeerClient, miniprotocols::chainsync::Tip}; use std::{path::PathBuf, sync::Arc}; use tokio::sync::Mutex; @@ -89,7 +89,11 @@ pub fn bootstrap( .map(|session| pull::Stage::new(session.clone(), vec![tip.clone()])) .collect::>(); let chain_store = RocksDBStore::new(config.chain_dir.clone(), era_history)?; - let chain_selector = make_chain_selector(tip, &chain_store, &peer_sessions)?; + + let header: Header = chain_store.load_header(&Hash::from(&tip)).unwrap(); + let our_tip = Tip(header.pallas_point(), header.block_height()); + + let chain_selector = make_chain_selector(tip.clone(), &chain_store, &peer_sessions)?; let chain_ref = Arc::new(Mutex::new(chain_store)); let consensus = Consensus::new( Box::new(ledger.state.view_stake_distribution()), @@ -104,6 +108,7 @@ pub fn bootstrap( config.network_magic as u64, &config.listen_address, config.max_downstream_peers, + our_tip, ); let (to_block_fetch, from_consensus_stage) = gasket::messaging::tokio::mpsc_channel(50); @@ -143,7 +148,7 @@ pub fn bootstrap( } fn make_chain_selector( - tip: Point, + tip: amaru_kernel::Point, chain_store: &impl ChainStore
    , peers: &Vec, ) -> Result>>, ConsensusError> { @@ -161,3 +166,38 @@ fn make_chain_selector( Ok(Arc::new(Mutex::new(builder.build()?))) } + +pub trait PallasPoint { + fn pallas_point(&self) -> pallas_network::miniprotocols::Point; +} + +impl PallasPoint for Header { + fn pallas_point(&self) -> pallas_network::miniprotocols::Point { + to_pallas_point(&self.point()) + } +} + +impl PallasPoint for amaru_kernel::Point { + fn pallas_point(&self) -> pallas_network::miniprotocols::Point { + to_pallas_point(self) + } +} + +fn to_pallas_point(point: &amaru_kernel::Point) -> pallas_network::miniprotocols::Point { + match point { + amaru_kernel::Point::Origin => pallas_network::miniprotocols::Point::Origin, + amaru_kernel::Point::Specific(slot, hash) => { + pallas_network::miniprotocols::Point::Specific(*slot, hash.clone()) + } + } +} + +pub trait AsTip { + fn as_tip(&self) -> Tip; +} + +impl AsTip for Header { + fn as_tip(&self) -> Tip { + Tip(self.pallas_point(), self.block_height()) + } +} From 04b1eafbd509a0ea35cb25a29093345eaf536e03 Mon Sep 17 00:00:00 2001 From: Roland Kuhn Date: Sat, 19 Apr 2025 13:47:39 +0200 Subject: [PATCH 04/10] chore: add debug logs to chainsync server and fix bugs Signed-off-by: Roland Kuhn --- .../src/stages/consensus/chain_forward.rs | 41 ++++++++++++++++++- .../chain_forward/client_protocol.rs | 18 +++++++- .../consensus/chain_forward/client_state.rs | 25 ++++++----- .../consensus/chain_forward/test_infra.rs | 39 +++++++++++++++++- .../stages/consensus/chain_forward/tests.rs | 39 ++++++++++++++++++ 5 files changed, 145 insertions(+), 17 deletions(-) diff --git a/crates/amaru/src/stages/consensus/chain_forward.rs b/crates/amaru/src/stages/consensus/chain_forward.rs index c9bb7afe0..2ced9a669 100644 --- a/crates/amaru/src/stages/consensus/chain_forward.rs +++ b/crates/amaru/src/stages/consensus/chain_forward.rs @@ -105,7 +105,7 @@ impl Drop for Worker { } #[allow(clippy::large_enum_variant)] -#[derive(Debug, Clone)] +#[derive(Clone)] enum ClientOp { /// the tip to go back to Backward(Tip), @@ -113,6 +113,45 @@ enum ClientOp { Forward(Header, Tip), } +impl std::fmt::Debug for ClientOp { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Backward(tip) => f + .debug_struct("Backward") + .field("tip", &(tip.1, PrettyPoint(&tip.0))) + .finish(), + Self::Forward(header, tip) => f + .debug_struct("Forward") + .field( + "header", + &(header.block_height(), PrettyPoint(&header.pallas_point())), + ) + .field("tip", &(tip.1, PrettyPoint(&tip.0))) + .finish(), + } + } +} + +struct PrettyPoint<'a>(&'a Point); + +impl std::fmt::Debug for PrettyPoint<'_> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "({}, {})", + self.0.slot_or_default(), + hex::encode(hash_point(&self.0)) + ) + } +} + +fn hash_point(point: &Point) -> Hash<32> { + match point { + Point::Origin => Hash::from([0; 32]), + Point::Specific(_slot, hash) => Hash::from(hash.as_slice()), + } +} + impl PartialEq for ClientOp { fn eq(&self, other: &Self) -> bool { match (self, other) { diff --git a/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs b/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs index 0182fe37b..058363e68 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/client_protocol.rs @@ -107,25 +107,34 @@ async fn chain_sync( let input = cell.recv().await; match input { ActoInput::Message(ChainSyncMsg::Op(op)) => { + tracing::debug!("got op {op:?}"); our_tip = op.tip(); state.add_op(op); if waiting { if let Some(op) = state.next_op() { + tracing::debug!("sending op {op:?} to waiting handler"); waiting = false; handler.send(Some((op, our_tip.clone()))); } } } ActoInput::Message(ChainSyncMsg::ReqNext) => { + tracing::debug!("got req next"); if let Some(op) = state.next_op() { + tracing::debug!("sending op {op:?} to handler"); handler.send(Some((op, our_tip.clone()))); } else { + tracing::debug!("sending await reply"); handler.send(None); waiting = true; } } - ActoInput::NoMoreSenders => return Ok(()), + ActoInput::NoMoreSenders => { + tracing::debug!("no more senders"); + return Ok(()); + } ActoInput::Supervision { result, .. } => { + tracing::debug!("supervision result: {result:?}"); return result .map_err(|e| anyhow::Error::from(ClientError::HandlerFailure(e.to_string()))) .and_then(|x| x); @@ -144,24 +153,30 @@ async fn chain_sync_handler( ) -> anyhow::Result<()> { loop { let Some(req) = server.recv_while_idle().await? else { + tracing::debug!("client terminated"); return Err(ClientError::ClientTerminated.into()); }; if !matches!(req, ClientRequest::RequestNext) { + tracing::debug!("late intersection"); return Err(ClientError::LateIntersection.into()); }; + tracing::debug!("got req next"); parent.send(ChainSyncMsg::ReqNext); if let ActoInput::Message(op) = cell.recv().await { match op { Some((ClientOp::Forward(header, _), tip)) => { + tracing::debug!("sending roll forward"); server .send_roll_forward(to_header_content(header), tip) .await?; } Some((ClientOp::Backward(point), tip)) => { + tracing::debug!("sending roll backward"); server.send_roll_backward(point.0, tip).await?; } None => { + tracing::debug!("sending await reply"); server.send_await_reply().await?; let ActoInput::Message(Some((op, tip))) = cell.recv().await else { return Ok(()); @@ -179,6 +194,7 @@ async fn chain_sync_handler( } } } else { + tracing::debug!("parent terminated"); // parent terminated return Ok(()); } diff --git a/crates/amaru/src/stages/consensus/chain_forward/client_state.rs b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs index 529529831..87b2b8e90 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/client_state.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs @@ -1,7 +1,7 @@ -use super::ClientOp; +use super::{hash_point, ClientOp}; use crate::stages::AsTip; use amaru_consensus::{consensus::store::ChainStore, IsHeader}; -use amaru_kernel::{Hash, Header}; +use amaru_kernel::Header; use pallas_network::miniprotocols::{chainsync::Tip, Point}; use std::collections::VecDeque; @@ -19,24 +19,30 @@ impl ClientState { } pub fn next_op(&mut self) -> Option { + tracing::debug!("next_op: {:?}", self.ops.front()); self.ops.pop_front() } pub fn add_op(&mut self, op: ClientOp) { + tracing::debug!("add_op: {:?}", op); match op { ClientOp::Backward(tip) => { - if let Some(index) = self - .ops - .iter() - .rposition(|op| matches!(op, ClientOp::Forward(_, tip) if &tip.0 == &tip.0)) + if let Some((index, _)) = + self.ops.iter().enumerate().rfind( + |(_, op)| matches!(op, ClientOp::Forward(_, tip2) if &tip2.0 == &tip.0), + ) { + tracing::debug!("found backward op at index {index} in {:?}", self.ops); self.ops.truncate(index + 1); + tracing::debug!("last after truncate: {:?}", self.ops.back()); } else { + tracing::debug!("clearing ops"); self.ops.clear(); self.ops.push_back(ClientOp::Backward(tip)); } } op @ ClientOp::Forward(..) => { + tracing::debug!("adding forward op"); self.ops.push_back(op); } } @@ -85,10 +91,3 @@ pub(super) fn find_headers_between( headers.reverse(); Some((headers, Tip(Point::Origin, 0))) } - -pub(super) fn hash_point(point: &Point) -> Hash<32> { - match point { - Point::Origin => Hash::from([0; 32]), - Point::Specific(_slot, hash) => Hash::from(hash.as_slice()), - } -} diff --git a/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs b/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs index 5c57bf935..d98fd30b3 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs @@ -1,6 +1,6 @@ #![allow(dead_code)] -use super::{ForwardEvent, ForwardStage}; +use super::{ForwardEvent, ForwardStage, PrettyPoint}; use crate::stages::PallasPoint; use acto::{AcTokio, AcTokioRuntime, ActoCell, ActoInput, ActoRuntime}; use amaru_consensus::consensus::store::{ChainStore, Nonces, StoreError}; @@ -269,6 +269,21 @@ impl Client { ops } + pub fn recv_n(&mut self) -> [ClientMsg; N] { + let mut ops = Vec::new(); + for _ in 0..N { + let msg = block_on(&self.runtime, self.client.chainsync().request_next()).unwrap(); + match msg { + NextResponse::RollForward(header, tip) => { + ops.push(ClientMsg::Forward(from_cbor(&header.cbor).unwrap(), tip)) + } + NextResponse::RollBackward(point, tip) => ops.push(ClientMsg::Backward(point, tip)), + NextResponse::Await => break, + } + } + ops.try_into().unwrap() + } + pub fn recv_after_await(&mut self) -> ClientMsg { let msg = block_on( &self.runtime, @@ -285,12 +300,32 @@ impl Client { } } -#[derive(Debug, Clone)] +#[derive(Clone)] pub enum ClientMsg { Forward(Header, Tip), Backward(Point, Tip), } +impl std::fmt::Debug for ClientMsg { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Forward(header, tip) => f + .debug_struct("Forward") + .field( + "header", + &(header.block_height(), PrettyPoint(&header.pallas_point())), + ) + .field("tip", &(tip.1, PrettyPoint(&tip.0))) + .finish(), + Self::Backward(point, tip) => f + .debug_struct("Backward") + .field("point", &PrettyPoint(&point)) + .field("tip", &(tip.1, PrettyPoint(&tip.0))) + .finish(), + } + } +} + impl PartialEq for ClientMsg { fn eq(&self, other: &Self) -> bool { match (self, other) { diff --git a/crates/amaru/src/stages/consensus/chain_forward/tests.rs b/crates/amaru/src/stages/consensus/chain_forward/tests.rs index 72cf89808..4c2d95415 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/tests.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/tests.rs @@ -131,3 +131,42 @@ fn test_chain_sync() { // Note: there’s no way to shut down the gasket stage without logging to ERRORs, sorry } + +#[test] +fn test_sync_optimising_rollback() { + let mut setup = Setup::new(LOST_47); + let chain = setup.store.get_chain(TIP_47); + let lost = setup.store.get(&hash(LOST_47)).unwrap().clone(); + + let mut client = setup.connect(); + client.find_intersect(vec![]).0.expect("no intersection"); + + let msgs = client.recv_n::<4>(); + assert_eq!( + msgs, + [ + ClientMsg::Forward(chain[0].clone(), lost.as_tip()), + ClientMsg::Forward(chain[1].clone(), lost.as_tip()), + ClientMsg::Forward(chain[2].clone(), lost.as_tip()), + ClientMsg::Forward(chain[3].clone(), lost.as_tip()), + ] + ); + + setup.send_backward(BRANCH_47); + setup.send_validated(&chain[7].hash().to_string()); + setup.send_validated(&chain[8].hash().to_string()); + setup.send_validated(&chain[9].hash().to_string()); + + let msgs = client.recv_until_await(); + assert_eq!( + msgs, + [ + ClientMsg::Forward(chain[4].clone(), chain[9].as_tip()), + ClientMsg::Forward(chain[5].clone(), chain[9].as_tip()), + ClientMsg::Forward(chain[6].clone(), chain[9].as_tip()), + ClientMsg::Forward(chain[7].clone(), chain[9].as_tip()), + ClientMsg::Forward(chain[8].clone(), chain[9].as_tip()), + ClientMsg::Forward(chain[9].clone(), chain[9].as_tip()), + ] + ); +} From 297df5590c92ede5f5b68237601d0d9014061e50 Mon Sep 17 00:00:00 2001 From: Roland Kuhn Date: Sat, 19 Apr 2025 16:48:00 +0200 Subject: [PATCH 05/10] chore: mollify clippy Signed-off-by: Roland Kuhn --- crates/amaru/src/stages/consensus/chain_forward.rs | 2 +- .../amaru/src/stages/consensus/chain_forward/client_state.rs | 2 +- .../amaru/src/stages/consensus/chain_forward/test_infra.rs | 3 ++- crates/amaru/src/stages/mod.rs | 5 ++++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/amaru/src/stages/consensus/chain_forward.rs b/crates/amaru/src/stages/consensus/chain_forward.rs index 2ced9a669..0ea58e0fa 100644 --- a/crates/amaru/src/stages/consensus/chain_forward.rs +++ b/crates/amaru/src/stages/consensus/chain_forward.rs @@ -140,7 +140,7 @@ impl std::fmt::Debug for PrettyPoint<'_> { f, "({}, {})", self.0.slot_or_default(), - hex::encode(hash_point(&self.0)) + hex::encode(hash_point(self.0)) ) } } diff --git a/crates/amaru/src/stages/consensus/chain_forward/client_state.rs b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs index 87b2b8e90..d6b1ab4aa 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/client_state.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs @@ -29,7 +29,7 @@ impl ClientState { ClientOp::Backward(tip) => { if let Some((index, _)) = self.ops.iter().enumerate().rfind( - |(_, op)| matches!(op, ClientOp::Forward(_, tip2) if &tip2.0 == &tip.0), + |(_, op)| matches!(op, ClientOp::Forward(_, tip2) if tip2.0 == tip.0), ) { tracing::debug!("found backward op at index {index} in {:?}", self.ops); diff --git a/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs b/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs index d98fd30b3..048da9211 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs @@ -301,6 +301,7 @@ impl Client { } #[derive(Clone)] +#[allow(clippy::large_enum_variant)] pub enum ClientMsg { Forward(Header, Tip), Backward(Point, Tip), @@ -319,7 +320,7 @@ impl std::fmt::Debug for ClientMsg { .finish(), Self::Backward(point, tip) => f .debug_struct("Backward") - .field("point", &PrettyPoint(&point)) + .field("point", &PrettyPoint(point)) .field("tip", &(tip.1, PrettyPoint(&tip.0))) .finish(), } diff --git a/crates/amaru/src/stages/mod.rs b/crates/amaru/src/stages/mod.rs index 307553165..827a43a51 100644 --- a/crates/amaru/src/stages/mod.rs +++ b/crates/amaru/src/stages/mod.rs @@ -90,7 +90,10 @@ pub fn bootstrap( .collect::>(); let chain_store = RocksDBStore::new(config.chain_dir.clone(), era_history)?; - let header: Header = chain_store.load_header(&Hash::from(&tip)).unwrap(); + #[allow(clippy::expect_used)] + let header: Header = chain_store + .load_header(&Hash::from(&tip)) + .expect("Tip not found"); let our_tip = Tip(header.pallas_point(), header.block_height()); let chain_selector = make_chain_selector(tip.clone(), &chain_store, &peer_sessions)?; From 9bef6b2cfd30b61bd706c2684c844fdd15ced730 Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Sun, 20 Apr 2025 18:58:07 +0200 Subject: [PATCH 06/10] fix: pass ledger and chain directories to demo Signed-off-by: Arnaud Bailly --- Makefile | 14 +++++++------- examples/Cargo.lock | 2 -- scripts/demo.sh | 10 +++++++++- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 27a61d78b..52c96fa6b 100644 --- a/Makefile +++ b/Makefile @@ -77,9 +77,9 @@ dev: ## Compile and run for development with default options cargo run -- daemon \ --ledger-dir $(LEDGER_DIR) \ --chain-dir $(CHAIN_DIR) \ - --peer-address=$(AMARU_PEER_ADDRESS) \ + --peer-address $(AMARU_PEER_ADDRESS) \ --network=$(NETWORK) \ - --listen-address=$(LISTEN_ADDRESS) + --listen-address $(LISTEN_ADDRESS) test-e2e: ## Run snapshot tests, assuming snapshots are available. cargo test -p amaru -- --ignored @@ -94,19 +94,19 @@ check-llvm-cov: ## Check if cargo-llvm-cov is installed, install if not coverage-html: check-llvm-cov ## Run test coverage for Amaru cargo llvm-cov \ - --no-cfg-coverage \ - --html \ - --output-dir $(COVERAGE_DIR) $(foreach package,$(COVERAGE_CRATES), --package $(package)) + --no-cfg-coverage \ + --html \ + --output-dir $(COVERAGE_DIR) $(foreach package,$(COVERAGE_CRATES), --package $(package)) coverage-lconv: ## Run test coverage for CI to upload to Codecov cargo llvm-cov \ - --all-features \ + --all-features \ --workspace \ --lcov \ --output-path lcov.info demo: ## Synchronize Amaru until a target epoch $DEMO_TARGET_EPOCH - ./scripts/demo.sh $(AMARU_PEER_ADDRESS) $(DEMO_TARGET_EPOCH) $(NETWORK) + LEDGER_DIR=$(LEDGER_DIR) CHAIN_DIR=$(CHAIN_DIR) ./scripts/demo.sh $(AMARU_PEER_ADDRESS) $(DEMO_TARGET_EPOCH) $(NETWORK) build-examples: ## Build all examples @for dir in $(wildcard examples/*/.); do \ diff --git a/examples/Cargo.lock b/examples/Cargo.lock index 0846b01e2..78197288a 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -56,12 +56,10 @@ dependencies = [ "iter-borrow", "num", "serde", - "serde_json", "slot-arithmetic", "thiserror 2.0.12", "tracing", "tracing-json", - "tracing-subscriber", ] [[package]] diff --git a/scripts/demo.sh b/scripts/demo.sh index 64f445ade..d5f12dd99 100755 --- a/scripts/demo.sh +++ b/scripts/demo.sh @@ -19,9 +19,17 @@ fi NETWORK=${3:-preprod} +LEDGER_DIR=${LEDGER_DIR:-./ledger.db} + +CHAIN_DIR=${CHAIN_DIR:-./chain.db} + echo -e " \033[1;32mTarget\033[00m epoch $TARGET_EPOCH" set -eo pipefail -AMARU_TRACE="amaru=info" cargo run -- --with-json-traces daemon --peer-address=$PEER_ADDRESS --network=$NETWORK | while read line; do +AMARU_TRACE="amaru=info" cargo run -- --with-json-traces daemon \ + --peer-address="${PEER_ADDRESS}" \ + --network="${NETWORK}" \ + --chain-dir="${CHAIN_DIR}" \ + --ledger-dir="${LEDGER_DIR}" | while read line; do EVENT=$(echo $line | jq -r '.fields.message' 2>/dev/null) SPAN=$(echo $line | jq -r '.span.name' 2>/dev/null) if [ "$EVENT" == "exit" ] && [ "$SPAN" == "epoch_transition" ]; then From 04da695caddaaa2ab9c16ef024a1d30f646f818b Mon Sep 17 00:00:00 2001 From: Roland Kuhn Date: Sun, 20 Apr 2025 19:36:07 +0200 Subject: [PATCH 07/10] =?UTF-8?q?accept=20code=20rabbit=E2=80=99s=20sugges?= =?UTF-8?q?tion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Signed-off-by: Roland Kuhn --- crates/amaru/src/stages/consensus/chain_forward/test_infra.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs b/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs index 048da9211..462a5aa05 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/test_infra.rs @@ -146,7 +146,7 @@ impl Setup { let store = mk_store(CHAIN_47); let runtime = AcTokio::new("test", 1).unwrap(); - let (port_tx, mut port_rx) = mpsc::channel(1); + let (port_tx, mut port_rx) = mpsc::channel(8); let downstream = runtime .spawn_actor( "test", @@ -157,7 +157,7 @@ impl Setup { }, ) .me; - let (block_tx, block_rx) = mpsc::channel(1); + let (block_tx, block_rx) = mpsc::channel(8); let mut stage = ForwardStage::new( Some(downstream), Arc::new(Mutex::new(store.clone())), From 6e40efb8b61d18ea026b1c6e94111b04725854c1 Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Sun, 20 Apr 2025 19:42:29 +0200 Subject: [PATCH 08/10] fix: change default listen port to 3000 Signed-off-by: Arnaud Bailly --- crates/amaru/src/bin/amaru/cmd/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/amaru/src/bin/amaru/cmd/mod.rs b/crates/amaru/src/bin/amaru/cmd/mod.rs index 253aaeb96..2b08cf096 100644 --- a/crates/amaru/src/bin/amaru/cmd/mod.rs +++ b/crates/amaru/src/bin/amaru/cmd/mod.rs @@ -26,7 +26,7 @@ pub(crate) const DEFAULT_LEDGER_DB_DIR: &str = "./ledger.db"; pub(crate) const DEFAULT_CHAIN_DB_DIR: &str = "./chain.db"; /// Default address to listen on for incoming connections. -pub(crate) const DEFAULT_LISTEN_ADDRESS: &str = "0.0.0.0:3001"; +pub(crate) const DEFAULT_LISTEN_ADDRESS: &str = "0.0.0.0:3000"; /// Utility function to parse a point from a string. /// From 9b8b3cd4d53eb3f11714292bd834a9f5580a0869 Mon Sep 17 00:00:00 2001 From: Roland Kuhn Date: Sun, 20 Apr 2025 19:51:29 +0200 Subject: [PATCH 09/10] apply rabbit comments Signed-off-by: Roland Kuhn --- .gitignore | 4 +--- .../consensus/chain_forward/client_state.rs | 5 ++--- crates/amaru/src/stages/mod.rs | 19 +++++++++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 402b28b7c..06b207bf7 100644 --- a/.gitignore +++ b/.gitignore @@ -23,8 +23,7 @@ target/ *.snap.new # Files downloaded for the demo -snapshots/ -!crates/amaru/tests/snapshots +/snapshots/ # Files for local coverage reports coverage/ @@ -39,4 +38,3 @@ coverage/ # Cardano node support files /cardano-node-config/ -/snapshots/ diff --git a/crates/amaru/src/stages/consensus/chain_forward/client_state.rs b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs index d6b1ab4aa..08f09de05 100644 --- a/crates/amaru/src/stages/consensus/chain_forward/client_state.rs +++ b/crates/amaru/src/stages/consensus/chain_forward/client_state.rs @@ -50,10 +50,9 @@ impl ClientState { } /// Find headers between points in the chain store. -/// Returns None if none of the points in `points` lies in the past of `start_point`. +/// Returns None if the local chain is broken. /// Otherwise returns Some(headers) where headers is a list of headers leading from -/// the first found point in the past of `start_point` matching a point from `points` -/// up to `start_point`. +/// the tallest point from the list that lies in the past of `start_point`. pub(super) fn find_headers_between( store: &dyn ChainStore
    , start_point: &Point, diff --git a/crates/amaru/src/stages/mod.rs b/crates/amaru/src/stages/mod.rs index 827a43a51..fe6a6e6f4 100644 --- a/crates/amaru/src/stages/mod.rs +++ b/crates/amaru/src/stages/mod.rs @@ -32,7 +32,10 @@ use gasket::{ messaging::{tokio::funnel_ports, OutputPort}, runtime::Tether, }; -use pallas_network::{facades::PeerClient, miniprotocols::chainsync::Tip}; +use pallas_network::{ + facades::PeerClient, + miniprotocols::{chainsync::Tip, Point}, +}; use std::{path::PathBuf, sync::Arc}; use tokio::sync::Mutex; @@ -90,11 +93,15 @@ pub fn bootstrap( .collect::>(); let chain_store = RocksDBStore::new(config.chain_dir.clone(), era_history)?; - #[allow(clippy::expect_used)] - let header: Header = chain_store - .load_header(&Hash::from(&tip)) - .expect("Tip not found"); - let our_tip = Tip(header.pallas_point(), header.block_height()); + let our_tip = if let amaru_kernel::Point::Specific(_slot, hash) = &tip { + #[allow(clippy::expect_used)] + let header: Header = chain_store + .load_header(&Hash::from(&**hash)) + .expect("Tip not found"); + Tip(header.pallas_point(), header.block_height()) + } else { + Tip(Point::Origin, 0) + }; let chain_selector = make_chain_selector(tip.clone(), &chain_store, &peer_sessions)?; let chain_ref = Arc::new(Mutex::new(chain_store)); From bb387c164fe3635c3387b748e4c322f26769717f Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Sun, 20 Apr 2025 23:05:00 +0200 Subject: [PATCH 10/10] fix: set demo directory to be default ones Turns out there's a hidden dependency in CI between the ledger.db and the snapshot tests. While we find a way to make tests aware of the LEDGER_DIR env variable, it seems simpler to just stick to default dirs. Signed-off-by: Arnaud Bailly --- Makefile | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 52c96fa6b..5835c6767 100644 --- a/Makefile +++ b/Makefile @@ -5,11 +5,9 @@ DEMO_TARGET_EPOCH ?= 174 HASKELL_NODE_CONFIG_SOURCE := https://book.world.dev.cardano.org/environments COVERAGE_DIR ?= coverage COVERAGE_CRATES ?= -DB_PREFIX ?= amaru LISTEN_ADDRESS ?= 0.0.0.0:0 - -LEDGER_DIR = $(DB_PREFIX)-ledger -CHAIN_DIR = $(DB_PREFIX)-chain +LEDGER_DIR ?= ./ledger.db +CHAIN_DIR ?= ./chain.db .PHONY: help bootstrap run import-snapshots import-headers import-nonces download-haskell-config coverage-html coverage-lconv check-llvm-cov @@ -96,7 +94,7 @@ coverage-html: check-llvm-cov ## Run test coverage for Amaru cargo llvm-cov \ --no-cfg-coverage \ --html \ - --output-dir $(COVERAGE_DIR) $(foreach package,$(COVERAGE_CRATES), --package $(package)) + --output-dir $(COVERAGE_DIR) $(foreach package,$(COVERAGE_CRATES), --package $(package)) coverage-lconv: ## Run test coverage for CI to upload to Codecov cargo llvm-cov \