4个版本
0.3.17 | 2024年6月13日 |
---|---|
0.3.16 | 2024年6月12日 |
0.3.15 | 2024年6月11日 |
0.3.14 | 2024年6月11日 |
#480 in 算法
251 每月下载量
140KB
2.5K SLoC
SpectreX
SpectreX是一个通用的CPU挖矿算法库,由Spectre On Rust全节点守护进程使用。
概述
SpectreX具有基于Burrows-Wheeler变换(BWT)的证明工作(PoW)系统AstroBWTv3算法,该版本完全使用Rust编写,不依赖于任何外部C库,仅依赖于各种Rust包。
散列函数
证明工作计算涉及一系列顺序散列函数以形成最终散列
- 步骤1:计算输入数据的sha256。
- 步骤2:使用Salsa20扩展数据。
- 步骤3:根据步骤2的输出使用RC4加密数据。
- 步骤4:计算步骤3的结果的初始FNV-1a散列。
- 步骤5:对步骤4的数据应用基于RC4流加密的分支循环。
- 步骤6:使用步骤5的结果构建和排序后缀数组。
- 步骤7:计算步骤6的数据的最终sha256。
改进
原始算法使用了SA-IS排序算法。存在一个增强的SACA-K算法,用于诱导排序,将线性时间复杂度改进为常数字母集的就地版本。然而,这仍然是单核版本。《a href="https://ieeexplore.ieee.org/document/8371211" rel="noopener ugc nofollow">pSACAK算法提供了一种快速、线性时间、就地并行解决方案,利用多核机器。然而,测试表明它仍然需要优化。它与原始AstroBWTv3后缀数组完全兼容。
我们的AstroBWTv3实现使用cdivsufsort
,因为它是仍然最快的单线程后缀数组构建实现。
有许多机会可以增强AstroBWTv3散列的计算,包括
- 用CPU上的高度优化的内联汇编代码替换大多数步骤。
- 将后缀数组分区并将排序卸载到GPU上,以显着提高性能。
我们鼓励开发人员优化单个计算步骤,以随着时间的推移改进算法并成熟代码库。
使用
要将 SpectreX 包含到项目依赖中,只需运行以下命令:cargo add spectrex
。下面是一个简单的示例
use spectrex::astrobwtv3;
fn main() {
let hash_in: [u8; 32] = [88, 101, 183, 41, 212, 156, 190, 48, 230, 97, 94, 105, 177, 86, 88, 84, 60, 239, 203, 124, 63, 32, 160, 222, 34, 141, 50, 108, 138, 16, 90, 230];
let hash_out = astrobwtv3::astrobwtv3_hash(&hash_in);
println!("hash_out: {:?}", hash_out);
}
测试
下面是一个基本的计算测试,旨在确保在不同字节序下计算出的散列值的准确性。您可以使用以下命令执行它:cargo test
,测试成功完成后,将显示以下输出
running 1 test
test astrobwtv3_hash_10 ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.54s
基准测试
包含了一个简单的计算基准测试,使用Criterion。这个基准测试有助于验证如果有任何计算步骤被修改,性能是否有所改进或下降。您可以使用以下命令运行它:cargo bench
,它将返回以下结果
astrobwtv3 time: [8.8912 ms 9.0648 ms 9.2387 ms]
change: [-7.8592% -4.5050% -1.1622%] (p = 0.01 < 0.05)
Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
4 (4.00%) high mild
依赖项
~0.9–1.2MB
~26K SLoC