附录A. 比特币白皮书(by中本聪)翻译

  • berry
  • 发布于 2025-02-09 12:26
  • 阅读 12

附录A. 比特币白皮书(by中本聪)翻译

比特币 - 一种点对点的电子现金系统

www.bitcoin.org

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

介绍

互联网上的商务几乎完全依赖于金融机构作为可信第三方来处理电子支付。虽然该系统对于大多数交易已经运作得足够好,但它仍然受到基于信任模型的固有弱点的影响。完全不可逆转的交易实际上是不可能的,因为金融机构无法避免调解纠纷。调解的成本增加了交易成本,限制了最小的实际交易规模,并且割断了小额休闲交易的可能性,且在无法进行非可逆支付的非可逆服务上也存在更广泛的成本。由于可能发生逆转,信任的需求扩散开来。商家必须警惕他们的客户,麻烦他们提供比他们本来需要的更多的信息。一定比例的欺诈被接受为不可避免的。这些成本和支付不确定性可以通过使用实物货币面对面进行避免,但是在没有可信第三方的通信渠道上进行支付没有任何机制存在。

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

交易

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

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.1.png" alt=""><figcaption></figcaption></figure>

问题当然是收款人无法验证其中一个所有者是否曾经双重支付了该硬币。一个常见的解决方案是引入一个可信的中央机构或者铸币厂,来检查每一笔交易是否存在双重支付。在每笔交易之后,硬币必须被退回给铸币厂以发行新的硬币,而只有直接由铸币厂发行的硬币才被信任不会被双重支付。这种解决方案的问题在于整个货币系统的命运取决于运行铸币厂的公司,每笔交易都必须通过他们进行,就像银行一样。

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

时间戳服务器

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.2.png" alt=""><figcaption></figcaption></figure>

我们提出的解决方案始于一个时间戳服务器。时间戳服务器的工作方式是对要进行时间戳处理的数据块进行哈希,并广泛发布该哈希值,比如在报纸或Usenet帖子中[2-5]。时间戳证明了数据必须在某个时间点存在,显然,为了被包含在哈希中。每个时间戳在其哈希中包含了前一个时间戳,形成一个链条,每个额外的时间戳都加强了之前的时间戳。

工作量证明(PoW)

为了在点对点基础上实现分布式时间戳服务器,我们将需要使用类似于Adam Back的Hashcash的工作量证明系统,而不是使用报纸或Usenet帖子。工作量证明涉及扫描一个值,使其哈希(例如,使用SHA-256)以一定数量的零位开始。所需的平均工作量随所需的零位数量呈指数增长,并且可以通过执行单个哈希来验证。对于我们的时间戳网络,我们通过在区块中递增一个随机数(nonce)来实现工作量证明,直到找到一个值,使得区块的哈希具有所需的零位。一旦CPU投入了足够的工作量使其满足工作量证明,区块就无法更改,除非重新进行这项工作。随着后续区块的链接,要更改该区块需要重新做所有后续区块的工作。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.3.png" alt=""><figcaption></figcaption></figure>

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

为了补偿硬件速度的增加和随时间变化的节点运行兴趣的差异,工作量证明的难度由一个移动平均数确定,以达到每小时平均区块数量的目标。如果生成得太快,难度就会增加。

网络

\ 运行网络的步骤如下:

  1. 新的交易被广播到所有节点。
  2. 每个节点将新的交易收集到一个区块中。
  3. 每个节点努力为其区块找到一个难以证明的工作量。
  4. 当一个节点找到一个工作量证明时,它将该区块广播到所有节点。
  5. 节点只接受其中所有交易都是有效的且未被花费的区块。
  6. 节点通过努力创建链中的下一个区块来表示它们对该区块的接受,使用接受区块的哈希作为上一个哈希。

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

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

\

激励

根据惯例,区块中的第一笔交易是一笔特殊的交易,用于创建一个由该区块的创建者拥有的新币。这为节点支持网络提供了激励,并为最初将币分配到流通中提供了一种方式,因为没有中央机构来发行它们。持续不断地增加一定数量的新币相当于金矿工耗费资源将金添加到流通中。在我们的情况下,耗费的资源是CPU时间和电力。

激励也可以通过交易费来资助。如果一笔交易的输出价值小于其输入价值,那么差额将作为交易费添加到包含该交易的区块的激励价值中。一旦预定数量的币进入流通,激励可以完全过渡到交易费,并且完全不受通货膨胀的影响。

激励可能有助于鼓励节点保持诚实。如果一个贪婪的攻击者能够聚集比所有诚实节点更多的CPU算力,他将不得不在利用它来欺骗他人通过窃取回他的支付,或者用它来生成新的币之间做出选择。他应该会发现,遵循规则更有利于他,这些规则给予他的新币比其他人加在一起的要多,而不是破坏系统和他自己财富的有效性。

\

回收磁盘空间

一旦一个币的最新交易被足够多的区块深埋之后,该币之前的已花费交易就可以被丢弃以节省磁盘空间。为了实现这一点而不破坏区块的哈希,交易被哈希成一个默克尔树,在区块的哈希中只包含根。旧的区块可以通过截断树的分支来压缩。内部哈希值不需要被存储。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.4.png" alt=""><figcaption></figcaption></figure>

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

简化支付验证(Simplified Payment Verification,SPV)

用户只需保留最长工作量证明链的区块头副本即可验证支付,他可以通过查询网络节点获取这些副本,直到确信自己拥有了最长的链,并获取将交易链接到其时间戳位置的默克尔分支。虽然用户无法自行验证交易,但通过将其与链中的某个位置关联起来,他可以看到网络节点已接受该交易,并且之后添加的区块进一步确认了网络已接受该交易。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.5.png" alt=""><figcaption></figcaption></figure>

因此,只要诚实的节点控制着网络,验证就是可靠的,但如果网络被攻击者压倒性地控制,则更容易受到攻击。虽然网络节点可以自行验证交易,但简化的方法可能会被攻击者伪造的交易欺骗,只要攻击者能够继续压倒网络。保护措施之一是接受来自网络节点的警报,当它们检测到无效区块时,提示用户的软件下载完整区块和警报交易以确认不一致之处。经常收到支付的企业可能仍然希望运行自己的节点,以获得更独立的安全性和更快的验证速度。

合并和拆分价值

虽然可以单独处理硬币,但对于每一分钱都进行单独交易将会很不方便。为了允许价值的拆分和合并,交易包含多个输入和输出。通常情况下,会有一个较大的前一笔交易作为单一输入,或者多个输入合并较小的金额,最多有两个输出:一个用于支付,另一个将余额(如果有)退回给发送者。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.6.png" alt=""><figcaption></figcaption></figure>

应该注意的是,扇出(即一笔交易依赖于多笔交易,而这些交易又依赖于更多的交易)在这里并不是一个问题。这里从不需要提取一笔交易的完整独立历史记录。

隐私

传统银行模式通过限制信息访问权限仅限于参与方和受信任的第三方来实现一定程度的隐私。必须公开宣布所有交易的必要性排除了这种方法,但隐私仍然可以通过在另一个地方中断信息流来维护:通过保持公钥匿名。公众可以看到某人向另一个人发送了一笔金额,但没有信息将交易与任何人联系起来。这类似于股票交易所公布的信息水平,即单笔交易的时间和金额(“电子交易信息”)是公开的,但没有透露交易双方是谁。

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.7.png" alt=""><figcaption></figcaption></figure>

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

计算

\ 我们考虑的情况是攻击者试图比诚实链更快地生成替代链。即使成功,也不会使系统对任意更改敞开大门,比如凭空创造价值或获取从未属于攻击者的资金。节点不会接受无效的交易作为支付,而诚实的节点永远不会接受包含这些交易的区块。攻击者只能尝试改变自己的一笔交易,以取回最近花费的资金。

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

攻击者从给定的落后位置赶上的概率类似于《赌徒破产问题》。假设一个信用无限的赌徒从赤字开始,并进行可能无限次的尝试来达到盈亏平衡。我们可以计算他是否会达到盈亏平衡,或者攻击者是否会赶上诚实链的概率,如下所示:

p = 诚实节点找到下一个区块的概率

q = 攻击者找到下一个区块的概率

qz = 攻击者从 z 个区块落后赶上的概率

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.8.png" alt=""><figcaption></figcaption></figure>

鉴于我们假设 p > q,随着攻击者需要赶上的区块数量增加,概率呈指数下降。面对不利的情况,如果攻击者在早期没有幸运地迈出重要的一步,随着他落后的距离增加,他的机会将变得微乎其微。

现在我们考虑新交易的接收方需要等待多久才能足够确信发送方无法更改交易。我们假设发送方是一名攻击者,他希望让接收方相信他已经付款了一段时间,然后在一段时间后将其更改为支付给自己。当接收方发现时,他已经晚了,但发送方希望这会太晚。

接收方在签名前不久生成一个新的密钥对,并将公钥提供给发送方。这样可以防止发送方提前准备好一连串的区块,不断地工作直到他幸运地领先一段距离,然后在那一刻执行交易。一旦交易发送出去,不诚实的发送方会秘密地开始在一个平行链上工作,其中包含他交易的另一个版本。

接收方等待直到交易被添加到一个区块中,并且之后链接了 z 个区块。他不知道攻击者取得了多少进展,但是假设诚实的区块需要平均预期时间来生成,攻击者的潜在进展将服从泊松分布,其期望值为:

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.9.png" alt=""><figcaption></figcaption></figure>

为了得到攻击者现在仍然有可能赶上的概率,我们将他可能已经取得的每一次进展的泊松密度与他从那一点上赶上的概率相乘:

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.10.png" alt=""><figcaption></figcaption></figure>

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

<figure><img src="https://img.learnblockchain.cn/masterbitcoin3/assets/A.11.png" alt=""><figcaption></figcaption></figure>

转换为C代码...

<pre class="language-c"><code class="lang-c">#include <math.h> double AttackerSuccessProbability(double q, int z) { double p = 1.0 - q; <strong> double lambda = z (q / p); </strong> double sum = 1.0; int i, k; for (k = 0; k <= z; k++) { <strong> double poisson = exp(-lambda); </strong> for (i = 1; i <= k; i++) <strong> poisson = lambda / i; </strong> sum -= poisson * (1 - pow(q / p, z - k)); <strong> } </strong> return sum; } </code></pre>

运行一些结果,我们可以看到概率随着 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 &lt; 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

结论

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

引用

[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 ser‐
vice 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.hash‐
cash.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.
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论