mirror of https://github.com/voidlizard/hbs2
118 lines
4.1 KiB
Plaintext
118 lines
4.1 KiB
Plaintext
|
||
Простые ссылки
|
||
==============
|
||
|
||
Модель данных
|
||
-------------
|
||
|
||
```
|
||
value:
|
||
seqnum ; монотонно возрастающее число на каждый update
|
||
prev ; предыдущее значение блока | ничего
|
||
nonce ; некое произвольное значение
|
||
value ; значение ссылки ( hashref )
|
||
acb ; ( hashref) ссылка на ACB
|
||
metadata ; отсутствие | ссылка ( hashref ) | короткая строка
|
||
key ; публичный ключ, создавший, обновивший ссылку
|
||
|
||
sign ; подпись (TBD) - возьмем, что это подпись всего пакета, тогда
|
||
; у нас ссылка разбивается на две части - value и signature
|
||
|
||
```
|
||
|
||
|
||
Операции
|
||
--------
|
||
|
||
Создать ссылку
|
||
~~~~~~~~~~~~~~
|
||
|
||
Пользователь предоставлет заполненную/подписанную структуру (см. выше).
|
||
От неё вычисляется хэш и сама структура в сериализованном виде помещается
|
||
в хранилища, а файл в пространстве имён refs указывает на сериализованный блок
|
||
данной структуры.
|
||
|
||
Условия:
|
||
|
||
1. seqnum == 0
|
||
2. prev == отсутствие значения
|
||
3. key принадлежит ACB.root
|
||
|
||
|
||
Обновить ссылку
|
||
~~~~~~~~~~~~~~~
|
||
|
||
Команда протокола / API / RPC
|
||
|
||
Условия:
|
||
|
||
1. seqnum = prev.seqnum + 1
|
||
2. key принадлежит ACB.owners
|
||
3. Если current.acb /= prev.ACB, то ключ принадлежит root
|
||
|
||
Сериализованное значение блока записывается в storage,
|
||
ключ в refs устанавливается на хэш этого блока.
|
||
|
||
|
||
Получить значение ссылки
|
||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
Узел запрашивает значение ссылки у другого узла.
|
||
|
||
Если seq полученного значения больше, чем известное
|
||
нам, и ссылка валидируется --- то установить собственное
|
||
значение ссылки в полученное.
|
||
|
||
Если нет --- то оставить всё как есть.
|
||
|
||
|
||
Анонс ссылки
|
||
~~~~~~~~~~~~
|
||
|
||
Сообщение, что ссылка X имеет значение Y.
|
||
|
||
Узел получает значение Y, далее валидирует его
|
||
аналогично разделу "Получить значение ссылки".
|
||
|
||
|
||
Проверка подписи
|
||
~~~~~~~~~~~~~~~~
|
||
|
||
1. Сериализуем value
|
||
2. Проверяем подпись
|
||
|
||
|
||
Добавление ссылки в список ссылок пира
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
В соответствии с настройками, пир принимает
|
||
обновление ссылки или нет от другого пира.
|
||
|
||
Возможно, он принимает только существующие
|
||
ссылки, но не создаёт новые.
|
||
|
||
Валидированная ссылка помещается в storage,
|
||
ref/value обновляется.
|
||
|
||
Периодически перестраивается merkle tree
|
||
всех ссылок, каждый лист в этом дереве
|
||
--- указатель на блок (ссылка, значение ссылки).
|
||
|
||
Данное дерево может быть получено путём обхода каталога
|
||
refs, либо же может всегда поддерживаться в
|
||
актуальном состоянии.
|
||
|
||
Получение списка ссылок пира
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
Пир посылает другому пиру запрос на получение
|
||
всех ссылок.
|
||
|
||
Пир отвечает адресом merkle tree указанной структуры
|
||
данных (merkle tree, где каждый лист - это пара
|
||
(ссылка/значение).
|
||
|
||
|
||
|
||
|