From b0d9f7372a04fa8f0ffc391f0997e2e062d465ef Mon Sep 17 00:00:00 2001 From: Felix Lange Date: Thu, 4 Aug 2016 01:40:50 +0200 Subject: internal/ethapi: add missing output fields - returned headers didn't include mixHash - returned transactions didn't include signature fields - empty transaction input was returned as "", but should be "0x" - returned receipts didn't include the bloom filter - "root" in receipts was missing 0x prefix --- rpc/types.go | 30 ++++++++++++++++++++++++++++++ rpc/types_test.go | 22 ++++++++++++++++++++++ 2 files changed, 52 insertions(+) (limited to 'rpc') diff --git a/rpc/types.go b/rpc/types.go index 89c5b5bc9..ebe388373 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -17,6 +17,8 @@ package rpc import ( + "bytes" + "encoding/hex" "fmt" "math" "math/big" @@ -272,3 +274,31 @@ func (bn *BlockNumber) UnmarshalJSON(data []byte) error { func (bn BlockNumber) Int64() int64 { return (int64)(bn) } + +// HexBytes JSON-encodes as hex with 0x prefix. +type HexBytes []byte + +func (b HexBytes) MarshalJSON() ([]byte, error) { + result := make([]byte, len(b)*2+4) + copy(result, `"0x`) + hex.Encode(result[3:], b) + result[len(result)-1] = '"' + return result, nil +} + +func (b *HexBytes) UnmarshalJSON(input []byte) error { + if len(input) >= 2 && input[0] == '"' && input[len(input)-1] == '"' { + input = input[1 : len(input)-1] + } + if !bytes.HasPrefix(input, []byte("0x")) { + return fmt.Errorf("missing 0x prefix for hex byte array") + } + input = input[2:] + if len(input) == 0 { + *b = nil + return nil + } + *b = make([]byte, len(input)/2) + _, err := hex.Decode(*b, input) + return err +} diff --git a/rpc/types_test.go b/rpc/types_test.go index c2c5c6db6..5482557b8 100644 --- a/rpc/types_test.go +++ b/rpc/types_test.go @@ -71,3 +71,25 @@ func TestHexNumberMarshalJSON(t *testing.T) { t.Fatalf("Invalid json.Marshal, expected '%s', got '%s'", exp, got) } } + +var hexBytesTests = []struct{ in, out []byte }{ + {in: []byte(`"0x"`), out: []byte{}}, + {in: []byte(`"0x00"`), out: []byte{0}}, + {in: []byte(`"0x01ff"`), out: []byte{0x01, 0xFF}}, +} + +func TestHexBytes(t *testing.T) { + for i, test := range hexBytesTests { + var dec HexBytes + if err := json.Unmarshal(test.in, &dec); err != nil { + t.Fatalf("test %d: can't decode: %v", i, err) + } + enc, _ := json.Marshal(HexBytes(test.out)) + if !bytes.Equal(dec, test.out) { + t.Errorf("test %d: wrong decoded value 0x%x", i, dec) + } + if !bytes.Equal(enc, test.in) { + t.Errorf("test %d: wrong encoded value %#q", i, enc) + } + } +} -- cgit v1.2.3