Vytvorte si vlastnú Ergo peňaženku: Správa Ergo mincí s ErgoTool
31. decembra 2019

Úvod
ErgoTool je príkazový riadok (CLI) pre
Ergo blockchain. Môžete používať ErgoTool bez spustenia vlastného
Ergo uzla. Aj keď spustenie uzla je najbezpečnejší spôsob komunikácie s
Ergo blockchain sieťou, ErgoTool sa snaží poskytnúť viac základných nástrojov k
dispozícii. Určite ho môžete používať aj so svojím vlastným bežiacim uzlom.
V tomto príspevku prejdeme jednoduchými krokmi na generovanie mnemotechnickej frázy, vytvorenie
lokálneho tajného úložiska a jeho použitie na posielanie ERG medzi adresami, všetko s pomocou
príkazov ErgoTool.
Začiatok
Najprv musíme nainštalovať ErgoTool na našom systéme zo zdrojov podľa
inštrukcií na inštaláciu. V
direktóriu, kde sme klonovali ErgoTool, je skript ergo-tool.sh, ktorý budeme používať
na spúšťanie príkazov. Spustite nasledujúci príkaz, aby ste skontrolovali, či je ErgoTool
nainštalovaný správne.
$ ./ergo-tool.sh help
command name is not specified (run ergo-tool without arguments to list commands)
Command Name: help
Usage Syntax: ergo-tool help <commandName>
Description: prints usage help for a command
Doc page: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/HelpCmd.html
Pozrime sa, čo tu dostaneme. ErgoTool vypisuje chybové hlásenie s informáciami o
help príkaze. Toto je typický výstup ErgoTool, keď je zadaný jeden z
známych príkazov, ale je použitý nesprávne. Ako sa môžeme dozvedieť z hlásenia, príkaz
help vyžaduje, aby sme špecifikovali ďalší argument <commandName>. Taktiež každý príkaz má
API dokumentačnú stránku so všetkými podrobnosťami o vykonávaní príkazu, takže jeho URL je tu
zobrazené.
Vytvorte novú mnemotechnickú frázu
Mnemotechnická fráza je náhodná sekvencia znakov, ktorá sa používa na generovanie hlavného kľúča
podľa špecifikácie Hierarchical Deterministic
Wallets.
Pre pohodlie sa používa náhodná sekvencia anglických slov, ale to nie je povinné.
Spustite nasledujúci príkaz na generovanie novej mnemotechnickej frázy:
$ ./ergo-tool.sh mnemonic
bird harbor wheat innocent business disease busy quick yellow trust time oil enter situate moon
Zapíšte si to na papier a uchovajte na bezpečnom a tajnom mieste.
Ako dodatočné bezpečnostné opatrenie môžete vytvoriť ľubovoľné mnemotechnické heslo.
V istom zmysle môže slúžiť ako dodatočné slovo, ktoré nie je v slovníku, v mnemotechnickej fráze.
Mnemotechnické heslo je voliteľné a používa sa na dodatočné zabezpečenie.
Ak sa rozhodnete použiť mnemotechnické heslo, mali by ste si ho tiež zapísať a uchovať na tajnom a
pravdepodobne inom mieste ako mnemotechnickú frázu.
Dôležité, obidve mnemotechnické frázy a mnemotechnické heslo sú potrebné na obnovenie tajných kľúčov,
ak ak ich stratíte, nebudete schopní regenerovať svoj hlavný kľúč.
Ďalej použijeme vygenerovanú mnemotechnickú frázu na vytvorenie úložiska s hlavným tajným kľúčom.
Vytvorte nové šifrované úložisko
Pre lepšiu bezpečnosť ErgoTool nevyžaduje ani mnemotechnickú frázu, ani heslo na
vykonanie podpisovania transakcie. Namiesto toho je potrebný tajný kľúč z šifrovaného úložiska na
podpisovanie transakcie. Môžeme vygenerovať tajný kľúč a uložiť ho do šifrovaného úložiska pomocou
príkazu createStorage.
$ ./ergo-tool.sh help createStorage
Command Name: createStorage
Usage Syntax: ergo-tool createStorage [<storageDir>="storage"] [<storageFileName>="secret.json"]
Description: Creates an encrypted storage file for the mnemonic entered by the user
Doc page: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/CreateStorageCmd.html
$ ./ergo-tool.sh createStorage
Enter mnemonic phrase> bird harbor wheat innocent business disease busy quick yellow trust time oil enter situate moon
Mnemonic password>
Repeat mnemonic password>
Storage password>
Repeat storage password>
Storage File: storage/secret.json
Hlavný tajný kľúč je generovaný z páru (mnemotechnická fráza, mnemotechnické heslo) a
uložený šifrovaný v súbore storage/secret.json. Mnemotechnická fráza sama nie je uložená v
súbore a nie je možné ju obnoviť zo súboru, aj keď poznáte heslá.
Prosím, dbajte na to, aby ste zadali správne mnemotechnické heslo, to, ktoré ste si vybrali a uložili predtým.
Keďže mnemotechnické heslo je voliteľné, môžete ho nechať prázdne stlačením enter.
Ak zabudnete heslo úložiska (t.j. heslo na šifrovanie), nebudete môcť používať
ten súbor úložiska, avšak vždy môžete obnoviť svoje tajné kľúče z páru (mnemotechnická
fráza, mnemotechnické heslo) a tak vytvoriť nový súbor úložiska s novým heslom.
Uchovávajte svoj súbor úložiska a heslo úložiska v tajnosti, každý, kto získa oba vaše súbory úložiska
a heslo úložiska, bude schopný dešifrovať ho a získať tajné kľúče.
Extrakcia údajov z úložiska
Tajné úložisko obsahuje hlavný tajný kľúč a ako výsledok môže byť použité na výpočet
ako verejného kľúča, tak aj adresy pay-to-public-key, ktorá zodpovedá tomuto tajnému kľúču. Príkaz
extractStorage robí presne to.
$ ./ergo-tool.sh help extractStorage
Command Name: extractStorage
Usage Syntax: ergo-tool extractStorage <storage file> address|masterKey|publicKey|secretKey mainnet|testnet
Description: Reads the file, unlocks it using password and extract the requested property from the given storage file.
Doc page: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/ExtractStorageCmd.html
$ ./ergo-tool.sh extractStorage storage/secret.json address mainnet
Storage password>
9iHiSAg3ko2ZGxR2vhc1Aem3tShqfzEPDAF7XK5cdtbZ3Ut2CCf
Tu príkaz transformuje tajný kľúč na zodpovedajúci verejný kľúč a potom vytvára
adresu pay-to-public-key na mainnete.
Rovnakým spôsobom môžeme získať verejný kľúč, súkromný kľúč a ďalšie údaje z úložiska.
$ ./ergo-tool.sh extractStorage storage/secret.json secretKey mainnet
Storage password>
55dfde63c9b6b4f47683592e85ee997ba2e93507f38ba3f9c82933bcfbc677ca
$ ./ergo-tool.sh extractStorage storage/secret.json publicKey mainnet
Storage password>
03f07aecb145a85920bf6e9be80efe5f1cd1a165b45ad3aa8e5c4ca3ba50856bb8
Zoznam nevyčerpaných boxov
ErgoTool má špeciálny príkaz na zoznam všetkých dostupných (t.j. nevyčerpaných) boxov pre danú adresu.
$ ./ergo-tool.sh listAddressBoxes 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
BoxId NanoERGs
4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119 4987000000
ak špecifikujeme možnosť --print-json, ErgoTool vypíše všetky boxy vo formáte json
$ ./ergo-tool.sh listAddressBoxes --print-json 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
[{"boxId":"4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119","value":4987000000,"ergoTree":"0008cd02472963123ce32c057907c7a7268bc09f45d9ca57819d3327b9e7497d7b1cc347","creationHeight":125646,"assets":[],"additionalRegisters":{},"transactionId":"820c688f4b9d709924ba0186ee930a7df374d8852920bc769fc1f1d0b313e5ab","index":2}]
Prenos mincí
Teraz, keď je tajný kľúč bezpečne uložený v šifrovanom súbore úložiska, môžeme použiť ErgoTool na
prenos mincí z našej adresy na inú adresu príjemcu. Príkaz na to je
send.
./ergo-tool.sh help send
Command Name: send
Usage Syntax: ergo-tool send <storageFile> <recipientAddr> <amountToSend>
Description: send the given <amountToSend> to the given <recipientAddr> using
the given <storageFile> to sign transaction (requests storage password)
Doc page: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/SendCmd.html
Súbor úložiska je potrebný na prístup k tajnému kľúču a generovanie podpisu. Heslo úložiska bude
požadované ErgoTool na odomknutie a dešifrovanie obsahu súboru.
Príkaz send podporuje možnosť --dry-run, ktorá núti ErgoTool vytvoriť
podpísanú transakciu, ale namiesto jej odoslania do blockchainu, ErgoTool vytlačí
transakciu na konzolu.
$ ./ergo-tool.sh send --dry-run storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Storage password>
Creating prover... Ok
Loading unspent boxes from at address 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ok
Signing the transaction... 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
}
]
}
Všimnite si, že skripty "ergoTree" sú deserializované a vytlačené ako abstraktné syntaktické stromy. Tento
formát tlače môže byť regulovaný dodatočnými možnosťami, aby sa skripty mohli tlačiť ako
čitateľný ErgoScript. (Ešte nie je implementované, ale niekde na pláne.)
Ak vylúčime možnosť --dry-run, transakcia bude odoslaná a zahrnutá do
blockchainu.
$ ./ergo-tool.sh send storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Storage password>
Creating prover... Ok
Loading unspent boxes from at address 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ok
Signing the transaction... Ok
Sendng the transaction... Ok
Server returned tx id: "c5710af17f5124a232a5ef731fdf94a493025334c2a7d5a79e9923210972b962"
Novovytvorená transakcia bude vysielaná po celom blockchain a baníci začnú
zahrňovať ju do nového bloku. Akonáhle je nový blok s našou transakciou vyťažený a
prijatý sieťou, náš prenos je potvrdený a môžeme vidieť ho v Exploreri.
Môžeme tiež zoznam boxov adresy príjemcu a vidieť mincu, ktorú sme vytvorili medzi ostatnými
(až kým ju príjemca nevyužije)
$ ./ergo-tool.sh listAddressBoxes 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K
BoxId NanoERGs
252c5ce38fc367001ea48fa6813e6252ebc169288d9b5392c572edb55380b3cd 5000000
6df9dbf08b4859b7e280afbd0822dcf20dba5bf8e3e33b78fe278df6597276f1 2000000
d47f958b201dc7162f641f7eb055e9fa7a9cb65cc24d4447a10f86675fc58328 1000000
e050a3af38241ce444c34eb25c0ab880674fc23a0e63632633ae14f547141c37 1000000
b50ed8c2953fd33b52af816c4caa63ec5b6d236a262a5a192534695c3478da78 1000000
26d6e08027e005270b38e5c5f4a73ffdb6d65a3289efb51ac37f98ad395d887c 10000000000
Bezpečnostné poznámky
ErgoTool je vytvorený s ohľadom na bezpečnosť a snaží sa čo najlepšie chrániť používanie
citlivých informácií, ako sú mnemotechnické frázy (ktoré sa nikdy neukladajú trvalo),
heslá (ktoré sa nikdy nezobrazujú na obrazovke) atď. Okrem toho sa tajné kľúče nikdy
neukladajú na lokálny disk nešifrované a určite sa nikdy nikam neposielajú.
Záver
ErgoTool je navrhnutý tak, aby vyzeral a pôsobil ako typická CLI utilita:
- ktorá je jednoduchá na použitie a rýchla na spustenie z príkazového riadku
- môže byť skriptovateľná prostredníctvom shell skriptov
- má zabudovanú pomoc pri používaní
Zároveň je ErgoTool navrhnutý tak, aby bol ľahko rozšíriteľný:
- implementovaný v jazyku Scala na vysokej úrovni
- znovu používa základné knižnice, ktoré sa používajú v Ergo sieťovom klientovi
- open-sourced a plne zdokumentovaný
Tento posledný bod je obzvlášť dôležitý, pretože mnohé nové príkazy môžu byť ľahko pridané do
ErgoTool, vďaka jeho architektúre. Ak potrebujete konkrétnu funkciu alebo príkaz,
prosím, podajte problém alebo možno aj PR.
Rozšíriteľnosť ErgoTool je predmetom nasledujúceho plánovaného blogového príspevku, sledujte nás!
Odkazy
Share post
9. júla 2025







