【转】去中心化与Bitcoin系统技术实现

http://www.8btc.com/howtodecen

 

 

引言

一提起比特币,“去中心化”往往成为一个炒作的热点,倡导者们把“去中心化”宣扬成救世的良药,具有革命性的意义;反对者们则声称这只是不切实际的幻想,或是一个骗局。

当针对同一事物的认识产生出两种截然相反的立场时,且假设双方的看法均是出于善意(不是恶意宣扬或诋毁),那么,至少有一方(也可能是双方)的认识出现了偏差。这个偏差是怎样产生的呢?

通常来说,如果一个概念过于抽象,那么在认识过程中不可避免地会掺杂有个人的理解,人与人的学识、经历、认识水平差异很大,看问题的角度各不相同,分歧也就产生了。

当我第一次从媒体报道知道有比特币时,听说这是“去中心化”的货币,完全靠算法来保证去中心化发行,第一感就是,“太能忽悠了,这怎么可能!算法不是人定的吗,要改还不容易,这肯定是个骗局!”

证明某个论断为真不容易,但证明它为假很简单,举一反例即可。于是我以一个攻击者的身份(技术上的攻击者,不是语言上的)开始寻找比特币系统的骗局或漏洞。经过三个月的不懈努力后,我成为了支持者。    本文不讨论“中心化”和“去中心化”孰优孰劣,仅介绍一下比特币的“去中心化”去的是什么“中心”和如何实现的。

crypto-anarchy

  • 现代金融体系中,货币发行不得不采取“中心化”的原因

先抛开什么调节经济、维护稳定这些冠冕堂皇的论调不说(因为这些论调也可以是集权者们瓜分财富的一种托词),仅辨别货币真伪这一功能往往就不可避免地依赖于中心化。

假设有私人发行的货币,即使在一定群体内认可,但交易双方必须通过一个专用设备(如专用验钞机)、或专用网络来验证货币的真伪(因为货币的制造细节不能让其他私人机构知道,否则其他人就可以随便伪造了)。如果各式各样的私人货币同时存在,货币接受方也需要相对应的各式各样的验钞设备才行,也势必会影响到货币的流通性。时间久了,私人发行也就被大型发行机构(中心化机构)所自然淘汰了。

仅此一项,无论中心化有可能发展得有多恶劣,人们也只能依赖它。

  • 密码学货币能否消除对中心化的依赖?

为了解决真伪性验证问题,早在几十年前,密码学货币就产生了,……,然后就消亡了。单纯的密码学货币本身还有一个弱项,使得中心化仍无法避免,因为实际运转中还需要一个交易认证中心。

首先说一下密码学货币是如何解决真伪性验证的。这里需先引入两个定理(如果非专业人员有疑问,请自行扫盲。本文为了表述上的清晰,省略了证明过程)。

定理一:使用公认HASH算法生成的hash值可以证明数据的真实性和完整性(哪怕只有一个二进制位的修改都会被立刻发现)。

定理二:使用公认的数字签名算法,可以证明数字资产持有者的身份,结合hash算法后,还可以证明对该资产的处置方式确实由持有者本人授权。

维基百科:1976年,Whitfield Diffie与Martin Hellman发表开创性的论文,提出公开钥匙密码学的概念:一对不同值但数学相关的钥匙,公开钥匙(公钥, public key)与私密钥匙(私钥, private key or secret key)。在公钥系统中,由公开钥匙推算出配对的私密钥匙于计算上是不可行的。除了加密外,公开钥匙密码学最显著的成就是实现了数字签名。历史学者David Kahn这样描述公开钥匙密码学;“从文艺复兴的多字符取代法后最革命性的概念。”

密码学货币实现了可以不依赖于任何中央机构认证也无法制造假币,但是,遗憾的是,密码学货币本身无法解决双重花费。这就好比A有一套房子(资产),他可以证明他拥有这套房子(靠数字签名),然后他把把这份房产分别卖给了B和C,B和C通过验证签名,可以知道A确实有这套房产,然而,在入住之前(交易和实际入住有一个时间差),B无法知道C的存在,C也无法知道B也买了同一套房子。这就需要有一个认证机构,当A转移资产给任何一个人时,必须有一个有公信力的核实途径,让其他人可查知A已不再拥有该资产的处置权。

这往往需要一个中心数据库来存储所有资产的持有情况,由一个中心认证机构来裁定。同时,如果这份资产是货币,那么,由这个中心认证机构来发行会更有助于管理,自然选择的结果恐怕是干脆将货币发行也中心化算了。    也就是说,到比特币的原理出现之前,无论是行政强制还是自然选择,最终都只能发展成为“中心化”。此时的“去中心化”只能是一种理想,不应把理想主义者的理想强加给他人。

比特币是什么?

比特币是一个系统,不是货币。

比特币的定义:“一种点对点的电子现金系统,基于密码学原理而不基于信用,使得任何 达成一致的双方,能够直接进行支付,从而不需要第三方中介的参与。” (引自中本聪的论文)

什么是电子现金?一种以数据形式流通的货币。它把现金数值转换成为一系列的加密序列数,通过这些序列数来表示现实中各种金额的市值。用户在开展电子现金业务的银行开设账户并在账户内存钱后,就可以在接受电子现金的商店购物了。是一种电子货币。

什么是电子货币?随着计算机技术的发展,电子支付的工具越来越多。这些支付工具可以分为三大类:电子货币类,如电子现金、电子钱包等; 电子信用卡类,包括智能卡、借记卡、电话卡等; 电子支票类,如电子支票、电子汇款(EFT)、电子划款等。这些方式各有自己的特点和运作模式,适用于不同的交易过程。

什么是电子支付?指交易的当事人,包括消费者、厂商和金融机构,使用安全电子支付手段,通过网络进行的货币支付或资金流转。电子支付是电子商务系统的重要组成部分。

什么是电子商务?不解释了。

任何交易,都会包含一个最基本环节——资金的转移。在电子商务活动中,作为重要环节的在线电子支付方式愈发显示其重要性。虽然传统的支付方式也可进行清算,如使用银行支票、银行汇兑或汇款单等,但从高效、经济的角度来讲,电子支付方式显然有着更大的优势。数字形式的货币的可信度并不低于纸币,不管你知道与否,你很可能已经使用数字形式的货币很长时间了。

比特币系统本身属于电子支付系统,与一般电子支付系统的区别仅在于它可以通过P2P方式实现而不需要第三方机构参与。

传统的电子商务支付系统的安全要求包括:保密性、认证、数据完整性、交互操作性等。为了保护交易双方的权益,传统的基于互联网的电子交易支付系统由客户、商家、认证中心、支付网关、客户银行、商家银行和金融专用网络七个部分组成。这一系统可以很好地处理大部分交易。不过,由于这一系统本身是一个基于信任的模型(trust based model),需要有一定的风险控制;同时金融机构无法避免争议调解(mediate disputes),使其无法做到完全的交易不可逆。这些都会增加了交易的成本。

密码学货币通过数字签名算法实现了用户权限的自认证、HASH算法实现了数据真实完整性的自证明,但仅此还不能完全摆脱第三方机构的存在,因为无法防止双重花费。一旦解决了双重花费问题,第三方中心机构在电子支付系统中就不再是一种必须的存在。    于是,比特币产生了,这是一个系统。

比特币系统的实现

用时间戳服务来确定交易时序是解决双重花费的一个解决方案。原理是:交易者可以很方便的查知特定资产的处置时间(是否交易过),如果能建立一个统一的数据库就很方便了。不过,即使是中心化机构,实现起来也有些难度,因为“中心化”机构不是“唯一化”机构,在不同的中心机构之间交换数据会有一些额外的麻烦。

比特币选择了在分布式网络中建立全球统一账的方式来实现这一服务。

想法很好,说起来简单,但如何才能实现?

实现这一服务时,复杂的技术实现细节使得即使专业人员也很难一下了搞明白。非专业人员根本就不可能看懂这些原代码,不知道安全性是怎样保障的;而对金融领域一无所知的IT技术人员会疑惑为什么要搞得这样复杂(水平低的其实也看不懂),水平高的恐怕懒得去分析。所以,最初阶段,只有极少数技术高手和geek发现了比特币的价值。陆续地,更多的学者、技术人员、研究者、金融人士对比特币产生了关注,比特币也开始初现规模。

然而忽然间,投机者接踵而来,围观者蜂拥而至,比特币瞬间走出了黄金几十年所走的路程,一下子沦为了炒币的工具——比特币这样一个系统也被等同于了虚拟币。“去中心化”成为一个热门话题,好像比特币的价值在就于这是一种“去中心化”发行的“通缩型”货币。

然而,“去中心化”、“通缩性”是否真的优于“中心化”、“通胀性”本身是一个有争议性的议题(笔者的个人观点认为除非两种形式共存,任何一方单独存在都会有问题),这样,比特币系统本身一个技术上的可以明确问题,转化成为了思想上无法辨明的分歧和语言上无休止的争论。

下文会用尽可能通俗易懂的语言解释一下比特币协议实现的原理,让非专业人员也可以判断比特币的时间戳服务从安全角度上讲是否可靠。这是比特币存亡的关键。如果实现方式不可靠,那么它自然会与其他密码学货币一样消亡;如果可靠,则人们终于有机会摆脱对“中心化”的依赖,可以有了其他选择。

timthumb

在解释说明之前,还是要先引入少量几个术语:Block, Block Chain和Block Header。

Block: 交易封存账。收录了当期所有的交易。(很多地方会翻译成“区块”,从程序员角度来讲这一翻译可能更准确,因为要处理的都是一些二进制数据,写代码的人必须要清楚,但给外行人看就太抽象)

Block Chain:封存帐链。这是实现时间戳服务时的数据存储方式。

Block Header: 封存账摘要。这一摘要中有三个关键的字段,分别用于构建出(prevhash)账链、交易数据真实性验证(merkle root hash)以及封存依据(bits: 难度值)。(对程序员来说,header的准确地翻译应该是“文件头”, “摘要”这一翻译是为了能让非程序员先从直观上有个初步了解)

用P2P方式来保存block chain时首先必须解决一个问题,那就是Block chain可能会有无数个副本,在没有任何认证机构的存在下如何才能确定该副本真实?靠少数服从多数吗?难道地球人(除了个别国度的人)不知道“少数服从多数”是一种暴力吗?

Satoshi想出了一种方式,一种真实性自验证的方式,即副本本身就可以证明其自身的真实。Block Header, 一个只有6个字段,总共80字节的简单到不能再简单的数据结构,出人意料地实现了自验证。几十年没解决的复杂问题竟然有人能使用这样简单的方法就解决了,无怪乎有众多爱好者如此关注Satoshi Nakamoto的神秘身份。有些人推测Satoshi不是一个人,而是一个团队,这纯属是宣扬“集体智慧”的庸人们寻找心理平衡的一种意淫,能用如此简洁的形式来解决问题,只有一种可能,那人是个天才。(我深深理解当《新闻周刊》宣称的那个Dorian Satoshi出现在人们眼前时对比特币fans是怎样一种沉重打击,好在Satoshi本人亲自出面证实了他不是Dorian)

闲话少说,回归正文,下面解释一下实现细节:

Block chain的构建规则非常简单——

  1. 最新的block的block header中必须明确指出前一个block是哪一个;
  2. 出现分支链时只取最长链;
  3. 分支长度相同时,只收录难度值最高的block。

真实性自验证的实现:

Block header中的关键字段:

.prevblock_hash: 存储了前一block的block header的hash值,确保前一个block的block header无法被篡改,因为每个客户端无需理会其他人(客户端或节点)怎么说,自己直接验证真伪。(block header取hash就足够确保整个block的真实性了,还可以大幅提供运算效率)

.merkle_root_hash:用merkle tree算法生成该block中收录的所有交易的hash值,由于每个客户端都能验证每笔交易的合法性,确保了交易数据既无法被篡改,也无法伪造。(非程序员无需太关注算法的实现细节,这是一个公认的成熟算法,采用此算法可以大幅提高p2p网络中交易验证和封存block的速度)

.bits:本block封存所需的难度值。只有当Hash256(current block header)小于.bits时才可以封存(这就是大家所熟知的挖矿)。客户端验证该block header的hash值符合难度要求,就可以看作是真实的。但是,为什么hash值符合难度要求就可以看作真实呢?

首先,我们要知道,改变一个block能获取什么利益。改变一个封存的block可以使双重交易发生。假设攻击者A试图进行双重花费,他需要先签名支出一份coin给B,其他矿工收录了这笔交易纳入block,B认可了这笔交易(如发货)后,A将该coin另签一份发给自己,然后在其他人计算出新block前重新计算出两个以上的新block,根据最长链原则,新算出来的block将生效,而原有的交易作废了,此时B发的货就收不回来了。

那么,如果避免这种攻击,或者是否有一种方式可以让这种攻击得不偿失呢?

Satoshi想出了一个“挖矿”的方式,这使得想改变一个block需要花费巨大的算力成本,通常要拥有全网算力的51%以上才能确保成功,而即使成功,起到的作用也仅仅是实现了双重花费。这也最大程度地避免了当前最新的几个block被恶意修改(只能从后往前依次改,还要在别人还没挖出下一个block前先重新算出所有待修改的block hash)。

那么,是否有方法可以避免某人轻易获取高比例的算力,或者即使某人拥有超过全网51%以上的算力,也不情愿发起双花攻击的方法呢?Satoshi设计了一套“去中心化”的货币发行机制(实际上是个数学公式),规定将新发行的比特币分配给付出算力的矿工,由此来激励更多的人来参与并维护block chain这一时间戳服务,参与的人越多,每个人的算力比例就会越少。

此外,即使有人控制了51%以上的算力,与其冒风险来回退某笔交易,还不如维护好这一系统更有利可图。通过诚实工作的激励机制和恶意攻击所要付出的高额成本使得双重花费攻击的可能性降至最低。

另外,最为一个支付系统,也需要有运转的流动资金,“去中心化”货币发行的机制本身是可以说是一个一举两得的方法。

由此可以看出,“去中心化”发行货币只是比特币系统的一个辅助功能,强调比特币的货币发行机制会严重低估比特币系统的价值。(比特币系统中的脚本系统有很大的应用空间,实现细节涉及到的内容专业性过强,很难科普,这里就不展开讨论了)

关于比特币节点数量和算力集中的看法

比特币节点存储了block chain的全部数据(完全节点)或部分数据(非完全节点)。

比特币系统中的货币不是币,是一份交易记录,一份由数字算法签名保护的收据,是一串二进制数据。验证交易、封存交易账时都涉及到要从原始的block中解析二进制数据,节点中保存了这些信息。

多个节点相当于一个数据库的容灾备份系统,只要有一定数量和足够分散就可以了(使得即使发生核战也难以摧毁block chain)。Block chain所需的存储量是巨大的,目前的十几个G还只是小数目,不过,Satoshi 在 Bitcoin创立之初就已经设想好了这种发展趋势,并提出Simplified Payment Verification的实现方式,客户端没必要存储(将来普通的客户端也存不下这么多数据)。

由于block chain的数据真实性是自验证的,存在哪里都无所谓,所以每个客户端可以只保存所有block header就可以了。每个block header 80字节,当前所需的存储量约24兆,即使1百年后,所需的存储量也不过几百兆。Satoshi在其论文的后续讨论中早就提到过以后这种方式将是主流,所以才设计出如此精简的block header,应该说,在今后的几百年内,在存储方面,系统运转起来不会出现致命问题。

前一阵看到有观点认为应提倡增加完全节点数量,实际上这是对比特币发展的一种阻碍,比特币协议本身具备实现每秒4000次以上交易(不低于visa的平均处理能力)的可扩展性,这对存储量的要求是巨大的,对P2P网络的带宽要求也是巨大的,不可能有太多的完全节点。(参考:https://en.bitcoin.it/wiki/Scalability)

另外,算力集中或者专业化挖矿不会影响的“去中心化”发行,前面提到过,“去中心化”发行靠的是固定的算法(数学公式),不受人为因素影响。很多人可能看到矿工挖出币就以为是矿工和货币发行有关,这是个误解。这就好象淘金者可以挖出黄金,但是黄金是自然界产生的,于淘金者无关。

那么,是否会有人通过修改算法来控制规则呢?事实上,更改算法的决定权是每个客户端。比特币是开源的,客户端在实现时已经将原有算法做了硬编码,修改规则会使得其他客户端根本不接受。比如拥有100%算力的矿工自己想把每个block的收入改为100btc,每个客户端会判断出这是一个非法block,根本予以不承认,这100btc他也花不出去,白白浪费算力而已。

算力在集中,仍需要绝大多数客户端都认可某一规则,并升级客户端才行。开源算法使得没有“中心化”机构可以控制规则。

猜你喜欢

转载自gcc2ge.iteye.com/blog/2321689