修改Solidity中函数的状态可变性是否会改变ERC165定义的接口ID?
修改Solidity函数的状态可变性会影响ERC165接口ID吗?
结论是不会,具体原因如下:
- ERC165的接口ID是对接口内所有函数的函数选择器做异或运算得到的。
- 函数选择器只由函数的签名决定——也就是函数名+括号里的参数类型列表,
view/pure/payable这类状态可修饰符根本不算函数签名的一部分。 - 举个实际例子:
- 带
view的函数function balanceOf(address) external view returns (uint256),和去掉view的function balanceOf(address) external returns (uint256),二者的函数选择器完全一致。 - 所以哪怕你修改函数的状态可变性,只要函数名和参数类型没改,函数选择器就不变,最终算出来的ERC165接口ID自然也不会变。
- 带
另外要注意,状态可变性不影响接口ID,但会直接限制函数的行为——比如view函数不能修改合约状态,payable函数能接收ETH,这些特性和ERC165的接口识别是完全独立的两回事。
内容的提问来源于stack exchange,提问作者gaurav
相关产品推荐
相关产品推荐

