构建交易
交易允许你更改链上数据或触发事件.通常,交易从构建到链上执行会经历5个步骤:构建,模拟,签名,提交和等待.
-
构建
构建交易时需要指定:
- 发送方账户 (
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],},});构建时可以通过传入
options: {...}
来自定义交易的执行方式.一些最常用的选项包括:maxGasAmount
- 设置你愿意为执行该交易支付的 gas 上限.gasUnitPrice
- 可以指定高于最低价的 gas 单价,Aptos 网络会优先执行这类交易.expireTimestamp
- 设置交易必须执行的具体时间,否则将被取消.
如果未明确指定这些值,SDK 会提供合理的默认值.
- 发送方账户 (
-
模拟(可选)
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,}); -
提交
交易签名完成后,可以使用
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 示例
Section titled “完整 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 个步骤:
- 构建 交易
- 模拟 成本(可选)
- 签名 交易(如果模拟成本可接受)
- 提交 交易到网络
- 等待 链上验证和更新
探索高级交易功能
Section titled “探索高级交易功能”交易还具备一些额外的特性,可以根据您的需求进行调整,您可以在这里了解更多:1. 多代理签名 - 允许多个账户共同作用于单个合约. 2. 交易赞助 - 由其他账户代为支付该交易的 gas 费用. 3. 批量提交交易 - 如何从单个账户快速发送多笔交易. 4. 二进制规范序列化 (BCS) - Aptos 交易使用的数据序列化格式. 5. 使用 ScriptComposer 组合多个 Move 调用 - (实验性功能) 构建更复杂的交易负载以动态调用多个 Move 函数.