Skip to content

Commit 0a39b0c

Browse files
committed
TermSeconds changes are applied after a term change
So much trait bounds propagations
1 parent 8012c69 commit 0a39b0c

File tree

16 files changed

+109
-43
lines changed

16 files changed

+109
-43
lines changed

core/src/block.rs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use primitives::{Bytes, H256};
2929
use rlp::{Decodable, DecoderError, Encodable, RlpStream, UntrustedRlp};
3030

3131
use super::invoice::Invoice;
32-
use crate::client::EngineInfo;
32+
use crate::client::{EngineInfo, TermInfo};
3333
use crate::consensus::CodeChainEngine;
3434
use crate::error::{BlockError, Error};
3535
use crate::transaction::{SignedTransaction, UnverifiedTransaction};
@@ -216,10 +216,17 @@ impl<'x> OpenBlock<'x> {
216216
}
217217

218218
/// Turn this into a `ClosedBlock`.
219-
pub fn close(mut self, parent_header: &Header, parent_common_params: &CommonParams) -> Result<ClosedBlock, Error> {
219+
pub fn close(
220+
mut self,
221+
parent_header: &Header,
222+
parent_common_params: &CommonParams,
223+
term_common_params: Option<&CommonParams>,
224+
) -> Result<ClosedBlock, Error> {
220225
let unclosed_state = self.block.state.clone();
221226

222-
if let Err(e) = self.engine.on_close_block(&mut self.block, parent_header, parent_common_params) {
227+
if let Err(e) =
228+
self.engine.on_close_block(&mut self.block, parent_header, parent_common_params, term_common_params)
229+
{
223230
warn!("Encountered error on closing the block: {}", e);
224231
return Err(e)
225232
}
@@ -255,8 +262,11 @@ impl<'x> OpenBlock<'x> {
255262
mut self,
256263
parent_header: &Header,
257264
parent_common_params: &CommonParams,
265+
term_common_params: Option<&CommonParams>,
258266
) -> Result<LockedBlock, Error> {
259-
if let Err(e) = self.engine.on_close_block(&mut self.block, parent_header, parent_common_params) {
267+
if let Err(e) =
268+
self.engine.on_close_block(&mut self.block, parent_header, parent_common_params, term_common_params)
269+
{
260270
warn!("Encountered error on closing the block: {}", e);
261271
return Err(e)
262272
}
@@ -454,7 +464,7 @@ impl IsBlock for SealedBlock {
454464
}
455465

456466
/// Enact the block given by block header, transactions and uncles
457-
pub fn enact<C: ChainTimeInfo + EngineInfo + FindActionHandler>(
467+
pub fn enact<C: ChainTimeInfo + EngineInfo + FindActionHandler + TermInfo>(
458468
header: &Header,
459469
transactions: &[SignedTransaction],
460470
engine: &CodeChainEngine,
@@ -468,7 +478,17 @@ pub fn enact<C: ChainTimeInfo + EngineInfo + FindActionHandler>(
468478
b.push_transactions(transactions, client, parent.number(), parent.timestamp())?;
469479

470480
let parent_common_params = client.common_params((*header.parent_hash()).into()).unwrap();
471-
b.close_and_lock(parent, &parent_common_params)
481+
let term_common_params = {
482+
let block_number = client
483+
.last_term_finished_block_num((*header.parent_hash()).into())
484+
.expect("The block of the parent hash should exist");
485+
if block_number == 0 {
486+
None
487+
} else {
488+
Some(client.common_params((block_number).into()).expect("Common params should exist"))
489+
}
490+
};
491+
b.close_and_lock(parent, &parent_common_params, term_common_params.as_ref())
472492
}
473493

474494
#[cfg(test)]
@@ -487,7 +507,8 @@ mod tests {
487507
let db = scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
488508
let b = OpenBlock::try_new(&*scheme.engine, db, &genesis_header, Address::default(), vec![]).unwrap();
489509
let parent_common_params = CommonParams::default_for_test();
490-
let b = b.close_and_lock(&genesis_header, &parent_common_params).unwrap();
510+
let term_common_params = CommonParams::default_for_test();
511+
let b = b.close_and_lock(&genesis_header, &parent_common_params, Some(&term_common_params)).unwrap();
491512
let _ = b.seal(&*scheme.engine, vec![]);
492513
}
493514
}

core/src/consensus/blake_pow/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ impl ConsensusEngine for BlakePoW {
165165
block: &mut ExecutedBlock,
166166
_parent_header: &Header,
167167
_parent_common_params: &CommonParams,
168+
_term_common_params: Option<&CommonParams>,
168169
) -> Result<(), Error> {
169170
let author = *block.header().author();
170171
let total_reward = self.block_reward(block.header().number())

core/src/consensus/cuckoo/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ impl ConsensusEngine for Cuckoo {
175175
block: &mut ExecutedBlock,
176176
_parent_header: &Header,
177177
_parent_common_params: &CommonParams,
178+
_term_common_params: Option<&CommonParams>,
178179
) -> Result<(), Error> {
179180
let author = *block.header().author();
180181
let total_reward = self.block_reward(block.header().number())
@@ -267,7 +268,14 @@ mod tests {
267268
let block = OpenBlock::try_new(engine, db, &header, Default::default(), vec![]).unwrap();
268269
let mut executed_block = block.block().clone();
269270

270-
assert!(engine.on_close_block(&mut executed_block, &genesis_header, &CommonParams::default_for_test()).is_ok());
271+
assert!(engine
272+
.on_close_block(
273+
&mut executed_block,
274+
&genesis_header,
275+
&CommonParams::default_for_test(),
276+
Some(&CommonParams::default_for_test())
277+
)
278+
.is_ok());
271279
assert_eq!(0xd, engine.machine().balance(&executed_block, header.author()).unwrap());
272280
}
273281

core/src/consensus/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ pub trait ConsensusEngine: Sync + Send {
219219
_block: &mut ExecutedBlock,
220220
_parent_header: &Header,
221221
_parent_common_params: &CommonParams,
222+
_term_common_params: Option<&CommonParams>,
222223
) -> Result<(), Error> {
223224
Ok(())
224225
}

core/src/consensus/null_engine/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ impl ConsensusEngine for NullEngine {
6060
block: &mut ExecutedBlock,
6161
_parent_header: &Header,
6262
_parent_common_params: &CommonParams,
63+
_term_common_params: Option<&CommonParams>,
6364
) -> Result<(), Error> {
6465
let (author, total_reward) = {
6566
let header = block.header();

core/src/consensus/simple_poa/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ impl ConsensusEngine for SimplePoA {
119119
block: &mut ExecutedBlock,
120120
_parent_header: &Header,
121121
_parent_common_params: &CommonParams,
122+
_term_common_params: Option<&CommonParams>,
122123
) -> Result<(), Error> {
123124
let author = *block.header().author();
124125
let total_reward = self.block_reward(block.header().number())
@@ -182,7 +183,8 @@ mod tests {
182183
let genesis_header = scheme.genesis_header();
183184
let b = OpenBlock::try_new(engine, db, &genesis_header, Default::default(), vec![]).unwrap();
184185
let parent_common_params = CommonParams::default_for_test();
185-
let b = b.close_and_lock(&genesis_header, &parent_common_params).unwrap();
186+
let term_common_params = CommonParams::default_for_test();
187+
let b = b.close_and_lock(&genesis_header, &parent_common_params, Some(&term_common_params)).unwrap();
186188
if let Some(seal) = engine.generate_seal(b.block(), &genesis_header).seal_fields() {
187189
assert!(b.try_seal(engine, seal).is_ok());
188190
}

core/src/consensus/solo/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ impl ConsensusEngine for Solo {
8080
block: &mut ExecutedBlock,
8181
parent_header: &Header,
8282
parent_common_params: &CommonParams,
83+
_term_common_params: Option<&CommonParams>,
8384
) -> Result<(), Error> {
8485
let author = *block.header().author();
8586
let (total_reward, total_min_fee) = {
@@ -160,7 +161,8 @@ mod tests {
160161
let genesis_header = scheme.genesis_header();
161162
let b = OpenBlock::try_new(engine, db, &genesis_header, Default::default(), vec![]).unwrap();
162163
let parent_common_params = CommonParams::default_for_test();
163-
let b = b.close_and_lock(&genesis_header, &parent_common_params).unwrap();
164+
let term_common_params = CommonParams::default_for_test();
165+
let b = b.close_and_lock(&genesis_header, &parent_common_params, Some(&term_common_params)).unwrap();
164166
if let Some(seal) = engine.generate_seal(b.block(), &genesis_header).seal_fields() {
165167
assert!(b.try_seal(engine, seal).is_ok());
166168
}

core/src/consensus/tendermint/engine.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ impl ConsensusEngine for Tendermint {
139139
block: &mut ExecutedBlock,
140140
parent_header: &Header,
141141
parent_common_params: &CommonParams,
142+
term_common_params: Option<&CommonParams>,
142143
) -> Result<(), Error> {
143144
let author = *block.header().author();
144145
let (total_reward, total_min_fee) = {
@@ -166,6 +167,7 @@ impl ConsensusEngine for Tendermint {
166167
if let Some(block_number) =
167168
block_number_if_term_changed(block.header(), parent_header, parent_common_params)
168169
{
170+
// First term change
169171
stake::on_term_close(block.state_mut(), block_number, &[])?;
170172
}
171173
return Ok(())
@@ -176,8 +178,9 @@ impl ConsensusEngine for Tendermint {
176178

177179
stake::add_intermediate_rewards(block.state_mut(), author, block_author_reward)?;
178180

181+
let term_common_params = term_common_params.expect("TermCommonParams should exist");
179182
let last_term_finished_block_num = if let Some(block_number) =
180-
block_number_if_term_changed(block.header(), parent_header, parent_common_params)
183+
block_number_if_term_changed(block.header(), parent_header, term_common_params)
181184
{
182185
block_number
183186
} else {
@@ -335,9 +338,9 @@ impl ConsensusEngine for Tendermint {
335338
fn block_number_if_term_changed(
336339
header: &Header,
337340
parent_header: &Header,
338-
parent_common_params: &CommonParams,
341+
common_params: &CommonParams,
339342
) -> Option<BlockNumber> {
340-
let term_seconds = parent_common_params.term_seconds();
343+
let term_seconds = common_params.term_seconds();
341344
if term_seconds == 0 {
342345
return None
343346
}

core/src/consensus/tendermint/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ mod tests {
154154
let genesis_header = scheme.genesis_header();
155155
let b = OpenBlock::try_new(scheme.engine.as_ref(), db, &genesis_header, proposer, vec![]).unwrap();
156156
let common_params = CommonParams::default_for_test();
157-
let b = b.close(&genesis_header, &common_params).unwrap();
157+
let term_common_params = CommonParams::default_for_test();
158+
let b = b.close(&genesis_header, &common_params, Some(&term_common_params)).unwrap();
158159
if let Some(seal) = scheme.engine.generate_seal(b.block(), &genesis_header).seal_fields() {
159160
(b, seal)
160161
} else {

core/src/miner/miner.rs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use super::{MinerService, MinerStatus, TransactionImportResult};
3939
use crate::account_provider::{AccountProvider, Error as AccountProviderError};
4040
use crate::block::{Block, ClosedBlock, IsBlock};
4141
use crate::client::{
42-
AccountData, BlockChainTrait, BlockProducer, Client, EngineInfo, ImportBlock, MiningBlockChainClient,
42+
AccountData, BlockChainTrait, BlockProducer, Client, EngineInfo, ImportBlock, MiningBlockChainClient, TermInfo,
4343
};
4444
use crate::codechain_machine::CodeChainMachine;
4545
use crate::consensus::{CodeChainEngine, EngineType};
@@ -445,7 +445,7 @@ impl Miner {
445445

446446
/// Prepares new block for sealing including top transactions from queue.
447447
fn prepare_block<
448-
C: AccountData + BlockChainTrait + BlockProducer + ChainTimeInfo + EngineInfo + FindActionHandler,
448+
C: AccountData + BlockChainTrait + BlockProducer + ChainTimeInfo + EngineInfo + FindActionHandler + TermInfo,
449449
>(
450450
&self,
451451
parent_block_id: BlockId,
@@ -532,7 +532,17 @@ impl Miner {
532532
(parent_header.decode(), parent_hash)
533533
};
534534
let parent_common_params = chain.common_params(parent_hash.into()).unwrap();
535-
let block = open_block.close(&parent_header, &parent_common_params)?;
535+
let term_common_params = {
536+
let block_number = chain
537+
.last_term_finished_block_num(parent_hash.into())
538+
.expect("The block of the parent hash should exist");
539+
if block_number == 0 {
540+
None
541+
} else {
542+
Some(chain.common_params((block_number).into()).expect("Common params should exist"))
543+
}
544+
};
545+
let block = open_block.close(&parent_header, &parent_common_params, term_common_params.as_ref())?;
536546

537547
let fetch_seq = |p: &Public| {
538548
let address = public_to_address(p);
@@ -751,7 +761,7 @@ impl MinerService for Miner {
751761
}
752762

753763
fn prepare_work_sealing<
754-
C: AccountData + BlockChainTrait + BlockProducer + ChainTimeInfo + EngineInfo + FindActionHandler,
764+
C: AccountData + BlockChainTrait + BlockProducer + ChainTimeInfo + EngineInfo + FindActionHandler + TermInfo,
755765
>(
756766
&self,
757767
client: &C,
@@ -800,8 +810,14 @@ impl MinerService for Miner {
800810

801811
fn update_sealing<C>(&self, chain: &C, parent_block: BlockId, allow_empty_block: bool)
802812
where
803-
C: AccountData + BlockChainTrait + BlockProducer + EngineInfo + ImportBlock + ChainTimeInfo + FindActionHandler,
804-
{
813+
C: AccountData
814+
+ BlockChainTrait
815+
+ BlockProducer
816+
+ EngineInfo
817+
+ ImportBlock
818+
+ ChainTimeInfo
819+
+ FindActionHandler
820+
+ TermInfo, {
805821
ctrace!(MINER, "update_sealing: preparing a block");
806822

807823
let parent_block_number = chain.block_header(&parent_block).expect("Parent is always exist").number();
@@ -879,7 +895,7 @@ impl MinerService for Miner {
879895

880896
fn map_sealing_work<C, F, T>(&self, client: &C, f: F) -> Option<T>
881897
where
882-
C: AccountData + BlockChainTrait + BlockProducer + ChainTimeInfo + EngineInfo + FindActionHandler,
898+
C: AccountData + BlockChainTrait + BlockProducer + ChainTimeInfo + EngineInfo + FindActionHandler + TermInfo,
883899
F: FnOnce(&ClosedBlock) -> T, {
884900
ctrace!(MINER, "map_sealing_work: entering");
885901
self.prepare_work_sealing(client);
@@ -890,7 +906,7 @@ impl MinerService for Miner {
890906
ret.map(f)
891907
}
892908

893-
fn import_external_transactions<C: MiningBlockChainClient + EngineInfo>(
909+
fn import_external_transactions<C: MiningBlockChainClient + EngineInfo + TermInfo>(
894910
&self,
895911
client: &C,
896912
transactions: Vec<UnverifiedTransaction>,
@@ -915,7 +931,7 @@ impl MinerService for Miner {
915931
results
916932
}
917933

918-
fn import_own_transaction<C: MiningBlockChainClient + EngineInfo>(
934+
fn import_own_transaction<C: MiningBlockChainClient + EngineInfo + TermInfo>(
919935
&self,
920936
chain: &C,
921937
tx: SignedTransaction,
@@ -960,7 +976,7 @@ impl MinerService for Miner {
960976
imported
961977
}
962978

963-
fn import_incomplete_transaction<C: MiningBlockChainClient + AccountData + EngineInfo>(
979+
fn import_incomplete_transaction<C: MiningBlockChainClient + AccountData + EngineInfo + TermInfo>(
964980
&self,
965981
client: &C,
966982
account_provider: &AccountProvider,
@@ -1020,7 +1036,7 @@ impl MinerService for Miner {
10201036
self.mem_pool.read().future_transactions()
10211037
}
10221038

1023-
fn start_sealing<C: MiningBlockChainClient + EngineInfo>(&self, client: &C) {
1039+
fn start_sealing<C: MiningBlockChainClient + EngineInfo + TermInfo>(&self, client: &C) {
10241040
cdebug!(MINER, "Start sealing");
10251041
self.sealing_enabled.store(true, Ordering::Relaxed);
10261042
// ------------------------------------------------------------------

0 commit comments

Comments
 (0)