Добрый день!
Восьмого августа 2018 г. во время общения в режиме Discord от команды Golos•Core было озвучено предложение по осуществлению транзита блокчейна Golos на кодовую базу форка блокчейна EOS. Настоящая статья содержит описание технической реализации этого транзита.
На рисунке 1 схематично показано взаимодействие узла (далее — нода) блокчейна Golos с другими нодами и клиентами этого блокчейна.
Рисунок 1 - Схема взаимодействия ноды блокчейна Golos
Следует заметить, что схема является упрощенной и содержит ряд обобщений, чтобы сконцентрировать внимание на основных моментах.
- Взаимодействие нод осуществляется по специальному протоколу, представляющим собой двусторонний обмен подписанными блоками, а также отложенными транзакциями, еще не включенных в подписанные блоки.
- Взаимодействие клиентов с нодой Golos осуществляется с помощью посылок двух типов сообщений, в том числе:
- Отправление подписанных транзакций с целью изменить состояние блокчейна. Такое взаимодействие является односторонним, так как клиент получает ответ либо в виде подтверждения об успешном принятии транзакции, либо в виде сообщения об ошибке в передаче данных.
- Обработка запросов пользователей по жестко заданному алгоритму с использованием API-плагинов, содержащих большой по объему код прослойки. Возможности клиентов ограничены тем набором функций, что предоставляются нодой Golos.
После получения подписанных блоков и транзакций нода Golos передает данные в подсистему database, которая функционально делится на следующие части:
- evaluators - множество обработчиков операций из подписанных транзакций, которые необходимо выполнить в текущем состоянии блокчейна. Например, после публикации пользователем нового поста будут выполняться следующие действия:
- Подписанная транзакция, содержащая операцию comment_operation, будет передана от клиента к ноде. На первом этапе будет выполнена проверка соответствия публичных частей ключей из сигнатур транзакции, тем операциям, что включены в транзакцию.
- Операция будет передана подсистеме database, где будет выбран нужный обработчик из подсистемы evaluators. Далее обработчик в тестовом режиме выполнит операцию.
- В случае отсутствия ошибок на этапах проверки транзакции, подписанная транзакция будет включена в список отложенных транзакций, а также затем в следующий подписанный блок. Для этого она будет передана всем остальным нодам блокчейна.
- blocklog - файл, содержащий всю цепочку подписанных блоков. Сохранение блока в файл blocklog происходит после принятия этого блока как неоткатываемого. В файле blocklog.index хранятся позиции подписанных блоков для быстрого доступа к ним в следующих случаях:
- блок запрашивается другой нодой для процедуры синхронизации;
- блок запрашивается клиентом цепочки через методы плагина databaseapi
- chainbase - используется для текущего состояния системы, в состав которой входит множеством таблиц и индексов, которые сохраняются в файле разделяемой памяти sharedmemory.bin. Данные внутри файла хранятся в бинарном формате и представляют собой снимок оперативной памяти. Во время перехода с одной версии ноды на другую, а также во время некорректного завершения процесса формат данных не будет соответствовать формату, который понимает нода. В этом случае требуется выполнить процедуру “replay” - повторно выполнить все операций, которые были совершены за все время жизни цепочки.
Транзит блокчейна Golos на кодовую базу форка блокчейна EOS предусматривает миграцию следующих компонентов:
- Данных состояния системы chainbase - файл sharedmemory.bin
- Части функциональности из подсистемы evaluators - обработчиков тех операций, которые необходимы для публикации постов, голосования за посты, а также для выплаты за опубликованные посты.
Решение по остальным частям системы:
- Большая часть функциональности будет унаследована от блокчейна EOS, в том числе:
- Сетевая подсистема;
- Алгоритм согласования данных Byzantine Fault Tolerance (BFT);
- Машина смарт-контрактов WebAssembler;
- Операции, связанные с трансфером активов, а также другие операции, ранее реализованные в виде смарт-контрактов в блокчейне EOS.
- Большую по объему часть кода API подсистему предусматривается упростить и реализовать в виде внешней БД, предоставляющей широкие возможности для доступа к данным.
Транзит предлагается осуществить по схеме, упрощенный вид которой приведен на рисунке 2.
Рисунок 2 - Схема транзита блокчейна Golos в форк блокчейна EOS
С целью упрощения процедуры транзита блокчейна Golos в форк блокчейна EOS предлагается использовать базу данных (БД) состояния системы (State) в качестве генезиса новой системы. Это позволит избежать транзит всех подписанных блоков, реализация пересылки которых потребует больших трудозатрат.
В БД состояния системы будет хранится вся актуальная информацию о сообществе Golos, в том числе:
- Все пользователи системы;
- Все балансы текущих пользователей;.
- Все посты и голосования за посты пользователей;.
- Иная информация, которая на момент транзита появится в системе.
Схема на рисунке 2 показывает, что транзит будет осуществляться через общую для обоих блокчейнов БД состояния системы. Алгоритм процедуры транзита будет состоять из следующей последовательности действий:
- Действия на ноде блокчейна Golos:
- Прием транзакций из сети Golos;
- Сохранение подписанных блоков в blocklog блокчейна Golos;
- Сохранение изменений БД состояния системы в общую БД состояния системы блокчейна State;
- Контроль идентичности БД состояния системы в момент перехода блокчейна Golos в блокчейн на базе форка блокчейна EOS. Контроль будет выполняться специальной подсистемой hash методом подсчета хеш-суммы БД состояния системы.
- Действия на ноде форка блокчейна EOS:
- Прием транзакций из сети форка EOS;
- Блокировка всех операций с БД состояния системы до момента транзита (исключение составляет единственная ожидаемая нодой операция - подтверждение перехода);
- Отправление в новый блокчейн операции подтверждения перехода производителями блоков форка блокчейна EOS в момент готовности процедуры транзита;
- Ожидание наступления момента транзита - момента, когда количество производителей блоков, готовых осуществить переход будет равным X.
- Действия на нодах форка EOS: подтверждение и фиксация в блокчейне хеш-суммы генезиса новой системы.
- Действия на ноде блокчейна Golos:
- сохранение в БД состояния системы информации блокирующей работу;
- прекращение приема новых блоков из сети после получения информации о необходимости останова.
- Действие ноды блокчейна форка EOS: снятие блокировки на выполнение операций с БД состояния системы.
- Начало жизненного цикла нового блокчейна.
Для возможного очередного перехода (в будущем) и запуска нового блокчейна без процедуры полного воспроизведения (реплея) блокчейна Golos необходимо будет подсчитать актуальную хеш-сумму БД состояния системы и зафиксировать ее в блоках нового блокчейна.
Критерии выбора алгоритма подсчета хеш-суммы БД состояния системы:
- Поскольку одномоментно посчитать хеш-сумму по всему объему данных сообщества Golos не представляется возможным, то необходимо просчитывать хеш-сумму по мере обновления данных через подписанные блоки блокчейна Golos.
- Хеш-сумма должна быть такова, чтобы ее можно было проверить по результирующему набору данных, без полной информации о всех изменениях, произошедших в БД состояния системы.
С учетом приведенных критериев одним из возможных вариантов является алгоритм разбиения данных на n-арное дерево и каскадным подсчетом результирующей хеш-суммы. Пример процедуры подсчета хеш-суммы для таблицы в виде упрощенной схемы приведен на рисунке 3.
Рисунок 3 - Схема подсчета результирующей хеш-суммы
Алгоритм подсчета хеш-суммы содержит следующую последовательность действий:
- Дробление исходных данных на несколько групп по определенному количеству записей.
- Подсчет хеш-суммы для каждой из групп - hash уровня 1.
- Разбиение множества хеш сумм первого уровня на группы по определенному количеству записей.
- Подсчет хеш-суммы для каждой из групп - hash уровня 2.
- Подсчет хеш-суммы выполнять до тех пор, пока результирующая сумма не будет сведена к одной хеш-сумме последнего уровня.
В случае изменении данных в таблице, когда уже получена результирующей хеш-сумма, необходимо выполнить следующие действия:
- Повторно пересчитать хеш-сумму первого уровня для той группы, данные в которой были изменены.
- Используя готовые хеш-суммы последующих уровней, получить результирующую хеш-сумму по всем данным.
Для осуществления транзита необходимо обеспечить существование общей БД состояния системы. Для реализации данного шага планируется осуществить экспорт данных состояния системы во внешнюю БД. У этого шага есть ряд преимуществ.
- Данные из БД можно извлекать, используя возможности современных СУБД. Благодаря этой возможности отпадает необходимость реализовывать API слой внутри ноды блокчейна (рисунок 1 показывает, что это достаточно большой слой логики в коде ноды).
- Структуру данных в БД можно расширять через добавление новых атрибутов.
- Делать безболезненные снапшоты БД состояния системы, используя инструментарий СУБД.
Как было озвучено на встрече в режиме Discord данные планируется разбить на две категории:
- Категория данных, необходимых для фиксирования консенсуса в системе, в том числе:
- Существование аккаунтов в системе;
- Текущий баланс пользователя в системе;
- Текущие ограничения пользователя в системе;
- Уникальность поста;
- Другая информация.
- Категория больших по объему данных, полное содержимое которых не влияет на консенсус, в том числе:
- Тело постов и комментариев;
- Профиль пользователя;
- Другая информация.
Исходя из категоризации данных на встрече в режиме Discord было озвучено предложение о создании дополнительного хранилища данных (Storage), целостность которого не блокирует работу блокчейна, в котором можно сохранять большие по объему данные. При этом в основной БД состояния системы сохраняются хеш-суммы данных для хранилища.
В блокчейне появляются дополнительные возможности по оптимизации работы с хранилищем, в том числе:
- Передача данных сериями в хранилище по last irreversible блокам. Это позволяет сократить время на процедурах откатов изменений при форках.
- Блокчейну нет необходимости блокировать обработку подписанных блоков из за отсутствия данных в хранилище, так как у самой ноды нет необходимости запрашивать данные из хранилища.
- Блокчейн обеспечивает транспортировку данных от одной ноды блокчейна к другой.
В действительности, простым хранилищем у блокчейна может быть “труба”, в которую блокчейн передает сериями сформированные объекты. Задача клиента - присоединится к “трубе” и обработать данные, передаваемые по этой “трубе”. Другими типами хранилища могут являться как БД, так и файловая система. Такое хранилище может быть шардировано (например, устанавливается нода и настраивается хранилище на шард определенного среза данных. Блокчейн гарантирует транспортировку и в хранилище будут загружаться уже согласованные нодами данные).
В хранилище такого типа данные разделяются на два типа:
- Горячие данные, представляющие собой консенсус системы и которые необходимы для работы ноды блокчейна;
- Холодные данные, представляющие собой дополнительные данные, которые блокчейн доставляет нодам, но которые могут не выделяться на ноде в отдельное хранилище.
На рисунке 4 приведена схема хранения горячих данных в варианте с внешней БД.
Рисунок 4 - Схема хранения горячих данных во внешней БД
В данной схеме консенсус и дополнительные данные хранятся во внешней БД. В технической реализации это могут быть две разные БД, и нода может запрашивать данные из одной из них БД.
На рисунке 5 приведена схема хранения горячих данных в варианте с RocksDB.
Данная схема предусматривает оптимизацию доступа к данным за счет использования узкоспециализированных решений для хранения консенсуса - RocksDB.
Рисунок 5 - Схема хранения горячих данных в RocksDB
В данной реализации нода будет осуществлять дублирование данных консенсуса во внешнее хранилище по принятию неоткатываемых блоков.
Эффективность каждого из вариантов может быть определена непосредственно во время реализации прототипа.
В ходе реализации прототипа системы команда Golos•Core планирует выполнить:
- Реализовать хранение стейта блокчейна Golos в БД.
- Реализовать хранилище для больших по объему данных (постов и комментариев).
- Подобрать параметры генерации и хранения подписанных блоков в форке блокчейна EOS.
- Получить информацию о минимальных требованиях к ноде нового поколения.
На следующем этапе после прототипа будут реализованы:
- Подсчет хеш-суммы БД состояния системы.
- Алгоритм транзита цепочки.
В следующих постах будут обсуждены задачи, связанные с реализацией смарт-контрактов сообщества Golos.
Автор статьи - @andreypf,
team leader команды разработки Golos•Core
Каналы коммуникации с Golos•Core
- https://t.me/goloscoretc (решение технических вопросов, связанных с работой блокчейн, нод, api и др.)
- https://t.me/joinchat/BLwf_A118xQ57nsM1Q4MPA (канал для вноса предложений от комьюнити, обсуждение перехода на кодовую базу EOS)
- https://t.me/golos_tools (решение вопросов по различным интерфейсам и дополнительным инструментам, создаваемым Golos•Core)
- https://t.me/goloscore_analytics (решение вопросов по работе экономики блокчейн, статистическим экономическим данным, аналитике данных)
- https://t.me/goloscoretech (новостной канал, с актуальной информацией от Golos•Core)
- Мы будем очень рады, если вы поддержите делегата @goloscore. Заходите на страничку https://golos.id/~witnesses и проголосуйте за делегата Golos•Core
Спасибо за внимание и хорошего дня!
С уважением,
Команда Golos•Core @korpusenko, @andreypf, @maslenitsa, @muhazokotuha, @zxcat, @mariadia, @annaeq, @anazarov79, @kaynarov, @s-medvedev
Все как я себе и представлял.
Только вопрос вот по этому пункту
Хэши будут в базе данных и храниться? Или как? Зачем надо будет пересчитывать хэш. Ведь состояние данных же финальное, "замороженное".
@ropox, пересчитываться будет до финального состояния, чтоб в каждый момент (на каждом блоке) был хэш базы. это позволит в момент перехода не останавливаться, чтоб просчитать хэш всей базы за раз
@goloscore, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:
теперь более актуальны посты связанные с экономикой.
даже если технически все получится и экономика на будет рабоать, бч сдохнет)
такой вариант хорош только для своего апп, но не для паблик точки) существуют запросы которые могут положить просто бд)
это явно не на лету)
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
neo, amikphoto, vict0r, semasping, ladyzarulem, sterh, anatolich, aleos, nightinga1e, alexxela
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
@goloscore и @andreypf, благодарю за пост. всё понятно написано, с вариантом перехода и тем, что будет при прототипировании, согласен.
Желаю удачи.
@goloscore
спасибо за подробный пост. мне еще разбираться и разбираться! пост очень полезный!
@ladyzarulem огромное спасибо Вам за внимание! :)
@goloscore скажите, а токены EOS на каком-нибудь этапе или действии нужны будут ?
@mikhailal нет же, это будет совсем другой блокчейн
@ropox ну все понятно.. Хотя ни хрена не понятно, но буду пользоваться вашими инструкциями))
@mikhailal нет. текущий стейт пользователей будет перенесен в новую систему.
@goloscore ясно
@goloscore, а подскажете - кто у вас там биржой Битрекс занимается? И прочими биржами. Имею ввиду - листинг токена на биржу, поддержка и прочее подобное.
Я вот что думаю: надо отказываться от торговой пары BTC-Golos на всяких там Битрексах, ибо связь токенов Голос с битком - очень плохо влияет на курс. Биток падает - голос за ним летит на дно, потому что многие там торгуют в паре BTC-Golos и зачем то ассоциируют токены Голос с курсом битка.
То есть, есть сильная зависимость токенов Голоса от курса биткоина.
Нужно создавать на Битрексах и прочих биржах торговые пары с usd или гривнами или что там ещё есть.
Вот как на рудексе (биржа), допустим - там торги голосом за битрубли идут, обходя стороной битки. То бишь, торговать на биржах нужно в паре с валютой не подверженой такой сильной волатильности как биткоин.
Тогда курс токенов Голосов не будет подвержен такому сильному шторму, как в случае с битком.
На текущий момент - курс Голоса уже составляет 2 рубля, хотя - никаких предпосылок нет к тому, чтобы токен так сильно дешевел... Всё это падение происходит в связи торгов Голосами с оглядкой на курс битка, как мне кажется.
Да, чё уж там мелочится. Надо вообще GOLOS удалить со всех бирж, и тогда он будет бесценен.
@litrbooh причём тут удалить с бирж? Где я про удаление говорил? Я про то, что надо отходить от пары BTC-Golos и торговать с нормальными парами, которые не подвержены такой волатильности: usd, гривны, рубли.
Допустим, на "Живом Журнале" есть тоже свой внутренний токен, его продают за usd - и курс там всегда более-менее стабильный, за исключением редких моментов с подорожанием доллара.
А мы зачем торгуем Голосом за биток? Какой в этом смысл? Биток и провоцирует снижение курса Голоса, как я думаю. Биток давно уже потерял свой хайп и будет только падать и падать дальше... Голос-токены смотрят на биток и тоже падают, хочешь сказать, что это не так?
@aleos
ну так ЖЖ ждет тебя, иди заработай там токен их и продавай за баксы
@litrbooh понятно всё с тобой. Разговор ни о чём. Потроллить пришёл и показать своё "чувство юмора"? Если не согласен с моей теорией - опровергни её, но ты ж опровергнуть не можешь, видимо.
@aleos
а что за теория?! Про эту речь?
А в чем сейчас смысл покупки токенов голоса, что на них можно сделать-то?!
@yurgent71 если рассуждать по вашему, типа "А в чем сейчас смысл покупки токенов голоса, что на них можно сделать-то?!" - то хочу спросить, в чём смысл покупки был когда он по 5 рублей стоил не так давно (при линейке уже)?!
Смысл в чём? Люди покупали и по 5, значит это кому-то надо было - СГ наращивали, кто-то на ставки ТОТО ставит и т.д.
Так что, не будем о смысле покупки рассуждать, тут тема о другом.
А я отвечу - смысл покупки по цене X получить потом прибыль, продав по цене x*y (где y > 1). Возможно, есть и меценаты, но это очень малый процент. В основном покупают для того, чтобы заработать. Но заработать на токенах, число которых все время растет и которые распределяются между авторами, большинство из которых их сразу продают, очень и очень сложно. Надо сделать так, чтобы у людей было желание не продавать токены, а копить. Но для этого они должны приносить какой-то доход.
@aleos
ты написал просто бред от начала до конца, какой смысл это опровегать, всё равно что убеждать последователей плоской земли, в том что она круглая...
@litrbooh ну да, а в чём именно бред объяснить не можешь) "Хороший" диалог! Вот господин @chugoi согласен со мной, что курс токенов Голос подвержен валатильности битка, то есть - есть сильная зависимость именно от битка. Глянь его пост - https://golos.id/golos/@chugoi/golos-medvezhi-dni
Вот я и говорю - нахрена нам эта зависимость от битка, если можно торговаться с другими стабильными валютами - которые не скачут туда-сюда как биток. Биток дальше будет только падать... Это понимаешь или нет? Хочешь Голос по 1 рублю? Скоро так и будет, видимо. А я хочу продавать его рублей по 5, допустим, но если дальше останутся торги с битком, то навряд ли мы в ближайшее время увидим серьёзный рост курса.
@aleos
продавать он по 5 рублей хочет :)
Ты иди купи сначала пару милионов голосов по 5 рублей, а потом продавать будешь. Пока будешь покупать заодно увидишь, как курс растет :)
У нас же есть внутренняя биржа, зачем ещё какие-то? )
@aleos не сейте смуту в умах пользователей далеких от рынка. Чтобы голос торговался к фиатным парам на биржах - нужна очень большая ликвидность и объемы.
Чтобы при этом убрать пару с BTC и оставить ТОЛЬКО фиатные пары - нужна феноменальная ликвидность и эксклюзивные договоренности как с биржами, так и с регуляторами, настолько, что будет вообще все равно с какими парами он торгуется.
А на данный момент у голоса нет даже маркет мэйкера, равно как и маркет тейкера и места эти занимать никто не хочет.
@vik, тогда почему голос-токены довольно успешно торгуются на том же рудексе за битрубли? Если кто не в курсе: битрубль - это аналог обычного русского рубля. Это не фиатная пара, а такая-же криптовалюта, как и остальные, просто её стоимость всегда фиксирована и равна 1 рублю.
Объёмы торгов там не очень большие: по несколько тысяч в день.
На Битрексе и кое-где ещё есть нечто вроде USDT (аналог доллара, равный 1 доллару), это тоже типа криптовалюты.
Вот об этом я и говорю, а не о фиатных парах ;) И смуту я никакую не сею, а говорю об очевидных вещах: биток провоцирует падение голос-токенов, и нужно с этим явлением что-то делать, выходить из ситуации как-то.
С моим мнением некоторые согласны.
Крайне успешно:
Ок, зайдем с другой стороны: представьте каждую торговую пару, как отдельный рынок. Что собственно так и есть. Вы хотите выкинуть голос с самого крупного рынка в альтах (btc) и оставить его на заброшенном рублевом?... :)
Вик, так я и не утверждаю, что на рудексе торги сильно объёмные и успешные. И если подумать - почему так (не объёмные торги на рудексе), то можно догадаться, что большая часть торгов приходится на битрексы разные и пары типа BTC-голос.
Предположим, пары BTC-голос не будет вообще, то торги за битрубли на том же рудексе увеличаться, потому что люди будут уходить с битрекса и идти на рудекс. Логично? Думаю, да.
Я пока ничего не хочу, да и не в моих полномочиях это :) Я лишь говорю, что ситуация с битком - не нормальная (он провоцирует падение голоса), и нужно что-то думать-делать на этот счёт... Как один из вариантов: стоило бы подумать о создании на битрексе пары usdt-голос и постепенно уходить от торгов с нестабильным и шатким битком.
@chiliec, флагуешь нахрена? Мой коммент кого-то оскорбил тут? Или тебя лично задел и душевно оскорбил?
Я делюсь своими мыслями по поводу ситуации с курсом, эта ситуация всех Голосян касается - в том числе и тебя.
Не согласен с моим мнением - ну ок, не соглашайся, но флаги лепить не стоит просто так.
Я не просто не согласен, я возмущен. И так всё катится к Ху Ям, а вы вообще всё уничтожить хотите.
@chiliec что за глупости, а?) Каким образом я "хочу уничтожить что-то"? Я пока просто узнаю - есть ли возможность другую пару создать на том же битрексе?
И вы подумайте на досуге - почему оно (курс Голоса) всё катится к ху ям? Да потому, что торгуется в паре с битком, это же очевидно!
Биток падает - голос за ним, потому что курс битка провоцирует и подстёгивает торги токенами Голоса. У определённых товарищей торгующих на Битрексе создаётся паник-сейл в оглядке на курс битка.
Вот я и думаю: нахрена нам торги в паре с нестабильным и сильно волатильным битком, если можно торговать в паре с другими валютами типа usdt или битрубль - не подверженными сильному шатанию?
На рудексе вон торгуют голосами за битрубли, обходя вообще стороной биток. На Куне (украинской бирже) - тоже без битка обходятся, если не ошибаюсь.
Ну вот, торгуют же голосами не за биток, а всё продолжает скатываться. Но в паре с битком хоть какая-то ликвидность есть.
@chiliec не за биток торгуют голосами в малых кол-вах, да и то - с оглядкой на курс с бирж типа Битрекса. А на битрексе торгуют за биток и в больших кол-вах, поэтому основной курс устанавливает именно битрекс.
А не будет битрекса — не будет ни ликвидности, ни курса.