1616
1717mod params;
1818
19- use std:: sync:: Arc ;
19+ use std:: sync:: { Arc , Weak } ;
2020
2121use ckey:: Address ;
2222use cstate:: { ActionHandler , HitHandler } ;
2323use ctypes:: { CommonParams , Header } ;
24+ use parking_lot:: RwLock ;
2425
2526use self :: params:: SoloParams ;
2627use super :: stake;
2728use super :: { ConsensusEngine , Seal } ;
2829use crate :: block:: { ExecutedBlock , IsBlock } ;
30+ use crate :: client:: ConsensusClient ;
2931use crate :: codechain_machine:: CodeChainMachine ;
3032use crate :: consensus:: { EngineError , EngineType } ;
3133use crate :: error:: Error ;
3234
3335/// A consensus engine which does not provide any consensus mechanism.
3436pub 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) ]
148156mod 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