Bitcoin: A Peer-to-Peer Electronic Cash System-翻译

Bitcoin:一个P2P电子收银系统

 

一个纯粹的电子收银系统是可以不通过银行机构来进行端到端直接交易的。数字签名可以解决大部分问题,但是假如第三方机构无法避免双重支付(译者注:买方在支付之后还没等卖方确认,拿这笔钱再支付别的交易)的话,这其实是没有优势的。我们设计了一种可以解决双重支付问题的P2P网络,这个网络通过具备工作量证明(POW)哈希的执行链条来给交易打标签,这个记录除非重新投入巨大的工作量(POW),否则是无法被改变的。最长链条不仅作为交易先后顺序的见证,而且是CPU计算量的一个证明。只要保证主要的CPU计算不是攻击者发起的,那么他们可以产生最长的链条并使攻击者无法逾越。该网络本身实现一个最小结构,消息可以被有效广播,计算节点可以随进随出,也可以获取到这些节点不在的时候产生的最长工作量链。

 

1、Introduction 概述

电子商务目前强烈依赖银行机构来进行电子支付。这个系统对大多数交易是没问题的,但是在信任问题上仍然欠缺。因为银行机构无法避免一些争执,支付回退是在所难免的。解决争执增加了交易的成本,因此需要限制实际的交易规模并且阻止小额交易的产生。不可逆交易和不可逆服务是以失去这些能力为代价的。如果要实现回退,我们需要信用的传递。商户不再需要堤防他们的客户,也不需要骚扰客户来获取他们想要的信息。当然这无法避免有骗子存在可能性。人与人之间的现金交易可以避免这个问题,但是网络交易却没有一个信用机制来保证。

我们需要一个具备加密能力的电子支付系统来实现这个信任机制,允许任意两个交易参与者不通过第三方信用机构直接进行交易。通过回滚一些不合法交易来保护卖方,通过常规的第三方托管来保护买方。本文实现了一种基于分布式P2P时间戳服务器的工作量证明来保证交易先后顺序的方案,用来解决重复交易的问题。只要诚实的节点比攻击节点具有更多的CPU工作量,那么这个系统就是安全的。

2、Transcations 交易

我们定义了一种像数字签名链条的电子货币,每一个交易者通过货币底部的数字签名将货币转移给下一个,这个签名包含了前一个交易的哈希以及下一个用户的公钥。收款方可以通过验签来确认当前链的所有者。

问题显然是收款方无法验证有没有存在货币被重复使用的情况。普遍的做法是引入一个授权中心或者铸币局,为每一笔交易检查双重支付的问题。每一笔交易之后,货币必须回收到铸币机构产生一个新的货币,只有来自铸币机构的货币才被信任,以此来避免重复支付。这个方案的最大问题是,整个货币系统依赖铸币机构,每一笔交易都通过他,反而更像银行。

我们需要提供一种办法,让收款方知道前一个支付者没有对更之前的交易加过签名。因此,我们认为越早的交易越重要,而后来的重复交易被忽略。确认交易是否缺失的唯一办法是知道所有交易。在基于铸币机构的模型中,铸币机构知道所有的交易,并能决定哪个是最先发起的。为了不通过信任机构来完成这个过程,交易必须是所有人可知的,并且需要提供一个参与者收到并且认可的单一有序的历史记录。收款人需要证明每一笔交易的时间点,被大部分节点认可为最新收到的。

3、Timestamp Server 时间戳服务器

方案先从时间戳服务器开始,时间戳服务器为一些被打时间戳的单元块做哈希,并将这个哈希像报纸一样传播出去。时间戳证明了数据在当前时间点出现过,每一个时间戳中也包含了前一个来自链条节点时间戳的哈希,如此往复。


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

为了基于P2P实现一个分布式的时间戳服务器,我们需要一个跟Adam Back's Hashcash类似的工作量证明系统。工作量证明需要对数据进行哈希扫描,比如采用SHA-256,哈希值以0开头。工作量取决于0的个数,并可以通过单次哈希来进行验证。

对于我们的时间戳网络,我们通过在块里面增加一个递增的nonce,不断进行哈希,直到发现一个哈希值0的个数跟要求的相同。一旦cpu计算满足了工作量的证明,那么这个块就不能没改变了,除非重做。后来的块在此块之后建链,要想更改当前块,必须将后面的所有块都重新计算。


工作量证明也解决了少数服从多数的判定问题。如果投票基於单ip单票制,很容易被人申请很多ip破解。工作量证明本质上依靠单CPU单票制。多数人投票的最长链,投入了最大的工作量。如果大多数CPU工作量被诚实的节点控制,诚实的链条会增长很快,从而超过其他的链。为了修改过去的块,攻击者必须重做当前块以及之后的所有块,并赶上并超过诚实节点的工作。后面我们会展示一种当子块添加时,慢的攻击者赶超的可能性以指数级方式减少。

随着时间的推移,为了弥补硬件的发展和执行节点的增加带来的计算速度,工作量证明难度取决于每个小时产生的区块的平均个数。如果产生太快,则增加其难度。

5、NetWork 网络

按照如下的步骤运行:

1) 新的交易被广播到所有节点。

2) 每个节点收集新的交易到块中。

3) 每个节点为当前块发现一个工作量证明。

4) 当一个节点发现一个工作量证明,则将这个工作量证明广播到所有节点。

5) 如果一个块包含的所有交易都是正常的,并且还没有出现过,则其他节点接受这个块。

6) 所有节点通过在下一个块中使用当前块的哈希值来表示对当前块的认可。

节点通常将最长的链作为正确的一个,并在此基础上进行扩展。如果两个节点同时广播了不通版本的下一个块,有些节点先收到其中的一个或另一个,在这种情况下,节点按最先收到的一个进行工作,同时保存另外一个以备其可能变成更长链。在更下一个节点通过工作量证明产生后,分叉就会被修正,在错误分支上的节点会选择更长的一个。

新的交易无需广播给所有节点,只要他们到达了足够多的节点,他们不久之后就会被加入到块中。块的广播也是容忍消息丢失的。如果一个节点没有收到块,他会在接收到下一个的时候发现丢失的那个,并发起请求。

6、Incentive 激励机制

按照惯例,块中的第一笔交易是一个特别的交易,块的创建者开始拥有新的货币。这增加了节点们对网络支撑的动力,同时由于没有一个中心授权机构来生成货币,这也提供了一种方式生成货币参与到循环中去。这种稳定并持续不断产生新的货币的方式很像旷工花费资源挖掘黄金的过程。在我们的例子中,CPU时间和电费作为一种花费。

激励也可以以手续费的方式实现,如果交易的输出值少于输入值,差值作为交易的费用来激励记录当前块的节点。一旦既定数量的货币参与到循环中区,激励完全变成交易奋勇,并且没有通货膨胀。

激励机制也鼓励了节点保持诚实,如果一个贪婪的攻击者拥有比所有诚实者更多的CPU,他必须在从被骗者那里偷回他的付款和产生新的货币之间做权衡。他会发现按照规则行事更有利可图,这些规则提供给他比通过其他方式,比如破坏系统和财富合法性等获得更多的货币。

7、Reclaiming Disk Space 回收磁盘空间

一旦最新的交易中,一个货币被散列在足够多的块中,在他之前花费的交易可以丢弃以节省磁盘空间。为了不破坏块的哈希值,交易被哈希到Merkle Tree上,只有根节点包含在块哈希中。之前的块可以通过树枝的简化来进行压缩。内部的哈希值不需要被保存。


不包含交易的块头部大概80字节,我们假设每十分钟产生一个,一年则为80 bytes * 6 * 24 * 365 = 4.2MB,按照2008年一般计算机系统有2G内存的情况,以及摩尔定律按照1.2G/年的增长速度,即使块的头部必须保存在内存中,存储都不是问题。

8、Simplified Payment Verification 简化支付确认过程

不需要所有节点工作也可以确认支付。用户只需要保存最长工作量链上块的头部副本,这个确定的副本可以通过节点拿到,并且可以获得将该交易关联到块上的Merkle分支。他不能自己检查自己的交易,而是通过连接到链上的某个位置,他可以看到网络节点已经接受这笔交易,并且在块添加之后,再次确认网络已经接受这笔交易。


如此,只要诚实的节点控制网络,支付确认就是可信的,如果被攻击者控制网络,那就变得脆弱了。由于网络节点可以自己确认交易,如果攻击者能够持续的控制网络,他可以简单地捏造交易来进行欺骗。一个防御办法是,当网络节点发现不合法的块,便接受来自网络节点的告警,并让用户的软件下载全部的块并提醒交易的不一致。经常收到付款的机构可能更希望使用它们自己的节点来提升安全性和加快确认过程。

9、Combining and Splitting Value 合并和拆分数据

尽管可以单独处理货币,在交易中分别转移每一分钱显得有些笨拙。为了能够进行合并和拆分,交易是复合输入和输出的。一般情况下,会出现一个来自之前的大额交易的单个输入或者多个小金额合并成的输入,并且有两个输出:一个是支付,一个是找零,零钱回退给发送者。


扇出在此处不是问题,他依靠一系列的交易,这些交易可能依赖更多的交易。不需要提取一个完整的关于交易历史的副本。

10、 Privacy 隐私

传统的银行模型通过限制相关方和授信第三方的访问来达到一定水平的隐私。公开的交易是无法采用这种方式的,但是隐私仍然可以通过匿名公钥的方式将隐私信息存放在另外的地方。公众可以看到有人发送了一定金额给另外的人,但是没有将该交易关联到具体的人身上。这类似于股票交易的信息等级发布,个人交易的时间和交易量被公开,却不告知参与者到底是谁。

另外一道防火墙,为防止交易被关联到交易者身上,每一笔交易采用新的公私钥对加密,有些关联仍然是不可避免的,比如多输入的交易,需要识别出哪些是来自同一个交易者。最大的风险在于,一旦获得了一个交易者的密钥,通过链接可以查看当前交易者的其他交易。

11、Calculations 计算

我们假设攻击者试图以比诚实节点更快的速度产生分支链。即使这个目的达到了,也不会致使系统混乱,比如凭空创建数值或者盗取不输入攻击者的钱财。节点不会持续接受一个非法的交易,并且诚实的节点不会接受这个包含非法交易的块。攻击者只可以改变他自己的交易,以拿回自己刚刚支付的金钱。

诚实链与攻击链的赛跑可以形象为二叉树随机漫步(Binomial Random Walk),成功的事件是诚实节点扩展当前块,+1;失败的事件是攻击节点扩展当前块,-1。

攻击者弥补亏空的可能性类似于赌徒破产理论(Gambler's Ruin)。假设一个可以无限贷款的赌徒开始就存在亏空,并且可以发起无数次赌博来达到收支平衡,我们可以计算出他达到收支平衡的概率,或者说是攻击节点追上诚实节点的概率如下:

p:诚实节点发现下一个节点的概率

q:攻击者节点发现下一个节点的概率

qz:攻击者总是赶上第Z块的概率

假设p>q,随着块数的增加,攻击者追上的可能性在指数降低。如果他没有很幸运的赶早,他赶超的机会将越来越渺茫。

现在我们考虑下接受一笔新的交易后需要等待多长时间,才能确定发送者不能再改变交易。我们假设发送者是一个攻击者,想让接受者相信他已经支付了,在一段时间后又将交易反向支付给自己。此时接受者希望得到警告而发送者希望他为时已晚。

接受者产生了新的公私钥对,并将公钥在签名之前发给发送者。这防止了发送者提前准备区块并跑在前面的可能。一旦交易被发送,攻击者就开始秘密的在包含他的交易的分叉链上开始工作。

交易被增加到区块上,并且此区块链之后已有Z块区块的时候,接受者不知道发送者的确切进度,假设诚实的区块每块花费平均的期望时间,按照泊松分布(Poisson distribution)发送者可能的进度期望值为:


为了获得攻击者现在追赶上来的可能性,我们把每一次攻击者能够追赶上来的可能性乘以泊松密度函数(Poisson density):


调整公式避免累加分布的无穷大尾部。。。


转换成代码:

通过传入不同的参数z和q运行,我们可以看到可能性下降的指数:


12、        Conclusion 总结

我们已经设计了一个不依赖信用的电子交易系统。我们以普通的电子签名货币开始,这种货币具有很强的所有权控制,但是没法解决双重支付的问题。为了解决这个问题,我们设计了一个P2P网络,通过工作量证明来记录交易历史,并且能通过诚实节点控制大部分CPU计算的方式使攻击者很快变为无效计算。网络的非结构化简单,节点之间需要很少的协调工作。因为消息不会被路由到任何特定的地方,只需要投递到最好的计算力节点,因此不需要被确认。节点可以按照意愿随意的离开和加入到网络中去,获得他们不在的时候产生的工作量证明链。他们按照CPU工作量进行选举,通过扩展来表明接受区块,通过拒绝扩展来表明不合适的区块。一些必备的规则和激励可以加固这种一致性机制。

 

References

[1] W. Dai, "b-money,"http://www.weidai.com/bmoney.txt, 1998.

[2] H. Massias, X.S. Avila, andJ.-J. Quisquater, "Design of a secure timestamping service with minimal

trust requirements," In 20thSymposium on Information Theory in the Benelux, May 1999.

[3] S. Haber, W.S. Stornetta,"How to time-stamp a digital document," In Journal of Cryptology, vol3, no

2, pages 99-111, 1991.

[4] D. Bayer, S. Haber, W.S.Stornetta, "Improving the efficiency and reliability of digitaltime-stamping,"

In Sequences II: Methods inCommunication, Security and Computer Science, pages 329-334, 1993.

[5] S. Haber, W.S. Stornetta,"Secure names for bit-strings," In Proceedings of the 4th ACMConference

on Computer and CommunicationsSecurity, pages 28-35, April 1997.

[6] A. Back, "Hashcash - adenial of service counter-measure,"

http://www.hashcash.org/papers/hashcash.pdf,2002.

[7] R.C. Merkle, "Protocols forpublic key cryptosystems," In Proc. 1980 Symposium on Security and

Privacy, IEEE Computer Society,pages 122-133, April 1980.

[8] W. Feller, "An introduction toprobability theory and its applications," 1957.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章