# Loop¶

loop (maxLoopCount) [: loopIndex]
loopBody


Bitcoin script does not provide looping constructs natively for security reasons. sCrypt achieves looping by repeating the loop body maxLoopCount times. For example, the loop

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


is equivalently unrolled to

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.

If maxLoopCount is set too small, the contract may not work correctly. If maxLoopCount is set too large, the resulting script is bloated unnecessarily and costs more to execute. There are a number of ways to choose the right maxLoopCount judiciously. One way is to simulate the contract off chain and find the number of loops. Another way is to exploit the characteristics of the looping itself. For example, if a loop iterates over each bit of a sha256 hash, maxLoopCount is 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;
}
}


## Conditional loop¶

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


## break¶

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