ProcessProposal
core/endorser/endorser.go->ProcessProposal
core/peer/msgvalidation.go->ValidateProposalMessage //验证proposal并返回proposal
core/endorser/endorser.go->checkACL //权限校验,调用policyChecker.CheckPolicy来进行权限校验
core/endorser/endorser.go->getTxSimulator //根据proposal提供的ChainID获取transaction simulator
core/endorser/endorser.go->simulateProposal //simulate chaincode调用
core/endorser/endorser.go->endorseProposal //通过调用ESCC来为proposal背书
解析调用endorseProposal返回的信息,并把包含在pResp.Response.Payload中的chaincode调用返回给客户端
getTxSimulator
core/ledger/kvledger/kv_ledgers.go->GetLedger //根据chainName获取ledger core/ledger/kvledger/kv_ledger.go->NewTxSimulator() //获取transaction simulator
GetLedger
从lManager中获取对应chainName的ledger。这些ledgers是通过peer node实例化的使用通过调用:
core/ledger/kvledger/kv_ledgers.go->CreateLedger
来创建的。
NewTxSimulator
调用ledger对应的tx manager来创建transaction simulator
simulateProposal
- 获取proposal的ChaincodeInvocationSpec
[comment]: //2. 检查ACL - 检查chaincode的ESCC和VSCC
- 执行proposal(callChaincode)
- 获取模拟执行结果
callChaincode(判断是部署或是调用交易)
- 判断是否为系统chaincode
- 创建chaincode context
- 执行chaincode(chaincode.ExecuteChaincode)
- 如果是部署或更新那就根据ChaincodeSpec中指定的Name创建新的chaincode context,并部署
chaincodeSupport.Deploy
- 获取runningChaincodes锁
- 如果chaincode在运行就停止部署,并释放锁
- 释放runningChaincodes锁
- 获取调用的环境及参数
- 获取请求代码包,并创建container.CreateImageReq
- 获取虚拟机类型,并调用container.VMCProcess创建image及container
container.VMCProcess
- 根据类型创建对应vmcontroller
- 创建goroutine,调用req.do (CreateImageReq.do) 部署交易
dockercontroller.Deploy
- 创建docker client
- 调用vm.deployImage部署image
chaincodeSupport.Launch
- 判断chaincode是否已经启动
- 如果是系统container或不是dev模式,就启动container(chaincodeSupport.launchAndWaitForRegister)
- 初始化并等到chaincode准备好(chaincodeSupport.sendInitOrReady)
chaincodeSupport.Stop
- 构造container.StopImageReq
- 调用container.VMCProcess停止container
- 判断chaincode是否已经启动
- 从runningChaincodes.chaincodeMap中删除对应的chaincode name
chaincodeSupport.preLaunchSetup
- 创建chaincode runtime enviroment,并加入runningChaincodes.chaincodeMap
StartImageReq.do
- 调用对应的vm的Start方法
dockercontroller.Start
- 创建新的docker client
- 调用vm.stopInternal停止
- 调用vm.createContainer创建container
- 调用docker client的StartContainer启动container
vm.createContainer
下面只说下dockercontroller的createContainer方法:
- 构造docker.Config和docker.CreateContainerOptions
- 调用docker client的CreateContainer创建container