From 04b2eeedd0e54158adc248f89cc0ed0ab36ea263 Mon Sep 17 00:00:00 2001 From: Alfredo Garcia Date: Mon, 13 Jul 2020 13:29:21 -0300 Subject: [PATCH] Longer checkpoint gap test case (#643) * create longer checkpoint test * use futures unordered to syncronize background futures Co-authored-by: Jane Lusby --- zebra-consensus/src/checkpoint/tests.rs | 127 +++++++++++++++++++++++- zebra-test/src/vectors.rs | 11 ++ 2 files changed, 136 insertions(+), 2 deletions(-) diff --git a/zebra-consensus/src/checkpoint/tests.rs b/zebra-consensus/src/checkpoint/tests.rs index d1d818b45..ad0f55725 100644 --- a/zebra-consensus/src/checkpoint/tests.rs +++ b/zebra-consensus/src/checkpoint/tests.rs @@ -6,10 +6,11 @@ use super::types::Progress::*; use super::types::Target::*; use color_eyre::eyre::{eyre, Report}; -use futures::future::TryFutureExt; +use futures::{future::TryFutureExt, stream::FuturesUnordered}; use std::{cmp::min, mem::drop, time::Duration}; -use tokio::time::timeout; +use tokio::{stream::StreamExt, time::timeout}; use tower::{Service, ServiceExt}; +use tracing_futures::Instrument; use zebra_chain::serialization::ZcashDeserialize; @@ -203,6 +204,128 @@ async fn multi_item_checkpoint_list() -> Result<(), Report> { Ok(()) } +#[tokio::test] +async fn continuous_blockchain_test() -> Result<(), Report> { + continuous_blockchain().await +} + +#[spandoc::spandoc] +async fn continuous_blockchain() -> Result<(), Report> { + zebra_test::init(); + + // A continuous blockchain + let mut blockchain = Vec::new(); + for b in &[ + &zebra_test::vectors::BLOCK_MAINNET_GENESIS_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_1_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_2_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_3_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_4_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_5_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_6_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_7_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_8_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_9_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_10_BYTES[..], + ] { + let block = Arc::::zcash_deserialize(*b)?; + let hash: BlockHeaderHash = block.as_ref().into(); + blockchain.push((block.clone(), block.coinbase_height().unwrap(), hash)); + } + + // Parse only some blocks as checkpoints + let mut checkpoints = Vec::new(); + for b in &[ + &zebra_test::vectors::BLOCK_MAINNET_GENESIS_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_5_BYTES[..], + &zebra_test::vectors::BLOCK_MAINNET_10_BYTES[..], + ] { + let block = Arc::::zcash_deserialize(*b)?; + let hash: BlockHeaderHash = block.as_ref().into(); + checkpoints.push((block.clone(), block.coinbase_height().unwrap(), hash)); + } + + // The checkpoint list will contain only block 0, 5 and 10 + let checkpoint_list: BTreeMap = checkpoints + .iter() + .map(|(_block, height, hash)| (*height, *hash)) + .collect(); + + let mut checkpoint_verifier = CheckpointVerifier::new(checkpoint_list).map_err(|e| eyre!(e))?; + + // Setup checks + assert_eq!( + checkpoint_verifier.previous_checkpoint_height(), + BeforeGenesis + ); + assert_eq!( + checkpoint_verifier.target_checkpoint_height(), + WaitingForBlocks + ); + assert_eq!( + checkpoint_verifier.checkpoint_list.max_height(), + BlockHeight(10) + ); + + let mut handles = FuturesUnordered::new(); + + // Now verify each block + for (block, height, _hash) in blockchain { + /// SPANDOC: Make sure the verifier service is ready + let ready_verifier_service = checkpoint_verifier + .ready_and() + .map_err(|e| eyre!(e)) + .await?; + + /// SPANDOC: Set up the future for block {?height} + let verify_future = timeout( + Duration::from_secs(VERIFY_TIMEOUT_SECONDS), + ready_verifier_service.call(block.clone()), + ); + + /// SPANDOC: spawn verification future in the background + let handle = tokio::spawn(verify_future.in_current_span()); + handles.push(handle); + + // Execution checks + if height < checkpoint_verifier.checkpoint_list.max_height() { + assert_eq!( + checkpoint_verifier.target_checkpoint_height(), + WaitingForBlocks + ); + } else { + assert_eq!( + checkpoint_verifier.previous_checkpoint_height(), + FinalCheckpoint + ); + assert_eq!( + checkpoint_verifier.target_checkpoint_height(), + FinishedVerifying + ); + } + } + + while let Some(result) = handles.next().await { + result??.map_err(|e| eyre!(e))?; + } + + // Final checks + assert_eq!( + checkpoint_verifier.previous_checkpoint_height(), + FinalCheckpoint + ); + assert_eq!( + checkpoint_verifier.target_checkpoint_height(), + FinishedVerifying + ); + assert_eq!( + checkpoint_verifier.checkpoint_list.max_height(), + BlockHeight(10) + ); + + Ok(()) +} + #[tokio::test] async fn block_higher_than_max_checkpoint_fail_test() -> Result<(), Report> { block_higher_than_max_checkpoint_fail().await diff --git a/zebra-test/src/vectors.rs b/zebra-test/src/vectors.rs index f19382074..1387e8952 100644 --- a/zebra-test/src/vectors.rs +++ b/zebra-test/src/vectors.rs @@ -254,4 +254,15 @@ lazy_static! { pub static ref ZIP243_2 : Vec = >::from_hex("0400008085202f89020bbe32a598c22adfb48cef72ba5d4287c0cefbacfd8ce195b4963c34a94bba7a175dae4b0465ac656353708915090f47a068e227433f9e49d3aa09e356d8d66d0c0121e91a3c4aa3f27fa1b63396e2b41d090063535300ac53ac514e97056802da071b970d4807000152a844550bdc2002000752526a65520052d7034302011b9a076620edc067ff0200000353e3b8a71face1c9f37745ed36883529304bfd5a390b37bc5a3445241f03f64a818820dfeddd75375159fbd21eca9872104f8d7b3c8c869703a1e7848a5c941e45a9c7943446d0dc9627cb31f80e7aa596d4821dc99a7d777cd57e194842a023471f0f6288a150647b2afe9df7cccf01f5cde5f04680bbfed87f6cf429fb27ad6babe791766611cf5bc20e48bef119259b9b8a0e39c3df28cb9582ea338601cdc481b32fb82adeebb3dade25d1a3df20c37e712506b5d996c49a9f0f30ddcb91fe9004e1e83294a6c9203d94e8dc2cbb449de4155032604e47997016b304fd437d8235045e255a19b743a0a9f2e336b44cae307bb3987bd3e4e777fbb34c0ab8cc3d67466c0a88dd4ccad18a07a8d1068df5b629e5718d0f6df5c957cf71bb00a5178f175caca944e635c5159f738e2402a2d21aa081e10e456afb00b9f62416c8b9c0f7228f510729e0be3f305313d77f7379dc2af24869c6c74ee4471498861d192f0ff0f508285dab6b6a36ccf7d12256cc76b95503720ac672d08268d2cf7773b6ba2a5f664847bf707f2fc10c98f2f006ec22ccb5a8c8b7c40c7c2d49a6639b9f2ce33c25c04bc461e744dfa536b00d94baddf4f4d14044c695a33881477df124f0fcf206a9fb2e65e304cdbf0c4d2390170c130ab849c2f22b5cdd3921640c8cf1976ae1010b0dfd9cb2543e45f99749cc4d61f2e8aabfe98bd905fa39951b33ea769c45ab9531c57209862ad12fd76ba4807e65417b6cd12fa8ec916f013ebb8706a96effeda06c4be24b04846392e9d1e6930eae01fa21fbd700583fb598b92c8f4eb8a61aa6235db60f2841cf3a1c6ab54c67066844711d091eb931a1bd6281aedf2a0e8fab18817202a9be06402ed9cc720c16bfe881e4df4255e87afb7fc62f38116bbe03cd8a3cb11a27d568414782f47b1a44c97c680467694bc9709d32916c97e8006cbb07ba0e4180a3738038c374c4cce8f32959afb25f303f5815c4533124acf9d18940e77522ac5dc4b9570aae8f47b7f57fd8767bea1a24ae7bed65b4afdc8f1278c30e2db98fd172730ac6bbed4f1127cd32b04a95b205526cfcb4c4e1cc955175b3e8de1f5d81b18669692350aaa1a1d797617582e54d7a5b57a683b32fb1098062dad7b0c2eb518f6862e83db25e3dbaf7aed504de932acb99d735992ce62bae9ef893ff6acc0ffcf8e3483e146b9d49dd8c7835f43a37dca0787e3ec9f6605223d5ba7ae0ab9025b73bc03f7fac36c009a56d4d95d1e81d3b3ebca7e54cc1a12d127b57c8138976e791013b015f06a624f521b6ee04ec980893c7e5e01a336203594094f82833d74427880084d35863c8e7ebb5c9eed98e72572ec40c79b26623b58022f489b0893d88be63f3f8c0d23249ebcde13db9312941c36c1d1cbcabac0c78cb3b1912db0dcbfe1893d9b51be4af1d000bac1ad0a3ae2ce1e73225fb114d05af4cefc06e875f074ffeae0cba7da3a516c173be1c513323e119f635e8209a074b216b7023fadc2d25949c90037e71e3e550726d210a2c688342e52440635e9cc14afe10102621a9c9accb782e9e4a5fa87f0a956f5b85509960285c22627c59483a5a4c28cce4b156e551406a7ee8355656a21e43e38ce129fdadb759eddfa08f00fc8e567cef93c6792d01df05e6d580f4d5d48df042451a33590d3e8cf49b2627218f0c292fa66ada945fa55bb23548e33a83a562957a3149a993cc472362298736a8b778d97ce423013d64b32cd172efa551bf7f368f04bdaec6091a3004a757598b801dcf675cb83e43a53ae8b254d333bcda20d4817d3477abfba25bb83df5949c126f149b1d99341e4e6f9120f4d41e629185002c72c012c414d2382a6d47c7b3deaba770c400ca96b2814f6b26c3ef17429f1a98c85d83db20efad48be8996fb1bff591efff360fe1199056c56e5feec61a7b8b9f699d6012c2849232f329fef95c7af370098ffe4918e0ca1df47f275867b739e0a514d3209325e217045927b479c1ce2e5d54f25488cad1513e3f44a21266cfd841633327dee6cf810fbf7393e317d9e53d1be1d5ae7839b66b943b9ed18f2c530e975422332c3439cce49a29f2a336a4851263c5e9bd13d731109e844b7f8c392a5c1dcaa2ae5f50ff63fab9765e016702c35a67cd7364d3fab552fb349e35c15c50250453fd18f7b855992632e2c76c0fbf1ef963ea80e3223de3277bc559251725829ec03f213ba8955cab2822ff21a9b0a4904d668fcd77224bde3dd01f6ffc4828f6b64230b35c6a049873494276ea1d7ed5e92cb4f90ba83a9e49601b194042f2900d99d312d7b70508cf176066d154dbe96ef9d4367e4c840e4a17b5e5122e8ebe2158a3c5f4cbae21ea3fa1ae6c25a9462ebcbb0fd5f14554bc97747c33e34da90c816d8d0d50bfe37618c5812891484fa259322c15092d4155d8696d6f12f24fd364496b3be0871ca3dd9625348a614b59bde45885649bae36de34def8fcec85343475d976ae1e9b27829ce2ac5efd0b399a8b448be6504294ee6b3c1c6a5342d7c01ae9d8ad3070c2b1a91573af5e0c5e4cbbf4acdc6b54c9272200d9970250c17c1036f06085c41858ed3a0c48150bc697e4a695fef335f7ad07e1a46dc767ff822db70e6669080b9816b2232c81a4c66cc586abfe1eaa8ca6cf41fc30eb8dc57c37a3c39c59c94232df9d388dbfa35c2cd5c75f328e9fea78f65568f2bb934c82c4142da69d12ca7de9a7df706400ec79878d868e17e8f71ea31495a8bae7bdc2e48b5118771c2fca078cca1fce0d7ef0af3478cf36f69e85a41dd29b4294a65d3e055ff718dd9dc8c75e7e5b2efe442637371b7c48f6ee99e3ea38a4b0f2f67fc2b908cda657eae754e037e262e9a9f9bd7ec4267ed8e96930e1084783c37d6f9dd15fd29f4cc477e66f130d630430dcc0104899b4f9f46eb090ef7fc90b479abf61f93955ee00e6a1848f1ab14ad334f2b68035808cdf1bb9e9d9a816baf728a955b960b7701fa626687dc3c9cba646337b53e29816e9482ddf5578a8768aae477fce410ac2d5de6095861c111d7feb3e6bb4fbb5a54955495972798350a253f05f66c2ecfcbc0ed43f5ec2e6d8dba15a51254d97b1821107c07dd9a16ef8406f943e282b95d4b362530c913d6ba421df6027de5af1e4745d5868106954be6c1962780a2941072e95131b1679df0637625042c37d48ffb152e5ebc185c8a2b7d4385f1c95af937df78dfd8757fab434968b0b57c66574468f160b447ac8221e5060676a842a1c6b7172dd3340f764070ab1fe091c5c74c95a5dc043390723a4c127da14cdde1dc2675a62340b3e6afd0522a31de26e7d1ec3a9c8a091ffdc75b7ecfdc7c12995a5e37ce3488bd29f8629d68f696492448dd526697476dc061346ebe3f677217ff9c60efce943af28dfd3f9e59692598a6047c23c4c01400f1ab5730eac0ae8d5843d5051c376240172af218d7a1ecfe65b4f75100638983c14de4974755dade8018c9b8f4543fb095961513e67c61dbc59c607f9b51f8d09bdcad28bcfb9e5d2744ea8848b2623ac07f8ef61a81a35910b8a1baf39a919a7b60bc604d63185f759221d847cc54a22765a4c33475b5791e9af3271fc8d9350667090d8184ec50522d804f23c4fb44ffa481bc92ae408d1b9f2b131904f9705c59e2f4bde7a3b2c085d93fd2abc5e14d163001a12f51938d021afa92239b873dc6c357eaa8af4ee6d00540657fe32914103b5d98f68bd3e2b5359f08ccd88d0c811e4c31fbb49f3a90bbd05dce62f344e7077593159ae35050b04c9e6b86bc432dc8b048c73c0018ca5b69411297732a4e1aa99a928c71e7a24fd277856aa42501e51b012aea9446a2104e93f815a0b3a29b458314f3d8be2b9823d342f46213e942a7e19a46e970b5c506708430317b1bb3b35df68ae33a4926a03e6bfeb5510416fcbb0524c9ca5074156cc5a5d6fe1c995edc60a2f550411aa41e3da3bdcf64bcf04a0510571b936d47e55cec0330008dfe73563404f047d7f3a8a3d7743bc554955210f1eb0d08599ea77d5f974d87176d37d98b9c0ad440407209ed6a9f08464d565593e1a63b938536b49244e97d").expect("Transaction bytes are in valid hex representation"); // https://github.com/zcash/zips/blob/master/zip-0243.rst#test-vector-3 pub static ref ZIP243_3 : Vec = >::from_hex("0400008085202f8901a8c685478265f4c14dada651969c45a65e1aeb8cd6791f2f5bb6a1d9952104d9010000006b483045022100a61e5d557568c2ddc1d9b03a7173c6ce7c996c4daecab007ac8f34bee01e6b9702204d38fdc0bcf2728a69fde78462a10fb45a9baa27873e6a5fc45fb5c76764202a01210365ffea3efa3908918a8b8627724af852fc9b86d7375b103ab0543cf418bcaa7ffeffffff02005a6202000000001976a9148132712c3ff19f3a151234616777420a6d7ef22688ac8b959800000000001976a9145453e4698f02a38abdaa521cd1ff2dee6fac187188ac29b0040048b004000000000000000000000000").expect("Transaction bytes are in valid hex representation"); + + // Mainnet block 2-10 + pub static ref BLOCK_MAINNET_2_BYTES: Vec = >::from_hex("040000008392336da29773c56b1649ab555156ceb7e700ad7c230ea7a4571c7e22bc0700f4b084a7c2fc5a5aa2985f2bcb1d4a9a65562a589d628b0d869c5f1c8dd074890000000000000000000000000000000000000000000000000000000000000000ca7a1358ffff071fa5556cd346010000000000000000000000000000000000000000000000000002fd4005005605e4490c2e7fc1acf199d7401e18ab8d2be4c843103a7ebdd34046d5514559e6ecbe29c00b9adf6f1aa49f1d63b9c20fd9bca4d9bbb381cb82f59cee9f387deb34ec4fd6b1e12f656a554bc21db88bd1560a033e64099c0bef439cdd6055aaa4f79c360ad37d1f1df1fbd35214e17fc5a0b3c0d272b1e693d6ba9e5e0ae71c6ff58545776838c18b756bf98a83a6b9739b4dec356117b2b227f6f6ea3f04fd854aadf27b40b302d3fa50719aa02f99c2003b51eab8c64cfd145117054dcadb604ba65a8854a095bd9f02884a65225baf0547a7ee44882b11343d40b1a6511cbc4db1d2fd840a8cd63610d29c47bd5c920fe13c349d1044185cd40854f8e60a212d59e1fe281e8bd1343a682e95f3ea23fb5ca83f9913bbcb11232ffd7165ea4a475273df1f3bb53cb721548b28f772acf56060da5d26fab50c4f8b87781bf28843bea805340531a61f002b5aad9a0427b597af1a08659f1a7b4b6d69d53b13191cf35512bc3521359dda47911112d06ae5410281d918bf53049f8295f067f2b3794a90cc15358e294c6cbd7896108d7c897e4bf61aa72451a280cfce72e0515b8dc510a52743b7615b25ba2f13419d562f6148fa36132622953c0fb74ea0b4870f86ccc1ece9661b29516a2226ea16b7100dbeb718a674eedbbe9d23ab02fe1c634234f3c1275ae9d7f74c754c66dec0af7331fc1407075a06cba62098a9be09d24889e7d0a6cf77d875131fe1278e6fdea2bfd9423903e1cb4502edcef971c60b064d4d8a9703ff324574e3d0535a59ab091355185499545be1baffddf6c2b654e5c30e7e1291763fd70896217d91d876a9be914a8472fa292ea3cfdc4be84f4c645f62d8ccff990ac4f5c84e0775b147d1532e2d4f3a8fb92fda899280a3e42f2b927dbef872ec6058254eb20e2770efde7c57905e7741321e833533e0006344a4c6deb9a78e8496de1ae1464ef8367ae97714700e76658e2390cb9702d1413b333d7f04fb89dd09cefeb34e0ead616cd5d352a2f348758e0f5fc4220c6a0693acc90b8dcd7a372ecb688d86356c151d9703576af8e904adea9941d1a6296774ba62b4dae7bf0a078f740af040c584f0245ed2ffa351f0b550c8b80e192ba1a75eb40fc42d67b722ea04ea947ed53e831fe057153a8bd6897ddcd43cb558d2766fb05640ed0c1d14eae0739b11ec07e34f3ea6acbd9f807b9ea6476bda5964a9fca1819c854680f75857e57fbf3fc50e3f5b0d25cadadcd9b3428b85b70b95080c9423a836e9e9e2cbd485075a29452d65acf3d5762111d70a0fd389ac7214b96b11eb14ae48ff1e4930ea50d8261472fd8d04877af717b4d463c0d9a6cf397b5b91fb1a898b329c4b46b8c350e3c0122e186bc393fe6d361e117963d38e44e0ccf1c45f33440aaebd8f99ad7b019c6411bb070178fb6b76e085e3bdae4c883f1f4112e7db91c519c48769fe96f56350cc8687679747730f0aad3bc58b78f87d162104beee449e55eab45558241f32cb5a0f30fea0f38632adfc8a2b7292ff89641581bb6e0111af26dad9199596ce8d432e6f7d0a7415aacc473acfb8af68c9c6ef8b60c535da095cd3a02598fd82fe20481dc87bf6ed25fb95633dc7ff8bcf3f81c323546084170e567536b5c4ce9392ae1dc1f201d732134597e3c9353416fa40ff8f2628815e9b980f27a9c05adefa779ef1a35fdfe6423e9f671677311971bd91d9aeb6adf4c45769d07df7a24955f4082730fb0d3f6467472f75add86b827a7b664005931130029553fdb62ad9ffdb64b44701c0d94e7c5f5ba2340e641d9e34737e29b47e619659f458a161648c9fb81dddbcc73f1eebc92fd7f7b70356635f0de19912d82c9a978c2750aacbfbeee3ab62e96f7df7ce918fa30101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025200ffffffff02a0860100000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875aca86100000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000").expect("Block bytes are in valid hex representation"); + pub static ref BLOCK_MAINNET_3_BYTES: Vec = >::from_hex("04000000ed73e297d7c51cb8dc53fc2213d7e2e3f116eb4f26434496fc1926906ca2020083bebac375d107dbfd4a5901765da703c2953acbba6a7125720c1de2ea70364e0000000000000000000000000000000000000000000000000000000000000000cd7a1358ffff071fa5556cd3ad000000000000000000000000000000000000000000000000000000fd40050028fea86051a02aefa905dc4fec427af4f7b8ab3e05bfcd446add3cff9b5ec2100ce57229c1d1d9ae5c1a4f7d7730d7ddeae724e2dabb1c6392d2843775cd32b4e4dae21eeecd1fcf3400a47bf7c9b922ae6d1d02285c8f8d0ed46d2f0c91034127028304071c645a205a0d1dcdd059bb90f5d45d59503b69aaed7fc7a6053c8c9fa918830d4625f2baecf6d720ba6e9694a123be44509b92bc6cb0488324d9fe4aece2a95b895a04f353979ec729dd06b961ee0563680099ac7443333d8e054d27542b517db2448c45df9a95564134b980193b7dd8e850c667bcece58ab9bcaae16b686c748c3389a4b3a621b96bd15655931a3522eab5771770d205ddb84174e518e35a77209b5f1e2d9147effa708c0c3fcb4eeea1d2ad42c787fd99d32ac64053b5230c069ca13dcad0b6cfff7ec5f324eb32a681dc7956ff143b3735a24b3f3dde1a51bd58e833ac831912f6cb00f8d79aac97954efbeaf2696df52711fab278cbc3125594bcd9bc6055e6346349aa627780fb9b9b7c4a0ae161f990d0fca33b41b414766c6111ad1d91386e18a0dee812878a0ffdc491cfb8fce36d76b48d0dc7099e42b9448e041cad883115e44a60b12782ee34cd18a44d9f9110169dc3e675bcd874deb2b13997fd3711bc038531943600addc0559bd77d711836a543cae23f04e146139e209fb5de772a9cb3e0bc10bffb70d0b60d87d5b45758782f311b349e9ee2487100629d121428bf1a7099345cfd0c254b625f2f8c9059256aa1b29e4a78b64461fffc8b4a1f4e11ef9293b10e0223c8853f2b85ad61bab1fb7eef7cd96e291695ea3b00be19f3c03612b3795a503bbc49ecd71a2687ff0c01c94b6e958ee973d9d0532d1bd3e432e3afd153914132f5918d41b9f87a1dbd1fdbdd9024d86753e81ce1eb32bab2d92d8a7017195a1a5b345358139db90f10070c6fd5ab4e3e1f5c49550f632f72f143d191ad70381a6daafaba6bbf36e8ad79bd973039a30dee16a01cf252fe3ccc66b3904a103ec14f12dc9ab6fff540d08a2de25e14d710e421178ae24a8a5dc597e23980744697d079c15eb2a60a6df003ae5be770d1b5cd3187baa87418d8740f5861ae79ddb1aef3bdb3e5e470a61c0fcb8d2673ad050c13bdc57d2855ca1adf9eb2730055dfe1d618d23603499146d083dc2363dd7f80bf94781a24814df6b1a221e8b7b36688a4398621b33b24c996a91f7e13edbf4ffd7f8612db709359a303bb7a5d3689f9e7bf645a4289c36d48dbd73f270044c9c6d550b310ebfd18b7630e7fd61c5cc271310620ff7317b899faef5cff6c9c9defc0326c618f6f6bd225c25d0b56190e18aae433eb8f8458ae252b9ce082134f6b3ffd271753c7f0260fbf46a5e9811999d992c14b6ac88d04829b4d883ea1a78cb6da876930060012ec17bf94f9768f172f525296f78862faa12b9b5170346a647cdd2f5dabfe34c88733f91314b77821f0d7d0b8ccee03b5bec6571ebc66619c4c08e1e11fa38d395d2805160d79152b41f85479e727daf753dad05754db24e533d19f21f23ed4f4f5c91d4c7d597b33f309dc8e8de4711b99b64e9eb580a42ae1b5f2cf51b2729fce62799774d81921e5ba616fac006ffe5b52f007bec41149c41295385cc7d6dd45ee566d7e71d0284708fd842b0e021e81a2c54f9082788295f10101e924954ef8a0f388191144738367bf9d7f5fc078b03bd6da2a3860f4e3840e51fc2432617a9223eda674b4ccf72222d859da4c8b6b56d4d7e49d6201fd3a802daf9fe32612153dbb933b609f2ae9d27cd53354d21ad7b8837097c6ae00ab4cb5848638d4f9ecd52b90c134d1f45cf107d055054018dd95add753e0ffb271b641e4bc95f013745f212021c3d64911901ec7b810101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025300ffffffff02f0490200000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875ac7c9200000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000").expect("Block bytes are in valid hex representation"); + pub static ref BLOCK_MAINNET_4_BYTES: Vec = >::from_hex("040000007fc6ea65cae94cd84309ed9e0f35a67087cd4bfcf3c95ad6978ebbe5c4f606006e44e2f6865c547769a8ce02e148c83f3f15bfd8afd31e4c05318816b0b91b780000000000000000000000000000000000000000000000000000000000000000d07a1358ffff071f7534e5d60c000000000000000000000000000000000000000000000000000000fd4005008d16b18e21dff532f88087062f3919bee13ca6e204b89baa18973860fdaad24710b3ae6cd68297296c205f997e678d134bfebb3bfc4d61fdd746c45a8a3933f4ad6ca895f3e540b95978b3d1e4530b5059068706b476d21115a054da1ba3d6fa607f19caaaff109008d50ac5c145a9bcd71cb2999aca9144ae2d1d8a981f1f66ee54ef445dc25286eb40d7549a5261f808a133ae1e7dd86b7a21b57b64b0e8d7f38f265cfd881c0808c42029deaa632ef700ee483bdc4e7c95dac5a12235aa5902f470fdb0b5d640a259538b05af5aadaf1cedb48ed1691f3fbc51935728cb28566bb71eca9f1d650355c28ecfc97805820560771b34e6a0ec7c871641ebf574ef5207aaf008042ffa9eef45febf87bb447ee6fa64a726e965dea67491ee0a5a46a83ead4818282be5b72820738a5dd469cd38d8da252cb3ba621880653121062bb5cfbbd648ccd7b6bd9ca43e356006b64b7adf0833bc6c91228e95b0a68540517ccae80ed3eb9346474b8d1780017e85ab11a1f02dbfe8870ba7f9a0b80942a4d785b2661277f730bd2ff8ffb70c4dbdfb3c933b8d3fc0c20e634eae792f1d70c218095570f454c88b0aae3af5b5a1b1fcc9f18f1c29ef2379c560787545a5d404174582fd6d5a57e93964d409aa6bb60586e6a09cace3b2bc38c4e907bbd1da7a4a0445f9c9e0d80d57e4f5889749c89def7f98f6e30811587906d351a3835da235fd5ec8bd77d39c323710f96424954a2160ec2f82ba02620466a901d92b4732ace45ca3d9f86f742ff33ea31d5f4919b89a8504534d6b5199faa1a7ec2db8e61df3ee82dcf377e1ee099727c8654b9ce9c83e93f3b1de5eea0c6d111bc3350f7dfb989c20fbe578461d57d24a92254adbbc390e061fd028c82daf62cfe727bde25046704798bf3e2e87dd87c712185f805d09cf797060be7cb8f9ca6400b4bc5c8256c8ed5b0fd04139d9c5301ae7fd37ea062805bd7fe97b97589705dcec54e2a6c2d15a46e602492382f18afe2d63266229909593a6e9f5ba155f4b4693b563e85fd1abd0e6f81d3f5dc1c9a3fd9b44038d3669428a495ad8a60223876c6b51e6441ce4351a3e3a5657e53065e6c742e2715bb7eb81eabee52009d9f1aa5e5b1c8edf9233f87fe68081d5acbebf1759045cf0e5a95f0953077864dc57d656309574412a0209e097d2f1880fc1de0054c326a0b915a0141fbc03d0e2252cc3c1293cdd6639b86d33862290f8f31702d71c3a3bd61a56d108071c49ee1a5a627f167c4c2d2cfea51428b147e769a50a33adfb8eba3757f0e20646ff72b4115dc1b911a1c7b268f25cbd31a859dc0b51ac67c7f5cecbdb1e2220f7b06d852e2d956d3416067f34305d8c3f1c9f11c77163ec95f23b3f737232836272de1c6fedc76424a878f833e94c498eba5e0190d444b7c19fb4d466c0be3dc804108c4ef1f71910155504301eff1d9b4f5bf6b6e532ab41bdfa30250f05708718cf928681b631949f9fd5bba44cbf750812ab9aa409e19b6f62e911a506effbfd95cbb5699509a9ca7c6b457633d0f19205b5fe05e19f9cf8c71817ec98e4053a7833e3e604e97bea7b62bcdbfccac928d63c1944dd3f8f17d438f0f3d4dde6f5bf9e82d24cf3062c911702af8a8875260733bb369ef5f828370294a32f300d7ad8cf5f4467d9cdd83e48df7806ef1d1cf1a3f393c4f50257d2de8b9a117cec381db8f70519d6a52dd745d0bb4357b562e7339291263ae9d715e733187923689dcae662e96fc59142070336f4b61925f7b3bea72b23a534b458f1af6ad15bc87a5fbb2bcfa1dbef1d4831cfd3d526467fd92228ab16a5a927084c3754e907ab9d5e66d567cb8777bcd53f1b272c7deda98d27a1e16255174b69bcd14e017c38e8620101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025400ffffffff02400d0300000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875ac50c300000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000").expect("Block bytes are in valid hex representation"); + pub static ref BLOCK_MAINNET_5_BYTES: Vec = >::from_hex("04000000139800c8af9bcb6156678ac8959a5464acb41722e63c242e274327c38eaa020039a9c13e74d011141664139cc44124ef000edb3270403416eb183895f3da4a9a0000000000000000000000000000000000000000000000000000000000000000d27a1358ffff071f7534e3ae00000000000000000000000000000000000000000000000000000004fd40050000de1e2f4c54fe9d58b0278bffd734bb9fe63be8007937463fe3c88339f3c819d96ffdbe4eccf3ed2609f930e223d0fdfaff1292b9379b4924b647a88eba0f6647c5b71b95afdd10456ba8b65a9e13ee3304f901086913415ccc59fd9295813cbac5397600de25590f02e8abf1b2c3a7e3e446d4f23723e2dd30592b530448a6d59c563da9f8176182e2da0fc4a4a3595a9824a605ab321115a8daf762559b9e49dadababeadcf0101a933a41985cb9023e4b000f462dec9e81b094f0f46e37a660519cc7ef0b2b83a453a8694c7dbd6470acf6443de0f56c07f5e340695b684037250dcfc582c945728866b8ae7c5c743310d435b6abd73fef2ce0133a70ee16cb98b7f644778107e3c5244b4f2539e0fff6abc0dce9effdde85127a3e2c6028dbd554b391abe8a816113ec94f956751d6b4956fa8e23f7864021792693cd796c79f66234048040eaa1dc6bda43a90536966f0e131c13940c00d90f78f44937545d66a9126781d097a9b995b2e726850cc9483ecac838de4b140a0c2a3e489861cb6151ec4daafd9657933ab681171bff9ad5c6f789bbcd342eb8e8dff293f674ffb312cd5a94665725e4f4dc14f0c74b328164ed9f9f9e3efd3bfcaa5e1225d302da23986136f30738bb729d3dc8bae1feecfe83c68de5f60c2fba1593d010530c412c468459986a65740c181e155eeaaaae629ef2d205c4fe46e64bbec87b5d417cd0c5e5a6c93b97d92833197bf21aa5042dbb274821bde04ebeefe77826622a3d5e55fa1790b1790993915244fdc922c99c4abd35034cc7eb171297855427fa75fdb0a20a7932775d0ef5ce616cc90ed30ea873e8fe39b55f3c4dbf6f421c2c83d3999b7c235aa311ee98a1464a7d1c7b996b10b33dce22d75d2eea48e68822c7ef05af74dacbee29694673c9a11a7b69a529a4bfd40bee91c2dadfaa0078734503d0bc9bc306e272f9287983045b1eb32d05c4146bb81ecd1b96a9f191832c282a902e1bd4071f51330a2412e0590d13744949d1fa3e1945f9f1742eebd4393fdd6647eee9353e47d30d11f07a525d310204cc892b02613e1a46b2bb56b61f013d92db1f7d05714ee08fa375a3ac259698934fd7ddcc10dc4f86163c621ee9a4774ba53621d4bf4620e612a9f5362638ac02b15cd6d575e71d4493125cdd453ab66dc07d03e916bbb767a135e56d0a0c6964cb86d06a78d99829064ae0a01c698f6b98e50fb53c4ab5d06e395e2a09f7dabada4eb32cfd0de8f2e075fe86a6681543cc387317919e1b9e9d936633979c3b2ef64fb67411b107bb8c0fb6d2a589a0939094b9a2c9e6e09f18fd0345514326539e6faffddf85f800d9f91acee03f53c00c0ccd3f2a13c64196fe62dc781cffca257678dcaa580a8ebbf2564f35404f76dec037c2fe029dbe9cf6023a39be39e87bbda4fdf05fa6ef6658dcb23eed2c1878edf3699c1f05a9451230ccb2e6bde4b330df7c1c51f1080550be7da45fb8ebd65246af3072dab40d271b14a6b866a44b912a76fc9bd56f4b04089f037805f7335c7b5442f31f9ba44011dc80f15e785af73d47decdb75112dce36fdc668ff36f5529bf11d753af1b2137a822920f62a2c07455c37791a5738091db5d665716fe621c09756fc60c0bf9fdef0b161e1cf93005a2c373e00e178f16d390b17aace4885ef82a103807c750e9b7545f3b0aca05430ebfc461828393e59917651a2ab5df2ff98972169eb6d93e866633d911f72f27aa3057521c4bab3a73e4b2eac2f51f086b97f40fbb80a7396eeeabc39bc445662b0cb9a9f159f9ac2e3b6e1d9628b1175b71f44b73a5a386a0d4351f08203233ff9732a95fb85235dc43ed9a61979ddfd91a41151293525650a0b2d4048bdb741896bdbd76aef10101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025500ffffffff0290d00300000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875ac24f400000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000").expect("Block bytes are in valid hex representation"); + pub static ref BLOCK_MAINNET_6_BYTES: Vec = >::from_hex("040000000ab1fcee2ef969e2a09e2b3980b0b3ba5ec9157554482643d22acb9d31c60100e16f00205b1652836619615b0317d21a7eb3ac65c54ecae7fe2c54234406d21d0000000000000000000000000000000000000000000000000000000000000000d57a1358ffff071f7534e30203000000000000000000000000000000000000000000000000000002fd4005001e3081d6d8c3b791b69170c1aa8ed483f58e8d3b3c78ce75371fe30b392f7a787cf7fc3ed1f2789e0e06c8bf7d0bc88d18778e3098b211dbe95d8479dc9807f23de32aa128190a4ef49d41e85355fd1a9b5f4304dba9be234397a45de842575430f0fe20cc12539c05612e714cd948cff196d33fa5744642eca5390e2124630e401333cbc1fe8dc44543d80abee1da9e387e39241eaff9f8b153e07f07b695f203ba05969c24510048d04f3a4162c2b7e36100befb93d94fbd0f753911936e7f3c5d9fd0ee5bf3d98abb6355eb7d5cb5a710ef4f6536fa9167dd3cf4e201b6c36dc77c3f0b815bdcbed13a25fec54cbac88daece3596ce92390303038cf27bafe8869be19120460cc624b98edfae11670eea017566094d87b8d215308dcaef117cb4385e7d12681c0b9b944e0bf49066fbecefba9288977add581a48d6a66a669677566a3286717aa5dce67e52062e002e02e7ae8264331d596280a5ee62e16e8598243e335c620262ac9d4dab9b480ce17d31ead83efefe6e0b40c77054d9e1893939032b31e800fd5ae4324ef2290b097362250d69750d4a3d08dc0c3b08e17e31a407bd5f7e95581055e86b32cfd5aa6dc9194b7583d73101d72336dcb22980b4432cf3c2d46207edff47661a4c929f6ce67fe7fd314587fcb57db6ba4e383d5039a02602634f3d7bd8095be9e0ee4bdf20165fbb1e016ee6095556850bb442d25c5cb10d95aa97df1e700dbcee17f590e9a75fb022fe39f45d1a8944debc1412da37adeaf027fbe51cd7e06f47912682033c7e3d2af443e3df7378bbb6be23760fb3d8e9506bfe91f205826f6d830eddfdd5316522597944c258f23f4fb23cb7ad9e7996c4d5ff5f5a0c9d7e5602b1a2b7ef062618945221d2ec4bc94654c22f529171b9aa5bc33e32e986c91b56d93bd528e64badf8341611475606cc00cc4893190a0932c1b38388b0e07fb0efa4530ba30b6ff72e10e3fbcdde3082d0e2e3b5571158fa7d9b0571a05f33e8c04953d5282ddc514a6b07dffaaf403a681fd02b9b8657c4b2572129e941ee37a4f9e9a612ec04b659fb8cc9df59524ab2d99f10a11b8c445f2cdab31dee18c0250f99a33302a3454a3601d3b07618f762390c9a4c0ed56cb385504fe6ca09d953f0953cf334a5876101af6d2d23d3d3b4229ddb7192db4903b1a84ba59c9c8f168b5667f76d1193ac96bd9440146842dfb70a31b4b2c5741c5cad29b90940bf4bf2082b1d31da9299279c61a2059dd79ac621cdb849701547cb549d657125de6cf388b338d9813d76dee0b8053a32c9b29207abc98632b898af0e1edaa8b8b1b90f6ca97735293ceff499456d892e82ce849a77bc160e3907e4bbf2ccafedd6b44967cd03f1198852aa363648cba7d7641b2bd4ace888446e6d9aedcc3e8d0f03b5125f905bf367fe0e8073908668c25ff7b3686a1022fe6213125caec5c632752baa3464b4abb2c69305fa644014d433dda8b60185e863f7f86d5925f66c0e3aa5fc7b4546c28f93a282b72c8d719dcb1fa541048c6db2aea125c76f12231e7c5717cdd1d54eca301c3b1e4f15083458ff80d332d33924eb4fc8bf80c80a04c2fa0f906e076b125640f0efec15a1880ee8c50d8b13b9c81611e1c9cd92b5157bd85ce035799928054d0bdf3584bae4437ec18efdb3cd206aa16ca3a41acdbd1c74a90657ce9bb2b4a660c228d079683ef01482336e9556d453256ec25cac5288a0b56ba734802739c529235ced15aa8ff709bfd1c571ee5c96a4b40e46c5eb8894ddd6c64a01b304a516e505437e88484a9452891096dd1dcb3777712cc14ff29eec96965d0f4541e092db5a0d6a47d3602e7b9ce5c3f69e196024f49eb9fb297dcbe7e1d41d783a37c1b34112905c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025600ffffffff02e0930400000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875acf82401000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000").expect("Block bytes are in valid hex representation"); + pub static ref BLOCK_MAINNET_7_BYTES: Vec = >::from_hex("04000000e392c6c979e3346649badce0e5af8c3557b9ad5eec372e34bf16f6bc1a2700008d32b888cfb9c60eacb8c8c5ba6cc7b5e78ea74c9d51416b5e013f74b013b8260000000000000000000000000000000000000000000000000000000000000000d77a1358ffff071f7534e5cf43000000000000000000000000000000000000000000000000000004fd400500365c22e751f6fd21af42fd7e76f875b7493a7492053d29631aa21c0d8a9df10e88889b753276197d4d0c02e268e68ff4a3ce9ae40573cc74ea4bc154bb2d44126679359c2c09cf9246f2ae448b8ba9e9bf170f024e15fe8c47f4b7c66466e35743de62db783b998c1f9e2c9512957de0fdf3928268a2de4da258b8cd9a2d507b1a74ec32d3c547aa379b59e83b60ed5b7eaf2e2172a38e2328831a66357030c4661dc2dc54565f02e8772e901b5b6b0a01648fc4ed464a6a7654459610bfce0f22624683e37626510c533fe5981a7d75740fba28aa5d043e8c6a1501c29ab6866dfbdf3013ea16592ccb56087294d777d7402bc0e6add24ef4cb631c2df1a7e412c02f72bf22ba57d6f9f0b5c2f684572797d50fe2514ba9626b44bf60718e319b3ffb8f0f30b24ffb7466f051fc85767c06435af25078966a2d5a6d93ec306949bd6119369414f07ff289c85f7117008bf06f3793227e9ea9114888a4b9c88a1d55b96d19995fc1d3211d55a11ca4b425aa203fef689f9a8c1afd89116b4d5e2ffe948402e0b5b1e158b0eb777d3076c1a1907750ddd1a2d508a2d5f3d2358b57080711c802ebe69032a9bfd07ae0e95d3807558affaa4338260e50c0d74276e9e3352859dc4dc5baed15fbb83ae36db5ed10f3e34fd8a41dbaf740e97f7e2f0aa3414b33bb08615f31e0e03546d5bd628a726497a55d02c0620ed01275e52fe540689c1cf444f9457a8aa00f92972ddfb97115cfee41dec9394e7524790ba2f3079c3c4543061009ef42e28e45f95a6969ef3f54400d498b069ecf21cb87f6c400f0e17f19ac068f0e980ce28f911e21d321131d6326501e5089c3ea50c0951437c47bfc1849fbbf41d3ff5345acfad576796f630f1bfa45cca1a3cd7aad228cfd57e984f5759efa9e1d1642aee09819c73bc0fbd3ffe10e1f12a07da74402057ba30501b41ebaee421dc72de2c5bf3d57a7e0254ed6ace9f609dbb7155872b2e40a6a833c168d4318c932e76749318357979397ae54958250e59cbe2e3c1d75026292bda1b78ff52717d137456cf0adbdae1775f595110937c0613b961f2ddad34ecee23a2a73183389ae76d7c3ef3c5015e6643a73a9dc187ecfb7234a5322251061aaa4a6089c89e86e1b6f2fbdbd5c7f1077517e602a8d741eb84fe9dd092f8e25dfd0ea05846505730a24952f39140895bd8611d7d5fabe90688d96d8e7dab507756a3779da6326dad15a3ee72915df8c3599931f611d07757f297f5a95d5af3e2b6015ec7536eeea88017e301446df7837a5ac0db45f1f165d96ef388e52e943e8058987d79ef6473a555ada47b57694742b42b3be729a41a6f0c932c5ec96b68a23bb033ecf69d40f8f0fa6922ec2e19bb3d85da4ac38419b0534dbd9b91857d6127abc56cf6bc4fd75e7033500233ac128d3f04705ab12c307e30eb7bdb1ec374a1c0ed8132b1feda485965a497431eaf8794300156bee2f0d30dc41889e83b663eb11c1efe5f282a62bbde69da91e0417e76664ba67aa40c5b310bf841d07baa731bd772a33c8b090f8ef6bfa459be4dd82680f3aef9f262db5cf7a73e2ddf426380111cc4eb5a10be7d88f3608870b7b5e8871c45d93be2c77b749cd18f1f9621d308a0ffa91e46134db88de649fb94c0b06c654e36faa851dd117435649468eaebdd17d4cd71ab736aebc71438b9230874f455124027e43372df418404abe6a8b7ea47bf152f75f52ce7191fa5b4203184b2b9e805f681db17b519bbd26571ce8e8aa581a099c61e36d07ae197580862798d073b2e92b78a42a0b53d49f57cbffa09b6b71b3042dd95d740317bde70d6160a0f34a989e6a1bd1522337424543704b848e863e1f68287da92ff777fab265d8bee3a3d21ebc460101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025700ffffffff0230570500000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875accc5501000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000").expect("Block bytes are in valid hex representation"); + pub static ref BLOCK_MAINNET_8_BYTES: Vec = >::from_hex("04000000045ae2a7ae1a5ea25a3d531dde8a42f5bb20f67f49d930acacd98fae05b8040003de449d65aec6f3c2dadf9a53a5e3dff9d972a41ba6f034fcbbe6e86f2e777a0000000000000000000000000000000000000000000000000000000000000000147b1358ffff071fa5556cd0fb280000000000000000000000000000000000000000000000000000fd4005001235028584cb4d1b9f928d34441d86ee727fa0f90f79f4fa8c09d681c0a143283c302af3706adde77e143a694bf163b759f17574989f3b0277b11a7e780e16f8afe5aa632be73ad5fa5fd3fb3602e985fa3add0341fc63b08eb93f9c5e63467f752c49fc25cfea5d0916c6ff4e4c1d427ad634d77836ceaed2f4daeb8126f7775c0ff0495da4a0e414c8e57d49bf74529359554713c2a32a9e35e4097593d6360cf99f991cf17a03e04d7b90422edbfa6e9086d77408d1c592ff22551bee749f10d73fdf048e52c5d75dc926519a9ad8fc0ab48bab37abbd07d3e770b56eff92cd7158f0e3963cc072aa459c6535c9176832a745eddf4c20be8cfb050bb67009c7c17570ab45a227fb8005846dd2014405da319b55c28bdea270b4da58bc613af78a9ebfcb081b54ae9b9f28bdeef513fc9623a2e5b5fb345cdb278b0c3a971c2f5beb74038df6c951738ae29df8d300d3ec7c18501b74ae166505ec46bb9143dd1290cb014a68613103353b8d42d0f671b348b4835dfc88cd01dd60ed698e3445c8a6e1c698bf6691b7a9bb07a41942d1e280e3ac235718732f78c2675df4a5968d1605f2bd7ca54386c67328e7a645d9bd42a657f8d01c06d5bde9cf06bc68af3a91b1e7f3b1fa8a301bc84911ef6937beeb5dc98ed5e21d8a2345ed71965076534d42d6769ce0f1f754781b8f08732f274f679f880202373e9f4bf45afbb786c15031246991d64851f3b65c74451b67dd482dad69274ec07e4721eb005d805d08add53956c3fec6a958235429e874e1ec44735bdd0f50b4a8b0ca3debd5c7a1588866f9b15aabfe3b1a1817047acbccdaf779c142f626d0245625d558dcf54122f58086f1b30fa24ec5a3a5eea48de90f9a7644242955324420c3a9b8c68351c2a28769a07d72c930301bf77020d93eece767a322f45746f72512bf54d100cbbbdea701d03517f6c3264fdf93b1eb5cbb42fb155a66ee1c9133b6ba346bfa0bfbe0cb04f0f8e9c82810757766569176b516439990ed77bea4da1dc2cd43dc06efad2ff52d7fd724e0535ad16142c6b667b01b21c3b961c8c7c74d0b26a9b87defaacefe9d987d34a9f49aa9dea7b1a057aa8f38e4906ebf66ffcac8213fa25a7cc8686acd50d40e5ece1061fdd891265544e9c35776da026f22ff7add026c7d03aec0df83e9028a4f8e43039f4b59ff212b4fd9d4ed8456fa0fe709b9f6ba03c422722b4854a0383a70693b7e7d8960132fa4c78b3bd017ef399274bc48b7b0d85873bf8625fa24367ccaba215e5622d55caf13d982316d481d0627ba5e1929284fdd6b73f6693b608f10e0bb3c190c1a04728a52945ea92f131a3ca3d529718c1dc86513b862437b111585356e64e011df896541a29be4266b9c46bf7e612fb951602707423db862b4e81990d70115483b9504f8bfacb754e0966d914a1ec3b9c2b70bfb2d30de4b4ad5b4e711048ed1bd4d1d817201cf03c4ecb163051054abbf10e06ab84b3888d0ad03922fa5f6865e6070f783bdc54ae868ad32c61f36825b02d0c8f4a7915a43956a6050341fd1656518f9b21b3a2e9e4d8a32643bd581e8076c656a1a30f4dbe6eb0810b90d24c2fc88cb73c8ee45e9d95a521a394efb363c21d0b6f83821d10da81d1f761c9a5dc9de5ad0047a2fd883052a4873e183dd05d595eaaedb96c89e357be5920467da93c2f194d207bce93e7ec1d5c5130abd4513521a464ee1ebbd7c3e70debf75f15f8a9c1f914f377d16b121c25ab3eab07efe1124a915798212c46b51ff73f741e8ef756ca8cd7f816f21f7083f22acaba8fb195bcecf7f12af757a3e6e304c32dc453ae4ce6ed1d60b3517db141355e3303d55992e11d7598f5c3fe8a10f4979b686c1025771c5be1d37a6830101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025800ffffffff02801a0600000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875aca08601000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000").expect("Block bytes are in valid hex representation"); + pub static ref BLOCK_MAINNET_9_BYTES: Vec = >::from_hex("04000000012b0ebc452f335bee12d2dfd9558cd100aa29db6e55498c795c33beda770600dc7cc27c90a1b6e9a6142e3be2536f37fb117fca7db495d16ae4f31b62ab24ff00000000000000000000000000000000000000000000000000000000000000005f7b1358ffff071fa5556ccb4b000000000000000000000000000000000000000000000000000002fd4005006acfefed0dfac1235a490effda752ec897fecb01393c029e23a3269be448c7cfe24436267f25d9011502e69d803a81b2c75112e3882b63f5e9f4b99fa68630085c3163104ec2b822e42d4bf358c7878d3e236b02652b144a9a0b119e5635af07e3a8e65a153d8dd018feeea5bba9ac1defa552193bcbf7d602f1726a880ede7f9bb590ed7d0ce161c27bf314cd4e3f5edbd9171ccc15e0504dc78944753805c3423aa5e5f5b3ee079a165bfdc25edd87b4373ca2d6ae79f758bc7b7030f53e16b71d13caf43436d3703d524f464ebbe2c90f26da9b7586bed1c3244d2471eb24c3bd657f910c34779dfb1e4e09f7bcabb4c165c5b815ce636ff47617cf7c9787480d4f542a61bdb4ebb59dc60e55e73c285725e0b05bd0b3a851934cfd74f4615ed2ec0f5418235df4bf4ee9b2956035622ee80cc6019df057072d57d77df3262f159ae709598868b6e6fedb1f8502030f97cb2b9d5ef9d17ca24c2296b168d7897352d317662acf0015918757e9a99a3ae5891b982d7d9e23246886aaca9660498400e85eff7e4572262ad708ce3879c77e0e608833ea65b66a5a584386f2059f1b9f12678b870f2d40dbfc33d3ee70a41a0373cd9d99dc18573238bd48afbfa02b540ce04f8652b9771a24d63be7ad2bee3cba69f0d09baadbec1de71902d90ad6729dd62529e7f14fa89e5b1323eebec70867ff117e071d9645955e6c9dd47913409db30d6d6c03b69c610bdaef451a4bce3fecd80674dd671e6efbb47952ea2a53d457cc1857f73d7a941963ada0d5fe0e9a0b3a4450e5394de516034066d4b379375db2e8a83b62a8086641d5efd28245001cb8233c71242a93827faca73ab76c30dca58ba9bcc405cb92e51305f5d5bff6c30b1217777ee68fa97c7855dda2c6319ebc5e7f5ab562d27dc9cea9a9695bc9373a0feb855e44e138334e00be9a8da904eb31aef186fd39ee21c6e035378c4e06c8c4dd7993bd2fd76b716738b5984234e53a280304dd40d1bd17aeb4c72a92c1dab4b152f47d793f410b5bd9628c06092ddd46f1a973ef2b8080b1caa38a09d411542a0da4a92b66336c0972d260dba491ab7512009d6281f1c229b237c73db9ff1fbadabd986f2d0b471970ea4dfee8e506e0b7664562dc7a70a6b6571ffd85d1abe2ddf165a3525551ee818d683a306f3001c6dbb71991132d72f7d3d4b7b1d9b620455a75c80337be27fc06086453a4a0566d7ab17e302753e8390dcbfb0fe0ec884578ba13cec0678266c8d13678734d685d8403de5bef7f26e877c97e7d4e99f0bccec704347da2d8d12aa49b2723133fa40e2b97af7d4ff22c2ff709a45ba5e1c7d8a6491a52649dac6cbed2e70c7aca082ed7d9695498b22b99e9ca3cfe8daab5211a4cdd50e2508dc139253294433bf40689df56ab18019744a82099a6bd22f3203757b73266206b364b8d01e478bb81032ffdd361c6cfd375b28e1041d60f990b74dd3f9f4469f7dbfb849a59ff6f72cd00dcdea051521f5d1be05d75760e961530fb13163bda3ef9ad0826c7a0f89346173468d1570b0c4f34ad2c07dab617a2578a3bd2c0a76b1936b0963b1246223ef3359018e21cf2a0ece5517033e5a285bd29121c34d745b5239b99db4e2340b3c70d97b70bf6245252db9372b3026946861b143e3922b1969417dc67a5a7e1cdfc0a06f842b7c10c478b064be56aa3e76a098e853a15940f7b37438e08a6df32b0e456c1ce76b243599aa0302ce9e3b8b49156c1cacc641861d8a4830d48fad44e04827c32d048f834d189a0634583f314c265ed1037385a9f3f17b4c39dae1c43aff1c497a6de619f8def2527aeb47ccf9e42d407258a7477f40fd3dfffddc264f477e9a9f8fc53e1f687943c69a04699b4f8eed10101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025900ffffffff02d0dd0600000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875ac74b701000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000").expect("Block bytes are in valid hex representation"); + pub static ref BLOCK_MAINNET_10_BYTES: Vec = >::from_hex("040000000caa280b9f75c09ec407a2026a4f578a9e1d12b4b560e381474772741f2c06004825e397cf36e2dc4d32c09924231940e14da73bdaf0d37a72d8f18a7002275f0000000000000000000000000000000000000000000000000000000000000000617b1358ffff071fa5556b2500000000000000000000000000000000000000000000000000000000fd400500778fe70985278d941565e13644e59de26059395818bcfdbe4ea2fcadf573b30269e7b576acb4db93af134dc74ff4f013158b6084633ed7084e3e2f19f0a220e589af2457cf4ff103d41114516c25759a8c825d087f853e8686bfa926f724c8b4481fe550b2cdf94a259412c28cb4a099b5d8b513fefaf1ce66607447681994029c3911814b964592b58aa660452dc9dc62474633c514619ee4ed4561a5b273d695a9dc5ffbf3da0352afb9f85815af5998154b39e3a4d96ac5575fcb0fbf0895cc95f256e7f2628b43ebd49d7baa37e9da123bb0cebaca84cd13c5f15c17759af18d973d88e32f593a62a44fac293812a82ea8c885e6f8835f81e603aedbfba0c4198bd5f59aaa515650babda3db61140cc7c29b6d329975ee7a738ba8a3bdd5cea18ffb1235738fe520ada885a4bb648202422e8e56657f40d059d8dbf50bdd66e1adab87ceb8c252fb51db1b26be05ff099ba0978db3c18a20c33a0b8e44c45188a5d2541d047ee195343fe04f77c3b1f7da72c60b1f5dde0924ff3a7b227ac3686d97857ebe9fb627bd350eb410b82a2844667d2b70b0514601c1dd0085553cb232069f550567cc1a72c2c430ff1e94d5add89f74d62d1cbeb581bb1428f94cda53e3ede73cf5d1dbfa5a67179644604f8b3b7ca1b455c59e48c6ca8ba3d5b9921d867da7b2479cb925f9f3fce8f8135165b5df7c7706e4a852fad55d13ab1020de4190e09f023affc9a42fbbfef1e795f743914c44c7a7bf242bd0a21f032d1cab9dea6a97588cda66d405e44b5fe2d680ddfcc83c47dec15f2cf55395018826f0c57ef649455b01480912db9a94b35f51bea3f2007162c83ef43afc5fba0d0c6f9509ecb23d76cb228237dbc82abcf67ee83f11435bfbcae2419bb125a4eabbf9dce2b7af97b7101fe36a5d70503325c3d2921bb911a480877286c9a800c031733b461d75368f833fb6b9241602df969bf930344ba54623745dd451b54efb35f7a18dd19b7b6a282da76988148f735d2a77441541732def1c30d0ce2ed4d4c3479c4963997ff3bc5dad69a1b7274e113700ea354b01ab6751ddced371985cff394c6f1949221dd436d8b34ac2a465b165d0c1310283b39fff1b7e1acc1ce6269b350f961a3275b742dbcd62538f50f3403c5f34f16ee36fa051c4a75aeba2e7dd7dbf0f65074c246cb071d1859fb0d1b8c1f25bea36b3de32ac471c77457a52c105ef88a603e43264cf1c4739fb3a133e7259f9732cafda26a4eea6f5f916770f5b10fe1b59ceffe0d5e775ddfa8352b0fbfab2378bda73f70d547b9dcd0e8009932391140ff28b26d4e676d06c349c93b9fda424cf7924c3603479a1d659833bb54817db3cf6ade12c95bf3d3377367fa9b336dc5a327e539566fca1ebefe7f1dd362e13df7b3dbf618f602203c8176b45a84819d0ba8537b0ae5222d85e1ee76d2048668413f99dc9ddcb829690d0f1b146cc2be8db20293173f5e481a9434233d72d2b4b19bba25321013c58158abc11ea9d79a0157fa5556b2614031b6dc20ed3eb335408d9991952c3805aab3dfac7d61abf322a971b62738ae5967fc79446c2bec7fa3f0f1e150517efdc857fd2e6470daa9284a6a0bc5a705d16277f3bb74cb70b185c59d8cfd43d95a51d310f910bccf60c0048b6d398da33e56011c897a34d05a744157e8b11a501ec010cc9396da6521f6434e3ca9797dbe9e21eb493c05a8cd833741ce5726efb5eee294fbc4b6851e22b7cdc62b177458af9cef6e57a7e808a54c16e11aabc23b997476700e386a6cdbc8dbf310d1fc9cf48fcb24e9d9dd679927056e4d64e24eaa5121d5d242aea07d29ea9c571e813c4aa257837014ad09e0c1e343f6d6b1dcff114df64e45cf6d05bc54c6f9a4d430101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025a00ffffffff0220a10700000000002321027a46eb513588b01b37ea24303f4b628afd12cc20df789fede0921e43cad3e875ac48e801000000000017a9147d46a730d31f97b1930d3368a967c309bd4d136a8700000000").expect("Block bytes are in valid hex representation"); }