NEXT社區 | 小課堂git
因爲近期NEXT社區加入不少新的小夥伴,有在校大學生,有對區塊鏈感興趣的傳統企業從業者。爲了更方便、更系統的讓NEXT社區的夥伴們瞭解NEO的技術知識,所以咱們開設了小課堂,每週3節,向你們普及NEO相關的知識要點!程序員
NEXT社區小課堂 | 第十二課github
NEO編譯器算法
一、NEO自己是開源的,在github搜索就能夠拿到源碼,爲了方便調試,把全部代碼都放在一塊兒。windows
https://github.com/benhaben/neo-compiler.git框架
二、NEO是C#開發的,大部分代碼能夠跨平臺,可是也有不能再mac上運行的代碼,好比改裝後的leveldb的代碼,因此最好仍是用Visual Studio在windows上調試研究較好。函數
三、本文檔如今不太規範,主要考慮好理解,並不完善,後面也能夠進一步規範化提交到NEO項目中。區塊鏈
你們能夠看到Compiler所處的位置spa
一、在NEO區塊鏈系統中,智能合約是一段代碼,能夠完成必定的邏輯,最後算出合約的結果。如今已經有不少具體的應用了,感興趣的能夠看一下基於NEO作的項目。翻譯
二、若是對比特幣或者智能合約不瞭解,不知道爲何須要有這些代碼,能夠看一下比特幣的白皮書。這裏簡單說一下,在比特幣系統中,當一個「人」(能夠當作一個公鑰)須要和另外一個「人」產生交易的時候,這段代碼用來檢查身份,分配比特幣。具體的瞭解能夠看一下普林斯頓的公開課。
三、下面進入到NEO compiler的介紹了,前面所需的基礎知識本文不在關注。
下面的圖主要顯示代碼的主要流程:
一、NEO能夠用各類語言寫,不過如今主要是C#
二、NEO的編譯器主要是一個翻譯器
三、C#代碼被C#編譯器編譯成MSIL,對MSIL的理解能夠查看Standard ECMA-335 Common Language Infrastructure (CLI)
四、Neo compiler使用Mono.Cecil讀取IL
五、NEO編譯器只關注C#中的static function,因此只是C#語言的一個超級閹割版
六、NEO的編譯器遍歷IL,根據語義轉成NEO虛擬機的opcode
七、至於MSIL向NEO.VM的opcode怎麼轉,須要仔細研究NEO.VM的opcode的設計
先看一段智能合約代碼
using Neo.SmartContract.Framework;using Neo.SmartContract.Framework.Services.Neo;public class Sum : SmartContract{public static int Main(int a, int b){return a + b;}}
main function IL code
IL_0000 NopIL_0001 Ldarg_0IL_0002 Ldarg_1IL_0003 AddIL_0004 Stloc_0IL_0005 Br_SIL_0007 Ldloc_0IL_0008 Ret
這段代碼很簡單,就是讀取參數Ldarg_0,Add,返回。能夠看到CLR的虛擬機也是堆棧虛擬機。
爲了感性的認識NEO編譯器作了什麼,咱們能夠看一下上面的智能合約被翻譯成了什麼:
hex:53-C5-6B-6C-76-6B-00-52-7A-C4-6C-76-6B-51-52-7A-C4-61-6C-76-6B-00-C3-6C-76-6B-51-C3-93-6C-76-6B-52-52-7A-C4-62-03-00-6C-76-6B-52-C3-61-6C-75-66
其實是一串數字了,每一個數字對應一個vm的操做碼或者是數值,爲了更好理解,把彙編代碼放出來
PUSH4PUSH3RETPUSH3NEWARRAYTOTALSTACKFROMALSTACKDUPTOALTSTACKPUSH0PUSH2ROLLSETITEMFROMALSTACKDUPTOTALSTACKPUSH1PUSH2ROLLSETITEMNOPFROMALSTACKDUPTOTALSTACKPUSH0PICKITEMFROMALSTACKDUPTOTALSTACKPUSH1PICKITEMADDFROMALSTACKDUPTOTALSTACKPUSH2PUSH2ROLLSETITEMJMPFROMALSTACKDUPTOTALSTACKPUSH2PICKITEMNOPFROMALSTACKDROPret
咱們能夠發現以下狀況:
一、MSIL的代碼很短,NEO.VM的代碼很長,這是因爲虛擬機的指令和能力不一樣形成的。咱們只須要關注,彙編代碼處理了局部變量的存貯獲取,參數的傳遞,程序的退出,還有add指令
二、彙編代碼和compiler的生成算法相關,須要咱們去同時研究NEO的編譯器和虛擬機,才能明白具體的細節
三、具體每一行的含義,怎麼執行的,能夠查看這個文檔
四、後面還會有一個講解虛擬機的文章,到那個時候在仔細說明
代碼閱讀仍是很頭痛的,因此作了兩個腦圖:
一、compiler執行腦圖
二、compiler對象關係
一、ILModule是對MSIL的一個映射,包含模塊,類型,函數,字段,函數中又包含返回值,參數,函數體,能夠點開腦圖一層一層查看
二、Mono.Cecil是使用來讀取MSIL的,他也是對MSIL的一個映射,因爲沒有文檔,只能看代碼知道他的類結構了,這一部分在腦圖中沒有顯示,不過不要緊,compiler會把感興趣的代碼轉成ILModule
三、ModuleConverter用來遍歷ILModule,把裏面的MSIL轉成NEO.VM的代碼,存貯在NeoModule
四、具體兩邊的指令如何對應,真是須要一個一個理解的,很是繁瑣,兩邊都有不少的指令。能夠看看這個代碼
看完這個文章,並不能瞭解到具體的細節,具體的細節已經在代碼中,這篇文章的主要目的是提供不少資料,提供大的框架,幫助對NEO.Compiler感興趣的程序員加速閱讀代碼的速度。
原文連接:https://www.jianshu.com/p/6461b4e18089
聯繫咱們
微博:https://weibo.com/u/6724929880
官網:https://neonext.club/
QQ羣:612334080
電報:https://t.me/neonextop
twitter:https://twitter.com/NE0NEXT
掃碼關注NEO NEXT官方公衆號
獲取更多一手社區資訊
▼