EOS-VM 是 EOS IO 成為通用區(qū)塊鏈協(xié)議的重要基石,同時(shí)超越了 EOS IO 自身,將會(huì)成為事實(shí)上的區(qū)塊鏈虛擬機(jī)技術(shù)標(biāo)準(zhǔn),甚至?xí)⒁蕴缓筒ㄉ性?/p>
EOS-VM 是 EOS.IO 成為通用區(qū)塊鏈協(xié)議的重要基石,同時(shí)超越了 EOS.IO 自身,將會(huì)成為事實(shí)上的區(qū)塊鏈虛擬機(jī)技術(shù)標(biāo)準(zhǔn),甚至?xí)⒁蕴缓筒ㄉ性谄鸩诫A段的虛擬機(jī)開(kāi)發(fā)扼殺在襁褓中。
0、前言
EOS.IO 開(kāi)發(fā)團(tuán)隊(duì) Block.One 于 2019 年 6 月 1 日發(fā)布了全新的 EOS-VM。
EOS 原力團(tuán)隊(duì)在經(jīng)過(guò)大規(guī)模測(cè)試后認(rèn)為,EOS-VM 將成為區(qū)塊鏈行業(yè)使用率最高的 VM,也將率先成為區(qū)塊鏈行業(yè) VM 的事實(shí)標(biāo)準(zhǔn)。
我們?cè)凇禘OS.IO 將迎來(lái)史上最復(fù)雜硬分叉升級(jí)》一文中曾經(jīng)講過(guò),多個(gè)重要的分支都在積極開(kāi)發(fā)中,而 EOS-VM 就是一個(gè)重要性不亞于 1.8.0 的分支。該分支從 2018 年 7 月份就開(kāi)始了,從提交記錄上來(lái)看,早期的 EOS-VM 并沒(méi)有特別緊湊的開(kāi)發(fā)計(jì)劃。然而從 2019 年開(kāi)始,經(jīng)過(guò)了一系列密集的開(kāi)發(fā),初步完成了今天我們所看到的 EOS-VM 項(xiàng)目。
如果說(shuō) EOSIO1.8.0 版本讓我們看到了 Block.one 在 EOS.IO 上的決心,那么 EOS-VM 可以讓我們一窺 Block.one 在區(qū)塊鏈行業(yè)的野心。
1、什么是 VM
VM 全稱為 Virtual Machine,在區(qū)塊鏈語(yǔ)境下可以理解為智能合約的運(yùn)行環(huán)境。
我們可以將智能合約類比于互聯(lián)網(wǎng)中的 HTML,區(qū)塊鏈系統(tǒng)可以看作操作系統(tǒng),那么 VM 則是瀏覽器,各種基于智能合約的 DAPP 就是互聯(lián)網(wǎng)中的各種網(wǎng)站。
以太坊完成了區(qū)塊鏈系統(tǒng)中首個(gè)系統(tǒng)的智能合約支持,其 EVM 虛擬機(jī)也是早期智能合約開(kāi)發(fā)者的主流開(kāi)發(fā)環(huán)境,同時(shí)有非常多的項(xiàng)目都借鑒了以太坊的 VM,如 TRX 的 TVM。
但是 EVM 有其局限性,虛擬機(jī)效率相對(duì)成熟的虛擬機(jī)系統(tǒng)來(lái)說(shuō)極其低下,難以支持更加復(fù)雜的應(yīng)用和環(huán)境。
成熟的虛擬機(jī)系統(tǒng)是一個(gè)由一系列龐大的項(xiàng)目構(gòu)成的體系,事實(shí)上,在目前的環(huán)境下,從零開(kāi)始實(shí)現(xiàn)一個(gè)完整成熟的虛擬機(jī)系統(tǒng)是非常困難的,同時(shí)也是沒(méi)有必要的,因?yàn)閷?duì)于這樣一個(gè)龐大的工程項(xiàng)目,從零開(kāi)始意味著開(kāi)發(fā)者和社區(qū)要承受大量的兼容和學(xué)習(xí)成本,最好的方式是基于現(xiàn)有成熟的虛擬機(jī)標(biāo)準(zhǔn)來(lái)開(kāi)發(fā)適用于區(qū)塊鏈項(xiàng)目的虛擬機(jī)實(shí)現(xiàn)。
因此,大多數(shù)區(qū)塊鏈項(xiàng)目都選擇使用現(xiàn)有成熟的虛擬機(jī)實(shí)現(xiàn),目前可以說(shuō)最適合的莫過(guò)于 WebAssembly 虛擬機(jī),除了 EOS.IO 之外,polkadot 也選擇基于 WebAssembly,而以太坊也在開(kāi)發(fā)基于 WebAssembly 的 ewasm 項(xiàng)目。
對(duì)于區(qū)塊鏈領(lǐng)域來(lái)說(shuō) , 無(wú)論是不是「The Lesser Evil」,WebAssembly 已經(jīng)成為非常重要的一部分了。
作為一個(gè)高性能的去中心化智能合約平臺(tái),EOSIO 中所使用的虛擬機(jī)實(shí)現(xiàn)是整個(gè)項(xiàng)目中非常重要的一部分,在閱讀早期的 EOSIO 實(shí)現(xiàn)代碼時(shí)會(huì)發(fā)現(xiàn),在調(diào)用虛擬機(jī)時(shí),EOSIO 實(shí)現(xiàn)代碼中少有的做了很?chē)?yán)格的封裝,以此來(lái)隱藏虛擬機(jī)實(shí)現(xiàn)的細(xì)節(jié),可以見(jiàn)得 EOSIO 項(xiàng)目將會(huì)在虛擬機(jī)方面做持續(xù)重大的改進(jìn) 。
// EOSIO chain 實(shí)現(xiàn)中少有的接口封裝
class wasm_interface {
public:
enum class vm_type {
wavm,
wabt
};
...
private:
unique_ptr
...
};
從最早使用的 wavm 虛擬機(jī),到后面支持的 wabt 虛擬機(jī),Block.one 團(tuán)隊(duì)一直在改進(jìn)虛擬機(jī)的支持,也在為多虛擬機(jī)兼容作準(zhǔn)備,最終 EOSIO 發(fā)起了更高的挑戰(zhàn),開(kāi)發(fā)出了全新的 EOS-VM,最為 EOSIO 使用的虛擬機(jī)實(shí)現(xiàn)。
如果說(shuō) EVM 是一個(gè)區(qū)塊鏈虛擬機(jī)的話,那么 EOS-VM 則會(huì)是第一個(gè)可大規(guī)模商用的虛擬機(jī)。
2、EOS-VM 是什么
我們先來(lái)看看 EOS-VM 到底是什么,EOS-VM 是一個(gè)區(qū)塊鏈系統(tǒng)專用的 wasm 運(yùn)行時(shí)。
在區(qū)塊鏈系統(tǒng)中,合約代碼會(huì)被編譯成字節(jié)碼的形式,這些字節(jié)碼不能直接在操作系統(tǒng)上運(yùn)行,需要一個(gè)執(zhí)行器來(lái)執(zhí)行這些合約,在軟件體系中,可以把這些執(zhí)行器視為一個(gè)抽象的「機(jī)器」,EOS-VM 就是這樣一個(gè)執(zhí)行器。
EOS-VM 主要做四件事:
首先 ,EOS-VM 負(fù)責(zé)加載和解析編譯后的智能合約字節(jié)碼,也就是 wasm;
其次,EOS-VM 負(fù)責(zé)在字節(jié)碼運(yùn)行過(guò)程中為其分配資源,當(dāng)然對(duì)于智能合約來(lái)說(shuō),可用的資源就是內(nèi)存;
再次,EOS-VM 負(fù)責(zé)向智能合約的字節(jié)碼提供虛擬機(jī)外的 API 調(diào)用功能;
最后,EOS-VM 負(fù)責(zé)執(zhí)行字節(jié)碼來(lái)計(jì)算智能合約運(yùn)行的結(jié)果。
在 EOS-VM 中 eosio::vm::backend 類是整個(gè)虛擬機(jī)系統(tǒng)調(diào)用的入口,在 tools 目錄下有兩個(gè)使用 EOS-VM 虛擬機(jī)的測(cè)試工具,想要詳細(xì)了解 EOS-VM 實(shí)現(xiàn)的讀者可以通過(guò)這些作為入口來(lái)閱讀 EOS-VM 的代碼。
int main(int argc,char**argv) {
...
// 設(shè)置看門(mén)狗 , 限制運(yùn)行時(shí)間為秒
watchdog
wd.set_duration(std::chrono::seconds(3));
try {
...
// 加載 wasm 字節(jié)碼
auto code = backend_t::read_wasm( argv[1] );
// 創(chuàng)建執(zhí)行環(huán)境
backend_t bkend( code );
wd.set_callback([&](){
bkend.get_context().exit();
});
...
// 執(zhí)行
bkend.execute_all(&wd);
} catch ( ... ) {
}
return 0;}
這里說(shuō)的 EOS-VM 的主要工作,但如果只是這些的話,那其實(shí)和 wavm、wabt 沒(méi)什么區(qū)別了,在完成基本的必要工作之外,EOS-VM 針對(duì)區(qū)塊鏈應(yīng)用場(chǎng)景做了一些重要的改進(jìn)和優(yōu)化,下面我們來(lái)結(jié)合 EOS-VM 的介紹文檔以及代碼實(shí)現(xiàn)來(lái)看看 EOS-VM 有哪些重要的改進(jìn)。
3、EOS-VM 有哪些重要的改進(jìn)
EOS-VM 針對(duì)區(qū)塊鏈應(yīng)用場(chǎng)景作了很多的改進(jìn),這些改進(jìn)對(duì)于智能合約開(kāi)發(fā)者來(lái)說(shuō)是最好的禮物。
下面我們先結(jié)合 EOS-VM README 文檔看看有哪些改進(jìn),再結(jié)合現(xiàn)有的 EOS-VM 代碼具體看一下 EOS-VM 是如果做到的。
在早期 EOS-VM 的 README 中 ,Block.one 列舉了以下的改進(jìn) :
1. Satisfying the needs of a blockchain.
2. Security built into the framework.
3. Performance centric design.
4. Light weight and easy to integrate solution.
5. Effortless extendability.
目前的 README 中改為了對(duì)于非開(kāi)發(fā)者更加易懂的描述 :
· Extremely Fast Execution (6x faster than WABT)
· Extremely Fast Parsing/Loading (20x faster than WABT)
· Efficient Time Bound Execution
· Deterministic Execution (Soft Float & Hardware Floating Point options)
· Standards Compliant
· Designed for Parallel Execution
· C++ / Header Only
· Simple API for integrating Native Calls
我們來(lái)逐條分析 :
3.1 滿足區(qū)塊鏈場(chǎng)景下的需求
首先 Block.one 對(duì) EOS-VM 的定位是「A VM for Blockchain」,這意味著 EOS-VM 中在 WebAssembly 的基礎(chǔ)上添加了很多區(qū)塊鏈所需的特定功能。
目前主要是三方面:
首先是浮點(diǎn)數(shù)的支持。對(duì)于浮點(diǎn)數(shù),很多開(kāi)發(fā)者往往片面的認(rèn)為其運(yùn)算是不精確的,無(wú)法用于區(qū)塊鏈系統(tǒng)。實(shí)際上并非如此,只是對(duì)于一些不同的硬件中,因?yàn)楦鞣N各樣的歷史原因,硬件中固化的浮點(diǎn)數(shù)運(yùn)算有一些差異,解決這一點(diǎn)最好的方式是使用 softfloat 庫(kù),不使用機(jī)器硬件提供的浮點(diǎn)數(shù),這樣不同的硬件機(jī)器上,浮點(diǎn)數(shù)運(yùn)算的結(jié)果都是相同的了。當(dāng)然這里 Block.one 也提到,如果不在乎所有平臺(tái)上保持浮點(diǎn)數(shù)運(yùn)算的確定性,則可以使用基于硬件的浮點(diǎn)數(shù)運(yùn)算,這樣效率會(huì)比使用 softfloat 快很多,這種情況一般是節(jié)點(diǎn)硬件機(jī)器會(huì)保持統(tǒng)一的狀態(tài)下使用的。
在 EOSIO 中其實(shí)也集成了 softfloat 庫(kù),但是之前的實(shí)現(xiàn)是在鏈中嵌入的,原生的虛擬機(jī)中本身不支持,現(xiàn)在并入虛擬機(jī)實(shí)現(xiàn),可以降低其他區(qū)塊鏈?zhǔn)褂?EOS-VM 時(shí)的開(kāi)發(fā)成本。
其次是 EOS-VM 增加了 watchdog 機(jī)制以確保運(yùn)行字節(jié)碼的運(yùn)行時(shí)間限制,這個(gè)類似看門(mén)狗的機(jī)制,會(huì)在細(xì)粒度上對(duì)合約進(jìn)行資源使用限制。
這一點(diǎn)很重要 , 以至于后期的介紹文檔中要單獨(dú)分出一節(jié)來(lái)描述。
如果看過(guò) EOS 現(xiàn)在的代碼,會(huì)發(fā)現(xiàn)有很多大量雜亂的代碼在處理合約執(zhí)行超時(shí)的問(wèn)題,對(duì)于一個(gè)圖靈完備的智能合約來(lái)說(shuō),最大的困難在于我們?nèi)绻粓?zhí)行一遍其合約,就無(wú)法知道其執(zhí)行消耗,所以 EOS 中需要邊執(zhí)行智能合約邊判定其消耗時(shí)間,對(duì)于 EOS 鏈的環(huán)境來(lái)說(shuō) VM 是個(gè)黑盒,所以如果在 VM 外來(lái)進(jìn)行合約執(zhí)行時(shí)間判定的話就會(huì)非常困難,而 EOS-VM 在這方面提供了內(nèi)置支持,相關(guān)的實(shí)現(xiàn)就會(huì)非常簡(jiǎn)單,也會(huì)避免這方面出現(xiàn)的問(wèn)題。
最后是一些虛擬機(jī)執(zhí)行時(shí)的邊界限制,這些邊界限制乍看上去是一些功能的限制,但是在區(qū)塊鏈應(yīng)用場(chǎng)景下,這些限制不會(huì)帶來(lái)實(shí)際功能的限制,反而基于這些斷言,EOS-VM 可以得到極大的優(yōu)化。
3.2 內(nèi)置的安全性支持
支持智能合約的區(qū)塊鏈系統(tǒng)可以視作一臺(tái)公用的計(jì)算機(jī),而公用意味著必須對(duì)使用者進(jìn)行限制。如果使用者可以毫無(wú)限制的運(yùn)行自己的代碼,那么會(huì)帶來(lái)很大的安全性問(wèn)題,對(duì)于公鏈來(lái)說(shuō),這是不能接受的。
這里的安全性問(wèn)題主要是兩方面:代碼行為的安全性和代碼消耗的有界性。
首先,EOS-VM 通過(guò)內(nèi)置類型來(lái)保證類型的安全性,并且通過(guò)可選的分配器來(lái)使用系統(tǒng)提供的機(jī)制來(lái)保證沙箱性。
另外,上文提到的 watchdog 機(jī)制以確保運(yùn)行字節(jié)碼的運(yùn)行時(shí)間限制。對(duì)于公鏈來(lái)說(shuō),如果沒(méi)有有效的機(jī)制,這一點(diǎn)往往會(huì)引起公鏈的安全問(wèn)題。EOSIO 之前就出現(xiàn)過(guò)基于延遲交易引發(fā)的阻塞攻擊問(wèn)題,這個(gè)問(wèn)題本質(zhì)上就是沒(méi)有有效細(xì)致的界定資源使用的問(wèn)題。相應(yīng)的以太坊也多次出現(xiàn)類似的問(wèn)題,以太坊早期的數(shù)次硬分叉都是為了解決這類問(wèn)題。
最后,EOS-VM 在任何時(shí)候都不會(huì)觸發(fā)無(wú)限制的遞歸或循環(huán),嚴(yán)格限制某些 WASM 有意或者無(wú)意導(dǎo)致的崩潰或無(wú)限掛起機(jī)器的情況。
這些內(nèi)置的安全性支持將會(huì)大大提高鏈的安全性,同時(shí)也會(huì)提供一個(gè)可控的安全性保證。
3.3 面向高性能的設(shè)計(jì)
在很多時(shí)候,特化就是最好的優(yōu)化。
實(shí)際上,如果完全兼容 WebAssembly,那么 EOS-VM 優(yōu)化的空間并不大。但是對(duì)于區(qū)塊鏈的需求場(chǎng)景,很多 WebAssembly 的設(shè)計(jì)并不需要,EOS-VM 基于這一點(diǎn)做了大量的特化,同時(shí)意味著性能上,EOS-VM 也得到了非常大幅度的優(yōu)化。
EOS-VM 性能主要得益于對(duì)其內(nèi)置化的類型的優(yōu)化,EOS-VM 內(nèi)置了絕大多數(shù)合約需要的數(shù)據(jù)類型,對(duì)于這些類型 EOS-VM 就可以對(duì)其一一優(yōu)化,特別是 variant,這個(gè)類型其實(shí)并不是一個(gè)原生的功能。如果直接使用類似 union 的話,會(huì)造成很大的類型安全問(wèn)題,使用 variant,雖然在實(shí)現(xiàn)時(shí)得到了很好的安全性和易用性保證。但是如果不將其集成入虛擬機(jī)層,那么其復(fù)雜的實(shí)現(xiàn)會(huì)帶來(lái)很大的性能損耗。
類似的還有 vector,如果閱讀現(xiàn)在的 EOS 系統(tǒng)合約,會(huì)發(fā)現(xiàn)大量使用了 vector,誠(chéng)然對(duì)于合約設(shè)計(jì)來(lái)說(shuō),使用 vector 是非常便捷的,但是很多對(duì)性能特別敏感的開(kāi)發(fā)者可能會(huì)對(duì)此感到非常「不安」,如今 VM 直接集成 vector,可以料想后續(xù)這些開(kāi)發(fā)者就可以「更愉快的」使用 vector 了。
現(xiàn)在的 EOS 合約開(kāi)發(fā)需要依賴一個(gè)規(guī)模不算小的基礎(chǔ)庫(kù),這意味著每個(gè)使用這些基礎(chǔ)功能的合約都要集成其實(shí)現(xiàn)代碼,將大量的基礎(chǔ)庫(kù)代碼帶入 wasm 層,如今 EOS-VM 在虛擬機(jī)的實(shí)現(xiàn)層植入這些基礎(chǔ)類型,性能優(yōu)化空間自然得到很大提高。
3.4 輕量級(jí)易于植入的架構(gòu)
EOS-VM 是純頭文件的,這意味著 EOS-VM 可以被嵌入進(jìn)幾乎所有的 C++項(xiàng)目中。
同時(shí),EOS-VM 在設(shè)計(jì)做了特別的處理,使得 EOS-VM 可以很好的適應(yīng)多線程環(huán)境,C++多線程編程一度是個(gè)「深坑」,構(gòu)建一個(gè)可以在并發(fā)環(huán)境下安全運(yùn)行的庫(kù)很多時(shí)候需要避免很多問(wèn)題,EOS-VM 在這個(gè)問(wèn)題上做了很多準(zhǔn)備,可以避免重蹈像 std::string 在多線程環(huán)境下那樣的「覆轍」。
純頭文件的優(yōu)勢(shì)還有很多,在這個(gè)方面 EOS-VM 已經(jīng)很像在很多方面得到廣泛應(yīng)用的 LUA,后者同樣以輕量級(jí)的運(yùn)行時(shí)著稱,可以預(yù)見(jiàn),未來(lái)會(huì)有更多的非 EOS 甚至非區(qū)塊鏈項(xiàng)目使用 EOS-VM。
3.5 高度可擴(kuò)展性
EOS-VM 擁有一套精細(xì)設(shè)計(jì)的結(jié)構(gòu),從某些方面上來(lái)講,EOS-VM 要比 EOSIO 的代碼結(jié)構(gòu)好得多。
EOS-VM 的設(shè)計(jì)中充分考慮了其拓展性,對(duì)于一個(gè) VM 來(lái)說(shuō)其主干結(jié)構(gòu)幾乎沒(méi)有什么需要拓展和修改的地方,因?yàn)槠涔δ芫褪巧厦嫣岬降乃募隆?/p>
但是對(duì)于不同的應(yīng)用場(chǎng)景,其字節(jié)碼格式和功能必然需要拓展和修改,EOS-VM 在響應(yīng)的地方都做了設(shè)計(jì),其中深度應(yīng)用了 visitor 模式,使得在不改變類架構(gòu)的前提下也可以很容易的為整個(gè) VM 添加功能。
在很多人眼里,一個(gè)良好的架構(gòu)似乎沒(méi)有什么作用,畢竟你并不能把「架構(gòu)良好」看作一個(gè)「前無(wú)古人」的新特性,但是對(duì)于項(xiàng)目開(kāi)發(fā)而言,良好的架構(gòu)會(huì)決定著整個(gè)項(xiàng)目后續(xù)的潛力。
總的來(lái)說(shuō),閱讀現(xiàn)在的 EOS-VM 項(xiàng)目,會(huì)有一種類似 lua 或者 redis 項(xiàng)目的感覺(jué),整個(gè)項(xiàng)目規(guī)模不大,結(jié)構(gòu)緊湊,代碼很干凈。
雖然大量使用 C++特性會(huì)讓一些初學(xué)者感到困惑,但并不會(huì)影響到對(duì)功能的理解,我們認(rèn)為 EOS-VM 在未來(lái)將會(huì)在更廣泛的領(lǐng)域中發(fā)揮更大的作用。
4、EOS-VM 對(duì) EOSIO 生態(tài)的影響
EOSIO 作為一個(gè)開(kāi)源軟件,社區(qū)基于 EOSIO 啟動(dòng)了不同功能和治理理念的 EOS 網(wǎng)絡(luò)、EOS、EOS 原力、ENU、Telos、worbli,BOS 等網(wǎng)絡(luò)均在 Block.one 的技術(shù)支持下發(fā)展,而本次 VM 的改革將使得所有基于 EOSIO 啟動(dòng)的公有鏈?zhǔn)芤妗?/p>
從現(xiàn)有的實(shí)現(xiàn)來(lái)看,EOS-VM 將會(huì)盡量與當(dāng)前 EOSIO 虛擬機(jī)實(shí)現(xiàn)保持兼容,出現(xiàn)不兼容的地方,也可以基于 abi 中的 version 來(lái)進(jìn)行區(qū)別。未來(lái)即使出現(xiàn)大量和 EOS 原力一樣對(duì) EOSIO 底層代碼進(jìn)行了大量改進(jìn)的區(qū)塊鏈,也可以輕松兼容。
未來(lái)一段時(shí)間之內(nèi),基于 EOSIO 鏈的公鏈的開(kāi)發(fā)者可以集成 EOS-VM 到鏈中,同時(shí)保持原有 wasm 支持。
引入 EOS-VM 可以為鏈帶來(lái)很多好處和影響。
4.1 節(jié)約用戶資源消耗
如上文所述,使用 EOS-VM 可以提升鏈的性能,用戶使用基于 EOS-VM 運(yùn)行的智能合約可以節(jié)省大量的鏈上資源消耗。
在基于 EOSIO 的公鏈中往往主要有三類資源:CPU、NET 和 RAM,CPU 主要由合約運(yùn)行消耗的實(shí)際時(shí)間來(lái)結(jié)算,NET 主要與交易的大小相關(guān),而 RAM 主要是基于合約帶來(lái)的狀態(tài)變換所使用的內(nèi)存大小來(lái)決定的。
其中,現(xiàn)階段 EOS-VM 主要將會(huì)節(jié)省用戶 CPU 資源,這方面也是現(xiàn)在 EOSIO 網(wǎng)絡(luò)主要的資源限制,對(duì)于 EOSIO 網(wǎng)絡(luò)來(lái)說(shuō),NET 資源消耗往往固定,而 RAM 可以通過(guò)不斷的增發(fā)來(lái)激勵(lì)節(jié)點(diǎn)升級(jí),這樣就可以在網(wǎng)絡(luò)上增加 RAM 的供給。
從硬件的角度來(lái)說(shuō),目前的服務(wù)器性能所支持的 RAM 升級(jí)空間還是非常寬裕的,但是對(duì)于 CPU,目前的限制很大,正如 BM 在電報(bào)群中所發(fā)的「牢騷」,英特爾并沒(méi)有給 EOS 造出 100 太赫茲的 CPU,當(dāng)然這只是開(kāi)的玩笑,但是確實(shí)當(dāng)前服務(wù)器 CPU 性能限制還是比較大的,對(duì)于服務(wù)器來(lái)說(shuō),近幾年主要是并行計(jì)算能力的提高,單核性能雖然也得到了一定程度上的提升,但依然顯得不足。
為 EOSIO 添加并行計(jì)算支持是一個(gè)比較長(zhǎng)的過(guò)程,即使 EOSIO 可以支持并行計(jì)算,也會(huì)受單核計(jì)算性能限制,因?yàn)閷?duì)于合約來(lái)說(shuō),其計(jì)算過(guò)程依然是單線程的,提升虛擬機(jī)效率,對(duì)基于 EOSIO 的鏈來(lái)說(shuō)非常有用。
4.2 使得鏈具有更強(qiáng)的拓展性
EOS-VM 無(wú)論是代碼還是架構(gòu)都十分簡(jiǎn)介明了,為了保持簡(jiǎn)單和純頭文件化,Block.one 甚至沒(méi)有引入其「祖?zhèn)鳌沟?fc 庫(kù),多數(shù)開(kāi)發(fā)者只要簡(jiǎn)單了解一下 wasm 字節(jié)碼的定義文檔,就可以沒(méi)有障礙的閱讀和理解 EOS-VM 的設(shè)計(jì)和代碼。
這樣,開(kāi)發(fā)者可以很簡(jiǎn)單的在 EOS-VM 的基礎(chǔ)之上進(jìn)行二次開(kāi)發(fā),尤其對(duì)于一些基于 EOSIO 技術(shù)的鏈,開(kāi)發(fā)者可以簡(jiǎn)單的添加新的類型以滿足特定鏈的特殊需求。
4.3 更簡(jiǎn)單的開(kāi)發(fā)外圍工具
EOS-VM 是純頭文件的,這意味著 EOS-VM 可以被嵌入進(jìn)幾乎所有的 C++項(xiàng)目中,而且通過(guò)簡(jiǎn)單的處理,EOS-VM 也可以被基于其他語(yǔ)言開(kāi)發(fā)的項(xiàng)目中。
如 EOS-VM 中 tools 中的 interp,只需要不到 100 行代碼就可以構(gòu)建起 EOS-VM 的運(yùn)行時(shí)環(huán)境,這樣對(duì)于開(kāi)發(fā)用于開(kāi)發(fā) EOSIO 合約的工具非常有用。
很多 EOS 合約開(kāi)發(fā)的初學(xué)者都會(huì)想要調(diào)試合約代碼,在以往這是幾乎不可能的,雖然新版的 cdt 中也提供了一個(gè) native lib,但是這樣也無(wú)法完美的模擬合約的運(yùn)行環(huán)境。
雖然「好的代碼不是調(diào)出來(lái)的」,但是缺乏一個(gè)調(diào)試環(huán)境也會(huì)帶來(lái)一些麻煩。另一方面,我們也要考慮合約運(yùn)行時(shí)與現(xiàn)有開(kāi)發(fā)工具的集成問(wèn)題,而 EOS-VM 可以很好的滿足這一點(diǎn)。
通過(guò) EOS-VM,未來(lái) EOSIO 開(kāi)發(fā)生態(tài)將會(huì)更加完善,開(kāi)發(fā)效率將會(huì)大幅提高。
5、EOSIO 正在向真正的協(xié)議演進(jìn)
不知不覺(jué)中,EOSIO 的官網(wǎng) slogan 已經(jīng)從「最強(qiáng)大的去中心化應(yīng)用平臺(tái)」改為「build on chang,build on EOSIO」。同樣在 EOS-VM 的設(shè)計(jì)中,開(kāi)發(fā)者已經(jīng)無(wú)法明顯感受到 EOSIO 和 DPOS 共識(shí)機(jī)制的存在,EOS-VM 的設(shè)計(jì)非常獨(dú)立。
如果一直關(guān)注 EOSIO 發(fā)展的話,會(huì)發(fā)現(xiàn) EOSIO 的合約層在逐漸的去 EOSIO 化,從像 eosio_assert 改為 check 這樣的改名,到 cdt 中完全去除 capi 的調(diào)用這樣的重構(gòu),目前的 EOS 合約開(kāi)發(fā)中,開(kāi)發(fā)者會(huì)越來(lái)越少的碰到「EOS」。
一個(gè)典型的例子就是不同 EOSIO 姊妹鏈間的合約移植,現(xiàn)在基于 cdt 的合約在不同的項(xiàng)目間的差別已經(jīng)越來(lái)越少,早期社區(qū)曾經(jīng)對(duì)像 enu 這樣由于大量不必要的改名所引發(fā)的不兼容表示非常困擾,但現(xiàn)在如果使用 cdt 工具,開(kāi)發(fā)者幾乎感受不到 enu 改名所帶來(lái)的不兼容。
這一切都在意味著 EOSIO 正在向真正的協(xié)議演進(jìn)。
Block.one 團(tuán)隊(duì)在早期并不像其他項(xiàng)目一樣,急于構(gòu)建抽象的協(xié)議和形式化的黃皮書(shū),而是以非常務(wù)實(shí)的態(tài)度進(jìn)行 EOS 的開(kāi)發(fā),這也在一定方面上使得 EOSIO 這一公鏈的主網(wǎng)啟動(dòng)要遠(yuǎn)遠(yuǎn)早于其他的「第三代」區(qū)塊鏈項(xiàng)目。
我們認(rèn)為 Block.one 團(tuán)隊(duì)不會(huì)一直在「埋頭造車(chē)」, 而是采用自底向上的思路,不斷的發(fā)展 EOSIO 生態(tài),使其向真正的協(xié)議演進(jìn),最終成為一個(gè)極具競(jìng)爭(zhēng)力的區(qū)塊鏈協(xié)議事實(shí)標(biāo)準(zhǔn)。
6、Block.one 打響區(qū)塊鏈標(biāo)準(zhǔn)之爭(zhēng)的第一槍
長(zhǎng)久以來(lái),任何一個(gè)軟件的細(xì)分領(lǐng)域都在謀求技術(shù)標(biāo)準(zhǔn)的整合和統(tǒng)一,這樣的統(tǒng)一并非是由中心話組織去強(qiáng)制推行,而是通過(guò)軟件本身逐漸得到主流市場(chǎng)的認(rèn)可,最后成為事實(shí)上的技術(shù)標(biāo)準(zhǔn)。
而在區(qū)塊鏈 VM 領(lǐng)域,舊的虛擬機(jī)如 EVM 性能低下,單一功能的虛擬機(jī)無(wú)法承載復(fù)雜的智能合約,基于通用設(shè)計(jì)虛擬機(jī)將會(huì)成為未來(lái)主流區(qū)塊鏈項(xiàng)目的必需品,而這樣的區(qū)塊鏈項(xiàng)目目前唯一可選的只有 EOS-VM,EOS-VM 領(lǐng)跑行業(yè)一年多,將會(huì)成為最好的智能合約運(yùn)行環(huán)境的標(biāo)準(zhǔn),其行業(yè)地位將會(huì)類似于 ARM 在手機(jī)芯片行業(yè)的地位,甚至未來(lái) ETH 的智能合約有望在 EOS-VM 上運(yùn)行。
甚至我們也可以大膽的假設(shè),EOS-VM 不會(huì)限于區(qū)塊鏈行業(yè),由于其優(yōu)異的設(shè)計(jì)和實(shí)現(xiàn),甚至?xí)挥糜谙裼螒蛞?、?shù)據(jù)庫(kù)、Web 框架這樣的傳統(tǒng)軟件開(kāi)發(fā)領(lǐng)域。
7、加密社區(qū)的開(kāi)源與技術(shù)標(biāo)準(zhǔn)壟斷
我們都知道,Block.one 在向社區(qū)募資時(shí)一直強(qiáng)調(diào)自己是一個(gè)開(kāi)源組織,所募集的錢(qián)也均要用于開(kāi)發(fā)開(kāi)源的 EOSIO 軟件回饋社區(qū),也為加密經(jīng)濟(jì)社區(qū)帶來(lái)了大量的貢獻(xiàn)。
但 EOS-VM 與 Block.one 以往任何一個(gè)開(kāi)源項(xiàng)目都不同 ,Block.one 罕見(jiàn)地對(duì) EOS-VM 項(xiàng)目保留了其權(quán)利 , 這意味著這個(gè)項(xiàng)目不會(huì)像其他開(kāi)源庫(kù)一樣僅僅是一個(gè)開(kāi)源庫(kù)。保留權(quán)利這一動(dòng)作與其募資時(shí)純粹的開(kāi)源組織定位產(chǎn)生了一定的偏差,甚至可能會(huì)通過(guò)商業(yè)性質(zhì)的授權(quán)來(lái)限制其使用場(chǎng)景。
與傳統(tǒng)互聯(lián)網(wǎng)行業(yè)不同,加密經(jīng)濟(jì)的大部分技術(shù)都是開(kāi)源的,無(wú)論是擴(kuò)容之爭(zhēng)和治理理念之爭(zhēng)均未涉及到技術(shù)標(biāo)準(zhǔn)層面,在開(kāi)源的加密經(jīng)濟(jì)市場(chǎng)中出現(xiàn)一個(gè)志在壟斷的 VM 將帶來(lái)什么樣的影響,我們拭目以待。(孤矢)