erigon-pulse/cmd/rpcdaemon/commands/storage_range.go
ledgerwatch 72dcf478d3
Fix debug_storageRangeAt in rpc daemon (#732)
* Fix storageRangeAt

* Fix formatting

* Fix lint

* Fix lint

* Prevent racing by closing db after the blockchain
2020-07-10 06:44:01 +01:00

48 lines
1.4 KiB
Go

package commands
import (
"fmt"
"github.com/holiman/uint256"
"github.com/ledgerwatch/turbo-geth/common"
)
// StorageRangeResult is the result of a debug_storageRangeAt API call.
type StorageRangeResult struct {
Storage StorageMap `json:"storage"`
NextKey *common.Hash `json:"nextKey"` // nil if Storage includes the last key in the trie.
}
type StorageMap map[common.Hash]StorageEntry
type StorageEntry struct {
Key *common.Hash `json:"key"`
Value common.Hash `json:"value"`
}
func StorageRangeAt(stateReader *StateReader, contractAddress common.Address, start []byte, maxResult int) (StorageRangeResult, error) {
//account, err := stateReader.ReadAccountData(contractAddress)
//if err != nil {
// return StorageRangeResult{}, fmt.Errorf("error reading account %x: %v", contractAddress, err)
//}
//if account == nil {
// return StorageRangeResult{}, fmt.Errorf("account %x doesn't exist", contractAddress)
//}
result := StorageRangeResult{Storage: StorageMap{}}
resultCount := 0
if err := stateReader.ForEachStorage(contractAddress, start, func(key, seckey common.Hash, value uint256.Int) bool {
if resultCount < maxResult {
result.Storage[seckey] = StorageEntry{Key: &key, Value: value.Bytes32()}
} else {
result.NextKey = &key
}
resultCount++
return resultCount <= maxResult
}, maxResult+1); err != nil {
return StorageRangeResult{}, fmt.Errorf("error walking over storage: %v", err)
}
return result, nil
}