in fastpay/src/client.rs [158:197]
fn make_benchmark_certificates_from_votes(
committee_config: &CommitteeConfig,
votes: Vec<SignedTransferOrder>,
) -> Vec<(FastPayAddress, Bytes)> {
let committee = Committee::new(committee_config.voting_rights());
let mut aggregators = HashMap::new();
let mut certificates = Vec::new();
let mut done_senders = HashSet::new();
for vote in votes {
// We aggregate votes indexed by sender.
let address = vote.value.transfer.sender;
if done_senders.contains(&address) {
continue;
}
debug!(
"Processing vote on {}'s transfer by {}",
encode_address(&address),
encode_address(&vote.authority)
);
let value = vote.value;
let aggregator = aggregators
.entry(address)
.or_insert_with(|| SignatureAggregator::try_new(value, &committee).unwrap());
match aggregator.append(vote.authority, vote.signature) {
Ok(Some(certificate)) => {
debug!("Found certificate: {:?}", certificate);
let buf = serialize_cert(&certificate);
certificates.push((address, buf.into()));
done_senders.insert(address);
}
Ok(None) => {
debug!("Added one vote");
}
Err(error) => {
error!("Failed to aggregate vote: {}", error);
}
}
}
certificates
}