Rustスマートコントラクト開発日記(10-2)
BlockSec
2022-04-03 04:13
本文约4501字,阅读全文需要约18分钟
この記事では、Sputnik_DAOv2::Factory Contract の契約解釈について説明します。

前文1. スプートニク-DAO工場契約

スプートニク-DAOは、プラットフォームの分散型自律組織(DAO)の統一的な作成と管理を実現するために、創造的な工場設計パターン(Factory Pattern)を採用しています。

この記事では、Sputnik-DAO プラットフォーム ファクトリ パターン (sputnikdao-factory) の設計と実装について詳しく紹介します。

対応するコントラクトのソース コード ウェアハウスは、https://github.com/near-daos/sputnik-dao-contract/tree/518ad1d97614fff4b945aba75b6c8bd2483187a2 にあります。

最初のレベルのタイトル

2. DAPPモジュールの機能紹介

スプートニク DAO プラットフォームの DAPP ページを開くと、多くの分散型自律組織がプラットフォーム上で独自の DAO インスタンス オブジェクト (Sputnikdaov2 コントラクト) を作成およびカスタマイズしていることがわかります。

2022年3月の時点で、このプラットフォームの下で作成された最も活発なDAOはnews.sputnik-dao.nearであり、3,051件の提案(提案)が公開投票中または終了状態となっています。

📄読者の便宜のために、契約の構造図を参考として上に示します。

つまり、スプートニク DAO プラットフォームに基づいて作成されたすべての DAO インスタンス コントラクトは、NEAR アカウントのサブアカウントの下にデプロイされます。次に例を示します。

NEAR プロトコルのサブアカウントの定義については、https://docs.near.org/docs/concepts/account#subaccounts 🔗 でリファレンスを入手できます。

以下の図に示すように、分散型組織は NEAR メイン ネットワーク上でオープンにトランザクションを開始し、sputnikdao-factory コントラクトによって提供される create() メソッドを呼び出すことで新しい DAO インスタンスを作成できます。

3. スプートニクダオファクトリー契約コードの解釈

Rustのファクトリーモードコントラクトの書き方をより深く理解していただくために、この記事ではsputnikdao-factoryのコントラクトコードを深く解釈していきます。

3.1 DAOの作成

スプートニクダオ工場の契約状況は主に次の 2 つの部分で構成されます。

Base64 デコード後の args パラメータの具体的な内容は次のとおりです。

この内容はまさに、multicall.sputnik-dao.near コントラクトをデプロイする際にコントラクト初期化メソッド new() を実行する際に必要なコントラクト設定情報です。

次の記事では、factory_manager.create_contract の特定の実装を詳細に分析します。

この関数のパラメータは次のように指定されます。

分散型自律組織が提供するDAO基本情報:Config

5. callback_method: create_contract() メソッドの実行後のコールバック関数を指定します。この関数は、このファクトリ コントラクト内の新しい DAO インスタンス コントラクトの情報を維持および処理するために使用されます。

6. callback_args: コールバック関数の関数パラメータ。

この関数の実行は主に次のステップに分かれています。

最終的な DAO インスタンス コントラクトがデプロイされた後、on_create() 関数は、factory_manager.create_contract() 実行コード 32 ~ 53 行の最後でコールバックされます。

以下は、コールバック関数 on_create の内部コード実装です。

この関数の具体的な処理ロジックは次のとおりです。

文章

文章

文章

コードは次の場所にあります: sputnikdao-factory2/src/lib.rs # Line136-149

Factory_manager.update_contract()の処理詳細は以下のとおりです。 このインターフェースは、対応するDAOインスタンスコントラクト内のupdate()関数の呼び出しを実現できます。

以下の点に言及する価値があります。

BlockSec は、Sputnik-DAO コードの分析中に、Factory 契約に重大なセキュリティ上の問題を発見しました。これは、Sputnik-DAO を使用するすべての契約に影響を及ぼします。プロジェクト関係者に連絡した後、問題は最終的に確認され、時間内に修正されました。

💡セキュリティ脆弱性は具体的には次のように説明されています。

以前のバージョンのコードでは、sputinikdao ファクトリ コントラクトによって提供されるパブリック update() メソッドには、次のキー アサーション チェックが欠けていました。これにより、誰でもメソッドを呼び出すことができるようになります。

偶然にも、DAO インスタンス コントラクト (Sputnikdaov2 コントラクト) では、デフォルトで、クロスコントラクト呼び出しを通じて Sputnik-DAO Factory によるこのコントラクトのアップグレードが許可されています。

DAO インスタンス コントラクトに実装された update() メソッドは次のとおりです。コードは sputnikdao2/src/upgrade.rs # 62 行目にあります。

上記のコードの 9 行目では、DAO インスタンス コントラクトがデプロイされ、初期化のために new() メソッドが呼び出されるときに、factory_info.auto_update の値がデフォルトで True に設定されます。

DAO インスタンス コントラクトの new() メソッドは次のように実装されます。コードは sputnikdao2/src/lib.rs # 行 83-104 にあります。

要約すると、一般ユーザー (Factory コントラクトや DAO コントラクト自体ではない) は、Factory コントラクトによって提供される pub fn update() メソッドを通じて DAO コントラクトのコードをアップグレード (改ざん) できます。これにより、Sputnik-DAO プラットフォームとスプートニク-DAOプラットフォームに依存するすべての契約プロジェクトは、大きなセキュリティリスクをもたらします。

🪴 幸いなことに、この問題が発見されたとき、このバージョンのコードはまだ NEAR メインネット上で公開されていなかったため、損失はありませんでした。

プロジェクト関係者の迅速な対応により、合理的なホワイトリスト検証メカニズムを追加することで脆弱性が正しく修正されました😊

最初のレベルのタイトル

文章

上記で発見され修正された脆弱性に加えて、Sputnik-DAO Factory 契約のセキュリティは主に次の側面から保証されています。

次の関数はいずれも状態変数を変更しません。

プロジェクト関係者の迅速な対応により、合理的なホワイトリスト検証メカニズムを追加することで脆弱性が正しく修正されました😊

この修正コミットを参照してください: 518ad1d97614fff4b945aba75b6c8bd2483187a2🔗

BlockSec
作者文库