Saat ini jika Anda mencoba menerapkan kontrak proxy dengan implementasi yang memiliki struktur tidak valid, itu akan tetap berhasil.
Misalnya kontrak ini akan diterapkan dengan baik:
contract Foo {
uint public b;
uint public c = 5;
constructor(a uint) {
b = a;
}
}
Tapi kontrak ini tidak valid ketika digunakan dari proxy. Karena proxy apa pun yang menyampaikan ke implementasi ini tidak akan memiliki variabel c
atau b
disetel. Saya pikir itu harus menimbulkan kesalahan di sini jika pengguna mencoba untuk menyebarkan ini atau setidaknya semacam peringatan.
Juga terkait, dalam memutakhirkan proxy - Tabrakan penyimpanan menyebabkan kesalahan non-sepele. Jelas, lebih sulit untuk memverifikasi ini karena peningkatan dapat terjadi pada titik yang jauh di masa depan.
Implementasi lama:
contract Foo {
uint public b = 5;
};
Implementasi baru:
// Incorrect
contract Bar {
uint public c; // Collision here! - value is actually set to 5 not 0
}
// Correct
contract Bar {
uint public b; // value is 5 as expected
uint public c; // value is 0
}
Akan berguna untuk memiliki fungsi yang memeriksa bahwa kontrak baru tidak bertentangan dengan penyimpanan kontrak lama dan merupakan peningkatan proxy yang valid.
// Checks if "Foo" can be upgraded to "Bar"
const isValid = deployments.isValidProxyUpgrade("Foo", "Bar");
OpenZeppelin memiliki pemeriksaan yang serupa tetapi sudah terpasang di dalam fungsi penerapannya sehingga tidak ada gunanya di sini dalam hardhat-deploy meskipun kode verifikasi mereka mungkin sebagian besar dapat digunakan kembali (?)
Pasti diinginkan :), ini juga disebutkan di sini: https://github.com/wighawag/hardhat-deploy/issues/65
Komentar yang paling membantu
Juga terkait, dalam memutakhirkan proxy - Tabrakan penyimpanan menyebabkan kesalahan non-sepele. Jelas, lebih sulit untuk memverifikasi ini karena peningkatan dapat terjadi pada titik yang jauh di masa depan.
Implementasi lama:
Implementasi baru:
Akan berguna untuk memiliki fungsi yang memeriksa bahwa kontrak baru tidak bertentangan dengan penyimpanan kontrak lama dan merupakan peningkatan proxy yang valid.
OpenZeppelin memiliki pemeriksaan yang serupa tetapi sudah terpasang di dalam fungsi penerapannya sehingga tidak ada gunanya di sini dalam hardhat-deploy meskipun kode verifikasi mereka mungkin sebagian besar dapat digunakan kembali (?)