区块链: 技术驱动金融 - 第2章 比特币如何做到去中心化

2.1 中心化与去中心化

    中心化和去中心化并非水火不容,其实没有一个系统是完全中心化,或者完全去中心化的。如,电子邮件是一个去中心化系统,任何人只要愿意,都可以设计自己的电子邮件服务器,只是对于大多数普通人来说,这是没必要的,所以就把这个任务交给了电子邮件服务商。同样的,比特币系统是去中心化的,但是比特币交易所(将比特币转换成其他货币的平台)、钱包软件、用户管理比特币的软件,可以是中心化或去中心化的。

    要理解比特币如何做到去中心化,我们需要理解下面的五个问题:

  1. 谁在维护交易账本?
  2. 谁有权利批准哪个交易是正当有效的?
  3. 谁在制造新的比特币?
  4. 谁在制定系统变化规则?
  5. 比特币是如何取得交易价值的?

    点对点(P2P)网络是最接近去中心化的体系,用户只需要下载比特币客户端,就可以在其电脑上运行一个节点。一个节点既可以作为普通用户,也可以作为矿工(将在比特币挖矿中详细讲解),但是挖矿需要很多资金投入,所以并不是所有用户都是矿工

2.2 分布式共识

    分布式共识(distributed consensus)是区块链中一个非常重要的概念。

    计算机界对分布式共识研究了多年,一个直观的例子是:一个社交网络的后端平台包含一个由几万台服务器组成的分布式数据库,每一条信息都被记录在若干个节点上,对于整个系统,这些节点必须做到同步。

    以下给出分布式共识协议的定义:

分布式共识协议  在一个具有n个节点的系统中,每一个节点都有一个输入值,其中一些节点具有故障,甚至是恶意的。一个分布式共识协议有以下两个属性:

  • 输入值的中止必须经过所有诚实节点来确定。
  • 这个输入值必须由诚实节点来生成。

    要理解分布式共识在比特币中的用途,需要注意:比特币系统是点对点系统,当AliceBob付款时,她实际上是在向构成比特币网络的所有节点广播其交易信息。如图2.2.1换句话说,Alice把这笔交易广播给所有节点,防止Bob收款后抵赖

2.2.1 Alice向比特币网络广播交易信息

    在比特币网络中有各种各样的用户在向网络广播交易信息,节点必须对哪些交易可以进行广播交易发生的次序达成共识,以此系统将形成一个唯一的全球交易总账。因此,在比特币系统里,我们将对每一个区块进行共识处理。

    在任何时刻,每个节点都有:

  • 总账本。包含一系列区块,每个区块中包含已经被所有节点达成共识的交易清单。
  • 交易池。包含没有被打包进区块、还没有达成共识、尚待确认的交易。

    每个节点的总账本是一致的,而交易池则略有差别,因为点对点网络是不完美的,所以在任何时刻,有些节点收到了交易信息,而有些则没有收到

    所有节点如何对一个区块达成共识?

    一个直观的方法是:在一个时间段里,比如每隔十分钟,每个节点提议,从自己的交易池中选择未被确认的交易打包进区块,作为已经达成共识的区块链的下一个区块。这时候,每个节点都会把这个区块发给所有其他节点,其他节点将这个区块作为共识协议的输入,检验区块中的交易是否有效。当所有其他节点都确认了这个区块中的交易是正当有效的,那么这个区块就被增加到区块链的末尾(当然,这里会涉及到共识协议的一些细节问题)。

    可能有人会指出,这个区块没有包含所有的正当有效的交易,但这没关系,那些还没有被打包进区块的交易,可以等待下一次机会。

    上述方法和比特币有些相似之处,但有几个技术问题:第一,达成共识一般是一个难题,因为有些节点会死机、离线或根本就是恶意节点;第二,上述方法要求所有节点之间两两相连(即全连接网络),而比特币网络是点对点网络,是不完美的,要执行一个所有节点参与的共识协议好像并不现实;第三,由于交易信息分布在整个互联网上,信息传递会有严重的延迟。

延迟与全球时间

    比特币协议达成共识时必须直面两大障碍:

  • 不完美网络,如信息延迟和节点死机。
  • 恶意节点

    严重网络延迟导致的一个后果是,节点之间没有一个统一的全球时间概念。那么,共识协议的一些指令,如“在第一步里发了第一个消息的节点必须在第二步里执行X”,就无法执行,因为所有节点对于谁在第一步中发出第一个消息有不同的看法。

不可能性结论

    在全球时间上的不统一,给共识协议算法带来了很多限制。事实上,由于这些限制,许多关于分布式共识的文献都对是否能够达成共识持悲观态度,有许多达成共识具备不可能性的结论已经被证实,如“拜占庭将军问题”、“Fischer-Lynch-Paterson不可能结果”。尽管如此,还是有一些文献提出了一些分布式共识协议,其中比较著名的是Paxos算法。Paxos算法做了一些妥协,一方面,它能够做到不产生不一致的结果,另一方面,该算法所做的妥协是,在一定条件下(虽然不太可能出现),该协议会死机卡住,从而无法继续运行。

打破传统上的假设

    这些“不可能性结论”是针对分布式数据库的研究,都是在一些特定的模式下才成立的,并不能完全套用到比特币身上,毕竟比特币本身就已经打破了很多原来分布式数据库所做的假设。

    第一,比特币引进了奖励的理念,这对分布式共识协议来说是一个全新的理念。在这个情况下,人们自然地会为了奖励而变得诚实起来。所以,比特币并没有真正解决分布式共识问题,只是在特定货币系统下解决了这个问题。

    第二,比特币体系包含随机性这个概念。此外,它不再纠结于规定共识的起点和终点,相反,共识是通过一段较长的时间而达成的,在实际系统中,达成共识大约需要一个小时左右。但即使在一个小时以后,节点们也还是无法确定哪个区块应该进入总账本。但随着时间的流逝,我们对某一个区块的认识(即这个区块是否应该进入总账)与最终总体共识相吻合的概率将越来越大,观点出现分歧的概率按指数级下降

2.3 使用区块链达成没有身份的共识

    在传统的分布式共识中,要求节点实名制,或者节点的身份是明确的,这样可以使设计更容易。比如,有了真实身份,我们就可以用这样的指令“编号最小的节点开始做某些动作”。

    在比特币系统中,没有强迫用户使用真实身份来加入,这是比特币的重要特性,也是比特币系统的核心理念。缺少真实身份,给比特币的共识协议带来很多难点。我们可以做两个较弱的理论假设:

  • 随意节点选择:假设我们可以在系统中随意选择一个节点,由这个节点来决定区块链的下一个区块。
  • 节点不会受到女巫攻击。乱造节点就是所谓的女巫攻击(sybil attack)现象,即多个节点看似不同的身份,实际上是一个人在操纵。

隐性共识

    随意节点选择的假设可以让隐性共识(inplicit consensus)成为可能。

    我们的共识协议有多个回合,每一个回合对应区块链中的一个区块。在每个回合中,一个随机节点会被选中,由它来提议区块链的下一个区块。注意,在比特币网络中,每个节点会将交易广播给其他节点,因此随机选中的节点可以将这些交易打包进区块中

    这里没有共识算法,也没有任何投票过程来决定哪些交易会被选中,随机选择的节点会直接决定区块链的下一个区块,但万一这个节点是恶意的,在区块中打包一些非法的交易,或者是自私节点,只打包那些有利于自己的交易。针对这个问题,可以采用隐性共识的方法。

    其他节点可以通过隐性地接受或拒绝前面这个被随机选中的节点。如果接受,他们就在这个区块之后接龙下去;如果拒绝,他们就忽略这个区块,而是选择前一个曾经接受的区块,来继续接龙下去。值得注意的是,这里的前一个曾经接受的区块,并不一定就是这个区块的前一个区块,因为,很有可能在之前的几个回合中,随机选择的节点都是恶意节点,其他节点已经隐性拒绝了多个回合

比特币共识算法(简化版)

这个算法的简化假设是,可以随意选择一个节点,这些节点都不受女巫攻击的影响。

    1. 新的交易被广播到所有节点。

    2. 每个节点都将新的交易放进一个区块。

    3. 在每个回合,一个随机选择的节点可以广播它的区块。

    4. 其他节点可以选择接受这个区块,前提是区块里的交易是正当有效的(有真的签名)。

    5. 节点们可以把以上接受的区块的哈希值放进自己的区块里,以此来表示它们对这个新区块的认可。

    接下来我们看看这个算法如何能够抵抗一些常见的攻击行为。

    窃取比特币

    假设这一轮由Alice来提议区块链的下一个区块,如果她想窃取Bob的比特币,那么Alice就发起一笔把Bob的比特币转到自己地址上的交易,伪造Bob的数字签名来对这笔交易进行签名,并把这笔交易放到下一个区块中。显然,如果数字签名机制是安全的,那么Alice就不可能达到目的。

    拒绝服务攻击

    假设这一轮由Alice来提议区块链的下一个区块,如果她不喜欢Bob,那么她可以拒绝把和Bob有关的任何交易放进区块中。尽管这是Alice可以开展的有效攻击,即拒绝为Bob提供服务,但显然这是个小问题。Bob只需要等下一个诚实节点来提议区块,他的交易就有可能被放进区块中。

    双重支付攻击

    假设AliceBob开的网店的一个顾客,Bob提供一些付费软件下载服务。Alice可以发起这样的双重支付攻击:

    AliceBob购买一个软件,她就在自己的地址上向Bob的地址发起一笔比特币交易,并向整个网络广播这笔交易。假设现在由某个诚实节点来制造下一个区块,并把这笔交易放进区块中。当看到这笔交易被放进区块链之后,Bob认为Alice已经给他付款了,于是允许Alice下载软件。紧接着,假设下一回合随机选择的节点刚好是由Alice控制的节点,那么Alice可以产生一个新区块,并且放进一笔交易,这笔交易是把她付给Bob的币转到一个被她所控制的地址上,并将这个区块接到上一个诚实节点所产生的区块的前一个区块,以此来忽略掉诚实节点所创建的区块。

    这就是一个经典的双重支付攻击,因为两笔交易用的是同一个币,只能有一个交易可以被放进区块链中。

    你可能会问,既然Alice在第一笔交易中已经明确地把币转给了Bob的地址,这个币的拥有者就是Bob,那Alice又怎么来创建第二笔交易,将这个币转移到自己控制的地址上呢?这是否需要伪造Bob的签名?显然,伪造签名是属于窃取比特币行为,并不属于双重支付攻击

    事实上,我们需要清楚地了解一笔交易的结构。在比特币中,一个交易就是一个数据结构,其中包含三个主要的部分:

  • 交易发起者的数字签名
  • 一个付给目标公钥(地址)的指令
  • 一个哈希值

    前两个元素是很好理解的。第三个元素是一个哈希值,代表一个指针,指向先前一笔交易的输出,表明这个币的来源。这个指针必须指向一个已被共识链上某个之前的区块所确认的交易。换句话说,任何人都可以追溯一个交易中比特币的源头

    记住,有两种比较容易混淆的哈希指针:一种是在区块内用来表示接在之前哪个区块后面的哈希指针;另一种是在交易里的一个或多个,用来指向之前的已被确认的交易的哈希指针,说明比特币的来源。

    下图为双重支付攻击示意图:

2.3.1 双重支付攻击示意图

    双重支付攻击的成功与否,取决于最后哪个区块会被纳入长期共识链,是包含CA->B的区块,还是包含CA->A'的区块。诚实节点会遵守“在最长有效分支后面延展”这一规则,但事实上,到底在哪个分支后面延展,并没有明确的答案。

    从道德角度看,两个分支是截然不同的,第二笔交易应该是无效的(即付给自己的地址),但这个区别仅仅建立在我们知道Alice先付给Bob然后再付给自己这个前提下的。从技术角度看,这两笔交易均是有效的,节点没有办法辨别哪一个是道义上合理合法的交易。

    实际上,下一个提议区块的节点有可能选择在那个包含双重支付的区块上延展,特别是,Alice如果还贿赂了一下这个节点(如果她知道这个节点是谁控制的),那这就更有可能了。这样的话,包含双重支付区块的链就要比另一条链长,那么后续的诚实节点就会在这个链上继续延展,随着这个过程的进行,这条包含双重支付的链就更可能会成为长期共识链中的一部分。相反,包含付给Bob地址交易区块的链就会被网络完全遗忘,成为孤块(orphan block)

    现在,让我们从商家Bob的角度来考虑,他如何保护自己不受双重支付攻击,这也是理解比特币安全措施的重要部分。

    当Alice广播第一笔交易——向Bob支付,Bob也在网上听着。如果Bob很草率的话,一旦收到Alice广播的交易并验证了Alice的签名有效,就立刻允许Alice下载软件,这称为零验证交易(zero confirmation transaction)。这样一来,如果Alice控制了下一个被随机选中的节点,那么Alice就可以立刻广播第二笔交易——双重支付,这个节点就可以把这笔交易放进下一个区块,并将这个区块链接到包含第一笔交易的区块的前一个区块,从而产生分支。

    显然,这是因为Bob太“草率”了。如果Bob很谨慎,那么,他不会立刻允许Alice下载软件,而是等待后续区块的出现,并从这些区块中查看Alice是否发起了双重支付攻击。一旦Bob发现了Alice企图发起双重支付攻击(即包含双重支付交易的区块被加入到区块链中),那么他就会放弃这笔交易,拒绝让Alice下载软件。如果在接下来的几个区块都是建立在第一笔交易的基础上(即被后续的几个区块确认),那么Bob就可以相信这个交易会被纳入长期共识链,这时候,就可以允许Alice下载软件了。

    以上过程如下图所示。

 

2.3.2Bob角度看双重支付

    总之,一个交易得到的确认越多,它被纳入长期共识链的概率就越大。诚实节点总是选择延展最长的共识链,因为长链增长更多,而包含双重支付的那条链追上长链的概率就会变得越来越小。在只有一小撮恶意节点的情况下,这个结论尤为正确,因为短链想要赶上长链,那恶意节点需要一直被选中

    此外,值得注意的是,就算包含双重支付的链成为了长期共识链的一部分,那也不能说系统出错了。如前面所述,双重支付交易只是从道德角度看是不合法的,但是从技术角度看,这笔交易是完全合法有效的,这就如同Alice把钱从她的一个银行卡转到了另一个银行卡一样。Bob必须确保这笔钱真正转到了自己的地址上(即确认成为长期共识链的一部分),才允许Alice下载软件,他有责任,也应该这么做,因为这关乎Bob自己的利益。如果双重支付交易成为长期共识链的一部分,那么Bob就应该拒绝为Alice提供服务。

    事实证明,双重支付成功的概率将随着确认数的增加而指数级下降。在比特币生态系统中,最常见的方法是等待6次确认,并不是6这个数字有什么特殊含义,只是在等待时间和确认所感兴趣交易会被纳入长期共识链之间有一个较好的平衡而已。在实际应用中,我们可以根据应用场景需求,决定确认的次数

2.4 奖励机制与工作量证明

     前面章节主要关注比特币去中心化的技术手段,接下来让我们考虑另一个重要的部分:比特币的奖励机制。

    之前我们试图大胆地相信这样的假设,在随机选择节点时,至少有50%的可能会选中诚实节点,这或许是有问题的。如果对颠覆这个过程的参与者有金钱奖励,这个关乎诚实的假设就格外成问题,这种情况下我们无法真的假设某个节点是诚实的,因为一旦有金钱奖励,某些节点可能就会变得诚实起来。因此问题变成了:我们是否可以给予表现诚实的节点奖励?相反,回想一下双重支付的问题,我们是否可以惩罚那个创建双重支付区块的节点?

    事实上,不管是奖励还是惩罚,都没有办法在现实中执行,因为我们不知道这些节点的真实身份,所以不能给这些节点的家庭住址寄去现金,或者抓捕那个创建双重支付区块的节点。但如果有某种可以代替的数字货币,我们就可以实行奖励机制。

    在此之前,我们讨论的都是使用抽象的算法来实现分布式共识,并不针对某个具体的应用。现在我们要跳出模型,建立分布式共识过程的应用实际上就是一种货币,明确地说,我们要以这种货币为单位来奖励那些表现诚实的节点

区块奖励

    比特币里有两种不同的奖励机制,其中一种为区块奖励

    根据比特币的规则,创建区块的节点可以在区块中加入一笔造币交易,并指定这笔交易的接收地址,通常,节点会指定一个属于自己的地址。我们可以把这个视为对节点在共识链上进行创建区块服务的报酬。比特币规定,每生产21万个区块,区块奖励的金额就减半,根据区块生成的速度,大约每4年减半一次。在比特币最初的4年,区块奖励是50个比特币,现在处于第二个4年,所以现在一个节点产生一个区块获得的奖励是25个比特币。

    区块奖励是如何做到鼓励诚实行为的?咋一看,一个节点无论提议了一个正当有效的区块还是恶意伪造,都会受到奖励,但事实并非如此。想一下节点是如何才能获得区块奖励的,造币交易和其他每一笔交易一样,只有当它被纳入共识链,才会被其他节点所接受。这个设计激励节点想方设法去让其他节点延展它们自己的区块。因此如果网络中大部分节点遵循“延展最长支链”的规则,那这样的设计将激励所有节点遵循这个规则。

    前面说到,每产生21万个区块,奖励减半,因此至少在目前的规则规定下,比特币的总数量为2100万个。注意,这是新比特币被允许创造出来的唯一途径,没有任何其他新增比特币的机制。按照现在的奖励发放速度,在2140年比特币区块奖励就发完了。这是否意味着这个系统到2140年就无法继续运行,并且因为不再有奖励诚实行为的激励而变得不安全?事实上不是这样的,因为区块奖励只是比特币奖励机制之一,还有另一个奖励机制——交易费,可以确保系统安全运行。

交易费

    比特币的第二个奖励机制称为交易费。任何交易的制造者都可以选择让交易的输出值比输入值小第一个创建区块并把这个交易放进区块链的人可以获得这个差额,作为交易费。如果你是一个节点,正在创建一个包含200笔交易的区块,那这200交易的交易费将被付到你放在区块内的那个属于你自己的地址。目前,这些交易费是完全自愿的,因为现在还有区块奖励。但是,随着区块奖励逐渐发完,这些交易费就变得越来越重要,并且是必须的,因为用户需要通过交易费来保障合理的服务质量。这个是很好理解的,例如Alice有一笔交易,其输出值等于输入值,即没有交易费,那么显然的,Bob在创建区块时,就不会把这笔交易打包进区块,更极端的,后续所有节点在创建区块时,都不愿意把这笔交易进行打包,那么Alice的交易就无法得到确认。

    尽管目前交易费是完全自愿的,但是某种程度来说,交易费已经开始了,但目前还不清楚这个系统会如何演化,这取决于还并不完善的博弈论的研究与发展,这也是比特币一个很有趣的研究领域

挖矿与工作量证明

    我们已经看到了比特币的共识机制是如何抵抗某些攻击,以及初步了解了比特币的奖励机制如何激励节点倾向于做出诚实行动,但是仍然有几个问题需要解决。

  • 第一,我们需要相信我们能够随机选择一个节点。
  • 第二,由奖励产生的新问题:如果大家都想来分一杯羹,争相获取这些奖励,整个系统会变得不稳定。
  • 第三,第二个问题复杂版本:可能会有攻击者创建大量的女巫节点来尝试颠覆整个共识过程。

    事实证明,以上问题是相互联系的,并且都有一个相同的解决方法——工作量证明(proof of work,POW)工作量证明的核心理念是:把随机选择节点改为根据节点占有某种资源的比例来选取节点,并且这种资源是没有人可以垄断的如果这个资源是计算能力,我们称之为工作量证明。如果这个资源是某种币的拥有量,我们称之为权益证明(proof of stake,POS)

    根据计算能力来选择节点到底是什么意思?换一个角度理解,我们允许节点用它们的计算能力来互相竞争,其导致的结果是计算能力的比例决定了节点被自动选中的概率

    比特币使用哈希函数解谜来证明工作量。任何一个提议并创建区块的节点要想创建下一个区块,这个节点必须找到一个临时随机数nonce,使得下面的式子成立:

这个式子的含义是:将临时随机数、前序区块的哈希值、要打包进这个区块的交易列表,连接成一整个字符串,作为哈希函数的输入,通过哈希计算得到的输出正好落在某个目标区间内。这就表明找到了一个符合条件的临时随机数

    当一个节点找到了这样一个临时随机数,那么它就把这个临时随机数放进区块中,并把区块广播出去。值得注意的是,如果哈希函数具有第1章中描述的谜题友好性,那唯一解谜题的方法就是穷举法,即尝试足够多的随机数,直到成功为止

    用这种哈希函数解谜的工作量证明方法,我们可以完全舍弃随机选取节点的方法。一旦某个节点找到了一个随机数,那么它就可以创建并广播下一个区块。这就是比特币系统实现完全去中心化的方式。

难于计算

    哈希谜题有三个重要的特性,第一个特性是要有一定的难度不停尝试解哈希谜题的过程,就是我们所说的比特币挖矿,参与挖矿的节点被称为矿工。尽管技术上每个人都可以称为矿工,但是由于挖矿的高成本导致了挖矿生态系统要消耗大量的能源。因此,并不是每个节点都是矿工。

可参数化成本

    哈希谜题的第二个特性是成本可以通过参数来变化,而不是固定值。在比特币网络中,每产生2016个区块,所有节点就重新计算一次目标区域的大小,使得后续区块的产生时间间隔约为10分钟。也就是,大约两个星期重新计算一次。

    重新调整目标区域的大小,以维持10分钟的间隔,原因是,如果区块产生的时间间隔太小,将会造成很多低效率,还会失去许多优化上的好处,比如在一个区块内放入大量的交易。10分钟并没有神奇之处,只是按照一个指数分布来看待发现下一个区块的时间得到的平均时间间隔,如下图所示。

2.4.1 发现下一个区块所需时间的概率密度函数

    注意上图是整个网络内区块被创造出来的频率,而不是具体一个矿工发现了区块。对于某个特定的矿工,它发现下一个区块的平均时间是:

发现下一个区块的平均时间 = 10分钟/该矿工占全部计算能力的比例

易于证明

    哈希谜题的第三个特性是验证一个随机数符合哈希谜题是很容易的。也就是说,一旦某个节点找到了一个随机数并将包含这个随机数的区块广播出去,那么收到这个区块的节点可以快速验证这个随机数是否符合要求,从而证明这个节点是否正确地计算了工作量证明。

2.5 总结

    到此,我们已经很好地理解了比特币是如何实现去中心化的,现在总结一些关键点,放在一起以便更好地理解。

  1. 身份。比特币协议不需要真实身份就可以参与,用户只需要生成一对匿名的钥匙,用公钥代表身份,用私钥进行签名。
  2. 6次确认。我们说一个交易被放进区块链,其实说的是这笔交易被确认了许多次,但是多少次并没有一个明确的规定,6次是一个常用的数目。
  3. 哈希谜题和挖矿。哈希谜题具有三个特性:难于计算、可参数化成本、易于证明。同时由于挖矿成本高,因此并不是每个节点都是矿工。
  4. 比特币深度使用了分布式共识的概念。在比特币系统中,我们需要围绕比特币的价值进行共识,需要对账本情况进行共识。甚至你拥有多少比特币的算法也依赖于共识。也就是,当我们说Alice拥有一定数量的比特币,我们的真实意思是说,在比特币网络中,区块链中记录的所有Alice地址上拥有的比特币数量。这就是比特币系统的一个终极真相:拥有比特币就是其他节点对给定的一方拥有这些比特币的共识。直观地说,在比特币网络中,你自己对所有人宣称拥有1000个比特币,这没有用,只有大家都认为你拥有1000个比特币,你才是真的拥有1000个比特币。
posted @ 2018-12-26 15:45  Ipad-李小强  阅读(512)  评论(0编辑  收藏  举报