循环

loop (maxLoopCount) [: loopIndex]
    loopBody

出于安全原因,比特币脚本本身不提供循环结构。 sCrypt 通过重复循环体 maxLoopCount 次来实现循环。例如,循环

loop (10) {
    x = x * 2;
}

等效地展开为

x = x * 2;
x = x * 2;
x = x * 2;
x = x * 2;
x = x * 2;
x = x * 2;
x = x * 2;
x = x * 2;
x = x * 2;
x = x * 2;

因为 循环展开 是在编译时完成的,编译器必须知道 maxLoopCount。也就是说,它必须是一个 编译时常量

如果 maxLoopCount 设置得太小,合约可能无法正常工作。如果 maxLoopCount 设置得太大,生成的脚本会不必要地膨胀,并且执行成本更高。有多种方法可以明智地选择正确的 maxLoopCount。一种方法是模拟链下合约并找到循环次数。另一种方法是利用循环本身的特性。例如,如果循环遍历``sha256`` 散列的每一位,maxLoopCount 就是 256

归纳变量 (Induction Variable)

归纳变量 可以在需要循环索引时定义。

// int[3][4] matrix;
// i & j are induction variables
loop (3) : i {
    // i is the outer loop index
    loop (4) : j {
        // j is the inner loop index
        matrix[i][j] = i + j;
    }
}

条件循环

loop (3) {
    // place condition here
    if (x < 8) {
        x = x * 2;
    }
}

跳出循环

bool done = false;
loop (3) {
    if (!done) {
        x = x * 2;
        if (x >= 8) {
            done = true;
        }
    }
}