Архитектура
В Velum шесть слоёв. Каждый знает ровно столько, сколько нужно для своей работы, и не больше.
Слои
| Слой | Видит | Не видит |
|---|---|---|
| Приложение | Твои сообщения в открытом виде, контакты, фразу восстановления | Ничего о других пользователях |
| Конверт | Зашифрованное сообщение для конкретного устройства | Не покидает телефон, пока не разделён на части |
| Фрагменты | Части одинакового размера с отпечатком квитанции | Содержимое, отправителя, реальный размер |
| Узлы | Непрозрачные фрагменты, ящики текущего дня, квитанции | Кто отправил, кто получил, что внутри |
| Шлюз | Соединения и JSON-кадры, которые он пересылает | Содержимое; личности никогда не передаются в открытом виде |
| Блокчейн | Платежи, токены, заявки, квитанции, награды | Сообщения и кто с кем говорит |
Приложение
Приложение создаёт фразу восстановления, выводит из неё ключи (личность, кошелёк, ящик) и генерирует ключ устройства, который никогда не покидает телефон. Чаты хранятся в SQLite, зашифрованной SQLCipher; ключ лежит в Keychain с атрибутом WHEN_UNLOCKED_THIS_DEVICE_ONLY, поэтому не попадает в копии iCloud.
При отправке приложение:
- Подписывает содержимое ключом устройства.
- Запечатывает его для каждого устройства получателя и для твоих остальных устройств (чтобы история везде была одинаковой).
- Дополняет каждый конверт до фиксированного размера и делит на 5 фрагментов.
- Отправляет каждый фрагмент через свой узел в ящик получателя на текущий день.
Конверт
Конверт — это сообщение, зашифрованное для одного устройства. Формат:
[1 байт версия = 2][32 Б эфемерный ключ X25519][1088 Б kemCt ML-KEM-768][24 Б nonce][шифртекст]
Снаружи конверта нет ничего, что указывало бы на отправителя (запечатанный отправитель). Внутри — содержимое, подписанное устройством-отправителем, личность отправителя и подпись, связывающая это устройство с этой личностью. Подробнее — в разделе Криптография.
Фрагменты
Каждый конверт дополняется до блока фиксированного размера (2 КБ, 8 КБ, 32 КБ, 128 КБ, 512 КБ, 2 МБ или 8 МБ) и делится кодом Рида–Соломона 3 из 5: для восстановления хватит любых трёх частей. Каждая часть несёт отпечаток SHA-512 секрета своей квитанции. Подробнее — в разделе Фрагменты и квитанции.
Узлы
Узел — это программа на компьютере участника сообщества. Она выполняет три работы:
- Открывает мосты. Мост — это маршрут, который узел открывает и поддерживает между отправителями и ящиками: принимает части (становится carrier), хранит их и отдаёт, когда владелец открывает ящик (становится courier).
- Создаёт блоки. Полные узлы по очереди собирают блоки; целевое время хода — 2 секунды, реальный темп измеряется.
- Находит VEL. Каждую эпоху узел публикует сводную заявку о работе своих мостов; после выборочной проверки он находит свою долю VEL эпохи.
Есть полные узлы (компьютер, создают блоки) и лёгкие узлы (приложение на телефоне, только доставляют фрагменты). Для каждой части публичная жеребьёвка выбирает 3 кандидата, и приложение использует ближайший. См. Запусти узел.
Шлюз
Публичный шлюз (wss://velum.consultorabim.com/hub) — место встречи: узлы представляются, подписывая приветствие, приложения отправляют RPC-запросы, обозреватель получает блоки вживую. Шлюз только пересылает кадры; у него нет ни одного ключа, который позволил бы что-то прочитать.
Для устойчивости к блокировкам есть несколько шлюзов на разных доменах с ECH, узлы соединяются друг с другом напрямую (ws://host:7420/ws), а каждый узел объявляет свой адрес в блокчейне (endpoint). См. Устойчивость к блокировкам.
Приложение ──ws──▶ Шлюз /hub?role=client ──▶ выбранный узел (RPC) или напрямую: ws://узел:7420/ws?role=client
Узел ──ws──▶ Шлюз /hub?role=node ◀─▶ остальные узлы и напрямую между узлами: ?role=node
Сайт ──ws──▶ Шлюз /hub?role=watch ◀── блоки и статистика вживую
Блокчейн
Собственный блокчейн без внешних зависимостей. Он хранит:
- Балансы в VEL и в токенах, а также nonce каждого кошелька.
- Регистрации узлов, их уровень и баллы доставки.
- Заявки о работе (корни Меркла), выборочные проверки и награды.
- Цену оракула за каждую эпоху и баланс Резерва сети.
- Публичные псевдонимы (
name.register). - Токены, фонды токенов для узлов, заявки и сделки биржи.
- Аттестованные устройства (только хеш их ключа, без личности).
Он никогда не хранит сообщения, контакты, списки устройств и личности для чатов. См. Консенсус и блоки.
Что разделено и зачем
| Разделение | Зачем |
|---|---|
| Ключ личности ≠ ключ кошелька | Чтобы никто не мог связать твои чаты и платежи. |
| Свой ключ устройства на каждом аппарате | Чтобы отключить устройство, не пересоздавая аккаунт. |
| Отдельный ящик на каждый день и устройство | Чтобы узлы не могли отслеживать кого-то во времени. |
| Квитанция без подписи и адреса | Чтобы нахождение VEL не выдавало получателя. |