def node_message(self, node, data): from node.unl import get_unl_nodes, get_as_node_type if str(data) == "sendmefullledger": self.send_full_chain(node) print("Data Type: " + str(type(data)) + "\n") if str(data) == "sendmefullnodelist": self.send_full_node_list(node) print("Data Type: " + str(type(data)) + "\n") try: from node.unl import node_is_unl if data["fullledger"] == 1 and node_is_unl( node.id) and Ecdsa.verify( "fullledger" + data["byte"], Signature.fromBase64(data["signature"]), PublicKey.fromPem(node.id)): print("getting chain") self.get_full_chain(data["byte"]) except: pass try: from node.unl import node_is_unl if data["fullnodelist"] == 1 and node_is_unl( node.id) and Ecdsa.verify( "fullnodelist" + data["byte"], Signature.fromBase64(data["signature"]), PublicKey.fromPem(node.id)): print("getting node list") self.get_full_node_list(data["byte"]) except: pass try: if data["transactionrequest"] == 1: self.get_transaction(data, node) except Exception as e: print(e) pass try: if data["transactionresponse"] == 1: self.get_transaction_response(data, node) except Exception as e: print(e) pass print("node_message from " + node.id + ": " + str(data))
def createTrans(self, sequance_number, signature, fromUser, toUser, transaction_fee, data, amount, transaction_time, transaction_sender=None): # Printing the info of tx dprint("\nCreating the transaction") dprint("***") dprint(sequance_number) dprint(signature) dprint(fromUser) dprint(toUser) dprint(data) dprint(amount) dprint("***\n") # End # Some data signature_class = Signature.fromBase64(signature) temp_signature = signature_class.toBase64() already_got = self.tx_already_got(temp_signature) # End # Validation dprint("\nValidation") if Ecdsa.verify((str(sequance_number)+str(fromUser)+str(toUser)+str(data)+str(amount)+str(transaction_fee)+str(transaction_time)), signature_class, PublicKey.fromPem(fromUser)) and not amount < self.minumum_transfer_amount and not transaction_fee < self.transaction_fee and not already_got and not (int(time.time()) - transaction_time) > 60: dprint("Signature is valid") dprint("Getsequancenumber: "+str(GetSequanceNumber(fromUser, self)+1)) if sequance_number == (GetSequanceNumber(fromUser, self)+1): dprint("Sequance number is valid") balance = GetBalance(fromUser, self) if balance >= (float(amount)+float(transaction_fee)) and (balance - (float(amount)+float(transaction_fee))) > 2: dprint("Amount is valid") # Local saving the_tx = Transaction( sequance_number= sequance_number, signature=temp_signature, fromUser= fromUser, toUser=toUser, data = data, amount = amount, transaction_fee= transaction_fee, time_of_transaction = transaction_time ) self.pendingTransaction.append(the_tx) self.change_transaction_fee() self.save_block() # End self.propagating_the_tx(the_tx) return True dprint(" Validation end")
def get_candidate_block(self, data, node): dprint("Getting the candidate block") from node.unl import node_is_unl if node_is_unl(node.id) and GetBlock( ).sequance_number == data["sequance_number"]: dprint("is unl") signature_list = [] for element in data["transaction"]: signature_list.append(element["signature"]) dprint("signature_list: " + str(signature_list)) merkle_root_of_signature_list = MerkleTree( signature_list).getRootHash( ) if len(signature_list) != 0 else "0" dprint("signatureverify: " + str( Ecdsa.verify("myblock" + merkle_root_of_signature_list, Signature.fromBase64(data["signature"]), PublicKey.fromPem(node.id)))) dprint("publickey from pem: " + str(node.id)) dprint("merkleroot: " + merkle_root_of_signature_list) if Ecdsa.verify( "myblock" + merkle_root_of_signature_list + str(data["sequance_number"]), Signature.fromBase64(data["signature"]), PublicKey.fromPem(node.id)): dprint("ecdsa true") temp_tx = [] for element in data["transaction"]: temp_tx.append(Transaction.load_json(element)) data["transaction"] = temp_tx node.candidate_block = data
def get_candidate_block_hash(self, data, node): dprint("Getting the candidate block hash") from node.unl import node_is_unl if node_is_unl(node.id) and GetBlock( ).sequance_number == data["sequance_number"]: dprint("is unl") if Ecdsa.verify( "myblockhash" + data["hash"] + str(data["sequance_number"]), Signature.fromBase64(data["signature"]), PublicKey.fromPem(node.id)): dprint("ecdsa true") data["sender"] = node.id node.candidate_block_hash = data
def get_transaction_response(self, data, node): #burada bu mesaj gönderen adamın bizim istediğimiz node ve pub key olup olmadığına bakacağız. ayrıca eğer unl listemizdeki bir adamdan evet oyu aldıysak o oyu hayıra çeviremeyiz from ledger.ledger_main import get_ledger dprint("Getting the transactions response") system = get_ledger() from node.unl import node_is_unl if node_is_unl(node.id): for tx in system.validating_list: if node.id == data["fromUser"] and Ecdsa.verify( data["response"] + str(data["transaction_signature"]), Signature.fromBase64(data["signature"]), PublicKey.fromPem(data["fromUser"])): if data["transaction_signature"] == tx.signature: if data["response"] == "TRUE": tx.valid.append({"data": data, "node": node.id}) system.Verificate_Pending_Trans() elif data["response"] == "FALSE": tx.invalid.append({"data": data, "node": node.id}) system.Verificate_Pending_Trans()
def createTrans(self, sequance_number, signature, fromUser, toUser, transaction_fee, data=None, amount=None, transaction_sender=None, response=False): dprint("\nCreating transaction.") signature_class = Signature.fromBase64(signature) dprint("***") dprint(sequance_number) dprint(signature) dprint(fromUser) dprint(toUser) dprint(data) dprint(amount) dprint("***\n") dprint( Ecdsa.verify((str(sequance_number) + str(fromUser) + str(toUser) + str(data) + str(amount) + str(transaction_fee)), signature_class, PublicKey.fromPem(fromUser))) temp_signature = signature_class.toBase64() already_in_pending = False for already_tx in (self.pendingTransaction + self.validating_list): if already_tx.signature == temp_signature: already_in_pending = True if Ecdsa.verify((str(sequance_number) + str(fromUser) + str(toUser) + str(data) + str(amount) + str(transaction_fee)), signature_class, PublicKey.fromPem(fromUser)): if sequance_number == (self.getSequanceNumber(fromUser) + 1) or already_in_pending: dprint("Sign verify is true.") if (self.getBalance(fromUser) >= (float(amount) + float(transaction_fee)) and float(amount) != float(0)) or response == False: temp_transaction = Transaction( sequance_number=sequance_number, signature=signature_class.toBase64(), fromUser=fromUser, toUser=toUser, data=data, amount=amount, transaction_fee=transaction_fee) dprint("Balance controll is true.") if already_in_pending == False: self.pendingTransaction.append(temp_transaction) self.save_ledger() from node.myownp2pn import MyOwnPeer2PeerNode dprint("imported myownpeer2peernode") if transaction_sender is None: if already_in_pending == False: MyOwnPeer2PeerNode.main_node.send_to_nodes({ "transactionrequest": 1, "sequance_number": sequance_number, "signature": signature, "fromUser": fromUser, "to_user": toUser, "data": data, "amount": amount, "transaction_fee": transaction_fee, "response": False }) else: dprint(str(response)) if response: self.send_my_response_on_transaction( temp_transaction=temp_transaction, response="TRUE", transaction_sender=transaction_sender) if already_in_pending == False: MyOwnPeer2PeerNode.main_node.send_to_nodes( { "transactionrequest": 1, "sequance_number": sequance_number, "signature": signature, "fromUser": fromUser, "to_user": toUser, "data": data, "amount": amount, "transaction_fee": transaction_fee, "response": False }, exclude=[transaction_sender]) self.Verificate_Pending_Trans() return True else: if transaction_sender != None and response == True: self.send_my_response_on_transaction( temp_transaction=temp_transaction, response="FALSE", transaction_sender=transaction_sender) else: if transaction_sender != None and response == True: self.send_my_response_on_transaction( temp_transaction=temp_transaction, response="FALSE", transaction_sender=transaction_sender)
def message_from_node(self, node, data): from node.unl import get_unl_nodes, get_as_node_type if str(data) == "sendmefullblock": self.send_full_chain(node) print("Data Type: " + str(type(data)) + "\n") if str(data) == "sendmefullnodelist": self.send_full_node_list(node) print("Data Type: " + str(type(data)) + "\n") try: from node.unl import node_is_unl if data["fullblock"] == 1 and node_is_unl( node.id) and Ecdsa.verify( "fullblock" + data["byte"], Signature.fromBase64(data["signature"]), PublicKey.fromPem(node.id)): print("getting chain") self.get_full_chain(data, node) except Exception as e: print(e) try: from node.unl import node_is_unl if data["fullaccounts"] == 1 and node_is_unl( node.id) and Ecdsa.verify( "fullaccounts" + data["byte"], Signature.fromBase64(data["signature"]), PublicKey.fromPem(node.id)): print("getting chain") self.get_full_accounts(data, node) except Exception as e: print(e) try: from node.unl import node_is_unl if data["fullblockshash"] == 1 and node_is_unl( node.id) and Ecdsa.verify( "fullblockshash" + data["byte"], Signature.fromBase64(data["signature"]), PublicKey.fromPem(node.id)): self.get_full_blockshash(data, node) except Exception as e: print(e) try: from node.unl import node_is_unl if data["fullnodelist"] == 1 and node_is_unl( node.id) and Ecdsa.verify( "fullnodelist" + data["byte"], Signature.fromBase64(data["signature"]), PublicKey.fromPem(node.id)): print("getting node list") self.get_full_node_list(data["byte"]) except Exception as e: print(e) try: if data["transactionrequest"] == 1: self.get_transaction(data, node) except Exception as e: print(e) try: if data["action"] == "myblock": self.get_candidate_block(data, node) except Exception as e: print(e) try: if data["action"] == "myblockhash": self.get_candidate_block_hash(data, node) except Exception as e: print(e) print("message_from_node from " + node.id + ": " + str(data))