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

Работать с блокчейном Голос проще, чем вам кажется


Давно "заразился" идей создать лёгкий мини-клиент для голоса.
И вот, собравшись с мыслями и открыв PhpStorm, начал делать.
Честно сказать, не знал, как обращаться к API Golos, в этом помогли мне @tristamoff и @vik.
Наш клиент будет получать Новые записи в на Голосе.

Приступим.

Первым делом мы создаём js файл и установим соединение с WebSocket.

Весь код js я буду выполнять, после загрузки всех данных. Для этого весь код поместим в callback:

document.addEventListener("DOMContentLoaded", function(){
   ...
});

Подключаемся к ноде:

var ws = new WebSocket('wss://api.golos.cf');

Далее мы "открываем" новое соединение с ws голоса.

ws.onopen = function()  
{  
    ws.send(JSON.stringify({  
        id: 1, method: 'call', 'params': ["database_api","set_block_applied_callback", [0]]  
    }));
}

Мы в этой конструкции обращаемся к публичному API.
И получаем новые блоки с помощью set_block_applied_callback.
Подписавшись на получение новых блоков от голоса, мы должны их обработать.

Получать блоки мы будем с помощью конструкции ws.onmessage.

ws.onmessage = function(raw)  
{  
    var data = JSON.parse(raw.data);  
    if(data.method === "notice" && data.params)  
    {  
        var hex = data.params[1][0].previous.slice(0, 8);  
        var height = parseInt(hex, 16);  
        ws.send(JSON.stringify({  
            id: 2,  
            method: 'call',  
            "params": ["database_api", "get_ops_in_block", [height, "false"]]  
        }))
    }
}

Как написано у @vik, чтобы получить номер блока мы должны его распарсить:

var data = JSON.parse(raw.data); 

Далее создадим условие if (если) которое поможет отфильтровать другие сообщения и работать только с теми, метод которых "notice" и в которых есть необходимые данные "data.params"

Далее получаем первые 8 символов, это и есть номер блока и переведём в 16-тиричную систему счисления:

var hex = data.params[1][0].previous.slice(0, 8);  
var height = parseInt(hex, 16);  

Получив номер блока, мы можем обработать его и получить необходимые данные.
Для этого мы вновь отправим в наш вебсокет запрос.
Но уже к методу get_ops_in_block - позволяющие получать операции блока.
Помните условие if(data.method === "notice" && data.params)? Вот давайте также проверим, если id сообщения сокету равно 2, то поработаем с ним.
else if(data.id === 2){ }
Так как операций в блоке может быть много, то проходим их циклом:

data.result.forEach(d => {})

Далее в цикле получим тип операции, нам нужен comment.

if(d.op[0]=='comment'){

Запишем в переменную данные из блока

var data_block = d.op[1];

Далее проверим, есть ли у записи parent_author, если нет, то это комментарий, и он пока не нужен.

if(data_block.parent_author != '') { }

Если в блоке был пост - добавим его на нашу страницу.

var blocks = document.getElementsByClassName('container-block')[0];

var n_div = document.createElement('div');  
n_div.className = 'block';  
metaData = JSON.parse(data_block.json_metadata);  
var im = '';  
if( typeof metaData.image != 'undefined' ){
    im = "<img src='"+metaData.image+"'/>";  
}  
n_div.innerHTML = "<a href='https://golos.io/@"+data_block.author+"/"+data_block.permlink+"'>" +  
   im+"<p>" \+ data_block.title  +"</p></a>";  
n_div.innerHTML += "<span class='author'><a href='https://golos.io/@"+data_block.author+"'>@"+data_block.author+"</a></span>"  
blocks.appendChild(n_div);

Запишем в переменную элемент div с классом container-block. Далее создадим новый элемент div с классом block, внутри которого будет ссылка на пост и ссылка на автора.

metaData = JSON.parse(data_block.json_metadata);

Распарсим JSON-данные блока json_metadata, чтобы получить потом путь к фото и проверим её наличие

if( typeof metaData.image != 'undefined' ){
    im = "<img src='"+metaData.image+"'/>";  
} 

Проект расположен по ссылке chemnote.ru

И чтобы было более понятно, выложу листинг шаблона и js скрипта

Материал подготовлен автором @zheev

0
168.470 GOLOS
На Golos с August 2017
Комментарии (4)
Сортировать по:
Сначала старые