eos代碼架構

EOS由programs、plugins、librarires、和contracts四部分組成,可以看出石墨烯的架構和EOS的架構是很相近的,EOS增加了對智能合約的支持。實際上EOS並沒有直接用石墨烯的源代碼,而是重寫了90%的代碼,不過基本架構是一樣的。
石墨烯技術(Graphene blockchain library)是一種區塊鏈底層技術架構,由Cryptonomex公司開發, 採用C++語言編寫。而BM就是Cryptonomex的創始人。他創建的Bitshares、Steem和EOS都是基於石墨烯架構的項目,基於此架構開發的區塊鏈項目還包括YOYOW,公信寶,DECENT等。
我們說的EOS的DPoS共識、高度模塊化等特點其實都是石墨烯架構包含的內容,凡是基於石墨烯技術的項目都具有通用的特性,比如較快的轉賬速度、較高的交易吞吐量以及穩定、功能強大等。不同的項目基於石墨烯架構則會總不同的修改和開發,例如EOS基於DPoS共識增加了BFT容錯算法,手續費改成了免費等《詳談什麼是石墨烯技術?》
《BM的傳奇經歷》

programs(應用層)

cloes:客戶端命令行交互模塊,用於解析用戶命令,根據具體命令請求調用相應的接口,例如查看區塊信息、操作錢包等等。

nodeos:服務器端,也就是區塊生產節點,用於接受客戶端的遠端請求,並打包區塊,主要包含四個插件,chain_plugin、http_plugin、net_plugin、producer_plugin。

keosd:錢包管理模塊,主要包括三個插件,wallet_plugin、wallet_api_plugin、http_plugin。

在這裏插入圖片描述

plugins(插件層)

插件體系
EOS插件由三層類來實現。

最頂層是抽象類abstract_plugin,定義了插件的基本接口。
中間層是插件模板類plugin,主要用來解決插件之間依賴調用
最底層是具體插件類,專注單個插件的業務功能實現。

EOS採用石墨烯引擎爲基礎構建區塊鏈,並且實現了一套靈活的模塊化插件機制,在抽象插件類和具體功能類之間引入一層模板類,來將插件間依賴調用從具體類中解耦出來,有利於插件功能內聚以及新插件擴展。
《插件源碼解析》
在這裏插入圖片描述

插件的繼承關係

系統的插件系統位於 eos/plugins 目錄下,插件系統包含三個層次:

最頂層抽象類

這是一個位於 libraries/appbase/include/appbase/plugin.hpp 文件中的抽象類 abstract_plugin。這個抽象類提供了插件的基本接口,包括:

  • initialize初始化插件。

  • startup運行插件。

  • shutdown關閉插件。

  • set_program_options
    設置插件可以接收的選項。

  • get_state
    返回插件的狀態。插件當前有 4 種狀態,分別是:已註冊、已初始化、運行中、已停止。其中已註冊表示插件對象已經被實例化,但沒有做任何事情;已初始化表示插件的參數已經被初始化,可以隨時運行;運行中插件已經在運行狀態;已停止表示插件已經停止運行。

  • name

表示插件的名稱,通過運行時類識別技術 RITT,結合 boost::core::demangle 來獲取,獲取到的名稱包括了命名空間,比如:eosio::chain_api_plugin。

中間層模板插件

這是一個位於 libraries/appbase/include/appbase/application.hpp 文件中的模板類,它實現了抽象插件中定義的方法,並且定義了一個虛函數來定義了插件的依賴的。

plugin

構造函數。在方法中,通過 C++ 的 RTTI 運行時類型識別技術,獲得具體的實例化插件的名稱,並保存在 _name 屬性中。這個名稱包含了命名空間在內,比如:eosio::chain_api_plugin。

get_state

返回當前的狀態對象 _state。

name

返回當前實例化類的名稱,見構造函數解釋。

register_dependencies

通過 static_cast 方法,把當前插件轉化爲具體的實例化插件,然後調用插件的 plugin_requires 模板方法,加載插件依賴的其他插件。

initialize

如果當前插件不是已註冊狀態,那麼不做任務處理。對於處在已註冊狀態的插件,執行下面的處理:

首先,設置插件狀態爲已初始化;

其次,調用插件的 plugin_requires 模板方法,加載插件依賴的其他插件,並且通過 Lambda 表達式執行其它插件的 initialize 方法;

然後,調用插件的 plugin_initialize 方法,進行初始化;

最後,調用應用程序的 plugin_initialized 方法,把插件加入已初始化集合 initialized_plugins。

通過以上幾個步驟,插件及其依賴都得到了初始化。

startup

如果當前插件不是已初始化狀態,那麼不做任務處理。對於處在已初始化狀態的插件,執行下面的處理:

首先,設置插件狀態爲已啓動;

其次,調用插件的 plugin_requires 模板方法,加載插件依賴的其他插件,並且通過 Lambda 表達式執行其它插件的 startup 方法;

然後,調用插件的 plugin_startup 方法,進行啓動;

最後,調用應用程序的 plugin_started 方法,把插件加入已運行集合 running_plugins。

通過以上幾個步驟,插件及其依賴都是運行中的。

shutdown

如果當前插件不是已初始化狀態,那麼不做任務處理。對於處在已初始化狀態的插件,執行下面的處理:

首先,設置插件狀態爲已停止;

其次,調用插件的 plugin_shutdown 方法,進行停止。

注意:插件的初始與啓動方法分別是在 main 函數中通過調用應用對象的 application::iinitialize_impl 與 application::startup 中被調用的。

最下層具體功能的插件

承擔各種具體功能的插件,這些插件都位於 eos/plugins,它們都定義了下面一些方法:

plugin_requires

模板方法,加載插件的依賴,通過表達式依賴插件的對應方法。

set_program_options

從抽象類類繼承的虛函數

plugin_initialize

實例化插件

plugin_startup

啓動插件

plugin_shutdown

關閉插件

在 EOS 提供的插件中 chain_plugin、net_plugin、http_plugin、producer_plugin 這4個插件不需要用戶手動註冊,節點會自動註冊。

支持動態加載相關組件,實現了應用層的業務邏輯和區塊鏈底層實現的解耦,同時爲應用開發者提供友好的API接口。
系統提供的插件及其功能如下所述:

1. chain_plugin

這個插件承載了 nodeos 節點程序與區塊鏈交互的基本功能,包括:

  • 讀取本地不可逆區塊鏈基本信息;
  • 設置本地鏈檢查點;
  • 設置本地鏈參數;
  • 設置可逆區塊數據庫參數;
  • 設置賬戶黑/白名單;
  • 設置智能合約黑/白名單;
  • 重載區塊鏈初始狀態文件;
  • 刪除、重寫、替換本地區塊鏈數據(包括開始、停止等動作);

2. net_plugin

這個插件定義了 P2P 網絡插件,這個插件承載了 EOS 系統的 P2P 網絡中 TCP/IP 層相關功能,包括 4 個基本功能:

  • 建立節點之間握手並互聯;
  • 監聽/發送/接收新交易請求;
  • 監聽/發送/接收新區塊請求;
  • 驗證接收數據合法性;

3. http_plugin

這個插件定義了網絡 http 插件,這個插件承載了 EOS 系統的 P2 P網絡中 http 層相關功能,包括 3 個基本功能:

  • 監聽/發送/接收新交易請求;
  • 監聽/發送/接收新區塊請求;
  • 驗證接收數據合法性;

4. producer_plugin

定義了區塊生產節點的功能插件,其中功能包括:

  • 生產/打包新區塊數據;
  • 對新區塊簽名;
  • 對接收的區塊進行驗證,包括區塊頭合法性、簽名合法性和交易合法性;

5. wallet_plugin

這個插件定義了錢包插件,這個插件承載了 nodeos 節點程序與錢包交互的相關功能,包括3個基本功能:

  • 創建/讀取錢包文件;
  • 設置解鎖超時時間;
  • 密鑰導入錢包;

6. account_history_plugin

這個插件定義了歷史記錄查詢插件,該插件承載了節點程序對本地鏈發起查詢的相關功能,包括3個基本功能:

  • 指定區塊查詢;
  • 指定賬戶狀態查詢;
  • 指定交易查詢;

7. bnet_plugin

這個插件定義了 EOS 的 P2P 網絡中不同節點之間同步各自本地鏈數據的算法,簡單來講,包括如下特徵:

  • 查找本地鏈上的最後一個區塊ID;
  • 如果本地產生新區塊,則將該區塊發送給其他節點;
  • 如果本地不產生新區塊,則將接受到的未確認交易發送給其他節點;
    faucet_testnet_plugin

這個插件定義了在測試網上快速建立測試帳號的插件,該插件爲測試提供便利。

history_plugin

這個插件定義了查詢指定賬戶中指定公鑰的所有歷史交易記錄。

http_client_plugin

這個插件定義了eos網絡http層響應請求,並做相應的安全驗證的客戶端插件。

mongo_db_plugin

這個插件定義了保存並管理本地不可逆轉區塊鏈數據的MongoDB數據庫基本配置插件。

txn_test_gen_plugin

這個插件定定義了一個每秒自動產生指定數量的交易信息的插件,該插件主要用作對eos網絡的吞吐量(TPS)測試。

chain_api_plugin

這個插件定義了一些用戶可以調用的、區塊鏈相關的 API。主要有:

/v1/chain/abi_bin_to_json
/v1/chain/abi_json_to_bin
/v1/chain/get_abi
/v1/chain/get_account
/v1/chain/get_block
/v1/chain/get_block_header_state
/v1/chain/get_code
/v1/chain/get_code_hash
/v1/chain/get_currency_balance
/v1/chain/get_currency_stats
/v1/chain/get_info
/v1/chain/get_producer_schedule
/v1/chain/get_producers
/v1/chain/get_raw_abi
/v1/chain/get_raw_code_and_abi
/v1/chain/get_required_keys
/v1/chain/get_scheduled_transactions
/v1/chain/get_table_by_scope
/v1/chain/get_table_rows
/v1/chain/get_transaction_id
/v1/chain/push_block
/v1/chain/push_transaction
/v1/chain/push_transactions
db_size_api_plugin

這個插件定義了一些用戶可以調用的關於存儲相關的 API。主要有:

/v1/db_size/get

history_api_plugin

這個插件定義了一些用戶可以調用的、歷史數據相關的 API。主要有:

/v1/history/get_actions
get_transaction
get_key_accounts
get_controlled_accounts

net_api_plugin

這個插件定義了一些用戶可以調用的、網絡數據相關的 API。主要有:

/v1/net/connect
/v1/net/disconnect
/v1/net/status
/v1/net/connections

producer_api_plugin

這個插件定義了一些用戶可以調用的、生產區塊相關的 API。主要有:

/v1/producer/pause
/v1/producer/resume
/v1/producer/paused
/v1/producer/get_runtime_options
/v1/producer/update_runtime_options
/v1/producer/add_greylist_accounts
/v1/producer/remove_greylist_accounts
/v1/producer/get_greylist
/v1/producer/get_whitelist_blacklist
/v1/producer/set_whitelist_blacklist
/v1/producer/get_integrity_hash
/v1/producer/create_snapshot

wallet_api_plugin

這個插件定義了一些用戶可以調用的、錢包相關的 API。主要有:

/v1/wallet/set_timeout
/v1/wallet/sign_transaction
/v1/wallet/sign_digest
/v1/wallet/create
/v1/wallet/open
/v1/wallet/lock_all
/v1/wallet/lock
/v1/wallet/unlock
/v1/wallet/import_key
/v1/wallet/remove_key
/v1/wallet/create_key
/v1/wallet/list_wallets
/v1/wallet/list_keys
/v1/wallet/get_public_keys

鏈接:https://www.jianshu.com/p/11c210b6f8f1
在這裏插入圖片描述

libraries(庫函數層)

爲應用層和插件層提供基礎能力,實現了區塊鏈的底層關鍵技術,例如,交易處理,生產區塊,加密功能,文件IO操作,網絡通信能力等等;

appbase

chain

fc

-crypto

-io

-log

-network

-rpc

utilities

constracts(智能合約層)

主要包含一些智能合約的示例代碼。

《5行代碼幫你梳理EOS.IO的脈絡》

《Boost.Program_options簡述參數選項》

set_program_options:用來設置插件的參數

plugin_initialize:實現了插件具體的初始化過程

plugin_startup:運行插件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章