---
title: "Solidity 컴파일러란?"
description: "Solidity 컴파일러의 작동 방식과 사용법 알아보기"
---

# Solidity 컴파일러란?

[Solidity로 스마트 컨트랙트를 작성하는](https://docs.soliditylang.org/en/v0.8.16/using-the-compiler.html#compiler-tools) Ethereum 개발자는 **Ethereum Virtual Machine \(EVM\)**이 적절한 명령을 이해하고 실행할 수 있도록 코드를 컴파일러에 통과시켜야 합니다. [Solidity](https://www.alchemy.com/overviews/solidity) 컴파일러는 코드를 바이트 명령어 집합으로 변환합니다.

Solidity는 시가총액 기준 두 번째로 큰 암호화폐인 Ethereum의 프로그래밍 언어입니다. Solidity는 스마트 컨트랙트를 실행하기 위해 특별히 만들어진 고수준 프로그래밍 언어입니다. 또한 Solidity는 정적 타입 객체를 사용하는 컨트랙트 지향 및 객체 지향 언어입니다.

이 글에서는 Solidity 컴파일러, Solidity 컴파일러 설치 방법, Solidity 컴파일러 도구, 그리고 공개적으로 사용 가능한 디컴파일러까지 살펴봅니다.

## **Solidity 컴파일러란 무엇인가?**

Solidity 컴파일러는 두 가지가 있습니다: **solc**와 solc에서 파생된 **solc.js**입니다. 실제 Solidity 컴파일러인 solc는 C\+\+로 작성되어 있으며, 이 글 작성 시점 기준 버전 0.8.16입니다. Solc.js는 Emscripten을 사용해 C\+\+ 코드를 JavaScript로 컴파일합니다. Solc는 버전마다 JavaScript로 컴파일됩니다.

Solidity 파일은 solcjs라는 이름의 Node.js 라이브러리이자 명령줄 도구를 사용해 어셈블됩니다. solcjs는 solc 명령줄 컴파일러가 아니라 JavaScript만을 사용해 컴파일하기 때문에 solc보다 설치가 간단합니다.

스마트 컨트랙트를 배포하기 전에 [EVM \(Ethereum Virtual Machine\)](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)이 이해할 수 있는 바이트코드로 컴파일해야 합니다. 바이트코드는 Solidity 코드가 "변환"된 결과물로, 바이너리 컴퓨터 명령어를 담고 있습니다.

Ethereum에서는 이 바이트코드가 블록체인에 배포됩니다. 컴파일 과정에서는 [ABI \(Application Binary Interface\)](https://www.alchemy.com/overviews/solidity-abi)도 생성되는데, 이는 두 프로그램 모듈 간의 인터페이스로, 흔히 운영체제와 사용자 프로그램 사이에서 사용됩니다.

<ImageBlock
  src="https://media.alchemy.com/1704186026-solidity-compiler.png"
  alt="Solidity 컴파일러가 소스 코드를 바이트코드와 ABI로 변환하는 과정을 나타낸 다이어그램"
  width={456}
  height={414}
  caption="Solidity 컴파일러 - 출처: Intellipat"
/>

컨트랙트는 EVM에서 실행되는 바이트코드로 컴파일됩니다. 이 바이트코드는 블록체인에 배포되어 특정 주소에 저장됩니다. 이후 공개되어 누구나 상호작용할 수 있게 됩니다. 주소는 배포된 컨트랙트 인스턴스를 식별하며, 이 인스턴스는 컨트랙트의 내부 상태를 유지하기 위한 영구 저장소도 함께 보유합니다. Ethereum의 네이티브 암호화폐인 Ether는 가치 저장 수단, 블록체인에서 스마트 컨트랙트를 실행하기 위한 결제 수단, 그리고 Ethereum 네트워크의 보안을 유지하는 채굴자에 대한 보상으로 사용됩니다.

다음은 컨트랙트가 컴파일되는 방식을 보여주는 간단한 예시입니다.

로컬 머신에 도구를 설치할 필요가 없도록, [널리 사용되는 온라인 Ethereum IDE](https://www.alchemy.com/overviews/solidity-ide)인 Remix를 사용해 이 코드를 컴파일하겠습니다.

아래 이미지를 보면 이미지 하단에 각각 ABI와 바이트코드를 가리키는 분홍색과 보라색 화살표가 보일 것입니다. ABI는 JSON 형태로 표현됩니다.

<ImageBlock
  src="https://media.alchemy.com/1704186197-solidity-compiler-abi-bytecode.jpg"
  alt="ABI와 바이트코드 출력 부분을 화살표로 표시한 Remix IDE 컴파일러 패널"
  width={730}
  height={1252}
  caption="ABI와 Bytecode를 사용할 수 있습니다."
/>

## **Solidity 컴파일러 설치 방법**

[Solidity를 학습하는](https://www.alchemy.com/overviews/learn-solidity) 동안 Solidity 컴파일러를 설치하고 싶을 수 있습니다. Solidity 컴파일러를 설치하는 다양한 편리한 방법이 있습니다. 간단한 방법은 Remix를 사용하는 것으로, 온라인에서 바로 사용할 수 있는 옵션이 있습니다. 다만 이는 작은 규모의 컨트랙트를 위해 설계되었으며 컴파일 옵션이 제한적입니다.

더 큰 규모의 컨트랙트의 경우 npm/Node.js, Docker, Linux, MacOS 패키지, 그리고 정적 바이너리를 통해 Solidity 컴파일러를 설치할 수 있습니다.

### **방법 1: npm/node.js를 사용한 설치**

solc라고도 불리는 Solidity 컴파일러는 npm을 사용해 설치할 수 있습니다. 아래 명령어는 solcjs 프로그램을 설치하고 시스템 전체에서 사용할 수 있게 해줍니다.

이제 다음 명령어를 실행하여 Solidity 컴파일러를 테스트할 수 있습니다.

이제 solcjs를 사용할 준비가 되었습니다. solcjs는 표준 Solidity 컴파일러보다 기능이 적지만 좋은 출발점을 제공합니다.

### **방법 2: Docker를 사용한 설치**

Solidity 프로그래밍을 시작하려면 Docker 이미지를 다운로드하여 사용할 수 있습니다. Docker 이미지는 컴파일러 실행 파일을 실행하므로 원하는 컴파일러 인자를 전달할 수 있습니다.

Solidity Docker 이미지를 pull하는 명령어는 다음과 같습니다.

Docker 이미지를 다운로드한 후, 다음 명령어를 실행해 확인합니다.

Docker 이미지를 사용해 호스트 머신에서 Solidity 파일을 컴파일하려면, 입력과 출력을 위한 로컬 폴더를 마운트하고 컴파일할 컨트랙트를 지정합니다.

### **방법 3: 바이너리 패키지를 사용한 설치 \(MacOS, linux\)**

#### MacOS 설치

MacOS에서는 Homebrew를 사용해 Solidity를 설치할 수 있습니다. Homebrew는 소스로부터 빌드된 macOS 패키지를 제공하며, 설치 안내만 따르면 됩니다.

실행이 완료되면, 아래 명령어를 실행해 Solidity가 정상적으로 설치되었는지 확인할 수 있습니다.

다음과 같은 출력을 받게 됩니다:

<ImageBlock
  src="https://media.alchemy.com/1704186340-macos-solidity-installation.png"
  alt="macOS에서 Solidity 컴파일러 설치 성공을 확인하는 터미널 출력"
  width={1116}
  height={128}
  caption="macOS Solidity 설치"
/>

#### Linux 설치

Linux 패키지 설치는 몇 단계만으로 완료할 수 있는 매우 간단한 절차입니다. 먼저 저장소 목록에 저장소를 추가합니다.

그런 다음 패키지 목록을 업데이트하고 solc를 설치합니다. 최신 안정 릴리스 대신 nightly 빌드를 사용하려면 저장소 항목을 ethereum/ethereum-dev로 변경해야 합니다.

## 샘플 Solidity 스마트 컨트랙트 컴파일하기

다음 코드는 위에서 제공한 샘플 컨트랙트를 사용합니다.

컨트랙트를 컴파일하려면 다음 코드를 실행할 수 있습니다.

특정 EVM 버전을 사용해 컨트랙트를 컴파일하려면 다음과 같이 버전을 설정할 수 있습니다.

### **Solidity-upgrade란 무엇인가?**

**solidity-upgrade를 사용하면 언어의 하위 호환성이 깨지는 변경 사항을 반영하도록 컨트랙트를 업그레이드할 수 있습니다.** 모든 하위 호환성 파괴 릴리스에 필요한 모든 조정을 다 처리할 수는 없지만, 그럼에도 불구하고 처리하지 않았다면 번거로운 수작업 조정이 많이 필요했을 부분들을 지원합니다.

### Solidity-upgrade는 어떻게 작동하는가?

_libsolidity_를 기반으로 하는 solidity-upgrade는 소스 파일을 파싱, 컴파일, 분석하여 적용 가능한 소스 업그레이드를 찾아낼 수 있습니다. 소스 업그레이드는 소스 코드에 대한 사소한 텍스트 변경으로 간주됩니다. 이는 제공된 소스 파일의 메모리상 복제본에 적용됩니다.

업그레이드는 두 단계로 이루어집니다:

#### **1단계**

먼저, 소스 파일을 파싱하는 단계에서는 그 수준에서 소스 코드를 업그레이드하는 것이 불가능하므로 오류가 수집되며 —verbose 플래그를 지정하면 로그로 남길 수 있습니다. 현재 이 단계에서는 사용 가능한 소스 업그레이드가 없습니다.

#### **2단계**

두 번째 단계에서는 모든 소스가 컴파일되고, 활성화된 모든 업그레이드 분석 모듈이 컴파일과 함께 실행됩니다. 기본적으로 사용 가능한 모든 모듈이 활성화됩니다.

컴파일 문제는 solidity-upgrade에서 발생할 수 있으며, 소스 업데이트가 이를 해결할 수도 있습니다. 문제가 없다면 보고되는 소스 업그레이드도 없으며 그것으로 완료됩니다. 문제가 발생하고 [업그레이드 모듈](https://docs.soliditylang.org/en/v0.8.16/using-the-compiler.html#compiler-tools)이 소스 업그레이드를 보고한 경우, 처음 보고된 소스 업그레이드가 적용되고 제공된 모든 소스 파일에 대해 재컴파일이 시작됩니다.

## **Solidity 디컴파일러란 무엇인가?**

**Solidity 디컴파일러는 컴파일된 스마트 컨트랙트 EVM 코드를 입력받아 Solidity와 유사한 소스 코드로 디컴파일하는 도구입니다.** 디컴파일러는 컨트랙트의 동작을 검증하고 이해하는 데 도움을 줍니다.

Solidity 디컴파일러는 원본 코드를 사용할 수 없는 상황에서 스마트 컨트랙트를 디버깅할 때 유용합니다. 다만 EVM 바이트코드를 디컴파일하는 기술은 아직 발전 중이며, 일부 디컴파일러는 복잡한 컨트랙트를 부분적으로만 디컴파일할 뿐, 디컴파일된 결과에서 저수준 코드가 자주 누락됩니다.

### **Ethereum virtual machine \(EVM\) 디컴파일러**

다음은 널리 사용되는 Solidity 디컴파일러 목록입니다:

#### **1. Ethervm.io**

[Ethervm.io](https://www.alchemy.com/dapps/ethervm-decompiler)는 Ethereum 컨트랙트 바이트코드를 더 읽기 쉬운 Solidity와 유사한 코드로 디컴파일해주는 무료 온라인 디컴파일러입니다.

**시작하기:** [https://ethervm.io/decompile](https://www.ethervm.io/decompile)

#### **2. JEB decompiler**

JEB decompiler는 ABI 없이도 메서드를 파악할 수 있는 코드 분석과 같은 특정 기능을 제공합니다. JEB는 Ethereum 플랫폼에서 실행되는 불투명한 스마트 컨트랙트를 조사하는 보안 감사자, 취약점 연구자, 리버스 엔지니어들이 선호하는 도구로 자리 잡았습니다.

시작하기: [https://www.pnfsoftware.com/jeb/manual/ethereum/](https://etherscan.io/bytecode-decompiler)

#### 3. Etherscan online decompiler

[Etherscan online decompiler](https://etherscan.io/bytecode-decompiler)는 Ethereum Virtual Machine \(EVM\)용 디컴파일러로, Runtime 바이트코드에서 정보를 추출해 더 사람이 읽기 쉬운 형식으로 제공합니다.

#### **4. Evemedis by nick johnson**

Evemedis는 EVM 디스어셈블러입니다. 바이트코드에 대해 정적 분석을 수행하여 원시 EVM 연산보다 높은 수준의 추상화를 제공합니다.

시작하기: [https://github.com/Arachnid/evmdis](https://github.com/Arachnid/evmdis)

#### **5. Decurity**

Decurity는 ABI 디컴파일러로, 함수 이름을 포함해 EVM 스마트 컨트랙트 ABI를 복구하는 간단한 도구를 구현합니다.

시작하기: [https://github.com/Decurity/abi-decompiler](https://github.com/Decurity/abi-decompiler)

## **마치며**

이제 Solidity 컴파일러가 무엇인지, 어떻게 설치하는지, 간단한 컨트랙트를 어떻게 컴파일하는지 이해하셨을 것입니다. Solidity 문서에는 Solidity 컴파일러에 대한 더 많은 정보가 담겨 있습니다.

이제 막 [Solidity를 배우기 시작했다면](https://www.alchemy.com/overviews/learn-solidity), Alchemy University의 7주 과정 Solidity developer bootcamp에 자리를 확보하여 무료, 인터랙티브, 종합적인 온라인 코스에서 [Ethereum 개발의 기초를 마스터](https://www.alchemy.com/university/courses/ethereum?a=8e8f08e668)해보세요. 개발 자체가 처음인 개발자라면, Ethereum bootcamp를 시작하기 전에 Alchemy University의 [**3주 과정 JavaScript crash course**](https://www.alchemy.com/university/courses/js?a=8e8f08e668)를 먼저 수강하는 것이 좋습니다. 기본기를 이미 갖추었고 더 깊이 파고들고 싶다면, [Alchemy의 새로운 Solidity Course](https://www.alchemy.com/university/courses/solidity?a=8e8f08e668)를 확인해보세요.
