Hardhat-deploy: Kontrak proxy PERLU memiliki semacam validasi

Dibuat pada 24 Jun 2021  ·  2Komentar  ·  Sumber: wighawag/hardhat-deploy

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.

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:

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 (?)

Semua 2 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat