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())
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())
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)
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()
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 consultaNombre(): return BaseDeDatos.consultaNombre()
def guardar_hashes(hashDato, hashB): BaseDeDatos.almacenar_hashes(hashDato, hashB)
def addNodo(ip): BaseDeDatos.addNodo(ip)
def consultaBloque(hash): bloque = [] for dato in BaseDeDatos.consultaUnBloque(hash): bloque.append(dato) return bloque
def consultaTransacciones(): transacciones = [] for transaccion in BaseDeDatos.consultaTransacciones(): transacciones.append(transaccion) return transacciones
def cargarNodos(): return BaseDeDatos.cargarNodos()
def consultaTransaccion(hashT): transaccion = [] for dato in BaseDeDatos.consultaUnaTransaccion(hashT): transaccion.append(dato) return transaccion
def almacenarTransaccion(transaccion): BaseDeDatos.almacenar_transaccion(transaccion)
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)
def resetearBlockchain(): BaseDeDatos.eliminarDatos()
def add_genesis(genesis): BaseDeDatos.almacenar_genesis(genesis)
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)
def consultaBlockchain(): blockchain = [] for block in BaseDeDatos.consultaDatos(): blockchain.append(block) return blockchain
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 consultaUltimoBloque() -> Block: return BaseDeDatos.consultaUltimoBloque()