分享 使用 solana program deploy 部署程序时一直失败问题的解决办法

kl · 2024年11月08日 · 最后由 Eleven 回复于 2024年11月14日 · 69 次阅读

问题描述

使用 solana program deploy 在 testnet/devnet 部署程序时会失败(部署到 localhost 没问题),并报如下错误

thread 'main' panicked at cli/src/program.rs:2809:26:
Should return a valid tpu client: PubsubError(ConnectionError(Io(Os { code: 60, kind: TimedOut, message: "Operation timed out" })))
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

解决办法

  1. CLI 选用 v1.18.18 或以上。

    可供安装的版本列表: https://github.com/solana-labs/solana/releases

    CLI 安装命令: sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)"

    查看当前安装的 CLI 版本: solana --version

  2. 选择一个可靠的的 RPC node

    节点选择可以参考: https://soldev.cn/topics/14

    设置 solana CLI 默认的 RPC_URL: solana config set --url <RPC_URL>

  3. 使用 --with-compute-unit-price 参数,设置一个合适的优先费。

    优先费的数值可以参考: https://www.quicknode.com/gas-tracker/solana

  4. 部署程序的完整命令为 (如果在步骤 2 中已经设置了默认的 RPC_URL,--url 可以省略)。

    solana program deploy <PROGRAM_FILEPATH> --with-compute-unit-price <compute-unit-price> --url <RPC_URL>
    

扩展 - prioritization-fees

https://solana.com/docs/core/fees#prioritization-fees

solana 中每笔交易除了固定的签名费用之外,还可以设置一项可选费用"Prioritization fee"称为"优先费"。可以提高交易相对于其他交易的优先级,从而缩短执行时间。

  • "优先费" 通过 ComputeUnitLimit * ComputeUnitPrice 来计算。
  • 在交易中使用 SetComputeUnitLimit 和 SetComputeUnitPrice 指令来设置 ComputeUnitLimit/ComputeUnitPrice 的值。 rust 或者 @solana/web3.js 库中有快速生成这些指令的方法。
//rust solana-sdk crate
let instruction = ComputeBudgetInstruction::set_compute_unit_limit(300_000);
let instruction = ComputeBudgetInstruction::set_compute_unit_price(1);

//@solana/web3.js
const instruction = ComputeBudgetProgram.setComputeUnitLimit({
    units: 300_000,
});
const instruction = ComputeBudgetProgram.setComputeUnitPrice({
    microLamports: 1,
});
  • get_recent_prioritization_fees RPC 方法能获取节点最近处理的区块中最近支付的优先级费用列表。
kl 关闭了讨论。 11月08日 11:40
kl 重新开启了讨论。 11月08日 11:50
需要 登录 后方可回复, 如果你还没有账号请 注册新账号