هنگامی که یک تابع فراخوانی می شود، 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)));
}
}