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.