比特币白皮书精读翻译

摘要:

一个纯正的P2P电子货币系统可以绕过第三方金融机构从而实现在线支付。电子签名是解决方案的一部分,但是最主要的问题是,我们仍然需要一个可信第三方来防止双花攻击。我们提出了一个利用p2p网络解决双花问题的方案。这个网络将交易哈希化成一条持续的基于哈希的工作量证明链,同时对交易加上时间戳,形成一个不可篡改的记录(除非重做工作量证明)。最长链不仅作为一系列目睹事件的证据,同时也是它来自最大CPU池的证据。只要大多数的CPU算力被诚实者掌控着,他们就可以生成最长链且快于攻击者。这个网络它需要最小的结构。在这里,消息的传递使用best-effort机制,节点可以根据意愿离开或再加入到网络中,他们接受最长的POW链最为他们离开时候发生事件的证据。

1.介绍

互联网上的评论几乎都依赖于金融机构作为可信第三方从而实现电子交易。当这个系统对大多数交易都友好,它就会受到基于信任的模型的内在缺点的威胁。完全不可退回的交易是不太现实的,因为金融机构不可能避免调解纠纷。调解的费用会增加交易费,限制了实际交易的最小规模,削减了小型任意交易的可能性,而且,失去为不可退回的服务提供不可退回的交易,这将是一个更大的消费。由于存在撤回的可能,信任因此显得格外重要。商人必须格外小心他们的消费者,争取获得更多他们的信息,同时尽量隐蔽自己。一定程度的欺诈是可以接受的,因为它是不可避免的。这些花费和交易的不确定性可以通过使用物理货币进行避免,但是在缺乏信任方的情况下,没有一种机制可以实现信道中的交易。

我们现在亟需一个电子支付系统,它是基于密码学证明的而不是纯信任的,它允许在没有可信第三方的情况下任意两个有意愿的交易方直接进行交易。这些在计算上不可退回的交易可以防止欺诈的卖家,同时日常的托管机制可以轻易地实现来保护买家。本文中,我们提出了一种针对双花问题的方法,它使用了P2P的分布式时间戳服务来生成一个按时序顺序的交易的计算量证明。只要诚实的节点掌控的CPU算力大于任何腐败集团,这个系统就是安全的。

2.交易

我们将电子货币定义为一串的电子签名。每一个支付方通过对前一个交易和接收方的公钥的共同哈希进行电子签名来传输电子货币,然后将这个被签名的哈希放到货币的最后。这样,一个接收方可以通过支付方的公钥进行签名的验证从而验证链上货币的归属权。

在这里插入图片描述

那么,这里存在的问题是啥咧?没错!就是接收方不能验证支付方是否对交易的货币进行了双花。一种通常的解决方法是介入一个可信的中心权威机构,或者一个铸币厂,以此来检查交易是否被双花。在铸币厂情境中,每一个交易中的货币都必须返还到铸币厂中,然后铸币厂生成新的货币给接收方,只有直接来自铸币厂的货币才是可信的,且可以保证不是双花的。这个解决方案的缺点很明显啊,就是整个金钱的系统都依赖于一个运行铸币厂的机构,所有的交易都必须经过铸币厂的处理,就像一个银行一样啊呵呵!(去中心化思想何在!我们要的可是民主!我们不想被限制!隐私不想被窥探!)

我们需要一个途径帮助接受方去确认支付方没有对更早的交易进行签名(从而形成双花)。为了达到我们的目的,早期的交易是我们需要关心的,所以我们无需对后期的双花尝试。确认一个交易是否缺席的唯一方法那当然是关注所有的交易。在基于铸币厂的模型中,铸币厂对所有交易都是感知的,它可以决定哪个交易来的更早。然而,如果在没有可信第三方的情况下关注所有的交易,那么所有的交易必须公开通告,并且,我们需要打造一个共识系统,这样的话参与者们就可以统一一个单一交易历史顺序。那么,接收方如果想确认一个交易,就需要大多数节点同意它是第一个发送的(从而不是第二个形成双花的交易)。

3.时间戳服务

我们提出的解决方法以一个时间戳服务开始。一个时间戳服务是通过对区块里的各项取哈希然后广播这个哈希,正如在一个报纸上或Usenet post中。时间戳哈希可以证明某个数据在某个时段必定存在, 这样就可以进入哈希中(没看懂它在说啥。。。)。每一个时间戳(哈希)包括前一个区块(时间戳)的哈希,形成一条链,这样就会逐步加强时间戳的哈希依赖,从而变得不可篡改。

emmm,其实这段的时间戳就是区块的哈希吧,写的花里胡哨的。

在这里插入图片描述

4.工作量证明

为了实现基于p2p的分布式区块连接(时间戳服务),我们需要引入一种工作量证明(类似于Adam Back的哈希现金),而不是之前提到的报纸或Usenet posts。工作量证明要求我们搜索一个值的哈希,这个哈希可以使用sha256算法,要求这个哈希以一定数量的0作为开头。随着开头的0的数量增加,工作量证明的工作会成指数式增加,但是我们可以通过执行一个简单的哈希来验证它。

在我们的时间戳网络中,我们通过对一个区块中的随机数nonce进行增量直到它的哈希满足区块指定的0比特个数来实现工作量证明。一旦CPU总算力扩增使得工作量证明被满足,区块就不可能再改变其中的内容,除非重做工作量证明。如果后面链接上更多的区块,改变区块内容所需要的工作就包括重做后面所有区块的工作量证明。

在这里插入图片描述

工作量证明同时解决了决定大多数人意愿代表的问题。如果大多数人式基于一个ip一个投票的准则,那么他可能被一人多ip的情况给hack掉。工作量证明必须是一个cpu一个投票,其中最长链代表的是大多数人的意见,其中必定包含着最大量的工作量证明。如果大部分算力被掌控在诚实节点中,诚实链将会增长地最快同时超过任何与之比较的链。若要改变一个过去的区块,攻击者首先需要重做该区块的工作量证明,以及后面所有区块的工作量证明,同时还要追上和超过所有诚实节点做出的新的工作量证明。我们将会在后面给出一个慢速的攻击者追上诚实者链条的可能性,这个可能性将会随着区块的增加呈指数式增长!害!attacker没戏了,但这个证明确实挺迷!

为了弥补硬件速度的增长以及各个时间运行节点的不同激励,工作量证明的难度会根据每小时生成的区块数量移动平均的目标值。也就是说,如果区块生成的速度过快,那么难度就会增加,使得生成区块的间隔时间相对稳定!

5.网络

网络运行的步骤如下所示:

1)新的交易被广播道所有节点
2)每一个节点将新的交易打包进一个区块中
3)每个节点找一个符合当前块难度的工作量证明
4)当一个节点找到了工作量证明,它将它的区块广播到全网
5)如果这个被广播的区块中的所有交易都是合法的且没有被双花,那么其余节点就接受这个区块
6)其他节点通过沿着这个区块继续生成新的区块表示他们对这个区块的认可,也就是使用这个被接受的区块的哈希作为“前一区块的哈希”

节点总是认为最长链是正确的,而且会致力于扩展它。如果两个节点同时广播了不同版本的下一个区块,一些节点可能会先收到一个,而另一些则会先收到另一个。在这种情况下, 他们将会以先收到的区块作为前一个区块继续挖矿,但同时也保留着后收到的另一个分支防止它变得更长。当下一个工作量证明被找到,其中一个分支就会变得更长,这种平衡就会被打破;那些还在寻找短分叉的节点就会迅速地转到长分叉中(因为挖矿具有无记忆性,继续在短的分叉挖没有任何优势哦)

新的交易不需要广播到所有的节点。只要新得交易可以到达大多数系欸但,他们就可以很快进入一个区块中。区块的广播也是容忍信息丢失的。如果一个节点没有收到一个区块,当它收到下一个区块的时候它就会发现它miss掉了一个,他就可以向其他节点pull一下miss的block。

6.激励

通常来说,区块中的第一笔交易是一个特殊的交易,它是一个生钱的交易且属于区块的创造者。这为所有节点支持网络提供了一定的激励,同时也提供了一种初始化分配货币使其进入交易的策略,因为这里并没有中心的权威机构来解决发币问题。这个平稳的新币增量正如矿工通过增加资源(设备)来增加矿产从而进入交易循环中一样。在我们的情况中,所谓的资源就是cpu和电力的消耗。

交易费也可以作为激励的一种。如果交易的输出金额小于输入金额,不用惊慌,这里的差值被加到了包含这个交易的区块中的激励中了。一旦一定量的货币进入交易循环,激励就可以完全地转变成交易费,而且可以抵御通货膨胀。

这种激励可以帮助鼓励节点保持诚实。如果一个贪婪的攻击者可以聚集比所有诚实者更多的cpu算力,它可以有两种选择,一是通过欺诈的手段重新夺回它之前的支付,二是生成新的区块而获得激励。他应该会发现按照规则来玩应该是更赚的,btc的规则可以让他获得比其他人加起来更多的货币,也比它通过破坏系统以及它自己财富的合法性获得的货币要更多哦!

7.回收磁盘空间

一旦一个货币的最近交易被埋在足够深的区块中,在这之前的已经完成的交易就可以被丢弃,从而节省磁盘空间。为了完成这种操作,同时也不破坏区块的哈希,交易被藏在了哈希树里面,只有根被包括在区块的哈希中。老旧的区块可以通过剪枝的方式来进行数据压缩。内部细节的哈希值不需要被存储了。

在这里插入图片描述
一个区块头(不包含交易)大概占80个字节。如果我们假设平均10分钟生成一个区块,一年就会有4.2MB的数据。随着当前2008年的计算机系统通常都是配置2GB的RAM,随着摩尔定律说的每年1.2GB的增速,存储应该不成问题(及时区块头要保存在内存中)

8.简化的支付验证

在不运转全节点的情况下,验证交易也是可能的。用户只需要copy一份最长工作量证明链的所有区块头信息,它可以通过询问全节点们直到他确信自己拿到了最长链,然后获得对应交易所在区块上的Merkle树的枝叶。他不能独自验证该交易的合法性,但是他可以merkle tree连接到某个区块的区块头上。他可以发现,这个区块是被全节点所认可的,而且后面延续的区块进一步地增加了他的可信度。

在这里插入图片描述

这样,只要诚实节点控制着网路,验证就是可靠的,但如果网络被攻击者掌控着,验证就会更加地脆弱。当全节点可以自发地验证交易,攻击者可以通过简单地伪造交易来糊弄全节点(只要攻击者持续接管网络)。一个抵御攻击的策略就是接受全节点的警告(当全节点侦察到有非法的区块,促使用户的软件取下载完整的区块和被警告的交易来验证不一致性)。然而,需要接受频繁支付的公司可能还是希望将他们的节点运转在更独立安全和快速验证的系统当中。

9.组合和拆分交易

虽然可以在个人层面解决交易问题,但是如果在每一次交易中都是分分毫毫的独立交易,这将是比较笨重的。为了允许价值可以被拆分和组合,交易包含着若干个输入和输出。通常来说,要么是有一个来自于前一个交易的大额输入,要么是有多个输入(小额输入结合),但是输出最多只有两个:一个是支付的输出,另一个是找零钱的输出(归还给支付方)

在这里插入图片描述

在输出端口中,通常都有一个交易依赖于其他几个交易,而且那几个交易又依赖于更多的交易,这将不是一个问题了。我们没有必要抽取出一个独立的交易历史副本出来。

10.隐私

在传统的银行模型中,他们实现了许多层级的隐私模式(通过限制不同集体对信息的权限,包括第三方可信集团)。如果要堂而皇之地将所有交易公之于众,我们不能采取这种模型,然而隐私仍然可以被保护(通过另一种方式切断信息流):使用匿名公钥技术。大众可以看到某人给某人发送一定量的货币,但是交易具体的双方是不得而知的。这就类似于股票交易中发布的信息层级,个人交易的时间和规模(传说中的“录像带”),都是公开的,但是我们并不知道交易的双方是谁。

在这里插入图片描述

作为一个额外的防火墙,每一次新的交易都应该生成一个新的密钥对以防止可以链接到同一个共同的拥有者。然而,在多输入的交易中,一些链接仍然是不可避免的,这就暴露了他们的输入是属于同一个拥有者的。风险就是,一个在现实世界的拥有者的密钥暴露了,与它相关的所有交易都会暴露出来。害!

11.计算

我们现在考虑这样的一个情景,一个攻击者尝试生成另一条链(分叉攻击),生成速度想超过诚实者的链。即时这种想法实现了,这也不会使得系统公开地进行强制转换,例如无中生有得到货币或者从攻击者外的账户中偷钱。因为,其他节点是不会接受这些违法的交易的,诚实的节点也不会接受包含这些交易的区块。攻击者只可以尝试取改变它其中的一个交易,从而取回它最近花费的货币。

诚实链和攻击链可以看作是贝努力的随机游走模型。成功的事件就是诚实链得以增加一个区块,通过+1来增大领先优势;失败的事件就是攻击链得以增加一个区块,通过-1来减少相差的区块。

攻击链追上诚实链的可能性类似于赌徒输光问题。假设一个赌徒(信用有限)开始的时候有一定的负债,然后想通过无限的赌局来偿还赌债。我们可以计算它可以偿还赌债的概率,也就是相当于攻击链可以追上诚实链的概率。

我们设:
p = 诚实链找到下一个区块的概率
q = 攻击链找到下一个区块的概率
qz = 在落后z个区块的情况下,攻击者可以追上诚实链的概率

在这里插入图片描述

证明细节详见:
随机游走模型证明

考虑到我们的假设是p > q,随着z的增大,攻击者能追上的概率呈指数式下降。这又能怎么办呢?几率并不向着攻击者。如果攻击者不能足够幸运的话, 当他追赶有段距离后他的机会就会几近消失!

我们现在考虑,作为一个新交易的接收者,它需要等多久才能充分地确保发送方不可能改变交易。我们假设发送方是一个攻击者,它想让接收方相信它已经支付了一段时间了,然后咧过一段时间它就开始使坏了,它转头就把交易重新交易给自己的另一个账号。当这种坏事发生的时候,接受方将会有所警觉,但是发送方希望这个警觉尽可能地迟,这样就无法更改了嘿嘿嘿。

接收者应当乘胜一个新的密钥对,然后在签名前将公钥交给发送者(注意,一定不要给的太早!越晚给越安全!)。这可以防止发送方提前一大段时间然后准备了一大条区块链子来接到当前的链上,从而形成最长链,但这也要它足够幸运才可以找到这么长的链呵呵。但是,一旦它找到,它就可以在一瞬间接上若干个区块,使得非法的交易难以篡改了。自这个交易被广播起,攻击节点就开始秘密地再本来挖一条平行于诚实链的攻击链,这条链中包含了它的交易的另一个版本(获利版本)。

接收方一直等啊等,等到交易被包含在某个区块中,并且这个区块后面又有新的z个区块。然而,它并不知道攻击者在暗地里偷偷地挖了多长的攻击链,但可以假设的是,诚实的区块耗费的时间是期望时间,那么攻击者的成果将会是一个Poisson分布,其中均值(长度)为:

在这里插入图片描述

这个式子很容易理解,就是按照成功的比率等比到区块的长度而已

为了得到攻击者仍可以追上诚实链的概率,我们呢将泊松的密度(已做的努力)和从当前点到追上的概率(仍需要的努力)乘起来:

在这里插入图片描述
将其化为有穷项相加:

在这里插入图片描述
转换成C代码:

在这里插入图片描述
我们固定q(攻击者挖到下一区块的概率),来看看攻击成功的概率:

在这里插入图片描述
确实随着z的增大呈指数式下降

另一方面,我们控制攻击成功的概率 小于千分之一:

在这里插入图片描述
可以解出每一个q对应的一个安全z
我们目前用的是6个区块的确认时间,也就是默认q的值应该不会大于0.1很多

12.结论

我们提出了一个无需依赖于信任的电子交易系统。我们以基于电子签名的通用货币框架作为出发点,它可以提供拥有权的强控制,但是它无法提供抵御双花攻击的途径。为了解决这点,我们提出了一个基于工作量证明的p2p网络,以此来记录交易的公共历史从而使得攻击者在计算力上不可能实现篡改(前提是诚实节点占据大多数算力)。这个网络在其无结构的简单性下,显得很robust!各个节点只需小小的协调就是同时工作。他们不需要互相识别对方,因为所有信息并不是一定要传到某个特定的地方,它们只需要best-effort就好了。各个节点可以在自我意愿下离开或再加入网络,同时接受工作量证明的最长链作为他们离开时段的记录。他们用cpu算力进行投票,通过延长合法区块来表示认可,通过抛弃非法区块表示唾弃。在此共识机制下,各种需要的规则和激励都可以被增强。

个人总结:
居然翻译了我整个国庆假期,终于可以做ppt了。累死狗头.jpeg

猜你喜欢

转载自blog.csdn.net/weixin_40986490/article/details/120584850