---
title: "什麼是 Solidity console log？"
description: "使用 Hardhat、Foundry 等工具印出日誌並除錯智能合約"
---

# 什麼是 Solidity console log？

除錯是[學習如何撰寫 Solidity 智能合約](https://www.alchemy.com/overviews/learn-solidity)、修補漏洞、修復問題性錯誤的重要且反覆出現的步驟。智能合約中兩種典型的開發錯誤包括執行期錯誤與邏輯錯誤。

善用能夠強化開發者理解的工具，可以帶來更輕鬆的開發體驗，尤其是在修復程式中的錯誤時。與 JavaScript 開發類似，`console.log()` 函式用於將輸出訊息回傳至網頁主控台，有助於除錯過程。

`console.log()` 接受一個參數（例如陣列、物件或訊息），並將值印在網頁主控台供開發者評估。這個方法讓開發者可以透過逐步列出程式碼的輸出，來釐清可能發生的問題。

在本文中，我們將展示除錯 [Solidity](https://www.alchemy.com/overviews/solidity) 的主要方式，檢視 [Hardhat](https://www.alchemy.com/dapps/hardhat)、Foundry、Truffle 與 [Brownie](https://www.alchemy.com/dapps/brownie) 中的除錯工具，並提供除錯技巧。

## **什麼是 Solidity console log？**

將訊息記錄到主控台是常用的除錯工具，而 `console.log()` **是 Hardhat 提供的合約函式庫中的函式。** 將資訊輸出至主控台有助於開發者理解並排除程式中的問題。在 [Solidity](https://www.alchemy.com/dapps/solidity) 中，這稱為事件（event）。

Ethereum 提供一種記錄功能，將資料儲存在區塊鏈中交易的日誌資料結構裡。Solidity 事件為此功能提供了一層抽象，讓開發者能夠在區塊鏈上輸出資料。

由於日誌會與合約位址一起完整保留在區塊鏈中，並隨著區塊持續可存取，Solidity 開發者可以查詢並參考區塊鏈上特定的交易資料。

### **使用 Solidity 事件的應用場景**

[Solidity 事件](https://www.alchemy.com/overviews/solidity-events)可以用於多種方式，包括測試智能合約、為交易資料建立索引、供前端開發參考等。最常見的情況下，開發者會在三種使用場景中使用事件：

1. 在智能合約中回傳可供前端使用的值
1. 作為非同步觸發器，讓智能合約發出事件以觸發前端執行某個動作
1. 較便宜的儲存方式，因為資料是儲存在交易日誌中

在事件中，參數可以指定為 indexed 或 non-indexed。若合約已驗證，日誌中的交易資料會以編碼形式顯示，否則會顯示為 non-indexed 或雜湊值。

在其他情況下，如果開發過程是在 **Hardhat** 這類支援性環境中進行，除了事件之外，也可以使用 `console.log()` 函式，其運作方式與 JavaScript 開發類似。

### **為什麼 console log 很重要？**

**Console log 是智能合約除錯過程中開發者必備的工具。** Console log 是程式測試環境（console）與用來輸出資料的函式（log()）的結合。

本質上，console log 提供程式在測試環境中的輸出，可用於開發與除錯過程。當程式出現錯誤或問題時，console log 通常會作為檢查程式碼、找出錯誤根源的第一步。

在撰寫 [Solidity 智能合約](https://www.alchemy.com/overviews/solidity-smart-contract)時，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](https://book.getfoundry.sh/) 是一個 Ethereum 開發環境，專注於讓開發者能在本地開發 Solidity 智能合約，並提供必要的 Solidity 除錯工具。

Hardhat 提供一整套用於測試、編譯、部署與除錯 [應用程式](https://www.alchemy.com/dapps/top/defi-dapps)的工具。透過 Hardhat Network，開發者可以透過 [Solidity 介面](https://www.alchemy.com/overviews/solidity-interface)在本地端建立、編譯並部署智能合約。

### **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」關鍵字](https://www.alchemy.com/overviews/solidity-require)，會檢查某個條件是否為真，並只有在該條件成立時才允許程式碼繼續執行。

要開始使用事件與函式改善除錯，需先建立一個定義完整的事件，並在函式中發出（emit）該事件。這兩個步驟可確保函式被呼叫時，事件會隨之發生。

## **其他 Solidity console log 工具**

雖然 Hardhat 是建構、測試與除錯智能合約的業界標準 Solidity 開發工具，但仍有一些替代工具可用於排除 Solidity 程式碼中的問題，包括 Foundry、Truffle 與 Brownie。

### **1. Foundry**

[Foundry](https://www.alchemy.com/dapps/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](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)）的網路互動，進行智能合約的部署與測試。

### **2. Truffle**

Truffle 提供三種 Ethereum 智能合約開發者工具：開發環境、測試框架，以及區塊鏈用的資產管線（asset pipeline）。Truffle 完整的生態系統為開發者提供各種工具，用以建立、測試並除錯端對端的去中心化應用程式。

Truffle 提供的這些工具組包括：

- **智能合約工具套件** — 編譯、連結、部署等
- **除錯** — 中斷點、變數分析、單步執行功能、自動化合約測試
- **管理** — 網路、套件、遷移（migration）框架

**深入了解：** [https://trufflesuite.com/docs/truffle/](https://trufflesuite.com/docs/truffle/)

### **3. Brownie**

Brownie 是一個以 Python 為基礎的 Ethereum 智能合約開發與測試框架，支援 [Solidity 與 Vyper](https://www.alchemy.com/overviews/solidity-vs-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 ](https://eth-brownie.readthedocs.io/en/v1.2.1/index.html)

## **透過 Alchemy University 學習 Solidity console log**

本文介紹了開發 Solidity 智能合約時最常用的日誌記錄與除錯工具。如果你正在學習 Solidity，選擇最適合的智能合約除錯工具，對於解決開發過程中遇到的問題至關重要。

若要開始或加速你的 Solidity 開發訓練，可以探索 Alchemy University 免費、為期 7 週的 [Solidity 開發者訓練營](https://www.alchemy.com/university/courses/solidity?a=671a6a00bd)，這門課程原本是由 ChainShot 教授、售價 3,000 美元的認證課程，現已完全整合進 Alchemy！如果你完全是開發新手，Alchemy 的 **3 週 JavaScript 速成課程**是開始 Ethereum 訓練營之前很好的先修課程。
