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

筆名輝哥發表於2018-11-15

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

1. 文章摘要

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

【實操課程列表】 第一課 如何在WINDOWS環境下搭建以太坊開發環境 第二課 如何實現以太坊最簡智慧合約“Hello World”的執行 第四課 以太坊開發框架Truffle從入門到實戰 第六課 技術小白如何開發一個DAPP區塊鏈應用(以寵物商店為例) 第七課 技術小白如何在45分鐘內發行通證(TOKEN)並上線交易 第八課 如何除錯以太坊官網的智慧合約眾籌案例 第九課 如何在Remix環境下進行Solidity程式碼單步除錯 第十課 Solidity語言編輯器REMIX指導大全

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

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",恢復方法如下圖所示:記得輸入合約地址框不要加"" 哦。

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

4.參考文件

1),REMIX除錯英文官網文件 2), SOLIDITY語言官網中文版

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

相關文章