본문으로 건너뛰기
0%

Solidity console log란 무엇인가?

작성자 Turja

2022년 10월 4일에 게시됨5분 읽기

디버깅은 Solidity 스마트 컨트랙트 작성법을 배우고, 취약점을 패치하고, 문제가 되는 버그를 수정하는 과정에서 필수적으로 반복되는 단계다. 스마트 컨트랙트에서 흔히 발생하는 개발 오류는 런타임 오류와 로직 오류 두 가지로 나뉜다.

개발자의 이해를 돕는 도구를 활용하면 특히 프로그램의 오류를 수정할 때 더 쉬운 개발 경험을 얻을 수 있다. JavaScript 개발과 유사하게, console.log() 함수는 웹 콘솔에 출력 메시지를 반환하는 데 사용되며, 이는 디버깅 과정에 도움을 준다.

console.log()은 매개변수(배열, 객체 또는 메시지 등)를 받아 웹 콘솔에 값을 출력함으로써 개발자가 이를 평가할 수 있게 한다. 이 방법을 통해 개발자는 코드의 출력을 단계별로 파악하면서 발생할 수 있는 문제를 추적할 수 있다.

이 글에서는 Solidity를 디버깅하는 주요 방법을 소개하고, Hardhat, Foundry, Truffle, Brownie의 디버깅 도구를 살펴본 다음, 디버깅 팁을 제공한다.

Solidity console log란 무엇인가?

콘솔에 로그를 남기는 것은 코드를 디버깅할 때 흔히 사용되는 방법이며, console.log()는 Hardhat이 제공하는 컨트랙트 라이브러리의 함수다. 콘솔에 정보를 출력하는 로깅은 개발자가 프로그램의 문제를 이해하고 해결하는 데 도움을 준다. Solidity에서는 이를 이벤트라고 부른다.

Ethereum은 블록체인의 트랜잭션 로그 데이터 구조에 데이터를 저장하는 로깅 기능을 제공한다. Solidity의 이벤트는 이 기능을 추상화한 것으로, 개발자가 블록체인상에 데이터를 출력할 수 있게 해준다.

로그는 블록체인 내 컨트랙트 주소와 함께 유지되며 블록을 통해 계속 접근할 수 있기 때문에, Solidity 개발자는 특정 트랜잭션 데이터를 블록체인에서 조회하고 참조할 수 있다.

Solidity 이벤트 사용 사례

Solidity 이벤트는 스마트 컨트랙트 테스트, 트랜잭션 데이터 인덱싱, 프론트엔드 개발을 위한 참조 등 다양한 방식으로 활용될 수 있다. 개발자들은 주로 다음 세 가지 사용 사례에서 이벤트를 사용한다.

  1. 프론트엔드에서 사용할 값을 반환하기 위해 스마트 컨트랙트에서 사용
  2. 프론트엔드가 특정 동작을 수행하도록 트리거하는 비동기 이벤트를 스마트 컨트랙트가 발생시킬 때
  3. 데이터가 트랜잭션 로그에 저장되므로 더 저렴한 형태의 저장 방식으로 사용

이벤트 내에서 매개변수는 indexed 또는 non-indexed로 지정할 수 있다. 컨트랙트가 검증된 경우 로그 내 트랜잭션 데이터는 인코딩된 형태로 표시되며, 그렇지 않으면 non-indexed 또는 해시된 형태로 표시된다.

Hardhat과 같이 지원 기능이 갖춰진 환경에서 개발이 이루어지는 경우, console.log() 함수를 이벤트와 함께 사용할 수 있으며 이는 JavaScript 개발과 유사하게 동작한다.

콘솔 로그가 중요한 이유는 무엇인가?

콘솔 로그는 스마트 컨트랙트 디버깅 과정에서 개발자에게 필수적인 도구다. 콘솔 로그는 프로그램의 테스트 환경(console)과 데이터를 출력하는 함수(log())가 결합된 것이다.

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

Solidity 스마트 컨트랙트를 작성할 때도 콘솔 로그는 코드를 추출하고 로직을 이해하는 디버깅 과정에서 마찬가지로 효과적인 단계로 작용한다.

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은 개발자가 Solidity 스마트 컨트랙트를 로컬에서 개발할 수 있게 하고 필수적인 Solidity 디버깅 도구를 제공하는 데 초점을 맞춘 Ethereum 개발 환경이다.

Hardhat은 의 테스트, 컴파일, 배포, 디버깅을 위한 도구 모음을 제공한다. Hardhat Network를 활용하면 개발자는 Solidity 인터페이스를 통해 로컬 머신에서 스마트 컨트랙트를 생성, 컴파일, 배포할 수 있다.

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

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

추가적인 Solidity console log 도구

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

1. Foundry

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) 호환 네트워크와의 RPC(Remote Procedure Calls) 상호작용을 통해 스마트 컨트랙트를 배포하고 테스트할 수 있게 해준다.

2. Truffle

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

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

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

더 알아보기: https://trufflesuite.com/docs/truffle/

3. Brownie

Brownie는 Solidity와 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

Alchemy University와 함께 Solidity console log 배우기

이 글에서는 Solidity 스마트 컨트랙트 개발을 위한 가장 널리 쓰이는 로깅 및 디버깅 도구를 소개했다. Solidity를 배우고 있다면, 스마트 컨트랙트 디버깅에 가장 적합한 도구를 선택하는 것이 Solidity 개발 과정에서 마주치는 문제를 해결하는 데 필수적이다.

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

Background gradient

블록체인 매직을 만드세요

Alchemy는 가장 강력한 Web3 개발자 제품 및 도구를 리소스, 커뮤니티, 그리고 전설적인 지원과 결합합니다.