本文译自 Bitcoin: A Peer-to-Peer Electronic Cash System by Satoshi Nakamoto。
摘要
真正的点到点电子现金,应该允许交易双方之间的直接在线支付,而不需要通过第三方金融机构。数字签名技术提供了部分的解决方案,但是如果为了防止双重支付而需要一个可信任的第三方机构,那么主要的好处还是丢掉了。本文提出了一种使用点到点网络解决双重支付问题的方案。将带网络时间戳的交易,通过哈希算法形成一个基于工作量证明的连续链条,可以生成一种无法改变的记录,除非重新再完成工作量证明。最长的链条不仅是按照时间顺序发生事件的证明,也将来源于最大的CPU算力池。只要大多数CPU算力不被恶意攻击网络的节点控制,就将比攻击者速度更快地生成最长的链条。网络自身需要最小化的结构。信息基于最大能力在网络上广播,节点可以随意离开和重新加入网络,接受最长的工作量证明链作为离开网络期间的交易证明。
1. 引言
目前,互联网商务几乎完全依赖于可信的第三方金融机构处理电子支付。虽然这种系统在大多数交易中工作足够好,它仍然存在基于信任模型的固有弱点。完全不可逆的交易并非真正可能,因为金融机构无法避免要调解纠纷。调解费用增加了交易成本,限制了最小的实际交易量,断绝了日常小型交易的可能性,而且无法提供不可逆交易本身也造成了大量损失。因为交易可逆,所以存在信任需求。商人必须留心顾客,担心顾客掌握本来并不需要的信息。一定比例的腐败不可避免的被接受存在。这些费用和支付不确定性可以被亲身物理货币所避免,但是还没有机制可以让通过通信通道进行的支付脱离第三方信任机构。
需要一种基于加密算法而不是信任机制的支付系统,允许交易双方不需要第三方信任机构就可以直接交易。交易在技术上无法逆转从而保护商家无须腐败,常规托管机制可以轻易地实现从而保护客户。本文提出了一种双重支付问题的解决方案,使用点到点的分布式时间戳服务器,将按照时间顺序排列的交易生成计算数据。只要可信节点控制的CPU算力超过攻击节点,系统就将是安全的。
2. 交易
本文将电子货币定义为一个数字签名链条。每个拥有者将货币转移给下一个人时,对之前的交易及收款人的公钥进行哈希计算并数字签名(使用拥有者的私钥加密),添加到电子货币的末尾。收款人验证数字签名(使用拥有者的公钥解密,公钥即账户名)来确认链条的所有权。(此处须了解数字签名、认证、哈希的基本原理,上有篇文章说的比较清楚)
这个过程的问题在于,收款人无法确认拥有者是否双重支付。常见的解决办法,是引入一个受信任的中央权威或造币厂,检查每一笔交易是否双重支付。在每笔交易后,货币必须返回造币厂发行一枚新币,只有直接从造币厂发行的货币是可信赖没有双重支付的。这种方案的问题在于,整个货币系统的命运都决定于运营造币厂的公司,因为每一笔交易都必须通过他们,就像银行一样。
需要一种新的方法让收款人知道之前的拥有者没有签发更早的交易。为了避免双重支付,我们需要考虑的是每笔交易之前发生的交易,而不是后来发生的交易。唯一确认交易撤销的办法就是要知道所有的交易。在造币厂模型中,造币厂知道所有的交易,先发生的交易将得到认可。为了在没有第三方机构的情况下完成这个任务,交易必须被公开宣告,我们需要一个系统让参与者对于接受到的交易顺序的唯一历史达成共识。收款人需要一个证明,即在每笔交易发生时,大多数节点都同意它是最先被接收到的。
3. 时间戳服务器
解决方案从时间戳服务器开始。时间戳服务器将一块数据的哈希值打上时间戳并广而告之,就像在报纸或Usenet论坛一样。必须使用时间戳证明数据当时存在后,才能进行哈希计算。每一个新的时间戳都包括了前一个哈希值里的时间戳,形成一各链条,每个新增的时间戳都强化了之前的时间戳。
4. 工作量证明
在点到点的基础上实施分布式服务器,需要使用一种类似于Adam Back的Hashdash的工作量证明系统,而不是报纸或Usenet论坛。工作量证明系统在进行哈希计算时需要通过类似SHA-256算法搜索一个值,使得哈希值以一定数量的0比特开始。平均工作量与需要的0比特数量成指数关联,可以通过执行一次哈希计算验证。
在时间戳网络中,通过在交易块中不断增加一段临时数据值并使整个交易块的哈希值满足所需的0比特数量来完成工作量证明。一旦CPU花费努力满足了工作量证明,交易块将无法改变除非重新进行工作量证明。因为后续的交易块被链接到要改变的交易块,所以改变某一交易块需要改变其后链接的所有交易块。
工作量证明也解决了大多数人做决定的问题。假如大多数人是基于每个IP地址投1票,那么能够拥有许多IP地址的人可能会推翻之前的交易。工作量证明本质上是每个CPU投1票。大多数人的决定被最长的交易链所代表,并拥有所投入的最多的有关与工作量证明的努力。假如大多数CPU算力被可信节点控制,可信链将增长得最快并超过其它竞争链。要修改一个过去的交易块,攻击者不得不重新完成当前交易块以及其后所有交易块的工作量证明,还要赶上并超过所有可信节点的工作速度。在后面,将分析较慢的攻击者赶上的可能性,随着后续交易块的增加而指数性的下降。
为了补偿增长的硬件速度和运行节点在过去时间内的兴趣变化,工作量证明的难度根据每小时平均交易块数量决定。假如交易块生成速度太快,难度将增加。
5. 网络
运行网络的步骤如下:
1)新的交易向所有节点广播;
2)每个节点收集新的交易到一个块;
3)每个节点进行交易块的工作量证明;
4)当一个节点完成工作量证明,向所有节点发送交易块。
5)当交易块的所有交易数据有效并没有多重支付时,节点将接受交易块。
6)节点通过使用采用交易块的哈希值作为前序交易块的哈希值来生成后续交易块,表示对交易块的接受。
节点总是认为最长的链是正确的,将持续工作在延长最长的交易链。如果两个节点同时广播了不同版本的下一个交易块,其它节点最先接收到的交易块会有所不同。在这种情况下,他们将工作在首先接收到的交易块上,但是保存另一个交易分支以防它变得更长。下一次工作量证明完成使得其中一个交易分支变长时,将打破这种平衡,这时工作在其它分支的节点将切换回更长的分支上来。
新的交易广播不必须到达所有节点。只要他们到达了很多节点,他们就将会很快加入一个交易块。交易块广播也具备丢失消息的容错性。假如一个节点没有接收到一个交易块,它将在接收到下一个交易时意识到它丢失了一个交易块,并发起请求。
6. 奖励
按照惯例,交易块的第一次交易是一种特殊交易,用于发行属于交易块创造者的新货币。这为节点支持网络提供了一种奖励方式,而且因为没有中央机构发布,这也成为将货币发行流通的一种方式。固定数量新货币的稳定增加,类似于金矿主花费资源增加流通中的黄金量。在这里,花费的是CPU时间和电力。
交易费用也是一种奖励。假如一次交易的输出价值少于输入价值,那么交易费用就是包含了这些交易的交易块的奖励。一旦一定数量的货币进入了流通,奖励完全转化为交易费用,完全没有通货膨胀。
奖励可能会帮助节点保持可信。假如一个贪婪的攻击者能够聚集比全网所有可信节点更多的CPU算力,他可能会选择是使用算力来欺骗人们篡改交易,还是使用算力生成新币。他应该会发现遵守游戏规则将更加利润丰厚,而不是损害系统及他所拥有的财富,这些奖励规则将赋予他超过其他所有人的货币。
7. 回收磁盘空间
一旦一枚货币的最新交易被深埋在足够的交易块下,它之前的交易将被丢弃以节省硬盘空间。为不破坏区块哈希值实现这个功能,所有的交易按照Merkle树被哈希计算,只有树根被包括在区块哈希值中。老的交易块可以通过修建树枝被压缩。内部的哈希值不需要被存储。
不含交易信息的交易块的头部大约80个字节。假定交易块每10分钟生成1个,那么每年就是4.2M字节。按照2008年典型的计算机系统内存2G考虑,根据摩尔定律预测每年的增长为1.2G计算,那么即使交易头部必须保存在内存也将不是一个问题。
8. 简化的支付认证
有可能不运行所有网络节点来验证支付。使用者只需要通过询问可信的网络节点获得并保存最长交易链的交易块头部,根据时间戳获得连接到交易块的Merkle分支交易。他不能自己检查交易,但是他能把这个交易连接到交易链中的一个位置,看到网络节点接收过这个交易,交易链增加将进一步证明网络接收了交易。
这样的话,只要可信节点控制了网络,验证就是可靠的,但是如果网络被攻击者控制,验证就会更加脆弱。因为网络节点自己验证交易,简化方法将会被篡改交易的攻击者愚弄,可要他能长期控制网络。一种保护策略是网络节点检测到无效交易时发出告警,提示使用者的软件下载全部交易块,并警告要验证交易的不一致性。接受频繁支付的商业系统将很可能需要运行自建节点,以获得更多的独立安全性以及更快的交易验证。
9. 合并和拆分价值
虽然独立处理每个货币是可能的方式,但是每次交易独立的处理每1分的价值是一种笨重的行为。为了允许价值分拆和合并,交易包括多个输入和输出。正常情况下,要么只有一个从之前交易继承的输入,要么具有多个小数量的合并输入;最多有两个输出,一个用于交易,一个向发送者返回零钱,如果有的话。
需要指出的是,扇出型交易,即一个交易取决于多项交易或者多项交易取决于更多的交易,在这里不是个问题,因为并不需要没有提取一个交易历史的完全独立记录。
10. 隐私
传统的银行模型维护了一定的隐私权,限制接触相关方和第三方可信机构的信息。公开宣告所有交易的必要性排除了这种方法,但是让人可以通过破坏信息流动的另一种方法维护隐私权,即保持公钥匿名。公众可以看到某个人向另一个人发送一定数量的货币,没有信息将交易联系到任何人。这和股票交易的信息释放级别相似,每次交易的时间和数量是公开的,但是不告诉谁是交易方。
作为一种新的保密手段,每次交易需要使用一对新的密钥,避免多次交易被联系到一个共同的拥有者。对于多输入交易,他们的输入将暴露出相同的拥有者,关联关系仍然难以完全避免,当他的一个密钥暴露后,可能将暴露属于这个人的其他交易。
11. 计算
考虑一种场景,一个攻击者试图以比可信链条更快的速度,生成一条替换的链条。即使这个场景实现了,也不意味着系统对任意风险都是可能的,例如:凭空创造价值或者拿走其他人的钱。节点不会接收无效的交易作为支付,可信节点也永远不会接收包含无效交易的交易块。攻击者只能试图改变他的一个交易,取回他近期所花的钱。
可信链和攻击链之间的比赛可以使用二项式随机过程模型来描述。成功事件是可信链增加一个交易块,增加了+1的领先;失败事件是攻击链增加一个交易块,减少了-1的差距。
一个攻击者从一个给定的差距赶上的概率类似于赌徒破产问题。假定赌徒有无限的信用,从一个亏损点开始,可能通过无限多的尝试试图打破盈亏平衡。可以计算他打破盈亏平衡的概率,相当于一个攻击链赶上可信链的概率,具体如下:
假定p>q,当攻击者需要赶上的交易块数量增加时,概率指数性的下降。由于对他不利,假如他不是在早期有好运气的话,他会远远落后,机会渺茫。
现在考虑新交易的接收者需要等待多长时间,才能足够确定发送者无法修改交易。假定发送者是一个攻击者,曾经让接收者相信被支付了,然后一段时间后又重新支付给自己。接收者在重新支付时将被告知,但是发送者希望越晚越好。
接收者生成了一对密钥,并在签名前将公钥告知发送者。这样可以防止发送者提前准备交易块链,然后再执行交易。一旦交易发出,不诚实的发送者开始在包含了另一个交易版本的平行的链条上秘密工作。
接收者等待交易增加到交易块时,假定有z个交易块已经被链接到它的后面 (即交易确认时间:目前每个生成块10分钟,z=6,需等候1小时)。他不知道此时攻击者的具体工作进度,但是假设可信交易块花费平均期待时间,攻击者的可能进度将是期望值的泊松分布,其分布期望值如下:
为了获得攻击者现在可能赶上的概率,将每个可能完成进度的泊松分布密度乘以他可能在这个点赶上的概率:
为了避免对分布的无穷尾部进行求和,修正如下:
转换为C语言如下:
运行代码,可以看到随着z变化时概率指数性的下降:
求解P<0.1%的结果如下:
12. 结论
本文提出了不需要依赖信任关系的电子交易系统。从由数字签名产生的通常货币框架出发,其虽然提供了强力的所有权控制,但是无法防止双重支付。为了解决这个问题,本文提出了一种使用工作量证明来记录交易历史并公开的点到点网络,在可信节点控制了大量CPU算力时,可以迅速使得攻击者改变交易记录在技术上变得不切实际。网络因非结构化的简洁而强健,所有节点无须协调就可以开始工作,也不需要被识别,因为信息不被发送到任意特定位置,只需要以尽力而为的基础被传递即可。节点可以随意离开或加入网络,接受工作量证明链作为离开期间的交易证明。节点使用CPU算力投票,通过计算延长交易块链表达对有效交易块的接受,通过不计算表达对无效交易块的拒绝。在一致性机制下,任何所需的规则和奖励都会被强化。
参考文献
略