Skip to content

Commit 943575a

Browse files
ale-linuxJason Yellick
authored andcommitted
FAB-13525 Wire new lifecycle to validate shim
The validation logic needs to handle invokes to the old legacy lifecycle even once the old lifecycle is read-only. This CR causes the new lifecycle first to be checked for validation info, and only then to fall back to the legacy one when not defined. Change-Id: I0ae3481725d1c141181956a58520514d93cd99c9 Signed-off-by: Alessandro Sorniotti <ale.linux@sopit.net> Signed-off-by: Jason Yellick <jyellick@us.ibm.com>
1 parent 1d96235 commit 943575a

File tree

8 files changed

+62
-33
lines changed

8 files changed

+62
-33
lines changed

core/committer/txvalidator/v20/valinforetriever/shim.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type ValidationInfoRetrieveShim struct {
2323
New plugindispatcher.LifecycleResources
2424
}
2525

26-
func (v *ValidationInfoRetrieveShim) ValidationInfo(channelID, chaincodeName string, qe ledger.QueryExecutor) (plugin string, args []byte, unexpectedErr error, validationErr error) {
26+
func (v *ValidationInfoRetrieveShim) ValidationInfo(channelID, chaincodeName string, qe ledger.SimpleQueryExecutor) (plugin string, args []byte, unexpectedErr error, validationErr error) {
2727
plugin, args, unexpectedErr, validationErr = v.New.ValidationInfo(channelID, chaincodeName, qe)
2828
if unexpectedErr != nil || validationErr != nil || plugin != "" || args != nil {
2929
return

core/peer/peer.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/hyperledger/fabric/core/committer/txvalidator"
3030
"github.com/hyperledger/fabric/core/committer/txvalidator/plugin"
3131
"github.com/hyperledger/fabric/core/committer/txvalidator/v20/plugindispatcher"
32+
vir "github.com/hyperledger/fabric/core/committer/txvalidator/v20/valinforetriever"
3233
"github.com/hyperledger/fabric/core/common/ccprovider"
3334
"github.com/hyperledger/fabric/core/common/privdata"
3435
"github.com/hyperledger/fabric/core/common/sysccprovider"
@@ -208,7 +209,8 @@ var validationWorkersSemaphore semaphore.Semaphore
208209
// ready
209210
func Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider,
210211
pm plugin.Mapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider,
211-
membershipProvider ledger.MembershipInfoProvider, metricsProvider metrics.Provider, chaincodeSupport plugindispatcher.LifecycleResources) {
212+
membershipProvider ledger.MembershipInfoProvider, metricsProvider metrics.Provider,
213+
legacyLifecycleValidation, newLifecycleValidation plugindispatcher.LifecycleResources) {
212214
nWorkers := viper.GetInt("peer.validatorPoolSize")
213215
if nWorkers <= 0 {
214216
nWorkers = runtime.NumCPU()
@@ -244,7 +246,7 @@ func Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccp
244246
continue
245247
}
246248
// Create a chain if we get a valid ledger with config block
247-
if err = createChain(cid, ledger, cb, ccp, sccp, pm, deployedCCInfoProvider, chaincodeSupport); err != nil {
249+
if err = createChain(cid, ledger, cb, ccp, sccp, pm, deployedCCInfoProvider, legacyLifecycleValidation, newLifecycleValidation); err != nil {
248250
peerLogger.Warningf("Failed to load chain %s(%s)", cid, err)
249251
peerLogger.Debugf("Error reloading chain %s with message %s. We continue to the next chain rather than abort.", cid, err)
250252
continue
@@ -296,7 +298,8 @@ func getCurrConfigBlockFromLedger(ledger ledger.PeerLedger) (*common.Block, erro
296298
func createChain(cid string, ledger ledger.PeerLedger, cb *common.Block, ccp ccprovider.ChaincodeProvider,
297299
sccp sysccprovider.SystemChaincodeProvider, pm plugin.Mapper,
298300
deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider,
299-
chaincodeSupport plugindispatcher.LifecycleResources,
301+
legacyLifecycleValidation plugindispatcher.LifecycleResources,
302+
newLifecycleValidation plugindispatcher.LifecycleResources,
300303
) error {
301304
chanConf, err := retrievePersistedChannelConfig(ledger)
302305
if err != nil {
@@ -386,7 +389,11 @@ func createChain(cid string, ledger ledger.PeerLedger, cb *common.Block, ccp ccp
386389
peerSingletonCallback,
387390
)
388391

389-
validator := txvalidator.NewTxValidator(cid, validationWorkersSemaphore, cs, chaincodeSupport, sccp, pm, NewChannelPolicyManagerGetter())
392+
vInfoShim := &vir.ValidationInfoRetrieveShim{
393+
New: newLifecycleValidation,
394+
Legacy: legacyLifecycleValidation,
395+
}
396+
validator := txvalidator.NewTxValidator(cid, validationWorkersSemaphore, cs, vInfoShim, sccp, pm, NewChannelPolicyManagerGetter())
390397
c := committer.NewLedgerCommitterReactive(ledger, func(block *common.Block) error {
391398
chainID, err := utils.GetChainIDFromBlock(block)
392399
if err != nil {
@@ -431,7 +438,7 @@ func createChain(cid string, ledger ledger.PeerLedger, cb *common.Block, ccp ccp
431438
}
432439

433440
// CreateChainFromBlock creates a new chain from config block
434-
func CreateChainFromBlock(cb *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, lr plugindispatcher.LifecycleResources) error {
441+
func CreateChainFromBlock(cb *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, legacyLifecycleValidation, newLifecycleValidation plugindispatcher.LifecycleResources) error {
435442
cid, err := utils.GetChainIDFromBlock(cb)
436443
if err != nil {
437444
return err
@@ -442,7 +449,7 @@ func CreateChainFromBlock(cb *common.Block, ccp ccprovider.ChaincodeProvider, sc
442449
return errors.WithMessage(err, "cannot create ledger from genesis block")
443450
}
444451

445-
return createChain(cid, l, cb, ccp, sccp, pluginMapper, deployedCCInfoProvider, lr)
452+
return createChain(cid, l, cb, ccp, sccp, pluginMapper, deployedCCInfoProvider, legacyLifecycleValidation, newLifecycleValidation)
446453
}
447454

448455
// GetLedger returns the ledger of the chain with chain ID. Note that this

core/peer/peer_impl.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
// on singletons in the package. This is a step towards moving from package
2525
// level data for the peer to instance level data.
2626
type Operations interface {
27-
CreateChainFromBlock(cb *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, lr plugindispatcher.LifecycleResources) error
27+
CreateChainFromBlock(cb *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, lr, nr plugindispatcher.LifecycleResources) error
2828
GetChannelConfig(cid string) channelconfig.Resources
2929
GetChannelsInfo() []*pb.ChannelInfo
3030
GetStableChannelConfig(cid string) channelconfig.Resources
@@ -33,11 +33,11 @@ type Operations interface {
3333
GetMSPIDs(cid string) []string
3434
GetPolicyManager(cid string) policies.Manager
3535
InitChain(cid string)
36-
Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, pm plugin.Mapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider, metricsProvider metrics.Provider, lr plugindispatcher.LifecycleResources)
36+
Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, pm plugin.Mapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider, metricsProvider metrics.Provider, lr, nr plugindispatcher.LifecycleResources)
3737
}
3838

3939
type peerImpl struct {
40-
createChainFromBlock func(cb *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, lr plugindispatcher.LifecycleResources) error
40+
createChainFromBlock func(cb *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, lr, nr plugindispatcher.LifecycleResources) error
4141
getChannelConfig func(cid string) channelconfig.Resources
4242
getChannelsInfo func() []*pb.ChannelInfo
4343
getStableChannelConfig func(cid string) channelconfig.Resources
@@ -46,7 +46,7 @@ type peerImpl struct {
4646
getMSPIDs func(cid string) []string
4747
getPolicyManager func(cid string) policies.Manager
4848
initChain func(cid string)
49-
initialize func(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, mapper plugin.Mapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider, metricsProvider metrics.Provider, pd plugindispatcher.LifecycleResources)
49+
initialize func(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, mapper plugin.Mapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider, metricsProvider metrics.Provider, lr, nr plugindispatcher.LifecycleResources)
5050
}
5151

5252
// Default provides in implementation of the Peer interface that provides
@@ -66,8 +66,8 @@ var Default Operations = &peerImpl{
6666

6767
var DefaultSupport Support = &supportImpl{operations: Default}
6868

69-
func (p *peerImpl) CreateChainFromBlock(cb *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, lr plugindispatcher.LifecycleResources) error {
70-
return p.createChainFromBlock(cb, ccp, sccp, deployedCCInfoProvider, lr)
69+
func (p *peerImpl) CreateChainFromBlock(cb *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, lr, nr plugindispatcher.LifecycleResources) error {
70+
return p.createChainFromBlock(cb, ccp, sccp, deployedCCInfoProvider, lr, nr)
7171
}
7272
func (p *peerImpl) GetChannelConfig(cid string) channelconfig.Resources {
7373
return p.getChannelConfig(cid)
@@ -81,6 +81,6 @@ func (p *peerImpl) GetLedger(cid string) ledger.PeerLedger { return p.getL
8181
func (p *peerImpl) GetMSPIDs(cid string) []string { return p.getMSPIDs(cid) }
8282
func (p *peerImpl) GetPolicyManager(cid string) policies.Manager { return p.getPolicyManager(cid) }
8383
func (p *peerImpl) InitChain(cid string) { p.initChain(cid) }
84-
func (p *peerImpl) Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, mapper plugin.Mapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider, metricsProvider metrics.Provider, pd plugindispatcher.LifecycleResources) {
85-
p.initialize(init, ccp, sccp, mapper, pr, deployedCCInfoProvider, membershipProvider, metricsProvider, pd)
84+
func (p *peerImpl) Initialize(init func(string), ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, mapper plugin.Mapper, pr *platforms.Registry, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, membershipProvider ledger.MembershipInfoProvider, metricsProvider metrics.Provider, lr, nr plugindispatcher.LifecycleResources) {
85+
p.initialize(init, ccp, sccp, mapper, pr, deployedCCInfoProvider, membershipProvider, metricsProvider, lr, nr)
8686
}

core/peer/peer_test.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,34 @@ func TestInitialize(t *testing.T) {
8888
cleanup := setupPeerFS(t)
8989
defer cleanup()
9090

91-
Initialize(nil, &ccprovider.MockCcProviderImpl{}, (&mscc.MocksccProviderFactory{}).NewSystemChaincodeProvider(), plugin.MapBasedMapper(map[string]validation.PluginFactory{}), nil, &ledgermocks.DeployedChaincodeInfoProvider{}, nil, &disabled.Provider{}, nil)
91+
Initialize(
92+
nil,
93+
&ccprovider.MockCcProviderImpl{},
94+
(&mscc.MocksccProviderFactory{}).NewSystemChaincodeProvider(),
95+
plugin.MapBasedMapper(map[string]validation.PluginFactory{}),
96+
nil,
97+
&ledgermocks.DeployedChaincodeInfoProvider{},
98+
nil,
99+
&disabled.Provider{},
100+
nil, nil,
101+
)
92102
}
93103

94104
func TestCreateChainFromBlock(t *testing.T) {
95105
cleanup := setupPeerFS(t)
96106
defer cleanup()
97107

98-
Initialize(nil, &ccprovider.MockCcProviderImpl{}, (&mscc.MocksccProviderFactory{}).NewSystemChaincodeProvider(), plugin.MapBasedMapper(map[string]validation.PluginFactory{}), &platforms.Registry{}, &ledgermocks.DeployedChaincodeInfoProvider{}, nil, &disabled.Provider{}, nil)
108+
Initialize(
109+
nil,
110+
&ccprovider.MockCcProviderImpl{},
111+
(&mscc.MocksccProviderFactory{}).NewSystemChaincodeProvider(),
112+
plugin.MapBasedMapper(map[string]validation.PluginFactory{}),
113+
&platforms.Registry{},
114+
&ledgermocks.DeployedChaincodeInfoProvider{},
115+
nil,
116+
&disabled.Provider{},
117+
nil, nil,
118+
)
99119
testChainID := fmt.Sprintf("mytestchainid-%d", rand.Int())
100120
block, err := configtxtest.MakeGenesisBlock(testChainID)
101121
if err != nil {
@@ -127,7 +147,7 @@ func TestCreateChainFromBlock(t *testing.T) {
127147
go grpcServer.Serve(socket)
128148
defer grpcServer.Stop()
129149

130-
err = CreateChainFromBlock(block, nil, nil, &mock.DeployedChaincodeInfoProvider{}, nil)
150+
err = CreateChainFromBlock(block, nil, nil, &mock.DeployedChaincodeInfoProvider{}, nil, nil)
131151
if err != nil {
132152
t.Fatalf("failed to create chain %s", err)
133153
}

core/peer/pkg_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ func TestUpdateRootsFromConfigBlock(t *testing.T) {
169169
viper.Set("peer.tls.key.file", filepath.Join("testdata", "Org1-server1-key.pem"))
170170
viper.Set("peer.tls.rootcert.file", filepath.Join("testdata", "Org1-cert.pem"))
171171
viper.Set("peer.fileSystemPath", testDir)
172-
err = peer.Default.CreateChainFromBlock(block, nil, nil, &mock.DeployedChaincodeInfoProvider{}, nil)
172+
err = peer.Default.CreateChainFromBlock(block, nil, nil, &mock.DeployedChaincodeInfoProvider{}, nil, nil)
173173
if err != nil {
174174
t.Fatalf("Failed to create config block (%s)", err)
175175
}

core/scc/cscc/configure.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import (
3939
// Typically, only one will be created per peer instance.
4040
func New(ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider,
4141
aclProvider aclmgmt.ACLProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider,
42-
lifecycle plugindispatcher.LifecycleResources) *PeerConfiger {
42+
lr, nr plugindispatcher.LifecycleResources) *PeerConfiger {
4343
return &PeerConfiger{
4444
policyChecker: policy.NewPolicyChecker(
4545
peer.NewChannelPolicyManagerGetter(),
@@ -51,7 +51,8 @@ func New(ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodePro
5151
sccp: sccp,
5252
aclProvider: aclProvider,
5353
deployedCCInfoProvider: deployedCCInfoProvider,
54-
lifecycle: lifecycle,
54+
legacyLifecycle: lr,
55+
newLifecycle: nr,
5556
}
5657
}
5758

@@ -73,7 +74,8 @@ type PeerConfiger struct {
7374
sccp sysccprovider.SystemChaincodeProvider
7475
aclProvider aclmgmt.ACLProvider
7576
deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider
76-
lifecycle plugindispatcher.LifecycleResources
77+
legacyLifecycle plugindispatcher.LifecycleResources
78+
newLifecycle plugindispatcher.LifecycleResources
7779
}
7880

7981
var cnflogger = flogging.MustGetLogger("cscc")
@@ -169,7 +171,7 @@ func (e *PeerConfiger) InvokeNoShim(args [][]byte, sp *pb.SignedProposal) pb.Res
169171
block.Metadata.Metadata[common.BlockMetadataIndex_TRANSACTIONS_FILTER] = txsFilter
170172
}
171173

172-
return joinChain(cid, block, e.ccp, e.sccp, e.deployedCCInfoProvider, e.lifecycle)
174+
return joinChain(cid, block, e.ccp, e.sccp, e.deployedCCInfoProvider, e.legacyLifecycle, e.newLifecycle)
173175
case GetConfigBlock:
174176
// 2. check policy
175177
if err = e.aclProvider.CheckACL(resources.Cscc_GetConfigBlock, string(args[1]), sp); err != nil {
@@ -244,8 +246,8 @@ func validateConfigBlock(block *common.Block) error {
244246
// joinChain will join the specified chain in the configuration block.
245247
// Since it is the first block, it is the genesis block containing configuration
246248
// for this chain, so we want to update the Chain object with this info
247-
func joinChain(chainID string, block *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, lifecycle plugindispatcher.LifecycleResources) pb.Response {
248-
if err := peer.CreateChainFromBlock(block, ccp, sccp, deployedCCInfoProvider, lifecycle); err != nil {
249+
func joinChain(chainID string, block *common.Block, ccp ccprovider.ChaincodeProvider, sccp sysccprovider.SystemChaincodeProvider, deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider, lr, nr plugindispatcher.LifecycleResources) pb.Response {
250+
if err := peer.CreateChainFromBlock(block, ccp, sccp, deployedCCInfoProvider, lr, nr); err != nil {
249251
return shim.Error(err.Error())
250252
}
251253

core/scc/cscc/configure_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func TestMain(m *testing.M) {
117117
}
118118

119119
func TestConfigerInit(t *testing.T) {
120-
e := New(nil, nil, mockAclProvider, nil, nil)
120+
e := New(nil, nil, mockAclProvider, nil, nil, nil)
121121
stub := shim.NewMockStub("PeerConfiger", e)
122122

123123
if res := stub.MockInit("1", nil); res.Status != shim.OK {
@@ -127,7 +127,7 @@ func TestConfigerInit(t *testing.T) {
127127
}
128128

129129
func TestConfigerInvokeInvalidParameters(t *testing.T) {
130-
e := New(nil, nil, mockAclProvider, nil, nil)
130+
e := New(nil, nil, mockAclProvider, nil, nil, nil)
131131
stub := shim.NewMockStub("PeerConfiger", e)
132132

133133
res := stub.MockInit("1", nil)
@@ -163,7 +163,7 @@ func TestConfigerInvokeJoinChainMissingParams(t *testing.T) {
163163
os.Mkdir("/tmp/hyperledgertest", 0755)
164164
defer os.RemoveAll("/tmp/hyperledgertest/")
165165

166-
e := New(nil, nil, mockAclProvider, nil, nil)
166+
e := New(nil, nil, mockAclProvider, nil, nil, nil)
167167
stub := shim.NewMockStub("PeerConfiger", e)
168168

169169
if res := stub.MockInit("1", nil); res.Status != shim.OK {
@@ -186,7 +186,7 @@ func TestConfigerInvokeJoinChainWrongParams(t *testing.T) {
186186
os.Mkdir("/tmp/hyperledgertest", 0755)
187187
defer os.RemoveAll("/tmp/hyperledgertest/")
188188

189-
e := New(nil, nil, mockAclProvider, nil, nil)
189+
e := New(nil, nil, mockAclProvider, nil, nil, nil)
190190
stub := shim.NewMockStub("PeerConfiger", e)
191191

192192
if res := stub.MockInit("1", nil); res.Status != shim.OK {
@@ -216,7 +216,7 @@ func TestConfigerInvokeJoinChainCorrectParams(t *testing.T) {
216216
defer ledgermgmt.CleanupTestEnv()
217217
defer os.RemoveAll("/tmp/hyperledgertest/")
218218

219-
e := New(ccp, mp, mockAclProvider, nil, nil)
219+
e := New(ccp, mp, mockAclProvider, nil, nil, nil)
220220
stub := shim.NewMockStub("PeerConfiger", e)
221221

222222
peerEndpoint := "localhost:13611"
@@ -514,7 +514,7 @@ func TestPeerConfiger_SubmittingOrdererGenesis(t *testing.T) {
514514
os.Mkdir("/tmp/hyperledgertest", 0755)
515515
defer os.RemoveAll("/tmp/hyperledgertest/")
516516

517-
e := New(nil, nil, nil, nil, nil)
517+
e := New(nil, nil, nil, nil, nil, nil)
518518
stub := shim.NewMockStub("PeerConfiger", e)
519519

520520
if res := stub.MockInit("1", nil); res.Status != shim.OK {

peer/node/start.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ func serve(args []string) error {
370370
ccSupSrv = authenticator.Wrap(ccSupSrv)
371371
}
372372

373-
csccInst := cscc.New(ccp, sccp, aclProvider, lifecycleImpl, lsccInst)
373+
csccInst := cscc.New(ccp, sccp, aclProvider, lifecycleImpl, lsccInst, lifecycleImpl)
374374
qsccInst := qscc.New(aclProvider)
375375

376376
//Now that chaincode is initialized, register all system chaincodes.
@@ -495,7 +495,7 @@ func serve(args []string) error {
495495
}
496496
cceventmgmt.GetMgr().Register(cid, sub)
497497
}, ccp, sccp, plugin.MapBasedMapper(validationPluginsByName),
498-
pr, lifecycleImpl, membershipInfoProvider, metricsProvider, lsccInst)
498+
pr, lifecycleImpl, membershipInfoProvider, metricsProvider, lsccInst, lifecycleImpl)
499499

500500
if viper.GetBool("peer.discovery.enabled") {
501501
registerDiscoveryService(peerServer, policyMgr, lifecycle)

0 commit comments

Comments
 (0)