区块链教程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

感谢关注兄弟连区块链教程分享!

相关文章
|
7月前
|
存储 安全 数据管理
新型数据库技术:基于区块链的分布式数据存储系统
传统数据库系统面临着中心化管理、数据安全性和可信度等方面的挑战。本文介绍了一种基于区块链技术的新型数据库系统,通过分布式存储和去中心化的特性,提高了数据的安全性和可信度,同时实现了高效的数据管理和共享。该系统在多个领域如金融、医疗和物联网等具有广阔的应用前景。
|
7月前
|
存储 供应链 监控
区块链技术在供应链管理中的应用与前景分析
随着信息化时代的到来,供应链管理面临着越来越多的挑战和机遇。本文主要探讨了区块链技术在供应链管理中的应用,以及未来的发展前景。通过对区块链技术的特点和优势进行分析,结合实际案例和趋势展望,展示了区块链技术在提升供应链透明度、效率和安全性方面的潜力,以及未来发展的可能方向。
|
7月前
|
存储 算法 API
面向企业的区块链教程(一)(2)
面向企业的区块链教程(一)
116 6
|
4月前
|
安全 区块链
Massa Layer 1区块链 POS 安全性分析
Massa Labs 回应 Certik 的挑战,通过严格的数学分析证明了其权益证明系统的安全性,抵抗了潜在攻击者试图操纵随机抽签的企图。
64 0
Massa Layer 1区块链 POS 安全性分析
|
7月前
|
存储 供应链 安全
构建未来:智能合约在区块链生态系统中的关键作用
【5月更文挑战第30天】 随着区块链技术的迅猛发展,智能合约已成为推动这一领域创新的核心机制。本文深入探讨了智能合约的技术基础、运作原理及其在各行各业中的应用潜力。我们将分析智能合约如何提高交易效率,减少法律纠纷,并为分布式应用(DApps)提供坚实的基础。文章还将讨论智能合约面临的挑战与未来的发展方向,为读者提供一个全面且深入的视角,以理解这一变革性技术如何塑造数字经济的未来。
|
7月前
|
存储 供应链 安全
基于区块链技术的智能合约安全性分析
【5月更文挑战第31天】本文深入探讨了区块链技术中智能合约的安全性问题,通过分析现有智能合约的安全漏洞和攻击手段,提出了一系列增强智能合约安全性的策略。文章首先介绍了区块链和智能合约的基本概念,随后详细讨论了智能合约面临的安全挑战,包括代码漏洞、重入攻击等问题,并对比分析了不同平台下智能合约的安全性差异。最后,文章提出了一系列提高智能合约安全性的建议,旨在为区块链应用的健康发展提供参考。
|
7月前
|
机器学习/深度学习 自动驾驶 物联网
未来技术的脉动:区块链、物联网和虚拟现实的革新之旅基于深度学习的图像识别技术在自动驾驶系统中的应用
【5月更文挑战第28天】 随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在重塑我们的世界。本文将深入探讨这些技术的发展趋势,以及它们在各个行业中的创新应用。区块链技术以其不可篡改和去中心化的特性,正在金融、供应链管理和身份验证等领域引领一场变革。物联网通过智能设备和系统的互联互通,实现数据的高效流通,推动智慧城市和智能家居的发展。而虚拟现实技术则通过沉浸式体验,改变教育、医疗和娱乐等行业的服务模式。这些技术的融合与创新,预示着一个更加智能、互联和虚拟的未来。 【5月更文挑战第28天】 随着人工智能技术的飞速发展,深度学习已经成为推动自动驾驶系统革新的核心力量。本文
|
6月前
|
存储 安全 区块链
元宇宙与区块链技术的关系可以从多个角度进行阐述。以下是对这两者之间关系的详细分析
**元宇宙:虚拟世界融合现实元素,强调交互与沉浸;区块链:去中心化、安全的分布式账本。两者结合,区块链确保元宇宙中虚拟资产安全、支付高效、身份验证私密、治理透明,支撑其经济体系与用户信任,驱动未来发展。**
|
7月前
|
存储 算法 安全
区块链系统开发技术规则分析
区块链核心技术包括:1) 哈希算法,利用单向函数将任意数据转化为固定长度代码,确保安全验证;2) 非对称加密,使用公钥和私钥一对进行加密解密,保证信息安全;3) 共识机制,如PoW、PoS、DPoS等,实现快速交易验证和确认;4) 智能合约,自动执行的可信代码,一旦编写即不可更改,用于自动化交易;5) 分布式存储,将数据分散存储在网络各处,涵盖结构化、非结构化和半结构化数据。
|
6月前
|
区块链
近期区块链市场趋势分析
**区块链市场趋势摘要:** - 跨链技术成熟,提升互操作性,助力区块链网络融合。 - DeFi持续繁荣,智能合约与AMM创新活跃,市场竞争驱动市场壮大。 - NFT市场多样化,拓展至游戏、音乐等领域,实用性增强。 - 区块链寻求绿色转型,通过PoS共识与绿色能源减少能耗。 - 技术模块化、可组合性提升,降低成本,增强系统灵活性。 这些趋势展现区块链潜力,带来机遇与挑战,促进行业创新。