Crea tu propia billetera Ergo: gestionando Ergo Coins con ErgoTool
31 de diciembre de 2019

Introducción
ErgoTool es una interfaz de línea de comandos (CLI) para
la blockchain de Ergo. Puedes usar ErgoTool sin ejecutar tu
propio nodo de Ergo. Aunque ejecutar un nodo es la forma más segura de comunicarte con la
red de blockchain de Ergo, ErgoTool, sin embargo, tiene como objetivo proporcionar más
herramientas fundamentales a tu disposición. Por supuesto, aún puedes usarlo con tu propio
nodo en funcionamiento.
En esta publicación, recorreremos pasos simples para generar una frase mnemotécnica, crear un
almacenamiento secreto local y usarlo para enviar ERGs entre direcciones, todo con la ayuda de
los comandos de ErgoTool.
Comenzando
Primero que nada, necesitamos instalar ErgoTool en nuestro sistema desde las fuentes siguiendo las
instrucciones de instalación. En el
directorio donde clonamos ErgoTool hay un script ergo-tool.sh que vamos a usar para
ejecutar comandos. Ejecuta el siguiente comando para verificar que ErgoTool esté instalado
correctamente.
$ ./ergo-tool.sh help
no se especifica el nombre del comando (ejecuta ergo-tool sin argumentos para listar comandos)
Nombre del Comando: help
Sintaxis de Uso: ergo-tool help <commandName>
Descripción: imprime ayuda de uso para un comando
Página de doc: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/HelpCmd.html
Veamos qué obtenemos aquí. ErgoTool muestra el mensaje de error con la información sobre el
comando help. Esta es una salida típica de ErgoTool cuando se especifica uno de los comandos
conocidos, pero se usa incorrectamente. Como podemos aprender del mensaje, el comando help
requiere que especifiquemos un argumento adicional <commandName>. Además, cada comando tiene
una página de documentación API con todos los detalles sobre la ejecución del comando, por lo
que su URL se muestra aquí.
Crear una Nueva Frase Mnemotécnica
Una mnemotécnica es una secuencia aleatoria de caracteres que se utiliza para generar una
clave maestra de acuerdo con la especificación de Billeteras Determinísticas
Jerárquicas. Para
conveniencia, se utiliza una secuencia aleatoria de palabras en inglés, pero esto no es
requerido.
Ejecuta el siguiente comando para generar una nueva frase mnemotécnica:
$ ./ergo-tool.sh mnemonic
pájaro puerto trigo inocente negocio enfermedad ocupado rápido amarillo confianza tiempo aceite entrar situar luna
Escríbelo en un papel y guárdalo en un lugar seguro y secreto.
Como medida de seguridad adicional, puedes crear una contraseña mnemotécnica arbitraria.
En cierto sentido, puede servir como una palabra adicional no vocabular en la mnemotécnica.
La contraseña mnemotécnica es opcional y se utiliza para mayor seguridad.
Si decides usar una contraseña mnemotécnica, también debes anotarla y guardarla en un lugar
secreto y probablemente diferente de la mnemotécnica.
Importante, tanto la frase mnemotécnica como la contraseña mnemotécnica son necesarias para
restaurar las claves secretas, si pierdes alguna de ellas, no podrás regenerar tu clave maestra
nuevamente.
A continuación, usemos la mnemotécnica generada para crear un almacenamiento con una clave secreta maestra.
Crear un Nuevo Almacenamiento Encriptado
Para una mejor seguridad, ErgoTool no requiere ni la frase mnemotécnica ni la contraseña para
realizar la firma de la transacción. En su lugar, se requiere la clave secreta del almacenamiento
encriptado para firmar la transacción de gasto. Podemos generar una clave secreta y almacenarla
en un almacenamiento encriptado usando el comando createStorage.
$ ./ergo-tool.sh help createStorage
Nombre del Comando: createStorage
Sintaxis de Uso: ergo-tool createStorage [<storageDir>="storage"] [<storageFileName>="secret.json"]
Descripción: Crea un archivo de almacenamiento encriptado para la mnemotécnica ingresada por el usuario
Página de doc: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/CreateStorageCmd.html
$ ./ergo-tool.sh createStorage
Ingresa la frase mnemotécnica> pájaro puerto trigo inocente negocio enfermedad ocupado rápido amarillo confianza tiempo aceite entrar situar luna
Contraseña mnemotécnica>
Repetir contraseña mnemotécnica>
Contraseña de almacenamiento>
Repetir contraseña de almacenamiento>
Archivo de Almacenamiento: storage/secret.json
Se genera una clave secreta maestra a partir del par (frase mnemotécnica, contraseña mnemotécnica) y
se guarda encriptada en el archivo storage/secret.json. La mnemotécnica en sí no se almacena en el
archivo y no hay forma de restaurarla desde el archivo, incluso si conoces las contraseñas.
Por favor, ten cuidado de ingresar la contraseña mnemotécnica correcta, la que elegiste y guardaste antes.
Dado que la contraseña mnemotécnica es opcional, puedes dejarla vacía presionando enter.
Si olvidas la contraseña de almacenamiento (también conocida como contraseña de encriptación), no podrás
usar ese archivo de almacenamiento nunca más, sin embargo, siempre puedes restaurar tus claves secretas a
partir del par (frase mnemotécnica, contraseña mnemotécnica) y así crear un nuevo archivo de almacenamiento
con una nueva contraseña.
Mantén tu archivo de almacenamiento y la contraseña de almacenamiento en secreto, cualquiera que obtenga
ambos, tu archivo de almacenamiento y la contraseña de almacenamiento, podrá descifrarlo y acceder a las
claves secretas.
Extracción de Datos del Almacenamiento
El almacenamiento secreto contiene la clave secreta maestra y, como resultado, puede usarse para calcular
tanto la clave pública como la dirección de pago a la clave pública que corresponden a esa clave secreta. El
comando extractStorage hace precisamente eso.
$ ./ergo-tool.sh help extractStorage
Nombre del Comando: extractStorage
Sintaxis de Uso: ergo-tool extractStorage <archivo de almacenamiento> address|masterKey|publicKey|secretKey mainnet|testnet
Descripción: Lee el archivo, lo desbloquea usando la contraseña y extrae la propiedad solicitada del archivo de almacenamiento dado.
Página de doc: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/ExtractStorageCmd.html
$ ./ergo-tool.sh extractStorage storage/secret.json address mainnet
Contraseña de almacenamiento>
9iHiSAg3ko2ZGxR2vhc1Aem3tShqfzEPDAF7XK5cdtbZ3Ut2CCf
Aquí el comando transforma la clave secreta en la clave pública correspondiente y luego crea
la dirección de pago a la clave pública en la mainnet.
De la misma manera, podemos obtener la clave pública, la clave privada y otros datos del almacenamiento.
$ ./ergo-tool.sh extractStorage storage/secret.json secretKey mainnet
Contraseña de almacenamiento>
55dfde63c9b6b4f47683592e85ee997ba2e93507f38ba3f9c82933bcfbc677ca
$ ./ergo-tool.sh extractStorage storage/secret.json publicKey mainnet
Contraseña de almacenamiento>
03f07aecb145a85920bf6e9be80efe5f1cd1a165b45ad3aa8e5c4ca3ba50856bb8
Listando Cajas No Gastadas
ErgoTool tiene el comando especial para listar todas las cajas disponibles (también conocidas como no
gastadas) para una dirección dada.
$ ./ergo-tool.sh listAddressBoxes 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
BoxId NanoERGs
4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119 4987000000
si especificamos la opción --print-json, entonces ErgoTool mostrará todas las cajas en formato json
$ ./ergo-tool.sh listAddressBoxes --print-json 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
[{"boxId":"4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119","value":4987000000,"ergoTree":"0008cd02472963123ce32c057907c7a7268bc09f45d9ca57819d3327b9e7497d7b1cc347","creationHeight":125646,"assets":[],"additionalRegisters":{},"transactionId":"820c688f4b9d709924ba0186ee930a7df374d8852920bc769fc1f1d0b313e5ab","index":2}]
Transferir Monedas
Ahora, con la clave secreta almacenada de forma segura en el archivo de almacenamiento encriptado, podemos
usar ErgoTool para transferir monedas de nuestra dirección a otra dirección de destinatario. El comando para
hacer eso es send.
./ergo-tool.sh help send
Nombre del Comando: send
Sintaxis de Uso: ergo-tool send <storageFile> <recipientAddr> <amountToSend>
Descripción: enviar el <amountToSend> dado a la <recipientAddr> dada usando
el <storageFile> dado para firmar la transacción (solicita la contraseña de almacenamiento)
Página de doc: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/SendCmd.html
El archivo de almacenamiento es necesario para acceder a la clave secreta y generar una firma. La
contraseña de almacenamiento será solicitada por ErgoTool para desbloquear y descifrar el contenido del
archivo. El comando send admite la opción --dry-run que obliga a ErgoTool a crear la
transacción firmada, pero en lugar de enviarla a la blockchain, ErgoTool imprime la
transacción en la consola.
$ ./ergo-tool.sh send --dry-run storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Contraseña de almacenamiento>
Creando probador... Ok
Cargando cajas no gastadas desde la dirección 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ok
Firmando la transacción... 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
}
]
}
Nota que los scripts "ergoTree" son deserializados e impresos como árboles de sintaxis abstracta. Este
formato de impresión puede ser regulado por opciones adicionales para que los scripts puedan ser
imprimidos como ErgoScript legible por humanos. (Aún no implementado, pero en algún lugar de la hoja de ruta.)
Si excluimos la opción --dry-run, la transacción será enviada e incluida en la
blockchain.
$ ./ergo-tool.sh send storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Contraseña de almacenamiento>
Creando probador... Ok
Cargando cajas no gastadas desde la dirección 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ok
Firmando la transacción... Ok
Enviando la transacción... Ok
El servidor devolvió el id de tx: "c5710af17f5124a232a5ef731fdf94a493025334c2a7d5a79e9923210972b962"
La transacción recién creada será transmitida por toda la blockchain y los mineros comenzarán
a incluirla en un nuevo bloque. Una vez que el nuevo bloque con nuestra transacción sea minado y
aceptado por la red, nuestra transferencia está confirmada y podemos verla en Explorer.
También podemos listar las cajas de la dirección del destinatario y ver la moneda que creamos entre otras
(hasta que sea gastada por el destinatario)
$ ./ergo-tool.sh listAddressBoxes 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K
BoxId NanoERGs
252c5ce38fc367001ea48fa6813e6252ebc169288d9b5392c572edb55380b3cd 5000000
6df9dbf08b4859b7e280afbd0822dcf20dba5bf8e3e33b78fe278df6597276f1 2000000
d47f958b201dc7162f641f7eb055e9fa7a9cb65cc24d4447a10f86675fc58328 1000000
e050a3af38241ce444c34eb25c0ab880674fc23a0e63632633ae14f547141c37 1000000
b50ed8c2953fd33b52af816c4caa63ec5b6d236a262a5a192534695c3478da78 1000000
26d6e08027e005270b38e5c5f4a73ffdb6d65a3289efb51ac37f98ad395d887c 10000000000
Notas de Seguridad
ErgoTool se creó con la seguridad en mente y hace todo lo posible para salvaguardar el uso de
información sensible como frases mnemotécnicas (que nunca se almacenan de forma persistente),
contraseñas (que nunca se muestran en la pantalla), etc. Además, las claves secretas nunca
se almacenan en el disco local sin encriptar y, por supuesto, nunca se envían a ninguna parte.
Conclusión
ErgoTool está diseñado para lucir y sentirse como una utilidad CLI típica:
- que es fácil de usar y rápida de ejecutar desde la línea de comandos
- puede ser scriptable a través de scripts de shell
- tiene ayuda de uso incorporada
Al mismo tiempo, ErgoTool está diseñado para ser fácilmente extensible:
- implementado en un lenguaje de alto nivel, Scala
- reutiliza las bibliotecas centrales que se utilizan en el cliente de la red Ergo
- de código abierto y completamente documentado
Este último punto es especialmente importante, ya que muchos nuevos comandos pueden ser fácilmente
agregados a ErgoTool, gracias a su arquitectura. Si necesitas una función o un comando específico,
por favor presenta un problema o tal vez incluso un PR.
La extensibilidad de ErgoTool es el tema de la próxima publicación de blog planificada, ¡mantente atento!
Referencias
Share post
13 de agosto de 2025
12 de agosto de 2025
9 de julio de 2025
12 de mayo de 2025

9 de febrero de 2022

8 de febrero de 2022

5 de febrero de 2022

1 de febrero de 2022

27 de enero de 2022

20 de enero de 2022

18 de enero de 2022

6 de enero de 2022

4 de enero de 2022

30 de diciembre de 2021

28 de diciembre de 2021

23 de diciembre de 2021








