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

معيار الرمز غير القابل للاستبدال ERC-721

آخر تحديث للصفحة: 25 فبراير 2026

مقدمة

ما هو الرمز غير القابل للاستبدال؟

يُستخدم الرمز غير القابل للاستبدال (إن إف تي) لتحديد شيء ما أو شخص ما بطريقة فريدة. يُعد هذا النوع من الرموز مثالياً للاستخدام في المنصات التي تقدم عناصر قابلة للتجميع أو مفاتيح وصول أو تذاكر يانصيب أو مقاعد مرقمة للحفلات الموسيقية والمباريات الرياضية وغيرها. لهذا النوع الخاص من الرموز إمكانيات مذهلة، لذا استحق وجود معيار مناسب له، فجاء ERC-721 ليحقق هذا الهدف!

ما هو ERC-721؟

يُقدِّم معيار ERC-721 نموذجًا موحدًا للرموز غير القابلة للاستبدال. بعبارة أخرى، يكون هذا النوع من الرموز فريدًا ويمكن أن يمتلك قيمة مختلفة عن أي رمز آخر صادِر من نفس العقد الذكي، ربما بسبب عمره أو ندرته أو حتى مظهره أو خصائص أخرى. مهلًا، مظهره؟

نعم! تمتلك جميع الرموز غير القابلة للاستبدال (إن إف تيز) متغيرًا uint256 يُدعى tokenId، لذا بالنسبة لأي عقد ERC-721، يجب أن يكون الزوج contract address, uint256 tokenId فريدًا عالميًا. ومع ذلك، يمكن لتطبيق لامركزي أن يمتلك "محولًا" يستخدم tokenId كمدخل ويُخرج صورة لشيء رائع، مثل الزومبي أو الأسلحة أو المهارات أو القطط المذهلة!

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

الجسد

تم اقتراح معيار ERC-721 (اختصارًا لـ إيثريوم Request for Comments 721) من قبل ويليام إنتريكن وديتر شيرلي وجاكوب إيفانز وناستاسيا ساكس في يناير 2018، وهو معيار للرموز غير القابلة للاستبدال يوفّر واجهة برمجية (API) للتعامل مع هذه الرموز ضمن العقود الذكية.

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

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

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

طرق

1 function balanceOf(address _owner) external view returns (uint256);
2 function ownerOf(uint256 _tokenId) external view returns (address);
3 function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;
4 function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
5 function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
6 function approve(address _approved, uint256 _tokenId) external payable;
7 function setApprovalForAll(address _operator, bool _approved) external;
8 function getApproved(uint256 _tokenId) external view returns (address);
9 function isApprovedForAll(address _owner, address _operator) external view returns (bool);
إظهار الكل

الأحداث

1 event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
2 event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
3 event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

أمثلة

دعونا نرى كيف أن المعيار مهم جداً لجعل الأمور بسيطة بالنسبة لنا لفحص أي عقد توكن ERC-721 على Ethereum. We just need the Contract Application Binary Interface (ABI) to create an interface to any ERC-721 Token. كما ترى أدناه، سنستخدم واجهة برمجة تطبيقات (ABI) مبسطة، لجعلها مثالاً منخفض الاحتكاك.

مثال ويب3.باي

أولاً، تأكد من تثبيت مكتبة ويب3.باي (opens in a new tab) الخاصة بلغة بايثون:

1pip install web3
1from web3 import Web3
2from web3._utils.events import get_event_data
3
4w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))
5
6ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # عقد CryptoKitties
7
8acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # مزاد مبيعات CryptoKitties
9
10# هذه واجهة تطبيق ثنائية للعقد (ABI) مبسطة لعقد ERC-721 NFT.
11# ستكشف فقط عن الدوال التالية: balanceOf(address)، name()، ownerOf(tokenId)، symbol()، totalSupply()
12simplified_abi = [
13 {
14 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}],
15 'name': 'balanceOf',
16 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
17 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
18 },
19 {
20 'inputs': [],
21 'name': 'name',
22 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
23 'stateMutability': 'view', 'type': 'function', 'constant': True
24 },
25 {
26 'inputs': [{'internalType': 'uint256', 'name': 'tokenId', 'type': 'uint256'}],
27 'name': 'ownerOf',
28 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}],
29 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
30 },
31 {
32 'inputs': [],
33 'name': 'symbol',
34 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}],
35 'stateMutability': 'view', 'type': 'function', 'constant': True
36 },
37 {
38 'inputs': [],
39 'name': 'totalSupply',
40 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}],
41 'stateMutability': 'view', 'type': 'function', 'constant': True
42 },
43]
44
45ck_extra_abi = [
46 {
47 'inputs': [],
48 'name': 'pregnantKitties',
49 'outputs': [{'name': '', 'type': 'uint256'}],
50 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
51 },
52 {
53 'inputs': [{'name': '_kittyId', 'type': 'uint256'}],
54 'name': 'isPregnant',
55 'outputs': [{'name': '', 'type': 'bool'}],
56 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True
57 }
58]
59
60ck_contract = w3.eth.contract(address=w3.to_checksum_address(ck_token_addr), abi=simplified_abi+ck_extra_abi)
61name = ck_contract.functions.name().call()
62symbol = ck_contract.functions.symbol().call()
63kitties_auctions = ck_contract.functions.balanceOf(acc_address).call()
64print(f"{name} [{symbol}] NFTs in Auctions: {kitties_auctions}")
65
66pregnant_kitties = ck_contract.functions.pregnantKitties().call()
67print(f"{name} [{symbol}] NFTs Pregnants: {pregnant_kitties}")
68
69# استخدام واجهة التطبيق الثنائية لحدث التحويل (Transfer Event ABI) للحصول على معلومات حول القطط المحولة.
70tx_event_abi = {
71 'anonymous': False,
72 'inputs': [
73 {'indexed': False, 'name': 'from', 'type': 'address'},
74 {'indexed': False, 'name': 'to', 'type': 'address'},
75 {'indexed': False, 'name': 'tokenId', 'type': 'uint256'}],
76 'name': 'Transfer',
77 'type': 'event'
78}
79
80# نحتاج إلى توقيع الحدث لتصفية السجلات
81event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex()
82
83logs = w3.eth.get_logs({
84 "fromBlock": w3.eth.block_number - 120,
85 "address": w3.to_checksum_address(ck_token_addr),
86 "topics": [event_signature]
87})
88
89# ملاحظات:
90# - قم بزيادة عدد الكتل فوق 120 إذا لم يتم إرجاع أي حدث تحويل.
91# - إذا لم تجد أي حدث تحويل، يمكنك أيضًا محاولة الحصول على tokenId من:
92# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events
93# انقر لتوسيع سجلات الحدث وانسخ وسيطة "tokenId" الخاصة به
94recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs]
95
96if recent_tx:
97 kitty_id = recent_tx[0]['tokenId'] # الصق "tokenId" هنا من الرابط أعلاه
98 is_pregnant = ck_contract.functions.isPregnant(kitty_id).call()
99 print(f"{name} [{symbol}] NFTs {kitty_id} is pregnant: {is_pregnant}")
إظهار الكل

عقد كريبتو كيتيز يحتوي على بعض الأحداث المميزة الإضافية إلى جانب الأحداث القياسية.

دعنا نتحقق من اثنين منهم، Pregnant و Birth.

1# استخدام واجهة التطبيق الثنائية لأحداث الحمل والولادة (Pregnant and Birth Events ABI) للحصول على معلومات حول القطط الجديدة.
2ck_extra_events_abi = [
3 {
4 'anonymous': False,
5 'inputs': [
6 {'indexed': False, 'name': 'owner', 'type': 'address'},
7 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
8 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
9 {'indexed': False, 'name': 'cooldownEndBlock', 'type': 'uint256'}],
10 'name': 'Pregnant',
11 'type': 'event'
12 },
13 {
14 'anonymous': False,
15 'inputs': [
16 {'indexed': False, 'name': 'owner', 'type': 'address'},
17 {'indexed': False, 'name': 'kittyId', 'type': 'uint256'},
18 {'indexed': False, 'name': 'matronId', 'type': 'uint256'},
19 {'indexed': False, 'name': 'sireId', 'type': 'uint256'},
20 {'indexed': False, 'name': 'genes', 'type': 'uint256'}],
21 'name': 'Birth',
22 'type': 'event'
23 }]
24
25# نحتاج إلى توقيع الحدث لتصفية السجلات
26ck_event_signatures = [
27 w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(),
28 w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(),
29]
30
31# هذا مثال لحدث الحمل (Pregnant Event):
32# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog
33pregnant_logs = w3.eth.get_logs({
34 "fromBlock": w3.eth.block_number - 120,
35 "address": w3.to_checksum_address(ck_token_addr),
36 "topics": [ck_event_signatures[0]]
37})
38
39recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs]
40
41# هذا مثال لحدث الولادة (Birth Event):
42# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a
43birth_logs = w3.eth.get_logs({
44 "fromBlock": w3.eth.block_number - 120,
45 "address": w3.to_checksum_address(ck_token_addr),
46 "topics": [ck_event_signatures[1]]
47})
48
49recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs]
إظهار الكل
  • إيثرسكان إن إف تي Tracker (opens in a new tab) يسرد أفضل الرموز غير القابلة للاستبدال على إيثريوم من حيث حجم التحويلات.
  • كريبتو كيتيز (opens in a new tab) هي لعبة تتمحور حول مخلوقات قابلة للتكاثر والجمع ولطيفة للغاية نطلق عليها اسم كريبتو كيتيز.
  • Sorare (opens in a new tab) هي لعبة كرة قدم خيالية عالمية يمكنك فيها جمع مقتنيات محدودة الإصدار، وإدارة فرقك والمنافسة لكسب الجوائز.
  • تقدم خدمة اسم الإيثيريوم (إي إن إس) (opens in a new tab) طريقة آمنة ولا مركزية لعنونة الموارد سواء على البلوكتشين أو خارجه باستخدام أسماء بسيطة سهلة القراءة.
  • يقدم POAP (opens in a new tab) رموزًا غير قابلة للاستبدال (إن إف تيز) مجانية للأشخاص الذين يحضرون الفعاليات أو يكملون إجراءات محددة. يُنشأ POAPs ويُوزَّع مجانًا.
  • Unstoppable Domains (opens in a new tab) هي شركة مقرها سان فرانسيسكو تعمل على بناء النطاقات على البلوكتشين. تستبدل نطاقات البلوكتشين عناوين العملات الرقمية بأسماء سهلة القراءة للبشر ويمكن استخدامها لتمكين مواقع الويب المقاومة للرقابة.
  • Gods Unchained Cards (opens in a new tab) هي لعبة تداول بطاقات (TCG) على بلوكتشين الإيثيريوم تستخدم الرموز غير القابلة للاستبدال (إن إف تيز) لإضفاء الملكية الحقيقية على الأصول داخل اللعبة.
  • Bored Ape Yacht Club (opens in a new tab) هي مجموعة من 10,000 من الرموز غير القابلة للاستبدال (إن إف تيز) الفريدة، والتي تعمل كرمز عضوية للنادي، بالإضافة إلى كونها قطعة فنية يمكن إثبات ندرتها، وتوفر امتيازات ومزايا للأعضاء تزداد بمرور الوقت نتيجة لجهود المجتمع.

قراءة إضافية

هل كانت هذه المقالة مفيدة؟