Zero Knowledge Proof :: Fiat-Shamir

Zero Knowledge Proof  ::  Fiat-Shamir

Es un verdadero placer (y también un motivo de orgullo) compartir un desarrollo del algoritmo Fiat-Shamir para las Zero Knowledge Proofs (Pruebas de Conocimiento Cero). Durante un tiempo, estuve intrigado por cómo funcionaba este algoritmo en la práctica…

Resumiendo mucho, un algoritmo de ZKP (Zero Knowledge Proof) es un método criptográfico que permite a una parte demostrar a otra que conoce un valor específico, sin revelar ninguna información sobre ese valor más allá del hecho de que lo conoce.

En términos más detallados, un algoritmo de ZKP permite que una parte, el ‘probador’, pruebe a otra parte, el ‘verificador’, que tiene cierta información, como una contraseña o un secreto, sin tener que revelar esa información directamente. Lo sorprendente de estos algoritmos es que se llevan a cabo de tal manera que el verificador no gana ningún conocimiento adicional aparte de la validez de la afirmación. Por lo tanto, estos algoritmos son vitales para mantener la privacidad y la seguridad en transacciones digitales y sistemas blockchain.

Blockchains que usan Zero Knowledge Proof

Hace unos meses, mi curiosidad me llevó a explorar más a fondo ZCash, una blockchain que, aunque ya lleva con nosotros varios años, utiliza de manera intrínseca protocolos de prueba de conocimiento cero. Viendo que existía una aplicación real y teniendo el interés de aprender más, decidí sumergirme de lleno en la implementación de mi versión personal de este algoritmo. Con el objetivo de hacerlo lo más realista posible, opté por utilizar Docker para simular dos entidades participantes, y establecer una comunicación entre ellas a través de RabbitMQ. Para añadir aún más realismo, implementé los participantes en dos lenguajes diferentes: Python y PHP.

Hoy, con la finalización de este proyecto, me siento emocionado de compartir mi implementación del algoritmo Fiat-Shamir en GitHub. Otro desarrollo más en el entorno Blockchain, como ya hice con los Filtros Bloom o el Merkle Tree. A diferencia de los anteriores, a lo largo de este viaje tuve la oportunidad de sumergirme profundamente en los procesos de Zero Knowledge Proof, una pieza fundamental en el mundo de la criptografía y de especial relevancia en entornos blockchain como ZCash o Monero.

Os invito a explorar mi trabajo y a descubrir más sobre este fascinante algoritmo de prueba de conocimiento cero. Espero que pueda ser de utilidad para todos aquellos que estén interesados en adentrarse en el mundo de la criptografía y la seguridad en la blockchain.

¿Quieres ver el código? Visita mi GitHub

Smart Contract en Solidity: Revolucionando la Gastronomía

Smart Contract en Solidity: Revolucionando la Gastronomía

En el mundo en constante evolución de la tecnología blockchain, los contratos inteligentes están desempeñando un papel cada vez más importante en una variedad de industrias. Hoy os voy a hablar sobre cómo incluso el sector gastronómico puede beneficiarse de estos avances tecnológicos. Os presento ‘Txoco Cal Padrí’, un innovador Smart Contract en Solidity que facilita la gestión de propuestas y votaciones en una asociación gastronómica (la mía, Txoco Cal Padrí) mediante el uso de tokens NFT.

‘Smart contract’ o contrato inteligente, es un término que a menudo escuchamos en el contexto de blockchain. Pero, ¿qué es realmente? Es un programa que se ejecuta en la cadena de bloques y permite la ejecución automática de acuerdos y transacciones según ciertas condiciones preestablecidas.

‘Txoco Cal Padrí’ es un ejemplo de cómo un smart contract en Solidity puede ser una herramienta valiosa para comunidades y asociaciones. En este caso, se utiliza para otorgar a los miembros de la asociación gastronómica un token NFT, que actúa como una representación digital de su membresía.

Modernizar la Participación de los Socios mediante un Smart Contract en Solidity

Gracias a este NFT, los miembros pueden participar en la toma de decisiones votando en diversas propuestas. A modo de ejemplo, sobre próximos menús, nuevas incorporaciones a la sociedad, próximas inversiones, etc. Lo más notable es que este proceso es transparente, seguro y automatizado gracias a la naturaleza de la tecnología blockchain.

Las características clave del Smart Contract ‘Txoco Cal Padrí’ incluyen la emisión y revocación de NFTs para miembros por parte de los administradores. Además, los NFTs no son transferibles por los miembros, ya que la membresía no lo es. Esto asegura que sólo los miembros actuales tengan voz en las votaciones.

Este es el NFT de la sociedad:

Smart Contract en Solidity

En conclusión, este smart contract en Solidity no sólo moderniza la forma en que una sociedad gastronómica puede operar, sino que también abre las puertas a infinitas posibilidades en la gestión comunitaria. Al automatizar el proceso de votación y garantizar la seguridad y transparencia, ‘Txoco Cal Padrí’ está realmente revolucionando la forma en que las asociaciones pueden interactuar y tomar decisiones.

Puedes encontrar el código y más detalles sobre este proyecto en su repositorio de GitHub: Txoco Cal Padrí GitHub Repo.

En un mundo que avanza rápidamente hacia la adopción de la tecnología blockchain, proyectos como ‘Txoco Cal Padrí’ demuestran el verdadero potencial de los contratos inteligentes en diversos sectores.

Filtro Bloom, una implementación en PHP

Filtro Bloom, una implementación en PHP

En esta ocasión voy a presentar una implementación simple de un filtro de Bloom implementado en PHP. Puedes ver la implementación en mi github: https://github.com/oscarpascualbakker/bloomfilter.

Un filtro Bloom es una estructura de datos probabilísticos que se utiliza para comprobar si un elemento es miembro de un conjunto. En esta estructura, los elementos se pueden agregar al conjunto, pero no eliminar.

Una consulta a un filtro Bloom devuelve «posiblemente en el conjunto» o «definitivamente no en el conjunto».

Un filtro Bloom es una matriz de m bits (bitarray), inicialmente todos establecidos en 0. También debe haber k funciones de hash diferentes definidas, cada una de las cuales mapea o aplica un hash a algún elemento establecido en una de las m posiciones de la matriz, generando una distribución aleatoria uniforme. Normalmente, k es una constante pequeña que depende de la probabilidad de falsos errores que vamos a permitir.

Para agregar un elemento al conjunto, es necesario realizar k funciones de hash sobre el elemento, obtener las k posiciones correspondientes en el filtro y establecer estos bits en 1.

Para verificar si un elemento está en el conjunto es necesario realizar de nuevo las k funciones de hash sobre ese elemento para obtener las posiciones en el filtro. Si alguno de los bits en estas posiciones es 0, el elemento definitivamente no está en el conjunto.

Si todas las posiciones se establecen en 1, entonces el elemento está en el conjunto o los bits se han establecido en 1 durante la inserción de otros elementos, lo que da como resultado un falso positivo.

No es posible eliminar elementos en un filtro Bloom simple, y no hay forma de distinguir entre un positivo legítimo y un falso positivo. Técnicas más avanzadas pueden resolver este problema.

Filtro Bloom
Fuente: Wikipedia

Utilidades de un filtro Bloom

Los filtros Bloom son útiles en los casos en que:

  • los datos a buscar son grandes
  • la memoria disponible en el sistema es limitada/baja

Por este motivo el algoritmo tiene muchos usos. Dado que es un sistema que responde de forma muy rápida si un elemento está (¡probablemente!) en un conjunto o no, se usa para ahorrar tiempo y espacio.

  • Sistemas de almacenamiento en caché
  • Detección de contraseña débil
  • Protocolo de caché de Internet
  • Navegación segura en Google Chrome
  • Sincronización de billetera en Bitcoin (esto fue deprecado de Bitcoin, pero formó parte de las primeras versiones)
  • Rastreo de IP basado en hash
  • Seguridad cibernética como análisis de virus

Espero que te haya gustado este algoritmo (entiendo que sí, si has leído hasta aquí).

¡Hasta la próxima!

Merkle Tree o Árbol de Merkle en PHP

Merkle Tree o Árbol de Merkle en PHP

En esta entrada voy a hablar de una implementación en PHP de un «Merkle Tree«, un árbol de Merkle, una implementación en árbol binario para conseguir un hash de un conjunto de datos. En anteriores artículos ya hablé de (o usé) árboles binarios, como en el artículo sobre la cola de prioridad en PHP (un buen ejemplo de árbol binario).

Esta estructura de datos fue originalmente propuesta en 1979 por Ralph Merkle, y de ahí su nombre.

Puedes ver la implementación de este Merkle Tree en mi github.

Usos más destacados

Los árboles de Merkle tienen una finalidad básica: obtener un hash, llamado Merkle Root, que identifique clara y unívocamente el conjunto original de datos. Por esta razón su uso está muy extendido en la comunicación entre ordenadores. A modo de ejemplo, cuando se descarga una gran cantidad de ficheros de un servidor podemos «calcular» si su contenido ha sido modificado/dañado comprobando que el Merkle Root original coincide con el que hemos calculado durante la descarga.

En el mundo de las criptomonedas también se aplica el algoritmo de Merkle Tree para comprobar que las transacciones no han sido modificadas. La primera criptomoneda del mundo, Bitcoin, incluye un Merkle Root en cada bloque.

Funcionamiento de un Merkle Tree

El funcionamiento de un árbol de Merkle es bastante simple. Se trata, en primer lugar, de asignar un hash a cada elemento del conjunto de datos. Cuando todos los datos estás hasheados, hay que concatenar esos mismo hashes y volver a aplicar la misma función de hash por parejas. Esta operación se repite hasta que sólo queda un nodo que, obviamente, contiene la raíz de Merkle.

Keep reading →

Algoritmo de Dijkstra en PHP

Algoritmo de Dijkstra en PHP

El algoritmo de Dijkstra es un algoritmo de caminos mínimos. Está diseñado para encontrar el camino de menor ponderación (sea peso, distancia, coste, …) entre un nodo y todos los demás. Sin embargo, para poder explicar el Algoritmo de Dijkstra (y concretamente esta implementación en PHP) debería empezar con un poco de teoría de grafos. El problema es que entonces el artículo se alargaría muchísimo, así que sólo daré una breve pincelada, pero entraré en materia de inmediato.

Un grafo es una representación basada en vértices (nodos) y aristas (conexiones). Para entenderlo mejor, un grafo podría ser la representación de aeropuertos y los vuelos entre ellos. Cada vértice sería un aeropuerto, y un vuelo sería una arista, con lo que si hay varios vuelos, también hay varias aristas. Veamos un ejemplo de grafo:

Grafo de ejemplo para el algoritmo de Dijkstra en PHP

Este grafo sería un «grafo dirigido», dado que las aristas tienen una dirección; van de un vértice a otro. El peso de cada arista podría ser la distancia en millas, y el número dentro de cada vértice podría ser el código de un aeropuerto.

Keep reading →

Cola de prioridad en PHP con cambio de prioridad

Hace ya unos días escribía un artículo sobre la Cola de Prioridad en PHP 7.4 que había implementado, y que está disponible en Github.

Por temas laborales he tenido que implementar el algoritmo de Dijkstra en PHP, y esto puede hacerse tanto con cola de prioridad como sin ella. La diferencia, en términos de coste de computación (Big O notation) era abismal, así que decidí usar la cola de prioridad al implementar Dijkstra. El problema era que mi cola de prioridad no tenía una función básica: «cambio de prioridad«.

Implementar ‘cambio de prioridad’ en la Cola de Prioridad en PHP

Después de analizar el código vi que era fácilmente implementable, testeable y usable en otros algoritmos, al estar debidamente encapsulada.

Keep reading →

Cola de prioridad en PHP 7.4

Hace unos días implementé una cola de prioridad en PHP 7.4 basándome en el concepto de ‘Heap‘. Un heap es un montón, una pila que parece desordenada, pero cuyo contenido sigue una lógica ordenada. De hecho, a partir de este concepto nace la técnica de ordenación del mismo nombre ‘Heap sort‘.

Antes de comentar la implementación de la cola, explicaré brevemente qué ventajas obtenemos al hacer así las cosas.

Ventajas de un heap para organizar una cola de prioridad

Al crear un sistema de prioridad como este buscamos obtener un medio ágil y rápido tanto de inserción como de extracción. En el caso del heap usamos un árbol binario, dado que con esta estructura podemos conseguir implementar la cola en un árbol (un array) homogéneo y completo. Este es el aspecto de un heap construido mediante un árbol binario:

Arbol binario que representa la cola de prioridad

Keep reading →

Cómo instalar Salesforce Commerce Cloud

Si lees este artículo puede ser que tengas intención de instalar Salesforce Commerce Cloud como tu plataforma de eCommerce. ¡Bien!

Instalar Salesforce Commerce Cloud

Aunque hoy (oct/19) todavía no hay muchas instalaciones de Salesforce Commerce Cloud en España, lo cierto es que hay algunos casos de éxito muy interesantes. Son varios los retos que han perturbado mi sueño durante esta aventura, y espero con este artículo que no tengas que pasar por lo mismo. Te animo a leerlo y, sobretodo, que hagas tu comentario al final.

Keep reading →

3 cosas que nunca deberías hacer como Jefe de Desarrollo

Read this article in english

A lo largo de mi vida como programador he vivido momentos difíciles en el trabajo diario. A veces sólo puedes apretar y apretar, sea cual sea la razón. Esto pasará, sin duda, y cuando pase tienes que hacer el esfuerzo. El trabajo tiene que salir.

Pero, sea como sea, pase lo que pase, intenta evitar estas 3 cosas.

1. Establecer fechas límite poco realistas

Todos hemos tenido deadlines, y sabemos que tenemos que atenernos a ellas. Pero cuando hablamos de programación, estas fechas tienen que ser realistas. La mejor manera de tener fechas realistas es consultando con el equipo de desarrollo. Sabrán trocear el proyecto en tareas más pequeñas y estimar la fecha de finalización con bastante exactitud. Y si el equipo usa Scrum lo harán todavía mejor.

Establecer deadlines poco realistas te retornará de varias formas:

Keep reading →

8 cosas que he aprendido sobre los equipos de desarrollo

Read this article in english

Llevo muchos años programando en equipo y, a veces, liderándolos. Hay muchísimas cosas que aún aprenderé en el futuro, pero … mi años no han pasado en vano. 😉

1. La calidad es importante

Sí, la calidad del código es importante, tanto en cómo lo escribes y en cómo lo mantienes. No eres un buen programador hasta que no seas capaz de garantizar que tu código es bueno, y eso significa sin bugs, testeable y limpio (volveré sobre esto más tarde). Y cuando hablamos de calidad hay dos puntualizaciones a hacer: 1) el uso de patrones de diseño es prácticamente obligatorio, y 2) el código debe ser SOLID. No voy a profundizar en estos dos puntos en este artículo, pero lo haré en el futuro.

Consejo: si eres programador y no sabes qué es esto de patrones y SOLID… empieza hoy. Créeme.

Keep reading →