mirror of
https://github.com/curly60e/pyblock.git
synced 2026-08-14 12:43:15 +02:00
222 lines
6.5 KiB
Python
222 lines
6.5 KiB
Python
# 7 Blocks by PyBLOCK Crew.
|
|
|
|
import hashlib
|
|
from time import sleep
|
|
import signal
|
|
import sys
|
|
signal.signal(signal.SIGINT, lambda x, y: sys.exit(0))
|
|
|
|
def hash_256(string):
|
|
return hashlib.sha256(string.encode('utf-8')).hexdigest()
|
|
|
|
|
|
class TransactionGenerator:
|
|
def __init__(self):
|
|
self.random_seed = 0
|
|
|
|
def generate_transaction(self):
|
|
transaction_payload = 'This is a transaction between A and B. ' \
|
|
'We add a random seed here {} to make its hash unique'.format(self.random_seed)
|
|
transaction_hash = hash_256(transaction_payload)
|
|
self.random_seed += 1
|
|
return transaction_hash
|
|
|
|
|
|
class Block:
|
|
def __init__(self, hash_prev_block, target):
|
|
self.transactions = []
|
|
self.hash_prev_block = hash_prev_block
|
|
self.hash_merkle_block = None
|
|
self.target = target
|
|
self.nounce = 0
|
|
|
|
def add_transaction(self, new_transac):
|
|
if not self.is_block_full():
|
|
self.transactions.append(new_transac)
|
|
self.hash_merkle_block = hash_256(str('-'.join(self.transactions)))
|
|
|
|
def is_block_full(self):
|
|
return len(self.transactions) >= 1000
|
|
|
|
def is_block_ready_to_mine(self):
|
|
return self.is_block_full()
|
|
|
|
def __str__(self):
|
|
return '-'.join([self.hash_merkle_block, str(self.nounce)])
|
|
|
|
def apply_mining_step(self):
|
|
current_block_hash = hash_256(self.__str__())
|
|
print('CURRENT BLOCK HASH = {}, TARGET = {}'.format(current_block_hash, self.target))
|
|
if int(current_block_hash, 16) < int(self.target, 16):
|
|
print('\nBlock was successfully mined! You will get a reward of 50 BTC!')
|
|
print('\nAccepted Hash Target {}.'.format(current_block_hash))
|
|
print('\nIt took {} steps to mine it.\n'.format(self.nounce))
|
|
return True
|
|
else:
|
|
self.nounce += 1
|
|
return False
|
|
|
|
|
|
class BlockChain:
|
|
def __init__(self):
|
|
self.block_chain = []
|
|
|
|
def push(self, block):
|
|
self.block_chain.append(block)
|
|
|
|
def notify_everybody(self):
|
|
print('-' * 80)
|
|
print('SPREADING TO ALL THE NODES OF THE NETWORK, THIS BLOCK HAS BEEN ADDED:\n')
|
|
print('[Block #{}] : {}'.format(len(self.block_chain), self.get_last_block()))
|
|
print('-' * 80)
|
|
print('\nGenerating New Difficulty...\n')
|
|
|
|
def get_last_block(self):
|
|
return self.block_chain[-1]
|
|
|
|
|
|
def my_first_miner():
|
|
last_block_header = '0e0fdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'
|
|
last_block_target = '00dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'
|
|
|
|
block_chain = BlockChain()
|
|
|
|
transaction_generator = TransactionGenerator()
|
|
|
|
block = Block(last_block_header, last_block_target)
|
|
for i in range(1500):
|
|
block.add_transaction(transaction_generator.generate_transaction())
|
|
|
|
assert block.is_block_full()
|
|
assert block.is_block_ready_to_mine()
|
|
|
|
while not block.apply_mining_step():
|
|
continue
|
|
|
|
block_chain.push(block)
|
|
block_chain.notify_everybody()
|
|
sleep(7)
|
|
|
|
last_block_header = hash_256(str(block_chain.get_last_block()))
|
|
|
|
block_1 = Block(last_block_header, last_block_target)
|
|
|
|
for i in range(1232):
|
|
block_1.add_transaction(transaction_generator.generate_transaction())
|
|
|
|
assert block_1.is_block_full()
|
|
assert block_1.is_block_ready_to_mine()
|
|
|
|
while not block_1.apply_mining_step():
|
|
continue
|
|
|
|
block_chain.push(block_1)
|
|
block_chain.notify_everybody()
|
|
sleep(7)
|
|
|
|
last_block_target = '000ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'
|
|
|
|
last_block_header = hash_256(str(block_chain.get_last_block()))
|
|
|
|
block_2 = Block(last_block_header, last_block_target)
|
|
|
|
for i in range(1876):
|
|
block_2.add_transaction(transaction_generator.generate_transaction())
|
|
|
|
assert block_2.is_block_full()
|
|
assert block_2.is_block_ready_to_mine()
|
|
|
|
while not block_2.apply_mining_step():
|
|
continue
|
|
|
|
block_chain.push(block_2)
|
|
block_chain.notify_everybody()
|
|
sleep(7)
|
|
|
|
last_block_target = '0000dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'
|
|
|
|
last_block_header = hash_256(str(block_chain.get_last_block()))
|
|
|
|
block_3 = Block(last_block_header, last_block_target)
|
|
|
|
for i in range(1876):
|
|
block_3.add_transaction(transaction_generator.generate_transaction())
|
|
|
|
assert block_3.is_block_full()
|
|
assert block_3.is_block_ready_to_mine()
|
|
|
|
while not block_3.apply_mining_step():
|
|
continue
|
|
|
|
block_chain.push(block_3)
|
|
block_chain.notify_everybody()
|
|
sleep(7)
|
|
|
|
last_block_target = '00000ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'
|
|
|
|
last_block_header = hash_256(str(block_chain.get_last_block()))
|
|
|
|
block_4 = Block(last_block_header, last_block_target)
|
|
|
|
for i in range(1876):
|
|
block_4.add_transaction(transaction_generator.generate_transaction())
|
|
|
|
assert block_4.is_block_full()
|
|
assert block_4.is_block_ready_to_mine()
|
|
|
|
while not block_4.apply_mining_step():
|
|
continue
|
|
|
|
block_chain.push(block_4)
|
|
block_chain.notify_everybody()
|
|
sleep(7)
|
|
|
|
last_block_target = '000000dddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'
|
|
|
|
last_block_header = hash_256(str(block_chain.get_last_block()))
|
|
|
|
block_5 = Block(last_block_header, last_block_target)
|
|
|
|
for i in range(1876):
|
|
block_5.add_transaction(transaction_generator.generate_transaction())
|
|
|
|
assert block_5.is_block_full()
|
|
assert block_5.is_block_ready_to_mine()
|
|
|
|
while not block_5.apply_mining_step():
|
|
continue
|
|
|
|
block_chain.push(block_5)
|
|
block_chain.notify_everybody()
|
|
sleep(7)
|
|
|
|
last_block_target = '0000000ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'
|
|
|
|
last_block_header = hash_256(str(block_chain.get_last_block()))
|
|
|
|
block_6 = Block(last_block_header, last_block_target)
|
|
|
|
for i in range(1876):
|
|
block_6.add_transaction(transaction_generator.generate_transaction())
|
|
|
|
assert block_6.is_block_full()
|
|
assert block_6.is_block_ready_to_mine()
|
|
|
|
while not block_6.apply_mining_step():
|
|
continue
|
|
|
|
block_chain.push(block_6)
|
|
block_chain.notify_everybody()
|
|
sleep(7)
|
|
|
|
print('')
|
|
print('SUMMARY')
|
|
print('')
|
|
for i, block_added in enumerate(block_chain.block_chain):
|
|
print('Block #{} was added. It took {} steps to find it.'.format(i, block_added.nounce))
|
|
print('\nDifficulty was increased for the last 7 Blocks!\n')
|
|
print('\n7 Blocks Mined Successfully!\n')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
my_first_miner()
|