Как взаимодействовать с блокчейном Ethereum и создавать базу данных с Python и SQL

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

Настройка для первой встречи

Во-первых, вам нужно будет установить web3py. Web3py - это библиотека Python для соединения с блокчейном Ethereum. Что нужно знать заранее, так это то, что не существует центральной административной системы, откуда можно было бы загружать данные. Взаимосвязанные узлы («узлы»), которые совместно используют ресурсы друг с другом, хранят проверенную копию данных (или их часть). Сеть выполняет протокол Ethereum, который определяет правила взаимодействия узлов друг с другом и / или интеллектуальные контракты по этой сети.

Если вы хотите получить доступ к информации о транзакциях, балансах, блоках или чем-то еще, что записано в цепочку блоков, о которой вы еще не знаете, протокол требует подключения к узлам. Узлы постоянно обмениваются новыми данными друг с другом и проверяют данные, поэтому таким образом вы уверены, что вы получаете 1) данные, которые не были изменены, и 2) которые наиболее актуальны.

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

Перейдите в Infura и создайте свою бесплатную учетную запись для доступа к такому размещенному узлу. Когда вы закончите, вы увидите список сетей, к которым вы можете подключиться: основная сеть (основная цепочка Ethereum) и несколько тестовых сетей, которые в основном предназначены для тестирования ваших умных контрактов, чтобы вы могли совершать ошибки на них и исправьте их перед развертыванием дорогостоящего кода в основной сети.

Время для первого подхода. Импортируйте объект Web3 и установите соединение HTTP.

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

И все готово! Теперь вы можете исследовать структуру данных с помощью API web3.

Получение информации о конкретных блоках ...

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

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

Не все эти переменные будут сразу полезны для вас, поскольку некоторые из них носят технический характер, и их значение будет иметь смысл только после того, как вы получите более глубокое понимание того, как на самом деле работает блокчейн. Вы можете прочитать о них больше в так называемой «Желтой бумаге» или пока пропустить их и поработать с легко понятными.

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

генеральный

Добыча связанных

Дяди

технический

… Транзакции и их поступления

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

Как и ранее, web3py возвращает нам словарь атрибутов. Таблица ниже суммирует, что означает каждый ключ.

Наконец, мы также можем рассмотреть квитанции о транзакциях:

Квитанция о транзакции содержит несколько повторных и новых записей; Новые объяснены ниже.

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

Как видите, с помощью нескольких простых команд вы уже можете подключиться к сети и получить базовую информацию о транзакциях, блоках или состояниях в необработанном формате. Это открывает новое окно для того, что можно сделать с такими данными!

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

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

  • Каков предполагаемый размер базы данных (т. Е. Может ли она обрабатываться на одной машине)?
  • Будут ли записи часто редактироваться или они останутся исправленными?
  • Предполагается ли доступ к базе данных и ее редактирование несколькими участниками / приложениями одновременно?

Блокчейн Ethereum со временем неуклонно растет, приближаясь к 1 ТБ на июнь 2018 года, что является небольшим, поэтому не оптимальным для распределенной системы обработки, такой как Hadoop. База данных блокчейна будет записана один раз, а затем расширена только новыми записями, оставив старые записи без изменений. Предполагаемый вариант использования этой базы данных должен быть записан одним каналом, а другие каналы доступны только для чтения, поэтому нам не нужно запускать ее на сервере. Локальное хранение базы данных на вашем компьютере приведет к быстрому считыванию, что желательно и достижимо с помощью системы управления без серверов, такой как SQLite. А в Python есть встроенная библиотека sqlite3, поэтому нам даже не нужно устанавливать новые пакеты.

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

Следующим шагом является разработка вашей базы данных. Помните, какие поля данных наиболее актуальны для вашего анализа, и стремитесь оптимизировать как поиск, так и хранение. Например, если вы не планируете использовать stateRoot, вы можете полностью пропустить его или сохранить в отдельной таблице. Таблица с меньшим количеством столбцов может быть найдена быстрее, и если позже вы поймете, что у вас действительно есть сценарий использования для stateRoot, вы все равно сможете получить к нему доступ. Вы также можете отделить информацию о блокировке от информации о транзакции; если вы этого не сделаете, свойства блока, такие как отметка времени, будут повторяться N раз для всех транзакций в блоке, тратя много места. Сопоставление транзакции со свойствами блока будет проще с помощью операции JOIN позже.

Созданная мной база данных состоит из 3 таблиц:

  • Быстрый: наиболее актуальная информация о транзакциях для быстрого доступа и анализа,
  • TX: вся остальная информация о транзакции,
  • Блок: информация о блоке.

Соглашение об именовании переменных было немного изменено по сравнению с исходным web3py, чтобы избавиться от неоднозначностей, таких как вызов хэша блока и хэша транзакции «hash», или использование «from» / «to» в качестве имен столбцов, что в SQL имеют другое значение и могут привести к сбою программы.

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

Создание вашей мини базы данных

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

Nblocks = 10000

По умолчанию вы должны указать объект web3 на конечную точку Infura. Вы также можете переключиться на провайдера IPC, если он у вас есть (т. Е. Ваш локальный узел), просто раскомментируйте строку

# или соединение через узел на виртуальной машине
# web3 = Web3 (Web3.IPCProvider ('/ path-to-geth.ipc /'))

и исправить путь. Затем просто запустите в командной строке python database.py. Код выведет номер последнего записанного блока в файл lastblock.txt, если вам нужно перезапустить с того места, где вы остановились.

Как пользоваться базой данных

Как только вы записали первые записи в базу данных, вы можете начать общаться с ней через оболочку ipython. Например, чтобы напечатать первые 5 строк таблицы «Quick», вы можете запустить приведенный ниже код.

Локальный узел против Инфура

Если вы хотите создать большую базу данных, вам следует скачать geth и синхронизировать узел. Синхронизация может быть выполнена в 3 основных режимах:

Если вам не нужны прошлые состояния учетной записи, вы можете синхронизировать свой узел в быстром режиме [6].

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

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

Резюме

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

Свяжитесь с analytics@validitylabs.org, если вы заинтересованы в услугах аналитики блокчейна Validity Labs.