مثال آخر لنمط عقد قابل للترقية. يستخدم هذا النمط عقدًا منفصلاً ليكون بمثابة تخزين لعقد آخر يحتوي على المنطق ، ويُعرف أيضًا باسم “نمط تفويض الوكيل (proxy delegate pattern)”. عند ترقية العقد ، تظل كل حالاتك في العنوان العقد القديم. و بالتالي يمكن أن نقول أن العقد يحتوي على “التخزين الأبدي”.
لتجنب ترقيات عقد التخزين ، يجب أن يكون مرناً قدر الإمكان ، باستخدام عدة تعيينات لكل نوع بيانات حيث يتم استخدام التجزئة كمفاتيح (يتم عرض uint فقط في المثال أدناه):
address owner = msg.sender; address latestVersion; mapping(bytes32 => uint) uIntStorage; function upgradeVersion(address _newVersion) public { require(msg.sender == owner); latestVersion = _newVersion; } function getUint(bytes32 _key) external view returns(uint) { return uIntStorage[_key]; } function setUint(bytes32 _key, uint _value) external { require(msg.sender == latestVersion); uIntStorage[_key] = _value; } function deleteUint(bytes32 _key) external { require(msg.sender == latestVersion); delete uIntStorage[_key]; }
يجب معالجة كل تعيين بثلاث وظائف: تخزين واسترداد وحذف. استخدم نمط التحكم في الوصول للسماح فقط لأحدث إصدار من العقد المنطقي باستخدام “التخزين الأبدي”.
مواد اضافية
- سلسلة المقالات: Summary of Ethereum Upgradeable Smart Contract R&D, Part I و Part II نظرة عامة رائعة على أنماط الترقية.
- مقال :Upgrading Broken Contracts (ConsenSys)
- مقال :Diamond Standard تباين مثير للاهتمام في أنماط قابلية الترقية. نحن لا نرى ذلك كثيرًا في البرية ، ولكنه تطور مثير للاهتمام!
- يوتيوب : https://www.youtube.com/watch?v=bdXJmWajZRY
إضافة تعليق