hbs2/docs/drafts/pep-04.txt

193 lines
5.7 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PEP: pep-04-reference-update
```
$$$ (set lang ru)
```
Reference представляет собой адресуемую мутабельную
ссылку на контент.
Предпосылки
===========
1. Ссылка (Reference) представляет собой единицу адресации "потока"
блоков (топики, чаты, блокчейны, статический файл с обновлениями
и так далее)
2. Со ссылкой ассоциируются владельцы/информация о списке тех,
кто может читать данные по ссылке / писать данные по ссылке
3. Пир должен знать, как обрабатывать операции над ссылкой, а именно:
Парсить, проверять полномочия
4. Пир должен уметь обрабатывать команды изменения полномочий
Тезисы
======
1. При создании ссылки устанавливается первоначальный ACB
2. При создании ссылки устанавливается список доступных для неё операций
3. Операции над ACB являются предопределенными
4. Остальные операции определяются типом ссылки
Структуры данных
================
```
Ref:
ACB ;; ссылка на ACB
Journal ;; ссылка на merkle tree текущего журнала операций
Head ;; ссылка на текущее (commited) состояние ссылки
Proof ;; потенциально -- тип proof. Как его сделать расширяемым
;; пока что неизвестно, вероятно, это нечто, вычисляемое
;; из текущего состояния.
;; как оно вычисляется / в принципе может вычисляться пока не вполне
;; понятно, поэтому на текущий момент это проверка ACL:
;; ключ публикатора коммита принадлежит owners.
```
Команды протокола
=================
RefAddOwner : (STATE,BLOB)
----------------------------
acl: root
добавить owner
RefDelOwner : (STATE, BLOB)
----------------------------
acl: root
удалить owner
RefAddWriter : (STATE, BLOB)
----------------------------
acl: owner
добавить writer
RefDelWriter : (STATE, BLOB)
----------------------------
acl: owner
удалить writer
RefAddReader : (STATE, BLOB)
----------------------------
acl: owner
добавить reader
RefDelReader : (STATE, BLOB)
----------------------------
acl: owner
удалить reader
RefUpdateState : (STATE, OP, ARGS:[ARG-TYPE])
---------------------------------------------
acl: writer
OP: Опкод операции, определяется Reference
ARGS: список аргументов, возможно, пустой
ARG-TYPE: BLOB INT HASH
INT: целое число переменной размерности
BLOB: произвольная строка фиксированной длины
HASH: хэш блока
RefCommit : (STATE, NEW-STATE, PROOF:PROOF-TYPE)
------------------------------------------------
acl: зависит от PROOF-TYPE
RefGetJournal
acl: readers (?)
Обработка команд протокола
==========================
RefCommit
---------
1. Проверить PROOF
3. Построить MERKLE TREE журнала, однозначно упорядочив операции
2. Текущий STATE = JOURNAL-MERKLE-TREE
3. Удалить JOURNAL
4. Создать новый пустой JOURNAL
RefGetJournal
-------------
acl: reader (?)
1. Построить MERKLE TREE журнала, однозначно упорядочив операции
2. Вернуть HASH(MERKLE-TREE) журнала
Любая другая команда
--------------------
1. Распарсить
2. Проверить типы операндов
3. Проверить ACL
4. Записать в журнал
Журнал должен позволять добавлять записи в конец без
чтения всего журнала.
Команды в журнал добавляются последовательно по мере
их поступления.
Резюме
======
1. Состояние (state) однозначно задаётся потоком команд
2. Каждая команда может иметь своим аргументом ссылку на HASH
Утверждается, что имея подобный набор примитивов, мы можем построить
определенный (определить) класс распределенных систем.
Так как ссылки на другие объекты задаются явно при помощи типа HASH,
мы знаем, на какие объекты ссылается ссылка.
Таким образом, можно реализовать сборку мусора, когда объекты,
на которых не ссылается ни одна ссылка, могут удаляться.
TODO: journal-types-implementation
- Добавление в конец без чтения всего журнала
- Запись может быть произвольного размера
- Задавать размер страницы
- Для записи выделяется целое число страниц