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