比特币白皮书翻译

水平有限,很多地方还没弄明白,有的地方翻译得不成人话。

比特币:一个点对点的电子货币系统
中本聪

摘要 一个纯点对点版本的电子货币允许由一方直接在线支付给另一方而无需一个财务机构。数字签名提供了部分解决方案,但是如果仍然需要一个可信的第三方来防止发生双重支付,还是不能实现电子货币的重要益处。我们提出了一个通过使用点对点网络解决双重支付问题的方案。网络通过将交易的哈希值连进一个不断增长的基于哈希的工作量证明的链中来为交易打上时间戳,形成一个除非修改工作量证明否则不可更改的记录。最长的链不仅是证明时间的证据,也是它来自最大的CPU算力池的证据。只要控制大部分CPU算力的节点不联合起来攻击网络,他们就能形成最长的链,让攻击者的算力赶不上链条生成的速度而来不及实施攻击。网络本身只需要最小的结构。消息是在尽最大努力的基础上广播的,节点可以按照意愿离开和重新加入网络,加入的时候接受最长的工作量证明链最为它们离开时发生的交易的证明。

1.简介
互联网的金融交易已经变得几乎完全依赖作为可信第三方的金融机构来处理电子支付。虽然这个系统对于大部分交易来说工作足够良好,它仍然具有基于信任模型的固有缺陷。完全不可逆的交易是不可能的,因为金融机构无法避免调解纠纷。调解成本增加了交易成本,限制了最小的实际交易规模,排除了小额日常交易的可能性,还有一个更大的成本是失去了为不可逆服务提供不可以支付的能力。因为有逆转的可能性,就需要信任。商人必须提防他们的顾客,向他们打听比他们需要的更多的信息。一定比率的欺诈是不可避免的。这些成本和支付的不确定性可以由人们使用物理货币来避免,但是没有一个机制可以实现在没有可信方的电信渠道上的支付。
我们需要一个基于密码学证明机制来替换掉信任的电子支付系统,允许任何两个有交易意愿的双方直接与对方交易而不需要一个可信任的第三方。交易在计算上不可逆将保护卖方不受欺诈,共识机制可以轻松实现保护买家。在此篇文章中,我们提出了一个解决双重支付问题的方案,使用一个点对点分布式的时间戳服务器为时间连续的交易生成计算的证明。只要全体的诚实节点控制着比任何攻击节点组更多的CPU算力,系统就是安全的。

2.交易
我们把一系列数字签名作为一种电子币。每一个拥有者通过对前一笔交易的哈希和下一个拥有者的公钥进行数字签名并且把这些信息添加到币的尾端来转移这个币给下一个人,收款人通过核实数字签名来核实链的物主身份。
这个方法的问题是收款人无法核对拥有者中没有人双重支付了电子币。通常的解决方法是引入一个可信的中心权威,或者类似于造币厂的机构,来检查每一笔交易是否双重支付了。每一笔交易后,币必须回收到造币厂,造币厂发行一个新币,只有造币厂发型的币可以被信任为没有双重支付。这个方法的问题是整个金钱系统注定依赖于运营造币厂的公司,每笔交易都必须经过他们,就像一个银行。
我们需要给收款人一个方法获知币的上一个拥有者没有签署任何更早的交易。为了我们这个目的,最早的交易成为最重要的交易,这样我们不用关心以后的双重支付。确认一笔交易存在的唯一方法是清楚每一笔交易。在基于造币厂的模型中,造币厂清楚每一笔交易并且决定哪一笔先到。要想不通过第三方信任机构实现这个能力,交易必须被公开声明,我们需要一个系统给参与者,让他们在接收到的交易单历史记录中统一同意单一的一个。收款人需要证明每笔交易发生的时候,大多数节点都同意这一笔是第一个到达的。

3.时间戳服务器
我们的方案基于一个时间戳服务器。时间戳服务器的工作是将一些交易信息条目组成的块的哈希打上时间戳,然后公开广播这个哈希,比如通过报纸或者使用Usenet端口2到5号。显然,时间戳能够证明数据在那个时间点是肯定存在的,为了进入那个哈希。每一个时间戳将前一个时间戳包含在自己的哈希里,形成一个链条,没个新添加的时间戳都强化了它前面的那个时间戳。

4.工作量证明
为了在基于点对点的分布式时间戳服务器,我们要使用一个类似于Adam Back's Hashcash的工作量证明系统,而不是报纸或者Usenet端口。工作量证明包括哈希时扫描的值,比如用SHA-256哈希算法,哈希结果必须是几个0.所需的平均工足量与0的个数成指数关系,执行一条哈希命令就可以验证。
在我们的时间戳网络中,我们通过在块里添加一个随机数,不算变换这个随机数,直到找到这个块的哈希值满足0的个数来实现工作量证明。一旦CPU工作满足这个工作量证明,这个块就不能修改了,除非重新做一遍工作量证明。因为后面的块又连进来了,要想改这个块就必须把后面连进来的块的工作量证明都重新做一遍。
工作量证明机制同时解决了多人决策中的代表选举问题。如果大多数是一个IP地址一票的,他会被任何一个拥有很多IP地址的人破坏掉。工作量证明机制本质上是一个CPU一票。大多数的决策由最长的链代表,最长链消耗了最多的工作量证明工作。主要大部分的CPU算力被诚实节点控制,诚实的那条链将增长得最快,超过其他的竞争链。要修改一个历史块,攻击者要重做这个块和其后面所有块的工作量证明工作,并且还要跟上而且超过诚信节点的工作。后面我们会看到随着后续块的增加,一个慢速攻击者赶上的可能性呈指数减少。
为了补偿硬件速度的增长和使节点长时间保持参与的兴趣,工作量证明的难度由每小时产生的块数的平均值来决定。如果块增长的太快,困难度就提升。
5. 网络
运行这个网络的步骤如下:
1)新的交易广播到所有节点
2)每个节点将新的交易收集到块里
3)每个节点为他的块寻找一个高难度的工作量证明
4)当一个节点找到了工作量证明,它把这个块广播给所有节点
5)所有节点只有验证过这个块包含的交易都合法并且没有双重交易才接受这个块
6)节点通过继续在这个块后面创造新块来表示接受了这个块,以接受的这个块的哈希作为自己创造的块的前一个哈希。

所有节点永远承认最长的链是正确的并且一直往最长链的末端加入区块。如果两个节点同时广播了下一个区块的不同版本,一些节点可能优先接受其中的某一个。在这种情况下,他们在接收到的第一个块后面继续工作,但是保存另一个块以备它变得更长。当下一个工作量证明被找到并且其中一条分支变得更长的时候,约束就被打破了;工作在另一个分支的节点会切换到更长的链上。

新交易信息的广播不必要传达到全部的节点。只要到达多个节点,他们就会在短时间内被添加到一个区块里。块的广播也可以容忍丢失信息。如果一个节点没有接收到一个块,它会在收到下一个块的时候认识到它漏掉一个块并向其他节点请求这个漏掉的块。

6. 奖励机制
按照惯例,一个区块里面的第一笔交易是一笔特殊交易,内容是给创建这个块的人凭空生成一枚新币,从此,再也没有中央权威来发行钱币了。这样新币量持续稳定的增长类似于金矿旷工消耗资源(时间、体力)把黄金加入到流通的过程。在生产比特币的过程中,消耗的是CPU运行时间和电力。

交易手续费也可以作为奖励。如果一笔交易的支出和收入不相等,那么差额就是确认这笔交易的区块的奖励。一旦预先设定好的比特币总量全部进入了流通,奖励完全可以完全转化为手续费,而且完全没有通货膨胀。

奖励机制可以鼓励节点保持诚实。如果一个贪婪的攻击者能集合比诚实节点更多的CPU算力,他要选择用此来窃取他人的钱还是生成新的比特币。他会发现按照规则参与玩更有利可图,比起破坏系统和他自己财务的合法性,规则回馈给他比其他人加一块还多的新币。

7. 回收磁盘空间
一旦一个区块里的交易被足够多的块掩埋了,在它之前的交易就可以被丢弃以节省磁盘空间。为了不实现这个能力又不破坏区块的哈希,交易全部被哈希为一棵默克尔树,区块里只保存树根。剪去旧块的树枝就可以压缩空间。内部哈希没有必要保留。
一个没有交易信息的空的区块头大约80字节。我们假设每10分钟产生一个新块,一年就是80*6*24*365=4.2MB。2008年的计算机典型配置是2G内存,摩尔定律预测目前的增速是每年1.2GB,即便区块头必须保存在内存里,存储也不应该成问题。

8. 简单的支付证明
并不需要全网节点参与也可以验证支付。一个用户只需要保有最长链的全部块头的副本和他要验证的这笔交易所在区块的默克尔树的树枝就可以了,前者可以通过向全网节点请求来获得。他不能自己验证交易,但是他可以通过访问链条,看到有某个网络节点已经接受这笔交易了,并且添加在这笔交易所在块后面的区块们进一步确认全网已经接受这笔交易了。(上一节明明说树枝已经被剪掉了,不明白)
这样,只要诚实节点控制着网络,证明就是可靠的。全网节点都能自己验证交易,但是如果攻击者能持续控制网络,这个简单的验证方法就会被攻击者捏造的交易欺骗。一个保护策略是当节点发现一个不合法的区块时警告用户的软件去下载完整的链条,并且警告交易确认这有一笔不一致的交易。频繁接受支付的业务可能还是想运行他们自己的节点以获得更独立的安全性和更快的交易验证。

9. 组合和分割价值
虽然可以按每个币为单位处理交易,但是如果不能再细分交易单位的话交易还是很不方便。为了允许价值被分割和组合,交易包含多个输入和输出。一般可能有来自前一笔大交易的单独的输入或者来自多个小账户的组合输入这两种输入情况,然后最多有两个输出:一个是支付,一个是需要的话给发送者找零。

需要注意的是,一笔交易依赖于若干笔交易,这若干笔交易又依赖于更多笔交易的情况是没有问题的。永远不需要获取一笔历史交易的完整、独立的副本来验证它。

10. 隐私
传统的银行模式通过限制交易相关方的信息访问和可信的第三方来达到一定水平的隐私保护。全网公布交易信息的必要性使这个方法失去作用,但是隐私仍然可以通过打断另一个地方的信息流来实现保护:通过保持公钥的匿名性。公众可以看到某人向某人转了多少钱的一笔交易发生,但是不知道双方的身份。这跟股票交易的信息公布程度类似,每笔交易的时间和交易量是公开的,但是交易方都是不公布的。
作为一道额外的防火墙,每一笔交易应该使用一对新的密钥,以便这些密钥不被追溯到一个公共拥有者。对于多输入的交易来说,一些输入之间的关联是不可避免的,这会揭示出这些输入来自同一个拥有者。风险来自于如果一个密钥的拥有者信息被揭露了,就可以追溯到这个人的所有交易。

11. 计算
考虑攻击者试图在诚实链上以更快的速度生成了一条支链的情况。即使这个任务完成了,也不能随意改变系统,比如凭空创造价值或者拿走不属于攻击者的钱。节点不会接受一笔不合法的交易,诚实的节点永远不会接受一个包含不合法交易的区块。攻击者只能尝试修改一笔他自己最近发生的交易把他的支付拿回来。
诚实链和攻击链之间的竞赛可以描绘成二项随机游走。成功的情况是诚实链多一个区块,失败的情况是攻击链多一个区块。
攻击者从一定落后距离追赶上来的概率类似于一个赌徒破产问题。假设一个有无限信贷额的赌徒带着一定的亏空开始一场潜在次数为无穷的赌博,视图填补上自己亏空。我们能计算出他追平的概率,也就是攻击者追上诚实链的概率:
p=诚实节点找到下一个区块的概率
q=攻击节点找到下一个区块的概率
qz=攻击者追赶z个区块的概率
我们假设p>q,概率随着攻击者需要追赶的区块数成指数下降。如果他不能迅速追赶上的话随着他被月落越远而使成功的概率变得渺茫。我们考虑一笔交易的接收方要在充分确定发送方不会修改交易前等待多久。我们假设发送方是一个攻击者,他想让接收方在一段时间内相信已经付过款了,然后过了一会又把支付的钱重新支付给自己。此时接收方会接到告警,但是为时已晚。
接收方生成了一对新的密钥并且在签字之前很短的时间才把公钥给了发送方,这样防止发送方通过努力工作直到他足够幸运的提前准备好一串区块的时候执行交易。交易一点发出,不诚实的发送方开始秘密地在包含他这笔交易的另一个版本的平行连上工作。
接收方等待交易被添加进一个区块然后z个区块连在这个区块后面。他不知道攻击者准确的进展,但是假设诚实的区块消耗了每个区块的平均预期耗时,攻击者的潜在进展将服从泊松分布,这个分布的期望是:
要计算攻击者此时可以追赶上的概率,我们把每一次他能取得的进展量(区块数)的泊松分布的概率密度乘以他能从这个区块开始赶上的概率:
化为如下形式,避免对无线队列求和
转化成C代码
#include <math.h>
double AttackerSuccessProbability(double q, int z)
{
double p = 1.0 - q;
double lambda = z * (q / p);
double sum = 1.0;
int i, k;
for (k = 0; k <= z; k++)
{
double poisson = exp(-lambda);
for (i = 1; i <= k; i++)
poisson *= lambda / i;
sum -= poisson * (1 - pow(q / p, z - k));
}
return sum;
}
跑一些结果出来,我们发现概率对z呈指数下降
q=0.1
z=0 P=1.0000000
z=1 P=0.2045873
z=2 P=0.0509779
z=3 P=0.0131722
z=4 P=0.0034552
z=5 P=0.0009137
z=6 P=0.0002428
z=7 P=0.0000647
z=8 P=0.0000173
z=9 P=0.0000046
z=10 P=0.0000012
q=0.3
z=0 P=1.0000000
z=5 P=0.1773523
z=10 P=0.0416605
z=15 P=0.0101008
z=20 P=0.0024804
z=25 P=0.0006132
z=30 P=0.0001522
z=35 P=0.0000379
z=40 P=0.0000095
z=45 P=0.0000024
z=50 P=0.0000006

计算小于0.1%的P值
P < 0.001
q=0.10 z=5
q=0.15 z=8
q=0.20 z=11
q=0.25 z=15
q=0.30 z=24
q=0.35 z=41
q=0.40 z=89
q=0.45 z=340
12. 结论
我们提出了一个去信任的电子交易系统。我们首先讨论了用电子签名生成货币的常用框架,虽然这个框架对所有钱提供了强有力的控制,但是没有防止双重支付的手段的话还是不完整的。为了解决这个问题,我们提出了一个使用工作量证明的点对点网络来公开记录交易的历史,只要诚实节点控制着大多数CPU算力就很难被攻击者改变。网络在非结构化的简洁方面是健壮的。同时工作的节点需要很少的协同。他们不需要建立身份,这样信息不会路由到任何特定的地方而且只基于尽最大努力传递的基础。节点可以按照意愿离开和回到网络,接受经过工作量证明的链来证明他们离开时发生的交易。他们有CPU算力投票,通过在合法节点后面继续工作来扩展它来表示对它的接受,通过拒绝在非法节点后面工作来表示拒接它。任何必要的规则和激励都可以通过这个一致性机制来执行。

猜你喜欢

转载自blog.csdn.net/qq_35753140/article/details/79476870