1.入参

1.1 两个数组类型的入参

  1. constructor(
  2. address[] memory targets,
  3. bytes[] memory datas
  4. ) public {}

入参:
[“0x0fC5025C764cE34df352757e82f7B5c4Df39A836”],[“0xf8a8fd6d”]
[“0xd9145CCE52D386f254917e481eB44e9943F39138”],[“0xf8a8fd6d”]

  0000000000000000000000000000000000000000000000000000000000000040
    0000000000000000000000000000000000000000000000000000000000000080
    0000000000000000000000000000000000000000000000000000000000000001
    0000000000000000000000000fc5025c764ce34df352757e82f7b5c4df39a836
    0000000000000000000000000000000000000000000000000000000000000001
    0000000000000000000000000000000000000000000000000000000000000020
    0000000000000000000000000000000000000000000000000000000000000004
    f8a8fd6d00000000000000000000000000000000000000000000000000000000

入参:
[“0x0fC5025C764cE34df352757e82f7B5c4Df39A836”,”0xcD6a42782d230D7c13A74ddec5dD140e55499Df9”]
[“0xf8a8fd6d”,”0xf8a8fd6d”]

  0000000000000000000000000000000000000000000000000000000000000040  // 代表有两个入参
    00000000000000000000000000000000000000000000000000000000000000a0  // targets结束位置
    0000000000000000000000000000000000000000000000000000000000000002  // targets的数量 --> memory一定是32字节为一单位的
    0000000000000000000000000fc5025c764ce34df352757e82f7b5c4df39a836
    000000000000000000000000cd6a42782d230d7c13a74ddec5dd140e55499df9
    0000000000000000000000000000000000000000000000000000000000000002  // datas的参数数量
    0000000000000000000000000000000000000000000000000000000000000040  // 当前参数的结束位置在下个word总表示
    0000000000000000000000000000000000000000000000000000000000000080  // 当前参数的结束位置
    0000000000000000000000000000000000000000000000000000000000000004
    f8a8fd6d00000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000004
    f8a8fd6d00000000000000000000000000000000000000000000000000000000"

入参:
[]
[]

  0000000000000000000000000000000000000000000000000000000000000040
    0000000000000000000000000000000000000000000000000000000000000060
    0000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000000000000000000000000000000000000000000000"

1.1 string作为入参

1.1.1 只有一个string 参数

constructor(
        string memory str
    ) public {

    }

入参:
abc

0000000000000000000000000000000000000000000000000000000000000020
0000000000000000000000000000000000000000000000000000000000000003
6162630000000000000000000000000000000000000000000000000000000000
function entry1( string memory str) public{

  }

入参:abc

0xbb1b950c
0000000000000000000000000000000000000000000000000000000000000020
0000000000000000000000000000000000000000000000000000000000000003
6162630000000000000000000000000000000000000000000000000000000000

1.1.2 两个string 参数

  function entry2( string memory str1 ,  string memory str2) public{

  }
<br />入参:<br />abc<br />abc
0x366a83d5
0000000000000000000000000000000000000000000000000000000000000040
0000000000000000000000000000000000000000000000000000000000000080
0000000000000000000000000000000000000000000000000000000000000003
6162630000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000003
6162630000000000000000000000000000000000000000000000000000000000

1.1.3 三个string参数

function entry3( string memory str1 ,  string memory str2 ,string memory str3) public{

  }

入参:
abc
abc
abc

0x6ae46fce
0000000000000000000000000000000000000000000000000000000000000060
00000000000000000000000000000000000000000000000000000000000000a0
00000000000000000000000000000000000000000000000000000000000000e0
0000000000000000000000000000000000000000000000000000000000000003
6162630000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000003
6162630000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000003
6162630000000000000000000000000000000000000000000000000000000000

1.2 uint作为入参

  function entry1( uint256  str) public{

  }
入参:1
     0x499aae35
      0000000000000000000000000000000000000000000000000000000000000001

  function entry2( uint256  str1 ,  uint256 str2) public{

  }

入参: 1,2
[
    "0x499aae35
      0000000000000000000000000000000000000000000000000000000000000001
     0000000000000000000000000000000000000000000000000000000000000002"
]

 function entry3( uint256 str1 ,  uint256 str2 ,uint256 str3) public{

  }

入参:1,2,3

     0x499aae35
      0000000000000000000000000000000000000000000000000000000000000001
     0000000000000000000000000000000000000000000000000000000000000002
     0000000000000000000000000000000000000000000000000000000000000003

1.3uint数组作为入参

contract FuncParam3{


  function entry1( uint256[] memory  str) public{

  }
  -----------------------------------------------------------------
  入参:
  [3,3,3]
  encoding:
 [
    0x467a61d0
  0000000000000000000000000000000000000000000000000000000000000020
  0000000000000000000000000000000000000000000000000000000000000003
  0000000000000000000000000000000000000000000000000000000000000003
  0000000000000000000000000000000000000000000000000000000000000003
  0000000000000000000000000000000000000000000000000000000000000003
 ]
  -----------------------------------------------------------------
  function entry2( uint256[] memory  arr1 ,  uint256[] memory arr2) public{

  }
  -----------------------------------------------------------------
  入参:
  [3, 3, 3]
  [4, 4, 4]
  encoding:
  [
       0x8ad60dc2
    0000000000000000000000000000000000000000000000000000000000000040 //代表有两个入参
      00000000000000000000000000000000000000000000000000000000000000c0 //第二个参数开始位置
    0000000000000000000000000000000000000000000000000000000000000003 // arr1有几个word
    0000000000000000000000000000000000000000000000000000000000000003
    0000000000000000000000000000000000000000000000000000000000000003
    0000000000000000000000000000000000000000000000000000000000000003
    0000000000000000000000000000000000000000000000000000000000000003 // arr2有几个word
    0000000000000000000000000000000000000000000000000000000000000004
    0000000000000000000000000000000000000000000000000000000000000004
    0000000000000000000000000000000000000000000000000000000000000004
 ]

  -----------------------------------------------------------------

 function entry3( uint256[] memory arr1 ,  uint256[]memory arr2 ,uint256[]memory arr3) public{

  }

    -----------------------------------------------------------------
  入参:
  [3, 3, 3]
  [4, 4, 4]
  [5, 5, 5]
  encoding:
  [
       0x8ad60dc2
    0000000000000000000000000000000000000000000000000000000000000060 //代表有三个入参
      00000000000000000000000000000000000000000000000000000000000000e0 //第二个参数开始位置
    0000000000000000000000000000000000000000000000000000000000000160 //第三个参数开始位置
    0000000000000000000000000000000000000000000000000000000000000003 // arr1有几个word
    0000000000000000000000000000000000000000000000000000000000000003
    0000000000000000000000000000000000000000000000000000000000000003
    0000000000000000000000000000000000000000000000000000000000000003
    0000000000000000000000000000000000000000000000000000000000000003 // arr2有几个word
    0000000000000000000000000000000000000000000000000000000000000004
    0000000000000000000000000000000000000000000000000000000000000004
    0000000000000000000000000000000000000000000000000000000000000004
    0000000000000000000000000000000000000000000000000000000000000003 // arr3有几个word
    0000000000000000000000000000000000000000000000000000000000000005
    0000000000000000000000000000000000000000000000000000000000000005
    0000000000000000000000000000000000000000000000000000000000000005
 ]

  -----------------------------------------------------------------

}

1.4 bytes作为入参

首先我们需要知道bytes实际上是bytes32[]


contract FuncParam4{

  // 1,2,3
  function entry1( bytes memory  str) public{

  }

入参:
[2,3,4]
encoding:
0x7bec2f72
0000000000000000000000000000000000000000000000000000000000000020
0000000000000000000000000000000000000000000000000000000000000003
0203040000000000000000000000000000000000000000000000000000000000

function entry2( bytes memory  str1 ,  bytes memory str2) public{

}
入参:
[2,3,4],[2,3,4]
encoding:
0xc4de6174
0000000000000000000000000000000000000000000000000000000000000040
0000000000000000000000000000000000000000000000000000000000000080
0000000000000000000000000000000000000000000000000000000000000003
0203040000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000003
0203040000000000000000000000000000000000000000000000000000000000

 function entry3( bytes memory str1 ,  bytes memory str2 ,bytes memory str3) public{

 }


}

1.5 bytes[] 作为入参

contract FuncParam5{


  function entry1( bytes[] memory  str) public{

  }

入参: [[2,3,4],[2,3,4]]

encoding:

0xfb502510 0000000000000000000000000000000000000000000000000000000000000020 0000000000000000000000000000000000000000000000000000000000000002 0000000000000000000000000000000000000000000000000000000000000040 0000000000000000000000000000000000000000000000000000000000000080 0000000000000000000000000000000000000000000000000000000000000003 0203040000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000003 0203040000000000000000000000000000000000000000000000000000000000

入参: [2,3,4],[2,3,4],[2,3,4]]

encoding:

0xfb502510 0000000000000000000000000000000000000000000000000000000000000020 // 仅有一个参数 0000000000000000000000000000000000000000000000000000000000000003 // 标识该数组长度为3个word 0000000000000000000000000000000000000000000000000000000000000060 // 标识有3个元素 00000000000000000000000000000000000000000000000000000000000000a0 // 数组第二个元素第二个起始地址 00000000000000000000000000000000000000000000000000000000000000e0 // 数组第三个元素第三个参数起始地址 0000000000000000000000000000000000000000000000000000000000000003 0203040000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000003 0203040000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000003 0203040000000000000000000000000000000000000000000000000000000000

  function entry2( bytes[] memory  str1 ,  bytes[] memory str2) public{

  }

入参: [[2,3,4],[2,3,4],[2,3,4]],[[4,5,6],[4,5,6],[4,5,6]]

encoding: [ 0xb238faa3 0000000000000000000000000000000000000000000000000000000000000040 // 代表有两个入参 0000000000000000000000000000000000000000000000000000000000000180 // 第二个入参开始位置 0000000000000000000000000000000000000000000000000000000000000003 // 第一个入参标识位占据的word的数量 0000000000000000000000000000000000000000000000000000000000000060 // 当前数组包含3个元素 00000000000000000000000000000000000000000000000000000000000000a0 // 当前数组第二个元素开始位置 00000000000000000000000000000000000000000000000000000000000000e0
0000000000000000000000000000000000000000000000000000000000000003 0203040000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000003 0203040000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000003 0203040000000000000000000000000000000000000000000000000000000000 —- 第二个参数开始 —- 0000000000000000000000000000000000000000000000000000000000000003 // 第二个入参标识位占据的word的数量 0000000000000000000000000000000000000000000000000000000000000060 // 当前数组包含3个元素 00000000000000000000000000000000000000000000000000000000000000a0 // 当前数组第二个元素开始位置 00000000000000000000000000000000000000000000000000000000000000e0 // 当前数组第二个元素开始位置 0000000000000000000000000000000000000000000000000000000000000003 0405060000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000003 0405060000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000003 0405060000000000000000000000000000000000000000000000000000000000 ]