Bitcoin

比特币:点对点电子现金系统

概要

纯粹的点对点版本的电子现金将允许在线支付直接从一方发送到另一方,而无需通过金融机构。数字签名提供了部分解决方案,但如果仍然需要可信第三方来防止双重支出,那么主要的收益就会丧失。我们剔除了一种使用点对点网络来解决双重支出问题的解决方案。网络通过将交易散列到持续的基于散列的工作量证明链中来为交易添加时间戳,形成一条记录,如果不重做工作量证明就无法更改。最长的链不仅可以证明所见证的事件序列,还可以证明它来自最大的 CPU 算力池。只要大部分 CPU 能力由不合作攻击网络的节点控制,它们就会生成最长的链并超过攻击者。 网络本身需要最少的结构。消息以尽力而为的方式广播,节点可以随意离开和重新加入网络,接受最长的工作量证明链作为它们离开时发生的事情的证明。

1.介绍

互联网上的商务几乎完全依赖金融机构作为受信任的第三方来处理电子支付。虽然该系统对于大多数交易来说运行良好,但它仍然存在基于信任的模型的固有弱点。完全不可逆的交易实际上是不可能的,因为金融机构无法避免调解纠纷。调解费用增加了交易成本,限制了最低实际交易规模,切断了小额临时交易的可能性,而且丧失了为不可逆转的服务支付不可逆转付款的能力,其代价更大。 随着逆转的可能性,对信任的需求蔓延开来。商家必须对他们的顾客保持警惕,骚扰他们要求提供比原本需要的更多信息。一定比例的欺诈被认为是不可避免的。这些成本和支付的不确定性可以通过使用实物货币来避免,但不存在在没有可信方的情况下通过通信渠道进行支付的机制。

我们需要的是一种基于密码证明而不是信任的电子支付系统,允许任何两个愿意的一方直接相互交易,而不需要可信的第三方。在计算上无法逆转的交易将保护卖家免受欺诈,并且可以轻松实施常规托管机制来保护买家。在本文中,我们提出了一种解决双花问题的方案,使用点对点分布式时间戳服务器来生成交易时间顺序的计算证明。只要诚实节点共同控制比任何合作的攻击者节点组更多的 CPU 功率,系统就是安全的。

2.交易

我们将电子硬币定义为数字签名链。每个所有者通过对前一个交易的哈希值和下一个所有者的公钥进行数字签名并将其添加到硬币的末尾,将硬币转移到下一个所有者。收款人可以验证签名以验证所有权链。

transaction verify&sign

当然,问题是收款人无法验证其中一位所有者没有重复使用该货币。一个常见的解决方案是引入一个值得信赖的中央机构或铸币厂,检查每笔交易是否存在双重支出。每次交易后,硬币必须返回造币厂以发行新的硬币,并且只有直接从造币厂发行的硬币才被信任不会被双重花费。这个解决方案的问题在于,整个货币系统的命运取决于运营铸币厂的公司,每笔交易都必须经过他们,就像银行一样。

我们需要一种方法让收款人知道以前的所有者没有签署任何早期的交易。就我们的目的而言,最早的交易才是最重要的,因此我们不关心后来的双花尝试。确认不存在交易的唯一方法是了解所有交易。 在基于铸币厂的模型中,铸币厂了解所有交易并决定哪些交易先到达。为了在没有可信方的情况下实现这一目标,交易必须公开宣布,并且我们需要一个系统,让参与者就接收顺序的单一历史达成一致。收款人需要证明在每次交易时,大多数节点都同意这是第一个收到的交易。

3.时间戳服务器

我们提出的解决方案从时间戳服务器开始。时间戳服务器的工作原理是获取要加时间戳的项目块的哈希值并广泛发布该哈希值,例如在报纸或新闻组帖子中。显然,时间戳证明数据当时必须存在,才能进入哈希值。每个时间戳在其散列中都包含前一个时间戳,形成一条链,每个附加时间戳都会增强其之前的时间戳。

哈希链

4.工作量证明

为了在点对点的基础上实现分布式时间戳服务器,我们需要使用类似于Adam Back的Hashcash的工作量证明系统,而不是报纸或Usenet帖子。工作量证明涉及扫描一个值,该值在进行哈希处理(例如使用 SHA-256)时,哈希值以多个零位开始。所需的平均工作量与所需的零位数量成指数关系,并且可以通过执行单个哈希来验证。

对于我们的时间戳网络,我们通过增加块中的随机数来实现工作量证明,直到找到一个值,该值为块的哈希提供所需的零位。一旦花费了 CPU 的努力来满足工作量证明,则在不重做工作的情况下无法更改块。由于后面的块链接在它后面,因此更改块的工作将包括重做它后面的所有块。

pow

工作量证明还解决了确定多数决策中的代表性问题。 如果多数是基于一IP地址一票,那么任何能够分配多个IP的人都可能会颠覆它。工作量证明本质上是一 CPU 一投票。 多数决定由最长的链代表,该链投入了最大的工作量证明努力。如果大部分CPU算力由诚实节点控制,那么诚实链将增长最快并超过任何竞争链。要修改过去的区块,攻击者必须重做该区块及其后所有区块的工作量证明,然后赶上并超越诚实节点的工作量。稍后我们将证明,随着后续块的添加,速度较慢的攻击者追上的可能性呈指数级下降。

为了补偿不断增加的硬件速度和随着时间的推移对运行节点的兴趣的变化,工作量证明难度由针对每小时平均块数的移动平均值确定。如果它们生成得太快,难度就会增加。

5.网络

运行网络的步骤如下:

  1. 新交易被广播到所有节点
  2. 每个节点将新交易收集到一个块中
  3. 每个节点都致力于为其区块寻找一个困难的工作量证明
  4. 当节点找到工作量证明时,它会将块广播到所有节点
  5. 仅当块中的所有交易均有效且尚未花费时,节点才会接受该块
  6. 节点通过使用已接受块的哈希作为前一个哈希来创建链中的下一个块来表达对块的接受

节点始终认为最长的链是正确的,并将继续努力扩展它。如果两个节点同时广播下一个区块的不同版本,则某些节点可能会先接收其中一个。在这种情况下,他们会处理收到的第一个分支,但保存另一个分支,以防它变得更长。当找到下一个工作量证明并且一个分支变得更长时,平局就会被打破; 然后,在另一个分支上工作的节点将切换到较长的分支。

新的交易广播不一定需要到达所有节点。只要到达很多节点,不久就会进入区块。块广播还可以容忍丢失的消息。 如果一个节点没有收到一个块,它会在收到下一个块并意识到它错过了一个块时请求它。

6.激励

按照惯例,区块中的第一笔交易是一项特殊交易,它启动了该区块创建者拥有的新硬币。这增加了节点支持网络的激励,并提供了一种最初将硬币分配到流通中的方法,因为没有中央机构来发行它们。稳定增加一定数量的新硬币类似于金矿开采者消耗资源以将黄金添加到流通中。 在我们的例子中,消耗的是 CPU 时间和电力。

该激励措施也可以通过交易费来资助。 如果交易的输出值小于其输入值,则差额就是交易费用,该费用将添加到包含该交易的区块的激励值中。一旦预定数量的代币进入流通,激励措施就可以完全转变为交易费用,并且完全不受通货膨胀影响。

这种激励措施可能有助于鼓励节点保持诚实。如果贪婪的攻击者能够聚集比所有诚实节点更多的 CPU 算力,他将不得不选择是用它来偷回他的付款来欺骗人们,还是用它来生成新的硬币。他应该发现遵守规则更有利可图,这些规则有利于他获得比其他人加起来更多的新硬币,而不是破坏系统和他自己财富的有效性。

7.回收磁盘空间

一旦硬币中的最新交易被埋在足够多的区块下,之前花费的交易就可以被丢弃以节省磁盘空间。为了在不破坏区块哈希的情况下实现这一点,交易在默克尔树中进行哈希处理,只有根包含在区块的哈希中。然后可以通过砍掉树的树枝来压缩旧块。不需要存储内部哈希值。

Merkle Tree

没有交易的块头大约为 80 字节。 如果我们假设每 10 分钟生成一个块,则每年 80 字节 6 24 * 365 = 4.2MB。截至 2008 年,计算机系统通常配备 2GB RAM,并且摩尔定律预测当前每年增长 1.2GB,因此即使块头必须保存在内存中,存储也不应该成为问题。

8.简化的付款验证

无需运行完整的网络节点即可验证付款。用户只需要保留最长的工作证明链的块标头的副本,他可以通过查询网络节点来获得,直到他确信自己拥有最长的链条,并获得将交易链接到块的默克尔分支它是时间戳。他无法自己检查交易,但通过将其链接到链中的某个位置,他可以看到网络节点已接受该交易,并在进一步确认网络已接受该交易后添加区块。

work chain

因此,只要诚实的节点控制网络,验证就是可靠的,但如果网络被攻击者压倒,验证就更容易受到攻击。虽然网络节点可以自行验证交易,但只要攻击者能够继续压制网络,简化的方法就可能会被攻击者捏造的交易所欺骗。防止这种情况的一种策略是,当网络节点检测到无效块时,接受来自网络节点的警报,提示用户的软件下载完整的块,并发出警报交易以确认不一致。经常收到付款的企业可能仍然希望运行自己的节点,以获得更独立的安全性和更快的验证。

9.合并和分割值

尽管可以单独处理硬币,但为转账中的每一分钱进行单独的交易会很麻烦。为了允许拆分和组合价值,事务包含多个输入和输出。通常,要么有一个来自较大先前交易的输入,要么来自多个输入组合较小的金额,最多有两个输出:一个用于付款,另一个将零钱(如果有)退还给发送者。

应该注意的是,扇出(其中一个事务依赖于多个事务,而这些事务又依赖于更多事务)在这里不是问题。 永远不需要提取交易历史记录的完整独立副本。

10.隐私

传统的银行模式通过限制相关方和受信任的第三方对信息的访问来实现一定程度的隐私。公开宣布所有交易的必要性排除了这种方法,但仍然可以通过在另一个地方中断信息流来维护隐私:通过保持公钥匿名。公众可以看到有人正在向其他人发送金额,但没有将交易与任何人联系起来的信息。 这类似于证券交易所发布的信息水平,其中个别交易的时间和规模,即“磁带”,是公开的,但没有说明各方是谁。

Model

作为额外的防火墙,应为每个事务使用新的密钥对,以防止它们链接到共同所有者。 对于多输入交易,某些链接仍然是不可避免的,这必然表明它们的输入由同一所有者拥有。 风险在于,如果密钥的所有者被泄露,链接可能会泄露属于同一所有者的其他事务。

11.计算

我们考虑攻击者试图比诚实链更快地生成替代链的情况。即使实现了这一点,它也不会让系统接受任意更改,例如凭空创造价值或拿走不属于攻击者的金钱。节点不会接受无效的交易作为付款,诚实的节点也永远不会接受包含它们的区块。攻击者只能尝试更改自己的一笔交易来取回他最近花费的钱。

诚实链和攻击者链之间的竞争可以被描述为二项式随机游走。成功事件是诚实链延长一个区块,领先优势增加+1,失败事件是攻击者链延长一个区块,差距缩小-1。

攻击者追赶给定赤字的概率类似于赌徒破产问题。假设一个拥有无限信用的赌徒从赤字开始,并可能进行无限次尝试以试图达到收支平衡。我们可以计算他达到盈亏平衡的概率,或者攻击者追上诚实链的概率,如下所示:

p = 诚实节点找到下一个块的概率 q = 攻击者找到下一个块的概率 qz = 攻击者从后面的 z 个区块追上的概率

formula1

鉴于我们假设 p > q,随着攻击者必须追上的区块数量增加,概率呈指数下降。在形势对他不利的情况下,如果他没有尽早幸运地向前冲,随着他越来越落后,他的机会就会变得微乎其微。

我们现在考虑新交易的接收者需要等待多长时间才能充分确定发送者无法更改交易。我们假设发送者是一个攻击者,他想让接收者相信他已经支付了他一段时间,然后在一段时间过后将其转回给自己。当这种情况发生时,接收者会收到警报,但发送者希望为时已晚。

接收方生成一个新的密钥对,并在签名前不久将公钥提供给发送方。这可以防止发送者通过连续处理来提前准备一系列区块,直到他足够幸运地提前足够远,然后在那一刻执行交易。一旦交易被发送,不诚实的发送者就开始在包含其交易的替代版本的平行链上秘密工作。

接收者等待,直到交易被添加到一个块中并且 z 个块已链接到它之后。他不知道攻击者取得了多少进展,但假设诚实的区块花费了每个区块的平均预期时间,那么攻击者的潜在进展将是具有期望值的泊松分布:

$\lambda=z\frac{q}{p}$​

为了得到攻击者现在仍然可以追上的概率,我们将他可以取得的每个进展量的泊松密度乘以他从那时起可以追上的概率:

prob

重新排列以避免对分布的无限尾部求和……

prob

转换为C代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#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 呈指数下降

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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%…

1
2
3
4
5
6
7
8
9
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

12.总结

我们提出了一种不依赖信任的电子交易系统。我们从由数字签名制成的通常的硬币框架开始,它提供了对所有权的强大控制,但如果没有防止双重支出的方法,它是不完整的。为了解决这个问题,我们提出了一个点对点网络,它使用工作量证明来记录交易的公共历史记录,如果诚实的节点控制了大部分的CPU能力,攻击者很快就会在计算上变得不切实际。该网络因其非结构化的简单性而非常强大。 节点同时工作,几乎不需要协调。它们不需要被识别,因为消息不会路由到任何特定的地方,只需要尽力传递。节点可以随意离开和重新加入网络,接受工作量证明链作为它们离开时发生的事情的证明。他们用自己的 CPU 能力进行投票,通过扩展有效块来表达对有效块的接受,并通过拒绝处理无效块来表达对无效块的接受。任何需要的规则和激励措施都可以通过这种共识机制来执行。