通过一个蜜罐合约来理解以太坊上的抢跑者

在以太坊网络有这样一批人,通过更高的 gas 价格来抢走交易收益。

在这篇文章中,我将向你展示如何检测以太坊的抢跑者。为此,我开发了特殊的“蜜罐(honey pot)”合约,该合约允许任何人以足够快的速度提取一些以太币。我们将让抢跑者这样做,以便研究他们的行为。 ![蜜罐合约来检测以太坊上的抢跑者](https://img.learnblockchain.cn/pics/20201017172017.png) 可能这不是最好的方法,因为你应该允许一些人窃取你真实的ETH。最好的办法是监视内存池,并尝试识别高gas优先的交易(PGA:Priority Gas Auctions)。但这不是一件容易的事,需要更多的开发,所以让我们从简单的研究开始。 ## 蜜罐合约 为了演示,我编写了一个简洁但功能强大的智能合约。你只能通过两种方式与合约交互 – 锁定以太币和解锁(撤回)以太币。过程很简单: – 想象一些难以猜测的强密码。 – 计算密码的哈希值(假设为sha256) – 通过提供密码的哈希值来锁定你的以太币 – 通过提供原始密码来解锁你的以太币。合约将自行计算哈希并将其与步骤2中指定的哈希运算进行比较。如果哈希匹配 – 合约将向你发送锁定的以太币。很容易看到 – 只有你可以提取以太币,因为没有人知道原始密码。真的吗? “`solidity pragma solidity ^0.6.0; contract TryToGetYourMoney { mapping(bytes32 => uint) passwordHashToBalance; function lockEthersWithPassword( bytes32 passwordHash ) public payable { passwordHashToBalance[passwordHash] += msg.value; } function getHash(string memory raw) public view returns(bytes32) { return keccak256(abi.encodePacked(raw)); } function unlockEthersWithPassword( string memory password ) public { bytes32 passwordHash = getHash(password); require( passwordHashToBalance[passwordHash] > 0, “No Ethers locked with specified password” ); msg.sender.transfer(passwordHashToBalance[passwordHash]); passwordHashToBalance[passwordHash] = 0; } } “` 好吧,可能不是。任何抢跑者都可以在交易处于待处理状态时看到该交易,提取原始密码,并以更高的 gas 价格发送自己的解锁交易。由于较高的 gas 价格意味着更快的确认,因此抢跑者的交易可能将首先被挖出,并且他会收到你的以太币。 ## 进行实验 我已经在以太坊主网络中部署了以上合约([0x9478abe9244872274808d324b968c30f29e1a442] (https://etherscan.io/address/0x9478abe9244872274808d324b968c30f29e1a442)).我已经尝试过两次锁定以太坊并对其进行解锁-两项解锁交易均已在前端进行! ![img](https://img.learnblockchain.cn/pics/20201017172040.png) > 两个锁-0.1 ETH和0.05 ETH。 两个失败的交易是解锁交易。 他们失败了,因为有人已经窃取了锁定的ETH! 让我们看看为什么交易失败。你可以看到原因相同:“No Ethers locked with specified password”。但是怎么可能呢?为了回答这个问题,让我们看一下Etherscan的 **Internal txns**部分: ![img](https://img.learnblockchain.cn/pics/20201017173847.png) 通过这些交易,抢跑者窃取了我的ETH。让我们比较一下我的交易0xa88 ..和0x3fa ….他们俩都试图解锁0.1以太币。 ![img](https://img.learnblockchain.cn/pics/20201017173852.jpg) > 我的交易在左边,抢跑交易在右边。 查看 gas 价格如何影响确认时间。我的交易价格为50 Gwei ,在3分钟内得到确认。抢跑者指定了58 Gwei – 在30秒内进行了确认!即使我先发送了解锁交易,但他的交易被确认比我早11个区块。 ## 他们是怎么做到的? 打造抢跑机器人没有任何技术上的障碍。首先,你需要监视所有新的以太坊交易。由于你想成为第一个了解新交易的人,因此你可能需要在世界各地使用多个交易侦听器。 收到有关新交易的通知后,你需要模拟相同的调用,但是使用你自己的地址。如果交易未还原(即没有失败),而你的收益超过了支出,请将其发送到主网!此外,别忘了设定更高的 gas 价格以取代原始交易。仅此而已。 ## 尝试自己引诱抢跑者 你也可以尝试引诱抢跑者!为此,只需使用提供的智能合约。 – 想象一下一些强密码。假设是 **nooneeverguess123** – 计算密码的哈希值。在etherscan “读取合约” [页面] (https://etherscan.io/address/0x9478abe9244872274808d324b968c30f29e1a442#readContract)上使用**getHash**方法,按Query,然后复制以0x为前缀的长字符串。 ![img](https://img.learnblockchain.cn/pics/20201017173900.png) – 转到“写合约”部分,连接到Web3,然后找到`lockEthersWithPassword`方法。在`payableAmount`字段中,指定要用作诱饵的以太币数量(我认为0.01足够了)。在提交的`passwordHash`中,填入在步骤2中复制的密码哈希。单击`write`,确认交易,然后等待交易被挖出。 ![img](https://img.learnblockchain.cn/pics/20201017173908.png) – 现在有趣的部分开始了!尝试使用`unlockEthersWithPassword`方法取回你的以太币。在密码字段中指定原始密码(在我的情况下为`nooneeverguess123`)。单击写入,单击确认,然后等待。 ![img](https://img.learnblockchain.cn/pics/20201017173913.png) 在弹出窗口中,你可以尝试自定义 gas 价格(详细信息 -> gas 费 -> 编辑),以操纵被抢跑的成功概率。你指定的 gas 价格越多,确认交易的速度就越快,被抢占先机的机会就越少。 ![img](https://img.learnblockchain.cn/pics/20201017173920.png) > 如果您想获得领先,请保留默认选项。 你的交易很可能会失败!请参阅内部调用部分,以查找前端交易的发送者。 —— 原文:https://sergeypotekhin.com/detect-ethereum-front-runners/ 作者:谢尔盖·波泰欣(Sergey Potekhin)

在这篇文章中,我将向你展示如何检测以太坊的抢跑者。为此,我开发了特殊的“蜜罐(honey pot)”合约,该合约允许任何人以足够快的速度提取一些以太币。我们将让抢跑者这样做,以便研究他们的行为。

通过一个蜜罐合约来理解以太坊上的抢跑者

可能这不是最好的方法,因为你应该允许一些人窃取你真实的ETH。最好的办法是监视内存池,并尝试识别高gas优先的交易(PGA:Priority Gas Auctions)。但这不是一件容易的事,需要更多的开发,所以让我们从简单的研究开始。

蜜罐合约

为了演示,我编写了一个简洁但功能强大的智能合约。你只能通过两种方式与合约交互 – 锁定以太币和解锁(撤回)以太币。过程很简单:

  • 想象一些难以猜测的强密码。
  • 计算密码的哈希值(假设为sha256)
  • 通过提供密码的哈希值来锁定你的以太币
  • 通过提供原始密码来解锁你的以太币。合约将自行计算哈希并将其与步骤2中指定的哈希运算进行比较。如果哈希匹配 – 合约将向你发送锁定的以太币。很容易看到 – 只有你可以提取以太币,因为没有人知道原始密码。真的吗?
pragma solidity ^0.6.0;

contract TryToGetYourMoney {
    mapping(bytes32 => uint) passwordHashToBalance;

    function lockEthersWithPassword(
        bytes32 passwordHash
    ) public payable {
        passwordHashToBalance[passwordHash] += msg.value;
    }

    function getHash(string memory raw) public view returns(bytes32) {
        return keccak256(abi.encodePacked(raw));
    }

    function unlockEthersWithPassword(
        string memory password
    ) public {
        bytes32 passwordHash = getHash(password);

        require(
            passwordHashToBalance[passwordHash] > 0,
            "No Ethers locked with specified password"
        );

        msg.sender.transfer(passwordHashToBalance[passwordHash]);

        passwordHashToBalance[passwordHash] = 0;
    }
}

好吧,可能不是。任何抢跑者都可以在交易处于待处理状态时看到该交易,提取原始密码,并以更高的 gas 价格发送自己的解锁交易。由于较高的 gas 价格意味着更快的确认,因此抢跑者的交易可能将首先被挖出,并且他会收到你的以太币。

进行实验

我已经在以太坊主网络中部署了以上合约([0x9478abe9244872274808d324b968c30f29e1a442] (https://etherscan.io/address/0x9478abe9244872274808d324b968c30f29e1a442)).我已经尝试过两次锁定以太坊并对其进行解锁-两项解锁交易均已在前端进行

通过一个蜜罐合约来理解以太坊上的抢跑者

两个锁-0.1 ETH和0.05 ETH。 两个失败的交易是解锁交易。 他们失败了,因为有人已经窃取了锁定的ETH!

让我们看看为什么交易失败。你可以看到原因相同:“No Ethers locked with specified password”。但是怎么可能呢?为了回答这个问题,让我们看一下Etherscan的 Internal txns部分:

通过一个蜜罐合约来理解以太坊上的抢跑者

通过这些交易,抢跑者窃取了我的ETH。让我们比较一下我的交易0xa88 ..和0x3fa ….他们俩都试图解锁0.1以太币。

通过一个蜜罐合约来理解以太坊上的抢跑者

我的交易在左边,抢跑交易在右边。

查看 gas 价格如何影响确认时间。我的交易价格为50 Gwei ,在3分钟内得到确认。抢跑者指定了58 Gwei – 在30秒内进行了确认!即使我先发送了解锁交易,但他的交易被确认比我早11个区块。

他们是怎么做到的?

打造抢跑机器人没有任何技术上的障碍。首先,你需要监视所有新的以太坊交易。由于你想成为第一个了解新交易的人,因此你可能需要在世界各地使用多个交易侦听器。

收到有关新交易的通知后,你需要模拟相同的调用,但是使用你自己的地址。如果交易未还原(即没有失败),而你的收益超过了支出,请将其发送到主网!此外,别忘了设定更高的 gas 价格以取代原始交易。仅此而已。

尝试自己引诱抢跑者

你也可以尝试引诱抢跑者!为此,只需使用提供的智能合约。

通过一个蜜罐合约来理解以太坊上的抢跑者

  • 转到“写合约”部分,连接到Web3,然后找到lockEthersWithPassword方法。在payableAmount字段中,指定要用作诱饵的以太币数量(我认为0.01足够了)。在提交的passwordHash中,填入在步骤2中复制的密码哈希。单击write,确认交易,然后等待交易被挖出。

通过一个蜜罐合约来理解以太坊上的抢跑者

  • 现在有趣的部分开始了!尝试使用unlockEthersWithPassword方法取回你的以太币。在密码字段中指定原始密码(在我的情况下为nooneeverguess123)。单击写入,单击确认,然后等待。

通过一个蜜罐合约来理解以太坊上的抢跑者

在弹出窗口中,你可以尝试自定义 gas 价格(详细信息 -> gas 费 -> 编辑),以操纵被抢跑的成功概率。你指定的 gas 价格越多,确认交易的速度就越快,被抢占先机的机会就越少。

通过一个蜜罐合约来理解以太坊上的抢跑者

如果您想获得领先,请保留默认选项。

你的交易很可能会失败!请参阅内部调用部分,以查找前端交易的发送者。

原文:https://sergeypotekhin.com/detect-ethereum-front-runners/ 作者:谢尔盖·波泰欣(Sergey Potekhin)

本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

  • 发表于 2020-10-17 19:56
  • 阅读 ( 315 )
  • 学分 ( 58 )
  • 分类:以太坊

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/27634

联系我们

aliyinhang@gmail.com