github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/accounts/abi/pack_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //版权所有2017 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package abi
    26  
    27  import (
    28  	"bytes"
    29  	"math"
    30  	"math/big"
    31  	"reflect"
    32  	"strings"
    33  	"testing"
    34  
    35  	"github.com/ethereum/go-ethereum/common"
    36  )
    37  
    38  func TestPack(t *testing.T) {
    39  	for i, test := range []struct {
    40  		typ string
    41  
    42  		input  interface{}
    43  		output []byte
    44  	}{
    45  		{
    46  			"uint8",
    47  			uint8(2),
    48  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    49  		},
    50  		{
    51  			"uint8[]",
    52  			[]uint8{1, 2},
    53  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    54  		},
    55  		{
    56  			"uint16",
    57  			uint16(2),
    58  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    59  		},
    60  		{
    61  			"uint16[]",
    62  			[]uint16{1, 2},
    63  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    64  		},
    65  		{
    66  			"uint32",
    67  			uint32(2),
    68  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    69  		},
    70  		{
    71  			"uint32[]",
    72  			[]uint32{1, 2},
    73  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    74  		},
    75  		{
    76  			"uint64",
    77  			uint64(2),
    78  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    79  		},
    80  		{
    81  			"uint64[]",
    82  			[]uint64{1, 2},
    83  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    84  		},
    85  		{
    86  			"uint256",
    87  			big.NewInt(2),
    88  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    89  		},
    90  		{
    91  			"uint256[]",
    92  			[]*big.Int{big.NewInt(1), big.NewInt(2)},
    93  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
    94  		},
    95  		{
    96  			"int8",
    97  			int8(2),
    98  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
    99  		},
   100  		{
   101  			"int8[]",
   102  			[]int8{1, 2},
   103  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   104  		},
   105  		{
   106  			"int16",
   107  			int16(2),
   108  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
   109  		},
   110  		{
   111  			"int16[]",
   112  			[]int16{1, 2},
   113  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   114  		},
   115  		{
   116  			"int32",
   117  			int32(2),
   118  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
   119  		},
   120  		{
   121  			"int32[]",
   122  			[]int32{1, 2},
   123  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   124  		},
   125  		{
   126  			"int64",
   127  			int64(2),
   128  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
   129  		},
   130  		{
   131  			"int64[]",
   132  			[]int64{1, 2},
   133  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   134  		},
   135  		{
   136  			"int256",
   137  			big.NewInt(2),
   138  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000002"),
   139  		},
   140  		{
   141  			"int256[]",
   142  			[]*big.Int{big.NewInt(1), big.NewInt(2)},
   143  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002"),
   144  		},
   145  		{
   146  			"bytes1",
   147  			[1]byte{1},
   148  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   149  		},
   150  		{
   151  			"bytes2",
   152  			[2]byte{1},
   153  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   154  		},
   155  		{
   156  			"bytes3",
   157  			[3]byte{1},
   158  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   159  		},
   160  		{
   161  			"bytes4",
   162  			[4]byte{1},
   163  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   164  		},
   165  		{
   166  			"bytes5",
   167  			[5]byte{1},
   168  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   169  		},
   170  		{
   171  			"bytes6",
   172  			[6]byte{1},
   173  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   174  		},
   175  		{
   176  			"bytes7",
   177  			[7]byte{1},
   178  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   179  		},
   180  		{
   181  			"bytes8",
   182  			[8]byte{1},
   183  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   184  		},
   185  		{
   186  			"bytes9",
   187  			[9]byte{1},
   188  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   189  		},
   190  		{
   191  			"bytes10",
   192  			[10]byte{1},
   193  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   194  		},
   195  		{
   196  			"bytes11",
   197  			[11]byte{1},
   198  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   199  		},
   200  		{
   201  			"bytes12",
   202  			[12]byte{1},
   203  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   204  		},
   205  		{
   206  			"bytes13",
   207  			[13]byte{1},
   208  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   209  		},
   210  		{
   211  			"bytes14",
   212  			[14]byte{1},
   213  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   214  		},
   215  		{
   216  			"bytes15",
   217  			[15]byte{1},
   218  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   219  		},
   220  		{
   221  			"bytes16",
   222  			[16]byte{1},
   223  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   224  		},
   225  		{
   226  			"bytes17",
   227  			[17]byte{1},
   228  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   229  		},
   230  		{
   231  			"bytes18",
   232  			[18]byte{1},
   233  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   234  		},
   235  		{
   236  			"bytes19",
   237  			[19]byte{1},
   238  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   239  		},
   240  		{
   241  			"bytes20",
   242  			[20]byte{1},
   243  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   244  		},
   245  		{
   246  			"bytes21",
   247  			[21]byte{1},
   248  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   249  		},
   250  		{
   251  			"bytes22",
   252  			[22]byte{1},
   253  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   254  		},
   255  		{
   256  			"bytes23",
   257  			[23]byte{1},
   258  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   259  		},
   260  		{
   261  			"bytes24",
   262  			[24]byte{1},
   263  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   264  		},
   265  		{
   266  			"bytes24",
   267  			[24]byte{1},
   268  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   269  		},
   270  		{
   271  			"bytes25",
   272  			[25]byte{1},
   273  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   274  		},
   275  		{
   276  			"bytes26",
   277  			[26]byte{1},
   278  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   279  		},
   280  		{
   281  			"bytes27",
   282  			[27]byte{1},
   283  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   284  		},
   285  		{
   286  			"bytes28",
   287  			[28]byte{1},
   288  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   289  		},
   290  		{
   291  			"bytes29",
   292  			[29]byte{1},
   293  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   294  		},
   295  		{
   296  			"bytes30",
   297  			[30]byte{1},
   298  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   299  		},
   300  		{
   301  			"bytes31",
   302  			[31]byte{1},
   303  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   304  		},
   305  		{
   306  			"bytes32",
   307  			[32]byte{1},
   308  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   309  		},
   310  		{
   311  			"uint32[2][3][4]",
   312  			[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}}},
   313  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000110000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001300000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000015000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000170000000000000000000000000000000000000000000000000000000000000018"),
   314  		},
   315  		{
   316  			"address[]",
   317  			[]common.Address{{1}, {2}},
   318  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000"),
   319  		},
   320  		{
   321  			"bytes32[]",
   322  			[]common.Hash{{1}, {2}},
   323  			common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000000201000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000"),
   324  		},
   325  		{
   326  			"function",
   327  			[24]byte{1},
   328  			common.Hex2Bytes("0100000000000000000000000000000000000000000000000000000000000000"),
   329  		},
   330  		{
   331  			"string",
   332  			"foobar",
   333  			common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000006666f6f6261720000000000000000000000000000000000000000000000000000"),
   334  		},
   335  	} {
   336  		typ, err := NewType(test.typ)
   337  		if err != nil {
   338  			t.Fatalf("%v failed. Unexpected parse error: %v", i, err)
   339  		}
   340  
   341  		output, err := typ.pack(reflect.ValueOf(test.input))
   342  		if err != nil {
   343  			t.Fatalf("%v failed. Unexpected pack error: %v", i, err)
   344  		}
   345  
   346  		if !bytes.Equal(output, test.output) {
   347  			t.Errorf("%d failed. Expected bytes: '%x' Got: '%x'", i, test.output, output)
   348  		}
   349  	}
   350  }
   351  
   352  func TestMethodPack(t *testing.T) {
   353  	abi, err := JSON(strings.NewReader(jsondata2))
   354  	if err != nil {
   355  		t.Fatal(err)
   356  	}
   357  
   358  	sig := abi.Methods["slice"].Id()
   359  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   360  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   361  
   362  	packed, err := abi.Pack("slice", []uint32{1, 2})
   363  	if err != nil {
   364  		t.Error(err)
   365  	}
   366  
   367  	if !bytes.Equal(packed, sig) {
   368  		t.Errorf("expected %x got %x", sig, packed)
   369  	}
   370  
   371  	var addrA, addrB = common.Address{1}, common.Address{2}
   372  	sig = abi.Methods["sliceAddress"].Id()
   373  	sig = append(sig, common.LeftPadBytes([]byte{32}, 32)...)
   374  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   375  	sig = append(sig, common.LeftPadBytes(addrA[:], 32)...)
   376  	sig = append(sig, common.LeftPadBytes(addrB[:], 32)...)
   377  
   378  	packed, err = abi.Pack("sliceAddress", []common.Address{addrA, addrB})
   379  	if err != nil {
   380  		t.Fatal(err)
   381  	}
   382  	if !bytes.Equal(packed, sig) {
   383  		t.Errorf("expected %x got %x", sig, packed)
   384  	}
   385  
   386  	var addrC, addrD = common.Address{3}, common.Address{4}
   387  	sig = abi.Methods["sliceMultiAddress"].Id()
   388  	sig = append(sig, common.LeftPadBytes([]byte{64}, 32)...)
   389  	sig = append(sig, common.LeftPadBytes([]byte{160}, 32)...)
   390  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   391  	sig = append(sig, common.LeftPadBytes(addrA[:], 32)...)
   392  	sig = append(sig, common.LeftPadBytes(addrB[:], 32)...)
   393  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   394  	sig = append(sig, common.LeftPadBytes(addrC[:], 32)...)
   395  	sig = append(sig, common.LeftPadBytes(addrD[:], 32)...)
   396  
   397  	packed, err = abi.Pack("sliceMultiAddress", []common.Address{addrA, addrB}, []common.Address{addrC, addrD})
   398  	if err != nil {
   399  		t.Fatal(err)
   400  	}
   401  	if !bytes.Equal(packed, sig) {
   402  		t.Errorf("expected %x got %x", sig, packed)
   403  	}
   404  
   405  	sig = abi.Methods["slice256"].Id()
   406  	sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...)
   407  	sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...)
   408  
   409  	packed, err = abi.Pack("slice256", []*big.Int{big.NewInt(1), big.NewInt(2)})
   410  	if err != nil {
   411  		t.Error(err)
   412  	}
   413  
   414  	if !bytes.Equal(packed, sig) {
   415  		t.Errorf("expected %x got %x", sig, packed)
   416  	}
   417  }
   418  
   419  func TestPackNumber(t *testing.T) {
   420  	tests := []struct {
   421  		value  reflect.Value
   422  		packed []byte
   423  	}{
   424  //协议限制
   425  		{reflect.ValueOf(0), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000000")},
   426  		{reflect.ValueOf(1), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")},
   427  		{reflect.ValueOf(-1), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")},
   428  
   429  //键入角大小写
   430  		{reflect.ValueOf(uint8(math.MaxUint8)), common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000000000ff")},
   431  		{reflect.ValueOf(uint16(math.MaxUint16)), common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000ffff")},
   432  		{reflect.ValueOf(uint32(math.MaxUint32)), common.Hex2Bytes("00000000000000000000000000000000000000000000000000000000ffffffff")},
   433  		{reflect.ValueOf(uint64(math.MaxUint64)), common.Hex2Bytes("000000000000000000000000000000000000000000000000ffffffffffffffff")},
   434  
   435  		{reflect.ValueOf(int8(math.MaxInt8)), common.Hex2Bytes("000000000000000000000000000000000000000000000000000000000000007f")},
   436  		{reflect.ValueOf(int16(math.MaxInt16)), common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000007fff")},
   437  		{reflect.ValueOf(int32(math.MaxInt32)), common.Hex2Bytes("000000000000000000000000000000000000000000000000000000007fffffff")},
   438  		{reflect.ValueOf(int64(math.MaxInt64)), common.Hex2Bytes("0000000000000000000000000000000000000000000000007fffffffffffffff")},
   439  
   440  		{reflect.ValueOf(int8(math.MinInt8)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80")},
   441  		{reflect.ValueOf(int16(math.MinInt16)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000")},
   442  		{reflect.ValueOf(int32(math.MinInt32)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000")},
   443  		{reflect.ValueOf(int64(math.MinInt64)), common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000")},
   444  	}
   445  	for i, tt := range tests {
   446  		packed := packNum(tt.value)
   447  		if !bytes.Equal(packed, tt.packed) {
   448  			t.Errorf("test %d: pack mismatch: have %x, want %x", i, packed, tt.packed)
   449  		}
   450  	}
   451  }