Skip to content

Commit f575cd6

Browse files
volodymyr-basiukKolezhniukCopilot
authored
feat: trusted setup v3 without auth (#96)
* Add trusted setup v3 circuits Co-authored-by: Kolezhniuk <dmytro.k@privado.id> Co-authored-by: Dimasik <D.Kolezhiniyk@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 6663fb5 commit f575cd6

File tree

8 files changed

+770
-69
lines changed

8 files changed

+770
-69
lines changed

circuits.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ const (
5050
SybilSigCircuitID CircuitID = "sybilCredentialAtomicSig"
5151
// LinkedMultiQuery10CircuitID is a type for linkedMultiQuery10.circom
5252
LinkedMultiQuery10CircuitID CircuitID = "linkedMultiQuery10-beta.1"
53+
// AtomicQueryV3StableCircuitID is a type for credentialAtomicQueryV3.circom stable version
54+
AtomicQueryV3StableCircuitID CircuitID = "credentialAtomicQueryV3"
55+
// AtomicQueryV3OnChainStableCircuitID is a type for credentialAtomicQueryV3OnChain.circom stable version
56+
AtomicQueryV3OnChainStableCircuitID CircuitID = "credentialAtomicQueryV3OnChain"
57+
// LinkedMultiQueryStableCircuitID is a type for linkedMultiQuery.circom stable version
58+
LinkedMultiQueryStableCircuitID CircuitID = "linkedMultiQuery"
5359
)
5460

5561
// ErrorCircuitIDNotFound returns if CircuitID is not registered
@@ -141,6 +147,34 @@ func init() {
141147
Input: AtomicQueryV3OnChainInputs{},
142148
Output: &AtomicQueryV3OnChainPubSignals{},
143149
})
150+
151+
RegisterCircuit(AtomicQueryV3StableCircuitID, Data{
152+
Input: AtomicQueryV3Inputs{},
153+
Output: &AtomicQueryV3PubSignals{},
154+
})
155+
156+
RegisterCircuit(AtomicQueryV3OnChainStableCircuitID, Data{
157+
Input: AtomicQueryV3OnChainInputs{},
158+
Output: &AtomicQueryV3OnChainPubSignals{},
159+
})
160+
161+
RegisterCircuit(LinkedMultiQuery10CircuitID, Data{
162+
Input: LinkedMultiQueryInputs{
163+
QueryLength: LinkedMultiQueryLength,
164+
},
165+
Output: &LinkedMultiQueryPubSignals{
166+
QueryLength: LinkedMultiQueryLength,
167+
},
168+
})
169+
170+
RegisterCircuit(LinkedMultiQueryStableCircuitID, Data{
171+
Input: LinkedMultiQueryInputs{
172+
QueryLength: LinkedMultiQueryLength,
173+
},
174+
Output: &LinkedMultiQueryPubSignals{
175+
QueryLength: LinkedMultiQueryLength,
176+
},
177+
})
144178
}
145179

146180
// BaseConfig base circuit's config, provides default configuration for default circuits

errors.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ const (
3131
ErrorInvalidValuesArrSize = "invalid query Values array size"
3232
ErrorEmptyStateHash = "empty state hash"
3333
ErrorUserProfileMismatch = "profile DID derived from genesis does not match the credential subject or incorrect profile nonce"
34+
ErrorNoCircuitsValidatorEntry = "no circuits validator entry found for the given circuit ID"
3435
)

linkedMultiQuery.go

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,19 @@ import (
1111
"github.com/pkg/errors"
1212
)
1313

14+
// LinkedMultiQueryLength constant for linkedMultiQuery.circom
1415
const LinkedMultiQueryLength = 10
1516

16-
// LinkedMultiQueryInputs type represent linkedMultiQuery10.circom inputs
17+
// LinkedMultiQueryInputs type represent linkedMultiQuery.circom inputs
1718
type LinkedMultiQueryInputs struct {
1819
BaseConfig
19-
LinkNonce *big.Int
20-
Claim *core.Claim
21-
Query []*Query
20+
QueryLength int
21+
LinkNonce *big.Int
22+
Claim *core.Claim
23+
Query []*Query
2224
}
2325

24-
// linkedMultiQueryCircuitInputs type reflect linkedMultiQuery10.circom private inputs required by prover
26+
// linkedMultiQueryCircuitInputs type reflect linkedMultiQuery.circom private inputs required by prover
2527
type linkedMultiQueryCircuitInputs struct {
2628
LinkNonce string `json:"linkNonce"`
2729
IssuerClaim *core.Claim `json:"issuerClaim"`
@@ -39,6 +41,10 @@ type linkedMultiQueryCircuitInputs struct {
3941
}
4042

4143
func (l LinkedMultiQueryInputs) Validate() error {
44+
if l.QueryLength == 0 {
45+
l.QueryLength = LinkedMultiQueryLength
46+
}
47+
4248
if l.LinkNonce == nil {
4349
return errors.New(ErrorEmptyLinkNonce)
4450
}
@@ -51,7 +57,7 @@ func (l LinkedMultiQueryInputs) Validate() error {
5157
return errors.New(ErrorEmptyQueries)
5258
}
5359

54-
if len(l.Query) > LinkedMultiQueryLength {
60+
if len(l.Query) > l.QueryLength {
5561
return errors.New(ErrorTooManyQueries)
5662
}
5763

@@ -67,8 +73,12 @@ func (l LinkedMultiQueryInputs) Validate() error {
6773
return nil
6874
}
6975

70-
// InputsMarshal returns Circom private inputs for linkedMultiQuery10.circom
76+
// InputsMarshal returns Circom private inputs for linkedMultiQuery.circom
7177
func (l LinkedMultiQueryInputs) InputsMarshal() ([]byte, error) {
78+
if l.QueryLength == 0 {
79+
l.QueryLength = LinkedMultiQueryLength
80+
}
81+
7282
if err := l.Validate(); err != nil {
7383
return nil, err
7484
}
@@ -78,18 +88,17 @@ func (l LinkedMultiQueryInputs) InputsMarshal() ([]byte, error) {
7888
s.IssuerClaim = l.Claim
7989
s.ClaimSchema = l.Claim.GetSchemaHash().BigInt().String()
8090

81-
s.ClaimPathMtp = make([][]string, LinkedMultiQueryLength)
82-
s.ClaimPathMtpNoAux = make([]string, LinkedMultiQueryLength)
83-
s.ClaimPathMtpAuxHi = make([]*merkletree.Hash, LinkedMultiQueryLength)
84-
s.ClaimPathMtpAuxHv = make([]*merkletree.Hash, LinkedMultiQueryLength)
85-
s.ClaimPathKey = make([]string, LinkedMultiQueryLength)
86-
s.ClaimPathValue = make([]string, LinkedMultiQueryLength)
87-
s.SlotIndex = make([]int, LinkedMultiQueryLength)
88-
s.Operator = make([]int, LinkedMultiQueryLength)
89-
s.Value = make([][]string, LinkedMultiQueryLength)
90-
s.ActualValueArraySize = make([]int, LinkedMultiQueryLength)
91-
92-
for i := 0; i < LinkedMultiQueryLength; i++ {
91+
s.ClaimPathMtp = make([][]string, l.QueryLength)
92+
s.ClaimPathMtpNoAux = make([]string, l.QueryLength)
93+
s.ClaimPathMtpAuxHi = make([]*merkletree.Hash, l.QueryLength)
94+
s.ClaimPathMtpAuxHv = make([]*merkletree.Hash, l.QueryLength)
95+
s.ClaimPathKey = make([]string, l.QueryLength)
96+
s.ClaimPathValue = make([]string, l.QueryLength)
97+
s.SlotIndex = make([]int, l.QueryLength)
98+
s.Operator = make([]int, l.QueryLength)
99+
s.Value = make([][]string, l.QueryLength)
100+
s.ActualValueArraySize = make([]int, l.QueryLength)
101+
for i := 0; i < l.QueryLength; i++ {
93102
if i >= len(l.Query) || l.Query[i] == nil {
94103
s.ClaimPathMtp[i] = PrepareSiblingsStr([]*merkletree.Hash{}, l.GetMTLevelsClaim())
95104

@@ -144,23 +153,28 @@ func (l LinkedMultiQueryInputs) InputsMarshal() ([]byte, error) {
144153
return json.Marshal(s)
145154
}
146155

147-
// LinkedMultiQueryPubSignals linkedMultiQuery10.circom public signals
156+
// LinkedMultiQueryPubSignals linkedMultiQuery.circom public signals
148157
type LinkedMultiQueryPubSignals struct {
149158
LinkID *big.Int `json:"linkID"`
150159
Merklized int `json:"merklized"`
151160
OperatorOutput []*big.Int `json:"operatorOutput"`
152161
CircuitQueryHash []*big.Int `json:"circuitQueryHash"`
162+
QueryLength int
153163
}
154164

155-
// PubSignalsUnmarshal unmarshal linkedMultiQuery10.circom public inputs to LinkedMultiQueryPubSignals
165+
// PubSignalsUnmarshal unmarshal linkedMultiQuery.circom public inputs to LinkedMultiQueryPubSignals
156166
func (lo *LinkedMultiQueryPubSignals) PubSignalsUnmarshal(data []byte) error {
157167
// expected order:
158168
// linkID
159169
// merklized
160170
// operatorOutput
161171
// circuitQueryHash
162172

163-
outputsLength := LinkedMultiQueryLength*2 + 2
173+
if lo.QueryLength == 0 {
174+
lo.QueryLength = LinkedMultiQueryLength
175+
}
176+
177+
outputsLength := lo.QueryLength*2 + 2
164178
var sVals []string
165179
err := json.Unmarshal(data, &sVals)
166180
if err != nil {
@@ -187,16 +201,16 @@ func (lo *LinkedMultiQueryPubSignals) PubSignalsUnmarshal(data []byte) error {
187201
fieldIdx++
188202

189203
// -- operatorOutput
190-
lo.OperatorOutput = make([]*big.Int, LinkedMultiQueryLength)
191-
for i := 0; i < LinkedMultiQueryLength; i++ {
204+
lo.OperatorOutput = make([]*big.Int, lo.QueryLength)
205+
for i := 0; i < lo.QueryLength; i++ {
192206
if lo.OperatorOutput[i], ok = big.NewInt(0).SetString(sVals[fieldIdx], 10); !ok {
193207
return fmt.Errorf("invalid operator output value: '%s'", sVals[fieldIdx])
194208
}
195209
fieldIdx++
196210
}
197211
// -- circuitQueryHash
198-
lo.CircuitQueryHash = make([]*big.Int, LinkedMultiQueryLength)
199-
for i := 0; i < LinkedMultiQueryLength; i++ {
212+
lo.CircuitQueryHash = make([]*big.Int, lo.QueryLength)
213+
for i := 0; i < lo.QueryLength; i++ {
200214
if lo.CircuitQueryHash[i], ok = big.NewInt(0).SetString(sVals[fieldIdx], 10); !ok {
201215
return fmt.Errorf("invalid query hash value: '%s'", sVals[fieldIdx])
202216
}

linkedMultiQuery_test.go

Lines changed: 80 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"fmt"
66
"math/big"
7+
"strconv"
78
"testing"
89

910
it "github.com/iden3/go-circuits/v2/testing"
@@ -137,60 +138,96 @@ func TestLinkedMultiQueryInputs_PrepareInputs_Error(t *testing.T) {
137138
}
138139

139140
func TestLinkedMultiQueryPubSignals_CircuitUnmarshal(t *testing.T) {
140-
out := new(LinkedMultiQueryPubSignals)
141-
err := out.PubSignalsUnmarshal([]byte(
142-
`[
143-
"443",
144-
"1",
141+
outs := map[int][]string{
142+
3: {
143+
"11587660915189382633314527098062647837126752531205087409048618395969242885016",
144+
"0",
145+
"0",
146+
"0",
147+
"0",
148+
"9458417390459068300741864705379630488534450155484493792325907355745201035449",
149+
"10864698602219511323750171112812294233505545576258213541845435681330532958075",
150+
"5365138871441717895206514697230448654236988235704905467582456422975445794731",
151+
},
152+
5: {
153+
"20336008450539684768013573494073798243349685857640613070314041678185349736439",
145154
"1",
146-
"2",
147-
"3",
148-
"4",
149-
"5",
150155
"0",
151156
"0",
152157
"0",
153158
"0",
154159
"0",
155-
"100",
156-
"200",
157-
"300",
158-
"400",
159-
"500",
160+
"3326382892536126749483088946048689911243394580824744244053752370464747528203",
161+
"9907132056133666096701539062450765284880813426582692863734448403438789333698",
162+
"13362042977965885903820557513534065802896288300017199700677633721405805677442",
163+
"13362042977965885903820557513534065802896288300017199700677633721405805677442",
164+
"13362042977965885903820557513534065802896288300017199700677633721405805677442",
165+
},
166+
10: {
167+
"11587660915189382633314527098062647837126752531205087409048618395969242885016",
160168
"0",
161169
"0",
162170
"0",
163171
"0",
164-
"0"
165-
]`))
166-
require.NoError(t, err)
167-
168-
operatorOutput := make([]*big.Int, 10)
169-
circuitQueryHash := make([]*big.Int, 10)
170-
valueArrSize := make([]int, 10)
171-
for i := 1; i <= 10; i++ {
172-
indx := i - 1
173-
operatorOutput[indx] = big.NewInt((int64(i)))
174-
circuitQueryHash[indx] = big.NewInt(int64(i * 100))
175-
valueArrSize[indx] = 1
176-
if i > 5 {
177-
operatorOutput[indx] = big.NewInt(0)
178-
circuitQueryHash[indx] = big.NewInt(0)
179-
valueArrSize[indx] = 0
180-
}
172+
"0",
173+
"0",
174+
"0",
175+
"0",
176+
"0",
177+
"0",
178+
"0",
179+
"9458417390459068300741864705379630488534450155484493792325907355745201035449",
180+
"10864698602219511323750171112812294233505545576258213541845435681330532958075",
181+
"5365138871441717895206514697230448654236988235704905467582456422975445794731",
182+
"6552534440600411908158043655342660449140617599402291128616319085888035740680",
183+
"6552534440600411908158043655342660449140617599402291128616319085888035740680",
184+
"6552534440600411908158043655342660449140617599402291128616319085888035740680",
185+
"6552534440600411908158043655342660449140617599402291128616319085888035740680",
186+
"6552534440600411908158043655342660449140617599402291128616319085888035740680",
187+
"6552534440600411908158043655342660449140617599402291128616319085888035740680",
188+
"6552534440600411908158043655342660449140617599402291128616319085888035740680",
189+
},
181190
}
182191

183-
exp := LinkedMultiQueryPubSignals{
184-
LinkID: big.NewInt(443),
185-
Merklized: 1,
186-
OperatorOutput: operatorOutput,
187-
CircuitQueryHash: circuitQueryHash,
192+
for queriesCount, out := range outs {
193+
t.Run(fmt.Sprintf("LinkedMultiQueryPubSignals_CircuitUnmarshal_%d", queriesCount), func(t *testing.T) {
194+
ao := &LinkedMultiQueryPubSignals{
195+
QueryLength: queriesCount,
196+
}
197+
198+
jsonData, err := json.Marshal(out)
199+
require.NoError(t, err)
200+
201+
err = ao.PubSignalsUnmarshal(jsonData)
202+
require.NoError(t, err)
203+
204+
// Check linkID (out[0])
205+
expectedLinkID, ok := big.NewInt(0).SetString(out[0], 10)
206+
require.True(t, ok, "failed to parse linkID")
207+
require.Equal(t, expectedLinkID, ao.LinkID)
208+
209+
// Check merklized (out[1])
210+
expectedMerklized, err := strconv.Atoi(out[1])
211+
require.NoError(t, err)
212+
require.Equal(t, expectedMerklized, ao.Merklized)
213+
214+
// Check operatorOutput (out.slice(2, 2 + queriesCount))
215+
expectedOperatorOutput := make([]*big.Int, queriesCount)
216+
for i := 0; i < queriesCount; i++ {
217+
val, ok := big.NewInt(0).SetString(out[2+i], 10)
218+
require.True(t, ok, fmt.Sprintf("failed to parse operatorOutput[%d]", i))
219+
expectedOperatorOutput[i] = val
220+
}
221+
require.Equal(t, expectedOperatorOutput, ao.OperatorOutput)
222+
223+
// Check circuitQueryHash (out.slice(2 + queriesCount, 2 + queriesCount * 2))
224+
expectedCircuitQueryHash := make([]*big.Int, queriesCount)
225+
for i := 0; i < queriesCount; i++ {
226+
val, ok := big.NewInt(0).SetString(out[2+queriesCount+i], 10)
227+
require.True(t, ok, fmt.Sprintf("failed to parse circuitQueryHash[%d]", i))
228+
expectedCircuitQueryHash[i] = val
229+
}
230+
require.Equal(t, expectedCircuitQueryHash, ao.CircuitQueryHash)
231+
})
188232
}
189-
190-
jsonOut, err := json.Marshal(out)
191-
require.NoError(t, err)
192-
jsonExp, err := json.Marshal(exp)
193-
require.NoError(t, err)
194-
195-
require.JSONEq(t, string(jsonExp), string(jsonOut))
196233
}

0 commit comments

Comments
 (0)