Ported acbe983 and 58d7dc7 from testnet1 branch

This commit is contained in:
Ignotus Peverell 2017-11-16 18:17:56 -05:00
parent 341269d95f
commit fec8858ead
No known key found for this signature in database
GPG key ID: 99CD25F39F8F8211
13 changed files with 48 additions and 47 deletions

View file

@ -33,8 +33,6 @@ use sumtree;
use types::*; use types::*;
use util::LOGGER; use util::LOGGER;
use core::global;
const MAX_ORPHANS: usize = 20; const MAX_ORPHANS: usize = 20;
/// Facade to the blockchain block processing pipeline and storage. Provides /// Facade to the blockchain block processing pipeline and storage. Provides
@ -154,6 +152,15 @@ impl Chain {
orphans.push_front((opts, b)); orphans.push_front((opts, b));
orphans.truncate(MAX_ORPHANS); orphans.truncate(MAX_ORPHANS);
}, },
Err(Error::Unfit(ref msg)) => {
debug!(
LOGGER,
"Block {} at {} is unfit at this time: {}",
b.hash(),
b.header.height,
msg
);
}
Err(ref e) => { Err(ref e) => {
info!( info!(
LOGGER, LOGGER,
@ -184,12 +191,6 @@ impl Chain {
} }
fn ctx_from_head(&self, head: Tip, opts: Options) -> pipe::BlockContext { fn ctx_from_head(&self, head: Tip, opts: Options) -> pipe::BlockContext {
let opts = if global::is_production_mode() {
opts
} else {
opts | EASY_POW
};
pipe::BlockContext { pipe::BlockContext {
opts: opts, opts: opts,
store: self.store.clone(), store: self.store.clone(),

View file

@ -43,4 +43,4 @@ pub mod types;
// Re-export the base interface // Re-export the base interface
pub use chain::Chain; pub use chain::Chain;
pub use types::{ChainAdapter, ChainStore, Error, Options, Tip, EASY_POW, NONE, SKIP_POW, SYNC}; pub use types::{ChainAdapter, ChainStore, Error, Options, Tip, NONE, SKIP_POW, SYNC};

View file

@ -155,11 +155,8 @@ fn validate_header(header: &BlockHeader, ctx: &mut BlockContext) -> Result<(), E
} }
if !ctx.opts.intersects(SKIP_POW) { if !ctx.opts.intersects(SKIP_POW) {
let cycle_size = if ctx.opts.intersects(EASY_POW) { let cycle_size = global::sizeshift();
global::sizeshift()
} else {
consensus::DEFAULT_SIZESHIFT
};
debug!(LOGGER, "Validating block with cuckoo size {}", cycle_size); debug!(LOGGER, "Validating block with cuckoo size {}", cycle_size);
if !(ctx.pow_verifier)(header, cycle_size as u32) { if !(ctx.pow_verifier)(header, cycle_size as u32) {
return Err(Error::InvalidPow); return Err(Error::InvalidPow);

View file

@ -32,8 +32,6 @@ bitflags! {
const NONE = 0b00000001, const NONE = 0b00000001,
/// Runs without checking the Proof of Work, mostly to make testing easier. /// Runs without checking the Proof of Work, mostly to make testing easier.
const SKIP_POW = 0b00000010, const SKIP_POW = 0b00000010,
/// Runs PoW verification with a lower cycle size.
const EASY_POW = 0b00000100,
/// Adds block while in syncing mode. /// Adds block while in syncing mode.
const SYNC = 0b00001000, const SYNC = 0b00001000,
} }

View file

@ -92,7 +92,7 @@ fn mine_empty_chain() {
).unwrap(); ).unwrap();
let bhash = b.hash(); let bhash = b.hash();
chain.process_block(b, chain::EASY_POW).unwrap(); chain.process_block(b, chain::NONE).unwrap();
// checking our new head // checking our new head
let head = chain.head().unwrap(); let head = chain.head().unwrap();

View file

@ -97,7 +97,7 @@ fn test_coinbase_maturity() {
.contains(transaction::COINBASE_OUTPUT,) .contains(transaction::COINBASE_OUTPUT,)
); );
chain.process_block(block, chain::EASY_POW).unwrap(); chain.process_block(block, chain::NONE).unwrap();
let prev = chain.head_header().unwrap(); let prev = chain.head_header().unwrap();
@ -126,7 +126,7 @@ fn test_coinbase_maturity() {
global::sizeshift() as u32, global::sizeshift() as u32,
).unwrap(); ).unwrap();
let result = chain.process_block(block, chain::EASY_POW); let result = chain.process_block(block, chain::NONE);
match result { match result {
Err(Error::ImmatureCoinbase) => (), Err(Error::ImmatureCoinbase) => (),
_ => panic!("expected ImmatureCoinbase error here"), _ => panic!("expected ImmatureCoinbase error here"),
@ -154,7 +154,7 @@ fn test_coinbase_maturity() {
global::sizeshift() as u32, global::sizeshift() as u32,
).unwrap(); ).unwrap();
chain.process_block(block, chain::EASY_POW).unwrap(); chain.process_block(block, chain::NONE).unwrap();
} }
let prev = chain.head_header().unwrap(); let prev = chain.head_header().unwrap();
@ -175,7 +175,7 @@ fn test_coinbase_maturity() {
global::sizeshift() as u32, global::sizeshift() as u32,
).unwrap(); ).unwrap();
let result = chain.process_block(block, chain::EASY_POW); let result = chain.process_block(block, chain::NONE);
match result { match result {
Ok(_) => (), Ok(_) => (),
Err(Error::ImmatureCoinbase) => panic!("we should not get an ImmatureCoinbase here"), Err(Error::ImmatureCoinbase) => panic!("we should not get an ImmatureCoinbase here"),

View file

@ -53,12 +53,19 @@ pub fn genesis_testnet1() -> core::Block {
previous: core::hash::Hash([0xff; 32]), previous: core::hash::Hash([0xff; 32]),
timestamp: time::Tm { timestamp: time::Tm {
tm_year: 2017 - 1900, tm_year: 2017 - 1900,
tm_mon: 12, tm_mon: 10,
tm_mday: 25, tm_mday: 16,
tm_hour: 20,
..time::empty_tm() ..time::empty_tm()
}, },
nonce: 1, nonce: 28205,
pow: core::Proof::zero(consensus::PROOFSIZE), pow: core::Proof::new(vec![0x21e, 0x7a2, 0xeae, 0x144e, 0x1b1c, 0x1fbd,
0x203a, 0x214b, 0x293b, 0x2b74, 0x2bfa, 0x2c26,
0x32bb, 0x346a, 0x34c7, 0x37c5, 0x4164, 0x42cc,
0x4cc3, 0x55af, 0x5a70, 0x5b14, 0x5e1c, 0x5f76,
0x6061, 0x60f9, 0x61d7, 0x6318, 0x63a1, 0x63fb,
0x649b, 0x64e5, 0x65a1, 0x6b69, 0x70f8, 0x71c7,
0x71cd, 0x7492, 0x7b11, 0x7db8, 0x7f29, 0x7ff8]),
..Default::default() ..Default::default()
}, },
inputs: vec![], inputs: vec![],

View file

@ -88,7 +88,7 @@ pub fn sizeshift() -> u8 {
match *param_ref { match *param_ref {
ChainTypes::AutomatedTesting => AUTOMATED_TESTING_SIZESHIFT, ChainTypes::AutomatedTesting => AUTOMATED_TESTING_SIZESHIFT,
ChainTypes::UserTesting => USER_TESTING_SIZESHIFT, ChainTypes::UserTesting => USER_TESTING_SIZESHIFT,
ChainTypes::Testnet1 => DEFAULT_SIZESHIFT, ChainTypes::Testnet1 => USER_TESTING_SIZESHIFT,
ChainTypes::Mainnet => DEFAULT_SIZESHIFT, ChainTypes::Mainnet => DEFAULT_SIZESHIFT,
} }
} }
@ -134,7 +134,6 @@ pub fn is_production_mode() -> bool {
ChainTypes::Mainnet == *param_ref ChainTypes::Mainnet == *param_ref
} }
/// Helper function to get a nonce known to create a valid POW on /// Helper function to get a nonce known to create a valid POW on
/// the genesis block, to prevent it taking ages. Should be fine for now /// the genesis block, to prevent it taking ages. Should be fine for now
/// as the genesis block POW solution turns out to be the same for every new /// as the genesis block POW solution turns out to be the same for every new

View file

@ -26,10 +26,11 @@ api_http_addr = "127.0.0.1:13413"
db_root = ".grin" db_root = ".grin"
#How to seed this server, can be None, List or WebStatic #How to seed this server, can be None, List or WebStatic
#
#seeding_type = "None"
seeding_type = "None" #If seeding_type = List, the list of peers to connect to.
#
#if seeding_type = List, the list of peers to connect to.
#seeds = ["192.168.0.1:8080","192.168.0.2:8080"] #seeds = ["192.168.0.1:8080","192.168.0.2:8080"]
#The chain type, which defines the genesis block and the set of cuckoo #The chain type, which defines the genesis block and the set of cuckoo
@ -37,8 +38,8 @@ seeding_type = "None"
#AutomatedTesting - For CI builds and instant blockchain creation #AutomatedTesting - For CI builds and instant blockchain creation
#UserTesting - For regular user testing (cuckoo 16) #UserTesting - For regular user testing (cuckoo 16)
#Testnet1 - Full production cuckoo parameter (cuckoo 30) #Testnet1 - Full production cuckoo parameter (cuckoo 30)
#
chain_type = "UserTesting" #chain_type = "UserTesting"
#7 = Bit flags for FULL_NODE, this structure needs to be changed #7 = Bit flags for FULL_NODE, this structure needs to be changed
#internally to make it more configurable #internally to make it more configurable

View file

@ -21,7 +21,6 @@ use core::core::{self, Output};
use core::core::block::BlockHeader; use core::core::block::BlockHeader;
use core::core::hash::{Hash, Hashed}; use core::core::hash::{Hash, Hashed};
use core::core::target::Difficulty; use core::core::target::Difficulty;
use core::global;
use p2p::{self, NetAdapter, PeerData, PeerStore, Server, State}; use p2p::{self, NetAdapter, PeerData, PeerStore, Server, State};
use pool; use pool;
use util::secp::pedersen::Commitment; use util::secp::pedersen::Commitment;
@ -285,11 +284,6 @@ impl NetToChainAdapter {
chain::SYNC chain::SYNC
} else { } else {
chain::NONE chain::NONE
};
let opts = if global::is_production_mode() {
opts
} else {
opts | chain::EASY_POW
}; };
opts opts
} }

View file

@ -507,12 +507,7 @@ impl Miner {
b.hash() b.hash()
); );
b.header.pow = proof; b.header.pow = proof;
let opts = if cuckoo_size < consensus::DEFAULT_SIZESHIFT as u32 { let res = self.chain.process_block(b, chain::NONE);
chain::EASY_POW
} else {
chain::NONE
};
let res = self.chain.process_block(b, opts);
if let Err(e) = res { if let Err(e) = res {
error!( error!(
LOGGER, LOGGER,

View file

@ -35,7 +35,7 @@ use util::LOGGER;
const PEER_MAX_COUNT: u32 = 25; const PEER_MAX_COUNT: u32 = 25;
const PEER_PREFERRED_COUNT: u32 = 8; const PEER_PREFERRED_COUNT: u32 = 8;
const SEEDS_URL: &'static str = "http://www.mimwim.org/seeds.txt"; const SEEDS_URL: &'static str = "http://grin-tech.org/seeds.txt";
pub struct Seeder { pub struct Seeder {
peer_store: Arc<p2p::PeerStore>, peer_store: Arc<p2p::PeerStore>,
@ -158,7 +158,7 @@ impl Seeder {
}) })
.and_then(|mut peers| { .and_then(|mut peers| {
// if so, get their addresses, otherwise use our seeds // if so, get their addresses, otherwise use our seeds
if peers.len() > 0 { if peers.len() > 3 {
thread_rng().shuffle(&mut peers[..]); thread_rng().shuffle(&mut peers[..]);
Box::new(future::ok(peers.iter().map(|p| p.addr).collect::<Vec<_>>())) Box::new(future::ok(peers.iter().map(|p| p.addr).collect::<Vec<_>>()))
} else { } else {
@ -218,6 +218,7 @@ pub fn web_seeds(h: reactor::Handle) -> Box<Future<Item = Vec<SocketAddr>, Error
let url = hyper::Uri::from_str(&SEEDS_URL).unwrap(); let url = hyper::Uri::from_str(&SEEDS_URL).unwrap();
let seeds = future::ok(()).and_then(move |_| { let seeds = future::ok(()).and_then(move |_| {
let client = hyper::Client::new(&h); let client = hyper::Client::new(&h);
debug!(LOGGER, "Retrieving seed nodes from {}", &SEEDS_URL);
// http get, filtering out non 200 results // http get, filtering out non 200 results
client client
@ -241,6 +242,7 @@ pub fn web_seeds(h: reactor::Handle) -> Box<Future<Item = Vec<SocketAddr>, Error
let addrs = res.split_whitespace() let addrs = res.split_whitespace()
.map(|s| s.parse().unwrap()) .map(|s| s.parse().unwrap())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
debug!(LOGGER, "Retrieved seed addresses: {:?}", addrs);
Ok(addrs) Ok(addrs)
}) })
}) })

View file

@ -81,6 +81,12 @@ pub enum Seeding {
Programmatic, Programmatic,
} }
impl Default for Seeding {
fn default() -> Seeding {
Seeding::None
}
}
/// Full server configuration, aggregating configurations required for the /// Full server configuration, aggregating configurations required for the
/// different components. /// different components.
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
@ -96,6 +102,7 @@ pub struct ServerConfig {
pub chain_type: ChainTypes, pub chain_type: ChainTypes,
/// Method used to get the list of seed nodes for initial bootstrap. /// Method used to get the list of seed nodes for initial bootstrap.
#[serde(default)]
pub seeding_type: Seeding, pub seeding_type: Seeding,
/// The list of seed nodes, if using Seeding as a seed type /// The list of seed nodes, if using Seeding as a seed type
@ -122,7 +129,7 @@ impl Default for ServerConfig {
db_root: ".grin".to_string(), db_root: ".grin".to_string(),
api_http_addr: "0.0.0.0:13413".to_string(), api_http_addr: "0.0.0.0:13413".to_string(),
capabilities: p2p::FULL_NODE, capabilities: p2p::FULL_NODE,
seeding_type: Seeding::None, seeding_type: Seeding::default(),
seeds: None, seeds: None,
p2p_config: Some(p2p::P2PConfig::default()), p2p_config: Some(p2p::P2PConfig::default()),
mining_config: Some(pow::types::MinerConfig::default()), mining_config: Some(pow::types::MinerConfig::default()),