BlockChain y Ethereum se presentan juntos

El autor:No hay nada, Creado: 2016-05-05 17:31:57, Actualizado: 2016-05-05 17:32:31

¿Cómo se llama?https://jysperm.me/2016/05/blockchain-slides/

Este artículo es una recopilación de mi trabajo de compartir tecnología en LeanCloud a finales de marzo, asumiendo que el lector ya tiene conocimientos básicos de cifrado y una idea inicial de la implementación de Bitcoin.

Blockchain, también llamado blockchain, puede considerarse una especie de HashTree (árbol de hash), por lo que tiene algunas propiedades similares a HashTree:

blockchain-hash-tree

Las imágenes provienen de:http://happypeter.github.io/bitcoin_basics/book/017_merkle_tree.html

Es decir, en una estructura arbórea, cada nodo terminal tiene un valor de partición, mientras que los valores de partición de los nodos no terminales provienen de los valores de partición de todos sus nodos directos, por lo que cada nodo contiene, directa o indirectamente, la información de todos sus nodos secundarios. Por lo tanto, siempre que el valor de partición de cualquier nodo terminal cambie, los valores de partición de todos sus nodos padres cambiarán, y el nodo raíz también cambiará.

Puedo mencionar una aplicación de HashTree: "100% de prueba de reservas", que pertenece a la clase de problemas de prueba de conocimiento cero. Podemos considerar un escenario en el que el titular de Bitcion necesita enviar Bitcoin a un intercambio para realizar transacciones y, en teoría, el intercambio puede desviar el dinero (el saldo de la cuenta de todos los usuarios registrados) para usarlo, algo que los usuarios no quieren ver, y el intercambio también quiere ser limpio: el intercambio primero publica una dirección de Bitcoin que tiene, para que todos confirmen que la transacción realmente tiene tanto Bitcoin como saldo de reserva, pero ¿cómo demostrar que el dinero es mayor que la suma exacta de todos los usuarios?

blockchain-proof-of-reserves

Las imágenes provienen de:http://blog.bifubao.com/2014/03/16/proof-of-reserves

Podemos construir un HashTree donde todos los nodos finales representan a un usuario y contienen el saldo del usuario.ΣLos datos de los usuarios (como el número de correo electrónico) y la identificación del usuario (como la dirección del correo electrónico)h), mientras que el nodo padre contiene la suma de los saldos de sus nodos hijos.sum) y fragmentos de la información de todos los subnodoshashPara cada usuario, solo le mostrará su propio nodo terminal y el de sus hermanos, todos sus nodos padres y los nodos hermanos de sus nodos padres, ya que este usuario puede confirmar su saldo en el nodos padre y, finalmente, en el nodos raíz mediante un proceso de retroceso gradual.

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 saber de otros saldos de uso.h¿Por qué?e4df9d12Los nodos no deben ser un nodo de extremo que representa a los usuarios, sino un nodo de información agregado (que puede contener un usuario con 3333 saldos y un usuario ficticio con 0 saldos) para evitar la filtración de información privada de un usuario.

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

blockchain-git-objects-example

Las imágenes provienen de:http://gitbook.liuhui998.com/1_2.html(GPL v2)

En Git, ya sea un blob, un índice, un árbol o un compromiso, cada uno tiene 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 modificado, el Commit en sí mismo es determinado por su contenido y esta información.

Git utiliza Blockchain para determinar un historial único para el repositorio. Si un Commit se modifica, todos los Hash de los Commits posteriores cambian. Por supuesto, dado que Git es solo una herramienta de control de versiones, no te impide modificar el historial (puedes rebasearlo después de todo).push --forceEn la página de Facebook de la publicación, el autor de la publicación, el autor de la publicación y el autor de la publicación, explican que "el cambio en el contenido de la publicación es muy importante, pero que todos los coautores lo notarán".

Otra de las aplicaciones clásicas de Blockchain es Bitcoin, que es el que dio a conocer el término Blockchain (y el concepto siempre ha existido):

blockchain-bitcoin-block-data

Las imágenes provienen de:https://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 el Blockchain entero constituye un único libro de contabilidad descentralizado. Debido a que un nuevo bloque se genera cada diez minutos, y una vez que se crea, el bloque permanece para siempre en el Blockchain, el Blockchain fija el orden en que ocurren las transacciones, manteniendo el orden anterior de las transacciones, lo que determina si una cuenta tiene suficiente saldo para iniciar una transacción.

El Bitcoin

La primera parte de este post es simplemente un repaso de Bitcoin.

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

Por defecto, cada minero siempre va a confiar en la "cadenas más largas" y calcular el próximo bloque sobre la base de la cadena más larga conocida que cumple con las reglas, de lo contrario, su poder de cálculo se desperdicia en blanco.

Bitcoin está diseñado para generar un nuevo bloque cada 10 minutos, un tiempo que se logra al ajustar la dificultad de la generación del próximo bloque observando el intervalo de tiempo de los bloques anteriores. Cuando los bloques anteriores se generan más rápido de lo esperado, se cree que el siguiente bloque debería tener una dificultad mayor.

Normalmente, cada nodo de Bitcoin requiere almacenar la totalidad de los datos de Blockchain para confirmar si una transacción es legítima. Se pregunta si el promotor de la transacción tiene suficiente saldo para iniciar la transacción. Pero ahora hay 66G de blockchain completa, y está creciendo a una velocidad de alrededor de 0.1G por día. Si se requiere que cada usuario de Bitcoin almacene la blockchain completa no es demasiado exigente, por lo que Bitcoin tiene un mecanismo de "SPV de confirmación simplificada, verificación de pago simplificada", el llamado "cliente de nivel ligero", que puede optar por no almacenar la blockchain completa, sino que se adhiere a uno o varios nodos completos y solo almacena toda la información (Hash, prueba de transacción, prueba de trabajo), y luego verifica el volumen de trabajo de cada bloque de Hash, para que cada vez que se necesite verificar la transacción en el punto de verificación de la transacción, la verificación de la transacción se realice en el Block Block de Bree, que también es la forma necesaria de obtener la información de la transacción.

blockchain-bitcoin-state-machine

Las imágenes provienen de:https://github.com/ethereum/wiki/wiki/White-Paper

  • Blockchain y el libro de contabilidad y el registro de cambios de estado
  • Transaction Array Transaction Array Un cambio de estado
  • El bloqueo es un "consenso" sobre el estado actual.

De hecho, podemos imaginar la Blockchain de Bitcoin como una "máquina de estado", toda la Blockchain como un "libro de contabilidad" con un estado en el que se almacenan los registros de cada transacción, y de acuerdo con estos registros se puede deducir el "estado" de la cuenta en cualquier momento.

Moneda alternativa

También se han derivado muchas otras monedas criptográficas basadas en Bitcoin, a menudo llamadas "Alt Coin", que generalmente tienen dos implementaciones:

El primero es que utiliza su propia red, independiente de Bitcoin, lo que significa que el protocolo y las reglas de la criptomoneda pueden ser diseñadas con mucha flexibilidad, pero la capacidad de defensa contra ataques maliciosos es muy débil debido a que el número de usuarios es difícil de alcanzar.

La segunda es la implementación de un "metaprotokolo" en la red de Bitcoin, que incluye una información personalizada sobre la transacción de Bitcoin para implementar su propia lógica. Los beneficios son que se puede aprovechar la escala de computación de Bitcoin para resistir los ataques, pero al mismo tiempo, debido a que no todos los mineros que están conectados a la red de Bitcoin siguen las reglas de las monedas, por lo que no se puede evitar que los bloques que no cumplen con las reglas entren en la Blockchain, solo se pueden filtrar las transacciones que no cumplen con las reglas en el cliente, o no se puede aprovechar la función de confirmación simplificada que ofrece Bitcoin mencionada anteriormente.

Para estas monedas, Bitcoin puede ofrecer una Blockchain con una gran participación de mineros, capaz de resistir ataques maliciosos a gran escala, y también puede llevar datos personalizados en las transacciones de Bitcoin, lo que deja un cierto espacio para la implementación de monedas digitales.

Bitocin también ofrece unaEscritura de BitcoinSin embargo, como esta no es la función central de Bitcoin, solo se pueden realizar operaciones relativamente simples, solo se pueden leer datos muy limitados en la Blockchain, y es difícil escribir una lógica general, completa de Turing, debido a la falta de mecanismos de ciclo.

Ethereum

blockchain-ethereum

Las imágenes provienen de:https://www.ethereum.org/assets(CC 3.0)

Ethereum (Ethereum) es una plataforma de aplicaciones descentralizadas basada en la cadena de bloques que construye la infraestructura de Bitcoin y la tecnología de la cadena de bloques basada en la criptografía para una plataforma universal, y complementa algunas de las funciones que faltan en la red Bitcoin para que los desarrolladores puedan ejecutar sus propias aplicaciones descentralizadas en la cadena de bloques.

Antes de entrar en detalles sobre Ethereum, me gustaría presentar dos de los dos principales fundamentos de la red descentralizada: la criptología y el juego. La criptología, por supuesto, no necesita decir mucho, sino que garantiza la seguridad matemáticamente a través de cifrado de claves públicas, firmas digitales, conjuntos y algoritmos de resumen; mientras que el juego significa que en una red descentralizada, en la que cualquiera, incluidos los que desean atacarla maliciosamente, pueden participar, la red descentralizada debe pensar en la relación de intereses de cada participante al diseñarla, asegurando que el cumplimiento de las reglas maximice los intereses y que las reglas sean violadas para sufrir pérdidas o asumir riesgos.

Sin embargo, en el mundo digital, la publicación de un dato no tiene costo, no hay "beneficios" y "pérdidas", por lo que es necesario establecer algún tipo de conexión con el mundo físico para definir "beneficios". Por ejemplo, en la red Bitcoin, si un atacante desea cambiar artificialmente el rumbo de Blcokchain, necesita tener una mayor potencia computacional que todos los demás mineros, mientras que en el mundo físico, la potencia computacional es proporcionada por equipos de computación, y los equipos de computación deben ser comprados del mundo físico.

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

El contrato 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 clave, hay una dirección que posee el "código", el contrato.

  • Los resultados de los cálculos en realidad no necesitan ser almacenados en la cadena de bloques, ya que pueden ser recalculados en cualquier momento.
  • Se pueden llamar funciones de otros contratos (el código y los datos de otros contratos también están en la cadena de bloques).
  • En el proceso de ejecución, se pueden crear nuevas transacciones (manipular el saldo de su propio monedero) que pueden ejecutarse en otros Contratos.

Para comenzar con un ejemplo de un "monedero compartido", en el cliente oficial de Ethereum hay una función para crear monederos multijugador:

blockchain-ethereum-multi-sig-wallet

Como se muestra, con esta función se puede crear una dirección de billetera compartida con otras 2 personas, cada una de las cuales puede usar hasta 100 Ether por día, y si se supera este límite, debe obtener el consentimiento de la otra persona.

Esta función en realidad crea un contrato, y la lógica anterior se describe a través del código en el contrato. Cuando desea gastar dinero de este monedero compartido, debe enviar un mensaje a este monedero compartido (transacción es un mensaje, el monto de la transacción puede ser cero y solo lleva datos), y el código del monedero compartido se ejecutará, iniciando una transacción de gasto real si la solicitud de gasto cumple con la lógica anterior, de lo contrario, la solicitud de gasto se rechazará sin un gasto real).

Otro ejemplo es el de los "contratos de cobertura", donde se ha dicho que Bitcoin es una moneda digital cuyo valor (y el tipo de cambio de las monedas legales) es inestable, y que a menudo hay situaciones en las que el valor de la moneda sube o cae dos veces entre un día y otro, pero si se realiza un contrato de cobertura con el uso de un contrato, se puede resolver el problema hasta cierto punto.

La persona que desea mantener el valor de la moneda invariable se llama "el evitador de riesgos", y la otra persona que está dispuesta a asumir el riesgo de la volatilidad de la moneda y a beneficiarse de ella se llama "el asumidor de riesgos", por lo que pueden 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:

  • Los evasores envían 1000 CNY de Ether a la dirección de la billetera del Contrato, y los asumidores también envían 1000 CNY (o más) de Ether al Contrato para pagar (si no hay nadie que pague, los evasores pueden recuperar su Ether).
  • Después de un mes, los evasores de riesgo pueden recuperar el Ether del Contrato, que en ese momento valía 1000 CNY, y el resto del Ether es recuperado por el Asesor de Riesgo, independientemente del tipo de cambio entre el Ether y el CNY.

Si el valor del Ether aumenta, el riesgo asumido es beneficioso, si el valor del Ether disminuye, el riesgo asumido es perjudicial, pero el riesgo evitado siempre es beneficioso. Por supuesto, el riesgo evitado y el riesgo asumido pueden acordar previamente una "compensación" que el riesgo evitado debe pagar, o también se puede acordar que el riesgo asumido debe proporcionar una garantía de varios veces más de 1000 CNY ("cuanto mayor sea la multiplicidad, mayor es el riesgo que puede asumir").

En el ejemplo anterior, también hay un problema que no se resuelve muy bien, es decir, cómo determinar el tipo de cambio entre Ether y la moneda real, ya que antes mencionamos que Contract solo puede acceder a los datos en la cadena de bloques, y la moneda real es un dato que existe en el mundo físico y no en el mundo criptográfico, y necesitamos introducir este tipo de "datos del mundo no criptográfico" en la cadena de bloques a través de algún mecanismo.

Podemos diseñar otro contrato que especifique la lógica para obtener el tipo de cambio entre Ether y la moneda real desde el mundo real, en cada ventana de tiempo (por ejemplo, una hora):

  • Todo el mundo puede depositar una fianza en Contract y ofrecer un tipo de cambio.
  • Al final de la ventana de tiempo, Contract calcula y publica la media de los tipos de cambio ofrecidos por todos (de acuerdo con el peso de la fianza).
  • Los fondos de garantía recolectados se distribuirán entre el 25% más cercano a la media (de acuerdo con el peso de la garantía).

Para cualquiera de los participantes, presentando una moneda real, ya que no conocen la oferta de los demás, hay una mayor probabilidad de obtener una recompensa, mientras que presentando una moneda increíble, habrá una gran probabilidad de perder la fianza.

Por supuesto, hay algunas fallas en esta regla, por ejemplo, si una persona tiene una gran cantidad de dinero en garantía, puede obtener una recompensa al mismo tiempo que el promedio se eleva a un precio más alto o más bajo que el tipo de cambio real, y perder la garantía de otras personas que ofrecen el tipo de cambio exacto. Pero en realidad, en el mundo físico, si tienes una gran cantidad de dinero, también puedes subir o bajar el precio de un producto, solo que el volumen de la moneda electrónica es pequeño en comparación con el mundo físico y no se necesita mucho dinero para hacerlo; pero en realidad, subir o bajar la tasa de cambio maliciosamente también es muy riesgoso, ya que no estás seguro de que pagas suficiente garantía, y si lo haces, perderás todo el dinero en garantía.

Otra vulnerabilidad es que "todo el mundo puede depositar garantías en el 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 cadena de bloques, por lo que el tipo de cambio que envías es en realidad visible para otras personas, lo que crea más oportunidades para los atacantes maliciosos.

Ya hemos mencionado que los contratos pueden leer los datos de la cadena de bloques, pero los datos de la cadena de bloques son definitivos, y si vamos a implementar una aplicación similar al juego, ¿de dónde vamos a obtener un número aleatorio?

Una fuente de números aleatorios que se puede pensar es el Hash del próximo bloque, y en la mayoría de los casos, este grado de aleatoriedad es suficiente. Pero en realidad, el minero puede manipular este número aleatorio hasta cierto punto, suponiendo que un minero participe en una apuesta y la ganancia de la apuesta es mayor que la ganancia de extraer un bloque, entonces si el minero extrae un bloque que lo hará perder el juego, es evidente que el minero optará por no publicar el nuevo bloque, lo que es más evidente en el caso de la capacidad de cálculo de un solo minero.

Por lo tanto, necesitamos introducir un mecanismo similar al de la tasa de cambio para recopilar un número aleatorio de semillas y luego usar esas semillas para calcular un número aleatorio al final de cada ventana de tiempo. Pero al igual que la tasa de cambio de recopilación, ya que los participantes realizan la tasa de envío mediante la creación de transacciones, por lo que entre una ventana de tiempo, los números aleatorios que cada persona envía son visibles para los demás, por lo que una persona que ya ha participado en una apuesta puede seleccionar cuidadosamente un número aleatorio de semillas para que las semillas que otros han enviado más el número de semillas aleatorias que se generan sean exactamente las que él espera.

Así que es necesario dividir la ventana de la captación de semillas en dos partes para obtener un número aleatorio que nadie puede predecir e intervenir:

  • Fase 1: Todos pueden pagar una fianza al Contrato y proporcionar "el valor de lote de una semilla seleccionada al azar".
  • Fase 2: Los participantes en la fase I proporcionan semillas sin serse partidas al Contrato.
  • Finalización de la fase II: el contrato partimenta todas las semillas legítimas, genera un conjunto de números aleatorios y se publica; retorno de la garantía de la persona que proporciona la semilla correcta en la fase II.

En la primera fase, sólo se sabe el valor de las partidas de semillas que otros han presentado, sin saber las semillas reales, por lo que no se puede construir una semilla para interferir en los resultados; en la segunda fase, todos solo confirman las semillas presentadas en la primera fase, no pueden presentar nuevas, ni pueden impedir que otros presenten semillas.

Se mencionó anteriormente que Bitcoin Script no ofrece la capacidad de circular, regredir o saltar, y tal vez Bitcoin es una consideración para controlar el tiempo de ejecución de Bitcoin Script, ya que según el "teorema de parálisis" de Turing, los programas escritos por el lenguaje de programación completo de Turing no siempre pueden decidir si terminan o no en un punto de vista de análisis estático, de modo que los atacantes maliciosos pueden construir una transacción que cause un ciclo muerto para interferir con el trabajo normal de los mineros.

Ethereum, una vez más, evita este problema con un "incentivo económico", el contrato se ejecuta en forma de opcode (código operativo) en una máquina virtual llamada EVM (Ethereum Virtual Machine), una máquina virtual con un "facturador" propio, en el estándar de EVM, se define la cantidad de Gas consumida por cada opcode, un recurso computacional comprado por Ether, según la memoria y el tiempo de CPU necesarios para la operación. Cuando se menciona anteriormente que el objetivo de una transacción es un contrato, el código del contrato se ejecuta, el promotor de la transacción debe pagar por la cantidad de Gas consumida en el proceso de ejecución del contrato, al tiempo que declara "la cantidad máxima de Gas que está dispuesto a pagar", y si se agota el medio, el contrato se detendrá.

Luego volvemos a discutir el problema del "intervalo de consenso", mencionado anteriormente en Bitcoin, donde un nuevo bloque aparece cada 10 minutos, es decir, la red entera llega a un "consenso" cada 10 minutos, por lo que las transacciones normales de Bitcoin tardan unos diez minutos en confirmarse, y en los primeros tiempos no son muy poderosos, pueden tardar una hora (seis bloques) antes de que se 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 los intervalos de consenso más rápidos aumentan en cierta medida las ventajas del "minero centralizado". El llamado "minero" se refiere a que los mineros de Bitcoin se reúnen para minar, los mineros obedecen incondicionalmente las instrucciones del grupo y finalmente acuerdan el reparto de ganancias con el grupo.

Cuando un minero A excava un nuevo bloque, difunde este bloque, y los demás comienzan a trabajar sobre el nuevo bloque inmediatamente una vez que reciben la noticia; mientras que otros calculan que el tiempo entre "A excava el nuevo bloque" y "A recibe la noticia de la emisión" es en realidad un desperdicio, mientras que los otros mineros en el grupo de minas centralizado no tienen este problema, ya que pueden obtener información sobre el nuevo bloque más rápidamente y comenzar a trabajar sobre el nuevo bloque de inmediato.

blockchain-ethereum-without-uncles

El tiempo de la transmisión puede tardar una decena de segundos, lo que no es muy importante para 10 minutos, pero si se reduce el intervalo de consenso, las ventajas de un grupo de minería centralizado serán cada vez más evidentes. Pero Ethereum solucionó este problema con la introducción del concepto de "Uncle Block", reduciendo el intervalo de consenso a 15 segundos, lo que supone una gran mejora en la velocidad de confirmación de pagos en comparación con Bitcoin.

En la Blockchain de Bitcoin, un bloque puede tener solo un bloque padre y solo un bloque hijo; pero en Ethereum, un bloque recién generado puede tener un bloque padre y varios bloques. Volviendo al ejemplo anterior, si en A se excava un nuevo bloque pero otros no lo han recibido en el tiempo de la emisión, si alguien excava un nuevo bloque, pero debido a que la emisión no ha sido aceptada por todos, entonces este bloque tiene la posibilidad de convertirse en el "bloque tío" del siguiente bloque.

blockchain-ethereum-uncles

Las imágenes provienen de:https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time

Problemas aún no resueltos

En la siguiente sección, voy a hablar de algunos de los problemas que Ethereum aún no ha resuelto.

La primera es que el consensus actual de Ethereum es que, al igual que Bitcoin, solo los nodos que completan una cantidad específica de trabajo pueden participar en la creación de bloques. El problema de la prueba de trabajo es que se desperdicia una gran cantidad de energía computacional para garantizar la seguridad de la red, aunque también se basa en la idea de "incentivos económicos" mencionada anteriormente, pero en realidad se puede mejorar.

Si el éter es valioso en sí mismo, ¿por qué no utilizarlo como un incentivo económico? POS es la garantía de que todos los nodos que deseen participar en la generación de bloques (minería en el sentido tradicional) deben pagar una fianza al sistema (en este caso, el sistema se refiere a un protocolo en el que todos los nodos consideran que la fianza ha sido "congelada") y luego todos pagan su fianza para que el bloque pueda convertirse en el siguiente bloque.

Este modelo es muy similar al POW, en el POW, los mineros "apostan" con su propio poder de cálculo, y si una cadena es más larga, es necesario cambiar a esta cadena para continuar minando.

El POS aumentará el rendimiento de toda la red. Ya no se necesitará un consenso con una gran cantidad de cálculos sin sentido, y la cantidad de operaciones de cada nodo se acercará a la cantidad de cálculos para ejecutar el código en el contrato y verificar los datos.

Por supuesto, la razón por la que los POS no se han adoptado todavía es porque todavía hay algunos problemas que no se han resuelto, uno de ellos es el problema del ataque del 51% como en el POW, donde el 51% de la capacidad de computación de la red central en el POW tiene ciertas limitaciones físicas. En comparación, recoger el 51% de Ether de la red central en el POS es relativamente fácil, siempre que tengas suficiente dinero.

Otro tema es el "fragmento", ya sea Bitcoin o Ethereum, que actualmente se confirman todas las transacciones en la misma Blockchain, lo que limita enormemente la capacidad computacional de una red distribuida.

Por lo tanto, Ethereum espera introducir en el futuro un mecanismo de "fragmentación" para dividir toda la red en varias partes y verificar las transacciones independientemente entre sí. Pero entre los fragmentos, la estructura del puntero referirá a los datos de otros fragmentos a través de una llamada asíncrona que afectará a otros fragmentos, por lo que la red entera seguirá siendo una unidad a los ojos del usuario, aunque la capacidad de procesamiento de la red entera tendrá una gran escalabilidad.

Contrato

En esta sección voy a mostrar algunos códigos reales y funcionales de los contratos. Los contratos pueden ser escritos en muchos lenguajes de paradigma diferentes, que finalmente se compilarán en opcode y se ejecutarán en EVM, y hoy elegimos como ejemplo el lenguaje JavaScript de la clase Solidity, que es uno de los lenguajes EVM mejor mantenidos 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");
  }
}

Estas son algunas de las demostraciones de la gramática básica en la que puedes declarar variables de estado en Solidity.uint storedData;El valor de estas variables se guarda para siempre en la cadena de bloques; se puede usar para obtener información sobre las variables de la cadena de bloques.structPara declarar estructuras de datos complejas; también se pueden definir funciones que se ejecutan al recibir transacciones, y el iniciador de la transacción puede elegir qué funciones ejecutar, por lo que un contrato puede ofrecer varias funciones para realizar juicios lógicos, circular y cambiar el valor de las modificaciones dentro de las funciones.

El lenguaje tiene algunas pequeñas funciones muy útiles, como los algoritmos de cifrado comunes.sha256El cambio de unidades10 finney¿Cómo puedo hacer esto?0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2¿Qué es esto?msgEs una variable global incorporada que puede leer información relacionada con la transacción, como el iniciador, la cantidad, etc. Contract puede llamar el código de otro contrato de dos maneras, y puede ser usado para hacer una transacción.delegatecallEs el equivalente a poner el código de otro contrato en el contexto actual de ejecución, como si se introdujera una función de biblioteca;callLa lógica es iniciar una nueva transacción para activar otro contrato.

Entonces, ¿cómo se lee y escribe el contrato a partir de la cadena de bloques? Este trabajo complejo se abstrae para "variables de estado", donde el almacenado Data es una variable de estado. En realidad, las modificaciones de las variables de estado durante la ejecución del contrato no se guardan en la cadena de bloques, ya que el contrato se ejecuta como un cálculo de certeza.

Ahora voy a mostrar una pieza de contrato realmente disponible para lanzar un token propio basado 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)

Este contrato, llamado Coin, declara dos variables de estado, y las dos variables de estado son las siguientes:minterLos creadores de este token, que se utilizan para almacenar, están construyendo una función ().function Coin()) que atribuye a esta variable el valor de la primera transacción iniciada para crear el Contract; también declara un mapa de direcciones de billeteras a númerosbalancesEn el caso de las monedas de criptomonedas, el saldo de cada uno de los titulares del token es el siguiente:

mintEn esta función, se determina si el iniciador de la transacción es el creador del token, y si es así, se agrega un cierto número de tokens a la dirección indicada según los parámetros de la función.sendEsta función, que puede ser llamada por todos, deduce una cantidad de saldo de la dirección del iniciador de la transacción (si hay suficiente saldo) y se suma a la dirección de destino, lo que equivale a una función de transferencia.

También hemos anunciado un proyecto llamadoSentLos eventos no tienen ningún efecto práctico, sino que imprimen eventos críticos en el momento de la desactivación, lo que facilitará la implementación de clientes ligeros en el futuro (los clientes ligeros solo aceptan eventos y no ejecutan realmente contratos).

blockchain-ethereum-mix

Ethereum ofrece un IDE llamado Mix para deshacerse de este código, en el lado derecho de Mix puedes crear algunos Bloques y cuentas para probar tu Contract y ver cómo cambia el valor de cada variable de estado en el proceso de ejecución. Vale la pena mencionar que el Contract una vez publicado no puede ser modificado, y que su funcionamiento posterior se basa exclusivamente en las transacciones de otras personas, lo que es muy molesto para los programadores que escriben bugs todos los días, pero la semántica de Contract es "contrato", porque una vez que publicas un contrato que no puede modificarse naturalmente, de lo contrario, ¿quién confiará en tu contrato?

Una vez escrito, podemos publicar este contrato en la red con el monedero Ethereum:

blockchain-ethereum-create-contract

Después de la publicación, puedes seguir este contrato y puedes consultar la interfaz de detalles del contrato:

blockchain-ethereum-wallet-contract

En el lado izquierdo se pueden ver los valores de las dos variables de estado.minterEl valor es mi propia dirección.balancesComo es una tabla de mapas, puedes introducir una dirección para consultar su saldo. A la derecha puedes iniciar una nueva transacción con este contrato, y hay un menú desplegable para elegir.send¿O tambiénmintFunción, puedes llenar el parámetro de pasar a Contract. Porque aquí el objetivo de enviar transacciones es transmitir un mensaje, no transmitir Ether, así que no tenemos que establecer el monto de la transacción.

A continuación, voy a presentar un contrato muy interesante, que tiene un efecto de "engaño de Ponzi" en el que puedes pagar 1 Ether por este contrato para unirte al juego, y luego cada tres personas que se unen a este contrato, se les paga 3 Ether a los primeros en unirse, en orden:

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;
    }
}

El código es simplificado.https://ethereumpyramid.com/contract.html

El código es muy simple, el contrato declara unaparticipantsEl conjunto se utiliza para almacenar la dirección de la billetera de todos los participantes en orden, o se declara unapayoutIdxPara registrar cuántos participantes han recibido 3 Ether antes.enterLa principal función de este contrato es comprobar algunos parámetros, asegurando que cada participante pague 1 Ether, y luego poner a los nuevos participantes en el mercado.participantsAl final de la matriz, finalmente si el número del participante actual es un múltiplo de 3, se envía 3 Ether al número de la matriz.payoutIdxLos participantes, y los que están aquí,payoutIdxEn la página web de la organización, se muestra el siguiente participante:

Enlaces de referencia

HashTree:

El Bitcoin:

Problemas de detención:

Ethereum:

Red Ethereum:

Lo siguiente de Ethereum:

Contrato:

Contrato IDE:


Más.

Un sueño pequeño.No entiendo nada, sólo entiendo algo, pero entiendo muy poco.

- ¿ Qué?El jefe fue a investigar BTC y ETH.

el momoxNo entiendo.