Храним контент сайта в блокчейне Голос
Эксплуатируем Блокчейн Голоса по полной, или как создать коммерческий сайт с размещением в Блокчейне: инструкция от незрячего пользователя @denis-skripnik
Здравствуйте. Несколько дней назад мне пришла в голову идея, что Блокчейн - это децентрализованная база данных, а значит можно размещать не только посты блогов, но и любые данные, например, страницы сайтов. О том, как разместить в Блокчейне Голоса коммерческий сайт и вывести его, и пойдёт речь в этой статье.
Способ 1: Размещение всего HTML кода
Включая doctype, head и так далее. Этот метод плох тем, что не позволяет использовать визуальные редакторы, а также есть вероятность, что при публикации лишние теги, типа html и head, будут удалены. Давайте попробуем это сделать прямо сейчас. Заходим в Goldvoice, создаём аккаунт (У меня это @golos-site) и добавляем новый пост:
- Заголовок: "Главная" (Любой);
- Текст на скриншоте (Страница редактирования поста в Goldvoice):
Теперь давайте попробуем вывести эту страницу у себя на сервере. Алгоритм следующий:
- Создаём html/php файл с кодом, отвечающим за вывод текста поста, не подключая заголовок и т. п.;
- Проверяем работу.
Я буду использовать библиотеку @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 = new CommandQueryData();
// golos-site - автор, glavnayaglavnaya - permlink
$data = ['golos-site','glavnayaglavnaya'];
$commandQuery->setParams($data);
$connector = new GolosWSConnector();
$command = new GetContentCommand($connector);
$res = $command->execute($commandQuery);
echo $res['result']['body']; // Подключаем 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
Или на скрине:
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
Или скрин:
https://i.imgur.com/ycQkKKK.png
header.php
Шапка сайта зависит от конкретного веб-сайта, поэтому расскажу о двух вариантах:
- Создаём файл header.php и вручную прописываем там всё необходимое или, если найдёте способ, как подгружать список ссылок на только нужные страницы из Голоса, можно прописать то же меню на php, как в популярных движках.
- Этот вариант - это создать пост header и прописать всё там. Преимущество в том, что можно использовать визуальный редактор: просто добавляете всё так, как вам больше нравится, и сохраняете.
Опишу второй вариант подгрузки header.
Для начала создадим файл header.php
и добавим туда следующее:
<header class="header">
<?php
require 'vendor/autoload.php';
use GrapheneNodeClient\Commands\CommandQueryData;
use GrapheneNodeClient\Commands\DataBase\GetContentCommand;
use GrapheneNodeClient\Connectors\WebSocket\GolosWSConnector;
$commandQuery = new CommandQueryData();
$data = ['golos-site','header'];
$commandQuery->setParams($data);
$connector = new GolosWSConnector();
$command = new GetContentCommand($connector);
$res = $command->execute($commandQuery);
echo $res['result']['body'];
?>
</header>
Теперь создадим пост с заголовком header и перенесём часть между тегами header в пост (Вы можете прописать там всё, что захотите).
После этого я перешёл на сайт - всё работает.
sidebar.php
Следующий блок - это сайдбар.
Просто копируем header.php, переименовываем в sidebar.php, заменяем в массиве $data header на sidebar, добавляем другой html код, соответствующий сайдбару. Далее создаём пост с сайдбаром.
<aside class="right-sidebar">
<?php
require 'vendor/autoload.php';
use GrapheneNodeClient\Commands\CommandQueryData;
use GrapheneNodeClient\Commands\DataBase\GetContentCommand;
use GrapheneNodeClient\Connectors\WebSocket\GolosWSConnector;
$commandQuery = new CommandQueryData();
$data = ['golos-site','sidebar'];
$commandQuery->setParams($data);
$connector = new GolosWSConnector();
$command = new GetContentCommand($connector);
$res = $command->execute($commandQuery);
echo $res['result']['body'];
?>
</aside>
</div>
Пост на golsvoice:
Проверка на сайте: появился. Правда пока под футером, но это исправимо.
footer.php
<footer class="footer">
<?php
require 'vendor/autoload.php';
use GrapheneNodeClient\Commands\CommandQueryData;
use GrapheneNodeClient\Commands\DataBase\GetContentCommand;
use GrapheneNodeClient\Connectors\WebSocket\GolosWSConnector;
$commandQuery = new CommandQueryData();
$data = ['golos-site','footer'];
$commandQuery->setParams($data);
$connector = new GolosWSConnector();
$command = new GetContentCommand($connector);
$res = $command->execute($commandQuery);
echo $res['result']['body'];
?>
</footer>
</div>
</body>
</html>
Вот так, друзья. Почти всё сделали. Теперь внесём некоторые изменения.
Правки
- В файле head.php добавляем body и div с классом wrapper (В посте "Главная" удаляем);
- В content.php добавляем открывающий div с классом "middle", открывающий и закрывающий тег main с классом content, а также div с классом container.
Всё.
Теперь давайте для проверки работоспособности адресов вида http://goloses.ru/?page=o-kompanii создадим в Голдвойсе страницу "О компании" с permlink o-kompanii
.
Работает: http://goloses.ru/?page=o-kompanii
А теперь на сайте:
Последние штрихи
Давайте создадим ЧПУ при помощи .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.