被新闻刷屏了的区块链 它到底是个啥?
可能有一些读者有疑问,“区块链”到底是什么?为什么会这么受重视呢?今天,小编就来带大家一起了解一下。首先,区块链是一种电子化数据的存储方法。数据是以区块的形式出现的,想象一下有很多存储着数字化数据的区块。这些区块都链接在了一起,为其内部数据赋予了不可变性。
当一个数据块被链接到了这条链上,其内部数据就再也无法更改了。一旦某个区块被添加到了链上,里面的数据对任何人都是公开可见的。这项技术具有非凡的革新意义,可以用来记录我们能想到的几乎所有数据(例如,产权、身份、余额、病历等等),同时不存在被篡改记录的风险。假设我买了一套房子,把产权证拍照上传到了区块链上,我就可以证明我在那个时刻享有这套房产的所有权。也就是说,区块链是一种存储数据且保证数据不被篡改的方法。这听上去不错,不过随之而来的问题是:我们是怎么实现这样的技术的?
(校对注:吹毛求疵来说,这一段表述并非无懈可击,但姑且可以这么先记着。)
第一阶——交易数据
好吧,我们先拿比特币区块链做个例子。比特币区块链是现存历史最悠久的区块链。在比特币区块链上,每个区块的大小在 1 MB 左右。至截稿日,这条链上已经累积了 52.5 万个区块,链上存储的数据总量约为 52.5 万 MB 。(校对注:其实远远没有 52.5万 MB,因为在早期,很多区块都没有打满 1MB。)
比特币区块链上仅存储比特币的交易数据 。它就像是一个庞大的交易记录库,可追溯至第一笔比特币交易。在本文中,我们假设有一条存储交易数据的区块链,就像比特币区块链那样。
第二阶——(通过哈希运算)链接区块
想象有三个存储着交易数据的区块(如图一所示)。
这三个区块内都存有一些交易数据。这没什么特别的。就好比是三个独立的 word 文档,里面描述了交易的内容和余额变化情况。文档 1 会按照时间顺序从第一笔交易开始记录,直到数据量达到 1 MB 为止,之后的交易会记录在文档 2 中,直到数据量达到 1 MB 为止,以此类推。这些文档就是数据块。它们一个接着一个联系(链接)在一起。为此,每个区块会根据其内部数据串生成一个特殊的(数字)签名。如果这个区块中的数据发生任何变动,即使只改变了一个数字,这个区块的签名也会发生改变。这是如何实现的?欲知详情,请阅读步骤三中的 哈希运算 部分。
(校对注:如上文所述,实际情形中的区块并不是个个都接近区块大小的上限,实际数据大小要看把区块打包上链的矿工在区块中记录了多少交易,而他们并不会等到有了 1MB 交易数据才开始动手。实际情形见下文)
假设区块 1 中记录了两笔交易,分别是交易 1 和交易 2 。这两笔交易的总数据量达到了 1 MB (实际上一个区块中包含的交易笔数远不止这点)。根据这个区块内的数据串会生成一个签名。假设这个签名是 “X32” 。如下图所示:
请记住,即使区块 1 中存储的数据改动了一个数字,也会得到一个完全 不同的签名 !只要将区块 1 的签名添加到区块 2 中,就可以将区块 1 的数据与区块 2 关联起来。区块 1 的签名也包含在区块 2 的数据串内,因此这个签名与区块 2 中的其它数据一样,成了区块 2 签名的数据基础。如下图所示:
正是这些签名将区块链接在了一起,形成了一条区块链。现在加上区块 3 ,整条链的情况如下图所示:
现在,假设区块 1 中的数据被 更改 了。比方说 Damian 和 George 之间的交易被更改了。Damian 向 George 发送了 500 个而非 100 个比特币。由于区块 1 中的数据串改变了,其签名也相应改变了。更改过数据之后,区块 1 的签名不再是 “X32” ,而是变成了 “W10” ,如下图所示:
这样一来,区块 1 的新签名 “W10” 跟之前添加进区块 2 数据串的旧签名 “X32” 产生了冲突。区块 1 和区块 2 之间的链接就断了。这条链上的其他用户就会知道区块 1 中的数据被更改了。为了维护区块链的不可变性,其他用户会拒绝同步更改后的交易信息,依旧维持原有的交易记录(即 Damian 向 George 发送 100 BTC )不变,整条链依旧保持完整。这就意味着,要想不露痕迹地篡改交易,必须将区块 2 数据串中区块 1 的旧签名替换成新签名。然而,一旦区块 2 中的数据串发生变化,区块 2 的签名也会随之发生变化。假设区块 2 的签名从 “9BZ” 变成了“PP4” 。那么区块 2 和区块 3 之间的链接就断了!
区块链上的区块对所有人都是可见的。因此,如果篡改者真想要不露痕迹地篡改交易,就必须保证篡改之后的区块仍然都联系在一起(否则人们就很容易发现哪个区块跟其他区块并不相连,进而判断出该区块已经被改过了)。也就是说,改掉一个区块必须为后续的所有区块计算新的签名。可以认为这几乎是不可能的,但要理解这是为什么,请看下文。
第三阶——生成签名(哈希值)
那么,我们以区块 1 为例再画一个示意图。假设区块 1 只记录一笔交易,即 Thomas 向 David 发送 100 BTC 。需要根据这个数据串生成一个签名。在区块链上,这个签名是通过密码学哈希函数生成的。密码学哈希函数是一个极其复杂的数学公式:将任意数据串作为输入值代入公式,可以得到一个独一无二的 64 位输出值。例如,你可以将 “Jinglebells” 一词代入这个哈希函数(哈希函数的种类有很多,这只是其中一例),得到的输出为:
761A7DD9CAFE34C7CDE6C1270E17F773025A61E511A56F700D415F0D3E199868
只要这个输入中有一个字符发生变化,包括改变大小写或是增加空格和标点,就会得到截然不同的输出。如果你在这个输入后面加上一个句号变成了“Jinglebells。”,得到的输出就变成了:
B9B324E2F987CDE8819C051327966DD4071ED72D998E0019981040958FEC291B
如果我们把句号去掉,还是能得到跟之前一样的输入:
761A7DD9CAFE34C7CDE6C1270E17F773025A61E511A56F700D415F0D3E199868
对于同一个密码学哈希函数来说,相同的输入必定会得到相同的输出,不同的输入必定会得到不同的输出。比特币区块链就是利用哈希函数为区块生成签名的,将区块中的数据作为输入,得到的输出就是区块的签名。我们再来看看只含有一笔交易( Thomas 向 David 发送 100 BTC )的区块 1 示意图。
假设区块 1 中的 数据串 如下所示:
Block 1 Thomas -100 David +100
将这个数据串输入哈希函数,得到的输出(签名)如下所示:
BAB5924FC47BBA57F4615230DDBC5675A81AB29E2E0FF85D0C0AD1C1ACA05BFF
这个签名会被添加进区块 2 的中。再假设现在 David 向 Jimi 转了 100 BTC ,这笔交易被打包进了区块 2 。那么如下图所示:
区块 2 的数据串如下所示:
Block 2 David -100 Jimi +100 BAB5924FC47BBA57F4615230DDBC5675A81AB29E2E0FF85D0C0AD1C1ACA05BFF
将这个数据串输入哈希函数,得到的输出(签名)如下所示:
25D8BE2650D7BC095D3712B14136608E096F060E32CEC7322D22E82EA526A3E5
这就是区块 2 的签名。每一个区块都会通过这个密码学哈希函数生成一个数字签名。哈希函数种类繁多,比特币区块链用的是 SHA-256 哈希算法。
但是,(仅有上述措施显然还不够)如果有人想篡改区块中的数据,TA 可以在篡改之后生成新的签名,塞下一个区块中,然后逐个逐个区块生成新的签名,这些改动后的区块还是形成了一条链,他人就没法分辨出数据已经被更改过了。如何防止这种情形呢?
答案是只有符合特定要求的哈希值(签名)才会被区块链接受。这就是第四阶中介绍的挖矿。
第四阶——什么是合格的签名?由谁来签署区块?
并非所有的签名都符合要求。区块链协议会预先确定一些要求,比如,在比特币区块链上,只有以连续的零开头的数字签名相对应的区块才能上链。例如,只有在数字签名以不少于 连续 10 个零 开头的情况下,对应的区块才能上链。
然而,由第三小节可知,每个数据串对应的哈希值都是 唯一 的。如果一个区块的签名(哈希值)开头少于 10 个零呢?为了获得符合条件的区块签名,需要反复改变输入的数据串,直到能生成以连续 10 个零开头的签名为止。但由于交易数据和元数据(区块编号、时间戳等等)需要保持原样(否则意义就改变了),每个区块里面还另外添加了一段特定长度的、可以改动的数据。想把区块添加到链上时,人们可以不断改变这段数据,直到找到一个合格的签名,然后确定下这段数据的具体值。这段数据就是区块的 nonce 。nonce 不是预先确定的数据,而是应实际需要而找出的一串完全随机的数字(注:图中所示的其他数据可以由任意字符组成,nonce 只能由数字组成)。
综上所述,区块包含:1)交易数据;2)上一个区块的签名;3)nonce 。这种通过反复更改 nonce、对区块数据进行哈希运算、寻找合格签名的过程就叫做 挖矿 ,也就是 矿工 所做的事。矿工投入大量电力,转化成算力,不断代入 nonce 进行哈希运算,直到找到合格的签名(输出)为止。矿工手中掌握的算力越多,哈希运算的速度就越快,抢先找到合格签名的可能性就越高。这是一种 反复试错 的过程,如下图所示:
-注:nonce 必须是数字(详情请阅读 r/BlockchainSchool 上的讲解)-
区块链网络上的任何用户都可以通过下载并启动 挖矿软件 来参与挖矿,实际上,这就是用他们的硬件计算能力来计算区块的 nonce 。以比特币区块链上的 Block #521,477 为例:
-源自区块链浏览器 blockchain.com -
可以看出,这个区块的哈希值(签名)和上一个区块的哈希值都是以相同数量的零开头的。找到这样一个哈希值并非易事,需要付出大量算力和时间,或者 运气爆棚 。没错,有时候运气爆棚的矿工在几分钟之内就能算出合格的签名,花的算力也很少。Block #523034 就是一个极其罕见的例子。一个算力很少的小矿工很快就找到了合格的签名,而其他矿工的算力加起来是他的 7 万亿倍。相比之下,赢得 Powerball 彩票头奖的概率是 2.92 亿分之一,而这位幸运儿挖到矿的概率是中头奖的 1/24000 。
不要小看这些零。这一小节的重点是,找到一个合格的签名很难。
第五阶——区块链的不可变性是如何是实现的?
正如第三阶中所述,更改某个区块会导致它的签名改变,与后续区块记录的对不上,从而与后面的区块断开链接。要想让网络中的其他参与者接受这个被更改过的区块,就要把它跟后面的区块重新链接起来。也就是说,一个区块的签名变了,跟在它后面的所有区块的签名都要改变,才能让别人觉得这是一条前后一致的链。
你想起什么事没有?
如第四节所述,签名必须符合要求!虽然更改所有区块的签名看似可行,但是要花费很多成本和时间,因此被认为是不可能的,原因如下:
假设有一个矿工恶意篡改了某个区块内的交易,然后根据哈希运算为这个区块连同跟在它后面的所有区块生成了新的签名,以此让网络中的其他参与者都接受被篡改过的交易。问题在于,网络中的其他矿工也在原来的链上不断为新的区块计算签名。随着新的区块不断上链,作恶的矿工也要重新计算这些区块的签名。他必须保证所有区块都链接在一起,包括不断被添加到链上的新区块。除非这个矿工拥有的算力超过全网其他人的总算力,否则他永远赶超不了其他矿工。
(校对注:这一段的实际意思是,只要矿工都在自己看到的最长区块链上挖矿,所有算力就会随时间自然汇聚到一条主链上,而攻击者只有制造出一条比当前主链更长的链,才能成功改变大家共同认可的交易记录。这种始终以最长链为主链(有效链)的原则,就是所谓的 “最长链规则”,是 Nakamoto Concensus(中本聪共识机制)的一部分。另,并不是所有区块链都采用了中本聪共识。)
如今有数百万用户在比特币区块链上挖矿,由此可以推定某个恶意参与者或实体的算力是不可能超过全网剩余算力的。这就意味着网络中的其他参与者不可能接受任何对区块链的修改,从而实现了区块链的不可变性。一旦数据被添加到区块链上,就无法再修改了。
只有一种例外,就是恶意参与者的算力真的超过全网其他人的算力总和。从理论上来说,这种情况下是有可能篡改区块链的(即改变大家共同认可的历史记录)。这就叫做 51% 攻击(我写了另一篇文章来解释这种情形),过去也有很多区块链遭受过这种攻击。
(校对注:目前为止,遭受过 51% 攻击的著名区块链有 bitGold、Verge、Ethereum Classic。)
实际上,对比特币区块链发动 51% 攻击所能获得的收益远抵不上高昂的攻击成本。要想获得足够多的算力,除了要负担硬件、冷却设备和存储空间方面的成本,还要承担风险,更重要的是,会对被攻击区块链的生态系统造成极大的损害,攻击所得的收益也会大幅贬值。51% 攻击实际上就是以一己之力对抗区块链上的其他用户。这也就是为何参与挖矿的用户人数越多,整条链的安全性就越高。
恭喜你已经又进了一阶!现在,你应该已经理解(大型)区块链被认为具有不可更改性的原因了吧。不过现在又出现一个很重要的问题:如何防止矿工将伪造的交易数据添加到区块链上?从技术上来说是做不到的。关于区块链交易的详细解释可参见这篇文章。
(校对注:只有私钥掌控者才能花费相应地址中的资金,而矿工并不知道你的私钥,他人只能通过你公开的公钥来验证某笔交易是不是你发起的。所以伪造交易并不可行)
第六阶——如何治理区块链?由谁决定规则?
……区块链协议自动以最长链上的交易记录为准,将这条链视为代表绝大多数参与者的链。打造最长链需要消耗全网绝大部分算力。被篡改过的区块就与最长链断开了链接,因此会被全网绝大多数节点自动拒绝。
在比特币区块链上, 所有交易历史和钱包余额都是公开可见的(blockchain.info)。任何人都可以查看任一钱包的余额情况,或是始自(2009 年 1 月 3 日的)第一笔交易的所有交易记录。虽然任何人都能查看钱包余额,但是这些钱包的所有者大多都是不为人知的。例如,一个钱包里存有 6.9 万个比特币,至本文截稿之时价值约 5 亿美元。这个钱包在 2015 年 4 月使用过一次,之后就再也没有过交易。
(校对注:这一部分其实并没有回答 “由谁决定规则” 的问题,只大概说明了 “根据现有规则,这种技术是可以实现的”。公链治理是一个复杂的问题,也超出了这篇文章需要说明的范围了。)
第七阶——这些对密码学货币有何意义?
密码学货币从本质上来说都是比特币的变体。绝大多数加密货币都是按照自己的区块链协议搭建的,遵循不同于比特币的规则。比特币应当被归类为一种货币,也就是说它明确具备货币功能。门罗币也是一种具有相同功能的加密货币,不过它的区块链协议还增加了一些规则来增强隐私性(提高交易溯源的难度)。
不过,用区块链发行的资产可以被赋予很多种不同的用途,这点由发行方决定,如此发行的资产一般被称为“代币”。这些代币可以赋予其所有人某种权利,例如社交媒体渠道、 水电等等。所有这些资产交易都记录在不同的区块链上,并且可以通过币安之类的交易所进行线上交易。
代币其实是一种新型互联网货币,可能会影响到一部分行业,其中一个典型的例子就是股票市场。在未来,公司股份之类的产权很有可能会以代币的形式存储到区块链上。区块链不仅限于以代币的形式代表实物价值,也可以安全地记录病历、身份、历史记录、纳税记录等数据。
稿源:以太坊爱好者