Почему это протокол
Ниже четыре свойства сети. Каждое можно проверить по контрактам и 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 взаимозаменяемы
Заголовок раздела «Control Plane взаимозаменяемы»Список 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 нельзя защитить тем, что о нём никто не знает: что не проверяется явно, не проверяется вообще. Поэтому прежде чем писать код, прочитайте, что требует подписи, а что нет.
И раз маршрут выбирает клиент, за качество маршрута тоже отвечает клиент. Сеть отвечает за то, что узел доступен, но не за то, разумную ли цепочку вы из узлов собрали.
