عقود قابلة للترقية

مثال آخر لنمط عقد قابل للترقية. يستخدم هذا النمط عقدًا منفصلاً ليكون بمثابة تخزين لعقد آخر يحتوي على المنطق ، ويُعرف أيضًا باسم “نمط تفويض الوكيل (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];
}

يجب معالجة كل تعيين بثلاث وظائف: تخزين واسترداد وحذف. استخدم نمط التحكم في الوصول للسماح فقط لأحدث إصدار من العقد المنطقي باستخدام “التخزين الأبدي”.

مواد اضافية

إضافة تعليق