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

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

相关文章
|
5月前
|
存储 供应链 监控
区块链技术在供应链管理中的应用与前景分析
随着信息化时代的到来,供应链管理面临着越来越多的挑战和机遇。本文主要探讨了区块链技术在供应链管理中的应用,以及未来的发展前景。通过对区块链技术的特点和优势进行分析,结合实际案例和趋势展望,展示了区块链技术在提升供应链透明度、效率和安全性方面的潜力,以及未来发展的可能方向。
|
2月前
|
安全 区块链
Massa Layer 1区块链 POS 安全性分析
Massa Labs 回应 Certik 的挑战,通过严格的数学分析证明了其权益证明系统的安全性,抵抗了潜在攻击者试图操纵随机抽签的企图。
56 0
Massa Layer 1区块链 POS 安全性分析
|
5月前
|
存储 供应链 安全
基于区块链技术的智能合约安全性分析
【5月更文挑战第31天】本文深入探讨了区块链技术中智能合约的安全性问题,通过分析现有智能合约的安全漏洞和攻击手段,提出了一系列增强智能合约安全性的策略。文章首先介绍了区块链和智能合约的基本概念,随后详细讨论了智能合约面临的安全挑战,包括代码漏洞、重入攻击等问题,并对比分析了不同平台下智能合约的安全性差异。最后,文章提出了一系列提高智能合约安全性的建议,旨在为区块链应用的健康发展提供参考。
|
4月前
|
存储 安全 区块链
元宇宙与区块链技术的关系可以从多个角度进行阐述。以下是对这两者之间关系的详细分析
**元宇宙:虚拟世界融合现实元素,强调交互与沉浸;区块链:去中心化、安全的分布式账本。两者结合,区块链确保元宇宙中虚拟资产安全、支付高效、身份验证私密、治理透明,支撑其经济体系与用户信任,驱动未来发展。**
|
5月前
|
存储 算法 安全
区块链系统开发技术规则分析
区块链核心技术包括:1) 哈希算法,利用单向函数将任意数据转化为固定长度代码,确保安全验证;2) 非对称加密,使用公钥和私钥一对进行加密解密,保证信息安全;3) 共识机制,如PoW、PoS、DPoS等,实现快速交易验证和确认;4) 智能合约,自动执行的可信代码,一旦编写即不可更改,用于自动化交易;5) 分布式存储,将数据分散存储在网络各处,涵盖结构化、非结构化和半结构化数据。
|
4月前
|
区块链
近期区块链市场趋势分析
**区块链市场趋势摘要:** - 跨链技术成熟,提升互操作性,助力区块链网络融合。 - DeFi持续繁荣,智能合约与AMM创新活跃,市场竞争驱动市场壮大。 - NFT市场多样化,拓展至游戏、音乐等领域,实用性增强。 - 区块链寻求绿色转型,通过PoS共识与绿色能源减少能耗。 - 技术模块化、可组合性提升,降低成本,增强系统灵活性。 这些趋势展现区块链潜力,带来机遇与挑战,促进行业创新。
|
5月前
|
供应链 区块链 数据安全/隐私保护
探索区块链技术在金融领域的应用与前景分析
本文将深入探讨区块链技术在金融领域的具体应用场景,分析其优势与挑战,并展望未来发展趋势。通过案例分析和技术解析,揭示区块链技术在金融行业中的革新意义及前景。
614 15
|
区块链
区块链的发币流程技术分析
区块链现在是发展的如火如荼,很多人都想趁着这个风口,投入区块链创业的浪潮中。 那么我们该怎么做才能抓住这个机会呢? 进行区块链发币要求是很多的,主要有以下几个步骤。
|
安全 算法 区块链
区块链交易所开发技术说明:智能合约设计与实现步骤实现分析
智能合约是区块链技术的核心应用,其能够自动执行、验证和执行合同,并以可验证的方式进行操作。在区块链交易所中,智能合约扮演着重要的角色,它们保证了交易的透明性、效率和安全性。作为一名专业的交易所开发团队一员,在交易所开发这块拥有相对成熟的开发技术,目前已经有成熟的区块链交易所开发案例。本文将介绍如何设计和实现可靠的智能合约来支持区块链交易所。
|
区块链 安全 数据安全/隐私保护
区块链LP流动性SWAP博饼交易所系统开发分析模式
Web3在生态的每一个要素中,都体现出了去中心化的特点。