自从比特币问世以来,区块链一直被大众所关注。有人认为它是一场新的技术革命,直接与蒸汽革命和电力革命相提并论;有人认为它是未来发展的方向,将会彻底改变生产关系;有人将它看作一次创造财富的机会,书写财富神话;而有人认为去中心化只不过是一种乌托邦式的空想,无法应用于现实社会。
哪种才是正确的说法,我们无法求证。我们也不能人云亦云,跟随别人的认知去做判断。更不能被各种不同的观点带进了迷雾,怕错过机会,又害怕进错了场,结果只是在原地彷徨。
想彻底理解一件事物,必须从源头上去了解,掌握其来龙去脉。否则可能只是断章取义,差之毫厘,谬之千里。
想彻底理解区块链,也必须从其源头——比特币开始了解。了解比特币,最直观最直接的方式,就是阅读原版的白皮书《Bitcoin:A peer-to-peer electrnic cash》。
还记得2014年,当时从事密码方面的工作,那时第一次读完比特币的白皮书,整个人都激动得差点睡不着觉,逢人就讲比特币的设计原理,如何完美的以密码学的方式构建信任。
今天,在更多更深入地了解了区块链之后,我重新再读比特币白皮书,没有第一次读到时候的惊喜,但更能感觉到其最核心的意图和本质了。
因此,我决定认真阅读白皮书,并将其翻译成中文,力求表达清楚原文的意思。如果你希望理解区块链的本质,也希望你从阅读比特币白皮书开始。
以下为译文:
Satoshi Nakamoto
[email protected]
www.bitcoin.org
摘要:一种纯粹的点对点的电子现金系统,它允许直接从一方在线付款给另一方,而不需要任何金融机构的参与。数字签名提供了部分解决方案,但是如果任然需要一个可信的第三方来防止重复消费,其主要的优势又将丢失了。我们提出了一种基于点对点网络的解决方案。网络通过HASH算法给每笔交易打上时间戳,然后把它们写进基于工作量证明的链条里,组成了一个不可扬篡改的记录,除非重新完成工作量证明。最长的链不仅提供事件证人的序列,而且证明它来自最大的CPU算力池。由于大部分CPU算力被节点控制不去攻击网络,他们会产生最长的链并赶超攻击者。网络本身需要最小的结构。消息尽可能多地进行广播,节点可以按照他们的意愿随时离开或重新加入网络,接受最长的工作量证明链条作为离开过程中所发生的所有交易的证明。
基于网络的贸易活动几乎完全依赖于作为可信第三方的金融机构来处理电子交易。在大多数交易场景下,系统能够工作得足够好,但是它仍然有遭受基于这种信任模型的固有缺陷。完全不可逆的交易是不可能的,因为金融机构不可避免调解纠纷。中介的代价增加了交易的成本,从而限制了最小实际交易大小,这就切断了可能发生的一些偶然的小额交易,而且,对于非可逆支付能力的丧失,失去了非可逆服务这一更大代价。由于可逆交易的可能性,对于信任的需求在增大。商家必须警惕他们的顾客,向他们索取更多的信息。一定比例不可避免的欺诈是允许的。这些成本和交易的不确定性可以通过使用实物现金来避免,但是没有一种机制在一个不受信任的网络渠道上进行。
我们需要一种电子支付系统,它基于密码算法证明而不是信任,允许任意两方直接进行交易而不需要一个可信的第三方。计算上无法逆转的交易将保护卖方防止欺诈,常规的代管机制很容易实施来保护买家。在这篇论文里,我们提出了一种通过点对点分布式时间戳服务器来产生按时间顺序的交易的计算证明,来解决重复消费问题。只要诚实节点比攻击节点控制更多的CPU算力,系统就是安全的。
我们定义了一种由数字签名链组成的电子货币。货币所有者通过将上一笔交易和下一个所有者的公钥进行数字签名,然后加入到链的尾部。收款者通过验证签名来确定链的所有者。
问题是收款者无法验证所有者是否进行了重复消费。一种通用的做法是引入一个可信的第三方机构,或造币厂,用于检查每笔交易是否是重复消费。在每笔交易后,货币必须返回到造币厂来发行一枚新的货币,而且仅有造币厂直接发行的货币才被信任未进行重复消费。这种解决方案的问题是整个货币系统的命运取决于运行造币厂的公司,每一笔交易必须由造币厂,就像银行一样。
我们需要一种方式让收款方知道货币的前一个所有者没有签署更早的交易。我们的目的是,关注先前的交易,而对于后来的重复消费我们不关心。确认交易是否存在的唯一方式是关注所有的交易。在造币三年的模型中,造币厂关注所有的交易,并且决定哪一个先到达。为了在没有信任机构的情况下实现这一点,交易必须公开广播,我们需要一个系统让参与者将接受到的交易维护一个一致的顺序。收款方需要证明在每一笔交易的时刻,大多数节点同意它是第一次到达。
我们提出的方案起始于一个时间戳服务器。时间戳服务器通过将区块打上时间戳的并计算hash然后将其广泛传播出去,就像在报纸或新闻上发布。时间戳证明在这个时间数据必然存在,显然地,为了计算出hash。每个时间戳包含了上一个时间戳的hash,组成一个链条,每个后续的时间戳又加强了前面的时间戳。
为了在一个点对点的网络基础上实现一分布式的时间戳服务器,我们需要使用一个工作量证明系统,类似Adam Back的hashcash,而不是报纸或新闻。工作量证明包括当计算hash例如sha256时,找到一个值让hash值满足开始的若干位是0。平均工作量和0的位数成指数关系,但是可以通过执行一次hash来验证。
对于我们的时间戳网络,我们实现了一种工作量证明,通过不断增加随机值,直到找到一个值满足区块的hash值所需要的0的位数。一旦CPU工作满足了工作量证明,区块无法更改除非重做工作量证明。由于后面的区块链接在它的后面,改变区块的工作包括重做其后的所有区块。
工作量证明同时解决了大多数人为代表作出决定的问题。如果大多数基于one-IP-address-one-vote,这将会被那些可分配多个IP者破坏。工作量证明本质上是one-CPU-one-vote。最长的链代表了大多数人的决定,也包含了最多的工作量证明。如果诚实节点控制了大多数的CPU,那么诚实链将会以最快的速度增长,并且赶超那些竞争链。如果攻击者试图修改一个过去的块,那么它必须完成这个块以及之后所有块的工作量证明,然后追赶并超越诚实节点。我们将会在后面证明一个落后的攻击者追赶上的概率随着后续区块的增加而成指数级下降。
为了补偿硬件速度的增加和运行节点数量的增多,工作量证明的难度由一个平均移动的目标保证在每个小时产生固定数目的区块。如果区块生成得过快,则会增加难度。
运行网络的步骤如下:
1)新的交易广播到所有的节点。
2)每个节点将新的交易纳入自己的区块。
3)每个节点试图为自己打包的区块找到一个工作量证明。
4)当一个节点找到了工作量证明,它广播所这个区块给所有节点。
5)如果区块内的所有交易是有效的并且未在之前交易过,节点就接受这个区块。
6)节点接受区块后会在其上打包下一个区块,将接受的区块的hash作为前一个区块的hash。
节点通常认为最长的链是正确的并且在其上工作以延长它。如果两个节点同时广播了下一个区块的不同版本,有些节点会先后接受到其中的一个或另一个。在这种情况下,他们在先接收到的区块上工作,同时保留另一个分支以免它变得更长。这种僵局直到下一个工作量证明被找到并且其中一个分支变得更长; 工作在另一个分支上的节点将会切换到更长的链上。
新的交易广播不需要到达所有的节点。一旦它们到达一些节点,不久就会被打包进区块。区块广播也可以允许消息丢失。如果一个节点没有接收到一个区块,它将会在收到下一个区块或者意识到它丢失了块后请求这个丢失的块。
按照惯例,区块的第一笔交易是一个特殊的交易,这笔交易会发行新的货币,新的货币归区块的打包者所有。这增加了节点支持网络的动力,并且提供了一种将初始货币分民到流通中去的方式,由于这里没有中心化的机构来发行货币。稳定数量的新的货币增加类似于矿工消耗资源来增加黄金的流通。在我们的案例中,CPU时间和电力就是消耗的资源。
激励也可以来自于交易费。如果交易的输出小于输入,差值将作为交易费加入到挖取这个区块的奖励费中。一旦预先确定数量的货币进入流通之中,激励费用将完全切换为交易费用而避免通货膨胀。
激励机制将会鼓励节点保持诚实。如果一个贪婪的攻击者能够控制比诚实节点更多的CPU算力,他将会选择偷会他付出去的钱或者产生新的货币。他将会发现遵守规则将会获得更多的新货币,而不是破坏系统和他自己的货币的有效性。
一旦最新交易处于足够的区块之下,在它之前的已花费的交易可以被丢弃以节省硬盘空间。为这实现这一机制而不破坏区块的哈稀,交易被哈稀进默克尔树,只有默克尔树根才被包含在区块哈稀里边。旧的区块可以通过去掉默克尔树枝而被压缩。默克尔树内部的哈稀不需要保存。
一个不含交易的区块头大概80个字节。如果区块每10分钟产生一个,80B624*365=4.2MB每年。拿2008年销售的主流电脑来说,内存基本都在2GB,按照摩尔定律每年增加1.2GB,即使将所有的区块头都存储在内存中也不成问题。
不运行完全节点来验证支付是可能的。一个用户只需要保存一个最长工作量证明链条的副本,它可以通过网络节点查询以保证他拥有了最长的链条,并且获得交易所在块的默克尔树枝。他无法自己验证这笔交易,但是通过链接到链条中的某个位置,他可以知道网络节点接受了它,并且在其之后的区块进一步确定网络已经接受了它。
因此,只要诚实节点控制着网络,验证就是可靠的。但是也更容易受攻击如果网络被攻击者控制。当网络节点能够自己验证交易时,简单方法会被攻击者伪造的交易所欺骗,如果攻击者仍然控制着网络。一种避免这种情况的策略是接收网络节点的告警当它们发现无效的区块时,提示用户的软件下载完整节点,提示确认交易不一致。经常接收到支付的商业机构可能仍然愿意运行自己的节点以确保安全性和更快的验证。
尽管单独处理货币是可能的,但是让每次进行一分交易并不是广泛使用的。为了使价值能够分割和合并,交易包含多个输入与输出。通常会有单独一笔大额输入或者多笔小额输入,多数时候有两笔输出:一个是支付项,另一个是找零,找回到发送者的账户。
需要注意的是扇出,即一笔交易依赖多笔交易,这些交易又依赖更多的交易,这并不是问题。不需要解析一笔交易的所有历史交易。
传统的银行模型通过限制参与机构和可信第三方的信息来达到一定程度的隐私保护。公开广播所有交易否认了这种模式,但是仍然可以通过在另一个地方中断信息流:保持公钥的匿名性。公众可以看到某人向另一个人发送了一笔交易,但是没有信息可以链接到某个人。这就类似于股票交易所的信息,时间和数额公开显示,但并不会告诉你具体的机构。
作为另一个安全措施,每一笔交易应该使用一对新的密钥对来防止链接到某一个人。但是对于多笔输入的交易,一些链接关系是无法避免的,这必然会显示这些输入是被同一个人所拥有。风险就是如果其中一个密钥泄露,链接会显示属于同一个所有者的所有交易。
to do.
我们提出了一种依赖信任的电子现金系统。我们从通用的数字签名的电子货币开始,这提供了健壮的所有权,但是无法阻止双重消费。为了解决这个问题,我们提出了一种基于工作量证明的点对点网络,来记录一个公开的交易历史,如果诚实节点控制了大部分算力,一个黑客想要修改交易在计算上是不可行的。节点几乎不需要协调地同时工作。它们不需要身份标识,由于消息不需要发送到特定的路径,而只需要尽可能多地分发消息。节点可以按照意愿随时离开和重新加入网络,接受工作量证明链条作为它们离开期间所有发生的交易的证明。他们使用CPU算力进行投票,他们接受有效的块并在其上工作并延长它,拒绝无效的块拒绝在其上工作。通过这种共识机制,所有的规则和激励机制得以执行。
References
[1] W. Dai, “b-money,” http://www.weidai.com/bmoney.txt, 1998.
[2] H. Massias, X.S. Avila, and J.-J. Quisquater, “Design of a secure timestamping service with minimal
trust requirements,” In 20th Symposium on Information Theory in the Benelux, May 1999.
[3] S. Haber, W.S. Stornetta, “How to time-stamp a digital document,” In Journal of Cryptology, vol 3, no
2, pages 99-111, 1991.
[4] D. Bayer, S. Haber, W.S. Stornetta, “Improving the efficiency and reliability of digital time-stamping,”
In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993.
[5] S. Haber, W.S. Stornetta, “Secure names for bit-strings,” In Proceedings of the 4th ACM Conference
on Computer and Communications Security, pages 28-35, April 1997.
[6] A. Back, “Hashcash - a denial of service counter-measure,”
http://www.hashcash.org/papers/hashcash.pdf, 2002.
[7] R.C. Merkle, “Protocols for public key cryptosystems,” In Proc. 1980 Symposium on Security and
Privacy, IEEE Computer Society, pages 122-133, April 1980.
[8] W. Feller, “An introduction to probability theory and its applications,” 1957.