А вы знаете, что при наличии доступа к любой рабочей ноде Голоса, вы с ее помощью можете производить все те же операции/транзакции, что есть в обычном меню Голоса, но в обход веб-интерфейса(морды)? Даже если все сайты и сервисы голоса лежат, но еще жив блокчейн - вы можете им пользоваться - постить, апвотить, переводить монеты, итд. И даже немного больше - в cli_wallet предусмотрены методы, которые отсутствуют в стандартном меню Голоса.
Также вы можете пользоваться этим способом, если не доверяете держателям веб-интерфейсов, которые теоретически могут перехватывать ваши ключи. Я не говорю, что они это делают, но техническая возможность реализовать подобное, существует.
У нас в базе знаний Голоса еще с времен, когда тут всем заправлял Cyberfund, остался гайд по Cli-wallet API, но во-первых он сильно устарел, с тех пор было принято уже несколько хардфорков и в результате некоторые методы добавились, некоторые наоборот исчезли или перестали работать. А во-вторых, написан он не для нормальных людей - очень сжато, непонятно, и неполно. К примеру нигде не написано как и по какому принципу формировать JSON, какой должен быть синтаксис, итд. То есть обычный человек, не проработавший полжизни программистом, в этом просто не разберется.
В виду всего вышенаписанного, я решила способом научного тыка, собрать себе шпаргалку из проверенных методов с правильно подобранным синтаксисом, которые точно работают, и которыми я с вами планирую поделиться в том виде чтобы разобралась даже пенсионерка-домохозяйка в перерыве между вязанием шарфиков и поливанием вазонов.
Итак:
Для начала вы должны зайти в консоль машины с вашей рабочей нодой. Рассказывать буду на примере ноды, собранной по инструкции [от @lex], работающей в контейнере. Ноды у нас работают на Линуксе (в моем случае это Ubuntu), поэтому выглядеть консоль должна как-то так:
Открываем кошелек, введя в консоль следующую команду:
sudo docker exec -it classic cli_wallet -w /golosd/wallet.json -s ws://localhost:8091
Где classic - это имя вашего контейнера с нодой, которое вы ему присвоили при сборке. В большинстве гайдов он по умолчанию называется golosd, смотрите как там у вас, но я вот свой решила классиком назвать. Если вы все сделали правильно - должна появиться командная строка вот такого вида:
new >>>
Теперь придумываем пароль, устанавливаем его в систему при помощи команды set_password и потом этим паролем разблокируем кошелек:
set_password 123
unlock 123
где 123 - придуманный вами пароль (он может быть любым, какой придумаете такой и будет). Если все правильно сделали - должно получиться вот так:
Теперь для того чтобы блокчейн принимал ваши транзакции, нужно командой import_key импортировать в кошелек приватные ключи от аккаунта с которым вы будете работать. Обратите внимание на то, что для разных операций могут потребоваться разные ключи. К примеру постинг-ключ для того чтобы откомментить или апнуть, активный для передачи токенов, ключ владельца для смены доступа итд. Если собираетесь выполнять разные операции - можете сразу импортировать все ключи, или только те, которые вам понадобятся.
import_key <ваш ключ>
Если в блокчейне нет публичных ключей, соответствующих вашему приватному - кошелек ругнется что ключ неправильный, и не примет его. Если ключ правильный - должно появиться вот такое сообщение:
Теперь наш кошелек готов к работе и мы можем отправлять через него в блокчейн транзакции. Ниже их примеры будут указаны с полным синтаксисом и моими заметками, но если что будет непонятно - не стесняйтесь спрашивать в комментах.
Просмотр информации об аккаунте:
get_account lindsay
где, lindsay - имя аккаунта который вы хотите посмотреть (имя писать без @собачки). В результате, консоль вернет вам всю инфу об аккаунте, которая есть в блокчейне. Выглядеть будет примерно так:
Перевод с основного баланса на тип-баланс:
transfer_to_tip lindsay cognition "1.000 GOLOS" "memo" true
Где:
lindsay - аккаунт с которого отправляем
cognition - аккаунт на который отправляем
"1.000 GOLOS" - сумма отправки. Обратите внимание, что дробная часть отделяется точкой а не запятой, и в дробной части обязательно должно быть три символа. Если отправляете целое число - просто после точки ставьте "000".
"memo" - мемо с которым мы отправляем транзу. Если оно не нужно - вместо него оставляем просто пустую пару кавычек вот такого вида: ""
Если нужно отправить на тип баланс себе же - тогда используем свой аккаунт и в качестве получателя, это значит что нам нужна вот такая конcтрукция:
transfer_to_tip lindsay lindsay "1.000 GOLOS" "" true
Перевод с тип-балансa в Силу Голоса:
transfer_from_tip lindsay cognition "1.000 GOLOS" "memo" true
Тот жде принцип: отправитель, получатель, сумма, мемо. Если отправляем себе - указываем себя в качестве получателя.
Перевод из клэйма на тип-баланс:
claim "lindsay" "lindsay" "1.000 GOLOS" false true
конечно же вместо lindsay в качестве отправителя и получателя следует поставить свои ники.
Перевод из клэйма в СГ
claim "lindsay" "lindsay" "1.000 GOLOS" true true
Донат на тип-баланс автора со своего тип-баланса:
donate lindsay lex "1.000 GOLOS" {"app":"golos-io","version":1} true
где:
lindsay - кто донатит
lex - кого донатят
{"app":"golos-io","version":1}
- мемо в формате JSON в фигурных скобках. Так и не поняла зачем оно нужно, но без него транза не проходит.
Можно несколько усложнить операцию, если хотите добавить комментарий с информацией за что автора вознаградили:
donate lindsay lex "1.000 GOLOS" {"app":"golos-io","version":1,"target":{},"comment":"ваш комментарий, который отобразится у получателя в мемо к донату","extensions":[]} true
В поле "target", я намеренно оставила пустые скобки. По идее там должна быть информация о том, за какой пост получена награда, в формате {"author": "lex", "permlink": "obnovlenie-nod-golos-blockchain-na-v0-24-0"}
, но у меня оно так почему-то не работает, а с пустыми - работает. Если кто знает в чем затык - напишите в комментах.
Перевод токенов с аккаунта на аккаунт:
transfer lindsay lex "1.000 GOLOS" "memo" true
lindsay отправляет к lex 1.000 GOLOS с мемо "memo" либо пустыми кавычками, если мемо не нужно. Если надо отправить не голоса а голду - то вместо GOLOS, указываем GBG.
Перевод ликвидных токенов в СГ
transfer_to_vesting lindsay lex "1.000 GOLOS" true
lindsay отправляет к lex в СГ 1.000 GOLOS.
Ну или так, если просто надо свой ликвид сконвертировать в СГ:
transfer_to_vesting lindsay lindsay "1.000 GOLOS" true
lindsay переводит из своего ликвида себе в СГ 1.000 GOLOS
Вывод из СГ: включение и остановка понижения Силы Голоса
withdraw_vesting lindsay "1000000.000000 GESTS" true
где lindsay - имя аккаунта на котором включается понижение силы.
Если вы обратили внимание, СГ у нас считается не в голосах а в гестсах. И после точки, отделяющей дробную часть, обязательно должно быть 6 цифр.
Чтобы посмотреть сколько GESTS содержится в 1 GOLOS, можно воспользоваться сервисом http://golos.accusta.tk, в среднем 1 GOLOS ≈ 3300 GESTS.
Чтобы узнать точное количество GESTS у вас в СГ, нужно ввести в консоль команду get_account (описана выше), найти в полученном результате поле "vesting_shares", которое покажет вам точную цифру, с которой следует начинать понижение:
Соответственно для остановки понижения - отправляем ноль:
withdraw_vesting lindsay "0.000000 GESTS" true
Апвоты/флаги
vote "lindsay" "lex" "obnovlenie-nod-golos-blockchain-na-v0-24-0" 99 true
где:
"lindsay" - тот кто апает
"lex" тот кого апают
"obnovlenie-nod-golos-blockchain-na-v0-24-0" - пермлинк поста, удостоившегося апвота
99 - сила апвота в процентах (можно вводить от 1 до 100). Чтобы получился вместо апвота флаг - нужно перед процентом поставить значок минуса, чтобы в итоге вместо 99, вышло -99. Для отмены всех своих голосов (если надо снять ап или флаг) - ставим ноль.
Пермлинк - это вот этот кусочек ссылки, выделенный красной рамочкой:
Все что дальше типа "?invite=lindsay" - частью пермлинка не является и служит для работы реферальной системы.
Постинг:
post_comment lindsay test-permlink000001 "" "категория" "заголовок" "текст поста" "{}" true
где:
lindsay - автор
test-permlink000001 - придуманный вами пермлинк (ссылка) для поста (не должен повторяться, поскольку если у вас уже есть пост с таким пермлинком то он отредактируется вместо создания нового)
"" - пара пустых кавычек. Они так и должны оставаться пустыми, писать в них нужно только если вы комментируете чей-то пост, тогда там указывается пермлинк родителького поста
"категория" - категория, либо слово, которое вы хотите поставить первым тегом (спасибо @lex за подсказку)
"заголовок" - это понятно
"текст поста" - это тоже понятно
"{}" - здесь можно разместить json-метаданные если они нужны, к примеру если вы хотите чтобы в ленте ваш пост имел превью-картинку - в это поле можно вставить ссылку на изображение вот в таком формате (картинку потырила у Тиночки):
"{\"image\":[\"https://i.imgur.com/vpfu6ub.jpg\"]}"
Если метаданные не нужны или их нет - просто оставляем фигурные скобки пустыми.
Комментирование
Тот же принцип только указывается еще родительский пост, который мы комментируем
post_comment "lindsay" "test-0000020" "lex" "obnovlenie-nod-golos-blockchain-na-v0-24-0" "заголовок" "текст коммента" "{}" true
где
"lindsay" - автор коммента
"test-0000020" - придуманный нами пермлинк
"lex" - автор, которого комментируем
"obnovlenie-nod-golos-blockchain-na-v0-24-0" - пермлинк поста, который комментируем
"заголовок" - заголовок коммента
"текст коммента" - тут все понятно
"{}" - метаданные
Вот так к примеру будет выглядеть этот коммент в том виде, в котором он публикуется из морды golos.id, но на самом деле так все усложнять совсем необязательно, первого варианта будет вполне достаточно, как минимум если вы в тексте не используете китайские иероглифы, стопитсот тегов, или еще что-то такое заковыристое.
post_comment "lindsay" "test-0000020" "lex" "obnovlenie-nod-golos-blockchain-na-v0-24-0" "заголовок" "текст коммента" "{\"app\":\"golos.id/0.1\",\"format\":\"markdown\",\"tags\":[\"ru--test\",\"ru--тест\"],\"image\":[\"https://steemitimages.com/0x0/https://i.imgur.com/PbPU4Pt.jpg\"]}" true
Делегирование
delegate_vesting_shares "lindsay" "lex" "3300000.000000 GESTS" true
Линдси делегирует Лексу 3300000 GESTS (это примерно 1000 СГ).
Чтобы отозвать обратно - туда же делегируем ноль ("0.000000 GESTS")
Объявление себя делегатом:
update_witness "lindsay" "https://golos.id/@lindsay" GLS6a6sNntXHHfSFNakYH6ee7BEQQUJUp2e4YfhBwk4mNE2dFeWVe true
где:
"lindsay" - аккаунт делегата
"https://golos.id/@lindsay" - ссылка на информацию, которую вы хотите донести до своих избирателей (например свой пост с делегатской программой).
GLS6a6sNntXHHfSFNakYH6ee7BEQQUJUp2e4YfhBwk4mNE2dFeWVe - публичный ключ делегатской ноды
Для прекращения своих делегатских полномочий, используем этот же метод, только вместо своего делегатского ключа вставляем вот такой:
GLS1111111111111111111111111111111114T1Anm
Cмена ключей доступа к аккаунту
update_account lindsay "" GLS8BEpsUqChhF7C3RyreLU2vQCJAPkVZTkerjk5vtpGvP98b25Vp GLS64aSPiArniu2cfmr1RYoTJ3QEYyfu4e8UxWVPmRCqW6w4FnY4H GLS8TuLMMMNMZj9S2YUNQKmYfXdi7n18XjCQzsmHLPhUbePYm26Ee GLS5F1KiKVNy596dAEkSWV3syew6xn9ohMUPjopzC6h1MmdbCaWsc true
где:
lindsay - имя аккаунта на котором меняем ключи
Далее (в кавычках json-метданные, но лучше оставить пустыми)
Далее по порядку идут 4 публичных ключа: owner active posting memo
Разумеется, ключи можно поставить и произвольные, какие захотите, главное чтобы вы сначала сохранили себе каждую пару (публичный + приватный)
Но не забывайте, что помимо ключей у нас есть еще главный пароль, который повышает удобство использования аккаунта, поэтому советую привязать все свои ключи к имени аккаунта и главному паролю. Для этого советую использовать генератор ключей sha-256 от @ropox, ну или любой другой аналогичный генератор, какой вам нравится.
Юзать его так, как показано на картинке:
В поле User name вводим имя аккаунта, в поле Purpose - тип ключа (в данном случае posting), поле Password - придуманный нами пароль, ну и в двух нижних полях на основе этой информации будет сгенерирована пара глючей: приватный и публичный. Эту пару надежно сохраняем к себе на комп, публичную половинку от нее отправляем в блокчейн в качестве нового ключа, а приватную не показываем никому. Таким же образом генерируем остальные 3 ключа, по очереди меняя в поле Purpose тип ключа на owner, active и memo и точно также сохраняем каждую пару.
Хочу еще заметить что для смены ключей требуются права owner, соответствующий ключ к которым следует импортировать в кошелек заранее.
Голосование за делегатов:
vote_for_witness lindsay sorry true true
где:
lindsay - тот кто голосует
sorry - делегат за которого голосуют
Отзыв голоса за делегата:
vote_for_witness lindsay sorry fasle true
по тому же принципу:
lindsay - тот кто голосует
sorry - делегат с которого отзывают голос
Статья будет постепенно обновляться и дополняться по мере развития блокчейна. Буду признательна, если поделитесь своими наработками по cli_wallet, я тоже добавлю их сюда.
@lindsay ...мне думается, что ссылки на подобные статьи надо выносить в общее меню проекта, где создать отдельную позицию - "Полезное". Будет жалко, если подобное будет в дальнейшем теряться в анналах истории ГОЛОСА.
@smotritelmayaka есть 3 ссылки на документацию/вики (в боковом меню, среди значков снизу и после нажатия значка информации рядом с поиском, кнопка "база знаний"), а в вики уже раздел "полезные посты" куда подобное конечно стоит собирать...
@lex ...запрятали..))..нашел, но там уже статьи устарели немного..(((
@smotritelmayaka ну так, одного меня мало... )
Можно добавить нужные через гитхаб или сбросить, я обновлю.
@lindsay спасибо) Сложно, и я ничего не понял. Но зарепостил, чтоб не потерять. Возможно, в БЧ Кибервэй придётся постить только таким способом, потому что по мнению большинства топ-лидеров Голоса.ио - "Всё нормально с редизайном, у меня всё работает, а когда в России вообще хоть что-то работало нормально".
В БЧ Golos и с этого интерфейса работать удобно.
@eldar-adov В БЧ кибервей методы другие, там свой набор понадобится. Но учитывая спрос и стоимость тамошнего токена, сам понимаешь...
@lindsay спасибо я не юзаю ноды но ты продвинулась очень хорошо, есть чему поучиться у тебя )
@docsait Даже если не юзаешь - значит тебе будет к кому обращаться в возможных экстренных ситуациях =)
@lindsay ага завербуем) тебя на хорошую должность=)
@lindsay супер, большое спасибо. сложновато, да)) Эльдар прав.
@ladyzarulem просто со стороны кажется что сложно, пока не попробуешь. А как войдешь во вкус - все поменяется. Вот лично для меня сейчас уже некомфортно делать транзакции обычным способом: у меня в кли уже сохранены все эти методы, достаточно стрелочками пощелкать, нажать "Enter" (ну может сумму другую ввести) - получается в разы быстрее.
@lindsay вот ты умничка все-таки!!!