文章目錄
- 摘要
- 動機
- 原理
- 詳述
- CALL_I
- CALL_E
- CALL_ED
- CALL_ET
- CALL_EDT
- 向後相容性
- 實現
摘要
本NEP提議NeoVM計算棧堆疊隔離,以確保動態呼叫的安全性,併為將來的新功能提供支援。
動機
現在已經實現了NEP-4(動態呼叫),但由於NeoVM計算棧未被隔離,動態呼叫的合約可能會在執行時中打斷呼叫者的堆疊,從而導致合約未按預期執行。
另一方面,某些功能(例如異常處理)也需要實現堆疊隔離。
原理
我們需要一組新的指令,以便每次呼叫都建立一個單獨的計算棧,並自動將函式的引數複製到新堆疊。函式執行完畢後,返回值將自動複製到呼叫者的堆疊中。這樣,呼叫的合約對棧的修改,不會影響呼叫者的行為。
詳述
我們新增了五條用於啟動堆疊隔離呼叫的新指令:
CALL_I,CALL_E,CALL_ED,CALL_ET,CALL_EDT。
CALL_I
指令CALL_I與老指令CALL很類似。不同之處在於CALL_I需要在其之後跟隨一個運算元來表示引數的數量和返回的要拷貝的值。
CALL_E
指令CALL_E與老指令APPCALL很類似在用於靜態呼叫時。不同之處在於CALL_E需要在其之後跟隨一個運算元來表示引數的數量和返回的要拷貝的值。
CALL_ED
指令CALL_ED與老指令APPCALL很類似在用於動態呼叫時。不同之處在於CALL_ED需要在其之後跟隨一個運算元來表示引數的數量和返回的要拷貝的值。
CALL_ET
指令CALL_ET與指令CALL_E很類似。不同之處在於CALL_ET會開啟一個尾呼叫。
CALL_EDT
指令CALL_EDT與指令CALL_ED很類似。不同之處在於CALL_EDT會開啟一個尾呼叫。
向後相容性
所有舊合約都可以在原始指令集中正確執行,但是不建議新合約繼續使用舊指令。當新合約需要動態呼叫時,應避免使用舊指令。