
Fuente: Comunidad Dengchain
En el artículo de hoy, analizaremos la solidezeventoSe llama en Ethereum más común y EVMRegistroEsenciaVeremos cómo usarlos, sus definiciones, cómo usar el tema del evento y la firma para filtrar el registro, y algunas sugerencias sobre cuándo.
También cubriremos la inspecciónevento-El modo de interacción, este famoso modelo se aplica tradicionalmente al ingreso de las variables de estado, pero veremos por qué este modelo también debe aplicarse a eventos desencadenantes y riesgos potenciales y vulnerabilidades de seguridad involucradas.
¿Cómo definir eventos en solidez?
Estar disponible
interfaz ilight {< BR/> Evento SwitchDon ();Puede aprobar el nombre del contrato a través de un acceso limitado completo, seguido de seguirEntonces, entonces Para acceder al evento desde otro contrato con el nombre del evento, como se muestra a continuación:
Usuario de vestimenta de eventos)
La firma del evento es:
Usuario de vestimenta de eventos)
El tema del evento es:
bytes32 topichash = uccessfle .selector;
Tenga en cuenta que solo después de la solidez v0.8.15, el incidente.selector Los miembros pueden usarlo.
Si verifica cualquier registro de blockchain, encontrará el índice del tema del registro0 (El primero) El propósito corresponde al tema del evento.Dado que el tema es el contenido que se puede buscar a través de un registro, podemosFiltrar con el tema del evento:
-
Busque eventos específicos en el contrato inteligente de una dirección específica.
-
Busque eventos específicos en todos los contratos en blockchain.
Lo veremos más abajo,anónimo El evento anónimo es la excepción de esta regla.anónimo Las palabras clave los hacen incapaces de buscar, así que use el término"anónimo"Esencia
Según este hecho, también podemos inferir que el evento más simple definido en la solidez no tiene parámetros, como el evento definido anteriormenteBulbreplicado oSwitchedon , Se usará en la parte inferiorLog1 El código de operación desencadena el tema en el registro porque el incidente en sí se puede buscar.
Puede agregar más temas, se utilizarán otros temasLog2 ,Log3 ,Log4 yLog5 Mientras estos parámetros estén marcados comoindexado EsenciaEchemos un vistazo al parámetro del índice en la siguiente sección.
Parámetros del evento y parámetros del índice
El evento puede aceptar cualquier tipo de parámetros, incluido el tipo de valor (Uintn ,byteesn ,bool ,DIRECCIÓN ...) ,,estructura ,enumer Y el tipo de valor definido por el usuario.
Según mi investigación en este artículo, el único tipo que no está permitido es el tipo de función interna.Se permite el tipo de función externa, pero el tipo de función interna no está permitida.Por ejemplo, el siguiente código no se compilará.
// spdx- s Identificador de licencia: sin licencia
Solidez de Pragma ^0.8.0; >
Si la declaración del evento esanónimo En el contrato ABI, el incidente está disponible"Anónimo" El campo se marcará comoverdadero Esencia

img https://github.com/ethereum/solidies/issues/13086
Una ventaja anónima es que hace que su contrato sea más barato y más barato, y el gas es más barato cuando se activa.
Un buen caso de evento anónimo es un contrato con solo un evento.Todos los eventos en el contrato de negociación son significativos, porque solo este incidente aparecerá en el registro de eventos.Suscríbete a su nombre es irrelevante, porque solo se define un solo evento para emitir el contrato.Por lo tanto, puede definir eventos anónimos, suscribirse a todos los registros de eventos del contrato y confirmar que son los mismos eventos.
Verifique el uso de uso anónimo en la popular biblioteca de códigos, como el contrato de DS-Note en Dappphub[7]medio.

ImgCódigo fuente[8]
Podemos ver en el fragmento de código anterior que debido a que la declaración del evento es anónima, esto puede definir el cuarto parámetro "indexado".
Tenga en cuenta que debido a que el evento anónimo no tiene el tema de Bytes32, el evento anónimo no admite.selector miembro.
Use el código de operación de registro para activar eventos en el ensamblaje

img https://docs.solidieslang.org/en/v0.8.19/yul.html#evm-dialect
Es posible activar un evento en la asamblea, usarLogn Instrucción, la instrucción corresponde al código de operación concentrado por la instrucción EVM.
Para activar un evento en la Asamblea, debe almacenar todos los datos emitidos por el incidente enmemoria Posición específica.
Una vez que almacene los datos del evento en la memoria, y luego puede especificar los siguientes parámetros en la instrucción Logn:
-
P = Obtenga la posición de memoria de los datos de él.Básicamente, este es un puntero de memoria, o un "desplazamiento" o "índice de memoria", dependiendo de cómo lo llame.
-
S = Desea el número de bytes emitidos de P en el evento.
-
Todos los demás parámetrosT1 Así comoT2 Así comoT3 yT4 Son los parámetros del evento que desea indexar.Tenga en cuenta que hay dos cosas importantes aquí: 1) Estos parámetros deben ser los mismos que los parámetros definidos en el mismo orden que la definición de sus eventos, 2) Estos parámetros deben colocarse en la memoria para obtener datos.
El siguiente fragmento de código muestra cómo realizar esta operación en el ensamblaje.
& lt; -7px; ) Internet {
bytes32 topichash = Ejemploventam.selector; /> Log2 (
freememorypointer, /// `P` P` P` P` P` P` P` P` P` P` P` P` P` P` P` P` P` P` P` P` P` P` P` = Comenzando el desplazamiento en la memoria
64, // `S` = Número de bytes en la memoria de 'P` para incluir en los datos del evento
Tema para filtrar el filtro Evento de sí mismo
tokenid // 1er parámetro indexado
)
}
}
Costo de gas del evento
Todos los códigos de operación de registro (
Además, otros factores, como índices o datos, también pueden hacer que el evento consuma más gas.
Verificar -Event -Modo Interactivo
Modo de control-efectivo de verificación[9]También es adecuado para incidentes.
Un método para detectar estos modos es usar la herramienta de análisis estático Remix.
Este modelo también puede ser detectado por Slither.Cuando un contrato ejecuta un contrato con una llamada externa, obtendrá un descubrimiento para solicitar el "evento de reiniciación".
Por lo tanto, para DAPP, el pedido es muy importante, por lo que puede verificar correctamente qué incidente primero, a continuación y finalmente emitido.Esto es particularmente importante cuando las llamadas recursivas o reingresadas.Si el evento se activa después de llamadas externas, y esta llamada externa está hecha de una llamada repetida, entonces:
-
El primer incidente fue la segunda vez después de que se completó la llamada.
-
El segundo evento se emitió después de la transacción inicial.
-
Cuando los usuarios restringidos y la dirección ejecutan ciertas operaciones (por ejemplo, propietario o administrador de contratos).Esto incluye como los populares
Propiedad de transferencia (dirección) Función, el propietario solo puede llamar a esta función para cambiar el propietario del contrato. -
Cambie algunas variables clave o parámetros aritméticos, que son responsables de la lógica central del contrato.Es particularmente importante en el fondo del protocolo Defi.
-
Contratos de vigilancia desplegados en producción para detectar anormalidades.
-
El documento que falta a fines del uso del evento anónimo (sepa por qué)
[14] -
[Ventajas del evento anónimo]
Comprender esto también permite un seguimiento claro de auditoría bajo la cadena para monitorear las llamadas de contrato.Puede ver qué funciones se llaman primero y finalmente, y el orden de ejecución de cada rutina durante la ejecución de la transacción.
Documentación del detector de deslizamiento[10]-Stabilidad y analizadores estáticos de Vyper.
Esta posible vulnerabilidad también está en el camino de los bits[11]Encontrado e informar en la auditoría de contratos inteligentes.
¿Cuándo se debe activar el incidente?
Puede haber varios casos en su contrato que pueden ser importantes y útiles para desencadenar eventos.
Documentación del detector de deslizamiento[12]Describa más información sobre estas situaciones.
Esto también se describe en el informe de auditoría de senderos de LooksRare.
Ver 0xprotocol[13]Detalles para comprender los problemas relacionados con la seguridad relacionados con el incidente.