以太坊EVM虛擬機代碼閱讀
1、 類圖
整體來說,整個以太坊evm的實現(xiàn)主要是依賴3個類吃粒,分別是VM,Program和ProgramInvokeImpl拒课,這里VM是虛擬機的主調用類徐勃,VM中的執(zhí)行功能依靠Program來實現(xiàn),Program需要調用的外部接口依靠ProgramInvokeImpl早像;
2僻肖、 初始化
? ? ? ? ? ? ? ? ProgramInvoke programInvoke =
? ? ? ? ? ? ? ? ? ? ? ? programInvokeFactory.createProgramInvoke(tx, currentBlock, cacheTrack, blockStore);
? ? ? ? ? ? ? ? this.vm = new VM(config);
? ? ? ? ? ? ? ? this.program = new Program(track.getCodeHash(targetAddress), code, programInvoke, tx, config).withCommonConfig(commonConfig);
第一句用來創(chuàng)建ProgramInvokeImpl,第二句創(chuàng)建VM卢鹦,第三句創(chuàng)建Program
3臀脏、 VM實現(xiàn)
VM只有3個函數(shù),VM構造函數(shù)冀自,step單步執(zhí)行功能揉稚,play全部執(zhí)行功能,而play是循環(huán)調用step實現(xiàn)熬粗,step比較復雜搀玖,內部通過調用Program實現(xiàn)
這里實際上就是每執(zhí)行一步就先收gas,然后才執(zhí)行操作驻呐,我們把以太坊指令分類灌诅,可以得到下面的表格:
以太坊的全部指令集也就這么多種類,就這樣全部實現(xiàn)了含末。
如果從play函數(shù)來看延塑,解析指令使用的方法是譯碼分派(decode-and-dispatch)方式,它是圍繞一個主循環(huán)來組織的,要解析一條指令答渔,就將其分配到屬于該指令類型的解析程序关带。
4、 Program的實現(xiàn)
Program如前所說實際是個大的集合沼撕,實現(xiàn)了對內對外的調用宋雏,自己獨立要處理的其實只有合約代碼數(shù)據(jù),指針务豺,以及各種操作的包裝磨总。對指針的操作就是指針的獲取,設置笼沥,下一步等蚪燕;對數(shù)據(jù)的操作就是讀取操作碼娶牌,復制數(shù)據(jù)了
5、 ProgramInvokeImpl的實現(xiàn)
ProgramInvokeImpl實現(xiàn)主要是創(chuàng)建的時候記錄了交易信息馆纳,塊信息诗良,和記錄了外部的兩個接口類Repository和BlockStore;
BlockStore可以獲取塊信息或做一些操作鲁驶,但是虛擬機里面只是調用了通過塊號獲取塊hash的功能
Repository類可以創(chuàng)建或刪除賬戶鉴裹,獲取或設置賬戶狀態(tài),設置賬戶合約钥弯,存儲賬戶相關的數(shù)據(jù)等操作
如果移植evm關鍵地方就是外部環(huán)境要提供這兩個接口類的功能径荔。實際就是要求平臺支持賬戶模型。