Người vận hành Private Channels là gì?
Người vận hành là một thực thể đáng tin cậy, được cấp quyền trên chuỗi, đóng vai trò cầu nối giữa Solana
Mainnet và mạng kênh riêng tư. Người vận hành được cấp phép bởi
quản trị viên phiên bản thông qua AddOperator, lệnh này tạo ra một Operator PDA trên chuỗi;
nếu không có điều này, không bên nào có thể gọi ReleaseFunds. Trong thực tế, người vận hành là một
tổ chức hoặc nhóm chạy các dịch vụ theo dõi tiền gửi, đúc
token phía kênh, phát hiện lệnh rút tiền và quyết toán tiền về Mainnet.
Chạy một phiên bản sẽ cung cấp cho người dùng của bạn các giao dịch chuyển khoản riêng tư, khối lượng lớn không
hiển thị trên Solana Mainnet, thông lượng tức thì không phí vượt qua TPS Solana gốc,
và kiểm soát truy cập thông qua RBAC.
Nếu bạn là nhà phát triển tích hợp với một phiên bản Private Channels hiện có thay vì triển khai mới, hãy bắt đầu với Quickstart.
Trước Khi Bắt Đầu
Yêu Cầu Tiên Quyết
Ghim các phiên bản này trên máy chủ để khớp với các Docker image:
- Docker Engine 26+ (macOS Apple Silicon: bật "Docker VMM" trong Settings -> Virtual Machine Options)
- Node.js 24.7.0 và pnpm 10.15.1
- Solana CLI 3.1.13 (Agave)
- Rust 1.91.0
- Một endpoint Yellowstone gRPC cho Devnet (có từ Helius, Triton, QuickNode)
Về yêu cầu mạng và cổng mặc định, xem
docs/TECHNICAL_REQUIREMENTS.md
trong kho lưu trữ.
Cài đặt chuỗi công cụ Solana đã ghim phiên bản và làm nóng bộ đệm SBF:
make install-toolchain
Các Dịch Vụ
Chạy một phiên bản Private Channels có nghĩa là đảm nhận năm trách nhiệm liên tục, mỗi trách nhiệm được xử lý bởi các container chuyên dụng trong stack Docker Compose:
- Lập chỉ mục Mainnet để theo dõi tiền gửi -
indexer-solanatheo dõi Solana Mainnet để tìm các sự kiệnDepositqua Yellowstone gRPC;operator-solananhận các tiền gửi đã xác nhận và đúc số dư token tương đương trên mạng kênh - Lập chỉ mục kênh để theo dõi lệnh rút tiền -
indexer-private-channelthăm dò kênh mỗi giây để tìm các sự kiện burnWithdrawFundsvà ghi các bản ghi rút tiền đang chờ xử lý vào cơ sở dữ liệu - Giải phóng tiền trên Mainnet -
operator-private-channelnhận các bản ghi đang chờ xử lý và gọiReleaseFundstrên Escrow Program với bằng chứng loại trừ SMT hợp lệ - Quản lý SMT root -
operator-private-channelgọiResetSmtRoottự động khi các epoch của cây xoay vòng; kiểm traverify_smt_exclusion_prooftrên chuỗi là hàng phòng thủ cuối cùng chống lại các lệnh rút tiền trái phép - Chạy gateway và dịch vụ xác thực - gateway là endpoint công khai duy nhất
cho tất cả lưu lượng client; dịch vụ xác thực (tùy chọn) thực thi
JWT/RBAC khi
JWT_SECRETđược thiết lập
Để xem danh sách dịch vụ đầy đủ và phân công cổng, xem Tài liệu tham khảo Cấu hình.
Lưu ý bảo mật: Các cổng write-node và read-node chỉ được liên kết với loopback (
127.0.0.1), nhưng một số dịch vụ khác (gateway, auth, operator metrics, Grafana, Prometheus, cAdvisor) được xuất bản tới tất cả giao diện mạng theo mặc định. Xem Tài liệu tham khảo Cấu hình để biết bảng cổng đầy đủ và thiết lập tường lửa trước bất kỳ triển khai công khai nào. RBAC chỉ bảo vệ các phương thức JSON-RPC của gateway, không bảo vệ các dịch vụ khác này.
Kiểm Soát Truy Cập: Mở vs. RBAC
Theo mặc định, gateway chấp nhận tất cả kết nối; không yêu cầu token. Để bật
RBAC dựa trên JWT, hãy đặt JWT_SECRET và khởi động stack với --profile auth. Xem
Xác Thực & Vai Trò để biết
tài liệu tham khảo cấu hình đầy đủ, bao gồm cách cấp phép vai trò operator và
đăng ký ví người dùng.
Nếu bật xác thực, hãy thêm các biến này vào môi trường trước khi khởi động stack:
JWT_SECRET=<openssl rand -hex 32> # must match on gateway and auth serviceAUTH_PORT=8903
Thiết Lập Môi Trường
.env.devnet đã được theo dõi trong kho lưu trữ với các giá trị mặc định dành riêng cho devnet
đã được điền sẵn; hãy chỉnh sửa trực tiếp thay vì tạo lại từ .env.example,
vì điều đó sẽ ghi đè các giá trị mặc định đó.
Điền các giá trị còn lại khi bạn thực hiện các bước triển khai bên dưới; một số
chỉ có thể lấy được trong quá trình triển khai. Các bí mật đặt trong file .env đã được gitignore;
các biến không phải bí mật đặt trong .env.devnet.
Bí mật - hãy đặt ngay lập tức:
POSTGRES_PASSWORD=<openssl rand -hex 32>POSTGRES_REPLICATION_PASSWORD=<openssl rand -hex 32>
Các biến thu được trong quá trình triển khai:
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 là trình ký phí bắt buộc của chính các dịch vụ off-chain,
không liên quan đến quản trị viên phiên bản trên chuỗi ở Bước 3. Hướng dẫn này đặt
keypair operator được tạo ở Bước 4 bên dưới vào ADMIN_PRIVATE_KEY và
để trống OPERATOR_PRIVATE_KEY tùy chọn, do đó trình ký operator sẽ
dùng lại cùng một khóa. Không bao giờ đặt keypair quản trị viên phiên bản cấp giao thức từ
Bước 3 vào bất kỳ biến nào trong số đó.
Để xem tài liệu tham khảo đầy đủ về biến môi trường, xem Cấu hình.
Triển Khai
Xây dựng image
make docker-devnet-build
Lệnh này biên dịch tất cả các dịch vụ Rust thành một Docker image dùng chung. Lần xây dựng đầu tiên mất từ 30 phút đến một giờ.
Thiết lập Admin UI
Admin UI là công cụ dựa trên trình duyệt để tạo và cấu hình phiên bản escrow:
một tiện ích phát triển và quản trị, không phải sản phẩm hướng đến người dùng
và không phải thành phần runtime bắt buộc. Tất cả các thao tác nó thực hiện
(CreateInstance, AllowMint, AddOperator) cũng có thể được chạy qua các script CLI
trong kho lưu trữ.
cd admin-uipnpm installecho "PRIVATE_CHANNEL_RPC_URL=http://localhost:8899" > .envpnpm dev # opens at http://localhost:5173
Tạo một phiên bản escrow
- Đặt ví trình duyệt của bạn sang Devnet và đảm bảo bạn có SOL Devnet để trả phí
- Trong Admin UI, nhấp Create New Instance và phê duyệt giao dịch
- Sao chép Instance Address và đặt nó làm
ESCROW_INSTANCE_IDtrong.env.devnet
Hoặc, sử dụng script CLI:
cargo run --bin create_instance -- https://api.devnet.solana.com ./keypairs/admin.json
Tạo keypair operator
solana-keygen new -o operator-keypair.json -s --no-bip39-passphrasesolana-keygen pubkey operator-keypair.json
Đặt nội dung keypair làm ADMIN_PRIVATE_KEY trong môi trường của bạn. Public
key không phải là biến môi trường; bạn sẽ truyền nó trực tiếp dưới dạng operator
pubkey ở bước "Cấu hình phiên bản" bên dưới.
Hoàn thiện biến môi trường
Cập nhật .env.devnet với ESCROW_INSTANCE_ID, DEVNET_RPC_URL,
DEVNET_YELLOWSTONE_ENDPOINT và INDEXER_YELLOWSTONE_TOKEN. Đặt các bí mật
(POSTGRES_PASSWORD, POSTGRES_REPLICATION_PASSWORD, ADMIN_PRIVATE_KEY) trong
file .env đã được gitignore.
Nếu bạn quyết định bật RBAC
(Kiểm Soát Truy Cập: Mở vs. RBAC), hãy thêm
JWT_SECRET và AUTH_PORT ngay bây giờ.
Khởi động tất cả dịch vụ
Không có auth:
make docker-devnet-up
Có auth:
docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet --env-file .env --profile auth up -d
Compose vô hiệu hóa tính năng tự động tải .env khi bất kỳ cờ --env-file nào được
truyền vào, vì vậy --env-file .env ở cuối là bắt buộc. Nếu không có nó,
POSTGRES_PASSWORD, ADMIN_PRIVATE_KEY và JWT_SECRET (mà bạn đặt trong
.env ở trên) sẽ được giải quyết trống và stack sẽ không khởi động đúng cách.
Khởi động dịch vụ trước khi cấu hình phiên bản. Indexer truyền phát sự kiện theo thời gian thực, vì vậy việc khởi động stack trước đảm bảo
AllowMintvà lần gửi tiền đầu tiên của bạn được lập chỉ mục theo thứ tự mà không cần backfill.
Cấu hình phiên bản
Với stack đang chạy, hãy đưa vào danh sách trắng một token mint và thêm operator của bạn qua Admin UI:
- Allow Mint: Admin Functions -> Mint Management -> nhập địa chỉ mint -> Allow Mint
- Add Operator: Admin Functions -> Operator Management -> nhập operator pubkey -> Add Operator
Hoặc qua CLI:
cargo run --bin add_operator -- \https://api.devnet.solana.com \./keypairs/admin.json \<INSTANCE_ID> \<OPERATOR_PUBKEY>
Hướng dẫn này nhắm đến Solana devnet. Đối với Mainnet:
- ID chương trình được biên dịch vào qua
declare_id!(): hãy xác minh bạn đang sử dụng các ID Mainnet chính xác từ kho lưu trữ - Các endpoint Yellowstone gRPC yêu cầu gói Mainnet; các endpoint devnet sẽ không truyền phát sự kiện Mainnet
- Ví operator phải trả phí SOL cho mỗi lần gọi
ReleaseFunds, vì vậy hãy cân đối số dư SOL theo khối lượng rút tiền dự kiến của bạn - Thay đổi tất cả thông tin xác thực mặc định (Grafana, PostgreSQL) trước bất kỳ triển khai công khai nào
Vận Hành
Các Lệnh Hữu Ích
# 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
Khả Năng Quan Sát
Stack bao gồm Prometheus, Grafana và cAdvisor để theo dõi số liệu và container.
Grafana có thể truy cập trên cổng 37429.
Mật khẩu Grafana mặc định là admin. Hãy thay đổi nó trước khi mở cổng 37429
ra bất kỳ mạng nào ngoài localhost.
Xử Lý Sự Cố
Số dư kênh không cập nhật sau khi gửi tiền
- Xác nhận giao dịch gửi tiền Mainnet đã được ghi nhận trên Mainnet explorer
- Xác minh
indexer-solanađang chạy:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f indexer-solana - Xác minh
operator-solanađang chạy:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f operator-solana - Kiểm tra xem endpoint Yellowstone gRPC của bạn có thể truy cập được và token hợp lệ
(
DEVNET_YELLOWSTONE_ENDPOINT,INDEXER_YELLOWSTONE_TOKEN) - Cho phép tối đa 30 giây sau khi xác nhận trên chuỗi, vì indexer áp dụng độ trễ an toàn tính chung cuộc trước khi ghi nhận tiền
Lệnh rút tiền không quyết toán về Mainnet
- Xác minh
indexer-private-channelđang chạy:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f indexer-private-channel - Xác minh
operator-private-channelđang chạy:docker compose -f docker-compose.devnet.yml --env-file versions.env --env-file .env.devnet logs -f operator-private-channel - Xác nhận keypair operator trong
ADMIN_PRIVATE_KEYkhớp với khóa đã đăng ký vớiAddOperatortrên chuỗi - Nếu log hiển thị "SMT root mismatch", dịch vụ sẽ tắt thay vì gửi bằng chứng không hợp lệ. Dừng stack, khôi phục từ trạng thái nhất quán và khởi động lại
Lỗi xác thực JWT (401 trên tất cả các yêu cầu)
- Xác nhận
JWT_SECRETgiống hệt nhau trên cả container gateway và auth service - Xác nhận stack được khởi động với
--profile auth - Token hết hạn sau 24 giờ; hãy xác thực lại để lấy token mới
Lần xây dựng đầu tiên mất quá lâu
Điều này là bình thường. Lần đầu chạy make docker-devnet-build sẽ biên dịch tất cả các dịch vụ Rust và
có thể mất 30-60 phút trên phần cứng thông thường. Các lần xây dựng tiếp theo sử dụng bộ đệm layer Docker
và nhanh hơn đáng kể.
Các Bước Tiếp Theo
Quickstart
Kiểm tra triển khai của bạn: gửi tiền, chuyển khoản và rút tiền trên devnet.
Cấu hình
Tài liệu tham khảo đầy đủ về biến môi trường cho tất cả dịch vụ.
Xác Thực & Vai Trò
Cấu hình xác thực JWT và cấp phát người dùng có vai trò operator.
Hướng dẫn
Tài liệu tham khảo đầy đủ cho tất cả các lệnh on-chain.
Is this page helpful?