1. 程式人生 > >第九課 如何在Remix環境下進行Solidity程式碼單步除錯

第九課 如何在Remix環境下進行Solidity程式碼單步除錯

1. 文章摘要

【本文目標】 本文目標是指導如何使用REMIX完成一次智慧合約交易除錯。 【前置條件】 學習過Solidity語言,需要進行除錯。 【技術收穫】 1). 使用REMIX進行單步除錯 2). REMIX的Debugger介面介紹

【說明】未列出的課程為知識普及的非實操類課程,所有區塊鏈文章參考“區塊鏈入口”專欄。

#2. 開始除錯 REMIX有2種方式啟動除錯。 新建一個智慧合約檔案”Donation.sol”,複製以下程式碼:

contract Donation {
    address owner;
    event fundMoved(address _to, uint _amount);
    modifier onlyowner { if (msg.sender == owner) _; }
    address[] _giver;
    uint[] _values;

    function Donation() {
        owner = msg.sender;
    }

    function donate() payable {
        addGiver(msg.value);
    }

    function moveFund(address _to, uint _amount) onlyowner {
        uint balance = this.balance;
        uint amount = _amount;
        if (_amount <= this.balance) {
            if (_to.send(_amount)) {
                fundMoved(_to, _amount);
            } else {
                throw;
            }
        } else {
            throw;
        }
    }

    function addGiver(uint _amount) internal {
        _giver.push(msg.sender);
        _values.push(_amount);
    }
}

##2.1 從使用者介面開始

RUN執行環境選擇JavaScript VM ,它用於模擬客戶自定義環境,開始點選Create按鈕執行智慧合約:智慧合約建立

設定´value´的值為10,單位選擇ether,點選Donate 表示從當前賬號捐贈10個ETH給該智慧合約。交易轉移

Remix顯示交易相關的一些資訊。在終端輸出器,此次交易被記錄,點選”Debug”按鈕可開始除錯。

##2.2 從偵錯程式開始 在”Debugger”控制面板進入,在對應的編輯框輸入transaction hash / block number、transaction index資訊也可以開始會話。面板進入 作為例子,執行“donate”函式後,點選終端輸出器對應LOG的Detail按鈕展開交易資訊,複製hash資訊值輸入編輯框,點選PLAY按鈕,即可進入Debug除錯流程。 此效果等同於點選交易資訊的“Debug”按鈕。

#3. 使用偵錯程式 Transation資訊 偵錯程式允許檢視交易合約執行的詳細資訊。它使用左側的編輯器顯示執行時原始碼的位置。 交易控制面板顯示當前交易合約的基礎資訊。導航欄包括7個按鈕用於交易的單步除錯。 偵錯程式按鈕 從左到右的按鈕名稱: 1,step over back 2,step back 3, step into 4,step over forward 5,jump to the previous breakpoint 6,jump out 7, jump to the next breakpoint 下面有11個面板用於顯示執行的詳細資訊。 結果面板 ##3.1 Instructions面板 本案例執行交易的Instructions資訊

Instructions面板顯示當前高亮顯示的執行合約的組合語言。 注意:當該面板隱藏時,滑動條的執行粒度是一個course的,即使在多EVM環境構建,也只會在語法邊界停止;當該面板顯示時,才可能逐步進入到構建函式內部,即使對應相同的語句。

##3.2 Solidity Locals面板 Solidity Locals Solidity Locals面板顯示當前上下文環境的區域性變數值。

##3.3 Solidity State面板 Solidity State Solidity State面板顯示的是當前執行合約的狀態變數。

##3.4 Low level面板 其他低層級面板 以下面板顯示本次執行的低層次資訊: • Stack 堆疊 • Storages Changes 儲存改變 • Memory 記憶體 • Call Data 呼叫資料 • Call Stack 呼叫堆疊 • Return Value 返回值,只有當執行到RETURN原語才顯示 • Full Storages Changes 全儲存改變,只有在執行末尾才顯示所有改變的合約變化儲存

##3.5 交易回滾(Reverted Transaction) 交易回滾 一個交易合約可以回滾,例如因為GAS超限,程式丟擲 throw語句或者低層次的異常。 在這種場景下,識別異常和定位異常的程式碼位置是非常重要的。 當執行丟擲異常時,Remix將告警。warning 按鈕將在異常發生前跳轉到最後的執行原語。 需要說明的是,智慧合約交易的執行是事件級別的,就是無法如C++一樣在執行中改變變數值,只能一次執行完畢。偵錯程式記錄了執行的原語記錄,所以可以前進和回滾。對於回滾,就像影片回滾放映一樣,非常酷炫。

##3.6 Breakpoints斷點和單步除錯 導航欄的5,7按鈕按鈕用於回滾到前一個斷點和執行到下一個斷點。 在左側編輯框的行數處單擊即可增加和刪除斷點。 作為樣例,在18行和20行雙擊,設定2個斷點,在Run面板的moveFund輸入框內輸入引數,給第二個賬號轉移0.0005個ETH。點選”MoveFund”執行該交易函式。

“0x14723a09acff6d2a60dcdf7aa4aff308fddc160c”,500000000000000

合約交易執行成功後,點選終端輸出器中的Debug按鈕,點選除錯面板的“Jump to the next breakpoint”程式會執行到第一個斷點處。 執行到第一個斷點

再點選“Jump to the next breakpoint”按鈕一次,直接執行到20行第二個斷點處。 點選”Jump out”函式跳出該函式,執行完成後可以看到第二個賬號餘額發生了改變,增加了0.0005個ETH。 點選展開Detail,可以看到EVENT事件記錄的引數資訊。 執行結果

##3.7 切換賬號呼叫存量合約 REMIX在“Environment”採用“Injected WEB3”的方式下,切換賬號會導致智慧合約呈現消失。 此時可以通過呼叫合約地址的方式把合約和命令復原回來。 例如我有一個部署在ropsten的智慧合約,地址為"0xbb7695fe978176cbe86d27b9e2b4e9eff1a04f82",恢復方法如下圖所示:記得輸入合約地址框不要加"" 哦。

尊重知識輸出,如需引用,敬請說明本文連結和作者-筆名輝哥。