(图片来源 pixabay.com)
挖矿
无论有没有买过、持有、研究过比特币。挖矿,这个跟比特币伴生的词,大家都或多或少都听过。但如果没有专门去了解比特币挖矿,即使是已经买了比特币的人,甚至靠比特币获得了上百万身家的人也不能说清楚为什么要挖矿,什么是比特币挖矿。
矿工挖矿的目的是为了获得利润,为了获得比特币。矿工是一群以赚取比特币为目的,建设、维护比特币网络的人。比特币通过经济激励让更多的人参与建设比特币网络,让比特币网络去中心化,也使得比特币网络更加的健壮。同时挖矿是制造比特币的唯一方法,这就相当于央行的铸币。
工作量证明
比特币网络上这么多的矿工,如何证明某个矿工挖到了一块“矿”,能在比特币链上添加一个区块。这就需要工作量证明。
工作量证明是指一小段满足一定要求,需要大量资源去计算才能产生,却可以轻易验证有效性的数据。挖矿这个词用得真的非常妙。做为一个矿工,无论你用的是什么设备,原始的锄头、先进的挖掘机……,都在努力的寻找到一块随机分布的、名为“工作量证明”的矿。如果某一矿工找到了这样的一块矿,他就可以在比特币区块链上添加一个区块,获得奖励。
比特币网络使用SHA-256算法做为工作量证明的手段。SHA-256是一种HASH算法,具有以下的特点:
- 同样的消息计算结果永远一样的。
- 快速计算出给定消息的hash结果。
- 除非尝试所有的可能信息,不然不能从HASH值反推出消息。
- 对消息再小的修改,即使是修改了一个bit,也会导致新计算出的HASH值与原来的HASH值完全不相关。
- 找到两个不同的内容具有一样的HASH值是不可行的。
矿工要挖得一个矿,就是通过SHA-256算法,把区块内容加上一个32位的nonce(随机数)构成的消息计算出一个小于目标的HASH值。如果找到了这样的一个nonce,则矿工成功的找到了一个工作量证明,能把区块写入区块链,获得奖励。
使用SHA-256这样的算法,使得比特币挖矿只能通过不断修改nouce的值,尝试计算出一个有效的HASH值,获得一个工作量证明。而不能通过别得手段获得工作证明。修改一个bit也使得HASH值与原来的结果完全不相关,这一特性使得挖到一块“矿”,就像是中彩票一样,你不知道是不是下一次修改就获得一个工作量证明。只有大量的计算才能增加中奖概率,这就是挖矿的工作量。
工作量证明其实不单单用在挖矿,在应对垃圾邮件上也有用武之地。如果使用SHA-256算法,一个正常的邮件发送,通过把邮件内容(含地址)和nonce计算一个低于目标值的HASH,因为只有一封邮件可以很轻易的完成。而对于那些制造垃圾邮件的人,因为需要大量的发送邮件就需要大量的计算能力。发送垃圾邮寄的收益如不能覆盖算力成本,就可以起到防止垃圾邮件的作用。
一个工作量证明的Hello,world!例子,想要获得一个以0000开头的HASH,需要计算4251次(从0开始计算)。
public static void main(String[] args) {
String content = "Hello, world!";
int i = 0;
do{
String temp = content + i;
String pow = DigestUtils.sha256Hex(temp);
if(pow.startsWith("000")){
System.out.println(temp);
System.out.println(pow);
break;
}
i ++ ;
}while(true);
}
Hello, world!0-->1312af178c253f84028d480a6adc1e25e81caa44c749ec81976192e2ec934c64
Hello, world!1-->e9afc424b79e4f6ab42d99c81156d3a17228d6e1eef4139be78e948a9332a7d8
Hello, world!4249-->c004190b822f1669cac8dc37e761cb73652e7832fb814565702245cf26ebb9e6
Hello, world!4250-->0000c3af42fc31103f1fdc0151fa747ff87349a4714df7cc52ea464e12dcd4e9
即使是0000开头的数据已经要求最少运行4251次,而比特币网络的难度是000000000000000000(18位)。(这是仅是直观的比较)
目标与难度
比特币设计要求平均每10分钟出一个块,这样的设计就要求挖矿的难度要可以调整的,当比特币网络的算力增加,出块的速度会加快,比特币网络的挖矿难度就会上升。当比特币网络的算力下降时,出块的速度就会下降,比特币网络的挖矿难度就会下降。
比特币网络按每出2006区块就调整一次难度。按设计的平均10分钟出块时间计算,比特币网络会每两周就调整一次挖矿难度。实际情况会有差别,当网络的算力增加,出块的速度增加,调整难度的时间就不需要两周;当网络的算力下降,出块的速度下降,调整难度的时间就会超过两周。挖矿难度的调整是按区块计算的,每2006个块调整一次难度。
挖矿难度调整其实就是调整目标值,目标值是用来衡量工作证明是否有效,只有工作证明小于目标值时,区块才能被写入到比特币区块链,才能被别的矿工接受,才能获得奖励。
总结
矿工是比特币网络的主要组成部分。比特币通过奖励比特币,激励更多的人参与到挖矿。这些为了赚取比特币的人就是矿工。矿工挖矿需要大量的计算,以提高中奖概率获得工作量证明,维护比特币区块链,获得比特币奖励。矿工的存在加强了比特币网络,实现比特币网络的去中心化。
参考资料
https://en.bitcoin.it/wiki/Proof_of_work
https://en.bitcoin.it/wiki/Target
https://en.bitcoin.it/wiki/Difficulty
https://en.bitcoin.it/wiki/SHA-256
https://en.bitcoin.it/wiki/Mine
https://en.wikipedia.org/wiki/Cryptographic_hash_function
(如果你注册了steemit账户,请关注我)
(如果文章对你有用,请关注我的公众号)
不好意思,网络原因,发了两次
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit