Chain gdb

Материал из wiki.cellframe.net
Перейти к навигации Перейти к поиску

Chain could be only wrap around part of GDB storage, without consistent guarantee and ever without consensus at all. Its the fastest way to store ledger and designed for private ledgers store where there is no needs to protect the system from spam data but there is needing to provide top performance.

Every datum stored in Chain GDB is laying in special GDB section, specfied for the chain. Could be also used different backends for different chains for example SQL or No-SQL databases to have compatibility with classic non-chain software thats important for Enterprise


Процесс синхронизации gdb

Инициатор синхронизации отправляет запрос DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB с параметрами net_id, chain_id, cell_id и своим адресом node_addr. Ответная сторона получает этот запрос и по адресу ноды первой стороны определяет, сколько ещё осталось передать данных для этой ноды.
Если есть что передавать, то в ответ отправляет первый пакет DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB с параметрами net_id, chain_id и cell_id.
И затем пакеты DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB с транзакциями. В каждом пакете одна транзакция.
Если нечего - то сразу DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB.
При получении транзакции первой стороной ищем её в текущей global_db по ключу key.
Если транзакция в этой же группе с этим же ключём уже есть в базе, то:
Если это транзакция удаления, то удаляем её. Если это транзакция добавления, то дополнительно сравниваем её содержимое с содержимым принятой транзакции. Если транзакции одинаковые, то ничего не делаем, если отличаются, то смотрим чей timestamp больше, ту транзакцию и оставляем.

Если транзакции ещё нет в базе, то:
Если это транзакция удаления, то ничего не делаем.
Если это транзакция добавления, то добавляем её в базу.

В качестве последнего пакета отправляется пакет DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB, завершающий передачу данных. Первая сторона при этом DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB

Итого, краткая таблица:

 -> DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB (1 шт.)
 если есть данные
   <- DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB (1 шт.)
   <- DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB (N шт.)
 -> DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB (1 шт.)

Потом то же самое, но в обратную сторону