本文总结了中本聪的比特币白皮书中的一些已知问题,包括实现细节与白皮书描述不一致的地方,以及术语的演变和出版后发现的新的安全问题(例如自私挖矿、芬尼攻击)和隐私增强技术(例如CoinJoin)。
作者:David A. Harding
来源: https://gist.github.com/harding/dabea3d83c695e6b937bf090eddf2bb3
本文介绍了中本聪的论文 “比特币:一种点对点的电子现金系统” 的已知问题,同时指出了术语上的变更以及比特币的实现何以不同于这篇论文的描述。
“最长的链不仅证明了得到见证的事件的顺序,也证明了这样的顺序产生于 CPU 算力最大的群体(池子)。”
从检查最长链到检查最多工作量的链的 变更,发生在 2010 年 7 月,是在比特币初次发行很晚以后:
- if (pindexNew->nHeight > nBestHeight)
+ if (pindexNew->bnChainWork > bnBestChainWork)
只要大部分的 CPU 算力都由不参与攻击网络的节点控制,他们就能生成最长的链条并抵御攻击。
“我们以数字签名的链条定义了一种电子货币。每个所有权人都通过签名前一笔交易的一个哈希值以及下一任所有权人的公钥,来转移货币;这些内容也会添加到现有相关货币的末端。”
“我们通过在区块中加入一个 nonce 实现了工作量证明;在寻找工作量证明时,可以不断递增 nonce 的值,直到找出一个值,使得区块的哈希值的开头有足够数量的 0。”
“PoW 本质上就是一 CPU 一票。”
“工作量证明的难度是由一个瞄准每小时的平均出块数量的移动平均值决定的。”
实现细节:移动平均值已不再使用。相反,每 2016 个区块会报告一个生成时间,跟一个更早的区块的生成时间相比较,其中的差值将用于计算调整需要用到的平均值。
而且,比特币中实现的平均值瞄准的是每两周生成的平均区块(而不是文本中暗示的每个小时)。已经实现的其它规则可能会进一步减少调整量,例如有一条规则是调整不能让每个周期的区块生产量提高 300% 以上,也不能使之降低 75% 以上。
“一旦某个币的最新交易已被埋在足够数量的区块之下,这笔交易以前的交易都可以删除,已节省硬盘空间。”
“一种对抗策略是接收来自网络节点的警告,当节点发现一个无效区块时,会提醒用户的软件下载完整的区块和警告交易,以确认交易的不一致性。”
“一些关联依然不可避免,例如多输入的交易必然会曝光这些输入都由同一个人拥有。”
出版之后的发现:如果资金的所有者经常将自己的输入和其他人的输入混合,他们的同一笔交易的不同输入就并不必然属于同一个人。举个例子,Alice 和 Bob 每人为支付给 Charlie 和 Dan 的交易贡献一个输入,跟 Alice 自己一个人提供两个输入然后支付给两人,从表面上看是没有区别的。
今天,这种技术叫做 “ CoinJoin”,从 2015 年开始已经有了许多软件实现。
“支付的接收者生成一对新的密钥,并在发送者签名交易之前把公钥交给发送者。这可以防止发送者提前准备好一长串的区块并持续不断地开挖、直到自己足够幸运将它们全部挖出,然后才执行这笔交易。”
出版后的发现:支付的接收者在发送者签名之前才生成公钥,完全无法防止发送者提前准备好一长串的区块。早期的比特币用户 Hal Finney 发现了这种攻击并 解释说:“假设攻击者正随意生成区块,并且在每一个生成的区块中,都包含一笔从地址 A 到地址 B 的转账,这两个地址都是他自己的。”
“为了欺骗你,他生成区块时,并不广播出去。相反,他来到你的商店,并给属于你的地址 C 支付。你等了一会,没有发现什么异常,于是发了货。他现在把自己提前准备的区块放出来,于是他左手倒右手的交易优先于你的交易。”
这种攻击对任意的确认数量要求都有可能奏效,有时候也被称为 “芬尼攻击”。
- - -
免责声明:本文的作者不是上述任何问题的第一发现人 —— 他只是收集了这些问题的描述、归纳成了一篇文章。
更新:
(完)
- 本文转载自: btcstudy.org/2022/11/23/... , 如有侵权请联系管理员删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!