「預言機篇」四講內容正式完結啦,本期「三分鐘入門Neo3」將介紹「指令碼雜湊」(Script Hashes),一起看看Neo核心開發者為了改善智慧合約系統和資料遷移問題,對指令碼雜湊做了哪些嘗試?
瞭解「指令碼雜湊」前,先為大家科普下「雜湊」的概念。
● 基本概念
雜湊演算法是一種函式,可以將任意長度的數字檔案輸出為固定長度的看似亂碼的字串。
字串由數字和字母構成。其中一種方法就是SHA-256(安全雜湊演算法-256位),SHA-256是SHA-1的後繼者,SHA-1的輸出是160位的。
● 重要特性
- 不可逆性。輸入資訊得出輸出的那個看似亂碼的字串(雜湊值)非常容易,但是從輸出的字串反推出輸入的結果卻是非常非常難。
- 輸出值唯一性和不可預測性。只要輸入的資訊有一點點區別,根據雜湊演算法得出的輸出值也會相差甚遠。
指令碼雜湊
為了使使用者能夠呼叫智慧合約,該節點必須要先知道其資料儲存的位置,才能找到要執行的程式碼。
在Neo2環境中,金鑰以指令碼雜湊的形式儲存,透過將智慧合約的指令集(操作碼)雜湊化而生成指令碼雜湊。首先使用SHA256完成此操作,再透過RIPEMD160將結果雜湊化來生成指令碼雜湊。
這些指令碼雜湊也可以使用當前的Neo版本號作為字首,並透過Base58Check編碼執行,將其轉換為Neo使用者更熟悉地更具可讀性的公共地址格式。
儘管這種方法有助於確保不同智慧合約不會生成相同的指令碼雜湊,但是它引入了一個新問題。在遷移的過程中,更新智慧合約意味著必須將所有儲存的資料移到新的合約指令碼雜湊中。正如Neo創始人及核心開發者張錚文表示,此事件可能會帶來大量的人力與物力支出。
“目前,當智慧合約進行升級時,所有儲存的資料都將遷移到新合約中。如果合約中包含大量資料,則遷移的工作量將非常大,並可能導致DoS攻擊。”
另外,指令碼雜湊本身的更改也帶來了一個問題。合約成功遷移後,已整合特定合約的服務商需要手動更新其服務,才能使用新的指令碼雜湊。這增加了諸如交易所,錢包服務商以及透過動態呼叫進行互動的其他合約之類的實體開銷。
指令碼雜湊的生成機制有另一個副作用——無法重新部署舊合約。由於兩個合約中的輸入指令集相同,因此經過雜湊後會產生相同的指令碼雜湊,由於匹配問題,部署將宣告失敗。
合約重定向
如何改變資料遷移背後的邏輯,張錚文提供了一個新方案:合約重定向。
“不再在每次合約升級期間直接遷移資料,而是建立重定向記錄。當合約讀取資料時,它可以基於重定向記錄找到原始合約雜湊,從而訪問正確的資料。”
NGD軟體開發者劉夢雨幫助補充了方案中的更多細節,並指出大量的資源消耗是因為需要新的合約來更新儲存金鑰的指令碼雜湊資料字首,以便從原合約中遷移資料 。
使用重定向方案就不再需要更新資料字首,而是建立一條記錄,將合約資料的修改重定向到原始合約。本質來說,新合約可以直接從原始合約中讀取和寫入資料,不再需要遷移資料。
目前,該方案已在實施中。其中涉及兩個合約新屬性的建立,即重定向和刪除邏輯,以處理合約刪除邏輯並提供用於重定向的原始指令碼雜湊。
但這一方案也存在一些其他問題。比如無法部署原始合約,以及在遷移後無法從原始合約中呼叫方法。這也表示,第三方服務商仍將需要手動更新其服務來使用新的合約雜湊。
由於對該方案弊端的不滿意,張錚文又提出瞭解決指令碼雜湊問題的另一種方法:通用唯一識別符號(UUID)。
「三分鐘入門Neo3」的下一篇,我們將介紹什麼是UUID,繼續分享Neo3的開發過程。