因为比特币网络每个节点都是匿名的,要让这些互相不认识,更不知道谁好谁坏的节点达成共识,貌似比拜占庭将军们的处境还要抓狂。前一篇我说了,比特币解决拜占庭将军问题尽管还不是理论完备的,但是从9年多的实践可以看出解决得相当好。中本聪解决的方法并未完全基于技术,还有一些配套规则,技术与规则的相辅相成造就了比特币网络运转体系,而整个体系才是中本聪最终能在实践上解决拜占庭将军问题的核心。
这一篇我来介绍比特币的运行过程,从发起一笔转账交易开始,一直到被记录进区块链中的过程,这样能让我们直观了解比特币系统是如何运行的,通过这样的观察去理解其中技术和规则是如何配合成为一个整体。
1、转账交易发起
在比特币这样P2P1网络中,所有节点都是平等的,没有谁比其他人有更高的权威2,因此任何人都可以发起转账3。当Alice想向Bob转账比特币时,既可以是Alice发起转账,也可以是Bob发起转账,甚至两人都发起了转账。那么按照比特币的转账交易的数据格式(交易数据细节这里不再详述,想了解的可以看本系列第9篇),发起交易的人要提供这笔钱的来历,还要提供花钱人身份证明,因此只有本次花钱的人,也就是Alice才能完整提供这些信息,说明只有目前控制这笔钱的人(是Alice,不是Bob)才能发起有效的转账交易。这其实也符合常理。
女主角Alice的具体操作是这样的,首先连上互联网,然后作为一个新节点要去寻找其他的比特币节点,当Alice连上其他比特币节点后,才算连上了比特币网络4。Alice按照转账交易标准格式写好她的转账交易,向整个比特币网络开始广播5。
上面说的都是一切正常的情况,但是我们也要探讨可能会出现什么意外情况,看看比特币网络是怎么利用技术和规则处理意外情况。在这个阶段,可能会有如下意外出现:
(1)Alice连不上比特币网络。这个情况参见我在注释4中说的情况,这里不再多说。
(2)Alice计划是给Bob转账,但是她同时又把同样一笔钱转账给她自己,她这是想投机取巧实现双重支付,因此她向比特币网络广播了两条相互矛盾的转账交易(A->B 和 A->A’)。我们把A作为Alice原始账号,A’作为Alice控制的另外一个账号,B作为Bob的账号。
从我们前面介绍的关于密码学技术原理来说,Alice发起相互矛盾的两笔转账交易,每一笔都是符合密码学技术要求的,都是技术上有效的。比特币网络中的节点并没能力从商业伦理或者道德角度去判断哪一笔是合理的,哪一笔是邪恶的。因此可以看出密码学技术解决了转账交易的有效性问题,但并不能解决合理性问题。这需要在其他环节利用其它的技术或规则来甄别。所以这个问题,我们先作为遗留问题存起来,到后面的环节我们再看是否能够解决。
2、转账交易接收
Alice广播她的转账交易时,Bob其实也不一定在线,那么这笔飘荡在网上的转账交易去哪里安家呢?放心好了,在比特币网络里,所有的节点都是它的家。Alice的转账交易会在一个秒级的时间内广播到全比特币网络,当时在线的节点会在网上侦听到这笔转账交易,然后它们都会做如下四件事情:
第一件事是最重要的事情,就是交易验证6,验证了Alice这笔钱的来历与Alice的身份来判断这笔转账交易的有效性。
第二件事是检查从这笔钱的出处到现在所有区块里的交易流水,看看这笔钱有没有被花掉过,也就是验证有没有被双重支付。
第三件事是这笔转账交易是不是自己已经收到过。
第四件事是对这笔转账交易的脚本是不是合法的校验,我们这里不详细说了。
当这四步校验完成并通过的话,如果该节点没收到过这笔转账交易,就会临时放到自己的交易池子里,并帮Alice再把这笔交易广播出去。在这里有个专业名词叫“泛洪”(flooding)的算法[有时候也被称之为“八卦”(gossip)协议],如果每个收到交易的节点都帮Alice广播的话,那么这笔转账交易将在网络上一直传播永不停止。有一条规则是当收到这笔转账交易的节点发现自己池子里有了这笔交易,就不再传播它,这样这波洪水就会停止。
到此都是正常情况,那么我们再来看看这个环节会有哪些意外发生呢:
(1)我们先来看看上一步骤留下来的问题,就是有两笔相互矛盾的转账交易在网上飘荡。那么对于侦听到的节点来说,它们一般情况下会把先听到的转账交易经过校验以后,放入到池子里,这样后听到的转账交易就在验证的时候发现与已经存在的交易矛盾而被抛弃了。可是在这种情况下,A->B的转账交易不一定运气那么好被所有的节点第一个听见,更何况还有一些节点不一定喜欢把先听到的当合法,恰好喜欢把后听到的当合理有效的交易呢7。在这种情况下,我们上一步遗留的问题,在这一步变成另外一个问题,即部分节点的池子里放的是A->B的转账交易,另一部分节点的池子里放的是A->A’的转账交易8。出现这样的情况,在本环节是无法解决的,所以问题变化一下之后,继续当作遗留问题进入下一道程序。
(2)也许有节点不喜欢Alice或者Bob,看到跟他俩有关的交易,不管有效无效,都拒绝接收,根本不放进池子里这种情况。这种被称之为“拒绝服务攻击”。同样我们继续把问题遗留下来到后续环节再看是怎么解决的吧。
(3)有些节点是恶意节点,会把给Bob的账户地址改成自己的地址,希望以此来偷取这笔交易的比特币。但是我们知道换了地址以后,这笔转账交易与其附属的Alice签名则不再匹配有效,这是由密码学技术保证的。所以如果有节点真的这么做,那么其实它是在自己池子里存了一笔无效的转账交易。但是在这一个环节,并没有机制把这样的错误给排除,我们继续遗留这个问题,在后续环节再看。
3、挖矿比赛——工作量证明(Proof-of-Work, PoW)
当节点们在比特币网络上侦听并校验转账交易的同时,还在干另外两件事情。一是在参加算术比赛,二是侦听有没有人宣布比赛成功。这个算术比赛又被称之为“挖矿”,是中本聪用来解决拜占庭将军问题的核心,专业术语叫工作量证明,但是今天我暂时先不进入这个细节,我们还是把关注点放在比特币运行的过程上。
这场比赛的目的是决出谁有资格给区块链加上最新一个区块,在中本聪的设计里,这样的比赛基本上大约每十分钟会有一个结果。节点们从自己的交易池子里选出一些交易9,组成一个区块作为准备加到区块链上的备选区块,同时也用这个备选区块去参加计算大赛来争取资格发布它。节点们费电费时的参赛并不是为了显摆自己会算算术,它是为了得到随之而来的丰厚奖励,从这个角度来看被俗称为“挖矿”真是恰如其分。
这个奖励有两个部分,第一部分是来自于凭空创造的新比特币。这部分奖励同时也是比特币唯一的发行机制,从2009年1月3日比特币网络开始启动,每个区块的奖励为50比特币,每产生210,000个区块(大约4年)后奖励减半,目前是每个区块12.5枚比特币。按照这个趋势,到2140年比特币区块奖励将发完,同时比特币总数也封顶到了2100万枚。当有人问你为啥说比特币总数是固定的,你现在可以告诉她了。
奖励另外一部分来自于最新区块里所有交易的小费,这些小费是被打包进该区块里每笔交易提供的。原本可以没有小费的,但是由于比特币交易越来越频繁,节点在选择放进区块的转账交易时会优先选择小费高的,所以零小费或者低小费的转账交易有可能会很长时间无人问津,因此现在比特币网络里的交易,小费慢慢变成一个不断增高的交易成本,也算是一个有争议的话题,未来我们还会说到。
当有节点比赛胜出并对全网发出新的区块后,那些还在比赛的节点一旦侦听到这个噩耗,首先去里里外外验证这个区块,这里说的里里外外是把区块里所有的交易以及区块本身与算术比赛的结果,还有与各节点自己掌握的上一个区块的指针全方位的校验,只有完全满足的情况下才只好接受这个区块为最新区块,再化悲痛为力量进行争夺下一个区块发布权的比赛。
在这里要特别说明的是,校验新区块以及是否认可新区块是每个节点自己独立判断的,因此如何使全网对新区块的认可达成共识,是一个值得深思的问题。可是比起问题的深刻,解决方案实在是不能再简单了,仅有那么一条简单规则,就彻底解决了共识问题,也化解了之前遗留的所有问题。这条规则就是最长的区块链才是有效的。这不仅简单,而且似乎都不需要人为去规定,因为这条规则是基于区块链这种数据结构下最天然的规则。如果要证明这条规则比其他啥规则都有效,只需要用一句话:
因为区块链数据结构的防篡改能力来源于其积重难返的特性,那么越长的区块链积的“重”就越重,篡改的可能性就越低,反过来说就是可信度就越高,所以最长的区块链有着概率上最高的可信度,最低的可篡改性。
正常情况下,胜出的节点会把A->B的交易记入到区块链中,到此为止我们今天所介绍的比特币系统运行原理也差不多说清楚了。但我们还有一些未尽事宜,前面那些遗留的问题还没有看到被解决,另外最后这个环节也可能会有新问题出现。
(1)部分节点的池子里放的是A->B的转账交易,另一部分节点的池子里放的是A->A’的转账交易的情况,在竞争新区块的发布权之后,至少有一个转账交易被记入了新区块。而我们关心的A->B转账交易,在这里并没有得到符合道德或者商业伦理的结果。因为如果交易池子里存放的是A->A’记录的节点获得了新区块的发布权,那么A->B的交易将在未来区块大赛中被当作无效交易而抛弃。
因此在比特币网络中进行的交易,存在一个交易确认的概念。假如Bob是网上提供歌曲下载的服务商,Alice购买某歌曲用比特币付款后,Bob在网上侦听到了这笔转账,但是他作为老司机不会立即开放权限给Alice下载,因为他知道那笔转账有可能不会被记录到区块链中。
中本聪在他的白皮书里专门对交易确认进行了数学计算,其实就是计算多少个区块后被篡改的概率,计算结果是随着区块越来越往后堆积,Bob那笔收款交易被篡改的可能性呈指数下跌,也就是说可信度越来越高。现在全网普遍认为经过6次确认,也就是区块链再堆6个区块以后,交易的可信度将会非常高,篡改的可能性已经可以忽略不计了。按照每个区块大约十分钟,所以Bob应该在一个小时后确认交易没问题,再开放权限给Alice下载歌曲。
一定有人提出大大的问号,一个小时的确认时间,黄花菜都要凉了。我们现在知道这个交易确认次数或者时间的存在其实是为了解决区块链的共识而做出的一种妥协,不知道大家还有没有印象,在之前我说中本聪解决拜占庭将军问题是在技术之外引入了两个机制,其一是奖励机制,其二是无处不在的概率,在这里体现的就是依靠概率达成的共识。然而比特币的这个延时确认确实被算做一个重大缺陷(这是针对虚拟货币而言)。关于这部分的思考和讨论,未来我们应该有机会专门再来说一说,因为现在也有一些技术方案正在试验来解决这个问题。
(2)另一个遗留问题是关于某些节点不喜欢Alice或者Bob,拒绝记录进交易池子。而这个问题我们现在发现不需要特意解决,因为就算这个有喜好的节点获得了新区块的发布权,但是下一个区块的其他节点还是会把这笔转账交易放到下一个区块中去。10
(3)最后一个遗留问题是恶意节点在区块里放入了无效的交易。这个问题我们现在发现也很容易被解决掉,因为一旦某节点干出了这样的事情,它发布的新区块在被其他比赛失败的节点里里外外校验下,一定会发现是非法的区块而被抛弃,那么那个区块就不能成为区块链上的区块,这样一来不仅无效交易根本没被记入到区块链中,连节点算术大赛获得的奖励也随风而逝了。所以在这样的规则下,有贼心的节点从趋利角度,它只能做符合规则的事情。
(4)以上这些遗留问题我们现在都已经解决了,此外还有可能遇到一些其他情况,例如比特币网络很大,有可能有并列冠军,同时有两个或更多节点胜出,并同时发布有效的新区块。其实这个问题与两笔矛盾交易的问题一样,最后只能有一个区块成为最长链的一个区块,另一个区块成为孤块而被抛弃。
“天下熙熙皆为利来,天下攘攘皆为利往”,比特币节点之所以愿意不惜硬件和电费成本在网上参与比特币游戏大赛,就是因为如果能够得到写区块的机会,将会获得奖励。而如果花费了成本后,却弄虚作假把非法转账交易弄进比特币区块,那么只能是损不了人也不利己的结果。
现在我们把比特币运行的过程原理介绍完了,同时也把中本聪解决拜占庭将军问题的办法给介绍了。只是目前比特币网络的成功完全是这九年实践的成功,这并不能算归纳法证明未来一定会继续成功,而且随着比特币引起全世界瞩目,已经开始招惹到更加凶险的考验,无论是盲目投资还是坚定打击,都是比特币实践的一部分。所谓真金不怕火炼,比特币的未来将永远处于火炼之中。除非……. 如果有谁的孩子学好数学,然后一不小心从理论上证明了比特币网络这种技术和规则架构就是解决了拜占庭将军问题,那么不仅是比特币之基本面的利好,这孩子也一定能得到诺贝尔奖。
为什么这么说,因为2015年,加州大学洛杉矶分校金融学教授Bhagwan Chowdhry曾提名中本聪为2016年诺贝尔奖经济学奖的候选人。他说:“比特币的发明简直可以说是革命性的。中本聪的贡献不仅将会彻底改变我们对金钱的思考方式,很可能会颠覆央行在货币政策方面所扮演的角色,并且将会破坏如西联这样高成本汇款的服务,彻底消除如Visa,MasterCard、PayPal他们收取2-4%的中间人交易税,消除费事且昂贵的公证和中介服务,事实上它将彻底改变法律合约的方式。”11
如何证明呢?我的建议是从还不完备的博弈论入手,来证明这些自由的节点老老实实按照既定规则做事的状态是纳什均衡点即可……而这个证明一定让人类大开眼界,对我们的社会形式有了更深刻的认识。
注释:
- 很多朋友其实还不知道P2P是什么意思,在英文是peer-to-peer,中文翻译成点对点。不过要注意的是这个P既不是指“点”(point)也不是指“人”(person),而是同等的人(peer)。
- 节点的平等并不表示其功能相等,在后续的漫谈里会提到根据节点需求区别,不同节点会有不同的功能,这里我们暂时不讨论。
- 特别解释一下我为什么总是说“转账”或“转账交易”而不是简单的说“交易”。因为交易在传统理解里是成对出现的,常言说“一手交钱一手交货”就是一个完整的交易。然而,在比特币或者其他加密数字货币里,又或者在我们的支付宝和银行的网络里,其实只实现“一手交钱”这半个交易,而“一手交货”则在绝大部分场景下不是在货币系统里实现的。因此不论之前的文章还是之后,除非特别强调,我提到所谓的交易一般都是指“一手交钱”这件事,我会写成“转账交易”或“转账”,但也不排除有时候一疏忽就写成了“交易”。不过未来哪一天我开始介绍智能合约的时候,我会再说起这个定义,因为真的能在这个系统里完成一个完整的交易。
- 对于一个P2P网络来说,如何找到其他节点是一个有意思的事情,要说清楚需要解释大量的网络基本技术,咱这里就不特别去深入了。之所以提到P2P网络的新节点寻找组织的事,是曾经有朋友问起我关于比特币网络的能不能抵抗从网络层面的攻击或者封锁,我想这大概也是许多人心中的疑问。其实了解网络技术的话,会知道P2P网络是最难封锁的,再细节本文就不探讨了,属于敏感话题了。
- 插图来自普林斯顿大学Arvind Narayanan, Joseph Bonneau, Edward Felten, Andrew Miller, Steven Goldfeder等四位教授编著的网络课程教材《Bitcoin and Cryptocurrency Technologies》,特此注明,请转载者也注明出处。
- 验证交易的过程在比特币代码里是通过脚本语言来实现的,在这个漫谈系列里非常难讲清楚这个过程,但是这个过程确实又很重要,因为未来的智能合约就是利用脚本语言来实现转账以外更多的功能。
- 比特币网络所有节点尽管运行的程序都是比特币网络提供的,但是不见得每一个节点都运行同样的策略,这也是比特币网络复杂且对等的一个体现,因此把这种混乱情况考虑进去,也是比特币网络技术和规则必须需要考虑解决的问题。
- 一定有人说还有两种可能性,就是有的节点一个都不接收下来,或者有的节点会两个一并接收下来。这样的情形其实是我们在后面要说的情况,前者属于拒绝服务攻击,后者属于接受无效交易。
- 节点选择池子里的交易其实是有讲究的,一般来说容易被选上的交易是时间比较久的,转账交易指令比较短的还有金额比较大的,现在越来越多的节点会把小费比较多的优先级设为最高。
- 除非这个有喜好的节点一直有新区块的发布权,那么这个问题就变成了一个节点控制了比特币网络,成为一个中心机构了。而解决P2P网络不会如此成为一个中心化网络的关键在于中本聪设计的算术比赛规则,让所有节点都不可能有机会一直能控制新区块发布权,这一点属于后面专题讨论的内容。因此这个问题在这个过程里也算是解决了。
- 取自维基百科中本聪词条。