voidlizard.online
117 subscribers
160 photos
6 videos
5 files
105 links
Haskell, распределённые системы.

Разработка P2P CAS hbs2 и приложений для него

Распределенный git aka hbs2-git

hbs2.net

Прочее https://t.me/genedrd47r (мото, EUC, скайдайвинг, дайвинг)
Download Telegram
Есть ощущение, что для пущей крутизны файлы надо уже класть в hbs2, и приделать к нему http, который бы их отдавал по хэшу. тем более, что для этого уже все внутренние ручки есть. nginx только настроить с кэшированием
надо в проект CoC запилить. думаю, такой: НОРМАЛЬНО ДЕЛАЙ - НОРМАЛЬНО БУДЕТ.
То ли сишные приемы дают о себе знать, то ли в GHC 9.2.4 что-то сделали с управлением памятью. Такого вот, что сервер насосался и издох ни разу пока не было. Прокачиваешь гигабайт десять - двадцать, оно надувается, а потом сдувается постепенно до 15 мегабайт футпринта. Причем я даже банги забиваю расставлять, оно само как-то. Ехал кэш через кэш через таймер, который ходит и всё убивает, ровно как в си.
Признавайтесь, кто в нашему кластеру прицепился? Хотя б порт назад откройте, что бы пинговать можно было. Чувствую, пока мутабельные ссылки подъезжают, надо сделать перерыв в реализации гита и запилить NAT-PMP
Так или иначе, но похоже, что полноценно работающий "распределенный" гит до конца этой недели заработает (со ссылками. без ссылок он и так как-то работает). Интересно, что же желать дальше — ликвидировать технический долг? прикручивать криптографию везде, где откручено? Запилить пару шоукейсов (распределенный чат ? шаринг файлов / каталогов ?) Написать какую-то статью/пост о том, как это всё работает (спойлер: наиболее простым и очевидным способом из возможных) Прикрутить другие типы ссылок, а не только линейные с одним писателем ?
Когда работал в Keenetic, смотрел, как делается "операционная система" изнутри - т.е интегрированная куча софта на базе какого-то другого софта + сколько-то своего софта + клей. Всегда было какое-то зудящее чувство, что вот, хорошо бы всё это запилить на каком-то нормальном языке. Там еще и сетевые абстракции свои были, и всё это на подможестве плюсов - плюсы без самого вкусного, т.к. шаблоны раздували код, который не лез на маленькую внутреннюю флешку. Плюс там еще контуженное телекомовское сообщество породило стандарты типа TR-069, короче ехал SOAP через SOAP, можете в UPnP полюбоваться. Короче, впилили эрланг, эрланг в роутер влез (но больше ничего не влезло), но переписать огромную кодовую базу и передизайнить огромную модель на другом языке - с какого-то момента задача неподъемная. Так вот. Тогда в то время возникала какая-то идея, что надо всё потребное, например, для ноута - согнать в какой-то демон на приличном языке, и таскать с собой, время от времени портируя на новые модели железа. Идея умерла, т.к. дело это огромное, но почти бессмысленное. Но в итоге-то, оказалось, что на базе nix + помойка из всего — по факту вполне подъемно для одного. Ведь по сути ты делаешь свою ОС, где всё, как тебе нравится, она может деплоится на разные хосты, а системно-зависимые куски можно как-то абстрагировать. И на это не надо тратить весь остаток жизни. Да, в итоге адовая смесь из nix, haskell, bash, evlish, конфигов и бог знает чего еще. Но оно в целом работает, хоть всё и стрёмно изнутри (и в идеальном мире было бы написано на каком-то нормальном языке), но вроде довольно надёжно и работает. Самый треш, конечно, это когда ты никсом генеришь хакельный код (а не наоборот, как должно было бы быть в нормальном мире).
Кстати, прo elvish. Нужен был язык для шельного скриптования получше, чем баш, по по факту elvish им не является, более того, в каких-то моментах он до смешного убог и проигрывает даже bash.
Пока неохотно, но коммиты расползаются по нодам. Бесплатно получаем зачаток чата, чем gossip не чат. по сути чем сплетни отличаются от трёпа? Учитывая, что распределенный сторейдж идёт в комплекте, можно уже запиливать еще один распределенный мессенджер. И везде сплошное UDP!
code review с fixme:
делай раз:
cat .fixme/config
...
fixme-prefix REVIEW: review
...

делай два
cat .fixme/config
...
[ fixme-report review json
(render builtin:microstache report-wip.tpl)
(post builtin:columns | 10 10 8 12 _)
(query tag:REVIEW:)
]
...


делай три


  -- REVIEW: no-time-to-die
просто удаляй пира из вайтлиста,
если он в блэклисте

unless (Set.disjoint blkeys wlkeys) do
die "whitelist and blacklist intersect"

делай четыре:

[dmz@expert:~/w/hbs2]$ fixme report review
Da2nChoaL9 [] REVIEW: no-time-to-die
et voila:
Со ссылками не очень прикольная ситуация. Ссылка - это некая глобальная идентифицированная мутабельная переменная в распределенной системе, состояние которой определяется неким консенсусом. Ну, например, простой тип консенсуса - когда писатель только один и у ссылки есть версия. Тогда все участники сети просто сохраняют последнюю известную им версию ссылки и её же отдают, когда их попросят. Это один самый частный случай. В идеале, поскольку система просто представляет собой сетевой уровень, хочется, что бы состояние ссылки и тип консенсуса определялся внешним приложением. Для этого состояние ссылки надо просто пропихивать туда (во внешнее приложение), как есть. Если мы просто в онлайне просто слушаем и пересылаем эти самые ссылки, вернее, транзации об изменении их состояния - то всё просто работает — ссылку получили, пруфы (подпись, например) проверили, если ок - переслали. Вопрос, что делать если pull модель - т.е кто-то к нам приходит и говорит - дай лог для ссылки. Во первых, если ссылка нам не принадлежит - мы лог не можем подписать той же подписью — можем только переслать его как есть, т.е лог будет не содержимого транзакций, а самих (подписанных) транзакций. Неудобно, но, допустим, ок. Во вторых - лог может быть дюже здоровенный, а как-то фильтровать мы его не можем, мы же не знаем, что там внутри в транзах. Допустим, сделать запрос "дай N последних транз" - а что такое "последних" ? Последних принятных в хронологическом порядке? Последних N принятых в хронологическом порядке, упорядоченных по хэшам? Понятно, что можно сделать как-то. Но хочется сделать как-то логично и минимально, что бы несколько каких-то рандомных частных случаев на уровень протокола
Конкретно для гита с одним писателем - стейт это просто транзация с максимальным номером и ссылкой на merkle дерево состояния (head репозитория [состояние всех бранчей + транзитивное замыкание коммитов]). Вопрос в том, что для разных приложений понимание стейта может быть разным, вопрос какие примитивы должны быть в самой системе
Короче, для гита и случая, когда нода hbs2 в онлайне - всё работает с довольно общим механизмом. Теперь надо решить для случая, когда нода была в офлайне / стартует в начальный момент времени и ничего не знает про ссылку. Самое простое - попросить соседей переслать то, что у них есть. Конкретно это означает, что 1) рассылаем всем нодам запрос "проиграй свой лог транзакций 2) они плюют в ответ все транзы, которые у них есть - если есть сто, то сто. Если тысяча, то тысячу (UDP пакетов), если сто тысяч - то сто тысяч. Ну чот такое себе. Что же делать
Media is too big
VIEW IN TELEGRAM
Как работает git clone hbs2://...
#hbs2 @offgrid Удалось, кстати, это всё запустить на raspberri pi, что странно для хаскеля с TemplateHaskell. Видимо ноука шагнула за пять лет далеко вперёд. Неожиданно
push в пустую (новую) ссылку
фиг знает, стоит ли это постить сюда, но а куда еще, с другой стороны
Не бывает такого, что бы какой-то кусок софта взлетел. Он всегда всполз. Но тем не менее. Перед текущей фазой разработки от протоколов была откручена криптография. Соответственно, хочется понять, как бы её туда грамотно вкрутить обратно. Поскольку система не привязана ни к каким "доменам", сертификаты тоже отпадают. Пиры общаются между собой, подтверждают владение своими публичными ключами (подписи) и на этом этапе можно согласовать ключи шифрования и весь дальнейший обмен шифровать. Блоки еще сами по себе могут шифроваться, это сейчас есть. Вопрос вот в чем — незашифрованный протокол обмена ключами не палево ли это. Что можно делать: 1) запоминать где-то ключ пира и дальше использовать его 2) забить и оставить протокол согласования ключей незашифрованным. Запоминать ключи пира это в принципе появляется какой-то стейт, который надо обрабатывать, там будет что-то теряться, что-то пртухать и т.п. Неизящно. Какой можно изящный ход придумать?