区块链是一种电子化数据的存储方法。所有数据以区块的形式出现,而这些区块链接在了一起,便赋予其不可变性,且数据对任何人都是公开可见的。

以比特币为例,在比特币区块链上,每个区块的大小有1MB左右。比特币区块链上仅存比特币交易数据。就像一个庞大的交易记录库,可以追溯每一笔比特币交易。

链接区块

举个例子,假如我们有三个存储交易数据的区块。

2.png

它们就像三个独立的文档,里面存储着交易内容和余额变化,文档1会按时间顺序从第一笔交易开始记录,知道数据量到达1MB位置,之后的交易记录便会记录在文档2中,以此类推。将他们一个一个地联系起来,并为每个区块内部数据生成一串特殊的数字签名。如果区块中的数据发生变动,那么区块的签名也会发生改变。

假设区块1已经写满1MB的数据,那么将它链接到区块2中,此时会产生一个签名,假设这个签名叫"X32",那么区块2中会记录区块1中的签名。

4.png

同理,区块2链接到区块3时也会在区块3中存储区块2的签名

5.png

当区块1修改自己的其中一条记录时,它的签名也会随之更改,这时候发现区块2中所记录的签名与现有的区块1的签名不符,那么区块1与区块2之间的链接就断了,这条链上的所有用户都会知道区块1中的数据被更改了。为了为区块链的不可变性,其他用户会拒绝同步更改后的信息,保持整条链上的完整性。6.png

那么为了不留痕迹地篡改交易,区块2中记录的签名必须要替换成区块1的新签名,然而区块2的数据一旦发生改变,它的签名也会随之改变,那么区块2与区块3之间的链接就会断掉。

7.png

因此想要不留痕迹地篡改交易,就必须保证篡改之后区块仍然联系在一起。即更改一个区块后,必须要为所有后续区块重新计算新的签名,者几乎是不可能的。

生成签名

假如区块1只记录一笔交易,Tom向Jack发送100BTC。需要根据这串数据生成一个签名。在区块链上,这个签名是通过密码学哈希数生成的。密码学哈希函数是一个极其复杂的数学公式:将任意数据传作为传入值带入公式,可以得到一个独一无二的64位输出值。

例如:Tom向Jack发送100BTC,我们记录为 Block 1 Tom 100 Jack + 100 ,通过算法获得哈希值为:dbe6bb02345f8126064da42d56edc5853879d69aeda34539cb81adabf9c000f0,假如我们修改为Tom向Jack发送500BTC,我们再生成哈希值:f8cd36c25f974d23bd56659781ea420d7f726319e15c902576026013f3cc8298,我们会得到一个截然不同的输出值。如果们再次修改回Tom向Jack发送100BTC,哈希值会变为:dbe6bb02345f8126064da42d56edc5853879d69aeda34539cb81adabf9c000f0

对于同一种哈希算法来说,相同的输入必定会有相同的输出,而不同的输入必定会有不同的输出。所以比特币区块链就是利用哈希函数为区块生成签名的。

但是,如果有人想篡改区块中的数据,TA 可以在篡改之后生成新的签名,塞下一个区块中,然后逐个逐个区块生成新的签名,这些改动后的区块还是形成了一条链,他人就没法分辨出数据已经被更改过了。如何防止这种情形呢?

答案是只有符合特定要求的哈希值(签名)才会被区块链接受。

什么是合格的签名?

并非所有签名都符合要求。区块链协议会预先确定一些要求。比如,在比特币区块链上,只有以连续的零开头的数字签名对应的区块才能上链。例如,以不小于连续10个零开头。

我们知道,每个数据传的哈希值都是唯一的。所以为了获取符合条件的区块签名,需要反复改变输入的数据传,直到能生成一连续10个零开头的签名位置。由于交易数据和元数据(区块编号、时间戳等)需要保持原样,每个区块里还添加了一段特定长度的、可以改变的数据。所以想把区块添加到链上时,人们可以不断改变这段数据,知道找到一个合格的签名,然后确定下这段数据的具体值。这段数据就是区块的noncenonce不是预先确定的数据,而是实际要找出的一串完全随机的数字(注意,这里是数字,nonce不像其他数据由任意字符组成,而是通过数字组成)

通过反复更改nonce、对区块数据进行哈希运算、寻找合格签名的过程被叫做挖矿,这也是矿工所做的事。矿工投入大量电力。转化成算例,不断带入nonce进行哈希运算,知道找到合格的签名位置。所以矿工手中掌握的算力越多,哈希运算的速度越快,抢先找到合格签名的可能性就越高。

区块链网络上的任何用户都可以通过下载并启动挖矿软件来参与挖矿,实际上就是用他们的硬件计算能力来计算区块的nonce。以比特币区块链上的Block #558781为例:

image-20211213103254347

源自于区块链浏览器 www.blockchain.com/

可以看出,这个区块的哈希值就是以18个零开头的。找到这一个哈希值需要付出大量的算力和时间,或是运气爆棚Block #523034就是一个极其罕见的例子。一个算力很小的矿工很快就找到了一个合格的签名,而其他矿工的算例加起来是他的七万亿倍。

所以由此看出,如果要更改所有区块的签名看似可行,但要花费的成本和时间难以估计,因此被认为是不可能的。并且网络中会有新的区块不断上链,恶意篡改就需要重新计算这些区块的签名,因为他要保证所有区块都是链接在一起的,包括哪些被新添加的区块。

只要矿工都在自己看到的最长区块链上挖矿,所有算力就会随时间自然汇聚到一条主链上,而攻击者只有制造出一条比当前主链更长的链,才能成功改变大家共同认可的交易记录。这种始终以最长链为主链(有效链)的原则,就是所谓的 “最长链规则”,是 Nakamoto Concensus(中本聪共识机制)的一部分。另,并不是所有区块链都采用了中本聪共识。

但是有一种例外,就是恶意参与者的算力真的超过了全网其他人的算力总和,在这种情况下有可能篡改取款连,即改变大家共同认可的历史记录。这种被称作 51%攻击,过去很多区块链遭受过这种攻击。(目前为止,遭受过 51% 攻击的著名区块链有 bitGold、Verge、Ethereum Classic。)

实际上,对比特币区块发动51%攻击所能获得的手机远远抵不上攻击成本,要想获得足够多的算力,除了要负担硬件、冷却设备和存储空间方面的成本,还要承担被千夫所指的风险,更重要的是,会对被攻击区块链的生态系统造成极大的损害,攻击所得的收益也会大幅贬值。51% 攻击实际上就是以一己之力对抗区块链上的其他用户。这也就是为何参与挖矿的用户人数越多,整条链的安全性就越高。

如何治理区块链?

区块链协议自动以最长链上的交易记录为准,将这条链视为代表绝大多数参与者的链。打造最长链需要消耗全网绝大部分算力。被篡改过的区块就与最长链断开了链接,因此会被全网绝大多数节点自动拒绝。

在比特币区块链上, 所有交易历史和钱包余额都是公开可见的(blockchain.info)。任何人都可以查看任一钱包的余额情况,或是始自(2009 年 1 月 3 日的)第一笔交易的所有交易记录。虽然任何人都能查看钱包余额,但是这些钱包的所有者大多都是不为人知的。例如,一个钱包里存有 6.9 万个比特币,直到2020年11月03日被转出,转出时价值9亿四千多万美元。