diff --git a/beacon-light-client/circom/circuits/is_valid_merkle_branch_out.circom b/beacon-light-client/circom/circuits/is_valid_merkle_branch_out.circom index 52694df67..3424b8ec0 100644 --- a/beacon-light-client/circom/circuits/is_valid_merkle_branch_out.circom +++ b/beacon-light-client/circom/circuits/is_valid_merkle_branch_out.circom @@ -1,8 +1,9 @@ -pragma circom 2.0.3; +pragma circom 2.1.5; include "hash_two.circom"; include "../../../node_modules/circomlib/circuits/comparators.circom"; -include "utils.circom"; +include "./utils/arrays.circom"; +include "./utils/bits.circom"; template IsValidMerkleBranchOut(N) { signal input branch[N][256]; diff --git a/beacon-light-client/circom/circuits/utils/arrays.circom b/beacon-light-client/circom/circuits/utils/arrays.circom new file mode 100644 index 000000000..a4ca83d70 --- /dev/null +++ b/beacon-light-client/circom/circuits/utils/arrays.circom @@ -0,0 +1,54 @@ +pragma circom 2.1.5; + +include "../../../../node_modules/circomlib/circuits/comparators.circom"; +include "../../../../node_modules/circomlib/circuits/bitify.circom"; + +template RangeCheck(n) { + signal input in[3]; + signal output out; + + signal first <== LessThanBitsCheck(64)([in[0], in[1]]); + signal second <== LessThanBitsCheck(64)([in[1], in[2]]); + + out <== first * second; +} + +template Selector(N) { + signal input in[N]; + signal input index; + signal output out; + + signal sums[N + 1]; + sums[0] <== 0; + + component eqs[N]; + + // For each item, check whether its index equals the input index. + for (var i = 0; i < N; i ++) { + eqs[i] = IsEqual(); + eqs[i].in[0] <== i; + eqs[i].in[1] <== index; + + // eqs[i].out is 1 if the index matches. As such, at most one input to + sums[i + 1] <== sums[i] + eqs[i].out * in[i]; + } + + // Returns 0 + 0 + ... + item + out <== sums[N]; +} + +template IsEqualArrays(N) { + signal input in[2][N]; + signal output out; + + signal isEqual[N]; + var counter = 0; + + for(var i = 0; i < N; i++) { + isEqual[i] <== IsEqual()([in[0][i], in[1][i]]); + + counter += isEqual[i]; + } + + out <== IsEqual()([N, counter]); +} diff --git a/beacon-light-client/circom/circuits/utils.circom b/beacon-light-client/circom/circuits/utils/bits.circom similarity index 53% rename from beacon-light-client/circom/circuits/utils.circom rename to beacon-light-client/circom/circuits/utils/bits.circom index 9a0cf2d01..691208f19 100644 --- a/beacon-light-client/circom/circuits/utils.circom +++ b/beacon-light-client/circom/circuits/utils/bits.circom @@ -1,3 +1,4 @@ + pragma circom 2.1.5; include "../../../node_modules/circomlib/circuits/comparators.circom"; @@ -23,30 +24,4 @@ template LessThanOrEqualBitsCheck(n) { signal bitCheck2[n] <== Num2Bits(n)(in[1]); out <== LessEqThan(n)(in); -} - -template RangeCheck(n) { - signal input in[3]; - signal output out; - - signal first <== LessThanBitsCheck(64)([in[0], in[1]]); - signal second <== LessThanBitsCheck(64)([in[1], in[2]]); - - out <== first * second; -} - -template IsEqualArrays(N) { - signal input in[2][N]; - signal output out; - - signal isEqual[N]; - var counter = 0; - - for(var i = 0; i < N; i++) { - isEqual[i] <== IsEqual()([in[0][i], in[1][i]]); - - counter += isEqual[i]; - } - - out <== IsEqual()([N, counter]); -} +} \ No newline at end of file diff --git a/beacon-light-client/circom/circuits/utils/numerical.circom b/beacon-light-client/circom/circuits/utils/numerical.circom new file mode 100644 index 000000000..765997fa3 --- /dev/null +++ b/beacon-light-client/circom/circuits/utils/numerical.circom @@ -0,0 +1,10 @@ +pragma circom 2.1.5; + +template DivisionVerification() { + signal input dividend; + signal input divisor; + signal input quotient; + signal input remainder; + + dividend === divisor * quotient + remainder; +} \ No newline at end of file diff --git a/beacon-light-client/circom/circuits/validator_balances.circom b/beacon-light-client/circom/circuits/validator_balances.circom index 402e542d4..1c3a70982 100644 --- a/beacon-light-client/circom/circuits/validator_balances.circom +++ b/beacon-light-client/circom/circuits/validator_balances.circom @@ -8,39 +8,8 @@ include "validator_hash_tree_root.circom"; include "is_valid_merkle_branch_out.circom"; include "is_valid_merkle_branch.circom"; include "ssz_num.circom"; - -template DivisionVerification() { - signal input dividend; - signal input divisor; - signal input quotient; - signal input remainder; - - dividend === divisor * quotient + remainder; -} - -template Selector(N) { - signal input in[N]; - signal input index; - signal output out; - - signal sums[N + 1]; - sums[0] <== 0; - - component eqs[N]; - - // For each item, check whether its index equals the input index. - for (var i = 0; i < N; i ++) { - eqs[i] = IsEqual(); - eqs[i].in[0] <== i; - eqs[i].in[1] <== index; - - // eqs[i].out is 1 if the index matches. As such, at most one input to - sums[i + 1] <== sums[i] + eqs[i].out * in[i]; - } - - // Returns 0 + 0 + ... + item - out <== sums[N]; -} +include "./utils/arrays.circom"; +include "./utils/numerical.circom"; template CalculateBalancesSum(N) { signal input balances[(N \ 4) + 1][256]; @@ -118,6 +87,7 @@ template ValidatorBalances(N) { signal currentEpoch <-- slot \ 32; + signal epochHighestSlot <== currentEpoch * 32; signal slotLessThan <== LessThanBitsCheck(64)([slot, epochHighestSlot]);