我一直在尝试在可靠映射中存储 10000 个 16 字节字符串(我使用的字符串是 'abcdefghijklmnop'):mapping(uint256 => string)
我尝试在一笔交易中发送所有 10000 个字符串,但它总是超过最大气体限制并失败。
将这 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
警告!合约执行过程中遇到错误[执行恢复]
循环中的第一个事务仍然是成功的,其余的则失败了。