Openzeppelin
在非結構化儲存升級模式上,為什麼要沿用之前合約的結構呢?
ZeppelinOS 採用了非結構化儲存代理模式來升級合約。
在介紹這種模式的部落格文章中,他們說:
“你唯一需要關心的是,你的合約的後續版本必須遵循之前版本的儲存結構。”
遵循結構是什麼意思?為什麼我們必須遵循這個結構?
這是因為 Solidity 按順序設置儲存中的變數。因此,如果您移動升級後的儲存變數的引用,它們將引用錯誤的儲存槽。這是一個例子:
contract StorageOriginal { uint public first = 10; uint public second = 20; }
和
contract StorageNew { uint public second; uint public first; }
因此,如果您從 StorageOrignal 升級到 StorageNew,
second
將讀取 10first
並將讀取 20。