0

我一直在尝试在可靠映射中存储 10000 个 16 字节字符串(我使用的字符串是 'abcdefghijklmnop'):mapping(uint256 => string)

  1. 我尝试在一笔交易中发送所有 10000 个字符串,但它总是超过最大气体限制并失败。

  2. 将这 10000 个字符串分成相等的 10 个数组并尝试执行 10 个事务。第一个事务,前 1000 个字符串成功发生,但由于气体问题,以下事务失败

坚固代码:

uint256 public totalGenomes;
mapping(uint256 => string) public genomesList;

function addGenome(string[] memory genome) public {
        for (uint256 index = totalGenomes; index < (1000 + totalGenomes); index++) {
            genomesList[index] = genome[index];
        }
        totalGenomes += 1000;
    }

Hardhat脚本:有10个文件基因组0.txt,基因组1.txt,基因组2.txt ....每个包含1000行'abcdefghijklmnop'

for (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: cannot estimate gas; transaction may fail or may require manual gas limit

我还打算将整个过程的 gas 价格降到最低。这里有没有人有过这种情况的经验?


更新:我解决了上述问题。

我这样做是Miguel_LZPF在 Hardhat discord 上建议的:

contract.function(param1, param2..., lastfunctionparam, {gasLimit: xxxxx})

并手动定义gasLimit 和gasPrice。现在,我陷入了另一个问题。

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

警告!合约执行过程中遇到错误[执行恢复]

循环中的第一个事务仍然是成功的,其余的则失败了。

4

0 回答 0