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:
| Arquivo | Finalidade |
|---|---|
target/deploy/{name}.so | Bytecode compilado do programa (obrigatório) |
target/deploy/{name}-keypair.json | keypair do programa — a chave pública se torna o ID do programa (obrigatório) |
target/idl/{name}.json | IDL 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 / setter | Assinatura | Finalidade |
|---|---|---|
DeployProgram::new | (program_id: Pubkey) -> Self | Cria 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 atsoPath?: string; // path to .so on disksoBytes?: ByteArrayLike; // or raw bytes in memoryidlPath?: 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:
- Grava o program account em
programIdcom os bytes.soviasurfnet_writeProgram. - Marca a conta como executável para que possa ser invocada por meio de chamadas RPC normais.
- 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
| Causa | Sintoma |
|---|---|
Arquivo .so ausente ou ilegível | SurfnetError::Cheatcode("...failed to read...") ou erro JS lançado |
| O ID do programa não corresponde ao arquivo keypair | SurfnetError::Cheatcode("...mismatched program id...") |
| O JSON do IDL está malformado | SurfnetError::Cheatcode("...invalid IDL...") |
| O Surfnet está offline e o program account já existe upstream | O deploy ainda é bem-sucedido; a cópia local substitui a versão upstream |
Is this page helpful?