比特币论文:一个点对点的电子现金系统

摘要


一个纯P2P的电子现金系统不需要经过金融机构,就能够让线上支付从一方直接发送到另一方。数字签名技术提供了部分解决方案,但是如果需要靠第三方机构来防止“双花“问题,那么这个方案的优势就荡然无存。我们提出使用P2P网络来解决“双花“的问题。通过计算交易的hash值,放到一条基于hash工作量证明的连续的链条中,网络就可以给交易盖时间戳,生成一条不可篡改的记录,除非重现计算工作量。最长链不仅证明所有事件的发生顺序,还证明了其来自于最大的CPU工作池。只要大多数的CPU算力被诚实的节点控制不去攻击网络,它们就会形成最长的链并且超过攻击者。网络本身需要最小结构。首先最基本的,消息需要广播出去;然后,节点可以随心所欲的离开加入,接受最长的链以证明离开期间发生了什么。

简介


当前电子商务基本上依靠金融机构作为信任的第三方来处理电子支付。尽管对于大多数交易来说该系统运行良好,但它依旧有着这种信任模型的内在缺陷。完全不可逆的交易基本不可能,因为金融机构无法避免协调争议。协调会增加交易成本,限制最小真实交易量,也不能降低偶然交易的可能性。并且由于不能给不可逆的服务做不可逆的交易,这样会带来更大损失。正是因为交易可能会逆转,信任就越发有必要。商家对客户有所担忧,会很麻烦的索要更多其实不必要的信息。这张情况下一定比例的欺诈被认为是不可避免的。在私人间使用现金的情况下,这种花费和支付的不确定性是可以避免的,但是在通信通道中要想不通过第三方实现支付,这种机制还不存在。 
我们所需要的是一个基于密码学证明的电子支付系统,允许双方直接交易,而不需要信任的第三方。交易在计算上不可逆可以防止卖家被骗,并且可以很简单地实现日常的契约机制来保护买家。在论文中,我们提出解决“双花”问题的方案,用分布式的P2P时间戳服务器产生按时序交易的可计算的证明。只要诚实节点比攻击节点控制了更多的CPU算力,那么系统就是安全的。

交易


我们将电子货币定义为一条数字签名的链。所有者将电子币传递给下家,是通过将上一交易和下家的公钥的hash值进行数字签名,并且将其加到电子币的结尾的方式来实现的。收款人验证签名来证实该链的所有者。

过程

问题是在这个过程中,收款人无法验证电子币有没有被多次消费。通常的做法就是引入可信任的中介或是铸币厂,检验每个交易是否“双花”。每一笔交易后电子币需要返还到铸币厂,产生新币,并且只有来自铸币厂的货币才能被认为是没有“双花”的。这张方案的问题在于真个货币系统依赖于运营这家铸币厂的公司,它就像银行一样,每笔交易都要经过它。 
我们需要有一种方法让付款人知道上家没有给更早的交易签名。为了达到目标,最早的那笔交易才是最重要的,所以我们并不关心后面交易的“双花”。确定一笔交易不存在的唯一方式是你知道所有的交易。在铸币厂的模型中,它知道所有的交易而且能够判断哪一笔最先到达。为了在没有可信第三方的条件下实现这一目标,交易必须广播出去,我们需要一个系统让参与者在一份单独的历史数据上达成共识,该历史数据是按交易时间先后顺序形成的。收款人必须证明,每次交易的时候大多数节点同意该交易是第一个到达的。

时间戳服务器


我们提过的解决方案要从一个时间戳服务器开始说起。时间戳服务器对由多份数据构成的块进行hash 盖时间戳,广播该hash值,比如通过报纸或者网络发帖。时间戳证明了数据在那个时间是存在的,很显然是按顺序hash的。每次盖戳都会在hash中包含先前的时间戳,形成一条链,使用另一个时间戳来增强之前的链。 
enter image description here

工作量证明


在P2P基础上实现分布式时间戳服务器,我们需要一个工作量证明系统,它类似于Adam Back的Hashcash,而不是使用报纸或网络发帖。工作量证明涉及到扫描一个值,当进行hash时(如使用SHA-256算法),hash值从多个0比特位开始。所需的平均工作量是0比特位的数量的指数并且可以执行一次hash来验证。 
在时间戳网络中,我们实现了工作量证明:在区块中增长一个随机数,直到发现一个值使得区块的hash值有所需的0比特位。一旦CPU计算能满足工作量证明,区块不可修改,除非除非重新进行工作证明。由于后面的区块会不断往后添加,修改该区块的工作就必须连同后面的区块一起修改。

enter image description here

工作量证明也解决了判断多数派的问题。如果多数派基于一IP一票,那么它就会被能够收集许多IP的人破坏。实际上,工作量证明是每CPU一票。最长链代表着多数派决策,它有最大的工作量。如果多数CPU算力被诚实节点控制,诚实的链增长最快并会超过其他竞争链。要修改一个旧区块,攻击者必须对该区块及之后的所有区块进行工作量证明,并且要能赶超诚实链的工作量。稍后我们会说明,随着后续区块的增加,落后的攻击者赶超的可能性是指数下降的。 
随着时间的推移,为了补偿不断增长的硬件速度和运行节点所带来的不断变化的利润,工作量证明的难度由一个可移动的平均值决定,它跟每小时生成的区块数平均均值相关。区块生成越快,难度越大。

网络


运行网络的步骤如下: 
1. 新的交易广播到所有节点 
2. 每个节点收集新的交易放到区块中 
3. 每个节点都致力于寻找该区块的一个有难度的工作证明 
4. 当有一个节点发现了一个工作量证明,它会向所有节点广播该区块 
5. 只有当区块中的所有交易是有效并且没有被消费,所有节点才会接受这个区块 
6. 节点使用收到的区块的hash值作为上一hash值,创建下一个节点,以表示它们接受了之前的区块

网络中的节点会认为最长链是正确的,并不断扩展这条链。如果两个节点同时广播了下一区块的两个不同版本,有些节点会受到不同的区块。这种情况下,节点计算第一个接收到的区块,但会保存另一个分支以防它变得更长。当找到下一个工作证明,节就会被打破并且一个分支变得更长。在另一个分支上计算的节点就会切换到长的那个分支。 
新的交易广播并不需要到达所有的节点。只要它们到达了多个节点,不久后他它们就会进入区块。区块广播也能忍受消息丢失。如果节点没收到区块,当它接收下一区块时会发现丢了一个,然后再去请求这个区块。

激励


根据规定,区块中的第一笔交易是特殊交易,它创造一个新的电子币,归区块的产生者所有。这样即激励了节点支持网络,同时也将新币发行到了网络循环中,也就无需中介机构来生产新币,解决了新币发行的问题。稳定新增一定量的电子币就像矿工消耗资源挖出金子加入到流通循环中。在我们的例子中,CPU时间电力就是消耗的资源。 
激励机制也可以通过交易费用来建立。如果交易的输出值小于输入值,不同之处在于交易费用放到了区块的激励价值中。一旦预设了一定量的新币加入循环,激励可以完全转换为交易费用并且完全可以自由膨胀。 
激励可以帮助节点保持诚实。如果一个贪婪的攻击者可以比诚实节点组装出更多CPU,他要么用来欺骗别人以偷回付款,要么用来生产更多新币。他就应该能发现按规则行事更有利可图,比起别人的电子币以及损坏系统和自己的财产,规则会让他得到更多的新币。

节省磁盘空间


一旦电子币的最新交易埋藏到足够的区块中,可以丢弃之前的交易节省此盘空间。要在不破坏区块hash下达到这个目标,交易被hash成Merkle 树,只有root包含在区块hash中。旧区块就可以压缩,剪去树的分支。内部的hash不需要保存。

enter image description here

一个没有交易信息的区块头部大小约80 bytes。假设区块每十分钟产生,相当于80 bytes * 6 * 24 * 365 = 4.2MB 每年。2008年计算机般2G 内存的,根据摩尔定律预测每年增长1.2GB,即使区块头部放到内存中也不是问题。

简化支付验证


验证支付并不需要运行所有的网络节点。用户只需要保存最长链的区块头部副本,他可以通过请求网络节点获取区块链直到他确信自己拥有了最长链,也可以获取到Merkle分枝,它将交易连接到盖了时间戳的区块中。用户自己本身没发验证交易,但是通过将交易连接到链的一个地方,他可以看到网络节点接受了交易,并且之后添加的区块更加可以证明这一点。

enter image description here

这样一来,只要诚实节点控制了网络验证就是可信,但也更易被攻击如果网络攻击者掌控。同时网络节点本身可以验证交易,只要攻击者能一直掌握网络,这种简化的方法阻止攻击者的伪造交易。一种方法的方式是当检测到无效区块时接受网络节点的警告,提示用户软件下载全部区块并且警告交易确认异常。接收频繁支付的业务可能还想运行自己的节点以得到更加独立的安全性和更快验证。

值的分割与合并


尽管有可能独立的处理电子币,但也不太可能在一次传输中为每一分来分割交易。为了使得值能分割和合并,交易包含了多个输入和输出。通常一个输入来自之前一个更大的交易或者由更小数值合并er的多个输入。输出最多有两个,一个支付,一个找零(如果有的话,返还给发送者)

这里写图片描述

当一个交易依赖多个交易而这些交易依赖了更多交易,必须注意扇出并不是问题。没有必要抽取出一个完全独立的历史交易副本。

隐私


传统的银行模型通过限制相关方和可信的第三方访问信息来达到隐私级别。需要公开广播所有交易就排除了这这种方法,但是在另一个地方打破信息流依旧可以保持隐私:保持公钥匿名。公众可以看到有人发送金额给别人,但是并没有人和交易有关的信息。这和股票交易的信息披露级别类似,个人的交易时间和交易额都知道,但是不知道交易方是谁。

这里写图片描述

作为附加的保护,每笔交易需要使用新的秘钥对避免关联到用户。多个输入的交易中,有些关联还是不可避免的,这样才知道哪些输入来自同一用户。这里的风险在于,如果秘钥所有者暴露了,关联也会暴露该所有者的其他交易。

算法


我们考虑这样的场景,攻击者想尽办法生成链比诚实节点块。即使做到了这样,并不意味着系统可以随意修改,比如说凭空产生币值,拿到不属于攻击者的金钱。节点不会接受无效的交易作为支付,诚实节点也不会接受包含这样的区块。攻击者只能修改自己的交易,取回最近花费的电子币。 
诚实节点与攻击节点的竞争可以表述为二项随机游走。成功的标志是诚实节点新增了一个区块,增值+1;失败的标志是攻击节点新增了一个区块差值-1。攻击者从一个负值赶超的概率与赌徒破产问题相似。假设一个不限制信贷的赌徒开始时是负资产,并且不限次数的尝试以达到收支平衡。我们可以计算出达到平衡点的概率,也就是攻击者赶超诚实节点的概率,如下: 
p= 
q= 
qz=z

这里写图片描述

假设p>q,随着攻击者要追赶的区块数增加,概率呈指数下降。随着几率下跌,他越落后,他的机会几乎为零。 
现在我们来考虑一下,一个新交易的接收者在明确发送者没有修改交易前腰等待多久。假设发送人就是攻击者,他想让接收者相信他付过款,一段时间后变为付款给自己。发生这样的事情时接收者会收到警告,但发送者的希望就为时已晚。 
签名之前,接收者生成新的秘钥对并将公钥传给发送者。这样可以防止发送者超前准备区块链,而不是让发送者一直计算直到有幸赶超然后进行交易。一旦交易发送出去,不诚实的发送者就开始私下在并行链上计算,链包含了该交易的另一版本。 
接收者等待直到交易加到了区块中,后面连接着z个区块。他不知道攻击者具体执行了几个过程,但可以假设诚实节点在每个区块上花费了一定时间,攻击者可能的处理是一固定值的柏松分布: 
这里写图片描述

为了得到攻击者赶超的概率,我们用赶超概率乘以每个过程的柏松密度: 
这里写图片描述

避免结尾的无限加法,将公式展开如下: 
这里写图片描述

转换为C++代码:

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行结果,可以发现概率随着z指数下降

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

p小于0.1%时的结果:

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结论


我们提出了一个不依赖信任方的电子交易系统。开篇我们论述了使用数字签名的电子货币的普遍框架,它有很强的控制力,但是没有解决“双花”问题的彻底的方法。为了解决这个问题,我们提出了P2P网络,使用工作量证明来记录公共的交易历史信息,当诚实节点控制了大多数CPU算力时,攻击者要想改变这个系统就变得很不切实际。在非结构化的简化下,网络很坚固。网络同时工作,无需协调。节点无需被识别,因为消息不会路由到任何一定的地方并且只需要基本的传送。节点可以随意离开或加入节点,接受有工作量的链来证明在离开时发生了什么。使用CPU算力来投票,通过扩展区块来表明接受有效的区块,拒绝计算以表明不接受无效区块。任何的规则和激励可以加入其中以形成共识机制。

引用


[1] W. Dai, “b-money,” http://www.weidai.com/bmoney.txt, 1998. 
[2] H. Massias, X.S. Avila, and J.-J. Quisquater, “Design of a secure timestamping service with minimal 
trust requirements,” In 20th Symposium 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, vol 3, no 
2, pages 99-111, 1991. 
[4] D. Bayer, S. Haber, W.S. Stornetta, “Improving the efficiency and reliability of digital time-stamping,” 
In Sequences II: Methods in Communication, Security and Computer Science, pages 329-334, 1993. 
[5] S. Haber, W.S. Stornetta, “Secure names for bit-strings,” In Proceedings of the 4th ACM Conference 
on Computer and Communications Security, pages 28-35, April 1997. 
[6] A. Back, “Hashcash - a denial of service counter-measure,” 
http://www.hashcash.org/papers/hashcash.pdf, 2002. 
[7] R.C. Merkle, “Protocols for public key cryptosystems,” In Proc. 1980 Symposium on Security and 
Privacy, IEEE Computer Society, pages 122-133, April 1980. 
[8] W. Feller, “An introduction to probability theory and its applications,” 1957.

猜你喜欢

转载自blog.csdn.net/yilovexing/article/details/80942721