Back to Blog

Solanaエコシステムを保護する(6)— マルチシグ2

April 24, 2022
6 min read

0. レビュー

1. 概要

前回の投稿では、マルチシグの実装について議論しました。しかし、その実装は、複数のユーザーからの署名をオフチェーンで同時に収集できることを前提としていました。本稿では、ユーザーが完全にオンチェーンで署名できる、より一般的なマルチシグプログラムを紹介します。

2. テストプログラムの設計

マルチシグプログラムは、有効な署名者が提案者に署名することを許可し、誰でも署名が集まったら提案を実行できます。テストコードはすべてこちらにあります。

3. コードレビュー

このプログラムでは、TransactionAccountTransactionという2つの追加構造体を紹介します。TransactionAccount構造体は、提案されたトランザクションに使用されるアカウント情報を記録するために設計されています。Transaction構造体は、提案の情報を記録するために使用されます。signers属性は、有効な署名の数を記録するために使用されることに注意してください。did_executeis_initializedは、実行と初期化が一度だけ行われることを保証します。

プログラムは5つの異なる命令を提供します。AllocatePDA命令は、一意のPDAアカウントを作成し、それをmultisigアカウントとして使用することを目的としています。これはすべての有効な署名者の情報を記録します。InitializeMultisig命令では、命令を実行するために必要な署名の数と、有効な署名の公開鍵の配列を設定します。CreateTransaction命令は提案を作成するために使用され、署名者はapprove命令を通じて提案を承認できます。承認の数がmultisigで設定されたしきい値に達すると、ExecuteTransaction命令を呼び出してトランザクションを実行できます。

提案を送信するために、ユーザーはcreateTransaction()命令を呼び出すことができます。これは3つのアカウントを受け取ります。作成されたtransactionアカウント、そしてターゲットトランザクションによって使用される次の2つのアカウントです。悪意のあるユーザーによるアカウントの再初期化を防ぐために、is_initialized属性をチェックします(161〜163行目)。その後、TransactionAccount構造体を指定されたデータで初期化し、データアカウントにシリアライズします(188行目)。

Approve()関数では、まずTransactionアカウントとmultisigアカウントがプログラムによって所有されているかを確認します。他のプログラムから作成されたアカウントは、チェックがない場合、悪意のあるユーザーによって使用される可能性があることに注意してください。次に、署名者の公開鍵をmultisigアカウントに保存されているキーと照合します。一致した場合、署名の検証が行われ、対応する値がtrueに変更されます。

ExecuteTransaction()命令では、有効な署名の数を数えます。数がしきい値に達しない場合、プログラムはロールバックします。

その後、ターゲットのInstructionを指定された属性で初期化し、invoke_signed()関数を介してターゲットプログラムの命令を呼び出します。最後に、提案が繰り返し実行されるのを防ぐために、did_execute属性をtrueに設定します。

プログラムをテストネットにデプロイしました。以下のリンクで見つけることができます。

https://explorer.solana.com/address/CPzn7ptnJntjUB4NGKqQGRai8NFLNwFaspmJ7nEGbMHe?cluster=testnet

4. トランザクションの送信

デプロイ後、まずmultisigアカウントを作成し、configアカウントを初期化する際にmultisigアカウントをconfigアカウントの管理者として設定します。関連するトランザクションを以下に示します。順序は次のとおりです。createMultisig()(General-Multisig内)-> PrivilegeOwnerプログラムのデプロイ -> Allocate()(PrivligeOwner内)-> InitializeConfig()(PrivligeOwner内)。

https://explorer.solana.com/tx/2vXHmwbCsARstx8wi4eLACbrb6PuZZMktsqU8VnJLp64fvrpaE62QSTn5QLczzxnTvxRLWMSR3dKLGYXZasGMn69?cluster=testnet https://explorer.solana.com/tx/2EMq9y6HNnXq1n2XsqrBkJd8RGL27PCj5T4JyJ71ZoA3ipUggT6dF6S6uDv4TtxGGKk8BmiAJHS7BFRgZqWjkWVb?cluster=testnet https://explorer.solana.com/tx/3UhXKsTubUiPqRtLyNYskxvbyrTKHsbeptxuAfJQ348AU4b8gQET2HAMaqxwud6Wo3MKTYHWBneqa9z2WhCpwV6t?cluster=testnet https://explorer.solana.com/tx/5NA7Yw23uRf48Q3BYM21dtS7gD9YMECij43ZaRLMPe7svt3bsv2TPWwbCRP5akDmttjLEHWZtpqrZrVLNr9QLyJY?cluster=testnet

次に、InitializeMultisig()命令を呼び出します。ここでは、multisigアカウントと3つの有効な署名者のアカウントの4つのアカウントを渡します。mの値を2に設定します。これは、3人の署名者のうち2人の署名が必要であることを意味します。

CreateTransaction()関数では、作成されたTransactionアカウント、ターゲットプログラム(PrivilegeOwner)の公開鍵、およびconfigアカウントの公開鍵を渡します(306行目〜307行目)。さらに、_dataを3に設定する必要があります。これはPrivilegeOwnerプログラムのunlock()命令に対応します。

最初のテストでは、1人の署名者のみが作成された提案に署名します。この場合、収集された署名が限られているため、ExecuteTransaction()は失敗します。コンソールには次の出力が表示されます。

別の署名者が作成された提案に署名し、ExecuteTransaction()を呼び出します。署名の総数がしきい値に達したため、提案は正常に実行できます。

https://explorer.solana.com/tx/55Qy93RxybsT7c5v9AFgN8Dt1h3AVJfbsosLbstYVB6paY1wmau5sdtLfGpfryXnZTsBNRauvwLSmAu2nABFxVCe?cluster=testnet https://explorer.solana.com/tx/4XF4MUhL4oftkDt4sn7NoREmGqcDMVP6HGypvJQMtiAbBKiCuy4B98vhQKtvm4mPv7SprrDDVsiwgb6pNwgJcTwz?cluster=testnet

4. まとめ

本稿では、Solanaにおけるマルチシグの一般的な実装を紹介しました。この実装は、PDAの機能を利用しており、有効な署名の数が要件を満たすと、プログラムが自動的にトランザクションにPDAで署名できるようになります。今後も、さらなる情報を共有していきますので、ご期待ください。

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

BlockSecについて

BlockSecは、2021年に世界的に著名なセキュリティ専門家グループによって設立された、先駆的なブロックチェーンセキュリティ企業です。当社は、Web3の普及を促進するために、新しい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
The Decentralization Dilemma: Cascading Risk and Emergency Power in the KelpDAO Crisis
Security Insights

The Decentralization Dilemma: Cascading Risk and Emergency Power in the KelpDAO Crisis

This BlockSec deep-dive analyzes the KelpDAO $290M rsETH cross-chain bridge exploit (April 18, 2026), attributed to the Lazarus Group, tracing a causal chain across three layers: how a single-point DVN dependency enabled the attack, how DeFi composability cascaded the damage through Aave V3 lending markets to freeze WETH liquidity exceeding $6.7B across Ethereum, Arbitrum, Base, Mantle, and Linea, and how the crisis forced decentralized governance to exercise centralized emergency powers. The article examines three parameters that shaped the cascade's severity (LTV, pool depth, and cross-chain deployment count) and provides an exclusive technical breakdown of Arbitrum Security Council's forced state transition, an atomic contract upgrade that moved 30,766 ETH without the holder's signature.

Weekly Web3 Security Incident Roundup | Apr 13 – Apr 19, 2026
Security Insights

Weekly Web3 Security Incident Roundup | Apr 13 – Apr 19, 2026

This BlockSec weekly security report covers four attack incidents detected between April 13 and April 19, 2026, across multiple chains such as Ethereum, Unichain, Arbitrum, and NEAR, with total estimated losses of approximately $310M. The highlighted incident is the $290M KelpDAO rsETH bridge exploit, where an attacker poisoned the RPC infrastructure of the sole LayerZero DVN to fabricate a cross-chain message, triggering a cascading WETH freeze across five chains and an Arbitrum Security Council forced state transition that raises questions about the actual trust boundaries of decentralized systems. Other incidents include a $242K MMR proof forgery on Hyperbridge, a $1.5M signed integer abuse on Dango, and an $18.4M circular swap path exploit on Rhea Finance's Burrowland protocol.

Weekly Web3 Security Incident Roundup | Apr 6 – Apr 12, 2026
Security Insights

Weekly Web3 Security Incident Roundup | Apr 6 – Apr 12, 2026

This BlockSec weekly security report covers four DeFi attack incidents detected between April 6 and April 12, 2026, across Linea, BNB Chain, Arbitrum, Optimism, Avalanche, and Base, with total estimated losses of approximately $928.6K. Notable incidents include a $517K approval-related exploit where a user mistakenly approved a permissionless SquidMulticall contract enabling arbitrary external calls, a $193K business logic flaw in the HB token's reward-settlement logic that allowed direct AMM reserve manipulation, a $165.6K exploit in Denaria's perpetual DEX caused by a rounding asymmetry compounded with an unsafe cast, and a $53K access control issue in XBITVault caused by an initialization-dependent check that failed open. The report provides detailed vulnerability analysis and attack transaction breakdowns for each incident.