Back to Blog

Solana 生态安全 (5.0) — 多签

October 4, 2022
5 min read

0. 回顾

1. 概述

在上一篇 博客 中,我们讨论了在 Solana 程序中对访问控制至关重要的账户验证。然而,对于去中心化的 DApp 和保护潜在的私钥泄露,多签功能非常重要。在本文中,我们将介绍多签功能的实现。

2. 多签概念

多签(Multi-Sig)是一种数字签名方案,允许一组用户对单个交易进行签名。该交易可以是调用特权函数(例如 mint)、资金转账指令等。多签的机制是,给定 n 个拥有各自私钥的参与方,至少需要 m 个私钥签名才能执行交易。这可以使 DeFi 中的资金更加安全,并能防范私钥泄露和卷款跑路等潜在风险。

3. 多签的用法

在 Solana 中,Serum 提供了一个 多签程序,其逻辑与 OpenZeppelin 开发的多签程序非常相似。这允许多个用户在链上完全签名交易。然而,如果可以在链下收集所有必需的签名,过程可能会更简单。为了说明这一点,我们在上一篇文章的测试代码中添加了多签功能。所有测试代码可以在 这里 找到。

3.1 代码审查

上一篇介绍的项目 中,我们将 config 账户的管理员替换为一个 multisig 账户。在这种情况下,要执行 LockUnlock 指令,客户端必须在交易中包含足够数量的有效所有者签名。

我们添加了一个名为 Multisig 的结构体,包含四个属性。它们是执行指令所需的签名数量,有效签名者的总数,账户的状态(是否已初始化),以及有效签名者的公钥数组。

相应地,我们在 instruction.rs 中也添加了 InitializeMultisig 指令。请注意,它从客户端接收参数 m (u8)。这个值将被传给 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 包含四个账户。它们是多签账户和三个有效签名者的账户。请注意,其中一个签名者也是交易的费用支付者。我们将 m 的值设置为 2,这意味着需要三个签名者中的两个签名才能执行特权函数。

我们还通过在指令数据中传递多签账户的公钥,将 config 账户的管理员设置为 multisig 账户。

lock() 函数中,除了 config 账户(第 410 行)之外,我们还传入了 multisig 账户(第 411 行)和两个(至少)有效签名者的账户(第 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 测试交易

为了测试多签是否真的有效,我们修改了客户端的脚本。

如上所示,我们只传入了一个签名者账户,并只提供了一个有效签名。

我们注意到,由于签名不足,门无法解锁。

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 等知名投资者那里获得了数千万美元的投资。

官方网站:https://blocksec.com/

官方 Twitter 账号:https://twitter.com/BlockSecTeam

Sign up for the latest updates
Drift Protocol Incident: Multisig Governance Compromise via Durable Nonce Exploitation
Security Insights

Drift Protocol Incident: Multisig Governance Compromise via Durable Nonce Exploitation

On April 1, 2026 (UTC), Drift Protocol on Solana suffered a $285.3M loss after an attacker exploited Solana's durable nonce mechanism to delay the execution of phished multisig approvals, ultimately transferring administrative control of the protocol's 2-of-5 Squads governance with zero timelock. With full admin privileges, the attacker created a malicious collateral market (CVT), inflated its oracle price, relaxed withdrawal protections, and drained USDC, JLP, SOL, cbBTC, and other assets through 31 rapid withdrawals in approximately 12 minutes. This incident highlights how durable nonce-based delayed execution can decouple signer intent from on-chain execution, bypassing the temporal assumptions that multisig security implicitly relies on.

Weekly Web3 Security Incident Roundup | Mar 23 – Mar 29, 2026
Security Insights

Weekly Web3 Security Incident Roundup | Mar 23 – Mar 29, 2026

This BlockSec weekly security report covers eight DeFi attack incidents detected between March 23 and March 29, 2026, across Ethereum and BNB Chain, with total estimated losses of approximately $1.53M. Incidents include a $679K flawed burn mechanism exploit on the BCE token, a $512K spot-price manipulation attack on Cyrus Finance's PancakeSwap V3 liquidity withdrawal, a $133.5K flash-loan-driven referral reward manipulation on a TUR staking contract, and multiple integer overflow, reentrancy, and accounting error vulnerabilities in DeFi protocols. The report provides detailed vulnerability analysis and attack transaction breakdowns for each incident.

Newsletter -  March 2026
Security Insights

Newsletter - March 2026

In March 2026, the DeFi ecosystem experienced three major security incidents. Resolv Protocol lost ~$80M due to compromised privileged infrastructure keys, BitcoinReserveOffering suffered ~$2.7M from a double-minting logic flaw, and Venus Protocol incurred ~$2.15M following a donation attack combined with market manipulation.