annotate src/main/java/christie/blockchain/BlockChain.java @ 121:8949d0ecf1f6

refactor Topology
author akahori
date Tue, 11 Dec 2018 15:46:09 +0900
parents eab161e557bd
children 694ea96a557a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
108
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
1 package christie.blockchain;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
2
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
3 import java.nio.charset.Charset;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
4 import java.util.ArrayList;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
5 import java.util.Arrays;
110
eab161e557bd fix Refactor
akahori
parents: 108
diff changeset
6 import java.util.List;
108
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
7
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
8 public class BlockChain {
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
9
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
10 public ArrayList<Block> blockList = new ArrayList<Block>();
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
11
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
12 public static void main(String[] args) {
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
13 int difficulty = 1;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
14 BlockChain blockChain = new BlockChain();
110
eab161e557bd fix Refactor
akahori
parents: 108
diff changeset
15 Miner miner = new Miner();
108
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
16 long startTime = System.currentTimeMillis();
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
17
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
18 Block genesisBlock = blockChain.createGenesisBlock("Hi im the first block");
110
eab161e557bd fix Refactor
akahori
parents: 108
diff changeset
19 miner.mineBlock(genesisBlock, difficulty);
108
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
20 System.out.println("Hash for block 1 : " + genesisBlock.getData() + " Nonce : " + genesisBlock.getNonce());
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
21
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
22 Block secondBlock = blockChain.createNewBlock(genesisBlock, "Yo im the second block");
110
eab161e557bd fix Refactor
akahori
parents: 108
diff changeset
23 miner.mineBlock(secondBlock, difficulty);
108
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
24 System.out.println("Hash for block 2 : " + secondBlock.getData() + " Nonce : " + secondBlock.getNonce());
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
25
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
26 Block thirdBlock = blockChain.createNewBlock(secondBlock, "Hey im the third block");
110
eab161e557bd fix Refactor
akahori
parents: 108
diff changeset
27 miner.mineBlock(thirdBlock, difficulty);
108
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
28 System.out.println("Hash for block 3 : " + thirdBlock.getData() + " Nonce : " + thirdBlock.getNonce());
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
29
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
30
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
31 blockChain.blockList.add(genesisBlock);
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
32 blockChain.blockList.add(secondBlock);
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
33 blockChain.blockList.add(thirdBlock);
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
34
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
35 System.out.println("\nBlockchain is Valid: " + blockChain.isChainValid(difficulty));
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
36
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
37 long endTime = System.currentTimeMillis() - startTime;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
38
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
39 System.out.println("end Time: " + endTime);
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
40
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
41 }
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
42
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
43 public Boolean isChainValid(int difficulty) {
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
44 Block currentBlock;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
45 Block parentBlock;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
46
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
47 String hashTarget = new String(new char[difficulty]).replace('\0', '0');
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
48
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
49 //loop through blockchain to check hashes:
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
50 for(int i=1; i < blockList.size(); i++) {
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
51 currentBlock = blockList.get(i);
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
52 parentBlock = blockList.get(i-1);
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
53
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
54 if(!Arrays.equals(parentBlock.getPresentHash(), currentBlock.getParentHash())){
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
55 System.out.println("Previous Hashes not equal");
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
56 return false;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
57 }
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
58
110
eab161e557bd fix Refactor
akahori
parents: 108
diff changeset
59 String hashStr = new String(currentBlock.getPresentHash(), Charset.forName("utf-8"));
108
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
60 if(!hashStr.substring( 0, difficulty).equals(hashTarget)) {
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
61 System.out.println("This block hasn't been mined");
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
62 return false;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
63 }
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
64 }
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
65 return true;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
66 }
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
67
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
68 public synchronized Block createNewBlock(Block parent, String data){
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
69 long time = System.currentTimeMillis() / 1000;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
70 // もし, 時差があって, timeが親のタイムスタンプより低いなら, 親のタイムスタンプ + 1 を代入する
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
71 if (parent.getTimestamp() >= time) time = parent.getTimestamp() + 1;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
72
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
73 Block block = new Block(parent.getPresentHash(), time, data);
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
74 return block;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
75 }
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
76
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
77 public synchronized Block createGenesisBlock(String data){
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
78 long time = System.currentTimeMillis() / 1000;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
79 Block block = new Block(time, data);
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
80 return block;
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
81 }
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
82
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
83
31f87de2a1d4 add Block.java
akahori
parents:
diff changeset
84 }