Skip to content

Commit 3e6f757

Browse files
Signer info store DB implementation
Signed-off-by: Alexandros Filios <alexandros.filios@ibm.com>
1 parent 725af85 commit 3e6f757

File tree

17 files changed

+305
-63
lines changed

17 files changed

+305
-63
lines changed

platform/common/driver/kvs.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ type SignerEntry struct {
1515
DebugStack []byte
1616
}
1717

18-
type SignerStore interface {
19-
GetSigner(id view.Identity) (*SignerEntry, error)
18+
type SignerInfoStore interface {
2019
FilterExistingSigners(ids ...view.Identity) ([]view.Identity, error)
21-
PutSigner(id view.Identity, entry *SignerEntry) error
20+
PutSigner(id view.Identity) error
2221
}
2322

2423
type AuditInfoStore interface {

platform/common/services/sig/service.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ type SignerEntry = driver2.SignerEntry
3232

3333
type Service struct {
3434
deserializer Deserializer
35-
signerKVS driver2.SignerStore
35+
signerKVS driver2.SignerInfoStore
3636
auditInfoKVS driver2.AuditInfoStore
3737

3838
mutex sync.RWMutex
3939
signers map[string]SignerEntry
4040
verifiers map[string]VerifierEntry
4141
}
4242

43-
func NewService(deserializer Deserializer, auditInfoKVS driver2.AuditInfoStore, signerKVS driver2.SignerStore) *Service {
43+
func NewService(deserializer Deserializer, auditInfoKVS driver2.AuditInfoStore, signerKVS driver2.SignerInfoStore) *Service {
4444
return &Service{
4545
signerKVS: signerKVS,
4646
auditInfoKVS: auditInfoKVS,
@@ -84,7 +84,7 @@ func (o *Service) RegisterSigner(identity view.Identity, signer driver.Signer, v
8484
o.mutex.Unlock()
8585

8686
if o.signerKVS != nil {
87-
if err := o.signerKVS.PutSigner(identity, &entry); err != nil {
87+
if err := o.signerKVS.PutSigner(identity); err != nil {
8888
o.deleteSigner(idHash)
8989
return errors.Wrap(err, "failed to store entry in kvs for the passed signer")
9090
}

platform/fabric/core/generic/driver/provider.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func NewProvider(
4040
channelProvider generic.ChannelProvider,
4141
idProvider vdriver.IdentityProvider,
4242
identityLoaders []identity.NamedIdentityLoader,
43-
signerKVS driver.SignerStore,
43+
signerKVS driver.SignerInfoStore,
4444
auditInfoKVS driver.AuditInfoStore,
4545
kvss *kvs.KVS,
4646
) *Provider {

platform/fabric/sdk/dig/generic/providers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func NewDriver(in struct {
5656
IdProvider vdriver.IdentityProvider
5757
KVS *kvs.KVS
5858
AuditInfoKVS driver2.AuditInfoStore
59-
SignerKVS driver2.SignerStore
59+
SignerKVS driver2.SignerInfoStore
6060
ChannelProvider generic.ChannelProvider `name:"generic-channel-provider"`
6161
IdentityLoaders []identity.NamedIdentityLoader `group:"identity-loaders"`
6262
}) core.NamedDriver {

platform/view/sdk/dig/providers.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package sdk
8+
9+
import (
10+
driver4 "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver"
11+
"github.com/hyperledger-labs/fabric-smart-client/platform/common/utils"
12+
"github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/collections"
13+
"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/driver"
14+
driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver"
15+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/badger"
16+
mem "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/memory"
17+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kms"
18+
driver3 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kms/driver"
19+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs"
20+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/binding"
21+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/signerinfo"
22+
"github.com/pkg/errors"
23+
"go.uber.org/dig"
24+
)
25+
26+
func newKVS(in struct {
27+
dig.In
28+
Config driver.ConfigService
29+
Drivers []driver2.NamedDriver `group:"db-drivers"`
30+
}) (*kvs.KVS, error) {
31+
driverName := utils.DefaultString(in.Config.GetString("fsc.kvs.persistence.type"), string(mem.MemoryPersistence))
32+
for _, driver := range in.Drivers {
33+
if string(driver.Name) == driverName {
34+
return kvs.NewWithConfig(driver.Driver, "_default", in.Config)
35+
}
36+
}
37+
return nil, errors.New("driver not found")
38+
}
39+
40+
var unsupportedStores = collections.NewSet(badger.FilePersistence, badger.BadgerPersistence)
41+
42+
func newBindingStore(in struct {
43+
dig.In
44+
KVS *kvs.KVS
45+
Config driver.ConfigService
46+
Drivers []driver2.NamedDriver `group:"db-drivers"`
47+
}) (driver4.BindingStore, error) {
48+
driverName := driver4.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.binding.persistence.type"), string(mem.MemoryPersistence)))
49+
if unsupportedStores.Contains(driverName) {
50+
return binding.NewKVSBased(in.KVS), nil
51+
}
52+
for _, d := range in.Drivers {
53+
if d.Name == driverName {
54+
return binding.NewWithConfig(d.Driver, "_default", in.Config)
55+
}
56+
}
57+
return nil, errors.New("driver not found")
58+
}
59+
60+
func newSignerInfoStore(in struct {
61+
dig.In
62+
KVS *kvs.KVS
63+
Config driver.ConfigService
64+
Drivers []driver2.NamedDriver `group:"db-drivers"`
65+
}) (driver4.SignerInfoStore, error) {
66+
driverName := driver4.PersistenceType(utils.DefaultString(in.Config.GetString("fsc.signerinfo.persistence.type"), string(mem.MemoryPersistence)))
67+
if unsupportedStores.Contains(driverName) {
68+
return signerinfo.NewKVSBased(in.KVS), nil
69+
}
70+
for _, d := range in.Drivers {
71+
if d.Name == driverName {
72+
return signerinfo.NewWithConfig(d.Driver, "_default", in.Config)
73+
}
74+
}
75+
return nil, errors.New("driver not found")
76+
}
77+
78+
func newKMSDriver(in struct {
79+
dig.In
80+
Config driver.ConfigService
81+
Drivers []driver3.NamedDriver `group:"kms-drivers"`
82+
}) (*kms.KMS, error) {
83+
driverName := utils.DefaultString(in.Config.GetString("fsc.identity.type"), "file")
84+
for _, driver := range in.Drivers {
85+
if string(driver.Name) == driverName {
86+
return &kms.KMS{Driver: driver.Driver}, nil
87+
}
88+
}
89+
return nil, errors.New("driver not found")
90+
}

platform/view/sdk/dig/sdk.go

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import (
1616
dig2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/sdk/dig"
1717
"github.com/hyperledger-labs/fabric-smart-client/platform/common/services/logging"
1818
sig2 "github.com/hyperledger-labs/fabric-smart-client/platform/common/services/sig"
19-
"github.com/hyperledger-labs/fabric-smart-client/platform/common/utils"
2019
digutils "github.com/hyperledger-labs/fabric-smart-client/platform/common/utils/dig"
2120
"github.com/hyperledger-labs/fabric-smart-client/platform/view"
2221
"github.com/hyperledger-labs/fabric-smart-client/platform/view/core/endpoint"
@@ -30,25 +29,20 @@ import (
3029
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/comm/host"
3130
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/comm/provider"
3231
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/crypto"
33-
driver2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver"
3432
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/badger"
3533
mem "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/memory"
3634
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver/sql"
3735
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/events"
3836
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/events/simple"
3937
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/grpc"
4038
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/hash"
41-
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kms"
42-
driver3 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kms/driver"
4339
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kms/driver/file"
4440
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs"
4541
metrics2 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/metrics"
4642
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/metrics/operations"
4743
view3 "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/server/view"
4844
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/server/view/protos"
4945
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/auditinfo"
50-
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/binding"
51-
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/storage/signerinfo"
5246
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/tracing"
5347
"go.opentelemetry.io/otel/trace"
5448
"go.uber.org/dig"
@@ -107,7 +101,7 @@ func (p *SDK) Install() error {
107101
p.C.Provide(sig2.NewService, dig.As(new(id.SigService), new(driver.SigService), new(driver.SigRegistry), new(driver.AuditRegistry))),
108102
p.C.Provide(view.NewSigService, dig.As(new(view3.VerifierProvider), new(view3.SignerProvider))),
109103
p.C.Provide(newBindingStore, dig.As(new(driver4.BindingStore))),
110-
p.C.Provide(signerinfo.NewKVSBased, dig.As(new(driver4.SignerStore))),
104+
p.C.Provide(newSignerInfoStore, dig.As(new(driver4.SignerInfoStore))),
111105
p.C.Provide(auditinfo.NewKVSBased, dig.As(new(driver4.AuditInfoStore))),
112106
p.C.Provide(endpoint.NewService),
113107
p.C.Provide(digutils.Identity[*endpoint.Service](), dig.As(new(driver.EndpointService))),
@@ -200,45 +194,3 @@ func (p *SDK) Start(ctx context.Context) error {
200194
return nil
201195
})
202196
}
203-
204-
func newKVS(in struct {
205-
dig.In
206-
Config driver.ConfigService
207-
Drivers []driver2.NamedDriver `group:"db-drivers"`
208-
}) (*kvs.KVS, error) {
209-
driverName := utils.DefaultString(in.Config.GetString("fsc.kvs.persistence.type"), string(mem.MemoryPersistence))
210-
for _, driver := range in.Drivers {
211-
if string(driver.Name) == driverName {
212-
return kvs.NewWithConfig(driver.Driver, "_default", in.Config)
213-
}
214-
}
215-
return nil, errors.New("driver not found")
216-
}
217-
218-
func newBindingStore(in struct {
219-
dig.In
220-
Config driver.ConfigService
221-
Drivers []driver2.NamedDriver `group:"db-drivers"`
222-
}) (driver4.BindingStore, error) {
223-
driverName := utils.DefaultString(in.Config.GetString("fsc.binding.persistence.type"), string(mem.MemoryPersistence))
224-
for _, driver := range in.Drivers {
225-
if string(driver.Name) == driverName {
226-
return binding.NewWithConfig(driver.Driver, "_default", in.Config)
227-
}
228-
}
229-
return nil, errors.New("driver not found")
230-
}
231-
232-
func newKMSDriver(in struct {
233-
dig.In
234-
Config driver.ConfigService
235-
Drivers []driver3.NamedDriver `group:"kms-drivers"`
236-
}) (*kms.KMS, error) {
237-
driverName := utils.DefaultString(in.Config.GetString("fsc.identity.type"), "file")
238-
for _, driver := range in.Drivers {
239-
if string(driver.Name) == driverName {
240-
return &kms.KMS{Driver: driver.Driver}, nil
241-
}
242-
}
243-
return nil, errors.New("driver not found")
244-
}

platform/view/services/db/driver/badger/driver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,7 @@ func (d *Driver) NewTransactionalUnversioned(dataSourceName string, config drive
6868
func (d *Driver) NewBinding(string, driver.Config) (driver.BindingPersistence, error) {
6969
panic("not implemented")
7070
}
71+
72+
func (d *Driver) NewSignerInfo(string, driver.Config) (driver.SignerInfoPersistence, error) {
73+
panic("not implemented")
74+
}

platform/view/services/db/driver/driver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ type SQLErrorWrapper interface {
4747

4848
type BindingPersistence = driver.BindingStore
4949

50+
type SignerInfoPersistence = driver.SignerInfoStore
51+
5052
type BasePersistence[V any, R any] interface {
5153
// SetState sets the given value for the given namespace, key, and version
5254
SetState(namespace driver.Namespace, key driver.PKey, value V) error
@@ -150,6 +152,8 @@ type Driver interface {
150152
NewTransactionalUnversioned(dataSourceName string, config Config) (TransactionalUnversionedPersistence, error)
151153
// NewBinding returns a new BindingPersistence for the passed data source and config
152154
NewBinding(dataSourceName string, config Config) (BindingPersistence, error)
155+
// NewSignerInfo returns a new SignerInfoPersistence for the passed data source and config
156+
NewSignerInfo(string, Config) (SignerInfoPersistence, error)
153157
}
154158

155159
type (

platform/view/services/db/driver/memory/driver.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,7 @@ func (d *Driver) NewUnversioned(string, driver.Config) (driver.UnversionedPersis
6464
func (d *Driver) NewBinding(string, driver.Config) (driver.BindingPersistence, error) {
6565
return sql.NewPersistenceWithOpts(utils.GenerateUUIDOnlyLetters(), opts, sql.BindingConstructors)
6666
}
67+
68+
func (d *Driver) NewSignerInfo(string, driver.Config) (driver.SignerInfoPersistence, error) {
69+
return sql.NewPersistenceWithOpts(utils.GenerateUUIDOnlyLetters(), opts, sql.SignerInfoConstructors)
70+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package common
8+
9+
import (
10+
"database/sql"
11+
"fmt"
12+
13+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/services/db/driver"
14+
"github.com/hyperledger-labs/fabric-smart-client/platform/view/view"
15+
"github.com/pkg/errors"
16+
)
17+
18+
func NewSignerInfoPersistence(writeDB *sql.DB, readDB *sql.DB, table string, errorWrapper driver.SQLErrorWrapper, ci Interpreter) *SignerInfoPersistence {
19+
return &SignerInfoPersistence{
20+
table: table,
21+
errorWrapper: errorWrapper,
22+
readDB: readDB,
23+
writeDB: writeDB,
24+
ci: ci,
25+
}
26+
}
27+
28+
type SignerInfoPersistence struct {
29+
table string
30+
errorWrapper driver.SQLErrorWrapper
31+
readDB *sql.DB
32+
writeDB *sql.DB
33+
ci Interpreter
34+
}
35+
36+
func (db *SignerInfoPersistence) FilterExistingSigners(ids ...view.Identity) ([]view.Identity, error) {
37+
idHashes := make([]string, len(ids))
38+
inverseMap := make(map[string]view.Identity, len(ids))
39+
for i, id := range ids {
40+
idHash := id.UniqueID()
41+
idHashes[i] = idHash
42+
inverseMap[idHash] = id
43+
}
44+
where, params := Where(db.ci.InStrings("id", idHashes))
45+
query := fmt.Sprintf("SELECT id FROM %s %s", db.table, where)
46+
logger.Debug(query, params)
47+
48+
rows, err := db.readDB.Query(query, params...)
49+
if err != nil {
50+
return nil, errors.Wrapf(err, "error querying db")
51+
}
52+
53+
existingSigners := make([]view.Identity, 0)
54+
for rows.Next() {
55+
var idHash string
56+
if err := rows.Scan(&idHash); err != nil {
57+
return nil, errors.Wrapf(err, "failed scanning row")
58+
}
59+
existingSigners = append(existingSigners, inverseMap[idHash])
60+
}
61+
logger.Debugf("Found %d out of %d signers", len(existingSigners), len(ids))
62+
return existingSigners, nil
63+
}
64+
65+
func (db *SignerInfoPersistence) PutSigner(id view.Identity) error {
66+
query := fmt.Sprintf("INSERT INTO %s (id) VALUES ($1)", db.table)
67+
logger.Debugf(query, id)
68+
_, err := db.writeDB.Exec(query, id.UniqueID())
69+
if err != nil && errors.Is(db.errorWrapper.WrapError(err), driver.UniqueKeyViolation) {
70+
logger.Warnf("Signer [%s] already in db. Skipping...", id)
71+
return nil
72+
}
73+
if err != nil {
74+
return errors.Wrapf(err, "failed executing query [%s]", query)
75+
}
76+
logger.Debugf("Signer [%s] registered", id)
77+
return nil
78+
}
79+
80+
func (db *SignerInfoPersistence) CreateSchema() error {
81+
return InitSchema(db.writeDB, fmt.Sprintf(`
82+
CREATE TABLE IF NOT EXISTS %s (
83+
id TEXT NOT NULL PRIMARY KEY
84+
);`, db.table))
85+
}

0 commit comments

Comments
 (0)