编译与部署
1. 编译程序
编写完代码后,我们需要将其翻译成 Solana 区块链能听懂的语言:SBF (Solana Bytecode Format),这是 eBPF 的一种变体。
使用 Solana 提供的工具链进行编译:
bashcargo build-sbf -- -Znext-lockfile-bump
编译成功后,在 target/deploy/ 目录下会生成一个 solana_storage.so 文件。
这是一个二进制共享库文件,也就是我们将要上传到区块链上的“本体”。
2. 部署原理:为什么这么麻烦?
在以太坊上,部署合约通常是一笔交易搞定。但在 Solana 上,一个程序可能由几百 KB 甚至几 MB 组成。 而 Solana 的单笔交易大小限制仅为 1232 字节。
你不可能把大象塞进冰箱,除非切成块。因此,Solana 的部署过程分为三个阶段:
- 创建缓冲账户 (Initialize Buffer):在链上创建一个临时的“中转站”账户,并按程序大小支付租金。
- 分片上传 (Write):将
.so文件切分成无数个小块(Chunks),通过成百上千笔交易,一点点写入这个缓冲账户。 - 最终部署 (Deploy/Upgrade):当缓冲账户写满后,发送最后一条指令,将缓冲账户标记为“可执行 (Executable)”,并将其所有权移交给 BPF Loader。
3. 部署代码示例
你可以使用 Solana CLI 部署,也可以使用代码部署。这里我们展示使用 Python 库 pxsol 的部署方式,它封装了上述复杂的流程。
pythonimport pathlib import pxsol # 开启日志以便观察分片上传过程 pxsol.config.current.log = 1 # 加载部署者的钱包 (需要有足够的 SOL 支付租金) # 0x01 是示例私钥,实际请使用你的密钥文件 ada = pxsol.wallet.Wallet(pxsol.core.PriKey.int_decode(0x01)) # 读取编译好的二进制文件 program_data = pathlib.Path('target/deploy/solana_storage.so').read_bytes() # 执行部署 # 这会在后台自动处理:创建Buffer -> 分片写入 -> Finalize program_pubkey = ada.program_deploy(bytearray(program_data)) print(f"✅ 程序部署成功!Program ID: {program_pubkey}")
常用 CLI 命令
如果你更习惯使用命令行,标准操作如下:
bash# 部署 solana program deploy target/deploy/solana_storage.so # 更新 (如果程序是可升级的) solana program write-buffer target/deploy/solana_storage.so solana program set-buffer-authority <BUFFER_ADDRESS> --new-buffer-authority <PROGRAM_AUTHORITY> solana program deploy --program-id <PROGRAM_ID> --buffer <BUFFER_ADDRESS>
4. 成本与租金
部署程序通常需要花费较多的 SOL,因为你需要为存储代码的账户支付租金豁免费。 例如,一个 200KB 的程序大约需要 1.4 SOL 的租金。
- Buffer Account: 临时存储,部署完成后会销毁,租金退回(如果是 upgrade)或转移到程序账户。
- Program Account: 永久存储代码,必须保持 Rent Exempt。
- Executable Data Account: 存储实际的字节码。
提示:在 Devnet 测试网部署时,如果遇到 "Insufficient funds" 错误,记得先
solana airdrop 2多领几次空投。