fabric源码解析8——peer的System Chaincode
来源:互联网 发布:旋转矩阵计算旋转角度 编辑:程序博客网 时间:2024/05/16 10:46
fabric源码解析8——peer的System Chaincode
综述
关于System Chaincode,下文中以系统链码称之。这是个人翻译,依据是Chaincode本质是注册存储到链上的一段逻辑代码,因此个人习惯称Chaincode为链码,fabric文档中也变相的称为智能合约。但是,因为Chaincode是专用名词,个人觉得不翻译而直接使用是最好的。
start.go中的serve函数里,在为peerServer注册ChaincodeSupport服务的函数registerChaincodeSupport(peerServer.Server())
中,实现了注册System Chaincode:scc.RegisterSysCCs()
。
系统链码的核心代码在/fabric/core/common/sysccprovider和/fabric/core/scc下,scc也就是System Chaincode的缩写。系统链码分为五种:cscc,escc,lscc,qscc,vscc,均为各个系统链码的缩写。系统链码均实现了/fabric/core/chaincode/shim/interfaces.go中定义的Chaincode接口,从此点就可以看出,系统链码也属于Chaincode,只不过作用稍微特殊一点:
- cscc:configuration system chaincode
- lscc:lifecycle system chaincode
- escc:endorser system chaincode
- vscc:validator system chaincode
- qscc:querier system chaincode
sysccprovider目录下的文件有:
- sysccprovider.go - 定义系统链码服务提供者接口
scc目录下的文件有:
- sysccapi.go - 系统链码的各种api操作
- importsysccs.go - 导入五种预定义的系统链码
- sccproviderimpl.go - 定义了系统链码服务提供者的具体实现和其操作
结构图:
预定义和注册
在/fabric/core/scc/importsysccs.go中:
//预定义的五个系统链码存放到数组中var systemChaincodes = []*SystemChaincode{ { Enabled: true, Name: "cscc", Path: "github.com/hyperledger/fabric/core/scc/cscc", InitArgs: [][]byte{[]byte("")}, Chaincode: &cscc.PeerConfiger{}, InvokableExternal: true, // cscc is invoked to join a channel },{...},{...},{...},{...},}//注册五个系统链码func RegisterSysCCs() { for _, sysCC := range systemChaincodes { RegisterSysCC(sysCC) }}
RegisterSysCCs遍历systemChaincodes中所有的系统链码,并依次调用RegisterSysCC进行注册。RegisterSysCC在/fabric/core/scc/sysccapi.go中定义:
//系统链码开启且处于白名单中if !syscc.Enabled || !isWhitelisted(syscc) {...}//最终将系统链码注册到系统中err := inproccontroller.Register(syscc.Path, syscc.Chaincode)
inproccontroller.Register定义在/fabric/core/container/inproccontroller/inproccontroller.go:
//存放安装的chaincode,以chaincode所在的path为keytypeRegistry = make(map[string]*inprocContainer)//注册到typeRegistryfunc Register(path string, cc shim.Chaincode) error { tmp := typeRegistry[path] if tmp != nil { return SysCCRegisteredErr(path) } typeRegistry[path] = &inprocContainer{chaincode: cc} return nil}
Register函数以系统链码Path成员值为key,包含系统链码的inprocContainer对象为value,将系统链码放入typeRegistry映射中。至此,系统链码注册完毕。
释义
以下文字翻译自Fabric 文档中关于系统链码(System Chaincode)的部分。
系统链码与一般chaincode一样,有相同的编程模型,比不过系统链码是运行在peer程序中,即其是peer程序的一部分,而一般的chaincode是单独运行在一个容器中的。因此,系统链码是内建在peer程序中且不遵循一般chaincode那样的生命周期。特别的,install,instantiate和upgrade操作也不应用于系统链码。
系统链码区别与一般的chaincode的目的是缩短grpc在peer结点与chaincode之间通信的时间消耗(因为peer结点在一个容器,chaincode是单独的一个容器),并权衡管理上的灵活性。比如,一个系统链码可以仅通过升级peer程序的二进制包来得到升级。系统链码可以用预定义的元素注册并编译到peer程序中,而且不需要有类似于背书策略或背书功能等这样的冗杂的功能。
系统链码被用在fabric中,去操纵整个系统的配置表现,这样的话可以随时把系统改变到合适的状态。
当前存在的系统链码名单:
- LSCC Lifecycle system chaincode,处理生命周期请求。我理解的生命周期请求应该指的是一个chaincode的安装,实例化,升级,卸载等对其生命周期起关键作用的一系列操作请求。
- CSCC Configuration system chaincode,处理在peer程序端的频道配置。
- QSCC Query system chaincode,提供账本查询接口,如获取块和交易信息。
- ESCC Endorsement system chaincode,通过对交易申请的应答信息进行签名,来提供背书功能。
- VSCC Validation system chaincode,处理交易校验,包括检查背书策略和版本在并发时的控制。
在修改或替换系统链码时必须注意,特别是LSCC,ESCC和VSCC,因为它们处于重要的交易环节中。以vscc为例,因为区域链中的交易数据都是持久性的,因此当vscc在提交一个block到账本中之前先验证该块,这不值什么,重要的是在同频道中的所有peer必须计算出相同的证书(由验证输出的证书)以避免账本产生冲突。因此特别需要注意的是vscc被修改或替换时,要避免和以前所产生的交易数据产生冲突。
- fabric源码解析8——peer的System Chaincode
- fabirc1.0商业正式版本源码解析8——peer的System Chaincode
- fabric源码解析17——chaincode的元数据
- fabric源码解析7——peer的ChaincodeSupport服务
- fabric源码解析12——peer的MSP服务
- fabric源码解析13——peer的BCCSP服务
- fabric源码解析2——peer命令结构
- fabric源码解析11——peer的Admin和Endorser服务
- fabric源码解析14——peer的gossip服务之初始化
- fabric源码解析15——peer的gossip服务之散播
- fabric源码解析16——peer的gossip服务之测试
- Hyperledger Fabric继peer启动之后的源码解析一
- Hyperledger Fabric继peer启动之后的源码解析二
- Hyperledger Fabric继peer启动之后的源码解析三
- Hyperledger Fabric处理Peer与Peer之间通信的源码解析
- HyperLedger Fabric ChainCode开发——shim.ChaincodeStubInterface用法
- fabric源码解析19——ACC的安装
- fabric源码解析20——ACC的部署
- centos安装php扩展swoole及简单使用
- Android通讯录(可上传照片)
- hdu3336Count the string(KMP的next[]数组的应用+KMP模板)
- 深度学习第二章-线性代数笔记
- DataGridComboBoxColumn绑定后显示空白的问题
- fabric源码解析8——peer的System Chaincode
- 总线设备驱动模型
- JAVA使用POI操作word文档实例,兼容doc,docx
- 基于SSM的RBAC权限系统(4)-巧用Shiro自带加密
- 第一次配置java环境变量
- spark的自定义partitioner
- jQuery EasyUI中的Layout布局
- 关于一次云服务器tomcat误删经历
- 字符串逆序输出