Los contratos inteligentes son la característica definitoria de blockchain que lo extiende más allá de un almacén de valor y una plataforma financiera sin confianza. Pero, ¿qué es realmente un contrato inteligente? En la primera introducción, son difíciles de comprender, pero de hecho son un corolario muy natural de blockchain. Si blockchain es de hecho la tecnología de cambio de paradigma que se supone que es, entonces es porque los contratos inteligentes nos permiten ver los problemas de una manera fundamentalmente diferente. Esta página tiene como objetivo desglosar los contratos inteligentes en términos simples de entender y luego ilustrar el alcance de su potencial.
En el nuevo paradigma blockchain, no existe un análogo inmediato para contratos inteligentes en lo que ya existe. Sin la confianza como un supuesto fundamental de la plataforma, blockchain es diferente.
Esperamos que sea claro para el lector en este punto que una base de datos administrada con participación descentralizada y abierta para el consenso y la criptografía de clave pública no es confiable. Puede representar saldos de cuenta y transacciones de proceso, y por lo tanto puede usarse como moneda. Los contratos inteligentes son la respuesta a la pregunta de qué más puede hacer.
Resulta que la respuesta es casi cualquier cosa. Los contratos inteligentes se crean utilizando una lógica generalizada y pueden realizar cualquier operación computacionalmente factible basada en las entradas, modificar su estado y transferir el valor desde su dirección. Analicemos la oración anterior en orden inverso para comprender realmente blockchain.
Transferir valor desde su dirección: Los contratos, al igual que su cuenta, tienen una dirección y un saldo. A diferencia de las cuentas, no tienen una clave privada asociada a su dirección. Para que un contrato inteligente envíe dinero, debe recibir instrucciones de su código.
Estado: Además, tienen otras variables de estado que pueden modificarse por su lógica. Las variables de estado no son tan diferentes a los saldos. Solo pueden modificarse mediante un conjunto de reglas conocidas por todos. Sin embargo, este conjunto de reglas es implementado por los usuarios en lugar de integrarse en el protocolo blockchain.
Entradas: El contrato inteligente tiene acceso a las siguientes entradas:
Su estado actual El estado de la cadena de bloques (por ejemplo, número de bloque y marca de tiempo) El remitente de la transacción El valor enviado junto con la transacción Un campo de datos opcional que puede instruir la lógica personalizada del contrato inteligente
Lógica computacionalmente factible / generalizada: Los contratos inteligentes son capaces de realizar cualquier pieza de lógica computacionalmente factible. Sin embargo, están vinculados computacionalmente por la cadena de bloques en la que se están ejecutando. Una blockchain es como una computadora global y tiene límites más estrictos en computación y almacenamiento que una computadora personal.
Ahora sabemos que los contratos inteligentes están controlados exclusivamente por su código y pueden hacer casi cualquier cosa. Pero, ¿cuándo se ejecuta este código y quién lo ejecuta? Al igual que enviar fondos, los contratos inteligentes se ejecutan mediante transacciones. Además del campo de valor que se utiliza para determinar cuánto dinero enviar, las transacciones también tienen un campo de datos. En las transacciones regulares, este campo de datos generalmente se deja en blanco. Sin embargo, si la dirección de recepción de la transacción es un contrato inteligente, el campo de datos se puede utilizar para activar la lógica en el contrato.
Cada contrato inteligente tiene un conjunto de funciones públicas que cualquiera puede llamar para ejecutar su lógica. Estas funciones pueden requerir fondos (siempre que se envíen fondos en una transacción regular), permisos especiales (por ejemplo, el remitente debe ser 0x0D8A07e01Fd9b3DA4ce78109DBDFd385bE59bAE2), o cualquier otra pieza lógica arbitraria (por ejemplo, el día es el 3 de enero de 2029 y los últimos bytes de el campo de datos en ASCII es "feliz aniversario"). Los contratos inteligentes deben y solo deben cumplir con su código.
Cualquiera también puede implementar un contrato inteligente. Esto se realiza colocando el código del contrato inteligente compilado en el campo de datos de una transacción y enviándolo a la dirección 0x0. La cadena de bloques entiende esto como un comando para implementar un nuevo contrato inteligente. Creará una nueva dirección con saldo y estado, y le vinculará el código. Esta dirección es ahora la dirección del contrato inteligente implementado.
El contrato implementado no necesita recordar quién lo implementó. Los contratos no tienen dueños, solo lógica. Así, el refrán común "código es ley". Sin embargo, es frecuente que los contratos inteligentes sigan a sus usuarios para limitar significativamente la funcionalidad. Por ejemplo, un contrato inteligente de lotería solo pagaría su premio gordo a los usuarios que gastaron fondos para comprar boletos. Una billetera con límite de tiempo solo desembolsaría fondos al beneficiario designado por el usuario que implementó y financió el contrato. La dirección de la cuenta pública del usuario se rastrea en el estado del contrato.
Después de que se despliega un contrato, está prácticamente en libertad y cualquier cosa definida por su código es un juego justo. Este es el verdadero poder de los contratos inteligentes. Son una plataforma equitativa que puede ser implementada y utilizada por cualquier persona. Son transparentes e imparciales. Su uso no puede ser censurado. Su estado no puede modificarse fuera de las reglas. La lógica podría definir los medios para transferir y crear valor. Por lo tanto, pueden crear nuevas economías que nunca antes habíamos visto.
CUEVA: con gran poder viene una gran responsabilidad. El hecho de que el código sea verificable no significa que haga lo que se supone que debe hacer. Por ejemplo, el contrato puede tener un error en el código que quema todos los fondos contenidos en él. Solo use contratos que hayan sido auditados por una autoridad en la que confíe en proporción a la cantidad de dinero que está confiando al contrato.
Transacción – el punto de entrada para llamar o implementar un contrato inteligente es la transacción. La dirección de recepción de la transacción es la dirección del contrato inteligente. Su campo de datos determina cómo usar el contrato. Finalmente, el valor de la transacción se deposita en el contrato inteligente y se distribuye de acuerdo con su lógica.
Token nativo – dado que los contratos inteligentes le permiten definir sus propios tokens (consulte ERC20 a continuación), el token nativo se refiere a la moneda subyacente de la cadena de bloques. Esta moneda se puede realizar transacciones y utilizar como entrada para contratos inteligentes. El token nativo es extra especial, ya que es el único token que se puede usar para pagar las tarifas de transacción y se puede dar a los nodos de consenso como incentivos para ejecutar la red. Se puede acceder en código utilizando variables integradas como "msg.value" o "account.balance". El saldo de una cuenta solo se puede aumentar si una transacción de autorización disminuye proporcionalmente el saldo de otra cuenta. Por lo tanto, el token nativo tiene un suministro estable, es fungible, es transferible y puede usarse como moneda real.
Gas – el gas es una medida de cuánto ancho de banda, cómputo y almacenamiento requiere su transacción. Para las llamadas de contrato inteligente, se mide cada operación y cada byte de almacenamiento. Por lo tanto, cada transacción consumirá una cierta cantidad de gas que debe pagar el operador. Una transacción tiene dos parámetros relacionados con el gas:
El límite de gas limita la cantidad máxima de gas permitida para procesar la transacción. Esto es para que no queme todo su dinero procesando un ciclo infinito, digamos. El precio del gas es la cantidad del token nativo que pagará el transactor por cada unidad de gas consumida. Los mineros priorizan las transacciones con precios de gas más altos cuando crean nuevos bloques.
El gas es un poco difícil de entender al principio. Es esencialmente la tarifa de transacción. Dado que blockchain está descentralizado, la carga de hacer los cálculos recae en el usuario. Afortunadamente, la mayoría de las billeteras usan estadísticas y ajustes preestablecidos para automatizar en gran medida este proceso.
DApp – una aplicación descentralizada o DApp es un contrato inteligente junto con un conjunto de interfaces y herramientas que interactúan con él. Por lo general, esto implica un front-end basado en web creado con la API web3. También podría involucrar servicios en segundo plano para procesar datos en forma legible por humanos o incluso enviar transacciones para coordinar operaciones con muchos usuarios.
ERC20 – El contrato inteligente más común que existe es un token ERC20, que es el sello distintivo del boom de ICO 2017. Un token ERC20 es una implementación de moneda construida con un contrato inteligente. Específicamente, es una interfaz estándar para un token fungible (que significa lo mismo). No debe confundirse con el token nativo de blockchain que tiene una funcionalidad única en blockchain. El ERC20 no tiene nada de especial, excepto que es un estándar utilizado por la mayoría de la comunidad blockchain. Los tokens ERC20 son una forma fácil y conveniente de escribir objetos de valor en su DApp. Muchos DApps implementan su propio contrato ERC20 como un token de utilidad para pagar los servicios en su DApp y crear seguridad criptoeconómica a través de incentivos. Debido a que la interfaz está estandarizada, se conectan automáticamente a varias otras aplicaciones, como intercambios descentralizados y billeteras.
ERC721 – Otro contrato inteligente común es el ERC721 comúnmente utilizado en juegos y otros activos tokenizados. ERC721 es una interfaz estándar para un token no fungible (lo que significa que cada uno es diferente). Por ejemplo, Cryptokitties es un popular juego de blockchain que se basa en un contrato ERC721: ¡cada gatito está representado por un token y es único!
DEX – un intercambio descentralizado o DEX es un contrato inteligente para el intercambio de tokens ERC20. Como es un contrato inteligente, es completamente automático y sin confianza. Hay muchos DEX y cada uno de ellos es diferente. Algunos usan órdenes de compra y venta coincidentes y otros usan creadores de mercado algorítmicos. Algunos tienen servicios fuera de la cadena para reducir los canales de transacciones y aumentar la escalabilidad.
Cartera Multi-Sig – a menudo, los fondos deben ser controlados por múltiples entidades y solo desembolsados si suficientes de estos signatarios están de acuerdo. Una billetera multi-sig almacena las direcciones de múltiples firmantes y un umbral de firma. Cada solicitud de retiro entra en un estado pendiente y solo se ejecuta si recibe suficientes transacciones de aprobación de otros signatarios. Otro caso de uso es para la recuperación de la cuenta. Hay un único firmante primario que puede desembolsar fondos de la billetera bajo su propia autoridad, y varios signatarios de recuperación que solo pueden desembolsar fondos colectivamente; los firmantes de recuperación solo son necesarios si el firmante primario pierde su clave privada.
DAO – una organización autónoma descentralizada es un órgano de gobierno cuyos votantes suelen ser poseedores de tokens de algún token de utilidad ERC20 subyacente del DAO. Los DAO pueden variar mucho en funcionalidad. Un DAO simple puede respaldar propuestas para desembolsar sus fondos que se aprueban al recibir el voto mayoritario (similar a una billetera de múltiples firmas si lo piensa). Los marcos DAO avanzados tienen módulos de estatutos conectables que pueden agregarse o eliminarse de un DAO desplegado en función del consenso mayoritario de los votantes y, por lo tanto, pueden evolucionar a lo largo del tiempo.
Fuera de la cadena – Como aprendimos anteriormente, los contratos inteligentes tienen un poder de procesamiento y almacenamiento limitado. Cada transacción tiene una tarifa basada en el uso actual de la red que puede ser bastante costosa. Para solucionar este problema (con compensaciones), algunos DApps tienen una funcionalidad que ocurre fuera de la cadena de bloques. ¿Cómo puede funcionar esto? Depende del contrato inteligente. Las operaciones básicas fuera de la cadena pueden hacer que un proveedor de servicios agregue varias transacciones y las envíe a los usuarios para cubrir las tarifas de transacción. Los servicios más avanzados pueden confiar en su propia cadena de bloques fuera de cadena o estructura similar a una cadena de bloques para alimentar datos externos. Los DApps fuera de la cadena existen en un espectro de confianza. Por ejemplo, un agregador no puede falsificar transacciones, sin embargo, se espera que esté en línea para la disponibilidad de los servicios. La confianza se vuelve un poco más complicada con las operaciones fuera de la cadena, ¡pero definitivamente aún es factible!
Cache – blockchain utiliza un brillante almacén de datos de valores clave llamado Patricia Tree (un tema para otro día) que tiene ciertas propiedades sorprendentes pero tiene poco soporte para datos históricos estructurados. Muchos DApps implementarán una aplicación separada
Por lo tanto, un caché es un servicio especial fuera de la cadena que (solo) lee datos de la cadena de bloques, los procesa y almacena en una forma fácilmente accesible.
Explorador de bloques – Un explorador de bloques es como un front-end para la cadena de bloques en sí. Le permite acceder a datos de consenso (por ejemplo, mineros de bloque o validadores, recompensas, etc.), datos de transacciones y estado. Los exploradores de bloques tienen una interfaz genérica para contratos inteligentes que le permite ver cosas como funciones públicas, variables de estado y código (explicado en la siguiente sección).
Variable de estado – como se describió anteriormente, cada contrato tiene una o más variables de estado que pueden ser manipuladas por la lógica. Pueden representar cualquier cosa, desde datos textuales hasta saldos de cuentas por valor de millones de dólares.
Función pública – Estas son las funciones de contrato inteligente que pueden llamar los usuarios desde las transacciones. Juntas, las funciones públicas definen la interfaz del contrato inteligente. Tenga en cuenta que los contratos inteligentes también pueden llamar a los métodos públicos de otros contratos inteligentes que permiten ecosistemas interoperables de contratos inteligentes. Por ejemplo, los DEX pueden funcionar con cualquier contrato inteligente que implemente la interfaz ERC20 estándar. Cada contrato tiene una función de recuperación especial que se llama si no se proporcionan datos. La función alternativa puede o no ser pública.
Ver función – Estas son funciones de contrato inteligente que no cambian su estado. Para el usuario final, las funciones de vista se utilizan para consultar el estado de un contrato inteligente. Por ejemplo, un contrato inteligente de billetera multi-sig podría tener una función de vista que devuelve el umbral de firma y la lista de firmantes.
EVM – significa Ethereum Virtual Machine y es la computadora que interpreta y ejecuta los contratos inteligentes. EVM es la máquina virtual blockchain más utilizada. Tenga en cuenta que este documento utiliza una terminología coherente con EVM. Existen otras máquinas virtuales que pueden funcionar ligeramente diferentes y utilizar una terminología diferente. Los conceptos clave siguen siendo los mismos. Virtual significa que se ejecuta dentro de un entorno virtual: una computadora simulada que se ejecuta dentro de otra computadora (o en este caso, toda una red descentralizada de computadoras).
Solidez – este es el primer y más utilizado lenguaje de contrato inteligente. Fue diseñado y lanzado con Ethereum, la primera plataforma de contrato inteligente. La sintaxis de Solidity se basa en Javascript, pero las similitudes terminan ahí. Solidity es una excelente opción de idioma debido a su gran base de usuarios y su conjunto de herramientas de soporte. Existen otras opciones, como Vyper, que se basa en Python y está restringido para imponer ciertas invariantes de seguridad.
Al igual que enviar dinero, la billetera es el punto de entrada para usar un contrato inteligente. Sin embargo, dado que requieren entradas más complejas que solo el valor y el receptor (en el caso de una transferencia de dinero), se necesitan interfaces avanzadas y personalizadas para interactuar con un contrato. Por ejemplo, si está utilizando una plataforma de negociación de predicciones como Augur, necesitaría especificar 1. cuál es su predicción y 2. cuánto desea anotar. Esta interfaz junto con el contrato inteligente se conoce como DApp o aplicación descentralizada. Se puede acceder a la mayoría de DApps a través de navegadores especializados o estándar con un complemento como metamask para la funcionalidad de billetera. La interfaz se conecta automáticamente a la billetera y genera las transacciones de contrato inteligente en función de la entrada del usuario. De esta forma, el usuario no necesita conocer el formato subyacente del mensaje requerido por el contrato.
Es importante tener en cuenta que si bien el usuario no necesita saber sobre esto, el usuario siempre puede elegir auditar las transacciones o incluso generar su propia transacción sin la interfaz. Por lo tanto, aunque la mayoría de estas interfaces están alojadas en servidores de confianza centralizados tradicionales, la descentralización no se ve comprometida porque 1. se pueden auditar completamente y 2. no son necesarios.
Para usar su primera aplicación ThunderCore DApp, ¡simplemente obtenga una billetera y algunos fondos y elija algo en ThunderCore Hub para probar!
Gracias a la gran cantidad de personas apasionadas en el ecosistema blockchain, ahora hay algunos tutoriales geniales disponibles en línea para despegar y desplegar su primer contrato inteligente. Dado que ThunderCore es compatible con EVM, cualquiera de estos tutoriales se aplicará igualmente a ThunderCore con una ventaja adicional de tiempos de confirmación rápidos y tarifas de transacción bajas.
El conjunto de herramientas para desarrolladores ya está súper maduro para lo nuevo que es el campo. A continuación se presentan algunas de las herramientas clave que debe conocer como desarrollador de contratos inteligentes:
Idioma – Vyper y Solidity son actualmente los dos lenguajes de contrato inteligente compatibles con EVM estables y son dos excelentes opciones. Muchos más están en desarrollo. El compilador convierte el lenguaje legible por humanos en código de bytes legible EVM que luego puede implementarse en la cadena de bloques.
Web3 – los contratos inteligentes son solo el backend de tus DApps. El front end se suele construir en la API web3. Web3 habla con uno de los muchos nodos completos en la red a través del protocolo Ethereum JSON RPC para leer el estado de los contratos y enviar transacciones al contrato para modificar su estado.
IDE – Remix es un gran IDE basado en la web para despegar con poca sobrecarga. Tiene un depurador incorporado y herramientas para probar sus contratos implementados. Los desarrolladores que esperan trabajar en proyectos más complejos con múltiples contratos y bibliotecas pueden trabajar con herramientas como Truffle.
Billetera – Dado que todas las acciones se realizan a través de transacciones, necesitará una billetera para implementar y probar su contrato inteligente al igual que enviaría dinero con blockchain. La mayoría de las cadenas de bloques ofrecen redes de prueba para que no gaste dinero real durante el desarrollo. También puede probar en su propia cadena local de forma gratuita.
Terminemos rompiendo un verdadero contrato inteligente. Para esto, elegí EasyInvestV por su simplicidad, efectividad y posible absurdo. EasyInvestV es un simple contrato inteligente tipo esquema ponzi. Las reglas son simples
Depositar dinero Puede retirar dinero a una tasa de 1/20 del monto total invertido por día SI hay fondos suficientes en el contrato
En particular, después de 20 días, se retirará de los depósitos de otras personas, recompensando así a los depositantes anticipados. En su apogeo, este contrato tenía más de 1470 ETH, que valía más de 300k USD en ese momento.
A continuación se muestra el código que también puede ver en Etherscan.
contrato EasyInvest5 {
// registra las cantidades invertidas
mapeo (dirección => uint256) público invertido;
// registra bloques en los que se realizaron inversiones
mapping (address => uint256) public atBlock; // esta función se llama cada vez que alguien envía una transacción a este contrato
función () pagadera externa {
// si el remitente (también conocido como USTED) invierte más de 0 éter
if (invertido (msg.sender)! = 0) {
// calcular la cantidad de beneficio como tal:
// monto = (monto invertido) * 5% * (bloques desde la última transacción) / 5900
// 5900 es un conteo de bloques promedio por día producido por la cadena de bloques Ethereum
uint256 cantidad = invertido (msg.sender) * 5/100 * (número de bloque – atBlock (msg.sender)) / 5900; // envía la cantidad calculada de éter directamente al remitente (también conocido como USTED)
msg.sender.transfer (cantidad);
} // registre el número de bloque y el monto invertido (valor msg.) de esta transacción
atBlock (msg.sender) = número de bloque;
invertido (msg.sender) + = msg.value;
}
}
Veamos esta línea por línea:
// registra las cantidades invertidas
mapeo (dirección => uint256) público invertido;
// registra bloques en los que se realizaron inversiones
mapeo (dirección => uint256) public atBlock;
Estas dos líneas definen las únicas variables de estado para el contrato. Estas son dos asignaciones que le indican cuánto ha invertido cada usuario (dirección) y qué número de bloque se realizó la última inversión.
// esta función se llama cada vez que alguien envía una transacción a este contrato
función () pagadera externa {
Solo hay una función en el contrato que sirve tanto para el depósito como para el retiro. Esta función tiene la firma especial de la función fallback (function ()) que en este caso significa que capturará todas las llamadas de función a este contrato inteligente. Está marcado como significado externo, se puede llamar desde una transacción y se le puede enviar un valor de significado pagadero (ETH en este caso).
// registrar el número de bloque y la cantidad invertida (valor msg.) de esta transacción
atBlock (msg.sender) = número de bloque;
invertido (msg.sender) + = msg.value;
Saltando al final de esta función, vemos que cada vez que llama a esta función, realiza un seguimiento del monto total que su cuenta ha enviado al contrato y la última vez que la dirección usó el contrato. El msg.sender incorporado es la dirección que actualmente llama a la función, msg.value es la cantidad de valor transferido con la transacción y block.number es el número de bloque actual. El valor enviado a este contrato se almacena en la dirección del contrato.
// si el remitente (también conocido como USTED) invierte más de 0 éter
if (invertido (msg.sender)! = 0) {
// calcular la cantidad de beneficio como tal:
// monto = (monto invertido) * 5% * (bloques desde la última transacción) / 5900
// 5900 es un conteo de bloques promedio por día producido por la cadena de bloques Ethereum
uint256 cantidad = invertido (msg.sender) * 5/100 * (número de bloque – atBlock (msg.sender)) / 5900;
Volviendo al principio, primero verificamos la condición de si su dirección ha invertido algún dinero. Si es así, avanzamos y retiramos fondos a una tasa de 1/20 del monto total invertido por día.
// envía la cantidad calculada de éter directamente al remitente (también conocido como USTED)
msg.sender.transfer (cantidad);
Esta función incorporada final transfiere el valor de la dirección del contrato a la dirección de la persona que llama. Notablemente, si no hay fondos suficientes en el contrato para el retiro, ¡la transacción completa fallará y habrá perdido su inversión!