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

كيفية كتابة ونشر ⁦NFT⁩ (الجزء ⁦1/3⁩ من سلسلة دروس ⁦NFT⁩)

ERC-721
Alchemy
Solidity
العقود الذكية
مبتدئ
سومي مودجيل
22 أبريل 2021
13 دقيقة للقراءة

مع لفت رموز NFT انتباه الجمهور إلى سلسلة الكتل، أصبحت الآن فرصة ممتازة لفهم هذه الضجة بنفسك من خلال نشر عقد NFT الخاص بك (رمز ERC-721) على سلسلة كتل إيثيريوم!

تفخر Alchemy بشدة بدعم أكبر الأسماء في مجال NFT، بما في ذلك Makersplace (التي سجلت مؤخرًا رقمًا قياسيًا في مبيعات الأعمال الفنية الرقمية في Christie’s مقابل $69 Million)، وDapper Labs (مبتكرو NBA Top Shot وCrypto Kitties)، وأوبن سي (أكبر سوق NFT في العالم)، وZora، وSuper Rare، وNFTfi، وFoundation، وEnjin، وOrigin Protocol، وImmutable، والمزيد.

في هذا الدرس، سنستعرض إنشاء ونشر عقد ذكي ERC-721 على شبكة اختبار Sepolia باستخدام ميتاماسك (opens in a new tab)، وSolidity (opens in a new tab)، وHardhat (opens in a new tab)، وPinata (opens in a new tab)، وAlchemy (opens in a new tab) (لا تقلق إذا كنت لا تفهم ما يعنيه أي من هذا حتى الآن — سنشرح ذلك!).

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

وبالطبع، إذا كانت لديك أسئلة في أي وقت، فلا تتردد في التواصل معنا في ديسكورد Alchemy (opens in a new tab) أو زيارة مستندات API الخاصة بـ NFT من Alchemy (opens in a new tab)!

الخطوة 1: الاتصال بشبكة إيثيريوم

هناك مجموعة من الطرق لتقديم طلبات إلى سلسلة كتل إيثيريوم، ولكن لتسهيل الأمور، سنستخدم حسابًا مجانيًا على Alchemy (opens in a new tab)، وهي منصة لمطوري سلسلة الكتل وAPI تتيح لنا التواصل مع سلسلة إيثيريوم دون الحاجة إلى تشغيل عقدنا الخاصة.

في هذا الدرس، سنستفيد أيضًا من أدوات مطوري Alchemy للمراقبة والتحليلات لفهم ما يحدث داخليًا في نشر عقدنا الذكي. إذا لم يكن لديك حساب Alchemy بالفعل، يمكنك التسجيل مجانًا هنا (opens in a new tab).

الخطوة 2: إنشاء تطبيقك (ومفتاح API)

بمجرد إنشاء حساب Alchemy، يمكنك إنشاء مفتاح API عن طريق إنشاء تطبيق. سيسمح لنا ذلك بتقديم طلبات إلى شبكة اختبار Sepolia. تحقق من هذا الدليل (opens in a new tab) إذا كنت مهتمًا بمعرفة المزيد عن شبكات الاختبار.

  1. انتقل إلى صفحة "Create App" (إنشاء تطبيق) في لوحة تحكم Alchemy الخاصة بك عن طريق التمرير فوق "Apps" (التطبيقات) في شريط التنقل والنقر على "Create App"

Create your app

  1. قم بتسمية تطبيقك (اخترنا "My First NFT!")، وقدم وصفًا قصيرًا، وحدد "Ethereum" للسلسلة (Chain)، واختر "Sepolia" لشبكتك. منذ الدمج، تم إيقاف شبكات الاختبار الأخرى.

Configure and publish your app

  1. انقر على "Create app" (إنشاء تطبيق) وهذا كل شيء! يجب أن يظهر تطبيقك في الجدول أدناه.

الخطوة 3: إنشاء حساب إيثيريوم (عنوان)

نحتاج إلى حساب إيثيريوم لإرسال واستقبال المعاملات. في هذا الدرس، سنستخدم ميتاماسك، وهي محفظة افتراضية في المتصفح تُستخدم لإدارة عنوان حساب إيثيريوم الخاص بك. إذا كنت ترغب في فهم المزيد حول كيفية عمل المعاملات على إيثيريوم، فتحقق من هذه الصفحة من مؤسسة إيثيريوم.

يمكنك تنزيل وإنشاء حساب ميتاماسك مجانًا هنا (opens in a new tab). عند إنشاء حساب، أو إذا كان لديك حساب بالفعل، تأكد من التبديل إلى "Sepolia Test Network" (شبكة اختبار Sepolia) في أعلى اليمين (حتى لا نتعامل بأموال حقيقية).

Set Sepolia as your network

الخطوة 4: إضافة إيثر من صنبور

من أجل نشر عقدنا الذكي على شبكة الاختبار، سنحتاج إلى بعض ETH الوهمي. للحصول على ETH، يمكنك الذهاب إلى صنبور Sepolia (opens in a new tab) المستضاف بواسطة Alchemy، وتسجيل الدخول وإدخال عنوان حسابك، ثم النقر على "Send Me ETH" (أرسل لي ETH). يجب أن ترى ETH في حساب ميتاماسك الخاص بك بعد فترة وجيزة!

الخطوة 5: التحقق من رصيدك

للتحقق مرة أخرى من وجود رصيدنا، دعنا نُجري طلب eth_getBalance (opens in a new tab) باستخدام أداة الملحن (composer) من Alchemy (opens in a new tab). سيؤدي هذا إلى إرجاع مقدار ETH في محفظتنا. بعد إدخال عنوان حساب ميتاماسك الخاص بك والنقر على "Send Request" (إرسال الطلب)، يجب أن ترى استجابة مثل هذه:

{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}

ملاحظة هذه النتيجة بوحدة Wei، وليس ETH. تُستخدم Wei كأصغر فئة من الإيثر. التحويل من Wei إلى ETH هو 1 eth = 1018 wei. لذلك إذا قمنا بتحويل 0xde0b6b3a7640000 إلى النظام العشري، نحصل على 1*1018 wei، وهو ما يعادل 1 ETH.

رائع! أموالنا الوهمية كلها موجودة.

الخطوة 6: تهيئة مشروعنا

أولاً، سنحتاج إلى إنشاء مجلد لمشروعنا. انتقل إلى سطر الأوامر واكتب:

mkdir my-nft cd my-nft

الآن بعد أن أصبحنا داخل مجلد مشروعنا، سنستخدم npm init لتهيئة المشروع. إذا لم يكن لديك npm مثبتًا بالفعل، فاتبع هذه التعليمات (opens in a new tab) (سنحتاج أيضًا إلى Node.js (opens in a new tab)، لذا قم بتنزيله أيضًا!).

npm init

لا يهم حقًا كيف تجيب على أسئلة التثبيت؛ إليك كيف فعلنا ذلك كمرجع:

وافق على package.json، ونحن جاهزون للبدء!

الخطوة 7: تثبيت Hardhat (opens in a new tab)

Hardhat هي بيئة تطوير لتجميع ونشر واختبار وتصحيح أخطاء برمجيات إيثيريوم الخاصة بك. إنها تساعد المطورين عند بناء العقود الذكية والتطبيقات اللامركزية (dapps) محليًا قبل النشر على السلسلة الحية.

داخل مشروع my-nft الخاص بنا، قم بتشغيل:

npm install --save-dev hardhat

تحقق من هذه الصفحة لمزيد من التفاصيل حول تعليمات التثبيت (opens in a new tab).

الخطوة 8: إنشاء مشروع Hardhat

داخل مجلد مشروعنا، قم بتشغيل:

npx hardhat

يجب أن ترى بعد ذلك رسالة ترحيب وخيارًا لتحديد ما تريد القيام به. حدد "create an empty hardhat.config.js":

888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 888 888 "88b 888P" d88" 888 888 "88b "88b 888 888 888 .d888888 888 888 888 888 888 .d888888 888 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 👷 Welcome to Hardhat v2.0.11 👷‍ ? What do you want to do? … Create a sample project ❯ Create an empty hardhat.config.js Quit

سيؤدي هذا إلى إنشاء ملف hardhat.config.js لنا، وهو المكان الذي سنحدد فيه جميع إعدادات مشروعنا (في الخطوة 13).

الخطوة 9: إضافة مجلدات المشروع

للحفاظ على تنظيم مشروعنا، سنقوم بإنشاء مجلدين جديدين. انتقل إلى الدليل الجذر لمشروعك في سطر الأوامر واكتب:

mkdir contracts mkdir scripts

  • contracts/ هو المكان الذي سنحتفظ فيه بكود العقد الذكي لـ NFT الخاص بنا

  • scripts/ هو المكان الذي سنحتفظ فيه بالبرامج النصية لنشر العقد الذكي الخاص بنا والتفاعل معه

الخطوة 10: كتابة عقدنا

الآن بعد إعداد بيئتنا، ننتقل إلى أشياء أكثر إثارة: كتابة كود العقد الذكي الخاص بنا!

افتح مشروع my-nft في محرر النصوص المفضل لديك (نحن نفضل VSCode (opens in a new tab)). تُكتب العقود الذكية بلغة تسمى Solidity، وهي ما سنستخدمه لكتابة العقد الذكي MyNFT.sol الخاص بنا.‌

  1. انتقل إلى مجلد contracts وأنشئ ملفًا جديدًا باسم MyNFT.sol

  2. يوجد أدناه كود العقد الذكي لـ NFT الخاص بنا، والذي استندنا فيه إلى تنفيذ ERC-721 من مكتبة أوبن زبلن (opens in a new tab). انسخ والصق المحتويات أدناه في ملف MyNFT.sol الخاص بك.

  3. نظرًا لأننا نرث الفئات من مكتبة عقود أوبن زبلن، قم بتشغيل npm install @openzeppelin/contracts^4.0.0 في سطر الأوامر لتثبيت المكتبة في مجلدنا.

إذن، ماذا يفعل هذا الكود بالضبط؟ دعنا نقسمه سطرًا بسطر.

في الجزء العلوي من عقدنا الذكي، نقوم باستيراد ثلاث فئات عقود ذكية من أوبن زبلن (opens in a new tab):

  • يحتوي @openzeppelin/contracts/token/ERC721/ERC721.sol على تنفيذ معيار ERC-721، والذي سيرثه العقد الذكي لـ NFT الخاص بنا. (لكي يكون NFT صالحًا، يجب أن ينفذ عقدك الذكي جميع طرق معيار ERC-721.) لمعرفة المزيد حول وظائف ERC-721 الموروثة، تحقق من تعريف الواجهة هنا (opens in a new tab).

  • يوفر @openzeppelin/contracts/utils/Counters.sol عدادات لا يمكن زيادتها أو إنقاصها إلا بمقدار واحد. يستخدم عقدنا الذكي عدادًا لتتبع العدد الإجمالي لرموز NFT التي تم سكها وتعيين المعرف الفريد على NFT الجديد الخاص بنا. (يجب تعيين معرف فريد لكل NFT يتم سكه باستخدام عقد ذكي — هنا يتم تحديد المعرف الفريد الخاص بنا فقط من خلال العدد الإجمالي لرموز NFT الموجودة. على سبيل المثال، أول NFT نقوم بسكه باستخدام عقدنا الذكي له معرف "1"، وNFT الثاني له معرف "2"، وما إلى ذلك).

  • يقوم @openzeppelin/contracts/access/Ownable.sol بإعداد التحكم في الوصول (opens in a new tab) على عقدنا الذكي، بحيث لا يمكن لأحد سوى مالك العقد الذكي (أنت) سك رموز NFT. (ملاحظة، تضمين التحكم في الوصول هو تفضيل شخصي تمامًا. إذا كنت ترغب في أن يتمكن أي شخص من سك NFT باستخدام عقدك الذكي، فقم بإزالة كلمة Ownable في السطر 10 و onlyOwner في السطر 17).

بعد عبارات الاستيراد الخاصة بنا، لدينا العقد الذكي المخصص لـ NFT، وهو قصير بشكل مدهش — فهو يحتوي فقط على عداد، ومُنشئ، ووظيفة واحدة! هذا بفضل عقود أوبن زبلن الموروثة، والتي تنفذ معظم الطرق التي نحتاجها لإنشاء NFT، مثل ownerOf التي تُرجع مالك NFT، و transferFrom، التي تنقل ملكية NFT من حساب إلى آخر.

في مُنشئ ERC-721 الخاص بنا، ستلاحظ أننا نمرر سلسلتين نصيتين، "MyNFT" و "NFT". المتغير الأول هو اسم العقد الذكي، والثاني هو رمزه. يمكنك تسمية كل من هذه المتغيرات كما تشاء!

أخيرًا، لدينا وظيفتنا mintNFT(address recipient, string memory tokenURI) التي تسمح لنا بسك NFT! ستلاحظ أن هذه الوظيفة تأخذ متغيرين:

  • يحدد address recipient العنوان الذي سيتلقى NFT المسكوك حديثًا

  • string memory tokenURI عبارة عن سلسلة نصية يجب أن تشير إلى مستند JSON يصف البيانات الوصفية لـ NFT. البيانات الوصفية لـ NFT هي حقًا ما يبعث الحياة فيه، مما يسمح له بامتلاك خصائص قابلة للتكوين، مثل الاسم والوصف والصورة والسمات الأخرى. في الجزء الثاني من هذا الدرس، سنصف كيفية تكوين هذه البيانات الوصفية.

تستدعي mintNFT بعض الطرق من مكتبة ERC-721 الموروثة، وتُرجع في النهاية رقمًا يمثل معرف NFT المسكوك حديثًا.

الخطوة 11: ربط ميتاماسك و Alchemy بمشروعك

الآن بعد أن أنشأنا محفظة ميتاماسك، وحساب Alchemy، وكتبنا عقدنا الذكي، حان الوقت لربط الثلاثة معًا.

تتطلب كل معاملة يتم إرسالها من محفظتك الافتراضية توقيعًا باستخدام مفتاحك الخاص الفريد. لتزويد برنامجنا بهذا الإذن، يمكننا تخزين مفتاحنا الخاص (ومفتاح API الخاص بـ Alchemy) بأمان في ملف بيئة.

لمعرفة المزيد حول إرسال المعاملات، تحقق من هذا الدرس حول إرسال المعاملات باستخدام Web3.

أولاً، قم بتثبيت حزمة dotenv في دليل مشروعك:

npm install dotenv --save

بعد ذلك، أنشئ ملف .env في الدليل الجذر لمشروعنا، وأضف إليه مفتاحك الخاص في ميتاماسك وعنوان URL الخاص بـ HTTP Alchemy API.

  • اتبع هذه التعليمات (opens in a new tab) لتصدير مفتاحك الخاص من ميتاماسك

  • انظر أدناه للحصول على عنوان URL الخاص بـ HTTP Alchemy API وانسخه إلى الحافظة الخاصة بك

Copy your Alchemy API URL

يجب أن يبدو ملف .env الخاص بك الآن هكذا:

API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key (opens in a new tab)" PRIVATE_KEY="your-metamask-private-key"

لربط هذه المتغيرات فعليًا بالكود الخاص بنا، سنشير إليها في ملف hardhat.config.js الخاص بنا في الخطوة 13.

لا تقم بإيداع ⁦.env⁩! يرجى التأكد من عدم مشاركة أو كشف ملف ⁦.env⁩ الخاص بك لأي شخص، لأنك بذلك تعرض أسرارك للخطر. إذا كنت تستخدم نظام التحكم في الإصدار، فأضف ⁦.env⁩ إلى ملف ⁦gitignore⁩ (opens in a new tab).

الخطوة 12: تثبيت Ethers.js

Ethers.js هي مكتبة تسهل التفاعل وتقديم الطلبات إلى إيثيريوم عن طريق تغليف طرق JSON-RPC القياسية بطرق أكثر سهولة في الاستخدام.

يجعل Hardhat من السهل جدًا دمج المكونات الإضافية (Plugins) (opens in a new tab) للحصول على أدوات إضافية ووظائف موسعة. سنستفيد من المكون الإضافي Ethers (opens in a new tab) لنشر العقود (تحتوي Ethers.js (opens in a new tab) على بعض طرق نشر العقود النظيفة جدًا).

في دليل مشروعك، اكتب:

npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0

سنحتاج أيضًا إلى ethers في ملف hardhat.config.js الخاص بنا في الخطوة التالية.

الخطوة 13: تحديث hardhat.config.js

لقد أضفنا العديد من التبعيات والمكونات الإضافية حتى الآن، والآن نحتاج إلى تحديث hardhat.config.js حتى يتعرف مشروعنا عليها جميعًا.

قم بتحديث hardhat.config.js الخاص بك ليبدو هكذا:

الخطوة 14: تجميع عقدنا

للتأكد من أن كل شيء يعمل حتى الآن، دعنا نجمع عقدنا. مهمة التجميع (compile) هي إحدى مهام Hardhat المدمجة.

من سطر الأوامر، قم بتشغيل:

npx hardhat compile

قد تتلقى تحذيرًا بشأن عدم توفير معرف ترخيص SPDX في الملف المصدر، ولكن لا داعي للقلق بشأن ذلك — نأمل أن يبدو كل شيء آخر جيدًا! إذا لم يكن الأمر كذلك، يمكنك دائمًا إرسال رسالة في ديسكورد Alchemy (opens in a new tab).

الخطوة 15: كتابة البرنامج النصي للنشر

الآن بعد أن تمت كتابة عقدنا وأصبح ملف التكوين الخاص بنا جاهزًا، حان الوقت لكتابة البرنامج النصي لنشر العقد.

انتقل إلى مجلد scripts/ وأنشئ ملفًا جديدًا يسمى deploy.js، مع إضافة المحتويات التالية إليه:

يقوم Hardhat بعمل رائع في شرح ما يفعله كل سطر من أسطر الكود هذه في درس العقود (opens in a new tab) الخاص بهم، وقد اعتمدنا شروحاتهم هنا.

const MyNFT = await ethers.getContractFactory("MyNFT");

يعد ContractFactory في Ethers.js تجريدًا يُستخدم لنشر عقود ذكية جديدة، لذا فإن MyNFT هنا هو مصنع لمثيلات عقد NFT الخاص بنا. عند استخدام المكون الإضافي hardhat-ethers، يتم توصيل مثيلات ContractFactory و Contract بالمُوقّع الأول افتراضيًا.

const myNFT = await MyNFT.deploy();

سيؤدي استدعاء deploy() على ContractFactory إلى بدء النشر، وإرجاع Promise يتم حله إلى Contract. هذا هو الكائن الذي يحتوي على طريقة لكل وظيفة من وظائف العقد الذكي الخاص بنا.

الخطوة 16: نشر عقدنا

نحن مستعدون أخيرًا لنشر عقدنا الذكي! ارجع إلى جذر دليل مشروعك، وفي سطر الأوامر قم بتشغيل:

npx hardhat --network sepolia run scripts/deploy.js

يجب أن ترى بعد ذلك شيئًا مثل:

Contract deployed to address: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650

إذا ذهبنا إلى Etherscan لشبكة Sepolia (opens in a new tab) وبحثنا عن عنوان عقدنا، فيجب أن نتمكن من رؤية أنه قد تم نشره بنجاح. إذا لم تتمكن من رؤيته على الفور، يرجى الانتظار لفترة حيث قد يستغرق الأمر بعض الوقت. ستبدو المعاملة كالتالي:

View your transaction address on Etherscan

يجب أن يتطابق عنوان "From" (من) مع عنوان حساب ميتاماسك الخاص بك وسيشير عنوان "To" (إلى) إلى "Contract Creation" (إنشاء عقد). إذا نقرنا على المعاملة، فسنرى عنوان عقدنا في حقل "To":

View your contract address on Etherscan

رائع! لقد قمت للتو بنشر العقد الذكي لـ NFT الخاص بك على سلسلة إيثيريوم (شبكة الاختبار)!

لفهم ما يحدث داخليًا، دعنا ننتقل إلى علامة التبويب Explorer (المستكشف) في لوحة تحكم Alchemy (opens in a new tab) الخاصة بنا. إذا كان لديك تطبيقات Alchemy متعددة، فتأكد من التصفية حسب التطبيق وحدد "MyNFT".

View calls made “under the hood” with Alchemy’s Explorer Dashboard

هنا سترى مجموعة من استدعاءات JSON-RPC التي أجراها Hardhat/Ethers داخليًا لنا عندما استدعينا وظيفة .deploy(). هناك استدعاءان مهمان يجب الإشارة إليهما هنا وهما eth_sendRawTransaction، وهو طلب كتابة عقدنا الذكي فعليًا على سلسلة Sepolia، و eth_getTransactionByHash وهو طلب لقراءة معلومات حول معاملتنا بناءً على التجزئة (نمط نموذجي عند إرسال المعاملات). لمعرفة المزيد حول إرسال المعاملات، تحقق من هذا الدرس حول إرسال المعاملات باستخدام Web3.

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