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アカウントの管理者(admin)を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つの有効な署名者のアカウントです。署名者の一人がトランザクションのフィーペイヤーでもあることに注意してください。mの値を2に設定しました。これは、特権関数を実行するために3人の署名者のうち2人の署名が必要であることを意味します。

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

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



