北京大学肖臻老师《区块链技术与应用》公开课:08-BTC-比特币挖矿
文章目录
- 1.比特币中的节点
- 2.挖矿
- 3. 比特币的安全性
- 4. 矿池
1.比特币中的节点
全节点:
- 一直在线
- 在本地硬盘上维护完整的区块链信息
- 在内存里维护UTXO集合,以便快速检验交易的正确性
- 监听比特币网络上的交易信息,验证每个交易的合法性(有没有合法的签名是不是双花)
- 决定哪些交易会被打包到区块里(缺省情况下只要是合法的交易并且交易费符合要求就会被打包进去)
- 监听别的矿工挖出来的区块,验证其合法性
- 挖矿
- 决定沿着哪条链挖下去?(缺省情况下是按照最长合法链挖下去)
- 当出现等长的分叉的时候,选择哪一个分叉?(缺省情况下选择最先听到的那个分叉)
第6条验证合法性从三个方面验证:1.首先看下区块中每个交易都要合法。包括铸币的交易有没有篡改区块奖励(block reward)、发布的区块是不是符合难度要求、检查block header中难度目标阈值设置是不是正确的。2.全节点还得每两周按照比特币协议的要求调整挖矿难度。3.检查这个区块是不是在延伸最长合法链。
轻节点
- 不是一直在线
- 不用保存整个区块链,只要保存每个区块的块头
- 不用保存全部交易,只保存与自己相关的交易
- 无法检验大多数交易的合法性,只能检验与自己相关的那些交易的合法性。
- 无法检测网上发布的区块的正确性
- 可以验证挖矿的难度
- 只能检测哪个是最长链,不知道哪个是最长合法链
轻节点是假设发布这个区块的全节点是不会把非法的交易发出来的。因为发布这样的交易是对它没有好处的。
轻节点是假设矿工是有理智的不会沿着不合法的链挖下去的,因为挖出一个区块的代价是很大的。
比特币网络中大部分节点都是轻节点。如果只是想进行转账不需要挖矿的话没必要运行一个全节点,用一个轻节点就可以啦。
2.挖矿
在挖矿过程中如果监听到别人发布了一个区块,这个区块是合法的,也是在延伸最长合法链,这时应该停止已有的挖矿,在本地重新组装一个候选的区块,然后重新进行挖矿。为什么这么做?
因为要沿着这个新发布的区块往下挖的话,那么本地所组装的区块中包含的交易就会发生变化有些交易可能已经包含到新发布的区块中了。另外block header中的内容也会发生变化。像block header里由交易所组成的merkle tree的根哈希值,还有指向前一个区块的指针这些也要发生变化,所以要停止已有的挖矿重新组装一个候选区块重新进行挖矿。
这样做是不是有些可惜?
不可惜,因为挖矿有个性质是无记忆性。不管挖原来的区块还是新组装的区块成功的概率是一样的。只要当前还没挖到符合难度要求的nonce,即使挖到了合法的区块,发布出去后也不是说就胜利了,有可能发布的区块没有成为最长合法链,可能存在别人同时发布了一个合法的区块,或者存在一些你不知道的双花攻击,使得这个区块中某些交易最后变成是有冲突的。
3. 比特币的安全性
比特币是怎么保证安全性的?
比特币中的安全性是从两方面来保证的,一方面是密码学上的保证,另一方面是共识机制。
密码学上的保证是别人没有你的私钥就没有办法伪造你的签名。所以就不能把你账上的钱转走。这个的前提是系统中拥有大多数算力的矿工是遵守协议的,不会接受那些没有合法签名的交易,如果没有这一点的话密码学上的保证没有用武之地。
挖矿设备的总的演化趋势是从通用变成越来越专用(从CPU到GPU到ASIC)。很多人认为这和比特币宣称的去中心化的理念是不相符的。也违背了比特币设计的初衷。最民主的一种情况是大家都用CPU去挖矿。
4. 矿池
挖矿的另一个趋势是大型矿池的出现,单个矿工即使用了ASIC芯片,挖矿从平均收益上是有利可图的,但是收入是特别不稳定的。单个矿工还有另外的问题,除了挖矿还要承担全节点的其他责任。
所谓矿池就是把矿工组织起来作为一个整体,那么矿池的架构一般来说是一个全节点驱动很多矿机。一个矿池一般有一个矿主(pool manager),下面连着好多矿工,矿工只负责计算hash值。全节点的其他的职责(监听网上的交易,把交易组织打包成候选区块)都由矿主来承担。矿池的出现还有其他的目的,解决收入不稳定的问题。