Python SDK:构建交易
交易可用于更改链上数据或触发事件。通常,交易从构建到链上执行分为五个步骤:构建、模拟、签名、提交和等待。
-
构建
构建交易时需要指定:
- 发送方账户。
此账户通常支付交易的 Gas 费用。有关由另一账户支付交易费用的信息,请参阅赞助交易。 - 链上调用的函数。
这是执行交易时将触发的链上智能合约入口函数标识符。 - 类型参数和参数。
函数运行所需的任何数据。
可按如下方式为单个账户构建:
from aptos_sdk.v2.bcs import Serializerfrom aptos_sdk.v2.transactions import EntryFunction, TransactionArgument, TransactionPayloadfrom aptos_sdk.v2.types import StructTag, TypeTagpayload = EntryFunction.natural("0x1::aptos_account","transfer_coins",[TypeTag(StructTag.from_str("0x1::aptos_coin::AptosCoin"))],[TransactionArgument(bob.address, Serializer.struct),TransactionArgument(1_000, Serializer.u64),],)raw_txn = await aptos.transaction.build(sender=alice.address,payload=TransactionPayload(payload),)可通过向
aptos.transaction.build传递关键字参数来自定义交易执行方式。一些最常用的选项包括:max_gas_amount- 限制你愿意为执行此交易支付的 Gas 数量。gas_unit_price- 可以指定高于最低值的每单位 Gas 价格,以便 Aptos 网络以更高优先级执行。expiration_timestamps_secs- 指定交易必须在此时间前执行,否则将被取消。replay_protection_nonce- 设置后,SDK 会构建不消耗序列号的无序交易。
若未显式指定,SDK 会为这些值提供合理默认值。也可以在
AptosConfig上设置默认值。 - 发送方账户。
-
模拟(可选)
Aptos 链上的每笔交易都会根据网络机器执行该交易所需的工作量收取 Gas 费用。为估算相关成本,可以在提交前模拟交易。
可使用
aptos.transaction.simulate执行模拟,如下所示:simulation_result = await aptos.transaction.simulate(raw_txn, alice.public_key) -
签名
交易构建完成且费用看起来合理后,即可签名。签名必须来自发送方账户。
signed_txn = aptos.transaction.sign(raw_txn, alice) -
提交
交易签名后,可使用
aptos.transaction.submit提交到网络,如下所示:txn_hash = await aptos.transaction.submit(signed_txn) -
等待
最后,可使用
aptos.transaction.wait_for_transaction并指定刚提交的交易哈希来等待结果,如下所示:result = await aptos.transaction.wait_for_transaction(txn_hash)
对于 Coin 转账,aptos.coin.transfer 会封装构建、签名和提交:
txn_hash = await aptos.coin.transfer(alice, bob.address, 1_000)await aptos.transaction.wait_for_transaction(txn_hash)也可以在手动构建后合并签名、提交和等待:
result = await aptos.transaction.sign_submit_and_wait(raw_txn, alice)完整 Python 示例
Section titled “完整 Python 示例”import asyncio
from aptos_sdk.v2 import Account, Aptos, AptosConfig, Networkfrom aptos_sdk.v2.bcs import Serializerfrom aptos_sdk.v2.transactions import EntryFunction, TransactionArgument, TransactionPayloadfrom aptos_sdk.v2.types import StructTag, TypeTag
FUND_AMOUNT = 100_000_000TRANSFER_AMOUNT = 1_000
async def main(): async with Aptos(AptosConfig(network=Network.DEVNET)) as aptos: alice = Account.generate() bob = Account.generate()
print("=== Addresses ===") print(f"Alice: {alice.address}") print(f"Bob: {bob.address}")
await aptos.faucet.fund_account(alice.address, FUND_AMOUNT) await aptos.faucet.fund_account(bob.address, 10_000_000)
print("=== Initial Balances ===") print(f"Alice: {await aptos.coin.balance(alice.address)}") print(f"Bob: {await aptos.coin.balance(bob.address)}")
payload = EntryFunction.natural( "0x1::aptos_account", "transfer_coins", [TypeTag(StructTag.from_str("0x1::aptos_coin::AptosCoin"))], [ TransactionArgument(bob.address, Serializer.struct), TransactionArgument(TRANSFER_AMOUNT, Serializer.u64), ], ) raw_txn = await aptos.transaction.build( sender=alice.address, payload=TransactionPayload(payload), )
simulation_result = await aptos.transaction.simulate(raw_txn, alice.public_key) print("=== Simulation ===") print(f"Gas used: {simulation_result[0]['gas_used']}") print(f"Status: {simulation_result[0]['vm_status']}")
result = await aptos.transaction.sign_submit_and_wait(raw_txn, alice) print(f"Success: {result['success']}")
print("=== Final Balances ===") print(f"Alice: {await aptos.coin.balance(alice.address)}") print(f"Bob: {await aptos.coin.balance(bob.address)}")
asyncio.run(main())在链上构建并发送交易包含以下 5 个步骤:
- 构建交易。
- 模拟成本。(可选)
- 签名交易(如果模拟成本看起来合理)。
- 提交交易到网络。
- 等待链验证并更新。
探索高级交易功能
Section titled “探索高级交易功能”交易还有一些额外功能,可按需使用:
- 多代理签名 - 允许将多个账户用于单个合约。
- 赞助交易 - 由另一账户支付此交易的 Gas 费用。
- 批量提交交易 - 如何从同一账户快速发送多笔交易。
- 二进制规范序列化(BCS) - 用于序列化 Aptos 交易数据的格式。