Esempio n. 1
0
    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"))
Esempio n. 2
0
def consultaUltimoBloque() -> Block:
    return BaseDeDatos.consultaUltimoBloque()