Rust SDK:多代理交易
多代理交易允许多个账户参与 Move 合约的逻辑。
这可用于要求多方在执行前同意交易,或使用来自多个账户的资源。
编写多代理交易
Section titled “编写多代理交易”创建并执行多代理交易的流程与 常规交易流程类似,但有若干显著区别。
-
构建 the raw transaction, then wrap it in
MultiAgentRawTransactionwith each additional signer.let payload = TransactionPayload::EntryFunction(EntryFunction {module: MoveModuleId::from_str_strict("0x1::aptos_account")?,function: "transfer".to_string(),type_args: vec![],args: vec![aptos_bcs::to_bytes(&secondary_signer.address())?,aptos_bcs::to_bytes(&1000u64)?,],});let sequence_number = aptos.get_sequence_number(primary_signer.address()).await?;let raw_txn = TransactionBuilder::new().sender(primary_signer.address()).sequence_number(sequence_number).payload(payload).chain_id(aptos.chain_id()).expiration_from_now(600).build()?;let multi_agent_txn =MultiAgentRawTransaction::new(raw_txn, vec![secondary_signer.address()]); -
由主签名人和每个额外签名人签名。
let signed_txn = sign_multi_agent_transaction(&multi_agent_txn,&primary_signer,&[&secondary_signer as &dyn Account],)?; -
提交并等待交易。
let result = aptos.submit_and_wait(&signed_txn, None).await?;
Rust 多代理代码示例
Section titled “Rust 多代理代码示例”use aptos_sdk::{ Aptos, AptosConfig, account::{Account, Ed25519Account}, transaction::{ EntryFunction, TransactionBuilder, TransactionPayload, builder::sign_multi_agent_transaction, types::MultiAgentRawTransaction, }, types::MoveModuleId,};
#[tokio::main]async fn main() -> anyhow::Result<()> { let aptos = Aptos::new(AptosConfig::devnet())?; let primary_signer = Ed25519Account::generate(); let secondary_signer = Ed25519Account::generate();
aptos .fund_account(primary_signer.address(), 1_000_000_000) .await?; aptos .fund_account(secondary_signer.address(), 100_000_000) .await?;
let payload = TransactionPayload::EntryFunction(EntryFunction { module: MoveModuleId::from_str_strict("0x1::aptos_account")?, function: "transfer".to_string(), type_args: vec![], args: vec![ aptos_bcs::to_bytes(&secondary_signer.address())?, aptos_bcs::to_bytes(&1000u64)?, ], }); let sequence_number = aptos.get_sequence_number(primary_signer.address()).await?; let raw_txn = TransactionBuilder::new() .sender(primary_signer.address()) .sequence_number(sequence_number) .payload(payload) .chain_id(aptos.chain_id()) .expiration_from_now(600) .build()?; let multi_agent_txn = MultiAgentRawTransaction::new(raw_txn, vec![secondary_signer.address()]); let signed_txn = sign_multi_agent_transaction( &multi_agent_txn, &primary_signer, &[&secondary_signer as &dyn Account], )?; match aptos.submit_and_wait(&signed_txn, None).await { Ok(result) => println!("Submitted: {:?}", result.data.get("hash")), Err(err) => { println!("Expected without a multi-signer entry function: {err}"); } }
Ok(())}NUMBER_OF_SIGNER_ARGUMENTS_MISMATCH - 当尝试为不需要该数量账户的函数进行多代理签名时会出现此错误。例如,若对 0x1::aptos_account::transfer 使用多个签名,该函数只期望一个地址,因此提供多个时会报错。