solana 合约部署在官方的所有文档中都没有详细且系统的提及,因此在部署的时候大家可能会有很多困惑,而且 solana 合约部署并不是一笔小的费用,因此更加需要小心谨慎
首先.so 文件的大小和代码量正相关
如果想要查询当前程序的租金,可以使用
solana rent <N>
这里的 N 就是 .so 文件的大小 (464kb 就是 464000) (在新版本的 cli 中,通过 anchor deploy 部署的合约,程序账户已经不是 2x 的大小了,很多老的回答中会说程序账户的大小是 2x 的.so 文件大小)
之后如果添加了一些指令导致.so 文件变大,那么就需要通过 (Solana Cli >1.18)
solana program extend <PROGRAM_ID> <MORE_BYTES>
来扩大程序账户的大小,否则会报错 "account data too small for instruction"
eg:如果第一次部署的程序大小是 183kb,第二次部署的大小为 197kb,那么就需要通过solana program extend
来扩大 14kb
同样,扩大的 14kb 价格也可以通过 solana rent 14000
来查询
当程序账户的大小满足了之后,就可以通过 anchor deploy
再次部署 (升级) 我们的项目 (现在版本的 cli 中,如果该程序 id 已经部署那么 anchor deploy 就相当于 anchor upgrade) , 此时只会花费发送交易的金额
现在假设旧帐户程序 183kb,部署需要花费 1.2sol ; 新程序账户大小是 197kb,部署需要花费 1.5sol 总的来说程序升级的过程中做了这些事情
如果部署失败 (如上面提到的"account data too small for instruction"的情况,sol 已经被扣除且过一段时间会存在缓冲账户中),可能需要自己关闭缓冲账户,然后尝试重新部署
查看自己的所有 buffer account
solana program show --buffers
可以关闭所有不需要的 buffer account 并且取回所有的 sol
solana program close <buffer account address>
参考:
program - How can I calculate the cost the deploy a progam to main net? - Solana Stack Exchange
solana program - Contract upgrade costs - Solana Stack Exchange
cli: Use program length for deployments instead of 2x length (#34730) · solana-labs/solana@5cb30cf