函数选择器 & 事件主题计算器

粘贴函数或事件签名即可得到其选择器和主题哈希;也可以粘贴在 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 哈希的前四个字节。规范签名即函数名加参数类型,不含空格和参数名,例如 transfer(address,uint256) → 0xa9059cbb。EVM 用它把调用路由到正确的函数。

为什么必须用 uint256 而不是 uint?

规范签名使用完整的类型名。在 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。