annotate src/main/java/christie/blockchain/Miner.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
110
eab161e557bd fix Refactor
akahori
parents:
diff changeset
1 package christie.blockchain;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
2
eab161e557bd fix Refactor
akahori
parents:
diff changeset
3 import org.bouncycastle.util.Arrays;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
4 import org.bouncycastle.util.BigIntegers;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
5
eab161e557bd fix Refactor
akahori
parents:
diff changeset
6 import java.io.ByteArrayOutputStream;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
7 import java.math.BigInteger;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
8 import java.nio.charset.Charset;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
9
eab161e557bd fix Refactor
akahori
parents:
diff changeset
10
eab161e557bd fix Refactor
akahori
parents:
diff changeset
11 public class Miner {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
12
eab161e557bd fix Refactor
akahori
parents:
diff changeset
13 HashUtil hashUtil = new HashUtil();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
14
eab161e557bd fix Refactor
akahori
parents:
diff changeset
15
eab161e557bd fix Refactor
akahori
parents:
diff changeset
16 public void mineBlock(Block newBlock, int difficulty) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
17 long nonce = 0;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
18
eab161e557bd fix Refactor
akahori
parents:
diff changeset
19
eab161e557bd fix Refactor
akahori
parents:
diff changeset
20 //byte[] target = new String(new char[difficulty]).replace('\0', '0').getBytes();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
21 String target = new String(new char[difficulty]).replace('\0', '0');
eab161e557bd fix Refactor
akahori
parents:
diff changeset
22 byte[] hash = newBlock.getPresentHashWithoutNonce();
eab161e557bd fix Refactor
akahori
parents:
diff changeset
23
eab161e557bd fix Refactor
akahori
parents:
diff changeset
24 String hashStr = new String(hashUtil.sha256(hash), Charset.forName("utf-8"));
eab161e557bd fix Refactor
akahori
parents:
diff changeset
25
eab161e557bd fix Refactor
akahori
parents:
diff changeset
26
eab161e557bd fix Refactor
akahori
parents:
diff changeset
27 while(!hashStr.substring( 0, difficulty).equals(target)) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
28 nonce ++;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
29 byte[] concat = Arrays.concatenate(hash, BigInteger.valueOf(nonce).toByteArray());
eab161e557bd fix Refactor
akahori
parents:
diff changeset
30 hashStr = new String(hashUtil.sha256(concat), Charset.forName("utf-8"));
eab161e557bd fix Refactor
akahori
parents:
diff changeset
31 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
32 newBlock.setNonce(nonce);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
33 System.out.println("Block Mined!!! : " + hashStr);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
34
eab161e557bd fix Refactor
akahori
parents:
diff changeset
35
eab161e557bd fix Refactor
akahori
parents:
diff changeset
36
eab161e557bd fix Refactor
akahori
parents:
diff changeset
37 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
38
eab161e557bd fix Refactor
akahori
parents:
diff changeset
39 public boolean increment(byte[] bytes) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
40 final int startIndex = 0;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
41 int i;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
42 for (i = bytes.length - 1; i >= startIndex; i--) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
43 bytes[i]++;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
44 if (bytes[i] != 0)
eab161e557bd fix Refactor
akahori
parents:
diff changeset
45 break;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
46 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
47
eab161e557bd fix Refactor
akahori
parents:
diff changeset
48 return (i >= startIndex || bytes[startIndex] != 0);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
49 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
50
eab161e557bd fix Refactor
akahori
parents:
diff changeset
51 public int compareTo(byte[] buffer1, int offset1, int length1,
eab161e557bd fix Refactor
akahori
parents:
diff changeset
52 byte[] buffer2, int offset2, int length2) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
53 // Short circuit equal case
eab161e557bd fix Refactor
akahori
parents:
diff changeset
54 if (buffer1 == buffer2 &&
eab161e557bd fix Refactor
akahori
parents:
diff changeset
55 offset1 == offset2 &&
eab161e557bd fix Refactor
akahori
parents:
diff changeset
56 length1 == length2) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
57 return 0;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
58 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
59 int end1 = offset1 + length1;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
60 int end2 = offset2 + length2;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
61 for (int i = offset1, j = offset2; i < end1 && j < end2; i++, j++) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
62 int a = (buffer1[i] & 0xff);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
63 int b = (buffer2[j] & 0xff);
eab161e557bd fix Refactor
akahori
parents:
diff changeset
64 if (a != b) {
eab161e557bd fix Refactor
akahori
parents:
diff changeset
65 return a - b;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
66 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
67 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
68 return length1 - length2;
eab161e557bd fix Refactor
akahori
parents:
diff changeset
69 }
eab161e557bd fix Refactor
akahori
parents:
diff changeset
70 }