@ -212,6 +212,11 @@ pub struct Bank {
|
|||||||
#[serde(deserialize_with = "deserialize_atomicusize")]
|
#[serde(deserialize_with = "deserialize_atomicusize")]
|
||||||
signature_count: AtomicUsize,
|
signature_count: AtomicUsize,
|
||||||
|
|
||||||
|
/// Total capitalization, used to calculate inflation
|
||||||
|
#[serde(serialize_with = "serialize_atomicusize")]
|
||||||
|
#[serde(deserialize_with = "deserialize_atomicusize")]
|
||||||
|
capitalization: AtomicUsize, // TODO: Use AtomicU64 if/when available
|
||||||
|
|
||||||
// Bank max_tick_height
|
// Bank max_tick_height
|
||||||
max_tick_height: u64,
|
max_tick_height: u64,
|
||||||
|
|
||||||
@ -478,6 +483,8 @@ impl Bank {
|
|||||||
|
|
||||||
for (pubkey, account) in genesis_block.accounts.iter() {
|
for (pubkey, account) in genesis_block.accounts.iter() {
|
||||||
self.store(pubkey, account);
|
self.store(pubkey, account);
|
||||||
|
self.capitalization
|
||||||
|
.fetch_add(account.lamports as usize, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
// highest staked node is the first collector
|
// highest staked node is the first collector
|
||||||
self.collector_id = self
|
self.collector_id = self
|
||||||
@ -1154,6 +1161,14 @@ impl Bank {
|
|||||||
self.tick_height.load(Ordering::Relaxed) as u64
|
self.tick_height.load(Ordering::Relaxed) as u64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return the total capititalization of the Bank
|
||||||
|
pub fn capitalization(&self) -> u64 {
|
||||||
|
// capitalization is using an AtomicUSize because AtomicU64 is not yet a stable API.
|
||||||
|
// Until we can switch to AtomicU64, fail if usize is not the same as u64
|
||||||
|
assert_eq!(std::usize::MAX, 0xFFFF_FFFF_FFFF_FFFF);
|
||||||
|
self.capitalization.load(Ordering::Relaxed) as u64
|
||||||
|
}
|
||||||
|
|
||||||
/// Return this bank's max_tick_height
|
/// Return this bank's max_tick_height
|
||||||
pub fn max_tick_height(&self) -> u64 {
|
pub fn max_tick_height(&self) -> u64 {
|
||||||
self.max_tick_height
|
self.max_tick_height
|
||||||
@ -1334,6 +1349,15 @@ mod tests {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_bank_capitalization() {
|
||||||
|
let bank = Bank::new(&GenesisBlock {
|
||||||
|
accounts: vec![(Pubkey::default(), Account::new(42, 0, &Pubkey::default()),); 42],
|
||||||
|
..GenesisBlock::default()
|
||||||
|
});
|
||||||
|
assert_eq!(bank.capitalization(), 42 * 42);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_two_payments_to_one_party() {
|
fn test_two_payments_to_one_party() {
|
||||||
let (genesis_block, mint_keypair) = create_genesis_block(10_000);
|
let (genesis_block, mint_keypair) = create_genesis_block(10_000);
|
||||||
|
@ -24,7 +24,7 @@ pub fn create_genesis_block_with_leader(
|
|||||||
bootstrap_leader_pubkey: &Pubkey,
|
bootstrap_leader_pubkey: &Pubkey,
|
||||||
bootstrap_leader_stake_lamports: u64,
|
bootstrap_leader_stake_lamports: u64,
|
||||||
) -> GenesisBlockInfo {
|
) -> GenesisBlockInfo {
|
||||||
let bootstrap_leader_lamports = 42; // TODO: pass this in as an argument?
|
let bootstrap_leader_lamports = BOOTSTRAP_LEADER_LAMPORTS; // TODO: pass this in as an argument?
|
||||||
let mint_keypair = Keypair::new();
|
let mint_keypair = Keypair::new();
|
||||||
let voting_keypair = Keypair::new();
|
let voting_keypair = Keypair::new();
|
||||||
let staking_keypair = Keypair::new();
|
let staking_keypair = Keypair::new();
|
||||||
|
@ -15,12 +15,12 @@ use std::path::Path;
|
|||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct GenesisBlock {
|
pub struct GenesisBlock {
|
||||||
pub accounts: Vec<(Pubkey, Account)>,
|
pub accounts: Vec<(Pubkey, Account)>,
|
||||||
pub epoch_warmup: bool,
|
|
||||||
pub fee_calculator: FeeCalculator,
|
pub fee_calculator: FeeCalculator,
|
||||||
pub native_instruction_processors: Vec<(String, Pubkey)>,
|
pub native_instruction_processors: Vec<(String, Pubkey)>,
|
||||||
|
pub ticks_per_slot: u64,
|
||||||
pub slots_per_epoch: u64,
|
pub slots_per_epoch: u64,
|
||||||
pub stakers_slot_offset: u64,
|
pub stakers_slot_offset: u64,
|
||||||
pub ticks_per_slot: u64,
|
pub epoch_warmup: bool,
|
||||||
pub poh_config: PohConfig,
|
pub poh_config: PohConfig,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,6 +39,21 @@ pub fn create_genesis_block(lamports: u64) -> (GenesisBlock, Keypair) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for GenesisBlock {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
accounts: Vec::new(),
|
||||||
|
epoch_warmup: true,
|
||||||
|
fee_calculator: FeeCalculator::default(),
|
||||||
|
native_instruction_processors: Vec::new(),
|
||||||
|
slots_per_epoch: DEFAULT_SLOTS_PER_EPOCH,
|
||||||
|
stakers_slot_offset: DEFAULT_SLOTS_PER_EPOCH,
|
||||||
|
ticks_per_slot: DEFAULT_TICKS_PER_SLOT,
|
||||||
|
poh_config: PohConfig::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl GenesisBlock {
|
impl GenesisBlock {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
accounts: &[(Pubkey, Account)],
|
accounts: &[(Pubkey, Account)],
|
||||||
@ -46,13 +61,8 @@ impl GenesisBlock {
|
|||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
accounts: accounts.to_vec(),
|
accounts: accounts.to_vec(),
|
||||||
epoch_warmup: true,
|
|
||||||
fee_calculator: FeeCalculator::default(),
|
|
||||||
native_instruction_processors: native_instruction_processors.to_vec(),
|
native_instruction_processors: native_instruction_processors.to_vec(),
|
||||||
slots_per_epoch: DEFAULT_SLOTS_PER_EPOCH,
|
..GenesisBlock::default()
|
||||||
stakers_slot_offset: DEFAULT_SLOTS_PER_EPOCH,
|
|
||||||
ticks_per_slot: DEFAULT_TICKS_PER_SLOT,
|
|
||||||
poh_config: PohConfig::default(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user