Source base on EOS version: 1.0.5,some photo except.
在eos源碼中,eosiolib庫在源碼中的位置如下:

在\eos\contracts\eosiolib一共有46個文件,其中很大部分都為頭文件,具體的實現都在 eos/libraries/chain/wasm_interface.cpp中,下面我們對每個文件都做一個較為簡單的介紹。
action.h
此頭文件為接口函數,這些C API函數是在 eos/libraries/chain/wasm_interface.cpp 中實現的,主要提供給四大合約使用。
主要包含有這些功能 :
-
action數據的讀取;
-
事務提交后的通知消息(觀察者模式實現);
-
執行action所需要的權限判斷;
-
其它輔助函數;
action.hpp
在action.hpp中定義了action結構體,它是Action打包后的數據形式,即所有push action產生的數據根據各自不同的數據格式進行封裝打包和傳送。其中還涉及到一些執行權限相關的結構體的定義permission_level,它的處理流程如下圖展示:

最后action將會放在對應的vector迭代器中。
asset.hpp
帳戶資產的定義,即一個int64_t表示資金,symbol_type表示單位,目前被定義為SYS。
chain.h
查詢區塊鏈內部狀態的API,目前用於獲取活躍(Active)的生產者,是從controller中拿取的,源碼在eos/libraries/chain/wasm_interface.cpp中實現。
compiler_builtins.h
工具鏈生成的編譯器內嵌部件的API。
contract.hpp
定義所有智能合約的基類,如果自己寫合約,需要從這個基類派生,然后使用eosiocpp工具將自己的頭文件和源文件生成wasm文件及其相關的接口文件。編寫智能合約需要注意各個文件名需要名稱相同,因為加載智能合約時填寫的參數是根據智能合約文件路徑來的。
core_symbol.hpp
定義代幣的單位。
crypto.h
對給定的數據進行各種hash運算並進行存儲,或者對數據進行校驗。源碼在eos/libraries/chain/wasm_interface.cpp中實現。
currency.hpp
貨幣(token合約)的創建、發行、轉帳、余額查詢在里實現。
datastream.hpp & serialize.hpp
定義數據流操作,可以把自定義的類的數據成員放到vector<char>中,需要時可以再次讀取出來,方便數據的傳輸。
db.h
函數都在eos/libraries/chain/wasm_interface.cpp中的database_api類中定義,部分直接定義,部分采用宏定義,源碼實現在eos\libraries\chain\apply_context.cpp中。提供了數據庫的存儲與查詢的基本功能。其中使用的數據庫是controller類中定義的數據,在這里只是一個引用。
dispatcher.hpp
它定義了執行Action的函數模板execute_action,使用遠程API調用Action時,會執行這個函數。其中有兩個宏:
-
EOSIO_API_CALL 內部調用了execute_action函數,執行一個Action;
-
EOSIO_API 使用BOOST_PP_SEQ_FOR_EACH循環調用EOSIO_API_CALL,即調用多個Action;
-
EOSIO_ABI 里面是一個apply函數,后面還調用EOSIO_API這個宏,即它也是用來調用 execute_action來執行action的,在我們自行編寫智能合約的時候在類內部最后會加上這個宏。所以當我們加載自己編寫的智能合約時,會把編寫好的指定的函數功能放到action上面去執行。
eosio.hpp
包含其它一些類型的定義。在開發智能合約時,一般都包含這個頭文件進行智能合約的開發。
eosiolib.cpp & memory.h & memory.hpp
eosiolib中實現了eosio項目中自定義的內存管理,對常見的內存分配方式進行了重新編寫(其實只是簡單的封裝而已)
fixed_key.hpp
固定大小的按鍵按字典順序排序的key,使用數據成員std::array<word_t, num_words()>實現的。
fixedpoint.hpp
32/64/128/256位版本的不動點變量,暫時還不知道做什么用的。
multi_index.hpp
重新封裝了多索引容器模板,最終里面還是使用的boost:multi_index,這一點沒有變化,它具有以下幾個特點:
-
Multi-Index表的二級索引數量不能超過16個;
-
Multi-Index表的表名不能超過12個字符;
-
Multi-Index表支持雙向迭代,即const_iterator和const_reverse_iterator。
很多類型都使用了它來存放,如生產者,投票,單例等等。
optional.hpp
可選類型,與boost:optinal基本一致
permission.h & permission.hpp
在eos/libraries/chain/wasm_interface.cpp的permission_api類中實現,事務提交時需要檢驗執行者的權限在這里。具體的校驗在controller定義的數據庫去比對了。
print.h & print.hpp
eosio中各種參數類型打印函數的定義,最終使用的是std::ostringstream類型。
privileged.h & privileged.hpp、
定義特權用戶的各種資源限制,事務相關參數,塊相關參數,以及數據傳輸時間間隔的各種限制。
producer_schedule.hpp
出塊者相關信息的封裝。
public_key.hpp
公匙
reflect.hpp
c++實現的反射器,帶有大量的宏,可以自行分析下,下面有一個博客對此有些講解:
singleton.hpp
單例模式的封裝,也存儲在multi_index中。
stdlib.hpp
//nothing
symbol.hpp
代幣符號,規定為SYS
system.h
系統時間函數和靜態斷言的定義
time.hpp
時間相關,類似boost中的實現
transaction.h & transaction.hpp
事務相關,主要是對action用vector封裝,另外,對nsaction的數據傳輸也做了各種限制,如預期時間,帶寬,cpu算力,延遲傳輸等等。還有一個get action函數的實現,可以獲取當前區塊相關的數據。
types.h & types.hpp
eosiolib所有使用到的類型都在這里定義,以及name標識符與std::string類型之間轉換函數的定義;
所有文件相互間的引用關系如下:

varint.hpp
整型的定義,在datastream中有應用。
vector.hpp
字節數組