이더리움 ABI 인코더 / 디코더

함수 시그니처와 인수를 정확한 calldata로 변환하거나, 트랜잭션의 calldata를 붙여넣어 디코딩하세요. 중첩 배열, 튜플, 동적 bytes와 문자열까지 ABI v2를 완전히 지원하며 워드 단위 분석을 제공합니다.

정수는 10진수 또는 0x hex로 입력할 수 있습니다(따옴표 선택). 주소, bytes, 문자열은 따옴표로 감쌉니다. bytesN은 0x hex 또는 텍스트를 받습니다.
예시:

브라우저에서 JavaScript로 계산됩니다. 주소는 절대 업로드되거나 저장되지 않습니다.

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()"를 클릭하면 워드 단위로 확인할 수 있습니다.

규칙 요약

예시: 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진수 변환기를 이용하세요.

자주 묻는 질문

ABI 인코딩이란 무엇인가요?

Application Binary Interface는 트랜잭션의 data 필드에 인수를 배치하는 방법을 정의합니다. 4바이트 셀렉터 뒤에 32바이트 워드가 이어지며, 정적 타입은 인라인으로 배치되고 동적 타입(bytes, string, 동적 배열, 이를 포함하는 튜플)은 head의 오프셋으로 참조되어 tail에 배치됩니다.

인수는 어떻게 작성하나요?

매개변수 순서대로 JSON 배열로 작성합니다. 정수는 일반 숫자 또는 0x hex로, 따옴표는 있어도 되고 없어도 됩니다. 큰 값은 따옴표로 감싸거나 hex로 쓰는 것이 좋습니다. 주소와 문자열은 따옴표로 감쌉니다. 배열과 튜플은 중첩 배열로 씁니다. 예: uint256[][]에는 [[1,2],[3]].

디코딩된 값이 왜 문자열로 표시되나요?

253보다 큰 정수는 JSON 숫자로 정확히 표현할 수 없으므로 모든 정수는 10진수 문자열로 표시됩니다. 주소는 EIP-55 체크섬이 적용된 형태로 표시됩니다.

Etherscan의 트랜잭션을 디코딩할 수 있나요?

네. input data를 복사해 함수 시그니처와 함께 붙여넣으면 디코딩 전에 셀렉터를 시그니처와 대조합니다. 셀렉터가 일치하지 않으면 엉뚱한 결과 대신 오류가 표시됩니다.

abi.encode와 abi.encodePacked의 차이는 무엇인가요?

abi.encode는 위의 표준 규칙을 따르며 모든 값을 32바이트로 패딩하므로 디코딩이 가능합니다. abi.encodePacked는 패딩이나 오프셋 없이 값을 최소 폭으로 이어 붙입니다. 더 짧지만 모호하며, 타입을 모르면 디코딩할 수 없습니다. 이 도구는 표준 인코딩만 구현합니다.

커스텀 에러와 이벤트도 지원하나요?

인코딩 규칙이 동일하므로 에러의 시그니처로 에러 데이터를 인코딩하거나 디코딩할 수 있습니다. 이벤트 로그는 다릅니다. indexed가 아닌 매개변수는 data 필드에 ABI 인코딩되므로, 그 부분은 indexed가 아닌 타입만 포함한 시그니처로 디코딩하세요.