Se ha lanzado una nueva versión de Solidity, el lenguaje de desarrollo de contratos inteligentes más popular de Ethereum

Compilación: Plan de traducción; Fuente: soliditylang.org

Se ha lanzado la última versión del compilador de Solidity v0.8.22. El compilador 0.8.22 incluye una serie de mejoras en el lenguaje y el compilador, como definiciones de eventos a nivel de archivo, optimización incremental de bucles no comprobados, compatibilidad con la importación de JSON de ensamblado de EVM y más.

IMPORTANTE

Esta versión deja de lado el soporte para las EVM por debajo de Constantinopla (Constantinopla), que son cada vez más difíciles de mantener. Estas versiones arcaicas han estado obsoletas durante mucho tiempo en la red principal y la red de prueba de Ethereum, y sospechamos que ya no son relevantes para otras redes también. Las rutas de acceso de código y las soluciones complejas ralentizan el desarrollo de características y las pruebas de nuevas versiones, por lo que esperamos dejar de admitirlas en futuras versiones del compilador. Si confía en el soporte para estas versiones de EVM, póngase en contacto con nosotros[6] 。

Aspectos destacados de las nuevas características

Incremento de bucle no marcado

El uso de aritmética no controlada al aumentar el contador de bucle es para la optimización del gas[7] práctica común. Ilustremos con el siguiente ejemplo de un bucle y un contador i:

for (uint i = 0; i < array.length; ++i) {
ACC += Matriz[i] ; i no es modificado por el cuerpo del bucle
}

En muchos casos (consulte las condiciones exactas a continuación), la operación de comparación garantizará que i nunca alcance el valor máximo de su tipo, por lo que es seguro asumir que el bucle se detendrá antes de que se alcance el valor máximo. En este caso, una comprobación de seguridad del contador sería redundante y un desperdicio de gas. Esto anima al usuario a utilizar el patrón largo sin comprobar, que envuelve el contador de forma incremental en un bloque aritmético sin comprobar dentro del bucle, omitiendo la comprobación:

for (uint i = 0; i < array.length;) {
ACC += Matriz[i] ;
unchecked { i++; } // i se incrementa sin comprobaciones de desbordamiento -- menos gas utilizado
}

Solidity 0.8.22 introduce una optimización de comprobación de desbordamiento que genera automáticamente un incremento aritmético no comprobado para el contador de bucles. Esta nueva optimización elimina la necesidad de utilizar un patrón delta largo sin comprobar en cuerpos de bucle como el del ejemplo anterior.

Por el contrario, las nuevas optimizaciones permiten a los usuarios volver a un código sin procesar y más legible sin sacrificar la eficiencia del gas.

Las condiciones precisas para la nueva comprobación optimizada de prevención de derrames son las siguientes:

  • Las condiciones del ciclo tienen la forma de i < ... donde i es una variable local (en adelante llamada "contador de bucles").
  • Esta comparación debe realizarse en el mismo tipo que el contador de bucle, es decir, el tipo de la derecha debe convertirse implícitamente en el tipo del contador de bucle para que el contador de bucle no se extienda implícitamente antes de la comparación.
  • El contador de bucles debe ser una variable local del tipo entero incorporado.
  • La expresión de bucle debe ser un prefijo o un incremento de sufijo para el contador de bucle, i++ o ++i.
  • El contador de ciclos no se puede modificar en una condición de ciclo o en un cuerpo de ciclo.

Para aclarar la segunda condición, tenga en cuenta el siguiente fragmento de código:

for (uint8 i = 0; in < UINT16(1000); ++I) {
Cuerpo del bucle
}

En este caso, i se convierte en uint16 antes de la comparación, y la condición nunca es realmente falsa, por lo que no se puede eliminar la comprobación de desbordamiento incrementada.

Además, tenga en cuenta que < es el único operador de comparación que desencadena la optimización. El operador <= y otros operadores se excluyen deliberadamente. Además, el operador debe estar integrado: definido por el usuario < no es elegible.

La optimización es sencilla y siempre beneficiosa, por lo que se habilitará incluso si el resto del optimizador está deshabilitado mediante la configuración común settings.optimizer.enabled. Puede desactivarlo explícitamente estableciendo settings.optimizer.details.simpleCounterForLoopUncheckedIncrement en false en la entrada JSON estándar. No se puede deshabilitar mediante la interfaz de línea de comandos.

Ajuste el optimizador de Yul para regenerar cero literales

La nueva versión se basa en el soporte de código de operación PUSH0 introducido en la versión 0.8.20 mediante la adición del Rematerializador[8] [9] El paso de optimización se amplía para regenerar siempre el literal cero en lugar de almacenarlo como una referencia variable, lo que permite utilizar PUSH0 en lugar de DUP para reducir los costes de gas. Para garantizar que esto se haga de manera efectiva, se agregan Rematerializador y Podador no utilizado Los pasos se agregan a la secuencia de limpieza predeterminada del optimizador de Yul.

Se ha añadido compatibilidad para importar JSON de ensamblaje de EVM (experimental)

Esta nueva versión agrega soporte experimental para importar ensamblajes EVM, lo que abre la posibilidad de que herramientas externas realicen superoptimizaciones antes de la generación de código de bytes. El objetivo principal de esta característica es definir un formato de serialización para ensamblados EVM de bajo nivel, de modo que los ensamblados generados por el compilador se puedan exportar, modificar y volver a importar, reanudando así el proceso de compilación normal.

Importante: Se trata de una función experimental y no está disponible actualmente en producción. Ofrecemos esta función en esta versión para que pueda probarla y enviar sus comentarios.

Permite que los eventos se definan a nivel de archivo

Solidity 0.8.22 le permite definir eventos a nivel de archivo. Las definiciones de eventos ahora se pueden colocar fuera del alcance del contrato. Esto ofrece otra opción para la organización del código sin tener que encapsular artificialmente los eventos en una biblioteca.

Además, esta versión corrige un error que provocaba un error al generar una NatSpec al emitir un evento definido en un contrato externo o una interfaz para el código. En la versión anterior (0.8.21), el compilador de Solidity agregó soporte para el acceso restringido a eventos definidos en contratos e interfaces que no se heredan del contrato actual, pero el error impedía el uso completo de la función.

Con esta corrección de errores y permitiendo definiciones de eventos a nivel de archivo, la última versión de Solidity permite a los usuarios compilar los siguientes ejemplos sin ningún error:

interfaz I {
evento ForeignEvent();
}
contrato C {
evento ForeignEvent();
}
evento E();
contrato D {
function f() public {
La emisión de un evento externo desencadenaría un error interno en 0.8.21
emitir I.ForeignEvent();
emitir C.ForeignEvent();
Emisión de un evento de nivel de archivo. Nueva característica.
emitir E();
}
}

Registro de cambios completo

Características lingüísticas

  • Permite definir eventos a nivel de archivo.

Características del compilador

  • Generador de código: Elimina las comprobaciones de desbordamiento redundantes para algunos bucles for cuando la variable count no se desborda.
  • Interfaz de línea de comandos: Se agregó la opción --no-import-callback para evitar que el compilador cargue archivos de origen que no se proporcionan explícitamente en la CLI o en la entrada JSON estándar.
  • Interfaz de línea de comandos: Se agregó una opción experimental --import-asm-json para importar ensamblados EVM en el formato utilizado por --asm-json. Interfaz de línea de comandos: use la gravedad y el color adecuados para los mensajes de error generados fuera de la canalización compilada.
  • EVM: Soporte obsoleto para las versiones EVM "homestead", "tangerineWhistle", "spuriousDragon" y "byzantium".
  • Parser: Elimina el modo de recuperación de errores experimental (--error-recovery/settings.parserErrorRecovery).
  • SMTChecker: Soporta operadores definidos por el usuario.
  • Yul Optimizer: Si se admite PUSH0, prefiere usar cero literales en lugar de almacenar cero valores en variables.
  • Yul Optimizer: Ejecuta los pasos Rematerializer y UnusedPruner al final de la secuencia de limpieza predeterminada.

Corrección de errores

  • Generador de código: Se ha corregido un problema por el que la salida a través del generador de código a través de IR dependía de los archivos encontrados en las devoluciones de llamada de importación. En algunos casos, diferentes asignaciones de ID de AST pueden alterar el orden de las funciones en la programación interna, lo que da como resultado códigos de bytes aparentemente diferentes pero semánticamente equivalentes.
  • NatSpec: Se corrigió un error interno al solicitar documentación de usuario o documentación de desarrollo para un contrato que emitía un evento definido en un contrato o interfaz externa.
  • SMTChecker: Se corrigió un error de codificación que causaba que el bucle se expandiera después de la finalización.
  • SMTChecker: Se corrigieron las inconsistencias en las comprobaciones de condición constantes cuando se desenrolla un bucle while o for antes de una comprobación de condición.
  • Optimizador de Yul: Se ha corregido un problema por el que los nombres de las variables Yul generadas por el compilador durante el CSE afectaban a las decisiones de sustitución, lo que daba lugar a un código de bytes diferente (pero equivalente) en algunos casos.
Ver originales
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
  • Recompensa
  • Comentar
  • Compartir
Comentar
0/400
Sin comentarios
  • Anclado
Opere con criptomonedas en cualquier momento y lugar
qrCode
Escanee para descargar la aplicación Gate
Comunidad
Español
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)