VSDB — это «Git» в виде KV-базы данных.
Благодаря мощным функциям контроля версий VSDB вы можете легко добавить в свою структуру данных возможность управления версиями.
Сделайте всё версионным!
Чтобы просмотреть журнал изменений, перейдите сюда.
Vecx
так же, как Vec
;Mapx
так же, как HashMap
;MapxOrd
так же, как BTreeMap
.CheckTx
, DeliverTx
, Commit
... в Tendermint ABCI.Предположим, у вас есть отличный алгоритм:
struct GreatAlgo {
a: Vec<...>,
b: BTreeMap<...>,
c: u128,
d: HashMap<...>,
e: ...
}
Просто замените исходную структуру соответствующей структурой данных VSDB, и ваш алгоритм сразу получит мощные возможности контроля версий!
#[dervive(Vs, Default)]
struct GreatAlgo {
a: VecxVs<...>,
b: MapxOrdVs<...>,
c: OrphanVs<u128>,
d: MapxVs<...>,
e: ...
}
let algo = GreatAlgo::default();
algo.get_by_branch_version(...);
algo.branch_create(...);
algo.branch_create_by_base_branch(...);
algo.branch_create_by_base_branch_version(...);
algo.branch_remove(...);
algo.version_pop(...);
algo.prune();
Примечание:
макрос #[derive(Vs)]
можно применять к структурам, внутренние поля которых являются типами, определёнными в VSDB (поддерживаются примитивные типы и их коллекции), но нельзя применять к вложенным оболочкам среди типов VSDB. Мы рекомендуем вам использовать многоключевые API (src/versioned_multi_key
), если вам действительно нужны эти функции (также улучшенная производительность), или вам придётся вручную реализовать трейт VsMgmt
.
Эта структура данных может быть правильно обработана с помощью #[derive(Vs)]
:
#[derive(Vs)]
struct GoodCase<K, T> {
a: VecxVs<i64>,
b: SubItem0,
c: SubItem1,
d: SubItem2,
e: u8,
f: Vec<i16>,
g: VecDeque<i64>,
h: BTreeSet<u16>,
i: HashMap<K, AtomicU64>,
j: HashSet<i32>,
k: LinkedList<()>,
l: Box<dyn AsRef<bool>,
m: Box<dyn AsRef<[Vec<u128>]>>,
n: PhantomData<T>,
}
#[derive(Vs)]
struct SubItem0(MapxVs<u8, u8>, VecxVs<u8>);
#[derive(Vs)]
struct SubItem1 {
a: OrphanVs<i16>,
b: MapxOrdVs<String, u8>
}
#[derive(Vs)]
struct SubItem2 {
a: i8,
b: u128
}
// // Неудачная реализация VsMgmt для пользовательских типов без состояния.
// // Реализация `#[derive(Vs)]` для 'SubItem2' такая же, как эта.
// impl VsMgmt for SubItem2 {
// impl_vs_methods_nope!();
// }
Но эту структуру нельзя правильно обработать с помощью #[derive(Vs)]
:
// Это можно скомпилировать, но результат будет неправильным!
// Версионные методы внутреннего 'MapxVs<u8, u8>' будут отсутствовать.
// Мы рекомендуем вам использовать многоключевые API VSDB или
// вам придётся вручную реализовывать трейт 'VsMgmt'. #[derive(Vs)]
struct BadCase {
a: VecxVs<MapxVs<u8, u8>>,
}
Пожалуйста, проверьте **многоключевые функции** (src/versioned_multi_key), если у вас есть требования к вышеуказанным или подобным сценариям.
Некоторые полные примеры:
- Версионированные примеры:
- **Простой блокчейн** (examples/blockchain_state.rs)
- **Операции по одной** (src/versioned/mapx_raw/test.rs)
- Невёрсионированные примеры:
- **Простой веб-сервер** (examples/web_server.rs)
- **Операции по одной** (src/basic/mapx/test.rs)
### Особенности компиляции
- [ **DEFAULT** ] `rocks_backend`, используйте `rocksdb` в качестве серверной базы данных
- Стабильный
- Реализация на C++, трудно скомпилировать в статический двоичный файл
- `parity_backend`, используйте `parity-db` в качестве серверной базы данных
- Экспериментальный
- Чистая реализация на Rust, можно легко скомпилировать в статический двоичный файл
- `bcs_codec`, используйте `bcs` в качестве кодека
- Более высокая скорость работы, чем у json
- Усиление безопасности для сценариев блокчейна
- Создан оригинальным проектом «Libre» от Facebook
- `msgpack_codec`, используйте `rmp-serde` в качестве кодека
- Более высокая скорость работы, чем у json
- `json_codec`, используйте `serde_json` в качестве кодека
- Лучшая универсальность и совместимость
- `compress`, включите сжатие в серверной базе данных
- `extra_types`, реализуйте `VsMgmt` для некоторых распространённых дополнительных типов
- Например: `H256` и `H160` из ящика `primitive-types`
- `vs`, включите все версионированные API и процедурный макрос `Vs`
### Примечание
- Сериализованный результат экземпляра VSDB нельзя использовать в качестве основы для распределённого консенсуса
- Сериализованный результат содержит только некоторую метаинформацию (пути хранения и т. д.)
- Эта метаинформация, вероятно, будет отличаться в разных средах
- Правильный способ — прочитать то, что вам нужно, а затем обработать реальное содержимое
- Имена версий должны быть глобально уникальными
- Использование одного и того же имени версии в разных ветках также не допускается
- Низкоуровневое выражение «не существует» в `MapxRawVs` и `MapxRawMkVs` было изменено с `None` на `[]` начиная с версии v0.42.0
- Если вы присвоите пустое значение ( `[u8;0]`, `&[]` ...) ключу, ключ будет рассматриваться как «удалённый»
- Примечание: эти «пустые» значения могут быть установлены как обычные значения в других экземплярах, кроме этих двух!
### ЛИЦЕНЗИЯ
- [**MIT**](https://choosealicense.com/licenses/mit) для версии 0.40 и более ранних
- [**GPL-3.0**](../LICENSE) для версии 0.41 и более поздних
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )