Escanea para descargar la aplicación Gate
qrCode
Más opciones de descarga
No volver a recordar hoy

Automatización de auditorías de Solidity con el script Wake Printer

Condiciones previas y configuración

En este tutorial, utilizaremos el repositorio workshop como proyecto de ejemplo:

wake up

Bash

copiar

wake print

Bash

copiar

Ejecuta una impresora específica por nombre:

Tutorial 1: Crea tu primera impresora – Lista de contratos

Comencemos con una impresora sencilla que lista todos los contratos en el proyecto. Este ejemplo introduce los conceptos básicos que usarás en análisis más complejos.

Crear estructura de la impresora

Ejecuta los siguientes comandos para construir tu primera impresora:

from future import annotations import networkx as nx import rich_click as click import wake.ir as ir import wake.ir.types as types from rich import print from wake.cli import SolidityName from wake.printers import Printer, printer

class ListContractsPrinter(Printer): (def print)self( -> None: pass @printer.command)name=“list-contracts” (def cli)self( -> None: pass

Python

copiar

Aquí están las funciones de cada parte del template:

  • print)(: método principal para mostrar los resultados del análisis
  • cli)(: manejador de la interfaz de línea de comandos para personalizar parámetros

Implementar el patrón visitante

Wake usa el patrón visitante para recorrer el árbol de sintaxis abstracta (AST) de los contratos. Este patrón permite que Wake navegue automáticamente por la estructura del código, reaccionando a elementos específicos (como contratos o definiciones de funciones).

Para listar contratos, sobrescribiremos el método visit_contract_definition, que será llamado para cada contrato en la base de código.

Agrega este método a tu clase ListContractsPrinter:

wake print list-contracts

Bash

copiar

Este comando ejecuta tu impresora y muestra todos los nombres de contratos encontrados en tu proyecto.

Mejorar la salida

La implementación básica muestra todos los contratos, incluyendo interfaces y contratos que heredan. Mejorémosla para mostrar solo contratos desplegables:

def visit_contract_definition)self, node: ir.ContractDefinition( -> None: if len)node.child_contracts( != 0: return if node.kind != ir.enums.ContractKind.CONTRACT: return print)node.name(

Python

copiar

La clase ContractDefinition tiene atributos que puedes usar para filtrar resultados. Para referencia completa, consulta:

Implementación completa

Este es el versión final, con una separación adecuada de responsabilidades: recopila datos durante la iteración y los muestra en el método print)(:

Tutorial 2: Análisis de funciones en contratos

Saber qué funciones son accesibles externamente es crucial para la seguridad: funciones públicas como ‘withdraw’ o ‘transfer’ generalmente definen la superficie de ataque del contrato. Creemos una impresora que liste todas las funciones públicas y externas para mapear la superficie de ataque.

)## Crear impresora de funciones

Crea una nueva impresora:

class ListFunctionsPrinter###Printer(: contracts: list[ir.ContractDefinition] = []

def visit_contract_definition)self, node: ir.ContractDefinition( -> None:
    self.contracts.append)node(

Python

copiar

)## Manejar jerarquía de herencia

En el método print###(, recorremos la jerarquía de herencia desde el contrato base hasta los derivados, mostrando cada nivel de funciones que pueden ser llamadas:

def get_callable_final_functions)self, contract: ir.ContractDefinition( -> list[ir.FunctionDefinition]: return [func for func in contract.functions if len)func.child_functions( == 0 # es implementación final and func.visibility in [ir.enums.Visibility.PUBLIC, ir.enums.Visibility.EXTERNAL]]

Python

copiar

)## Ejecutar la impresora de funciones

Ejecuta la impresora para visualizar la jerarquía de herencia y funciones accesibles:

Contract: ContextContract: Functions: owner, renounceOwnership, transferOwnership Contract: SingleTokenVault Functions: constructor, deposit, withdraw, emergencyWithdraw, balanceOf, setDepositLimits

Contract: EIP712Example Functions: constructor, DOMAIN_SEPARATOR, castVoteBySignature, getVoteCounts

Contract: Context Contract: IERC20 Contract: IERC20Metadata Contract: IERC20 Errors: ERC20 Functions: name, symbol, decimals, totalSupply, balanceOf, transfer, allowance, approve, transferFrom Contract: IERC20Permit Contract: IERC5267 Contract: EIP712 Functions: eip712Domain, Nonces Contract: ERC20Permit Functions: permit, nonces, DOMAIN_SEPARATOR Contract: PermitToken Functions: constructor

Contract: Token Functions: constructor, mintTokens, transfer, transferWithBytes, getBalance

Contract: Context Contract: IERC20 Contract: IERC20Metadata Errors: ERC20 Functions: name, symbol, decimals, totalSupply, balanceOf, transfer, allowance, approve, transferFrom Contract: MockERC20 Functions: constructor

Bash

copiar

La salida proporciona un mapa visual rápido de la herencia y puntos de entrada de llamadas para cada contrato.

@printer.command###name=“list-functions”

(@click.option)“–contract-name”, type=str, required=False (def cli)self, contract_name: str | None( -> None: self.contract_name = contract_name

Python

copiar

Lógica de filtrado condicional

El método print)( ahora verifica si se solicitó un contrato específico. Si no se proporciona un nombre, la impresora listará todos los contratos desplegables. Si se especifica uno, solo profundizará en ese contrato, incluso si no es una hoja final.

Implementación completa con opciones CLI

Este es el impresor final con funcionalidad de filtrado opcional por contrato:

)# Enfocarse en un contrato específico wake print list-functions --contract-name Token

Bash

copiar

Pasos siguientes

Las impresoras te ofrecen un mapa; los detectores buscan vulnerabilidades. Juntos, convierten la auditoría de Solidity de un trabajo manual arduo a un proceso estructurado y con visión. Cada impresora que escribes puede hacer que el código complejo sea más claro y mejorar la seguridad de los contratos que revisas.

Para detección de vulnerabilidades, Wake ofrece un sistema de detectores separado que va más allá de la visualización para identificar problemas de seguridad reales. Las impresoras te proporcionan el mapa; los detectores buscan problemas.

Considera contribuir tu impresora a la comunidad. Las herramientas de análisis son más poderosas cuando se comparten, y tus impresoras personalizadas pueden ayudar a otros auditores a entender mejor códigos complejos.

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
  • Republicar
  • Compartir
Comentar
0/400
Sin comentarios
  • Gate Fun en tendenciaVer más
  • Cap.M.:$4.2KHolders:1
    0.00%
  • Cap.M.:$4.21KHolders:1
    0.00%
  • Cap.M.:$4.23KHolders:1
    0.00%
  • Cap.M.:$4.22KHolders:1
    0.00%
  • Cap.M.:$4.23KHolders:1
    0.00%
  • Anclado
Opera 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)