mirror of https://github.com/voidlizard/hbs2
wip
This commit is contained in:
parent
c72f0d73d4
commit
9378f14e1a
|
@ -1,11 +1,12 @@
|
||||||
|
% vim: set textwidth=80:
|
||||||
|
|
||||||
\chapter{Введение}
|
\chapter{Введение}
|
||||||
|
|
||||||
Данный документ описывает цели, функции и дизайн компонента \term{hbs2-browser}{hbs2-browser},
|
Данный документ описывает цели, функции и дизайн компонента
|
||||||
а также предпосылки к его разработке.
|
\term{hbs2-browser}{hbs2-browser}, а также предпосылки к его разработке.
|
||||||
|
|
||||||
Основными единицами адресации в системе являются
|
Основными единицами адресации в системе являются \term{block}{блок},
|
||||||
\term{block}{блок}, \term{mtree}{меркл-дерево}, \term{ref}{ссылка}.
|
\term{mtree}{меркл-дерево}, \term{ref}{ссылка}.
|
||||||
|
|
||||||
\term{ref}{Ссылка} является изменяемым указателем на адресуемую единицу, обычно
|
\term{ref}{Ссылка} является изменяемым указателем на адресуемую единицу, обычно
|
||||||
ассоциированная с публичным криптоключом.
|
ассоциированная с публичным криптоключом.
|
||||||
|
@ -14,99 +15,112 @@
|
||||||
ссылку и в какой-то момент ссылок становится очень много, они рассеяны в разных
|
ссылку и в какой-то момент ссылок становится очень много, они рассеяны в разных
|
||||||
источниках и крайне затруднительно их отслеживаеть.
|
источниках и крайне затруднительно их отслеживаеть.
|
||||||
|
|
||||||
Таким образом, необходим некий иструмент просмотра этих ссылок и их метаданных
|
Таким образом, необходим некий иструмент просмотра этих ссылок и их метаданных и
|
||||||
и содержимого, без необходимости их запоминать. Аналогично тому, как люди пользуются
|
содержимого, без необходимости их запоминать. Аналогично тому, как люди
|
||||||
записными книжками в мобильных телефонах, не запоминая сами номера. Но если сколько-то
|
пользуются записными книжками в мобильных телефонах, не запоминая сами номера.
|
||||||
номеров запомнить еще можно, то 256-битный публичный ключ подписи --- уже маловероятно.
|
Но если сколько-то номеров запомнить еще можно, то 256-битный публичный ключ
|
||||||
|
подписи --- уже маловероятно.
|
||||||
|
|
||||||
Таким образом, мы предлагаем инструмент, который возьмет на себя эту работу.
|
Таким образом, мы предлагаем разработать инструмент, который возьмет на себя эту
|
||||||
|
работу.
|
||||||
|
|
||||||
Этим инструментом и предполагается \term{hbs2-browser}{hbs2-brower}.
|
Назовём его \term{hbs2-browser}{hbs2-browser}.
|
||||||
|
|
||||||
Следующим вопросом является --- делать ли отдельный браузер для каждого типа
|
Следующим вопросом является --- делать ли отдельный браузер для каждого типа
|
||||||
\term{ref}{ссылки}, или можно сделать какой-то общий инструмент.
|
\term{ref}{ссылки}, или можно сделать какой-то общий инструмент.
|
||||||
|
|
||||||
Отдельный браузер видится, на первый взгляд, более простым решением, но по факту в системе уже есть
|
Отдельный браузер видится, на первый взгляд, более простым решением, но по факту
|
||||||
прецеденты, когда введение <<простых>> частных инструментов приводило к тому, что их приходилось
|
в системе уже есть прецеденты, когда введение <<простых>> частных инструментов
|
||||||
практически клонировать это раз, а впоследствии удалять и заменять более общим решением, которое, не
|
приводило к тому, что их приходилось практически клонировать это раз, а
|
||||||
являясь значительно более сложным, было значительно более мощным и удобным.
|
впоследствии удалять и заменять более общим решением, которое, не являясь
|
||||||
|
значительно более сложным, было значительно более мощным и удобным.
|
||||||
|
|
||||||
Задача \term{hbs2-brower}{hbs2-brower} может быть сформулирована так: брать данные из различных
|
Задача \term{hbs2-browser}{hbs2-browser} может быть сформулирована так: брать
|
||||||
источников, соединять их, фильтровать и отображать в соответствии с заданными правилами.
|
данные из различных источников, соединять их, фильтровать и отображать в
|
||||||
|
соответствии с заданными правилами.
|
||||||
|
|
||||||
Следовательно, данные должны быть соединямыми, фильтруемыми и отображаемыми, но при этом,
|
Следовательно, данные должны быть соединямыми, фильтруемыми и отображаемыми, но
|
||||||
заведомо неизвестно какими (и видимо, это специфично для источника).
|
при этом, заведомо неизвестно какими (и видимо, это специфично для источника).
|
||||||
|
|
||||||
Тем не менее, известно множество примеров подобных данных и преобразований над ними: например, \[
|
Тем не менее, известно множество примеров подобных данных и преобразований над
|
||||||
xml \xrightarrow{\text{xslt}} xml \], или любые данные в любые данные при помощи кода. Если браузер
|
ними: например, \[ xml \xrightarrow{\text{xslt}} xml \], или любые данные в
|
||||||
подразумевает текст или html, то, очевидно, конечное преобразование будет в них.
|
любые данные при помощи кода. Если браузер подразумевает текст или html, то,
|
||||||
|
очевидно, конечное преобразование будет в них.
|
||||||
|
|
||||||
Таким образом, что бы мы не просматривали, это должно иметь преобразование в упомянутые конечные
|
Таким образом, что бы мы не просматривали, это должно иметь преобразование в
|
||||||
форматы.
|
упомянутые конечные форматы.
|
||||||
|
|
||||||
Конечно, почти любые данные могут быть преобразованы в такой формат, но если он будет слишком
|
Конечно, почти любые данные могут быть преобразованы в такой формат, но если он
|
||||||
специфичен, то \term{hbs2-brower}{hbs2-browser} придется о них знать --- это раз, и каждый инстанс
|
будет слишком специфичен, то \term{hbs2-browser}{hbs2-browser} придется о них
|
||||||
\term{hbs2-brower}{hbs2-browser} должен будет выполнить работу по индексации самостоятельно, и
|
знать --- это раз, и каждый инстанс \term{hbs2-browser}{hbs2-browser} должен
|
||||||
прийти к результатам в зависимости от известных ему ссылок, так, что результаты для разных браузеров
|
будет выполнить работу по индексации самостоятельно, и прийти к результатам в
|
||||||
могут быть разные --- это два, индексация может быть довольно затратным процессом --- это три, для
|
зависимости от известных ему ссылок, так, что результаты для разных браузеров
|
||||||
отображения нужны только отображаемые данные, а прочие не нужны --- это четыре.
|
могут быть разные --- это два, индексация может быть довольно затратным
|
||||||
|
процессом --- это три, для отображения нужны только отображаемые данные, а
|
||||||
|
прочие не нужны --- это четыре.
|
||||||
|
|
||||||
Таким образом, для любого источника данных можно ввести источники метаданных, которые нужны для
|
Таким образом, для любого источника данных можно ввести источники метаданных,
|
||||||
индексации и отображения. А так же стараться не проделывать повторно работу для построения
|
которые нужны для индексации и отображения. А так же стараться не проделывать
|
||||||
метаданных из данных.
|
повторно работу для построения метаданных из данных.
|
||||||
|
|
||||||
Кажется, что при этом можно построить систему так, что бы различные её участники выполняли работу по
|
Кажется, что при этом можно построить систему так, что бы различные её участники
|
||||||
индексации совместно, работа эта объединялась, при этом уже проделанная работа бы не делалась
|
выполняли работу по индексации совместно, работа эта объединялась, при этом уже
|
||||||
повторно.
|
проделанная работа бы не делалась повторно.
|
||||||
|
|
||||||
Помимо некоторой оптимизации и масштабирования, данный подход выглядит и достаточно справедливым и
|
Помимо некоторой оптимизации и масштабирования, данный подход выглядит и
|
||||||
децентрализованным, в отличие от подхода с \term{blockhain-explorer}{блокчейн-эксплорерами}, где они
|
достаточно справедливым и децентрализованным, в отличие от подхода с
|
||||||
являются централизованными агентами и выполняют работу для всех участников сети, при этом становятся
|
\term{blockhain-explorer}{блокчейн-эксплорерами}, где они являются
|
||||||
точкой отказа, но получают возможность манипулировать данными.
|
централизованными агентами и выполняют работу для всех участников сети, при этом
|
||||||
|
становятся точкой отказа, но получают возможность манипулировать данными.
|
||||||
|
|
||||||
Есть примеры сетей, где вместо данных сети приложения ориентируются на данные из этих эксплореров,
|
Есть примеры сетей, где вместо данных сети приложения ориентируются на данные из
|
||||||
что приводит к отказам, возможности цензуры и возможностям различных атак, что и происходило уже
|
этих эксплореров, что приводит к отказам, возможности цензуры и возможностям
|
||||||
многократно, например, во всеми нами любимой многократно обосравшейся, но непотопляемой сети
|
различных атак, что и происходило уже многократно, например, во всеми нами
|
||||||
Ethereum.
|
любимой многократно обосравшейся, но непотопляемой сети Ethereum.
|
||||||
|
|
||||||
Если мы решаем, что индексация контента будет происходить совместно, то появляются вопросы о степени
|
Если мы решаем, что индексация контента будет происходить совместно, то
|
||||||
доверия \term{oracle}{индексаторам} данных, или же \term{oracle}{оракулам}.
|
появляются вопросы о степени доверия \term{oracle}{индексаторам} данных, или же
|
||||||
|
\term{oracle}{оракулам}.
|
||||||
|
|
||||||
Очевидно, что рано или поздно появятся вредоносные \term{oracle}{оракулы}, которые будут искажать
|
Очевидно, что рано или поздно появятся вредоносные \term{oracle}{оракулы},
|
||||||
картину в каких-то своих целях.
|
которые будут искажать картину в каких-то своих целях.
|
||||||
|
|
||||||
Таким образом, у нас должны быть механизмы для противодействия этому.
|
Таким образом, у нас должны быть механизмы для противодействия этому.
|
||||||
|
|
||||||
Такие механизмы у нас есть: это \term{refchan}{рефчаны}. Рефчан это \term{gset}{CRDT G-Set}
|
Такие механизмы у нас есть: это \term{refchan}{рефчаны}. Рефчан это
|
||||||
\term{transaction}{транзакций}, но с возможностью проверки прав публикации на основе ACL, как на
|
\term{gset}{CRDT G-Set} \term{transaction}{транзакций}, но с возможностью
|
||||||
уровне \term{peer}{пиров}, так и на уровне \term{author}{авторов}, а так же валидацией транзакций
|
проверки прав публикации на основе ACL, как на уровне \term{peer}{пиров}, так и
|
||||||
консенсусом онлайн.
|
на уровне \term{author}{авторов}, а так же валидацией транзакций консенсусом
|
||||||
|
онлайн.
|
||||||
|
|
||||||
Минимальным условием принятия \term{transaction}{транзакции} в \term{refchan}{рефчан} является
|
Минимальным условием принятия \term{transaction}{транзакции} в
|
||||||
наличие пира и автора в ACL рефчана, онлайн~валидация может быть подключена при желании.
|
\term{refchan}{рефчан} является наличие пира и автора в ACL рефчана,
|
||||||
|
онлайн~валидация может быть подключена при желании.
|
||||||
|
|
||||||
В целом, кажется, что мы не хотим делать валидацию онлайн, вместо этого мы хотим сделать механизм
|
В целом, кажется, что мы не хотим делать валидацию онлайн, вместо этого мы хотим
|
||||||
проверки достоверности данных, и какие-то транзакции, которые отменяют/понижают достоверность для
|
сделать механизм проверки достоверности данных, и какие-то транзакции, которые
|
||||||
других транзакций. Это даст нам возможность оценивать пиров и авторов по достоверности публикуемых
|
отменяют/понижают достоверность для других транзакций. Это даст нам возможность
|
||||||
материалов, при этом не создавая большую нагрузку по обработке запросов онлайн.
|
оценивать пиров и авторов по достоверности публикуемых материалов, при этом не
|
||||||
|
создавая большую нагрузку по обработке запросов онлайн.
|
||||||
|
|
||||||
Кажется, для онлайн-валидации достаточно будет проверить рейтинг пира. А при снижении рейтинга пира
|
Кажется, для онлайн-валидации достаточно будет проверить рейтинг пира. А при
|
||||||
--- в какой-то момент удалять его из ACL.
|
снижении рейтинга пира --- в какой-то момент удалять его из ACL.
|
||||||
|
|
||||||
Стоит и остановиться на самих метаданных. Предыдущий опыт показывает провальность попыток дизайна
|
Стоит и остановиться на самих метаданных. Предыдущий опыт показывает
|
||||||
сверху вниз, когда мы заранее определяем все возможные структуры данных.
|
провальность попыток дизайна сверху вниз, когда мы заранее определяем все
|
||||||
|
возможные структуры данных.
|
||||||
|
|
||||||
Тут мы во первых, понятия не имеем, какие структуры возникнут с течением времени, во вторых даже для
|
Тут мы во первых, понятия не имеем, какие структуры возникнут с течением
|
||||||
имеющихся форматов, например, git, возможных метанных может быть больше, чем мы в состоянии сделать
|
времени, во вторых даже для имеющихся форматов, например, git, возможных
|
||||||
и даже описать.
|
метанных может быть больше, чем мы в состоянии сделать и даже описать.
|
||||||
|
|
||||||
Следовательно, будем рассматривать это всё как заведомо неизвестную предметную область, и применять
|
Следовательно, будем рассматривать это всё как заведомо неизвестную предметную
|
||||||
подход <<снизу вверх>> --- то есть, стараться брать как можно более атомарные факты, и делать
|
область, и применять подход <<снизу вверх>> --- то есть, стараться брать как
|
||||||
возможным их соединение и группировку, а так же добавлять потом факты, которые соединяют и
|
можно более атомарные факты, и делать возможным их соединение и группировку, а
|
||||||
группируют другие факты.
|
так же добавлять потом факты, которые соединяют и группируют другие факты.
|
||||||
|
|
||||||
Допустим, на примере git. Для начала мы хотим просто дать возможность просмотра ссылок, которые
|
Допустим, на примере git. Для начала мы хотим просто дать возможность просмотра
|
||||||
являются репозиториями git. Для этого нам надо:
|
ссылок, которые являются репозиториями git. Для этого нам надо:
|
||||||
|
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Найти все ссылки типа \term{lwwref}{lwwref}
|
\item Найти все ссылки типа \term{lwwref}{lwwref}
|
||||||
|
@ -115,31 +129,33 @@ Ethereum.
|
||||||
актуальную транзакцию, являющуюся \term{repohead}{головой репозитория}
|
актуальную транзакцию, являющуюся \term{repohead}{головой репозитория}
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
|
|
||||||
Найдя такую транзакцию, мы можем констатировать, что данный \term{lwwref}{lwwref} является
|
Найдя такую транзакцию, мы можем констатировать, что данный
|
||||||
репозиторием git, или по крайней мере являлся им, и содержит \term{repohead}{голову} с данным
|
\term{lwwref}{lwwref} является репозиторием git, или по крайней мере являлся им,
|
||||||
\term{manifest}{манифестом} и ссылками git.
|
и содержит \term{repohead}{голову} с данным \term{manifest}{манифестом} и
|
||||||
|
ссылками git.
|
||||||
|
|
||||||
Некоторые из этих фактов могут, кажется, быть разбиты на еще более атомарные факты. Но в итоге мы
|
Некоторые из этих фактов могут, кажется, быть разбиты на еще более атомарные
|
||||||
можем их объединить, и сделать вывод о репозитории git, при этом получив все данные, необходимые
|
факты. Но в итоге мы можем их объединить, и сделать вывод о репозитории git,
|
||||||
для его отображения.
|
при этом получив все данные, необходимые для его отображения.
|
||||||
|
|
||||||
Также, кажется что большинство из таких фактов будут иммутабельны и многие достаточно будет извлечь
|
Также, кажется что большинство из таких фактов будут иммутабельны и многие
|
||||||
один раз.
|
достаточно будет извлечь один раз.
|
||||||
|
|
||||||
Далее, мы хотим добавить какой-то более интересный факт, например, автора, что бы иметь возможность
|
Далее, мы хотим добавить какой-то более интересный факт, например, автора, что
|
||||||
выводить список авторов.
|
бы иметь возможность выводить список авторов.
|
||||||
|
|
||||||
Мы можем считать \term{author}{автором} различные вещи, например, это может быть ключ рефлога
|
Мы можем считать \term{author}{автором} различные вещи, например, это может быть
|
||||||
форка репозитория. Тогда, что бы извлечь что-то полезное, например, имя --- нам бы надо иметь
|
ключ рефлога форка репозитория. Тогда, что бы извлечь что-то полезное, например,
|
||||||
\term{sigil}{<<сигил>>}, который есть подписанный публичным ключом ключ шифрования и метаданные,
|
имя --- нам бы надо иметь \term{sigil}{<<сигил>>}, который есть подписанный
|
||||||
например имя и email.
|
публичным ключом ключ шифрования и метаданные, например имя и email.
|
||||||
|
|
||||||
Такой \term{sigil}{<<сигил>>} тоже можно рассматривать, как факт, с которым можно соединить
|
Такой \term{sigil}{<<сигил>>} тоже можно рассматривать, как факт, с которым
|
||||||
прочие факты, по публичному ключу, который мы берём из факта о том, что есть рефлог для
|
можно соединить прочие факты, по публичному ключу, который мы берём из факта о
|
||||||
\term{lwwref}{lwwref}, который является репозиторием. Таким образом, мы можем сделать вывод
|
том, что есть рефлог для \term{lwwref}{lwwref}, который является репозиторием.
|
||||||
об авторстве.
|
Таким образом, мы можем сделать вывод об авторстве.
|
||||||
|
|
||||||
С другой стороны, мы можем считать <<автором>> то, что пишет git в информации о коммите, как-то:
|
С другой стороны, мы можем считать <<автором>> то, что пишет git в информации о
|
||||||
|
коммите, как-то:
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
commit 0cf82db731a6c30a81bc4d46fd43f30fc266e060 (HEAD -> dev-0.24.2)
|
commit 0cf82db731a6c30a81bc4d46fd43f30fc266e060 (HEAD -> dev-0.24.2)
|
||||||
|
@ -149,21 +165,22 @@ Date: Thu Mar 21 10:25:27 2024 +0300
|
||||||
hbs2-git-oracle: the beginning
|
hbs2-git-oracle: the beginning
|
||||||
\end{verbatim}
|
\end{verbatim}
|
||||||
|
|
||||||
|
мы, кстати, можем эти два факта тоже попытаться соединить по адресу электронной
|
||||||
|
почты, но это выглядит, как плохая практика сразу по многим причинам.
|
||||||
|
|
||||||
мы, кстати, можем эти два факта тоже попытаться соединить по адресу
|
Тем не менее, если мы пошлём на электронную почту некоторое секретное сообщение,
|
||||||
электронной почты, но это выглядит, как плохая практика сразу по многим причинам.
|
и владелец адреса подпишет это сообщение своим приватным ключом, например, тем,
|
||||||
|
что от рефлога --- мы можем установить связь электронной почты с рефлогом, и
|
||||||
|
далее соединять коммитеров из лога гита с авторами рефлогов.
|
||||||
|
|
||||||
Тем не менее, если мы пошлём на электронную почту некоторое секретное сообщение, и владелец адреса
|
Этим может заниматься какой-то специальный оракул, но в целом, проще добавить
|
||||||
подпишет это сообщение своим приватным ключом, например, тем, что от рефлога --- мы можем установить
|
некое подписанное сообщение в коммит гита.
|
||||||
связь электронной почты с рефлогом, и далее соединять коммитеров из лога гита с авторами рефлогов.
|
|
||||||
|
|
||||||
Этим может заниматься какой-то специальный оракул, но в целом, проще добавить некое подписанное
|
|
||||||
сообщение в коммит гита.
|
|
||||||
|
|
||||||
Теоретически, можно попробовать даже использовать стандартные механизмы подписи.
|
Теоретически, можно попробовать даже использовать стандартные механизмы подписи.
|
||||||
|
|
||||||
Таким образом, мы показываем, что можно добавить сначала один факт --- <<ссылка является
|
Таким образом, мы показываем, что можно добавить сначала один факт --- <<ссылка
|
||||||
репозиторием>>, а дальше добавить другой факт <<автор для данного репозитория --- X>>, и можно
|
является репозиторием>>, а дальше добавить другой факт <<автор для данного
|
||||||
постепенно обогащать отображаемые метаданные фактами, начиная с наиболее необходимых.
|
репозитория --- X>>, и можно постепенно обогащать отображаемые метаданные
|
||||||
|
фактами, начиная с наиболее необходимых.
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue