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

Что такое Singula

Singula — это сеть серверов, которые возят чужой трафик и получают за это деньги из смарт-контракта. Запустить сервер и зарабатывать может кто угодно. Написать клиент и пользоваться сетью — тоже. Разрешения ни у кого спрашивать не нужно.

Первое, что приходит в голову построить на такой сети, — VPN, и он уже есть. Но сам протокол проще: он выдаёт клиенту адрес сервера, считает секунды, которые сервер на клиента работал, и платит за них. Что клиент соберёт из выданных серверов — один хоп, цепочку или что-то своё, — решает клиент.

Звезда — участник сети, запись в контракте StarRegistry. У каждой звезды два адреса:

  • владелец — холодный кошелёк, на который приходят деньги. Он задаётся при регистрации и больше не меняется;
  • подписант — горячий ключ на сервере, которым звезда подписывает рабочие сообщения. Владелец может сменить его в любой момент.

Узел — звезда, которая возит трафик. На нём работает Xray с четырьмя входами REALITY, он принимает сессии и отчитывается перед Control Plane.

Control Plane — звезда с ролью CP. Трафик через неё не идёт. Она проверяет, что у клиента есть право на сессию, подбирает узел, передаёт запечатанные учётные данные, собирает отчёты и записывает отработанные секунды в блокчейн. Свои адреса Control Plane публикуют в CPEndpointRegistry, и клиент сам выбирает, к какому идти.

Клиент — всё, что говорит на протоколе. Wanderer, наше приложение для Windows, Linux и Android, — первая реализация, но никаких особых прав у него нет.

Одна программа на все роли. Программа star одинаковая на любом сервере: при запуске она находит себя в StarRegistry и включает то, что нужно её роли.

Orbit — подписка на сеть в виде NFT. Действует 30 дней с момента активации, а не покупки. При покупке вы выбираете число слотов, от 1 до 5: слот — одно одновременное подключение, то есть одно устройство или один хоп маршрута. Каждый слот стоит 10 sUSDC.

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

Для покупки не нужен ETH. Вы подписываете намерение EIP-712 и permit на токен, транзакцию отправляет GasStation, а её газ вы оплачиваете в USDC вместе с ценой.

Аккаунтов, логинов и API-ключей нет. Право на сессию клиент показывает одним из двух способов:

  • кошельком — подписывает короткий текст с именем Control Plane, и тот проверяет Orbit в блокчейне;
  • доказательством — доказывает с нулевым разглашением, что держит один из Orbit, зарегистрированных в SubscriberRegistry, не говоря какой. Control Plane узнаёт только то, что подключился какой-то подписчик.

Сеть платит за отработанное время, в USDC. Байты нужны только чтобы отличить работающий туннель от простаивающего, на сумму они не влияют.

Каждый Orbit делится так: 70% в пул узлов, 10% в казну DAO, 10% в ликвидность протокола, 5% в пул Control Plane и 5% основателю. Узлу платят фиксированную ставку за каждую засчитанную секунду, Control Plane — фиксированную сумму за каждую эпоху, пока он держит место. Сплит может поменять владелец контракта, текущие цифры возвращает SubscriptionNFT.getSplit().

Эпоха длится 24 часа. Когда она закрывается, можно вызвать claimNode и claimCp. Вызвать их может кто угодно: деньги всё равно уйдут владельцу звезды, записанному в реестре. Поэтому оператору не нужен ETH, чтобы получить выплату.

flowchart TB
    chain["Arbitrum<br/>SingulaProtocol · StarRegistry<br/>SubscriberRegistry · EpochAttestations"]
    client["Клиент<br/><i>сам выбирает маршрут</i>"]
    cp["Control Plane<br/><i>выдаёт сессии, собирает отчёты</i>"]
    node["Узел<br/><i>возит трафик</i>"]

    client -->|"подпись кошелька или ZK-доказательство"| cp
    cp -->|"PrepareSession"| node
    client ==>|"трафик — VLESS + REALITY"| node
    node -->|"heartbeat, подписанный интервал"| cp
    cp -->|"подписанные интервалы"| chain
    chain -.->|"адреса, роли, часы эпох"| client

Трафик идёт от клиента прямо к узлу. Control Plane на этом пути не стоит.

Сейчас идёт открытая альфа в Arbitrum Sepolia, chain id 421614. Платят в sUSDC — тестовом токене с 18 знаками, настоящих денег в игре нет.

Запомнить стоит один адрес, всё остальное читается из него:

SingulaProtocol 0xC7aA88375cE5B1d43768EA0545069CB294Fc2992

Вызов snapshot() на этом контракте возвращает текущую эпоху, её параметры и адреса всех остальных контрактов.

Хотите запустить сервер — запуск узла: один контейнер и одна транзакция. Если у вас уже есть роль Control Plane — запуск Control Plane.

Пишете клиент — начните с главы собрать клиент, подробности в gRPC API и справочнике API. Для сессий без кошелька — анонимный доступ и построение доказательства.

Делаете продукт на сети — построить на Singula: своё устройство, которое само держит Orbit.

Прикидываете, подходит ли вам сеть — кто что видит и ограничения.

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

Если что-то здесь расходится с тем, что вы видите в сети, напишите нам.