Entradas

Mostrando entradas de diciembre, 2020

AutoUpdate de desarrollador.

P4A11B875631DB65EF270D7BFFCB4B7D814 Es el valor de la constante AdminHash; tambien es el 'minero' del bloque 0 y, por tanto, la primera direccion del sumario. Esta es nuestra direccion publica. Cualquier mensaje recibido en la red, autentificado por esta direccion publica, proviene de nosotros. Esto nos permite poder enviar las ultimas versiones del programa a los usuarios de la red y que todos sepan que es una version original. Desde luego, los usuarios pueden optar por descargarlo e instalarlo  automaticamente o hacerlo manualmente mas tarde, en caso de que prefieran primero ver los cambios que incluye o ver el codigo fuente. Normalmente, el programa podra seguir funcionando en la red aunque se disponga de una version antigua de el, ya que a partir de la version 0.0.1 toda la conectividad esta incluida. El proceso es el siguiente: Una vez tenemos completada una nueva version, esta es comprimida junto con su actualizador en un archivo .ZIP de nombre 'mpupdatex.x.x.zip'

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

El minero

Imagen
Aunque la mayoria, si no todas, las carteras de criptomonedas incluyen las funciones para minar la moneda dentro de ella, tambien existen aplicaciones externas desarrolladas unicamente para minar bloques, esto es, encontrar el valor ' nonce ' cuyo hash incluye la respuesta al problema solicitado. Aunque ya lo habiamos comentado antes, no esta demas recordar como es el proceso de mineria en una criptomoneda: Al minarse un bloque, este produce un hash. Un determinado numero de caracteres iniciales de dicho hash (dependiendo de la dificultad actual de la red) seran el problema a buscar para resolver el siguiente bloque. Como se consiguen estos caracteres? Con una combinacion de 6 letras mayusculas aleatoria, seguido de la direccion paskal del minero y por ultimo un numero entre 100000000 y 999999999. El minero debe probar diferentes combinaciones hasta que el hash de una de ellas contenga el problema planteado. Como el problema esta formulado con la informacion del bloque previo,

Detalles de la red Paskal

Todas las partes del desarrollo de una criptomoneda son importantes, pero la sincronizacion correcta de la red es crucial, amen que requiere procedimientos para manejar los imprevistos (que seguro los abrá) sin alterar la cadena de bloques de manera catastrófica. Hace falta que el protocolo incluya medidas de seguridad para cualquier cosa que pueda ocurrir, e incluso, para cosas que ni nos podamos imaginar ahora. Antes de empezar, hay que conocer algunos conceptos importantes para comprender como se sincroniza una red P2P en base a un consenso de la mayoria de los usuarios conectados. Informacion flotante. Toda la informacion que circula en la red que no esta relacionada con movimiento de monedas a ser guardada en la cadena de bloques se puede denominar informacion flotante. Un claro ejemplo de ello es la informacion de los nodos disponibles: todos los usuarios comparten la informacion de los nodos a los que ellos han podido acceder, pero eso nunca se guardara en la cadena de bloques.

El sumario de cuentas

El sumario de cuentas es un archivo que contiene, entre otras cosas, el saldo de todas las direcciones que en algun momento han recibido monedas de cualquier procedencia, sea por minado o por transferencia desde otra direccion. Las direcciones se van añadiendo por orden, la mas antigua de primera y la mas reciente de ultima. (Esto implica que la primera direccion sera la del minero del bloque 1) Esto significa que todos los usuario deben tener un sumario de cuentas completamente igual, que arrojara un hash identico: esta es una de las medidas de seguridad para garantizar la integridad de la red. En el sumario de cuentas, aparte de la direccion y el saldo, tambien se almacena el alias de esa direccion (si lo hubiese), el numero del bloque en el cual participo en una orden por ultima vez (sea como remitente, receptor, personalizacion o comision) y un valor de puntuacion (mas adelante veremos lo que significa). Su importancia es tal que es lo primero que se sincroniza al conectarse a la r

La informacion en los bloques

En los bloques, aparte de la informacion relativa al bloque, se almacenan todas las operaciones que involucren un movimiento de monedas y hayan sido realizadas desde la emision del ultimo bloque.  Transferencia entre direcciones. Lo mas comun es el envio directo de monedas desde una direccion a otra. Esto se llama transferencia, y debe incluir la siguiente informacion: El timestamp en que se realiza la operacion. La clave publica de quien realiza el envio. Ya que la direccion se obtiene a partir de la clave publica, enviar esta en lugar de la direccion hace mas eficiente el proceso de verificacion de la operacion. La direccion que recibira las monedas. El monto de monedas disponible en la direccion que envia antes de realizar la transferencia. Esto evita las posibilidades de doble gasto. El monto que desea transferir. El concepto, si el remitente desea incluir alguno. La firma con la clave privada que autentifica la operacion. Finalmente, el identificador (ID) de la transferencia. Este

Iniciando la cadena de bloques

Toda cadena de bloques empieza por el bloque 0, que tiene unos datos predefinidos: Nadie ha podido hacer transacciones ya que no se han generado monedas aun. No hay un resultado del problema criptografico, ya que no existe un bloque anterior. Como no hay solucion de problema, no hay monedas acreditadas a ninguna cuenta (algunos diseñadores usan este bloque para asignar cierta cantidad de monedas a una cuenta ya existente de su propiedad: a esto se le denomina preminado) En cualquier caso, el bloque 0 debe tener la misma estructura que tendran todos los siguientes bloques, es por eso que primero debemos desarrollar el procedimiento que crea bloques nuevos y despues usarlo para el crear el primer bloque. Hagamos una pausa para explicar lo que es una funcion hash, ya que a partir de ahora seran de suma importancia. Una funcion hash es aplicar una serie de procedimientos matematicos a algo (puede ser una cadena de texto, un archivo, casi cualquier tipo de informacion) que da como resultado

Archivos, depuraciones y protocolo

Siguiendo con lo que vimos en la entrada anterior, creamos una nueva unidad para las funciones relacionadas con el tiempo, y un interruptor al inicio que verifique la validez de nuestro tiempo local. Tambien necesitaremos un archivo que almacene la informacion de los servidores NTP para poder intercambiarlos y compartirlos en la red. La funcion que usaremos para incluir la hora de red sera ' UTCTime '. Para organizar mejor el programa, haremos que todos los archivos necesarios sean colocados en una carpeta aparte: ' MPDATA '. Desde luego, ya que OpenSSL es FUNDAMENTAL para el funcionamiento del programa, tambien hacemos la verificacion al iniciar. Asimismo incorporamos el procedimiento para la creacion/carga de carteras que ya habiamos implementados para PaskalWallet, ya que siempre debe haber una cartera asociada al momento de ejecutar el programa. Ver las direcciones de la cartera activa es una informacion muy importante, por tanto incluiremos un espacio para mostrarl

Coordinando el tiempo

Imagen
La hora en internet es en ocasiones algo complicado para algunas personas, ya que estan interconectadas personas de practicamente todos los usos horarios que existen. Una manera de normalizar y facilitar la comunicacion es el empleo del  Tiempo Universal Coordinado  o UTC.  Crearemos una sencilla aplicacion para visualizar claramente como obtener el UTC desde una amplia red de servidores fiables que usan el  Network Time Protocol  o NTP, el cual esta vigente desde 1981 y es uno de los mas antiguos protocolos aun activos en Internet: cuando algo funciona perfectamente no es necesario cambiarlo. La unidad Indy para lazarus incluye un cliente para conectarse a dicha red: TIdSNTP. Lo que haremos es buscar algunos servidores de NTP y contrastarlo con la hora del computador del usuario para verificar si es correcta. Los servidores NTP dan una respuesta en formato DateTime, por lo que es necesario aplicar una funciones para convertirlo en formato TimeUnix. Time utility Unix Time Server: Es el

Creacion de la red Paskal

Imagen
Como vimos en la entrada anterior, lo primero es crear una red P2P para todos los usuarios . Para esto, en Paskal usaremos una unidad desarrollada por terceros: Indy, la cual ya añadimos a nuestra IDE de lazarus al inicio. Ahora solo debemos añadirlo al proyecto en Inspector de Proyecto -> Añadir nuevo Requerimiento. Como todo usuario debe ser cliente y servidor al mismo tiempo, es necesario que incluyamos un servidor y tantas conexiones de cliente como deseemos. Con cuantos usuarios simultaneos puede estar conectado cada uno? En teoria, el numero es infinito, pero a mayor numero de conexion (entrantes o salientes) mas lento ira el programa. Por otra parte, un numero demasiado bajo restara seguridad a la red. Tomando en consideracion la robustez de otras redes P2P, el numero idoneo esta entre 5 y 15. Este numero esta definido por la constante ' Maxconecciones '. Empezamos entonces añadiendo 1 servidor (que puede recibir 15 conexiones entrantes) y canales suficientes para 15

Como funciona una criptomoneda?

Imagen
Dedicaremos una entrada a explicar, de la manera mas sencilla y completa posible, como funcionan todas las criptomonedas, y, cuando corresponda, la manera en la que abordaremos cada caracteristica en el desarrollo de Paskal. Una red P2P La mayor parte de las personas estan familiarizadas con las redes de acceso a servidor; en estas redes, un numero (normalmente elevado) de usuarios, se contecta a un servidor central que es el que recibe y emite toda la informacion. Un ejemplo clasico es la pagina web de un banco: los usuarios (llamdos clientes) se conectan a los servidores del banco (usando sus credenciales unicas, por ejemplo usuario y contraseña) y el servidor del banco es el unico que tiene intercambio de informacion con el computador del usuario. A este modelo de conectividad se le llama cliente-servidor, y es el mas comun en el internet del 2020. Otro modelo que sirve tambien como red cliente-servidor son aquellas en las que los usuarios se comunican entre si, pero usando al servi

MasterPaskal: Primeros pasos

 Ahora si, es el momento de empezar a programar el ' CORE ' de nuestra criptomoneda; sera un proceso largo, y a partir de este momento, incluiremos los trozos de codigo que consideremos importantes, asi como haremos detalladas explicaciones de las caracteristicas tecnicas de la moneda. Hay caracteristicas importantes que el core debe poseer como aplicacion: Multitarea. No poseer eventos ' modales ' que detengan la ejecucion de otros procesos en segundo plano. Debido al tamaño del proyecto debe ser creado en modulos (unidades) para hacer mas sencilla su lectura y edicion. Escalable, permitiendo la adicion de mejoras posteriores sin afectar su rendimiento. Una parte muy importante es el diseño: desarrollarlo integramente en modo consola (manejo por la introduccion de comandos escritos, como la version 0.1 del wallet) es sin duda la manera standard mas sencilla de acometer un proceso de esta envergadura. Sin embargo, decidimos optar por un modo 'mixto', donde el mo

Finalizando la cartera... por ahora.

Imagen
 Ahora que ya sabemos que podemos crear nuestro propio archivo (y acceder a el) para que contenga todo el texto a mostrar con capacidad multilingue, es el momento de incorporarlo a nuestro PaskalWallet. Lo primero es definir una constante con el nombre de dicho archivo; para nuestro proyecto, lo denominaremos ' pw.lng '  (compresion de paskalwallet language). Como es un archivo de maxima importancia para el funcionamiento correcto del programa, verificaremos su presencia al momento de ejecutar indicandole que cargue en memoria las lineas del idioma por defecto. Como todos los accesos a archivos externos, es importante incluir interruptores de error para que el programa sepa que hacer en caso de que las cosas no funcionen segun lo esperado (que el archivo no se encuente, que este se encuentre corrupto, etc) Acostumbramos usar ' fileexists '' o bloques ' try...except ' de ser necesario. Como ahora cada linea de texto a mostrar estara incluida en el archivo de

Language Editor

Imagen
LangEditor es una pequeña herramienta que hemos creado para poder crear archivos de idioma multilingüe de manera muy sencilla, y que son fáciles de accesar por la aplicación destino. LangEditor permite que cualquiera pueda enriquecer, corregir o traducir las lineas de texto, lo que lo hace particularmente útil para proyectos open source que suelen contar con la colaboración de los usuarios. Al final de este artículo, incluiremos un enlace para descargar tanto el código fuente como los ejecutables ya compilados. Como el objeto de este blog no es este programa, solo explicaremos como se usa esta herramienta, sin entrar en detalles acerca de su programación (Si lo desea, puede ver el código fuente descargándolo al final de este artículo). LangEditor nos permite crear archivos de cadenas de texto con una estructura conocida, que nos permitirán después acceder a ellos de manera rápida y eficiente. Esta es la pantalla de inicio; al crear un archivo nuevo, nos preguntara cual es el idioma por

Cartera mas compleja

Imagen
Como de momento no hemos creado aun la red P2P, no es mucho mas lo que se le puede añadir de momento a la cartera. Ya incluimos el comando ' show ', que muestra las direcciones y el balance de cada una de ellas (Por supuesto, todas las direcciones tienen balance 0 de momento). Dado que, en el funcionamiento de la red, será la primera dirección de la cartera activa la que se asigne para algunos procesos (minado, escrow, comisiones, etc) es necesario poder ajustar cual queremos que sea la dirección por defecto de nuestra cartera, o lo que es lo mismo, ponerla de primer lugar. Para eso usaremosel comando " setdefault ". Tambien añadimos los comandos " open " y " close " para determinar cuál es la cartera activa. El comando " backup " nos creará una copia idéntica del archivo de la cartera, pero con la extensión ".bak" en lugar de la extensión ".pkw" por defecto. Esto es útil ya que los archivos bak nunca seran modificados

Primera herramienta: Gestion de cartera.

Imagen
Empezaremos por el desarrollo de una herramienta para la gestión de carteras. Una cartera es una colección de direcciones diferentes que pertenecen al mismo usuario. Cada dirección es, en teoría, independiente, y el uso de una cartera busca simplificar el uso de Paskal para aquellos usuarios que piensen usar múltiples direcciones (lo que en teoría, deben ser la inmensa mayoría de usuarios). Pero al mismo tiempo la idea es también desarrollar una aplicación ligera para los usuarios que no tengan pensando minar; con una aplicación de gestión de cartera deben ser capaces de consultar sus saldos y enviar pagos sin necesidad de sincronizarse a la red P2P de Paskal. Para empezar, creamos una nueva aplicación en Lazarus y le ajustamos lo básico: Titulo del formulario. (Paskal Wallet). Tamaño (640x480 debería ser suficiente) y ubicación (siempre nos ha gustado en mitad de pantalla). El icono (se cambia en Proyecto -> Opciones del proyecto) Añadimos una función a ejecutarse cuando se crea el

Preparacion

Imagen
 Ahora sigamos con los que necesitaremos usar para desarrollar el proyecto. Ante todo, la IDE de lazarus. Actualmente, la version mas actualizada que se encuentra disponible es la 2.0.10 Puede descargarse desde aqui:  Descargar lazarus Aqui una captura de como se ve la cabecera de lazarus recien instalado: Para las funciones criptograficas, necesitaremos instalar el OPENSSL. Es un software criptografico gratuito que puede ser encontrado aqui. Para desarrollar el proyecto vamos a usar la version 1.1.0, ya que ha sido suficientemente probada. En cualquier caso, ya que las nuevas versiones suelen ser retro compatibles, no deberia existir ningun problema con usar una version posterior. Descargar OpenSSL 1.1.0 Hay algunas librerias que seran necesarias, y es recomendable instalarlas de una vez. Para hacerlo, en lazarus vamos a : - Paquete -> Administrador de paquetes en linea. Selecionamos 2: DCPCrypt e Indy10 y le damos a "Instalar" El IDE de lazarus instalara ambos paquetes y

Definiciones de la nueva criptomoneda

Imagen
Para empezar, es bueno poner las ideas en orden, así que consideramos el primer paso definir que es lo que pretendemos conseguir al final de este proyecto. El haber estado en un proyecto similar hace 2 años nos da una idea bastante amplia de que es lo que buscamos y como alcanzarlo. La denominacion de la cripto es muy importante; nuestro primer proyecto se llamaba "Kreditz" pero consideramos que ese nombre ya no es valido ni nos parece tan atractivo como entonces. Tampoco queremos usar el formato "X coin" que nos parece demasiado trillado. Como ya existe una criptomonda llamada "pascalcoin", para hacer mencion implicita del lenguaje usado para desarrollarlo hemos optado por llamarla "Paskal" sencillamente. Aqui un borrador de lo que puede ser el logo: (nombre y logo son susceptibles de ser modificados a medida que avanza el proyecto) Ahora veamos las caracteristicas de desarrollo: Bloques cada 10 minutos. Esta es una medida que consideramos adecu

Welcome

Imagen
Welcome everyone. We created this blog to explain, step-by-step, the development of a new crypto currency from scratch, using FreePascal as language and Lazarus as IDE. We started a project like this 2 years ago, but we had to quit it because we found ourselves out of the necessary time to continue. On that time, we already had a working beta but we prefer a new project now to avoid some of the mistakes we had in the past. All the blog will be writen in spanish. You can use the Blogger utility in the left side to translate to your language. Articles index: This one. Definiciones de la nueva criptomoneda Preparación Primera herramienta: Gestión de cartera Cartera mas compleja If you want contribute to this project, please, we accept Bitcoin donations to: 3H1VzdL3QFQpc62DUhbtCFV5dG4K1yPwVB Thank you