775 lines
33 KiB
Go
775 lines
33 KiB
Go
// uint256: Fixed size 256-bit math library
|
|
// Copyright 2020 uint256 Authors
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package uint256
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"math/big"
|
|
"testing"
|
|
)
|
|
|
|
var (
|
|
_ fmt.Formatter = &Int{} // Test if Int supports Formatter interface.
|
|
)
|
|
|
|
func TestFromBig(t *testing.T) {
|
|
a := new(big.Int)
|
|
b, o := FromBig(a)
|
|
if o {
|
|
t.Fatalf("conversion overflowed! big.Int %x", a.Bytes())
|
|
}
|
|
if exp, got := a.Bytes(), b.Bytes(); !bytes.Equal(got, exp) {
|
|
t.Fatalf("got %x exp %x", got, exp)
|
|
}
|
|
|
|
a = big.NewInt(1)
|
|
b, o = FromBig(a)
|
|
if o {
|
|
t.Fatalf("conversion overflowed! big.Int %x", a.Bytes())
|
|
}
|
|
if exp, got := a.Bytes(), b.Bytes(); !bytes.Equal(got, exp) {
|
|
t.Fatalf("got %x exp %x", got, exp)
|
|
}
|
|
|
|
a = big.NewInt(0x1000000000000000)
|
|
b, o = FromBig(a)
|
|
if o {
|
|
t.Fatalf("conversion overflowed! big.Int %x", a.Bytes())
|
|
}
|
|
if exp, got := a.Bytes(), b.Bytes(); !bytes.Equal(got, exp) {
|
|
t.Fatalf("got %x exp %x", got, exp)
|
|
}
|
|
|
|
a = big.NewInt(0x1234)
|
|
b, o = FromBig(a)
|
|
if o {
|
|
t.Fatalf("conversion overflowed! big.Int %x", a.Bytes())
|
|
}
|
|
if exp, got := a.Bytes(), b.Bytes(); !bytes.Equal(got, exp) {
|
|
t.Fatalf("got %x exp %x", got, exp)
|
|
}
|
|
|
|
a = big.NewInt(1)
|
|
a.Lsh(a, 256)
|
|
|
|
b, o = FromBig(a)
|
|
if !o {
|
|
t.Fatalf("expected overflow")
|
|
}
|
|
if !b.Eq(new(Int)) {
|
|
t.Fatalf("got %x exp 0", b.Bytes())
|
|
}
|
|
|
|
a.Sub(a, big.NewInt(1))
|
|
b, o = FromBig(a)
|
|
if o {
|
|
t.Fatalf("conversion overflowed! big.Int %x", a.Bytes())
|
|
}
|
|
if exp, got := a.Bytes(), b.Bytes(); !bytes.Equal(got, exp) {
|
|
t.Fatalf("got %x exp %x", got, exp)
|
|
}
|
|
}
|
|
|
|
func TestFromBigOverflow(t *testing.T) {
|
|
_, o := FromBig(new(big.Int).SetBytes(hex2Bytes("ababee444444444444ffcc333333333333ddaa222222222222bb8811111111111199")))
|
|
if !o {
|
|
t.Errorf("expected overflow, got %v", o)
|
|
}
|
|
_, o = FromBig(new(big.Int).SetBytes(hex2Bytes("ee444444444444ffcc333333333333ddaa222222222222bb8811111111111199")))
|
|
if o {
|
|
t.Errorf("expected no overflow, got %v", o)
|
|
}
|
|
b := new(big.Int).SetBytes(hex2Bytes("ee444444444444ffcc333333333333ddaa222222222222bb8811111111111199"))
|
|
_, o = FromBig(b.Neg(b))
|
|
if o {
|
|
t.Errorf("expected no overflow, got %v", o)
|
|
}
|
|
}
|
|
|
|
func TestToBig(t *testing.T) {
|
|
|
|
if bigZero := new(Int).ToBig(); bigZero.Cmp(new(big.Int)) != 0 {
|
|
t.Errorf("expected big.Int 0, got %x", bigZero)
|
|
}
|
|
|
|
for i := uint(0); i < 256; i++ {
|
|
f := new(Int).SetUint64(1)
|
|
f.Lsh(f, i)
|
|
b := f.ToBig()
|
|
expected := big.NewInt(1)
|
|
expected.Lsh(expected, i)
|
|
if b.Cmp(expected) != 0 {
|
|
t.Fatalf("expected %x, got %x", expected, b)
|
|
}
|
|
}
|
|
}
|
|
|
|
func benchSetFromBig(bench *testing.B, b *big.Int) Int {
|
|
var f Int
|
|
for i := 0; i < bench.N; i++ {
|
|
f.SetFromBig(b)
|
|
}
|
|
return f
|
|
}
|
|
|
|
func BenchmarkSetFromBig(bench *testing.B) {
|
|
param1 := big.NewInt(0xff)
|
|
bench.Run("1word", func(bench *testing.B) { benchSetFromBig(bench, param1) })
|
|
|
|
param2 := new(big.Int).Lsh(param1, 64)
|
|
bench.Run("2words", func(bench *testing.B) { benchSetFromBig(bench, param2) })
|
|
|
|
param3 := new(big.Int).Lsh(param2, 64)
|
|
bench.Run("3words", func(bench *testing.B) { benchSetFromBig(bench, param3) })
|
|
|
|
param4 := new(big.Int).Lsh(param3, 64)
|
|
bench.Run("4words", func(bench *testing.B) { benchSetFromBig(bench, param4) })
|
|
|
|
param5 := new(big.Int).Lsh(param4, 64)
|
|
bench.Run("overflow", func(bench *testing.B) { benchSetFromBig(bench, param5) })
|
|
}
|
|
|
|
func benchToBig(bench *testing.B, f *Int) *big.Int {
|
|
var b *big.Int
|
|
for i := 0; i < bench.N; i++ {
|
|
b = f.ToBig()
|
|
}
|
|
return b
|
|
}
|
|
|
|
func BenchmarkToBig(bench *testing.B) {
|
|
param1 := new(Int).SetUint64(0xff)
|
|
bench.Run("1word", func(bench *testing.B) { benchToBig(bench, param1) })
|
|
|
|
param2 := new(Int).Lsh(param1, 64)
|
|
bench.Run("2words", func(bench *testing.B) { benchToBig(bench, param2) })
|
|
|
|
param3 := new(Int).Lsh(param2, 64)
|
|
bench.Run("3words", func(bench *testing.B) { benchToBig(bench, param3) })
|
|
|
|
param4 := new(Int).Lsh(param3, 64)
|
|
bench.Run("4words", func(bench *testing.B) { benchToBig(bench, param4) })
|
|
}
|
|
|
|
func TestFormat(t *testing.T) {
|
|
testCases := []string{
|
|
"0",
|
|
"1",
|
|
"ffeeddccbbaa99887766554433221100ffeeddccbbaa99887766554433221100",
|
|
}
|
|
|
|
for i := 0; i < len(testCases); i++ {
|
|
expected := testCases[i]
|
|
b, _ := new(big.Int).SetString(expected, 16)
|
|
f, o := FromBig(b)
|
|
if o {
|
|
t.Fatalf("too big test case %s", expected)
|
|
}
|
|
s := fmt.Sprintf("%x", f)
|
|
if s != expected {
|
|
t.Errorf("Invalid format conversion to hex: %s, expected %s", s, expected)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestSetBytes tests all setbyte-methods from 0 to overlong,
|
|
// - verifies that all non-set bits are properly cleared
|
|
// - verifies that overlong input is correctly cropped
|
|
func TestSetBytes(t *testing.T) {
|
|
for i := 0; i < 35; i++ {
|
|
buf := hex2Bytes("aaaa12131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031bbbb")
|
|
exp, _ := FromBig(new(big.Int).SetBytes(buf[0:i]))
|
|
z := new(Int).SetAllOne().SetBytes(buf[0:i])
|
|
if !z.Eq(exp) {
|
|
t.Errorf("testcase %d: exp %x, got %x", i, exp, z)
|
|
}
|
|
}
|
|
// nil check
|
|
exp, _ := FromBig(new(big.Int).SetBytes(nil))
|
|
z := new(Int).SetAllOne().SetBytes(nil)
|
|
if !z.Eq(exp) {
|
|
t.Errorf("nil-test : exp %x, got %x", exp, z)
|
|
}
|
|
}
|
|
|
|
func BenchmarkSetBytes(b *testing.B) {
|
|
|
|
val := new(Int)
|
|
bytearr := hex2Bytes("12131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031")
|
|
b.Run("generic", func(b *testing.B) {
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
val.SetBytes(bytearr[:1])
|
|
val.SetBytes(bytearr[:2])
|
|
val.SetBytes(bytearr[:3])
|
|
val.SetBytes(bytearr[:4])
|
|
val.SetBytes(bytearr[:5])
|
|
val.SetBytes(bytearr[:6])
|
|
val.SetBytes(bytearr[:7])
|
|
val.SetBytes(bytearr[:8])
|
|
val.SetBytes(bytearr[:9])
|
|
val.SetBytes(bytearr[:10])
|
|
val.SetBytes(bytearr[:11])
|
|
val.SetBytes(bytearr[:12])
|
|
val.SetBytes(bytearr[:13])
|
|
val.SetBytes(bytearr[:14])
|
|
val.SetBytes(bytearr[:15])
|
|
val.SetBytes(bytearr[:16])
|
|
val.SetBytes(bytearr[:17])
|
|
val.SetBytes(bytearr[:18])
|
|
val.SetBytes(bytearr[:19])
|
|
val.SetBytes(bytearr[:20])
|
|
val.SetBytes(bytearr[:21])
|
|
val.SetBytes(bytearr[:22])
|
|
val.SetBytes(bytearr[:23])
|
|
val.SetBytes(bytearr[:24])
|
|
val.SetBytes(bytearr[:25])
|
|
val.SetBytes(bytearr[:26])
|
|
val.SetBytes(bytearr[:27])
|
|
val.SetBytes(bytearr[:28])
|
|
val.SetBytes(bytearr[:29])
|
|
val.SetBytes(bytearr[:20])
|
|
val.SetBytes(bytearr[:31])
|
|
val.SetBytes(bytearr[:32])
|
|
}
|
|
})
|
|
b.Run("specific", func(b *testing.B) {
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
val.SetBytes1(bytearr)
|
|
val.SetBytes2(bytearr)
|
|
val.SetBytes3(bytearr)
|
|
val.SetBytes4(bytearr)
|
|
val.SetBytes5(bytearr)
|
|
val.SetBytes6(bytearr)
|
|
val.SetBytes7(bytearr)
|
|
val.SetBytes8(bytearr)
|
|
val.SetBytes9(bytearr)
|
|
val.SetBytes10(bytearr)
|
|
val.SetBytes11(bytearr)
|
|
val.SetBytes12(bytearr)
|
|
val.SetBytes13(bytearr)
|
|
val.SetBytes14(bytearr)
|
|
val.SetBytes15(bytearr)
|
|
val.SetBytes16(bytearr)
|
|
val.SetBytes17(bytearr)
|
|
val.SetBytes18(bytearr)
|
|
val.SetBytes19(bytearr)
|
|
val.SetBytes20(bytearr)
|
|
val.SetBytes21(bytearr)
|
|
val.SetBytes22(bytearr)
|
|
val.SetBytes23(bytearr)
|
|
val.SetBytes24(bytearr)
|
|
val.SetBytes25(bytearr)
|
|
val.SetBytes26(bytearr)
|
|
val.SetBytes27(bytearr)
|
|
val.SetBytes28(bytearr)
|
|
val.SetBytes29(bytearr)
|
|
val.SetBytes30(bytearr)
|
|
val.SetBytes31(bytearr)
|
|
val.SetBytes32(bytearr)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestRlpEncode(t *testing.T) {
|
|
|
|
type testcase struct {
|
|
val string
|
|
exp string
|
|
}
|
|
for i, tt := range []testcase{
|
|
{"", "80"},
|
|
{"01", "01"},
|
|
{"02", "02"},
|
|
{"04", "04"},
|
|
{"08", "08"},
|
|
{"10", "10"},
|
|
{"20", "20"},
|
|
{"40", "40"},
|
|
{"80", "8180"},
|
|
{"0100", "820100"},
|
|
{"0200", "820200"},
|
|
{"0400", "820400"},
|
|
{"0800", "820800"},
|
|
{"1000", "821000"},
|
|
{"2000", "822000"},
|
|
{"4000", "824000"},
|
|
{"8000", "828000"},
|
|
{"010000", "83010000"},
|
|
{"020000", "83020000"},
|
|
{"040000", "83040000"},
|
|
{"080000", "83080000"},
|
|
{"100000", "83100000"},
|
|
{"200000", "83200000"},
|
|
{"400000", "83400000"},
|
|
{"800000", "83800000"},
|
|
{"01000000", "8401000000"},
|
|
{"02000000", "8402000000"},
|
|
{"04000000", "8404000000"},
|
|
{"08000000", "8408000000"},
|
|
{"10000000", "8410000000"},
|
|
{"20000000", "8420000000"},
|
|
{"40000000", "8440000000"},
|
|
{"80000000", "8480000000"},
|
|
{"0100000000", "850100000000"},
|
|
{"0200000000", "850200000000"},
|
|
{"0400000000", "850400000000"},
|
|
{"0800000000", "850800000000"},
|
|
{"1000000000", "851000000000"},
|
|
{"2000000000", "852000000000"},
|
|
{"4000000000", "854000000000"},
|
|
{"8000000000", "858000000000"},
|
|
{"010000000000", "86010000000000"},
|
|
{"020000000000", "86020000000000"},
|
|
{"040000000000", "86040000000000"},
|
|
{"080000000000", "86080000000000"},
|
|
{"100000000000", "86100000000000"},
|
|
{"200000000000", "86200000000000"},
|
|
{"400000000000", "86400000000000"},
|
|
{"800000000000", "86800000000000"},
|
|
{"01000000000000", "8701000000000000"},
|
|
{"02000000000000", "8702000000000000"},
|
|
{"04000000000000", "8704000000000000"},
|
|
{"08000000000000", "8708000000000000"},
|
|
{"10000000000000", "8710000000000000"},
|
|
{"20000000000000", "8720000000000000"},
|
|
{"40000000000000", "8740000000000000"},
|
|
{"80000000000000", "8780000000000000"},
|
|
{"0100000000000000", "880100000000000000"},
|
|
{"0200000000000000", "880200000000000000"},
|
|
{"0400000000000000", "880400000000000000"},
|
|
{"0800000000000000", "880800000000000000"},
|
|
{"1000000000000000", "881000000000000000"},
|
|
{"2000000000000000", "882000000000000000"},
|
|
{"4000000000000000", "884000000000000000"},
|
|
{"8000000000000000", "888000000000000000"},
|
|
{"010000000000000000", "89010000000000000000"},
|
|
{"020000000000000000", "89020000000000000000"},
|
|
{"040000000000000000", "89040000000000000000"},
|
|
{"080000000000000000", "89080000000000000000"},
|
|
{"100000000000000000", "89100000000000000000"},
|
|
{"200000000000000000", "89200000000000000000"},
|
|
{"400000000000000000", "89400000000000000000"},
|
|
{"800000000000000000", "89800000000000000000"},
|
|
{"01000000000000000000", "8a01000000000000000000"},
|
|
{"02000000000000000000", "8a02000000000000000000"},
|
|
{"04000000000000000000", "8a04000000000000000000"},
|
|
{"08000000000000000000", "8a08000000000000000000"},
|
|
{"10000000000000000000", "8a10000000000000000000"},
|
|
{"20000000000000000000", "8a20000000000000000000"},
|
|
{"40000000000000000000", "8a40000000000000000000"},
|
|
{"80000000000000000000", "8a80000000000000000000"},
|
|
{"0100000000000000000000", "8b0100000000000000000000"},
|
|
{"0200000000000000000000", "8b0200000000000000000000"},
|
|
{"0400000000000000000000", "8b0400000000000000000000"},
|
|
{"0800000000000000000000", "8b0800000000000000000000"},
|
|
{"1000000000000000000000", "8b1000000000000000000000"},
|
|
{"2000000000000000000000", "8b2000000000000000000000"},
|
|
{"4000000000000000000000", "8b4000000000000000000000"},
|
|
{"8000000000000000000000", "8b8000000000000000000000"},
|
|
{"010000000000000000000000", "8c010000000000000000000000"},
|
|
{"020000000000000000000000", "8c020000000000000000000000"},
|
|
{"040000000000000000000000", "8c040000000000000000000000"},
|
|
{"080000000000000000000000", "8c080000000000000000000000"},
|
|
{"100000000000000000000000", "8c100000000000000000000000"},
|
|
{"200000000000000000000000", "8c200000000000000000000000"},
|
|
{"400000000000000000000000", "8c400000000000000000000000"},
|
|
{"800000000000000000000000", "8c800000000000000000000000"},
|
|
{"01000000000000000000000000", "8d01000000000000000000000000"},
|
|
{"02000000000000000000000000", "8d02000000000000000000000000"},
|
|
{"04000000000000000000000000", "8d04000000000000000000000000"},
|
|
{"08000000000000000000000000", "8d08000000000000000000000000"},
|
|
{"10000000000000000000000000", "8d10000000000000000000000000"},
|
|
{"20000000000000000000000000", "8d20000000000000000000000000"},
|
|
{"40000000000000000000000000", "8d40000000000000000000000000"},
|
|
{"80000000000000000000000000", "8d80000000000000000000000000"},
|
|
{"0100000000000000000000000000", "8e0100000000000000000000000000"},
|
|
{"0200000000000000000000000000", "8e0200000000000000000000000000"},
|
|
{"0400000000000000000000000000", "8e0400000000000000000000000000"},
|
|
{"0800000000000000000000000000", "8e0800000000000000000000000000"},
|
|
{"1000000000000000000000000000", "8e1000000000000000000000000000"},
|
|
{"2000000000000000000000000000", "8e2000000000000000000000000000"},
|
|
{"4000000000000000000000000000", "8e4000000000000000000000000000"},
|
|
{"8000000000000000000000000000", "8e8000000000000000000000000000"},
|
|
{"010000000000000000000000000000", "8f010000000000000000000000000000"},
|
|
{"020000000000000000000000000000", "8f020000000000000000000000000000"},
|
|
{"040000000000000000000000000000", "8f040000000000000000000000000000"},
|
|
{"080000000000000000000000000000", "8f080000000000000000000000000000"},
|
|
{"100000000000000000000000000000", "8f100000000000000000000000000000"},
|
|
{"200000000000000000000000000000", "8f200000000000000000000000000000"},
|
|
{"400000000000000000000000000000", "8f400000000000000000000000000000"},
|
|
{"800000000000000000000000000000", "8f800000000000000000000000000000"},
|
|
{"01000000000000000000000000000000", "9001000000000000000000000000000000"},
|
|
{"02000000000000000000000000000000", "9002000000000000000000000000000000"},
|
|
{"04000000000000000000000000000000", "9004000000000000000000000000000000"},
|
|
{"08000000000000000000000000000000", "9008000000000000000000000000000000"},
|
|
{"10000000000000000000000000000000", "9010000000000000000000000000000000"},
|
|
{"20000000000000000000000000000000", "9020000000000000000000000000000000"},
|
|
{"40000000000000000000000000000000", "9040000000000000000000000000000000"},
|
|
{"80000000000000000000000000000000", "9080000000000000000000000000000000"},
|
|
{"0100000000000000000000000000000000", "910100000000000000000000000000000000"},
|
|
{"0200000000000000000000000000000000", "910200000000000000000000000000000000"},
|
|
{"0400000000000000000000000000000000", "910400000000000000000000000000000000"},
|
|
{"0800000000000000000000000000000000", "910800000000000000000000000000000000"},
|
|
{"1000000000000000000000000000000000", "911000000000000000000000000000000000"},
|
|
{"2000000000000000000000000000000000", "912000000000000000000000000000000000"},
|
|
{"4000000000000000000000000000000000", "914000000000000000000000000000000000"},
|
|
{"8000000000000000000000000000000000", "918000000000000000000000000000000000"},
|
|
{"010000000000000000000000000000000000", "92010000000000000000000000000000000000"},
|
|
{"020000000000000000000000000000000000", "92020000000000000000000000000000000000"},
|
|
{"040000000000000000000000000000000000", "92040000000000000000000000000000000000"},
|
|
{"080000000000000000000000000000000000", "92080000000000000000000000000000000000"},
|
|
{"100000000000000000000000000000000000", "92100000000000000000000000000000000000"},
|
|
{"200000000000000000000000000000000000", "92200000000000000000000000000000000000"},
|
|
{"400000000000000000000000000000000000", "92400000000000000000000000000000000000"},
|
|
{"800000000000000000000000000000000000", "92800000000000000000000000000000000000"},
|
|
{"01000000000000000000000000000000000000", "9301000000000000000000000000000000000000"},
|
|
{"02000000000000000000000000000000000000", "9302000000000000000000000000000000000000"},
|
|
{"04000000000000000000000000000000000000", "9304000000000000000000000000000000000000"},
|
|
{"08000000000000000000000000000000000000", "9308000000000000000000000000000000000000"},
|
|
{"10000000000000000000000000000000000000", "9310000000000000000000000000000000000000"},
|
|
{"20000000000000000000000000000000000000", "9320000000000000000000000000000000000000"},
|
|
{"40000000000000000000000000000000000000", "9340000000000000000000000000000000000000"},
|
|
{"80000000000000000000000000000000000000", "9380000000000000000000000000000000000000"},
|
|
{"0100000000000000000000000000000000000000", "940100000000000000000000000000000000000000"},
|
|
{"0200000000000000000000000000000000000000", "940200000000000000000000000000000000000000"},
|
|
{"0400000000000000000000000000000000000000", "940400000000000000000000000000000000000000"},
|
|
{"0800000000000000000000000000000000000000", "940800000000000000000000000000000000000000"},
|
|
{"1000000000000000000000000000000000000000", "941000000000000000000000000000000000000000"},
|
|
{"2000000000000000000000000000000000000000", "942000000000000000000000000000000000000000"},
|
|
{"4000000000000000000000000000000000000000", "944000000000000000000000000000000000000000"},
|
|
{"8000000000000000000000000000000000000000", "948000000000000000000000000000000000000000"},
|
|
{"010000000000000000000000000000000000000000", "95010000000000000000000000000000000000000000"},
|
|
{"020000000000000000000000000000000000000000", "95020000000000000000000000000000000000000000"},
|
|
{"040000000000000000000000000000000000000000", "95040000000000000000000000000000000000000000"},
|
|
{"080000000000000000000000000000000000000000", "95080000000000000000000000000000000000000000"},
|
|
{"100000000000000000000000000000000000000000", "95100000000000000000000000000000000000000000"},
|
|
{"200000000000000000000000000000000000000000", "95200000000000000000000000000000000000000000"},
|
|
{"400000000000000000000000000000000000000000", "95400000000000000000000000000000000000000000"},
|
|
{"800000000000000000000000000000000000000000", "95800000000000000000000000000000000000000000"},
|
|
{"01000000000000000000000000000000000000000000", "9601000000000000000000000000000000000000000000"},
|
|
{"02000000000000000000000000000000000000000000", "9602000000000000000000000000000000000000000000"},
|
|
{"04000000000000000000000000000000000000000000", "9604000000000000000000000000000000000000000000"},
|
|
{"08000000000000000000000000000000000000000000", "9608000000000000000000000000000000000000000000"},
|
|
{"10000000000000000000000000000000000000000000", "9610000000000000000000000000000000000000000000"},
|
|
{"20000000000000000000000000000000000000000000", "9620000000000000000000000000000000000000000000"},
|
|
{"40000000000000000000000000000000000000000000", "9640000000000000000000000000000000000000000000"},
|
|
{"80000000000000000000000000000000000000000000", "9680000000000000000000000000000000000000000000"},
|
|
{"0100000000000000000000000000000000000000000000", "970100000000000000000000000000000000000000000000"},
|
|
{"0200000000000000000000000000000000000000000000", "970200000000000000000000000000000000000000000000"},
|
|
{"0400000000000000000000000000000000000000000000", "970400000000000000000000000000000000000000000000"},
|
|
{"0800000000000000000000000000000000000000000000", "970800000000000000000000000000000000000000000000"},
|
|
{"1000000000000000000000000000000000000000000000", "971000000000000000000000000000000000000000000000"},
|
|
{"2000000000000000000000000000000000000000000000", "972000000000000000000000000000000000000000000000"},
|
|
{"4000000000000000000000000000000000000000000000", "974000000000000000000000000000000000000000000000"},
|
|
{"8000000000000000000000000000000000000000000000", "978000000000000000000000000000000000000000000000"},
|
|
{"010000000000000000000000000000000000000000000000", "98010000000000000000000000000000000000000000000000"},
|
|
{"020000000000000000000000000000000000000000000000", "98020000000000000000000000000000000000000000000000"},
|
|
{"040000000000000000000000000000000000000000000000", "98040000000000000000000000000000000000000000000000"},
|
|
{"080000000000000000000000000000000000000000000000", "98080000000000000000000000000000000000000000000000"},
|
|
{"100000000000000000000000000000000000000000000000", "98100000000000000000000000000000000000000000000000"},
|
|
{"200000000000000000000000000000000000000000000000", "98200000000000000000000000000000000000000000000000"},
|
|
{"400000000000000000000000000000000000000000000000", "98400000000000000000000000000000000000000000000000"},
|
|
{"800000000000000000000000000000000000000000000000", "98800000000000000000000000000000000000000000000000"},
|
|
{"01000000000000000000000000000000000000000000000000", "9901000000000000000000000000000000000000000000000000"},
|
|
{"02000000000000000000000000000000000000000000000000", "9902000000000000000000000000000000000000000000000000"},
|
|
{"04000000000000000000000000000000000000000000000000", "9904000000000000000000000000000000000000000000000000"},
|
|
{"08000000000000000000000000000000000000000000000000", "9908000000000000000000000000000000000000000000000000"},
|
|
{"10000000000000000000000000000000000000000000000000", "9910000000000000000000000000000000000000000000000000"},
|
|
{"20000000000000000000000000000000000000000000000000", "9920000000000000000000000000000000000000000000000000"},
|
|
{"40000000000000000000000000000000000000000000000000", "9940000000000000000000000000000000000000000000000000"},
|
|
{"80000000000000000000000000000000000000000000000000", "9980000000000000000000000000000000000000000000000000"},
|
|
{"0100000000000000000000000000000000000000000000000000", "9a0100000000000000000000000000000000000000000000000000"},
|
|
{"0200000000000000000000000000000000000000000000000000", "9a0200000000000000000000000000000000000000000000000000"},
|
|
{"0400000000000000000000000000000000000000000000000000", "9a0400000000000000000000000000000000000000000000000000"},
|
|
{"0800000000000000000000000000000000000000000000000000", "9a0800000000000000000000000000000000000000000000000000"},
|
|
{"1000000000000000000000000000000000000000000000000000", "9a1000000000000000000000000000000000000000000000000000"},
|
|
{"2000000000000000000000000000000000000000000000000000", "9a2000000000000000000000000000000000000000000000000000"},
|
|
{"4000000000000000000000000000000000000000000000000000", "9a4000000000000000000000000000000000000000000000000000"},
|
|
{"8000000000000000000000000000000000000000000000000000", "9a8000000000000000000000000000000000000000000000000000"},
|
|
{"010000000000000000000000000000000000000000000000000000", "9b010000000000000000000000000000000000000000000000000000"},
|
|
{"020000000000000000000000000000000000000000000000000000", "9b020000000000000000000000000000000000000000000000000000"},
|
|
{"040000000000000000000000000000000000000000000000000000", "9b040000000000000000000000000000000000000000000000000000"},
|
|
{"080000000000000000000000000000000000000000000000000000", "9b080000000000000000000000000000000000000000000000000000"},
|
|
{"100000000000000000000000000000000000000000000000000000", "9b100000000000000000000000000000000000000000000000000000"},
|
|
{"200000000000000000000000000000000000000000000000000000", "9b200000000000000000000000000000000000000000000000000000"},
|
|
{"400000000000000000000000000000000000000000000000000000", "9b400000000000000000000000000000000000000000000000000000"},
|
|
{"800000000000000000000000000000000000000000000000000000", "9b800000000000000000000000000000000000000000000000000000"},
|
|
{"01000000000000000000000000000000000000000000000000000000", "9c01000000000000000000000000000000000000000000000000000000"},
|
|
{"02000000000000000000000000000000000000000000000000000000", "9c02000000000000000000000000000000000000000000000000000000"},
|
|
{"04000000000000000000000000000000000000000000000000000000", "9c04000000000000000000000000000000000000000000000000000000"},
|
|
{"08000000000000000000000000000000000000000000000000000000", "9c08000000000000000000000000000000000000000000000000000000"},
|
|
{"10000000000000000000000000000000000000000000000000000000", "9c10000000000000000000000000000000000000000000000000000000"},
|
|
{"20000000000000000000000000000000000000000000000000000000", "9c20000000000000000000000000000000000000000000000000000000"},
|
|
{"40000000000000000000000000000000000000000000000000000000", "9c40000000000000000000000000000000000000000000000000000000"},
|
|
{"80000000000000000000000000000000000000000000000000000000", "9c80000000000000000000000000000000000000000000000000000000"},
|
|
{"0100000000000000000000000000000000000000000000000000000000", "9d0100000000000000000000000000000000000000000000000000000000"},
|
|
{"0200000000000000000000000000000000000000000000000000000000", "9d0200000000000000000000000000000000000000000000000000000000"},
|
|
{"0400000000000000000000000000000000000000000000000000000000", "9d0400000000000000000000000000000000000000000000000000000000"},
|
|
{"0800000000000000000000000000000000000000000000000000000000", "9d0800000000000000000000000000000000000000000000000000000000"},
|
|
{"1000000000000000000000000000000000000000000000000000000000", "9d1000000000000000000000000000000000000000000000000000000000"},
|
|
{"2000000000000000000000000000000000000000000000000000000000", "9d2000000000000000000000000000000000000000000000000000000000"},
|
|
{"4000000000000000000000000000000000000000000000000000000000", "9d4000000000000000000000000000000000000000000000000000000000"},
|
|
{"8000000000000000000000000000000000000000000000000000000000", "9d8000000000000000000000000000000000000000000000000000000000"},
|
|
{"010000000000000000000000000000000000000000000000000000000000", "9e010000000000000000000000000000000000000000000000000000000000"},
|
|
{"020000000000000000000000000000000000000000000000000000000000", "9e020000000000000000000000000000000000000000000000000000000000"},
|
|
{"040000000000000000000000000000000000000000000000000000000000", "9e040000000000000000000000000000000000000000000000000000000000"},
|
|
{"080000000000000000000000000000000000000000000000000000000000", "9e080000000000000000000000000000000000000000000000000000000000"},
|
|
{"100000000000000000000000000000000000000000000000000000000000", "9e100000000000000000000000000000000000000000000000000000000000"},
|
|
{"200000000000000000000000000000000000000000000000000000000000", "9e200000000000000000000000000000000000000000000000000000000000"},
|
|
{"400000000000000000000000000000000000000000000000000000000000", "9e400000000000000000000000000000000000000000000000000000000000"},
|
|
{"800000000000000000000000000000000000000000000000000000000000", "9e800000000000000000000000000000000000000000000000000000000000"},
|
|
{"01000000000000000000000000000000000000000000000000000000000000", "9f01000000000000000000000000000000000000000000000000000000000000"},
|
|
{"02000000000000000000000000000000000000000000000000000000000000", "9f02000000000000000000000000000000000000000000000000000000000000"},
|
|
{"04000000000000000000000000000000000000000000000000000000000000", "9f04000000000000000000000000000000000000000000000000000000000000"},
|
|
{"08000000000000000000000000000000000000000000000000000000000000", "9f08000000000000000000000000000000000000000000000000000000000000"},
|
|
{"10000000000000000000000000000000000000000000000000000000000000", "9f10000000000000000000000000000000000000000000000000000000000000"},
|
|
{"20000000000000000000000000000000000000000000000000000000000000", "9f20000000000000000000000000000000000000000000000000000000000000"},
|
|
{"40000000000000000000000000000000000000000000000000000000000000", "9f40000000000000000000000000000000000000000000000000000000000000"},
|
|
{"80000000000000000000000000000000000000000000000000000000000000", "9f80000000000000000000000000000000000000000000000000000000000000"},
|
|
{"0100000000000000000000000000000000000000000000000000000000000000", "a00100000000000000000000000000000000000000000000000000000000000000"},
|
|
{"0200000000000000000000000000000000000000000000000000000000000000", "a00200000000000000000000000000000000000000000000000000000000000000"},
|
|
{"0400000000000000000000000000000000000000000000000000000000000000", "a00400000000000000000000000000000000000000000000000000000000000000"},
|
|
{"0800000000000000000000000000000000000000000000000000000000000000", "a00800000000000000000000000000000000000000000000000000000000000000"},
|
|
{"1000000000000000000000000000000000000000000000000000000000000000", "a01000000000000000000000000000000000000000000000000000000000000000"},
|
|
{"2000000000000000000000000000000000000000000000000000000000000000", "a02000000000000000000000000000000000000000000000000000000000000000"},
|
|
{"4000000000000000000000000000000000000000000000000000000000000000", "a04000000000000000000000000000000000000000000000000000000000000000"},
|
|
{"8000000000000000000000000000000000000000000000000000000000000000", "a08000000000000000000000000000000000000000000000000000000000000000"},
|
|
} {
|
|
z := new(Int).SetBytes(hex2Bytes(tt.val))
|
|
var b bytes.Buffer
|
|
w := bufio.NewWriter(&b)
|
|
if err := z.EncodeRLP(w); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
w.Flush()
|
|
if got, exp := b.Bytes(), hex2Bytes(tt.exp); !bytes.Equal(got, exp) {
|
|
t.Fatalf("testcase %d got:\n%x\nexp:%x\n", i, got, exp)
|
|
}
|
|
}
|
|
// And test nil
|
|
{
|
|
var z *Int
|
|
var b bytes.Buffer
|
|
w := bufio.NewWriter(&b)
|
|
if err := z.EncodeRLP(w); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
w.Flush()
|
|
if got, exp := b.Bytes(), hex2Bytes("80"); !bytes.Equal(got, exp) {
|
|
t.Fatalf("nil-test got:\n%x\nexp:%x\n", got, exp)
|
|
}
|
|
}
|
|
}
|
|
|
|
type nilWriter struct{}
|
|
|
|
func (*nilWriter) Write(p []byte) (n int, err error) {
|
|
return len(p), nil
|
|
}
|
|
|
|
// BenchmarkRLPEncoding writes 255 Ints ranging in bitsize from 0-255 in each op
|
|
func BenchmarkRLPEncoding(b *testing.B) {
|
|
z := new(Int)
|
|
devnull := &nilWriter{}
|
|
b.ReportAllocs()
|
|
b.ResetTimer()
|
|
for i := 0; i < b.N; i++ {
|
|
z.SetUint64(1)
|
|
for bit := 0; bit < 255; bit++ {
|
|
_ = z.EncodeRLP(devnull)
|
|
z.Lsh(z, 1)
|
|
}
|
|
}
|
|
}
|
|
|
|
func referenceBig(s string) *big.Int {
|
|
b, ok := new(big.Int).SetString(s, 16)
|
|
if !ok {
|
|
panic("invalid")
|
|
}
|
|
return b
|
|
}
|
|
|
|
type marshalTest struct {
|
|
input interface{}
|
|
want string
|
|
}
|
|
|
|
type unmarshalTest struct {
|
|
input string
|
|
want interface{}
|
|
wantErr error // if set, decoding must fail on any platform
|
|
}
|
|
|
|
var (
|
|
encodeBigTests = []marshalTest{
|
|
{referenceBig("0"), "0x0"},
|
|
{referenceBig("1"), "0x1"},
|
|
{referenceBig("ff"), "0xff"},
|
|
{referenceBig("112233445566778899aabbccddeeff"), "0x112233445566778899aabbccddeeff"},
|
|
{referenceBig("80a7f2c1bcc396c00"), "0x80a7f2c1bcc396c00"},
|
|
}
|
|
|
|
decodeBigTests = []unmarshalTest{
|
|
// invalid
|
|
{input: ``, wantErr: ErrEmptyString},
|
|
{input: `0`, wantErr: ErrMissingPrefix},
|
|
{input: `0x`, wantErr: ErrEmptyNumber},
|
|
{input: `0x01`, wantErr: ErrLeadingZero},
|
|
{input: `0xx`, wantErr: ErrSyntax},
|
|
{input: `0x1zz01`, wantErr: ErrSyntax},
|
|
{
|
|
input: `0x10000000000000000000000000000000000000000000000000000000000000000`,
|
|
wantErr: ErrBig256Range,
|
|
},
|
|
// valid
|
|
{input: `0x0`, want: big.NewInt(0)},
|
|
{input: `0x2`, want: big.NewInt(0x2)},
|
|
{input: `0x2F2`, want: big.NewInt(0x2f2)},
|
|
{input: `0X2F2`, want: big.NewInt(0x2f2)},
|
|
{input: `0x1122aaff`, want: big.NewInt(0x1122aaff)},
|
|
{input: `0xbBb`, want: big.NewInt(0xbbb)},
|
|
{input: `0xfffffffff`, want: big.NewInt(0xfffffffff)},
|
|
{
|
|
input: `0x112233445566778899aabbccddeeff`,
|
|
want: referenceBig("112233445566778899aabbccddeeff"),
|
|
},
|
|
{
|
|
input: `0xffffffffffffffffffffffffffffffffffff`,
|
|
want: referenceBig("ffffffffffffffffffffffffffffffffffff"),
|
|
},
|
|
{
|
|
input: `0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff`,
|
|
want: referenceBig("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),
|
|
},
|
|
}
|
|
)
|
|
|
|
func checkError(t *testing.T, input string, got, want error) bool {
|
|
if got == nil {
|
|
if want != nil {
|
|
t.Errorf("input %s: got no error, want %q", input, want)
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
if want == nil {
|
|
t.Errorf("input %s: unexpected error %q", input, got)
|
|
} else if got.Error() != want.Error() {
|
|
t.Errorf("input %s: got error %q, want %q", input, got, want)
|
|
}
|
|
return false
|
|
}
|
|
|
|
func TestEncode(t *testing.T) {
|
|
for _, test := range encodeBigTests {
|
|
z, _ := FromBig(test.input.(*big.Int))
|
|
enc := z.Hex()
|
|
if enc != test.want {
|
|
t.Errorf("input %x: wrong encoding %s (exp %s)", test.input, enc, test.want)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
func TestDecode(t *testing.T) {
|
|
for _, test := range decodeBigTests {
|
|
dec, err := FromHex(test.input)
|
|
if !checkError(t, test.input, err, test.wantErr) {
|
|
continue
|
|
}
|
|
b := dec.ToBig()
|
|
if b.Cmp(test.want.(*big.Int)) != 0 {
|
|
t.Errorf("input %s: value mismatch: got %x, want %x", test.input, dec, test.want)
|
|
continue
|
|
}
|
|
}
|
|
// Some remaining json-tests
|
|
type jsonStruct struct {
|
|
Foo *Int
|
|
}
|
|
var jsonDecoded jsonStruct
|
|
if err := json.Unmarshal([]byte(`{"Foo":0x1}`), &jsonDecoded); err == nil {
|
|
t.Fatal("Expected error")
|
|
}
|
|
if err := json.Unmarshal([]byte(`{"Foo":1}`), &jsonDecoded); err == nil {
|
|
t.Fatal("Expected error")
|
|
}
|
|
if err := json.Unmarshal([]byte(`{"Foo":""}`), &jsonDecoded); err == nil {
|
|
t.Fatal("Expected error")
|
|
}
|
|
if err := json.Unmarshal([]byte(`{"Foo":"0x1"}`), &jsonDecoded); err != nil {
|
|
t.Fatalf("Expected no error, got %v", err)
|
|
} else if jsonDecoded.Foo.Uint64() != 1 {
|
|
t.Fatal("Expected 1")
|
|
}
|
|
}
|
|
|
|
func TestEnDecode(t *testing.T) {
|
|
type jsonStruct struct {
|
|
Foo *Int
|
|
}
|
|
var testSample = func(i int, bigSample big.Int, intSample Int) {
|
|
// Encoding
|
|
exp := fmt.Sprintf("0x%s", bigSample.Text(16))
|
|
|
|
if got := intSample.Hex(); exp != got {
|
|
t.Fatalf("test %d #1, got %v, exp %v", i, got, exp)
|
|
}
|
|
if got := intSample.String(); exp != got {
|
|
t.Fatalf("test %d #2, got %v, exp %v", i, got, exp)
|
|
}
|
|
if got, _ := intSample.MarshalText(); exp != string(got) {
|
|
t.Fatalf("test %d #3, got %v, exp %v", i, got, exp)
|
|
}
|
|
{ // Json
|
|
jsonEncoded, err := json.Marshal(&jsonStruct{&intSample})
|
|
if err != nil {
|
|
t.Fatalf("test %d #4, err: %v", i, err)
|
|
}
|
|
var jsonDecoded jsonStruct
|
|
err = json.Unmarshal(jsonEncoded, &jsonDecoded)
|
|
if err != nil {
|
|
t.Fatalf("test %d #5, err: %v", i, err)
|
|
}
|
|
if jsonDecoded.Foo.Cmp(&intSample) != 0 {
|
|
t.Fatalf("test %d #6, got %v, exp %v", i, jsonDecoded.Foo, intSample)
|
|
}
|
|
}
|
|
// Decoding
|
|
dec, err := FromHex(exp)
|
|
if err != nil {
|
|
t.Fatalf("test %d #5, err: %v", i, err)
|
|
}
|
|
if dec.Cmp(&intSample) != 0 {
|
|
t.Fatalf("test %d #6, got %v, exp %v", i, dec, intSample)
|
|
}
|
|
dec = new(Int)
|
|
if err := dec.UnmarshalText([]byte(exp)); err != nil {
|
|
t.Fatalf("test %d #7, err: %v", i, err)
|
|
}
|
|
if dec.Cmp(&intSample) != 0 {
|
|
t.Fatalf("test %d #8, got %v, exp %v", i, dec, intSample)
|
|
}
|
|
|
|
}
|
|
for i, bigSample := range big256Samples {
|
|
intSample := int256Samples[i]
|
|
testSample(i, bigSample, intSample)
|
|
}
|
|
|
|
for i, bigSample := range big256SamplesLt {
|
|
intSample := int256SamplesLt[i]
|
|
testSample(i, bigSample, intSample)
|
|
}
|
|
}
|