Function Selector
概要
EVMで、実行する関数を一意に特定するときの関数のIDの付け方のお話
仕様
function idはfunction signatureをsha3でハッシュ化した最初の4byte
function signatureは、function nameの後にそのfunctionのparameter typesを(スペースを入れずに)カンマで区切って括弧を付けたもの
例
code: function id of onERC721Received
bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))
web3でfunction signatureを計算するとき
code: encodeFunctionSignature
// From a JSON interface object
web3.eth.abi.encodeFunctionSignature({
name: 'myMethod',
type: 'function',
inputs: [{
type: 'uint256',
name: 'myNumber'
},{
type: 'string',
name: 'myString'
}]
})
0x24ee0097
// Or string
web3.eth.abi.encodeFunctionSignature('myMethod(uint256,string)')
'0x24ee0097'
実装
Solidity
各クラスの canonicalName
Vyper
def canonicalize_type
yudetamago.icon > 見た感じVyperのfunction idの実装は、TypeNameについてはSolidityと互換性がありそう
VyperとSolidityのコンパイル時の違い
Vyper
calldataの先頭32bytesはメモリの28~59のところに格納
メモリの0~27は0、よって、メモリの先頭32バイトが、左側を0で埋められた32バイトの関数シグネチャになる
Solidity
calldataの先頭32bytesはまずスタックに入る
そして、2^(28*8)で割り算(28バイト右シフト)
リンク