함수 셀렉터란 무엇인가요?
함수 셀렉터는 함수의 정규 시그니처를 Keccak-256으로 해시한 값의 처음 4바이트입니다. 정규 시그니처란 함수 이름 뒤에 괄호로 매개변수 타입만 공백이나 이름 없이 나열한 것으로, 예를 들어 transfer(address,uint256) → 0xa9059cbb입니다. 모든 컨트랙트 호출 calldata의 처음 4바이트를 차지하며 컨트랙트에 어떤 함수를 실행할지 알려주고, 나머지 바이트는 ABI 인코딩된 인수입니다.
자주 쓰이는 셀렉터
아래 표는 이 도구와 동일한 Keccak 구현으로 이 페이지에서 직접 계산되므로 자체 테스트 역할도 합니다. 위 입력란에 셀렉터를 붙여넣으면 조회할 수 있습니다.
예시
function approve(address spender, uint256 amount) external returns (bool)를 보겠습니다. 키워드, 매개변수 이름, 가시성, 반환 타입을 제거하면 approve(address,uint256)가 됩니다. 이 ASCII 문자열의 Keccak-256은 0x095ea7b3…로 시작하므로 셀렉터는 0x095ea7b3입니다. 1 USDT(소수점 6자리)를 승인하는 calldata는 셀렉터, 32바이트로 왼쪽 패딩된 spender 주소, 그리고 32바이트 워드로 표현된 1000000으로 구성됩니다: 4 + 32 + 32 = 68바이트.
가장 자주 보게 될 ERC-20 셀렉터
| 시그니처 | 셀렉터 |
|---|---|
totalSupply() | 0x18160ddd |
balanceOf(address) | 0x70a08231 |
transfer(address,uint256) | 0xa9059cbb |
transferFrom(address,address,uint256) | 0x23b872dd |
approve(address,uint256) | 0x095ea7b3 |
allowance(address,address) | 0xdd62ed3e |
흔한 실수
uint256대신uint를 해시하는 경우.transfer(address,uint)는 다른 값으로 해시됩니다. 정규 형식은 항상 비트 폭을 명시합니다.- 매개변수 이름이나 공백을 포함하는 경우.
transfer(address to, uint256 amount)는 정규 시그니처가 아닙니다. - 튜플에 구조체 이름을 사용하는 경우. 구조체는 괄호 안에 필드 타입으로 표기하며, 절대
MyStruct처럼 쓰지 않습니다. - 셀렉터와 토픽을 혼동하는 경우. 함수는 4바이트를 사용하고, 이벤트는 전체 32바이트 해시를 사용합니다.
지원하는 입력 형식
transfer(address,uint256): 정규 형식.function transfer(address to, uint256 amount) external returns (bool): Solidity 선언문. 이름, 가시성, returns는 제거됩니다.event Transfer(address indexed from, address indexed to, uint256 value): 토픽 해시 계산 시indexed키워드는 무시됩니다.0xa9059cbb또는 32바이트 토픽: 내장 목록에서 역조회합니다.
전체 calldata를 만들거나 읽으려면 ABI 인코더 / 디코더로 이어가세요.