33

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

 3 years ago
source link: https://learnblockchain.cn/article/1595
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

qiM3Q3.png!mobile

可能这不是最好的方法,因为你应该允许一些人窃取你真实的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)).我已经尝试过两次锁定以太坊并对其进行解锁-两项解锁交易均已在前端进行!

juUzy2Z.png!mobile

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

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

UNNRN3q.png!mobile

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

vaIzQzi.jpg!mobile

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

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

他们是怎么做到的?

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

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

尝试自己引诱抢跑者

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

  • 想象一下一些强密码。假设是 nooneeverguess123

  • 计算密码的哈希值。在etherscan “读取合约” [页面] (https://etherscan.io/address/0x9478abe9244872274808d324b968c30f29e1a442#readContract)上使用 getHash 方法,按Query,然后复制以0x为前缀的长字符串。

ve2IneA.png!mobile

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

iAvqauB.png!mobile

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

vqYzuy.png!mobile

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

qu22yeY.png!mobile

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

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

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

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

qiM3Q3.png!mobile

可能这不是最好的方法,因为你应该允许一些人窃取你真实的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)).我已经尝试过两次锁定以太坊并对其进行解锁-两项解锁交易均已在前端进行

juUzy2Z.png!mobile

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

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

UNNRN3q.png!mobile

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

vaIzQzi.jpg!mobile

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

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

他们是怎么做到的?

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

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

尝试自己引诱抢跑者

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

ve2IneA.png!mobile

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

iAvqauB.png!mobile

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

vqYzuy.png!mobile

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

qu22yeY.png!mobile

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

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

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

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

  • 发表于 21分钟前
  • 阅读 ( 5 )
  • 学分 ( 0 )
  • 分类:以太坊

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK