WebAssembly para ejecutar blockchain usando Go

Blockchain es una tecnología con innumerables aplicaciones y un gran potencial que aún no se aprovecha en su totalidad. Es una lista ordenada de bloques que son encadenado juntos, de ahí el nombre de blockchain. Una característica crucial que posee es que los bloques de la cadena de bloques se agregan a través del consenso de los nodos que construyen esa cadena. En cuanto al hecho de que estos bloques se crean principalmente para almacenar información, de esa manera puede verse como una base de datos distribuida que es ejecutada por un enjambre de nodos en los que se proporcionan algoritmos de consenso para este enjambre. Con el fin de permitir agregar bloques como entradas a esa base de datos de una manera segura y no repudiable, de modo que se garantice que estas entradas sean válidas sin la necesidad de que una autoridad central lo imponga. Un método para lograr este consenso es proporcionar Prueba de trabajo (PoW) ya que requiere que los nodos se sometan a un cálculo exhaustivo en el que solo un nodo no debería poder terminar. Más detalles sobre blockchain y su implementación se presentan más adelante en la parte 2 de este artículo.

Golang

Golang (Go) aparece como un lenguaje de programación candidato digno, adecuado para ejecutar una cadena de bloques en nodos implementados en una aplicación descentralizada (DApp). Sus métricas de rendimiento son comparables a las de lenguajes de alto rendimiento como C, C++ y Rust, pero al ser fácil de aprender y usar sin sacrificar el rendimiento, Go los supera (al menos para este artículo).

ensamblaje web

Para ejecutar esta DApp escrita en Go, debe compilarla como una aplicación de consola. Pero este hubiera sido el caso si no tuviéramos webassembly (afortunadamente lo tenemos). Webassembly es un objetivo de compilación para este código que nos permite ejecutar la DApp en un navegador web y sentirnos naturales al interactuar con él.

En este articulo

Este artículo lo guía a través del código para una DApp de cadena de bloques que se ejecuta en websocket. Aquí se muestra cómo utilizar las operaciones de cadena de bloques subyacentes con javascript para presentarlas en una página web. En la parte 2, analizamos la implementación de la propia cadena de bloques.

Estructura del programa

El programa está estructurado de acuerdo con la siguiente figura.

  • web: componentes de la interfaz de usuario y devoluciones de llamadas de eventos proporcionadas para el usuario.
  • monedero: Abstracción de las operaciones de blockchain a operaciones muy básicas de compra y recompensa.
  • Blockchain: Las operaciones de Blockchain implementadas aquí, vale la pena señalar que la billetera pertenece a Go Package Blockhain.
  • chainfabric: La red subyacente que une los nodos durante la operación minera.

Programa-estructura-blockchain-go-wasm.png

Escenario de caso de uso

  • Hay dos usuarios Alice y Bob, cada uno hace lo siguiente:
  • Supongamos que Alice abre el navegador web y navega hasta la aplicación.
  • Primero se identifica eligiendo “Alice” de un menú desplegable.
  • Está viendo una ventana en la que puede realizar operaciones con moneda, llamemos a esta unidad moneda crypsys.
  • Entonces ella hace clic Reward lo que lleva a su saldo a sumar 10 crypsys más.
  • Una vez que tiene suficiente cantidad de crypsys, decide comprarle manzanas a Bob.
  • La cadena de bloques se muestra como una secuencia de bloques en el navegador web.
  • Cada operación de recompensa/compra realizada activa la cadena de bloques para que se actualice y se vuelva a mostrar en el navegador web.
  • Por otro lado, Bob está siguiendo pasos similares a los de Alice y comparte la misma vista de blockchain que ella está viendo.

Caso de uso-blockchain-go-wasm.png

índice.html

En cuanto a que el proceso se ejecute en un navegador, requiere un archivo index.html desde el que se inicia la aplicación.

encuentra el código aquí

El encabezado del archivo de índice incluye los dos primeros scripts consecutivos que son esenciales para ejecutar el programa Go como un recurso de ensamblaje web en el navegador. El wasm_exec.js se incluye tal cual, ya que no es necesario cambiar ese archivo mientras que la segunda secuencia de comandos obtiene el archivo main.wasm compilado como destino del programa main.go para ejecutarlo. La fuente de jquery incluida no es esencial para el ensamblaje web, pero por el bien de una vida más fácil, la incluí. Esto también muestra que definitivamente podemos usar js frameworks junto con webassembly. Los componentes de la interfaz de usuario se están diseñando dentro del <body> selector como lo hacemos con html simple. Funciones de Javascript registradas como eventos en elementos html como <button> y <select> se implementan en web/actions.go.

El archivo actions.go es el “puente” que vincula las operaciones subyacentes de la cadena de bloques escritas en Go y su ejecución dentro del navegador a través del ensamblaje web.

El último guión al final de <body> describe el comportamiento del control deslizante y la devolución de llamada de javascript también se implementa en web/actions.go.

acciones.ir

En web/actions.go se implementan todas las funciones js llamadas en index.html.

encuentra el código aquí

Como se muestra, todas las funciones en Go tienen la misma firma para asignar a sus respectivas funciones de javascript en index.html, independientemente de los argumentos o el tipo de retorno de la última. En la primera línea, creo una función para asignar funciones de javascript en index.html a funciones de Go relevantes que se implementan en este archivo. En la segunda línea, el primer argumento de Set() apunta a la función javascript llamada reward. Mientras que el segundo argumento es construir una función javascript a partir de la función Go reward declarado en la línea 59.

Mientras que changeUser() primero comprueba si la opción que aparece en el menú desplegable es Alice o Bob. Luego habilita el botón Comprar en la línea 17 configurando el disabled atribuye a falso. Del mismo modo, cambia el atributo de desactivación de las opciones desplegables a verdadero. Dado que el usuario no puede cambiarse de nuevo una vez que se configura por primera vez. Por lo tanto, la User variable se establece en el valor que proviene del menú desplegable en la línea 22, ya que eso establece el propietario de la billetera en ese User. En las líneas 31 a 35, el botón Comprar se personaliza según el usuario seleccionado. Por ejemplo, si el User es igual "Alice"entonces la acción del botón Comprar es comprar manzanas por el precio de 20 cripsias.

Función buyCommodity() invoca la billetera para pagar el precio de la mercancía al comerciante. en el que ambos merchant y price se han establecido previamente en el changeUser() Llamada de función.

networth() invoca la billetera para verificar la cantidad de cripypsis que tiene el propietario de la billetera. Devuelve el valor de networth como un valor de javascript que luego se ve en index.html. reward() otorga 10 crypsys al usuario de la nada, así no es como funcionan las cosas en el mundo real. Pero es una forma de inyectar crypsys en este escenario tal como se está implementando.

sendSliderValToWasm() pasa el valor del control deslizante de index.html a diff variable que contiene el valor de la dificultad de minado. Cuanto mayor es este valor, más difícil se vuelve el problema de la minería, lo que a su vez lleva a consumir más tiempo para agregar un nuevo bloque a la cadena de bloques.

renderer.go

RenderPage() hace que la página sea dinámica al recargar los elementos de la página de acuerdo con los cambios experimentados en la cadena de bloques.

encuentra el código aquí

Primero obtengo la billetera del usuario para luego obtener la cadena de bloques y el saldo neto del usuario. en la linea 5 chainView es un elemento div que incluye otros elementos dom necesarios para dibujar la cadena de bloques de la billetera. en la linea 9 chainView se adjunta en el blockchain-placeholder en index.html. La etiqueta de valor neto de index.html también se actualiza en las líneas 11.

monedero.ir

La estructura de la billetera es un envoltorio de las operaciones de la cadena de bloques, actúa principalmente como una abstracción sobre las transacciones de la cadena de bloques.

encuentra el código aquí

en la primera linea NotifyListeners es una devolución de llamada que se llama justo después de que se produzca una mutación en la cadena de bloques, lo que a su vez requiere un cambio en la interfaz de usuario del usuario. La estructura contiene el nombre de usuario y un puntero a la Blockchain en la que se envuelve. Vale la pena señalar que golang no proporciona una sintaxis de constructor dedicada para sus estructuras. Por eso Wallet la instancia se crea llamando a la función (similar a un constructor) NewWallet() como programador de Go suele recurrir a esa forma para implementar un “constructor”.

Networth() atraviesa la cadena de bloques para encontrar el nombre de usuario de la billetera en las transacciones registradas en la cadena de bloques. Calcula su valor neto restando las transacciones iniciadas por él/ella de las transacciones enviadas a él/ella.

Funciones PayTo y Reward son envoltorios alrededor de la cadena de bloques RequestTransaction el cual inicia el proceso de creación de un nuevo bloque con la transacción correspondiente. Reward inicia la transacción desde el nombre de usuario “Coinbase” ya que, por el bien de este artículo, el usuario refleja los cryptos adicionales agregados a la “economía crypsy”, por lo tanto, puede proporcionar una cantidad infinita de cryptos si es necesario. PayTo transfiere cryptos de Alice o Bob al otro, ya que también verifica que el pagador posea la cantidad adecuada de cryptos antes de invocar la transacción.

principal.ir

Este archivo es el punto de entrada de compilación para la aplicación en la que RegisterCallbacks() se invoca que se define en actions.go que pertenece al paquete Go web.

encuentra el código aquí

Justo al principio un WaitGroup La variable se declara para que la aplicación no finalice al final de main(). Por lo tanto, la aplicación continúa ejecutándose para responder a las entradas del usuario en consecuencia, lo que se captura llamando RegisterCallbacks().

¡Vamos a ejecutarlo!

  • Primero navegue al directorio raíz de main.go y compílelo en webassembly.
    GOARCH=wasm GOOS=js go build -o main.wasm main.go
  • Correr node tracker.jsesto para establecer comunicación entre instancias de aplicación.
  • Duplique la carpeta de la aplicación para luego ejecutar otra instancia de la aplicación.
  • Correr http-server en ambos directorios raíz de main.wam para ser servido a través de localhost:port.
miner-dapp-wasm beber$ http-server
Starting up http-server, serving ./
Available on:
  http://127.0.0.1:8080
  
miner-dapp-wasm-2 beber$ http-server
Starting up http-server, serving ./
Available on:
  http://127.0.0.1:8082
  • Escriba ambas direcciones URL en dos pestañas de cualquier navegador web para abrir dos instancias de la aplicación.
  • Elija a Alice en la primera instancia y elija a Bob en la segunda, ahora ambas billeteras están iniciadas.
  • En la instancia de Bob: haga clic en Reward.
  • Para que se cree un nuevo bloque, la minería lleva tiempo.

Bob-instancia-recompensa1-bob.png

  • Este problema de minería se resuelve con el minero de Bob dando un valor nonce de 1453337, esto se explica detalladamente en la parte 2.
  • Se crea un nuevo bloque que muestra la transacción, su valor neto aumenta en 10 mientras que Alice todavía no tiene crips.

Alice-instancia-recompensa1-bob-blockchainView.png

  • Datos presentados por cada bloque:
cripsis desde -> cripsis hasta: cantidad cripsis
Hash del bloque anterior
Mientras tanto
Hash de este bloque
  • Alice también comparte los mismos datos de blockchain a pesar de que no participó en la última transacción.
  • Ahora Bob decide comprarle bananas a Alice.

Bob-instance-buyBananas1-blockchainView.png

  • Su valor neto se vuelve 0 porque pagó todos sus 10 cripys por los plátanos (¡movimiento imprudente de Bob!).

  • Después de algunas operaciones aleatorias de compra y recompensa, Alice le compra manzanas a Bob.
    Alice-instancia-comprarManzanas1.png

  • Esta vez, Alice es alertada de que Bob extrajo el nonce a pesar de que ella inició esa operación. En este caso, chainfabric notificó al minero de Alice que dejara de minar una vez que Bob resolviera el problema.

Alice-instance-buyApples1-blockchainView.png

  • Ahora su valor neto es 0, ya que todo lo que tenía antes de invocar esa compra eran 20 cripsias, que es el precio de las manzanas de Bob.

Esperamos que esté emocionado de agregar webassembly a sus proyectos después de leer este artículo y tenga una idea de cómo se ve blockchain hasta que profundicemos juntos en la siguiente parte de este artículo.

Todo el código que puedes encontrar en mi repositorio

Similar Posts

Leave a Reply

Your email address will not be published.