|
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() |
|
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() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|