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

Restricting encoding is silly.
pull/3722/head
Felix Lange 8 years ago
parent d304da3803
commit 280f08be84
  1. 2
      common/hexutil/hexutil.go
  2. 1
      common/hexutil/hexutil_test.go
  3. 18
      common/hexutil/json.go

@ -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 {

@ -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{

@ -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.

Loading…
Cancel
Save