Перейти к содержимому

Почему это протокол

Ниже четыре свойства сети. Каждое можно проверить по контрактам и API, а не верить на слово.

В протоколе нет понятия «число хопов». В SessionRequest есть только один флаг, chained, и означает он одно: «я приду к этому узлу через что-то ещё, выдай учётные данные без XTLS Vision». Vision работает только по прямому TCP-соединению и через промежуточный прокси не проходит.

Через что именно клиент придёт, сеть не знает. Клиент берёт сессию у одного Control Plane, сессию у другого и сам соединяет их у себя. Между ними он может поставить что угодно: задержку, перемешивание, ещё хопы.

Так получается потому, что работа Control Plane заканчивается на одном узле. Он даёт доступ к нему и на этом всё.

Вот всё, что попадает в блокчейн об отработанном времени:

struct PushItem {
uint64 node; // чей узел
uint64 cp; // на какой Control Plane он работал
uint64 fromTs; // с какого момента
uint64 delta; // сколько секунд
bytes32 session; // какая сессия, хешем
bytes32 permission; // какое разрешение за неё заплатило
bytes sig; // подпись узла
}

Ни байтов, ни адресов назначения, ни объёмов. Сеть платит за время, которое узел работал, и больше ни за что. Счётчики байтов остаются на Control Plane, и нужны они ему для одного: отличить работающий туннель от простаивающего.

Два хеша ничего не говорят за пределами сети. Идентификатор сессии — случайный UUID. Дайджест разрешения — односторонний, а само разрешение клиент придумал сам и получил под слепую подпись, которую издатель не видел.

Раз содержимое трафика на выплату не влияет, сети незачем его разбирать, и ничего для этого в ней нет. Объём тоже не оценивается, так что мерить его точнее, чем нужно для проверки простоя, никому не выгодно.

Список Control Plane лежит в CPEndpointRegistry, и прочитать его может кто угодно. Клиент сам опрашивает их, выбирает быстрый и уходит к другому, если тот перестал отвечать. Главного входа в сеть нет.

Control Plane работают федерацией. Сессия, открытая через один, может ехать на узле другого, отчёты расходятся между ними, а если Control Plane упал, отработанное его узлами время в блокчейн отправит сосед.

Одна часть пока не открыта: на стадии теста роль CP выдаёт основатель вручную. Дальше звезда будет получать её, внеся стейк, по правилам, которые устанавливает DAO; см. как стать Control Plane.

Аккаунт не скрыт — его просто негде хранить.

То, что Control Plane помнит о сессии, живёт столько же, сколько сама сессия: какой узел её обслуживает, когда она истекает, последние итоги байт из чекпоинтов и кто её открыл — кошелёк на кошельковом уровне, случайная метка на анонимном. Ещё он держит ключ, которым по сессии можно отчитываться, и разрешение, на котором она идёт:

type SessionBinding struct {
CheckpointPublicKey []byte // ed25519, 32 байта
PermissionDigest []byte // односторонний, или nil
PermissionWindow uint64 // окно, которому принадлежит это разрешение
}

Ни логина, ни профиля, ни истории. Обе записи уходят вместе с сессией: привязка удаляется, когда сессия закончилась, а если этого не случилось, истекает через 48 часов после последней записи. Сами чекпоинты, каждый со своими итогами байт, хранятся четыре часа, чтобы отчёт клиента можно было сверить с отчётом узла, и потом истекают. В блокчейн ничего из этого не попадает.

API-ключей нет. Ключ пришлось бы выдавать, хранить, уметь отзывать и кому-то отказывать, и каждый из этих шагов собирает список пользователей. Право на сессию показывают подписью или доказательством, а они следов не оставляют.

Одно и то же право можно показать двумя разными способами — подписью кошелька или доказательством принадлежности, где кошелька нет вовсе. Это возможно именно потому, что право не привязано к аккаунту.

Сам Orbit — токен на предъявителя. До активации его можно передавать, неактивированных на одном адресе может быть до десяти. После активации он привязывается к владельцу и начинает отсчитывать свои тридцать дней. Купить Orbit и подарить — обычное дело.

Открытый API нельзя защитить тем, что о нём никто не знает: что не проверяется явно, не проверяется вообще. Поэтому прежде чем писать код, прочитайте, что требует подписи, а что нет.

И раз маршрут выбирает клиент, за качество маршрута тоже отвечает клиент. Сеть отвечает за то, что узел доступен, но не за то, разумную ли цепочку вы из узлов собрали.