我們這篇文章通過分析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)在我們就看下面這張圖:

這張圖整體描述了智能合約的工作原理,這張圖包括三部分內(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)。

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

我們簡(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