Implantando Programas

O SDK pode implantar um programa a partir de artefatos de build locais em uma única chamada. Existem duas abordagens: descoberta automática para workspaces Anchor/Agave com caminhos convencionais, e implantação explícita quando você deseja controlar a origem dos bytes.

Ambas as abordagens registram o programa no endereço declarado pelo IDL (ou na chave pública do arquivo keypair) e, se um IDL estiver disponível, o registram no runtime via surfnet_registerIdl para que clientes RPC possam decodificar dados de conta.

Descoberta Automática de um Workspace Anchor

deployProgram / deploy_program recebe o nome do programa e procura estes arquivos relativos ao diretório de trabalho atual:

ArquivoFinalidade
target/deploy/{name}.soBytecode compilado do programa (obrigatório)
target/deploy/{name}-keypair.jsonkeypair do programa — a chave pública se torna o ID do programa (obrigatório)
target/idl/{name}.jsonIDL JSON do Anchor (opcional; registrado 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}");

Compile antes de implantar

Execute anchor build (ou cargo build-sbf) antes de chamar deployProgram para que os artefatos .so e keypair realmente existam no disco. O SDK não invoca o build por você.

Implantação Explícita

Quando os artefatos estão em um local não convencional — um artefato de CI compilado, um fixture de teste pré-configurado, um slice de bytes embutido — forneça uma configuração explícita de implantação.

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

Implantar a Partir de Bytes Brutos

Quando o bytecode já está em memória — gerado por uma etapa de build, baixado de um repositório de artefatos, ou embutido via include_bytes! — ignore completamente o sistema de arquivos.

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

Referência do Builder DeployProgram (Rust)

Construtor / setterAssinaturaFinalidade
DeployProgram::new(program_id: Pubkey) -> SelfCria um deploy para um ID de programa conhecido.
DeployProgram::from_keypair_path(path: impl AsRef<Path>) -> SurfnetResult<Self>Lê um arquivo keypair do Solana; a chave pública torna-se o ID do programa.
.so_path(path: impl Into<PathBuf>)Caminho para o artefato .so compilado no disco.
.so_bytes(bytes: Vec<u8>)Bytes brutos do programa (mutuamente exclusivo com so_path).
.idl_path(path: impl Into<PathBuf>)IDL JSON do Anchor opcional para registrar após o deploy.

Referência do 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 são mutuamente exclusivos — forneça exatamente um.

O Que É Registrado

Após um deploy bem-sucedido, o runtime executa três ações:

  1. Grava o program account em programId com os bytes .so via surfnet_writeProgram.
  2. Marca a conta como executável para que possa ser invocada por meio de chamadas RPC normais.
  3. Registra o IDL (se fornecido) via surfnet_registerIdl, o que permite que clientes RPC decodifiquem dados de conta usando o esquema IDL do programa.

Raro: program account não executável

Se você deseja gravar bytes de programa em uma conta, mas mantê-la não executável, use SetAccount diretamente em vez de deploy. O caminho deploy sempre marca a conta como executável.

Erros

CausaSintoma
Arquivo .so ausente ou ilegívelSurfnetError::Cheatcode("...failed to read...") ou erro JS lançado
O ID do programa não corresponde ao arquivo keypairSurfnetError::Cheatcode("...mismatched program id...")
O JSON do IDL está malformadoSurfnetError::Cheatcode("...invalid IDL...")
O Surfnet está offline e o program account já existe upstreamO deploy ainda é bem-sucedido; a cópia local substitui a versão upstream

Is this page helpful?

Índice

Editar Página
© 2026 Fundação Solana. Todos os direitos reservados.