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

Murisi/generalize vectorized transfers #3446

Closed
wants to merge 17 commits into from
Closed
Show file tree
Hide file tree
Changes from 16 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
2 changes: 2 additions & 0 deletions .changelog/unreleased/features/3356-vectorize-transfers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Reworked transparent and masp transfers to allow for multiple sources, targets,
tokens and amounts. ([\#3356](https://github.com/anoma/namada/pull/3356))
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Combined the various Transfer formats into one general one.
([\#3446](https://github.com/anoma/namada/pull/3446))
109 changes: 76 additions & 33 deletions crates/apps_lib/src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3099,11 +3099,10 @@ pub mod args {
TX_CHANGE_METADATA_WASM, TX_CLAIM_REWARDS_WASM,
TX_DEACTIVATE_VALIDATOR_WASM, TX_IBC_WASM, TX_INIT_ACCOUNT_WASM,
TX_INIT_PROPOSAL, TX_REACTIVATE_VALIDATOR_WASM, TX_REDELEGATE_WASM,
TX_RESIGN_STEWARD, TX_REVEAL_PK, TX_SHIELDED_TRANSFER_WASM,
TX_SHIELDING_TRANSFER_WASM, TX_TRANSPARENT_TRANSFER_WASM,
TX_UNBOND_WASM, TX_UNJAIL_VALIDATOR_WASM, TX_UNSHIELDING_TRANSFER_WASM,
TX_UPDATE_ACCOUNT_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL,
TX_WITHDRAW_WASM, VP_USER_WASM,
TX_RESIGN_STEWARD, TX_REVEAL_PK, TX_TRANSFER_WASM, TX_UNBOND_WASM,
TX_UNJAIL_VALIDATOR_WASM, TX_UPDATE_ACCOUNT_WASM,
TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL, TX_WITHDRAW_WASM,
VP_USER_WASM,
};
use namada_sdk::DEFAULT_GAS_LIMIT;

Expand Down Expand Up @@ -4338,14 +4337,21 @@ pub mod args {
ctx: &mut Context,
) -> Result<TxTransparentTransfer<SdkTypes>, Self::Error> {
let tx = self.tx.to_sdk(ctx)?;
let mut data = vec![];
let chain_ctx = ctx.borrow_mut_chain_or_exit();

for transfer_data in self.data {
data.push(TxTransparentTransferData {
source: chain_ctx.get(&transfer_data.source),
target: chain_ctx.get(&transfer_data.target),
token: chain_ctx.get(&transfer_data.token),
amount: transfer_data.amount,
});
}

Ok(TxTransparentTransfer::<SdkTypes> {
tx,
source: chain_ctx.get(&self.source),
target: chain_ctx.get(&self.target),
token: chain_ctx.get(&self.token),
amount: self.amount,
data,
tx_code_path: self.tx_code_path.to_path_buf(),
})
}
Expand All @@ -4358,13 +4364,17 @@ pub mod args {
let target = TARGET.parse(matches);
let token = TOKEN.parse(matches);
let amount = InputAmount::Unvalidated(AMOUNT.parse(matches));
let tx_code_path = PathBuf::from(TX_TRANSPARENT_TRANSFER_WASM);
Self {
tx,
let tx_code_path = PathBuf::from(TX_TRANSFER_WASM);
let data = vec![TxTransparentTransferData {
source,
target,
token,
amount,
}];

Self {
tx,
data,
tx_code_path,
}
}
Expand Down Expand Up @@ -4393,14 +4403,21 @@ pub mod args {
ctx: &mut Context,
) -> Result<TxShieldedTransfer<SdkTypes>, Self::Error> {
let tx = self.tx.to_sdk(ctx)?;
let mut data = vec![];
let chain_ctx = ctx.borrow_mut_chain_or_exit();

for transfer_data in self.data {
data.push(TxShieldedTransferData {
source: chain_ctx.get_cached(&transfer_data.source),
target: chain_ctx.get(&transfer_data.target),
token: chain_ctx.get(&transfer_data.token),
amount: transfer_data.amount,
});
}

Ok(TxShieldedTransfer::<SdkTypes> {
tx,
source: chain_ctx.get_cached(&self.source),
target: chain_ctx.get(&self.target),
token: chain_ctx.get(&self.token),
amount: self.amount,
data,
tx_code_path: self.tx_code_path.to_path_buf(),
})
}
Expand All @@ -4413,13 +4430,17 @@ pub mod args {
let target = PAYMENT_ADDRESS_TARGET.parse(matches);
let token = TOKEN.parse(matches);
let amount = InputAmount::Unvalidated(AMOUNT.parse(matches));
let tx_code_path = PathBuf::from(TX_SHIELDED_TRANSFER_WASM);
Self {
tx,
let tx_code_path = PathBuf::from(TX_TRANSFER_WASM);
let data = vec![TxShieldedTransferData {
source,
target,
token,
amount,
}];

Self {
tx,
data,
tx_code_path,
}
}
Expand Down Expand Up @@ -4453,14 +4474,21 @@ pub mod args {
ctx: &mut Context,
) -> Result<TxShieldingTransfer<SdkTypes>, Self::Error> {
let tx = self.tx.to_sdk(ctx)?;
let mut data = vec![];
let chain_ctx = ctx.borrow_mut_chain_or_exit();

for transfer_data in self.data {
data.push(TxShieldingTransferData {
source: chain_ctx.get(&transfer_data.source),
token: chain_ctx.get(&transfer_data.token),
amount: transfer_data.amount,
});
}

Ok(TxShieldingTransfer::<SdkTypes> {
tx,
source: chain_ctx.get(&self.source),
data,
target: chain_ctx.get(&self.target),
token: chain_ctx.get(&self.token),
amount: self.amount,
tx_code_path: self.tx_code_path.to_path_buf(),
})
}
Expand All @@ -4473,13 +4501,17 @@ pub mod args {
let target = PAYMENT_ADDRESS_TARGET.parse(matches);
let token = TOKEN.parse(matches);
let amount = InputAmount::Unvalidated(AMOUNT.parse(matches));
let tx_code_path = PathBuf::from(TX_SHIELDING_TRANSFER_WASM);
Self {
tx,
let tx_code_path = PathBuf::from(TX_TRANSFER_WASM);
let data = vec![TxShieldingTransferData {
source,
target,
token,
amount,
}];

Self {
tx,
data,
target,
tx_code_path,
}
}
Expand Down Expand Up @@ -4514,14 +4546,21 @@ pub mod args {
ctx: &mut Context,
) -> Result<TxUnshieldingTransfer<SdkTypes>, Self::Error> {
let tx = self.tx.to_sdk(ctx)?;
let mut data = vec![];
let chain_ctx = ctx.borrow_mut_chain_or_exit();

for transfer_data in self.data {
data.push(TxUnshieldingTransferData {
target: chain_ctx.get(&transfer_data.target),
token: chain_ctx.get(&transfer_data.token),
amount: transfer_data.amount,
});
}

Ok(TxUnshieldingTransfer::<SdkTypes> {
tx,
data,
source: chain_ctx.get_cached(&self.source),
target: chain_ctx.get(&self.target),
token: chain_ctx.get(&self.token),
amount: self.amount,
tx_code_path: self.tx_code_path.to_path_buf(),
})
}
Expand All @@ -4534,13 +4573,17 @@ pub mod args {
let target = TARGET.parse(matches);
let token = TOKEN.parse(matches);
let amount = InputAmount::Unvalidated(AMOUNT.parse(matches));
let tx_code_path = PathBuf::from(TX_UNSHIELDING_TRANSFER_WASM);
Self {
tx,
source,
let tx_code_path = PathBuf::from(TX_TRANSFER_WASM);
let data = vec![TxUnshieldingTransferData {
target,
token,
amount,
}];

Self {
tx,
source,
data,
tx_code_path,
}
}
Expand Down
21 changes: 20 additions & 1 deletion crates/apps_lib/src/client/tx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -743,7 +743,26 @@ pub async fn submit_transparent_transfer(
namada: &impl Namada,
args: args::TxTransparentTransfer,
) -> Result<(), error::Error> {
submit_reveal_aux(namada, args.tx.clone(), &args.source).await?;
if args.data.len() > 1 {
// TODO(namada#3379): Vectorized transfers are not yet supported in the
// CLI
return Err(error::Error::Other(
"Unexpected vectorized transparent transfer".to_string(),
));
}

submit_reveal_aux(
namada,
args.tx.clone(),
&args
.data
.first()
.ok_or_else(|| {
error::Error::Other("Missing transfer data".to_string())
})?
.source,
)
.await?;

let (mut tx, signing_data) = args.clone().build(namada).await?;

Expand Down
17 changes: 8 additions & 9 deletions crates/benches/host_env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,28 @@ use namada::core::account::AccountPublicKeysMap;
use namada::core::address;
use namada::core::collections::{HashMap, HashSet};
use namada::ledger::storage::DB;
use namada::token::{Amount, TransparentTransfer};
use namada::token::{Amount, Transfer, TransferData};
use namada::tx::Authorization;
use namada::vm::wasm::TxCache;
use namada_apps_lib::wallet::defaults;
use namada_apps_lib::wasm_loader;
use namada_node::bench_utils::{
BenchShell, TX_INIT_PROPOSAL_WASM, TX_REVEAL_PK_WASM,
TX_TRANSPARENT_TRANSFER_WASM, TX_UPDATE_ACCOUNT_WASM, VP_USER_WASM,
WASM_DIR,
BenchShell, TX_INIT_PROPOSAL_WASM, TX_REVEAL_PK_WASM, TX_TRANSFER_WASM,
TX_UPDATE_ACCOUNT_WASM, VP_USER_WASM, WASM_DIR,
};

// Benchmarks the validation of a single signature on a single `Section` of a
// transaction
fn tx_section_signature_validation(c: &mut Criterion) {
let shell = BenchShell::default();
let transfer_data = TransparentTransfer {
let transfer_data = Transfer::transparent(vec![TransferData {
source: defaults::albert_address(),
target: defaults::bertha_address(),
token: address::testing::nam(),
amount: Amount::native_whole(500).native_denominated(),
};
}]);
let tx = shell.generate_tx(
TX_TRANSPARENT_TRANSFER_WASM,
TX_TRANSFER_WASM,
transfer_data,
None,
None,
Expand Down Expand Up @@ -62,7 +61,7 @@ fn compile_wasm(c: &mut Criterion) {
let mut txs: HashMap<&str, Vec<u8>> = HashMap::default();

for tx in [
TX_TRANSPARENT_TRANSFER_WASM,
TX_TRANSFER_WASM,
TX_INIT_PROPOSAL_WASM,
TX_REVEAL_PK_WASM,
TX_UPDATE_ACCOUNT_WASM,
Expand Down Expand Up @@ -111,7 +110,7 @@ fn untrusted_wasm_validation(c: &mut Criterion) {
let mut txs: HashMap<&str, Vec<u8>> = HashMap::default();

for tx in [
TX_TRANSPARENT_TRANSFER_WASM,
TX_TRANSFER_WASM,
TX_INIT_PROPOSAL_WASM,
TX_REVEAL_PK_WASM,
TX_UPDATE_ACCOUNT_WASM,
Expand Down
11 changes: 5 additions & 6 deletions crates/benches/native_vps.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,14 @@ use namada::sdk::masp_primitives::merkle_tree::CommitmentTree;
use namada::sdk::masp_primitives::transaction::Transaction;
use namada::sdk::masp_proofs::sapling::SaplingVerificationContextInner;
use namada::state::{Epoch, StorageRead, StorageWrite, TxIndex};
use namada::token::{Amount, TransparentTransfer};
use namada::token::{Amount, Transfer, TransferData};
use namada::tx::{BatchedTx, Code, Section, Tx};
use namada_apps_lib::wallet::defaults;
use namada_node::bench_utils::{
generate_foreign_key_tx, BenchShell, BenchShieldedCtx,
ALBERT_PAYMENT_ADDRESS, ALBERT_SPENDING_KEY, BERTHA_PAYMENT_ADDRESS,
TX_BRIDGE_POOL_WASM, TX_IBC_WASM, TX_INIT_PROPOSAL_WASM, TX_RESIGN_STEWARD,
TX_TRANSPARENT_TRANSFER_WASM, TX_UPDATE_STEWARD_COMMISSION,
TX_VOTE_PROPOSAL_WASM,
TX_TRANSFER_WASM, TX_UPDATE_STEWARD_COMMISSION, TX_VOTE_PROPOSAL_WASM,
};
use rand_core::OsRng;

Expand Down Expand Up @@ -475,13 +474,13 @@ fn vp_multitoken(c: &mut Criterion) {
generate_foreign_key_tx(&defaults::albert_keypair());

let transfer = shell.generate_tx(
TX_TRANSPARENT_TRANSFER_WASM,
TransparentTransfer {
TX_TRANSFER_WASM,
Transfer::transparent(vec![TransferData {
source: defaults::albert_address(),
target: defaults::bertha_address(),
token: address::testing::nam(),
amount: Amount::native_whole(1000).native_denominated(),
},
}]),
None,
None,
vec![&defaults::albert_keypair()],
Expand Down
10 changes: 5 additions & 5 deletions crates/benches/process_wrapper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ use namada::core::address;
use namada::core::key::RefTo;
use namada::core::storage::BlockHeight;
use namada::core::time::DateTimeUtc;
use namada::token::{Amount, DenominatedAmount, TransparentTransfer};
use namada::token::{Amount, DenominatedAmount, Transfer, TransferData};
use namada::tx::data::{Fee, WrapperTx};
use namada::tx::Authorization;
use namada_apps_lib::wallet::defaults;
use namada_node::bench_utils::{BenchShell, TX_TRANSPARENT_TRANSFER_WASM};
use namada_node::bench_utils::{BenchShell, TX_TRANSFER_WASM};
use namada_node::shell::process_proposal::ValidationMeta;

fn process_tx(c: &mut Criterion) {
Expand All @@ -18,13 +18,13 @@ fn process_tx(c: &mut Criterion) {
BlockHeight(2);

let mut batched_tx = shell.generate_tx(
TX_TRANSPARENT_TRANSFER_WASM,
TransparentTransfer {
TX_TRANSFER_WASM,
Transfer::transparent(vec![TransferData {
source: defaults::albert_address(),
target: defaults::bertha_address(),
token: address::testing::nam(),
amount: Amount::native_whole(1).native_denominated(),
},
}]),
None,
None,
vec![&defaults::albert_keypair()],
Expand Down
Loading
Loading