Merge pull request #1819 from blockstack/feat/xenon-compatibility

Required adjustments for Krypton + Xenon
This commit is contained in:
Ludo Galabru
2020-08-26 20:59:37 -04:00
committed by GitHub
8 changed files with 191 additions and 21 deletions

View File

@@ -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)?;

View 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

View 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

View File

@@ -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");

View File

@@ -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)]

View File

@@ -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:

View File

@@ -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();

View File

@@ -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();