附录
比特币:一种点对点的电子现金系统
中本聪
摘要:这是一种纯粹点对点的电子现金,无需通过金融机构就可以让一方直接在线支付给另一方。数字签名技术为其提供了部分解决方案,但如果仍然还需要可信的第三方来防止双重消费,那么它就失去了主要的作用。本文提出了一种使用点对点网络来解决双重消费问题的方案。该网络对所有的交易都加盖时间戳 ,盖戳的方法是计算交易数据的哈希值,然后放入一条不断延伸的基于哈希的工作量证明链中,形成一条链上记录,要篡改一条记录必须重新完成工作量证明。 最长的工作量证明链不仅是所有交易顺序的证明,而且也是该链是由最大计算能力组合而产生的证明。只要控制多数计算能力的计算节点不联合攻击本网络,这 些节点就能战胜蓄意攻击,从而产生最长的链。构建该网络有最小的结构需求。 尽可能把消息广播到全网,计算节点则可以随时离开和重新加入本网络,重新加 入时会接收最长工作量证明链作为离开时发生交易的证明。
A.1导言
互联网上的商业行为几乎完全依赖金融机构作为可信的第三方来处理电子支付。尽管这种机制可以满足大多数交易的需要,但是仍然深受基于信用模型固有弱点的影响。因为依赖金融机构来调解争议,所以无法提供不可撤回的交易服务 。同时调解成本也加大了交易成本,抬高了最低交易额的门槛,因此失去了低频小额交易的可能性,而且由于无法为不可撤回服务提供支付,对经济造成了更大的损失。因为支付有撤回的可能性,所以信用就不可或缺。商家要提防顾客,需要顾客提供一些根本就用不着的信息,顾客因此不堪其扰。一定比例的欺诈行为无法避免。如果采用纸币支付,可以避免这些成本和支付的不确定性,但是在没有可信第三方存在的情况下,无法通过信道完成支付。
因此需要一个基于密码证明而非信用的第三方的电子支付系统,允许双方在自愿的情况下不依赖可信的第三方直接交易。不可撤销的交易方式可以保护卖家免受欺诈,容易实现的常规托管机制可以保护买家。本文提出了一种解决双重消费问题的方案,即利用点对点的分布式时间戳服务器,生成按时间顺序排列的交易记录计算证明。只要诚实的计算节点在总体上比任何一个攻击群控制更多的计算能力,那么系统就是安全的。
A.2交易
我们将比特币定义为一串数字签名。在转账时,比特币拥有者对上一次交易的哈希值以及下一位拥有者的公钥进行数字签名,并将签名添加到这笔比特币的末尾。收款人可以对此进行验证从而确定整条所有权链有效。
当然,其中的问题是收款人无法验证某个付款人有无双重消费。常见的解决方案是引入一个可信的中心机构或铸币厂,核查每笔交易是否存在双重消费。每次交易完成后,货币必须返厂销毁,然后再由铸币厂发行一枚新币,只有直接从铸币厂发行的币才能确信没有被双重消费。该方案的问题在于整个货币体系的命运都掌握在经营铸币厂的那家公司手里,每笔交易都要经过它,就像银行一样。
注:收款人1和付款人1为同一个人,其他的编号依次类推。
需要一种办法让收款人知道上一位拥有者并没有签署更早的交易。为此,系统只承认第一笔交易,而不关心这笔钱以后是否会再次用于支付。确认一笔交易是否发生的唯一方法是掌握所有的交易记录。在铸币厂的模型中,铸币厂知道所有的交易,并可以判断哪笔交易先发生。在没有可信机构的情况下要做到这一点 ,必须公示交易,而且需要一个系统,让所有参与者认可唯一的交易顺序。 当每笔交易发生时,收款人需要大多数节点认可这笔钱是首次使用。
A.3时间戳服务器
本提案从时间戳服务器切入。时间戳服务器取得待签署账目区块的哈希值, 并将此哈希值在网络中广播,就像在报纸或Usenet〔2-5〕上发布一样。该时间戳证明这些账目在进行哈希计算之前就已经发生了。每个时间戳都在其哈希值中包含了上一个交易的时间戳,从而形成了一条链,链上每条新增的时间戳都在增强之前存在时间戳的效力。
A.4工作量证明
要实现点对点的分布式时间戳服务器,需要采用工作量证明系统,类似于亚当•巴克(Adam Back)提出的Hashcash,而不是登报或发布到Usenet。工作量证明的实现方法是让哈希运算(例如用SHA-256算法)结果的前几位都为0。得出结果所需的平均运算次数随所需0位个数的增加而指数增长,而验证结果的正确性只需要一次哈希运算即可完成。
通过不断调高区块内的临时数(nonce),使该区块的哈希值可以满足所需前几位是0的条件,这样就为时间戳网络实现了工作量证明。一旦完成了工作量证明,对该区块的改动就必须重新完成工作量证明。由于该区块链上的后续区块不断增加,还要随之重新完成在该区块上的所有后续工作量证明。
工作量证明也解决了多数票胜出的代表选举机制。如果用每IP—票的机制来决定谁胜选,那能够分配大量IP的人就能操纵选举。工作量证明本质上是每个CPU—票。判断谁胜出要看哪条链最长,哪条长就说明那条链上矿工的运算量大。 如果诚实的计算节点控制多数的运算能力,那么诚实的区块链的增长就会是最快的,并超过其他的竞争者。要篡改一个过去的区块,攻击者必须重新完成该区块以及链接在其后的所有区块的工作量证明,并且还要在总长度上超过其他诚实计算节点所产生的区块链。本文将在后面介绍,随着后续区块的加入,算得慢的攻击者赶上来的概率呈指数级降低。
另外,硬件运算速度在不断加快,参与运算的节点数也在不断地变化,为此 ,工作量证明的难度也要根据网络中每小时产生的平均区块数量,采用移动平均的方法来动态调整。如果区块生成的速度太快,那么难度就会随之加大。
A.5网络
本网络的运行流程如下:
1. 新交易广播至所有节点。
2. 每个节点将新交易收集到一个区块中。
3. 每个节点为自己的区块寻找那个耗时的工作量证明。
4. 当某节点找到工作量证明后向所有节点广播。
5. 节点只接受那些包含所有交易有效且未支付过的区块。
6. 节点表达接纳该区块的方式是着手在该区块后创建下一个区块,并将接受区块的哈希值作为上一个哈希值。
节点总是认为最长的链是正确的,并且不断尝试延长这条链。如果两个节点分别同时广播了自己的下一个区块,其他节点的接收顺序可能不同。在这种情况 下,接收节点会在收到的第一个区块后接着计算,同时把后收到的区块保存下来 ,以备支链变得更长。当下一个工作量证明产生并且其中一条支链变得更长时, 短的支链就被断开;工作在短的支链上的节点此时会将计算工作切换到长支链上 。
新交易的广播不必触及所有的节点。只要能把交易广播到很多节点就可以很快进入下一个区块。区块广播也不在乎消息丢失。如果一个节点没有收到某个区块,当它收到下一个区块时就会意识到中间丢了一个,此时该节点会向网络请求那个遗漏的区块。
A.6激励
按照约定,区块中的第一笔交易是特殊交易,这笔交易会产生一笔新的比特币归区块的创建者所有。这为节点支撑本网络提供了一种激励。由于没有中心机构负责发行比特币,这也是将比特币分发到流通领域的一种途径。稳定增发固定数量的新比特币,类似于金矿矿工消耗资源开采黄金,以增加黄金的流通。在本例中,消耗的资源是CPU的时间和电力。
交易费是另一种激励手段。如果交易的支出额小于收入额,两者之间的差额就是交易费,把这笔交易费记录到该交易所在的区块激励中。一旦流通的比特币达到预定的数额,激励将完全由交易费提供,这样就可以避免通货膨胀。
激励可能有助于鼓励节点保持诚实。如果贪婪的攻击者有办法组织超过所有诚实节点的计算能力,他就要在以下两种情况之间做出选择:要么去诈骗用户, 偷回他之前的付款;要么去铸币。按照规则行事理应更有利可图,比起获得不义之财,并且破坏该系统和自身财富的合法性,显然遵守规则会令其获得更大的利 益。
A.7释放磁盘空间
一旦在一笔比特币的最后交易之后链接了足够多的区块,那么就可以丢弃这笔比特币的早期交易数据以节省磁盘空间。为了在不破坏区块哈希计算的前提下达到这个目的,区块中的交易通过哈希处理成默克尔树⑵,区块哈希只需要包含树的根节点。可以通过裁剪树的分支来压缩早期的区块。不需要存储树内部的哈希值。
不含交易的区块头长度约为80字节。假定每10分钟产生1个新区块,每年就会产生4.2MB(80字节x6x24x365)。2008年主流电脑系统的内存是2GB,而摩尔定律预计当前的增长速度是每年1.2GB,所以即使所有区块头必须保存在内存中 ,也不会带来存储问题。
A.8简化支付验证
不必运行功能完整的网络节点也可以完成支付验证。用户仅需要保存最长区块链的头,这可以通过向网络节点请求获得,然后取得链接交易到所在区块的默克尔树分支。这些信息虽然不足以直接检查交易有效性,但是既然能在区块链上找到这笔交易,用户就可以据此断定网络节点已经接纳了该交易,而且这笔交易所在区块后面连接的更多区块将进一步证实这笔交易的可靠性。
因此,只要诚实节点控制着网络,该验证过程就是可靠的。但若有攻击者拥有多数运算能力,网络就会比较脆弱。虽然网络节点自己可以验证交易有效性, 但只要攻击者持续控制网络,简化的验证方法就会被攻击者伪造的交易所欺骗。 一种防御策略是接收网络节点发出的无效区块警报,提示用户的软件下载完整区块以及示警的交易记录,以核实不一致性。频繁接受支付的企业可能还是倾向于运行自己的网络节点以获得更加独立的安全性和更快的验证过程。
A.9面值的合并与分割
虽然分别处理每枚比特币在技术上是可行的,但是在转账时为每一分钱都进行单独的交易太麻烦。为了能够分割及合并金额,交易包含了多个输入和输出。 正常情况下,输入要么来自于一笔大额交易,要么来自于多笔小额交易,输出则最多只有两个:一个用于支付,另一个则在有余额时返还给发送者。
请注意,在这里一笔交易依赖于好几笔交易,而这些交易又依赖于更多其他的交易,这并不存在问题。不会因此需要获取完整的交易历史记录。
A.10隐私
传统的银行模型通过限制交易方以及可信第三方的信息访问来达到保护隐私的目的。公开全部交易的必要性使这种方法在本系统中不适用,但仍可以通过在另一个点切断信息流来维护隐私,即保持公钥的匿名性。外界可以看到有人正在给另一个人付钱,但从该交易上却看不到交易双方的信息。这与股票交易所的信息披露相似,股票行情公布了每笔交易的时间和数量,但不包括交易双方的信息。
每笔交易都应该用新密钥对,防止有些交易关联到同一个所有者,这可作为额外的防火墙。但在包含多个输入的交易中,这些输入必然来自于同一位所有者 ,这种情况下暴露的关联就无法避免了。此时的风险在于,如果密钥所有者的身份泄露,那么属于该所有者的其他交易也就连带被泄露了。
A.11计算
我们在此考虑攻击者试图比诚实链更快地生成替代链的情况。首先要说明的是,即使攻击者做到了,系统也不会接受随意篡改,例如凭空搞出一笔比特币或获得从来不属于攻击者的比特币。节点不会接受无效交易作为支付的输入,诚实节点也绝不会接纳包含这类交易的区块。攻击者只能尝试修改自己的交易,夺回刚刚花掉的那笔钱。
诚实链和攻击链之争可以表达为二项式随机行走。诚实链延长一个区块作为成功事件,加一分。攻击链延长一个区块作为失败事件,减一分。
攻击者从给定的落后点追上的概率类似赌徒破产。假定一个赌徒输了钱,他 有永远花不完的钱,并且一直赌下去,试图达到盈亏平衡。我们可以计算出他达 到盈亏平衡点的概率,也就是攻击者追上诚实链的概率,如下所示:
p=诚实节点找到下一个区块的概率
q=攻击者找到下一个区块的概率
q_z=攻击者落后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
求解P小于0.1%:
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
A.12结论
本文提出了一个不依赖信任的电子交易系统。首先介绍了由数字签名构成的比特币通常框架,数字签名提供了强有力的所有权保障,但如果没有防止双重消费的方法也还是不完整的。为了解决该问题,本文提出了一个点对点网络,以工作量证明的方法记录全部交易的公开历史,在诚实节点控制多数计算能力时,这 种方法让攻击者基本上不可能篡改交易记录。该网络的健壮之处在于其无组织带来的简单性。节点在几乎没有协调的情况下同时工作。这些节点不需要身份识别 ,因为消息不是发给某个指定位置,而是发给所有节点。节点可以随时离开或者重新加入该网络,加入网络后接受工作量证明链作为节点离开时所发生的事件的证明。这些节点用计算能力投票,通过延长区块表示对有效区块的接受,通过拒绝延长表示对无效区块的排斥。任何所需的规则和激励措施都能通过这种共识机制实施。
参考文献
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.