本文深入探讨了Solana区块链的新验证器客户端Firedancer,介绍了其开发背景、架构设计、性能优化及其对Solana网络的重要性。Firedancer由Jump开发,旨在通过模块化设计和C语言重写现有验证器客户端,提升Solana的速度和可靠性。
46分钟阅读
2023年11月29日
非常感谢Firedancer团队审阅了这篇文章。
Solana是最快的区块链。但它还可以更快。目前的Solana Labs验证者客户端表现良好,但针对市场速度进行了优化。由此可得,Jump凭借丰富的高性能计算经验,将致力于让Solana变得更快、更可靠。Turning to their expertise in high-frequency trading, Jump正在开发Firedancer。这是任何区块链上性能最好的验证者客户端。它建议用C编程语言对Solana当前的验证者客户端进行全面重写。
本文探讨验证者及其客户端多样性的重要性。接下来,我们将讨论Jump为何要构建一个新的验证者客户端,以及他们在高频交易方面的经验如何使他们成为开发Firedancer的最佳团队。然后,我们将解释Firedancer是什么,它如何运作,为什么它如此快速,如何保障安全以及它的当前状态。
到本文结束时,你将对Jump的新验证者客户端有透彻的理解。你将熟悉他们开创性的优化,使其成为任何区块链上性能最好的验证者客户端。你还将理解为什么Firedancer对Solana网络的性能和可靠性至关重要。这是你了解Firedancer所需的唯一文章。
附录部分包含一个完全可选的计算机硬件和网络基础知识入门。它的补充是为了为普通读者提供必要的上下文,以便他们理解本文中涉及的更高级的硬件和网络概念。尽管如此,在必要时也提供了相应的背景信息。本文的目标是使任何使用Solana的人都能理解Firedancer及其重要性。
验证者是参与权益证明(Proof of Stake)区块链的计算机。验证者构成了Solana网络的核心。他们负责处理交易并参与共识。验证者通过锁定一定量Solana原生代币作为其权益,从而帮助确保网络的安全性。将其视为保证金,经济上将验证者暴露于网络中。这种暴露鼓励验证者准确高效地执行任务,因为他们会因贡献而获得奖励。对于恶意或错误行为,验证者也将受到惩罚。验证者的权益将在一种称为削减(slashing)的过程中因不当行为而减少。因此,验证者的最佳利益是妥善履行其职责,以增加其权益。
验证者客户端是验证者用于执行其职责的应用程序。客户端作为验证者的基础,使用其加密唯一身份参与共识。
多个互不相同的客户端可以提高故障容错能力,以防止某一实现失败。例如,如果没有客户端控制超过33%的权益,则崩溃或影响运行的错误不会导致网络瘫痪。同样,如果某一客户端存在导致无效状态转换的错误,如果使用该客户端的权益少于33%,网络可以避免安全失败。这是因为网络的大部分仍将保持在有效状态,防止区块链的分裂。因此,验证者客户端的多样性可以提高网络的韧性,因为某一客户端中的错误或漏洞不会削弱整个网络。
客户多样性的衡量标准是通过每个客户端的权益所占比例和可用客户端的总数。在撰写本文时,Solana网络上有1979个验证者。这些验证者在主网使用的两个客户端分别来自Solana Labs和Jito Labs。Solana于2020年3月推出了一个由Solana Labs开发的验证者客户端。在2022年8月,Jito Labs发布了第二个验证者客户端。该客户端是基于Solana Labs代码的一个分支,由Jito维护和部署。该客户端优化了区块内的最大可提取价值(MEV)的提取。由于Solana无需池化,Jito的客户端创建了一个伪内存池,允许验证者搜索这些交易,最优地将它们捆绑在一起并提交给Jito的区块引擎。
截至2023年10月,Solana Labs客户端控制68.55%的活跃权益,而Jito占31.45%。使用Jito客户端的验证者数量比Solana基金会以前的健康报告增长了16%。Jito客户端的不断增加反映出客户端多样性向好的趋势。
虽然这一增长的消息令人振奋,但并不完美。需要强调的是,Jito的客户端是Solana Labs客户端的一个分支。这意味着Jito与原始验证者代码库共享许多组成部分,可能对影响Labs客户端的错误或恶意攻击有潜在的脆弱性。在理想的未来,Solana将至少拥有四个独立的验证者客户端。不同的团队将在不同的编程语言中构建这些客户端。没有任何单一实现会超过33%的权益,因为每个客户端将持有约25%。这种理想化的设置将使整个验证者堆栈缺乏单一故障点。
开发第二个独立的验证者客户端对实现这一未来至关重要,而Jump致力于实现这一目标。
Solana的主网在过去经历了四次区块生产停止,每一次都需要数百个验证者手动修复。这些停机事件突显了人们对Solana网络可靠性的担忧。Jump认为协议是安全的。相反,他们将停机归因于影响共识的软件模块问题。因此,Jump正在开发一个新的验证者客户端以解决这些问题。该客户端的整体目标是增强Solana的网络稳定性和效率。
开发一个独立的验证者客户端是一项艰巨的任务。然而,这并不是Jump首次构建可靠的全球网络。在过去,安全交易(即购买和出售股票)都是由市场专家手动执行的。随着电子交易平台的出现,证券交易所变得更加开放。这种开放性增加了竞争,自动化程度也提高,减少了投资者交易所需的时间和成本。市场专家之间因此展开了一场技术竞争的军备竞赛。
交易员的生命就是交易。最佳的交易体验在软件、硬件和网络解决方案上都没有妥协。这些系统必须具备高机器智能、低实时延迟、高吞吐量、高适应能力、高可扩展性、高可靠性和高问责制。
商品解决方案(即企业可以完全购买的软件)并不是竞争优势。每秒发十个正确订单到交易所是一种亏钱的昂贵方式。在高频交易中,激烈的竞争导致了一个永久的开发循环,构建顶级的全球交易基础设施。
这个场景可能听起来很熟悉。成功交易系统的需求与成功区块链的需求相似。区块链需要高效、容错、低延迟的网络。缓慢的区块链就是未能满足现代企业应用需求的一种失败技术——它无非是阻碍了创新、可扩展性和现实效用。凭借超过二十年的全球网络扩展和高性能系统开发的经验,Jump是创建独立验证者客户端的最佳团队。Kevin Bowers是Jump Trading的首席科学官,正在监督这一过程。
Kevin Bowers详细讨论了光速太慢的问题。光速是一个有限常数,为单个晶体管可以处理的计算量提供了自然限制。当前的比特是通过电子流过晶体管进行建模的。 香农容量定理(即通过信道发送的最大无误差数据量)限制了通过晶体管发送的比特数量。由于基本物理学和信息理论,计算速度受限于电子通过物质移动的速度和数据传输的能力。当将超级计算机推到极限时,这些约束变得显而易见。因此,存在着“一种计算机处理数字与移动数字的能力之间的严重不匹配。”(https://jumpcrypto.com/writing/jump-vs-the-speed-of-light/)
以Intel Core i9 13900K CPU为例。它有24个x86内核,基础时钟为2.2 GHz,峰值涡轮时钟为5.8 GHz。在最坏情况下,光必须在该CPU上总共传播约52.0毫米。CPU的曼哈顿距离(即沿垂直于两个点的轴测量的距离)为约73.6毫米。在CPU的峰值涡轮时钟速度5.8 GHz下,光在空气中可以传播约51.7毫米。意味着信号几乎可以在单次时钟周期之间在CPU上的任意两个点之间完成一次往返。
现实情况则要糟糕得多。这些测量使用的是光在空气中传播的速度,而这些信号实际上是通过二氧化硅(SiO2)传播的。光在5.8 GHz时,在二氧化硅中只能传播约26.2毫米。而在硅(Si)中,光在5.8 GHz时只能传播约15.0毫米——只有CPU长边的一半多一点。
Firedancer团队认为,最近的计算技术进步更多是关注将更多核心集成到CPU中,而不是提高其速度。当人们需要更多性能时,他们被鼓励购买更多硬件。这在吞吐量是瓶颈的情况下暂时行得通。实际瓶颈是光速。这种自然限制导致决策过程的瘫痪。由于系统有许多组件,且没有一个优化良好,任何单一优化的即时回报都很有限。未得到优化的部件随着时间推移只会恶化,因为它们的可计算资源会更少。那么,该怎么办?
在高性能计算领域,最终一切都必须被优化。结果是建立用于生产交易和定量研究的系统,这些系统在物理和信息理论的极限上运行。包括创建自定义网络交换技术,以便设计时考虑这些物理限制的无锁算法。Jump既是一家技术公司也是一家交易公司。在科幻与现实的尖端,展示了Jump与Solana目前面临问题之间的明显相似性,Jump正在开发Firedancer。
Firedancer是一个全新的、完全独立的验证者客户端,由Firedancer团队使用C编程语言开发。Firedancer旨在实现可靠性,基于其模块化架构、最小依赖性和广泛的测试流程。它提议对Solana Labs客户端的三个功能组件:网络、运行时和共识进行重大重写。每个层级都经过优化,以实现最大性能,因此客户端的运行能力完全受到验证者硬件的限制。这不同于目前验证者因软件低效而面临的性能限制。借助Firedancer,Solana将能够随带宽和硬件的提升而扩展。
Firedancer的目标是:
Firedancer通过其独特的模块化架构将自身与当前的Solana验证者客户端区别开。与作为单一进程操作的Solana Labs Rust验证者客户端不同,Firedancer由多个被称为图块的单个Linux C进程组成。图块是一个进程和一些内存。此图块架构是Firedancer的操作理念和强健性、效率方法的基础。
进程是正在运行的程序的一个实例。它是现代操作系统的基本组成部分,表示指令集的执行。每个进程都有独立的内存空间和操作系统分配和独立于其他进程的资源。进程就像大型工厂中的独立工人,处理他们的特定任务,手头拥有各自的工具和工作空间。
在Firedancer中,每个图块是一个具有特定义务的独立进程。例如,QUIC图块负责处理传入的QUIC流量并将封装的交易转发到验证图块。验证图块负责签名验证,以此类推。这些图块独立且并行地运行,贡献于系统的整体功能。单个Linux进程允许形成小而独立的故障域。这意味着一个图块中的问题对整体系统的影响极小——或者说小的“爆炸半径”。这一方法有别于Solana Labs Rust客户端,因为没有单一故障点有潜力立即损害整个验证者。
Firedancer架构的一个关键优势是能够在秒级内替换和升级每个图块而无需任何停机。这种能力与Solana Labs Rust客户端的要求完全关闭才能进行升级形成鲜明对比。差异源于Rust缺乏ABI(应用程序二进制接口)稳定性。这使得在纯Rust环境中无法动态升级。使用C进程,有益于C运行时模型中的二进制稳定性,可以显著减少与升级相关的停机时间。它能够做到这一点,因为图块在不同的工作空间中管理验证者状态。这些共享内存对象只要验证者通电就会保留。每个图块可以在重新启动或升级期间无缝继续之前的处理。
总体而言,Firedancer是根据一个NUMA感知的、基于图块的架构构建的。我们将在下一部分解释这意味着什么。目前,这意味着它为每个线程提供了专用的硬件资源。在这一架构中,每个图块使用1个CPU核心。它在图块之间的消息传递具有高性能,专门针对内存局部性、资源布局和组件延迟进行了优化。
Firedancer的网络处理旨在处理Solana网络在向千兆比特每秒(Gbps)速度扩展时所需的密集要求。该过程分为入站和出站活动。
入站活动主要围绕接收来自用户的交易。Firedancer的性能至关重要,因为如果验证者在数据包处理上落后,可能会丢失共识消息。目前Solana节点的操作带宽约为0.2 Gbps,而Jump节点的最大记录峰值为约40 GB/s。带宽的这一激增凸显了对稳健且可扩展的入口处理解决方案的需求。
出站活动包括区块打包、区块创建和发送区块切片。这些步骤对于Solana网络的安全和高效运行至关重要。这些任务的性能不仅影响吞吐量,还影响网络的整体可靠性。
Firedancer旨在解决Solana的点对点接口在处理交易方面的历史弱点。Solana的点对点接口的一个主要缺点是缺乏对入站交易的拥塞控制。这一缺点导致了2021年9月14日(17小时)和2022年4月30日(7小时)的重大网络故障(链接)。
为了应对这种情况,Solana进行了若干网络升级,以正确处理高交易负载。Firedancer顺应其后,通过采用QUIC进行流量控制。QUIC是一个多路复用的传输网络协议,是HTTP/3的基础。它在防御DDoS攻击和管理网络流量方面起着重要作用。然而,重要的是要注意,在某些情况下,成本超越收益。结合数据中心的新硬件来缓解DDoS攻击,QUIC消除了交易泛滥的动机。
QUIC的151页规范为开发带来了相当大的复杂性。由于无法找到满足许可证、性能和可靠性需求的现有C库,Firedancer团队构建了自己的实现。Firedancer的QUIC实现,昵称为fd_quic,介绍了优化的数据结构和算法,确保最小的内存分配,从而防止内存耗尽。
Firedancer定制的网络堆栈是其处理能力的核心。该堆栈是从头开始设计的,利用接收端扩展(Receive-Side Scaling,RSS)。RSS是一种硬件加速的网络负载均衡形式,将网络流量分配到各个CPU核心,以增加网络处理的并行性。每个CPU核心在最低开销下处理一部分入站流量。这种方法通过消除复杂的调度程序、锁和原子操作,优于传统的基于软件的负载均衡。
Firedancer引入了一种新的消息传递框架,用于组成高度高效的图块应用程序。这些图块可以避免内核网络(由于其基于套接字的特性而受到限制),通过利用AF_XDP。AF_XDP是一个为高性能数据包处理优化的地址族。使用AF_XDP使Firedancer能够直接从网络接口缓冲区读取。
这个图块系统促进了Firedancer堆栈中各种高性能计算概念的引入,包括:
Firedancer的构建系统是在一系列指导原则中设计的,以确保可靠性和一致性。它强调最小化外部依赖,并将构建过程中涉及的所有工具视为依赖项。这包括将每个依赖项(包括编译器)固定到确切的版本。该系统的一个关键方面是在构建步骤中实现环境隔离。环境隔离增强了可移植性,因为构建过程不受系统环境的影响。
Firedancer在诸如ED25519签名验证等密码任务的处理上,采用现代处理器内可用的高级数据并行性。现代CPU具有单指令多数据(SIMD)指令,能够同时处理多个数据元素,并对在每个CPU周期内运行多条指令进行了优化。以并行方式在数组或数据元素向量上操作单个指令在面积、时间和功耗方面通常更高效。在这方面,提高并行数据处理的能力,可以与单纯提高处理速度相比,提升吞吐量。
Firedancer利用数据并行性的一个领域是优化计算签名验证。这种方法允许同时处理数组或数据元素向量,以最大化吞吐量并最小化延迟。这种ED25519实现的核心是Galois域算术。该算术非常适合用于密码算法和二进制计算。在Galois域中,加法、减法、乘法和除法操作都有定义,与计算机系统的二进制特性相一致。以下是一个以23为定义的Galois域的基本运算示例:
唯一的问题是,ED25519使用的是一个由2255-19定义的Galois域。可以认为域元素是从0到2255-19的数字。这是基本运算的样子:
加法、减法和乘法几乎属于uint256_t数学(即无符号整数的运算,最大值为2256-1)。然而,除法就难以计算。商品CPU和GPU不支持uint256_t数学,更不用说“几乎uint256_t数学”了,尤其是相当复杂的除法。实现此类数学,并让其高性能,考验着我们能多好地模拟这种类型的数学。
Firedancer的实现突破了算术,考虑数字更灵活。如果我们应用学校长除法和乘振中的原则,将数字从一列进位到下一列,我们可以并行处理这些列。模拟这种类型的数学的最快方式是将uint256_t表示为六个43位数字和一个9位“进位”。这允许存在的64位运算在CPU上运行,同时提供足够的空间用于进位。数字的这种排列减少了频繁进位的需要,使Firedancer更有效地处理大数字。
这一实现通过将算术运算重新组织为并行列和总和利用数据并行性。并行处理列总体上加快了计算,因为它将本应是一个顺序瓶颈的任务转化为可并行处理的任务。Firedancer还使用了如AVX512及其IFMA扩展(AVX512-IFMA)之类的向量指令集。这些指令集处理上述解释的Galois域算术,从而提高了速度和效率。
Firedancer的AVX512加速实现是快速的。在单个2.3 GHz的Icelake服务器核心上,其性能超过了他们2022年Breakpoint演示中的核心时钟的双重性能。该实现具有100%的向量通道利用率和巨大的数据并行性。这是Firedancer团队又一次巧妙的展示,由于光速传输延迟,并行做不同的事情比一次做一件事情要简单得多,即使用上了定制硬件。
每个CPU核心每秒能处理约30000次签名验证。尽管它们是一个高效能的选择,但在大规模运作方面却不够理想。这一限制源于它们的顺序处理方式。GPU将这种处理能力提升至每个核心约100万次验证。然而,它们的缺点在于每个单位的功耗高达约300W,且天生由于批处理导致的延迟。
FPGA则成为了更优的替代方案。它们与GPU具有同样的吞吐量,但功耗显著降低,约50W每个FPGA。它的延迟也低于GPU的十毫秒延迟。FPGA为实时处理提供了一个更快速响应的解决方案,延迟约为200微秒。与GPU的批处理不同,Firedancer中的FPGA以流式方式单独处理每个交易。Firedancer对FPGA的使用实现了每秒800万次签名验证,功耗预算不超过400W,使用8个FPGA。
该团队在2022年Breakpoint展示了Firedancer的ED25519签名验证过程。这一过程包含几个阶段,包括在纯RTL管道中进行SHA-512计算,并在定制的ECC-CPU处理器管道中进行各种检查和计算。基本上,Firedancer团队为其定制处理器编写了一个编译器和汇编器,从请求评论(RFC)中提取Python代码,运用运算符重载的对象产生机器代码,然后将机器代码载于ECC-CPU之上。
重要的是要注意,Firedancer采用了AWS加速器形态因素样式,以平衡稳健性和网络连接性。这一选择解决了直接网络连接所面临的挑战 — 这一特性通常受限于云提供商。在此选择下,Firedancer确保在云基础设施的限制内无缝集成其先进能力。
必须承认,不同的操作需要切实的物理空间,而不仅仅是概念上的数据空间。Firedancer通过有策略地安置物理组件来理解这一点,使它们相近并可重用。这种配置使Firedancer能够最大化其FPGA的效率,在一台8年前的机器上实现8m TPS的性能。
网络通信中的基本挑战是全球广播新交易。互联网的点对点特征、有限的带宽数量和延迟问题限制了传统思想的实施,例如利用网络进行直接广播。在环或树结构中分发数据在一定程度上解决了这些问题,但因数据包在传输过程中可能会丢失而不足。
Reed-Solomon编码便是这些问题的一种优美解决方案。它引入了数据传输冗余(即奇偶校验信息),以恢复丢失的数据包。其理念基于“两个点定义一条线”的原则,在线上任意两个点可以重生原始数据点。通过基于数据点构建多项式并在不同数据包中的不同点分发该函数,可以在接收方收到至少两个数据包时重构原始数据。
我们构建多项式是因为使用传统的线上的点( y = mx + b)公式在计算上较慢。Firedancer使用Lagrange多项式,这是一种专业的多项式构建方法,来加速这一过程。它简化了为Reed-Solomon编码构建多项式的过程,也将该过程转化为效率更高的矩阵—向量乘法,适用于高阶多项式。这个矩阵结构高度有序,具有递归重复的模式,这样,模式的第一行完全决定了其结构。该结构意味着存在更快的乘法方式。Firedancer采用了在2016年文章中提出的O(n log n)方法,用于矩阵的乘法,这是Reed-Solomon编码已知的最快理论实现。此方法计算的奇偶校验信息效率与传统方法相比显著提升:
Firedancer使用优化Reed-Solomon编码的方法能够将奇偶校验计算速度提升14倍。这一快速可靠的数据编码和解码过程,对于在全球范围内维持高吞吐量和低延迟至关重要。
目前所有验证者均使用基于原始验证者客户端的软件。如果Firedancer与Solana Labs客户端不同,它可以改善Solana的客户端和供应链多样性。这包括使用类似的依赖和使用Rust开发他们的客户端。
Solana Labs和Jito验证者客户端作为单一进程运行。为单一应用程序加固安全性在生产环境中较为困难。在纯Rust中运行这些客户端的验证者将必须在动态安全升级前关闭。Firedancer团队可以从一开始便为他们的新客户端构建安全架构。
Firedancer还获得了从经验中学习的额外好处。Solana Labs在初创环境中开发验证者客户端。这一快速节奏的环境使Labs需要快速推陈出新才能尽快上市。这使他们未来的开发遭遇了劣势。Firedancer团队可以借鉴Labs所做的事情以及其他链上团队的做法,思考如果他们能够从头开始开发一个验证者客户端,他们会采取哪些不同的做法。
尽管Firedancer与Solana Labs客户端存在明显差异,但它必须密切复制其行为。未能做到这一点将成为一个安全隐患,因为这可能因不兼容而引入共识错误。为此,可以通过激励一定比例的权益在两个客户端上同时运行,保持Firedancer在总权益的33%以下,来进行缓解。无论如何,Firedancer团队需要根据协议实施完整的功能集,无论正确或安全地实施有多困难。一切都必须与Firedancer保持一致。因此,团队不能孤立地开发代码,而必须将其与Labs客户端的功能进行检查。此外,由于缺乏规范和文档,Firedancer必须引入低效的协议构造。
Firedancer团队还必须注意到,他们是在C中开发新客户端。C并没有提供像Rust这样的语言所提供的内存安全性保证。Firedancer代码库的一项主要目标是减少内存安全漏洞的发生率和影响。这个目标需要高度重视,因为Firedancer是一个进展迅速的项目。Firedancer必须找到在不引入此类漏洞的情况下保持开发速度的方法。操作系统沙箱化是将图块与操作系统隔离的做法。图块仅被允许访问其工作所需的资源,并执行系统调用。由于图块具有明确的目标,且Firedancer团队开发了大部分客户端代码,图块的权限根据最小权限原则被大幅削减。
所有软件在某个时间点都会存在安全漏洞。基于这样一个前提,Firedancer选择限制单一漏洞的潜在影响。这种方法称为深度防御。深度防御是一种通过多项安全措施来保护资产的策略。如果攻击者在系统的一部分成功实施攻击,还有其他措拖能防止威胁影响整个系统。Firedancer旨在缓解漏洞与利用阶段之间的堆栈。例如,攻击者要利用内存安全漏洞将非常艰难。
这是因为防止这些类型的攻击是一个经过充分研究的问题。在C中,内存安全性问题大量研究为Firedancer团队提供了一系列加固技术和编译器特性。即使攻击者能够绕过行业最佳实践,将其利用与系统的损害也将变得极其困难。这要归功于图块隔离和OS沙箱化。
图块隔离是Firedancer并行架构的结果。每个图块都有明确、单一的目标,因为它们各自运行自己的Linux进程。例如,QUIC图块负责处理传入的QUIC流量,并将封装的交易转发到验证图块。随后,验证图块负责签名验证。QUIC和验证图块之间的通信通过共享内存接口(即Linux进程可以在彼此之间传递数据)进行。这两个图块之间的共享内存接口充当一个隔离边界。如果QUIC图块存在一个Bug,允许攻击者在处理恶意QUIC数据包时执行任意代码,这种情况不会影响其他图块。在单个进程中,这将是一个瞬时问题。攻击者如果能在多个验证者上利用这一漏洞,将可能对整个网络造成损害。但是攻击者从图块QUIC中下降性能,仅限于这一图块。
OS沙箱化是将图块与操作系统隔离的做法。图块仅被允许访问其工作所需的资源,并进行系统调用。由于图块有明确的目标,且几乎所有代码都由Firedancer团队开发,一个图块的权限被严格限制至最小权限原则。图块被放置在自己的Linux命名空间中,提供了对系统的有限视图。这样的限制视图防止图块访问大部分文件系统、网络和在同一系统上运行的其他进程。命名空间提供了以安全为先的边界。不过如果攻击者有用于提升特权的内核漏洞,这一沙箱仍是能被绕过的。系统调用接口是图块能接触到的内核最后一个攻击面。为了抵御这种情况,Firedancer使用seccomp-BPF在内核处理之前过滤系统调用。客户端可以将图块限制为特定的系统调用。在某些情况下,系统调用的参数可以被过滤。这一点非常重要,因为Firedancer确保读取和写入系统调用仅在特定文件描述符上进行。
Firedancer被设计为在其开发的每个阶段都融入全面的安全程序。该客户端的安全程序是开发和安全团队之间的持续合作,为安全区块链技术设定了新标准。
这一过程始于自助模糊测试基础设施。顺便提一句,模糊测试是一种自动检测崩溃或表明存在漏洞的错误条件的技术。通过对每个接受不受信任用户输入的组件进行压力测试,包括点对点(P2P)接口(解析器)和SBPF虚拟机。 OSS-Fuzz在代码更改过程中持续保持模糊覆盖。安全团队还为持续覆盖护航模糊测试设置了专用的ClusterFuzzer实例。开发人员和安全工程师也为安全关键组件贡献模糊测试程序(即安全关键组件的特殊版本单元测试)。开发人员还可以贡献新的模糊测试,这些测试会自动被拾取并进行测试。目标在于在进入下一阶段之前强化所有部分的模糊测试。
内部代码审查有助于识别工具遗漏的错误。此阶段的重点是高风险、高影响的组件。这一步也是一个反馈机制,为整个安全程序提供信息。团队应用所有所学,以将这些审查应用于增加模糊测试覆盖率,引入某些缺陷类别的新静态分析检查,甚至实施大规模代码重构,以设计脱出复杂的攻击面。通过领先行业的专家以及积极的漏洞赏金计划(无论在发布前还是发布后)来补充这些内部审查的工作。
Firedancer还在不同的测试网络上经过了广泛的压力测试。这些测试网络将会面临灾难,比如复制节点、失败的网络链接、数据包洪水和共识违例。这些网络将承受的负荷远高于主网上的任何现实场景。所以,这引出了一个问题:Firedancer 的当前状态是什么?
Firedancer 团队正在逐步开发 Firedancer 以模块化验证节点客户端。这与他们在文档和标准化方面的目标相一致。这种方法确保 Firedancer 始终与 Solana 的最新进展保持同步。这导致了 Frankendancer 的创建。Frankendancer 是一种混合客户端模型,Firedancer 团队将其开发的组件集成到现有的验证节点客户端基础设施中。该开发过程允许逐步改进和测试新功能。
Frankendancer 就像将一辆跑车放在交通拥堵的道路中央。随着更多组件的开发和瓶颈的消除,性能将逐渐提升。这种模块化的开发流程促进了可定制且灵活的验证节点环境。在这里,开发者可以修改或替换他们验证节点客户端中的特定组件,以满足他们的需求。
Frankendancer 实现了 Solana 验证节点的所有网络功能:
Frankendancer 利用 Firedancer 的高性能 C 网络代码,构建在 Solana Labs 的 Rust 运行时和共识代码之上。
Frankendancer 的架构设计是为了优化高端硬件。虽然它也支持运行标准 Linux 操作系统的低端云主机,但 Firedancer 团队正在为高核心数量的服务器优化 Frankendancer。长期目标是利用云中已可用的硬件来提高效率和性能。该客户端支持同时连接多个,以及硬件加速、随机流导向以实现负载分配(即,确保网络流量均匀分布),并在组件之间提供多个进程边界以增强安全性。
技术效率是 Frankendancer 的基石。该系统在关键路径中避免内存分配和原子操作,所有分配都在初始化时进行了 NUMA 优化。这种设计确保了最大效率和性能。此外,异步和远程检查系统组件的能力,加上管理 tiles(即启动、停止和异步重启)的灵活性,为系统增加了一层稳健性和适应性。
Frankendancer 可以处理每秒 1,000,000 笔交易(TPS)在网络入站方面的性能。此性能随着所使用核心数量的增加而线性扩展,因为每个 tile 使用 1 个 CPU 核心。Frankendancer 只使用四个核心就实现了这一壮举,充分利用了 25 Gbps 的网络接口卡(NIC)。
凭借 Turbine 的优化,Frankendancer 在网络出站操作方面取得了显著的提升。当今标准节点硬件每个 tile 达到 6 Gbps 的速度。这包括 shredding(即如何将区块数据分割并发送到网络中的验证节点)的速度显著提升。与当前标准的 Solana 节点相比,Frankendancer 显示出在没有 Merkle 树的情况下 shredding 速度增加约 22%,而使用 Merkle 树时速度几乎翻倍。这是对当前验证节点区块传播和交易摄取性能的巨大改善。
Firedancer 的网络性能表明它已经达到了硬件极限。它以现有的标准验证节点硬件达到了可能的最高性能。这标志着一个重要的技术里程碑,展示了该客户端以高效和有效的方式处理极限工作负载的能力。
Frankendancer 目前正在测试网上进行质押、投票和生成区块。它与约 2900 个其他 Solana Labs 和 Jito 验证节点兼容共存。这一实时部署展示了 Firedancer 在商品硬件上的强大性能。它目前运行在 Equinix Metal m3.large.x86 服务器,其由 AMD EPYC 7513 CPU 提供动力。许多其他验证节点也使用相同类型的服务器。它提供按需定价的成本效益解决方案,定价因位置而异,价格范围从每小时 3.10 美元到 4.65 美元。
Firedancer 在主网启用方面的进展为节点硬件开启了多个可能性:
这些发展,以及包括 Wiredancer(即 Firedancer 团队在硬件加速方面的实验)和模块化的基于 Rust 的运行时/SVM 在内的其他倡议,使 Firedancer 成为一个前瞻性的解决方案。
Firedancer 的进展也引发了关于验证者能否在运行 Firedancer 的过程中与 Solana Labs 客户端并行运行的讨论,这一过程被称为 side-caring。这种方法可以最大化网络的活跃性,通过利用两个客户端的优势并减轻任一客户端在整体网络中可能产生的问题的影响。此外,这也引发了人们对 Jito 等项目是否会考虑 fork Firedancer 的 speculation。这可能会导致在 MEV 提取和交易处理效率上的进一步优化。时间会证明一切。
开发者通常将操作想象为占用数据空间而非物理空间。由于光速是一个自然约束,这种假设导致了慢速系统,未能正确优化其硬件。在高度对抗和竞争的环境中,我们必须避免在 Solana 上投入更多硬件并指望它表现更好。我们需要优化。Firedancer 革新了验证节点客户端的结构和操作期望。通过构建一个可靠、高度模块化且高性能的验证节点客户端,Firedancer 团队正为 Solana 的广泛采用做好准备。
无论你是初级开发者还是普通 Solana 用户,理解 Firedancer 及其重要性都是至关重要的。这一技术成就让当前市场上速度最快、性能最佳的区块链变得更好。Solana 旨在成为一个高吞吐量、低延迟的全球状态机。Firedancer 是向实现这些目标迈出的巨大一步。
如果你读到这里,谢谢你,朋友!请在下面输入你的电子邮件地址,以便你永远不会错过有关 Solana 最新动态的更新。准备更深入了解吗?加入我们的 Discord,开始在目前性能最强的区块链上构建未来吧。
计算机是可以编程的机器,可以自动执行算术或逻辑操作的序列。这些操作的范围从自动化基本计算到复杂的数据处理。计算机的核心结合了硬件和软件组件,以执行指令和管理数据。硬件包含物理组件,而软件包括指示硬件如何操作的程序和操作系统。
有用的计算通常涉及四种资源:计算、内存、磁盘存储和网络。计算方面主要由 CPU、GPU,潜在情况下由 FPGA 处理,其速度极快,能够每秒执行数十亿次操作。访问 RAM 通常比在 CPU 中执行计算要慢。磁盘存储提供了一种长期存储解决方案,该方案对于计算很有用。然而,从固态硬盘 (SSDs) 和硬盘驱动器 (HDDs) 中访问数据的速度远低于 CPU 操作。SSDs 的速度通常比 HDDs 慢数千倍,而 HDDs 的速度慢数万倍。此外,网络,包括互联网和本地网络,是速度最慢的。它的速度可能比 CPU 慢超过一百万倍。
理解这些速度差异对于理解 Firedancer 等高性能计算应用中的设计原则和效率考虑至关重要。CPU 的计算速度设定了基线,内存、磁盘存储和网络访问在速度下降的顺序中每个都增加了一层延迟。
CPU,即中央处理器,是计算机功能的基石——它是机器的大脑。CPU 执行软件指令、进行计算,并根据输入做出决策。它通过处理二进制信号来工作,这些信号是零和一的序列。每个独特的二进制代码序列对应于 CPU 解释并执行的特定指令。这些指令是顺序处理的,CPU 在处理一个操作之前必须先完成一个操作。这种指令的顺序处理是 CPU 角色的基础,决定了它如何进行复杂计算并根据输入做出决策。
现代 CPU 通常是多核的。这意味着它们在单个芯片内含有多个处理单元,称为核心。每个核心可以独立执行指令,从而允许任务的并行处理。多核架构增强了 CPU 同时处理操作的能力,显著提高了整体性能。然而,重要的是要注意,在每个核心内,操作仍然是顺序处理的。这使 CPU 非常适合复杂的顺序任务,但对于大量更简单的并行任务效率较低。
CPU 还配备有 缓存 - 在 CPU 内的小型高速内存单元。这些缓存存储频繁访问的数据和指令,允许比从 RAM 获取数据时更快的检索时间。通常有多个层级的缓存(L1、L2、L3,甚至有时是 L4),每个缓存具有不同的大小和速度。L1 缓存是最小且速度最快的,作为首选缓存。如果未找到所需数据,CPU 检查更大、稍慢的 L2 缓存,以此类推。这种分层缓存系统减少了 CPU 等待 RAM 数据的时间,提高了整体处理速度。在 Firedancer 这样的应用中,缓存的高效使用具有深远的意义,因为从 CPU 到 RAM 的距离可能会影响性能。这在我们讨论光速和使用 FPGAs 的影响时尤其相关。
顺便提一下,术语 “x86” 是指遵循特定架构的 CPU 家族,该架构最初由 Intel 开发。该架构因与广泛的软件兼容性而闻名,因为大多数出售的桌面和笔记本计算机都是基于 x86 架构技术的。
GPU 是一种专用处理器,最初开发用于加速计算机图形的图像和视频渲染。其主要功能是管理和增强图形性能,特别是在需要高分辨率视觉效果和复杂图形计算的任务中,例如视频游戏或 3D 建模。
随着时间的推移,GPU 超越了最初的目的。由于其架构,GPU 在更广泛的数据处理任务中变得不可或缺。其高效的并行处理能力使其适用于需要同时处理大量数据集的应用。在区块链技术中,GPU 广泛用于加密货币挖矿。由于他们能够比 CPU 更有效地处理加密计算的并行工作负载,因此在这一领域表现优异。
RAM 是计算机的短期内存,存储当前正在使用或处理的数据。这是 CPU “记住” 其当前工作内容并保持相关信息以供快速访问和处理的地方。
错误纠正代码(ECC)RAM 有能力检测和修正常见类型的内部数据损坏。这一特性在数据准确性至关重要的环境中非常重要,例如科学计算、金融交易或区块链节点。ECC RAM 可以自动识别和修复其存储的数据中的小错误。此错误修正过程通过 RAM 模块中的额外硬件进行检查。
非 ECC RAM 是标准计算机和消费设备中使用的更常见类型的内存。尽管它缺乏 ECC RAM 的错误校正能力,但通常较快且成本更低。由于其成本效益和在标准桌面计算中相对较低的数据错误风险,因此非 ECC RAM 在一般使用中更为青睐。
磁盘存储负责长期数据存储,即使计算机关闭时也是如此。磁盘存储主要有两种类型:硬盘驱动器(HDDs)和固态硬盘(SSDs)。
HDDs 是旧式的磁盘驱动器,使用被称为 磁盘片 的磁性盘片来存储数据。磁盘片搭配磁头,通常附在移动的致动臂上。在磁盘旋转期间,这个臂上的读/写头访问数据。由于 HDD 的机械性质——旋转的磁盘和移动的读/写头——使它们相较于 SSD 的速度相对较慢。然而,它们以较低的价格提供了更大的存储容量。这使它们成为大容量存储的成本效益选择。
另一方面,SSD 使用闪存来存储数据。闪存是一种电子的非易失性存储解决方案,可以被擦除和重新编程。使用闪存意味着,与 HDD 不同,它没有移动部件。相反,互联的闪存芯片存储数据。SSD 的读取速度快于 HDD,因为它们能够立即访问数据,而无需等待磁盘旋转或读/写头查找数据。这种速度使 SSD 成为快速数据恢复至关重要的应用的最佳选择。然而,这种速度的代价每 GB 要比 HDD 高。
还有 NVMe(非易失性内存快速通道) SSDs。这些 SSDs 设计用于通过计算机的 外设组件互联快速通道(PCIe) 总线来充分利用其高速潜力。NVMe 驱动器提供显著更高的速度和更低的延迟,尤其适合高频交易和区块链应用等需要快速数据处理和检索的密集工作负载。尽管 NVMe 的价格较高,但它们正在逐步成为高性能计算的标准。
来源:来自 Reddit 的 Gigabyte X570 Elite 示意图的帖子
计算机的主板是一块大型电路板,用于互连并促使计算机各个部分之间的通信。这些部分包括 CPU、GPU、RAM、存储设备以及外围设备如键盘和鼠标。
主板是活动的中心枢纽。它确保每个组件能够有效地相互通信。它还负责电力分配,将电力从电源通道引导到每个主要部件。主板确保每个组件获得其运行所需的适当能量。
主板负责管理系统内的数据流。它监督从 CPU 到 RAM 的数据路由,用于处理,从 RAM 到存储设备的保存,以及从 GPU 到显示输出的视觉呈现。此外,主板还容纳系统的 BIOS(基本输入/输出系统)。BIOS 对于系统控制和监控至关重要。它在启动时初始化并测试计算机的硬件,同时监控系统健康状况,例如温度、电压和风扇速度。
在 Firedancer 的设计上下文中,主板的架构扮演着关键角色。CPU 和 RAM 之间的距离显著影响性能,因为它们之间的较短距离可以提高数据传输速度。这一点在需要高吞吐量和低延迟的应用程序(如 Firedancer)中是至关重要的。这就是为什么 NUMA(非一致性内存访问)意识架构和潜在使用 FPGA 与 Firedancer 在优化内存分配和处理效率方面的需求相一致的原因。我们将在本文后面讨论 NUMA 意识和 FPGA 的含义。
操作系统(OS)是管理计算机中硬件和软件的核心软件。它是一个中介,促进用户与计算机硬件之间的交互。它为用户提供一个与系统交互的界面,并为各种应用分配和管理资源。常见的操作系统示例包括 Windows、macOS 和 Linux。
内核是每个操作系统的核心。它是直接与系统的硬件进行交互的一个关键组件。内核对系统中的所有内容都有完全的控制。它管理内存分配、进程调度和输入/输出请求。通过在此低级别工作,内核在系统的性能和稳定性中发挥着重要作用。
系统调用(Syscalls)提供了用户应用程序与内核之间的接口。当应用程序需要执行一项需要访问系统资源的操作(例如,读取文件或发送网络数据)时,它会发出系统调用。然后,内核代表应用程序执行请求的操作。此机制确保对系统资源的受控访问,以维护系统安全性和稳定性。
虚拟机(VMs)是物理计算机的软件仿真。它们在隔离环境中复制物理计算机的全部功能,同时在一个 hypervisor 之上运行(即创建和管理主机计算机上虚拟环境的一类软件)。虚拟机提供了通过隔离确保安全、资源效率和用于测试和开发的灵活性等优势。
理解这些概念对于 Firedancer 的上下文是至关重要的。Firedancer 采用若干内核级优化来提高性能:
Firedancer 尽量避免系统调用和与操作系统的交互,因为这些操作显著减缓任务的速度。
数据流入和流出是用于描述数据在计算机系统或网络中进出流动的术语。
流入指的是数据进入系统。它是一个通用术语,可能包含多种活动,例如从互联网接收数据、接收用户输入或从物联网(IoT)设备的传感器收集信息。对于服务器或区块链等网络系统,流入涉及关键任务,如接收交易请求、用户查询或需要处理或存储的传入数据流。高效处理流入数据对于系统的响应性和功能至关重要。
流出指的是系统的输出数据。这包括在线发送信息、生成对用户请求的响应或将处理后的数据传输到其他系统。对于网络化系统,流出涉及发送已验证的交易、广播区块链更新或将数据发送到外部存储位置。妥善管理流出数据对于正确传播信息和确保系统与网络其他部分有效沟通至关重要。
将流水线想象成工厂中的装配线。它将复杂的过程分解成更小的顺序阶段。流水线中的每个阶段执行特定的操作。这种方法在重复或连续的处理任务中非常高效,类似于区块链持续处理交易的方式。
数据并行性则采取不同的方法,通过同时但独立地处理多个元素。就像工厂拥有不止一条装配线来处理数据一样。这对于分解成小子任务的任务非常有效。对于特别是在 Firedancer 等系统中,数据并行性对于同时处理交易或数据处理任务至关重要。Firedancer 的并行处理能力最大化了计算吞吐量,并减少了处理时间。
想象流水线的每个阶段是工厂中的一个独立工作站。每个工作站能够独立并行运作。这意味着在处理数据的一部分时,下一阶段可以同时处理另一部分。这种方法允许流水线的多个阶段同时处于活动状态,显著增加吞吐量。Firedancer 将流水线的顺序效率与并行处理能力结合起来,以处理大量交易。
可编程门阵列 (FPGAs) 是一种灵活的集成电路,可在制造后进行编程或重新配置。这些电路提供了传统硬件组件所没有的适应性水平。它们由大量相互连接的可编程逻辑块组成,每个块都能够执行各种数字功能。这种设计使 FPGA 在需要速度、并行处理和适应性的应用中具有高度的灵活性和效率。
典型的 FPGA 由微小的可编程单元组成,所有单元通过可编程连线连接。这种复杂的网络结构使用户可以编程芯片的不同区域以执行特定任务。这创造了一个完全定制的处理环境。
FPGA 在并行处理方面表现优异,利用这些微小的可编程单元同时执行操作。它们的结构促进了高效的流水线处理,其中数据不断通过处理阶段流动。一个优秀设计的流水线将系统的吞吐量脱钩于延迟。尽管此流水线可能比常规 CPU 花费更长时间产生输出,但系统可以同时处理多个输入数据流每个操作的延迟对整体数据流动的影响很小,犹如水流通过水管一样。
在 Firedancer 的上下文中,FPGA 提供了显著的优势。它们可以直接将数据流水线连接到网络。FPGA 在处理网络流量方面更高效,而不是传统搭配 GPU 依赖 CPU 进行数据移动的设置。直接连接以及创建定制处理解决方案的能力(例如在 FPGA 结构上构建软处理器),使其在开发高性能验证节点客户端中变得不可或缺。
- 原文链接: helius.dev/blog/what-is-...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!