Skip to content
This repository has been archived by the owner on Jun 30, 2023. It is now read-only.

Commit

Permalink
add mining totalGas;
Browse files Browse the repository at this point in the history
impl mining block state root calculate;
opt mining block create block;
split mining stages from sync stages;
support serial mining;
support static nodes in configs;

add async delay and send block later;
  • Loading branch information
galaio authored and brilliant-lx committed Nov 17, 2022
1 parent fac0932 commit f4afb49
Show file tree
Hide file tree
Showing 18 changed files with 390 additions and 234 deletions.
145 changes: 60 additions & 85 deletions bin/akula.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use akula::{
consensus::{engine_factory, Consensus, ForkChoiceMode, InitialParams, ParliaInitialParams},
crypto::signer::ECDSASigner,
kv::tables::CHAINDATA_TABLES,
mining::state::*,
mining::{state::*, StagedMining},
models::*,
p2p::node::NodeBuilder,
rpc::{
Expand Down Expand Up @@ -253,7 +253,6 @@ fn main() -> anyhow::Result<()> {

let chain_config = ChainConfig::from(chainspec.clone());

let mining_db = db.clone();
if !opt.no_rpc {
tokio::spawn({
let db = db.clone();
Expand Down Expand Up @@ -482,7 +481,7 @@ fn main() -> anyhow::Result<()> {
InitialParams::Parlia(ParliaInitialParams {
bls_prv_key: opt.bls_secret_key,
bls_pub_key: opt.bls_public_key,
node: Some(Arc::clone(&node)),
node: Some(node.clone()),
sync_stage: Some(staged_sync.current_stage()),
})
}
Expand Down Expand Up @@ -553,7 +552,7 @@ fn main() -> anyhow::Result<()> {
if !opt.skip_commitment {
staged_sync.push(HashState::new(etl_temp_dir.clone(), None), !opt.prune);
staged_sync.push_with_unwind_priority(
Interhashes::new(etl_temp_dir.clone(), None),
Interhashes::new(etl_temp_dir.clone(), None, None),
!opt.prune,
1,
);
Expand Down Expand Up @@ -588,97 +587,73 @@ fn main() -> anyhow::Result<()> {
);

if can_mine {
staged_sync.is_mining = true;
info!("Running staged mining");
let mut consensus_config = engine_factory(
Some(db.clone()),
chainspec.clone(),
Some(opt.engine_listen_address),
params.clone(),
)?;
tokio::spawn(async move {
let mut staged_mining = stagedsync::StagedSync::new();
staged_mining.is_mining = true;
consensus_config.authorize(ECDSASigner::from_secret(&opt.mine_secretkey.unwrap()[..]));
let config = MiningConfig {
enabled: true,
ether_base: opt.mine_etherbase.unwrap().clone(),
secret_key: opt.mine_secretkey.unwrap().clone(),
extra_data: opt.mine_extradata.map(Bytes::from).clone(),
consensus: consensus_config,
dao_fork_block: Some(BigInt::new(num_bigint::Sign::Plus, vec![])),
dao_fork_support: false,
gas_limit: 30000000,
};
let mining_config_mutex = Arc::new(Mutex::new(config));
info!("Mining enabled");
let mining_block = MiningBlock {
header: BlockHeader {
parent_hash: H256::zero(),
ommers_hash: H256::zero(),
beneficiary: Address::zero(),
state_root: H256::zero(),
transactions_root: H256::zero(),
receipts_root: H256::zero(),
logs_bloom: Bloom::zero(),
difficulty: U256::ZERO,
number: BlockNumber(0),
gas_limit: 0,
gas_used: 0,
timestamp: 0,
extra_data: Bytes::new(),
mix_hash: H256::zero(),
nonce: H64::zero(),
base_fee_per_gas: None,
},
ommers: Default::default(),
transactions: vec![],
};
let mining_block_mutex = Arc::new(Mutex::new(mining_block));
let mining_status = MiningStatus::new();
let mining_status_mutex = Arc::new(Mutex::new(mining_status));
staged_mining.push(
CreateBlock {
mining_status: Arc::clone(&mining_status_mutex),
mining_block: Arc::clone(&mining_block_mutex),
mining_config: Arc::clone(&mining_config_mutex),
chain_spec: chainspec.clone(),
},
false,
);

// TODO start mining async, just set sync mining now
// tokio::spawn(async move {
let mut staged_mining = StagedMining::new();
consensus_config.authorize(ECDSASigner::from_secret(&opt.mine_secretkey.unwrap()[..]));
let mining_config = Arc::new(Mutex::new(MiningConfig {
enabled: true,
ether_base: opt.mine_etherbase.unwrap().clone(),
secret_key: opt.mine_secretkey.unwrap().clone(),
extra_data: opt.mine_extradata.map(Bytes::from).clone(),
consensus: consensus_config,
dao_fork_block: Some(BigInt::new(num_bigint::Sign::Plus, vec![])),
dao_fork_support: false,
gas_limit: 30000000,
}));
info!("Mining enabled");
let mining_block = Arc::new(Mutex::new(MiningBlock::default()));
let mining_status = Arc::new(Mutex::new(MiningStatus::new()));
staged_mining.push(
MiningExecBlock {
mining_status: Arc::clone(&mining_status_mutex),
mining_block: Arc::clone(&mining_block_mutex),
mining_config: Arc::clone(&mining_config_mutex),
chain_spec: chainspec.clone(),
},
false,
);
CreateBlock {
mining_status: mining_status.clone(),
mining_block: mining_block.clone(),
mining_config: mining_config.clone(),
chain_spec: chainspec.clone(),
node: node.clone(),
},
);

// TODO Error: Faulty cumulative index: max gas less than current gas (1395722 < 1532487), you should mining after latest block
// staged_sync.push(HashState::new(etl_temp_dir.clone(), None), !opt.prune);
//
// staged_sync.push_with_unwind_priority(
// Interhashes::new(etl_temp_dir.clone(), None),
// !opt.prune,
// 1,
// );
info!("createBlock stage enabled");
staged_mining.push(
MiningExecBlock {
mining_status: mining_status.clone(),
mining_block: mining_block.clone(),
mining_config: mining_config.clone(),
chain_spec: chainspec.clone(),
},
);

staged_mining.push(
MiningFinishBlock {
mining_status: Arc::clone(&mining_status_mutex),
mining_block: Arc::clone(&mining_block_mutex),
mining_config: Arc::clone(&mining_config_mutex),
chain_spec: chainspec.clone(),
node: node.clone(),
},
false,
);
staged_mining.run(&mining_db).await.unwrap()
});
staged_mining.push(
TotalGasIndex {},
);

staged_mining.push(HashState::new(etl_temp_dir.clone(), None));

staged_mining.push(
Interhashes::new(etl_temp_dir.clone(), None, Some(mining_block.clone())),
);
info!("createBlock stage enabled");

staged_mining.push(
MiningFinishBlock {
mining_status: mining_status.clone(),
mining_block: mining_block.clone(),
mining_config: mining_config.clone(),
chain_spec: chainspec.clone(),
node: node.clone(),
},
);
// TODO start mining async, just set sync mining
// staged_mining.run(&mining_db).await.unwrap()
staged_sync.enable_mining(staged_mining);
// });
}

info!("Running staged sync");
Expand Down
10 changes: 10 additions & 0 deletions src/consensus/fork_choice_graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ impl ForkChoiceGraph {
self.skip_list.clear();
self.chains.clear();
self.q.clear();
info!("fork choice graph clear q {:?}", self.q);
}

#[inline]
Expand All @@ -72,10 +73,12 @@ impl ForkChoiceGraph {

#[inline]
pub fn insert_with_hash(&mut self, hash: H256, header: BlockHeader) {
info!("try insert {}:{:?}", header.number, hash);
if self.q.contains_key(&hash) {
return;
}

info!("inserted {}:{:?}", header.number, hash);
self.skip_list
.entry(header.parent_hash)
.or_insert(HashSet::new())
Expand All @@ -94,12 +97,18 @@ impl ForkChoiceGraph {
pub fn chain_head(&mut self) -> Option<H256> {
let mut roots = HashSet::new();

info!(
"chain_head skip_list {:?}, raw {:?}, q {:?}",
self.skip_list, self.raw, self.q
);
for (hash, _) in self.q.iter() {
info!("chain_head q.iter {:?}", hash);
if !self.skip_list.contains_key(hash) && self.raw.contains_key(hash) {
roots.insert(*hash);
}
}
if roots.is_empty() {
info!("chain_head got empty roots.");
return None;
}

Expand Down Expand Up @@ -129,6 +138,7 @@ impl ForkChoiceGraph {
};
Some(*head_hash)
} else {
info!("chain_head max_by_key none.");
None
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/consensus/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ use std::{
};
use tokio::sync::watch;
use tracing::*;
use crate::p2p::node::Node;

#[derive(Debug)]
pub enum FinalizationChange {
Expand Down Expand Up @@ -195,8 +196,9 @@ pub trait Consensus: Debug + Send + Sync + 'static {
/// return bool indicate if block is seal correctly. if false, just skip it.
fn seal(
&mut self,
_node: Arc<Node>,
_header_reader: &dyn HeaderReader,
_block: &mut Block,
mut _block: Block,
) -> anyhow::Result<bool, DuoError> {
Ok(true)
}
Expand Down
Loading

0 comments on commit f4afb49

Please sign in to comment.