---
title: "스마트 컨트랙트의 ABI란?"
description: "개발자를 위한 예제와 사용법"
---

# 스마트 컨트랙트의 ABI란?

스마트 컨트랙트의 ABI(Application Binary Interface)는 컨트랙트가 외부 애플리케이션 및 다른 스마트 컨트랙트와 통신하고 상호작용할 수 있는 능력을 제공한다. 외부 소스로부터 데이터를 받는 것은 애플리케이션과 사용자의 목표를 달성하는 데 중요할 수 있다.

전통적인 웹 개발에서는 애플리케이션과 서버 간의 데이터 관련 대화가 API(Application Program Interface)를 통해 이루어진다. 서버는 요청에 따라 애플리케이션에 데이터를 제공하는 중앙화된 정보 소스 역할을 한다.

블록체인에는 이러한 데이터 중앙화가 존재하지 않는다. 노드는 본질적으로 서버 역할을 하고, 스마트 컨트랙트는 온체인에서 "호스팅되는" 함수다. 블록체인 외부의 애플리케이션(및 다른 스마트 컨트랙트)은 온체인에 있는 스마트 컨트랙트와 통신할 방법이 필요하다. 이때 ABI가 등장한다.

## **왜 ABI인가?**

ABI가 무엇인지 자세히 알아보기 전에, 왜 이것이 필요한지 이해하는 것이 좋다.

스마트 컨트랙트는 [EVM(Ethereum Virtual Machine)](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)의 핵심 애플리케이션이다. 스마트 컨트랙트의 목적은 컨트랙트에 정의된 특정 조건이 충족되었을 때 트랜잭션을 실행하는 것이다. 이러한 조건은 온체인 또는 오프체인 이벤트일 수 있다. 스마트 컨트랙트는 [Solidity](https://www.alchemy.com/overviews/solidity)와 같은 고수준 언어로 작성되지만, EVM에는 실행 가능한 바이트코드, 즉 바이너리 형식으로 저장된다.

<ImageBlock
  src="https://media.alchemy.com/1703767018-evm-executable-bytecode.jpeg"
  alt="실행 가능한 바이트코드로 EVM에 저장된 스마트 컨트랙트 코드 다이어그램"
  width={1600}
  height={916}
  caption="실행 가능한 바이트코드로서의 EVM"
/>

이 바이트코드는 사람이 읽을 수 없기 때문에 이해하려면 해석이 필요하다. ABI는 스마트 컨트랙트를 작성하는 사람이라면 누구나 Javascript 같은 고수준 언어로 작성된 웹 애플리케이션과 EVM이 이해하는 바이트코드 사이에서 통신할 수 있게 해준다.

## **ABI란 무엇인가?**

Web2의 사촌격인 API처럼, ABI는 함수 선택자 역할을 하며, 스마트 컨트랙트에서 실행을 위해 호출할 수 있는 특정 메서드를 정의한다. 이러한 특정 메서드와 그에 연결된 데이터 타입은 생성된 JSON RPC 파일에 나열된다.

<ImageBlock
  src="https://media.alchemy.com/1703767166-abi-function-selector.png"
  alt="스마트 컨트랙트 메서드의 함수 선택자 역할을 하는 ABI 다이어그램"
  width={760}
  height={484}
  caption="ABI 함수 선택자"
/>

API와 달리, JSON 형식의 요청을 스마트 컨트랙트에 직접 보내고 응답을 기대할 수는 없다. 컨트랙트는 오직 바이트코드로만 통신하기 때문이다. 이를 EVM이 이해하는 형태로 변환하기 위해, 이 정보는 ABI 인코딩을 통해 인코딩된다. 이러한 인코딩에는 함수 시그니처와 변수 선언이 포함되어 있어, EVM이 스마트 컨트랙트 내에서 정확히 어떤 함수를 실행해야 하는지 알 수 있다.

<ImageBlock
  src="https://media.alchemy.com/1703767249-abi-encoding.png"
  alt="함수 호출을 EVM 바이트코드로 변환하는 ABI 인코딩 예시"
  width={1362}
  height={280}
  caption="ABI 인코딩"
/>

응답 역시 바이트코드로 반환되므로, 웹 애플리케이션이 처리하기 전에 해석이 필요하다. 응답에 바이트코드를 사용하는 것의 장점은 컨트랙트의 함수를 호출한 후 반환되는 데이터의 구조를 예측할 수 있다는 점이다.

## **ABI 사용 방법**

### 생성

Hardhat/Truffle 같은 툴링이나 [Remix](https://remix.ethereum.org/#optimize=false&runs=200&evmVersion=null&version=soljson-v0.8.7+commit.e28d00a7.js) 같은 IDE를 사용한다면, 컨트랙트 ABI는 자동으로 생성된다. [Solidity Compiler NPM package](https://www.npmjs.com/package/solc)를 사용하여 수동으로 ABI를 생성할 수도 있다. 패키지를 설치한 후, 터미널에서 '`solcjs contractname.sol --abi`' 명령을 실행하면 된다. 성공적으로 실행되면 .abi 파일이 생성된다.

이제 생성된 ABI가 있으니, 이 파일에 포함된 요소들을 몇 가지 살펴보자:

<ImageBlock
  src="https://media.alchemy.com/1703767374-generated-contract-abi.png"
  alt="생성된 스마트 컨트랙트 ABI JSON 파일 예시"
  width={1600}
  height={730}
  caption="생성된 컨트랙트 ABI"
/>

### **실행**

ABI는 EVM 바이트코드와 웹사이트의 Javascript 사이의 통역사 역할을 하기 때문에, 스마트 컨트랙트의 함수를 실행하려면 ABI가 필요하다. ABI 외에도 블록체인상의 컨트랙트 주소가 필요하다. 이 과정을 보여주는 간단한 Javascript 코드 스니펫은 다음과 같다:

<ImageBlock
  src="https://media.alchemy.com/1703767477-executing-abi.png"
  alt="ABI와 주소를 사용해 컨트랙트 함수를 실행하는 JavaScript 코드 스니펫"
  width={1600}
  height={880}
  caption="ABI 실행"
/>

이미 배포된 컨트랙트의 ABI를 찾고 싶다면, 컨트랙트 주소로 [Etherscan](https://www.alchemy.com/dapps/etherscan)에서 검색하면 찾을 수 있다. 예를 들어 [여기](https://etherscan.io/address/0xb4eaf48bd7f72356e1019c157e91b81a1c541073#code)를 참고하라:

<ImageBlock
  src="https://media.alchemy.com/1703767569-abi-of-already-deployed-contract.png"
  alt="이미 배포된 컨트랙트의 ABI를 보여주는 Etherscan 컨트랙트 페이지"
  width={1600}
  height={315}
  caption="이미 배포된 컨트랙트의 ABI"
/>

### 인코딩

모든 통신이 바이트코드로 이루어지기 때문에, 개발자가 직접 이 메시지들을 인코딩해야 한다면 상당히 번거로울 것이다. 다행히 Remix와 같은 대중적인 컴파일러가 인코딩을 대신 처리해준다. 이러한 인코딩은 일정한 패턴을 따르므로, [ABI Specification](https://docs.soliditylang.org/en/v0.8.11/abi-spec.html)을 살펴보면 어떻게 동작하는지 더 잘 이해할 수 있다.

처음 4바이트는 함수 시그니처로, 스마트 컨트랙트에서 어떤 유형의 함수가 실행되는지를 나타낸다. 대표적인 함수 식별자로 a9059cbb가 있는데, 이는 [ERC20](https://www.alchemy.com/overviews/erc20-solidity) transfer임을 나타낸다. 더 살펴보고 싶다면 함수 시그니처의 [데이터베이스 디렉토리](https://www.4byte.directory/)가 있다.

<ImageBlock
  src="https://media.alchemy.com/1703767678-function-hashes.png"
  alt="ERC20 transfer 선택자를 포함한 ABI 함수 시그니처 해시 예시"
  width={1069}
  height={418}
  caption="ABI 함수 해시"
/>

다섯 번째 바이트부터는 인자가 인코딩되는 부분이다. 응답도 이와 비슷한 구조를 따르지만 함수 시그니처는 포함되지 않는다.

## **결론**

ABI는 스마트 컨트랙트 작업에서 종종 간과되는 부분이지만, 이 기술의 사용성에서 중요한 역할을 한다. [스마트 컨트랙트 튜토리얼](https://www.alchemy.com/docs/how-to-deploy-a-smart-contract-to-the-sepolia-testnet)을 통해 직접 구축해보는 것은 이 조용한 일꾼의 힘을 이해하고 지식을 적용해볼 수 있는 좋은 방법이다.
