Создайте свой собственный кошелек Ergo: Управление Ergo монетами с помощью ErgoTool
31 декабря 2019 г.

Введение
ErgoTool — это интерфейс командной строки (CLI) для
блокчейна Ergo. Вы можете использовать ErgoTool без запуска своего
узла Ergo. Хотя запуск узла является самым безопасным способом взаимодействия с
сетью блокчейна Ergo, ErgoTool, тем не менее, стремится предоставить более базовые инструменты
в вашем распоряжении. Конечно, вы все равно можете использовать его с вашим собственным работающим узлом.
В этом посте мы пройдем через простые шаги для генерации мнемонической фразы, создания
локального секретного хранилища и использования его для отправки ERG между адресами, все с помощью
команд ErgoTool.
Начало работы
Прежде всего, нам нужно установить ErgoTool на нашу систему из исходников, следуя
инструкциям по установке. В
каталоге, где мы клонировали ErgoTool, есть скрипт ergo-tool.sh, который мы собираемся
использовать для выполнения команд. Выполните следующую команду, чтобы проверить, что ErgoTool установлен правильно.
$ ./ergo-tool.sh help
имя команды не указано (выполните ergo-tool без аргументов, чтобы получить список команд)
Имя команды: help
Синтаксис использования: ergo-tool help <commandName>
Описание: выводит справку по использованию команды
Страница документации: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/HelpCmd.html
Давайте посмотрим, что мы здесь получаем. ErgoTool выводит сообщение об ошибке с информацией о
команде help. Это типичный вывод ErgoTool, когда одна из известных команд указана,
но используется неправильно. Как мы можем узнать из сообщения, команда help
требует от нас указать дополнительный аргумент <commandName>. Также каждая команда имеет
страницу документации API со всеми деталями о выполнении команды, поэтому ее URL здесь показан.
Создание новой мнемонической фразы
Мнемоника — это случайная последовательность символов, которая используется для генерации мастер-ключа
в соответствии со спецификацией Иерархических детерминированных
кошельков.
Для удобства используется случайная последовательность английских слов, но это не обязательно.
Выполните следующую команду, чтобы сгенерировать новую мнемоническую фразу:
$ ./ergo-tool.sh mnemonic
птица гавань пшеница невинный бизнес болезнь занятый быстрый желтый доверие время масло входить расположить луна
Запишите ее на бумаге и храните в безопасном и секретном месте.
В качестве дополнительной меры безопасности вы можете создать произвольный мнемонический пароль.
В некотором смысле он может служить как дополнительное несловесное слово в мнемонике.
Мнемонический пароль является необязательным и используется для дополнительной безопасности.
Если вы решите использовать мнемонический пароль, вы также должны записать его и хранить в секретном и
возможно, отличном от мнемонического месте.
Важно, как мнемоническая фраза, так и мнемонический пароль необходимы для восстановления секретных ключей,
если вы потеряете любой из них, вы не сможете снова сгенерировать свой мастер-ключ.
Далее давайте используем сгенерированную мнемонику для создания хранилища с мастер-секретным ключом.
Создание нового зашифрованного хранилища
Для лучшей безопасности ErgoTool не требует ни мнемоническую фразу, ни пароль для
выполнения подписания транзакции. Вместо этого для подписания транзакции расходования требуется
секретный ключ из зашифрованного хранилища. Мы можем сгенерировать секретный ключ и сохранить его в
зашифрованном хранилище, используя команду createStorage.
$ ./ergo-tool.sh help createStorage
Имя команды: createStorage
Синтаксис использования: ergo-tool createStorage [<storageDir>="storage"] [<storageFileName>="secret.json"]
Описание: Создает зашифрованный файл хранилища для мнемоники, введенной пользователем
Страница документации: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/CreateStorageCmd.html
$ ./ergo-tool.sh createStorage
Введите мнемоническую фразу> птица гавань пшеница невинный бизнес болезнь занятый быстрый желтый доверие время масло входить расположить луна
Мнемонический пароль>
Повторите мнемонический пароль>
Пароль хранилища>
Повторите пароль хранилища>
Файл хранилища: storage/secret.json
Мастер-секретный ключ генерируется из пары (мнемоническая фраза, мнемонический пароль) и
сохраняется в зашифрованном виде в файле storage/secret.json. Мнемоника сама по себе не хранится в
файле, и нет способа восстановить ее из файла, даже если вы знаете пароли.
Пожалуйста, будьте внимательны, вводя правильный мнемонический пароль, тот, который вы выбрали и сохранили ранее.
Поскольку мнемонический пароль является необязательным, вы можете оставить его пустым, нажав Enter.
Если вы забудете пароль хранилища (также известный как пароль шифрования), вы не сможете больше использовать
этот файл хранилища, однако вы всегда можете восстановить свои секретные ключи из пары (мнемоническая
фраза, мнемонический пароль) и таким образом создать новый файл хранилища с новым паролем.
Храните свой файл хранилища и пароль хранилища в секрете, любой, кто получит и файл хранилища,
и пароль хранилища, сможет расшифровать его и получить доступ к секретным ключам.
Извлечение данных из хранилища
Секретное хранилище содержит мастер-секретный ключ и, как следствие, может быть использовано для вычисления как
публичного ключа, так и адреса pay-to-public-key, которые соответствуют этому секретному ключу. Команда
extractStorage делает именно это.
$ ./ergo-tool.sh help extractStorage
Имя команды: extractStorage
Синтаксис использования: ergo-tool extractStorage <storage file> address|masterKey|publicKey|secretKey mainnet|testnet
Описание: Читает файл, разблокирует его с помощью пароля и извлекает запрашиваемое свойство из данного файла хранилища.
Страница документации: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/ExtractStorageCmd.html
$ ./ergo-tool.sh extractStorage storage/secret.json address mainnet
Пароль хранилища>
9iHiSAg3ko2ZGxR2vhc1Aem3tShqfzEPDAF7XK5cdtbZ3Ut2CCf
Здесь команда преобразует секретный ключ в соответствующий публичный ключ и затем создает
адрес pay-to-public-key в основной сети.
Таким же образом мы можем получить публичный ключ, приватный ключ и другие данные из хранилища.
$ ./ergo-tool.sh extractStorage storage/secret.json secretKey mainnet
Пароль хранилища>
55dfde63c9b6b4f47683592e85ee997ba2e93507f38ba3f9c82933bcfbc677ca
$ ./ergo-tool.sh extractStorage storage/secret.json publicKey mainnet
Пароль хранилища>
03f07aecb145a85920bf6e9be80efe5f1cd1a165b45ad3aa8e5c4ca3ba50856bb8
Список непотраченных боксов
ErgoTool имеет специальную команду для перечисления всех доступных (т.е. непотраченных) боксов для данного адреса.
$ ./ergo-tool.sh listAddressBoxes 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
BoxId NanoERGs
4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119 4987000000
если мы укажем опцию --print-json, то ErgoTool выведет все боксы в формате json
$ ./ergo-tool.sh listAddressBoxes --print-json 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v
[{"boxId":"4840cb6facc20b765085db0ad24768ed0c5e7afd413e8e58e597c33a993f8119","value":4987000000,"ergoTree":"0008cd02472963123ce32c057907c7a7268bc09f45d9ca57819d3327b9e7497d7b1cc347","creationHeight":125646,"assets":[],"additionalRegisters":{},"transactionId":"820c688f4b9d709924ba0186ee930a7df374d8852920bc769fc1f1d0b313e5ab","index":2}]
Перевод монет
Теперь, когда секретный ключ надежно хранится в зашифрованном файле хранилища, мы можем использовать ErgoTool для
перевода монет с нашего адреса на какой-то другой адрес получателя. Команда для этого — send.
./ergo-tool.sh help send
Имя команды: send
Синтаксис использования: ergo-tool send <storageFile> <recipientAddr> <amountToSend>
Описание: отправить указанное <amountToSend> на указанный <recipientAddr> с использованием
данного <storageFile> для подписания транзакции (запрашивает пароль хранилища)
Страница документации: https://aslesarenko.github.io/ergo-tool/api/org/ergoplatform/appkit/ergotool/SendCmd.html
Файл хранилища необходим для доступа к секретному ключу и генерации подписи. Пароль хранилища будет запрашиваться ErgoTool для разблокировки и расшифровки содержимого файла.
Команда send поддерживает опцию --dry-run, которая заставляет ErgoTool создать
подписанную транзакцию, но вместо того, чтобы отправить ее в блокчейн, ErgoTool выводит
транзакцию на консоль.
$ ./ergo-tool.sh send --dry-run storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Пароль хранилища>
Создание провера... Ок
Загрузка непотраченных боксов с адреса 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ок
Подписание транзакции... Ок
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
}
]
}
Обратите внимание, что скрипты "ergoTree" десериализуются и выводятся как абстрактные синтаксические деревья. Этот
формат печати можно регулировать с помощью дополнительных опций, чтобы скрипты можно было распечатать как
читаемый человеком ErgoScript. (Пока не реализовано, но где-то в планах.)
Если мы исключим опцию --dry-run, транзакция будет отправлена и включена в
блокчейн.
$ ./ergo-tool.sh send storage/E1.json 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K 5000000
Пароль хранилища>
Создание провера... Ок
Загрузка непотраченных боксов с адреса 9f4QF8AD1nQ3nJahQVkMj8hFSVVzVom77b52JU7EW71Zexg6N8v... Ок
Подписание транзакции... Ок
Отправка транзакции... Ок
Сервер вернул id транзакции: "c5710af17f5124a232a5ef731fdf94a493025334c2a7d5a79e9923210972b962"
Новая транзакция будет транслироваться по всему блокчейну, и майнеры начнут
включать ее в новый блок. Как только новый блок с нашей транзакцией будет добыт и
принят сетью, наш перевод будет подтвержден, и мы можем увидеть его в Explorer.
Мы также можем перечислить боксы адреса получателя и увидеть монету, которую мы создали среди других
(пока она не будет потрачена получателем)
$ ./ergo-tool.sh listAddressBoxes 9hHDQb26AjnJUXxcqriqY1mnhpLuUeC81C4pggtK7tupr92Ea1K
BoxId NanoERGs
252c5ce38fc367001ea48fa6813e6252ebc169288d9b5392c572edb55380b3cd 5000000
6df9dbf08b4859b7e280afbd0822dcf20dba5bf8e3e33b78fe278df6597276f1 2000000
d47f958b201dc7162f641f7eb055e9fa7a9cb65cc24d4447a10f86675fc58328 1000000
e050a3af38241ce444c34eb25c0ab880674fc23a0e63632633ae14f547141c37 1000000
b50ed8c2953fd33b52af816c4caa63ec5b6d236a262a5a192534695c3478da78 1000000
26d6e08027e005270b38e5c5f4a73ffdb6d65a3289efb51ac37f98ad395d887c 10000000000
Примечания по безопасности
ErgoTool создан с учетом безопасности и старается изо всех сил защитить использование
чувствительной информации, такой как мнемонические фразы (которые никогда не хранятся постоянно),
пароли (которые никогда не отображаются на экране) и т. д. В дополнение к этому, секретные ключи никогда
не хранятся на локальном диске в незашифрованном виде и, конечно, никогда не отправляются никуда.
Заключение
ErgoTool разработан так, чтобы выглядеть и ощущаться как типичная утилита CLI:
- которая проста в использовании и быстро запускается из командной строки
- может быть скриптована с помощью оболочечных скриптов
- имеет встроенную справку по использованию
В то же время ErgoTool разработан так, чтобы быть легко расширяемым:
- реализован на высокоуровневом языке Scala
- повторно использует основные библиотеки, которые используются в клиенте сети Ergo
- с открытым исходным кодом и полностью документирован
Этот последний пункт особенно важен, так как многие новые команды могут быть легко добавлены в
ErgoTool, благодаря его архитектуре. Если вам нужна конкретная функция или команда,
пожалуйста, создайте проблему или, возможно, даже PR.
Расширяемость ErgoTool будет темой следующего запланированного блога, следите за новостями!
Ссылки
Share post
13 августа 2025 г.
9 июля 2025 г.
12 мая 2025 г.






