
0. Revisão
- Protegendo o Ecossistema Solana (1) — Olá, Solana
- Protegendo o Ecossistema Solana (2) — Chamadas Entre Programas
- Protegendo o Ecossistema Solana (3) — Atualização de Programa
- Protegendo o Ecossistema Solana (4) — Validação de Conta
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:
- Protegendo o Ecossistema Solana (1) — Olá, Solana
- Protegendo o Ecossistema Solana (2) — Chamadas Entre Programas
- Protegendo o Ecossistema Solana (3) — Atualização de Programa
- Protegendo o Ecossistema Solana (4) — Validação de Conta
- Protegendo o Ecossistema Solana (6) — Multi-Sig2
- Protegendo o Ecossistema Solana (7) — Confusão de Tipos
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



