Solidity ABI 인코딩 기본 구조
ABI란?
- ABI(Application Binary Interface) 는 스마트컨트랙트와 외부(EOA, 다른 컨트랙트, 클라이언트 앱) 간에 데이터를 주고받는 표준 규격입니다.
- 함수 호출 시, 어떤 함수(selector)를 호출할지와 어떤 인자(arguments)를 전달할지를 바이트 배열(calldata) 형식으로 변환해야 하는데, 이 과정을 ABI 인코딩이라고 부릅니다.
ABI 인코딩 바이트 수 계산 규칙
- 함수 selector
- 정적 타입 인자 (uint256, address, bool 등)
- 인자 1개당 32바이트
- 왜냐하면 ABI는 모든 정적 인자를 32바이트로 패딩하기 때문
- 동적 타입 인자 (bytes, string, 동적 배열 등)
- “헤더 부분”: offset(32바이트) → 실제 데이터가 어디서 시작하는지 표시해주는 것
- “데이터 부분”: length(32바이트) → 실제 데이터의 크기가 어느정도 인지 표시해주는 것
- “데이터 부분”: 실제 데이터(패딩 포함 32바이트 단위) → 실제 데이터 정보
함수 호출 시 calldata 기본 구조
정적 타입 인자
function selector(4) + 인자(32) + …(인자가 늘어나면 계속 추가됨)
- ex) uint256, bool, address, bytes32
동적 타입 인자