Seu Primeiro Módulo Move
O blockchain Aptos permite que desenvolvedores escrevam contratos inteligentes Turing completos (chamados “módulos”) com a linguagem Move segura por design. Contratos inteligentes permitem que usuários enviem dinheiro com o blockchain, mas também escrevam código arbitrário, até mesmo jogos! Tudo começa com o CLI Aptos criando uma conta que armazenará o módulo Move implantado (“publicado”).
Este tutorial irá ajudá-lo a entender Módulos Move guiando você através da configuração de um ambiente Aptos mínimo, depois como compilar, testar, publicar e interagir com módulos Move no Blockchain Aptos. Você aprenderá como:
- Configurar seu ambiente, instalar o CLI
- Criar uma conta devnet e financiá-la
- Compilar e testar um módulo Move
- Publicar (ou “implantar”) um módulo Move no blockchain Aptos
- Interagir com o módulo
- Continuar construindo com Aptos (próximos passos)
1. Configuração
Seção intitulada “1. Configuração”Mudanças no blockchain são chamadas “transações”, e elas requerem uma conta para pagar a taxa de rede (“taxa de gas”). Precisaremos criar uma conta com algum APT para pagar essa taxa e possuir o contrato publicado. Para fazer isso, precisaremos usar o CLI Aptos.
-
Instalar o CLI Aptos
Instale o CLI Aptos (se ainda não tiver).
-
Abrir um novo terminal
Abra uma nova janela ou aba de terminal.
-
Verificar a instalação
Execute
aptos --version
para verificar se você tem instalado.Terminal window aptos --versionVocê deve ver uma resposta como
aptos 4.6.1
. -
Criar uma pasta de projeto
Crie uma nova pasta para este tutorial executando:
Terminal window mkdir meu-primeiro-modulo -
Navegar para a pasta do projeto
Execute
cd meu-primeiro-modulo
para entrar na sua nova pasta. -
Inicializar sua conta
Execute
aptos init
e pressione ‘enter’ para cada etapa da configuração para criar uma conta de teste nodevnet
.Você deve ver uma mensagem de sucesso como esta:
Terminal window ---CLI Aptos está agora configurado para a conta 0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba como perfil padrão!{"Result": "Success"}
2. (Opcional) Explorar o Que Você Acabou de Fazer On-Chain
Seção intitulada “2. (Opcional) Explorar o Que Você Acabou de Fazer On-Chain”-
Copiar seu endereço de conta
Copie o endereço da linha de comando para sua nova conta.
O endereço se parece com isso
0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba
e você pode encontrá-lo na linha:Terminal window CLI Aptos está agora configurado para a conta 0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba como perfil padrão! -
Abrir o Explorador Aptos
Vá para o Explorador Aptos.
Esta é a maneira principal de verificar rapidamente o que está acontecendo no devnet, testnet ou mainnet. Usaremos mais tarde para visualizar nossos contratos implantados.
-
Garantir que você está na rede Devnet
Procure por “Devnet” no canto superior direito, ou mude redes clicando no dropdown “Mainnet” e selecionando Devnet.
-
Procurar sua conta
Cole seu endereço recém-criado na barra de busca.
-
Visualizar os resultados da busca
Aguarde os resultados aparecerem, então clique no resultado do topo.
-
Verificar a transação
Você deve ver sua conta recém-criada e uma transação com a função faucet, financiando-a com tokens devnet.
-
Verificar seu saldo
Clique na aba “Coins” para ver que você tem 1 APT do Aptos Coin. Isso permitirá que você publique e interaja com contratos inteligentes no devnet aptos.
3. Escrevendo e Compilando Seu Primeiro Módulo
Seção intitulada “3. Escrevendo e Compilando Seu Primeiro Módulo”Agora que temos nosso ambiente configurado e uma conta criada, vamos escrever e compilar nosso primeiro módulo Move. Diferente do Ethereum onde contratos existem independentemente, Move conecta tudo a contas - tanto módulos quanto seus recursos. Vamos começar com um exemplo simples para entender os conceitos centrais.
O que é um Módulo Move?
Seção intitulada “O que é um Módulo Move?”Módulos Move são similares a contratos inteligentes em outros blockchains, com algumas diferenças principais:
- Recursos: Diferente do Solidity onde estado é armazenado em variáveis de contrato, Move usa “recursos” - tipos de dados especiais que só podem existir em um lugar por vez e estão sempre ligados a uma conta
- Baseado em módulos: Em vez de implantar contratos inteiros como unidades independentes como no Solidity, código Move é organizado em módulos reutilizáveis que podem compartilhar e manipular recursos através de fronteiras. Módulos são mais como pacotes de biblioteca padrão que podem ser publicados juntos ou separadamente, oferecendo controle mais refinado sobre organização de código.
- Segurança por design: O sistema de tipos do Move e semântica de recursos ajudam a prevenir vulnerabilidades comuns de contratos inteligentes
Seu Primeiro Módulo Move
Seção intitulada “Seu Primeiro Módulo Move”Nosso primeiro módulo será um sistema simples de armazenamento de mensagens que permite contas armazenar e recuperar mensagens. Vamos criar um novo projeto move dentro da nossa pasta meu-primeiro-modulo
:
-
Inicializar o projeto
Inicialize um novo projeto move com
aptos move init --name meu_primeiro_modulo
Isso cria uma estrutura de projeto com um diretório
sources
e um arquivoMove.toml
. -
Criar o arquivo do módulo
Crie um novo arquivo
sources/mensagem.move
com nosso código do módulo:module meu_primeiro_modulo::mensagem {use std::string;use std::signer;struct GuardadorMensagem has key, store, drop {mensagem: string::String,}public entry fun definir_mensagem(conta: &signer, mensagem: string::String) acquires GuardadorMensagem {let endereco_conta = signer::address_of(conta);if (exists<GuardadorMensagem>(endereco_conta)) {move_from<GuardadorMensagem>(endereco_conta);};move_to(conta, GuardadorMensagem { mensagem });}public fun obter_mensagem(endereco_conta: address): string::String acquires GuardadorMensagem {assert!(exists<GuardadorMensagem>(endereco_conta), 0);let guardador_mensagem = borrow_global<GuardadorMensagem>(endereco_conta);guardador_mensagem.mensagem}} -
Entender o código
Este módulo simples faz o seguinte:
- Definição de struct:
GuardadorMensagem
é um recurso com capacidadeshas key, store, drop
key
: pode ser armazenado em armazenamento globalstore
: pode ser armazenado dentro de outras structsdrop
: pode ser deletado
- Função definir_mensagem: armazena uma mensagem em uma conta (substitui se existir)
- Função obter_mensagem: lê uma mensagem de uma conta
- Definição de struct:
-
Compilar o módulo
No diretório do projeto, execute:
Terminal window aptos move compileSe bem-sucedido, você verá os resultados da compilação:
Terminal window Compilando, pode demorar um pouco para baixar dependências git...INCLUINDO DEPENDÊNCIA AptosFrameworkINCLUINDO DEPENDÊNCIA AptosStdlibINCLUINDO DEPENDÊNCIA MoveStdlibCONSTRUINDO meu_primeiro_modulo{"Result": ["9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba::mensagem"]}
4. Testando o Módulo
Seção intitulada “4. Testando o Módulo”Move tem suporte integrado para escrever testes. Vamos testar nosso módulo antes de implantá-lo:
-
Criar arquivo de teste
Crie
sources/teste_mensagem.move
:#[test_only]module meu_primeiro_modulo::testes_mensagem {use std::string;use meu_primeiro_modulo::mensagem;#[test(conta = @0x1)]public fun testar_definir_e_obter_mensagem(conta: &signer) {let texto_mensagem = string::utf8(b"Olá, Aptos!");mensagem::definir_mensagem(conta, texto_mensagem);let mensagem_armazenada = mensagem::obter_mensagem(@0x1);assert!(mensagem_armazenada == string::utf8(b"Olá, Aptos!"), 0);}} -
Executar testes
Terminal window aptos move testSe os testes passarem, você verá saída como esta:
Terminal window Executando testes unitários Move[ PASSOU ] 0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba::testes_mensagem::testar_definir_e_obter_mensagemResultado do teste: OK. Total de testes: 1; passou: 1; falhou: 0
5. Publicando o Módulo
Seção intitulada “5. Publicando o Módulo”Com os testes passando, vamos publicar nosso módulo no devnet:
-
Publicar o módulo
Terminal window aptos move publish -
Confirmar a publicação
Digite “yes” no prompt para confirmar a publicação.
Se bem-sucedido, você verá um hash de transação:
Terminal window tamanho do pacote 1755 bytesVocê quer enviar uma transação para um intervalo de [600 - 900] Octas a um preço unitário de gas de 100 Octas? [yes/no] >yes{"Result": {"transaction_hash": "0x64b9e3bd21c5b3ca1cab0e1b10dc06c0add1d2f7bfcf0b4ce1de3c1b7c3e8dc8","gas_used": 721,"gas_unit_price": 100,"sender": "9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba","success": true,"version": 502312001,"vm_status": "Executado com sucesso"}}
6. Interagindo com o Módulo
Seção intitulada “6. Interagindo com o Módulo”Com o módulo publicado, vamos interagir com ele:
-
Definir uma mensagem
Terminal window aptos move run --function-id default::mensagem::definir_mensagem --args string:"Olá do meu primeiro módulo!" -
Obter a mensagem
Terminal window aptos move view --function-id default::mensagem::obter_mensagem --args address:seu_endereco_de_contaSubstitua
seu_endereco_de_conta
pelo seu endereço real. -
Verificar no Explorador
Você pode pesquisar seu endereço de conta no Explorador Aptos e ver o recurso GuardadorMensagem na aba “Resources”.
Próximos Passos
Seção intitulada “Próximos Passos”Parabéns! Você criou, testou, publicou e interagiu com sucesso com seu primeiro módulo Move. A seguir, experimente:
- Livro Move - Aprenda mais sobre a linguagem de programação Move
- Construindo um dApp Completo - Integre módulos com um frontend
- Padrões Aptos - Explore padrões Move mais avançados e melhores práticas
Aproveite sua jornada de desenvolvimento Move!