Каждый майнер забирает транзакции из ранее созданного пула транзакций. Чтобы отслеживать количество уже обработанных сообщений, мы должны создать глобальную переменную —
last_transaction_index = 0
Теперь у нас будет наш первый майнер, добавляющий блок в блокчейн.
Добавление первого блока
Чтобы добавить новый блок, мы сначала создаем экземпляр класса Block .
block = Block()
Мы забираем первые 3 транзакции из очереди —
for i in range(3): temp_transaction = transactions[last_transaction_index] # validate transaction
Перед добавлением транзакции в блок майнер проверит правильность транзакции. Достоверность транзакции проверяется путем проверки на равенство хеша, предоставленного отправителем, хешу, сгенерированному майнером с использованием открытого ключа отправителя. Также майнер проверит, достаточно ли у отправителя баланса для оплаты текущей транзакции.
Для краткости мы не включили эту функцию в учебник. После проверки транзакции мы добавляем ее в список Verified_transactions в экземпляре блока .
block.verified_transactions.append (temp_transaction)
Мы увеличиваем индекс последней транзакции, чтобы следующий майнер подобрал последующие транзакции в очереди.
last_transaction_index += 1
Мы добавляем ровно три транзакции в блок. Как только это будет сделано, мы инициализируем остальные переменные экземпляра класса Block . Сначала добавим хеш последнего блока.
block.previous_block_hash = last_block_hash
Далее мы добываем блок с уровнем сложности 2.
block.Nonce = mine (block, 2)
Обратите внимание, что первым параметром функции mine является двоичный объект. Теперь мы хэшируем весь блок и создаем для него дайджест.
digest = hash (block)
Наконец, мы добавляем созданный блок в цепочку блоков и повторно инициализируем глобальную переменную last_block_hash для использования в следующем блоке.
Весь код для добавления блока показан ниже —
block = Block() for i in range(3): temp_transaction = transactions[last_transaction_index] # validate transaction # if valid block.verified_transactions.append (temp_transaction) last_transaction_index += 1 block.previous_block_hash = last_block_hash block.Nonce = mine (block, 2) digest = hash (block) TPCoins.append (block) last_block_hash = digest
Добавление большего количества блоков
Теперь мы добавим еще два блока в нашу цепочку блоков. Код для добавления следующих двух блоков приведен ниже —
# Miner 2 adds a block block = Block() for i in range(3): temp_transaction = transactions[last_transaction_index] # validate transaction # if valid block.verified_transactions.append (temp_transaction) last_transaction_index += 1 block.previous_block_hash = last_block_hash block.Nonce = mine (block, 2)digest = hash (block) TPCoins.append (block)last_block_hash = digest # Miner 3 adds a block block = Block() for i in range(3): temp_transaction = transactions[last_transaction_index] #display_transaction (temp_transaction) # validate transaction # if valid block.verified_transactions.append (temp_transaction) last_transaction_index += 1 block.previous_block_hash = last_block_hash block.Nonce = mine (block, 2) digest = hash (block) TPCoins.append (block) last_block_hash = digest
Когда вы добавите эти два блока, вы также увидите количество итераций, которое потребовалось, чтобы найти Nonce. На данный момент наш блокчейн состоит из 4 блоков, включая блок генезиса.
Сбрасывает весь блокчейн
Вы можете проверить содержимое всей цепочки блоков, используя следующую инструкцию:
dump_blockchain(TPCoins)
Вы увидите результат, аналогичный показанному ниже —