Python SDK:多代理交易
多代理交易允许多个账户参与 Move 合约的逻辑。
这可用于要求多方在执行前同意交易,或使用来自多个账户的资源。
编写多代理交易
Section titled “编写多代理交易”创建并执行多代理交易的流程与 常规交易流程类似,但有若干显著区别。
-
构建 a raw transaction, then wrap it in
MultiAgentRawTransactionwith each additional signer.raw_txn = await aptos.transaction.build(sender=alice.address,payload=TransactionPayload(payload),)multi_agent_txn = MultiAgentRawTransaction(raw_txn, [bob.address]) -
为每个签名人各签一次。
alice_auth = multi_agent_txn.sign(alice.private_key)bob_auth = multi_agent_txn.sign(bob.private_key) -
使用
MultiAgentAuthenticator组合签名。authenticator = Authenticator(MultiAgentAuthenticator(sender=alice_auth,secondary_signers=[(bob.address, bob_auth)],)) -
提交 the signed transaction.
txn_hash = await aptos.transaction.submit(SignedTransaction(raw_txn, authenticator)) -
等待 for the transaction to resolve.
result = await aptos.transaction.wait_for_transaction(txn_hash)
Python 多代理代码示例
Section titled “Python 多代理代码示例”import asyncio
from aptos_sdk.v2 import Account, Aptos, AptosConfig, Networkfrom aptos_sdk.v2.bcs import Serializerfrom aptos_sdk.v2.errors import TransactionFailedErrorfrom aptos_sdk.v2.transactions import ( Authenticator, EntryFunction, MultiAgentAuthenticator, MultiAgentRawTransaction, SignedTransaction, TransactionArgument, TransactionPayload,)from aptos_sdk.v2.types import StructTag, TypeTag
async def main(): async with Aptos(AptosConfig(network=Network.DEVNET)) as aptos: alice = Account.generate() bob = Account.generate()
await asyncio.gather( aptos.faucet.fund_account(alice.address, 100_000_000), aptos.faucet.fund_account(bob.address, 10_000_000), )
payload = EntryFunction.natural( "0x1::coin", "transfer", [TypeTag(StructTag.from_str("0x1::aptos_coin::AptosCoin"))], [ TransactionArgument(bob.address, Serializer.struct), TransactionArgument(5_000, Serializer.u64), ], ) raw_txn = await aptos.transaction.build( sender=alice.address, payload=TransactionPayload(payload), ) multi_agent_txn = MultiAgentRawTransaction(raw_txn, [bob.address])
alice_auth = multi_agent_txn.sign(alice.private_key) bob_auth = multi_agent_txn.sign(bob.private_key) authenticator = Authenticator( MultiAgentAuthenticator( sender=alice_auth, secondary_signers=[(bob.address, bob_auth)], ) )
txn_hash = await aptos.transaction.submit(SignedTransaction(raw_txn, authenticator)) try: result = await aptos.transaction.wait_for_transaction(txn_hash) print(f"Success: {result['success']}") except TransactionFailedError as err: print(f"Expected without a multi-signer entry function: {err}")
asyncio.run(main())NUMBER_OF_SIGNER_ARGUMENTS_MISMATCH - 当尝试为不需要该数量账户的函数进行多代理签名时会出现此错误。例如,若对 0x1::aptos_account::transfer 使用多个签名,该函数只期望一个地址,因此提供多个时会报错。