mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-01 17:01:09 +03:00
parent
341269d95f
commit
fec8858ead
13 changed files with 48 additions and 47 deletions
|
@ -33,8 +33,6 @@ use sumtree;
|
|||
use types::*;
|
||||
use util::LOGGER;
|
||||
|
||||
use core::global;
|
||||
|
||||
const MAX_ORPHANS: usize = 20;
|
||||
|
||||
/// Facade to the blockchain block processing pipeline and storage. Provides
|
||||
|
@ -154,6 +152,15 @@ impl Chain {
|
|||
orphans.push_front((opts, b));
|
||||
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) => {
|
||||
info!(
|
||||
LOGGER,
|
||||
|
@ -184,12 +191,6 @@ impl Chain {
|
|||
}
|
||||
|
||||
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 {
|
||||
opts: opts,
|
||||
store: self.store.clone(),
|
||||
|
|
|
@ -43,4 +43,4 @@ pub mod types;
|
|||
// Re-export the base interface
|
||||
|
||||
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};
|
||||
|
|
|
@ -155,11 +155,8 @@ fn validate_header(header: &BlockHeader, ctx: &mut BlockContext) -> Result<(), E
|
|||
}
|
||||
|
||||
if !ctx.opts.intersects(SKIP_POW) {
|
||||
let cycle_size = if ctx.opts.intersects(EASY_POW) {
|
||||
global::sizeshift()
|
||||
} else {
|
||||
consensus::DEFAULT_SIZESHIFT
|
||||
};
|
||||
let cycle_size = global::sizeshift();
|
||||
|
||||
debug!(LOGGER, "Validating block with cuckoo size {}", cycle_size);
|
||||
if !(ctx.pow_verifier)(header, cycle_size as u32) {
|
||||
return Err(Error::InvalidPow);
|
||||
|
|
|
@ -32,8 +32,6 @@ bitflags! {
|
|||
const NONE = 0b00000001,
|
||||
/// Runs without checking the Proof of Work, mostly to make testing easier.
|
||||
const SKIP_POW = 0b00000010,
|
||||
/// Runs PoW verification with a lower cycle size.
|
||||
const EASY_POW = 0b00000100,
|
||||
/// Adds block while in syncing mode.
|
||||
const SYNC = 0b00001000,
|
||||
}
|
||||
|
|
|
@ -92,7 +92,7 @@ fn mine_empty_chain() {
|
|||
).unwrap();
|
||||
|
||||
let bhash = b.hash();
|
||||
chain.process_block(b, chain::EASY_POW).unwrap();
|
||||
chain.process_block(b, chain::NONE).unwrap();
|
||||
|
||||
// checking our new head
|
||||
let head = chain.head().unwrap();
|
||||
|
|
|
@ -97,7 +97,7 @@ fn test_coinbase_maturity() {
|
|||
.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();
|
||||
|
||||
|
@ -126,7 +126,7 @@ fn test_coinbase_maturity() {
|
|||
global::sizeshift() as u32,
|
||||
).unwrap();
|
||||
|
||||
let result = chain.process_block(block, chain::EASY_POW);
|
||||
let result = chain.process_block(block, chain::NONE);
|
||||
match result {
|
||||
Err(Error::ImmatureCoinbase) => (),
|
||||
_ => panic!("expected ImmatureCoinbase error here"),
|
||||
|
@ -154,7 +154,7 @@ fn test_coinbase_maturity() {
|
|||
global::sizeshift() as u32,
|
||||
).unwrap();
|
||||
|
||||
chain.process_block(block, chain::EASY_POW).unwrap();
|
||||
chain.process_block(block, chain::NONE).unwrap();
|
||||
}
|
||||
|
||||
let prev = chain.head_header().unwrap();
|
||||
|
@ -175,7 +175,7 @@ fn test_coinbase_maturity() {
|
|||
global::sizeshift() as u32,
|
||||
).unwrap();
|
||||
|
||||
let result = chain.process_block(block, chain::EASY_POW);
|
||||
let result = chain.process_block(block, chain::NONE);
|
||||
match result {
|
||||
Ok(_) => (),
|
||||
Err(Error::ImmatureCoinbase) => panic!("we should not get an ImmatureCoinbase here"),
|
||||
|
|
|
@ -53,12 +53,19 @@ pub fn genesis_testnet1() -> core::Block {
|
|||
previous: core::hash::Hash([0xff; 32]),
|
||||
timestamp: time::Tm {
|
||||
tm_year: 2017 - 1900,
|
||||
tm_mon: 12,
|
||||
tm_mday: 25,
|
||||
tm_mon: 10,
|
||||
tm_mday: 16,
|
||||
tm_hour: 20,
|
||||
..time::empty_tm()
|
||||
},
|
||||
nonce: 1,
|
||||
pow: core::Proof::zero(consensus::PROOFSIZE),
|
||||
nonce: 28205,
|
||||
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()
|
||||
},
|
||||
inputs: vec![],
|
||||
|
|
|
@ -88,7 +88,7 @@ pub fn sizeshift() -> u8 {
|
|||
match *param_ref {
|
||||
ChainTypes::AutomatedTesting => AUTOMATED_TESTING_SIZESHIFT,
|
||||
ChainTypes::UserTesting => USER_TESTING_SIZESHIFT,
|
||||
ChainTypes::Testnet1 => DEFAULT_SIZESHIFT,
|
||||
ChainTypes::Testnet1 => USER_TESTING_SIZESHIFT,
|
||||
ChainTypes::Mainnet => DEFAULT_SIZESHIFT,
|
||||
}
|
||||
}
|
||||
|
@ -134,7 +134,6 @@ pub fn is_production_mode() -> bool {
|
|||
ChainTypes::Mainnet == *param_ref
|
||||
}
|
||||
|
||||
|
||||
/// 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
|
||||
/// as the genesis block POW solution turns out to be the same for every new
|
||||
|
|
11
grin.toml
11
grin.toml
|
@ -26,10 +26,11 @@ api_http_addr = "127.0.0.1:13413"
|
|||
db_root = ".grin"
|
||||
|
||||
#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"]
|
||||
|
||||
#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
|
||||
#UserTesting - For regular user testing (cuckoo 16)
|
||||
#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
|
||||
#internally to make it more configurable
|
||||
|
|
|
@ -21,7 +21,6 @@ use core::core::{self, Output};
|
|||
use core::core::block::BlockHeader;
|
||||
use core::core::hash::{Hash, Hashed};
|
||||
use core::core::target::Difficulty;
|
||||
use core::global;
|
||||
use p2p::{self, NetAdapter, PeerData, PeerStore, Server, State};
|
||||
use pool;
|
||||
use util::secp::pedersen::Commitment;
|
||||
|
@ -286,11 +285,6 @@ impl NetToChainAdapter {
|
|||
} else {
|
||||
chain::NONE
|
||||
};
|
||||
let opts = if global::is_production_mode() {
|
||||
opts
|
||||
} else {
|
||||
opts | chain::EASY_POW
|
||||
};
|
||||
opts
|
||||
}
|
||||
}
|
||||
|
|
|
@ -507,12 +507,7 @@ impl Miner {
|
|||
b.hash()
|
||||
);
|
||||
b.header.pow = proof;
|
||||
let opts = if cuckoo_size < consensus::DEFAULT_SIZESHIFT as u32 {
|
||||
chain::EASY_POW
|
||||
} else {
|
||||
chain::NONE
|
||||
};
|
||||
let res = self.chain.process_block(b, opts);
|
||||
let res = self.chain.process_block(b, chain::NONE);
|
||||
if let Err(e) = res {
|
||||
error!(
|
||||
LOGGER,
|
||||
|
|
|
@ -35,7 +35,7 @@ use util::LOGGER;
|
|||
|
||||
const PEER_MAX_COUNT: u32 = 25;
|
||||
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 {
|
||||
peer_store: Arc<p2p::PeerStore>,
|
||||
|
@ -158,7 +158,7 @@ impl Seeder {
|
|||
})
|
||||
.and_then(|mut peers| {
|
||||
// if so, get their addresses, otherwise use our seeds
|
||||
if peers.len() > 0 {
|
||||
if peers.len() > 3 {
|
||||
thread_rng().shuffle(&mut peers[..]);
|
||||
Box::new(future::ok(peers.iter().map(|p| p.addr).collect::<Vec<_>>()))
|
||||
} 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 seeds = future::ok(()).and_then(move |_| {
|
||||
let client = hyper::Client::new(&h);
|
||||
debug!(LOGGER, "Retrieving seed nodes from {}", &SEEDS_URL);
|
||||
|
||||
// http get, filtering out non 200 results
|
||||
client
|
||||
|
@ -241,6 +242,7 @@ pub fn web_seeds(h: reactor::Handle) -> Box<Future<Item = Vec<SocketAddr>, Error
|
|||
let addrs = res.split_whitespace()
|
||||
.map(|s| s.parse().unwrap())
|
||||
.collect::<Vec<_>>();
|
||||
debug!(LOGGER, "Retrieved seed addresses: {:?}", addrs);
|
||||
Ok(addrs)
|
||||
})
|
||||
})
|
||||
|
|
|
@ -81,6 +81,12 @@ pub enum Seeding {
|
|||
Programmatic,
|
||||
}
|
||||
|
||||
impl Default for Seeding {
|
||||
fn default() -> Seeding {
|
||||
Seeding::None
|
||||
}
|
||||
}
|
||||
|
||||
/// Full server configuration, aggregating configurations required for the
|
||||
/// different components.
|
||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||
|
@ -96,6 +102,7 @@ pub struct ServerConfig {
|
|||
pub chain_type: ChainTypes,
|
||||
|
||||
/// Method used to get the list of seed nodes for initial bootstrap.
|
||||
#[serde(default)]
|
||||
pub seeding_type: Seeding,
|
||||
|
||||
/// 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(),
|
||||
api_http_addr: "0.0.0.0:13413".to_string(),
|
||||
capabilities: p2p::FULL_NODE,
|
||||
seeding_type: Seeding::None,
|
||||
seeding_type: Seeding::default(),
|
||||
seeds: None,
|
||||
p2p_config: Some(p2p::P2PConfig::default()),
|
||||
mining_config: Some(pow::types::MinerConfig::default()),
|
||||
|
|
Loading…
Reference in a new issue