深度学习
链码本身是不会存储任何数据的,业务逻辑处理过程中是通过建立好的gRPC连接实现和背书节点的交互,交互过程是通过有限状态机(Finite State Machine)来实现的。有限状态机有下面几个特点:
·状态是有限的,能够遍历完所有的状态;
·有一个初始状态和终止状态以及若干中间状态;
·任意时刻只会处于其中的一个状态;
·处于某个状态下能处理的事件是有限的;
·状态转移之间的转移条件是确定的。
背书节点端和链码端都通过有限状态机定义了各自生命周期内所处的所有状态,以及如何在各种状态下响应各种事件和转移到其他状态。具体实现采用第三方的库http://github.com/looplab/fsm,我们就用fsm来代表这个库。fsm的状态直接用字符串来表示,定义了状态转移映射表。
type EventDesc struct {
// 事件名称
Name string
// 状态转移的源状态列表
Src []string
// 状态转移的目的状态
Dst string
}
其中,状态转移的源状态列表Src是一个数组,是把状态转移合并了,多个状态都可以接收相同的事件转移到相同的目的状态。
回调函数映射表Callbacks定义了事件处理和状态转移的执行函数。
type Callbacks map[string]Callback
type Callback func(*Event)
type Event struct {
// 对当前FSM的引用
FSM *FSM
// 事件名称
Event string
// 交易前的状态
Src string
// 交易后的状态
Dst string
// 回调函数中返回的错误(可选)
Err error
// 回调函数传入的参数(可选)
Args []interface{}
// 数字标识位,当交易取消时设定
canceled bool
// 数字标识位,当异步交易时设定
async bool
}
回调函数映射表Callbacks定义了两种类型的函数。
·事件处理的执行函数:处理某个事件前后的操作,定义规则是before_EVENT和after_EVENT,其中EVENT是某个具体的事件名称。
·状态变化的执行函数:进入某个状态和离开某个状态的操作,定义规则是enter_STATE和leave_STATE,其中STATE是某个具体的状态名称。
同一个链码也可能同时和背书节点进行交互,链码侧也会存在背书节点侧消息的数据分发问题。链码维护了交易的Golang通道responseChannel映射表。
responseChannel map[string]chan pb.ChaincodeMessage
其中,键是交易号txid,值是不同交易号的Golang通道pb.ChaincodeMessage。链码有限 状态机接收到ChaincodeMessage_RESPONSE的消息后,通过给每个交易建立的Golang通道返回给调用接口。能够这么实现的原因 是,尽管可能同时在处理不同的交易,但是同一个交易是顺序执行的,返回的结果也是顺序的。
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=1054
微信号:qq444848023 QQ号:444848023
加入【我是码农】QQ群:864689844(加群验证:我是码农)
全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试
var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!
评论专区