Учебники

Python Blockchain — Добавление блоков

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

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)

Вы увидите результат, аналогичный показанному ниже —