Как создать пользователя голоса через CLI кошелек.


Вчера решил зарегистрировать специализированного пользователя (@habreplicator) , что бы от имени этого пользователя мой бот мог постить статьи с хабра. Можно было бы конечно зарегистрироваться где-нибудь в вконтакте или на facebook-е и потом создать своего пользователя здесь. Но мне было интересно, да и @hipster отсыпал горсть голосов мне под это дело (создание аккаунта стоит на данный момент 3 GOLOS), поэтому я начал искать - как.

Конкретной пошаговой инструкции я не нашел. Потому опишу, как я бился с кошельком.

CLI кошелек

Установка

Первым делом, почитав здесь и на steemit я эмпирически выяснил, что мне должен помочь загадочный CLI wallet (CLI - command line interface, что по русски значит Интерфейс Командной Строки). Wallet это кошелек.

Есть несколько вариантов, как установить кошелек.

  • Это вручную скомпилировать из исходников, тут описано как. Но у меня под убунтой не задалось. Библиотеки boost не хотели линковаться, видимо можно установить правильный вариант этих библиотек для статической или наоборот для динамической линковки. Но дальше я не стал разбираться.
  • Второй вариант тоже компиляция, но уже автоматизированная скриптом. Вот тут скрипт товарища @ruslan. На github актуальная версия 0.1.8. Я попробовал скрипт, реально круто. Все скомпилировалось, создался дебиан пакет, установилось... Но не запускается :( . golosd выпадает в кору. Отладочная инфа к сожалению в бинарнике отсутствует, потому разобраться из-за чего крэш я с наскоку не смог, потому перешел к третьему варианту.
  • Третий способ, это воспользоваться скриптом @someguy123 и установить готовый docker контейнер с установленной в нем golos ноды. Описание.

Третий вариант сработал. Почти мгновенно все установилось. Я установил все в домашней папке, в папочке ~/golos-docker.

Конфигурация

В этой папке есть конфигурационный файл по этому пути ~/golos-docker/data/witness_node_data_dir/config.ini

Его надо отредактировать. Во первых я установил размер shared memory в 8G. У меня старый ноутбук, у него всего четыре гигабайта оперативки и файл подкачки на 4 гига. В конфигурационном файле было 12G.

# Shared file size
shared-file-size = 8G
shared-file-dir = /shm/

Еще нужно задать размер SHM файла. В статье @someguy123 написано как, но повторю здесь.

Убедитесь, что вы установили размер вашей папки /dev/shm соответственно указанному размеру в config.ini (по умолчанию стоит 12Гб, но вы можете установить 8Гб для ноды делегата)

mount -o remount,size=8G /dev/shm

Еще в конфиге я добавил account_by_key_api.

public-api = database_api login_api account_by_key_api

Вроде бы больше ничего не менял. А да, я закоментировал эту строку

#enable-plugin = witness

Думаю в нашем случае она не нужна.

Еще отсутствовала папочка под сам blockchain.

mkdir ~/golos-docker/data/witness_node_data_dir/blockchain

Запуск

Теперь можно запускать. Для этого в папке ~/golos-docker я выполнил команду

./run.sh start, потом убедился, что она запущенна. ./run.sh status и ./run.sh logs. В логах не должно быть ошибок, у меня только пару штук связанных с API. Сорее ворнинги, чем ошибки. И в логе видно, что нода начала синхронизировать blockchain. В папке blockchain появились два файла.

total 1,5G
-rw-r--r-- 1 root root  37M Apr  2 14:00 block_log.index
-rw-r--r-- 1 root root 1,4G Apr  2 14:00 block_log

Как видно актуальный размер цепочки голоса 1.5 гигабайта. Я подождал несколько часов, пока цепочка не была полностью синхронизирована.

Работа с кошельком

Можно в принципе уже сейчас запустить кошелек. Все тем же скриптом run.sh ./run.sh wallet

Logging RPC to file: logs/rpc/rpc.log
Starting a new wallet
446833ms th_a       main.cpp:154                  main                 ] wdata.ws_server: ws://localhost:8090 
446838ms th_a       main.cpp:159                  main                 ] wdata.ws_user:  wdata.ws_password:  
446840ms th_a       websocket_api.cpp:88          on_message           ] message: {"id":1,"result":true} 
446842ms th_a       websocket_api.cpp:88          on_message           ] message: {"id":2,"result":0} 
446843ms th_a       websocket_api.cpp:88          on_message           ] message: {"id":3,"result":3} 
Please use the set_password method to initialize a new wallet before continuing
new >>> 

Как видно кошелек сразу предлагает задать пароль. Все ключи, которые вы будете хранить в кошельке будут зашифрованы. Я задал простенький пароль, так как риск, что файл кошелька попадет в чужие руки относительно низкий. Вообщем главное не перестараться с паролем и не забыть его. Для задания пароля надо ввести команду set_password 87654321 где 87654321 это мой пароль к кошельку.

new >>> set_password 87654321
set_password 87654321
null

Ну а теперь можно разблокировать кошелек

locked >>> unlock 87654321
unlock 87654321
null
unlocked >>> 

Если задать команду help, то вы получите список команд в Сишном виде

                             set<string> list_accounts(const string & lowerbound, uint32_t limit)
            map<public_key_type, string> list_keys()
                 vector<account_api_obj> list_my_accounts()
                  set<account_name_type> list_witnesses(const string & lowerbound, uint32_t limit)
                                    bool load_wallet_file(string wallet_filename)

Общую информацию о блокчейне можно получить командой info. Для начала нас интересует. когда последний блок был создан. Это видно по этим двум атрибутам

  "head_block_num": 4775207,
  "head_block_age": "1 second old",

Если как у меня, от 0 до трех секунд, то значит цепочка полностью синхронизировалась. Можно теперь импортировать свой приватный активный (active) ключ. Этот ключ можно найти в вашем кошельке на сайте golos.io во вкладке "Разрешения". Это второй ключ сверху. Что бы показать надо залогиниться и нажать кнопку [Показать приватный ключ].

Его надо скопировать и импортировать в кошелек командой

import_key 5ВАШприВАТНЫЙКЛЮЧ

в ответ вы получите, что то вроде

2474021ms th_a       wallet.cpp:470                save_wallet_file     ] saving wallet to file wallet.json
true

если теперь задать команду list_my_accounts то возможно вы получите баланс вашего аккаунта

habreplicator             0.000 GOLOS   11567.625108 GESTS            0.000 GBG
ropoxbot                  0.000 GOLOS   11567.624736 GESTS            0.000 GBG
znation                   0.000 GOLOS   11567.628782 GESTS            0.000 GBG
-------------------------------------------------------------------------
TOTAL                     0.000 GOLOS   34702.878626 GESTS            0.000 GBG

Почему возможно? У меня не сработало. Не показывает баланс моего аккаунта. Возможно потому, что я account_by_key_api вписал в конфигурационный файл когда цепочка была уже синхронизирована и видимо API просто не имеет информации о моем аккаунте. Но как видно вновь созданные аккаунты уже известны.

Создание аккаунта

Ну теперь собственно создание аккаунта. Задав комманду info можно узнать актуальную стоимость создания аккаунта.

 "account_creation_fee": "3.000 GOLOS"

Как видно, актуально у вас в кошельке должно быть как минимум 3 GOLOS.

Теперь командой get_account убедимся, что новое имя не занято

unlocked >>> get_account t800      
get_account t800
3018044ms th_a       websocket_api.cpp:88          on_message           ] message: {"id":9,"result":[]} 
10 assert_exception: Assert Exception
!accounts.empty(): Unknown account
    {}
    th_a  wallet.cpp:396 get_account
unlocked >>>

Ну и финал, командой create_account создаем аккаунт

create_account ropox t800 "{\"profile\":{}}" true
  • Первый параметр имя вашего аккаунта, для которого вы импортировали приватный ключ.
  • Второй параметр это имя нового аккаунта
  • Третий параметр JSON с метаданными. Эти данные отражаются на сайте, в профайле. Я не знаю, можно ли оставлять пустым все это, я задал минимальный набор.
  • Последний параметр true - новый аккаунт будет записан в blockchain, false - будут только сгенерированы новые ключи, но blockchain ничего не будет записано.

В результате я получил вот такой JSON

{
  "ref_block_num": 57289,
  "ref_block_prefix": 4158743477,
  "expiration": "2017-04-02T12:55:18",
  "operations": [[
      "account_create",{
        "fee": "3.000 GOLOS",
        "creator": "ropox",
        "new_account_name": "t800",
        "owner": {
          "weight_threshold": 1,
          "account_auths": [],
          "key_auths": [[
              "GLS8Kv1DKXsV2gw6XEqHu9yTdbxcofdYLg2LzZAWkiCSeBL8F3cEj",
              1
            ]
          ]
        },
        "active": {
          "weight_threshold": 1,
          "account_auths": [],
          "key_auths": [[
              "GLS6yr4YGHoCq6dr4aHrWEb8ThS2GZfxujPeJaiMoK1ZpsfLzVoJ6",
              1
            ]
          ]
        },
        "posting": {
          "weight_threshold": 1,
          "account_auths": [],
          "key_auths": [[
              "GLS7NKAaTefhErahrR5dkmxPAEp9iafJfXEtxGeRFofxEzaDVwZD3",
              1
            ]
          ]
        },
        "memo_key": "GLS6a9hUKtroSZrbZ83mNsvCrXuVHzQbMc7y9yaZrbDLsiLiS67Qx",
        "json_metadata": "{\"profile\":{}}"
      }
    ]
  ],
  "extensions": [],
  "signatures": [
    "20201fdaf1dc102178287c72cbf6674063a8f0811032b545effe0fcf6cc7913b1424c136fbb7fdfd2ab0b2b366b387eb10b94165ea402816dc080172bd964e8498"
  ],
  "transaction_id": "644cbb1b90e72eb114eabd6ac1647e4dc275f4a0",
  "block_num": 4775882,
  "transaction_num": 1
}

Задаю команду list_my_accounts и вижу моего вновь созданного отпрыска.

 t800                      0.000 GOLOS   11566.759174 GESTS            0.000 GBG
-------------------------------------------------------------------------
TOTAL                     0.000 GOLOS   11566.759174 GESTS            0.000 GBG

Набираю в браузере /@t800 и убеждаюсь, что аккаунт существует.

Команда create_account сама генерирует приватные ключи и записывает вам в ваш кошелек. Список ключей можно получить задав list_keys. Какой ключ, к какому аккаунту не отмечено, но если посмотреть JSON вашего аккаунта (см. выше), то можно видеть публичные ключи. Сравнив их с теми же в кошельке, можно найти соответсвующие приватные ключи.

Вот и все. Как пользоваться новым аккаунтом на golos.io я еще не разобрался. Буду читать.

Ах да, файл с вашим кошельком лежит в папке ~/golos-docker/data/wallet.json. Скопируйте файл, что бы не потерять или не затереть. Или выхлоп команды list_keys сохраните где нибудь.


Comments 0


Отличный мануал. Я пытался зарегатся на стимите путем майнинга одного блока - неделю потратил на всевозможные варианты установки steemitd. Запускается, собака, начинает синхронизироваться и на 3-х с чем-то миллионов блоков начинает ругаться, что блок какой-то не такой -) Короче, взял американский номер сестры и зарегался за минуту -)

14.04.2017 05:40
0