Блокчейн Python - Создание майнеров

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

Функция дайджеста сообщения

Мы напишем служебную функцию под названием sha256 для создания дайджеста по заданному сообщению -

def sha256(message):
return hashlib.sha256(message.encode('ascii')).hexdigest()

В sha256 функция принимает message в качестве параметра кодирует его в ASCII, создает шестнадцатеричный дайджест и возвращает значение вызывающей стороне.

Функция майнинга

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

Например, если вы укажете уровень сложности 2, сгенерированный хэш для данного сообщения должен начинаться с двух единиц, например 11xxxxxxxx. Если уровень сложности равен 3, сгенерированный хеш должен начинаться с трех единиц, например 111xxxxxxxx. Учитывая эти требования, мы теперь разработаем функцию интеллектуального анализа данных, как показано в шагах, приведенных ниже.

Шаг 1

Функция майнинга принимает два параметра - сообщение и уровень сложности.

def mine(message, difficulty=1):

Шаг 2

Уровень сложности должен быть больше или равен 1, мы гарантируем это с помощью следующего утверждения assert -

assert difficulty >= 1

Шаг 3

Мы создаем prefix переменная с использованием установленного уровня сложности.

prefix = '1' * difficulty

Обратите внимание, если уровень сложности равен 2, префикс будет «11», а если уровень сложности равен 3, префиксом будет «111» и так далее. Мы проверим, существует ли этот префикс в сгенерированном дайджесте сообщения. Чтобы переварить само сообщение, мы используем следующие две строки кода:

for i in range(1000):
   digest = sha256(str(hash(message)) + str(i))

Мы продолжаем добавлять новый номер iв хэш сообщения на каждой итерации и сгенерировать новый дайджест для объединенного сообщения. В качестве входа вsha256 функция изменяется на каждой итерации, digestзначение также изменится. Проверяем, если этоdigest значение установлено выше prefix.

if digest.startswith(prefix):

Если условие выполнено, мы прекратим for цикл и верните digest ценность для вызывающего абонента.

Целиком mine код показан здесь -

def mine(message, difficulty=1):
   assert difficulty >= 1
   prefix = '1' * difficulty
   for i in range(1000):
      digest = sha256(str(hash(message)) + str(i))
      if digest.startswith(prefix):
         print ("after " + str(i) + " iterations found nonce: "+ digest)
      return digest

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

Тестирование функции майнинга

Чтобы протестировать нашу функцию интеллектуального анализа данных, просто выполните следующий оператор -

mine ("test message", 2)

Когда вы запустите приведенный выше код, вы увидите результат, аналогичный приведенному ниже -

after 138 iterations found nonce:
11008a740eb2fa6bf8d55baecda42a41993ca65ce66b2d3889477e6bfad1484c

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

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