Skip to content

Commit f960800

Browse files
committed
Precalculate the fee in era=1
1 parent b22f804 commit f960800

File tree

4 files changed

+278
-72
lines changed

4 files changed

+278
-72
lines changed

core/src/consensus/solo/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ impl ConsensusEngine for Solo {
118118
self.machine.add_balance(block, &author, block_author_reward)?;
119119
return Ok(())
120120
}
121-
stake::add_intermediate_rewards(block.state_mut(), author, block_author_reward)?;
121+
stake::v0::add_intermediate_rewards(block.state_mut(), author, block_author_reward)?;
122122
let last_term_finished_block_num = {
123123
let header = block.header();
124124
let current_term_period = header.timestamp() / term_seconds;
@@ -128,8 +128,8 @@ impl ConsensusEngine for Solo {
128128
}
129129
header.number()
130130
};
131-
stake::move_current_to_previous_intermediate_rewards(&mut block.state_mut())?;
132-
let rewards = stake::drain_previous_rewards(&mut block.state_mut())?;
131+
stake::v0::move_current_to_previous_intermediate_rewards(&mut block.state_mut())?;
132+
let rewards = stake::v0::drain_previous_rewards(&mut block.state_mut())?;
133133
for (address, reward) in rewards {
134134
self.machine.add_balance(block, &address, reward)?;
135135
}

core/src/consensus/stake/action_data.rs

Lines changed: 161 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ use std::cmp::Ordering;
1818
use std::collections::btree_map::{BTreeMap, Entry};
1919
use std::collections::btree_set::{self, BTreeSet};
2020
use std::collections::{btree_map, HashMap, HashSet};
21-
use std::mem;
2221
use std::ops::Deref;
2322
use std::vec;
2423

@@ -408,51 +407,116 @@ impl IntoIterator for Validators {
408407
}
409408
}
410409

411-
#[derive(Default, Debug, PartialEq)]
412-
pub struct IntermediateRewards {
413-
previous: BTreeMap<Address, u64>,
414-
current: BTreeMap<Address, u64>,
415-
}
410+
pub mod v0 {
411+
use std::mem;
416412

417-
impl IntermediateRewards {
418-
pub fn load_from_state(state: &TopLevelState) -> StateResult<Self> {
419-
let key = get_intermediate_rewards_key();
420-
let action_data = state.action_data(&key)?;
421-
let (previous, current) = decode_map_tuple(action_data.as_ref());
413+
use super::*;
422414

423-
Ok(Self {
424-
previous,
425-
current,
426-
})
415+
#[derive(Default, Debug, PartialEq)]
416+
pub struct IntermediateRewards {
417+
pub(super) previous: BTreeMap<Address, u64>,
418+
pub(super) current: BTreeMap<Address, u64>,
427419
}
428420

429-
pub fn save_to_state(&self, state: &mut TopLevelState) -> StateResult<()> {
430-
let key = get_intermediate_rewards_key();
431-
if self.previous.is_empty() && self.current.is_empty() {
432-
state.remove_action_data(&key);
433-
} else {
434-
let encoded = encode_map_tuple(&self.previous, &self.current);
435-
state.update_action_data(&key, encoded)?;
421+
impl IntermediateRewards {
422+
pub fn load_from_state(state: &TopLevelState) -> StateResult<Self> {
423+
let key = get_intermediate_rewards_key();
424+
let action_data = state.action_data(&key)?;
425+
let (previous, current) = decode_map_tuple(action_data.as_ref());
426+
427+
Ok(Self {
428+
previous,
429+
current,
430+
})
436431
}
437-
Ok(())
438-
}
439432

440-
pub fn add_quantity(&mut self, address: Address, quantity: StakeQuantity) {
441-
if quantity == 0 {
442-
return
433+
pub fn save_to_state(&self, state: &mut TopLevelState) -> StateResult<()> {
434+
let key = get_intermediate_rewards_key();
435+
if self.previous.is_empty() && self.current.is_empty() {
436+
state.remove_action_data(&key);
437+
} else {
438+
let encoded = encode_map_tuple(&self.previous, &self.current);
439+
state.update_action_data(&key, encoded)?;
440+
}
441+
Ok(())
442+
}
443+
444+
pub fn add_quantity(&mut self, address: Address, quantity: StakeQuantity) {
445+
if quantity == 0 {
446+
return
447+
}
448+
*self.current.entry(address).or_insert(0) += quantity;
449+
}
450+
451+
pub fn drain_previous(&mut self) -> BTreeMap<Address, u64> {
452+
let mut new = BTreeMap::new();
453+
mem::swap(&mut new, &mut self.previous);
454+
new
455+
}
456+
457+
pub fn move_current_to_previous(&mut self) {
458+
assert!(self.previous.is_empty());
459+
mem::swap(&mut self.previous, &mut self.current);
443460
}
444-
*self.current.entry(address).or_insert(0) += quantity;
445461
}
462+
}
463+
464+
pub mod v1 {
465+
use std::mem;
466+
467+
use super::*;
446468

447-
pub fn drain_previous(&mut self) -> BTreeMap<Address, u64> {
448-
let mut new = BTreeMap::new();
449-
mem::swap(&mut new, &mut self.previous);
450-
new
469+
#[derive(Default, Debug, PartialEq)]
470+
pub struct IntermediateRewards {
471+
pub(super) current: BTreeMap<Address, u64>,
472+
pub(super) calculated: BTreeMap<Address, u64>,
451473
}
452474

453-
pub fn move_current_to_previous(&mut self) {
454-
assert!(self.previous.is_empty());
455-
mem::swap(&mut self.previous, &mut self.current);
475+
impl IntermediateRewards {
476+
pub fn load_from_state(state: &TopLevelState) -> StateResult<Self> {
477+
let key = get_intermediate_rewards_key();
478+
let action_data = state.action_data(&key)?;
479+
let (current, calculated) = decode_map_tuple(action_data.as_ref());
480+
481+
Ok(Self {
482+
current,
483+
calculated,
484+
})
485+
}
486+
487+
pub fn save_to_state(&self, state: &mut TopLevelState) -> StateResult<()> {
488+
let key = get_intermediate_rewards_key();
489+
if self.current.is_empty() && self.calculated.is_empty() {
490+
state.remove_action_data(&key);
491+
} else {
492+
let encoded = encode_map_tuple(&self.current, &self.calculated);
493+
state.update_action_data(&key, encoded)?;
494+
}
495+
Ok(())
496+
}
497+
498+
pub fn add_quantity(&mut self, address: Address, quantity: StakeQuantity) {
499+
if quantity == 0 {
500+
return
501+
}
502+
*self.current.entry(address).or_insert(0) += quantity;
503+
}
504+
505+
pub fn update_calculated(&mut self, rewards: BTreeMap<Address, u64>) {
506+
self.calculated = rewards;
507+
}
508+
509+
pub fn drain_current(&mut self) -> BTreeMap<Address, u64> {
510+
let mut new = BTreeMap::new();
511+
mem::swap(&mut new, &mut self.current);
512+
new
513+
}
514+
515+
pub fn drain_calculated(&mut self) -> BTreeMap<Address, u64> {
516+
let mut new = BTreeMap::new();
517+
mem::swap(&mut new, &mut self.calculated);
518+
new
519+
}
456520
}
457521
}
458522

@@ -1129,46 +1193,99 @@ mod tests {
11291193
}
11301194

11311195
#[test]
1132-
fn load_and_save_intermediate_rewards() {
1196+
fn load_and_save_intermediate_rewards_v0() {
11331197
let mut state = helpers::get_temp_state();
1134-
let rewards = IntermediateRewards::load_from_state(&state).unwrap();
1198+
let rewards = v0::IntermediateRewards::load_from_state(&state).unwrap();
11351199
rewards.save_to_state(&mut state).unwrap();
11361200
}
11371201

11381202
#[test]
1139-
fn add_quantity() {
1203+
fn add_quantity_v0() {
11401204
let address1 = Address::random();
11411205
let address2 = Address::random();
11421206
let mut state = helpers::get_temp_state();
1143-
let mut origin_rewards = IntermediateRewards::load_from_state(&state).unwrap();
1207+
let mut origin_rewards = v0::IntermediateRewards::load_from_state(&state).unwrap();
11441208
origin_rewards.add_quantity(address1, 1);
11451209
origin_rewards.add_quantity(address2, 2);
11461210
origin_rewards.save_to_state(&mut state).unwrap();
1147-
let recovered_rewards = IntermediateRewards::load_from_state(&state).unwrap();
1211+
let recovered_rewards = v0::IntermediateRewards::load_from_state(&state).unwrap();
11481212
assert_eq!(origin_rewards, recovered_rewards);
11491213
}
11501214

11511215
#[test]
1152-
fn drain() {
1216+
fn drain_v0() {
11531217
let address1 = Address::random();
11541218
let address2 = Address::random();
11551219
let mut state = helpers::get_temp_state();
1156-
let mut origin_rewards = IntermediateRewards::load_from_state(&state).unwrap();
1220+
let mut origin_rewards = v0::IntermediateRewards::load_from_state(&state).unwrap();
11571221
origin_rewards.add_quantity(address1, 1);
11581222
origin_rewards.add_quantity(address2, 2);
11591223
origin_rewards.save_to_state(&mut state).unwrap();
1160-
let mut recovered_rewards = IntermediateRewards::load_from_state(&state).unwrap();
1224+
let mut recovered_rewards = v0::IntermediateRewards::load_from_state(&state).unwrap();
11611225
assert_eq!(origin_rewards, recovered_rewards);
11621226
let _drained = recovered_rewards.drain_previous();
11631227
recovered_rewards.save_to_state(&mut state).unwrap();
1164-
let mut final_rewards = IntermediateRewards::load_from_state(&state).unwrap();
1228+
let mut final_rewards = v0::IntermediateRewards::load_from_state(&state).unwrap();
11651229
assert_eq!(BTreeMap::new(), final_rewards.previous);
11661230
let current = final_rewards.current.clone();
11671231
final_rewards.move_current_to_previous();
11681232
assert_eq!(BTreeMap::new(), final_rewards.current);
11691233
assert_eq!(current, final_rewards.previous);
11701234
}
11711235

1236+
#[test]
1237+
fn save_v0_and_load_v1_intermediate_rewards() {
1238+
let address1 = Address::random();
1239+
let address2 = Address::random();
1240+
let mut state = helpers::get_temp_state();
1241+
let mut origin_rewards = v0::IntermediateRewards::load_from_state(&state).unwrap();
1242+
origin_rewards.add_quantity(address1, 1);
1243+
origin_rewards.add_quantity(address2, 2);
1244+
origin_rewards.save_to_state(&mut state).unwrap();
1245+
let recovered_rewards = v1::IntermediateRewards::load_from_state(&state).unwrap();
1246+
assert_eq!(origin_rewards.previous, recovered_rewards.current);
1247+
assert_eq!(origin_rewards.current, recovered_rewards.calculated);
1248+
}
1249+
1250+
#[test]
1251+
fn load_and_save_intermediate_rewards_v1() {
1252+
let mut state = helpers::get_temp_state();
1253+
let rewards = v1::IntermediateRewards::load_from_state(&state).unwrap();
1254+
rewards.save_to_state(&mut state).unwrap();
1255+
}
1256+
1257+
#[test]
1258+
fn add_quantity_v1() {
1259+
let address1 = Address::random();
1260+
let address2 = Address::random();
1261+
let mut state = helpers::get_temp_state();
1262+
let mut origin_rewards = v1::IntermediateRewards::load_from_state(&state).unwrap();
1263+
origin_rewards.add_quantity(address1, 1);
1264+
origin_rewards.add_quantity(address2, 2);
1265+
origin_rewards.save_to_state(&mut state).unwrap();
1266+
let recovered_rewards = v1::IntermediateRewards::load_from_state(&state).unwrap();
1267+
assert_eq!(origin_rewards, recovered_rewards);
1268+
}
1269+
1270+
#[test]
1271+
fn drain_v1() {
1272+
let address1 = Address::random();
1273+
let address2 = Address::random();
1274+
let mut state = helpers::get_temp_state();
1275+
let mut origin_rewards = v1::IntermediateRewards::load_from_state(&state).unwrap();
1276+
origin_rewards.add_quantity(address1, 1);
1277+
origin_rewards.add_quantity(address2, 2);
1278+
origin_rewards.save_to_state(&mut state).unwrap();
1279+
let mut recovered_rewards = v1::IntermediateRewards::load_from_state(&state).unwrap();
1280+
assert_eq!(origin_rewards, recovered_rewards);
1281+
recovered_rewards.drain_current();
1282+
recovered_rewards.save_to_state(&mut state).unwrap();
1283+
let mut final_rewards = v1::IntermediateRewards::load_from_state(&state).unwrap();
1284+
assert_eq!(BTreeMap::new(), final_rewards.current);
1285+
final_rewards.drain_calculated();
1286+
assert_eq!(BTreeMap::new(), final_rewards.calculated);
1287+
}
1288+
11721289
#[test]
11731290
fn candidates_deposit_add() {
11741291
let mut state = helpers::get_temp_state();

core/src/consensus/stake/mod.rs

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

3636
pub use self::action_data::{Banned, Validator, Validators};
37-
use self::action_data::{Candidates, Delegation, IntermediateRewards, Jail, ReleaseResult, StakeAccount, Stakeholders};
37+
use self::action_data::{Candidates, Delegation, Jail, ReleaseResult, StakeAccount, Stakeholders};
3838
pub use self::actions::Action;
3939
pub use self::distribute::fee_distribute;
4040
use super::ValidatorSet;
@@ -321,24 +321,61 @@ pub fn get_validators(state: &TopLevelState) -> StateResult<Validators> {
321321
Validators::load_from_state(state)
322322
}
323323

324-
pub fn add_intermediate_rewards(state: &mut TopLevelState, address: Address, reward: u64) -> StateResult<()> {
325-
let mut rewards = IntermediateRewards::load_from_state(state)?;
326-
rewards.add_quantity(address, reward);
327-
rewards.save_to_state(state)?;
328-
Ok(())
329-
}
324+
pub mod v0 {
325+
use super::action_data::v0::IntermediateRewards;
326+
use super::*;
327+
328+
pub fn add_intermediate_rewards(state: &mut TopLevelState, address: Address, reward: u64) -> StateResult<()> {
329+
let mut rewards = IntermediateRewards::load_from_state(state)?;
330+
rewards.add_quantity(address, reward);
331+
rewards.save_to_state(state)?;
332+
Ok(())
333+
}
334+
335+
pub fn drain_previous_rewards(state: &mut TopLevelState) -> StateResult<BTreeMap<Address, u64>> {
336+
let mut rewards = IntermediateRewards::load_from_state(state)?;
337+
let drained = rewards.drain_previous();
338+
rewards.save_to_state(state)?;
339+
Ok(drained)
340+
}
330341

331-
pub fn drain_previous_rewards(state: &mut TopLevelState) -> StateResult<BTreeMap<Address, u64>> {
332-
let mut rewards = IntermediateRewards::load_from_state(state)?;
333-
let drained = rewards.drain_previous();
334-
rewards.save_to_state(state)?;
335-
Ok(drained)
342+
pub fn move_current_to_previous_intermediate_rewards(state: &mut TopLevelState) -> StateResult<()> {
343+
let mut rewards = IntermediateRewards::load_from_state(state)?;
344+
rewards.move_current_to_previous();
345+
rewards.save_to_state(state)
346+
}
336347
}
337348

338-
pub fn move_current_to_previous_intermediate_rewards(state: &mut TopLevelState) -> StateResult<()> {
339-
let mut rewards = IntermediateRewards::load_from_state(state)?;
340-
rewards.move_current_to_previous();
341-
rewards.save_to_state(state)
349+
pub mod v1 {
350+
use super::action_data::v1::IntermediateRewards;
351+
use super::*;
352+
353+
pub fn add_intermediate_rewards(state: &mut TopLevelState, address: Address, reward: u64) -> StateResult<()> {
354+
let mut rewards = IntermediateRewards::load_from_state(state)?;
355+
rewards.add_quantity(address, reward);
356+
rewards.save_to_state(state)?;
357+
Ok(())
358+
}
359+
360+
pub fn drain_current_rewards(state: &mut TopLevelState) -> StateResult<BTreeMap<Address, u64>> {
361+
let mut rewards = IntermediateRewards::load_from_state(state)?;
362+
let drained = rewards.drain_current();
363+
rewards.save_to_state(state)?;
364+
Ok(drained)
365+
}
366+
367+
pub fn update_calculated_rewards(state: &mut TopLevelState, values: HashMap<Address, u64>) -> StateResult<()> {
368+
let mut rewards = IntermediateRewards::load_from_state(state)?;
369+
rewards.update_calculated(values.into_iter().collect());
370+
rewards.save_to_state(state)
371+
}
372+
373+
pub fn drain_calculated_rewards(state: &mut TopLevelState) -> StateResult<BTreeMap<Address, u64>> {
374+
let mut rewards = IntermediateRewards::load_from_state(state)?;
375+
let drained = rewards.drain_calculated();
376+
rewards.save_to_state(state)?;
377+
Ok(drained)
378+
}
342379
}
343380

344381
pub fn update_validator_weights(state: &mut TopLevelState, block_author: &Address) -> StateResult<()> {

0 commit comments

Comments
 (0)