core/state: access trie through Database interface, track errors (#14589)
With this commit, core/state's access to the underlying key/value database is mediated through an interface. Database errors are tracked in StateDB and returned by CommitTo or the new Error method. Motivation for this change: We can remove the light client's duplicated copy of core/state. The light client now supports node iteration, so tracing and storage enumeration can work with the light client (not implemented in this commit).
This commit is contained in:
@ -447,8 +447,8 @@ func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Add
|
||||
if state == nil || err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return state.GetBalance(ctx, address)
|
||||
b := state.GetBalance(address)
|
||||
return b, state.Error()
|
||||
}
|
||||
|
||||
// GetBlockByNumber returns the requested block. When blockNr is -1 the chain head is returned. When fullTx is true all
|
||||
@ -529,31 +529,25 @@ 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) (string, error) {
|
||||
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 {
|
||||
return "", err
|
||||
return nil, err
|
||||
}
|
||||
res, err := state.GetCode(ctx, address)
|
||||
if len(res) == 0 || err != nil { // backwards compatibility
|
||||
return "0x", err
|
||||
}
|
||||
return common.ToHex(res), nil
|
||||
code := state.GetCode(address)
|
||||
return code, state.Error()
|
||||
}
|
||||
|
||||
// GetStorageAt returns the storage from the state at the given address, key and
|
||||
// block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta block
|
||||
// numbers are also allowed.
|
||||
func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.Address, key string, blockNr rpc.BlockNumber) (string, error) {
|
||||
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 {
|
||||
return "0x", err
|
||||
return nil, err
|
||||
}
|
||||
res, err := state.GetState(ctx, address, common.HexToHash(key))
|
||||
if err != nil {
|
||||
return "0x", err
|
||||
}
|
||||
return res.Hex(), nil
|
||||
res := state.GetState(address, common.HexToHash(key))
|
||||
return res[:], state.Error()
|
||||
}
|
||||
|
||||
// callmsg is the message type used for call transitions.
|
||||
@ -978,11 +972,8 @@ func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, addr
|
||||
if state == nil || err != nil {
|
||||
return nil, err
|
||||
}
|
||||
nonce, err := state.GetNonce(ctx, address)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return (*hexutil.Uint64)(&nonce), nil
|
||||
nonce := state.GetNonce(address)
|
||||
return (*hexutil.Uint64)(&nonce), state.Error()
|
||||
}
|
||||
|
||||
// getTransactionBlockData fetches the meta data for the given transaction from the chain database. This is useful to
|
||||
|
Reference in New Issue
Block a user