尧图精选

Solana 程序 redeploy 因新二进制更大而失败时如何调整 max-len 或 extend 账户?

🕒 发布时间:2026/9/15 18:36:06 📁 来源:尧图网络
Solana 程序 redeploy 因新二进制更大而失败时如何调整 max-len 或 extend 账户【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana在 Solana 上迭代程序时一个常见情况是程序已经部署到某个地址修改代码重新编译后.so变大了执行 redeploy 却失败。原因是按 deploy-a-program 的说明程序默认部署到与原始程序文件等大的账户——如果 redeploy 的新程序更大redeployment 会直接失败。本文基于 Solana 仓库的 CLI 文档给出两条官方处理路径在 deploy 命令上用--max-len预留空间或先用solana program extend扩大已部署程序的数据账户最后说明如何验证结果、以及 redeploy 失败后如何回收残留的 buffer 账户。适用前提程序是 upgradeable 程序由BPFLoaderUpgradeab1e11111111111111111111111111这类 loader 部署且你持有该程序的 upgrade authority——文档明确指出 The programs upgrade authority must be present to deploy a program。如果程序已被标记 immutable--final则禁止一切 redeploy两条路径都不适用。先判断当前账户预留了多少空间redeploy 前先用program show查看已部署程序solana program show ACCOUNT_ADDRESS文档给出的示例输出文档示例地址和数值以你实际查询结果为准Program Id: 3KS2k14CmtnuVv2fvYcvdrNgC94Y11WETBpMUGgXyWZL Owner: BPFLoaderUpgradeab1e11111111111111111111111111 ProgramData Address: EHsACWBhgmw8iq5dmUZzTA1esRqcTognhKNHUkPi4q4g Authority: FwoGJNUaJN2zfVEex9BB11Dqb3NJKy3e9oY3KTh9XzCU Last Deployed In Slot: 63890568 Data Length: 5216 (0x1460) bytes其中Data Length是账户为部署预留的空间大小The actual space used by the currently deployed program may be less——即预留值可能大于当前程序实际占用的空间。判断标准新.so的二进制字节数如果超过Data Length对应的预留空间redeploy 就会失败。注意自 1.18.0 起这个判断更关键CHANGELOG.md 的 1.18.0 条目说明New program deployments default to the exact size of a program, instead of double the size. Program accounts must be extended withsolana program extendbefore an upgrade if they need to accommodate larger programs.也就是说 1.18.0 之前的部署默认多留一倍空间1.18.0 及之后的新部署默认只给精确大小几乎没有余量程序稍微变大就触及上限。路径一redeploy 时用--max-len一并扩大如果你还没有执行这次失败的 redeploy或者打算用一次新的 deploy 直接完成最省事的方式是给 deploy 命令加上--max-len取一个不小于程序预期大小的值文档建议再留一些余量solana program deploy --max-len 200000 PROGRAM_FILEPATHPROGRAM_FILEPATH是编译产出的.so路径。如果程序 id 没有显式给出redeploy 会落到PROGRAM_NAME-keypair.json对应的默认地址——该 keypair 在程序首次编译时生成与.so同目录同名前缀例如./path-to-program/program.so ./path-to-program/program-keypair.json也可以显式指定程序 id 的 keypair 文件solana program deploy --program-id KEYPAIR_FILEPATH PROGRAM_FILEPATH--max-len 200000是文档中的示例值实际应设为新程序预期字节数再加余量它只在这次 deploy 中生效账户预留空间随这次部署一起更新。路径二用solana program extend扩大已部署账户如果程序已部署、redeploy 因超max_len失败且你不想或不能把扩大空间合并进一次 deploy可以先单独扩展数据账户solana program extend PROGRAM_ID ADDITIONAL_BYTESPROGRAM_ID是要扩展的程序地址ADDITIONAL_BYTES是为程序数据账户额外分配的字节数取值是u32且必须大于 0。从 cli/src/program.rs 中process_extend_program的实现可以核对这条命令的前置校验失败时会给出对应错误信息错误信息含义Additional bytes must be greater than zeroADDITIONAL_BYTES传了 0Unable to find program pubkey链上找不到该程序账户Account pubkey is not an upgradeable program该账户不是 upgradeable loader 部署的程序Program pubkey is not upgradeable程序没有 upgrade authority例如已 immutable无法扩展命令本身由默认 keypairconfig 中第一个 signer作为 payer。执行 extend 后再正常执行solana program deploy PROGRAM_FILEPATH完成 redeploy 即可。两条路径怎么选还没发出这次 redeploy 交易时路径一一次到位已经部署很久、每次升级只比上限大一点时路径二更直接。两者本质相同——都是扩大 program-data 账户的空间。验证结果扩展与 redeploy 完成后再次查询程序账户solana program show ACCOUNT_ADDRESSData Length应反映扩大后的预留空间redeploy 成功后deploy命令会返回程序 id文档示例文档示例以实际输出为准Program Id: 3KS2k14CmtnuVv2fvYcvdrNgC94Y11WETBpMUGgXyWZL如果想进一步确认链上内容与本地二进制一致文档给出了 dump 对比的做法solana program dump ACCOUNT_ADDRESS OUTPUT_FILEPATH会导出整个数据空间.so数据之后到max_len为止是尾随零把 dump 文件零截断后与原始文件做sha256sum比较即可$ solana dump ACCOUNT_ADDRESS dump.so $ cp original.so extended.so $ truncate -r dump.so extended.so $ sha256sum extended.so dump.soredeploy 失败后处理残留的 buffer 账户如果 deploy 交易中途失败链上会留下一个持有非零余额的中间 buffer 账户。文档说明部署失败时会打印恢复用的 12 词 seed phrase下面是文档示例实际以失败输出为准 Recover the intermediate accounts ephemeral keypair file with solana-keygen recover and the following 12-word seed phrase: valley flat great hockey share token excess clever benefit traffic avocado athlete To resume a deploy, pass the recovered keypair as the [BUFFER_SIGNER] to solana program deploy or solana program write-buffer. Or to recover the accounts lamports, pass it as the [BUFFER_ACCOUNT_ADDRESS] argument to solana program drain. 两种处置方式续传部署先用 seed phrase 恢复 keypair再把该 buffer 传给新的 deploy 命令solana-keygen recover -o KEYPAIR_PATH按提示输入 12 词 seed phrase然后solana program deploy --buffer KEYPAIR_PATH PROGRAM_FILEPATH回收 lamports文档中列出了关闭并回收余额的方式。用默认 authority 的账户可以用solana program close --buffers关闭当前 authority 名下的所有 buffer 账户或用solana program close BADDRESS关闭单个账户非默认 authority 用solana program close ADDRESS --buffer-authority KEYPAIR_FILEPATH。可用solana program show --buffers加--all可列出所有 authority 的 buffer先确认账户列表。关闭的前提是 buffer 账户的 authority 在手。限制与边界这两条路径都只适用于 upgradeable 程序--final标记的 immutable 程序 prevents all further redeployments既不能 redeploy 也不能 extend源码校验会报not upgradeable。extend 与 deploy 一样需要 upgrade authority 在场authority 不在默认 keypair 时deploy 可用--upgrade-authority UPGRADE_AUTHORITY_SIGNER显式指定。1.18.0 之前部署的程序默认预留空间约为程序大小的两倍1.18.0 起新部署默认精确大小——排查以前能 redeploy 现在不行了这类问题时对照 CHANGELOG.md 的这条版本变化即可解释。Data Length是预留空间而非实际占用不要把查询到的Data Length当成当前.so的真实大小。命令细节与更多 redeploy 相关操作offline 升级、set-buffer-authority等可回查 docs/src/cli/examples/deploy-a-program.mdCLI 参数定义与校验逻辑见 cli/src/program.rs。【免费下载链接】solanaWeb-Scale Blockchain for fast, secure, scalable, decentralized apps and marketplaces.项目地址: https://gitcode.com/GitHub_Trending/so/solana创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →