Készítsd el saját Ergo pénztárcádat: Ergo érmék kezelése az ErgoTool-lal
2019. december 31.

Bevezetés
ErgoTool egy parancssori felület (CLI) az
Ergo blokklánc számára. Az ErgoTool-t használhatod anélkül, hogy saját
Ergo csomópontot futtatnál. Bár a csomópont futtatása a legbiztonságosabb módja a kommunikációnak az
Ergo blokklánc hálózattal, az ErgoTool célja, hogy több alapvető eszközt biztosítson a rendelkezésedre.
Természetesen, használhatod a saját futó csomópontoddal is.
Ebben a bejegyzésben egyszerű lépéseken keresztül fogunk végigmenni, hogy generáljunk egy mnemonikus
kifejezést, létrehozzunk egy helyi titkos tárolót, és használjuk azt ERG-k küldésére címek között,
mind ezt az ErgoTool parancsainak segítségével.
Kezdés
Először is telepítenünk kell az ErgoTool-t a rendszerünkre a forrásokból, a
telepítési utasítások követésével. Az
érdeklődési könyvtárban, ahol klónoztuk az ErgoTool-t, található egy ergo-tool.sh szkript, amelyet
használni fogunk a parancsok futtatásához. Futtasd az alábbi parancsot, hogy ellenőrizd, az ErgoTool
helyesen van telepítve.
$ ./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
Nézzük meg, mit kapunk itt. Az ErgoTool hibaüzenetet ad ki a help parancsról. Ez egy tipikus
kimenet az ErgoTool-ból, amikor az egyik ismert parancsot megadjuk, de azt helytelenül használjuk.
Ahogy a üzenetből megtudhatjuk, a help parancs megköveteli, hogy megadjuk a további <commandName>
argumentumot. Ezenkívül minden parancsnak van egy API dokumentációs oldala, amely tartalmazza a parancs
végrehajtásának minden részletét, így az URL itt van megjelenítve.
Új Mnemonikus Kifejezés Létrehozása
A mnemonikus egy véletlenszerű karakterekből álló sorozat, amelyet egy mesterkulcs generálására használnak
az Hierarchikus Determinisztikus
Pénztárcák specifikáció szerint.
Kényelmi okokból véletlenszerű angol szavak sorozatát használják, de ez nem kötelező.
Futtasd az alábbi parancsot egy új mnemonikus kifejezés generálásához:
$ ./ergo-tool.sh mnemonic
bird harbor wheat innocent business disease busy quick yellow trust time oil enter situate moon
Írd le papírra, és tartsd biztonságos és titkos helyen.
További biztonsági intézkedésként létrehozhatsz egy tetszőleges mnemonikus jelszót.
Bizonyos értelemben ez szolgálhat egy további nem szótári szónak a mnemonikusban.
A mnemonikus jelszó opcionális, és további biztonságra szolgál.
Ha úgy döntesz, hogy használod a mnemonikus jelszót, azt is le kell írnod, és titkos helyen
kell tartanod, valószínűleg eltérő helyen a mnemonikustól.
Fontos, hogy mind a mnemonikus kifejezés, mind a mnemonikus jelszó szükséges a titkos kulcsok
visszaállításához, ha bármelyiket elveszíted, akkor nem tudod újragenerálni a mesterkulcsodat.
Most használjuk a generált mnemonikust egy tároló létrehozásához egy mester titkos kulccsal.
Új Titkosított Tároló Létrehozása
A jobb biztonság érdekében az ErgoTool nem követeli meg sem a mnemonikus kifejezést, sem a jelszót a
tranzakció aláírásához. Ehelyett a titkos kulcsra van szükség a titkosított tárolóból a kiadási tranzakció
aláírásához. Generálhatunk egy titkos kulcsot, és tárolhatjuk azt egy titkosított tárolóban a
createStorage parancs használatával.
$ ./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
Egy mester titkos kulcs generálódik a (mnemonikus kifejezés, mnemonikus jelszó) párból, és
titkosítva mentésre kerül a storage/secret.json fájlba. A mnemonikus magát nem tárolják a
fájlban, és nincs mód arra, hogy visszaállítsuk a fájlból, még akkor sem, ha ismered a jelszavakat.
Kérlek, ügyelj arra, hogy a helyes mnemonikus jelszót add meg, azt, amelyet korábban választottál és
mentettél. Mivel a mnemonikus jelszó opcionális, üresen is hagyhatod az enter megnyomásával.
Ha elfelejted a tároló jelszót (más néven titkosítási jelszót), akkor nem tudod többé használni
azt a tárolófájlt, azonban mindig visszaállíthatod a titkos kulcsaidat a (mnemonikus
kifejezés, mnemonikus jelszó) párból, és így létrehozhatsz egy új tárolófájlt egy új jelszóval.
Tartsd titokban a tárolófájlodat és a tároló jelszavadat, bárki, aki megszerzi mind a tárolófájlodat,
mind a tároló jelszavadat, képes lesz dekódolni azt és hozzáférni a titkos kulcsokhoz.
Adatok Kinyerése a Tárolóból
A titkos tároló tartalmazza a mester titkos kulcsot, és ennek eredményeként felhasználható mind a
nyilvános kulcs, mind a pay-to-public-key cím kiszámítására, amely megfelel annak a titkos kulcsnak. Az
extractStorage parancs pontosan ezt végzi.
$ ./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
Itt a parancs átalakítja a titkos kulcsot a megfelelő nyilvános kulccsá, majd létrehozza a
pay-to-public-key címet a mainnet-en.
Ugyanígy nyerhetjük ki a nyilvános kulcsot, a privát kulcsot és egyéb adatokat a tárolóból.
$ ./ergo-tool.sh extractStorage storage/secret.json secretKey mainnet
Storage password>
55dfde63c9b6b4f47683592e85ee997ba2e93507f38ba3f9c82933bcfbc677ca
$ ./ergo-tool.sh extractStorage storage/secret.json publicKey mainnet
Storage password>
03f07aecb145a85920bf6e9be80efe5f1cd1a165b45ad3aa8e5c4ca3ba50856bb8
Kiadatlan Boxok Listázása
Az ErgoTool rendelkezik egy külön parancsal, amely felsorolja az összes elérhető (azaz kiadatlan)
boxot egy adott címhez.
$ ./ergo-tool.sh listAddressBoxes 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
BoxId NanoERGs
4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119 4987000000
Ha megadjuk a --print-json opciót, akkor az ErgoTool az összes boxot JSON formátumban
kiadja.
$ ./ergo-tool.sh listAddressBoxes --print-json 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
[{"boxId":"4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119","value":4987000000,"ergoTree":"0008cd02472963123ce32c057907c7a7268bc09f45d9ca57819d3327b9e7497d7b1cc347","creationHeight":125646,"assets":[],"additionalRegisters":{},"transactionId":"820c688f4b9d709924ba0186ee930a7df374d8852920bc769fc1f1d0b313e5ab","index":2}]
Érmék Átutalása
Most, hogy a titkos kulcs biztonságosan van tárolva a titkosított tárolófájlban, használhatjuk az
ErgoTool-t, hogy érméket utaljunk át a címünkről egy másik címzett címére. A parancs erre a
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
A tárolófájl szükséges a titkos kulcs eléréséhez és az aláírás generálásához. Az ErgoTool a tároló
jelszót fogja kérni a fájl tartalmának feloldásához és dekódolásához.
A send parancs támogatja a --dry-run opciót, amely arra kényszeríti az ErgoTool-t, hogy létrehozza a
aláírt tranzakciót, de ahelyett, hogy azt a blokkláncra küldené, az ErgoTool a konzolon
kiírja a tranzakciót.
$ ./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
}
]
}
Figyelj arra, hogy az "ergoTree" szkriptek deszerializálva és absztrakt szintaxis fákként
kiírásra kerülnek. Ez a kiírási formátum további opciókkal szabályozható, így a szkriptek
emberi olvasható ErgoScript-ként is kiírhatók. (Még nem implementálva, de valahol a
tervben van.)
Ha kizárjuk a --dry-run opciót, a tranzakciót elküldik és beillesztik a
blokkláncba.
$ ./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"
Az újonnan létrehozott tranzakciót széles körben el fogják sugározni a blokkláncon, és a bányászok
kezdik beilleszteni egy új blokkba. Amint az új blokk a tranzakciónkkal ki van bányászva és
elfogadva a hálózat által, az átutalásunk megerősítést nyer, és megnézhetjük az Explorerben.
A címzett címének boxait is listázhatjuk, és láthatjuk az általunk létrehozott érmét mások között
(amíg azt a címzett el nem költi)
$ ./ergo-tool.sh listAddressBoxes 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K
BoxId NanoERGs
252c5ce38fc367001ea48fa6813e6252ebc169288d9b5392c572edb55380b3cd 5000000
6df9dbf08b4859b7e280afbd0822dcf20dba5bf8e3e33b78fe278df6597276f1 2000000
d47f958b201dc7162f641f7eb055e9fa7a9cb65cc24d4447a10f86675fc58328 1000000
e050a3af38241ce444c34eb25c0ab880674fc23a0e63632633ae14f547141c37 1000000
b50ed8c2953fd33b52af816c4caa63ec5b6d236a262a5a192534695c3478da78 1000000
26d6e08027e005270b38e5c5f4a73ffdb6d65a3289efb51ac37f98ad395d887c 10000000000
Biztonsági Megjegyzések
Az ErgoTool-t a biztonság szem előtt tartásával hozták létre, és mindent megtesz a
érzékeny információk, például a mnemonikus kifejezések (amelyeket soha nem tárolnak tartósan),
jelszavak (amelyeket soha nem mutatnak a képernyőn) stb. védelme érdekében. Ezenkívül a titkos
kulcsok soha nem tárolódnak helyi lemezen titkosítatlanul, és biztosan soha nem küldik el sehová.
Következtetés
Az ErgoTool-t úgy tervezték, hogy úgy nézzen ki és érezze magát, mint egy tipikus CLI segédprogram:
- amely könnyen használható és gyorsan futtatható a parancssorból
- shell szkriptek segítségével scriptelhető
- beépített használati segítséggel rendelkezik
Ugyanakkor az ErgoTool-t úgy tervezték, hogy könnyen bővíthető legyen:
- magas szintű Scala nyelven implementálva
- újrahasználja az Ergo hálózati kliensben használt alapkönyvtárakat
- nyílt forráskódú és teljesen dokumentált
Ez az utolsó pont különösen fontos, mivel sok új parancs könnyen hozzáadható az
ErgoTool-hoz, köszönhetően az architektúrájának. Ha szükséged van egy konkrét funkcióra vagy
parancsra, kérlek, nyújts be egy problémát, vagy talán még egy PR-t is.
Az ErgoTool bővíthetősége a következő tervezett blogbejegyzés témája, tartsd szem előtt!
Hivatkozások
Share post
2025. augusztus 13.
2025. augusztus 12.
2025. július 9.
2025. május 12.






