Solidity
將我的函式命名為 ccccvKygDv 是否危險?
對於那些在家跟踪的人來說,一個名為的函式的函式雜湊
ccccvKygDv()
是0xffffffff
,與空地址相同。pragma solidity ^0.4.0; contract NullFunction { function ccccvKygDv() public pure { } } contract NormalFunction { function NothingWrongHere() public pure { } }
當我查看上面列出的兩個函式的操作碼時,我得到:
NothingWrongHere()
47 PUSH4 0xffffffff 52 AND 53 DUP1 54 PUSH4 0xb1f6260f
ccccvKygDv()
47 PUSH4 0xffffffff 52 AND 53 DUP1 54 PUSH4 0xffffffff
看起來被推送到堆棧的數據將覆蓋函式本身所需的一些數據。
這是一個愚蠢的問題嗎?絕對可以,但我問它是為了更好地理解合約在操作碼級別上的工作方式。
我相信這只是一個面具。
程式碼載入呼叫數據,將其向右移動,然後進行按位與運算
0xFFFFFFFF
以獲取(現在)底部四個字節(函式選擇器)。然後它將提取的四個字節與已知的函式選擇器進行比較。您要查找的函式簽名恰好是
0xFFFFFFFF
.