in fastpay/src/bench.rs [99:181]
fn make_structures(&self) -> (Vec<AuthorityState>, Vec<(u32, Bytes)>) {
info!("Preparing accounts.");
let mut keys = Vec::new();
for _ in 0..self.committee_size {
keys.push(get_key_pair());
}
let committee = Committee {
voting_rights: keys.iter().map(|(k, _)| (*k, 1)).collect(),
total_votes: self.committee_size,
};
// Pick an authority and create one state per shard.
let (public_auth0, secret_auth0) = keys.pop().unwrap();
let mut states = Vec::new();
for i in 0..self.num_shards {
let state = AuthorityState::new_shard(
committee.clone(),
public_auth0,
secret_auth0.copy(),
i as u32,
self.num_shards,
);
states.push(state);
}
// Seed user accounts.
let mut account_keys = Vec::new();
for _ in 0..self.num_accounts {
let keypair = get_key_pair();
let i = AuthorityState::get_shard(self.num_shards, &keypair.0) as usize;
assert!(states[i].in_shard(&keypair.0));
let client = AccountOffchainState {
balance: Balance::from(Amount::from(100)),
next_sequence_number: SequenceNumber::from(0),
pending_confirmation: None,
confirmed_log: Vec::new(),
synchronization_log: Vec::new(),
received_log: Vec::new(),
};
states[i].accounts.insert(keypair.0, client);
account_keys.push(keypair);
}
info!("Preparing transactions.");
// Make one transaction per account (transfer order + confirmation).
let mut orders: Vec<(u32, Bytes)> = Vec::new();
let mut next_recipient = get_key_pair().0;
for (pubx, secx) in account_keys.iter() {
let transfer = Transfer {
sender: *pubx,
recipient: Address::FastPay(next_recipient),
amount: Amount::from(50),
sequence_number: SequenceNumber::from(0),
user_data: UserData::default(),
};
next_recipient = *pubx;
let order = TransferOrder::new(transfer.clone(), secx);
let shard = AuthorityState::get_shard(self.num_shards, pubx);
// Serialize order
let bufx = serialize_transfer_order(&order);
assert!(!bufx.is_empty());
// Make certificate
let mut certificate = CertifiedTransferOrder {
value: order,
signatures: Vec::new(),
};
for i in 0..committee.quorum_threshold() {
let (pubx, secx) = keys.get(i).unwrap();
let sig = Signature::new(&certificate.value.transfer, secx);
certificate.signatures.push((*pubx, sig));
}
let bufx2 = serialize_cert(&certificate);
assert!(!bufx2.is_empty());
orders.push((shard, bufx2.into()));
orders.push((shard, bufx.into()));
}
(states, orders)
}