Triển Khai Chương Trình

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ệpMục Đích
target/deploy/{name}.soBytecode đã biên dịch của chương trình (bắt buộc)
target/deploy/{name}-keypair.jsonkeypair 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}.jsonIDL 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 / setterChữ kýMục đích
DeployProgram::new(program_id: Pubkey) -> SelfTạ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 at
soPath?: string; // path to .so on disk
soBytes?: ByteArrayLike; // or raw bytes in memory
idlPath?: string; // optional Anchor IDL JSON
}

soPathsoBytes 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:

  1. Ghi program account tại programId với các byte .so thông qua surfnet_writeProgram.
  2. Đá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.
  3. Đă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ânTriệu chứng
Tệp .so bị thiếu hoặc không đọc đượcSurfnetError::Cheatcode("...failed to read...") hoặc lỗi JS được ném
Program ID không khớp với tệp keypairSurfnetError::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ồnTriể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?

Mục lục

Chỉnh sửa trang