不变性一词已经成为了区块链的同义词。字典将不变性定义为“不可变性”。该词指的是区块链的特征,即写入区块链的任何数据都不能被更改或修改。
如何更好地理解它呢?我们可以将其与谷歌电子表格进行比较。后者具有行和列,您可以随时添加、编辑或删除这些行和列。而当您在区块链中输入任何数据时,除非达成一致协议,否则您不能改动这些数据。因此,虽然区块链中的数据不是100%不可变的,但是需要更改它是非常复杂的。
区块链中不变性是什么意思?
如果区块链非完全不可触摸,为什么它被称为不可变?为了避免混淆和误解,我们需要讨论两个与不可变性密切相关的单词——防篡改和篡改明显。
当某些东西被篡改明显时,每个人都会注意到每一个小变化和修改。另一方面,防篡改意味着物体确实是无法触及的。要找到防篡改的东西是不可能的,因为几乎所有的东西都容易发生变化。然而,有些东西极难被改变。
牙膏就是一个例子。当有人从牙膏管里挤出牙膏时,无论你多么努力地想把管子恢复到原来的状态,都是困难的。
这就是防篡改的意义所在。虽然你可以触摸或改变一些东西,但这很难做到,因为已经做过的改变是非常明显的。区块链也是一样; 因此,我们可以说区块链是防篡改而不是篡改明显。因此,存储在区块链中的任何数据都被认为是安全合法的。
区块链中不变性是如何工作?
既然我们已经确定了区块链是不可变的,因为如果被篡改它会出现很明显的证据,那么下一个问题是: 区块链在多大程度上是不可变的?
为了理解不变性是如何工作的,我们必须讨论哈希。哈希是一组创建数字签名(也称为校验和)的数学操作。它的工作原理类似于您的真实签名,但是您将数字签名附加到任何数字数据上,而不是纸上。
大多数现代编程语言都有各种散列函数。其中之一是安全哈希算法2或SHA-2。在这个哈希函数下,有更多类型的实现,其中最流行的是SHA-256。尝试输入一组字节,哈希函数将产生唯一的校验和。
作为一个例子,让我们使用这三行Python代码,它可以访问SHA-256和其他SHA-2实现。使用这个算法,我们将输入字符串“this is magic”。
>>> import hashlib
>>> h = hashlib.sha256(‘this is magic…’)
>>> h.hexdigest()
‘49240b3cc693fd281422bbcabb5f207ae2
这个hashlib将提供一个由64个字符组成的字符串——不多也不少。无论您的输入是大是小,它都将生成具有相同字符数的校验和。为了证明这一点,让我们输入一个更长的字符串:
>>> h = hashlib.sha256(‘humpty dumpty sat on a wall, humpty dumpty had a great fall’)
>>> h.hexdigest()
‘518e3f99fb2b26b4613c8597b371d11543
如果计算校验和,总共是64个字符,但是校验和是惟一的。惟一性是哈希函数最显著的属性之一。因此,即使您计算两个看起来相同的文件,当您计算它们的数字签名或校验和时,您也会发现是否有任何不同。即使变化很小而且您看不到它,但是哈希不会说谎,它会告诉您差异。
在第一个哈希输入“this is magic…”中,校验和是“49240b3cc693fd281422bbcabb5f207ae2a390003534989fb55080799ee08d8c”。
如果你在句子中再加一个句号,就会得到另一个结果。计算:
>>> h = hashlib。sha256(this is magic…. ‘)
> > > h.hexdigest ()
“6 c3e6636db1eb2fa8fcf8d4fdbf33bff4129ccb985c24848ef25311d506dde73”
通过向字符串添加一个额外的字符(句点),它产生了一个不同的哈希输出。哈希输出的另一个迷人的特性是“计算上不可能”返回并确定是哪种输入影响了这个惟一的输出。
即使你要求经验丰富的开发人员找出创建的输入值,他们也会告诉你这是不可能的。另一方面,如果你要求同一个开发人员从“this is magic …”字符串中给你一个SHA-256签名,他将为你提供相同的值。
区块链上的事实有多安全有效?
区块链由链接数据块组成,创建一个链。每个块由多个事务或事实组成。软件将计算每个块的校验和。馈入计算的数据包含大量信息,其中包括前一个块和当前块的校验和。这些因素都将包含在新块的计算中,这就是为什么重写区块链几乎是不可能的。
每次有一个新事务时,它都会直接进入一个事务池,等待被写入区块链。如果有足够的交易,比特币节点将处理每笔交易以创建一个新的块,然后将其添加到链中。这些将成为区块链中的永久记录。
区块链中的校验和格式以零开头。每次记录校验和并将其添加到区块链时,都会向散列输出添加更多的零。如果有人想要更改区块链的历史记录并添加一个新的事务,那么他必须回到Block 1并计算一个全新的Block 1散列输出。这样的过程将需要大量的计算能力以及时间、金钱和精力。