El análisis de estrategia y el intercambio de casos más completo de Ethereum

1. Introducción a "Ethereum"

① ¿Qué es “cadena de bloques”?

(A) Concepto de “cadena de bloques”
  • "Blockchain" se refiere a un registro público de todas las transacciones procesadas y mantenidas por una serie de computadoras independientes en una red específica. En lugar de administrar estas bases de datos de transacciones de manera centralizada (como Amazon o Facebook controlan sus propios datos), bloquea allí No hay un único propietario de datos en la cadena, lo que la hace descentralizada. Las computadoras en esta red siguen especificaciones y mecanismos específicos para mantener registros de todas las transacciones. Estas especificaciones permiten a las computadoras ponerse de acuerdo sobre todo lo que ocurre en la red. comportamiento, o un consenso al respecto .
  • Las computadoras en la red son independientes, por lo que las computadoras D y E (y F y G...) pueden no conocer las computadoras A, B o C. El conjunto de reglas de blockchain significa que una sola computadora puede acordar transacciones que han ocurrido en la historia de blockchain sin tener que verificar de forma independiente la exactitud de los datos proporcionados por otras computadoras. En otras palabras, las computadoras pueden llegar a un consenso sin confiar entre sí. Este mecanismo de consenso sin confianza es de suma importancia entre las computadoras de la red. Existe una gran cantidad de blockchains y cada cadena sigue sus propios estándares para llegar a un consenso. La cadena de bloques Ethereum se compromete a proporcionar servicios de infraestructura y espacio de diseño para aplicaciones interesantes y novedosas en diferentes campos, como juegos, arte, finanzas y aplicaciones de redes sociales.
(B) Mecanismo de consenso
  • Un "mecanismo de consenso" es cuando todas las computadoras en la cadena de bloques están de acuerdo sobre los hechos que ocurren en la red, y es entonces cuando "se alcanza el consenso". Se llega a un consenso entre computadoras individuales según las reglas de la cadena de bloques, y cada vez que se empaqueta una nueva transacción en la cadena, todas las computadoras deben pasar por todo el proceso para llegar a un consenso. Una vez que estas computadoras llegan a un consenso, los bloques de transacciones se empaquetan en la cadena de bloques y pasan a formar parte de la historia de la red. Básicamente, esto significa que suponiendo que las computadoras estén de acuerdo con cada nueva transacción que se agrega a la cadena, están de acuerdo con toda la historia de la cadena de bloques porque tienen que participar en cada paso de la misma.
  • El consenso es un concepto importante que sustenta todo el mundo blockchain. Cómo verificar las transacciones que ocurren en él sin confiar en ningún participante de la red es un problema humano muy difícil de resolver, y blockchain es la respuesta a este problema: la solución óptima. Diferentes especificaciones (o "mecanismos de consenso") pueden permitir que las computadoras personales alcancen un consenso en la cadena de bloques.
  • Los dos principales mecanismos de consenso se presentan a continuación:
    • Prueba de trabajo (PoW): en el mecanismo de prueba de trabajo, las computadoras compiten para resolver problemas matemáticos complejos. La red ofrece una recompensa financiera a la primera computadora que resuelva un problema, lo que incentiva a las personas detrás de las computadoras a seguir actualizando y ejecutando nodos (en otras palabras, asegurando que la red siga procesando transacciones). Este proceso de competir para resolver problemas matemáticos computacionalmente intensivos se llama minería. Básicamente, las transacciones que se verifican como legítimas se pueden agregar de forma segura a la cadena de bloques, que también es la regla implementada por la cadena de bloques de Bitcoin y la cadena de bloques de Ethereum actual. El mecanismo de prueba de trabajo también tiene sus desventajas, principalmente que eventualmente las computadoras más potentes (y caras) son capaces de resolver el problema más rápido, por lo que los ricos se hacen más ricos; resolver problemas matemáticos difíciles en una computadora requiere mucho esfuerzo Energía , este se ha convertido en el punto más criticado de toda la cadena de bloques.
    • Mecanismo de prueba de participación (PoS): en lugar de gastar una gran cantidad de potencia informática para llegar a un consenso (como PoW), el mecanismo de prueba de participación utiliza el riesgo de castigo (y algunos incentivos económicos) para limitar/incentivar a los participantes. En un mecanismo de prueba de participación, los participantes recaudan fondos (técnicamente, “apuestan” sus propios fondos) a cambio de participar en un proceso de selección aleatorio. Una computadora seleccionada al azar necesita verificar el siguiente lote de transacciones futuras. Cuando una computadora seleccionada al azar procesa correctamente una transacción (dentro de las limitaciones del mecanismo de prueba de participación), puede ser recompensada. Si un participante seleccionado al azar por la red viola las disposiciones del mecanismo de prueba de participación, los activos apostados de este participante se reducirán (o "recortarán"). En lugar de pedir a todas las computadoras de la red que resuelvan esos acertijos matemáticos al mismo tiempo, la cadena de bloques PoS verifica las transacciones seleccionando computadoras al azar. Saltarse el pesado proceso computacional alivia dos problemas importantes con los mecanismos PoW. Esta es parte de la razón por la que Ethereum planea habilitar este mecanismo de consenso cuando planee implementar la cadena de bloques de próxima generación en 2022.
(C) Nodo
  • Los "nodos" son para el funcionamiento de la cadena de bloques Ethereum, y los participantes en la red necesitan ejecutar un software específico para ayudarlos a interactuar con la cadena de bloques. Me gusta pensar que cada nodo actúa como una computadora independiente que ejecuta el software Ethereum. Asimismo, cuantos más nodos (participantes en la red) más descentralizada está, pero en ocasiones mantener todos los nodos es un poco engorroso.
  • Los diferentes nodos tienen diferentes propósitos:
    • Nodo completo: se utiliza para almacenar datos completos de la cadena de bloques, ayuda a que los bloques se verifiquen y empaqueten en la cadena, y estos nodos también proporcionan prueba de validez para transacciones pasadas;
    • Nodos ligeros: las funciones son relativamente menores que las de los nodos completos en diseño. En comparación con el almacenamiento de datos completos de blockchain, los nodos ligeros solo almacenan una cantidad menor de pruebas de transacciones pasadas. Este tipo de nodos permite que más personas participen en la red porque almacenan menos datos, más económico de ejecutar;
    • Nodos de archivo: son la biblioteca/diccionario Wikipedia del mundo Ethereum. Almacenan todos los datos del nodo completo e incluso más. Las herramientas de análisis y los proveedores de billeteras pueden usar nodos de archivo para extraer información de hace mucho tiempo.
  • Cliente: este es el software de Ethereum que permite a las computadoras (nodos) interactuar con la red Ethereum. Los nodos individuales pueden elegir qué software de cliente quieren usar, pero tener algunos tipos diferentes de clientes es crucial para la descentralización en caso de que uno de ellos sufra errores o problemas. Ahora existen dos tipos de clientes de ejecución y clientes de consenso, pero esto está fuera del alcance de esta guía. Hoy en día, hay muchos clientes disponibles en la cadena, y la comunidad Ethereum ha presionado recientemente para que algunos de los operadores de nodos más grandes diversifiquen los clientes en los que ejecutan sus nodos. Es importante destacar que cualquier usuario que desee participar en la ejecución de la red Ethereum puede crear su propio cliente, lo que significa que los usuarios no tienen que depender de una entidad de terceros para validar la cadena de bloques por ellos.
  • Estado: El estado de la cadena de bloques Ethereum se refiere a los saldos de las cuentas en la cadena de bloques en un momento dado. Una vez que sucede algo nuevo (como procesar un nuevo bloque de transacción), el estado se actualiza para reflejar con precisión el estado de la cadena de bloques después de empaquetar la nueva transacción. El estado de Ethereum contiene información sobre diferentes cuentas y sus saldos. En otras palabras, una vez que la cadena de bloques valida una nueva transacción, el estado se actualiza para reflejar el nuevo saldo de la cuenta con la nueva información de la transacción recién agregada.

② ¿Cómo empaquetar bloques en blockchain?

  • Es posible que un usuario desee enviar algunos fondos a otro usuario utilizando la cadena de bloques Ethereum. Una vez que el usuario iniciador inicia una transacción, la transacción debe empaquetarse en la cadena de transacciones antes de que el usuario receptor reciba el dinero. Cuando una transacción de este tipo se empaqueta en la cadena de bloques Ethereum, cada nodo debe completar todo el proceso de consenso antes de que la transacción se empaquete en la cadena y se convierta en parte de su historia.
  • Como se muestra a continuación, se analiza la transacción simple mencionada anteriormente, es decir, un usuario envía fondos a otro usuario. Esta transacción se empaqueta en un bloque y se agrega a la cadena después de que los nodos llegan a un consenso:

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

  • De hecho, blockchain es solo una forma para que todos los usuarios lleguen a un consenso sobre las transacciones históricas que ocurrieron en la red, y el estado de blockchain es el saldo de la cuenta que se ha actualizado con nuevas transacciones en tiempo real:

Insertar descripción de la imagen aquí

  • Contratos inteligentes Hasta cierto punto, los contratos inteligentes son similares a las versiones electrónicas de los contratos tradicionales utilizados en el mundo físico. En un contrato tradicional (como un contrato de trabajo o un contrato de arrendamiento de departamento), dos o más partes establecen un conjunto de términos, que luego los abogados y el sistema judicial hacen cumplir. En los contratos inteligentes, dos o más usuarios también crean un conjunto de reglas, pero en lugar de ejecutar el contrato a través del sistema judicial, el código del programa se escribe en un contrato inteligente y se envía a la cadena de bloques (o se implementa en la cadena de bloques). Los contratos inteligentes se ejecutarán automáticamente según el código que se haya programado, sin necesidad de que los abogados los ejecuten.
  • Los contratos inteligentes son código implementado en la cadena a través de transacciones dentro de un bloque, y las transacciones futuras pueden "llamar" o interactuar con el contrato inteligente. Para dar un ejemplo simple, el usuario A quiere apostar con el usuario B sobre el valor de Bitcoin en los próximos dos años. El usuario A cree que Bitcoin superará los $100.000 el 1 de enero de 2032, mientras que el usuario B cree que Bitcoin será más bajo. este precio, entonces dos usuarios pueden crear un contrato inteligente, colocar los fondos de cada uno en el contrato y acordar una regla simple: si Bitcoin supera los $100,000 el 1 de enero de 2032, el contrato inteligente liberará estos fondos al usuario A, y a la inversa. , el contrato inteligente transfiere fondos al usuario B. El proceso de transacción es simple, directo y sin confianza.
  • Los contratos inteligentes permiten a cualquiera implementar código sin confianza en las computadoras del mundo y también permiten a cualquiera verificar sin confianza el contenido del código. En última instancia, la existencia de tecnología de contratos inteligentes ha creado enormes oportunidades para una ola emergente de aplicaciones descentralizadas que no serían posibles sin la tecnología blockchain.

③ Etereum (ETH)

  • Ether es la moneda nativa que respalda la cadena de bloques Ethereum. En el mecanismo de prueba de trabajo, las recompensas (de minería) se pagan en éter a las computadoras que resuelven acertijos matemáticos, y los fondos prometidos por los participantes en el mecanismo de prueba de participación se también en ether Coin (requiere una contribución de 32 ETH), Ethereum es el nombre de la criptomoneda y Ethereum es el nombre de la red.
  • Máquina virtual Ethereum (EVM): el nombre Máquina virtual Ethereum se refiere a la computadora "virtual" que consta de todas las computadoras pequeñas independientes que participan en la red Ethereum. Una computadora central única de este tipo no es en realidad una computadora "física" en una ubicación determinada, sino que funciona como una computadora grande (global). El estado de la cadena de bloques Ethereum está activo en esta computadora y es responsable de hacer cumplir las especificaciones para las actualizaciones de estado cuando se empaqueta el siguiente bloque en la cadena. Si un usuario de la red Ethereum desea incluir un código de contrato inteligente en sus transacciones, este código se ejecutará en el EVM.

④ ¿Cómo funciona la máquina virtual Ethereum?

  • Para los recién llegados, puede que no sea necesario comprender las complejidades de cómo funciona EVM, pero es una parte importante de la cadena de bloques Ethereum y puede darnos una idea aproximada de cómo funciona la descentralización a escala. Como sigue:

Insertar descripción de la imagen aquí

  • Comencemos con el estado de la cadena de bloques Ethereum en un momento específico. El cuadro de la izquierda se llama "estado mundial σ t". Una transacción se empaqueta en la cadena, como la transferencia de ether de una billetera a otra, en el diagrama El cuadro en la parte superior es "Transacción de llamada de información". El estado de Ethereum antes de que ocurriera la transacción (nuevamente, el cuadro de la izquierda) más los datos de entrada para la nueva transacción (el cuadro superior), todos se ejecutan en el EVM. Aquí, el EVM actualiza el estado de la cadena de bloques. Una vez que el EVM actualiza el estado, se almacenará el nuevo estado "Estado mundial σ t+1".

⑤ Ficha

  • Los "tokens" generalmente se refieren a activos en la cadena de bloques y pueden representar muchos tipos diferentes de activos. Por ejemplo, los tokens generalmente se consideran activos que pueden usarse como moneda, o activos que brindan a sus titulares derechos de voto en procesos específicos de toma de decisiones (tokens de gobernanza), o pueden usarse como algo completamente distinto. Los tokens son unidades atómicas en el mundo de las criptomonedas que representan el valor de diferentes tipos de activos.
  • Token fungible: se refiere a algunos productos o artículos que se pueden convertir entre sí, es decir, fungibilidad. Este no es un término criptonativo; moneda en general se refiere a monedas homogéneas. Por ejemplo, 1 dólar en mi bolsillo se puede cambiar por 1 dólar en tu bolsillo, y ambos 1 dólar se pueden usar para comprar 1 dólar en cosas. Son equivalentes. Cuando se aplica la fungibilidad al concepto de criptografía, se refiere a si Mi éter y tu éter son intercambiables con otros criptoactivos del mismo conjunto.
  • Tokens no fungibles (NFT): los tokens no fungibles se refieren a todos los activos digitales que no son fungibles debido a su existencia única.
  • Aunque NFT es popular principalmente para el arte digital y las colecciones digitales, no se limita a esta forma de expresión: puede ser cualquier activo digital único. El arte digital y los coleccionables digitales son uno de los primeros casos de uso de las NFT y uno que ya ha resonado en un amplio público. Este token ha despertado mucho interés en la comunidad criptográfica, pero creo que el auge de proyectos NFT como Bored Ape y NBATopShot ha llevado al público en general a subestimar el despliegue de números únicos en una capa de liquidación confiable como la cadena de bloques Ethereum. Otros beneficios aportado por el activo.
  • Conceptualmente, las NFT también se pueden aplicar a muchos otros casos de uso más allá de los coleccionables digitales. Si un producto o servicio necesita poder verificar la propiedad y la escasez de un activo digital específico, las NFT en cadenas de bloques públicas resultan útiles. Por ejemplo, una sala de conciertos podría reemplazar las entradas con NFT, o un diseñador de videojuegos podría convertir activos que son difíciles de obtener en el juego en NFT para que puedan transferirse o intercambiarse entre usuarios. El concepto también puede jugar nuevos trucos: algunos activos pueden ser tanto homogéneos como no homogéneos, dependiendo del conjunto con el que se comparen. Por ejemplo, si tengo una antigua moneda de 1 dólar del siglo XIX y la guardo en un frasco de vidrio como objeto de colección. Es obvio que este dólar (¡no fungible!) no se parece en nada al nuevo billete de un dólar arrugado y metido en el bolsillo.
  • Sin embargo, si sacara el dólar del frasco de vidrio y lo gastara en Starbucks, (probablemente) estarían dispuestos a aceptarlo. Esto se debe a que, en algunos aspectos, es intercambiable con otros billetes de un dólar, aunque en otros no son lo mismo en absoluto.

Insertar descripción de la imagen aquí

2. ¿Cómo interactuar con aplicaciones creadas en Ethereum?

① Combustible (Gas)

  • Cada interacción con la cadena de bloques Ethereum cuesta dinero (gas), y ese costo depende de cuánta potencia informática necesita la máquina virtual Ethereum para ejecutar ese código en particular. Dado que el espacio de cada bloque en la cadena de bloques solo puede acomodar un número fijo de transacciones, el concepto de gas puede ayudar a Ethereum a asignar recursos de espacio de bloque escasos. Las transacciones más complejas pueden requerir más gas para completarse. Por ejemplo, enviar ether de una billetera a otra puede requerir solo ejecutar unas pocas líneas de código en una máquina virtual, por lo que requiere menos gas que una interacción computacional más intensiva.
  • El gas está denominado en ETH y los usuarios pueden optar por pagar más gas (inclinando la computadora) para acelerar los tiempos de transacción y aumentar las posibilidades de que la transacción se incluya en el siguiente bloque. Gwei Técnicamente, el precio del gas se expresa como wei, que es la unidad incremental más pequeña de ETH. 1 wei es igual a 0,000000000000000001 ETH (1018 wei, es decir, se necesitan 5 comas para representar 1 ETH), y 1 gwei es igual a 1.000.000.000 wei. Por lo tanto, al comparar precios de gasolina, es más conveniente utilizar gwei a ETH. método de fijación de precios.
  • Los usuarios se han acostumbrado a expresar los precios del gas en gwei. Por ejemplo, 0,0001 ETH es 1 gwei y esta tarifa de gas es muy baja. Los usuarios pueden utilizar Gas.Watch para controlar los precios del gas en tiempo real, que fluctuarán con la demanda de transacciones empaquetadas en la cadena de bloques.

② ¿Por qué se necesita gas y cómo se aplica?

  • Las computadoras responsables de verificar las transacciones de blockchain deben recibir incentivos financieros. Sin estos incentivos, será difícil convencerlas de operar y mantener computadoras y blockchains. Si no hay suficientes computadoras en la cadena para operar, la blockchain se volverá demasiado centralizada. y controlado por sólo unos pocos usuarios.
  • El gas pagado a los participantes de la red fluctúa según la demanda de transacciones empaquetadas en la cadena de bloques:

Insertar descripción de la imagen aquí

  • Solidity es un lenguaje de programación que permite a los usuarios escribir contratos inteligentes y crear aplicaciones descentralizadas en la cadena de bloques Ethereum. Es importante destacar que Solidity es un lenguaje de programación completo de Turing, lo que básicamente significa que "cualquier cosa que puedas escribir en código se puede escribir en Solidity". Esto muestra que los desarrolladores pueden usar Solidity para desarrollar muchas cosas interesantes en Ethereum.
  • Componibilidad: debido a que los contratos inteligentes se implementan en Ethereum como código fuente abierto, cualquiera puede construir sobre estos contratos inteligentes (o "bifurcar" el código y cambiarlo ellos mismos), lo que demuestra que Ethereum (y otras cadenas de bloques similares) son componibles. Piense en la componibilidad como la API de blockchain. Aunque es lógico que los desarrolladores hayan podido crear aplicaciones basadas en otras infraestructuras técnicas hace algunas generaciones, la principal diferencia entre la componibilidad criptográfica y otros campos es que todos sus protocolos subyacentes están descentralizados. En otras palabras, los desarrolladores no necesitan preocuparse de que una entidad centralizada controle todos los datos subyacentes y cambie repentinamente las reglas de la plataforma o restrinja el acceso de los desarrolladores.

③ ¿Cuáles son los casos de componibilidad? ¿Cómo se aplica en la práctica?

  • La componibilidad significa que los desarrolladores pueden crear nuevas aplicaciones utilizando otras aplicaciones que se han creado e implementado en la cadena pública:

Insertar descripción de la imagen aquí

  • La comunidad Ethereum ha desarrollado un proceso que describe cómo los miembros de la comunidad pueden proponer mejoras al protocolo Ethereum. Estos procesos incluyen proporcionar un foro público para la discusión y fomentar la participación de la comunidad en código abierto, lo cual es particularmente importante para la cadena de bloques Ethereum, ya que es una cadena de bloques descentralizada y depende de una comunidad distribuida globalmente para supervisarla y mejorarla.
  • ERC es una categoría de EIP. Específicamente, ERC es un EIP que describe "estándares y protocolos a nivel de aplicación". Vale la pena mencionar aquí este tipo de EIP porque sirve como modelo para los estándares contractuales para algunos de los casos de uso más importantes y conocidos de Ethereum. Los desarrolladores pueden utilizar estos estándares contractuales para ahorrar tiempo y esfuerzo al desarrollar Ethereum, en lugar de empezar desde cero. Algunos de los ERC más conocidos son los siguientes:
    • ERC-20: este es un estándar de token para tokens fungibles.
    • ERC-721: este es un estándar de token para tokens no fungibles.
    • ERC-1155: este es un estándar de token que optimiza parte de ERC-20 y ERC-721 y generalmente se aplica a tokens fragmentados no fungibles.

④ ¿Por qué quieres fragmentar (o hacer fungibles) tokens no fungibles?

  • La mayoría de los fragmentos NFT descompuestos son fungibles, por lo que el fragmento de la cara de Mona Lisa en poder de un usuario no será exclusivo del fragmento de la mano o del fragmento del fondo (es decir, los fragmentos son equivalentes). Los fragmentos de estas diferentes partes en realidad no son fungibles (preferiría pagar menos por los fragmentos del fondo que por los fragmentos de la cara) y en realidad el usuario sólo tendrá en sus manos un pequeño fragmento fungible de toda la obra de arte.

⑤ ¿Cómo interactúan los usuarios y las aplicaciones con Ethereum?

  • Los usuarios casi siempre utilizan aplicaciones web a través de navegadores como Chrome. Estas aplicaciones web se crean utilizando bibliotecas específicas (como web3.js o ethers.js) que permiten que las aplicaciones web interactúen directamente con los nodos de blockchain.

Insertar descripción de la imagen aquí

  • Las aplicaciones creadas por desarrolladores interactúan con Ethereum a través de nodos que ejecutan software de cliente. En el siguiente ejemplo, el cliente que se ejecuta es Geth, una interfaz de línea de comandos utilizada para interactuar con la cadena de bloques Ethereum. También existen proveedores de "nodos como servicio" como Infura, que permiten a los desarrolladores interactuar fácilmente con nodos controlados por el proveedor de servicios, de forma similar a cómo los desarrolladores utilizan AWS para acceder al espacio del servidor. A continuación, estos nodos pueden interactuar con contratos inteligentes y saldos de cuentas individuales en Ethereum. Esto es muy diferente del "backend" versus el "frontend" de otros productos de software actuales. En el diagrama inferior izquierdo podemos ver cómo un usuario se conecta a una aplicación web tradicional.
  • Al lado de este diagrama hay un ejemplo de la arquitectura de una aplicación basada en Ethereum. Los dos son muy similares, la diferencia es que Ethereum sirve como una infraestructura back-end para aplicaciones criptográficas, lo que lo hace global, sin permisos y resistente a auditorías.

Insertar descripción de la imagen aquí

3. Cartera e identidad

① Cartera

  • Una billetera almacena sus activos en una billetera criptográfica, al igual que almacenar efectivo en una billetera física. Pero estas billeteras criptográficas también almacenan información que lo representa a usted y sus acciones, como las aplicaciones con las que interactúa y las transacciones que realiza con esa billetera.
  • Lo que hay que recordar es que, por diseño, las transacciones de blockchain son públicas y transparentes, por lo que cuando usa su billetera para hacer algo en Ethereum, su billetera administra datos públicos rastreables sobre esas transacciones. Estos datos de trazabilidad enfatizan la filosofía de "poseer sus datos" en web3: sus activos, su historial de transacciones y los datos de las interacciones con aplicaciones descentralizadas se mueven con su billetera. Y, a diferencia de las billeteras físicas, muchos usuarios de criptomonedas utilizan múltiples billeteras criptográficas con diferentes propósitos.
  • Clave pública: es una larga línea de código que representa la dirección externa de la billetera. Una clave pública es como la dirección de su casa; esta dirección es única y no secreta (registros públicos, etc.). Y esa dirección corresponde a un hogar (o en este caso, a una de tus cuentas).
  • Puede compartir su dirección con un amigo que quiera enviarle una carta o un regalo, pero incluso si alguien ve la dirección de su casa en los registros de propiedad del gobierno local, está bien. Si alguien ve su clave pública, no hay problema.
  • Clave privada: por otro lado, la clave privada es la contraseña de su billetera, por lo que no puede permitir que otros conozcan su clave privada. La clave privada corresponderá a la clave pública de una billetera específica, por lo que si alguien obtiene la clave privada, tendrá acceso completo a la billetera.
  • Una clave privada es como la llave de su casa. No le importa si alguien conoce al azar la dirección de su casa, pero si tiene la llave de su casa, definitivamente se sentirá incómodo. Permítanme reiterar nuevamente: cualquiera que obtenga la clave privada puede acceder a la billetera correspondiente. No le diga a nadie la clave privada y no la guarde en un lugar donde otros puedan encontrarla.
  • El principio de clave pública y clave privada:
    • Las claves públicas y privadas son un método utilizado para cifrar y verificar la identidad, llamado criptografía de clave privada. Recuerde que la clave pública está abierta al mundo exterior. Cuando un usuario inicia una transacción en la billetera de su amigo (usando la clave pública de su amigo), equivale a bloquear la transacción. Solo si el amigo del usuario realmente posee la clave privada de la Cartera del destinatario Sólo entonces se podrá desbloquear el candado. Aunque la transacción es visible (porque existe en la cadena pública), no hay forma de "desbloquear" los activos sin una clave privada específica (que corresponde a la billetera que contiene los activos).
    • Si usted es un desarrollador que crea un proyecto en Ethereum o simplemente un usuario, es importante comprender la diferencia entre claves públicas y privadas. El mal uso (o "extravío") de las claves públicas y privadas puede tener graves consecuencias financieras y, a diferencia de olvidar una contraseña en un sitio web centralizado, los desarrolladores de aplicaciones no pueden ayudar a los usuarios a recuperar las claves. A medida que más usuarios creen billeteras criptográficas y realicen transacciones en blockchain, este modelo de transacción se volverá más estandarizado. También es importante ser consciente de la curva de aprendizaje y ayudar a explicarla a otros usuarios.

Insertar descripción de la imagen aquí

  • Frases mnemotécnicas: un conjunto de frases mnemotécnicas (generalmente de 12 a 24 palabras aleatorias) es la herramienta definitiva para recuperar la billetera en caso de una emergencia. Debe estar igualmente protegida como la clave privada, porque perder la frase mnemotécnica o guardarla en algún lugar donde pueda ser descubierta significa que todo lo relacionado con la billetera queda expuesto. Los usuarios deben utilizar métodos adecuados para guardar frases mnemotécnicas para garantizar su seguridad y confidencialidad.
  • Los desarrolladores de la aplicación de billetera no tienen acceso a la frase mnemotécnica, por lo que si pierde sus claves y su frase mnemotécnica, su billetera no podrá recuperarse. Si solo pierde su clave privada, puede usar una frase mnemotécnica para restaurar su billetera.

② Clasificación

  • Carteras de depósito en garantía: estas carteras son administradas por un custodio (cualquier entidad centralizada responsable de administrar los fondos de la billetera), como una cuenta normal de Coinbase. Estos custodios son responsables de administrar los activos básicos en la billetera (por lo que si los usuarios usan una billetera de custodia, no tienen que conservar sus propias claves privadas) para brindarles una experiencia de usuario más centralizada y fluida. Esta experiencia de usuario generalmente no incluye mecanismos de autenticación cripto-nativos, como que un usuario use una dirección de correo electrónico y una contraseña de Google para iniciar sesión en una cuenta de Coinbase. Las billeteras alojadas son una excelente manera de comenzar su viaje criptográfico y son una forma práctica de intercambiar activos en efectivo por criptomonedas. Por otro lado, dado que estos custodios son mantenidos y administrados por instituciones centralizadas, también generan algunos de los problemas que la descentralización pretende resolver, como la propiedad de los datos, el control del flujo de información y posibles requisitos regulatorios. Hay una palabra de moda en la comunidad criptográfica sobre las carteras de custodia: "Sin llaves, no hay monedas". Incluso el director ejecutivo de Coinbase, Brian Armstrong, mencionó una vez la importancia de las carteras sin custodia porque los proveedores de carteras de custodia corren el riesgo de ser regulados por el gobierno. Las billeteras sin custodia son una mejor opción para los usuarios que prefieren administrar sus activos y transacciones de manera completamente descentralizada.
  • Monedero sin custodia: el administrador de este tipo de billetera es solo usted. Los proveedores de software (como MetaMask, Argent y Rainbow, etc.) brindan a los usuarios software para acceder a sus propias billeteras, pero lo principal es que los activos de la billetera son almacenado en la cadena en lugar de con el proveedor de la billetera. Entonces, si algo sucede con la billetera MetaMask que la hace inaccesible, los usuarios pueden saltar a la billetera Rainbow, importar su billetera (sin el permiso de MetaMask) y operar sus activos a través de Rainbow. También existen carteras de hardware sin custodia cuyas claves privadas se almacenan directamente en un dispositivo físico (normalmente un pequeño objeto metálico que parece un USB). El uso de billeteras sin custodia conlleva la carga de administrar claves públicas, claves privadas y frases mnemotécnicas, pero dichas billeteras brindan a los usuarios autonomía (para poseer activos directamente) y una identidad única para acceder al mundo Ethereum. Las aplicaciones de Ethereum permiten a los usuarios "iniciar sesión con Ethereum (SIWE)", es decir, "iniciar sesión utilizando su propia billetera sin custodia". Como resultado, las billeteras sin custodia representan la identidad de un usuario y amplían el espacio de diseño en la comunidad criptográfica con nuevas formas de pensar sobre la identidad, las credenciales y la propiedad.
  • Cartera de recuperación social: esta es una estrategia de recuperación de cartera respaldada por algunos proveedores de carteras sin custodia. Este tipo de billetera no requiere una frase mnemotécnica (algunos usuarios han perdido la frase mnemotécnica), y los usuarios pueden designar a otras personas en su red social para verificar si la billetera corresponde a la persona a la que se supone que debe corresponder. Con una billetera de recuperación social, los usuarios pueden respaldar su billetera sin custodia basándose en la red de confianza de sus círculos sociales y al mismo tiempo conservar los beneficios de autohospedaje/descentralización/inicio de sesión único de una billetera sin custodia. para billeteras de recuperación social.

③ ¿Cómo deben prestar atención los usuarios a la seguridad de las billeteras?

  • A diferencia de la clave pública, nunca debes revelar tu clave privada a nadie. Si alguien obtiene tu clave privada, será muy problemático:
    • "Dirección/Clave pública: su dirección de correo electrónico (se puede compartir)
    • Clave privada: Contraseña de tu bandeja de entrada (nunca compartida)
    • Monedero: guardar clave privada
    • Frase mnemónica: sistema de recuperación de clave privada (nunca compartida)
    • Contraseña: Opcional: contraseña adicional para crear nuevas billeteras (nunca se pierde)
  • Ethereum Domain Name Service es un sistema de nombres de dominio de código abierto creado para la cadena de bloques Ethereum, similar hasta cierto punto a un proveedor de nombres de dominio para sitios web tradicionales. ENS asigna direcciones en Ethereum a nombres legibles por humanos, por lo que puedo usar, por ejemplo, " brunny.eth " como mi dirección, en lugar de esta larga lista de claves públicas: 0xF67cAEbBbE7b630d137d2901637C02899ED3211b. En general, como bien público, los nombres ENS son importantes para la identidad en el ecosistema Ethereum, por lo que merecen su propia versión del sistema de nombres de dominio.
  • Organizaciones Autónomas Descentralizadas (DAO): DAO es una forma organizativa cripto-nativa, puede ser una empresa, institución sin fines de lucro, grupo social o cualquier otro tipo de organización que se administre y organice en base a reglas cripto-nativas. Las reglas cripto-nativas aquí se refieren a conceptos como propiedad comunitaria, transparencia y descentralización. Vale la pena señalar que la descentralización tiene un espectro, en lugar de dos extremos que están activados o desactivados. A diferencia de las empresas tradicionales que tienen propiedad y administración centralizadas en términos de creación de entidades y estructura organizacional de liderazgo, DAO está diseñada para la operación de proyectos y negocios cripto-nativos que toman decisiones sin una entidad central, y está comprometida a luchar por la propiedad comunitaria de los proyectos. . Otra visión de muchas DAO es la realización de una descentralización y democratización completas. Es decir, varias decisiones de la DAO son votadas democráticamente por los principales participantes. La DAO no solo puede votar sobre cambios en los productos a nivel de aplicación en la cadena, sino que también puede desempeñar un papel en la recompensa y motivación de los participantes del sistema.

4. Finanzas descentralizadas

① Finanzas Descentralizadas (DeFi)

  • Finanzas descentralizadas (DeFi): Las finanzas descentralizadas se refieren a cualquier aplicación, intercambio y sistema financiero que no tenga un guardián central y se ejecute completamente en la cadena de bloques. Hoy en día, hay cientos, si no miles, de proyectos DeFi activos en diversas cadenas de bloques, desde intercambios descentralizados hasta protocolos de préstamos y contratos de opciones y futuros. El rango de aplicaciones es muy amplio. El objetivo principal de las aplicaciones DeFi es repensar cómo realizar los servicios financieros proporcionados por el antiguo sistema bancario de forma descentralizada en un sistema mundial sin control del banco central.
  • Puede imaginarse el escenario de comprar acciones en el mercado de valores: cuando Sally compra una acción de Tesla a través de un intermediario (Robinhood, Charles Schwab, Vanguard, etc.), esta acción pasará por las manos de múltiples intermediarios antes de que Sally pueda Consíguelo. . En términos generales, cuando el sistema funciona normalmente, el público en general no descubrirá este comportamiento de cambiar entre múltiples intermediarios diferentes. Pero a veces suceden cosas malas (por ejemplo, la crisis financiera mundial de 2008 o el incidente bursátil de Gametop de 2021) que provocan el colapso del sistema (como precios negativos del petróleo y transacciones canceladas). Después de que el sistema colapsara, la gente quería encontrar al culpable del caos. Pero cuando empezaron a profundizar más, descubrieron que el mercado financiero tradicional estaba lejos de ser tan transparente como pensaban.

② Intercambios descentralizados (DEX)

  • Es el primer bloque importante de DeFi. Blockchain activa un nuevo tipo de intercambio que puede negociar directamente con contratos inteligentes sin pasar por intermediarios opacos e instituciones semioficiales.
  • Tomando como ejemplo la compra de acciones de Tesla por parte de Sally, ya no necesita comprar acciones a través de una empresa de corretaje intermediaria (como Charles Schwab), que negociará con creadores de mercado (como Citadel), los cuales están sujetos a liquidación en Estados Unidos. restricciones impuestas por (como DTCC). En cambio, opera con el contrato inteligente Uniswap. El código del contrato inteligente es transparente y público, por lo que puede ver el flujo de fondos y no se dejará cegar por intermediarios no transparentes. Estos intercambios descentralizados utilizan tecnología blockchain e incentivos económicos para básicamente establecer un mercado para dos monedas cualesquiera (como BTC y ETH, o USD y euro, etc.).
  • Como DEX con mayor participación de mercado, ¿cómo opera Uniswap? Para comprender cómo operan estos intercambios descentralizados, es necesario definir algunos términos adicionales:
    • Proveedores de liquidez (LP): en el caso anterior de Sally, los intermediarios opacos que describe sí desempeñan un papel eficaz en los sistemas financieros tradicionales: proporcionar liquidez al sistema. En el sistema financiero tradicional, Sally puede vender sus acciones en cualquier momento, casi en cualquier momento o al menos durante el horario comercial habitual, porque el intermediario es la persona contratada para proporcionar liquidez a Sally y otros accionistas. Entonces, ¿de dónde obtiene el contrato inteligente en el protocolo de intercambio descentralizado los activos para comerciar? La respuesta son los proveedores de liquidez. DEX brinda a las personas la oportunidad de obtener ganancias al proporcionar liquidez. Cuando un usuario intercambia activos con un contrato inteligente, el sistema reembolsará una pequeña parte de las tarifas de transacción al proveedor de liquidez. Para los LP, el más conocido es el modelo Unswap, que les exige depositar dos pares de tokens del mismo valor en un contrato inteligente. Para reiterar, LP coloca depósitos en contratos inteligentes para obtener una parte de las tarifas de transacción. Los LP pueden retirar los tokens depositados como liquidez en cualquier momento, pero en este caso, obviamente no podrán obtener dividendos de futuros aumentos en las tarifas de transacción.
    • Creadores de mercado automatizados (AMM): esta es una categoría de DEX. Los AMM son contratos inteligentes que utilizan algoritmos para fijar precios. Aquí, la fórmula de producto constante de Uniswap ( x*y=k ) es la más conocida, sin embargo, esto está más allá del alcance de esta guía. AMM es solo una fórmula o mecanismo que no requiere que los humanos fijen los precios.
    • Las monedas estables son representaciones digitales de monedas reales. Representan el valor de la moneda a la que están vinculadas, pero solo circulan en la cadena de bloques como monedas digitales. DeFi permite a los usuarios utilizar activos cifrados para marcar la diferencia, pero dificulta que los usuarios e inversores gestionen sus activos dentro de un rango de precios fijo, porque los precios de los activos cifrados no son estables. En una cadena de bloques descentralizada y sin confianza, las monedas estables existen como un activo menos volátil y también sirven como precio de referencia para comparar criptoactivos. Normalmente, las monedas estables están vinculadas al dólar estadounidense, pero existen otras monedas estables. Ya sean monedas estables centralizadas o descentralizadas, cada una tiene su propio mecanismo para mantener un precio fijo de 1:1 con respecto a la moneda a la que está anclada. Es cierto que las criptomonedas están alterando el sistema financiero mundial, pero las principales monedas mundiales, como el dólar estadounidense, el euro y el yen, siguen siendo válidas como precios de referencia.
    • Valor total bloqueado (TVL): TVL se refiere al valor total bloqueado en un contrato inteligente en una plataforma específica. El concepto TVL también se puede aplicar en contextos distintos de los contratos inteligentes DEX, porque otras aplicaciones además de los intercambios también pueden tener mecanismos de provisión de liquidez (como plataformas de préstamos). El valor total de bloqueo de Uniswap es de miles de millones de dólares, y el TVL combinado de varias aplicaciones en Ethereum superó los $100 mil millones a principios de 2022.

③ ¿Cómo funciona Uniswap?

  • Cuando un usuario quiere intercambiar tokens con Uniswap (u otros intercambios), el usuario solo necesita operar en una interfaz frontal simple, que Uniswap construye en base a contratos inteligentes más complejos. Como se muestra en la figura siguiente, los usuarios pueden intercambiar ETH (u otros tokens) por otros activos, como si usaran una máquina expendedora. Los usuarios pueden conectar la billetera e intercambiar cualquier token por otros tokens:

Insertar descripción de la imagen aquí

  • Sin embargo, ¿qué sucede detrás de escena? Miremos el cuadro azul en la imagen a continuación: este es el contrato inteligente de Uniswap, que es donde los proveedores de liquidez almacenan sus tokens (en el ejemplo se utilizan el Token A y el Token B). El lado izquierdo del cuadro azul describe la relación entre LP y el grupo de promesas; LP deposita dos activos y, a cambio, recibe tokens del grupo de promesas, que son equivalentes a proveedores de liquidez que pueden canjear sus promesas. Un certificado por un activo. Los tokens del grupo de compromiso se pueden canjear en cualquier momento por los activos originalmente prometidos por el LP en el contrato inteligente (aquí, los comerciantes deben tener cuidado con las "pérdidas no permanentes" que se mencionan a continuación).
  • El otro extremo de la imagen de arriba es el usuario, que ingresa a la interfaz e intercambia un token por otro en el grupo de apuestas sin tener que tocar el LP del grupo de apuestas. Además, los usuarios pagarán una pequeña tarifa de gestión, que se distribuirá equitativamente entre todos los LP del grupo de compromiso.

Insertar descripción de la imagen aquí

5. Layer2 y mecanismo de prueba de participación

① Paradoja del triángulo blockchain

  • Cada cadena de bloques implica compensaciones entre tres conceptos: descentralización, escalabilidad y seguridad. El consenso general es (principios de 2022) que a Ethereum le va mejor en descentralización y seguridad, pero es ligeramente inferior en escalabilidad. Con suerte, se planearán algunas mejoras en el futuro cercano que puedan resolver la paradoja del triángulo blockchain de Ethereum.
  • Descentralización: El libro blanco de Bitcoin explica con precisión el concepto de descentralización: "Todo lo que se necesita es un sistema de pago electrónico basado en pruebas criptográficas en lugar de confianza, que permita a dos partes interesadas comunicarse directamente entre sí sin confiar en un tercero". transacciones", la cadena de bloques desempeña el papel de capa de infraestructura, permitiendo a los usuarios de todo el mundo utilizar sus propios ordenadores para interactuar entre sí sin pasar por intermediarios. La descentralización de la cadena de bloques es como un espectro: si unos pocos usuarios pueden cerrar la cadena de bloques, o el costo de participar en la red es demasiado alto (tarifas de gas o el costo de configurar computadoras para participar en la red), entonces La cadena de bloques se moverá hacia el centro y un extremo estará inclinado. Cuanto mayor sea el grado de centralización, mayor será el riesgo de monopolio y explotación del poder.
  • Seguridad: se refiere a la dificultad de que la cadena básica sea atacada o controlada por el mundo exterior. Una regla general válida es una mayoría del 51%; si alguien puede controlar el 51% de las computadoras que procesan transacciones en una cadena particular, puede piratear y comprometer la seguridad de la red. Aquí hay consideraciones técnicas más profundas, pero el 51% ayuda a los usuarios a aclarar las compensaciones entre seguridad, descentralización y escalabilidad. Cuantas más computadoras independientes empaqueten transacciones para una cadena de bloques en particular, mayor será el grado de descentralización y seguridad que tendrá (más computadoras = baja probabilidad de que alguien controle el 51% de los nodos de la red). Sin embargo, una mayor cantidad de computadoras independientes en una red también significa que cada computadora necesita comunicarse con una red de computadoras más grande, lo que resulta en un funcionamiento más lento.
  • Escalabilidad: la desaceleración en el funcionamiento de la red significa que es necesario encontrar soluciones para mejorar la escalabilidad. Cuando aumenta el número de transacciones en la cadena de bloques, la red también se congestionará extremadamente. Por ejemplo, Ethereum también experimentó un período en el que las tarifas del gas se dispararon, especialmente cuando la demanda de la red estaba llena. Estas demandas provocaron que el costo del paquete de transacciones y en la cadena aumentara, al tiempo que causaron congestión de la red y ralentizaron la velocidad de operación de la red.

② Prueba de conocimiento cero

  • Este concepto no es un plan de expansión específico, pero es importante aclarar un concepto antes de discutir el plan de expansión. La prueba de conocimiento cero es un método criptográfico que puede verificar la validez de las cosas sin obtener información específica. Por ejemplo, digamos que soy un comprador de Craigslit que busca comprar un televisor a cualquier persona de la red. En ese momento alguien me dijo en un mensaje privado que tenía el televisor que buscaba y su información era anónima. Como comprador, antes de reunirme con un vendedor, quiero asegurarme de que realmente tenga un televisor. Pero los vendedores no quieren revelar su información personal (licencia de conducir, domicilio, fotografías del interior) a usuarios aleatorios en Internet. Lo más importante es que el vendedor también quería saber si yo era una persona real. Pero ninguna de las partes quería compartir información personal.
  • Con pruebas de conocimiento cero, puedo demostrar a los vendedores que soy una persona real, verificando mi identidad sin decirles quién soy. Por otro lado, los vendedores también pueden demostrar que realmente poseen un televisor y que son vendedores legítimos, nuevamente sin revelar ninguna información personal confidencial. Contiene primitivas criptográficas intrincadas, por lo que lo anterior es sólo una introducción muy breve. En la mayoría de los casos, las pruebas de conocimiento cero resuelven los desafíos de seguridad, escalabilidad y privacidad en la comunidad criptográfica.

③ Plan de expansión Layer2

  • Los usuarios tienen muchas esperanzas de ejercitar sus músculos en Ethereum porque es la plataforma informática de contrato inteligente más descentralizada y sofisticada del mundo. Ethereum ha atraído a la red más amplia de desarrolladores que crean aplicaciones basadas en blockchain. Pero una consecuencia de estas creaciones es que la necesidad de empaquetar transacciones en la cadena de bloques Ethereum a veces hace que los precios del gas sean demasiado altos, lo que significa que Ethereum es lento y costoso de usar.
  • La paradoja del triángulo de blockchain implica que cualquier blockchain que optimice la seguridad y la descentralización comprometerá la escalabilidad. Dado que la descentralización y la seguridad son impulsores importantes de la promesa de blockchain, la escalabilidad se convierte en la parte más difícil de resolver. Ethereum está apostando por una ola de mejoras que espera resuelvan los problemas de escalabilidad.
  • Una de esas mejoras es pasar de que los usuarios interactúen primero con la propia cadena de bloques Ethereum (es decir, "Capa1") a interactuar con soluciones de escalamiento de Capa2. Fundamentalmente, esto sugiere que la mayoría de las transacciones y aplicaciones en la red principal de Ethereum se trasladarán a la Capa 2, que hereda la seguridad y la descentralización de Ethereum pero tiene un rendimiento mucho mayor que el propio Ethereum. La Capa 1 de Ethereum será específicamente responsable de las cuestiones de consenso, mientras que su Capa 2 será responsable de ejecutar transacciones y código.
  • Rollups: los rollups procesan un lote de transacciones en su propia cadena de bloques. Después de ejecutar estas transacciones en su propia cadena, los rollups comprimen todas las transacciones en un pequeño paquete de información. Estos pequeños paquetes se "envían" a la Capa 1 de Ethereum, lo que significa que Rollup hereda la seguridad de la Capa 1 al tiempo que amplía la cantidad de transacciones que puede manejar (porque la información está comprimida).

6. Contrato inteligente y uso compartido de casos de solidez

  • Este es un juego creado en Ethereum con el siguiente script:
    • zombiefactory.sol: define zombie y genera zombie;
    • zombiefeeding.sol: define la interfaz de gatitos para alimentar gatitos zombies;
    • zombieattack.sol: función de lucha contra zombies;
    • erc721.sol: interfaz de token ERC721;
    • ownable.sol: interfaz de autenticación de usuario;
    • safemath.sol: control de seguridad durante la operación;
    • zombieownership.sol: funciones de propiedad de zombies, transferir, aprobar, tomar propiedad y otras funciones;
    • zombiehelper.sol: función auxiliar de zombie, nombre, cambio de ADN, nivel de actualización, configuración de levelUpFee, retiro de efectivo, visualización del ejército de zombies y otras funciones;
    • index.html: llamada interactiva de front-end;
    • cryptozombies_abi.js: documentación de ABI.
  • zombiefactory.sol:
pragma solidity ^0.4.19;

import "./ownable.sol";
import "./safemath.sol";

contract ZombieFactory is Ownable {
    
    

  using SafeMath for uint256;

  // 事件是合约和区块链通讯的一种机制
  // 当僵尸创造出来时,前端能监听到这个事件,并将它显示出来
  event NewZombie(uint zombieId, string name, uint dna);

  /**
    僵尸的NDA只有16个字符
    dnaModulus等于10^16,DNA可以用模运算符 % 把一个整数变成16位
    冷却时间长达1天
  **/
  uint dnaDigits = 16;
  uint dnaModulus = 10 ** dnaDigits;
  uint cooldownTime = 1 days;

  // 使用struct节省存储空间,节约gas。readyTime实现“冷却定时器”
  struct Zombie {
    
    
    string name;
    uint dna;
    uint32 level;
    uint32 readyTime;
    uint16 winCount;
    uint16 lossCount;
  }

  // 公共可变长数组
  Zombie[] public zombies;

  // 给数据库中的僵尸指定主人,支持多玩家模式
  // mapping和address,通过僵尸id查到拥有者的address
  mapping (uint => address) public zombieToOwner;
  // 通过address查询到有多少只僵尸
  mapping (address => uint) ownerZombieCount;

  // 内部方法以 _ 开头,函数里面的变量以 _ 开头,区别全局变量。
  function _createZombie(string _name, uint _dna) internal {
    
    
    uint id = zombies.push(Zombie(_name, _dna, 1, uint32(now + cooldownTime), 0, 0)) - 1;
    // msg.sender 是合约当前调用者的address或者智能合约的address
    zombieToOwner[id] = msg.sender;
    ownerZombieCount[msg.sender]++;
    NewZombie(id, _name, _dna);
  }

  // 函数没有改变Solidity里的状态,没有改变任何值或者写任何东西,把函数定义为view,
  // 意味着只能读取数据不能更改数据
  // keccak256是以太坊提供的SHA3散列函数,把一个字符串转换成一个256位的16进制数字。
  // 只能用它造一个伪随机数。
  function _generateRandomDna(string _str) private view returns (uint) {
    
    
    uint rand = uint(keccak256(_str));
    return rand % dnaModulus;
  }

  function createRandomZombie(string _name) public {
    
    
    // require使函数在执行过程中,当不满足某些条件时抛出错误,并停止执行
    require(ownerZombieCount[msg.sender] == 0);
    uint randDna = _generateRandomDna(_name);
    randDna = randDna - randDna % 100;
    _createZombie(_name, randDna);
  }
}
  • zombiefeeding.sol:
pragma solidity ^0.4.19;

import "./zombiefactory.sol";

// 定义一个借口,使用contract关键字,在接口里定义getKitty函数
contract KittyInterface {
    
    
  function getKitty(uint256 _id) external view returns (
    bool isGestating,
    bool isReady,
    uint256 cooldownIndex,
    uint256 nextActionAt,
    uint256 siringWithId,
    uint256 birthTime,
    uint256 matronId,
    uint256 sireId,
    uint256 generation,
    uint256 genes
  );
}

// 继承ZombieFactory合约
contract ZombieFeeding is ZombieFactory {
    
    

  KittyInterface kittyContract;

  // modifier关键字告诉编译器,这是个modifier修饰符,而不是function,不能像函数直接调用,只能添加到函数定义的末尾,用以改变函数的行为
  modifier onlyOwnerOf(uint _zombieId) {
    
    
    require(msg.sender == zombieToOwner[_zombieId]);
    _;
  }

  // external 函数只能在合约之外调用,不能被合约内的其他函数调用
  // 通过程序更改CryptoKities合约地址
  // onlyOwner是指定合约的所有权,指定一个主人,只有主人(合约部署者)对它享有特权
  function setKittyContractAddress(address _address) external onlyOwner {
    
    
    kittyContract = KittyInterface(_address);
  }

  // internal 合约可访问父合约中定义的内部函数
  function _triggerCooldown(Zombie storage _zombie) internal {
    
    
    _zombie.readyTime = uint32(now + cooldownTime);
  }

  function _isReady(Zombie storage _zombie) internal view returns (bool) {
    
    
      return (_zombie.readyTime <= now);
  }

  function feedAndMultiply(uint _zombieId, uint _targetDna, string _species) internal onlyOwnerOf(_zombieId) {
    
    
    // storage变量永久存储在区块链中
    Zombie storage myZombie = zombies[_zombieId];
    require(_isReady(myZombie));
    _targetDna = _targetDna % dnaModulus;
    uint newDna = (myZombie.dna + _targetDna) / 2;
    // 如果是kitty变过来的,用99替换新僵尸DNA的最后两位数字
    if (keccak256(_species) == keccak256("kitty")) {
    
    
      newDna = newDna - newDna % 100 + 99;
    }
    _createZombie("NoName", newDna);
    _triggerCooldown(myZombie);
  }

  function feedOnKitty(uint _zombieId, uint _kittyId) public {
    
    
    uint kittyDna;
    (,,,,,,,,,kittyDna) = kittyContract.getKitty(_kittyId);
    feedAndMultiply(_zombieId, kittyDna, "kitty");
  }
}
  • ataquezombi.sol:
pragma solidity ^0.4.19;

import "./zombiehelper.sol";

/**
  僵尸战斗功能,继承自ZombieHelper
**/
contract ZombieAttack is ZombieHelper {
    
    
  uint randNonce = 0;
  uint attackVictoryProbability = 70;

  // 拿now,msg.sender,自增的nonce,转成一个哈希值,再转uint,% 100 取最后两位,生成一个0到100的随机数
  // 当然最后拿到的是一个伪随机数,但在具体的项目中,不会吸引×××者来×××就是现实安全的。
  function randMod(uint _modulus) internal returns(uint) {
    
    
    randNonce++;
    return uint(keccak256(now, msg.sender, randNonce)) % _modulus;
  }

  // 选择自己的僵尸,选择对手的一个僵尸去×××
  // ×××方有70%的获胜概率
  // 所有的僵尸都有一个winCount和lossCount,记录输赢
  // ×××方获胜,僵尸升级并产生一个新僵尸,成功次数累加1
  // ×××方失败,失败次数累加1
  // 无论输赢,当前僵尸的冷却时间将被激活
  function attack(uint _zombieId, uint _targetId) external onlyOwnerOf(_zombieId) {
    
    
    Zombie storage myZombie = zombies[_zombieId];
    Zombie storage enemyZombie = zombies[_targetId];
    uint rand = randMod(100);
    if (rand <= attackVictoryProbability) {
    
    
      myZombie.winCount++;
      myZombie.level++;
      enemyZombie.lossCount++;
      feedAndMultiply(_zombieId, enemyZombie.dna, "zombie");
    } else {
    
    
      myZombie.lossCount++;
      enemyZombie.winCount++;
      _triggerCooldown(myZombie);
    }
  }
}
  • erc721.sol:
/**
  ERC20代币,一个代币只是一个追踪谁拥有多少该代币的合约,和一些可以让那些用户将它们的代币转移到其他地址的函数

  ERC721 适合CryptpZombies这样的加密收藏品,是ERC721代币
  ERC721代币是不能互换的,因为每个代币都被认为是唯一且不可分割的。只能以整个单位交易它们。

  搞出一个ERC721的标准,好处显而易见:我们不必在合约中实现拍卖和托管逻辑,符合其规范,其他人可以为
  加密可交易的ERC721资产搭建交易平台,ERC721僵尸也可在上面使用和交易。
**/
contract ERC721 {
    
    
  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function transfer(address _to, uint256 _tokenId) public;
  function approve(address _to, uint256 _tokenId) public;
  function takeOwnership(uint256 _tokenId) public;
}
  • propiedad.sol:
pragma solidity ^0.4.19;
/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    
    
  address public owner;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    
    
    owner = msg.sender;
  }


  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    
    
    require(msg.sender == owner);
    _;
  }


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    
    
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}
  • Safemath.sol:
pragma solidity ^0.4.18;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
    
    

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
    if (a == 0) {
    
    
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
    assert(b <= a);
    return a - b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    
    
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}
  • propiedadzombi.sol:
pragma solidity ^0.4.19;

import "./zombieattack.sol";
import "./erc721.sol";
import "./safemath.sol";

contract ZombieOwnership is ZombieAttack, ERC721 {
    
    

  using SafeMath for uint256;

  mapping (uint => address) zombieApprovals;

  // 传入address函数,返回address拥有多少ERC721代币,整数不可分割
  function balanceOf(address _owner) public view returns (uint256 _balance) {
    
    
    return ownerZombieCount[_owner];
  }

  // 传入一个代币ID,也是僵尸ID,返回该代币拥有者的address
  function ownerOf(uint256 _tokenId) public view returns (address _owner) {
    
    
    return zombieToOwner[_tokenId];
  }

  // 代币的拥有者调用transfer方法,传入需要转移到的address和他想转移的代币的_tokenId。
  // 合约安全增强:溢出和下溢
  // 溢出(overflow),uint8的变量,存储的最大数就是二进制11111111,也就是十进制的255,加1就出现溢出。
  // 下溢(underflow),一个等于0的uint8,减去1就出现下溢,变成255,uint是无符号的,不能等于复数。
  function _transfer(address _from, address _to, uint256 _tokenId) private {
    
    
    ownerZombieCount[_to] = ownerZombieCount[_to].add(1);
    ownerZombieCount[msg.sender] = ownerZombieCount[msg.sender].sub(1);
    zombieToOwner[_tokenId] = _to;
    Transfer(_from, _to, _tokenId);
  }

  // 都有一个修饰符onlyOwnerOf
  function transfer(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) {
    
    
    _transfer(msg.sender, _to, _tokenId);
  }

  // 代币的拥有者调用approve,传入允许提取代币的address和允许提取的代币_tokenId。
  function approve(address _to, uint256 _tokenId) public onlyOwnerOf(_tokenId) {
    
    
    zombieApprovals[_tokenId] = _to;
    Approval(msg.sender, _to, _tokenId);
  }

  // require检查确保msg.sender已经被批准来提取这个代币,也就是僵尸。
  function takeOwnership(uint256 _tokenId) public {
    
    
    require(zombieApprovals[_tokenId] == msg.sender);
    address owner = ownerOf(_tokenId);
    _transfer(owner, msg.sender, _tokenId);
  }
}
  • zombiehelper.sol:
pragma solidity ^0.4.19;

import "./zombiefeeding.sol";

/**
  辅助方法
**/
contract ZombieHelper is ZombieFeeding {
    
    

  uint levelUpFee = 0.001 ether;

  // 修饰符modifier的最后一行为 _ ,表示修饰符调用结束后返回,并执行调用函数余下的部分。
  modifier aboveLevel(uint _level, uint _zombieId) {
    
    
    require(zombies[_zombieId].level >= _level);
    _;
  }

  // 提现功能,只能是合约主人享有
  // 通过transfer函数向一个地址发送以太
  function withdraw() external onlyOwner {
    
    
    owner.transfer(this.balance);
  }

  // 合约主人设置levelUpFee
  function setLevelUpFee(uint _fee) external onlyOwner {
    
    
    levelUpFee = _fee;
  }

  // payable修饰符,是一种可以接收以太的特殊函数
  // 通过支付ETH来升级僵尸,ETH将存储在你拥有的合约中
  function levelUp(uint _zombieId) external payable {
    
    
    require(msg.value == levelUpFee);
    zombies[_zombieId].level++;
  }

  // 2级以上的僵尸可以改名
  function changeName(uint _zombieId, string _newName) external aboveLevel(2, _zombieId) onlyOwnerOf(_zombieId) {
    
    
    zombies[_zombieId].name = _newName;
  }

  // 20级以上的僵尸可以定制DNA
  function changeDna(uint _zombieId, uint _newDna) external aboveLevel(20, _zombieId) onlyOwnerOf(_zombieId) {
    
    
    zombies[_zombieId].dna = _newDna;
  }

  // 查看某个某家的整个僵尸军团,只需要从区块链中读取数据,view函数。
  function getZombiesByOwner(address _owner) external view returns(uint[]) {
    
    
    // memory 关键字是使用临时存储,调用完就释放
    uint[] memory result = new uint[](ownerZombieCount[_owner]);
    uint counter = 0;
    for (uint i = 0; i < zombies.length; i++) {
    
    
      if (zombieToOwner[i] == _owner) {
    
    
        result[counter] = i;
        counter++;
      }
    }
    return result;
  }
}

Supongo que te gusta

Origin blog.csdn.net/Forever_wj/article/details/125551335
Recomendado
Clasificación