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 - Добавление в конец без чтения всего журнала - Запись может быть произвольного размера - Задавать размер страницы - Для записи выделяется целое число страниц