如何調試以太坊智能合約
在區塊鏈中調試事務不同於調試傳統的應用程序構建在C ++或JavaScript上,因為您沒有實時運行代碼,而是在區塊鏈中,歷史事務執行與關聯代碼映射以調試事務。
智能合約是在區塊鏈頂部運行的一段代碼,智能合約需要以精確的方式理解,調試智能合約正逐步分析事務如何在內部工作和繼續或實際事務失敗的位置。
讓我們首先討論關於調試事務的詳細內容的錯誤類型。
可靠性中的錯誤類型 – 1.語法錯誤
當智能合約代碼的語法出現問題時會出現語法錯誤,當您的代碼出現語法錯誤時,您的智能合約將無法在區塊鏈上編譯或部署。
語法錯誤可以使用remix輕鬆診斷,如下圖所示,當在remix IDE中從上面的代碼中刪除分號(;)時,它會顯示帶有語法錯誤解決方案的錯誤消息。
使用truffle,remix或任何IDE可以輕鬆診斷語法錯誤。
2.運行時錯誤
只有當您將智能合約部署到區塊鏈並且您的可靠性代碼已編譯為EVM(以太坊虛擬機)已理解的位元組碼時,才會出現運行時錯誤。 EVM被定義為以太坊的一個組件,它運行可靠性代碼,當EVM認為您的智能合約代碼出錯或者您正在根據代碼邏輯進行交易時,會出現運行時錯誤。
運行時錯誤比語法錯誤更難診斷,因為在部署區塊鏈之前未識別這些錯誤,只有在智能合約中發生狀態更改時才會出現這些錯誤,我們將討論有關運行時錯誤和運行時錯誤調試的更多信息。細節。
3.邏輯錯誤
邏輯錯誤無法使用任何IDE或工具進行調試,因為EVM不捕獲邏輯錯誤,根據EVM,一切都很完美,代碼可以輕鬆運行。當開發人員在攻擊者的智能合約中出錯並打開循環漏洞時,就會出現邏輯錯誤。
邏輯錯誤的示例:著名的DAO攻擊(Reentrancy)是一個邏輯錯誤的示例,其中開發人員在更新用戶餘額之前犯了錯誤並轉移了以太。
審計智能合約可以識別邏輯錯誤,因為有時根據開發人員的心態,一切進展順利,智能合約中可能沒有錯誤,但審計員可以運行智能合約,意圖找到循環漏洞,檢查業務邏輯和找到智能合約中的安全漏洞。
正式驗證可能會用於智能合約的邏輯驗證。
運行時錯誤的類型
沒氣了
如果您沒有提供足夠的氣體來執行交易,或者天然氣不足以完成交易,則會出現氣體錯誤。
還原
當您嘗試執行無法根據智能合約的邏輯執行的事務時,將發生事務恢復,因此EVM將返回錯誤並恢復事務。
操作碼無效
當您嘗試調用不存在的代碼時,會出現無效的操作碼。
跳轉無效
當您嘗試調用不存在的函數時會發生無效跳轉,例如,如果通過另一個不存在的合約調用合約函數,則會發生無效跳轉。使用彙編語言並指向錯誤的內存時,也會發生此類錯誤。
堆棧溢出
當你試圖以遞歸方式調用函數並且沒有條件來阻止它時發生堆棧溢出,在固態堆棧中最多可以是1024幀,因此一個函數只能調用自己1024倍,如果超過該堆棧將發生溢出。
堆棧下溢
當您嘗試彈出不存在的變數時,堆棧下溢以彙編語言發生。
示例Smart Contract代碼,用於調試所有類型的錯誤和事務 – pragma solidity 0.4.24;合約樣本{uint256 public amountInContract;解決公共金額的問題; constructor(address _owner)public payable {require(_owner= address(0));要求(msg.value> 0.1以太); amountInContract = msg.value; amountOwner = _owner; } function()external {revert();函數withdraw()public {require(msg.sender == amountOwner); msg.sender.transfer(地址(本).balance);調試器提供了逐步調試任何事務(創建或調用)並可視化內存/存儲空間的功能。它有助於通過操作碼和每步後的剩餘氣體來追蹤氣體成本。調試交易 –
在上面的代碼中,指定的構造函數是可以支付的,而部署合約構造函數需要將ether值發送到0.1以上。如果發送的ether少於0.1或地址為零,則會拋出錯誤並恢復事務。
如下所示,事務被還原,因此我們將使用remix IDE逐步調試事務。
步驟1.部署事務使用remix提交給以太坊區塊鏈後,交易失敗,如上所示。現在按下remix IDE中的調試器按鈕來調試事務並找出事務失敗的可能原因。
步驟2.要開始調試,請提供塊編號和事務哈希,然後按開始調試按鈕,這將啟動調試過程。
如上所示,在調試事務時顯示彙編語言操作以及使用的氣體和剩餘氣體,還在混合IDE中突出顯示代碼,其中實際事務與操作碼並行失敗,如下所示。
事務在程序集操作碼中恢復。在實際事務還原的位置突出顯示代碼。
如上圖所示,交易在etherscan中被恢復,發送的值為0.1以太,小於所需值;這就是在這種情況下交易失敗的原因。
此過程可用於調試任何事務,以了解有關使用的氣體,每個步驟的剩餘氣體,狀態變化以及可視化存儲器/存儲空間的更多信息。
使用Truffle框架也可以完成智能合約調試,需要事務哈希來調試事務。
謝謝閱讀。另外,請查看我之前關於以太坊網路潛在攻擊的博客給Mint GasTokens。
讓我們更多地討論區塊鏈安全問題,在我的電報處理器上ping我 – @ abhi_blockchain,與QuillAudits一起為你的dapps和智能合約提供著名的安全平台。