Skip to content

Latest commit

 

History

History
209 lines (127 loc) · 12.6 KB

3-erc721-vs-erc721a.md

File metadata and controls

209 lines (127 loc) · 12.6 KB

ما هو الفرق بين رموز ERC-721 و ERC-721A؟

كما يعلم العديد من منشئي NFT، فإن نشر عقد ذكي لشبكة Ethereum mainnet يمكن أن يكون مكلفًا للغاية.

ومع ذلك، فإن تكاليف نشر العقود الذكية ليست التكلفة الوحيدة التي يحتاجها مهندسو blockchain وفرق NFT لوضعها في الاعتبار. يتضمن إنشاء مجموعة NFT ناجحة أو مشروع تجسيد قابل للتحصيل وبناء مجتمع وتسهيل قيام المستخدمين بصك وتداول واستخدام NFTs الخاصة بهم .

دعنا نتعرف على تحسين عقد ذكي قوي يمكن أن يساعد مجتمعك على توفير رسوم الغاز على تكاليف صك NFT.

ما هو ERC721A؟

في السادس من كانون الثاني (يناير)، أعلن فريق تطوير Azuki NFT علنًا عن ERC721A، وهو تطبيق جديد لمعيار ERC721 NFT يستكشف عملية صك الدُفعة.

في منشور المدونة الخاص بهم الذي يشرح تنفيذ العقد الذكي ERC721A، يعرض تقديرات لمقدار الغاز الذي يمكن توفيره عند صك الدفعة باستخدام الأكثر شيوعًا في NFT وهو OpenZeppelin ERC721Enumerable مقابل صك دفعة NFTs باستخدام عقد Azuki ERC721A الجديد:

erc721a-fees

يوضح هذا الجدول كيفية استخدام الغاز لـ ERC721A لعدد متزايد من مقاييس النعناع بعامل ثابت أصغر بكثير.

تزداد تكلفة الغاز لصك NFTs من خلال:

  • ~ 2 ألف غاز لكل نعناع إضافي باستخدام عقد Azuki ERC721A
  • ~ 115 ألف غاز لكل نعناع إضافي باستخدام عقد OpenZeppelin ERC721Enumerable

هذه النتيجة مدهشة بالفعل!

بالنسبة لسعر صك رمز واحد عبر عقد ERC721Enumerable، يمكن للمستخدم بدلاً من ذلك صك ما يصل إلى 5 رموز (أو أكثر على الأرجح) عبر عقد ERC721A.

من منا لا يريد للمستخدمين توفير ما يصل إلى 80٪ على صك العملة الخاصة بهم؟

هذا هو الجزء الأفضل: لا يقتصر الأمر على أن أسعار NFT بالنعناع تصبح أرخص للمعاملات الفردية، ولكن سيكون هناك أيضًا ازدحام أقل في الشبكة وارتفاع أصغر في أسعار الغاز يؤثر على شبكة Ethereum أثناء انخفاض عمليات الجمع الشائعة.

كيف يوفر العقد الذكي ERC721A رسوم الغاز عند صك الدفعة؟

تضع ERC721A بعض الافتراضات التي تؤثر على تصميم العقد الذكي:

  1. يجب أن تزيد معرّفات الرموز المميزة دائمًا على التوالي بدءًا من 0. معظم مشاريع NFT تفعل ذلك بالفعل، و Azuki صريحة في افتراضاتها.
  2. يعد تقليل تكاليف الغاز الناتجة عن صك NFTs أكثر أهمية من تحسين أي مكالمة ERC721 أخرى. يحدث سك العملة عندما يحدث ازدحام في شبكة Ethereum، وهي أيضًا انطباعات المستخدمين الأولى عن مجموعة NFT. كلما كان mint أسهل، كانت السمعة أفضل.

مع وجود هذه الافتراضات في مكانها الصحيح، يقوم ERC721A بإجراء تحسينات العقد التالية:

  1. تقليل التخزين المهدر لبيانات التعريف الرمزية.
  2. حدد تحديثات حالة الملكية لمرة واحدة فقط لكل دفعة، بدلاً من مرة واحدة لكل NFT.

سنلقي نظرة على كيفية إجراء هذه التحسينات، ولكن قبل ذلك يجب أن نفهم أنواع المعاملات التي تكلف معظم رسوم الغاز.

إن تقليل العمل المطلوب لإرسال معاملات الكتابة يوفر على المستخدمين الغاز

هناك نوعان من المعاملات بشكل عام على blockchain: الكتابة والقراءة.

  • الكتابة تحدث عندما نقوم بتعديل أو تحديث حالة blockchain (على سبيل المثال إرسال الأموال وكتابة رسالة وتداول NFT).
  • القراءة تحدث عندما نطلب البيانات الموجودة للنظر فيها.

يدفع المستخدمين رسوم الغاز دائمًا لوظائف الكتابة أكثر مما يدفعون مقابل وظائف القراءة

لذلك، من خلال تقليل عدد معاملات الكتابة، أو عن طريق تقليل العمل المطلوب لإرسال معاملات الكتابة، حتى إذا استغرق الأمر المزيد من العمل لإرسال معاملات القراءة لاحقًا سيؤدي ذلك إلى تقليل تكاليف الصك (mint) التي يدفعها المستخدمون!

وهذا بالضبط ما تحققه ERC721A.

كيف تعمل تحسينات العقد الذكي ERC721A؟

يتتبع عقد ERC721 الأساسي Owners, Balances, Token Approvals, Operator Approvals:

 
//////////////////
///// ERC721 /////
//////////////////

// المالك address معرف الرمز الى token ID من mapping إنشاء
mapping(uint256 => address) private _owners;

// (الرموز) token المالك إلى عدد address من mapping إنشاء
mapping(address => uint256) private _balances;

// approved address الى token ID من mapping إنشاء
mapping(uint256 => address) private _tokenApprovals;

// operator approvals من المالك الى mapping إنشاء
mapping(address => mapping(address => bool)) private _operatorApprovals;

الآن، في ERC721Enumerable عقد التمديد القابل للتعداد، تضيف OpenZeppelin حالة إضافية لتتبع الرموز المميزة والرموز المميزة المملوكة:

 
////////////////////////
/// ERC721Enumerable ///
////////////////////////

// من المالك إلى قائمة معرفات الرموز المميزة المملوكة mapping إنشاء
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

// من معرف الرمز المميز لفهرسة قائمة الرموز المميزة للمالك mapping إنشاء
mapping(uint256 => uint256) private _ownedTokensIndex;

// enumeration المستخدمة في token IDs مصفوفة تحتوي على جميع
uint256[] private _allTokens;

// من معرّف الرمز المميز إلى الموضع في المصفوفة allTokens mapping إنشاء
mapping(uint256 => uint256) private _allTokensIndex;

بدون هذا التخزين الإضافي، لا يمكن لعقد ERC721 الأساسي تنفيذ وظائف جمع NFT المهمة مثل totalSupply() و tokenOfOwnerByIndex و tokenByIndex

هذه الوظائف ضرورية للحفاظ على تنظيم tokenIds وللتعامل مع الخدمات اللوجستية الأخرى. لهذا السبب تستخدم العديد من مشاريع NFT عقد ERC721Enumerable.

ومع ذلك، فإن الحفاظ على هذه التعيينات الثلاثة الإضافية ومجموعة واحدة إضافية تعني أنه في مكالمة إجراء NFT جديد، ويجب تحديث كل هذه الحالة.

فمثلا _ownedTokens و _ownedTokensIndex و _allTokens, و _allTokensIndex سيتم إضافة بيانات جديدة لكل منها إلى التخزين الخاص بها.

من خلال دراسة مشاريع NFT الحالية، لاحظ فريق Azuki أن معظم مشاريع NFT لا تحتاج إلى مجموعة مفرطة من متغيرات التخزين كما حدث في الأعلى، لذلك أعادوا ترتيب تصميمهم وتبسيطه.

عقد ERC721A يستفيد من بعض الهياكل الجديدة لإعادة تنفيذ متغيرات الحالة ERC721 الأساسية للملكية وتتبع الأرصدة:

 
///////////////////
///// ERC721A /////
///////////////////

// إلى تفاصيل الملكية token IDs من mapping إنشاء
// فارغة بالضرورة أن الرمز المميز غير مملوك struct لا يعني ان قيمة
mapping(uint256 => TokenOwnership) private _ownerships;

// من عنوان المالك الى معالج البيانات mapping إنشاء
mapping(address => AddressData) private _addressData;

// approved address الى token ID من mapping إنشاء
mapping(uint256 => address) private _tokenApprovals;

// operator approvals من المالك الى mapping إنشاء
mapping(address => mapping(address => bool)) private _operatorApprovals;

struct TokenOwnership {
  address addr;
  uint64 startTimestamp;
}

struct AddressData {
  uint128 balance;
  uint128 numberMinted;
}

يكمن السحر في كيفية استخدام هذه struct الجديدة.

في ERC721A يتم تنفيذ _safeMint، ويتم تحديث أرصدة المالك مرة واحدة فقط، بغض النظر عن عدد NFTs التي يتم صكها في الإستدعاء المجمع.

في الرمز أدناه، يمكنك أن ترى أن هناك مهمة واحدة لـ _addressData رسم الخرائط عبر _addressData[to] = AddressData(...);

 
// تحديث بيانات رصيد المالك مرة واحدة فقط
AddressData memory addressData = _addressData[to];
_addressData[to] = AddressData(
  addressData.balance + uint128(quantity),
  addressData.numberMinted + uint128(quantity)
);
_ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

uint256 updatedIndex = startTokenId;

// Emitting
for (uint256 i = 0; i < quantity; i++) {
  emit Transfer(address(0), to, updatedIndex);
  require(
    _checkOnERC721Received(address(0), to, updatedIndex, _data),
    "ERC721A: transfer to non ERC721Receiver implementer"
  );
  updatedIndex++;
}

currentIndex = updatedIndex;

في عقد ERC721 الأساسي من قبل، كان يجب القيام بهذه المهمة في حلقة، ويتم فعلها مرة واحدة لكل NFT يتم عمل له صك (mint) في مجموعة الدُفعات. الآن يتم كل ذلك في تحديث واحد.

مع وجود عدد أقل من الخرائط للتحديث وعدد أقل من التحديثات لتبدأ بها، فإن تكلفة كل معاملة يحدث بها عملية صك (mint) أقل بكثير من السابق، خاصة وأن حجم الدُفعة يصبح أكبر وأكبر!

هل لا تزال عقود ERC721A تعتبر NFTs؟

الجواب القصير نعم, عقود ERC721A هي بالتأكيد NFTs.

أي عقد ينفذ معيار الرمز المميز ERC721 أو ERC1155 تعتبر الواجهات رموزًا غير قابلة للفطر أو رموزًا شبه قابلة للفطر.

ERC721A هو امتداد وتحسين لمعيار ERC721.

وينطبق الشيء نفسه على ERC721 Enumerable و ERC721Psi.

جميعهم جزء من عائلة ERC721!

كيفية حرق رموز ERC721A

عندما تريد التخلص من NFT أو رمز مميز موجود في محفظتك، لكنك لا تريد إعطائه لشخص آخر, ولا تريد بيعه، يمكنك حرقه عن طريق إرساله إلى عنوان محفظة معين لا يستخدمه أحد.

يحب الكثير من الأشخاص استخدام نفس عناوين الحرق لأنه من السهل تذكرها.

على سبيل المثال، ال address 0 هو: 0x0000000000000000000000000000000000000000

ومع ذلك، عندما يتعلق الأمر بـ ERC721A لا يمكنك نقل الرموز المميزة إلى address 0 لنسخ NFTs لأن معظم الرموز المميزة التي تم صكها في مجموعة يتم تعيينها إلى العنوان 0 بشكل افتراضي.

فقط اختر عنوانًا آخر لحرق ERC721A وستكون على ما يرام!

على سبيل المثال، address النسخ الشائع الآخر هو: 0x000000000000000000000000000000000000dReM

كما هو الحال دائمًا، إذا كانت لديك أي أسئلة أو شعرت بالتعثر أو أردت فقط أن تقول مرحبًا، فقم بالإنضمام على Discord وسنكون أكثر من سعداء لمساعدتك!