Skip to content

Commit 09cb7d7

Browse files
Moved KVS functionality behind interfaces and grouped them based on domains for decoupling
Signed-off-by: Alexandros Filios <alexandros.filios@ibm.com>
1 parent e458304 commit 09cb7d7

File tree

26 files changed

+571
-372
lines changed

26 files changed

+571
-372
lines changed

docs/fabric/fabricdev/core/fabricdev/channelprovider.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,16 @@ import (
2323
driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver"
2424
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/events"
2525
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/hash"
26-
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs"
2726
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/metrics"
2827
"github.com/hyperledger/fabric-protos-go/common"
2928
"github.com/pkg/errors"
3029
"go.opentelemetry.io/otel/trace"
3130
)
3231

3332
type provider struct {
34-
kvss *kvs.KVS
33+
envelopeKVS driver.EnvelopeKVS
34+
metadataKVS driver.MetadataKVS
35+
endorseTxKVS driver.EndorseTxKVS
3536
publisher events.Publisher
3637
hasher hash.Hasher
3738
newVault generic.VaultConstructor
@@ -45,7 +46,9 @@ type provider struct {
4546
}
4647

4748
func NewChannelProvider(
48-
kvss *kvs.KVS,
49+
envelopeKVS driver.EnvelopeKVS,
50+
metadataKVS driver.MetadataKVS,
51+
endorseTxKVS driver.EndorseTxKVS,
4952
publisher events.Publisher,
5053
hasher hash.Hasher,
5154
tracerProvider trace.TracerProvider,
@@ -58,7 +61,9 @@ func NewChannelProvider(
5861
acceptedHeaderTypes []common.HeaderType,
5962
) *provider {
6063
return &provider{
61-
kvss: kvss,
64+
envelopeKVS: envelopeKVS,
65+
metadataKVS: metadataKVS,
66+
endorseTxKVS: endorseTxKVS,
6267
publisher: publisher,
6368
hasher: hasher,
6469
newVault: newVault,
@@ -90,9 +95,9 @@ func (p *provider) NewChannel(nw driver.FabricNetworkService, channelName string
9095
return nil, err
9196
}
9297

93-
envelopeService := transaction.NewEnvelopeService(p.kvss, nw.Name(), channelName)
94-
transactionService := transaction.NewEndorseTransactionService(p.kvss, nw.Name(), channelName)
95-
metadataService := transaction.NewMetadataService(p.kvss, nw.Name(), channelName)
98+
envelopeService := transaction.NewEnvelopeService(p.envelopeKVS, nw.Name(), channelName)
99+
transactionService := transaction.NewEndorseTransactionService(p.endorseTxKVS, nw.Name(), channelName)
100+
metadataService := transaction.NewMetadataService(p.metadataKVS, nw.Name(), channelName)
96101
peerService := services.NewClientFactory(nw.ConfigService(), nw.LocalMembership().DefaultSigningIdentity())
97102

98103
// Fabric finality

docs/fabric/fabricdev/core/fabricdev/driver/provider.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ type Provider struct {
5050
}
5151

5252
func NewProvider(
53+
envelopeKVS fdriver.EnvelopeKVS,
54+
metadataKVS fdriver.MetadataKVS,
55+
endorseTxKVS fdriver.EndorseTxKVS,
5356
configProvider config.Provider,
5457
metricsProvider metrics.Provider,
5558
endpointService identity.EndpointService,
@@ -65,7 +68,9 @@ func NewProvider(
6568
return &Provider{
6669
configProvider: configProvider,
6770
channelProvider: fabricdev.NewChannelProvider(
68-
kvss,
71+
envelopeKVS,
72+
metadataKVS,
73+
endorseTxKVS,
6974
publisher,
7075
hasher,
7176
tracerProvider,

docs/fabric/fabricdev/sdk/fabricdev/providers.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core"
1313
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core/generic/driver/config"
1414
mspdriver "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/core/generic/msp/driver"
15+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/driver"
1516
vdriver "github.com/hyperledger-labs/fabric-smart-client/platform/view/driver"
1617
dbdriver "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver"
1718
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/events"
@@ -24,6 +25,10 @@ import (
2425

2526
func NewDriver(in struct {
2627
dig.In
28+
29+
EnvelopeKVS driver.EnvelopeKVS
30+
MetadataKVS driver.MetadataKVS
31+
EndorseTxKVS driver.EndorseTxKVS
2732
ConfigProvider config.Provider
2833
MetricsProvider metrics.Provider
2934
EndpointService vdriver.EndpointService
@@ -39,6 +44,9 @@ func NewDriver(in struct {
3944
d := core.NamedDriver{
4045
Name: "fabricdev",
4146
Driver: fdevdriver.NewProvider(
47+
in.EnvelopeKVS,
48+
in.MetadataKVS,
49+
in.EndorseTxKVS,
4250
in.ConfigProvider,
4351
in.MetricsProvider,
4452
in.EndpointService,

platform/common/driver/kvs.go

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 driver
8+
9+
import (
10+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
11+
)
12+
13+
type SignerEntry struct {
14+
Signer Signer
15+
DebugStack []byte
16+
}
17+
18+
type SignerKVS interface {
19+
GetSigner(id view.Identity) (*SignerEntry, error)
20+
FilterExistingSigners(ids ...view.Identity) ([]view.Identity, error)
21+
PutSigner(id view.Identity, entry *SignerEntry) error
22+
}
23+
24+
type AuditInfoKVS interface {
25+
GetAuditInfo(id view.Identity) ([]byte, error)
26+
PutAuditInfo(id view.Identity, info []byte) error
27+
}
28+
29+
type BindingKVS interface {
30+
GetBinding(ephemeral view.Identity) (view.Identity, error)
31+
PutBinding(ephemeral, longTerm view.Identity) error
32+
}
33+
34+
type MetadataKVS[K any, M any] interface {
35+
GetMetadata(key K) (M, error)
36+
ExistMetadata(key K) (bool, error)
37+
PutMetadata(key K, transientMap M) error
38+
}
39+
40+
type EnvelopeKVS[K any] interface {
41+
GetEnvelope(key K) ([]byte, error)
42+
ExistsEnvelope(key K) (bool, error)
43+
PutEnvelope(key K, env []byte) error
44+
}
45+
46+
type EndorseTxKVS[K any] interface {
47+
GetEndorseTx(key K) ([]byte, error)
48+
ExistsEndorseTx(key K) (bool, error)
49+
PutEndorseTx(key K, etx []byte) error
50+
}

platform/common/services/sig/service.go

Lines changed: 23 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -12,49 +12,41 @@ import (
1212
"runtime/debug"
1313
"sync"
1414

15+
driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver"
1516
"github.com/hyperledger-labs/fabric-smart-client/platform/common/services/logging"
1617
"github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/collections"
1718
"github.com/hyperledger-labs/fabric-smart-client/platform/view/driver"
18-
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs"
1919
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
2020
"github.com/pkg/errors"
2121
"go.uber.org/zap/zapcore"
2222
)
2323

2424
var logger = logging.MustGetLogger("common-sdk.sig")
2525

26-
type KVS interface {
27-
Exists(id string) bool
28-
GetExisting(ids ...string) []string
29-
Put(id string, state interface{}) error
30-
Get(id string, state interface{}) error
31-
}
32-
3326
type VerifierEntry struct {
3427
Verifier driver.Verifier
3528
DebugStack []byte
3629
}
3730

38-
type SignerEntry struct {
39-
Signer driver.Signer
40-
DebugStack []byte
41-
}
31+
type SignerEntry = driver2.SignerEntry
4232

4333
type Service struct {
4434
deserializer Deserializer
45-
kvs KVS
35+
signerKVS driver2.SignerKVS
36+
auditInfoKVS driver2.AuditInfoKVS
4637

4738
mutex sync.RWMutex
4839
signers map[string]SignerEntry
4940
verifiers map[string]VerifierEntry
5041
}
5142

52-
func NewService(deserializer Deserializer, kvs KVS) *Service {
43+
func NewService(deserializer Deserializer, auditInfoKVS driver2.AuditInfoKVS, signerKVS driver2.SignerKVS) *Service {
5344
return &Service{
45+
signerKVS: signerKVS,
46+
auditInfoKVS: auditInfoKVS,
5447
signers: map[string]SignerEntry{},
5548
verifiers: map[string]VerifierEntry{},
5649
deserializer: deserializer,
57-
kvs: kvs,
5850
}
5951
}
6052

@@ -91,8 +83,8 @@ func (o *Service) RegisterSigner(identity view.Identity, signer driver.Signer, v
9183
o.signers[idHash] = entry
9284
o.mutex.Unlock()
9385

94-
if o.kvs != nil {
95-
if err := o.registerSigner(idHash, &entry); err != nil {
86+
if o.signerKVS != nil {
87+
if err := o.signerKVS.PutSigner(identity, &entry); err != nil {
9688
o.deleteSigner(idHash)
9789
return errors.Wrap(err, "failed to store entry in kvs for the passed signer")
9890
}
@@ -151,72 +143,43 @@ func (o *Service) RegisterVerifier(identity view.Identity, verifier driver.Verif
151143
}
152144

153145
func (o *Service) RegisterAuditInfo(identity view.Identity, info []byte) error {
154-
k := kvs.CreateCompositeKeyOrPanic(
155-
"fsc.platform.view.sig",
156-
[]string{
157-
identity.String(),
158-
},
159-
)
160-
if err := o.kvs.Put(k, info); err != nil {
161-
return err
162-
}
163-
return nil
146+
return o.auditInfoKVS.PutAuditInfo(identity, info)
164147
}
165148

166149
func (o *Service) GetAuditInfo(identity view.Identity) ([]byte, error) {
167-
k := kvs.CreateCompositeKeyOrPanic(
168-
"fsc.platform.view.sig",
169-
[]string{
170-
identity.String(),
171-
},
172-
)
173-
174-
if !o.kvs.Exists(k) {
175-
return nil, nil
176-
}
177-
var res []byte
178-
if err := o.kvs.Get(k, &res); err != nil {
179-
return nil, err
180-
}
181-
return res, nil
150+
return o.auditInfoKVS.GetAuditInfo(identity)
182151
}
183152

184153
func (o *Service) IsMe(identity view.Identity) bool {
185154
return len(o.AreMe(identity)) > 0
186155
}
187156

188157
func (o *Service) AreMe(identities ...view.Identity) []string {
189-
idHashes := make([]string, len(identities))
190-
for i, id := range identities {
191-
idHashes[i] = id.UniqueID()
192-
}
193158
result := collections.NewSet[string]()
194-
notFound := make([]string, 0)
159+
notFound := make([]view.Identity, 0)
195160
// check local cache
196161
o.mutex.RLock()
197-
for _, idHash := range idHashes {
198-
if _, ok := o.signers[idHash]; ok {
199-
result.Add(idHash)
162+
for _, id := range identities {
163+
if _, ok := o.signers[id.UniqueID()]; ok {
164+
result.Add(id.UniqueID())
200165
} else {
201-
notFound = append(notFound, idHash)
166+
notFound = append(notFound, id)
202167
}
203168
}
204169
o.mutex.RUnlock()
205-
if len(notFound) == 0 || o.kvs == nil {
170+
if len(notFound) == 0 || o.signerKVS == nil {
206171
return result.ToSlice()
207172
}
208173
// check kvs
209-
keys := make([]string, len(notFound))
210-
for i, idHash := range notFound {
211-
key, err := kvs.CreateCompositeKey("sigService", []string{"signer", idHash})
212-
if err != nil {
213-
logger.Errorf("failed creating composite key: %v", err)
174+
175+
if existing, err := o.signerKVS.FilterExistingSigners(notFound...); err != nil {
176+
logger.Errorf("failed getting existing signers: %v", err)
177+
} else {
178+
for _, id := range existing {
179+
result.Add(id.UniqueID())
214180
}
215-
keys[i] = key
216181
}
217182

218-
result.Add(o.kvs.GetExisting(keys...)...)
219-
220183
return result.ToSlice()
221184
}
222185

@@ -341,18 +304,6 @@ func (o *Service) GetSigningIdentity(identity view.Identity) (driver.SigningIden
341304
}, nil
342305
}
343306

344-
func (o *Service) registerSigner(id string, signer *SignerEntry) error {
345-
k, err := kvs.CreateCompositeKey("sigService", []string{"signer", id})
346-
if err != nil {
347-
return errors.Wrap(err, "failed to create composite key to store entry in kvs")
348-
}
349-
err = o.kvs.Put(k, signer)
350-
if err != nil {
351-
return errors.Wrap(err, "failed to store entry in kvs for the passed signer")
352-
}
353-
return nil
354-
}
355-
356307
func (o *Service) deleteSigner(id string) {
357308
o.mutex.Lock()
358309
defer o.mutex.Unlock()

platform/fabric/core/generic/channelprovider.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver"
2222
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/events"
2323
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/hash"
24-
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs"
2524
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/metrics"
2625
"github.com/hyperledger/fabric-protos-go/common"
2726
"github.com/pkg/errors"
@@ -69,7 +68,9 @@ type ChannelProvider interface {
6968
}
7069

7170
type provider struct {
72-
kvss *kvs.KVS
71+
envelopeKVS driver.EnvelopeKVS
72+
metadataKVS driver.MetadataKVS
73+
endorserTxKVS driver.EndorseTxKVS
7374
publisher events.Publisher
7475
hasher hash.Hasher
7576
newVault VaultConstructor
@@ -87,7 +88,9 @@ type provider struct {
8788
}
8889

8990
func NewChannelProvider(
90-
kvss *kvs.KVS,
91+
envelopeKVS driver.EnvelopeKVS,
92+
metadataKVS driver.MetadataKVS,
93+
endorserTxKVS driver.EndorseTxKVS,
9194
publisher events.Publisher,
9295
hasher hash.Hasher,
9396
tracerProvider trace.TracerProvider,
@@ -104,7 +107,9 @@ func NewChannelProvider(
104107
acceptedHeaderTypes []common.HeaderType,
105108
) *provider {
106109
return &provider{
107-
kvss: kvss,
110+
envelopeKVS: envelopeKVS,
111+
metadataKVS: metadataKVS,
112+
endorserTxKVS: endorserTxKVS,
108113
publisher: publisher,
109114
hasher: hasher,
110115
newVault: newVault,
@@ -141,9 +146,9 @@ func (p *provider) NewChannel(nw driver.FabricNetworkService, channelName string
141146
return nil, err
142147
}
143148

144-
envelopeService := transaction.NewEnvelopeService(p.kvss, nw.Name(), channelName)
145-
transactionService := transaction.NewEndorseTransactionService(p.kvss, nw.Name(), channelName)
146-
metadataService := transaction.NewMetadataService(p.kvss, nw.Name(), channelName)
149+
envelopeService := transaction.NewEnvelopeService(p.envelopeKVS, nw.Name(), channelName)
150+
transactionService := transaction.NewEndorseTransactionService(p.endorserTxKVS, nw.Name(), channelName)
151+
metadataService := transaction.NewMetadataService(p.metadataKVS, nw.Name(), channelName)
147152
peerService := services.NewClientFactory(nw.ConfigService(), nw.LocalMembership().DefaultSigningIdentity())
148153

149154
// Fabric finality

0 commit comments

Comments
 (0)