本文还未编写完成,后面会逐步完成。
文章目录
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进程的连接;
非开发模式:大致包括这些启动步骤
- 尝试启动chaincode容器(第一次将会失败);
- 根据chaincode语言,生成对相应的DockerFile;
- 使用生成的DockerFile创建一个用于构建chaincode的Docker容器并获取chaincode二进制文件;
- 创建并启动一个Docker容器以运行Chaincode;
- 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