重新回顾下比特币:一种点对点的电子现金系统

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

中本聪 satoshin

摘要

一个完全通过点对点技术实现的电子现金系统,将允许在线支付直接由一方发起并支付给另一方,中间不需要通过任何的金融机构。虽然数字签名(Digital signatures)部分解决了这个问题,但是如果仍然需要一个可信任的第三方来防止双重支付的话,那么这种系统的主要优势就会丧失殆尽。我们提出一种通过点对点分布式的时间戳服务器来记录交易历史,并且将交易历史存储在计算上不可更改的记录中的解决方案,除非重新完成所有后续的工作。这样一个系统只要诚实的参与者集体控制的算力大于所有合作的攻击者节点的算力,就能保证安全。

1. 简介

互联网上的贸易,几乎都需要借助金融机构作为可信的第三方来处理电子支付信息。虽然这类系统在绝大多数情况下都运作良好,但是这类系统仍然内生性地受到“基于信任的模型”的弱点所困扰。我们无法实现完全不可逆的交易,因为金融机构总是需要仲裁争议。而金融机构参与仲裁,势必增加了交易成本,限制了最小实际交易规模,也限制了日常的小额支付交易。并且,由于支付的可能性成本的存在,基于信任的模型是无法提供非可逆支付手段的。

因此,我们需要这样一种电子支付系统,它基于密码学原理而不是基于信任,使得任何达成一致的双方,能够直接进行支付,从而不需要第三方。杜绝双重支付的发生需要我们维护一个公开的交易历史。在这个系统中,只要诚实的参与者能够集体控制绝大多数的算力,那么诚实的网络就能免受攻击。

2. 交易

我们定义一枚电子货币(an electronic coin)是这样一串数字签名:每一位所有者通过对前一次交易和下一位拥有者的公钥(Public key)签署一个数字签名,并将这个签名附加在这枚电子货币的末尾,并将这枚电子货币转移给下一位拥有者。收款人通过检验签名链条从而可以验证该枚电子货币的所有者。

Alice 支付给 Bob 的例子:

Alice 将前一次交易(她从某人那里收到的这枚币)的哈希值,以及 Bob 的公钥,用她的私钥进行签名。这个签名就成为了支付给 Bob 的这枚新币。Bob 可以通过检查签名链条(从这枚新币开始一直回溯到最初发行这枚币的交易)来验证 Alice 是否是这枚币的合法所有者,并且签名链条没有被篡改。

问题在于收款人如何能够确认以前的所有者没有对这枚货币进行双重支付?通常的解决方案是引入一个可信的中央机构,由它来检验每一笔交易是否存在双重支付的情况。在每一笔交易结束后,这枚货币就需要返还给中央机构,以记录在案,而新的货币则由此中央机构发行。对于这样一个系统,我们需要这个中央机构完全值得信任,它不会伪造货币,也不会让用户的钱丢失。

3. 时间戳服务器

我们提出的解决方案不需要引入中央机构。我们使用一个点对点的分布式时间戳服务器来记录交易的时间顺序,从而解决双重支付的问题。时间戳服务器通过对将要记录的一组交易的区块(block)的哈希值进行散列(hashing)并广播这个散列值来实现功能,如同在报纸或Usenet新闻组[2-5]里那样。时间戳能够证明在某一特定时刻,这些数据必然存在,为了能够将时间戳记录在分布式的数据记录中,我们需要让时间戳本身也包含前一个时间戳。

时间戳工作流程:

1.  收集一段时间内发生的所有新的、未被确认的交易。
2.  将这些交易组成一个“区块”。
3.  计算这个区块的哈希值。这个哈希值唯一地代表了这个区块中的所有交易。
4.  将这个哈希值广播到网络中。
5.  这个哈希值被记录在一个广泛分布的、按时间顺序链接的区块链中。每一个新的哈希值都包含了前一个哈希值,形成一个链条。

这样,任何人都可以在之后通过查看区块链来验证某个交易在何时发生,因为它被包含在一个特定的区块中,而这个区块的哈希值已经被公开记录并链接到之前的区块。

4. 工作量证明

为了在点对点的基础上构建一个分布式的时间戳服务器,我们需要使用一个类似于Adam Back的Hashcash[6]的工作量证明(proof-of-work)系统,而不是像报纸或Usenet新闻组那样。工作量证明机制是找到一个数值,当对这个数值和需要盖时间戳的数据进行SHA-256散列运算后,得到的散列值以若干个零开头。工作量的大小取决于开头零的个数。我们通过不断尝试不同的nonce值直到找到符合条件的哈希值来完成这个工作量证明。一旦CPU花费了足够的计算力使得结果满足了工作量证明的要求,那么这个区块就不能被更改,除非重新完成之后所有的工作量。由于后续的区块都是链接在这个区块之后的,所以更改之前的区块就需要重新完成所有后续的区块的工作量。

工作量证明的例子:

假设我们需要找到一个哈希值,它的前20位都是零。我们可以随机生成一个叫做“nonce”的数字,然后将这个 nonce 和区块中的数据一起进行 SHA-256 哈希运算。如果得到的哈希值的前20位不是零,我们就改变 nonce,再次进行哈希运算。我们不断重复这个过程,直到找到一个 nonce,使得哈希值的前20位都是零。找到这样一个 nonce 需要大量的计算工作。一旦找到,这个 nonce 就成为了这个区块的工作量证明。任何人都可以在之后通过对区块数据和这个 nonce 进行哈希运算,并检查结果的前20位是否为零来验证这个工作量证明是否有效。

工作量证明的难度由每小时生成区块的目标速率来决定。如果区块生成的速度过快,那么难度就会增加。

5. 网络

运行这个网络的步骤如下:

  1. 新的交易向全网广播。
  2. 每一个节点都将收到的交易信息纳入一个区块。
  3. 每一个节点都尝试在自己的区块中找到一个满足工作量证明要求的nonce值。
  4. 当一个节点找到一个工作量证明时,它就向全网广播这个区块。
  5. 当且仅当包含在区块中的所有交易都是有效的且之前未被支付过的时候,其他节点才接受这个区块。
  6. 其他节点表示他们接受这个区块,方法是跟随这个区块的哈希值,构造下一个区块。

节点总是将他们所知的最长的链条视为正确的链条,他们会持续工作以延长它。如果有两个节点同时广播了不同版本的下一个区块,那么一些节点可能会先接收到其中的一个版本。在这种情况下,他们会基于先收到的那个区块工作,但同时保留另外一个分支,以防后者变成最长的链条。当下一个工作量证明被找到并添加到链条之后,最长的链条就会成为主导,另一个分支上的工作就会白费。

6. 激励

我们约定每个区块的第一笔交易是一种特殊的交易,它产生一种由该区块的创建者拥有的新的电子货币。这为支持网络提供了激励,并且提供了一种将新的货币发行到流通中的方法,因为没有中央机构来发行货币。通过不断地增加新货币到流通中的速度必须是事先确定的并且是公开的。在这种情况下,它类似于金矿矿工消耗资源增加黄金到流通中。在我们的例子中,是消耗CPU时间和电力来生成能够进入流通的货币。

这个激励也可以通过交易费用(transaction fees)来支持。如果一笔交易的输出值小于它的输入值,那么差额就是交易费用,这笔费用将作为奖励增加到包含该交易的区块的激励中。一旦预定数量的货币已经进入流通,那么激励就可以完全依靠交易费用来维持。

7. 回收硬盘空间

一旦一个货币的最新交易被足够的区块所确认,那么这笔交易之前的被确认的交易就可以被丢弃,以节省硬盘空间。为了在不破坏区块的哈希值的情况下完成此操作,交易信息被散列进一个Merkle树[7]里,只有根被包含进区块的哈希值中。然后老的区块可以通过剪除树的分支来压缩。内部的哈希值不需要存储。

Merkle 树简化示例:

假设一个区块包含交易 A、B、C 和 D。

1.  分别计算每个交易的哈希值:hash(A), hash(B), hash(C), hash(D)。
2.  将相邻的哈希值两两组合,计算它们的哈希值:hash(hash(A) + hash(B)), hash(hash(C) + hash(D))。
3.  再次组合并计算哈希值,直到只剩下一个根哈希值:hash(hash(hash(A) + hash(B)) + hash(hash(C) + hash(D)))。

这个最终的根哈希值就被包含在区块的哈希值中。要验证一个特定的交易(比如交易 A)是否包含在这个区块中,只需要提供从交易 A 的哈希值到根哈希值的路径上的哈希值。Merkle 树允许在不下载整个区块的情况下验证单个交易的存在性。一旦交易 A 被足够多的区块确认,并且我们不再需要验证它之前的历史,与 A 相关的分支(hash(B) 和 hash(hash(C) + hash(D)))就可以被丢弃以节省空间。

一个不包含交易信息的区块头(block header),大小大约是80字节。如果我们假设每10分钟产生一个区块,那么每年产生80字节 * 6 * 24 * 365 = 4.2MB。按照2008年典型的2GB内存的计算机系统来看,即使将区块头全部存储在内存里也是绰绰有余的。

8. 简化的支付验证

在不运行完整网络节点的情况下,也可能验证支付。用户只需要拥有一个最长的工作量证明链条的区块头的副本,他可以通过查询网络直到他确信自己拥有最长的链条,并且通过获取他感兴趣的交易存在于其中的区块,并且通过Merkle路径连接到包含该交易的区块的区块头,来验证交易。他不必信任网络节点,只要他能够自己保留最长链条的区块头即可。如果他被攻击者控制的网络节点所欺骗,只要一个诚实的节点将包含该交易的区块广播到网络,他就能发现不符之处。只有攻击者能够持续地控制整个网络的情况下,这种简化的验证方式才会失效。

9. 价值的组合与分割

虽然可以单个地处理货币,但是对于每一分钱都进行单独的交易是很笨拙的。为了允许价值的组合与分割,交易可以包含多个输入和多个输出。通常来说是单个来自之前较大数额的交易的输入,或者多个组合了较小数额的输入,以及至多两个输出:一个用于支付,另一个用于将找零返回给发送者(如果存在)。

需要注意的是,这里的“扇出(fan-out)”是保密的,也就是说,与一笔交易相关的输入并不一定能追溯到产生这些输入的所有之前的交易。这是为了允许货币的所有者保持匿名。

10. 隐私

我们通过保持公钥的匿名性来提供隐私。公众可以看到某人正在发送一定数量的货币给另一个人,但是无法将这笔交易与特定的人关联起来。这类似于股票交易所发布的信息,每一笔交易发生的时间和交易量都是公开的,但是交易双方的身份是被保密的。

作为额外的保护措施,对于每一笔交易都应该使用一对新的密钥对,以避免它们被关联到一个共同的所有者。然而,如果多个密钥对的所有者被发现是同一个人,那么关联仍然是不可避免的。

11. 计算

我们考虑这样一种场景:一个攻击者试图比诚实的节点更快地生成一个替代的链条。即使攻击成功,它也不会使系统向不存在的货币注入价值,或者盗取不属于攻击者的货币。然而,攻击者可以做到的是,撤销他自己最近支付的交易,使得他支付出去的货币能够重新为他所用。

诚实链条更长的概率随着新区块的增加呈指数级增长。假设诚实的节点每找到一个新区块花费的平均时间为 p,攻击者找到一个新区块花费的平均时间为 q。那么攻击者在一个给定的时间内找到 z 个区块的概率服从泊松分布。

为了计算攻击者赶上诚实链条的概率,我们可以将其视为一个二项分布随机漫步。成功的事件是诚实链条增加一个区块,失败的事件是攻击者链条增加一个区块。攻击者从落后 k 个区块开始追赶,并且在赶上之前尝试 z 次。

我们计算攻击者仍然落后的概率,这类似于赌徒破产问题。假设一个拥有无限资金的赌徒开始时拥有 k 的“优势”,每次赌局的胜率为 p/(p+q),失败的概率为 q/(p+q)。他破产的概率是多少?

我们的目标是计算攻击者赶上的概率,也就是赌徒获胜的概率。反过来计算失败的概率可能会更容易。当 p>q 时,攻击者最终成功的概率随着落后区块数 k 的增加呈指数级下降。当 p<q 时,攻击者成功的概率会上升到 1。

考虑到我们的工作量证明是基于找到一个哈希值,它的开头有若干个零,那么诚实的节点预期找到下一个区块的时间遵循泊松分布,其平均值为 1/p。攻击者找到下一个区块的时间的平均值为 1/q。因此,我们用攻击者赶上诚实链条的概率乘以攻击者获得比诚实链条更多区块的概率来得到攻击者成功的概率,结果如下:

q/p 的值越小,攻击者成功的概率越低。

我们可以看到,随着确认数的增加,攻击者成功逆转交易的概率呈指数级下降。例如,在6个确认之后,攻击者成功的概率已经变得非常小(小于0.1%)。

12. 结论

我们已经提出了一种不依赖信任的完全去中心化的电子现金系统。我们首先讨论了对于不需要可信的第三方的情况下,通常的电子货币是由数字签名控制的。然而,为了防止双重支付,我们提出了一种基于工作量证明的点对点网络来记录公开的交易历史,如果诚实的节点控制了绝大多数的算力,那么这个交易历史在计算上将很快变得不可更改。这个网络是健壮的,因为它本质上是去中心化的。交易的发生不需要通过任何中心化的中介,并且节点可以通过控制它们的比特币私钥来保持匿名。

我们相信,我们所提出的系统提供了一种完全去中心化的、点对点的电子现金的解决方案,它能够有效地解决双重支付的问题,而无需依赖任何可信的第三方。

参考文献

[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 16th Symposium on Computer Security, pages 201–209, Phoenix, AZ, USA, August 1997. IEEE. [3] S. Haber and W.S. Stornetta, “How to time-stamp a digital document,” In Journal of Cryptology, 3(2):99–111, 1991. [4] D. Bayer, S. Haber, and 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. Springer-Verlag, 1993. [5] A. Back, “Hashcash - a denial of service counter-measure,” http://www.hashcash.org/papers/hashcash.pdf, 2002. [6] R.C. Merkle, “A digital signature based on a conventional encryption function,” In CRYPTO ’87: Proceedings on Advances in cryptology, pages 369–378, Santa Barbara, California, USA, August 1987. Springer-Verlag.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxr1908

用钱砸我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值