比特币挖矿

区块链

比特币网络中大部分节点都是轻节点,如果只是转账而不是挖矿的话,没必要用全节点。

The purpose of mining is not recreation of new bitcoin. It is the incentive system. Mining is a mechanism by which the bitcoin achieves decentralized security.

Bitcoin is a deflationary cryptocurrency.

挖矿过程中,如果你听到别人发布了一个区块,该区块是合法的,也是在延长最长合法链。这时候你该怎么办?应该停止挖矿,然后重新在本地组装一个候选区块,再重新从头开始挖矿。因为如果沿着新发布的交易往下挖的话,那么本地组装的区块中包含的交易就会发生变化,有些交易可能已经被包含到新发布的区块里了。另外block header的内容也会发生变化,像block header里有交易所组成的merkle tree的根哈希值,还有指向前一个区块的指针,这些也都会发生变化。

这样做是不是有些可惜?挖矿的一个性质是无记忆性,无论是继续挖原来的区块,还是停下来挖一个新组装出来的区块,成功的概率是一样的。只要还没有挖到符合要求的nonce值,前面已经挖了多长时间都是无所谓的。

即使挖到了合法的区块,发布到区块链上,也不能保证胜利了。有可能你发布的区块最终没有成为最长合法链,可能存在一些冲突情况,别人可能同时发布一些合法的区块,或者存在一些你不知道的double spending,使得你的区块中的某些交易变成冲突的。

矿池

比特币系统中平均每10分钟出一个区块,这是说比特币系统中所有的矿工做一个整体来看平均10min会产生一个区块。但如果具体到某一个矿工来说,他可能要挖很长时间,如果他用一个矿机可能要挖一两年。这样子就好像是买彩票,挖到了就是中了一个大奖。单矿工还有其他问题,他除了挖矿之外还要承担全节点的其他责任(就是这节课最开始介绍的那些)。

所以要引入矿池,所谓的矿池,就是把这些矿工组织起来,作为一个整体,矿池的架构一般是一个全节点会驱动很多矿机,一个矿池有一个矿主,叫pool manager。下面连了很多矿工,这些矿工只负责计算哈希值,全节点的其他职责都由矿主来承担。他负责监听网上的交易,把这些交易组织打包成区块,同时要看一看有没有其他的节点抢先发布区块,如果有的话看怎样进行调整.....

工作量证明

如果矿工是来自五湖四海的,不是属于同一个机构的,那么利益该怎么分配?平均分配行不行?比如每个矿工挖到一个区块,得到了出块奖励,然后平分给其他矿工,这样行吗?不行,因为会有矿工偷懒。因此要按矿工的贡献大小进行分配,也就是这里同样需要工作量证明。那该怎么证明每个矿工做了多少工作呢?

为什么矿工的收入不稳定,因为挖矿太难了,如果把挖矿的难度降低之后,挖矿就会变得稳定了。怎么降低难度呢?以前的要求是,矿工要找到一个nonce,用nonce计算block header 的哈希值,前面至少有70个0才是合法的区块。降低挖矿难度之后,比如说前面只要有60个0就行了,这样挖到的叫作一个share,这个share叫做almost valid block。矿工挖到share或almost valid block之后,把它提交给矿主。矿主拿到这个区块有什么用呢?用来证明矿工所做的工作量,而没有其他用途。矿主无法得到区块奖励以及任何好处。所以矿主就统计每个矿工提交了多少这样的share,将来等到某个矿工真正挖到了合法的区块之后,再将出块奖励按照每个矿工所做的工作量,提交的share数目进行分配。

这样做为什么是可行的?每个矿工挖到矿的概率取决于他尝试的nonce数目,尝试的nonce越多,能找到的share就越多。