در طول سال گذشته یا از زمانیکه DAPP ها به آرامی به مرکز توجهات تبدیل شدند، کریپتوکیتیز (CryptoKitties) مطرح شدند. همانطور که احتمالاً می دانید، یک DAPP توسط یک سازمان کنترل نمی شود و در حال گسترش یک پارادایم جدید و کاربردی می باشد.
برای اینکه DAPPها توجهات لازم را به خود جلب کنند یکی از آنها باید کار ویژه ای انجام می داد. درست است که بیت کوین نیز یک DAPP است ولی در اینجا در مورد ذخیره ارزش صحبت نمی کنیم. باید یکی وارد می شد و قدرت تخیل افراد را هدف قرار می داد.
پیشنهاد مطالعه: اپلیکیشن غیرمتمرکز یا Dapp چیست؟
کریپتوکیتی ها یا همان کریپتوکیتیز یک بازی مجازی براساس بلاک چین است که به بازیگران اجازه می دهد تا گربه مجازی نگهداری و پرورش دهند. این بازی توسط شرکت بلاک چین Axiom Zen طراحی شد. اگرچه، چیزی که لازم است به خاطر داشته باشید این است که، این اولین اپلیکیشن DAPP بود که با هدف سرگرمی ایجاد شد.
استقبال از این بازی بی نظیر بود، افراد میلیون ها دلار برای خرید آن صرف می کردند. حتی گزارش هایی وجود دارد که نشان می دهد که افراد پول بیشتری از آن نسبت به سایر رمزارزها بدست آورده اند.
اجازه دهید تعداد فروش در هر روز را بررسی کنیم:
چندین مقاله در مورد “kitty phenomena” وجود دارد. استقبال از آن به حدی بود که سازنده آن نیز شوکه شده بود.
هر کیتی دارای کد ژنوم خاص خود است، که نسل های بعدی انتقال می یابد و با استفاده از الگوریتم ژنتیک کار می کند.
الگوریتم ژنتیک چیست؟
الگوریتم ژنتیک یک تکنیک بهینه شده مورد استفاده برای حل مسائل بهینه سازی غیرخطی است. روش کارکرد آن مشابه کارکرد ژنتیک بیولوژی است. در ابتدا توسط تعدادی از راهکارهای کاندیدها شکل می گیرد که در تابع هدف چک شده است. الگوریتم سپس راهکارهای بعدی را از این والدها را از طریق عملگرهایی مثل انتخاب، انتقال و جهش تشکیل می دهد.
درحالیکه ژن در بدن از پروتئین و مواد دیگر تشکیل شده است، در یک GA آنها به شکل اعداد نمایش داده می شوند. اجازه دهید بررسی کنیم که تکامل با استفاده از الگوریتم ژنتیک چگونه انجام می شود. در این مورد فقط از کیس دوتایی استفاده می کنیم یعنی ژن ها به صورت صفر و یک نمایش داده می شوند.
- انتخاب: انتخاب اساساً به معنی انتخاب بهترین والد از یک نسل به نسل دیگر است. این والدهای وظیفه شناس آنهایی هستند که برای تولید نسل اولویت داشته اند. برای مثال، دو والدی که انتخاب شده اند شامل ۱۰۱۰۰۱۱۰۰۰ و ۱۰۰۱۰۰۱۰۱۰ هستند.
- عبور: چیزی که در اینجا اتفاق می افتد این است که متغیر مشترک دو والد انتخاب می شود و در کودک گنجانده می شود. مثلاً در این مثال: والد اول: ۱۰۱۰۰۱۱۰۰۰P و والد دوم: ۱۰۰۰۰۱۱۰۱۰ است که چنین روندی در دنیای واقعی نیز وجود دارد. از این طریق کودک ویژگی های خاصی از پدر و مادر کسب می کند.
- جهش: جهش زمانی است که یک والد و به صورت رندوم برخی از متغیرهای آن تغییر یابد تا یک کودک ایجاد شود. این کار به این دلیل اینجام می شود که اطیمنان حاصل شود که سیستم می تواند احتمال های دیگر انتخاب بهینه را در نظر بگیرد. والد: ۱۰۱۰۰۱۱۰۰۰ و کودک: ۰۱۰۱۰۱۰۰۰۱
کریپتوکیتیز از الگوریتم ژنتیک استفاده می کند تا یک کیتی جدید ایجاد شود. از الگوریتم گذر استفاده می کند تا یک کودک از طریق دو کیتی والد به وجود بیاید. ژن کودک برای تولید یک کیتی جدید استفاده می شود.
حال به بررسی قراردادهای هوشمند آن می پردازیم:
کل کد به چندین قرارداد شکسته می شود. این کار انجام می شود زیرا در غیر اینصورت، کدهای همگن مدیریت را غیرممکن می سازند.
درخت وراثت به این شکل خواهد بود:
contract KittyAccessControl contract KittyBase is KittyAccessControl contract KittyOwnership is KittyBase, ERC721 contract KittyBreeding is KittyOwnership contract KittyAuction is KittyBreeding contract KittyMinting is KittyAuction contract KittyCore is KittyMinting
در این مورد، کیتی کور قراردادی است که دارای همه کدها از قراردادهای بنیادی است. اجازه دهید بررسی کنیم که هر یک از این قراردادها چه کاری انجام می دهند.
کنترل دسترسی به کریپتوکیتی:
این قرارداد دارای نقش های مختلفی است. این قرارداد سیستم مدیریتی را در کل قرارداد تنظیم می کند و کاری با عملکرد بازی ندارد. نقش های خاصی که به این قرارداد تخصیص داده شده شامل موارد زیر می باشد:
- مدیر ارشد: مدیر ارشد می تواند نقش های دیگر را دوباره تخصیص دهد و آدرس های قراردادهای هوشمند وابسته را تغییر دهد. او حتی می تواند قرارداد را فعال کند.
- مدیر ارشد مالی: می تواند سرمایه را از کیتی کور و قراردادهای مزایده بردارد.
- مدیر ارشد عملیاتی: می تواند ژن صفر را برای بررسی انتشار دهد و
این قرارداد دارای تابع مکث است:
This contract also has a “pause” function: function pause() public onlyCLevel whenNotPaused { paused = true; }
این فرآیند توسعه دهندگان را قادر می سازد تا کل قرارداد را متوقف کنند اگر هک یا باگی بوجود بیاید یا اگر بخواهند کل سیستم را آپگرید کنند.
پیشنهاد مطالعه: قرارداد هوشمند چیست؟ (Smart Contract)
CryptokittyBase:
KittyBase یکی از مهم ترین قراردادها می باشد زیرا تعریف کیتی در آن ایجاد می شود. اینجا جایی است که قوانین اولیه برای ایجاد کیتی بوجود می آیند. کیتی ها محصول تعداد زیادی از متغیرها هستند.
struct Kitty { uint256 genes; uint64 birthTime; uint64 cooldownEndBlock; uint32 matronId; uint32 sireId; uint32 siringWithId; uint16 cooldownIndex; uint16 generation; }
اجازه دهید به توصیف هر یک از متغیرها بپردازیم:
این بخش قرارداد صاحبان کیتی را نیز کنترل می کند. این فرآیند از طریق کدهای زیر انجام می شود:
mapping (uint256 => address) public kittyIndexToOwner;
Cryptokitty OwnerShip
از این طریق KittyOwnerShip در قرارداد تعریف می شود:
تعویض پذیر و تعویض ناپذیر چیست؟
فرض کنید ۲۰ دلار قرض بگیرید می توانید یک ۱۰ دلاری و دو ۵ دلاری به فرد بدهید. بنابراین، دلار تعویض پذیر است.
اگرچه، اگر ماشینی از شخصی قرض بگیرید نمی توانید یک ماشین دیگر به او بدهید، بنابراین ماشین تعویض پذیر نیست.
کیتی ها در کریپتوکیتیز تعویض ناپذیر هستند. نمی توانید بسادگی یک کیتی را با کیتی دیگر تعویض کنید. توکن کریپتوکیتیز از فرمول ERC721 استفاده می کند.
پرورش کریپتوکیتی:
این قراردادی است که نیاز به دو کیتی برای تولید یک کیتی جدید داریم. فرآیند بوجود آمدن کیتی و حتی فرآیند تولد نیز وجود دارد. اجازه دهید به بررسی هر دو بپردازیم.
function _breedWith(uint256 _matronId, uint256 _sireId) internal { Kitty storage sire = kitties[_sireId]; Kitty storage matron = kitties[_matronId]; matron.siringWithId = uint32(_sireId); _triggerCooldown(sire); _triggerCooldown(matron); delete sireAllowedToAddress[_matronId]; delete sireAllowedToAddress[_sireId]; pregnantKitties++; Pregnant(kittyIndexToOwner[_matronId], _matronId, _sireId, matron.cooldownEndBlock); }
در درجه اول آیدی های مادر و پدر گرفته می شوند و قسمتی از آیدی مادر که مربوط به بچه دار شدن است از صفر به آیدی پدر تغییر می کند. همچنین، تعداد کیتی های حامله در سیستم یک واحد اضافه می شود.
حال اجازه دهید به بررسی فرآیند تولد بپردازیم.
function giveBirth(uint256 _matronId) external whenNotPaused returns(uint256) { Kitty storage matron = kitties[_matronId]; require(matron.birthTime != ۰); require(_isReadyToGiveBirth(matron)); uint256 sireId = matron.siringWithId Kitty storage sire = kitties[sireId]; uint16 parentGen = matron.generation; if (sire.generation > matron.generation) { parentGen = sire.generation; } uint256 childGenes = geneScience.mixGenes(matron.genes, sire.genes, matron.cooldownEndBlock - ۱); address owner = kittyIndexToOwner[_matronId]; uint256 kittenId = _createKitty(_matronId, matron.siringWithId, parentGen + ۱, childGenes, owner); delete matron.siringWithId; pregnantKitties--; msg.sender.send(autoBirthFee); return kittenId; }
در درجه اول، تابع چک می کند که آیا مادر آماده وضع حمل است یا نه. اگر مادر آماده باشد، سپس فرآیند parentGen اتفاق می افتد یعنی فرزند والدین در نسل مادر یا نسل پدر قرار می گیرد، بستگی به این دارد که کدام جوانتر باشند.
پس از آن، ژن کودک از طریق فراخوانی تابع geneScience.mixGenes ایجاد می شود. الگوریتم تولید مثل از طریق قراردادی که GeneScienceInterface را اجرا می کند کنترل می شود. این الگوریتم متن بسته است و در دید عموم قرار ندارد.
وقتی مادر فرزند را به دنیا آورد سه اتفاق می افتد:
- تعداد کیتی های حامله یک واحد کاهش می یابد.
- مالکیت کیتی جدید به مالک مادر داده می شود.
- تابع سپس تابع createKitty را فرا می خواند که در KittyBase توسعه داده شده است.
به حراج گذاشتن cryptokitties
در اینجا در مورد روش عمومی برای حراجی یا خرید گربه ها یا سرویس های siring بیشتر خواهیم دانست. کاربرد تابع اصلی در دو قرارداد کنترل می شود (یکی برای فروش و یکی دیگر برای siring)، درحالیکه ایجاد حراجی و خرید اغلب از طریق این ویژگی قرارداد اصلی صورت می گیرد.
در این قرارداد، توسعه دهندگان چندین روش عمومی برای حراجی یک گربه یا خدمات siring تنظیم می کنند. حراجی اصلی به دو قرارداد تقسیم می شود:
- setSaleAuctionAddress
- setSiringAuctionAddress
این تابع فقط توسط مدیر فراخوانی می شود. دلیل اینکه چرا توسعه دهندگان دو قرارداد تشیل می دهند این است که:
منطق آنها اندکی پیچیده است و همواره ریسک باگ های کوچک وجود دارد. با نگه داشتن آن در قراردادهای خود، می توانیم آنها را بدون آسیب به قرارداد اصلی که مالکیت کیتی را دنبال می کند آپگرید کنیم.
استخراج کریپتوکیتیز:
به یاد داشته باشید همانطور که قبلاً گفتیم مدیر ارشد عملیاتی می تواند گربه ها را گسترش داده و گربه های ژن صفر ایجاد کند.
این قراردادی است که آنها را قادر می سازد این کار را انجام دهند.
در تولید گربه و گربه ژن صفر محدودیت وجود دارد. این محدودیت قبلاً در کد موجود است:
- uint256 public constant PROMO_CREATION_LIMIT = 5000;
- uint256 public constant GEN0_CREATION_LIMIT = 45000;
اجازه دهید نگاهی به این قرارداد بیاندازیم:
function createPromoKitty(uint256 _genes, address _owner) external onlyCOO { address kittyOwner = _owner; if (kittyOwner == address(۰)) { kittyOwner = cooAddress; } require(promoCreatedCount < PROMO_CREATION_LIMIT); promoCreatedCount++; _createKitty(۰, ۰, ۰, _genes, kittyOwner); } function createGen0Auction(uint256 _genes) external onlyCOO { require(gen0CreatedCount < GEN0_CREATION_LIMIT); uint256 kittyId = _createKitty(۰, ۰, ۰, _genes, address(this)); _approve(kittyId, saleAuction); saleAuction.createAuction( kittyId, _computeNextGen0Price(), ۰, GEN0_AUCTION_DURATION, address(this) ); gen0CreatedCount++; }
اجازه دهید تابع createPromoKitty() را بررسی کنیم. با بررسی دقیق تر مواردی مشخص می شود:
- مدیر عملیاتی ارشد هر میزان پرومو کیتی با ژن های دلخواه تولید کند.
- مدیر عملیاتی ارشد کیتی پرومو را برای هر شخصی که بخواهند ارسال می کند.
در بررسی تابع createGen0Auction، موارد زیر واضح است:
- مدیر عملیاتی ارشد قدرت کامل در کیتی ژن صفر دارد.
- اگرچه، پس از تولید کیتی، به طور مستقیم وارد حراجی می شود.
کریپتوکیتی کور:
این قرارداد اصلی است که در بلاک چین اتریوم اجرا می شود و تمام توابع قراردادهای گذشته را دارد. همچنین، متد خاص خود را تعریف می کند:
function getKitty(uint256 _id) external view returns ( bool isGestating, bool isReady, uint256 cooldownIndex, uint256 nextActionAt, uint256 siringWithId, uint256 birthTime, uint256 matronId, uint256 sireId, uint256 generation, uint256 genes ) { Kitty storage kit = kitties[_id]; isGestating = (kit.siringWithId != 0); isReady = (kit.cooldownEndBlock <= block.number); cooldownIndex = uint256(kit.cooldownIndex); nextActionAt = uint256(kit.cooldownEndBlock); siringWithId = uint256(kit.siringWithId); birthTime = uint256(kit.birthTime); matronId = uint256(kit.matronId); sireId = uint256(kit.sireId); generation = uint256(kit.generation); genes = kit.genes; }
این تابع اساساً تمام خصوصیات یک کیتی مشخص را از بلاک چین بازمی گرداند.
بنابراین، حال که می دانیم پشت پرده چه می گذرد، اجازه دهید به بررسی رابط کاربری بپردازیم.
نحوه خرید کریپتوکیتیز
قبل از شروع نیاز به سه چیز دارید:
- مرورگر کروم یا فایرفاکس
- کیف پول متامسک
- اتر داخل کیف پول متامسک
پیشنهاد مطالعه: آموزش کامل کیف پول متامسک MetaMask + ویدیو
این درواقع تمام چیزی است که به آن نیاز دارید. پس از فرآهم کردن این موارد، خرید کیتی ها ساده است.
پس از آن چیزی شبیه به زیر خواهید دید:
- پس از آن، خرید کیتی ساده است.
فرض کنید هیچ کدام از کیتی هایی را که می بینید را دوست نداشته باشید، سپس می توانید براحتی بدنیال کیتی ژن صفر بگردید. این کیتی ها در قسمت تب ژن صفر قرار دارند.
حال که دانستید چطور کیتی بخرید، اجازه دهید به فرزندآوری کیتی بپردازیم.
- وارد تب siring شوید
- پس از آن، تمام کیتی هایی را که داوطلب siring هستند را می بینید.
- پس از آن براحتی می توانید یکی از آنها را انتخاب کنید.
مصرف گس کریپتوکیتی ها:
حال با یکی از بحث های مهم در مورد کریپتوکیتی ها آشنا می شویم و در مورد میزان گسی که مصرف می شود و روشی که منجر به سد شدن اتریوم شد خواهیم دانست.
پیشنهاد مطالعه: هزینه گس اتریوم: یک توضیح ساده
در حال حاضر، سومین مصرف کننده گس در اتریوم است.
محبوبیت کیتی سؤالات مهمی از بلاک چین اتریوم می پرسد. بدلیل افزایش تقاضا برای کیتی ها، تعداد معاملات تأیید نشده به طور نمایی افزایش یافت.
به همین دلیل، Axiom یا همان شرکت پشت کریپتوکیتی ها مجبور شد هزینه تولیدکیتی ها را افزایش دهد.
همه ما درس بزرگی از این ماجرا گرفتیم. درحالیکه، اتریوم نقش مهمی در آینده نامتمرکز دارد، ولی ابزار کافی برای رفع تقاضاها را ندارد و باید در این زمینه بیشتر کار شود.
چرخه اقتصادی cryptokitties
Jaz Liu مقاله جالبی در این مورد دارد. چگونه یک بازی خاص به محبوبیت رسیده است؟ می توان گفت محبوبیت آن براساس مفهوم متفاوت بودن کار می کند.
کاربران بدنبال جمع کردن نژادهای کمیاب هستند. اما، این سؤال مطرح می شود، چه کسی تصمیم می گیرد کدام نژاد کمیاب و مطلوب باشد؟
این همان چیزی است که Arthur Camara، یک مهندس نرم افزار در تیم کریپتوکیتی ها در ونکوور در آن مورد گفت:
ما نگفتیم کریپتوکیتی ۱ تا ۱۰۰ نادر هستند. این موضوع به کاربران بازمی گردد. مثلاً اگر تعداد کیتی های چشم سبز زیاد شود دیگر این نوع کیتی نادر تلقی نمی شود. کاربران خودشان این موضوع را کنترل می کنند.
با در نظر داشتن آن، اجازه دهید ببینیم چطور اقتصاد کریپتوکیتی ها در یک چرخه اقتصادی معمولی خواهد بود.
گام اول: رشد
متوسط هزینه شروع کیتی ۴ دلار بود، در طول یک هفته به ۸ دلار رسید.
گام دوم: قله
این گام از اقتصاد در مرحله ای است که تقاضا نسبت به انتظارات افزایش یافت و DAPP بشدت محبوب شد. تقاضا به حدی بود که بلاک چین اتریوم را مسدود کرد.
گام سوم: رکود
پس از رشد شدید مرحله رکود پیش آمد. همانطور که می بینید، تعداد کیتی های خریداری شده بشدت کاهش یافته است.
گام چهارم: افسردگی
آیا کیتی ها به پایین ترین نقطه سقوط خواهند کرد. با توجه به محبوبیت نمی توان به طور قطع پاسخی فرآهم کرد.
پیشنهاد مطالعه: کریپتو پانک چیست؟ (Cryptopunks)
نتیجهگیری
بدون شک کریپتوکیتیز طوفانی به پا کردند. چیزی که واضح است این است که اولین کاربرد محبوب بلاک چین را در صنعت سرگرمی دیدیم. بیش از ایجاد کاربردهای مطلوب، این مورد ممکن است بسیار توسعه یابد.
اگرچه، این تنها درس برای ما نیست. همه ما می دانیم که مقیاس پذیری یک نیاز ضروری است. اگر اتریوم بتواند این مشکل را در آینده رفع کند، DAPPها می توانند رشد داشته باشند و بخش مهمی از زندگی افراد شوند.