区块链之挖矿

区块链之挖矿

    如果我们有一个可信任的*服务器, 那么实现这个系统是一件很简单的事情; 就按照需求所描述的去编写代码即可,把状态记录在*服务器的硬盘上。 然而,与比特币一样,我们试图去建立一个去中心化的货币系统, 所以,我们需要把状态转移系统和一致性系统结合起来,以确保每个人都同意这交易的顺序。比特币的去中心化的一致性处理进程要求网络中的节点连续不断的去尝试对交易进行打包,这些被打成的包就称为“区块”。 这个网络会故意的每隔10分钟左右就创建一个区块, 每一个区块里都包含一个时间戳,一个随机数,一个对上一个区块的引用 ,和从上一个区块开始的所有交易的列表。随着时间的推移,这会创建一个持久的,不断增长的区块链,这个区块链不断的被更新,使其始终代表着最新的比特币总账的状态。
在这个范例中,用来验证一个区块是否有效的算法如下:
1. 检查其引用的上一个区块是否存在并且有效.
2. 检查这个区块的时间戳是否大于上一个区块的时间戳 并且小于2小时之内
3. 检查这区块上的工作证明是否有效.
4. 让 S[0] 成为上一个区块的最末端的状态.
5. 假设 TX 是这个区块的交易列表,且有 n 个交易。 做for循环,把i从0加到到n-1, 设置 S[i+1] = APPLY(S[i],TX[i]) 如果任何一个应用(APPLY)返回错误,则退出并且返回。

6. 返回true,并且把 S[n] 设置成这个区块最末端的状态。

   从本质上说,区块中的每一个交易都必须提供一个有效的状态,从交易执行前的标准状态到执行后的一个新的状态。 注意,状态并没有以任何方式编码进区块中;它纯粹是一个被验证节点所记住的抽象,并且它只能用来被从创世区块起的每一个区块进行安全的计算,然后按照顺序的应用在每一个区块中的每一次交易中。此外,请注意矿工把交易打包进区块的顺序是很重要的; 如果一个区块中有2个交易A和B,B花了一个由A创建的UTXO, 那么如果A比B更早的进入区块,那么这个区块将是有效的,不然就是无效的。

  在上述列出的验证条件中,“工作证明” 这一明确的条件就是每一个区块的2次SHA256 哈希值, 它作为一个256位的数字,必须小于一个动态调整的目标值。这样做的目的是为了让创建区块的算法变难, 从而,阻止幽灵攻击者从对它们有利的角度出来,来对区块链进行整个的改造。因为 SHA256 被设计成一个完全不可预测的伪随机函数, 这创建一个有效区块的唯一的方法只有是不断的尝试和出错, 不断对随机数进行递增,然后查看新的哈希值是否匹配。

  假设网络中平均每隔10分钟就会有一些节点产生出一个新的区块。为了补偿这些矿工的计算工作, 每一个区块的矿工有权要求包含一笔发给他们自己的12.5BTC(不知道从哪来的)的交易。另外,如果任何交易,它的总的输入的面值比总的输出要高,这一差额会作为“交易费用”转给矿工。顺便提一下,对矿工的奖励是比特币发行的唯一途径,创世状态中并没有比特币。

  为了更好的理解挖矿的目的,让我们来检测一下,当恶意攻击发生时会发生什么. 由于比特币的底层的加密技术众所周知是安全的,所以这攻击者的目标将是比特币系统中的某个部份,那就是没有被密码直接保护的:交易的次序。攻击者的策略其实很简单:
1. 发送 100 BTC 到一个商人,以兑换一些商品 (最好是快速交易的数字商品)
2. 等待商品的发货
3. 创建另一个交易,发送同样的 100 BTC 给自己
4. 尝试让网络相信他发给他自己的那个交易是最新出现的。
一旦步骤 (1)发生, 几分钟后,一些矿工就会把这个交易打包进一个区块, 假设声明该区块编号是 270000. 大约一个小时后, 在那个区块之后又会有新增的五个区块添加到区块链中, 这五个区块都间接的指向了那个交易,从而“确认”了那交易是真的。在这一刻,商家接收到了货款,并且发出了商品; 因为我们假设是一个数字商品,所以攻击者能立刻就收到货。现在攻击者创建另一个交易,向他自己的另一个账户发送这100 BTC 。如果这个攻击者只是简单的释放了这个交易,那么这个交易将不会被执行; 矿工将会尝试运行 APPLY(S,TX) ,注意那个 TX 消耗一个在以太坊状态中已经不存在的UTXO。因此,这个攻击者创建了一个比特币区块链的“分支” , 开始挖取区块270000的另一个版本,这个版本指向同样的区块269999作为一个父亲,但是用这新的交易替换了旧的。因为这区块的数据是不同的 , 这就需要为相关的区块重新做工作证明。 此外,这个攻击者的新的版本的区块270000有一个不同的哈希,所以这已存在的区块 270001 到270005 不会指向它; 因此, 这原来的链和这攻击者的新链是完全独立的。区块链的规则是:在分支中最长的区块链链将会变成真正的链,所以合法的矿工将会继续在270005这条链上工作,同时攻击者自己一个人单独的工作在新版本的270000这条链上。为了让攻击者他自己的区块成为最长,他需要的计算能力比其他网络的总和还要多(“51%攻击”)。比特币的区块依赖之前所有区块的哈希。一个拥有巨大计算能力的攻击者可以重新设计工作的证明(PoW),并最终获得大量的比特币。