Skip to content

Commit d1e1c7e

Browse files
remagpieforiequal0
authored andcommitted
Include ConsensusClient in Solo engine
1 parent f83de3d commit d1e1c7e

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

core/src/consensus/solo/mod.rs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,25 @@
1616

1717
mod params;
1818

19-
use std::sync::Arc;
19+
use std::sync::{Arc, Weak};
2020

2121
use ckey::Address;
2222
use cstate::{ActionHandler, HitHandler};
2323
use ctypes::{CommonParams, Header};
24+
use parking_lot::RwLock;
2425

2526
use self::params::SoloParams;
2627
use super::stake;
2728
use super::{ConsensusEngine, Seal};
2829
use crate::block::{ExecutedBlock, IsBlock};
30+
use crate::client::ConsensusClient;
2931
use crate::codechain_machine::CodeChainMachine;
3032
use crate::consensus::{EngineError, EngineType};
3133
use crate::error::Error;
3234

3335
/// A consensus engine which does not provide any consensus mechanism.
3436
pub struct Solo {
37+
client: RwLock<Option<Weak<dyn ConsensusClient>>>,
3538
params: SoloParams,
3639
machine: CodeChainMachine,
3740
action_handlers: Vec<Arc<dyn ActionHandler>>,
@@ -47,6 +50,7 @@ impl Solo {
4750
action_handlers.push(Arc::new(stake::Stake::new(params.genesis_stakes.clone())));
4851

4952
Solo {
53+
client: Default::default(),
5054
params,
5155
machine,
5256
action_handlers,
@@ -127,6 +131,10 @@ impl ConsensusEngine for Solo {
127131
Ok(())
128132
}
129133

134+
fn register_client(&self, client: Weak<dyn ConsensusClient>) {
135+
*self.client.write() = Some(Weak::clone(&client));
136+
}
137+
130138
fn block_reward(&self, _block_number: u64) -> u64 {
131139
self.params.block_reward
132140
}
@@ -146,25 +154,30 @@ impl ConsensusEngine for Solo {
146154

147155
#[cfg(test)]
148156
mod tests {
157+
use std::sync::Arc;
158+
149159
use ctypes::{CommonParams, Header};
150160
use primitives::H520;
151161

152162
use crate::block::{IsBlock, OpenBlock};
163+
use crate::client::{ConsensusClient, TestBlockChainClient};
153164
use crate::scheme::Scheme;
154165
use crate::tests::helpers::get_temp_state_db;
155166

156167
#[test]
157168
fn seal() {
158169
let scheme = Scheme::new_test_solo();
159-
let engine = &*scheme.engine;
160-
let db = scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
161-
let genesis_header = scheme.genesis_header();
162-
let b = OpenBlock::try_new(engine, db, &genesis_header, Default::default(), vec![]).unwrap();
170+
let client = Arc::new(TestBlockChainClient::new_with_scheme(scheme));
171+
let engine = client.scheme.engine.clone();
172+
engine.register_client(Arc::downgrade(&(client.clone() as Arc<dyn ConsensusClient>)));
173+
let db = client.scheme.ensure_genesis_state(get_temp_state_db()).unwrap();
174+
let genesis_header = client.scheme.genesis_header();
175+
let b = OpenBlock::try_new(&*engine, db, &genesis_header, Default::default(), vec![]).unwrap();
163176
let parent_common_params = CommonParams::default_for_test();
164177
let term_common_params = CommonParams::default_for_test();
165178
let b = b.close_and_lock(&genesis_header, &parent_common_params, Some(&term_common_params)).unwrap();
166179
if let Some(seal) = engine.generate_seal(Some(b.block()), &genesis_header).seal_fields() {
167-
assert!(b.try_seal(engine, seal).is_ok());
180+
assert!(b.try_seal(&*engine, seal).is_ok());
168181
}
169182
}
170183

0 commit comments

Comments
 (0)