1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/kt10-VSDB

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 9.2 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 27.11.2024 00:58 4f22973

VSDB

VSDB — это «Git» в виде KV-базы данных.

Благодаря мощным функциям контроля версий VSDB вы можете легко добавить в свою структуру данных возможность управления версиями.

Сделайте всё версионным!

Чтобы просмотреть журнал изменений, перейдите сюда.

Основные моменты

  • Поддержка Git-подобных операций с версиями, таких как:
    • создание бесконечного количества веток и их объединение с родительскими;
    • откат ветки к определённой исторической версии;
    • запрос исторического значения ключа на указанной ветке.
  • Большинство API похожи на соответствующие структуры данных в стандартной библиотеке:
    • используйте Vecx так же, как Vec;
    • используйте Mapx так же, как HashMap;
    • используйте MapxOrd так же, как BTreeMap.
  • ...

Практические сценарии

  • Обработка CheckTx, DeliverTx, Commit... в Tendermint ABCI.
  • Управление ветвями цепочек, например:
    • обработка «ветвей цепочки» или «блоков дяди» при недетерминированном консенсусе, таком как POW;
    • управление временными «ветвями цепочки» в гибридном консенсусе вроде Babe + Grandpa (substrate).
  • Поддержка некоторых специальных API ETH Web3 в форме пробного запуска.
  • ...

Примеры

Предположим, у вас есть отличный алгоритм:

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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/kt10-VSDB.git
git@api.gitlife.ru:oschina-mirror/kt10-VSDB.git
oschina-mirror
kt10-VSDB
kt10-VSDB
master