接下去大概描述一下智能合約和虛擬機(jī)之間的關(guān)系以及編譯執(zhí)行過程倔韭。
智能合約 概要:
智能合約不僅可以實(shí)現(xiàn)轉(zhuǎn)賬恳谎,也可以描述游戲規(guī)則芝此,合約作為注冊(cè)在EOS區(qū)塊鏈的應(yīng)用程序并運(yùn)行在EOS的節(jié)點(diǎn)上。智能合約定義了相關(guān)的接口惠爽,這些接口中包含action, 數(shù)據(jù)結(jié)構(gòu)和相關(guān)的參數(shù)癌蓖。智能合約實(shí)現(xiàn)這些接口,被編譯成wasm 后綴的二進(jìn)制文件婚肆,并執(zhí)行租副。
對(duì)于區(qū)塊鏈而言,最終存儲(chǔ)的是智能合約的交易较性。
智能合約由 action 和類型定義組成:
Action:定義和實(shí)現(xiàn)了智能合約的行為和功能用僧。
類型定義:定義了合約需要的內(nèi)容和數(shù)據(jù)結(jié)構(gòu)。
客戶端發(fā)送消息觸發(fā)action的執(zhí)行赞咙,而智能合約的最終存儲(chǔ)形式是transaction,一個(gè)transaction 可以包含多個(gè)action,至少包含一個(gè)action.
一個(gè)智能合約的定義例子:
#define EOSIO_API( TYPE, MEMBERS ) \
BOOST_PP_SEQ_FOR_EACH( EOSIO_API_CALL, TYPE, MEMBERS )
展開所包含的宏:
#define EOSIO_API_CALL( r, OP, elem ) \
case ::eosio::string_to_name( BOOST_PP_STRINGIZE(elem) ): \
eosio::execute_action( &thiscontract, &OP::elem ); \
break;
從而完成從合約調(diào)用到底層路由調(diào)用的實(shí)現(xiàn)责循。
合約的編譯過程和虛擬機(jī):
智能的合約編譯過程如下:
- 利用clang 以 wasm32 為目標(biāo),生成中間文件bc
- 利用LLVM-Link 鏈接上一個(gè)步驟生成bc 文件 和標(biāo)準(zhǔn)庫 bc 文件生成link.bc 文件
- 利用LLVM的llc 生成 s 匯編文件 assembly.s
- 應(yīng)用eosio-s2wasm 工具將 s 文件轉(zhuǎn)化為wast 文件
- 應(yīng)用eosio-wast2wasm 工具將 wast 文件轉(zhuǎn)化為最終的wast 文件
為何不采用clang 而采用wasm攀操, 筆者認(rèn)為可能是出于考慮到wasm代表今后的趨勢(shì)院仿,未來對(duì)wasm 支持的解釋容器較多,方便多種虛擬機(jī)的接入速和。
WASM虛擬機(jī):
WASM虛擬機(jī)主要位于libraries 下的wasm-jit 下面歹垫。
- libraries/chain: 主要是定義虛擬機(jī)相關(guān)接口
- libraries/wasm-jit: 主要是智能合約的實(shí)現(xiàn)
另外在contracts 目錄下,有ABI的輔助代碼颠放。
wasm-jit 虛擬機(jī)的source code在:~/eos/libraries/wasm-jit/Source下排惨,
主要folder:Emscripten, IR,Runtime, Programs,WASM, WAST
- IR: IR是高級(jí)語言到機(jī)器語言的第一步碰凶,后面WAST的解析暮芭,WASM的序列化處理,- ---Runtime處理的依據(jù)欲低。
- Emscripten:用于將高級(jí)語言轉(zhuǎn)換為L(zhǎng)LVM的字節(jié)碼的工具
- Runtime執(zhí)行引擎: 包括了執(zhí)行字節(jié)碼(機(jī)器碼)辕宏,外部調(diào)用,將字節(jié)碼翻譯為 IR砾莱,生成機(jī)器碼等等功能模塊
- WASM: WASM 的 LICENSE
- WAST: Parse解析的功能模塊
其他: - Logging: 日志管理
- Platforms: 不同平臺(tái)對(duì)應(yīng)