上一篇文章中介绍了区块链的概况,提到了区块链是一个点对点的分布式网路系统,其中数据的存储以一个个区块相连的区块链的形式存储,区块链系统中的所有节点共同维护一条正确的唯一的公链,已达到去中心化的目的。但是,对于区块链分布式系统来说,如何维持各节点的一致性已确保系统能正确无误地运行是一个必须要解决的挑战。
下面以比特币为例,来分析一下比特币系统是如何运行以及解决各节点的一致性问题的。比特币的运行机制可以总结成以下三点:
1. 使用数字签名来确保交易的有效性
2. 每个节点均有记账权来实现去中心化
3. 通过PoW共识机制实现区块链的一致性
使用数字签名确保交易的有效性
在比特币系统中,账户是以“钱包地址”的形式体现的,所有转入并且没有被重新话费出去的比特币总和就构成了这个“钱包地址”的“余额”。
一笔比特币的交易中,会包含转出地址(可以理解为比特币账户)和转出金额的信息,但是系统要怎样确定交易中填入的这个地址是转出人拥有的有效地址同时又有足够的未花费余额呢?这就需要引出介绍比特币地址的生成过程和加密算法。
首先说说比特币钱包地址的生成过程:
1. 通过随机数生成器生成一个256bits的数,这个数就是私钥,拥有这个私钥就等于拥有相应的比特币地址中比特币的一切操作权,因此理论上私钥只由比特币地址的拥有者拥有,不能泄露。
2. 通过私钥非对称加密生成公钥,这里使用的非对称加密算法是SECP256K1,一种椭圆曲线算法。由于是非对称加密,也就是说无法直接通过公钥计算出私钥,因此公钥可以公布全网,其他节点可以使用公钥来验证一笔交易的有效性。
3. 得到上一步的公钥后,将公钥通过SHA256哈希算法处理得到32字节的哈希值,后对得到的哈希值通过RIPEMD-160算法来得到20字节的哈希值,把版本号+Hash160组成的21字节数组进行双次SHA256哈希运算,得到的哈希值的头4个字节作为校验和,放置21字节数组的末尾。这样就组成了25位的公钥哈希。
4. 然后对公钥哈希进行Base58编码就得到了最终钱包地址,公钥哈希和钱包地址可以通过Base58的编码和解码进行相互转换,因此可以认为公钥哈希等价于钱包地址。钱包地址将用于填写交易中的转出方和转入方。
从上面钱包地址生成的过程可以看到,通过私钥可以计算出公钥、公钥哈希和钱包地址,而只通过公钥则可以计算出公钥哈希和钱包地址。因此,生成一笔交易时,除了要包含交易本身的信息,同时还需要交易的转出方使用私钥对交易进行数字签名,以证明转出方真的拥有使用这个转出地址余额的权利,同时还需要附加转出地址的公钥,以便其他节点验证交易中的转出地址是否正确。
至此,用于确保交易有效性的非对称算法机制就介绍完啦。
每个节点均有记账权来实现去中心化
一个交易产生后会被广播至全网,理论上这个时候系统中所有的节点都有记录这笔账的权利,最终获得记账权的节点将上一个区块产生之后系统发生的所有经验证有效的交易打包成一个新的区块加入到区块链的尾部,然后将最新的区块链同步到隔壁节点,隔壁节点再向外扩散直至全网,这样就完成了一次记账的过程。
那么问题来了,如果每个节点有点记账的权利,那么具体某一个区块的记账节点又是如何挑选出来的,同时如果每个节点都有记账权,系统又是如何防止有恶意节点故意制造出错误的分岔区块链呢?这就引出下面的第三点内容,PoW共识机制。
通过PoW共识机制实现区块链的一致性
PoW,全称Proof of Work(工作量证明),是比特币和以太坊选用的用于保证系统一致性的共识机制。系统会给出一个哈希值的要求(比如说规定哈希值开头的0的个数),候选记账节点需要去穷举计算出符合要求的哈希值,最先计算出来的节点就获得了当次的记账权,而其他节点在这段时间的计算结果就作废了,这样就确保了每次只会有一个有效节点进行记账,从而避免了区块链分拆的问题,之后每一个新区快的产生都会重复这个过程。比特币系统会根据目前系统的总算力来自动调节哈希值的计算难度(比如说规定哈希值开头的0的个数),以此保持系统大约每10分钟产生一个新块。由于比特币是分布式系统,所以保持每10分钟出一个块,可以给各节点同步数据预留足够的时间,避免由网络延迟等原因导致的各节点间数据不一致的问题。
由于哈希函数的特性,使得PoW机制中哈希值没有规律可循,只能通过穷举的方式来计算。因此单个节点获得记账权的概率跟它的算力成正比,所以假设系统中大部分节点都是正常运行的好节点,那么如果有坏人想搞破坏,他就需要拥有至少全网51%以上的算力才有机会控制记账权,强行记错误的账到区块链上。然而,目前比特币全球已有上万个节点,因此想要拥有超过51%的算力是一件很困难的事情,而且PoW的计算过程十分耗电,因而当大多数节点是好节点的情况下,搞破坏的成本是十分高昂的。
那又怎么能保证系统中大多数节点都是好节点呢?这就是通过奖励机制来保证的,节点计算出目标哈希值,获得记账权并完成记账后,不仅可以获得交易中的手续费,同时也会获得系统额外生成的巨额比特币奖励,因此,PoW的哈希计算过程,也被称为“挖矿”。
总结一下,因为有奖励机制,所以系统中绝大多数节点都是好节点,好节点越多,坏节点想搞破坏的成本就越高,搞破坏的收益甚至低于它老老实实挖矿的收益,还不如当个好节点,老老实实地挖矿。比特币系统也因此得以稳定地运行至今。
参考资料
【深入浅出区块链】相关课程