Desplegando Programas

El SDK puede desplegar un programa desde artefactos de compilación locales en una sola llamada. Existen dos modalidades: detección automática para workspaces de Anchor/Agave con rutas convencionales, y despliegue explícito cuando se desea controlar el origen de los bytes.

Ambas modalidades registran el programa en la dirección declarada por el IDL (o en la clave pública del archivo keypair) y, si hay un IDL disponible, lo registran en el runtime mediante surfnet_registerIdl para que los clientes RPC puedan decodificar los datos de las cuentas.

Detección Automática de un Workspace de Anchor

deployProgram / deploy_program recibe el nombre del programa y busca estos archivos relativos al directorio de trabajo actual:

ArchivoPropósito
target/deploy/{name}.soBytecode compilado del programa (requerido)
target/deploy/{name}-keypair.jsonkeypair del programa — la clave pública se convierte en el ID del programa (requerido)
target/idl/{name}.jsonIDL JSON de Anchor (opcional; se registra si está 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}");

Compila antes de desplegar

Ejecuta anchor build (o cargo build-sbf) antes de llamar a deployProgram para que los artefactos .so y keypair existan realmente en el disco. El SDK no invoca la compilación por ti.

Despliegue Explícito

Cuando los artefactos se encuentran en una ubicación no estándar — un artefacto de CI compilado, un fixture de prueba predefinido, un fragmento de bytes embebido — proporciona una configuración de despliegue explícita.

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

Despliegue desde Bytes sin Procesar

Cuando el bytecode ya está en memoria — generado por un paso de compilación, descargado desde un almacén de artefactos, o embebido mediante include_bytes! — omite el sistema de archivos por completo.

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

Referencia del Constructor DeployProgram (Rust)

Constructor / setterFirmaPropósito
DeployProgram::new(program_id: Pubkey) -> SelfConstruye un despliegue para un ID de programa conocido.
DeployProgram::from_keypair_path(path: impl AsRef<Path>) -> SurfnetResult<Self>Lee un archivo keypair de Solana; la clave pública se convierte en el ID del programa.
.so_path(path: impl Into<PathBuf>)Ruta al artefacto .so compilado en disco.
.so_bytes(bytes: Vec<u8>)Bytes del programa sin procesar (mutuamente exclusivo con so_path).
.idl_path(path: impl Into<PathBuf>)IDL JSON de Anchor opcional para registrar tras el despliegue.

Referencia de Tipos 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 son mutuamente exclusivos — proporcione exactamente uno.

Qué Se Registra

Tras un despliegue exitoso, el entorno de ejecución realiza tres acciones:

  1. Escribe el program account en programId con los bytes de .so mediante surfnet_writeProgram.
  2. Marca la cuenta como ejecutable para que pueda invocarse mediante llamadas RPC normales.
  3. Registra el IDL (si se proporciona) mediante surfnet_registerIdl, lo que permite a los clientes RPC decodificar datos de cuenta usando el esquema IDL del programa.

Poco común: program account no ejecutable

Si desea escribir bytes de programa en una cuenta pero mantenerla no ejecutable, use SetAccount directamente en lugar de deploy. La ruta deploy siempre marca la cuenta como ejecutable.

Errores

CausaSíntoma
El archivo .so falta o no es legibleSurfnetError::Cheatcode("...failed to read...") o error de JS lanzado
El ID del programa no coincide con el archivo keypairSurfnetError::Cheatcode("...mismatched program id...")
El JSON del IDL está malformadoSurfnetError::Cheatcode("...invalid IDL...")
Surfnet está desconectado y el program account ya existe en upstreamEl despliegue sigue siendo exitoso; la copia local sobreescribe la versión upstream

Is this page helpful?

Tabla de Contenidos

Editar Página