摘要:
一个完全点对点版本的电子现金应该能够允许在线交易在无需经过第三方金融机构的情况下直接从交易的一方传输到另一方。数字签名为点对点电子现金提供了一部分的解决方案,但是如果仍然需要一个可信任的第三方来防止双花(double-spending),那么电子现金大部分的好处都将丢失.比特币网络通过对交易进行哈希并添加到一个不断增长的基于哈希对工作量证明链上为每笔交易加上时间戳。最长的链不仅用于证明链上一系列交易的有消息,也表明它构建自最大的CPU资源池。只要大多数的CPU资源掌握在不合作攻击网络的节点手中,他们将生产最长的链并且超过攻击者。网络本身只需要最小结构。消息被最大努力的传播,节点可以随时离开和加入网络,接受最长的工作量证明链来作为他们离开时所发生交易的证明。
1 介绍
互联网上的交易几乎完全依赖作为可信任第三方的金融机构来处理电子支付。尽管这样的系统对于绝大多数的交易都非常有效,但是它有着给予信任模型的固有缺点。完全不可逆的交易是不现实的,因此金融机构无法避免纠纷调解。纠纷调解的花费增加了交易成本,限制了最小实际交易规模并且切断了小额临时交易的可能性,同时还有一个更大规模的损耗是丧失了为不可逆服务提供不可逆支付的能力。当可逆的可能性存在时,信任的需要被广泛传播。商人必须提防他们的顾客,通过与顾客讨价还价来获得超过原本需要的更多的信息。一定比例的欺诈被认为是不可避免的。这些成本和付款不确定性可以通过使用物理现金来解决,但是没有任何机制使得交易可以在没有一个可信任第三方的情况下通过通信渠道完成。
真正需要的是基于加密证明而非信任的电子支付系统,该系统允许任意两方在无需可信任第三方的情况下自愿直接相互交易。在计算上无法逆转的交易能够保护卖方免受欺诈,并可以通过很容易实施的托管机制来保护买方。在这篇文章中,我们通过使用点对点的分布式时间戳服务器来产生可被计算证明的按时间顺序排列的交易为双花问题提供了一个解决方案。
在计算上无法逆转的交易将保护卖方免受欺诈,并且可以很容易地实施常规的托管机制来保护买方。本文提出了一种利用点对点分布式时间戳服务器生成事务时间顺序计算证明的双开销问题的解决方案。只要诚实的节点比任何协作的攻击者节点组共同控制更多的CPU能力,系统就是安全的。只要诚实节点的集合比任意合作攻击节点的群组所控制的CPU资源多,这个系统就是安全的。
2 交易
我们将电子货币定义为一个数字签名链。货币的所有者通过数字签名上一个交易的哈希和下一个所有者的公钥并将这些信息添加到货币的末尾来将货币传给下一个所有者。收款人可以验证签名来验证链的所有权。
[图片上传失败...(image-6bf050-1562507194560)]
这里面的问题是收款人无法确认没有一个所有者曾经多次消费这枚代币。一个常见的解决方案是引入一个可信的中央权威机构或者造币厂来为每笔交易检测是否双花。每笔交易完成后,代币必须返回到铸币厂然后发型一枚新的代币,只有直接从铸币厂直接发出的代币才被认为是没有双花的。这个方案的问题是整个金钱系统的命运取决于发行代币的公司,因为每一笔交易都必须经过他们(这些铸币厂就像银行一样)。
我们需要一种方法使得收款人能够知道之前的所有者没有签署更早的交易。为了这个目的,最早的交易是有效的,因此我们不需要关系之后双花的尝试。确认一笔交易存在的唯一方法是了解所有的交易。在基于铸币厂的模型中,铸币厂了解所有交易并决定哪一个交易最先。为了在没有可信任方的基础上实现这个目标,交易必须全部公开,同时我们需要一个让参与者就单个交易历史记录达成一致的系统。收款人需要确认在每笔交易时,大多数节点就它是第一个达成一致。
3 时间戳服务器
本文所提供的解决方案的最开始是一个时间戳服务器。时间戳服务器工作时将一个块上的事物的哈希加上时间戳并对哈希进行广泛的传播,就像是报纸或网络日志。时间戳证明为了将数据转换为哈希该数据显然应该在这个时间存在。每一个时间戳的哈希中都包含前面的时间戳信息,从而构成了一个链,每一个新加入的时间戳都会加强在它之前的时间戳。
[图片上传失败...(image-95e65a-1562507194560)]
4 工作量证明
为了在点对点的基础上实现一个分布式的时间戳服务器,我们需要使用一个工作量证明系统,就像Adam Back的Hashcash,而非报纸或网络日志。工作量证明当哈希时需要扫描哈希值,比如使用SHA-256时,哈希值以0比特开始。平均需要的工作量随着0比特位数的增加而成指数级增长,这点可以通过执行单个哈希来验证。
在我们的时间戳网络中,我们通过只有找到一个块所需0比特的哈希值时才向块中增加一个nonce来实现工作量证明。一旦CPU的努力使其满足工作量证明的条件,就不能对块进行更改,除非重做该工作。由于该块后面的块和它链接,更改这个块的操作需要更改它后面所有块的工作。
[图片上传失败...(image-d5496a-1562507194559)]
工作量证明机制同时解决了在大多数决策中的确定代表的问题。如果这个大多数是基于一个IP地址一个投票的方式,那么任何掌握很多IP的人都能够进行破坏。工作量证明从更本上来说是一个CPU一次投票。拥有最大工作量投资大最长链代表着大多数决定。如果大多数的CPU由诚实节点控制,那么真正的链将增长最快并超过其他竞争链。为了攻击一个过去的区块,攻击者需要重做这个块上以及后面所有块的工作量然后赶上并超过诚实节点的工作。我们将在后面证明随着后续块的增加,较慢的攻击者赶上诚实节点的概率将呈指数级减小。
为了补偿随着时间推移硬件速度的增加以及运行节点的多样兴趣,工作量证明的难度由不断变化的每个小时块数的平均值来决定。如果生产块的速度过快,工作量证明的难度将会增加。
5 网络
运行网络的步骤如下:
1 向所有节点广播新的交易
2 每个节点将新的交易添加进区块。
3 每个节点工作来找到其区块的一个复杂的工作量。
4 当一个节点找到工作了证明后,它向所有其他节点广播这一区块。
5 只有当该区块的所有交易都是有效且没有消费过时,节点才接受该区块。
6 节点通过使用接受块的哈希作为前一个哈希一在该链上继续工作以生产下一个块来表达对该块的认同。
节点总是认为最长的链式正确的那一个并将继续工作来延长最长链。如果两个节点同时播报不同版本的下一个块,一些节点将选择最先收到的一个或另一个。在这种情况下,他们在最先收到的块上工作同时保存另一个分支以防它变得更长。当下一个工作量被发现时,这种联系将会被打破,其中一个分支将更长,在另一个分支工作的节点将转向更长的这一个。
新交易的广播不一定需要到达所有的节点。只要他们通知到足够多的节点,他们将在块增长之前在块上开始工作。区块广播也能容忍信息丢失。如果一个节点没有收到块,当它收到下一个块并发现丢失一块时进行请求。
6 激励
在激励设计时,区块的第一笔交易是一笔特殊的交易,它生产一枚新的属于区块的创造者的代币。这使得节点更有动力来支持网络,因为没有中央机构来发行代币,该方式同时提供一种代币初始分配的方式。新代币数量的持续稳定增加就像是采矿工人花费资源来将更多的黄金放入流通市值种。在比特币中,花费的是CPU时间和电力。
激励也可以以交易费来提供,如果一笔交易输出的价值少于它投入的价值,差价就是增加包含该交易的块的激励的交易费。一旦进入流通的代币达到指定值,激励就可以完全变为交易费用且不会有任何通货膨胀。
激励机制能够帮助促进节点保持诚实。如果一个贪婪的攻击者比所有的诚实及诶单掌握了更多的CPU资源,他就需要在通过更改交易来骗取他人和生产新代币之间作出选择。他应该会发现遵守规则更有利可图,这样的规则使他获得比其他所有人更多的新代币,相较于攻击系统以及个人财富的有效性。
7 回收磁盘空间
一旦代币中最新的交易前已经有了足够多的区块,在它之前的交易就可以被丢弃以节省磁盘空间。为了在不破坏区块哈希的情况下实现磁盘回收,比特币使用Merkle Tree(默克尔树)来对交易进行哈希,在默克尔树中,该区块哈希只包含树的根节点。旧的区块可以通过对树进行减枝来进行压缩。内部哈希不再需要被存储。
[图片上传失败...(image-d5ba2d-1562507194559)]
没有任何交易的区块头大概占80字节。假设每10分钟生产一个区块,一年大概需要80624*365字节=4.2MB。2008年,计算机系统通常包含2GB的RAM,根据摩尔定律,每年增长1.2GB,因此即使区块头都存储在内存中,存储也不会成为问题。
8 简化支付验证
在不运行全部网络节点的情况下验证支付的有效性是可行的。用户只需要备份最长的工作量证明链的区块头即可,该区块头可以通过不断查询网络节点直到确信是最长链的方式来获得,同时获得所在时间戳的区块上与这笔交易相关的默克尔树的分支。用户无法自己来验证交易,但是他可以将交易链接到链上去看网络节点接受了该交易,同时在其后加入到区块进一步证明了网络认可了这笔交易。
[图片上传失败...(image-550c53-1562507194559)]
通过上述方式,只要诚实节点控制网络,验证就是可靠的,但是如果网络攻击者控制了更多的力量,那么网络就很容易受到攻击。如果网络节点可以自己验证交易,那么只要攻击者持续控制网络,那么简化的验证方法就会被攻击者假造的交易欺骗。一个应对措施是接受网络节点的警告,当网络节点检测到一个无效区块时,提示用户软件下载全部的区块并且警告交易来确认不一致。频繁收钱的企业很可能仍希望运行自己的节点来获得更独立的安全性和更快的验证。
9 价值组合和分割
虽然可以单独处理硬币,但要制作一个
对转让中的每一分进行单独的交易。为了允许值被拆分和组合,
事务包含多个输入和输出。通常会有一个单独的输入
从一个更大的以前的交易或多个输入合并较小的金额,最多两个
输出:一个用于付款,一个将更改(如果有)返回给发送方。
应该注意的是,当一个事务依赖于多个事务时,扇出
事务依赖更多,在这里不是问题。没有必要提取
完成事务历史记录的独立副本。
注:本文翻自比特币白皮书