标题:《比特币:一个点对点的电子现金系统》

翻译:快乐的哈士奇

作者:Satoshi Nakamoto

摘要

摘要纯粹的点对点电子现金将允许在线支付直接从一方发送到另一方,而无需通过金融机构。数字签名提供了部分解决方案,但是如果仍然需要可信的第三方来防止重复开销,那么主要的好处就丧失了。我们提出了一个使用点对点网络解决双消费问题的方案。网络时间戳通过将事务散列到基于散列的工作证明的持续链中,形成不重新进行工作证明就不能更改的记录。最长的链不仅可以作为所见证的事件序列的证据,而且可以证明它来自最大的CPU功率池。只要大部分CPU能量是由不合作攻击网络的节点控制的,它们就会产生最长的链并超过攻击者。网络本身需要最小的结构。消息以最佳方式广播,节点可以随意离开和重新加入网络,接受最长的工作证明链作为它们离开时发生的事情的证据。

小晨翻译:btc白皮书,一起来学习一下区块链技术_解决方案

介绍

互联网商务几乎完全依赖于金融机构作为可信的第三方来处理电子支付。尽管该系统在大多数事务中运行良好,但它仍然存在基于信任的模型的固有缺陷。完全不可逆转的交易实际上是不可能的,因为金融机构无法避免调解纠纷。调解的费用增加了交易费用,限制了最小的实际交易规模,并减少了小额临时交易的可能性,而对于不可逆的服务支付不可逆费用的能力的丧失也造成了更大的损失。随着形势可能逆转,对信任的需求也在扩大。商家必须警惕他们的顾客,向他们索取更多的信息。一定比例的欺诈被认为是不可避免的。这些成本和支付的不确定性可以通过使用实物货币亲自避免,但是没有一种机制可以在没有可信方的通信渠道上进行支付。

我们需要的是一个基于密码证明而非信任的电子支付系统,允许任何两个有意愿的一方直接进行交易,而不需要一个受信任的第三方。计算上不可能逆转的交易将保护卖方免受欺诈,而常规的托管机制可以很容易地实施以保护买方。在本文中,我们提出了一个解决双重开销问题的方案,使用对等分布式时间戳服务器生成事务的时间顺序的计算证明。只要诚实节点集体控制的CPU功率大于任何协作攻击节点组,系统就是安全的。

交易

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

小晨翻译:btc白皮书,一起来学习一下区块链技术_时间戳_02

当然,问题是收款人无法证实其中一个所有者没有重复使用硬币。一个常见的解决方案是引入一个受信任的中央机构(mint)来检查每一笔交易的双倍支出。每笔交易后,硬币必须返回铸币局发行新的硬币,只有直接从铸币局发行的硬币是可信的,不重复使用。这种解决方案的问题在于,整个货币体系的命运取决于运营造币厂的公司,每笔交易都必须经过造币厂,就像银行一样。

我们需要一种方法让收款人知道以前的业主没有签署任何早期的交易。对于我们的目的,最早的交易是有意义的,所以我们不关心以后的重复消费尝试。确认事务不存在的惟一方法是了解所有事务。在基于铸币局的模型中,铸币局知道所有的交易并决定哪个先到达。要在没有可信方的情况下完成此任务,必须公开宣布[1]事务,并且我们需要一个系统,让参与者就接收它们的订单的单一历史记录达成一致。收款人需要证明在每次交易时,大多数节点都同意它是第一个收到的节点。

时间戳服务器

我们建议的解决方案从时间戳服务器开始。时间戳服务器的工作方式是获取要加盖时间戳的数据块的散列,并广泛地发布散列,例如在报纸或Usenet post[2-5]中。显然,时间戳证明了数据必须在那个时候存在,以便进入散列。每个时间戳在其散列中包含前一个时间戳,形成一个链,每个额外的时间戳加强前一个时间戳。

小晨翻译:btc白皮书,一起来学习一下区块链技术_点对点_03

工作证明

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

对于我们的时间戳网络,我们通过在块中增加一个nonce来实现工作证明,直到找到一个为块的散列提供所需零位的值。一旦花费了CPU的精力使其满足工作证明,如果不重做工作,就不能更改块。由于后面的块是在它之后链接的,所以更改块的工作将包括在它之后重做所有的块。

小晨翻译:btc白皮书,一起来学习一下区块链技术_解决方案_04

工作证明还解决了多数决策中确定代表性的问题。如果大多数是基于一个ip地址一票,它可以被任何能够分配许多ip的人颠覆。工作证明实质上是一票对一票。多数决策由最长的链表示,最长的链投入了最大的工作证明工作。如果大部分CPU功率由诚实节点控制,诚实链将增长最快,并超过任何竞争链。要修改过去的块,攻击者必须重新进行块及其后所有块的工作证明,然后赶上并超过诚实节点的工作。我们稍后将展示,随着后续块的添加,攻击速度较慢的攻击者赶上的概率会以指数方式减少。

为了补偿随时间增长的硬件速度和对运行节点的兴趣的变化,工作证明的难度由以每小时平均块数为目标的移动平均值决定。如果它们生成得太快,难度就会增加。

网络

运行网络的步骤如下:

1.新事务被广播到所有节点。2.每个节点收集新的交易到一块。3.每个节点寻找工作困难proof-of-work块。4.当一个节点发现proof-of-work,所有节点广播块。5.节点接受块只有在所有事务都是有效的,而不是已经花了。6.节点块的表达他们的验收工作创建链中的下一个块,使用已接受块的哈希作为前一个哈希。

节点总是认为最长的链是正确的,并将继续扩展它。如果两个节点同时广播下一个块的不同版本,一些节点可能首先接收其中一个。在这种情况下,他们处理收到的第一个分支,但是保存另一个分支,以防它变长。当找到下一份工作证明,其中一根树枝变长时,这条领带就会断;在其他分支的节点将会切换到时间。

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

激励

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

奖励也可以由交易费资助。如果一项交易的输出价值小于其输入价值,其差额就是交易费,该交易费被添加到包含该交易的块的激励价值中。一旦一定数量的硬币进入流通,激励机制就可以完全过渡到交易费用,完全消除通货膨胀。

这种激励可能有助于鼓励节点保持诚实。如果一个贪婪的攻击者能够聚集比所有诚实的节点更多的CPU能力,他将不得不选择使用它来通过偷回他的支付来欺骗人们,或者使用它来生成新的硬币。他应该发现,按规则办事更有利可图,这种规则给他带来的新硬币比其他人加起来还多,而不是破坏这个体系和他自己财富的有效性。

回收磁盘空间

一旦硬币中的最新事务被埋在足够多的块下,就可以丢弃之前使用的事务以节省磁盘空间。为了在不破坏块哈希的情况下促进这一点,事务在Merkle树[7][2][5]中进行哈希,只有根包含在块的哈希中。旧的木块可以通过剪断树枝来压实。内部散列不需要存储。

小晨翻译:btc白皮书,一起来学习一下区块链技术_时间戳_05

没有事务的块头大约是80字节。假设每10分钟生成一个块,那么80字节* 6 * 24 * 365 = 4.2MB /年。从2008年开始,计算机系统通常销售2GB的RAM,而摩尔定律预测当前的增长速度为每年1.2GB,因此即使块头必须保存在内存中,存储也不应该成为问题。

简化付款确认

可以在不运行完整网络节点的情况下验证付款。用户只需要保留最长工作证明链的块标头的副本,他可以通过查询网络节点获得该副本,直到他确信自己拥有最长的链,并获得将事务链接到它的时间戳所在的块的Merkle分支。他不能自己检查事务,但是通过将其链接到链中的一个位置,他可以看到一个网络节点已经接受了它,并在它进一步确认网络已经接受它之后添加块。

小晨翻译:btc白皮书,一起来学习一下区块链技术_时间戳_06

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

合并和切分值

虽然可以单独处理硬币,但将转账中的每一分钱都单独处理是不方便的。为了允许值被分割和组合,事务包含多个输入和输出。通常情况下,一个较大的前一笔交易的单个输入或多个金额较小的组合输入,最多有两个输出:一个用于支付,另一个用于将更改(如果有的话)返回给发送方。

小晨翻译:btc白皮书,一起来学习一下区块链技术_服务器_07

应该注意,扇出(一个事务依赖于多个事务,而这些事务依赖于更多的事务)在这里不是问题。不需要提取事务历史的完整独立副本。

隐私

传统的银行模式通过限制相关方和可信的第三方对信息的访问来达到一定程度的隐私。公开宣布所有事务的必要性排除了这种方法,但是通过在另一个地方中断信息流(通过保持公钥匿名)仍然可以维护隐私。公众可以看到有人向其他人发送了一笔金额,但是没有将交易与任何人联系起来的信息。这与证券交易所公布的信息水平类似,在这些交易所,单个交易的时间和规模(即“交易记录”)被公开,但不透露交易双方是谁。

小晨翻译:btc白皮书,一起来学习一下区块链技术_服务器_08

作为一个附加的防火墙,应该为每个事务使用一个新的密钥对,以防止它们被链接到一个共同的所有者。对于多输入事务,一些链接仍然是不可避免的,这必然表明它们的输入属于同一所有者。风险在于,如果密钥的所有者被泄露,链接可能会泄露属于同一所有者的其他事务。

计算

我们考虑了攻击者试图比诚实链更快地生成替代链的场景。即使做到了这一点,它也不会让系统面临任意的变化,比如凭空创造价值或拿走从来不属于攻击者的钱。节点不会接受无效的事务作为支付,可靠的节点也不会接受包含它们的块。攻击者只能尝试更改他自己的一个事务来收回他最近花费的钱。

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

攻击者弥补给定赤字的概率类似于赌徒的破产问题。假设一个拥有无限信用额度的赌徒从赤字开始,为了达到收支平衡,他可能会进行无限次的尝试。我们可以计算出他达到盈亏平衡的概率,或者攻击者追上诚实链的概率,如下[8]:

小晨翻译:btc白皮书,一起来学习一下区块链技术_服务器_09

根据我们的假设p > q,随着攻击者必须赶上的块数的增加,概率呈指数下降。由于他的胜算不大,如果他不及早幸运地向前冲一步,随着他进一步落后,他的机会就会变得微乎其微。

现在,我们考虑新事务的接收方需要等待多长时间才能充分确定发送方不能更改事务。我们假设发送者是一个攻击者,他想让接收者相信他支付了一段时间的钱,然后在一段时间后将钱转回给他自己。当这种情况发生时,接收方会得到通知,但发送方希望为时已晚。

接收方生成一个新的密钥对,并在签名前不久将公钥交给发送方。这可以防止发送者通过不断地工作来提前准备一个块链,直到他足够幸运能够提前完成足够多的工作,然后在那个时候执行事务。一旦事务被发送,不诚实的发送者就开始在包含其事务的另一个版本的并行链上秘密工作。

接收者等待,直到事务被添加到一个块中,并且在它之后链接了z块。他不知道攻击者已经取得了多少进展,但是假设诚实的块花费了每个块的平均预期时间,攻击者的潜在进展将是一个带有期望值的泊松分布:

小晨翻译:btc白皮书,一起来学习一下区块链技术_数字签名_10

小晨翻译:btc白皮书,一起来学习一下区块链技术_解决方案_11

结论

我们提出了一个不依赖信任的电子交易系统。我们从通常的数字签名硬币框架开始,它提供了强有力的所有权控制,但不完整,没有办法防止重复消费。为了解决这个问题,我们提出了一个使用工作证明来记录事务的公共历史的点对点网络,如果诚实的节点控制了大部分的CPU能力,那么攻击者很快就会发现这种记录在计算上是不切实际的。该网络以其非结构化的简单性而健壮。节点几乎不协调地同时工作。它们不需要被标识,因为消息不会被路由到任何特定的位置,只需要在最佳的基础上交付。节点可以随意离开并重新加入网络,接受工作证明链作为它们离开时发生的事情的证据。他们使用自己的CPU能力投票,通过扩展有效块来表示他们接受有效块,通过拒绝处理无效块来表示他们拒绝处理无效块。任何必要的规则和激励都可以通过这种共识机制来执行。

引用

小晨翻译:btc白皮书,一起来学习一下区块链技术_点对点_12

 

 

小晨翻译:btc白皮书,一起来学习一下区块链技术_服务器_13

 

关注小晨说数据,获取更多大厂技术干货分享

回复“spark”,“flink”,“机器学习”,“前端”,中台”,架构获取海量学习资料~~~