함수 셀렉터 & 이벤트 토픽 계산기

함수 또는 이벤트 시그니처를 붙여넣어 셀렉터와 토픽 해시를 얻거나, calldata에서 찾은 셀렉터를 붙여넣어 어떤 일반 함수에 해당하는지 확인하세요.

매개변수 이름, function, indexed, memory와 returns 절은 자동으로 제거되며, uint는 uint256으로 변환됩니다.

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

함수 셀렉터란 무엇인가요?

함수 셀렉터는 함수의 정규 시그니처를 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

흔한 실수

지원하는 입력 형식

전체 calldata를 만들거나 읽으려면 ABI 인코더 / 디코더로 이어가세요.

자주 묻는 질문

함수 셀렉터란 무엇인가요?

정규 함수 시그니처(이름과 매개변수 타입만, 공백이나 이름 없이)를 Keccak-256으로 해시한 값의 처음 4바이트입니다. 예: transfer(address,uint256) → 0xa9059cbb. EVM은 이 값으로 호출을 올바른 함수로 라우팅합니다.

왜 uint가 아니라 uint256을 써야 하나요?

정규 시그니처는 전체 타입 이름을 사용합니다. Solidity에서 uint는 uint256의 별칭이며, 별칭을 해시하면 잘못된 셀렉터가 나옵니다. 이 도구는 uint/int를 자동으로 변환하고 매개변수 이름과 데이터 위치 키워드를 제거합니다.

튜플(구조체)은 어떻게 표기하나요?

괄호로 묶은 타입 목록으로 표기합니다: exactInputSingle((address,address,uint24,address,uint256,uint256,uint256,uint160)). 구조체의 필드를 순서대로 쓰며, 구조체 이름 자체는 시그니처에 포함되지 않습니다.

이벤트 토픽이란 무엇인가요?

이벤트 시그니처의 전체 32바이트 Keccak-256 해시로, 해당 이벤트가 발생시키는 모든 로그의 topics[0]에 저장됩니다. 예: Transfer(address,address,uint256) → 0xddf252ad…. indexed 매개변수는 topics[1..3]이 됩니다.

가능한 셀렉터는 몇 개나 되나요?

4바이트는 232, 약 43억 개의 값을 가질 수 있습니다. 수만 개의 알려진 시그니처가 있는 상황에서 충돌은 드물지만 실제로 존재합니다. 하나의 컨트랙트 안에서는 Solidity 컴파일러가 같은 셀렉터를 가진 두 함수를 허용하지 않습니다.

두 함수가 같은 셀렉터를 가질 수 있나요?

네. 4바이트만 사용하기 때문에 충돌이 존재합니다. 그래서 조회 결과에 여러 시그니처가 나올 수 있고, 같은 컨트랙트 안에서는 EVM이 둘을 구분하지 못합니다. 알 수 없는 셀렉터는 공개 데이터베이스인 4byte.directory와 openchain.xyz를 이용하세요.