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
~$15.9M Lost: Trusted Volumes & More | BlockSec Weekly
Security Insights

~$15.9M Lost: Trusted Volumes & More | BlockSec Weekly

This BlockSec bi-weekly security report covers 11 notable attack incidents identified between April 27 and May 10, 2026, across Sui, Ethereum, BNB Chain, Base, Blast, and Berachain, with total estimated losses of approximately $15.9M. Three incidents are analyzed in detail: the highlighted $1.14M Aftermath Finance exploit on Sui, where a signed/unsigned semantic mismatch in the builder-fee validation allowed an attacker to inject a negative fee that was converted into positive collateral during settlement; the $5.87M Trusted Volumes RFQ authorization mismatch on Ethereum; and the $5.7M Wasabi Protocol infrastructure-to-contract-control compromise across multiple EVM chains.

Newsletter - April 2026
Security Insights

Newsletter - April 2026

In April 2026, the DeFi ecosystem experienced three major security incidents. KelpDAO lost ~$290M due to an insecure 1-of-1 DVN bridge configuration exploited via RPC infrastructure compromise, Drift Protocol suffered ~$285M from a multisig governance takeover leveraging Solana's durable nonce mechanism, and Rhea Finance incurred ~$18.4M following a business logic flaw in its margin-trading module that allowed circular swap path manipulatio

~$7.04M Lost: GiddyDefi, Volo Vault & More | BlockSec Weekly
Security Insights

~$7.04M Lost: GiddyDefi, Volo Vault & More | BlockSec Weekly

This BlockSec weekly security report covers eight attack incidents detected between April 20 and April 26, 2026, across Ethereum, Avalanche, Sui, Base, HyperLiquid, and MegaETH, with total estimated losses of approximately $7.04M. The highlighted incident is the $1.3M GiddyDefi exploit, where the attacker did not break any cryptography or use a flash loan but simply replayed an existing on-chain EIP-712 signature with the unsigned `aggregator` and `fromToken` fields swapped out for a malicious contract, demonstrating how partial signature coverage turns any historical signature into a generic permit. Other incidents include a $3.5M Volo Vault operator key compromise on Sui, a $1.5M Purrlend privileged-role takeover, a $413K SingularityFinance oracle misconfiguration, a $142.7K Scallop cross-pool index injection, a $72.35K Kipseli Router decimal mismatch, a $50.7K REVLoans (Juicebox) accounting pollution, and a $64K Custom Rebalancer arbitrary-call exploit.