mirror of https://github.com/voidlizard/hbs2
388 lines
14 KiB
Markdown
388 lines
14 KiB
Markdown
## 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.
|
||
|
||
Пир определяется своим ключом, а не адресом.
|
||
Таким образом, при анонсе мы
|
||
|
||
1. Указываем ключ (если опускаем - то всем в группе)
|
||
2. Ищем адреса хостов с данным ключом в авторизованных
|
||
пирах
|
||
3. Рассылаем им анонсы
|
||
|
||
Нужно ли делать разные группы, или хватит одной?
|
||
|
||
|
||
|
||
TODO: check-if-block-announce-sufficient-experiment
|
||
|
||
1. Поднять виртуальный хост
|
||
2. nixos-infect
|
||
3. Задеплоить туда hbs2
|
||
4. Прописать его в accept-announce
|
||
5. Сделать ему announce явно (сейчас невозможно)
|
||
6. Убедиться, что он может выкачать блок у хоста за 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
|
||
|
||
1. На одном хосте может быть несколько пиров.
|
||
|
||
2. Конфиг пира --- это каталог.
|
||
|
||
3. Сторейдж --- это стейт, следовательно, конфиг
|
||
должен быть отдельно
|
||
|
||
4. Конфиг является в основном линейным, т.е изменение
|
||
может происходить дописыванием настроек в конец
|
||
|
||
|
||
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).
|
||
|
||
Аттачменты и прочее --- добавлять хэш-ссылками на
|
||
|
||
1. объект hbs2/offgrid
|
||
2. 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.
|
||
|
||
|
||
|