Розгортання програм

SDK може розгорнути програму з локальних артефактів збірки за один виклик. Є два варіанти: автоматичне виявлення для воркспейсів Anchor/Agave зі стандартними шляхами та явне розгортання, коли ви хочете самостійно контролювати джерело байтів.

Обидва варіанти реєструють програму за оголошеною в IDL адресою (або за публічним ключем файлу keypair) і, якщо IDL доступний, реєструють його з рантаймом через surfnet_registerIdl, щоб RPC-клієнти могли декодувати дані облікових записів.

Автоматичне виявлення Anchor-воркспейсу

deployProgram / deploy_program приймає назву програми та шукає ці файли відносно поточного робочого каталогу:

ФайлПризначення
target/deploy/{name}.soСкомпільований байткод програми (обов'язково)
target/deploy/{name}-keypair.jsonkeypair програми — публічний ключ стає ідентифікатором програми (обов'язково)
target/idl/{name}.jsonAnchor IDL JSON (необов'язково; реєструється, якщо присутній)
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}");

Зберіть проєкт перед розгортанням

Виконайте anchor build (або cargo build-sbf) перед викликом deployProgram, щоб артефакти .so та keypair дійсно існували на диску. SDK не запускає збірку автоматично.

Явне розгортання

Коли артефакти знаходяться в нестандартному місці — артефакт CI-збірки, заздалегідь підготовлена тестова фікстура, вбудований фрагмент байтів — передайте явну конфігурацію розгортання.

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"),
)?;

Розгортання з необроблених байтів

Коли байткод вже знаходиться в пам'яті — згенерований на етапі збірки, завантажений з сховища артефактів або вбудований через include_bytes! — пропустіть файлову систему повністю.

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()),
)?;

Довідник конструктора DeployProgram (Rust)

Конструктор / сетерСигнатураПризначення
DeployProgram::new(program_id: Pubkey) -> SelfСтворити деплой для відомого ідентифікатора програми.
DeployProgram::from_keypair_path(path: impl AsRef<Path>) -> SurfnetResult<Self>Зчитати файл keypair Solana; публічний ключ стає ідентифікатором програми.
.so_path(path: impl Into<PathBuf>)Шлях до скомпільованого артефакту .so на диску.
.so_bytes(bytes: Vec<u8>)Необроблені байти програми (взаємовиключне з so_path).
.idl_path(path: impl Into<PathBuf>)Необов'язковий Anchor IDL JSON для реєстрації після деплою.

Довідник типу 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
}

soPath та soBytes є взаємовиключними — вкажіть рівно одне.

Що реєструється

Після успішного деплою середовище виконання виконує три дії:

  1. Записує program account за адресою programId з байтами .so через surfnet_writeProgram.
  2. Позначає акаунт як виконуваний, щоб його можна було викликати через звичайні RPC-запити.
  3. Реєструє IDL (якщо надано) через surfnet_registerIdl, що дозволяє RPC-клієнтам декодувати дані акаунту за допомогою IDL-схеми програми.

Рідкісний випадок: невиконуваний program account

Якщо ви хочете записати байти програми до акаунту, але залишити його невиконуваним, використовуйте SetAccount безпосередньо замість deploy. Шлях deploy завжди позначає акаунт як виконуваний.

Помилки

ПричинаСимптом
Файл .so відсутній або недоступний для читанняSurfnetError::Cheatcode("...failed to read...") або викинута помилка JS
Ідентифікатор програми не збігається з файлом keypairSurfnetError::Cheatcode("...mismatched program id...")
IDL JSON має неправильний форматSurfnetError::Cheatcode("...invalid IDL...")
Surfnet офлайн, а program account вже існує в upstreamДеплой все одно успішний; локальна копія перевизначає upstream-версію

Is this page helpful?