Contratos inteligentes y máquina virtual Ethereum: contratos inteligentes, lenguaje de solidez

Capítulo cuatro



1. Contrato inteligente

El comportamiento de un contrato inteligente está controlado por el código del contrato y el almacenamiento de la cuenta del contrato inteligente guarda el estado del contrato.
El código del contrato inteligente se ejecuta en la máquina virtual Ethereum, que es el núcleo del protocolo Ethereum.
Desde una perspectiva de almacenamiento, el contrato inteligente incluye información del producto y todos los registros de transacciones; desde una perspectiva funcional, el contrato incluye: función de reposición, función de transacción y función de retiro.

1. Método de almacenamiento

Los métodos de almacenamiento de la máquina virtual Ethereum se dividen en tres categorías: pila, almacenamiento de cuenta y memoria. pila, almacenamiento, memoria.
La pila es una estructura de datos lineal común y la longitud de cada elemento de la pila es de 256 bits.
El almacenamiento de la cuenta se almacena en la cadena de bloques como un atributo de la cuenta, por lo que Yuyinpan también es un almacenamiento persistente y no se liberará cuando finalice la ejecución del contrato. Los valores clave almacenados en la cuenta son todos de 256 bits. Asignar un valor de 0 a distinto de 0 consume 20.000 unidades de gas. Modificar un valor distinto de cero consume 5000 unidades de Gas. Asignar un valor distinto de cero a 0 puede recuperar 15.000 unidades de gas.
La memoria es un espacio lineal asignado temporalmente por la máquina virtual Ethereum cuando se ejecuta el código y se liberará automáticamente cuando finalice la llamada del contrato. Los bytes son la unidad de almacenamiento básica de la memoria. Cada vez que se consume, es necesario ampliar el área en unidades de 32 bytes, y cada 32 bytes consume 3 unidades de Gas.
Para ahorrar Gas, generalmente se usa memoria durante el proceso intermedio de ejecución del contrato y el resultado final se guarda en el almacenamiento de la cuenta.

2. Conjunto de instrucciones y llamada de mensaje.

La llamada del mensaje se incluye en la transacción y no genera un nuevo registro de transacción en la cadena de bloques.
Llamada delegada: solo obtiene el código del contrato de destino y lo ejecuta, y no cambia el contexto actual, incluidos msg.sender y msg.value, cuenta actual, almacenamiento, memoria, etc. Esto permite que los contratos inteligentes carguen código dinámicamente desde otras direcciones en tiempo de ejecución.

3. Iniciar sesión

Los desarrolladores pueden registrar registros generados por varios eventos durante la ejecución del código del contrato. Estos registros pueden ayudar a los desarrolladores a llamar al código o servir como evidencia de las transacciones que ocurren en la cadena de bloques.
La cadena de bloques no guarda el registro completo, pero guarda la verificación del valor hash del registro en el recibo de la transacción.
Bloom Filter se puede utilizar para recuperar rápidamente si es probable que un elemento esté en un conjunto. Puede mejorar la eficiencia de la búsqueda.

2. lenguaje de solidez

Los tipos de variables se pueden dividir en dos categorías según los diferentes métodos de paso de parámetros: tipos de valor y tipos de referencia.

  • Tipo de valor: se crea una copia cada vez que se copia o se pasa como parámetro. Incluyendo: bool, int, uint el sufijo debe ser múltiplo de 8 en el rango de 8 a 256. Las enumeraciones comienzan desde 0 de forma predeterminada y la longitud de la dirección es de 20 bytes. Si address.transfer falla, se lanzará una excepción y se finalizará. Address.send devolverá falso y continuará la ejecución.
  • Tipo de referencia: Dos ubicaciones de almacenamiento: almacenamiento de cuenta y memoria. Las variables de estado y algunos tipos de variables locales se almacenan en el almacenamiento de la cuenta de forma predeterminada, mientras que los parámetros de función u otros tipos simples de variables locales se almacenan en la memoria. Si es necesario, también puede declarar la variable con el modificador de memoria o almacenamiento para forzar la ubicación de almacenamiento de la variable. Incluyendo: matriz, push puede agregar elementos, estructuras y mapeo (Mapping) al final de la matriz: es una estructura de almacenamiento de la relación de mapeo clave-valor, mapeo (KeyType => ValueType), el mapeo no tiene concepto de longitud, y no almacena claves. , solo almacena el valor hash Keccak-256 de la clave.

1. Conversión de tipo

Conversión implícita: uint8 se puede convertir a uint16 o uint32, pero int8 no se puede convertir a uint6. Cualquier variable que se pueda convertir a uint16 se puede convertir al tipo de dirección.

2. Operador

La solidez incluye operadores aritméticos, operadores de comparación y operadores bit a bit.
eliminar representa el valor predeterminado. Pero no es válido para el mapeo.

3. Atributos de bloque y transacción:

block.blockhash: obtiene el valor hash de un bloque específico
block.coinbase: la dirección de cuenta del bloque "minero" actual
block.difficulty:
block.gaslimit
block.number: el número de bloque actual.
block.timestamp: uint, el tiempo de generación del bloque actual
msg.gas: uint, que indica el Gas restante
msg.sender: dirección, la dirección del remitente del mensaje actual
msg.sig: bytes4, los primeros 4 bytes de los datos de llamada , símbolo de identificación de función.
msg.value: uint, la cantidad de Ether transferida en este mensaje Unidad: wei
tx.gasprice: uint, el precio del gas de la transacción actual
tx.origin: dirección, el iniciador de la cadena de llamadas completa.
selfdestruct: Destruye el contrato actual.
suicidio: alias de autodestrucción.

4. Declaraciones de estructura de control

Cambiar e ir a no son compatibles.

5. Función

Una función puede tener múltiples parámetros y múltiples valores de retorno.
Hay dos tipos de llamadas a funciones:

  • Llamada interna: llamar a una función en el mismo contrato
  • Llamada externa: llamar a una instancia en otro contrato creará un mensaje y lo enviará al contrato llamado, como this.a() o foo.bar().

externo: función externa
público: externo e interno
interno: solo se puede acceder en el contrato actual u otros contratos que heredan el contrato actual
privado: interno

Seis, función constante y función alternativa

constante o ver significa solo lectura.

7. Modificador de función

modificador

8. Manejo de excepciones

  • afirmar: se usa para verificar variables y errores internos, y lanzar identificará un error y revertirá los cambios de estado causados ​​por la llamada del mensaje actual. La excepción es que se realizará una operación no válida.
  • Requerir: Asegurar que se cumplan las condiciones necesarias para la ejecución del programa. Se realiza una operación de reversión cuando ocurre una excepción.

Las dos máquinas virtuales Ethereum anteriores desharán todos los cambios de estado.
Sin embargo, existen excepciones para enviar, llamar y delegar llamadas. Estas funciones devolverán falso cuando se lanza una excepción durante la ejecución, en lugar de lanzar una excepción automáticamente.

9. Eventos y registros

evento{}
o a través del registro

10. Herencia de contratos inteligentes

Las funciones en el
contrato son todas funciones virtuales. A menos que se especifique un nombre de clase, se llamará a la última función derivada. Al heredar, se heredarán de izquierda a derecha.
Contrato abstracto: un contrato solo tiene vida útil pero no una implementación específica de la función. Esta función no se puede compilar, pero se puede heredar.

Resumir

提示:这里对文章进行总结:

De eso es de lo que voy a hablar hoy.
En la plataforma Ethereum, un contrato inteligente es un fragmento de código lógico almacenado en la cadena de bloques y se ejecuta en la máquina virtual Ethereum.

Supongo que te gusta

Origin blog.csdn.net/qq_53982314/article/details/124326167
Recomendado
Clasificación