Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[messages] add enum for Order to simplify adding new order types #27

Merged
merged 1 commit into from
Dec 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions fastpay/src/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,21 +148,21 @@ impl ClientServerBenchmark {
user_data: UserData::default(),
};
next_recipient = *pubx;
let order = TransferOrder::new(transfer.clone(), secx);
let shard = AuthorityState::get_shard(self.num_shards, &order.transfer.object_id);
let order = Order::new_transfer(transfer.clone(), secx);
let shard = AuthorityState::get_shard(self.num_shards, order.object_id());

// Serialize order
let bufx = serialize_transfer_order(&order);
let bufx = serialize_order(&order);
assert!(!bufx.is_empty());

// Make certificate
let mut certificate = CertifiedTransferOrder {
value: order,
let mut certificate = CertifiedOrder {
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);
let sig = Signature::new(&certificate.order.kind, secx);
certificate.signatures.push((*pubx, sig));
}

Expand Down
22 changes: 11 additions & 11 deletions fastpay/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ fn make_client_state(
fn make_benchmark_transfer_orders(
accounts_config: &mut AccountsConfig,
max_orders: usize,
) -> (Vec<TransferOrder>, Vec<(FastPayAddress, Bytes)>) {
) -> (Vec<Order>, Vec<(FastPayAddress, Bytes)>) {
let mut orders = Vec::new();
let mut serialized_orders = Vec::new();
// TODO: deterministic sequence of orders to recover from interrupted benchmarks.
Expand All @@ -108,9 +108,9 @@ fn make_benchmark_transfer_orders(
debug!("Preparing transfer order: {:?}", transfer);
account.next_sequence_number = account.next_sequence_number.increment().unwrap();
next_recipient = account.address;
let order = TransferOrder::new(transfer.clone(), &account.key);
let order = Order::new_transfer(transfer.clone(), &account.key);
orders.push(order.clone());
let serialized_order = serialize_transfer_order(&order);
let serialized_order = serialize_order(&order);
serialized_orders.push((account.address, serialized_order.into()));
if serialized_orders.len() >= max_orders {
break;
Expand All @@ -121,7 +121,7 @@ fn make_benchmark_transfer_orders(

/// Try to make certificates from orders and server configs
fn make_benchmark_certificates_from_orders_and_server_configs(
orders: Vec<TransferOrder>,
orders: Vec<Order>,
server_config: Vec<&str>,
) -> Vec<(FastPayAddress, Bytes)> {
let mut keys = Vec::new();
Expand All @@ -139,33 +139,33 @@ fn make_benchmark_certificates_from_orders_and_server_configs(
);
let mut serialized_certificates = Vec::new();
for order in orders {
let mut certificate = CertifiedTransferOrder {
value: order.clone(),
let mut certificate = CertifiedOrder {
order: order.clone(),
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);
let sig = Signature::new(&certificate.order.kind, secx);
certificate.signatures.push((*pubx, sig));
}
let serialized_certificate = serialize_cert(&certificate);
serialized_certificates.push((order.transfer.sender, serialized_certificate.into()));
serialized_certificates.push((*order.sender(), serialized_certificate.into()));
}
serialized_certificates
}

/// Try to aggregate votes into certificates.
fn make_benchmark_certificates_from_votes(
committee_config: &CommitteeConfig,
votes: Vec<SignedTransferOrder>,
votes: Vec<SignedOrder>,
) -> 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;
let address = *vote.order.sender();
if done_senders.contains(&address) {
continue;
}
Expand All @@ -174,7 +174,7 @@ fn make_benchmark_certificates_from_votes(
encode_address(&address),
encode_address(&vote.authority)
);
let value = vote.value;
let value = vote.order;
let aggregator = aggregators
.entry(address)
.or_insert_with(|| SignatureAggregator::try_new(value, &committee).unwrap());
Expand Down
27 changes: 15 additions & 12 deletions fastpay/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use crate::transport::NetworkProtocol;
use fastpay_core::{
base_types::*,
client::ClientState,
messages::{Address, CertifiedTransferOrder},
messages::{Address, CertifiedOrder, OrderKind},
};

use serde::{Deserialize, Serialize};
Expand Down Expand Up @@ -100,8 +100,8 @@ pub struct UserAccount {
pub key: KeyPair,
pub next_sequence_number: SequenceNumber,
pub balance: Balance,
pub sent_certificates: Vec<CertifiedTransferOrder>,
pub received_certificates: Vec<CertifiedTransferOrder>,
pub sent_certificates: Vec<CertifiedOrder>,
pub received_certificates: Vec<CertifiedOrder>,
}

impl UserAccount {
Expand Down Expand Up @@ -150,15 +150,18 @@ impl AccountsConfig {
account.received_certificates = state.received_certificates().cloned().collect();
}

pub fn update_for_received_transfer(&mut self, certificate: CertifiedTransferOrder) {
let transfer = &certificate.value.transfer;
if let Address::FastPay(recipient) = &transfer.recipient {
if let Some(config) = self.accounts.get_mut(recipient) {
if let Err(position) = config
.received_certificates
.binary_search_by_key(&certificate.key(), CertifiedTransferOrder::key)
{
config.received_certificates.insert(position, certificate)
pub fn update_for_received_transfer(&mut self, certificate: CertifiedOrder) {
match &certificate.order.kind {
OrderKind::Transfer(transfer) => {
if let Address::FastPay(recipient) = &transfer.recipient {
if let Some(config) = self.accounts.get_mut(recipient) {
if let Err(position) = config
.received_certificates
.binary_search_by_key(&certificate.key(), CertifiedOrder::key)
{
config.received_certificates.insert(position, certificate)
}
}
}
}
}
Expand Down
22 changes: 8 additions & 14 deletions fastpay/src/network.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,11 @@ impl MessageHandler for RunningServerState {
SerializedMessage::Order(message) => self
.server
.state
.handle_transfer_order(*message)
.handle_order(*message)
.map(|info| Some(serialize_info_response(&info))),
SerializedMessage::Cert(message) => {
let confirmation_order = ConfirmationOrder {
transfer_certificate: message.as_ref().clone(),
certificate: message.as_ref().clone(),
};
match self
.server
Expand Down Expand Up @@ -210,14 +210,10 @@ impl Client {

impl AuthorityClient for Client {
/// Initiate a new transfer to a FastPay or Primary account.
fn handle_transfer_order(
&mut self,
order: TransferOrder,
) -> AsyncResult<'_, AccountInfoResponse, FastPayError> {
fn handle_order(&mut self, order: Order) -> AsyncResult<'_, AccountInfoResponse, FastPayError> {
Box::pin(async move {
let shard = AuthorityState::get_shard(self.num_shards, &order.transfer.object_id);
self.send_recv_bytes(shard, serialize_transfer_order(&order))
.await
let shard = AuthorityState::get_shard(self.num_shards, order.object_id());
self.send_recv_bytes(shard, serialize_order(&order)).await
})
}

Expand All @@ -227,11 +223,9 @@ impl AuthorityClient for Client {
order: ConfirmationOrder,
) -> AsyncResult<'_, AccountInfoResponse, FastPayError> {
Box::pin(async move {
let shard = AuthorityState::get_shard(
self.num_shards,
&order.transfer_certificate.value.transfer.object_id,
);
self.send_recv_bytes(shard, serialize_cert(&order.transfer_certificate))
let shard =
AuthorityState::get_shard(self.num_shards, order.certificate.order.object_id());
self.send_recv_bytes(shard, serialize_cert(&order.certificate))
.await
})
}
Expand Down
Loading