首发于微信公众号“我的网课”,重温比特币论文。
对一些事物感到疑惑的时候,不妨去找到它的源头,回到最开始的地方,看一下当初创造它的目的。
比特币的爆富效应,以及整个社会对变革的激励,使很多人见到“区块链”,就进入到了很嗨的状态。铺天盖地的二手资料,使每个人都对它有一些了解,都能够发表一些意见。然而,当步步紧逼地追问,它到底能用来做什么、怎么用、到底带来了什么好处的时候,得到的往往是沉默。
我认为,这时候去重温一下比特币的论文,有助于冷静、理智地思考,有助于把握事物的本质,形成自己的见解。
中本聪的论文发布于十年前(2008年),这篇论文里压根就没有提到什么抵御通胀、去政府化、限制央行滥发货币等事情。论文题目介绍的很明白了:一个p2p的电子现金系统。注意,这里的 “现金(Cash)”是有深意的。
论文中提到,在电子商务(Commerce on the Internet)中,电子支付的可靠性是完全依赖于第三方金融机构的。
Commerce on the Internet has come to rely almost exclusively on financial
institutions serving as trusted third parties to process electronic payment.
通过第三方解决信任问题,80后应该很容易理解。在十多年前,国内以淘宝为代表的电商刚出来时候,要在网上买东西的人担心的是,付了款对方不发货怎么办?卖东西的人则担心,货发出去了,对方不付钱怎么办?找第三方做资金托管,问题解决。
不过淘宝的这个例子和论文中提到的情况不完全相同。论文中提到,因为交易是可以撤销的,第三方机构需要花费精力去处理可能因此而产生的纠纷,有些额度太小的交易无法覆盖第三方机构的成本,商家也需要收集更多的客户信息,防止被骗。
论文中的“可撤销(reversal)”可能是指,系统中记录的交易数据被恶意篡改或删除后,难以证实这件事的发生。譬如恶意人员直接修改系统数据,将A账户中的资金减去100成为400,将B账户中的资金加上100成为500,怎样让第三方意识到,A和B的账户中都应该是500元。
论文中的这句话,将比特币的目标解释得很清楚:
These costs and payment uncertainties can be avoided in person by using physical
currency, but no mechanism exists to make payments over a communications channel
without a trusted party.
“如果用钞票就不需要做那么多防范了”。那么用钞票进行支付有什么特点呢?
将钞票递到卖家手上,这个过程不需要第三方参与。
钞票转移到卖家手上后,就成为不可更改的事实。
卖家拿到手的钞票不会突然消失。
用电子货币能否达到同样的效果?这就是比特币试图做到的事情:
不需要第三方监督、支付事实不可更改、不可伪造,如同现金一般的电子货币。
为了实现这个目的,中本聪发明了区块链技术。中本聪如何用区块链技术解决了哪些问题?将这个问题“想透”,对探索区块链技术的更多用法,一定是非常有帮助的。
反复地阅读论文,我认为比特币要解决问题是:
系统中任意两个账户,怎样能够自主地达成一笔真实、有效的交易?
交易真实是指交易确实是帐户的所有者发起的。
用账户所有者的私钥对该交易的上一次交易以及对方账号(公钥)进行签名。签署后,交易发起者将交易发布到比特币网络中。比特币网络中的节点用发起者的公钥验证签名。如果没有通过验证,则拒绝处理此次交易,从而防止第三者冒充他人伪造交易。
通过这种方式,任何一个节点都能够用公开信息验证交易是否是真实的。发起交易不需要向任何人提供私钥。可以将这个过程与现在的中心化系统相比,我们正在使用的中心化系统中,发起交易的时,需要向中心机构提供密码,中心机构通过密码来验证交易是否真实,一笔交易的参与者有三个。
在物理世界中,用现金购买的物品的时候,只需要直接将钞票递给对方,对方自己就能判断交易是否真实,不需要有第三个人在场。比特币通过“任何人都可以利用公开信息验证交易真实性”的方式,实现了类似钞票的效果(Peer-to-Peer)。
交易真实不等于交易有效。如果账户中只有100元,却发起了支付1000元的交易,那么这个交易是无效的。比特币是通过检查交易记录来核实交易是否有效的。
在每一笔交易中都要明确指明本次交易中转移的货币来自于哪一次交易。如果之前的交易是真实有效的,那么本次交易中动用的货币就确实是属于交易发起人的,同时不会出现透支的情况。
在比特币中,一个帐户里的货币余额不是记录在某处的一个数字,而是要通过遍历所有的交易记录计算得出。因此直接窜改帐户中的余额是不可能,除非能够窜改一连串的历史交易记录,而比特币的历史交易是非常难窜改的。
通过这种方式还可以避免一份钱被花了两次。就好比在现实中,不可能把同一张钞票既交给这个人,又送给那个人。在电子货币中,需要考虑这个“double-spend”问题,因为网络中传输的数据,是一些电信号、光信号,是可以被无限复制、无限分发的。问题6中将说明比特币是如何解决了double-spend问题的。
比特币的交易的有效性依赖于不可更改的交易记录。比特币的交易记录保存在区块中,中本聪非常巧妙地在区块中包含了“工作证明(proof-of-work)”,使区块的修改是非常难的。
记录了多个交易记录的区块是串连起来的,每个区块中都包含了上一个区块的哈希值。如果一个区块中的交易数据被篡改了,它的哈希值就会发生变化,下一个区块的记录的哈希值也需要修改,继而导致下下个区块需要被修改,直到到达最后一个区块。
问题的关键在于,每个区块的哈希值不是那么容易得到的,区块的哈希值必须满足一定的条件才会被比特币网络中的节点接受:以指定个数的0 bit开始。
交易详情和上一个区块的哈希值都是固定的,那么怎样修改区块的哈希值呢?答案是通过调整区块中Nonce字段的内容,不停地修改Nonce字段,直到找到满足条件的值。
寻找到合适的Nonce值需要10分钟。这个时间是平稳的,因为对区块哈希值的要求也是计算出来的,计算的依据是过去的一段时间里,区块生成的速率,如果每个区块的生成时间超过了10分钟,就降低难度,反之则增加难度。因此最终平均下来,需要10分钟才能完成一个区块的更改。
篡改者需要耗费大量的计算资源,才能够篡改后续的所有区块。在比特币中,中本聪还非常有见解地设计了一个奖励机制,如果将这些资源用于维护比特币网络,是可以得到奖励的。篡改者需要衡量一下,是把这么多的计算资源用于篡改数据划算,还是用于获取奖励划算。(这个的思路也很好玩)
如果篡改者耐心地去修改每一个区块,结果会形成一条新链。随着被篡改的区块在比特币网络中传播,比特币网络中的每个节点最终都会意识到两条链的存在。网络中的节点不会去判断哪个是真的,哪个是假的,它只选择相信最长的那条链。
因此篡改者篡改链的速度,必须要比正常区块生成速度要快,也就是找到Nonce值的速度要更快。如果篡改者做到了,那么他就成功了。因为他的算力超过了整个比特币网络中正常的节点,面对这种实力上或技术上的碾压,除了屈服,还能做什么呢?
比特币中选择相信最长的那条链有非常深刻的内涵。每一个区块相当于一个投票,最长的那条链,意思就是它得到了更多人的赞同。如果篡改者维护的链更长,那么说明这个系统中,坏人比好人多,于是坏人就成了好人,以前的好人就都开始跟着坏人混,那个受了委屈的好人只能被动地接受。
中本聪的这篇只有9页的论文,能包含如此多的内容,他的才智与学识真是让人无比钦佩。
很多人都会讲区块链是去中心化的、不可更改的,那么这么做的目的是什么呢?在比特币中,是为了能够无需在第三方介入的情况下,核实交易的有效性。你用区块链的目的又是什么呢?
论文到处可见如同珍珠一样璀璨的语句,寥寥数语,见解深刻,譬如这句:
The steady addition of a constant of amount of new coins is analogous to gold
miners expending resources to add gold to circulation.
什么是货币?第一笔钱是怎样出来的?这个问题可以让人连续思考好几天。
比特币明明白白地告诉你,它就是凭空制造出来的,第一个区块中直接创造了 大量的比特币,之后每生成一个区块就会制造出一定数量的比特币。这样凭空出来的电子货币能不能不作为货币?这就需要你自己去思考了。
当十个人中九个人都认为可以的时候,剩余的那个人会怎么做?当掌握了暴力机关的人认为可以的时候,被管理的人会怎么做?当所有人都认为不可以的时候,结局又会是怎样的?
比特币对隐私的保护也特别有意思。在传统的模型中,私密信息是由第三方保护的,身份信息、交易记录等都存放在第三方的系统中,公众没有获取信息的权限。
在比特币的模型中,没有第三方,并且交易记录都是公开的,这时候要怎样保护隐私?答案太有意思了:你能看到交易记录、你能看到某一个账户的资金流动,但是你不知道这个账户是谁的。虽然公众能够看到所有的信息,但无法把这些信息关联到人,隐私问题是不是解决了?这个思路挺开阔脑洞的。
从下面的图中,可以看到与传统模型的区别:
(可以探索一下这个问题: 从比特币的交易记录中能挖掘出哪些有效信息?)
比特币通过上述的方式,最终确保了只有真实、有效的交易才会入账,并且是在Peer-to-Peer的场景下实现的。它的原理是精妙简练的,但在实现的时候,还有一些细节问题需要考虑。
例如,一个帐户同时向比特币网络中的两个节点发送了两个不同的交易请求,两个节点同时算出Nonce值,并且它俩相隔甚远,它们的区块都率先被自己的近邻接受,交易对手也从临近的节点上查到了各自的交易。发起者只支付了一份钱,两个交易对手确都认为自己收到钱了(double-spend)。这时候要怎么办?
在问题3中,我们知道只有最长的链会被接受,当这两条链在同一个节点上最终相遇的时候,其中一个链会被抛弃,对应的交易也就失效。也就是说两个交易中的一个最终不会被承认,交易对手不能主张自己拥有这笔货币。比特币的实现中,一个交易只有经过了6个区块后,依然能通过真实性和有效性检查,才会被正式认可。交易对手需要耐心地等待1个小时,才能确定自己是否获得了对方支付的货币。论文中有一个很复杂的计算公式。
另外还有合适Nonce值找不到时怎么办、激励机制、账本记录方式、怎样快速验证交易、金额的汇总与分割、以及如何保证隐私等问题。这里就不一一展开了,感兴趣的朋友可以去读一下论文。把握住宗旨可以更有效地与他人沟通,并且避免走错方向,深刻地理解了之后,更有可能培育出自己的思路。
本文纯属抛砖引玉,回复“中本聪”获取论文原文。