区块链技术在当下的火爆程度不必多说,比特币作为中本聪大神的“亲儿子”,自然是研究区块链技术绕不开的话题。比特币是一个完全开放的去中心化的金融系统,时刻暴露在全球黑客攻击之下仍能安全稳定的运行至今(除了在2010年遭到一次大整数溢出漏洞攻击),用事实证明了比特币系统的安全性和稳定性。这其中一整套完整的防篡改破坏的安全体系是其最大的安全报障,下面我们就来逐步揭开比特币防篡改特性的面纱,体会一下比特币设计的奥妙。
- 非对称加密算法
首先我们先复习一下非对称加密的概念:非对称加密都有一对密钥,分为公钥和私钥,两者是一对一的关系。公钥顾名思义是可以公开的密钥,私钥必须自身严格保存,一旦暴露就相当于银行卡密码被人知道一样的可怕后果。
公私钥有两种用法:
一种是公钥加密数据私钥解密数据:Tom要给Jerry发信息,Jerry先将自己的公钥发放给Tom,Tom通过Jerry的公钥将明文数据加密成密文,只有Jerry相匹配的私钥才能将密文解密成明文,即使有人截取了Jerry的公钥,也只能用于给Jerry发送加密数据,在没有获得Jerry私钥的情况下,依旧无法破解Tom和Jerry的通信密文。
图01
另外一种用法是私钥签名公钥验签:现在反过来Jerry要给Tom发信息,Jerry为了保证发送信息没人篡改过,于是Jerry就用私钥对明文数据生成了一个签名(一串字符),将签名和明文数据一起发送给Tom,Tom收到明文消息后,先用Jerry的公钥验证签名是否正确,如果中途有人篡改信息,验签将无法通过,Tom就知道消息被中途篡改过。当然,我们可以让Tom和Jerry相互交换各自的公钥,这样就可以对双方通信时都既加密又验签,保证双重的安全性。
图02
目前我们常用的非对称加密算法有RSA、ECC和国密SM2等算法。比特币采用的是ECC椭圆曲线加密算法,用户发起的每笔交易都需要自身的私钥做签名,每个参与记账的节点都可以验证交易是否正确并通过用户的公钥验签信息是否被篡改过。这就完成了比特币防篡改的第一步--单笔交易防篡改。那么为什么交易信息不加密呢?那是因为每一个参与记账的节点都需要验证交易的正确性和完整性,目前比特币参与记账的节点超过40万个,也就是需要用40万个公钥对交易加密40万次,这个计算量和耗时都是不能承受的,而且会影响记账节点的扩展性,所以目前比特币系统中的所有交易都是明文的,但是匿名性弥补了安全方面的不足。当然,这方面的不足也有解决方案,请参考“零知识证明”、“同态加密”等相关知识,在此不做细述。
另外,因为比特币交易的匿名性,私钥签名就成为了唯一的身份标识,如果私钥丢失,就无法证明比特币是你的,你的比特币也就再也不属于你了。
- Merkle树结构
上述比特币通过密钥签名完成了交易防篡改的第一道防线, 比特币交易信息的存储单位称为区块(Block),一个区块包含多笔交易(具体笔数和交易频次、交易数据大小有关),那么一个区块又是如何防篡改的呢?答案就是Merkle算法。
图03
如图所示,默克尔树包含一个根节点(Merkle Root)、多层次的中间节点和叶子节点。交易信息位于叶子节点,一个区块中的N笔交易被两两聚合进行Hash运算,运算结果作为默克尔树的中间节点,中间节点再次两两聚合进行Hash,最终生成唯一的根节点Merkle Root。默克尔树的特性在于,任意叶子节点发生改变,改变都会影响到上层的Hash运算结果,最终经过层层传递,根节点的Hash值也将发生改变,基于此特性,比特币系统牢牢的将区块内的所有交易聚合成为一个整体,任何的篡改行为都会影响到整个区块。
- 区块链的链式结构
图03所示,展示了默克尔树结构,但是区块头中不只有Merkle Root的值,其他的组成部分又是做什么用的呢?这就要来了解一下俗称“挖矿”的概念了。挖矿其实就是Hash运算,记账节点在生成区块的时候,首先要做的就是计算默克尔树根节点Hash值,当然挖矿远没有那么简单,比特币系统为了维持10分钟左右的成块节奏(考虑成块速度和p2p节点同步问题),会强制让记账节点增加计算难度,在Merkle Hash运算基础上,要求记账节点在根节点Hash值基础上增加一个随机数,最终得到一个符合特定要求的目标Hash值(如目标Hash值的前4位必须是0000,也就是难度系数)作为该区块的ID。这就需要记账节点不断的通过计算生成随机数去匹配目标Hash值的要求,谁的算力越高概率上越可能优先计算出目标Hash值。记账节点挖矿的过程就是争取最先找到符合难度系数的目标Hash值的过程,第一个计算出目标Hash的记账节点(挖到矿的矿工)并且获得其他记账节点验证通过后,会得到系统奖励的比特币,完成整个挖矿过程,这个过程耗费了大量算力,也是Pow算法被人诟病的主要原因。
区块链之所以称为链,是因为每一个区块都保存了前一区块的目标Hash值(创世块没有前一Hash值),某一个区块的某一笔交易发生篡改,因为默克尔树算法的作用这个区块的目标Hash值就会被改变,然后就会连锁反应,以这个区块为基础的,后续所有区块的Hash值都会发生变化,任一记账节点都可以轻易的发现账本被篡改(如下图04)。这样就保证了区块链上的所有区块都具备了防篡改功能。
图04
- 51%算力攻击
上述的多重防篡改机制已经让我们领略了比特币设计的严谨性,通过一环套一环的算法控制,账本很难被篡改。那是不是基于POW算法的比特币系统就毫无破绽呢?其实针对所有基于Pow算法的区块链系统,都有一个天生的弱点,那就是著名的51%算力攻击。如果有人控制了全网超过50%的算力(超过越多越容易掌控整个系统),他就能够比其他人更快地找到生成区块的目标Hash值,因此他实际上拥有了决定哪个一区块有效的权力,他就可以对自身的交易发起“双花”攻击(51%攻击、双花攻击概念太过复杂,还会牵扯到比特币UTXO的记账方式,足以单独成文,本文重点介绍防篡改机制,所以略过不表,网上有很多专门论述的文章),简单描述就是可以做交易不花钱。这已经不是技术问题了,而是一个博弈问题,因为攻击会造成比特币这种去中心代币彻底失去信用,没有信用背书的比特币将变得一文不值。当一个人花费巨大代价获取到超过50%的算力(通过购买矿机或者控制其他人的矿机),并且购置了大量的比特币时,就不会冒着毁灭比特币的风险去攻击整个比特币系统,这样做伤人伤己,没有任何好处,而且以比特币目前的算力体量而且仍然在不断增长,想控制超过半数的算力已经变得越来越困难。当然比特币的一些分叉系统或者一些较小的采用Pow算法的代币系统,整体算力比较小,实施攻击相对容易,可能就没有安全了。
有位币圈大佬曾经说过:“区块链底层是数学逻辑,中层是哲学思想,上层是神学信仰”。上述介绍的比特币防篡改机制已经将区块链技术成功从数学逻辑上升到充满博弈论的哲学思想,而杯具如我还在区块链技术底层苦苦挣扎。币圈一日链圈一年,技术之路长路漫漫,愿与同路人共勉。
原文地址:https://www.cnblogs.com/neomeister/p/9392149.html