paint-brush
如何解决智能合约中的抢先漏洞经过@dansierrasam79
1,832 讀數
1,832 讀數

如何解决智能合约中的抢先漏洞

经过 Daniel Chakraborty6m2023/03/04
Read on Terminal Reader

太長; 讀書

当支付更高 gas 费用的交易比不支付更高 gas 费用的交易往往更受青睐时,就会发生领先错误。该漏洞不是由于错误的编程而发生的,而是利用了交易排序和添加到区块的方式。攻击者只需支付更高的汽油费,就可以改变拍卖、交易或首次代币发行等事件的结果,使其对自己有利。
featured image - 如何解决智能合约中的抢先漏洞
Daniel Chakraborty HackerNoon profile picture
0-item
1-item

即使在超市或支付水电费的商店排队已经成为历史,但我们中的一些人知道有人插队时的感觉。


到队列的前面,就是这样。特别是,如果是因为他们的账单与排队的其他人相比价值更高。显然,这不应该成为衡量服务及时性的标准。


现在,这种被转移到前端的业务也发生在以太坊智能合约中。也被称为领先错误,其名称来源于股票市场的类似现象,支付更高 gas 费用的智能合约交易往往比那些没有支付更高 gas 费用的交易更受青睐。

破解抢跑漏洞

马上,这个漏洞不是由于错误的编程而发生的,而是利用了交易的排序方式和从“内存池”添加到块中的方式。


除了希望快速赚钱的普通用户外,矿工往往会从此类交易中获益,这就是为什么他们最有可能在此类交易被添加到区块之前关注此类交易。事实上,一旦他们这样做了,他们就会发送自己的交易以获得不公平的经济奖励,最终会被添加到一个区块中,而不是第一个发送的那个。


这里必须牢记的是,与其他交易相比,以较高 gas 价格承诺的交易往往会首先得到处理。牢记这种偏好,攻击者可以通过支付更高的汽油费来改变拍卖、交易或首次代币发行等事件的结果,使其对自己有利。


让我们看一下这个常见的示例,以了解抢先交易漏洞的工作原理:

在这个例子中,我们有三个演员:Naman、Kaavya 和 Aishwarya。 Naman 首先将 Hashing 挑战部署为智能合约,供其他两个解决。解决这个哈希难题的人将获得 10 个以太币作为奖励。


现在,Kaavya 首先找到哈希解决方案,并从她自己的智能合约中发送 10 Gwei 作为汽油费:


另一方面,Aishwarya 稍后找到答案,并将正确答案传递给她的智能合约,其中 100 Gwei 作为汽油费。


由于支付了更高的 gas 费用,Kaavya 没有收到 10 Ether 奖励,而是 Aishwarya 收到了,如下图:


简而言之,这是抢先交易或交易排序错误,因为它根据汽油费的价值来处理交易。


换句话说,即使 Kaavya 在 Aishwarya 之前提交了她的答案,她的努力也没有得到任何回报,如下所示:

由于 Aishwarya 的这种“插队”不会与 Kaavya 或其他任何人相处得很好,因此必须为我们的智能合约代码考虑一些预防措施。

处理抢跑漏洞的 3 种方法

现在,有一些修复程序可以防止这种丢失。换句话说,我们应该能够将一笔交易锁定为应该接收 10 个以太币的交易。


方法一:交易柜台

使用交易柜台是阻止其他人通过任何其他方式获得奖励的最简单方法之一。


从下面添加的代码可以看出,添加了一个交易计数器,它锁定了首先完成哈希挑战的人提交的交易。由于只有第一个这样做的人必须获得奖励,我们通知所有参与者将值 0 添加到他们的解决方案中。


由于第一个出现的解决方案的 txCounter 的当前值将为零,因此它被锁定。换句话说,如上例所示,Kaavya 将输入她的解决方案以及零值以获得她的 10 Ether 奖励.


如果其他人这样做,则解决方案将不会被接受,因为事务计数器已递增到大于 1 的值。到那时,应该给 Kaavya 的全部 10 Ether 奖励将正确地转移给她。


方法 2:设置 Gas 限制

现在,使用这种方法,重点是为所有交易设置气体限制。如有必要,两者都有下限和上限。


您可能还记得,交易是根据为该交易支付了多少汽油费来排序的。虽然这可能不会完全消除该顺序,但确实会在很大程度上减少它。


如果你看下面的代码,所有支付 gas 等于或小于 1 的交易都将通过,但那些试图通过支付更多 gas 来跳过线路的交易不会,这要归功于 gasThrottle 修饰符。在这种情况下,1 Wei 或 Gwei 可能是处理此类交易的标准成本,并且是允许的。


因此,如果所有交易都不会因为这种限制而在 gas 上发生太大变化,那么就不会出现对某些交易表现出偏好的问题。虽然这种方法有很多优点,但支付的汽油费在未来必然会发生变化。


今天高的东西几年后就会低,所以纳曼必须时刻注意这一点。否则,艾许只要稍等片刻,说不定就能利用这些不断变化的价值。


方法 3:潜艇发送方法

现在,虽然之前的两种方法可能适用于更简单的情况,但它们从未真正解决前端运行漏洞的根本原因:向矿工和其他恶意用户完全披露交易信息。


显而易见的是,只要这两方能够访问每笔交易的信息,就存在博弈系统的机会。显然,必须隐藏这种时间敏感信息的方法是必要的,这将我们带到潜艇发送方法,作为LibSubmarine智能合约库的一部分实现。


当使用这种方法时,他们会以矿工或普通用户无法真正利用的方式隐藏交易信息。加密在保护这些信息方面发挥着重要作用,根据所有者的判断,一旦将其添加到块中,就可以公开这些信息。

也就是说,即使这种方法并不完美,它提供的保护水平也比其他方法好得多,因为它愿意解决抢先交易发生的真正原因——无论是在现实世界还是在现实世界中。在区块链上。

规避领先漏洞的其他策略

当然,上一节中讨论的策略并不是保护智能合约免受“抢先交易”漏洞影响的唯一策略。


使用侧链,订单在链下进行,而结算在链上进行。由于这两个步骤发生在不同的平台上,这不仅有利于提高吞吐量,而且会阻止矿工或普通用户获取利用领先漏洞所需的信息。




另一种策略,即使本质上是理论上的,涉及随机化已在提交-显示方案中提交的特定回合的交易顺序。这是使用智能合约逻辑强制执行的。领跑者不会用这种方法排在前面,因为排序是由上述智能合约决定的。


最后,另一种方法涉及Injective Protocol的实施,在该协议中,用户为决定谁获得订单的最重要的 t 值解决可验证的延迟函数。因此,通过能够摆脱大多数区块链使用的随机排序系统,抢先攻击的可能性也降低了。