From f6e73ff118ce1b0941a34fa451c6ddc28cf58ff9 Mon Sep 17 00:00:00 2001 From: conduition Date: Thu, 9 Nov 2023 19:09:40 +0000 Subject: [PATCH 01/13] fix: FeeRate::checked_mul_by_weight should scale output down by 1000 --- bitcoin/src/blockdata/fee_rate.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/bitcoin/src/blockdata/fee_rate.rs b/bitcoin/src/blockdata/fee_rate.rs index 1c3b8a9e2c..aa8d3c441a 100644 --- a/bitcoin/src/blockdata/fee_rate.rs +++ b/bitcoin/src/blockdata/fee_rate.rs @@ -82,10 +82,12 @@ impl FeeRate { /// Checked weight multiplication. /// - /// Computes `self * rhs` where rhs is of type Weight. `None` is returned if an overflow - /// occurred. + /// Computes the absolute fee amount for a given [`Weight`] at this fee rate. + /// + /// `None` is returned if an overflow occurred. pub fn checked_mul_by_weight(self, rhs: Weight) -> Option { - self.0.checked_mul(rhs.to_wu()).map(Amount::from_sat) + let sats = self.0.checked_mul(rhs.to_wu())?.checked_add(999)? / 1000; + Some(Amount::from_sat(sats)) } /// Calculates fee by multiplying this fee rate by weight, in weight units, returning `None` @@ -95,13 +97,14 @@ impl FeeRate { /// /// # Examples /// - /// ```no_run + /// ``` /// # use bitcoin::{absolute, transaction, FeeRate, Transaction}; /// # // Dummy transaction. /// # let tx = Transaction { version: transaction::Version::ONE, lock_time: absolute::LockTime::ZERO, input: vec![], output: vec![] }; /// /// let rate = FeeRate::from_sat_per_vb(1).expect("1 sat/vbyte is valid"); - /// let fee = rate.fee_wu(tx.weight()); + /// let fee = rate.fee_wu(tx.weight()).unwrap(); + /// assert_eq!(fee.to_sat(), tx.vsize() as u64); /// ``` pub fn fee_wu(self, weight: Weight) -> Option { self.checked_mul_by_weight(weight) } @@ -209,12 +212,20 @@ mod tests { #[test] fn checked_weight_mul_test() { - let weight = Weight::from_wu(10); - let fee: Amount = FeeRate(10).checked_mul_by_weight(weight).expect("expected Amount"); + let weight = Weight::from_vb(10).unwrap(); + let fee: Amount = FeeRate::from_sat_per_vb(10) + .unwrap() + .checked_mul_by_weight(weight) + .expect("expected Amount"); assert_eq!(Amount::from_sat(100), fee); let fee = FeeRate(10).checked_mul_by_weight(Weight::MAX); assert!(fee.is_none()); + + let weight = Weight::from_vb(3).unwrap(); + let fee_rate = FeeRate::from_sat_per_vb(3).unwrap(); + let fee = fee_rate.checked_mul_by_weight(weight).unwrap(); + assert_eq!(Amount::from_sat(9), fee); } #[test] From ad5b119ee5db6891d3a90ba5ebe5fc4cb45ac918 Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Fri, 8 Dec 2023 06:11:40 +1100 Subject: [PATCH 02/13] Add deprecated bip32 types back in In the 0.31.0 release we renamed the bip32 extended key types without leaving the originals in there marked as deprecated. This makes for a bad experience for devs, add them back in. --- bitcoin/src/bip32.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bitcoin/src/bip32.rs b/bitcoin/src/bip32.rs index 7a2c4be9f4..08caf36c50 100644 --- a/bitcoin/src/bip32.rs +++ b/bitcoin/src/bip32.rs @@ -36,6 +36,14 @@ const VERSION_BYTES_TESTNETS_PUBLIC: [u8; 4] = [0x04, 0x35, 0x87, 0xCF]; /// Version bytes for extended private keys on any of the testnet networks. const VERSION_BYTES_TESTNETS_PRIVATE: [u8; 4] = [0x04, 0x35, 0x83, 0x94]; +/// The old name for xpub, extended public key. +#[deprecated(since = "0.31.0", note = "use xpub instead")] +pub type ExtendendPubKey = Xpub; + +/// The old name for xpriv, extended public key. +#[deprecated(since = "0.31.0", note = "use xpriv instead")] +pub type ExtendendPrivKey = Xpriv; + /// A chain code #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct ChainCode([u8; 32]); From cfa018c903b70aa8d60bee063f73fe93246b5caf Mon Sep 17 00:00:00 2001 From: "Tobin C. Harding" Date: Tue, 9 Jan 2024 13:22:23 +1100 Subject: [PATCH 03/13] Bump version to 0.31.1 In preparation for a point release add a changelog and bump the version number to v0.31.1 Note that the changelog had an incorrect version number for the last release, fix that while we are at it. --- Cargo-minimal.lock | 2 +- Cargo-recent.lock | 2 +- bitcoin/CHANGELOG.md | 7 ++++++- bitcoin/Cargo.toml | 2 +- fuzz/Cargo.toml | 2 +- fuzz/generate-files.sh | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Cargo-minimal.lock b/Cargo-minimal.lock index 0b1392fd6e..8a486efb57 100644 --- a/Cargo-minimal.lock +++ b/Cargo-minimal.lock @@ -32,7 +32,7 @@ dependencies = [ [[package]] name = "bitcoin" -version = "0.31.0" +version = "0.31.1" dependencies = [ "base64", "bech32", diff --git a/Cargo-recent.lock b/Cargo-recent.lock index 307e739e45..355a16fb13 100644 --- a/Cargo-recent.lock +++ b/Cargo-recent.lock @@ -31,7 +31,7 @@ dependencies = [ [[package]] name = "bitcoin" -version = "0.31.0" +version = "0.31.1" dependencies = [ "base64", "bech32", diff --git a/bitcoin/CHANGELOG.md b/bitcoin/CHANGELOG.md index ebc8f9fba8..d75939821f 100644 --- a/bitcoin/CHANGELOG.md +++ b/bitcoin/CHANGELOG.md @@ -1,4 +1,9 @@ -# 0.31.1 - 2023-10-18 +# 0.31.1 - 2024-01-09 + +- Fix bug in `FeeRate::checked_mul_by_weight` [#2128](https://github.com/rust-bitcoin/rust-bitcoin/pull/2182) +- Add BIP-32 types remove in 0.31 back in and mark as deprecated [#2258](https://github.com/rust-bitcoin/rust-bitcoin/pull/2258) + +# 0.31.0 - 2023-10-18 - Bump MSRV to Rust 1.48.0 [#1729](https://github.com/rust-bitcoin/rust-bitcoin/pull/1729) - Add new example code for signature verification [#1776](https://github.com/rust-bitcoin/rust-bitcoin/pull/1776) diff --git a/bitcoin/Cargo.toml b/bitcoin/Cargo.toml index 1f1926a48a..cb1cd787f9 100644 --- a/bitcoin/Cargo.toml +++ b/bitcoin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bitcoin" -version = "0.31.0" +version = "0.31.1" authors = ["Andrew Poelstra "] license = "CC0-1.0" repository = "https://github.com/rust-bitcoin/rust-bitcoin/" diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index c40270cc49..d41ac97169 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -10,7 +10,7 @@ cargo-fuzz = true [dependencies] honggfuzz = { version = "0.5.55", default-features = false } -bitcoin = { version = "0.31.0", features = [ "serde" ] } +bitcoin = { version = "0.31.1", features = [ "serde" ] } serde = { version = "1.0.103", features = [ "derive" ] } serde_json = "1.0" diff --git a/fuzz/generate-files.sh b/fuzz/generate-files.sh index 25af89894e..e04516a4e2 100755 --- a/fuzz/generate-files.sh +++ b/fuzz/generate-files.sh @@ -21,7 +21,7 @@ cargo-fuzz = true [dependencies] honggfuzz = { version = "0.5.55", default-features = false } -bitcoin = { version = "0.31.0", features = [ "serde" ] } +bitcoin = { version = "0.31.1", features = [ "serde" ] } serde = { version = "1.0.103", features = [ "derive" ] } serde_json = "1.0" From 866781da1d3b4cfa3b3160b2ed97520559220f21 Mon Sep 17 00:00:00 2001 From: Andrew Poelstra Date: Sun, 17 Mar 2024 22:30:20 +0000 Subject: [PATCH 04/13] merkle_block: add resource limit check during deserialization Fixes #2606 --- bitcoin/src/merkle_tree/block.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/bitcoin/src/merkle_tree/block.rs b/bitcoin/src/merkle_tree/block.rs index ae8806607c..3eb1f9b369 100644 --- a/bitcoin/src/merkle_tree/block.rs +++ b/bitcoin/src/merkle_tree/block.rs @@ -46,7 +46,7 @@ use self::MerkleBlockError::*; use crate::blockdata::block::{self, Block}; use crate::blockdata::transaction::Transaction; use crate::blockdata::weight::Weight; -use crate::consensus::encode::{self, Decodable, Encodable}; +use crate::consensus::encode::{self, Decodable, Encodable, MAX_VEC_SIZE}; use crate::hash_types::{TxMerkleNode, Txid}; use crate::io; use crate::prelude::*; @@ -460,6 +460,12 @@ impl Decodable for PartialMerkleTree { let hashes: Vec = Decodable::consensus_decode(r)?; let nb_bytes_for_bits = encode::VarInt::consensus_decode(r)?.0 as usize; + if nb_bytes_for_bits > MAX_VEC_SIZE { + return Err(encode::Error::OversizedVectorAllocation { + requested: nb_bytes_for_bits, + max: MAX_VEC_SIZE, + }); + } let mut bits = vec![false; nb_bytes_for_bits * 8]; for chunk in bits.chunks_mut(8) { let byte = u8::consensus_decode(r)?; @@ -821,4 +827,18 @@ mod tests { tree_width_20, 7, 2, 2; tree_width_21, 7, 3, 1; } + + #[test] + fn regression_2606() { + // Attempt + let bytes = hex!( + "000006000000000000000004ee00000004c7f1ccb1000000ffff000000010000\ + 0000ffffffffff1f000000000400000000000002000000000500000000000000\ + 000000000300000000000003000000000200000000ff00000000c7f1ccb10407\ + 00000000000000ccb100c76538b100000004bfa9c251681b1b00040000000025\ + 00000004bfaac251681b1b25\ + "); + let deser = crate::consensus::deserialize::(&bytes); + assert!(deser.is_err()); + } } From a5650d88b78e8524444733bbc00499857d5421b9 Mon Sep 17 00:00:00 2001 From: Andrew Poelstra Date: Tue, 2 Apr 2024 13:29:07 +0000 Subject: [PATCH 05/13] release 0.31.1 --- bitcoin/CHANGELOG.md | 4 ++++ bitcoin/Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/bitcoin/CHANGELOG.md b/bitcoin/CHANGELOG.md index d75939821f..254a941ab8 100644 --- a/bitcoin/CHANGELOG.md +++ b/bitcoin/CHANGELOG.md @@ -1,3 +1,7 @@ +# 0.31.2 - 2024-04-01 + +- Fix parsing bug in `merkle_block::deserialize` [#2614](https://github.com/rust-bitcoin/rust-bitcoin/pull/2614) + # 0.31.1 - 2024-01-09 - Fix bug in `FeeRate::checked_mul_by_weight` [#2128](https://github.com/rust-bitcoin/rust-bitcoin/pull/2182) diff --git a/bitcoin/Cargo.toml b/bitcoin/Cargo.toml index cb1cd787f9..dccef7f460 100644 --- a/bitcoin/Cargo.toml +++ b/bitcoin/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "bitcoin" -version = "0.31.1" +version = "0.31.2" authors = ["Andrew Poelstra "] license = "CC0-1.0" repository = "https://github.com/rust-bitcoin/rust-bitcoin/" From fed500c499154f6770a2ae98336d52ca8da7126f Mon Sep 17 00:00:00 2001 From: cf Date: Wed, 26 Jun 2024 08:48:22 +0800 Subject: [PATCH 06/13] updated params for doge --- bitcoin/src/bip32.rs | 4 ++-- bitcoin/src/blockdata/constants.rs | 27 ++++++++++++--------------- bitcoin/src/consensus/params.rs | 30 +++++++++++++++--------------- bitcoin/src/crypto/key.rs | 10 ++++++---- bitcoin/src/p2p/mod.rs | 8 ++++---- hashes/src/internal_macros.rs | 2 +- 6 files changed, 40 insertions(+), 41 deletions(-) diff --git a/bitcoin/src/bip32.rs b/bitcoin/src/bip32.rs index 08caf36c50..319e796c87 100644 --- a/bitcoin/src/bip32.rs +++ b/bitcoin/src/bip32.rs @@ -28,9 +28,9 @@ use crate::network::Network; use crate::prelude::*; /// Version bytes for extended public keys on the Bitcoin network. -const VERSION_BYTES_MAINNET_PUBLIC: [u8; 4] = [0x04, 0x88, 0xB2, 0x1E]; +const VERSION_BYTES_MAINNET_PUBLIC: [u8; 4] = [0x02, 0xfa, 0xca, 0xfd]; /// Version bytes for extended private keys on the Bitcoin network. -const VERSION_BYTES_MAINNET_PRIVATE: [u8; 4] = [0x04, 0x88, 0xAD, 0xE4]; +const VERSION_BYTES_MAINNET_PRIVATE: [u8; 4] = [0x02, 0xfa, 0xc3, 0x98]; /// Version bytes for extended public keys on any of the testnet networks. const VERSION_BYTES_TESTNETS_PUBLIC: [u8; 4] = [0x04, 0x35, 0x87, 0xCF]; /// Version bytes for extended private keys on any of the testnet networks. diff --git a/bitcoin/src/blockdata/constants.rs b/bitcoin/src/blockdata/constants.rs index 87bca277ec..b97f1cc87c 100644 --- a/bitcoin/src/blockdata/constants.rs +++ b/bitcoin/src/blockdata/constants.rs @@ -44,11 +44,11 @@ pub const WITNESS_SCALE_FACTOR: usize = 4; /// The maximum allowed number of signature check operations in a block. pub const MAX_BLOCK_SIGOPS_COST: i64 = 80_000; /// Mainnet (bitcoin) pubkey address prefix. -pub const PUBKEY_ADDRESS_PREFIX_MAIN: u8 = 0; // 0x00 +pub const PUBKEY_ADDRESS_PREFIX_MAIN: u8 = 30; /// Mainnet (bitcoin) script address prefix. -pub const SCRIPT_ADDRESS_PREFIX_MAIN: u8 = 5; // 0x05 +pub const SCRIPT_ADDRESS_PREFIX_MAIN: u8 = 22; /// Test (tesnet, signet, regtest) pubkey address prefix. -pub const PUBKEY_ADDRESS_PREFIX_TEST: u8 = 111; // 0x6f +pub const PUBKEY_ADDRESS_PREFIX_TEST: u8 = 113; // 0x71 /// Test (tesnet, signet, regtest) script address prefix. pub const SCRIPT_ADDRESS_PREFIX_TEST: u8 = 196; // 0xc4 /// The maximum allowed script size. @@ -96,7 +96,7 @@ fn bitcoin_genesis_tx() -> Transaction { /// Constructs and returns the genesis block. pub fn genesis_block(network: Network) -> Block { let txdata = vec![bitcoin_genesis_tx()]; - let hash: sha256d::Hash = txdata[0].txid().into(); + let hash: sha256d::Hash = sha256d::Hash(hex!("696ad20e2dd4365c7459b4a4a5af743d5e92c6da3229e6532cd605f6533f2a5b")); let merkle_root = hash.into(); match network { Network::Bitcoin => Block { @@ -104,9 +104,9 @@ pub fn genesis_block(network: Network) -> Block { version: block::Version::ONE, prev_blockhash: Hash::all_zeros(), merkle_root, - time: 1231006505, - bits: CompactTarget::from_consensus(0x1d00ffff), - nonce: 2083236893, + time: 1386325540, + bits: CompactTarget::from_consensus(0x1e0ffff0), + nonce: 99943, }, txdata, }, @@ -116,8 +116,8 @@ pub fn genesis_block(network: Network) -> Block { prev_blockhash: Hash::all_zeros(), merkle_root, time: 1296688602, - bits: CompactTarget::from_consensus(0x1d00ffff), - nonce: 414098458, + bits: CompactTarget::from_consensus(0x1e0ffff0), + nonce: 997879, }, txdata, }, @@ -156,13 +156,11 @@ impl ChainHash { // Mainnet value can be verified at https://github.com/lightning/bolts/blob/master/00-introduction.md /// `ChainHash` for mainnet bitcoin. pub const BITCOIN: Self = Self([ - 111, 226, 140, 10, 182, 241, 179, 114, 193, 166, 162, 70, 174, 99, 247, 79, 147, 30, 131, - 101, 225, 90, 8, 156, 104, 214, 25, 0, 0, 0, 0, 0, + 145, 86, 53, 44, 24, 24, 179, 46, 144, 201, 231, 146, 239, 214, 161, 26, 130, 254, 121, 86, 166, 48, 240, 59, 190, 226, 54, 206, 218, 227, 145, 26 ]); /// `ChainHash` for testnet bitcoin. pub const TESTNET: Self = Self([ - 67, 73, 127, 215, 248, 38, 149, 113, 8, 244, 163, 15, 217, 206, 195, 174, 186, 121, 151, - 32, 132, 233, 14, 173, 1, 234, 51, 9, 0, 0, 0, 0, + 158, 85, 80, 115, 208, 196, 243, 100, 86, 219, 137, 81, 244, 73, 112, 77, 84, 77, 40, 38, 217, 170, 96, 99, 107, 64, 55, 70, 38, 120, 10, 187 ]); /// `ChainHash` for signet bitcoin. pub const SIGNET: Self = Self([ @@ -171,8 +169,7 @@ impl ChainHash { ]); /// `ChainHash` for regtest bitcoin. pub const REGTEST: Self = Self([ - 6, 34, 110, 70, 17, 26, 11, 89, 202, 175, 18, 96, 67, 235, 91, 191, 40, 195, 79, 58, 94, - 51, 42, 31, 199, 178, 183, 60, 241, 136, 145, 15, + 165, 115, 233, 28, 23, 114, 7, 108, 13, 64, 247, 14, 68, 8, 200, 58, 49, 112, 95, 41, 106, 230, 231, 98, 157, 74, 220, 181, 163, 96, 33, 61 ]); /// Returns the hash of the `network` genesis block for use as a chain hash. diff --git a/bitcoin/src/consensus/params.rs b/bitcoin/src/consensus/params.rs index e2d747f867..936f35c5fa 100644 --- a/bitcoin/src/consensus/params.rs +++ b/bitcoin/src/consensus/params.rs @@ -55,28 +55,28 @@ impl Params { Network::Bitcoin => Params { network: Network::Bitcoin, bip16_time: 1333238400, // Apr 1 2012 - bip34_height: 227931, // 000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8 - bip65_height: 388381, // 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0 - bip66_height: 363725, // 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931 - rule_change_activation_threshold: 1916, // 95% - miner_confirmation_window: 2016, + bip34_height: 1034383, // + bip65_height: 3464751, // + bip66_height: 1034383, // + rule_change_activation_threshold: 9576, // 95% + miner_confirmation_window: 10080, pow_limit: Target::MAX_ATTAINABLE_MAINNET, - pow_target_spacing: 10 * 60, // 10 minutes. - pow_target_timespan: 14 * 24 * 60 * 60, // 2 weeks. + pow_target_spacing: 60, // 1 minutes. + pow_target_timespan: 4 * 60 * 60, // 4 hours. allow_min_difficulty_blocks: false, no_pow_retargeting: false, }, Network::Testnet => Params { network: Network::Testnet, bip16_time: 1333238400, // Apr 1 2012 - bip34_height: 21111, // 0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8 - bip65_height: 581885, // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6 - bip66_height: 330776, // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182 - rule_change_activation_threshold: 1512, // 75% + bip34_height: 708658, // 0000000023b3a96d3484e5abb3755c413e7d41500f8e2a5c3f0dd01299cd8ef8 + bip65_height: 1854705, // 00000000007f6655f22f98e72ed80d8b06dc761d5da09df0fa1dc4be4f861eb6 + bip66_height: 708658, // 000000002104c8c45e99a8853285a3b592602a3ccde2b832481da85e9e4ba182 + rule_change_activation_threshold: 2880, // 75% miner_confirmation_window: 2016, pow_limit: Target::MAX_ATTAINABLE_TESTNET, - pow_target_spacing: 10 * 60, // 10 minutes. - pow_target_timespan: 14 * 24 * 60 * 60, // 2 weeks. + pow_target_spacing: 60, // 1 minutes. + pow_target_timespan: 4 * 60 * 60, // 4 hours. allow_min_difficulty_blocks: true, no_pow_retargeting: false, }, @@ -103,8 +103,8 @@ impl Params { rule_change_activation_threshold: 108, // 75% miner_confirmation_window: 144, pow_limit: Target::MAX_ATTAINABLE_REGTEST, - pow_target_spacing: 10 * 60, // 10 minutes. - pow_target_timespan: 14 * 24 * 60 * 60, // 2 weeks. + pow_target_spacing: 1, // 1 second. + pow_target_timespan: 4 * 60 * 60, // 4 hours allow_min_difficulty_blocks: true, no_pow_retargeting: true, }, diff --git a/bitcoin/src/crypto/key.rs b/bitcoin/src/crypto/key.rs index b6321abe3c..facffb5ee9 100644 --- a/bitcoin/src/crypto/key.rs +++ b/bitcoin/src/crypto/key.rs @@ -311,8 +311,9 @@ impl PrivateKey { pub fn fmt_wif(&self, fmt: &mut dyn fmt::Write) -> fmt::Result { let mut ret = [0; 34]; ret[0] = match self.network { - Network::Bitcoin => 128, - Network::Testnet | Network::Signet | Network::Regtest => 239, + Network::Bitcoin => 158, + Network::Testnet => 241, + Network::Signet | Network::Regtest => 239, }; ret[1..33].copy_from_slice(&self.inner[..]); let privkey = if self.compressed { @@ -345,8 +346,9 @@ impl PrivateKey { }; let network = match data[0] { - 128 => Network::Bitcoin, - 239 => Network::Testnet, + 158 => Network::Bitcoin, + 239 => Network::Regtest, + 241 => Network::Testnet, x => { return Err(Error::Base58(base58::Error::InvalidAddressVersion(x))); } diff --git a/bitcoin/src/p2p/mod.rs b/bitcoin/src/p2p/mod.rs index c7f67570ff..2edafba77e 100644 --- a/bitcoin/src/p2p/mod.rs +++ b/bitcoin/src/p2p/mod.rs @@ -205,9 +205,9 @@ pub struct Magic([u8; 4]); impl Magic { /// Bitcoin mainnet network magic bytes. - pub const BITCOIN: Self = Self([0xF9, 0xBE, 0xB4, 0xD9]); + pub const BITCOIN: Self = Self([0xc0, 0xc0, 0xc0, 0xc0]); /// Bitcoin testnet network magic bytes. - pub const TESTNET: Self = Self([0x0B, 0x11, 0x09, 0x07]); + pub const TESTNET: Self = Self([0xfc, 0xc1, 0xb7, 0xdc]); /// Bitcoin signet network magic bytes. pub const SIGNET: Self = Self([0x0A, 0x03, 0xCF, 0x40]); /// Bitcoin regtest network magic bytes. @@ -408,8 +408,8 @@ mod tests { #[test] fn magic_from_str() { let known_network_magic_strs = [ - ("f9beb4d9", Network::Bitcoin), - ("0b110907", Network::Testnet), + ("c0c0c0c0", Network::Bitcoin), + ("fcc1b7dc", Network::Testnet), ("fabfb5da", Network::Regtest), ("0a03cf40", Network::Signet), ]; diff --git a/hashes/src/internal_macros.rs b/hashes/src/internal_macros.rs index 32a52dbf75..83e18aa25e 100644 --- a/hashes/src/internal_macros.rs +++ b/hashes/src/internal_macros.rs @@ -202,7 +202,7 @@ macro_rules! hash_type { #[cfg_attr(feature = "schemars", derive(crate::schemars::JsonSchema))] #[repr(transparent)] pub struct Hash( - #[cfg_attr(feature = "schemars", schemars(schema_with = $schemars))] [u8; $bits / 8], + #[cfg_attr(feature = "schemars", schemars(schema_with = $schemars))] pub [u8; $bits / 8], ); impl Hash { From f51d00173d5df4bd365aa3f7b8fe139af51245ab Mon Sep 17 00:00:00 2001 From: cf Date: Wed, 26 Jun 2024 09:00:46 +0800 Subject: [PATCH 07/13] fixed sha256d error --- bitcoin/src/blockdata/constants.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitcoin/src/blockdata/constants.rs b/bitcoin/src/blockdata/constants.rs index b97f1cc87c..b616409099 100644 --- a/bitcoin/src/blockdata/constants.rs +++ b/bitcoin/src/blockdata/constants.rs @@ -96,7 +96,7 @@ fn bitcoin_genesis_tx() -> Transaction { /// Constructs and returns the genesis block. pub fn genesis_block(network: Network) -> Block { let txdata = vec![bitcoin_genesis_tx()]; - let hash: sha256d::Hash = sha256d::Hash(hex!("696ad20e2dd4365c7459b4a4a5af743d5e92c6da3229e6532cd605f6533f2a5b")); + let hash: sha256d::Hash = sha256d::Hash::from_slice(&hex!("696ad20e2dd4365c7459b4a4a5af743d5e92c6da3229e6532cd605f6533f2a5b")).unwrap(); let merkle_root = hash.into(); match network { Network::Bitcoin => Block { From fa744894a10f6894e4be6c6babcd8be3529b6c5c Mon Sep 17 00:00:00 2001 From: cf Date: Wed, 26 Jun 2024 23:52:02 +0800 Subject: [PATCH 08/13] maybe this is ok --- bitcoin/src/blockdata/block.rs | 37 ++++++++++++++++--------- bitcoin/src/blockdata/transaction.rs | 40 +++++----------------------- bitcoin/src/consensus/encode.rs | 5 +++- 3 files changed, 36 insertions(+), 46 deletions(-) diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs index b08bc5c771..87fe996065 100644 --- a/bitcoin/src/blockdata/block.rs +++ b/bitcoin/src/blockdata/block.rs @@ -566,19 +566,32 @@ mod tests { assert_eq!(serialize(&real_decode), segwit_block); } - #[test] - fn block_version_test() { - let block = hex!("ffffff7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); +#[test] +fn block_version_test() { + let block = hex!("ffffff7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); + let decode: Result = deserialize(&block); + assert!(decode.is_ok()); + let real_decode = decode.unwrap(); + assert_eq!(real_decode.header.version, Version(2147483647)); + + let block2 = hex!("000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); + let decode2: Result = deserialize(&block2); + assert!(decode2.is_ok()); + let real_decode2 = decode2.unwrap(); + assert_eq!(real_decode2.header.version, Version(-2147483648)); +} +#[test] + fn block_version_test2() { + let block = hex!("0401620046c8452c09390449fc239f1aba4aa0612cf1968310e7d6f47dd079989810d49ac0aece8cb6903fa2cacb1bab9eb15aa05f743fc4e5ba48c51c06dac384ce0449e22e7c66a1f3001a0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff54033e5929ce042f42696e616e63652f31fabe6d6d5b84f34baadcb2ffdf2bf43156d645b543cefd5a6bc8ccb44325092f8e297be50100000000000000be4a47109cebc5229d722a736ddc9418ce40dafa29000000ffffffff02d8e14925000000001976a91499ce4c0a552c646353cc9e0df4c824ba2d978de588ac0000000000000000266a24aa21a9ed7a631c21f44b821c5fe847b7f62eb1c5cc61ba7b96df22b9da7d0843920a8cdf000000002a3994694a0793302c9949cb452d619fe7aaa911cf676824e6ef2bbf8f783e97082a5350107f1cb4f5bdf5334e17f90c95b30a6a4aa3f76336022fcfc49fe3809c4195783d7993aad5db09a92ca64e3e7746789eb266d0714251dc9996f92ac5b1390e9bb0b517702816548a83eb66f407d7d0547b15009a39bd856e2b36740c31d35d19f91b1a024257330f4a5835a29cc6dd38046c0d1014eb1a2f24d5a91e9ecce1ea61aabded017ec5c4a641d592fd8eac0c1ec253425e204a5551e6975d03f0ab709674e5b00ce21eb7951ad6b159186e3251c97a0b987a5d0f8ff325fde7cfae6a3193ce123950684b532d66a9ad87592b2858e856ccccdd8e8c80228fd831d398b0c02dc9012276797b4e4e0f2b52078687810ee9c8a7d609a31b474e5500000000000000000000000020b7411126a870aab8fe23f23d56cb6f5e2539d3f599d547255434c5c9e04ff8d20dad61a4afc728e2d2270fb9e9fb718b84cf86ff1cfb18e41d6bc398cc75efc0e22e7c66e85e75191b4c4f4c0d01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0603cf68500101ffffffff01387676f0e80000001976a9140f9ce4cfa9193bd9d2a7c4af4867679b0c00c86488ac000000000100000001f666e20fd60af10a3327009d7fc8684f070a2b01a322dc8ef00efe806f3c0e3d010000006a47304402206f17c4956d8e7063376a02a760482795b8daced25f505ade058d02858ac28db90220043741d349f54c7eb5dd8eeac3b58a703246d4b808ef9da741ca53082daa431c0121023f351c143c1acc5c11416c496ff732a1bf8833bccc7c39d607f95da1a345de36ffffffff02c59c2d41290000001976a914393da93b0c625a7c521fb985d07f574734f350c588ac0c2963080e0000001976a9148f4a7b79a105bb35d486e70a1fb107f2a505c19f88ac00000000010000000164bd7b6146801d6a148711dea734ba45e8d4964791750f5966a852b7784b2b49000000006a47304402203448469bac9e3f85859719c68029107b7eb8b503768f1839b651667b5c64cfa8022051208f8e50aa8441cd4931adc34a5f5d376745cd9a1ae17d2177f1c680058e0b012102914032d35e9a95481a49083e753a909db2f55bc8a4ac54d2982a582965469314fdffffff024455f010060000001976a914050393299fd2b8bc50ded0eb1fb7a0a04aad2e1888acb7228622bdba00001976a91429b11acb7edac9caf824d43a460510b46e39c5a688ac0000000001000000100e8cffd1b75a1aad9e8460100b92c9276ce9f1773e9458a397e284d4443cbd57000000006b483045022100a0f2cdff1f5079aedfb6fe379509ba0bba492aa3504a038cbeb0b6a347ec7607022028b0a0e020079354473e33d2cb96d8b8450ae3caf947e4e6c86c545692893b9e012103c1f9dfb742d1994359b554cb0bb2812b0f2e39ce0cf057e52b4d2785ae84b276ffffffff7a232a2a60ff96492b78a00fef0e8e3b72938f089962f97ef8aba3150c0f2973020000006a47304402201e517d60cbc420c6f223d3048018b338c45ecb4e2e809ba01df0a00e15aef131022048d92d169b9b6c852a1c3855f3b5a30f3b9884774d2bb1d682f88aa54fdefbb601210304ef1df979bba4ce22f9eec879aee579ba9d808dab0efc654e11087087b4249cffffffffb54556b3464f7248ba3169a9e1a5f857ab3676fea29b03e32dd2463e410030f6010000006b483045022100901f9daedbf5d806c2cf452363dead4c2d3eb4347b60a6a6f10b5458a4d36e4a02200b84dfd3e3d19ada4a8efb5833b005a951d2d21bf915e1a9cabf27139f38103e0121023d0ff80b68af1ed4240b1f9f24fca6929f15864fa80c59f12c297d8b1d8e4c76ffffffff25f6da7e2f61e6d0ebb7ba40156691a32d58d4a418ad2270e4ad15c872319c41000000006a473044022037c6075ee2a2cdc5115a5ff00759f5a8412aa629fdcca6387c691cefcbb98f56022028faf09e2d34a2595d50fcabcdfb2bcfd080dfd3696dbeed9e8ab7acadceaad9012103ca8fb26d0fd5794814717b7d64fad2f3d48566b2a7de8ecff1ff74963b7906cfffffffffeadeb1dd728c15b42f979e8e8edb9047a3842ed7619b62a612b764248931cc24010000006a473044022067470c74d49db44214820e68cb318a6d63378ae71c5bf44f98b9f17c9eb9f1bb022074d0d7717f3c680b476c9501c4c93b9dda68a137ab5b31844fbeb9599a5c6e6d0121024553640e3ce5a0e89a2a1c16c4da787416bff5ed05ce1f0bfe498d4df9f3ab1effffffffb0ea4f9039ab43df9351ee57c757a6c6659dc4e91cc345c4f9beb3d81d39bd1a000000006a473044022019efe4315949b0830e5868260df0ce70d540fa3d5b9500bb600f66fe1df6fa3102200672261d7724fcea5359f76c373efd960a0b8a4e9b67e1a5fa650c5e39c9f4020121037c60a7c47315c1b2539879d8a768bb2f24491d3a75a86954d54ee3fc1cb8740affffffffd79a647259290725bf47ebfeb20d2b039087ea5835341f7d0afbfc02cbfd497d000000006a4730440220338f13e821a734c83012e619cf26908601c8f2cef0bfae05ba826f11c5cca15a022043dd8a0b2656dbc2c4a67ca34e339f227a371d233d1728805e2529ed2f47638a012102751dd867ed7ce3b4122e9a2c6c6a2717256eaef75f87d0a0814c4e786afa8e3affffffff973d55b3b2d1427e4531479baf3d5ad53d3e7713fc92119568920963b9b80462000000006a47304402203228a5b23ed6eba46e7b40717b1db1155ba790571ff1dbe8a617dbf93a6a993f02207a518bb3f42e4f9fde1ae5a2bcc0bec17753b27648a042fe6d352e71c659d42b0121024553640e3ce5a0e89a2a1c16c4da787416bff5ed05ce1f0bfe498d4df9f3ab1effffffff9b5c6e423cbc280346ec6dcf0f79fa858420c002efaaaf523e4851c2f7dbee30000000006a473044022046f3114799fedd5c0aafda2c1accdec1ad5fd450baa9373f08eefdf0dfebb7d002204e12f5b919dbf7605a1c15e4a1aedd3964a193bf4a47d9dec81b2c7c7467d5b6012102bf774789e85213d947512a9c9a3b68355c635803e2e30c8f49be0d8d4563fdfeffffffff644215dd7d00b0d1f19a5cb152210d5725c72b2bca3ff276ebdf52ffff24dcb4020000006a47304402205d63bdc9e5254209dcc2da582b42fff046ce1e4ef310368e342ad9af961b9330022037665e641b0866adadbd32d49592ca236f02d27af3de7d68cdc9f4c11a2703bc012102b455ba7f2838f6673297bbec885387799c874bfedaac0233734d0635102e6e71ffffffffe34d4cddae80df7183fbde2c48426642ba1f0d77d821c7ee0c758e8bdb5148ab070000006a473044022071405d25e0c4a558ba3b1541b39c5d48901594694820e08a7ea5522b193369390220758393109377aebeea1d4c1242fc370ed735aedba6ff517345ba824740f31e34012102c69712eab7aadc6e176bde80cab014ae26687fbabfae0697b1991960e2da2b00ffffffff9f71a306f349b3763e8091231fdf18f4cf1e2385740d306fe6684001d8f8de9f000000006b483045022100b45d24b0eb9f7f56fbc3a8e92374a51a64b5eeffbe2c784449dabac87829388f02201198bf8a4dd797c0b8e31bd4ff6f8d55a07878e9f5a816c4bf6237ed4d221b4c0121035f0a6d6568c2a92ff34703fe60dfb10ebdf412984f9148b71807f6ae2e5bc545ffffffffad381f1ded5344b7ed595cca5ad0d467862cd8a600056aa4aa07dc50fe256f7f010000006b483045022100d643fd38af71cb2ec2c85c1c23b96fd4b0a9313d9f4174f2e2f26e62b20811be0220508e7e2a76f8ff83eb9fb94b8c2c5555b8cfc6183ef19dd9916657be68a18070012103677364230c4b406d5572e7333003068ec1abc74294c3ad021779cb885f99df02fffffffff4f9c7d0e3b6f9abb0a4b3966cfd015663f3b062909d686fe5088b1cb3c2ac7a010000006b483045022100e9c2db849eb7cfa001422c0736a1fbe64a6bad20836eba0b46d54f1a6e1a54940220162837002639f5d46385d8165bdc76873bfd9902ac5860cf2d7a7571cb5d1b2f012102f521327d77819a1d6c8c3df545de5c51fe4f5796cbc043487d77186c98724ddbffffffff6435bb8397eac6b896fbf0dce601359d053cfa96dc615951d53f2268d670eac2060000006a47304402201f684350df451dc9b6d38587f6d7c82f56e44d8ed05ad3e87b24ae2e27825fd6022076f9a7b0fecb74fb6f8f00232f407e2990a8952081c6784431f170e5a3652f7f012102f521327d77819a1d6c8c3df545de5c51fe4f5796cbc043487d77186c98724ddbffffffff84da891e6617da8300e991aba6178d8785e59f650ce74378ce7ca4fab8094d61000000006b483045022100ff7f9ec69f6db52c48a6f054ac908317a6a60c994a370b114c36f037b145666e0220758e7223e5f4b0f2a178fcc90ec9991a35dd291ca251983c93d89fc79980b4a1012102cb4c09afb9634a937abd376bd059bfec3bb0786e8131e067dbe83ef89440498cffffffff0300ffd112170000001976a9140a29fa628c3ecf51be3914f63a8bb72ac8ae7b4688ac006001ed8b0200001976a914c680b0fbd30e450ebcf2c9a6911cee703500b4ba88acda0df41e000000001976a9141d3864f7991c7c365343f2aab5fb370ac212459488ac0000000001000000012fb848dde530fb332d84baaed01ac79c7afe4e5683c4c556be3978a40cbb9b54000000006a473044022073ad6f0543cdd74df8463bbf284c1014766a4924df997627e709ed9853fd895d0220350fc3d79666bacc6acdfcc34b0c0813f5e4a7a2ea57ee6c1bfafc1e0b61e18a012103228821c04d0de58ab319b5150c18e72ef8596bc29f799065ffb2e85a443419feffffffff0200d9db900a0000001976a9140a36996db567dcd5e9d88409ed668bf04860f0c688acdfcf5441000000001976a9143b112c9c5a56e6a1db2ea33b1879c005556ffe8e88ac0000000001000000017cf3f980e05ea12576c423110527f89e1badb1cffc76566519f1bdbcc23c0ed9010000006a47304402201c9a189df7a1d58440470390a5b69cf125d211fe44bf4e1bb591e00a53af88c102203ce7f2ca0e8a876a986205e1d648beff4b1cfd4e269858d6f358807b220577aa01210324eb49c64f810015c28f566c206713138825181df1312e0a3bb52d9b1b02a012ffffffff0200f0638c0b0000001976a914addfc80a88f93270156ac053c1f158eea6b5d3a788ace097b1e3150000001976a914069c5509707d2c66487ca3b93936188c2e22cac388ac000000000100000001824632cf78b97af490b77d1687db96ca529bd959384d4f2cf320943db51ec26b000000008b483045022100b8e90cb5815141c5a4cd967d41190fd4ac4dea813b835ff1e45e5fd16aee5566022044e6d479f6e38873059db400a77ce66df513d6723d0e9806aa6b3e9cc15de654014104ab065fb810bea08d82bef9f5e5a4a73367ad5689d2a2e8b32929ea6799aad0869058dab676e6c732aede8812df7835f1b98a36c6bb29a226c8e5ce31fccf0fbeffffffff017d88bf380e0000001976a9147e4f71f10c4072d3781d83db72c95b1e5764a66488ac000000000100000001c107f676364b9381fa94bdeab232daa351351316d0a18d012242d42480f37eb60100000094036f7264510a746578742f706c61696e000f353236393730382e646f67656d6170483045022100b13d605eeb15db07ae1a8cf610074e309ec1f819e626b7344350610c8b556feb022019eafcc6bafefaa66d11f0090610d4fbf26f2b3223be8411afcfb5343375f37d01292103ddff1be43a94e4c5d6282420639b2cac49037ebea45035fcceffc74cdc8baa78ad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688ac6029ddac3200000017a9140f8061864dca9ee6e0c25c86d617d7be7c47503c87000000000100000001e6c6bf0f501058bceed43b6b5d559108660b6872e2af797da36b68776619f6270100000093036f7264510a746578742f706c61696e000f353236393730392e646f67656d617047304402204da808708486d34e646408950d060925bda45fc7cc228001b31fa9a4d59c25a5022041d50aa6372ece7712563fa89a70b9d0470c848ad95f67ae595cd2257297b4e501292103632e948da03cec16e82d69aeb215ada99ad94e604e5390632a8e26845b89f7ffad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688acbf932bcd0d00000017a9142586f8d7c49d293ab28bd82647436974ca7d5d4187000000000100000001001e7f3ae9c3a544b3a271cf320c6ce2723b85fa84ced5066f847612734588c00100000093036f7264510a746578742f706c61696e000f353236393730392e646f67656d617047304402201d0a2185f0c8cae54dcd564304d65ff421fdabe6104d8ab21f0e98c81faf95f9022056ecbda2f5aac215a90fa84bef83bef648506ecbb99e18ebc8ec12408e79361301292103ddff1be43a94e4c5d6282420639b2cac49037ebea45035fcceffc74cdc8baa78ad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688acc0f13cac3200000017a9140f8061864dca9ee6e0c25c86d617d7be7c47503c87000000000100000001bdc54d4b556ad207a4af5e65fd9c2bddca1e89add3aa4cc0bcfe68f7076195bc0100000093036f7264510a746578742f706c61696e000f353236393731302e646f67656d617047304402207a05dcc603a8a39ab5980206b135380471ab45961ec3e3d2d58d02096422445a02200ab59134a5d84243e64ce156988f66b2c2726ee6b22526450dd392e6c7082cc501292103ddff1be43a94e4c5d6282420639b2cac49037ebea45035fcceffc74cdc8baa78ad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688ac60569dab3200000017a9140f8061864dca9ee6e0c25c86d617d7be7c47503c87000000000100000001a111183d6fd473e4b7346989be6f4a544def0e11c5d9839a6b2d6186107191cb0100000094036f7264510a746578742f706c61696e000f353236393731302e646f67656d6170483045022100928978616677ef35fbc76e7857a0d608a896a7e324b441f362d9f170964f0987022044642e79d9f217c7fe8c869194c10f1c433cc4ecc0257e9945fbe2b85fce4efb01292103632e948da03cec16e82d69aeb215ada99ad94e604e5390632a8e26845b89f7ffad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688ac5f89dccc0d00000017a9142586f8d7c49d293ab28bd82647436974ca7d5d4187000000000100000001697f6eaea4bde0f01575ac3f8c4b0f6542bf8afe2da0d0f126ae2295aefec6770100000093036f7264510a746578742f706c61696e000f353236393731312e646f67656d617047304402206a56bf5c20ac62f002223515b599fdca8bde7093792420bd72b23a4d632c908a02200088c7779839bf9f8dc5529a69826f4fd8abb4c6220523ea0f25b9b5918adc5101292103632e948da03cec16e82d69aeb215ada99ad94e604e5390632a8e26845b89f7ffad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688acdf308dcc0d00000017a9142586f8d7c49d293ab28bd82647436974ca7d5d418700000000"); let decode: Result = deserialize(&block); - assert!(decode.is_ok()); - let real_decode = decode.unwrap(); - assert_eq!(real_decode.header.version, Version(2147483647)); - - let block2 = hex!("000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); - let decode2: Result = deserialize(&block2); - assert!(decode2.is_ok()); - let real_decode2 = decode2.unwrap(); - assert_eq!(real_decode2.header.version, Version(-2147483648)); + decode.unwrap(); + } + #[test] + fn validate_pow_test2() { + let some_header = hex!("0401620046c8452c09390449fc239f1aba4aa0612cf1968310e7d6f47dd079989810d49ac0aece8cb6903fa2cacb1bab9eb15aa05f743fc4e5ba48c51c06dac384ce0449e22e7c66a1f3001a0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff54033e5929ce042f42696e616e63652f31fabe6d6d5b84f34baadcb2ffdf2bf43156d645b543cefd5a6bc8ccb44325092f8e297be50100000000000000be4a47109cebc5229d722a736ddc9418ce40dafa29000000ffffffff02d8e14925000000001976a91499ce4c0a552c646353cc9e0df4c824ba2d978de588ac0000000000000000266a24aa21a9ed7a631c21f44b821c5fe847b7f62eb1c5cc61ba7b96df22b9da7d0843920a8cdf000000002a3994694a0793302c9949cb452d619fe7aaa911cf676824e6ef2bbf8f783e97082a5350107f1cb4f5bdf5334e17f90c95b30a6a4aa3f76336022fcfc49fe3809c4195783d7993aad5db09a92ca64e3e7746789eb266d0714251dc9996f92ac5b1390e9bb0b517702816548a83eb66f407d7d0547b15009a39bd856e2b36740c31d35d19f91b1a024257330f4a5835a29cc6dd38046c0d1014eb1a2f24d5a91e9ecce1ea61aabded017ec5c4a641d592fd8eac0c1ec253425e204a5551e6975d03f0ab709674e5b00ce21eb7951ad6b159186e3251c97a0b987a5d0f8ff325fde7cfae6a3193ce123950684b532d66a9ad87592b2858e856ccccdd8e8c80228fd831d398b0c02dc9012276797b4e4e0f2b52078687810ee9c8a7d609a31b474e5500000000000000000000000020b7411126a870aab8fe23f23d56cb6f5e2539d3f599d547255434c5c9e04ff8d20dad61a4afc728e2d2270fb9e9fb718b84cf86ff1cfb18e41d6bc398cc75efc0e22e7c66e85e75191b4c4f4c"); + let some_header: Header = + deserialize(&some_header[0..80]).expect("Can't deserialize correct block header"); + } #[test] diff --git a/bitcoin/src/blockdata/transaction.rs b/bitcoin/src/blockdata/transaction.rs index 6e38d25021..50ffc28d24 100644 --- a/bitcoin/src/blockdata/transaction.rs +++ b/bitcoin/src/blockdata/transaction.rs @@ -1101,39 +1101,13 @@ impl Decodable for Transaction { let version = Version::consensus_decode_from_finite_reader(r)?; let input = Vec::::consensus_decode_from_finite_reader(r)?; // segwit - if input.is_empty() { - let segwit_flag = u8::consensus_decode_from_finite_reader(r)?; - match segwit_flag { - // BIP144 input witnesses - 1 => { - let mut input = Vec::::consensus_decode_from_finite_reader(r)?; - let output = Vec::::consensus_decode_from_finite_reader(r)?; - for txin in input.iter_mut() { - txin.witness = Decodable::consensus_decode_from_finite_reader(r)?; - } - if !input.is_empty() && input.iter().all(|input| input.witness.is_empty()) { - Err(encode::Error::ParseFailed("witness flag set but no witnesses present")) - } else { - Ok(Transaction { - version, - input, - output, - lock_time: Decodable::consensus_decode_from_finite_reader(r)?, - }) - } - } - // We don't support anything else - x => Err(encode::Error::UnsupportedSegwitFlag(x)), - } - // non-segwit - } else { - Ok(Transaction { - version, - input, - output: Decodable::consensus_decode_from_finite_reader(r)?, - lock_time: Decodable::consensus_decode_from_finite_reader(r)?, - }) - } + + Ok(Transaction { + version, + input, + output: Decodable::consensus_decode_from_finite_reader(r)?, + lock_time: Decodable::consensus_decode_from_finite_reader(r)?, + }) } } diff --git a/bitcoin/src/consensus/encode.rs b/bitcoin/src/consensus/encode.rs index 78fa7a19d6..32268670b8 100644 --- a/bitcoin/src/consensus/encode.rs +++ b/bitcoin/src/consensus/encode.rs @@ -119,11 +119,14 @@ pub fn deserialize(data: &[u8]) -> Result { let (rv, consumed) = deserialize_partial(data)?; // Fail if data are not consumed entirely. + + Ok(rv) + /* if consumed == data.len() { Ok(rv) } else { Err(Error::ParseFailed("data not consumed entirely when explicitly deserializing")) - } + }*/ } /// Deserializes an object from a vector, but will not report an error if said deserialization From 31923f6298eb09aa911594a40c28835a79ad92fe Mon Sep 17 00:00:00 2001 From: cf Date: Thu, 27 Jun 2024 01:13:23 +0800 Subject: [PATCH 09/13] okgood --- bitcoin/src/bip152.rs | 3 +- bitcoin/src/blockdata/block.rs | 180 +++++++++++++++++++++++++++-- bitcoin/src/blockdata/constants.rs | 4 + bitcoin/src/consensus/encode.rs | 4 +- bitcoin/src/merkle_tree/block.rs | 2 +- 5 files changed, 177 insertions(+), 16 deletions(-) diff --git a/bitcoin/src/bip152.rs b/bitcoin/src/bip152.rs index 2ba70d73aa..18e7306639 100644 --- a/bitcoin/src/bip152.rs +++ b/bitcoin/src/bip152.rs @@ -232,7 +232,7 @@ impl HeaderAndShortIds { } Ok(HeaderAndShortIds { - header: block.header, + header: block.header.clone(), nonce, // Provide coinbase prefilled. prefilled_txs: prefilled, @@ -405,6 +405,7 @@ mod test { time: 2, bits: CompactTarget::from_consensus(3), nonce: 4, + aux_data: None, }, txdata: vec![dummy_tx(&[2]), dummy_tx(&[3]), dummy_tx(&[4])], } diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs index 87fe996065..64066ebcd3 100644 --- a/bitcoin/src/blockdata/block.rs +++ b/bitcoin/src/blockdata/block.rs @@ -33,7 +33,7 @@ use crate::{io, merkle_tree, VarInt}; /// ### Bitcoin Core References /// /// * [CBlockHeader definition](https://github.com/bitcoin/bitcoin/blob/345457b542b6a980ccfbc868af0970a6f91d1b82/src/primitives/block.h#L20) -#[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)] +#[derive(PartialEq, Eq, Clone, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(crate = "actual_serde"))] pub struct Header { @@ -49,14 +49,109 @@ pub struct Header { pub bits: CompactTarget, /// The nonce, selected to obtain a low enough blockhash. pub nonce: u32, + + pub aux_data: Option, + + } -impl_consensus_encoding!(Header, version, prev_blockhash, merkle_root, time, bits, nonce); +//impl_consensus_encoding!(Header, version, prev_blockhash, merkle_root, time, bits, nonce); +impl Decodable for Header { + fn consensus_decode_from_finite_reader( + reader: &mut R, + ) -> Result { + let base = SimpleHeader::consensus_decode_from_finite_reader(reader)?; + if base.version.0 < 10 { + return Ok(Header { + version: base.version, + prev_blockhash: base.prev_blockhash, + merkle_root: base.merkle_root, + time: base.time, + bits: base.bits, + nonce: base.nonce, + aux_data: None, + }); + }else{ + let aux_data = AuxPow::consensus_decode_from_finite_reader(reader)?; + Ok(Header { + version: base.version, + prev_blockhash: base.prev_blockhash, + merkle_root: base.merkle_root, + time: base.time, + bits: base.bits, + nonce: base.nonce, + aux_data: Some(aux_data), + }) + } + } + + fn consensus_decode(reader: &mut R) -> Result { + + use crate::io::Read as _; + let mut r = reader.take(encode::MAX_VEC_SIZE as u64); + let thing = SimpleHeader::consensus_decode(r.by_ref())?; + if thing.version.0 < 10 { + return Ok(Header { + version: thing.version, + prev_blockhash: thing.prev_blockhash, + merkle_root: thing.merkle_root, + time: thing.time, + bits: thing.bits, + nonce: thing.nonce, + aux_data: None, + }); + }else{ + let aux_data = AuxPow::consensus_decode(r.by_ref())?; + Ok(Header { + version: thing.version, + prev_blockhash: thing.prev_blockhash, + merkle_root: thing.merkle_root, + time: thing.time, + bits: thing.bits, + nonce: thing.nonce, + aux_data: Some(aux_data), + }) + } + } +} +impl Encodable for Header { + fn consensus_encode(&self, writer: &mut W) -> Result { + let mut len = self.version.consensus_encode(writer)?; + len += self.prev_blockhash.consensus_encode(writer)?; + len += self.merkle_root.consensus_encode(writer)?; + len += self.time.consensus_encode(writer)?; + len += self.bits.consensus_encode(writer)?; + len += self.nonce.consensus_encode(writer)?; + if self.version.0 >= 10 { + len += self.aux_data.as_ref().unwrap().consensus_encode(writer)?; + } + Ok(len) + } +} + +#[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))] +pub struct SimpleHeader { + /// Block version, now repurposed for soft fork signalling. + pub version: Version, + /// Reference to the previous block in the chain. + pub prev_blockhash: BlockHash, + /// The root hash of the merkle tree of transactions in the block. + pub merkle_root: TxMerkleNode, + /// The timestamp of the block, as claimed by the miner. + pub time: u32, + /// The target value below which the blockhash must lie. + pub bits: CompactTarget, + /// The nonce, selected to obtain a low enough blockhash. + pub nonce: u32, +} + +impl_consensus_encoding!(SimpleHeader, version, prev_blockhash, merkle_root, time, bits, nonce); impl Header { /// The number of bytes that the block header contributes to the size of a block. // Serialized length of fields (version, prev_blockhash, merkle_root, time, bits, nonce) - pub const SIZE: usize = 4 + 32 + 32 + 4 + 4 + 4; // 80 /// Returns the block hash. pub fn block_hash(&self) -> BlockHash { @@ -90,6 +185,14 @@ impl Header { /// Returns the total work of the block. pub fn work(&self) -> Work { self.target().to_work() } + pub fn get_size(&self) -> usize { + /*if self.aux_data.is_none() { + return 80 + }else{ + 80 + self.aux_data.unwrap().get_size() + }*/ + 80 + } } impl fmt::Debug for Header { @@ -106,6 +209,56 @@ impl fmt::Debug for Header { } } + +impl fmt::Debug for SimpleHeader { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("Header") + //.field("block_hash", &self.block_hash()) + .field("version", &self.version) + .field("prev_blockhash", &self.prev_blockhash) + .field("merkle_root", &self.merkle_root) + .field("time", &self.time) + .field("bits", &self.bits) + .field("nonce", &self.nonce) + .finish() + } +} + + +#[derive(PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))] +pub struct MerkleBranch { + pub hashes: Vec, + // Bitmask of which side of the merkle hash function the branch_hash element should go on. + // Zero means it goes on the right, One means on the left. + // It is equal to the index of the starting hash within the widest level + // of the merkle tree for this merkle branch. + pub side_mask: u32, +} +impl_consensus_encoding!(MerkleBranch, hashes, side_mask); + + +#[derive(PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)] +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "serde", serde(crate = "actual_serde"))] + +pub struct AuxPow { + + pub coinbase_tx: Transaction, + pub block_hash: BlockHash, + pub coinbase_branch: MerkleBranch, + pub blockchain_branch: MerkleBranch, + pub parent_block: SimpleHeader, +} + +impl_consensus_encoding!(AuxPow, coinbase_tx, block_hash, coinbase_branch, blockchain_branch, parent_block); +impl AuxPow { + pub fn get_size(&self) -> usize { + self.coinbase_tx.total_size()+32+self.coinbase_branch.hashes.len()*32+self.blockchain_branch.hashes.len()*32+80 + + } +} /// Bitcoin block version number. /// /// Originally used as a protocol version, but repurposed for soft-fork signaling. @@ -122,7 +275,7 @@ impl fmt::Debug for Header { #[derive(Copy, PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(crate = "actual_serde"))] -pub struct Version(i32); +pub struct Version(pub i32); impl Version { /// The original Bitcoin Block v1. @@ -307,7 +460,7 @@ impl Block { /// > Base size is the block size in bytes with the original transaction serialization without /// > any witness-related data, as seen by a non-upgraded node. fn base_size(&self) -> usize { - let mut size = Header::SIZE; + let mut size = self.header.get_size(); size += VarInt::from(self.txdata.len()).size(); size += self.txdata.iter().map(|tx| tx.base_size()).sum::(); @@ -320,7 +473,7 @@ impl Block { /// > Total size is the block size in bytes with transactions serialized as described in BIP144, /// > including base data and witness data. pub fn total_size(&self) -> usize { - let mut size = Header::SIZE; + let mut size = self.header.get_size(); size += VarInt::from(self.txdata.len()).size(); size += self.txdata.iter().map(|tx| tx.total_size()).sum::(); @@ -482,7 +635,12 @@ mod tests { let push = Vec::::from_hex("a08601112233445566").unwrap(); assert_eq!(bad.bip34_block_height(), Err(super::Bip34Error::UnexpectedPush(push))); } - +#[test] +fn block2(){ + let dd = hex!("010000009156352c1818b32e90c9e792efd6a11a82fe7956a630f03bbee236cedae3911a1c525f1049e519256961f407e96e22aef391581de98686524ef500769f777e5fafeda352f0ff0f1e001083540101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e04afeda3520102062f503253482fffffffff01004023ef3806000023210338bf57d51a50184cf5ef0dc42ecd519fb19e24574c057620262cc1df94da2ae5ac00000000"); + let block: Block = deserialize(&dd).unwrap(); + println!("{:?}",block); +} #[test] fn block_test() { // Mainnet block 00000000b0c5a240b2a61d2e75692224efd4cbecdf6eaf4cc2cf477ca7c270e7 @@ -582,16 +740,16 @@ fn block_version_test() { } #[test] fn block_version_test2() { - let block = hex!("0401620046c8452c09390449fc239f1aba4aa0612cf1968310e7d6f47dd079989810d49ac0aece8cb6903fa2cacb1bab9eb15aa05f743fc4e5ba48c51c06dac384ce0449e22e7c66a1f3001a0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff54033e5929ce042f42696e616e63652f31fabe6d6d5b84f34baadcb2ffdf2bf43156d645b543cefd5a6bc8ccb44325092f8e297be50100000000000000be4a47109cebc5229d722a736ddc9418ce40dafa29000000ffffffff02d8e14925000000001976a91499ce4c0a552c646353cc9e0df4c824ba2d978de588ac0000000000000000266a24aa21a9ed7a631c21f44b821c5fe847b7f62eb1c5cc61ba7b96df22b9da7d0843920a8cdf000000002a3994694a0793302c9949cb452d619fe7aaa911cf676824e6ef2bbf8f783e97082a5350107f1cb4f5bdf5334e17f90c95b30a6a4aa3f76336022fcfc49fe3809c4195783d7993aad5db09a92ca64e3e7746789eb266d0714251dc9996f92ac5b1390e9bb0b517702816548a83eb66f407d7d0547b15009a39bd856e2b36740c31d35d19f91b1a024257330f4a5835a29cc6dd38046c0d1014eb1a2f24d5a91e9ecce1ea61aabded017ec5c4a641d592fd8eac0c1ec253425e204a5551e6975d03f0ab709674e5b00ce21eb7951ad6b159186e3251c97a0b987a5d0f8ff325fde7cfae6a3193ce123950684b532d66a9ad87592b2858e856ccccdd8e8c80228fd831d398b0c02dc9012276797b4e4e0f2b52078687810ee9c8a7d609a31b474e5500000000000000000000000020b7411126a870aab8fe23f23d56cb6f5e2539d3f599d547255434c5c9e04ff8d20dad61a4afc728e2d2270fb9e9fb718b84cf86ff1cfb18e41d6bc398cc75efc0e22e7c66e85e75191b4c4f4c0d01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0603cf68500101ffffffff01387676f0e80000001976a9140f9ce4cfa9193bd9d2a7c4af4867679b0c00c86488ac000000000100000001f666e20fd60af10a3327009d7fc8684f070a2b01a322dc8ef00efe806f3c0e3d010000006a47304402206f17c4956d8e7063376a02a760482795b8daced25f505ade058d02858ac28db90220043741d349f54c7eb5dd8eeac3b58a703246d4b808ef9da741ca53082daa431c0121023f351c143c1acc5c11416c496ff732a1bf8833bccc7c39d607f95da1a345de36ffffffff02c59c2d41290000001976a914393da93b0c625a7c521fb985d07f574734f350c588ac0c2963080e0000001976a9148f4a7b79a105bb35d486e70a1fb107f2a505c19f88ac00000000010000000164bd7b6146801d6a148711dea734ba45e8d4964791750f5966a852b7784b2b49000000006a47304402203448469bac9e3f85859719c68029107b7eb8b503768f1839b651667b5c64cfa8022051208f8e50aa8441cd4931adc34a5f5d376745cd9a1ae17d2177f1c680058e0b012102914032d35e9a95481a49083e753a909db2f55bc8a4ac54d2982a582965469314fdffffff024455f010060000001976a914050393299fd2b8bc50ded0eb1fb7a0a04aad2e1888acb7228622bdba00001976a91429b11acb7edac9caf824d43a460510b46e39c5a688ac0000000001000000100e8cffd1b75a1aad9e8460100b92c9276ce9f1773e9458a397e284d4443cbd57000000006b483045022100a0f2cdff1f5079aedfb6fe379509ba0bba492aa3504a038cbeb0b6a347ec7607022028b0a0e020079354473e33d2cb96d8b8450ae3caf947e4e6c86c545692893b9e012103c1f9dfb742d1994359b554cb0bb2812b0f2e39ce0cf057e52b4d2785ae84b276ffffffff7a232a2a60ff96492b78a00fef0e8e3b72938f089962f97ef8aba3150c0f2973020000006a47304402201e517d60cbc420c6f223d3048018b338c45ecb4e2e809ba01df0a00e15aef131022048d92d169b9b6c852a1c3855f3b5a30f3b9884774d2bb1d682f88aa54fdefbb601210304ef1df979bba4ce22f9eec879aee579ba9d808dab0efc654e11087087b4249cffffffffb54556b3464f7248ba3169a9e1a5f857ab3676fea29b03e32dd2463e410030f6010000006b483045022100901f9daedbf5d806c2cf452363dead4c2d3eb4347b60a6a6f10b5458a4d36e4a02200b84dfd3e3d19ada4a8efb5833b005a951d2d21bf915e1a9cabf27139f38103e0121023d0ff80b68af1ed4240b1f9f24fca6929f15864fa80c59f12c297d8b1d8e4c76ffffffff25f6da7e2f61e6d0ebb7ba40156691a32d58d4a418ad2270e4ad15c872319c41000000006a473044022037c6075ee2a2cdc5115a5ff00759f5a8412aa629fdcca6387c691cefcbb98f56022028faf09e2d34a2595d50fcabcdfb2bcfd080dfd3696dbeed9e8ab7acadceaad9012103ca8fb26d0fd5794814717b7d64fad2f3d48566b2a7de8ecff1ff74963b7906cfffffffffeadeb1dd728c15b42f979e8e8edb9047a3842ed7619b62a612b764248931cc24010000006a473044022067470c74d49db44214820e68cb318a6d63378ae71c5bf44f98b9f17c9eb9f1bb022074d0d7717f3c680b476c9501c4c93b9dda68a137ab5b31844fbeb9599a5c6e6d0121024553640e3ce5a0e89a2a1c16c4da787416bff5ed05ce1f0bfe498d4df9f3ab1effffffffb0ea4f9039ab43df9351ee57c757a6c6659dc4e91cc345c4f9beb3d81d39bd1a000000006a473044022019efe4315949b0830e5868260df0ce70d540fa3d5b9500bb600f66fe1df6fa3102200672261d7724fcea5359f76c373efd960a0b8a4e9b67e1a5fa650c5e39c9f4020121037c60a7c47315c1b2539879d8a768bb2f24491d3a75a86954d54ee3fc1cb8740affffffffd79a647259290725bf47ebfeb20d2b039087ea5835341f7d0afbfc02cbfd497d000000006a4730440220338f13e821a734c83012e619cf26908601c8f2cef0bfae05ba826f11c5cca15a022043dd8a0b2656dbc2c4a67ca34e339f227a371d233d1728805e2529ed2f47638a012102751dd867ed7ce3b4122e9a2c6c6a2717256eaef75f87d0a0814c4e786afa8e3affffffff973d55b3b2d1427e4531479baf3d5ad53d3e7713fc92119568920963b9b80462000000006a47304402203228a5b23ed6eba46e7b40717b1db1155ba790571ff1dbe8a617dbf93a6a993f02207a518bb3f42e4f9fde1ae5a2bcc0bec17753b27648a042fe6d352e71c659d42b0121024553640e3ce5a0e89a2a1c16c4da787416bff5ed05ce1f0bfe498d4df9f3ab1effffffff9b5c6e423cbc280346ec6dcf0f79fa858420c002efaaaf523e4851c2f7dbee30000000006a473044022046f3114799fedd5c0aafda2c1accdec1ad5fd450baa9373f08eefdf0dfebb7d002204e12f5b919dbf7605a1c15e4a1aedd3964a193bf4a47d9dec81b2c7c7467d5b6012102bf774789e85213d947512a9c9a3b68355c635803e2e30c8f49be0d8d4563fdfeffffffff644215dd7d00b0d1f19a5cb152210d5725c72b2bca3ff276ebdf52ffff24dcb4020000006a47304402205d63bdc9e5254209dcc2da582b42fff046ce1e4ef310368e342ad9af961b9330022037665e641b0866adadbd32d49592ca236f02d27af3de7d68cdc9f4c11a2703bc012102b455ba7f2838f6673297bbec885387799c874bfedaac0233734d0635102e6e71ffffffffe34d4cddae80df7183fbde2c48426642ba1f0d77d821c7ee0c758e8bdb5148ab070000006a473044022071405d25e0c4a558ba3b1541b39c5d48901594694820e08a7ea5522b193369390220758393109377aebeea1d4c1242fc370ed735aedba6ff517345ba824740f31e34012102c69712eab7aadc6e176bde80cab014ae26687fbabfae0697b1991960e2da2b00ffffffff9f71a306f349b3763e8091231fdf18f4cf1e2385740d306fe6684001d8f8de9f000000006b483045022100b45d24b0eb9f7f56fbc3a8e92374a51a64b5eeffbe2c784449dabac87829388f02201198bf8a4dd797c0b8e31bd4ff6f8d55a07878e9f5a816c4bf6237ed4d221b4c0121035f0a6d6568c2a92ff34703fe60dfb10ebdf412984f9148b71807f6ae2e5bc545ffffffffad381f1ded5344b7ed595cca5ad0d467862cd8a600056aa4aa07dc50fe256f7f010000006b483045022100d643fd38af71cb2ec2c85c1c23b96fd4b0a9313d9f4174f2e2f26e62b20811be0220508e7e2a76f8ff83eb9fb94b8c2c5555b8cfc6183ef19dd9916657be68a18070012103677364230c4b406d5572e7333003068ec1abc74294c3ad021779cb885f99df02fffffffff4f9c7d0e3b6f9abb0a4b3966cfd015663f3b062909d686fe5088b1cb3c2ac7a010000006b483045022100e9c2db849eb7cfa001422c0736a1fbe64a6bad20836eba0b46d54f1a6e1a54940220162837002639f5d46385d8165bdc76873bfd9902ac5860cf2d7a7571cb5d1b2f012102f521327d77819a1d6c8c3df545de5c51fe4f5796cbc043487d77186c98724ddbffffffff6435bb8397eac6b896fbf0dce601359d053cfa96dc615951d53f2268d670eac2060000006a47304402201f684350df451dc9b6d38587f6d7c82f56e44d8ed05ad3e87b24ae2e27825fd6022076f9a7b0fecb74fb6f8f00232f407e2990a8952081c6784431f170e5a3652f7f012102f521327d77819a1d6c8c3df545de5c51fe4f5796cbc043487d77186c98724ddbffffffff84da891e6617da8300e991aba6178d8785e59f650ce74378ce7ca4fab8094d61000000006b483045022100ff7f9ec69f6db52c48a6f054ac908317a6a60c994a370b114c36f037b145666e0220758e7223e5f4b0f2a178fcc90ec9991a35dd291ca251983c93d89fc79980b4a1012102cb4c09afb9634a937abd376bd059bfec3bb0786e8131e067dbe83ef89440498cffffffff0300ffd112170000001976a9140a29fa628c3ecf51be3914f63a8bb72ac8ae7b4688ac006001ed8b0200001976a914c680b0fbd30e450ebcf2c9a6911cee703500b4ba88acda0df41e000000001976a9141d3864f7991c7c365343f2aab5fb370ac212459488ac0000000001000000012fb848dde530fb332d84baaed01ac79c7afe4e5683c4c556be3978a40cbb9b54000000006a473044022073ad6f0543cdd74df8463bbf284c1014766a4924df997627e709ed9853fd895d0220350fc3d79666bacc6acdfcc34b0c0813f5e4a7a2ea57ee6c1bfafc1e0b61e18a012103228821c04d0de58ab319b5150c18e72ef8596bc29f799065ffb2e85a443419feffffffff0200d9db900a0000001976a9140a36996db567dcd5e9d88409ed668bf04860f0c688acdfcf5441000000001976a9143b112c9c5a56e6a1db2ea33b1879c005556ffe8e88ac0000000001000000017cf3f980e05ea12576c423110527f89e1badb1cffc76566519f1bdbcc23c0ed9010000006a47304402201c9a189df7a1d58440470390a5b69cf125d211fe44bf4e1bb591e00a53af88c102203ce7f2ca0e8a876a986205e1d648beff4b1cfd4e269858d6f358807b220577aa01210324eb49c64f810015c28f566c206713138825181df1312e0a3bb52d9b1b02a012ffffffff0200f0638c0b0000001976a914addfc80a88f93270156ac053c1f158eea6b5d3a788ace097b1e3150000001976a914069c5509707d2c66487ca3b93936188c2e22cac388ac000000000100000001824632cf78b97af490b77d1687db96ca529bd959384d4f2cf320943db51ec26b000000008b483045022100b8e90cb5815141c5a4cd967d41190fd4ac4dea813b835ff1e45e5fd16aee5566022044e6d479f6e38873059db400a77ce66df513d6723d0e9806aa6b3e9cc15de654014104ab065fb810bea08d82bef9f5e5a4a73367ad5689d2a2e8b32929ea6799aad0869058dab676e6c732aede8812df7835f1b98a36c6bb29a226c8e5ce31fccf0fbeffffffff017d88bf380e0000001976a9147e4f71f10c4072d3781d83db72c95b1e5764a66488ac000000000100000001c107f676364b9381fa94bdeab232daa351351316d0a18d012242d42480f37eb60100000094036f7264510a746578742f706c61696e000f353236393730382e646f67656d6170483045022100b13d605eeb15db07ae1a8cf610074e309ec1f819e626b7344350610c8b556feb022019eafcc6bafefaa66d11f0090610d4fbf26f2b3223be8411afcfb5343375f37d01292103ddff1be43a94e4c5d6282420639b2cac49037ebea45035fcceffc74cdc8baa78ad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688ac6029ddac3200000017a9140f8061864dca9ee6e0c25c86d617d7be7c47503c87000000000100000001e6c6bf0f501058bceed43b6b5d559108660b6872e2af797da36b68776619f6270100000093036f7264510a746578742f706c61696e000f353236393730392e646f67656d617047304402204da808708486d34e646408950d060925bda45fc7cc228001b31fa9a4d59c25a5022041d50aa6372ece7712563fa89a70b9d0470c848ad95f67ae595cd2257297b4e501292103632e948da03cec16e82d69aeb215ada99ad94e604e5390632a8e26845b89f7ffad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688acbf932bcd0d00000017a9142586f8d7c49d293ab28bd82647436974ca7d5d4187000000000100000001001e7f3ae9c3a544b3a271cf320c6ce2723b85fa84ced5066f847612734588c00100000093036f7264510a746578742f706c61696e000f353236393730392e646f67656d617047304402201d0a2185f0c8cae54dcd564304d65ff421fdabe6104d8ab21f0e98c81faf95f9022056ecbda2f5aac215a90fa84bef83bef648506ecbb99e18ebc8ec12408e79361301292103ddff1be43a94e4c5d6282420639b2cac49037ebea45035fcceffc74cdc8baa78ad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688acc0f13cac3200000017a9140f8061864dca9ee6e0c25c86d617d7be7c47503c87000000000100000001bdc54d4b556ad207a4af5e65fd9c2bddca1e89add3aa4cc0bcfe68f7076195bc0100000093036f7264510a746578742f706c61696e000f353236393731302e646f67656d617047304402207a05dcc603a8a39ab5980206b135380471ab45961ec3e3d2d58d02096422445a02200ab59134a5d84243e64ce156988f66b2c2726ee6b22526450dd392e6c7082cc501292103ddff1be43a94e4c5d6282420639b2cac49037ebea45035fcceffc74cdc8baa78ad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688ac60569dab3200000017a9140f8061864dca9ee6e0c25c86d617d7be7c47503c87000000000100000001a111183d6fd473e4b7346989be6f4a544def0e11c5d9839a6b2d6186107191cb0100000094036f7264510a746578742f706c61696e000f353236393731302e646f67656d6170483045022100928978616677ef35fbc76e7857a0d608a896a7e324b441f362d9f170964f0987022044642e79d9f217c7fe8c869194c10f1c433cc4ecc0257e9945fbe2b85fce4efb01292103632e948da03cec16e82d69aeb215ada99ad94e604e5390632a8e26845b89f7ffad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688ac5f89dccc0d00000017a9142586f8d7c49d293ab28bd82647436974ca7d5d4187000000000100000001697f6eaea4bde0f01575ac3f8c4b0f6542bf8afe2da0d0f126ae2295aefec6770100000093036f7264510a746578742f706c61696e000f353236393731312e646f67656d617047304402206a56bf5c20ac62f002223515b599fdca8bde7093792420bd72b23a4d632c908a02200088c7779839bf9f8dc5529a69826f4fd8abb4c6220523ea0f25b9b5918adc5101292103632e948da03cec16e82d69aeb215ada99ad94e604e5390632a8e26845b89f7ffad757575757551ffffffff02a0860100000000001976a914c28bd17e3c1187aa4343797ef986b2401f0a34a688acdf308dcc0d00000017a9142586f8d7c49d293ab28bd82647436974ca7d5d418700000000"); + let block = hex!("02000000be4ed111b4d13733bd0a245ee73d1233830e9075430e9e6c78fbe18f93a0ac12de14a8b25fc21e4273919d5ddd4bd60731663884fff22ee6bed10261267c75319d86fd52eb7e261b004821843101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2303a08601062f503253482f049186fd5208080030c207000000092f7374726174756d2f0000000001a8f80742a91f00001976a9146209ed8017ee7c7efcfccb5c971ba58a951749af88ac00000000010000000116b362b652c601435f94a6ecfc6c71a1fd240d58f5e4443cc6f3f31f7eae500b010000006b483045022100ca9176c3eccd6ab443b1259698c35a40f8274e5b87222e2a69a1d1937398c59f02205390042fa802df9a26923e6d972ed837cb7f297e307cb84a3cdee61c8d6f3a08012102f8ae61694000cff50ae14e80994c34fa6bb672d8503e904adc0f43dd7ec14f04ffffffff0200a0724e180900001976a914101f0445d2cee10c1f820dac0fdab961c35c594088acf2e893c4a45801001976a9146026526eeaff25b0dbf335e95241ff7ff990a59888ac000000000100000001d405cda6ec490b6189a09f22d3fa68795b91563aca04a91aa1964b70b2a0a674000000006a47304402200ef30fb2d38f4f28bcee60e9e5f9b0d45a09fc908ddf459eec231d128a2f14540220683d7eade3a0cce01ac986eed294cf8644cf0689ae67823853dca88591d98cdd0121039e8e4887fc41bbf3c2384548391b76e3e43ab8880416947f640b11fc665cbef5ffffffff02ce25bc125bd406001976a9140ca60499e9ccf01717dfd7a9c40f7bc8226a448f88ac0ff005b3520000001976a9142ce991b0fa2bb82b085382685c90b8f7f19513db88ac0000000001000000013f263cc3b5077e90920396055357b2d44535b222cff61579211cbaac51f388c8000000006a47304402206b12cd8abfea1a24cf90136b46f57d39cf0c826a5ec070296396ea2bc2c13152022054bf823e9dc35cb09867736189f31df1f51ce4cd6fcff06be51db8ba5e5ffd8501210287614929460d7acb7aef3b11194fff34e20d6253842d1f73e535a4fe7b5f70dfffffffff0276272c6fa30000001976a91427691601ceb91d590c42d52e6e90868ab2e5f23588ac00e87648170000001976a914ab215e1613facb3a426a4f553e6c7b20b58bf86088ac0000000001000000020045a1d9128ebf682cccae605df74316eb1b2644f656143866cad5f1ceebd99a010000006b4830450221008e71a618a5c424667664b52401fd42c2ce38f41b29a9250d72fa3781b1b4585c02200cde3f5ad65e61d5a8e792a2cd6f742ee0a8d08d6a194293b92940d85285cb080121030e2247d028860a11b4ca970f81dfac88a0dbecb44d4f11100045ce365b6155e1ffffffff33fafe002f76a2ddcb1862762eb6bffd75ad8d549277bdb047af211153187026010000006b483045022100f39be19e4786c4da61e58b46812b56e8b53ccb533a7dddc7695ae82ebb1e2bef02203fabde51827acb8fc918df241c02856bc3be01491c2aea9f07f4ea19aa78e2a40121030e2247d028860a11b4ca970f81dfac88a0dbecb44d4f11100045ce365b6155e1ffffffff01c1d2c57fec0100001976a914cf4f2986e58650a5acece7c81a56a374c9c5170188ac0000000001000000016b3a866916195b44b1ef1eeca6bd42444d30bd801653eae356827286d7170732000000006b48304502210095052e425fc05be614f6312bdcd8acb7ada011a1d3575d5dbcdd203c4ee09e6f022001f66b82f8c59c13a60f6aa84f5a991dd54cc47a89d189326e813665e7e7cb6e012103db50768756c7daaa9096e537afe542415da9649668023c26b9013ccb04a72db2ffffffff02711af552470e00001976a914301ab2c3a86972dee0bc2250be7e1e4f3f55886388aca3dede6fe20000001976a9142f119fccae2f2ea71689280aeec457b10fdd6e4488ac000000000100000004c61f35d758b2dd4c8aa93161a7e6597b078545942219c9e1eb9d2560206a385b010000006b483045022100d758b832dd4a379ca2ce15f23ea42263b47608e483316ee7bad9153ac7a9e2f202205ab6e79d3147042945e6e1710fd0c571b0a7b9c606a257f34bfbec8d1d17786f012103557da6fd76f671f830b68f9d52976e720dde17ba43c4d09575c017f6bddb3971ffffffff3b124474a1f49e26b62314d1ae2c72222b6a2022191b6733989382a844d386f6010000006a473044022036de6e36f40a8db90e565fc398b463742d6e6751b6c5eb758563138f4a063e3a022078234eda7e829eb9458c7ab35a210fa47f1355d48c61ff5cfb31be7e42ed33e001210303911d4a1c0ad1530ad241ca2caab9038b21ed86055ac940ea58e5634c385501ffffffff5b953461686be8fd321b14f90ec8f3bc5e1b83063e2bf2894345d4a90aad0022010000006b483045022100d98d5f9dbec259b2fce4e9f8201b07f27f4025853beb331be91e1704e304b2ba02205808df049a59145f9526cc37cbed772468e58c3d7bc50a37c752456681c7bfd501210303911d4a1c0ad1530ad241ca2caab9038b21ed86055ac940ea58e5634c385501ffffffff0046dde73f58ddeb824e8997f39a1b417bb45d5f69a16e57d65830cc0d3bd8a7000000006c4930460221008a2dfb6cdaeda83eaddc3e4e79b5f5a4b63b813470f7cfc1d4e380f0d45a5dd9022100e05932debf59fceebf7d0fb3b55e50eaac1746b2b3ed27a3a446d92579937143012102e3c99ec61db654fcb1829fdfb707f475b501829a945fe46d994db2cc24fd9b10ffffffff010012ca97310000001976a914c737ab4785a1e88d8b6152e7207fc3372ff61ee088ac0000000001000000012a3acddcefc9eeec8c3e3ad2842d8d1bd45285a89f30602b115678fba2ffdf0e000000006a4730440220263463850fda3f7e45c1f0926c0d5b9e16bb4fd5535eb8c23b77363f673973d702202b93f4623898f4e066e05077c6bc13e9122c427de55a329f54521927d9e6ee6a0121034bfaa8a15fe5d3384352580f1a84f7f49924115af4a7c8b02da899047c2314c4ffffffff02b61ffe532f0c00001976a91423c97abb9080b029155d4634f988783a00510ddc88ac08e2c7e0060000001976a9149b65a61c3413185d315ff12f326a9c3ac8a4debd88ac000000000100000001776a633c641b3ad5632bfd32acd0301c6686229b915f3c842b1cc24220804853000000006c493046022100e82121319e327d1070bd1b8afeeb060e88cbe10bd468d228dc77bb506f8b661d022100d00a705efd8265ef18113acf35ac9fbb46fe113902828e1d72eb4bcb9bdf7b6b0121036eb7d2dabc6560354251f252a51475c5ed559830681ba0838d89d494282d0c79ffffffff02bda713e9815500001976a91442f185de5643d0e4653d9f50b54eec6d016769fe88acab5dc8623a0000001976a91495e2bd1549e434d9528203966aed9f00ca101dee88ac00000000010000000186befd244b4ac06a0c93f3c84b31ffe8364aa270c359f49c24a27e38aa37542d000000006a4730440220401773baf69df3b93fb0b51c82b2c05e39ea665e3302d060d1005368a06143c102206535d87af7aed9886d68682b082a408e52f41ea1a92d4aca90cec83610af8a9a012103aa2c2048bf90b9a2de755412c6b0c0f66f21dc76cc14bcc4f64cacc3e515c4bdffffffff02ae70d1b54f4900001976a91450008196da21b76532b492ab97dc991456ad179a88ac521d8077260000001976a9146d0bc9d3c908d759b0e0a59a5c26d69e37256c1f88ac00000000010000000137ed67ebea136256834f48ffed22e469cf5e5659d52227ff28a5213482defdb7000000006c493046022100907a2c31acd9ed8cab0f2b8c94249d1a5bfd06c01024cefddfd2225f967d32ab022100f9cb99ddb4edc5eebe70d5f5588767a978e21a7fb8c86c037ed6c1ef83e63de20121038cb41f889e7658adee33cb1d8ec5f9586424ed2a4b92e56373e756b1aad300aeffffffff02a4ed016fa20b00001976a9148841590909747c0f97af158f22fadacb1652522088ac409d1a9c0a0000001976a914efb6158f75743c611858fdfd0f4aaec6cc6196bc88ac0000000001000000015ac6959f5f8e0d14df1c45da8567d0a2dc4cf682431359cab2a192c81a854e3f000000006b48304502204f4132692261b237ed877b76a722a7e58d48e9157f013fbba6f6adc6944e83ce022100a0a64c156aabd409fea754d225a8c16e6a2a2920b1b6b3f01162734e160dcd530121022b9fafc77f470ed11756a82e4d27dc8229196779525b73aa170d0adde7ef050fffffffff02008dff52da0900001976a9142f6c6ee207403395836335e4460e96e7f583701c88ac00b080f6450100001976a9143eda58dd12a5edca008ce105fe3847f96016f17188ac0000000001000000010daae87a56b318b250d9ae5c59573cdc555c5d1e73a2b6840b04755c1c2aba22010000006b4830450220720793be4b7812a7b4b7ae6dd75cf37da09ddd4630debc09c34bf95782d16bdc022100f5f609629a559bcd96dcf82cb1657aa6374af78d3114c2f57d9f6fb204c97718012103c584550e0b922323d39a357da5ee977e14a117fda1812ece91f33b06072cf49dffffffff0200943577000000001976a9142deeef21adf2cf1d0fc8cf31efcf11af2321595d88acba4c55c9000000001976a9148a10bf7df695647d408a07d765699d41280663d888ac00000000010000000830e60439eea77624e4b76424de72dc4345bad8e76d807459dce817155c39973c010000006b483045022021771a95a44f1acf88dcc0ac8b50f1756a96b648e0e8b130dfbc762c90d61806022100f40b7d1b643acf3b73ad32af99215fb8154cdd05b85d1d080fec154f7eefddb00121033779d94eb445e945e3c3ce7c815359e48a946dbf313b0375f979affd48d01fb4ffffffff5c506722bb545a465580685aeef32954da84574af3b805afbce40fac86029a5a010000006b483045022044b6c1506abf9823213034aea8c84f49435b1ac559bdc0bcd6d7d9f1d4b53207022100e22b75114b911a014cd42a24e243a42b22ee15422ef61cab61072ca547a9404e0121036774ad1017adb3fd13a756d7c76ad15c1dc49f37b71ea516c7cf93bbbd263c3cffffffff6afcf22f0f2db24119f4c3ddefee090be003430b72232170b8f3ab6c507074c6080000008c493046022100e36e614f3ec699fb3ecc9b7e496ddde2c91c583db9c6a64b94e46722d0e2dc22022100c55c3d38f915ecf046041b6e4594cddf86b27c5d83d7b291cb9815d58d33e7620141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffffd0dd3a135633b1430afcd03e950dae8cacb097f0b8611b141124c057ddadca5a060000008c493046022100ec08de1e701770a39203c7063f8439e9f44fcb523b3c0aad33fa96d7a5e56988022100a36e1e438eb9b1856e9e03b7b783e1b1275045043f9aae10be42ab98e2428e6a0141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffff9358deef5ff9ba99dc31189630f768cb4f879cb5764f587f71c1ccfd85ba51df150000008a47304402205536e7eee100668ec379b4fc39f1f33ada52b35514c0357d9df8a18750f675240220484100a77b44fd0c11ade5080e276558c3f9e23cc026539c86be1af30bd4e5720141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffffd7f1a826d5cc65f19f91c0ec6fb84053e07683d6b115b4daf3b6a96548ddb0d2050000008b4830450220515a77a326e3e244b25cf9ba3baeb8636aad3bc2752a13c58d4792f65052c5b3022100b5edc14a0e2939dd3c0e352748513df88ca916aff9ea229cb0dd46f2d541ebb00141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffff3cc94bda0348772bf4dd971f7f55a44f8131044fd92213d731dc2f5b4f2262b3000000006c4930460221008135f2ef5ffd16bb7d108cc71ebd23350933b479a73b9f48e2d682990fff5d29022100ac5a830a573e213dbbd4631ada472d523dcf64c072b58fbbef07613834430d93012102166b3359503760d953e25a996b1edac224b307d126392b2ac72a45105958891cffffffff5d6713f106f331dad761116e5550fa4ae73ef53a86e0542d9f98835cd9172d5e040000008a473044022006ebce6cb99658d714e226b2e941e490a32be41eb06fa8bc0ba824ea4cedf3c0022062bd83669800bd7ff0ac29b23fe5853cb61d633edb200af813a9d5cdea3e53da0141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffff0200c96c4e170000001976a914e03b2b3d04e726d27a442d5421ec94decd16014888ac21371600000000001976a914803a518d40f3c7eea80fe8a1501a81f1d21074e488ac0000000001000000024b88e1b58dfa49925b1ca091e7d1b8c43d546abff36c9f41e062aa2ec8b3b22d010000006c493046022100fca35a551d811f047d7bc8d2c96c48fca7425fdc56c23aa88f1a5d3e8dd590ec022100a7ff992c9eb3fbea30de1f98444b3855287c608fbe549e847d295c24c461235e0121030182db728d46cb7e09bac5ea81607f412b71d960e9337a905ff27ca46cfb2f6bffffffffeb2c6f0507d80ed63213c0dd699926f300c87c4e61aa7d075206b1c0b3dead8c000000006c493046022100b7a2a3e62f84521b76f0229009327b6d532805d865871a184955a3b608c8ef6a022100d64a49c81dd3063f86ea82190074bc33953ec8fb40b22267bca89e01578710cd012103bb3381cb1421d7c77193a25b80c978c8badc3a4bc4a9d6fa4450aae0ff77daa3ffffffff0100e87648170000001976a9140c5c994d75cc4c188c11dbf406a041f08344727688ac000000000100000002edef21f2e6dbd1da2ee5371bdfbe9290359002cbe6816486a520873be909e6a6000000006b483045022100b0c043dc01eeb9dcf3851e8b41a101a01626b0c0d9ed051acc1822fb44b7818c022042752baafbfea2d8311577aa1c96582280904130c9df864c3428551ef6e4454e012102184363f5cfdd6138a5e574dba3fba87583d0073252e23542e572f284dc29d25fffffffff8e869d76156f8b545ccb31ff5ec09b4746bf6412a0a1e1c64d0f956a1aa851f7010000006a47304402204d1520941c1eb5cbd1f21a7d3a583c6ee240600faeda6ef5f881ba7a80c519cc02204e327651ef12d337176a324d52aa8a83b9511fa0dbab436c9995a5fec2e7778a012102184363f5cfdd6138a5e574dba3fba87583d0073252e23542e572f284dc29d25fffffffff0200205fa0120000001976a914aa72ef734a5414fc4249fcc4aee8a3b430b2892e88ac00eadd8d040000001976a91472285613b3fd6a077445991cad0046969ba5a62788ac000000000100000001ab6d5cb4ff11e8cdd710c403a8d33e5c3eafd87d7185879818b063f7efb8548e010000006a4730440220554a6519fe2755db4c1a3310574cafc0601cde7a424c898d86b43d1732a6b566022038ec16a38b8f7c69effe12c2c1eff4a29895ed446d173b32c65759b8161f09e0012103b8c8e44691a1811f355dc610fd322028e1f6937a2a5d32097e891dae605b810cffffffff0200e40b54020000001976a9143824aa2f78626ad32d3d6fc23ec0bf1380df4bfe88ac008dbce3180000001976a914c24e84b87e6ff62318799e2d86969b1cb3a5a68f88ac000000000100000001cdbee0abc61024d2d9d40e7119d73d5770203d7415b7297811a7e9e102ac5520000000006a4730440220648eb9b8160073b298fe4f5e3ce044c6b78665bd739fe44defc618ccfc839ec602201fa37293e3a466e746b690c9688bf97a6cc74572dcd4ab632750705574939025012102a8a7f85c202ea64ac08fd248388e60f62688d0505ea7210d7a36cd6d00ac3648ffffffff0236d96447810f00001976a914bbacd0ef6d81ba9910e2c8428041a65442a370ea88acc5973993240000001976a914ac0b37041f4e2b6337aee944364a614c942ac4fc88ac0000000001000000010591e2ab8b8a503aa69bfd5688862cee828d43c14c09bcd78e3920ba2fa37f18010000006a473044022079b1d0f7f649b8e5e8634f7deeb6482a57b0af090770e061b2c8d1cfba71cc3002203ce0560db5aca86716971b11fb9b03723d90272a49376d78ef0ecee7dff810e40121038fa4eabe1d7463d13d6c86a92fcc3e8000473adc41cb07c372ba9e06a3f43194ffffffff0280c52d8b010000001976a9143c4d481aa7776cc867de67143b9f9df65a445ff488ac8021f416030000001976a914706631056aa360576922550a808c268cfa578cd988ac0000000001000000013ac16d8d789c616a9908d1b2d8405c49594dd76f85b0102fda9cdaa2600f69e9010000006b483045022100e86e4db2ecd8e13333c6c6ea53576f9f66c19c7ed9bc3e4e62ad37a3fc89caa4022057d05333637ea5b9d76df538ce4302f0798f6e5d1e48d49eaba5bc629c1d41f2012103d7c35f0c7c24c510ba334ae5f3f7d86e5c0af94b8d2ccd7adc052b2f7e1d6b4dffffffff0200b1bcdd040000001976a914c3fa20522ee60c30e8e90f0d508336d49655823088ac00943577000000001976a914ae3d035ba09bce98918bb13021e650f1dfb3b08588ac000000000100000001688cd393eaf5aea8516e11dc5f395a449bab1ca6f5c6fc679cac6bd781d5d85d4c0000006b48304502204ce49efb622982dba187c0767c163560fd272f032470af9b1f7c0de04120b783022100d108d2f2878c78d5a4afcb4a1259310752f648e5383e10bec24cae296a1ab4ad012103979d6d85a49d18deb678c3dbfd9ec73a82ee61971c08e63d2e4db37361094212ffffffff01bdbe798c320000001976a9147936b878100ccc012d4eecc7124accc6774078de88ac0000000001000000019cb1fb0be32828d9a5fb4d8d2cad34e1d351a1a5990692c09fc9522f3c788d52010000006a47304402206a3fbe36f6e9c09ca3e6920cc5ec214950bec7db3144c407c8d58f0c7b1f05830220585881d965f59e53e9e5b83c3617c10595e7d362ebf7e00c0ba8bb3c2c102e100121023134cc9962bd55c25349192e30686f7e06b1e71effb83ea98bc142ab71d4976affffffff0100e721a2040000001976a914d68cb846739bd68d4bfe6346ca0e7de32268af8e88ac000000000100000001a42ca3dce24910f351f385912d8a37ea87cee8917ad4a90a95ccccd193405e13000000006b483045022100e1636331779607619dab8254b599f7191d5c9a1139529f38a8a7aefc406a152402206ae7739b822c205ae044507da67b6e356688841d093ec87d76cc60f7d223ff5001210318c5bd2030e074abc39f5b34f3642500dd2f33eb686f78983fb639417ad0645bffffffff0220b5a664310200001976a91453645d0ee901a62b5b91590c6cda95e42409cbe888ac80f0fa02000000001976a91488a65118c4d13c1a526f4de4fff41b9b35d816cc88ac00000000010000000184b219412d00a2e9431f60de222b1a96f4edf2f4c886bf7d5c2e226f4cf2f367000000006a47304402200aea45983a1b2fd6d3c521b9dc8b9b7a90f11f68c4beec7eacb755125c1074c5022054a938bfc624d5b7c0f74bf4eff2620babf41739675786f8f95f9ea2f89ca15901210210afe85ead8d32a4f338cc9b5e3ebe7e68fccfa1b05ceb846d51174bb6e5c8b8ffffffff0200cce06ccc0000001976a91485648c7c54342b76befc69a7f6a02d0b7e3c047988ac00e1f505000000001976a914289888fd9f4d032d43aad4485d5dba6b931834e988ac000000000100000001de633d4e614214b2c4f630f82f78cbf01cdbdb31265f99480204149a0d736dbf000000006a473044022068c5edbae3e6626bc7da3029d0df0cd59114ad5d2e8533f4f26439251361d88302204a940ea94bebb8e9d1d93822fa23e11c23037c7971f36b3b3e839aa243d4e2c3012103a93d999bb383a6bd9cf802101b66245e2c6cbbce302ac964893a8e7f187e9461ffffffff0200a3e111000000001976a9148849b263f7d808f2fc97241944b94f2849b2601488ac00b5cab32b0000001976a914a6f534602558d53a1aa3ed98bb8816ba3ceac02088ac000000000100000001d9b3c3b27f52d72e93c88e2bdf54ddfdb27027119401eb0c33a4b17b0640e2c0000000006b48304502203747cb4c101b4b2b8d3815cccd9baeefb36cea2f595e6306db56b242a08f74c2022100a8f83b573154c23f82f8d1ca002fb10fe8c55033ae86625d6a1644a9b00f27fd01210316d1f584e2a315261fefb1b1c77cdc22eecc4e34244ff46742100083a4a62498ffffffff0282fabeab080000001976a91412ece6e9180a15251177f66e39f0dca7fe1947c688acf3ba0401000000001976a9140be8cc678017ea9c9eafeaac63ddfa31fc2136e088ac00000000010000000168423f1633c4f503cc0971638c89e00f453dff809b11aefe65e48db83869f348000000006b48304502206dd4ecf7e1c79cb139b8bf4507f48f1bd5a3ce207ec10807496ca7a7dabf4526022100ba0a3b99eba4e0cb86d175fe82873b165b2f06f65663f43929424e6632d561290121021bfcc1615687c72e64cc9d06f57501602a09a3e8e612cdc9a66bee2668f3a3a1ffffffff0261c7bcae070000001976a914a24be5ff2adcb5fc0c5e360b553ceb22a425a64b88acbdbd174c130000001976a914d690e204b63c98c0470b2b7ea3367ba109719aa088ac000000000100000001f12e57c8b3456b9dc8a7403938a2822a57843fdb537543a73332d7e5e78f85f7000000006b48304502206978be3154ae94d58f6abd4cd916bce8f587d53f1646868463edbaaca82ab6c7022100cdd208ea5bfcaabfe37801a5fd29cd83db2e2ae28cf4a229fa1fa58beadf90860121036a59c0bad2fcda23a69c78adea325b58466ca59d5126bcc69faea043beaa1e25ffffffff014a2a95c60e0000001976a914e2c4c95cdb866f579f93977d668de345b8388e6a88ac000000000100000002acd75dffa180f9fa929653841e9c61c8553d067d00ea9a7141dad6880984a63f010000006a47304402206513136d876906f9917998e344cb080473e441c0be2b59900dae0221b04d077a02203409c91aae44643cdd98da8597372d53edd019af6936974eb04b292d53848b27012102a9bc6c4bc078f805cd1c7aca4404069adc7717879ebdd679ee1a246c7e6f4bf3ffffffffd19f37347a4549891e3dfd0e7eab911d9e67196ddcbf41502ffef1773bd7a98b000000006b48304502203d3f097f0eeea4f998347d842f564dc9e3f5d0612b4dbff3bfb84298814484e302210086e60299707e98f069aa99f9f05e1494b3ccae4e1cdd1e62c36dbf6a6049d27f012102e8d9f3ea4da6cb2dd65250fe694c94bf27788a98d5ef6b02e62da5f0bb6ab20bffffffff021d29473a000000001976a914af0f58fc983699ce76cb6ef18fc271dcdfb79ff588ac00904e5a030000001976a914fb1a23206fad89723d855e5a80ccb9daa149244088ac00000000010000000133a2e5e307a65f0345ea33901d307f63000139b3132a288d9a66016a8bb0abb8010000006a47304402200c66f408e869b1506f117c993d009df3b075a68b9ce4e62f1c92f783dcd860d702204b6aefac1539e90dd35b9c3fb0c8256a2f3c11c77c98c65121bfb80deba1f96b012102f7740849c2c6c4be311a1fb669e15b8af78bd201d15a4433d82d981724e3dfe8ffffffff0200eec1ee150000001976a914515ff6aef100b80aa0bc0f825e4197d398b4885688ac006d7c4d000000001976a914016b5977c4a98b00ce4bdd731d42896d3947149b88ac0000000001000000012371105379e58d8fa4d403ccd3d0bbd2f360e49e49d6fd81d2b94ca9aeba2290000000006c4930460221008210281a12b168f02c3f45e79996ff06f3aa7cfa25cf956d54c9bbc59403a7c30221008ac2008fe26f403d43e254c9ff4ef9534229bb7137aa57184e7e415354fa030f01210362027b5a4959973f0c005653e7bfbcdb557099ee42e9053aabf6138594fb2ebeffffffff0200ff0f270b0000001976a9148e6da23aea89b44790320e2821d77735b86d711288ac006d7c4d000000001976a91428dae9efa934162c0c4e17ea75687731eff374f188ac000000000100000001d0b5959c1487e2d4f3de202b52ce9286cba3060e3a8ebce06c735472d67bc813000000006c4930460221009fcf3285a07360f3fabd1306f66b1ac965e9d178ca9ceaf7487a292d96cc8792022100d74380ddb3da48f986ffb8b063124a97a79a1500f5bfd5181d97fb0cb026c7a3012102487c3f3cc9a5f443107c36fa06844b64dd8b23896d9491f6a6d698bdb511c8e9ffffffff02f00d7bcb010000001976a914318eced404c11e3c5fde840d5aaeeb9efc00c6b688ac005ed0b2000000001976a91462e9340893d0cf62a9e14eeed711e5764386f05e88ac000000000100000001c79ae575877f2670a88a53b8939c10ab6413c1ec6847f2381b9dd7d44f69bdde000000006c493046022100ed5787095d60824035f10043d2c218cffd7022f149bc6d0ad6aad7cc8a1ff7ba0221009a0fd8a6b9b74a2fba9b16da60061d5c44fd58b7e279ddc0bc5b604ada381d8901210369f29d6f5caac452d06eccb2899fdcd03ce385a050ab32c868ff29f7397eff68ffffffff0298bad24f040000001976a914171ff4c844a9eef6bb79cf374e684a70158e7d5388aca93bb11f050000001976a914a7124f6adeccce0e17e94f9a68161c52a32eafa288ac00000000010000000135a2a0611e0b326f05e48124e7a7592c0ca52a7f9a3efcadf03d74027a244018000000006c493046022100e296ff2f5a1b996c922c327c371b4e21f2fb40bdbba2f9b5befb5c74b09b9f8d02210091f07e275b035a784e4ed0a5c13c7836a90b52b739f2b3efcf47fab0dd6de59d0121038569c188cbc829f851ccda57a3235617c1909e1de2419c9c1169529b14fe0c00ffffffff0200d2496b000000001976a914b80be6e1a7bdd4b984bd5680db5179f7b645031488ac00410b38080000001976a914fc32581d33bd5eacda6158ea10cf4fd9c635d84d88ac0000000001000000038055caf093c8a044fa5429adfff3484e117fe4fe76cb27174d2b9d792b4fbb62010000006b48304502205ed4304d094741126acec996aff3fbca1c3ceac1d931886c5b9eb2575361df04022100a563593827d8f1e4d10f9cf325f51b901fc450adf0b2ff584ca4965ed1dbbb2d0121025916328cd6c38bf5f98693323158a4325fa8b333a215c2ae0b1ea4a92f673a38ffffffff8a1a976bcd51d0cf22b021b9803d7cbeb77a33e1a2dfc6ca4773320dcce7c8f7000000006b483045022100d446953828ddb670baa707ccb1ef9937d3e48660a1c90891f40ed983f71eaa0d02200413f37a60fd0cff0a99cd1e0a14d37c839e460c56771753d6f8fc99a6939927012102d7ddada145d1d5c081427f3913ce9f77e849425a2f2c4a4b66737b22a1c7488cffffffff7607d8257d5b492b8988e58186c00b6d214a401ae14105b7d9e89983fd33f584000000006c493046022100cf6bc9a14f631a69895662fad0e809e7afe4d1c11ed2c1348c40bcbc0aa6fe95022100c8fac9fbee9d8d6f637fcdcfb27c3aaa962bd80e9819bc5d64fceb078842bcd7012102d7ddada145d1d5c081427f3913ce9f77e849425a2f2c4a4b66737b22a1c7488cffffffff0280e06200000000001976a914841377b2b993ed53a7333b09856f1e02bc791ebd88ac00a3e111000000001976a914ab1b5cae43c1b925e0b89c2aa78494f1bc6f924e88ac00000000010000000181427281d6e26117258c9adb30b5d24ca412a73bb2b2613709c0af43ade44189000000006b483045022100d6bef6d56c92a90075e50ab20a0260e7e5fd5a4cec6d4943ef245bcb35df749d022013ad806ba85663476b7e0ee89ed0fa05ae2846932deeb620ff43e0d983f9a7ca012102c35c73eecb3f7498836706fab553a8a9881b5ab42ad1b726cac11a5e66f29e4bffffffff02a002c055310200001976a914605ab623319733a2ff3c7f749214cde3ab4cb05a88ac80f0fa02000000001976a914ed79e21df195f9701e91eebc2b4e69257058101b88ac0000000001000000016c873218e5dc062965e5a5179057cd27bf44c99abec60288c645f1c1c8ba9bfb000000006a47304402201412ad826f09485dcd32c11c521c80269fa077d1e19eefa828d40135e795b2bb02207dd7b8b4c065092e3f16038dec8676910aaa362d753416a3ef1600e24acca3b6012102d43a6e77148fa7584674817fccd77e564832bc623158b598ebde6812ef22b590ffffffff02a029c1e1010000001976a91445a8fb7e94982c104f1121d549c5f8d28df3ce8988ac603fa71d000000001976a9147de21cf2eb1b16f6b50dda20b9045d2ef729993c88ac000000000100000001246964d523055dcbd0e1844643ee90b05adadd1805dc5a8138e1d572109f1eb6000000006a47304402200f4874872c3f96659b59c63e219c7827e131242538ee58910ef7d37c7a440bda02200509d82aa2738a383f1f76f495ce37a20cc56530cd1139aaa009c4e4700d5f720121035f33520e83f96e1dfa8136e987471c906568959fa40ba8c0ca73a576bbe03b8dffffffff024054adf4000000001976a9146e782f433c0ed10dec2156fcf750da0f60f84f6988ac603fa71d000000001976a9148238d5ea6fdcec5b76b8792205be25b559386ac888ac000000000100000001c067ae3dbd1d8112ac2eee4e0a9455a035ff8079a57bcf035359f01896509042000000006b48304502200764a38588e468ee488372e49b111c2c060ef1dbb37bc5165216c2de7a799fe7022100bf5111c8c8f6098440513399abc45305404ab70b572feaec84379a193251c984012102ab2e8ebc9a14e3a2fea3a5dd1949a9c075664c2c57ab1b360a3ced60b5010e40ffffffff026cfb8e15000000001976a9149a41d5bc2ab936b2f6de2483cb0bef50169b6d9988ac00ca9a3b000000001976a91455c71f61392272e15347c027382677cfe67f5ad788ac000000000100000001262ed6364d4b45d407650a5374a37699b6c5ae01a70cfe034abe33c981f24b93010000006b483045022064f3cb97cf6af3a9fbb4f528b772c4486ce1050e560bc459e9d8756cbf2749de022100bfd821d47570fcbd01209f69c6b75a75c754f23a15ae9f365af59e2b88fc4f45012102b4ede20a853e1391b4a29f72fa1a76fc519ecd3b561d11ea8c0abfc638ab93b3ffffffff02a6e28d24010000001976a9149a383ebe681d88e0314d1dfb4f596dd17aa422bc88ac00ca9a3b000000001976a9147cb9e6d120be2bd152b748f8f590c926b47bf9c788ac0000000001000000010ee2653a9516e70405dccde6c2155514970fb6aa0d72b4145c844fbd929127ea000000006b4830450221009240281b701818e78f67bff775204071a9ea3215512acd8e7fff8886938cf257022043bb000937fd5c0cd99fbba19936731ec0b9a0b31c92742f62eaba2bd44625d9012102a296f5b4fd4e83cd78b5dc71e328b6ad97205f77137e26fa9c918f50ca29e71effffffff020064488a000000001976a91471f4bb8d47f4a0c0d0d87d091abb7405861e892488ac603fa71d000000001976a9141cd3b22d4ebb6f7d94187e4f7fedcea24cee11c688ac0000000001000000016d0c87bfbb6b049498ab2ab01f1bf492cf56daca99da882415c418d6700e1dd2010000006b48304502210096eb511d7c04a47fb8e2165db508253f7af87de4378a6830eb622a3527684df102203d9d823dea7ff0af1526dbb031f0dccbf520f6b294dd0c3993e05427f1c2cc2b01210214c0c53161cd86b81a01c8b12321a5f1fe8ab93b7b9ea0186fc7d606bbd03870ffffffff0200b33f71000000001976a914434608760e385a4b8d54178d41631b201c804e5b88ac008c8647000000001976a91445716aa96fbab4d30fe0355254a0954368d0987e88ac0000000001000000011d05c3c7c10aca998f5883f103e2f78f9e11e42f18d95618b782df333ea69a3e000000006b4830450221009b51194a564c121966444c476cf92b64c4667a152cb0c06875c01608924bfee702205b90d6837dd8814fcc2928d9d472521db25d5feaee69ee03e40852b75a6d57cf0121023732f8acf3eef3fea2226f2de4802b8d789d2b30909d4e9009c9d5138591605cffffffff027d9fd81c060000001976a914a5c1bad6b2e517d6df2ec67bae14e9ba77b5244f88ac057af088020000001976a9144bb19b49d47e77c216554eb718012ee1a8d58b7688ac000000000100000001e3789e9ae0d8271cde731c58f6ef02ccace4df32efa1d7aa9f719b07751a97e6010000006c493046022100c82f89daba81ffbfd05c5cb85a8238c7950e0ff6ef79994249552910eb77fee70221009f0e2c840e809d7414262c6dcb651cdaf030ff12c47b122b4409e82ef13823b401210389a12c3c8443c73ccbed2e2d529bea8edaf7a4efb8fa6c5b40d3ef68591f4ab5ffffffff0200fab459010000001976a9147ee2e69aa7226562024951cb09b15ae0520a06f888ac00943577000000001976a9144db9be540350646dc34fa78def8e04fed49d81ce88ac000000000100000001b36bf25e83b4e841acedfd08f6b81e7fde3678039a0fee8ea7cfc25b64341984000000006c493046022100a5ba6a649289c4bc5f21bc0bc0bba4b30ccee57197aead9eef44244c180bd6be022100cbb2a297103c85c434288bdd3196233231a763750e347f2bac212a10343e057e012102f4bb5a222354a9649740a8b8b300f3e1a0c7ade18a409bae7c2ea9f0ecac0575ffffffff027e04ed7ca70e00001976a914c660254bafe140f4a6ec8c248b61a5b7a427ba6788acb8f381c4d90000001976a914e0a032f63f59e7b7b9a79b9dcd7bb8121f672f3688ac00000000010000000113624b8e6c558c0b95645b5b4c611b6f07c4ae051eddd1470fc921878b158553000000006b483045022100ccdfdb7f9b45e5bf1d36b4963fa05714b0cb963e3f93d370f806166203904cd9022031d5d036bd92716e742756511a4be0ca85674f1d65cf8285eccb20bec9c09873012103d3e092b233a629befb6a2249024faebfddf944140f5403a7eedb3f011c47271dffffffff020c987287ec0d00001976a914c5207f84f009632513b304af1e69757f79d1df4588ac728b84efba0000001976a9143d9e306694eb9a55e00113a6f9b838392d15c71a88ac000000000100000001e194dd90db9b7fcf661327515006bd219636ae5b6dc23120146b52ffe508753f000000006c4930460221008e6cd035285d9434b47cca0a01d6ebb4898d1a04bf16a7ef53cdda2358283edd022100b95700890afea19b08a5b67a6bc13e85df5cce990b749e23f685986b4685076e01210273c7e637ceaa0f2fd102278d48c3d4cc60b4ba2ae24a3f5daed840e515757ed6ffffffff02a1f17efc000000001976a914110e90aa49171cc316e4d7876fed69fea686491888acc0f447ac060000001976a914c62cbb894e9889bf2898e902c57ecb79b2b0254d88ac000000000100000001a37afd10d48f0c5963c66f8b4ed5af4a546ecf2cdb8c4a1bbcc170de72df0fa0000000006b483045022100ceb7d06c357b3cf2b83f2bd50d0e498312c85e17344497193f77e020a3874afb0220296b0e6d0609c8469e7c7f8c13e3ef2212bf61ce04e898adb70348d45819eaa30121037b2e9c9fba6e830a2a12713f89ab42e87ca34ddd9a68b06768577b4f8d543801ffffffff026a9ab816000000001976a91465c5ba865bf8b0b533fb0be75856f51db71e46cf88ac3776d0df000000001976a91420717bf29cae8d800835d4a6621a8bcd92f24f2288ac0000000001000000015a021ed0fde77c37c49329b6dfeb629119710aa79706e18bd13bc89b34b17489000000006c493046022100f766c02b8be767b5e40ab2e5fca085b095883b24e76da75a7894f2134f85e2f60221008bb3fa3322b9f032eab5fbb9c3c3792629c5444a628e489bbef074507d2822bd0121039591af3b189bc9063110783ec97b1e061cd88dea2b374efcecdb2b4fdaf48d1affffffff02d8baa4478f0d00001976a9149fdbc530d583f6e0dc31e9281db0c9db39325e5a88ac34fcd7395d0000001976a914770d36fdf8a25cb438fed008540ae268e62addbf88ac00000000"); let decode: Result = deserialize(&block); decode.unwrap(); } #[test] fn validate_pow_test2() { - let some_header = hex!("0401620046c8452c09390449fc239f1aba4aa0612cf1968310e7d6f47dd079989810d49ac0aece8cb6903fa2cacb1bab9eb15aa05f743fc4e5ba48c51c06dac384ce0449e22e7c66a1f3001a0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff54033e5929ce042f42696e616e63652f31fabe6d6d5b84f34baadcb2ffdf2bf43156d645b543cefd5a6bc8ccb44325092f8e297be50100000000000000be4a47109cebc5229d722a736ddc9418ce40dafa29000000ffffffff02d8e14925000000001976a91499ce4c0a552c646353cc9e0df4c824ba2d978de588ac0000000000000000266a24aa21a9ed7a631c21f44b821c5fe847b7f62eb1c5cc61ba7b96df22b9da7d0843920a8cdf000000002a3994694a0793302c9949cb452d619fe7aaa911cf676824e6ef2bbf8f783e97082a5350107f1cb4f5bdf5334e17f90c95b30a6a4aa3f76336022fcfc49fe3809c4195783d7993aad5db09a92ca64e3e7746789eb266d0714251dc9996f92ac5b1390e9bb0b517702816548a83eb66f407d7d0547b15009a39bd856e2b36740c31d35d19f91b1a024257330f4a5835a29cc6dd38046c0d1014eb1a2f24d5a91e9ecce1ea61aabded017ec5c4a641d592fd8eac0c1ec253425e204a5551e6975d03f0ab709674e5b00ce21eb7951ad6b159186e3251c97a0b987a5d0f8ff325fde7cfae6a3193ce123950684b532d66a9ad87592b2858e856ccccdd8e8c80228fd831d398b0c02dc9012276797b4e4e0f2b52078687810ee9c8a7d609a31b474e5500000000000000000000000020b7411126a870aab8fe23f23d56cb6f5e2539d3f599d547255434c5c9e04ff8d20dad61a4afc728e2d2270fb9e9fb718b84cf86ff1cfb18e41d6bc398cc75efc0e22e7c66e85e75191b4c4f4c"); + let some_header = hex!("020162001b9db197bcb7d86e93991293f148f684e17efc6136e08b4688c6701f39d4403757dd5ccd9391273c118b600e0f497a04f3cbdebb7e6dbb699bae2fb17198d8f4b6aa8d5403f2041b0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5e03a9970a062f503253482f04b8aa8d5408fabe6d6d92ae1083b7b3c22fd7b4ce2eae121d518f8e1aa81d0be9432ce5aa20a2954fcc0100000000000000402a29636829010018393436383834322f6d696e65722073686172705f66697265000000000100f2052a010000001976a9146a2ca895057c3b94136c8776e731cece18b46c8688ac00000000040290bc699f9cc500b676c9a782b2cd398524d6279079b3b59a74069396f81602edfe7f3fe6cd4224a01fa4bb59f5254acff79e988aaebc994337cb6d33721547417823cbe436061e508eb64060c54981df9a87f03875f84d0b70457dab12d21600000000000000000002000000f7e6f6aff383b6e2bb1d7968ccca5b6ceeaeda130879b50f09f29982431e26afbefd1c78ab2711ebd12d4c6c6e54e3ddab8cf2d860283a6ca7452f9865d32c9c6daa8d54e12a011b57975dc9"); let some_header: Header = - deserialize(&some_header[0..80]).expect("Can't deserialize correct block header"); - + deserialize(&some_header).expect("Can't deserialize correct block header"); +println!("some_header: {:?}",some_header); } #[test] diff --git a/bitcoin/src/blockdata/constants.rs b/bitcoin/src/blockdata/constants.rs index b616409099..159555caf0 100644 --- a/bitcoin/src/blockdata/constants.rs +++ b/bitcoin/src/blockdata/constants.rs @@ -107,6 +107,7 @@ pub fn genesis_block(network: Network) -> Block { time: 1386325540, bits: CompactTarget::from_consensus(0x1e0ffff0), nonce: 99943, + aux_data: None, }, txdata, }, @@ -118,6 +119,7 @@ pub fn genesis_block(network: Network) -> Block { time: 1296688602, bits: CompactTarget::from_consensus(0x1e0ffff0), nonce: 997879, + aux_data: None, }, txdata, }, @@ -129,6 +131,7 @@ pub fn genesis_block(network: Network) -> Block { time: 1598918400, bits: CompactTarget::from_consensus(0x1e0377ae), nonce: 52613770, + aux_data: None, }, txdata, }, @@ -140,6 +143,7 @@ pub fn genesis_block(network: Network) -> Block { time: 1296688602, bits: CompactTarget::from_consensus(0x207fffff), nonce: 2, + aux_data: None, }, txdata, }, diff --git a/bitcoin/src/consensus/encode.rs b/bitcoin/src/consensus/encode.rs index 32268670b8..4f38314515 100644 --- a/bitcoin/src/consensus/encode.rs +++ b/bitcoin/src/consensus/encode.rs @@ -120,13 +120,11 @@ pub fn deserialize(data: &[u8]) -> Result { // Fail if data are not consumed entirely. - Ok(rv) - /* if consumed == data.len() { Ok(rv) } else { Err(Error::ParseFailed("data not consumed entirely when explicitly deserializing")) - }*/ + } } /// Deserializes an object from a vector, but will not report an error if said deserialization diff --git a/bitcoin/src/merkle_tree/block.rs b/bitcoin/src/merkle_tree/block.rs index 3eb1f9b369..8ae3030c4a 100644 --- a/bitcoin/src/merkle_tree/block.rs +++ b/bitcoin/src/merkle_tree/block.rs @@ -123,7 +123,7 @@ impl MerkleBlock { let matches: Vec = block_txids.iter().map(match_txids).collect(); let pmt = PartialMerkleTree::from_txids(block_txids, &matches); - MerkleBlock { header: *header, txn: pmt } + MerkleBlock { header: header.clone(), txn: pmt } } /// Extract the matching txid's represented by this partial merkle tree From ec6668cbf4124a255ba6d648e825afaa72e2a82f Mon Sep 17 00:00:00 2001 From: cf Date: Thu, 27 Jun 2024 01:24:12 +0800 Subject: [PATCH 10/13] fixed ser logic --- bitcoin/src/blockdata/block.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs index 64066ebcd3..0913411905 100644 --- a/bitcoin/src/blockdata/block.rs +++ b/bitcoin/src/blockdata/block.rs @@ -61,7 +61,7 @@ impl Decodable for Header { reader: &mut R, ) -> Result { let base = SimpleHeader::consensus_decode_from_finite_reader(reader)?; - if base.version.0 < 10 { + if (base.version.0 & 0x100) == 0 { return Ok(Header { version: base.version, prev_blockhash: base.prev_blockhash, @@ -90,7 +90,7 @@ impl Decodable for Header { use crate::io::Read as _; let mut r = reader.take(encode::MAX_VEC_SIZE as u64); let thing = SimpleHeader::consensus_decode(r.by_ref())?; - if thing.version.0 < 10 { + if (thing.version.0 & 0x100) == 0 { return Ok(Header { version: thing.version, prev_blockhash: thing.prev_blockhash, @@ -122,7 +122,7 @@ impl Encodable for Header { len += self.time.consensus_encode(writer)?; len += self.bits.consensus_encode(writer)?; len += self.nonce.consensus_encode(writer)?; - if self.version.0 >= 10 { + if (self.version.0 & 0x100) != 0 { len += self.aux_data.as_ref().unwrap().consensus_encode(writer)?; } Ok(len) @@ -738,12 +738,19 @@ fn block_version_test() { let real_decode2 = decode2.unwrap(); assert_eq!(real_decode2.header.version, Version(-2147483648)); } + #[test] fn block_version_test2() { let block = hex!("02000000be4ed111b4d13733bd0a245ee73d1233830e9075430e9e6c78fbe18f93a0ac12de14a8b25fc21e4273919d5ddd4bd60731663884fff22ee6bed10261267c75319d86fd52eb7e261b004821843101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2303a08601062f503253482f049186fd5208080030c207000000092f7374726174756d2f0000000001a8f80742a91f00001976a9146209ed8017ee7c7efcfccb5c971ba58a951749af88ac00000000010000000116b362b652c601435f94a6ecfc6c71a1fd240d58f5e4443cc6f3f31f7eae500b010000006b483045022100ca9176c3eccd6ab443b1259698c35a40f8274e5b87222e2a69a1d1937398c59f02205390042fa802df9a26923e6d972ed837cb7f297e307cb84a3cdee61c8d6f3a08012102f8ae61694000cff50ae14e80994c34fa6bb672d8503e904adc0f43dd7ec14f04ffffffff0200a0724e180900001976a914101f0445d2cee10c1f820dac0fdab961c35c594088acf2e893c4a45801001976a9146026526eeaff25b0dbf335e95241ff7ff990a59888ac000000000100000001d405cda6ec490b6189a09f22d3fa68795b91563aca04a91aa1964b70b2a0a674000000006a47304402200ef30fb2d38f4f28bcee60e9e5f9b0d45a09fc908ddf459eec231d128a2f14540220683d7eade3a0cce01ac986eed294cf8644cf0689ae67823853dca88591d98cdd0121039e8e4887fc41bbf3c2384548391b76e3e43ab8880416947f640b11fc665cbef5ffffffff02ce25bc125bd406001976a9140ca60499e9ccf01717dfd7a9c40f7bc8226a448f88ac0ff005b3520000001976a9142ce991b0fa2bb82b085382685c90b8f7f19513db88ac0000000001000000013f263cc3b5077e90920396055357b2d44535b222cff61579211cbaac51f388c8000000006a47304402206b12cd8abfea1a24cf90136b46f57d39cf0c826a5ec070296396ea2bc2c13152022054bf823e9dc35cb09867736189f31df1f51ce4cd6fcff06be51db8ba5e5ffd8501210287614929460d7acb7aef3b11194fff34e20d6253842d1f73e535a4fe7b5f70dfffffffff0276272c6fa30000001976a91427691601ceb91d590c42d52e6e90868ab2e5f23588ac00e87648170000001976a914ab215e1613facb3a426a4f553e6c7b20b58bf86088ac0000000001000000020045a1d9128ebf682cccae605df74316eb1b2644f656143866cad5f1ceebd99a010000006b4830450221008e71a618a5c424667664b52401fd42c2ce38f41b29a9250d72fa3781b1b4585c02200cde3f5ad65e61d5a8e792a2cd6f742ee0a8d08d6a194293b92940d85285cb080121030e2247d028860a11b4ca970f81dfac88a0dbecb44d4f11100045ce365b6155e1ffffffff33fafe002f76a2ddcb1862762eb6bffd75ad8d549277bdb047af211153187026010000006b483045022100f39be19e4786c4da61e58b46812b56e8b53ccb533a7dddc7695ae82ebb1e2bef02203fabde51827acb8fc918df241c02856bc3be01491c2aea9f07f4ea19aa78e2a40121030e2247d028860a11b4ca970f81dfac88a0dbecb44d4f11100045ce365b6155e1ffffffff01c1d2c57fec0100001976a914cf4f2986e58650a5acece7c81a56a374c9c5170188ac0000000001000000016b3a866916195b44b1ef1eeca6bd42444d30bd801653eae356827286d7170732000000006b48304502210095052e425fc05be614f6312bdcd8acb7ada011a1d3575d5dbcdd203c4ee09e6f022001f66b82f8c59c13a60f6aa84f5a991dd54cc47a89d189326e813665e7e7cb6e012103db50768756c7daaa9096e537afe542415da9649668023c26b9013ccb04a72db2ffffffff02711af552470e00001976a914301ab2c3a86972dee0bc2250be7e1e4f3f55886388aca3dede6fe20000001976a9142f119fccae2f2ea71689280aeec457b10fdd6e4488ac000000000100000004c61f35d758b2dd4c8aa93161a7e6597b078545942219c9e1eb9d2560206a385b010000006b483045022100d758b832dd4a379ca2ce15f23ea42263b47608e483316ee7bad9153ac7a9e2f202205ab6e79d3147042945e6e1710fd0c571b0a7b9c606a257f34bfbec8d1d17786f012103557da6fd76f671f830b68f9d52976e720dde17ba43c4d09575c017f6bddb3971ffffffff3b124474a1f49e26b62314d1ae2c72222b6a2022191b6733989382a844d386f6010000006a473044022036de6e36f40a8db90e565fc398b463742d6e6751b6c5eb758563138f4a063e3a022078234eda7e829eb9458c7ab35a210fa47f1355d48c61ff5cfb31be7e42ed33e001210303911d4a1c0ad1530ad241ca2caab9038b21ed86055ac940ea58e5634c385501ffffffff5b953461686be8fd321b14f90ec8f3bc5e1b83063e2bf2894345d4a90aad0022010000006b483045022100d98d5f9dbec259b2fce4e9f8201b07f27f4025853beb331be91e1704e304b2ba02205808df049a59145f9526cc37cbed772468e58c3d7bc50a37c752456681c7bfd501210303911d4a1c0ad1530ad241ca2caab9038b21ed86055ac940ea58e5634c385501ffffffff0046dde73f58ddeb824e8997f39a1b417bb45d5f69a16e57d65830cc0d3bd8a7000000006c4930460221008a2dfb6cdaeda83eaddc3e4e79b5f5a4b63b813470f7cfc1d4e380f0d45a5dd9022100e05932debf59fceebf7d0fb3b55e50eaac1746b2b3ed27a3a446d92579937143012102e3c99ec61db654fcb1829fdfb707f475b501829a945fe46d994db2cc24fd9b10ffffffff010012ca97310000001976a914c737ab4785a1e88d8b6152e7207fc3372ff61ee088ac0000000001000000012a3acddcefc9eeec8c3e3ad2842d8d1bd45285a89f30602b115678fba2ffdf0e000000006a4730440220263463850fda3f7e45c1f0926c0d5b9e16bb4fd5535eb8c23b77363f673973d702202b93f4623898f4e066e05077c6bc13e9122c427de55a329f54521927d9e6ee6a0121034bfaa8a15fe5d3384352580f1a84f7f49924115af4a7c8b02da899047c2314c4ffffffff02b61ffe532f0c00001976a91423c97abb9080b029155d4634f988783a00510ddc88ac08e2c7e0060000001976a9149b65a61c3413185d315ff12f326a9c3ac8a4debd88ac000000000100000001776a633c641b3ad5632bfd32acd0301c6686229b915f3c842b1cc24220804853000000006c493046022100e82121319e327d1070bd1b8afeeb060e88cbe10bd468d228dc77bb506f8b661d022100d00a705efd8265ef18113acf35ac9fbb46fe113902828e1d72eb4bcb9bdf7b6b0121036eb7d2dabc6560354251f252a51475c5ed559830681ba0838d89d494282d0c79ffffffff02bda713e9815500001976a91442f185de5643d0e4653d9f50b54eec6d016769fe88acab5dc8623a0000001976a91495e2bd1549e434d9528203966aed9f00ca101dee88ac00000000010000000186befd244b4ac06a0c93f3c84b31ffe8364aa270c359f49c24a27e38aa37542d000000006a4730440220401773baf69df3b93fb0b51c82b2c05e39ea665e3302d060d1005368a06143c102206535d87af7aed9886d68682b082a408e52f41ea1a92d4aca90cec83610af8a9a012103aa2c2048bf90b9a2de755412c6b0c0f66f21dc76cc14bcc4f64cacc3e515c4bdffffffff02ae70d1b54f4900001976a91450008196da21b76532b492ab97dc991456ad179a88ac521d8077260000001976a9146d0bc9d3c908d759b0e0a59a5c26d69e37256c1f88ac00000000010000000137ed67ebea136256834f48ffed22e469cf5e5659d52227ff28a5213482defdb7000000006c493046022100907a2c31acd9ed8cab0f2b8c94249d1a5bfd06c01024cefddfd2225f967d32ab022100f9cb99ddb4edc5eebe70d5f5588767a978e21a7fb8c86c037ed6c1ef83e63de20121038cb41f889e7658adee33cb1d8ec5f9586424ed2a4b92e56373e756b1aad300aeffffffff02a4ed016fa20b00001976a9148841590909747c0f97af158f22fadacb1652522088ac409d1a9c0a0000001976a914efb6158f75743c611858fdfd0f4aaec6cc6196bc88ac0000000001000000015ac6959f5f8e0d14df1c45da8567d0a2dc4cf682431359cab2a192c81a854e3f000000006b48304502204f4132692261b237ed877b76a722a7e58d48e9157f013fbba6f6adc6944e83ce022100a0a64c156aabd409fea754d225a8c16e6a2a2920b1b6b3f01162734e160dcd530121022b9fafc77f470ed11756a82e4d27dc8229196779525b73aa170d0adde7ef050fffffffff02008dff52da0900001976a9142f6c6ee207403395836335e4460e96e7f583701c88ac00b080f6450100001976a9143eda58dd12a5edca008ce105fe3847f96016f17188ac0000000001000000010daae87a56b318b250d9ae5c59573cdc555c5d1e73a2b6840b04755c1c2aba22010000006b4830450220720793be4b7812a7b4b7ae6dd75cf37da09ddd4630debc09c34bf95782d16bdc022100f5f609629a559bcd96dcf82cb1657aa6374af78d3114c2f57d9f6fb204c97718012103c584550e0b922323d39a357da5ee977e14a117fda1812ece91f33b06072cf49dffffffff0200943577000000001976a9142deeef21adf2cf1d0fc8cf31efcf11af2321595d88acba4c55c9000000001976a9148a10bf7df695647d408a07d765699d41280663d888ac00000000010000000830e60439eea77624e4b76424de72dc4345bad8e76d807459dce817155c39973c010000006b483045022021771a95a44f1acf88dcc0ac8b50f1756a96b648e0e8b130dfbc762c90d61806022100f40b7d1b643acf3b73ad32af99215fb8154cdd05b85d1d080fec154f7eefddb00121033779d94eb445e945e3c3ce7c815359e48a946dbf313b0375f979affd48d01fb4ffffffff5c506722bb545a465580685aeef32954da84574af3b805afbce40fac86029a5a010000006b483045022044b6c1506abf9823213034aea8c84f49435b1ac559bdc0bcd6d7d9f1d4b53207022100e22b75114b911a014cd42a24e243a42b22ee15422ef61cab61072ca547a9404e0121036774ad1017adb3fd13a756d7c76ad15c1dc49f37b71ea516c7cf93bbbd263c3cffffffff6afcf22f0f2db24119f4c3ddefee090be003430b72232170b8f3ab6c507074c6080000008c493046022100e36e614f3ec699fb3ecc9b7e496ddde2c91c583db9c6a64b94e46722d0e2dc22022100c55c3d38f915ecf046041b6e4594cddf86b27c5d83d7b291cb9815d58d33e7620141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffffd0dd3a135633b1430afcd03e950dae8cacb097f0b8611b141124c057ddadca5a060000008c493046022100ec08de1e701770a39203c7063f8439e9f44fcb523b3c0aad33fa96d7a5e56988022100a36e1e438eb9b1856e9e03b7b783e1b1275045043f9aae10be42ab98e2428e6a0141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffff9358deef5ff9ba99dc31189630f768cb4f879cb5764f587f71c1ccfd85ba51df150000008a47304402205536e7eee100668ec379b4fc39f1f33ada52b35514c0357d9df8a18750f675240220484100a77b44fd0c11ade5080e276558c3f9e23cc026539c86be1af30bd4e5720141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffffd7f1a826d5cc65f19f91c0ec6fb84053e07683d6b115b4daf3b6a96548ddb0d2050000008b4830450220515a77a326e3e244b25cf9ba3baeb8636aad3bc2752a13c58d4792f65052c5b3022100b5edc14a0e2939dd3c0e352748513df88ca916aff9ea229cb0dd46f2d541ebb00141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffff3cc94bda0348772bf4dd971f7f55a44f8131044fd92213d731dc2f5b4f2262b3000000006c4930460221008135f2ef5ffd16bb7d108cc71ebd23350933b479a73b9f48e2d682990fff5d29022100ac5a830a573e213dbbd4631ada472d523dcf64c072b58fbbef07613834430d93012102166b3359503760d953e25a996b1edac224b307d126392b2ac72a45105958891cffffffff5d6713f106f331dad761116e5550fa4ae73ef53a86e0542d9f98835cd9172d5e040000008a473044022006ebce6cb99658d714e226b2e941e490a32be41eb06fa8bc0ba824ea4cedf3c0022062bd83669800bd7ff0ac29b23fe5853cb61d633edb200af813a9d5cdea3e53da0141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffff0200c96c4e170000001976a914e03b2b3d04e726d27a442d5421ec94decd16014888ac21371600000000001976a914803a518d40f3c7eea80fe8a1501a81f1d21074e488ac0000000001000000024b88e1b58dfa49925b1ca091e7d1b8c43d546abff36c9f41e062aa2ec8b3b22d010000006c493046022100fca35a551d811f047d7bc8d2c96c48fca7425fdc56c23aa88f1a5d3e8dd590ec022100a7ff992c9eb3fbea30de1f98444b3855287c608fbe549e847d295c24c461235e0121030182db728d46cb7e09bac5ea81607f412b71d960e9337a905ff27ca46cfb2f6bffffffffeb2c6f0507d80ed63213c0dd699926f300c87c4e61aa7d075206b1c0b3dead8c000000006c493046022100b7a2a3e62f84521b76f0229009327b6d532805d865871a184955a3b608c8ef6a022100d64a49c81dd3063f86ea82190074bc33953ec8fb40b22267bca89e01578710cd012103bb3381cb1421d7c77193a25b80c978c8badc3a4bc4a9d6fa4450aae0ff77daa3ffffffff0100e87648170000001976a9140c5c994d75cc4c188c11dbf406a041f08344727688ac000000000100000002edef21f2e6dbd1da2ee5371bdfbe9290359002cbe6816486a520873be909e6a6000000006b483045022100b0c043dc01eeb9dcf3851e8b41a101a01626b0c0d9ed051acc1822fb44b7818c022042752baafbfea2d8311577aa1c96582280904130c9df864c3428551ef6e4454e012102184363f5cfdd6138a5e574dba3fba87583d0073252e23542e572f284dc29d25fffffffff8e869d76156f8b545ccb31ff5ec09b4746bf6412a0a1e1c64d0f956a1aa851f7010000006a47304402204d1520941c1eb5cbd1f21a7d3a583c6ee240600faeda6ef5f881ba7a80c519cc02204e327651ef12d337176a324d52aa8a83b9511fa0dbab436c9995a5fec2e7778a012102184363f5cfdd6138a5e574dba3fba87583d0073252e23542e572f284dc29d25fffffffff0200205fa0120000001976a914aa72ef734a5414fc4249fcc4aee8a3b430b2892e88ac00eadd8d040000001976a91472285613b3fd6a077445991cad0046969ba5a62788ac000000000100000001ab6d5cb4ff11e8cdd710c403a8d33e5c3eafd87d7185879818b063f7efb8548e010000006a4730440220554a6519fe2755db4c1a3310574cafc0601cde7a424c898d86b43d1732a6b566022038ec16a38b8f7c69effe12c2c1eff4a29895ed446d173b32c65759b8161f09e0012103b8c8e44691a1811f355dc610fd322028e1f6937a2a5d32097e891dae605b810cffffffff0200e40b54020000001976a9143824aa2f78626ad32d3d6fc23ec0bf1380df4bfe88ac008dbce3180000001976a914c24e84b87e6ff62318799e2d86969b1cb3a5a68f88ac000000000100000001cdbee0abc61024d2d9d40e7119d73d5770203d7415b7297811a7e9e102ac5520000000006a4730440220648eb9b8160073b298fe4f5e3ce044c6b78665bd739fe44defc618ccfc839ec602201fa37293e3a466e746b690c9688bf97a6cc74572dcd4ab632750705574939025012102a8a7f85c202ea64ac08fd248388e60f62688d0505ea7210d7a36cd6d00ac3648ffffffff0236d96447810f00001976a914bbacd0ef6d81ba9910e2c8428041a65442a370ea88acc5973993240000001976a914ac0b37041f4e2b6337aee944364a614c942ac4fc88ac0000000001000000010591e2ab8b8a503aa69bfd5688862cee828d43c14c09bcd78e3920ba2fa37f18010000006a473044022079b1d0f7f649b8e5e8634f7deeb6482a57b0af090770e061b2c8d1cfba71cc3002203ce0560db5aca86716971b11fb9b03723d90272a49376d78ef0ecee7dff810e40121038fa4eabe1d7463d13d6c86a92fcc3e8000473adc41cb07c372ba9e06a3f43194ffffffff0280c52d8b010000001976a9143c4d481aa7776cc867de67143b9f9df65a445ff488ac8021f416030000001976a914706631056aa360576922550a808c268cfa578cd988ac0000000001000000013ac16d8d789c616a9908d1b2d8405c49594dd76f85b0102fda9cdaa2600f69e9010000006b483045022100e86e4db2ecd8e13333c6c6ea53576f9f66c19c7ed9bc3e4e62ad37a3fc89caa4022057d05333637ea5b9d76df538ce4302f0798f6e5d1e48d49eaba5bc629c1d41f2012103d7c35f0c7c24c510ba334ae5f3f7d86e5c0af94b8d2ccd7adc052b2f7e1d6b4dffffffff0200b1bcdd040000001976a914c3fa20522ee60c30e8e90f0d508336d49655823088ac00943577000000001976a914ae3d035ba09bce98918bb13021e650f1dfb3b08588ac000000000100000001688cd393eaf5aea8516e11dc5f395a449bab1ca6f5c6fc679cac6bd781d5d85d4c0000006b48304502204ce49efb622982dba187c0767c163560fd272f032470af9b1f7c0de04120b783022100d108d2f2878c78d5a4afcb4a1259310752f648e5383e10bec24cae296a1ab4ad012103979d6d85a49d18deb678c3dbfd9ec73a82ee61971c08e63d2e4db37361094212ffffffff01bdbe798c320000001976a9147936b878100ccc012d4eecc7124accc6774078de88ac0000000001000000019cb1fb0be32828d9a5fb4d8d2cad34e1d351a1a5990692c09fc9522f3c788d52010000006a47304402206a3fbe36f6e9c09ca3e6920cc5ec214950bec7db3144c407c8d58f0c7b1f05830220585881d965f59e53e9e5b83c3617c10595e7d362ebf7e00c0ba8bb3c2c102e100121023134cc9962bd55c25349192e30686f7e06b1e71effb83ea98bc142ab71d4976affffffff0100e721a2040000001976a914d68cb846739bd68d4bfe6346ca0e7de32268af8e88ac000000000100000001a42ca3dce24910f351f385912d8a37ea87cee8917ad4a90a95ccccd193405e13000000006b483045022100e1636331779607619dab8254b599f7191d5c9a1139529f38a8a7aefc406a152402206ae7739b822c205ae044507da67b6e356688841d093ec87d76cc60f7d223ff5001210318c5bd2030e074abc39f5b34f3642500dd2f33eb686f78983fb639417ad0645bffffffff0220b5a664310200001976a91453645d0ee901a62b5b91590c6cda95e42409cbe888ac80f0fa02000000001976a91488a65118c4d13c1a526f4de4fff41b9b35d816cc88ac00000000010000000184b219412d00a2e9431f60de222b1a96f4edf2f4c886bf7d5c2e226f4cf2f367000000006a47304402200aea45983a1b2fd6d3c521b9dc8b9b7a90f11f68c4beec7eacb755125c1074c5022054a938bfc624d5b7c0f74bf4eff2620babf41739675786f8f95f9ea2f89ca15901210210afe85ead8d32a4f338cc9b5e3ebe7e68fccfa1b05ceb846d51174bb6e5c8b8ffffffff0200cce06ccc0000001976a91485648c7c54342b76befc69a7f6a02d0b7e3c047988ac00e1f505000000001976a914289888fd9f4d032d43aad4485d5dba6b931834e988ac000000000100000001de633d4e614214b2c4f630f82f78cbf01cdbdb31265f99480204149a0d736dbf000000006a473044022068c5edbae3e6626bc7da3029d0df0cd59114ad5d2e8533f4f26439251361d88302204a940ea94bebb8e9d1d93822fa23e11c23037c7971f36b3b3e839aa243d4e2c3012103a93d999bb383a6bd9cf802101b66245e2c6cbbce302ac964893a8e7f187e9461ffffffff0200a3e111000000001976a9148849b263f7d808f2fc97241944b94f2849b2601488ac00b5cab32b0000001976a914a6f534602558d53a1aa3ed98bb8816ba3ceac02088ac000000000100000001d9b3c3b27f52d72e93c88e2bdf54ddfdb27027119401eb0c33a4b17b0640e2c0000000006b48304502203747cb4c101b4b2b8d3815cccd9baeefb36cea2f595e6306db56b242a08f74c2022100a8f83b573154c23f82f8d1ca002fb10fe8c55033ae86625d6a1644a9b00f27fd01210316d1f584e2a315261fefb1b1c77cdc22eecc4e34244ff46742100083a4a62498ffffffff0282fabeab080000001976a91412ece6e9180a15251177f66e39f0dca7fe1947c688acf3ba0401000000001976a9140be8cc678017ea9c9eafeaac63ddfa31fc2136e088ac00000000010000000168423f1633c4f503cc0971638c89e00f453dff809b11aefe65e48db83869f348000000006b48304502206dd4ecf7e1c79cb139b8bf4507f48f1bd5a3ce207ec10807496ca7a7dabf4526022100ba0a3b99eba4e0cb86d175fe82873b165b2f06f65663f43929424e6632d561290121021bfcc1615687c72e64cc9d06f57501602a09a3e8e612cdc9a66bee2668f3a3a1ffffffff0261c7bcae070000001976a914a24be5ff2adcb5fc0c5e360b553ceb22a425a64b88acbdbd174c130000001976a914d690e204b63c98c0470b2b7ea3367ba109719aa088ac000000000100000001f12e57c8b3456b9dc8a7403938a2822a57843fdb537543a73332d7e5e78f85f7000000006b48304502206978be3154ae94d58f6abd4cd916bce8f587d53f1646868463edbaaca82ab6c7022100cdd208ea5bfcaabfe37801a5fd29cd83db2e2ae28cf4a229fa1fa58beadf90860121036a59c0bad2fcda23a69c78adea325b58466ca59d5126bcc69faea043beaa1e25ffffffff014a2a95c60e0000001976a914e2c4c95cdb866f579f93977d668de345b8388e6a88ac000000000100000002acd75dffa180f9fa929653841e9c61c8553d067d00ea9a7141dad6880984a63f010000006a47304402206513136d876906f9917998e344cb080473e441c0be2b59900dae0221b04d077a02203409c91aae44643cdd98da8597372d53edd019af6936974eb04b292d53848b27012102a9bc6c4bc078f805cd1c7aca4404069adc7717879ebdd679ee1a246c7e6f4bf3ffffffffd19f37347a4549891e3dfd0e7eab911d9e67196ddcbf41502ffef1773bd7a98b000000006b48304502203d3f097f0eeea4f998347d842f564dc9e3f5d0612b4dbff3bfb84298814484e302210086e60299707e98f069aa99f9f05e1494b3ccae4e1cdd1e62c36dbf6a6049d27f012102e8d9f3ea4da6cb2dd65250fe694c94bf27788a98d5ef6b02e62da5f0bb6ab20bffffffff021d29473a000000001976a914af0f58fc983699ce76cb6ef18fc271dcdfb79ff588ac00904e5a030000001976a914fb1a23206fad89723d855e5a80ccb9daa149244088ac00000000010000000133a2e5e307a65f0345ea33901d307f63000139b3132a288d9a66016a8bb0abb8010000006a47304402200c66f408e869b1506f117c993d009df3b075a68b9ce4e62f1c92f783dcd860d702204b6aefac1539e90dd35b9c3fb0c8256a2f3c11c77c98c65121bfb80deba1f96b012102f7740849c2c6c4be311a1fb669e15b8af78bd201d15a4433d82d981724e3dfe8ffffffff0200eec1ee150000001976a914515ff6aef100b80aa0bc0f825e4197d398b4885688ac006d7c4d000000001976a914016b5977c4a98b00ce4bdd731d42896d3947149b88ac0000000001000000012371105379e58d8fa4d403ccd3d0bbd2f360e49e49d6fd81d2b94ca9aeba2290000000006c4930460221008210281a12b168f02c3f45e79996ff06f3aa7cfa25cf956d54c9bbc59403a7c30221008ac2008fe26f403d43e254c9ff4ef9534229bb7137aa57184e7e415354fa030f01210362027b5a4959973f0c005653e7bfbcdb557099ee42e9053aabf6138594fb2ebeffffffff0200ff0f270b0000001976a9148e6da23aea89b44790320e2821d77735b86d711288ac006d7c4d000000001976a91428dae9efa934162c0c4e17ea75687731eff374f188ac000000000100000001d0b5959c1487e2d4f3de202b52ce9286cba3060e3a8ebce06c735472d67bc813000000006c4930460221009fcf3285a07360f3fabd1306f66b1ac965e9d178ca9ceaf7487a292d96cc8792022100d74380ddb3da48f986ffb8b063124a97a79a1500f5bfd5181d97fb0cb026c7a3012102487c3f3cc9a5f443107c36fa06844b64dd8b23896d9491f6a6d698bdb511c8e9ffffffff02f00d7bcb010000001976a914318eced404c11e3c5fde840d5aaeeb9efc00c6b688ac005ed0b2000000001976a91462e9340893d0cf62a9e14eeed711e5764386f05e88ac000000000100000001c79ae575877f2670a88a53b8939c10ab6413c1ec6847f2381b9dd7d44f69bdde000000006c493046022100ed5787095d60824035f10043d2c218cffd7022f149bc6d0ad6aad7cc8a1ff7ba0221009a0fd8a6b9b74a2fba9b16da60061d5c44fd58b7e279ddc0bc5b604ada381d8901210369f29d6f5caac452d06eccb2899fdcd03ce385a050ab32c868ff29f7397eff68ffffffff0298bad24f040000001976a914171ff4c844a9eef6bb79cf374e684a70158e7d5388aca93bb11f050000001976a914a7124f6adeccce0e17e94f9a68161c52a32eafa288ac00000000010000000135a2a0611e0b326f05e48124e7a7592c0ca52a7f9a3efcadf03d74027a244018000000006c493046022100e296ff2f5a1b996c922c327c371b4e21f2fb40bdbba2f9b5befb5c74b09b9f8d02210091f07e275b035a784e4ed0a5c13c7836a90b52b739f2b3efcf47fab0dd6de59d0121038569c188cbc829f851ccda57a3235617c1909e1de2419c9c1169529b14fe0c00ffffffff0200d2496b000000001976a914b80be6e1a7bdd4b984bd5680db5179f7b645031488ac00410b38080000001976a914fc32581d33bd5eacda6158ea10cf4fd9c635d84d88ac0000000001000000038055caf093c8a044fa5429adfff3484e117fe4fe76cb27174d2b9d792b4fbb62010000006b48304502205ed4304d094741126acec996aff3fbca1c3ceac1d931886c5b9eb2575361df04022100a563593827d8f1e4d10f9cf325f51b901fc450adf0b2ff584ca4965ed1dbbb2d0121025916328cd6c38bf5f98693323158a4325fa8b333a215c2ae0b1ea4a92f673a38ffffffff8a1a976bcd51d0cf22b021b9803d7cbeb77a33e1a2dfc6ca4773320dcce7c8f7000000006b483045022100d446953828ddb670baa707ccb1ef9937d3e48660a1c90891f40ed983f71eaa0d02200413f37a60fd0cff0a99cd1e0a14d37c839e460c56771753d6f8fc99a6939927012102d7ddada145d1d5c081427f3913ce9f77e849425a2f2c4a4b66737b22a1c7488cffffffff7607d8257d5b492b8988e58186c00b6d214a401ae14105b7d9e89983fd33f584000000006c493046022100cf6bc9a14f631a69895662fad0e809e7afe4d1c11ed2c1348c40bcbc0aa6fe95022100c8fac9fbee9d8d6f637fcdcfb27c3aaa962bd80e9819bc5d64fceb078842bcd7012102d7ddada145d1d5c081427f3913ce9f77e849425a2f2c4a4b66737b22a1c7488cffffffff0280e06200000000001976a914841377b2b993ed53a7333b09856f1e02bc791ebd88ac00a3e111000000001976a914ab1b5cae43c1b925e0b89c2aa78494f1bc6f924e88ac00000000010000000181427281d6e26117258c9adb30b5d24ca412a73bb2b2613709c0af43ade44189000000006b483045022100d6bef6d56c92a90075e50ab20a0260e7e5fd5a4cec6d4943ef245bcb35df749d022013ad806ba85663476b7e0ee89ed0fa05ae2846932deeb620ff43e0d983f9a7ca012102c35c73eecb3f7498836706fab553a8a9881b5ab42ad1b726cac11a5e66f29e4bffffffff02a002c055310200001976a914605ab623319733a2ff3c7f749214cde3ab4cb05a88ac80f0fa02000000001976a914ed79e21df195f9701e91eebc2b4e69257058101b88ac0000000001000000016c873218e5dc062965e5a5179057cd27bf44c99abec60288c645f1c1c8ba9bfb000000006a47304402201412ad826f09485dcd32c11c521c80269fa077d1e19eefa828d40135e795b2bb02207dd7b8b4c065092e3f16038dec8676910aaa362d753416a3ef1600e24acca3b6012102d43a6e77148fa7584674817fccd77e564832bc623158b598ebde6812ef22b590ffffffff02a029c1e1010000001976a91445a8fb7e94982c104f1121d549c5f8d28df3ce8988ac603fa71d000000001976a9147de21cf2eb1b16f6b50dda20b9045d2ef729993c88ac000000000100000001246964d523055dcbd0e1844643ee90b05adadd1805dc5a8138e1d572109f1eb6000000006a47304402200f4874872c3f96659b59c63e219c7827e131242538ee58910ef7d37c7a440bda02200509d82aa2738a383f1f76f495ce37a20cc56530cd1139aaa009c4e4700d5f720121035f33520e83f96e1dfa8136e987471c906568959fa40ba8c0ca73a576bbe03b8dffffffff024054adf4000000001976a9146e782f433c0ed10dec2156fcf750da0f60f84f6988ac603fa71d000000001976a9148238d5ea6fdcec5b76b8792205be25b559386ac888ac000000000100000001c067ae3dbd1d8112ac2eee4e0a9455a035ff8079a57bcf035359f01896509042000000006b48304502200764a38588e468ee488372e49b111c2c060ef1dbb37bc5165216c2de7a799fe7022100bf5111c8c8f6098440513399abc45305404ab70b572feaec84379a193251c984012102ab2e8ebc9a14e3a2fea3a5dd1949a9c075664c2c57ab1b360a3ced60b5010e40ffffffff026cfb8e15000000001976a9149a41d5bc2ab936b2f6de2483cb0bef50169b6d9988ac00ca9a3b000000001976a91455c71f61392272e15347c027382677cfe67f5ad788ac000000000100000001262ed6364d4b45d407650a5374a37699b6c5ae01a70cfe034abe33c981f24b93010000006b483045022064f3cb97cf6af3a9fbb4f528b772c4486ce1050e560bc459e9d8756cbf2749de022100bfd821d47570fcbd01209f69c6b75a75c754f23a15ae9f365af59e2b88fc4f45012102b4ede20a853e1391b4a29f72fa1a76fc519ecd3b561d11ea8c0abfc638ab93b3ffffffff02a6e28d24010000001976a9149a383ebe681d88e0314d1dfb4f596dd17aa422bc88ac00ca9a3b000000001976a9147cb9e6d120be2bd152b748f8f590c926b47bf9c788ac0000000001000000010ee2653a9516e70405dccde6c2155514970fb6aa0d72b4145c844fbd929127ea000000006b4830450221009240281b701818e78f67bff775204071a9ea3215512acd8e7fff8886938cf257022043bb000937fd5c0cd99fbba19936731ec0b9a0b31c92742f62eaba2bd44625d9012102a296f5b4fd4e83cd78b5dc71e328b6ad97205f77137e26fa9c918f50ca29e71effffffff020064488a000000001976a91471f4bb8d47f4a0c0d0d87d091abb7405861e892488ac603fa71d000000001976a9141cd3b22d4ebb6f7d94187e4f7fedcea24cee11c688ac0000000001000000016d0c87bfbb6b049498ab2ab01f1bf492cf56daca99da882415c418d6700e1dd2010000006b48304502210096eb511d7c04a47fb8e2165db508253f7af87de4378a6830eb622a3527684df102203d9d823dea7ff0af1526dbb031f0dccbf520f6b294dd0c3993e05427f1c2cc2b01210214c0c53161cd86b81a01c8b12321a5f1fe8ab93b7b9ea0186fc7d606bbd03870ffffffff0200b33f71000000001976a914434608760e385a4b8d54178d41631b201c804e5b88ac008c8647000000001976a91445716aa96fbab4d30fe0355254a0954368d0987e88ac0000000001000000011d05c3c7c10aca998f5883f103e2f78f9e11e42f18d95618b782df333ea69a3e000000006b4830450221009b51194a564c121966444c476cf92b64c4667a152cb0c06875c01608924bfee702205b90d6837dd8814fcc2928d9d472521db25d5feaee69ee03e40852b75a6d57cf0121023732f8acf3eef3fea2226f2de4802b8d789d2b30909d4e9009c9d5138591605cffffffff027d9fd81c060000001976a914a5c1bad6b2e517d6df2ec67bae14e9ba77b5244f88ac057af088020000001976a9144bb19b49d47e77c216554eb718012ee1a8d58b7688ac000000000100000001e3789e9ae0d8271cde731c58f6ef02ccace4df32efa1d7aa9f719b07751a97e6010000006c493046022100c82f89daba81ffbfd05c5cb85a8238c7950e0ff6ef79994249552910eb77fee70221009f0e2c840e809d7414262c6dcb651cdaf030ff12c47b122b4409e82ef13823b401210389a12c3c8443c73ccbed2e2d529bea8edaf7a4efb8fa6c5b40d3ef68591f4ab5ffffffff0200fab459010000001976a9147ee2e69aa7226562024951cb09b15ae0520a06f888ac00943577000000001976a9144db9be540350646dc34fa78def8e04fed49d81ce88ac000000000100000001b36bf25e83b4e841acedfd08f6b81e7fde3678039a0fee8ea7cfc25b64341984000000006c493046022100a5ba6a649289c4bc5f21bc0bc0bba4b30ccee57197aead9eef44244c180bd6be022100cbb2a297103c85c434288bdd3196233231a763750e347f2bac212a10343e057e012102f4bb5a222354a9649740a8b8b300f3e1a0c7ade18a409bae7c2ea9f0ecac0575ffffffff027e04ed7ca70e00001976a914c660254bafe140f4a6ec8c248b61a5b7a427ba6788acb8f381c4d90000001976a914e0a032f63f59e7b7b9a79b9dcd7bb8121f672f3688ac00000000010000000113624b8e6c558c0b95645b5b4c611b6f07c4ae051eddd1470fc921878b158553000000006b483045022100ccdfdb7f9b45e5bf1d36b4963fa05714b0cb963e3f93d370f806166203904cd9022031d5d036bd92716e742756511a4be0ca85674f1d65cf8285eccb20bec9c09873012103d3e092b233a629befb6a2249024faebfddf944140f5403a7eedb3f011c47271dffffffff020c987287ec0d00001976a914c5207f84f009632513b304af1e69757f79d1df4588ac728b84efba0000001976a9143d9e306694eb9a55e00113a6f9b838392d15c71a88ac000000000100000001e194dd90db9b7fcf661327515006bd219636ae5b6dc23120146b52ffe508753f000000006c4930460221008e6cd035285d9434b47cca0a01d6ebb4898d1a04bf16a7ef53cdda2358283edd022100b95700890afea19b08a5b67a6bc13e85df5cce990b749e23f685986b4685076e01210273c7e637ceaa0f2fd102278d48c3d4cc60b4ba2ae24a3f5daed840e515757ed6ffffffff02a1f17efc000000001976a914110e90aa49171cc316e4d7876fed69fea686491888acc0f447ac060000001976a914c62cbb894e9889bf2898e902c57ecb79b2b0254d88ac000000000100000001a37afd10d48f0c5963c66f8b4ed5af4a546ecf2cdb8c4a1bbcc170de72df0fa0000000006b483045022100ceb7d06c357b3cf2b83f2bd50d0e498312c85e17344497193f77e020a3874afb0220296b0e6d0609c8469e7c7f8c13e3ef2212bf61ce04e898adb70348d45819eaa30121037b2e9c9fba6e830a2a12713f89ab42e87ca34ddd9a68b06768577b4f8d543801ffffffff026a9ab816000000001976a91465c5ba865bf8b0b533fb0be75856f51db71e46cf88ac3776d0df000000001976a91420717bf29cae8d800835d4a6621a8bcd92f24f2288ac0000000001000000015a021ed0fde77c37c49329b6dfeb629119710aa79706e18bd13bc89b34b17489000000006c493046022100f766c02b8be767b5e40ab2e5fca085b095883b24e76da75a7894f2134f85e2f60221008bb3fa3322b9f032eab5fbb9c3c3792629c5444a628e489bbef074507d2822bd0121039591af3b189bc9063110783ec97b1e061cd88dea2b374efcecdb2b4fdaf48d1affffffff02d8baa4478f0d00001976a9149fdbc530d583f6e0dc31e9281db0c9db39325e5a88ac34fcd7395d0000001976a914770d36fdf8a25cb438fed008540ae268e62addbf88ac00000000"); let decode: Result = deserialize(&block); decode.unwrap(); + + + let header = hex!("02006200ea6a8fa7756fe4205c4f810655fe46148060ad2a5b4a087d98c750b3d806f5541ecc424f9c37dd88e9f49408caa6294c4faf93cc79560effdb3c760233df7fbb1699fb532781441b650f3eb7"); + let decode: Result = deserialize(&header); + decode.unwrap(); } + #[test] fn validate_pow_test2() { let some_header = hex!("020162001b9db197bcb7d86e93991293f148f684e17efc6136e08b4688c6701f39d4403757dd5ccd9391273c118b600e0f497a04f3cbdebb7e6dbb699bae2fb17198d8f4b6aa8d5403f2041b0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5e03a9970a062f503253482f04b8aa8d5408fabe6d6d92ae1083b7b3c22fd7b4ce2eae121d518f8e1aa81d0be9432ce5aa20a2954fcc0100000000000000402a29636829010018393436383834322f6d696e65722073686172705f66697265000000000100f2052a010000001976a9146a2ca895057c3b94136c8776e731cece18b46c8688ac00000000040290bc699f9cc500b676c9a782b2cd398524d6279079b3b59a74069396f81602edfe7f3fe6cd4224a01fa4bb59f5254acff79e988aaebc994337cb6d33721547417823cbe436061e508eb64060c54981df9a87f03875f84d0b70457dab12d21600000000000000000002000000f7e6f6aff383b6e2bb1d7968ccca5b6ceeaeda130879b50f09f29982431e26afbefd1c78ab2711ebd12d4c6c6e54e3ddab8cf2d860283a6ca7452f9865d32c9c6daa8d54e12a011b57975dc9"); From b0f4f06d2274680ce879c652263f87a1a5602cc6 Mon Sep 17 00:00:00 2001 From: cf Date: Thu, 27 Jun 2024 04:27:33 +0800 Subject: [PATCH 11/13] fixed block hash --- bitcoin/src/blockdata/block.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs index 0913411905..d1cab9d166 100644 --- a/bitcoin/src/blockdata/block.rs +++ b/bitcoin/src/blockdata/block.rs @@ -152,11 +152,20 @@ impl_consensus_encoding!(SimpleHeader, version, prev_blockhash, merkle_root, tim impl Header { /// The number of bytes that the block header contributes to the size of a block. // Serialized length of fields (version, prev_blockhash, merkle_root, time, bits, nonce) - + pub fn to_simple_header(&self) -> SimpleHeader { + SimpleHeader { + version: self.version, + prev_blockhash: self.prev_blockhash, + merkle_root: self.merkle_root, + time: self.time, + bits: self.bits, + nonce: self.nonce, + } + } /// Returns the block hash. pub fn block_hash(&self) -> BlockHash { let mut engine = BlockHash::engine(); - self.consensus_encode(&mut engine).expect("engines don't error"); + self.to_simple_header().consensus_encode(&mut engine).expect("engines don't error"); BlockHash::from_engine(engine) } From cefb879f20e0ec85bad4fb474dbf57d8d28ce0c5 Mon Sep 17 00:00:00 2001 From: cf Date: Thu, 27 Jun 2024 06:34:36 +0800 Subject: [PATCH 12/13] tst --- bitcoin/src/blockdata/block.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs index d1cab9d166..18092ccde6 100644 --- a/bitcoin/src/blockdata/block.rs +++ b/bitcoin/src/blockdata/block.rs @@ -755,9 +755,11 @@ fn block_version_test() { decode.unwrap(); - let header = hex!("02006200ea6a8fa7756fe4205c4f810655fe46148060ad2a5b4a087d98c750b3d806f5541ecc424f9c37dd88e9f49408caa6294c4faf93cc79560effdb3c760233df7fbb1699fb532781441b650f3eb7"); + let header = hex!("020162000d6f03470d329026cd1fc720c0609cd378ca8691a117bd1aa46f01fb09b1a8468a15bf6f0b0e83f2e5036684169eafb9406468d4f075c999fb5b2a78fbb827ee41fb11548441361b0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff380345bf09fabe6d6d980ba42120410de0554d42a5b5ee58167bcd86bf7591f429005f24da45fb51cf0800000000000000cdb1f1ff0e000000ffffffff01800c0c2a010000001976a914aa3750aa18b8a0f3f0590731e1fab934856680cf88ac00000000b3e64e02fff596209c498f1b18f798d62f216f11c8462bf3922319000000000003a979a636db2450363972d211aee67b71387a3daaa3051be0fd260c5acd4739cd52a418d29d8a0e56c8714c95a0dc24e1c9624480ec497fe2441941f3fee8f9481a3370c334178415c83d1d0c2deeec727c2330617a47691fc5e79203669312d100000000036fa40307b3a439538195245b0de56a2c1db6ba3a64f8bdd2071d00bc48c841b5e77b98e5c7d6f06f92dec5cf6d61277ecb9a0342406f49f34c51ee8ce4abd678038129485de14238bd1ca12cd2de12ff0e383aee542d90437cd664ce139446a00000000002000000d2ec7dfeb7e8f43fe77aba3368df95ac2088034420402730ee0492a2084217083411b3fc91033bfdeea339bc11b9efc986e161c703e07a9045338c165673f09940fb11548b54021b58cc9ae5"); let decode: Result = deserialize(&header); - decode.unwrap(); + let res = decode.unwrap(); + let p = res.block_hash(); + println!("p: {:?}",p); } #[test] From ca2296ccf1a4d03810e0db1ca0ca7b3b1a34cdbb Mon Sep 17 00:00:00 2001 From: cf Date: Fri, 28 Jun 2024 05:03:12 +0800 Subject: [PATCH 13/13] updated --- bitcoin/Cargo.toml | 3 +- bitcoin/src/blockdata/block.rs | 139 ++++++++++++++++++--------------- bitcoin/src/p2p/mod.rs | 2 +- hashes/Cargo.toml | 2 +- 4 files changed, 78 insertions(+), 68 deletions(-) diff --git a/bitcoin/Cargo.toml b/bitcoin/Cargo.toml index dccef7f460..568bc791c8 100644 --- a/bitcoin/Cargo.toml +++ b/bitcoin/Cargo.toml @@ -13,7 +13,7 @@ edition = "2018" exclude = ["tests", "contrib"] [features] -default = [ "std", "secp-recovery" ] +default = [ "std", "secp-recovery", "serde" ] rand-std = ["secp256k1/rand-std", "std"] rand = ["secp256k1/rand"] serde = ["actual-serde", "hashes/serde", "secp256k1/serde", "internals/serde"] @@ -55,6 +55,7 @@ serde_json = "1.0.0" serde_test = "1.0.19" serde_derive = "1.0.103" bincode = "1.3.1" +anyhow = "=1.0.86" [target.'cfg(mutate)'.dev-dependencies] mutagen = { git = "https://github.com/llogiq/mutagen" } diff --git a/bitcoin/src/blockdata/block.rs b/bitcoin/src/blockdata/block.rs index 18092ccde6..de1d978205 100644 --- a/bitcoin/src/blockdata/block.rs +++ b/bitcoin/src/blockdata/block.rs @@ -51,8 +51,6 @@ pub struct Header { pub nonce: u32, pub aux_data: Option, - - } //impl_consensus_encoding!(Header, version, prev_blockhash, merkle_root, time, bits, nonce); @@ -71,7 +69,7 @@ impl Decodable for Header { nonce: base.nonce, aux_data: None, }); - }else{ + } else { let aux_data = AuxPow::consensus_decode_from_finite_reader(reader)?; Ok(Header { version: base.version, @@ -86,7 +84,6 @@ impl Decodable for Header { } fn consensus_decode(reader: &mut R) -> Result { - use crate::io::Read as _; let mut r = reader.take(encode::MAX_VEC_SIZE as u64); let thing = SimpleHeader::consensus_decode(r.by_ref())?; @@ -100,7 +97,7 @@ impl Decodable for Header { nonce: thing.nonce, aux_data: None, }); - }else{ + } else { let aux_data = AuxPow::consensus_decode(r.by_ref())?; Ok(Header { version: thing.version, @@ -170,13 +167,19 @@ impl Header { } /// Computes the target (range [0, T] inclusive) that a blockhash must land in to be valid. - pub fn target(&self) -> Target { self.bits.into() } + pub fn target(&self) -> Target { + self.bits.into() + } /// Computes the popular "difficulty" measure for mining. - pub fn difficulty(&self) -> u128 { self.target().difficulty() } + pub fn difficulty(&self) -> u128 { + self.target().difficulty() + } /// Computes the popular "difficulty" measure for mining and returns a float value of f64. - pub fn difficulty_float(&self) -> f64 { self.target().difficulty_float() } + pub fn difficulty_float(&self) -> f64 { + self.target().difficulty_float() + } /// Checks that the proof-of-work for the block is valid, returning the block hash. pub fn validate_pow(&self, required_target: Target) -> Result { @@ -193,7 +196,9 @@ impl Header { } /// Returns the total work of the block. - pub fn work(&self) -> Work { self.target().to_work() } + pub fn work(&self) -> Work { + self.target().to_work() + } pub fn get_size(&self) -> usize { /*if self.aux_data.is_none() { return 80 @@ -218,7 +223,6 @@ impl fmt::Debug for Header { } } - impl fmt::Debug for SimpleHeader { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("Header") @@ -233,7 +237,6 @@ impl fmt::Debug for SimpleHeader { } } - #[derive(PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(crate = "actual_serde"))] @@ -247,13 +250,11 @@ pub struct MerkleBranch { } impl_consensus_encoding!(MerkleBranch, hashes, side_mask); - #[derive(PartialEq, Eq, Clone, Debug, PartialOrd, Ord, Hash)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr(feature = "serde", serde(crate = "actual_serde"))] pub struct AuxPow { - pub coinbase_tx: Transaction, pub block_hash: BlockHash, pub coinbase_branch: MerkleBranch, @@ -261,11 +262,21 @@ pub struct AuxPow { pub parent_block: SimpleHeader, } -impl_consensus_encoding!(AuxPow, coinbase_tx, block_hash, coinbase_branch, blockchain_branch, parent_block); +impl_consensus_encoding!( + AuxPow, + coinbase_tx, + block_hash, + coinbase_branch, + blockchain_branch, + parent_block +); impl AuxPow { pub fn get_size(&self) -> usize { - self.coinbase_tx.total_size()+32+self.coinbase_branch.hashes.len()*32+self.blockchain_branch.hashes.len()*32+80 - + self.coinbase_tx.total_size() + + 32 + + self.coinbase_branch.hashes.len() * 32 + + self.blockchain_branch.hashes.len() * 32 + + 80 } } /// Bitcoin block version number. @@ -307,12 +318,16 @@ impl Version { /// Creates a [`Version`] from a signed 32 bit integer value. /// /// This is the data type used in consensus code in Bitcoin Core. - pub fn from_consensus(v: i32) -> Self { Version(v) } + pub fn from_consensus(v: i32) -> Self { + Version(v) + } /// Returns the inner `i32` value. /// /// This is the data type used in consensus code in Bitcoin Core. - pub fn to_consensus(self) -> i32 { self.0 } + pub fn to_consensus(self) -> i32 { + self.0 + } /// Checks whether the version number is signalling a soft fork at the given bit. /// @@ -335,7 +350,9 @@ impl Version { } impl Default for Version { - fn default() -> Version { Self::NO_SOFT_FORK_SIGNALLING } + fn default() -> Version { + Self::NO_SOFT_FORK_SIGNALLING + } } impl Encodable for Version { @@ -375,7 +392,9 @@ impl_consensus_encoding!(Block, header, txdata); impl Block { /// Returns the block hash. - pub fn block_hash(&self) -> BlockHash { self.header.block_hash() } + pub fn block_hash(&self) -> BlockHash { + self.header.block_hash() + } /// Checks if merkle root of header matches merkle root of the transaction list. pub fn check_merkle_root(&self) -> bool { @@ -492,10 +511,14 @@ impl Block { /// Returns the stripped size of the block. #[deprecated(since = "0.31.0", note = "use Block::base_size() instead")] - pub fn strippedsize(&self) -> usize { self.base_size() } + pub fn strippedsize(&self) -> usize { + self.base_size() + } /// Returns the coinbase transaction, if one is present. - pub fn coinbase(&self) -> Option<&Transaction> { self.txdata.first() } + pub fn coinbase(&self) -> Option<&Transaction> { + self.txdata.first() + } /// Returns the block height, as encoded in the coinbase transaction according to BIP34. pub fn bip34_block_height(&self) -> Result { @@ -532,19 +555,27 @@ impl Block { } impl From
for BlockHash { - fn from(header: Header) -> BlockHash { header.block_hash() } + fn from(header: Header) -> BlockHash { + header.block_hash() + } } impl From<&Header> for BlockHash { - fn from(header: &Header) -> BlockHash { header.block_hash() } + fn from(header: &Header) -> BlockHash { + header.block_hash() + } } impl From for BlockHash { - fn from(block: Block) -> BlockHash { block.block_hash() } + fn from(block: Block) -> BlockHash { + block.block_hash() + } } impl From<&Block> for BlockHash { - fn from(block: &Block) -> BlockHash { block.block_hash() } + fn from(block: &Block) -> BlockHash { + block.block_hash() + } } /// An error when looking up a BIP34 block height. @@ -644,12 +675,12 @@ mod tests { let push = Vec::::from_hex("a08601112233445566").unwrap(); assert_eq!(bad.bip34_block_height(), Err(super::Bip34Error::UnexpectedPush(push))); } -#[test] -fn block2(){ - let dd = hex!("010000009156352c1818b32e90c9e792efd6a11a82fe7956a630f03bbee236cedae3911a1c525f1049e519256961f407e96e22aef391581de98686524ef500769f777e5fafeda352f0ff0f1e001083540101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e04afeda3520102062f503253482fffffffff01004023ef3806000023210338bf57d51a50184cf5ef0dc42ecd519fb19e24574c057620262cc1df94da2ae5ac00000000"); - let block: Block = deserialize(&dd).unwrap(); - println!("{:?}",block); -} + #[test] + fn block2() { + let dd = hex!("010000009156352c1818b32e90c9e792efd6a11a82fe7956a630f03bbee236cedae3911a1c525f1049e519256961f407e96e22aef391581de98686524ef500769f777e5fafeda352f0ff0f1e001083540101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0e04afeda3520102062f503253482fffffffff01004023ef3806000023210338bf57d51a50184cf5ef0dc42ecd519fb19e24574c057620262cc1df94da2ae5ac00000000"); + let block: Block = deserialize(&dd).unwrap(); + println!("{:?}", block); + } #[test] fn block_test() { // Mainnet block 00000000b0c5a240b2a61d2e75692224efd4cbecdf6eaf4cc2cf477ca7c270e7 @@ -733,41 +764,19 @@ fn block2(){ assert_eq!(serialize(&real_decode), segwit_block); } -#[test] -fn block_version_test() { - let block = hex!("ffffff7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); - let decode: Result = deserialize(&block); - assert!(decode.is_ok()); - let real_decode = decode.unwrap(); - assert_eq!(real_decode.header.version, Version(2147483647)); - - let block2 = hex!("000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); - let decode2: Result = deserialize(&block2); - assert!(decode2.is_ok()); - let real_decode2 = decode2.unwrap(); - assert_eq!(real_decode2.header.version, Version(-2147483648)); -} - -#[test] - fn block_version_test2() { - let block = hex!("02000000be4ed111b4d13733bd0a245ee73d1233830e9075430e9e6c78fbe18f93a0ac12de14a8b25fc21e4273919d5ddd4bd60731663884fff22ee6bed10261267c75319d86fd52eb7e261b004821843101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff2303a08601062f503253482f049186fd5208080030c207000000092f7374726174756d2f0000000001a8f80742a91f00001976a9146209ed8017ee7c7efcfccb5c971ba58a951749af88ac00000000010000000116b362b652c601435f94a6ecfc6c71a1fd240d58f5e4443cc6f3f31f7eae500b010000006b483045022100ca9176c3eccd6ab443b1259698c35a40f8274e5b87222e2a69a1d1937398c59f02205390042fa802df9a26923e6d972ed837cb7f297e307cb84a3cdee61c8d6f3a08012102f8ae61694000cff50ae14e80994c34fa6bb672d8503e904adc0f43dd7ec14f04ffffffff0200a0724e180900001976a914101f0445d2cee10c1f820dac0fdab961c35c594088acf2e893c4a45801001976a9146026526eeaff25b0dbf335e95241ff7ff990a59888ac000000000100000001d405cda6ec490b6189a09f22d3fa68795b91563aca04a91aa1964b70b2a0a674000000006a47304402200ef30fb2d38f4f28bcee60e9e5f9b0d45a09fc908ddf459eec231d128a2f14540220683d7eade3a0cce01ac986eed294cf8644cf0689ae67823853dca88591d98cdd0121039e8e4887fc41bbf3c2384548391b76e3e43ab8880416947f640b11fc665cbef5ffffffff02ce25bc125bd406001976a9140ca60499e9ccf01717dfd7a9c40f7bc8226a448f88ac0ff005b3520000001976a9142ce991b0fa2bb82b085382685c90b8f7f19513db88ac0000000001000000013f263cc3b5077e90920396055357b2d44535b222cff61579211cbaac51f388c8000000006a47304402206b12cd8abfea1a24cf90136b46f57d39cf0c826a5ec070296396ea2bc2c13152022054bf823e9dc35cb09867736189f31df1f51ce4cd6fcff06be51db8ba5e5ffd8501210287614929460d7acb7aef3b11194fff34e20d6253842d1f73e535a4fe7b5f70dfffffffff0276272c6fa30000001976a91427691601ceb91d590c42d52e6e90868ab2e5f23588ac00e87648170000001976a914ab215e1613facb3a426a4f553e6c7b20b58bf86088ac0000000001000000020045a1d9128ebf682cccae605df74316eb1b2644f656143866cad5f1ceebd99a010000006b4830450221008e71a618a5c424667664b52401fd42c2ce38f41b29a9250d72fa3781b1b4585c02200cde3f5ad65e61d5a8e792a2cd6f742ee0a8d08d6a194293b92940d85285cb080121030e2247d028860a11b4ca970f81dfac88a0dbecb44d4f11100045ce365b6155e1ffffffff33fafe002f76a2ddcb1862762eb6bffd75ad8d549277bdb047af211153187026010000006b483045022100f39be19e4786c4da61e58b46812b56e8b53ccb533a7dddc7695ae82ebb1e2bef02203fabde51827acb8fc918df241c02856bc3be01491c2aea9f07f4ea19aa78e2a40121030e2247d028860a11b4ca970f81dfac88a0dbecb44d4f11100045ce365b6155e1ffffffff01c1d2c57fec0100001976a914cf4f2986e58650a5acece7c81a56a374c9c5170188ac0000000001000000016b3a866916195b44b1ef1eeca6bd42444d30bd801653eae356827286d7170732000000006b48304502210095052e425fc05be614f6312bdcd8acb7ada011a1d3575d5dbcdd203c4ee09e6f022001f66b82f8c59c13a60f6aa84f5a991dd54cc47a89d189326e813665e7e7cb6e012103db50768756c7daaa9096e537afe542415da9649668023c26b9013ccb04a72db2ffffffff02711af552470e00001976a914301ab2c3a86972dee0bc2250be7e1e4f3f55886388aca3dede6fe20000001976a9142f119fccae2f2ea71689280aeec457b10fdd6e4488ac000000000100000004c61f35d758b2dd4c8aa93161a7e6597b078545942219c9e1eb9d2560206a385b010000006b483045022100d758b832dd4a379ca2ce15f23ea42263b47608e483316ee7bad9153ac7a9e2f202205ab6e79d3147042945e6e1710fd0c571b0a7b9c606a257f34bfbec8d1d17786f012103557da6fd76f671f830b68f9d52976e720dde17ba43c4d09575c017f6bddb3971ffffffff3b124474a1f49e26b62314d1ae2c72222b6a2022191b6733989382a844d386f6010000006a473044022036de6e36f40a8db90e565fc398b463742d6e6751b6c5eb758563138f4a063e3a022078234eda7e829eb9458c7ab35a210fa47f1355d48c61ff5cfb31be7e42ed33e001210303911d4a1c0ad1530ad241ca2caab9038b21ed86055ac940ea58e5634c385501ffffffff5b953461686be8fd321b14f90ec8f3bc5e1b83063e2bf2894345d4a90aad0022010000006b483045022100d98d5f9dbec259b2fce4e9f8201b07f27f4025853beb331be91e1704e304b2ba02205808df049a59145f9526cc37cbed772468e58c3d7bc50a37c752456681c7bfd501210303911d4a1c0ad1530ad241ca2caab9038b21ed86055ac940ea58e5634c385501ffffffff0046dde73f58ddeb824e8997f39a1b417bb45d5f69a16e57d65830cc0d3bd8a7000000006c4930460221008a2dfb6cdaeda83eaddc3e4e79b5f5a4b63b813470f7cfc1d4e380f0d45a5dd9022100e05932debf59fceebf7d0fb3b55e50eaac1746b2b3ed27a3a446d92579937143012102e3c99ec61db654fcb1829fdfb707f475b501829a945fe46d994db2cc24fd9b10ffffffff010012ca97310000001976a914c737ab4785a1e88d8b6152e7207fc3372ff61ee088ac0000000001000000012a3acddcefc9eeec8c3e3ad2842d8d1bd45285a89f30602b115678fba2ffdf0e000000006a4730440220263463850fda3f7e45c1f0926c0d5b9e16bb4fd5535eb8c23b77363f673973d702202b93f4623898f4e066e05077c6bc13e9122c427de55a329f54521927d9e6ee6a0121034bfaa8a15fe5d3384352580f1a84f7f49924115af4a7c8b02da899047c2314c4ffffffff02b61ffe532f0c00001976a91423c97abb9080b029155d4634f988783a00510ddc88ac08e2c7e0060000001976a9149b65a61c3413185d315ff12f326a9c3ac8a4debd88ac000000000100000001776a633c641b3ad5632bfd32acd0301c6686229b915f3c842b1cc24220804853000000006c493046022100e82121319e327d1070bd1b8afeeb060e88cbe10bd468d228dc77bb506f8b661d022100d00a705efd8265ef18113acf35ac9fbb46fe113902828e1d72eb4bcb9bdf7b6b0121036eb7d2dabc6560354251f252a51475c5ed559830681ba0838d89d494282d0c79ffffffff02bda713e9815500001976a91442f185de5643d0e4653d9f50b54eec6d016769fe88acab5dc8623a0000001976a91495e2bd1549e434d9528203966aed9f00ca101dee88ac00000000010000000186befd244b4ac06a0c93f3c84b31ffe8364aa270c359f49c24a27e38aa37542d000000006a4730440220401773baf69df3b93fb0b51c82b2c05e39ea665e3302d060d1005368a06143c102206535d87af7aed9886d68682b082a408e52f41ea1a92d4aca90cec83610af8a9a012103aa2c2048bf90b9a2de755412c6b0c0f66f21dc76cc14bcc4f64cacc3e515c4bdffffffff02ae70d1b54f4900001976a91450008196da21b76532b492ab97dc991456ad179a88ac521d8077260000001976a9146d0bc9d3c908d759b0e0a59a5c26d69e37256c1f88ac00000000010000000137ed67ebea136256834f48ffed22e469cf5e5659d52227ff28a5213482defdb7000000006c493046022100907a2c31acd9ed8cab0f2b8c94249d1a5bfd06c01024cefddfd2225f967d32ab022100f9cb99ddb4edc5eebe70d5f5588767a978e21a7fb8c86c037ed6c1ef83e63de20121038cb41f889e7658adee33cb1d8ec5f9586424ed2a4b92e56373e756b1aad300aeffffffff02a4ed016fa20b00001976a9148841590909747c0f97af158f22fadacb1652522088ac409d1a9c0a0000001976a914efb6158f75743c611858fdfd0f4aaec6cc6196bc88ac0000000001000000015ac6959f5f8e0d14df1c45da8567d0a2dc4cf682431359cab2a192c81a854e3f000000006b48304502204f4132692261b237ed877b76a722a7e58d48e9157f013fbba6f6adc6944e83ce022100a0a64c156aabd409fea754d225a8c16e6a2a2920b1b6b3f01162734e160dcd530121022b9fafc77f470ed11756a82e4d27dc8229196779525b73aa170d0adde7ef050fffffffff02008dff52da0900001976a9142f6c6ee207403395836335e4460e96e7f583701c88ac00b080f6450100001976a9143eda58dd12a5edca008ce105fe3847f96016f17188ac0000000001000000010daae87a56b318b250d9ae5c59573cdc555c5d1e73a2b6840b04755c1c2aba22010000006b4830450220720793be4b7812a7b4b7ae6dd75cf37da09ddd4630debc09c34bf95782d16bdc022100f5f609629a559bcd96dcf82cb1657aa6374af78d3114c2f57d9f6fb204c97718012103c584550e0b922323d39a357da5ee977e14a117fda1812ece91f33b06072cf49dffffffff0200943577000000001976a9142deeef21adf2cf1d0fc8cf31efcf11af2321595d88acba4c55c9000000001976a9148a10bf7df695647d408a07d765699d41280663d888ac00000000010000000830e60439eea77624e4b76424de72dc4345bad8e76d807459dce817155c39973c010000006b483045022021771a95a44f1acf88dcc0ac8b50f1756a96b648e0e8b130dfbc762c90d61806022100f40b7d1b643acf3b73ad32af99215fb8154cdd05b85d1d080fec154f7eefddb00121033779d94eb445e945e3c3ce7c815359e48a946dbf313b0375f979affd48d01fb4ffffffff5c506722bb545a465580685aeef32954da84574af3b805afbce40fac86029a5a010000006b483045022044b6c1506abf9823213034aea8c84f49435b1ac559bdc0bcd6d7d9f1d4b53207022100e22b75114b911a014cd42a24e243a42b22ee15422ef61cab61072ca547a9404e0121036774ad1017adb3fd13a756d7c76ad15c1dc49f37b71ea516c7cf93bbbd263c3cffffffff6afcf22f0f2db24119f4c3ddefee090be003430b72232170b8f3ab6c507074c6080000008c493046022100e36e614f3ec699fb3ecc9b7e496ddde2c91c583db9c6a64b94e46722d0e2dc22022100c55c3d38f915ecf046041b6e4594cddf86b27c5d83d7b291cb9815d58d33e7620141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffffd0dd3a135633b1430afcd03e950dae8cacb097f0b8611b141124c057ddadca5a060000008c493046022100ec08de1e701770a39203c7063f8439e9f44fcb523b3c0aad33fa96d7a5e56988022100a36e1e438eb9b1856e9e03b7b783e1b1275045043f9aae10be42ab98e2428e6a0141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffff9358deef5ff9ba99dc31189630f768cb4f879cb5764f587f71c1ccfd85ba51df150000008a47304402205536e7eee100668ec379b4fc39f1f33ada52b35514c0357d9df8a18750f675240220484100a77b44fd0c11ade5080e276558c3f9e23cc026539c86be1af30bd4e5720141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffffd7f1a826d5cc65f19f91c0ec6fb84053e07683d6b115b4daf3b6a96548ddb0d2050000008b4830450220515a77a326e3e244b25cf9ba3baeb8636aad3bc2752a13c58d4792f65052c5b3022100b5edc14a0e2939dd3c0e352748513df88ca916aff9ea229cb0dd46f2d541ebb00141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffff3cc94bda0348772bf4dd971f7f55a44f8131044fd92213d731dc2f5b4f2262b3000000006c4930460221008135f2ef5ffd16bb7d108cc71ebd23350933b479a73b9f48e2d682990fff5d29022100ac5a830a573e213dbbd4631ada472d523dcf64c072b58fbbef07613834430d93012102166b3359503760d953e25a996b1edac224b307d126392b2ac72a45105958891cffffffff5d6713f106f331dad761116e5550fa4ae73ef53a86e0542d9f98835cd9172d5e040000008a473044022006ebce6cb99658d714e226b2e941e490a32be41eb06fa8bc0ba824ea4cedf3c0022062bd83669800bd7ff0ac29b23fe5853cb61d633edb200af813a9d5cdea3e53da0141045d3e839d9eabede7593c0d89536f07904362dcbc2aa5cfeaa83aafa8ea9589a87bea418925a3db2f177b9c69d4fe48ed07b6960871e63828889e481a1e9c9a93ffffffff0200c96c4e170000001976a914e03b2b3d04e726d27a442d5421ec94decd16014888ac21371600000000001976a914803a518d40f3c7eea80fe8a1501a81f1d21074e488ac0000000001000000024b88e1b58dfa49925b1ca091e7d1b8c43d546abff36c9f41e062aa2ec8b3b22d010000006c493046022100fca35a551d811f047d7bc8d2c96c48fca7425fdc56c23aa88f1a5d3e8dd590ec022100a7ff992c9eb3fbea30de1f98444b3855287c608fbe549e847d295c24c461235e0121030182db728d46cb7e09bac5ea81607f412b71d960e9337a905ff27ca46cfb2f6bffffffffeb2c6f0507d80ed63213c0dd699926f300c87c4e61aa7d075206b1c0b3dead8c000000006c493046022100b7a2a3e62f84521b76f0229009327b6d532805d865871a184955a3b608c8ef6a022100d64a49c81dd3063f86ea82190074bc33953ec8fb40b22267bca89e01578710cd012103bb3381cb1421d7c77193a25b80c978c8badc3a4bc4a9d6fa4450aae0ff77daa3ffffffff0100e87648170000001976a9140c5c994d75cc4c188c11dbf406a041f08344727688ac000000000100000002edef21f2e6dbd1da2ee5371bdfbe9290359002cbe6816486a520873be909e6a6000000006b483045022100b0c043dc01eeb9dcf3851e8b41a101a01626b0c0d9ed051acc1822fb44b7818c022042752baafbfea2d8311577aa1c96582280904130c9df864c3428551ef6e4454e012102184363f5cfdd6138a5e574dba3fba87583d0073252e23542e572f284dc29d25fffffffff8e869d76156f8b545ccb31ff5ec09b4746bf6412a0a1e1c64d0f956a1aa851f7010000006a47304402204d1520941c1eb5cbd1f21a7d3a583c6ee240600faeda6ef5f881ba7a80c519cc02204e327651ef12d337176a324d52aa8a83b9511fa0dbab436c9995a5fec2e7778a012102184363f5cfdd6138a5e574dba3fba87583d0073252e23542e572f284dc29d25fffffffff0200205fa0120000001976a914aa72ef734a5414fc4249fcc4aee8a3b430b2892e88ac00eadd8d040000001976a91472285613b3fd6a077445991cad0046969ba5a62788ac000000000100000001ab6d5cb4ff11e8cdd710c403a8d33e5c3eafd87d7185879818b063f7efb8548e010000006a4730440220554a6519fe2755db4c1a3310574cafc0601cde7a424c898d86b43d1732a6b566022038ec16a38b8f7c69effe12c2c1eff4a29895ed446d173b32c65759b8161f09e0012103b8c8e44691a1811f355dc610fd322028e1f6937a2a5d32097e891dae605b810cffffffff0200e40b54020000001976a9143824aa2f78626ad32d3d6fc23ec0bf1380df4bfe88ac008dbce3180000001976a914c24e84b87e6ff62318799e2d86969b1cb3a5a68f88ac000000000100000001cdbee0abc61024d2d9d40e7119d73d5770203d7415b7297811a7e9e102ac5520000000006a4730440220648eb9b8160073b298fe4f5e3ce044c6b78665bd739fe44defc618ccfc839ec602201fa37293e3a466e746b690c9688bf97a6cc74572dcd4ab632750705574939025012102a8a7f85c202ea64ac08fd248388e60f62688d0505ea7210d7a36cd6d00ac3648ffffffff0236d96447810f00001976a914bbacd0ef6d81ba9910e2c8428041a65442a370ea88acc5973993240000001976a914ac0b37041f4e2b6337aee944364a614c942ac4fc88ac0000000001000000010591e2ab8b8a503aa69bfd5688862cee828d43c14c09bcd78e3920ba2fa37f18010000006a473044022079b1d0f7f649b8e5e8634f7deeb6482a57b0af090770e061b2c8d1cfba71cc3002203ce0560db5aca86716971b11fb9b03723d90272a49376d78ef0ecee7dff810e40121038fa4eabe1d7463d13d6c86a92fcc3e8000473adc41cb07c372ba9e06a3f43194ffffffff0280c52d8b010000001976a9143c4d481aa7776cc867de67143b9f9df65a445ff488ac8021f416030000001976a914706631056aa360576922550a808c268cfa578cd988ac0000000001000000013ac16d8d789c616a9908d1b2d8405c49594dd76f85b0102fda9cdaa2600f69e9010000006b483045022100e86e4db2ecd8e13333c6c6ea53576f9f66c19c7ed9bc3e4e62ad37a3fc89caa4022057d05333637ea5b9d76df538ce4302f0798f6e5d1e48d49eaba5bc629c1d41f2012103d7c35f0c7c24c510ba334ae5f3f7d86e5c0af94b8d2ccd7adc052b2f7e1d6b4dffffffff0200b1bcdd040000001976a914c3fa20522ee60c30e8e90f0d508336d49655823088ac00943577000000001976a914ae3d035ba09bce98918bb13021e650f1dfb3b08588ac000000000100000001688cd393eaf5aea8516e11dc5f395a449bab1ca6f5c6fc679cac6bd781d5d85d4c0000006b48304502204ce49efb622982dba187c0767c163560fd272f032470af9b1f7c0de04120b783022100d108d2f2878c78d5a4afcb4a1259310752f648e5383e10bec24cae296a1ab4ad012103979d6d85a49d18deb678c3dbfd9ec73a82ee61971c08e63d2e4db37361094212ffffffff01bdbe798c320000001976a9147936b878100ccc012d4eecc7124accc6774078de88ac0000000001000000019cb1fb0be32828d9a5fb4d8d2cad34e1d351a1a5990692c09fc9522f3c788d52010000006a47304402206a3fbe36f6e9c09ca3e6920cc5ec214950bec7db3144c407c8d58f0c7b1f05830220585881d965f59e53e9e5b83c3617c10595e7d362ebf7e00c0ba8bb3c2c102e100121023134cc9962bd55c25349192e30686f7e06b1e71effb83ea98bc142ab71d4976affffffff0100e721a2040000001976a914d68cb846739bd68d4bfe6346ca0e7de32268af8e88ac000000000100000001a42ca3dce24910f351f385912d8a37ea87cee8917ad4a90a95ccccd193405e13000000006b483045022100e1636331779607619dab8254b599f7191d5c9a1139529f38a8a7aefc406a152402206ae7739b822c205ae044507da67b6e356688841d093ec87d76cc60f7d223ff5001210318c5bd2030e074abc39f5b34f3642500dd2f33eb686f78983fb639417ad0645bffffffff0220b5a664310200001976a91453645d0ee901a62b5b91590c6cda95e42409cbe888ac80f0fa02000000001976a91488a65118c4d13c1a526f4de4fff41b9b35d816cc88ac00000000010000000184b219412d00a2e9431f60de222b1a96f4edf2f4c886bf7d5c2e226f4cf2f367000000006a47304402200aea45983a1b2fd6d3c521b9dc8b9b7a90f11f68c4beec7eacb755125c1074c5022054a938bfc624d5b7c0f74bf4eff2620babf41739675786f8f95f9ea2f89ca15901210210afe85ead8d32a4f338cc9b5e3ebe7e68fccfa1b05ceb846d51174bb6e5c8b8ffffffff0200cce06ccc0000001976a91485648c7c54342b76befc69a7f6a02d0b7e3c047988ac00e1f505000000001976a914289888fd9f4d032d43aad4485d5dba6b931834e988ac000000000100000001de633d4e614214b2c4f630f82f78cbf01cdbdb31265f99480204149a0d736dbf000000006a473044022068c5edbae3e6626bc7da3029d0df0cd59114ad5d2e8533f4f26439251361d88302204a940ea94bebb8e9d1d93822fa23e11c23037c7971f36b3b3e839aa243d4e2c3012103a93d999bb383a6bd9cf802101b66245e2c6cbbce302ac964893a8e7f187e9461ffffffff0200a3e111000000001976a9148849b263f7d808f2fc97241944b94f2849b2601488ac00b5cab32b0000001976a914a6f534602558d53a1aa3ed98bb8816ba3ceac02088ac000000000100000001d9b3c3b27f52d72e93c88e2bdf54ddfdb27027119401eb0c33a4b17b0640e2c0000000006b48304502203747cb4c101b4b2b8d3815cccd9baeefb36cea2f595e6306db56b242a08f74c2022100a8f83b573154c23f82f8d1ca002fb10fe8c55033ae86625d6a1644a9b00f27fd01210316d1f584e2a315261fefb1b1c77cdc22eecc4e34244ff46742100083a4a62498ffffffff0282fabeab080000001976a91412ece6e9180a15251177f66e39f0dca7fe1947c688acf3ba0401000000001976a9140be8cc678017ea9c9eafeaac63ddfa31fc2136e088ac00000000010000000168423f1633c4f503cc0971638c89e00f453dff809b11aefe65e48db83869f348000000006b48304502206dd4ecf7e1c79cb139b8bf4507f48f1bd5a3ce207ec10807496ca7a7dabf4526022100ba0a3b99eba4e0cb86d175fe82873b165b2f06f65663f43929424e6632d561290121021bfcc1615687c72e64cc9d06f57501602a09a3e8e612cdc9a66bee2668f3a3a1ffffffff0261c7bcae070000001976a914a24be5ff2adcb5fc0c5e360b553ceb22a425a64b88acbdbd174c130000001976a914d690e204b63c98c0470b2b7ea3367ba109719aa088ac000000000100000001f12e57c8b3456b9dc8a7403938a2822a57843fdb537543a73332d7e5e78f85f7000000006b48304502206978be3154ae94d58f6abd4cd916bce8f587d53f1646868463edbaaca82ab6c7022100cdd208ea5bfcaabfe37801a5fd29cd83db2e2ae28cf4a229fa1fa58beadf90860121036a59c0bad2fcda23a69c78adea325b58466ca59d5126bcc69faea043beaa1e25ffffffff014a2a95c60e0000001976a914e2c4c95cdb866f579f93977d668de345b8388e6a88ac000000000100000002acd75dffa180f9fa929653841e9c61c8553d067d00ea9a7141dad6880984a63f010000006a47304402206513136d876906f9917998e344cb080473e441c0be2b59900dae0221b04d077a02203409c91aae44643cdd98da8597372d53edd019af6936974eb04b292d53848b27012102a9bc6c4bc078f805cd1c7aca4404069adc7717879ebdd679ee1a246c7e6f4bf3ffffffffd19f37347a4549891e3dfd0e7eab911d9e67196ddcbf41502ffef1773bd7a98b000000006b48304502203d3f097f0eeea4f998347d842f564dc9e3f5d0612b4dbff3bfb84298814484e302210086e60299707e98f069aa99f9f05e1494b3ccae4e1cdd1e62c36dbf6a6049d27f012102e8d9f3ea4da6cb2dd65250fe694c94bf27788a98d5ef6b02e62da5f0bb6ab20bffffffff021d29473a000000001976a914af0f58fc983699ce76cb6ef18fc271dcdfb79ff588ac00904e5a030000001976a914fb1a23206fad89723d855e5a80ccb9daa149244088ac00000000010000000133a2e5e307a65f0345ea33901d307f63000139b3132a288d9a66016a8bb0abb8010000006a47304402200c66f408e869b1506f117c993d009df3b075a68b9ce4e62f1c92f783dcd860d702204b6aefac1539e90dd35b9c3fb0c8256a2f3c11c77c98c65121bfb80deba1f96b012102f7740849c2c6c4be311a1fb669e15b8af78bd201d15a4433d82d981724e3dfe8ffffffff0200eec1ee150000001976a914515ff6aef100b80aa0bc0f825e4197d398b4885688ac006d7c4d000000001976a914016b5977c4a98b00ce4bdd731d42896d3947149b88ac0000000001000000012371105379e58d8fa4d403ccd3d0bbd2f360e49e49d6fd81d2b94ca9aeba2290000000006c4930460221008210281a12b168f02c3f45e79996ff06f3aa7cfa25cf956d54c9bbc59403a7c30221008ac2008fe26f403d43e254c9ff4ef9534229bb7137aa57184e7e415354fa030f01210362027b5a4959973f0c005653e7bfbcdb557099ee42e9053aabf6138594fb2ebeffffffff0200ff0f270b0000001976a9148e6da23aea89b44790320e2821d77735b86d711288ac006d7c4d000000001976a91428dae9efa934162c0c4e17ea75687731eff374f188ac000000000100000001d0b5959c1487e2d4f3de202b52ce9286cba3060e3a8ebce06c735472d67bc813000000006c4930460221009fcf3285a07360f3fabd1306f66b1ac965e9d178ca9ceaf7487a292d96cc8792022100d74380ddb3da48f986ffb8b063124a97a79a1500f5bfd5181d97fb0cb026c7a3012102487c3f3cc9a5f443107c36fa06844b64dd8b23896d9491f6a6d698bdb511c8e9ffffffff02f00d7bcb010000001976a914318eced404c11e3c5fde840d5aaeeb9efc00c6b688ac005ed0b2000000001976a91462e9340893d0cf62a9e14eeed711e5764386f05e88ac000000000100000001c79ae575877f2670a88a53b8939c10ab6413c1ec6847f2381b9dd7d44f69bdde000000006c493046022100ed5787095d60824035f10043d2c218cffd7022f149bc6d0ad6aad7cc8a1ff7ba0221009a0fd8a6b9b74a2fba9b16da60061d5c44fd58b7e279ddc0bc5b604ada381d8901210369f29d6f5caac452d06eccb2899fdcd03ce385a050ab32c868ff29f7397eff68ffffffff0298bad24f040000001976a914171ff4c844a9eef6bb79cf374e684a70158e7d5388aca93bb11f050000001976a914a7124f6adeccce0e17e94f9a68161c52a32eafa288ac00000000010000000135a2a0611e0b326f05e48124e7a7592c0ca52a7f9a3efcadf03d74027a244018000000006c493046022100e296ff2f5a1b996c922c327c371b4e21f2fb40bdbba2f9b5befb5c74b09b9f8d02210091f07e275b035a784e4ed0a5c13c7836a90b52b739f2b3efcf47fab0dd6de59d0121038569c188cbc829f851ccda57a3235617c1909e1de2419c9c1169529b14fe0c00ffffffff0200d2496b000000001976a914b80be6e1a7bdd4b984bd5680db5179f7b645031488ac00410b38080000001976a914fc32581d33bd5eacda6158ea10cf4fd9c635d84d88ac0000000001000000038055caf093c8a044fa5429adfff3484e117fe4fe76cb27174d2b9d792b4fbb62010000006b48304502205ed4304d094741126acec996aff3fbca1c3ceac1d931886c5b9eb2575361df04022100a563593827d8f1e4d10f9cf325f51b901fc450adf0b2ff584ca4965ed1dbbb2d0121025916328cd6c38bf5f98693323158a4325fa8b333a215c2ae0b1ea4a92f673a38ffffffff8a1a976bcd51d0cf22b021b9803d7cbeb77a33e1a2dfc6ca4773320dcce7c8f7000000006b483045022100d446953828ddb670baa707ccb1ef9937d3e48660a1c90891f40ed983f71eaa0d02200413f37a60fd0cff0a99cd1e0a14d37c839e460c56771753d6f8fc99a6939927012102d7ddada145d1d5c081427f3913ce9f77e849425a2f2c4a4b66737b22a1c7488cffffffff7607d8257d5b492b8988e58186c00b6d214a401ae14105b7d9e89983fd33f584000000006c493046022100cf6bc9a14f631a69895662fad0e809e7afe4d1c11ed2c1348c40bcbc0aa6fe95022100c8fac9fbee9d8d6f637fcdcfb27c3aaa962bd80e9819bc5d64fceb078842bcd7012102d7ddada145d1d5c081427f3913ce9f77e849425a2f2c4a4b66737b22a1c7488cffffffff0280e06200000000001976a914841377b2b993ed53a7333b09856f1e02bc791ebd88ac00a3e111000000001976a914ab1b5cae43c1b925e0b89c2aa78494f1bc6f924e88ac00000000010000000181427281d6e26117258c9adb30b5d24ca412a73bb2b2613709c0af43ade44189000000006b483045022100d6bef6d56c92a90075e50ab20a0260e7e5fd5a4cec6d4943ef245bcb35df749d022013ad806ba85663476b7e0ee89ed0fa05ae2846932deeb620ff43e0d983f9a7ca012102c35c73eecb3f7498836706fab553a8a9881b5ab42ad1b726cac11a5e66f29e4bffffffff02a002c055310200001976a914605ab623319733a2ff3c7f749214cde3ab4cb05a88ac80f0fa02000000001976a914ed79e21df195f9701e91eebc2b4e69257058101b88ac0000000001000000016c873218e5dc062965e5a5179057cd27bf44c99abec60288c645f1c1c8ba9bfb000000006a47304402201412ad826f09485dcd32c11c521c80269fa077d1e19eefa828d40135e795b2bb02207dd7b8b4c065092e3f16038dec8676910aaa362d753416a3ef1600e24acca3b6012102d43a6e77148fa7584674817fccd77e564832bc623158b598ebde6812ef22b590ffffffff02a029c1e1010000001976a91445a8fb7e94982c104f1121d549c5f8d28df3ce8988ac603fa71d000000001976a9147de21cf2eb1b16f6b50dda20b9045d2ef729993c88ac000000000100000001246964d523055dcbd0e1844643ee90b05adadd1805dc5a8138e1d572109f1eb6000000006a47304402200f4874872c3f96659b59c63e219c7827e131242538ee58910ef7d37c7a440bda02200509d82aa2738a383f1f76f495ce37a20cc56530cd1139aaa009c4e4700d5f720121035f33520e83f96e1dfa8136e987471c906568959fa40ba8c0ca73a576bbe03b8dffffffff024054adf4000000001976a9146e782f433c0ed10dec2156fcf750da0f60f84f6988ac603fa71d000000001976a9148238d5ea6fdcec5b76b8792205be25b559386ac888ac000000000100000001c067ae3dbd1d8112ac2eee4e0a9455a035ff8079a57bcf035359f01896509042000000006b48304502200764a38588e468ee488372e49b111c2c060ef1dbb37bc5165216c2de7a799fe7022100bf5111c8c8f6098440513399abc45305404ab70b572feaec84379a193251c984012102ab2e8ebc9a14e3a2fea3a5dd1949a9c075664c2c57ab1b360a3ced60b5010e40ffffffff026cfb8e15000000001976a9149a41d5bc2ab936b2f6de2483cb0bef50169b6d9988ac00ca9a3b000000001976a91455c71f61392272e15347c027382677cfe67f5ad788ac000000000100000001262ed6364d4b45d407650a5374a37699b6c5ae01a70cfe034abe33c981f24b93010000006b483045022064f3cb97cf6af3a9fbb4f528b772c4486ce1050e560bc459e9d8756cbf2749de022100bfd821d47570fcbd01209f69c6b75a75c754f23a15ae9f365af59e2b88fc4f45012102b4ede20a853e1391b4a29f72fa1a76fc519ecd3b561d11ea8c0abfc638ab93b3ffffffff02a6e28d24010000001976a9149a383ebe681d88e0314d1dfb4f596dd17aa422bc88ac00ca9a3b000000001976a9147cb9e6d120be2bd152b748f8f590c926b47bf9c788ac0000000001000000010ee2653a9516e70405dccde6c2155514970fb6aa0d72b4145c844fbd929127ea000000006b4830450221009240281b701818e78f67bff775204071a9ea3215512acd8e7fff8886938cf257022043bb000937fd5c0cd99fbba19936731ec0b9a0b31c92742f62eaba2bd44625d9012102a296f5b4fd4e83cd78b5dc71e328b6ad97205f77137e26fa9c918f50ca29e71effffffff020064488a000000001976a91471f4bb8d47f4a0c0d0d87d091abb7405861e892488ac603fa71d000000001976a9141cd3b22d4ebb6f7d94187e4f7fedcea24cee11c688ac0000000001000000016d0c87bfbb6b049498ab2ab01f1bf492cf56daca99da882415c418d6700e1dd2010000006b48304502210096eb511d7c04a47fb8e2165db508253f7af87de4378a6830eb622a3527684df102203d9d823dea7ff0af1526dbb031f0dccbf520f6b294dd0c3993e05427f1c2cc2b01210214c0c53161cd86b81a01c8b12321a5f1fe8ab93b7b9ea0186fc7d606bbd03870ffffffff0200b33f71000000001976a914434608760e385a4b8d54178d41631b201c804e5b88ac008c8647000000001976a91445716aa96fbab4d30fe0355254a0954368d0987e88ac0000000001000000011d05c3c7c10aca998f5883f103e2f78f9e11e42f18d95618b782df333ea69a3e000000006b4830450221009b51194a564c121966444c476cf92b64c4667a152cb0c06875c01608924bfee702205b90d6837dd8814fcc2928d9d472521db25d5feaee69ee03e40852b75a6d57cf0121023732f8acf3eef3fea2226f2de4802b8d789d2b30909d4e9009c9d5138591605cffffffff027d9fd81c060000001976a914a5c1bad6b2e517d6df2ec67bae14e9ba77b5244f88ac057af088020000001976a9144bb19b49d47e77c216554eb718012ee1a8d58b7688ac000000000100000001e3789e9ae0d8271cde731c58f6ef02ccace4df32efa1d7aa9f719b07751a97e6010000006c493046022100c82f89daba81ffbfd05c5cb85a8238c7950e0ff6ef79994249552910eb77fee70221009f0e2c840e809d7414262c6dcb651cdaf030ff12c47b122b4409e82ef13823b401210389a12c3c8443c73ccbed2e2d529bea8edaf7a4efb8fa6c5b40d3ef68591f4ab5ffffffff0200fab459010000001976a9147ee2e69aa7226562024951cb09b15ae0520a06f888ac00943577000000001976a9144db9be540350646dc34fa78def8e04fed49d81ce88ac000000000100000001b36bf25e83b4e841acedfd08f6b81e7fde3678039a0fee8ea7cfc25b64341984000000006c493046022100a5ba6a649289c4bc5f21bc0bc0bba4b30ccee57197aead9eef44244c180bd6be022100cbb2a297103c85c434288bdd3196233231a763750e347f2bac212a10343e057e012102f4bb5a222354a9649740a8b8b300f3e1a0c7ade18a409bae7c2ea9f0ecac0575ffffffff027e04ed7ca70e00001976a914c660254bafe140f4a6ec8c248b61a5b7a427ba6788acb8f381c4d90000001976a914e0a032f63f59e7b7b9a79b9dcd7bb8121f672f3688ac00000000010000000113624b8e6c558c0b95645b5b4c611b6f07c4ae051eddd1470fc921878b158553000000006b483045022100ccdfdb7f9b45e5bf1d36b4963fa05714b0cb963e3f93d370f806166203904cd9022031d5d036bd92716e742756511a4be0ca85674f1d65cf8285eccb20bec9c09873012103d3e092b233a629befb6a2249024faebfddf944140f5403a7eedb3f011c47271dffffffff020c987287ec0d00001976a914c5207f84f009632513b304af1e69757f79d1df4588ac728b84efba0000001976a9143d9e306694eb9a55e00113a6f9b838392d15c71a88ac000000000100000001e194dd90db9b7fcf661327515006bd219636ae5b6dc23120146b52ffe508753f000000006c4930460221008e6cd035285d9434b47cca0a01d6ebb4898d1a04bf16a7ef53cdda2358283edd022100b95700890afea19b08a5b67a6bc13e85df5cce990b749e23f685986b4685076e01210273c7e637ceaa0f2fd102278d48c3d4cc60b4ba2ae24a3f5daed840e515757ed6ffffffff02a1f17efc000000001976a914110e90aa49171cc316e4d7876fed69fea686491888acc0f447ac060000001976a914c62cbb894e9889bf2898e902c57ecb79b2b0254d88ac000000000100000001a37afd10d48f0c5963c66f8b4ed5af4a546ecf2cdb8c4a1bbcc170de72df0fa0000000006b483045022100ceb7d06c357b3cf2b83f2bd50d0e498312c85e17344497193f77e020a3874afb0220296b0e6d0609c8469e7c7f8c13e3ef2212bf61ce04e898adb70348d45819eaa30121037b2e9c9fba6e830a2a12713f89ab42e87ca34ddd9a68b06768577b4f8d543801ffffffff026a9ab816000000001976a91465c5ba865bf8b0b533fb0be75856f51db71e46cf88ac3776d0df000000001976a91420717bf29cae8d800835d4a6621a8bcd92f24f2288ac0000000001000000015a021ed0fde77c37c49329b6dfeb629119710aa79706e18bd13bc89b34b17489000000006c493046022100f766c02b8be767b5e40ab2e5fca085b095883b24e76da75a7894f2134f85e2f60221008bb3fa3322b9f032eab5fbb9c3c3792629c5444a628e489bbef074507d2822bd0121039591af3b189bc9063110783ec97b1e061cd88dea2b374efcecdb2b4fdaf48d1affffffff02d8baa4478f0d00001976a9149fdbc530d583f6e0dc31e9281db0c9db39325e5a88ac34fcd7395d0000001976a914770d36fdf8a25cb438fed008540ae268e62addbf88ac00000000"); + #[test] + fn block_version_test() { + let block = hex!("ffffff7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); let decode: Result = deserialize(&block); - decode.unwrap(); - + assert!(decode.is_ok()); + let real_decode = decode.unwrap(); + assert_eq!(real_decode.header.version, Version(2147483647)); - let header = hex!("020162000d6f03470d329026cd1fc720c0609cd378ca8691a117bd1aa46f01fb09b1a8468a15bf6f0b0e83f2e5036684169eafb9406468d4f075c999fb5b2a78fbb827ee41fb11548441361b0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff380345bf09fabe6d6d980ba42120410de0554d42a5b5ee58167bcd86bf7591f429005f24da45fb51cf0800000000000000cdb1f1ff0e000000ffffffff01800c0c2a010000001976a914aa3750aa18b8a0f3f0590731e1fab934856680cf88ac00000000b3e64e02fff596209c498f1b18f798d62f216f11c8462bf3922319000000000003a979a636db2450363972d211aee67b71387a3daaa3051be0fd260c5acd4739cd52a418d29d8a0e56c8714c95a0dc24e1c9624480ec497fe2441941f3fee8f9481a3370c334178415c83d1d0c2deeec727c2330617a47691fc5e79203669312d100000000036fa40307b3a439538195245b0de56a2c1db6ba3a64f8bdd2071d00bc48c841b5e77b98e5c7d6f06f92dec5cf6d61277ecb9a0342406f49f34c51ee8ce4abd678038129485de14238bd1ca12cd2de12ff0e383aee542d90437cd664ce139446a00000000002000000d2ec7dfeb7e8f43fe77aba3368df95ac2088034420402730ee0492a2084217083411b3fc91033bfdeea339bc11b9efc986e161c703e07a9045338c165673f09940fb11548b54021b58cc9ae5"); - let decode: Result = deserialize(&header); - let res = decode.unwrap(); - let p = res.block_hash(); - println!("p: {:?}",p); - } - - #[test] - fn validate_pow_test2() { - let some_header = hex!("020162001b9db197bcb7d86e93991293f148f684e17efc6136e08b4688c6701f39d4403757dd5ccd9391273c118b600e0f497a04f3cbdebb7e6dbb699bae2fb17198d8f4b6aa8d5403f2041b0000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5e03a9970a062f503253482f04b8aa8d5408fabe6d6d92ae1083b7b3c22fd7b4ce2eae121d518f8e1aa81d0be9432ce5aa20a2954fcc0100000000000000402a29636829010018393436383834322f6d696e65722073686172705f66697265000000000100f2052a010000001976a9146a2ca895057c3b94136c8776e731cece18b46c8688ac00000000040290bc699f9cc500b676c9a782b2cd398524d6279079b3b59a74069396f81602edfe7f3fe6cd4224a01fa4bb59f5254acff79e988aaebc994337cb6d33721547417823cbe436061e508eb64060c54981df9a87f03875f84d0b70457dab12d21600000000000000000002000000f7e6f6aff383b6e2bb1d7968ccca5b6ceeaeda130879b50f09f29982431e26afbefd1c78ab2711ebd12d4c6c6e54e3ddab8cf2d860283a6ca7452f9865d32c9c6daa8d54e12a011b57975dc9"); - let some_header: Header = - deserialize(&some_header).expect("Can't deserialize correct block header"); -println!("some_header: {:?}",some_header); + let block2 = hex!("000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); + let decode2: Result = deserialize(&block2); + assert!(decode2.is_ok()); + let real_decode2 = decode2.unwrap(); + assert_eq!(real_decode2.header.version, Version(-2147483648)); } #[test] diff --git a/bitcoin/src/p2p/mod.rs b/bitcoin/src/p2p/mod.rs index 2edafba77e..9fc596ad9a 100644 --- a/bitcoin/src/p2p/mod.rs +++ b/bitcoin/src/p2p/mod.rs @@ -201,7 +201,7 @@ impl Decodable for ServiceFlags { } /// Network magic bytes to identify the cryptocurrency network the message was intended for. #[derive(Copy, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)] -pub struct Magic([u8; 4]); +pub struct Magic(pub [u8; 4]); impl Magic { /// Bitcoin mainnet network magic bytes. diff --git a/hashes/Cargo.toml b/hashes/Cargo.toml index 6f91a0206a..2b301405d8 100644 --- a/hashes/Cargo.toml +++ b/hashes/Cargo.toml @@ -38,4 +38,4 @@ actual-core2 = { package = "core2", version = "0.3.2", default-features = false, [dev-dependencies] serde_test = "1.0" -serde_json = "1.0" +serde_json = "1.0" \ No newline at end of file