@@ -27,6 +27,7 @@ import (
2727 "testing"
2828
2929 "github.com/ethereum/go-ethereum/common/math"
30+ "github.com/holiman/uint256"
3031)
3132
3233type testEncoder struct {
@@ -147,6 +148,30 @@ var encTests = []encTest{
147148 {val : big .NewInt (- 1 ), error : "rlp: cannot encode negative big.Int" },
148149 {val : * big .NewInt (- 1 ), error : "rlp: cannot encode negative big.Int" },
149150
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+
150175 // byte arrays
151176 {val : [0 ]byte {}, output : "80" },
152177 {val : [1 ]byte {0 }, output : "00" },
@@ -256,6 +281,12 @@ var encTests = []encTest{
256281 output : "F90200CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376CF84617364668471776572847A786376" ,
257282 },
258283
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+
259290 // RawValue
260291 {val : RawValue (unhex ("01" )), output : "01" },
261292 {val : RawValue (unhex ("82FFFF" )), output : "82FFFF" },
@@ -301,6 +332,7 @@ var encTests = []encTest{
301332 {val : (* []byte )(nil ), output : "80" },
302333 {val : (* [10 ]byte )(nil ), output : "80" },
303334 {val : (* big .Int )(nil ), output : "80" },
335+ {val : (* uint256 .Int )(nil ), output : "80" },
304336 {val : (* []string )(nil ), output : "C0" },
305337 {val : (* [10 ]string )(nil ), output : "C0" },
306338 {val : (* []interface {})(nil ), output : "C0" },
@@ -509,6 +541,23 @@ func BenchmarkEncodeBigInts(b *testing.B) {
509541 }
510542}
511543
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+
512561func BenchmarkEncodeConcurrentInterface (b * testing.B ) {
513562 type struct1 struct {
514563 A string
0 commit comments