Архитектура

В Velum шесть слоёв. Каждый знает ровно столько, сколько нужно для своей работы, и не больше.

Слои

Слой Видит Не видит
Приложение Твои сообщения в открытом виде, контакты, фразу восстановления Ничего о других пользователях
Конверт Зашифрованное сообщение для конкретного устройства Не покидает телефон, пока не разделён на части
Фрагменты Части одинакового размера с отпечатком квитанции Содержимое, отправителя, реальный размер
Узлы Непрозрачные фрагменты, ящики текущего дня, квитанции Кто отправил, кто получил, что внутри
Шлюз Соединения и JSON-кадры, которые он пересылает Содержимое; личности никогда не передаются в открытом виде
Блокчейн Платежи, токены, заявки, квитанции, награды Сообщения и кто с кем говорит

Приложение

Приложение создаёт фразу восстановления, выводит из неё ключи (личность, кошелёк, ящик) и генерирует ключ устройства, который никогда не покидает телефон. Чаты хранятся в SQLite, зашифрованной SQLCipher; ключ лежит в Keychain с атрибутом WHEN_UNLOCKED_THIS_DEVICE_ONLY, поэтому не попадает в копии iCloud.

При отправке приложение:

  1. Подписывает содержимое ключом устройства.
  2. Запечатывает его для каждого устройства получателя и для твоих остальных устройств (чтобы история везде была одинаковой).
  3. Дополняет каждый конверт до фиксированного размера и делит на 5 фрагментов.
  4. Отправляет каждый фрагмент через свой узел в ящик получателя на текущий день.

Конверт

Конверт — это сообщение, зашифрованное для одного устройства. Формат:

[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 не выдавало получателя.