في الوقت الحالي ، إذا حاولت نشر عقد وكيل مع تنفيذ به بنية غير صالحة ، فسيظل ينجح.
على سبيل المثال ، سينشر هذا العقد بشكل جيد:
contract Foo {
uint public b;
uint public c = 5;
constructor(a uint) {
b = a;
}
}
لكن هذا العقد غير صالح عند نشره من وكيل. نظرًا لأن أي خادم وكيل يتم ترحيله إلى هذا التطبيق لن يحتوي على مجموعة متغيرات c
أو b
. أعتقد أنه يجب أن يظهر خطأ هنا إذا حاول المستخدم نشر هذا أو على الأقل نوع من التحذير.
يرتبط أيضًا بترقية الوكلاء - تؤدي تصادمات التخزين إلى أخطاء غير بسيطة. من الواضح أنه من الصعب التحقق من ذلك لأن الترقية قد تحدث في نقطة بعيدة في المستقبل.
التنفيذ القديم:
contract Foo {
uint public b = 5;
};
التنفيذ الجديد:
// 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
}
قد يكون من المفيد أن يكون لديك وظيفة تتحقق من أن العقد الجديد لا يتعارض مع تخزين العقود القديمة وأنها ترقية صحيحة للوكيل.
// Checks if "Foo" can be upgraded to "Bar"
const isValid = deployments.isValidProxyUpgrade("Foo", "Bar");
OpenZeppelin لديه فحص مشابه ولكنه مضمّن في وظيفة النشر الخاصة به ، لذا لا فائدة هنا في النشر الثابت على الرغم من أنه من المحتمل إعادة استخدام رمز التحقق الخاص به (؟)
مطلوب بالتأكيد :) ، تم ذكر هذا أيضًا هنا: https://github.com/wighawag/hardhat-deploy/issues/65
التعليق الأكثر فائدة
يرتبط أيضًا بترقية الوكلاء - تؤدي تصادمات التخزين إلى أخطاء غير بسيطة. من الواضح أنه من الصعب التحقق من ذلك لأن الترقية قد تحدث في نقطة بعيدة في المستقبل.
التنفيذ القديم:
التنفيذ الجديد:
قد يكون من المفيد أن يكون لديك وظيفة تتحقق من أن العقد الجديد لا يتعارض مع تخزين العقود القديمة وأنها ترقية صحيحة للوكيل.
OpenZeppelin لديه فحص مشابه ولكنه مضمّن في وظيفة النشر الخاصة به ، لذا لا فائدة هنا في النشر الثابت على الرغم من أنه من المحتمل إعادة استخدام رمز التحقق الخاص به (؟)