استاندارد چند توکنی 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-202function transferFrom(address from, address to, uint256 value) external returns (bool);34// ERC-11555function safeBatchTransferFrom(6 address _from,7 address _to,8 uint256[] calldata _ids,9 uint256[] calldata _values,10 bytes calldata _data11) external;نمایش همهکپی
تنها تفاوت ERC-1155 در این است که مقادیر را به عنوان یک آرایه ارسال می کنیم و همچنین یک آرایه از id را نیز ارسال می کنیم. به عنوان مثال با توجه به ids=[3, 6, 13]
و values=[100, 200, 5]
، انتقالهای حاصل به صورت زیر می باشد
- 100 توکن با شناسه 3 را از
from_
بهto_
منتقل کنید. - 200 توکن با شناسه 6 را از
from_
بهto_
منتقل کنید. - 5 توکن با شناسه 13 را از
from_
بهto_
منتقل کنید.
در ERC-1155 تنها تابع transferFrom
را داریم و تابع transfer
نداریم. برای استفاده از آن مانند یک انتقال
معمولی، کافی است آدرس from را به آدرسی که تابع را فراخوانی میکند، تنظیم کنید.
موجودی دسته ای
فراخوانی مربوط به ERC-20 balanceOf
نیز به همین ترتیب تابع شریک خود را با پشتیبانی دسته ای دارد. به عنوان یک یادآوری، این نسخه ERC-20 است:
1// ERC-202function balanceOf(address owner) external view returns (uint256);34// ERC-11555function balanceOfBatch(6 address[] calldata _owners,7 uint256[] calldata _ids8) 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-11552function setApprovalForAll(3 address _operator,4 bool _approved5) external;67function isApprovedForAll(8 address _owner,9 address _operator10) 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 _data7) 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) را ببینید.
قانون انتقال ایمن
ما قبلاً در توضیحات قبلی به چند قانون انتقال ایمن اشاره کردیم. اما بیایید مهم ترین قوانین را بررسی کنیم:
- تماسگیرنده می بایست برای خرج کردن توکن ها برای آدرس
from_
تأیید شود یا تماسگیرنده باید برابر باfrom_
باشد. - فراخوانی انتقال باید برگردانده شود اگر
- آدرس
to_
باشد. - طول
_ids
با طول_values
یکسان نباشد. - هر یک از موجودی(های) دارنده(های) توکن(ها) در
_ids
کمتر از مقدار(های) مربوطه در_values
ارسال شده به گیرنده باشد. - هر خطای دیگری رخ دهد.
- آدرس
توجه: همه توابع دستهای از جمله قلاب در نسخههای بدون دسته نیز وجود دارند. با توجه به اینکه انتقال تنها یک دارایی احتمالاً همچنان رایج ترین راه مورد استفاده خواهد بود، این کار به منظور بهره وری گاز انجام می شود. ما همگی آنها، از جمله قوانین انتقال ایمن را به خاطر سادگی در توضیحات کنار گذاشتیم. نام ها یکسان هستند، فقط "دسته ای" را حذف کنید.