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="<script>" title="<script>" /> <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="<script>" title="<script>" /> <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="<script>" title="<script>" /> </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
Excelente información, Me gustaría saber si el uso Ethereum y smartcontract me pueden ayudar para mejorar la seguridad en sistemas web?
Buenas noches Carolina, el smart contract podemos decir que es una aplicación (dapps) que se ejecuta en base a unas reglas que se definieron.
No es necesario que nadie la ejecute ya que se ejecuta cuando se cumplen ciertas condiciones.
Sabiendo esto, podrías tener un sistema de registros y / o validaciones que aprovechando las características que ofrece Ethereum te sirva para tener usuarios únicos y legítimos.
No obstante, para la seguridad de un sistema web existen otras técnicas y herramientas que van mas allá de lo que te puede ofrecen Ethereum.
Hola, pero para que sirve todo eso?. que obtienes de información que no haya en la red ?
Hola, pero para que sirve todo eso?
Todo esto sirve para acceder al ecosistema Ethereum desde un entorno web y poder mostrar de una forma mas agradable y sencilla esa información.
que obtienes de información que no haya en la red ?
¿Si te refieres a que información obtengo desde Ethereum que no se pueda consultar desde el propio ecosistema Ethereum?,la respuesta es sencilla, ninguna, ya que la libreria web3.js es una colección de módulos que contienen funcionalidades específicas para el ecosistema Ethereum.
Un saludo