如何构建并优化自定义交易:fuels-ts assembleTx、资源选择与费用策略完全指南
【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-ts
🔥 想要深入理解fuels-ts(Fuel Network TypeScript SDK)中的自定义交易吗?本文围绕 fuels-ts 的assembleTx方法展开,带你从零基础掌握Fuel 自定义交易构建:如何选择 UTXO 资源、如何配置交易费用策略(Tip、MaxFee、Maturity 等),以及如何用blockHorizon和gasPrice优化交易成本。无论你是 Fuel 链新手还是 dApp 开发者,这份fuels-ts 自定义交易完全指南都能帮你少踩坑、省 Gas!
一、为什么需要 assembleTx:自定义交易的核心枢纽
在 Fuel 网络上,转账、部署合约、调用合约本质上都是"交易"。SDK 的高层 API(transfer、sendTransaction、合约调用)底层都依赖同一个方法:assembleTx。
它做的事情很直观:
| 能力 | 说明 |
|---|---|
| ✅ 资源补齐 | 自动挑选足够的 UTXO/消息作为输入,覆盖转账金额 + 手续费 |
| ✅ 费用估算 | 基于blockHorizon(默认未来 10 个区块)估算 Gas 价格 |
| ✅ 变更找回 | 自动添加OutputChange,把"找零"送回指定账户 |
| ✅ 干跑验证 | 提交前先 dry-run 验证交易,避免上链失败 |
| ✅ 谓词估算 | 可选估算 Predicate 消耗的 Gas(estimatePredicates) |
💡 简单说:你只需要告诉
assembleTx"我要转多少、谁付手续费",它就能帮你组装出一笔可以直接提交的完整交易。
左侧为 fuels-ts 脚手架生成的示例应用,右侧为 fuel-core 本地节点日志,是练习 assembleTx 的理想环境
二、上手 assembleTx:最小可用步骤
想动手试试?先用 fuels-ts 官方脚手架拉起一个本地环境:
git clone https://gitcode.com/GitHub_Trending/fu/fuels-ts pnpm create-fuels my-dappassembleTx的核心参数只有四个(完整定义见 AssembleTxParams):
request:待组装的交易请求(ScriptTransactionRequest或CreateTransactionRequest)feePayerAccount:支付手续费的账户accountCoinQuantities:每笔资产需要的数量(可选,仅付手续费时可省略)resourcesIdsToIgnore:需要排除的特定 UTXO/消息 ID
官方基础用法示例位于 basic-usage.ts,返回对象包含四个关键字段:
assembledRequest— 组装完成、可直接提交的交易请求gasPrice— 估算出的 Gas 价格receipts— dry-run 解析后的回执rawReceipts— 原始回执
完整参数文档见 assemble-tx.md,可运行的验收测试见 assemble-tx.test.ts,工具函数封装在 assemble-tx-helpers.ts。
三、资源选择策略:UTXO 模型下最容易踩的坑
Fuel 采用UTXO 模型(不同于以太坊的账户模型),这带来一个反直觉的规则:
⚠️只要包含某个 UTXO,就会把它全部花掉。
举例:你只有一个 10 ETH 的 UTXO,却只想转 0.001 ETH,整笔 10 ETH 都会被消耗,剩余部分通过OutputChange(找零输出)退回。
3.1 多账户场景:谁来找零?
关键约束:同一笔交易中,每个assetId只允许一个OutputChange。
当你用多个账户的 UTXO 共同支付同一资产时,必须用changeOutputAccount明确指定找零归谁,否则可能出现"A 付了钱、B 拿找零"的意外行为。示例见 multiple-output-change.ts:
account缺省 → 默认回落到feePayerAccountchangeOutputAccount缺省 → 默认回落到account
3.2 手动挑选资源(进阶)
如果自动挑选不满足需求(比如想保留小额 UTXO),可以手动获取资源:
getResourcesToSpend(coinQuantities)— 让 SDK 返回满足金额的资源组合addCoins/addMessages— 显式指定要用哪些 UTXO/消息(官方不推荐滥用)
详见 modifying-the-request.md 中的"Manually Fetching Resources"章节。
3.3 排除指定资源
参数resourcesIdsToIgnore可以让assembleTx跳过特定 UTXO(例如已被其他并发交易占用的 UTXO),避免乐观并发场景下的冲突失败。
fuels-ts 支持 Fuel Wallet、Bako、Fuelet、Ethereum Wallets 等多种钱包,feePayerAccount与changeOutputAccount均可指定其中任意账户
四、费用策略优化:把每一分 Gas 花在刀刃上
4.1 blockHorizon:Gas 价格怎么估?
blockHorizon(默认10)控制 SDK 查看未来多少个区块来估算 Gas 价格。区块越多估算越"平滑",但对价格波动的响应也越滞后——追求低价可增大它,追求快速上链则减小它。
4.2 五大交易策略(Policies)速查
除了assembleTx的估算,你还可以通过交易参数显式设置策略,完整说明见 adding-policies.md:
| 策略 | 参数 | 作用 | 优化建议 |
|---|---|---|---|
| 💰 Tip | addTipPolicy | 额外小费,激励区块生产者快速打包 | 急单加 Tip,日常留默认 |
| 🧾 MaxFee | addMaxFeePolicy | 手续费上限(基础资产计) | 必设!防止费用失控 |
| ⏳ Maturity | addMaturityPolicy | 交易须等待 N 个区块后才可上链 | 定时任务、预约交易 |
| ⌛ Expiration | addExpirationPolicy | 超过区块高度后交易失效 | 防止过期订单被意外执行 |
| 🔏 Witness Limit | addWitnessLimitPolicy | 见证数组最大字节长度 | 限制脚本复杂度,控制 Gas |
4.3 reserveGas 与 estimatePredicates
reserveGas:为交易额外预留的 Gas 缓冲,适合逻辑复杂、Gas 难以精确预估的交易estimatePredicates: true:当交易使用 Predicate(如多签、门控账户)时开启,SDK 会额外预估 Predicate 执行的 Gas 消耗
五、最佳实践清单 ✅
- 先 dry-run,后上链:
assembleTx内置干跑验证,返回的receipts可提前暴露错误 - 多账户交易必须显式设置
changeOutputAccount,每个assetId只找一个"找零人" - 务必设置 MaxFee给交易上保险,急单再用 Tip 加速
- 用
resourcesIdsToIgnore处理并发,避免多端同时提交时的 UTXO 竞争 - 谓词交易开启
estimatePredicates,防止因低估 Gas 导致失败 - 迁移到新版 API 的开发者请参考 assemble-tx-migration-guide.md
六、总结
assembleTx是 fuels-ts 中构建自定义交易的"总装车间":它把资源选择、费用估算、找零处理、干跑验证一站式搞定。掌握本文的四个要点——UTXO 全额消费规则、changeOutputAccount找零机制、五大交易策略、blockHorizon调优——你就能在 Fuel 网络上构建既安全又省 Gas 的自定义交易。
📚 延伸阅读:transactions 指南目录、pre-confirmations.md(交易预确认机制),祝你在 Fuel 网络上开发顺利!
【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-ts
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考