Solana/Program Development Basics/Upgrading Programs

In Solana, you can replace the code of an already deployed program. However, note that the deployment and update mechanisms for Solana programs have evolved over time. In earlier versions, programs were immutable and couldn't be upgraded.

How to Upgrade a Program

To upgrade a program, you can use the pxsol.wallet.Wallet.program_update() method. Upgrading a program does not change its address.

import pathlib
import pxsol

ada = pxsol.wallet.Wallet(pxsol.core.PriKey.int_decode(0x01))
program_pubkey = pxsol.core.PubKey.base58_decode('DVapU9kvtjzFdH3sRd3VDCXjZVkwBR6Cxosx36A5sK5E')
program_data = pathlib.Path('target/deploy/pxsol_ss.so').read_bytes()
ada.program_update(program_pubkey, program_data)

Solana Programs Were Immutable In the Early Stages

In the early days of Solana, the program manager was called the BPF loader, also known as v1. Programs deployed with it were marked as completely immutable: all data was read-only, all code was locked, and the program account's executable flag was set to true. Under this deployment model, you couldn't upgrade the program! If you wanted to update it, you'd have to deploy a new program and update every dependent account and frontend logic, an extremely tedious process.

Evolution

The BPF loader in Solana is a special native program designed to load and execute your uploaded BPF bytecode. Over time, Solana's loaders have evolved through three major versions:

Loader Name Address Features
BPFLoader (v1) BPFLoader111111111111...111 Early version, programs were immutable
BPFLoader2 (v2) BPFLoader211111111111...111 More efficient loading, still immutable
BPFLoaderUpgradeable (v3) BPFLoaderUpgradeab1e1...111 Default now, supports upgrades and access control

Starting from v3, Solana introduced the concept of upgradeable programs, making it the default deployment approach.

Structure of an Upgradeable Program

Pxsol uses v3 by default to deploy programs. This automatically creates two accounts:

Account Type Role
Program account Main address, exposed entry point
Program data account Stores the actual bytecode, mutable
Program ID (e.g., MyProgram111...)
│
├──> Program Account
│     └── owner: BPFLoaderUpgradeable
│     └── executable: true
│     └── points to:
│
└──> ProgramData Account
      └── contains: .so 字节码
      └── contains: upgrade_authority pubkey

In essence, upgrading a program is about modifying the second account's content.