使用交易
交易允许你更改链上数据或触发事件。通常,交易从构建到链上执行会经历5个步骤:构建、模拟、签名、提交和等待。
在这些示例中,aptos
是 Aptos
客户端对象的实例。
构建
构建交易时需要指定:
- 发送方账户 (
sender
)
该账户通常支付本次交易的 gas 费用。了解交易赞助可以让其他账户支付费用。 - 调用的链上函数 (
function
)
这是智能合约入口函数的标识符,执行交易时将触发该函数。 - 函数参数 (
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],
},
});
还有一种更高级的 functionArguments
传递格式叫做二进制规范序列化 (BCS) 格式,这是 Aptos 链解析函数参数的方式。SDK 在后台通过 API 调用将 TypeScript 原始类型转换为 BCS 格式。
构建选项
构建时可以通过传入 options: {...}
来自定义交易的执行方式。一些最常用的选项包括:
maxGasAmount
- 设置你愿意为执行该交易支付的 gas 上限。gasUnitPrice
- 可以指定高于最低价的 gas 单价,Aptos 网络会优先执行这类交易。expireTimestamp
- 设置交易必须执行的具体时间,否则将被取消。
如果未明确指定这些值,SDK 会提供合理的默认值。
模拟(可选)
Aptos 链上的每笔交易都有与其执行时网络机器工作量相关的 gas 费用。为了估算相关成本,你可以在提交前模拟交易。
此模拟只需要账户的 publicKey
,因为它不会影响账本的实际状态。
你可以使用 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,
});
提交
交易签名完成后,可以使用 aptos.transaction.submit.simple
将其提交到网络:
// 4. 提交
const committedTransaction = await aptos.transaction.submit.simple({
transaction,
senderAuthenticator,
});
等待
最后,可以通过 aptos.waitForTransaction
等待交易结果,指定刚提交的交易哈希:
// 5. 等待
const executedTransaction = await aptos.waitForTransaction({ transactionHash: committedTransaction.hash });
完整 TypeScript 示例
/**
* 此示例展示如何使用 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. 交易赞助 - 由其他账户代为支付该交易的 gas 费用。 3. 批量提交交易 - 如何从单个账户快速发送多笔交易。 4. 二进制规范序列化 (BCS) - Aptos 交易使用的数据序列化格式。 5. 使用 ScriptComposer 组合多个 Move 调用 - (实验性功能) 构建更复杂的交易负载以动态调用多个 Move 函数。