Fabric v2.0 源码解析——容器运行智能合约(chaincode)

本文还未编写完成,后面会逐步完成。

1. Fabric各个组件的交互

Fabric v1.x 的组件包括client、orderer节点、peer节点、chaincode容器,各个容器节点间的交互关系如下:
在这里插入图片描述
上图中可知,最主要的5个交互步骤为:

  • Client → Peer: EndorseProposal,Client向Endorser发送交易提案,请求背书;
  • Peer ↔ Chaincode: ChaincodeInteractions,Endorser调用chaincode,与chaincode容器交互,这也是本文需要详细解析的
  • Client → Orderer: BroadcastTxResponse,client调用Orderer的Broadcast接口,开始交易全排序以及广播区块;
  • Orderer → Peer: DeliverBlock,Orderer向Peer广播区块;
  • Peer → Client: SendBlockEvents,Peer向Client发送事件,通知交易已被打包到区块中。

下图中可以看到各个容器节点间通过gRPC进行通信,其中Peer与chaincode容器是通过ChaincodeSuppport的gRPC接口服务进行交互:
在这里插入图片描述

2. chaincode开发

关于chaincode的开发请参考Fabric v1.x 应用开发指南(2 3 4章节)

3. chaincode启动

开发模式:ChaincodeSupportService会等待来自独立chaincode进程的连接;
非开发模式:大致包括这些启动步骤

  1. 尝试启动chaincode容器(第一次将会失败);
  2. 根据chaincode语言,生成对相应的DockerFile;
  3. 使用生成的DockerFile创建一个用于构建chaincode的Docker容器并获取chaincode二进制文件;
  4. 创建并启动一个Docker容器以运行Chaincode;
  5. chaincode启动,建立与在peer上的ChaincodeSupportService的gRPC连接。通常ChaincodeSupportService将会调用Init函数。

3.1 镜像

func (vm *DockerVM) GetEnv(ccid string, tlsConfig *ccintf.TLSConfig) []string {
   
	envs := []string{
   fmt.Sprintf("CORE_CHAINCODE_ID_NAME=%s", ccid)}
	envs = append(envs, vm.LoggingEnv...)
	if tlsConfig != nil {
   
		envs = append(envs, "CORE_PEER_TLS_ENABLED=true")
		envs = append(envs, fmt.Sprintf("CORE_TLS_CLIENT_KEY_PATH=%s", TLSClientKeyPath))
		envs 
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值