唯一合約ID
張錚文介紹了「唯一合約ID」帶來的好處:
“主要區別在於,使用GUID不需要新增重定向記錄,並且合約可以隨時升級,而無需記錄其他資訊以防止重新部署舊合約。因為如果部署了舊合約,則會建立新的GUID。”
此方案不僅能夠減緩資料遷移對於合約儲存的壓力,還能在合約更新後依舊保留原有的識別符號(指令碼雜湊)。將每個ID分配給每個已部署的合約,並在程式碼更新過程中一直存在。這意味著與Neo智慧合約整合的服務商將不再需要在合約更新時手動更新其基礎架構。
實施合約ID
初步方案提出後,張錚文先在本地測試了此方案的可行性,並提供了一個切實的「唯一合約ID」生成方案。
NGD軟體開發者劉夢雨在確認該提案時強調,考慮到合約儲存遭到威脅後會造成雜湊衝突,所以將合約的資料字首以ID形式編碼,不僅能夠緩解儲存空間,也能保證儲存的安全性。
注意到對「唯一合約ID」安全性與的要求,劉夢雨建議了兩種備選方案來生成所需的合約ID。在最初建議使用區塊高度,事務索引和生成金鑰的syscall計數器之後,又提出了「全域性計數器」的概念。
全域性計數器的優勢在於簡單。每次將合約部署到Neo3中,它都會使用計數器來確定並獲取下一個可用的ID號,與此同時計數器的數字也會遞增。每個新的部署都會重複此過程,以確保每個合約都收到唯一的ID號。
劉夢雨實施了這兩種方案,但是事實證明,全域性計數器最受開發者喜愛,因為它消除了對雜湊衝突的擔憂。但這個方案有個缺點是混淆原生合約與新合約的類別,如果將來需要新增新的本地合約,全域性計數器(以及所有合約ID)將受到影響。
核心開發者Shargon則提出建議,認為原生合約應採用負值,具有遞減的ID(-1,-2,-3 ..等),以便原生合約與新合約都可以使用相同的全域性計數器,互不影響彼此的ID分配。
儘管「唯一合約ID」最初是為了防止DoS攻擊而設計的,但這也為開發者、第三方服務商提供了許多其他幫助,並有助於減緩區塊的儲存空間。