Stwórz własny portfel Ergo: Zarządzanie monetami Ergo za pomocą ErgoTool
31 grudnia 2019

Wprowadzenie
ErgoTool to interfejs wiersza poleceń (CLI) dla
blokchaina Ergo. Możesz używać ErgoTool bez uruchamiania własnego węzła Ergo. Chociaż uruchomienie węzła jest najbezpieczniejszym sposobem komunikacji z siecią blokchaina Ergo, ErgoTool ma na celu dostarczenie bardziej podstawowych narzędzi do twojej dyspozycji. Oczywiście, nadal możesz go używać z własnym działającym węzłem.
W tym poście przeprowadzimy przez proste kroki, aby wygenerować frazę mnemoniczna, stworzyć lokalne tajne przechowywanie i użyć go do wysyłania ERG-ów między adresami, wszystko z pomocą poleceń ErgoTool.
Rozpoczęcie
Przede wszystkim musimy zainstalować ErgoTool na naszym systemie z źródeł, postępując zgodnie z
instrukcjami instalacji. W katalogu, w którym sklonowaliśmy ErgoTool, znajduje się skrypt ergo-tool.sh, którego zamierzamy użyć do uruchamiania poleceń. Uruchom następujące polecenie, aby sprawdzić, czy ErgoTool jest poprawnie zainstalowany.
$ ./ergo-tool.sh help
nie podano nazwy polecenia (uruchom ergo-tool bez argumentów, aby wyświetlić listę poleceń)
Nazwa polecenia: help
Składnia użycia: ergo-tool help <commandName>
Opis: drukuje pomoc w użyciu dla polecenia
Strona dokumentacji: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/HelpCmd.html
Zobaczmy, co tutaj mamy. ErgoTool wyświetla komunikat o błędzie z informacjami o poleceniu help. To typowe wyjście ErgoTool, gdy jedno z znanych poleceń jest określone, ale jest używane niepoprawnie. Jak możemy się dowiedzieć z komunikatu, polecenie help wymaga od nas podania dodatkowego argumentu <commandName>. Ponadto każde polecenie ma stronę dokumentacji API z wszystkimi szczegółami dotyczącymi wykonania polecenia, więc jego adres URL jest tutaj pokazany.
Utwórz nową frazę mnemoniczna
Fraza mnemoniczna to losowa sekwencja znaków, która jest używana do generowania klucza głównego zgodnie z
specyfikacją Hierarchical Deterministic Wallets.
Dla wygody używa się losowej sekwencji angielskich słów, ale nie jest to wymagane.
Uruchom następujące polecenie, aby wygenerować nową frazę mnemoniczna:
$ ./ergo-tool.sh mnemonic
bird harbor wheat innocent business disease busy quick yellow trust time oil enter situate moon
Zapisz ją na papierze i przechowuj w bezpiecznym i tajnym miejscu.
Jako dodatkowy środek bezpieczeństwa możesz stworzyć dowolne hasło mnemoniczne.
W pewnym sensie może ono służyć jako dodatkowe słowo nie-w słowniku w mnemonice.
Hasło mnemoniczne jest opcjonalne i służy do dodatkowego zabezpieczenia.
Jeśli zdecydujesz się użyć hasła mnemonicznego, powinieneś również je zapisać i przechowywać w tajnym i
prawdopodobnie innym miejscu niż fraza mnemoniczna.
Ważne, zarówno fraza mnemoniczna, jak i hasło mnemoniczne są wymagane do przywrócenia tajnych kluczy,
jeśli zgubisz którykolwiek z nich, nie będziesz w stanie ponownie wygenerować swojego klucza głównego.
Następnie użyjmy wygenerowanej frazy mnemonicznej do stworzenia przechowywania z kluczem tajnym.
Utwórz nowe zaszyfrowane przechowywanie
Dla lepszego bezpieczeństwa ErgoTool nie wymaga ani frazy mnemonicznej, ani hasła do
podpisania transakcji. Zamiast tego, klucz tajny z zaszyfrowanego przechowywania jest
wymagany do podpisania transakcji wydania. Możemy wygenerować klucz tajny i przechować go w
zaszyfrowanym przechowywaniu, używając polecenia createStorage.
$ ./ergo-tool.sh help createStorage
Nazwa polecenia: createStorage
Składnia użycia: ergo-tool createStorage [<storageDir>="storage"] [<storageFileName>="secret.json"]
Opis: Tworzy zaszyfrowany plik przechowywania dla frazy mnemonicznej wprowadzonej przez użytkownika
Strona dokumentacji: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/CreateStorageCmd.html
$ ./ergo-tool.sh createStorage
Wprowadź frazę mnemoniczną> bird harbor wheat innocent business disease busy quick yellow trust time oil enter situate moon
Hasło mnemoniczne>
Powtórz hasło mnemoniczne>
Hasło przechowywania>
Powtórz hasło przechowywania>
Plik przechowywania: storage/secret.json
Klucz tajny główny jest generowany z pary (fraza mnemoniczna, hasło mnemoniczne) i
zapisany w zaszyfrowanym pliku storage/secret.json. Sama fraza mnemoniczna nie jest przechowywana w pliku i nie ma możliwości jej przywrócenia z pliku, nawet jeśli znasz hasła.
Proszę zadbać o wprowadzenie poprawnego hasła mnemonicznego, tego, które wybrałeś i zapisałeś wcześniej.
Ponieważ hasło mnemoniczne jest opcjonalne, możesz je pozostawić puste, naciskając enter.
Jeśli zapomnisz hasła przechowywania (tzw. hasła szyfrowania), nie będziesz mógł już używać
tego pliku przechowywania, jednak zawsze możesz przywrócić swoje tajne klucze z pary (fraza
mnemoniczna, hasło mnemoniczne) i w ten sposób stworzyć nowy plik przechowywania z nowym hasłem.
Przechowuj swój plik przechowywania i hasło przechowywania w tajemnicy, każdy, kto zdobędzie zarówno twój plik przechowywania, jak i hasło przechowywania, będzie mógł go odszyfrować i uzyskać dostęp do tajnych kluczy.
Ekstrakcja danych z przechowywania
Tajne przechowywanie zawiera klucz tajny główny i w rezultacie może być używane do obliczenia zarówno
klucza publicznego, jak i adresu pay-to-public-key, który odpowiada temu kluczowi tajnemu. Polecenie extractStorage robi dokładnie to.
$ ./ergo-tool.sh help extractStorage
Nazwa polecenia: extractStorage
Składnia użycia: ergo-tool extractStorage <plik przechowywania> address|masterKey|publicKey|secretKey mainnet|testnet
Opis: Odczytuje plik, odblokowuje go za pomocą hasła i ekstraktuje żądany atrybut z podanego pliku przechowywania.
Strona dokumentacji: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/ExtractStorageCmd.html
$ ./ergo-tool.sh extractStorage storage/secret.json address mainnet
Hasło przechowywania>
9iHiSAg3ko2ZGxR2vhc1Aem3tShqfzEPDAF7XK5cdtbZ3Ut2CCf
Tutaj polecenie przekształca klucz tajny w odpowiadający mu klucz publiczny, a następnie tworzy
adres pay-to-public-key w sieci głównej.
W ten sam sposób możemy uzyskać klucz publiczny, klucz prywatny i inne dane z przechowywania.
$ ./ergo-tool.sh extractStorage storage/secret.json secretKey mainnet
Hasło przechowywania>
55dfde63c9b6b4f47683592e85ee997ba2e93507f38ba3f9c82933bcfbc677ca
$ ./ergo-tool.sh extractStorage storage/secret.json publicKey mainnet
Hasło przechowywania>
03f07aecb145a85920bf6e9be80efe5f1cd1a165b45ad3aa8e5c4ca3ba50856bb8
Wyświetlanie niewydanych skrzynek
ErgoTool ma specjalne polecenie do wyświetlania wszystkich dostępnych (tzw. niewydanych) skrzynek dla danego adresu.
$ ./ergo-tool.sh listAddressBoxes 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
BoxId NanoERGs
4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119 4987000000
jeśli określimy opcję --print-json, ErgoTool wyświetli wszystkie skrzynki w formacie json
$ ./ergo-tool.sh listAddressBoxes --print-json 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
[{"boxId":"4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119","value":4987000000,"ergoTree":"0008cd02472963123ce32c057907c7a7268bc09f45d9ca57819d3327b9e7497d7b1cc347","creationHeight":125646,"assets":[],"additionalRegisters":{},"transactionId":"820c688f4b9d709924ba0186ee930a7df374d8852920bc769fc1f1d0b313e5ab","index":2}]
Przesyłanie monet
Teraz, gdy klucz tajny jest bezpiecznie przechowywany w zaszyfrowanym pliku przechowywania, możemy użyć ErgoTool do
przesyłania monet z naszego adresu do innego adresu odbiorcy. Polecenie do tego to
send.
./ergo-tool.sh help send
Nazwa polecenia: send
Składnia użycia: ergo-tool send <storageFile> <recipientAddr> <amountToSend>
Opis: przesyła podaną <amountToSend> do podanego <recipientAddr> używając
podanego <storageFile> do podpisania transakcji (wymaga hasła przechowywania)
Strona dokumentacji: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/SendCmd.html
Plik przechowywania jest niezbędny, aby uzyskać dostęp do klucza tajnego i wygenerować podpis. Hasło przechowywania będzie wymagane przez ErgoTool do odblokowania i odszyfrowania zawartości pliku.
Polecenie send obsługuje opcję --dry-run, która zmusza ErgoTool do stworzenia
podpisanej transakcji, ale zamiast wysyłania jej do blokchaina, ErgoTool wyświetla
transakcję na konsoli.
$ ./ergo-tool.sh send --dry-run storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Hasło przechowywania>
Tworzenie dowodu... Ok
Ładowanie niewydanych skrzynek z adresu 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ok
Podpisywanie transakcji... 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
}
]
}
Zauważ, że skrypty "ergoTree" są deserializowane i drukowane jako drzewa składniowe. Ten
format drukowania można regulować za pomocą dodatkowych opcji, aby skrypty mogły być drukowane jako
czytelny dla ludzi ErgoScript. (Jeszcze nie zaimplementowane, ale gdzieś na liście zadań.)
Jeśli wykluczymy opcję --dry-run, transakcja zostanie wysłana i uwzględniona w
blokchainie.
$ ./ergo-tool.sh send storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Hasło przechowywania>
Tworzenie dowodu... Ok
Ładowanie niewydanych skrzynek z adresu 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ok
Podpisywanie transakcji... Ok
Wysyłanie transakcji... Ok
Serwer zwrócił id transakcji: "c5710af17f5124a232a5ef731fdf94a493025334c2a7d5a79e9923210972b962"
Nowo utworzona transakcja zostanie rozesłana po całym blokchainie, a górnicy rozpoczną
uwzględnianie jej w nowym bloku. Gdy nowy blok z naszą transakcją zostanie wydobyty i
zaakceptowany przez sieć, nasz transfer jest potwierdzony i możemy zobaczyć go w Explorerze.
Możemy również wyświetlić skrzynki adresu odbiorcy i zobaczyć monetę, którą stworzyliśmy wśród innych
(dopóki nie zostanie wydana przez odbiorcę)
$ ./ergo-tool.sh listAddressBoxes 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K
BoxId NanoERGs
252c5ce38fc367001ea48fa6813e6252ebc169288d9b5392c572edb55380b3cd 5000000
6df9dbf08b4859b7e280afbd0822dcf20dba5bf8e3e33b78fe278df6597276f1 2000000
d47f958b201dc7162f641f7eb055e9fa7a9cb65cc24d4447a10f86675fc58328 1000000
e050a3af38241ce444c34eb25c0ab880674fc23a0e63632633ae14f547141c37 1000000
b50ed8c2953fd33b52af816c4caa63ec5b6d236a262a5a192534695c3478da78 1000000
26d6e08027e005270b38e5c5f4a73ffdb6d65a3289efb51ac37f98ad395d887c 10000000000
Uwagi dotyczące bezpieczeństwa
ErgoTool został stworzony z myślą o bezpieczeństwie i stara się jak najlepiej chronić użycie
wrażliwych informacji, takich jak frazy mnemoniczne (które nigdy nie są przechowywane trwale),
hasła (które nigdy nie są wyświetlane na ekranie) itp. Dodatkowo, tajne klucze nigdy nie są
przechowywane na lokalnym dysku w postaci niezaszyfrowanej i z pewnością nigdy nie są wysyłane nigdzie.
Podsumowanie
ErgoTool jest zaprojektowany tak, aby wyglądał i działał jak typowe narzędzie CLI:
- które jest łatwe w użyciu i szybko uruchamiane z wiersza poleceń
- może być skryptowalne za pomocą skryptów powłoki
- ma wbudowaną pomoc w użyciu
Jednocześnie ErgoTool jest zaprojektowany tak, aby był łatwo rozszerzalny:
- zaimplementowany w języku wysokiego poziomu Scala
- ponownie wykorzystuje podstawowe biblioteki, które są używane w kliencie sieci Ergo
- jest otwartoźródłowy i w pełni udokumentowany
Ten ostatni punkt jest szczególnie ważny, ponieważ wiele nowych poleceń można łatwo dodać do
ErgoTool, dzięki jego architekturze. Jeśli potrzebujesz konkretnej funkcji lub polecenia,
proszę zgłoś problem lub może nawet PR.
Rozszerzalność ErgoTool jest tematem następnego planowanego wpisu na blogu, bądź na bieżąco!
Źródła
Share post
13 sierpnia 2025
12 maja 2025






