文章/教程 solana 合约部署注意事项

dwuw · 2025年01月08日 · 63 次阅读

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 总的来说程序升级的过程中做了这些事情

  • 创建新的程序账户大小为 197kb 的 buffer account,此时会扣除 1.5sol
  • 使用多个交易来写入 buffer(一个交易最大为 1332byte)
  • 程序账户拓展到 1.5sol 的大小,即 197kb
  • 程序账户数据会被 buffer 账户的数据替换
  • 如果成功,buffer 账户将会被自动关闭,也就是说最终支付了 0.3sol 和总共的交易费

如果部署失败 (如上面提到的"account data too small for instruction"的情况,sol 已经被扣除且过一段时间会存在缓冲账户中),可能需要自己关闭缓冲账户,然后尝试重新部署

查看自己的所有 buffer account

solana program show --buffers

可以关闭所有不需要的 buffer account 并且取回所有的 sol

solana program close <buffer account address> 

参考:

What's the difference between anchor deploy and upgrade when updating existing programs? - Solana Stack Exchange

program - How can I calculate the cost the deploy a progam to main net? - Solana Stack Exchange

What's the difference between anchor deploy and upgrade when updating existing programs? - 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

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号