From 135c254b11e3eefbf282c18869c0a365614cf9f3 Mon Sep 17 00:00:00 2001 From: isol4te <143050870+isol4te@users.noreply.github.com> Date: Fri, 25 Aug 2023 15:23:19 +0800 Subject: [PATCH] Add Calculating Method for Function Signatures with Various Parameter Types --- 29_Selector/Selector.sol | 84 ++++++++++++++++++++++++++++++++++++--- 29_Selector/img/29-2.png | Bin 13758 -> 28270 bytes 29_Selector/img/29-3.png | Bin 27998 -> 18040 bytes 29_Selector/readme.md | 83 +++++++++++++++++++++++++++++++++++--- 4 files changed, 157 insertions(+), 10 deletions(-) diff --git a/29_Selector/Selector.sol b/29_Selector/Selector.sol index 66c5829f..08bc8c3d 100644 --- a/29_Selector/Selector.sol +++ b/29_Selector/Selector.sol @@ -1,9 +1,23 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; +contract DemoContract { + // empty contract +} + contract Selector{ // event 返回msg.data event Log(bytes data); + event SelectorEvent(bytes4); + + // Struct User + struct User { + uint256 uid; + bytes name; + } + + // Enum School + enum School { SCHOOL1, SCHOOL2, SCHOOL3 } // 输入参数 to: 0x2c44b726ADF1963cA47Af88B284C06f30380fC78 function mint(address /*to*/) external{ @@ -16,10 +30,70 @@ contract Selector{ return bytes4(keccak256("mint(address)")); } + // 无参数selector + // 输入: 无 + // nonParamSelector() : 0x03817936 + function nonParamSelector() external returns(bytes4 selectorWithNonParam){ + emit SelectorEvent(this.nonParamSelector.selector); + return bytes4(keccak256("nonParamSelector()")); + } + + // elementary(基础)类型参数selector + // 输入:param1: 1,param2: 0 + // elementaryParamSelector(uint256,bool) : 0x3ec37834 + function elementaryParamSelector(uint256 param1, bool param2) external returns(bytes4 selectorWithElementaryParam){ + emit SelectorEvent(this.elementaryParamSelector.selector); + return bytes4(keccak256("elementaryParamSelector(uint256,bool)")); + } + + // fixed size(固定长度)类型参数selector + // 输入: param1: [1,2,3] + // fixedSizeParamSelector(uint256[3]) : 0xead6b8bd + function fixedSizeParamSelector(uint256[3] memory param1) external returns(bytes4 selectorWithFixedSizeParam){ + emit SelectorEvent(this.fixedSizeParamSelector.selector); + return bytes4(keccak256("fixedSizeParamSelector(uint256[3])")); + } + + // non-fixed size(可变长度)类型参数selector + // 输入: param1: [1,2,3], param2: "abc" + // nonFixedSizeParamSelector(uint256[],string) : 0xf0ca01de + function nonFixedSizeParamSelector(uint256[] memory param1,string memory param2) external returns(bytes4 selectorWithNonFixedSizeParam){ + emit SelectorEvent(this.nonFixedSizeParamSelector.selector); + return bytes4(keccak256("nonFixedSizeParamSelector(uint256[],string)")); + } + + // mapping(映射)类型参数selector + // 输入:demo: 0x9D7f74d0C41E726EC95884E0e97Fa6129e3b5E99, user: [1, "0xa0b1"], count: [1,2,3], mySchool: 1 + // mappingParamSelector(address,(uint256,bytes),uint256[],uint8) : 0xe355b0ce + function mappingParamSelector(DemoContract demo, User memory user, uint256[] memory count, School mySchool) external returns(bytes4 selectorWithMappingParam){ + emit SelectorEvent(this.mappingParamSelector.selector); + return bytes4(keccak256("mappingParamSelector(address,(uint256,bytes),uint256[],uint8)")); + } + // 使用selector来调用函数 - function callWithSignature() external returns(bool, bytes memory){ - // 只需要利用`abi.encodeWithSelector`将`mint`函数的`selector`和参数打包编码 - (bool success, bytes memory data) = address(this).call(abi.encodeWithSelector(0x6a627842, 0x2c44b726ADF1963cA47Af88B284C06f30380fC78)); - return(success, data); + function callWithSignature() external{ + // 初始化uint256数组 + uint256[] memory param1 = new uint256[](3); + param1[0] = 1; + param1[1] = 2; + param1[2] = 3; + + // 初始化struct + User memory user; + user.uid = 1; + user.name = "0xa0b1"; + + // 利用abi.encodeWithSelector将函数的selector和参数打包编码 + // 调用nonParamSelector函数 + (bool success0, bytes memory data0) = address(this).call(abi.encodeWithSelector(0x03817936)); + // 调用elementaryParamSelector函数 + (bool success1, bytes memory data1) = address(this).call(abi.encodeWithSelector(0x3ec37834, 1, 0)); + // 调用fixedSizeParamSelector函数 + (bool success2, bytes memory data2) = address(this).call(abi.encodeWithSelector(0xead6b8bd, [1,2,3])); + // 调用nonFixedSizeParamSelector函数 + (bool success3, bytes memory data3) = address(this).call(abi.encodeWithSelector(0xf0ca01de, param1, "abc")); + // 调用mappingParamSelector函数 + (bool success4, bytes memory data4) = address(this).call(abi.encodeWithSelector(0xe355b0ce, 0x9D7f74d0C41E726EC95884E0e97Fa6129e3b5E99, user, param1, 1)); + require(success0 && success1 && success2 && success3 && success4); } -} +} \ No newline at end of file diff --git a/29_Selector/img/29-2.png b/29_Selector/img/29-2.png index 3202f7372147e56b522648688185c9a764bcd56f..5fbad0c3b5fc8d09ca73df3afe34ffd7b6120b20 100644 GIT binary patch literal 28270 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 W(s3e6j^>jt0e~6?>g8(oFa8%Cj@KCg diff --git a/29_Selector/img/29-3.png b/29_Selector/img/29-3.png index 014832282a42b4f8d10847edcda612d8c2af35bc..2b7155e76d9623bf58451fac0c6fc8b455d5aa37 100644 GIT binary patch literal 18040 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 B6L$ar literal 27998 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 z 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 diff --git a/29_Selector/readme.md b/29_Selector/readme.md index 753d7010..f9ddf1c0 100644 --- a/29_Selector/readme.md +++ b/29_Selector/readme.md @@ -71,17 +71,90 @@ tags: ![method id in remix](./img/29-2.png) +由于计算`method id`时,需要通过函数名和函数的参数类型来计算。在`Solidity`中,函数的参数类型主要分为:基础类型参数,固定长度类型参数,可变长度类型参数和映射类型参数。 + +##### 基础类型参数 +`solidity`中,基础类型的参数有:`uint256`(`uint8`, ... , `uint256`)、`bool`, `address`等。在计算`method id`时,只需要计算`bytes4(keccak256("函数名(参数类型1,参数类型2,...)"))`。例如,如下函数,函数名为`elementaryParamSelector`,参数类型分别为`uint256`和`bool`。所以,只需要计算`bytes4(keccak256("elementaryParamSelector(uint256,bool)"))`便可得到此函数的`method id`。 +```solidity +    // elementary(基础)类型参数selector +    // 输入:param1: 1,param2: 0 +    // elementaryParamSelector(uint256,bool) : 0x3ec37834 +    function elementaryParamSelector(uint256 param1, bool param2) external returns(bytes4 selectorWithElementaryParam){ +        emit SelectorEvent(this.elementaryParamSelector.selector); +        return bytes4(keccak256("elementaryParamSelector(uint256,bool)")); +    } +``` + +##### 固定长度类型参数 +固定长度的参数类型通常为固定长度的数组,例如:`uint256[5]`等。例如,如下函数`fixedSizeParamSelector`的参数为`uint256[3]`。因此,在计算该函数的`method id`时,只需要通过`bytes4(keccak256("fixedSizeParamSelector(uint256[3])"))`即可。 + +```solidity +    // fixed size(固定长度)类型参数selector +    // 输入: param1: [1,2,3] +    // fixedSizeParamSelector(uint256[3]) : 0xead6b8bd +    function fixedSizeParamSelector(uint256[3] memory param1) external returns(bytes4 selectorWithFixedSizeParam){ +        emit SelectorEvent(this.fixedSizeParamSelector.selector); +        return bytes4(keccak256("fixedSizeParamSelector(uint256[3])")); +    } +``` + +##### 可变长度类型参数 +可变长度参数类型通常为可变长的数组,例如:`address[]`、`uint8[]`、`string`等。例如,如下函数`nonFixedSizeParamSelector`的参数为`uint256[]`和`string`。因此,在计算该函数的`method id`时,只需要通过`bytes4(keccak256("nonFixedSizeParamSelector(uint256[],string)"))`即可。 + +```solidity +    // non-fixed size(可变长度)类型参数selector +    // 输入: param1: [1,2,3], param2: "abc" +    // nonFixedSizeParamSelector(uint256[],string) : 0xf0ca01de +    function nonFixedSizeParamSelector(uint256[] memory param1,string memory param2) external returns(bytes4 selectorWithNonFixedSizeParam){ +        emit SelectorEvent(this.nonFixedSizeParamSelector.selector); +        return bytes4(keccak256("nonFixedSizeParamSelector(uint256[],string)")); +    } +``` + +##### 映射类型参数 +映射类型参数通常有:`contract`、`enum`、`struct`等。在计算`method id`时,需要将该类型转化成为`ABI`类型。 + +例如,如下函数`mappingParamSelector`中`DemoContract`需要转化为`address`,结构体`User`需要转化为`tuple`类型`(uint256,bytes)`,枚举类型`School`需要转化为`uint8`。因此,计算该函数的`method id`的代码为`bytes4(keccak256("mappingParamSelector(address,(uint256,bytes),uint256[],uint8)"))`。 + +```solidity +contract DemoContract { +    // empty contract +} + +contract Selector{ +    // Struct User +    struct User { +        uint256 uid; +        bytes name; +    } +    // Enum School +    enum School { SCHOOL1, SCHOOL2, SCHOOL3 } +    ... +    // mapping(映射)类型参数selector +    // 输入:demo: 0x9D7f74d0C41E726EC95884E0e97Fa6129e3b5E99, user: [1, "0xa0b1"], count: [1,2,3], mySchool: 1 +    // mappingParamSelector(address,(uint256,bytes),uint256[],uint8) : 0xe355b0ce +    function mappingParamSelector(DemoContract demo, User memory user, uint256[] memory count, School mySchool) external returns(bytes4 selectorWithMappingParam){ +        emit SelectorEvent(this.mappingParamSelector.selector); +        return bytes4(keccak256("mappingParamSelector(address,(uint256,bytes),uint256[],uint8)")); +    } +    ... +} +``` + ### 使用selector -我们可以利用`selector`来调用目标函数。例如我想调用`mint`函数,我只需要利用`abi.encodeWithSelector`将`mint`函数的`method id`作为`selector`和参数打包编码,传给`call`函数: +我们可以利用`selector`来调用目标函数。例如我想调用`elementaryParamSelector`函数,我只需要利用`abi.encodeWithSelector`将`elementaryParamSelector`函数的`method id`作为`selector`和参数打包编码,传给`call`函数: ```solidity - function callWithSignature() external returns(bool, bytes memory){ - (bool success, bytes memory data) = address(this).call(abi.encodeWithSelector(0x6a627842, 0x2c44b726ADF1963cA47Af88B284C06f30380fC78)); - return(success, data); + // 使用selector来调用函数 + function callWithSignature() external{ + ... + // 调用elementaryParamSelector函数 + (bool success1, bytes memory data1) = address(this).call(abi.encodeWithSelector(0x3ec37834, 1, 0)); + ... } ``` -在日志中,我们可以看到`mint`函数被成功调用,并输出`Log`事件。 +在日志中,我们可以看到`elementaryParamSelector`函数被成功调用,并输出`Log`事件。 ![logs in remix](./img/29-3.png)