BUILDING ON SOLANA

Deploying Programs

Complete guide to building, deploying, and managing Solana programs using the Solana CLI.

This section walks through the basic process of deploying a Solana program using the Solana CLI.

CLI Command Reference

TaskCommand
Build programcargo build-sbf
Deploy new programsolana program deploy <path_to_program.so>
Update existing programsolana program deploy <path_to_program.so> (same as deploy)
Show program infosolana program show <program-id>
Transfer program authoritysolana program set-upgrade-authority <program-id> --new-upgrade-authority <path_to_keypair>
Make program immutablesolana program set-upgrade-authority <program-id> --final
Close programsolana program close <program-id> --bypass-warning
Check wallet balancesolana balance
Request airdrop (devnet/localhost)solana airdrop 2

Key Concepts

Before diving in, let's clarify some terminology:

  • Program ID: The onchain address of your program. Users interact with your program by referencing the Program ID.
  • Program Account: The onchain account that stores your program's metadata. The program account's address is the Program ID. The program account also stores the address of the ProgramData Account.
  • ProgramData Account: The onchain account that stores your program's deployed executable code.
  • Program Authority: The account that has permission to update or close the program. By default, this is your CLI wallet.

Prerequisites

1Install the Solana CLI

2Set Up Wallet

After installation, create a local keypair wallet. The address of this wallet is set as the default program authority when deploying programs:

Terminal
$ solana-keygen new

This creates a keypair at ~/.config/solana/id.json by default.

3Configure Cluster

Choose which Solana cluster to deploy to. Use the solana config get command to check your current configuration:

Terminal
$ solana config get
Config File: ~/.config/solana/cli/config.yml
RPC URL: http://localhost:8899
WebSocket URL: ws://localhost:8900/ (computed)
Keypair Path: ~/.config/solana/id.json
Commitment: confirmed

Switch between clusters as needed:

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"

4Fund Wallet

You'll need SOL to pay for program deployments. The amount depends on your program size.

For devnet or localhost, fund your wallet using the solana airdrop command:

Terminal
$ solana airdrop 2
Requesting airdrop of 2 SOL
Signature: 5zQKxvRdgJDA8fRGPdKfGxRLnLpwmNnMXGYxfBqFSUPqc5BTmFPrTG8vnC4HvKDVY8zQ8aQxZxcEE7WFpGhZGVAA
2 SOL

Check your wallet balance:

Terminal
$ solana balance
2 SOL

Basic Operations

Build Program

To build a program, use the cargo build-sbf command:

Terminal
$ cargo build-sbf

Example Program

Here is a minimal Solana program that prints "Hello, Solana!" to the program logs.

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(())
}
Cargo.toml
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

[lib]
crate-type = ["cdylib", "lib"]

[dependencies]
solana-program = "2.2.0"

Build Output

Build your program using the cargo build-sbf command:

Terminal
$ cargo build-sbf

This creates two important files in target/deploy/:

  1. hello_world-keypair.json: A keypair file whose public key will be used as your Program ID
  2. hello_world.so: The compiled program executable
target/deploy/hello_world-keypair.json
[
  203, 253, 43, 62, 165, 111, 94, 222, 105, 225, 218, 85, 143, 9, 114, 96, 243,
  181, 114, 89, 72, 230, 124, 85, 59, 165, 198, 23, 240, 212, 23, 154, 229, 241,
  153, 61, 153, 105, 79, 204, 193, 163, 33, 65, 82, 183, 49, 240, 224, 137, 248,
  24, 128, 25, 192, 197, 118, 235, 239, 67, 85, 156, 219, 231
]
target/deploy/hello_world.so
[binary executable file]

Check Program Size and Cost

Deploying a program requires SOL to be allocated to the program account based on the size of the program. Larger programs cost more SOL to deploy.

Check your program's size:

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

Calculate the required SOL for this size (bytes):

Terminal
$ solana rent 18504
Rent-exempt minimum: 0.12967872 SOL

Deploy Program

Use the solana program deploy command to deploy your program:

Terminal
$ solana program deploy ./target/deploy/hello_world.so
Program Id: 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE
Signature: 2BYwsqRP7ZwBNQvJp3S8bphTJ4zKW5JBPVMqCTE5KyLkP8xHzAyUEeC4LdTgjJdGBKHWNCkRF8Mf1T1WkLFyEu8W

The Program Id shown is your program's permanent address on the network.

Update Program

Update your program using the same solana program deploy command:

  1. Make changes to your program code
  2. Rebuild your program: cargo build-sbf
  3. Deploy the update:
Terminal
$ solana program deploy ./target/deploy/hello_world.so
Program Id: 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE
Signature: 3zKnXDfEm1R8hVcEmTnNFYUaFjVVbLJrKdFj5hBMXoBRfz8xGyDhCYgKr9YY5KxKYPEUQQVfwEPNz9hQGvYhLNBJ

Program Management

Once your program is deployed, there are several common commands to manage the program account.

View Program Metadata

To check your program metadata, use the solana program show command:

Terminal
$ solana program show 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE

Example output:

Example output
$ 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

Program ID

The Program ID is the onchain address of your program account. Users and other programs invoke your program by referencing this ID in their transactions.

Owner

The Owner identifies which loader was used to deploy this program. For most programs, this will be the BPF Upgradeable Loader.

ProgramData Address

The ProgramData Address points to the separate account that stores your program's executable code.

Authority

The Authority is the account that has permission to upgrade or close this program. Only the authority can deploy updates or close the program to reclaim the program's allocated SOL.

Last Deployed In Slot

The Last Deployed In Slot indicates when this program was last updated.

Data Length

The Data Length shows the total bytes allocated to this program. This space can accommodate future updates that may be larger than the current program size.

Balance

The Balance displays the SOL allocated to the program account to store its data.

Transfer Program Authority

To transfer the program authority to a different account, use the solana program set-upgrade-authority command:

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

Make Your Program Immutable

To make your program immutable, use the solana program set-upgrade-authority command with the --final flag to remove the program authority:

Terminal
$ solana program set-upgrade-authority 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --final
Account Type: Program
Authority: none

Close Your Program

To close your program and reclaim the SOL allocated to the program account, use the solana program close command:

Terminal
$ solana program close 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE --bypass-warning
Closed Program Id 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE, 0.12999192 SOL reclaimed

Utility Commands

List All Programs

View all programs where your current wallet is the authority:

Terminal
$ solana program show --programs

Example output:

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

Download a Deployed Program

To download a deployed program, use the solana program dump command:

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

Advanced Options

Deployment Flags

When the Solana network is congested, use these flags to help with program deployment.

Example Usage:

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

Options explained:

  • --with-compute-unit-price: Set priority fee in micro-lamports (0.000001 SOL) per compute unit. Check Helius Priority Fee API for current rates. A priority fee is an additional fee that paid to the current leader to prioritize your transaction.
  • --max-sign-attempts: Number of times to retry with a new blockhash if transactions expire. (Default: 5)
  • --use-rpc: Send transactions to the configured RPC. This flag requires a stake-weighted RPC connection from providers such as Triton or Helius.

Educational reference only. This website does not execute commands, deploy programs, or submit blockchain transactions.