Как создать блокчейн с Python?

Опубликовано: 2021-11-03

Знаете ли вы, что Биткойн построен на основе блокчейна? Сегодня мы собираемся создать блокчейн с Python с нуля.

Что такое блокчейн?

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

Технология блокчейн
Технология блокчейн

Проще говоря, Blockchain - это общая неизменяемая цифровая книга, в которой хранятся транзакции в децентрализованной сети компьютеров.

Мы можем разделить блокчейн на два простых термина:

  • Блок: пространство, в котором мы храним транзакции.
  • Цепочка: набор связанных записей

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

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

Блокчейн представляет интересный набор функций:

  • Неизменяемость истории
  • Информационная стойкость
  • Нет ошибок с сохраненными данными

Многие системы в настоящее время полагаются на блокчейн, такие как криптовалюты, передача активов (NFT) и, возможно, в ближайшем будущем, голосование.

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

Конечно, это было краткое объяснение, но если вам нужно полное руководство, мы подготовили полное руководство по Blockchain для начинающих. Обязательно проверьте это.

Без дальнейших промедлений давайте создадим простой блокчейн с Python.

Построение блокчейна с помощью Python

Перед тем как начать, давайте определимся, что мы собираемся делать в этом уроке:

  • Создайте простую систему Blockchain, написанную на Python
  • Используйте наш блокчейн с предустановленными транзакциями, представленными в виде строк
  • Проверьте неизменность нашей цепочки блоков.

Мы собираемся использовать не JSON, а списки Python. Это позволит нам упростить процесс и сосредоточиться на применении ключевых концепций блокчейна.

Что вам понадобится, чтобы следовать этому руководству:

  • Понимание классов и методов в Python
  • Базовое использование командной строки

Создание класса Block

Откройте ваш любимый редактор кода и создайте файл main.py. Это будет файл, с которым мы будем работать.

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

Хеш-функция - это алгоритм, который принимает некоторые данные (обычно закодированную строку) и возвращает уникальный идентификатор, часто называемый «дайджест» или «подпись». Эта последняя часть жизненно важна; с хеш-функцией небольшое различие во входных данных дает на выходе радикально другой идентификатор. Позже мы увидим это в действии.

А пока просто импортируйте встроенный модуль hashlib:

 # main.py file """ A simple Blockchain in Python """ import hashlib

Этот модуль включает в себя большинство необходимых вам алгоритмов хеширования. Просто имейте в виду, что мы будем использовать функцию hashlib.sha256 () .

Теперь давайте перейдем к GeekCoinBlock, нашему полностью оригинальному названию блокчейна.

 class GeekCoinBlock: def __init__(self, previous_block_hash, transaction_list): self.previous_block_hash = previous_block_hash self.transaction_list = transaction_list self.block_data = f"{' - '.join(transaction_list)} - {previous_block_hash}" self.block_hash = hashlib.sha256(self.block_data.encode()).hexdigest()

Я знаю, что это может привести к получению неуклюжего фрагмента кода. Давайте разберем каждую часть в следующем разделе.

GeekCoinBlock Объяснение

Сначала мы создаем класс с именем GeekCoinBlock , оболочку для объектов, которые будут иметь определенные характеристики (атрибуты) и поведение (методы).

Затем мы определяем метод __ init__ (также называемый конструктором), который вызывается каждый раз, когда создается объект GeekCoinBlock.

Этот метод имеет три параметра:

  • self (экземпляр каждого объекта)
  • previous_block_hash (ссылка на предыдущий блок)
  • transaction_list (список транзакций, совершенных в текущем блоке).

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

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

Эта функция принимает закодированные строки (или байты) в качестве параметров. Вот почему мы используем метод block_data.encode () . После этого мы вызываем hexdigest (), чтобы вернуть закодированные данные в шестнадцатеричный формат.

Я знаю, что все это может быть ошеломляющим, поэтому давайте поиграемся с hashlib в оболочке Python.

 In [1]: import hashlib In [2]: message = "Python is great" In [3]: h1 = hashlib.sha256(message.encode()) In [4]: h1 Out[4]: <sha256 ... object @ 0x7efcd55bfbf0> In [5]: h1.hexdigest() Out[5]: 'a40cf9cca ... 42ab97' In [6]: h2 = hashlib.sha256(b"Python is not great") In [7]: h2 Out[7]: <sha256 ... object @ 0x7efcd55bfc90> In [8]: h2.hexdigest() Out[8]: 'fefe510a6a ... 97e010c0ea34'

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

Использование нашего блочного класса

Позже мы создадим целый класс Blockchain, а пока давайте воспользуемся нашим классом Block для создания цепочки блоков (Blockchain).

В том же файле создайте пару транзакций, состоящих из простых строк, хранящихся в переменных, например:

 class GeekCoinBlock: ... t1 = "Noah sends 5 GC to Mark" t2 = "Mark sends 2.3 GC to James" t3 = "James sends 4.2 GC to Alisson" t4 = "Alisson sends 1.1 GC to Noah"

Конечно, GC относится к GeekCoin.

Теперь создайте первый блок нашей цепочки блоков с помощью класса GeekCoinBlock и распечатайте его атрибуты. Учтите, что параметр previous_hash блока genesis (первый блок, который предшествует другим блокам) всегда будет произвольной строкой или хешем, в данном случае «firstblock».

 block1 = GeekCoinBlock('firstblock', [t1, t2]) print(f"Block 1 data: {block1.block_data}") print(f"Block 1 hash: {block1.block_hash}")

Затем мы делаем то же самое со вторым блоком, но передаем хэш первого блока в качестве аргумента previous_hash .

 block2 = GeekCoinBlock(block1.block_hash, [t3, t4]) print(f"Block 2 data: {block2.block_data}") print(f"Block 2 hash: {block2.block_hash}")

Давайте запустим и проанализируем вывод, который мы получаем от этого фрагмента кода. Еще раз введите свой терминал:

 ❯ python main.py Block 1 data: Noah sends 5 GC to Mark - Mark sends 2.3 GC to James - firstblock Block 1 hash: 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 01e4e15242a9601725f4a86ca01fbddaaec7105b442955bb0efcadbfc759806d Block 2 hash: 448c4306caf7f6937b0307f92f27fbea3bb73b3470363dee5026a1209dadcfa8

На данный момент вы видите только текст и некоторые хэши из 64 символов, но это в значительной степени возобновляет механизм цепочки блоков.

Вы начинаете с блока генезиса, основы всех остальных блоков.

Любой может проверить целостность цепочки, и поэтому блокчейн является такой безопасной системой. Например, если мы немного изменим содержимое транзакции, скажем:

 t2 = "Mark sends 2.3 GC to James" -> t2 = "Mark sends 3.2 GC to James"

Мы видим резкое изменение хеширования блоков.

 Block 1 data: Noah sends 5 GC to Mark - Mark sends 3.2 GC to James - firstblock Block 1 hash: 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 data: James sends 4.2 GC to Alisson - Alisson sends 1.1 GC to Noah - 7a990bf1d70230bf2dad6160496c0b3046da7a17b1281fd1d4c63d4eac58e78c Block 2 hash: 569b977306ce88b53e001dca7ba00c03a51c60d6df4650e7657dcd136f2da0ac

Вы можете увидеть текущий проект в этом репозитории GitHub.

Кодирование блокчейна

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

У нас есть блоки. Пришло время создать класс, который объединит их в блокчейн.

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

 # main.py class Blockchain: def __init__(self): self.chain = [] self.generate_genesis_block() def generate_genesis_block(self): self.chain.append(GeekCoinBlock("0", ['Genesis Block'])) def create_block_from_transaction(self, transaction_list): previous_block_hash = self.last_block.block_hash self.chain.append(GeekCoinBlock(previous_block_hash, transaction_list)) def display_chain(self): for i in range(len(self.chain)): print(f"Data {i + 1}: {self.chain[i].block_data}") print(f"Hash {i + 1}: {self.chain[i].block_hash}\n") @property def last_block(self): return self.chain[-1]

Это снова огромный кусок кода. Разберем каждую часть:

  • self.chain - список, в который записаны все блоки. Мы можем получить доступ к каждому блоку через индексы списка.
  • generate_genesis_block - добавить генезис или первый блок в цепочку. Предыдущий хэш блока - «0», а список транзакций - просто «Genesis Block».
  • create_block_from_transaction - это позволяет нам добавлять блоки в цепочку с помощью всего лишь списка транзакций. Было бы очень неприятно создавать блок вручную каждый раз, когда мы хотим записать транзакцию.
  • display_chain - печатает цепочку блоков с циклом for
  • last_block - свойство, которое позволяет нам получить доступ к последнему элементу цепочки. Мы использовали его в методе create_block_from_transaction .

Давайте протестируем этот блокчейн.

 # main.py import hashlib class GeekCoinBlock: ... class Blockchain: ... t1 = "George sends 3.1 GC to Joe" t2 = "Joe sends 2.5 GC to Adam" t3 = "Adam sends 1.2 GC to Bob" t4 = "Bob sends 0.5 GC to Charlie" t5 = "Charlie sends 0.2 GC to David" t6 = "David sends 0.1 GC to Eric" myblockchain = Blockchain() myblockchain.create_block_from_transaction([t1, t2]) myblockchain.create_block_from_transaction([t3, t4]) myblockchain.create_block_from_transaction([t5, t6]) myblockchain.display_chain()

Теперь запустите файл main.py.

 Data 1: Genesis Block - 0 Hash 1: 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Data 2: George sends 3.1 GC to Joe - Joe sends 2.5 GC to Adam - 39331a6a2ea1cf31a5014b2a7c9e8dfad82df0b0666e81ce04cf8173cc5aed3e Hash 2: 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Data 3: Adam sends 1.2 GC to Bob - Bob sends 0.5 GC to Charlie - 98cf363aecb33989aea0425a3c1287268bd86f63851bc08c0734a31db08506d5 Hash 3: 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Data 4: Charlie sends 0.2 GC to David - David sends 0.1 GC to Eric - 6f1cfcc3082488b97db8fdf8ed33f9ac7519be3e285a37a6fcc2f1904f373589 Hash 4: 869df2f03c9860767d35b30a46233fbeea89a3000ae5019d1491e3829d1ab929

Поздравляю! Вы только что создали простой блокчейн Python с нуля.

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

Вывод

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

Ваша задача - создать систему майнинга, а почему бы и нет, реализовать ее с помощью REST API, используя такие фреймворки, как Django или Flask.

Многие люди зарабатывают состояния на криптовалютах. Только представьте, что вы могли бы сделать, если бы создали его сами.

Продолжайте кодировать!