Descentralizando el mundo con blockchain (III)

(Trobareu la versió en català més avall) En esta serie de artículos, primero hemos visto el funcionamiento técnico de forma simplificada de una cadena de bloques como la de Bitcoin. Después hemos mostrado algunas de las aplicaciones más destacadas basadas en blockchain. Para terminar, en este artículo vamos a repasar posibles problemas de seguridad e inconvenientes que puede tener el uso de esta tecnología. Como veremos, la mayoría de los asuntos que trataremos tiene más que ver con los servicios implementados por encima de blockchain que no con la seguridad informática propiamente de la cadena de bloques. Para empezar, una primera duda moral que se nos plantea con la implantación de estas tecnologías está relacionada con los malos usos que se puedan hacer con ellas, al no existir organismos centralizados que regulen y controlen. Por ejemplo, es polémico el uso generalizado de Bitcoin para pagar actividades delictivas. El hecho de usar claves criptográficas como identidad de los usuarios que hacen y reciben los pagos en Bitcoin, añade una pseudo anonimidad a los pagos y hace que esta criptomoneda sea la forma más habitual de pago para la compra de drogas y armas en auténticos supermercados virtuales de este tipo de productos, como la archiconocida difunta web Silk Road. Sin embargo, esta aparente anonimidad puede llegar a suponer una trampa que revele el histórico de transacciones financieras de un usuario. De hecho, la policía danesa ya ha utilizado estrategias para analizar el histórico de transacciones que está publicado de forma abierta en el blockchain de Bitcoin para detener a traficantes de droga. Aunque la detención de criminales pueda parecer algo...

Optimización de código: un código más eficiente

En los primeros tiempos de la informática, programar exigía utilizar lenguajes muy próximos a la plataforma de ejecución. El código máquina o el lenguaje ensamblador permiten un control muy fino del proceso de ejecución: cómo se asignan los registros del procesador, cómo se almacenan los datos y se accede a la memoria, … Así es posible exprimir la máxima eficiencia de una plataforma, aunque el precio a pagar es la falta de portabilidad y el mayor coste de desarrollo y mantenimiento del código. Afortunadamente, hoy en día podemos utilizar lenguajes de programación de alto nivel, que abstraen estos detalles de la plataforma y nos permiten ser más productivos resolviendo problemas más complejos en menos tiempo. Sin embargo, con esta transición hemos perdido algo de eficiencia… ¿o no? Quizás tampoco tanta, porque los compiladores incorporan técnicas que permiten mejorar el rendimiento del código generado. La optimización de código es el conjunto de fases de un compilador que transforman un fragmento de código en otro fragmento con un comportamiento equivalente y que se ejecuta de forma más eficiente, es decir, usando menos recursos de cálculo como memoria o tiempo de ejecución. Es importante destacar que: La condición de tener un “comportamiento equivalente” es bastante onerosa, ya que incluye también situaciones de error donde el comportamiento debe ser el mismo. Pongamos como ejemplo una instrucción como “x = y / y“. La tentación es substituir esta expresión por “x =1“, pero es necesario garantizar que la variable y no puede ser igual a 0, porque entonces el código podría tener un comportamiento diferente según el lenguaje (p.ej. división por cero). También es fundamental garantizar que el código no será menos eficiente...