Ethereum es una Blockchain o Tecnología de Contabilidad Distribuida (DTL) con un lenguaje de programación Turing completo integrado, una computadora blockchain, que permite que cualquiera pueda escribir contratos inteligentes y aplicaciones descentralizadas simplemente escribiendo la lógica en unas pocas líneas de código.
La intención de Ethereum es crear un protocolo alternativo para construir aplicaciones descentralizadas, proporcionando un conjunto diferente de las compensaciones que creemos que va a ser muy útil para una amplia clase de aplicaciones descentralizadas, con especial énfasis en las situaciones donde el rápido tiempo de desarrollo, seguridad para las pequeñas y aplicaciones de uso poco frecuente, y la capacidad de diferentes aplicaciones para interactuar de manera muy eficiente, son importantes.
Ethereum hace esto mediante la construcción de lo que es esencialmente la capa fundamental abstracta definitiva: un blockchain con un lenguaje de programación integrado Turing completo, permitiendo que cualquiera pueda escribir contratos inteligentes y aplicaciones descentralizadas donde pueden crear sus propias reglas arbitrarias para la propiedad, formatos de transacción y funciones de transición de estado. Una versión básica de Namecoin se puede escribir en dos líneas de código, y otros protocolos como monedas y sistemas de reputación se puede construir en menos de veinte años. contratos inteligentes, criptográficas "cajas" que contienen valor y sólo desbloquearlo si se cumplen ciertas condiciones, también puede ser incorporado en la parte superior de la plataforma, con mucho más poder que la ofrecida por Bitcoin scripting debido a los poderes añadidos de Turing-completo, valor-conocimiento, blockchain-conciencia y estado.
Cuentas Ethereum
En Ethereum , el estado se compone de objetos llamados "cuentas", con cada cuenta de que tiene una dirección de 20 bytes y las transiciones de estado de ser transferencias directas de valor y la información entre cuentas. Una cuenta Ethereum contiene cuatro campos:
- El valor de uso único , un contador se utiliza para asegurarse de que cada transacción sólo puede procesarse una vez
- La cuenta corriente de balanza de éter
- De la cuenta Código de título , si está presente
- De la cuenta de almacenamiento (vacío por defecto)
"Éter" es el principal cripto-combustible interna de Ethereum , y se utiliza para pagar las cuotas de transacción. En general, hay dos tipos de cuentas: cuentas de propiedad externa , controlados por las claves privadas, y las cuentas de contrato , controlados por su código de contrato. Cuenta que pertenece el exterior no tiene ningún código, y uno puede enviar mensajes desde una cuenta propiedad externamente mediante la creación y la firma de una transacción; en una cuenta de contrato, cada vez que la cuenta de contrato recibe un mensaje de su código se activa, lo que le permite leer y escribir en la memoria interna y enviar otros mensajes o crear contratos en turno.
Tenga en cuenta que los "contratos" en Ethereum no deben ser vistos como algo que debe ser "cumplido" o "cumplimiento"; más bien, son más como "agentes autónomos" que viven dentro del entorno de ejecución Ethereum , siempre que ejecutan una pieza específica de código cuando "empujado" por un mensaje o transacción, y que tiene control directo sobre su propio equilibrio éter y su propia llave / tienda de valor para realizar un seguimiento de las variables persistentes.
Los Mensajes Y Transacciones
El término "transacción" se utiliza en Ethereum para referirse al paquete de datos que almacena firmado un mensaje para ser enviado desde una cuenta propiedad externamente. Transacciones contienen:
- El destinatario del mensaje
- Una firma identificar al remitente
- La cantidad de éter para transferir desde el remitente al destinatario
- Un campo de datos opcional
- Un STARTGASvalor, que representa el número máximo de pasos de cálculo se permite que la ejecución de la transacción para tomar
- Un GASPRICEvalor, que representa la cuota de remitente paga por paso computacional
Los tres primeros son campos estándar que se esperan de cualquier criptomoneda. El campo de datos no tiene ninguna función por defecto, pero la máquina virtual tiene un código de operación con la que un contrato puede tener acceso a los datos; como un caso de ejemplo el uso, si un contrato está funcionando como un servicio de registro de dominios en blockchain, entonces se podría interpretar los datos que se pasan a ella como que contiene dos "campos", siendo el primer campo de un dominio a registrar y el segundo campo es la dirección IP para registrarlo a. El contrato sería leer estos valores a partir de los datos del mensaje y de manera apropiada colocarlos en el almacenamiento.
El STARTGAS y GASPRICE campos son cruciales para la lucha contra la negación del modelo de servicio de Ethereum . Con el fin de evitar los bucles infinitos accidentales o hostiles u otro desperdicio computacional en el código, se requiere que cada transacción para establecer un límite para el número de pasos de cálculo de la ejecución de código que puede utilizar.
La unidad fundamental de la computación es "gas"; por lo general, un paso computacional cuesta 1 gas, pero algunas operaciones costó mayores cantidades de gas porque son más caros computacionalmente, o aumentar la cantidad de datos que deben ser almacenados como parte del estado. También hay una cuota de 5 gas para cada byte de los datos de la transacción. La intención del sistema de tasas es exigir un atacante que pagar proporcionalmente para todos los recursos que consumen, incluyendo computación, ancho de banda y almacenamiento; por lo tanto, cualquier transacción que lleva a la red de consumir una mayor cantidad de cualquiera de estos recursos debe tener una cuota de gas aproximadamente proporcional al incremento.
Mensajes
Los contratos tienen la capacidad de enviar "mensajes" a otros contratos. Los mensajes son objetos virtuales que nunca son serializados y sólo existen en el entorno de ejecución Ethereum . Un mensaje contiene:
- El remitente del mensaje (implícita)
- El destinatario del mensaje
- La cantidad de éter para transferir junto con el mensaje
- Un campo de datos opcional
- Un valor STARTGAS
En esencia, un mensaje es como una transacción, salvo que se produce mediante un contrato y no un actor externo. Un mensaje se produce cuando un contrato que se está ejecutando código se ejecuta el CALL código de operación, que produce y ejecuta un mensaje. Al igual que una transacción, un mensaje conduce a la cuenta del destinatario ejecuta su código. Por lo tanto, los contratos pueden tener relaciones con otros contratos exactamente de la misma manera que los actores externos pueden.
Tenga en cuenta que la asignación de gas asignado por una transacción o contrato se aplica al total del gas consumido por esa transacción y todos los sub-ejecuciones. Por ejemplo, si un actor A externo envía una transacción a B con 1000 gas, y B consume 600 gas antes de enviar un mensaje a C, y la ejecución interna de C consume 300 gas antes de volver, a continuación, B puede pasar otra 100 de gas antes de ejecutar sin gasolina.
Función Ethereum Estado de Transición
- La función de transición de estado Ethereum , APPLY(S,TX) -> S'se puede definir como sigue:
- Compruebe si está bien formado la transacción (es decir. Tiene el número correcto de valores), la firma es válida, y el nonce coincide con el valor de uso único en la cuenta del remitente. En caso contrario, devolverá un error.
- Se calcula la tarifa de transacción como STARTGAS * GASPRICE, y determinar la dirección de envío de la firma. Restar la cuota del saldo de la cuenta del remitente y el incremento nonce del remitente. Si no hay saldo suficiente para pasar, devolverá un error.
- Inicializar GAS = STARTGAS, y quitar una cierta cantidad de gas por byte a pagar por los bytes en la transacción.
- Transferir el valor de transacción de la cuenta del remitente a la cuenta receptora. Si todavía no existe la cuenta receptora, lo crea. Si la cuenta receptora es un contrato, ejecute el código del contrato, ya sea a la terminación o hasta que la ejecución se queda sin gasolina.
- Si la transferencia de valor fracasado porque el remitente no tenía suficiente dinero, o la ejecución de código se quedó sin gasolina, revertir todos los cambios de estado de excepción del pago de las tasas, y añadir los gastos a la cuenta del minero.
- De lo contrario, la devolución de las tasas para todos restante de gas al remitente, y enviar los honorarios pagados por el gas consumido al minero.
Por ejemplo, supongamos que el código del contrato es:
Tenga en cuenta que, en realidad, el código de contrato está escrito en el código de EVM de bajo nivel; este ejemplo está escrito en serpiente, uno de nuestros lenguajes de alto nivel, para mayor claridad, y puede ser compilado a código de EVM. Supongamos que el almacenamiento del contrato comienza vacío, y una transacción se envía con 10 valor éter, gas 2.000, 0.001 gasprice éter, y 64 bytes de datos, con bytes 0-31 representa el número 2y bytes 32-63 representa la cadena CHARLIE. El proceso para la función de transición de estado en este caso es como sigue:
- Compruebe que la transacción es válida y bien formado.
- Compruebe que el remitente transacción tiene * 0,001 = 2 éter al menos 2.000. Si es así, entonces restar 2 éter de la cuenta del remitente.
- Inicializar gas = 2.000; suponiendo que la transacción es de 170 bytes de longitud y el byte-cuota es 5, restar 850 de modo que hay 1,150 izquierda gas.
- Restar 10 éter más de la cuenta del remitente, y añadirlo a la cuenta del contrato.
- Ejecutar el código. En este caso, esto es simple: comprueba si el almacenamiento de contrato en el índice 2se utiliza, se da cuenta de que no lo es, y por lo que establece el almacenamiento en el índice 2al valor CHARLIE. Supongamos que esta toma 187 de gas, por lo que la cantidad restante de gas es 1150-187 = 963
- Añadir 963 * 0,001 = 0,963 éter de vuelta a la cuenta del remitente, y devolver el estado resultante.
Si no había ningún contrato en el extremo receptor de la transacción, a continuación, la cuota total de la transacción simplemente sería igual de lo dispuesto GASPRICE multiplicado por la longitud de la transacción en bytes, y los datos que se envían junto con la transacción sería irrelevante.
Tenga en cuenta que los mensajes funcionan de forma equivalente a las transacciones en términos de revierte: si un mensaje de ejecución se queda sin gas, entonces la ejecución de ese mensaje, y todas las demás ejecuciones que ha provocado esta ejecución, se revierten, pero las ejecuciones de los padres no tienen que volver. Esto significa que es "seguro" de un contrato para llamar a otro contrato, como si una llama de gas B con G entonces la ejecución de una se garantiza que perder en la mayor parte del gas G. Por último, tenga en cuenta que existe un código de operación, CREATE que crea un contrato; su mecánica de ejecución son generalmente similares a CALL, con la excepción de que la salida de la ejecución determina el código de un contrato de nueva creación.
Ejecución Código
El código en los contratos Ethereum está escrito en un bajo nivel, el lenguaje de código de bytes basado en pila, conocido como "Ethereum código de máquina virtual" o "código de EVM". El código consta de una serie de bytes, donde cada byte representa una operación. En general, la ejecución de código es un bucle infinito que consiste en realizar repetidamente a cabo la operación en el contador de programa actual (que comienza en cero) y luego incrementar el contador de programa por uno, hasta el final del código se alcanza o un error o STOP o RETURN se detecta la instrucción. Las operaciones tienen acceso a tres tipos de espacio en el que almacenar los datos:
- La pila , un último en entrar, primero en salir contenedor al que valores puede ser empujado y se metió
- Memoria , una matriz de bytes infinitamente expandible
- A largo plazo del contrato de almacenamiento , un valor / almacén de claves. A diferencia de la pila y la memoria, que restablece después de extremos de cálculo, almacenamiento persiste a largo plazo.
El código también se puede acceder al valor, el remitente y los datos del mensaje entrante, así como datos de cabecera de bloque, y el código también puede devolver una matriz de bytes de datos como una salida.
El modelo de ejecución formal de código de EVM es sorprendentemente simple. Mientras que la máquina virtual Ethereum está en funcionamiento, su estado computacional completa se puede definir por la tupla (block_state, transaction, message, code, memory, stack, pc, gas), donde block_statees el estado global que contiene todas las cuentas e incluye saldos y almacenamiento. Al comienzo de cada ronda de ejecución, la instrucción en curso se encuentran tomando el pc(Contador de Programa) de bytes de l code(o 0 si pc >= len(code)), y cada instrucción tiene su propia definición en términos de cómo afecta a la tupla. Por ejemplo, ADDhace estallar dos artículos de la pila y empuja su suma, reduce gaspor 1 y se incrementa pcpor 1, y SSTORE hace estallar los dos elementos superiores de la pila y se inserta el segundo elemento en almacenamiento del contrato en el índice especificado por el primer elemento. Aunque hay muchas maneras de optimizar la ejecución de la máquina virtual Ethereum a través de la compilación justo a tiempo, una implementación básica de Ethereum puede hacerse en unos pocos cientos de líneas de código.
Blockchain y Minería
El blockchain Ethereum es en muchos aspectos similar a la blockchain Bitcoin, aunque tiene algunas diferencias. La principal diferencia entre Ethereum y Bitcoin con respecto a la arquitectura blockchain es que, a diferencia de Bitcoin, Ethereum bloques contienen una copia tanto de la lista de transacciones y el estado más reciente. Aparte de eso, otros dos valores, el número de bloque y de la dificultad, también se almacenan en el bloque. El algoritmo básico validación bloque en Ethereum es como sigue:
- Comprobar si existe el bloque anterior se hace referencia y es válido.
- Compruebe que la marca de tiempo del bloque es mayor que la del bloque anterior referenciada ya menos de 15 minutos en el futuro
- Compruebe que el número de bloque, la dificultad, la raíz de la transacción, raíz tío y límite de gas (varios conceptos-Ethereum específica de bajo nivel) son válidos.
- Compruebe que la prueba de trabajo en el bloque es válido.
- Dejar que S[0]sea el estado al final del bloque anterior.
- Dejar que TXsea la lista de transacciones del bloque, con n transacciones. Para todos ien 0...n-1, establecer S[i+1] = APPLY(S[i],TX[i]). Si cualquier aplicación devuelve un error, o si el gas total consumida en el bloque hasta este punto excede el GASLIMIT, devolver un error.
- Dejar que S_FINAL sea S[n], pero la adición de la recompensa bloque pagado a la minera.
- Compruebe si la raíz del árbol Merkle del estado S_FINAL es igual a la raíz estado final previsto en la cabecera del bloque. Si es así, el bloque es válida; de lo contrario, no es válido.
El enfoque puede parecer muy ineficiente a primera vista, ya que tiene que almacenar todo el estado con cada bloque, pero en realidad la eficiencia debería ser comparable a la de Bitcoin. La razón es que el estado se almacena en la estructura de árbol, y después de cada bloque de sólo una pequeña parte del árbol que hay que cambiar. Así, en general, entre dos bloques adyacentes la gran mayoría del árbol debe ser el mismo, y por lo tanto los datos se pueden almacenar una vez y se hace referencia dos veces el uso de punteros (es decir. Hashes de subárboles).
Un tipo especial de árbol conocido como un "árbol de Patricia" se utiliza para lograr esto, incluyendo una modificación en el concepto de árbol Merkle que permite a los nodos pueden insertar y eliminar, y no sólo cambian, de manera eficiente. Además, dado que toda la información de estado es parte del último bloque, no hay necesidad de almacenar toda la historia blockchain - una estrategia que, si se pudiera aplicar a Bitcoin, se puede calcular para proporcionar 5-20x ahorro en el espacio.
Una pregunta común es "donde" se ejecuta código de contrato, en términos de hardware físico. Esto tiene una respuesta sencilla: el proceso de ejecutar código de contrato es parte de la definición de la función de transición de estado, que es parte del algoritmo de validación bloque, por lo que si se añade una transacción en el bloque Bse ejecutará la ejecución de código generado por esa transacción por todos los nodos, ahora y en el futuro, que descarga y validar bloque B.
Comentarios