#hash #proof-of-work #leading-zeros

pow_account

This library generates cryptographic hashes with a second round of hashing to produce configurable leading zeros for proof-of-work or validation

4 releases

0.2.1 Nov 19, 2024
0.2.0 Nov 19, 2024
0.1.1 Oct 13, 2024
0.1.0 Oct 13, 2024

#227 in Authentication

Download history 266/week @ 2024-10-10 32/week @ 2024-10-17 213/week @ 2024-11-14 66/week @ 2024-11-21 1/week @ 2024-11-28

280 downloads per month

MIT license

18KB
170 lines

POW Account

This library generates a cryptographic hash and performs a second round of hashing to produce a hash with a configurable number of leading zeros. It is designed for applications requiring proof-of-work-like functionality or hash-based validation with adjustable difficulty.

The algorithm of work

The sequence diagram below shows the high-level algorithm of client-server interaction.

sequenceDiagram
    autonumber
    participant c as Client
    participant s as Server

    c ->> c: Generate an origin hash for a target hash with N leading zeros
    c ->> s: Send a request
    s ->> s: Calculates the target hash and checks the number of leading zeros

    alt Correct Target Hash
      s ->> c: Return a response
    else Insufficient number of Leading Zeros
      s ->> c: Return an error
    end

Step 1. A Client generates an origin hash for a target hash that starts with a particular number of zeros. The required number of zeros is defined by the Server.

Step 2. A Client sends the request to the Server (for instance, to get an Auth Token).

Step 3. A Server calculates the target hash and checks if the target hash starts with the proper number of leading zeros.

Step 4. A Server returns a successful response if the number of leading zeros is correct, otherwise returns an error.

Installation

To install the library from your app folder run:

cargo add pow_account

Add required dependencies

cargo add blake2
cargo add hex

Or clone the repository to your app folder and add the following to your Cargo.toml:

[dependencies]
pow_account = { path = "../path/to/pow_account" }
blake2 = "0.10.6"
hex = "0.4.3"

Usage

Here's a brief overview of how to use the library:

Importing the Library

use pow_account::HashFinder;

Generating an Origin Hash for a Target Hash with a default number of Leading Zeros

If you want to generate an origin hash for a target hash with the default number of leading zeros (which is 20 bits or 5 leading zeros), you can do so like this:

use pow_account::HashFinder;

let origin_hash = HashFinder::default().find();
let origin_hash_hex = hex::encode(origin_hash);
println!("Generated origin hash: {}", origin_hash_hex);

Generating an Origin Hash for a Target Hash with a specified number of Leading Zeros

You can create a new HashFinder instance with a specified number of leading zeros and generate an origin hash as follows:

use pow_account::HashFinder;

let origin_hash = HashFinder::new(4).find();
let origin_hash_hex = hex::encode(origin_hash);
println!("Generated origin hash: {}", origin_hash_hex);

This will generate an origin hash for a Target Hash that starts with 4 leading zeros.

Checking that the Target Hash starts with a required number of Leading Zeros

You can check the number of leading zeros for a hash as following:

use pow_account::HashFinder;

let origin_hash = HashFinder::default().find();
let origin_hash_hex = hex::encode(origin_hash);

// Default number of leading zeros
if let Ok(match_result) = HashFinder::default().check(origin_hash_hex) {
    ...
}

let origin_hash = HashFinder::new(4).find();
let origin_hash_hex = hex::encode(origin_hash);

// Custom number of leading zeros
if let Ok(match_result) = HashFinder::new(4).check(origin_hash_hex) {
    ...
}

This will generate an origin hash for a target hash that starts with 4 leading zeros.

Example

Here’s a complete example demonstrating how to generate an origin hash and validate it:

use blake2::{Blake2s256, Digest};
use pow_account::HashFinder;

fn main() {
    // 1. Generating the origin hash (client side)
    let origin_hash = HashFinder::new(4).find();

    // This origin_hash_hex String is the one to be sent to the Server
    let origin_hash_hex = hex::encode(origin_hash);

    // 2. Calculating the target hash (server side)
    let mut hasher = Blake2s256::new();
    hasher.update(&origin_hash);
    let target_hash: [u8; 32] = hasher.finalize().into();

    // This is the target hash that should be started with a specified number of leading zeros
    let target_hash_hex = hex::encode(target_hash);

    assert!(target_hash_hex.starts_with("0000"));
    println!("Generated hash with 4 leading zeros: {}", target_hash_hex);

    // 3. Calculate the taget hash and check that it starts with 4 zeros
    if let Ok(match_result) = HashFinder::new(4).check(origin_hash_hex) {
        println!("Result of match: {}", match_result);

        // 4. Process the result of the match
        match match_result {
            true => {
                // Correct Target Hash
            }
            false => {
                // Insufficient number of Leading Zeros
            }
        }
    }
}

Running Tests

To run the tests included with this library, use the following command in the root directory of your library:

cargo test

Contributing

Contributions are welcome! Please feel free to submit a pull request or open an issue for any suggestions or improvements.

License

This library is licensed under the MIT License. See the LICENSE file for more details.

Dependencies

~760KB
~15K SLoC