一个程序员眼中的区块链技术

在了解区块链相关信息时(例如维基百科上的内容),我发现这些内容非常零碎和不连贯。要把这些零碎的信息整合在一起,形成一个完整的视图需要花费大量的时间。不过现在,我想我已经知道在引入区块链时要使用哪些东西,以及应该按照怎样的顺序来了解它们,以便让开发人员能够在 1 到 1.5 小时内看到完整的视图。本文内容经过一定程度的简化,如果有人对更复杂的细节感兴趣,可以继续深入探讨。

非对称加密已经存在很长一段时间了,非对称加密包含了公钥和私钥。我们使用公钥加密并使用私钥解密,并且无法从这两者中的一个中获得另外一个。因此,在使用非对称加密技术时,我可以向某人发送一条信息,比如“我转账 100 美元”,每个人都知道它是我发送出去的,而且中间没有被篡改过。

假设有十个人,他们每个人都拥有一定数量(假设是美元)的新货币。他们每个人都确定(并确信)一个叫“X”的人支出了 30 万美元,但 X 是否真的拥有 30 万美元还不得而知。为了弄清楚情况,我们需要知道每个人的余额。我们只需要将他所有收入交易加起来,并扣除所有支出交易,这样就能得到余额。为此,我们需要了解有关收入和支出的信息,于是公共账本出现了。有了公共账本,我们就知道某人是否真的有能力支出 30 万美元。

比特币:开端

还有一个问题——如果我把所有钱同时发给两个人会怎样?这个问题被称为双重支出(double spending)。当然,这两个人不应该同时收到我账户里的钱。让他们自己商量谁将收到我账户里的钱?这样做不方便。通过查看时间戳来确定我把钱先转给了谁?这样做不保险。不过,还是有一个解决方案——对交易进行流水化。如果这样做了,那么很明显第一笔付款发给了 John,那么就无法再将它发给第二个人,因为我没有更多的钱。但现在还不清楚谁将决定交易的顺序。在银行和其他集中式系统中,银行本身就是受托人,也就是单一故障点和信任点,负责与第一个接收人沟通。

在区块链中,不存在这样的单个受托人,取而代之的是网络中的大部分参与者(当然,这是指将整个网络作为一个整体,因为你不能相信每个个体参与者,因为其中肯定有一些骗子)。我们假设网络不受一个人的控制,并且大多数参与者严格按照自己的经济利益行事。

但流水化交易仍然存在问题,我们还需要在网络参与者中达成“共识”。这个问题需要通过共识算法来解决,这是区块链领域的一个关键算法。

在讨论特定的共识算法之前,先让我们来说说臭名昭著的区块链的“区块”。区块是一种技术度量,是批处理的一个实例,因此我们可以以“批量”的方式计算多个交易的共识,并且网络的开销成本可以通过多个交易来“分摊”。

区块内交易的顺序由网络参与者(即生成该区块的人员,也称为“矿工”)定义,但区块本身的顺序则由共识算法来确定。共识算法已经存在了相当长一段时间。例如,多主 NoSQL 系统中的 Paxos 和 Raft 等算法就属于共识算法,但它们并不适用于拥有数百万个参与者的网络。

比特币的工作证明(proof of work,PoW)共识算法在刚开始时被认为是革命性的。许多网络参与者(矿工)同时生成新区块,那么就有必要确定区块之间的顺序。为了让一个区块成为链中的下一个区块,矿工必须进行非常耗时的散列计算。对一个区块(随同一个随机串,一个递增的数字)进行持续的散列计算,直到散列值看起来像是一个符合某些条件的大数,例如包含 10 个前导零。这需要数十亿次的散列操作,这一过程代表矿工“证明”该区块的存在。但检查矿工的工作是否正确却十分容易——只需要再进行一次散列操作。需要注意的是,整个网络(其中包括成千上万的矿工)平均在 10 分钟内(比特币生成区块的平均间隔)只可以生成一个区块 。这大大减少了出现冲突的可能性,即同时有两个或多个区块作为下一个区块。

但是,冲突的可能性仍然存在。于是就有了如下规则——网络参与者接受形成最长链的那个区块。

事实上,它不是一个链,而是一个有许多分支和链的有向无环图(DAG)。链通常被称为“共同历史”(它是最长的链)。共识不会立即达成,至少需要在生成几个区块之后,所以必须等待一段时间。为了防止比特币的双重支出,人们通常会等待六个区块(这需要一个小时)。

除了交易数据之外,一个区块还包含对前一个区块的散列值。因此,过去的某些内容不可能被修改,因为如果修改了就会使其后的所有散列无效。在挖矿过程中,你将获得奖励,也就是新的资金收益!否则的话,该如何将资金引入到这个系统呢?如果说资金必须发放给某人,那么这个人就变得很特别,这与去集中化的想法是相矛盾的。为挖矿者发钱似乎是一种合乎逻辑和可接受的解决方案。

顺便说一些关于挖矿的事。矿工的主要工作是对新区块进行散列计算,这里没有使用非对称加密技术,因为只需要在将交易添加到区块之前检查交易。比特币使用 SHA-256 散列,以太坊则使用 Keccak-256。如果你是独自挖矿,那么在生成一个区块之前,需要

陕西弈聪软件信息技术股份有限公司
电话:13679229477    02989322522
陕西省西安航天基地神州四路科为城墅20栋4301