This commit is contained in:
Dmitry Zuikov 2024-03-21 14:08:29 +03:00
parent c72f0d73d4
commit 9378f14e1a
1 changed files with 117 additions and 100 deletions

View File

@ -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>>, и можно постепенно обогащать отображаемые метаданные
фактами, начиная с наиболее необходимых.