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:
- 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 (5) — Multi-Sig
- Protegendo o Ecossistema Solana (6) — Multi-Sig2
- Protegendo o Ecossistema Solana (7) — Confusão de Tipos



