Compare commits
28 commits
update-dep
...
master
Author | SHA1 | Date | |
---|---|---|---|
e761db1532 | |||
024abe6204 | |||
|
99dc1d3b0e | ||
|
b4be9ef6fa | ||
43f05abdbf | |||
|
aff58f02de | ||
7c986a00cb | |||
|
0ad175708b | ||
7398ee4b73 | |||
|
7559663bee | ||
112d7e8f93 | |||
e9037ff79e | |||
|
856500bd0b | ||
f3ff4d4467 | |||
7fd887221f | |||
|
c363d1e517 | ||
|
e2f3f789a6 | ||
|
cc954a674c | ||
7df7b619a0 | |||
|
af1138b457 | ||
bde6da08e9 | |||
927b3e449b | |||
12d7533339 | |||
0e96f03166 | |||
debd7805d0 | |||
05048711a3 | |||
9fe4d52f47 | |||
94347b781c |
10 changed files with 233 additions and 92 deletions
4
.github/workflows/linux.yml
vendored
4
.github/workflows/linux.yml
vendored
|
@ -42,7 +42,7 @@ jobs:
|
|||
uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: check
|
||||
args: --all --bins --examples --tests
|
||||
args: --all --bins --examples --tests --all-features
|
||||
|
||||
- name: tests
|
||||
uses: actions-rs/cargo@v1
|
||||
|
@ -56,7 +56,7 @@ jobs:
|
|||
uses: actions-rs/tarpaulin@v0.1
|
||||
with:
|
||||
version: '0.15.0'
|
||||
args: '-t 1200'
|
||||
args: '-t 1200 --all-features'
|
||||
|
||||
- name: Upload to Codecov
|
||||
if: matrix.version == 'stable' && (github.ref == 'refs/heads/master' || github.event_name == 'pull_request')
|
||||
|
|
31
CHANGELOG.md
31
CHANGELOG.md
|
@ -1,22 +1,39 @@
|
|||
# Changelog
|
||||
|
||||
## 0.5.0
|
||||
|
||||
### Added
|
||||
|
||||
- `stepped_prove_work_serialized` sends notifications after every few hash
|
||||
computations.
|
||||
|
||||
## 0.4.0
|
||||
|
||||
### Changed
|
||||
|
||||
Rename crate from `pow_sha256` to `mcaptcha_pow_sha256`
|
||||
|
||||
## 0.2.1
|
||||
|
||||
### Changed
|
||||
- performance improvement: internally `get_difficulty` was being called
|
||||
multiple times while generating `PoW`, now it calls only once.
|
||||
|
||||
- performance improvement: internally `get_difficulty` was being called
|
||||
multiple times while generating `PoW`, now it calls only once.
|
||||
|
||||
### Fixed
|
||||
- encoding and decoding configuration used internally was causing an
|
||||
error in `PoW` computation
|
||||
|
||||
- encoding and decoding configuration used internally was causing an
|
||||
error in `PoW` computation
|
||||
|
||||
## 0.2.0
|
||||
|
||||
### Changed
|
||||
- Difficulty factor is now an unsigned 32 bit number
|
||||
|
||||
- Difficulty factor is now an unsigned 32 bit number
|
||||
|
||||
## 0.1
|
||||
|
||||
### Added:
|
||||
- PoW constructor
|
||||
- unique salt
|
||||
|
||||
- PoW constructor
|
||||
- unique salt
|
||||
|
|
122
Cargo.lock
generated
122
Cargo.lock
generated
|
@ -53,9 +53,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "darling"
|
||||
version = "0.14.4"
|
||||
version = "0.20.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
|
||||
checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1"
|
||||
dependencies = [
|
||||
"darling_core",
|
||||
"darling_macro",
|
||||
|
@ -63,58 +63,58 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "darling_core"
|
||||
version = "0.14.4"
|
||||
version = "0.20.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
|
||||
checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120"
|
||||
dependencies = [
|
||||
"fnv",
|
||||
"ident_case",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"strsim",
|
||||
"syn 1.0.109",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darling_macro"
|
||||
version = "0.14.4"
|
||||
version = "0.20.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
|
||||
checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178"
|
||||
dependencies = [
|
||||
"darling_core",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_builder"
|
||||
version = "0.12.0"
|
||||
version = "0.20.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8"
|
||||
checksum = "cd33f37ee6a119146a1781d3356a7c26028f83d779b2e04ecd45fdc75c76877b"
|
||||
dependencies = [
|
||||
"derive_builder_macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_builder_core"
|
||||
version = "0.12.0"
|
||||
version = "0.20.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f"
|
||||
checksum = "7431fa049613920234f22c47fdc33e6cf3ee83067091ea4277a3f8c4587aae38"
|
||||
dependencies = [
|
||||
"darling",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_builder_macro"
|
||||
version = "0.12.0"
|
||||
version = "0.20.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e"
|
||||
checksum = "4abae7035bf79b9877b779505d8cf3749285b80c43941eda66604841889451dc"
|
||||
dependencies = [
|
||||
"derive_builder_core",
|
||||
"syn 1.0.109",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -155,11 +155,22 @@ version = "0.2.149"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b"
|
||||
|
||||
[[package]]
|
||||
name = "mcaptcha_pow_sha256"
|
||||
version = "0.5.0"
|
||||
dependencies = [
|
||||
"bincode",
|
||||
"derive_builder",
|
||||
"num",
|
||||
"serde",
|
||||
"sha2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num"
|
||||
version = "0.4.1"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-complex",
|
||||
|
@ -171,11 +182,10 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.4"
|
||||
version = "0.4.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
|
||||
checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
"serde",
|
||||
|
@ -183,9 +193,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "num-complex"
|
||||
version = "0.4.4"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214"
|
||||
checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495"
|
||||
dependencies = [
|
||||
"num-traits",
|
||||
"serde",
|
||||
|
@ -193,19 +203,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "num-integer"
|
||||
version = "0.1.45"
|
||||
version = "0.1.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
|
||||
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.43"
|
||||
version = "0.1.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
|
||||
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
|
@ -214,11 +223,10 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "num-rational"
|
||||
version = "0.4.1"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
"serde",
|
||||
|
@ -226,60 +234,49 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.17"
|
||||
version = "0.2.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c"
|
||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pow_sha256"
|
||||
version = "0.3.1"
|
||||
dependencies = [
|
||||
"bincode",
|
||||
"derive_builder",
|
||||
"num",
|
||||
"serde",
|
||||
"sha2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.69"
|
||||
version = "1.0.85"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
|
||||
checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.33"
|
||||
version = "1.0.36"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
||||
checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.189"
|
||||
version = "1.0.210"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537"
|
||||
checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.189"
|
||||
version = "1.0.210"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5"
|
||||
checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.38",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -295,26 +292,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.10.0"
|
||||
version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.109"
|
||||
version = "2.0.66"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.38"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
|
||||
checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
12
Cargo.toml
12
Cargo.toml
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "pow_sha256"
|
||||
version = "0.3.1"
|
||||
name = "mcaptcha_pow_sha256"
|
||||
version = "0.5.0"
|
||||
authors = [ "Aravinth Manivannan <realaravinth@bastsense.net>", "Robert Kornacki <robk@syre.io>"]
|
||||
description = """
|
||||
SHA256 PoW on any serializable datatype used in mCaptcha
|
||||
|
@ -9,7 +9,7 @@ edition = "2021"
|
|||
keywords = ["mCaptcha", "PoW", "sha256", "proof-of-work"]
|
||||
readme = "README.md"
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://git.batsense.net/mCaptcha/pow_sha256"
|
||||
repository = "https://git.batsense.net/mCaptcha/mcaptcha_pow_sha256"
|
||||
categories = ["captcha", "algorithms", "cryptography::cryptocurrencies"]
|
||||
|
||||
|
||||
|
@ -17,5 +17,9 @@ categories = ["captcha", "algorithms", "cryptography::cryptocurrencies"]
|
|||
sha2 = "0.10"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
bincode = "1.3"
|
||||
derive_builder = "0.12"
|
||||
derive_builder = "0.20"
|
||||
num = { version = "0.4.0", default-features = false, features = ["serde", "num-bigint"]}
|
||||
|
||||
[features]
|
||||
default = []
|
||||
incremental = []
|
||||
|
|
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
|||
#
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
define test_core
|
||||
cargo test --no-fail-fast
|
||||
cargo test --no-fail-fast --all-features
|
||||
endef
|
||||
|
||||
default: ## Build library in debug mode
|
||||
|
|
13
README.md
13
README.md
|
@ -11,8 +11,8 @@
|
|||
**NOTE: All versions prior to 0.3.1 produce broken PoWs, upgrade to
|
||||
latest version**
|
||||
|
||||
> pow_sha256's copy of `pow_sha256` by
|
||||
> [robkorn](https://github.com/robkorn/pow_sha256)
|
||||
> mcaptcha_pow_sha256 is a copy of `pow_sha256` by
|
||||
> [robkorn](https://github.com/robkorn/mcaptcha_pow_sha256)
|
||||
> which is a modified version of [`pow` library](https://github.com/bddap/pow).
|
||||
> All copyrights belong to the original authors.
|
||||
|
||||
|
@ -23,7 +23,7 @@ crate can be used to prove work was done on a given serializable input.
|
|||
The input merely needs to implement `serde::Deserialize` to be used.
|
||||
|
||||
This is a fork of the [`pow` library](https://github.com/bddap/pow) by
|
||||
[@robkorn](https://github.com/robkorn/pow_sha256)) with some new
|
||||
[@robkorn](https://github.com/robkorn/mcaptcha_pow_sha256)) with some new
|
||||
additions. Primary of these being:
|
||||
|
||||
- PoW datatype now offers a constructor
|
||||
|
@ -35,8 +35,7 @@ mostly just stylistic/ease of use improvements.
|
|||
|
||||
## Documentation
|
||||
|
||||
- [master-branch](https://mcaptcha.github.io/pow_sha256/pow_sha256/index.html)
|
||||
- [All published versions](https://mcaptcha.org/docs/api/pow-sha256)
|
||||
https://docs.rs/mcaptcha_pow_sha256
|
||||
|
||||
## Examples
|
||||
|
||||
|
@ -44,7 +43,7 @@ Prove work specifically targeting a phrase.
|
|||
|
||||
```rust
|
||||
|
||||
use pow_sha256::{ConfigBuilder, PoW};
|
||||
use mcaptcha_pow_sha256::{ConfigBuilder, PoW};
|
||||
|
||||
fn main() {
|
||||
let config = ConfigBuilder::default()
|
||||
|
@ -70,7 +69,7 @@ Prove more difficult work. This time targeting a time.
|
|||
// to find a nonce of the correct difficulty.
|
||||
|
||||
|
||||
use pow_sha256::{ConfigBuilder, PoW};
|
||||
use mcaptcha_pow_sha256::{ConfigBuilder, PoW};
|
||||
|
||||
fn main() {
|
||||
let config = ConfigBuilder::default()
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
* See `Default` implementation for the default configuration.
|
||||
*/
|
||||
|
||||
use pow_sha256::{ConfigBuilder, PoW};
|
||||
use mcaptcha_pow_sha256::{ConfigBuilder, PoW};
|
||||
|
||||
fn main() {
|
||||
let config = ConfigBuilder::default()
|
||||
|
|
|
@ -11,7 +11,7 @@ cargo-fuzz = true
|
|||
|
||||
[dependencies]
|
||||
libfuzzer-sys = "0.4"
|
||||
sha2 = "0.9"
|
||||
sha2 = "0.10"
|
||||
arbitrary = { version = "1", features = ["derive"] }
|
||||
|
||||
[dependencies.pow_sha256]
|
||||
|
|
21
renovate.json
Normal file
21
renovate.json
Normal file
|
@ -0,0 +1,21 @@
|
|||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:recommended",
|
||||
":dependencyDashboard"
|
||||
],
|
||||
"labels": [
|
||||
"renovate-bot"
|
||||
],
|
||||
"prHourlyLimit": 0,
|
||||
"timezone": "Asia/kolkata",
|
||||
"prCreation": "immediate",
|
||||
"vulnerabilityAlerts": {
|
||||
"enabled": true,
|
||||
"labels": [
|
||||
"renovate-bot",
|
||||
"renovate-security",
|
||||
"security"
|
||||
]
|
||||
}
|
||||
}
|
116
src/lib.rs
116
src/lib.rs
|
@ -7,7 +7,7 @@
|
|||
//!
|
||||
//! # Example:
|
||||
//! ```rust
|
||||
//! use pow_sha256::{ConfigBuilder, PoW};
|
||||
//! use mcaptcha_pow_sha256::{ConfigBuilder, PoW};
|
||||
//!
|
||||
//! fn main() {
|
||||
//! let config = ConfigBuilder::default()
|
||||
|
@ -50,7 +50,94 @@ pub struct Config {
|
|||
pub salt: String,
|
||||
}
|
||||
|
||||
/// Return value of incremental prooving. When proof is ready, IncrementalSolve::Work is returned
|
||||
/// and when proof is not ready, IncrementalSolve::Intermediate is returned
|
||||
#[cfg(feature = "incremental")]
|
||||
pub enum IncrementalSolve<T> {
|
||||
/// Intermediate result
|
||||
Intermediate(u128, u64, Sha256, u128),
|
||||
/// Final result
|
||||
Work(PoW<T>),
|
||||
}
|
||||
|
||||
impl Config {
|
||||
///
|
||||
/// step is used to control the number of cycles after which the function should exit, even
|
||||
/// when the proof isn't ready
|
||||
/// inter is used to keep track of state and complete proof generation. Set inter to None
|
||||
/// during first cyle and pass the returned value of the previous cycle to continue proof
|
||||
/// generation
|
||||
|
||||
#[cfg(feature = "incremental")]
|
||||
pub fn stepped_prove_work<T>(
|
||||
&self,
|
||||
t: &T,
|
||||
difficulty: u32,
|
||||
step: usize,
|
||||
inter: Option<IncrementalSolve<T>>,
|
||||
) -> bincode::Result<IncrementalSolve<T>>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
bincode::serialize(t)
|
||||
.map(|v| self.stepped_prove_work_serialized(&v, difficulty, step, inter))
|
||||
}
|
||||
|
||||
#[cfg(feature = "incremental")]
|
||||
/// Create Proof of Work over item of type T.
|
||||
///
|
||||
/// Make sure difficulty is not too high. A 64 bit difficulty,
|
||||
/// for example, takes a long time on a general purpose processor.
|
||||
/// The input is assumed to be serialized using network byte order.
|
||||
///
|
||||
/// Make sure difficulty is not too high. A 64 bit difficulty,
|
||||
/// for example, takes a long time on a general purpose processor.
|
||||
/// step is used to control the number of cycles after which the function should exit, even
|
||||
/// when the proof isn't ready
|
||||
/// inter is used to keep track of state and complete proof generation. Set inter to None
|
||||
/// during first cyle and pass the returned value of the previous cycle to continue proof
|
||||
/// generation
|
||||
/// Returns bincode::Error if serialization fails.
|
||||
/// Create Proof of Work on an already serialized item of type T.
|
||||
fn stepped_prove_work_serialized<T>(
|
||||
&self,
|
||||
prefix: &[u8],
|
||||
difficulty: u32,
|
||||
step: usize,
|
||||
inter: Option<IncrementalSolve<T>>,
|
||||
) -> IncrementalSolve<T>
|
||||
where
|
||||
T: Serialize,
|
||||
{
|
||||
let (mut result, mut n, prefix_sha, difficulty) = match inter {
|
||||
Some(IncrementalSolve::Intermediate(result, nonce, prefix, difficulty)) => {
|
||||
(result, nonce, prefix, difficulty)
|
||||
}
|
||||
_ => {
|
||||
let prefix_sha = Sha256::new().chain(&self.salt).chain(prefix);
|
||||
let n = 0;
|
||||
let result = 0;
|
||||
let difficulty = get_difficulty(difficulty);
|
||||
(result, n, prefix_sha, difficulty)
|
||||
}
|
||||
};
|
||||
let mut count = 0;
|
||||
while result < difficulty {
|
||||
if count > step {
|
||||
return IncrementalSolve::Intermediate(result, n, prefix_sha, difficulty);
|
||||
} else {
|
||||
count += 1;
|
||||
}
|
||||
n += 1;
|
||||
result = dev::score(prefix_sha.clone(), n);
|
||||
}
|
||||
IncrementalSolve::Work(PoW {
|
||||
nonce: n,
|
||||
result: result.to_string(),
|
||||
_spook: PhantomData,
|
||||
})
|
||||
}
|
||||
|
||||
/// Create Proof of Work over item of type T.
|
||||
///
|
||||
/// Make sure difficulty is not too high. A 64 bit difficulty,
|
||||
|
@ -262,4 +349,31 @@ mod test {
|
|||
assert!(config.is_sufficient_difficulty(&message.1, DIFFICULTY));
|
||||
assert!(config.is_valid_proof(&message.1, &target));
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "incremental")]
|
||||
fn stepped_solve() {
|
||||
let phrase = "Ex nihilo nihil fit.".to_owned();
|
||||
let config = get_config();
|
||||
|
||||
let mut inter = None;
|
||||
loop {
|
||||
match config.stepped_prove_work(&phrase, 50000, 1000, inter) {
|
||||
Ok(IncrementalSolve::Intermediate(result, nonce, prefix, difficulty)) => {
|
||||
println!("Current nonce {nonce}");
|
||||
inter = Some(IncrementalSolve::Intermediate(
|
||||
result, nonce, prefix, difficulty,
|
||||
));
|
||||
continue;
|
||||
}
|
||||
|
||||
Ok(IncrementalSolve::Work(w)) => {
|
||||
assert!(config.is_valid_proof(&w, &phrase));
|
||||
assert!(config.is_sufficient_difficulty(&w, DIFFICULTY));
|
||||
break;
|
||||
}
|
||||
Err(e) => panic!("{}", e),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue