0. レビュー
- Solanaエコシステムの保護 (1) — Hello Solana
- Solanaエコシステムの保護 (2) — プログラム間呼び出し
- Solanaエコシステムの保護 (3) — プログラムのアップグレード
- Solanaエコシステムの保護 (4) — アカウント検証
1. 概要
前回のブログでは、Solanaプログラムにおけるアクセス制御の重要な要素であるアカウント検証について説明しました。しかし、分散型DAppや秘密鍵漏洩のリスク保護のためには、マルチシグが非常に重要です。本稿では、マルチシグの実装について紹介します。
2. マルチシグの概念
マルチシグは、複数のユーザーが単一のトランザクションに署名できるデジタル署名スキームです。トランザクションは、権限のある関数(例:ミント)の呼び出し、資金移動指示などになり得ます。マルチシグのメカニズムは、n人の当事者がそれぞれ秘密鍵を持っている場合、トランザクションを実行するには少なくともm人の秘密鍵の署名が必要となることです。これにより、DeFiの資金はより安全になり、秘密鍵の漏洩やラグプルなどの潜在的なリスクから保護することができます。
3. マルチシグの使用方法
Solanaには、Serumによるマルチシグプログラムがあり、これはOpenZeppelinによって開発されたマルチシグのロジックと非常によく似ています。これにより、複数のユーザーが完全にオンチェーンでトランザクションに署名できます。ただし、必要な署名をすべてオフチェーンで収集できれば、プロセスはより簡単になります。これを説明するために、前回の投稿のテストコードにマルチシグ機能を追加しました。すべてのテストコードはこちらで見つけることができます。
3.1 コードレビュー
前回紹介したプロジェクトでは、configアカウントの管理者をmultisigアカウントに置き換えました。この場合、LockおよびUnlock命令を実行するには、クライアントはトランザクションに有効な所有者の十分な署名を含める必要があります。

Multisigという名前の構造体を4つの属性で追加しました。これらは、命令を実行するために必要な署名の数、有効な署名者の総数、アカウントの状態(初期化されているかどうか)、および有効な署名者の公開鍵の配列です。

対応するinstruction.rsにもInitializeMultisig命令を追加しました。クライアント側から引数m (u8)を受け取ることに注意してください。この値はInitializeMultisig()関数に渡されます。

InitializeMultisig()関数は、作成されたアカウントと値mを受け取ります。悪意のあるユーザーによるアカウントの再初期化を防ぐために、アカウントがすでに初期化されているかどうかを検証します(385〜388行目)。その後、m、n、および署名者の公開鍵の値を割り当てることで、マルチシグアカウントを初期化します。

Lock()関数では、configアカウントの管理者がマルチシグアカウントであるかどうかを確認します。そうである場合、渡された署名を検証およびカウントします(151〜158行目)。有効な署名の数が要求された量に達するかそれを超えると、ドアはロックされます(163〜168行目)。Unlock()関数におけるマルチシグの実装は、Lock()関数と同様です。
プログラムをテストネットにデプロイしました。以下のリンクから確認できます。
https://explorer.solana.com/address/4g5ZA47pDQ1Bv93aNYdSKAXB6DvPAnnbi9cNEx7722SK?cluster=testnet
3.2 トランザクションの送信

InitializeMultisig()関数では、keysに4つのアカウントが含まれています。これらは、マルチシグアカウントと3つの有効な署名者のアカウントです。署名者のうち1人はトランザクションのフィーペイヤーでもあることに注意してください。mの値を2に設定しました。これは、特権関数を実行するために3人の署名者のうち2人の署名が必要であることを意味します。

また、configアカウントの管理者をマルチシグアカウントとして設定するために、命令データにマルチシグアカウントの公開鍵を渡します。

lock()関数では、configアカウント(410行目)に加えて、multisigアカウント(411行目)、および2つ(少なくとも)の有効な署名者のアカウント(412〜413行目)を渡します。署名者に対してisSigner属性をtrueに設定します。ここでも、unlock()関数のロジックはこれと同様です。
すべてのテストトランザクションは以下のとおりです。全体のプロセスはAllocate PDA()-> InitializeMultisig() -> InitializeDoor()-> InitializeConfig()-> Unlock() -> Open() -> Close()-> Lock()です。
https://explorer.solana.com/tx/2inXLHv34NzkmwmvQ7iimdNbEX2Hj8qWS3MVteAPtwhCAPy1yxXXdvfzMmUL7tESsd4wat4LMcPNiEQav18kQTrZ?cluster=testnet
https://explorer.solana.com/tx/4GErNusHLXpUHBsAJ55c7v1Ur1jfv5hAR88CK8nabLnzc92b1UhDnNRryKVjKmcnJDXppmyk6m5RUdpR2w7MEbrU?cluster=testnet
https://explorer.solana.com/tx/2S8h66oWfh7cn4fwFCVPtgGw1o3NgzyWwU1GyRpDjH4PEBfe8LDMZGAEBYLRJpzL3anH9ENShntjg3q5K8gcZSrN?cluster=testnet
https://explorer.solana.com/tx/nVKxPYegbpH324y57uHDZiajpNA5u4bSSJ2gHFHHRx4GJBy1DcpxnccKh1Ltkv9dah1qJNi9jWuBnXbyHWXCJyw?cluster=testnet
https://explorer.solana.com/tx/3KK5CU88oV59VfdTrNpT4LsiUsetuGdc6qW3sNyyGEWVYtKJfD6XA2Nfknrriwuka9wknHpZs3WZ1WkeduDA1pZX?cluster=testnet
https://explorer.solana.com/tx/3rFo37CrLSsMehLk4kwmMSDnbRfLfoPCWZzRDXhwwLg1uq32gu4ddxkYYB3pJX1yiMN8MofnV1Y9CSaf8bQaNJ9Y?cluster=testnet
https://explorer.solana.com/tx/5yFq4dZAMpccn96jKNkYFVcmhmtrwZYSFEQ6pkNgSMd7e1Vy1ztAM3RdFUZjEtThjFssz1TFytowePPyY59we9rX?cluster=testnet
https://explorer.solana.com/tx/3Ut4DqjCQi1MoCsjRx24DxykyDMsmyRsjJSXS7D4FBeZQwrx4UzxWt2gDe6YRiwUHzFkH3eWkFHub6FNSp2Us4Q7?cluster=testnet
3.3 テストトランザクション
マルチシグが実際に機能するかどうかをテストするために、クライアントのスクリプトを変更しました。

上記のように、署名者アカウントを1つだけ渡し、有効な署名を1つだけ提供しました。

署名が不足しているため、ドアをアンロックできないことがわかりました。
4. まとめ
本記事では、Solanaにおけるシンプルなマルチシグの実装を紹介しました。これは、複数のユーザーからオフチェーンで署名を取得できるシナリオを想定しています。トランザクションが完全にオンチェーンで署名される必要があるシナリオについては、後日紹介します。引き続きフォローしていただければ、今後の記事でさらに詳しい情報をお届けします。
このシリーズの他の記事を読む:
- Solanaエコシステムの保護 (1) — Hello Solana
- Solanaエコシステムの保護 (2) — プログラム間呼び出し
- Solanaエコシステムの保護 (3) — プログラムのアップグレード
- Solanaエコシステムの保護 (4) — アカウント検証
- Solanaエコシステムの保護 (6) — マルチシグ2
- Solanaエコシステムの保護 (7) — 型の混乱
BlockSecについて
BlockSecは、世界的に著名なセキュリティ専門家グループによって2021年に設立された、先駆的なブロックチェーンセキュリティ企業です。当社は、出現するWeb3の世界のセキュリティとユーザビリティを向上させ、その大規模な採用を促進することに専念しています。この目的のために、BlockSecはスマートコントラクトおよびEVMチェーンのセキュリティ監査サービス、セキュリティ開発と脅威のプロアクティブなブロックのためのPhalconプラットフォーム、資金追跡と調査のためのMetaSleuthプラットフォーム、および暗号世界で効率的にサーフィンするためのWeb3ビルダー向けのMetaSuites拡張機能を提供しています。
現在までに、MetaMask、Uniswap Foundation、Compound、Forta、PancakeSwapなど300社以上の著名なクライアントにサービスを提供し、Matrix Partners、Vitalbridge Capital、Fenbushi Capitalなどの著名な投資家から2回の資金調達で数千万米ドルを受け入れています。
公式ウェブサイト: https://blocksec.com/
公式Twitterアカウント: https://twitter.com/BlockSecTeam



