6
Seguir
792
Seguidores

Introducción a Blockchain y Ethereum

Creado el: 2016-05-05 17:31:57, Actualizado el: 2016-05-05 17:32:31
comments   3
hits   2492

El proyecto de ley de blockchain está en proceso de aprobación por parte de la Cámara de Representantes de los Estados Unidos.

Este artículo fue compilado a partir de un artículo que compartí en LeanCloud a finales de marzo, y se supone que el lector ya tiene un conocimiento básico de criptografía y un conocimiento preliminar de la implementación de Bitcoin.

Blockchain, también conocido como blockchain, es una especie de HashTree, por lo que tiene algunas características similares a HashTree:

blockchain-hash-tree

La imagen fue tomada de<http://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

Es decir, en una estructura de árbol, cada nodo terminal tiene un valor de dispersión, mientras que el valor de dispersión de un nodo no terminal proviene del valor de dispersión de todos sus nodos directos, por lo que cada nodo contiene información de todos sus nodos directos o indirectos. Por lo tanto, siempre que el valor de dispersión de cualquier nodo terminal cambie, el valor de dispersión de todos sus nodos padres cambiará, y los nodos raíz también cambiarán.

Podemos considerar un escenario en el que los titulares de Bitcion necesitan depositar Bitcoin en una plataforma de intercambio para poder realizar transacciones, y en teoría la plataforma de intercambio puede usar ese dinero (todos los balances de las cuentas de los usuarios depositados) para su uso, lo que los usuarios no quieren ver, pero la plataforma también quiere asegurarse de sí misma: la plataforma de intercambio primero publica una dirección de Bitcoin que posee, y todos confirman que la plataforma de intercambio realmente tiene ese número de Bitcoin en reserva, pero ¿cómo demostrar que ese dinero es realmente mayor que el total de los balances de todos los usuarios? En otras palabras, ¿cómo hacer que cada usuario reconozca que su propio saldo está incluido en el total de los balances de todos los usuarios (sin revelar la privacidad de los usuarios)?

blockchain-proof-of-reserves

La imagen fue tomada de<http://blog.bifubao.com/2014/03/16/proof-of-reserves

Podemos construir un HashTree en el que todos los nodos finales representan a un usuario y contienen el saldo de ese usuario.Σ) y el fragmento de identificación de usuario (como la dirección de correo postal)h), mientras que el nodo padre contiene la suma de los saldos de sus nodos hijos (sum) y el conjunto de la información de todos los subnodos (hashPara cada usuario, basta con mostrarle sus propios nodos terminales y nodos hermanos, todos sus nodos padres y nodos hermanos de los nodos padres, ya que este usuario puede confirmar su saldo incluido en los nodos padres y, finalmente, en los nodos raíces, mediante la retrocesividad progresiva de los nodos padres.

De esta manera, la información que se muestra a cada usuario es solo su propia información y algo de información agregada, y cada usuario puede confirmar que su saldo está incluido en el nodo raíz sin que se le informe a nadie de los saldos.hPor quée4df9d12El nodo de la red no debe ser un nodo final que represente a un usuario, sino un nodo de información agregado (que puede contener un usuario con un saldo de 3333, y un usuario virtual con un saldo de 0) para evitar la divulgación de la información privada de un usuario.

Ahora vamos a ver Git, que es una aplicación muy típica de blockchain:

blockchain-git-objects-example

La imagen fue tomada dehttp://gitbook.liuhui998.com/1_2.html (GPL v2)

En Git, tanto el archivo (Blob), el índice (Tree) como el objeto (Commit) tienen un Hash determinado por su contenido, y si dos objetos tienen el mismo contenido, tienen el mismo Hash. En Git, la historia de todo el repositorio es una Blockchain, cada Commit es equivalente a un Bloque, el Commit contiene el Hash del Commit anterior y el Hash del objeto relacionado con esta modificación, el Hash del Commit en sí es determinado por su contenido y esta información.

Git utiliza Blockchain para determinar un único historial para el almacén. Si un Commit es modificado, todos los Hash de los Commits posteriores cambian.push --forceEn la página de Facebook de la empresa, se puede ver que el usuario ha cambiado el nombre de la página.

La otra aplicación clásica de Blockchain es Bitcoin, que es quien ha popularizado el término Blockchain (y el concepto siempre ha existido):

blockchain-bitcoin-block-data

La imagen fue tomada dehttps://commons.wikimedia.org/wiki/File:Bitcoin_Block_Data.png(CC-BY-SA-3.0)

En Bitcoin, cada bloque contiene una serie de transacciones y el hash del bloque anterior, mientras que toda la cadena de bloques constituye un único registro descentralizado. Como un nuevo bloque se crea cada diez minutos, y una vez que se crea un bloque permanece en la cadena de bloques para siempre, la cadena de bloques fija el orden en que ocurren las transacciones, mantiene el orden anterior y posterior de las transacciones y determina si una cuenta tiene suficiente saldo para iniciar una transacción.

Bitcoin

La primera parte de este post es un simple repaso a Bitcoin.

La generación de bloques en Bitcoin se realiza a través de la “prueba de volumen de trabajo”, es decir, todos los “mineros” que participan en la “minería” deben realizar un cálculo aleatorio de carácter aleatorio relacionado con la potencia de cálculo hasta que se calcule un número aleatorio que cumpla con ciertas condiciones para obtener el derecho de publicar un bloque.

De forma predeterminada, cada minero siempre confía en la cadena más larga, y calcula el siguiente bloque basándose en la cadena más larga que cumple con las reglas conocidas, de lo contrario, su poder de cálculo se desperdicia en vano.

Bitcoin está diseñado para generar un nuevo bloque cada 10 minutos, un tiempo que se logra mediante la observación de los intervalos de tiempo de los últimos bloques para ajustar la dificultad de las condiciones de generación del siguiente bloque. Cuando la velocidad de generación de los últimos bloques es más alta de lo esperado, se considera que la generación del próximo bloque debería tener una mayor dificultad.

Normalmente, cada nodo de Bitcoin necesita almacenar toda la información de la Blockchain para confirmar si una transacción es legal. El iniciador de una transacción de bitcoins tiene suficiente saldo para iniciar la transacción. Pero ahora la cadena de bloques completa tiene 66G, y sigue creciendo a una velocidad de alrededor de 0.1G por día. Si se requiere que cada usuario de Bitcoin almacene la cadena de bloques completa, no es demasiado exigente.

blockchain-bitcoin-state-machine

La imagen fue tomada de<https://github.com/ethereum/wiki/wiki/White-Paper

  • Blockchain Registro de cuentas de cuentas Registro de cambios de estado
  • Transacción Transacción Un cambio de estado
  • Un “consenso” sobre el estado actual de las cosas

De hecho, podemos imaginar el Blockchain de Bitcoin como una “máquina de estado”, el Blockchain entero es un “libro de contabilidad” de estado, en el que se almacenan los registros de cada transacción, de acuerdo con estos registros de transacción se puede calcular el “estado” de la cuenta en cualquier momento. Cada transacción es un cambio de estado, y cada bloque es un “consenso” del estado actual de los mineros de toda la red Bitcoin, ya que Bitcoin genera un nuevo bloque cada 10 minutos, lo que equivale a que cada 10 minutos todos llegan a un consenso sobre el saldo de todas las cuentas, mientras que en esos diez minutos, el estado de la cuenta es un “estado de caos”.

Alt Coin

En la base de Bitcoin también se derivan muchas otras monedas criptográficas, a menudo llamadas “monedas alternativas”, que suelen tener dos implementaciones:

La primera es usar su propia red, independiente de la de Bitcoin, con la ventaja de que la criptomoneda tiene una gran flexibilidad para diseñar sus propios protocolos y reglas, pero debido a la dificultad de alcanzar el nivel de usuarios de Bitcoin, la defensa contra ataques maliciosos será muy débil.

El segundo tipo es el uso de la red de Bitcoin para implementar el “protocolo de meta”, que incluye información personalizada sobre la Transacción de Bitocin para implementar su propia lógica. La ventaja de esto es que se puede utilizar el tamaño de la potencia de cálculo de Bitcoin para defenderse de los ataques, pero al mismo tiempo, debido a que no todos los mineros que dependen de la red de Bitcoin siguen las reglas de las monedas de copia, por lo tanto, no se puede evitar que los bloques que no cumplen con las reglas ingresen a la Blockchain, solo se puede filtrar las transacciones que no cumplen con las reglas en el cliente, y no se puede utilizar la función de confirmación simplificada que se mencionó anteriormente.

Para estas monedas de copia, Bitcoin puede proporcionar una Blockchain con gran participación de mineros que pueda resistir ataques maliciosos a gran escala, mientras que las transacciones de Bitcoin también pueden tener datos personalizados, lo que deja un cierto espacio para la implementación de monedas de copia.

Bitocin también ofrece una.Bitcoin ScriptSe utiliza para realizar transacciones más complejas, pero debido a que no es una función central de Bitcoin, solo se pueden realizar operaciones más simples, solo se puede leer muy poco de los datos en la Blockchain, y debido a la falta de un mecanismo de ciclo, es difícil escribir una lógica universal y completa de Turing.

Ethereum

blockchain-ethereum

La imagen fue tomada dehttps://www.ethereum.org/assets (CC 3.0)

Ethereum es una plataforma de aplicaciones descentralizada basada en blockchain que construye la infraestructura de Bitcoin en base a la tecnología de blockchain criptográfica como una plataforma universal y complementa algunas de las funciones perdidas de la red Bitcoin para que los desarrolladores puedan ejecutar sus propias aplicaciones descentralizadas en Blockchain.

La criptografía, por supuesto, no es más que la criptografía de la clave pública, el cifrado digital, la segmentación y el resumen de los algoritmos para garantizar la seguridad matemática; y el juego es que en una red descentralizada, cualquier persona, incluidas las personas que desean maliciosamente atacar la red, puede participar.

Sin embargo, en el mundo digital, la publicación de un fragmento de datos no tiene costo, no hay “beneficios” ni “pérdidas”, por lo que se debe establecer algún tipo de conexión con el mundo físico para definir “beneficios”. Por ejemplo, en la red de Bitocin, si un atacante desea cambiar artificialmente el rumbo de Blcokchain, se requiere tener una mayor potencia de cómputo que todos los demás mineros, mientras que en el mundo físico, la potencia de cómputo se requiere de un equipo de cómputo que se necesita comprar del mundo físico.

Así que en la red descentralizada, no todos los problemas son resueltos por la “tecnología”, en la parte que la tecnología no alcanza, debe resolverse a través de beneficios, a través de incentivos económicos. También debido a la necesidad de “incentivos económicos”, Ethereum también tiene un sistema de billetera (la unidad monetaria se llama “Ether”) y cada usuario tiene una dirección de billetera como su única identidad, en este punto es similar a Bitcion.

“Contract” es el concepto más importante introducido por Ethereum. En Bitcoin, todas las direcciones pertenecen a un usuario. Cuando decimos “usuario”, en realidad estamos hablando de un par de claves públicas y privadas. Pero en Ethereum, además de la dirección que posee una pareja de claves, también hay una dirección que posee el “código”, el Contract.

  • El resultado del cálculo no necesita ser almacenado en la cadena de bloques, ya que puede ser recalculado en cualquier momento.
  • La función puede ser invocada en otros contratos (el código y los datos de otros contratos también existen en la cadena de bloques).
  • En el proceso de ejecución se pueden crear nuevas transacciones para manipular el saldo de la propia billetera, que pueden ser utilizadas para ejecutar otros contratos.

En primer lugar, un ejemplo de “monedero compartido por varios usuarios”, que tiene una función para crear monederos múltiples en el cliente oficial de Ethereum:

blockchain-ethereum-multi-sig-wallet

La función permite crear una dirección de monedero que se comparte con otras dos personas, cada una de las cuales puede usar hasta 100 Ether al día, y si se excede este límite, debe obtener el consentimiento de otra persona.

Esta función en realidad crea un Contract, y la lógica anterior se describe a través del código en el Contract. Cuando desee realizar un pago desde esta billetera compartida, debe enviar un mensaje a esta billetera compartida (la transacción es un mensaje, el monto de la transacción puede ser cero, solo lleva datos), y luego el código de la billetera compartida se ejecutará, si la solicitud de pago cumple con la lógica anterior, se iniciará la transacción de pago real, de lo contrario, la solicitud de pago será rechazada (no hay un pago real).

Otro ejemplo es el de los “contratos de cobertura”, que siempre se ha dicho que el valor de Bitcoin como moneda digital es inestable (y el tipo de cambio de las monedas legales) y que suele ocurrir que el valor de la moneda se duplica o se duplica en el transcurso de un día, pero esto se puede resolver en cierta medida si se implementa un contrato de cobertura con Contract.

Vamos a llamar a la persona que quiere mantener el valor de la moneda invariable “esquiva riesgo”, y llamaremos a la otra persona que está dispuesta a asumir el riesgo de la fluctuación del valor de la moneda y obtener ganancias de ello “asume riesgo”, para que puedan acordar una cantidad (por ejemplo, 1000 CNY) y una ventana de tiempo (por ejemplo, un mes) y crear un contrato que ejecute la siguiente lógica:

  • El evasor de riesgo envía 1000 CNY de Ether a la dirección de la billetera del Contract, y el evasor de riesgo también envía 1000 CNY (o más) de Ether al Contract para cumplir con el contrato (si no hay nadie que cumpla, el evasor de riesgo puede recuperar su propio Ether).
  • Después de un mes, el evasor de riesgo puede recuperar el Ether de 1000 CNY en el momento del contrato, y el Ether restante es recuperado por el tomador de riesgo, independientemente del tipo de cambio entre Ether y CNY.

Si el valor de Ether sube, el tomador de riesgo se beneficia, si el valor de Ether baja, el tomador de riesgo pierde, pero el que evita el riesgo siempre no pierde. Por supuesto, el que evita el riesgo y el tomador de riesgo pueden acordar de antemano una “seguridad” que el que evita el riesgo tendrá que pagar, y también pueden acordar que el tomador de riesgo tendrá que proporcionar una garantía de varias veces el valor de 1000 CNY (cuanto mayor sea el doble, mayor será el riesgo que puede asumir).

En el ejemplo anterior, existe un problema que no está muy bien resuelto, es decir, cómo determinar el tipo de cambio entre el ether y la moneda virtual. Como mencionamos anteriormente, el contrato solo tiene acceso a los datos de la cadena de bloques, mientras que la moneda virtual es un dato que existe en el mundo físico y no en el mundo criptográfico.

Podemos diseñar otro Contract para especificar la lógica de extraer el tipo de cambio entre el Ether y la moneda virtual del mundo real, en cada ventana de tiempo (por ejemplo, una hora):

  • Todos pueden pagar una fianza a Contract y proporcionar un tipo de cambio.
  • Al final de la ventana de tiempo, Contract calcula el promedio de las tasas de cambio ofrecidas por los propietarios (ponderadas según la garantía) y las publica.
  • Se distribuirá la garantía recaudada entre las personas más cercanas al 25% de la media (ponderación de la garantía).

Para cualquiera de los participantes, presentar una tasa de cambio verdadera tiene una mayor probabilidad de obtener un premio, mientras que presentar una tasa de cambio muy extraña tiene una mayor probabilidad de perder la fianza.

Por supuesto, esta regla tiene algunas lagunas, por ejemplo, si una persona tiene una cantidad muy grande de garantía, entonces puede elevar el promedio a un precio más alto o más bajo que el tipo de cambio real y obtener una recompensa, y hacer que otras personas que proporcionan un tipo de cambio exacto pierdan la garantía. Pero en realidad es lo mismo en el mundo real, si usted tiene una gran cantidad de dinero también puede elevar o reducir el precio de un producto, pero en comparación con el mundo real, el volumen de la moneda electrónica es muy pequeño y no se requiere mucho dinero para hacerlo; pero en realidad, este tipo de aumento o presión maliciosa de la tasa de cambio también es muy riesgoso, ya que no puede estar seguro de que la garantía que paga es suficiente, y perderá toda la garantía si falla.

Otra vulnerabilidad es que “todo el mundo puede pagar la garantía al contrato y proporcionar un tipo de cambio”. Este paso se realiza mediante la creación de transacciones, y todas las transacciones se escriben en la Blockchain, por lo que el tipo de cambio que usted presenta es visible para otros, lo que crea más oportunidades para los atacantes maliciosos.

Antes mencionamos que Contract puede leer datos de la Blockchain, pero los datos de la Blockchain son definitivos, ¿de dónde se obtiene un número aleatorio si queremos implementar una aplicación similar al juego de azar?

Una fuente de números aleatorios que se puede pensar es el Hash del siguiente bloque, en la mayoría de los casos, este grado de aleatoriedad es suficiente. Pero en realidad el minero puede manipular este número aleatorio en cierta medida, suponiendo que un minero participe en un juego y que el beneficio del juego sea mayor que el beneficio de extraer una pieza, entonces si el minero extrae una pieza que lo hará perder el juego, entonces obviamente el minero elegirá no publicar esta nueva pieza, esto es más obvio en el caso de que el minero sea más poderoso.

Por lo tanto, necesitamos introducir un mecanismo similar a la convocatoria de tipos de cambio para solicitar un número aleatorio de semillas, y luego usar estas semillas para calcular un número aleatorio al final de cada ventana de tiempo y. Pero como la convocatoria de tipos de cambio, ya que los participantes se comprometen a crear transacciones para lograr el cambio de tipo de cambio, por lo tanto, entre una ventana de tiempo, los números aleatorios enviados por cada persona son visibles para todos los demás, por lo que una persona que ya ha participado en un juego puede seleccionar cuidadosamente un número aleatorio de semillas para que las semillas que otros han enviado, además de las nuevas semillas, produzcan un número aleatorio que cumpla con sus expectativas.

Por lo tanto, es necesario dividir la ventana de captación de semillas en dos partes para obtener un número aleatorio que nadie puede predecir ni intervenir:

  • Fase 1: Todos pueden pagar una fianza a Contract y proporcionar “el valor de un segmento de una semilla seleccionada al azar”.
  • Fase II: Las personas que participan en la Fase I ofrecen a Contract semillas no sembradas.
  • Finalización de la fase II: Contract se clasifica todas las semillas legales, genera un grupo de números aleatorios y se publica; regresa a la fase II con la fianza de la persona que proporcionó la semilla correcta.

En la primera etapa sólo se conoce el valor de las semillas que otros han enviado, sin saber las semillas reales, por lo que no se puede construir una semilla para interferir en el resultado; mientras que en la segunda etapa, todos solo están confirmando las semillas enviadas en la primera etapa, sin poder enviar nuevas, ni impedir que otros envíen semillas.

Anteriormente mencionamos que Bitcoin Script no ofrece la capacidad de hacer ciclos, recurrencias, saltos, etc. Tal vez Bitcoin sea para controlar el tiempo de ejecución de un Bitcoin Script, ya que según el “teorema de parada” de Turing, los programas escritos por lenguajes de programación completos de Turing no siempre pueden determinar si terminarán después de un número limitado de pasos solo desde el punto de vista del análisis estático, de modo que los atacantes maliciosos pueden configurar una transacción que cause un ciclo muerto para interrumpir el trabajo normal de los mineros.

Ethereum, por su parte, evadió el problema de nuevo con el “incentivo económico”. El contrato se ejecuta en forma de código operativo en una máquina virtual llamada EVM (Ethereum Virtual Machine), que es una máquina virtual con su propia “cuenta”, en la norma EVM, se define cada gas consumido por el código operativo en función de la memoria y el tiempo de la CPU requeridos para la operación, un recurso de cómputo comprado por Ether. Cuando el objetivo de una transacción es el contrato, el código del contrato se ejecuta, el iniciador de la transacción debe pagar el gas consumido durante la ejecución del contrato, al tiempo que declara “una disposición a pagar la mayor cantidad de gas posible”.

Luego volvemos a hablar de la cuestión del “intervalo de consenso”, mencionado anteriormente en Bitcoin, donde cada 10 minutos aparece un nuevo bloque, es decir, toda la red alcanza un “consenso” cada 10 minutos, por lo que la transacción de Bitcoin normalmente se confirma en una docena de minutos, y en los primeros días de la computadora no es muy potente, puede esperar una hora (six bloques) para que la gente considere que la transacción es confiable.

Obviamente, un tiempo de consenso más corto es una mejor experiencia para los usuarios, ¿por qué Bitcoin no acorta el tiempo de bloqueo? Esto se debe a que el intervalo de consenso más rápido aumenta en cierta medida la ventaja del “minero centralizado”. El llamado “minero” es el que los mineros de Bitcoin se reúnen para minar, los mineros obedecen las instrucciones del minero sin condiciones y finalmente se dividen los ingresos por acuerdo con el minero, obviamente, Bitcoin como un sistema descentralizado no desea que este minero centralizado tenga una ventaja adicional.

Cuando un minero A encuentra un nuevo bloque, él difunde este bloque, y los demás, una vez que reciben esta información, comienzan a trabajar de inmediato en base a este nuevo bloque. Mientras que los demás calculan que el tiempo entre “A encuentra un nuevo bloque” y “recibe la información de la transmisión de A” es en realidad un desperdicio, los otros mineros en el pozo de minería centralizada no tienen este problema, ya que pueden obtener más rápidamente la información de los nuevos bloques y comenzar a trabajar de inmediato en base al nuevo bloque.

blockchain-ethereum-without-uncles

La duración de esta transmisión puede ser de unos pocos segundos, lo que no es muy importante para 10 minutos, pero las ventajas de los pozos centralizados serán cada vez más evidentes si se acorta el intervalo de consenso. Pero Ethereum resolvió este problema introduciendo el concepto de “Uncle Block”, reduciendo el intervalo de consenso a 15 segundos, y Bitcoin tuvo una gran mejora en la velocidad de confirmación de pagos.

En la Blockchain de Bitcoin, un bloque puede tener solo un padre y solo un hijo. Pero en Ethereum, un bloque recién creado puede tener un padre y varios tíos. Volviendo al ejemplo anterior, si alguien excava un nuevo bloque en A pero otros no lo reciben en el momento de la transmisión, si alguien excava un nuevo bloque, pero debido a que la transmisión es más tardía y no es aceptada por todos, entonces este bloque tiene la posibilidad de convertirse en el “tío” de la siguiente bloque.

blockchain-ethereum-uncles

La imagen fue tomada de<https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

Cuestiones sin resolver

En la siguiente sección, voy a hablar de algunos de los problemas que aún no han sido resueltos por Ethereum.

El problema con la prueba de trabajo es que se desperdicia una gran cantidad de energía de cómputo para garantizar la seguridad de la red, aunque también se basa en la idea de “incentivo económico” que mencionamos anteriormente, pero en realidad se puede mejorar. Ehtereum cree que la mejor manera es usar POS (prueba de propiedad) en lugar de la prueba de trabajo, lo que puede mejorar enormemente la eficiencia de la red.

Si Ether es valioso en sí mismo, ¿por qué no usarlo para incentivarlo económicamente? El POS es que cada nodo que quiera participar en la generación de bloques (en el sentido tradicional de la minería) se llama verificador y tiene que pagar una garantía al sistema (en este caso, el sistema se refiere a lo estipulado en el protocolo, todos los nodos consideran que la garantía está “congelada”) y luego usar su propia garantía para la inscripción de un bloque que podría ser el próximo bloque.

Este modelo es muy similar al POW, en el cual los mineros usan su propio poder de cálculo para “apostar” y si una cadena es más larga, es necesario cambiar a esta cadena para continuar minando. Porque cuantas más personas participen en la cadena, más probabilidades hay de que sea la cadena correcta, y finalmente todos lleguen a un consenso. En el POS, en el que se apuesta con su propio dinero de garantía, también se tiende a elegir bloques que ya han sido apostados por muchos otros (si es que es legal), y finalmente se llega a un consenso.

Los puntos de venta aumentarán la capacidad de la red entera. Ya no se necesitará un gran número de cálculos sin sentido para llegar a un consenso, y el volumen de operaciones de cada nodo se acercará al volumen de cálculos para ejecutar el código del contrato y verificar los datos.

Por supuesto, la razón por la que POS no se ha adoptado actualmente es porque todavía hay algunos problemas sin resolver, uno de ellos es el problema del ataque al 51% como el de POW, en el cual el 51% de la computadora de toda la red centralizada en POW tiene un cierto límite físico debido a que la computación requiere un equipo de computación para proporcionarla; en comparación, el Ether del 51% de la red centralizada en POS es relativamente fácil de ganar siempre que tenga suficiente dinero.

El otro tema es el “fragmentado”, ya sea Bitcoin o Ethereum, que actualmente realiza todas las confirmaciones de transacciones en el mismo Blockchain, lo que limita enormemente la capacidad de cálculo de una red distribuida. Cada nodo necesita recibir, almacenar y validar cada transacción, y la capacidad de procesamiento de toda la red es equivalente a la capacidad de procesamiento de un nodo.

Por lo tanto, Ethereum quiere introducir un mecanismo de “fragmentación” en el futuro, para dividir toda la red en varias partes y verificar las transacciones de forma independiente. Pero las fragmentaciones entre ellas citan datos de otras fragmentaciones a través de la estructura del indicador y afectan a otras fragmentaciones mediante la invocación asíncrona, por lo que toda la red sigue siendo una sola en los ojos del usuario, pero la capacidad de procesamiento de toda la red tendrá una gran extensibilidad.

Contract

En esta sección voy a mostrar algunos de los códigos de Contract que realmente funcionan. Contract puede ser escrito en muchos lenguajes diferentes, que finalmente se compilarán en opcode para ejecutarse en EVM, y hoy elegimos como ejemplo el lenguaje JavaScript de la clase Solidity, que es el mejor lenguaje EVM mantenido actualmente.

contract Test {
  uint storedData; // State variable

  struct Voter { // Struct
    uint weight;
    bool voted;
    address delegate;
    uint vote;
  }

  event HighestBidIncreased(address bidder, uint amount); // Event

  function func() { // Function
    if (msg.sender.balance < 10 finney) {
        msg.sender.send(10 finney);
    }

    sha256("...");

    address nameServer = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
    nameServer.delegatecall("isAvailable", "MyName");
    nameServer.call("register", "MyName");
  }
}

En Solidity, puedes declarar una variable de estado (como en el caso de las variables de estado de la base de datos) y usarla para crear una variable de estado (como en el caso de las variables de estado de la base de datos).uint storedData;Los valores de estas variables se guardan en la cadena de bloques para siempre.structPara declarar estructuras de datos complejas; también se pueden definir funciones, que se ejecutan al recibir la transacción, y el iniciador de la transacción puede elegir qué funciones ejecutar, por lo que un contrato puede proporcionar varias funciones, dentro de las cuales se pueden realizar juicios lógicos, circular y modificar los valores de los cambios.

El lenguaje incluye algunas pequeñas funciones que son muy útiles, como los algoritmos de criptografía comunes.sha256Unidad de conversión10 finneyEn la página de Facebook de la empresa, se puede encontrar el nombre de la persona a la que se dirige.0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2Y así sucesivamentemsgEs una variable global incorporada que puede leer información relacionada con la transacción, como el iniciador, el monto, etc. Contract puede invocar el código de otro Contract de dos maneras:delegatecallEsto equivale a poner el código de otro Contract en el contexto de ejecución actual, como si se introdujera una función de la biblioteca; mientras quecallLa lógica de un nuevo contrato es la lógica de un nuevo contrato.

Este complejo trabajo es abstraído para ser una “variable de estado”, donde storedData es una variable de estado. En realidad, las modificaciones en las variables de estado durante la ejecución de un contrato no se guardan en la cadena de bloques, ya que el contrato se ejecuta con certeza.

A continuación, te mostramos un ejemplo de un contrato realmente funcional para emitir su propia moneda basada en la red Ethereum:

contract Coin {
    // The keyword "public" makes those variables
    // readable from outside.
    address public minter;
    mapping (address => uint) public balances;

    // Events allow light clients to react on
    // changes efficiently.
    event Sent(address from, address to, uint amount);

    // This is the constructor whose code is
    // run only when the contract is created.
    function Coin() {
        minter = msg.sender;
    }
    function mint(address receiver, uint amount) {
        if (msg.sender != minter) return;
        balances[receiver] += amount;
    }
    function send(address receiver, uint amount) {
        if (balances[msg.sender] < amount) return;
        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        Sent(msg.sender, receiver, amount);
    }
}

El código proviene dehttp://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example (MIT)

El contrato, denominado Coin, declara dos variables de estado:minterLos creadores de la moneda para almacenar esta moneda están construyendo la función ((function Coin()En la tabla de cifras de la primera transacción para la creación de Contract, se asigna a esta variable el nombre de la persona que la inició; también se declara una dirección de monedero a la tabla de cifras de la cartografía.balances, Se utiliza para indicar el saldo de cada dirección que posee el token.

mintEsta función determina si el iniciador de la transacción es el creador del token, y si es así, agrega una cierta cantidad de tokens a la dirección indicada de acuerdo con los parámetros de la función.sendEsta función puede ser invocada por todos y deduce una cierta cantidad de saldo de la dirección del iniciador de la transacción (si hay suficiente saldo) y la suma a la dirección de destino, lo que equivale a una función de transferencia.

También hemos declarado un nombre:SentLos eventos, los eventos en realidad no tendrán ningún papel práctico, solo facilitarán la impresión de eventos críticos en la configuración, y en el futuro también facilitarán la implementación de clientes ligeros (los clientes ligeros solo aceptan eventos sin ejecutar realmente el contrato).

blockchain-ethereum-mix

Ethereum ofrece un IDE llamado Mix para configurar este código, en la parte derecha de Mix puedes crear bloques y cuentas para probar tu Contract, y también puedes ver cómo cambian los valores de cada variable de estado durante la ejecución. Vale la pena mencionar que una vez que el contrato se publica, no se puede modificar, y luego el funcionamiento depende completamente de las transacciones de otras personas, lo que puede ser muy molesto para los programadores que escriben errores todos los días, pero el significado de Contract es “contrato”, y una vez que publiques un contrato, naturalmente no puedes modificarlo.

Una vez que se haya completado la redacción, podemos usar la billetera Ethereum para publicar el contrato en la red:

blockchain-ethereum-create-contract

Después de la publicación, puedes seguir el contrato y visitar la página de detalles del mismo:

blockchain-ethereum-wallet-contract

A la izquierda se pueden ver los valores de las dos variables de estado,minterEl valor de la dirección es mi propia dirección, y el valor de la dirección es mi dirección.balancesComo es una tabla de mapeo, puedes introducir una dirección para consultar el saldo de la misma.send¿Qué es eso?mintFunción, puedes llenar los parámetros para transmitir a Contract. Como aquí estamos enviando transacciones con el propósito de transmitir un mensaje y no Ether, no tenemos que establecer el monto de la transacción.

El siguiente es un interesante Contract, el cual tiene el efecto de un “escándalo ponche” en el que se le paga 1 Ether al Contract para entrar en el juego, y luego cada 3 personas que se suman, se les pagan 3 Ether a las personas que se han unido antes:

contract Pyramid {
    struct Participant {
        address etherAddress;
    }

    Participant[] public participants;

    uint public payoutIdx = 0;

    // events make it easier to interface with the contract
    event NewParticipant(uint indexed idx);

    // fallback function - simple transactions trigger this
    function() {
        enter();
    }

    function enter() {
        if (msg.value < 1 ether) {
            msg.sender.send(msg.value);
            return;
        }

        if (msg.value > 1 ether) {
            msg.sender.send(msg.value - 1 ether);
        }

        uint idx = participants.length;
        participants.length += 1;
        participants[idx].etherAddress = msg.sender;

        NewParticipant(idx);

        // for every three new participants we can
        // pay out to an earlier participant
        if (idx != 0 && idx % 3 == 0) {
            // payout is triple, minus 10 % fee
            uint amount = 3 ether;
            participants[payoutIdx].etherAddress.send(amount);
            payoutIdx += 1;
        }
    }

    function getNumberOfParticipants() constant returns (uint n) {
        return participants.length;
    }
}

Código simplificado<https://ethereumpyramid.com/contract.html

El código es muy simple, el Contract declara unparticipantsLa matriz se utiliza para almacenar las direcciones de las billeteras de todos los participantes en orden, o para declarar unapayoutIdxSe usa para registrar cuántos participantes han recibido el reembolso de 3 Ether.enterLa función principal de este contrato es que primero se realizan algunas comprobaciones de parámetros para garantizar que cada participante pague 1 ether, y luego se coloca a los nuevos participantes en el mercado.participantsAl final de la matriz, si el número de serie del participante actual es un múltiplo de 3, se envía 3 Ether al participante de la matriz.payoutIdxUn participante que también estará presente en el evento.payoutIdxSe refiere al siguiente participante.

Enlaces de referencia

HashTree:

  • El árbol de Merkle en inglés
  • El 100% de las reservas se comprobó en el blog bifubao.com
  • El modelo de objetos de Git

Bitcoin:

Halting Problem:

  • Los límites del cálculo (II): auto-referencia con lo indeterminado

Ethereum:

Ethereum Network:

Next of Ethereum:

Contract:

Contract IDE: