当我们说比特币挖矿的时候,我们到底在说什么?|周明强有话说steemCreated with Sketch.

in cn •  7 years ago 

比特币
(图片来源 pixabay.com)

挖矿

无论有没有买过、持有、研究过比特币。挖矿,这个跟比特币伴生的词,大家都或多或少都听过。但如果没有专门去了解比特币挖矿,即使是已经买了比特币的人,甚至靠比特币获得了上百万身家的人也不能说清楚为什么要挖矿,什么是比特币挖矿。

矿工挖矿的目的是为了获得利润,为了获得比特币。矿工是一群以赚取比特币为目的,建设、维护比特币网络的人。比特币通过经济激励让更多的人参与建设比特币网络,让比特币网络去中心化,也使得比特币网络更加的健壮。同时挖矿是制造比特币的唯一方法,这就相当于央行的铸币。

工作量证明

比特币网络上这么多的矿工,如何证明某个矿工挖到了一块“矿”,能在比特币链上添加一个区块。这就需要工作量证明。

工作量证明是指一小段满足一定要求,需要大量资源去计算才能产生,却可以轻易验证有效性的数据。挖矿这个词用得真的非常妙。做为一个矿工,无论你用的是什么设备,原始的锄头、先进的挖掘机……,都在努力的寻找到一块随机分布的、名为“工作量证明”的矿。如果某一矿工找到了这样的一块矿,他就可以在比特币区块链上添加一个区块,获得奖励。

比特币网络使用SHA-256算法做为工作量证明的手段。SHA-256是一种HASH算法,具有以下的特点:

  1. 同样的消息计算结果永远一样的。
  2. 快速计算出给定消息的hash结果。
  3. 除非尝试所有的可能信息,不然不能从HASH值反推出消息。
  4. 对消息再小的修改,即使是修改了一个bit,也会导致新计算出的HASH值与原来的HASH值完全不相关。
  5. 找到两个不同的内容具有一样的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 账户

(如果你注册了steemit账户,请关注我)

zmqyhs

(如果文章对你有用,请关注我的公众号)

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

不好意思,网络原因,发了两次