SDK có thể triển khai một chương trình từ các tệp build cục bộ chỉ trong một lần gọi. Có hai cách: tự động phát hiện dành cho các workspace Anchor/Agave theo cấu trúc thư mục thông thường, và triển khai tường minh khi bạn muốn kiểm soát nguồn gốc của các byte.
Cả hai cách đều đăng ký chương trình tại địa chỉ đã khai báo trong IDL (hoặc tại
khóa công khai của tệp keypair) và, nếu có IDL, đăng ký nó với runtime thông qua
surfnet_registerIdl để các RPC client có thể giải mã dữ liệu tài khoản.
Tự Động Phát Hiện Workspace Anchor
deployProgram / deploy_program nhận tên chương trình và tìm kiếm các tệp sau
theo đường dẫn tương đối từ thư mục làm việc hiện tại:
| Tệp | Mục Đích |
|---|---|
target/deploy/{name}.so | Bytecode đã biên dịch của chương trình (bắt buộc) |
target/deploy/{name}-keypair.json | keypair của chương trình — khóa công khai trở thành ID chương trình (bắt buộc) |
target/idl/{name}.json | IDL JSON của Anchor (tùy chọn; được đăng ký nếu có) |
use surfpool_sdk::Surfnet;let surfnet = Surfnet::start().await?;let cheats = surfnet.cheatcodes();let program_id = cheats.deploy_program("my_program")?;println!("deployed at {program_id}");
Build before you deploy
Chạy anchor build (hoặc cargo build-sbf) trước khi gọi deployProgram để
các tệp .so và keypair thực sự tồn tại trên ổ đĩa. SDK không tự động thực
hiện quá trình build cho bạn.
Triển Khai Tường Minh
Khi các tệp build nằm ở vị trí không theo chuẩn — một tệp artifact từ CI, một fixture test được chuẩn bị sẵn, hoặc một đoạn byte nhúng sẵn — hãy truyền cấu hình triển khai tường minh.
use surfpool_sdk::cheatcodes::builders::DeployProgram;use surfpool_sdk::Surfnet;let cheats = Surfnet::start().await?.cheatcodes();// Derive the program ID from a keypair file.let program_id = cheats.deploy(DeployProgram::from_keypair_path("fixtures/my_program-keypair.json")?.so_path("fixtures/my_program.so").idl_path("fixtures/my_program.idl.json"),)?;
Triển Khai Từ Byte Thô
Khi bytecode đã có sẵn trong bộ nhớ — được tạo ra từ một bước build, tải xuống
từ một kho artifact, hoặc nhúng qua include_bytes! — hãy bỏ qua hoàn toàn hệ
thống tệp.
use surfpool_sdk::cheatcodes::builders::DeployProgram;use surfpool_sdk::{Pubkey, Surfnet};const PROGRAM_BYTES: &[u8] = include_bytes!("../fixtures/my_program.so");let cheats = Surfnet::start().await?.cheatcodes();let program_id: Pubkey = "DemoProgram111111111111111111111111111111111".parse()?;cheats.deploy(DeployProgram::new(program_id).so_bytes(PROGRAM_BYTES.to_vec()),)?;
Tài Liệu Tham Khảo DeployProgram Builder (Rust)
| Constructor / setter | Chữ ký | Mục đích |
|---|---|---|
DeployProgram::new | (program_id: Pubkey) -> Self | Tạo một lần triển khai cho một program ID đã biết. |
DeployProgram::from_keypair_path | (path: impl AsRef<Path>) -> SurfnetResult<Self> | Đọc tệp keypair của Solana; khóa công khai trở thành program ID. |
.so_path | (path: impl Into<PathBuf>) | Đường dẫn đến artifact .so đã biên dịch trên ổ đĩa. |
.so_bytes | (bytes: Vec<u8>) | Byte chương trình thô (loại trừ lẫn nhau với so_path). |
.idl_path | (path: impl Into<PathBuf>) | Tệp JSON IDL của Anchor tùy chọn để đăng ký sau khi triển khai. |
Tài Liệu Tham Khảo Kiểu DeployOptions (JS)
type ByteArrayLike = Uint8Array | number[];interface DeployOptions {programId: string; // base58 address to deploy atsoPath?: string; // path to .so on disksoBytes?: ByteArrayLike; // or raw bytes in memoryidlPath?: string; // optional Anchor IDL JSON}
soPath và soBytes loại trừ lẫn nhau — chỉ cung cấp một trong hai.
Những Gì Được Đăng Ký
Sau khi triển khai thành công, runtime thực hiện ba việc:
- Ghi program account tại
programIdvới các byte.sothông quasurfnet_writeProgram. - Đánh dấu tài khoản là có thể thực thi để nó có thể được gọi thông qua các lệnh gọi RPC thông thường.
- Đăng ký IDL (nếu được cung cấp) thông qua
surfnet_registerIdl, cho phép các client RPC giải mã dữ liệu tài khoản bằng schema IDL của chương trình.
Hiếm gặp: program account không thể thực thi
Nếu bạn muốn ghi byte chương trình vào một tài khoản nhưng giữ nó không thể
thực thi, hãy sử dụng SetAccount trực tiếp thay vì deploy. Đường dẫn
deploy luôn đánh dấu tài khoản là có thể thực thi.
Lỗi
| Nguyên nhân | Triệu chứng |
|---|---|
Tệp .so bị thiếu hoặc không đọc được | SurfnetError::Cheatcode("...failed to read...") hoặc lỗi JS được ném |
| Program ID không khớp với tệp keypair | SurfnetError::Cheatcode("...mismatched program id...") |
| JSON IDL có định dạng không hợp lệ | SurfnetError::Cheatcode("...invalid IDL...") |
| Surfnet ngoại tuyến và program account đã tồn tại ở thượng nguồn | Triển khai vẫn thành công; bản sao cục bộ ghi đè lên phiên bản thượng nguồn |
Is this page helpful?