Основная цель использования замыкания в любом языке кодирования — уменьшить количество вычислений, выполняемых во время операций сравнения. А в солидности уменьшение вычислений означает уменьшение газа.
Рассмотрим следующие контракты:
contract shortCircuit1 {
bool flag;
function conditions(int x) external {
bool isEven = x % 2 == 0; // computation 1
bool isNotZero = x != 0; // computation 2
if (isEven && isNotZero) { // computation 3
flag = true;
} else {
flag = false;
}
}
}
contract shortCircuit2 {
bool flag;
function conditions(int x) external {
if (x % 2 == 0 && x != 0) { // 3 computations only if x % 2 == 0 is true, else only 1 computation
flag = true;
} else {
flag = false;
}
}
}
Оба контракта выполняют одинаковые условия, вход в функцию должен быть четным и больше 0. Если условия истинны, то переменная состояния flag
устанавливается в true. Если же предыдущий вызов функции сделал flag
истинным, а следующий вызов не удовлетворяет обоим условиям, то flag
устанавливается в false.
Теперь давайте сосредоточимся на условиях, записанных внутри функций.
короткое замыкание1
вход функции — 0
вычисляет оба условия, а затем выполняет 3-е вычисление, чтобы проверить, истинны ли оба условия.
замыкание2
вход функции — 0
вычисляет второе условие, только если первое условие истинно (короткое замыкание). Таким образом, экономится стоимость вычислений.
Примечание:- Для приведенных примеров разница в газе очень мала. Представьте себе длительное вычисление сравнения (скажем, строк или массивов), в таких случаях разница в газе будет значительной.