Як взаємодіяти з блокчейном Ethereum та створити базу даних з Python та SQL

Вступні семінари про blockchain часто починаються з легкої для засвоєння історії однорангової мережі та банківських книг, а потім переходять до кодування смарт-контрактів, що досить різко. Тож замість цього уявіть себе, як ходити в джунглі, і думайте про блокчейн Ethereum як про дивну істоту, яку ви тільки збираєтеся вивчити. Сьогодні ми будемо спостерігати за істотою, взаємодіяти з нею та збирати всі дані про неї в централізований сховище для власного користування.

Налаштування для першої зустрічі

Спочатку вам потрібно буде встановити web3py. Web3py - це бібліотека Python для з'єднання з блокчейн Ethereum. Що потрібно заздалегідь знати, це те, що не існує центральної адміністративної системи, з якої можна завантажувати дані. Взаємозв'язані вузли ("однорангові"), які діляться ресурсами між собою, зберігають перевірену копію даних (або її частини). Мережа виконує протокол Ethereum, який визначає правила взаємодії вузлів один з одним та / або розумні контракти через цю мережу.

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

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

Перейдіть до Інфури та зробіть власний безкоштовний рахунок, щоб отримати доступ до такого розміщеного вузла. Коли ви закінчите, ви побачите список мереж, до яких ви могли підключитися: магістраль (основний блокчейн Ethereum) та купу тест-мереж, які є в основному для перевірки ваших розумних контрактів, щоб ви могли помилитися на них та виправте їх перед тим, як розгорнути дорогий код у мережу.

Час першого підходу. Імпортуйте об’єкт Web3 та встановіть HTTP-з'єднання.

з імпорту
web3 = Web3 (Web3.HTTPProvider ("https://mainnet.infura.io/your-own-personal-number"))

І ви все готові! Тепер ви можете вивчити структуру даних за допомогою API web3.

Отримання інформації про конкретні блоки…

# поточний номер блоку
>>> web3.eth.blockNumber
5658173
#get вміст останнього видобутого блоку
>>> web3.eth.getBlock ('останній')

Ця команда повертає структуру даних AttributeDict, яка є словником пар ключових значень, який виглядає приблизно так:

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

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

Загальні

Добування, пов'язане з видобутком

Дядьки

Технічні

… Транзакції та їх квитанції

Тепер ми також можемо шукати окремі транзакції в блоці за їх унікальними ідентифікаторами, тобто хешами транзакцій.

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

Нарешті, ми також можемо розглянути квитанції про трансакції:

Квитанція про транзакцію містить кілька повторених і нових записів; нові пояснюються нижче.

Для довідки я включив різні додаткові ресурси крім Жовтої книги для складання цих таблиць [2, 3, 4, 5].

Як бачите, за допомогою декількох простих команд ви вже можете підключитися до мережі та отримати основну інформацію про транзакції, блоки чи стани у необробленому форматі. Це відкриває нове вікно до того, що можна зробити з такими даними!

Система управління базами даних

Плануючи записати свої дані у належну базу даних, ви, мабуть, усвідомлюєте, що існує багато рішень для систем управління для любителів Python, таких як SQLite без сервера або сервери MySQL, PostgreSQL або Hadoop. Залежно від того, що ви маєте намір зробити, вам доведеться визначити, який варіант є найкращим для вашого проекту. Загалом, я вважаю, що ці моменти є корисними:

  • Який призначений розмір бази даних (тобто, чи можна обробляти її в одній машинній системі)?
  • Чи будуть записи часто редагуватися чи вони залишаться виправленими?
  • Чи має бути доступ до бази даних та редагувати її декілька сторін / додатків одночасно?

Блокчейн Ethereum постійно зростає з часом, наближаючись до 1 ТБ станом на червень 2018 року, що є невеликим, отже, не є оптимальним для розподіленої системи обробки, як Hadoop. База даних blockchain буде записана один раз, а потім лише розширена новими записами, залишаючи старі записи незмінними. Запропонований випадок використання цієї бази даних повинен записуватися одним каналом і отримувати доступ лише для читання іншими каналами, тому нам не потрібно запускати його на сервері. Місцеве зберігання бази даних на вашому комп'ютері призведе до швидкого зчитування, що є бажаним і досяжним із системою управління без сервера, як SQLite. А в Python є вбудована бібліотека sqlite3, тому нам навіть не потрібно встановлювати нові пакети.

Дизайн баз даних

Наступний крок - розробка вашої бази даних. Майте на увазі, які поля даних є найбільш релевантними для вашого аналізу, і прагнете оптимізувати пошук і зберігання. Наприклад, якщо ви не плануєте використовувати stateRoot, ви можете повністю пропустити його або зберегти в окремій таблиці. Таблицю з меншою кількістю стовпців можна пройти швидше, і якщо ви згодом зрозумієте, що у вас є справжній випадок використання для stateRoot, ви все одно зможете отримати доступ до нього. Ви також можете відокремити інформацію про блок від інформації про транзакції; якщо цього не зробити, властивості блоку, як часова мітка, повторяться N разів для всіх транзакцій в блоці, витрачаючи багато місця. Згодом операція JOIN приєднає транзакцію до її властивостей блоку буде легко.

Створена мною база даних складається з 3 таблиць:

  • Швидкий: найрелевантніша інформація про транзакції для швидкого доступу та аналізу,
  • TX: вся інша інформація про транзакції,
  • Блок: інформація, що залежить від блоку.

Конвенція іменування змінних була дещо змінена стосовно оригінального web3py, щоб позбутися від двозначностей, таких як виклик і хеш-блоку, і хеш транзакцій, "хеш", або використання "від" / "до" як імен стовпців, які в SQL має інше значення і призведе до краху програми.

Значення транзакцій, залишки та інші великі числа потрібно зберігати в базі даних у вигляді рядків. Причина полягає в тому, що SQLite може обробляти лише підписані цілі числа, що зберігаються до 8 байт, з максимальним значенням 2⁶³-1 = 9223372036854775807. Це часто значно нижче значень транзакцій у Вей (наприклад, лише 1 ETH = 10¹⁸ вей).

Створення вашої міні-бази даних

Повний код можна знайти на GitHub. Він організує інформацію про blockchain відповідно до верхньої схеми та виведе файл blockchain.db, що містить дані заздалегідь заданої кількості блоків. Щоб перевірити це, перейдіть до файлу database.py і виберіть розумне число для кількості блоків, які потрібно записати, наприклад

Nblocks = 10000

За замовчуванням слід вказати об’єкт web3 на кінцеву точку Infura. Ви також можете переключитися на постачальника послуг IPC, якщо у вас є (тобто ваш локальний вузол), просто скаментуйте рядок

# або з'єднання через вузол VM
# web3 = Web3 (Web3.IPCProvider ('/ шлях-до-geth.ipc /'))

і закріпити шлях. Потім просто запустіть у своєму командному рядку python database.py. Код скидає номер останнього записаного блоку у файл lastblock.txt, якщо вам доведеться перезапустити місце, де ви зупинилися.

Як користуватися базою даних

Після того, як ви написали перші записи до бази даних, ви можете почати спілкуватися з нею через оболонку ipython. Наприклад, щоб надрукувати перші 5 рядків таблиці "Швидкий", ви можете запустити код нижче.

Місцевий вузол проти Інфури

Якщо ви хочете створити велику базу даних, вам слід завантажити geth та синхронізувати вузол. Синхронізацію можна виконати в трьох основних режимах:

Якщо попередні стани облікового запису не потрібні, ви можете синхронізувати свій вузол у швидкому режимі [6].

Нижче наведено графік, який показує вам швидкість, з якою цей код записує в базу даних, спілкуючись із повністю синхронізованим вузлом на локальному рівні (IPC) та адресою на Infura (Infura). Як бачите, запускати цей код на локальному вузлі окупається, оскільки ви отримуєте збільшення швидкості майже на 2 порядки (він же 100x)!

Час, необхідний для запису 10 блоків транзакцій між блоками 2000000 та 2000400. Час знаходиться в логарифмічній шкалі (10⁰ = 1, 10¹ = 10 тощо);

Підсумок

Тепер, коли у вас є своя локальна база даних про те, що сталося і що відбувається на blockchain, ви можете розпочати її вивчення. Наприклад, ви можете порахувати кількість транзакцій з моменту її генезису, подивитися, скільки адрес генерується як функція часу - небо є межею того, що ви можете дізнатися про свою істоту. Ми просто встановили основу для вашого дитячого майданчика. Тож продовжуйте і досліджуйте це, або перевірте наступні публікації щодо потенційних додатків.

Зверніться до analytics@validitylabs.org, якщо вас цікавлять послуги блокчейн-аналітики Validity Labs.