0. レビュー
- Solanaエコシステムを保護する (1) — Hello Solana
- Solanaエコシステムを保護する (2) — プログラム間の呼び出し
- Solanaエコシステムを保護する (3) — プログラムのアップグレード
- Solanaエコシステムを保護する (4) — アカウント検証
- Solanaエコシステムを保護する (5) — マルチシグ
1. 概要
前回の投稿では、マルチシグの実装について議論しました。しかし、その実装は、複数のユーザーからの署名をオフチェーンで同時に収集できることを前提としていました。本稿では、ユーザーが完全にオンチェーンで署名できる、より一般的なマルチシグプログラムを紹介します。
2. テストプログラムの設計
マルチシグプログラムは、有効な署名者が提案者に署名することを許可し、誰でも署名が集まったら提案を実行できます。テストコードはすべてこちらにあります。
3. コードレビュー
このプログラムでは、TransactionAccountとTransactionという2つの追加構造体を紹介します。TransactionAccount構造体は、提案されたトランザクションに使用されるアカウント情報を記録するために設計されています。Transaction構造体は、提案の情報を記録するために使用されます。signers属性は、有効な署名の数を記録するために使用されることに注意してください。did_executeとis_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で署名できるようになります。今後も、さらなる情報を共有していきますので、ご期待ください。
このシリーズの他の記事を読む:
- Solanaエコシステムを保護する (1) — Hello Solana
- Solanaエコシステムを保護する (2) — プログラム間の呼び出し
- Solanaエコシステムを保護する (3) — プログラムのアップグレード
- Solanaエコシステムを保護する (4) — アカウント検証
- Solanaエコシステムを保護する (5) — マルチシグ
- Solanaエコシステムを保護する (7) — 型の混同
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



