跳转到内容

Python SDK:构建交易

交易可用于更改链上数据或触发事件。通常,交易从构建到链上执行分为五个步骤:构建、模拟、签名、提交和等待。

  1. 构建

    构建交易时需要指定:

    1. 发送方账户。
      此账户通常支付交易的 Gas 费用。有关由另一账户支付交易费用的信息,请参阅赞助交易
    2. 链上调用的函数。
      这是执行交易时将触发的链上智能合约入口函数标识符。
    3. 类型参数和参数。
      函数运行所需的任何数据。

    可按如下方式为单个账户构建:

    from aptos_sdk.v2.bcs import Serializer
    from aptos_sdk.v2.transactions import EntryFunction, TransactionArgument, TransactionPayload
    from aptos_sdk.v2.types import StructTag, TypeTag
    payload = 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 传递关键字参数来自定义交易执行方式。一些最常用的选项包括:

    1. max_gas_amount - 限制你愿意为执行此交易支付的 Gas 数量。
    2. gas_unit_price - 可以指定高于最低值的每单位 Gas 价格,以便 Aptos 网络以更高优先级执行。
    3. expiration_timestamps_secs - 指定交易必须在此时间前执行,否则将被取消。
    4. replay_protection_nonce - 设置后,SDK 会构建不消耗序列号的无序交易。

    若未显式指定,SDK 会为这些值提供合理默认值。也可以在 AptosConfig 上设置默认值。

  2. 模拟(可选)

    Aptos 链上的每笔交易都会根据网络机器执行该交易所需的工作量收取 Gas 费用。为估算相关成本,可以在提交前模拟交易。

    可使用 aptos.transaction.simulate 执行模拟,如下所示:

    simulation_result = await aptos.transaction.simulate(raw_txn, alice.public_key)
  3. 签名

    交易构建完成且费用看起来合理后,即可签名。签名必须来自发送方账户。

    signed_txn = aptos.transaction.sign(raw_txn, alice)
  4. 提交

    交易签名后,可使用 aptos.transaction.submit 提交到网络,如下所示:

    txn_hash = await aptos.transaction.submit(signed_txn)
  5. 等待

    最后,可使用 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)
import asyncio
from aptos_sdk.v2 import Account, Aptos, AptosConfig, Network
from aptos_sdk.v2.bcs import Serializer
from aptos_sdk.v2.transactions import EntryFunction, TransactionArgument, TransactionPayload
from aptos_sdk.v2.types import StructTag, TypeTag
FUND_AMOUNT = 100_000_000
TRANSFER_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 个步骤:

  1. 构建交易。
  2. 模拟成本。(可选)
  3. 签名交易(如果模拟成本看起来合理)。
  4. 提交交易到网络。
  5. 等待链验证并更新。

交易还有一些额外功能,可按需使用:

  1. 多代理签名 - 允许将多个账户用于单个合约。
  2. 赞助交易 - 由另一账户支付此交易的 Gas 费用。
  3. 批量提交交易 - 如何从同一账户快速发送多笔交易。
  4. 二进制规范序列化(BCS) - 用于序列化 Aptos 交易数据的格式。