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:
| File | Scopo |
|---|---|
target/deploy/{name}.so | Bytecode compilato del programma (obbligatorio) |
target/deploy/{name}-keypair.json | keypair del programma — la chiave pubblica diventa l'ID del programma (obbligatorio) |
target/idl/{name}.json | IDL 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 / setter | Firma | Scopo |
|---|---|---|
DeployProgram::new | (program_id: Pubkey) -> Self | Costruisce 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 atsoPath?: string; // path to .so on disksoBytes?: ByteArrayLike; // or raw bytes in memoryidlPath?: 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:
- Scrive il program account su
programIdcon i byte.sotramitesurfnet_writeProgram. - Contrassegna l'account come eseguibile in modo che possa essere invocato tramite normali chiamate RPC.
- 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
| Causa | Sintomo |
|---|---|
Il file .so è mancante o illeggibile | SurfnetError::Cheatcode("...failed to read...") o errore JS generato |
| L'ID del programma non corrisponde al file keypair | SurfnetError::Cheatcode("...mismatched program id...") |
| Il JSON dell'IDL è malformato | SurfnetError::Cheatcode("...invalid IDL...") |
| Surfnet è offline e il program account esiste già a monte | Il deployment ha comunque successo; la copia locale sovrascrive la versione a monte |
Is this page helpful?