Added hashing result to PoW struct
This commit is contained in:
parent
7654f2722e
commit
c1ec5d2a68
1 changed files with 11 additions and 7 deletions
|
@ -2,12 +2,13 @@ use serde::{Deserialize, Serialize};
|
||||||
use sha2::{digest::FixedOutput, Digest, Sha256};
|
use sha2::{digest::FixedOutput, Digest, Sha256};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
|
||||||
const SALT: &str = "35af8f4890981391c191e6df45b5f780812ddf0213f29299576ac1c98e18173e";
|
const SALT: &str = "79ziepia7vhjgviiwjhnend3ofjqocsi2winc4ptqhmkvcajihywxcizewvckg9h6gs4j83v9";
|
||||||
|
|
||||||
/// 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> {
|
pub struct Pow<T> {
|
||||||
proof: u128,
|
nonce: u128,
|
||||||
|
result: u128,
|
||||||
_spook: PhantomData<T>,
|
_spook: PhantomData<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,11 +37,14 @@ impl<T: Serialize> Pow<T> {
|
||||||
pub fn prove_work_serialized(prefix: &[u8], difficulty: u128) -> Pow<T> {
|
pub fn prove_work_serialized(prefix: &[u8], difficulty: u128) -> Pow<T> {
|
||||||
let prefix_sha = Sha256::new().chain(SALT).chain(prefix);
|
let prefix_sha = Sha256::new().chain(SALT).chain(prefix);
|
||||||
let mut n = 0;
|
let mut n = 0;
|
||||||
while score(prefix_sha.clone(), n) < difficulty {
|
let mut result = 0;
|
||||||
|
while result < difficulty {
|
||||||
n += 1;
|
n += 1;
|
||||||
|
result = score(prefix_sha.clone(), n);
|
||||||
}
|
}
|
||||||
Pow {
|
Pow {
|
||||||
proof: n,
|
nonce: n,
|
||||||
|
result: result,
|
||||||
_spook: PhantomData,
|
_spook: PhantomData,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,14 +59,14 @@ impl<T: Serialize> Pow<T> {
|
||||||
/// Calculate the pow score of an already serialized T and self.
|
/// Calculate the pow score of an already serialized T and self.
|
||||||
/// The input is assumed to be serialized using network byte order.
|
/// The input is assumed to be serialized using network byte order.
|
||||||
pub fn score_serialized(&self, target: &[u8]) -> u128 {
|
pub fn score_serialized(&self, target: &[u8]) -> u128 {
|
||||||
score(Sha256::new().chain(SALT).chain(target), self.proof)
|
score(Sha256::new().chain(SALT).chain(target), self.nonce)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn score(prefix_sha: Sha256, proof: u128) -> u128 {
|
fn score(prefix_sha: Sha256, nonce: u128) -> u128 {
|
||||||
first_bytes_as_u128(
|
first_bytes_as_u128(
|
||||||
prefix_sha
|
prefix_sha
|
||||||
.chain(&proof.to_be_bytes()) // to_be_bytes() converts to network endian
|
.chain(&nonce.to_be_bytes()) // to_be_bytes() converts to network endian
|
||||||
.fixed_result()
|
.fixed_result()
|
||||||
.as_slice(),
|
.as_slice(),
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue