Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
tristamoff
7 лет назад

Подключение к блокчейну Golos средствами PHP

На голосе уже не раз писали о подключении к голосу средствами JavaScript.
Мне front-end разработка не очень нравится, поэтому я решил подключиться к нему на серверном уровне и без использования NodeJS.
Использовать я буду PHP. Готовых образцов кода я в сети не нашел, так что пришлось пробираться сквозь дебри.
Для подключения к сокету голоса я использовал библиотеку от Textalk
Подключается она через Composer
Если у вас на сервере не установлен composer - ставим его одной строчкой в консоли:

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Если у вас хостинг и хостер не установил его - то придётся обратиться в техподдержку хостера.

Будем считать, что вы разобрались с композером.
Далее пишите в консоли:

#создаём папку проекта
mkdir golos_socket
#переходим в папу проекта
cd golos_socket
#инициализируем composer
composer init
#далее везде нажимаем Enter(у авторов пишем n)

Вот так это выглядит в консоли

Если вы всё сделали так-же - то у вас создастся файл composer.json

Теперь нужно сказать композеру о нужной нам библиотеке.
Пишите в консоли

composer require textalk/websocket

Эта команда добавит запись о библиотеке textalk/websocket в файл composer.json и сразу же скачает его.

Если всё прошло успешно - то в проекте у вас появится папка vendor с нужной нам библиотекой.

Теперь создадим файл для работы с блокчейном. Пусть это будет index.php

Я использую среду разработки PhpStorm.

Подключаем библиотеку(в index.php) и указываем пространство имён:

require('vendor/autoload.php');
use WebSocket\Client;

Затем создаем клиент для подключения

$client = new Client("wss://ws.golos.io/");

Теперь у объекта $client есть следующие методы, которыми мы будем пользоваться:
send - отправить данные
receive - прочитать ответ
close - закрыть соединение

Телом запроса будет json массив. В php обычный массив превращается в json при помощи функции json_encode и обратно - json_decode (лично я всегда их путаю)

Теперь можно посылать запросы.

Первый запрос будет с методом get_dynamic_global_properties. Процитирую @vik - этот метод вернёт глобальные динамические значения базы данных. В этом значении базы будет номер текущего блока с активностью пользователей.

Он уже не раз писал о подключении к блокчейну на JavaScript. Собственно его посты (и то, что именно сегодня у @arcange отвалилась база) помогли мне написать этот рабочий код.

Наш массив формируется имеет точно такую-же структуру, различия лишь в синтаксисе:

//сразу преобразуем в json
$a = json_encode(
  [
    'id' => 1, 'method' => 'get_dynamic_global_properties', 'params' => []
  ]
);

ключ id обязателен, без него работать не будет.
ключ params - не обязателен

Передаём запрос в блокчейн методом send:

$client->send($a);

И выводим на экран ответ:

print_r($client->receive());

Затем закрываем соединение:

$client->close();

Полностью index.php будет выглядеть так:

//подключение библиотеки
require('vendor/autoload.php');
use WebSocket\Client;

//создание клиента
$client = new Client("wss://ws.golos.io/");

//основной запрос
$a = json_encode(
  [
    'id' => 1, 'method' => 'get_dynamic_global_properties'
  ]
);

//отправка запроса
$client->send($a);

//вывод ответа
print_r($client->receive());

//закрытие соединения
$client->close();

Листинг на pastebin http://pastebin.com/eHhv5fZt

Если у вас всё сработало - то в браузере вы увидите примерно следующее:

Я немного подправил html, чтобы всё влезло на экран, а так - не помешали бы пробелы между запятыми. Это сейчас был камень в огород разработчиков.

Теперь можно преобразовать этот json в массив и по-человечески на него посмотреть:

//заменяем
print_r($client->receive());
//на
echo '<pre>';
print_r(json_decode($client->receive()));
echo '</pre>';

И видим вот такой расчудесный объект(не массив).

В нём мы видим id последнего блока, время его создания, хозяина ноды(к которой мы сейчас подключились) и другую статистическую информацию.

Теперь попробуем вытащить пользователя методом get_accounts:

$b = json_encode(
  [
    'id' => 2, 'method'=>'get_accounts', 'params'=>[['tristamoff', 'mir', 'qqc']]
  ]
);

Я передал сразу 3 аккаунта. @tristamoff - это собственно я, @mir стал моим продюсером в рамках конкурса #вырастиблогера , организованного @lumia , а @qqc - просто простой ник и я его запомнил))
Соответственно передаём теперь этот запрос и сразу выводим ответ:

$client->send($b);

echo '<pre>';
print_r(json_decode($client->receive()));
echo '</pre>';

В ответе вы получите большую портянку, на скриншот она не влезет. Давайте я просто для наглядности выведу некоторые данные, например аватар, дату регистрации, количество постов и баланс в золотых:

//получение ответа
$response = json_decode($client->receive());
if (!empty($response->result)) {
  //ответ получен, перебираем массив пользователей
  foreach ($response->result as $user) {
    //вывод фото
    $json_metadata = json_decode($user->json_metadata);
    if (!empty($json_metadata->user_image)) {
      $img_src = $json_metadata->user_image;
      echo '<' . 'img src="' . $img_src . '" style="max-width:200px;" /><br />';//пишу так, потому что парсер голоса не пропускает код по-человечески.
    }

    echo 'Зарегистрирован: ' . $user->created . '<br />';
    echo 'Постов: ' . $user->post_count . '<br />';
    echo 'Золота: ' . $user->sbd_balance . '<br />';
    echo '<hr />';
  }
}

У меня всё получилось:

И самый простой метод get_block - это получение информации о блоке. Например:

$c = json_encode(
  [
    'id' => 3, 'method' => 'get_block', 'params' => [3452345]
  ]
);

Соответственно, если перебрать все блоки, начиная с 1 - то сможете собрать свою базу блокчейна и делать по ней sql выборки.

Весь код, со всеми методами http://pastebin.com/auSsaf8C

Вот собственно и всё.

Почему собственно получился этот урок... Я писал продолжение темы о написании бота для Telegram (Урок 1) и момент подтягивания информации из блокчейна вышел в целый пост. Так что в следующем уроке мы подружим Telegram и Golos. Спасибо за внимание.

P.S. Если кто знает какие ещё есть методы или что-то в этом роде - отпишитесь плиз, а то нигде в сети не смог ничего похожего найти.

2
721.235 GOLOS
На Golos с January 2017
Комментарии (14)
Сортировать по:
Сначала старые