原文作者:PaperMoon团队
Polkadot Hub 实现了一套兼容以太坊 Gas 概念、同时融合 Polkadot 高级资源计量体系的 Gas 模型。该模型在保持以太坊开发者熟悉体验的同时,引入了更精细的资源管理机制。
本文将系统介绍 Polkadot Hub 中 Gas 的运行原理,以及开发者在构建智能合约时需要理解的关键机制。
理解 Polkadot Hub 中的资源计量体系
与以太坊使用单一 Gas 数值衡量所有资源消耗不同,Polkadot Hub 将资源消耗拆分为三个独立维度进行管理:
1. ref_time(计算时间)
ref_time 用于衡量合约执行过程中消耗的计算时间,是最接近传统 Gas 概念的指标,主要反映 CPU 运算资源的使用情况。
合约逻辑越复杂、计算步骤越多,消耗的 ref_time 就越高。
2. proof_size(证明数据大小)
proof_size 用于衡量验证节点在验证交易时所需处理的状态证明数据规模。
当合约访问存储数据、读取链上状态或进行复杂查询时,验证者需要构造并验证相应的状态证明。proof_size 正是用于量化这部分资源消耗。
该机制有助于约束状态访问对网络验证成本的影响。
3. storage_deposit(存储押金)
storage_deposit 是一种原生资产押金机制,当合约创建新的存储项时,需要暂时锁定一定数量的原生代币作为抵押。
其主要目的包括:
• 防止链上状态无限膨胀(State Bloat)
• 促使开发者合理使用存储空间
• 将长期存储成本显性化
当对应存储数据被删除或释放时,押金将被返还。
统一 Gas 映射机制
为了保证以太坊钱包和工具的兼容性,Polkadot Hub 的 RPC 层会自动将上述三个维度映射为一个统一的 Gas 数值,对外呈现为用户熟悉的形式。
因此,从钱包视角看,用户仍然只需要理解“Gas”这一单一指标。
Gas 与 Weight 的关系
当用户通过以太坊钱包与 Polkadot Hub 交互时,看到的是标准 Gas 参数。但在链内部,运行时系统使用的是 Weight(权重)机制。
Weight 是一个二维度量单位,由以下两部分组成:
• ref_time
• proof_size
即:
Weight = (ref_time, proof_size)
系统在运行过程中会持续进行双向转换:
• 估算阶段:Weight → Gas
• 执行阶段:Gas → Weight
这种机制使系统能够在保持兼容性的同时,利用多维资源计量提升精度。
Gas 估算机制原理
当钱包调用 eth_estimateGas 接口请求 Gas 预估时,Polkadot Hub 会执行一次“模拟运行(Dry Run)”。
该测试执行不会真正上链,但会完整模拟交易流程,以获取真实资源消耗情况。
Dry Run 会检测以下内容:
• 合约消耗的计算时间(ref_time)
• 需要验证的状态证明大小(proof_size)
• 是否需要锁定存储押金(storage_deposit)
Gas 估算结果包含的成本构成
最终返回的 Gas 估算值会覆盖以下所有费用:
1. 基础交易开销
包括:
• 签名验证
• Nonce 校验
• 账户检查
• 调度准备等系统级成本
2. 交易长度费用
根据交易数据字节长度计算,用于覆盖网络带宽和存储开销。
3. 合约执行费用
对应 ref_time 与 proof_size 产生的消耗。
4. 存储押金
若涉及新增存储,则包含相应抵押金额。
5. 安全缓冲区
系统会自动添加小幅安全缓冲,用于应对模拟执行与真实执行之间的细微差异。
该机制可以降低因估算不足导致交易失败的概率。
动态 Gas 定价机制
Polkadot Hub 通过 Pallet Revive 引入了动态费用调节机制,其核心参数为“费用乘数(Fee Multiplier)”。
该机制会根据网络拥堵情况自动调整交易费用。
调节规则如下:
• 当区块使用率较高时:
→ 费用乘数上升,交易成本提高
• 当区块较为空闲时:
→ 费用乘数下降,交易成本降低
• 系统在每个区块结束后都会重新计算该参数
与以太坊 Base Fee 的相似性
该机制在设计理念上与以太坊 EIP-1559 的 Base Fee 类似,均属于基于区块利用率的市场化定价模型。
其主要目标是:
• 平衡网络负载
• 防止拥堵
• 优化资源分配效率
Gas Price 的来源
在 Gas 估算阶段返回的 gas price,本质上就是当前的费用乘数数值。
用户使用注意事项
由于费用乘数可能在估算与实际打包之间发生变化,建议用户:
• 在 gas limit 上增加 10%–20% 缓冲
• 在 gas price 上预留适当余量
这样可以提高交易成功率,避免因网络波动导致执行失败。
交易执行流程
下图展示了交易从提交到最终结算的完整生命周期(文字化描述):
用户 / 钱包
↓
交易池(Transaction Pool)
↓
预执行:Gas → Weight 映射并创建费用冻结
↓
资金是否充足?
↙ ↘
否(拒绝) 是
↓
在限制内执行合约
↓
按实际消耗结算费用并退款
↓
写入区块
详细执行流程说明
1. 进入交易池与预调度阶段
交易进入内存池后,系统会:
• 将 Gas 转换为 Weight
• 创建最大可能费用的临时冻结(Hold)
Weight 以 (ref_time, proof_size) 形式独立计算。
在费用换算时,系统会对两个维度分别应用系数,然后取最大值作为最终计费基础。
2. 资金校验
系统会检测用户账户余额是否足以覆盖最大费用冻结额度。
若资金不足,交易将在执行前被直接拒绝。
3. 合约执行
若资金充足:
• 合约在限定 Weight 范围内运行
• 若产生新存储,将冻结相应 storage_deposit
执行过程中,系统持续监控资源消耗情况。
4. 费用结算与退款
执行完成后:
• 按实际使用的 Weight + 交易长度费计算真实费用
• 多余冻结资金自动返还用户
该机制避免了过度收费问题。
5. 区块收录
结算完成后,交易正式写入区块并完成确认。
总结
Polkadot Hub 的 Gas 模型在设计上兼顾了以下两个核心目标:
1. 对外保持以太坊生态兼容性
2. 对内充分发挥 Polkadot 多维资源管理优势
通过引入 ref_time、proof_size 与 storage_deposit 三维资源体系,并结合 Weight 与动态定价机制,Polkadot Hub 实现了更加精细、可持续的费用管理模式。
对于开发者而言,这意味着:
• 可以继续使用熟悉的以太坊工具链
• 同时享受更高效、更透明的底层资源调度能力
• 为大规模、高性能应用提供更稳定的运行环境
该模型为智能合约在 Polkadot 生态中的长期发展提供了坚实的经济与技术基础。
原文链接:https://docs.polkadot.com/smart-contracts/for-eth-devs/gas-model/

1003

被折叠的 条评论
为什么被折叠?



