我们将prehash,timestamp,data以及nonce连接起来计算sha256
//编写了一个工具类
public class Sha256Utils {
?
public static String getSha256(String s) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest sha = MessageDigest.getInstance("SHA-256");
sha.update(s.getBytes("UTF-8"));
byte[] digest = sha.digest();
return byte2Hex(digest);
}
private static String byte2Hex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
String temp = null;
for (byte aByte : bytes) {
temp = Integer.toHexString(aByte & 0xFF);
if (temp.length() == 1) {
// 1得到一位的进行补0操作
sb.append("0");
}
sb.append(temp);
}
return sb.toString();
}
?
}
挖矿是比特币中的共识算法,叫工作量证明,首先设定一个targetBit 表明hash值的(16位表示)前多少位为0,也就是说我们通过调整nonce的值算出来的hash必须小于目标hash。在实际中,这个targetBit是会动态调整的以确保挖矿速度恒定。
public class Block {
private String hash;
private String prehash;
private String data;
private long timestamp;
private int nonce;
?
public Block(String prehash, String data) {
this.prehash = prehash;
this.data = data;
this.timestamp = new Date().getTime();
this.hash=setHash();
this.nonce=0;
?
}
public String setHash(){
String sha256=null;
try {
sha256 = Sha256Utils.getSha256(prehash + data + timestamp+Integer.toString(nonce));
?
} catch (Exception e) {
System.out.println("区块计算hash出现错误");
}
return sha256;
?
}
?
public String getHash() {
return hash;
}
?
public void mine(int targetBits){
String target = new String(new char[targetBits]).replace(‘\0‘, ‘0‘); //Create a string with difficulty * "0"
while(!hash.substring( 0, targetBits).equals(target)) {
nonce ++;
hash = setHash();
}
?
?
}
public static String str2HexStr(String str)
{
?
char[] chars = "0123456789ABCDEF".toCharArray();
StringBuilder sb = new StringBuilder("");
byte[] bs = str.getBytes();
int bit;
?
for (int i = 0; i < bs.length; i++)
{
bit = (bs[i] & 0x0f0) >> 4;
sb.append(chars[bit]);
bit = bs[i] & 0x0f;
sb.append(chars[bit]);
sb.append(‘ ‘);
}
return sb.toString().trim();
}
?