55 lines
2.0 KiB
Markdown
55 lines
2.0 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.
|
||
|
|
||
|
|