Блокчейн 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», и, конечно, это, вероятно, потребует большего количества итераций. Как видите, майнер с большей вычислительной мощностью сможет добыть данное сообщение раньше. Вот так майнеры соревнуются друг с другом за прибыль.
Теперь мы готовы добавить больше блоков в нашу цепочку блоков. Давайте узнаем это в нашей следующей главе.