Back to Blog

Solanaエコシステムを安全にする(5)—マルチシグ

2022年4月10日
5 min read

0. レビュー

1. 概要

前回のブログでは、Solanaプログラムにおけるアクセス制御の重要な要素であるアカウント検証について議論しました。しかし、分散型DAppや秘密鍵漏洩のリスク保護のためには、マルチシグが非常に重要です。本稿では、マルチシグの実装について紹介します。

2. マルチシグの概念

マルチシグは、複数のユーザーが単一のトランザクションに署名できるデジタル署名スキームです。トランザクションは、特権関数(例:ミント)の呼び出しや、資金移動の指示など、様々なものになり得ます。マルチシグの仕組みは、n個の当事者がそれぞれの秘密鍵を持っており、トランザクションを実行するには少なくともm個の秘密鍵による署名が必要となることです。これにより、DeFiの資金をより安全に保つことができ、秘密鍵の漏洩やラグプルなどの潜在的なリスクから保護することができます。

3. マルチシグの利用方法

Solanaには、Serumによるマルチシグプログラムがあり、これはOpenZeppelinによって開発されたマルチシグのロジックと非常に似ています。これにより、複数のユーザーが完全にオンチェーンでトランザクションに署名することができます。しかし、必要な署名をすべてオフチェーンで収集できる場合は、プロセスがより簡単になります。これを説明するために、前回の投稿のテストコードにマルチシグ機能を追加しました。すべてのテストコードはこちらで見ることができます。

3.1 コードレビュー

前回紹介したプロジェクトでは、configアカウントの管理者(admin)をmultisigアカウントに置き換えました。この場合、LockおよびUnlock命令を実行するには、クライアントはトランザクションに必要な有効なオーナーの署名を十分に含める必要があります。

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

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

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

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におけるマルチシグの簡単な実装を紹介しました。これは、複数のユーザーからオフチェーンで署名を取得できるシナリオを対象としています。トランザクションが完全にオンチェーンで署名される必要があるシナリオについては、後日紹介します。引き続きフォローしてください。今後の投稿でさらに共有していきます。

このシリーズの他の記事を読む:


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

Sign up for the latest updates
Web3攻撃対象領域:ペネトレーションテストの概要

Web3攻撃対象領域:ペネトレーションテストの概要

暗号資産機関は従来の攻撃対象領域に加え、資金処理チェーンも抱えます。本記事は稼働システムをアプリケーション、認可・署名、ブロックチェーン連携、インフラの4要素で整理し、各要素の責務・実装例・継承される攻撃対象を示します。さらにweb3固有の範囲を、運用・署名意図・承認出金チェーン・資金ロジック・オンチェーン取引と契約という5領域に構造化します。

約2,300万ドル喪失:Cosmos EVM、Moonwellの被害事例 | BlockSec Weekly
Security Insights

約2,300万ドル喪失:Cosmos EVM、Moonwellの被害事例 | BlockSec Weekly

レポート期間(2026/08/22-2026/08/30)中、約2270万ドルの損害を伴う5件のブロックチェーンセキュリティ事件を報告。Tectonicから約7400万〜1.195億ドルが流出したが、CronosがExploit前状態にロールバックされ大部分が消失。ハイライトはTAC Chainで追跡された6チェーンにわたるCosmos EVM Exploitシリーズ(実現損失約570万ドル)で、共有残高同期バグがアンダーフローとオーバーフローを連鎖させステーキングプールを枯渇させた。Moonwellの担保会計とオラクル価格操作の複合、Tectonicのオラクル価格とレシートトークン交換レート操作、Ajnaの清算ビジネスロジック欠陥、SolanaのRain Card Contract ExploitシリーズにおけるEd25519署名検証バイパス(Avici、Tria等)も分析。

ブロックチェーンペネトレーションテストとは?定義と境界
Security Services

ブロックチェーンペネトレーションテストとは?定義と境界

ブロックチェーンペネトレーションテストに広く受け入れられた定義はなく、監査、スキャン、バグバウンティと混同されがちです。本稿は作業定義―合意された範囲とルールの下、稼働システムを実際に攻撃し悪用経路と制御連鎖を検証すること―を示し、web3特有の資金移動脅威モデルの核心であるオフチェーンからオンチェーンへの受け渡しの構成的隙間を論じます。さらにこの連鎖を構成する5つの検証可能な能力を整理し、関連目的をコード監査、ウォレットセキュリティ監査、web3セキュリティテスト、スキャン、バグバウンティへ振り分けます。