Distribuzione dei Programmi

L'SDK può distribuire un programma da artefatti di build locali con una sola chiamata. Esistono due modalità: rilevamento automatico per workspace Anchor/Agave con percorsi convenzionali, e distribuzione esplicita quando si vuole controllare la provenienza dei byte.

Entrambe le modalità registrano il programma all'indirizzo dichiarato nell'IDL (o alla chiave pubblica del file keypair) e, se è disponibile un IDL, lo registrano con il runtime tramite surfnet_registerIdl affinché i client RPC possano decodificare i dati degli account.

Rilevamento Automatico di un Workspace Anchor

deployProgram / deploy_program riceve il nome del programma e cerca questi file relativamente alla directory di lavoro corrente:

FileScopo
target/deploy/{name}.soBytecode compilato del programma (obbligatorio)
target/deploy/{name}-keypair.jsonkeypair del programma — la chiave pubblica diventa l'ID del programma (obbligatorio)
target/idl/{name}.jsonIDL JSON di Anchor (facoltativo; registrato se presente)
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}");

Esegui la build prima di distribuire

Esegui anchor build (o cargo build-sbf) prima di chiamare deployProgram affinché gli artefatti .so e keypair esistano effettivamente su disco. L'SDK non invoca la build automaticamente.

Distribuzione Esplicita

Quando gli artefatti si trovano in una posizione non standard — un artefatto CI già compilato, una fixture di test predefinita, uno slice di byte incorporato — fornisci una configurazione di distribuzione esplicita.

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

Distribuzione da Byte Grezzi

Quando il bytecode è già in memoria — generato da un passaggio di build, scaricato da un archivio di artefatti o incorporato tramite include_bytes! — salta completamente il file system.

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

Riferimento al Builder DeployProgram (Rust)

Costruttore / setterFirmaScopo
DeployProgram::new(program_id: Pubkey) -> SelfCostruisce un deployment per un ID programma noto.
DeployProgram::from_keypair_path(path: impl AsRef<Path>) -> SurfnetResult<Self>Legge un file keypair di Solana; la chiave pubblica diventa l'ID del programma.
.so_path(path: impl Into<PathBuf>)Percorso dell'artefatto .so compilato su disco.
.so_bytes(bytes: Vec<u8>)Byte grezzi del programma (mutuamente esclusivi con so_path).
.idl_path(path: impl Into<PathBuf>)IDL JSON Anchor opzionale da registrare dopo il deployment.

Riferimento al Tipo 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 e soBytes sono mutuamente esclusivi — fornirne esattamente uno.

Cosa Viene Registrato

Dopo un deployment riuscito, il runtime esegue tre operazioni:

  1. Scrive il program account su programId con i byte .so tramite surfnet_writeProgram.
  2. Contrassegna l'account come eseguibile in modo che possa essere invocato tramite normali chiamate RPC.
  3. Registra l'IDL (se fornito) tramite surfnet_registerIdl, che consente ai client RPC di decodificare i dati dell'account utilizzando lo schema IDL del programma.

Raro: program account non eseguibile

Se desideri scrivere i byte del programma su un account ma mantenerlo non eseguibile, usa direttamente SetAccount invece di deploy. Il percorso deploy contrassegna sempre l'account come eseguibile.

Errori

CausaSintomo
Il file .so è mancante o illeggibileSurfnetError::Cheatcode("...failed to read...") o errore JS generato
L'ID del programma non corrisponde al file keypairSurfnetError::Cheatcode("...mismatched program id...")
Il JSON dell'IDL è malformatoSurfnetError::Cheatcode("...invalid IDL...")
Surfnet è offline e il program account esiste già a monteIl deployment ha comunque successo; la copia locale sovrascrive la versione a monte

Is this page helpful?

Indice dei contenuti

Modifica pagina
© 2026 Solana Foundation. Tutti i diritti riservati.