《比特币-点对点电子现金系统》(Bitcoin:A Peer-to-Peer Electronic Cash System)


摘要: 一个纯粹的点对点版本的电子现金允许在线支付直接从一方发送到另一方,而中间无需通过金融机构。数字签名提供了部分解决方案,但如果仍然需要可信第三方机构来防止双花,那么最主要的优点就消失了。我们提出了一个使用点对点网络来解决双花问题的解决方案。这个网络通过hash为事务打上时间戳并把它们放入一个不间断的基于hash的工作量证明的链,形成一个没有重新做工作量证明而不能被改变的记录。这个最长链不仅可以作为记录事件先后顺序的证据,还可以证明它来自最大的CPU算力池。只要大部分的CPU资源不被不诚实的节点所控制去攻击这个网络,它们会生成最长的链,并超过攻击者。网络本身需要最小的结构。消息尽最大可能进行广播,节点可以随意离开或重新加入网络。接受最长的工作量证明链来证明他们不在的时候发生了什么。

1、介绍

互联网上的商业几乎完全依赖金融机构作为可信赖的第三方来处理电子支付。尽管该系统在大多数交易中运行良好,但它仍存在基于信任的模型固有的弱点。完全不可逆转的交易实际上是不可能的,因为金融机构无法避免调解纠纷。中介的成本增加了交易成本,限制了最小的实际交易规模,并切断了小型非正式交易的可能性,并且为不可逆的服务进行不可逆的支付的行为带来更大的成本。随着逆转的可能性,对信任的需求扩大了.商人们必须对他们的顾客保持警惕,纠缠他们要更多他们不需要的信息。一定比例的欺诈被认为是不可避免的。这些费用和支付的不确定性可以通过使用实物货币来避免,但是没有机制可以在没有可信方的情况下通过通信通道进行支付。

我们需要的是一种基于加密证明而不是信任的电子支付系统,允许任何两个愿意进行交易的人直接进行交易,而不需要可信的第三方。在计算上无法逆转的交易将保护卖方免受欺诈,而常规的托管机制可以很容易地实现,以保护买方。在本文中,我们提出了一个解决双重消费问题的方案,使用点对点分布式时间戳服务器生成交易时间顺序的计算证明。只要诚实节点控制的CPU算力比所有攻击者节点所控制的算力多,那么系统就是安全的。

2、交易

我们把电子硬币定义为一连串的数字签名。每个所有者通过对前一次交易的哈希值和下一个所有者的公钥进行数字签名,之后将硬币(比特币)转移给下一个所有者,并将它们添加到硬币的末尾。收款人可以通过验证签名来验证链的所有权。

当然,问题是收款人无法证实其中一个所有者没有重复消费硬币.一种常见的解决方案是引入一个可信任的中央机构(或者铸币厂),检查每笔交易是否存在重复支出。每次交易结束后,硬币必须归还铸币厂以发行一枚新硬币,只有直接由铸币厂发行的硬币才是可信的而不是进行二次支付的。这种解决方案的问题在于,整个货币系统的命运取决于经营铸币厂的公司,每笔交易都必须经过他们,就像银行一样。 我们需要一种方法让收款人知道以前的所有者没有签署任何更早的交易。就我们的目的而言,最早的交易是有价值的,所以我们不关心之后的重复消费尝试。确认交易不存在的唯一方法是了解所有交易。在基于铸币厂的模型中,铸币厂知道所有的交易,并决定哪一个最先到达。为了在没有受信任方的情况下完成这一任务,交易必须公开宣布,我们需要一个系统,让参与者对他们接收到的顺序的单一历史达成一致。收款人需要证明在每次交易时,大多数节点都同意它是第一个收到的。

3、时间戳服务器

我们提出的解决方案从时间戳服务器开始。时间戳服务器的工作原理是获取一个需要加入时间戳的块的哈希,并广播发布该哈希,比如在报纸或Usenet(世界性新闻组网络)帖子中。显然,时间戳证明数据必须在当时存在,以便进入散列。每个时间戳在其哈希值中包含前一个时间戳,形成一个链,每个附加的时间戳都会加强之前的时间戳。

4、POW - 工作量证明 (Proof-of-Work)

为了在对等基础上实现分布式时间戳服务器,我们需要使用类似于Adam Back的Hashcash的工作证明系统,而不是报纸或Usenet帖子。当使用哈希函数时,工作证明包括扫描一个值,例如使用SHA-256,哈希以一定数量的零比特开始。所需的平均功在所需的零比特数上是指数的,并且可以通过执行单个哈希函数来验证。

对于我们的时间戳网络,我们通过增加块中的随机数来实现工作证明,直到找到一个值,该值满足区块的哈希值所需要的零比特的个数。一旦花费了CPU的努力使其满足工作量证明,那么这个区块在不重做工作量证明的情况下无法被更改。由于后面的区块都是在此区块后面进行链接的,所以更改区块的工作将包括重新计算后面的所有区块。

工作证明还解决了多数决策中确定代表的问题。如果多数是基于一个IP地址一次投票,那么任何能够分配多个IP的人都可能会颠覆它。工作证明实质上是一个CPU一票。多数决策由最长的链表示,这是投入工作的最大证明。如果大部分CPU功率由诚实的节点控制,诚实的链将增长最快,并超过其他任何竞争链。要修改过去的区块,攻击者必须重做该区块及其 以后所有块的工作证明,然后赶上并超过诚实节点的工作。我们将在后面说明,速度较慢的攻击者赶上的概率会随着后续区块的增加而呈指数级下降。

为了补偿不断提高的硬件速度和随着时间推移对运行节点的不同兴趣,通过以每小时平均生成的块数为目标的移动平均值来确定工作难度的证明。如果它们生成的速度太快,难度就会增加。

5、网络

运行网络的步骤如下:

  • 新交易将广播到所有节点
  • 每个节点将新交易收集到一个区块中
  • 每个节点都致力于为其区块寻找一个困难的工作证明
  • 当节点找到工作证明时,它将块广播给所有节点
  • 只有当该区块中的所有交易都是有效的且尚未花费时,节点才接受该区块。
  • 节点通过在链上创建下一个区块来表达他们对该区块的接受。链中的下一个区块,使用被接受的区块的哈希值作为前一个哈希值。

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

新的交易广播不一定需要到达所有节点。只要它们到达许多节点,不久就会进入一个区块。区块广播还可以容忍丢弃的消息。如果一个节点没有接收到一个区块,当它接收到下一个区块并意识到它错过了一个区块时,它将请求它。

6、激励措施

按照惯例,一个区块中的第一笔交易是一个特殊的交易,启动一个由区块创建者拥有的新币。这增加了节点支持网络的动力,并提供了一种最初将硬币分发到流通中的方法,因为没有中央机构来发行这些硬币。稳定地增加新币的数量,类似于淘金者耗费资源来增加黄金的流通。在我们的案例中,所花费的是CPU时间和电力。

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

这种激励可能有助于鼓励节点保持诚实。如果一个贪婪的攻击者能够比所有诚实的节点组装更多的CPU能力,他将不得不选择使用它来骗取人们的付款,或者使用它来生成新的硬币。他应该发现,遵守规则比破坏制度和自己财富的合法性更有利可图,这些规则有利于他获得比其他人加起来更多的新硬币。

7、回收磁盘空间

一旦一个硬币的最新交易被埋在足够多的区块下,在它之前的已用交易就可以被丢弃以节省磁盘空间。为了在不破坏区块哈希值的情况下促进这一工作。交易被散列在Merkle树中,只有根包含在区块的散列中。然后,旧的区块可以通过截断树枝来压实。 内部的哈希值不需要被存储。

一个没有交易的区块头大约是80字节。如果我们假设每10分钟生成一次块,则80字节*6*24*365=4.2MB/年。截至2008年,计算机系统的RAM通常为2GB的内存,而摩尔定律预测目前每年增长1.2GB,即使块头必须保存在内存中,存储也不应该是一个问题。

8、简化支付验证

不需要运行一个完整的网络节点,就可以验证付款。 用户只需要保留一份最长的工作证明链的区块头,他可以通过查询网络节点来获得,直到他确信他拥有最长的链,并获得链接交易和它的时间戳的区块的Merkle分支。 他不能自己检查该交易,但通过将其链接到链中的某个地方,他可以看到一个网络节点已经接受了该交易,而在其之后添加的区块进一步确认了网络已经接受了该交易。

因此,只要诚实的节点控制着网络,验证就很可靠,但如果网络被攻击者控制,验证就更容易受到攻击。虽然网络节点可以为自己验证交易,但只要攻击者能够继续控制网络,简化的方法就会被攻击者伪造的交易所欺骗。防止这种情况的一个策略是,当网络节点检测到一个无效的区块时,接受它们发出的警报,提示用户的软件下载完整的区块和警报的交易,以确认不一致的情况。经常收到付款的企业可能仍然希望运行自己的节点,以获得更独立的安全和更快速的验证。

9、价值的组合与分割

虽然可以单独处理硬币,但在转账中为每一分钱单独进行交易是不容易的。为了允许对价值进行拆分和组合,交易包含多个输入和输出。通常情况下,会有一个较大的前一笔交易的单个输入,或多个输入组合较小的金额,最多有两个输出:一个用于支付,一个将零钱(如果有)退还给发送方。

应该注意的是,输出端在这里不是一个问题,即一个交易依赖于几个交易,而这些交易又依赖于更多的交易。 永远没有必要提取一个交易历史的完整独立副本。

10、隐私

传统的银行模式通过限制有关各方和受信任的第三方对信息的访问,实现了一定程度的隐私。 公开宣布所有交易的必要性排除了这种方法,但隐私仍然可以通过在另一个地方打破信息流来维持:通过保持公钥的匿名性。

公众可以看到有人正在向其他人发送一笔款项,但没有将该交易与任何人联系起来的信息。这类似于证券交易所发布的信息水平,在证券交易所,个人交易的时间和规模,即“磁带”,被公开,但不知道当事人是谁。

作为一个额外的防火墙,每个交易都应该使用一个新的密钥对,以防止它们被链接到一个共同的所有者。对于多输入的交易来说,一些链接仍然是不可避免的,这必然会显示出它们的输入是由同一个所有者拥有的。 其风险在于,如果一个密钥的所有者被揭示,链接可能会揭示属于同一所有者的其他交易。

11、计算

我们考虑攻击者试图生成一个比诚实链更快的替代链的情况。即使实现了这一点,它也不会使系统受到任意更改的影响,比如凭空创造价值或拿走从不属于攻击者的钱。节点不会接受无效的交易作为支付,诚实的节点也不会接受包含它们的区块。攻击者只能试图改变自己的一个交易,拿回他最近花掉的钱。

诚实链和攻击者链之间的竞争可以被描述为二项式随机游走。成功事件是诚实链被延长一个区块,领先优势增加+1,而失败事件是攻击者的链被延长了一个区块,差距减少-1

攻击者从一个给定的亏损中追赶上来的概率类似于赌徒破产问题。假设一个拥有无限信用的赌徒从亏损开始,并可能进行无限次的试验,试图达到收支平衡。我们可以计算出他达到收支平衡的概率,或者攻击者追上诚实链的概率,如下所示:

  • $p$ = 诚实节点找到下一个区块的概率
  • $q$ = 攻击者找到下一个区块的概率
  • $q_z$ = 攻击者从z个区块之后追赶上的概率

$q_z = \begin{Bmatrix} 1&if\ p \le q\ (q/p)^z&if\ p>q \end{Bmatrix}$

假设$p>q$,随着攻击者需要追赶的块数的增加,概率呈指数下降。在这种情况下,如果他不在早期努力地向前冲,随着他进一步落后,他的机会就会变得越来越小

我们现在考虑新交易的接收者需要等待多长时间才能充分确定发送者不能改变交易。我们假设发送者是一个攻击者,他想让接收者相信在这一段时间他向他自己支付了,然后在一段时间后换成向自己支付。当这种情况发生时,接收者会得到提醒,但发送者希望这一切都太晚了。

接收者生成一个新的密钥对,并在签名前不久将公钥交给发送者。这就防止了发送者通过不断地工作来提前准备区块链,直到他幸运地提前足够的时间,然后在那一刻执行交易。一旦交易被发送,不诚实的发送者就开始秘密地在一个平行链上工作,其中包含他的交易的另一个版本。
接收者等待,直到交易被添加到一个区块,并且在它之后有z个区块被链接。他不知道攻击者的确切进度,但假设诚实的区块花了每个区块的平均预期时间,攻击者的潜在进度将是一个具有预期值的泊松分布。

$\lambda = z \frac{q}{p} $

为了得到攻击者现在仍能赶上的概率,我们将他可能取得的每一进步的泊松密度乘以他能从该点赶上的概率:

重新排列以避免对分布的无限尾部求和…

正在转换为C代码…

运行一些结果,我们可以看到概率随z的增加呈指数下降。

求解小于0.1%的P…

12、结论

我们提出了一种不依赖信任的电子交易系统。我们从通常的数字签名组成的硬币框架开始,该框架提供了对所有权的强大控制,但如果没有防止重复消费的方法,则是不完整的。为了解决这一问题,我们提出了一种点对点的网络,使用工作证明来记录公开的交易历史,如果诚实的节点控制了大部分CPU算力,那么攻击者要改变这个历史在计算上就变得不切实际了。

该网络以其非结构化的简单性是强大的。节点在几乎没有协调的情况下同时工作。它们不需要被识别,因为消息不会被传送到任何特定的地方,只需要在尽最大努力的基础上传递。节点可以随意离开并重新加入网络,接受工作链的证明作为他们离开时发生的事情的证明。他们用自己的CPU算力投票,通过扩展有效块来表示他们对有效区块的接收,通过拒绝工作来拒绝无效区块。任何必要的规则和激励措施都可以通过这种共识机制来实施。


文章作者: zerollone
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zerollone !
  目录