Back to Blog

Protegendo o Ecossistema Solana (5) — Multi-Sig

10 de abril de 2022
6 min read

0. Revisão

1. Visão Geral

No post anterior, discutimos a validação de conta, que é importante para o controle de acesso em programas Solana. No entanto, para um DApp descentralizado e para proteger contra possíveis vazamentos de chave privada, o multi-sig é muito importante. Neste post, apresentaremos a implementação do Multi-Sig.

2. Conceito de Multi-Sig

Multi-Sig é um esquema de assinatura digital que permite que um grupo de usuários assine uma única transação. A transação pode ser uma chamada a uma função privilegiada (por exemplo, mint), uma instrução de transferência de fundos, etc. O mecanismo do multi-sig é que, dado n partes com suas próprias chaves privadas, pelo menos m das chaves privadas devem assinar para executar a transação. Isso pode tornar os fundos em DeFi muito mais seguros e proteger contra riscos potenciais como vazamento de chave privada e rug pull.

3. Uso do Multi-Sig

Na Solana, existe um programa multi-sig do Serum, bastante semelhante à lógica do multi-sig desenvolvido pela OpenZeppelin. Isso permite que múltiplos usuários assinem uma transação totalmente on-chain. No entanto, se você puder coletar todas as assinaturas necessárias off-chain, o processo pode ser mais simples. Para ilustrar isso, adicionamos a funcionalidade multi-sig no código de teste do último post. Todo o código de teste pode ser encontrado aqui.

3.1 Revisão do Código

No projeto apresentado anteriormente, substituímos o administrador da conta config por uma conta multisig. Nesse caso, para executar as instruções Lock e Unlock, o cliente precisará incluir assinaturas suficientes dos proprietários válidos na transação.

Adicionamos uma struct chamada Multisig composta por quatro atributos. São eles: o número de assinaturas necessárias para executar a instrução, o número total de signatários válidos, o status da conta (se está inicializada ou não) e o array de chaves públicas dos signatários válidos.

Correspondentemente, também adicionamos a instrução InitializeMultisig em instruction.rs. Note que ela recebe o argumento m (u8) do lado do cliente. Este valor será passado para a função InitializeMultisig().

A função InitializeMultisig() recebe as contas criadas e o valor m. Para evitar que a conta seja reinicializada por usuários mal-intencionados, validamos se a conta já foi inicializada (linhas 385-388). Depois disso, inicializamos a conta multi-sig atribuindo os valores m, n e as chaves públicas dos signatários.

Na função Lock(), verificamos se a conta administradora da conta config é do tipo multi-sig. Se for, ela validará e contará as assinaturas passadas (linhas 151 a 158). Assim que o número de assinaturas válidas atingir ou superar a quantidade necessária, as portas serão travadas (linhas 163 a 168). A implementação do multi-sig na função Unlock() é semelhante à função Lock().

Implantamos o programa na testnet e ele pode ser encontrado no link a seguir.

https://explorer.solana.com/address/4g5ZA47pDQ1Bv93aNYdSKAXB6DvPAnnbi9cNEx7722SK?cluster=testnet

3.2 Enviar Transação

Na função InitializeMultisig(), o campo keys inclui quatro contas. São elas: a conta multisig e as contas de três signatários válidos. Note que um dos signatários também é o pagador de taxas da transação. Definimos o valor de m como 2, o que significa que duas das três assinaturas dos signatários são necessárias para executar funções privilegiadas.

Também definimos o administrador da conta config como a conta multisig, passando a chave pública da conta multisig nos dados da instrução.

Na função lock(), além da conta config (linha 410), passamos a conta multisig (linha 411) e duas (no mínimo) contas de signatários válidos (linhas 412 - 413). Definimos o atributo isSigner como verdadeiro para os signatários. Da mesma forma, a lógica da função unlock() é semelhante a esta.

Todas as transações de teste estão listadas abaixo. O processo completo é 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 Transação de Teste

Para testar se o multi-sig realmente funciona, modificamos o script do cliente.

Conforme mostrado acima, passamos apenas uma conta de signatário e fornecemos apenas uma assinatura válida.

Observamos que a porta não pode ser desbloqueada devido a assinaturas insuficientes.

4. Resumo

Neste artigo, apresentamos a implementação simples do multi-sig na Solana. É voltado para o cenário em que você consegue coletar as assinaturas de múltiplos usuários off-chain. O cenário em que as transações precisam ser assinadas totalmente on-chain será apresentado posteriormente. Continue acompanhando e compartilharemos mais nos próximos posts.

Leia outros artigos desta série:


Sobre a BlockSec

A BlockSec é uma empresa pioneira em segurança blockchain, fundada em 2021 por um grupo de especialistas em segurança de renome mundial. A empresa está comprometida em aprimorar a segurança e a usabilidade para o emergente mundo Web3, com o objetivo de facilitar sua adoção em massa. Para isso, a BlockSec oferece serviços de auditoria de segurança de contratos inteligentes e cadeias EVM, a plataforma Phalcon para desenvolvimento seguro e bloqueio proativo de ameaças, a plataforma MetaSleuth para rastreamento e investigação de fundos, e a extensão MetaSuites para construtores web3 que navegam com eficiência no mundo cripto.

Até o momento, a empresa atendeu mais de 300 clientes renomados, como MetaMask, Uniswap Foundation, Compound, Forta e PancakeSwap, e recebeu dezenas de milhões de dólares americanos em duas rodadas de financiamento de investidores proeminentes, incluindo Matrix Partners, Vitalbridge Capital e Fenbushi Capital.

Site oficial: https://blocksec.com/

Conta oficial no Twitter: https://twitter.com/BlockSecTeam

Sign up for the latest updates
Como a solução de segurança de pagamentos da BlockSec ajuda instituições a se manterem seguras na era da IA
Security Services

Como a solução de segurança de pagamentos da BlockSec ajuda instituições a se manterem seguras na era da IA

Descubra como a BlockSec ajuda instituições de pagamento a proteger recursos financeiros e dados, além de fortalecer sua resiliência por meio de avaliações de segurança, testes e monitoramento contínuo.

Perdas de ~5,57 milhões USD: exploração de falhas no X100 Freezer e no NEM | Boletim semanal da BlockSec
Security Insights

Perdas de ~5,57 milhões USD: exploração de falhas no X100 Freezer e no NEM | Boletim semanal da BlockSec

Este relatório semanal aborda dois incidentes de segurança na Ethereum e na BNB Chain no período de 19/10/2026–25/10/2026. Ele examina uma tomada de controle da governança do X100 Freezer financiada por um empréstimo-relâmpago e uma falha na liquidação de impostos que afetou um pool de liquidez de um token NEM na BNB Chain. As perdas estimadas no escopo do relatório totalizam aproximadamente 5,57 milhões USD: cerca de 4,75 milhões USD da transação representativa do X100 e cerca de 820 mil USD do incidente no pool do NEM. O total exclui as extrações subsequentes do X100 relatadas separadamente.

Perdas de ~3,87 milhões USD: ataques à Autheo Network e à UNCX | Resumo semanal da BlockSec
Security Insights

Perdas de ~3,87 milhões USD: ataques à Autheo Network e à UNCX | Resumo semanal da BlockSec

Este relatório semanal aborda 3 incidentes de segurança no período de 12/10/2026–18/10/2026, com perdas totais estimadas em aproximadamente 3,87 milhões USD. A Autheo Network sofreu um comprometimento de chave privada com perdas de cerca de 1,76 milhões USD, a Qubic Wallet perdeu cerca de 1,30 milhões USD devido à geração de seeds fracas, e os contratos Smart Token Vesting V2 da UNCX Network sofreram um erro contábil de cerca de 807 mil USD nas redes Ethereum, BNB Chain, Base e Robinhood Chain. A análise em destaque da UNCX explica como um cálculo incorreto do total de cotas misturou parcelas de vesting criadas com diferentes proporções entre tokens e cotas, permitindo saques acima do devido de pools compartilhados.

Protegendo o Ecossistema Solana (5) — Multi-Sig