function sumNumbers(uint256 n) public pure returns (uint256) {
uint256 sum = 0;
for (uint256 i = 0; i < n; i++) {
sum += i;
}
return sum;
}
While循环:适用于在循环开始前条件不明确,需要在循环过程中判断的场景。
function findEvenNumber(uint256 start) public pure returns (uint256) {
uint256 current = start;
while (current % 2 != 0) {
current++;
}
return current;
}
Do-While循环:至少执行一次循环体,然后再判断条件。
function doSomethingAtLeastOnce() public pure returns (uint256) {
uint256 x = 0;
do {
x++;
// 假设x在这里被修改或使用
} while (x < 5);
return x;
}
以太坊合约循环的核心风险与挑战
与在传统中心化服务器上执行代码不同,以太坊合约中的循环面临着几个独特的挑战:
Gas限制与Gas耗尽(Out of Gas):
Block Gas Limit:每个以太坊区块能处理的Gas总量有限,单个交易的Gas消耗不能超过当前区块的剩余Gas限制。
ng>无限循环的致命性:如果合约中出现了一个理论上无法退出的“无限循环”(例如for (uint256 i = 0; i < 1000000000; i++) {}且内部没有能提前break的条件),当用户尝试调用该函数时,交易会因Gas耗尽而失败,并且用户支付的Gas费用无法收回,更糟糕的是,如果循环中包含修改状态的操作,即使Gas耗尽,状态变更也可能部分执行,导致合约状态不一致。