mirror of
https://github.com/alexgo-io/stacks-puppet-node.git
synced 2026-05-26 22:47:29 +08:00
Merge pull request #1819 from blockstack/feat/xenon-compatibility
Required adjustments for Krypton + Xenon
This commit is contained in:
@@ -64,8 +64,9 @@ const BLOCK_HEADER_SIZE: u64 = 81;
|
||||
const GENESIS_BLOCK_HASH_MAINNET: &'static str = "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f";
|
||||
const GENESIS_BLOCK_MERKLE_ROOT_MAINNET: &'static str = "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b";
|
||||
|
||||
const GENESIS_BLOCK_HASH_TESTNET: &'static str = "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206";
|
||||
const GENESIS_BLOCK_MERKLE_ROOT_TESTNET: &'static str = "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b";
|
||||
const GENESIS_BLOCK_HASH_TESTNET: &'static str = "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943";
|
||||
|
||||
const GENESIS_BLOCK_HASH_REGTEST: &'static str = "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206";
|
||||
|
||||
pub const BLOCK_DIFFICULTY_CHUNK_SIZE: u64 = 2016;
|
||||
const BLOCK_DIFFICULTY_INTERVAL: u32 = 14 * 24 * 60 * 60; // two weeks, in seconds
|
||||
@@ -378,14 +379,16 @@ impl SpvClient {
|
||||
let (genesis_block, genesis_block_hash_str) = match self.network_id {
|
||||
BitcoinNetworkType::Mainnet => (genesis_block(Network::Bitcoin), GENESIS_BLOCK_HASH_MAINNET),
|
||||
BitcoinNetworkType::Testnet => (genesis_block(Network::Testnet), GENESIS_BLOCK_HASH_TESTNET),
|
||||
BitcoinNetworkType::Regtest => (genesis_block(Network::Regtest), GENESIS_BLOCK_HASH_TESTNET),
|
||||
BitcoinNetworkType::Regtest => (genesis_block(Network::Regtest), GENESIS_BLOCK_HASH_REGTEST),
|
||||
};
|
||||
|
||||
// sanity check
|
||||
let genesis_block_hash = Sha256dHash::from_hex(genesis_block_hash_str)
|
||||
.map_err(btc_error::HashError)?;
|
||||
|
||||
assert_eq!(genesis_block.header.bitcoin_hash(), genesis_block_hash);
|
||||
if genesis_block.header.bitcoin_hash() != genesis_block_hash {
|
||||
error!("Failed passing genesis block sanity check ({} != {})", genesis_block.header.bitcoin_hash(), genesis_block_hash);
|
||||
panic!();
|
||||
}
|
||||
|
||||
let mut tx = self.tx_begin()?;
|
||||
SpvClient::insert_block_header(&mut tx, genesis_block.header, 0)?;
|
||||
|
||||
28
testnet/stacks-node/conf/krypton-follower-conf.toml
Normal file
28
testnet/stacks-node/conf/krypton-follower-conf.toml
Normal file
@@ -0,0 +1,28 @@
|
||||
[node]
|
||||
rpc_bind = "0.0.0.0:20443"
|
||||
p2p_bind = "0.0.0.0:20444"
|
||||
bootstrap_node = "048dd4f26101715853533dee005f0915375854fd5be73405f679c1917a5d4d16aaaf3c4c0d7a9c132a36b8c5fe1287f07dad8c910174d789eb24bdfb5ae26f5f27@krypton-master.blockstack.xyz:20444"
|
||||
|
||||
[burnchain]
|
||||
chain = "bitcoin"
|
||||
mode = "krypton"
|
||||
peer_host = "krypton.blockstack.org"
|
||||
rpc_port = 18443
|
||||
peer_port = 18444
|
||||
process_exit_at_block_height = 5130
|
||||
|
||||
[[mstx_balance]]
|
||||
address = "STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6"
|
||||
amount = 10000000000000000
|
||||
|
||||
[[mstx_balance]]
|
||||
address = "ST11NJTTKGVT6D1HY4NJRVQWMQM7TVAR091EJ8P2Y"
|
||||
amount = 10000000000000000
|
||||
|
||||
[[mstx_balance]]
|
||||
address = "ST1HB1T8WRNBYB0Y3T7WXZS38NKKPTBR3EG9EPJKR"
|
||||
amount = 10000000000000000
|
||||
|
||||
[[mstx_balance]]
|
||||
address = "STRYYQQ9M8KAF4NS7WNZQYY59X93XEKR31JP64CP"
|
||||
amount = 10000000000000000
|
||||
30
testnet/stacks-node/conf/xenon-miner-conf.toml
Normal file
30
testnet/stacks-node/conf/xenon-miner-conf.toml
Normal file
@@ -0,0 +1,30 @@
|
||||
[node]
|
||||
rpc_bind = "0.0.0.0:20443"
|
||||
p2p_bind = "0.0.0.0:20444"
|
||||
seed = "037435c194e9b01b3d7f7a2802d6684a3af68d05bbf4ec8f17021980d777691f1d"
|
||||
local_peer_seed = "037435c194e9b01b3d7f7a2802d6684a3af68d05bbf4ec8f17021980d777691f1d"
|
||||
miner = true
|
||||
# bootstrap_node = "048dd4f26101715853533dee005f0915375854fd5be73405f679c1917a5d4d16aaaf3c4c0d7a9c132a36b8c5fe1287f07dad8c910174d789eb24bdfb5ae26f5f27@xenon-master.blockstack.xyz:20444"
|
||||
|
||||
[burnchain]
|
||||
chain = "bitcoin"
|
||||
mode = "xenon"
|
||||
peer_host = "xenon.blockstack.org"
|
||||
rpc_port = 18332
|
||||
peer_port = 18333
|
||||
|
||||
[[mstx_balance]]
|
||||
address = "STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6"
|
||||
amount = 10000000000000000
|
||||
|
||||
[[mstx_balance]]
|
||||
address = "ST11NJTTKGVT6D1HY4NJRVQWMQM7TVAR091EJ8P2Y"
|
||||
amount = 10000000000000000
|
||||
|
||||
[[mstx_balance]]
|
||||
address = "ST1HB1T8WRNBYB0Y3T7WXZS38NKKPTBR3EG9EPJKR"
|
||||
amount = 10000000000000000
|
||||
|
||||
[[mstx_balance]]
|
||||
address = "STRYYQQ9M8KAF4NS7WNZQYY59X93XEKR31JP64CP"
|
||||
amount = 10000000000000000
|
||||
@@ -20,7 +20,6 @@ use stacks::burnchains::BurnchainStateTransitionOps;
|
||||
use stacks::burnchains::Burnchain;
|
||||
use stacks::burnchains::db::BurnchainDB;
|
||||
use stacks::burnchains::Error as burnchain_error;
|
||||
use stacks::burnchains::bitcoin::BitcoinNetworkType;
|
||||
use stacks::burnchains::bitcoin::address::{BitcoinAddress, BitcoinAddressType};
|
||||
use stacks::burnchains::bitcoin::indexer::{BitcoinIndexer, BitcoinIndexerRuntime, BitcoinIndexerConfig};
|
||||
use stacks::burnchains::bitcoin::spv::SpvClient;
|
||||
@@ -65,7 +64,7 @@ impl BitcoinRegtestController {
|
||||
std::fs::create_dir_all(&config.node.get_burnchain_path())
|
||||
.expect("Unable to create workdir");
|
||||
|
||||
let res = SpvClient::new(&config.burnchain.spv_headers_path, 0, None, BitcoinNetworkType::Regtest, true, false);
|
||||
let res = SpvClient::new(&config.burnchain.spv_headers_path, 0, None, config.burnchain.get_bitcoin_network().1, true, false);
|
||||
if let Err(err) = res {
|
||||
error!("Unable to init block headers: {}", err);
|
||||
panic!()
|
||||
@@ -127,9 +126,9 @@ impl BitcoinRegtestController {
|
||||
}
|
||||
|
||||
fn setup_indexer_runtime(&mut self) -> (Burnchain, BitcoinIndexer) {
|
||||
let network = "regtest".to_string();
|
||||
let (network_name, network_type) = self.config.burnchain.get_bitcoin_network();
|
||||
let working_dir = self.config.get_burn_db_path();
|
||||
let burnchain = match Burnchain::new(&working_dir, &self.config.burnchain.chain, &network) {
|
||||
let burnchain = match Burnchain::new(&working_dir, &self.config.burnchain.chain, &network_name) {
|
||||
Ok(burnchain) => burnchain,
|
||||
Err(e) => {
|
||||
error!("Failed to instantiate burnchain: {}", e);
|
||||
@@ -137,7 +136,7 @@ impl BitcoinRegtestController {
|
||||
}
|
||||
};
|
||||
|
||||
let indexer_runtime = BitcoinIndexerRuntime::new(BitcoinNetworkType::Regtest);
|
||||
let indexer_runtime = BitcoinIndexerRuntime::new(network_type);
|
||||
let burnchain_indexer = BitcoinIndexer {
|
||||
config: self.indexer_config.clone(),
|
||||
runtime: indexer_runtime
|
||||
@@ -269,8 +268,9 @@ impl BitcoinRegtestController {
|
||||
pub fn get_utxos(&self, public_key: &Secp256k1PublicKey, amount_required: u64) -> Option<Vec<UTXO>> {
|
||||
// Configure UTXO filter
|
||||
let pkh = Hash160::from_data(&public_key.to_bytes()).to_bytes().to_vec();
|
||||
let (_, network_id) = self.config.burnchain.get_bitcoin_network();
|
||||
let address = BitcoinAddress::from_bytes(
|
||||
BitcoinNetworkType::Regtest,
|
||||
network_id,
|
||||
BitcoinAddressType::PublicKeyHash,
|
||||
&pkh)
|
||||
.expect("Public key incorrect");
|
||||
@@ -606,8 +606,9 @@ impl BitcoinRegtestController {
|
||||
};
|
||||
|
||||
let pkh = Hash160::from_data(&public_key).to_bytes().to_vec();
|
||||
let (_, network_id) = self.config.burnchain.get_bitcoin_network();
|
||||
let address = BitcoinAddress::from_bytes(
|
||||
BitcoinNetworkType::Regtest,
|
||||
network_id,
|
||||
BitcoinAddressType::PublicKeyHash,
|
||||
&pkh)
|
||||
.expect("Public key incorrect");
|
||||
@@ -727,8 +728,9 @@ impl BurnchainController for BitcoinRegtestController {
|
||||
|
||||
let pk = hex_bytes(&local_mining_pubkey).expect("Invalid byte sequence");
|
||||
let pkh = Hash160::from_data(&pk).to_bytes().to_vec();
|
||||
let (_, network_id) = self.config.burnchain.get_bitcoin_network();
|
||||
let address = BitcoinAddress::from_bytes(
|
||||
BitcoinNetworkType::Regtest,
|
||||
network_id,
|
||||
BitcoinAddressType::PublicKeyHash,
|
||||
&pkh)
|
||||
.expect("Public key incorrect");
|
||||
@@ -1013,8 +1015,9 @@ impl BitcoinRPCRequest {
|
||||
let label = "";
|
||||
|
||||
let pkh = Hash160::from_data(&public_key.to_bytes()).to_bytes().to_vec();
|
||||
let (_, network_id) = config.burnchain.get_bitcoin_network();
|
||||
let address = BitcoinAddress::from_bytes(
|
||||
BitcoinNetworkType::Regtest,
|
||||
network_id,
|
||||
BitcoinAddressType::PublicKeyHash,
|
||||
&pkh)
|
||||
.expect("Public key incorrect");
|
||||
|
||||
@@ -8,6 +8,7 @@ use rand::RngCore;
|
||||
use stacks::burnchains::{
|
||||
MagicBytes, BLOCKSTACK_MAGIC_MAINNET};
|
||||
use stacks::burnchains::bitcoin::indexer::FIRST_BLOCK_MAINNET;
|
||||
use stacks::burnchains::bitcoin::BitcoinNetworkType;
|
||||
use stacks::net::connection::ConnectionOptions;
|
||||
use stacks::net::{Neighbor, NeighborKey, PeerAddress};
|
||||
use stacks::util::secp256k1::Secp256k1PublicKey;
|
||||
@@ -128,6 +129,91 @@ impl ConfigFile {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn krypton() -> ConfigFile {
|
||||
let burnchain = BurnchainConfigFile {
|
||||
mode: Some("krypton".to_string()),
|
||||
rpc_port: Some(18443),
|
||||
peer_port: Some(18444),
|
||||
peer_host: Some("krypton.blockstack.org".to_string()),
|
||||
process_exit_at_block_height: Some(5130), // 1 block every 2m, 24 hours * 7 + 300 blocks initially mined for seeding faucet / miner
|
||||
..BurnchainConfigFile::default()
|
||||
};
|
||||
|
||||
let node = NodeConfigFile {
|
||||
bootstrap_node: Some("048dd4f26101715853533dee005f0915375854fd5be73405f679c1917a5d4d16aaaf3c4c0d7a9c132a36b8c5fe1287f07dad8c910174d789eb24bdfb5ae26f5f27@argon.blockstack.org:20444".to_string()),
|
||||
miner: Some(false),
|
||||
..NodeConfigFile::default()
|
||||
};
|
||||
|
||||
let balances = vec![
|
||||
InitialBalanceFile {
|
||||
address: "STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6".to_string(),
|
||||
amount: 10000000000000000,
|
||||
},
|
||||
InitialBalanceFile {
|
||||
address: "ST11NJTTKGVT6D1HY4NJRVQWMQM7TVAR091EJ8P2Y".to_string(),
|
||||
amount: 10000000000000000,
|
||||
},
|
||||
InitialBalanceFile {
|
||||
address: "ST1HB1T8WRNBYB0Y3T7WXZS38NKKPTBR3EG9EPJKR".to_string(),
|
||||
amount: 10000000000000000,
|
||||
},
|
||||
InitialBalanceFile {
|
||||
address: "STRYYQQ9M8KAF4NS7WNZQYY59X93XEKR31JP64CP".to_string(),
|
||||
amount: 10000000000000000,
|
||||
},
|
||||
];
|
||||
|
||||
ConfigFile {
|
||||
burnchain: Some(burnchain),
|
||||
node: Some(node),
|
||||
mstx_balance: Some(balances),
|
||||
..ConfigFile::default()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn xenon() -> ConfigFile {
|
||||
let burnchain = BurnchainConfigFile {
|
||||
mode: Some("xenon".to_string()),
|
||||
rpc_port: Some(18332),
|
||||
peer_port: Some(18333),
|
||||
peer_host: Some("xenon.blockstack.org".to_string()),
|
||||
..BurnchainConfigFile::default()
|
||||
};
|
||||
|
||||
let node = NodeConfigFile {
|
||||
bootstrap_node: Some("048dd4f26101715853533dee005f0915375854fd5be73405f679c1917a5d4d16aaaf3c4c0d7a9c132a36b8c5fe1287f07dad8c910174d789eb24bdfb5ae26f5f27@xenon.blockstack.org:20444".to_string()),
|
||||
miner: Some(false),
|
||||
..NodeConfigFile::default()
|
||||
};
|
||||
|
||||
let balances = vec![
|
||||
InitialBalanceFile {
|
||||
address: "STB44HYPYAT2BB2QE513NSP81HTMYWBJP02HPGK6".to_string(),
|
||||
amount: 10000000000000000,
|
||||
},
|
||||
InitialBalanceFile {
|
||||
address: "ST11NJTTKGVT6D1HY4NJRVQWMQM7TVAR091EJ8P2Y".to_string(),
|
||||
amount: 10000000000000000,
|
||||
},
|
||||
InitialBalanceFile {
|
||||
address: "ST1HB1T8WRNBYB0Y3T7WXZS38NKKPTBR3EG9EPJKR".to_string(),
|
||||
amount: 10000000000000000,
|
||||
},
|
||||
InitialBalanceFile {
|
||||
address: "STRYYQQ9M8KAF4NS7WNZQYY59X93XEKR31JP64CP".to_string(),
|
||||
amount: 10000000000000000,
|
||||
},
|
||||
];
|
||||
|
||||
ConfigFile {
|
||||
burnchain: Some(burnchain),
|
||||
node: Some(node),
|
||||
mstx_balance: Some(balances),
|
||||
..ConfigFile::default()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn helium() -> ConfigFile {
|
||||
// ## Settings for local testnet, relying on a local bitcoind server
|
||||
// ## running with the following bitcoin.conf:
|
||||
@@ -307,7 +393,7 @@ impl Config {
|
||||
None => default_burnchain_config
|
||||
};
|
||||
|
||||
let supported_modes = vec!["mocknet", "helium", "neon", "argon"];
|
||||
let supported_modes = vec!["mocknet", "helium", "neon", "argon", "krypton", "xenon"];
|
||||
|
||||
if !supported_modes.contains(&burnchain.mode.as_str()) {
|
||||
panic!("Setting burnchain.network not supported (should be: {})", supported_modes.join(", "))
|
||||
@@ -538,6 +624,15 @@ impl BurnchainConfig {
|
||||
let sock_addr = addrs_iter.next().unwrap();
|
||||
sock_addr
|
||||
}
|
||||
|
||||
pub fn get_bitcoin_network(&self) -> (String, BitcoinNetworkType) {
|
||||
match self.mode.as_str() {
|
||||
"mainnet" => ("mainnet".to_string(), BitcoinNetworkType::Mainnet),
|
||||
"xenon" => ("testnet".to_string(), BitcoinNetworkType::Testnet),
|
||||
"helium" | "neon" | "argon" | "krypton" => ("regtest".to_string(), BitcoinNetworkType::Regtest),
|
||||
_ => panic!("Invalid bitcoin mode -- expected mainnet, testnet, or regtest")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Deserialize, Default)]
|
||||
|
||||
@@ -66,6 +66,14 @@ fn main() {
|
||||
args.finish().unwrap();
|
||||
ConfigFile::argon()
|
||||
}
|
||||
"krypton" => {
|
||||
args.finish().unwrap();
|
||||
ConfigFile::krypton()
|
||||
}
|
||||
"xenon" => {
|
||||
args.finish().unwrap();
|
||||
ConfigFile::xenon()
|
||||
}
|
||||
"start" => {
|
||||
let config_path: String = args.value_from_str("--config").unwrap();
|
||||
args.finish().unwrap();
|
||||
@@ -99,7 +107,7 @@ fn main() {
|
||||
warn!("Helium runloop exited: {}", e);
|
||||
return
|
||||
}
|
||||
} else if conf.burnchain.mode == "neon" || conf.burnchain.mode == "argon" {
|
||||
} else if conf.burnchain.mode == "neon" || conf.burnchain.mode == "argon" || conf.burnchain.mode == "krypton" || conf.burnchain.mode == "xenon" {
|
||||
let mut run_loop = neon::RunLoop::new(conf);
|
||||
run_loop.start(num_round);
|
||||
} else {
|
||||
@@ -131,7 +139,11 @@ helium\t\tStart a node based on a local setup relying on a local instance of bit
|
||||
\t\t rpcuser=helium
|
||||
\t\t rpcpassword=helium
|
||||
|
||||
argon\t\tStart a node that will join and stream blocks from the public argon testnet, powered by Blockstack.
|
||||
argon\t\tStart a node that will join and stream blocks from the public argon testnet, powered by Blockstack (Proof of Burn).
|
||||
|
||||
krypton\t\tStart a node that will join and stream blocks from the public krypton testnet, powered by Blockstack via (Proof of Transfer).
|
||||
|
||||
xenon\t\tStart a node that will join and stream blocks from the public xenon testnet, decentralized.
|
||||
|
||||
start\t\tStart a node with a config of your own. Can be used for joining a network, starting new chain, etc.
|
||||
\t\tArguments:
|
||||
|
||||
@@ -5,8 +5,7 @@ use crate::{Config, NeonGenesisNode, BurnchainController, EventDispatcher,
|
||||
use stacks::chainstate::burn::db::sortdb::SortitionDB;
|
||||
use stacks::burnchains::bitcoin::address::BitcoinAddress;
|
||||
use stacks::burnchains::{Address, Burnchain};
|
||||
use stacks::burnchains::bitcoin::{BitcoinNetworkType,
|
||||
address::{BitcoinAddressType}};
|
||||
use stacks::burnchains::bitcoin::{address::{BitcoinAddressType}};
|
||||
use stacks::chainstate::coordinator::{ChainsCoordinator, CoordinatorCommunication};
|
||||
use stacks::chainstate::coordinator::comm::{CoordinatorChannels, CoordinatorReceivers};
|
||||
|
||||
@@ -93,7 +92,7 @@ impl RunLoop {
|
||||
let is_miner = if self.config.node.miner {
|
||||
let keychain = Keychain::default(self.config.node.seed.clone());
|
||||
let btc_addr = BitcoinAddress::from_bytes(
|
||||
BitcoinNetworkType::Regtest,
|
||||
self.config.burnchain.get_bitcoin_network().1,
|
||||
BitcoinAddressType::PublicKeyHash,
|
||||
&Keychain::address_from_burnchain_signer(&keychain.get_burnchain_signer()).to_bytes())
|
||||
.unwrap();
|
||||
|
||||
@@ -27,7 +27,7 @@ fn neon_integration_test_conf() -> (Config, StacksAddress) {
|
||||
let keychain = Keychain::default(conf.node.seed.clone());
|
||||
|
||||
conf.node.miner = true;
|
||||
|
||||
conf.burnchain.mode = "neon".into();
|
||||
conf.burnchain.username = Some("neon-tester".into());
|
||||
conf.burnchain.password = Some("neon-tester-pass".into());
|
||||
conf.burnchain.peer_host = "127.0.0.1".into();
|
||||
|
||||
Reference in New Issue
Block a user