diff options
author | Felix Lange <fjl@twurst.com> | 2015-09-23 05:59:26 +0800 |
---|---|---|
committer | Felix Lange <fjl@twurst.com> | 2015-09-23 05:59:26 +0800 |
commit | 90cd8ae9f28b7caac93b5c8d555a11e6be90a9eb (patch) | |
tree | 92a78e7a87dde02deb5a30809f145a2a034cf841 | |
parent | 70b6174748585be2dd4b132203cda8655b76251b (diff) | |
download | go-tangerine-90cd8ae9f28b7caac93b5c8d555a11e6be90a9eb.tar go-tangerine-90cd8ae9f28b7caac93b5c8d555a11e6be90a9eb.tar.gz go-tangerine-90cd8ae9f28b7caac93b5c8d555a11e6be90a9eb.tar.bz2 go-tangerine-90cd8ae9f28b7caac93b5c8d555a11e6be90a9eb.tar.lz go-tangerine-90cd8ae9f28b7caac93b5c8d555a11e6be90a9eb.tar.xz go-tangerine-90cd8ae9f28b7caac93b5c8d555a11e6be90a9eb.tar.zst go-tangerine-90cd8ae9f28b7caac93b5c8d555a11e6be90a9eb.zip |
rpc/api: don't crash for unknown blocks
Most eth RPC calls that work with blocks crashed when the block was not
found because they called Hash on a nil block. This is a regression
introduced in cdc2662c409 (#1779).
While here, remove the insane conversions in get*CountBy*. There is no
need to construct a complete BlockRes and converting
int->int64->*big.Int->[]byte->hexnum->string to format the length of a
slice as hex.
-rw-r--r-- | rpc/api/eth.go | 48 |
1 files changed, 23 insertions, 25 deletions
diff --git a/rpc/api/eth.go b/rpc/api/eth.go index 30366a951..4cd5f2695 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -210,7 +210,7 @@ func (self *ethApi) GetTransactionCount(req *shared.Request) (interface{}, error } count := self.xeth.AtStateNum(args.BlockNumber).TxCountAt(args.Address) - return newHexNum(big.NewInt(int64(count)).Bytes()), nil + return fmt.Sprintf("%#x", count), nil } func (self *ethApi) GetBlockTransactionCountByHash(req *shared.Request) (interface{}, error) { @@ -218,14 +218,11 @@ func (self *ethApi) GetBlockTransactionCountByHash(req *shared.Request) (interfa if err := self.codec.Decode(req.Params, &args); err != nil { return nil, shared.NewDecodeParamError(err.Error()) } - - raw := self.xeth.EthBlockByHash(args.Hash) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + block := self.xeth.EthBlockByHash(args.Hash) if block == nil { return nil, nil - } else { - return newHexNum(big.NewInt(int64(len(block.Transactions))).Bytes()), nil } + return fmt.Sprintf("%#x", len(block.Transactions())), nil } func (self *ethApi) GetBlockTransactionCountByNumber(req *shared.Request) (interface{}, error) { @@ -234,13 +231,11 @@ func (self *ethApi) GetBlockTransactionCountByNumber(req *shared.Request) (inter return nil, shared.NewDecodeParamError(err.Error()) } - raw := self.xeth.EthBlockByNumber(args.BlockNumber) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + block := self.xeth.EthBlockByNumber(args.BlockNumber) if block == nil { return nil, nil - } else { - return newHexNum(big.NewInt(int64(len(block.Transactions))).Bytes()), nil } + return fmt.Sprintf("%#x", len(block.Transactions())), nil } func (self *ethApi) GetUncleCountByBlockHash(req *shared.Request) (interface{}, error) { @@ -249,12 +244,11 @@ func (self *ethApi) GetUncleCountByBlockHash(req *shared.Request) (interface{}, return nil, shared.NewDecodeParamError(err.Error()) } - raw := self.xeth.EthBlockByHash(args.Hash) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + block := self.xeth.EthBlockByHash(args.Hash) if block == nil { return nil, nil } - return newHexNum(big.NewInt(int64(len(block.Uncles))).Bytes()), nil + return fmt.Sprintf("%#x", len(block.Uncles())), nil } func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{}, error) { @@ -263,12 +257,11 @@ func (self *ethApi) GetUncleCountByBlockNumber(req *shared.Request) (interface{} return nil, shared.NewDecodeParamError(err.Error()) } - raw := self.xeth.EthBlockByNumber(args.BlockNumber) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) + block := self.xeth.EthBlockByNumber(args.BlockNumber) if block == nil { return nil, nil } - return newHexNum(big.NewInt(int64(len(block.Uncles))).Bytes()), nil + return fmt.Sprintf("%#x", len(block.Uncles())), nil } func (self *ethApi) GetData(req *shared.Request) (interface{}, error) { @@ -377,8 +370,10 @@ func (self *ethApi) GetBlockByHash(req *shared.Request) (interface{}, error) { if err := self.codec.Decode(req.Params, &args); err != nil { return nil, shared.NewDecodeParamError(err.Error()) } - block := self.xeth.EthBlockByHash(args.BlockHash) + if block == nil { + return nil, nil + } return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil } @@ -389,6 +384,9 @@ func (self *ethApi) GetBlockByNumber(req *shared.Request) (interface{}, error) { } block := self.xeth.EthBlockByNumber(args.BlockNumber) + if block == nil { + return nil, nil + } return NewBlockRes(block, self.xeth.Td(block.Hash()), args.IncludeTxs), nil } @@ -419,10 +417,10 @@ func (self *ethApi) GetTransactionByBlockHashAndIndex(req *shared.Request) (inte } raw := self.xeth.EthBlockByHash(args.Hash) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) - if block == nil { + if raw == nil { return nil, nil } + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) if args.Index >= int64(len(block.Transactions)) || args.Index < 0 { return nil, nil } else { @@ -437,10 +435,10 @@ func (self *ethApi) GetTransactionByBlockNumberAndIndex(req *shared.Request) (in } raw := self.xeth.EthBlockByNumber(args.BlockNumber) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) - if block == nil { + if raw == nil { return nil, nil } + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) if args.Index >= int64(len(block.Transactions)) || args.Index < 0 { // return NewValidationError("Index", "does not exist") return nil, nil @@ -455,10 +453,10 @@ func (self *ethApi) GetUncleByBlockHashAndIndex(req *shared.Request) (interface{ } raw := self.xeth.EthBlockByHash(args.Hash) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) - if block == nil { + if raw == nil { return nil, nil } + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), false) if args.Index >= int64(len(block.Uncles)) || args.Index < 0 { // return NewValidationError("Index", "does not exist") return nil, nil @@ -473,10 +471,10 @@ func (self *ethApi) GetUncleByBlockNumberAndIndex(req *shared.Request) (interfac } raw := self.xeth.EthBlockByNumber(args.BlockNumber) - block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) - if block == nil { + if raw == nil { return nil, nil } + block := NewBlockRes(raw, self.xeth.Td(raw.Hash()), true) if args.Index >= int64(len(block.Uncles)) || args.Index < 0 { return nil, nil } else { |