@@ -27,6 +27,7 @@ import (
27
27
"testing"
28
28
29
29
"github.com/ethereum/go-ethereum/common/math"
30
+ "github.com/holiman/uint256"
30
31
)
31
32
32
33
type testEncoder struct {
@@ -147,6 +148,30 @@ var encTests = []encTest{
147
148
{val : big .NewInt (- 1 ), error : "rlp: cannot encode negative big.Int" },
148
149
{val : * big .NewInt (- 1 ), error : "rlp: cannot encode negative big.Int" },
149
150
151
+ // uint256
152
+ {val : uint256 .NewInt (0 ), output : "80" },
153
+ {val : uint256 .NewInt (1 ), output : "01" },
154
+ {val : uint256 .NewInt (127 ), output : "7F" },
155
+ {val : uint256 .NewInt (128 ), output : "8180" },
156
+ {val : uint256 .NewInt (256 ), output : "820100" },
157
+ {val : uint256 .NewInt (1024 ), output : "820400" },
158
+ {val : uint256 .NewInt (0xFFFFFF ), output : "83FFFFFF" },
159
+ {val : uint256 .NewInt (0xFFFFFFFF ), output : "84FFFFFFFF" },
160
+ {val : uint256 .NewInt (0xFFFFFFFFFF ), output : "85FFFFFFFFFF" },
161
+ {val : uint256 .NewInt (0xFFFFFFFFFFFF ), output : "86FFFFFFFFFFFF" },
162
+ {val : uint256 .NewInt (0xFFFFFFFFFFFFFF ), output : "87FFFFFFFFFFFFFF" },
163
+ {
164
+ val : new (uint256.Int ).SetBytes (unhex ("102030405060708090A0B0C0D0E0F2" )),
165
+ output : "8F102030405060708090A0B0C0D0E0F2" ,
166
+ },
167
+ {
168
+ val : new (uint256.Int ).SetBytes (unhex ("0100020003000400050006000700080009000A000B000C000D000E01" )),
169
+ output : "9C0100020003000400050006000700080009000A000B000C000D000E01" ,
170
+ },
171
+ // non-pointer uint256.Int
172
+ {val : * uint256 .NewInt (0 ), output : "80" },
173
+ {val : * uint256 .NewInt (0xFFFFFF ), output : "83FFFFFF" },
174
+
150
175
// byte arrays
151
176
{val : [0 ]byte {}, output : "80" },
152
177
{val : [1 ]byte {0 }, output : "00" },
@@ -256,6 +281,12 @@ var encTests = []encTest{
256
281
output : "F90200CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376" ,
257
282
},
258
283
284
+ // Non-byte arrays are encoded as lists.
285
+ // Note that it is important to test [4]uint64 specifically,
286
+ // because that's the underlying type of uint256.Int.
287
+ {val : [4 ]uint32 {1 , 2 , 3 , 4 }, output : "C401020304" },
288
+ {val : [4 ]uint64 {1 , 2 , 3 , 4 }, output : "C401020304" },
289
+
259
290
// RawValue
260
291
{val : RawValue (unhex ("01" )), output : "01" },
261
292
{val : RawValue (unhex ("82FFFF" )), output : "82FFFF" },
@@ -301,6 +332,7 @@ var encTests = []encTest{
301
332
{val : (* []byte )(nil ), output : "80" },
302
333
{val : (* [10 ]byte )(nil ), output : "80" },
303
334
{val : (* big .Int )(nil ), output : "80" },
335
+ {val : (* uint256 .Int )(nil ), output : "80" },
304
336
{val : (* []string )(nil ), output : "C0" },
305
337
{val : (* [10 ]string )(nil ), output : "C0" },
306
338
{val : (* []interface {})(nil ), output : "C0" },
@@ -509,6 +541,23 @@ func BenchmarkEncodeBigInts(b *testing.B) {
509
541
}
510
542
}
511
543
544
+ func BenchmarkEncodeU256Ints (b * testing.B ) {
545
+ ints := make ([]* uint256.Int , 200 )
546
+ for i := range ints {
547
+ ints [i ], _ = uint256 .FromBig (math .BigPow (2 , int64 (i )))
548
+ }
549
+ out := bytes .NewBuffer (make ([]byte , 0 , 4096 ))
550
+ b .ResetTimer ()
551
+ b .ReportAllocs ()
552
+
553
+ for i := 0 ; i < b .N ; i ++ {
554
+ out .Reset ()
555
+ if err := Encode (out , ints ); err != nil {
556
+ b .Fatal (err )
557
+ }
558
+ }
559
+ }
560
+
512
561
func BenchmarkEncodeConcurrentInterface (b * testing.B ) {
513
562
type struct1 struct {
514
563
A string
0 commit comments