本NEP提議NeoVM計算棧堆棧隔離,以確保動態調用的安全性,併爲未來的新功能提供支持。git
如今已經實現了NEP-4(動態調用),但因爲NeoVM計算棧未被隔離,動態調用的合約可能會在運行時中打斷調用者的堆棧,從而致使合約未按預期執行。
另外一方面,某些功能(例如異常處理)也須要實現堆棧隔離。github
咱們須要一組新的指令,以便每次調用都建立一個單獨的計算棧,並自動將函數的參數複製到新堆棧。函數運行完畢後,返回值將自動複製到調用者的堆棧中。這樣,調用的合約對棧的修改,不會影響調用者的行爲。安全
咱們添加了五條用於啓動堆棧隔離調用的新指令:
CALL_I,CALL_E,CALL_ED,CALL_ET,CALL_EDT。函數
指令CALL_I與老指令CALL很相似。不一樣之處在於CALL_I須要在其以後跟隨一個操做數來表示參數的數量和返回的要拷貝的值。get
指令CALL_E與老指令APPCALL很相似在用於靜態調用時。不一樣之處在於CALL_E須要在其以後跟隨一個操做數來表示參數的數量和返回的要拷貝的值。it
指令CALL_ED與老指令APPCALL很相似在用於動態調用時。不一樣之處在於CALL_ED須要在其以後跟隨一個操做數來表示參數的數量和返回的要拷貝的值。ast
指令CALL_ET與指令CALL_E很相似。不一樣之處在於CALL_ET會開啓一個尾調用。兼容性
指令CALL_EDT與指令CALL_ED很相似。不一樣之處在於CALL_EDT會開啓一個尾調用。原理
全部舊合約均可以在原始指令集中正確執行,可是不建議新合約繼續使用舊指令。當新合約須要動態調用時,應避免使用舊指令。im