Sobre la Física – Parte 1

La filosofía de la ciencia. ¿Qué es la realidad? ¿Qué es la física? Es algo que me apasiona. Como es un tema denso serán escritos cortos.

¿Qué es la física? No es algo sencillo. Realmente no hay una respuesta universal. ¿Qué es la naturaleza, qué es la realidad? No son preguntas fáciles. La mayoría de la gente hoy día es empirista, de un grado u otro, una posición correcta, pero no es la única válida. Platón, aún cuando ha pasado mucho tiempo, sigue teniendo una teoría válida para explicar la realidad, alejada totalmente del empirismo. Y el empirismo radical conlleva al escepticismo como avisaba Kant. No poder estar seguros de nada, ¡terminamos en un punto peor que el de partida! Tenemos que asumir que la naturaleza es uniforme en sus comportamientos, pero eso es algo que nunca podrá ser demostrado. Dudas, dudas.

Ajedrezado

¿Y las matemáticas? ¿Fueron descubiertas o fueron inventadas? Ahora mi opinión. La física no es la realidad. La física es un modelo matemático, muy preciso, pero alejado de lo real. “El Universo se puede expresar en una ecuación” es falso. La física no es más que una interpretación humana usando matemáticas. La física entonces no es más que una invención humana, no nos dice porque la realidad es tal como es. Dudas, dudas.

Lo más triste de todo es que hay gente que cree en la ciencia como un dogma, ajena a cualquier objeción. Pasamos del dogma bíblico al dogma de “El Método Científico”. Salimos de una cueva y entramos en otra. Muy poca gente, muy pocos científicos pueden estar realmente fuera de la caverna. Dudas, dudas.

Y en estos temas la gente obvia el asunto de Dios. Asunto para nada cerrado. No como un Dios personalista, que juzga a la gente, pero ¿y como un estado ideal de perfección? Pero antes tenemos que definir la perfección. ¿O es Dios acaso otra cosa? Dudas, dudas.

¿Qué opináis? Me encantará oír vuestras opiniones al respecto y por supuesto, sois libres de criticarme. Intentaré desarrollar cada punto por separado, porque es extenso, de momento dejamos el asunto planteado.

loading...

Análisis de The Witness

Recientemente me he pasado el juego de puzzles The Witness, la última obra de Jonathan Blow. Me lo había recomendado un buen amigo y al poco me enganché. Voy a hacer un spoiler mínimo, lo justo para que os quedeis con los dientes largos.

Nota musical:

Si te has pasado el juego al 100% lo entenderás

The Witness se inicia de manera enigmática para el jugador acostumbrado a la jugabilidad Nintendo. Con jugabilidad Nintendo me refiero a la típica de juegos como Mario Party donde antes de cada juego se explican las instrucciones por escrito y se puede incluso practicar. La propia pantalla de carga produce intriga al jugador.

TheWitnessLoad

Aparecemos en un pasillo, en una isla, al principio solo podemos avanzar hacia delante. El juego nos indica que podemos usar las teclas WASD para movernos y que usemos el ratón. Es la única ayuda que nos dará.

TheWitness

Para avanzar tendremos que resolver puzzles. Todos los puzzles poseen la misma estructura, empezamos por un círculo gordo y tenemos que dibujar una ruta por la cuadrícula hasta el final, una línea que se sale de la cuadrícula. Pero no vale con llegar, tendremos que cumplir las condiciones que los símbolos geométricos y el entorno nos impongan. Al principio estos símbolos no aparecen pero según vayamos avanzando, empezaran a aparecer hexágonos, cuadrados amarillos, cuadrados azules, cuadrados blancos, estrellas rosas, triángulos y el entorno también influirá en la resolución del puzzle.

Una vez atravesamos la primera parte, se nos deja sueltos en la isla y entonces podemos hablar de un auténtico sandbox de puzzles.

TheWitnessApple

El significado de cada símbolo, de porque un puzzle se resuelve de esta manera y no de otra es algo que queda para nosotros. Tenemos que resolver los puzzles, pero además tenemos que saber qué nos pide el puzzle. Y muchas veces creemos haber llegado a una conclusión que es incorrecta, y tenemos que replantearnos todo lo anterior. Muy bien pensado. Cuando ya sepamos el significado de los símbolos y como influye el entorno en el puzzle el reto ya no será descifrar su significado, sino resolverlo, puesto que serán más complejos. Un trabajo de científicos…

El vídeo es un desbloqueable que encontramos en el juego si somos avispados, ya que las piezas del gran puzzle que es encontrar los vídeos se encuentran desperdigadas por la isla. En este fragmento vemos a James Burke al final de la serie Connections de la BBC (1978). The Witness está plagado de filosofía empirista por todas partes. Además de estos vídeos (que hay 6) nos encontramos con 43 audios con frases, explicaciones y pensamientos de Albert Einstein, William Faulkner, Feynman y gente relacionada con la filosofía de la ciencia y otros personajes de la filosofía zen moderna, como Gangaji y David Golding. Algunos audios son más estimulantes que otros, algunos te hacen pensar y otros son un poco rollo. Lo cierto es que crea una atmósfera que mezcla elementos zen y el empirismo.

El zen es tan importante que en un determinado momento nos preguntaremos si todo esto es un kōan, es decir un problema que el maestro plantea al alumno para comprobar sus progresos, muchas veces un problema absurdo que para ser resuelto el alumno debe desligarse del pensamiento racional común para así entrar en un sentido racional más elevado y así aumentar su nivel de conciencia para intuir lo que en realidad le está preguntando el maestro, que trasciende al sentido literal de las palabras. Una explosión mental en toda regla que nos acerca, en esos momentos de explosión al contacto más directo con la realidad, sin pasar por el pensamiento, pues este ha sido destrozado.

Sin embargo toda esta filosofía que planté a el juego no acaba bien, por lo menos desde mi punto de vista. El juego parece que según vas avanzando llegarás a una conclusión final, que te hará replantearte tu vida. Esto no ocurre. Quizá sea un reflejo de la vida. Creemos que tiene algún sentido, que algún día comprenderemos. Pero al final solo hemos dado unas pinceladas aquí y haya, pero seguimos sin tener “eso”. “Eso” que acabaría con “aquello”. Así que el final no es malo, pero quizá cuando lo veas por primera vez, después de haber estado jugando te sepa a poco. Es lógico. Pero tras un razonamiento, haciendo analogías con la vida, no me parece un final tan malo.

El apartado estético es alucinante, cada vez que lo pienso más me asombra. No es especialmente realista, podríamos llamarlo impresionista, con formas toscas, esquinas gigantes pero una iluminación y un colorido espectacular. Aparte de la belleza de por sí de la naturaleza y los edificios tenemos juegos de sombras:

TheWitnessMalabarista

En este caso por ejemplo, vemos la estatua de un pobre hombre, parece que gritando al cielo, una gran desgracia la ha acontecido. Pero su sombra, que combina con las piedras del suelo nos deja otra imagen, se encuentra haciendo malabares, un símbolo de felicidad. No todo es lo que parece.

TheWitnessGranEstatua

 

En esta imagen vemos la estatua una mujer tallada en la montaña. Tiene un porte de grandeza, se va a comer el mundo, es fuerte y mira al cielo, aspirando a lo más alto.

TheWitnessEstatuaAyuda

En cambio, desde el punto de vista correcto, la situación cambia por completo, la mujer está siendo ayudada por otra, parece que va a morir, que las cosas le van mal y la otra mujer, por encima de ella la intenta subir a donde está ella, un lugar mucho más estable.

TheWitnessPuzzleAmbiental

 

Y dejamos lo mejor para el final, los puzzles ambientales. Se trata de puzzles que aparecen en la naturaleza. En la imagen vemos uno muy sencillo, el del río, que además cuenta con panel explicativo. Cuando veamos uno de ellos simplemente nos dirigimos al punto gordo y vamos hasta el final. Veremos estrellitas resplandecer y si finalizamos la ruta se hará un gran estruendo. Hay muchísimos. Y muchos donde no te los esperas. Por haber hay hasta uno dentro de una película del cine, que, os adelanto, dura una hora el recorrido que tenemos que hacer.

TheWitnessEnvironmentalPuzzle

¡Están por todas partes!

TheWitnessCastleBefore

TheWitnessCastleAfter

Mi recomendación final es que un juego magnífico, llegar al final estándar no es muy difícil, pero el jugador que le entre el gusanillo puede aspirar a conseguir todos los vídeos, entrar al nivel de la cueva y desvelar el final secreto.

Comprar en eBay Comprar en Amazon Comprar en Steam

Enebro, un robot automático para FOREX en JavaScript

Hoy en día el mundo de la bolsa y el trading está dominado por robots. Más del 70% de las transacciones que procesa Wall Street han sido generadas por algoritmos que funcionan ininterrumpidamente.

Probablemente tú también querrás usar robots. Hay soluciones para pequeños inversores como MetaTrader, pero voy a tratar de construir un bot de bolsa desde 0 en JavaScript. ¿Suena divertido?

forex

PyAlgoTrading

El diseño de mi robot, Enebro, va a estar basado en PyAlgoTrade. Los componentes principales de PyAlgoTrade son 6:

  • Estrategias – Definen cuando comprar y cuando vender
  • Entradas (o feeds) – Proveen datos. Pueden ser tantos datos financieros como datos provienientes de portales de noticias o Twitter.
  • Brokers – Se encargan de ejecutar las órdenes
  • DataSeries – Una abstracción usada para manejar los datos en su conjunto
  • Indicadores técnicos – Realiza los cálculos de los indicadores técnicos usando datos de DataSeries.
  • Optimizador – Cuando se realiza backtesting (probar la estrategia con datos pasados) este módulo permite realizarse en menos tiempo, distribuyendo el trabajo entre distintos ordenadores. Este módulo no lo voy a implementar en Enebro.

Vamos a trabajar ya en el programa, que operará el par EURUSD. El programa es meramente educativo y no está tan bien programado como debería pero servirá para entender algún concepto.

Programando: Entradas o feeds

Lo primero que vamos a implementar son la entrada de los datos. Voy a implementar dos formas de obtener la información, una es leer los datos desd e un fichero CSV. Esto servirá para realizar backtesting. Además voy a añadir la entrada de datos de Uphold, para obtener los datos en tiempo real

"use strict";
var csv = require("csv");
var fs = require("fs");
var Bar = require("./strategy").Bar;

class Feed{
        constructor(instruments){
                this.instruments = instruments;
        }
}

class UpholdFeed extends Feed{
        constructor(instruments){
                super(instruments);
                this.Uphold = require("uphold-sdk-node")({
                        "key" : CLIENT_ID,
                        "secret" : CLIENT_SECRET,
                        "scope" : SCOPE,
                        "pat" : TOKEN
                });
        }
        run(cb){
                var self = this;
                setInterval(function(){
                        self.Uphold.tickers(function(err,tickers){
                			var date = new Date();
                			var isodate = date.toISOString();
                			var ask = tickers[12].ask;
                			var bid = tickers[12].bid;
                			var media = (ask+bid)/2;
                			console.log("EURUSD: "+ask+"-"+bid);
                            var bar = new Bar(media,media,media,media);
                            var bars = {};
                            bars[self.instruments] = bar;
                            cb(bars);
                        });
                },1000*60);
        }
}

class CSVFeed extends Feed{
        constructor(instruments,file){
                super(instruments);
                this.file = file;
        }
        run(cb){
                var reader = fs.createReadStream(this.file);
                var parser = csv.parse({
                        delimiter: ";"
                });
                var data = "";
                var self = this;
                parser.on("readable",function(){
                        while(data = parser.read()){
                                // Run onBars;
                                var bar = new Bar(data[1],data[4],data[2],data[3]);
                                var bars = {};
                                bars[self.instruments] = bar;
                                cb(bars);
                        }
                });
                reader.on("data",function(chunk){
                        parser.write(chunk);
                })
        }
}

module.exports = {CSVFeed: CSVFeed, UpholdFeed: UpholdFeed};

Veamos como funciona. Definimos una estrctura básica de Feed. Cada Feed hace referencia a un instrumento, en nuestro caso el instrumento es “EURUSD”. Un feed necesita una función run() que será llamada una vez cuando tenga que funcionar el robot. A partir de ese momento el Feed asume la responsabilidad de proveer de datos al robot llamando siempre que haya nuevas barras (velas japonesas) a la función de callback cb(). En el caso de CSVFeed, la llamada a cb() se produce cada vez que se ha procesado una línea del fichero. En el caso de UpholdFeed, se envía una nueva barra cada minuto. En el caso de CSVFeed se pide un fichero en el constructor que se procesa con la librería csv y en el caso de Uphold, se usa la API para obtener los precios.

En esta primera parte hemos visto como usamos un objeto Bar que todavía no he enseñado, no es muy difícil.

class Bar{
        constructor(open,close,high,low){
                this.open = open;
                this.close = close;
                this.high = high;
                this.low = low;
        }
        getPrice(){
                return this.close;
        }
}

El bróker

Necesitamos un bróker, que se encargará de realizar las operaciones. Para realizar backtesting es necesario disponer de un bróker simulado, lo he llamando EnebroBroker. Soporta solo la operación de entrar en largo y salir de mercado.

class EnebroBroker{
        constructor(capital){
                this.capital = capital;
                this.register = {};
                this.benefit = 0;
        }
        enterLong(instrument,price){
                if(!this.register[instrument])
                        this.register[instrument] = [];
                this.register[instrument].push({
                        shares: Math.floor(this.capital/price),
                        price: price
                });
                this.strategy.open = true;
                this.strategy.onEnterOK();
        }
         exitMarket(instrument,price){
                var last = this.register[instrument].pop();
                var diff = price - last.price;
                var total = diff * last.shares;
                this.benefit += total;
                this.strategy.open = false;
                this.strategy.onExitOK();
                console.log("Operation Closed: "+total);
                console.log("Benefit: "+this.benefit);
        }
}

Básicamente, se le añade un capital al iniciarse y usa TODO el capital en realizar la operación. La estrategia si queremos diversificar con Enebro es tener muchos brokers con una estrategia asignada a cada uno. Para realizar la compra especificamos el instrumento y el precio actual, para salir igual. Se nor informará en la pantalla del beneficio por la operación y del beneficio acumulado.

La estrategia

Veamos una estrategia sencilla usando la media móvil simple de 15.

class Strategy{
        constructor(feed,instrument,broker){
                this.setup();
                this.sma = new SMA(15);
                this.feed = feed;
                this.instrument = instrument;
                this.broker = broker;
                this.open = false;
                this.broker.strategy = this;
        }
        onBars(bars){
        
        }
        run(){
                var self = this;
                this.feed.run(function(bars){
                        self.onBars(bars);
                });
        }
        isOpen(){
                return this.open;
        }
}
class MMS extends Strategy{
        constructor(feed,instrument,broker){
                super(feed,instrument,broker);
        }
        onBars(bars){
                var bar = bars[this.instrument];
                this.sma.add(this.instrument,bar);
                if(!this.isOpen()){
                        // Buy
                        if(bar.getPrice() < this.sma.get(this.instrument)){
                                this.broker.enterLong(this.instrument,bar.getPr$
                        }
                }else{
                        // Sell
                        if(bar.getPrice() > this.sma.get(this.instrument)){
                                this.broker.exitMarket(this.instrument,bar.getP$
                        }
                }
        }
}

Esta estrategia está basada en la media móvil simple, únicamente en eso. El feed provee de datos a la estrategia en la función onBars. Se actualiza el único indicador, la media móvil simple, SMA. Cuando se cumple la condición de compra y no hay operaciones abiertas, se entra en largos. Cuando hay operaciones abiertas y hay condición de venta, se vende. Cuando creamos la estrategia y la ejecutamos con run() tenemos que especificar el feed, el instrumento y el bróker.

Los indicadores: SMA

Hemos usado el indicador de la media móvil simple. ¿Cómo lo hemos definido?

class SMA{
        constructor(period){
                this.period = period;
                this.sma = {};
        }
        add(instrument,bar){
                if(!this.sma[instrument])
                        this.sma[instrument] = [];
                this.sma[instrument].push(bar);
        }
        get(instrument){
                if(this.sma[instrument].length < this.period +1)
                        return 0;
                var suma = 0;
                for(var i=this.sma[instrument].length - this.period;i<this.sma[$
                        suma += parseFloat(this.sma[instrument][i].getPrice());
                                        }
                return suma/this.period;
        }
}

Simplemente almacena los datos y los usa para realizar la media cuando sea necesario.

Juntándolo todo

Ahora juntamos todo en el archivo index.js

var CSVFeed = require("./feed").CSVFeed;
var UpholdFeed = require("./feed").UpholdFeed;
var MMS = require("./strategy").MMS;
var EnebroBroker = require("./strategy").EnebroBroker;
var UpholdBroker = require("./strategy").UpholdBroker;

var feed = new CSVFeed("EURUSD","DAT_ASCII_EURUSD_M1_201602.csv");
//var feed = new UpholdFeed("EURUSD");

//var broker = new UpholdBroker(8.69);
var broker = new EnebroBroker(100);

var strategy = new MMS(feed,"EURUSD",broker);
strategy.run();

Conclusión

Espero que esta entrada al menos os sirva de inspiración para diseñar vuestro propio sistema de trading automático. Enebro es un simple experimento, pero si quereis aportar información, sugerir algo o preguntar, simplemente escribid en los comentarios.

Yo tengo mi propia versión de Enebro operativa, si alguien la quisiera, puede contactar conmigo. Además el plugin de bróker de Uphold, necesario para realizar las operaciones reales de FOREX también está disponible para quien lo quiera.

Mapas interactivos en HTML5 con SnapSVG

HTML5 ha llegado aquí y está para quedarse y puede usarse en prácticamente cualquier sitio. Además según la encuesta del blog HTML5 era uno de los temas en los que estabais más interesados. Hoy vamos a ver como se puede hacer un mapa interactivo fácilmente, compatible con PCs, tabletas y móviles y veremos como los podemos animar.

Haz click en la provincia de Valladolid múltiples veces

SnapSVG

Aquí entra en juego SnapSVG. Se trata de una librería para JavaScript financiada y acogida por Adobe. Es una mejora de la ya popular librería para tratar SVG conocida como RaphaëlJS (ambas librerías son del mismo autor). Sin embargo, SnapSVG aporta muchas mejoras respecto a RaphaëlJS. La fundamental es que SnapSVG permite cargar archivos SVG ya existentes.

snapsvg

Mapas en SVG

Actualmente es fácil encontrar mapas en SVG de cualquier territorio. Sin embargo para que sea fácil trabajar con ellos hay que procurar que estén preparados para interactuar con ellos. Es necesario que las etiquetas <path> posean un atributo id y sea fácilmente reconocible. En el caso del mapa de España que hay al principio, el mapa está muy bien organizado. Las provincias empiezan por pr, los enclaves por en y las islas por is. Así que Valladolid es pr_valladolid y Menorca es is_menorca. Encontrar mapas así ya puede ser más difícil pero no imposible.

Primeros pasos

En nuestro HTML creamos una etiqueta <svg> con un id, por ejemplo id=papel. Ya está. Ahora pasamos al JavaScript.

Primero necesitamos obtener un papel (Paper en la documentación), con la función Snap y un selector CSS obtenemos el papel que ya hemos creado.

var s = Snap("#papel");

Ahora ya podemos usar todo el poder de SnapSVG, pero si queremos trabajar con un SVG ya existente el procedimiento es un poco distinto.

var s = Snap("#papel"); // Obtenemos el papel
Snap.load("/mapa.svg",function(f){
	// Al cargar el mapa se nos devuelve un fragmento
    // los fragmentos contienen elementos de SVG
    // Como queremos añadir todos los elementos, los seleccionamos todos, como un único grupo
    // otra vez vemos los selectores CSS en acción
    var g = f.selectAll("*");
    // y ahora añadimos el grupo al papel
    s.append(g);
    
    // cuando querramos acceder a un elemento podemos usar un selector CSS
    var valladolid = s.select("#pr_valladolid");
});

Atributos

Podemos alterar los atributos de estilo de SVG. Para quién no los conozca, funcionan igual que las propiedades CSS pero se aplican de manera distinta. Con SnapSVG podemos cambiar esos atributos en tiempo de ejecución. Por ejemplo, el relleno (propiedad fill).

s.attr({
	fill: "red"
});
// Cambia el relleno a rojo, afecta a los elementos inferiores, en este caso como es el papel, afecta a todo el SVG.

Figuras simples

Podemos añadir figuras simples de manera muy sencilla

var rect = s.rect(0,0,100,20).attr({fill: "cyan"});
// Creamos un rectángulo de 100x20 en la posición (0,0) con relleno cyan.
// Luego lo podemos borrar
rect.remove();

Eventos y animaciones

Ahora viene la parte interesante, eventos y animaciones. SnapSVG soporta varios tipos de evento en cada elemento. Veamos el click simple aunque existe doble click, ratón por encima, táctil (aunque click funciona en pantallas táctiles).

var murcia = s.select("#pr_murcia");
murcia.click(function(){
	murcia.attr({
    	fill: "yellow"
    });
});

Podemos animar los elementos especificando las propiedades que cambian y su tiempo

murcia.animate({fill: "purple"},1000);

SnapSVG es muy potente y permite realizar muchas más operaciones, como elementos arrastrables, grupos, patrones, filtros y más. El objetivo, según Adobe, es ser el jQuery de los documentos SVG.

snapsvg-game

Escalar imagen automáticamente

viewBox

SVG es un formato vectorial así que podemos aumentar el tamaño sin tener que preocuparnos por los píxeles. Sin embargo si simplemente cambias el tamaño del elemento <svg> vía CSS verás que no funciona. Es necesario especificar un atributo viewBox y mantenerlo constante. Básicamente viewBox da las dimensiones reales del lienzo donde se dibuja el SVG. Si cambian width y height y viewBox también entonces la imagen no se escala, simplemente se amplía el área del lienzo. Algunos mapas en SVG no ofrecen viewBox. En ese caso espeficicamos como viewBox el tamaño original del fichero SVG. En el caso de querer ocupar toda la pantalla.

s.attr({ viewBox: "0 0 800 600",width: window.innerWidth, height: window.innerHeight});
window.addEventListener("resize",function(){
	s.attr({ viewBox: "0 0 800 600",width: window.innerWidth, height: window.innerHeight});
});

Cordova y Android

SnapSVG se puede usar en Apache Cordova. Sin embargo yo he tenido problemas de rendimiento con la configuración por defecto en Android. Para solventar este problema he tenido que:

Solo así conseguí un rendimiento decente dentro de Cordova.

Ethereum y SmartContracts

En estos últimos años han surgido toda una marea tecnológica siguiendo los principios de la cadena de bloques (blockchain en inglés) popularizada por Bitcoin. En un principio se extendieron las criptodivisas usando esta tecnología, las llamadas altcoins. Algunas se han vuelto muy famosas como Litecoin, Dogecoin, Ripple, Feathercoin, StartCoin, ReddCoin, Dash o incluso un intento de criptodivisa española, la PesetaCoin.

Si revisamos la lista de criptodivisas por capitalización de mercado en CoinMarketCap.com veremos que en el puesto número aparece una que no he mencionado, se trata de Ethereum. Pero no adelantemos acontecimientos.

CoinMarketCap

Hemos dicho que la tecnología de la cadena de bloques se ha usado para diseñar criptodivisas. Sin embergo, recientemente ha aparecido una nueva aplicación de esta tecnología. Los contratos inteligentes (o Smart Contracts).

¿Qué son los contratos inteligentes?

Podemos definir los contratos inteligentes como un tipo de aplicación informática que se encargan de ejecutar una cierta acción si se cumple la condición especificada. Podemos pensar en ellos como un contrato con cláusulas específicas según la casuística. Los contratos inteligentes además serían fácilmente verificables y a su vez seguros. La idea es que dadas unas condiciones, se ejecuten las acciones especificadas, sin ninguna excepción. El concepto de los contratos inteligentes surgió de manos de Nick Szabo en la década de los noventa. Y ahora ya tenemos la primera implementación de aquellas ideas en Ethereum. Un ejemplo muy sencillo de contrato inteligente es una apuesta con un amigo en un partido de fútbol, cada uno apuesta por un equipo y deposita el dinero en el contrato. Cuando el partido haya finalizado el contrato ejecutará la cláusula correspondiente y enviará al dinero al afortunado.

¿Qué es Ethereum?

Si piensas en el Bitcoin como una hoja de cálculo global, piensa en Ethereum como un sistema operativo global

EthereumFrontier

Ethereum es una implementación de los smart contracts basada en la cadena de bloques. Es descentralizado, como Bitcoin. Los aplicaciones (los contratos inteligentes) en Ethereum se ejecutan sin nisiquiera la posibilidad de caída de la red, censura, fraude o intervención de terceras partes. Los contratos inteligentes simplemente se ejecutan, es imposible que no se ejecuten. Esa es la gran ventaja de Ethereum respecto al Internet como lo conocíamos antes.

Las aplicaciones en Ethereum se suben a la cadena de bloques y se ejecutan bajo demanda, con una potencia no muy elevada (piensa en un smartphone de 1999) pero con una cantidad de memoria y una capacidad de almacenamiento permanente ilimitados. Eso no significa que cualquiera pueda hacer lo que quiera con un programa, pues los contratos pueden estar diseñados para ignorar las peticiones hechas desde usuarios desconocidos. En último término, el objetivo de Ethereum es proveer una computación 100% determinista.

EthereumLogo

¿Cómo funciona?

Usar Ethereum no es gratis, el sistema operativo global necesita combustible. Ese combustible es Ether, aunque en muchos sitios se le llama directamente Ethereum por estar ligado a la plataforma. Ether es una criptodivisa al estilo Bitcoin, pero se puede gastar directamente en ejecutar contratos inteligentes en Ethereum. Al igual que en Bitcoin, en Ethereum hay mineros, que ejecutan los contratos para comprobar que todos obtienen el mismo resultado. Esos mineros reciben su recompensa en Ether que pueden usar o vender en sitios como ShapeShift.

Además necesitaremos un cliente para subir y pedir la ejecución de los contratos inteligentes. Hay muchos, voy a hablar de los cuatro más importantes.:

  • Eth: el cliente en C++
  • Geth: el cliente en Go (recomendado)
  • Web3.js: una unión entre el navegador y Ethereum usando la interfaz RPC de otro cliente Ethereum
  • Mist: se trata de un navegador basado en Electrum (o sea, Chromium) que integra las funciones de Ethereum. Podemos interactuar con las DApps directamente si usamos este navegador. Veremos que son las DApps más adelante.

Desde Geth podemos sincronizarnos con la red Ethereum, minar para ganar Ether, ejecutar contratos en la red y subirlos.

Podemos ver como se ejecuta un contrato inteligente en acción en EtherDice, un simple juego de apuestas con dado.

eth.sendTransaction({from: eth.accounts[0], value: web3.toWei(1, 'ether'), to: '0x2faa316fc4624ec39adc2ef7b5301124cfb68777', gas: 500000}) 

Esta orden se introduce dentro de Geth. Básicamente está realizando un traspaso de fondos desde nuestra cuenta principal (eth.accounts[0], aunque se puede especificar otra si nos sabemos la dirección), el valor de la transacción que es la cantidad de Ether a traspasar. Ether tiene muchos submúltiplos, en este caso usa el Wei. 1 ether = 1000000000000000000 wei. Se especifica la dirección de destino y además el máximo de gas que estaríamos dispuesto a perder en la ejecución (no es posible cuanto va a costar una ejecución). Este valor máximo es el producto del gas por el precio del gas y representa el tope de weis que puede consumir el contrato antes de que se cancele. Con contratos muy probados valdría cualquier valor, pero si estás desarrollando un contrato de vendrá muy bien para que una programación errónea no liquide todos tus fondos antes de tiempo.

Bien, este ejemplo es muy sencillo. De manera más genérica usaríamos la función eth.contract

var greeter = eth.contract(ABI).at(Direccion); 
greeter.greet(VALORES DE INPUT,{from: TuDireccion, gas: 50000}); 

Siendo la ABI la definición de la interfaz para poder interactuar con el contrato y la dirección es donde reside el contrato en sí. Luego llamamos a la función greet dentro del contrato, puede aceptar parámetros de entrada. Todo esto esta muy bien pero no hemos visto como son realmente los contratos todavía. Un ejemplo muy bueno es Etheria

Etheria

Solidity y la máquina virtual

Los contratos se ejecutan en una máquina virtual llamada EVM (Ethereum Virtual Machine). Esta máquina virtual es Turing completa pero para evitar un colapso (bucles infinitos) tiene en cuenta el gas. Las operaciones en la EVM son lentas, porque cada contrato es ejecutado simultaneamente en el resto de nodos de la red, siendo el resultado final un resultado de consenso de la red. Se han diseñado varios lenguajes que compilan a EVM, pero sin duda el más popular es Solidity.

contract mortal {
    /* Define variable owner of the type address*/
    address owner;

    /* this function is executed at initialization and sets the owner of the contract */
    function mortal() { owner = msg.sender; }

    /* Function to recover the funds on the contract */
    function kill() { if (msg.sender == owner) suicide(owner); }
}

contract greeter is mortal {
    /* define variable greeting of the type string */
    string greeting;

    /* this runs when the contract is executed */
    function greeter(string _greeting) public {
        greeting = _greeting;
    }

    /* main function */
    function greet() constant returns (string) {
        return greeting;
    }
}

Este sería un ejemplo de Greeter en Solidity. No voy a explicar la programación en Solidity, ni como se inician los contratos. Si hay demanda popular explicaré como se suben los programas y se inicializan.

DApps

Decentralized Apps, con la tecnología de Ethereum ha surgido un nuevo concepto. Aplicaciones web que se separan del concepto tradicional de cliente-servidor y se ejecutan de manera descentralizada. Estas aplicaciones, aunque siguen necesitando Internet pueden funcionar sin un servidor central si nuestro ordenador dispone de un nodo de Ethereum. Esto es precisamente lo que hace el navegador Mist. Otro aprovechamiento más tradicional de las DApps es dejar un servidor central que corra como nodo de Ethereum y tenga una IP asignada. Sin embargo este servidor central puede ser muy ligero, pues solo sirve de puerta de entrada a la red Ethereum. Este aprovechamiento funcionaría en navegadores tradicionales siempre que los gastos de la red corran a cuenta del administrador de la app. Un ejemplo de DApp que requiere usar el navegador Mist es EthereumWall, la aplicación usa nuestros fondos para su funcionamiento y aunque tiene un servidor central estático para entregar los archivos HTML y el JavaScript, esto no sería necesario pues la lógica la hace la red Ethereum con nuestro nodo local en Mist.

Mist

Conclusión

¿Qué os parecen los contratos inteligentes? ¿Qué os parece la plataforma Ethereum? ¿Tendrá futuro o es una moda pasajera? ¿Crees que puede revolucionar la manera de pensar la web? Comenta, quiero saber tu opinión.

Para más información no dudes en consultar el sitio oficial de Ethereum y el libro oficial

Si crees que lo merece puedes enviarme: BTC(1A2j8CwiFEhQ4Uycsjhr3gQPbJxFk1LRmM), LTC(LXkefu8xYwyD7CcxWRfwHhSRTdk6Sp38Kt), DOGE(D7fvbHocEGS7PeexBV23ktWjgVL1y9RnoK), ReddCoin(RsHAsr6PVs8y4f5pGLS2cApcGpgw15TwUJ)