Recentemente escrevi um artigo explicando tenicamente como as carteiras de criptomoedas funcionam, que você pode ler aqui.
No tutorial de hoje, eu vou ensinar como você pode criar sua própria carteira de criptomoedas para a rede Solana, ou seja, programar uma aplicação que conecta um usuário à blockchain e dapps web3 na blockchain da Solana. Faremos isso utilizando a linguagem JavaScript e a biblioteca Web3.js, com o objetivo de termos ao final dele uma aplicação console que permita as operações básicas.
Se quer aprender a criar carteira para rede Bitcoin, use este tutorial. Agora se quiser criar carteira para rede Ethereum (e compatíveis), use este.
Vamos lá!
#1 – Por que criar sua própria carteira cripto?
A primeira coisa que deve vir na sua mente é: por que diabos eu iria querer criar a minha própria carteira de criptomoedas? Falo sobre isso no vídeo abaixo e também no texto a seguir.
Essa dúvida é super normal já que existem no mercado diversas opções gratuitas e consolidadas, mas assim como ocorreu (e ainda ocorre, mas em menor intensidade) com os navegadores de Internet entre o final da década de 90 e início dos anos 2000, estamos no início de uma nova revolução tecnológica e com isso na etapa de surgimento das grandes aplicações de uso cotidiano nesse contexto. Não há ainda uma hegemonia de software em diversos nichos deste mercado e mesmo a MetaMask sendo a líder no setor de carteiras cripto, estamos falando de menos de 30MM de usuários mundialmente em um mercado que tem potencial para os bilhões e ela nem sequer suporta a rede Solana na data que escrevo este tutorial. E isso não vale apenas para carteiras cripto, mas para diversos nichos na web3.
Não apenas isso, mas aprender como criar sua própria carteira de criptomoedas vai te ajudar também a pensar em novas e interessantes maneiras de interagir com a blockchain ao mesmo tempo que aprofunda seu entendimentos sobre este tipo de software pois apesar do nome, talvez você já tenha ouvido falar que as carteiras não são exatamente “carteiras”, certo? E acho que esse é o ponto principal deste tutorial, te ajudar a entender como esses softwares realmente funcionam, independente se você vier a criar um app como Trust Wallet ou qualquer outro.
Dito isso, nossa primeira missão é entender, tecnicamente, como funciona uma carteira de criptomoedas.
#2 – Como funciona uma carteira de criptomoedas?
Podemos resumir basicamente o funcionamento de uma carteira de criptomoedas como:
- guardar as chaves de uma conta da blokchain;
- consultar os ativos (tokens) desta conta;
- fazer transações nesta conta usando as chaves;
Quaisquer outras funcionalidades além dessas são secundárias e mudam de aplicação para aplicação como por exemplo a criação de novas contas, agenda de contatos frequentes, histórico de atividades, alertas, compra de criptomoedas e muito mais. Aliás, pensando em modelo de negócios, é justamente nessas funcionalidades adicionais é que você pode criar um negócio lucrativo e uma aplicação interessante.
Mas voltando ao que nos interessa, todas essas funcionalidades exigem que o software se comuniquem com ao menos um nó de uma blockchain, para poder consultar e escrever no livro-razão. Assim, em última instância, uma carteira de criptomoedas nada mais é do que um client de blockchain e é justamente isso que faremos neste tutorial, começando a seguir.
#3 – Configurando o Projeto
Os protocolos de comunicação com a blockchain podem ser utilizando com quaisquer tecnologias que permitam comunicação pela rede. Para este projeto optarei por utilizar a linguagem de programação JavaScript, uma das mais versáteis da atualidade, e como farei uma aplicação de console (sem interface gráfica, apenas interação via terminal) utilizarei a tecnologia Node.js que me permite usar JS em aplicações que não estejam no browser.
Caso você não possua o Node.js instalado na sua máquina, o vídeo abaixo ensina a instalar.
Com o Node.js instalado, você pode criar uma pasta no seu computador com o nome de wallet-solana e abrindo o terminal de linha de comando do seu sistema operacional (cmd no Windows), navegue até a pasta que criou e digite o seguinte comando para inicializar o seu projeto.
1 2 3 |
npm init -y |
Com o projeto inicializado, vamos instalar as dependências que vamos precisar, ainda com o terminal aberto.
1 2 3 |
npm install @solana/web3.js base58-js |
O pacote @solana/web3.js é muito utilizado para desenvolvimento de aplicações JavaScript integradas à blockchain Solana e inclusive tem funcionalidades que facilitarão muito a nossa vida quando o assunto é criar uma carteira cripto. Já o base58-js é um pacote de encode/decode que usaremos mais tarde, então deixarei a explicação dele para depois
Agora crie um arquivo index.js na raiz da sua aplicação e carregue suas respectivas variáveis da seguinte forma.
1 2 3 4 5 6 7 8 |
//index.js const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }) |
Comecei escrevendo o código de leitura de inputs do usuário no terminal, com o módulo nativo readline, devidamente configurado. Usaremos o readline para interagir com usuário fazendo perguntas e aguardando respostas, típico de aplicações console (se já usou algum CLI na vida, logo vai entender como eles são criados).
#4 – Criando a sua Wallet
A próxima missão é começarmos a implementar as funcionalidades da carteira. Para não misturarmos código de interação do usuário (que ficarão no index.js) com o código da carteira em si, vamos criar um segundo arquivo em nosso projeto chamado WalletService.js. Nele, vamos começar importando algumas dependências da web3.js que vamos precisar e também as duas funções da lib base58-js.
Com a biblioteca web3.js carregada, vamos criar a conexão com o nó da blockchain de testes (devnet), a nível do módulo (reaproveitaremos essa conexão em todas as funções). Também defini uma variável local myWallet que servirá para guardar o objeto de configuração da carteira, depois que inicializarmos ele.
1 2 3 4 5 6 7 8 9 |
//WalletService.js const { Keypair, PublicKey, Connection, clusterApiUrl, LAMPORTS_PER_SOL, Transaction, sendAndConfirmTransaction, SystemProgram } = require("@solana/web3.js"); const {binary_to_base58, base58_to_binary} = require("base58-js"); const connection = new Connection(clusterApiUrl("devnet"), "confirmed"); let myWallet = null; |
Falando nele, a primeira função que vamos criar é justamente a de criação da carteira. Nosso software de carteira permitirá tanto a criação de uma nova carteira quanto a importação de uma carteira já existente, mas vamos implementar uma coisa de cada vez.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//WalletService.js function createWallet() { myWallet = new Keypair(); myWallet.publicKeyDecoded = myWallet.publicKey.toBase58(); myWallet.secretKeyDecoded = binary_to_base58(myWallet.secretKey); return myWallet; } module.exports = { createWallet } |
Aqui usei a classe Keypair para criar uma nova carteira aleatoriamente, devolvendo o objeto da mesma para quem chamou a função. Antes de devolver, repare como decodifiquei as chaves e guardei em outras propriedades, para facilitar a apresentação das mesmas na interface, já que originalmente elas são binárias. Não esqueça de exportar essa função ao final do módulo para que ela possa ser chamada em nosso index.js. Falando nele, vamos começar a implementar nosso menu com as opções que teremos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
const WalletService = require("./WalletService"); let myAddress = ""; function menu() { setTimeout(() => { console.clear(); if (myAddress) console.log(`You are logged as ${myAddress}`); else console.log(`You aren't logged.`); console.log("1 - Create Wallet"); console.log("2 - Recover Wallet"); console.log("3 - Balance"); console.log("4 - Send SOL"); console.log("5 - Search tx"); rl.question("Choose your option: ", (answer) => { switch (answer) { case "1": createWallet(); break; case "2": recoverWallet(); break; case "3": getBalance(); break; case "4": sendTx(); break; default: { console.log('Wrong option!'); menu(); } } }) }, 1000) } menu(); |
Aqui eu comecei importando nosso WalletService e declarando uma variável para armazenar o endereço da carteira de quem iniciou a sessão do aplicativo (usaremos esta variável mais tarde). Depois eu declaro uma função menu que limpa o console, verifica se já temos uma carteira (imprimindo no console se houver) e depois imprime as 5 opções que teremos para o usuário, cada uma chamando uma função. Nós não temos essas funções ainda, mas logo teremos.
O principal ponto aqui é entender como o readline (variável rl) funciona: a função question exibe uma pergunta para o usuário e lê a resposta (answer) em um callback assim que ele apertar Enter. Com base nessa resposta, temos a execução da função apropriada. Esse comportamento eu coloquei dentro de um setTimeout para ter tempo do usuário entender o que está acontecendo na aplicação e por fim, chamo a impressão do menu ao final do módulo.
Se rodar o index.js você já terá o menu funcionando, mas se escolher qualquer opção terá um erro até que implemente a mesma.
Para implementar a primeira funcionalidade, crie uma função createWallet() no mesmo arquivo com o seguinte conteúdo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//index.js function preMenu() { rl.question(`Press any key to continue...`, () => { menu(); }) } function createWallet() { console.clear(); const myWallet = WalletService.createWallet(); myAddress = myWallet.publicKeyDecoded; console.log(`Your new wallet:`); console.log(myAddress); console.log(`Your secret key:`); console.log(myWallet.secretKeyDecoded); preMenu(); } |
A createWallet() limpa o console (sempre faremos isso) e chama a função de mesmo nome que deixamos pronta na WalletService.js. O resultado é um objeto com publicKey e secretKey decodificados, sendo que imprimirei ambos no console indicando que a nova carteira foi criada com sucesso. Aliás, essa será a ÚNICA vez que você verá a secret key da sua carteira, então tome nota pois precisará dessa informação para recuperá-la no futuro. Por fim, chamamos uma função preMenu() que aguarda um Enter do usuário antes de reimprimir todo o menu novamente.
Experimente a aplicação do jeito que está, executando ela com “node index” e criando uma nova carteira. Claro, toda vez que rodar a aplicação do zero, terá de criar uma nova carteira, pois não temos banco de dados, isso até que a gente implemente a recuperação de carteiras.
O que faremos na segunda etapa deste tutorial, acesse aqui!

Como criar sua própria carteira de criptomoedas com JS (Solana) - Parte 2

Como configurar a Brave Wallet para desenvolvimento blockchain

Como configurar a MetaMask para desenvolvimento blockchain

Decifrando golpes com MEV Bot na prática
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.