本文档描述了 Fuel Core 中的燃料价格系统,该系统根据网络状况和数据可用性 (DA) 层成本动态确定交易费用。该系统自动调整燃料价格,以平衡网络利用率,维持合理的交易成本,并确保有足够的收入来支付 DA 记录费用。
Fuel Core 采用动态燃料价格机制,该机制适应网络状况和 DA 层成本。燃料价格由两个主要组成部分构成:
这些组成部分根据不同的指标独立调整,然后组合形成用户支付的总燃料价格。
燃料价格组成部分概述
来源:crates/fuel-gas-price-algorithm/src/v1.rs36-70 crates/fuel-gas-price-algorithm/src/v1.rs130-179
燃料价格服务持续监控区块链,并在生成新区块和报告 DA 成本时更新燃料价格。该系统设计为模块化,为不同的职责提供独立的服务。
燃料价格服务架构
来源:crates/services/gas_price_service/src/v1/service.rs110-136 crates/services/gas_price_service/src/v1/da_source_service/service.rs46-59 crates/services/gas_price_service/src/common/l2_block_source.rs30-45
执行燃料价格根据区块的填充度进行调整,遵循简单的反馈机制:
此机制有助于在网络利用率和交易成本之间保持平衡。
执行燃料价格调整逻辑
来源:crates/fuel-gas-price-algorithm/src/v1.rs468-490 crates/fuel-gas-price-algorithm/src/v1.rs589-593
DA 燃料价格更为复杂,因为它需要考虑将数据记录到 DA 层的实际成本。它使用类似 PID 的控制器机制:
DA 燃料价格调整逻辑
来源:crates/fuel-gas-price-algorithm/src/v1.rs497-528 crates/fuel-gas-price-algorithm/src/v1.rs530-543 crates/fuel-gas-price-algorithm/src/v1.rs556-578
该系统包含一个复杂的 L2 活动跟踪器,可根据网络活动帮助调整 DA 燃料价格的变化。这可以防止在活动量低期间价格失控上涨。
L2ActivityTracker 实现
来源:crates/fuel-gas-price-algorithm/src/v1.rs289-301 crates/fuel-gas-price-algorithm/src/v1.rs279-287 crates/fuel-gas-price-algorithm/src/v1.rs218-226
燃料价格服务通过配置参数初始化,然后处理新区块和 DA 成本信息,以持续更新燃料价格。
燃料价格服务处理流程
来源:crates/services/gas_price_service/src/v1/service.rs415-441 crates/services/gas_price_service/src/v1/service.rs172-196 crates/fuel-gas-price-algorithm/src/v1.rs375-420
燃料价格机制可通过以下关键参数进行高度配置:
V1AlgorithmConfig 参数
| 参数 | 类型 | 描述 | 算法用途 |
|---|---|---|---|
new_exec_gas_price | u64 | 起始执行燃料价格 | new_scaled_exec_price 的初始值 |
min_exec_gas_price | u64 | 最低执行燃料价格 | min_scaled_exec_gas_price() 中的下限 |
exec_gas_price_change_percent | u16 | 每个区块的执行价格变化 | 用于 exec_change() 计算 |
l2_block_fullness_threshold_percent | u8 | 区块填充阈值 | 与 used * 100 / capacity 进行比较 |
gas_price_factor | NonZeroU64 | 所有价格的缩放因子 | 缩放价格的乘数 |
min_da_gas_price | u64 | 最低 DA 燃料价格 | DA 价格的下限 |
max_da_gas_price | u64 | 最高 DA 燃料价格 | DA 价格的上限 |
max_da_gas_price_change_percent | u16 | 每个区块的最大 DA 价格变化 | 用于 max_change() 计算 |
da_p_component | i64 | P 分量除数 | 用于 p() 计算中的除数 |
da_d_component | i64 | D 分量除数 | 用于 d() 计算中的除数 |
normal_range_size | u16 | 正常活动范围大小 | L2ActivityTracker 配置 |
capped_range_size | u16 | 上限活动范围大小 | L2ActivityTracker 配置 |
decrease_range_size | u16 | 减少活动范围大小 | L2ActivityTracker 配置 |
block_activity_threshold | u8 | 区块活动阈值 | 活动更新的阈值 |
da_poll_interval | Option<Duration> | DA 轮询间隔 | DaSourceService 轮询频率 |
starting_recorded_height | Option<BlockHeight> | 初始记录高度 | DA 跟踪的起点 |
record_metrics | bool | 启用指标记录 | 控制指标收集 |
来源:crates/services/gas_price_service/src/v1/metadata.rs77-98 crates/services/gas_price_service/src/v1/metadata.rs100-139
燃料价格机制与 DA 区块提交器集成,以获取已记录区块的 DA 成本信息。此信息对于准确计算 DA 燃料价格至关重要。
DA 区块成本集成架构
来源:crates/services/gas_price_service/src/v1/da_source_service/service.rs106-127 crates/services/gas_price_service/src/v1/da_source_service/block_committer_costs.rs84-109 crates/services/gas_price_service/src/v1/da_source_service/block_committer_costs.rs128-147
该系统通过 UpdaterMetadata 枚举支持多种版本的燃料价格算法:
AlgorithmV0):使用简单基于阈值调整的传统单组件算法AlgorithmV1):当前具有执行和 DA 燃料价格分离的双组件算法GasPriceServiceV1 可以使用 convert_to_v1_metadata() 函数从任一版本初始化,该函数将 V0 元数据迁移到 V1 格式,同时保留执行燃料价格并使用默认值初始化 DA 组件。
来源:crates/services/gas_price_service/src/v1/service.rs457-474 crates/services/gas_price_service/src/v1/metadata.rs40-61 crates/services/gas_price_service/src/v1/metadata.rs158-183
燃料价格会响应两个主要事件进行更新:
每次更新都遵循精确的算法,确保渐进、受控的变化,以防止价格波动。
来源:crates/services/gas_price_service/src/v1/service.rs414-440 crates/fuel-gas-price-algorithm/src/v1.rs355-420 crates/fuel-gas-price-algorithm/src/v1.rs492-528
燃料价格机制包含多项安全特性:
来源:crates/fuel-gas-price-algorithm/src/v1.rs218-226 crates/fuel-gas-price-algorithm/src/v1.rs545-548 crates/services/gas_price_service/src/v1/service.rs427-438
系统可以选择记录有关燃料价格计算的指标,包括:
这些指标提供了燃料价格机制行为的可见性,可用于监控和调优。
来源:crates/services/gas_price_service/src/v1/service.rs324-367
Fuel Core 燃料价格机制是一个复杂的系统,它平衡多种因素来确定合适的交易费用。通过分别跟踪执行和 DA 成本,它确保用户支付的费用准确反映其使用的资源,同时保持网络稳定性和效率。