本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品——TRIDENT: Poseidon哈希算法的硬件实现与加速。该项目基于Xilinx Varium C1100 FPGA加速卡,为 Filecoin 区块链应用中的Poseidon哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT基于 SpinalHDL 设计了Poseidon加速器 IP 并基于 Vivado中Block Design 工具搭建完整的FPGA硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为Filecoin应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从Poseidon哈希算法概述、基于SpinalHDL和Cocotb的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个TRIDENT项目进行详细的介绍。
引言
Poseidon是一种全新的面向零知识证明(ZKP: Zero-Knowledge Proof)密码学协议设计的哈希算法。相比同类算法,包括经典的SHA-256、SHA-3以及Pedersen哈希函数,在零知识证明的应用场景下,Poseidon能够显著地降低证明生成和验证的计算复杂度,极大地提升零知识证明系统整体的运行效率。基于上述优点,Poseidon目前已被广泛应用在了各种区块链项目当中,包括去中心化存储系统Filecoin、加密货币Mina Protocol和Dusk Network等,主要用于加速其中的零知识证明系统。
0.1 Poseidon与零知识证明
零知识证明(ZKP: Zero-Knowledge Proof)是一类用于验证计算完整性(Computational Integrity)的密码学协议。其基本的思想是: 使证明者(Prover)能够在不泄露任何有效信息的情况下向验证者(Verifier)证明某个计算等式(Computational Statement)的成立。一个具体的证明对象可以表示为如下形式:
f = (x, w)
其中f代表某个函数或程序, x代表该函数中公开的输入, w表示需要保密的函数输入,即只有证明者知晓。在零知识证明系统下, 证明者能够在不泄露w的情况下向验证者证明该等式的成立。由以上描述可见,零知识证明最显著的特点也是其最大的优势在于隐私保护性,证明者可以在不泄露任何重要私密信息的情况下完成对某个函数或程序的计算结果的证明。
由于零知识证明能够兼顾计算完整性证明和隐私保护, 其具备广泛的应用场景, 具体包括匿名线上拍卖、匿名电子投票、云数据库SQL查询验证、去中心化数据存储系统等。尤其是在区块链和加密货币领域,零知识证明凭借其出色的隐私保护特性, 近年来获得了大量开发者和设计者的青睐, 包括加密货币Zcash和Pinocchio以及分布式存储系统Filecoin等在其设计中都采用了ZK-SNARK零知识证明算法。
为了保证证明算法的通用性,零知识证明通常不会针对某一特定的函数f而设计。如果需要验证上述公式的成立,需要将具体的f函数转换到零知识证明算法所规定的受限表达式系统(Constraint System)当中,这一过程可以理解为“程序编译”, 即将待证明的程序转换成另一种由受限表达式(Constraints)组合成的具备相同功能的程序。例如对于ZK-SNARKs算法,需要将待证函数转换成由特殊的二次多项式 R1CS (R1CS: Rank-1 Quadratic Constraints) 组成的程序。而转换后的函数形式也被称为算数电路(Arithmetic Circuit), 证明者和验证者都需要在该电路的基础上进行一系列的算术运算来完成证明生成和验证的工作。
虽然零知识证明能在提供计算完整性验证的同时兼顾隐私的保护, 但其代价是提高了证明生成和验证的计算复杂度。目前,不论对于证明者还是验证者完成一次零知识证明都需要消耗大量计算资源。通常情况下, 证明生成和验证的计算复杂度和待证函数f转换到受限表达式系统后的复杂度, 即转换结果所包含的受限表达式的数量成正比关系。不同待证函数经过“编译”后生成的受限表达式的数量不同, 所需计算的复杂度以及对应的证明生成和验证的时间也有很大的差异。在区块链应用中,待验证的函数通常与某种哈希函数相关。而 TRIDENT 所加速的Poseidon哈希算法对零知识证明做了针对性的优化,使得其对受限表达式系统的适配程度显著优于同类的算法。例如,Poseidon哈希算法转换后所需的受限表达式的数量是同类Pedersen哈希函数的八分之一左右, 这意味着Poseidon完成零知识证明所需的计算量将显著地降低,同时整个零知识证明系统的效率也会得到大幅提升。
0.2 Filecoin分布式存储网络
TRIDENT项目中实现的Poseidon加速器主要针对的是应用在Filecoin分布式存储网络中的Poseidon哈希计算实例。Filecoin在提供存储服务过程中需要对数据进行Poseidon哈希运算,这一计算过程需要消耗大量的算力,是整个Filecoin系统运行的性能瓶颈之一。
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。
TRIDENT项目在Poseidon加速电路的基础上,为Lotus提供了访问底层FPGA硬件加速器的软件接口,进而通过Lotus-Bench对加速器的计算性能进行了测试和比较。
Poseidon哈希算法概述
1.1Poseidon参数
准确地说,Poseidon指的是一类具有相似计算流程的针对零知识证明算法而优化的哈希函数的集合。类比编程语言中面向对象的概念,可以将Poseidon理解成一个哈希函数类, 该类需要若干基本的初始化参数。在应用过程中, 需要通过初始化这些基本参数生成具体的哈希计算实例。而不同参数组合对应的Poseidon实例, 虽然在计算流程上基本相似, 但在安全性、计算量和复杂度等方面都有一定程度上的差异。Poseidon哈希函数类初始化的所需的基本参数为(p, M, t), 由这三个参数可确定一个唯一的哈希计算实例。
在这三个基本参数的基础上,可计算出其他与Poseidon计算流程相关的参数,包括:
对于TRIDENT所要加速的Filecoin Poseidon计算实例,各个参数的取值如下:
其中参数的16进制表达式为:
p=0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
参数p的实际位宽为255位,哈希函数中的所有算术运算操作均在p确定的有限域内完成,即所有的算术运算均是模数为p的模运算,包括255-bit模加和255-bit模乘;同时,参数p还确定了S-Box阶段模幂运算的指数α=5 ;
Filecoin Poseidon实例的参数t ∈ {3, 5, 9, 12},即Poseidon实例计算的中间状态可以包含3、5、9或12个有限域元素;
Filecoin Poseidon实例的安全等级M=128 Bits,安全等级M和参数P共同确定了Full Round迭代次数RF=8以及Partial Round迭代次数RP ∈ {55, 56, 57,