本笔记对应北京大学肖臻老师《区块链技术与应用》公开课第八课。
0.前言
在本节中,肖老师首先回顾了一下节点的定义,然后讲了讲挖矿的现有的趋势。
1.全节点和轻节点
以下介绍了一些全节点和轻节点的特点和区别:
全节点:
- 一直在线。
- 在本地硬盘上维护完整的区块链信息
- 在内存中维护UTXO集合,以便于快速检验交易合法性
- 监听比特币网络中交易内容,验证每个交易合法性
- 决定哪些交易会打包到区块中
- 监听其他矿工挖出的区块,验证其合法性
轻节点
- 不是一直在线
- 不保存整个区块链,只需要保存每隔区块块头
- 无法验证大多数交易合法性,只能检验和自己相关的交易合法性
- 无法检测网上发布的区块正确性
- 可以验证挖矿难度
在比特币网络中,大多数节点都是轻节点。 在挖矿过程中,如果监听到别人已经挖出区块延申了最长合法链,此时应该立刻放弃当前区块,在本地重新组装一个指向最后这个新合法区块的候选区块,重新开始挖矿。
- 直接丢弃当前区块会很可惜吗?
之前文章中提及,挖矿本身具有无记忆性,前面无论挖多久,对后续继续挖矿没有影响。
- 比特币系统如何保证安全性?
1.密码学的保证。没有私钥,就无法伪造其合法签名,从而无法随意转移别人账户上的钱。
2.共识机保证。保证恶意交易不被系统承认。
2.挖矿产生的两个趋势
1.设备演变趋势
目前,挖矿设备逐渐趋于专业化,其经历了三个过程。
普通CPU -> GPU ->ASIC芯片(挖矿专用矿机)
2.大型矿池的出现
由于比特币挖矿难度太高,常常一些算力不够的人,可能要1到2年才能获得一次出块奖励,此外,单个矿工除挖矿还要承担全节点其他责任,造成了算力的消耗,因此为了解决这个问题,便引入了矿池的概念。
矿池的架构,通常是一个全节点驱动多台矿机。 矿工要做的是不断的计算哈希值,而全节点其他职责由矿主来承担,这就解决的部分算力消耗的问题。而当获得收益后,所有矿工对收益进行分配,保证了收益的稳定性,这又解决了收入不稳定的问题。
- 分配方式:
矿池一般具有两种组织形式:
1.类似大型数据中心(同一机构),集中成千上万矿机进行哈希计算。
2.分布式。矿工与矿主不认识(不同机构),矿工与矿主联系,自愿加入其矿池,矿主分配任务,矿工进行计算,获得收益后整个矿池中所有矿工进行利益分配。
第一种类似一个中心化机构,机构内部就可以协商后解决,第二种就需要一些策略来应对了。老师讲了一种思路:降低挖矿难度,再根据工作量进行分配。
假设原本挖矿难度要求,计算所得126位的哈希值前70位都必须为0,现在降低要求,只需要前50位为0,这样挖矿会更容易。当然,这个哈希可能不会被区块链所承认的,我们将其称为一个share,或almost valid share。矿工每挖到一个share,将其提交给矿主,矿主对其进行记录,作为矿工工作量的证明。等到某个矿工真正挖到符合要求的的区块后,根据所有矿工提交的share数量进行分配。
因为每个矿工尝试的nonce越多,所能得到的share也会越多,所以这种方案作为工作量证明方案是可行的。
老师提供了以下几个思考问题:
- 有没有可能,某个矿工平时正常提交share,但真正挖到区块后不提交给矿主而是自己偷偷发布出去,从而避免他人分走挖矿所得到的出块奖励?
事实上,这种情况是不可能的。因为每个矿工挖矿任务是矿主分配的。矿主组装区块,交给矿工计算,而区块中铸币交易的收款人地址是矿主,如果矿工修改该地址,计算的nonce值也会作废。
- 有没有可能矿工捣乱?平时提交share,等挖到后扔掉区块,不提交?
这种可能是有的,如果矿工本身仅仅想捣乱,是可以这么做的。但扔掉区块后,对其本身来说,也没有相应的奖励获得,看似是损人不利己的情况。但是,矿池之间存在竞争关系。有可能为了打击竞争对手,会派出矿机加入竞争对手矿池挖矿,从而起到搞破坏的作用。即只参与其他矿工挖矿分红,自己挖到的区块却丢掉不给他人分。
3.如果有矿池集中了51%算力,可以做什么?
- 分叉攻击:对已经经过6次确认的交易分叉,利用51%算力将交易记录回滚。
- 封锁交易:假如攻击者不喜欢某个账户A,不想让A的交易上区块链,在监听到有其他人将A的交易发布到区块链上时,立刻发动分叉攻击,使A所在链无法成为”最长合法链“。这样,便实现了对A账户的封锁。
- 盗币?:这个是不可能的,因为其并没有他人账户私钥。如果依仗算力强,强行将没有签名的转账发布到区块链,正常节点不会认为其合法,这样,即使这条链再长,其他人也不会认为其是最长合法链。