From 280f08be84325924ea7628a8187fd84e7cc39145 Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Sun, 26 Feb 2017 19:40:33 +0100 Subject: common/hexutil: ensure negative big.Int is encoded sensibly Restricting encoding is silly. --- common/hexutil/hexutil.go | 2 +- common/hexutil/hexutil_test.go | 1 + common/hexutil/json.go | 18 +++--------------- 3 files changed, 5 insertions(+), 16 deletions(-) (limited to 'common') diff --git a/common/hexutil/hexutil.go b/common/hexutil/hexutil.go index b66c0d3fe..6b128ae36 100644 --- a/common/hexutil/hexutil.go +++ b/common/hexutil/hexutil.go @@ -178,7 +178,7 @@ func EncodeBig(bigint *big.Int) string { if nbits == 0 { return "0x0" } - return fmt.Sprintf("0x%x", bigint) + return fmt.Sprintf("%#x", bigint) } func has0xPrefix(input string) bool { diff --git a/common/hexutil/hexutil_test.go b/common/hexutil/hexutil_test.go index 6a92a385c..ed6fccc3c 100644 --- a/common/hexutil/hexutil_test.go +++ b/common/hexutil/hexutil_test.go @@ -47,6 +47,7 @@ var ( {referenceBig("ff"), "0xff"}, {referenceBig("112233445566778899aabbccddeeff"), "0x112233445566778899aabbccddeeff"}, {referenceBig("80a7f2c1bcc396c00"), "0x80a7f2c1bcc396c00"}, + {referenceBig("-80a7f2c1bcc396c00"), "-0x80a7f2c1bcc396c00"}, } encodeUint64Tests = []marshalTest{ diff --git a/common/hexutil/json.go b/common/hexutil/json.go index ce6a2b048..23393ed2c 100644 --- a/common/hexutil/json.go +++ b/common/hexutil/json.go @@ -25,9 +25,8 @@ import ( ) var ( - textZero = []byte(`0x0`) - errNonString = errors.New("cannot unmarshal non-string as hex data") - errNegativeBigInt = errors.New("hexutil.Big: can't marshal negative integer") + textZero = []byte(`0x0`) + errNonString = errors.New("cannot unmarshal non-string as hex data") ) // Bytes marshals/unmarshals as a JSON string with 0x prefix. @@ -101,18 +100,7 @@ type Big big.Int // MarshalText implements encoding.TextMarshaler func (b Big) MarshalText() ([]byte, error) { - bigint := (big.Int)(b) - 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 + return []byte(EncodeBig((*big.Int)(&b))), nil } // UnmarshalJSON implements json.Unmarshaler. -- cgit