区块链


 结构

区块链是一个公共账本、公开的数据库,同时也是一个点对点的协作网络。协作方(节点)共同维护数据,每个节点都有一份完整的数据备份,所有节点的数据内容必须完全一致,每个节点都可以在本地查找交易记录,每个节点也可以在本地添加交易。

这里简单介绍一下区块链以及区块的结构,更多信息,见《区块链-区块结构》。

1  区块链结构

区块链是由一个个的区块连接起来组成的;每一个区块包括区块大小、区块头、交易列表、交易计数器组成;每一个区块头包括版本、前一个块的hash、merkle root、时间戳、难度系数、随机数组成;事务列表包括CoinBase交易和普通交易。如下所示:

区块链

 

2  区块示例

从公共账本中我们可以看到整个区块链的所有信息,地址:https://www.blockchain.com/zh-cn/explorer

1)   摘要

区块链

 

Height是用来标示区块在区块链中的位置。区块链中每加一个区块,高度+1。注意Height并不是唯一标识符,当区块链出现临时分叉时,会有两个区块的高度值相同的情况。

 

2)   交易信息

区块链

 

 

 区块链生成

区块的生成过程就是矿工挖矿的过程。简单而言就是:有权打包交易的节点,将打包的交易(区块)放在既有的数据库(区块链)上,并向全网广播,其他节点收到信息,验证区块无误,就会同步这个新打包的交易。每个打包的交易叫作一个区块,区块不断叠加,形成区块链。其流程如下:

区块链

1  监听交易广播

矿工接入区块链网络以后,第一件事是从其他节点将区块链的历史记录同步下来,完成这个操作以后,就可以监听网络中的交易信息了。

从区块的数据结构中我们可以看到,每一个区块都存储了大量的交易信息,这些信息就是矿工在此环节监听到的有效交易数据。

2  验证交易信息

当节点收到一个交易消息,如果验证通过,会将交易放入一个交易池,并将这个交易信息广播给其他节点。如果节点接收到的交易消息已经存在于交易池中,就不会再把它传播出去,这样就确保一个交易消息不会一直在网络中传播下去。

此过程主要验证一下内容:

  -  验证交易在当前区块链中是有效的,节点会针对每个前序交易的输出运行核验脚本,确保脚本的返回值为真。这一阶段最重要的目的是确保交易的输入是UTXO。

  -  检查是否有双重支付。

  -  校验此交易是否已经被本节点接收了。用于防止交易消息在网络中一直传播。

  -  节点只会接收和传播在白名单上的标注脚本。

说明:自动2013年起,矿工的省却行为变成了:费用替代策略,即节点在遇到有冲突的交易时,会将交易手续费更高的交易放进自己的交易池,把交易手续费低的踢出去,不过这种策略是可以更换的。不过现实中的策略会更加复杂一些,不是所有的交易都需要支付服务费,而且也会考虑到账龄信息,有兴趣可以看看相关内容,这里暂不讨论。

 

3  组装备选区块

将交易池中的交易进行组合并放进一个新的区块,确保其中的所有交易都是有效的。

比特币网络中,每10分钟左右产生一个区块,一个区块大小为1MB,每个交易最小250字节,所以一个区块最多不超过4000条交易记录(一般来说一个区块大概保存2000左右条交易记录),那么如果网络在10分钟内网络中的交易数据超过4000条时,矿工如何组装交易生成备选区块呢?矿工组装备选区块的原则是:优先将服务费高的交易打包为备选区块。这么做的原因是鼓励矿工挖矿,即:谁出的钱多,矿工就优先为他们服务,这是一个非常符合经济利益的举措。

4  生成有效区块

生成备选区块后,需要进行hash运算,找出一个合适的随机数,让这个备选区块成为一个有效的区块,这就是我们经常听说的工作量证明,原理如下:

矿机系统中有一个固定的常数;每个区块中都有一个难度系数difficulty,通过他们可以算出一个目标值target(target=固定的常量值/difficulty)。区块的头部中有一个随机字符串Nonce,矿机每次对头部信息进行hash计算,如果hash结果小于target,那么认为是有效区块,可以进行后续添加区块的操作;如果hash结果不小于target,那么认为是无效区块,修改nonce后重新计算hash。

Nonce是一个32位的二进制数字,因此它的取值范围就是0到21.47亿。那么命中target其实就是一个穷举的数学过程了,一个矿机可能幸运很快算出来,也有可能算满了21.47亿次都不能命中,这时候框架就得重新同步区块链数据,重新计算。

如果计算到一个有效区块,对于当前节点而言,会将当前区块挂在当前节点的区块链的后面。

5  广播区块

当矿工生成一个有效区块后,就可以将这个区块广播出去了,目前矿工的工作动力主要来自两个方面:挖矿奖励、交易服务费。越早算出一个有效区块,越早公布出去,就越有可能被其他节点接受并认可,这样就越有可能获取当奖励和服务费。

不过这也不是必定的事情,如果有兴趣可以翻阅一下:临时保留区块攻击。

6  验证区块

校验一个区块要比校验一笔交易复杂很多,除了检查区块头部,确认hash值在一个可接受的范围(即校验随机数满足生成备选区块的条件),还必须确认区块里的每一笔交易的合理性,最后确保此区块必须是最长链上新加入的区块。

最后一步是为了防止区块链分叉,关于分叉是一个比较复杂的内容,后面找时间详细讲述。

 

7  加入区块链

对于非生成此区块的节点,在通过“验证区块”这一步骤以后,就可以将这个区块挂到区块链的尾部了。

在去中心化的点对点网络中存在很多异常和不可靠的场景,例如:网络延迟、重复支付等,所以一个区块加入链尾后,并不代表着高枕无忧了,还要等待一段时间,方可在全网中达成共识。

举一个异常的场景:当矿工A计算出一个有效的区块(Block A)时,矿工B也生成了一个有效的区块(Block B),如果A所在的网络延迟比较大,即便是周围有一些节点认可了A节点生成的区块Block A,但是全网中绝大多数节点认可了Block B,并在Block B的基础上继续挖矿,产生更长的链,那么Block A对应的区块将会被舍弃。

 

三  共识机制

区块链是一个去中心化的点对点网络,在这种网络中必须解决各个节点间的共识问题。在区块链的网络中的共识机制的核心是:按照既定规则参与协作,代码代替权威,奖励协作者,博弈驱逐破坏者。

1  谁有权向区块链中添加新区块?

目前有多种机制,不过最常见的是:POW, POS和 DPOS。

1)   POW (Proof of Work) 工作量证明

在上面讲述生成有效区块的过程,其实就是工作量证明的过程。每个节点都去计算一个随机数,让他满足hash值小于target(target=固定的常量值/difficulty),这个过程其实是一个枚举Nonce的过程,需要大量的工作量计算。最先得到这个随机数的节点,将打包的交易区块添加到既有的区块链上,并向全网广播,其他节点验证、同步。

 

2)   POS (Proof of Stake) 权益证明

POS是系统根据节点持有的Token(代币)的数量及时间的乘积(币天数)分配相应的记账权,拥有的越多,获得记账权的概率越大。Token就相当于区块链系统的权益(Stake),因此被称为基于权益的证明。

3)   DPOS (Delegated Proof of Stake) 权益授权证明

POS是拥有Token就拥有获得记账的权利,而DPOS是指拥有Token的人投票给固定的节点,这些节点作为权益人的代理去行使记账的权利。这些获得投票认可的代表根据一定的算法依次获得记账权。不同于POW和POS理论上全网都可以的参与记账竞争,DPOS的记账节点在一定时间段内是确定的。

 

2  如何确保每个节点上的区块链都是一致的?

由于各个节点都在自发地记账或者同步,在点对点相互通信下的情况下存在较高的网络延迟,因此各个节点收到数据的先后顺序是不一致的,那么如何保证每个节点副本数据的一致性?

区块链的共识是:以最长链作为主链,每个节点总是选择并尝试延长主链,也就是各节点都以区块最多的那条链上添加区块,即大家都在主链上继续挖矿。

当多个矿工同时算出一个有效区块,谁能成为最终的共识区块,基于最长链原则这取决于新区块后面能否尽快产生新的有效区块,新的有效区块后越快产生新的区块,那么对应的链就越长,这个有效区块就越可能成为最终的共识区块,这条链也就越可能成为主链。最终其他的链上的那些区块会被废弃,同步主链数据,保持和主链一致。

 

3  如何让矿工有动力持续挖矿?

比特币奖励和服务费奖励。

 

4  如何防止他人恶意破坏?

去中心化最根本的特征在于,消除了信息的不对称!而犯罪的根源则在于,利用信息的不对称进行作恶。如果大家掌握的信息相同,我便不会铤而走险去做损你利我的事情,因为这在比特币网络中将带来最差的结果,即损人不利己!

比特币并不是一个零和的游戏,比特币的技术原理以及激励机制引导了参与者的博弈偏向,它激励人们为了利益去做诚实的事情,去维护并促进整个比特币网络的健康发展。在比特币网络中,做诚实的事情相比作恶更简单(技术因素),做诚实的事情更可能会得到奖励(非技术因素)。

如果想攻击比特币,那么主要有两个方式:操纵比特币生成,双花问题(一笔钱花多次)。

如果想操作比特币生成,那么需要掌握比特币网络中51%的算力,虽然理论上可行,但实际上成本非常之高,从目前看来基本上不太现实。

对于双花问题,各个矿工收到交易信息以后会检查交易的合法性,确保每个交易只会使用一次,即所有交易的输入必须是UTXO的。如果要操作区块链中交易,破坏原有的规则,必须掌握51%的算力,而且这种破坏的收益很低,绝大多数情况下收益远不够补偿这些矿机消耗的电力成本。

最差情况,如果真的有人或机构能够操纵比特币了,那么大家必然对比特币失去信任和信心(如果你账户的钱能够被人随意修改,你还能相信这些钱具有价值么?),比特币的价值也就不存在了。

 

 

 

上一篇:Linux学习记录--服务


下一篇:怎么在eclipse虚拟机上安装apk