diff --git a/eth/api_backend.go b/eth/api_backend.go index 91f392f94f..c863997672 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -20,6 +20,7 @@ import ( "context" "math/big" + ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" @@ -61,7 +62,7 @@ func (b *EthApiBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNum block := b.eth.miner.PendingBlock() return block.Header(), nil } - // Otherwise resolve and return the block + // Otherwise resolve and return the header if blockNr == rpc.LatestBlockNumber { return b.eth.blockchain.CurrentBlock().Header(), nil } @@ -89,9 +90,12 @@ func (b *EthApiBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc. } // Otherwise resolve the block number and return its state header, err := b.HeaderByNumber(ctx, blockNr) - if header == nil || err != nil { + if err != nil { return nil, nil, err } + if header == nil { + return nil, nil, ethereum.NotFound + } stateDb, err := b.eth.BlockChain().StateAt(header.Root) return stateDb, header, err } diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index ab8478929f..babc2b996d 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -464,7 +464,7 @@ func (s *PublicBlockChainAPI) BlockNumber() *big.Int { // block numbers are also allowed. func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (*big.Int, error) { state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) - if state == nil || err != nil { + if err != nil { return nil, err } b := state.GetBalance(address) @@ -551,7 +551,11 @@ func (s *PublicBlockChainAPI) GetUncleCountByBlockHash(ctx context.Context, bloc // GetCode returns the code stored at the given address in the state for the given block number. func (s *PublicBlockChainAPI) GetCode(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (hexutil.Bytes, error) { state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) - if state == nil || err != nil { + if err != nil { + return nil, err + } + res, err := state.GetCode(ctx, address) + if len(res) == 0 || err != nil { // backwards compatibility return nil, err } code := state.GetCode(address) @@ -563,7 +567,11 @@ func (s *PublicBlockChainAPI) GetCode(ctx context.Context, address common.Addres // numbers are also allowed. func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.Address, key string, blockNr rpc.BlockNumber) (hexutil.Bytes, error) { state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) - if state == nil || err != nil { + if err != nil { + return nil, err + } + res, err := state.GetState(ctx, address, common.HexToHash(key)) + if err != nil { return nil, err } res := state.GetState(address, common.HexToHash(key)) @@ -584,9 +592,10 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr defer func(start time.Time) { log.Debug("Executing EVM call finished", "runtime", time.Since(start)) }(time.Now()) state, header, err := s.b.StateAndHeaderByNumber(ctx, blockNr) - if state == nil || err != nil { + if err != nil { return nil, common.Big0, err } + // Set sender address or use a default if none specified addr := args.From if addr == (common.Address{}) { @@ -940,7 +949,7 @@ func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockHashAndIndex(ctx cont // GetTransactionCount returns the number of transactions the given address has sent for the given block number func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (*hexutil.Uint64, error) { state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) - if state == nil || err != nil { + if err != nil { return nil, err } nonce := state.GetNonce(address) diff --git a/les/api_backend.go b/les/api_backend.go index 0d2d31b673..0252138e35 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -20,6 +20,7 @@ import ( "context" "math/big" + ethereum "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" @@ -59,7 +60,6 @@ func (b *LesApiBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNum if blockNr == rpc.LatestBlockNumber || blockNr == rpc.PendingBlockNumber { return b.eth.blockchain.CurrentHeader(), nil } - return b.eth.blockchain.GetHeaderByNumberOdr(ctx, uint64(blockNr)) } @@ -73,9 +73,12 @@ func (b *LesApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumb func (b *LesApiBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) { header, err := b.HeaderByNumber(ctx, blockNr) - if header == nil || err != nil { + if err != nil { return nil, nil, err } + if header == nil { + return nil, nil, ethereum.NotFound + } return light.NewState(ctx, header, b.eth.odr), header, nil }