ABI 인코딩이란 무엇인가요?
ABI 인코딩은 Solidity 컨트랙트 ABI 명세가 정한, 함수 호출을 바이트로 변환하는 규칙입니다. 4바이트 셀렉터 뒤에 인수를 32바이트 워드로 패킹하는데, 정적 값은 인라인으로 배치하고 동적 값(bytes, string, 동적 배열)은 바이트 오프셋을 담은 head 뒤에 배치합니다. ABI 인코더는 시그니처와 값으로 그 calldata를 만들고, 디코더는 이를 역으로 풉니다.
레이아웃 동작 방식
f(uint256,uint32[],bytes10,bytes)를 (0x123, [0x456, 0x789], "1234567890", "Hello, world!")로 호출하면 인코딩은 다음과 같습니다: 셀렉터 0x8be65246, 그다음 4개 워드로 된 head(uint256 값, 배열을 가리키는 오프셋 0x80, 오른쪽 패딩된 bytes10, bytes를 가리키는 오프셋 0xe0), 그다음 tail(배열 길이 2와 두 원소, 이어서 bytes 길이 13과 패딩된 데이터). 위의 "Solidity 문서의 f()"를 클릭하면 워드 단위로 확인할 수 있습니다.
규칙 요약
- 모든 값은 32바이트의 배수를 차지합니다. 정수와 주소는 왼쪽 패딩,
bytesN은 오른쪽 패딩됩니다. - 음수 정수는 256비트 2의 보수를 사용합니다.
- 동적 값은 이를 감싸는 튜플 또는 배열 본문의 시작점에서 측정한 바이트 오프셋으로 참조됩니다.
- 정적
T의 정적 배열T[k]는 인라인으로 배치되고, 동적 배열T[]는 길이로 시작합니다. - 튜플은 같은 head/tail 규칙을 재귀적으로 따르며, 구조체와 중첩 배열도 이 방식으로 인코딩됩니다.
예시: ERC-20 전송
수신자 0x1111111111111111111111111111111111111111와 25 USDT(원시 단위 25,000,000)로 transfer(address,uint256)를 인코딩하면 68바이트가 됩니다: 셀렉터 a9059cbb, 그다음 왼쪽 패딩 0바이트 12개와 20바이트 주소, 그다음 25,000,000 = 0x17d7840를 32바이트 워드로 왼쪽 패딩한 값. 모든 익스플로러의 모든 ERC-20 전송이 정확히 이 형태이므로, 디코더가 셀렉터만으로 함수 이름을 알아내고 인수를 복원할 수 있습니다.
관련 도구
셀렉터만 계산하려면 함수 셀렉터 도구를, 토큰 수량을 원시 정수로 변환하려면 토큰 소수점 변환기를, 개별 워드를 살펴보려면 hex-10진수 변환기를 이용하세요.