Skip to content

Gas 与手续费 ​

链上每个金额都是以 uNRO 计的整数:1 NRO = 1 000 000 uNRO。

手续费等于 gas 单位 × gas 价格,其中 gas 价格以每 gas 单位多少 uNRO 计:

手续费 (uNRO) = gas_units × gas_price

每项操作的 gas ​

操作Gas 单位常量
转账21GAS_BASE_TRANSFER
合约调用(带调用数据的 .app 地址)预付 50,之后按实际用量结算——见下文GAS_CONTRACT_CALL
合约部署10 000,固定DEPLOY_GAS_UNITS
付费名称转让(.node、.vault、.agent)固定 100 uNRO 费用NFT_TRANSFER_FEE
系统操作(质押、注册、水龙头、治理标记)0—

在 1 uNRO 的最低 gas 价格下,一笔转账花费 21 uNRO = 0.000021 NRO。

合约调用 ​

一次调用预先收取 50 个 gas 单位。随后合约在 WASM 解释器中运行,预算为 1 000 000 fuel(MAX_CONTRACT_GAS)。运行结束后,节点把实际消耗的 fuel 换算为 gas 单位——ceil(fuel / 20 000),至少为 1——并退还或补收差额。

换算比率为 NEUROCHAIN_FUEL_PER_GAS_UNIT(默认 20 000),其取值使得耗尽 fuel 的调用恰好花费预付的 50 个单位。存储读写等 host 函数会额外消耗 fuel;见 NeuroWASM gas 与限制。

如果合约触发 trap 或耗尽 fuel,其存储变更会被回滚,金额也不会转出——但 nonce 和手续费仍会被消耗,因此失败的调用无法被免费重放。

基础费用 ​

协议维护一个随需求变化的基础费用,风格与以太坊的 EIP-1559 相同:

  • 它从每 gas 单位 1 uNRO 起步,且永远不会低于这个下限(MIN_GAS_PRICE)。
  • 每个区块之后,它朝着区块 gas 预算一半(5 000 单位)的目标移动:区块用量更多时上调,更少时下调,每个区块最多变动 12.5%。只要变动,至少变动 1 uNRO,因此拥堵过后它会一路回到下限。
  • gas_price 低于当前基础费用的交易会被每个验证者拒绝。 这一点在共识中强制执行,而不只是由 mempool 检查,因此提议者无法让一笔出价过低的交易绕过其他验证者。

发送前先读取当前值:

bash
curl -s "$NODE_RPC/api/v1/gas/estimate"
json
{
  "base_fee": 1,
  "gas_base_transfer": 21,
  "gas_contract_call": 50,
  "estimated_transfer": 21,
  "estimated_contract": 50,
  "estimated_transfer_human": "0.000021",
  "estimated_contract_human": "0.00005",
  "total_burned": 0,
  "nft_transfer_fee": 100,
  "nft_transfer_fee_human": "0.0001"
}

Gateway 在 $GATEWAY/api/v1/gas/estimate 提供相同的数据。Web 钱包发送 gas_price = base_fee × 1.5,以领先于上涨的基础费用。

手续费去向 ​

手续费流向:每笔交易的手续费被拆分,50% 销毁,50% 计入区块提议者;基础费用设定最低 gas 价格

每个区块之后,其手续费总和被拆分:

  • 50% 被销毁(BURN_RATE_BPS = 5000),并累加到 total_burned。
  • 50% 归区块提议者。

.app 和 .vault 名称的注册费全额销毁;.node 的注册费则转为质押。见地址。

区块预算与 mempool ​

规则默认值覆盖方式说明
每区块 gas10 000 单位治理参数 max_block_gas1 到 1 000 000 000;在节点启动时读取
每区块交易数500—MAX_BLOCK_TXS
Mempool 容量10 000NEUROCHAIN_MAX_MEMPOOL满了以后,新交易会挤出出价最低的待处理交易——仅当它出价更高时
在 mempool 中的时长60 秒—到时仍未被打包的待处理交易会被丢弃
每个发送方的待处理交易数64NEUROCHAIN_MAX_PENDING_PER_ACCOUNT同一地址的更多交易会被拒绝
按手续费替换+10%NEUROCHAIN_RBF_MIN_BUMP_PCT重新发送相同的 (from, nonce) 时,只有 gas 价格至少高出这么多,才会替换待处理的那笔
Mempool 价格下限0(关闭)NEUROCHAIN_MIN_FEE_PER_GAS在基础费用之上可选的入口下限

提议者按手续费顺序取待处理交易(同一发送方的交易保持 nonce 顺序),跳过低于基础费用的交易,并在区块预算填满后停止添加。选择时,它把每笔转账计为 21 个单位,每次 .app 调用计为 50 个单位。

常量一览 ​

常量默认值含义
UNRO_PER_NRO1 000 0001 NRO 中的 uNRO 数
GAS_BASE_TRANSFER21一笔转账的 gas 单位
GAS_CONTRACT_CALL50合约调用预付的 gas 单位
DEPLOY_GAS_UNITS10 000一次部署的 gas 单位
MAX_CONTRACT_GAS1 000 000每次合约调用的 fuel 预算
NEUROCHAIN_FUEL_PER_GAS_UNIT20 000结算调用时每 gas 单位对应的 fuel
MIN_GAS_PRICE1基础费用下限,每 gas 单位 uNRO
MAX_BLOCK_GAS10 000每区块的 gas 单位
BURN_RATE_BPS5 000被销毁的手续费比例,以基点计(50%)
NFT_TRANSFER_FEE100转让付费名称的固定费用,uNRO