区块链教程Fabric1.0源代码分析scc(系统链码)-兄弟连区块链
区块链教程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 { //创建SystemChaincodeProvider NewSystemChaincodeProvider() 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 //ID ChaincodeName 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 chaincodes InvokableCC2CC: 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 blocks InvokableCC2CC: 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
感谢关注兄弟连区块链教程分享!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何在github上免费发布个人静态博客
●本文仅是缩略,笔者已将详细内容发布到github上 ●可点击本文最后的"阅读更多"进行访问,或者在github上搜"cyent markdown"也可以看到 目录 ● 本文概述 ● mkdocs-material介绍 ● 安装 ● 初始化项目 ● 修改主题 ● 运行 ● 发布到GitHub pages ● 发布到个人HTTP Server ● mkdocs.yml注意事项 ● 添加页面 ● 添加扩展 ● markdown语法 ● 其他功能 ●最佳实践 本文概述 mkdocs-material入门,包括安装、运行、发布至github-pages及个人站点 mkdocs-material介绍 符合google material ui规范的静态文档网站生成器,使用markdown进行文档书写 mkdocs ● python编写的markdown解释器、编译器,带有本地cli工具 ● 自带基于Tornado的小型http服务,用于本地调试 ● 内置一键式发布至GitHub Pages ● 内置mkdocs风格、readthedocs风格的主题,并支持自定义主题 ● 支持调用python模块实...
- 下一篇
69 个经典 Spring 面试题和答案
Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。 2. 使用Spring框架的好处是什么? 轻量:Spring 是轻量的,基本的版本大约2MB。 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器:Spring 包含并管理应用中对象的生命周期和配置。 MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。 事务管理:Spring
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境