Skip to content

Commit ab7fcf1

Browse files
committed
Introduce CurrentValidators
CurrentValidators represent the list of validators for the current block. Its value is the same as the NextValidators of the previous block's state.
1 parent d925fec commit ab7fcf1

File tree

4 files changed

+73
-27
lines changed

4 files changed

+73
-27
lines changed

core/src/client/test_client.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ use crate::client::{
5959
AccountData, BlockChainClient, BlockChainTrait, BlockProducer, BlockStatus, ConsensusClient, EngineInfo,
6060
ImportBlock, ImportResult, MiningBlockChainClient, StateInfo, StateOrBlock, TermInfo,
6161
};
62-
use crate::consensus::stake::{Validator, Validators};
62+
use crate::consensus::stake::{NextValidators, Validator};
6363
use crate::consensus::EngineError;
6464
use crate::db::{COL_STATE, NUM_COLUMNS};
6565
use crate::encoded;
@@ -106,7 +106,7 @@ pub struct TestBlockChainClient {
106106
/// Fixed validator keys
107107
pub validator_keys: RwLock<HashMap<Public, Private>>,
108108
/// Fixed validators
109-
pub validators: Validators,
109+
pub validators: NextValidators,
110110
}
111111

112112
impl Default for TestBlockChainClient {
@@ -160,7 +160,7 @@ impl TestBlockChainClient {
160160
history: RwLock::new(None),
161161
term_id: Some(1),
162162
validator_keys: RwLock::new(HashMap::new()),
163-
validators: Validators::from_vector_to_test(vec![]),
163+
validators: NextValidators::from_vector_to_test(vec![]),
164164
};
165165

166166
// insert genesis hash.
@@ -325,14 +325,14 @@ impl TestBlockChainClient {
325325
self.validator_keys.write().insert(*key_pair.public(), *key_pair.private());
326326
pubkeys.push(*key_pair.public());
327327
}
328-
let fixed_validators: Validators = Validators::from_vector_to_test(
328+
let fixed_validators: NextValidators = NextValidators::from_vector_to_test(
329329
pubkeys.into_iter().map(|pubkey| Validator::new_for_test(0, 0, pubkey)).collect(),
330330
);
331331

332332
self.validators = fixed_validators;
333333
}
334334

335-
pub fn get_validators(&self) -> &Validators {
335+
pub fn get_validators(&self) -> &NextValidators {
336336
&self.validators
337337
}
338338
}

core/src/consensus/stake/action_data.rs

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@ lazy_static! {
4141
pub static ref JAIL_KEY: H256 = ActionDataKeyBuilder::new(CUSTOM_ACTION_HANDLER_ID, 1).append(&"Jail").into_key();
4242
pub static ref BANNED_KEY: H256 =
4343
ActionDataKeyBuilder::new(CUSTOM_ACTION_HANDLER_ID, 1).append(&"Banned").into_key();
44-
pub static ref VALIDATORS_KEY: H256 =
44+
pub static ref NEXT_VALIDATORS_KEY: H256 =
4545
ActionDataKeyBuilder::new(CUSTOM_ACTION_HANDLER_ID, 1).append(&"Validators").into_key();
46+
pub static ref CURRENT_VALIDATORS_KEY: H256 =
47+
ActionDataKeyBuilder::new(CUSTOM_ACTION_HANDLER_ID, 1).append(&"CurrentValidators").into_key();
4648
}
4749

4850
pub fn get_delegation_key(address: &Address) -> H256 {
@@ -274,17 +276,17 @@ impl Validator {
274276
}
275277

276278
#[derive(Debug)]
277-
pub struct Validators(Vec<Validator>);
278-
impl Validators {
279+
pub struct NextValidators(Vec<Validator>);
280+
impl NextValidators {
279281
pub fn from_vector_to_test(vec: Vec<Validator>) -> Self {
280-
Validators(vec)
282+
Self(vec)
281283
}
282284

283285
pub fn load_from_state(state: &TopLevelState) -> StateResult<Self> {
284-
let key = &*VALIDATORS_KEY;
286+
let key = &*NEXT_VALIDATORS_KEY;
285287
let validators = state.action_data(&key)?.map(|data| decode_list(&data)).unwrap_or_default();
286288

287-
Ok(Validators(validators))
289+
Ok(Self(validators))
288290
}
289291

290292
pub fn elect(state: &TopLevelState) -> StateResult<Self> {
@@ -335,7 +337,7 @@ impl Validators {
335337

336338

337339
pub fn save_to_state(&self, state: &mut TopLevelState) -> StateResult<()> {
338-
let key = &*VALIDATORS_KEY;
340+
let key = &*NEXT_VALIDATORS_KEY;
339341
if !self.is_empty() {
340342
state.update_action_data(&key, encode_list(&self.0).to_vec())?;
341343
} else {
@@ -384,21 +386,21 @@ impl Validators {
384386
}
385387
}
386388

387-
impl Deref for Validators {
389+
impl Deref for NextValidators {
388390
type Target = Vec<Validator>;
389391

390392
fn deref(&self) -> &Self::Target {
391393
&self.0
392394
}
393395
}
394396

395-
impl From<Validators> for Vec<Validator> {
396-
fn from(val: Validators) -> Self {
397+
impl From<NextValidators> for Vec<Validator> {
398+
fn from(val: NextValidators) -> Self {
397399
val.0
398400
}
399401
}
400402

401-
impl IntoIterator for Validators {
403+
impl IntoIterator for NextValidators {
402404
type Item = Validator;
403405
type IntoIter = vec::IntoIter<Self::Item>;
404406

@@ -407,6 +409,39 @@ impl IntoIterator for Validators {
407409
}
408410
}
409411

412+
#[derive(Debug)]
413+
pub struct CurrentValidators(Vec<Validator>);
414+
impl CurrentValidators {
415+
pub fn load_from_state(state: &TopLevelState) -> StateResult<Self> {
416+
let key = &*CURRENT_VALIDATORS_KEY;
417+
let validators = state.action_data(&key)?.map(|data| decode_list(&data)).unwrap_or_default();
418+
419+
Ok(Self(validators))
420+
}
421+
422+
pub fn save_to_state(&self, state: &mut TopLevelState) -> StateResult<()> {
423+
let key = &*CURRENT_VALIDATORS_KEY;
424+
if !self.is_empty() {
425+
state.update_action_data(&key, encode_list(&self.0).to_vec())?;
426+
} else {
427+
state.remove_action_data(&key);
428+
}
429+
Ok(())
430+
}
431+
432+
pub fn update(&mut self, validators: Vec<Validator>) {
433+
self.0 = validators;
434+
}
435+
}
436+
437+
impl Deref for CurrentValidators {
438+
type Target = Vec<Validator>;
439+
440+
fn deref(&self) -> &Self::Target {
441+
&self.0
442+
}
443+
}
444+
410445
pub mod v0 {
411446
use std::mem;
412447

@@ -603,7 +638,7 @@ impl Candidates {
603638

604639
pub fn renew_candidates(
605640
&mut self,
606-
validators: &Validators,
641+
validators: &NextValidators,
607642
nomination_ends_at: u64,
608643
inactive_validators: &[Address],
609644
banned: &Banned,
@@ -1868,7 +1903,7 @@ mod tests {
18681903
}
18691904
candidates.save_to_state(&mut state).unwrap();
18701905

1871-
let dummy_validators = Validators(
1906+
let dummy_validators = NextValidators(
18721907
pubkeys[0..5]
18731908
.iter()
18741909
.map(|pubkey| Validator {

core/src/consensus/stake/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use parking_lot::RwLock;
3333
use primitives::{Bytes, H256};
3434
use rlp::{Decodable, Rlp};
3535

36-
pub use self::action_data::{Banned, Validator, Validators};
36+
pub use self::action_data::{Banned, CurrentValidators, NextValidators, Validator};
3737
use self::action_data::{Candidates, Delegation, Jail, ReleaseResult, StakeAccount, Stakeholders};
3838
pub use self::actions::Action;
3939
pub use self::distribute::fee_distribute;
@@ -317,8 +317,8 @@ pub fn get_stakes(state: &TopLevelState) -> StateResult<HashMap<Address, u64>> {
317317
Ok(result)
318318
}
319319

320-
pub fn get_validators(state: &TopLevelState) -> StateResult<Validators> {
321-
Validators::load_from_state(state)
320+
pub fn get_validators(state: &TopLevelState) -> StateResult<NextValidators> {
321+
NextValidators::load_from_state(state)
322322
}
323323

324324
pub mod v0 {
@@ -379,7 +379,7 @@ pub mod v1 {
379379
}
380380

381381
pub fn update_validator_weights(state: &mut TopLevelState, block_author: &Address) -> StateResult<()> {
382-
let mut validators = Validators::load_from_state(state)?;
382+
let mut validators = NextValidators::load_from_state(state)?;
383383
validators.update_weight(block_author);
384384
validators.save_to_state(state)
385385
}
@@ -451,7 +451,7 @@ pub fn on_term_close(
451451

452452
jail(state, inactive_validators, custody_until, kick_at)?;
453453

454-
let validators = Validators::elect(state)?;
454+
let validators = NextValidators::elect(state)?;
455455
validators.save_to_state(state)?;
456456

457457
state.increase_term_id(last_term_finished_block_num)?;
@@ -469,7 +469,7 @@ fn update_candidates(
469469
let mut candidates = Candidates::load_from_state(state)?;
470470
let nomination_ends_at = current_term + nomination_expiration;
471471

472-
let current_validators = Validators::load_from_state(state)?;
472+
let current_validators = NextValidators::load_from_state(state)?;
473473
candidates.renew_candidates(&current_validators, nomination_ends_at, &inactive_validators, &banned);
474474

475475
let expired = candidates.drain_expired_candidates(current_term);
@@ -519,7 +519,7 @@ pub fn ban(state: &mut TopLevelState, informant: &Public, criminal: Address) ->
519519

520520
let mut candidates = Candidates::load_from_state(state)?;
521521
let mut jailed = Jail::load_from_state(state)?;
522-
let mut validators = Validators::load_from_state(state)?;
522+
let mut validators = NextValidators::load_from_state(state)?;
523523

524524
let deposit = match (candidates.remove(&criminal), jailed.remove(&criminal)) {
525525
(Some(_), Some(_)) => unreachable!("A candidate that are jailed cannot exist"),

core/src/consensus/tendermint/engine.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,17 @@ impl ConsensusEngine for Tendermint {
142142
let block_number = block.header().number();
143143
let metadata = block.state().metadata()?.expect("Metadata must exist");
144144
let era = metadata.term_params().map_or(0, |p| p.era());
145+
146+
match era {
147+
0 => {}
148+
1 => {
149+
let mut validators = stake::CurrentValidators::load_from_state(block.state())?;
150+
validators.update(stake::NextValidators::load_from_state(block.state())?.clone());
151+
validators.save_to_state(block.state_mut())?;
152+
}
153+
_ => unimplemented!(),
154+
}
155+
145156
if block_number == metadata.last_term_finished_block_num() + 1 {
146157
match era {
147158
0 => {}
@@ -274,7 +285,7 @@ impl ConsensusEngine for Tendermint {
274285

275286
stake::v0::move_current_to_previous_intermediate_rewards(block.state_mut())?;
276287

277-
let validators = stake::Validators::load_from_state(block.state())?
288+
let validators = stake::NextValidators::load_from_state(block.state())?
278289
.into_iter()
279290
.map(|val| public_to_address(val.pubkey()))
280291
.collect();
@@ -286,7 +297,7 @@ impl ConsensusEngine for Tendermint {
286297
}
287298

288299
let start_of_the_current_term = metadata.last_term_finished_block_num() + 1;
289-
let validators = stake::Validators::load_from_state(block.state())?
300+
let validators = stake::NextValidators::load_from_state(block.state())?
290301
.into_iter()
291302
.map(|val| public_to_address(val.pubkey()))
292303
.collect();

0 commit comments

Comments
 (0)