Funcionamiento interno

Los diagramas de flujos permiten visualizar como es el funcionamiento logico interno de las aplicaciones, lo que ayuda a un diseño mas fluido, una deteccion de errores mas sencilla y una capacidad de mejora escalable.

Empezemos con el inicio del programa:

  • InicializarFormulario();  Crea e inicializa todos los controles necesarios para el funcionamiento del programa, tanto visuales (memo, edit, etc) como no visuales (stringlist, TCPServer, etc).
  • VerificarArchivos(); Verifica que los archivos necesarios existan, y si no los encuentra, los crea con la informacion por defecto, al mismo tiempo que almacena en memoria la informacion necesaria.
  • InicializarGUI();  Inicializa la informacion que sera mostrada al usuario en pantalla.
  • InitTime();  Inicializa el tiempo, de manera que el programa sepa cual es su hora local con respecto al tiempo UTC. Esto permite mas adelante poder usar siempre la hora del reloj interno para las operaciones, el cual es mucho mas facil de obtener que hacer peticiones NTP cada vez que sea necesario.
  • UpdateMyData();  Ya esta cargada toda la informacion del usuario, por tanto es posible establecer el 'punto de inicio' de la sesion, que son los valores que daremos como propios a los pares con quienes nos conectemos.
  • ResetMinerInfo(); Se reinician los valores del minero en base a los anteriores.
Una vez verificado que todo esta en orden, empieza el 'latido' del programa, esto es, el proceso que continuamente verificara que es lo que ha pasado o cambiado, y actuara en consecuencia.

Veamos los pasos del 'latido' uno a uno:
  • ActualizarGUI(); Actualiza toda la informacion que se mostrara en pantalla al usuario; variables del tipo 'U_xxxx' son marcadas como positivas para actualizar al siguiente latido. Este procedimiento, va actualizando y revirtiendolas a negativo, para que no sea necesario refrescar esa informacion en cada latido si no es necesario.
  • MostrarLineasDeConsola(); Todas las acciones del usuario generan una salida de consola para informarle del resultado. Estas son almacenadas por cada latido en la TStringList 'ConsoleLines', la cual es completamente mostrada aqui y a continuacion vaciada para empezar de nuevo.
  • SaveUpdatedFiles(); Si algun archivo ha sido modificado y requiere ser guardado, se activa una variable del tipo 'S_xxx' las cuales son analizadas aqui y procesadas.
  • ProcesarLineas(); Si el usuario ingresa un comando en la linea de comandos, este no se ejecuta de inmediato: es almacenado  en el TStringList 'ProcessLines' y aqui son ejecutados. Esto es para impedir que la ejecucion de un comando pueda interferir con un proceso en marcha.
  • LeerLineasDeClientes();  Ya que las lineas que llegan al servidor son almacenadas automaticamente, esta funcion es necesaria para almacenar cualquier lineas que llegue a travez de una conexion que hayamos establecido como cliente (Las cuales no se guardan automaticamente, si no que quedan en el buffer de los canalescliente hasta que este procedimiento es ejecutado)
  • ParseProtocolLines(); Procesar las lines recibidas desde los pares de la red.
  • VerifyConnectionStatus(); Proceso para verificar cual es el estado actual de la conexion, y, dependiendo de este, poder sincronizar con la red. Hay 4 valores posibles para 'MyConStatus':
    0 - Desconectado. No hay ninguna conexion con pares.
    1 - Conectando. Hay alguna conexion con pares, pero menos de las necesarias para poder solventar el problema de los generales bizantinos. Este valor esta definido por la constante 'MinConexToWork' (usualmente 5 o mas).
    3 - Conectado. Hay suficientes conexiones para trabajar y se esta sincronizando con la red, descargando los bloques faltantes, el archivo de sumario y toda informacion que nos sea necesaria.
    4 - Actualizado. Estamos conectados y sincronizados con la red. Podemos minar nuevos bloques, enviar transferencias y cualquier otra cosa que este permitida por el protocolo
  • VerifyMiner(); (Por implementar) Verifica si el minero se puede activar, y en caso de estar activado, si ha encontrado la solucion del bloque en curso.
Llegados a este punto, nuestro programa puede sostener una red P2P estable, pero hay muy pocas cosas que los pares pueden 'decirse' entre si, salvo intercambiar pings para mantenerse actualizados. Pero la red P2P es, como comentamos desde el inicio, la base sobre la que se asienta cualquier criptomoneda; una vez establecida, se puede mantener en permanente funcionamiento: para eso incorporaremos el 'AutoUpdate' de desarrollador en la siguiente entrada.




Comentarios

Entradas populares de este blog

Como funciona una criptomoneda?

Codigo fuente y binarios version 0.1.0