主页 > 官网安卓版下载imtoken钱包 > 比特币:点对点电子货币系统(比特币白皮书)

比特币:点对点电子货币系统(比特币白皮书)

中本聪

satoshin@gmx.com

从 bitcoin.org/bitcoin.pdf 翻译成简体中文

@shdxiang

潇湘.io

总结。完全点对点的电子货币应该允许在线支付直接从一方发送到另一方,而无需通过金融机构。数字签名提供了部分解决方案,但如果仍然需要受信任的第三方来防止双重支出,那么电子货币的主要好处就丧失了。我们提出了一种使用点对点网络来解决双花问题的方法。网络通过将交易散列到不断增长的基于散列的工作量证明链中来为交易加上时间戳,形成一个除非重做工作量证明否则无法更改的记录。最长的链不仅证明了所见证的事件顺序,而且证明了它本身是由最大的 CPU 能力池产生的。只要大部分 CPU 功率由不打算联合攻击网络的节点控制,这些节点就会生成最长的链并超过攻击者。网络本身需要一个简约的架构。信息将尽最大努力广播,节点可以随时离开和重新加入网络,只需接受最长的工作量证明链作为他们离开时发生的事情的证明。

1.简介

互联网商务几乎完全依赖金融机构作为受信任的第三方来处理电子支付。尽管该系统对于大多数交易都足够好,但它存在基于信任的模型的固有缺陷。由于金融机构不可避免地需要仲裁纠纷,完全不可撤销的交易实际上是不可能的。仲裁费用增加交易成本,限制最低实际交易金额以消除日常小额交易的可能性,而且由于不支持不可撤销的支付,不可撤销服务的支付将需要更大的成本。由于交易被逆转的可能性,对信任的需求将更加广泛。商家必须对他们的客户保持警惕,并通过提供比其他方式更多的信息来困扰他们。一定比例的欺诈被认为是不可避免的。虽然可以通过亲自使用实物货币来避免这些成本和支付不确定性,但没有任何机制可以在不引入受信任方的情况下通过通信渠道进行支付。

我们需要的是一种基于密码学而非信任的电子支付系统,它允许任何愿意的两方在没有受信任第三方的情况下直接进行交易。交易的计算不可撤销性质将保护卖家免受欺诈,用于保护买家的程序化合约机制应该相对容易实施。在本文中,我们提出了一种解决双花问题的方案,该方案使用点对点分布式时间戳服务器为基于时间的交易序列生成计算证明。只要诚实节点集体控制的CPU算力大于每个合作攻击节点组的CPU算力,系统就是安全的。

2.事务

我们将电子货币定义为数字签名链。每个所有者通过将先前交易的数字签名和下一个所有者的公钥的哈希添加到硬币的末尾来将硬币转移给下一个所有者。收款人可以通过验证数字签名来证明自己是链的所有者。

在这里插入图片描述

这里的问题是收款人无法验证其中一位所有者没有双花货币。一种常见的做法是引入受信任的中央机构或铸币厂来检查每笔交易是否有双重支出。每次交易后,都需要将币退回铸币局以换取新币的发行,并且只有铸币局直接发行的币才能确认没有被双花。这种方案的问题在于,整个货币体系的命运取决于运营铸币厂的公司,而每笔交易都需要通过它们,就像银行一样。

我们需要一种方法让接收者知道之前的硬币所有者没有签署任何早期的交易。对于我们来说,最早的交易是唯一有效的,所以我们不需要关心这个交易背后的双花尝试。确保交易不存在的唯一方法是了解所有以前的交易。在铸币厂模型中,铸币厂知道所有交易,并可以确定哪个交易先到达。为了在不引入受信任方的情况下实现这一点,所有交易都必须公开发布,并且需要一个允许所有参与者就接收交易顺序的单一历史达成一致的系统。对于每笔交易,收款人需要大多数节点同意该交易是第一个收到的证据。

3.时间戳服务器

我们提出的方案从时间戳服务器开始。时间戳服务器计算包含多个需要时间戳的数据项的块的哈希值,并广泛发布哈希值,例如在报纸或新闻组帖子中。时间戳可以证明,要得到这个hash值,显然那个时候数据是必须存在的。每个时间戳的哈希值并入前一个时间戳,形成链,后续时间戳进一步增强前一个时间戳。

在这里插入图片描述

4.工作证明

为了实现点对点时间戳服务器,我们需要使用 Back 提出的哈希货币工作量证明系统,而不是报纸或新闻组的帖子。工作量证明涉及搜索一个数字,以便在散列时(例如使用 SHA-256),生成的散列以多个 0 位开头。所需的平均工作量将随着所需的 0 位呈指数增长,而验证只需要执行一次哈希。

对于我们的时间戳网络。我们通过向块添加一个随机数来实现工作量证明,直到为块的哈希值找到所需数量的 0 位。一旦消耗 CPU 功率以使块满足工作量证明,除非重做工作,否则无法更改块。由于后续区块链接在此区块之后,因此更改此区块将需要重做所有后续区块。

在这里插入图片描述

工作量证明还解决了确定如何在多数决策中投票的问题。如果多数是通过 IP 地址投票决定的,那么它可能会被可以分配大量 IP 地址的人破坏。工作量证明本质上是 CPU 投票。最长的链代表多数决策,因为计算量最大的工作量证明工作都集中在这条链上。如果大部分 CPU 功率由诚实节点控制,诚实链将增长最快,并超过其他竞争链。要修改过去的区块,攻击者必须重做该区块和所有后续区块的工作量证明,以赶上并超越诚实节点的工作量。稍后我们将展示,随着后续区块的添加,较慢的攻击者追上诚实节点的概率呈指数下降。

为了抵消硬件计算速度的提升,平衡不同时期运行节点的收益,工作量证明的难度将采用移动平均法确定每小时平均产生的块数如果块生成太快,生成难度会增加。

5.网络

运行网络的步骤如下:

新交易被广播到所有节点。每个节点将新交易收集到一个块中。每个节点都为其块寻找工作量证明。当一个节点找到工作量证明时,它会将区块广播到所有节点。只有当区块中的所有交易都有效且之前没有付款时,节点才会收到这个区块。节点通过使用该块的哈希作为前一个哈希创建链中的下一个块来表示接受该块

.

节点总是认为最长的链是正确的,并继续努力扩展它。如果两个节点同时广播不同的下一个块,一些节点可能先接收一个,而其他节点先接收另一个。在这种情况下,节点根据他们收到的第一个块工作,但也会保存另一个分支,以防它变成更长的链。当找到下一个工作量证明时,僵局被打破比特币算力的替代方案,其中一个分支变得更长;在另一个分支上工作的节点将切换到更长的链。

新交易的广播不必到达所有节点。一旦到达一些节点,很快就会进入一个块。块广播也可以容忍消息丢失。如果一个节点没有收到一个块,它会在收到下一个块并请求该块时发现它丢失了一个块。

6.奖励

我们同意区块中的第一笔交易是区块创建者开启属于他的新货币的特殊交易。这增加了对支持网络的节点的激励,并提供了一种将货币分配到流通中的方式,因为没有中央机构来发行货币。固定数量的新货币稳步增加,就像黄金矿工消耗资源,将黄金添加到流通中。对我们来说,这是 CPU 时间和功率。

也可以通过交易费用来提供奖励。如果一笔交易的输出值小于其输入值,则差额作为交易费用添加到包含该交易的区块的激励中。一旦预定数量的货币在流通,奖励将仅变成交易费用,完全避免了通货膨胀。

激励措施将有助于鼓励节点保持诚实。如果一个贪婪的攻击者有能力积累比所有诚实节点更多的 CPU 能力,他将面临通过欺诈回款来欺骗他人或使用这种能力来生成新货币的选择。他会发现遵守规则比破坏系统和他自己财产的有效性更有益,因为这些规则使他能够获得比其他所有人更多的新货币。

7.恢复磁盘空间

一旦一种货币的最新交易被足够的区块覆盖,之前的支付交易可以被丢弃以节省磁盘空间。为了在不破坏区块哈希的情况下促进这一点,交易将被哈希到默克尔树中,并且只有根节点将包含在区块的哈希中。旧块可以通过修剪树枝来压实。 twig 内的 hash 不需要保存。

在这里插入图片描述

8.简化支付验证

无需运行完整的网络节点即可进行支付验证。用户只需拥有最长工作量证明链的区块头副本,即可通过查询其他网络节点确认自己拥有最长链,并获取到默克尔的链接交易,默克尔为交易区块分支打上时间戳虽然他自己无法验证交易,但如果交易已经链接到链上某处,则意味着网络节点已经接受了交易,后续的区块进一步确认网络已经接受。

在这里插入图片描述

同样,只要诚实节点控制网络,这种简化的验证就是可靠的。如果网络被攻击者控制,简化的验证将变得更加脆弱。虽然网络节点可以验证自己的交易,但只要攻击者继续控制网络,这种简化的方法就会被攻击者的伪造交易欺骗。一种对策是在其他网络节点发现无效块时接受来自其他网络节点的警告,提醒用户软件下载整个块和警报交易以检查一致性。经常收到付款的公司可能仍需要运行自己的节点以获得更独立的安全性和更快的付款确认。

9.合并和拆分交易金额

虽然可以单独处理每种货币,但将转账拆分为每次拆分的多笔交易会很笨拙。为了允许拆分和合并交易金额,交易将包含多个输入和输出值。通常是一个较大的输入值或来自先前交易的多个较小输入值的组合,以及最多两个输出值:一个作为付款,另一个作为零钱,如果有的话,返回给付款的发送者。

在这里插入图片描述

注意这里的扇出,即一个事务依赖于几个事务,而这些事务又依赖于更多的事务,这里不存在有问题。永远不需要获取交易历史的完整独立副本。

10.隐私

传统银行模式通过限制各方和受信任的第三方访问信息来实现一定程度的隐私。如果交易必须公开发布,则不能使用此方法,但仍可以通过阻止信息流在其他地方保护隐私:即保持公钥匿名。公众可以看到某人正在向其他人发送一定数量的钱,但无法将交易链接到某个人。这类似于证券交易所发布的信息级别。每笔交易的时间和交易量,即市场价格,都是公开的,但并不透露交易双方是谁。

在这里插入图片描述

作为额外的防火墙,为每个事务使用新的密钥对可以防止它们与一个共同的所有者相关联。由于多输入值交易的存在,一些关联仍然是不可避免的,因为多输入值交易必须暴露多个输入属于同一个所有者。风险在于,如果一个密钥的所有者被暴露,关联将暴露属于同一所有者的其他交易。

11.计算

我们考虑攻击者试图生成比诚实链更快的替代链的情况。即使这个目标实现了,也不会让系统随意随意修改,比如凭空造币或者拿走不属于他的钱。节点不会接受无效交易作为支付,诚实节点永远不会接受包含无效交易的区块。攻击者只能通过更改自己的一笔交易来取回自己不久前花掉的钱。

诚实链和攻击者链之间的竞争可以描述为二项式随机游走。成功事件是诚实节点扩展了一个区块,两条链之间的差距增加了1,失败事件是攻击者的链扩展了一个区块,两条链之间的差距缩小了乘以 1。攻击者从落后位置追上诚实链的概率类似于赌徒的破产理论。想象一下,一个拥有无限信用的赌徒从一定的损失开始,然后下注可能无限多,以试图收支平衡。我们可以计算他达到盈亏平衡的概率,即攻击者追上诚实链的概率,如下:

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

qz={1ifp≤q(qp)zifp >q}q_{z}= \begin{Bmatrix} 1 & if & p\leq q\\ (\frac{q}{p})^{z} & if & p>q \end{Bmatrix}qz​ ={1(pq​)z​ifif​p≤qp>q​}

我们假设 p > q,概率将随着攻击者需要追赶的块数呈指数下降。以他的胜算,如果他没有足够的运气早早赶上,他跌得越深,他追上的机会就越小。我们现在考虑新交易的收款人必须等待多长时间才能确保付款人不能再更改交易。我们假设付款人想说服收款人他已经暂时付款,然后在一段时间后更改为还给自己。此时收款人收到警告,但付款人希望为时已晚。

收款人生成新的密钥对,并将公钥提供给付款人,使付款人无法提前签署交易。这可以防止付款人通过继续工作来预先准备区块链,直到他有幸在执行交易之前获得很大的领先优势。交易发送后,不诚实的付款人开始在包含他的替代交易版本的平行链上秘密工作。

收款人一直等到交易被添加到区块中,然后z个区块被附加。他不知道攻击者的确切进度,但假设诚实块是在预期的平均时间内产生的,那么攻击者的可能进度将是一个具有期望值的泊松分布:

λ=zqp\lambda = z \frac{q}{p}λ=zpq​

为了计算攻击者仍然可以赶上的概率,我们将每个可能进度的泊松密度乘以

进度可以赶上诚实链的概率:

∑k=0∞λke−λk!{(qp)z−kifkz}\sum_{k= 0}^\infty \frac {\lambda^k e^{-\lambda}}{k !} \begin{Bmatrix} (\frac {q} {p})^{z-k} & if & k < z \\ 1 & if & k > z \\ \end{Bmatrix}k=0∑∞​k !λke−λ​{(pq​)z−k1​ifif​kz​}

变换以避免对分布的无限尾求和...

1−∑k=0zλke−λk!(1−(qp)(z−k))1 - \sum_{k=0}^z \frac { \lambda^k e^{-\lambda}}{ k!} (1 - (\frac {q} {p})^{(z-k)})1−k=0∑z​k!λke−λ​( 1−(pq​)(z−k))

转换为 C 代码...

#include 
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

12.总结

我们提出了一个无需信任的电子交易系统。我们从一个通用的数字签名货币系统开始,该系统提供强大的所有权控制,但由于缺乏防止双重支出的方法而并不完善。为了解决这个问题,我们提出了一个使用工作量证明来记录公共交易历史的点对点网络。只要诚实节点控制大部分 CPU 能力,交易历史将很快在计算上对攻击者不可变。 该网络是健壮的,因为它的结构简单。节点可以在很少协调的情况下同时工作。它们不需要经过身份验证,因为信息不会发送到特定位置,它只是尽力传播。节点可以随时离开和重新加入网络,只需接受最长的工作量证明链作为他们离开时发生的事情的证明。节点使用 CPU 能力进行投票,通过承诺扩展有效块来表达他们的接受,并通过拒绝处理无效块来表达他们的抵制。任何需要的规则和激励措施都可以通过这种共识机制来执行。

参考文献

W。戴,“b-money”,1998.

H.马西亚斯,X.S.阿维拉和 J.-J。 Quisquater,“设计一个安全的时间戳服务,最小化

信任要求,”在 199 年 5 月在比荷卢经济联盟举行的第 20 届信息理论研讨会上9.

S。哈伯,W.S. Stornetta比特币算力的替代方案,“如何为数字文档加时间戳”,密码学杂志,第 3 卷,否

2,第 99-111、199 页1.

D.拜耳、S. Haber、W.S. Stornetta,“提高数字时间戳的效率和可靠性”,序列 II:通信、安全和计算机科学中的方法,第 329 页-

334, 1993.

S。哈伯,W.S. Stornetta,“位串的安全名称”,第四届 ACM 会议论文集

关于计算机和通信安全,第 28-35 页,199 年 4 月7.

A.返回,“Hashcash - 一种拒绝服务的对策”,

, 2002.

p>

R.C. Merkle,“公钥密码系统协议”,Proc。 1980 年安全与技术研讨会

隐私,IEEE 计算机协会,第 122-133 页,198 年 4 月0.

W。 Feller,“概率论及其应用简介”,1957.