2个不稳定版本
0.5.0 | 2023年10月28日 |
---|---|
0.4.0 | 2023年10月14日 |
9 in #proof-of-work
401 monthly downloads
用于 2 crates
20KB
260 行
注意:所有版本低于0.3.1都产生损坏的PoW,升级到最新版本
mcaptcha_pow_sha256是robkorn的
pow_sha256
的副本,它是对pow
库的修改版本。所有版权均归原作者所有。
Rust包,用于在可序列化数据类型上生成SHA256 Proof of Work。
无论是与区块链相关项目还是类似于Hashcash的方案,此包都可以用来证明在给定的可序列化输入上已经完成了工作。输入只需要实现serde::Deserialize
即可使用。
这是对pow
库(由@robkorn)的一个分支,增加了一些新的功能。其中最重要的包括
- PoW数据类型现在提供了一个构造函数
- 盐值不再硬编码到库中,用户可以提供唯一的盐值。
还包括了一些其他各种重要性的小改动,主要是为了改进风格和易用性。
文档
https://docs.rs/mcaptcha_pow_sha256
示例
证明针对特定短语的特定工作。
use mcaptcha_pow_sha256::{ConfigBuilder, PoW};
fn main() {
let config = ConfigBuilder::default()
.salt("myrandomsaltisnotlongenoug".into())
.build()
.unwrap();
let phrase = "ironmansucks";
const DIFFICULTY: u32 = 1000;
let work = config.prove_work(&phrase, DIFFICULTY).unwrap();
assert!(config.calculate(&work, &phrase).unwrap() >= DIFFICULTY);
assert!(config.is_valid_proof(&work, &phrase));
assert!(config.is_sufficient_difficulty(&work, DIFFICULTY));
}
证明更困难的工作。这次针对时间。
// Greater difficulty this time around. Takes around 100,000 hashes
// to find a nonce of the correct difficulty.
use mcaptcha_pow_sha256::{ConfigBuilder, PoW};
fn main() {
let config = ConfigBuilder::default()
.salt("myrandomsaltisnotlongenoug".into())
.build()
.unwrap();
let phrase = "ironmansucks";
const DIFFICULTY: u32 = 100_000;
let work = config.prove_work(&phrase, DIFFICULTY).unwrap();
assert!(config.calculate(&work, &phrase).unwrap() >= DIFFICULTY);
assert!(config.is_valid_proof(&work, &phrase));
assert!(config.is_sufficient_difficulty(&work, DIFFICULTY));
}
哈希方案
SALT
用作前缀,以防止Proof of Work在诸如Proof of Work区块链之类的其他系统中重复使用。
对以下内容进行SHA256计算:
- SALT
- 序列化输入
T
- nonce
将结果哈希的前16个字节解释为128位无符号整数,并保存为最终结果。
选择难度设置。
根据您的用例,通常最好像比特币那样动态设置难度设置。
但是,如果您的用例需要手动设置,那么自己设置一个也很简单。一种方法是使用此函数选择期望的平均哈希数
fn get_difficulty(average: u128) -> u128 {
debug_assert_ne!(average, 0, "It is impossible to prove work in zero attempts.");
let m = u128::max_value();
m - m / average
}
相反,我们可以使用相同的方程来计算满足给定难度所需的预期哈希数
fn est_average(difficulty: u128) -> u128 {
let m = u128::max_value();
if difficulty == m {
return m;
}
m / (m - difficulty)
}
变更日志
请参阅 CHANGELOG.md
许可证
本项目受Apache License Version 2.0
或MIT许可证
双重许可。
资金
NLnet
2023年的开发资金通过NGI0 Entrust基金,由NLnet提供。更多详情请参阅此处。
依赖项
约3.5MB
约83K SLoC