Fuel 网络的 UTXO 模型与 fuels-ts:理解 Coin、交易开销与找零机制

发布时间:2026/9/10 19:06:39
Fuel 网络的 UTXO 模型与 fuels-ts:理解 Coin、交易开销与找零机制 Fuel 网络的 UTXO 模型与 fuels-ts理解 Coin、交易开销与找零机制【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-tsFuel Network 是建立在 UTXOUnspent Transaction Output未花费交易输出基础之上的区块链。对于从以太坊账户模型迁移过来的开发者而言理解这一底层差异是正确使用 TypeScript SDKfuels-ts进行转账、构造交易和查询资产的前提。本文以 UTXO 模型指南为主体脉络结合 fuels-ts 源码中的Coin、CoinQuantity、getResourcesToSpend与OutputType.Change等实现细节系统讲解 Fuel 中每个 Coin 独一无二的资产模型、交易如何挑选并花费 UTXO、超额部分如何以找零change形式回流帮助你在开发 Fuel DApp 时准确预测一笔交易会消耗哪些资产、产生哪些新资产。什么是 UTXO像钱包里的钞票而非银行账户余额在基于 UTXO 的系统里每一枚 coin 都是独一无二的个体这与实体货币中每张钞票拥有不同面额是同一个道理一张 10 美元和一张 5 美元是两张不同的钞票各自携带各自的金额。一个 UTXO 就是一枚带有特定金额的 coin就好比手里捏着一张 10 美元或 5 美元的钞票。这个每个 UTXO 都是独立个体的特性至关重要因为它与以太坊那种账户制account-based系统截然不同UTXO 模型资产由一枚枚离散的、不可分割的 coin 构成每枚 coin 有独立的标识、归属地址和金额以太坊账户模型余额是一个累计的总数类似银行账户里的可用余额系统并不关心这笔余额是由几笔存款拼凑而成的。从 fuels-ts 的源码可以直观印证这一点。Coin 类型定义 列出了 Fuel 链上一枚 UTXO 型 coin 的完整字段export type Coin { id: string; // 唯一标识 assetId: string; // 资产 ID例如基础资产或某个子资产 amount: BN; // 金额使用 BN 大数类型避免精度丢失 owner: Address; // 归属地址 blockCreated: BN; // 创建该 coin 的区块高度 txCreatedIdx: BN; // 在该区块内创建它的交易索引 predicate?: BytesLike; // 可选若该 coin 被 predicate 锁定则包含其字节码 predicateData?: BytesLike; // 可选predicate 输入数据 };可以看到amount采用BNbig number类型、assetId精确到资产维度且id、blockCreated、txCreatedIdx共同保证每枚 coin 在链上可被唯一追溯。因此链上余额不是一个存储字段而是一组可枚举的 coin 的总和。为什么 UTXO 模型重要每个 UTXO 对应一枚独特的 coin 并携带独立的金额这给链上交易带来了更高的透明度和可控性每一笔资产的来源由哪枚 coin 转出、在哪个区块产生都可以被精确审计花费逻辑显式化你清楚知道自己动用了哪几张钞票便于实现并行化与隐私相关的构造由 UTXO 结构天然支持无需全局余额状态。对于 fuels-ts 开发者而言理解 UTXO 是高效管理、追踪和编程操作数字资产的基础——只有知道系统会挑哪些 coin 去花你才能解释清楚为什么转账后自己的余额可能会新增一笔小额零钱。交易中 UTXO 的完整生命周期在 Fuel 网络中当你发起一笔交易时SDK 会从你的账户中选取 UTXO 来为交易买单。整个过程可以拆解为三步1. 挑选 UTXOSelecting UTXOsSDK 会从你的账户里选出一枚或多枚 UTXO使它们的总额等于或大于交易金额 交易费用。在 fuels-ts 中这一步由Account.getResourcesToSpend承担。参见 account.tsasync getResourcesToSpend( quantities: CoinQuantityLike[], resourcesIdsToIgnore?: ResourcesIdsToIgnore, { skipAutoConsolidation }: ShouldConsolidateCoinsParams {} ): PromiseResource[] { const getResourcesToSpend () this.provider.getResourcesToSpend(this.address, quantities, resourcesIdsToIgnore); ... }其中quantities使用CoinQuantityLike描述我需要多少资产它既接受元组也接受对象形式。见 coin-quantity.tsexport type CoinQuantityLike | [amount: BigNumberish, assetId: BytesLike, max?: BigNumberish] | { amount: BigNumberish; assetId: BytesLike; max?: BigNumberish }; export type CoinQuantity { amount: BN; assetId: string; max?: BN };即你告诉 SDK 我要amount数量的assetId资产可选上限maxSDK 再去链上经由 provider.ts 的节点查询筛选符合条件的一组 coin。这里的等于或大于正是 UTXO 无法像账户模型那样取 15.50 就扣 15.50的原因——你只能用手中整张的钞票去凑数。此外若第一轮筛选因没有足够大的单枚 coin / 合并不足等原因失败SDK 还会尝试自动整合零散 coin 后重试除非显式传入skipAutoConsolidation。该自动整合逻辑位于 consolidate-coins.ts。2. 花费 UTXOSpending UTXOs被选中的 UTXO 将作为交易的输入input用于支付交易金额并覆盖交易费用。这些被消费的 coin 会被打上已花费标记此后不能再次使用。沿用文档中的例子假设你要发送 15 美元交易费 1 美元而你手中恰好有 10 美元与 6 美元两枚 UTXO——单独任何一枚都不够 16 美元于是两枚都会被选中并一起花费。这就是 UTXO 模型下找零硬币可能来自多个拼凑来源的由来。3. 生成新 UTXONew UTXOs如果被选中 UTXO 的总值超过交易金额 交易费差额会以**新 UTXO找零change**的形式返还到你的账户。在交易结构层面这笔找零被编码为Change类型的输出output。见 output.ts 中交易输出类型的枚举定义export enum OutputType { Coin 0, // 常规转账输出给收款人 Contract 1, // 合约调用输出 Change 2, // 找零输出返还给付款人 Variable 3, // 可变数量输出 ContractCreated 4, // 部署合约时产生 }对应地找零输出体OutputChange会记录接收地址to通常是付款人自己的地址与找零金额参见 OutputChange 定义。编码器会对该输出做专门的encode/decode处理确保找零在交易提交后精确回流到你的账户。小结一笔交易前后的 UTXO 变化原 UTXO被标记为已花费spent永远不可再用新 UTXO交易完成后新产生收款人收到转账金额对应的新 coin付款人收到找零对应的一枚新 coin二者均可用于后续交易。一个完整的数值推演示例假设你的账户当前持有以下两枚 UTXO面值状态10 美元 UTXO未花费20 美元 UTXO未花费现在你要给别人发送 15 美元交易费为 1 美元合计需 16 美元。整个流程如下选币10 美元那枚不足以覆盖 16 美元因此 SDK 选中20 美元 UTXO花费交易完成20 美元 UTXO 被花掉并永久失效产出给收款人生成一枚新的15 美元 UTXOCoin 输出差额20 - 15 - 1 4美元以找零形式生成为一枚新的4 美元 UTXOChange 输出回到你的账户。交易结束后你的账户变为面值状态10 美元 UTXO未花费4 美元 UTXO未花费找零以此类推如果你只有 10 美元与 6 美元两枚 UTXO 而要发送同样的 15 美元交易SDK 会同时选中两者合计 16 美元恰好覆盖 15 1此场景下不会产生找零。在实际的 fuels-ts 开发中这笔挑选 → 花费 → 找零的流程通常由账户在构建与签名交易时自动完成如Account上的fund与资产选取逻辑见 account.ts该入口现在倾向于由provider.assembleTx取代开发者一般无需手工指定具体花哪枚 coin但如果你的合约或脚本需要精确控制输入也可以自行调用getResourcesToSpend并基于返回的Resource[]组装交易请求。回到开发实践需要记住的三件事余额是拼出来的查询某个地址的资产时燃料链返回的是它名下所有未花费 coin 的集合某个 asset 的余额即这些 coin 金额之和。金额存在小数不下的取舍正因为只能整枚花费最小可花费粒度受你手中 coin 面值限制小额频繁转账会积累大量小额 UTXO对此 fuels-ts 提供了自动合并consolidate机制来整理碎片见 consolidate-coins.ts 及其测试。把交易费也计入预算挑选 UTXO 时 SDK 的目标是金额 费用的总覆盖而不是单纯覆盖转账金额忽略手续费预算可能导致余额看似足够却无法完成交易。延伸阅读本文依据的原始概念文档The UTXO Model燃料链上 UTXOCoin的完整字段与含义Coin 类型SDK 中数量/资产配对的表示方式coin-quantity.ts账户如何向链上请求可花费资源含自动合并重试account.ts交易输出类型与找零输出的编码结构output.ts【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-ts创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考