Solidity
在升級契約期間在結構數組中附加變數是否安全?
我正在使用 Openzeppelin 升級制定可升級契約。
我知道升級契約必須考慮儲存佈局。
但是,當我想升級
mapping of struct
OR時,我仍然對安全性不太有信心array of the struct
。例如,從
struct User { bytes32 name; } contract Sample { mapping(uint32 => User) userById; User[] users; }
對此
struct User { bytes32 name; uint256 age; uint256[] friends; } contract Sample { mapping(uint32 => User) userById; User[] users; }
在這種情況下,它是不安全的,因為
User
陣列與以前的儲存佈局不兼容。User[] users;
Solidity
User[0] | User[1] | ...
使用相同數量的儲存槽與每個使用者連續儲存陣列。舊的
User
佔用一個儲存槽,而新的佔用三個。所以新版本的項目將重疊。