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

Solanaでのマルチシグ機能実装を探求。DAppのセキュリティ強化と秘密鍵漏洩対策における重要性を解説します。

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