3 – Ethereum, primeros pasos con Solidity y Ethereum JavaScript API

¿Que es Web3.js?

Es una API en Javascript compatible con Ethereum que implementa las especificaciones genericas RPC en formato JSON. Toda la información que se muestra en esta entrada, la puedes encontrar en la siguiente URL:  https://github.com/ethereum/wiki/wiki/JavaScript-API. 

Para que la aplicación funcione en Ethereum se puede usar el objeto web3 proporcionado por la biblioteca web3.js. La librería por dentro se comunica con un nodo local a través de llamadas RPC. Web3.js funciona con cualquier nodo Ethereum que expone una capa RPC.

Web3 contiene el objeto eth (web3.eth) para interacciones específicas de cadena de bloques de Ethereum y el objeto shh (web3.shh) para la interacción de Whisper. Con el tiempo, presentaremos otros objetos para cada uno de los otros protocolos web3.

¡Manos a la obra!

Para empezar vamos a crear un directorio: mkdir ~/BLOCKCHAIN y entramos dentro: cd ~/BLOCKCHAIN. 

Creamos el fichero package.json con el siguiente comando: npm init y una vez terminado el proceso instalamos web3: npm install web3 –save.  Podemos también cualquiera de estos otros métodos:

  • bower: bower install web3
  • meteor: meteor add ethereum:web3
  • vanilla: enlace a dist./web3.min.js

Ahora vamos ir a la siguiente URL: http://remix.ethereum.org/. En esta URL accedemos a Remix (antes se conocía como Browser Solidity), y no es mas que un IDE basado en un navegador WEB que permite escribir contratos inteligentes (smart contracts) de Solidity, para luego poder implementar y ejecutar el smart contract.

Para configurar este IDE con nuestro nodo local debemos configurar el entorno. Seleccionaremos para el entorno (environment) Web3 Provider:

Aquí añado una pequeña explicación de cada entorno:

  • Javascript VM: Todas las transacciones se ejecutaran en el navegador en una blockchain aislado. Esto nos ahorra trabajo si queremos hacer pruebas pero si recargamos el navegador o cerramos se perderá todo.
  • Injected Provider: Remix se conectara a un proveedor web3 inyectado. Mist y Metamask (extensión chrome) son algunos ejemplos de proveedores que inyectan web3.
  • Web3 Provider: Remix se conectara a un nodo remoto. Es necesario que indiques una URL para seleccionar el proveedor: geth, parity o cualquier cliente Ethereum.

Si has leído el resto de las entradas, deberías tener montado un nodo con geth, así que usaremos la opción de web3 provider. Por cierto recuerda cuando accedas a la URL de remix no usar https:// debes usar http://, porque no funcionara con tu nodo local. Una vez seleccionado el web3 provider nos mostrara la siguiente pantalla:

Pulsamos OK y continuamos. Nos pedirá el Endpoint de nuestro web3 provider:

Si todo es correcto, se mostraran en el desplegable de Account el listado de cuentas que tiene tu nodo:

Continuamos haciendo un ejemplo sencillo de smart contract en solidity, vamos a crear el famoso hola mundo  de cualquier otro lenguaje.

pragma solidity ^0.4.0;

contract HelloWorld {
    string saludo = "Hola mundo";
    
    function getSaludo() constant returns(string) {
        return saludo;
    }
    
    function setSaludo(string nuevoSaludo) returns(string) {
        saludo = nuevoSaludo;
        return saludo;
    }
}

Aquí tienes un pequeño vídeo para ver como se comporta y como funciona el IDE Remix con un smart contract muy simple

Para finalizar

Con todo lo anterior ya tenemos la base para empezar a crear smart contracts, ahora veremos como integrarlo en la web con web3.

Ahora vamos a usar la libreria web3.js para poder acceder a Ethereum. Necesitas crear una instancia web3 configurando un proveedor. Para asegurarse de no sobrescribir el proveedor ya configurado cuando está en mist, verifica primero si el web3 está disponible.

Después de esto puedes usar la API del objeto web3. La librería web3.js es una colección de módulos y cada uno contiene una funcionalidad para el ecosistema Ethereum.

  • web3-eth: Blockchain Ethereum y Smart Contracts.
  • web3-shh: Protocolo whisper, protocolo de comunicación entre dapps P2P y broadcast.
  • web3-bzz: Protocolo swarm, protocolo para almacenamiento descentralizado
  • web3-utils: contiene funciones de ayuda útiles para los desarrolladores de Dapp.

Ejemplo básico:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20type%3D%22text%2Fjavascript%22%20src%3D%22.%2Fbignumber.js%2Fbignumber.min.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
    <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20type%3D%22text%2Fjavascript%22%20src%3D%22.%2Fweb3%2Fdist%2Fweb3-light.js%22%3E%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
    <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%20type%3D%22text%2Fjavascript%22%3E%0A%20%20%20%20%20%20%20%20debugger%3B%0A%20%20%20%20%20%20%20%20if%20(typeof%20web3%20!%3D%3D%20'undefined')%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20web3%20%3D%20new%20Web3(web3.currentProvider)%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20set%20the%20provider%20you%20want%20from%20Web3.providers%0A%20%20%20%20%20%20%20%20%20%20%20%20web3%20%3D%20new%20Web3(new%20Web3.providers.HttpProvider(%22http%3A%2F%2Fip%3A8545%22))%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20console.log(web3)%3B%0A%20%20%20%20%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />
</head>
<body>

</body>

</html>

Con todo lo anterior ya puedes iniciar y entender como funciona blockchain, un smart contract y como implementar todo eso en una web. En próximas entradas entraremos en profundidad sobre smart contract y web3.js