70 lines
2.5 KiB
Markdown
70 lines
2.5 KiB
Markdown
|
|
## Storage
|
|
|
|
### MultiStore
|
|
|
|
MultiStore is like a root filesystem of an operating system, except
|
|
all the entries are fully Merkleized. You mount onto a MultiStore
|
|
any number of Stores. Currently only KVStores are supported, but in
|
|
the future we may support more kinds of stores, such as a HeapStore
|
|
or a NDStore for multidimensional storage.
|
|
|
|
The MultiStore as well as all mounted stores provide caching (aka
|
|
cache-wrapping) for intermediate state (aka software transactional
|
|
memory) during the execution of transactions. In the case of the
|
|
KVStore, this also works for iterators. For example, after running
|
|
the app's AnteHandler, the MultiStore is cache-wrapped (and each
|
|
store is also cache-wrapped) so that should processing of the
|
|
transaction fail, at least the transaction fees are paid and
|
|
sequence incremented.
|
|
|
|
The MultiStore as well as all stores support (or will support)
|
|
historical state pruning and snapshotting and various kinds of
|
|
queries with proofs.
|
|
|
|
### KVStore
|
|
|
|
Here we'll focus on the IAVLStore, which is a kind of KVStore.
|
|
|
|
IAVLStore is a fast balanced dynamic Merkle store that also supports
|
|
iteration, and of course cache-wrapping, state pruning, and various
|
|
queries with proofs, such as proofs of existence, absence, range,
|
|
and so on.
|
|
|
|
Here's how you mount them to a MultiStore.
|
|
|
|
```go
|
|
mainDB, catDB := dbm.NewMemDB(), dbm.NewMemDB()
|
|
fooKey := sdk.NewKVStoreKey("foo")
|
|
barKey := sdk.NewKVStoreKey("bar")
|
|
catKey := sdk.NewKVStoreKey("cat")
|
|
ms := NewCommitMultiStore(mainDB)
|
|
ms.MountStoreWithDB(fooKey, sdk.StoreTypeIAVL, nil)
|
|
ms.MountStoreWithDB(barKey, sdk.StoreTypeIAVL, nil)
|
|
ms.MountStoreWithDB(catKey, sdk.StoreTypeIAVL, catDB)
|
|
```
|
|
|
|
In the example above, all IAVL nodes (inner and leaf) will be stored
|
|
in mainDB with the prefix of "s/k:foo/" and "s/k:bar/" respectively,
|
|
thus sharing the mainDB. All IAVL nodes (inner and leaf) for the
|
|
cat KVStore are stored separately in catDB with the prefix of
|
|
"s/\_/". The "s/k:KEY/" and "s/\_/" prefixes are there to
|
|
disambiguate store items from other items of non-storage concern.
|
|
|
|
|
|
|
|
##
|
|
|
|
Mounting an IAVLStore
|
|
TODO:
|
|
|
|
IAVLStore: Fast balanced dynamic Merkle store.
|
|
supports iteration.
|
|
MultiStore: multiple Merkle tree backends in a single store
|
|
allows using Ethereum Patricia Trie and Tendermint IAVL in same app
|
|
Provide caching for intermediate state during execution of blocks and
|
|
transactions (including for iteration)
|
|
Historical state pruning and snapshotting.
|
|
Query proofs (existence, absence, range, etc.) on current and retained
|
|
historical state.
|