如何調試一個EVM合約:實戰操作 + 常見報錯說明

在Solidity開發過程中,大多數開發者最常遇到的問題不是“代碼寫不了”,而是“代碼部署了,但行為不對”。

本篇文章將帶你梳理一套完整的EVM智能合約調試流程,并附上幾類真實常見報錯場景及排查方法,適用于Hardhat、Remix、Foundry等主流開發環境。

一、EVM合約調試核心邏輯

EVM合約不像前端應用那樣可以“console.log”,調試方式通常依賴:

  1. 事件日志(event logs)

  2. 交易回執(transaction receipts)

  3. 斷點調試(Remix)或調用棧追蹤(Hardhat/Foundry)

  4. 測試用例斷言失敗信息(assert/revert)

二、調試環境推薦

? 本地開發環境:Hardhat(推薦)

npm install --save-dev hardhat
  • 可用 console.log()(Hardhat 特有)打印鏈上執行數據

  • 可部署本地節點,測試 gas 消耗、交易結果

  • 配合 chai + ethers.js 進行單元測試斷言

? 在線IDE:Remix

  • 無需安裝環境,適合快速驗證

  • 支持斷點、變量可視化、事件監視器

? 高級調試工具:Tenderly / Foundry

  • Tenderly 提供事務可視化 + 模擬回滾

  • Foundry 支持快速測試生成、fuzz測試等更底層調試方式

三、常見報錯場景 + 調試建議


?? 1. revert / require 報錯

癥狀:交易失敗、回滾,提示 revert
常見原因

  • 輸入數據格式不對(如 uint256 被傳 string)

  • 權限不匹配(比如 require(msg.sender == owner)

  • 某個合約內部調用失敗,沒有 catch

調試方式

  • 查看 Hardhat 或 Remix 報錯的 reason 字符串

  • require() 中加入錯誤提示,例如:

require(balance >= amount, "Insufficient balance");

?? 2. 交易卡在 pending 狀態不執行

癥狀:發出的交易長時間未打包
可能原因

  • 本地測試環境 gasLimit 設置過低

  • 網絡未連接正確 RPC 節點

  • 交易已 nonce 沖突(常見于腳本調用)

調試方式

  • 檢查 provider 設置

  • 使用 Hardhat 的內置 reset 方法清空 pending tx

  • 使用 Remix 切換到“London”網絡設置,重新發送交易

?? 3. invalid opcode / out of gas 報錯

癥狀:執行時提示非法操作碼或 gas 耗盡
常見原因

  • 死循環、遞歸錯誤

  • 未正確初始化 storage 變量

  • 沒有預估 gas 的調用(如調用 view 函數但未 call()

調試方式

  • 增加 gasLimit 觀察是否與 gas 相關

  • 打開 Hardhat 控制臺打印調試 log:

import "hardhat/console.sol";
console.log("x=", x);

?? 4. 部署腳本失敗 / test 報錯但找不到原因

建議方法

  • 使用 console.log 定位部署流程中執行步驟

  • 加入斷言(assert)觀察狀態:

expect(await contract.owner()).to.eq(deployer.address);

把復雜邏輯拆成多個 it() 測試塊逐一驗證

四、進階技巧:調試復雜合約時的經驗總結

  • 把所有 require() 都寫上明確錯誤信息

  • 多用 event log 替代冗長狀態變量讀取

  • 模塊化寫合約,每個邏輯拆出一個函數便于單測

  • 給合約寫模擬用例(mock),測試依賴外部合約行為

五、附:基礎 Hardhat 調試模板(Solidity + JS)

// contracts/MyToken.sol
pragma solidity ^0.8.0;contract MyToken {address public owner;uint256 public totalSupply;constructor() {owner = msg.sender;}function mint(uint256 amount) external {require(msg.sender == owner, "Only owner can mint");totalSupply += amount;}
}
// test/MyToken.test.js
const { expect } = require("chai");describe("MyToken", function () {it("should mint correctly", async function () {const [deployer] = await ethers.getSigners();const Token = await ethers.getContractFactory("MyToken");const token = await Token.deploy();await token.mint(100);expect(await token.totalSupply()).to.equal(100);});
});

EVM 調試并不只是解決 bug,而是提升項目質量、用戶體驗、上線穩定性的關鍵環節。

別怕調試,多用工具,多寫斷言,多看日志。

#區塊鏈項目啟動指南 ?
#Solana發幣教程 ?
#智能合約部署 ?
#項目包裝方案 ?
#鏈上推廣實操 ?
#技術驅動創業 ?
#數字產品可視化 ?
#一站式上鏈支持 ?
#技術落地路徑 ?
#Web3增長方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97086.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97086.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97086.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Wireshark分析自助終端機網絡數據

如果是明文還好, 是密文就沒辦法了。工具.1自助終端機.2組裝結構主流架構選擇?B/S架構?:通過Web應用調用本地硬件插件,開發速度快但依賴瀏覽器兼容性。 ??C/S架構?:直接調用硬件驅動,交互響應快但更新維護復雜。 …

數學建模——馬爾科夫鏈(Markov Chain Model)

數學建模——馬爾科夫鏈(Markov Chain Model)一、馬爾可夫鏈的定義1. 狀態與狀態空間2. 無后效性(馬爾科夫性)?3. 轉移概率與轉移概率矩陣(1)一步轉移概率(2)轉移概率矩陣二、馬爾科…

《拉康精神分析學中的欲望辯證法:能指的拓撲學與主體的解構性重構》

在當代人文思想圖譜中,雅克拉康以語言學為利刃對弗洛伊德理論進行的結構性重鑄構成了20世紀最具顛覆性的理論創造之一。這位被譽為"法國弗洛伊德"的思想巨匠通過"回到弗洛伊德"的口號,實則完成了對精神分析學的哥白尼式革命——將主…

數字時代下的智能信息傳播引擎

在商場、樓宇、交通樞紐等公共場所,數字廣告機已成為信息傳播的重要載體。其背后的廣告機系統,是一套集硬件控制、內容管理、網絡傳輸與數據分析于一體的綜合技術解決方案,正推動傳統靜態廣告向動態化、交互化、智能化方向演進。系統架構與核…

文獻閱讀筆記:KalmanNet-融合神經網絡和卡爾曼濾波的部分已知動力學狀態估計

文獻閱讀筆記:KalmanNet-融合神經網絡和卡爾曼濾波的部分已知動力學狀態估計摘要一、研究背景1.1 狀態估計問題的重要性1.2 傳統方法的局限:非線性與模型不確定性非線性問題噪聲統計未知問題1.3 數據驅動方法的興起與局限1.4 KalmanNet:混合方…

使用EasyExcel根據模板導出文件

文章目錄概要工具類核心功能核心代碼解析模板導出核心方法文件下載處理HTTP響應設置文件下載處理使用示例概要 在企業級應用開發中,Excel數據導出是一個常見的需求。本文實現一個基于阿里巴巴EasyExcel庫實現的根據模板導出文件的工具類,它通過預定義的…

【AI基礎:神經網絡】19、機器學習實戰:徑向基函數神經網絡(RBFN)指南

一、引言:為什么RBFN是神經網絡中的“局部專家”? 在機器學習領域,神經網絡的“全局逼近”與“局部逼近”一直是兩大核心思路。像我們熟悉的多層感知機(MLP),使用Sigmoid、ReLU等全局激活函數,每個神經元都會對整個輸入空間產生響應——就像“全員參與”處理所有數據,…

Linux 性能調優實戰:CPU、磁盤 I/O、網絡與內核參數

前言 一、CPU 資源調優 1. 調整進程優先級(nice/renice) 2. 設置 CPU 親和力(taskset) 3. 查看 CPU 信息 4. 使用 vmstat 分析系統瓶頸 二、磁盤 I/O 調優 1. ulimit 資源限制 2. 磁盤速度測試 三、內核參數調優 1. 常用…

【進階篇第五彈】《詳解存儲過程》從0掌握MySQL中的存儲過程以及存儲函數

文章目錄存儲過程一、基本語法(1)創建存儲過程(2)調用存儲過程(3)查看存儲過程(4)刪除存儲過程(5)設置結束符(6)參數二、變量(1)系統變量(2)用戶自定義變量(3)局部變量三、基本語句(1)if判斷(2)case(3)while循環(4)repeat(5)loop循環四、游標五、條件處理程序六、存儲函數存儲過…

HarmonyOS布局實戰:用聲明式UI構建自適應電商卡片

首先誠邀大家參加學習鴻蒙拿好禮活動,即日起,只要加入班級考取華為開發者基礎/高級證書,并發表一篇技術文章,就有機會獲得官方發放的精美禮品,數量有限,先到先得。冷老師的班級鏈接如下:?華為開…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(21):文法+單詞第7回3

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(21):文法單詞第7回3 1、前言(1)情況說明(2)工程師的信仰2、知識點1ー 。。。と。。。なる2ーVて欲しい ? …

Baumer高防護相機如何通過Tiny-YOLO單類模型實現人體跌倒檢測與跟蹤(C#代碼UI界面版)

《------往期經典推薦------》 AI應用軟件開發實戰專欄【鏈接】 序號項目名稱項目名稱11.工業相機 YOLOv8 實現人物檢測識別:(C#代碼,UI界面版)2.工業相機 YOLOv8 實現PCB的缺陷檢測:(C#代碼&#xff0…

從源碼看瀏覽器彈窗消息機制:SetDefaultView 的創建、消息轉發與本地/在線頁通用實踐

引言在現代瀏覽器的開發中,前端頁面和 C 內核之間的通信是一項核心功能。無論是本地設置頁(chrome:// 內置 H5)還是在線活動頁,前端都可能需要調用瀏覽器底層 API,實現諸如“設置默認瀏覽器”、“更改壁紙”、“讀取用…

對比視頻處理單元(VPU)、圖形處理器(GPU)與中央處理器(CPU)

如今選擇互聯網點播流媒體與直播視頻的用戶數量已遠超傳統廣播電視,這一轉變催生了對高性能媒體轉碼與OTT流媒體功能專用技術的需求。 我們最新推出的Accelerated Compute云計算解決方案,首次通過NETINT Quadra視頻處理單元(VPU)…

vue3寫一個簡單的時間軸組件

插件版本:"element-plus": "^2.3.12""vue": "^3.0.0"代碼示例:樣式文件style.less:改變el-tooltip樣式,可以復制代碼到公共樣式文件.el-popper.o-el-tooltip-popper-class {max-width: 3…

Linex系統網絡管理(二)

二、網絡連接查看1. netstat作用查看本地服務的網絡監聽狀態查看客戶端連接到本地服務的連接狀態語法:netstat 選項 (-anptu)選項作用-n, --numeric顯示數字形式地址而不是去解析主機、端口或用戶名-a, --all顯示所有的監聽或連接…

Unity MQTT通訊

首先明確概念,什么是MQTT? MQTT是一種輕量級、基于發布 / 訂閱(Publish/Subscribe)模式的物聯網(IoT)通信協議,在帶寬有限、網絡不穩定的環境下,實現低功耗、低延遲的設備間通信&am…

JavaSE:類和對象2

一、封裝封裝的概念面向對象程序三大特性:封裝、繼承、多態。而類和對象階段,主要研究的就是封裝特性。何為封裝呢?簡單來說 就是套殼屏蔽細節。例如手機,你看不到任何的內部實現細節,只留下一些公開的接口給你使用&am…

RandAR訓練自己的數據集

論文題目:RandAR: Decoder-only Autoregressive Visual Generation in Random Orders(隨機順序下僅解碼器的自回歸視覺生成) 會議:CVPR2025 摘要:我們介紹了RandAR,一種僅解碼器的視覺自回歸(AR)模型,能夠以任意令牌順序生成圖像。與之前依賴于預定義生成順序的純解碼器…

基于PHP服裝租賃管理系統/基于php的服裝管理系統的設計與實現

基于PHP服裝租賃管理系統/基于php的服裝管理系統的設計與實現