jueves, 4 de enero de 2018

Ethereum y la descentralización con Dapps



Ethereum es una tecnología basada en Blockchain que nació en 2014 y a mediados de 2015 comenzó su lanzamiento con el un IPO inicial. Su diferencia principal a Bitcoin es que Ethereum es turing-completa, es decir, permite crear aplicaciones a través de su lenguaje de transacciones.

Ethereum es la primera criptomoneda que ha hecho un cambio de paradigma fundamental en lo que la tecnología Blockchain puede hacer. No es sólo una moneda. Es un ordenador programable accesible desde cualquier parte del mundo descentralizado y que puede hacer cualquier aplicación. Ethereum es un sistema que podría construir cualquier número de monedas alternativas, por ejemplo, se puede reconstruir Bitcoin en Ethereum; sin embargo no se podría reconstruir Ethereum en Bitcoin. Es fundamentalmente más potente, como comparar una calculadora con un ordenador.


Sus creadores definen las unidades como el fuel para la creación de estas aplicaciones. Sus posibilidades se extienden desde realizar pagos, al alquiler y creación de contratos digitales a poder realizar nuevas oportunidades de negocio como micro-mecenazgo y aplicaciones móviles o web con los datos descentralizados.

Un ejemplo son las aplicaciones Dapps que están comenzando a crearse. Los desarrolladores no necesitan realizar el desarrollo de un Backend en un servidor central donde guarda los datos del cliente. En su lugar, se ahorran los costes de esto y se puede crear aplicaciones centrándose tan solo en el usuario, es decir, la aplicación móvil o web. Por ejemplo, un desarrollador podría crear un juego para smartphones basado en un modelo de negocio freemium y que los usuarios sean ellos quienes se encarguen de realizar los pagos a través de Ethereum. Este sistema descentralizado se encargaría de gestionar los datos y enviar los pagos a la cartera del desarrollador así como añadir el contenido adicional en la aplicación. Actualmente ya existen proyecto que se pueden encontrar en web como http://dapps.ethercasts.com/

Otra aplicación muy interesante asociada a Ethereum es la creación de DAOs o Decentralized Anonymous Organizacións. Esto permite que un grupo de personas creen asociaciones aportando el fuel necesario en forma de ether (unidad de esta criptomoneda). Para realizar los gastos en forma de ether de esta comunidad necesitaría de la firma digigal de cada uno de los miembros. Esto es muy similar a como funciona Bitcoin con el sistema de multifirma, donde puedes generar las n-de-m claves, es decir, para enviar bitcoins requiere de la firma de n claves de m totales con las que se generó la dirección. Por ejemplo, si tenemos una multifirma 2-de-3, necesitamos firmar al menos con 2 claves privadas de las 3 claves públicas con las que se generó la dirección. En el caso de Ethereum las posibilidades aumentan, puedes decidir hasta cuantas cantidades pueden enviar unos y cuantas otros, limitar el envío de, por ejemplo, un departamento del DAO al mes o decidir para enviar a unos tienen que firmar todos pero a otros solo se requiere firmar por unas personas determinadas.


Homestead

El pasado 29 de febrero de 2016 el equipo de Ethereum publicaba la próxima primera versión estable, llamada Homestead, anunciando que salían del estado beta en los próximos días (hard-fork a partir del bloque 1500000). En su web https://ethereum.org/ se puede acceder a la descarga de la aplicación.


Metropolis

Metropolis es la tercera etapa de Ethereum en un proceso separado de 4 etapas y hay muchas características interesantes que vienen cuando se implementa. Estos son algunos de los principales que tendrán muchas repercusiones.

     Zk-Snarks: Privacidad con la prueba de conocimiento cero del protocolo Zerocash ideado por ZCash.
     Prueba de implementación temprana de Stake. La migración de Prueba de Trabajo a Prueba de Participación llevada a cabo por Vlad Zamfir.
     Flexibilidad y solidez de los contratos inteligentes.
     Abstracción de cuenta.

jueves, 22 de septiembre de 2016

Introducción a Microservicios

Para construir aplicaciones orientadas a servicio, los más habitual es crear una aplicación monolítica, bajo la esquema clásico Model-View-Controller, con un único contenedor que incluye tanto la lógica de negocio como la interfaz de usuario.

Cuando estas aplicaciones crecen y abarcan un gran conjunto de diferentes componentes, módulos y pruebas previas al despliegue; aumentan en proporción al crecimiento de la aplicación (aumento en los tiempos de pruebas, conflictos y revisión de código) en detrimento del tiempo de producción para desplegar y actualizar nuevas versiones en producción. Como solución a estos problemas surgen nuevos patrones de arquitectura como el mencionado aquí.  Pero, ¿qué son las aplicaciones basadas en Microservicios?

Una arquitectura basada en microservices divide el front-end y el back-end, por lo que es más fácil de distribuir, basado en los principios Reactivos para la construcción de un servicio aislado escalable, resistente a fallos y que se combina con otros servicios para formar un todo.
Ejemplo arquitectura microservicios con JHipster
Ejemplo de aplicación en arquitectura de Microservicios con JHipster.
Los microservicios son, en definitiva, una extensión de la arquitectura orientada a servicios para contruír sistemas distribuidos de software. La idea nace de mano del Doctor Peter Rodgers en 2005 introduciendo el término Micro-Web-Services en la presentación de la conferencia Cloud Computing Expo. Más tarde, Adrian Cockcroft en Netflix los describiría como "Arquitecturas Orientadas a Servicio de grano fino" y; James Lewis y Martin Fowler terminan por nombrar a este término como Microservicios:
La "Arquitectura Microservicio" ha surgido en los últimos años para describir una forma particular de diseñar aplicaciones de software como suites de servicios con despliegue independiente.
Si bien no existe una definición precisa de este estilo arquitectónico, hay ciertas características comunes en torno a la capacidad de negocio, el despliegue automatizado, la inteligencia en los puntos de control y el control descentralizado del lenguaje de programación y los datos.
Una aplicación con microservicios se basa en que la versión monolítica debe ser separada en proyectos completamente independientes y que estos se comuniquen entre sí, a través de servicios web, donde cada uno realizará su propia lógica de negocio. Una aplicación a modo de pasarela orquesta estos microservicios para proveerlos al cliente a través de una interfaz de usuario o front-end. Cuando se requiera refactorizar código o actualizar la versión de uno de estos microservicios, al ser completamente independientes se pueden lanzar las pruebas y asegurar la calidad. En caso de éxito en las pruebas, puede resultar sencillo desplegar la nueva versión del microservicio en producción sin afectar al resto.

Ver Microservices at Netflix Scale: Principles, Tradeoffs & Lessons Learned por Ruslan Meshenberg en GOTO 2016:


Los microservicios contemplan las siguientes características y ventajas:
  • Facilitan el reemplazo de cada uno de los servicios, sin tener que eliminar todo el conjunto de la aplicación.
  • Los servicios se organizan por capacidades, por ejemplo interfaz de usuario, logística, facturación, etc.
  • Los servicios se pueden implementar con diferentes lenguajes de programación, bases de datos, hardware y entornos de software.
  • La arquitectura es simétrica y no jerárquica.
  • Se presta a un proceso de desarrollo de software de entrega continua. Un cambio de una pequeña parte de la aplicación sólo requiere uno o un número pequeño de servicios a ser reconstruidos y desplegados.
  • Obliga a crear una estructura modular.
Como desventajas destacan:
  • Los servicios constituyen barreras para la información. Se crearán varias fuentes de datos, que requieren comunicarse entre ellas y realizar varias copias, snapshots y recuperaciones.
  • La arquitectura introduce una complejidad adicional y nuevos problemas que resolver, como la latencia de la red, formatos de mensaje, equilibrio de carga y tolerancia a fallos.
  • Las pruebas y el despliegue son más complicados.
  • Entre las llamadas de los microservicios hay un mayor coste en términos de latencia de la red y el tiempo de procesamiento de los mensajes que en las llamadas en una aplicación monolítica.
  • Mover responsabilidades entre los microservicios es más difícil. Puede implicar la comunicación entre los diferentes equipos, refactorizar código de una funcionalidad en otro lenguaje o tener que hacerlo encajar en una infraestructura diferente.
Desde el 2015 el término microservices es bastante hype, ¿quién no desearía migrar su aplicación monolítica a microservicios? Si algún lector está pensando en hacerlo, recomiendo el leer el artículo de Arun Gupta Monolithic to Microservices Refactoring for Java EE Applications y ver el siguiente que presenta en la conferencia Devoxx de 2015 "Refactor your Java EE application using Microservices and Containers":




Fuentes:

viernes, 11 de septiembre de 2015

RevealJs, HTML5 ideal para presentaciones


Hace unos meses he estado leyendo acerca de los presentadores en MarkDown y HTML5. Entre los que más podrían destacar, aunque distintos, RevealJs, Impress y RemarkJs. RevalsJs tiene una versión online en Slides.com (gratuita para proyectos públicos). Impress está basado en el editor de presentaciones online Prezi.com. RemarkJs es un proyecto que destaca por su sencilled.

Esta tarde he subido una plantilla para RevealsJs mi cuenta de GitHub. Es una modificación del fork original el cual incluye soporte para AngularJs, carga de las pantallas a partir de datos en json y una barra de menús en la parte superior. Aún necesita una serie de mejoras pero como idea base funciona perfectamente.

Otra opción mucho más elegante, es crear los proyecto mediante generadores de código. Yeoman es un famoso ecosistema de autogeneradores para múltiples aplicaciones y frameworks, algunos muy interesantes como JHipster (Spring Boot + AngularJs), generadores de AngularJs, React, Backbone y para RevealJs.

Esto es lo que hace el autogenerador de Yeoman generator-reveal, creado por Sebastian Lara Menares, permitiendo crear una presentación en HTML5 en apenas unos minutos mediante línea de comando. Creando un proyecto mucho más limpio, simple y mejor organizado.

Para instalar Yeoman y el autogenerador de RevealJs, es tan simple como seguir los pasos que describo a continuación (debereis tener instalado NodeJs con la ruta del PATH hacia la ruta de ejecutables de Node para poder ejecutar "npm"):

$ npm -g install yeoman generator-reveal bower grunt-cli
$ mkdir generator-reveal-presentation && cd $_
$ yo reveal
This includes the amazing Reveal.js Framework
and a Gruntfile for your presentation pleasure.

? What are you going to talk about? Title
? What version should we put in the package.json file? 0.0.0
? Do you want to use Sass to create a custom theme? Yes/No
? What Reveal.js theme would you like to use? simple
? Do you want to deploy your presentation to Github Pages? This requires an empty Github repository. Yes/No

$ yo reveal:slide "Introduction" [--markdown] [--attributes] [--notes]
$ yo reveal:slide "Targets" [--markdown] [--attributes] [--notes]
$ yo reveal:slide "Demo with video cats" [--markdown] [--attributes] [--notes]
$ yo reveal:slide "Greetings" [--markdown] [--attributes] [--notes]
# Markdow crea el slide como lenguaje de MarkDown
# attributes añade atributos opcionales para el slide: background, otros.
#note añade notas para mostar ayuda en la ventana del ponente.

# Editar primer slide
$ vi slides/index.md

### Is Evil Corp real?
##### Fsociety
>##### from: Mr. Robot
>##### by: Christian Bale

note:
From the terminal, pop in:

```yo reveal:slide "Slide Title"```

Available options:

```--markdown --attributes --notes```

# Editar último slide
$ vi slides/index.json
{
"filename": "greetings.md",
"attr": {
"data-background": "img/questions.jpg"
}
}

# Ejecutar gestor de tareas
$ grunt serve

A continuación se describen algunos consejos para la creación de presentación con generator-reveal.

Atributos en Diapositivas

Abrir Slides/list.json y añadir el atributo attr con la lista de los atributos que se quieran añadir a una diapositiva. Por ejemplo con la imagen de fondo y clase centrado:
    {
        "filename": "index.md",
        "attr": {
            "data-background": "resources/background.png",
            "data-background-size": "1024px",
            "class": "center"
        }
    },



Diapositivas Verticales

Para añadir diapositivas verticales a una diapositiva horizontal, tan solo es necesario sustituir el documento JSON por un array de documentos:
    [
        {
            "filename": "introduction.md"
        },
        {
            "filename": "introduction/introduction1.md",
            "attr": {
                "data-background": "resources/background.png",
                "data-background-size": "1024px",
                "data-transition": "none"
            }
        },
        {
            "filename": "introduction/introduction2.md",
            "attr": {
                "data-background": "resources/background.png",
                "data-background-size": "1024px",
                "data-transition": "none"
            }
        },
        {
            "filename": "introduction/introduction3.md",
            "attr": {
                "data-background": "resources/background.png",
                "data-background-size": "1024px",
                "data-transition": "none"
            }
        }
    ],

MarkDown

Las diapositivas pueden ser creadas en formato Markdown (extensión .md) facilitando bastante la creación de las presentaciones. Con el editor Atom de Github se puede ver una previsualización de los resultados de una página en Markdown pulsando la combinación de teclas Control, Shift y M o en el menú Packages -> Markdown Preview -> Toggle Preview.


Previsualización de MarkDown con editor Atom.


MarkDown con Fragments

Para ir mostrando líneas de texto poco a poco en una diapositiva se usa la clase fragments. La forma de añadirlo en Markdown se añade con el comentario de HTML .element.

Imágenes en MarkDown

Agregar imágenes con MarkDown es muy sencillo, con [!Nombre de imagen] se añade el texto para el atributo alt. RevealJs añade la imagen con un borde grueso de color negro. Se puede eliminar añadiendo el estilo "border:0px;". Por defecto, esto deja un marcado de sombreado para los bordes de la imagen. Esta sombra también se puede eliminar con "box-shadow: 0 0 0 rgba(0, 0, 0, 0);". La imagen se ajusta automáticamente al 95% del total del tamaño de la diapositiva. También se puede alinear junto con un texto con el atributo CSS "vertial-align", con opciones como baseline, bottom, top o middle. A continuación se muestra un ejemplo:
## ![Cassandra](resources/logo_cassandra.png )<!-- .element: style="border:0px; box-shadow: 0 0 0 rgba(0, 0, 0, 0); vertical-align: middle;" --> Apache Cassandra

Personalizando RevealJS

Para cambiar las propiedades de RevealJs se deben utilizar las plantillas dentro del directorio templates. No se debe modificar directamente index.html, porque en cuanto se ejecute grunt los cambios serán sobreescritos por el fichero de la plantilla.

En _index.html está la configuración de RevealJs. Para añadir otras opciones como mostar paginación o añadir movimiento con la rueda del ratón:
Reveal.initialize({
            controls: true,
            progress: true,
            history: true,
            center: false,
            slideNumber : true,
            fragments: true,
            mouseWheel: true,
            hideAddressBar: true,
            transition: 'slide', // none/fade/slide/convex/concave/zoom

Código en MarkDown

RevealJs incluye sintaxis de código con highlighting y es posible crear elementos de código para cada lenguaje.
Para incluir código en MarkDown tan solo es necesario añadir 3 comillas simples invertidas ```, al inicio y al final. También se puede indicar en qué lenguaje está escrito el código.

Dos columnas por Diapositiva

A veces resulta interesante poder dividir la diapositiva en 3 o más columnas. Las columnas se pueden añidir con nuevas propiedades CSS: moz-column-count y -webkit-column-count para navegadores Mozilla y Webkit respectivamente. En template/_index.html añadir:
         <style>
          .multicolumn > ul, .multicolumn > ol {
              -moz-column-count: 2;
              -moz-column-gap: 50%;
              -webkit-column-count: 2;
              -webkit-column-gap: 50%;
              column-count: 3;
              column-gap: 50%;
          }
         </style>


e indicar en la configuración de la diapositiva, en Slides/list.json, el nombre de la clase multicolumn.


Resultado diapositiva con doble columna

Notas para presentaciones

Se pueden añadir notas de ponente en cada diapositiva para ayudar en las presentaciones. Para ello, en cada diapositiva se añade la etiqueta aside con la clase notes. Para diapositivas en MarkDown es mucho más simple, basta con añadir note: al final:

Pulsando la tecla s, RevealJs abre una nueva ventana del navegador, un temporizador de tiempo (reiniciable pulsando sobre él) y las notas añadidas.

Conversión a pdf

La presentación de RevealJs se puede convertir a pdf. Lo único que hay que hacer es añadir el parámetro "?print-pdf" a la url.

Cuidado con los cambios en la hoja de estilos. Por ejemplo, el estilo de doble columna no estará optimizado para impresiones en pdf.

Desplegar en Github

Con Generator-Reveal, se puede configurar fácilmente para que despliegue una página de presentación usando github. Lo que se realiza de forma automática es subir crear la complilación de archivos en dist, crear la rama gh-pages en dist para subir posteriormente el contenido al repositorio del usuario de Github. Esto crea finalmente una página con la presentación desplegada en https://[usaario].github.io/[nombre-repositorio].
Primero, es necesario crear el repositorio en Github y a continuación ejecutar los comandos de linea:
$ grunt dist
$ git init
$ git add .
$ git commit -m 'First commit'
$ git remote add origin remote repository URL
$ grunt deploy


Para desplegar, debe estar configurado en Reveal la cuenta y el repositorio del usuario (seleccionado durante la creación del código con Yeoman). Sin embargo, los datos del repositorio puden ser reconfigurados posteriormente en los ficheros .yo-rc.json y Gruntfile.coffee:
$ vim .yo-rc.json
    "deployToGithubPages": true,
    "githubUsername": "user-github",
    "githubRepository": "repository-name"
  }
}

$ vim Gruntfile.coffee
        buildcontrol:

            options:
                dir: 'dist'
                commit: true
                push: true
                message: 'Built from %sourceCommit% on branch %sourceBranch%'
            pages:
                options:
                    remote: 'git@github.com:user-github/repository-name'
                    branch: 'gh-pages'
...
    grunt.registerTask 'deploy',
        'Deploy to Github Pages', [
            'dist'
            'buildcontrol'
        ]


Finalmente, en este enlace se muestra el código y resultado de una presentación creada con RevealJs y Generator-Reveal.

sábado, 8 de noviembre de 2014

OSHWDem 2014 evento de hardware libre en A Coruña

Hoy se ha celebrado en A Coruña la tercera edición de la feria tecnológica OSHWDem organizado por Bricolabs junto con la ayuda de varios colaboradores.

Este año el evento se realizó en las instalación del museo del hombre Domus. Durante el día de ayer los chicos de Bricolabs y de forma totalmente gratuíta se dedicaron a dar una serie talleres para la Impresión 3D o creación de robots siguelíneas, incluso regalando el material con el que te fabricabas el robot.



Hoy, desde la 10:00 hasta media tarde se organizó este genial evento Maker Movement para promover el hardware libre y la creación de todo tipo de hardware y software como las impresoras 3D o drones.

Como siempre, no podían faltar los regalos a los más madrugadores, sorteos y concursos como el siguelíneas y la competición de sumo entre robots.

Con visitas de gurús de la impresión 3D en España como es @Obijuan_cube o @TCRobotics, uno de los organizadores, con la presentación de su Wheelie.
Wheelie creado por @TCRobotics
El dron incluye una señal GPS, indicando la ruta desde google maps a través de una aplicación Android es posible dirigir el vehículo por zonas de difícil acceso. Además, tiene dos cámaras, frontal y trasera, junto con unas gafas con pantalla (parte izquierda de la imagen) para seguir la exploración. Pero lo más interesante es el radar láser que incluye Wheelie basado en Open Lidar, un proyecto que aprovecha el componente de la aspiradora inteligente de Neato Robotics.

Daniel, otro de los organizadores, nos enseñaba algunos de los drones realizados en BricoLabs y otros productos comerciales.
Quadcóptero con señal GPS
Otros de los productos que BricoLabs nos presentaba era una mano mecánica hecha con impresión 3D y sensores atmosféricos con Arduino.


Mano mecánica con microArduino e impresión 3D.


Entre otros stands teníamos además de drones e impresoras 3D varios aparatos hardware y muchas ideas innovadoras con desarrollo hardware y software libre tanto de organizadores del propio evento o nuevas empresas relacionadas con open hardware como un grupo de gente que presentaba sus trabajos y proyectos personales.




@Jerberrypi esta vez nos tenía preparado un comedero domótico para tortugas mediante el cual solo tenímos que twittear cualquier mensaje con el contenido "comed tortugas" para darles de comer. Además, no podía faltar la webcam para monitorizarlas desde cualquier sitio con conexión. Todo gestionado a través de una RaspberryPi.

Alex y sus amigos de instituto nos presentaba un invernadero con un Arduino y varios sensores para gestionar el autoregado, luminosidad y temperatura mediante el uso de ventiladores y un secador. Además de varios de los robots que usarían para los concursos. Uno de ellos era una Roomba tuneada con sensores de proximidad.

Invernadero domótico.
@escornabot es un robot basado a partir de un proyecto comercial creado para que fuese hardware libre y culquiera pudiera imprimirlo y montarlo en casa. Teneis los diseños publicados en el github de Xoan, uno de los chicos de Bricolabs que estuvo en los talleres de impresión 3D.

Mateo nos presenta sus cubos para crear música electrónica o chipmusic a partir de componentes hardware que podemos encontrar en cualquier tienda de electrónica. El proyecto está disponible en thehypercubes.com

Make Your Own Music en thehypercubes.com
Cada uno de los cubos tiene unos imanes anti-dummies preparados para conectar varios cubos y poder crear música. Dentro del cubo y entre sus componentes están unos leds de colores que identifican la función principal del cubo, desde el verde para orquestar la sintonía con todos los cubos al azul y rojo para controlar el volumen y crear distorsión. Incluso, algunos cubos carecen de potenciómetro e incluyen un sensor para modificar el sonido colocando nuestros dedos. El material de los cubos y la protoboard pueden ser creados con impresión 3D y en un futuro se busca poder reducir el tamaño de los cubos a más de la mitad.

Enxine nos presentan un prototipo que integra varias placas de hardware libre para poder realizar mediciones en tiempo real del consumo de nuestros aparados de casa. Incluyendo comunicación RFC con distintos aparatos como Ninjablocks para el Internet de las Cosas o IoT.

La empresa Flinq para la innovación tecnológica y eficiencia energética nos presenta un gestor de medición de consumos mediante el uso de hardwarea y software libre. Entre las aplicaciones que utilizan se encuentran emonTx de OpenEnergyMonitor para conectar a cualquier aparato electrico y medir a través de una RaspberryPi el consumo para la búsqueda de tarifas más óptimas en una empresa y otras soluciones de gestión de recursos de las empresas con el openERP Odoo que nada tiene que envidiar a productos comerciales el cual incluye características como gesticón de clientes al estilo kanban, facturación, gráficos de Gantt, una API para conectar tus aplicaciones a medida e incluso algunas características de análisis de datos para Inteligencia de Negocio o BI.

BricoGeek, uno de los colaboradores del evento, nos trajo diverso material de hardware libre e incluso un mandos arcade con el juego de Street fighter II para echar unas partidas.


Entre otros de los asistentes estaban la tienda de impresión 3D GaliPrint3D,
Codemonsters para la enseñanza de programación a niños de cualquier edad mediante lenguajes como Scratch , Duinobox, Ecogarden y la creación de biodiesel reciclando aceites a través de filtros de Luigui Pirelli.

Creación de biodiesel por Luigui Pirelli
Varios modelos de impresoras 3D

Impresora 3D Dragon

Modelo plegable FoldaRap
Varias piezas impresas

Luchador de Sumo Turrabot creado por el niño ganador del consurso siguelíneas del año anterior
Aquí teneis algunos vídeos del evento:

Podeis ver más información y fotografías del evento desde su twitter oficial.

miércoles, 13 de agosto de 2014

El protocolo de Bitcoin, mercado, minado y otras criptomonedas

El Bitcoin es una moneda virtual descentralizada y un protocolo basado en los principios de la criptografía asimétrica. Funciona en una red punto a punto que es mantenida por todos sus usuarios y su implementación está publicada bajo licencia de software libre con el código fuente disponible para todo el mundo.

Ejemplo de cifrado de mensaje con cifrado asimétrico. Fuente Wikipedia.


Desde la página oficial se puede obtener información para empezar a usar el Bitcoin y crear un monedero virtual con el que recibir y enviar dinero transacciones.

El proyecto comenzó en 2008 cuando un usuario bajo el pseudónimo de Satoshi Nakamoto publicó en una revista lista de correo de criptografía de metzdowd.com el paper como un sistema descentralizado P2P de dinero electrónico. El 11 de Febrero de 2009 publicaría la primera versión del cliente de Bitcoin en el foro de p2pfundation.

Actualización (15/08/2014): Desde metzdowd se puede acceder a la primera publicación en 2008 del paper y a la publicación de la primera versión del cliente de Bitcoin en 2009. Fuente: coindesk.com.

El cliente de Bitcoin o cartera se sincroniza con la red descargando todas las transacciones registradas. Es decir, que todos los pagos en Bitcoin son públicos. En sitios como blockchain.info se pueden consultar todas las transacciones que se están realizando en tiempo real.

Funcionamiento básico

Todas las transacción de bitcoins son públicas y se transmiten a través de una red descentralizada P2P donde los clientes actúan a la vez de servidores o nodos.

Cuando un cliente envía bitcoins a otro, la transacción se añade a un bloque que se propaga por la red. Toda transacción se confirma cuando es incluida en un bloque y a partir de ese bloque se sigue confirmando con los siguientes bloques. Cuantas más confirmaciones tenga una transacción se reduce la posibilidad de que ésta sea revertida. Por este motivo se suele solicitar al menos 3 confirmaciones o más para dar como válida una transacción.

En el White Paper oficial se explica el funcionamiento técnico con mayor detalle.

Generación de bloques

Un bloque se genera cada 10 minutos y tiene una estructura y una cabecera establecidas donde se indica:
  • Magic no: El valor de "número mágico" 0xD9B4BEF9, valor poco probable de que se produzca en la tabla ASCII en los datos normales con el siguiente bloque.
  • Blocksize: Tamaño de bloque.
  • Cabecera de bloque:
    • Version: versión del bloque
    • hashPrevBlock: El hash del bloque previo (SHA256)
    • hashMerkleRoot: El hash inicial raíz basado en todas las transacciones del bloque, cambia cuando se añade una nueva transacción.
    • Time: timestamp en 4 bytes.
    • Bits: indica la dificultad del bloque
    • Nonce: comienza en 0 y se incrementa en cada hash hasta que se desborda. Cuando lo hace, varía el valor de hash Merkle Root y asegura que sea casi imposible que dos personas generen el mismo valor de hash del bloque.
  • Contador de transacciones
  • Lista de las transacciones incluidas en el bloque.

Para generar un bloque se realiza una prueba de trabajo Proof of Work o PoW. Un sistema de prueba de trabajo PoW es una medida para disuadir ataques de denegación de servicio o correo no deseado en una red que requiere un trabajo del solicitante del servicio (normalmente tiempo de procesamiento con un ordenador).

Existen varios algoritmos de PoW. Bitcoin utiliza el algoritmo HashCash, creado por Adam Back en 1997.
 
Un Hashcash constituye un trabajo de prueba o PoW del que se tiene una cantidad parametrizable de trabajo para calcular y enviar. El receptor, o cualquiera ya que el trabajo enviado es público, pueden verificar el hashcash recibido de manera eficiente.


Este algoritmo está siendo utilizado por sistemas de seguridad como Spamassassin para evitar el envío de correo no deseado en agentes de correo electrónico o MTAs. 


En el White paper de hashcash se pueden leer con profundidad los detalles técnicos.

Minería

El cálculo de la cadena de bloques se llama minería. Un minero recibe una compensación en monedas cada vez que encuentra un bloque. Esta recompensa disminuye cada cierto número de bloques. Solo hay 21 millones de bitscoins, pero los bloques se siguen generando indefinidamente siempre que haya transacciones. Cada transacción emitida tiene un porcentaje muy pequeño de comisión que es repartido entre todos los mineros de la red.

Esquema protocolo de Bitcoin. Fuente
libro Mastering Bitcoin de Andreas M. Antonopoulos, editorial O'Reilly
Atlas.


En un principio se podía realizar minería con el monedero oficial en lo que se denomina Solo Mining. Pero cuantos más mineros haya y mayor su potencia de minado o hashrate, más aumenta la dificultad para que un minero encuentre un bloque válido. Esta dificultad se actualiza cada 2016 bloques (sobre dos semanas).

A día de hoy la única forma viable de minar bitcoins es en agrupación o Mining Pool y utilizando hardware ASIC.

Actualización (15/08/2014): En coindesk se puede leer con mejor detalle como se genera un bloque y como los mineros aseguran la confianza de la cadena de bloques.

Cartera

Para enviar y recibir bitcoins se utiliza una cartera electrónica de bitcoins. Una cartera tiene dos elementos principales:
  • Clave pública: La dirección del receptor cuyo emisor debe conocer para poder enviarle monedas.
  • Clave privada: Solo conocida por el dueño de la cartera para poder enviar sus monedas a otras direcciones. La clave privada se almacena en un fichero. Normalmente una aplicación cartera nos da la opción de cifrar el fichero que contiene la clave privada con una contraseña.
El código fuente de la cartera oficial está disponible en github. Desde la página oficial oficial se pueden descargar varias carteras no oficial, la versión core u oficial se instala en el equipo local y requiere la descarga sincronización de la cadena de bloques.

Hay otras carteras que no necesitan descargar toda la cadena de bloques e incluso hay carteras para dispositivos móviles como en Android.

Bitcoin Wallet para Android.

En Blockchain.info además de poder consultar en tiempo real todas las transacciones tiene disponible una cartera online que se puede crear con un simple registro. Hace unos meses publicaron una versión para Android.

Coinbase también ofrece un servicio de cartera online.

Se recomienda siempre cifrar el monedero (la clave privada contenida en un fichero de la cartera) con una contraseña.

Exchanges

La forma más fácil de adquirir bitcoins es comprarlos. Existen multitud de sitios web para el intercambio de bitcoins. En Europa están Bitstamp, en Rusia BTC-e, en China existen muchos sitios de intercabmio donde Okcoin tiene el mayor volumen de intercambio de bitcoins del mundo.

Principales Exchanges por volumen de bitcoins. Fuente The Story of Bitcoin.
Funcionan como un mercado de valores donde los usuarios realizan órdenes de compra y venta dando al Bitcoin un valor en función de la oferta y la demanda.

Estos sitios suelen ofrecen una API a través de un servicio web REST que automatizan los intercambios. En github tenéis disponible un script de ejemplo para realizar el intercambio de Bitcoin por otras monedas virtuales a través de 3 sitios web.

Otros sitios web como Localbitcoins permite realizar compras o ventas directas a través de intermediarios.

Cajeros automáticos

Una alternativa cada vez más presente son los cajeros automáticos de bitcoin. Hay varios modelos y se usan para facilitar los pagos con bitcoins en tiendas cercanas. Su uso es muy sencillo a través de códigos QR y dispositivos móviles.

Canadá es el país con más cajeros de Bitcoin en el mundo y en España ya hay varios cajeros instalados. En coindesk hay una sección para localizar cajeros y fabricantes de ATMs para Bitcoin en un mapa de Google Maps.

Mercado

El Bitcoin ofrece muchas posibilidades como forma de pago. Desde que la pizzería Papa Johns vendió la primera pizza en Bitcoins por 10 mil bitcoins, en el valor de 2010, actualmente multitud de comercios aceptan Bitcoin como medio de pago. La razón es la posibilidad de realizar transacciones, y microtransancciones, de forma directa e instantánea además de la baja comisión frente a otros sistemas de pago electrónicos como la tarjeta de crédito o Paypal.

Una solución ágil y simple para el comercio electrónico es Bitpay, conocido como el Paypal de Bitcoin. Permite aceptar el Bitcoin en tu comercio como medio de pago y recibir los ingresos en euros. Tal es el éxito de esta plataforma que ya está siendo utilizado en muchos sitios web y ha llegado a procesar un millón de dólares al día.

La plataforma de intercambio o exchange de bitcoins Coinbase ofrece una cartera de bitcoins online y un sistema de pago a través de su plataforma que puede ser incluida en cualquier comercio. Los packs de videojuegos de Humblebundle pueden ser adquiridos en bitcoins a través de esta plataforma y Overstock, una cadena de venta online de productos en stock de Estados Unidos, acepta Bitcoin como medio de pago aumentando consigo el número de ventas en más de un millón de dólares en dos meses.

Virgin también acepta el pago en esta criptomoneda para sus vuelos espaciales y Dell ya acepta bitcoins como forma de pago para la compra de sus productos hardware.

Los hermanos Winklevoss adquieren billetes de Virgin con Bitcoins. Fuente Coindesk.

Otras criptomonedas

Con el Bitcoin le siguen otros proyectos de monedas virtuales. Litecoin fue lanzada en 2011 por Charles Lee, ex-empleado de Google y actualmente trabajando en Coinbase. Dogecoin es una moneda basada en el meme de Doge que empezó a finales de 2013 parodiando al Bitcoin por el aumento de interés mediático tras romper la barrera de los 1,000$.

En menos de un mes Dogecoin superó en número de transacciones al Bitcoin. Obtuvo mucha fama en redes sociales como Reddit donde muchos usuarios empezaron a conocer el funcionamiento de las criptomonedas y a minar varias monedas al día con ordenadores sencillos (cuando la recompensa inicial era de 500 mil doges/bloque). A partir de aquí se financiaron varios proyectos solidarios como doge4water y doge4kids o eventos deportivos como la Nascar (piloto Josh Wise) o el equipo de bobsleigh Jamaicano.

Dogecoin ha financiado múltiples proyectos solidarios y eventos deportivos como la Nascar. Fuente Reddit.

Existen infinidad de monedas virtuales y cada día surgen nuevas altcoins, cada una con implementaciones diferentes y nuevas ideas como SpainCoin con el 50% preminado para repartir entre los ciudadanos españoles que lo soliciten. Otras implementaciones incluyen nuevos algoritmos de cálculo de bloque como Scrtypt-N de Vertcoin (y con posibilidad de envío anónimo) o X11 de Darkcoin (completamente anónimo), implementaciones AuxPoW para compartir el hashrate con otras monedas, cálculos de dificultad variables, transacciones anónimas o stealth address e incluso chats descentralizados como en Talkcoin.

En el foro de bitcointalk se publican cada día nuevas altcoins y en coindesk se puede leer un artículo interesante comparando las altcoins con los inicios de los ordenadores para casa y los microcomputadores.

Mientras Dogecoin acaba de anunciar su fork a AuxPoW para poder minar junto con Litecoin, cada vez hay más desarrollo e innovación entre algunas de las criptomonedas. Aunque esto no signifique una alta demanda actual de monedas (con aumento de su valor) podría significar una buena inversión de cara al futuro.

Minar Bitcoin o monedas Scrypt

Para minar Bitcoin es necesario utilizar el hardware ASIC más potente, donde cada día hay más competencia y el hardware queda rápidamente obsoleto e inútil. Teniendo en cuenta la estimación de subida de dificultad para Septiembre, esto implica importantes inversiones. Cuidado con el dudoso ROI de los servicios CloudMining y los retrasos de entregas de hardware, aduanas, instalación, etc. Podría decirse que el principal beneficiario en la minería de bitcoins hoy en día son los fabricantes de ASICs.

Hace poco se publicó en el blog the Thecoinsman la curiosa visita a un centro de minado de Bitcoins en China con más de 500 TH/s, unos 14 BTC/día con la dificultad actual. Mientras, en Europa el fabricantes sueco de ASICs KnCMiner tiene su propio centro de datos profesional.

Centro de datos de minado de KnCMiner. Fuente foro bitcointalk.

También sale rentable minar otras monedas con algoritmos diferentes. Hasta el primer cuarto de 2014 era posible minar con tarjetas gráficas monedas con el algoritmo Scrypt como Litecoin o Dogecoin (que superó los 200 satoshis en Enero). Pero con la llegada de ASICs para Scrypt es necesario plantearse la opción de adquirir un minero ASIC Scrypt si queremos minarlas y obtener beneficios.

En rigwarz hay una lista de mineros y sus fabricantes tanto para SHA-256 (bitcoin) como Scrypt.

En BitcoinWisdom se puede calcular el retorno de inversión indicando el precio del hardware, consumo eléctrico y previsión del aumento de dificultad. En muchos casos resulta más económico comprar monedas directamente antes que minar.

Minar monedas alternativas

Aún es rentable minar usando tarjetas gráficas monedas con algoritmos por ahora resistentes a hardware ASIC como Scrypt-N, Quark, X11, Keccak, NIST5, o X13.

Si eres algo mañoso puedes montarte tu propio rig con varias gráficas para minar altcoins. Aunque la entrada es algo antigua, en CryptoBadger hay un buen tutorial de como montar y configurar un rig minero.

Algo no muy complicado y muy recomendable es hacer undervolt en las tarjetas gráficas para reducir el consumo eléctrico (en Windows se puede hacer con los drivers).

Rig con 3 gráficas ATI 7950 y fuente de 850w.
También se aconseja separar las gráficas del resto de circuitos utilizando extensores de PCIe, utilizar fuentes eficientes con certificados 80plus y montarlo en estructuras abiertas y aisladas para una buena la ventilación. En tiendas como pcgal se pueden adquirir extensores PCIe y otros materiales de minería desde España y sin tener que esperar semanas a que lleguen desde China o Hong Kong.

Los algoritmos como el X11, X13 o NIST5 tienen la ventaja de que las gráficas consumen bastante menos, entorno a un 40% menos frente a Scrypt y Scrypt-N, generando menos calor.

Software minero

Para minar una criptomoneda es necesario utilizar el software que calcule los posibles bloques en el algoritmo específico de la moneda. Además, el software debe estar adaptado al hardware que se va a utilizar.

Para las tarjetas gráficas ATI están todas las versiones basadas en el Cgminer de Con Kolivas como Sgminer (Scrypt), Vertminer (Scrypt-N), Sph-sgminer y todas las mejoras de optimización para diferentes algoritmos como el Sph-Sgminer_x11mod (X11, X13, Nist5 entre otros).

Para tarjetas gráficas Nvidia están disponibles CudaMiner y ccMiner.

Aunque Nvidia obtiene un rendimiento menor en los algoritmos Scrypt y Scrypt-N, las versiones de múltiples algoritmos como X11 o X13 tienen un rendimiento similar al obtenido con gráficas ATI.

La forma más sencilla para la instalación del software minero es recurrir a  distribuciones de GNU/Linux, autoarrancables desde USB y con todo lo necesario para minar.

El usuario Bee adaptó el original BAMT (versión basada en Debian x86) creando Litecoin BAMT. Incluye los últimos drivers de ATI, Sgminer y diferentes versiones para varios algoritmos, acceso de escritorio remoto y un sistema de monitorización a través de un panel web.

Panel de monitorización de Bamt 1.6, minando x11 con 3 gráficas.

Otra distribución que incluye soporte para 64 bits con versiones para ATI, Nvidia e incluso RaspberryPi (para utilizar con hardware ASIC a través de USB) es PiMP.

jueves, 24 de julio de 2014

Realidad Virtual de cartón con tu smartphone (Parte II)


Hace unas semanas publiqué la entrada Realidad Virtual de cartón con tu smartphone sobre el Google Cardboard, una prueba de concepto de headset de realidad virtual para construir uno mismo con una caja de cartón, un par de lentes, dos imanes y otros componentes.

Tan pronto como fue publicado algunas empresas empezaron a fabricar y vender kits con todos los componentes necesarios. Dodocase fue la primera en anunciar un kit y actualmente está disponible para envíos a España en unas 4 o 6 semanas.

El pasado fin de semana compré un kit disponible en Amazon por unos 20€ (sin pegatina NFC) el cual recibí ayer por la tarde. Aunque no deja de ser un simple cartón, tiene mejor acabado al ser cortado por láser y con los pliegues preparados para un montaje rápido y sencillo. Además, incluye el componente más importante, el par de lentes biconvexas con las medidas necesarias.

Kit Cardboard Google sin NFC.
El montaje del Kit es muy sencillo.


La visión con las lentes del kit es relativamente buena. La imagen se ve muy bien en la parte central, sin embargo alrededor se nota algo difuminado, en especial se notan los textos. Otra aspecto a destacar es que en función de la resolución del móvil se notarán en mayor o menor medida los píxeles.

Las letras en el menú de la demo Cardboard que aparecen en la parte inferior no se ven con claridad. Me imagino que se debe a la calidad de la lente o bien a que la posición del móvil está algo más baja de lo normal.

Menú de la demo Cardboard.
La función de la goma elástica es sujetar el móvil para que no se deslice fuera de las ranuras, pero al inclinar la pantalla para salir al menú el móvil se ha salido en algún momento.

El mejor resultado de sensación en 3D que he visto ha sido con la demo de Windy Day, un corto animado de Spotlight Stories.

Windy Day de Spotlight Stories.


En Google Earth podemos viajar través del globo terráqueo dando la sensación de volar sobre montañas o rascacielos.

Desde el menú de Cardboard también se puede acceder a las fotografías del móvil realizadas con la función de la cámara Photo Sphere.

Foto de la Torre de Hércules con la cámara Photo Sphere de Nexus.
Una demostración similar es la visita guiada al palacio de Versalles, con varias imágenes en 360 grados con el audio de un guía que nos presenta cada una de las salas del palacio.

Chrome Experiments

Desde el navegador de Chrome instalado en el dispositivo móvil se puede acceder a Chrome Experiments, una demostración para visualizar aplicaciones en HTML5. Al acceder a la url en el móvil nos pide aumentar el volumen y girar la pantalla para activar el móvil de visualización para la Cardboard.

Acceso a la url de chrome extensions desde el navegador del dispositivo.
Una vez habilitado aparece un menú con varias opciones que se escogen pulsando con el imán.

Menú de Chrome Experimentes.
Una de las opciones es la demo realizada con Tree.js vista en el vídeo de Google I/O Cardboard. La demo de la montaña rusa virtual me ha gustado bastante, dando la mayor sensación tridimensional completa con movimiento y sonido que varía en función de la proximidad a otros objetos del escenario.

Demo de montaña rusa.
Otras de las opciones del menú son vídeos en 360 grados por Airpano. Se puede ver cualquier parte del vídeo girando la cabeza.

Vídeo de osos en Kamchatka de Airpano.


Demo Treasure Hunt

Para probar la demo de Treasure Hunt con la nueva versión SDK para Android que ya incluye la API Level 20, es necesario cambiar la configuración de Gradle, en CardboardSample/build.gradle, para que no dé un error de compilación
  • Modificar la versión de buildToolsVersion por la última versión de la API Level 19 instalada en el SDK, en mi caso es la 19.1.0:
    buildToolsVersion '19.1.0'

  • Cambiar la última versión disponible para la librería support-v4, indicada con el símbolo más, por la versión 19.1.0:
    compile 'com.android.support:support-v4:19.1.0'
Tras compilar y ejecutar la demo vemos un escenario 3D donde el usuario tiene que buscar un cubo de colores y pulsar el imán cuando lo encuentre para que cambie de posición.

Captura de Treasure Hunt.