Back to Blog

Proteja o Ecossistema Solana (1) — Olá Solana

9 de março de 2022
6 min read

1. Introdução

Solana é um sistema de blockchain de Camada 1 de alto desempenho e sem permissão que suporta programas (contratos inteligentes) a serem desenvolvidos em diferentes linguagens (por exemplo, Rust, C++ e C). Com a ajuda do Tower BFT (Byzantine Fault Tolerant), ele pode lidar com milhares de transações por segundo em tempos de bloco. Uma das principais inovações da Solana é o Proof of History (PoH), uma fonte de tempo globalmente disponível e sem permissão na rede que funciona antes do consenso. Discutiremos o PoH com mais detalhes no futuro.

2. Nossa Missão

BlockSec é uma empresa de segurança blockchain que tem como missão "proteger o Ecossistema DApp". Assim, fornecemos não apenas serviço de auditoria de contratos, mas também sugestões sobre como escrever contratos inteligentes seguros para toda a comunidade. Considerando a popularidade, o alto desempenho e o excelente design da Solana, esta série se concentrará na segurança de contratos inteligentes em Rust na Solana.

3. Hello Solana

Antes de discutirmos os contratos inteligentes da Solana do ponto de vista de segurança, primeiro precisamos saber como escrever, compilar e implantar os contratos inteligentes da Solana. Aqui usamos o Hello World como exemplo ilustrativo.

3.1 Revisão do Código

Na Solana, um contrato inteligente é chamado de programa. O programa Hello World tem como objetivo manter um contador, que registra o número de vezes que a conta alvo (pertencente ao programa) foi chamada pelo cliente, e imprime esse número como saída.

Agora vamos percorrer todo o contrato.

As linhas 1 a 9 trazem muitas bibliotecas para o escopo explicitamente com a palavra-chave use.

Na linha 12, [derive(BorshSerialize, BorshDeserialize, Debug)] é usado para serializar e desserializar os parâmetros passados para a struct GreetingAccount, que é definida da linha 13 à linha 16. A struct contém um membro público chamado counter do tipo u32. Depois disso, como comentado, a linha 19 exporta o ponto de entrada do programa, que é a função process_instruction.

A função process_instruction aceita três parâmetros (ou seja, program_id, accounts e _instruction_data). Note que program_id é a chave pública (ou seja, endereço) do programa implantado, enquanto accounts contém a conta para dizer olá. O _instruction_data está vazio e não é utilizado.

Para saber mais sobre os programas e contas na Solana, consulte a documentação da Solana.

Na linha 27, uma mensagem de olá é impressa. Da linha 30 à linha 33, as contas serão iteradas e a conta específica para dizer olá será extraída. Depois disso, o proprietário da conta será verificado e deve ser igual ao program_id para garantir que o programa possa escrever na conta. Por fim, o greeting_account será extraído com try_from_slice, e o contador será incrementado em 1.

3.2 Compilar o Programa

Para compilar o programa, precisamos instalar o Solana CLI com o seguinte comando.

sh -c "$(curl -sSfL https://release.solana.com/v1.9.9/install)"

Para confirmar que o Solana CLI foi instalado com sucesso, podemos verificar sua versão com o seguinte comando.

solana --version

Note que Rust e NodeJS também são necessários.

Para compilar o programa, podemos usar o seguinte comando.

cargo build-bpf --manifest-path=./src/program-rust/Cargo.toml --bpf-out-dir=dist/program

O programa compilado será gerado no diretório especificado em --bpf-out-dir, com o nome helloworld.so.

3.3 Implantar o Contrato

Para implantar o programa compilado na Solana, precisamos primeiro selecionar um cluster. Na Solana, existem quatro clusters diferentes: mainnet, testnet, devnet e localnet. Nesta publicação, implantamos o programa compilado apenas na devnet para fins de demonstração.

Usamos o seguinte comando para especificar o cluster.

solana config set --url https://api.devnet.solana.com

Depois disso, precisamos gerar a carteira para implantação. solana-keygen new --force ajuda a gerar a carteira. Para mais informações, consulte o Doc da Solana.

Como a conta recém-criada não tem saldo para pagar as taxas de transação, fazemos um airdrop de 1 SOL com o seguinte comando.

solana airdrop 1 <SuaChavePublica> --url https://api.devnet.solana.com

Agora estamos prontos para implantar o contrato.

solana program deploy dist/program/helloworld.so

Os usuários podem verificar os programas e transações no Explorador da Devnet. Nesta demonstração, você pode encontrar o programa implantado com este link.

3.4 Enviar Transação

É recomendado escrever scripts, chamados de cliente, para enviar transações na Solana. Felizmente, a Solana fornece o código de exemplo. Para executar o cliente, primeiro precisamos instalar as dependências do cliente.

npm install 

Após a conclusão da instalação, executamos a função main no arquivo main.ts com o seguinte comando.

npm run start 

Na função main, o cliente primeiro estabelece a conexão com o cluster especificado (ou seja, Devnet) com a função establishConnection(), verifica o pagador que paga as taxas de transação com a função establishPayer, e valida a existência do programa e da conta para dizer olá com a função checkProgram. Note que, se a conta necessária não existir, ela será criada enviando uma transação. Em nossa demonstração, a conta é criada nesta transação.

Quando tudo estiver pronto, a função sayHello é invocada para dizer olá à conta alvo. A transação consiste em uma instrução. Essa instrução recebe keys contendo uma conta. A chave pública da conta (ou seja, greetedPubkey) é a conta alvo para dizer olá. Note que essa conta é usada para armazenamento e não é um signatário. Nesse caso, o atributo isSigner é false enquanto isWritable é true. O programId é o proprietário do greetedPubkey e também é o endereço do contrato implantado. Note que data está vazio e não será usado nesta transação. Na linha 208, a função sendAndConfirmTransaction é invocada e a transação será enviada ao cluster.

Você pode visualizar a transação detalhada aqui.

4. Conclusão

Neste artigo, apresentamos brevemente o histórico da Solana e percorremos o projeto de exemplo (ou seja, Hello World). Aprendemos como implantar um programa na Solana e como usar o cliente para interagir com o programa on-chain. Continue acompanhando nosso blog, pois publicaremos mais artigos para esta série de forma consistente.

Leia outros artigos desta série:

Sign up for the latest updates
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.

O que é a certificação SEAL? Garantia de segurança operacional para cripto
Security Insights

O que é a certificação SEAL? Garantia de segurança operacional para cripto

A certificação SEAL oferece uma avaliação independente da segurança operacional em cripto dentro de um escopo acordado. Conheça seus seis módulos, os requisitos de evidências, os limites da certificação e o processo de avaliação da BlockSec.