循环¶
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;
}
}
}