zoukankan      html  css  js  c++  java
  • 源码分析(二) 进程间通信机制

    注: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返回数据的回传流程那里我没有往下看了,有兴趣的可以看下。
  • 相关阅读:
    2021年《jmeter高级调优项目实战》秋季班(火热报名中!)
    Jmeter分布式压力测试过程可能遇到的各种坑
    Python编程与数据结构
    Xftp 提示需要升级
    [学习笔记]LGV引理
    PyTorch模型训练特征图可视化
    测试PostGIS是否安装成功
    sift算法使用
    IDEA中Maven Projects里项目灰色解决办法
    SpringCloud从入门到进阶(一)——懂生活就懂微服务
  • 原文地址:https://www.cnblogs.com/hbright/p/9235067.html
Copyright © 2011-2022 走看看