循环

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;

Because loop unrolling is done at compile time, the compiler must know maxLoopCount. That is, it must be a compile time constant.

如果 maxLoopCount 设置得太小,合约可能无法正常运行。如果 maxLoopCount 设置得太大,那么生成的脚本大小会不必要地膨胀,增加执行成本。有一些方法可以把 maxLoopCount 的值设置得更合理。其中一个方法是在链下模拟运行合约以找到合理的循环次数。另一种方法是利用循环自身的特征。比如,如果一个循环需要遍历 sha256 哈希值的每个比特,那么 maxLoopCount 就应该设置为 256

Induction variable

Induction variable can be defined when loop index is needed.

// 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;
        }
    }
}