Skip to content

Commit

Permalink
reduce panics as much as possible (#433)
Browse files Browse the repository at this point in the history
Signed-off-by: Angelo De Caro <[email protected]>
  • Loading branch information
adecaro authored Dec 7, 2022

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent 52a145e commit 36bc6ea
Showing 46 changed files with 299 additions and 362 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -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
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -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=
3 changes: 2 additions & 1 deletion token/core/fabtoken/deserializer.go
Original file line number Diff line number Diff line change
@@ -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
16 changes: 8 additions & 8 deletions token/core/fabtoken/driver/driver.go
Original file line number Diff line number Diff line change
@@ -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() {
6 changes: 3 additions & 3 deletions token/core/fabtoken/ppm/ppm.go
Original file line number Diff line number Diff line change
@@ -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
3 changes: 2 additions & 1 deletion token/core/fabtoken/sender.go
Original file line number Diff line number Diff line change
@@ -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{
10 changes: 2 additions & 8 deletions token/core/fabtoken/service.go
Original file line number Diff line number Diff line change
@@ -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 {
75 changes: 34 additions & 41 deletions token/core/fabtoken/wallet.go
Original file line number Diff line number Diff line change
@@ -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,140 +58,135 @@ 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()

// 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, 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
8 changes: 4 additions & 4 deletions token/core/identity/msp/common/common.go
Original file line number Diff line number Diff line change
@@ -7,14 +7,14 @@ SPDX-License-Identifier: Apache-2.0
package common

import (
"fmt"
"reflect"

"github.com/hyperledger-labs/fabric-smart-client/platform/fabric/driver"
view2 "github.com/hyperledger-labs/fabric-smart-client/platform/view"
"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
}
5 changes: 4 additions & 1 deletion token/core/identity/msp/idemix/common.go
Original file line number Diff line number Diff line change
@@ -93,14 +93,17 @@ func (c *Common) DeserializeWithNymEID(raw view.Identity, checkValidity bool, ny
}
}

id := NewIdentityWithVerType(
id, err := NewIdentityWithVerType(
idCommon,
NymPublicKey,
role,
ou,
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")
Loading

0 comments on commit 36bc6ea

Please sign in to comment.