跳转到内容

构建交易

交易允许你更改链上数据或触发事件.通常,交易从构建到链上执行会经历5个步骤:构建,模拟,签名,提交和等待.

  1. 构建

    构建交易时需要指定:

    1. 发送方账户 (sender)
      该账户通常支付本次交易的 gas 费用.了解交易赞助可以让其他账户支付费用.
    2. 调用的链上函数 (function)
      这是智能合约入口函数的标识符,执行交易时将触发该函数.
    3. 函数参数 (functionArguments)
      这是函数运行所需的任何数据.

    可以通过 aptos.transaction.build.simple(...) 将其打包成 SimpleTransaction,如下所示:

    const transaction = await aptos.transaction.build.simple({
    sender: sender.accountAddress,
    data: {
    // Aptos 上的所有交易都是通过智能合约实现的。
    function: "0x1::aptos_account::transfer",
    functionArguments: [destination.accountAddress, 100],
    },
    });

    构建时可以通过传入 options: {...} 来自定义交易的执行方式.一些最常用的选项包括:

    1. maxGasAmount - 设置你愿意为执行该交易支付的 gas 上限.
    2. gasUnitPrice - 可以指定高于最低价的 gas 单价,Aptos 网络会优先执行这类交易.
    3. expireTimestamp - 设置交易必须执行的具体时间,否则将被取消.

    如果未明确指定这些值,SDK 会提供合理的默认值.

  2. 模拟(可选)

    Aptos 链上的每笔交易都有与其执行时网络机器工作量相关的 gas 费用.为了估算相关成本,你可以在提交前模拟交易.

    你可以使用 aptos.transaction.simulate.simple(...) 执行模拟,如下所示:

    const [userTransactionResponse] = await aptos.transaction.simulate.simple({
    signerPublicKey: signer.publicKey,
    transaction,
    });
    // 如果费用看起来合适,继续签名!
    ```### 签名
    当交易构建完成且手续费合理时,可以使用 `aptos.transaction.sign` 对交易进行签名。签名必须来自 `sender` 账户。
    ```ts filename="build-a-transaction.ts"
    // 3. 签名
    const senderAuthenticator = aptos.transaction.sign({
    signer: sender,
    transaction,
    });
  3. 提交

    交易签名完成后,可以使用 aptos.transaction.submit.simple 将其提交到网络:

    // 4. 提交
    const committedTransaction = await aptos.transaction.submit.simple({
    transaction,
    senderAuthenticator,
    });
  4. 等待

    最后,可以通过 aptos.waitForTransaction 等待交易结果,指定刚提交的交易哈希:

    // 5. 等待
    const executedTransaction = await aptos.waitForTransaction({ transactionHash: committedTransaction.hash });
/**
* 此示例展示如何使用 Aptos SDK 发送交易。
* 运行此示例前请确保已安装 @aptos-labs/ts-sdk!
*/
import {
Account,
Aptos,
AptosConfig,
Network,
} from "@aptos-labs/ts-sdk";
async function example() {
console.log("本示例将创建两个账户(Alice 和 Bob)并发送一笔将 APT 转账给 Bob 账户的交易。");
// 0. 设置客户端和测试账户
const config = new AptosConfig({ network: Network.DEVNET });
const aptos = new Aptos(config);
let alice = Account.generate();
let bob = Account.generate();
console.log("=== 地址 ===\n");
console.log(`Alice 的地址是: ${alice.accountAddress}`);
console.log(`Bob 的地址是: ${bob.accountAddress}`);
console.log("\n=== 资助账户 ===\n");
await aptos.fundAccount({
accountAddress: alice.accountAddress,
amount: 100_000_000,
});
await aptos.fundAccount({
accountAddress: bob.accountAddress,
amount: 100,
});
console.log("已资助 Alice 和 Bob 的账户!")
// 1. 构建
console.log("\n=== 1. 构建交易 ===\n");
const transaction = await aptos.transaction.build.simple({
sender: alice.accountAddress,
data: {
// Aptos 上所有交易都通过智能合约实现
function: "0x1::aptos_account::transfer",
functionArguments: [bob.accountAddress, 100],
},
});
console.log("交易构建完成!")
// 2. 模拟(可选)
console.log("\n === 2. 模拟响应(可选) === \n")
const [userTransactionResponse] = await aptos.transaction.simulate.simple({
signerPublicKey: alice.publicKey,
transaction,
});
console.log(userTransactionResponse)
// 3. 签名
console.log("\n=== 3. 交易签名 ===\n");
const senderAuthenticator = aptos.transaction.sign({
signer: alice,
transaction,
});
console.log("交易签名完成!")
// 4. 提交
console.log("\n=== 4. 提交交易 ===\n");
const submittedTransaction = await aptos.transaction.submit.simple({
transaction,
senderAuthenticator,
});
console.log(`已提交交易哈希: ${submittedTransaction.hash}`);
// 5. 等待结果
console.log("\n=== 5. 等待交易结果 ===\n");
const executedTransaction = await aptos.waitForTransaction({ transactionHash: submittedTransaction.hash });
console.log(executedTransaction)
};
example();

在链上构建和发送交易包含以下 5 个步骤:

  1. 构建 交易
  2. 模拟 成本(可选)
  3. 签名 交易(如果模拟成本可接受)
  4. 提交 交易到网络
  5. 等待 链上验证和更新

交易还具备一些额外的特性,可以根据您的需求进行调整,您可以在这里了解更多:1. 多代理签名 - 允许多个账户共同作用于单个合约. 2. 交易赞助 - 由其他账户代为支付该交易的 gas 费用. 3. 批量提交交易 - 如何从单个账户快速发送多笔交易. 4. 二进制规范序列化 (BCS) - Aptos 交易使用的数据序列化格式. 5. 使用 ScriptComposer 组合多个 Move 调用 - (实验性功能) 构建更复杂的交易负载以动态调用多个 Move 函数.