Solidity极简入门#29. 函数选择器Selector

selector

当我们调用智能合约时,本质上是向目标合约发送了一段calldata,在remix中发送一次交易后,可以在详细信息中看见input即为此次交易的calldata

Solidity极简入门#29. 函数选择器Selector_智能合约

发送的calldata中前4个字节是selector(函数选择器)。这一讲,我们将介绍selector是什么,以及如何使用。

msg.data

msg.data是solidity中的一个全局变量,值为完整的calldata(调用函数时传入的数据)。

在下面的代码中,我们可以通过Log事件来输出调用mint函数的calldata:

// event 返回msg.data
    event Log(bytes data);

    function mint(address to) external{
        emit Log(msg.data);
    }

当参数为​​0x2c44b726ADF1963cA47Af88B284C06f30380fC78​​时,输出的​​calldata​​为

0x6a6278420000000000000000000000002c44b726adf1963ca47af88b284c06f30380fc78

这段很乱的字节码可以分成两部分:

前4个字节为函数选择器selector:
0x6a627842

后面32个字节为输入的参数:
0x0000000000000000000000002c44b726adf1963ca47af88b284c06f30380fc78

其实calldata就是告诉智能合约,我要调用哪个函数,以及参数是什么。

method id、selector和函数签名

method id定义为函数签名的Keccak哈希后的前4个字节,当selector与method id相匹配时,即表示调用该函数,那么函数签名是什么?

其实在第21讲中,我们简单介绍了函数签名,为"函数名(逗号分隔的参数类型)"。举个例子,上面代码中mint的函数签名为"​​mint(address)​​"。在同一个智能合约中,不同的函数有不同的函数签名,因此我们可以通过函数签名来确定要调用哪个函数。

注意,在函数签名中,uint和int要写为uint256和int256。

我们写一个函数,来验证mint函数的method id是否为​​0x6a627842​​。大家可以运行下面的函数,看看结果。

function mintSelector() external pure returns(bytes4 mSelector){
  return bytes4(keccak256("mint(address)"));
}

结果正是​​0x6a627842​​:

Solidity极简入门#29. 函数选择器Selector_web3_02

使用selector

我们可以利用selector来调用目标函数。例如我想调用mint函数,我只需要利用​​abi.encodeWithSelector​​将​​mint​​函数的method id作为​​selector​​和参数打包编码,传给call函数:

function callWithSignature() external returns(bool, bytes memory){
  (bool success, bytes memory data) = address(this).call(abi.encodeWithSelector(0x6a627842, 0x2c44b726ADF1963cA47Af88B284C06f30380fC78));
  return(success, data);
}

在日志中,我们可以看到mint函数被成功调用,并输出Log事件。

Solidity极简入门#29. 函数选择器Selector_区块链_03

总结

这一讲,我们介绍了什么是函数选择器(selector),它和msg.data、函数签名的关系,以及如何使用它调用目标函数。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值