Uma das coisas mais comuns para dar segurança aos investidores e usuários de protocolos na blockchain é a verificação de programas/contratos. Basicamente a verificação é o processo de gerar um hash/assiantura de um programa Solana e comparar ele contra um repositório que supostamente é o código open-source do mesmo. Se as assinaturas baterem, quer dizer que aquele realmente é o código e os interessados podem auditá-lo e entender como ele foi construído. Ou seja, qualquer pessoa do mundo poderá olhar o seu código, entender como ele funciona e verificar se possui algo malicioso ou não.
É importante que antes de continuar você já tenha experiência com deploy de programas Solana. A familiaridade com esse tipo de tarefa tornará tudo mais fácil de entender. Caso nunca tenha feito um deploy antes, eu ensino neste tutorial.
Vamos lá!
#1 – Verificando seu programa Solana
Certifique-se de que você já fez o build e deploy do seu programa ao menos uma vez antes de avançar.
Pegue o Program Id do seu programa e vá no explorer.solana.com ou Solscan, certifique-se de escolher a rede corretamente (devnet no meu caso) e cole o endereço do seu programa. Você vai acessar a página de detalhes do seu programa (exemplo e outro exemplo). Repare que ela vai dizer que seu código-f0nte ainda não foi verificado, é isso que vamos resolver agora.
Primeiro, você precisa se certificar que o seu código-fonte está salvo publicamente em um repositório no GitHub e que neste repositório tenha somente este projeto na raiz do mesmo (até tem como verificar em subpastas, mas exige mais configurações que não cobrirei neste tutorial, use a documentação oficial neste caso). Outro ponto que você precisa se certificar é que sua conta padrão da máquina possua saldo, pois a transação de verificação irá usar ela.
Para verificar seu programa você vai precisar ter o Docker instalado na sua máquina e depois você vai precisar instalar o verificador da Solana também, um utilitário de linha de comando em Rust que você pode instalar com o comando abaixo.
1 2 3 |
cargo install solana-verify |
Com o Solana Verify instalado, faça um novo build do programa com ele.
1 2 3 |
solana-verify build |
Se ele der erro de versão do arquivo Cargo.lock (“parse error: invalid Cargo.lock format version: 4
“), apenas vá até ele e troque da version 4 para version 3 e rode o comando novamente.
Agora se ele der erro de conexão com o Docker (“docker: Cannot connect to the Docker daemon”), certifique-se de o Docker está rodando normalmente na sua máquina (eu tive um problema com isso no Mac, resolvi com essa ajuda aqui).
Uma vez que o build rode com sucesso, você pode pegar o hash do executável com o seguinte comando (substituindo a variável pelo valor correto).
1 2 3 |
solana-verify get-executable-hash target/deploy/<PROGRAM_NAME>.so |
Depois de compilado no Docker, é hora de fazer o deploy substituindo as variáveis entre < e > pelos seus próprios valores. Repare como defini que a carteira que está no id.json da raiz do projeto é que é a administradora do mesmo, estou considerando aqui que é a mesma carteira que você usou no deploy inicial, caso contrário dará erro. Apesar disso, as taxas de execução desse comando sempre serão pagas pela carteira default da sua máquina (também é possível modificar isso através de parâmetros).
1 2 3 |
solana program deploy -u <NETWORK> target/deploy/<PROGRAM_NAME>.so --program-id <PROGRAM_ID> --upgrade-authority ./id.json |
Na sequência, hora de rodar o comando de verificação a partir do repositório, como abaixo.
1 2 3 |
solana-verify verify-from-repo -u <NETWORK> --program-id <PROGRAM_ID> https://github.com/<REPO> |
E pronto, se tudo deu certo, em dado momento o terminal irá perguntar se você deseja subir a verificação par aa blockchain e basta confirmar, aguardar e a transação de verificação irá acontecer. Agora seu programa estará agora como verificado no block explorer.
Caso você tenha o erro “Error: No such file or directory (os error 2)” isso quer dizer que falta um arquivo de configuração da rede na sua máquina, algo que pode consertar facilmente com o comando abaixo.
1 2 3 |
solana config set --url devnet |
Mude a sua rede de acordo se não estiver verificando na testnet e tente novamente que agora o arquivo em questão irá existir. Se precisar rodar o comando verify-from-repo novamente e não quiser fazer todo o build de novo, pode usar a flag –skip-build.
Você vai reparar que na devnet os exploradores de bloco não vão mostrar seu programa como “verificado” (não sei dizer o motivo, mas não vão), então como saber se ele está verificado de fato? Além da mensagem de sucesso após o comando de verificação, você pode tentar verificá-lo novamente, aí receberá este comentário:
“Program already uploaded by the current signer. Updating the program.”
Ou seja, ele já estava verificado e você está fazendo de novo. O que não é nenhum problema, ok? Apenas a página do programa no block explorer devnet não vai mostrar a “badge” de verificado.
#2 – Tornando seu programa imutável
Uma última dica ligada a verificação de contrato é torná-lo imutável.
Por padrão os programas Solana são atualizáveis, ou seja, o autor do deploy original (authority) pode subir novas versões do programa que irão substituir as antigas. Note que isso é algo sensível de ser feito, principalmente considerando que as accounts utilizadas não são afetadas de nenhuma maneira, somente a account executável em si (programa). Não apenas isso, essa característica da rede é um problema de segurança grave para investidores, pois permite que o dev do programa mude as regras do protocolo com ele em andamento ou até mesmo faça rug pulls e outros golpes financeiros, então não raro é imprescindível que, uma vez que seu programa esteja estável e livre de bugs, que você torne o mesmo imutável, eliminando a informação do authority dele e com isso impedindo que novos deploys atualizem o mesmo.
Para fazer isso, uma vez que seu programa já esteja deployado na blockchain, rode o comando abaixo. Esse comando indica que esse programa não poderá mais ser atualizado pois é a versão “final”. Note como as chaves do owner atual do programa devem ser passadas o parâmetro keypair e a rede no parâmetro “u”.
1 2 3 |
solana program set-upgrade-authority <PROGRAM_ID> -u devnet --final --keypair ./id.json |
O resultado, somente a carteira do owner e aparece que o programa não é mais “upgradeable”, como abaixo.
Opcionalmente, durante o próprio deploy inicial você já pode especificar isso, utilizando a flag abaixo no comando solana program deploy. Esse comando faz com que o contrato não tenha authority e com isso não possa mais ser atualizado.
1 2 3 |
--upgrade-authority NONE |
Até a próxima!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.