比特币——点对点电子现金系统

@LoyFan

摘要。

纯粹的点对点电子现金版本允许在线支付直接从一方发送到另一方,而无需通过金融机构。数字签名提供了解决方案的一部分,但如果仍然需要受信任的第三方来防止双重支出,则主要优势将会丢失。我们提出使用点对点网络解决双重支出问题。网络时间戳通过将它们散列到正在进行的基于散列的工作证明链中进行交易,形成一条在不重做工作量证明的情况下无法更改的记录。最长的链不仅可以作为所见事件序列的证据,而且可以证明它来自最大的CPU功率池。只要大部分CPU功率由不协作攻击网络的节点控制,它们就会产生最长的链和外部攻击者。网络本身需要最小的结构。消息是在尽力而为的基础上广播的,节点可以随意离开并重新加入网络,接受最长的工作证明链作为它们消失时发生的事情的证据。

简介

互联网上的商业几乎完全依赖于作为可信第三方的金融机构来处理电子支付。尽管该系统对大多数交易运行良好,但仍然存在基于信任模型的固有弱点。完全不可逆交易实际上是不可能的,因为金融机构无法避免调解纠纷。调解成本增加了交易成本,限制了最小的实际交易规模,并切断了小型临时交易的可能性,并且丧失了为不可逆服务进行不可逆付款的能力的成本更高。由于存在逆转的可能性,对信任的需求就会扩散。商家必须警惕他们的客户,骚扰他们获取比他们原本需要的更多信息。一定比例的欺诈被认为是不可避免的。这些成本和支付不确定性可以通过使用实际货币亲自避免,但是没有机制可以在没有可信方的情况下通过通信渠道进行支付。

所需要的是基于加密证明而不是信任的电子支付系统,允许任何两个愿意的各方直接相互交易而无需可信任的第三方。 在计算上不可逆转的交易将保护卖方免受欺诈,并且可以容易地实施例行托管机制以保护买方。 在本文中,我们提出了使用对等分布式时间戳服务器来生成双重花费问题的解决方案,以生成事务的时间顺序的计算证明。 只要诚实的节点共同控制比任何协作的攻击者节点组更多的CPU功率,该系统是安全的。

交易

我们将电子硬币定义为数字签名链。 每个所有者通过对先前交易的散列和下一个所有者的公钥进行数字签名并将这些硬币添加到硬币的末尾来将硬币转移到下一个硬币。 收款人可以验证签名以验证所有权链。

问题当然是收款人无法验证其中一个所有者没有花费双倍的硬币。一个常见的解决方案是引入一个可信赖的中央机构或薄荷,它检查每笔交易的双重支出。在每次交易之后,必须将硬币返回薄荷以发行新硬币,并且只有直接从薄荷发出的硬币才被信任不会被双重花费。这个解决方案的问题在于,整个货币体系的命运取决于运营薄荷的公司,每笔交易都必须通过它们,就像银行一样。

我们需要一种方法让收款人知道以前的所有者没有签署任何先前的交易。出于我们的目的,最早的交易是重要的交易,所以我们不关心以后的双重花费。确认没有交易的唯一方法是了解所有交易。在基于铸币的模型中,薄荷知道所有交易,并决定首先到达。为了在没有可信任方的情况下实现这一目标,必须公开宣布交易[1],并且我们需要一个系统让参与者就收到订单的单一历史达成一致。收款人需要证明在每次交易时,大多数节点同意它是第一次收到的。

时间戳服务器

我们提出的解决方案以时间戳服务器开始。 时间戳服务器的工作原理是将一个项目块的哈希值加时间戳并广泛发布哈希值,例如在报纸或Usenet帖子中[2-5]。 时间戳证明当时数据必须存在,显然,为了进入哈希。 每个时间戳在其散列中包含先前的时间戳,形成一个链,每个附加的时间戳加强它之前的时间戳。

证明

要在点对点的基础上实现分布式时间戳服务器,我们需要使用类似于Adam Back的Hashcash [6]的工作量证明系统,而不是报纸或Usenet帖子。 工作量证明涉及扫描一个值,当进行散列时,例如使用SHA-256,散列以多个零位开始。 所需的平均工作量是所需的零位数的指数,并且可以通过执行单个散列来验证。

对于我们的时间戳网络,我们通过递增块中的随机数来实现工作量证明,直到找到给出块的散列所需的零位的值。 一旦花费了CPU工作量使其满足工作量证明,就不能在不重做工作的情况下更改块。 由于后面的块被链接在其后,更改块的工作将包括重做之后的所有块。

工作量证明还解决了确定多数决策中的表示的问题。如果大多数是基于一个IP地址一票,那么任何能够分配许多IP的人都可能会破坏它。工作证明基本上是单CPU一票。多数决策由最长的链表示,其中投入的工作量最大。如果大部分CPU功率由诚实节点控制,那么诚实链将增长最快并超过任何竞争链。要修改过去的块,攻击者必须重做块的工作证明以及之后的所有块,然后赶上并超越诚实节点的工作。我们稍后会说明,随着后续块的添加,攻击速度慢的追赶者的概率会呈指数级递减。

为了补偿随着时间推移而增加的硬件速度和对运行节点的不同兴趣,工作量证明难度由针对每小时平均块数的移动平均值确定。如果它们生成得太快,则难度会增加。

网络

运行网络的步骤如下:

  • 向所有节点广播新事务。
  • 每个节点将新事务收集到块中。
  • 每个节点都在为其块查找困难的工作证明。
  • 当节点找到工作证明时,它将块广播到所有节点。
  • 仅当节点中的所有事务都有效且尚未使用时,节点才接受该块。
  • 节点通过创建块中的下一个块来表示它们对块的接受,使用接受块的散列作为前一个散列。

节点始终认为最长的链是正确的,并将继续努力扩展它。 如果两个节点同时广播下一个块的不同版本,则一些节点可以首先接收一个或另一个节点。 在这种情况下,他们在他们收到的第一个工作,但保存另一个分支,以防它变得更长。 当找到下一个工作证明并且一个分支变长时,领带将被打破; 然后,在另一个分支上工作的节点将切换到较长的节点。

新的交易广播不一定需要到达所有节点。 只要它们到达许多节点,它们就会很快进入一个块。 块广播也容忍丢弃的消息。 如果一个节点没有收到一个块,它会在收到下一个块时请求它,并意识到它丢失了一个块。

激励

按照惯例,块中的第一个事务是一个特殊事务,它启动块的创建者拥有的新硬币。这增加了节点支持网络的激励,并提供了一种初步将硬币分配到流通中的方法,因为没有中央授权来发布它们。稳定增加一定数量的新硬币类似于黄金矿工花费资源为循环增加黄金。在我们的例子中,它耗费了CPU时间和电力。

奖励也可以通过交易费来获得资金。如果交易的输出值小于其输入值,则差值是添加到包含交易的块的激励值的交易费用。一旦预定数量的硬币进入流通,激励就可以完全转换为交易费用并且完全没有通货膨胀。

激励措施可能有助于鼓励节点保持诚实。如果贪婪的攻击者能够比所有诚实的节点组装更多的CPU能力,他将不得不选择使用它来通过窃取他的付款来欺骗人们,或者使用它来生成新的硬币。他应该发现遵守规则更有利可图,这些规则比其他人合并更多的新硬币,而不是破坏系统和他自己财富的有效性。