LoL赛事- LoL投注- 2025年最佳英雄联盟投注网站万字长文详述TRIDENT: Poseidon 哈希算法的硬件加速与实现!
日期:2025-09-23 15:39 | 人气:
英雄联盟投注,英雄联盟,英雄联盟下注,LOL投注官网,英雄联盟赛事投注,英雄联盟下注,英雄联盟电竞,英雄联盟投注网站,LOL,英雄联盟赛事,LOL投注,LOL赛事下注,LOL投注网站,lol下注平台
Poseidon是一种全新的面向零知识证明(ZKP: Zero-Knowledge Proof)密码学协议设计的哈希算法。相比同类算法,包括经典的SHA-256、SHA-3以及Pedersen哈希函数,在零知识证明的应用场景下,Poseidon能够显著地降低证明生成和验证的计算复杂度,极大地提升零知识证明系统整体的运行效率。基于上述优点,Poseidon目前已被广泛应用在了各种区块链项目当中,包括去中心化存储系统Filecoin、加密货币Mina Protocol和Dusk Network等,主要用于加速其中的零知识证明系统。
为了保证证明算法的通用性,零知识证明通常不会针对某一特定的函数f而设计。如果需要验证上述公式的成立,需要将具体的f函数转换到零知识证明算法所规定的受限表达式系统(Constraint System)当中,这一过程可以理解为“程序编译”, 即将待证明的程序转换成另一种由受限表达式(Constraints)组合成的具备相同功能的程序。例如对于ZK-SNARKs算法,需要将待证函数转换成由特殊的二次多项式R1CS (R1CS: Rank-1 Quadratic Constraints) 组成的程序。而转换后的函数形式也被称为算数电路(Arithmetic Circuit), 证明者和验证者都需要在该电路的基础上进行一系列的算术运算来完成证明生成和验证的工作。
虽然零知识证明能在提供计算完整性验证的同时兼顾隐私的保护, 但其代价是提高了证明生成和验证的计算复杂度。目前,不论对于证明者还是验证者完成一次零知识证明都需要消耗大量计算资源。通常情况下, 证明生成和验证的计算复杂度和待证函数f转换到受限表达式系统后的复杂度, 即转换结果所包含的受限表达式的数量成正比关系。不同待证函数经过“编译”后生成的受限表达式的数量不同, 所需计算的复杂度以及对应的证明生成和验证的时间也有很大的差异。在区块链应用中,待验证的函数通常与某种哈希函数相关。而 TRIDENT 所加速的Poseidon哈希算法对零知识证明做了针对性的优化,使得其对受限表达式系统的适配程度显著优于同类的算法。例如,Poseidon哈希算法转换后所需的受限表达式的数量是同类Pedersen哈希函数的八分之一左右, 这意味着Poseidon完成零知识证明所需的计算量将显著地降低,同时整个零知识证明系统的效率也会得到大幅提升。
Filecoin是基于区块链技术建立的一种去中心化、分布式、开源的云存储网络。其主网络已平稳运行一年,并展现出了高速、低成本和稳定的特点。由于其开源、去中心化的优点,目前Filecoin已经得到了广泛的应用,包括著名的(Wikipedia)已将其网站的数据库存储在Filecoin网络上。在Filecoin中主要有两种角色,分别是用户(Client)和矿工(Miner),其基本的运行机制是:Client发出数据存储或检索的需求并支付文件币,而矿工通过提供存储服务检索服务获得相应的奖励。
与传统的由数据中心提供的云存储服务不同, 任何具备空闲存储资源的设备均可以在Filecoin网络上提供存储服务。因此,为了保证存储服务的质量,Filecoin中分别设计了包括复制证明PoRep(Proof Of Replication)和时空证明PoSt(Proof Of Spacetime)等机制来保证数据存储的完整性和持久性,而这些机制中涉及大量的密码学算法,包括哈希算法SHA-256和Poseidon以及零知识证明zk-SNARK等,需要大量的算力支持。目前这些算法主要是基于GPU实现计算加速,并没有相关开源的FPGA硬件加速方案。
目前,应用最为广泛的Filecoin软件实现是由Protocol Labs基于Go语言编写的Lotus。可以将Lotus理解为用户与整个Filecoin存储网络进行交互的接口。具体来讲,Lotus是一个在Linux操作系统上运行的命令行应用程序,其所提供的功能包括: 1)上传和下载文件;2)将空闲的存储空间出租给其他用户;3)检查计算机存储数据的完整性等。同时,Lotus中提供了用于测试计算机硬件在Filecoin计算负载下性能表现的基准程序Lotus-Bench。
准确地说,Poseidon指的是一类具有相似计算流程的针对零知识证明算法而优化的哈希函数的集合。类比编程语言中面向对象的概念,可以将Poseidon理解成一个哈希函数类, 该类需要若干基本的初始化参数。在应用过程中, 需要通过初始化这些基本参数生成具体的哈希计算实例。而不同参数组合对应的Poseidon实例, 虽然在计算流程上基本相似, 但在安全性、计算量和复杂度等方面都有一定程度上的差异。Poseidon哈希函数类初始化的所需的基本参数为(p, M, t), 由这三个参数可确定一个唯一的哈希计算实例。
对于开发者来说,SpinalHDL通常可以分成两部分: Scala语法和SpinalHDL提供的电路元件抽象。SpinalHDL通过Scala语法中类和函数的形式提供了硬件设计所需的各种基本电路元件的抽象,包括寄存器、逻辑门、多路选择器、译码器和算术运算电路等。而电路设计者所要完成的工作是:基于Scala的语法来描述电路的整体结构,即描述各个基本电路元件之间的连接关系。由于Scala是一门多范式的编程语言,其支持函数式编程、面向对象、递归等高级的语言特性,能够赋予设计者强大的结构建模能力和代码参数化的能力。
本章的第一节提到,SpinalHDL对于开发者来说可以分成Scala语法和SpinalHDL提供的电路元件抽象两部分,而其在电路设计上的优势也主要源于这两方面。从Scala的角度来说,其高级的语言特性,包括函数式编程、面向对象和递归等,能为设计者提供强大的电路建模能力。而从SpinalHDL自身的角度来说,其提供的丰富电路抽象使开发者避免了一些常用电路模块的重复实现,从而能从更高的抽象层次进行电路的描述。下文将详细描述SpinalHDL在电路设计中的四点优势:
SpinalHDL对电路强大的建模和表达要源于Scala所提供的各种丰富的高级语言特性,包括函数式编程、面向对象以及递归等。此外,SpinalHDL自身提供的丰富的电路抽象使开发者能够避免很多底层模块的重复实现,进而从更高的层次构建电路。SpinalHDL中不仅提供了基本的电路元件如信号、逻辑运算符、算数运算符和寄存器等,同时也实现了诸如FIFO、AXI总线、计数器和状态机等较高层级的电路模型。
4.更好的代码复用能力:除了更加强大的电路建模能力外,SpinalHDL还能为硬件设计代码带来更改好的复用性。硬件设计所要处理的问题经常都是高度定制化的,而Verilog中的“parameter”和“localparam”关键字往往不能提供足够的参数化能力,一份代码很难适用于不同的应用场景。而基于SpinalHDL和Scala,开发者可以通过复杂函数的实现和面向对象的语法特性,对电路模型进行更高层次地抽象和参数化设计,从而提升代码的复用能力。
同时Python拥有强大的生态和丰富的开源代码库。使用Cocotb进行硬件设计的验证,可以很方便地复用这些现有的基于Python的算法实现,作为硬件电路的参考模型。例如,在设计深度学习相关的加速器时,可以基于Pytorch、Tensorflow和Caffe等Python库搭建验证用的深度学习算法的参考模型;对于SoC设计中涉及的各种总线协议,如AXI协议等,Cocotb中也提供了相应的开源软件实现;而对于网络协议相关的硬件实现,可以借助Python的网络包数据处理工具Scapy库搭建参考模型。使用Python现有的开源软件包不仅能够极大地减轻搭建参考模型的工作量,同也可降低代码出错的概率。
本次课题研究中使用的硬件开发平台为Xilinx公司最新推出的面向区块链应用的Varium C1100 FPGA 加速卡。整张加速卡的核心是基于Xilinx Virtex UltraScale+架构的FPGA芯片,具体型号为XCU55N-FSVH2892-2L-E。该FPGA芯片配备了丰富的可编程硬件逻辑资源和高速的通讯接口,能够支持区块链应用中各种计算和访存密集型算法的硬件实现。整个FPGA加速板卡的外形如下图所示:
Varium C1100板卡各项详细参数如下表所示。TRIDENT中主要使用到的硬件资源包括:1) LUT和寄存器资源:用于实现加速器电路的基本框架;2)DSP slices:算数运算单元的实现;3) RAM资源:用于存储Poseidon计算中涉及的常数;4)寄存器;4) PCIe接口:实现加速器与服务器主机之间的高速通讯。此外,在开发方式上,C1100板卡既支持基于C/C++语言的Vitis HLS高层次综合工具,也可以在Vivado集成开发环境下使用RTL语言进行硬件设计。
模运算是密码学中核心的数学概念,大部分密码学算法都是建立在模加和模乘的基础之上。相比普通算术运算,模运算最大的特点就是所有的操作数和运算结果都在有限域(Finite Field)内,即不超过模运算所指定的模数。不论是模加还是模乘,基本上所有模运算的实现都可以分成普通算术运算和取余两个步骤。对于模加,首先需要对两个操作数完成一次普通加法运算,然后再将加法结果缩减到模数所规定的范围内,具体的数学定义如下:
其对应的硬件电路结构由两个加法器和一个多路选择器组成,如上图(b)所示,具体数据通路为:输入操作数经过第一个加法器,输出两数之和与进位;两数之和继续输入第二个加法器(2k − p)与相加后得到对应的和与进位;将两次加法的进位进行或运算后,作为多路选择器的选通信号对两次加法的和进行仲裁后输出。上述两种模加的实现方式,均需要两个加/减法器,分别完成加法和取余的计算步骤,然后经过一个多路选择器仲裁后输出。
而不同之处在于仲裁器选通信号的产生方式,第一种算法的选通信号需要通过一个比较器产生,而第二种算法只需要对两次加法的进位进行一次或运算。相比普通的位运算,比较器在电路实现上通常会消耗大量的硬件逻辑资源,同时产生长的组合逻辑路径延迟,对电路的时序性能产生不利的影响。尤其是对于Poseidon中255位的操作数,比较器带来的硬件和时序上的开销对整体模加电路的影响会更加显著。因此,TRIDENT中采用了第二种模加算法进行电路设计。
首先,从普通乘法的角度,Poseidon哈希函数的操作数的位宽为255Bit,而对于高位宽的乘法器电路,如果实现方式不当,通常会消耗大量的逻辑资源,同时对电路的时序性能造成很大的影响。在实际硬件代码编写中,一般不会直接通过乘号实现乘法电路,通常的做法是调用现成的乘法器IP,或者,基于各种优化算法和结构,如Booth编码和华莱士树结构等,在电路级层次自行设计乘法器。TRIDENT项目的实现方式为:将高位宽乘法分解成若干并行的小位宽乘法,小位宽乘法则可以通过Xilinx FPGA DSP模块中嵌入的28*16的乘法器实现。因此,整个255-Bit高位宽乘法器实现的关键在乘法的拆分算法上。
最简单的拆分方式是基于经典的级联算法实现,每次拆分将一个乘法器分解为四个并行的位宽减半的乘法器。对于256-Bit乘法器,经过四次递归的拆分,可通过256个16-Bit的乘法器实现。这种拆分方式虽然实现的电路结构简单规整,但拆分后乘法单元的数量仍然不够理想。TRIDENT中采用了Karatsuba-Ofman算法进行乘法器拆分,这种分解方式虽然在电路结构上相对复杂,并且需要引入额外的加法器,但每次分解只需要三个位宽减半的乘法器,对于256-Bit乘法,三次拆分后总共只需要81个16比特乘法器,大概是普通级联算法的三分之一。Karatusba-Ofman算法定义如下:
上述算法所对应的乘法器拆分结构如下图所示,每次拆分后乘法器位宽减半,但数量上增加两倍,同时需要引入额外的加/减法器。基于递归的思想,图中的三个乘法器还可以不断地进行拆分,直至位宽满足需求。TRIDENT项目中对255比特的乘法器进行了三次拆分,最终分解为27个并行的34-Bit乘法器。而34比特乘法器则通过调用Xilinx提供的乘法器IP实现,每个34比特的乘法器IP由4个DSP模块中乘法器组合而成,因此,一个255-Bit乘法器总共需要消耗108个DSP slices。
上完成,而除法器需要复杂的电路结构同时会消耗大量逻辑资源,对于硬件实现不够友好。因此,大部分模乘电路的设计都采用了优化的取余方式,将除法转换成其他容易在硬件上实现的算术运算。TRIDENT项目中基于Montgomery Reduction算法实现模乘器电路。Montgomery算法的基本思想是通过数域转换的方式,将操作数和运算结果转换到Montgomery域内,在该数域内取余的除法操作可以简化成移位运算。具体的数域转换方式为:当模运算的模数为p时,输入操作数a和b所对应的Montgomery域内的取值为:
由R = 2k 可知,上述算法中2 - 4步的取余和除法操作均可以由移位代替, 而在 R 和 p 固定的情况下步骤3中 p′ 的值可以提前计算,⽽5-6步的取余操作可以通过⼀次加法或减法实现,因此,整个Montgomery模乘算法总共需要完成三次乘法和两次加法/减法。在具体的电路设计中,为了提⾼模乘器性能,TRIDENT采⽤了展开的设计思路,三次乘法运算分别由三个级联的乘法器完成,使得每个周期均可以输出⼀个乘法结果,同时基于
Poseidon哈希算法总共由(RP + RF )次迭代组成,对于Filecoin Poseidon实例,根据中间状态向量大小的不同,总共需要63 - 65次循环。由于硬件资源的限制,设计中不可能将所有循环都在硬件上展开。因此需要基于折叠的思路,即时分复用的方式,在有限的循环单元上完成Poseidon哈希算法的所有迭代。但同时折叠的实现方式会导致计算性能的下降。因此,如何平衡折叠和展开,从而在有限的硬件资源下达到最好的加速性能,是整个硬件设计的难点之一。TRIDENT中设计的硬件加速器总共实现了两个并行的Poseidon迭代单元PoseidonLoop,每个PoseidonLoop都可以完成一次Partial Round或Full Round的计算,而整个PoseidonLoop的数据通路呈环状结构,输入数据在环中不断的流动,直至所有迭代完成后输出。
结果:在 Xilinx提供的XDMA驱动的基础上使用C语言编写简单的性能测试程序。该测试程序向FPGA加速器写入一定数量的输入数据,并记录加速器完成所有数据哈希运算所需要的时间。基于该测试程序,我们分别测试了Poseidon加速器在三种长度输入数据下的性能表现。当输入数据的大小为 arity2, 即中间状态向量元素个数 时,加速器在0.877秒内完成了850000次的哈希运算,数据吞吐率可达到29.1651MB/s, 即每秒大约能够完成1M次哈希运算
TRIDENT项目旨在为Filecoin分布式存储系统中涉及的Poseidon哈希计算实例提供一套完整的FPGA 加速方案。硬件上,我们基于Xilinx Varium C1100 FPGA板卡搭建了一个完整的加速系统,该系统主要由XDMA、FIFO以及Poseidon加速器IP三部分组成,并通过PCIe接口与服务器主机进行数据传输。软件上,我们为Filecoin的具体软件实现Lotus提供了访问底层FPGA加速器的接口,并通过Lotus-Bench对加速器的计算性能进行测试和比较。
整个硬件加速系统的核心模块—Poseidon加速器IP的设计主要可以分成单元运算电路和整体架构两个部分。其中单元运算电路包括255-Bit的模乘和模加,对于模加器,TRIDENT中采用基于加法的取余方式避免了多余的比较器电路开销。对于255-Bit模乘电路,我们基于Karatsuba-Offman算法将高位宽的乘法分解成若干并行的小乘法器实现,同时采用Montgomery Reduction算法将取余过程中复杂的除法运算转换成乘法实现。在加速器架构的设计上,我们针对具体的FPGA硬件资源限制,基于流水线和折叠技术设计了一个串行的Poseidon计算架构。性能表现上,目前FPGA加速器电路能够工作在100MHz并为Filecoin提供两倍于AMD Ryzen 5900X处理器的加速性能。但和 RTX 3070 GPU相比还存在2~3倍的差距,仍然有较大的提升空间。