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(應用層)
- plugins(插件層)
- 插件的繼承關係
- 1. chain_plugin
- 2. net_plugin
- 3. http_plugin
- 4. producer_plugin
- 5. wallet_plugin
- 6. account_history_plugin
- 7. bnet_plugin
- history_plugin
- http_client_plugin
- mongo_db_plugin
- txn_test_gen_plugin
- chain_api_plugin
- history_api_plugin
- net_api_plugin
- producer_api_plugin
- wallet_api_plugin
- libraries(庫函數層)
- constracts(智能合約層)
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(智能合約層)
主要包含一些智能合約的示例代碼。
set_program_options:用來設置插件的參數
plugin_initialize:實現了插件具體的初始化過程
plugin_startup:運行插件