Documentation ¶
Overview ¶
Package snapshot implements a journalled, dynamic state dump.
Index ¶
- Variables
- func FullAccountRLP(data []byte) ([]byte, error)
- func SlimAccountRLP(nonce uint64, balance *big.Int, root common.Hash, codehash []byte) []byte
- type Account
- type AccountIterator
- type Iterator
- type Snapshot
- type StorageIterator
- type Tree
- func (t *Tree) AccountIterator(root common.Hash, seek common.Hash) (AccountIterator, error)
- func (t *Tree) Disable()
- func (t *Tree) DiskRoot() common.Hash
- func (t *Tree) Journal(root common.Hash) (common.Hash, error)
- func (t *Tree) Snapshot(blockRoot common.Hash) Snapshot
- func (t *Tree) Snapshots(root common.Hash, limits int, nodisk bool) []Snapshot
- func (t *Tree) StorageIterator(root common.Hash, account common.Hash, seek common.Hash) (StorageIterator, error)
- func (t *Tree) Update(blockRoot common.Hash, parentRoot common.Hash, ...) error
- func (t *Tree) Verify(root common.Hash) error
Constants ¶
This section is empty.
Variables ¶
var ( // ErrSnapshotStale is returned from data accessors if the underlying snapshot // layer had been invalidated due to the chain progressing forward far enough // to not maintain the layer's original state. ErrSnapshotStale = errors.New("snapshot stale") // ErrNotCoveredYet is returned from data accessors if the underlying snapshot // is being generated currently and the requested data item is not yet in the // range of accounts covered. ErrNotCoveredYet = errors.New("not covered yet") // ErrNotConstructed is returned if the callers want to iterate the snapshot // while the generation is not finished yet. ErrNotConstructed = errors.New("snapshot is not constructed") )
Functions ¶
func FullAccountRLP ¶
FullAccountRLP converts data on the 'slim RLP' format into the full RLP-format.
Types ¶
type Account ¶
Account is a modified version of a state.Account, where the root is replaced with a byte slice. This format can be used to represent full-consensus format or slim-snapshot format which replaces the empty root and code hash as nil byte slice.
func FullAccount ¶
FullAccount decodes the data on the 'slim RLP' format and return the consensus format account.
type AccountIterator ¶
type AccountIterator interface { Iterator // Account returns the RLP encoded slim account the iterator is currently at. // An error will be returned if the iterator becomes invalid Account() []byte }
AccountIterator is an iterator to step over all the accounts in a snapshot, which may or may not be composed of multiple layers.
type Iterator ¶
type Iterator interface { // Next steps the iterator forward one element, returning false if exhausted, // or an error if iteration failed for some reason (e.g. root being iterated // becomes stale and garbage collected). Next() bool // Error returns any failure that occurred during iteration, which might have // caused a premature iteration exit (e.g. snapshot stack becoming stale). Error() error // Hash returns the hash of the account or storage slot the iterator is // currently at. Hash() common.Hash // Release releases associated resources. Release should always succeed and // can be called multiple times without causing error. Release() }
Iterator is an iterator to step over all the accounts or the specific storage in a snapshot which may or may not be composed of multiple layers.
type Snapshot ¶
type Snapshot interface { // Root returns the root hash for which this snapshot was made. Root() common.Hash // Account directly retrieves the account associated with a particular hash in // the snapshot slim data format. Account(hash common.Hash) (*Account, error) // AccountRLP directly retrieves the account RLP associated with a particular // hash in the snapshot slim data format. AccountRLP(hash common.Hash) ([]byte, error) // Storage directly retrieves the storage data associated with a particular hash, // within a particular account. Storage(accountHash, storageHash common.Hash) ([]byte, error) }
Snapshot represents the functionality supported by a snapshot storage layer.
type StorageIterator ¶
type StorageIterator interface { Iterator // Slot returns the storage slot the iterator is currently at. An error will // be returned if the iterator becomes invalid Slot() []byte }
StorageIterator is an iterator to step over the specific storage in a snapshot, which may or may not be composed of multiple layers.
type Tree ¶
type Tree struct {
// contains filtered or unexported fields
}
Tree is an Ethereum state snapshot tree. It consists of one persistent base layer backed by a key-value store, on top of which arbitrarily many in-memory diff layers are topped. The memory diffs can form a tree with branching, but the disk layer is singleton and common to all. If a reorg goes deeper than the disk layer, everything needs to be deleted.
The goal of a state snapshot is twofold: to allow direct access to account and storage data to avoid expensive multi-level trie lookups; and to allow sorted, cheap iteration of the account/storage tries for sync aid.
func (*Tree) AccountIterator ¶
AccountIterator creates a new account iterator for the specified root hash and seeks to a starting account hash.
func (*Tree) Disable ¶
func (t *Tree) Disable()
Disable interrupts any pending snapshot generator, deletes all the snapshot layers in memory and marks snapshots disabled globally. In order to resume the snapshot functionality, the caller must invoke Rebuild.
func (*Tree) Journal ¶
Journal commits an entire diff hierarchy to disk into a single journal entry. This is meant to be used during shutdown to persist the snapshot without flattening everything down (bad for reorgs).
The method returns the root hash of the base layer that needs to be persisted to disk as a trie too to allow continuing any pending generation op.
func (*Tree) Snapshot ¶
Snapshot retrieves a snapshot belonging to the given block root, or nil if no snapshot is maintained for that block.
func (*Tree) Snapshots ¶
Snapshots returns all visited layers from the topmost layer with specific root and traverses downward. The layer amount is limited by the given number. If nodisk is set, then disk layer is excluded.
func (*Tree) StorageIterator ¶
func (t *Tree) StorageIterator(root common.Hash, account common.Hash, seek common.Hash) (StorageIterator, error)
StorageIterator creates a new storage iterator for the specified root hash and account. The iterator will be move to the specific start position.
func (*Tree) Update ¶
func (t *Tree) Update(blockRoot common.Hash, parentRoot common.Hash, destructs map[common.Hash]struct{}, accounts map[common.Hash][]byte, storage map[common.Hash]map[common.Hash][]byte) error
Update adds a new snapshot into the tree, if that can be linked to an existing old parent. It is disallowed to insert a disk layer (the origin of all).