超级账本源码分析(十) - peer的ChaincodeSupport服务

简介

接下来的几篇文章将对peer注册的各个服务进行详述。该篇讲述ChaincodeSupport服务,ChaincodeSupport服务为每个peer提供了chaincode操作的支持。
/fabric/peer/node/start.go文件中的serve函数的:

	chaincodeSupport, ccp, sccp := registerChaincodeSupport(ccSrv, ccEndpoint, ca, aclProvider)

给peer注册了ChaincodeSupport服务。registerChaincodeSupport()方法调用了/fabric/core/chaincode/chaincode_support.go里的NewChaincodeSupport()方法生成一个ChaincodeSupport对象。

ChaincodeSupport的服务原型和生成的go分别在/fabric/protos/peer/下的chaincode_shim.proto和chaincode_shim.pb.go中,核心的实现代码在/fabric/core/chaincode/chaincode_support.go中。

// ChaincodeSupport responsible for providing interfacing with chaincodes from the Peer.
type ChaincodeSupport struct {
	Keepalive       time.Duration
	ExecuteTimeout  time.Duration
	UserRunsCC      bool
	Runtime         Runtime
	ACLProvider     ACLProvider
	HandlerRegistry *HandlerRegistry
	Launcher        Launcher
	sccp            sysccprovider.SystemChaincodeProvider
}

FSM

FSM是finite state machine的缩写,有限状态机,是ChaincodeSupport服务使用到的一个第三方库,仓库地址:github.com/looplab/fsm 。FSM将一个事物从状态A向状态B的转化看作一个事件,并可以设置在进入/离开某个状态时自动调用的时机函数。每个状态事件状态时机函数都用字符串关键字表示。
在此简单介绍一下用法:

//创建一个状态机
//三个参数:1.默认状态 2.定义状态事件 3.定义状态转变时调用的函数
fsm := fsm.NewFSM(
    "green",
    fsm.Events{
        //状态事件的名称   该事件的起始状态Src         该事件的结束状态Dst
        //即:状态事件warn(警告事件)表示事物的状态从状态green到状态yellow
        {Name: "warn",  Src: []string{"green"},  Dst: "yellow"},
        {Name: "panic", Src: []string{"yellow"}, Dst: "red"},
        {Name: "calm",  Src: []string{"red"},    Dst: "yellow"},
    },
    //状态事件调用函数,在此称为 时机函数。关键字用'_'隔开,格式是:"调用时机_事件或状态"
    //before表示在该事件或状态发生之前调用该函数,如"before_warn",表示在warn
    //这个状态事件发生前调用这个函数。"before_yellow"表示进入yellow状态之前调用
    //该函数。
    //依此类推,after表示在...之后,enter表示在进入...之时,leave表示在离开...
    //之时。
    fsm.Callbacks{
        //fsm内定义的状态事件函数,关键字指定的是XXX_event和XXX_state
        //表示任一的状态或状态事件
        "before_event": func(e *fsm.Event) {
        fmt.Println("before_event")
        },
        "leave_state": func(e *fsm.Event) {
        fmt.Println("leave_state")
        },
        //根据自定义状态或事件所定义的状态事件函数
        "before_yellow": func(e *fsm.Event) {
        fmt.Println("before_yellow")
        },
        "before_warn": func(e *fsm.Event) {
        fmt.Println("before_warn")
        },
    },
)
//打印当前状态,输出是默认状态green
fmt.Println(fsm.Current())
//触发warn状态事件,状态将会从green转变到yellow
//同时触发"before_warn"、"before_yellow"、"before_event"、"leave_state"函数
fsm.Event("warn")
//打印当前状态,输出状态是yellow
fmt.Println(fsm.Current())

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值