Documentación de Solidity 0.4.5 en español - 2. La cadena de bloques y la Máquina Virtual Ethereum

in #solidity8 years ago (edited)

Esta es la segunda parte de la traducción de la documentación de Solidity.


Lo básico de Blockchain

Blockchain como concepto no es demasiado difícil de aprender para los programadores. La razón es que la mayoría de las complicaciones (minería, hashing, criptografía de curva elíptica, redes peer-to-peer...) están ahí para proveer un conjunto de características y promesas. Una vez que aceptas estas características tal como se indica, no tendrás que preocuparte más por la tecnología entre líneas, ¿o tienes que conocer el funcionamiento interno de Amazon para usarlo?

Transacciones

Una cadena de bloques es una base de datos de transacciones internacionalmente distribuida. Esto significa que todo el mundo puede leer entradas en esta base sólo participando en la red. Si quieres cambiar algo en la base de datos, tienes que crear una transacción que tiene que ser aceptada por todos los otros. La palabra transacción implica que el cambio que quieres hacer (asumiendo que quieres cambiar dos valores al mismo tiempo) o bien no se hace es absoluto o no es completamente aplicado. Además, mientras tu transacción es aplicada, ninguna otra puede alterarla.

Como ejemplo, imagina una tabla que lista los balances de todas las cuentas como un dinero electrónico. Si una transferencia de una cuenta a otra es pedida, la naturaleza transaccional de toda la base de datos asegura que la cantidad es substraída de una cuenta y siempre añadida a otra. Si debido a cualquier razón, añadir la cantidad a la cuenta no es posible, la cuenta fuente no es modificada.

Además, una transacción es siempre firmada criptográficamente por el que envía (creador). Esto le hace sencillamente guardar acceso a modificaciones específicas de la base de datos. En el ejemplo de la moneda electrónica, una simple comprobación asegura que sólo la persona que mantiene las keys de la cuenta puede transferir dinero de ella.

Bloques

Un obstáculo mayor a superar es el que, en términos de Bitcoin, es llamado un ataque de doble gasto: ¿Qué sucede si dos transacciones existen en la red y las dos quieren vaciar una cuenta, un conflicto?

La respuesta abstracta a esto es que no tienes que tener cuidado. En el orden de las transacciones que serán seleccionadas por ti, las transacciones serán empaquetadas en lo que es llamado un "bloque" y entonces serán ejecutadas y distribuidas entre todos los nodos participantes. Si dos transacciones se contradicen una a otra, la que ha terminado siendo segunda será rechazada y no se volverá parte del bloque.

Estos bloques forman una secuencia linear en el tiempo y es de donde la palabra "cadena de bloques" deriva. Los bloques son añadidos a la cadena en intervalos más bien regulares - para Ethereum es aproximadamente cada 17 segundos.

Como parte del mecanismo de selección del orden (el cual es llamado "minería") puede ocurrir que los bloques sean revertidos de cuando en cuando, pero sólo en la "punta" de la cadena. Cuanto más bloques son añadidos encima, menos probable es. Así que puede que tus transacciones puedan ser revertidas e incluso removidas de la blockchain, pero mientras mayor sea el tiempo que esperas, esto se volverá menos probable.

La Máquina Virtual Ethereum

Vista General

La Máquina Virtual de Ethereum o EVM es el entorno de ejecución de contratos inteligentes en Ethereum. No es sólo una caja de arena, pero actualmente está completamente aislado, lo que significa que el código ejecutándose en la EVM no tiene acceso a la red, sistema de archivos u otro proceso. Los contratos inteligentes incluso tienen acceso limitado a otros contratos inteligentes.

Cuentas

Hay dos tipos de cuentas en Ethereum, las cuales comparten el mismo espacio de dirección: cuentas externas que son controladas por pares de key publicos o provados (por ejemplo, humanos) y contratos los cuales son controlados por el código almacenado junto con la cuenta.

La dirección de una cuenta externa es determinada por la llave pública mientras la dirección de un contrato es determinada en el momento en el que es creado (es derivado de la dirección del creador y el número de transacciones enviados desde esa cuenta, la llamada "mientras").

Aparte del hecho de que si una cuenta almacena el código o no, sin embargo, la EVM trata los dos tipos igual.

Cada cuenta tiene un valor de key persistente almacenado mapeando palabras de 256-bit a palabras llamadas almacenamiento.

Además, cada cuenta tiene un balance en Ether (en "Wei" para ser exactos) el cual puede ser modificado enviando transacciones que incluyan Ether.

Transactions

Una transacción es un mensaje que es enviado desde una cuenta a otra ( la cual puede ser la misma o una cuenta especial cero, mira abajo). Puede incluir información en binario (su carga de pago) y ether.

Si la cuenta objetivo contiene código, este código es ejecutado y la carga de pago proveido como dato de entrada..

Si la cuenta objetivo es una cuenta-cero (la cuenta con la dirección 0), la transacción crea un nuevo contrato. Como ha sido mencionado, la dirección de ese contrato no es la dirección zero pero una cuenta derivada del que envía y su número de transacción de envío (el "mientras"). El cargo de pago de la creación de la transacción de tal contrato es tomado del bytecode de la EVM y ejecutado. La salida de esta ejecución está almacenada permanentemente como el código del contrato. Esto significa que en el orden de crear un contrato, tu no envíes el código actual, si no en realidad el código que devuelve ese código.

Gas

Sobre su creación, cada transacción es cargada con una cierta cantidad de gas, cuyo propósito es limitar la cantidad de trabajo que es necesario para ejecutar la transacción y pagar por esta ejecución. Mientras la EVM ejecuta la transacción, el gas es gradualmente agotado de acuerdo a reglas específicas.

El precio del gas es un valor establecido por el creador de la transacción, quien tiene que pagar gas_price * gas up enfrente de la cuenta de envío. Si queda algo de gas fuera tras la ejecución, es devuelto de la misma manera.

Si el gas es consumido en algún punto (ejemplo, si es negativo), una excepción de fuera-de-gas es desencadenada, la cual revierte las modificaciones hechas al estado en la franja de llamada actual.

Almacenamiento, Memoria y el Stack

Cada cuenta tiene una area persistente de memoria que es llamada almacenamiento. Este es un valor de key de almacenaje que mapea palabras en 256-bit a palabras 256-bit. No es posible enumerar el almacenamiento desde un contrato y es comparativamente costoso leer e incluso más, modificarlo. Un contrato tampoco puede leer o escribir en ningún almacenamiento aparte del suyo.

La segunda area de memoria es llamada memoria, de la cual un contrato obtiene una instancia recién borrada para cada llamada de mensaje. La memoria es linear y puede ser dirigida a nivel de byte, pero las lecturas están limitadas a una anchura de 256 bits, mientras las escrituras pueden tener de 8 a 256 bits de amplitud. La memoria es expandida por una palabra (256-bit), cuando accediendo (ya sea leyendo o escribiendo) a una palabra de memoria no tocada previamente. Al momento de la expansión, el coste en gas debe ser pagado. La memoria es más costosa cuanto más crece (en una escala cuadrática).

La EVM no es una máquina registradora si no una máquina compiladora, así que todos los cómputos son llevados a cabo en una área llamada la pila. Tiene un tamaño máximo de 1024 elementos y contiene palabras de 256 bits. El acceso a la pila es limitado en el extremo superior de la siguiente forma: es posible copiar uno de los 16 elementos más arriba de la pila o intercambiar el elemento de más arriba con uno de los 16 elementos debajo de él. Todas las otras operaciones toman a los dos elementos superiores (o uno, o más, dependiendo de la operación) de la pila y empujan el resultado sobre ella. Por supuesto, es posible mover elementos de la pila de almacenamiento o memoria, pero no es posible acceder a elementos más profundos en la pila arbitrariamente sin borrar primero la parte superior de la pila.

Set de instrucciones

El set de instrucciones de la EVM se mantiene mínimo en orden de prevenir incorrectas implementaciones que pudieran causar problemas en el consenso. Todas las instrucciomes operan en el tipo básico de información, palabras 256-bits. Las típicas operaciones aritméticas, con bits, lógicas y de comparación están presentes. Los saltos condicionales y no condicionales son posibles. Además, los contratos pueden acceder a propiedades relevantes del bloque actual como su número o timestamp.

Llamadas de mensaje

Los contratos pueden llamar a otros contratos o enviar Ether a cuentas sin contrato por medio de los mensajes de llamada. Estos son similares a las transacciones en que tienen una fuente, un objetivo, datos de cargo de pago, Ether, gas e información de retorno. De hecho, cada transacción consiste en una llamada de mensaje de bajo nivel la cual puede crear en su turno más llamadas de mensaje.

Un contrato puede decidir cuánto de su gas restante debe ser enviado con su interior llamada de mensaje y cuánto quiere retener. Si ocurre alguna excepción por falta de gas dentro de la llamada (o alguna otra excepción), esta será firmada por un valor de error pueste encima de la pila. En este caso, sólo el gas enviado junto con la llamada es usado. En Solidity, la llamada a un contrato causa una excepción por defecto en tales situaciones, así que estas excepciones "burbujean" la pila de llamadas.

Como ya se ha dicho, el contrato llamado (el cual puede ser el mismo como el llamador) recibirá una instancia de memoria borrada recientemente y tendrá acceso al cargo de pago de la llamada - el cual será provisto en un área separada denominada la información de llamada (calldata). Después del fin de la ejecución, puede retornar información la cual será almacenada en el lugar preasignado por el llamador a su memoria.

Las llamadas están limitadas a una profundidad d 1024, lo cual significa que para operaciones más complejas se debe optar por los bucles mejor que por las llamadas recursivas.

Llamadas delegadas / Códigos de llamada y bibliotecas

Existe una variante especial de una llamada de mensaje, llamada "delegatecall", la cual es idéntica a una llamada de mensaje aparto del hecho de que el código como dirección del objetivo es ejecutado en el contexto de una llamada de contrato y msg.sender y msg.value no cambian sus valores.

Esto significa que un contrato cambia dinámicamente su código de carga desde una dirección diferente en tiempo de ejecución. Almacenamiento, dirección actual y balance todavía refieren al contrato llamado, sólo el código es tomado de la dirección llamada.

Esto hace posible implementar la característica "library" en Solidity: Código reusable de biblioteca puede ser aplicado al almacenamiento de los contraros para, por ejemplo, implementar una estructura de datos compleja.

Registros

Es posible almacenar información en una estructura de información indexada toda ella mapeada al nivel de bloque. Esta característica llamada registros (logs) es usada por Solidity en orden de implementar eventos. Los contractos no pueden acceder a la información del registro después de que ha sido creado, pero ellos pueden acceder eficientemente desde fuera de la blockchain. Dado que parte de los datos del registro es almacenado en filtros de flores (bloom filters), es posible buscar está información de una manera eficiente y criptográficamente segura, aunque las personas de la red peer-to-peer no descargan la blockchain entera ("clientes lights") pueden continuar buscando esos registros.

Crear

Los contratos pueden crear otros contratos usando un opcode especial ( por ejemplo, no llaman simplemente a la dirección cero). La única diferencia entre esas creaciones de llamadas y los mensajes de llamada normales es que el cargo de pago es ejecutado y el resultado almacenado como código, y el llamador/creador recibe la dirección del nuevo contrato en la pila.

Auto-destrucción

La única posibilidad de que el código sea borrado de la cadena de bloques es cuando un contrato en su dirección lleva a cabo la operación de autodestrucción. El Ether restante almacenado en esa dirección es enviado a un objetivo designado y entonces el almacenamiento y el código es eliminado desde el estado.

Advertencia: Incluso si el código de un contrato no contiene una llamada a selfdestruct, puede seguir con esa operación usando delegatecall o callcode.


Índice de la documentación:

1. Introducción a los contractos inteligentes
2. La cadena de bloques y la Máquina Virtual de Ethereum

Coin Marketplace

STEEM 0.19
TRX 0.15
JST 0.029
BTC 62966.47
ETH 2631.87
USDT 1.00
SBD 2.79