非常感谢 Eugene Chen 和 0xIchigo 对此项工作的早期版本的审阅。
切实可行的见解
本地费用市场 (LFM) 使 Solana 能够根据各个状态的竞争程度为其设定细粒度的费用。交易根据其写入的特定状态支付费用,从而防止局部热点提高整个区块链的费用。
LFM 对于实现 Solana 的愿景至关重要,即所有应用程序无缝共存的可扩展统一基础层。如果没有 LFM,链中某一部分的费用飙升会导致所有交易的费用增加——这在其他完全依赖全球费用市场进行区块空间定价的网络中很常见。
随着 2023 年底 Solana 上的经济活动开始加速,LFM 原始实现中的几个关键缺陷开始显现。最值得注意的是非确定性调度程序优先级。交易主要按到达区块构建器的时间排序,优先费用仅作为次要考虑因素。
随着 2024 年 5 月 Agave 客户端更新 v1.18 的发布,引入了新的事务调度程序和改进的事务优先级公式。调度程序构建依赖关系图,以更好地管理跨线程冲突事务的处理和优先级排序。这一重大更新显著提高了协议确定性地对事务进行排序的能力。
评估 LFM 是否有效运作的一个有价值的指标是比较中位数和平均交易优先费用。预计无争议状态(50% 百分位数中位数)的费用将保持较低水平。随着需求的增加,有争议状态的费用应该会激增,从而拉高平均值。最近的数据证实了这种模式。2024 年 11 月,非投票交易的平均费用达到了历史最高水平,超过 0.0003 SOL。然而,中位数费用保持稳定在 0.00000861 SOL,大约低 35 倍。
如今,Solana 的 LFM 已经可以正常运行,但仍有很大的改进空间。Anza 工程师对银行阶段线程工作负载进行的分析表明,调度程序错误导致验证器客户端无法充分利用其全部容量。因此,Agave 客户端只能发挥其潜力的一小部分。此外,没有关于交易排序方式的正式规范。
当前的优先费用 API 缺乏向开发人员提供确定性结果所需的复杂性。每个主要的 RPC 提供商都提供自己的自定义优先费用 API,这可能会成为供应商锁定的一种软形式。核心开源 RPC API 实现未能考虑关键的网络动态,例如 Jito 的影响,导致费用估算不准确。
由于没有确定的优先费用计算方法,开发人员通常会采取谨慎的做法,通过多付来保证他们的交易得到处理。或者,他们可能会过度使用 Jito 小费作为替代机制,即使对于不需要确保区块顶部安全的交易也是如此。
已经提出了各种策略来进一步增强 Solana 的费用结构。这些策略包括指数写入锁定费用和动态基础费用。该网络尚未找到方法,既能对垃圾邮件施加经济反压,又能为真正的人类用户保持较低的费用。
介绍
费用市场是一种经济机制,旨在通过动态调整交易费用,有效地将稀缺的区块空间分配给价值最高的交易。交易支付费用的意愿是其价值的代表。LFM 通过根据各个状态的竞争程度为其设置细粒度费用来完善这一一般概念。当访问同一状态时,两笔交易被视为有争议的——对同一帐户的两次写入或一次读写。
使用 LFM,交易会根据其写入的特定状态支付费用,从而防止局部热点提高整个区块链的费用。访问高需求或有争议状态的交易会产生更高的费用,而与需求较少的状态交互的交易则支付较低的费用。这一点很重要,因为 Solana 可以通过并行执行更好地处理无竞争交易。
本地和全球费用市场的比较
相比之下,全球费用市场采用统一的成本来访问网络状态,这意味着所有交易都平等竞争,无论它们与哪个账户交互。以太坊的费用模型在 EIP-1559 中实现,就是全球费用市场的一个典型例子。EIP-1559 根据网络需求调整动态基本费用,以保持每个区块的最佳计算 (gas) 使用率。随着区块容量的填满,所有交易的费用都会增加。钱包根据当前基本费用和交易的 gas 限制来计算费用。这种方法在协议中强制执行,并提供可预测的费用计算;但是,它无法将高需求热点与更广泛的网络隔离开来。当费用飙升时,所有交易都会如此。
对特定状态的高需求问题并非区块链所独有。这一挑战反映了热点密钥问题,通常称为“名人问题”,在 Web2 社交应用中很常见。
在本文中,我们旨在对 Solana 的 LFM 进行通俗易懂的分析。本工作分为以下几个部分:
Solana 费用基础知识:为读者建立关于目前 Solana 上交易处理方式的基本了解。
本地费用市场早期问题:探讨 LFM 早期实施的初始问题及其缺点。
中央调度程序 v.1.18 更新:重点介绍了关键的 2024 更新,显著改善了 LFM 的功能。
衡量本地费用市场有效性:提供与了解当前在 Solana 上运行的 LFM 状态相关的数据。
持续存在的问题和需要改进的领域:本节讨论尚未解决的问题和需要注意的领域,以使 LFM 充分发挥其潜力。
提出的解决方案:审查提出的解决方案,以改进 LFM 并为更细致入微的区块空间定价引入更好的经济激励。
已经熟悉 Solana 交易费用结构的读者可能希望跳过以下有关费用基础知识的部分。
Solana 费用基础知识
Solana 交易包含两项费用——基本费用和优先费用。基本费用目前固定为每个签名 5,000 Lamport。大多数 Solana 交易都有一个签名。优先费用以每个请求的计算单位 (CU) 的微 Lamport(即 Lamport 的百万分之一)计价。费用从费用支付者账户(签名者)中扣除。如果付款人没有足够的 Lamport 来支付交易,则交易将被丢弃。在撰写本文时,基本费用和优先费用的 50% 由区块构建者保留,作为将交易纳入区块的激励。另外 50% 被烧毁。继去年 5 月对提案 SIMD-096 成功进行治理投票后,这将变为 100% 的优先费用由区块构建者保留。例如:
一笔交易有一个签名,请求 500,000 个 CU。发送者设置了每请求 CU 50,000 个微兰港的优先费用。交易的总费用为 5,000 个兰港 + (500,000 个请求 CU * 每请求 CU 50,000 个微兰港) = 25,000 个兰港,即 0.000025 SOL。
验证者拥有有限的计算资源,协议将每个区块的总计算资源限制为 4800 万 CU。这个数字是根据验证者能够合理处理多少以达到 400 毫秒的区块时间而经验性选择的。每个账户每个区块的最大 CU 限制为 1200 万,每笔交易的最大计算量设置为 140 万 CU。交易消息的最大大小也限制为 1,232 字节,这是 IPv6 的最小传输单位(1280 字节)减去标头。
为了防止计算资源被滥用,Solana 上的每笔交易都分配有计算预算。默认情况下,网络将每条指令的最大限制设置为 200,000 个计算单元 (CU)。但是,交易可以通过包含 ` SetComputeUnitLimit`指令来指定自定义计算单元限制,从而实现更高效的资源分配。Agave客户端代码库列出了各种操作的 CU 成本。
Solana 要求所有交易都指定一个完整的帐户地址列表,这些地址将在交易期间读取或写入。此列表的最大大小为 35 个地址,可以通过链上地址查找表进行扩展。构建地址列表会给开发人员带来额外的开销,但却是解锁 Solana 许多优化的关键,包括并行交易执行和本地化费用市场。
Solana 本地费用市场的早期问题
Solana Tech Discord,2023 年 12 月
本地费用市场是一个谎言。
本·科弗斯顿
Temporal 联合创始人
随着 2023 年底 Solana 上的经济活动开始加速,LFM 最初实施中的几个关键缺陷变得明显。大约在这个时候,Ellipsis Labs 的 Eugene Chen 在Umbra Research 文章《Solana 费用,第 1 部分》中对这些挑战进行了全面的分析。以下是 Chen 提出的要点的总结。
缺乏准确请求 CU 的激励措施
Solana 的费用结构按每个签名收取基本费用,而不考虑使用或请求的计算单位 (CU)。同时,优先费用只能在拥堵期间提供有限的激励来减少 CU 使用量。这种设计使交易发送者几乎没有动力去优化计算使用量或将其 CU 请求与实际需求相匹配。因此,交易经常会过度请求 CU,从而导致网络调度过程效率低下。
使用协议外优先级机制的激励措施
销毁 50% 的优先费用会激励交易发送者与区块构建者勾结并安排链下支付以获得优先访问权,从而绕过协议。这种行为在 Jito 拍卖的日益普及中显而易见。运行 Jito-Agave 客户端的验证者可从更高的费用收益中获益,并可以通过 Jito MEV 佣金奖励将这些利润有效地分配给委托的质押者。随着 Jito-Agave 客户端的采用率不断增长,Jito 捆绑包在许多情况下已被证明是一种卓越的交易交付服务。
非确定性调度程序优先级
Solana 的共识和调度程序都不会根据优先费用强制执行严格的交易排序。交易主要按到达区块构建器的时间排序,优先费用仅作为次要考虑因素。更高的优先费用可以增加纳入有争议状态的可能性,但排序过程仍然是不确定的。到达交易处理单元 (TPU) 之前的网络抖动和调度程序内的内部抖动带来了进一步的不可预测性。
这种缺乏确定性的情况降低了交易执行的可预测性和可靠性,迫使用户向网络发送大量交易垃圾邮件,以提高更快被纳入的机会。然而,提高优先费用带来的收益在超过一定阈值后就会递减,从而削弱了其作为更好交易放置机制的有效性。Solana 的共享区块空间最终成为经典“公地悲剧”的牺牲品。个人行为者出于自身利益,导致了这种公共资源的过度利用和低效。
中央调度器 v.1.18 更新
Agave 客户端调度程序的初始实现仅提供了一个松散的保证,即具有高优先级费用的交易更有可能被纳入给定的区块。领导者的交易处理单元 (TPU) 使用六个并行线程运行:四个处理非投票交易,两个保留用于投票交易。四个非投票交易线程中的每一个都维护自己的队列,传入的交易等待分组到条目中以进行执行。以前,交易被随机分配给这些线程,并且队列独立地对数据包进行优先级排序,而不会意识到其他线程处理的数据包。
调度器在 TPU 中的位置
在这个系统中,每个线程都会循环遍历其队列,尝试锁定和执行交易。一旦线程完成其当前循环,它就会收集其他数据包并再次启动该过程。这种结构给优先费用的有效使用带来了挑战。例如,虽然高优先级交易可能位于一个线程队列的顶部,但另一个线程可以同时从其队列末尾处理涉及同一帐户的较低优先级费用交易。优先费用仅影响单个线程(线程内)内的交易排序,而不影响所有线程(线程间)的交易排序。因此,每个队列都应用了一种混合排序机制,将先进先出 (FIFO) 处理与优先费用考虑相结合。但是,没有跨线程强制执行全局排序。
当线程准备执行交易时,它必须首先确保所需的帐户锁。如果必要的写锁不可用,则交易将重新排队。将交易随机分配给线程加剧了这个问题,因为同一交易类型最终可能会在多线程调度系统中处于不同的位置。调度程序的这种随机性引入了抖动,从而导致交易在块中的位置变化。
随着 2024 年 5 月 Agave 客户端更新 v1.18 的发布,一个新的交易调度程序(又称中央调度程序)也随之发布。在这个修订的结构中,中央调度程序构建了一个依赖关系图(称为优先级图),以更好地管理所有线程中冲突交易的处理和优先级排序。这一重大更新显著提高了 Solana 确定性地对交易进行排序的能力;具有更高优先级费用的交易更有可能被纳入区块。
Agave 客户端中央调度程序的 priograph
优先级图是一种有向无环图 (DAG),随着新交易的添加而动态更新。交易在图中组织起来,形成按时间优先顺序处理的执行链。对于有冲突的交易,优先级费用决定插入顺序。这种方法最大限度地减少了锁争用,使批量交易能够顺利执行,并减少资源冲突造成的延迟。交易预编译验证已卸载到工作线程,以提高性能并实现更高效的处理。
Agave 客户端中央调度程序构建的 priograph 可视化
更新后的调度程序设计显著提高了可扩展性和灵活性,允许增加线程数量,而不会出现锁冲突加剧的风险。此外,集中式调度方法改善了奖励生成,增加了许多验证者运营商的收入。
有关中央调度程序的更详细分类,读者可以参考我们之前关于 Agave 1.18 更新的 Helius 博客文章。
更有效的优先级计算
结合调度程序的更新,交易优先级公式得到了改进,为计算需求较低的交易提供了优势,使开发人员和资源使用量最少的交易受益。
修改后的公式为:
优先级 = (优先级费用 * 计算请求单位) + 基本费用 /
(1 + 请求执行 CU + 签名 CU + 写锁 CU)
这种新计算考虑了与交易相关的所有计算和运营成本,确保优先级准确代表实际资源消耗。因此,简单的代币转移或没有额外优先级费用的本机 SOL 交易可以保证在队列中具有基准优先级。对于更复杂的交易,与那些使用“SetComputeUnitLimit”指令指定自定义 CU 限制的开发人员相比,忽略指定自定义 CU 限制的开发人员在交易优先级方面处于劣势。
衡量本地费用市场有效性
本节将研究与 Solana 的 LFM 相关的数据。
中位数与平均交易费用
在 LFM 有效运作的情况下,涉及无争议状态的交易(例如简单的稳定币转账)的费用预计将保持在低位。与此同时,进入有争议状态的交易(例如投机性低流动性代币)的费用应该会随着需求而飙升。评估这种动态的一个有价值的指标是比较中位数和平均交易优先费。中位数费用代表第 50 个百分位用户支付的费用,反映了典型成本,而平均费用则占所有费用除以交易总数,突出了总体趋势。
Solana 交易费的中等和中位数(数据:Blockworks Research)
最近的数据证实了这一预期模式。2024 年 11 月是 Solana 迄今为止经济活动的最高水平,非投票交易的平均费用创下了 0.0003 SOL 以上的历史新高。尽管如此,中位数费用仍稳定在 0.00000861 SOL,大约低了 35 倍。这与 2024 年 4 月形成了鲜明对比,当时类似的经济活动激增导致平均费用升至 0.0002 SOL 以上,同时相应的中位数费用增加到 0.00001862 SOL,大约低了 10 倍。这种差异凸显了费用隔离在高需求期间保护典型用户免受成本飙升影响以及为非投机驱动用例保留用户体验方面的有效性。
在分析基于 EVM 的网络(例如 Coinbase 运营的以太坊 L2 Base,该网络缺乏 LFM)的类似数据时,我们观察到中位数和平均交易费用之间存在很强的相关性。当需求增加时,由于全球基础费用上涨,平均费用和中位数费用相对一致。此外,中位数和平均交易费用之间的差距明显较小。例如,在 2024 年 12 月 5 日,Base 上的平均交易费用飙升至 0.1115 美元,而中位数费用也上涨,达到 0.0228 美元——大约低了五倍。
交易费用基础
以太坊 L2 基础中位数和平均交易费用(数据来源:Blockworks Research)
恢复交易率
另一个值得研究的趋势是撤销交易的比率。在 2024 年 4 月和 5 月经济活动高峰期,Solana 用户普遍报告称,由于该链受到大量垃圾邮件的困扰,用户体验下降。缺乏确定性降低了交易执行的可预测性和可靠性,迫使用户向网络发送大量交易垃圾邮件,以提高更快被纳入的机会。
搜索者经常提交交易以进行投机交易,而不考虑成功的可能性。费用优先级过低的套利交易仍然有效。协议将在其他费用优先级较高的交易之后处理它们,并且它们可能会因滑点逻辑而恢复。
撤销交易在 2024 年 4 月达到峰值,占所有非投票交易的 75.7%。在推出包括 Agave 1.18 中央调度程序在内的关键更新后,这一比例大幅下降。
Solana 交易费的中等和中位数(数据:Blockworks Research)
Blockworks Research 对过去七天(2024 年 1 月 6 日至 13 日)进行的队列分析显示,不同活动水平的恢复率各不相同。每天进行 1-5 笔交易的地址(主要是零售用户)的恢复率为 1.4%,每天进行 6-50 笔交易的地址的恢复率则上升到 4.6%。值得注意的是,每天进行超过 10,000 笔交易的地址的恢复率飙升至 66.7%。此外,每天进行超过 100,000 笔交易的高活动地址(机器人)占所有恢复交易的 95.2%。2024 年 12 月,所有非投票交易的总体恢复率为 41.2%,这表明网络的很大一部分计算资源都用于处理失败的套利。
2024 年每周撤销和成功的非投票交易数量(数据来源:Blockworks Research)
当前存在的问题和有待改进的领域
尽管取得了显著的进步,Agave 验证器客户端调度程序仍然面临挑战。Anza工程师 Alessandro Decina 对银行阶段线程工作负载进行了以下分析,重点指出了现有的低效率和需要改进的领域。
Agave 客户端银行阶段线程工作负载的可视化
调度线程:这是生成区块的最关键线程。调度程序接收所有传入交易,然后对其进行排序和调度以供执行。
投票交易线程:两个专用线程处理投票交易,确保它们与用户交易分开处理。
非投票交易线程:四个线程,按照调度程序的安排接收交易并处理用户交易。
QUIC 摄取线程:当验证者为领导者时,Tokio 线程通过 QUIC 协议管理交易摄取。在 2024 年初的拥堵期间,这些线程是一个重大瓶颈。
上面的可视化显示,虽然所有工作线程在领导者的第一个区块开始时并行执行交易,但这种并行性很快就会退化为顺序执行。具体来说,只有一个非投票交易线程(线程三)继续处理交易,其余线程处于空闲状态。
此行为表明调度程序错误导致验证器客户端无法充分利用其全部容量。因此,系统只能发挥其潜力的一小部分,这表明如果问题得到解决,验证器可以处理高达当前负载四倍的负载。
可观察性
目前用于估算可预测交易落地的费用 API 缺乏提供确定性结果所需的复杂性。每个主要的 RPC 提供商都提供自己的自定义优先级费用 API,而核心开源 RPC API 实现仍然不是最理想的。它没有考虑关键的网络动态,例如 Jito 的影响,导致费用估算不太准确。
Helius 提供 ` getPriorityFeeEstimate ` RPC 方法,该方法根据来自全局和 LFM 的历史数据提供费用建议。开发人员可以输入序列化的签名交易或交易中涉及的帐户密钥列表。该方法支持自定义优先级费用级别,分为六个百分位数:最低、低、中、高、非常高和不安全最大值。中等(第 50 个百分位数)被设置为默认建议。费用是使用最近 50 个时段的数据计算的。
代码
{
"jsonrpc": "2.0",
"id": "helius-example",
"method": "getPriorityFeeEstimate",
"params": [
{
"transaction": "LxzhDW7T...", // Base58 encoded serialized transaction
"options": {
"recommended": true
}
}
]
}
上图:使用 base58 编码的序列化交易的 getPriorityFeeEstimate 的示例有效负载。
由于没有确定的优先费用计算方法,开发人员通常会采取谨慎的态度,通过多付钱来保证他们的交易得到处理。或者,他们可能会过度使用 Jito 小费,即使对于不需要确保区块顶部的交易也是如此。这些小费经常被用作优先费用的替代品。值得注意的是,2024 年观察到的大多数小费与传统的 MEV 活动(例如套利或夹层)无关,而是旨在实现更快的交易纳入。验证者通过收取更高的区块奖励和 MEV 佣金来获得这种低效率的回报。
当开发人员没有实现逻辑来动态调整其优先费用以响应波动的链上条件时,就会出现另一个挑战。在重大事件(例如重大市场波动)期间,访问特定状态账户的费用可能会急剧上升。缺乏动态费用机制的应用程序在这些情况下会陷入困境,因为它们的静态费用设置不足以确保及时执行。
建议的解决方案
已经提出了各种策略来进一步增强 Solana 的费用结构。这些提议旨在优化网络资源分配并减轻垃圾邮件的诱因。
指数写锁费用
SIMD-0110 由 Tao Zhu (Anza) 和 Anatoly Yakavenko 于 2023 年 1 月提出,提出了一种通过对有争议的账户征收动态费用来管理拥堵的新机制。该机制跟踪写锁定账户的计算单元 (CU) 利用率的指数移动平均线 (EMA),并增加持续表现出高利用率的写锁定账户的成本。
为了实现这样的系统,Solana 运行时维护了有争议账户及其相应的计算单元定价器 (CUP) 的公钥的 LRU(最近最少使用)缓存。CUP 监控账户的 EMA CU 使用率,并在查询时提供更新的成本费率。
该机制动态调整写锁费用。如果账户的 EMA CU 使用率超过目标阈值,写锁成本率将增加。相反,如果使用率低于目标,成本率将降低。初始参数包括:
目标利用率为账户最大 CU 限额的 25%。
初始写锁成本率为每 CU 1,000 个微灯端口。
每块成本调整率为 1%。
账户的写锁费用通过将其成本率乘以交易请求的 CU 来计算。在此系统下,总交易费用是三个部分的总和:基本签名费、优先费和写锁费。写锁费用 100% 被销毁。
SIMD-0110 发布后在社区内引发了热烈的争论。然而,该提案目前处于非活跃状态,并被标记为已关闭。
动态基础费用
改进 Solana LFM 的另一个长期解决方案是引入全局和每个账户的动态基础费用 (DBF)。Ellipsis Labs 的 Jarry Xiao 和 Eugene Chen 是这种方法的著名支持者。
虽然优先费用是可选的,但基本费用是强制性的。目前,Solana 的基本费用固定为每个签名 5000 lampor。提交简单代币转移的用户支付的基本费用与进行复杂的多场所交换或试图执行复杂 MEV 套利的搜索者支付的基本费用相同。基本费用不能准确反映交易的计算使用情况。
使用动态基础费用,具有不适当基础费用的套利交易可被视为无效并在到达调度程序之前被丢弃。提高基础费用会鼓励垃圾邮件发送者发送更少的交易。
基本费用最终将稳定在平衡水平,交易将根据区块空间市场的价值进行定价。由于基本费用不断上涨,最终将达到边际成本,即发送交易不再值得交易的机会成本。费用不能太高;否则,用户活动将受到影响。对于机器人来说太高但用户通常可以接受的最大值是理想的。在这样的系统下,发送垃圾交易以纳入的帐户将烧掉所有 SOL。
Solana 的快速出块时间使激进的算法能够设定基本费用。在需求旺盛期间,费用可以迅速调整(可能每出一个区块就翻一番),以反映网络拥堵情况。相反,随着需求减少,费用可以逐渐降低。由于 Solana 的出块时间较短,费用降低仍然相对较快,确保网络能够快速适应不断变化的条件。
类似形式的经济反压的一个例子是 Metaplex Candy Machine 计划,该计划于 2022 年设立了机器人税作为反垃圾邮件机制。机器人税是针对无效交易的可选收费。通常,这将是一个相当小的数额,以避免影响犯了真正错误的真实用户。这种税收被证明是有效的;铸币狙击手很快就被耗尽,垃圾邮件也停止了。
结论
Solana 的 LFM 功能齐全,但仍有很大的改进空间:
增强优先费用机制:优先费用 RPC 调用需要改进。理想情况下,开发人员应该有一种简单、确定的方式来设置费用,以保证交易包含在几个后续区块中。
经济上抑制垃圾邮件:网络必须想办法在经济活动高峰期对机器人施加经济反压,同时保持对真正的人类用户的低费用。
教育开发人员:开发人员需要停止设置静态应用程序交易费用,并减少对 Jito 等协议外机制的依赖进行日常交易。
进一步的调度优化:事务调度程序需要进一步优化,以确保在高需求期间所有工作线程都得到利用。
正如 Solana 联合创始人 Anatoly Yakovenko 指出的那样,这些挑战主要是“工程问题”——只要适当的技术重点就可以解决。