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按鈕執行智能合約:Remix顯示交易相關的一些信息。在終端輸出器,此次交易被記錄,點擊”Debug”按鈕可開始調試。
2.2 從調試器開始
在”Debugger”控制面板進入,在對應的編輯框輸入transaction hash / block number、transaction index信息也可以開始會話。作為例子,運行“donate”函數后,點擊終端輸出器對應LOG的Detail按鈕展開交易信息,復制hash信息值輸入編輯框,點擊PLAY按鈕,即可進入Debug調試流程。
此效果等同于點擊交易信息的“Debug”按鈕。
3. 使用調試器
調試器允許查看交易合約執行的詳細信息。它使用左側的編輯器顯示執行時源碼的位置。
交易控制面板顯示當前交易合約的基礎信息。導航欄包括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面板顯示當前高亮顯示的運行合約的匯編語言。
注意:當該面板隱藏時,滑動條的運行粒度是一個course的,即使在多EVM環境構建,也只會在語法邊界停止;當該面板顯示時,才可能逐步進入到構建函數內部,即使對應相同的語句。
3.2 Solidity Locals面板
Solidity Locals面板顯示當前上下文環境的局部變量值。
3.3 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",恢復方法如下圖所示:記得輸入合約地址框不要加"" 哦。
4.參考文檔
1),REMIX調試英文官網文檔
2), SOLIDITY語言官網中文版
尊重知識輸出,如需引用,敬請說明本文鏈接和作者-筆名輝哥。