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 }