Abi
功能選擇器的優點是什麼?
我無法理解功能選擇器的優勢。以下連結 什麼是函式選擇器?
使用函式選擇器來呼叫另一個合約的函式,但它使用以下語句:
bytes4 selector = contract1.func.selector; bytes memory data = abi.encodeWithSelector(selector, uint256(789), uint8(123));
這意味著對於函式選擇器,我們必須知道函式名稱和要呼叫的函式的參數。
現在考慮另一個連結error-member-func-not-found-or-not-visible-after-argument-dependent-lookup-in
它還呼叫了contract1 的函式’func’,而不使用函式選擇器。但它也使用函式名和參數列表。
(uint32 arg1, uint32 arg2) = contract1.func(uint256(789), uint8(123));
所以無論有沒有函式選擇器,我們都必須知道函式名和 argumnet 列表。那麼使用函式選擇器有什麼好處呢?
在您的兩個程式碼範例中,函式選擇器用於告訴目標合約您正在呼叫什麼函式。在第二種情況下,Solidity 正在為您生成使用函式選擇器的程式碼。這通常是一種更好的方法。(如果編譯器可以為您處理,您無需直接處理函式選擇器。)
也就是說,如果您使用非 Solidity 語言編寫程式碼或事先不知道函式簽名(例如通用多簽名錢包) ,您*確實需要自己處理函式選擇器。*在這些情況下,您必須自己做一些工作來製作正確的交易數據。
函式選擇器除了用於呼叫函式之外還有其他用途
我已經看到它在各種情況下使用:
- 記錄函式呼叫
- 驗證針對特定功能的簽名消息
- 生成 ID
- 功能級訪問控制