Esta guía lo guiará paso a paso en el aprendizaje de la solidez. Para una exploración en profundidad de la solidez, consulte nuestros cursos de blockchain.
La Fundación Ethereum ha estado sacudiendo el mundo de la cadena de bloques desde los primeros días del proyecto, a finales de 2013 y principios de 2014. Ethereum realmente puso en marcha el “Bitcoin 2.0” y lo que consideramos como el movimiento de “cadena de bloques”, después del primer gran La “burbuja” de Bitcoin que superó los $ 1000 USD en los mercados llamó la atención de todos. Ethereum es un proyecto de cadena de bloques con una criptomoneda, Ether, similar a Bitcoin, pero Ethereum tiene la característica adicional de un lenguaje de máquina virtual (casi) Turing completo y capacidad de procesamiento incorporada en la implementación del nodo.
La máquina virtual Ethereum (EVM) permite que los nodos de Ethereum almacenen y procesen datos a cambio de pagos, respondiendo a eventos del mundo real y permitiendo muchas oportunidades nuevas para admitir aplicaciones en cadena que nunca antes estuvieron disponibles para desarrolladores y real- usuarios del mundo. Tuve la suerte de estar realmente en Suiza a principios de 2014, y poder visitar un “holón” de Ethereum y pasar el rato con algunos de los fundadores de Ethereum antes de la venta del token de Ether, cuando eran “autofinanciados”.
Le pregunté a Mihai Alisie qué es un contrato inteligente de ethereum y me explicó:
“Los contratos inteligentes son una forma en que las personas de todo el mundo pueden hacer negocios entre sí, incluso si no hablan el mismo idioma ni usan la misma moneda”.
Así que esa es realmente la perspectiva con la que comienzo, la idea de que podemos definir programáticamente las reglas de un contrato comercial, en un lenguaje de máquina simple, para unir a las personas y permitirles realizar negocios de manera confiable, segura y automatizada.
Solidity Language en sí es una herramienta que utilizamos para generar código a nivel de máquina que se puede ejecutar en el EVM, es un lenguaje con un compilador que toma nuestro código legible por humanos de alto nivel y lo divide en instrucciones simples como “poner datos en un registro ”,“ agregar datos de dos registros ”,“ volver a la instrucción en el punto de memoria xxxxx ”, que forman la base de cualquier programa ejecutable de microprocesador.
Entonces, el lenguaje Solidity es solo uno de varios lenguajes que se pueden compilar en código de bytes EVM, otro lenguaje que hace lo mismo se llama Serpent. Cada lenguaje puede tener varias herramientas de compilación, pero todas hacen lo mismo, que es generar un código de bytes de nivel de máquina EVM para ejecutarlo en los nodos de ethereum, para el pago.
Cómo aprender la solidez
La solidez en sí es un lenguaje bastante simple, en lo que respecta a los lenguajes de programación.
De hecho, es un lenguaje deliberadamente reducido, escrito libremente con una sintaxis muy similar a ECMAScript (Javascript). Hay algunos puntos clave para recordar del documento Ethereum Design Rationale, a saber, que estamos trabajando dentro de un modelo de pila y memoria con un tamaño de palabra de instrucción de 32 bytes, el EVM nos da acceso a la “pila” del programa, que es como un espacio de registro donde también podemos pegar direcciones de memoria para hacer que el Contador del Programa se repita / salte (para el control secuencial del programa), una “memoria” temporal expandible y un “almacenamiento” más permanente que en realidad se escribe en la cadena de bloques permanente, y lo más importante , el EVM requiere un determinismo total dentro de los contratos inteligentes.
Este requisito de determinismo es la razón por la que no verá la función “aleatorio ()” en el lenguaje de Solidity. Cuando se “extrae” un bloque de ethereum, las implementaciones de contratos inteligentes y las llamadas a funciones dentro de ese bloque (es decir, las que están alineadas para suceder dentro de la duración del último bloque) se ejecutan en el nodo que extrae el bloque, y el nuevo estado cambia a cualquier los espacios de almacenamiento o las transacciones dentro de ese contrato inteligente realmente ocurren en ese nodo minero. Luego, el nuevo bloque se propaga a todos los demás nodos y cada nodo intenta verificar de forma independiente el bloque, lo que incluye hacer esos mismos cambios de estado en su copia local de la cadena de bloques también. Aquí es donde fallará si el contrato inteligente actúa de forma no determinista. Si los otros nodos no pueden llegar a un consenso sobre el estado de la cadena de bloques después de que se ejecuten el nuevo bloque y sus contratos, la red podría detenerse literalmente.
Esta es la razón por la que los contratos inteligentes de ethereum (y los contratos inteligentes en general en cualquier sistema blockchain) deben ser deterministas: para que la red de nodos siempre pueda validar y mantener el consenso sobre los nuevos bloques que ingresan, para seguir funcionando.
Otra limitación que encontrará en los contratos inteligentes de EVM es la imposibilidad de acceder a datos fuera de la “memoria” y el “almacenamiento” (no queremos que el contrato inteligente pueda leer o eliminar los discos duros de los nodos en los que se ejecuta) y la incapacidad de consultar recursos externos como con un JQuery. Realmente no tenemos acceso a muchas funciones de biblioteca como para analizar estructuras JSON o hacer aritmética de punto flotante, y en realidad es prohibitivo hacer esas subrutinas o almacenar muchos datos en la propia cadena de bloques ethereum.
Cuando llama a un contrato inteligente que realiza algún trabajo o cálculo que cambia de estado (cualquier acción además de simplemente leer desde el almacenamiento), incurrirá en un “costo” de gas por el trabajo realizado por el contrato inteligente, y este costo de gas es relacionado con la cantidad de trabajo computacional requerido para ejecutar su función. Es una especie de sistema de “micropagos por microcomputación”, en el que puede esperar pagar una cantidad determinada de gas por una cantidad determinada de cálculo, para siempre.
El precio del gas en sí debe permanecer constante en general, lo que significa que cuando Ether sube en los mercados globales, el precio del gas frente al Ether debería bajar. Por lo tanto, cuando ejecuta una llamada de función a un contrato inteligente, puede obtener una estimación de la cantidad de gas que debe pagar de antemano, pero también debe especificar el precio (en éter por gas) que está dispuesto a pagar, y los nodos de minería pueden decidir si esa es una tasa lo suficientemente buena para que puedan atender su llamada de función de contrato inteligente en su siguiente bloque.
Los contratos inteligentes tienen su propia dirección, desde la cual pueden recibir y enviar Ether. Los contratos inteligentes pueden rastrear al “llamador” de la función de una manera verificable, por lo que puede determinar si una de sus funciones está siendo llamada por una cuenta de “propietario” o “administrador” privilegiado, y actuar en consecuencia para las funciones administrativas. Tienen la capacidad de leer datos de ethereum blockchain y acceder a información sobre transacciones en bloques más antiguos. Pero, ¿los contratos inteligentes están “encerrados” en su propio pequeño mundo determinista, solo capaces de estar al tanto de los datos almacenados en la propia cadena de bloques de ethereum?
¡Para nada! Ahí es donde entran los “oráculos”. Podemos hacer una llamada a un oráculo que nos dirá algo sobre el mundo exterior de una manera confiable y actuar sobre esa información dentro del contrato inteligente. El punto clave aquí es que, aunque los eventos del mundo real en sí mismos no son deterministas, se puede confiar en que Oracle responderá siempre a la solicitud de cada nodo sobre lo que sucedió de una manera determinista, de modo que todos los nodos puedan llegar a un consenso. Entonces, así es como funciona el Oracle confiable en teoría: un “oráculo” tomará algunos datos, digamos un indicador de precios de cotización sobre el precio de una acción en el mundo real, y registrará esos datos en el “almacenamiento” en un simple contrato inteligente de Oracle, algo Me gusta esto
(ver también la explicación aquí):
Hay empresas que se especializan en ser el oráculo de confianza y en diseñar sistemas para desintermediarse a sí mismos de tener que confiar en el suministro de datos. Si echamos un vistazo a la documentación de Oraclize vemos esta interesante cita:
En particular, el objetivo no es obligar a los desarrolladores de contratos inteligentes a tener que confiar en Oraclize los datos que necesitan. Sin ningún respaldo de autenticidad, Oraclize podría manipular fácilmente los datos. Es por eso que, para completar esta compleja tarea, Oraclize devuelve los datos solicitados junto con una prueba de autenticidad: es decir, que los datos provienen del proveedor de datos que ha sido explícitamente exigido por el contrato inteligente.
Por lo tanto, debe consultar la sección de documentos sobre “pruebas de autenticidad” para obtener más detalles, pero la idea es que incluso cuando los nuevos nerds de ethereum, en algún momento distante en el futuro, activen sus nodos de ethereum y comiencen a sincronizar sus cadenas de bloques con la red. , todos los datos que necesitan para ejecutar todos esos contratos inteligentes “dependientes de Oracle” están en cadena de forma segura para que los descarguen para siempre. La cuestión de quién paga el “gas” para que el oráculo haga toda esta escritura de datos sobre eventos del mundo real (el almacenamiento de blockchain “cambia de estado” cuesta el gas) es otro tema, pero básicamente, el solicitante de datos lo paga por adelantado en una de varias formas. Lo bueno aquí es que, aunque no podemos escribir un contrato inteligente que “arroje dados” en el sentido de incluir aleatoriedad real, en realidad es posible escribir un contrato inteligente que reaccione al lanzamiento de un dado, como oficiada por un oráculo.
Tutorial de conceptos básicos de solidez
Configuración y antecedentes del código básico
Así que comencemos con un contrato inteligente básico de Ethereum, escrito en lenguaje Solidity. ¡La mejor manera de aprender es haciendo! Podemos ver en el pequeño fragmento de código anterior que tenemos una sintaxis de declaración de función bastante simple y algunos tipos de datos básicos como ‘uint’ (entero sin signo) y ‘cadena’, y vemos en los documentos que también tenemos tipos de variables como ‘address’, que contiene los métodos ‘.balance’ y ‘.transfer’, que previsiblemente devuelven el saldo en una dirección de Ethereum, y permiten que el contrato inteligente envíe Ether a esa dirección, con unidades denominadas en Wei.
Tenemos sus matrices básicas, enumeraciones, operadores, estructuras de datos hash llamadas “mapeos” y algunas unidades predefinidas especiales y variables globales que incluyen cosas como altura de bloque, marca de tiempo del último bloque y algunas funciones prácticas de manipulación de claves y direcciones SHA-hash. Una peculiaridad importante sobre Solidity cuando se trabaja con matrices multidimensionales: la indexación está en orden “inverso” desde la mayoría de los lenguajes solo durante la declaración, como se indica en los documentos:
Una matriz de tamaño fijo k y tipo de elemento T se escribe como T [k], una matriz de tamaño dinámico como T []. Como ejemplo, una matriz de 5 matrices dinámicas de uint es uint [] [5] (tenga en cuenta que la notación se invierte en comparación con algunos otros lenguajes). Para acceder a la segunda uint en la tercera matriz dinámica, use x [2] [1] (los índices están basados en cero y el acceso funciona de manera opuesta a la declaración …)
Bien, tenemos suficientes herramientas básicas aquí para ser peligrosos, comencemos. Hagamos una especie de aplicación social básica en la que las personas puedan tener algunas imágenes e información básica sobre sí mismas publicadas en la cadena de bloques. Cada usuario tendrá una dirección ethereum y un “identificador” o nombre de usuario asociado a su cuenta. Tendremos algunos datos demográficos básicos que las personas pueden ingresar o no, y luego tendremos una página de búsqueda simple donde puede buscar usuarios en un directorio básico y ver las imágenes que han agregado / notarizado a su usuario. perfil.
Aquí hay una imagen de cómo se verá nuestro producto final de interfaz de usuario de la aplicación descentralizada (Ðapp) de contrato inteligente Solidity de ethereum, con usuarios e imágenes notariadas agregadas:
Les escribí ante notario una bonita foto mía para ustedes, y una imagen de una estructura de cristal de arseniuro de galio de mis días de posgrado para ustedes. Puede ver los hash y las marcas de tiempo del notario SH256 para cada imagen y una pequeña marca de verificación que indica que los datos de la imagen notariada aún coinciden con el hash del notario que se creó en la marca de tiempo indicada. Así que voy a explicarte cómo creé esta aplicación, indicando los datos interesantes para ti, con todos los enlaces y ejemplos de código que podrías necesitar para referencia futura. ¿Suena bien? ¡Vamos!
Lo primero que haré es configurar un “banco de pruebas” de Truffle que me permitirá probar fácilmente la compilación de mi contrato inteligente. Compilar e implementar contratos inteligentes implica generar transacciones firmadas durante mucho tiempo, pero Truffle me permitirá compilar / implementar y probar mi contrato inteligente usando comandos simples. Hay un montón de herramientas que pueden hacer esto, pero resulta que me gusta este video tutorial de contrato inteligente de Solidity que usa la herramienta Truffle. Tengo una carpeta de proyecto de demostración de github que he creado solo para este tutorial para que todos la sigan. Comenzaré con algunos comandos de configuración simples (en un entorno Linux de Debian):
Un ejemplo simple de contrato inteligente de solidez
Ok, voy a crear un contrato llamado Geekt.sol, en la carpeta / Geekt / contract que se generó cuando llamé a “truffle init”. Puede ver el código de contrato completo aquí, y señalaré las partes más interesantes aquí. En la parte superior del archivo hay una línea que especifica la versión del compilador y algunas definiciones de sintaxis y variables de definición de contrato básicas.
Cuando llame a una función de cambio de estado en el mundo real, tendrá que especificar cuánto ether está dispuesto a pagar para ello, pero afortunadamente puede solicitar una estimación del costo en términos de costo de gas y precio de gas ( en gas / éter) de antemano, y suele ser muy preciso. Los mineros de ethereum decidirán si pagó lo suficiente e incluirán su transacción de cambio de estado en el siguiente bloque, por lo que en realidad tendrá que esperar a que esas funciones regresen cuando se encuentre el siguiente bloque. La lectura de datos de estas estructuras de “almacenamiento” es gratuita y tampoco tiene que esperar al siguiente bloque, los nodos simplemente leerán los datos y se los devolverán de inmediato.
Entonces, el mapeo de Usuarios es nuestro principal objeto de almacenamiento que nos permite crear objetos de Usuario y buscarlos por dirección. Las asignaciones son súper eficientes para almacenar datos y recuperarlos rápidamente, pero no hay una manera fácil de iterar un mapa, por lo que puede ver que también creé una matriz de direcciones usersByAddress que contiene todas las direcciones conocidas de un usuario en nuestro sistema, como un blanco. páginas de todos los usuarios. Yo creé el
Creé el mapeo de imágenes notarizadas para permitirnos crear objetos de “imagen” en el almacenamiento y buscarlos mediante un hash SHA256 asociado de los datos de la imagen, y esos índices notaryHash tienen una longitud de 32 bytes.
También tenemos una matriz ImagesByNotaryHash bytes32 que es una lista de todos los notaryHashes, como una página blanca que nos permite iterar todas las imágenes que han sido notariadas.
Estas (arriba) son estructuras muy básicas, y también representan objetos de “almacenamiento”, por lo que cuesta un ether real para “crear” y los datos en ellos se almacenan en la cadena de bloques de ethereum, y cuesta un ether real cambiar el “estado”. ”De sus variables internas. Realmente solo usamos las asignaciones y matrices externas para realizar un seguimiento de en qué parte de la memoria de la cadena de bloques residen estas estructuras de imagen / usuario. Nuestra estructura de imagen notariada almacena simplemente una URL a una imagen, presumiblemente en algún lugar de la web, y una marca de tiempo que notifica cuándo la imagen fue notariada. Nuestra estructura de usuario almacena algunos usuarios básicos: identificador, ciudad, estado, país, y también almacena un conjunto de todas las imágenes que este usuario ha notariado y “agregado” a su cuenta de usuario, como una versión mini usuario por usuario de el objeto global de páginas blancas imagesByNotaryHash.
Aquí está nuestra función registerNewUser. Toma identificador, ciudad, estado, país como variables de entrada y devuelve verdadero o falso para indicar éxito o fracaso. ¿Por qué fallaría? Bueno, no queremos permitir que los usuarios sobrescriban el identificador de los demás, por lo que esto será como un sistema de primer reclamo para los identificadores. Si ya existe un usuario con este identificador, devolvemos nulo, por lo que he colocado una línea “si” condicional allí para comprobarlo. Tampoco permitimos la creación de un nombre de usuario sin identificador. Una cosa que notamos es thisNewAddress, que es la persona que llama a la función, puede ver que usamos la función especial msg.sender para capturar esos datos, esta es la dirección desde la que se envió la transacción “hacer esta función” cuando alguien (cualquier persona) llama a nuestra función de contrato inteligente, y pagan ether real para hacerlo. Entonces, un objeto de “mapeo” es nulo por defecto, y cuando llamamos:
Usuarios [thisNewAddress] .handle = handle;
Esto crea un nuevo objeto Usuario, en nuestro mapeo de Usuarios, y establece el identificador. Lo mismo ocurre con la ciudad, el estado y el país. Tenga en cuenta que también insertamos la dirección del nuevo usuario en nuestro objeto de “páginas blancas” de usuarios globales usersByAddress antes de devolver verdadero allí.
Nuestra función addImageToUser to user es bastante similar a la función registerNewUser. Lo busca por su dirección de envío a través del objeto especial msg.sender y verifica que haya un Usuario registrado (por identificador) para esa dirección antes de intentar agregar una imagen para su entrada de usuario. Permitimos a los usuarios agregar su notaryHash a las páginas blancas globales de imágenes solo si no existe, para evitar que los usuarios peleen por las entradas en las páginas blancas globales, pero les permitimos agregar / actualizar cualquier entrada notaryHash dentro de su propias mini-páginas blancas de sus propias imágenes. ¡Nada de eso!
Finalmente, las funciones de acceso (arriba) nos permiten simplemente leer en voz alta cada usuario o imagen, u obtener los listados completos de páginas blancas de todos los usuarios o todas las imágenes. Tenga en cuenta que estas funciones devuelven datos constantes, lo que básicamente significa que son de solo lectura, no “que cambian de estado” y son libres de llamar y devuelven los datos de inmediato, no tiene que esperar hasta el siguiente bloque. Básicamente, solo llamamos a nuestras asignaciones / matrices globales y devolvemos los datos relevantes: usuarios por dirección o imágenes por notaryHash.
Compilación y prueba de un contrato inteligente
Ahora queremos probar nuestro contrato inteligente localmente, en un entorno de prueba. Es realmente fácil usar comandos simples de Truffle, pero primero necesitamos un nodo ethereum local para probar. Ahí es donde entra Ethereum TestRPC. TestRPC es básicamente un nodo falso, un programa delgado que simplemente pretende ser un nodo y responde como un nodo respondería en su máquina localhost. TestRPC se ejecuta en el puerto 8545 como un nodo ethereum normal, y tiene la capacidad de compilar contratos inteligentes de Solidity en código EVM y ejecutar ese código también, además de obtener respuestas instantáneas para las pruebas, en lugar de tener que esperar en la red ethereum real para encuentra el siguiente bloque. Ahora, podría ejecutar comandos de compilación / implementación de prueba de Truffle contra un nodo ethereum real, pero eso costaría Ether real, además de que llevaría mucho tiempo y memoria ejecutar su propio nodo si no lo necesita. Así que hacemos unos pocos comandos de instalación rápidos:
npm i -g ethereum-testrpc
testrpc -m “perro de muestra el año que viene rociar rastreo aprender general detectar piloto de gelatina de plata”
Esto inicia TestRPC con una frase “semilla” especificada, y debería ver algo como esto como resultado:
Verá algo de actividad aquí en esta ventana con TestRPC en ejecución, mientras implementa e interactúa con su contrato inteligente a través de Truffle o Web3.js. Bien, estamos listos para la implementación de prueba. Deberá modificar el archivo /migrations/2_deploy_contracts.js para incluir el nombre de su contrato inteligente, para que Truffle sepa compilarlo e implementarlo. Hacemos este comando:
compilar trufa
Si todo va bien, verá un mensaje que dice que está “guardando artefactos” y ningún mensaje de error. No voy a mentir, si su contrato tiene errores de sintaxis u otros problemas, los mensajes de error del compilador que verá probablemente serán misteriosos y difíciles de interpretar. Si obtiene un error sobre el “tamaño de la pila”, eso probablemente significa que tiene demasiadas variables que se pasan dentro / fuera de una llamada de función, una buena regla para recordar es que la entrada o salida de 16 variables es el máximo, en general. Además, recuerde que los contratos inteligentes de Solidity no pueden devolver tipos de datos de estructura personalizados, por lo que también tendrá que solucionar eso, por lo general, solo devuelvo matrices y punteros / direcciones de otras estructuras en mis asignaciones internas. Si recibe un mensaje de error en tiempo de ejecución sobre la “pila”, eso puede significar que tiene un condicional incorrecto en su código.
migrar trufa
Este comando (arriba) realmente realiza la implementación de prueba de su contrato inteligente en su nodo TestRPC. Veo este retorno de salida:
Nuestro contrato inteligente (llamado “Geekt”) recibe una dirección en la cadena de bloques Ethereum cuando se implementa con éxito, puede ver arriba, la dirección es 0xe70ff0fa937a25d5dd4172318fa1593baba5a027. En una red ethereum real y en vivo, paga gas para implementar su contrato y la dirección nunca cambia. En TestRPC, si cierra TestRPC, se olvidará de todo, y una vez que inicie TestRPC de nuevo, tendrá que volver a implementar su contrato y obtendrá una dirección diferente para su contrato inteligente. La dirección de su contrato inteligente es donde las personas pueden enviar transacciones con mensajes para interactuar con él, realizar transacciones de cambio de estado o simplemente leer datos de la cadena de bloques ethereum. Los contratos inteligentes también pueden interactuar directamente entre sí a través de estas direcciones, utilizando “mensajes”. Los contratos inteligentes que interactúan con otros contratos inteligentes para almacenar, cambiar o leer datos a través de estos “mensajes” de ethereum blockchain se conocen como Organizaciones Autónomas Descentralizadas o DAO.
Ok, ahora viene la parte divertida. Estamos listos para hacer algunas pruebas iniciales e interactuar con nuestro contrato inteligente. Iniciamos la “consola” de Truffle y hacemos algunas consultas contra nuestro nodo localhost TestRPC, para asegurarnos de que todo está funcionando y podemos agregar usuarios e imágenes y recuperarlos correctamente.
Un concepto importante aquí es el ABI, que es un objeto con formato de javascript que describe los nombres de las funciones y las entradas / salidas para interactuar con su contrato inteligente, es como la descripción de la interfaz del programador de aplicaciones (API) para su contrato inteligente, que le dice a la gente cómo crear mensajes para él. ¡Mi función registerNewUser () está funcionando! Veo esto en respuesta a la llamada a la función registerNewUser (), en la ventana de la consola:
La función AddImageToUser () devuelve el éxito de manera similar, y cuando ahora puedo recuperar registros de usuarios individuales o registros de imágenes notariados de la cadena de bloques ethereum. Mi llamada a la función getUser () devuelve:
Todo esto luce genial. Todo está funcionando, probado en TestRPC y Truffle, y estamos listos para construir una interfaz gráfica de usuario genial para nuestra aplicación para que el mundo pueda interactuar con nuestro registro de usuario y notario de imágenes en la cadena de bloques ethereum.
Diseño básico de Ethereum ÐApp
Diseño y prueba de localhost
Estamos listos para comenzar, nuestro contrato inteligente en lenguaje Solidity se compiló con éxito y se implementó en nuestro nodo ethereum testRPC local. Ahora podemos construir rápidamente una ÐApp simple que puede permitir a los usuarios interactuar con el contrato inteligente a través de su navegador web, utilizando algo de programación web básica y el módulo especial de javascript Web3.js, creado específicamente para interactuar con los nodos de Ethereum y los contratos inteligentes. a través de la web.
Hice esta demostración (repositorios de github de código abierto) como referencia para que la gente la use mientras construye Ethereum ÐApps usando web3.js. Esta demostración se hizo con una herramienta fácil de usar llamada Create-React-App, usa un React en el lenguaje web interno de Facebook, pero no nos centraremos en ningún código de React, solo en los comandos javascript web.js necesarios. Mi código está en CommonJS, es casi exactamente el mismo que el antiguo javascript ES6.
Entonces, en su aplicación web, instale el módulo de nodo web3 a través de un comando como “npm i -S web3” y se guardará en su archivo package.json, si está usando uno. Así que tendría, dentro de una etiqueta “” o dentro de un archivo .js, una línea como esta para cargar el módulo web3 en sí:
importar Web3 desde “web3”;
(o, en ES6 javascript)
var Web3 = require (‘web3’);
Tenemos que informarle a Web3 sobre algunos detalles sobre nuestro nodo y nuestro contrato inteligente, para que pueda conectarse. Verás líneas como esta:
Esta sencilla ÐApp de demostración solo carga todas las direcciones de usuario conocidas y captura los detalles reales de la imagen del usuario y la imagen se registra a sí misma según sea necesario sobre la marcha. Aquí tienes una captura de pantalla:
En este punto (imagen de arriba), actualicé mi cliente TestRPC y acabo de ejecutar el comando “truffle migrate” que implementa el contrato inteligente contra mi nodo TestRPC localhost. Puede ver que la interfaz está lista para que haga clic en el botón y “registre” al primer usuario. Cuando hago clic en este botón, se llamará a mi función registerNewUser () de mi contrato inteligente, agregando estos datos de usuario a mi nodo de cadena de bloques ethereum (prueba de host local) en la dirección de contrato inteligente que anotamos anteriormente. Agregar datos de usuario al “almacenamiento” de la cadena de bloques costará gas, y necesitamos averiguar cuánto gas debemos pagar, en lugar de simplemente tomar una suposición científica salvaje (SWAG). Este es el código que realmente se llama cuando se hace clic en el botón “Firmar libro de visitas”:
Entonces, puede ver, cuando hacemos una transacción de cambio de estado que realmente tenemos que pagar con ethereum gas (gas real o testnet), llamaremos a esta función registerNewUser.estimateGas () de antemano, y luego usaremos esa cantidad estimada de gas cuando llamamos a la función de cambio de estado de verdad, usando la función registerNewUser.sendTransaction ().
Cuando iniciamos TestRPC y nos escupe algunas direcciones de billetera de prueba, estas cuentas son similares a la cuenta que tendría si ejecutara un nodo completo e hiciera un comando RPC getAccounts en su contra, como una billetera de nodo completo. TestRPC le ofrece algunas monedas testnet gratuitas, 100 testnet Ether por cuenta cuando se inicia.
Cuando llamamos a estas funciones de cambio de estado como registerNewUser () o addImageToUser (), en la fase de prueba de localhost, contra nuestro nodo TestRPC, TestRPC solo paga el gas testnet por usted y devuelve el resultado de la transacción de inmediato. En un nodo localhost completo, tendría que “desbloquear” esa cuenta antes de que la transacción se realizara correctamente en la red principal, y tendría que esperar en la red principal hasta que el siguiente bloque recoja su transacción, ¡asumiendo que nuestra estimación de gas es suficiente! Pero siempre hay una mejor manera, amigos míos 🙂
Conectando su Ðapp a Mainnet
Configuré e implementé el contrato inteligente en ethereum Mainnet y esta aplicación de demostración en uno de mis servidores web, en www.enledger.io/etherereum-demo-tools. Si visita este sitio y no tiene un TestRPC o un nodo ethereum completo ejecutándose en localhost: 8545, y visita este sitio, es probable que vea algo como esto:
Vio la conexión a la red:!
Saw cuenta predeterminada: (sin enlace de nodo web3.eth)
Entonces, ¿esto significa que necesita un nodo ethereum completo en ejecución, o un nodo completo de servidor privado virtual (VPS) para conectarse, para interactuar con la red principal ethereum? Hasta hace poco, eso era cierto, pero ahora tenemos este gran complemento de Chrome llamado Metamask (para el navegador Chrome), que le permite conectarse a ethereum Mainnet dentro de su navegador, y los chicos de Metamask básicamente le brindan una conexión a un nodo completo. , allí mismo, gratis, ¡así que apoyos para ellos!
Puede ver en mi código que detecto para el objeto web3 “inyectado” especial del complemento de metamask que configura la conexión del nodo a su nodo completo ethereum. Aquí está el código relevante que cambia automáticamente a su conexión de cliente habitual (localhost) o metamask web3:
En la imagen de abajo, observe el logotipo de Metamask Fox en la esquina superior derecha, ¡instalé el complemento Metamask y me conecté a ethereum Mainnet en mi navegador! Puede ver que ya agregué un par de usuarios al libro de visitas en nuestro contrato inteligente de demostración del libro de visitas “Geekt”. La interfaz ÐApp le permite seleccionar usuarios y explorar sus imágenes, y verá la página Firmar libro de visitas si se conecta desde una dirección que aún no ha registrado un usuario.
Agregué un código para que pueda pegar la URL de una imagen que desea agregar a su cuenta de usuario, y obtendrá el hash de notario SHA256 para que lo agregue a la imagen, y también verificará los hash de notario SHA256 de imágenes a medida que se cargan en la página, y le dan una pequeña marca de verificación verde o una ‘X’ roja en función de si la imagen en esa URL y el hash del notario aún coinciden. Estoy agregando la imagen del logotipo “BlockGeeks” debajo de mi cuenta de usuario Ryan M. aquí, y he hecho clic en el botón para agregar la imagen para este usuario.
El complemento Metamask ha detectado que necesito pagar esta transacción de ethereum web3 con gas Ethereum real, y ha aparecido una pequeña ventana para preguntarme si aceptaré esta transacción. Envié un poco de Ether real a esta billetera de Metamask, y tiene suficiente para borrar la transacción, así que hago clic en “Aceptar”.
Pensamientos finales, reflexiones profundas
Eso es todo, ¡está funcionando! ¡Este artículo de demostración y el repositorio de código le ayudarán enormemente a convertirse en un gran desarrollador de aplicaciones y lenguaje Ethereum Solidity! Puede instalar el complemento Metamask, conectarse a Ethereum Mainnet y visitar www.enledger.io/etherereum-demo-tools y verá mi aplicación Guestbook / Notary Demo y estos mismos usuarios e imágenes, e incluso puede firmar el libro de visitas. y notarizar imágenes también, si quieres 🙂
Para que no se pierdan demasiado el control con esto, agregué un poco de capacidad de moderación al “propietario” del contrato inteligente, que configuré internamente en la dirección de quien pagó inicialmente para implementar el contrato inteligente. contrato a la red principal, que soy yo. Quiero mostrarte muy rápido cómo funciona esa capacidad de administrador especial porque es bastante común ver este tipo de patrón de código de usuario administrador:
Tenemos una función de constructor especial, Geekt (), con el mismo nombre que el contrato en sí, que se llama solo una vez, cuando el contrato se implementa por primera vez en la cadena de bloques. Esta función establece al usuario administrador la dirección del msg.sender que pagó para implementar el contrato inteligente. También tenemos una función modificadora especial onlyAdmin () que luego se aplica a nuestras funciones removeUser () y removeImage (), para restringir esas funciones de modo que solo se puedan activar si la dirección msg.sender es la dirección del usuario administrador.
Ahora tengo una forma de eliminar a todos los usuarios malos, si es necesario 🙂 ¡No me obligues a hacerlo!
Otro último punto que quiero mencionar es que aquí solo hemos arañado la superficie. Un tipo de característica básica que no cubrí son los “eventos” de Solidity, que es una forma de enviar actualizaciones al navegador, como una conexión de “socket” que observa y activa eventos del navegador cuando hay nuevos usuarios registrados o se detecta la imagen. Las partes realmente geniales de ethereum y Solidity provienen de los contratos inteligentes que interactúan con los oráculos y los contratos inteligentes que hablan y actúan entre sí mediante “mensajes” (DAO). También hay algunos
Las partes realmente geniales de ethereum y Solidity provienen de los contratos inteligentes que interactúan con los oráculos y los contratos inteligentes que hablan y actúan entre sí mediante “mensajes” (DAO). También hay algunas consideraciones de seguridad bastante serias que debe conocer, antes de intentar almacenar ethereum real dentro de su contrato inteligente y enviarlo a las personas en función de las llamadas de función, un grupo de personas perdió alrededor de M dólares por ese y terminó. dividiendo la red ethereum en una polémica bifurcación. Eso es algo de lo que realmente deberías estar atento, y probablemente debería cubrir eso en otro artículo, por supuesto 🙂 Este artículo debería ser bueno para ponerte en marcha y ser “peligroso” como dije, y te animo a que lo aprendas, incluso una buena compañía para pagarle para que lo aprenda si puede, pero aún hay más en este camino.
Otro, el último punto del que quiero hablar es la estructura misma de ethereum y el costo real de usar contratos inteligentes, en este momento. ethereum es una red que se ejecuta en una gran cadena de bloques pública, única, donde todos pueden pagar para acceder y almacenar datos allí. Sin embargo, hacerlo es algo caro. Puede ver arriba en mi imagen, me estaban cobrando 0.004182 Ether, que hoy equivale a $ 0.96 en dólares estadounidenses reales, para almacenar una URL de imagen, hash de notario SHA256 y marca de tiempo, que comprende 196 bytes, en Ethereum Mainnet. ¡Esto equivale a un costo de almacenamiento de datos de $ 5,159.03 por MB!
Eso es literalmente increíblemente caro. La idea original para el costo del gas descrita en el documento técnico de ethereum dice que idealmente se supone que el costo del gas se mantenga algo constante, sin embargo, el costo del gas está ligado al número de bloque, en la implementación real, y el número de bloque no está aumentando tan rápido como el actual. precio de mercado del ethereum, por lo que el gas se está volviendo mucho más caro en términos reales. Además, la situación de la bifurcación dura muestra que esta es realmente una cadena pública, y si algo realmente polémico sucede en ella, podría bifurcarse y sus datos, teóricamente, podrían estar sujetos a una reversión, o la clase de activos subyacente podría bajar de precio abruptamente. El gran gasto de datos y los enormes océanos de datos que esperan ser almacenados significa que la cantidad de datos almacenables en cualquier cadena podría necesitar ser limitada, o puede ser autolimitante.
ethereum podría ser más adecuado para cosas que solo necesitan una pequeña cantidad de almacenamiento de datos disponible públicamente para estar en cadena, como tal vez un sistema de reputación en línea o un proyecto de notario de datos. Puede que no tenga sentido construir un proyecto de cadena de bloques para poner todos los datos de la industria de widgets de EE. UU. En la cadena de bloques de ethereum, por ejemplo, porque es posible que no desee que toda esa información esté disponible públicamente, y necesita reducir esas tarifas de transacción para su usos específicos de la industria de widgets. Podría considerar que un modelo de cadena de bloques de prueba de participación puede ser más eficiente energéticamente, incluso si eso puede representar un debilitamiento teórico del modelo de seguridad de consenso frente a la prueba de participación de Nakamoto para su proyecto de cadena de bloques.
Sugiero que antes de embarcarse en un nuevo proyecto de blockchain, considere cuidadosamente la plataforma que desea usar, mire las cosas más nuevas y no tenga miedo de explorar, y también considere cuidadosamente el incentivo del nodo que atraerá a las personas a descargar su ¡Genial código de nodo y ejecútalo! El mejor cumplido que puede recibir un programador es simplemente que las personas usen su código en el mundo real y sean productivos con él.
Sección de bonificación secreta loca
Envíeme a la red principal, capitán
¡Regresé con más cosas increíbles para ti y la comunidad ethereum! Así que me salté un detalle importante anterior, tal vez lo hayas notado. Una vez que escriba su contrato inteligente, pruebe compilarlo mil veces hasta que funcione, implementación, prueba de localhost, todo funciona. Ahora, ¿cómo diablos puedes poner esto en Mainnet? Es una especie de
Es un poco difícil y generalmente implica tener que ejecutar su propio nodo ethereum completo, o pagarle a alguien para que lo ejecute y le permita acceder a él (como a través de un VPS). Entonces, eso fue realmente un inconveniente para mí, porque estoy impaciente y estoy escribiendo este artículo con una fecha límite, ¡gente! No tengo tiempo para esperar a que se sincronice mi nuevo nodo completo de ethereum, y no tengo ganas de gastar un par de cientos de gigas de espacio en el disco duro y una de mis cajas para procesar ethereum tx a tiempo completo, y yo También soy demasiado barato para pagar un VPS para que lo haga por mí, jejeje.
Así que utilicé un kung-fu web javascript especial y descubrí cómo puedo hacer una página web con un cuadro y un botón, donde puedes pegar tu contrato, hacer clic en el botón e implementar un contrato inteligente de Solidity directamente en Mainnet, a través del complemento Metamask. Principalmente hice esto solo por conveniencia, para escribir este artículo, pero resultó ser una herramienta sorprendentemente útil, así que la puse en la web para que todos la usen. Por primera vez, puede realizar todas sus pruebas e incluso la implementación completa de contratos inteligentes en la red principal de ethereum, ¡sin necesidad de un nodo ethereum completo propio! Permítanme presentarles la herramienta EthDeployer, es un software gratuito para ustedes porque el software gratuito nos da libertad 🙂
Aquí hay un enlace al EthDeployer Repo en Github, y también puede simplemente acceder a mi EthDeployer de Tectract en vivo e implementar sus contratos directamente desde allí, solo necesita instalar Metamask Plugin y conectarse a Ethereum Mainnet primero, además necesitará un pequeño Ether en su billetera Metamask para pagar la tarifa de implementación del contrato inteligente de Mainnet, ¡por supuesto!
Esta herramienta utiliza la herramienta Browser-Solc, que es solo una herramienta de carga minificada y explorada para cargar la versión javascript de Solidity Compiler, directamente en el navegador del lado del cliente, para analizar / compilar un contrato inteligente sobre la marcha. Esto hace que la herramienta sea completamente autónoma y portátil, lo que significa que no necesita preocuparse por instalar el compilador Solc en su computadora, y yo tampoco necesito preocuparme por instalarlo en mi servidor, lo cual es excelente para todos. Permítanme señalar el código que carga el último compilador de solidez disponible:
Tengo el javascript minificado browser-solc.min.js que se carga a través de la página index.html de nivel superior, lo que hace que un objeto window.BrowserSolc esté disponible para mis scripts de reacción de nivel inferior. Esta es otra aplicación de creación-reacción muy simple que se puede instalar e implementar en minutos en su propia máquina, incluso proporcioné un readme.md realmente útil en el repositorio de github que le muestra cómo hacerlo.
La función setupCompiler espera un segundo para que el objeto window.BrowserSolc esté disponible después de que se cargue la página, luego realiza sus funciones internas .getVersions () y .loadVersion (), realmente no hay mucho que hacer, y tenemos un compilador Solc funcional disponible para nosotros directamente en un entorno totalmente del lado del cliente, ¡agradable! Para completar, mostraré algunas líneas relevantes que realmente manejan la compilación y la implementación del contrato desde una función de JavaScript, cuando el mensaje “¡compilar e implementar!” se presiona el botón:
Tenemos todos nuestros objetos familiares de antes, llamamos compiler.compile () en el texto del contrato y obtenemos un objeto de “resultado” del contrato compilado del cual extraemos el abi y el código de bytes, y lo enviamos en una nueva transacción. También vemos nuestra vieja función familiar .estimateGas () incluida aquí por si acaso. Tomamos el ID de la transacción y la nueva dirección del contrato para mostrar al usuario cuando el contrato se implementa con éxito. ¡Bam, hecho! Veámoslo en acción:
“Oh, sí, si recibe un mensaje de error durante la implementación, asegúrese de verificar realmente el enlace de ID de transacción, es muy probable que el contrato se haya implementado con éxito. aquellos a nuestro entorno de navegador con éxito.
Todavía está vivo. ¡Esto me hace tan feliz! ¡Bonificación extra secreta loca desbloqueada! Entonces, pagué 0.02268 Ether en gas, que es aproximadamente $ 5.30 USD (1 de junio de 2017), para implementar este contrato en Ethereum Mainnet. Recuerde que se suponía que era una aplicación de demostración súper simple, con literalmente solo dos posibles estructuras de datos. Hace solo 2 dólares hace un par de semanas, ¡esto es una locura! Pero aún así es asequible, no debería necesitar implementar su contrato en la cadena principal que a menudo, realmente solo una vez debería hacerlo.
¡Eso es todo lo que tengo para ustedes esta vez, chicos! Espero que hayas encontrado este tutorial muy útil y que puedas darle un buen uso a la herramienta EthDeployer en tus aventuras de desarrollo. Espero escuchar preguntas y comentarios, ¡gracias!
Ryan Molecke
Ryan Molecke, director de tecnología (CTO) de EnLedger Corp., es un investigador académico en ciencias computacionales altamente multidisciplinario, que hizo la transición al mundo de la tecnología financiera y los sistemas comerciales. Ha trabajado en varias empresas emergentes de tecnología financiera notables y exitosas, ayudó a diseñar sistemas de comercio y corretaje / intercambios, y ahora se centra en programas de crédito, tokenizaciones y programas de créditos e integraciones de sistemas blockchain y libros de contabilidad autorizados. Tiene un B.S.E. en Ingeniería Informática y un Ph.D. en Nanociencia e Ingeniería de Microsistemas, ambos de la UNM