比特币:一种点对点的电子现金系统
中本聪
satoshin@gmx.com
www.bitcoin.org
摘要。纯点对点版本的电子现金将允许在线支付直接从一方发送到另一方,而无需通过金融机构。数字签名提供了部分解决方案,但如果仍然需要受信任的第三方来防止双重支出,那么主要的好处就失去了。我们提出了一种使用对等网络解决双重支出问题的方法。网络通过将交易散列到一个持续的基于散列的工作证明链中来为交易打上时间戳,形成一个记录,如果不重做工作证明就无法更改。最长的链不仅可以证明所见证的事件顺序,还可以证明它来自最大的 CPU 算力池。只要大部分 CPU 能力由不合作攻击网络的节点控制,它们就会生成最长的链并超过攻击者。网络本身需要最少的结构。消息在尽力而为的基础上广播,节点可以随意离开和重新加入网络,接受最长的工作量证明链作为他们离开时发生的事情的证明。
一、简介
Internet 上的商务几乎完全依赖作为可信第三方的金融机构来处理电子支付。尽管该系统对于大多数交易都运行良好,但它仍然存在基于信任的模型的固有弱点。完全不可逆的交易实际上是不可能的,因为金融机构无法避免调解纠纷。调解成本增加了交易成本,限制了最小实际交易规模并切断了小额临时交易的可能性,并且在丧失为不可逆服务进行不可逆支付的能力方面存在更广泛的成本。随着逆转的可能性,对信任的需求蔓延。商家必须对他们的顾客保持警惕,向他们索取比他们本来不需要的更多信息。一定比例的欺诈被认为是不可避免的。这些成本和支付的不确定性可以通过使用实物货币亲自避免,但不存在在没有可信方的情况下通过通信渠道进行支付的机制。
需要的是一种基于密码证明而非信任的电子支付系统,允许任何两个愿意的一方直接与对方进行交易,而无需受信任的第三方。在计算上无法逆转的交易将保护卖家免受欺诈,并且可以轻松实施常规托管机制来保护买家。在本文中,我们提出了一种解决双重支出问题的方法,使用点对点分布式时间戳服务器生成交易时间顺序的计算证明。只要诚实节点共同控制比任何合作的攻击者节点组更多的 CPU 能力,系统就是安全的。
2. 交易
我们将电子硬币定义为数字签名链。每个所有者通过对先前交易的哈希和下一个所有者的公钥进行数字签名并将它们添加到硬币的末尾来将硬币转移到下一个。收款人可以验证签名以验证所有权链。
问题当然是收款人无法验证其中一位所有者没有双花硬币。一个常见的解决方案是引入一个受信任的中央机构或铸币厂,它会检查每笔交易是否存在双重支出。每次交易后,必须将币返还给铸币厂发行新币,只有铸币厂直接发行的币才可信,不会被双花。这个解决方案的问题在于,整个货币系统的命运取决于运营铸币厂的公司,每笔交易都必须经过它们,就像银行一样。
我们需要一种方法让收款人知道以前的所有者没有签署任何早期交易。就我们的目的而言,最早的交易才是最重要的,所以我们不关心后来的双花尝试。确认不存在交易的唯一方法是了解所有交易。在基于铸币厂的模型中,铸币厂知道所有交易并决定哪个先到。为了在没有受信任方的情况下实现这一点,交易必须公开宣布 [1],我们需要一个系统让参与者就收到交易的顺序的单一历史达成一致。收款人需要证明在每次交易时,大多数节点都同意它是第一个收到的。
3.时间戳服务器
我们提出的解决方案从时间戳服务器开始。时间戳服务器的工作原理是获取要加盖时间戳的项目块的散列并广泛发布该散列,例如在报纸或 Usenet 帖子中 [2-5]。时间戳证明数据必须在当时存在,显然,才能进入哈希。每个时间戳都在其哈希中包含前一个时间戳,形成一个链,每个额外的时间戳都会加强它之前的时间戳。
4. 工作量证明
要在对等基础上实现分布式时间戳服务器,我们需要使用类似于 Adam Back 的Hashcash [6] 的工作量证明系统,而不是报纸或 Usenet 帖子。工作量证明涉及扫描一个值,该值在散列时(例如使用 SHA-256)以多个零位开始。所需的平均工作量与所需的零位数量成指数关系,并且可以通过执行单个散列来验证。
对于我们的时间戳网络,我们通过增加块中的随机数来实现工作证明,直到找到一个值,该值为块的散列提供所需的零位。一旦花费了 CPU 的努力使其满足工作量证明,就不能在不重做工作的情况下更改块。由于后面的块被链接在它之后,更改块的工作将包括重做它之后的所有块。
工作量证明还解决了在多数决策中确定代表性的问题。如果大多数人基于一个 IP 地址一票,那么任何能够分配多个 IP 的人都可以颠覆它。工作量证明本质上是一个 CPU 一票。多数决定由最长的链表示,其中投入了最大的工作量证明。如果大部分 CPU 能力由诚实节点控制,则诚实链将增长最快并超过任何竞争链。要修改过去的区块,攻击者必须重做该区块及其后所有区块的工作量证明,然后赶上并超越诚实节点的工作量。稍后我们将展示,随着后续块的添加,较慢的攻击者赶上的概率呈指数下降。
为了补偿不断增加的硬件速度和随着时间的推移对运行节点的不同兴趣,工作量证明难度由移动平均线确定,目标是每小时平均块数。如果它们生成得太快,难度就会增加。
5.网络
运行网络的步骤如下:
1) 新交易被广播到所有节点。
2) 每个节点将新交易收集到一个块中。
3) 每个节点都致力于为它的块找到一个困难的工作量证明。
4) 当一个节点找到一个工作量证明时,它会将这个块广播给所有节点。
5) 只有当其中的所有交易都有效且尚未花费时,节点才会接受该块。
6) 节点通过创建链中的下一个块来表达他们对块的接受,使用接受块的哈希值作为前一个哈希值。
节点始终认为最长的链是正确的链,并将继续努力扩展它。如果两个节点同时广播不同版本的下一个区块,一些节点可能会先接收一个或另一个。在这种情况下,他们处理收到的第一个分支,但保存另一个分支以防它变长。当找到下一个工作量证明并且一个分支变得更长时,平局将被打破;在另一个分支上工作的节点将切换到更长的分支。
新的交易广播不一定需要到达所有节点。只要他们到达很多节点,他们很快就会进入一个区块。块广播也可以容忍丢失的消息。如果一个节点没有收到一个块,它会在收到下一个块并意识到它错过了一个时请求它。
6.激励
按照惯例,区块中的第一笔交易是一项特殊交易,它启动了区块创建者拥有的新硬币。这增加了节点支持网络的激励,并提供了一种最初将硬币分配到流通中的方法,因为没有中央机构来发行它们。稳定增加一定数量的新硬币类似于黄金矿工消耗资源以增加黄金流通量。在我们的例子中,消耗的是 CPU 时间和电力。
奖励也可以通过交易费用来资助。如果交易的输出值小于其输入值,则差额是交易费用,该费用会添加到包含该交易的区块的激励值中。一旦预定数量的代币进入流通,激励措施就可以完全过渡到交易费用,并且完全没有通货膨胀。
激励可能有助于鼓励节点保持诚实。如果一个贪婪的攻击者能够聚集比所有诚实节点更多的 CPU 能力,他将不得不选择使用它来通过偷回他的付款来欺骗人们,或者使用它来生成新的硬币。他应该发现遵守规则更有利可图,这些规则有利于他获得比其他人加起来更多的新硬币,而不是破坏系统和他自己财富的有效性。
7.回收磁盘空间
一旦硬币中的最新交易被埋在足够的块下,就可以丢弃之前花费的交易以节省磁盘空间。为了在不破坏区块散列的情况下促进这一点,交易在默克尔树 [7][2][5] 中进行散列,只有根包含在区块的散列中。然后可以通过砍掉树的分支来压缩旧块。不需要存储内部散列。
一个没有交易的区块头大约有 80 个字节。如果我们假设每 10 分钟生成一次块,则每年 80 字节 * 6 * 24 * 365 = 4.2MB。截至 2008 年,计算机系统通常配备 2GB RAM,并且摩尔定律预测当前的增长
每年 1.2GB,即使区块头必须保存在内存中,存储也不成问题。
8. 简化支付验证
可以在不运行完整网络节点的情况下验证支付。用户只需要保留一份最长工作量证明链的区块头副本,他可以通过查询网络节点来获得,直到他确信他拥有最长的链,并获得将交易链接到区块的 Merkle 分支它有时间戳。他无法自己检查交易,但通过将其链接到链中的某个位置,他可以看到网络节点已接受它,并在进一步确认网络已接受后添加区块。
因此,只要诚实节点控制网络,验证就是可靠的,但如果网络被攻击者制服,则验证更容易受到攻击。虽然网络节点可以自己验证交易,但只要攻击者可以继续压倒网络,简化的方法就可以被攻击者伪造的交易所愚弄。防止这种情况的一种策略是在网络节点检测到无效块时接受来自网络节点的警报,提示用户的软件下载完整块和警报交易以确认不一致。经常收到付款的企业可能仍希望运行自己的节点以获得更独立的安全性和更快的验证。
9.合并和拆分值
尽管可以单独处理硬币,但为转账中的每一分钱进行单独交易会很笨拙。为了允许拆分和组合价值,交易包含多个输入和输出。通常会有来自先前较大交易的单个输入或组合较小金额的多个输入,并且最多有两个输出:一个用于支付,另一个将找零(如果有)返回给发送者。
应该注意的是,扇出(一个事务依赖于多个事务,而这些事务又依赖于更多事务)在这里不是问题。永远不需要提取交易历史的完整独立副本。
10.隐私
传统的银行业务模型通过限制相关方和受信任的第三方对信息的访问来实现一定程度的隐私。公开宣布所有交易的必要性排除了这种方法,但仍然可以通过在另一个地方中断信息流来维护隐私:通过保持公钥匿名。公众可以看到有人正在向其他人汇款,但没有将交易与任何人联系起来的信息。这类似于证券交易所发布的信息级别,其中公开了个人交易的时间和大小,即“磁带”,但没有说明当事人是谁。
作为额外的防火墙,每个交易都应该使用一个新的密钥对,以防止它们被链接到一个共同的所有者。对于多输入交易,一些链接仍然是不可避免的,这必然表明它们的输入属于同一所有者。风险在于,如果密钥的所有者被泄露,链接可能会泄露属于同一所有者的其他交易。
11. 计算
我们考虑攻击者试图生成比诚实链更快的替代链的场景。即使做到了这一点,也不会使系统对任意更改开放,例如凭空创造价值或拿走不属于攻击者的钱。节点不会接受无效交易作为支付,诚实节点永远不会接受包含它们的区块。攻击者只能尝试更改自己的一笔交易来取回他最近花费的钱。
诚实链和攻击者链之间的竞争可以描述为二项式随机游走。成功事件是诚实链被延长一个区块,领先优势增加+1,失败事件是攻击者的链被延长一个区块,差距减少-1。
攻击者追上给定赤字的概率类似于赌徒破产问题。假设一个拥有无限信用的赌徒从亏损开始,并可能进行无限次尝试以达到收支平衡。
鉴于我们假设 p > q,随着攻击者必须赶上的块数增加,概率呈指数下降。由于机会对他不利,如果他不早点幸运地向前冲刺,他的机会就会随着他越来越落后而变得微乎其微。
我们现在考虑新交易的接收者在充分确定发送者不能更改交易之前需要等待多长时间。我们假设发件人是一个攻击者,他想让收件人相信他支付了他一段时间,然后在一段时间后将其转回给自己。发生这种情况时,接收方会收到警报,但发送方希望为时已晚。
接收方生成一个新的密钥对,并在签名前不久将公钥提供给发送方。这可以防止发送者通过不断地处理它来提前准备一个区块链,直到他足够幸运地走得足够远,然后在那一刻执行交易。一旦交易被发送,不诚实的发送者就开始在包含他交易的替代版本的平行链上秘密工作。
收件人等待,直到交易被添加到一个块并且 z 个块被链接到它之后。他不知道攻击者取得的确切进展量,但假设诚实区块花费每个区块的平均预期时间,攻击者的潜在进展将服从泊松分布。
12.结论
我们提出了一个不依赖于信任的电子交易系统。我们从通常的数字签名硬币框架开始,它提供了对所有权的强大控制,但如果没有防止双重支出的方法,它是不完整的。为了解决这个问题,我们提出了一个使用工作量证明的对等网络来记录交易的公共历史记录,如果诚实节点控制了大部分 CPU 能力,攻击者更改这些历史记录在计算上很快变得不切实际。该网络因其非结构化的简单性而具有鲁棒性。节点在几乎没有协调的情况下同时工作。它们不需要被识别,因为消息不会被路由到任何特定的地方,只需要尽最大努力传递。节点可以随意离开和重新加入网络,接受工作证明链作为他们离开时发生的事情的证据。他们用他们的 CPU 能力投票,通过努力扩展它们来表达他们对有效块的接受,并通过拒绝处理它们来拒绝无效块。任何需要的规则和激励措施都可以通过这种共识机制来执行。
参考文献[1] W. Dai,“b-money”,http://www.weidai.com/bmoney.txt,1998.[2]H。马西亚斯、XS 阿维拉和 J.-J。 Quisquater ,“具有最小信任要求的安全时间戳服务的设计”,1999 年 5 月在比荷卢经济联盟举行的第 20 届信息论研讨会上。 [3] S. Haber,WS Stornetta ,“如何为数字文档添加时间戳”,载于《密码学杂志》,第 3 卷,第 2 期,第 99-111 页,1991 年。 [4] D. Bayer、S. Haber、WS Stornetta ,“提高数字时间戳的效率和可靠性”,载于序列 II:通信、安全和计算机科学方法,第 329-334 页,1993 年。[5] S. Haber,WS Stornetta ,“位串的安全名称”,第 4 届 ACM 计算机和通信安全会议论文集,第 28-35 页,1997 年 4 月。 [6] A. Back,“ Hashcash - 一种拒绝服务对策”,http://www.hashcash.org/papers/hashcash.pdf,2002 年。 [7] RC Merkle,“公钥密码系统协议”,In Proc。 1980 年安全和隐私研讨会,IEEE 计算机协会,第 122-133 页,1980 年 4 月。[8]W。 Feller,“概率论及其应用简介”,1957 年。
购买比特币
在这里购买比特币。