注:EOS代码版本:4.0
一.EOS进程的基本介绍:
EOS项目中主要包括nodeos,cleos,keosd这三个进程,各自的交互大抵以下:
nodeos: 节点运行的进程。通讯包括两个方面:
-
节点与节点的通讯,主要为数据的同步。
-
节点与cleos的通讯。
cleos: EOS客户端进程。主要通讯包括两个方面:
-
cleos与nodeos通讯,主要从节点上获取区块,账户,钱包金额等等;
-
cleos与keosd通讯,用来管理本地钱包。
keosd: 本地钱包进程管理。提供钱包管理的操做及api接口。
-
keosd只与cleos通讯,用于管理钱包。
来一图,简单明了!数据的具体交互以下图所示,

程序开启的顺序信息:
-
cleos第一次运行的时候会将keos带起来运行,而nodeos须要单独开启运行。
-
三个程序均可以带不少命令参数,也有本身的单独配置文件。
-
keosd运行后能够看作是一个http服务器,nodeos也建立了一个http服务器。cleos创建客户端分别与keosd与nodeos进行通讯 ,流程在源码分析中作出解释。
综上所述:三个进程都可以单独开启。keosd也能够由cleos带起来,惟一的原则是cleos客户端,另外两个是服务器,注意一下IP的配置便可。
二.源码赏析
-
钱包管理进程keosd
查看源码,一切从源头main开始,keosd的main函数中,开头自行阅读,无非是配置文件的建立或者加载,不理它,看关键处:

很明显,加载三个插件wallet_plugin, wallet_api_plugin, http_plugin,命名也很规范。三个插件的加载这里不打开了,主要包括插件的初始化,运行,中止三个操做,很简单。打开观察三个插件浏览跟踪下,就会发现wallet_manager这个类了,它提供了钱包的全部操做的api函数,包括钱包的建立,密匙导入,公匙查询,加锁解锁,私匙签名等等。

可是,咱们建立一个名为hml的钱包用的命令是:cleos wallet create -n hml。
So问题来了,cleos和keosd是如何协做通讯建立一个本地钱包的?话很少说,它的核心加载在wallet_api_plugin的实现 中,直接上代码流程:

瞧一瞧,看不懂,继续展开CALL,

发现有点晕,仔细分析下,大体意思:
(1) 造成了一个/v1/wallet/函数名 的字符串,而后是调用钱包的api函数,再而后是注册了一个回调函数,把api函数运行的结果放在了这个回调函数中;
(2)整个过程使用了json格式的数据转换;


还不够:

最后定义在此处,把造成的字符串与钱包的api构成key-value的形式

那最后这个map的调用呢?代码说明一切,看这里:

这里的接口是keosd的http接收数据的地方,在进行json数据转换及数据有效性验证后,调用api函数并返回数据。
举例表示:cleos wallet create //会建立一个名为defaut的钱包
在cleos的源码调用以下:

使用的直接调用CALL,这里的CALL实现以下:


cleos真正发送数据的接口

cleos会向
wallet_url变量的地址发送数据(已转换成json格式),keosd的http收到会进行验证,解析,调用wallet的api,再回转返回数据,造成一套完整的数据通讯到此完成。
最后,咱们看一下接口的定义,全部cleos须要的数据接口函数以下,如此便清晰明了。

流程其实很简单,整个流程其实从下往上看或许更好^_^,另外备注几点:
-
cleos与keosd,cleos与nodeos的通讯都使用http的协议加上json格式进行的;
-
数据格式主要用到fc里的类库进行转换;
-
keosd返回数据的回传流程那里我没有往下看了,有兴趣的能够看下。