我花了一些時間閱讀 Newton Protocol 升級指南,而且我一直回到一個實作細節:新的儲存變數會永遠附加到既有的儲存配置之後,而不是插入進去。

聽起來幾乎很簡單

我不這麼認爲

我見過可升級合約因爲有人低估了儲存配置而壞掉。代理升級通過了測試,看起來一切都很正常,然後數週後纔有人發現某個變數被覆蓋了,因爲儲存順序變了。這一團亂。合約不一定會立刻失敗。有時候只是開始以不同方式運作,而這反而更難診斷。

Newton 協議通過一種方式來避免這種陷阱:把存儲佈局視爲應該被保留的東西,而不是要被重新排列的東西。我喜歡這種做法,因爲它尊重了可升級代理本身有多脆弱。

另一個引人注意的細節是 newtonPolicyClientInitialized 這個標誌。它的用途很簡單:升級後的初始化只能發生一次。Newton 協議也建議在分叉上測試升級,並在執行初始化交易時使用 timelock(時間鎖)或 multisig(多籤)。這並不像是我覺得“套話式”的建議。它更像是在承認:當新的實現被部署時,升級還沒有真正完成。

初始化是升級的一部分。

在完成這一步之前,合約內部可能已經存在授權邏輯,但策略客戶端仍未連接到正確的 TaskManager,或尚未分配給預期的策略客戶端所有者。如果任一項值不正確,授權層仍可能失敗,儘管部署本身看起來似乎是成功的。

所以我認爲“一次性初始化標誌”之所以重要。

它能防止有人再次運行初始化,但並不能防止第一次執行就出錯。如果初始配置裏有錯誤,把它鎖在一次性標誌後面並不會神奇地修復這些問題;它只是把第一次執行變成整個部署中最敏感的時刻之一。

我也注意到:Newton 協議不會在初始化之後就永久凍結所有配置。策略客戶端所有者仍然可以更新策略設置、修改策略合約地址,並在之後轉移所有權。我實際上更喜歡這種做法,而不是假裝系統永遠不需要演進。基礎設施會變化,治理會變化,需求也會變化。挑戰在於確保這些權限在長期內始終保持良好的可控性。存儲兼容性帶來的風險則是另一種完全不同的風險類別。

我欣賞 Newton 協議的一點是,它讓團隊能夠在不需要從頭重建應用的情況下引入策略強制。這是一個切實的設計選擇。但代理升級仍然必須完美保留存儲兼容性:只要把一個變量插入到錯誤的位置,授權層可能看起來完全健康,而相關的應用狀態卻會在下面被悄悄破壞。

我見過足夠多的可升級系統,知道這絕不是某種假設性的擔憂。

我認爲不應忽視的另一個細節是執行流程。新增一個受保護的 Newton 函數,並不會自動保護同樣執行相同操作的舊函數。任何需要強制授權的路徑,在受保護的業務邏輯運行之前,都仍然必須調用 validateAttestation 或 validateAttestationDirect。你只要漏掉一條執行路徑,就會在不自知的情況下產生不一致的安全保證。

這大概也是我覺得關於 Newton 協議最有意思的地方。

該架構將 NewtonPolicyClient 進行了拆分。

而不是迫使開發者圍繞一個新的框架從頭重做應用。我通常更喜歡這種模塊化的做法,因爲大型系統很少會從零開始徹底重寫;它們是一次升級一步地演進。

與此同時,我一直在想:風險是否真的會消失。

或者它只是簡單地進行了移動。

Newton 協議使得授權更容易集成到現有的可升級合約中。我覺得這很有價值。但這也意味着:代理升級、存儲遷移以及最初的初始化調用,都會成爲幾乎所有操作性風險的集中點。

我不認爲這是設計上的弱點。

我把它視爲一個提醒:良好的架構並不能消除困難的決策;它通常只是讓這些決策更容易被識別出來。

每次升級都會改變代碼,但並非每次升級都會加強安全性。對我來說,Newton 協議表明:實現層面的最小細節往往對構建具有韌性的智能合約影響最大。

@NewtonProtocol $NEWT

#Newt