Простые ссылки ============== Модель данных ------------- ``` 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, где каждый лист - это пара (ссылка/значение).