This section walks through the basic process of deploying a Solana program using the Solana CLI.
CLI Command Reference
| Task | Command |
|---|---|
| Build program | cargo build-sbf |
| Deploy new program | solana program deploy <path_to_program.so> |
| Update existing program | solana program deploy <path_to_program.so> (same as deploy) |
| Show program info | solana program show <program-id> |
| Transfer program authority | solana program set-upgrade-authority <program-id> --new-upgrade-authority <path_to_keypair> |
| Make program immutable | solana program set-upgrade-authority <program-id> --final |
| Close program | solana program close <program-id> --bypass-warning |
| Check wallet balance | solana 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
First, install 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:
$ 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:
$ 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:
$ 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:
$ solana airdrop 2
Requesting airdrop of 2 SOL
Signature: 5zQKxvRdgJDA8fRGPdKfGxRLnLpwmNnMXGYxfBqFSUPqc5BTmFPrTG8vnC4HvKDVY8zQ8aQxZxcEE7WFpGhZGVAA
2 SOL
Check your wallet balance:
$ solana balance
2 SOL
Basic Operations
Build Program
To build a program, use the cargo build-sbf command:
$ cargo build-sbf
Example Program
Here is a minimal Solana program that prints "Hello, Solana!" to the program logs.
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(())
}
[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:
$ cargo build-sbf
This creates two important files in target/deploy/:
hello_world-keypair.json: A keypair file whose public key will be used as your Program IDhello_world.so: The compiled program executable
[
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
]
[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:
$ wc -c < ./target/deploy/hello_world.so
18504
Calculate the required SOL for this size (bytes):
$ solana rent 18504
Rent-exempt minimum: 0.12967872 SOL
Deploy Program
Use the solana program deploy command to deploy your program:
$ 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:
- Make changes to your program code
- Rebuild your program:
cargo build-sbf - Deploy the update:
$ 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:
$ solana program show 7NxQjW8H8hVcqBKgXbVDWqGQCovHbqDW9p1SJJwUyTpE
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:
$ 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:
$ 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:
$ 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:
$ solana program show --programs
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:
$ 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:
$ 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.