Spaces:
Runtime error
Runtime error
import gradio as gr | |
import os | |
import json | |
import hashlib | |
import datetime | |
from huggingface_hub import (upload_file,HfApi) | |
import crypt | |
token_self = os.environ['HF_TOKEN'] | |
api = HfApi(token=token_self) | |
chain_d="chain1.json" | |
chain_t="trans1.json" | |
def get_my_chain_send(sender_name=None): | |
global mychain_send | |
print(sender_name) | |
mes_error = "" | |
try: | |
r1 = requests.get(f'{main_chain}{sender_name}/{sender_name}.json') | |
print (f's={r1.text}') | |
mychain_send = chatchain.MyChainSend(chain_load=f'{main_chain}{sender_name}/',load=r1.text) | |
response = {'chain': mychain_send.chain, | |
'length': len(mychain_send.chain)} | |
#print (f'response={response}') | |
message = f"Blockchain loaded from: {main_chain}{sender_name}/{sender_name}.json" | |
return response,message | |
except Exception: | |
message = f"Error loading from: {sender_name}" | |
print (message) | |
return {"MESSAGE":"Error Loading Chain"},message | |
def get_my_chain_rec(recipient_name=None): | |
global mychain_rec | |
print(recipient_name) | |
try: | |
r2 = requests.get(f'{main_chain}{recipient_name}/{recipient_name}.json') | |
print (f'r={r2.text}') | |
mychain_rec = MyChainRec(chain_load=f'{main_chain}{recipient_name}/',load=r2.text) | |
response = {'chain': mychain_rec.chain, | |
'length': len(mychain_rec.chain)} | |
message = f"Blockchain loaded from: {main_chain}{recipient_name}/{recipient_name}.json" | |
return response,message | |
except Exception: | |
try: | |
mychain_rec = MyChainRec(chain_load=main_chain,create=recipient_name) | |
response = {'chain': mychain_rec.chain, | |
'length': len(mychain_rec.chain)} | |
message = f"Blockchain loaded from: {main_chain}{recipient_name}/{recipient_name}.json" | |
return response,message | |
except Exception: | |
message = f"Error loading from: {recipient_name}" | |
return ["Error Loading Chain"],message | |
def display_chain_send(): | |
response = {'chain': mychain_send.chain, | |
'length': len(mychain_send.chain)} | |
return response | |
def display_chain_rec(): | |
response = {'chain': mychain_rec.chain, | |
'length': len(mychain_rec.chain)} | |
return response | |
def valid_send(): | |
valid,ind,mes = mychain_send.chain_valid(mychain_send.chain) | |
if valid: | |
response = 'The Blockchain is valid.' | |
z=True | |
else: | |
response = f'Sender Blockchain is not valid. {mes} at Index {ind}' | |
z=False | |
return response,z,mes,ind | |
def valid_rec(): | |
valid,ind,mes = mychain_rec.chain_valid(mychain_rec.chain) | |
if valid: | |
response = 'The Blockchain is valid.' | |
z=True | |
else: | |
response = f'Blockchain is not valid. {mes} at Index {ind}' | |
z=False | |
return response,z, mes, ind | |
def mychain_mine_block_send(chain_r=None,chain_n=None): | |
previous_block = mychain_send.print_previous_block() | |
previous_proof = previous_block['proof'] | |
proof = mychain_send.proof_of_work(previous_proof) | |
previous_hash = mychain_send.hash(previous_block) | |
block = mychain_send.create_block(proof, previous_hash,chain_r,chain_n) | |
response = {'message': 'A block is MINED', | |
'index': block['index'], | |
'timestamp': block['timestamp'], | |
'proof': block['proof'], | |
'previous_hash': block['previous_hash'] | |
} | |
message = "A block is MINED" | |
show_chain = display_chain_send() | |
if len(mychain_send.chain) > 1000: | |
mychain_send.reset() | |
response = None | |
show_chain=display_chain_send() | |
message = "New Chain Created at Max 20 Blocks" | |
return response, show_chain,message | |
def mychain_mine_block_rec(chain_r=None,chain_n=None): | |
previous_block = mychain_rec.print_previous_block() | |
previous_proof = previous_block['proof'] | |
proof = mychain_rec.proof_of_work(previous_proof) | |
previous_hash = mychain_rec.hash(previous_block) | |
block = mychain_rec.create_block(proof, previous_hash,chain_r,chain_n) | |
response = {'message': 'A block is MINED', | |
'index': block['index'], | |
'timestamp': block['timestamp'], | |
'proof': block['proof'], | |
'previous_hash': block['previous_hash'] | |
} | |
message = "A block is MINED" | |
show_chain = display_chain_rec() | |
if len(mychain_rec.chain) > 1000: | |
mychain_rec.reset() | |
response = None | |
show_chain=display_chain_rec() | |
message = "New Chain Created at Max 20 Blocks" | |
return response, show_chain, message | |
def store_image(img,chain_load,address): | |
main_chain_im=chain_load | |
chain_r=f"{main_chain_im.split('datasets/',1)[1].split('/raw',1)[0]}" | |
try: | |
api.upload_file( | |
path_or_fileobj=img, | |
path_in_repo=f'chat/{address}/{address}.png', | |
repo_id=chain_r, | |
token=token_self, | |
repo_type="dataset", | |
) | |
#os.remove("tmp_send.json") | |
except Exception as e: | |
print (f'Error storing image: {e}') | |
def update_rec_list(main_chain): | |
print (main_chain) | |
repo = main_chain.split('datasets/',1)[1].split('/raw',1)[0].split('/',1)[0] | |
name = main_chain.split('datasets/',1)[1].split('/raw',1)[0].split('/',1)[1] | |
f_ist = (api.list_repo_files(repo_id=f'{repo}/{name}', repo_type="dataset")) | |
print (f_ist) | |
rec_list =[] | |
rec_list.clear() | |
for i,ea in enumerate(f_ist): | |
if "chat/" in ea: | |
try: | |
if not ".png" in ea: | |
rec_list.append(ea.split("chat/",1)[1].split("/",1)[0]) | |
except Exception: | |
pass | |
print (f'REC_LIST : : {rec_list}') | |
return rec_list, gr.Dropdown.update(label="Recipient", choices=[f for f in rec_list]) | |
class MyChainSend: | |
def __init__(self,chain_load,load=None,create=None): | |
global main_chain_send | |
main_chain_send=chain_load | |
self.pending_transactions = [] | |
if load == None or load=="": | |
self.chain = [] | |
self.create_block(proof=1, previous_hash='0',chain_n=create) | |
elif load != None and load !="": | |
#r = requests.get(load) | |
lod = json.loads(load) | |
self.chain = lod | |
def reset(self,create=None): | |
self.chain = [] | |
self.pending_transactions = [] | |
self.create_block(proof=1, previous_hash='0',chain_n=create) | |
def create_block(self, proof, previous_hash,chain_r=None,chain_n=None): | |
if chain_r=="" or chain_r==None: | |
chain_r=f"{main_chain_send.split('datasets/',1)[1].split('/raw',1)[0]}" | |
if chain_n !="" and chain_n !=None: | |
chain_n = f"{main_chain_send.split('main/',1)[1]}{chain_n}.json" | |
print(f'chain_n send :: {chain_n}') | |
if chain_n=="" or chain_n==None: | |
chain_n="error_send.json" | |
#prev_block = len(blockchain.chain)-1 | |
#previous_block = blockchain.chain[prev_block] | |
block = {'index': len(self.chain) + 1, | |
'timestamp': str(datetime.datetime.now()), | |
'message': self.pending_transactions, | |
'proof': proof, | |
'previous_hash': previous_hash} | |
if self.block_valid(block) == True: | |
self.pending_transactions = [] | |
self.chain.append(block) | |
json_object = json.dumps(self.chain, indent=4) | |
with open("tmp_send.json", "w") as outfile: | |
outfile.write(json_object) | |
outfile.close() | |
try: | |
api.upload_file( | |
path_or_fileobj="tmp_send.json", | |
path_in_repo=f'{chain_n}', | |
repo_id=chain_r, | |
token=token_self, | |
repo_type="dataset", | |
) | |
os.remove("tmp_send.json") | |
except Exception as e: | |
print(e) | |
pass | |
return block | |
else: | |
block = {"Not Valid"} | |
print("not Valid") | |
return block | |
def print_previous_block(self): | |
return self.chain[-1] | |
def new_transaction(self, sender, recipient, message,priv_key): | |
transaction = { | |
'sender': sender, | |
'recipient': recipient, | |
'message': message, | |
} | |
transaction = crypt.encrypt_trans(transaction,priv_key) | |
self.pending_transactions.append(str(transaction)) | |
def proof_of_work(self, previous_proof): | |
new_proof = 1 | |
check_proof = False | |
while check_proof is False: | |
hash_operation = hashlib.sha256( | |
str(new_proof**2 - previous_proof**2).encode()).hexdigest() | |
if hash_operation[:5] == '00000': | |
check_proof = True | |
else: | |
new_proof += 1 | |
return new_proof | |
def hash(self, block): | |
encoded_block = json.dumps(block, sort_keys=True).encode() | |
return hashlib.sha256(encoded_block).hexdigest() | |
def block_valid(self, block): | |
#print (block) | |
#prev_block=len(self.chain) | |
if len(self.chain) > 0: | |
prev_block = len(self.chain)-1 | |
previous_block = self.chain[prev_block] | |
#print (previous_block) | |
out=True | |
ind=None | |
mes=None | |
if block['previous_hash'] != self.hash(previous_block): | |
out=False | |
#ind=block_index | |
mes='Hash' | |
previous_proof = previous_block['proof'] | |
proof = block['proof'] | |
hash_operation = hashlib.sha256( | |
str(proof**2 - previous_proof**2).encode()).hexdigest() | |
if hash_operation[:5] != '00000': | |
out=False | |
#ind=block_index+1 | |
mes='Proof' | |
previous_block = block | |
else: | |
out = True | |
return out | |
def chain_valid(self, chain): | |
previous_block = chain[0] | |
block_index = 1 | |
out=True | |
ind=None | |
mes=None | |
while block_index < len(chain): | |
block = chain[block_index] | |
if block['previous_hash'] != self.hash(previous_block): | |
out=False | |
ind=block_index | |
mes='Hash' | |
break | |
previous_proof = previous_block['proof'] | |
proof = block['proof'] | |
hash_operation = hashlib.sha256( | |
str(proof**2 - previous_proof**2).encode()).hexdigest() | |
if hash_operation[:5] != '00000': | |
out=False | |
ind=block_index+1 | |
mes='Proof' | |
break | |
previous_block = block | |
block_index += 1 | |
return out, ind, mes | |
def deep_valid_send(self, chain1,chain2): | |
block_index = 1 | |
out=True | |
ind=None | |
mes=None | |
while block_index < len(chain1): | |
block = chain1[block_index] | |
block_ind = block['block'] | |
block2 = chain2[block_ind] | |
check1 = { | |
'timestamp':block['timestamp'], | |
'recipient':block['transactions']['recipient'], | |
'amount':block['transactions']['amount'], | |
'balance':block['transactions']['balance'], | |
'balance2':block['balance'], | |
'proof':block['proof'], | |
'previous_hash':block['previous_hash'] | |
} | |
zz=1 | |
while zz < len(block2[transactions]): | |
check2 = { | |
'timestamp':block2['timestamp'], | |
'sender':block2['transactions'][zz][0]['name'], | |
'recipient':block2['transactions'][zz][0]['recipient'], | |
'amount':block2['transactions'][zz][0]['amount'], | |
'balance':block2['transactions'][zz][0]['balance'], | |
'balance2':block2['transactions'][zz][0]['balance'], | |
'proof':block2['proof'], | |
'previous_hash':block2['previous_hash'] | |
} | |
zz+=1 | |
if self.hash(check1) != self.hash(check2): | |
out=False | |
ind=block_index | |
mes='Hash' | |
break | |
if out == False: | |
break | |
block_index += 1 | |
return out, ind, mes | |
class MyChainRec: | |
def __init__(self,chain_load, load=None,create=None,pub_key=None): | |
global main_chain_rec | |
main_chain_rec=chain_load | |
self.pending_transactions = [] | |
if load == None or load=="": | |
self.chain = [] | |
self.create_block(proof=1, previous_hash='0',chain_n=create,pub_key=pub_key) | |
if load != None and load !="": | |
#r = requests.get(load) | |
lod = json.loads(load) | |
self.chain = lod | |
def reset(self,create=None): | |
self.chain = [] | |
self.pending_transactions = [] | |
self.create_block(proof=1, previous_hash='0',chain_n=create) | |
def create_block(self, proof, previous_hash,chain_r=None,chain_n=None,pub_key=None): | |
if chain_r=="" or chain_r==None: | |
chain_r=f"{main_chain_rec.split('datasets/',1)[1].split('/raw',1)[0]}" | |
if chain_n !="" and chain_n !=None: | |
chain_n = f"{main_chain_rec.split('main/',1)[1]}{chain_n}.json" | |
if chain_n=="" or chain_n==None: | |
chain_n="error_rec.json" | |
print(f'chain_n rec :: {chain_n}') | |
#prev_block = len(blockchain.chain)-1 | |
#previous_block = blockchain.chain[prev_block] | |
if pub_key !=None and pub_key!="": | |
block = {'index': len(self.chain) + 1, | |
'timestamp': str(datetime.datetime.now()), | |
'message': pub_key, | |
'proof': proof, | |
'previous_hash': previous_hash} | |
else: | |
block = {'index': len(self.chain) + 1, | |
'timestamp': str(datetime.datetime.now()), | |
'message': self.pending_transactions, | |
'proof': proof, | |
'previous_hash': previous_hash} | |
if self.block_valid(block) == True: | |
self.pending_transactions = [] | |
self.chain.append(block) | |
json_object = json.dumps(self.chain, indent=4) | |
with open("tmp_rec.json", "w") as outfile: | |
outfile.write(json_object) | |
outfile.close() | |
try: | |
api.upload_file( | |
path_or_fileobj="tmp_rec.json", | |
path_in_repo=f'{chain_n}', | |
repo_id=chain_r, | |
token=token_self, | |
repo_type="dataset", | |
) | |
os.remove("tmp_rec.json") | |
except Exception as e: | |
print(e) | |
pass | |
return block | |
else: | |
block = {"Not Valid"} | |
print("not Valid") | |
return block | |
def print_previous_block(self): | |
return self.chain[-1] | |
def new_transaction(self, sender, recipient, message,pub_key): | |
transaction = { | |
'sender': sender, | |
'recipient': recipient, | |
'message': message, | |
} | |
transaction = crypt.encrypt_trans(transaction,pub_key) | |
self.pending_transactions.append(str(transaction)) | |
def proof_of_work(self, previous_proof): | |
new_proof = 1 | |
check_proof = False | |
while check_proof is False: | |
hash_operation = hashlib.sha256( | |
str(new_proof**2 - previous_proof**2).encode()).hexdigest() | |
if hash_operation[:5] == '00000': | |
check_proof = True | |
else: | |
new_proof += 1 | |
return new_proof | |
def hash(self, block): | |
encoded_block = json.dumps(block, sort_keys=True).encode() | |
return hashlib.sha256(encoded_block).hexdigest() | |
def block_valid(self, block): | |
print (block) | |
#prev_block=len(self.chain) | |
if len(self.chain) > 0: | |
prev_block = len(self.chain)-1 | |
previous_block = self.chain[prev_block] | |
print (previous_block) | |
out=True | |
ind=None | |
mes=None | |
if block['previous_hash'] != self.hash(previous_block): | |
out=False | |
#ind=block_index | |
mes='Hash' | |
previous_proof = previous_block['proof'] | |
proof = block['proof'] | |
hash_operation = hashlib.sha256( | |
str(proof**2 - previous_proof**2).encode()).hexdigest() | |
if hash_operation[:5] != '00000': | |
out=False | |
#ind=block_index+1 | |
mes='Proof' | |
previous_block = block | |
else: | |
out = True | |
return out | |
def chain_valid(self, chain): | |
previous_block = chain[0] | |
block_index = 1 | |
out=True | |
ind=None | |
mes=None | |
while block_index < len(chain): | |
block = chain[block_index] | |
if block['previous_hash'] != self.hash(previous_block): | |
out=False | |
ind=block_index | |
mes='Hash' | |
break | |
previous_proof = previous_block['proof'] | |
proof = block['proof'] | |
hash_operation = hashlib.sha256( | |
str(proof**2 - previous_proof**2).encode()).hexdigest() | |
if hash_operation[:5] != '00000': | |
out=False | |
ind=block_index+1 | |
mes='Proof' | |
break | |
previous_block = block | |
block_index += 1 | |
return out, ind, mes |