Τι είναι ένας Operator του Private Channels;
Ένας operator είναι μια αξιόπιστη οντότητα με άδεια on-chain που γεφυρώνει το Solana
Mainnet και το δίκτυο ιδιωτικών καναλιών. Οι operators προβλέπονται από τον
διαχειριστή της παρουσίας μέσω του AddOperator, το οποίο δημιουργεί ένα on-chain Operator PDA·
χωρίς αυτό, κανένα μέρος δεν μπορεί να καλέσει το ReleaseFunds. Στην πράξη, ένας operator είναι ένας
οργανισμός ή ομάδα που εκτελεί τις υπηρεσίες που παρακολουθούν καταθέσεις, κόβουν
τokens στην πλευρά του καναλιού, εντοπίζουν αναλήψεις και διακανονίζουν κεφάλαια πίσω στο Mainnet.
Η εκτέλεση μιας παρουσίας παρέχει στους χρήστες σας ιδιωτικές μεταφορές μεγάλου όγκου που δεν
εμφανίζονται στο Solana Mainnet, άμεση ροή χωρίς τέλη που υπερβαίνει το εγγενές Solana TPS,
και ελεγχόμενη πρόσβαση μέσω RBAC.
Αν είστε developer που ενσωματώνετε μια υπάρχουσα παρουσία Private Channels αντί να αναπτύσσετε μια νέα, ξεκινήστε με το Quickstart.
Πριν Ξεκινήσετε
Προαπαιτούμενα
Καρφιτσώστε αυτές τις εκδόσεις στον host ώστε να ταιριάζουν με τις Docker images:
- Docker Engine 26+ (macOS Apple Silicon: ενεργοποιήστε το "Docker VMM" στις Ρυθμίσεις -> Virtual Machine Options)
- Node.js 24.7.0 και pnpm 10.15.1
- Solana CLI 3.1.13 (Agave)
- Rust 1.91.0
- Ένα Yellowstone gRPC endpoint για το Devnet (διαθέσιμο από Helius, Triton, QuickNode)
Για τις απαιτήσεις δικτύου και τις προεπιλεγμένες αναθέσεις θυρών, δείτε
docs/TECHNICAL_REQUIREMENTS.md
στο αποθετήριο.
Εγκαταστήστε την καρφιτσωμένη αλυσίδα εργαλείων Solana και προθερμάνετε την προσωρινή μνήμη SBF:
make install-toolchain
Υπηρεσίες
Η εκτέλεση μιας παρουσίας Private Channels σημαίνει ότι αναλαμβάνετε πέντε συνεχείς υπευθυνότητες, καθεμία από τις οποίες διαχειρίζεται ειδικά containers στο Docker Compose stack:
- Ευρετηρίαση Mainnet για καταθέσεις - το
indexer-solanaπαρακολουθεί το Solana Mainnet για συμβάνταDepositμέσω Yellowstone gRPC· τοoperator-solanaπαραλαμβάνει επιβεβαιωμένες καταθέσεις και κόβει το αντίστοιχο υπόλοιπο token στο δίκτυο καναλιών - Ευρετηρίαση καναλιού για αναλήψεις - το
indexer-private-channelελέγχει το κανάλι κάθε δευτερόλεπτο για συμβάντα burnWithdrawFundsκαι γράφει εκκρεμείς εγγραφές ανάληψης στη βάση δεδομένων - Αποδέσμευση κεφαλαίων στο Mainnet - το
operator-private-channelπαραλαμβάνει εκκρεμείς εγγραφές και καλεί τοReleaseFundsστο Escrow Program με έγκυρη απόδειξη αποκλεισμού SMT - Διαχείριση του SMT root - το
operator-private-channelκαλεί τοResetSmtRootαυτόματα όταν γίνεται εναλλαγή epoch του δέντρου· ο on-chain έλεγχοςverify_smt_exclusion_proofείναι η τελευταία γραμμή άμυνας κατά μη εξουσιοδοτημένων αναλήψεων - Εκτέλεση gateway και υπηρεσίας auth - το gateway είναι το μοναδικό δημόσιο
endpoint για όλη την κίνηση clients· η υπηρεσία auth (προαιρετική) επιβάλλει
JWT/RBAC όταν έχει οριστεί το
JWT_SECRET
Για το πλήρες ευρετήριο υπηρεσιών και τις αναθέσεις θυρών, δείτε την Αναφορά Διαμόρφωσης.
Σημείωση ασφαλείας: Οι θύρες write-node και read-node δεσμεύονται μόνο στο loopback (
127.0.0.1), αλλά αρκετές άλλες υπηρεσίες (gateway, auth, μετρικά operator, Grafana, Prometheus, cAdvisor) δημοσιεύονται σε όλες τις διεπαφές δικτύου από προεπιλογή. Δείτε την Αναφορά Διαμόρφωσης για τον πλήρη πίνακα θυρών και προστατέψτε τις με τείχος προστασίας πριν από οποιαδήποτε δημόσια ανάπτυξη. Το RBAC καλύπτει μόνο τις δικές του μεθόδους JSON-RPC του gateway, όχι αυτές τις άλλες υπηρεσίες.
Έλεγχος Πρόσβασης: Ανοιχτός vs. RBAC
Από προεπιλογή το gateway δέχεται όλες τις συνδέσεις· δεν απαιτούνται tokens. Για να ενεργοποιήσετε
RBAC βάσει JWT, ορίστε το JWT_SECRET και εκκινήστε το stack με --profile auth. Δείτε
Πιστοποίηση & Ρόλοι για την
πλήρη αναφορά διαμόρφωσης, συμπεριλαμβανομένου του τρόπου παροχής του ρόλου operator και
καταχώρισης των wallets χρηστών.
Αν ενεργοποιείτε το auth, προσθέστε τα παρακάτω στο περιβάλλον σας πριν εκκινήσετε το stack:
JWT_SECRET=<openssl rand -hex 32> # must match on gateway and auth serviceAUTH_PORT=8903
Ρύθμιση Περιβάλλοντος
Το .env.devnet παρακολουθείται ήδη στο αποθετήριο με προεπιλεγμένες τιμές ειδικές για devnet
συμπληρωμένες· επεξεργαστείτε το απευθείας αντί να το αναδημιουργήσετε από το .env.example,
κάτι που θα αντικαθιστούσε αυτές τις προεπιλογές.
Συμπληρώστε τις υπόλοιπες τιμές καθώς εργάζεστε στα βήματα ανάπτυξης παρακάτω· ορισμένες
είναι διαθέσιμες μόνο στη μέση της ανάπτυξης. Τα secrets πηγαίνουν στο gitignored αρχείο .env·
οι μη εμπιστευτικές μεταβλητές πηγαίνουν στο .env.devnet.
Secrets - ορίστε τα αμέσως:
POSTGRES_PASSWORD=<openssl rand -hex 32>POSTGRES_REPLICATION_PASSWORD=<openssl rand -hex 32>
Μεταβλητές που λαμβάνονται κατά την ανάπτυξη:
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 είναι ο απαραίτητος υπογράφων fee-payer των off-chain υπηρεσιών,
άσχετο με τον on-chain διαχειριστή παρουσίας από το Βήμα 3. Αυτός ο οδηγός τοποθετεί το
keypair του operator που δημιουργείται στο Βήμα 4 παρακάτω στο ADMIN_PRIVATE_KEY και
αφήνει το προαιρετικό OPERATOR_PRIVATE_KEY χωρίς τιμή, ώστε ο υπογράφων operator να χρησιμοποιεί
το ίδιο κλειδί. Μην τοποθετείτε ποτέ το keypair διαχειριστή παρουσίας σε επίπεδο πρωτοκόλλου από
το Βήμα 3 σε καμία από τις δύο μεταβλητές.
Για την πλήρη αναφορά μεταβλητών περιβάλλοντος, δείτε Διαμόρφωση.
Ανάπτυξη
Δημιουργία images
make docker-devnet-build
Αυτό μεταγλωττίζει όλες τις υπηρεσίες Rust σε μια κοινή Docker image. Η πρώτη δημιουργία διαρκεί 30 λεπτά έως μία ώρα.
Ρύθμιση του Admin UI
Το Admin UI είναι ένα εργαλείο βασισμένο σε browser για τη δημιουργία και διαμόρφωση της παρουσίας escrow:
ένα βοηθητικό πρόγραμμα ανάπτυξης και διαχείρισης, όχι ένα προϊόν που απευθύνεται στον χρήστη
και όχι απαραίτητο στοιχείο runtime. Όλες οι λειτουργίες που εκτελεί
(CreateInstance, AllowMint, AddOperator) μπορούν επίσης να εκτελεστούν μέσω των scripts CLI
στο αποθετήριο.
cd admin-uipnpm installecho "PRIVATE_CHANNEL_RPC_URL=http://localhost:8899" > .envpnpm dev # opens at http://localhost:5173
Δημιουργία παρουσίας escrow
- Ορίστε το wallet του browser σας σε Devnet και βεβαιωθείτε ότι διαθέτετε Devnet SOL για τέλη
- Στο Admin UI, κάντε κλικ στο Create New Instance και εγκρίνετε τη συναλλαγή
- Αντιγράψτε τη Διεύθυνση Παρουσίας και ορίστε την ως
ESCROW_INSTANCE_IDστο.env.devnet
Εναλλακτικά, χρησιμοποιήστε το script CLI:
cargo run --bin create_instance -- https://api.devnet.solana.com ./keypairs/admin.json
Δημιουργία keypair operator
solana-keygen new -o operator-keypair.json -s --no-bip39-passphrasesolana-keygen pubkey operator-keypair.json
Ορίστε τα περιεχόμενα του keypair ως ADMIN_PRIVATE_KEY στο περιβάλλον σας. Το δημόσιο
κλειδί δεν είναι μεταβλητή περιβάλλοντος· θα το περάσετε απευθείας ως operator
pubkey στο βήμα "Διαμόρφωση της παρουσίας" παρακάτω.
Οριστικοποίηση μεταβλητών περιβάλλοντος
Ενημερώστε το .env.devnet με ESCROW_INSTANCE_ID, DEVNET_RPC_URL,
DEVNET_YELLOWSTONE_ENDPOINT, και INDEXER_YELLOWSTONE_TOKEN. Τοποθετήστε τα secrets
(POSTGRES_PASSWORD, POSTGRES_REPLICATION_PASSWORD, ADMIN_PRIVATE_KEY) στο
gitignored αρχείο .env.
Αν αποφασίσατε να ενεργοποιήσετε RBAC
(Έλεγχος Πρόσβασης: Ανοιχτός vs. RBAC), προσθέστε επίσης
JWT_SECRET και AUTH_PORT τώρα.
Εκκίνηση όλων των υπηρεσιών
Χωρίς auth:
make docker-devnet-up
Με auth:
docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet --env-file .env --profile auth up -d
Το Compose απενεργοποιεί την αυτόματη φόρτωση του .env μόλις περαστεί οποιαδήποτε σημαία --env-file,
οπότε το τελικό --env-file .env είναι απαραίτητο. Χωρίς αυτό,
τα POSTGRES_PASSWORD, ADMIN_PRIVATE_KEY, και JWT_SECRET (που τοποθετήσατε στο
.env παραπάνω) επιλύονται ως κενά και το stack αποτυγχάνει να εκκινήσει σωστά.
Εκκινήστε τις υπηρεσίες πριν διαμορφώσετε την παρουσία. Ο indexer ροής συμβάντων σε πραγματικό χρόνο, οπότε η εκκίνηση του stack πρώτα διασφαλίζει ότι τα
AllowMintκαι η πρώτη σας κατάθεση ευρετηριάζονται με σειρά χωρίς να χρειάζεται backfill.
Διαμόρφωση της παρουσίας
Με το stack σε λειτουργία, προσθέστε στη λίστα επιτρεπόμενων ένα token mint και προσθέστε τον operator σας μέσω του Admin UI:
- Allow Mint: Admin Functions -> Mint Management -> εισαγάγετε διεύθυνση mint -> Allow Mint
- Add Operator: Admin Functions -> Operator Management -> εισαγάγετε operator pubkey -> Add Operator
Ή μέσω CLI:
cargo run --bin add_operator -- \https://api.devnet.solana.com \./keypairs/admin.json \<INSTANCE_ID> \<OPERATOR_PUBKEY>
Αυτός ο οδηγός στοχεύει στο Solana devnet. Για Mainnet:
- Τα Program ID μεταγλωττίζονται μέσω
declare_id!(): επαληθεύστε ότι χρησιμοποιείτε τα σωστά Mainnet ID από το αποθετήριο - Τα Yellowstone gRPC endpoints απαιτούν πρόγραμμα Mainnet· τα devnet endpoints δεν θα κάνουν stream συμβάντα Mainnet
- Το wallet του operator πληρώνει τέλη SOL για κάθε κλήση
ReleaseFunds, οπότε προσαρμόστε το υπόλοιπο SOL για τον αναμενόμενο όγκο αναλήψεων - Αλλάξτε όλα τα προεπιλεγμένα διαπιστευτήρια (Grafana, PostgreSQL) πριν από οποιαδήποτε δημόσια ανάπτυξη
Λειτουργίες
Χρήσιμες Εντολές
# 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
Παρατηρησιμότητα
Το stack περιλαμβάνει Prometheus, Grafana και cAdvisor για μετρικά και παρακολούθηση
containers. Το Grafana είναι προσβάσιμο στη θύρα 37429.
Ο προεπιλεγμένος κωδικός πρόσβασης Grafana είναι admin. Αλλάξτε τον πριν εκθέσετε τη θύρα 37429
σε οποιοδήποτε δίκτυο πέρα από το localhost.
Αντιμετώπιση Προβλημάτων
Το υπόλοιπο καναλιού δεν ενημερώνεται μετά την κατάθεση
- Επιβεβαιώστε ότι η συναλλαγή κατάθεσης στο Mainnet ολοκληρώθηκε σε έναν Mainnet explorer
- Επαληθεύστε ότι το
indexer-solanaεκτελείται:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f indexer-solana - Επαληθεύστε ότι το
operator-solanaεκτελείται:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f operator-solana - Ελέγξτε ότι το Yellowstone gRPC endpoint σας είναι προσβάσιμο και το token είναι έγκυρο
(
DEVNET_YELLOWSTONE_ENDPOINT,INDEXER_YELLOWSTONE_TOKEN) - Περιμένετε έως 30 δευτερόλεπτα μετά την on-chain επιβεβαίωση, καθώς ο indexer εφαρμόζει μια καθυστέρηση ασφαλείας οριστικοποίησης πριν πιστώσει
Η ανάληψη δεν διακανονίζεται στο Mainnet
- Επαληθεύστε ότι το
indexer-private-channelεκτελείται:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f indexer-private-channel - Επαληθεύστε ότι το
operator-private-channelεκτελείται:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f operator-private-channel - Επιβεβαιώστε ότι το keypair operator στο
ADMIN_PRIVATE_KEYταιριάζει με το κλειδί καταχωρισμένο μεAddOperatoron-chain - Αν τα logs εμφανίζουν "SMT root mismatch", η υπηρεσία τερματίζει αντί να υποβάλει μη έγκυρη απόδειξη. Σταματήστε το stack, επαναφέρετε από συνεπή κατάσταση και επανεκκινήστε
Αποτυχίες πιστοποίησης JWT (401 σε όλα τα αιτήματα)
- Επιβεβαιώστε ότι το
JWT_SECRETείναι ίδιο τόσο στο gateway όσο και στα containers της υπηρεσίας auth - Επιβεβαιώστε ότι το stack εκκινήθηκε με
--profile auth - Τα tokens λήγουν μετά από 24 ώρες· επαναπιστοποιηθείτε για να λάβετε νέο token
Η πρώτη δημιουργία διαρκεί πολύ
Αναμενόμενο. Η πρώτη εκτέλεση make docker-devnet-build μεταγλωττίζει όλες τις υπηρεσίες Rust και
μπορεί να διαρκέσει 30-60 λεπτά σε τυπικό υλικό. Οι επόμενες δημιουργίες χρησιμοποιούν την προσωρινή μνήμη layer του Docker
και είναι σημαντικά ταχύτερες.
Επόμενα Βήματα
Is this page helpful?