1.入参
1.1 两个数组类型的入参
constructor(
address[] memory targets,
bytes[] memory datas
) 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 ]