diff --git a/go.mod b/go.mod index 00697ef1e..ce53a2a94 100755 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/dgraph-io/ristretto v0.1.0 github.com/golang/protobuf v1.5.2 github.com/hashicorp/go-uuid v1.0.2 - github.com/hyperledger-labs/fabric-smart-client v0.1.1-0.20221201145120-5b16ba703b2f + github.com/hyperledger-labs/fabric-smart-client v0.2.0 github.com/hyperledger-labs/orion-sdk-go v0.2.5 github.com/hyperledger-labs/orion-server v0.2.5 github.com/hyperledger/fabric v1.4.0-rc1.0.20220808214918-83596078d0c3 diff --git a/go.sum b/go.sum index 35188ac64..63cf42aea 100644 --- a/go.sum +++ b/go.sum @@ -805,8 +805,8 @@ github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmK github.com/huin/goupnp v1.0.0 h1:wg75sLpL6DZqwHQN6E1Cfk6mtfzS45z8OV+ic+DtHRo= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= -github.com/hyperledger-labs/fabric-smart-client v0.1.1-0.20221201145120-5b16ba703b2f h1:rBsPzYygDoG3fm7CdwlgsR6UhlnmeoOCERMuoSYaRNo= -github.com/hyperledger-labs/fabric-smart-client v0.1.1-0.20221201145120-5b16ba703b2f/go.mod h1:WtNWdKVbF9R1/2hIBVQUlR9Zl3T0TdkzUcCQTc2Eqk4= +github.com/hyperledger-labs/fabric-smart-client v0.2.0 h1:A1EKrJtEg5nJzVFT9P4o5FyeO8TBTEENKYmIfL67snw= +github.com/hyperledger-labs/fabric-smart-client v0.2.0/go.mod h1:WtNWdKVbF9R1/2hIBVQUlR9Zl3T0TdkzUcCQTc2Eqk4= github.com/hyperledger-labs/orion-sdk-go v0.2.5 h1:HFGRTuMZgzo9EtyJeFAhVSlbrj6x3jtY0aDcghdjzRE= github.com/hyperledger-labs/orion-sdk-go v0.2.5/go.mod h1:At8hiFATfkDXQ4AFLVbaTiC9GDhVDo8aN/supb1KBb4= github.com/hyperledger-labs/orion-server v0.2.5 h1:aFudmB9SAnsT5v8jhazkuszEu0pdJNFqaYZF2GpvAuI= diff --git a/token/core/fabtoken/deserializer.go b/token/core/fabtoken/deserializer.go index 34a3ee4f2..7bb4ff664 100644 --- a/token/core/fabtoken/deserializer.go +++ b/token/core/fabtoken/deserializer.go @@ -14,6 +14,7 @@ import ( "github.com/hyperledger-labs/fabric-token-sdk/token/core/identity/msp/x509" "github.com/hyperledger-labs/fabric-token-sdk/token/core/interop/htlc" "github.com/hyperledger-labs/fabric-token-sdk/token/driver" + "github.com/pkg/errors" ) // VerifierDES is the interface for verifiers' deserializer @@ -56,7 +57,7 @@ func (d *deserializer) GetAuditorVerifier(id view.Identity) (driver.Verifier, er // GetOwnerMatcher is not needed in fabtoken, as identities are in the clear func (d *deserializer) GetOwnerMatcher(raw []byte) (driver.Matcher, error) { - panic("not supported") + return nil, errors.Errorf("not supported") } // enrollmentService returns enrollment IDs behind the owners of token diff --git a/token/core/fabtoken/driver/driver.go b/token/core/fabtoken/driver/driver.go index ed45e45fc..434ee1af4 100644 --- a/token/core/fabtoken/driver/driver.go +++ b/token/core/fabtoken/driver/driver.go @@ -7,7 +7,7 @@ SPDX-License-Identifier: Apache-2.0 package driver import ( - view2 "github.com/hyperledger-labs/fabric-smart-client/platform/view" + "github.com/hyperledger-labs/fabric-smart-client/platform/view" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs" "github.com/hyperledger-labs/fabric-token-sdk/token" "github.com/hyperledger-labs/fabric-token-sdk/token/core" @@ -32,7 +32,7 @@ func (d *Driver) PublicParametersFromBytes(params []byte) (driver.PublicParamete return pp, nil } -func (d *Driver) NewTokenService(sp view2.ServiceProvider, publicParamsFetcher driver.PublicParamsFetcher, networkID string, channel string, namespace string) (driver.TokenManagerService, error) { +func (d *Driver) NewTokenService(sp view.ServiceProvider, publicParamsFetcher driver.PublicParamsFetcher, networkID string, channel string, namespace string) (driver.TokenManagerService, error) { n := network.GetInstance(sp, networkID, channel) if n == nil { return nil, errors.Errorf("network [%s] does not exists", networkID) @@ -44,7 +44,7 @@ func (d *Driver) NewTokenService(sp view2.ServiceProvider, publicParamsFetcher d qe := v.TokenVault().QueryEngine() networkLocalMembership := n.LocalMembership() - tmsConfig, err := config.NewTokenSDK(view2.GetConfigService(sp)).GetTMS(networkID, channel, namespace) + tmsConfig, err := config.NewTokenSDK(view.GetConfigService(sp)).GetTMS(networkID, channel, namespace) if err != nil { return nil, errors.WithMessage(err, "failed to create config manager") } @@ -55,10 +55,10 @@ func (d *Driver) NewTokenService(sp view2.ServiceProvider, publicParamsFetcher d sp, // service provider networkID, // network ID tmsConfig, // config manager - view2.GetIdentityProvider(sp).DefaultIdentity(), // FSC identity - networkLocalMembership.DefaultIdentity(), // network default identity - msp.NewSigService(view2.GetSigService(sp)), // signer service - view2.GetEndpointService(sp), // endpoint service + view.GetIdentityProvider(sp).DefaultIdentity(), // FSC identity + networkLocalMembership.DefaultIdentity(), // network default identity + msp.NewSigService(view.GetSigService(sp)), // signer service + view.GetEndpointService(sp), // endpoint service ) wallet, err := mspWalletFactory.NewX509Wallet(driver.OwnerRole) if err != nil { @@ -124,7 +124,7 @@ func (d *Driver) NewPublicParametersManager(params driver.PublicParameters) (dri if !ok { return nil, errors.Errorf("invalid public parameters type [%T]", params) } - return ppm.NewPublicParamsManagerFromParams(pp), nil + return ppm.NewPublicParamsManagerFromParams(pp) } func init() { diff --git a/token/core/fabtoken/ppm/ppm.go b/token/core/fabtoken/ppm/ppm.go index d5858b8c1..10b52fa2d 100644 --- a/token/core/fabtoken/ppm/ppm.go +++ b/token/core/fabtoken/ppm/ppm.go @@ -52,11 +52,11 @@ func NewPublicParamsManager(PPLabel string, vault Vault, publicParamsLoader Publ } // NewPublicParamsManagerFromParams initializes a PublicParamsManager with the passed PublicParams -func NewPublicParamsManagerFromParams(pp *fabtoken.PublicParams) *PublicParamsManager { +func NewPublicParamsManagerFromParams(pp *fabtoken.PublicParams) (*PublicParamsManager, error) { if pp == nil { - panic("public parameters must be non-nil") + return nil, errors.Errorf("public parameters must be non-nil") } - return &PublicParamsManager{PP: pp, Mutex: sync.RWMutex{}} + return &PublicParamsManager{PP: pp, Mutex: sync.RWMutex{}}, nil } // PublicParameters returns the public parameters of PublicParamsManager diff --git a/token/core/fabtoken/sender.go b/token/core/fabtoken/sender.go index 625582dcb..b8b9e6232 100644 --- a/token/core/fabtoken/sender.go +++ b/token/core/fabtoken/sender.go @@ -104,7 +104,8 @@ func (s *Service) Transfer(txID string, wallet driver.OwnerWallet, ids []*token2 receiverIsSender := make([]bool, len(receivers)) for i, receiver := range receivers { - receiverIsSender[i] = s.OwnerWalletByID(receiver) != nil + _, err = s.OwnerWalletByID(receiver) + receiverIsSender[i] = err == nil } metadata := &driver.TransferMetadata{ diff --git a/token/core/fabtoken/service.go b/token/core/fabtoken/service.go index c09cfa3e3..1e8f7ba74 100644 --- a/token/core/fabtoken/service.go +++ b/token/core/fabtoken/service.go @@ -7,8 +7,6 @@ SPDX-License-Identifier: Apache-2.0 package fabtoken import ( - "fmt" - view2 "github.com/hyperledger-labs/fabric-smart-client/platform/view" "github.com/hyperledger-labs/fabric-token-sdk/token" "github.com/hyperledger-labs/fabric-token-sdk/token/core/identity" @@ -88,12 +86,8 @@ func (s *Service) IdentityProvider() driver.IdentityProvider { return s.IP } -func (s *Service) Validator() driver.Validator { - v, err := NewValidator(s.PPM.PublicParams(), s.Deserializer) - if err != nil { - panic(fmt.Sprintf("failed to create validator: %s", err)) - } - return v +func (s *Service) Validator() (driver.Validator, error) { + return NewValidator(s.PPM.PublicParams(), s.Deserializer) } func (s *Service) PublicParamsManager() driver.PublicParamsManager { diff --git a/token/core/fabtoken/wallet.go b/token/core/fabtoken/wallet.go index 06c58a350..917051f6a 100644 --- a/token/core/fabtoken/wallet.go +++ b/token/core/fabtoken/wallet.go @@ -7,8 +7,6 @@ SPDX-License-Identifier: Apache-2.0 package fabtoken import ( - "fmt" - view2 "github.com/hyperledger-labs/fabric-smart-client/platform/view" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/hash" "github.com/hyperledger-labs/fabric-smart-client/platform/view/view" @@ -60,69 +58,66 @@ func (s *Service) GetEnrollmentID(auditInfo []byte) (string, error) { } func (s *Service) Wallet(identity view.Identity) driver.Wallet { - w := s.OwnerWalletByIdentity(identity) + w, _ := s.OwnerWalletByIdentity(identity) if w != nil { return w } - iw := s.IssuerWalletByIdentity(identity) + iw, _ := s.IssuerWalletByIdentity(identity) if iw != nil { return iw } return nil } -func (s *Service) OwnerWalletByIdentity(identity view.Identity) driver.OwnerWallet { +func (s *Service) OwnerWalletByIdentity(identity view.Identity) (driver.OwnerWallet, error) { return s.OwnerWalletByID(identity) } -func (s *Service) OwnerWallet(walletID string) driver.OwnerWallet { - return s.OwnerWalletByID(walletID) +func (s *Service) OwnerWallet(id string) (driver.OwnerWallet, error) { + return s.OwnerWalletByID(id) } -func (s *Service) OwnerWalletByID(id interface{}) driver.OwnerWallet { +func (s *Service) OwnerWalletByID(id interface{}) (driver.OwnerWallet, error) { s.OwnerWalletsRegistry.Lock() defer s.OwnerWalletsRegistry.Unlock() // check if there is already a wallet w, idInfo, wID, err := s.OwnerWalletsRegistry.Lookup(id) if err != nil { - logger.Errorf("failed to lookup identity for owner wallet [%s]", err) - return nil + return nil, errors.WithMessagef(err, "failed to lookup identity for owner wallet [%v]", id) } if w != nil { - return w.(driver.OwnerWallet) + return w.(driver.OwnerWallet), nil } // Create the wallet idInfoIdentity, _, err := idInfo.Get() if err != nil { - logger.Errorf("failed to get owner wallet identity for [%s]: %s", wID, err) - return nil + return nil, errors.WithMessagef(err, "failed to get owner wallet identity for [%s]", wID) } wrappedID, err := s.wrapWalletIdentity(idInfoIdentity) if err != nil { - logger.Errorf("failed to wrap owner wallet identity for [%s]: %s", wID, err) - return nil + return nil, errors.WithMessagef(err, "failed to wrap owner wallet identity for [%s]", wID) } newWallet := newOwnerWallet(s, idInfoIdentity, wrappedID, wID, idInfo) s.OwnerWalletsRegistry.RegisterWallet(wID, newWallet) if err := s.OwnerWalletsRegistry.RegisterIdentity(wrappedID, wID); err != nil { - panic(fmt.Sprintf("programming error, failed to register recipient identity [%s]", err)) + return nil, errors.WithMessagef(err, "failed to register recipient identity [%s]", wrappedID) } logger.Debugf("created owner wallet [%s:%s]", idInfo.ID, wID) - return newWallet + return newWallet, nil } -func (s *Service) IssuerWallet(id string) driver.IssuerWallet { +func (s *Service) IssuerWallet(id string) (driver.IssuerWallet, error) { return s.issuerWallet(id) } -func (s *Service) IssuerWalletByIdentity(id view.Identity) driver.IssuerWallet { - return s.issuerWallet(id) +func (s *Service) IssuerWalletByIdentity(identity view.Identity) (driver.IssuerWallet, error) { + return s.issuerWallet(identity) } -func (s *Service) issuerWallet(id interface{}) driver.IssuerWallet { +func (s *Service) issuerWallet(id interface{}) (driver.IssuerWallet, error) { s.IssuerWalletsRegistry.Lock() defer s.IssuerWalletsRegistry.Unlock() @@ -130,70 +125,68 @@ func (s *Service) issuerWallet(id interface{}) driver.IssuerWallet { w, idInfo, wID, err := s.IssuerWalletsRegistry.Lookup(id) if err != nil { logger.Errorf("failed to lookup identity for issuer wallet [%s]", err) - return nil + return nil, nil } if w != nil { - return w.(driver.IssuerWallet) + return w.(driver.IssuerWallet), nil } // Create the wallet idInfoIdentity, _, err := idInfo.Get() if err != nil { logger.Errorf("failed to get issuer wallet identity for [%s]: %s", wID, err) - return nil + return nil, nil } newWallet := newIssuerWallet(s, wID, idInfoIdentity) s.IssuerWalletsRegistry.RegisterWallet(wID, newWallet) if err := s.IssuerWalletsRegistry.RegisterIdentity(idInfoIdentity, wID); err != nil { - panic(fmt.Sprintf("programming error, failed to register recipient identity [%s]", err)) + return nil, errors.WithMessagef(err, "failed to register recipient identity [%s]", wID) } logger.Debugf("created issuer wallet [%s]", wID) - return newWallet + return newWallet, nil } -func (s *Service) AuditorWallet(id string) driver.AuditorWallet { +func (s *Service) AuditorWallet(id string) (driver.AuditorWallet, error) { return s.auditorWallet(id) } -func (s *Service) AuditorWalletByIdentity(id view.Identity) driver.AuditorWallet { - return s.auditorWallet(id) +func (s *Service) AuditorWalletByIdentity(identity view.Identity) (driver.AuditorWallet, error) { + return s.auditorWallet(identity) } -func (s *Service) auditorWallet(id interface{}) driver.AuditorWallet { +func (s *Service) auditorWallet(id interface{}) (driver.AuditorWallet, error) { s.AuditorWalletsRegistry.Lock() defer s.AuditorWalletsRegistry.Unlock() // check if there is already a wallet w, idInfo, wID, err := s.AuditorWalletsRegistry.Lookup(id) if err != nil { - logger.Errorf("failed to lookup identity for auditor wallet [%s]", err) - return nil + return nil, errors.WithMessagef(err, "failed to lookup identity for auditor wallet [%v]", id) } if w != nil { - return w.(driver.AuditorWallet) + return w.(driver.AuditorWallet), nil } // Create the wallet idInfoIdentity, _, err := idInfo.Get() if err != nil { - logger.Errorf("failed to get auditor wallet identity for [%s:%s]: %s", wID, id, err) - return nil + return nil, errors.WithMessagef(err, "failed to get auditor wallet identity for [%s:%s]", wID, id) } newWallet := newAuditorWallet(s, wID, idInfoIdentity) s.AuditorWalletsRegistry.RegisterWallet(wID, newWallet) if err := s.AuditorWalletsRegistry.RegisterIdentity(idInfoIdentity, wID); err != nil { - panic(fmt.Sprintf("programming error, failed to register recipient identity [%s]", err)) + return nil, errors.WithMessagef(err, "failed to register recipient identity [%s]", wID) } logger.Debugf("created auditor wallet [%s]", wID) - return newWallet + return newWallet, nil } -func (s *Service) CertifierWallet(id string) driver.CertifierWallet { - return nil +func (s *Service) CertifierWallet(id string) (driver.CertifierWallet, error) { + return nil, nil } -func (s *Service) CertifierWalletByIdentity(id view.Identity) driver.CertifierWallet { - return nil +func (s *Service) CertifierWalletByIdentity(identity view.Identity) (driver.CertifierWallet, error) { + return nil, nil } // SpentIDs returns the spend ids for the passed token ids diff --git a/token/core/identity/msp/common/common.go b/token/core/identity/msp/common/common.go index 7a9c66a2b..44d347861 100644 --- a/token/core/identity/msp/common/common.go +++ b/token/core/identity/msp/common/common.go @@ -7,7 +7,6 @@ SPDX-License-Identifier: Apache-2.0 package common import ( - "fmt" "reflect" "github.com/hyperledger-labs/fabric-smart-client/platform/fabric/driver" @@ -15,6 +14,7 @@ import ( "github.com/hyperledger-labs/fabric-smart-client/platform/view/core/sig" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/kvs" "github.com/hyperledger-labs/fabric-smart-client/platform/view/view" + "github.com/pkg/errors" ) type KVS interface { @@ -75,10 +75,10 @@ type DeserializerManager interface { AddDeserializer(deserializer sig.Deserializer) } -func GetDeserializerManager(sp view2.ServiceProvider) DeserializerManager { +func GetDeserializerManager(sp view2.ServiceProvider) (DeserializerManager, error) { dm, err := sp.GetService(reflect.TypeOf((*DeserializerManager)(nil))) if err != nil { - panic(fmt.Sprintf("failed looking up deserializer manager [%s]", err)) + return nil, errors.WithMessagef(err, "failed looking up deserializer manager") } - return dm.(DeserializerManager) + return dm.(DeserializerManager), nil } diff --git a/token/core/identity/msp/idemix/common.go b/token/core/identity/msp/idemix/common.go index 105e47317..33a7aba42 100644 --- a/token/core/identity/msp/idemix/common.go +++ b/token/core/identity/msp/idemix/common.go @@ -93,7 +93,7 @@ func (c *Common) DeserializeWithNymEID(raw view.Identity, checkValidity bool, ny } } - id := NewIdentityWithVerType( + id, err := NewIdentityWithVerType( idCommon, NymPublicKey, role, @@ -101,6 +101,9 @@ func (c *Common) DeserializeWithNymEID(raw view.Identity, checkValidity bool, ny serialized.Proof, c.VerType, ) + if err != nil { + return nil, errors.Wrap(err, "cannot deserialize") + } if checkValidity { if err := id.Validate(); err != nil { return nil, errors.Wrap(err, "cannot deserialize, invalid identity") diff --git a/token/core/identity/msp/idemix/id.go b/token/core/identity/msp/idemix/id.go index 4de8bdb23..97cac4815 100644 --- a/token/core/identity/msp/idemix/id.go +++ b/token/core/identity/msp/idemix/id.go @@ -8,7 +8,6 @@ package idemix import ( "bytes" - "fmt" "time" bccsp "github.com/IBM/idemix/bccsp/schemes" @@ -32,11 +31,11 @@ type Identity struct { VerificationType bccsp.VerificationType } -func NewIdentity(provider *Common, NymPublicKey bccsp.Key, role *m.MSPRole, ou *m.OrganizationUnit, proof []byte) *Identity { +func NewIdentity(provider *Common, NymPublicKey bccsp.Key, role *m.MSPRole, ou *m.OrganizationUnit, proof []byte) (*Identity, error) { return NewIdentityWithVerType(provider, NymPublicKey, role, ou, proof, bccsp.ExpectEidNym) } -func NewIdentityWithVerType(common *Common, NymPublicKey bccsp.Key, role *m.MSPRole, ou *m.OrganizationUnit, proof []byte, verificationType bccsp.VerificationType) *Identity { +func NewIdentityWithVerType(common *Common, NymPublicKey bccsp.Key, role *m.MSPRole, ou *m.OrganizationUnit, proof []byte, verificationType bccsp.VerificationType) (*Identity, error) { id := &Identity{} id.Common = common id.NymPublicKey = NymPublicKey @@ -47,14 +46,13 @@ func NewIdentityWithVerType(common *Common, NymPublicKey bccsp.Key, role *m.MSPR raw, err := NymPublicKey.Bytes() if err != nil { - panic(fmt.Sprintf("unexpected condition, failed marshalling nym public key [%s]", err)) + return nil, errors.WithMessagef(err, "unexpected condition, failed marshalling nym public key") } id.ID = &msp.IdentityIdentifier{ Mspid: common.Name, Id: bytes.NewBuffer(raw).String(), } - - return id + return id, nil } func (id *Identity) Anonymous() bool { @@ -107,7 +105,7 @@ func (id *Identity) Verify(msg []byte, sig []byte) error { } func (id *Identity) SatisfiesPrincipal(principal *m.MSPPrincipal) error { - panic("not implemented yet") + return errors.Errorf("not implemented") } func (id *Identity) Serialize() ([]byte, error) { @@ -178,7 +176,7 @@ func (id *Identity) verifyProof() error { }, ) if err == nil && !valid { - panic("unexpected condition, an error should be returned for an invalid signature") + return errors.Errorf("invalid signature") } return err diff --git a/token/core/identity/msp/idemix/wallet.go b/token/core/identity/msp/idemix/wallet.go index 74b214d0e..1bee5fd1d 100644 --- a/token/core/identity/msp/idemix/wallet.go +++ b/token/core/identity/msp/idemix/wallet.go @@ -9,6 +9,7 @@ package idemix import ( "github.com/hyperledger-labs/fabric-smart-client/platform/view/view" "github.com/hyperledger-labs/fabric-token-sdk/token/driver" + "github.com/pkg/errors" "go.uber.org/zap/zapcore" ) @@ -53,7 +54,7 @@ func (w *wallet) GetIdentityInfo(id string) driver.IdentityInfo { } // MapToID returns the identity for the given argument -func (w *wallet) MapToID(v interface{}) (view.Identity, string) { +func (w *wallet) MapToID(v interface{}) (view.Identity, string, error) { defaultID := w.localMembership.DefaultNetworkIdentity() defaultIdentifier := w.localMembership.GetDefaultIdentifier() @@ -78,27 +79,27 @@ func (w *wallet) MapToID(v interface{}) (view.Identity, string) { if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[AnonymousIdentity] passed empty identity") } - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case id.Equal(defaultID): if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[AnonymousIdentity] passed default identity") } - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case string(id) == defaultIdentifier: if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[AnonymousIdentity] passed 'idemix' identity") } - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case id.Equal(w.nodeIdentity): if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[AnonymousIdentity] passed identity is the node identity (same bytes)") } - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case w.localMembership.IsMe(id): if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[AnonymousIdentity] passed identity is me") } - return id, "" + return id, "", nil } label := string(id) if logger.IsEnabledFor(zapcore.DebugLevel) { @@ -106,12 +107,12 @@ func (w *wallet) MapToID(v interface{}) (view.Identity, string) { } if idIdentifier, err := w.localMembership.GetIdentifier(id); err == nil { - return nil, idIdentifier + return nil, idIdentifier, nil } if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[AnonymousIdentity] cannot find match for view.Identity string [%s]", vv) } - return nil, string(id) + return nil, string(id), nil case string: label := vv if logger.IsEnabledFor(zapcore.DebugLevel) { @@ -119,30 +120,30 @@ func (w *wallet) MapToID(v interface{}) (view.Identity, string) { } switch { case len(label) == 0: - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case label == defaultIdentifier: - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case label == defaultID.UniqueID(): - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case label == string(defaultID): - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case defaultID.Equal(view.Identity(label)): - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case w.nodeIdentity.Equal(view.Identity(label)): - return nil, defaultIdentifier + return nil, defaultIdentifier, nil case w.localMembership.IsMe(view.Identity(label)): - return nil, defaultIdentifier + return nil, defaultIdentifier, nil } if idIdentifier, err := w.localMembership.GetIdentifier(view.Identity(label)); err == nil { - return nil, idIdentifier + return nil, idIdentifier, nil } if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[AnonymousIdentity] cannot find match for view.Identity string [%s]", vv) } - return nil, label + return nil, label, nil default: - panic("[AnonymousIdentity] identifier not recognised, expected []byte or view.Identity") + return nil, "", errors.Errorf("[AnonymousIdentity] identifier not recognised, expected []byte or view.Identity") } } diff --git a/token/core/identity/msp/wf.go b/token/core/identity/msp/wf.go index cba3f6580..ec026c210 100644 --- a/token/core/identity/msp/wf.go +++ b/token/core/identity/msp/wf.go @@ -79,13 +79,18 @@ func (f *WalletFactory) NewIdemixWallet(role driver.IdentityRole) (identity.Wall if err != nil { return nil, errors.Wrapf(err, "failed to get identities for role [%d]", role) } + + dm, err := common.GetDeserializerManager(f.SP) + if err != nil { + return nil, err + } lm := idemix.NewLocalMembership( f.SP, f.ConfigManager, f.NetworkDefaultIdentity, f.SignerService, f.BinderService, - common.GetDeserializerManager(f.SP), + dm, kvs.GetService(f.SP), RoleToMSPID[role], ) @@ -101,12 +106,16 @@ func (f *WalletFactory) NewX509Wallet(role driver.IdentityRole) (identity.Wallet if err != nil { return nil, errors.Wrapf(err, "failed to get identities for role [%d]", role) } + dm, err := common.GetDeserializerManager(f.SP) + if err != nil { + return nil, err + } lm := x509.NewLocalMembership( f.ConfigManager, f.NetworkDefaultIdentity, f.SignerService, f.BinderService, - common.GetDeserializerManager(f.SP), + dm, kvs.GetService(f.SP), RoleToMSPID[role], ) diff --git a/token/core/identity/msp/x509/lm.go b/token/core/identity/msp/x509/lm.go index 6b81e92a0..f9f35d3c4 100644 --- a/token/core/identity/msp/x509/lm.go +++ b/token/core/identity/msp/x509/lm.go @@ -7,7 +7,6 @@ SPDX-License-Identifier: Apache-2.0 package x509 import ( - "fmt" "io/ioutil" "path/filepath" "sync" @@ -190,7 +189,9 @@ func (lm *LocalMembership) registerMSPProvider(c *config.Identity, translatedPat logger.Debugf("Adding x509 wallet resolver [%s:%s:%s]", c.ID, provider.EnrollmentID(), walletId.String()) lm.deserializerManager.AddDeserializer(provider) - lm.addResolver(c.ID, provider.EnrollmentID(), setDefault, provider.Identity) + if err := lm.addResolver(c.ID, provider.EnrollmentID(), setDefault, provider.Identity); err != nil { + return err + } return nil } @@ -213,7 +214,7 @@ func (lm *LocalMembership) registerMSPProviders(c *config.Identity, translatedPa return nil } -func (lm *LocalMembership) addResolver(id string, eID string, defaultID bool, IdentityGetter common.GetIdentityFunc) { +func (lm *LocalMembership) addResolver(id string, eID string, defaultID bool, IdentityGetter common.GetIdentityFunc) error { logger.Debugf("Adding resolver [%s:%s]", id, eID) lm.resolversMutex.Lock() defer lm.resolversMutex.Unlock() @@ -221,10 +222,10 @@ func (lm *LocalMembership) addResolver(id string, eID string, defaultID bool, Id if lm.binderService != nil { id, _, err := IdentityGetter(nil) if err != nil { - panic(fmt.Sprintf("cannot get identity for [%s,%s][%s]", id, eID, err)) + return errors.WithMessagef(err, "cannot get identity for [%s,%s]", id, eID) } if err := lm.binderService.Bind(lm.defaultNetworkIdentity, id); err != nil { - panic(fmt.Sprintf("cannot bing identity for [%s,%s][%s]", id, eID, err)) + return errors.WithMessagef(err, "cannot bing identity for [%s,%s]", id, eID) } } @@ -236,7 +237,7 @@ func (lm *LocalMembership) addResolver(id string, eID string, defaultID bool, Id } identity, _, err := IdentityGetter(nil) if err != nil { - panic(fmt.Sprintf("cannot get identity for [%s,%s][%s]", id, eID, err)) + return errors.WithMessagef(err, "cannot get identity for [%s,%s]", id, eID) } lm.bccspResolversByIdentity[identity.String()] = resolver lm.resolversByName[id] = resolver @@ -244,6 +245,8 @@ func (lm *LocalMembership) addResolver(id string, eID string, defaultID bool, Id lm.resolversByEnrollmentID[eID] = resolver } lm.resolvers = append(lm.resolvers, resolver) + + return nil } func (lm *LocalMembership) getResolver(label string) *common.Resolver { diff --git a/token/core/identity/msp/x509/wallet.go b/token/core/identity/msp/x509/wallet.go index 51c9ee0f7..21f4f0217 100644 --- a/token/core/identity/msp/x509/wallet.go +++ b/token/core/identity/msp/x509/wallet.go @@ -9,6 +9,7 @@ package x509 import ( "github.com/hyperledger-labs/fabric-smart-client/platform/view/view" "github.com/hyperledger-labs/fabric-token-sdk/token/driver" + "github.com/pkg/errors" "go.uber.org/zap/zapcore" ) @@ -53,7 +54,7 @@ func (w *wallet) GetIdentityInfo(id string) driver.IdentityInfo { } // MapToID returns the identity for the given argument -func (w *wallet) MapToID(v interface{}) (view.Identity, string) { +func (w *wallet) MapToID(v interface{}) (view.Identity, string, error) { defaultID := w.localMembership.DefaultNetworkIdentity() defaultIdentifier := w.localMembership.GetDefaultIdentifier() @@ -79,21 +80,21 @@ func (w *wallet) MapToID(v interface{}) (view.Identity, string) { id := vv switch { case id.IsNone(): - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil case id.Equal(defaultID): - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil case id.Equal(w.nodeIdentity): - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil case w.localMembership.IsMe(id): if idIdentifier, err := w.localMembership.GetIdentifier(id); err == nil { - return id, idIdentifier + return id, idIdentifier, nil } if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("failed getting identity info for [%s], returning the identity", id) } - return id, "" + return id, "", nil case string(id) == defaultIdentifier: - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil } label := string(id) @@ -103,18 +104,18 @@ func (w *wallet) MapToID(v interface{}) (view.Identity, string) { if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("failed getting identity info for [%s], returning the identity", id) } - return nil, info.ID() + return nil, info.ID(), nil } - return id, label + return id, label, nil } if idIdentifier, err := w.localMembership.GetIdentifier(id); err == nil { - return id, idIdentifier + return id, idIdentifier, nil } if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[LongTermIdentity] cannot find match for view.Identity string [%s]", vv) } - return id, "" + return id, "", nil case string: label := vv if logger.IsEnabledFor(zapcore.DebugLevel) { @@ -122,26 +123,26 @@ func (w *wallet) MapToID(v interface{}) (view.Identity, string) { } switch { case len(label) == 0: - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil case label == defaultIdentifier: - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil case label == defaultID.UniqueID(): - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil case label == string(defaultID): - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil case defaultID.Equal(view.Identity(label)): - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil case w.nodeIdentity.Equal(view.Identity(label)): - return defaultID, defaultIdentifier + return defaultID, defaultIdentifier, nil case w.localMembership.IsMe(view.Identity(label)): id := view.Identity(label) if idIdentifier, err := w.localMembership.GetIdentifier(id); err == nil { - return id, idIdentifier + return id, idIdentifier, nil } if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[LongTermIdentity] failed getting identity info for [%s], returning the identity", id) } - return id, "" + return id, "", nil } if info, err := w.localMembership.GetIdentityInfo(label, nil); err == nil { @@ -150,16 +151,16 @@ func (w *wallet) MapToID(v interface{}) (view.Identity, string) { if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("failed getting identity info for [%s], returning the identity", id) } - return nil, info.ID() + return nil, info.ID(), nil } - return id, label + return id, label, nil } if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("[LongTermIdentity] cannot find match for view.Identity string [%s]", vv) } - return nil, label + return nil, label, nil default: - panic("[LongTermIdentity] identifier not recognised, expected []byte or view.Identity") + return nil, "", errors.Errorf("[LongTermIdentity] identifier not recognised, expected []byte or view.Identity") } } diff --git a/token/core/identity/provider.go b/token/core/identity/provider.go index 38e709a33..70dc2b374 100644 --- a/token/core/identity/provider.go +++ b/token/core/identity/provider.go @@ -71,7 +71,10 @@ func (p *Provider) LookupIdentifier(role driver.IdentityRole, v interface{}) (vi if !ok { return nil, "", errors.Errorf("wallet not found for role [%d]", role) } - id, label := wallet.MapToID(v) + id, label, err := wallet.MapToID(v) + if err != nil { + return nil, "", err + } if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("identifier for [%v] is [%s,%s]", v, id, walletIDToString(label)) } diff --git a/token/core/identity/wallet.go b/token/core/identity/wallet.go index 10761192c..68500be91 100644 --- a/token/core/identity/wallet.go +++ b/token/core/identity/wallet.go @@ -14,7 +14,7 @@ import ( // Wallet helps to find identity identifiers and retrieve the corresponding identities type Wallet interface { // MapToID returns the identity for the given argument - MapToID(v interface{}) (view.Identity, string) + MapToID(v interface{}) (view.Identity, string, error) // GetIdentityInfo returns the identity information for the given identity identifier GetIdentityInfo(id string) driver.IdentityInfo // RegisterIdentity registers the given identity diff --git a/token/core/zkatdlog/crypto/common/identity.go b/token/core/zkatdlog/crypto/common/identity.go index 9acf72762..139d6b922 100644 --- a/token/core/zkatdlog/crypto/common/identity.go +++ b/token/core/zkatdlog/crypto/common/identity.go @@ -7,14 +7,12 @@ package common import ( "github.com/hyperledger-labs/fabric-smart-client/platform/view/view" - "github.com/pkg/errors" - "github.com/hyperledger-labs/fabric-token-sdk/token/driver" + "github.com/pkg/errors" ) //go:generate counterfeiter -o ../mock/signing_identity.go -fake-name SigningIdentity . SigningIdentity -// signing identity type SigningIdentity interface { driver.SigningIdentity } @@ -24,17 +22,13 @@ type WrappedSigningIdentity struct { Signer driver.Signer } -func (S *WrappedSigningIdentity) Serialize() ([]byte, error) { - return S.Identity, nil -} - -func (S *WrappedSigningIdentity) Verify(message []byte, signature []byte) error { - panic("implement me") +func (w *WrappedSigningIdentity) Serialize() ([]byte, error) { + return w.Identity, nil } -func (S *WrappedSigningIdentity) Sign(raw []byte) ([]byte, error) { - if S.Signer == nil { +func (w *WrappedSigningIdentity) Sign(raw []byte) ([]byte, error) { + if w.Signer == nil { return nil, errors.New("please initialize signing identity in WrappedSigningIdentity") } - return S.Signer.Sign(raw) + return w.Signer.Sign(raw) } diff --git a/token/core/zkatdlog/crypto/ppm/ppm.go b/token/core/zkatdlog/crypto/ppm/ppm.go index 1f130bd57..10de789a1 100644 --- a/token/core/zkatdlog/crypto/ppm/ppm.go +++ b/token/core/zkatdlog/crypto/ppm/ppm.go @@ -62,7 +62,7 @@ func (v *PublicParamsManager) SerializePublicParameters() ([]byte, error) { } func (v *PublicParamsManager) NewCertifierKeyPair() ([]byte, []byte, error) { - panic("not supported") + return nil, nil, errors.Errorf("not supported") } func (v *PublicParamsManager) Load() error { diff --git a/token/core/zkatdlog/nogh/issuer.go b/token/core/zkatdlog/nogh/issuer.go index e41ed1daf..c16d2bcf2 100644 --- a/token/core/zkatdlog/nogh/issuer.go +++ b/token/core/zkatdlog/nogh/issuer.go @@ -26,7 +26,11 @@ func (s *Service) Issue(issuerIdentity view.Identity, typ string, values []uint6 } } - signer, err := s.IssuerWalletByIdentity(issuerIdentity).GetSigner(issuerIdentity) + w, err := s.IssuerWalletByIdentity(issuerIdentity) + if err != nil { + return nil, nil, nil, err + } + signer, err := w.GetSigner(issuerIdentity) if err != nil { return nil, nil, nil, err } diff --git a/token/core/zkatdlog/nogh/sender.go b/token/core/zkatdlog/nogh/sender.go index fe8fda90a..73370bf01 100644 --- a/token/core/zkatdlog/nogh/sender.go +++ b/token/core/zkatdlog/nogh/sender.go @@ -122,7 +122,8 @@ func (s *Service) Transfer(txID string, wallet driver.OwnerWallet, ids []*token3 receiverIsSender := make([]bool, len(ownerIdentities)) for i, receiver := range ownerIdentities { - receiverIsSender[i] = s.OwnerWalletByID(receiver) != nil + _, err := s.OwnerWalletByID(receiver) + receiverIsSender[i] = err == nil } metadata := &driver.TransferMetadata{ diff --git a/token/core/zkatdlog/nogh/service.go b/token/core/zkatdlog/nogh/service.go index 46e8ce0cb..4581fd0ec 100644 --- a/token/core/zkatdlog/nogh/service.go +++ b/token/core/zkatdlog/nogh/service.go @@ -131,16 +131,13 @@ func (s *Service) IdentityProvider() driver.IdentityProvider { } // Validator returns the validator associated with the service -func (s *Service) Validator() driver.Validator { +func (s *Service) Validator() (driver.Validator, error) { d, err := s.Deserializer() if err != nil { - panic(err) + return nil, errors.WithMessagef(err, "failed to get deserializer") } pp := s.PublicParams() - return validator.New( - pp, - d, - ) + return validator.New(pp, d), nil } // PublicParamsManager returns the manager of the public parameters associated with the service diff --git a/token/core/zkatdlog/nogh/wallet.go b/token/core/zkatdlog/nogh/wallet.go index 2442922e3..3bcde46e7 100644 --- a/token/core/zkatdlog/nogh/wallet.go +++ b/token/core/zkatdlog/nogh/wallet.go @@ -7,8 +7,6 @@ SPDX-License-Identifier: Apache-2.0 package nogh import ( - "fmt" - view2 "github.com/hyperledger-labs/fabric-smart-client/platform/view" "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/hash" "github.com/hyperledger-labs/fabric-smart-client/platform/view/view" @@ -59,124 +57,120 @@ func (s *Service) RegisterRecipientIdentity(id view.Identity, auditInfo []byte, } func (s *Service) Wallet(identity view.Identity) driver.Wallet { - w := s.OwnerWalletByIdentity(identity) + w, _ := s.OwnerWalletByIdentity(identity) if w != nil { return w } - iw := s.IssuerWalletByIdentity(identity) + iw, _ := s.IssuerWalletByIdentity(identity) if iw != nil { return iw } return nil } -func (s *Service) OwnerWallet(walletID string) driver.OwnerWallet { - return s.OwnerWalletByID(walletID) +func (s *Service) OwnerWallet(id string) (driver.OwnerWallet, error) { + return s.OwnerWalletByID(id) } -func (s *Service) OwnerWalletByIdentity(identity view.Identity) driver.OwnerWallet { +func (s *Service) OwnerWalletByIdentity(identity view.Identity) (driver.OwnerWallet, error) { return s.OwnerWalletByID(identity) } -func (s *Service) OwnerWalletByID(id interface{}) driver.OwnerWallet { +func (s *Service) OwnerWalletByID(id interface{}) (driver.OwnerWallet, error) { s.OwnerWalletsRegistry.Lock() defer s.OwnerWalletsRegistry.Unlock() // check if there is already a wallet w, idInfo, wID, err := s.OwnerWalletsRegistry.Lookup(id) if err != nil { - logger.Errorf("failed to lookup identity for owner wallet [%s]", err) - return nil + return nil, errors.WithMessagef(err, "failed to lookup identity for owner wallet [%v]", id) } if w != nil { - return w.(driver.OwnerWallet) + return w.(driver.OwnerWallet), nil } // Create the wallet newWallet := newOwnerWallet(s, wID, idInfo) logger.Debugf("created owner wallet [%s]", wID) - return newWallet + return newWallet, nil } -func (s *Service) IssuerWallet(id string) driver.IssuerWallet { +func (s *Service) IssuerWallet(id string) (driver.IssuerWallet, error) { return s.issuerWallet(id) } -func (s *Service) IssuerWalletByIdentity(id view.Identity) driver.IssuerWallet { - return s.issuerWallet(id) +func (s *Service) IssuerWalletByIdentity(identity view.Identity) (driver.IssuerWallet, error) { + return s.issuerWallet(identity) } -func (s *Service) issuerWallet(id interface{}) driver.IssuerWallet { +func (s *Service) issuerWallet(id interface{}) (driver.IssuerWallet, error) { s.IssuerWalletsRegistry.Lock() defer s.IssuerWalletsRegistry.Unlock() // check if there is already a wallet w, idInfo, wID, err := s.IssuerWalletsRegistry.Lookup(id) if err != nil { - logger.Errorf("failed to lookup identity for issuer wallet [%s]", err) - return nil + return nil, errors.WithMessagef(err, "failed to lookup identity for issuer wallet [%v]", id) } if w != nil { - return w.(driver.IssuerWallet) + return w.(driver.IssuerWallet), nil } // Create the wallet idInfoIdentity, _, err := idInfo.Get() if err != nil { - logger.Errorf("failed to get issuer wallet identity for [%s]: %s", wID, err) - return nil + return nil, errors.WithMessagef(err, "failed to get issuer wallet identity for [%s]", wID) } newWallet := newIssuerWallet(s, wID, idInfoIdentity) s.IssuerWalletsRegistry.RegisterWallet(wID, newWallet) if err := s.IssuerWalletsRegistry.RegisterIdentity(idInfoIdentity, wID); err != nil { - panic(fmt.Sprintf("programming error, failed to register recipient identity [%s]", err)) + return nil, errors.WithMessagef(err, "programming error, failed to register recipient identity [%s]", wID) } logger.Debugf("created issuer wallet [%s]", wID) - return newWallet + return newWallet, nil } -func (s *Service) AuditorWallet(id string) driver.AuditorWallet { +func (s *Service) AuditorWallet(id string) (driver.AuditorWallet, error) { return s.auditorWallet(id) } -func (s *Service) AuditorWalletByIdentity(id view.Identity) driver.AuditorWallet { - return s.auditorWallet(id) +func (s *Service) AuditorWalletByIdentity(identity view.Identity) (driver.AuditorWallet, error) { + return s.auditorWallet(identity) } -func (s *Service) auditorWallet(id interface{}) driver.AuditorWallet { +func (s *Service) auditorWallet(id interface{}) (driver.AuditorWallet, error) { s.AuditorWalletsRegistry.Lock() defer s.AuditorWalletsRegistry.Unlock() // check if there is already a wallet w, idInfo, wID, err := s.AuditorWalletsRegistry.Lookup(id) if err != nil { - logger.Errorf("failed to lookup identity for auditor wallet [%s]", err) - return nil + return nil, errors.WithMessagef(err, "failed to lookup identity for auditor wallet [%v]", id) } if w != nil { - return w.(driver.AuditorWallet) + return w.(driver.AuditorWallet), nil } // Create the wallet idInfoIdentity, _, err := idInfo.Get() if err != nil { - logger.Errorf("failed to get auditor wallet identity for [%s:%s]: %s", wID, id, err) + return nil, errors.WithMessagef(err, "failed to get auditor wallet identity for [%s:%s]", wID, id) } newWallet := newAuditorWallet(s, wID, idInfoIdentity) s.AuditorWalletsRegistry.RegisterWallet(wID, newWallet) if err := s.AuditorWalletsRegistry.RegisterIdentity(idInfoIdentity, wID); err != nil { - panic(fmt.Sprintf("programming error, failed to register recipient identity [%s]", err)) + return nil, errors.WithMessagef(err, "programming error, failed to register recipient identity [%s]", wID) } logger.Debugf("created auditor wallet [%s]", wID) - return newWallet + return newWallet, nil } -func (s *Service) CertifierWallet(id string) driver.CertifierWallet { - return nil +func (s *Service) CertifierWallet(id string) (driver.CertifierWallet, error) { + return nil, nil } -func (s *Service) CertifierWalletByIdentity(id view.Identity) driver.CertifierWallet { - return nil +func (s *Service) CertifierWalletByIdentity(identity view.Identity) (driver.CertifierWallet, error) { + return nil, nil } // SpentIDs returns the spend ids for the passed token ids diff --git a/token/driver/sig.go b/token/driver/sig.go index 81d20d693..9785859c6 100644 --- a/token/driver/sig.go +++ b/token/driver/sig.go @@ -11,9 +11,6 @@ type SigningIdentity interface { // Sign signs message bytes and returns the signature or an error on failure. Sign(raw []byte) ([]byte, error) - // Verify verifies a signature over a message - Verify(message, sigma []byte) error - // Serialize serializes the signing identity Serialize() ([]byte, error) } diff --git a/token/driver/tms.go b/token/driver/tms.go index 8856192ee..2ee6ede0c 100644 --- a/token/driver/tms.go +++ b/token/driver/tms.go @@ -20,7 +20,7 @@ type TokenManagerService interface { Serializer IdentityProvider() IdentityProvider - Validator() Validator + Validator() (Validator, error) PublicParamsManager() PublicParamsManager ConfigManager() config.Manager } diff --git a/token/driver/wallet.go b/token/driver/wallet.go index 50e49fe7f..9ef8ed6cd 100644 --- a/token/driver/wallet.go +++ b/token/driver/wallet.go @@ -108,31 +108,31 @@ type WalletService interface { // OwnerWallet returns an instance of the OwnerWallet interface bound to the passed id. // The id can be: the wallet identifier or a unique id of a view identity belonging to the wallet. - OwnerWallet(id string) OwnerWallet + OwnerWallet(id string) (OwnerWallet, error) // OwnerWalletByIdentity returns the OwnerWallet the passed identity belongs to. - OwnerWalletByIdentity(identity view.Identity) OwnerWallet + OwnerWalletByIdentity(identity view.Identity) (OwnerWallet, error) // IssuerWallet returns an instance of the IssuerWallet interface bound to the passed id. // The id can be: the wallet identifier or a unique id of a view identity belonging to the wallet. - IssuerWallet(id string) IssuerWallet + IssuerWallet(id string) (IssuerWallet, error) // IssuerWalletByIdentity returns an instance of the IssuerWallet interface that contains the passed identity. - IssuerWalletByIdentity(identity view.Identity) IssuerWallet + IssuerWalletByIdentity(identity view.Identity) (IssuerWallet, error) // AuditorWalletByIdentity returns an instance of the AuditorWallet interface that contains the passed identity. - AuditorWalletByIdentity(identity view.Identity) AuditorWallet + AuditorWalletByIdentity(identity view.Identity) (AuditorWallet, error) // AuditorWallet returns an instance of the AuditorWallet interface bound to the passed id. // The id can be: the wallet identifier or a unique id of a view identity belonging to the wallet. - AuditorWallet(id string) AuditorWallet + AuditorWallet(id string) (AuditorWallet, error) // CertifierWallet returns an instance of the CertifierWallet interface bound to the passed id. // The id can be: the wallet identifier or a unique id of a view identity belonging to the wallet. - CertifierWallet(id string) CertifierWallet + CertifierWallet(id string) (CertifierWallet, error) // CertifierWalletByIdentity returns an instance of the CertifierWallet interface that contains the passed identity. - CertifierWalletByIdentity(identity view.Identity) CertifierWallet + CertifierWalletByIdentity(identity view.Identity) (CertifierWallet, error) // SpentIDs returns the spend ids for the passed token ids SpentIDs(ids ...*token.ID) ([]string, error) diff --git a/token/provider.go b/token/provider.go index 720a1c3d9..9e2ca4c64 100644 --- a/token/provider.go +++ b/token/provider.go @@ -18,7 +18,7 @@ var ( // Normalizer is used to set default values of ServiceOptions struct, if needed. type Normalizer interface { // Normalize normalizes the given ServiceOptions struct. - Normalize(opt *ServiceOptions) *ServiceOptions + Normalize(opt *ServiceOptions) (*ServiceOptions, error) } // VaultProvider provides token vault instances @@ -81,9 +81,12 @@ func NewManagementServiceProvider( func (p *ManagementServiceProvider) GetManagementService(opts ...ServiceOption) (*ManagementService, error) { opt, err := CompileServiceOptions(opts...) if err != nil { - return nil, errors.Wrapf(err, "failed to parse options") + return nil, errors.Wrap(err, "failed to compile options") + } + opt, err = p.normalizer.Normalize(opt) + if err != nil { + return nil, errors.Wrap(err, "failed to normalize options") } - opt = p.normalizer.Normalize(opt) logger.Debugf("get tms for [%s,%s,%s]", opt.Network, opt.Channel, opt.Namespace) tokenService, err := p.tmsProvider.GetTokenManagerService( @@ -93,7 +96,6 @@ func (p *ManagementServiceProvider) GetManagementService(opts ...ServiceOption) opt.PublicParamsFetcher, ) if err != nil { - logger.Errorf("failed getting TMS for [%s]: [%s]", opt.TMSID(), err) return nil, errors.Wrapf(err, "failed getting TMS for [%s]", opt.TMSID()) } @@ -115,7 +117,9 @@ func (p *ManagementServiceProvider) GetManagementService(opts ...ServiceOption) }, nil } -// GetManagementServiceProvider returns the management service provider from the passed service provider +// GetManagementServiceProvider returns the management service provider from the passed service provider. +// The function panics if an error occurs. +// An alternative way is to use `s, err := sp.GetService(&ManagementServiceProvider{}) and catch the error manually.` func GetManagementServiceProvider(sp ServiceProvider) *ManagementServiceProvider { s, err := sp.GetService(managementServiceProviderIndex) if err != nil { diff --git a/token/request.go b/token/request.go index 819695b48..b43d4de84 100644 --- a/token/request.go +++ b/token/request.go @@ -1057,7 +1057,10 @@ func (r *Request) prepareTransfer(redeem bool, wallet *OwnerWallet, tokenType st if r.TokenService.PublicParametersManager().GraphHiding() { logger.Debugf("graph hiding enabled, request certification") // Check token certification - cc := r.TokenService.CertificationClient() + cc, err := r.TokenService.CertificationClient() + if err != nil { + return nil, nil, errors.WithMessagef(err, "cannot get certification client") + } if err := cc.RequestCertification(tokenIDs...); err != nil { return nil, nil, errors.WithMessagef(err, "failed certifiying inputs") } diff --git a/token/sdk/network/normalizer.go b/token/sdk/network/normalizer.go index 160745fc6..66a5df691 100644 --- a/token/sdk/network/normalizer.go +++ b/token/sdk/network/normalizer.go @@ -13,6 +13,7 @@ import ( "github.com/hyperledger-labs/fabric-smart-client/platform/view/services/flogging" "github.com/hyperledger-labs/fabric-token-sdk/token" "github.com/hyperledger-labs/fabric-token-sdk/token/services/vault/keys" + "github.com/pkg/errors" ) var ( @@ -42,7 +43,7 @@ func NewNormalizer(cp TokenSDKConfig, sp view.ServiceProvider) *Normalizer { // Normalize normalizes the passed options. // If no network is specified, it will try to find a default network. And so on. -func (n *Normalizer) Normalize(opt *token.ServiceOptions) *token.ServiceOptions { +func (n *Normalizer) Normalize(opt *token.ServiceOptions) (*token.ServiceOptions, error) { if len(opt.Network) == 0 { if fns := fabric.GetDefaultFNS(n.sp); fns != nil { logger.Debugf("No network specified, using default FNS: %s", fns.Name()) @@ -51,8 +52,7 @@ func (n *Normalizer) Normalize(opt *token.ServiceOptions) *token.ServiceOptions logger.Debugf("No network specified, using default ONS: %s", ons.Name()) opt.Network = ons.Name() } else { - logger.Errorf("No network specified, and no default FNS or ONS found") - panic("no network found") + return nil, errors.Errorf("No network specified, and no default FNS or ONS found") } } @@ -64,8 +64,7 @@ func (n *Normalizer) Normalize(opt *token.ServiceOptions) *token.ServiceOptions logger.Debugf("No need to specify channel for orion") // Nothing to do here } else { - logger.Errorf("No channel specified, and no default channel found") - panic("no network found for " + opt.Network) + return nil, errors.Errorf("No channel specified, and no default channel found") } } @@ -81,5 +80,5 @@ func (n *Normalizer) Normalize(opt *token.ServiceOptions) *token.ServiceOptions if opt.PublicParamsFetcher == nil { opt.PublicParamsFetcher = NewPublicParamsFetcher(n.sp, opt.Network, opt.Channel, opt.Namespace) } - return opt + return opt, nil } diff --git a/token/services/certifier/interactive/client.go b/token/services/certifier/interactive/client.go index e0f7df7d2..9d3322989 100644 --- a/token/services/certifier/interactive/client.go +++ b/token/services/certifier/interactive/client.go @@ -16,6 +16,7 @@ import ( "github.com/hyperledger-labs/fabric-token-sdk/token/driver" "github.com/hyperledger-labs/fabric-token-sdk/token/services/network" "github.com/hyperledger-labs/fabric-token-sdk/token/token" + "github.com/pkg/errors" ) var logger = flogging.MustGetLogger("token-sdk.certifier.interactive") @@ -103,7 +104,7 @@ func (d *CertificationClient) RequestCertification(ids ...*token.ID) error { } certifications, ok := resultBoxed.(map[*token.ID][]byte) if !ok { - panic("invalid type, expected map[token.ID][]byte") + return errors.Errorf("invalid type, expected map[token.ID][]byte") } if err := d.certificationStorage.Store(certifications); err != nil { return err diff --git a/token/services/network/driver/lm.go b/token/services/network/driver/lm.go index 8376a8c8c..31ca65897 100644 --- a/token/services/network/driver/lm.go +++ b/token/services/network/driver/lm.go @@ -19,7 +19,4 @@ type LocalMembership interface { // AnonymousIdentity returns a fresh anonymous identity AnonymousIdentity() view.Identity - - // IsMe returns true if the given identity belongs to the caller - IsMe(id view.Identity) bool } diff --git a/token/services/network/fabric/network.go b/token/services/network/fabric/network.go index 2155fd4ef..ea60b1a3c 100644 --- a/token/services/network/fabric/network.go +++ b/token/services/network/fabric/network.go @@ -32,9 +32,6 @@ import ( ) const ( - IdemixMSP = "idemix" - BccspMSP = "bccsp" - InvokeFunction = "invoke" QueryPublicParamsFunction = "queryPublicParams" QueryTokensFunctions = "queryTokens" @@ -55,59 +52,6 @@ func (n *lm) AnonymousIdentity() view.Identity { return n.lm.AnonymousIdentity() } -func (n *lm) IsMe(id view.Identity) bool { - return n.lm.IsMe(id) -} - -func (n *lm) GetAnonymousIdentity(label string, auditInfo []byte) (string, string, driver.GetFunc, error) { - if idInfo := n.lm.GetIdentityInfoByLabel(IdemixMSP, label); idInfo != nil { - ai := auditInfo - return idInfo.ID, idInfo.EnrollmentID, func() (view.Identity, []byte, error) { - opts := []fabric.IdentityOption{fabric.WithIdemixEIDExtension()} - if len(auditInfo) != 0 { - opts = append(opts, fabric.WithAuditInfo(ai)) - } - return idInfo.GetIdentity(opts...) - }, nil - } - return "", "", nil, errors.New("not found") -} - -func (n *lm) GetLongTermIdentity(label string) (string, string, view.Identity, error) { - if idInfo := n.lm.GetIdentityInfoByLabel(BccspMSP, label); idInfo != nil { - id, _, err := idInfo.GetIdentity() - if err != nil { - return "", "", nil, errors.New("failed to get identity") - } - return idInfo.ID, idInfo.EnrollmentID, id, err - } - return "", "", nil, errors.New("not found") -} - -func (n *lm) GetLongTermIdentifier(id view.Identity) (string, error) { - if idInfo := n.lm.GetIdentityInfoByIdentity(BccspMSP, id); idInfo != nil { - return idInfo.ID, nil - } - return "", errors.New("not found") -} - -func (n *lm) RegisterIdentity(id string, typ string, path string) error { - // split type in type and msp id - typeAndMspID := strings.Split(typ, ":") - if len(typeAndMspID) < 2 { - return errors.Errorf("invalid identity type '%s'", typ) - } - - switch typeAndMspID[0] { - case IdemixMSP: - return n.lm.RegisterIdemixMSP(id, path, typeAndMspID[1]) - case BccspMSP: - return n.lm.RegisterX509MSP(id, path, typeAndMspID[1]) - default: - return errors.Errorf("invalid identity type '%s'", typ) - } -} - type nv struct { v *fabric.Vault tokenVault *vault.Vault diff --git a/token/services/network/fabric/processor.go b/token/services/network/fabric/processor.go index e602731c3..75c49a0c2 100644 --- a/token/services/network/fabric/processor.go +++ b/token/services/network/fabric/processor.go @@ -190,7 +190,7 @@ func (r *RWSetProcessor) tokenRequest(req fabric.Request, tx fabric.ProcessTrans } prefix, components, err := keys.SplitCompositeKey(key) if err != nil { - panic(err) + return errors.WithMessagef(err, "failed to split key [%s]", key) } if prefix != keys.TokenKeyPrefix { if logger.IsEnabledFor(zapcore.DebugLevel) { diff --git a/token/services/network/fabric/tcc/rwset.go b/token/services/network/fabric/tcc/rwset.go index 20c574f5c..3a60891fb 100644 --- a/token/services/network/fabric/tcc/rwset.go +++ b/token/services/network/fabric/tcc/rwset.go @@ -3,6 +3,7 @@ Copyright IBM Corp. All Rights Reserved. SPDX-License-Identifier: Apache-2.0 */ + package tcc import ( @@ -24,14 +25,3 @@ func (rwset *rwsWrapper) GetState(namespace string, key string) ([]byte, error) func (rwset *rwsWrapper) DeleteState(namespace string, key string) error { return rwset.stub.DelState(key) } - -func (rwset *rwsWrapper) Bytes() ([]byte, error) { - return nil, nil -} - -func (rwset *rwsWrapper) Done() { -} - -func (rwset *rwsWrapper) Equals(r interface{}, namespace string) error { - panic("implement me") -} diff --git a/token/services/network/network.go b/token/services/network/network.go index ad4010561..38dbe81eb 100644 --- a/token/services/network/network.go +++ b/token/services/network/network.go @@ -285,10 +285,6 @@ func (l *LocalMembership) AnonymousIdentity() view.Identity { return l.lm.AnonymousIdentity() } -func (l *LocalMembership) IsMe(id view.Identity) bool { - return l.lm.IsMe(id) -} - type Ledger struct { l driver.Ledger } diff --git a/token/services/network/orion/lm.go b/token/services/network/orion/lm.go index 085e7d04f..fbe16e6ec 100644 --- a/token/services/network/orion/lm.go +++ b/token/services/network/orion/lm.go @@ -23,7 +23,3 @@ func (n *lm) DefaultIdentity() view.Identity { func (n *lm) AnonymousIdentity() view.Identity { return view.Identity(n.lm.Me()) } - -func (n *lm) IsMe(id view.Identity) bool { - panic("implement me") -} diff --git a/token/services/network/orion/processor.go b/token/services/network/orion/processor.go index f121aea85..cfb6c6ff5 100644 --- a/token/services/network/orion/processor.go +++ b/token/services/network/orion/processor.go @@ -136,7 +136,7 @@ func (r *RWSetProcessor) tokenRequest(req orion.Request, tx orion.ProcessTransac } prefix, components, err := keys.SplitCompositeKey(strings.ReplaceAll(key, "~", string(rune(0)))) if err != nil { - panic(err) + return errors.WithMessagef(err, "failed to split key [%s]", key) } if prefix != keys.TokenKeyPrefix { if logger.IsEnabledFor(zapcore.DebugLevel) { diff --git a/token/services/network/orion/rwset.go b/token/services/network/orion/rwset.go index 253890cae..16db08943 100644 --- a/token/services/network/orion/rwset.go +++ b/token/services/network/orion/rwset.go @@ -40,18 +40,6 @@ func (r *ReadOnlyRWSWrapper) DeleteState(namespace string, key string) error { panic("programming error: this should not be called") } -func (r *ReadOnlyRWSWrapper) Bytes() ([]byte, error) { - panic("programming error: this should not be called") -} - -func (r *ReadOnlyRWSWrapper) Done() { - panic("programming error: this should not be called") -} - -func (r *ReadOnlyRWSWrapper) Equals(right interface{}, namespace string) error { - panic("programming error: this should not be called") -} - type TxRWSWrapper struct { me string db string @@ -78,17 +66,6 @@ func (r *TxRWSWrapper) DeleteState(namespace string, key string) error { return r.tx.Delete(r.db, key) } -func (r *TxRWSWrapper) Bytes() ([]byte, error) { - return nil, nil -} - -func (r *TxRWSWrapper) Done() { -} - -func (r *TxRWSWrapper) Equals(right interface{}, namespace string) error { - panic("implement me") -} - type RWSWrapper struct { r *orion.RWSet } diff --git a/token/services/network/processor/common.go b/token/services/network/processor/common.go index 2110c7122..70f63c9e7 100644 --- a/token/services/network/processor/common.go +++ b/token/services/network/processor/common.go @@ -80,7 +80,9 @@ func (cts *CommonTokenStore) DeleteFabToken(ns string, txID string, index uint64 return errors.Wrapf(err, "error getting token for key [%s]", outputID) } token := token2.Token{} - UnmarshalOrPanic(tokenRaw, &token) + if err := Unmarshal(tokenRaw, &token); err != nil { + return errors.Wrapf(err, "failed to unmarshal token") + } for _, id := range ids { if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("delete extended key [%s]", id) @@ -127,7 +129,10 @@ func (cts *CommonTokenStore) StoreFabToken(ns string, txID string, index uint64, if err != nil { return errors.Wrapf(err, "error creating output ID: %s", err) } - raw := MarshalOrPanic(tok) + raw, err := Marshal(tok) + if err != nil { + return errors.Wrapf(err, "failed to marshal token") + } if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("transaction [%s], append fabtoken output [%s,%s,%v]", txID, outputID, view.Identity(tok.Owner.Raw), string(raw)) @@ -139,7 +144,11 @@ func (cts *CommonTokenStore) StoreFabToken(ns string, txID string, index uint64, meta := map[string][]byte{} meta[keys.Info] = infoRaw if len(ids) > 0 { - meta[keys.IDs] = MarshalOrPanic(ids) + meta[keys.IDs], err = Marshal(ids) + if err != nil { + return errors.Wrapf(err, "failed to marshal token ids") + } + } if err := rws.SetStateMetadata(ns, outputID, meta); err != nil { return err @@ -193,7 +202,10 @@ func (cts *CommonTokenStore) StoreIssuedHistoryToken(ns string, txID string, ind Raw: issuer, }, } - raw := MarshalOrPanic(issuedToken) + raw, err := Marshal(issuedToken) + if err != nil { + return errors.Wrapf(err, "failed to marshal issued token") + } q, err := token2.ToQuantity(tok.Quantity, precision) if err != nil { @@ -222,7 +234,10 @@ func (cts *CommonTokenStore) StoreAuditToken(ns string, txID string, index uint6 if err != nil { return errors.Wrapf(err, "error creating output ID: %s", err) } - raw := MarshalOrPanic(tok) + raw, err := Marshal(tok) + if err != nil { + return errors.Wrapf(err, "failed to marshal token") + } if logger.IsEnabledFor(zapcore.DebugLevel) { logger.Debugf("transaction [%s], append audit token output [%s,%v]", txID, outputID, string(raw)) @@ -236,18 +251,3 @@ func (cts *CommonTokenStore) StoreAuditToken(ns string, txID string, index uint6 } return nil } - -func MarshalOrPanic(o interface{}) []byte { - data, err := json.Marshal(o) - if err != nil { - panic(err) - } - return data -} - -func UnmarshalOrPanic(raw []byte, o interface{}) { - err := json.Unmarshal(raw, o) - if err != nil { - panic(err) - } -} diff --git a/token/services/network/processor/marshaller.go b/token/services/network/processor/marshaller.go new file mode 100644 index 000000000..34be24b9f --- /dev/null +++ b/token/services/network/processor/marshaller.go @@ -0,0 +1,21 @@ +/* +Copyright IBM Corp. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package processor + +import "encoding/json" + +func Marshal(o interface{}) ([]byte, error) { + data, err := json.Marshal(o) + if err != nil { + return nil, err + } + return data, nil +} + +func Unmarshal(raw []byte, o interface{}) error { + return json.Unmarshal(raw, o) +} diff --git a/token/services/nfttx/uuid.go b/token/services/nfttx/uuid.go index 32211bc42..fa19be5d0 100644 --- a/token/services/nfttx/uuid.go +++ b/token/services/nfttx/uuid.go @@ -13,6 +13,7 @@ import ( ) // GenerateBytesUUID returns a UUID based on RFC 4122 returning the generated bytes +// The function panics in case of an error func GenerateBytesUUID() []byte { uuid := make([]byte, 16) _, err := io.ReadFull(rand.Reader, uuid) diff --git a/token/services/ttxdb/db/memory/memory.go b/token/services/ttxdb/db/memory/memory.go index 73c675e76..946e0812a 100644 --- a/token/services/ttxdb/db/memory/memory.go +++ b/token/services/ttxdb/db/memory/memory.go @@ -9,6 +9,7 @@ package memory import ( "github.com/hyperledger-labs/fabric-token-sdk/token/services/ttxdb" "github.com/hyperledger-labs/fabric-token-sdk/token/services/ttxdb/driver" + "github.com/pkg/errors" view2 "github.com/hyperledger-labs/fabric-smart-client/platform/view" ) @@ -28,7 +29,7 @@ func (p *Persistence) QueryMovements(params driver.QueryMovementsParams) ([]*dri case driver.FromLast: cursor = len(p.movementRecords) default: - panic("direction not valid") + return nil, errors.Errorf("direction not valid") } counter := 0 for { diff --git a/token/services/vault/driver/driver.go b/token/services/vault/driver/driver.go index 4ac77d564..14c734754 100644 --- a/token/services/vault/driver/driver.go +++ b/token/services/vault/driver/driver.go @@ -13,7 +13,6 @@ type RWSet interface { SetState(namespace string, key string, value []byte) error GetState(namespace string, key string) ([]byte, error) DeleteState(namespace string, key string) error - Equals(rwset interface{}, namespace string) error } type Entry interface { diff --git a/token/stream.go b/token/stream.go index c86b9d50d..f9d40a337 100644 --- a/token/stream.go +++ b/token/stream.go @@ -12,6 +12,7 @@ import ( "github.com/hyperledger-labs/fabric-smart-client/platform/view/view" token2 "github.com/hyperledger-labs/fabric-token-sdk/token/token" + "github.com/pkg/errors" ) type QueryService interface { @@ -192,17 +193,17 @@ func (is *InputStream) Owners() *OwnerStream { } // IsAnyMine returns true if any of the inputs are mine -func (is *InputStream) IsAnyMine() bool { +func (is *InputStream) IsAnyMine() (bool, error) { for _, input := range is.inputs { mine, err := is.qs.IsMine(input.Id) if err != nil { - panic(err) + return false, errors.WithMessagef(err, "failed to query the vault") } if mine { - return true + return true, nil } } - return false + return false, nil } // String returns a string representation of the input stream diff --git a/token/tms.go b/token/tms.go index eedde5b7e..350c26e7a 100644 --- a/token/tms.go +++ b/token/tms.go @@ -204,8 +204,12 @@ func (t *ManagementService) NewMetadataFromBytes(raw []byte) (*Metadata, error) } // Validator returns a new token validator for this TMS -func (t *ManagementService) Validator() *Validator { - return &Validator{backend: t.tms.Validator()} +func (t *ManagementService) Validator() (*Validator, error) { + v, err := t.tms.Validator() + if err != nil { + return nil, errors.WithMessagef(err, "failed to get validator") + } + return &Validator{backend: v}, nil } // Vault returns the Token Vault for this TMS @@ -224,14 +228,14 @@ func (t *ManagementService) CertificationManager() *CertificationManager { } // CertificationClient returns the certification client for this TMS -func (t *ManagementService) CertificationClient() *CertificationClient { +func (t *ManagementService) CertificationClient() (*CertificationClient, error) { certificationClient, err := t.certificationClientProvider.New( t.Network(), t.Channel(), t.Namespace(), t.PublicParametersManager().CertificationDriver(), ) if err != nil { - panic(err) + return nil, errors.WithMessagef(err, "failed to create ceritifacation client") } - return &CertificationClient{cc: certificationClient} + return &CertificationClient{cc: certificationClient}, nil } // PublicParametersManager returns a manager that gives access to the public parameters @@ -267,6 +271,7 @@ func (t *ManagementService) ConfigManager() *ConfigManager { // GetManagementService returns the management service for the passed options. If no options are passed, // the default management service is returned. // Options: WithNetwork, WithChannel, WithNamespace, WithPublicParameterFetcher, WithTMS, WithTMSID +// The function panics if an error occurs. Use GetManagementServiceProvider(sp).GetManagementService(opts...) to handle any error directly func GetManagementService(sp ServiceProvider, opts ...ServiceOption) *ManagementService { ms, err := GetManagementServiceProvider(sp).GetManagementService(opts...) if err != nil { diff --git a/token/wallet.go b/token/wallet.go index d38fe0cbb..8aecb26ae 100644 --- a/token/wallet.go +++ b/token/wallet.go @@ -72,8 +72,9 @@ func (wm *WalletManager) Wallet(identity view.Identity) *Wallet { // The identifier can be a label, as defined in the configuration file, an identity or a wallet ID. // If no wallet is found, it returns nil. func (wm *WalletManager) OwnerWallet(id string) *OwnerWallet { - w := wm.managementService.tms.OwnerWallet(id) - if w == nil { + w, err := wm.managementService.tms.OwnerWallet(id) + if err != nil { + logger.Debugf("failed to get owner wallet for id [%s]: [%s]", id, err) return nil } return &OwnerWallet{Wallet: &Wallet{w: w, managementService: wm.managementService}, w: w} @@ -82,8 +83,9 @@ func (wm *WalletManager) OwnerWallet(id string) *OwnerWallet { // OwnerWalletByIdentity returns the owner wallet bound to the passed identity, if any is available. // If no wallet is found, it returns nil. func (wm *WalletManager) OwnerWalletByIdentity(identity view.Identity) *OwnerWallet { - w := wm.managementService.tms.OwnerWalletByIdentity(identity) - if w == nil { + w, err := wm.managementService.tms.OwnerWalletByIdentity(identity) + if err != nil { + logger.Debugf("failed to get owner wallet for id [%s]: [%s]", identity, err) return nil } return &OwnerWallet{Wallet: &Wallet{w: w, managementService: wm.managementService}, w: w} @@ -93,8 +95,9 @@ func (wm *WalletManager) OwnerWalletByIdentity(identity view.Identity) *OwnerWal // The identifier can be a label, as defined in the configuration file, an identity or a wallet ID. // If no wallet is found, it returns nil. func (wm *WalletManager) IssuerWallet(id string) *IssuerWallet { - w := wm.managementService.tms.IssuerWallet(id) - if w == nil { + w, err := wm.managementService.tms.IssuerWallet(id) + if err != nil { + logger.Debugf("failed to get issuer wallet for id [%s]: [%s]", id, err) return nil } return &IssuerWallet{Wallet: &Wallet{w: w, managementService: wm.managementService}, w: w} @@ -103,8 +106,9 @@ func (wm *WalletManager) IssuerWallet(id string) *IssuerWallet { // IssuerWalletByIdentity returns the issuer wallet bound to the passed identity, if any is available. // If no wallet is found, it returns nil. func (wm *WalletManager) IssuerWalletByIdentity(identity view.Identity) *IssuerWallet { - w := wm.managementService.tms.IssuerWalletByIdentity(identity) - if w == nil { + w, err := wm.managementService.tms.IssuerWalletByIdentity(identity) + if err != nil { + logger.Debugf("failed to get issuer wallet for id [%s]: [%s]", identity, err) return nil } return &IssuerWallet{Wallet: &Wallet{w: w, managementService: wm.managementService}, w: w} @@ -114,16 +118,18 @@ func (wm *WalletManager) IssuerWalletByIdentity(identity view.Identity) *IssuerW // The identifier can be a label, as defined in the configuration file, an identity or a wallet ID. // If no wallet is found, it returns nil. func (wm *WalletManager) AuditorWallet(id string) *AuditorWallet { - w := wm.managementService.tms.AuditorWallet(id) - if w == nil { + w, err := wm.managementService.tms.AuditorWallet(id) + if err != nil { + logger.Debugf("failed to get auditor wallet for id [%s]: [%s]", id, err) return nil } return &AuditorWallet{Wallet: &Wallet{w: w, managementService: wm.managementService}, w: w} } func (wm *WalletManager) AuditorWalletByIdentity(id view.Identity) *AuditorWallet { - w := wm.managementService.tms.AuditorWalletByIdentity(id) - if w == nil { + w, err := wm.managementService.tms.AuditorWalletByIdentity(id) + if err != nil { + logger.Debugf("failed to get auditor wallet for id [%s]: [%s]", id, err) return nil } return &AuditorWallet{Wallet: &Wallet{w: w, managementService: wm.managementService}, w: w} @@ -133,8 +139,9 @@ func (wm *WalletManager) AuditorWalletByIdentity(id view.Identity) *AuditorWalle // The identifier can be a label, as defined in the configuration file, an identity or a wallet ID. // If no wallet is found, it returns nil. func (wm *WalletManager) CertifierWallet(id string) *CertifierWallet { - w := wm.managementService.tms.CertifierWallet(id) - if w == nil { + w, err := wm.managementService.tms.CertifierWallet(id) + if err != nil { + logger.Debugf("failed to get certifier wallet for id [%s]: [%s]", id, err) return nil } return &CertifierWallet{Wallet: &Wallet{w: w, managementService: wm.managementService}, w: w} @@ -143,8 +150,9 @@ func (wm *WalletManager) CertifierWallet(id string) *CertifierWallet { // CertifierWalletByIdentity returns the certifier wallet bound to the passed identity, if any is available. // If no wallet is found, it returns nil. func (wm *WalletManager) CertifierWalletByIdentity(identity view.Identity) *CertifierWallet { - w := wm.managementService.tms.CertifierWalletByIdentity(identity) - if w == nil { + w, err := wm.managementService.tms.CertifierWalletByIdentity(identity) + if err != nil { + logger.Debugf("failed to get certifier wallet for id [%s]: [%s]", identity, err) return nil } return &CertifierWallet{Wallet: &Wallet{w: w, managementService: wm.managementService}, w: w}