什么是不可变性?不可变意味着某些事物随着时间推移不发生改变或无法改变.
所以在我们的上下文中, 不可变性意味着一旦数据写入区块链, 任何人, 甚至是系统管理员都无法更改它. 这为审计提供了好处. 作为数据提供者, 你可以证明你的数据未被更改. 而作为数据接收者, 你可以确保数据从未被更改. 这对于金融交易数据库很有用.
不变性是相对的. 例如, 如果我向一大群朋友发送一封电子邮件, 那么从我的角度来看, 这些数据是不变的. 要改变它, 我必须说服我朋友们删除各自的电子邮件( 或者说服Gmail和运行存放着我朋友邮件数据的所有邮件服务器的人员 ). 在我看来, 该电子邮件是不可变的在我拥有它的控制权的时候 - 如果没有协作和检测风险, 我不能取消发送或者撤销它.
所以不变性是相对的, 并且涉及改变的难度.
私人数据库对于私人数据库, 终端用户(end-user, 或称最终用户)可能拥有只读权限. 她无法更改该数据库中某一行的内容. 但是, 像系统管理员那样具有 更高特权访问权限的用户可能可以更改数据. 那么我们目前如何应对不听话的系统管理员为了他自己的利益而篡改数据的风险呢? 在现有的系统和组织中, 我们尝试创建责任分离机制, 以使没有任何一个人可以在未被监视的情况下做坏事.
例如, 管理员可能拥有更改数据库的权限, 但日志可能存储在另一个由其他人拥有和管理的系统上. 这些组织系统已经将阻止个人进行变更的行为落实到位. 我们需要相信这种组织体系是有效. 然而, 没有任何控制机制将数据的不可变性放在首位.
下面进入区块链正题.
区块链区块链本质上是数据库, 它具有一些预先商定的技术和业务逻辑标准, 通过点对点协议(peer-to-peer)机制和预先商定的关于可以哪种新数据可以被添加的规则让数据保持同步. 关于不变性, 有两个关键理念有助于让篡改易于检测: 散列(hashes, 或称哈希)和块(blocks).
哈希哈希函数是一种数学函数, 把 数据变成数据的指纹的过程称为 哈希. 它就像一个公式或算法, 接受输入数据( 可以是任何数据, 无论是整个大英百科全书, 还是数字'1' ), 并将其转换为固定长度的散列值输出, 散列值就代表数据的指纹. 哈希函数有很多种类型, 其中有一个通用而强大的哈希函数称为SHA-256( 表示安全哈希算法 - 256位 )
当你将数学函数应用到短语“Hello from Bits on Blocks!”时, 你将得到以下指纹输出: 389f9ef3822e5c88f4b140db82c459064711a52182a3e438b4ebc7ecda62b9bb. 指纹( 389f ... b9bb )被称为输入词组的SHA-256哈希.
一个好的散列函数的两个相关属性是:
- 很难从哈希值反演出原始数据
- 如果输入数据稍有变化, 哈希值将以不可预知的方式变化
哈希是区块链安全性和不变性的基础. 你可以在这里使用他们.
块比特币区块链中的一个重要思想是, 交易在被添加到区块链数据库之前便被捆绑成块. 块中包含一些比特币交易信息( 支付 )以及一些其他数据, 包括前一个块的散列值. 由于每个块都包含前一个块的散列值作为其数据的一部分, 因此会形成一个块链.
使用引用先前的块的块创建分类交易账是比在书账中进行页面编号更好的主意. 在一本用1,2,3等数字编号的书账中, 很容易撕掉第40页并用另一个交易略有不同的第40页替换它. 该书的完整性保持不变, 第39,40,41页依旧是第39,40,41页 - 没有变化. 此外, 页码“40”中没有反映该页面中的任何内容, 页码中隐含着页面的排序.
而在区块链中, 不是引用块号, 而是用它们的散列值引用块, 并且每个块明确指定它正在用于构建的块( 散列 ). 所以它看起来更像是:
- 散列值为66a045b45的块( 使用散列值a2c064616构建块 ), 随后是
- 散列值为8939a3c35的块( 使用散列值66a045b45构建块 ), 随后是
- 散列值为a41f02e92的块( 使用散列值8939a3c35构建块 )
因此, 块通过引用前面块的反映内容的散列值来显式排序, 而不是由与内容无关的编号系统( 1,2,3 )隐式排序.
关键点- 每个块的散列值来自块的内容
- 每个块指向的是前一个块的散列值, 而非一个连续的数字
- 区块链中的数据在内部是一致的, 也就是说, 你可以对其执行一些检查, 如果数据和哈希值不匹配, 毫无疑问, 中间出现了一些修补.
隔离的区块链数据我们先来看看如果你将比特币区块链复制到一个USB存储盘中( 现在大约是55GB, 所以仍然可以很容易地复制过去 )会发生什么情况. 在将其传递给其他人( 如监管机构 )之前, 你可以如何处理这些信息? 你可以改变数据并且骗过他们吗?
比特币的区块链拥有近400,000个区块. 假设你从区块链中200,000(也就是大约一半)的区块中移除一笔交易, 试图假装有一笔付款从未发生. 会发生什么?
1. 块的散列失败
监管者(regulator)在接收USB存储器时可以做的第一件事是根据块数据重新计算所有块的哈希值, 并检查提供的块哈希值是否有效并与每个块的内容是否一致. 若存在差异, 则意味着块中的交易信息与块的散列值不匹配, 意味着块已被篡改. 因此, 为了欺骗监管机构, 你需要重新计算该块的散列, 以使其与修改后的内容保持一致.
2. 链条失效
然而, 这破坏了整条链. 请记住, 每个块都包含前一个块的哈希. 如果块200,000的散列值发生变化, 则块200,001将引用不再存在的块散列值. 块200,001将引用块200,000的 旧散列值, 而不是其 新的散列值. 所以区块链破裂, 这很明显失败了. 要让区块链不遭到破坏, 你需要在被篡改的块之后重新编译和重新哈希每个块, 替换之前的块哈希指针的内容.
但是, 有一些安全措施可以使重建区块链变得非常困难或不可能发生. 这些保护措施分别是基于区块链添加机制和不同规则的区块链, 并且存在两个主要方案: 用于验证工作的公共区块链的目标散列 ; 以及( 一些 )私人区块链的特定签名.
3.区块链难以重建
对于像比特币这样的公开的证明工作(proof-of-work)区块链, 存在挖矿困难的概念. 在比特币中, 只有块散列遵循某个严格的模式, 块才被认为是有效的 - 即散列值必须小于目标数, 通常被描述为“从一定数量的零开始”.
因此, 你不仅需要重新计算块的散列值, 还需要确保重新计算的散列值低于某个数. 你需要通过重复调整块内容的另一部分( 称为随机数 )来 重新挖掘块, 直到找到小于目标数的散列值为止. 这需要一些重要的计算能力. 然后你需要对每个后续块执行此操作. 通俗地说, 你需要从该块开始重新挖掘整个区块链. 鉴于生成满足条件的有效哈希所需的大量计算工作量, 这将会产生问题, 此外, 链中的区块越早, 你需要做的时间越长, 因为你有更多的区块要去重新挖矿.
对于诸如Multichain的私人区块链, 块添加机制往往有点不同, 在块添加者以随机循环方式轮流添加块的情况下设置规则而非依靠大量的证明工作, 并且每个块需要由块添加者进行数字签名. 只有区块链由一组有定义的参与者签署, 区块链才有效且被接受. 这意味着为了重新创建区块链, 你需要知道来自其他块添加者的私钥. 窃取这些密钥对于工作量证明的哈希来说是一个非常不同的挑战.
小结
如果你做了所有这些, 那么USB存储器上的数据就会在内部保持一致并且看起来像一个有效的区块链. 但这只限于对 那些无法对照区块链的其他副本进行检查的人而言.
有多个副本的区块链以上所有内容都假设记忆棒上的数据是监管机构所看到的 唯一版本. 假设你通过移除事务并重新创建全部都符合验证条件的块的哈希值来创建内部一致的区块链.
监管机构现在需要检查区块链的其他副本 - 并检查某一个数字 - 最近区块的散列值. 如果USB记忆棒上最近的一个块的散列值与他们可以从任何其他( 非勾结的 )参与者发现的散列值不同, 那么监管机构可以立即发现有些事情正在发生, USB记录棒上的数据不同于实时区块链上的数据.
监管机构甚至不需要 查看实时区块链中的 数据. 他们只需要查看最近某个块的散列值.
换句话说, 尝试创建虚假区块链非常困难.
更改一个区块链如何尝试更改你参与的区块链中的现有数据? 你会如何尝试得到在一个网络中被其他人接受的修改区块?
由于“最长链”规则是大多数区块链共识的基础, 因此这依旧困难重重. 广义地讲, “最长链”规则就是作为一个参与者, 如果你看到多个有竞争力的有效链, 更愿意相信那个有更多块的链.
因此, 如果你重新播送一个修正后的区块200,000, 你实际上会创建一个比真实链( 其长度为400,000 )短得多的区块链“分支”. 现在有两个互相竞争的区块链, 一个是包含你的修改区块的200,000个区块的区块链, 另一个区块是400,000个区块长的区块链. 现有的节点会接受你的块( 如果它是有效的 ), 但是很快就把它忽略了, 因为他们已经知道存在一个现有的更长的区块链.
唯一的办法是做出改变并创建一个更长的链, 需要大量的计算能力或其他块添加者的私钥( 取决于谁可以添加块, 以及如何添加 ), 并推出一个全新的区块链, 比现有的更长. 你需要大量的计算能力才能胜过像比特币这样的现有工作证明链.
即使你设法做到这一点, 虽然技术上你的新链条是有效的, 但实际上社区会注意到是否有一个区块重新组织后比其他区块链长; 这将会受到调查.
结论在“离线”区块链中更改数据非常困难, 更不用说实时区块链了.
当人们说区块链是不可变的, 不是意味着数据不能改变, 他们意在表明在没有合谋的情况下做出改变是非常困难的. 如果你试图做出改变, 监管者将很容易检测到你的企图. 区块链的这种属性对于存储的数据的安全性具有积极和消极的影响, 而其扩展性也对数据隐私也有影响.