Openzeppelin

在非結構化儲存升級模式上,為什麼要沿用之前合約的結構呢?

  • May 16, 2018

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。

引用自:https://ethereum.stackexchange.com/questions/48600