#pow #sha-256 #proof-of-work #mcaptcha #captcha

mcaptcha_pow_sha256

在mCaptcha中使用的任何可序列化数据类型上的SHA256 PoW

2个不稳定版本

0.5.0 2023年10月28日
0.4.0 2023年10月14日

9 in #proof-of-work

Download history 74/week @ 2024-03-11 37/week @ 2024-03-18 28/week @ 2024-03-25 83/week @ 2024-04-01 19/week @ 2024-04-08 48/week @ 2024-04-15 22/week @ 2024-04-22 19/week @ 2024-04-29 24/week @ 2024-05-06 23/week @ 2024-05-13 31/week @ 2024-05-20 23/week @ 2024-05-27 289/week @ 2024-06-03 27/week @ 2024-06-10 33/week @ 2024-06-17 49/week @ 2024-06-24

401 monthly downloads
用于 2 crates

MIT/Apache

20KB
260

PoW-SHA256

PoW-SHA256 - 基于SHA256的Proof-of-Work

status-badge

注意:所有版本低于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.0MIT许可证双重许可。

资金

NLnet

NLnet NGIZero logo

2023年的开发资金通过NGI0 Entrust基金,由NLnet提供。更多详情请参阅此处

依赖项

约3.5MB
约83K SLoC