Function Selector
什麼是 Function Selector?
呼叫智能合約時,告述互動的合約要調用哪個函式,長度是4個bytes(前 8 個 16 進制)。
Function Selector怎麼計算
將函數的名稱與型別做keccak256取前8位16進制
1 | functionName(type1,type2,type3,...) |
只取型別跟函數名稱、引數名稱、空格、return、modifier都不看
會不會有相同的function selector?
因為是Hahs Function出來的,因此有機會發生但機率極小
transfer(address,uint256) 的 selector是什麼
keccak256(”transfer(address,uint256)”)
a9059cbb2ab09eb219583f4a59a5d0623ade346d962bcd4e46b11da047c9049b
取前8位 -> a9059cbb
transfer(address,uint256)的selector :a9059cbb
什麼是 Calldata,他的結構是什麼?
Calldata來自 ETH 發送交易 Data 欄位,傳給帳戶的資料,前4 bytes是 Function Selector,後每32bytes是參數。
如果只有 Calldata 沒有合約 ABI,還能解析函數呼叫嗎
合約ABI,紀錄某個合約有哪些函數,如果沒有 ABI 的話很難解析,只能用猜的。
找出一個例子是不同的 Function,但是 Function Selector一樣
可以到以下網站看,Hahs相同的Function Selector。
Ethereum Signature Database
解析這個 CallData
1 | 0xa9059cbb0000000000000000000000004b3eff0aba7a17bb82ebda009a2e1bbcf4afe4920000000000000000000000000000000000000000000000002d7cfb3dca13ff08 |
前8位是Function Selector,後每32位是傳入資料。
0xa9059cbb (Function Selector)
0000000000000000000000004b3eff0aba7a17bb82ebda009a2e1bbcf4afe492 (arg1)
0000000000000000000000000000000000000000000000002d7cfb3dca13ff08 (arg2)
算出Function Selector後,查表a9059cbb,transfer(address,uint256)。