From d9563d129ba69751e1ec00caa65b3f9c2248e9ff Mon Sep 17 00:00:00 2001 From: Oleksandr Brezhniev Date: Mon, 4 Dec 2023 14:51:51 +0000 Subject: [PATCH] Move common code for processing query and modifiers on claim to a separate template --- .../query/processQueryWithModifiers.circom | 88 +++++++++++++++++++ circuits/linked/multiQuery.circom | 80 ++++------------- .../credentialAtomicQueryV3OffChain.circom | 55 ++++-------- 3 files changed, 120 insertions(+), 103 deletions(-) create mode 100644 circuits/lib/query/processQueryWithModifiers.circom diff --git a/circuits/lib/query/processQueryWithModifiers.circom b/circuits/lib/query/processQueryWithModifiers.circom new file mode 100644 index 00000000..5e39c0e4 --- /dev/null +++ b/circuits/lib/query/processQueryWithModifiers.circom @@ -0,0 +1,88 @@ +pragma circom 2.1.1; + +include "../../../node_modules/circomlib/circuits/comparators.circom"; +include "query.circom"; +include "modifiers.circom"; +include "../utils/claimUtils.circom"; + +template ProcessQueryWithModifiers(claimLevels, valueArraySize){ + signal input claimPathNotExists; // 0 for inclusion, 1 for non-inclusion + signal input claimPathMtp[claimLevels]; + signal input claimPathMtpNoAux; // 1 if aux node is empty, 0 if non-empty or for inclusion proofs + signal input claimPathMtpAuxHi; // 0 for inclusion proof + signal input claimPathMtpAuxHv; // 0 for inclusion proof + signal input claimPathKey; // hash of path in merklized json-ld document + signal input claimPathValue; // value in this path in merklized json-ld document + signal input slotIndex; + signal input operator; + signal input value[valueArraySize]; + + signal input issuerClaim[8]; + signal input merklized; + signal input merklizedRoot; + + // Modifier/Computation Operator output ($sd) + signal output operatorOutput; + + // check path/in node exists in merkletree specified by jsonldRoot + SMTVerifier(claimLevels)( + enabled <== merklized, // if merklize flag 0 skip MTP verification + fnc <== claimPathNotExists, // inclusion + root <== merklizedRoot, + siblings <== claimPathMtp, + oldKey <== claimPathMtpAuxHi, + oldValue <== claimPathMtpAuxHv, + isOld0 <== claimPathMtpNoAux, + key <== claimPathKey, + value <== claimPathValue + ); // 9585 constraints + + // select value from claim by slot index (0-7) + signal slotValue <== getValueByIndex()(issuerClaim, slotIndex); + + // select value for query verification, + // if claim is merklized merklizeFlag = `1|2`, take claimPathValue + // if not merklized merklizeFlag = `0`, take value from selected slot + signal fieldValue <== Mux1()( + [slotValue, claimPathValue], + merklized + ); + + ///////////////////////////////////////////////////////////////// + // Query Operator Processing + ///////////////////////////////////////////////////////////////// + + // verify query + // 1756 constraints (Query+LessThan+ForceEqualIfEnabled) + signal querySatisfied <== Query(valueArraySize)( + in <== fieldValue, + value <== value, + operator <== operator + ); + + signal isQueryOp <== LessThan(5)([operator, 16]); + ForceEqualIfEnabled()( + isQueryOp, + [querySatisfied, 1] + ); + + ///////////////////////////////////////////////////////////////// + // Modifier/Computation Operators Processing + ///////////////////////////////////////////////////////////////// + + // selective disclosure + // no need to calc anything, fieldValue is just passed as an output + + ///////////////////////////////////////////////////////////////// + // Modifier Operator Validation & Output Preparation + ///////////////////////////////////////////////////////////////// + + // output value only if modifier operation was selected + operatorOutput <== modifierValidatorOutputSelector()( + operator <== operator, + modifierOutputs <== [ + fieldValue, // 16 - selective disclosure (16-16 = index 0) + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 17-31 - not used + ] + ); +} \ No newline at end of file diff --git a/circuits/linked/multiQuery.circom b/circuits/linked/multiQuery.circom index 8c4e34f5..d3c83967 100644 --- a/circuits/linked/multiQuery.circom +++ b/circuits/linked/multiQuery.circom @@ -1,8 +1,7 @@ pragma circom 2.1.5; include "../../node_modules/circomlib/circuits/comparators.circom"; -include "../lib/query/query.circom"; -include "../lib/query/modifiers.circom"; +include "../lib/query/processQueryWithModifiers.circom"; include "../lib/linked/linkId.circom"; include "../lib/utils/claimUtils.circom"; include "../lib/utils/safeOne.circom"; @@ -66,70 +65,21 @@ template LinkedMultiQuery(N, claimLevels, valueArraySize) { ///////////////////////////////////////////////////////////////// for (var i=0; i