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

5 месяцев назад
74 в vox-populi

Эксплуатируем Блокчейн Голоса по полной, или как создать коммерческий сайт с размещением в Блокчейне: инструкция от незрячего пользователя @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 = 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 код
?>

В результате получаем такую страницу:
Страница, сгенерированный 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 и добавим туда следующее:

<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>(html comment removed:  .header)

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

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

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>(html comment removed:  .right-sidebar )

</div>(html comment removed:  .middle)

Пост на golsvoice:
На Goldvoice

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

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>(html comment removed:  .footer )

</div>(html comment removed:  .wrapper )

</body>
</html>

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

Правки

  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.

Авторы получают вознаграждение, когда пользователи голосуют за их посты.
Голосующие читатели также получают вознаграждение за свой голос.
Порядок сортировки:  Популярное
74
  ·  5 месяцев назад

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

·
67
  ·  5 месяцев назад

Пожалуйста.

39
  ·  5 месяцев назад

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

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

·
67
  ·  5 месяцев назад

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

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

·

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

·
·

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

·
·
·

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

66
  ·  5 месяцев назад

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

·
67
  ·  5 месяцев назад

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

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

·

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

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

·
67
  ·  5 месяцев назад

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

70
  ·  5 месяцев назад

Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
alex2016, t3ran13, one, max-max, galina1, vik, vadbars, nefer, semasping, arystarch, arhangel, yudina-cat, retoldname, polyakov, vika-teplo, mryabinin, graff0x, kertar, ifingramota, oksi-m, prifix, skiexpert, magformers, irimeiff, funt33, iamfrolova, anykeycheg
Поэтому я тоже проголосовал за него!

Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!


Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"


dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:

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

·
67
  ·  4 месяца назад

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

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

·
·

спасибо

·
·
·
67
  ·  4 месяца назад

Пожалуйста.

·
74
  ·  4 месяца назад

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