Храним контент сайта в блокчейне Голос


Эксплуатируем Блокчейн Голоса по полной, или как создать коммерческий сайт с размещением в Блокчейне: инструкция от незрячего пользователя @denis-skripnik

Здравствуйте. Несколько дней назад мне пришла в голову идея, что Блокчейн - это децентрализованная база данных, а значит можно размещать не только посты блогов, но и любые данные, например, страницы сайтов. О том, как разместить в Блокчейне Голоса коммерческий сайт и вывести его, и пойдёт речь в этой статье.

Способ 1: Размещение всего HTML кода

Включая doctype, head и так далее. Этот метод плох тем, что не позволяет использовать визуальные редакторы, а также есть вероятность, что при публикации лишние теги, типа html и head, будут удалены. Давайте попробуем это сделать прямо сейчас. Заходим в Goldvoice, создаём аккаунт (У меня это @golos-site) и добавляем новый пост:

  • Заголовок: "Главная" (Любой);
  • Текст на скриншоте (Страница редактирования поста в Goldvoice):
    Код страницы в редакторе Goldvoice

Теперь давайте попробуем вывести эту страницу у себя на сервере. Алгоритм следующий:

  1. Создаём html/php файл с кодом, отвечающим за вывод текста поста, не подключая заголовок и т. п.;
  2. Проверяем работу.

Я буду использовать библиотеку @php-node-client, так как она работает напрямую с Блокчейном, что позволяет не нагружать базу данных Golos.Sql, как это было бы в случае с использованием @golosapi2. Посмотреть инструкцию по установки выбранной мной библиотеки можно на github
У меня сервер настроен, поэтому просто загружаю библиотеку и создаю файл index.php. Как загружал php-node-client, показывать не буду, но вот исходник файла покажу:

<?php

require 'vendor/autoload.php'; // Подключаю файл, содержащий все зависимости скрипта php-node-client

use GrapheneNodeClient\Commands\CommandQueryData;
use GrapheneNodeClient\Commands\DataBase\GetContentCommand;
use GrapheneNodeClient\Connectors\WebSocket\GolosWSConnector;

$commandQuery  CommandQueryData();

// golos-site - автор, glavnayaglavnaya - permlink
$data >setParams($data);

$connector = new GolosWSConnector();

$command = new GetContentCommand($connector);

$res = $command->execute($commandQuery);

echo $res['result']['body']; // Подключаем html код
?>

В результате получаем такую страницу:
Страница, сгенерированный html шаблон

Всё. Как вы видете, страница(то чо в белом блоке пост на голосе) подгрузилась из Блокчейна Голоса. Yahoo!

Способ 2: динамический сайт

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

1. Структура

Чтобы подгружать другие страницы (Не только главную), надо создать условие, проверяющее get параметры, и выводящее в зависимости от результата данные.

Файл index.php

Этот файл будет содержать шаблон, подключающий другие файлы: head.php, header.php, content.php, sidebar.php, footer.php:

<?php
require 'head.php';
require 'header.php';
require 'content.php';
require 'sidebar.php';
require 'footer.php';
?>

Теперь создаём каждый из файлов.

content.php

Начали с этого файла, так как он является основным, поскольку в нём будут подгружаться посты-страницы. Поскольку размер оказался довольно большим, вот ссылка на код: https://pastebin.com/JTu9mhGf
Или на скрине:
Скриншот файла content.php
https://i.imgur.com/uiuCCHr.png

head.php

В начале я хотел разместить head секцию в блокчейне, но потом понял, что это не совсем удобно, да и все сохранённые изменения в блокчейне сохраняются, что не есть Гуд для секции, которая относится к шаблону. К тому-же, этот вариант требует вставки кода php, а его может не пропустить клиент goldvoice и golos.io.
Но я решил для теста изменить пост "Главная" с учётом потребностей: добавил в title

<?php echo $res['result']['title']; ?>

, но ничего не вышло. Также попробовал '.$res['result']['title'].', но в обоих случаях отображалось то, что я ввёл, а не результат.
Может чего-то я упускаю, но факт на лицо: придётся делать php файл с выводом получения данных поста. С другой стороны так даже лучше: больше напоминает то, как делается в CMS.

Вот ссылка на исходный код файла: https://pastebin.com/xWbrRcMK
Или скрин:
Содержимое head.php
https://i.imgur.com/ycQkKKK.png

header.php

Шапка сайта зависит от конкретного веб-сайта, поэтому расскажу о двух вариантах:

  1. Создаём файл header.php и вручную прописываем там всё необходимое или, если найдёте способ, как подгружать список ссылок на только нужные страницы из Голоса, можно прописать то же меню на php, как в популярных движках.
  2. Этот вариант - это создать пост header и прописать всё там. Преимущество в том, что можно использовать визуальный редактор: просто добавляете всё так, как вам больше нравится, и сохраняете.

Опишу второй вариант подгрузки header.
Для начала создадим файл header.php и добавим туда следующее:


<?php

require 'vendor/autoload.php';

use GrapheneNodeClient\Commands\CommandQueryData;
use GrapheneNodeClient\Commands\DataBase\GetContentCommand;
use GrapheneNodeClient\Connectors\WebSocket\GolosWSConnector;

$commandQuery  CommandQueryData();

$data >setParams($data);

$connector = new GolosWSConnector();

$command = new GetContentCommand($connector);

$res = $command->execute($commandQuery);

echo $res['result']['body'];
?>
<!-- .header-->

Теперь создадим пост с заголовком header и перенесём часть между тегами header в пост (Вы можете прописать там всё, что захотите).
Пост header в Goldvoice

После этого я перешёл на сайт - всё работает.

sidebar.php

Следующий блок - это сайдбар.

Просто копируем header.php, переименовываем в sidebar.php, заменяем в массиве $data header на sidebar, добавляем другой html код, соответствующий сайдбару. Далее создаём пост с сайдбаром.

<aside>
<?php

require 'vendor/autoload.php';

use GrapheneNodeClient\Commands\CommandQueryData;
use GrapheneNodeClient\Commands\DataBase\GetContentCommand;
use GrapheneNodeClient\Connectors\WebSocket\GolosWSConnector;

$commandQuery  CommandQueryData();

$data >setParams($data);

$connector = new GolosWSConnector();

$command = new GetContentCommand($connector);

$res = $command->execute($commandQuery);

echo $res['result']['body'];
?>
</aside><!-- .right-sidebar -->

<!-- .middle-->

Пост на golsvoice:
На Goldvoice

Проверка на сайте: появился. Правда пока под футером, но это исправимо.

footer.php


<?php

require 'vendor/autoload.php';

use GrapheneNodeClient\Commands\CommandQueryData;
use GrapheneNodeClient\Commands\DataBase\GetContentCommand;
use GrapheneNodeClient\Connectors\WebSocket\GolosWSConnector;

$commandQuery  CommandQueryData();

$data >setParams($data);

$connector = new GolosWSConnector();

$command = new GetContentCommand($connector);

$res = $command->execute($commandQuery);

echo $res['result']['body'];
?>
        <!-- .footer -->

<!-- .wrapper -->

Вот так, друзья. Почти всё сделали. Теперь внесём некоторые изменения.

Правки

  1. В файле head.php добавляем body и div с классом wrapper (В посте "Главная" удаляем);
  2. В content.php добавляем открывающий div с классом "middle", открывающий и закрывающий тег main с классом content, а также div с классом container.

Всё.


Вся страница

Теперь давайте для проверки работоспособности адресов вида http://goloses.ru/?page=o-kompanii создадим в Голдвойсе страницу "О компании" с permlink o-kompanii.
Работает: http://goloses.ru/?page=o-kompanii
Пост о компании на Goldvoice

А теперь на сайте:
Страница о компании на сайте

Последние штрихи

Давайте создадим ЧПУ при помощи .htaccess:

Options -Indexes

<IfModule mod_rewrite.c>
    RewriteEngine On # Включение режима
    RewriteRule ^([0-9-a-z.]+).html/?$ index.php?page=$1 [NC,L]
</IfModule>

Всё. Теперь страницы доступны и по адресу http://goloses.ru/o-kompanii.html, что гораздо круче, чем get url.

Применение

Вы можете делать сайты компаний, сайты интернет-магазинов, представляя товары в виде постов, а отображать их при помощи уникальных тегов, к примеру в моём случае golos-site-telephones - категория для мобильных телефонов. Но я пока не планирую такую или иную категорию делать.
Способы оплаты, корзину и т. п. подключать при помощи Pokupo.

Второй фичей является возможность вывода комментариев к постам из Голоса таким-же методом, как и посты, только с использованием GetContentRepliesCommand. Это открывает уникальные возможности:

  • Вы можете собирать отзывы от клиентов. Они будут регистрироваться на Голосе, голосовать за ваши товары и оставлять комментарии, делая их популярнее на платформе Golos, а также повышая репутацию аккаунта компании;
  • Вы можете создать страницу с отзывами о компании и выводить комментарии из Голоса там.

Всё это создаёт невероятные возможности для развития Голоса, как универсальной платформы для публикации данных! А значит, Блокчейн будет жить долго, несмотря на какие-либо встряски.
А когда появится возможность создавать токены, можно будет выделить отдельный токен для проектов подобного типа, чтоб они не уменьшали пул наград. Другой вариант: не давать возможность добавления апвоутов клиентам, но такой подход уменьшает возможность повышения репутации бизнеса, что тоже не есть хорошо.

Заключение

Надеюсь, идея моя вам пришлась по вкусу. Интересно, кто-нибудь будет её реализовывать, и что вы вообще об этом думаете?

Я скорее всего так буду подгружать свой блог на https://denis-skripnik.name/

  • Header, sidebar и footer с технического аккаунта @golos-site или подобного;
  • А в head секции и контентной части будет загружаться контент из моего блога @denis-skripnik.

Буду рад очень комментариям, апвоутам и репостам. Хочется Голос видеть и в качестве платформы для хранения страниц коммерческих (и не только) сайтов.

P. S. Подобную схему, думаю, можно реализовать и в Steem. Так что если Голос эксплуатировать не хотите, можно воздействовать на блокчейн Steem.


Comments 21


Спасибо, за Ваш труд.

14.01.2018 09:43
0

Пожалуйста.

14.01.2018 09:47
0

А значит, Блокчейн будет жить долго, несмотря на какие-либо встряски.

Учитывая, что блоки генерируются 21 делгатом они и являются хранителями распределенной базы, на мой взгляд этого количества мало, для "долго" и "надежно".
Или я что то не так понимаю и база блокчейна Голос хранится на большем числе нод? Тогда где, как и кем они поддерживаются и какую имеют от этого выгоду и стимулы, те кто их разворачивает и поддерживает?
Просто вижу вы понимаете как оно все устроено, поэтому спрашиваю.

14.01.2018 10:12
0

Суть не в количестве Нод, а в том, что ноду может развернуть каждый, что уменьшает вероятность удаления данных. Даже если кроме вас никто Ноды держать не будет, все равно сможете сохранить данные. Да, бекапы делать надо в любом случае (О том, как я буду это делать, напишу отдельную статью), но есть большая вероятность, что в случае закрытия проекта Голос или уменьшения количества держателей Нод до одного/нуля, найдутся те, кто решит создать новый Блокчейн на базе Голоса со всеми данными отсюда, что позволит сохранить страницы вашего сайта.

Что касается количества держателей Нод, я тоже не совсем в этом разбираюсь: знаю лишь, что подписывать блоки могут держатели из топ 21, а остальные просто держат Ноду, обеспечивая существование сети, а их нитак уж и мало.
За подписывание блока, кажется, получают они вознаграждение.

14.01.2018 10:43
0

Если кто-то из этих 21 делегатов отвалится - их места займут 22, 23 и т.д.

14.01.2018 15:15
0

И если все 21 или хотя бы большая часть будут в сговоре, то нежелательный контент не будет пропущен в blockchain?

28.01.2018 22:53
0

Если я правильно понимаю, то 21 топ делегат должны подписать блок чтобы он гарантированно попал в сеть.

30.01.2018 05:41
0

Ч думал на эту тему и придумал другую структуру.
В голос щаписывается сайт рпботающий с апи голоса нп js. Первач загрузка и распаковка идет из бч, а дальше сам сайт работает с бч без посредников)

14.01.2018 10:24
0

Тоже хороший вариант.
Мне просто привычнее с php работать, а так вообще можно, используя golos.js, вывести данные подобным образом, что позволит размещать сайты на хостингах без поддержки php и mysql или на том-же Github pages. Другое дело, что непонятно, как сделать динамическую подгрузку страниц в зависимости от url, как это реализовано в моём примере. Всё-таки создание отдельных html файлов для каждой страницы не очень удобно.

Можно также и ваш вариант использовать.

14.01.2018 10:37
0

Ну это, по сути, уже смарт-контракт. А так для распаковки же что-то нужно - клиент какой-то специфический, наверно.

14.01.2018 20:38
0

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

14.01.2018 20:37
0

Сам блокчейн вряд ли. Скорее это могут делать сами клиенты блокчейна Голос. Во всяком случае все использованные теги в шаблоне не обрезались.
Да и шапку, сайдбар и подвал можно с помощью визуального редактора Goldvoice делать, что исключит вариант с несовместимым кодом.

15.01.2018 00:05
0
15.01.2018 15:52
0

Ок, @denis-skripnik!

роботы @gemini, @btc-e и @upbot проголосовали за пост: Храним контент сайта в блокчейне Голос

15.01.2018 15:53
0

Подскажите а можно ли на блокчейне делать поиск, выборку или анализ, построение баз данных, например тех же телефонов или результат просто информация и надо знать что и где искать?

06.02.2018 07:22
0

Поиск, выборку и анализ делать нельзя, как это делается в Sql.
Можно, используя API, взаимодействовать с Блокчейном. К примеру, получать все посты определённого пользователя.
Как точно там всё работает, не знаю.

P. S. Возникла идея: а что если загрузить в виде новых постов файлы базы Mysql frm, MYD, MYI и подключить их? Ведь тогда можно будет обрабатывать данные. Вот только изменения вносить надо будет используя функции редактирования поста в библиотеке, так как иначе не получится редактировать информацию в вашей новой БД напрямую. Правда не знаю, как они подключаются на реальном сервере.

06.02.2018 07:54
0

спасибо

06.02.2018 11:56
0

Пожалуйста.

06.02.2018 12:05
0

Можно. Блокчейн - это ведь просто распределённое хранилище данных, по сути.

09.02.2018 04:19
0