Azure Blockchain Service, tu red como servicio

En los últimos artículos hemos visto diferentes tipos de redes de Ethereum. En Remix tienes una red en el propio navegador, en local puedes usar Ganache o truffle develop, también puedes usar redes de pruebas públicas o incluso la red principal de Ethereum, pero para estas últimas es necesario tener ether, para poder pagar por las transacciones que necesiten los smart contracts. Hoy te quiero contar un nuevo servicio, todavía en preview, llamado Azure Blockchain Service, que te permitirá tener tu propia red privada en la nube.

Azure Blockchain Service

El objetivo principal de este servicio es simplificar la implementación de la red, y las operaciones de esta, con el objetivo de que puedas centrarte en el desarrollo de tus smart contracts. Actualmente soporta Quorum, la cual es una plataforma de Blockchain basada en Ethereum, con la que podemos trabajar exactamente igual que veníamos haciendo hasta ahora, con nuestros smart contracts, truffle, etcétera.

Crear tu red en Azure Blockchain Service

Accede al portal de Microsoft Azure y, a través del botón + Create a resource, busca Azure Blockchain Service.

Azure Blockchain Service

Selecciona tu suscripción, crea o elige el grupo de recursos donde quieres alojar el servicio y busca la región donde lo vas a desplegar. En cuanto a los detalles de la red de Blockchain debes elegir lo siguiente:

Cuando se crea un servicio de este tipo lo que realmente estamos creando es un miembro, el cual pertenecerá a un consorcio nuevo o se unirá a uno ya existente. ¿Qué es un consorcio? Pues no es más que una red con diferentes miembros o participantes, los cuales solo pueden pertenecer al mismo si son invitados. Tienes más información aquí. En este ejemplo, como es el primer miembro que creamos, será en un nuevo consorcio, llamado returngis. Selecciona Quorum como protocolo. Todos los miembros deben tener asignado un nombre único dentro de azure. En este caso lo he llamado stark (the North remembers!) y he elegido una contraseña para este.
A día de hoy están soportados dos tipos de plan, donde el Basic está pensado para un entorno de desarrollo y es el que he elegido. Por último, crea una contraseña para el nodo de transacción. Finaliza el asistente para que comience la creación, la cual puede tardar varios minutos.

Despliega tu contrato en Azure Blockchain Service

Ahora que ya tenemos nuestra nueva red, lo primero que vamos a hacer es desplegar el contrato con el que venimos trabajando en los artículos anteriores: TimeControl.sol. Hasta ahora, cuando hemos utilizado Truffle este tiene por defecto configurada como red Ganache, por lo que no tuvimos que hacer ninguna modificación en este sentido. Esta configuración se hace en el archivo truffle-config.js, pero antes de poder conectarnos a la nueva red, necesitamos tener una cuenta dentro de la misma. Para comunicarnos con nuestro nuevo servicio vamos a hacerlo a través de la librería web3. Para evitar errores, debes instalar la siguiente versión del módulo:

npm init -y
npm install [email protected]

Después accede a la consola de truffle:

truffle develop

y conectate al nodo que tenemos. La cadena de conexión puedes obtenerla accediendo a tu nuevo servicio y, en el apartado Transaction Nodes, haz clic sobre el tu único nodo.

En Sample Code copia el contenido de HTTPS (Access key 1):

var Web3 = require("Web3");
var provider = new Web3.providers.HttpProvider("https://YOUR_TRANSACTION_NODE_NAME.blockchain.azure.com:3200/YOUR_ACCESS_KEY_1");
var web3 = new Web3(provider);

Ahora pega esas tres líneas en la consola donde lanzaste truffle develop, para crear una conexión con el nodo. Una vez hecho, utiliza la siguiente línea para crear una cuenta:

web3.eth.personal.newAccount("YOUR_PASSWORD");

Si el comando se ha ejecutado correctamente, te devolverá la dirección de la nueva cuenta.

Crear una nueva cuenta a través de truffle develop y Web3

Para salir puedes utilizar el comando .exit.

Ahora modifica el archivo truffle-config.js con lo siguiente:

const path = require('path'),
  Web3 = require("web3"),
  stark = "https://YOUR_TRANSACTION_NODE_NAME.blockchain.azure.com:3200/YOUR_ACCESS_KEY",
  myAccount = "YOUR_ACCOUNT",
  myPassword = "YOUR_PASSWORD";


module.exports = {
  contracts_build_directory: path.join(__dirname, 'client/src/contracts'),

  networks: {
    azureblockchain: {
      provider: (() => {
        const AzureBlockchainProvider = new Web3.providers.HttpProvider(stark);
        const web3 = new Web3(AzureBlockchainProvider);

        web3.eth.personal.unlockAccount(myAccount, myPassword);

        return AzureBlockchainProvider;

      })(),

      network_id: '*',
      gas: 0,
      gasPrice: 0,
      from: myAccount
    }
  },
  compilers: {
    solc: {
      version: "0.5.4"
    }
  }
};

La cadena de conexión puedes recuperarla accediendo a tu nodo de transacción y haciendo clic en el apartado Connection Strings, donde debes copiar la llamada HTTPS (Access key 1).

Azure Blockchain Service – Transaction Node – Connection Strings – Access key 1

La única modificación que he tenido que hacer en mi código es bajar de la versión 0.5.8 a la 0.5.4, ya que obtenía errores con la versión de Quorum actual. Para ello, simplemente he modificado el valor del compilador en el apartado compilers y he modificado la primera línea del contrato TimeControl.sol.

Modificada la versión de solidity de TimeControl.sol para Azure Blockchain Service

Si has seguido todos los pasos correctamente, ahora puedes desplegar tus contratos con el mismo comando de siempre:

truffle migrate

El resultado debería de ser como el siguiente:

truffle migrate a Azure Blockchain Service

Prueba tu smart contract en Azure Blockchain Service

Ahora vamos a probar nuestro smart contract desplegado en nuestro Blockchain en Azure a través de nuestra aplicación web con Drizzle. Para hacerlo fácil, en el artículo anterior te mostré cómo usar y configurar Metamask con Ganache, así que vamos a reutilizar esos conocimientos para conectarlo esta vez con Azure Blockchain Service.

Haz clic sobre el icono de la extensión de Metamask y en el combo selecciona Custom RPC. En mi caso, el nombre que le he puesto a la red es Azure Blockchain Service y la URL es la misma que obtuviste en el apartado Connection Strings, bajo el nombre HTTPS Access Key 1 de tu nodo de transacción.

Si la conexión ha sido satisfactoria te aparecerá tu nueva red en el combo. Ejecuta ahora tu aplicación y verás que Metamask te notifica de que la web quiere utilizar tu cartera de cuentas. Haz clic en confirmar para continuar.

Tu web pide acceso a tu cartera de cuentas de Metamask

Si tu contrato se ha desplegado correctamente, podrás registrar y visualizar los fichajes registrados en tu red en Azure Blockchain Service. Si intentas generar una transacción Metamask te pedirá confirmación, como vimos en el artículo anterior, con un precio de 0 gas.

Notificación de Metamask – Transacción en Azure Blockchain Service con 0 gas

El código lo tienes en mi GitHub.

¡Saludos!