Esempio n. 1
0
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)
Esempio n. 2
0
 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 = []
Esempio n. 3
0
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)
Esempio n. 4
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. 5
0
def cargarNodos():
    return BaseDeDatos.cargarNodos()