Skip to content

Commit 7d32028

Browse files
Bob McElrathmcelrath
Bob McElrath
authored andcommitted
Initial CPUNet support
Add cpunet prefix to PoW function and update CPUNET type in param.rs Signed-off-by: Calisto Abel Mathias <[email protected]> Add cpunet in log message Use version number 0.32.4-cpunet small-fix : BlockInterval path fix in bitcoin/src/network/params.rs Bump version to 0.32.7-pre-cpunet
1 parent a419fc9 commit 7d32028

File tree

7 files changed

+106
-12
lines changed

7 files changed

+106
-12
lines changed

bitcoin/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "bitcoin"
3-
version = "0.33.0-alpha.0"
3+
version = "0.32.7-pre-cpunet"
44
authors = ["Andrew Poelstra <[email protected]>"]
55
license = "CC0-1.0"
66
repository = "https://github.com/rust-bitcoin/rust-bitcoin/"

bitcoin/src/address/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ impl KnownHrp {
245245

246246
match network {
247247
Bitcoin => Self::Mainnet,
248-
Testnet(_) | Signet => Self::Testnets,
248+
Testnet(_) | Signet | CPUNet => Self::Testnets,
249249
Regtest => Self::Regtest,
250250
}
251251
}

bitcoin/src/blockdata/constants.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ fn bitcoin_genesis_tx(params: &Params) -> Transaction {
8585

8686
let (in_script, out_script) = {
8787
match params.network {
88-
Network::Testnet(TestnetVersion::V4) => (
88+
Network::Testnet(TestnetVersion::V4) | Network::CPUNet => (
8989
script::Builder::new()
9090
.push_int_unchecked(486604799)
9191
.push_int_non_minimal(4)
@@ -186,6 +186,16 @@ pub fn genesis_block(params: impl AsRef<Params>) -> Block<Checked> {
186186
transactions,
187187
)
188188
.assume_checked(witness_root),
189+
Network::CPUNet => Block::new_unchecked(
190+
block::Header {
191+
version: block::Version::ONE,
192+
prev_blockhash: BlockHash::GENESIS_PREVIOUS_BLOCK_HASH,
193+
merkle_root,
194+
time: BlockTime::from_u32(1723652721),
195+
bits: CompactTarget::from_consensus(0x1d00ffff),
196+
nonce: 961348305
197+
}, transactions,
198+
).assume_checked(witness_root)
189199
}
190200
}
191201

@@ -228,6 +238,11 @@ impl ChainHash {
228238
6, 34, 110, 70, 17, 26, 11, 89, 202, 175, 18, 96, 67, 235, 91, 191, 40, 195, 79, 58, 94,
229239
51, 42, 31, 199, 178, 183, 60, 241, 136, 145, 15,
230240
]);
241+
/// `ChainHash` for cpunet bitcoin.
242+
pub const CPUNET: Self = Self([
243+
155, 244, 9, 169, 207, 188, 132, 171, 5, 153, 89, 228, 109, 99, 3, 243, 57, 98, 248, 5,
244+
188, 141, 147, 51, 119, 165, 255, 187, 0, 0, 0, 0,
245+
]);
231246

232247
/// Returns the hash of the `network` genesis block for use as a chain hash.
233248
///
@@ -240,6 +255,7 @@ impl ChainHash {
240255
Network::Testnet(TestnetVersion::V4) => Self::TESTNET4,
241256
Network::Signet => Self::SIGNET,
242257
Network::Regtest => Self::REGTEST,
258+
Network::CPUNet => Self::CPUNET,
243259
}
244260
}
245261

@@ -254,6 +270,7 @@ impl ChainHash {
254270
Network::Testnet(TestnetVersion::V4) => Self::TESTNET4,
255271
Network::Signet => Self::SIGNET,
256272
Network::Regtest => Self::REGTEST,
273+
Network::CPUNet => Self::CPUNET,
257274
}
258275
}
259276

@@ -388,7 +405,8 @@ mod test {
388405
Network::Testnet(TestnetVersion::V4) => {},
389406
Network::Signet => {},
390407
Network::Regtest => {},
391-
_ => panic!("update ChainHash::using_genesis_block and chain_hash_genesis_block with new variants"),
408+
Network::CPUNet => {},
409+
_ => panic!("Update ChainHash::using_genesis_block and chain_hash_genesis_block with new variants"),
392410
}
393411
}
394412

@@ -409,6 +427,7 @@ mod test {
409427
testnet4_chain_hash_genesis_block, Network::Testnet(TestnetVersion::V4);
410428
signet_chain_hash_genesis_block, Network::Signet;
411429
regtest_chain_hash_genesis_block, Network::Regtest;
430+
cpunet_chain_hash_genesis_block, Network::CPUNet;
412431
}
413432

414433
// Test vector taken from: https://github.com/lightning/bolts/blob/master/00-introduction.md

bitcoin/src/network/mod.rs

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ pub enum NetworkKind {
3535
// ambiguous due to confusion caused by signet/testnet/regtest.
3636
impl NetworkKind {
3737
/// Returns true if this is real mainnet bitcoin.
38-
pub fn is_mainnet(&self) -> bool { *self == NetworkKind::Main }
38+
pub fn is_mainnet(&self) -> bool {
39+
*self == NetworkKind::Main
40+
}
3941
}
4042

4143
impl From<Network> for NetworkKind {
@@ -44,7 +46,7 @@ impl From<Network> for NetworkKind {
4446

4547
match n {
4648
Bitcoin => NetworkKind::Main,
47-
Testnet(_) | Signet | Regtest => NetworkKind::Test,
49+
Testnet(_) | Signet | Regtest | CPUNet => NetworkKind::Test,
4850
}
4951
}
5052
}
@@ -71,6 +73,8 @@ pub enum Network {
7173
Signet,
7274
/// Bitcoin's regtest network.
7375
Regtest,
76+
/// Bitcoin's cpunet network.
77+
CPUNet,
7478
}
7579

7680
#[cfg(feature = "serde")]
@@ -128,6 +132,7 @@ impl Network {
128132
Network::Testnet(TestnetVersion::V4) => "testnet4",
129133
Network::Signet => "signet",
130134
Network::Regtest => "regtest",
135+
Network::CPUNet => "cpunet",
131136
}
132137
}
133138

@@ -149,6 +154,7 @@ impl Network {
149154
"testnet4" => Testnet(TestnetVersion::V4),
150155
"signet" => Signet,
151156
"regtest" => Regtest,
157+
"cpunet" => CPUNet,
152158
_ => return Err(ParseNetworkError(core_arg.to_owned())),
153159
};
154160
Ok(network)
@@ -165,7 +171,9 @@ impl Network {
165171
/// let network = Network::Bitcoin;
166172
/// assert_eq!(network.chain_hash(), ChainHash::BITCOIN);
167173
/// ```
168-
pub fn chain_hash(self) -> ChainHash { ChainHash::using_genesis_block_const(self) }
174+
pub fn chain_hash(self) -> ChainHash {
175+
ChainHash::using_genesis_block_const(self)
176+
}
169177

170178
/// Constructs a new `Network` from the chain hash (genesis block hash).
171179
///
@@ -189,6 +197,7 @@ impl Network {
189197
Network::Testnet(TestnetVersion::V4) => &Params::TESTNET4,
190198
Network::Signet => &Params::SIGNET,
191199
Network::Regtest => &Params::REGTEST,
200+
Network::CPUNet => &Params::CPUNET,
192201
}
193202
}
194203

@@ -201,6 +210,7 @@ impl Network {
201210
Network::Testnet(TestnetVersion::V4) => "testnet4",
202211
Network::Signet => "signet",
203212
Network::Regtest => "regtest",
213+
Network::CPUNet => "cpunet",
204214
}
205215
}
206216
}
@@ -232,15 +242,15 @@ pub mod as_core_arg {
232242
Network::from_core_arg(s).map_err(|_| {
233243
E::invalid_value(
234244
serde::de::Unexpected::Str(s),
235-
&"bitcoin network encoded as a string (either main, test, testnet4, signet or regtest)",
245+
&"bitcoin network encoded as a string (either main, test, testnet4, signet, regtest, or cpunet)",
236246
)
237247
})
238248
}
239249

240250
fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
241251
write!(
242252
formatter,
243-
"bitcoin network encoded as a string (either main, test, testnet4, signet or regtest)"
253+
"bitcoin network encoded as a string (either main, test, testnet4, signet, regtest or cpunet)"
244254
)
245255
}
246256
}
@@ -262,7 +272,9 @@ impl fmt::Display for ParseNetworkError {
262272

263273
#[cfg(feature = "std")]
264274
impl std::error::Error for ParseNetworkError {
265-
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
275+
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
276+
None
277+
}
266278
}
267279

268280
impl FromStr for Network {
@@ -277,6 +289,7 @@ impl FromStr for Network {
277289
"testnet4" => Ok(Network::Testnet(TestnetVersion::V4)),
278290
"signet" => Ok(Network::Signet),
279291
"regtest" => Ok(Network::Regtest),
292+
"cpunet" => Ok(Network::CPUNet),
280293
_ => Err(ParseNetworkError(s.to_owned())),
281294
}
282295
}
@@ -301,7 +314,9 @@ impl fmt::Display for UnknownChainHashError {
301314

302315
#[cfg(feature = "std")]
303316
impl std::error::Error for UnknownChainHashError {
304-
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { None }
317+
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
318+
None
319+
}
305320
}
306321

307322
impl TryFrom<ChainHash> for Network {
@@ -315,6 +330,7 @@ impl TryFrom<ChainHash> for Network {
315330
ChainHash::TESTNET4 => Ok(Network::Testnet(TestnetVersion::V4)),
316331
ChainHash::SIGNET => Ok(Network::Signet),
317332
ChainHash::REGTEST => Ok(Network::Regtest),
333+
ChainHash::CPUNET => Ok(Network::CPUNet),
318334
_ => Err(UnknownChainHashError(chain_hash)),
319335
}
320336
}
@@ -323,6 +339,35 @@ impl TryFrom<ChainHash> for Network {
323339
#[cfg(test)]
324340
mod tests {
325341
use super::{Network, TestnetVersion};
342+
use crate::consensus::encode::{deserialize, serialize};
343+
344+
#[test]
345+
fn serialize_deserialize() {
346+
assert_eq!(serialize(&Network::Bitcoin.magic()), &[0xf9, 0xbe, 0xb4, 0xd9]);
347+
assert_eq!(
348+
serialize(&Network::Testnet(TestnetVersion::V3).magic()),
349+
&[0x0b, 0x11, 0x09, 0x07]
350+
);
351+
assert_eq!(
352+
serialize(&Network::Testnet(TestnetVersion::V4).magic()),
353+
&[0x1c, 0x16, 0x3f, 0x28]
354+
);
355+
assert_eq!(serialize(&Network::Signet.magic()), &[0x0a, 0x03, 0xcf, 0x40]);
356+
assert_eq!(serialize(&Network::Regtest.magic()), &[0xfa, 0xbf, 0xb5, 0xda]);
357+
358+
assert_eq!(deserialize(&[0xf9, 0xbe, 0xb4, 0xd9]).ok(), Some(Network::Bitcoin.magic()));
359+
assert_eq!(
360+
deserialize(&[0x0b, 0x11, 0x09, 0x07]).ok(),
361+
Some(Network::Testnet(TestnetVersion::V3).magic())
362+
);
363+
assert_eq!(
364+
deserialize(&[0x1c, 0x16, 0x3f, 0x28]).ok(),
365+
Some(Network::Testnet(TestnetVersion::V4).magic())
366+
);
367+
assert_eq!(deserialize(&[0x0a, 0x03, 0xcf, 0x40]).ok(), Some(Network::Signet.magic()));
368+
assert_eq!(deserialize(&[0xfa, 0xbf, 0xb5, 0xda]).ok(), Some(Network::Regtest.magic()));
369+
assert_eq!(deserialize(&[0x63, 0x70, 0x75, 0x6e]).ok(), Some(Network::CPUNet.magic()));
370+
}
326371

327372
#[test]
328373
fn string() {
@@ -331,12 +376,14 @@ mod tests {
331376
assert_eq!(Network::Testnet(TestnetVersion::V4).to_string(), "testnet4");
332377
assert_eq!(Network::Regtest.to_string(), "regtest");
333378
assert_eq!(Network::Signet.to_string(), "signet");
379+
assert_eq!(Network::CPUNet.to_string(), "cpunet");
334380

335381
assert_eq!("bitcoin".parse::<Network>().unwrap(), Network::Bitcoin);
336382
assert_eq!("testnet".parse::<Network>().unwrap(), Network::Testnet(TestnetVersion::V3));
337383
assert_eq!("testnet4".parse::<Network>().unwrap(), Network::Testnet(TestnetVersion::V4));
338384
assert_eq!("regtest".parse::<Network>().unwrap(), Network::Regtest);
339385
assert_eq!("signet".parse::<Network>().unwrap(), Network::Signet);
386+
assert_eq!("cpunet".parse::<Network>().unwrap(), Network::CPUNet);
340387
assert!("fakenet".parse::<Network>().is_err());
341388
}
342389

@@ -350,6 +397,7 @@ mod tests {
350397
(Testnet(TestnetVersion::V4), "testnet4"),
351398
(Signet, "signet"),
352399
(Regtest, "regtest"),
400+
(CPUNet, "cpunet"),
353401
];
354402

355403
for tc in tests {
@@ -372,6 +420,7 @@ mod tests {
372420
(Network::Testnet(TestnetVersion::V4), "testnet4"),
373421
(Network::Regtest, "regtest"),
374422
(Network::Signet, "signet"),
423+
(Network::CPUNet, "cpunet"),
375424
];
376425

377426
for (net, core_arg) in &expected_pairs {

bitcoin/src/network/params.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,14 @@
6060
//! # }
6161
//! ```
6262
63+
use primitives::Block;
6364
use units::{BlockHeight, BlockHeightInterval};
6465

6566
use crate::network::Network;
6667
#[cfg(doc)]
6768
use crate::pow::CompactTarget;
6869
use crate::pow::Target;
69-
use crate::TestnetVersion;
70+
use crate::{BlockInterval, TestnetVersion};
7071

7172
/// Parameters that influence chain consensus.
7273
#[non_exhaustive]
@@ -132,6 +133,8 @@ pub static TESTNET4: Params = Params::TESTNET4;
132133
pub static SIGNET: Params = Params::SIGNET;
133134
/// The regtest parameters.
134135
pub static REGTEST: Params = Params::REGTEST;
136+
/// The cpunet parameters.
137+
pub static CPUNET: Params = Params::CPUNET;
135138

136139
#[allow(deprecated)] // For `pow_limit`.
137140
impl Params {
@@ -241,6 +244,23 @@ impl Params {
241244
no_pow_retargeting: true,
242245
};
243246

247+
/// The cpunet parameters.
248+
pub const CPUNET: Params = Params {
249+
network: Network::CPUNet,
250+
bip16_time: 1333238400, // Apr 1 2012
251+
bip34_height: BlockHeight::from_u32(1),
252+
bip65_height: BlockHeight::from_u32(1),
253+
bip66_height: BlockHeight::from_u32(1),
254+
rule_change_activation_threshold: BlockInterval::from_u32(1512), // 75%
255+
miner_confirmation_window: BlockInterval::from_u32(2016),
256+
pow_limit: Target::MAX_ATTAINABLE_MAINNET,
257+
max_attainable_target: Target::MAX_ATTAINABLE_MAINNET,
258+
pow_target_spacing: 10 * 60, // 10 minutes.
259+
pow_target_timespan: 14 * 24 * 60 * 60, // 2 weeks.
260+
allow_min_difficulty_blocks: false,
261+
no_pow_retargeting: false,
262+
};
263+
244264
/// Creates parameters set for the given network.
245265
pub const fn new(network: Network) -> Self {
246266
match network {
@@ -249,6 +269,7 @@ impl Params {
249269
Network::Testnet(TestnetVersion::V4) => Params::TESTNET4,
250270
Network::Signet => Params::SIGNET,
251271
Network::Regtest => Params::REGTEST,
272+
Network::CPUNet => Params::CPUNET,
252273
}
253274
}
254275

bitcoin/src/p2p/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ impl Magic {
229229
pub const SIGNET: Self = Self([0x0A, 0x03, 0xCF, 0x40]);
230230
/// Bitcoin regtest network magic bytes.
231231
pub const REGTEST: Self = Self([0xFA, 0xBF, 0xB5, 0xDA]);
232+
/// Bitcoin cpunet network magic bytes.
233+
pub const CPUNET: Self = Self([0x63, 0x70, 0x75, 0x6E]);
232234

233235
/// Construct a new network magic from bytes.
234236
pub const fn from_bytes(bytes: [u8; 4]) -> Magic { Magic(bytes) }
@@ -285,6 +287,7 @@ generate_network_magic_conversion! {
285287
Network::Testnet(TestnetVersion::V4) => Magic::TESTNET4,
286288
Network::Signet => Magic::SIGNET,
287289
Network::Regtest => Magic::REGTEST,
290+
Network::CPUNet => Magic::CPUNET,
288291
}
289292

290293
impl fmt::Display for Magic {
@@ -484,6 +487,7 @@ mod tests {
484487
("1c163f28", Network::Testnet(TestnetVersion::V4)),
485488
("fabfb5da", Network::Regtest),
486489
("0a03cf40", Network::Signet),
490+
("6370756e", Network::CPUNet),
487491
];
488492

489493
for (magic_str, network) in &known_network_magic_strs {

primitives/src/block.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ impl Header {
196196
// This is the same as `Encodable` but done manually because `Encodable` isn't in `primitives`.
197197
pub fn block_hash(&self) -> BlockHash {
198198
let mut engine = sha256d::Hash::engine();
199+
engine.input("cpunet\0".as_bytes());
199200
engine.input(&self.version.to_consensus().to_le_bytes());
200201
engine.input(self.prev_blockhash.as_byte_array());
201202
engine.input(self.merkle_root.as_byte_array());

0 commit comments

Comments
 (0)