В этом уроке мы научимся получать и обрабатывать информацию о новых блоках Голоса, генерируемых делегатами. Для этого мы напишем простой код на JavaScript, который будет выполняться на компьютере пользователя с помощью nodejs.
Предисловие
- Требуется базовый уровень понимания JavaScript, веб технологий и командной строки
- Задавайте вопросы в комментариях, если я что-то непонятно объясняю.
- В этом уроке мы создадим основу для разных ботов. Учиться автоматически реагировать на события блокчейна мы будем в следующих уроках.
- У меня минимальный опыт работы с русскоязычной терминологией в программировании, поэтому названия я буду оставлять на английском языке.
- Несмотря на то, что на бекэнде я предпочитаю использовать Elixir, для первых уроков гораздо лучше подойдет JavaScript.
- В этом уроке используется неоптимальный код, паттерны и структура, приоритизируется легкость для понимания и читаемость кода.
Зачем нужны боты?
В данном случае решается несколько целей, одна из них -- дать возможность аккаунтам следовать за голосами @academy без предоставления мне или кому-то другому постинг ключа.
Подготовка и выбор технологического стека
Что такое стек? Буквально "stack" означает стопка и используется для обозначения комплекса языков, технологий и приложений.
Разрабатывать программу бота будем на JavaScript. Если точнее, то на JavaScript 2016, а если еще точнее, то на версии JavaScript, которую поддерживает последняя версия nodejs.
Вначале была среда программирования. Для ее развертывания нам необходимо выполнить следующие действия:
- установить последнюю версию node.js (изучите тут )
- инициализировать новый проект с помощью
npm init
(показано в скринкасте) - установить мой форк npm модуля:
"golos":"ontofractal/golosjs"
в package.json ( в скринкасте ошибочная версия npm модуля golos)
Скринкаст подготовки нового проекта
Первые строки
- Для упрощения управлением асинхронным потоком данных используем Promises
- node.js использует собственный формат модулей, в будущих релизах node.js (и браузеров) система импортирования модулей будет заменена на нативные EcmaScript 2016 модули, которые выглядят вот так:
import golos from 'golos'
- Библиотека
golos
использует вебсокеты и протокол JSONRPC для обмена данными с нодами Голоса. По умолчанию библиотека подключается к публичной нодеwss://ws.golos.io
// импортируем модуль голоса
const golos = require('golos')
// импортируем модуль Bluebird -- самую популярную имплементацию Promise
const Promise = require("bluebird")
// аккаунт пользователя, который запускает бота
const accountName = ''
// приватный постинг ключ пользователя, который запускает бота
const postingKey = ''
// аккаунт пользователя за которым следим
const accountNameToFollow = 'academy'
// создаем новый Promise c помощью обвертывания golos.api.getDynamicGlobalProperties
const dynamicGlobalProperties = new Promise((resolve, reject) => {
golos.api.getDynamicGlobalProperties((err, result) => {
if (err) {
reject(err)
}
else {
resolve(result)
}
})
})
// резолвим Promise
dynamicGlobalProperties
.then(x => console.log(x))
.catch(e => console.log(e))
Создаем функцию, которая выдернет из полученного от ноды объекта глобальных свойств номер последнего блока
const pluckBlockHeight = x => x.head_block_number
Создаем функцию, которая запрашивает данные блока
const getBlockData = height => {
golos.api.getBlock(height, (err, result) => {
if (err) {
console.log(err)
}
else {
console.log(result)
}
})
}
Скринкаст результата
Создаем функцию, которая будет запрашивать данные следующего блока с регулярным интервалом
const startFetchingBlocks = startingHeight => {
let height = startingHeight
setInterval(() => {
getBlockData(height)
height = height + 1 // брррр, мутация
// у нас есть доступ к переменной height благодаря closure
}, 3000)
// Задаем интервал в 3000 мс т.к. блок Голоса генерируется каждые три секунды
}
Сводим все вместе
const golos = require('golos') // импортируем модуль голоса
const Promise = require("bluebird") // импортируем модуль Bluebird -- самую популярную имплементацию Promise
const accountName = '' // аккаунт пользователя, который запускает бота
const postingKey = '' // приватный постинг ключ пользователя, который запускает бота
const accountNameToFollow = 'academy' // аккаунт пользователя за которым следим
// создаем новый Promise обворачивая golos.api.getDynamicGlobalProperties
const dynamicGlobalProperties = new Promise((resolve, reject) => {
golos.api.getDynamicGlobalProperties((err, result) => {
if (err) {
reject(err)
}
else {
resolve(result)
}
})
})
const pluckBlockHeight = x => x.head_block_number
const getBlockData = height => {
golos.api.getBlock(height, (err, result) => {
if (err) {
console.log(err)
}
else {
console.log('')
console.log('============ НОВЫЙ БЛОК ============')
console.log(result)
}
})
}
const startFetchingBlocks = startingHeight => {
let height = startingHeight
setInterval(() => {
getBlockData(height)
height = height + 1 // брррр, мутация
// у нас есть доступ к переменной height благодаря closure
}, 3000)
// Задаем интервал в 3000 мс т.к. блок Голоса генерируется каждые три секунды
}
// резолвим Promise
dynamicGlobalProperties
.then(pluckBlockHeight)
.then(startFetchingBlocks)
.catch(e => console.log(e))
Получаем информацию о новых блоках Голоса
В следующем уроке
- Изучим структуру блоков и транзакций
- Научимся отличать одни транзакции от других
- Научимся обрабатывать поступающие данные о голосах пользователей
Наконец то дошли руки до освоения этой статьи. Конечно же сразу вперся :/
Точно следую инструкции:
-устанавливаю последнюю версию node.js по ссылке
-запускаю Node.js
и тут все, мое открывающееся окно программы выглядит совсем не так как на скринлисте
далее когда пытаюсь вводить команды написанные в скринлисте ничего не происходит, либо выдаются ошибки
Ага, проблема понятна! Ты запускаешь консоль node, а тебе нужно выполнять код внутри файла main.js с помощью node, вот так
node main.js
.Увы но я все равно не понял(
если не затруднит, можете написать по пунктам что нужно сделать что бы дойти до того места с которого начинается первый скрин лист?
Моя ос win10 x64
Я пока делаю следующее:
-скачиваю отсюда :
https://nodejs.org/en/download/current/
Windows installer (.msi) x64 последнюю версию
-устанавливаю node.js
-перехожу в каталог с установленной программой и запускаю node.exe
у меня пустое окно в котором описываемые в статье команды не работают
Смотри, тебе не нужно запускать node.exe, т.к. при запуске node.exe ты запускаешь консоль node, а тебе нужно выполнить файл main.js с помощью node. Для этого тебе нужно попасть в командную строку операционной системы, для windows это, например, powershell. И в командной строке, находясь в папке с файлом main.js выполнить команду
node main.js
. Это дает команду nodejs выполнить конкретный javascript файл.Есть смысл больше времени посвятить изучению основ node.js:
Почти ничего не понял.. кроме того, что:
Не могу не отметить, что лучшее время начинать изучать программирование было год назад, а следующее лучшее время наступило сегодня :D
В прошлом году я таки-накодил "Хелоу, Ворлд!" =)
Мой лучший Друг кодит.. я занимался больше текстами.. мое..
Я ему все уши прожужал тремя темами: Нуга Бест (здоровье), приходом к Богу.. и.. блокчейном.
Пока говорит - мне это пока не надо/не интересно..
Уже ему ссылки на форклог бросаю.. как его вытолкать?
А он приземленно допиливает систему своего магазина-сайта - у него доставка воды.. и производство воды и кофейни.. вот клиент и делает для себя..
Крипту пока не признает.. а жаль.
"hello, world" -- это уже хорошо! значит, что ты преодолел первый барьер -- противостояние новому сложному знанию. Я тоже не с первого подхода начал писать код, понадобилось несколько попыток с интервалом в несколько месяцев.
И вот у тебя есть отличная возможность заинтересовать друга блокчейном, начав писать код для блокчейна самому, иногда спрашивая у друга совета :)
@mir
Начинать, однозначно, стоит. Это время и стресс и сложности, но результат того стоит. Ты уже в криптовалютах, нет причин не начинать.
Теоретически на Solidity или на Serpent можно писать не зная python и javascript, но лучше этого делать не стоит :)
ОК =)
А стоит начинать?
Это, все-таки время?
И еще один вопрос: можно без АшТиЭмЭл и прочего начинать писать на Солиди и т.д.?
root@vm115553:/usr/share/nginx/html# npm install golos не работает
Выдаёт
ага, нужно использовать мой форк npm модуля:
"golos":"ontofractal/golosjs"
в package.jsonПодскажите ещё такой момент.
Создал файл main.js http://pastebin.com/Akbk1TJX
В консоли(Ubuntu 14) пишу nodejs main.js
И получаю ошибку:
давай на ты, ок? :)
у тебя старая убунту и соответственно старая версия node. попробуй не
nodejs main.js
, аnode main.js
, в убунту в апт репозиториях nodejs и node устанавливаемый с сайта nodejs.org отличаются.Да,я щас по-другому nodejs поставил и уже получилось проголосовать за пост. Сейчас создавать посты научусь и буду делать бота)
И как это прописать в консоли?
Похоже работает
В начале по скринкасту дошел до установки модуля голос, полетели ошибки. там на гитхабе ничего не поменялось? сори, если вопрос глупый, начал только
Вопрос очень правильный, нужно использовать мой форк npm модуля:
"golos":"ontofractal/golosjs"
в package.jsonСпасибо за статью! Сейчас что-нибудь попробую замутить))
Буду очень рад увидеть результат от моих постов))
Понимают единицы. Голосуют все.
Если будет ругаться на
То в main.js
Или запускайте так:
node --use_strict ./main.js
Спасибо за дополнение :)
Вот это реально крутой урок!
Децентрализация набирает обороты, хорошо бы кто-то начал блог о разработке децентрализованных приложений с нуля!
Спасибо за отзыв :) Какие именно (они разные!) децентрализованные приложения тебя интересуют?
Я вот все думаю, возможно ли сделать децентрализованный мессенджер?
Это что-то вроде кошелька для криптовалюты, но только вместо монеток отсылать сообщения. Естественно анонимно и зашифровано.
Можно и уже делают! Например, whisper будет частью ethereum-а.
А на каком языке пишут децентрализованные приложения? Я не плохо знаю php и mysql, само собой html и css.
Но этого явно не достаточно. Хочу двигаться в сторону блокчейна. С чего начать?
Полезная вещь!
Спасибо :)