Contract-Debugging

在主網上調試失敗的交易

  • April 10, 2022

我們在主網上部署了一個智能合約,最近的一些交易已經開始失敗。知道我們如何開始調試合約嗎?

合約地址:0x81EAF1fF62BB8ccaa5314287B14e75E04E21b8F2

已失敗0x7ea699902c6a4be61d0037baaabbb8be5269cb2956c2fe617e88b82304aba615 0x1e29f225021bc9f9c886bdcb1a5a69af98ae5b7821773c40f0ad23a82975c8e5 0xbe4853a7d079ef35e88bdb3c5e2f44ced4263d13ced64563143514400a342b1b最近三筆交易

嘗試seth debug <txhash>在分叉的主網上使用 dapptools!

我知道這是一個舊文章,但對於任何發現這個的人,希望這可以提供幫助。

我一直在溫柔地使用,因為我無法閱讀掃描站點上的 geth debug 2 工具,並且目前正在自己​​調試一個問題。

https://dashboard.tenderly.co/

當我的交易只是說“失敗”時,它會讓我更清楚地了解原因,除非它立即恢復。

我絕不是專家,但是對於這個問題的前 3 個雜湊值,它們在合約被呼叫後基本上都恢復了。

在許多情況下,這通常意味著在通過合約時輸入參數不正確和/或合約****試圖進行一些計算並立即失敗。

我自己的一個非常具體的例子是當我向我的合約發送字節並錯誤地解碼它們時。

function encodeStuff(
       address myAddress,
       uint256 amount, 
       address someAddress,
       bytes calldata swapData
   ) external  {

       bytes memory data = abi.encode(myAddress, amount, someAddress, swapData);
 
   }

然後在解碼時的另一個函式中,我嘗試將 swapData 字節與所有內容解包:

       (
        address myAddress,
        uint256 amount, 
        address someAddress,
        address someAddress1,
        address someAddress2,
        address someAddress3,
        address someAddress4,
        bytes memory extra_data1,
        address token_address,
        bytes memory extra_data2

       ) = abi.decode(swapdata, 
       ( 
           address
           uint256
           address
           address, 
           address, 
           address,
           address,
           bytes, 
           address, 
           bytes
       ));

因為我這樣做了,所以當它看到沒有額外的數據要解碼時,事務立即恢復bytes memory data

我實際上需要解碼兩次。

// First decode data to get swapData bytes
(address myAddress, uint256 amount, address someAddress, bytes memory swapData) = abi.decode(data, (address, uint256, address, bytes));

// Now decode swapData
(
        address someAddress1,
        address someAddress2,
        address someAddress3,
        address someAddress4,
        bytes memory extra_data1,
        address token_address,
        bytes memory extra_data2

       ) = abi.decode(swapdata, 
       (
           address, 
           address, 
           address,
           address,
           bytes, 
           address, 
           bytes
       ));

這個問題非常具體,但錯誤會出現在掃描站點上,就像這個問題中的雜湊一樣,“失敗”,沒有太多額外的數據。

如果我能更深入地了解不需要手臂或腿的調試方法,我會更新它。

引用自:https://ethereum.stackexchange.com/questions/52157