源码分析(二) 进程间通信机制

注: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的配置即可。
 

二.源码赏析

  1. 钱包管理进程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返回数据的回传流程那里我没有往下看了,有兴趣的可以看下。
原文地址:https://www.cnblogs.com/hbright/p/9235067.html