透過一個蜜罐合約來理解以太坊上的搶跑者

買賣虛擬貨幣

在這篇文章中,我將向你展示如何檢測以太坊的搶跑者。為此,我開發了特殊的“蜜罐(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 價格以取代原始交易。僅此而已。

嘗試自己引誘搶跑者

你也可以嘗試引誘搶跑者!為此,只需使用提供的智慧合約。

· 想象一下一些強密碼。假設是 nooneeverguess123
· 計算密碼的雜湊值。在etherscan “讀取合約” [頁面] (https://etherscan.io/address/0x9478abe9244872274808d324b968c30f29e1a442#readContract)上使用getHash方法,按Query,然後複製以0x為字首的長字串。

· 轉到“寫合約”部分,連線到Web3,然後找到lockEthersWithPassword方法。在payableAmount欄位中,指定要用作誘餌的以太幣數量(我認為0.01足夠了)。在提交的passwordHash中,填入在步驟2中複製的密碼雜湊。單擊write,確認交易,然後等待交易被挖出。

· 現在有趣的部分開始了!嘗試使用unlockEthersWithPassword方法取回你的以太幣。在密碼欄位中指定原始密碼(在我的情況下為nooneeverguess123)。單擊寫入,單擊確認,然後等待。

在彈出視窗中,你可以嘗試自定義 gas 價格(詳細資訊 -> gas 費 -> 編輯),以操縱被搶跑的成功概率。你指定的 gas 價格越多,確認交易的速度就越快,被搶佔先機的機會就越少。

如果您想獲得領先,請保留預設選項。

你的交易很可能會失敗!請參閱內部呼叫部分,以查詢前端交易的傳送者。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;