OptiFi 程序事件报告 - 08/29/22

  • OptiFi
  • 发布于 2022-08-31 11:56
  • 阅读 14

OptiFi 由于操作失误关闭了主网程序,导致 66.1 万 USDC 的用户资金被锁定在链上。OptiFi 团队承诺全额赔偿用户损失,并提出了改进措施以避免类似事件再次发生。他们还建议 Solana 官方在文档和 CLI 中添加关于关闭程序的警告,并增加关闭程序的双重确认机制。

OptiFi 项目事故报告 — 2022年8月29日

概要

  1. 我们真诚地为导致 OptiFi 主网程序突然关闭的项目事故道歉,我们无法恢复它
  2. 总计 66.1 万 USDC 的资金全部锁定在链上的 PDA 中
  3. 我们将赔偿所有用户的资金,并防止再次发生
  4. 我们呼吁所有 Solana 开发者谨慎使用‘ solana program close’
  5. 我们建议 Solana 官方在 Solana 文档和命令行界面(CLI)中添加关于关闭程序不可恢复的结果的警告,以帮助 Solana 开发者理解该功能

背景

在 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 获取最新更新。我们将在那里回答所有用户的问题。

如何发生的?

  • OptiFi 程序 ID: optFiKjQpoQ3PvacwnFWaPUAqXCETMJSz2sz8HwPe9B
  • 部署者地址: DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M
  1. 在 8 月 29 日 UTC 时间 06:00 左右,我们开始使用以下命令行和我们的部署地址进行部署(我们的程序是用 Anchor 构建的)。
$ 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
  1. 部署交易花费的时间比平时长得多,而不是很快返回成功标志 - 可能是因为网络状态不佳,因此我们使用 ‘CTL+C’ 中止了部署过程。

  2. 后来我们发现,在下面的部署交易中,有 17.2023808 SOL 被转移到了新的缓冲区账户中,我们的部署钱包中还剩下 14.96709408 SOL。

https://explorer.solana.com/tx/4RRh5kHWf6oh5VfewVevVYT1V53ktC1tK6airHnBN7Tuo4TvhiPYgdTixwJohfJWSTPJp247unCSuVc9dK1KM6Rk

  1. 这意味着创建了一个新的缓冲区账户,但程序账户不会使用它,因此我们想把新的缓冲区账户中的 SOL 代币取回来。

  2. 我们运行了以下命令行:

$ 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。

  1. 然后我们记得,我们曾经在没有使用 Solana devnet 上的缓冲区账户内存短语的情况下成功收集了缓冲区账户中的 SOL 代币。该方法是关闭程序账户,缓冲区账户的 SOL 余额可以收回。

  2. 因此,我们运行以下代码关闭程序:

$ solana program close -u mainnet-beta optFiKjQpoQ3PvacwnFWaPUAqXCETMJSz2sz8HwPe9B
--recipient DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M -k
~/solana-keys/DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M.json --authority
~/solana-keys/DpLY9ZAomC35AXfWQmJvu7kVJgaSYyUVyCm9miZ6tj4M.json
  1. 在 06:07 UTC - 命令行成功执行,OptiFi 程序已关闭。https://explorer.solana.com/tx/4dPWDPhDHPJhCjqcxoFosa8pbYzdvpR5LhKZ9EYjK9YpvgBTWsKhX37U9jSV1qyj3xbjvm5mpzStTiNaexVaN3jg

  2. 关闭程序后,我们获得了足够的 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: “” }.
  1. 直到出现上面的错误,我们才意识到该程序已永久关闭。它基本上是说我们部署的程序已被关闭,无法重新部署,除非使用新的程序 ID。

  2. 我们立即在 Solana discord 上搜索了相关主题,并向 Solana 的一位核心开发人员进行了咨询,但我们得到的答案都强烈表明我们无法再将程序重新部署到之前的程序 ID optFiKjQpoQ3PvacwnFWaPUAqXCETMJSz2sz8HwPe9B

事实证明,我们并没有真正理解此关闭程序命令行的影响和风险。‘ solana program close’ 实际上是用于永久关闭程序,并将程序使用的缓冲区账户中的 SOL 代币发送回接收者钱包。

影响

  1. 我们的 OptiFi 程序,ID 为 optFiKjQpoQ3PvacwnFWaPUAqXCETMJSz2sz8HwPe9B,已永久关闭,无法再调用。
  2. 所有用户的保证金账户 USDC 代币、期权代币和 AMM USDC 金库都锁定在它们所在的位置,因为它们使用的是 PDA,而 PDA 绑定到 optFiKjQpoQ3PvacwnFWaPUAqXCETMJSz2sz8HwPe9B.
  3. 根据 我们在 Defi Llama 上的 TVL,锁定的 USDC 总金额约为 66.1 万 USDC。
  4. AMM 竞赛 的参与者不会受到影响。我们将在 9 月 5 日宣布获胜者。

我们惨痛地吸取的教训

每次部署都需要严格的流程,并且可以避免单点故障。请不要像我们一样匆忙,特别是对于 DEFI 项目。

接下来 - 我们如何做得更好以避免这种情况?

严格执行同行监督方法,要求至少 3 名同行参与部署过程

  • 我们将采用同行监督方法,要求至少 3 名同行参与部署过程。他们有责任提醒主要部署者任何潜在风险,并确保每个步骤都符合部署指南和规范。
  • 如果在部署过程中发生任何异常情况,例如网络状态不佳或部署费用不足,我们应该冷静下来并与同行进行讨论,以确保每个操作都是安全的。同时,我们应该记下每个命令行和返回的消息,以供将来参考。

我们将从程序设计上将资本池(AMM)与我们的主程序分开,以最大程度地减少此类错误的影响

给 Solana 官员的建议

关于 solana dev 文档和命令行界面(CLI)的建议,以防止开发人员进行鲁莽部署

Solana 的官方文档网站上有关于如何关闭程序和缓冲区帐户的教程,但它没有提及这样做的潜在风险。因此,我们建议 Solana 官方在 solana 文档 中添加描述,以警告关闭程序的结果。

来源:https://docs.solana.com/cli/deploy-a-program

关闭程序的双重确认

当运行 ‘solana program close’ 时,没有警告或提醒开发人员清楚地了解他们通过运行此命令行所做的事情。因此,我们建议为运行 ‘solana program close’ 添加两步确认。

转发此推文

请分享此信息,以防止再次发生此类事件。

向所有开发者提出的开放性问题

你如何管理你的部署风险?

请在 推文 中发表评论并与我们分享。我们乐于讨论并接受所有建议!以下是一些建议:

Program Closure Leads To Inability To Reuse ProgramID · Issue #22005 · solana-labs/solana \ \ Problem Recently the ability to close program accounts was introduced, allowing one to reclaim the lamports used to…\ \ github.com

cli: Require `--bypass-warning` flag to close program accounts by jstarry · Pull Request #27108 ·… \ \ Problem There's no confirmation step when closing a program with the CLI. Closing a program is irreversible so this UX…\ \ github.com

保持联系以获取最新更新

🌐 网站:https://www.optifi.app

🕊 Twitter:https://twitter.com/OptifiLabs

👾 Discord:https://discord.gg/qJ7rumqBQJ

📚 GitBook:https://optifi.gitbook.io/optifi/

  • 原文链接: medium.com/%40OptiFi/opt...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
OptiFi
OptiFi
江湖只有他的大名,没有他的介绍。