import datetime as date
import hashlib as hasher
import random
# Les utilisateurs de la blockchain, qui vont effectuer des transactions
users = ["Alice", "Bob", "Charlie", "You"]
class Transaction:
def __init__(self, sender, receiver, amount):
self.sender = sender
self.receiver = receiver
self.amount = amount
class Block:
def __init__(self, index, timestamp, data, previous_hash, nonce):
self.index = index
self.timestamp = timestamp
self.data = data
self.previous_hash = previous_hash
self.nonce = nonce
self.hash = self.hash_block()
#Hashing
def hash_block(self):
sha = hasher.sha256()
# TODO : créer un objet sha 256 bits. Documentation : https://docs.python.org/2/library/hashlib.html
# sha = .........
# TODO : hasher toutes les informations contenues dans un block
# sha.update((str(self.index) + ......... + str(self.previous_hash)).encode())
sha.update((str(self.index) + str(self.timestamp) + str(self.data) + str(self.nonce) + str(self.previous_hash)).encode())
# TODO : renvoyer la représentation du hash en hexadécimal
return sha.hexdigest()
#return sha. .....
# Méthode pour créer manuellement le premier block d’index 0, daté d’aujourd’hui, de nonce 1 et et de data et hash arbitraire.
def create_genesis_block():
#return Block(........)
return Block(0, date.datetime.now(), "Genesis Block", "0", 1)
# Méthode pour ajouter un block valide à la blockchain, en se basant sur les informations du block précédant.
def next_block(last_block):
this_index = last_block.index + 1
#TODO : Incrémenter l'index du block à créer
#this_index=......
this_timestamp = date.datetime.now()
#TODO : Indiquer a date de création du bloc
#this_timestamp = ...
#TODO : Créer une transaction qui prend aléatoirement un sender parmi la liste des users, qui envoie une montant compris entre 1 et 100 à un des receivers restant dans la liste.
# rnd = random.Random()
rnd = random.Random()
user_transactions = users.copy()
sender = rnd.choice(user_transactions)
user_transactions.remove(sender)
receiver = rnd.choice(user_transactions)
amount = rnd.randint(1, 100)
this_data = Transaction(sender, receiver, amount)
previous_hash = last_block.hash
#TODO : Indiquer le hash du bloc précédant le bloc à créer
#previous_hash= ......
this_nonce = proof_of_work(last_block.nonce, this_index, this_timestamp, this_data, previous_hash)
return Block(this_index, this_timestamp, this_data, previous_hash, this_nonce)
# Algorithme Proof-of-Work de calcul d'une valeur spéciale (nonce) prouvant la validité d'un bloc.
# TODO : Pour être considérée comme valide, cette valeur spéciale (nonce) doit permettre que le hash du block débute par 4 zéros :
def proof_of_work(last_nonce, this_index, this_timestamp, this_data, previous_hash):
incrementor = 0;
block = Block(this_index, this_timestamp, this_data, previous_hash, incrementor)
# Valeur qui va s'incrémenter jusqu'à atteindre une valeur spéciale (nonce) valide
#incrementor = .......
while (str(block.hash)[:4] != '0000'):
#print(Block(this_index, this_timestamp, this_data, previous_hash, incrementor).hash)
#while ... :
incrementor += 1
block = Block(this_index, this_timestamp, this_data, previous_hash, incrementor)
return incrementor
# Initialisation de la blockchain
blockchain = [create_genesis_block()]
previous_block = blockchain[0]
# Lancement de la blockchain sur 20 blocks
num_of_blocks_to_add = 20
for i in range(0, num_of_blocks_to_add):
block_to_add = next_block(previous_block)
#TODO : Créer le block suivant
#block_to_add =
blockchain.append(block_to_add)
#TODO : Enchaîner le nouveau bloc à la blockchain existante
#blockchain.append(...)
previous_block = block_to_add
#TODO : Mettre à jour le dernier bloc
#previous_block = ...
print( "Block " + str(block_to_add.index) +" has been added to the blockchain!")
print("----------------------------------------")
print("Data: " + str(block_to_add.data.sender) + " sent " + str(block_to_add.data.amount) + " to " + str(block_to_add.data.receiver))
print("Timestamp: " + str(block_to_add.timestamp))
print("Nonce: "+ str(block_to_add.nonce))
print("Hash: "+ block_to_add.hash+"\n")
#TODO : parcourir la blockchain (c'est une liste) pour afficher le solde de chaque user.
Comments