es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo resolver este Hardhat CompilerError? (Pila demasiado profunda al compilar ensamblado en línea)

Estoy analizando los contratos inteligentes de Chainrunners, así que fui a Etherscan y copié el código fuente del contrato verificado.

Cuando intenté compilar sin el optimizador de solidity, obtuve esta advertencia:

thatguyintech@albert chainrunners % npx hardhat compile
Compilando 5 archivos con 0.8.4
Advertencia: Variable local no utilizada.
   --> contracts/ChainRunnersBaseRenderer.sol:232:124:
    |
232 |  ... kenPalettes, uint8 numTokenLayers, string[NUM<em>LAYERS] memory traitTypes) = getTokenData(</em>dna);
    |                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Advertencia: El tamaño del código del contrato excede los 24576 bytes (un límite introducido en Spurious Dragon). Este contrato puede que no se pueda desplegar en la red principal. Considera habilitar el optimizador (¡con un valor bajo de "runs"!), desactivar las cadenas de revert o usar bibliotecas.
  --> contracts/ChainRunnersBaseRenderer.sol:48:1:
   |
48 | contract ChainRunnersBaseRenderer is Ownable, ReentrancyGuard {
   | ^ (La parte relevante del código fuente comienza aquí y se extiende en varias líneas).

Así que intenté activar el optimizador según la documentación oficial de Hardhat: https://hardhat.org/config/

Así es como se ve mi configuración de Hardhat en el archivo hardhat.config.js:

/**
 * @type import('hardhat/config').HardhatUserConfig
 */

module.exports = {
  solidity: {
    version: "0.8.4",
    settings: {
      optimizer: {
        enabled: true,
        runs: 2000,
      }
    }
  }
};

Ahora estoy obteniendo este CompilerError de Hardhat cuando intento ejecutar npx hardhat compile:

thatguyintech@albert chainrunners % npx hardhat compile
Compilando 5 archivos con 0.8.4
CompilerError: Pila demasiado profunda al compilar el ensamblado en línea. La variable value0 está 3 espacios demasiado profunda dentro de la pila.

¿Alguien sabe cómo puedo resolver esto? A partir de un par de búsquedas en Google en hilos relacionados con Hardhat, parece que activar el optimizador debería solucionar este problema, así que estoy bastante confundido.

Aquí hay un ejemplo que encontré en los foros de OpenZeppelin que no me está funcionando: https://forum.openzeppelin.com/t/stack-to-deep-when-compiling-inline-assembly/11391/11

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución al error “Stack Too Deep” en Hardhat al compilar con optimizador

    El error “Stack Too Deep” (Pila muy profunda) al compilar un contrato con el optimizador habilitado, ocurre cuando el ensamblador en línea de Solidity utiliza más de 16 variables locales a la vez. Esto es una limitación de Solidity.

    Aquí hay algunas soluciones posibles para resolver este error:

    1. Deshabilitar el Ensamblador en Línea

    Intenta deshabilitar el código de ensamblador en línea en tu contrato, reemplazándolo por código Solidity equivalente que no utilice ensamblador en línea. Este proceso puede ser tedioso dependiendo de la complejidad del código en ensamblador. Sin embargo, esta es una opción recomendada si el código de ensamblador en línea no es esencial.

    2. Dividir el Contrato en Partes más Pequeñas

    Si el contrato es demasiado complejo y utiliza muchas variables locales, puedes considerar dividir el contrato en partes más pequeñas y luego desplegarlas por separado. Esto reducirá el número de variables locales necesarias en cada contrato y, por lo tanto, se evitará el error.

    3. Reducir el Valor de “runs” en la Configuración de Hardhat

    También puedes intentar reducir el valor de la propiedad “runs” en la configuración del optimizador en hardhat.config.js. Al reducirlo, el optimizador se ejecuta menos veces y es posible que no alcance el límite de 16 variables.

    module.exports = {
      solidity: {
        version: "0.8.4",
        settings: {
          optimizer: {
            enabled: true,
            runs: 1000, // Valor reducido
          },
        },
      },
    };
    

    4. Utilizar Ensamblador en un Contrato Separado

    Puedes intentar extraer el código en ensamblador en un contrato separado e interactuar con él mediante código EVM para evitar el error de pila muy profunda.

    contract ContratoEnsamblador {
        function tuFuncionEnsamblador() public pure returns (bool) {
            assembly {
                // tu código en ensamblador aquí
            }
            return true;
        }
    }
    
    contract TuContratoPrincipal {
        function algunaFuncion() public {
            ContratoEnsamblador contratoEnsamblador = new ContratoEnsamblador();
            contratoEnsamblador.tuFuncionEnsamblador();
        }
    }
    

    Estas son algunas de las soluciones comunes para resolver el error “Stack Too Deep” al compilar un contrato con optimizador habilitado en Hardhat.

Comments are closed.