本版本代码是基于 Rust 语言版本 Neptune 和 Rust 实现 ff 改造而来的,所使用的的参数和 lotus
项目中的 PC2
算法完全一样。
本文中所使用的的常量数据是动态生成的,但是,对输入数据的长度有一些要求:输入数据以 Fr
元素为单位,每一个 Fr
的大小是 32
字节(4
个 uint64_t
数据),并且输入数据的长度(以 Fr
为单位)只能是 2
、4
、8
、16
、24
、36
和 11
之一。
本文所使用的开发环境是 Visual Studion 2015 Enterprise
,并且是基于 x64
架构进行开发,若要编译此项目,请在 Windows
上使用 VS2015
或更高版本的 VS
打开本目录下的 *.sln
文件(若无法打开,则可以自己使用 VS
新建一个基于 x64
空项目,然后把这部分代码添加进去就可以编译运行)。
本文涉及一个叫做 arity
的概念,也就是 树(tree)
这种数据结构的度,通俗的讲就是说,二叉树的 arity
是 2
、八叉树的 arity
是 8
。
本项目中包含两种实现方式:Naive
版(本项目对应 PoseidonHashV2Naive
函数) 和 StaticOptimized
版本(本项目中对应 PoseidonHashV2Ex
函数),分别对应 neptune
项目中的 hash_correct
和 hash_optimized_static
的实现,前者比较简单,只需要两部分常量: RoundConstant
和 mds
矩阵,后者还需要更多的常量,主要是为了加速算法,把部分计算提前,具体内容请看代码。
注: 对于 Fr
的理解,就姑且认为它是 Field Representation
的缩写,其实就是一个大整数。
这里所说的 benchmark 测试只是为了测试代码的正确性,而不是测试代码的性能,目前的代码仅适用于学习,不适合实际适用,因为目前暂时还没有考虑性能问题。
本文目录下已经生成了几组测试数据,在本文同目录下的 test_case_ref
文件夹内,对于不同的 arity
的对应不同的测试文件,每个测试文件对应一种 arity
,每个测试文件中包含了 1万个随机测试样例(使用 neptune
项目中的代码随机生成的测试样例),可以调用本项目中的 main.c
文件中的 TestBenchPoseidon()
函数进行测试。
本项目仅适用于学习和理解 lotus
项目中的 PC2
算法的具体底层实现原理。
本文来自于微信群 Filecoin技术交流-1/2/3/4/5/6群
群主(TEARS
)出品,详细信息请查看 【Filecoin 中国社区论坛】。
如有任何问题,请在微信群 Filecoin技术交流-1/2/3/4/5/6群
中讨论。