Zamark / blockchain.py
Sckathach's picture
Final commit?
3d1ef0a
import hashlib
import time
import json
class Block:
def __init__(self, previous_hash, trigger_set_huggingface_hash, trigger_set_client_hash, encrypted_watermarked_model_hash, counter,
timestamp=None):
self.timestamp = timestamp if timestamp else time.time()
self.previous_hash = previous_hash
self.counter = counter
self.trigger_set_huggingface = trigger_set_huggingface_hash
self.trigger_set_client = trigger_set_client_hash
self.encrypted_watermarked_model = encrypted_watermarked_model_hash
self.hash = self.calculate_hash()
def calculate_hash(self):
hash_string = (
f"{self.timestamp:.6f}" +
str(self.previous_hash) +
str(self.counter) +
str(self.trigger_set_huggingface) +
str(self.trigger_set_client) +
str(self.encrypted_watermarked_model)
)
return hashlib.sha256(hash_string.encode()).hexdigest()
@staticmethod
def hash_data(data):
return hashlib.sha256(str(data).encode()).hexdigest()
def to_dict(self):
return {
"timestamp": self.timestamp,
"previous_hash": self.previous_hash,
"counter": self.counter,
"trigger_set_huggingface": self.trigger_set_huggingface,
"trigger_set_client": self.trigger_set_client,
"encrypted_watermarked_model": self.encrypted_watermarked_model,
"hash": self.hash
}
class Blockchain:
def __init__(self):
self.chain = {}
self.add_block("Genesis HuggingFace", "Genesis Client", "Genesis Model")
def add_block(self, trigger_set_huggingface, trigger_set_client, encrypted_watermarked_model):
counter = len(self.chain)
previous_hash = self.chain[counter - 1].hash if counter > 0 else "0"
new_block = Block(previous_hash, trigger_set_huggingface, trigger_set_client, encrypted_watermarked_model,
counter)
self.chain[counter] = new_block
return new_block
def is_chain_valid(self):
for i in range(1, len(self.chain)):
current_block = self.chain[i]
previous_block = self.chain[i - 1]
if current_block.hash != current_block.calculate_hash():
print(f"Invalid hash for block {i}")
return False
if current_block.previous_hash != previous_block.hash:
print(f"Invalid previous hash for block {i}")
return False
return True
def to_dict(self):
return {str(counter): block.to_dict() for counter, block in self.chain.items()}
def save_to_file(self, filename):
with open(filename, 'w') as file:
json.dump(self.to_dict(), file, indent=4)
print(f"Blockchain saved to {filename}")
@classmethod
def load_from_file(cls, filename):
with open(filename, 'r') as file:
data = json.load(file)
blockchain = cls()
blockchain.chain.clear() # Clear the genesis block
for counter, block_data in data.items():
block = Block(
block_data["previous_hash"],
block_data["trigger_set_huggingface"],
block_data["trigger_set_client"],
block_data["encrypted_watermarked_model"],
int(counter),
block_data["timestamp"]
)
blockchain.chain[int(counter)] = block
print(f"Blockchain loaded from {filename}")
return blockchain, data
def print_blockchain_details(blockchain):
for counter, block in blockchain.chain.items():
print(f"Block {counter}:")
print(f" Timestamp: {block.timestamp:.6f}")
print(f" Previous Hash: {block.previous_hash}")
print(f" Hash: {block.hash}")
print(f" Calculated Hash: {block.calculate_hash()}")
print()
# # Exemple d'utilisation
# blockchain = Blockchain()
#
# # Ajouter quelques blocs
# blockchain.add_block("HF Trigger Set 1", "Client Trigger Set 1", "Encrypted Model 1")
# blockchain.add_block("HF Trigger Set 2", "Client Trigger Set 2", "Encrypted Model 2")
# blockchain.add_block("HF Trigger Set 3", "Client Trigger Set 3", "Encrypted Model 3")
#
# print("Original Blockchain:")
# print_blockchain_details(blockchain)
#
# # Sauvegarder la blockchain dans un fichier JSON
# blockchain.save_to_file("blockchain.json")
#
# # Charger la blockchain depuis le fichier JSON
# loaded_blockchain, _ = Blockchain.load_from_file("blockchain.json")
#
# print("\nLoaded Blockchain:")
# print_blockchain_details(loaded_blockchain)
#
# # Vérifier que la blockchain chargée est valide
# print(f"La blockchain chargée est valide : {loaded_blockchain.is_chain_valid()}")
#
# # Ajouter un nouveau bloc à la blockchain chargée
# loaded_blockchain.add_block("HF Trigger Set 4", "Client Trigger Set 4", "Encrypted Model 4")
#
# # Sauvegarder la blockchain mise à jour
# loaded_blockchain.save_to_file("blockchain.json")