eth: report missing future blocks only for state retrievals

This commit is contained in:
Péter Szilágyi 2017-01-03 13:13:23 +02:00 committed by Felix Lange
parent 31ac90ca0b
commit 3831c629a0
2 changed files with 10 additions and 9 deletions

View file

@ -18,9 +18,9 @@ package eth
import ( import (
"context" "context"
"errors"
"math/big" "math/big"
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/common/math"
@ -66,10 +66,7 @@ func (b *EthApiBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNum
if blockNr == rpc.LatestBlockNumber { if blockNr == rpc.LatestBlockNumber {
return b.eth.blockchain.CurrentBlock().Header(), nil return b.eth.blockchain.CurrentBlock().Header(), nil
} }
if header := b.eth.blockchain.GetHeaderByNumber(uint64(blockNr)); header != nil { return b.eth.blockchain.GetHeaderByNumber(uint64(blockNr)), nil
return header, nil
}
return nil, errors.New("non-existent block") // Although only header was requested, the cause is the missing block
} }
func (b *EthApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) { func (b *EthApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) {
@ -82,10 +79,7 @@ func (b *EthApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumb
if blockNr == rpc.LatestBlockNumber { if blockNr == rpc.LatestBlockNumber {
return b.eth.blockchain.CurrentBlock(), nil return b.eth.blockchain.CurrentBlock(), nil
} }
if block := b.eth.blockchain.GetBlockByNumber(uint64(blockNr)); block != nil { return b.eth.blockchain.GetBlockByNumber(uint64(blockNr)), nil
return block, nil
}
return nil, errors.New("non-existent block")
} }
func (b *EthApiBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) { func (b *EthApiBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) {
@ -99,6 +93,9 @@ func (b *EthApiBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
if header == nil {
return nil, nil, ethereum.NotFound
}
stateDb, err := b.eth.BlockChain().StateAt(header.Root) stateDb, err := b.eth.BlockChain().StateAt(header.Root)
return stateDb, header, err return stateDb, header, err
} }

View file

@ -20,6 +20,7 @@ import (
"context" "context"
"math/big" "math/big"
ethereum "github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/accounts" "github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/common/math"
@ -75,6 +76,9 @@ func (b *LesApiBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
if header == nil {
return nil, nil, ethereum.NotFound
}
return light.NewState(ctx, header, b.eth.odr), header, nil return light.NewState(ctx, header, b.eth.odr), header, nil
} }