پرش به محتوای اصلی
Change page

استاندارد چند توکنی ERC-1155

آخرین ویرایش: @nader.sedigh(opens in a new tab), ۲۴ مرداد ۱۴۰۲

معرفی

یک رابط استاندارد برای قراردادهایی است که چندین نوع توکن را مدیریت می کنند. یک تک قرارداد هوشمند مستقر ممکن است شامل هر ترکیبی از توکن‌های تعویض پذیر، توکن‌های تعویض ناپذیر یا سایر پیکربندی‌ها (مانند توکن‌های نیمه تعویض پذیر) باشد.

منظور از استاندارد چند توکنی چیست؟

این ایده ساده است و به دنبال ایجاد یک رابط برنامه نویسی قرارداد هوشمند می‌باشد که می تواند هر تعداد توکن تعویض پذیر و تعویض ناپذیر را نشان دهد و کنترل کند. به این ترتیب، توکن 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:

  • انتقال دسته‌ای: چندین دارایی را در یک فراخوانی منتقل کنید.
  • تراز دسته ای: موجودی چندین دارایی را در یک فراخوانی دریافت کنید.
  • تأیید دسته‌ای: همه توکن ها را برای یک آدرس تأیید کنید.
  • قلاب‌ها: قلاب توکن‌ها را دریافت کنید.
  • پشتیبانی NFT: اگر عرضه تنها ۱ باشد، با آن به عنوان NFT رفتار کنید.
  • قوانین انتقال ایمن: مجموعه قوانین برای انتقال ایمن.

انتقال دسته ای

عملیات انتقال دسته ای بسیار شبیه به انتقال معمولی ERC-20 است. بیایید نگاهی به تابع transferFrom استاندارد ERC-20 بیاندازیم:

1// ERC-20
2function transferFrom(address from, address to, uint256 value) external returns (bool);
3
4// ERC-1155
5function safeBatchTransferFrom(
6 address _from,
7 address _to,
8 uint256[] calldata _ids,
9 uint256[] calldata _values,
10 bytes calldata _data
11) external;
نمایش همه
کپی

تنها تفاوت ERC-1155 در این است که مقادیر را به عنوان یک آرایه ارسال می کنیم و همچنین یک آرایه از id را نیز ارسال می کنیم. به عنوان مثال با توجه به ids=[3, 6, 13] و values=[100, 200, 5]، انتقال‌های حاصل به صورت زیر می باشد

  1. 100 توکن با شناسه 3 را از from_ به to_ منتقل کنید.
  2. 200 توکن با شناسه 6 را از from_ به to_ منتقل کنید.
  3. 5 توکن با شناسه 13 را از from_ به to_ منتقل کنید.

در ERC-1155 تنها تابع transferFrom را داریم و تابع transfer نداریم. برای استفاده از آن مانند یک انتقال معمولی، کافی است آدرس from را به آدرسی که تابع را فراخوانی می‌کند، تنظیم کنید.

موجودی دسته ای

فراخوانی مربوط به ERC-20 balanceOf نیز به همین ترتیب تابع شریک خود را با پشتیبانی دسته ای دارد. به عنوان یک یادآوری، این نسخه ERC-20 است:

1// ERC-20
2function balanceOf(address owner) external view returns (uint256);
3
4// ERC-1155
5function balanceOfBatch(
6 address[] calldata _owners,
7 uint256[] calldata _ids
8) external view returns (uint256[] memory);
کپی

حتی ساده‌تر از فراخوانی موجودی، می‌توانیم چندین موجودی را در یک فراخوانی بدست آوریم. آرایه از دارندگان حساب و به دنبال آن آرایه ای از شناسه های توکن را ارسال می کنیم.

به عنوان مثال، با توجه به _ids=[3, 6, 13] و _owners=[0xbeef..., 0x1337..., 0x1111...]، مقدار بازگشتی برابر خواهد شد با

1[
2 balanceOf(0xbeef...),
3 balanceOf(0x1337...),
4 balanceOf(0x1111...)
5]
کپی

تایید دسته ای

1// ERC-1155
2function setApprovalForAll(
3 address _operator,
4 bool _approved
5) external;
6
7function isApprovedForAll(
8 address _owner,
9 address _operator
10) external view returns (bool);
نمایش همه
کپی

تاییدیه ها کمی با ERC-20 تفاوت دارند. به جای تأیید مبالغ خاص، یک اپراتور را از طریق setApprovalForAll روی تایید یا تایید نشده تنظیم می کنیم.

خواندن وضعیت فعلی را می توان از طریق isApprovedForAll انجام داد. همان‌طور که مشاهده می‌کنید، این یک پاسخ صفر و یک است. شما نمی توانید تعیین کنید که چه تعداد توکن باید تایید شود یا حتی کدام کلاس توکن باید تایید شود.

این مقوله عمدا با در نظر گرفتن سادگی طراحی شده است. شما فقط می توانید همه چیز را برای یک آدرس تایید کنید.

قلاب دریافت

1function onERC1155BatchReceived(
2 address _operator,
3 address _from,
4 uint256[] calldata _ids,
5 uint256[] calldata _values,
6 bytes calldata _data
7) external returns(bytes4);
کپی

با توجه به پشتیبانی EIP-165(opens in a new tab)، پشتیبانی ERC-1155 تنها از قلاب‌های دریافت برای قرارداد هوشمند پشتیبانی می‌کند. تابع قلاب می بایست مقدار bytes4 از پیش تعریف شده جادویی را برگرداند که به صورت زیر داده می شود:

1bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
کپی

وقتی قرارداد دریافت‌کننده این مقدار را برمی‌گرداند، فرض بر این است که قرارداد انتقال را می‌پذیرد و می‌داند چگونه با توکن‌های ERC-1155 کار کند. عالی است، دیگر هیچ توکنی در یک قرارداد گیر نمی‌کند!

پشتیبانی از NFT

وقتی عرضه فقط یک باشد، توکن اساساً یک توکن تعویض ناپذیر (NFT) است. و همانطور که برای ERC-721 استاندارد است، می‌توانید یک URL اَبَرداده ای را تعریف کنید. URL را می توان توسط کلاینت ها خواند و تغییر داد، اینجا(opens in a new tab) را ببینید.

قانون انتقال ایمن

ما قبلاً در توضیحات قبلی به چند قانون انتقال ایمن اشاره کردیم. اما بیایید مهم ترین قوانین را بررسی کنیم:

  1. تماس‌گیرنده می بایست برای خرج کردن توکن ها برای آدرس from_ تأیید شود یا تماس‌گیرنده باید برابر با from_ باشد.
  2. فراخوانی انتقال باید برگردانده شود اگر
    1. آدرس to_ باشد.
    2. طول _ids با طول _values یکسان نباشد.
    3. هر یک از موجودی(های) دارنده(های) توکن(ها) در _ids کمتر از مقدار(های) مربوطه در _values ارسال شده به گیرنده باشد.
    4. هر خطای دیگری رخ دهد.

توجه: همه توابع دسته‌ای از جمله قلاب در نسخه‌های بدون دسته نیز وجود دارند. با توجه به اینکه انتقال تنها یک دارایی احتمالاً همچنان رایج ترین راه مورد استفاده خواهد بود، این کار به منظور بهره وری گاز انجام می شود. ما همگی آنها، از جمله قوانین انتقال ایمن را به خاطر سادگی در توضیحات کنار گذاشتیم. نام ها یکسان هستند، فقط "دسته ای" را حذف کنید.

بیشتر بخوانید

آیا این مقاله مفید بود؟