OptiFi 由于操作失误关闭了主网程序,导致 66.1 万 USDC 的用户资金被锁定在链上。OptiFi 团队承诺全额赔偿用户损失,并提出了改进措施以避免类似事件再次发生。他们还建议 Solana 官方在文档和 CLI 中添加关于关闭程序的警告,并增加关闭程序的双重确认机制。
在 8 月 29 日 UTC 时间 06:00 左右,我们对 Solana 程序代码进行了更新,因此我们的部署者试图升级 Solana 主网上的 OptiFi 程序。
然而,我们不小心使用了 ‘solana program close’ 命令,导致我们在主网上的 OptiFi 程序不幸被关闭。所有用户的资金和在 OptiFi 上的未平仓位都锁定在 PDA 中,总计 66.1 万美元(AMM 金库、用户账户……),并且在撰写本文时无法恢复。
我们承诺,我们将根据 9 月 2 日 UTC 时间上午 8 点的 Pyth oracle 手动退还所有用户的存款并结算所有用户头寸。所有交易和存款将基于 Solscan。预计处理时间为两周。请前往我们的 discord 获取最新更新。我们将在那里回答所有用户的问题。
$ anchor deploy
Deploying workspace: https://api.mainnet-beta.solana.com
Upgrade authority: {PATH_TO}/DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M.json
Deploying program “Optifi”…
Program path: {PATH_TO}/OptiFi/Optifi/target/deploy/optifi.so…
⠉ [0/1] Finalizing transaction 4RRh5kHWf6oh5VfewVevVYT1V53ktC1tK6airHnBN7
^C
部署交易花费的时间比平时长得多,而不是很快返回成功标志 - 可能是因为网络状态不佳,因此我们使用 ‘CTL+C’ 中止了部署过程。
后来我们发现,在下面的部署交易中,有 17.2023808 SOL 被转移到了新的缓冲区账户中,我们的部署钱包中还剩下 14.96709408 SOL。
这意味着创建了一个新的缓冲区账户,但程序账户不会使用它,因此我们想把新的缓冲区账户中的 SOL 代币取回来。
我们运行了以下命令行:
$ solana program close -u mainnet-beta --recipient DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M -k ~/solana-keys/DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M.json --authority~/solana-keys/DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M.jsonerror: The following required arguments were not provided:
—-buffers
命令行显示缺少‘ --buffers’,因此我们认为应该在 ‘--buffers’ 标志后提供已创建的新缓冲区账户的内存短语。但是,由于部署 tx 的过程被中断,我们没有从上一步获得缓冲区账户的内存短语,因此我们认为我们无法取回缓冲区账户中的 17.2023808 SOL。
然后我们记得,我们曾经在没有使用 Solana devnet 上的缓冲区账户内存短语的情况下成功收集了缓冲区账户中的 SOL 代币。该方法是关闭程序账户,缓冲区账户的 SOL 余额可以收回。
因此,我们运行以下代码关闭程序:
$ solana program close -u mainnet-beta optFiKjQpoQ3PvacwnFWaPUAqXCETMJSz2sz8HwPe9B
--recipient DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M -k
~/solana-keys/DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M.json --authority
~/solana-keys/DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M.json
在 06:07 UTC - 命令行成功执行,OptiFi 程序已关闭。https://explorer.solana.com/tx/4dPWDPhDHPJhCjqcxoFosa8pbYzdvpR5LhKZ9EYjK9YpvgBTWsKhX37U9jSV1qyj3xbjvm5mpzStTiNaexVaN3jg
关闭程序后,我们获得了足够的 SOL 余额(43.3883674 SOL)来进行部署,因此我们第二次开始部署程序:
$ anchor deploy
Deploying workspace: https://api.mainnet-beta.solana.com
Upgrade authority: {PATH_TO}/DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M.json
Deploying program “Optifi”…
Program path: {PATH_TO}/OptiFi/Optifi/target/deploy/optifi.so…Error: Program optFiKjQpoQ3PvacwnFWaPUAqXCETMJSz2sz8HwPe9B has been closed, use a new Program Id
There was a problem deploying: Output { status: ExitStatus(unix_wait_status(256)), stdout: “”, stderr: “” }.
直到出现上面的错误,我们才意识到该程序已永久关闭。它基本上是说我们部署的程序已被关闭,无法重新部署,除非使用新的程序 ID。
我们立即在 Solana discord 上搜索了相关主题,并向 Solana 的一位核心开发人员进行了咨询,但我们得到的答案都强烈表明我们无法再将程序重新部署到之前的程序 ID optFiKjQpoQ3PvacwnFWaPUAqXCETMJSz2sz8HwPe9B。
事实证明,我们并没有真正理解此关闭程序命令行的影响和风险。‘ solana program close’ 实际上是用于永久关闭程序,并将程序使用的缓冲区账户中的 SOL 代币发送回接收者钱包。
每次部署都需要严格的流程,并且可以避免单点故障。请不要像我们一样匆忙,特别是对于 DEFI 项目。
严格执行同行监督方法,要求至少 3 名同行参与部署过程
我们将从程序设计上将资本池(AMM)与我们的主程序分开,以最大程度地减少此类错误的影响
关于 solana dev 文档和命令行界面(CLI)的建议,以防止开发人员进行鲁莽部署
Solana 的官方文档网站上有关于如何关闭程序和缓冲区帐户的教程,但它没有提及这样做的潜在风险。因此,我们建议 Solana 官方在 solana 文档 中添加描述,以警告关闭程序的结果。
来源:https://docs.solana.com/cli/deploy-a-program
关闭程序的双重确认
当运行 ‘solana program close’ 时,没有警告或提醒开发人员清楚地了解他们通过运行此命令行所做的事情。因此,我们建议为运行 ‘solana program close’ 添加两步确认。
请分享此信息,以防止再次发生此类事件。
你如何管理你的部署风险?
请在 推文 中发表评论并与我们分享。我们乐于讨论并接受所有建议!以下是一些建议:
🕊 Twitter:https://twitter.com/OptifiLabs
👾 Discord:https://discord.gg/qJ7rumqBQJ
📚 GitBook:https://optifi.gitbook.io/optifi/
- 原文链接: medium.com/%40OptiFi/opt...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!