比特币:一种点对点的电子现金系统

中本聪 著

李志阔(网名:面神护法) 赵海涛 焦锋 译

[email protected]

www.bitcoin.org

摘要

完全点对点的电子现金系统可以不通过金融机构,由一方直接发送在线支付给另一方。虽然数字签名为此提供了大部分解 决方案,但是如果这个系统(电子现金系统)仍然需要可信的第三方来阻止双重花费(Double-Spending),那么它的价值就会大打折扣。本文提出 了一种使用点对点网络的解决方案来应对双重花费。该(电子现金)网络通过对交易信息进行哈希运算,并将计算出的哈希值记录到一个不断延长的基于哈希运算工 作量证明的链条上,从而为交易打上时间戳。除非重新完成工作量证明,否则链条上记录的信息不可被更改。最长的链条不仅可以证明(交易)事件发生序列,也可 以证明该序列来自最大的CPU算力池。只要掌握大多数CPU算力的节点没有联合起来攻击网络,它们就将生成超过攻击者的最长的链。整个网络采用最简结构, 信息得到了最大限度的广播,节点认同最长的工作量证明链条,可以随时离开和重新加入网络。

引言

迄今为止,互联网上的贸易所涉及的电子支付几乎都需要金融机构作为可信的第三方来处理。尽管对绝大多数交易来说, 这个系统的表现足够良好,但这种基于信用的模式(Trust Based Model)天生具有一些弱点。(提供信任的)金融机构不可避免地要调解争议,这导致无法实现完全不可逆的交易。调解成本增加了交易成本,限制了实际可行 的最小交易额度,也减少了小额非正式交易发生的可能。有些服务是无法收回的,无法为这些服务提供不可逆支付的技术手段会(给我们)带来更多的成本。支付回 滚的可能性增加了人们对信用的需求,(这导致)商家必须对他们的顾客保持谨慎,索取顾客更多的个人信息。尽管如此,商家仍然会将一定比例的(支付)欺诈列 入不可避免的经营成本。虽然使用现金面对面交易可以避免这种成本以及支付过程的不确定性,但是目前在不需要可信第三方的前提下,还没有通过通信信道来完成 支付的机制。

我们需要一个基于密码学验证而不是基于信任的电子支付系统,可以允许任意双方直接进行交易而不需要借助可信的第三 方。如果交易回滚在计算上不可实现,就可以保护卖家免于支付欺诈,在此机制下,也很容易通过常规的第三方担保机制来保护买家利益。本文中,我们提出一种解 决双重花费问题的方案:使用点对点的分布式时间戳服务,对发生的交易按时间顺序生成计算证明。只要由诚实节点控制的CPU算力总和大于由有合作关系的攻击 节点控制的CPU算力总和,这个系统就是安全的。

交易

我们将电子货币定义为一串由数字签名组成的链条。每一位电子货币的所有者通过下面的方式将它转移给下一位所有者:对前一个交易和下一位所有者的公钥签署一个数字签名,并将这个签名附加在交易的末尾。收款人通过验证签名,就可以验证电子货币的所有者链条。

容易看出,通过这样的支付方式,收款人并不能确认链条上的某位所有者有没有进行过双重花费。对此最常见的解决方法 是引入一个可信的第三方权威,以承担类似于“铸币厂”的职能:它会检验每一笔交易,以阻止双重花费的出现。每一笔交易完成之后,交易涉及的电子货币就必须 回到“铸币厂”(销毁),同时发行等量的新币,只有“铸币厂”直接发行的新币才被相信不曾进行双重花费。这种解决方案的问题在于,整个货币系统的命运取决 于运行“铸币厂”的公司,每一笔交易必须通过它们检验,就像经过银行检验一样。

spacer.gif比特币:一种点对点的电子现金系统_第1张图片

还需要一种方法:让收款人可以知道前一位所有者没有签署过任何更早的交易(没有双重花费过)。为实现这个目标,我 们只需要关注本交易之前发生的交易,而不需要关心之后的交易是否试图进行双重花费。只有知晓之前发生的所有交易,才能确认历史中的交易记录没有缺失。在基 于铸币厂的模式中,铸币厂知晓所有的交易,决定哪一笔交易更早发生。为了在没有可信第三方的条件下实现这一点,交易必须被公开宣布(Publicly Announced)[1],同时我们也需要这样的一个系统,所有参与者对他们接收到的交易的历史顺序能达成共识。收款人需要获得这样的证明:大部分节点都同意,在时间顺序上(链条上的)每一笔交易都是首次出现的。

时间戳服务器

我们提出的解决方案始于时间戳服务器(Timestamp Server)。时间戳服务器通过对交易事件组成的区块进行哈希运算,从而为区块打上时间戳,并像通过报纸或者Usenet发帖一样,广播该哈希值[2][3][4][5]。通过获得哈希值的顺序,时间戳能证明特定数据在特定时间下是存在的。每个时间戳应当将前一个时间戳纳入其随机哈希值中,每一个随后的时间戳都对之前的一个时间戳进行增强,从而形成了一个链条。

spacer.gif比特币:一种点对点的电子现金系统_第2张图片

工作量证明

为了在点对点的基础上构建分布式的时间戳服务,我们需要类似亚当·贝克(Adam Back)的哈希现金[6]的 工作量证明系统,而不是报纸或者Usenet新闻组。在进行哈希运算时,工作量证明引入了对特定结果的哈希值的搜索,比如在SHA-256下,哈希值要求 以一定数量的零开始。随着被要求的零的数目的变化,完成哈希运算的平均工作量数目是呈指数级变化的。通过简单的一次哈希运算就可以验证整个工作是否合格。

时间戳网络完成工作量证明的过程是:在区块中增加一项随机数,(变换该随机数)直到找到一个值,使区块的哈希值出 现被要求数目的零。一旦CPU通过运算,完成了工作量证明,那么除非重新完成相当的工作量,这个区块就不能再被更改。之后随着新的区块被连接在该区块后 面,改变这个区块所要完成的工作量也将包含重新计算所有新区块所需要的工作量。

spacer.gif比特币:一种点对点的电子现金系统_第3张图片

工作量证明在少数服从多数时,解决了如何决定谁来代表多数的问题。如果“多数”是基于一个IP一票选出的,那么任 何可以分配很多IP地址的人都可以破坏这个投票过程。而工作量证明在本质上是一个CPU投一票,最长链包含了最大的工作量证明投入,即为大多数决定的体 现。如果大多数CPU算力被控制在诚实节点手中,诚实链条将延长地最快,超过所有的竞争性链条。想要改变一个过去的区块,攻击者必须重新完成该区块以及之 后的所有区块的工作量证明,然后才能赶上和超过诚实节点的工作。

为了平衡硬件计算速度的提高和节点参与网络的兴趣的变化(造成的全网算力的起伏),工作量证明的难度通过一个变化的平均值来调整,其目标是每小时总是产生平均数量的区块。如果区块生成的速度太快,难度就会上升。

网络

运行该网络的步骤如下:

1)新交易向全网进行广播;

2)每个节点将接收到的新交易信息纳入一个区块;

3)每个节点为自己的区块寻找指定难度的工作量证明;

4)当一个节点找到了(要求的)工作量证明,它就将这个区块向全网广播;

5)只有当这个区块包含的所有交易都是合法的且之前不曾进行消费,其他节点才会接受这个区块;

6)其他节点表示接受这个区块的方法是:使用这个被接受的区块的哈希为前导哈希,在这个区块的基础上创造下一个区块。

节点总是认为最长链就是正确的链条,并持续在它的基础上工作以延长它。如果两个节点同时广播了不同版本的新区块, 其他节点可能会首先接收到其中一个。在这种情况下,他们会在首先接收到的区块之上开始工作,但是也会保留另一个区块,以防另一个链条会变成最长链。当一个 区块的工作量证明被找到,其中一个分支变得更长时,这种平行状态才会被打破;在另一条分支上计算的节点将会切换到更长的链上来。

新交易的广播不必到达每一个节点。只要到达了一定量的节点,它们在不久之后就会被打包进一个区块中。区块广播同样也可以耐受信息的丢失。如果一个节点没有接收到某区块,那么它在接收到下一个区块时会发现自己丢失了区块,并请求下载丢失的区块。

激励

我们约定,区块里的第一笔交易是一笔特殊交易,该交易产生由区块创造者拥有的新币,这增加了对节点支持网络的激 励。由于并没有中央权威来负责币的发行,这种激励方式也提供了在流通中,电子货币最初分布的分配方案。稳定的新币固定数量的增加类似于金矿消耗资源(挖 矿)并将黄金添加到流通领域中。在我们的方案中,所消耗的资源是CPU时间和电力。

激励的另一个来源是交易费(Transaction Fee)。如果交易的输出值小于交易的输入值,它们的差值就是交易费。交易费被添加到包含该交易的区块的奖励内。一旦数量被设定的币(2100万)完全进 入流通,激励来源就可以完全转化为交易费,整个电子货币系统会实现完全的零通胀。

激励机制有助于鼓励节点保持诚实。如果一个贪婪的攻击者能够控制比所有诚实节点更多的CPU算力,他将面临选择: 是将已经付出的花费通过攻击拿回来,还是使用自己的算力诚实地工作以生成新币。他应该能发现,按照规则行事是更有利可图的,这些规则会使他获得比其他人更 多的新币,而不是破坏整个系统,降低自己财富的有效性。

spacer.gif比特币:一种点对点的电子现金系统_第4张图片

回收硬盘空间

一旦最近的交易被纳入足够多的区块之中,就可以丢弃它之前的交易数据,以节省硬盘空间。为实现这一点同时又不损害区块的哈希数据,交易信息在哈希运算时,被构建成一种Merkle树[7]的形态,只有Merkle根被包含在区块哈希之中。通过将该树的分支清除,就能将老区块压缩。内部的哈希值是不必保存的。

不包含交易信息的区块头大小约为80字节。如果我们假设区块每十分钟生成一个区块,那么一年产生的区块头数据为 4.2MB(80字节*6*24*365=4.2MB)。2008年常见的计算机操作系统的内存为2GB,摩尔定律预测,计算机内存每年的增长约为 1.2GB。因此,即便区块头必须被保存在内存中,存储也不会成为一个问题。

简化支付确认

在不运行全网络节点的情况下,确认支付也是可能的。通过不停地向网络节点发起询问,用户可以确认最长的链条,只要 保存最长的工作量证明链条的区块头数据副本,并且获得将待确认交易连接到相应区块的Merkle树分支,而尽管用户自身无法确认交易,但是通过将交易连接 在链条的某个位置,就可以看到网络节点接受了这个交易,并且随着这个交易之后区块的累加,他能进一步确认网络接受了这个交易。

只要诚实节点控制着网络,这种确认方式就是有效的,但是当网络被攻击者控制时,这种方法就变得脆弱。全功能网络节 点可以自行确认交易,如果攻击者控制网络,简化的交易确认方法就可能被攻击者编造的交易欺骗。对抗这种情况的一种策略是,可以从全功能网络节点处收听它们 发现无效区块时发出的警告信息,鼓励用户去下载被警告区块和交易的完整信息,以明确不一致是否发生。接受频繁支付的商业机构可能仍会希望运行自己的节点, 以达到更独立的安全性和更快的确认。

spacer.gif比特币:一种点对点的电子现金系统_第5张图片

价值的组合与分割

尽管逐一地对电子货币进行处理也是可能的,但是为转移中的每一分钱做独立的交易显然不明智。为了允许价值的组合与 分割,交易可以包含多个输入与输出。通常,要么是由前面的较大的交易构成单一的输入,要么是由前面的几次小额交易合并为并行输入。输出最多有两类,一类用 于支付;而如果存在找零,另一类输出则是返回给支付者的找零。

spacer.gif比特币:一种点对点的电子现金系统_第6张图片

需要指出的是,当一笔交易会依赖之前的多笔交易,而被依赖的这些交易又会依赖更多之前的交易时,不会产生任何问题。因为这个机制永远不用去提取交易历史完全的独立副本。

隐私

传统的银行模式通过可信的第三方和限制获取相关当事方的信息,实现一定程度的隐私性。而将所有交易公开宣布的必要 性排除了上述方法实现的可能。但是在这一过程中还是可以获得隐私性的:保持公钥的匿名性。公众可以看到一些人将一些钱送给了另一些人,但是却没有信息表示 这些交易与哪些人有联系。这与股票交易所发布信息的隐私性是类似的,被公布的信息包括股票交易的时间与大小,“交易”是记录在案且可查询的,却没有表明交 易者的身份信息。

spacer.gif比特币:一种点对点的电子现金系统_第7张图片

作为一个额外的预防措施,每次交易应该使用新的密钥对,以确保密钥对不会与某个使用者联系起来。但是由于并行输入 的存在,一些联系的发生依然是不可避免的,因为并行输入会告诉别人这些币属于同一个所有者。其中的风险在于,如果一个秘钥的所有者被泄露了,属于同一个所 有者的其他交易也可能被泄露。

计算

设想如下场景:一个攻击者试图生成一条具有替代性的链,这条链的延长速度比诚实链的延长速度更快。即便这一目的达 成了,也不意味着系统可以任攻击者为所欲为,比如凭空制造币或者拿走从来不属于他的币。节点不会接受一个无效的交易,而诚实节点永远不会接受包含无效交易 的区块。攻击者唯一能尝试的是:改变一笔自己的交易,并尝试把钱从他最近的花费中拿回来。

诚实链和攻击链之间的竞赛具有二项随机漫步的特点。成功事件意味着诚实链延长了一个区块,领先+1;失败事件则意味着攻击链延长了一个区块,差距-1。

攻击者成功填补某一既定差距的概率类似于赌徒破产问题。假定一个赌徒拥有无限的透支信用,然后开始进行潜在次数为无穷的赌博,以试图填补自己的亏空,那么我们可以计算他补上亏空的概率,也就是该攻击链赶上诚实链的概率,如下所示[8]

spacer.gif比特币:一种点对点的电子现金系统_第8张图片

假定p>q,那么攻击成功的概率就随着攻击者要追上的区块数的增长而呈现指数下降。概率是攻击者的敌人,如果他最开始不能获得幸运的突破,那么随着他落后的越多,他成功的机会就会变得无限渺茫。

现在考虑一下,一个新交易的收款人需要等到多长时间,才能足够确信发款人已经不可能改变这笔交易了。假设付款人是一个攻击者,他希望收款人相信他已经付过款了,然后过一段时间将已支付的款项重新发回给自己。付款人希望就算届时收款人会察觉这一点,也已经于事无补。

对此,收款人生成一个新的密钥对,然后在交易签署前不久将公钥发送给付款人。这可以防止付款人预先准备好一个链, 然后持续地对此区块进行运算,直到他的链幸运地超越了诚实链,然后立即执行支付。在此情形下,只要交易一发出,攻击者就开始悄悄地准备一条包含了该交易替 代版本的平行链条。

收款人将等待交易出现在首个区块中,然后等到z个区块连接在其后。此时,他仍然不能确切地知道攻击者已经进展了多少个区块,但是假设诚实区块产生一个区块将耗费平均预期时间,那么攻击者的潜在进展就是一个泊松分布,分布的期望为

spacer.gifimage.png

在此情形下,为了计算攻击者追赶上的概率,将攻击者取得进展区块数量的泊松分布的概率密度乘以在该数量下攻击者依然能够追赶上的概率。

spacer.gifimage.png

将其简化为如下形式,避免对无限数列求和:

spacer.gifimage.png

转化为C语言代码[9]


 
  

#include double attackersuccessprobability(double q, int z){
   double p = 1.0 - q;
   double lambda = z * (q / p);
   double sum = 1.0;
   int i, k;
   for (k = 0; k <= z; k++)
   {
       double poisson = exp(-lambda);
       for (i = 1; i <= k; i++)
           poisson *= lambda / i;
           sum -= poisson * (1 - pow(q / p, z - k));
   }
   return sum;}


对其进行运算,可以得到如下的概率结果,发现概率对z值呈指数下降。

当q=0.1时

z=0 p=1.0000000

z=1 p=0.2045873

z=2 p=0.0509779

z=3 p=0.0131722

z=4 p=0.0034552

z=5 p=0.0009137

z=6 p=0.0002428

z=7 p=0.0000647

z=8 p=0.0000173

z=9 p=0.0000046

z=10 p=0.0000012

当q=0.3时

z=0 p=1.0000000

z=5 p=0.1773523

z=10 p=0.0416605

z=15 p=0.0101008

z=20 p=0.0024804

z=25 p=0.0006132

z=30 p=0.0001522

z=35 p=0.0000379

z=40 p=0.0000095

z=45 p=0.0000024

z=50 p=0.0000006

求解令p<0.1%的z值,具体如下。

为使p<0.001,则

q=0.10 z=5

q=0.15 z=8

q=0.20 z=11

q=0.25 z=15

q=0.30 z=24

q=0.35 z=41

q=0.40 z=89

q=0.45 z=340

结论

我们在此提出了一种不依赖信任的电子交易系统。首先讨论了源自数字签名的常见的电子货币框架,这种架构提供了强有 力的所有权控制,但是不足以防止双重花费。为了解决这个问题,我们提出了一种采用工作量证明机制的点对点网络,以记录公开的历史交易信息。只要诚实的节点 能够控制大多数的CPU计算能力,就能使攻击者在事实上难以改变这些交易记录。该网络的强健之处在于它简洁的非结构化设计。节点之间的工作大部分是相互独 立的,只需要很少的协作。由于信息只需要最大努力地传播自身,而无任何特定的流动路径要求,所以节点不需要验证身份。节点可以随时离开网络或加入网络,只 需要下载工作量证明链条,并将其作为节点离开网络的时间内系统所发生的事件的证明。节点通过自己的CPU算力进行投票,以延长合法区块的链条反映对合法区 块的接受,或以拒绝在无效区块之后延长链条反映对无效区块的拒绝。

在这个共识机制里面,所需的任何规则和激励措施都可以用本共识机制来执行。

[1] 戴伟,a scheme for a group of untraceable digital pseudonyms to pay each other with money and to enforce contracts amongst themselves without outside help,引自于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, p 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, p 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, p 28-35,April 1997. on Computer and Communications Security, p 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, P 122-133,April 1980.

[8] W. Feller, An introduction to probability theory and its applications, 1957。

[9] 引用自https://bitcoin.org/bitcoin.pdf。

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=339

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

你可能感兴趣的:(比特币:一种点对点的电子现金系统)