19. Solidity:函數(shù)選擇器(函數(shù)簽名)

19.1 selector

當(dāng)我們調(diào)用智能合約時(shí)漆弄,本質(zhì)上是向目標(biāo)合約發(fā)送了一段calldata睦裳,在remix中發(fā)送一次交易后,可以在詳細(xì)信息中看見input即為此次交易的calldata廉邑。

發(fā)送的calldata中前4個(gè)字節(jié)是selector(函數(shù)選擇器)渤愁。
示例代碼,將msg.data作為事件發(fā)出:

contract Selector {
    address public addr;
    event Log(bytes data);

    function selector(address _addr) external {
        addr = _addr;
        emit Log(msg.data);
    }
}

remix日志中的input:


input

Log信息(msg.data):

[
    {
        "from": "0xc5c97AAd92a962396229cbC8392e62585B04DfB3",
        "topic": "0xafabcf2dd47e06a477a89e49c03f8ebe8e0a7e94f775b25bbb24227c9d0110b2",
        "event": "Log",
        "args": {
            "0": "0x91fa5ace0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4",
            "data": "0x91fa5ace0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4"
        }
    }
]

可見input信息和全局變量msg.data相同,都是此次調(diào)用函數(shù)的calldata:

0x91fa5ace0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4

前四個(gè)字節(jié)為函數(shù)選擇器:
0x91fa5ace
后面32字節(jié)為傳入的參數(shù)(20字節(jié)的地址補(bǔ)零):
0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4

calldata作用是:告訴智能合約饰剥,要調(diào)用哪個(gè)函數(shù),以及參數(shù)是什么。

19.2 函數(shù)簽名、selector和method id

  • 函數(shù)簽名:"函數(shù)名(逗號(hào)分隔的參數(shù)類型)"灾常,例如例子中selector()的函數(shù)簽名是:

    "selector(address)"

  • selector:函數(shù)選擇器為calldata的前四個(gè)字節(jié)雕什。
  • method id:函數(shù)簽名哈希值的前四個(gè)字節(jié)磷雇,例如:

    bytes4(keccak256("selector(address)"))

實(shí)現(xiàn)一個(gè)函數(shù)獲取上述例子中selector()函數(shù)的method id:

    function getSelector() external pure returns (bytes4){
        return bytes4(keccak256("selector(address)"));
    }

調(diào)用函數(shù)的返回值和函數(shù)選擇器相同睁本,為0x91fa5ace。Solidity中通過函數(shù)選擇器(selector)匹配method id的方式確定要調(diào)用的函數(shù)。

19.3 selector的使用

我們可以利用selector來調(diào)用目標(biāo)函數(shù)惹资。例如我想調(diào)用selector()函數(shù)侮措,我只需要利用abi.encodeWithSelector將selector()函數(shù)的method id作為selector和參數(shù)打包編碼畏吓,傳給call函數(shù):

    function useSelector(address _addr) external returns (bool) {
        (bool success, ) = address(this).call(abi.encodeWithSelector(0x91fa5ace, _addr));
        return success;
    }

調(diào)用selector()函數(shù)成功巴粪,輸出的Log:

[
    {
        "from": "0xf02A102153DDf132032B7De5D19F43aA049052Dd",
        "topic": "0xafabcf2dd47e06a477a89e49c03f8ebe8e0a7e94f775b25bbb24227c9d0110b2",
        "event": "Log",
        "args": {
            "0": "0x91fa5ace0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4",
            "data": "0x91fa5ace0000000000000000000000005b38da6a701c568545dcfcb03fcb875f56beddc4"
        }
    }
]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芭届,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖草冈,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隙赁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡勤哗,警方通過查閱死者的電腦和手機(jī)诱咏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咸包,“玉大人芦鳍,你說我怎么就攤上這事。” “怎么了宣谈?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵勋锤,是天一觀的道長(zhǎng)矮冬。 經(jīng)常有香客問我胎署,道長(zhǎng)巨坊,這世上最難降的妖魔是什么鼓寺? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任想括,我火速辦了婚禮,結(jié)果婚禮上位迂,老公的妹妹穿的比我還像新娘访雪。我一直安慰自己,他們只是感情好掂林,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布臣缀。 她就那樣靜靜地躺著,像睡著了一般党饮。 火紅的嫁衣襯著肌膚如雪肝陪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天刑顺,我揣著相機(jī)與錄音氯窍,去河邊找鬼。 笑死蹲堂,一個(gè)胖子當(dāng)著我的面吹牛狼讨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柒竞,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼政供,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起布隔,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤离陶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后衅檀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體招刨,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年哀军,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沉眶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杉适,死狀恐怖谎倔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情猿推,我是刑警寧澤片习,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站彤守,受9級(jí)特大地震影響毯侦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜具垫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一侈离、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筝蚕,春花似錦卦碾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至坯沪,卻和暖如春绿映,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腐晾。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工叉弦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人藻糖。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓淹冰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親巨柒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子樱拴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容