在Hyperledger Fabric中,链码分为两种类型:系统链码和普通链码。其中系统链码是系统内置的链码,用来完成一些系统功能等;普通链码是实现应用业务逻辑的链码。
系统链码vs普通链码
系统链码和普通链码的几个不同点,如下表所示:
对比项 | 系统链码 | 普通链码 |
---|---|---|
链码源码 | 无main函数 | 有main函数 |
运行空间 | 背书节点进程 | Docker |
调用方式 | 网络+进程内部 | 网络 |
启动参数 | 内置 | 动态输入 |
通信方式 | Golang的通道机制 | 网络 |
数据存取 | Golang的通道+本地文件 | 网络 |
升级方式 | 和背书节点一起升级 | 单独升级 |
背书策略 | 无 | 有 |
2.0版本中的系统链码
_lifecycle
在所有 Peer 节点上运行,它负责管理节点上的链码安装、批准组织的链码定义、将链码定义提交到通道上。
生命周期系统链码(LSCC)
负责为1.x版本的 Fabric 管理链码生命周期。该版本的生命周期要求在通道上实例化或升级链码
配置系统链码(CSCC)
在所有 Peer 节点上运行,以处理通道配置的变化,比如策略更新。
通过CSCC可以查询以下几个接口的信息:
查询接口 | 查询内容 | 说明 |
---|---|---|
GetConfigBlock | 查询链的配置区块 | 每次有配置更新的时候会更新记账节点本地维护的最新配置区块,配置区块是从本地缓存里获取的 |
GetChannels | 获取加入链列表 | 记账节点加入的链列表也是从本地缓存获取的 |
查询系统链码(QSCC)
在所有 Peer 节点上运行,以提供账本 API(应用程序编码接口),其中包括区块查询、交易查询等。
查询接口 | 查询内容 | 说明 |
---|---|---|
GetTransactionByID | 根据交易号获取交易 | 从索引数据库获取 |
GetBlockByNumber | 根据区块号获取区块 | 从索引数据库获取 |
GetBlockByHash | 根据区块哈希获取区块 | 从索引数据库获取 |
GetBlockByTxID | 根据交易号获取区块 | 从索引数据库获取 |
GetChainInfo | 根据通道名称获取最新的区块链信息 | 从本地缓存中获取 |
从索引数据库查询通用的过程是根据查询项从索引数据库查询出FLP(File Location Pointer),再根据FLP在区块中定位获取所需内容。
背书系统链码(ESCC)
在背书节点上运行,对交易结果进行结构转换和签名背书
验证系统链码(VSCC)
主要功能是记账前对区块和交易进行验证,包括检查背书策略和读写集版本。
参考资料:1. Smart Contracts and Chaincode
2.《深度探索区块链-Hyperledger技术与应用》