OurSQL — реплікація баз даних MySQL із використанням Blockchain

Я — Роман Гелемб’юк з Івано-Франківська. Уже більше 17 років займаюся програмуванням. Основні технології — PHP та Golang. Як порядний IT-шник я маю свої pet-проекти. Наразі мене цікавлять децентралізовані бази даних та блокчейн-технології.

Хочу розповісти про свій проект OurSQL. Це, свого роду, розширення MySQL, яке дозволяє створити децентралізовану базу даних без вузлів із «особливими» правами.

Ідея

Спочатку була ідея створити децентралізовану платформу для громадянського суспільства. Щось типу соціальної мережі, але децентралізовану, без «адміна», «власника» і модераторів, із можливостями вести конструктивний діалог, водночас.

Першою прийшла ідея використати блокчейн як базу, але весь механізм виглядав занадто складним. Потім ідея еволюціонувала в більш вузьку — створити універсальну платформу для децентралізованих баз даних. А тоді вже на цій базі можна буде робити все інше, концентруючись лише на бізнес-логіці самої соціальної мережі.

Огляд готових рішень для децентралізованих ДБ не дав результатів, фактично є лише BighainDB (на базі MongoDB). Насправді ж вона не виконує обіцяного, хоч і є розрекламованою та популярною. Слід відзначити проект Hyperledger.org, який у той час видався мені занадто складним для використання. Напевно, для корпорацій він буде найкращим вибором, але не для малих компаній чи одинаків.

Процес розробки

Задача була створити інструмент для реплікації баз SQL-даних повністю децентралізованим способом, без будь-яких master вузлів.

Вибір технології був простим. Поки що єдиним рішенням, яке довело свою ефективність для таких задач, є Blockchain. Тому я почав вивчати цю технологію на прикладі створення криптовалюти. Для розробки я вибрав Golang. Основна причина — я давно хотів отримати реальний досвід на цій мові програмування із великим проектом.

У результаті написав спрощений клон bitcoin на Golang із нуля. Він робочий, хоча підтримувати я його не планую.

Далі на базі коду democoin був створений OurSQL — проксі-сервер MySQL, який фільтрує SQL-запити, перевіряє можливість виконання, конвертує SQL у блокчейн-транзакції, будує блоки (для блокчейну), відправляє блоки та транзакції іншим нодам (іншим серверам OurSQL в межах однієї бази даних) і ті, в свою чергу, роблять відповідні оновлення у своїх локальних копіях MySQL-баз.

Назва OurSQL народилася сама собою. MySQL — для моєї бази даних, а OurSQL — для нашої бази даних. У процесі довелося вивчити протокол MySQL клієнта, детально розібратися у всіх нюансах шифрування та електронних підписів у різних мовах програмування та бібліотеках та інше.

OurSQL = MySQL + Blockchain: як це працює

OurSQL — це окремий сервер, який має два основні компоненти: MySQL проксі-сервер та власне Blockchain-сервер.

Кожен екземпляр OurSQL («нода») працює із єдиною базою MySQL. У цій базі одночасно зберігаються дані разом зі спеціальними таблицями, у яких збережено інформацію про сам блокчейн. SQL-запити надходять через проксі-сервер і далі аналізуються. Якщо це Update запит, відбувається перевірка можливості виконання такого запиту. Ця перевірка відбудеться згідно з правилами консенсусу, які діють у цій базі даних.

Якщо запит може бути виконаний, він виконається, і на основі цього запиту буде побудована транзакція. Далі все відбувається так само, як і в інших блокчейнах.

Нова транзакція додається до «пулу» транзакцій — тимчасового місця зберігання ще не підтверджених транзакцій. Також ця транзакція буде відправлена до всіх інших відомих нодів. Ті, у свою чергу, перевірять її ще раз і виконають. Коли в пулі набереться достатня кількість транзакцій, буде побудовано блок із допомогою правила Proof of Work (так само, як у біткоін). Нода, яка першою побудує блок, надсилає його всім іншим нодам.

Із допомогою OurSQL можна створити базу даних. Проте сама по собі база даних не є дуже корисною. Як і випадку зі звичайними базами даних, потрібен «інтерфейс». Тобто якись додаток, що буде виконувати основну роботу і зберігати потрібні дані в децентралізованій базі даних.

Сам по собі цей додаток може бути створений із будь-якою технологією, яка вміє зберігати дані в MySQL. Це може бути desktop application чи web application, запущений на локальному сервері.

При написанні коду додатка можна зосередитися виключно на бізнес-логіці, не думаючи про особливості синхронізації змін у базі даних. Просто підключаємося до бази через проксі через стандартну MySQL client бібліотеку, яка є в кожній мові програмування, і вносимо необхідні зміни в базу, коли потрібно. Звичайно, зміни мають відповідати логіці децентралізованої мережі та відповідати правилам консенсусу.

Кожен користувач децентралізованої системи повинен отримати свою копію додатка в «пакеті». Цей пакет включає: MySQL-сервер, OurSQL-сервер, конфігураційний файл із описом правил консенсусу і, власне, сам додаток.

Проте можливим є і створення «легких клієнтів». Тобто додатків, які не містять у собі повноцінної ноди, а працюють із одною із доступних віддалених нод. У цьому випадку доведеться з’єднуватися із віддаленою базою даних. Або робити додатковий «шар» у вигляді REST API.

При цьому виконання будь-яких змін вимагає двох кроків — запит за даними для транзакції, підпис (криптопідпис) даних ключами та виконання ще одного запиту із уже підписаною командою.

Криптовалюта

Кожна база даних створена із OurSQL отримує свою криптовалюту як «побічний ефект». За створення блоку відповідна нода отримує винагороду. Певну кількість одиниць криптовалюти. Потім цю валюту можна переслати на інші «гаманці» (чи адреси, чи публічні ключі). Кожна нода отримує гаманець при створенні, однак можна додавати необмежену кількість інших гаманців. У плані «криптовалюти» все працює, як у bitcoin.

Використання криптовалюти не є обов’язковим. Ці дані можна просто ігнорувати (у майбутньому зроблю можливість відключити взагалі). Проте внутрішня криптовалюта має певні корисні застосування. Наприклад, є можливість вказати «ціну змін» для конкретних типів SQL-запитів та конкретних таблиць. Це один із інструментів контролю над цілісністю бази даних. Оскільки ми говоримо про базу даних, яка може бути доступна для запису анонімним користувачам, завжди є спокуса все витерти або щось лишнє дописати. Один із способів контролю — плата за транзакцію із використанням внутрішньої валюти.

Як OurSQL зв’язаний із bitcoin та ethereum

Ніяк, за винятком використання такої самої технології «блокчейн». Але із конкретними відомими публічними блокчейнами OurSQL ніяк не пов’язаний.

Кожна база даних створена і підтримувана із OurSQL — це повністю окремий, новий блокчейн, що володіє власною криптовалютою, яка працює лише в межах цієї бази даних. Також вона не має відношення до «смарт-контрактів», хоча кожну базу даних та додаток, який її використовує можна розглядати як один великий «смарт-контракт» — єдиний на цьому блокчейні.

Де використовувати OurSQL

OurSQL може підійти для створення практично будь-якого децентралізованого додатка. Тобто якщо немає можливості створити традиційний цетралізований додаток, наприклад, через нестачу довіри до потенційного «адміністратора» цього додатка, є сенс подумати над децентралізованою системою.

Приклади:

  • Децентралізована соціальна мережа, оскільки ми не довіряємо Facebook.
  • Нове покоління фінансових інструментів, які, крім криптовалюти, мають свій внутрішній «суд», «регулятор» та інші «інститути» криптодемократії, адже ми хочемо незалежну світову валюту. Однак перший досвід не дуже успішний, потрібна регуляція та спосіб вирішення конфліктів.
  • Децентралізовані платформи для меритократії.
  • Децентралізовані месенджери (в яких платформа потрібна лише для пошуку контактів, а сама комунікація вже напряму), оскільки традиційні месенджери контролюються спецслужбами.
  • Платформи для «горизонтальних» об’єднань громадян, адже створення традиційних партій чи об’єднань вимагає довіри, а її часто немає.

Blockchain consensus

Алгоритм консенсусу є центральним поняттям в технології blockchain. Наразі OurSQL підтримує лише найпопулярніший і найнадійніший підхід — Proof of Work, аналогічний bitcoin та більшості популярних криптовалют. Кожна база даних має спеціальний файл — ConsensusConfig, у якому описано параметри для Proof of Work: складність пошуку хешу блока, кількість транзакцій у блоці, винагорода «майнеру» в монетах внутрішньої криптовалюти та ін.

Також налаштування консенсусу включають правила змін в базі даних — список таблиць, які не синхронізуються, заборона оновлень певних типів для певних таблиць (наприклад: заборона видаляти рядки із певної таблиці).

Водночас це можливість встановити «вартість» певних операцій у внутрішній валюті, що уможливлює запобігання «несанкціонованого» коригування даних та різного роду флуду даними і т. д.

Також у майбутньому я планую створити підтримку «модуля консенсусу» для кожної бази даних. Відтак розробник бази даних зможе описати максимально гнучкі правила консенсусу використовуючи програмування, а не лише конфігурування певного алгоритму.

Як спробувати OurSQL

Інсталяційного пакету поки що немає. Є 2 способи спробувати, як працює цей сервіс: скомпілювати програму або запустити в Docker-контейнері.

Використовуючи Docker-контейнери, ви можете легко запустити 2 ноди на одній машині та подивитися, як синхронізуються дані.

docker run --name oursql1 -p 9001:8765 -p 9002:8766  -d -it oursql/oursql-server interactiveautocreate -port 9001

Ця команда запустить новий контейнер, у якому створиться нова база даних. Наступна команда створить інший контейнер із додатковою нодою, яка приєднається до першої, утворивши кластер із двох нод.

docker run --name oursql2 -p 9003:8765 -p 9004:8766  -d -it oursql/oursql-server importfromandstart -port 9003 -nodeaddress host.local.address:9001

Використайте MySQL-клієнт, щоб приєднатися до першої ноди на порті 9002 або до другої на порті 9004. База даних має назву BC та користувача blockchain/blockchain. Вносьте зміни в базу даних, використовуючи SQL, і ви побачите, як зміни реплікуються між нодами.

mysql -h 127.0.0.1 -P 9002 -u blockchain -pblockchain BC

mysql -h 127.0.0.1 -P 9004 -u blockchain -pblockchain BC

Також можна підключитися до існуючої демонстраційної бази даних «OurSQL Demo DB».

docker run --name oursql -p 8765:8765 -p 8766:8766 -d -it oursql/oursql-server importandstart -port 8765 -nodeaddress 109.251.62.4:8765

mysql -h 127.0.0.1 -P 8766 -u blockchain -pblockchain BC

Деталі про роботу із цією базою можна знайти в блозі проекту.

Подальші кроки

Перше — додати можливість створення модуля консенсусу для децентралізованої бази. Наразі можна робити лише конфігураційний файл, у якому описано прості правила для Proof of Work консенсусу та правила для роботи із таблицями в базі.

Проте такий підхід має суттєві недоліки. Потрібна можливість запрограмувати правила, зробити їх більш гнучкими.

Тобто для кожної конкретної децентралізованої бази даних, підтримуваної на OurSQL, можна буде запрограмувати модуль (швидше за все на мові Golang), у якому буде реалізовано логіку роботи і можливих змін у цій базі, рівнів та прав доступу для кожного користувача.

Друге — створити декілька додатків, які використовують OurSQL, щоб продемонструвати можливості її роботи, певну найпростішу децентралізовану, соціальну мережу або систему прийняття рішень голосуванням. Реєстрація в такій системі буде здійснюватися за запрошеннями від кількох інших учасників.

Leave a Reply

Your email address will not be published. Required fields are marked *