NEO的智能合約虛擬機(jī)

我們這篇文章通過分析NEO的虛擬機(jī)原理,來了解下智能合約的技術(shù)實(shí)現(xiàn)原理。其實(shí)智能合約的雛形就是比特幣交易中的驗(yàn)證腳本。只不過比特幣只提供了有限的指令,是非圖靈完備的,所以功能有限。

大家也知道以太坊的智能合約是運(yùn)行在以太坊的虛擬機(jī)(EVM)中,還專門發(fā)明了運(yùn)行在EVM上的語言(solidity),而NEO是可以直接用C#,JAVA來編寫的。在NEO中虛擬機(jī)我們稱作AVM。

現(xiàn)在我們就看下面這張圖:

neo虛擬機(jī)框架圖

這張圖整體描述了智能合約的工作原理,這張圖包括三部分內(nèi)容:

1,智能合約編譯器(Compiler)

2,? ?虛擬機(jī)執(zhí)行和計(jì)算引擎(AVM)

3, 虛擬機(jī)的互操作層(interop Service)

其中智能合約編譯器就是我們編寫智能合約的地方,現(xiàn)在NEO支持C#,JAVA。這部分的功能就是要將我們用C#寫的程序翻譯成虛擬機(jī)可以認(rèn)識(shí)并執(zhí)行的操作碼(OPCODE)。

C# avm編譯器

neo提供了編譯器項(xiàng)目源碼:https://github.com/neo-project/neo-compiler。是C#寫的,原理就是將C#的中間語言MSIL通過Mono.Ceill轉(zhuǎn)換成Neo虛擬機(jī)的字節(jié)碼。請(qǐng)看下圖

虛擬機(jī)原理解釋圖

我們簡(jiǎn)單解釋下上面的流程:

1,我們編寫的C#合約被VisualStudo 編譯成中間語言 MSIL

2,通過Mono.ceil將msil翻譯并解釋為我們的操作指令碼。(關(guān)于Mono,大家可以百度下),Mono可以讀取和修改MSIL。十分強(qiáng)大 。最后生成我們的虛擬機(jī)可以執(zhí)行的文件.avm.

3,在虛擬機(jī)中,每個(gè)操作指令對(duì)應(yīng)著對(duì)棧里的數(shù)據(jù)的操作方法。如圖中的NOP對(duì)應(yīng)著opNop。這樣就可以實(shí)現(xiàn)基于堆棧的有限狀態(tài)機(jī)的邏輯處理。

編譯器部分就解釋到這里。我們現(xiàn)在看虛擬機(jī)的實(shí)現(xiàn)原理,大家看第一張圖,虛擬機(jī)部分分為:執(zhí)行引擎(Execution Engine);計(jì)算棧(Evaluation Stack);互操作層(Interop Service)。

我們就簡(jiǎn)單將這三部分的功能做個(gè)說明:

Execution Engine:負(fù)責(zé)讀取.avm文件或操作指令碼,并根據(jù)操作指令(opCode)負(fù)責(zé)對(duì)棧數(shù)據(jù)的操作。

Evaluation Stack:存儲(chǔ)和計(jì)算數(shù)據(jù)的結(jié)構(gòu),被執(zhí)行引擎管理.

Interop Service:? 互操作服務(wù)層,可以訪問區(qū)塊鏈帳本數(shù)據(jù)和外部數(shù)據(jù)的接口層.

所以這部分的邏輯就是:通過執(zhí)行引擎加載指令序列碼,并存儲(chǔ)棧里,然后從棧頂取指令并根據(jù)指令一步一步執(zhí)行對(duì)棧數(shù)據(jù)的操作。來完成相應(yīng)的代碼邏輯。代碼里需要訪問的數(shù)據(jù)是從互操作層提供的接口中訪問的。

我的截圖可能有點(diǎn)大,下載慢請(qǐng)大家耐心等待!呵呵。。



作者:區(qū)塊鏈研習(xí)社比特幣源碼研讀班,black

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容