Esempio n. 1
0
def almacenar():
    '''
    Aqui almacenaré la blockchain, para poder disponer de ella una vez vuelva
    a ejecutar el programa o después de volver a arrancar la máquina
    '''

    #almaceno el 'ultimo bloque
    global blockchain
    BaseDeDatos.almacenarBlockchain(blockchain.get_cadena())
Esempio n. 2
0
def guardar_transacciones(bloque):
    print("guardo transacciones")
    transacciones = bloque.get_transacciones()
    print("las transacciones son: ", transacciones)
    for transaccion in transacciones:
        print("la tansaccion es : ", transaccion, "el value es:",
              transacciones[transaccion], "y el hash del bloque es",
              bloque.get_hash())
        BaseDeDatos.almacenar_transaccion_block_aceptado(
            transaccion, transacciones[transaccion], bloque.get_hash())
Esempio n. 3
0
def guardar_log_consulta(usuario, hashDato):
    # primero miro el indice del ultimo log
    ultimoLog = BaseDeDatos.consultaUltimoLog()
    # si no existe ningun log, significa que este es el primero y el indice sera 1
    if ultimoLog:
        indice = ultimoLog['indice']
        miIndice = int(indice) + 1
        log = Log(miIndice, usuario, time.ctime(time.time()), hashDato,
                  "Consulta")

    else:
        log = Log(0, usuario, time.ctime(time.time()), hashDato, "Consulta")

    BaseDeDatos.almacenar_log(log)
Esempio n. 4
0
def compruebaBlockchain():

    #este metodo devuelve el primer bloque, es decir, el genesis
    bloqueGenesis = BaseDeDatos.encuentraUnBloque()
    blockchain.set_genesis(bloqueGenesis)

    if bloqueGenesis:
        #si existe la base de datos solo tengo que cargar el 'ultimo bloque
        bloque = consultaUltimoBloque()

        #creo el nuevo bloque, que será una copia del último añadido en la bbdd
        block = construirBloque(bloque)
        blockchain.cargarBlock(block)

        #miro las últimas transacciones no minadas y se las añado al bloque sin minar de mi blockchain
        transacciones = consultaTransacciones()

        #despues de haber cargado mi base de datos, actualizo
        actuaizar()

        for transaccion in transacciones:
            blockchain.add_transaccion_minada(transaccion)

    else:
        #el padre si es nuevo no se tiene que registrar
        #tiene que crear el bloque genesis
        if soyPadre:
            blockchain.crear_genesis_block()
        else:
            #si no existe un bloque genesis, es que soy nuevo y me registro
            register_me()
Esempio n. 5
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. 6
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. 7
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. 8
0
def consultaNombre():
    return BaseDeDatos.consultaNombre()
Esempio n. 9
0
def guardar_hashes(hashDato, hashB):
    BaseDeDatos.almacenar_hashes(hashDato, hashB)
Esempio n. 10
0
def addNodo(ip):
    BaseDeDatos.addNodo(ip)
Esempio n. 11
0
def consultaBloque(hash):
    bloque = []
    for dato in BaseDeDatos.consultaUnBloque(hash):
        bloque.append(dato)
    return bloque
Esempio n. 12
0
def consultaTransacciones():
    transacciones = []
    for transaccion in BaseDeDatos.consultaTransacciones():
        transacciones.append(transaccion)
    return transacciones
Esempio n. 13
0
def cargarNodos():
    return BaseDeDatos.cargarNodos()
Esempio n. 14
0
def consultaTransaccion(hashT):
    transaccion = []
    for dato in BaseDeDatos.consultaUnaTransaccion(hashT):
        transaccion.append(dato)
    return transaccion
Esempio n. 15
0
def almacenarTransaccion(transaccion):
    BaseDeDatos.almacenar_transaccion(transaccion)
Esempio n. 16
0
    def add_cliente(self, ip):

        if ip != self.myIP or ip not in self.clientes:
            self.clientes.append(ip)
            print("añado", ip)
            BaseDeDatos.addNodo(ip)
Esempio n. 17
0
def resetearBlockchain():
    BaseDeDatos.eliminarDatos()
Esempio n. 18
0
def add_genesis(genesis):
    BaseDeDatos.almacenar_genesis(genesis)
Esempio n. 19
0
def add_block_db(block):
    '''''
    En este caso, este metodo guardara el bloque en la base de datos, en vez de localmente en el programa.
    '''
    BaseDeDatos.almacenarBloque(block)
Esempio n. 20
0
def consultaBlockchain():
    blockchain = []
    for block in BaseDeDatos.consultaDatos():
        blockchain.append(block)
    return blockchain
Esempio n. 21
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. 22
0
def consultaUltimoBloque() -> Block:
    return BaseDeDatos.consultaUltimoBloque()