基本概念

        在比特币系统中,生成一个区块的hash,除了需要基本的交易数据、时间戳、前一区块hash等数据外,还需要一个Nonce值(引入Nonce的作用是为了防止多个矿工同时完成了挖矿)。

        若我们寻找这样一个Nonce,让其与Merkel树根(交易数据通过不断hash生成)、时间戳、前一区块hash等数据一起,生成一个hash,当该生成的hash中前若干位0的个数大于或等于比特币系统给定的难度值时,就挖矿成功了。而该过程,就称作挖矿。

        注:在比特币系统中,通过调整难度值,使得平均每10分钟生成一个区块。

伪代码实现

  • 寻找Nonce来生成符合条件的hash
1
2
3
4
5
6
7
8
9
String hash;
String input;
int nonce;
while(!isValidHash(hash)){
nonce++;
//Merkle树根、时间戳、前一区块hash、nonce作为hash函数的输入数据
input = merkle + timestamp + preHash + nonce;
hash = SHA256(input);
}
  • 判断hash是否符合比特币系统给定的难度
1
2
3
4
5
6
7
8
public boolean isValidHash(String hash, int difficulty){
for(int i=0,length=hash.length; i<length; i++){
if(hash[i]!=0)
break;
}

return i>=difficulty;
}

最后更新: 2019年03月19日 14:21

原始链接: http://yoursite.com/2019/03/12/什么是“挖矿”/