ABI(Application Binary Interface)는 스마트 컨트랙트와 외부(다른 컨트랙트, DApp, 라이브러리, 사용자 등)가 서로 통신할 때 필요한 "규격서" 같은 역할을 하는 개념
→ API와 흡사
사람이 읽는 함수명, 변수명, 파라미터 → 블록체인 노드가 이해하는 바이너리 형식(16진수)으로 변환하고 (그 반대도 수행)
컨트랙트가 블록체인에 배포되면 내부 함수나 변수는 주소만으로 직접 알 수 없어
어떤 함수가 있는지 어떤 파라미터 타입을 받을지 알려주는 것이 ABI
EVM(Ethereum Virtual Machine)은 바이트코드(0x... 형태)만 이해할 수 있음
예를 들어 transfer(address,uint256)라는 함수를 호출하려면
함수명과 파라미터를 정해진 규칙에 따라 해시+인코딩 해야 하는데
→ ABI가 이 규칙을 정의해줌
예를 들어
e.g ERC ERC20의 일부 ABI
[
{
"name": "transfer",
"type": "function",
"inputs": [
{ "name": "_to", "type": "address" },
{ "name": "_value", "type": "uint256" }
],
"outputs": [
{ "name": "", "type": "bool" }
]
}
]
이걸 기반으로 Web3 라이브러리(ethers.js, viem)가
transfer(address,uint256) → 0xa9059cbb(첫 4바이트 해시) 변환
주소·토큰 수량을 32바이트 단위로 패딩
최종적으로 트랜잭션에 넣을 data를 생성
ABI = 스마트 컨트랙트의 “통신 프로토콜 설명서”
함수명, 파라미터 타입, 반환값, 이벤트 구조를 JSON 형식으로 정의
Web3 라이브러리가 ABI를 기반으로 함수 호출 → EVM이 이해하는 바이트코드로 변환
EVM 응답(바이너리) → 사람이 읽을 수 있는 값으로 변환