Вчера решил зарегистрировать специализированного пользователя (@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
Набираю в браузере https://golos.id/@t800 и убеждаюсь, что аккаунт существует.
Команда create_account сама генерирует приватные ключи и записывает вам в ваш кошелек. Список ключей можно получить задав list_keys
. Какой ключ, к какому аккаунту не отмечено, но если посмотреть JSON вашего аккаунта (см. выше), то можно видеть публичные ключи. Сравнив их с теми же в кошельке, можно найти соответсвующие приватные ключи.
Вот и все. Как пользоваться новым аккаунтом на golos.io я еще не разобрался. Буду читать.
Ах да, файл с вашим кошельком лежит в папке ~/golos-docker/data/wallet.json. Скопируйте файл, что бы не потерять или не затереть. Или выхлоп команды list_keys сохраните где нибудь.
Отличный мануал. Я пытался зарегатся на стимите путем майнинга одного блока - неделю потратил на всевозможные варианты установки steemitd. Запускается, собака, начинает синхронизироваться и на 3-х с чем-то миллионов блоков начинает ругаться, что блок какой-то не такой -) Короче, взял американский номер сестры и зарегался за минуту -)