Crie Sua Própria Carteira Ergo: Gerenciando Ergo Coins com ErgoTool
31 de dezembro de 2019

Introdução
ErgoTool é uma interface de linha de comando (CLI) para
Ergo blockchain. Você pode usar o ErgoTool sem executar seu
próprio nó Ergo. Embora executar um nó seja a maneira mais segura de se comunicar com a
rede da blockchain Ergo, o ErgoTool, no entanto, visa fornecer mais ferramentas fundamentais à
sua disposição. Certamente, você ainda pode usá-lo com seu próprio nó em execução.
Neste post, vamos percorrer passos simples para gerar uma frase mnemônica, criar um
armazenamento secreto local e usá-lo para enviar ERGs entre endereços, tudo com a ajuda dos
comandos do ErgoTool.
Começando
Primeiro de tudo, precisamos instalar o ErgoTool em nosso sistema a partir das fontes, seguindo as
instruções de instalação. No
diretório onde clonamos o ErgoTool, há um script ergo-tool.sh que vamos usar para
executar comandos. Execute o seguinte comando para verificar se o ErgoTool está instalado corretamente.
$ ./ergo-tool.sh help
nome do comando não está especificado (execute o ergo-tool sem argumentos para listar comandos)
Nome do Comando: help
Sintaxe de Uso: ergo-tool help <commandName>
Descrição: imprime ajuda de uso para um comando
Página do Doc: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/HelpCmd.html
Vamos ver o que obtemos aqui. O ErgoTool exibe a mensagem de erro com as informações sobre o
comando help. Esta é uma saída típica do ErgoTool quando um dos comandos conhecidos é
especificado, mas é usado incorretamente. Como podemos aprender com a mensagem, o comando help
exige que especifiquemos um argumento adicional <commandName>. Além disso, cada comando tem
uma página de documentação da API com todos os detalhes sobre a execução do comando, então seu URL é mostrado aqui.
Criar uma Nova Frase Mnemônica
Uma mnemônica é uma sequência aleatória de caracteres que é usada para gerar uma chave mestre
de acordo com a especificação de Carteiras Hierárquicas Determinísticas.
Para conveniência, uma sequência aleatória de palavras em inglês é usada, mas isso não é obrigatório.
Execute o seguinte comando para gerar uma nova frase mnemônica:
$ ./ergo-tool.sh mnemonic
bird harbor wheat innocent business disease busy quick yellow trust time oil enter situate moon
Anote-a em um papel e mantenha em um lugar seguro e secreto.
Como uma medida de segurança adicional, você pode criar uma senha mnemônica arbitrária.
De certa forma, ela pode servir como uma palavra não-vocabulário adicional na mnemônica.
A senha mnemônica é opcional e é usada para segurança adicional.
Se você decidir usar uma senha mnemônica, também deve anotá-la e mantê-la em um lugar secreto e
provavelmente diferente da mnemônica.
Importante, tanto a frase mnemônica quanto a senha mnemônica são necessárias para restaurar as chaves secretas,
se você perder qualquer uma delas, não poderá regenerar sua chave mestre novamente.
Em seguida, vamos usar a mnemônica gerada para criar um armazenamento com uma chave secreta mestre.
Criar um Novo Armazenamento Criptografado
Para melhor segurança, nem a frase mnemônica nem a senha são exigidas pelo ErgoTool para
realizar a assinatura da transação. Em vez disso, a chave secreta do armazenamento criptografado é
necessária para assinar a transação de gasto. Podemos gerar uma chave secreta e armazená-la em um
armazenamento criptografado usando o comando createStorage.
$ ./ergo-tool.sh help createStorage
Nome do Comando: createStorage
Sintaxe de Uso: ergo-tool createStorage [<storageDir>="storage"] [<storageFileName>="secret.json"]
Descrição: Cria um arquivo de armazenamento criptografado para a mnemônica inserida pelo usuário
Página do Doc: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/CreateStorageCmd.html
$ ./ergo-tool.sh createStorage
Digite a frase mnemônica> bird harbor wheat innocent business disease busy quick yellow trust time oil enter situate moon
Senha mnemônica>
Repita a senha mnemônica>
Senha do armazenamento>
Repita a senha do armazenamento>
Arquivo de Armazenamento: storage/secret.json
Uma chave secreta mestre é gerada a partir do par (frase mnemônica, senha mnemônica) e
salva criptografada no arquivo storage/secret.json. A mnemônica em si não é armazenada no
arquivo e não há como restaurá-la a partir do arquivo, mesmo que você conheça as senhas.
Por favor, tenha cuidado ao inserir a senha mnemônica, aquela que você escolheu e salvou antes.
Como a senha mnemônica é opcional, você pode deixá-la em branco pressionando enter.
Se você esquecer a senha do armazenamento (também conhecida como senha de criptografia), não poderá usar
mais esse arquivo de armazenamento, no entanto, você sempre pode restaurar suas chaves secretas a partir do par (frase
mnemônica, senha mnemônica) e assim criar um novo arquivo de armazenamento com uma nova senha.
Mantenha seu arquivo de armazenamento e a senha do armazenamento em segredo, qualquer um que obtiver tanto seu arquivo de armazenamento
quanto a senha do armazenamento poderá decifrá-lo e acessar as chaves secretas.
Extraindo Dados do Armazenamento
O armazenamento secreto contém a chave secreta mestre e, como resultado, pode ser usado para calcular tanto a
chave pública quanto o endereço pay-to-public-key que correspondem a essa chave secreta. O comando extractStorage faz exatamente isso.
$ ./ergo-tool.sh help extractStorage
Nome do Comando: extractStorage
Sintaxe de Uso: ergo-tool extractStorage <arquivo de armazenamento> address|masterKey|publicKey|secretKey mainnet|testnet
Descrição: Lê o arquivo, desbloqueia-o usando a senha e extrai a propriedade solicitada do arquivo de armazenamento fornecido.
Página do Doc: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/ExtractStorageCmd.html
$ ./ergo-tool.sh extractStorage storage/secret.json address mainnet
Senha do armazenamento>
9iHiSAg3ko2ZGxR2vhc1Aem3tShqfzEPDAF7XK5cdtbZ3Ut2CCf
Aqui o comando transforma a chave secreta na chave pública correspondente e então cria
o endereço pay-to-public-key na mainnet.
Da mesma forma, podemos obter a chave pública, chave privada e outros dados do armazenamento.
$ ./ergo-tool.sh extractStorage storage/secret.json secretKey mainnet
Senha do armazenamento>
55dfde63c9b6b4f47683592e85ee997ba2e93507f38ba3f9c82933bcfbc677ca
$ ./ergo-tool.sh extractStorage storage/secret.json publicKey mainnet
Senha do armazenamento>
03f07aecb145a85920bf6e9be80efe5f1cd1a165b45ad3aa8e5c4ca3ba50856bb8
Listando Caixas Não Gastas
O ErgoTool tem um comando especial para listar todas as caixas disponíveis (ou seja, não gastas) para um determinado endereço.
$ ./ergo-tool.sh listAddressBoxes 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
BoxId NanoERGs
4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119 4987000000
se especificarmos a opção --print-json, o ErgoTool irá exibir todas as caixas em formato json
$ ./ergo-tool.sh listAddressBoxes --print-json 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
[{"boxId":"4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119","value":4987000000,"ergoTree":"0008cd02472963123ce32c057907c7a7268bc09f45d9ca57819d3327b9e7497d7b1cc347","creationHeight":125646,"assets":[],"additionalRegisters":{},"transactionId":"820c688f4b9d709924ba0186ee930a7df374d8852920bc769fc1f1d0b313e5ab","index":2}]
Transferir Moedas
Agora, com a chave secreta armazenada com segurança no arquivo de armazenamento criptografado, podemos usar o ErgoTool para
transferir moedas de nosso endereço para algum outro endereço de destinatário. O comando para fazer isso é
send.
./ergo-tool.sh help send
Nome do Comando: send
Sintaxe de Uso: ergo-tool send <storageFile> <recipientAddr> <amountToSend>
Descrição: enviar o <amountToSend> dado para o <recipientAddr> dado usando
o <storageFile> dado para assinar a transação (solicita a senha do armazenamento)
Página do Doc: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/SendCmd.html
O arquivo de armazenamento é necessário para acessar a chave secreta e gerar uma assinatura. A
senha do armazenamento será solicitada pelo ErgoTool para desbloquear e decifrar o conteúdo do arquivo.
O comando send suporta a opção --dry-run, que força o ErgoTool a criar a
transação assinada, mas em vez de enviá-la para a blockchain, o ErgoTool imprime a
transação no console.
$ ./ergo-tool.sh send --dry-run storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Senha do armazenamento>
Criando provedor... Ok
Carregando caixas não gastas do endereço 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ok
Assinando a transação... Ok
Tx: {
"id": "2633733a1d81b8fc747d984bdc36fac42cb52118b5057375b081b4c543c62b0e",
"inputs": [
{
"boxId": "4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119",
"spendingProof": {
"proofBytes": "060e7c99c9c9cecf89ec5c3e7b692075e0b3415318f8064c64f7f01401ac29c6637b44535151e51d43d4cd25e05ad459dbe33718a99a22dd",
"extension": {}
}
}
],
"dataInputs": [],
"outputs": [
{
"boxId": "4eaed414ae763158126859bbf912fa9ffb9ea67ac13d81d473b1c81ec65b06fd",
"value": 5000000,
"ergoTree": "ErgoTree(0,WrappedArray(),Right(ConstantNode(SigmaProp(ProveDlog(ECPoint(6ba5cf,8ae5ac,...))),SSigmaProp)),80,[B@1117fff48)",
"creationHeight": 130508,
"assets": [],
"additionalRegisters": {},
"transactionId": "2633733a1d81b8fc747d984bdc36fac42cb52118b5057375b081b4c543c62b0e",
"index": 0
},
{
"boxId": "059b426fe2aaef10b6a9a618f0c5b4e97d4dd9931328bf4f52bcf92b0943a42c",
"value": 1000000,
"ergoTree": "ErgoTree(16,WrappedArray(IntConstant(0), IntConstant(0), ConstantNode(Coll(16,2,4,-96,11,8,-51,2,121,-66,102,126,-7,-36,-69,-84,85,-96,98,-107,-50,-121,11,7,2,-101,-4,-37,45,-50,40,-39,89,-14,-127,91,22,-8,23,-104,-22,2,-47,-110,-93,-102,-116,-57,-89,1,115,0,115,1),Coll[SByte$]), ConstantNode(Coll(1),Coll[SInt$]), IntConstant(1)),Right(BoolToSigmaProp(AND(ConcreteCollection(WrappedArray(EQ(Height$(163),SelectField(ExtractCreationInfo(ByIndex(Outputs$(165),ConstantPlaceholder(0,SInt$),None)),1)), EQ(ExtractScriptBytes(ByIndex(Outputs$(165),ConstantPlaceholder(1,SInt$),None)),SubstConstants(ConstantPlaceholder(2,Coll[SByte$]),ConstantPlaceholder(3,Coll[SInt$]),ConcreteCollection(WrappedArray(CreateProveDlog(DecodePoint(MinerPubkey$(172)))),SSigmaProp))), EQ(SizeOf(Outputs$(165)),ConstantPlaceholder(4,SInt$))),SBoolean)))),4836,[B@111805c40)",
"creationHeight": 130508,
"assets": [],
"additionalRegisters": {},
"transactionId": "2633733a1d81b8fc747d984bdc36fac42cb52118b5057375b081b4c543c62b0e",
"index": 1
},
{
"boxId": "0638ddb0fe6a8cc6ca4f981f71777f4a6e8aad72d57fdf945b24e0ef4ca714e1",
"value": 4981000000,
"ergoTree": "ErgoTree(0,WrappedArray(),Right(ConstantNode(SigmaProp(ProveDlog(ECPoint(472963,7c85fd,...))),SSigmaProp)),80,[B@111816258)",
"creationHeight": 130508,
"assets": [],
"additionalRegisters": {},
"transactionId": "2633733a1d81b8fc747d984bdc36fac42cb52118b5057375b081b4c543c62b0e",
"index": 2
}
]
}
Note que os scripts "ergoTree" são desserializados e impressos como árvores de sintaxe abstrata. Este
formato de impressão pode ser regulado por opções adicionais para que os scripts possam ser impressos como
ErgoScript legível por humanos. (Ainda não implementado, mas em algum lugar no roadmap.)
Se excluirmos a opção --dry-run, a transação será enviada e incluída na
blockchain.
$ ./ergo-tool.sh send storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Senha do armazenamento>
Criando provedor... Ok
Carregando caixas não gastas do endereço 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ok
Assinando a transação... Ok
Enviando a transação... Ok
Servidor retornou tx id: "c5710af17f5124a232a5ef731fdf94a493025334c2a7d5a79e9923210972b962"
A nova transação criada será transmitida por toda a blockchain e os mineradores começam
a incluí-la em um novo bloco. Assim que o novo bloco com nossa transação for minerado e
aceito pela rede, nossa transferência é confirmada e podemos ver isso no Explorer.
Podemos também listar as caixas do endereço do destinatário e ver a moeda que criamos entre outras
(enquanto não for gasta pelo destinatário)
$ ./ergo-tool.sh listAddressBoxes 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K
BoxId NanoERGs
252c5ce38fc367001ea48fa6813e6252ebc169288d9b5392c572edb55380b3cd 5000000
6df9dbf08b4859b7e280afbd0822dcf20dba5bf8e3e33b78fe278df6597276f1 2000000
d47f958b201dc7162f641f7eb055e9fa7a9cb65cc24d4447a10f86675fc58328 1000000
e050a3af38241ce444c34eb25c0ab880674fc23a0e63632633ae14f547141c37 1000000
b50ed8c2953fd33b52af816c4caa63ec5b6d236a262a5a192534695c3478da78 1000000
26d6e08027e005270b38e5c5f4a73ffdb6d65a3289efb51ac37f98ad395d887c 10000000000
Notas de Segurança
O ErgoTool foi criado com a segurança em mente e faz o seu melhor para proteger o uso de
informações sensíveis, como frases mnemônicas (que nunca são armazenadas de forma persistente),
senhas (que nunca são exibidas na tela), etc. Além disso, as chaves secretas nunca são
armazenadas no disco local sem criptografia e certamente nunca enviadas a lugar algum.
Conclusão
O ErgoTool é projetado para parecer e funcionar como uma utilidade CLI típica:
- que é fácil de usar e rápida para executar a partir da linha de comando
- pode ser scriptável via scripts de shell
- tem ajuda de uso embutida
Ao mesmo tempo, o ErgoTool é projetado para ser facilmente extensível:
- implementado em linguagem de alto nível Scala
- reutiliza as bibliotecas principais que são usadas no cliente da rede Ergo
- código aberto e totalmente documentado
Este último ponto é especialmente importante, pois muitos novos comandos podem ser facilmente adicionados ao
ErgoTool, graças à sua arquitetura. Se você precisar de um recurso ou comando específico,
por favor, registre um problema ou talvez até mesmo um PR.
A extensibilidade do ErgoTool é o assunto do próximo post planejado no blog, fique atento!
Referências
Share post
13 de agosto de 2025
12 de agosto de 2025
9 de julho de 2025
12 de maio de 2025

7 de abril de 2022

8 de março de 2022


















