第十課 如何在Remix環境下進行Solidity代碼單步調試

1. 文章摘要

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

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

【說明】未列出的課程爲知識普及的非實操類課程,全部區塊鏈文章參考「區塊鏈入口」專欄。框架

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信息也能夠開始會話。ui

面板進入
做爲例子,運行「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環境構建,也只會在語法邊界中止;當該面板顯示時,纔可能逐步進入到構建函數內部,即便對應相同的語句。this

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」執行該交易函數。spa

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

4.參考文檔

1),REMIX調試英文官網文檔 2), SOLIDITY語言官網中文版

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

相關文章
相關標籤/搜索