Add blockchain example

relax type bounds on struct definition
This commit is contained in:
Andrew Dirksen 2019-05-17 09:17:27 -07:00
parent b3175a79b1
commit 75bafcf99a
4 changed files with 25 additions and 4 deletions

View file

@ -1,6 +1,6 @@
[package] [package]
name = "pow" name = "pow"
version = "0.1.4" version = "0.1.5"
authors = ["Andrew Dirksen <andrew@dirksen.com>"] authors = ["Andrew Dirksen <andrew@dirksen.com>"]
description = """ description = """
Generate or verify sha256 based proofs of work over arbitrary typed data. Generate or verify sha256 based proofs of work over arbitrary typed data.

View file

@ -30,6 +30,16 @@ let pw = Pow::prove_work(&now, difficulty).unwrap();
assert!(pw.score(&now).unwrap() >= difficulty); assert!(pw.score(&now).unwrap() >= difficulty);
``` ```
Define a blockchain block.
```rust
struct Block<T> {
prev: [u8; 32], // hash of last block
payload: T, // generic data
proof_of_work: Pow<([u8; 32], T)>,
}
```
# Score scheme # Score scheme
To score a proof of work for a given (target, Pow) pair: To score a proof of work for a given (target, Pow) pair:

View file

@ -33,7 +33,18 @@
//! let pw = Pow::prove_work(&now, difficulty).unwrap(); //! let pw = Pow::prove_work(&now, difficulty).unwrap();
//! assert!(pw.score(&now).unwrap() >= difficulty); //! assert!(pw.score(&now).unwrap() >= difficulty);
//! ``` //! ```
//!
//! Define a blockchain block.
//!
//! ```rust
//! # use pow::Pow;
//! struct Block<T> {
//! prev: [u8; 32], // hash of last block
//! payload: T, // generic data
//! proof_of_work: Pow<([u8; 32], T)>,
//! }
//! ```
//!
//! # Score scheme //! # Score scheme
//! //!
//! To score a proof of work for a given (target, Pow) pair: //! To score a proof of work for a given (target, Pow) pair:
@ -91,7 +102,7 @@
//! let m = u128::max_value(); //! let m = u128::max_value();
//! if difficulty == m { //! if difficulty == m {
//! return m; //! return m;
//! } //! }
//! m / (m - difficulty) //! m / (m - difficulty)
//! } //! }
//! ``` //! ```

View file

@ -6,7 +6,7 @@ const SALT: &str = "35af8f4890981391c191e6df45b5f780812ddf0213f29299576ac1c98e18
/// Proof of work over concrete type T. T can be any type that implements serde::Serialize. /// Proof of work over concrete type T. T can be any type that implements serde::Serialize.
#[derive(Serialize, Deserialize, PartialEq, Clone, Copy, Debug)] #[derive(Serialize, Deserialize, PartialEq, Clone, Copy, Debug)]
pub struct Pow<T: Serialize> { pub struct Pow<T> {
proof: u128, proof: u128,
_spook: PhantomData<T>, _spook: PhantomData<T>,
} }