def mine_unconfirmed_block(): bloque = blockchain.mine() if bloque == -1: return render_template("home.html", minado=-1, indice=False) nodos = BaseDeDatos.cargarNodos() #guardo todas las respuestas respuestas = [] #envio el bloque a todos los nodos de la blockchain for ipNodo in nodos: try: cliente = Cliente(ipNodo) respuesta = cliente.enviar( json.dumps(bloque.__dict__, sort_keys=False)) respuestas.append(respuesta) except: print("El nodo con ip {} no esta conectado") #cuento las respuestas ok, si estas son igual al numero de nodos contadorOk = 0 for respuesta in respuestas: if respuesta == "ok": contadorOk += 1 #lo guardo en mi blockchain y le digo al resto de nodos que lo guarden if contadorOk == len(respuestas): guardar_bloque(bloque) for ipNodo in nodos: try: cliente = Cliente(ipNodo) cliente.enviar("confirmado") except: print("El nodo con ip {} no esta conectado") result = bloque.get_indice() return render_template("home.html", minado=1, indice=result)
def __init__(self): Thread.__init__(self) # Esta ip luego será una variable de entorno self.myIP = "10.129.84.108" try: self.clientes = BaseDeDatos.cargarNodos() except: self.clientes = []
def consulta(): usuario = request.form['user'] #es el hashDato hash = request.form['consulta'] guardar_log_consulta(usuario, hash) nodos = BaseDeDatos.cargarNodos() #primero miro en el servidor consulta = BaseDeDatos.consulta_hahses_hashDato(hash) # guardo todas las respuestas respuestas = [] # envio el bloque a todos los nodos de la blockchain for ipNodo in nodos: try: cliente = Cliente(ipNodo) respuesta = cliente.enviar(("hashB", hash)) respuestas.append(respuesta) except: print("El nodo con ip {} no esta conectado") # cuento las respuestas ok, si estas son igual al numero de nodos contadorOk = 0 for respuesta in respuestas: if respuesta == "ok": contadorOk += 1 if contadorOk == len(nodos): return render_template( "home.html", resultadoConsulta= "la transaccion esta correctamente en la blockchain", respuestaConsulta=True) if consulta: #significa que en el servidor está mal pass return render_template( "home.html", resultadoConsulta="la transacción no se encuentra en la blockchain", respuestaConsulta=True)
def run(self): while True: try: # Recibir datos del cliente. input_data = self.conn.recv(1024) except error: print("[%s] Error de lectura." % self.name) break else: if input_data: msg = input_data.decode("utf-8") print("mensaje", msg) #lista es una tuppla de 2 elementos, el primero es un string (blockchainID) para indicar que el segundo elemento de la lista es el id del ultimo bloque lista = msg.split("#") if lista[0] == "Indice": indice = lista[1] #cojo el bloque bloque = BaseDeDatos.bloqueIndice(indice) bloqueString = json.dumps(bloque) print("envio bloque", bloqueString) self.conn.send(bytes(bloqueString, "utf-8")) #se consulta una transaccion en todos los nodos de la blockchain elif lista[0] == "hashB": transaccion = BaseDeDatos.verificaTransaccion(lista[1]) if transaccion: # le digo al cliente que esta ok self.conn.send(bytes("ok", "utf-8")) else: # le hago saber que no esta bien self.conn.send(bytes("not ok", "utf-8")) elif msg == "hello padre": # si es un hello, envio mi lista de ips (solo si es el nodo padre, si no lo es, no hace nada) direccionesIP = "" try: nodos = BaseDeDatos.cargarNodos() except: self.conn.send(bytes("no hay nodos", "utf-8")) # construyo una cadena que tendra todas las ips de mis nodos, para poderselo enviar al nuevo for ip in nodos: if ip != nodos[-1]: direccionesIP = direccionesIP + str(ip) + "#" else: direccionesIP = direccionesIP + str(ip) print("envio la lista de ips: ", direccionesIP) self.conn.send(bytes(direccionesIP, "utf-8")) elif msg == "hello": self.conn.send(bytes("ok", "utf-8")) elif msg == "ultimoBloque": bloque = BlockchainController.consultaUltimoBloque() bloqueString = json.dumps(bloque) print("envio el bloque", bloqueString) self.conn.send(bytes(bloqueString, "utf-8")) elif msg == "solicitud": #me pide la blockchain, le devuelvo el len de mi blockchain, y que me vaya pidiendo bloque a bloque bloque = BaseDeDatos.consultaUltimoBloque() print(bloque["indice"]) self.conn.send(bytes(str(bloque["indice"]), "utf-8")) elif msg == "confirmado": BlockchainController.confirmado() self.conn.send(bytes("ok", "utf-8")) else: #envio el bloque al consenso, si se confirma, le doy el ok y lo guardo en mi blockchain, sino, le digo que es erroneo bloque = BlockchainController.mi_consenso(msg) print("me llega el bloque ", bloque) if bloque: # le digo al cliente que esta ok print("le digo al cliente que esta ok") self.conn.send(bytes("ok", "utf-8")) else: # le hago saber que no esta bien self.conn.send(bytes("not ok", "utf-8"))
def cargarNodos(): return BaseDeDatos.cargarNodos()