mirror of https://github.com/voidlizard/hbs2
193 lines
5.7 KiB
Plaintext
193 lines
5.7 KiB
Plaintext
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
|
||
- Добавление в конец без чтения всего журнала
|
||
- Запись может быть произвольного размера
|
||
- Задавать размер страницы
|
||
- Для записи выделяется целое число страниц
|
||
|
||
|