14 KiB
2023-02-16
FIXME: group-key-is-public
cat ./group1.key
# hbs2 groupkey file
# keep it private
group key is actually public. it contains encrypted records
FIXME: group-key-new-brokes-on-empty-line
cat pub
3YpCdSGw7BdTVTpaWUMxF1DbWcTwAsH6ai3wRXfvCYx6
./bin/hbs2 groupkey-new ./pub
bad pubkeys file
2023-02-15
TODO: rpc-own-peer-key
poke to print peer's own auth key
TODO: rpc-known-peers
TODO: announce-group
Сделать способ задания группы/групп пиров, которым будут рассылаться те анонсы, которые не multicast.
Пир определяется своим ключом, а не адресом. Таким образом, при анонсе мы
- Указываем ключ (если опускаем - то всем в группе)
- Ищем адреса хостов с данным ключом в авторизованных пирах
- Рассылаем им анонсы
Нужно ли делать разные группы, или хватит одной?
TODO: check-if-block-announce-sufficient-experiment
- Поднять виртуальный хост
- nixos-infect
- Задеплоить туда hbs2
- Прописать его в accept-announce
- Сделать ему announce явно (сейчас невозможно)
- Убедиться, что он может выкачать блок у хоста за NAT
FIXME: create-default-config
FIXME: wrong-default-config-path
TODO: make-key-optional-parameter
-k should be an optional parameter cause it comes from config now
TODO: check-if-block-announce-sufficient
Нужно проверить, достаточно ли BlockAnnounce + BlockChunks для скачивания блоков в обе стороны. Кейс, вызывающий вопросы:
[A] (NAT) [B]
| * block-announce |
+------*--------------------->+
| * |
| * get-block-size |
+<-----*----------------------+
| * |
| * |
| * block-size |
+------*--------------------->+
| * |
| * get-block-chunks |
+<-----*----------------------+
| * |
| * |
Во вторых, если блок A предлагает какой-то блок, то высока вероятность того, что у других участников его еще нет --- и если спрашивать о нём всех и ждать ответа, это может привести к тому, что блок будет качаться очень медленно. Нужно как-то или использовать веса (пиров для данного блока), или же спрашивать параллельно всех о размере блока и на следующей итерации качать блок у того, кто сообщил размер. Кстати говоря, нас тут могут обманывать, возможно, нужно в BlockSize добавить какой-то пруф, что у пира есть такой блок.
2023-02-14
2023-02-12
FIXME: busyloop-postponed
Когда остаются одни posponed блоки в очереди, которых ни у кого нет --- возникает busyloop и флуд GetBlockSize
Кажется, надо в ключ HasTimeLimits добавить хэш пингуемого блока.
TODO: introduce-peer-config
-
На одном хосте может быть несколько пиров.
-
Конфиг пира --- это каталог.
-
Сторейдж --- это стейт, следовательно, конфиг должен быть отдельно
-
Конфиг является в основном линейным, т.е изменение может происходить дописыванием настроек в конец
TODO: introduce-peer-black-list
TODO: peer-accept-block-announce-feature
Смотреть, если пир в чёрном списке --- от отвергать от него BlockAnnounce и handshake.
2023-02-09
TODO: MerkleWrap-to-MerkleAnn-or-AnnMerke
($context (commit d81038140c795e1cf30cfa05e95630ca1e639427) (file hbs2-core/lib/HBS2/Data/Detect.hs 143) )
Заменить MerkleWrap на AnnotatedMerkle или MerkleAnn
Смысл --- Merkle дерево с аннотацией.
AnnRef, получается, более не нужны. Ссылка всегда ссылается на дерево, наверное, всегда аннотированное.
У ссылки, в свою очередь, есть ссылка на AccessControlBlock.
TODO: encryption-keys-into-credentials-file
дизайн данных:
data Credentials = Credentials SignKey [(KeyId, KeyMetadata, KeyPair)]
он же "keyring", это буквально связка ключей.
операции:
hbs2 keyring list <keyring-file>
показывает публичные ключи в связке и их типы и прочее
hbs2 keyring add-new [-n key-id] <keyring-file>
добавляет ключ
hbs2 keyring del -n key-id <keyring-file>
удаляет ключ
Этот же формат ключ можно использовать и самому пиру, т.к. ему тоже нужны будут потом ключи шифрования.
Единственное, пир должен знать какой ключ из связки использовать, но это может быть либо по умолчанию первый ключ, либо передавать как-то в конфиге или же аргументах.
2023-02-07
FIXME: suckless-conf
Настало время выдохнуть и сделать fixme, потому, что их становится слишком много.
FIXME: Более мудрый алгоритм для pokePostponed
Сейчас оно слишком часто просыпается и забрасывает блоки в общую очередь, что приводит к busyloop в blockDownloadLoop. Введение HasTimeLimits улучшило ситуацию, но не сильно. Алгоритм должен быть что-то наподобие:
Посмотрели, сколько раз блок процессировался подряд. Если больше, чем X - то (что?) в общем, выкинули обратно в postponed.
С другой стороны, может GetBlockSize можно рассылать из pokePostponed, и просыпаться, если пришёл размер нашего блока
2023-02-06
Ну а так, базовый PEX заработал
TODO: Добавлять пиров в KnownPeers только после того, как они пинганулись. Т.е пинговать пиров, если их еще нет. Не добавлять в KnownPeers до того, как ответили на пинг.
TODO: Научиться убирать дубликаты пиров.
Их можно распознать по PeerNonce, но непонятно, какой из пиров оставлять. Иначе это будет реально большая проблема при скачивании.
TODO: Убедиться, что subscribe на перманентное событие НИКОГДА не вызывается в рекурсии.
Проверить ВСЕ subscribe. Возможно, вставить проверки в рантайм. Возможно, ограничить число таких событий и ругаться в рантайме.
FIXME: При вычислении burst надо каким-то образом находить плато и не лезть выше него.
FIXME: Задержку в очередь пиров при рассылке GetBlockSize, что бы не спамить пиров, пока запрос не уехал в отстой. Надо для каждого пира поставить задержку в 0.5 defBlockInfoTimeout или наоборот, в 1 defBlockInfoTimeout. #medium #asap
FIXME: добавить peer-nonce в peer-data что бы можно было определять себя при пинге и вычеркивать из known-peers, что бы пакеты по кругу не гонять. #easy
2023-02-05
fixme
Багтрекеры не нужны. Нужно сделать утилиту fixme, которая будет вести список FIXME/TODO из файлов. Формат FIXME/TODO достаточно расслабленный, но с определёнными условностями (TBD).
Каждая такая запись привязывается к файлу/строчке/гитовому коммиту. Оттуда и берёт автора, и как-то трекает историю.
Изменения workflow делаются отдельными записями, можно еще с криптоподписью (взять тот же самый credentials).
Аттачменты и прочее --- добавлять хэш-ссылками на
- объект hbs2/offgrid
- git blob
Тогда, если по этому гитовому хэшу объект где-то находится (в т.ч. вообще в любом репозитории, у нас же может быть глобальный словарь sha1 <-> offgrid-hash) то - рисуем картинку или изображаем аттачмент.
Про PEX
Надо делать PEX. PEX очень простой:
data PEXEntry e = PEXAdd (PeerAddr e)
| PEXDel (PeedAddr e)
| PEX
data PEX e = PEXRequest ???
| PEXResponse ??? [PEXEntry]
На самом деле, кто тут судьи? Кто может нам сказать - добавить пира или удалить.
Только мы сами можем решать. Поэтому, PEX может быть редуцирован до:
data PEX e = PEXRequest ???
| PEXInfo [PeerAddr e] (Maybe ???)
A B
+ -> PEXRequest -> +
| |
+ <- PEXInfo xxx ??? <- +
| |
| |
Вопрос, сколько пиров за раз отдавать, как можно нас зафлудить битыми пакетами и т.д.
Информацию о пирах лучше сделать вообще отдельным протоколом, что бы не загромождать этот.
Тогда останется только
data PEX e = PEXRequest ??? | PEXAnswer [PeerAddr e]
Оценочные суждения, что пир такой-то --- редиска и т.п. можно оставить за кадром. Там нужны пруфы или сеть доверия, для сети доверия надо хранить статистику пиров (что, кстати, можно).
То есть если пир, который у нас на хорошем счету, или его хороший пир говорят нам, что какой-то другой пир --- плохой, то этому можно верить.
Вопрос, база локальная или база глобальная. Вообще, это целая большая история и пока не до неё.
2023-02-03
FIXME: Перестаёт качать ближе к концу файла. После повторного анонса --- докачивает.
FIXME: Надо поднимать burst в процессе скачивания блоков
FIXME: Надо динамически повышать/понижать burst в процессе скачивания
NOTE: Почему вообще получается потеря пакетов? Такого не должно быть.
TODO: Нужно исследовать потерю чанков/блоков, и произвести сравнительные замеры при помощи iperf/netperf что бы понять, теряются ли вообще пакеты или нет.
2023-02-01
Вести баги это слишком формально и накладно, даже в упрощенном виде. Можно вести их в виде девлога.
FIXME: Обработка ошибок в асинхронном приложении. Async-и жрут исключения, даже, когда удаётся их перехватить и пробросить дальше. Например, если не удалось забиндиться на адрес, исключение стреляет, но код ошибки при выходе всё еще 0.