Tokenización de activos: Reinventando la Propiedad y la Inversión

Tokenización de activos: Reinventando la Propiedad y la Inversión

En un mundo en rápido movimiento, el término «Tokenización de activos» está ganando un gran reconocimiento. ¿Pero qué significa realmente? La tokenización es el proceso de convertir derechos de un activo en un token digital en la blockchain. Esto permite que una parte de un activo pueda ser propiedad de uno o varios inversores, democratizando el acceso y facilitando la liquidez. Veamos cómo la tokenización está redefiniendo el panorama de inversión y propiedad.

¿Por Qué Tokenizar activos?

La tokenización ofrece una variedad de ventajas sobre los métodos tradicionales de propiedad y transacción de activos. Estos incluyen costos reducidos, mayor liquidez, mayor transparencia y un acceso democratizado a diversas clases de activos. Imagina poder invertir en un cuadro de Picasso sin comprarlo en su totalidad, o ser dueño de una parte de un edificio de oficinas en una ubicación codiciada sin tener que comprar el inmueble completo. Por cierto, esto último lo hace de maravilla Reental.

El Alcance de la Tokenización de activos

Si bien el arte y los bienes raíces son activos comúnmente tokenizados, la tokenización no se detiene ahí. Activos como bonos gubernamentales, materias primas e incluso créditos de carbono pueden tokenizarse. Esto abre un abanico de oportunidades para inversionistas que tal vez no tendrían acceso a estos mercados en condiciones normales.

Es esencial tener en cuenta que la tokenización no es una panacea y viene con su propio conjunto de desafíos. La regulación y la seguridad son preocupaciones cruciales que deben abordarse meticulosamente para mitigar riesgos como el lavado de dinero y el fraude. Sin embargo, las ventajas superan a los desafíos y la tokenización está demostrando ser una revolución en el mundo de los activos y la inversión.

La tokenización de activos no es una tendencia pasajera; es un cambio de paradigma que está aquí para quedarse. Al permitir que más personas accedan a inversiones que antes estaban fuera de su alcance, la tokenización es verdaderamente una democratización de la economía global. Si todavía no has explorado las oportunidades que ofrece, este es el momento de sumergirse y descubrir cómo puedes beneficiarte de esta revolución.

Para aquellos interesados en explorar más a fondo cómo funciona la tokenización de activos, he publicado un contrato inteligente de demostración en mi cuenta de GitHub. Aunque el código es 100% funcional, prefiero considerarlo un buen punto de partida. Con esto quiero decir que es crucial entender que no debe usarse en un entorno de producción sin una revisión exhaustiva por un experto en contratos inteligentes y blockchain.

Programar en Solidity: cómo empezar

Programar en Solidity: cómo empezar

Cómo empezar a programar en Solidity

En una reciente charla en Vic, me encontré rodeado de entusiastas digitales que me hicieron la misma pregunta: ¿Cómo puedo comenzar a programar en Solidity? La demanda de conocimiento en este ámbito ha crecido exponencialmente, y es vital proporcionar una guía clara para aquellos que desean adentrarse en el universo de los smart contracts y la tecnología blockchain.

programar en solidity

Conocimientos Previos y Herramientas Fundamentales

Antes de zambullirse en las profundidades de Solidity, es esencial tener una base sólida en programación y comprensión de los principios de la blockchain. Un conocimiento previo de lenguajes como JavaScript puede ser de gran ayuda, ya que Solidity presenta similitudes en sintaxis y estructura.

Para empezar a experimentar con código Solidity, necesitas un entorno de desarrollo integrado (IDE) que te permita escribir, probar y desplegar tus contratos inteligentes. Aquí es donde Remix entra en juego. Remix (https://remix.ethereum.org) es un IDE basado en navegador que permite un rápido acceso a la programación en Solidity sin la necesidad de configuraciones complejas.

Recursos para Aprender y Experimentar

El viaje hacia la maestría en Solidity pasa por la educación y la práctica. Sitios web como CryptoZombies (https://cryptozombies.io) ofrecen tutoriales interactivos enfocados en la creación de juegos en blockchain, lo que proporciona un enfoque amigable y práctico. La documentación oficial de Solidity (https://docs.soliditylang.org) también es un recurso imprescindible, ya que ofrece una guía detallada y ejemplos de código.

Diferencias entre la Programación Convencional y los Smart Contracts

Al abordar Solidity, uno se aventura en un terreno que, aunque familiar en algunos aspectos a programadores de lenguajes como PHP o Java, presenta diferencias fundamentales debido a su naturaleza y al entorno blockchain en el que opera. Solidity es un lenguaje orientado a contratos, lo que implica un enfoque y un flujo de trabajo distintos.

Una de las diferencias más notables es la función del constructor en los contratos inteligentes. Mientras que en lenguajes orientados a objetos el constructor puede ser invocado cada vez que se crea una instancia de un objeto, en Solidity, el constructor es un bloque de código que se ejecuta una única vez y solo cuando el contrato se despliega en la blockchain. Este comportamiento garantiza que la inicialización del contrato y la configuración de variables críticas se realicen en un entorno seguro y controlado.

Además, en Solidity, las funciones del contrato pueden manejar y transferir criptomonedas nativas de la plataforma, como el Ether en la red de Ethereum o el Matic en la red de Polygon. Esto introduce un nivel de responsabilidad y seguridad que no se encuentra en la programación convencional. Los desarrolladores deben prestar especial atención al escribir estas funciones, ya que un error no solo podría resultar en fallos de ejecución, sino también en pérdidas económicas significativas debido a la naturaleza irreversible de las transacciones en la blockchain.

Este modelo de programación implica que se debe tener un conocimiento profundo de las prácticas de seguridad en contratos inteligentes, como la prevención de ataques de reentrancia (volveré sobre esto en artículos futuros), la correcta gestión de excepciones y la validación de las entradas del usuario, para proteger los fondos y la integridad del contrato.

Estas particularidades hacen que programar en Solidity sea una experiencia única y retadora, ofreciendo una nueva perspectiva sobre conceptos tradicionales de la programación y subrayando la importancia de una comprensión detallada del entorno de ejecución y las implicaciones de cada línea de código escrita.

Partes de un Contrato en Solidity

Los contratos en Solidity están estructurados con varios componentes clave, cada uno desempeñando un papel vital en la funcionalidad y seguridad del contrato. Estos elementos permiten a los desarrolladores crear contratos inteligentes robustos y eficientes.

  1. Modificadores: Los modificadores son una herramienta poderosa en Solidity. Actúan como condiciones previas que se pueden adjuntar a las funciones del contrato. Su propósito principal es verificar ciertas condiciones antes de ejecutar la función. Por ejemplo, un modificador puede asegurarse de que solo el propietario del contrato pueda llamar a una función específica. Esto es especialmente útil para controlar el acceso y asegurar que ciertas funciones no sean explotadas por usuarios no autorizados. Los modificadores ayudan a reducir la repetición de código y aumentan la claridad y la seguridad del contrato.
  2. Mappings: Los mappings son una de las estructuras de datos más útiles en Solidity. Funcionan de manera similar a los diccionarios o mapas en otros lenguajes de programación, permitiendo la asociación de un conjunto de claves únicas con valores correspondientes. Por ejemplo, un mapping puede ser utilizado para asociar direcciones de usuario con sus saldos o con permisos específicos dentro del contrato. Son extremadamente eficientes en términos de costos de gas cuando se utilizan para rastrear y acceder a datos en la blockchain.
  3. Funciones: Las funciones en Solidity son bloques de código que definen las operaciones que un contrato puede realizar. Pueden ser llamadas internamente por otras funciones dentro del mismo contrato o externamente por otros contratos y transacciones. Las funciones pueden ser etiquetadas con visibilidad (como public o private) y pueden tener modificadores adjuntos para restringir su uso. Además, las funciones pueden ser view o pure si no modifican el estado del contrato, lo que reduce el costo de gas al ser llamadas.
  4. Constructor: Ya mencionado anteriormente, el constructor es un tipo especial de función que se ejecuta una sola vez cuando el contrato se despliega en la blockchain. Es utilizado para inicializar variables de estado y configurar el contrato al inicio. A diferencia de las funciones regulares, el constructor no puede ser llamado nuevamente una vez que el contrato está desplegado.

Distribución y Ejecución de Contratos en la Blockchain

Una característica distintiva y crucial al programar en Solidity, que la diferencia de la programación en lenguajes como PHP o Java, es el entorno de ejecución de los contratos. En Solidity, las funciones de un contrato no se ejecutan en un servidor centralizado, sino que se distribuyen y ejecutan en una red de nodos dentro de la blockchain. Esta descentralización asegura una mayor seguridad, transparencia y resistencia a la censura, pero también conlleva desafíos únicos.

Cuando dos contratos inteligentes interactúan en la blockchain, por ejemplo, es esencial que cada uno conozca la dirección del otro. Las direcciones de los contratos funcionan de manera similar a las direcciones de las cuentas en la red blockchain, permitiendo que los contratos se comuniquen e interactúen entre sí. Esta interacción puede incluir la invocación de funciones, el envío y la recepción de criptomonedas, y el acceso a datos almacenados en otros contratos.

Sin embargo, no basta con conocer las direcciones. Los contratos también deben tener los permisos adecuados para interactuar entre sí. En la programación tradicional, la gestión de permisos suele ser más directa y se controla a nivel de sistema operativo o aplicación. En cambio, en Solidity la gestión de permisos es parte integral de la lógica del contrato. Los desarrolladores deben implementar cuidadosamente controles de acceso y validaciones para asegurar que solo las entidades autorizadas puedan ejecutar ciertas funciones o acceder a datos específicos.

Esta naturaleza distribuida y las consideraciones de seguridad asociadas subrayan la importancia de entender a fondo no solo el lenguaje Solidity, sino también los principios y mecánicas de la blockchain. Es un entorno que desafía a los programadores a pensar de manera diferente sobre cómo se ejecuta y se asegura el código, enfatizando la necesidad de prácticas de programación seguras y bien consideradas para el desarrollo exitoso de contratos inteligentes.

Programar en Solidity abre la puerta a un nuevo paradigma de aplicaciones descentralizadas y contratos autónomos. Al comprender las singularidades de este lenguaje y practicar con las herramientas adecuadas, cualquier persona puede dar sus primeros pasos hacia la construcción de soluciones en la blockchain. Empezar es cuestión de curiosidad, dedicación y, sobre todo, de sumergirse en la práctica con los recursos y comunidades que la tecnología ofrece.

Programa de Fidelización en Blockchain

Programa de Fidelización en Blockchain

El mundo de la blockchain ha abierto un abanico de posibilidades para el desarrollo de soluciones innovadoras en distintas industrias. Una de estas oportunidades es la posibilidad de crear programas de fidelización transparentes y seguros utilizando contratos inteligentes. Como dije en mi anterior post, he trabajado en el desarrollo de un smart contract en Solidity que sirve como base para implementar un programa de fidelización en blockchain.

¿Por qué un Programa de Fidelización en Blockchain?

La mayoría de las personas están familiarizadas con los programas de fidelización tradicionales ofrecidos por empresas como supermercados, aerolíneas, tiendas minoristas o cadenas de restaurantes. Estos programas ofrecen puntos o recompensas a los clientes que realizan compras recurrentes, pero a menudo sufren de falta de transparencia y eficiencia. Con blockchain, podemos garantizar que todas las transacciones sean transparentes, inmutables y seguras. Además, se eliminan los intermediarios, lo que resulta en costos operativos más bajos y una mayor eficiencia.

Características del Smart Contract

Este contrato inteligente permite a los propietarios del programa añadir nuevas recompensas, asignar puntos a los usuarios y ofrecer un método para canjear puntos por recompensas. El contrato también tiene un sistema de seguimiento que permite a los usuarios consultar el saldo de sus puntos y las recompensas disponibles.

La seguridad es un factor crítico en cualquier aplicación blockchain, y este smart contract no es una excepción. Como ya hice en otros smart contracts, he incorporado varias pruebas y análisis de código estático para garantizar la robustez del contrato. Utilizo herramientas como Truffle y Ganache para el desarrollo y pruebas, y Slither para el análisis de código estático.

Como de costumbre, todo el código fuente del smart contract está disponible en mi cuenta de GitHub para que cualquier interesado pueda revisarlo, contribuir o adaptarlo para sus propios proyectos.

El desarrollo de este smart contract para un programa de fidelización demuestra el potencial de la blockchain para revolucionar sectores tradicionales. Este sistema no solo es seguro y eficiente sino también transparente para todas las partes involucradas. Este tipo de contratos representan solo el primer paso en la adopción más amplia de blockchain en programas de fidelización, y me siento muy afortunado al asistir a estos cambios y por lo que el futuro puede traer en este espacio.

Qué es un contrato inteligente y cómo funciona

Qué es un contrato inteligente y cómo funciona

En el mundo digital de hoy, la tecnología blockchain está revolucionando la forma en que interactuamos, especialmente en el ámbito de los contratos y los acuerdos. Uno de los conceptos más intrigantes de esta revolución es el «Contrato Inteligente» o «Smart Contract» en inglés. Pero, ¿qué es un contrato inteligente y cómo funciona?

¿Qué es un Contrato Inteligente?

Un contrato inteligente es un programa informático que facilita, verifica, o ejecuta automáticamente un contrato cuando se cumplen ciertas condiciones predefinidas. Imagina que es como una máquina de venta de bebidas: introduces una determinada cantidad (tu parte del acuerdo), y la máquina te da automáticamente tu bebida a cambio (la otra parte del acuerdo).

¿Por qué son ‘Inteligentes’?

Los contratos inteligentes obtienen su «inteligencia» de la forma en que están programados. Al igual que un robot de cocina solo funciona si sigues ciertos pasos (añadir ingredientes, seleccionar el programa, etc.), un contrato inteligente solo se ejecuta cuando se cumplen las condiciones establecidas. No hay necesidad de un intermediario, como un abogado o un notario, para asegurar que se cumpla el contrato.

Los contratos inteligentes son más conocidos por su uso en blockchains como Ethereum, Polygon o Tezos (por mencionar sólo tres), pero su aplicabilidad es mucho más amplia. Se pueden utilizar en cualquier tipo de transacción, desde la compra de una casa hasta un acuerdo de confidencialidad entre dos empresas pasando por fondos de inversión, mercados descentralizados, tokenización de activos o programas de lealtad de empresas.

Dado que los contratos inteligentes residen en la blockchain, heredan sus características de seguridad y transparencia. Una vez que se crea un contrato inteligente ya no se puede modificar, garantizando que ambas partes cumplan con lo acordado.

Un Ejemplo Sencillo

Supongamos que quieres alquilar un apartamento. Tradicionalmente, tendrías que dar un depósito de seguridad, firmar un contrato y, quizás, pagar a una inmobiliaria (el intermediario). Con un contrato inteligente, todo esto se automatiza. Cuando ambas partes cumplen con las condiciones (por ejemplo, tú pagas el alquiler y el propietario te da las llaves), el contrato se ejecuta automáticamente, sin la necesidad de un tercero.

Pero, aunque los contratos inteligentes ofrecen muchas ventajas, todavía enfrentan desafíos importantes que debemos abordar. Uno de los más preocupantes son los errores de programación. Un pequeño fallo en el código podría resultar en transacciones incorrectas o incluso en la pérdida de fondos. Por este motivo es crucial que los contratos sean revisados meticulosamente por un experto en seguridad antes de ser desplegados en la red blockchain.

Otro obstáculo es la falta de un marco regulador claro. A medida que esta tecnología avanza, los gobiernos y organizaciones se esfuerzan por establecer regulaciones que aseguren el uso ético y seguro de los contratos inteligentes. Sin embargo, la falta de consenso y la diversidad de aplicaciones hace que la estandarización sea un desafío considerable. Además, la cuestión de cómo se resuelven legalmente los conflictos en transacciones automatizadas sigue siendo una zona gris.

Los contratos inteligentes representan una auténtica revolución en la forma en que se hacen acuerdos y transacciones. Eliminan la necesidad de intermediarios y ofrecen un nivel de seguridad y transparencia sin precedentes. Pero como cualquier tecnología emergente, enfrentan desafíos que aún necesitamos superar.

¿Quieres saber más sobre cómo aplicar esta tecnología en la vida real? En mi próximo post publicaré en mi cuenta de github un contrato inteligente listo para ser utilizado. Se trata de un programa de lealtad o recompensa similar a los que puedes encontrar en cualquier supermercado. Así podrás ver un ejemplo práctico que podría cambiar la forma en que interactuamos en nuestras compras diarias. ¡Espero que lo disfrutes!

Qué es Blockchain – Una introducción

Qué es Blockchain – Una introducción

El término «blockchain» se ha convertido en una palabra de moda en la tecnología, las finanzas y otros sectores. En anteriores artículos he hablado de algoritmos, de smart contracts, e incluso de una implementación muy interesante de Zero Knowledge Proof, algo que dará mucho que hablar en esta década.

Sin embargo, ¿qué es Blockchain exactamente y por qué es tan revolucionario?

¿Qué es Blockchain?

Blockchain es una tecnología de registro distribuido que permite a múltiples partes mantener y acceder a una base de datos de forma descentralizada y segura. Cada bloque en la cadena contiene un número de transacciones, y estos bloques están vinculados de forma cronológica, lo que hace que el historial de transacciones sea inmutable.

Seguridad y Transparencia

Una de las características más destacadas de blockchain es su seguridad. Cada transacción se verifica mediante un proceso criptográfico antes de añadirse a la cadena. Además, la naturaleza descentralizada del blockchain hace que sea extremadamente difícil para un solo actor manipular el sistema.

La transparencia es otro factor clave. Cada transacción es visible para todos los que tienen acceso a la cadena, lo que facilita la auditoría y la verificación de transacciones.

Aplicaciones Más Allá de las Criptomonedas

Aunque la tecnología blockchain ganó popularidad inicialmente como la columna vertebral de las criptomonedas como Bitcoin, su potencial va mucho más allá. Hoy en día, blockchain se utiliza en una variedad de aplicaciones, desde la gestión de la cadena de suministro hasta la votación en línea y la verificación de identidad.

En mi Github tienes a tu disposición un ejemplo claro: Smart Contract del Txoco Cal Padrí.

Retos y Limitaciones

A pesar de su potencial, la adopción de blockchain todavía enfrenta desafíos. La escalabilidad es uno de los más grandes; a medida que la cadena crece, se necesita más poder de computación para mantener la red. Además, hay preocupaciones sobre la privacidad y la posibilidad de que actores malintencionados exploten vulnerabilidades en el sistema.

Conclusión

En resumen, blockchain es una tecnología emergente con el potencial de transformar diversas industrias, ofreciendo una mayor transparencia y seguridad. Sin embargo, como cualquier tecnología en desarrollo, también tiene sus desafíos y limitaciones que necesitan ser abordados. Lo que es indiscutible es que ha abierto un nuevo mundo de posibilidades y seguirá siendo un tema de discusión en los años venideros.

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 →