
0. 回顧
- 保護 Solana 生態系統 (1) — Hello Solana
- 保護 Solana 生態系統 (2) — 程式間的呼叫
- 保護 Solana 生態系統 (3) — 程式升級
- 保護 Solana 生態系統 (4) — 帳戶驗證
1. 概述
在前一篇 部落格 中,我們討論了對於 Solana 程式存取控制至關重要的帳戶驗證。然而,對於一個去中心化應用程式 (DApp) 而言,為了防止潛在的私鑰洩漏風險,多重簽章 (Multi-Sig) 非常重要。在本文中,我們將介紹多重簽章的實現方式。
2. 多重簽章的概念
多重簽章是一種數位簽章方案,允許一組使用者共同簽署單一交易。該交易可以是權限函式的呼叫(例如鑄造)、資金轉帳指令等。多重簽章的機制在於:假設有 n 個持有各自私鑰的參與者,執行該交易必須至少有 m 個私鑰進行簽署。這能使 DeFi 中的資金更加安全,並能防範如私鑰洩漏和惡意欺詐 (Rug Pull) 等潛在風險。
3. 多重簽章的使用
在 Solana 中,有一個來自 Serum 的 多重簽章程式,其邏輯與 OpenZeppelin 開發的多重簽章非常相似。這允許使用者在鏈上完整地簽署交易。不過,如果您能在鏈下收集到所有所需的簽章,流程會更簡便。為了說明這一點,我們將多重簽章功能加入到上一篇文章的測試程式碼中。所有的測試程式碼都可以在 此處 找到。
3.1 程式碼回顧
在 上一次介紹的專案 中,我們將 config 帳戶的管理者替換為一個 multisig 帳戶。在這種情況下,要執行 Lock 和 Unlock 指令,客戶端必須在交易中包含足夠數量的有效所有者簽章。

我們新增了一個名為 Multisig 的結構體,包含四個屬性:執行指令所需的簽章數量、有效簽署者的總數、帳戶狀態(是否已初始化),以及有效簽署者的公鑰陣列。

相對地,我們也在 instruction.rs 中增加了 InitializeMultisig 指令。請注意,它從客戶端接收參數 m (u8)。該數值將被傳入 InitializeMultisig() 函式。

InitializeMultisig() 函式接收建立好的帳戶以及數值 m。為了防止帳戶被惡意使用者重複初始化,我們驗證了該帳戶是否已經初始化(第 385-388 行)。之後,我們透過指派 m、n 和簽署者公鑰來初始化多重簽章帳戶。

在 Lock() 函式中,我們檢查 config 帳戶的管理者帳戶是否為多重簽章帳戶。如果是,它將驗證並計算傳入的簽章(第 151 到 158 行)。一旦有效簽章數量達到或超過所需數量,門就會被鎖上(第 163 到 168 行)。Unlock() 函式中的多重簽章實作與 Lock() 函式相似。
我們將程式部署到了測試網中,連結如下:
https://explorer.solana.com/address/4g5ZA47pDQ1Bv93aNYdSKAXB6DvPAnnbi9cNEx7722SK?cluster=testnet
3.2 發送交易

在 InitializeMultisig() 函式中,keys 包含了四個帳戶:多重簽章帳戶和三個有效簽署者的帳戶。請注意,其中一位簽署者同時也是該交易的付費者。我們將 m 的值設為 2,這意味著執行權限函式時需要三個簽署者中的至少兩個簽名。

我們也透過在指令資料中傳遞 multisig 帳戶的公鑰,將 config 帳戶的管理者設定為該多重簽章帳戶。

在 lock() 函式中,除了 config 帳戶(第 410 行)之外,我們還傳入了 multisig 帳戶(第 411 行)以及(至少)兩個有效簽署者的帳戶(第 412 - 第 413 行)。我們將簽署者的 isSigner 屬性設為 true。同樣地,unlock() 函式的邏輯與此類似。
所有的測試交易列於下方,整個過程為:AllocatePDA() -> 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 測試交易
為了測試多重簽章是否真的有效,我們修改了客戶端的腳本。

如上所示,我們只傳入了一個簽署者帳戶,並且只提供了一個有效的簽章。

我們觀察到因為簽章不足,門無法被解鎖。
4. 總結
在本文中,我們介紹了 Solana 中多重簽章的簡單實現。這適用於您能夠在鏈下收集多個使用者簽章的場景。關於需要完全在鏈上簽署交易的場景,將在稍後介紹。請持續關注,我們將在未來的文章中分享更多內容。
閱讀本系列的其餘文章:
- 保護 Solana 生態系統 (1) — Hello Solana
- 保護 Solana 生態系統 (2) — 程式間的呼叫
- 保護 Solana 生態系統 (3) — 程式升級
- 保護 Solana 生態系統 (4) — 帳戶驗證
- 保護 Solana 生態系統 (6) — Multi-Sig2
- 保護 Solana 生態系統 (7) — 型別混淆
關於 BlockSec
BlockSec 是一間領先的區塊鏈安全公司,由一群全球知名的安全專家於 2021 年創立。公司致力於提升新興 Web3 世界的安全性和可用性,以促進其大規模採用。為此,BlockSec 提供智慧合約與 EVM 鏈 安全審計 服務,用於安全開發與主動威脅阻斷的 Phalcon 平台,用於資金追蹤與調查的 MetaSleuth 平台,以及協助 Web3 開發者高效暢遊加密世界的 MetaSuites 瀏覽器擴充功能。
迄今為止,公司已服務超過 300 家知名客戶,如 MetaMask、Uniswap Foundation、Compound、Forta 和 PancakeSwap,並獲得了包括 Matrix Partners、Vitalbridge Capital 和萬向區塊鏈實驗室 (Fenbushi Capital) 在內的卓越投資者兩輪數千萬美元的融資。
官方 Twitter 帳號:https://twitter.com/BlockSecTeam



