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 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(),
|
||||||
|
|
|
@ -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};
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
|
@ -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![],
|
||||||
|
|
|
@ -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
|
||||||
|
|
11
grin.toml
11
grin.toml
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -286,11 +285,6 @@ impl NetToChainAdapter {
|
||||||
} else {
|
} else {
|
||||||
chain::NONE
|
chain::NONE
|
||||||
};
|
};
|
||||||
let opts = if global::is_production_mode() {
|
|
||||||
opts
|
|
||||||
} else {
|
|
||||||
opts | chain::EASY_POW
|
|
||||||
};
|
|
||||||
opts
|
opts
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -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()),
|
||||||
|
|
Loading…
Reference in a new issue