注: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返回數據的回傳流程那裏我沒有往下看了,有興趣的能夠看下。