Skip to content

Commit 89c9b40

Browse files
remagpiemergify[bot]
authored andcommitted
Derive parent block information inside consensus engine
1 parent 41e0654 commit 89c9b40

File tree

15 files changed

+41
-84
lines changed

15 files changed

+41
-84
lines changed

core/src/block.rs

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -220,25 +220,20 @@ impl<'x> OpenBlock<'x> {
220220
pub fn close(
221221
mut self,
222222
parent_header: &Header,
223-
parent_common_params: &CommonParams,
224223
term_common_params: Option<&CommonParams>,
225224
) -> Result<ClosedBlock, Error> {
226225
let unclosed_state = self.block.state.clone();
227226

228-
if let Err(e) =
229-
self.engine.on_close_block(&mut self.block, parent_header, parent_common_params, term_common_params)
230-
{
227+
if let Err(e) = self.engine.on_close_block(&mut self.block, term_common_params) {
231228
warn!("Encountered error on closing the block: {}", e);
232229
return Err(e)
233230
}
234231
let header = self.block.header().clone();
235232
for handler in self.engine.action_handlers() {
236-
handler.on_close_block(self.block.state_mut(), &header, parent_header, parent_common_params).map_err(
237-
|e| {
238-
warn!("Encountered error in {}::on_close_block", handler.name());
239-
e
240-
},
241-
)?;
233+
handler.on_close_block(self.block.state_mut(), &header).map_err(|e| {
234+
warn!("Encountered error in {}::on_close_block", handler.name());
235+
e
236+
})?;
242237
}
243238

244239
let state_root = self.block.state.commit().map_err(|e| {
@@ -262,23 +257,18 @@ impl<'x> OpenBlock<'x> {
262257
pub fn close_and_lock(
263258
mut self,
264259
parent_header: &Header,
265-
parent_common_params: &CommonParams,
266260
term_common_params: Option<&CommonParams>,
267261
) -> Result<LockedBlock, Error> {
268-
if let Err(e) =
269-
self.engine.on_close_block(&mut self.block, parent_header, parent_common_params, term_common_params)
270-
{
262+
if let Err(e) = self.engine.on_close_block(&mut self.block, term_common_params) {
271263
warn!("Encountered error on closing the block: {}", e);
272264
return Err(e)
273265
}
274266
let header = self.block.header().clone();
275267
for handler in self.engine.action_handlers() {
276-
handler.on_close_block(self.block.state_mut(), &header, parent_header, parent_common_params).map_err(
277-
|e| {
278-
warn!("Encountered error in {}::on_close_block", handler.name());
279-
e
280-
},
281-
)?;
268+
handler.on_close_block(self.block.state_mut(), &header).map_err(|e| {
269+
warn!("Encountered error in {}::on_close_block", handler.name());
270+
e
271+
})?;
282272
}
283273

284274
let state_root = self.block.state.commit().map_err(|e| {
@@ -503,7 +493,6 @@ pub fn enact<C: ChainTimeInfo + EngineInfo + FindActionHandler + TermInfo>(
503493
b.populate_from(header);
504494
b.push_transactions(transactions, client, parent.number(), parent.timestamp())?;
505495

506-
let parent_common_params = client.common_params((*header.parent_hash()).into()).unwrap();
507496
let term_common_params = {
508497
let block_number = client
509498
.last_term_finished_block_num((*header.parent_hash()).into())
@@ -514,7 +503,7 @@ pub fn enact<C: ChainTimeInfo + EngineInfo + FindActionHandler + TermInfo>(
514503
Some(client.common_params((block_number).into()).expect("Common params should exist"))
515504
}
516505
};
517-
b.close_and_lock(parent, &parent_common_params, term_common_params.as_ref())
506+
b.close_and_lock(parent, term_common_params.as_ref())
518507
}
519508

520509
#[cfg(test)]
@@ -532,9 +521,8 @@ mod tests {
532521
let genesis_header = scheme.genesis_header();
533522
let db = scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
534523
let b = OpenBlock::try_new(&*scheme.engine, db, &genesis_header, Address::default(), vec![]).unwrap();
535-
let parent_common_params = CommonParams::default_for_test();
536524
let term_common_params = CommonParams::default_for_test();
537-
let b = b.close_and_lock(&genesis_header, &parent_common_params, Some(&term_common_params)).unwrap();
525+
let b = b.close_and_lock(&genesis_header, Some(&term_common_params)).unwrap();
538526
let _ = b.seal(&*scheme.engine, vec![]);
539527
}
540528
}

core/src/client/test_client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ impl super::EngineClient for TestBlockChainClient {
645645

646646
impl EngineInfo for TestBlockChainClient {
647647
fn common_params(&self, _block_id: BlockId) -> Option<CommonParams> {
648-
unimplemented!()
648+
Some(*self.scheme.engine.machine().genesis_common_params())
649649
}
650650

651651
fn metadata_seq(&self, _block_id: BlockId) -> Option<u64> {

core/src/consensus/blake_pow/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,6 @@ impl ConsensusEngine for BlakePoW {
163163
fn on_close_block(
164164
&self,
165165
block: &mut ExecutedBlock,
166-
_parent_header: &Header,
167-
_parent_common_params: &CommonParams,
168166
_term_common_params: Option<&CommonParams>,
169167
) -> Result<(), Error> {
170168
let author = *block.header().author();

core/src/consensus/cuckoo/mod.rs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,6 @@ impl ConsensusEngine for Cuckoo {
173173
fn on_close_block(
174174
&self,
175175
block: &mut ExecutedBlock,
176-
_parent_header: &Header,
177-
_parent_common_params: &CommonParams,
178176
_term_common_params: Option<&CommonParams>,
179177
) -> Result<(), Error> {
180178
let author = *block.header().author();
@@ -261,21 +259,13 @@ mod tests {
261259
#[test]
262260
fn on_close_block() {
263261
let scheme = Scheme::new_test_cuckoo();
264-
let genesis_header = scheme.genesis_header();
265262
let engine = &*scheme.engine;
266263
let db = scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
267264
let header = Header::default();
268265
let block = OpenBlock::try_new(engine, db, &header, Default::default(), vec![]).unwrap();
269266
let mut executed_block = block.block().clone();
270267

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());
268+
assert!(engine.on_close_block(&mut executed_block, Some(&CommonParams::default_for_test())).is_ok());
279269
assert_eq!(0xd, engine.machine().balance(&executed_block, header.author()).unwrap());
280270
}
281271

core/src/consensus/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,6 @@ pub trait ConsensusEngine: Sync + Send {
225225
fn on_close_block(
226226
&self,
227227
_block: &mut ExecutedBlock,
228-
_parent_header: &Header,
229-
_parent_common_params: &CommonParams,
230228
_term_common_params: Option<&CommonParams>,
231229
) -> Result<(), Error> {
232230
Ok(())

core/src/consensus/null_engine/mod.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
mod params;
1818

1919
use ckey::Address;
20-
use ctypes::{CommonParams, Header};
20+
use ctypes::CommonParams;
2121

2222
use self::params::NullEngineParams;
2323
use super::ConsensusEngine;
@@ -58,8 +58,6 @@ impl ConsensusEngine for NullEngine {
5858
fn on_close_block(
5959
&self,
6060
block: &mut ExecutedBlock,
61-
_parent_header: &Header,
62-
_parent_common_params: &CommonParams,
6361
_term_common_params: Option<&CommonParams>,
6462
) -> Result<(), Error> {
6563
let (author, total_reward) = {

core/src/consensus/simple_poa/mod.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,6 @@ impl ConsensusEngine for SimplePoA {
121121
fn on_close_block(
122122
&self,
123123
block: &mut ExecutedBlock,
124-
_parent_header: &Header,
125-
_parent_common_params: &CommonParams,
126124
_term_common_params: Option<&CommonParams>,
127125
) -> Result<(), Error> {
128126
let author = *block.header().author();
@@ -186,9 +184,8 @@ mod tests {
186184
let db = scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
187185
let genesis_header = scheme.genesis_header();
188186
let b = OpenBlock::try_new(engine, db, &genesis_header, Default::default(), vec![]).unwrap();
189-
let parent_common_params = CommonParams::default_for_test();
190187
let term_common_params = CommonParams::default_for_test();
191-
let b = b.close_and_lock(&genesis_header, &parent_common_params, Some(&term_common_params)).unwrap();
188+
let b = b.close_and_lock(&genesis_header, Some(&term_common_params)).unwrap();
192189
if let Some(seal) = engine.generate_seal(Some(b.block()), &genesis_header).seal_fields() {
193190
assert!(b.try_seal(engine, seal).is_ok());
194191
}

core/src/consensus/solo/mod.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ impl Solo {
5656
action_handlers,
5757
}
5858
}
59+
60+
fn client(&self) -> Option<Arc<dyn ConsensusClient>> {
61+
self.client.read().as_ref()?.upgrade()
62+
}
5963
}
6064

6165
impl ConsensusEngine for Solo {
@@ -82,10 +86,13 @@ impl ConsensusEngine for Solo {
8286
fn on_close_block(
8387
&self,
8488
block: &mut ExecutedBlock,
85-
parent_header: &Header,
86-
parent_common_params: &CommonParams,
8789
_term_common_params: Option<&CommonParams>,
8890
) -> Result<(), Error> {
91+
let client = self.client().ok_or(EngineError::CannotOpenBlock)?;
92+
93+
let parent_hash = *block.header().parent_hash();
94+
let parent = client.block_header(&parent_hash.into()).expect("Parent header must exist");
95+
let parent_common_params = client.common_params(parent_hash.into()).expect("CommonParams of parent must exist");
8996
let author = *block.header().author();
9097
let (total_reward, total_min_fee) = {
9198
let transactions = block.transactions();
@@ -115,7 +122,7 @@ impl ConsensusEngine for Solo {
115122
let last_term_finished_block_num = {
116123
let header = block.header();
117124
let current_term_period = header.timestamp() / term_seconds;
118-
let parent_term_period = parent_header.timestamp() / term_seconds;
125+
let parent_term_period = parent.timestamp() / term_seconds;
119126
if current_term_period == parent_term_period {
120127
return Ok(())
121128
}
@@ -173,9 +180,8 @@ mod tests {
173180
let db = client.scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
174181
let genesis_header = client.scheme.genesis_header();
175182
let b = OpenBlock::try_new(&*engine, db, &genesis_header, Default::default(), vec![]).unwrap();
176-
let parent_common_params = CommonParams::default_for_test();
177183
let term_common_params = CommonParams::default_for_test();
178-
let b = b.close_and_lock(&genesis_header, &parent_common_params, Some(&term_common_params)).unwrap();
184+
let b = b.close_and_lock(&genesis_header, Some(&term_common_params)).unwrap();
179185
if let Some(seal) = engine.generate_seal(Some(b.block()), &genesis_header).seal_fields() {
180186
assert!(b.try_seal(&*engine, seal).is_ok());
181187
}

core/src/consensus/stake/mod.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,7 @@ impl ActionHandler for Stake {
156156
action.verify(current_params, client, validators)
157157
}
158158

159-
fn on_close_block(
160-
&self,
161-
_state: &mut TopLevelState,
162-
_header: &Header,
163-
_parent_header: &Header,
164-
_parent_common_params: &CommonParams,
165-
) -> StateResult<()> {
159+
fn on_close_block(&self, _state: &mut TopLevelState, _header: &Header) -> StateResult<()> {
166160
Ok(())
167161
}
168162
}

core/src/consensus/tendermint/engine.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,16 @@ impl ConsensusEngine for Tendermint {
137137
fn on_close_block(
138138
&self,
139139
block: &mut ExecutedBlock,
140-
parent_header: &Header,
141-
parent_common_params: &CommonParams,
142140
term_common_params: Option<&CommonParams>,
143141
) -> Result<(), Error> {
144-
let block_number = block.header().number();
142+
let client = self.client().ok_or(EngineError::CannotOpenBlock)?;
143+
144+
let parent_hash = *block.header().parent_hash();
145+
let parent = client.block_header(&parent_hash.into()).expect("Parent header must exist").decode();
146+
let parent_common_params = client.common_params(parent_hash.into()).expect("CommonParams of parent must exist");
145147
let author = *block.header().author();
148+
let block_number = block.header().number();
149+
146150
let (total_reward, total_min_fee) = {
147151
let transactions = block.transactions();
148152
let block_reward = self.block_reward(block_number);
@@ -178,7 +182,7 @@ impl ConsensusEngine for Tendermint {
178182
}
179183
}
180184

181-
if !is_term_changed(block.header(), parent_header, term_seconds) {
185+
if !is_term_changed(block.header(), &parent, term_seconds) {
182186
return Ok(())
183187
}
184188

@@ -187,7 +191,6 @@ impl ConsensusEngine for Tendermint {
187191
_ => {
188192
let rewards = stake::drain_previous_rewards(block.state_mut())?;
189193
let start_of_the_current_term = metadata.last_term_finished_block_num() + 1;
190-
let client = self.client().ok_or(EngineError::CannotOpenBlock)?;
191194

192195
if term > 1 {
193196
let start_of_the_previous_term = {

0 commit comments

Comments
 (0)