Solidity

在升級契約期間在結構數組中附加變數是否安全?

  • October 28, 2021

我正在使用 Openzeppelin 升級制定可升級契約。

我知道升級契約必須考慮儲存佈局。

但是,當我想升級mapping of structOR時,我仍然對安全性不太有信心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;

SolidityUser[0] | User[1] | ...使用相同數量的儲存槽與每個使用者連續儲存陣列。

舊的User佔用一個儲存槽,而新的佔用三個。所以新版本的項目將重疊。

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