Skip to content

Commit 1a6e9fc

Browse files
committed
Add LightDAG and Patch interface
1 parent 2eb5317 commit 1a6e9fc

File tree

3 files changed

+62
-10
lines changed

3 files changed

+62
-10
lines changed

src/dag.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use bigint::{H256, H64, U256};
2+
use std::marker::PhantomData;
3+
4+
pub trait Patch {
5+
fn epoch_length() -> U256;
6+
}
7+
8+
pub struct EthereumPatch;
9+
impl Patch for EthereumPatch {
10+
fn epoch_length() -> U256 { U256::from(30000) }
11+
}
12+
13+
pub struct LightDAG<P: Patch> {
14+
epoch: usize,
15+
cache: Vec<u8>,
16+
cache_size: usize,
17+
full_size: usize,
18+
_marker: PhantomData<P>
19+
}
20+
21+
impl<P: Patch> LightDAG<P> {
22+
pub fn new(number: U256) -> Self {
23+
let epoch = (number / P::epoch_length()).as_usize();
24+
let cache_size = ::get_cache_size(epoch);
25+
let full_size = ::get_full_size(epoch);
26+
let seed = ::get_seedhash(epoch);
27+
28+
let mut cache: Vec<u8> = Vec::with_capacity(cache_size);
29+
cache.resize(cache_size, 0);
30+
::make_cache(&mut cache, seed);
31+
32+
Self {
33+
cache, cache_size, full_size, epoch,
34+
_marker: PhantomData
35+
}
36+
}
37+
38+
pub fn hashimoto(&self, hash: H256, nonce: H64) -> (H256, H256) {
39+
::hashimoto_light(hash, nonce, self.full_size, &self.cache)
40+
}
41+
42+
pub fn is_valid_for(&self, number: U256) -> bool {
43+
(number / P::epoch_length()).as_usize() == self.epoch
44+
}
45+
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ extern crate bigint;
88
extern crate byteorder;
99

1010
mod miller_rabin;
11+
mod dag;
12+
13+
pub use dag::{LightDAG, Patch, EthereumPatch};
1114

1215
use miller_rabin::is_prime;
1316
use sha3::{Digest, Keccak256, Keccak512};

tests/headers.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@ use std::str::FromStr;
1919
fn header1() {
2020
let header: Header = rlp::decode(&read_hex("f901f3a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a09178d0f23c965d81f0834a4c72c6253ce6830f4022b1359aaebfc1ecba442d4ea056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080830f4240808080a058f759ede17a706c93f13030328bcea40c1d1341fb26f2facd21ceb0dae57017884242424242424242").unwrap());
2121

22-
assert_eq!(get_cache_size(header.number), 16776896);
23-
assert_eq!(get_full_size(header.number), 1073739904);
22+
let epoch = (header.number / U256::from(30000)).as_usize();
23+
24+
assert_eq!(get_cache_size(epoch), 16776896);
25+
assert_eq!(get_full_size(epoch), 1073739904);
2426
assert_eq!(header.partial_hash(), H256::from_str("2a8de2adf89af77358250bf908bf04ba94a6e8c3ba87775564a41d269a05e4ce").unwrap());
2527

26-
let cache_size = get_cache_size(header.number);
27-
let full_size = get_full_size(header.number);
28+
let cache_size = get_cache_size(epoch);
29+
let full_size = get_full_size(epoch);
2830

2931
let mut cache: Vec<u8> = Vec::with_capacity(cache_size);
3032
cache.resize(cache_size, 0);
3133

32-
let seed = get_seedhash(header.number);
34+
let seed = get_seedhash(epoch);
3335
assert_eq!(seed, H256::from_str("0000000000000000000000000000000000000000000000000000000000000000").unwrap());
3436

3537
make_cache(&mut cache, seed);
@@ -48,17 +50,19 @@ fn header1() {
4850
fn header2() {
4951
let header: Header = rlp::decode(&read_hex("f901f7a01bef91439a3e070a6586851c11e6fd79bbbea074b2b836727b8e75c7d4a6b698a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794ea3cb5f94fa2ddd52ec6dd6eb75cf824f4058ca1a00c6e51346be0670ce63ac5f05324e27d20b180146269c5aab844d09a2b108c64a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b90100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302004002832fefd880845511ed2a80a0e55d02c555a7969361cf74a9ec6211d8c14e4517930a00442f171bdb1698d17588307692cf71b12f6d").unwrap());
5052

51-
assert_eq!(get_cache_size(header.number), 16776896);
52-
assert_eq!(get_full_size(header.number), 1073739904);
53+
let epoch = (header.number / U256::from(30000)).as_usize();
54+
55+
assert_eq!(get_cache_size(epoch), 16776896);
56+
assert_eq!(get_full_size(epoch), 1073739904);
5357
assert_eq!(header.partial_hash(), H256::from_str("100cbec5e5ef82991290d0d93d758f19082e71f234cf479192a8b94df6da6bfe").unwrap());
5458

55-
let cache_size = get_cache_size(header.number);
56-
let full_size = get_full_size(header.number);
59+
let cache_size = get_cache_size(epoch);
60+
let full_size = get_full_size(epoch);
5761

5862
let mut cache: Vec<u8> = Vec::with_capacity(cache_size);
5963
cache.resize(cache_size, 0);
6064

61-
let seed = get_seedhash(header.number);
65+
let seed = get_seedhash(epoch);
6266
assert_eq!(seed, H256::from_str("0000000000000000000000000000000000000000000000000000000000000000").unwrap());
6367

6468
make_cache(&mut cache, seed);

0 commit comments

Comments
 (0)