引言为了写一篇关于NFT的文章,有必要引用一些关于区块链防篡改的技术细节,于是发表了一篇几年前写的相关文章。
文中部分内容已经过时,请见谅,但底层技术并没有改变。
虽然虚拟货币和NFT的妖风已经过去,但底层设计仍然令人惊叹。也欢迎有兴趣的朋友一起交流。
正文比特币是一个完全开放的去中心化的金融体系,在全球黑客无时无刻的攻击下仍能安全稳定运行(除了2010年的一次大整数溢出漏洞攻击),用事实证明了比特币体系的安全性和稳定性。
这套完整的防篡改安全系统是其最大的安全保障。让我们逐步揭开比特币的防篡改特性,体验比特币设计的奥秘。
非对称加密算法首先我们来回顾一下非对称加密的概念:非对称加密有一对密钥,分为公钥和私钥,两者是一一对应的关系。
顾名思义,公钥就是公钥,私钥必须严格保管。一旦暴露,将和银行卡密码被知道一样可怕。
公钥和私钥有两种用法:
一种是用公钥加密数据,用私钥解密数据:
如果汤姆要给杰瑞发消息,杰瑞会先把自己的公钥发给汤姆,汤姆通过杰瑞的公钥把明文数据加密成密文。只有Jerry的匹配私钥才能将密文解密成明文。即使有人截获了杰瑞的公钥,也只能用来给杰瑞发送加密数据。没有杰瑞的私钥,还是无法破解汤姆和杰瑞之间的通信密文。
另一种用法是私钥签名和公钥验证:
现在,反过来,杰里想给汤姆传递一个信息。为了确保没有人篡改消息,Jerry用私钥在明文数据上生成一个签名(一串字符),并将签名和明文数据发送给Tom。Tom收到明文消息后,首先用Jerry的公钥验证签名是否正确。如果有人中途篡改消息,签名就不会通过,汤姆就会知道消息被中途篡改了。当然,我们可以让汤姆和杰里互相交换他们的公钥,这样他们就可以对通信进行加密和验证,确保双重安全。
目前,我们常用的非对称加密算法有RSA、ECC、SM2等。
比特币使用ECC椭圆曲线加密算法。用户发起的每个事务都需要自己的私钥进行签名。每个参与记账的节点都可以通过用户的公钥验证交易是否正确,信息是否被篡改。这就完成了比特币防篡改的第一步——单笔交易防篡改。
那么为什么交易信息不加密呢?
那是因为参与记账的每个节点都需要验证交易的正确性和完整性。目前比特币参与记账的节点超过40万个,这意味着交易需要用40万个公钥加密40万次。这种计算量和时间消耗是难以承受的,而且会影响记账节点的扩展性。所以目前比特币系统中的所有交易都是明文,但是匿名性弥补了安全性的不足。
当然,这种不足是有解决办法的。请参考“零知识证明”、“同态加密”等相关知识,此处不赘述。
此外,由于比特币交易的匿名性,私钥签名成为唯一身份。如果私钥丢失了,就无法证明比特币是你的,你的比特币就不再属于你了。
Merkle树结构上述比特币通过密钥签名完成了交易篡改的第一道防线。比特币交易信息的存储单位称为区块,一个区块包含多次交易(具体数量与交易频率和交易数据大小有关)。那么,区块如何防止篡改呢?答案是Merkle算法。
如图所示,默克尔树包含一个根节点、多级中间节点和叶节点。事务信息位于叶子节点,将一个块中的n个事务两两聚合进行哈希运算,运算结果作为Merkel树的中间节点,中间节点再次两两聚合进行哈希运算,最终生成唯一的根节点Merkle Root。
默克尔树的特点是,当任何一个叶子节点发生变化时,这种变化都会影响上层的哈希运算结果,最终根节点的哈希值经过层层传递也会发生变化。基于这一特性,比特币系统将区块内的所有交易牢牢聚合成一个整体,任何篡改行为都会影响整个区块。
区块链的链结构如上图所示,显示的是Merkel树结构,但是块头中并不只有Merkle Root的值,其他的组件是用来做什么的?
这就要理解俗称“挖矿”的概念了。
挖掘实际上是一种哈希操作。记账节点生成一个块,首先要做的就是计算默克尔树根节点的哈希值。当然,采矿远不简单。为了保持10分钟左右的阻塞节奏(考虑阻塞速度和p2p节点同步),比特币系统会强制记账节点增加计算难度。基于Merkle哈希运算,要求记账节点在根节点的哈希值上加一个随机数,最终得到一个满足特定要求的目标哈希值(比如目标哈希值的前四位必须是0000,也就是难度系数)作为块的ID。
这就需要计费节点不断通过计算生成随机数,以匹配目标哈希值的要求。计算能力越高,越有可能先计算出目标哈希值。
会计节点挖掘的过程就是试图先找到满足难度系数的目标哈希值的过程。第一个记账节点(挖矿的矿工)计算出目标Hash并通过其他记账节点验证后,会得到系统奖励的比特币,完成整个挖矿过程。这个过程消耗了大量的计算能力,这也是Pow算法被诟病的主要原因。
区块链之所以叫链,是因为每个区块都保留了前一个区块的目标哈希值(创世区块没有前一个哈希值),某个区块的一个事务被篡改。因为默克尔树算法,这个块的目标哈希值会被改变,然后会有连锁反应。基于这个块,后续所有块的哈希值都会发生变化,任何一个记账节点都很容易发现账簿被篡改了(如下图)。这确保了区块链上的所有块都具有防篡改功能。
51%的计算能力攻击上述多重防篡改机制,已经让我们领略到了比特币设计的严谨。很难通过逐环算法的控制篡改账簿。
基于POW算法的比特币系统没有缺陷吗?
事实上,所有基于Pow算法的区块链系统都有一个固有的弱点,那就是著名的51%计算能力攻击。如果有人控制了全网50%以上的计算能力(越多越容易控制整个系统),他可以比别人更快地找到生成块的目标哈希值,所以他实际上拥有决定哪个块有效的权力,可以对自己的交易发起“双花”攻击(51%攻击和双花攻击的概念太复杂了,还会涉及到比特币UTXO的记账方法,这点单独写就够了。本文重点介绍。
这已经不是技术问题,而是游戏问题,因为攻击会让比特币这种去中心化的代币完全失去信用,没有信用背书的比特币会变得一文不值。当一个人以巨大的成本(通过购买矿机或控制别人的矿机)获得50%以上的计算能力,并大量购买比特币时,他不会冒着破坏比特币的风险去攻击整个比特币系统。这样做既伤人又无益,控制一半以上的计算能力已经越来越困难。
当然,比特币的一些分叉系统或者一些更小的使用Pow算法的代币系统,整体计算能力相对较小,实施攻击相对容易,可能不存在安全性。
一个大币圈曾经说过:“区块链的底层是数理逻辑,中层是哲学思维,上层是神学信仰。”上面介绍的比特币反篡改机制,成功地将区块链技术从数理逻辑上升到了充满博弈论的哲学思考,而我却还在区块链技术的底层挣扎,真是悲剧。币圈一日链一年,技术之路漫漫。我愿意和我的旅伴一起鼓励。