第九課 如何在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. 使用偵錯程式 偵錯程式允許檢視交易合約執行的詳細資訊。它使用左側的編輯器顯示執行時原始碼的位置。 交易控制面板顯示當前交易合約的基礎資訊。導航欄包括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",恢復方法如下圖所示:記得輸入合約地址框不要加"" 哦。
尊重知識輸出,如需引用,敬請說明本文連結和作者-筆名輝哥。