本帖最后由 HelloWorld 于 2025-5-26 06:25 编辑
一般我们看到的 fee 参数如下- const fee = {
- amount: [{
- denom: "uatom",
- amount: "5000" // max_gas_fee
- }],
- gas: "200000" // max_gas_units
- };
复制代码 其中 amount 表示我们愿意支付的最大 token 量去作为 gas 费,上述参数表示当前 transaction 我们愿意支付的最大 gas 费为 5000uatom(0.005 ATOM)
gas 表示允许 transaction 支付的最大 gas 单元
真实消耗的 gasFee = gas_units * gasPrice,其中 gas_units 要求 <= gas(这里设置了 200000),gasFee 要求 <= amount(例子中是 5000uatom 或者说 0.005 ATOM)
gasPrice 从哪来?
答案是,链参数里的固定值,我们无法从 rest/rpc api 读取,但是可以从 https://www.mintscan.io/cosmos/parameters 这里查到 Fee Rate Low 为 0.025uatom
事实上,是节点提供者写在 ~/.simapp/config/app.toml 文件里的参数,mintscan 里显示的是人工维护的数据
gas_units 从哪来?
这个取决于你 transaction 的复杂度,可以通过 simulate 的方式获取,命令行为- simd tx bank send ... --gas=auto --gas-adjustment=1.2
复制代码 或者用 ethersjs 提供的 simulate 功能
simulate 得到的数额(gas_units)再乘以 1.2 去作为 gas。如果你设置的 gas<simulate_gas_units,那么上链会失败
所以构建 fee 参数的步骤为:
1. 查一下链的 gasPrice,一般大部分 cosmos 生态链为 0.025,keplr 钱包源码也用 0.025 固定值:https://github.com/chainapsis/ke ... n/src/config.ts#L89
2. simulate 你的 transaction 获得 gas_units
3. 定下参数 gas = gas_units * 1.2
4. 定下参数 amount = gas * 0.025
总之,amount 和 gas 太小都会导致上链失败,amount 不建议太大,一般在你愿意支付的范围内,或者按照上述公式计算
扩展:
https://www.mintscan.io/cosmos/parameters 还提供了一个 Tiny gasPrice 为 0.005,如果用这个作为 gasPirce,在网络拥堵时可能会上链失败,因此建议用 Low gasPrice(0.025) |