区块链教程Fabric1.0源代码分析scc(系统链码),2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。

Fabric 1.0源代码笔记 之 scc(系统链码)

1、scc概述

scc,system chain codes,即系统链码。包括:

  • cscc,configuration system chaincode,处理在peer通道配置。
  • escc,endorser system chaincode,对交易申请的应答信息进行签名,来提供背书功能。
  • lscc,lifecycle system chaincode,处理生命周期请求,如chaincode的安装,实例化,升级,卸载。
  • qscc,querier system chaincode,提供账本查询,如获取块和交易信息。
  • vscc,validator system chaincode,处理交易校验,包括检查背书策略和版本在并发时的控制。

scc代码分布在core/common/sysccprovider和core/scc目录下,目录结构如下:

  • core/common/sysccprovider目录:
        * sysccprovider.go,SystemChaincodeProvider和SystemChaincodeProviderFactory接口定义。
  • core/scc目录:
         sysccapi.go,SystemChaincode结构体及方法。
        
    sccproviderimpl.go,SystemChaincodeProvider和SystemChaincodeProviderFactory接口实现,即sccProviderFactory和sccProviderImpl结构体及方法。
        * importsysccs.go,scc工具函数。

2、接口定义

2.1、SystemChaincodeProviderFactory接口定义

接口定义如下:

type SystemChaincodeProviderFactory interface {//创建SystemChaincodeProviderNewSystemChaincodeProvider() SystemChaincodeProvider
}
//代码在core/common/sysccprovider/sysccprovider.go

全局变量及相关函数:

var sccFactory SystemChaincodeProviderFactory//为sccFactory赋值
func RegisterSystemChaincodeProviderFactory(sccfact SystemChaincodeProviderFactory)
//获取sccFactory.NewSystemChaincodeProvider()
func GetSystemChaincodeProvider() SystemChaincodeProvider {
//代码在core/common/sysccprovider/sysccprovider.go

补充ChaincodeInstance结构体定义:

type ChaincodeInstance struct {ChainID          string //IDChaincodeName    string //名称ChaincodeVersion string //版本
}
//代码在core/common/sysccprovider/sysccprovider.go

2.2、SystemChaincodeProvider接口定义

接口定义如下:

type SystemChaincodeProvider interface {IsSysCC(name string) bool //是否系统链码IsSysCCAndNotInvokableCC2CC(name string) bool //确认是系统链码且不可通过CC2CC调用IsSysCCAndNotInvokableExternal(name string) bool //确认是系统链码且不可通过提案调用GetQueryExecutorForLedger(cid string) (ledger.QueryExecutor, error) //获取账本的查询执行器
}
//代码在core/common/sysccprovider/sysccprovider.go

3、SystemChaincodeProvider和SystemChaincodeProviderFactory接口实现

SystemChaincodeProviderFactory接口实现,即sccProviderFactory结构体及方法:

type sccProviderFactory struct {
}//构造sccProviderImpl{}
func (c *sccProviderFactory) NewSystemChaincodeProvider() sysccprovider.SystemChaincodeProvider
//代码在core/scc/sccproviderimpl.go

SystemChaincodeProvider接口实现,即sccProviderImpl结构体及方法:

type sccProviderImpl struct {
}func (c *sccProviderImpl) IsSysCC(name string) bool //IsSysCC(name)
func (c *sccProviderImpl) IsSysCCAndNotInvokableCC2CC(name string) bool //IsSysCCAndNotInvokableCC2CC(name)
//l := peer.GetLedger(cid)
//l.NewQueryExecutor()
func (c *sccProviderImpl) GetQueryExecutorForLedger(cid string) (ledger.QueryExecutor, error)
//IsSysCCAndNotInvokableExternal(name)
func (c *sccProviderImpl) IsSysCCAndNotInvokableExternal(name string) bool
//代码在core/scc/sccproviderimpl.go

4、scc工具函数

systemChaincodes定义:

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},{Enabled:           true,Name:              "lscc",Path:              "github.com/hyperledger/fabric/core/scc/lscc",InitArgs:          [][]byte{[]byte("")},Chaincode:         &lscc.LifeCycleSysCC{},InvokableExternal: true, // lscc is invoked to deploy new chaincodesInvokableCC2CC:    true, // lscc can be invoked by other chaincodes},{Enabled:   true,Name:      "escc",Path:      "github.com/hyperledger/fabric/core/scc/escc",InitArgs:  [][]byte{[]byte("")},Chaincode: &escc.EndorserOneValidSignature{},},{Enabled:   true,Name:      "vscc",Path:      "github.com/hyperledger/fabric/core/scc/vscc",InitArgs:  [][]byte{[]byte("")},Chaincode: &vscc.ValidatorOneValidSignature{},},{Enabled:           true,Name:              "qscc",Path:              "github.com/hyperledger/fabric/core/chaincode/qscc",InitArgs:          [][]byte{[]byte("")},Chaincode:         &qscc.LedgerQuerier{},InvokableExternal: true, // qscc can be invoked to retrieve blocksInvokableCC2CC:    true, // qscc can be invoked to retrieve blocks also by a cc},
}
//代码在core/scc/importsysccs.go

涉及scc工具函数如下:

func RegisterSysCCs() //遍历systemChaincodes,调用RegisterSysCC(sysCC)
func DeploySysCCs(chainID string)//遍历systemChaincodes,调用deploySysCC(chainID, sysCC)
func DeDeploySysCCs(chainID string)//遍历systemChaincodes,调用DeDeploySysCC(chainID, sysCC)
func IsSysCC(name string) bool //是否系统链码
func IsSysCCAndNotInvokableExternal(name string) bool //确认是系统链码且不可被发送到此节点的提案调用
func IsSysCCAndNotInvokableCC2CC(name string) bool //确认是系统链码且不可通过chaincode-to-chaincode方式调用
//代码在core/scc/importsysccs.go

5、SystemChaincode结构体及方法

type SystemChaincode struct {Name string //系统链码唯一名称Path string //系统链码路径,当前未使用InitArgs [][]byte //启动系统链码的初始化参数Chaincode shim.Chaincode //实际的shim.Chaincode对象InvokableExternal bool //跟踪是否可以被发送到此节点的提案调用InvokableCC2CC bool //跟踪是否可以通过chaincode-to-chaincode方式调用Enabled bool //启用或禁用
}//注册系统链码,调用inproccontroller.Register(syscc.Path, syscc.Chaincode)
func RegisterSysCC(syscc *SystemChaincode) error
func deploySysCC(chainID string, syscc *SystemChaincode) error //部署链码
func DeDeploySysCC(chainID string, syscc *SystemChaincode) error //停止链码
func buildSysCC(context context.Context, spec *pb.ChaincodeSpec) (*pb.ChaincodeDeploymentSpec, error) //编译链码
func isWhitelisted(syscc *SystemChaincode) bool //是否在白名单,基于chaincode.system配置
//代码在core/scc/sysccapi.go

转载于:https://blog.51cto.com/14041296/2314003

区块链教程Fabric1.0源代码分析scc(系统链码)相关推荐

  1. 区块链教程Fabric1.0源代码分析Chaincode(链码)体系总结

    Fabric 1.0源代码笔记 之 Chaincode(链码) 1.Chaincode概述 Chaincode,即链码或智能合约,代码分布在protos/peer目录.core/chaincode和c ...

  2. 区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现

    区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实 ...

  3. 区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一

    区块链教程Fabric1.0源代码分析Tx(Transaction 交易)一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期 ...

  4. 兄弟连区块链教程Fabric1.0源代码分析configupdate处理通道配置更新

    区块链教程Fabric1.0源代码分析configupdate处理通道配置更新,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初 ...

  5. 兄弟连区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令一

    区块链教程Fabric1.0源代码分析Peer peer根命令入口及加载子命令,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初 ...

  6. 区块链教程Fabric1.0源代码分析流言算法Gossip服务端二

    区块链教程Fabric1.0源代码分析流言算法Gossip服务端二 Fabric 1.0源代码笔记 之 gossip(流言算法) #GossipServer(Gossip服务端) 5.2.commIm ...

  7. 区块链教程Fabric1.0源代码分析configtx#genesis-兄弟连

    区块链教程Fabric1.0源代码分析configtx#genesis,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的 ...

  8. 区块链教程Fabric1.0源代码分析配置交易-生成通道配置二

    兄弟连区块链教程Fabric1.0源代码分析配置交易-生成通道配置二.Generator接口实现,即bootstrapper. type bootstrapper struct {channelGro ...

  9. gossip 区块链_区块链教程Fabric1.0源代码分析流言算法Gossip服务端一兄弟连区块链教程-阿里云开发者社区...

    区块链教程Fabric1.0源代码分析流言算法Gossip服务端一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁.回归理性,表面上看相关人才需求与身价似乎正在回落.但事实上,正是初期泡沫的渐退 ...

最新文章

  1. synopsys PCIE IP协议解析
  2. 尝试Java,从入门到Kotlin(上)
  3. php实现文件夹管理器,php实现文件管理与基础功能操作
  4. 架构体系需要进一步研究探索的V2路线图
  5. consul agent的一个故障
  6. Selenium3自动化测试——7.获得验证信息
  7. Html中元素的分类
  8. Vue+Openlayers+Draw实现画笔切换功能,切换画笔为点、线、面
  9. 安卓APP_ 布局(1)—— LinearLayout
  10. 练习图200例图纸讲解_【宅家数学课23】经典微课6:苏教版六年级下册比例尺典型例题选讲及练习(含答案)...
  11. 阿里云提示微擎被挂图片木马详解
  12. Django-开胃菜
  13. python︱用asyncio、aiohttp实现异步及相关案例
  14. 达梦8数据库安装教程
  15. 计算机软件专业搞腾讯地图,腾讯地图电脑版
  16. 计算机快捷键word,计算机类009-Word的快捷键集锦.doc
  17. 加速计.陀螺仪的使用
  18. 前端开发工程师的前传
  19. 企业微信发送、撤回消息 java代码
  20. 锐捷网络设备初始化配置

热门文章

  1. hadoop+zookeeper+hbase 完全安装手册
  2. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十七:TFT模块 - 显示
  3. WSGI和PASTE
  4. GIT SSH连接遇到到的问题
  5. 如何让网站打开更快第三弹--开启压缩篇
  6. JDK线程池的ThreadFactory
  7. centos ***二
  8. 简洁送货单打印软件的使用意义
  9. 行将消失的烧瓦匠人:“仿古”热潮下迎新生曙光
  10. mybatis的面试一对一,一对多,多对多的mapper.xml配置