Статья эта для тех, кто когда-то будет делать стороннее приложение для Стимита/Голоса и ему захочется подписывать и отправлять в блокчейн посты и комментарии. Задача достаточно тривиальная, но из-за отсутствия документации может потребовать много времени на разбор полетов, особенно.. при ответе на комментарии.
Итак, как нам постить, комментировать, отвечать на комментарии и голосовать, не используя официальные платформы?
В первую очередь, нужен приватный постинг ключ. Есть несколько способов его получения:
- Взять ключ напрямую из аккаунта Стимит/Голос (попросить клиента предоставить его);
- Взять пароль от аккаунта Стимит/Голос и получить приватный постинг ключ из него.
Второй способ менее предпочтителен, потому как требует доверия клиента к вашему новому приложению, а с паролем, разумеется, возможно увести средства аккаунта. Есть еще один способ: зарегистрировать человека, став владельцем его аккаунта и получить постинг-ключ. Эта дорога мной пока не исследована, поэтому, о ней говорить не буду.
Берем постинг ключ аккаунта (человек предоставляет нам его). Что делаем с ним?
В первую очередь - сохраняем его у клиента. Не стоит ключ брать к себе и держать его в базе, зачем создавать себе лишние проблемы, становясь мишенью хакеров? Чтобы хранить ключ у клиента и делать это безопасно - ключ нужно шифровать. И дешифровать его тоже нужно уметь, конечно. Я использую RSA алгоритм шифрования, а в качестве ключа для дешифровки беру уникальные параметры браузера клиента с некоторыми модификациями для усложнения подбора.
Бац-бац! Ключик зашифрован и сохранен в cookie с возможностью дешифровки в любой момент. Он не хранится на сервере, он есть только у клиента в браузере.
Теперь можно конструировать пост. В этом нам поможет прекрасная библиотека steem.js
Она работает на чистом JavaScript и не требует передачи ключа серверу, все операции происходят с клиентской стороны.
Транзакция любой статьи выглядит так:
steem.broadcast.comment(posting_key,
trx['parentAuthor'],
trx['parentPermlink'],
trx['author'],
trx['permlink'],
trx['title'],
trx['body'],
trx['metadata'],
function(err, result) {
callback(result);
});
Для того, чтобы статья была статьей, а не комментарием, важно указать:
parentAuthor = ‘ ‘ - т.е. ничего.
parentPermlink = ‘category‘ - любая статья должна иметь родительскую ссылку, т.е. на категорию вашей статьи (например, steemit, ru—golos).
permlink - уникальная ссылка в рамках блога одного автора, конструируется произвольно (обычно, путем перевода title в lowercase и замены пробелов на тире).
author - здесь нужно вставить имя аккаунта автора статьи. Процесс его получения зависит от архитектуры вашего приложения, у меня оно происходит каждый раз перед подписью транзакции с помощью конвертации приватного постинг-ключа в публичный и отправки его в блокчейн, где ответом приходит имя аккаунта.
metadata - может быть любой, но туда принято записывать все теги, картинки и ссылки из статьи, которые необходимо прежде найти в теле статьи.
Вставили в функцию! Бац-бац! Транзакция прошла, статья появилась, никаких проблем.
Как создать комментарий? Примерно так же, но:
parentAuthor - это автор комментируемой статьи,
parentPermlink - соответствующая родительская ссылка.
permlink - необходимо дописывать конструкцию (re-parent-author)
Получится что то вроде: re-dark-sun-this-is-name-article
Без модификации permlink, комментарий тоже будет отправлен, но вот с ответом на него могут возникнуть проблемы.
Как создать ответ на комментарий?
Если посмотреть ссылки на комментарии, то они имеют вид
re-justinbair97-galaxy-note-7-update-20161211t193609141z
А автор этого комментария: steemvest17, и он не указывается в permlink.
Чтобы составить ответ к этому комментарию, необходимо записать в новый permlink всех авторов, разделяя их суффиксом 're-‘. Если API блокчейна не получит эти данные, вы долго будете упираться, и у вас так ничего и не получится. Проверено 😉
Чтобы ответить на вышеприведенный комментарий, permlink должен быть:
permlink = re-author-re-steemvest17-re-justinbair97-galaxy-note-7-update-DATE
author - это вы,
parentAuthor = re-steemvest17
Что касается приставки со временем в конце permlink, то ее можно не указывать, но.. желательно. Если вы захотите прокомментировать дважды один и тот же пост, то у вас это не получится, а получится - редактирование вторым постом первого. Поэтому.. в permlink должно быть различие.
Ну и напоследок.. Как голосовать? Проще простого.
steem.broadcast.vote(posting_key,
voter,
author,
permlink,
weight,
function(err, result) {
console.log(err, result);
});
weight = 10000 - соответствует силе голоса 100%.
voter - это вы, или тот, кто голосует.
author, permlink - за что идет голосование.
Все. Пошел кодить. Доброй ночи.
Ты не человек - ты ЧЕЛОВЕЧИЩЕ!!!!
Он - солнце же :) да вы все тут человеки - золото!!!
Спс
Решил поиграться с описанной библиотекой и возник такой вопрос: При вызове функции steem.api.getAccounts если я указываю свой логин, то в ответе ничего нет, а если указать dark.sun, тогда все хорошо, почему так?
Библиотека пока работает только со Стимом, для ее адаптации нужно в коде прописать центральную ноду Голоса. Аккаунт @Dark.Sun находится, потому что он зарегистрирован на steemit.com, ваш аккаунт, полагаю, нет.
Адаптацию проведу в ближайшие несколько дней, поскольку.. пора)
Я так и думал)
Именно такого описания мне и не хватало для полного счастья! Теперь написание собственного приложения (сначала в качестве эксперимента) пойдет гораздо быстрее.
Спасибо за гайд @dark.sun, думаю тем, кто только начинает разрабатывать приложения - будет полезна данная информация