比特币:一个点对点的电子现金系统
比特币:一个点对点的电子现金系统
摘要
一个纯粹p2p的电子现金交易系统能给使得在线支付能够直接由一方发起并支付给另外一方,不需要通过任何的中间的金融机构。虽然数字签名
(Digital signatures)提供了部分的解决方案,但是,如果需要第三方支持才能防止双重支付
(double-spending)的话,那么这种电子现金也就失去了其价值基础。本文提出了使用p2p网络来解决双重支付
(double-spending)的解决方案,p2p网络对全部交易加上时间戳
(timestamps),并将其hash到hash-based的工作量证明
(proof-of-work)的链条中,生成对应的交易记录(record)。值得注意的是,除非重新完成全部的工作量证明,否则形成的交易记录将不可更改。
最长的链条(或者说最近的区块)不仅仅可以作为从开始到现在所有事件的见证者,而且还被看做是来自CPU计算资源最强大的pool(CPU资源池)中。这个系统基本上是稳定的,唯一可能造成这个系统崩溃的原因:就是有一个人/组织拥有超过整个系统51%的计算能力,那么他就能随意更改每笔交易记录,这就是所谓的“51%攻击”,但这几乎是无法实现的。
另外,p2p网络本身需要内容不多,要求信息尽可能在全网传播,节点(nodes)可以随时离开和重新加入网络,只要其回到网络中的时候,将离开网络这段时间的区块接收并同步即可。
摘要指出: 通过数字签名的方式保证交易的传递,但是数字签名是无法解决双重支付的,因为数字签名只能保证这个东西是属于发送方的, 但是没有办法保证这个东西发送给一个人以后不会再发给其他人.因为数据是可以复制的. 故为了解决双重支付的问题,可以引进第三方作为中介, 但是比特币为了去除第三方,使用的p2p网络来解决双重支付的问题.
指出区块链的几个关键点: 时间戳, hash作为标识, 使用hash的工作量证明, 链在一起,提供发生事件的顺序表明区块是记录历史的. 链来自最大CPU算力是说明其在CPU算力证明的规则下是唯一的, 不可被颠覆的.
1. 介绍
互联网上,几乎所有的交易都需要借助金融机构作为可信赖的第三方来处理。虽然这类系统在绝大多数情况下都运作良好,但是这类系统具有先天不足——受制于“基于信用的模式”(trust based model)。在这种情况下,想要实现不可逆的交易是不现实的
,因为金融机构总是不可避免涉及到纠纷调解处理。此外,由于金融中介等第三方的存在,交易的成本也增加了,并且限制了实际可行的最小交易规模和日常的小额支付交易。另外,由于很多商品和服务本身是无法退货的,如果缺乏不可逆的支付手段,互联网的贸易就大大受限。因为交易中有退款的可能,就需要交易双方的互相信任就非常重要了。
因此商家为了提防自己的客户的潜在索赔可能性,经常会向客户提供完全不必要的信息而非关键信息。而实际的商业行为中,带有欺诈目的的客户是不可避免的。在使用现金(physical currency)的情况下,这些销售费用和支付问题上的不确定性却是可以避免的,因为此时没有第三方信用中介的存在。但是目前没有一种用于保证交易在没有可信机构保障下顺利进行的机制( but no mechanism exists to make payments over a communications channel without a trusted party.)。
因此,我们需要一个电子支付系统(基于密码验证/密码学原理而非信用),使得任何达成一致的双方,能够直接进行支付,从而不需要第三方中介的参与
。杜绝回滚(reverse)支付交易的可能
,这就可以保护特定的卖家免于欺诈;而常规托管机制(routine escrow mechanisms)也有效的保证了买家的权益。在本论文中,我们将提出一种通过点对点分布式的时间戳服务器来生成依照时间前后排列并加以记录的电子交易证明,从而解决双重支付问题。
只要诚实节点(honest nodes)所控制的算力的总和大于有合作关系的(cooperating)攻击者的计算能力的总和,那么该系统就是安全的。
指出了存在第三方中介的系统的"天然缺陷", 指出区块链是不需要第三方机构并且解决信任问题.
最后说明, 区块链解决双重支付, 基础的拓扑结构是p2p, 时间戳是确认交易顺序的方式.
2. 交易
我们定义一枚电子币(electronic coin)作为一个数字签名链(as a chain of digital signatures)。每一个拥有者(owner)交易货币(coin)给下一个人通过数字签署(私钥签署) 上一个交易和下一个人的公钥 的hash 并且把这个签署的结果附加在了这个货币的末尾。一个收款人可以验证这个签名来确保这个链的所有权(chain of ownership)
把一个比特币给下一个人是通过数字签名的方式,也就是说通过公私钥的方式证明coin的来源与去处。假设现在A要给B一个比特币,那么这个过程称为一个交易(transaction)(比如下图中的中间那个Tx),这个交易记录给B多少比特币,和B的公钥(指明目的地),同时提供A可以操作的上一个交易(如图中的第一个Tx。比如这个Tx记录的是X给了A一笔钱,那么相当于A可以操作X给A的这个交易的输出),对这两个共同hash后,付款者A用自己的私钥签署这个hash,然后加在交易的上面。之后这个交易被广泛地广播道其他地方。此时作为一个旁观者(矿工),是在自己本地具有第一个交易之前的所有交易的,所以看到这个交易(中间这个Tx)的时候,就可以用付款者A的公钥(指代的是图中第一个交易,A的公钥从第一个交易中获得)去验证这个交易(中间这个交易)的签名以证实这个交易是不是由付款者A本人发出的(因为私钥只有A持有,只有用A的私钥进行签署的签名才能和上一个交易(第一个交易)进行验证通过,证明A可以操作第一个交易,具备这笔从X转到A的钱)。这样就证明了这个交易是由付款人A发起的。
我们来以中间那个Tx(交易)作为参照物。这个Tx是由Owner 1发起的,由图中可以看出,hash的input是上一个Tx(prev Tx)和下一个接收者的公钥(next owner’s pub key),这hash的结果被Owner 1的私钥进行签署,并附加在了当前的这个交易上。目前不要和下一个Tx连起来看,当Owner1签署完这个Tx后,Ta把这个交易广播出去,则一旦有矿工(miner)将这个交易打包进入区块并链在诚实链(最长的链)上,则表示这个Tx是成立的。所以可以看出此时Owner2是不会像正常交易那样立即知道有没有成功的,而是需要过段时间去"查看"(这里是很朴素的说法,也可表示有个东西去轮询,只要交易被打包了就通知Owner2)这笔交易有没有被打包,是的话就代表交易成功了。
该过程的问题在于:收款人难以检验的是:之前的某位所有者有没有对这枚电子货币进行了双重支付
。通常的解决方案,就是引入信得过的第三方权威,或者类似于造币厂(mint)的机构,来对每一笔交易进行检验,以防止双重支付。在每一笔交易结束后,这枚电子货币就要被造币厂回收,而造币厂将发行一枚新的电子货币;而只有造币厂直接发行的电子货币,才算作有效,这样就能够防止双重支付。可是该解决方案的问题在于,整个货币系统的命运完全依赖于运作造币厂的公司,因为每一笔交易都要经过该造币厂的确认,而该造币厂就好比是一家银行。
我们需要给收款人(payee)一个方法去知道之前的拥有者们(owners)没有签署过更早的交易。对于这个目的,最早(earliest)的交易才是重要的
,所以我们不必关心后面的交易是否尝试去双重支付。唯一的确保一个交易存在性的方法就是拥有查询所有的交易
。在基于铸币厂模型中,这个铸币厂拥有所有的交易并且决定哪一个交易最新到达(which arrived first)。为了在没有一个可信任方的情况下完成这件事情,交易必须被公共公告,并且我们需要一个系统让所有参与者对只对在一个单链顺序历史(which they were received)上达成共识。收款人需要证明在每一次交易的期间,大多数节点都同意这是他们第一次收到的(was the firstreceived)。
“最早的交易才是重要的”这句话是说,双重支付发生的基础是,首先要已经发生过一个交易,然后付款人想无视这笔交易,再次使用这个交易已经用过的货币发起另一次交易。所以这个最早的交易指代的是“已经发生过的交易”。
铸币厂并不关心想要发起双重支付的人的两笔(或以上)的交易哪笔是这个付款方认为先发生的,他只关心此刻这个付款方发起的这个交易是否“合法”(也就是之前这个人有没有已经用过这笔钱了)。所以是铸币厂确认哪个交易在前,而不是由付款人决定哪个在前的。那么此时的这个铸币厂并不归属任何一个第三方,那么这个交易就必须被“广而告之”,让所有参与进来的人都知道这件事情发生了,并且所有人都知道以前发生的所有“历史事件”来验证此时被广播的这个交易是否是合法的。但是我们知道,要让所有参与的人都保持一致是一件相当相当困难的事情,这也就是区块链所解决的问题。而最后一句话就是说收款人需要大多数人(超过51%)都认为那个交易是合法的了,那么才能说明这个交易是合法的。
3. 时间戳服务器
我们建议的解决方案从时间戳服务器开始。一个时间戳服务器的工作是通过把一组数据(items)形成的区块(blocks)的hash结果(taking a hash)加盖上时间戳(to be timestamped)并广泛的广播(publishing)这个hash,就像在报纸或者世界性新闻组网络(Usenet)的发帖一样[2-5]。这个时间戳证明在那个时间这个数据一定是存在的,明显的,要得到这个hash(就只能在这个时间)(inorder to get into the hash)。每一个时间戳包含了上一个时间戳在它的hash中(includes the previous timestamp in itshash),形成了一个链条,随着每个新增的时间戳都加强(reinforcing)了这个新增之前的所有时间戳。
4. 工作量证明
为了实现基于p2p的分布式时间戳服务器,我们需要使用Proof-of-Work系统(跟Adam Back’s 的Hashcash很像)。 在进行随机散列运算时,工作量证明机制引入了对特定值的扫描工作,比方说SHA-256下,随机散列值开头为一个或多个0bit。那么随着0的数目的上升, 找到这个解所需要的工作量将呈指数增长(exponential),而对结果进行检验则仅需要一次随机散列运算。
POW,假设C,D,E三个矿工都收到交易消息了,然后因为他们收到的交易消息不完全一致,收到的时间也不完全一致,那么产生的区块的hash肯定天差万别,有p2p经验的人都知道此时就需要保证C,D,E三个人最后需要达成共识,这样才能保证整个网络都认同同一个区块链所发生的“历史事件的顺序”,否则整个体系将会毫无用处。而中本聪在这里的方式就是引入了POW来让C,D,E三个人用付出”CPU算力“的途径去以概率性成功的方法去抢夺记录区块的权利(也就是俗称的”记账权“)。
对于我们的时间戳网络,我们通过对每个Block加入Nonce(随机数)来实现proof-of-work的机制。直到使得这个Block的散列值出现了需要的0bits的情况,才说明这个Block的Nonce被找到。我们通过反复尝试来找到这个随机数(Nonce),直到找到为止,这样我们就构建了工作量证明机制。一旦CPU计算资源开销能够满足该工作量证明机制,那么除非重新完成相当的工作量,该区块的信息就不可更改。由于之后的区块是链接在该区块之后的,所以想要更改该区块中的信息,就需要重新完成(redoing)该区块之后所有区块信息。
POW的实现机制, 寻找满足条件的nonce
工作量证明同时解决了多数决策中决定代表的问题。如果大多数人只根据一人一ip进行投票(one-IP-one_vote),这样会被任何能够分配很多ip的人破坏。工作量证明本质上是一CPU一票
(one-CPU-one-vote)。主要的(大多数)的决定是由最长的链所代表,最长链拥有最大的工作量花费在其中。如果一个大多数CPU算力都被诚实节点所控制,那么最诚实的链就会增长的最快且超过其他任何计算链。想要改变一个过去的区块,攻击者需要重做这个区块和所有在这个块后的区块的工作量证明,之后还要追赶上并超过现在所有诚实节点的工作。我们之后会展示,一个慢速的攻击者能够追赶上(catching up)的可能性将会指数级的减少,但后续的块被添加时。
为了补偿不断增长的硬件速度和随着时间推移不断变化兴趣的运行节点(vrayinginterest),工作量的困难度是由一个移动的平均目标决定,就是每一个小时的平均区块(就是这个平均目标)。如果这些计算力增长的太快,这个困难度就会增加。
5. 网络
网络运行的步骤如下:
- (1) 新的交易向全网进行广播;
- (2) 每一个节点都将收到的交易信息纳入一个区块中;
- (3) 每个节点都尝试在自己的区块中找到一个具有足够难度的工作量证明;
- (4) 当一个节点找到了一个工作量证明,它就向全网进行广播;
- (5) 当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性;
- (6) 其他节点表示他们接受该区块是通过在跟随该区块的末尾,制造新的区块以延长该链条,而将被接受区块的随机散列值视为previous的随机散列值。
节点总是认为最长的链是唯一正确的,并且保持区块链的延伸。如果有两个节点同时广播不同版本的新区块,那么其他节点在接收到该区块的时间上将存在先后差别。当此情形,他们将在率先收到的区块基础上进行工作,但也会保留另外一个链条,以防后者变成最长的链条。僵局(tie)的打破要等到下一个工作量证明被发现,而其中的一条链条被证实为是较长的一条,那么在另一条分支链条上工作的节点将转换阵营,开始在较长的链条上工作。
这段实际暗含了bitcoin的”最大规则“,也就是所有人都默认最长链是正确的。如果这条不能保证,那么可想而知整个系统是不能工作的。而这个最长链是正确的是由后文的”激励机制“所保证的,所以这里就出现了一个博弈场景:如果现在要创建一个区块链应用,那么要么要所有人能够公认一个规则(强制力),那么要用某些方法使人们能够自主的认同一个规则(激励),但是总之因为争夺区块是要产生代价的,如何在对这个代价进行”强制力/激励“进行博弈,就是一个区块链是否能健康成长的关键。
后半部说明
一个区块真正能够被承认的关键
:有矿工(大部分)以这个区块为prev区块,并为它构成的hash纳入新的一个区块并为新的区块工作,那么这个区块才是被承认的。所以这里指明,只有产生的下一个区块,当前的这个区块才是”合法的“。这条相当关键,因为所有的攻击都会指向这个问题,同时收款者与付款者的不平衡点也是这里所导致。同时这里也是区块链运用博弈论的精华体现。后半部说明一种特殊情况,就是说因为分布式网络的特点,信息沟通不是实时性的,所以会出现一些节点认可一个区块而另一些节点认可另一个区块而造成了区块链的
分叉问题
,但是这里解释了因为所有节点都认为只以最长的链为唯一链,所以这种情况会在多链几个区块后被打破,发生区块重组。
所谓“新的交易要广播”,实际上不需要抵达全部的节点。只要交易信息能够抵达足够多的节点,那么他们将很快被整合进一个区块中。而区块的广播对被丢弃的信息是具有容错能力的。如果一个节点没有收到某特定区块,那么该节点将会在后续接收到区块的情况下,发现自己缺失了后续区块之前的某个区块。
6. 激励机制
按照惯例(进行约定),一个块中的第一个交易
是一个特殊交易,它由这个块的创造者拥有一个新货币起始。
这样提供了一种激励机制让节点们能够支撑这个网络,并且提供了一个方式来初始化的分发货币进入整个系统当中。因为没有一个中央授权机构来发布他们(货币)。稳定增加一定数量的新货币类似于黄金矿工花费资源开采黄金并引入循环系统当中。在我们的情境下,CPU时间和电力就是被花费的。
这段终于说明前面一直回避的一个问题:
货币从哪来
?在bitcoin的系统中,中本聪已经规定了总量就是2100W个bitcoin。而这些bitcoin的产生是每产生21000个区块就减半(以现在约定大约每10分钟产生一个区块的速度大约到2140年产生为0)。而bitcoin产生的方法就是给抢到记账权的人凭空给予一定量的货币
,这样就同时解决的货币发行和矿工记账的奖励
(就像现实中挖黄金的黄金矿工一样)。这这种凭空奖励的方法,就是每个区块的第一交易,是一个特殊的交易,这个交易就是只有Input,且对于输入这个input的output(前一个交易的output)是个空(后文会提到)。因为在第2章的注解中已经说到,coin是不存在的,coin是由tx推断出来的。就像A给B 100块钱,在记录这个信息的时候可以记录A的“账户-100,B的账户+100”这个事物,也可以记录”A给了B 100块钱“这一条交易信息。区块链选择了后者。而这个凭空出现的钱,就是一条特殊的交易信息,
这种激励机制同样可以以交易手续费
的方式奖励。如果一个交易的输出值小于其输入值,那么这个差值就是交易的手续费,手续费被附加到包含这个交易的区块的奖励中。一旦一个已决定数目的货币(所有货币)进入这个循环中,这个激励机制就可完全的转变为交易手续费并且本系统可以完全避免通货膨胀(货币总数一定,没有发行货币)。
手续费作为挖矿奖励之外的第二种激励手段.
激励机制可能会帮助鼓励节点们保持诚实。如果一个贪婪的攻击者能够收集到比起所有诚实节点更多的CPU算力,他就面临一个选择:要么用这个算力来用于二次支付来欺骗别人,或者使用算力来生成更多的货币。他应该会发现跟着规则来能获得更多的利益,这样的规则支撑他比起其他加入进来的人能够拥有更多的货币,而不是破坏这个系统使得自己的财富受损。
7. 回收磁盘空间
一旦一个货币最新的交易收入(buried)进入足够的区块中,那么在这个交易前面被消费过的交易就能够被抛弃来节省硬盘资源。为了同时确保不损害区块的hash,交易被hash为一棵Merkle Tree7[5],这个Merkel Tree只有root节点被包含进了这个区块的hash。老的区块能够被压缩通过将这个树的分支进行拔除(stubbing off branches of thetree)。而内部的hash是不必被保存的。
一个剔除交易的区块头大概会是80byte大小。如果我们假设区块每10分钟就生成一个,那么80bytes * 6 * 25 * 365 = 4.2MB 每年。2008 年PC系统通常的内存容量为2GB,按照摩尔定理预言的每年增长1.2GB的大小,即使将全部的区块头存储在内存之中都不是问题。
8. 简化支付认证
在不运行完整网络节点的情况下,也能够对支付进行检验。一个用户需要保留最长的工作量证明链条的区块头的拷贝,它可以不断向网络发起询问,直到它确信自己拥有最长的链条,并能够通过merkle的分支通向它被加上时间戳并纳入区块的那次交易。节点想要自行检验该交易的有效性原本是不可能的,但通过追溯到链条的某个位置,它就能看到某个节点曾经接受过它,并且于其后追加的区块也进一步证明全网曾经接受了它。
这样的情景下,如要诚实节点控制了网络,那么这个验证就是可靠的,但是当一个算力占优的攻击者控制网络的时候就变得更容易受攻击了。因为网络中的节点能够自己进行验证的时候,这个简化的方法能够被攻击者伪造的(fabricated)的交易欺骗,当这个攻击者能够持续保证超过全网的算力的时候。一种保护的策略是接受网络节点们的警告,当这些网络节点监测到一个非法的区块,提醒用户软件去下载这个有问题的全部区块,并警告交易去检查确认一致性。频繁收到支付信息的商业机构可能会仍然运行他们的全节点以保持更加独立的安全性和更快的验证。
9. 价值的组合与切分
尽管,我们可以对电子货币的交易进行单独的处理。但实际上,在转让过程中为每一分钱进行单独的交易是很不方便的(比如交易1.2个BTC,我们不能按0.00001BTC为粒度进行交易,这样太耗费Hash散列资源)。为了允许值得合并和拆分,交易可以包含多个输入和输出。
一般而言是某次价值较大的前次交易构成的单一输入,或者由某几个价值较小的前次交易共同构成的并行输入,但是输出最多只有两个:一个用于支付,另一个用于找零(如有,则返回给输入者(sender))。
这里,需要注意的是扇出性(fan-out),即当一笔交易依赖于之前的多笔交易时,而这些交易又各自依赖于多笔交易。但此处这并不构成一个问题,这是因为此工作机制并不需要对之前发生的所有交易历史进行重新检验。
10. 隐私
传统的银行模型实现隐私的等级是通过限制访问信息给相关的参与者和第三方。当需要将全部交易公开广播的时候,就不能使用这种方法了。但是隐私仍然能够被维护通过打破在另一个地方的信息流:通过使公钥匿名
的形式。公众可以看到有一个人发送了一笔数目给另一个人,但是没有信息能把交易和人联系在一起。这和股票交易中释放的信息等级类似,在股票交易中公开发布的时间和个人的交易是记录在案的"tape",但是是不会告知是谁参与进来。
作为附加的防火墙(防范机制),在每次交易中都使用一个新的**对能够保证把这些**和一个人联系起来。一些多笔输入的交易的联系仍然是不可避免的,因为在这点(多笔输入)揭示了上这些输入是属于同一个人的。风险就在于,如果只要其中一个key的拥有者被发现了,那么相关联的属于这个人的其他交易也会被揭示。
11. 计算
12. 结论
我们提出了一种不依赖信任的电子交易系统。我们从由数字签名构成的通常的货币框架开始,这提供了一个拥有关系的强控制,但是没有办法解决双重支付的问题。为了解决这个问题,我们提出一种使用工作量证明机制的p2p网络来记录一个公共的交易历史,这种机制变为了当大多数节点控制主要的CPU算力,那么攻击者想要改变是在计算上不可能的。网络在其非结构化简单性方面是鲁棒的。节点只需要很少的协同就可以共同工作。他们不需要被认证,因为信息不需要被路由到某个特定的地方而是只需要被尽可能的被发送出去。节点可随意离开或重加入网络,接受工作量证明链作为当这个节点离开后发生事件的证明即可。他们根据CPU算力投票,表示接受合法的区块通过扩展这个区块,拒绝接受非法的块通过拒绝在这个块后工作。任何需要的规则和激励都可以通过这种共识机制来执行。