問題一覧に戻る
上級ガス最適化
問題88: バッチ処理とガス制限

Solidityの安全なバッチ処理を学習 - ガス制限管理と一括操作の最適化。大きなバッチはブロックガス制限(約3000万ガス)を超え、トランザクション失敗を引き起こします。calldataパラメータを持つexternal関数はmemoryより効率的。バッチサイズ制限とチャンク処理の実装はガス制限問題を防止。これらのパターンの理解は、複数操作を扱うスケーラブルなコントラクトに不可欠です。

pragma solidity ^0.8.0;

contract BatchProcessing {
mapping(address => uint256) public balances;
uint256 public constant MAX_BATCH_SIZE = 100;

// 危険:ガス制限保護なし
function unsafeBatch(
address[] memory recipients,
uint256[] memory amounts
) public {
// ガス制限超過リスク
for (uint256 i = 0; i < recipients.; i++) {
balances[recipients[i]] += amounts[i];
}
}

// 安全:バッチサイズ制限付き
function safeBatch(
address[] recipients,
uint256[] amounts
) {
require(recipients.length <= , "Batch too large");
require(recipients. == amounts.length, "Length mismatch");

// 効率的な処理
uint256 length = recipients.;
for (uint256 i = 0; i < ; i++) {
balances[recipients[i]] += amounts[i];
}
}

// ガス推定関数
function estimateGas(uint256 batchSize) pure returns (uint256) {
// ガスコスト計算
uint256 baseGas = 21000;
uint256 perItemGas = 5000;
return baseGas + (batchSize * );
}

// チャンク処理アプローチ
function processInChunks(
address[] calldata users,
uint256 startIndex
) external {
uint256 endIndex = startIndex + ;
if (endIndex > users.length) {
endIndex = users.length;
}

for (uint256 i = startIndex; i < endIndex; i++) {
balances[users[i]] += 100;
}
}
}