github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/accounts/abi/pack_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:31</date>
    10  //</624450062411370496>
    11  
    12  
    13  package abi
    14  
    15  import (
    16  	"bytes"
    17  	"math"
    18  	"math/big"
    19  	"reflect"
    20  	"strings"
    21  	"testing"
    22  
    23  	"github.com/ethereum/go-ethereum/common"
    24  )
    25  
    26  func TestPack(t *testing.T) {
    27  	for i, test := range []struct {
    28  		typ        string
    29  		components []ArgumentMarshaling
    30  		input      interface{}
    31  		output     []byte
    32  	}{
    33  		{
    34  			"uint8",
    35  			nil,
    36  			uint8(2),
    37  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    38  		},
    39  		{
    40  			"uint8[]",
    41  			nil,
    42  			[]uint8{1, 2},
    43  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    44  		},
    45  		{
    46  			"uint16",
    47  			nil,
    48  			uint16(2),
    49  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    50  		},
    51  		{
    52  			"uint16[]",
    53  			nil,
    54  			[]uint16{1, 2},
    55  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    56  		},
    57  		{
    58  			"uint32",
    59  			nil,
    60  			uint32(2),
    61  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    62  		},
    63  		{
    64  			"uint32[]",
    65  			nil,
    66  			[]uint32{1, 2},
    67  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    68  		},
    69  		{
    70  			"uint64",
    71  			nil,
    72  			uint64(2),
    73  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    74  		},
    75  		{
    76  			"uint64[]",
    77  			nil,
    78  			[]uint64{1, 2},
    79  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    80  		},
    81  		{
    82  			"uint256",
    83  			nil,
    84  			big.NewInt(2),
    85  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    86  		},
    87  		{
    88  			"uint256[]",
    89  			nil,
    90  			[]*big.Int{big.NewInt(1), big.NewInt(2)},
    91  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    92  		},
    93  		{
    94  			"int8",
    95  			nil,
    96  			int8(2),
    97  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    98  		},
    99  		{
   100  			"int8[]",
   101  			nil,
   102  			[]int8{1, 2},
   103  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   104  		},
   105  		{
   106  			"int16",
   107  			nil,
   108  			int16(2),
   109  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
   110  		},
   111  		{
   112  			"int16[]",
   113  			nil,
   114  			[]int16{1, 2},
   115  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   116  		},
   117  		{
   118  			"int32",
   119  			nil,
   120  			int32(2),
   121  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
   122  		},
   123  		{
   124  			"int32[]",
   125  			nil,
   126  			[]int32{1, 2},
   127  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   128  		},
   129  		{
   130  			"int64",
   131  			nil,
   132  			int64(2),
   133  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
   134  		},
   135  		{
   136  			"int64[]",
   137  			nil,
   138  			[]int64{1, 2},
   139  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   140  		},
   141  		{
   142  			"int256",
   143  			nil,
   144  			big.NewInt(2),
   145  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
   146  		},
   147  		{
   148  			"int256[]",
   149  			nil,
   150  			[]*big.Int{big.NewInt(1), big.NewInt(2)},
   151  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   152  		},
   153  		{
   154  			"bytes1",
   155  			nil,
   156  			[1]byte{1},
   157  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   158  		},
   159  		{
   160  			"bytes2",
   161  			nil,
   162  			[2]byte{1},
   163  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   164  		},
   165  		{
   166  			"bytes3",
   167  			nil,
   168  			[3]byte{1},
   169  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   170  		},
   171  		{
   172  			"bytes4",
   173  			nil,
   174  			[4]byte{1},
   175  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   176  		},
   177  		{
   178  			"bytes5",
   179  			nil,
   180  			[5]byte{1},
   181  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   182  		},
   183  		{
   184  			"bytes6",
   185  			nil,
   186  			[6]byte{1},
   187  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   188  		},
   189  		{
   190  			"bytes7",
   191  			nil,
   192  			[7]byte{1},
   193  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   194  		},
   195  		{
   196  			"bytes8",
   197  			nil,
   198  			[8]byte{1},
   199  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   200  		},
   201  		{
   202  			"bytes9",
   203  			nil,
   204  			[9]byte{1},
   205  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   206  		},
   207  		{
   208  			"bytes10",
   209  			nil,
   210  			[10]byte{1},
   211  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   212  		},
   213  		{
   214  			"bytes11",
   215  			nil,
   216  			[11]byte{1},
   217  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   218  		},
   219  		{
   220  			"bytes12",
   221  			nil,
   222  			[12]byte{1},
   223  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   224  		},
   225  		{
   226  			"bytes13",
   227  			nil,
   228  			[13]byte{1},
   229  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   230  		},
   231  		{
   232  			"bytes14",
   233  			nil,
   234  			[14]byte{1},
   235  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   236  		},
   237  		{
   238  			"bytes15",
   239  			nil,
   240  			[15]byte{1},
   241  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   242  		},
   243  		{
   244  			"bytes16",
   245  			nil,
   246  			[16]byte{1},
   247  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   248  		},
   249  		{
   250  			"bytes17",
   251  			nil,
   252  			[17]byte{1},
   253  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   254  		},
   255  		{
   256  			"bytes18",
   257  			nil,
   258  			[18]byte{1},
   259  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   260  		},
   261  		{
   262  			"bytes19",
   263  			nil,
   264  			[19]byte{1},
   265  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   266  		},
   267  		{
   268  			"bytes20",
   269  			nil,
   270  			[20]byte{1},
   271  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   272  		},
   273  		{
   274  			"bytes21",
   275  			nil,
   276  			[21]byte{1},
   277  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   278  		},
   279  		{
   280  			"bytes22",
   281  			nil,
   282  			[22]byte{1},
   283  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   284  		},
   285  		{
   286  			"bytes23",
   287  			nil,
   288  			[23]byte{1},
   289  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   290  		},
   291  		{
   292  			"bytes24",
   293  			nil,
   294  			[24]byte{1},
   295  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   296  		},
   297  		{
   298  			"bytes25",
   299  			nil,
   300  			[25]byte{1},
   301  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   302  		},
   303  		{
   304  			"bytes26",
   305  			nil,
   306  			[26]byte{1},
   307  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   308  		},
   309  		{
   310  			"bytes27",
   311  			nil,
   312  			[27]byte{1},
   313  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   314  		},
   315  		{
   316  			"bytes28",
   317  			nil,
   318  			[28]byte{1},
   319  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   320  		},
   321  		{
   322  			"bytes29",
   323  			nil,
   324  			[29]byte{1},
   325  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   326  		},
   327  		{
   328  			"bytes30",
   329  			nil,
   330  			[30]byte{1},
   331  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   332  		},
   333  		{
   334  			"bytes31",
   335  			nil,
   336  			[31]byte{1},
   337  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   338  		},
   339  		{
   340  			"bytes32",
   341  			nil,
   342  			[32]byte{1},
   343  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   344  		},
   345  		{
   346  			"uint32[2][3][4]",
   347  			nil,
   348  			[4][3][2]uint32{{{1, 2}, {3, 4}, {5, 6}}, {{7, 8}, {9, 10}, {11, 12}}, {{13, 14}, {15, 16}, {17, 18}}, {{19, 20}, {21, 22}, {23, 24}}},
   349  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000018"),
   350  		},
   351  		{
   352  			"address[]",
   353  			nil,
   354  			[]common.Address{{1}, {2}},
   355  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000"),
   356  		},
   357  		{
   358  			"bytes32[]",
   359  			nil,
   360  			[]common.Hash{{1}, {2}},
   361  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000201000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000"),
   362  		},
   363  		{
   364  			"function",
   365  			nil,
   366  			[24]byte{1},
   367  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   368  		},
   369  		{
   370  			"string",
   371  			nil,
   372  			"foobar",
   373  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000006666f6f6261720000000000000000000000000000000000000000000000000000"),
   374  		},
   375  		{
   376  			"string[]",
   377  			nil,
   378  			[]string{"hello", "foobar"},
   379  common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002" + //LeN(数组)=2
   380  "0000000000000000000000000000000000000000000000000000000000000040" + //偏移64到i=0
   381  "0000000000000000000000000000000000000000000000000000000000000080" + //偏移128至i=1
   382  "0000000000000000000000000000000000000000000000000000000000000005" + //LeN(STR〔0〕)=5
   383  "68656c6c6f000000000000000000000000000000000000000000000000000000" + //STR〔0〕
   384  "0000000000000000000000000000000000000000000000000000000000000006" + //LeN(STR〔1〕)=6
   385  "666f6f6261720000000000000000000000000000000000000000000000000000"), //STR〔1〕
   386  		},
   387  		{
   388  			"string[2]",
   389  			nil,
   390  			[]string{"hello", "foobar"},
   391  common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + //偏移到i=0
   392  "0000000000000000000000000000000000000000000000000000000000000080" + //偏移到i=1
   393  "0000000000000000000000000000000000000000000000000000000000000005" + //LeN(STR〔0〕)=5
   394  "68656c6c6f000000000000000000000000000000000000000000000000000000" + //STR〔0〕
   395  "0000000000000000000000000000000000000000000000000000000000000006" + //LeN(STR〔1〕)=6
   396  "666f6f6261720000000000000000000000000000000000000000000000000000"), //STR〔1〕
   397  		},
   398  		{
   399  			"bytes32[][]",
   400  			nil,
   401  			[][]common.Hash{{{1}, {2}}, {{3}, {4}, {5}}},
   402  common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002" + //LeN(数组)=2
   403  "0000000000000000000000000000000000000000000000000000000000000040" + //偏移64到i=0
   404  "00000000000000000000000000000000000000000000000000000000000000a0" + //偏移160至i=1
   405  "0000000000000000000000000000000000000000000000000000000000000002" + //len(数组[0])=2
   406  "0100000000000000000000000000000000000000000000000000000000000000" + //数组〔0〕〔0〕
   407  "0200000000000000000000000000000000000000000000000000000000000000" + //数组〔0〕〔1〕
   408  "0000000000000000000000000000000000000000000000000000000000000003" + //len(数组[1])=3
   409  "0300000000000000000000000000000000000000000000000000000000000000" + //数组〔1〕〔0〕
   410  "0400000000000000000000000000000000000000000000000000000000000000" + //
   411  "0500000000000000000000000000000000000000000000000000000000000000"), //
   412  		},
   413  
   414  		{
   415  			"bytes32[][2]",
   416  			nil,
   417  			[][]common.Hash{{{1}, {2}}, {{3}, {4}, {5}}},
   418  common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + //偏移64到i=0
   419  "00000000000000000000000000000000000000000000000000000000000000a0" + //偏移160至i=1
   420  "0000000000000000000000000000000000000000000000000000000000000002" + //len(数组[0])=2
   421  "0100000000000000000000000000000000000000000000000000000000000000" + //数组〔0〕〔0〕
   422  "0200000000000000000000000000000000000000000000000000000000000000" + //数组〔0〕〔1〕
   423  "0000000000000000000000000000000000000000000000000000000000000003" + //len(数组[1])=3
   424  "0300000000000000000000000000000000000000000000000000000000000000" + //数组〔1〕〔0〕
   425  "0400000000000000000000000000000000000000000000000000000000000000" + //数组〔1〕〔1〕
   426  "0500000000000000000000000000000000000000000000000000000000000000"), //数组〔1〕〔2〕
   427  		},
   428  
   429  		{
   430  			"bytes32[3][2]",
   431  			nil,
   432  			[][]common.Hash{{{1}, {2}, {3}}, {{3}, {4}, {5}}},
   433  common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000" + //数组〔0〕〔0〕
   434  "0200000000000000000000000000000000000000000000000000000000000000" + //数组〔0〕〔1〕
   435  "0300000000000000000000000000000000000000000000000000000000000000" + //数组〔0〕〔2〕
   436  "0300000000000000000000000000000000000000000000000000000000000000" + //数组〔1〕〔0〕
   437  "0400000000000000000000000000000000000000000000000000000000000000" + //数组〔1〕〔1〕
   438  "0500000000000000000000000000000000000000000000000000000000000000"), //数组〔1〕〔2〕
   439  		},
   440  		{
   441  //静态元组
   442  			"tuple",
   443  			[]ArgumentMarshaling{
   444  				{Name: "a", Type: "int64"},
   445  				{Name: "b", Type: "int256"},
   446  				{Name: "c", Type: "int256"},
   447  				{Name: "d", Type: "bool"},
   448  				{Name: "e", Type: "bytes32[3][2]"},
   449  			},
   450  			struct {
   451  				A int64
   452  				B *big.Int
   453  				C *big.Int
   454  				D bool
   455  				E [][]common.Hash
   456  			}{1, big.NewInt(1), big.NewInt(-1), true, [][]common.Hash{{{1}, {2}, {3}}, {{3}, {4}, {5}}}},
   457  common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001" + //结构[ a]
   458  "0000000000000000000000000000000000000000000000000000000000000001" + //结构[B]
   459  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + //结构[C]
   460  "0000000000000000000000000000000000000000000000000000000000000001" + //结构[ D ]
   461  "0100000000000000000000000000000000000000000000000000000000000000" + //结构[E]数组[0][0]
   462  "0200000000000000000000000000000000000000000000000000000000000000" + //结构[E]数组[0][1]
   463  "0300000000000000000000000000000000000000000000000000000000000000" + //结构[E]数组[0][2]
   464  "0300000000000000000000000000000000000000000000000000000000000000" + //结构[E]数组[1][0]
   465  "0400000000000000000000000000000000000000000000000000000000000000" + //结构[E]数组[1][1]
   466  "0500000000000000000000000000000000000000000000000000000000000000"), //结构[E]数组[1][2]
   467  		},
   468  		{
   469  //动态元组
   470  			"tuple",
   471  			[]ArgumentMarshaling{
   472  				{Name: "a", Type: "string"},
   473  				{Name: "b", Type: "int64"},
   474  				{Name: "c", Type: "bytes"},
   475  				{Name: "d", Type: "string[]"},
   476  				{Name: "e", Type: "int256[]"},
   477  				{Name: "f", Type: "address[]"},
   478  			},
   479  			struct {
   480  FieldA string `abi:"a"` //测试ABI标签是否有效
   481  				FieldB int64  `abi:"b"`
   482  				C      []byte
   483  				D      []string
   484  				E      []*big.Int
   485  				F      []common.Address
   486  			}{"foobar", 1, []byte{1}, []string{"foo", "bar"}, []*big.Int{big.NewInt(1), big.NewInt(-1)}, []common.Address{{1}, {2}}},
   487  common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000000000c0" + //结构[A]偏移
   488  "0000000000000000000000000000000000000000000000000000000000000001" + //结构[B]
   489  "0000000000000000000000000000000000000000000000000000000000000100" + //结构[C]偏移量
   490  "0000000000000000000000000000000000000000000000000000000000000140" + //结构[d]偏移量
   491  "0000000000000000000000000000000000000000000000000000000000000220" + //结构[e]偏移量
   492  "0000000000000000000000000000000000000000000000000000000000000280" + //结构[F]偏移量
   493  "0000000000000000000000000000000000000000000000000000000000000006" + //结构长度
   494  "666f6f6261720000000000000000000000000000000000000000000000000000" + //结构[A]“foobar”
   495  "0000000000000000000000000000000000000000000000000000000000000001" + //结构长度
   496  "0100000000000000000000000000000000000000000000000000000000000000" + //[]字节{ 1 }
   497  "0000000000000000000000000000000000000000000000000000000000000002" + //结构[d]长度
   498  "0000000000000000000000000000000000000000000000000000000000000040" + //浮点偏移
   499  "0000000000000000000000000000000000000000000000000000000000000080" + //杆偏置
   500  "0000000000000000000000000000000000000000000000000000000000000003" + //英尺长度
   501  "666f6f0000000000000000000000000000000000000000000000000000000000" + //福
   502  "0000000000000000000000000000000000000000000000000000000000000003" + //杆偏置
   503  "6261720000000000000000000000000000000000000000000000000000000000" + //酒吧
   504  "0000000000000000000000000000000000000000000000000000000000000002" + //结构长度
   505  "0000000000000000000000000000000000000000000000000000000000000001" + //一
   506  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + //- 1
   507  "0000000000000000000000000000000000000000000000000000000000000002" + //结构长度
   508  "0000000000000000000000000100000000000000000000000000000000000000" + //普通地址1
   509  "0000000000000000000000000200000000000000000000000000000000000000"), //普通地址2
   510  		},
   511  		{
   512  //嵌套元组
   513  			"tuple",
   514  			[]ArgumentMarshaling{
   515  				{Name: "a", Type: "tuple", Components: []ArgumentMarshaling{{Name: "a", Type: "uint256"}, {Name: "b", Type: "uint256[]"}}},
   516  				{Name: "b", Type: "int256[]"},
   517  			},
   518  			struct {
   519  				A struct {
   520  					FieldA *big.Int `abi:"a"`
   521  					B      []*big.Int
   522  				}
   523  				B []*big.Int
   524  			}{
   525  				A: struct {
   526  FieldA *big.Int `abi:"a"` //测试ABI标记是否适用于嵌套元组
   527  					B      []*big.Int
   528  				}{big.NewInt(1), []*big.Int{big.NewInt(1), big.NewInt(0)}},
   529  				B: []*big.Int{big.NewInt(1), big.NewInt(0)}},
   530  common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + //偏移量
   531  "00000000000000000000000000000000000000000000000000000000000000e0" + //B偏移量
   532  "0000000000000000000000000000000000000000000000000000000000000001" + //A.值
   533  "0000000000000000000000000000000000000000000000000000000000000040" + //A.B偏移量
   534  "0000000000000000000000000000000000000000000000000000000000000002" + //A.B长度
   535  "0000000000000000000000000000000000000000000000000000000000000001" + //A.B.〔0〕值
   536  "0000000000000000000000000000000000000000000000000000000000000000" + //A.B.〔1〕值
   537  "0000000000000000000000000000000000000000000000000000000000000002" + //B长
   538  "0000000000000000000000000000000000000000000000000000000000000001" + //B〔0〕值
   539  "0000000000000000000000000000000000000000000000000000000000000000"), //B〔1〕值
   540  		},
   541  		{
   542  //元组切片
   543  			"tuple[]",
   544  			[]ArgumentMarshaling{
   545  				{Name: "a", Type: "int256"},
   546  				{Name: "b", Type: "int256[]"},
   547  			},
   548  			[]struct {
   549  				A *big.Int
   550  				B []*big.Int
   551  			}{
   552  				{big.NewInt(-1), []*big.Int{big.NewInt(1), big.NewInt(0)}},
   553  				{big.NewInt(1), []*big.Int{big.NewInt(2), big.NewInt(-1)}},
   554  			},
   555  common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002" + //元组长度
   556  "0000000000000000000000000000000000000000000000000000000000000040" + //元组〔0〕偏移
   557  "00000000000000000000000000000000000000000000000000000000000000e0" + //元组〔1〕偏移
   558  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + //元组〔0〕
   559  "0000000000000000000000000000000000000000000000000000000000000040" + //元组[0].b偏移量
   560  "0000000000000000000000000000000000000000000000000000000000000002" + //元组[0].b长度
   561  "0000000000000000000000000000000000000000000000000000000000000001" + //元组[0].b[0]值
   562  "0000000000000000000000000000000000000000000000000000000000000000" + //元组[0].b[1]值
   563  "0000000000000000000000000000000000000000000000000000000000000001" + //元组〔1〕
   564  "0000000000000000000000000000000000000000000000000000000000000040" + //元组[1].b偏移量
   565  "0000000000000000000000000000000000000000000000000000000000000002" + //元组[1].b长度
   566  "0000000000000000000000000000000000000000000000000000000000000002" + //元组[1].b[0]值
   567  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), //元组[1].b[1]值
   568  		},
   569  		{
   570  //静态元组数组
   571  			"tuple[2]",
   572  			[]ArgumentMarshaling{
   573  				{Name: "a", Type: "int256"},
   574  				{Name: "b", Type: "int256"},
   575  			},
   576  			[2]struct {
   577  				A *big.Int
   578  				B *big.Int
   579  			}{
   580  				{big.NewInt(-1), big.NewInt(1)},
   581  				{big.NewInt(1), big.NewInt(-1)},
   582  			},
   583  common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + //元组〔0〕
   584  "0000000000000000000000000000000000000000000000000000000000000001" + //元组〔0〕
   585  "0000000000000000000000000000000000000000000000000000000000000001" + //元组〔1〕
   586  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), //元组〔1〕
   587  		},
   588  		{
   589  //动态元组数组
   590  			"tuple[2]",
   591  			[]ArgumentMarshaling{
   592  				{Name: "a", Type: "int256[]"},
   593  			},
   594  			[2]struct {
   595  				A []*big.Int
   596  			}{
   597  				{[]*big.Int{big.NewInt(-1), big.NewInt(1)}},
   598  				{[]*big.Int{big.NewInt(1), big.NewInt(-1)}},
   599  			},
   600  common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000040" + //元组〔0〕偏移
   601  "00000000000000000000000000000000000000000000000000000000000000c0" + //元组〔1〕偏移
   602  "0000000000000000000000000000000000000000000000000000000000000020" + //元组[0]。偏移量
   603  "0000000000000000000000000000000000000000000000000000000000000002" + //元组[0]。长度
   604  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + //元组〔0〕A〔0〕
   605  "0000000000000000000000000000000000000000000000000000000000000001" + //元组〔0〕A〔1〕
   606  "0000000000000000000000000000000000000000000000000000000000000020" + //元组[1]。偏移量
   607  "0000000000000000000000000000000000000000000000000000000000000002" + //元组[1]。长度
   608  "0000000000000000000000000000000000000000000000000000000000000001" + //元组〔1〕A〔0〕
   609  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), //元组〔1〕A〔1〕
   610  		},
   611  	} {
   612  		typ, err := NewType(test.typ, test.components)
   613  		if err != nil {
   614  			t.Fatalf("%v failed. Unexpected parse error: %v", i, err)
   615  		}
   616  		output, err := typ.pack(reflect.ValueOf(test.input))
   617  		if err != nil {
   618  			t.Fatalf("%v failed. Unexpected pack error: %v", i, err)
   619  		}
   620  
   621  		if !bytes.Equal(output, test.output) {
   622  			t.Errorf("input %d for typ: %v failed. Expected bytes: '%x' Got: '%x'", i, typ.String(), test.output, output)
   623  		}
   624  	}
   625  }
   626  
   627  func TestMethodPack(t *testing.T) {
   628  	abi, err := JSON(strings.NewReader(jsondata2))
   629  	if err != nil {
   630  		t.Fatal(err)
   631  	}
   632  
   633  	sig := abi.Methods["slice"].Id()
   634  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   635  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   636  
   637  	packed, err := abi.Pack("slice", []uint32{1, 2})
   638  	if err != nil {
   639  		t.Error(err)
   640  	}
   641  
   642  	if !bytes.Equal(packed, sig) {
   643  		t.Errorf("expected %x got %x", sig, packed)
   644  	}
   645  
   646  	var addrA, addrB = common.Address{1}, common.Address{2}
   647  	sig = abi.Methods["sliceAddress"].Id()
   648  	sig = append(sig, common.LeftPadBytes([]byte{32}, 32)...)
   649  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   650  	sig = append(sig, common.LeftPadBytes(addrA[:], 32)...)
   651  	sig = append(sig, common.LeftPadBytes(addrB[:], 32)...)
   652  
   653  	packed, err = abi.Pack("sliceAddress", []common.Address{addrA, addrB})
   654  	if err != nil {
   655  		t.Fatal(err)
   656  	}
   657  	if !bytes.Equal(packed, sig) {
   658  		t.Errorf("expected %x got %x", sig, packed)
   659  	}
   660  
   661  	var addrC, addrD = common.Address{3}, common.Address{4}
   662  	sig = abi.Methods["sliceMultiAddress"].Id()
   663  	sig = append(sig, common.LeftPadBytes([]byte{64}, 32)...)
   664  	sig = append(sig, common.LeftPadBytes([]byte{160}, 32)...)
   665  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   666  	sig = append(sig, common.LeftPadBytes(addrA[:], 32)...)
   667  	sig = append(sig, common.LeftPadBytes(addrB[:], 32)...)
   668  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   669  	sig = append(sig, common.LeftPadBytes(addrC[:], 32)...)
   670  	sig = append(sig, common.LeftPadBytes(addrD[:], 32)...)
   671  
   672  	packed, err = abi.Pack("sliceMultiAddress", []common.Address{addrA, addrB}, []common.Address{addrC, addrD})
   673  	if err != nil {
   674  		t.Fatal(err)
   675  	}
   676  	if !bytes.Equal(packed, sig) {
   677  		t.Errorf("expected %x got %x", sig, packed)
   678  	}
   679  
   680  	sig = abi.Methods["slice256"].Id()
   681  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   682  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   683  
   684  	packed, err = abi.Pack("slice256", []*big.Int{big.NewInt(1), big.NewInt(2)})
   685  	if err != nil {
   686  		t.Error(err)
   687  	}
   688  
   689  	if !bytes.Equal(packed, sig) {
   690  		t.Errorf("expected %x got %x", sig, packed)
   691  	}
   692  
   693  	a := [2][2]*big.Int{{big.NewInt(1), big.NewInt(1)}, {big.NewInt(2), big.NewInt(0)}}
   694  	sig = abi.Methods["nestedArray"].Id()
   695  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   696  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   697  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   698  	sig = append(sig, common.LeftPadBytes([]byte{0}, 32)...)
   699  	sig = append(sig, common.LeftPadBytes([]byte{0xa0}, 32)...)
   700  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   701  	sig = append(sig, common.LeftPadBytes(addrC[:], 32)...)
   702  	sig = append(sig, common.LeftPadBytes(addrD[:], 32)...)
   703  	packed, err = abi.Pack("nestedArray", a, []common.Address{addrC, addrD})
   704  	if err != nil {
   705  		t.Fatal(err)
   706  	}
   707  	if !bytes.Equal(packed, sig) {
   708  		t.Errorf("expected %x got %x", sig, packed)
   709  	}
   710  
   711  	sig = abi.Methods["nestedArray2"].Id()
   712  	sig = append(sig, common.LeftPadBytes([]byte{0x20}, 32)...)
   713  	sig = append(sig, common.LeftPadBytes([]byte{0x40}, 32)...)
   714  	sig = append(sig, common.LeftPadBytes([]byte{0x80}, 32)...)
   715  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   716  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   717  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   718  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   719  	packed, err = abi.Pack("nestedArray2", [2][]uint8{{1}, {1}})
   720  	if err != nil {
   721  		t.Fatal(err)
   722  	}
   723  	if !bytes.Equal(packed, sig) {
   724  		t.Errorf("expected %x got %x", sig, packed)
   725  	}
   726  
   727  	sig = abi.Methods["nestedSlice"].Id()
   728  	sig = append(sig, common.LeftPadBytes([]byte{0x20}, 32)...)
   729  	sig = append(sig, common.LeftPadBytes([]byte{0x02}, 32)...)
   730  	sig = append(sig, common.LeftPadBytes([]byte{0x40}, 32)...)
   731  	sig = append(sig, common.LeftPadBytes([]byte{0xa0}, 32)...)
   732  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   733  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   734  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   735  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   736  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   737  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   738  	packed, err = abi.Pack("nestedSlice", [][]uint8{{1, 2}, {1, 2}})
   739  	if err != nil {
   740  		t.Fatal(err)
   741  	}
   742  	if !bytes.Equal(packed, sig) {
   743  		t.Errorf("expected %x got %x", sig, packed)
   744  	}
   745  }
   746  
   747  func TestPackNumber(t *testing.T) {
   748  	tests := []struct {
   749  		value  reflect.Value
   750  		packed []byte
   751  	}{
   752  //协议限制
   753  		{reflect.ValueOf(0), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000")},
   754  		{reflect.ValueOf(1), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")},
   755  		{reflect.ValueOf(-1), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")},
   756  
   757  //键入角大小写
   758  		{reflect.ValueOf(uint8(math.MaxUint8)), common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000000000ff")},
   759  		{reflect.ValueOf(uint16(math.MaxUint16)), common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000ffff")},
   760  		{reflect.ValueOf(uint32(math.MaxUint32)), common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000ffffffff")},
   761  		{reflect.ValueOf(uint64(math.MaxUint64)), common.Hex2Bytes("000000000000000000000000000000000000000000000000ffffffffffffffff")},
   762  
   763  		{reflect.ValueOf(int8(math.MaxInt8)), common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000007f")},
   764  		{reflect.ValueOf(int16(math.MaxInt16)), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000007fff")},
   765  		{reflect.ValueOf(int32(math.MaxInt32)), common.Hex2Bytes("000000000000000000000000000000000000000000000000000000007fffffff")},
   766  		{reflect.ValueOf(int64(math.MaxInt64)), common.Hex2Bytes("0000000000000000000000000000000000000000000000007fffffffffffffff")},
   767  
   768  		{reflect.ValueOf(int8(math.MinInt8)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80")},
   769  		{reflect.ValueOf(int16(math.MinInt16)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000")},
   770  		{reflect.ValueOf(int32(math.MinInt32)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000")},
   771  		{reflect.ValueOf(int64(math.MinInt64)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000")},
   772  	}
   773  	for i, tt := range tests {
   774  		packed := packNum(tt.value)
   775  		if !bytes.Equal(packed, tt.packed) {
   776  			t.Errorf("test %d: pack mismatch: have %x, want %x", i, packed, tt.packed)
   777  		}
   778  	}
   779  }
   780