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.

Primera llamada a la función exitosa, segunda llamada fallida. (Solidity con Hardhat)

He estado intentando almacenar 10000 cadenas de 16 bytes (la cadena que utilicé es ‘abcdefghijklmnop’) en un mapeo de Solidity: mapeo(uint256 => cadena)

  1. He intentado enviar las 10000 cadenas en una sola transacción y siempre excede el límite máximo de gas y falla.

  2. Dividí esas 10000 cadenas en 10 arreglos iguales e intenté hacer 10 transacciones. La primera transacción, con las primeras 1000 cadenas, se realiza correctamente, pero las siguientes transacciones fallan debido a un problema de gas.

Código de Solidity:

uint256 public totalGenomes;
mapeo(uint256 => cadena) public genomesList;

función addGenoma(cadena[] memoria genome) public {
for (uint256 índice = totalGenomes; índice < (1000 + totalGenomes); índice++) {
genomesList[índice] = genome[índice];
}
totalGenomes += 1000;
}

Script de Hardhat: hay 10 archivos genomes0.txt, genomes1.txt, genomes2.txt, … cada uno contiene 1000 líneas de ‘abcdefghijklmnop’

por (i = 0; i < 10; i++) {
let filepath = ./img/genomes${i}.txt;
let genomes1000 = [];
genomes1000 = fs.readFileSync(filepath).toString().split(‘\n’);
console.log(filepath);
await svgNFT.addGenome(genomes1000);
}

Error:

Error: no se puede estimar el gas; la transacción puede fallar o puede requerir un límite de gas manual.

También tengo la intención de minimizar el precio del gas para todo el proceso. ¿Alguien aquí tiene experiencia previa en un escenario similar?

ACTUALIZAR: Superé el problema anterior.

Hice lo que sugirió Miguel_LZPF en el Discord de Hardhat:

contrato.funcion(param1, param2…, últimoParametroDeLaFuncion, {gasLimit: xxxxx})

y definí el gasLimit y gasPrice manualmente. Y ahora, estoy atrapado en otro problema.

https://rinkeby.etherscan.io/address/0x11740C2367a0F0465d31b3612B3A5464dC7c8Afb

¡Advertencia! Se encontró un error durante la ejecución del contrato [ejecución revertida]

Aún así, la primera transacción en el bucle ocurre exitosamente, pero el resto falla.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basándonos en la información proporcionada, parece que el problema está relacionado con el límite de gas y el precio del gas para las transacciones. Almacenar 10000 cadenas de 16 bytes en un mapeo puede consumir mucho gas, y puede que no sea factible enviar todas las cadenas en una sola transacción ni en múltiples transacciones sin gestionar cuidadosamente el límite de gas y el precio del gas.

    Una solución que se ha intentado es dividir las cadenas en lotes de 1000 y enviarlas en transacciones separadas. Sin embargo, incluso este enfoque está fallando debido a problemas con el gas.

    Para minimizar los costos de gas y hacer que las transacciones sean viables, se recomienda hacer lo siguiente:

    1. Optimizar el código para reducir la cantidad de gas consumido al almacenar las cadenas en el mapeo.

    2. Considerar el uso de un mecanismo de almacenamiento diferente que sea más adecuado para grandes cantidades de datos.

    3. Definir manualmente el límite de gas y el precio del gas para cada transacción, asegurándose de que no superen el límite máximo y que no sean demasiado costosos.

    4. Probar las transacciones en una red de prueba antes de implementarlas en la red principal para evitar gastos innecesarios.

    5. Buscar consejo y asistencia de otros expertos de la comunidad que puedan tener experiencia en escenarios similares.

Comments are closed.