Skip to content

Commit d230207

Browse files
Seulgi Kimmergify[bot]
authored andcommitted
Make on_close_block receive the parent header and the parent parameters
1 parent 748d443 commit d230207

File tree

14 files changed

+101
-46
lines changed

14 files changed

+101
-46
lines changed

core/src/block.rs

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -216,30 +216,30 @@ impl<'x> OpenBlock<'x> {
216216
}
217217

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

226-
if let Err(e) = self.engine.on_close_block(&mut self.block, parent_common_params) {
222+
if let Err(e) = self.engine.on_close_block(&mut self.block, parent_header, parent_common_params) {
227223
warn!("Encountered error on closing the block: {}", e);
228224
return Err(e)
229225
}
226+
let header = self.block.header().clone();
230227
for handler in self.engine.action_handlers() {
231-
handler.on_close_block(self.block.state_mut()).map_err(|e| {
232-
warn!("Encountered error in {}::on_close_block", handler.name());
233-
e
234-
})?;
228+
handler.on_close_block(self.block.state_mut(), &header, parent_header, parent_common_params).map_err(
229+
|e| {
230+
warn!("Encountered error in {}::on_close_block", handler.name());
231+
e
232+
},
233+
)?;
235234
}
236235

237236
let state_root = self.block.state.commit().map_err(|e| {
238237
warn!("Encountered error on state commit: {}", e);
239238
e
240239
})?;
240+
let parent_transactions_root = parent_header.transactions_root();
241241
self.block.header.set_transactions_root(skewed_merkle_root(
242-
parent_transactions_root,
242+
*parent_transactions_root,
243243
self.block.transactions.iter().map(Encodable::rlp_bytes),
244244
));
245245
self.block.header.set_state_root(state_root);
@@ -253,33 +253,37 @@ impl<'x> OpenBlock<'x> {
253253
/// Turn this into a `LockedBlock`.
254254
pub fn close_and_lock(
255255
mut self,
256-
parent_transactions_root: H256,
256+
parent_header: &Header,
257257
parent_common_params: &CommonParams,
258258
) -> Result<LockedBlock, Error> {
259-
if let Err(e) = self.engine.on_close_block(&mut self.block, parent_common_params) {
259+
if let Err(e) = self.engine.on_close_block(&mut self.block, parent_header, parent_common_params) {
260260
warn!("Encountered error on closing the block: {}", e);
261261
return Err(e)
262262
}
263+
let header = self.block.header().clone();
263264
for handler in self.engine.action_handlers() {
264-
handler.on_close_block(self.block.state_mut()).map_err(|e| {
265-
warn!("Encountered error in {}::on_close_block", handler.name());
266-
e
267-
})?;
265+
handler.on_close_block(self.block.state_mut(), &header, parent_header, parent_common_params).map_err(
266+
|e| {
267+
warn!("Encountered error in {}::on_close_block", handler.name());
268+
e
269+
},
270+
)?;
268271
}
269272

270273
let state_root = self.block.state.commit().map_err(|e| {
271274
warn!("Encountered error on state commit: {}", e);
272275
e
273276
})?;
277+
let parent_transactions_root = parent_header.transactions_root();
274278
if self.block.header.transactions_root().is_zero() || self.block.header.transactions_root() == &BLAKE_NULL_RLP {
275279
self.block.header.set_transactions_root(skewed_merkle_root(
276-
parent_transactions_root,
280+
*parent_transactions_root,
277281
self.block.transactions.iter().map(Encodable::rlp_bytes),
278282
));
279283
}
280284
debug_assert_eq!(
281285
self.block.header.transactions_root(),
282-
&skewed_merkle_root(parent_transactions_root, self.block.transactions.iter().map(Encodable::rlp_bytes),)
286+
&skewed_merkle_root(*parent_transactions_root, self.block.transactions.iter().map(Encodable::rlp_bytes),)
283287
);
284288
self.block.header.set_state_root(state_root);
285289

@@ -464,7 +468,7 @@ pub fn enact<C: ChainTimeInfo + EngineInfo + FindActionHandler>(
464468
b.push_transactions(transactions, client, parent.number(), parent.timestamp())?;
465469

466470
let parent_common_params = client.common_params((*header.parent_hash()).into()).unwrap();
467-
b.close_and_lock(*parent.transactions_root(), &parent_common_params)
471+
b.close_and_lock(parent, &parent_common_params)
468472
}
469473

470474
#[cfg(test)]
@@ -482,9 +486,8 @@ mod tests {
482486
let genesis_header = scheme.genesis_header();
483487
let db = scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
484488
let b = OpenBlock::try_new(&*scheme.engine, db, &genesis_header, Address::default(), vec![]).unwrap();
485-
let parent_transactions_root = *genesis_header.transactions_root();
486489
let parent_common_params = CommonParams::default_for_test();
487-
let b = b.close_and_lock(parent_transactions_root, &parent_common_params).unwrap();
490+
let b = b.close_and_lock(&genesis_header, &parent_common_params).unwrap();
488491
let _ = b.seal(&*scheme.engine, vec![]);
489492
}
490493
}

core/src/consensus/blake_pow/mod.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,12 @@ impl ConsensusEngine for BlakePoW {
159159
header.set_score(score);
160160
}
161161

162-
fn on_close_block(&self, block: &mut ExecutedBlock, _parent_common_params: &CommonParams) -> Result<(), Error> {
162+
fn on_close_block(
163+
&self,
164+
block: &mut ExecutedBlock,
165+
_parent_header: &Header,
166+
_parent_common_params: &CommonParams,
167+
) -> Result<(), Error> {
163168
let author = *block.header().author();
164169
let total_reward = self.block_reward(block.header().number())
165170
+ self.block_fee(Box::new(block.transactions().to_owned().into_iter().map(Into::into)));

core/src/consensus/cuckoo/mod.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,12 @@ impl ConsensusEngine for Cuckoo {
169169
header.set_score(score);
170170
}
171171

172-
fn on_close_block(&self, block: &mut ExecutedBlock, _parent_common_params: &CommonParams) -> Result<(), Error> {
172+
fn on_close_block(
173+
&self,
174+
block: &mut ExecutedBlock,
175+
_parent_header: &Header,
176+
_parent_common_params: &CommonParams,
177+
) -> Result<(), Error> {
173178
let author = *block.header().author();
174179
let total_reward = self.block_reward(block.header().number())
175180
+ self.block_fee(Box::new(block.transactions().to_owned().into_iter().map(Into::into)));
@@ -250,13 +255,14 @@ mod tests {
250255
#[test]
251256
fn on_close_block() {
252257
let scheme = Scheme::new_test_cuckoo();
258+
let genesis_header = scheme.genesis_header();
253259
let engine = &*scheme.engine;
254260
let db = scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
255261
let header = Header::default();
256262
let block = OpenBlock::try_new(engine, db, &header, Default::default(), vec![]).unwrap();
257263
let mut executed_block = block.block().clone();
258264

259-
assert!(engine.on_close_block(&mut executed_block, &CommonParams::default_for_test()).is_ok());
265+
assert!(engine.on_close_block(&mut executed_block, &genesis_header, &CommonParams::default_for_test()).is_ok());
260266
assert_eq!(0xd, engine.machine().balance(&executed_block, header.author()).unwrap());
261267
}
262268

core/src/consensus/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ use crate::client::EngineClient;
5353
use crate::codechain_machine::CodeChainMachine;
5454
use crate::encoded;
5555
use crate::error::Error;
56-
use crate::header::Header;
5756
use crate::transaction::UnverifiedTransaction;
5857
use crate::views::HeaderView;
5958
use Client;
@@ -213,7 +212,12 @@ pub trait ConsensusEngine: Sync + Send {
213212
fn stop(&self) {}
214213

215214
/// Block transformation functions, after the transactions.
216-
fn on_close_block(&self, _block: &mut ExecutedBlock, _parent_common_params: &CommonParams) -> Result<(), Error> {
215+
fn on_close_block(
216+
&self,
217+
_block: &mut ExecutedBlock,
218+
_parent_header: &Header,
219+
_parent_common_params: &CommonParams,
220+
) -> Result<(), Error> {
217221
Ok(())
218222
}
219223

core/src/consensus/null_engine/mod.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
mod params;
1818

19-
use ctypes::CommonParams;
19+
use ctypes::{CommonParams, Header};
2020

2121
use self::params::NullEngineParams;
2222
use super::ConsensusEngine;
@@ -54,7 +54,12 @@ impl ConsensusEngine for NullEngine {
5454
EngineType::Solo
5555
}
5656

57-
fn on_close_block(&self, block: &mut ExecutedBlock, _parent_common_params: &CommonParams) -> Result<(), Error> {
57+
fn on_close_block(
58+
&self,
59+
block: &mut ExecutedBlock,
60+
_parent_header: &Header,
61+
_parent_common_params: &CommonParams,
62+
) -> Result<(), Error> {
5863
let (author, total_reward) = {
5964
let header = block.header();
6065
let author = *header.author();

core/src/consensus/simple_poa/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,12 @@ impl ConsensusEngine for SimplePoA {
113113
verify_external(header, &*self.validators)
114114
}
115115

116-
fn on_close_block(&self, block: &mut ExecutedBlock, _parent_common_params: &CommonParams) -> Result<(), Error> {
116+
fn on_close_block(
117+
&self,
118+
block: &mut ExecutedBlock,
119+
_parent_header: &Header,
120+
_parent_common_params: &CommonParams,
121+
) -> Result<(), Error> {
117122
let author = *block.header().author();
118123
let total_reward = self.block_reward(block.header().number())
119124
+ self.block_fee(Box::new(block.transactions().to_owned().into_iter().map(Into::into)));
@@ -169,9 +174,8 @@ mod tests {
169174
let db = scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
170175
let genesis_header = scheme.genesis_header();
171176
let b = OpenBlock::try_new(engine, db, &genesis_header, Default::default(), vec![]).unwrap();
172-
let parent_transactions_root = *genesis_header.transactions_root();
173177
let parent_common_params = CommonParams::default_for_test();
174-
let b = b.close_and_lock(parent_transactions_root, &parent_common_params).unwrap();
178+
let b = b.close_and_lock(&genesis_header, &parent_common_params).unwrap();
175179
if let Some(seal) = engine.generate_seal(b.block(), &genesis_header).seal_fields() {
176180
assert!(b.try_seal(engine, seal).is_ok());
177181
}

core/src/consensus/solo/mod.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,12 @@ impl ConsensusEngine for Solo<CodeChainMachine> {
7878
Seal::Solo
7979
}
8080

81-
fn on_close_block(&self, block: &mut ExecutedBlock, parent_common_params: &CommonParams) -> Result<(), Error> {
81+
fn on_close_block(
82+
&self,
83+
block: &mut ExecutedBlock,
84+
_parent_header: &Header,
85+
parent_common_params: &CommonParams,
86+
) -> Result<(), Error> {
8287
let author = *block.header().author();
8388
let (total_reward, total_min_fee) = {
8489
let transactions = block.transactions();
@@ -129,9 +134,8 @@ mod tests {
129134
let db = scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
130135
let genesis_header = scheme.genesis_header();
131136
let b = OpenBlock::try_new(engine, db, &genesis_header, Default::default(), vec![]).unwrap();
132-
let parent_transactions_root = *genesis_header.transactions_root();
133137
let parent_common_params = CommonParams::default_for_test();
134-
let b = b.close_and_lock(parent_transactions_root, &parent_common_params).unwrap();
138+
let b = b.close_and_lock(&genesis_header, &parent_common_params).unwrap();
135139
if let Some(seal) = engine.generate_seal(b.block(), &genesis_header).seal_fields() {
136140
assert!(b.try_seal(engine, seal).is_ok());
137141
}

core/src/consensus/stake/mod.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use std::sync::Arc;
2525
use ckey::Address;
2626
use cstate::{ActionHandler, StateResult, TopLevelState};
2727
use ctypes::errors::{RuntimeError, SyntaxError};
28+
use ctypes::{CommonParams, Header};
2829
use rlp::{Decodable, UntrustedRlp};
2930

3031
use self::action_data::{Delegation, StakeAccount, Stakeholders};
@@ -118,7 +119,13 @@ impl ActionHandler for Stake {
118119
Ok(())
119120
}
120121

121-
fn on_close_block(&self, _state: &mut TopLevelState) -> StateResult<()> {
122+
fn on_close_block(
123+
&self,
124+
_state: &mut TopLevelState,
125+
_header: &Header,
126+
_parent_header: &Header,
127+
_parent_common_params: &CommonParams,
128+
) -> StateResult<()> {
122129
Ok(())
123130
}
124131
}

core/src/consensus/tendermint/engine.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,12 @@ impl ConsensusEngine for Tendermint {
128128

129129
fn stop(&self) {}
130130

131-
fn on_close_block(&self, block: &mut ExecutedBlock, parent_common_params: &CommonParams) -> Result<(), Error> {
131+
fn on_close_block(
132+
&self,
133+
block: &mut ExecutedBlock,
134+
_parent_header: &Header,
135+
parent_common_params: &CommonParams,
136+
) -> Result<(), Error> {
132137
let author = *block.header().author();
133138
let (total_reward, total_min_fee) = {
134139
let transactions = block.transactions();

core/src/consensus/tendermint/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ mod tests {
151151
let genesis_header = scheme.genesis_header();
152152
let b = OpenBlock::try_new(scheme.engine.as_ref(), db, &genesis_header, proposer, vec![]).unwrap();
153153
let common_params = CommonParams::default_for_test();
154-
let b = b.close(*genesis_header.transactions_root(), &common_params).unwrap();
154+
let b = b.close(&genesis_header, &common_params).unwrap();
155155
if let Some(seal) = scheme.engine.generate_seal(b.block(), &genesis_header).seal_fields() {
156156
(b, seal)
157157
} else {

0 commit comments

Comments
 (0)