diff --git a/src/blockdata/constants.rs b/src/blockdata/constants.rs index 468211fc..f08a9c08 100644 --- a/src/blockdata/constants.rs +++ b/src/blockdata/constants.rs @@ -121,6 +121,20 @@ pub fn genesis_block(network: Network) -> Block { txdata: txdata } } + Network::Regtest => { + let txdata = vec![bitcoin_genesis_tx()]; + Block { + header: BlockHeader { + version: 1, + prev_blockhash: Default::default(), + merkle_root: txdata.merkle_root(), + time: 1296688602, + bits: 0x207fffff, + nonce: 2 + }, + txdata: txdata + } + } } } diff --git a/src/network/constants.rs b/src/network/constants.rs index 6c105158..bdd6fac7 100644 --- a/src/network/constants.rs +++ b/src/network/constants.rs @@ -28,7 +28,9 @@ user_enum! { #[doc="Classic Bitcoin"] Bitcoin <-> "bitcoin", #[doc="Bitcoin's testnet"] - Testnet <-> "testnet" + Testnet <-> "testnet", + #[doc="Bitcoin's regtest"] + Regtest <-> "regtest" } } @@ -44,7 +46,8 @@ pub const USER_AGENT: &'static str = "bitcoin-rust v0.1"; pub fn magic(network: Network) -> u32 { match network { Network::Bitcoin => 0xD9B4BEF9, - Network::Testnet => 0x0709110B + Network::Testnet => 0x0709110B, + Network::Regtest => 0xDAB5BFFA, // Note: any new entries here must be added to `consensus_decode` below } } @@ -63,6 +66,7 @@ impl ConsensusDecodable for Network { match magic { 0xD9B4BEF9 => Ok(Network::Bitcoin), 0x0709110B => Ok(Network::Testnet), + 0xDAB5BFFA => Ok(Network::Regtest), x => Err(d.error(format!("Unknown network (magic {:x})", x))) } } @@ -77,9 +81,11 @@ mod tests { fn serialize_test() { assert_eq!(serialize(&Network::Bitcoin).unwrap(), vec![0xf9, 0xbe, 0xb4, 0xd9]); assert_eq!(serialize(&Network::Testnet).unwrap(), vec![0x0b, 0x11, 0x09, 0x07]); + assert_eq!(serialize(&Network::Regtest).unwrap(), vec![0xfa, 0xbf, 0xb5, 0xda]); assert_eq!(deserialize(&[0xf9, 0xbe, 0xb4, 0xd9]).ok(), Some(Network::Bitcoin)); assert_eq!(deserialize(&[0x0b, 0x11, 0x09, 0x07]).ok(), Some(Network::Testnet)); + assert_eq!(deserialize(&[0xfa, 0xbf, 0xb5, 0xda]).ok(), Some(Network::Regtest)); let bad: Result = deserialize("fakenet".as_bytes()); assert!(bad.is_err()); diff --git a/src/util/address.rs b/src/util/address.rs index 80d9660d..a61b3293 100644 --- a/src/util/address.rs +++ b/src/util/address.rs @@ -162,7 +162,7 @@ impl Address { fn bech_network (network: Network) -> bitcoin_bech32::constants::Network { match network { Network::Bitcoin => bitcoin_bech32::constants::Network::Bitcoin, - Network::Testnet => bitcoin_bech32::constants::Network::Testnet + Network::Testnet | Network::Regtest => bitcoin_bech32::constants::Network::Testnet, } } @@ -206,7 +206,7 @@ impl ToString for Address { let mut prefixed = [0; 21]; prefixed[0] = match self.network { Network::Bitcoin => 0, - Network::Testnet => 111, + Network::Testnet | Network::Regtest => 111, }; prefixed[1..].copy_from_slice(&hash[..]); base58::check_encode_slice(&prefixed[..]) @@ -215,7 +215,7 @@ impl ToString for Address { let mut prefixed = [0; 21]; prefixed[0] = match self.network { Network::Bitcoin => 0, - Network::Testnet => 111, + Network::Testnet | Network::Regtest => 111, }; prefixed[1..].copy_from_slice(&hash[..]); base58::check_encode_slice(&prefixed[..]) @@ -224,7 +224,7 @@ impl ToString for Address { let mut prefixed = [0; 21]; prefixed[0] = match self.network { Network::Bitcoin => 5, - Network::Testnet => 196, + Network::Testnet | Network::Regtest => 196, }; prefixed[1..].copy_from_slice(&hash[..]); base58::check_encode_slice(&prefixed[..]) diff --git a/src/util/bip32.rs b/src/util/bip32.rs index ff785dcb..bc83a0a0 100644 --- a/src/util/bip32.rs +++ b/src/util/bip32.rs @@ -344,7 +344,7 @@ impl ToString for ExtendedPrivKey { let mut ret = [0; 78]; ret[0..4].copy_from_slice(&match self.network { Network::Bitcoin => [0x04, 0x88, 0xAD, 0xE4], - Network::Testnet => [0x04, 0x35, 0x83, 0x94], + Network::Testnet | Network::Regtest => [0x04, 0x35, 0x83, 0x94], }[..]); ret[4] = self.depth as u8; ret[5..9].copy_from_slice(&self.parent_fingerprint[..]); @@ -402,7 +402,7 @@ impl ToString for ExtendedPubKey { let mut ret = [0; 78]; ret[0..4].copy_from_slice(&match self.network { Network::Bitcoin => [0x04u8, 0x88, 0xB2, 0x1E], - Network::Testnet => [0x04u8, 0x35, 0x87, 0xCF], + Network::Testnet | Network::Regtest => [0x04u8, 0x35, 0x87, 0xCF], }[..]); ret[4] = self.depth as u8; ret[5..9].copy_from_slice(&self.parent_fingerprint[..]); diff --git a/src/util/privkey.rs b/src/util/privkey.rs index fd2c46f0..7ffb8f5a 100644 --- a/src/util/privkey.rs +++ b/src/util/privkey.rs @@ -96,7 +96,7 @@ impl ToString for Privkey { let mut ret = [0; 34]; ret[0] = match self.network { Network::Bitcoin => 128, - Network::Testnet => 239 + Network::Testnet | Network::Regtest => 239, }; ret[1..33].copy_from_slice(&self.key[..]); if self.compressed {