Hyperledger fabric 1.0 代码解析 之 chaincode launch

2017-08-02

Launch chaincode整体流程

智能合约(chaincode)的执行一般是在docker中进行的,所以在执行之前,需要先完成将chaincode打包到docker容器中的过程。整个过程在core/chaincode/chaincode_support.go 的Launch函数中完成。

  1. 已经Launch的情况。对于正在运行(running)的则直接返回。
  2. 得到cds(ChaincodeDeploymentSpec),对于deploy情况在函数开始的地方便可以获得,对于非deploy情况下(cds == nil)需要先从lscc中得到chaincode data,然后从返回中得到cds。
  3. 对于系统container以及非dev模式需要lanuch容器。其它情况直接执行步骤6.(peer节点配置文件中的chaincode.mode,有两种模式分别为”dev”和”net”,”dev”chaincode是在本地执行,”net”模式chaincode是在docker中执行。”dev”的时候userRunsCC为true,即本地执行。执行环境exec分为有system和docker两种)
  4. 若codePackage为空,对于!userRunsCC且执行环境不是ChaincodeDeploymentSpec_SYSTEM,由于是需要部署在docker上的,必须要有chaincode信息,则尝试从文件系统中读取,若失败则直接返回。
  5. 创建builder(这里builder主要是读取cds的reader,之后在必要时用来创建镜像),然后交由launchAndWaitForRegister处理。该过程中会检查是否已经有镜像,没有则创建它,并启动相应的container。
  6. chaincodeSupport调用sendReady,保证container进入状态机的ready态。这部分是状态机的状态变化和事件。详见core/chaincode/handler.go
Read More

Hyperledger fabric 1.0 代码解析 之 chaincode install

2017-08-01

1.sdk或client发起install chaincode请求,然后开始构建一个Proposal包体。 主要过程是通过createProposalFromCDSchainId设置为”“,将ChaincodeID的Name指定为lscc,然后通过CreateProposalFromCIS以及GetSignedProposal 继续打包,主要是得到一个transcation id(txid)加上各种包头等。

Read More

Hyperledger fabric 1.0 代码解析 之 Process Proposal

2017-07-25

ProcessProposal函数是chaincode调用中一个十分重要的函数,主要涉及到channel join操作,chaincode的install、deploy、upgrade、InvokeOrQuery操作等,该部分详细剖析下ProcessProposal的整个过程 1.ProcessProposal中会调用simulateProposal对chaincode进行模拟执行(callChaincode)。该过程中对于非systemChaincode需要先调用getCDFromLSCC,从system chain code lscc那里getccdata。再调用完simulateProposal之后,对于chainID非空的情况,还需要调用endorseProposal对模拟执行的结果进行背书(simulateProposal和endorseProposal同样是调用callChaincode,不过endorseProposal是将上一步simulateProposal的结果,交给escc,调用escc的Invoke进行背书)。ProcessProposal的流程大致如下图:

Read More