Czym jest Operator Private Channels?
Operator to zaufany podmiot z uprawnieniami on-chain, który łączy Solana
Mainnet z siecią prywatnych kanałów. Operatorzy są aprowizowani przez
admina instancji za pomocą AddOperator, co tworzy on-chain PDA Operator;
bez tego żadna strona nie może wywołać ReleaseFunds. W praktyce operator to
organizacja lub zespół prowadzący usługi monitorujące depozyty, mintujące
tokeny po stronie kanału, wykrywające wypłaty i rozliczające środki z powrotem
do Mainnet. Uruchomienie instancji zapewnia Twoim użytkownikom prywatne,
wysokoprzepustowe transfery niewidoczne na Solana Mainnet, natychmiastową
przepustowość bez opłat wykraczającą poza natywne TPS Solany
oraz kontrolowany dostęp przez RBAC.
Jeśli jesteś programistą integrującym się z istniejącą instancją Private Channels zamiast ją wdrażać, zacznij od Quickstart.
Przed Rozpoczęciem
Wymagania Wstępne
Przypnij te wersje na hoście, aby dopasować je do obrazów Docker:
- Docker Engine 26+ (macOS Apple Silicon: włącz "Docker VMM" w Ustawieniach -> Opcje maszyny wirtualnej)
- Node.js 24.7.0 i pnpm 10.15.1
- Solana CLI 3.1.13 (Agave)
- Rust 1.91.0
- Endpoint Yellowstone gRPC dla Devnet (dostępny od Helius, Triton, QuickNode)
Wymagania sieciowe i domyślne przypisania portów znajdziesz w
docs/TECHNICAL_REQUIREMENTS.md
w repozytorium.
Zainstaluj przypiętą wersję zestawu narzędzi Solana i rozgrzej pamięć podręczną SBF:
make install-toolchain
Usługi
Uruchomienie instancji Private Channels oznacza przejęcie pięciu bieżących obowiązków, z których każdy jest obsługiwany przez dedykowane kontenery w stosie Docker Compose:
- Indeksowanie Mainnet pod kątem depozytów -
indexer-solanamonitoruje Solana Mainnet pod kątem zdarzeńDepositprzez Yellowstone gRPC;operator-solanapobiera potwierdzone depozyty i mintuje równoważne saldo tokenów w sieci kanałów - Indeksowanie kanału pod kątem wypłat -
indexer-private-channelodpytuje kanał co sekundę w poszukiwaniu zdarzeń spalaniaWithdrawFundsi zapisuje oczekujące rekordy wypłat do bazy danych - Zwalnianie środków na Mainnet -
operator-private-channelpobiera oczekujące rekordy i wywołujeReleaseFundsw Programie Escrow z ważnym dowodem wykluczenia SMT - Zarządzanie korzeniem SMT -
operator-private-channelwywołujeResetSmtRootautomatycznie przy rotacji epok drzewa; sprawdzenie on-chainverify_smt_exclusion_proofto ostatnia linia obrony przed nieautoryzowanymi wypłatami - Uruchamianie bramy i usługi auth - brama jest jedynym publicznym
endpointem dla całego ruchu klientów; usługa auth (opcjonalna) wymusza
JWT/RBAC gdy ustawiono
JWT_SECRET
Pełny wykaz usług i przypisania portów znajdziesz w Dokumentacji konfiguracji.
Uwaga dotycząca bezpieczeństwa: Porty węzłów zapisu i odczytu są przypisane wyłącznie do pętli zwrotnej (
127.0.0.1), jednak kilka innych usług (brama, auth, metryki operatora, Grafana, Prometheus, cAdvisor) jest domyślnie publikowanych na wszystkich interfejsach sieciowych. Zapoznaj się z Dokumentacją konfiguracji w celu poznania pełnej tabeli portów i zabezpiecz je zaporą sieciową przed każdym publicznym wdrożeniem. RBAC obejmuje wyłącznie własne metody JSON-RPC bramy, a nie te pozostałe usługi.
Kontrola Dostępu: Otwarta vs. RBAC
Domyślnie brama akceptuje wszystkie połączenia bez wymagania tokenów. Aby włączyć
RBAC oparty na JWT, ustaw JWT_SECRET i uruchom stos z --profile auth. Zapoznaj
się z Uwierzytelnianie i Role po
pełną dokumentację konfiguracji, w tym informacje o aprowizacji roli operator
i rejestrowaniu portfeli użytkowników.
Jeśli włączasz auth, dodaj te zmienne do swojego środowiska przed uruchomieniem stosu:
JWT_SECRET=<openssl rand -hex 32> # must match on gateway and auth serviceAUTH_PORT=8903
Konfiguracja Środowiska
.env.devnet jest już śledzony w repozytorium z wypełnionymi domyślnymi
wartościami specyficznymi dla devnet; edytuj go bezpośrednio zamiast
regenerować z .env.example, co nadpisałoby te wartości domyślne.
Uzupełnij pozostałe wartości w trakcie wykonywania poniższych kroków wdrożenia;
niektóre są dostępne dopiero w trakcie wdrożenia. Sekrety umieszczaj w pliku
.env ignorowanym przez git; zmienne niesekretne w .env.devnet.
Sekrety – ustaw je natychmiast:
POSTGRES_PASSWORD=<openssl rand -hex 32>POSTGRES_REPLICATION_PASSWORD=<openssl rand -hex 32>
Zmienne uzyskiwane podczas wdrożenia:
ESCROW_INSTANCE_ID=<instance address - from Step 3>ADMIN_PRIVATE_KEY=<operator keypair as u8 array or base58 - from Step 4>DEVNET_RPC_URL=https://api.devnet.solana.comDEVNET_YELLOWSTONE_ENDPOINT=<your Yellowstone gRPC endpoint>INDEXER_YELLOWSTONE_TOKEN=<your Yellowstone auth token>
ADMIN_PRIVATE_KEY to wymagany własny sygnatariusz opłat usług off-chain,
niezwiązany z administratorem instancji on-chain z Kroku 3. Ten przewodnik
umieszcza keypair operatora wygenerowany w Kroku 4 w ADMIN_PRIVATE_KEY
i pozostawia opcjonalny OPERATOR_PRIVATE_KEY nieustawiony, dzięki czemu
sygnatariusz operatora korzysta z tego samego klucza. Nigdy nie umieszczaj
keypair administratora instancji na poziomie protokołu z Kroku 3
w żadnej z tych zmiennych.
Pełną dokumentację zmiennych środowiskowych znajdziesz w Konfiguracji.
Wdrożenie
Budowanie obrazów
make docker-devnet-build
To polecenie kompiluje wszystkie usługi Rust do współdzielonego obrazu Docker. Pierwsze budowanie zajmuje od 30 minut do godziny.
Konfiguracja Admin UI
Admin UI to narzędzie przeglądarkowe do tworzenia i konfigurowania instancji
escrow: narzędzie deweloperskie i administracyjne, a nie produkt skierowany do
użytkowników końcowych ani wymagany komponent runtime. Wszystkie operacje,
które wykonuje (CreateInstance, AllowMint, AddOperator), można również
uruchomić za pomocą skryptów CLI w repozytorium.
cd admin-uipnpm installecho "PRIVATE_CHANNEL_RPC_URL=http://localhost:8899" > .envpnpm dev # opens at http://localhost:5173
Tworzenie instancji escrow
- Ustaw portfel przeglądarki na Devnet i upewnij się, że masz Devnet SOL na opłaty
- W Admin UI kliknij Create New Instance i zatwierdź transakcję
- Skopiuj Instance Address i ustaw ją jako
ESCROW_INSTANCE_IDw.env.devnet
Alternatywnie użyj skryptu CLI:
cargo run --bin create_instance -- https://api.devnet.solana.com ./keypairs/admin.json
Generowanie keypair operatora
solana-keygen new -o operator-keypair.json -s --no-bip39-passphrasesolana-keygen pubkey operator-keypair.json
Ustaw zawartość keypair jako ADMIN_PRIVATE_KEY w swoim środowisku. Klucz
publiczny nie jest zmienną środowiskową; przekażesz go bezpośrednio jako
pubkey operatora w kroku "Konfiguracja instancji" poniżej.
Finalizacja zmiennych środowiskowych
Zaktualizuj .env.devnet o ESCROW_INSTANCE_ID, DEVNET_RPC_URL,
DEVNET_YELLOWSTONE_ENDPOINT i INDEXER_YELLOWSTONE_TOKEN. Sekrety
(POSTGRES_PASSWORD, POSTGRES_REPLICATION_PASSWORD, ADMIN_PRIVATE_KEY)
umieść w pliku .env ignorowanym przez git.
Jeśli zdecydowałeś się włączyć RBAC
(Kontrola Dostępu: Otwarta vs. RBAC), dodaj teraz również
JWT_SECRET i AUTH_PORT.
Uruchamianie wszystkich usług
Bez auth:
make docker-devnet-up
Z auth:
docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet --env-file .env --profile auth up -d
Compose wyłącza automatyczne ładowanie .env po przekazaniu dowolnej flagi
--env-file, dlatego końcowe --env-file .env jest wymagane. Bez niego
POSTGRES_PASSWORD, ADMIN_PRIVATE_KEY i JWT_SECRET (umieszczone
w .env powyżej) zostaną puste i stos nie uruchomi się poprawnie.
Uruchom usługi przed konfiguracją instancji. Indekser strumieniuje zdarzenia w czasie rzeczywistym, więc uruchomienie stosu jako pierwsze zapewnia, że
AllowMinti pierwszy depozyt zostaną zaindeksowane w kolejności bez potrzeby uzupełniania zaległości.
Konfiguracja instancji
Gdy stos działa, dodaj token do białej listy i zarejestruj operatora przez Admin UI:
- Allow Mint: Admin Functions -> Mint Management -> wprowadź adres mint -> Allow Mint
- Add Operator: Admin Functions -> Operator Management -> wprowadź pubkey operatora -> Add Operator
Lub przez CLI:
cargo run --bin add_operator -- \https://api.devnet.solana.com \./keypairs/admin.json \<INSTANCE_ID> \<OPERATOR_PUBKEY>
Ten przewodnik jest przeznaczony dla Solana devnet. Dla Mainnet:
- ID programów są kompilowane przez
declare_id!(): sprawdź, czy używasz właściwych ID Mainnet z repozytorium - Endpointy Yellowstone gRPC wymagają planu Mainnet; endpointy devnet nie będą strumieniować zdarzeń Mainnet
- Portfel operatora płaci opłaty SOL za każde wywołanie
ReleaseFunds, więc dostosuj saldo SOL do oczekiwanego wolumenu wypłat - Zmień wszystkie domyślne dane uwierzytelniające (Grafana, PostgreSQL) przed każdym publicznym wdrożeniem
Operacje
Przydatne Polecenia
# View logs (all services)make docker-devnet-logs# View logs (specific service)docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f indexer-solana# Stop servicesmake docker-devnet-down# Stop and wipe all state (volumes)make docker-devnet-clean
Obserwowalność
Stos zawiera Prometheus, Grafana i cAdvisor do monitorowania metryk
i kontenerów. Grafana jest dostępna na porcie 37429.
Domyślne hasło Grafana to admin. Zmień je przed udostępnieniem portu 37429
jakiejkolwiek sieci poza localhost.
Rozwiązywanie Problemów
Saldo kanału nie aktualizuje się po depozycie
- Potwierdź, że transakcja depozytu na Mainnet pojawiła się w eksploratorze Mainnet
- Zweryfikuj, czy
indexer-solanadziała:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f indexer-solana - Zweryfikuj, czy
operator-solanadziała:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f operator-solana - Sprawdź, czy Twój endpoint Yellowstone gRPC jest osiągalny i token jest ważny
(
DEVNET_YELLOWSTONE_ENDPOINT,INDEXER_YELLOWSTONE_TOKEN) - Poczekaj do 30 sekund po potwierdzeniu on-chain, ponieważ indekser stosuje opóźnienie bezpieczeństwa finalizacji przed zaksięgowaniem środków
Wypłata nie jest rozliczana na Mainnet
- Zweryfikuj, czy
indexer-private-channeldziała:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f indexer-private-channel - Zweryfikuj, czy
operator-private-channeldziała:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f operator-private-channel - Potwierdź, że keypair operatora w
ADMIN_PRIVATE_KEYodpowiada kluczowi zarejestrowanemu przezAddOperatoron-chain - Jeśli logi pokazują "SMT root mismatch", usługa wyłącza się zamiast przesłać nieprawidłowy dowód. Zatrzymaj stos, przywróć spójny stan i uruchom ponownie
Błędy uwierzytelniania JWT (401 na wszystkich żądaniach)
- Potwierdź, że
JWT_SECRETjest identyczny w kontenerach bramy i usługi auth - Potwierdź, że stos został uruchomiony z
--profile auth - Tokeny wygasają po 24 godzinach; uwierzytelnij się ponownie, aby uzyskać nowy token
Pierwsze budowanie trwa zbyt długo
To oczekiwane. Pierwsze make docker-devnet-build kompiluje wszystkie usługi
Rust i może zająć 30–60 minut na typowym sprzęcie. Kolejne budowania korzystają
z pamięci podręcznej warstw Docker i są znacznie szybsze.
Następne Kroki
Quickstart
Przetestuj swoje wdrożenie: dokonaj depozytu, transferu i wypłaty na devnet.
Konfiguracja
Pełna dokumentacja zmiennych środowiskowych dla wszystkich usług.
Uwierzytelnianie i Role
Skonfiguruj uwierzytelnianie JWT i udostępnij użytkowników z rolą operatora.
Instrukcje
Pełna dokumentacja wszystkich instrukcji on-chain.
Is this page helpful?