# 每个人都对比特币以太坊 51% 攻击有误解​

By [ppp](https://paragraph.com/@ppp-2) · 2021-12-05

---

请原谅标题中的挑衅。显然不是每个人都弄错了。但是足够多的人，我认为写一篇关于这个主题的文章很好。

有一种说法是，如果你控制了比特币、以太坊或其他区块链中超过 50% 的算力，那么你就可以在网络上做任何你想做的事。股权证明的类似重申是，如果你控制了三分之二以上的股权，你就可以做任何事情。你可以拿走别人的硬币。您可以打印新硬币，这不是真的。

让我们讨论一下 51% 攻击可以做什么：

他们可以阻止您使用该链，即阻止他们不喜欢的任何交易。这叫做审查制度。

他们可以恢复链，即撤销一定数量的区块并改变其中的交易顺序。

他们不能做的是改变系统的规则。这意味着例如：

在区块链系统的规定之外，他们不能简单地印刷新代币;例如，比特币目前给每个新的区块生产者 6.25 BTC;他们不能简单地将其变成 100 万个 BTC。

他们不能从没有私钥的地址消费代币。

他们不能制作比共识规则允许更大的区块。

这并不是说 51% 的攻击没有破坏性。他们仍然是非常糟糕的攻击。重新排序允许双花硬币，这是一个相当大的问题。但是他们能做的事情是有限的。

现在，包括比特币和以太坊在内的大多数区块链如何确保这一点？如果矿工开采违反规则的区块会怎样？或者大多数股权签署了一个违反规则的区块？

区块链安全模型 有时人们声称最长的链是有效的比特币或以太坊链。这有点不完整。当前链头的正确定义是：

总难度最高的有效链。

因此，在接受应使用链来表示当前历史记录之前，客户端需要验证两个属性：

1.  它必须是有效的。这意味着所有状态转换都是有效的;例如在比特币中，这意味着所有交易只花费之前未花费的交易输出，coinbase 只收到交易费用和区块奖励等。
    
2.  它必须是难度最高的链条。通俗地讲，这是最长的链，但不是以区块来衡量，而是在这条链上花费了多少总挖矿算力。
    

这听起来可能有点抽象。问谁来验证第一个条件，即链上的所有块都应该是有效的，这是合理的？因为如果只是矿工也验证了这条链是有效的，那么这就是同义反复，我们并没有真正得到任何东西。

但区块链不同，让我们看看为什么，从普通的客户端/服务器数据库架构开始：

请注意，对于典型的数据库，用户信任数据库服务器。他们不检查响应是否正确；客户端确保根据协议对其进行有效格式化，仅此而已。客户端（此处由一个空方块表示）是"哑巴"：它无法验证任何内容。

然而，区块链架构看起来像这样：

所以让我们总结一下这里发生的事情。有生产链的矿工（或质押者）。有一个点对点网络——它的作用是确保一个有效的链总是可供所有人使用，即使某些节点不诚实（你需要连接到至少一个诚实且连接良好的 P2P节点，以确保您将始终与有效链保持同步）。还有一个客户端，他将交易发送到 P2P 网络，并从网络中的其他节点接收最新的链更新（或完整链，如果它们正在同步）。它们实际上是网络的一部分，还将通过转发块和交易做出贡献，但这在这里并不重要。

重要的部分是用户正在运行一个完整的节点，如其客户端中的圆柱体所表示的那样。每当客户端获得一个新块时，就像任何其他节点一样，无论是矿工还是 P2P 网络中的一个节点，他们都会验证该块是否是有效的状态转换。

如果它不是有效的状态转换，则该块将被忽略。这就是为什么矿工在网络中尝试挖掘无效状态转换的意义很小的原因。大家只会无视。

许多用户运行自己的节点来与以太坊或比特币等区块链进行交互。许多社区已将此作为其文化的一部分，并非常重视每个人都在运行自己的节点，因此他们是验证过程的一部分。事实上，你可以说大多数用户，尤其是那些有很多价值的用户，运行全节点真的很重要；如果大多数用户变得太懒惰，那么矿工可能会突然被诱惑产生无效区块，这种模式将不再成立。

类比：三权分立 你可以把这想成有点像自由民主国家的权力分立——政府有不同的部门，仅仅因为你在其中一个部门（比如立法）中占多数并不意味着你可以做任何你想做的事情喜欢并无视所有法律。矿工或权益持有者有权在区块链中订购交易；他们没有权力简单地对社区规定新规则。

但是所有的区块链都是这样工作的吗？这是个好问题。需要注意的是，这仅在完整节点易于运行时才有效。作为普通用户，如果这意味着必须花 5,000 美元购买另一台计算机并且永久需要 1 GBit/s 的互联网连接，那么您根本不会这样做。即使你可以在某些地方获得这样的连接，让它被你的区块链节点永久阻塞可能不是很方便。在这种情况下，您可能不会运行自己的节点（除非您的交易非常有价值），这意味着您将信任其他人为您做这件事。

想象一下，一条链的运行成本如此之高，以至于只有质押者和交易所才能运行一个完整的节点。你刚刚改变了信任模型，大多数质押者和交易所可以联合起来改变规则。不会与用户就此进行辩论——如果用户根本无法控制链，他们就无法领导分叉。他们可以坚持旧规则，但除非他们开始运行完整节点，否则他们不知道是否使用满足他们想要的规则的链来回答他们的请求。

这就是为什么总是围绕增加区块大小（例如以太坊或比特币）的争论——每次这样做，都会增加运行自己节点的人的负担。对于矿工来说，这不是什么大问题——与实际的挖矿操作相比，运行节点的成本很小——因此它将权力的平衡从用户转移到矿工（或抵押者）。

轻客户端呢？ 好的，但是如果您只想使用加密货币支付咖啡费用怎么办？你打算在手机上运行一个完整的节点吗？

当然，没有人预料到这一点。而用户不会。在这里，轻客户端开始发挥作用。轻客户端是更简单的客户端，不验证整个链——它们只验证共识，即总难度或投票给它的股份数量。

换句话说，轻客户端可以被诱骗跟踪包含无效块的链。对此有一些补救措施，包括数据可用性检查和欺诈证明。据我所知，目前还没有链实施这些，但至少以太坊将来会这样做。

因此，使用具有数据可用性检查和欺诈证明的轻客户端，我们将能够在不需要所有用户运行完整节点的情况下提供区块链安全模型。这是最终目标，任何手机都可以轻松运行以太坊轻客户端。

那么侧链呢？ 侧链现在是一个热门话题。看起来它们是一种提供缩放的简单方法，没有汇总的复杂性，简单的说：

创建新的权益证明链。

与以太坊建立双向桥梁。

利润！请注意，侧链的安全性几乎完全依赖于桥接——即允许一条链了解另一条链状态的结构。毕竟，如果你能欺骗主链上的桥，桥链上的所有资产现在都属于邪恶先生，那么股权证明链上的全节点是否有不同的想法都没有关系，所以一切都在桥上。

不幸的是，网桥的状态与轻客户端相同。他们不验证正确性，而只验证共识条件的大部分。然而，有两件事比轻客户端更糟糕：

1.  桥接用于非常高价值的交易，如果可以，大多数用户会选择全节点。
    
2.  不幸的是，没有办法像我们为轻客户端所做的那样加强桥接——原因是它们无法验证数据可用性检查。
    

第二点非常微妙，可以轻松填写另一篇或两篇博文。但简而言之，网桥无法进行数据可用性检查，没有这些，欺诈证明也大多无用。使用零知识证明，您可以通过要求桥接器包含所有块正确的证明来获得改进——不幸的是，这仍然受到一些数据可用性攻击的影响，但这是一个改进。

总而言之，侧链具有与以太坊和比特币等区块链不同的、弱得多的安全模型。它们无法防止无效的状态转换。

这一切都与分片有关吗？ 事实上，所有这些都与分片有很大关系。我们需要分片来扩展的原因是因为它是在不提高运行全节点的门槛的情况下扩展的唯一方法，同时尽可能地保持区块链的完整安全保证。

但是如果你只是撤销所有的历史呢？然后你仍然可以窃取所有的比特币/以太币/等。从理论的角度来看，在非检查点工作量证明链上，确实通过不还原某些交易，而是还原所有交易，您仍然可以获得所有比特币。好的，所以你不能打印一万亿比特币，但你仍然可以得到所有存在的比特币，所以这很好，对吧？

我认为这一点非常理论化。这些社区中的任何一个都接受修改其历史数年（甚至数小时）的分叉的概率恰好为零。在所有可能的渠道上会有大量的争吵，很快得出的结论是人们应该拒绝这一点，并同意有效的链应该是已经存在的链。

通过权益证明和最终确定，这种机制将变得正式——客户永远不会恢复最终确定的区块。

---

*Originally published on [ppp](https://paragraph.com/@ppp-2/51)*
