Documentación de SolanaDesarrollo de programas

Implementación de programas

Esta sección explica el proceso básico de implementación de un programa de Solana utilizando la CLI de Solana.

Referencia de comandos CLI

TareaComando
Compilar programacargo build-sbf
Implementar nuevo programasolana program deploy <path_to_program.so>
Actualizar programa existentesolana program deploy <path_to_program.so> (igual que implementar)
Mostrar información del programasolana program show <program-id>
Transferir autoridad del programasolana program set-upgrade-authority <program-id> --new-upgrade-authority <path_to_keypair>
Hacer el programa inmutablesolana program set-upgrade-authority <program-id> --final
Cerrar programasolana program close <program-id> --bypass-warning
Verificar saldo de la billeterasolana balance
Solicitar airdrop (devnet/localhost)solana airdrop 2

Conceptos clave

Antes de profundizar, aclaremos algunos términos:

  • ID del programa: La dirección en la cadena de tu programa. Los usuarios interactúan con tu programa haciendo referencia al ID del programa.
  • Program Account: La cuenta en la cadena que almacena los metadatos de tu programa. La dirección de la program account es el ID del programa. La program account también almacena la dirección de la ProgramData Account.
  • ProgramData Account: La cuenta en la cadena que almacena el código ejecutable implementado de tu programa.
  • Autoridad del programa: La cuenta que tiene permiso para actualizar o cerrar el programa. Por defecto, esta es tu billetera CLI.

Requisitos previos

Configurar la billetera

Después de la instalación, crea una billetera local con par de claves. La dirección de esta billetera se establece como la autoridad del programa predeterminada al implementar programas:

Terminal
$
solana-keygen new

Esto crea un keypair en ~/.config/solana/id.json por defecto.

Configurar clúster

Elige a qué clúster de Solana desplegar. Usa el comando solana config get para verificar tu configuración actual:

Terminal
$
solana config get

Cambia entre clústeres según sea necesario:

Terminal
$
solana config set --url mainnet-beta
$
solana config set --url devnet
$
solana config set --url localhost
$
solana config set --url testnet
$
solana config set --url "https://your-rpc-url.com"

Fondear billetera

Necesitarás SOL para pagar los despliegues del programa. La cantidad depende del tamaño de tu programa.

Para devnet o localhost, fondea tu billetera usando el comando solana airdrop:

Terminal
$
solana airdrop 2

Verifica el saldo de tu billetera:

Terminal
$
solana balance

Operaciones básicas

Compilar programa

Para compilar un programa, usa el comando cargo build-sbf:

Terminal
$
cargo build-sbf

Programa de ejemplo

Aquí hay un programa mínimo de Solana que imprime "Hello, Solana!" en los registros del programa.

src/lib.rs
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
msg!("Hello, Solana!");
Ok(())
}

Resultado de la compilación

Compila tu programa usando el comando cargo build-sbf:

Terminal
$
cargo build-sbf

Esto crea dos archivos importantes en target/deploy/:

  1. hello_world-keypair.json: Un archivo de keypair cuya clave pública se usará como tu ID de programa
  2. hello_world.so: El ejecutable del programa compilado

Programa de ejemplo

Aquí hay un programa mínimo de Solana que imprime "Hello, Solana!" en los registros del programa.

Resultado de la compilación

Compila tu programa usando el comando cargo build-sbf:

Terminal
$
cargo build-sbf

Esto crea dos archivos importantes en target/deploy/:

  1. hello_world-keypair.json: Un archivo de keypair cuya clave pública se usará como tu ID de programa
  2. hello_world.so: El ejecutable del programa compilado
lib.rs
Cargo.toml
use solana_program::{
account_info::AccountInfo, entrypoint, entrypoint::ProgramResult, msg, pubkey::Pubkey,
};
entrypoint!(process_instruction);
pub fn process_instruction(
_program_id: &Pubkey,
_accounts: &[AccountInfo],
_instruction_data: &[u8],
) -> ProgramResult {
msg!("Hello, Solana!");
Ok(())
}

Verificar el tamaño y costo del programa

Implementar un programa requiere SOL que se asignará a la cuenta del programa según el tamaño del programa. Los programas más grandes cuestan más SOL para implementar.

Verifica el tamaño de tu programa:

Terminal
$
wc -c < ./target/deploy/hello_world.so

Calcula el SOL requerido para este tamaño (bytes):

Terminal
$
solana rent 18504

Necesitarás un poco más de SOL que lo mostrado para cubrir las comisiones de transacción de implementación.

Implementar programa

Usa el comando solana program deploy para implementar tu programa:

Terminal
$
solana program deploy ./target/deploy/hello_world.so

El Id del programa mostrado es la dirección permanente de tu programa en la red.

Para implementar con un ID de programa específico (en lugar del generado automáticamente), usa:

Terminal
$
solana program deploy ./target/deploy/hello_world.so --program-id ./custom-keypair.json

Puedes generar nuevos keypairs usando el comando solana-keygen:

Terminal
$
solana-keygen new -o ./custom-keypair.json

Actualizar programa

Actualiza tu programa usando el mismo comando solana program deploy:

  1. Haz cambios en el código de tu programa
  2. Reconstruye tu programa: cargo build-sbf
  3. Despliega la actualización:
Terminal
$
solana program deploy ./target/deploy/hello_world.so

Si tu programa actualizado requiere más espacio (bytes) del que está actualmente asignado, el despliegue extenderá automáticamente la cuenta del programa. Esto ocurre cuando tu nuevo programa es más grande que la versión anterior. La cuenta del programa necesita bytes adicionales para almacenar el nuevo programa. La CLI calculará el SOL requerido y lo deducirá de tu billetera automáticamente.

También puedes extender manualmente un programa para asignar más bytes:

Terminal
$
solana program extend 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE 1000

Gestión de programas

Una vez que tu programa está desplegado, hay varios comandos comunes para gestionar la cuenta del programa.

Ver metadatos del programa

Para verificar los metadatos de tu programa, usa el comando solana program show:

Terminal
$
solana program show 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE

Ejemplo de salida:

$ solana program show 7283x8k8fyBcfaFLyPsxbd2VV1AMmZFP7FNoyTXVKJw7
Program Id: 7283x8k8fyBcfaFLyPsxbd2VV1AMmZFP7FNoyTXVKJw7
Owner: BPFLoaderUpgradeab1e11111111111111111111111
ProgramData Address: Gqn7YQVCP8NtYV1qkEqR4Udhj8EJ3fkikvS7HskCNQ7c
Authority: 5kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1
Last Deployed In Slot: 6573
Data Length: 18504 (0x4848) bytes
Balance: 0.12999192 SOL

Transferir la autoridad del programa

Para transferir la autoridad del programa a una cuenta diferente, utiliza el comando solana program set-upgrade-authority:

Terminal
$
solana program set-upgrade-authority 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --new-upgrade-authority ./new-authority-keypair.json

Después de transferir la autoridad del programa, ya no podrás actualizar el programa a menos que tengas acceso al nuevo keypair de autoridad.

Hacer tu programa inmutable

Para hacer tu programa inmutable, utiliza el comando solana program set-upgrade-authority con la bandera --final para eliminar la autoridad del programa:

Terminal
$
solana program set-upgrade-authority 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --final

Una vez que un programa es inmutable, nunca podrá ser actualizado o cerrado.

Cerrar tu programa

Para cerrar tu programa y recuperar el SOL asignado a la cuenta del programa, utiliza el comando solana program close:

Terminal
$
solana program close 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --bypass-warning

Una vez cerrado, el ID del programa no puede ser reutilizado. No puedes implementar un nuevo programa en la misma dirección.

Comandos de utilidad

Listar todos los programas

Ver todos los programas donde tu billetera actual es la autoridad:

Terminal
$
solana program show --programs

Ejemplo de salida:

Program Id | Slot | Authority | Balance
-------------------------------------------------|------------|------------------------------------------------|-------------
7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE | 249885434 | 5kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1 | 0.12999192
3KSGCk4m5hqJkTjPHBXUCPcqMwJnK3VmkqEsFUKKGJPK | 249883212 | 5kh6HxYZiAebF8HWLsUWod2EaQQ6iWHpHYCz8UcmFbM1 | 0.28654328

Descargar un programa implementado

Para descargar un programa implementado, utiliza el comando solana program dump:

Terminal
$
solana program dump 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE ./downloaded_program.so

Opciones avanzadas

Indicadores de implementación

Cuando la red de Solana está congestionada, utiliza estos indicadores para ayudar con la implementación del programa.

Ejemplo de uso:

Terminal
$
solana program deploy ./target/deploy/hello_world.so \
--with-compute-unit-price 10000 \
--max-sign-attempts 10 \
--use-rpc

Explicación de las opciones:

  • --with-compute-unit-price: Establece la tarifa prioritaria en micro-lamports (0.000001 SOL) por unidad de cómputo. Consulta la API de tarifas prioritarias de Helius para conocer las tarifas actuales. Una tarifa prioritaria es una tarifa adicional que se paga al líder actual para priorizar tu transacción.
  • --max-sign-attempts: Número de veces que se reintentará con un nuevo blockhash si las transacciones expiran. (Predeterminado: 5)
  • --use-rpc: Envía transacciones al RPC configurado. Este indicador requiere una conexión RPC ponderada por stake de proveedores como Triton o Helius.

Is this page helpful?