add distribute_partitioned_epoch_rewards (#32124)
* add distribute_partitioned_epoch_rewards * reviews * reanme --------- Co-authored-by: HaoranYi <haoran.yi@solana.com>
This commit is contained in:
parent
988bff93c8
commit
e7a676dc01
|
@ -1730,6 +1730,9 @@ impl Bank {
|
||||||
let leader_schedule_epoch = epoch_schedule.get_leader_schedule_epoch(slot);
|
let leader_schedule_epoch = epoch_schedule.get_leader_schedule_epoch(slot);
|
||||||
new.update_epoch_stakes(leader_schedule_epoch);
|
new.update_epoch_stakes(leader_schedule_epoch);
|
||||||
}
|
}
|
||||||
|
if new.is_partitioned_rewards_code_enabled() {
|
||||||
|
new.distribute_partitioned_epoch_rewards();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Update sysvars before processing transactions
|
// Update sysvars before processing transactions
|
||||||
|
@ -1892,15 +1895,53 @@ impl Bank {
|
||||||
self.set_epoch_reward_status_active(stake_rewards_by_partition);
|
self.set_epoch_reward_status_active(stake_rewards_by_partition);
|
||||||
|
|
||||||
datapoint_info!(
|
datapoint_info!(
|
||||||
"epoch-reward-status-update",
|
"epoch-rewards-status-update",
|
||||||
("start_slot", slot, i64),
|
("start_slot", slot, i64),
|
||||||
("start_block_height", self.block_height(), i64),
|
("start_block_height", self.block_height(), i64),
|
||||||
("activate", 1, i64),
|
("active", 1, i64),
|
||||||
("parent_slot", parent_slot, i64),
|
("parent_slot", parent_slot, i64),
|
||||||
("parent_block_height", parent_block_height, i64),
|
("parent_block_height", parent_block_height, i64),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Process reward distribution for the block if it is inside reward interval.
|
||||||
|
fn distribute_partitioned_epoch_rewards(&mut self) {
|
||||||
|
let EpochRewardStatus::Active(status) = &self.epoch_reward_status
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
self.epoch_schedule.get_slots_in_epoch(self.epoch)
|
||||||
|
> self.get_reward_total_num_blocks(status.calculated_epoch_stake_rewards.len())
|
||||||
|
);
|
||||||
|
let height = self.block_height();
|
||||||
|
let start_block_height = status.start_block_height;
|
||||||
|
let credit_start = start_block_height + self.get_reward_calculation_num_blocks();
|
||||||
|
let credit_end_exclusive = credit_start
|
||||||
|
+ self.get_reward_distribution_num_blocks(status.calculated_epoch_stake_rewards.len());
|
||||||
|
|
||||||
|
if height >= credit_start && height < credit_end_exclusive {
|
||||||
|
let partition_index = height - credit_start;
|
||||||
|
self.distribute_epoch_rewards_in_partition(
|
||||||
|
&status.calculated_epoch_stake_rewards,
|
||||||
|
partition_index,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if height.saturating_add(1) >= credit_end_exclusive {
|
||||||
|
datapoint_info!(
|
||||||
|
"epoch-rewards-status-update",
|
||||||
|
("slot", self.slot(), i64),
|
||||||
|
("block_height", height, i64),
|
||||||
|
("active", 0, i64),
|
||||||
|
("start_block_height", start_block_height, i64),
|
||||||
|
);
|
||||||
|
|
||||||
|
self.deactivate_epoch_reward_status();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn byte_limit_for_scans(&self) -> Option<usize> {
|
pub fn byte_limit_for_scans(&self) -> Option<usize> {
|
||||||
self.rc
|
self.rc
|
||||||
.accounts
|
.accounts
|
||||||
|
|
|
@ -12622,8 +12622,36 @@ fn test_deactivate_epoch_reward_status() {
|
||||||
assert!(bank.get_reward_interval() == RewardInterval::OutsideInterval);
|
assert!(bank.get_reward_interval() == RewardInterval::OutsideInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Test rewards compuation and partitioned rewards distribution at the epoch boundary
|
|
||||||
#[test]
|
#[test]
|
||||||
|
fn test_distribute_partitioned_epoch_rewards() {
|
||||||
|
let (genesis_config, _mint_keypair) = create_genesis_config(1_000_000 * LAMPORTS_PER_SOL);
|
||||||
|
let mut bank = Bank::new_for_tests(&genesis_config);
|
||||||
|
|
||||||
|
let expected_num = 100;
|
||||||
|
|
||||||
|
let stake_rewards = (0..expected_num)
|
||||||
|
.map(|_| StakeReward::new_random())
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let stake_rewards = hash_rewards_into_partitions(stake_rewards, &Hash::new(&[1; 32]), 100);
|
||||||
|
|
||||||
|
bank.set_epoch_reward_status_active(stake_rewards);
|
||||||
|
|
||||||
|
bank.distribute_partitioned_epoch_rewards();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_distribute_partitioned_epoch_rewards_empty() {
|
||||||
|
let (genesis_config, _mint_keypair) = create_genesis_config(1_000_000 * LAMPORTS_PER_SOL);
|
||||||
|
let mut bank = Bank::new_for_tests(&genesis_config);
|
||||||
|
|
||||||
|
bank.set_epoch_reward_status_active(vec![]);
|
||||||
|
|
||||||
|
bank.distribute_partitioned_epoch_rewards();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
/// Test rewards compuation and partitioned rewards distribution at the epoch boundary
|
||||||
fn test_rewards_computation() {
|
fn test_rewards_computation() {
|
||||||
solana_logger::setup();
|
solana_logger::setup();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue