common/hexutil: ensure negative big.Int is encoded sensibly

Restricting encoding is silly.
This commit is contained in:
Felix Lange 2017-02-26 19:40:33 +01:00
parent d304da3803
commit 280f08be84
3 changed files with 5 additions and 16 deletions

View File

@ -178,7 +178,7 @@ func EncodeBig(bigint *big.Int) string {
if nbits == 0 { if nbits == 0 {
return "0x0" return "0x0"
} }
return fmt.Sprintf("0x%x", bigint) return fmt.Sprintf("%#x", bigint)
} }
func has0xPrefix(input string) bool { func has0xPrefix(input string) bool {

View File

@ -47,6 +47,7 @@ var (
{referenceBig("ff"), "0xff"}, {referenceBig("ff"), "0xff"},
{referenceBig("112233445566778899aabbccddeeff"), "0x112233445566778899aabbccddeeff"}, {referenceBig("112233445566778899aabbccddeeff"), "0x112233445566778899aabbccddeeff"},
{referenceBig("80a7f2c1bcc396c00"), "0x80a7f2c1bcc396c00"}, {referenceBig("80a7f2c1bcc396c00"), "0x80a7f2c1bcc396c00"},
{referenceBig("-80a7f2c1bcc396c00"), "-0x80a7f2c1bcc396c00"},
} }
encodeUint64Tests = []marshalTest{ encodeUint64Tests = []marshalTest{

View File

@ -25,9 +25,8 @@ import (
) )
var ( var (
textZero = []byte(`0x0`) textZero = []byte(`0x0`)
errNonString = errors.New("cannot unmarshal non-string as hex data") errNonString = errors.New("cannot unmarshal non-string as hex data")
errNegativeBigInt = errors.New("hexutil.Big: can't marshal negative integer")
) )
// Bytes marshals/unmarshals as a JSON string with 0x prefix. // Bytes marshals/unmarshals as a JSON string with 0x prefix.
@ -101,18 +100,7 @@ type Big big.Int
// MarshalText implements encoding.TextMarshaler // MarshalText implements encoding.TextMarshaler
func (b Big) MarshalText() ([]byte, error) { func (b Big) MarshalText() ([]byte, error) {
bigint := (big.Int)(b) return []byte(EncodeBig((*big.Int)(&b))), nil
if bigint.Sign() == -1 {
return nil, errNegativeBigInt
}
nbits := bigint.BitLen()
if nbits == 0 {
return textZero, nil
}
enc := make([]byte, 2, nbits/4+2)
copy(enc, "0x")
enc = bigint.Append(enc, 16)
return enc, nil
} }
// UnmarshalJSON implements json.Unmarshaler. // UnmarshalJSON implements json.Unmarshaler.