区块链资讯
数字货币行情

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

中本聪比特币白皮书中文版

摘要

一个真正的点对点(P2P)电子现金系统,应该允许一方向另一方直接发起网络支付,而不需要经过任何金融机构。数字签名技术能够解决部分问题,但是如果仍然需要可信第三方支持才能够防止双重支付(double-spending),那么这种系统就失去了重要价值。本文提出一种能在点对点网络下解决双重支付的办法。该系统会将所有交易并入一个基于散列工作量证明的链,由此每笔交易就会具有时间先后顺序,并且,除非重新完成所要求的工作量证明,否则形成的交易链是不可更改的。最长的交易链不仅可以看做交易顺序的证明,而且可以被认为是具有最大CPU计算能力那一方达成共识的证明。只要大多数CPU计算力节点没有打算合作起来对系统进行攻击,那么这些节点生成的交易链会是最长的,而且会超过攻击者的链。这个系统的运行条件非常简单——信息尽最大努力在全网进行传播即可。只要承认具有最大工作量证明的链,任何节点都可以随时加入或离开。

1. 绪论

目前互联网上的贸易,几乎都需要借助金融机构作为可信赖的第三方来处理电子支付。虽然这类系统在绝大多数情况下都运行良好,但是其仍然受限于“基于信用模式”所固有的弱点。由于无法实现完全不可逆的交易,金融机构总是不可避免地会协调争端。调停损失会增加交易成本、限制最小交易规模,进而无法实现日常小额交易,而且,在缺乏信任的环境下实现不可逆交易需要付出更大的成本。由于交易存在取消的可能,双方需要互相信任才会进行交易。商家会向客户索取完全不必要的个人信息以预防其蓄意破坏交易。在实际的商业行为中,一定比例的欺诈性客户是无法避免的。这些费用和支付的不确定性在使用物理现金的情况下是可以避免的,并且完全无需第三方信用中介的参与。

我们需要这样一个电子支付系统,基于密码学原理而不是信任,就能够使得任何达成一致的双方直接进行交易,同时不需要第三方信任中介的参与。交易无法取消,就可以保护卖方免于欺诈;同时也很容易实现常规的托管机制来保护买方的利益。在本文中,我们提出一种通过点对点分布式的时间戳服务器来生成依照时间前后顺序排列的具有工作量证明的交易链,从而解决双重支付问题。只要诚实的节点所控制的计算能力大于任何一个攻击者(cooperating group),该系统就是安全的。

2. 交易

我们用一串数字签名来定义电子货币。每一位所有者通过对前一次交易和下一位所有者的公钥进行散列并生成数字签名,将签名附加于这枚电子货币的末尾,即对电子货币进行了发送。收款人通过对签名进行验证,就能够确认发送者是否拥有该电子货币。

比特币价格行情

该流程的问题在于,收款人难以确定付款人是否对这枚电子货币进行了双重支付。通常的解决方案是引入可信任的第三方权威,或者类似于造币厂的机构,来对每一笔交易进行防止双重支付的检查。每笔交易的过程中,造币厂会会回收该电子货币,同时发行另一枚新的电子货币,并且只有造币厂直接发行的电子货币才是有效的,这样就能够有效地防止双重支付。这个解决方案的问题在于,每一笔交易都要经过造币厂的确认,因此整个货币系统的命运完全依赖于运作造币厂的公司,造币厂就好比是一家银行。

我们需要收款人拥有某种方法,能够确保付款人在本次交易之前没有对该电子货币进行支付签名。实现这样的目标,我们只需要关注本次交易之前是否有过支付,而不需要关注本次交易之后会不会双重支付。为了确认一个交易是不存在的,那么唯一的方法就是查看之前的所有交易。在造币厂模型中,造币厂知晓所有的交易,并且决定交易完成的先后顺序。如果想要实现不需要第三方信任机构就能检查双重支付,那么交易信息就应当被公开[1],我们需要一个包含所有参与者都承认的历史交易序列的系统。收款人在交易期间需要验证是否大多数节点都认同该电子货币的支付签名是首次出现。

3. 时间戳服务器

我们提出的解决方案是从一个“时间戳服务器”开始的。时间戳服务器会对由一组数据(items)组成并带有时间戳的区块进行散列,并将该散列值进行广播,就像报纸或全球新闻网(Usenet)的传播一样[2-5]。显然,时间戳能够证明该组数据在该时间是确实存在的,因为只有加入了该时间戳才能够得到相应的散列值。每个散列值应当包含上次的散列值,后面的散列会对前面的散列进行增强(reinforcing),这样就会形成一个链。

比特币价格行情

4. 工作量证明

在点对点的基础上实现一组分布式的时间戳服务器,仅仅像报纸或全球新闻网那样是不够的,我们还需要使用类似于Adam Back提出的哈希现金[6]那样的工作量证明系统。在进行散列运算时,工作量证明机制会对某一个特定的值进行检测,例如:若采用SHA-256算法进行散列,要求散列值必须以一串0开始。随着所要求0的个数的上升,那么所需要的平均工作量的难度将呈指数级增长。此外,若要对散列值进行验证,仅需一次散列运算。

在我们的时间戳服务器组成的网络中,区块中会放置一个随机数,通过不断地调整这个随机数来使得该区块的散列值满足0的个数要求。一旦耗费的CPU计算力满足了所要求的工作量,那么除非重新完成相同的工作量,否则该区块的信息就是不可更改的。由于之后的区块是连接在该区块之后的,所以想要更改该区块中的信息,就必须完成之后所有区块所要求的全部工作量。

比特币价格行情

同时,该工作量证明机制还解决了在进行投票表决时,谁是多数的问题。如果决定多数的方基于一ip地址一票,那么一旦有人能够控制大量ip地址,该表决机制就会被破坏。工作量证明机制的本质是一CPU一票。“多数CPU”的决定表现为最长的链,因为最长的链包含了最大的工作量。如果多数的CPU为诚实的节点控制,那么诚实节点的链将以最快的速度延长,并超越其他的竞争链。如果想要对之前生成的区块进行修改,攻击者必须付出该区块及其之后所有区块的工作量,然后赶上并超越诚实节点生成的链。我们将在后文证明,随着区块数量的增加,一个较慢的攻击者攻击成功的概率将呈指数化降低。

为了抵消不断加快的硬件运算速度和参与节点数量的变动引发的工作量能力的差异,工作量证明的难度(difficulty)将采用移动平均的方法来确定,即能保持每小时生成区块的数量为某一个预定值时的难度大小。如果区块生成的速度过快,那么难度就会提高。

5. 网络

运行该网络的步骤如下:

  1. 新的交易向全网进行广播
  2. 每个节点都将收到的新交易信息纳入一个区块中
  3. 每个节点都尝试在自己的区块中找到一个满足难度要求工作量证明
  4. 当一个节点找到了一个工作量证明,就向全网进行传播
  5. 当包含在该区块中的所有交易都是有效的且未被签名支付过,其他节点才认同该区块的有效性
  6. 其他节点若接受该区块,则会在该区块的末尾,使用该区块的散列值制造新的区块来延长该链

节点始终都将最长的链视为正确的链,并为了延长该链而持续工作。如果两个节点同时广播了不同版本的新区块,那么其他节点在接收到两个区块的时间上将存在先后差别。在此情形下,他们将在第一个收到的区块的基础上进行工作,但也会保留另外一个区块,以防止后者变成更长的链。该僵局将会在下一个具有工作量证明的区块出现时打破,其中的一条链会被证明是较长的链,那么在另外一条分支链上工作的节点将会改变并在这条较长的链上进行工作。

新的交易并不需要广播至全部的节点。只要交易信息能够广播至足够多的节点,就会很快被整合进入区块中。区块的广播对被丢弃的信息是有容错能力的。如果一个节点没有收到某个特定区块,那么该节点将会发现缺失了某个区块,并会向其他节点提出下载该区块的请求。

6. 激励

我们约定:每个区块的第一个交易都是一笔特殊的交易,该交易产生一枚属于该区块创造者的新电子货币。这样就为了节点支持该网络进行了激励,在没有中央集权机构发行货币的情况下,这种方式提供了一种将电子货币分配到流通领域的方法。这种将一定数量的新货币持续增添到货币系统中的方法,非常类似于耗费资源去挖掘金矿并将黄金注入到流通领域的情况。在我们的系统中,CPU的运算时间和电力就是耗费的资源。

另外一个激励的来源则是交易费。如果某笔交易的输出值小于输入值,那么差额就是交易费,该交易费奖被增加到该区块的激励中。只要既定数量的电子货币已经开始流通,那么激励机制就可以逐步转换为完全依靠交易费,并且免于通货膨胀。

激励系统也有助于鼓励节点保持诚实。如果有一个贪婪的攻击者能够调集比所有诚实节点加起来还要多的CPU计算力,那么他就面临一个选择:“偷回”其已经支付给他人的货币,或者诚实工作产生新的电子货币。那么他就会发现,按照规则行事、诚实工作是更加有利可图的。因为该规则使得他能够获得比其他人加起来还要多的电子货币,而不是破坏这个系统使得其自身财富的有效性受损。

7. 回收硬盘空间

如果一枚货币的最近的交易已经被纳入了足够多的区块之中,那么为了回收硬盘空间,就可以丢弃该货币之前的交易数据。为了确保不破坏区块的散列值,交易信息在被散列时,会构建成一种Merkle树[7]的形态,使得只有根(root)被纳入区块。通过该树分支拔除的方法,老区块就能够被压缩,而区块内部的散列值也是无需保存的。

比特币价格行情

不含交易信息的区块头仅有80字节。如果我们设定区块生成速率为每10分钟一个,那么一年产生数据的大小为4.2MB(80bytes * 6 * 24 * 365)。2008年,PC系统通常的内存容量为2GB,按照摩尔定律预言当前增长速度为1.2GB每年,那么未来即使将全部的区块头信息存储在内存之中都是没有问题的。

8. 简化的支付确认

在不运行完整的网络节点的情况下,也能够对支付进行检验。一个用户仅需保留最长工作量证明链区块头的信息(通过不断向网络发起询问,直到确认拥有最长的链),得到能查找交易及包含该交易信息块的Merkle分支。节点想要自行检验交易的有效性是不可能的,但通过检查该交易在链上的位置,就能够确认某个节点已经接受了该交易,并且于其后追加的区块都会进一步证明全网已经接受了该交易。

比特币价格行情

只要诚实的节点控制了网络,校验机制就是可靠的。但是,当攻击者的计算力占优势时,该验证机制会变得较为脆弱。在网络节点自行确认交易的有效性时,只要攻击者能够持续地保持计算力优势,简化的验证机制会被攻击者伪造的交易所欺骗。一个可行的策略是,一旦发现了一个无效的区块,就立刻发出报警,促使采用简化验证方式的用户下载完整区块和被警告的交易,以便确认信息的不一致性。对于会发生大量日常交易的商业机构,可能会希望运行他们自己的完整节点,以保持更大的独立安全性和更快的校验速度。

9. 价值的分割与合并

尽管可以将电子货币分到不同的账户,但是,将一笔交易采用一枚一枚电子货币的方式进行是笨拙的。为了使得货币易于合并和分割,交易被设计为允许多个输入和输出。一般而言,输入分为两种:某次金额较大的交易构成单一输入,或者由几次较小金额构成的并行输入,但是输出最多只有两个:一个用于支付,一个用于找零(如有)。

比特币价格行情

需要指出的是,当一笔交易依赖于之前的多笔交易,而这些交易又各自依赖于更多的交易,这是正常的。这些交易依赖并不意味着需要从交易历史记录中抽取个独立副本出来。

10. 隐私

传统的银行模型为交易的参与者提供了一定程度上的隐私保护,因为试图向交易涉及的可信任第三方索取交易信息是受到限制的。如果将交易信息向全网进行广播,那么就无法通过这个方法来保护隐私。但是,通过隐藏的交易信息的某个环节——公钥匿名,隐私仍然是可以得到保护的。公众得到的信息仅仅是有某个人将一定数量的货币支付给了另外一个人,但是难以将该交易同特定的人联系在一起。这和股票交易发布的信息是类似的,股票交易的时间和数量是可供查询的,但是无法获知具体是“谁”在进行交易。

比特币价格行情

作为额外的保护措施,使用者可以让每次交易都生成一个新的地址,以确保这些交易不被追溯到一个共同的所有者。由于并行输入的存在,一定程度上的追溯还是不可避免地,因为并行输入表明这些货币属于同一个所有者。这种隐私保护的方法风险在于,如果某人的公钥暴露了,那么就可以借此公钥追溯出此人的其他交易。

11. 相关计算

设想如下场景:一个攻击者拥有更快的计算力并且试图生成另一条链来代替诚实节点生成的链。即使他能达到这一目的,也不意味着整个系统就能够被攻击者完全控制,例如:不能够凭空创造价值(货币),或者使用不属于攻击者的货币。这是因为节点不会接受无效的交易,并且诚实的节点也永远不会接受一个包含无效信息的区块。一个攻击者能做的,最多是更改他自己的交易信息,比如,拿回他刚刚付给别人的钱。

诚实链和攻击链之间的竞赛,可以看做二叉随机漫步(Binomial Random Walk)。成功事件定义为诚实链延长了一个区块,其领先性+1,而失败事件则是攻击链被延长了一个区块,使得差距-1。

攻击者弥补某一既定差距的概率,可以近似地看做赌徒破产问题。假定一个赌徒拥有无限的透支信用,然后开始进行无数次的赌博,直到填补上自己的亏损。那么我们可以计算出赌徒填补上亏损的概率,也就是攻击者追上诚实链的概率,如下所示[8]:

p = 诚实节点发现下一个块的概率

q = 攻击者发现下一个块的概率

q_z = 攻击者消除z个块差距的概率

比特币价格行情

假定p>q,那么攻击者追上的概率会因为区块数z的增长而呈指数级下降。由于攻击者找到下一个块的概率较小,倘若其不能幸运且快速的获得成功,那么他最终追上的机会会随着时间的流逝而变得越来越小。

我们现在讨论一个收款人究竟需要等待多长时间,才能够确信付款人已经难以改变交易。假设付款人是一个攻击者,他希望能够让收款人在一段时间内相信他已经付过款了,然后建立新的分支将支付的款项重新支付给自己。虽然收款人之后会发现这一点,但等到发现时收款人已经无能为力了。

收款人生成一个新的密钥对,然后将公钥发给付款人,让其马上签名支付。这样可以防止以下情况:付款人预先准备好一个区块然后不断地对此区块进行散列运算,直到运气好让他的链超过了诚实链,然后付款人才进行支付。交易一旦发出,攻击者就开始秘密地准备一条包含了他自己交易的平行链来替代刚刚支付出去的链。

收款人会等待交易出现在一个区块中,并且紧随其后有z个区块。此时,收款人仍然不能确切知道攻击者已经进展了多少个区块,假设诚实区块将耗费平均预期时间产生一个区块,那么攻击者的潜在进展服从泊松分布,其期望值为:

比特币价格行情

攻击者追赶上的概率为:一定进展区块数量下的泊松概率密度,乘以在该数量下依然能够追赶上的概率。

比特币价格行情

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

比特币价格行情

写为如下C语言代码:

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

12. 结论

本文提出了一个不基于信用的电子支付系统。首先讨论了采用电子签名原理的电子货币框架,虽然这种系统为所有权提供了强有力的保证,但是不足以防止双重支付。为了解决这个问题,我们提出了一种采用工作量证明机制的点对点网络来记录公开的交易信息,只要诚实的节点能够控制绝大多数的CPU计算力,就能使得攻击者难以改变交易记录。该网络的强健之处在于它非结构化简洁性。节点的工作只需要很少的协同。由于信息只要尽最大努力传播而不通过任何特殊渠道,因此节点并不需要识别身份。节点可以随时离开网络,而想重新加入网络也非常容易,只需要接受离开期间的工作量证明链即可。节点通过自己的CPU计算力进行投票,它们不断延长有效的区块链来表达自己的确认,并拒绝在无效的区块之后延长区块以表示拒绝。这套交易系统共识机制包含所有需要的规则和激励措施。

参考文献

[1] W. Dai, a scheme for a group of untraceable digital pseudonyms to pay each other with money and to enforce contracts amongst themselves without outside help(一种能够借助电子假名在群体内部相互支付并迫使个体遵守规则且不需要外界协助的电子现金机制),”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.

赞(0) 打赏

华为系团队打造,不花一分钱,每天躺赚200元
未经允许不得转载:三氪猫数字货币媒体 » 比特币:一个点对点电子现金系统

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏