主页 > imtoken钱包苹果版用不了 > 以太经典被攻击后,国外高手利用矿池让51%的攻击者付出代价|干货

以太经典被攻击后,国外高手利用矿池让51%的攻击者付出代价|干货

imtoken钱包苹果版用不了 2023-10-13 05:09:37

众所周知,在区块链中,只有大多数人在利益驱动下(挖矿奖励等)表现出诚实的行为,整个区块链才能正常运行,但如果诚实行为的收益低于欺诈行为的收益,一些人会冒险。 如果走投无路的人占多数,整个区块链就会出现各种各样的问题,最典型的就是51%算力攻击。 那么问题来了,去中心化实现了权力下放,去中心化后如何制衡权力,确保不作恶? 受矿池启发,国外大神Tomaz Kariz提出在选择区块链时将区块链中的“附庸”矿池作为影响因素,引入区块链评分机制和惩罚机制,奖惩结合,让51 % 攻击成本更高。 那么,如何结合矿池和区块链的选择呢? 会有什么影响? 让我们跟随大神一探究竟吧!

作者| phyro——Tomaz Kariz

翻译 | 国喜

出品 | 区块链训练营(blockchain_camp)

前段时间,以太坊经典(ETC)区块链遭遇51%攻击,引发了我的深思。

理论上,我不认为 51% 算力攻击是区块链网络设计的失败以太坊拒绝服务攻击检测,但有没有办法让这些 51% 算力攻击对攻击者来说成本更高?

当一个区块链节点客户端发现同时存在多个区块链时,它必须决定选择哪个区块链。 此时节点客户端会分别计算每条区块链的得分chainScore,然后选择得分最高的区块。 区块链。

在PoW共识的区块链中,选择区块链的规则通常称为“最长链规则”,其中区块链的chainScore等于区块链上完成的工作量之和。 这种基于评分的区块链选择的美妙之处在于它是完全客观的。

主观打分的一个例子是,区块链节点客户端对区块链的打分标准不仅是基于区块链上做了多少工作,还考虑了区块链中删除了多少块,即带有偏差针对那些可能需要您更改本地维护的区块链的区块链。

基于将从本地维护的区块链中删除的块数的主观区块链评分

另一个主观区块链选择规则的例子是像往常一样计算链得分 chainScore,但只有当它需要从本地区块链中删除的块数不超过 20 个得分更高的区块链时才切换到这个(这个规则通常是称为最大重组上限)。

此规则不仅会产生“新节点问题”(如上图所示),而且即使所有节点都运行相同版本的客户端程序,也会导致硬分叉。

所以我们希望避免主观地对区块链进行评分,因为这样做会使我们的区块链选择逻辑难以解释,并且即使每个客户端节点都遵循相同的规则也可能导致硬分叉。

区块链选择规则

Ethereum Classic 使用的区块链选择规则是选择完成最多工作的区块链。 假设一个名为 Bob 的 ETC 客户端是第一次连接到 ETC 网络,Bob 必须在多个区块链之间进行选择,但这不是问题,他所要做的只是计算在区块链上做了多少工作以及选择完成工作最多的区块链。

即使我们有任意数量的 Ethereum Classic 客户,比如 Bob,他们都会为每个区块链计算完全相同的 chainScore。

给定一个区块链系统中的 N 个节点,这 N 个节点形成一个完整的图(每个节点都连接到所有其他节点),区块链选择规则应该具有以下属性:

每个节点都应该看到相同的区块链作为最佳选择。

区块链选择规则还应该为区块链 C 在任何时间点和任何高度 H 提供相同的 chainScore,这意味着 chainScore 应该只依赖于我们正在评估的区块链上的数据。

这些属性确保 Bob 和长期存在的节点就遵循哪个区块链达成一致,并允许它们随着时间的推移逐渐汇聚到同一个区块链上。

请注意,正如我们上面提到的,今天以太坊经典中 chainScores 最高的区块链是那些完成了最多工作的区块链。

区块链挖矿

对于一个独立的矿工来说,除非他控制了相当大的算力,否则他不太可能挖出一个区块。

矿池就是为了解决这个问题而发明的。 矿池借鉴了“大家拾柴火焰高”的思路。 大量原本独自挖矿的矿工聚在一起取暖,一起挖矿,一起分享收益。 因此,即使某些矿工可能连一个区块都挖不到,但他们的工作总能得到稳定的回报。

假设区块链网络中有多个矿池,它们共同占据了网络中的大部分算力。

每个区块都包含一个名为coinbase/etherbase的值,用来指代挖出该区块的矿工,表示应该获得挖矿奖励的地址。

大多数区块都是由矿池开采的,每个矿池通常会指定一个地址来接收挖矿奖励。

以下是以太坊经典区块链上从高度 7283680 到高度 7283695 连续开采的 16 个区块,以及他们获得挖矿奖励的矿工地址:

以太坊经典区块链高度7283680到高度7283695的区块,以及获得挖矿奖励的矿工地址

正如预期的那样,绝大多数区块是由以太坊经典网络中运行的矿池开采的,Ethermine 开采了 5 个区块,MiningPoolHub 开采了 4 个区块,矿池 NanoPool 开采了 3 个区块。

在灰色区块中,挖矿奖励被发送到我不知道其所有者的地址,但它们很可能也是矿池。

这似乎给了我们一点启发……

使用矿池减少51%攻击? 真实的!

假设我们有一个不断挖掘新区块的矿池,我们应该会看到频繁出块。 当攻击者进行51%算力攻击时,他通常会离线连续挖出N个区块,然后释放比当前共识链更长的区块链,从而导致当前共识链的重组。

攻击者挖出的区块一般不会使用我们以往观察到的矿池地址。

通过惩罚矿池的不一致性,我们可以在保持大致相同的共识规则的同时,大大增加攻击者的攻击成本,从而保护我们免受 51% 的攻击。

这里,我们需要明确一下51%算力攻击是如何发生的:

矿池前后一致性指标

区块链选择规则不仅可以考虑完成的工作量,还可以考虑矿池的一致性。 我们可以通过将 chainScore 的定义更改为以下公式来包括矿池的影响:

chainScore = parentChain.score + (block.PoW_score * PCI)

其中,parentChain.score是上一条区块链的得分,block.PoW_score是区块链的工作量,PCI(Pools Consistency Index)是0到1之间的一个值。

这里的PCI指的是矿池的一致性。 让我们看一下使用矿池信息来评估区块链“健康”的实现。

在最后 3000 个区块上使用滑动窗口测量工作一致性的示例。

chainScore函数的代码实现如下:

滑动窗口矿池前向后向一致性增量参考实现

当多个区块链共存于网络中时,我们认为最有可能的共识链将是矿工不断挖掘的那条。 这种说法不是 100% 正确,但在大多数情况下都是正确的,除非出现超过 51% 算力的矿池叛逃的情况。

这种结合矿池信息的方式,可以预测区块链的未来会是什么样子,惩罚恶意行为者,这在过去是不可能的。 当我们为池不一致设置非常高的惩罚时,会发生两件事:

网络中只有一条区块链,部分矿池停止挖矿。 因为对于所有矿工来说,他们的PoW值都会相应降低,所以对矿工来说无所谓,因为chainScore低不会影响他们的挖矿收益。 多个区块链在网络中共存。 在这种情况下,矿池一致性较低的区块链(通常是 51% 攻击)将受到惩罚。

那么,这种方法面对上述51%算力攻击的效果如何呢?

使用算力租赁服务(如NiceHash)进行攻击

由于其他矿池不会继续在他的区块链上挖矿,随着时间的推移,攻击者将因矿池不一致而受到惩罚。

两个控制全网60%算力的矿池联合执行攻击

要解决这个问题,我们不仅要考虑矿池的算力,还要考虑区块链上挖矿的矿池数量。 如果我们有超过 10 个算力大致相同的矿池,这个问题就更容易解决。

两者的结合

例如,一个持有全网40%算力的矿池租用全网30%的算力进行攻击。

随着时间的推移,攻击者会因池不一致而受到惩罚。 值得注意的是,即使攻击者将租用算力挖出区块的矿工地址设置为原矿池地址,也无济于事,因为我们会查看被挖出的矿工的过往数据堵塞。

使用专用集成电路 (ASIC) 执行的攻击

这看起来像是一个长期的 51% 攻击。 随着时间的推移,攻击者将因池不一致而受到惩罚,但如果他能坚持下去,他可能会成为我们所说的“过去的池”。 在这种情况下,问题就变成了如果矿池叛逃了怎么办。

虽然这种方法不能解决 51% 攻击,但它会使攻击者的攻击成本更高,因为攻击者将在很长一段时间内(许多块时间)继续受到惩罚。

如果几个矿池突然停止挖矿,监控系统可以检测到这一点以太坊拒绝服务攻击检测,社区会有一些时间做出反应,比如自己开始挖矿(但因为惩罚机制他们必须小心)或者只是在这种情况发生时等待更多后续区块的确认。

基于这些情况,我们首先做出如下假设:

接下来,我们需要用博弈论的方法来检验这个假设。 需要注意的是,可以考虑不调整 PoW 的值,而是使用 PCI 作为附加值来保持 PoW 的一致性。

滑动窗口矿池前后一致性增量测试结果

我的想法是通过模拟一个理想的区块链来测试矿池在一系列连续区块中的一致性。

虽然结果表明使用滑动窗口矿池的前向后向一致性增量比最长区块链机制(目前大部分区块链采用)成本更高,51%攻击的成本会更高,但应该需要注意的是,因为测试过程可能有瑕疵,代码可能有错误,或者模拟的环境太理想/简单/错误,这样的结论可能有问题,所以可能还有很长的路要走实际使用区块链的路要走。

在这个实验中我创建了大约 5500 个区块(这个过程持续了 5500 * 14 秒),攻击者在区块高度 4850 分叉。默认情况下,区块间隔时间约为 14 秒。 我在代码上做了很多简化,并不完全符合现在区块链使用的逻辑(比如出块时间的计算不一样,没有叔块)。

尽管存在差异,但我认为这个实验足以检验我们的想法。 实验结果如下所示。 结果中,Ratio(比率)表示攻击者在区块高度4850处生成的主链和分叉链之间的区块链得分chainScore的比值。如果比值低于1.0,则表示主链的总和区块链得分 chainScore 低于攻击者分叉链的总和。

从图中我们也可以看出两条区块链达到了多高。

实验结果

从图中我们可以看出,相对于传统的最长链方式,滑动窗口矿池一致性的增量方式更容易选择主链,但即使这种方式胜出很多,在真实的区块链环境中,这种效用该方法还有待测试。

从上面的结果表可以看出,在所有情况下,分叉链最终都挖出了更多的区块,但是滑动窗口评分方法中分叉链的得分chainScore从未超过主链(这不完全正确,因为它可能一开始得分更高,但在这次测试中,分叉链至少比主链领先 30 个区块,得分也更高)。

如果攻击者能够坚持足够长的时间,他可能会成为“矿池历史”的一部分,分叉链的得分chainScore会随着时间的推移超过主链。

当然,这次的实验代码除了我没有被任何人检查过。 如果您在代码中发现错误,请向我报告。

已知的攻击媒介

51%算力攻击

不过,攻击的成本可能要高得多。

矿池冒充攻击

攻击者可以挖掘更长的区块链,并将其他矿池的矿工地址插入其中,从而将攻击者挖掘区块的矿池分布调整为与攻击前大致相同的分布。

为了防止这种情况,我们需要为矿工提供某种形式的身份证明。 这可以通过在区块头中添加称为minerSig(矿工签名)的身份验证信息来解决。 minerSig 是用矿工的私钥和区块的 nonce 签名的前一个区块的 parentHash。 为了使块有效,我们需要检查此验证。

攻击者加入主网

攻击者可以加入主网络并挖掘几个区块,以避免稍后被识别为突然的大量挖掘。 如果矿池叛逃,可以参考这种情况。

改进措施:去掉矿池假设

在协议层面实现矿池机制,可以保证矿池真实存在。 但即使我们没有矿池,也可以针对这种情况优化协议。

比如我们可以鼓励矿工聚集在一起,形成一定数量的矿池。 具体做法是根据每个矿池的算力给予挖矿奖励,从而汇聚成一共N个矿池。 假设我们想要大约20个矿池,那么占全网算力5%的矿池的挖矿奖励最高(4个ETC)。

如果该矿池的算力大于/小于该值,则该矿池获得的奖励较低,剩余奖励将根据其算力分配给其他矿池。 由于我们最终为每个区块创造了相同数量的挖矿奖励(在本例中为 4 个),因此它不会改变货币政策中定义的流通货币总量。 需要正确地激励矿工按照我们希望的方式进行集群。

在此提醒开发者,即使一个人拥有5个矿池,每个矿池拥有全网5%的算力,也没有问题,因为它增强了矿池的一致性,从而为我们提供提供额外的安全性。

如果一个矿池已经存在,就像今天的 Ethereum Classic,如果需要的话,它也可以在后期实施。

其他可能的池一致性定义

矿池的前向后向一致性公式可以进行如下操作。

协议层面矿池一致性示例

假设我们有一个区块链,每个矿池都内置了激励措施,以收敛到网络哈希算力的 1%,从而总共有大约 100 个矿池。

为了使矿池能够为矿池一致性指数做出贡献,它需要在过去的 3000 个区块中始终以大约 1% 的哈希率进行挖掘。 池一致性指数将是通过此标准的池的比率。

例如,如果最后 100 个区块由 50 个不同的矿池开采,则矿池的一致性指数将等于 0.5,从而为难度贡献 0.5。

在这种情况下,如果攻击者想要进行攻击,他将需要在不同矿工地址的最后 3000 个区块中挖出 50%,才能开始获得与主链相同的矿池一致性指标。 另外,我们也可以给矿池开“超速罚单”。

假设我们有100个算力相同的矿池,我们也可以做一些统计分析。 所有矿池都有相同的被“选中”的概率,这意味着我们可以计算最后 100 个区块状态的可能性,假设它们是随机选择的,然后我们可以对结果不太可能的事件进行惩罚。

写在最后

说了这么多,我并不是说人们应该改变他们的共识算法,而是说应该有一个很好的理由来推动共识算法的改进,并且在考虑任何改变之前应该对替代方案进行充分的研究。

这些只是我对共识算法改进的一些想法。 我的想法可以降低网络51%算力攻击的可能性。

无论如何,矿池将成为区块链网络的一部分,那么为什么不使用它们来增加区块链的安全性呢?

我们仍然可以认为这种方法是最长链机制,不同的是我们改变了我们衡量区块链长度的方式。 我更希望人们使用更笼统的描述,例如最大区块链评分规则。

希望这篇文章能帮到你。 关于利用矿池降低51%攻击的尝试,你怎么看,欢迎在文末留言告诉营长~

- 结尾 -