Apa itu Operator Private Channels?
Operator adalah entitas tepercaya yang memiliki izin on-chain dan berfungsi sebagai jembatan antara Solana Mainnet dengan jaringan channel privat. Operator disediakan oleh admin instance melalui AddOperator, yang membuat PDA Operator on-chain; tanpa ini, tidak ada pihak yang dapat memanggil ReleaseFunds. Dalam praktiknya, operator adalah organisasi atau tim yang menjalankan layanan untuk memantau deposit, mencetak token sisi channel, mendeteksi penarikan, dan menyelesaikan dana kembali ke Mainnet. Menjalankan sebuah instance memberikan pengguna Anda transfer privat bervolume tinggi yang tidak muncul di Solana Mainnet, throughput instan tanpa biaya di luar TPS native Solana, serta akses terkontrol melalui RBAC.
Jika Anda adalah developer yang mengintegrasikan instance Private Channels yang sudah ada, bukan mendeploy instance baru, mulailah dengan Quickstart.
Sebelum Memulai
Prasyarat
Sematkan versi-versi ini pada host agar sesuai dengan image Docker:
- Docker Engine 26+ (macOS Apple Silicon: aktifkan "Docker VMM" di Settings -> Virtual Machine Options)
- Node.js 24.7.0 dan pnpm 10.15.1
- Solana CLI 3.1.13 (Agave)
- Rust 1.91.0
- Endpoint Yellowstone gRPC untuk Devnet (tersedia dari Helius, Triton, QuickNode)
Untuk kebutuhan jaringan dan penetapan port default, lihat
docs/TECHNICAL_REQUIREMENTS.md
di repositori.
Instal toolchain Solana yang telah disematkan dan panaskan cache SBF:
make install-toolchain
Layanan
Menjalankan instance Private Channels berarti mengelola lima tanggung jawab berkelanjutan, masing-masing ditangani oleh container khusus dalam stack Docker Compose:
- Indeks Mainnet untuk deposit -
indexer-solanamemantau Solana Mainnet untuk eventDepositmelalui Yellowstone gRPC;operator-solanamengambil deposit yang telah dikonfirmasi dan mencetak saldo token setara di jaringan channel - Indeks channel untuk penarikan -
indexer-private-channelmelakukan polling channel setiap detik untuk event burnWithdrawFundsdan menulis catatan penarikan yang tertunda ke database - Lepaskan dana di Mainnet -
operator-private-channelmengambil catatan yang tertunda dan memanggilReleaseFundspada Escrow Program dengan bukti eksklusi SMT yang valid - Kelola root SMT -
operator-private-channelmemanggilResetSmtRootsecara otomatis saat epoch tree berotasi; pemeriksaanverify_smt_exclusion_proofon-chain adalah pertahanan terakhir terhadap penarikan yang tidak sah - Jalankan gateway dan layanan auth - gateway adalah satu-satunya endpoint publik
untuk semua lalu lintas klien; layanan auth (opsional) memberlakukan
JWT/RBAC saat
JWT_SECRETdiatur
Untuk inventaris layanan lengkap dan penetapan port, lihat Referensi Konfigurasi.
Catatan keamanan: Port write-node dan read-node terikat ke loopback (
127.0.0.1) saja, tetapi beberapa layanan lain (gateway, auth, metrik operator, Grafana, Prometheus, cAdvisor) dipublikasikan ke semua antarmuka jaringan secara default. Lihat Referensi Konfigurasi untuk tabel port lengkap dan amankan dengan firewall sebelum deployment yang menghadap publik. RBAC hanya mencakup metode JSON-RPC milik gateway itu sendiri, bukan layanan-layanan lain ini.
Kontrol Akses: Terbuka vs. RBAC
Secara default gateway menerima semua koneksi; tidak ada token yang diperlukan. Untuk mengaktifkan
RBAC berbasis JWT, atur JWT_SECRET dan mulai stack dengan --profile auth. Lihat
Autentikasi & Peran untuk
referensi konfigurasi lengkap, termasuk cara menyediakan peran operator dan
mendaftarkan wallet pengguna.
Jika mengaktifkan auth, tambahkan ini ke environment Anda sebelum memulai stack:
JWT_SECRET=<openssl rand -hex 32> # must match on gateway and auth serviceAUTH_PORT=8903
Pengaturan Environment
.env.devnet sudah terlacak di repositori dengan nilai default khusus devnet
yang telah diisi; edit langsung alih-alih membuatnya ulang dari .env.example,
karena hal itu akan menimpa nilai default tersebut.
Isi nilai-nilai yang tersisa saat Anda mengikuti langkah-langkah deploy di bawah; beberapa
hanya tersedia di tengah proses deployment. Secrets dimasukkan ke file .env yang di-gitignore;
variabel non-secret dimasukkan ke .env.devnet.
Secrets - atur segera:
POSTGRES_PASSWORD=<openssl rand -hex 32>POSTGRES_REPLICATION_PASSWORD=<openssl rand -hex 32>
Variabel yang diperoleh saat deployment:
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 adalah penanda tangan fee-payer yang diperlukan oleh layanan off-chain,
tidak terkait dengan admin instance on-chain dari Langkah 3. Panduan ini menempatkan
keypair operator yang dibuat di Langkah 4 berikut ke dalam ADMIN_PRIVATE_KEY dan
membiarkan OPERATOR_PRIVATE_KEY opsional tidak diatur, sehingga penanda tangan operator
menggunakan kunci yang sama. Jangan pernah memasukkan keypair admin instance level protokol dari
Langkah 3 ke dalam salah satu variabel tersebut.
Untuk referensi variabel environment lengkap, lihat Konfigurasi.
Deploy
Build image
make docker-devnet-build
Perintah ini mengompilasi semua layanan Rust ke dalam satu image Docker bersama. Build pertama membutuhkan waktu 30 menit hingga satu jam.
Siapkan Admin UI
Admin UI adalah alat berbasis browser untuk membuat dan mengonfigurasi instance escrow:
sebuah utilitas pengembangan dan administrasi, bukan produk yang menghadap pengguna
dan bukan komponen runtime yang wajib ada. Semua operasi yang dilakukannya
(CreateInstance, AllowMint, AddOperator) juga dapat dijalankan melalui skrip CLI
di repositori.
cd admin-uipnpm installecho "PRIVATE_CHANNEL_RPC_URL=http://localhost:8899" > .envpnpm dev # opens at http://localhost:5173
Buat instance escrow
- Atur wallet browser Anda ke Devnet dan pastikan Anda memiliki SOL Devnet untuk biaya
- Di Admin UI, klik Create New Instance dan setujui transaksi
- Salin Instance Address dan atur sebagai
ESCROW_INSTANCE_IDdi.env.devnet
Sebagai alternatif, gunakan skrip CLI:
cargo run --bin create_instance -- https://api.devnet.solana.com ./keypairs/admin.json
Buat keypair operator
solana-keygen new -o operator-keypair.json -s --no-bip39-passphrasesolana-keygen pubkey operator-keypair.json
Atur isi keypair sebagai ADMIN_PRIVATE_KEY di environment Anda. Public key
bukan variabel environment; Anda akan meneruskannya langsung sebagai pubkey operator
pada langkah "Konfigurasi instance" di bawah.
Finalisasi variabel environment
Perbarui .env.devnet dengan ESCROW_INSTANCE_ID, DEVNET_RPC_URL,
DEVNET_YELLOWSTONE_ENDPOINT, dan INDEXER_YELLOWSTONE_TOKEN. Masukkan secrets
(POSTGRES_PASSWORD, POSTGRES_REPLICATION_PASSWORD, ADMIN_PRIVATE_KEY) ke
file .env yang di-gitignore.
Jika Anda memutuskan untuk mengaktifkan RBAC
(Kontrol Akses: Terbuka vs. RBAC), tambahkan juga
JWT_SECRET dan AUTH_PORT sekarang.
Mulai semua layanan
Tanpa auth:
make docker-devnet-up
Dengan auth:
docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet --env-file .env --profile auth up -d
Compose menonaktifkan auto-load .env otomatisnya setelah flag --env-file apa pun
diteruskan, sehingga --env-file .env di akhir diperlukan. Tanpanya,
POSTGRES_PASSWORD, ADMIN_PRIVATE_KEY, dan JWT_SECRET (yang Anda masukkan di
.env di atas) akan bernilai kosong dan stack gagal dimulai dengan benar.
Mulai layanan sebelum mengonfigurasi instance. Indexer melakukan streaming event secara real time, sehingga menjalankan stack terlebih dahulu memastikan
AllowMintdan deposit pertama Anda diindeks secara berurutan tanpa perlu backfill.
Konfigurasi instance
Dengan stack berjalan, whitelist token mint dan tambahkan operator Anda melalui Admin UI:
- Allow Mint: Admin Functions -> Mint Management -> masukkan alamat mint -> Allow Mint
- Add Operator: Admin Functions -> Operator Management -> masukkan pubkey operator -> Add Operator
Atau melalui CLI:
cargo run --bin add_operator -- \https://api.devnet.solana.com \./keypairs/admin.json \<INSTANCE_ID> \<OPERATOR_PUBKEY>
Panduan ini menargetkan devnet Solana. Untuk Mainnet:
- ID Program dikompilasi melalui
declare_id!(): pastikan Anda menggunakan ID Mainnet yang benar dari repositori - Endpoint Yellowstone gRPC memerlukan paket Mainnet; endpoint devnet tidak akan melakukan streaming event Mainnet
- Wallet operator membayar biaya SOL untuk setiap panggilan
ReleaseFunds, jadi sesuaikan saldo SOL dengan volume penarikan yang diharapkan - Ubah semua kredensial default (Grafana, PostgreSQL) sebelum deployment yang menghadap publik
Operasional
Perintah yang Berguna
# 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
Observabilitas
Stack ini mencakup Prometheus, Grafana, dan cAdvisor untuk metrik dan pemantauan container.
Grafana dapat diakses pada port 37429.
Password Grafana default adalah admin. Ubah sebelum mengekspos port 37429
ke jaringan apa pun di luar localhost.
Pemecahan Masalah
Saldo channel tidak diperbarui setelah deposit
- Konfirmasi transaksi deposit Mainnet telah tercatat di explorer Mainnet
- Verifikasi
indexer-solanasedang berjalan:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f indexer-solana - Verifikasi
operator-solanasedang berjalan:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f operator-solana - Periksa bahwa endpoint Yellowstone gRPC Anda dapat dijangkau dan token valid
(
DEVNET_YELLOWSTONE_ENDPOINT,INDEXER_YELLOWSTONE_TOKEN) - Tunggu hingga 30 detik setelah konfirmasi on-chain, karena indexer menerapkan penundaan keamanan finalitas sebelum mengkreditkan
Penarikan tidak diselesaikan ke Mainnet
- Verifikasi
indexer-private-channelsedang berjalan:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f indexer-private-channel - Verifikasi
operator-private-channelsedang berjalan:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f operator-private-channel - Konfirmasi keypair operator di
ADMIN_PRIVATE_KEYcocok dengan kunci yang terdaftar melaluiAddOperatoron-chain - Jika log menampilkan "SMT root mismatch", layanan akan berhenti daripada mengirimkan bukti yang tidak valid. Hentikan stack, pulihkan dari kondisi yang konsisten, dan mulai ulang
Kegagalan autentikasi JWT (401 pada semua permintaan)
- Konfirmasi
JWT_SECRETidentik pada container gateway maupun layanan auth - Konfirmasi stack dimulai dengan
--profile auth - Token kedaluwarsa setelah 24 jam; autentikasi ulang untuk mendapatkan token baru
Build pertama memakan waktu terlalu lama
Hal ini wajar. make docker-devnet-build pertama mengompilasi semua layanan Rust dan
dapat memakan waktu 30-60 menit pada perangkat keras umum. Build berikutnya menggunakan cache layer Docker
dan jauh lebih cepat.
Langkah Selanjutnya
Is this page helpful?