Skip to content

Commit a6ebd41

Browse files
committed
perf: cache verifiers to eliminate duplicate Idemix proofs
Signed-off-by: AkramBitar <akram@il.ibm.com>
1 parent 57b15b2 commit a6ebd41

1 file changed

Lines changed: 20 additions & 5 deletions

File tree

token/core/zkatdlog/nogh/v1/validator/validator_transfer.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ func TransferSignatureValidate(c context.Context, ctx *Context) error {
3636
return ErrInvalidInputs
3737
}
3838

39+
// Cache verifiers within this transaction to avoid redundant verifyProof() calls
40+
// for inputs with the same owner identity
41+
verifierCache := make(map[string]driver.Verifier)
42+
3943
var isRedeem bool
4044
var inputToken []*token.Token
4145
for i, in := range ctx.TransferAction.Inputs {
@@ -44,10 +48,19 @@ func TransferSignatureValidate(c context.Context, ctx *Context) error {
4448

4549
// check sender signature
4650
ctx.Logger.Debugf("check sender [%d][%s]", i, driver.Identity(tok.Owner).UniqueID())
47-
verifier, err := ctx.Deserializer.GetOwnerVerifier(c, tok.Owner)
48-
if err != nil {
49-
return errors.Wrapf(err, "failed deserializing owner [%d][%v][%s]", i, in, driver.Identity(tok.Owner))
51+
52+
// Check cache first to avoid redundant expensive verifyProof() calls
53+
ownerKey := driver.Identity(tok.Owner).UniqueID()
54+
verifier, cached := verifierCache[ownerKey]
55+
if !cached {
56+
var err error
57+
verifier, err = ctx.Deserializer.GetOwnerVerifier(c, tok.Owner)
58+
if err != nil {
59+
return errors.Wrapf(err, "failed deserializing owner [%d][%v][%s]", i, in, driver.Identity(tok.Owner))
60+
}
61+
verifierCache[ownerKey] = verifier
5062
}
63+
5164
ctx.Logger.Debugf("signature verification [%d][%v][%s]", i, in, driver.Identity(tok.Owner).UniqueID())
5265
sigma, err := ctx.SignatureProvider.HasBeenSignedBy(c, tok.Owner, verifier)
5366
if err != nil {
@@ -132,10 +145,12 @@ func TransferZKProofValidate(c context.Context, ctx *Context) error {
132145
in[i] = tok.Data
133146
}
134147

135-
if err := transfer.NewVerifier(
148+
err := transfer.NewVerifier(
136149
in,
137150
ctx.TransferAction.GetOutputCommitments(),
138-
ctx.PP).Verify(ctx.TransferAction.GetProof()); err != nil {
151+
ctx.PP).Verify(ctx.TransferAction.GetProof())
152+
153+
if err != nil {
139154
return errors.Join(err, ErrInvalidZKP)
140155
}
141156

0 commit comments

Comments
 (0)