use hex;
use messages::{Block, BlockHeader, OutPoint, Tx, TxIn, TxOut};
use network::SeedIter;
use script::Script;
use util::{Amount, Error, Hash256, Result};
#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
pub enum Network {
Mainnet = 0,
Testnet = 1,
}
impl Network {
pub fn from_u8(x: u8) -> Result<Network> {
match x {
x if x == Network::Mainnet as u8 => Ok(Network::Mainnet),
x if x == Network::Testnet as u8 => Ok(Network::Testnet),
_ => {
let msg = format!("Unknown network type: {}", x);
Err(Error::BadArgument(msg))
}
}
}
pub fn port(&self) -> u16 {
match self {
Network::Mainnet => 8333,
Network::Testnet => 18333,
}
}
pub fn magic(&self) -> [u8; 4] {
match self {
Network::Mainnet => [0xe3, 0xe1, 0xf3, 0xe8],
Network::Testnet => [0xf4, 0xe5, 0xf3, 0xf4],
}
}
pub fn genesis_block(&self) -> Block {
match self {
Network::Mainnet => {
let header = BlockHeader {
version: 1,
prev_hash: Hash256([0; 32]),
merkle_root: Hash256::decode(
"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
).unwrap(),
timestamp: 1231006505,
bits: 0x1d00ffff,
nonce: 2083236893,
};
let tx = Tx {
version: 1,
inputs: vec![TxIn {
prev_output: OutPoint {
hash: Hash256([0; 32]),
index: 0xffffffff,
},
sig_script: Script(hex::decode("04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73").unwrap()),
sequence: 0xffffffff,
}],
outputs: vec![TxOut {
amount: Amount(5000000000),
pk_script: Script(hex::decode("4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac").unwrap()),
}],
lock_time: 0,
};
Block {
header,
txns: vec![tx],
}
}
Network::Testnet => {
let header = BlockHeader {
version: 1,
prev_hash: Hash256([0; 32]),
merkle_root: Hash256::decode(
"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
).unwrap(),
timestamp: 1296688602,
bits: 0x1d00ffff,
nonce: 414098458,
};
let tx = Tx {
version: 1,
inputs: vec![TxIn {
prev_output: OutPoint {
hash: Hash256([0; 32]),
index: 0xffffffff,
},
sig_script: Script(hex::decode("04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73").unwrap()),
sequence: 0xffffffff,
}],
outputs: vec![TxOut {
amount: Amount(5000000000),
pk_script: Script(hex::decode("4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac").unwrap()),
}],
lock_time: 0,
};
Block {
header,
txns: vec![tx],
}
}
}
}
pub fn genesis_hash(&self) -> Hash256 {
match self {
Network::Mainnet => {
Hash256::decode("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f")
.unwrap()
}
Network::Testnet => {
Hash256::decode("000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943")
.unwrap()
}
}
}
pub fn cashaddr_prefix(&self) -> String {
match self {
Network::Mainnet => "bitcoincash".to_string(),
Network::Testnet => "bchtest".to_string(),
}
}
pub fn legacyaddr_pubkeyhash_flag(&self) -> u8 {
match self {
Network::Mainnet => 0x00,
Network::Testnet => 0x6f,
}
}
pub fn legacyaddr_script_flag(&self) -> u8 {
match self {
Network::Mainnet => 0x05,
Network::Testnet => 0xc4,
}
}
pub fn seeds(&self) -> Vec<String> {
match self {
Network::Mainnet => vec![
"seed.bitcoinabc.org".to_string(),
"seed-abc.bitcoinforks.org".to_string(),
"btccash-seeder.bitcoinunlimited.info".to_string(),
"seed.bitprim.org".to_string(),
"seed.deadalnix.me".to_string(),
"seeder.criptolayer.net".to_string(),
],
Network::Testnet => vec![
"testnet-seed.bitcoinabc.org".to_string(),
"testnet-seed-abc.bitcoinforks.org".to_string(),
"testnet-seed.bitprim.org".to_string(),
"testnet-seed.deadalnix.me".to_string(),
"testnet-seeder.criptolayer.net".to_string(),
],
}
}
pub fn seed_iter(&self) -> SeedIter {
SeedIter::new(&self.seeds(), self.port())
}
}