Siblearn Academy siblearn academy

Function Selector

هنگامی که یک تابع فراخوانی می شود، 4 بایت اول از داده های تماس مشخص می کند که کدام تابع را فراخوانی کند.

این 4 بایت انتخابگر تابع نامیده می شود.

به عنوان مثال، این کد زیر را در نظر بگیرید. زنگ زدن برای اجرای انتقال در یک قرارداد در آدرس اضافه.

4 بایت اول از abi.encodeWithSignature(...) انتخابگر تابع است.

شاید اگر انتخابگر تابع را در کد خود از قبل محاسبه کرده و درون خط قرار دهید، بتوانید مقدار کمی از گاز را ذخیره کنید؟

در اینجا نحوه محاسبه انتخابگر تابع آورده شده است.


addr.call(abi.encodeWithSignature("transfer(address,uint256)", 0xSomeAddress, 123))
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract FunctionSelector {
    /*
    "transfer(address,uint256)"
    0xa9059cbb
    "transferFrom(address,address,uint256)"
    0x23b872dd
    */
    function getSelector(string calldata _func)
        external
        pure
        returns (bytes4)
    {
        return bytes4(keccak256(bytes(_func)));
    }
}

روی محیط توسعه ی Remix امتحان بکنید

  • FunctionSelector.sol
  • بازگشت به لیست