Skip to content

Commit bedc4d7

Browse files
committed
Separated ZK and Service
Signed-off-by: Effi-S <effi.szt@gmail.com>
1 parent 1d8758b commit bedc4d7

11 files changed

Lines changed: 620 additions & 38 deletions

File tree

token/core/zkatdlog/nogh/v1/validator/bench/transfer_service/client/main.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,30 @@
22
Copyright IBM Corp All Rights Reserved.
33
44
SPDX-License-Identifier: Apache-2.0
5+
6+
7+
The Flow
8+
Client Server
9+
────── ──────
10+
1. Load proof data from disk
11+
(pub params + token request)
12+
13+
2. JSON-serialize params 3. Receive gRPC request
14+
(includes WireProofData) ──gRPC──► with name="zkp"
15+
16+
4. TransferServiceViewFactory.NewView(jsonBytes)
17+
→ deserialize WireProofData → ProofData
18+
→ create token.Validator from public params
19+
20+
5. TransferServiceView.Call()
21+
→ validator.UnmarshallAndVerifyWithMetadata(...)
22+
(full pipeline: auditing, signatures, ZK proofs,
23+
HTLC, upgrade witnesses, metadata checks)
24+
25+
6. Receive response ◄──── 7. Return result (nil, nil) on success
26+
Record latency/throughput
27+
28+
529
*/
630

731
package main

token/core/zkatdlog/nogh/v1/validator/bench/transfer_service/out/cmd/test-node/main.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ package main
88

99
import (
1010
fscnode "github.com/hyperledger-labs/fabric-smart-client/node"
11-
12-
1311
)
1412

1513
func main() {

token/core/zkatdlog/nogh/v1/validator/bench/transfer_service/transfer_service_bench.go

Lines changed: 64 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ SPDX-License-Identifier: Apache-2.0
77
package bench
88

99
import (
10+
"context"
1011
"encoding/base64"
1112
"encoding/json"
1213
"errors"
@@ -17,10 +18,12 @@ import (
1718
"strconv"
1819
"strings"
1920

20-
math "github.com/IBM/mathlib"
2121
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
22-
"github.com/hyperledger-labs/fabric-token-sdk/token/core/zkatdlog/nogh/v1/transfer"
23-
"github.com/hyperledger-labs/fabric-token-sdk/token/driver"
22+
"github.com/hyperledger-labs/fabric-token-sdk/token"
23+
"github.com/hyperledger-labs/fabric-token-sdk/token/core"
24+
fabtoken "github.com/hyperledger-labs/fabric-token-sdk/token/core/fabtoken/v1/driver"
25+
dlog "github.com/hyperledger-labs/fabric-token-sdk/token/core/zkatdlog/nogh/v1/driver"
26+
tk "github.com/hyperledger-labs/fabric-token-sdk/token/token"
2427
)
2528

2629
const (
@@ -108,43 +111,64 @@ func newTokenTransferVerifyParams(outputPath string,
108111
}
109112
}
110113

114+
type fakeLedger struct{}
115+
116+
func (*fakeLedger) GetState(_ tk.ID) ([]byte, error) {
117+
panic("not implemented")
118+
}
119+
120+
func newTokenValidator(ppRaw []byte) (*token.Validator, error) {
121+
is := core.NewPPManagerFactoryService(fabtoken.NewPPMFactory(), dlog.NewPPMFactory())
122+
ppm, err := is.PublicParametersFromBytes(ppRaw)
123+
if err != nil {
124+
return nil, fmt.Errorf("failed to deserialize public parameters: %w", err)
125+
}
126+
v, err := is.DefaultValidator(ppm)
127+
if err != nil {
128+
return nil, fmt.Errorf("failed to create default validator: %w", err)
129+
}
130+
return token.NewValidator(v), nil
131+
}
132+
111133
type TransferServiceView struct {
112-
params trandferServiceParams
113-
proof *ProofData
134+
params trandferServiceParams
135+
proof *ProofData
136+
validator *token.Validator
114137
}
115138

116-
// Call deserializes a token request, extracts its transfer actions,
117-
// and verifies each ZK proof.
118-
// To reflect token/core/zkatdlog/nogh/v1/transfer.go VerifyTransfer
139+
// Call runs the full token request validation pipeline matching the
140+
// regression test's UnmarshallAndVerifyWithMetadata path: auditing,
141+
// signatures, ZK proofs, HTLC, upgrade witnesses, and metadata checks.
142+
// Call Chain:
143+
// 1. token.Validator.UnmarshallAndVerifyWithMetadata -> driver.Validator.VerifyTokenRequestFromRaw
144+
// 2. VerifyTokenRequestFromRaw (from token/core/common/validator.go)
145+
// - deserializes the raw bytes into a TokenRequest, prepares signed message + signatures
146+
// - calls VerifyTokenRequest
147+
// 3. VerifyTokenRequest runs three stages:
148+
// - Auditing validation (VerifyAuditing) [verifies auditor signatures]
149+
// - Issue validation (verifyIssues) [verifies issue actions]
150+
// - Transfer validation (verifyTransfers):
151+
// a. TransferActionValidate [action.Validate()]
152+
// b. TransferSignatureValidate [verifies sender signatures (deserializes owner identity, checks signature)]
153+
// c. TransferUpgradeWitnessValidate
154+
// d. TransferZKProofValidate [transfer.NewVerifier(in, outputCommitments, pp).Verify(proof)]
155+
// e. TransferHTLCValidate
156+
// f. TransferApplicationDataValidate [validates metadata]
157+
// 4. After all validators pass, it checks that all metadata have been validated
158+
119159
func (q *TransferServiceView) Call(viewCtx view.Context) (interface{}, error) {
120160
if q.proof == nil {
121161
return nil, errors.New("proof data is nil")
122162
}
123163

124-
tr := &driver.TokenRequest{}
125-
if err := tr.FromBytes(q.proof.TokenRequestRaw); err != nil {
126-
return nil, fmt.Errorf("failed to deserialize token request: %w", err)
127-
}
128-
129-
pp := q.proof.PubParams
130-
for _, raw := range tr.Transfers {
131-
action := &transfer.Action{}
132-
if err := action.Deserialize(raw); err != nil {
133-
return nil, fmt.Errorf("failed to deserialize transfer action: %w", err)
134-
}
135-
if err := action.Validate(); err != nil {
136-
return nil, fmt.Errorf("invalid transfer action: %w", err)
137-
}
138-
139-
inputTokens := action.InputTokens()
140-
in := make([]*math.G1, len(inputTokens))
141-
for i, tok := range inputTokens {
142-
in[i] = tok.Data
143-
}
144-
145-
if err := transfer.NewVerifier(in, action.GetOutputCommitments(), pp).Verify(action.GetProof()); err != nil {
146-
return nil, fmt.Errorf("failed to verify transfer proof: %w", err)
147-
}
164+
_, _, err := q.validator.UnmarshallAndVerifyWithMetadata(
165+
context.Background(),
166+
&fakeLedger{},
167+
token.RequestAnchor(q.proof.TxID),
168+
q.proof.TokenRequestRaw,
169+
)
170+
if err != nil {
171+
return nil, fmt.Errorf("failed to verify token request: %w", err)
148172
}
149173

150174
return nil, nil
@@ -160,15 +184,19 @@ func (c *TransferServiceViewFactory) NewView(in []byte) (view.View, error) {
160184
if err := json.Unmarshal(in, &f.params); err != nil {
161185
return nil, err
162186
}
163-
var proof *ProofData
164187
if f.params.Proof != nil {
165-
var err error
166-
proof, err = f.params.Proof.Deserialize()
188+
proof, err := f.params.Proof.Deserialize()
167189
if err != nil {
168190
return nil, fmt.Errorf("failed to unmarshal wire proof: %w", err)
169191
}
192+
f.proof = proof
193+
194+
v, err := newTokenValidator(f.params.Proof.PubParamsRaw)
195+
if err != nil {
196+
return nil, fmt.Errorf("failed to create token validator: %w", err)
197+
}
198+
f.validator = v
170199
}
171-
f.proof = proof
172200

173201
return f, nil
174202
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
Copyright IBM Corp All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
package bench
7+
8+
import (
9+
"path"
10+
"testing"
11+
12+
"github.com/hyperledger-labs/fabric-smart-client/integration/benchmark/node"
13+
viewregistry "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/view"
14+
"github.com/stretchr/testify/require"
15+
)
16+
17+
func BenchmarkAPI(b *testing.B) {
18+
testdataPath := b.TempDir()
19+
nodeConfPath := path.Join(testdataPath, "fsc", "nodes", "test-node.0")
20+
21+
err := node.GenerateConfig(testdataPath)
22+
require.NoError(b, err)
23+
24+
n, err := node.SetupNode(nodeConfPath, node.NamedFactory{
25+
Name: "zkp",
26+
Factory: &TransferZKViewFactory{},
27+
})
28+
require.NoError(b, err)
29+
defer n.Stop()
30+
31+
vm, err := viewregistry.GetManager(n)
32+
require.NoError(b, err)
33+
34+
wl := node.Workload{
35+
Name: "zkp",
36+
Factory: &TransferZKViewFactory{},
37+
Params: NewTokenTransferVerifyParamsSlice("")[0],
38+
}
39+
40+
b.ResetTimer()
41+
node.RunAPIBenchmark(b, vm, wl)
42+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
Copyright IBM Corp All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package bench
8+
9+
import (
10+
"path"
11+
"testing"
12+
13+
"github.com/hyperledger-labs/fabric-smart-client/integration/benchmark/node"
14+
"github.com/stretchr/testify/require"
15+
"google.golang.org/grpc/benchmark/flags"
16+
)
17+
18+
var numConn = flags.IntSlice("numConn", []int{1, 2, 4, 8}, "Number of grpc client connections - may be a comma-separated list")
19+
20+
// BenchmarkAPIGRPC exercises the ViewAPI via grpc client.
21+
// The proof is pre-computed and embedded in the workload params so every
22+
// gRPC request carries it.
23+
func BenchmarkAPIGRPC(b *testing.B) {
24+
testdataPath := b.TempDir()
25+
nodeConfPath := path.Join(testdataPath, "fsc", "nodes", "test-node.0")
26+
clientConfPath := path.Join(nodeConfPath, "client-config.yaml")
27+
28+
err := node.GenerateConfig(testdataPath)
29+
require.NoError(b, err)
30+
31+
n, err := node.SetupNode(nodeConfPath, node.NamedFactory{
32+
Name: "zkp",
33+
Factory: &TransferZKViewFactory{},
34+
})
35+
36+
require.NoError(b, err)
37+
defer n.Stop()
38+
39+
wl := node.Workload{
40+
Name: "zkp",
41+
Factory: &TransferZKViewFactory{},
42+
Params: NewTokenTransferVerifyParamsSlice("")[0], // TODO
43+
}
44+
45+
node.RunAPIGRPCBenchmark(b, wl, clientConfPath, *numConn)
46+
47+
// for _, bm := range ... {
48+
// node.RunAPIGRPPCBenchmark(b, wl, bm)
49+
// }
50+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
Copyright IBM Corp All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package main
8+
9+
import (
10+
"flag"
11+
"fmt"
12+
"path"
13+
"runtime"
14+
"time"
15+
16+
"github.com/hyperledger-labs/fabric-smart-client/integration/benchmark/node"
17+
bench "github.com/hyperledger-labs/fabric-token-sdk/token/core/zkatdlog/nogh/v1/validator/bench/transfer_service"
18+
"google.golang.org/grpc/benchmark/flags"
19+
)
20+
21+
var (
22+
numConn = flags.IntSlice("numConn", []int{1, 2}, "Number of grpc client connections - may be a comma-separated list")
23+
numWorker = flags.IntSlice("cpu", []int{1, 2, 4, 8}, "Number of concurrent worker - may be a comma-separated list")
24+
workloadFlag = flags.StringSlice("workloads", []string{"sign"}, "Workloads to execute - may be a comma-separated list")
25+
warmupDur = flag.Duration("warmup", 5*time.Second, "Warmup duration")
26+
duration = flag.Duration("benchtime", 10*time.Second, "Duration for every execution")
27+
count = flag.Int("count", 1, "Number of executions")
28+
)
29+
30+
func main() {
31+
flag.Parse()
32+
33+
runtime.GOMAXPROCS(runtime.NumCPU())
34+
35+
testdataPath := "./out/testdata" // for local debugging you can set testdataPath := "out/testdata"
36+
clientConfPath := path.Join(testdataPath, "fsc", "nodes", "test-node.0", "client-config.yaml")
37+
38+
params := bench.NewTokenTransferVerifyParamsSlice("")[0]
39+
fmt.Println("Sending Pre-computing ZK proof...")
40+
41+
zkpWorkload := node.Workload{
42+
Name: "zkp",
43+
Factory: &bench.TransferServiceViewFactory{},
44+
Params: params,
45+
}
46+
47+
selected := make([]node.Workload, 0, len(*workloadFlag))
48+
selected = append(selected, zkpWorkload)
49+
50+
node.RunRemoteBenchmarkSuite(node.RemoteBenchmarkConfig{
51+
Workloads: selected,
52+
ClientConfPath: clientConfPath,
53+
ConnCounts: *numConn,
54+
WorkerCounts: *numWorker,
55+
WarmupDur: *warmupDur,
56+
BenchTime: *duration,
57+
Count: *count,
58+
BenchName: "BenchmarkAPIGRPCRemote",
59+
})
60+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package main
8+
9+
import (
10+
fscnode "github.com/hyperledger-labs/fabric-smart-client/node"
11+
)
12+
13+
func main() {
14+
n := fscnode.New()
15+
n.Execute(func() error {
16+
return nil
17+
})
18+
}

0 commit comments

Comments
 (0)