Интеграция с Mysterium Network
Конкретная ситуация: вы строите приложение, которому нужен децентрализованный VPN или residential proxy — без единого провайдера, без KYC на пользователей, с оплатой в крипте. Mysterium Network — это p2p сеть из ~13k нод, где любой может продавать трафик за MYST токены. Для разработчика задача не в том, чтобы "подключиться к VPN", а в том, чтобы встроить Mysterium в своё приложение как программируемый транспортный слой.
Архитектура Mysterium: что под капотом
Mysterium работает поверх нескольких протоколов:
- Wireguard — основной протокол для VPN-подключений (UDP, быстрый, широко поддерживается)
- OpenVPN — legacy, поддерживается для совместимости
- NATS — брокер сообщений для discovery и signaling между нодами
- Hermes — payment settlement смарт-контракт на Polygon (ранее был на Ethereum)
Ключевой компонент для разработчика — mysterium-vpn-js SDK (TypeScript) и myst-provider API (REST HTTP сервер, который запускается вместе с нодой).
Программная работа с Mysterium через SDK
Запуск и подключение к ноде
import { TequilapiClientFactory, NodeHttpTransport } from "mysterium-vpn-js";
const factory = new TequilapiClientFactory(
"http://127.0.0.1:4050", // tequilapi — REST API ноды
5000 // timeout ms
);
const api = factory.build(NodeHttpTransport());
// Проверка состояния ноды
const nodeInfo = await api.healthCheck();
console.log("Node version:", nodeInfo.version);
// Список доступных провайдеров (выборка из Discovery)
const proposals = await api.findProposals({
serviceType: "wireguard", // или "openvpn"
qualityMin: 0.9, // фильтр по quality score (0-1)
locationCountry: "DE", // страна выходной ноды
});
Создание и управление сессией
// Identity — ваш "кошелёк" в сети Mysterium
const identities = await api.identityList();
if (identities.length === 0) {
const identity = await api.identityCreate("your_passphrase");
await api.identityRegister(identity.id, {
token: undefined, // referral token опционален
});
}
const identity = identities[0];
// Убеждаемся что identity зарегистрирован on-chain
const status = await api.identityStatus(identity.id);
if (status.registrationStatus !== "Registered") {
// Нужно пополнить баланс MYST для оплаты регистрации
throw new Error("Identity not registered");
}
// Подключение к выбранному провайдеру
const connection = await api.connectionCreate({
consumerId: identity.id,
providerId: proposals[0].providerId,
serviceType: "wireguard",
connectOptions: {
dnsOption: "auto", // или конкретный DNS сервер
}
});
console.log("Session ID:", connection.sessionId);
console.log("Status:", connection.status); // "Connected"
Мониторинг сессии и статистика
// Текущее состояние подключения
const stats = await api.connectionStatistics();
console.log({
bytesSent: stats.bytesSent,
bytesReceived: stats.bytesReceived,
tokensSpent: stats.tokensSpent, // потрачено MYST
duration: stats.duration, // секунды
});
// Текущий IP (для верификации что трафик идёт через ноду)
const location = await api.connectionLocation();
console.log("Exit IP:", location.ip, "Country:", location.country);
// Отключение
await api.connectionCancel();
Payment интеграция: MYST на Polygon
Mysterium использует payment channels через Hermes контракт на Polygon. Это не прямые on-chain транзакции за каждый мегабайт — это off-chain micropayments, которые settlement происходит периодически.
Пополнение баланса
// Получить адрес для пополнения баланса consumer identity
const channelAddress = await api.paymentOrderGetChannelAddress(
identity.id
);
// channelAddress — это Polygon адрес, на него отправляем MYST
// Создание order через встроенный шлюз (если хотим on-ramp через карту)
const order = await api.paymentOrderCreate(identity.id, {
mystAmount: "10.0",
payCurrency: "USD",
gateway: "coingate", // или "paypal"
country: "US",
callerData: "{}",
});
console.log("Payment URL:", order.publicGatewayData.paymentUrl);
Для programmatic use case (ваше приложение само пополняет балансы пользователей) — прямой transfer MYST на Polygon через ethers.js:
import { ethers } from "ethers";
const MYST_POLYGON = "0x1379e8886a0d08c7902c843f5c6353d3e8e99a18";
const mystContract = new ethers.Contract(MYST_POLYGON, ERC20_ABI, signer);
// channelAddress — адрес из api.paymentOrderGetChannelAddress()
await mystContract.transfer(channelAddress, ethers.parseUnits("10", 18));
Собственный Discovery Service
По умолчанию Mysterium node использует централизованный Discovery сервис Mysterium Foundation для поиска провайдеров. Для enterprise использования или собственной закрытой сети — нужен свой Discovery.
Mysterium использует NATS как discovery broker. Можно развернуть self-hosted:
# docker-compose.yml для self-hosted discovery
version: '3.8'
services:
nats:
image: nats:2.9-alpine
ports:
- "4222:4222"
- "8222:8222" # monitoring
command: "--jetstream --cluster_name mysterium-private"
discovery:
image: mysteriumnetwork/discovery:latest
environment:
- NATS_URL=nats://nats:4222
- BROKER_ADDRESS=nats://nats:4222
depends_on:
- nats
Ноды в вашей частной сети конфигурируются с --discovery.address указывающим на ваш NATS.
Типичные сценарии применения
Decentralized proxy для web scraping — вместо rotating residential proxies от Oxylabs/Brightdata, используете Mysterium ноды. Стоимость в 3–10x ниже, но reliability варьируется (p2p сеть ≠ enterprise SLA).
Privacy-preserving API вызовы — мобильное приложение делает запросы к внешним API через Mysterium, скрывая IP пользователя от сервиса назначения.
Geo-distributed тестирование — тестирование приложения из разных геолокаций программно, без аренды VPS в каждом регионе.
Ограничения, которые нужно учитывать: Mysterium не даёт гарантий bandwidth или uptime от конкретной ноды. Для приложений с требованиями к latency <100ms — p2p VPN не оптимальный выбор. Нужен fallback mechanism и логика переключения между провайдерами.
Базовая интеграция через mysterium-vpn-js в существующее приложение: 2–3 недели. Полная с биллингом, нодой под управлением вашего бэкенда и custom discovery: 6–10 недель.







