Documentation
¶
Index ¶
- Constants
- Variables
- func ErrCloseDB(err error) lib.ErrorI
- func ErrCommitDB(err error) lib.ErrorI
- func ErrFlushBatch(err error) lib.ErrorI
- func ErrGarbageCollectDB(err error) lib.ErrorI
- func ErrIndexBlock(err error) lib.ErrorI
- func ErrInvalidKey() lib.ErrorI
- func ErrInvalidMerkleTree() lib.ErrorI
- func ErrInvalidMerkleTreeProof() lib.ErrorI
- func ErrOpenDB(err error) lib.ErrorI
- func ErrReadBytes(err error) lib.ErrorI
- func ErrReserveKeyWrite(key string) lib.ErrorI
- func ErrSetEntry(err error) lib.ErrorI
- func ErrStoreDelete(err error) lib.ErrorI
- func ErrStoreGet(err error) lib.ErrorI
- func ErrStoreSet(err error) lib.ErrorI
- func New(config lib.Config, metrics *lib.Metrics, l lib.LoggerI) (lib.StoreI, lib.ErrorI)
- func NewStore(config lib.Config, path string, metrics *lib.Metrics, log lib.LoggerI) (lib.StoreI, lib.ErrorI)
- func NewStoreInMemory(log lib.LoggerI) (lib.StoreI, lib.ErrorI)
- type BTreeIterator
- type CacheItem
- type Indexer
- func (t *Indexer) DeleteBlockForHeight(height uint64) lib.ErrorI
- func (t *Indexer) DeleteQCForHeight(height uint64) lib.ErrorI
- func (t *Indexer) DeleteTxsForHeight(height uint64) lib.ErrorI
- func (t *Indexer) GetAllCheckpoints(chainId uint64) (checkpoints []*lib.Checkpoint, err lib.ErrorI)
- func (t *Indexer) GetBlockByHash(hash []byte) (*lib.BlockResult, lib.ErrorI)
- func (t *Indexer) GetBlockByHeight(height uint64) (*lib.BlockResult, lib.ErrorI)
- func (t *Indexer) GetBlockHeaderByHeight(height uint64) (*lib.BlockResult, lib.ErrorI)
- func (t *Indexer) GetBlocks(p lib.PageParams) (page *lib.Page, err lib.ErrorI)
- func (t *Indexer) GetCheckpoint(chainId, height uint64) (blockHash lib.HexBytes, err lib.ErrorI)
- func (t *Indexer) GetDoubleSigners() (ds []*lib.DoubleSigner, err lib.ErrorI)
- func (t *Indexer) GetMostRecentCheckpoint(chainId uint64) (checkpoint *lib.Checkpoint, err lib.ErrorI)
- func (t *Indexer) GetQCByHeight(height uint64) (*lib.QuorumCertificate, lib.ErrorI)
- func (t *Indexer) GetTxByHash(hash []byte) (*lib.TxResult, lib.ErrorI)
- func (t *Indexer) GetTxsByHeight(height uint64, newestToOldest bool, p lib.PageParams) (*lib.Page, lib.ErrorI)
- func (t *Indexer) GetTxsByHeightNonPaginated(height uint64, newestToOldest bool) ([]*lib.TxResult, lib.ErrorI)
- func (t *Indexer) GetTxsByRecipient(address crypto.AddressI, newestToOldest bool, p lib.PageParams) (*lib.Page, lib.ErrorI)
- func (t *Indexer) GetTxsBySender(address crypto.AddressI, newestToOldest bool, p lib.PageParams) (*lib.Page, lib.ErrorI)
- func (t *Indexer) IndexBlock(b *lib.BlockResult) lib.ErrorI
- func (t *Indexer) IndexCheckpoint(chainId uint64, checkpoint *lib.Checkpoint) lib.ErrorI
- func (t *Indexer) IndexDoubleSigner(address []byte, height uint64) lib.ErrorI
- func (t *Indexer) IndexQC(qc *lib.QuorumCertificate) lib.ErrorI
- func (t *Indexer) IndexTx(result *lib.TxResult) lib.ErrorI
- func (t *Indexer) IsValidDoubleSigner(address []byte, height uint64) (bool, lib.ErrorI)
- type NodeList
- type OpData
- type SMT
- func (s *SMT) Commit(unsortedOps map[uint64]valueOp) (err lib.ErrorI)
- func (s *SMT) CommitParallel(unsortedOps map[uint64]valueOp) (err lib.ErrorI)
- func (s *SMT) GetMerkleProof(k []byte) ([]*lib.Node, lib.ErrorI)
- func (s *SMT) Root() []byte
- func (s *SMT) VerifyProof(k []byte, v []byte, validateMembership bool, root []byte, proof []*lib.Node) (bool, lib.ErrorI)
- type Store
- func (s *Store) Close() lib.ErrorI
- func (s *Store) Commit() (root []byte, err lib.ErrorI)
- func (s *Store) Compact(version uint64, compactHSS bool) lib.ErrorI
- func (s *Store) Copy() (lib.StoreI, lib.ErrorI)
- func (s *Store) DB() *pebble.DB
- func (s *Store) Delete(k []byte) lib.ErrorI
- func (s *Store) Discard()
- func (s *Store) Flush() lib.ErrorI
- func (s *Store) Get(key []byte) ([]byte, lib.ErrorI)
- func (s *Store) GetProof(key []byte) ([]*lib.Node, lib.ErrorI)
- func (s *Store) IncreaseVersion()
- func (s *Store) Iterator(p []byte) (lib.IteratorI, lib.ErrorI)
- func (s *Store) MaybeCompact()
- func (s *Store) NewReadOnly(queryVersion uint64) (lib.StoreI, lib.ErrorI)
- func (s *Store) NewTxn() lib.StoreI
- func (s *Store) Reset()
- func (s *Store) RevIterator(p []byte) (lib.IteratorI, lib.ErrorI)
- func (s *Store) Root() (root []byte, err lib.ErrorI)
- func (s *Store) Set(k, v []byte) lib.ErrorI
- func (s *Store) VerifyProof(key, value []byte, validateMembership bool, root []byte, proof []*lib.Node) (bool, lib.ErrorI)
- func (s *Store) Version() uint64
- type Txn
- func (t *Txn) ArchiveIterator(prefix []byte) (lib.IteratorI, lib.ErrorI)
- func (t *Txn) Cancel()
- func (t *Txn) Close() lib.ErrorI
- func (t *Txn) Commit() (err lib.ErrorI)
- func (t *Txn) Copy(reader TxnReaderI, writer TxnWriterI) *Txn
- func (t *Txn) Delete(key []byte) lib.ErrorI
- func (t *Txn) DeleteAt(key []byte, version uint64) lib.ErrorI
- func (t *Txn) Discard()
- func (t *Txn) Get(key []byte) ([]byte, lib.ErrorI)
- func (t *Txn) Iterator(prefix []byte) (lib.IteratorI, lib.ErrorI)
- func (t *Txn) NewIterator(prefix []byte, reverse bool, seek bool) (lib.IteratorI, lib.ErrorI)
- func (t *Txn) RevIterator(prefix []byte) (lib.IteratorI, lib.ErrorI)
- func (t *Txn) Set(key, value []byte) lib.ErrorI
- func (t *Txn) SetAt(key, value []byte, version uint64) lib.ErrorI
- type TxnIterator
- type TxnReaderI
- type TxnWriterI
- type VersionedIterator
- type VersionedStore
- func (vs *VersionedStore) ArchiveIterator(prefix []byte) (lib.IteratorI, lib.ErrorI)
- func (vs *VersionedStore) Close() lib.ErrorI
- func (vs *VersionedStore) Commit() (e lib.ErrorI)
- func (vs *VersionedStore) Delete(key []byte) (err lib.ErrorI)
- func (vs *VersionedStore) DeleteAt(key []byte, version uint64) (err lib.ErrorI)
- func (vs *VersionedStore) Get(key []byte) ([]byte, lib.ErrorI)
- func (vs *VersionedStore) Iterator(prefix []byte) (lib.IteratorI, lib.ErrorI)
- func (vs *VersionedStore) NewIterator(prefix []byte, reverse bool, seek bool) (lib.IteratorI, lib.ErrorI)
- func (vs *VersionedStore) RevIterator(prefix []byte) (lib.IteratorI, lib.ErrorI)
- func (vs *VersionedStore) Set(key, value []byte) (err lib.ErrorI)
- func (vs *VersionedStore) SetAt(key, value []byte, version uint64) (err lib.ErrorI)
Constants ¶
const ( MaxKeyBitLength = 160 // the maximum leaf key bits (20 bytes) MaxCacheSize = 1_000_000 // Child position constants LeftChild = 0 RightChild = 1 // parallelization parameters NumSubtrees = 8 SubtreePrefixBits = 3 // log2(NumSubtrees) )
const ( VersionSize = 8 DeadTombstone = byte(1) AliveTombstone = byte(0) )
Performance properties from this layout:
- Single-range prefix scans at any depth.
- Fast skipping of all versions of a user key (SeekGE with 0xFF fill or SeekLT).
- Block property filtering on version ranges.
- Inverted version ordering for latest-first retrieval per key.
Variables ¶
var (
RootKey = []byte{
0x7F, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255,
}
)
RootKey() value is arbitrary, but it happens to be right in the middle of Min and Max Hash for abstract cleanliness
Functions ¶
func ErrCloseDB ¶
func ErrCommitDB ¶
func ErrFlushBatch ¶
func ErrGarbageCollectDB ¶
func ErrIndexBlock ¶
func ErrInvalidKey ¶
func ErrInvalidMerkleTree ¶
func ErrReadBytes ¶
func ErrReserveKeyWrite ¶
func ErrSetEntry ¶
func ErrStoreDelete ¶
func ErrStoreGet ¶
func ErrStoreSet ¶
Types ¶
type BTreeIterator ¶
type BTreeIterator struct {
// contains filtered or unexported fields
}
BTreeIterator provides external iteration over a btree
func NewBTreeIterator ¶
func NewBTreeIterator(tree *btree.BTreeG[*CacheItem], start *CacheItem, reverse bool) (bt *BTreeIterator)
NewBTreeIterator() creates a new iterator starting at the closest item to the given key
func (*BTreeIterator) Current ¶
func (bi *BTreeIterator) Current() *CacheItem
Current() returns the current item in the iteration
func (*BTreeIterator) HasNext ¶
func (bi *BTreeIterator) HasNext() bool
HasNext() returns true if there are more items after current
func (*BTreeIterator) HasPrev ¶
func (bi *BTreeIterator) HasPrev() bool
HasPrev() returns true if there are items before current
func (*BTreeIterator) Move ¶
func (bi *BTreeIterator) Move(item *CacheItem)
Move() moves the iterator to the given key or the closest item if the key is not found
func (*BTreeIterator) Next ¶
func (bi *BTreeIterator) Next() *CacheItem
Next() advances to the next item in the tree
func (*BTreeIterator) Prev ¶
func (bi *BTreeIterator) Prev() *CacheItem
Prev() back towards the previous item in the tree
type Indexer ¶
type Indexer struct {
// contains filtered or unexported fields
}
Indexer: the part of the DB that stores transactions, blocks, and quorum certificates
func (*Indexer) DeleteBlockForHeight ¶
DeleteBlockForHeight() deletes the block & transaction data for a certain height
func (*Indexer) DeleteQCForHeight ¶
DeleteQCForHeight() deletes the Quorum Certificate by height
func (*Indexer) DeleteTxsForHeight ¶
DeleteTxsForHeight() deletes the transaction object for a specific height
func (*Indexer) GetAllCheckpoints ¶
GetAllCheckpoints() exports all 'checkpoint block hashes' for a committee chain this is for the 'checkpointing as a service' long-range-attack prevention
func (*Indexer) GetBlockByHash ¶
GetBlockByHash() returns the block result object from the hash key
func (*Indexer) GetBlockByHeight ¶
GetBlockByHeight() returns the block result by height key
func (*Indexer) GetBlockHeaderByHeight ¶
GetBlockHeaderByHeight() returns the block result without transactions
func (*Indexer) GetCheckpoint ¶
GetCheckpoint() retrieves a 'checkpoint block hash' for a committee chain at a certain height this is for the 'checkpointing as a service' long-range-attack prevention
func (*Indexer) GetDoubleSigners ¶
func (t *Indexer) GetDoubleSigners() (ds []*lib.DoubleSigner, err lib.ErrorI)
GetDoubleSigners() gets all double signers saved in the indexer IMPORTANT NOTE: this returns double signers in the form of <address> -> <heights> NOT <public_key> -> <heights>
func (*Indexer) GetMostRecentCheckpoint ¶
func (t *Indexer) GetMostRecentCheckpoint(chainId uint64) (checkpoint *lib.Checkpoint, err lib.ErrorI)
GetMostRecentCheckpoint() retrieves a 'checkpoint block hash' for a committee chain at the most recent height this is for the 'checkpointing as a service' long-range-attack prevention
func (*Indexer) GetQCByHeight ¶
GetQCByHeight() returns the quorum certificate by height key
func (*Indexer) GetTxByHash ¶
GetTxByHash() returns the tx by hash
func (*Indexer) GetTxsByHeight ¶
func (t *Indexer) GetTxsByHeight(height uint64, newestToOldest bool, p lib.PageParams) (*lib.Page, lib.ErrorI)
GetTxsByHeight() returns a page of transactions for a height
func (*Indexer) GetTxsByHeightNonPaginated ¶
func (t *Indexer) GetTxsByHeightNonPaginated(height uint64, newestToOldest bool) ([]*lib.TxResult, lib.ErrorI)
GetTxsByHeightNonPaginated() returns a slice of transactions ordered by index for a height
func (*Indexer) GetTxsByRecipient ¶
func (t *Indexer) GetTxsByRecipient(address crypto.AddressI, newestToOldest bool, p lib.PageParams) (*lib.Page, lib.ErrorI)
GetTxsByRecipient() returns a slice of transactions ordered by height and index for a recipient
func (*Indexer) GetTxsBySender ¶
func (t *Indexer) GetTxsBySender(address crypto.AddressI, newestToOldest bool, p lib.PageParams) (*lib.Page, lib.ErrorI)
GetTxsBySender() returns a slice of transactions ordered by height and index for a sender
func (*Indexer) IndexBlock ¶
func (t *Indexer) IndexBlock(b *lib.BlockResult) lib.ErrorI
IndexBlock() turns the block into bytes, indexes the block by hash and height and then indexes the transactions
func (*Indexer) IndexCheckpoint ¶
IndexCheckpoint() indexes a 'checkpoint block hash' for a committee chain at a certain height this is for the 'checkpointing as a service' long-range-attack prevention
func (*Indexer) IndexDoubleSigner ¶
IndexDoubleSigner() indexes the double signer by a height
func (*Indexer) IndexQC ¶
func (t *Indexer) IndexQC(qc *lib.QuorumCertificate) lib.ErrorI
IndexQC() indexes the quorum certificate by height
type NodeList ¶
type NodeList struct {
Nodes []*node
}
NodeList defines a list of nodes, used for traversal
func (*NodeList) GrandParent ¶
func (n *NodeList) GrandParent() *node
GrandParent() returns the grandparent of the last node traversed (current)
type OpData ¶
type OpData struct {
// contains filtered or unexported fields
}
OpData: data for each operation (set, delete)
type SMT ¶
type SMT struct {
// OpData: data for each operation
OpData
// contains filtered or unexported fields
}
func NewDefaultSMT ¶
NewDefaultSMT() creates a new abstraction fo the SMT object using default parameters
func (*SMT) Commit ¶
Commit() DEPRECATED: executes deferred operations in order (left-to-right), minimizing the amount of traversals, IOPS, and hash operations over the master tree this is the sequential alternative to 'commit parallel'
func (*SMT) CommitParallel ¶
CommitParallel(): sorts the operations in 8 subtree threads, executes those threads in parallel and combines them into the master tree
func (*SMT) GetMerkleProof ¶
GetMerkleProof() returns the merkle proof-of-membership for a given key if it exists, and the proof of non-membership otherwise
func (*SMT) VerifyProof ¶
func (s *SMT) VerifyProof(k []byte, v []byte, validateMembership bool, root []byte, proof []*lib.Node) (bool, lib.ErrorI)
VerifyProof verifies a Sparse Merkle Tree proof for a given value reconstructing the root hash and comparing it against the provided root hash depending on the proof type (membership or non-membership)
type Store ¶
type Store struct {
*Indexer // reference to the indexer store
// contains filtered or unexported fields
}
func NewStoreWithDB ¶
func NewStoreWithDB(config lib.Config, db *pebble.DB, metrics *lib.Metrics, log lib.LoggerI) (*Store, lib.ErrorI)
NewStoreWithDB() returns a Store object given a DB and a logger NOTE: to read the state commit store i.e. for merkle proofs, use NewReadOnly()
func (*Store) Compact ¶
Compact deletes all entries marked for compaction on the given prefix range. it iterates over the prefix, deletes tombstone entries, and performs DB compaction
func (*Store) Copy ¶
Copy() make a copy of the store with a new read/write transaction this can be useful for having two simultaneous copies of the store ex: Mempool state and FSM state
func (*Store) DB ¶
DB() returns the underlying PebbleDB instance associated with the Store, providing access to the database for direct operations and management.
func (*Store) Delete ¶
Delete() removes the key-value pair from both the LatestStateStore, HistoricalStateStore, and CommitStore
func (*Store) Flush ¶
Flush() writes the current state to the batch writer without actually committing it
func (*Store) GetProof ¶
GetProof() uses the StateCommitStore to prove membership and non-membership
func (*Store) IncreaseVersion ¶
func (s *Store) IncreaseVersion()
IncreaseVersion increases the version number of the store without committing any data
func (*Store) Iterator ¶
Iterator() returns an object for scanning the StateStore starting from the provided prefix. The iterator allows forward traversal of key-value pairs that match the prefix.
func (*Store) MaybeCompact ¶
func (s *Store) MaybeCompact()
MaybeCompact() checks if it is time to compact the LSS and HSS respectively
func (*Store) NewReadOnly ¶
NewReadOnly() returns a store without a writer - meant for historical read only queries CONTRACT: Read only stores cannot be copied or written to
func (*Store) NewTxn ¶
NewTxn() creates and returns a new transaction for the Store, allowing atomic operations on the StateStore, StateCommitStore, Indexer, and CommitIDStore.
func (*Store) RevIterator ¶
RevIterator() returns an object for scanning the StateStore starting from the provided prefix. The iterator allows backward traversal of key-value pairs that match the prefix.
func (*Store) Root ¶
Root() retrieves the root hash of the StateCommitStore, representing the current root of the Sparse Merkle Tree. This hash is used for verifying the integrity and consistency of the state.
func (*Store) Set ¶
Set() sets the value bytes blob in the LatestStateStore and the HistoricalStateStore as well as the value hash in the StateCommitStore referenced by the 'key' and hash('key') respectively
func (*Store) VerifyProof ¶
func (s *Store) VerifyProof(key, value []byte, validateMembership bool, root []byte, proof []*lib.Node) (bool, lib.ErrorI)
VerifyProof() checks the validity of a member or non-member proof from the StateCommitStore by verifying the proof against the provided key, value, and proof data.
type Txn ¶
type Txn struct {
// contains filtered or unexported fields
}
Txn is an in memory database transaction
func NewTxn ¶
func NewTxn(reader TxnReaderI, writer TxnWriterI, prefix []byte, state, sort, seek bool, version ...uint64) *Txn
TODO: New Txn has a lot of options, refactor the constructor to use the options pattern NewTxn() creates a new instance of Txn with the specified reader and writer
func (*Txn) ArchiveIterator ¶
ArchiveIterator() creates a new iterator for all versions under the given prefix in the BadgerDB transaction
func (*Txn) Cancel ¶
func (t *Txn) Cancel()
Closes() Closes the writer. Any new writes will result in error and possibly panic depending on the implementation.
func (*Txn) Close ¶
Close() cancels the current transaction. Any new writes will result in an error and a new WriteBatch() must be created to write new entries.
func (*Txn) Commit ¶
Commit() commits the in-memory operations to the batch writer and clears in-memory changes
func (*Txn) Copy ¶
func (t *Txn) Copy(reader TxnReaderI, writer TxnWriterI) *Txn
Copy creates a new Txn with the same configuration and txn as the original
func (*Txn) DeleteAt ¶
DeleteAt() marks a key for deletion in the txn operations with a specific version
func (*Txn) Discard ¶
func (t *Txn) Discard()
Discard() clears all in-memory operations and resets the sorted key list
func (*Txn) Get ¶
Get() retrieves the value for a given key from either the txn operations or the reader store
func (*Txn) Iterator ¶
Iterator() returns a new iterator for merged iteration of both the in-memory operations and parent store with the given prefix
func (*Txn) NewIterator ¶
NewIterator() creates a merged iterator with the reader and writer
func (*Txn) RevIterator ¶
RevIterator() returns a new reverse iterator for merged iteration of both the in-memory operations and parent store with the given prefix
type TxnIterator ¶
type TxnIterator struct {
// contains filtered or unexported fields
}
TxnIterator is a reversible, merged iterator of the parent and the in-memory operations
func (*TxnIterator) First ¶
func (ti *TxnIterator) First() *TxnIterator
First() positions the iterator at the first valid entry based on the traversal direction
func (*TxnIterator) Key ¶
func (ti *TxnIterator) Key() []byte
Key() returns the current key from either the in-memory operations or the parent store
func (*TxnIterator) Next ¶
func (ti *TxnIterator) Next()
Next() advances the iterator to the next entry, choosing between in-memory and parent store entries
func (*TxnIterator) Valid ¶
func (ti *TxnIterator) Valid() bool
Valid() checks if the current position of the iterator is valid, considering both the parent and in-memory entries
func (*TxnIterator) Value ¶
func (ti *TxnIterator) Value() []byte
Value() returns the current value from either the in-memory operations or the parent store
type TxnReaderI ¶
type TxnReaderI interface {
Get(key []byte) ([]byte, lib.ErrorI)
NewIterator(prefix []byte, reverse bool, seek bool) (lib.IteratorI, lib.ErrorI)
Close() lib.ErrorI
}
TxReaderI() defines the interface to read a TxnTransaction Txn implements this itself to allow for nested transactions
type TxnWriterI ¶
type TxnWriterI interface {
SetAt(key, value []byte, version uint64) lib.ErrorI
DeleteAt(key []byte, version uint64) lib.ErrorI
Commit() lib.ErrorI
Close() lib.ErrorI
}
TxnWriterI() defines the interface to write a TxnTransaction Txn implements this itself to allow for nested transactions
type VersionedIterator ¶
type VersionedIterator struct {
// contains filtered or unexported fields
}
VersionedIterator implements iteration with single-pass key deduplication
func (*VersionedIterator) Key ¶
func (vi *VersionedIterator) Key() []byte
Key() returns the current key (without version/tombstone suffix)
func (*VersionedIterator) Next ¶
func (vi *VersionedIterator) Next()
Next() advances the iterator to the next entry
func (*VersionedIterator) Valid ¶
func (vi *VersionedIterator) Valid() bool
Valid returns true if the iterator is positioned at a valid entry
func (*VersionedIterator) Value ¶
func (vi *VersionedIterator) Value() []byte
Value() returns the current value
type VersionedStore ¶
type VersionedStore struct {
// contains filtered or unexported fields
}
VersionedStore uses inverted version encoding and reverse seeks for maximum performance
func NewVersionedStore ¶
NewVersionedStore creates a new versioned store
func (*VersionedStore) ArchiveIterator ¶
ArchiveIterator returns an iterator for all keys with the given prefix TODO: Currently not working, VersionedIterator must be modified to support archive iteration
func (*VersionedStore) Close ¶
func (vs *VersionedStore) Close() lib.ErrorI
Close closes the store and releases resources
func (*VersionedStore) Commit ¶
func (vs *VersionedStore) Commit() (e lib.ErrorI)
Commit commits the batch to the database
func (*VersionedStore) Delete ¶
func (vs *VersionedStore) Delete(key []byte) (err lib.ErrorI)
Delete() marks a key as deleted at the current version
func (*VersionedStore) DeleteAt ¶
func (vs *VersionedStore) DeleteAt(key []byte, version uint64) (err lib.ErrorI)
DeleteAt() marks a key as deleted at the given version
func (*VersionedStore) Get ¶
func (vs *VersionedStore) Get(key []byte) ([]byte, lib.ErrorI)
Get() retrieves the latest version of a key at or before vs.version
func (*VersionedStore) NewIterator ¶
func (vs *VersionedStore) NewIterator(prefix []byte, reverse bool, seek bool) (lib.IteratorI, lib.ErrorI)
NewIterator is a wrapper around the underlying iterators to conform to the TxnReaderI interface
func (*VersionedStore) RevIterator ¶
RevIterator returns a reverse iterator for all keys with the given prefix