Introducción a los contratos inteligentes

En este artículo, veremos qué son los contratos inteligentes, qué son, nos familiarizaremos con las diferentes plataformas de contratos inteligentes, sus características y también discutiremos cómo funcionan y qué ventajas pueden aportar. Este material será muy útil para los lectores que no estén familiarizados con el tema de los contratos inteligentes, pero quieran acercarse a su comprensión.

Contrato regular vs. contrato inteligente

Antes de profundizar en los detalles, tomemos un ejemplo de las diferencias entre un contrato normal, que se especifica en papel, y un contrato inteligente, que se representa digitalmente.

Introducción a los contratos inteligentes

¿Cómo funcionaba esto antes de la llegada de los contratos inteligentes? Imaginemos un grupo de personas que quieren establecer ciertas reglas y condiciones para la distribución de valores, así como un cierto mecanismo para garantizar la implementación de esta distribución de acuerdo con las reglas y condiciones dadas. Luego se reunían, redactaban un papel en el que anotaban sus datos de identificación, los términos, los valores involucrados, los fechaban y firmaban. Este contrato también fue certificado por una parte de confianza, como por ejemplo un notario. Además, estas personas fueron en diferentes direcciones con su copia en papel de dicho contrato y comenzaron a realizar algunas acciones que podrían no corresponder al contrato en sí, es decir, hicieron una cosa, pero en papel se certificó que debían hacer algo. completamente diferente. ¿Y cómo salir de esta situación? De hecho, uno de los miembros del grupo necesita tomar este documento, reunir algunas pruebas, llevarlas a los tribunales y lograr el cumplimiento entre el contrato y las acciones reales. Muy a menudo es difícil lograr una implementación justa de este contrato, lo que tiene consecuencias desagradables.

¿Qué se puede decir de los contratos inteligentes? Combinan tanto la posibilidad de redactar los términos del contrato como el mecanismo para su estricta implementación. Si se han establecido las condiciones y se ha firmado la transacción o solicitud correspondiente, una vez que se haya aceptado esa solicitud o transacción, ya no es posible cambiar las condiciones ni influir en su implementación.

Hay un validador o una red completa, así como una base de datos que almacena todos los contratos inteligentes que se enviaron para su ejecución en estricto orden cronológico. También es importante que esta base de datos contenga todas las condiciones desencadenantes para la ejecución del contrato inteligente. Además, deberá tener en cuenta el propio valor cuya distribución se describe en el contrato. Si esto se aplica a alguna moneda digital, entonces esta base de datos debería tenerlo en cuenta.

En otras palabras, los validadores de contratos inteligentes deben tener acceso a todos los datos con los que opera el contrato inteligente. Por ejemplo, se debe utilizar una única base de datos para contabilizar simultáneamente las monedas digitales, los saldos de los usuarios, las transacciones de los usuarios y las marcas de tiempo. Luego, en un contrato inteligente, la condición puede ser el saldo del usuario en una determinada moneda, la llegada de una determinada hora o el hecho de que se haya realizado una determinada transacción, pero nada más.

Definición de contrato inteligente

En general, la terminología en sí fue acuñada por el investigador Nick Szabo y utilizada por primera vez en 1994, y fue documentada en 1997 en un artículo que describe la idea misma de contratos inteligentes.

Los contratos inteligentes implican que se realiza cierta automatización de la distribución de valor, que sólo puede depender de aquellas condiciones que están predeterminadas de antemano. En su forma más simple, parece un contrato con términos estrictamente definidos, firmado por determinadas partes.

Los contratos inteligentes están diseñados para minimizar la confianza en terceros. A veces el centro de toma de decisiones del que depende todo queda completamente excluido. Además, dichos contratos son más fáciles de auditar. Esto es una consecuencia de algunas características de diseño de dicho sistema, pero la mayoría de las veces entendemos por contrato inteligente un entorno descentralizado y la presencia de funciones que permiten a cualquiera analizar la base de datos y realizar una auditoría completa de la ejecución de los contratos. Esto garantiza la protección contra cambios retroactivos de datos que implicarían cambios en la ejecución del propio contrato. La digitalización de la mayoría de los procesos al crear y lanzar un contrato inteligente a menudo simplifica la tecnología y el costo de su implementación.

Un ejemplo sencillo: servicio de depósito en garantía

Veamos un ejemplo muy sencillo. Le ayudará a comprender mejor la funcionalidad de los contratos inteligentes, así como a comprender mejor en qué casos deben utilizarse.

Introducción a los contratos inteligentes

También se puede implementar utilizando Bitcoin, aunque en este momento Bitcoin difícilmente puede considerarse una plataforma completa para contratos inteligentes. Entonces, tenemos algún comprador y tenemos una tienda en línea. Un cliente quiere comprar un monitor en esta tienda. En el caso más sencillo, el comprador completa y envía un pago, y la tienda online lo acepta, lo confirma y luego envía la mercancía. Sin embargo, en esta situación se necesita una gran confianza: el comprador debe confiar en la tienda en línea por el coste total del monitor. Dado que una tienda en línea puede tener mala reputación a los ojos del comprador, existe el riesgo de que, por algún motivo, después de aceptar el pago, la tienda rechace el servicio y no envíe la mercancía al comprador. Por lo tanto, el comprador se pregunta (y, en consecuencia, la tienda en línea hace esta pregunta) qué se puede aplicar en este caso para minimizar tales riesgos y hacer que dichas transacciones sean más confiables.

En el caso de Bitcoin, es posible permitir que el comprador y el vendedor seleccionen de forma independiente un mediador. Hay muchas personas que participan en la resolución de temas controvertidos. Y nuestros participantes pueden elegir de una lista general de mediadores en aquel en el que confiarán. Juntos crean una dirección de múltiples firmas 2 de 3 donde hay tres claves y se requieren dos firmas con dos claves cualesquiera para gastar monedas de esa dirección. Una clave pertenecerá al comprador, la segunda a la tienda online y la tercera al mediador. Y a dicha dirección multifirma el comprador enviará el importe necesario para pagar el monitor. Ahora, cuando el vendedor ve que el dinero está bloqueado por algún tiempo en una dirección multifirma que depende de él, puede enviar el monitor por correo de manera segura.

A continuación, el comprador recibe el paquete, inspecciona la mercancía y toma una decisión sobre la compra final. Puede estar completamente de acuerdo con el servicio prestado y firmar la transacción con su clave, donde transfiere monedas desde la dirección de firma múltiple al vendedor, o puede no estar satisfecho con algo. En el segundo caso, contacta a un mediador para armar una transacción alternativa que distribuirá esas monedas de manera diferente.

Digamos que el monitor llegó un poco rayado y el kit no incluía cable para conectarlo a la computadora, aunque en el sitio web de la tienda en línea decía que el cable debería estar incluido en el kit. Luego, el comprador reúne las pruebas necesarias para demostrarle al mediador que fue engañado en esta situación: toma capturas de pantalla del sitio, toma una foto del recibo del correo, toma una foto de los rayones en el monitor y muestra que el sello fue se rompió y se sacó el cable. La tienda online, a su vez, recoge sus pruebas y las transfiere al mediador.

El mediador está interesado en satisfacer simultáneamente tanto la indignación del comprador como los intereses de la tienda online (quedará claro por qué más adelante). Constituye una transacción en la que monedas de una dirección multifirma se gastarán en cierta proporción entre el comprador, la tienda online y el mediador, ya que éste se queda con una parte como recompensa por su trabajo. Digamos que el 90% del monto total va al vendedor, el 5% al ​​mediador y el 5% de compensación al comprador. El mediador firma esta transacción con su clave, pero aún no se puede aplicar, porque requiere dos firmas, pero solo vale una. Envía dicha transacción tanto al comprador como al vendedor. Si al menos uno de ellos está satisfecho con esta opción de redistribución de monedas, la transacción se firmará previamente y se distribuirá a la red. Para validarlo basta que una de las partes de la transacción esté de acuerdo con la opción del mediador.

Es importante elegir inicialmente un mediador para que ambos participantes confíen en él. En este caso, actuará independientemente de los intereses de uno u otro y evaluará objetivamente la situación. Si el mediador no ofrece una opción para distribuir monedas que satisfaga al menos a un participante, entonces, habiendo acordado juntos, tanto el comprador como la tienda en línea pueden enviar las monedas a una nueva dirección multifirma poniendo sus dos firmas. La nueva dirección multifirma se redactará con un mediador diferente, que puede ser más competente en el asunto y brindar una mejor opción.

Ejemplo con dormitorio y nevera.

Veamos un ejemplo más complejo que muestra las capacidades de un contrato inteligente de manera más explícita.

Introducción a los contratos inteligentes

Digamos que hay tres chicos que recientemente se mudaron al mismo dormitorio. Los tres están interesados ​​en comprar un refrigerador para su habitación que puedan usar juntos. Uno de ellos se ofreció a recaudar la cantidad necesaria para comprar un frigorífico y negociar con el vendedor. Sin embargo, se conocieron recientemente y no hay suficiente confianza entre ellos. Evidentemente dos de ellos se arriesgan al darle dinero al tercero. Además, deben llegar a un acuerdo para elegir al vendedor.

Pueden utilizar el servicio de escrow, es decir, elegir un mediador que supervisará la ejecución de la transacción y resolverá cuestiones controvertidas si surgieran. Luego, una vez acordado, redactan un contrato inteligente y prescriben en él determinadas condiciones.

La primera condición es que antes de cierto tiempo, digamos dentro de una semana, la cuenta de contrato inteligente correspondiente debe recibir tres pagos de determinadas direcciones por una determinada cantidad. Si esto no sucede, el contrato inteligente deja de ejecutarse y devuelve las monedas a todos los participantes. Si se cumple la condición, se establecen los valores de los identificadores del vendedor y del mediador, y se verifica que todos los participantes estén de acuerdo con la elección del vendedor y del mediador. Cuando se cumplan todas las condiciones, los fondos se transferirán a las direcciones especificadas. Este enfoque puede proteger a los participantes del fraude de cualquier lado y, en general, elimina la necesidad de confiar.

Vemos en este ejemplo el principio mismo de que esta capacidad de establecer parámetros paso a paso para cumplir cada condición permite crear sistemas de cualquier complejidad y profundidad de niveles anidados. Además, primero puede definir la primera condición en el contrato inteligente y solo después de su cumplimiento puede establecer parámetros para la siguiente condición. En otras palabras, la condición está formalmente escrita y sus parámetros ya se pueden configurar durante su funcionamiento.

Clasificación de contratos inteligentes

Para la clasificación, puede establecer diferentes grupos de criterios. Sin embargo, en el momento del desarrollo tecnológico, cuatro de ellos son relevantes.

Los contratos inteligentes se pueden distinguir por su entorno de ejecución, que puede ser centralizado o descentralizado. En el caso de la descentralización, tenemos mucha mayor independencia y tolerancia a fallos a la hora de ejecutar contratos inteligentes.

También se pueden distinguir por el proceso de establecimiento y cumplimiento de condiciones: pueden ser libremente programables, limitados o predefinidos, es decir, estrictamente tipificados. Cuando solo hay 4 contratos inteligentes específicos en la plataforma de contratos inteligentes, los parámetros para ellos se pueden configurar de cualquier forma. En consecuencia, configurarlos es mucho más sencillo: seleccionamos un contrato de la lista y pasamos los parámetros.

Según el método de iniciación, existen contratos inteligentes automatizados, es decir, cuando se dan ciertas condiciones, son autoejecutables, y hay contratos en los que se especifican las condiciones, pero la plataforma no verifica automáticamente su cumplimiento; para ello deben iniciarse por separado.

Además, los contratos inteligentes varían en su nivel de privacidad. Pueden ser completamente abiertos, parcial o completamente confidenciales. Esto último significa que los observadores externos no ven los términos de los contratos inteligentes. Sin embargo, el tema de la privacidad es muy amplio y es mejor considerarlo por separado del artículo actual.

A continuación, analizaremos más de cerca los primeros tres criterios para aportar más claridad a la comprensión del tema actual.

Contratos inteligentes por tiempo de ejecución

Introducción a los contratos inteligentes

Según el entorno de ejecución, se hace una distinción entre plataformas de contratos inteligentes centralizadas y descentralizadas. En el caso de los contratos digitales centralizados se utiliza un único servicio, donde existe un solo validador y puede haber un servicio de respaldo y recuperación, que también se gestiona de forma centralizada. Existe una base de datos que almacena toda la información necesaria para establecer los términos del contrato inteligente y distribuir el valor que se tiene en cuenta en esta misma base de datos de servicios. Un servicio centralizado de este tipo tiene un cliente que establece condiciones para determinadas solicitudes y utiliza dichos contratos. Debido a la naturaleza centralizada de la plataforma, los mecanismos de autenticación pueden ser menos seguros que en las criptomonedas.

Como ejemplo, podemos tomar proveedores de comunicaciones móviles (diferentes operadores de telefonía móvil). Digamos que un determinado operador mantiene un registro centralizado del tráfico en sus servidores, que se puede transmitir en diferentes formatos, por ejemplo: en forma de llamadas de voz, transmisión de SMS, tráfico de Internet móvil y según diferentes estándares, y también mantiene registros. de fondos en los saldos de los usuarios. En consecuencia, el proveedor de comunicaciones móviles puede redactar contratos para contabilizar los servicios prestados y su pago con diferentes condiciones. En este caso, es fácil establecer condiciones como "envíe un SMS con tal o cual código a tal o cual número y recibirá tales o cuales condiciones para la distribución del tráfico".

Se puede dar un ejemplo más: los bancos tradicionales con una funcionalidad ampliada de banca por Internet y contratos muy simples como pagos regulares, conversión automática de pagos entrantes, deducción automática de intereses a una cuenta específica, etc.

Si hablamos de contratos inteligentes con un entorno de ejecución descentralizado, entonces tenemos un grupo de validadores. Idealmente, cualquiera puede convertirse en validador. Gracias al protocolo de sincronización de la base de datos y al logro de un consenso, tenemos una base de datos común que ahora almacenará todas las transacciones con contratos estrictamente descritos, y no algunas consultas condicionales, cuyos formatos cambian a menudo y no hay una especificación abierta. Aquí, las transacciones contendrán instrucciones para ejecutar el contrato de acuerdo con una especificación estricta. Esta especificación es abierta y, por tanto, los propios usuarios de la plataforma pueden auditar y validar contratos inteligentes. Aquí vemos que las plataformas descentralizadas son superiores a las centralizadas en términos de independencia y tolerancia a fallos, pero su diseño y mantenimiento son mucho más complejos.

Contratos inteligentes por el método de establecimiento y cumplimiento de condiciones.

Ahora echemos un vistazo más de cerca a cómo los contratos inteligentes pueden diferir en la forma en que establecen y cumplen las condiciones. Aquí centramos nuestra atención en los contratos inteligentes que son programables aleatoriamente y Turing completos. Un contrato inteligente completo de Turing le permite establecer casi cualquier algoritmo como condición para la ejecución del contrato: ciclos de escritura, algunas funciones para calcular probabilidades y similares, hasta sus propios algoritmos de firma electrónica. En este caso, nos referimos a una escritura lógica verdaderamente arbitraria.

También existen contratos inteligentes arbitrarios, pero no contratos completos de Turing. Esto incluye Bitcoin y Litecoin con su propio script. Esto significa que solo puede usar ciertas operaciones en cualquier orden, pero ya no puede escribir bucles ni sus propios algoritmos.

Además, existen plataformas de contratos inteligentes que implementan contratos inteligentes predefinidos. Estos incluyen Bitshares y Steemit. Bitshares tiene una gama de contratos inteligentes para el comercio, la gestión de cuentas, la gestión de la propia plataforma y sus parámetros. Steemit es una plataforma similar, pero ya no se centra en la emisión de tokens y el comercio, como Bitshares, sino en blogs, es decir, almacena y procesa contenido de forma descentralizada.

Los contratos arbitrarios completos de Turing incluyen la plataforma Ethereum y RootStock, que aún está en desarrollo. Por lo tanto, a continuación nos detendremos con un poco más de detalle en la plataforma de contratos inteligentes Ethereum.

Contratos inteligentes por método de iniciación

Según el método de iniciación, los contratos inteligentes también se pueden dividir en al menos dos grupos: automatizados y manuales (no automatizados). Los automatizados se caracterizan por el hecho de que, teniendo en cuenta todos los parámetros y condiciones conocidos, el contrato inteligente se ejecuta de forma completamente automática, es decir, no requiere enviar transacciones adicionales ni gastar una comisión adicional en cada ejecución posterior. La propia plataforma tiene todos los datos para calcular cómo se completará el contrato inteligente. La lógica allí no es arbitraria, sino predeterminada y todo esto es predecible. Es decir, se puede estimar de antemano la complejidad de ejecutar un contrato inteligente, utilizar algún tipo de comisión constante para ello y todos los procesos para su implementación son más eficientes.

Para los contratos inteligentes que se programan libremente, la ejecución no está automatizada. Para iniciar un contrato inteligente de este tipo, en prácticamente cada paso es necesario crear una nueva transacción, que llamará a la siguiente etapa de ejecución o al siguiente método de contrato inteligente, pagar la comisión correspondiente y esperar a que se confirme la transacción. La ejecución puede completarse exitosamente o no, porque el código del contrato inteligente es arbitrario y pueden aparecer algunos momentos impredecibles, como un bucle eterno, falta de algunos parámetros y argumentos, excepciones no controladas, etc.

Cuentas Etereum

Tipos de cuentas de Ethereum

Veamos qué tipos de cuentas puede haber en la plataforma Ethereum. Aquí sólo hay dos tipos de cuentas y no hay otras opciones. El primer tipo se llama cuenta de usuario, el segundo es cuenta de contrato. Averigüemos en qué se diferencian.

La cuenta de usuario está controlada únicamente por la clave personal de la firma electrónica. El propietario de la cuenta genera su propio par de claves para la firma electrónica utilizando el algoritmo ECDSA (Algoritmo de firma digital de curva elíptica). Sólo las transacciones firmadas con esta clave pueden cambiar el estado de esta cuenta.

Se proporciona una lógica separada para la cuenta de contrato inteligente. Solo puede controlarse mediante un código de software predefinido que determina completamente el comportamiento del contrato inteligente: cómo gestionará sus monedas en determinadas circunstancias, por iniciativa de qué usuario y bajo qué condiciones adicionales se distribuirán estas monedas. Si los desarrolladores no proporcionan algunos puntos en el código del programa, pueden surgir problemas. Por ejemplo, un contrato inteligente puede recibir un determinado estado en el que no acepta el inicio de una ejecución adicional por parte de ninguno de los usuarios. En este caso, las monedas en realidad se congelarán, porque el contrato inteligente no prevé la salida de este estado.

Cómo se crean las cuentas en Ethereum

En el caso de una cuenta de usuario, el propietario genera de forma independiente un par de claves utilizando ECDSA. Es importante señalar que Ethereum utiliza exactamente el mismo algoritmo y exactamente la misma curva elíptica para las firmas electrónicas que Bitcoin, pero la dirección se calcula de una manera ligeramente diferente. Aquí ya no se utiliza el resultado del hash doble, como en Bitcoin, sino que se proporciona un hash simple con la función Keccak con una longitud de 256 bits. Los bits menos significativos se eliminan del valor resultante, es decir, los 160 bits menos significativos del valor hash de salida. Como resultado, obtenemos una dirección en Ethereum. De hecho, ocupa 20 bytes.

Tenga en cuenta que el identificador de cuenta en Ethereum está codificado en hexadecimal sin aplicar una suma de verificación, a diferencia de Bitcoin y muchos otros sistemas, donde la dirección está codificada en un sistema numérico base 58 con la adición de una suma de verificación. Esto significa que hay que tener cuidado al trabajar con identificadores de cuentas en Ethereum: incluso un error en el identificador provocará la pérdida de monedas.

Hay una característica importante y es que se crea una cuenta de usuario a nivel de base de datos general en el momento en que acepta el primer pago entrante.

Crear una cuenta de contrato inteligente requiere un enfoque completamente diferente. Inicialmente, uno de los usuarios escribe el código fuente del contrato inteligente, después de lo cual el código pasa a través de un compilador especial para la plataforma Ethereum, obteniendo el código de bytes para su propia máquina virtual Ethereum. El código de bytes resultante se coloca en un campo especial de la transacción. Está certificado en nombre de la cuenta del iniciador. A continuación, esta transacción se propaga por la red y coloca el código de contrato inteligente. La comisión por la transacción y, en consecuencia, por la ejecución del contrato se retira del saldo de la cuenta del iniciador.

Cada contrato inteligente contiene necesariamente su propio constructor (de este contrato). Puede estar vacío o puede tener contenido. Después de ejecutar el constructor, se crea un identificador de cuenta de contrato inteligente, mediante el cual puede enviar monedas, llamar a ciertos métodos de contrato inteligente, etc.

Estructura de transacción de Ethereum

Para que quede más claro, comenzaremos a observar la estructura de una transacción de Ethereum y un ejemplo de código de contrato inteligente.

Introducción a los contratos inteligentes

Una transacción de Ethereum consta de varios campos. El primero de ellos, nonce, es un determinado número de serie de la transacción relativo a la propia cuenta que la distribuye y es su autor. Esto es necesario para distinguir transacciones dobles, es decir, para excluir el caso en que la misma transacción se acepta dos veces. Al utilizar un identificador, cada transacción tiene un valor hash único.

Luego viene un campo como precio del gas. Esto indica el precio al que la moneda base Ethereum se convierte en gas, que se utiliza para pagar la ejecución del contrato inteligente y la asignación del recurso de la máquina virtual. ¿Qué significa?

En Bitcoin, las tarifas se pagan directamente mediante la moneda base: el propio Bitcoin. Esto es posible gracias a un mecanismo sencillo para calcularlos: pagamos estrictamente por la cantidad de datos contenidos en la transacción. En Ethereum la situación es más complicada, porque es muy difícil confiar en el volumen de datos de las transacciones. Aquí, la transacción también puede contener código de programa que se ejecutará en la máquina virtual, y cada operación de la máquina virtual puede tener una complejidad diferente. También hay operaciones que asignan memoria para variables. Tendrán su propia complejidad, de la que dependerá el pago de cada operación.

El coste de cada operación en gas equivalente será constante. Se introduce específicamente para determinar el costo constante de cada operación. Dependiendo de la carga de la red cambiará el precio del gas, es decir, el coeficiente según el cual la moneda base se convertirá en esta unidad auxiliar para pagar la comisión.

Hay una característica más de una transacción en Ethereum: el bytecode que contiene para su ejecución en una máquina virtual se ejecutará hasta que se complete con algún resultado (éxito o fracaso) o hasta que se agote una cierta cantidad de monedas asignadas para pagar la comisión. . Es para evitar una situación en la que, en caso de algún error, todas las monedas de la cuenta del remitente se gasten en comisión (por ejemplo, algún tipo de ciclo eterno iniciado en una máquina virtual), existe el siguiente campo: empezar a acelerar (a menudo llamado límite de gas): determina la cantidad máxima de monedas que el remitente está dispuesto a gastar para completar una determinada transacción.

El siguiente campo se llama dirección de destino. Esto incluye la dirección del destinatario de las monedas o la dirección de un contrato inteligente específico cuyos métodos se llamarán. Después viene el campo propuesta de, donde se ingresa la cantidad de monedas que se envían a la dirección de destino.

El siguiente es un campo interesante llamado datos, donde encaja toda la estructura. Este no es un campo separado, sino una estructura completa en la que se define el código de la máquina virtual. Puede colocar datos arbitrarios aquí; existen reglas separadas para esto.

Y el último campo se llama firma. Contiene simultáneamente tanto la firma electrónica del autor de esta transacción como la clave pública con la que se verificará esta firma. A partir de la clave pública se puede obtener el identificador de cuenta del remitente de esta transacción, es decir, identificar de forma única la cuenta del remitente en el propio sistema. Descubrimos lo principal sobre la estructura de la transacción.

Ejemplo de código de contrato inteligente para Solidity

Ahora echemos un vistazo más de cerca al contrato inteligente más simple usando un ejemplo.

contract Bank {
    address owner;
    mapping(address => uint) balances;
    
    function Bank() {
        owner = msg.sender;
    }

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
        if (balances[msg.sender] >= amount) {
            balances[msg.sender] -= amount;
            msg.sender.transfer(amount);
        }
    }

    function getMyBalance() public view returns(uint) {
        return balances[msg.sender];
    }

    function kill() public {
        if (msg.sender == owner)
            selfdestruct(owner);
    }
}

Arriba hay un código fuente simplificado que puede contener las monedas de los usuarios y devolverlas cuando lo soliciten.

Entonces, existe un contrato inteligente bancario que realiza las siguientes funciones: acumula monedas en su saldo, es decir, cuando se confirma una transacción y se coloca dicho contrato inteligente, se crea una nueva cuenta que puede contener monedas en su saldo; recuerda a los usuarios y la distribución de monedas entre ellos; Tiene varios métodos para administrar saldos, es decir, es posible reponer, retirar y consultar el saldo del usuario.

Repasemos cada línea del código fuente. Este contrato tiene campos constantes. Uno de ellos, de tipo dirección, se llama propietario. Aquí el contrato recuerda la dirección del usuario que creó este contrato inteligente. Además, existe una estructura dinámica que mantiene la correspondencia entre las direcciones de los usuarios y los saldos.

A esto le sigue el método bancario: tiene el mismo nombre que el contrato. En consecuencia, este es su constructor. Aquí a la variable propietario se le asigna la dirección de la persona que colocó este contrato inteligente en la red. Esto es lo único que sucede en este constructor. Es decir, msg en este caso son exactamente los datos que se transfirieron a la máquina virtual junto con la transacción que contiene el código completo de este contrato. En consecuencia, msg.sender es el autor de esta transacción que aloja este código. Será el propietario del contrato inteligente.

El método de depósito le permite transferir una cierta cantidad de monedas a la cuenta del contrato mediante transacción. En este caso, el contrato inteligente, al recibir estas monedas, las deja en su balance, pero registra en la estructura de balances quién fue exactamente el remitente de estas monedas para saber a quién pertenecen.

El siguiente método se llama retiro y requiere un parámetro: la cantidad de monedas que alguien quiere retirar de este banco. Esto verifica si hay suficientes monedas en el saldo del usuario que llama a este método para enviarlas. Si hay suficientes, entonces el contrato inteligente devuelve esa cantidad de monedas a la persona que llama.

Luego viene el método para verificar el saldo actual del usuario. Quien llame a este método se utilizará para recuperar este saldo en el contrato inteligente. Vale la pena señalar que el modificador de este método es vista. Esto significa que el método en sí no cambia las variables de su clase de ninguna manera y en realidad es solo un método de lectura. No se crea ninguna transacción separada para llamar a este método, no se paga ninguna tarifa y todos los cálculos se realizan localmente, después de lo cual el usuario recibe el resultado.

El método Kill es necesario para destruir el estado del contrato inteligente. Y aquí hay una verificación adicional de si la persona que llama a este método es el propietario de este contrato. Si es así, entonces el contrato se autodestruye y la función de destrucción toma un parámetro: el identificador de la cuenta a la que el contrato enviará todas las monedas restantes en su saldo. En este caso, las monedas restantes irán automáticamente a la dirección del propietario del contrato.

¿Cómo funciona un nodo completo en la red Ethereum?

Veamos esquemáticamente cómo se ejecutan dichos contratos inteligentes en la plataforma Ethereum y cómo funciona un nodo de red completo.

Introducción a los contratos inteligentes

Un nodo completo de la red Ethereum debe tener al menos cuatro módulos.
El primero, como ocurre con cualquier protocolo descentralizado, es el módulo de red P2P, un módulo para conectarse a la red y trabajar con otros nodos, donde se intercambian bloques, transacciones e información sobre otros nodos. Este es un componente tradicional de todas las criptomonedas descentralizadas.

A continuación, tenemos un módulo para almacenar datos de blockchain, procesarlos, elegir una rama prioritaria, agregar bloques, desvincular bloques, validar estos bloques, etc.

El tercer módulo se llama EVM (máquina virtual Ethereum): es una máquina virtual que recibe código de bytes de las transacciones de Ethereum. Este módulo toma el estado actual de una cuenta en particular y realiza cambios en su estado según el código de bytes recibido. La versión de la máquina virtual en cada nodo de la red debe ser la misma. Los cálculos que se realizan en cada nodo de Ethereum son exactamente los mismos, pero se producen de forma asincrónica: alguien verifica y acepta esta transacción antes, es decir, ejecuta todo el código contenido en ella, y alguien más tarde. En consecuencia, cuando se crea una transacción, se distribuye a la red, los nodos la aceptan, y en el momento de la verificación, de la misma manera que se ejecuta Bitcoin Script en Bitcoin, aquí se ejecuta el código de bytes de la máquina virtual.

Una transacción se considera verificada si se ha ejecutado todo el código contenido en ella, se ha generado un nuevo estado de una determinada cuenta y se ha guardado hasta que quede claro si esta transacción se ha aplicado o no. Si se aplica la transacción, entonces este estado se considera no solo completado, sino también actual. Existe una base de datos que almacena el estado de cada cuenta para cada nodo de la red. Debido a que todos los cálculos se realizan de la misma manera y el estado de la cadena de bloques es el mismo, la base de datos que contiene los estados de todas las cuentas también será la misma para cada nodo.

Mitos y limitaciones de los contratos inteligentes

En cuanto a las restricciones que existen para plataformas de contratos inteligentes similares a Ethereum, se pueden citar las siguientes:

  • ejecución de código;
  • asignar memoria;
  • datos de cadena de bloques;
  • enviar pagos;
  • crear nuevo contrato;
  • llamar a otros contratos.

Veamos las restricciones que se imponen a una máquina virtual y, en consecuencia, disipemos algunos mitos sobre los contratos inteligentes. En una máquina virtual, que puede estar no solo en Ethereum, sino también en plataformas similares, puede realizar operaciones lógicas verdaderamente arbitrarias, es decir, escribir código y se ejecutará allí, además puede asignar memoria. Sin embargo, la tarifa se paga por separado por cada operación y por cada unidad adicional de memoria asignada.

A continuación, la máquina virtual puede leer datos de la base de datos de blockchain para utilizarlos como disparador para ejecutar una u otra lógica de contrato inteligente. La máquina virtual puede crear y enviar transacciones, puede crear nuevos contratos y llamar a métodos de otros contratos inteligentes que ya están publicados en la red: existentes, disponibles, etc.

El mito más común es que los contratos inteligentes de Ethereum pueden utilizar información de cualquier recurso de Internet en sus términos. La verdad es que una máquina virtual no puede enviar una solicitud de red a algún recurso de información externo en Internet, es decir, es imposible escribir un contrato inteligente que distribuya valor entre los usuarios dependiendo, por ejemplo, del clima exterior. o quién ganó algún campeonato, o en base a qué otro incidente ocurrió en el mundo exterior, porque la información sobre estos incidentes simplemente no está en la base de datos de la propia plataforma. Es decir, no hay nada sobre esto en la cadena de bloques. Si no aparece allí, entonces la máquina virtual no puede utilizar estos datos como disparadores.

Desventajas de Ethereum

Enumeremos los principales. La primera desventaja es que existen algunas dificultades para diseñar, desarrollar y probar contratos inteligentes en Ethereum (Ethereum utiliza el lenguaje Solidity para escribir contratos inteligentes). De hecho, la práctica demuestra que un porcentaje muy grande de todos los errores se debe al factor humano. En realidad, esto es cierto para los contratos inteligentes de Ethereum ya escritos que tienen una complejidad media o superior. Si en el caso de los contratos inteligentes simples la probabilidad de error es pequeña, en los contratos inteligentes complejos se producen muy a menudo errores que conducen al robo de fondos, su congelación, la destrucción inesperada de los contratos inteligentes, etc. conocido.

La segunda desventaja es que la máquina virtual en sí no es perfecta, ya que también está escrita por personas. Puede ejecutar comandos arbitrarios, y ahí radica la vulnerabilidad: una serie de comandos se pueden configurar de una manera determinada que tendrá consecuencias imprevistas de antemano. Esta es un área muy compleja, pero ya existen varios estudios que demuestran que estas vulnerabilidades existen en la versión actual de la red Ethereum y pueden provocar el fracaso de muchos contratos inteligentes.

Otra gran dificultad, puede considerarse una desventaja. Consiste en el hecho de que, práctica o técnicamente, puedes llegar a la conclusión de que si compilas el código de bytes de un contrato que se ejecutará en una máquina virtual, puedes determinar un orden específico de operaciones. Cuando se realizan juntas, estas operaciones cargarán enormemente la máquina virtual y la ralentizarán de manera desproporcionada con respecto a la tarifa que se pagó por realizar estas operaciones.

En el pasado, ya hubo un período en el desarrollo de Ethereum, en el que muchos chicos que entendían en detalle el funcionamiento de una máquina virtual encontraron tales vulnerabilidades. De hecho, las transacciones pagaban una tarifa muy pequeña, pero prácticamente ralentizaban toda la red. Estos problemas son muy difíciles de solucionar, ya que es necesario, en primer lugar, determinarlos, en segundo lugar, ajustar el precio por realizar estas operaciones y, en tercer lugar, realizar un hard fork, lo que implica actualizar todos los nodos de la red a una nueva versión. del software y luego la activación simultánea de estos cambios.

En cuanto a Ethereum, se han realizado muchas investigaciones y se ha adquirido mucha experiencia práctica: tanto positiva como negativa, pero aún así quedan dificultades y vulnerabilidades que aún deben abordarse de alguna manera.

Entonces, la parte temática del artículo está completa, pasemos a las preguntas que surgen con bastante frecuencia.

Preguntas más frecuentes

— Si todas las partes de un contrato inteligente existente quieren cambiar los términos, ¿pueden cancelar este contrato inteligente usando multisig y luego crear un nuevo contrato inteligente con términos actualizados de su ejecución?

La respuesta aquí será doble. ¿Por qué? Porque, por un lado, un contrato inteligente se define una vez y ya no implica ningún cambio, y por otro, puede tener una lógica preescrita que prevea un cambio total o parcial de algunas condiciones. Es decir, si desea cambiar algo en su contrato inteligente, debe prescribir las condiciones bajo las cuales puede actualizar estas condiciones. Por lo tanto, sólo de esta forma prudente podrá organizarse la renovación del contrato. Pero aquí también puedes tener problemas: cometer algún error y obtener la correspondiente vulnerabilidad. Por lo tanto, estas cosas deben diseñarse y probarse con mucho detalle y cuidadosamente.

— ¿Qué pasa si el mediador llega a un acuerdo con una de las partes participantes: depósito en garantía o contrato inteligente? ¿Se requiere un mediador en un contrato inteligente?

No se requiere un mediador en un contrato inteligente. Puede que no exista. Si, en el caso del depósito en garantía, el mediador conspira con una de las partes, entonces sí, este esquema pierde drásticamente todo su valor. Por lo tanto, los mediadores se seleccionan de tal manera que todas las partes involucradas en este proceso confíen en ellos al mismo tiempo. En consecuencia, simplemente no transferirá monedas a una dirección de firma múltiple con un mediador en el que no confíe.

— ¿Es posible con una transacción de Ethereum transferir muchos tokens diferentes desde su dirección a diferentes direcciones de destino, por ejemplo, direcciones de intercambio donde se intercambian estos tokens?

Esta es una buena pregunta y se refiere al modelo de transacción de Ethereum y en qué se diferencia del modelo de Bitcoin. Y la diferencia es radical. Si en el modelo de transacción de Ethereum simplemente transfieres monedas, entonces solo se transfieren de una dirección a otra, sin cambios, solo la cantidad específica que especificaste. En otras palabras, este no es un modelo de productos no gastados (UTXO), sino un modelo de cuentas y saldos correspondientes. En teoría, es posible enviar varios tokens diferentes en una transacción a la vez si escribe un contrato inteligente astuto, pero aún tendrá que realizar muchas transacciones, crear un contrato, luego transferirle tokens y monedas y luego llamar al método apropiado. . Esto requiere esfuerzo y tiempo, por lo que en la práctica no funciona así y todos los pagos en Ethereum se realizan en transacciones separadas.

— Uno de los mitos sobre la plataforma Ethereum es que es imposible describir las condiciones que dependerán de los datos de un recurso externo de Internet, entonces, ¿qué hacer?

La solución es que el propio contrato inteligente pueda proporcionar uno o más de los llamados oráculos de confianza, que recopilan datos sobre el estado de las cosas en el mundo exterior y los transmiten a los contratos inteligentes mediante métodos especiales. El propio contrato considera veraces los datos que recibió de partes de confianza. Para una mayor confiabilidad, simplemente elija un grupo grande de oráculos y minimice el riesgo de su connivencia. El propio contrato no podrá tener en cuenta datos de oráculos que contradigan a la mayoría.

Una de las conferencias del curso en línea sobre Blockchain está dedicada a este tema: “Introducción a los contratos inteligentes.

Fuente: habr.com

Añadir un comentario