معيار الرموز المميزة المتعددة ERC-1155
مقدمة
واجهة قياسية للعقود التي تدير أنواعًا متعددة من الرموز المميزة. قد يتضمن أي عقد منشور مجموعة من الرموز القابلة للاستبدال، أو الرموز غير القابلة للاستبدال، أو تكوينات أخرى (مثل الرموز شبه القابلة للاستبدال).
ما المقصود بمعيار الرموز المميزة المتعددة؟
الفكرة بسيطة وتسعى إلى إنشاء واجهة عقد ذكي يمكنها تمثيل والتحكم في أي عدد من أنواع الرموز القابلة للاستبدال وغير القابلة للاستبدال. بهذه الطريقة، يمكن للرمز المميز ERC-1155 أداء نفس وظائف الرمز المميز ERC-20 وERC-721، وحتى كليهما في نفس الوقت. إنه يحسن وظائف كل من معايير ERC-20 وERC-721، مما يجعله أكثر كفاءة ويصحح أخطاء التنفيذ الواضحة.
يتم وصف الرمز المميز ERC-1155 بالكامل في EIP-1155 (opens in a new tab).
المتطلبات الأساسية
لفهم هذه الصفحة بشكل أفضل، نوصيك بقراءة معايير الرموز المميزة، وERC-20، وERC-721 أولاً.
وظائف وميزات ERC-1155:
- التحويل المجمع: تحويل أصول متعددة في استدعاء واحد.
- الرصيد المجمع: الحصول على أرصدة أصول متعددة في استدعاء واحد.
- الموافقة المجمعة: الموافقة على جميع الرموز المميزة لعنوان معين.
- الخطافات (Hooks): خطاف استلام الرموز المميزة.
- دعم الرموز غير القابلة للاستبدال (NFT): إذا كان المعروض هو 1 فقط، يتم التعامل معه كرمز غير قابل للاستبدال.
- قواعد التحويل الآمن: مجموعة من القواعد للتحويل الآمن.
التحويلات المجمعة
يعمل التحويل المجمع بشكل مشابه جدًا لتحويلات ERC-20 العادية. دعونا نلقي نظرة على دالة transferFrom العادية في ERC-20:
// ERC-20
function transferFrom(address from, address to, uint256 value) external returns (bool);
// ERC-1155
function safeBatchTransferFrom(
address _from,
address _to,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external;
الفرق الوحيد في ERC-1155 هو أننا نمرر القيم كمصفوفة ونمرر أيضًا مصفوفة من المعرفات (ids). على سبيل المثال، بالنظر إلى ids=[3, 6, 13] وvalues=[100, 200, 5]، ستكون التحويلات الناتجة كالتالي:
- تحويل 100 رمز مميز بالمعرف 3 من
_fromإلى_to. - تحويل 200 رمز مميز بالمعرف 6 من
_fromإلى_to. - تحويل 5 رموز مميزة بالمعرف 13 من
_fromإلى_to.
في ERC-1155 لدينا فقط transferFrom، ولا يوجد transfer. لاستخدامها مثل transfer العادية، ما عليك سوى تعيين عنوان المرسل (from) إلى العنوان الذي يستدعي الدالة.
الرصيد المجمع
وبالمثل، فإن استدعاء balanceOf الخاص بـ ERC-20 له دالة شريكة تدعم التجميع. للتذكير، هذه هي نسخة ERC-20:
// ERC-20
function balanceOf(address owner) external view returns (uint256);
// ERC-1155
function balanceOfBatch(
address[] calldata _owners,
uint256[] calldata _ids
) external view returns (uint256[] memory);
الأمر أبسط بالنسبة لاستدعاء الرصيد، حيث يمكننا استرداد أرصدة متعددة في استدعاء واحد. نمرر مصفوفة الملاك، تليها مصفوفة معرفات الرموز المميزة.
على سبيل المثال، بالنظر إلى _ids=[3, 6, 13] و_owners=[0xbeef..., 0x1337..., 0x1111...]، ستكون القيمة المرجعة
[
balanceOf(0xbeef...),
balanceOf(0x1337...),
balanceOf(0x1111...)
]
الموافقة المجمعة
// ERC-1155
function setApprovalForAll(
address _operator,
bool _approved
) external;
function isApprovedForAll(
address _owner,
address _operator
) external view returns (bool);
تختلف الموافقات قليلاً عن ERC-20. بدلاً من الموافقة على مبالغ محددة، تقوم بتعيين مشغل (operator) كموافق عليه أو غير موافق عليه عبر setApprovalForAll.
يمكن قراءة الحالة الحالية عبر isApprovedForAll. كما ترى، إنها عملية إما كل شيء أو لا شيء. لا يمكنك تحديد عدد الرموز المميزة التي يجب الموافقة عليها أو حتى فئة الرمز المميز.
تم تصميم هذا عن قصد مع وضع البساطة في الاعتبار. يمكنك فقط الموافقة على كل شيء لعنوان واحد.
خطاف الاستلام (Receive Hook)
function onERC1155BatchReceived(
address _operator,
address _from,
uint256[] calldata _ids,
uint256[] calldata _values,
bytes calldata _data
) external returns(bytes4);
نظرًا لدعم EIP-165 (opens in a new tab)، يدعم ERC-1155 خطافات الاستلام للعقود الذكية فقط. يجب أن تُرجع دالة الخطاف قيمة bytes4 سحرية محددة مسبقًا والتي تُعطى كالتالي:
bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
عندما يُرجع العقد المستلم هذه القيمة، يُفترض أن العقد يقبل التحويل ويعرف كيفية التعامل مع الرموز المميزة ERC-1155. رائع، لا مزيد من الرموز المميزة العالقة في العقد!
دعم الرموز غير القابلة للاستبدال (NFT)
عندما يكون المعروض واحدًا فقط، يكون الرمز المميز في الأساس رمزًا غير قابل للاستبدال (NFT). وكما هو معتاد في ERC-721، يمكنك تحديد عنوان URL للبيانات الوصفية. يمكن قراءة عنوان URL وتعديله بواسطة العملاء، انظر هنا (opens in a new tab).
قاعدة التحويل الآمن
لقد تطرقنا بالفعل إلى بعض قواعد التحويل الآمن في التفسيرات السابقة. ولكن دعونا نلقي نظرة على أهم هذه القواعد:
- يجب أن يكون المتصل (caller) قد حصل على موافقة لإنفاق الرموز المميزة لعنوان
_fromأو يجب أن يكون المتصل هو نفسه_from. - يجب أن يتراجع استدعاء التحويل إذا:
- كان عنوان
_toهو 0. - لم يكن طول
_idsمساويًا لطول_values. - كان أي من رصيد (أرصدة) الحامل (الحاملين) للرمز (الرموز) المميزة في
_idsأقل من المبلغ (المبالغ) المقابلة في_valuesالمرسلة إلى المستلم. - حدث أي خطأ آخر.
- كان عنوان
ملاحظة: جميع الدوال المجمعة بما في ذلك الخطاف موجودة أيضًا كإصدارات بدون تجميع. يتم ذلك من أجل كفاءة الغاز، مع الأخذ في الاعتبار أن تحويل أصل واحد فقط سيظل على الأرجح الطريقة الأكثر استخدامًا. لقد تركناها جانبًا للتبسيط في التفسيرات، بما في ذلك قواعد التحويل الآمن. الأسماء متطابقة، فقط قم بإزالة كلمة 'Batch'.