/
MerkleTests.java
96 lines (76 loc) · 3.43 KB
/
MerkleTests.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package com.thaler.miner;
import static org.junit.Assert.fail;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.junit.Test;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.thaler.miner.ddb.Bits256;
import com.thaler.miner.ddb.HashableString;
import com.thaler.miner.merkle.Hashable;
import com.thaler.miner.merkle.MerkleUtil;
import com.thaler.miner.merkle.MerkleTreeNode;
import com.thaler.miner.util.CryptoUtil;
public class MerkleTests {
public String TSA = "Test String A";
public String TSB = "Test String B";
public String TSC = "Test String C";
public String TSD = "Test String D";
private FluentIterable<Hashable> createBaseData() {
List<Hashable> baseData = Lists.newArrayList();
for(int i=0; i< 100160; i++){
baseData.add(HashableString.create("Test data: " + i));
}
return FluentIterable.from(baseData);
}
private static final Logger logger = Logger.getLogger(MerkleTests.class);
@Test
public void merkleRootTest() {
{
Map<Bits256, MerkleTreeNode> merkleMap = Maps.newHashMap();
FluentIterable<Hashable> baseData = createBaseData();
MerkleTreeNode merkleRoot = MerkleUtil.createMerkleTree(baseData, merkleMap);
logger.info("merkle tree Root: " + merkleRoot.combinedHash.toString());
logger.info("tree root: " + merkleMap.get(merkleRoot.combinedHash));
Hashable firstDataItem = baseData.first().get();
Bits256 doubleHashOfFirstDataItem = CryptoUtil.hash(CryptoUtil.hash(firstDataItem), CryptoUtil.hash(firstDataItem));
logger.info("first data item: " + merkleMap.get(doubleHashOfFirstDataItem));
}
}
@Test
public void merklePathCreationTest() {
FluentIterable<Hashable> baseData = createBaseData();
Hashable firstDataItem = baseData.last().get();
Bits256 doubleHashOfFirstDataItem = CryptoUtil.hash(CryptoUtil.hash(firstDataItem), CryptoUtil.hash(firstDataItem));
Map<Bits256, MerkleTreeNode> merkleMap = Maps.newHashMap();
MerkleTreeNode merkleRoot = MerkleUtil.createMerkleTree(baseData, merkleMap);
List<MerkleTreeNode> merklePath = MerkleUtil.createMerkePath(merkleMap, merkleRoot, doubleHashOfFirstDataItem);
logger.info("merkle tree Root: " + merkleRoot.combinedHash.toString());
logger.info("first data item node: " + merkleMap.get(doubleHashOfFirstDataItem));
logger.info("----path----");
for(MerkleTreeNode merkleTreeNode : merklePath){
logger.info(merkleTreeNode);
}
logger.info("----path end----");
}
@Test
public void merklePathValidationTest() {
FluentIterable<Hashable> baseData = createBaseData();
Hashable firstDataItem = baseData.last().get();
Bits256 doubleHashOfFirstDataItem = CryptoUtil.hash(CryptoUtil.hash(firstDataItem), CryptoUtil.hash(firstDataItem));
Map<Bits256, MerkleTreeNode> merkleMap = Maps.newHashMap();
MerkleTreeNode merkleRoot = MerkleUtil.createMerkleTree(baseData, merkleMap);
List<MerkleTreeNode> merklePath = MerkleUtil.createMerkePath(merkleMap, merkleRoot, doubleHashOfFirstDataItem);
logger.info("merkle tree Root: " + merkleRoot.combinedHash.toString());
logger.info("first data item node: " + merkleMap.get(doubleHashOfFirstDataItem));
logger.info("----path----");
for(MerkleTreeNode merkleTreeNode : merklePath){
logger.info(merkleTreeNode);
}
logger.info("----path end----");
Assert.assertTrue(MerkleUtil.validateMerklePath(merklePath, merkleRoot));
}
}