---
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)에서는 이를 이벤트라고 부른다.

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())가 결합된 것이다.

본질적으로 콘솔 로그는 개발 및 디버깅 과정에서 활용할 수 있는, 테스트 환경에서의 프로그램 출력을 제공한다. 프로그램에서 오류나 문제가 발생하면, 콘솔 로그는 코드를 검사하고 버그의 근본 원인을 파악하는 첫 단계로 사용된다.

[Solidity 스마트 컨트랙트](https://www.alchemy.com/overviews/solidity-smart-contract)를 작성할 때도 콘솔 로그는 코드를 추출하고 로직을 이해하는 디버깅 과정에서 마찬가지로 효과적인 단계로 작용한다.

### **Solidity에서 로깅은 어떻게 작동하는가?**

**로깅은 이벤트 감시 프로토콜 또는 이벤트라고도 불리며, 트랜잭션과 블록에 의해 생성되는 신호를 통해 스마트 컨트랙트만으로는 얻을 수 없는 정보를 제공하는 결과물이다.**

Solidity에는 '이벤트'라는 개념이 있다. 이벤트는 스마트 컨트랙트 함수 내에서 발생시킬 수 있으며, 빠른 조회를 위해 인덱싱되는 0개에서 4개의 토픽을 가질 수 있다. Solidity에서는 이벤트를 발생시킬 때 'emit' 키워드를 사용한다. 이는 EVM의 옵코드인 LOG0, LOG1, ..., LOG4 중 하나로 변환된다.

컨트랙트 데이터는 States trie에 저장되고 이벤트 데이터는 Transaction Receipts trie에 저장되기 때문에, 스마트 컨트랙트는 이벤트 데이터를 읽을 수 없다.

트랜잭션 데이터 또는 로그 항목은 다음으로 구성된다:

- **Address** - 컨트랙트의 주소
- Topic - 이벤트의 indexed 값
- Data - 이벤트의 ABI 인코딩된 값 또는 non-indexed 값

## **Hardhat의 Solidity 디버깅 도구**

[Hardhat](https://book.getfoundry.sh/)은 개발자가 Solidity 스마트 컨트랙트를 로컬에서 개발할 수 있게 하고 필수적인 Solidity 디버깅 도구를 제공하는 데 초점을 맞춘 Ethereum 개발 환경이다.

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와 유사한 구조로 출력할 수 있다. import를 완료하면, `console.log()` 함수를 함수 내에서 사용하여 스마트 컨트랙트의 맥락에 따라 특정 출력을 인쇄할 수 있다. 다음 코드는 그 과정을 보여준다.

**먼저, hardhat/console.sol을 스마트 컨트랙트에 import한다**

다음으로, 스마트 컨트랙트 내 특정 함수에 `console.log()` **함수를 추가한다:**

참고: Hardhat의 console log 도구는 hardhat/console.sol이 스마트 컨트랙트에 import된 경우에만 사용할 수 있다.

### **2. Solidity 스택 트레이스**

Hardhat의 스택 트레이스 도구는 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)와 유사한데, 이는 조건이 참인지 확인하고 요구되는 조건이 참일 때만 코드가 흐르도록 허용한다.

이벤트와 함수를 사용해 디버깅을 개선하려면, 이벤트를 제대로 정의하고 함수 내에서 해당 이벤트를 발생시키면 된다. 이 두 단계를 거치면 함수가 호출될 때마다 이벤트가 발생하게 된다.

## **추가적인 Solidity console log 도구**

Hardhat은 스마트 컨트랙트를 빌드, 테스트, 디버깅하기 위한 업계 표준 Solidity 개발 도구지만, Solidity 코드 문제를 해결하기 위한 대안 도구로 Foundry, Truffle, Brownie가 있다.

### **1. Foundry**

[Foundry](https://www.alchemy.com/dapps/foundry)는 의존성 관리, 스마트 컨트랙트 컴파일, 배포, 테스트, 온체인 상호작용을 가능하게 하는 Ethereum 스마트 컨트랙트 개발 도구 모음을 제공한다.

Foundry 툴킷은 Hardhat과 통합하여 디버깅 과정에 `console.log()` 함수를 활용할 수 있다. 개발자는 uint, string, bool, address를 포함해 최대 4개의 매개변수로 이 함수를 호출할 수 있다.

#### **Forge**

Forge는 Foundry에 통합된 명령줄(CLI) 도구로, 스마트 컨트랙트를 테스트, 빌드, 배포하는 데 사용된다. 이 테스트 프레임워크를 통해 개발자는 JavaScript나 TypeScript를 사용해 Solidity로 테스트를 작성할 수 있으며, 디버깅 과정을 위한 다양한 기능도 활용할 수 있다.

forge `test` 명령은 Solidity 테스트를 자동화하고 로그와 스택 트레이스를 포함한 결과 요약을 제공한다. forge `debug` 명령은 단일 스마트 컨트랙트를 스크립트처럼 검토하여 프로그램의 오류를 찾아내는 대화형 디버거이기도 하다.

#### **Cast**

Cast는 Ethereum RPC 호출과 상호작용하는 명령줄 인터페이스(CLI) 도구다. 이는 스마트 컨트랙트 호출, 트랜잭션, 또는 명령줄을 통한 체인 데이터 조회로 구성된다.

#### **Anvil**

Anvil은 Foundry에 통합된 로컬 테스트넷 노드로, 프론트엔드를 통하거나 EVM([Ethereum Virtual Machine](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)) 호환 네트워크와의 RPC(Remote Procedure Calls) 상호작용을 통해 스마트 컨트랙트를 배포하고 테스트할 수 있게 해준다.

### **2. Truffle**

Truffle은 개발 환경, 테스트 프레임워크, 블록체인용 자산 파이프라인이라는 세 가지 Ethereum 스마트 컨트랙트 개발자 도구를 제공한다. Truffle의 포괄적인 생태계는 개발자에게 엔드투엔드 탈중앙화 애플리케이션을 만들고, 테스트하고, 디버깅할 수 있는 다양한 도구를 제공한다.

Truffle이 제공하는 도구 모음은 다음과 같다:

- **스마트 컨트랙트 툴킷** - 컴파일, 링킹, 배포 등
- **디버깅** - 브레이크포인트, 변수 분석, 스텝 기능, 자동화된 컨트랙트 테스트
- **관리** - 네트워크, 패키지, 마이그레이션 프레임워크

**더 알아보기:** [https://trufflesuite.com/docs/truffle/](https://trufflesuite.com/docs/truffle/)

### **3. Brownie**

Brownie는 [Solidity와 Vyper](https://www.alchemy.com/overviews/solidity-vs-vyper)를 지원하는, Ethereum 스마트 컨트랙트를 위한 Python 기반 개발 및 테스트 프레임워크로, 테스트, 디버깅, 상호작용, 배포의 4개 카테고리로 나뉜다. 각 단계는 개발자가 유연한 프로그램을 만드는 데 도움을 준다.

개발자는 트랜잭션 실패에 대한 상세 정보를 수집하고 Solidity 오류를 찾아내고 재현하고 해결하기 위해 다양한 디버깅 도구를 사용할 수 있다.

- **TransactionReceipt.revert_ms** - 트랜잭션 실패에 대한 직접적인 설명 메시지 확인
- **TransactionReceipt.error()** - 실패한 트랜잭션을 일으킨 스마트 컨트랙트의 근본 원인과 부분을 찾아냄
- **TransactionReceipt.events** - 되돌려진(reverted) 트랜잭션에서 발생한 이벤트 확인
- **TransactionReceipt.trace** - 트랜잭션 정보를 담은 딕셔너리 목록 확인
- **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 개발 과정에서 마주치는 문제를 해결하는 데 필수적이다.

Solidity 개발 학습을 시작하거나 속도를 높이고 싶다면, Alchemy University의 무료 7주 과정 [Solidity 개발자 부트캠프](https://www.alchemy.com/university/courses/solidity?a=671a6a00bd)를 살펴보기 바란다. 원래 ChainShot에서 3,000달러에 제공되던 이 인증 과정은 이제 Alchemy와 완전히 통합되었다! 개발 자체가 처음이라면, Ethereum 부트캠프를 시작하기 전 사전 과정으로 Alchemy의 **3주 JavaScript 단기 코스**를 추천한다.
