什麼是 Solidity console log?
作者 Turja
除錯是學習如何撰寫 Solidity 智能合約、修補漏洞、修復問題性錯誤的重要且反覆出現的步驟。智能合約中兩種典型的開發錯誤包括執行期錯誤與邏輯錯誤。
善用能夠強化開發者理解的工具,可以帶來更輕鬆的開發體驗,尤其是在修復程式中的錯誤時。與 JavaScript 開發類似,console.log() 函式用於將輸出訊息回傳至網頁主控台,有助於除錯過程。
console.log() 接受一個參數(例如陣列、物件或訊息),並將值印在網頁主控台供開發者評估。這個方法讓開發者可以透過逐步列出程式碼的輸出,來釐清可能發生的問題。
在本文中,我們將展示除錯 Solidity 的主要方式,檢視 Hardhat、Foundry、Truffle 與 Brownie 中的除錯工具,並提供除錯技巧。
什麼是 Solidity console log?
將訊息記錄到主控台是常用的除錯工具,而 console.log() 是 Hardhat 提供的合約函式庫中的函式。 將資訊輸出至主控台有助於開發者理解並排除程式中的問題。在 Solidity 中,這稱為事件(event)。
Ethereum 提供一種記錄功能,將資料儲存在區塊鏈中交易的日誌資料結構裡。Solidity 事件為此功能提供了一層抽象,讓開發者能夠在區塊鏈上輸出資料。
由於日誌會與合約位址一起完整保留在區塊鏈中,並隨著區塊持續可存取,Solidity 開發者可以查詢並參考區塊鏈上特定的交易資料。
使用 Solidity 事件的應用場景
Solidity 事件可以用於多種方式,包括測試智能合約、為交易資料建立索引、供前端開發參考等。最常見的情況下,開發者會在三種使用場景中使用事件:
- 在智能合約中回傳可供前端使用的值
- 作為非同步觸發器,讓智能合約發出事件以觸發前端執行某個動作
- 較便宜的儲存方式,因為資料是儲存在交易日誌中
在事件中,參數可以指定為 indexed 或 non-indexed。若合約已驗證,日誌中的交易資料會以編碼形式顯示,否則會顯示為 non-indexed 或雜湊值。
在其他情況下,如果開發過程是在 Hardhat 這類支援性環境中進行,除了事件之外,也可以使用 console.log() 函式,其運作方式與 JavaScript 開發類似。
為什麼 console log 很重要?
Console log 是智能合約除錯過程中開發者必備的工具。 Console log 是程式測試環境(console)與用來輸出資料的函式(log())的結合。
本質上,console log 提供程式在測試環境中的輸出,可用於開發與除錯過程。當程式出現錯誤或問題時,console log 通常會作為檢查程式碼、找出錯誤根源的第一步。
在撰寫 Solidity 智能合約時,console log 同樣是除錯過程中一個有效的步驟,可用來拆解程式碼並理解其邏輯。
Solidity 中的日誌記錄是如何運作的?
日誌記錄,又稱為事件監聽協定或事件(event),是由交易與區塊產生的訊號,用來提供智能合約本身無法取得的資訊。
Solidity 有「事件」(event)的概念。事件可以在智能合約函式中發出,並可有 0 至 4 個經過索引以便快速查詢的 topic。在 Solidity 中,使用 'emit' 關鍵字來發出事件。這會被轉換為 EVM 的其中一個 opcode:LOG0、LOG1、……、LOG4。
由於合約資料存於 States trie,而事件資料則儲存於 Transaction Receipts trie,因此智能合約無法讀取事件資料。
交易資料或日誌條目包含以下內容:
- Address — 合約位址
- Topic — 事件的 indexed 值
- Data — 事件的 ABI 編碼值或 non-indexed 值
Hardhat 中的 Solidity 除錯工具
Hardhat 是一個 Ethereum 開發環境,專注於讓開發者能在本地開發 Solidity 智能合約,並提供必要的 Solidity 除錯工具。
Hardhat 提供一整套用於測試、編譯、部署與除錯 應用程式的工具。透過 Hardhat Network,開發者可以透過 Solidity 介面在本地端建立、編譯並部署智能合約。
1. Console.log
在 Hardhat Network 中,console.log() 函式可作為輸出日誌訊息、並直接從 Solidity 程式碼中擷取細節的可靠工具。Hardhat Network 的設計目標是無論交易是否失敗,都能提供靈活且完整的執行檢查。
如何印出 Solidity console log
Solidity console log 的印出方式與 JavaScript 類似。完成匯入後,即可在函式中使用 console.log() 函式,依智能合約的情境印出特定的輸出內容。以下程式碼說明了這個過程。
首先,將 hardhat/console.sol 匯入智能合約
接著,將 console.log() 函式加入智能合約中特定的函式內:
注意:Hardhat 的 console log 工具只有在智能合約已匯入 hardhat/console.sol 之後才能使用。
2. Solidity stack trace
Hardhat 的 stack trace 工具結合了 JavaScript 與 Solidity,在交易發生或呼叫失敗時提供報告。這種自動化錯誤回報能為開發者提供有價值的資訊,以評估並除錯智能合約。
3. 明確的錯誤類型
Hardhat 提供多種可能的錯誤類型,可協助開發者簡化除錯過程,包括:
- general
- network
- task definition
- arguments
- dependencies resolution
- built-in tasks
- artifacts
- plugins
- internal
- source names
- contract names
Solidity console log 技巧:使用事件與函式來改善除錯
事件可用於將交易日誌中的資料輸出至主控台,適用於除錯與正式環境階段。事件可作為標記,用來指出某個流程是否發生。此外,事件也能指出在特定步驟是否出現問題。這個過程類似於 Solidity 中的「require」關鍵字,會檢查某個條件是否為真,並只有在該條件成立時才允許程式碼繼續執行。
要開始使用事件與函式改善除錯,需先建立一個定義完整的事件,並在函式中發出(emit)該事件。這兩個步驟可確保函式被呼叫時,事件會隨之發生。
其他 Solidity console log 工具
雖然 Hardhat 是建構、測試與除錯智能合約的業界標準 Solidity 開發工具,但仍有一些替代工具可用於排除 Solidity 程式碼中的問題,包括 Foundry、Truffle 與 Brownie。
1. Foundry
Foundry 提供一整套 Ethereum 智能合約開發工具,可管理依賴套件、編譯智能合約、部署、測試以及進行鏈上互動。
Foundry 工具套件可與 Hardhat 整合,運用其 console.log() 函式進行除錯。開發者可以呼叫此函式,並帶入最多 4 個參數,包括 uint、string、bool 與 address。
Forge
Forge 是與 Foundry 整合的命令列(CLI)工具,用於測試、建構與部署智能合約。此測試框架讓開發者能使用 Solidity、JavaScript 或 TypeScript 撰寫測試,並解鎖多項可用於除錯過程的功能。
forge 的 test 指令會自動執行 Solidity 測試,並進一步提供結果摘要,包括日誌與 stack trace。forge 的 debug 指令則是互動式除錯工具,可將單一智能合約作為腳本檢視,以找出程式中的錯誤。
Cast
Cast 是一個與 Ethereum RPC 呼叫互動的命令列介面(CLI)工具,可透過命令列進行智能合約呼叫、交易操作或鏈上資料查詢。
Anvil
Anvil 是與 Foundry 整合的本地測試網節點,讓開發者能透過前端或透過 RPC(Remote Procedure Calls)與相容於 EVM(Ethereum Virtual Machine)的網路互動,進行智能合約的部署與測試。
2. Truffle
Truffle 提供三種 Ethereum 智能合約開發者工具:開發環境、測試框架,以及區塊鏈用的資產管線(asset pipeline)。Truffle 完整的生態系統為開發者提供各種工具,用以建立、測試並除錯端對端的去中心化應用程式。
Truffle 提供的這些工具組包括:
- 智能合約工具套件 — 編譯、連結、部署等
- 除錯 — 中斷點、變數分析、單步執行功能、自動化合約測試
- 管理 — 網路、套件、遷移(migration)框架
深入了解: https://trufflesuite.com/docs/truffle/
3. Brownie
Brownie 是一個以 Python 為基礎的 Ethereum 智能合約開發與測試框架,支援 Solidity 與 Vyper,並分為 4 個類別:測試、除錯、互動與部署。每個步驟都支援開發者建立靈活的程式。
開發者可以使用各種除錯工具,取得交易失敗的詳細資訊,並定位、重現與排除 Solidity 錯誤。
- TransactionReceipt.revert_ms — 取得交易失敗的直接說明訊息
- TransactionReceipt.error() — 定位導致交易失敗的智能合約根源與區段
- TransactionReceipt.events — 檢視在還原(reverted)交易中觸發的事件
- TransactionReceipt.trace — 檢視包含交易資訊的字典(dictionary)清單
- TransactionReceipt.call_trace() — 檢視交易步驟的完整映射(trace)
開發者也可以使用 pytest 對智能合約進行單元測試,再檢視所提供的 stack trace 報告。
深入了解: https://eth-brownie.readthedocs.io/en/v1.2.1/index.html
透過 Alchemy University 學習 Solidity console log
本文介紹了開發 Solidity 智能合約時最常用的日誌記錄與除錯工具。如果你正在學習 Solidity,選擇最適合的智能合約除錯工具,對於解決開發過程中遇到的問題至關重要。
若要開始或加速你的 Solidity 開發訓練,可以探索 Alchemy University 免費、為期 7 週的 Solidity 開發者訓練營,這門課程原本是由 ChainShot 教授、售價 3,000 美元的認證課程,現已完全整合進 Alchemy!如果你完全是開發新手,Alchemy 的 3 週 JavaScript 速成課程是開始 Ethereum 訓練營之前很好的先修課程。
相關總覽

打造區塊鏈魔法
Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。


