bitget消息:
假如你手里有比特币,而且知道你手里的比特币就像银行卡里的钱一样,邦定了你的卡号(比特币地址),只有你才能用手里的密码(比特币私钥)签名授权一笔交易。唯一与银行不同的是其他人能看见你所有的资产,不过其他人没有办法调动一丝一毫,除非拿到那个密码——私钥。
可是,既然区块链本质上是个公开的、人手都可以一册的大账本,如果有人篡改了我的某个交易怎么办?如果有人改掉了我的25天前那笔支付给我25比特币,找零回去0.25比特币的交易,改成了支付给我0.25比特币,找零25比特币,那我岂不是要损失好几十万?
这个担心一定很多人都有,目前却一次都没有发生,而且越研究比特币的区块链技术你就会越不担心这件事。
那么,区块链这项技术是如何做到把一个账本明明白白摆在所有人面前,却没人能能够修改里面哪怕一个标点符号的呢?
要想理解区块链为什么无法被篡改,首先要先了解下面两个与区块链相关的非常重要的概念:
SHA256
一种国际公认的优秀加密算法,输入是任意长度的数据,输出总是256位的值,这个值通常我们称之为哈希值,输入值的任何微小的变化都会产生不同的输出。
举个例子,比如说这个256位的哈希值大小代表你跟某样东西之间的距离。原始的哈希值是你跟前面那颗树的距离,你小小的修改了一笔交易的数据,把划给你的值增加了1聪,也就是10的负8次方那么小,结果新生成的哈希值会变成你跟土星环上一颗陨石之间那么远。实际上这个变动会更夸张,弄不好要跨越整个银河系。
注:当下文提到”某某的哈希“时,指的是以某某为输入,经过SHA256算法后生成的256位哈希值。
梅克尔树
一种树状数据结构,比特币的区块链使用了二叉树。
这个二叉树的每个节点都对应一个哈希值:最底层的节点是每笔交易的哈希,第二层的每个节点都是它下方两个哈希拼接后经过SHA256算法后生成的哈希,依次类推直到最顶端只剩一个节点,我们称这个节点为梅克尔根。
回顾下SHA256算法的特性,任何微小的输入变动都会引起输出值剧烈的变化。也就是说,交易记录中的任何变化,哪怕只把输出值增加了1聪,都会引起那次交易哈希翻天覆地的变化,这个变化会影响到第二级的哈希,进而一级一级顺着梅克尔树传递到梅克尔根。
为什么会说篡改很难?
首先,从数据结构上看。
大致上一个区块包含了区块大小、区块头、交易数量、交易数据四个部分。其中交易数据被组织成了梅克尔树结构,区块头中包含了上一个区块的区块头部哈希和本区块中的梅克尔根。
由于区块拥有了这样的组织结构,区块内部的任何交易信息的改动,总会引起梅克尔树根的哈希值变化,进而包含了梅克尔根的区块头会发生变化,最终导致区块头的哈希发生变化。
如果进行了篡改,下一个区块中包含的前一个区块哈希将会跟篡改后的值不匹配。为了不让人发觉本区块的篡改,他必须修改掉后一个区块的头部信息。后一个的后一个头部信息也将需要修改,依次类推,一旦修改了某个区块,后续所有的区块都需要修改才能确保修改的不会被发现。
每一个区块的修改都是是一个非常艰巨的过程,因为区块的生成还需要一个非常特别的东西:工作量证明。
什么意思呢?就是说区块的生成是要消耗工作量才能完成的,实际上这个消耗非常巨大。
那么这个工作量证明到底是怎么回事?
你可能还记得区块头的哈希值这个概念,区块链技术对这个256位哈希值会有一个要求,就是这个值必须小于某个上限。回顾SHA256这个算法的概念,你会发现,输出的哈希值是非常随机的,如果需要把结果落入特定的范围,需要不停的修改输入进行尝试,直到输出满足要求。在区块链中,在区块的头部有一个32位的随机量可以修改,以完成调整最终哈希的目的。
当前,满足小于这个上限值要求的难度有多大呢?一个专用的顶级矿机(一种专门用来计算哈希的计算设备),需要平均工作14个月才能找到一个合适的目标哈希。每修改一个区块,中间消耗的电量和时间估计都会超出被修改的账单中的获益,更不用说还需要修改很多个。
甚至,这个修改完成后,还有一个更艰巨的任务,就是黑掉全世界51%以上的区块链备份电脑。否则,即使你的账本修改的很完美,但是跟其他大部分人的不一致,那这个修改也毫无作用。
那么,篡改交易信息的意义又是什么?