정지용
기술스택 목록
블록체인

Solidity ABI

프로젝트 1에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

스마트 컨트랙트와 외부 프로그램이 함수를 호출하고 데이터를 주고받을 때 쓰는 표준 인터페이스 규격

Solidity ABI(Application Binary Interface)는 이더리움 스마트 컨트랙트의 함수, 인자, 반환값을 바이트코드 수준에서 어떻게 인코딩·디코딩할지 정의하는 표준 규격이다. 컨트랙트는 컴파일 시 바이트코드로 변환되어 함수 이름이나 타입 정보가 사라지므로, 외부에서 이를 호출하려면 어떤 형식으로 데이터를 담아 보내야 하는지 약속이 필요하다. ABI는 이 약속을 JSON 형태의 명세로 제공해, 지갑·프론트엔드·다른 컨트랙트 등 서로 다른 클라이언트가 동일한 방식으로 함수 호출 데이터를 만들고 응답 결과를 해석할 수 있게 한다.

이럴 때 사용합니다

  • 프론트엔드나 스크립트에서 배포된 컨트랙트의 함수를 호출/조회해야 할 때
  • 여러 클라이언트(웹, 백엔드, 다른 컨트랙트)가 동일한 컨트랙트 인터페이스를 공유해야 할 때
  • 이벤트 로그나 함수 반환값을 원래 타입으로 파싱해야 할 때
  • 컨트랙트 소스 없이 바이트코드만으로 호출 데이터를 구성해야 할 때

핵심 개념

ABI JSON
컨트랙트의 함수, 이벤트, 생성자 등을 이름·인자 타입·반환 타입과 함께 나열한 JSON 배열로, 컴파일러가 소스코드로부터 자동 생성한다.
Function Selector
함수 시그니처를 해시한 값의 앞 4바이트로, 트랜잭션 데이터의 맨 앞에 붙어 어떤 함수를 호출할지 식별하는 데 쓰인다.
ABI Encoding
함수 인자를 규칙에 따라 고정 길이 바이트열로 직렬화하는 과정으로, 컨트랙트 호출 시 calldata를 구성하는 데 사용된다.
ABI Decoding
인코딩된 바이트열을 다시 원래 타입의 값으로 해석하는 과정으로, 함수 반환값이나 이벤트 로그를 읽을 때 필요하다.
State Mutability
함수가 상태를 변경하는지, 읽기 전용인지, 결제 가능한지를 나타내는 속성(view, pure, payable 등)으로 ABI 항목에 함께 명시된다.

함수 하나를 기술하는 ABI JSON 항목

transfer 함수의 이름, 인자 타입, 반환 타입, 상태 변경 여부를 담은 ABI 항목이며, 클라이언트 라이브러리는 이를 읽어 호출 데이터를 인코딩하고 결과를 디코딩한다.

JSON
[
  {
    "type": "function",
    "name": "transfer",
    "inputs": [
      { "name": "to", "type": "address" },
      { "name": "amount", "type": "uint256" }
    ],
    "outputs": [
      { "name": "", "type": "bool" }
    ],
    "stateMutability": "nonpayable"
  }
]

처음 쓸 때 흔한 함정

  • ABI는 컨트랙트 배포 후 소스코드와 별개로 관리되므로 버전이 어긋나면 잘못 디코딩된다
  • 함수 오버로딩 시 이름만으로는 구분이 안 되고 전체 시그니처로 selector가 결정된다
  • 동적 타입(배열, 문자열 등)은 고정 타입과 인코딩 방식이 달라 오프셋 계산에 주의가 필요하다

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.