10000 個の 16 バイト文字列 (使用した文字列は「abcdefghijklmnop」) をソリッド マッピングに格納しようとしました: mapping(uint256 => string)
1 回のトランザクションで 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 個のファイルがあり、genomes0.txt、genomics1.txt、genomics2.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
また、プロセス全体のガス価格を最小限に抑えるつもりです。このようなシナリオで以前に経験した人はいますか?
更新:上記の問題を解決しました。
私は Hardhat discord で Miguel_LZPF によって提案されたこれを行いました:
contract.function(param1, param2..., lastfunctionparam, {gasLimit: xxxxx})
そして、gasLimit と gasPrice を手動で定義します。そして今、私は別の問題で立ち往生しています。
https://rinkeby.etherscan.io/address/0x11740C2367a0F0465d31b3612B3A5464dC7c8Afb
警告!コントラクトの実行中にエラーが発生しました [実行が取り消されました]
それでも、ループ内の最初のトランザクションはたまたま成功し、残りは失敗します。