---
title: "Solidity ABI(Application Binary Interface)란?"
description: "Solidity의 Application Binary Interface(ABI)에 대해 알아야 할 모든 것"
---

# Solidity ABI(Application Binary Interface)란?

Ethereum 개발자는 Solidity 프로그래밍 언어를 사용하여 Ethereum 네트워크용 [스마트 컨트랙트 코드를 작성](https://www.alchemy.com/overviews/solidity-smart-contract)합니다. 그렇다면 Solidity는 어떻게 작동하며 [Ethereum Virtual Machine](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)\(EVM\)과 상호작용할까요? 이는 스마트 컨트랙트를 컴파일하는 것에서 시작됩니다.

이 글에서는 다음 내용을 다룹니다:

- 스마트 컨트랙트 컴파일의 필요성을 소개하며 [Solidity ABI](https://www.alchemy.com/overviews/what-is-an-abi-of-a-smart-contract-examples-and-usage)가 무엇인지
- ABI가 Solidity 컴파일러로서 어떻게 작동하는지
- 바이트코드가 무엇이며 컴파일 과정에서 어떤 역할을 하는지
- Solidity ABI가 무엇이며 API와 어떻게 다른지
- ABI가 어떻게 작동하는지 \(예시 포함\)

## **스마트 컨트랙트 컴파일이란?**

스마트 컨트랙트 컴파일은 Solidity 스마트 컨트랙트 코드를 Ethereum Virtual Machine 언어와 호환되는 언어로 변환하는 과정입니다.

개발자는 사람만 읽고 이해할 수 있는 고수준 프로그래밍 언어인 [Solidity](https://www.alchemy.com/overviews/solidity)로 스마트 컨트랙트를 작성합니다. EVM은 Solidity를 이해할 수 없습니다. 가상 머신이 Solidity를 이해할 수 없기 때문에, 컴파일 과정에서 사람이 이해할 수 있는 Solidity 코드를 기계가 읽을 수 있는 언어로 변환합니다. [Ethereum 생태계](https://www.alchemy.com/dapps/ecosystem/ethereum)는 Solidity 컴파일러를 사용하여 스마트 컨트랙트를 컴파일합니다.

### **Solidity 컴파일러란?**

[**Solidity 컴파일러**](https://www.alchemy.com/overviews/solidity-compiler)는 solc라고도 불리며, Solidity 기반 스마트 컨트랙트를 EVM이 이해할 수 있는 바이트코드와 [**Application Binary Interface \(ABI\)**](https://docs.soliditylang.org/en/v0.8.13/abi-spec.html)로 컴파일합니다. 바이트코드와 Solidity 컨트랙트 ABI는 Ethereum 스마트 컨트랙트와 상호작용하기 위한 핵심 구성 요소입니다.

## **바이트코드란?**

바이트코드는 Ethereum Virtual Machine 상에서 바이너리 형식으로 표현된 스마트 컨트랙트 정보입니다. 바이트코드는 사람이 읽을 수 없으며 기계\(EVM\)만이 읽을 수 있습니다. 다시 말해, Solidity는 컴파일되어 기계가 읽을 수 있는 바이트코드로 변환되며, 이를 통해 EVM이 필요한 함수를 실행할 수 있습니다.

바이트코드는 opcode라고 불리는 일련의 기계가 이해할 수 있는 명령어로 구성되며, 각 opcode는 1바이트\(8비트\) 길이입니다. 즉, 바이트코드는 1바이트 opcode들의 집합체입니다.

바이트코드는 두 가지 유형으로 나뉩니다:

1. Creation bytecode
1. Runtime bytecode

### **Creation bytecode란?**

**스마트 컨트랙트 컴파일은 스마트 컨트랙트의 생성자 로직과 생성자 매개변수를 포함하는 creation bytecode를 생성합니다.** Creation bytecode는 runtime bytecode를 생성하는 역할을 합니다.

[Integrated Development Environment \(IDE\) 플랫폼](https://www.alchemy.com/overviews/solidity-ide)에서 스마트 컨트랙트의 'compilation details'를 클릭하면 creation bytecode를 확인할 수 있습니다. Creation bytecode는 배포 시 단 한 번만 실행됩니다.

온체인 creation bytecode를 조회하려면 다음을 사용하세요:

JSON RPC 호출로 오프체인에서 creation bytecode를 조회하려면 다음 메서드를 사용하세요: [`getTransactionByHash`](https://www.alchemy.com/docs/chains/ethereum/ethereum-api-endpoints/eth-get-transaction-by-hash)*.*

### **Runtime bytecode란?**

Runtime bytecode는 온체인에 영구적으로 실행 가능한 코드로 저장되는 컴파일된 스마트 컨트랙트 데이터입니다. Creation bytecode와 달리, runtime bytecode는 생성자 로직과 생성자 매개변수를 포함하지 않습니다.

온체인 runtime bytecode를 조회하려면 다음을 사용하세요:

JSON RPC 호출로 오프체인에서 runtime bytecode를 조회하려면 다음 메서드를 사용하세요: [`getCode`](https://www.alchemy.com/docs/chains/ethereum/ethereum-api-endpoints/eth-get-code)

### **바이트코드와 상호작용하는 방법**

스마트 컨트랙트 데이터는 EVM에서는 기계가 읽을 수 있는 바이트코드로 저장되고, 외부 애플리케이션에서는 Javascript로, 다른 스마트 컨트랙트에서는 사람이 읽을 수 있는 Solidity 언어로 저장됩니다. 이는 외부 애플리케이션과 다른 스마트 컨트랙트가 바이트코드와 직접 통신할 수 없기 때문입니다. 이때 스마트 컨트랙트 컴파일의 두 번째 구성 요소인 Application Binary Interface \(ABI\)가 이러한 상호작용을 가능하게 합니다.

## **Solidity의 application binary interface \(ABI\)란?**

[**Application Binary Interface (ABI)**](https://www.alchemy.com/overviews/what-is-an-abi-of-a-smart-contract-examples-and-usage)는 EVM 바이트코드와의 통신을 가능하게 하는 인터프리터입니다. Solidity ABI는 특정 함수를 실행하기 위한 스마트 컨트랙트의 메서드 목록을 사람이 읽을 수 있는 형태로 나타낸 것입니다. [ethers.js](https://www.alchemy.com/dapps/ethers-js)와 같은 라이브러리와 함께 ABI를 사용하여 스마트 컨트랙트와 상호작용할 수 있습니다.

Solidity의 ABI는 API\(Application Program Interface\)와 유사하지만 다른 점도 있습니다.

### **Solidity ABI와 API의 차이점은?**

web2에서 API는 웹 애플리케이션과 중앙화된 서버 간의 상호작용을 가능하게 하며, Solidity ABI는 애플리케이션과 다른 컨트랙트에 스마트 컨트랙트 데이터를 제공합니다. 애플리케이션이 API를 사용하여 서버에 데이터를 요청하면 API가 데이터를 제공하는 반면, ABI는 Solidity Binaries라고 불리는 바이너리 바이트코드 형식으로 스마트 컨트랙트 데이터에 접근합니다.

다음 섹션에서는 Solidity Binaries가 무엇인지 설명합니다.

### **Solidity binaries란?**

Solidity Binaries는 Ethereum 생태계 내 스마트 컨트랙트를 위한 고유한 데이터 저장 인프라입니다.

개발자는 사람이 읽을 수 있는 Solidity 코드를 Ethereum 블록체인에 직접 배포할 수 없습니다. 대신, Solidity 스마트 컨트랙트 데이터는 바이너리 형식\(즉, 긴 16진수 문자열\)의 raw 바이트코드로 저장됩니다. 이를 [Solidity Binaries](https://www.alchemy.com/overviews/solidity-binaries)라고 하며, 이는 블록체인에 데이터를 저장하는 비용을 절감해줍니다.

그렇다면 ABI는 Solidity Binaries에 어떻게 접근할까요? 이는 ABI encoding이라는 과정을 통해 이루어집니다.

### **Solidity ABI encoding이란?**

**ABI는 EVM 기반 바이트코드가 이해할 수 있는 함수 시그니처와 변수 선언을 사용하여 스마트 컨트랙트를 호출합니다.** 이를 ABI encoding이라고 하며, ABI는 기계가 읽을 수 있는 바이트코드가 처리할 수 있도록 필요한 정보를 인코딩합니다. 대부분의 경우 ABI encoding은 스마트 컨트랙트 컴파일러에 의해 자동으로 수행됩니다.

### **ABI decoding이란?**

**EVM 바이트코드가 명령어를 실행하고 결과를 반환할 때, 이는 사람이 읽을 수 없는 raw 16진수 형식이며, ABI는 이 16진수 형식을 사람이 읽을 수 있는 언어로 디코딩합니다.** 이를 ABI decoding이라고 합니다.

Solidity 코드는 ABI로부터 나오며, 기본적으로 ABI는 기계 코드와 데이터를 주고받을 때 이를 인코딩/디코딩하는 인터페이스 역할을 합니다.

### **Solidity 코드는 EVM opcode에 어떻게 매핑될까?**

EVM 바이트코드는 여러 개의 [opcode](https://ethereum.org/en/developers/docs/evm/opcodes/)로 구성됩니다. **ABI encoding이 함수를 호출할 때, 이는 특정 opcode를 가리킵니다.** 트랜잭션을 처리한 후, opcode는 결과를 반환하고 ABI는 이를 사용자를 위해 디코딩합니다.

## **Solidity에서 ABI는 어떻게 작동할까?**

**ABI는 호출할 함수를 지정하고\(encoding\), 해당 함수를 실행하여 사용자에게 데이터를 반환합니다\(decoding\).** 스마트 컨트랙트는 EVM에 바이트코드로 배포되는 여러 함수를 포함하며, 각 스마트 컨트랙트는 결과를 얻기 위해 필요한 고유한 ABI를 가지고 있습니다.

스마트 컨트랙트는 바이너리 형식으로 저장되기 때문에, ABI는 바이너리 컨트랙트와 상호작용하기 위한 구조와 메서드를 정의합니다. 컴파일 후 스마트 컨트랙트는 Solidity JSON ABI 형식으로 표현된 ABI를 생성합니다.

Remix와 같은 일부 IDE는 컨트랙트 ABI를 자동으로 생성합니다. 하지만 [Solidity Compiler NPM 패키지](https://www.npmjs.com/package/solc)를 사용하여 수동으로 ABI를 생성할 수도 있습니다.

Solidity JSON ABI는 다음과 같은 구성 요소를 생성합니다:

- **Type** - [함수](https://www.alchemy.com/overviews/solidity-functions)의 종류\(receive, fallback, constructor\)를 정의
- **Name** - 함수의 이름을 정의
- **Inputs** - name, type, components를 포함하는 객체 배열
- **Outputs** - inputs와 유사한 객체 배열
- **stateMutability** - 함수의 mutability\(pure, view, [non-payable 또는 payable](https://www.alchemy.com/docs/solidity-payable-functions)\)를 정의

## **트랜잭션은 ABI와 어떻게 작동할까?**

트랜잭션은 다음 3단계를 거쳐 Solidity ABI 파일과 함께 작동합니다:

1. 스마트 컨트랙트의 ABI가 EtherJS와 같은 프론트엔드 라이브러리에 제공됩니다.
1. 프론트엔드 라이브러리는 메서드 호출과 인수를 _calldata_로 변환하며, 이는 Ethereum 노드로 전송되는 트랜잭션의 일부로 제공됩니다.
1. 트랜잭션이 검증되면, 상세 로그와 사용된 gas\(트랜잭션 수수료\)를 담은 receipts trie가 생성됩니다.

### receipts trie란?

**Ethereum 트랜잭션은 'receipts trie'라고 불리는 영수증을 생성하며, 이는 성공한 트랜잭션의 결과를 기록합니다.** receipts trie는 다음 네 가지 유형의 정보로 구성됩니다:

1. 트랜잭션의 상태
1. 누적 사용된 gas
1. 실행 중 생성된 로그 집합
1. 로그로부터 구성된 bloom filter

트랜잭션이 어떻게 작동하는지 더 잘 이해하기 위해 다음 예시를 살펴보겠습니다.

## ERC-20 토큰 전송 예시

예를 들어, 한 지갑에서 다른 지갑으로 [ERC-20 토큰](https://www.alchemy.com/overviews/erc20-solidity)을 전송하려 한다고 가정해봅시다. 다음 코드는 ABI가 EVM 기반 바이트코드에 메시지를 보내도록 지시합니다.

ABI encoding은 바이트코드가 함수를 인식하고 트랜잭션을 실행하도록 보장합니다. 결과가 생성된 후, ABI decoding은 그 결과를 사람이 읽을 수 있는 형식으로 변환합니다. 사용자는 ERC-20 토큰이 한 주소에서 다른 주소로 전송되었다는 영수증을 받게 됩니다.

## **Solidity ABI에 대해 더 알아보기**

[Solidity를 배우다](https://www.alchemy.com/overviews/learn-solidity) 보면, ABI가 Ethereum 스마트 컨트랙트의 핵심임을 이해하게 될 것입니다. ABI는 블록체인 생태계에서 트랜잭션을 가능하게 합니다. 스마트 컨트랙트 기술에서 ABI가 중요함에도 불구하고, 개발자 튜토리얼에서 ABI는 자주 간과됩니다. 이 글의 범위를 벗어나지만, [Solidity interface](https://www.alchemy.com/overviews/solidity-interface)가 무엇인지 아는 것은 컨트랙트들이 서로 어떻게 상호작용하는지 이해하는 데 도움이 될 것입니다.

ABI에 대한 깊이 있는 이해는 견고한 스마트 컨트랙트와 [앱](https://www.alchemy.com/dapps/top/defi-dapps)을 개발하고, [Solidity 개발자가 되기](https://www.alchemy.com/overviews/how-to-become-a-solidity-developer) 위한 발판이 됩니다.
