EIP-1186 eth_getProof (#17737)

* first impl of eth_getProof

* fixed docu

* added comments and refactored based on comments from holiman

* created structs

* handle errors correctly

* change Value to *hexutil.Big in order to have the same output as parity

* use ProofList as return type
This commit is contained in:
Simon Jentzsch
2018-10-18 21:41:22 +02:00
committed by Martin Holst Swende
parent cdf5982cfc
commit 97fb08342d
4 changed files with 105 additions and 0 deletions

View File

@ -18,6 +18,7 @@
package state
import (
"errors"
"fmt"
"math/big"
"sort"
@ -25,6 +26,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/core/vm"
"github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/rlp"
@ -256,6 +258,24 @@ func (self *StateDB) GetState(addr common.Address, hash common.Hash) common.Hash
return common.Hash{}
}
// GetProof returns the MerkleProof for a given Account
func (self *StateDB) GetProof(a common.Address) (vm.ProofList, error) {
var proof vm.ProofList
err := self.trie.Prove(crypto.Keccak256(a.Bytes()), 0, &proof)
return proof, err
}
// GetProof returns the StorageProof for given key
func (self *StateDB) GetStorageProof(a common.Address, key common.Hash) (vm.ProofList, error) {
var proof vm.ProofList
trie := self.StorageTrie(a)
if trie == nil {
return proof, errors.New("storage trie for requested address does not exist")
}
err := trie.Prove(crypto.Keccak256(key.Bytes()), 0, &proof)
return proof, err
}
// GetCommittedState retrieves a value from the given account's committed storage trie.
func (self *StateDB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash {
stateObject := self.getStateObject(addr)