تخطي إلى المحتوى الرئيسي
Change page

معيار الرمز المميز ⁦ERC-223⁩

مقدمة

ما هو ERC-223؟

يعد ERC-223 معيارًا للرموز المميزة القابلة للاستبدال، على غرار معيار ERC-20. الاختلاف الرئيسي هو أن ERC-223 لا يحدد فقط API للرمز المميز بل يحدد أيضًا منطق تحويل الرموز المميزة من المرسل إلى المستلم. يقدم نموذج اتصال يسمح بمعالجة تحويلات الرموز المميزة على جانب المستلم.

الاختلافات عن ERC-20

يعالج ERC-223 بعض قيود ERC-20 ويقدم طريقة جديدة للتفاعل بين عقد الرمز المميز والعقد الذي قد يتلقى الرموز المميزة. هناك بعض الأشياء الممكنة مع ERC-223 ولكن ليس مع ERC-20:

  • معالجة تحويل الرمز المميز على جانب المستلم: يمكن للمستلمين اكتشاف أنه يتم إيداع رمز مميز ERC-223.
  • رفض الرموز المميزة المرسلة بشكل غير صحيح: إذا أرسل مستخدم رموزًا مميزة ERC-223 إلى عقد غير مفترض أن يتلقى رموزًا مميزة، فيمكن للعقد رفض المعاملة، مما يمنع فقدان الرموز المميزة.
  • البيانات الوصفية في التحويلات: يمكن أن تتضمن الرموز المميزة ERC-223 بيانات وصفية، مما يسمح بإرفاق معلومات عشوائية بمعاملات الرموز المميزة.

المتطلبات الأساسية

المحتوى

يعد ERC-223 معيارًا للرموز المميزة ينفذ API للرموز المميزة داخل العقود الذكية. كما يعلن عن API للعقود التي من المفترض أن تتلقى رموزًا مميزة ERC-223. العقود التي لا تدعم API لمستلم ERC-223 لا يمكنها تلقي رموز مميزة ERC-223، مما يمنع خطأ المستخدم.

إذا كان العقد الذكي ينفذ الطرق والأحداث التالية، فيمكن تسميته عقد رمز مميز متوافق مع ERC-223. بمجرد نشره، سيكون مسؤولاً عن تتبع الرموز المميزة المنشأة على إيثيريوم.

العقد غير ملزم بامتلاك هذه الدوال فقط ويمكن للمطور إضافة أي ميزة أخرى من معايير الرموز المميزة المختلفة إلى هذا العقد. على سبيل المثال، الدوال approve و transferFrom ليست جزءًا من معيار ERC-223 ولكن يمكن تنفيذ هذه الدوال إذا لزم الأمر.

من EIP-223 (opens in a new tab):

الطرق

يجب أن ينفذ الرمز المميز ERC-223 الطرق التالية:

function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transfer(address _to, uint256 _value, bytes calldata _data) public returns (bool success)

يجب أن ينفذ العقد الذي من المفترض أن يتلقى رموزًا مميزة ERC-223 الطريقة التالية:

function tokenReceived(address _from, uint _value, bytes calldata _data)

إذا تم إرسال رموز مميزة ERC-223 إلى عقد لا ينفذ الدالة tokenReceived(..)، فيجب أن يفشل التحويل ويجب ألا يتم نقل الرموز المميزة من رصيد المرسل.

أحداث

event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes calldata _data)

أمثلة

إن API للرمز المميز ERC-223 مشابه لـ ERC-20، لذلك من وجهة نظر تطوير واجهة المستخدم لا يوجد فرق. الاستثناء الوحيد هنا هو أن الرموز المميزة ERC-223 قد لا تحتوي على الدوال approve + transferFrom لأنها اختيارية لهذا المعيار.

أمثلة Solidity

يوضح المثال التالي كيف يعمل عقد رمز مميز ERC-223 أساسي:

الآن نريد عقدًا آخر لقبول إيداعات tokenA بافتراض أن tokenA هو رمز مميز ERC-223. يجب أن يقبل العقد tokenA فقط ويرفض أي رموز مميزة أخرى. عندما يتلقى العقد tokenA، يجب أن يصدر حدث Deposit() ويزيد من قيمة المتغير الداخلي deposits.

إليك الكود:

الأسئلة الشائعة

ماذا سيحدث إذا أرسلنا بعض tokenB إلى العقد؟

ستفشل المعاملة، ولن يحدث تحويل الرموز المميزة. سيتم إرجاع الرموز المميزة إلى عنوان المرسل.

كيف يمكننا إجراء إيداع في هذا العقد؟

استدعِ الدالة transfer(address,uint256) أو transfer(address,uint256,bytes) للرمز المميز ERC-223، مع تحديد عنوان RecipientContract.

ماذا سيحدث إذا قمنا بتحويل رمز مميز ERC-20 إلى هذا العقد؟

إذا تم إرسال رمز مميز ERC-20 إلى RecipientContract، فسيتم تحويل الرموز المميزة، ولكن لن يتم التعرف على التحويل (لن يتم إطلاق حدث Deposit()، ولن تتغير قيمة الإيداعات). لا يمكن تصفية إيداعات ERC-20 غير المرغوب فيها أو منعها.

ماذا لو أردنا تنفيذ دالة ما بعد اكتمال إيداع الرمز المميز؟

هناك طرق متعددة للقيام بذلك. في هذا المثال، سنتبع الطريقة التي تجعل تحويلات ERC-223 مطابقة لتحويلات الإيثر:

عندما يتلقى RecipientContract رمزًا مميزًا ERC-223، سينفذ العقد دالة مشفرة كمعلمة _data لمعاملة الرمز المميز، بشكل مطابق لكيفية تشفير معاملات الإيثر لاستدعاءات الدوال كـ data للمعاملة. اقرأ حقل البيانات لمزيد من المعلومات.

في المثال أعلاه، يجب تحويل رمز مميز ERC-223 إلى عنوان RecipientContract باستخدام الدالة transfer(address,uin256,bytes calldata _data). إذا كانت معلمة البيانات هي 0xc2985578 (توقيع الدالة foo()) فسيتم استدعاء الدالة foo() بعد تلقي إيداع الرمز المميز وسيتم إطلاق الحدث Foo().

يمكن تشفير المعلمات في data لتحويل الرمز المميز أيضًا، على سبيل المثال يمكننا استدعاء الدالة bar() بقيمة 12345 لـ _someNumber. في هذه الحالة يجب أن يكون data هو 0x0423a13200000000000000000000000000000000000000000000000000000000000004d2 حيث 0x0423a132 هو توقيع الدالة bar(uint256) و 00000000000000000000000000000000000000000000000000000000000004d2 هو 12345 كـ uint256.

القيود

بينما يعالج ERC-223 العديد من المشكلات الموجودة في معيار ERC-20، إلا أنه لا يخلو من قيوده الخاصة:

  • التبني والتوافق: لم يتم تبني ERC-223 على نطاق واسع بعد، مما قد يحد من توافقه مع الأدوات والمنصات الحالية.
  • التوافق مع الإصدارات السابقة: لا يتوافق ERC-223 مع الإصدارات السابقة من ERC-20، مما يعني أن عقود وأدوات ERC-20 الحالية لن تعمل مع الرموز المميزة ERC-223 دون تعديلات.
  • تكاليف الغاز: قد تؤدي الفحوصات والوظائف الإضافية في تحويلات ERC-223 إلى ارتفاع تكاليف الغاز مقارنة بمعاملات ERC-20.

قراءة إضافية