Skip to content

Commit a02124e

Browse files
nirrozenbaummanish-sethi
authored andcommitted
[FAB-11780] added membership provider to ledger
had to refactor a bit, as membership provider creation was dependant on collectionStore, which is created per channel, therefore membership provider was also created per channel. changed it such that we can create a single membership provider FAB-11780 - #done Change-Id: I2c44ebf00d6eea1fc1d713b3168328f95074c6b5 Signed-off-by: nirro <nirro@il.ibm.com>
1 parent 46546b3 commit a02124e

File tree

8 files changed

+93
-35
lines changed

8 files changed

+93
-35
lines changed

core/common/privdata/membershipinfo.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,30 @@ SPDX-License-Identifier: Apache-2.0
77
package privdata
88

99
import (
10+
"github.com/hyperledger/fabric/msp"
1011
"github.com/hyperledger/fabric/protos/common"
1112
)
1213

1314
// MembershipProvider can be used to check whether a peer is eligible to a collection or not
1415
type MembershipProvider struct {
15-
selfSignedData common.SignedData
16-
cf CollectionFilter
16+
selfSignedData common.SignedData
17+
IdentityDeserializerFactory func(chainID string) msp.IdentityDeserializer
1718
}
1819

1920
// NewMembershipInfoProvider returns MembershipProvider
20-
func NewMembershipInfoProvider(selfSignedData common.SignedData, filter CollectionFilter) *MembershipProvider {
21-
return &MembershipProvider{selfSignedData: selfSignedData, cf: filter}
21+
func NewMembershipInfoProvider(selfSignedData common.SignedData, identityDeserializerFunc func(chainID string) msp.IdentityDeserializer) *MembershipProvider {
22+
return &MembershipProvider{selfSignedData: selfSignedData, IdentityDeserializerFactory: identityDeserializerFunc}
2223
}
2324

2425
// AmMemberOf checks whether the current peer is a member of the given collection config
2526
func (m *MembershipProvider) AmMemberOf(channelName string, collectionPolicyConfig *common.CollectionPolicyConfig) (bool, error) {
26-
filt, err := m.cf.AccessFilter(channelName, collectionPolicyConfig)
27+
deserializer := m.IdentityDeserializerFactory(channelName)
28+
accessPolicy, err := getPolicy(collectionPolicyConfig, deserializer)
2729
if err != nil {
2830
return false, err
2931
}
30-
return filt(m.selfSignedData), nil
32+
if err := accessPolicy.Evaluate([]*common.SignedData{&m.selfSignedData}); err != nil {
33+
return false, nil
34+
}
35+
return true, nil
3136
}

core/common/privdata/membershipinfo_test.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,24 @@ import (
1010
"testing"
1111

1212
"github.com/hyperledger/fabric/common/cauthdsl"
13+
"github.com/hyperledger/fabric/msp"
1314
"github.com/hyperledger/fabric/protos/common"
1415
"github.com/stretchr/testify/assert"
1516
)
1617

1718
func TestMembershipInfoProvider(t *testing.T) {
18-
// define identity of self peer as peer0
1919
peerSelfSignedData := common.SignedData{
2020
Identity: []byte("peer0"),
2121
Signature: []byte{1, 2, 3},
2222
Data: []byte{4, 5, 6},
2323
}
2424

25-
collectionStore := NewSimpleCollectionStore(&mockStoreSupport{})
25+
identityDeserializer := func(chainID string) msp.IdentityDeserializer {
26+
return &mockDeserializer{}
27+
}
2628

2729
// verify membership provider returns true
28-
membershipProvider := NewMembershipInfoProvider(peerSelfSignedData, collectionStore)
30+
membershipProvider := NewMembershipInfoProvider(peerSelfSignedData, identityDeserializer)
2931
res, err := membershipProvider.AmMemberOf("test1", getAccessPolicy([]string{"peer0", "peer1"}))
3032
assert.True(t, res)
3133
assert.Nil(t, err)
@@ -35,11 +37,11 @@ func TestMembershipInfoProvider(t *testing.T) {
3537
assert.False(t, res)
3638
assert.Nil(t, err)
3739

38-
// verify membership provider returns nil and error
40+
// verify membership provider returns nil and error when collection policy config is nil
3941
res, err = membershipProvider.AmMemberOf("test1", nil)
4042
assert.False(t, res)
4143
assert.Error(t, err)
42-
assert.Equal(t, "Collection config policy is nil", err.Error())
44+
assert.Equal(t, "Collection policy config is nil", err.Error())
4345
}
4446

4547
func getAccessPolicy(signers []string) *common.CollectionPolicyConfig {

core/common/privdata/simplecollection.go

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"fmt"
1111

1212
"github.com/golang/protobuf/proto"
13-
"github.com/hyperledger/fabric/common/cauthdsl"
1413
"github.com/hyperledger/fabric/common/policies"
1514
"github.com/hyperledger/fabric/msp"
1615
"github.com/hyperledger/fabric/protos/common"
@@ -121,21 +120,8 @@ func (sc *SimpleCollection) Setup(collectionConfig *common.StaticCollectionConfi
121120
// Setup configures a simple collection object based on a given
122121
// StaticCollectionConfig proto that has all the necessary information
123122
func (sc *SimpleCollection) setupAccessPolicy(collectionPolicyConfig *common.CollectionPolicyConfig, deserializer msp.IdentityDeserializer) error {
124-
if collectionPolicyConfig == nil {
125-
return errors.New("Collection config policy is nil")
126-
}
127-
accessPolicyEnvelope := collectionPolicyConfig.GetSignaturePolicy()
128-
if accessPolicyEnvelope == nil {
129-
return errors.New("Collection config access policy is nil")
130-
}
131-
132-
// create access policy from the envelope
133-
npp := cauthdsl.NewPolicyProvider(deserializer)
134-
polBytes, err := proto.Marshal(accessPolicyEnvelope)
135-
if err != nil {
136-
return err
137-
}
138-
sc.accessPolicy, _, err = npp.NewPolicy(polBytes)
123+
var err error
124+
sc.accessPolicy, err = getPolicy(collectionPolicyConfig, deserializer)
139125
return err
140126
}
141127

core/common/privdata/util.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package privdata
8+
9+
import (
10+
"github.com/golang/protobuf/proto"
11+
"github.com/hyperledger/fabric/common/cauthdsl"
12+
"github.com/hyperledger/fabric/common/policies"
13+
"github.com/hyperledger/fabric/msp"
14+
"github.com/hyperledger/fabric/protos/common"
15+
"github.com/pkg/errors"
16+
)
17+
18+
func getPolicy(collectionPolicyConfig *common.CollectionPolicyConfig, deserializer msp.IdentityDeserializer) (policies.Policy, error) {
19+
if collectionPolicyConfig == nil {
20+
return nil, errors.New("Collection policy config is nil")
21+
}
22+
accessPolicyEnvelope := collectionPolicyConfig.GetSignaturePolicy()
23+
if accessPolicyEnvelope == nil {
24+
return nil, errors.New("Collection config access policy is nil")
25+
}
26+
// create access policy from the envelope
27+
npp := cauthdsl.NewPolicyProvider(deserializer)
28+
polBytes, err := proto.Marshal(accessPolicyEnvelope)
29+
if err != nil {
30+
return nil, err
31+
}
32+
accessPolicy, _, err := npp.NewPolicy(polBytes)
33+
if err != nil {
34+
return nil, err
35+
}
36+
return accessPolicy, nil
37+
}

core/peer/peer.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ var validationWorkersSemaphore *semaphore.Weighted
195195
// Initialize sets up any chains that the peer has from the persistence. This
196196
// function should be called at the start up when the ledger and gossip
197197
// ready
198-
func Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, pm txvalidator.PluginMapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider) {
198+
func Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, pm txvalidator.PluginMapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider) {
199199
nWorkers := viper.GetInt("peer.validatorPoolSize")
200200
if nWorkers <= 0 {
201201
nWorkers = runtime.NumCPU()
@@ -211,6 +211,7 @@ func Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccp
211211
CustomTxProcessors: ConfigTxProcessors,
212212
PlatformRegistry: pr,
213213
DeployedChaincodeInfoProvider: deployedCCInfoProvider,
214+
MembershipInfoProvider: membershipProvider,
214215
})
215216
ledgerIds, err := ledgermgmt.GetLedgerIDs()
216217
if err != nil {

core/peer/peer_impl.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type Operations interface {
3030
GetMSPIDs(cid string) []string
3131
GetPolicyManager(cid string) policies.Manager
3232
InitChain(cid string)
33-
Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, pm txvalidator.PluginMapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider)
33+
Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, pm txvalidator.PluginMapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider)
3434
}
3535

3636
type peerImpl struct {
@@ -42,7 +42,7 @@ type peerImpl struct {
4242
getMSPIDs func(cid string) []string
4343
getPolicyManager func(cid string) policies.Manager
4444
initChain func(cid string)
45-
initialize func(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, mapper txvalidator.PluginMapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider)
45+
initialize func(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, mapper txvalidator.PluginMapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider)
4646
}
4747

4848
// Default provides in implementation of the Peer interface that provides
@@ -73,6 +73,6 @@ func (p *peerImpl) GetLedger(cid string) ledger.PeerLedger { return p.getL
7373
func (p *peerImpl) GetMSPIDs(cid string) []string { return p.getMSPIDs(cid) }
7474
func (p *peerImpl) GetPolicyManager(cid string) policies.Manager { return p.getPolicyManager(cid) }
7575
func (p *peerImpl) InitChain(cid string) { p.initChain(cid) }
76-
func (p *peerImpl) Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, mapper txvalidator.PluginMapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider) {
77-
p.initialize(init, ccp, sccp, mapper, pr, deployedCCInfoProvider)
76+
func (p *peerImpl) Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, mapper txvalidator.PluginMapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider) {
77+
p.initialize(init, ccp, sccp, mapper, pr, deployedCCInfoProvider, membershipProvider)
7878
}

core/peer/peer_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,14 @@ func TestInitialize(t *testing.T) {
8686
cleanup := setupPeerFS(t)
8787
defer cleanup()
8888

89-
Initialize(nil, &ccprovider.MockCcProviderImpl{}, (&mscc.MocksccProviderFactory{}).NewSystemChaincodeProvider(), txvalidator.MapBasedPluginMapper(map[string]validation.PluginFactory{}), nil, &ledgermocks.DeployedChaincodeInfoProvider{})
89+
Initialize(nil, &ccprovider.MockCcProviderImpl{}, (&mscc.MocksccProviderFactory{}).NewSystemChaincodeProvider(), txvalidator.MapBasedPluginMapper(map[string]validation.PluginFactory{}), nil, &ledgermocks.DeployedChaincodeInfoProvider{}, nil)
9090
}
9191

9292
func TestCreateChainFromBlock(t *testing.T) {
9393
cleanup := setupPeerFS(t)
9494
defer cleanup()
9595

96-
Initialize(nil, &ccprovider.MockCcProviderImpl{}, (&mscc.MocksccProviderFactory{}).NewSystemChaincodeProvider(), txvalidator.MapBasedPluginMapper(map[string]validation.PluginFactory{}), &platforms.Registry{}, &ledgermocks.DeployedChaincodeInfoProvider{})
96+
Initialize(nil, &ccprovider.MockCcProviderImpl{}, (&mscc.MocksccProviderFactory{}).NewSystemChaincodeProvider(), txvalidator.MapBasedPluginMapper(map[string]validation.PluginFactory{}), &platforms.Registry{}, &ledgermocks.DeployedChaincodeInfoProvider{}, nil)
9797
testChainID := fmt.Sprintf("mytestchainid-%d", rand.Int())
9898
block, err := configtxtest.MakeGenesisBlock(testChainID)
9999
if err != nil {

peer/node/start.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
"github.com/hyperledger/fabric/core/comm"
4040
"github.com/hyperledger/fabric/core/committer/txvalidator"
4141
"github.com/hyperledger/fabric/core/common/ccprovider"
42+
"github.com/hyperledger/fabric/core/common/privdata"
4243
"github.com/hyperledger/fabric/core/container"
4344
"github.com/hyperledger/fabric/core/container/dockercontroller"
4445
"github.com/hyperledger/fabric/core/container/inproccontroller"
@@ -70,6 +71,7 @@ import (
7071
peergossip "github.com/hyperledger/fabric/peer/gossip"
7172
"github.com/hyperledger/fabric/peer/version"
7273
cb "github.com/hyperledger/fabric/protos/common"
74+
common2 "github.com/hyperledger/fabric/protos/common"
7375
discprotos "github.com/hyperledger/fabric/protos/discovery"
7476
pb "github.com/hyperledger/fabric/protos/peer"
7577
"github.com/hyperledger/fabric/protos/transientstore"
@@ -157,12 +159,19 @@ func serve(args []string) error {
157159

158160
deployedCCInfoProvider := &lscc.DeployedCCInfoProvider{}
159161

162+
identityDeserializerFactory := func(chainID string) msp.IdentityDeserializer {
163+
return mgmt.GetManagerForChain(chainID)
164+
}
165+
166+
membershipInfoProvider := privdata.NewMembershipInfoProvider(createSelfSignedData(), identityDeserializerFactory)
167+
160168
//initialize resource management exit
161169
ledgermgmt.Initialize(
162170
&ledgermgmt.Initializer{
163171
CustomTxProcessors: peer.ConfigTxProcessors,
164172
PlatformRegistry: pr,
165173
DeployedChaincodeInfoProvider: deployedCCInfoProvider,
174+
MembershipInfoProvider: membershipInfoProvider,
166175
})
167176

168177
// Parameter overrides must be processed before any parameters are
@@ -314,7 +323,7 @@ func serve(args []string) error {
314323
logger.Panicf("Failed subscribing to chaincode lifecycle updates")
315324
}
316325
cceventmgmt.GetMgr().Register(cid, sub)
317-
}, ccp, sccp, txvalidator.MapBasedPluginMapper(validationPluginsByName), pr, deployedCCInfoProvider)
326+
}, ccp, sccp, txvalidator.MapBasedPluginMapper(validationPluginsByName), pr, deployedCCInfoProvider, membershipInfoProvider)
318327

319328
if viper.GetBool("peer.discovery.enabled") {
320329
registerDiscoveryService(peerServer, policyMgr, lifecycle)
@@ -373,6 +382,24 @@ func localPolicy(policyObject proto.Message) policies.Policy {
373382
return policy
374383
}
375384

385+
func createSelfSignedData() common2.SignedData {
386+
sId := mgmt.GetLocalSigningIdentityOrPanic()
387+
msg := make([]byte, 32)
388+
sig, err := sId.Sign(msg)
389+
if err != nil {
390+
logger.Panicf("Failed creating self signed data because message signing failed: %v", err)
391+
}
392+
peerIdentity, err := sId.Serialize()
393+
if err != nil {
394+
logger.Panicf("Failed creating self signed data because peer identity couldn't be serialized: %v", err)
395+
}
396+
return common2.SignedData{
397+
Data: msg,
398+
Signature: sig,
399+
Identity: peerIdentity,
400+
}
401+
}
402+
376403
func registerDiscoveryService(peerServer *comm.GRPCServer, polMgr policies.ChannelPolicyManagerGetter, lc *cc.Lifecycle) {
377404
mspID := viper.GetString("peer.localMspId")
378405
localAccessPolicy := localPolicy(cauthdsl.SignedByAnyAdmin([]string{mspID}))

0 commit comments

Comments
 (0)