您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页兄弟连区块链教程Fabric1.0源代码分析scc(系统链码)

兄弟连区块链教程Fabric1.0源代码分析scc(系统链码)

来源:五一七教育网


兄弟连区块链教程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,处理交易校验,包括检查背书策略和版本在并发时的控制。

1 / 13

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

* core/common/sysrovider目录:

* sysrovider.go,SystemChaincodeProvider和SystemChaincodeProviderFactory接口定义。

* core/scc目录:

* sysccapi.go,SystemChaincode结构体及方法。

* sroviderimpl.go,SystemChaincodeProvider和

SystemChaincodeProviderFactory接口实现,即sccProviderFactory和sccProviderImpl结构体及方法。

* importsysccs.go,scc工具函数。

## 2、接口定义

### 2.1、SystemChaincodeProviderFactory接口定义

接口定义如下:

```go

2 / 13

type SystemChaincodeProviderFactory interface {

//创建SystemChaincodeProvider

NewSystemChaincodeProvider() SystemChaincodeProvider

}

//代码在core/common/sysrovider/sysrovider.go

```

全局变量及相关函数:

```go

var sccFactory SystemChaincodeProviderFactory

//为sccFactory赋值

func RegisterSystemChaincodeProviderFactory(sccfact SystemChaincodeProviderFactory)

//获取sccFactory.NewSystemChaincodeProvider()

3 / 13

func GetSystemChaincodeProvider() SystemChaincodeProvider {

//代码在core/common/sysrovider/sysrovider.go

```

补充ChaincodeInstance结构体定义:

```go

type ChaincodeInstance struct {

ChainID string //ID

ChaincodeName string //名称

ChaincodeVersion string //版本

}

//代码在core/common/sysrovider/sysrovider.go

```

### 2.2、SystemChaincodeProvider接口定义

4 / 13

接口定义如下:

```go

type SystemChaincodeProvider interface {

IsSysCC(name string) bool //是否系统链码

IsSysCCAndNotInvokableCC2CC(name string) bool //确认是系统链码且不可通过CC2CC调用

IsSysCCAndNotInvokableExternal(name string) bool //确认是系统链码且不可通过提案调用

GetQueryExecutorForLedger(cid string) (ledger.QueryExecutor, error) //获取账本的查询执行器

}

//代码在core/common/sysrovider/sysrovider.go

```

## 3、SystemChaincodeProvider和SystemChaincodeProviderFactory接口实现

5 / 13

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

```go

type sccProviderFactory struct {

}

//构造sccProviderImpl{}

func (c *sccProviderFactory) NewSystemChaincodeProvider() sysrovider.SystemChaincodeProvider

//代码在core/scc/sroviderimpl.go

```

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

```go

type sccProviderImpl struct {

}

6 / 13

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/sroviderimpl.go

```

## 4、scc工具函数

systemChaincodes定义:

```go

7 / 13

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\

8 / 13

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{},

},

{

9 / 13

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

10 / 13

InvokableCC2CC: true, // qscc can be invoked to retrieve blocks also by a cc

},

}

//代码在core/scc/importsysccs.go

```

涉及scc工具函数如下:

```go

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 //是否系统链码

11 / 13

func IsSysCCAndNotInvokableExternal(name string) bool //确认是系统链码且不可被发送到此节点的提案调用

func IsSysCCAndNotInvokableCC2CC(name string) bool //确认是系统链码且不可通过chaincode-to-chaincode方式调用

//代码在core/scc/importsysccs.go

```

## 5、SystemChaincode结构体及方法

```go

type SystemChaincode struct {

Name string //系统链码唯一名称

Path string //系统链码路径,当前未使用

InitArgs [][]byte //启动系统链码的初始化参数

Chaincode shim.Chaincode //实际的shim.Chaincode对象

InvokableExternal bool //跟踪是否可以被发送到此节点的提案调用

12 / 13

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

```

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

13 / 13

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务