ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

fuels-ts 交易策略(Transaction Policies)完全指南:从参数配置到底层编码

fuels-ts 交易策略(Transaction Policies)完全指南:从参数配置到底层编码 fuels-ts 交易策略Transaction Policies完全指南从参数配置到底层编码【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-ts导读本指南聚焦 Fuel 网络 TypeScript SDKfuels-ts中的**交易策略Transaction Policies**机制。交易策略是与交易请求一同提交的规则集合用于约束一笔交易在 Fuel 区块链上的处理方式——例如你愿意为打包交易支付多少小费、交易何时可以被纳入区块、最多愿意支付多少手续费等。读完本文后你将掌握如何在ScriptTransactionRequest等交易请求中设置各项策略参数如何从已提交交易的TransactionResponse中反查其携带的策略并从源码层面理解策略以位图 顺序编码的形式写入交易的根本原理。什么是 Transaction Policies交易策略Policies是 Fuel 链上交易格式引入的一组可选规则由你通过交易参数transaction parameters传给交易请求从而决定链上如何处理这笔交易。从 fuels-ts 的源码类型定义看Policy是如下类型的联合每一类策略都由type策略类型与data负载数据构成见 policy.tsexport type Policy | PolicyTip | PolicyWitnessLimit | PolicyMaturity | PolicyMaxFee | PolicyExpiration | PolicyOwner;Tip小费以基础资产base asset支付的可选金额用于激励区块生产者将交易打包进区块从而让愿意多付费的交易获得更快的处理速度。这里设置的值会计入交易的maxFee之中。Witness Limit见证上限交易 witnesses 数组允许的最大字节长度。例如一笔部署合约的交易其合约字节码就是 witnesses 中的一项如果你将上限设置为5000而合约字节码长度为6000由于 witnesses 字节数超过了设定上限这笔交易会被拒绝。Maturity成熟度交易被允许打包进区块之前必须经过的区块数量。该字段对时间敏感型交易非常有用例如涉及时间锁资产的交易。若链每秒出一个新区块将 Maturity 设置为10意味着交易大约在 10 秒后才可被处理。Max Fee最大手续费你愿意为这笔交易使用基础资产支付的最高金额。它为手续费设定上界可防止因网络突发拥堵或费率暴涨产生意外的高额成本。Expiration过期区块交易超过此区块号之后将不能再被纳入区块链。例如你将过期区块设为200若交易在区块 200 已生成时仍滞留在队列中等待处理该交易将被拒绝。Owner拥有者除上述五类由文档公开描述的策略外fuels-ts 的PolicyType枚举中还包含Owner位值32与其余类型一样可被 PoliciesCoder 编码与解码见 policy.ts 中的PolicyType.Owner分支。交易参数与策略的映射关系策略并非凭空存在而是由交易请求中的参数派生而来。下表汇总了 fuels-ts 公开的六类策略及其底层位值该位值来自 PolicyType 枚举策略对应参数底层编码类型PolicyType 位值Tiptipu641Witness LimitwitnessLimitu642Maturitymaturityu324Max FeemaxFeeu648Expirationexpirationu3216Owner—u6432策略类型的位值设计非常关键每个策略对应位图中的一个比特位全部生效的策略类型会被打包成一个policyTypes数字写进交易结构中。解码时正是依据该位图依次还原各策略值详见下文“底层原理”一节。关于如何为交易设置gasLimit、maxFee、tip、maturity、witnessLimit、expiration等全部参数及其作用说明请参阅添加交易参数指南。设置交易策略通过交易请求构造参数最直接的设置方式是在创建交易请求时把相应参数一并传入构造函数。以脚本交易为例源码片段见 setting-policies.tsimport { bn, ScriptTransactionRequest } from fuels; const transactionRequest new ScriptTransactionRequest({ tip: bn(10), // 设置 tip 策略 witnessLimit: bn(1), // 设置 witness limit 策略 maturity: 1, // 设置 maturity 策略 maxFee: bn(1), // 设置 max fee 策略 expiration: 200, // 设置过期区块号超过该区块后交易不可再被打包 });几个值得注意的实践细节金额类参数tip、maxFee、witnessLimit建议通过bn(...)包装为 SDK 的BN类型避免大数精度问题maturity与expiration是区块号直接传普通数字即可。上述参数同时适用于ScriptTransactionRequest、合约工厂部署请求等交易请求类型当你调用合约函数时则可在调用作用域内通过txParams(...)方法设置同样的参数见 transaction-parameters.ts 的完整示例。设置交易参数是可选的如果省略SDK 会从链上拉取一组合理的默认值。当执行会产生交易的动作合约部署、.call()合约调用、资产转移等时SDK 会根据 gas limit 与交易字节大小自动估算费用并用于构建交易。作为副作用无论金额多少你的钱包至少需要持有一枚基础资产币。从交易中检索策略已提交交易的策略信息可以通过TransactionResponse获取。完整流程是构造交易请求 → 通过wallet.sendTransaction提交 →waitForResult等待结果 → 读取response.transaction.policies。源码片段见 policies-from-response.tsimport type { Policy } from fuels; import { Provider, Wallet, ScriptTransactionRequest, bn } from fuels; const provider new Provider(LOCAL_NETWORK_URL); const wallet Wallet.fromPrivateKey(WALLET_PVT_KEY, provider); // 实例化交易请求并通过交易参数设置相应策略 const transactionRequest new ScriptTransactionRequest({ script: ScriptSum.bytecode, gasLimit: bn(2000), tip: bn(10), witnessLimit: 900, maxFee: bn(2000), expiration: 200, }); // 设置脚本 main 函数的参数 const scriptArguments [1]; transactionRequest.setData(ScriptSum.abi, scriptArguments); // 为交易注资 const resources await wallet.getResourcesToSpend([ { amount: 1000, assetId: await provider.getBaseAssetId() }, ]); transactionRequest.addResources(resources); // 提交交易并获取交易响应 const tx await wallet.sendTransaction(transactionRequest); const response await tx.waitForResult(); const policies: Policy[] | undefined response.transaction.policies; console.log(policies, policies);检索到的policies是一个Policy[]其中的每个元素形如{ type: PolicyType.Tip, data: BN }type指示是哪一类策略data则是对应取值u64 类策略为BN区块号类策略为number。这可以用于事后审计某笔交易到底携带了哪些策略或用于构造、展示交易详情。底层原理策略如何被编码进交易理解“策略能生效”的关键藏在 fuels-ts 的PoliciesCoder实现中policy.ts。这里有三个值得展开的机制1. 位图驱动的存在性标记燃料链交易头中只保存一个代表“哪些策略存在”的数字policyTypes而不是逐个存储布尔值。每个策略占用位图中独一无二的一个比特位解码器通过getPolicyTypesArray(policyTypes)把位图还原为策略类型数组再按顺序逐个读取数值。这意味着策略在交易中的物理布局是“声明哪些有 → 紧凑排布数值”。2. 编码顺序与重复校验encode阶段会先调用validateDuplicatedPolicies拒绝同一类型的重复策略抛出DUPLICATED_POLICY错误再通过sortPolicies按type升序排序后紧凑写入。编码宽度取决于策略类型MaxFee、Tip、WitnessLimit与Owner使用BigNumberCoder(u64)8 字节而Maturity、Expiration使用NumberCoder(u32, { padToWordSize: true })按字对齐补齐。这与上文的位值表完全对应。3. 向前兼容的容错解码解码时若遇到超出当前 SDK 所认识范围的位即更新区块链引入的新策略类型PoliciesCoder会打印一条提示建议升级 fuels 到最新版本并按未知类型的个数跳过相应字节o leftPolicyTypes * WORD_SIZE从而保证旧版 SDK 仍能解析包含未来策略类型的交易。小结与进一步阅读Fuel 交易策略提供了一套细粒度的“费用-时间”权衡手段用tip换取更快打包、用maxFee锁住成本上限、用maturity与expiration约束交易的生效窗口、用witnessLimit约束携带数据的规模。在 fuels-ts 中你只需要在交易请求构造阶段声明对应参数即可这些参数随后会被编码为交易内置的策略集合提交链上执行。想了解策略相关的全部交易参数含义请阅读添加交易参数想了解交易请求的构造、注资与提交整体流程可阅读交易指南总览及修改交易请求想深入策略的序列化与校验逻辑可直接阅读 policy.ts 及对应的单元测试 policy.test.ts。【免费下载链接】fuels-tsFuel Network Typescript SDK项目地址: https://gitcode.com/GitHub_Trending/fu/fuels-ts创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表