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

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

Блокчейн — это базовая концепция каждой криптовалюты, но она не ограничивается этой сферой и может применяться несколькими другими способами. Чтобы лучше понять эту концепцию, я собираюсь создать простой блокчейн.

Для того чтобы создать блокчейн, нам нужно понять несколько вещей. Что нам на самом деле нужно?

Блоки

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

Криптография

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

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

Сложность и Nonce

Блокчейн не строится только путем создания хэшей блоков. Хэш должен быть достоверным. В нашем случае хэш считается действительным, если он начинается с четырех «0» (например, «0000abc…»). Мы называем это сложностью валидации. Чем выше эта сложность, тем больше времени потребуется, чтобы найти правильный хэш.

НО… Если хэш не верен с первого раза, что-то нужно изменить, чтобы получить другой хэш, верно? Если вы работали с хэшами, то знаете, что если мы используем одни и те же данные, то в результате всегда будет получаться один и тот же хэш. Чтобы обойти это, мы используем nonce, который, другими словами, является произвольным значением. Это простое целое число, которое мы будем увеличивать всякий раз, когда хэш будет недостоверным.

Короче говоря, мы будем хэшировать наш блок (дата, индекс, сообщение и предыдущий хэш) и произвольное значение 1. Если хэш не действителен, мы попробуем использовать произвольное значение 2. И мы будем увеличивать произвольное значение 1 на 1, пока не найдем действительный хэш.

Блок Genesis

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

Какие методы нам понадобятся?

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

  • 1 — Создание блокчейна
    Конечно, у нас будет функция для создания и запуска нашего блокчейна. Основной обязанностью будет создание генезисного блока.

  • 2- Шифрование наших блоков
    Функция, отвечающая за генерацию достоверного хэша для наших блоков.

  • 3- Проверка достоверности хэша
    У нас также будет функция, которая будет проверять, начинается ли хэш с «0000», то есть, действителен ли он для нашего блокчейна.

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

  • 5- Добавить новый блок
    И, наконец, нам нужно обеспечить способ добавления нового блока.

ДАВАЙТЕ КОДИТЬ!!!

Наш маленький проект состоит всего из двух файлов: blockchain.py и main.py. Первый содержит наш класс Blockchain со всеми необходимыми функциями. А второй является примером использования.

Blockchain.py

from hashlib import sha256
from datetime import datetime


class Blockchain:

    def __init__(self):
        self.blocks = []
        self.set_genesis_block()

    def set_genesis_block(self):
        data = 'Hello, World!' 
        timestamp = datetime.utcnow().timestamp()
        prev_hash = 0
        index = 0
        self.hash_block(
            data, timestamp, prev_hash, index
        )

    def hash_block(self, data, timestamp, prev_hash, index):
        hash = ''
        nonce = 1
        while not self.is_hash_valid(hash):
            block = '{}:{}:{}:{}:{}'.format(
                data, timestamp, prev_hash, index, nonce
            )
            hash = sha256(block.encode()).hexdigest()
            nonce += 1
        print('[nonce]', nonce)
        self.blocks.append(hash)

    def get_last_hash(self):
        return self.blocks[-1]

    def is_hash_valid(self, hash):
        return hash.startswith('0000')

    def add_new_block(self, data):
        index = len(self.blocks)
        prev_hash = self.get_last_hash()
        timestamp = datetime.utcnow().timestamp()
        self.hash_block(
            data, timestamp, prev_hash, index
        )

    def get_all(self):
        return self.blocks[:]

Вход в полноэкранный режим Выйти из полноэкранного режима

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

sha256 для шифрования наших блоков
datetime для получения даты создания (временной метки) блоков.

Теперь давайте посмотрим, что происходит в методах:

set_genesis_block: этот метод вызывается при построении блокчейна для создания первого блока цепи, т.е. блока genesis. Мы берем временную метку текущей даты, сообщение, индекс блока в блокчейне (0) и произвольное значение в качестве предыдущего хэша, поскольку у нас еще нет блоков в цепочке (self.blocks). С этими данными мы добавляем блок в цепочку, вызывая метод hash_block.

hash_block: этот метод берет все содержимое блока, создает правильный хэш и добавляет его в цепочку. Как видите, при первой попытке зашифровать блок мы устанавливаем значение nonce равным 0. Затем мы заворачиваем все содержимое блока в строку и шифруем его функцией sha256 из стандартной библиотеки hashlib. Если хэш не верен, мы увеличиваем значение nonce и повторяем попытку. Когда мы находим правильный хэш, мы добавляем его в конец строки.

get_last_hash: в этом методе возвращается последний блок хеша.

is_hash_valid: этот метод получает хэш и определяет, является ли он валидным.

add_new_block: этот метод отвечает за добавление нового блока. В качестве аргумента нам нужна только информация (в нашем случае — его сообщения), поскольку остальное содержимое блока вычисляется через сам блокчейн. Как только содержимое блока готово, мы вызываем hash_block, чтобы добавить блок в цепочку.

Отлично, теперь давайте посмотрим, как мы используем этот класс Blockchain в нашем файле main.py

Main.py

from blockchain import Blockchain


if __name__ == '__main__':
    blockchain = Blockchain()

    blockchain.add_new_block('First block!')
    blockchain.add_new_block('Blockchain is awesome!')
    blockchain.add_new_block('Once again!')

    print(blockchain.get_all())
Вход в полноэкранный режим Выйти из полноэкранного режима

Здесь происходит следующее: мы импортируем наш класс Blockchain:

Мы создаем новый экземпляр «blockchain».
Мы добавили 3 блока с соответствующими сообщениями: «Первый блок!», «Blockchain is awesome!» и «Еще раз!».

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

[nonce] 3455
[nonce] 4003
[nonce] 40238
[nonce] 4161
[‘0000d5e8a1a6e6c0e033c0e9c8e1f6a1ff7426083fee5343274c230599670fed’, ‘000015422c0380102a781d44f116efc605a9487cab8aa40397f32d9012a4ecc8’, ‘00004d05054645cfe0b3dff068151b8502db93b9b9a49143a4b7aec7bbbdbfbb’, ‘0000d78b4059d51651fdac4159b5cabc30ecd59e377c841a434510fbde773fa8’]
Вход в полноэкранный режим Выход из полноэкранного режима

Массив представляет собой 4 блока (генезисный блок и 3 добавленных). Как вы можете видеть, каждый из них начинается с «0000», поэтому каждый из них действителен. Если бы любой из них не начинался с четырех нулей, мы бы знали, что это недействительный хэш и, следовательно, соответствующее содержимое этого блока недостоверно.

Мы также видим 4 значения nonce. Это значения, которые использовались в каждом блоке. Если вы вернетесь к файлу blockchain.py, то увидите, что у нас есть печать в методе hash_block. Эти значения также показывают, сколько раз мы хешировали блок, пока не нашли правильный.

Сообщение «Blockchain is awesome!» (наш второй блок, который был добавлен в main.py) потребовалось 40238 попыток, прежде чем был найден правильный хэш!

Заключение

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

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

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

Сообщество Vaultree

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

Оцените статью
devanswers.ru
Добавить комментарий