Solanaエコシステムの保護 (5) — マルチシグ

Solanaエコシステムの保護 (5) — マルチシグ

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

また、configアカウントの管理者をmultisigアカウントとして設定するために、命令データに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
Weekly Web3 Security Incident Roundup | Feb 9 – Feb 15, 2026

Weekly Web3 Security Incident Roundup | Feb 9 – Feb 15, 2026

During the week of February 9 to February 15, 2026, three blockchain security incidents were reported with total losses of ~$657K. All incidents occurred on the BNB Smart Chain and involved flawed business logic in DeFi token contracts. The primary causes included an unchecked balance withdrawal from an intermediary contract that allowed donation-based inflation of a liquidity addition targeted by a sandwich attack, a post-swap deflationary clawback that returned sold tokens to the caller while draining pool reserves to create a repeatable price-manipulation primitive, and a token transfer override that burned tokens directly from a Uniswap V2 pair's balance and force-synced reserves within the same transaction to artificially inflate the token price.

Top 10 "Awesome" Security Incidents in 2025

Top 10 "Awesome" Security Incidents in 2025

To help the community learn from what happened, BlockSec selected ten incidents that stood out most this year. These cases were chosen not only for the scale of loss, but also for the distinct techniques involved, the unexpected twists in execution, and the new or underexplored attack surfaces they revealed.

#10 Panoptic Incident: XOR Linearity Breaks the Position Fingerprint Scheme

#10 Panoptic Incident: XOR Linearity Breaks the Position Fingerprint Scheme

On August 29, 2025, Panoptic disclosed a Cantina bounty finding and confirmed that, with support from Cantina and Seal911, it executed a rescue operation on August 25 to secure roughly $400K in funds. The issue stemmed from a flaw in Panoptic’s position fingerprint calculation algorithm, which could have enabled incorrect position identification and downstream fund risk.