پروژه سالیدیتی برای مبتدیان

اکنون که آموزش سالیدیتی را به پایان رسانده‌اید، احتمالاً به‌دنبال یک پروژه سالیدیتی برای مبتدیان هستید تا مهارت‌های خود را در عمل محک بزنید. قدم بعدی چیست؟

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

شما تمام مقدمات لازم را دارید؛ اگر واقعاً قصد دارید به یک مهندس سالیدیتی تبدیل شوید، وقت آن است که آستین بالا بزنید!

پروژه‌ها به‌طور تقریبی از آسان به سخت مرتب شده‌اند، اما شما از نظر دانش لازم، آمادگی انجام همه آن‌ها را دارید:

۱. خرید NFT با توکن های ERC20

یک قرارداد NFT طراحی کنید که تنها با پرداخت یک توکن خاص از نوع ERC20 قابل مینت (mint) باشد.

۲. قرارداد آزادسازی تدریجی توکن (Vesting)

در این پروژه، پرداخت‌کننده مقدار مشخصی توکن را در یک قرارداد سپرده‌گذاری می‌کند، اما گیرنده تنها می‌تواند در طول یک بازه زمانی n روزه، روزانه 1/n از توکن‌ها را برداشت کند.

۳. قرارداد مبادله NFT (NFT Swap Contract)

دو کاربر می‌خواهند NFTهای خود را به‌صورت غیرمتمرکز و بدون نیاز به اعتماد (trustless) با یکدیگر مبادله کنند. یک نفر در قرارداد یک معامله تعریف می‌کند؛ این معامله شامل ترکیبی از آدرس و شناسه توکن است، که آدرس مربوط به قرارداد NFT و شناسه، شناسه توکن (tokenId) آن است. کاربر اول تنها در صورتی می‌تواند NFT خود را واریز کند که با مشخصات تعریف‌شده مطابقت داشته باشد. طرف مقابل نیز باید NFT خود را دقیقاً مطابق با آدرس و شناسه تعریف‌شده ارائه دهد.

پس از اینکه هر دو طرف NFT خود را واریز کردند، هر یک از آن‌ها می‌تواند تابع swap را فراخوانی کرده و مبادله را نهایی کند.

نکاتی برای بررسی:

  • آیا باید کاربران را مجبور کرد NFT خود را برای مدتی مشخص در قرارداد نگه دارند؟

  • در صورت انصراف یکی از طرفین، چه اتفاقی بیفتد؟

۴. قرارداد تأمین مالی جمعی با ERC20 (Crowdfunding)

قراردادی بسازید که دارای تابع createFundraiser() باشد و هدف (goal) و مهلت (deadline) کمپین به‌عنوان ورودی دریافت کند. اهداکنندگان می‌توانند از طریق تابع donate() به کمپین موردنظر (براساس fundraiserId) کمک کنند. اگر پیش از رسیدن مهلت، هدف تأمین مالی حاصل شود، سازنده کمپین (کسی که createFundraiser() را فراخوانی کرده) می‌تواند کل وجوه جمع‌آوری‌شده را برداشت (withdraw()) کند. اما اگر زمان به پایان برسد و هدف محقق نشود، اهداکنندگان می‌توانند کمک‌های خود را پس بگیرند.

این پروژه را یک‌بار برای پرداخت با اتر و یک‌بار با توکن‌های ERC20 پیاده‌سازی کنید.

نکاتی برای بررسی:

  • اگر یک آدرس چند بار به یک کمپین کمک مالی کند، چه اتفاقی می‌افتد؟

  • اگر یک آدرس به چند کمپین مختلف کمک کند، چگونه مدیریت شود؟

۵. قرارداد حراج به سبک انگلیسی (English Auction Contract)

در این مدل از حراجی، فروشنده با فراخوانی تابع deposit() یک NFT را به همراه مهلت زمانی (deadline) و قیمت پایه (reserve price) در قرارداد سپرده‌گذاری می‌کند. خریداران می‌توانند تا پیش از پایان مهلت، پیشنهاد قیمتی ثبت کنند و در نهایت بالاترین پیشنهاد برنده می‌شود. اگر قیمت پایه برآورده نشود، NFT فروخته نخواهد شد. این قرارداد باید از چندین حراج هم‌زمان پشتیبانی کند.
خریدارانی که برنده نشده‌اند، می‌توانند پیشنهاد خود را برداشت کنند، اما برنده موظف به تکمیل معامله است و اجازه برداشت پیشنهاد را ندارد. فروشنده می‌تواند پس از پایان مهلت و تنها در صورتی که قیمت پایه برآورده شده باشد، با استفاده از تابع sellerEndAuction() حراج را خاتمه دهد. پس از آن، NFT به خریدار و اتر به فروشنده منتقل می‌شود.

۶. بازارچه ساده برای NFT

در این قرارداد، فروشنده می‌تواند با مشخص کردن قیمت و زمان انقضا، NFT خود را برای فروش قرار دهد. برخلاف حالت‌های دیگر، در اینجا فروشنده مستقیماً NFT را به قرارداد منتقل نمی‌کند؛ بلکه فقط اجازه (approval) برداشت آن را به قرارداد می‌دهد.
اگر خریداری پیش از انقضا قیمت تعیین‌شده را پرداخت کند، قرارداد به‌صورت خودکار NFT را از فروشنده گرفته و به خریدار منتقل می‌کند، و مبلغ اتر را به فروشنده می‌دهد.
فروشنده هر زمان که بخواهد می‌تواند فروش را با فراخوانی cancel() لغو کند.

نکته مهم:
اگر فروشنده به‌اشتباه همان NFT را بیش از یک بار برای فروش فهرست کند چه می‌شود؟ از آن‌جا که دارایی به‌طور مستقیم به قرارداد منتقل نمی‌شود، این سناریو قابل وقوع است و باید به‌درستی مدیریت شود.

۷. قرارداد Stake جمعی (Stake Together)

در این قرارداد، یک میلیون توکن فرضی به نام Cloud Coin در مالکیت قرارداد قرار دارد. کاربران می‌توانند از تاریخ مشخصی (beginDate) توکن‌های خود را در قرارداد قفل کنند. اگر این توکن‌ها به مدت ۷ روز در قرارداد باقی بمانند، کاربر پاداشی متناسب با سهمش از کل سرمایه‌گذاری دریافت خواهد کرد.
برای مثال، اگر آلیس ۵۰۰۰ توکن سرمایه‌گذاری کرده باشد و کل سرمایه‌گذاری‌ها در پایان ۲۵۰۰۰ توکن باشد، آلیس مستحق دریافت ۲۰٪ از پاداش کل، یعنی ۲۰۰٬۰۰۰ توکن است.

⚠️ هشدار:
محاسبه پاداش‌ها اگر به‌درستی انجام نشود، می‌تواند امکان سوءاستفاده را برای افراد مخرب فراهم کند. حتماً موارد خاص را با دقت بررسی کنید.

۸. قرعه‌کشی ساده (Simple Lottery)

هر کاربر می‌تواند با فراخوانی createLottery یک قرعه‌کشی جدید راه‌اندازی کند که تا ۲۴ ساعت امکان خرید بلیط دارد. پس از اتمام این بازه، یک ساعت وقفه تعیین می‌شود و سپس برنده مشخص خواهد شد.
تولید اعداد تصادفی در اتریوم پیچیده است، اما در این پروژه می‌توانید از blockhash یکی از بلاک‌های آینده استفاده کنید، چراکه قابل پیش‌بینی نیست.
پس از راه‌اندازی قرعه‌کشی، کاربران می‌توانند با purchaseTicket برای یک شناسه قرعه‌کشی خاص بلیط بخرند. هر قرعه‌کشی باید شامل یک مهلت برای خرید بلیط و سپس زمانی برای تعیین برنده با استفاده از blockhash باشد.
برنده باید جایزه خود را ظرف ۲۵۶ بلاک دریافت کند؛ در غیر این صورت، همه می‌توانند بلیط‌های خود را پس بگیرند.

۹. بینگو با استاندارد ERC1155

از توکن‌های چندگانه ERC1155 برای شبیه‌سازی یک دسته کارت با اعداد ۱ تا ۲۵ استفاده کنید. هر بازیکن با یک آرایه دوبعدی ۵×۵ از اعداد تصادفی شروع می‌کند. هر n بلاک یک کارت جدید با عدد تصادفی صادر می‌شود (mint). هر بازیکنی که اولین نفر پنج عدد متوالی در یک ردیف، ستون یا قطر داشته باشد، برنده اعلام می‌شود.

۱۰. بازی بلک‌جک روی بلاک‌چین (On-chain Blackjack)

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

برای شبیه‌سازی بازی، می‌توانید از تولید عدد تصادفی در بازه ۲ تا ۱۰ استفاده کنید و کارت‌هایی مانند ۱۰، شاه (K)، بی‌بی (Q) و سرباز (J) را همگی معادل ۱۰ در نظر بگیرید. کارت آس (A) می‌تواند بسته به وضعیت بازی، ارزش ۱ یا ۱۱ داشته باشد.

قانون دیلر (Dealer) به این صورت است که باید تا زمانی که مجموع امتیاز کارت‌هایش به حداقل ۲۱ برسد، به گرفتن کارت ادامه دهد.

از آنجا که قراردادهای هوشمند نمی‌توانند به‌طور خودکار به مرحله بعدی بازی بروند، باید امکانی وجود داشته باشد تا هر کاربر بتواند با فراخوانی تابعی مثل dealerNextMove() باعث پیشرفت بازی شود، به‌خصوص وقتی نوبت دیلر است.

برای جلوگیری از توقف بازی، پیشنهاد می‌شود که بازیکنان موظف باشند نوبت خود را ظرف حداکثر ۱۰ بلاک انجام دهند. در غیر این صورت ممکن است بازی معلق بماند و دیگران نتوانند ادامه دهند.

تمرین، کلید مهارت است

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

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

کیفیت را فراموش نکنید: تست و بررسی مصرف گس

ما در بخش‌های قبلی، نحوه نوشتن تست برای قراردادهای سالیدیتی با استفاده از فریم‌ورک Foundry را آموزش داده‌ایم. حتی اگر پروژه شما صرفاً آموزشی باشد، باز هم نوشتن تست بسیار ضروری است—به‌خصوص اگر قرارداد شما با دارایی دیگران سروکار دارد.

به کد خود با ذهنیت یک مهاجم نگاه کنید. اگر کسی قصد داشته باشد از قرارداد شما سوءاستفاده کند، چه ورودی‌هایی ممکن است وارد کند؟
همچنین، حتماً هزینه اجرای هر بخش از قرارداد (یعنی مصرف گس) را بررسی کنید. Foundry این اطلاعات را در اختیار شما قرار می‌دهد. برای تبدیل میزان گس به مبلغ دلاری، می‌توانید از ماشین‌حساب گس ما استفاده کنید و مقاله آموزشی مربوط به آن را نیز مطالعه کنید.

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

اگر به دنبال پیشرفت بیشتر هستید…

برای پروژه‌های خود یک رابط کاربری ساده طراحی کنید تا دیگران بتوانند راحت‌تر با قراردادهای شما تعامل داشته باشند. برای این کار می‌توانید از کتابخانه جاوااسکریپتی wagmi.js استفاده کنید که کار با قراردادهای هوشمند را بسیار ساده‌تر می‌کند.

5/5 - (1 امتیاز)

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

پکیج آموزش پروژه محور لاراول و طراحی وب سایت کانون قلم چی
  • انتشار: ۲۳ اردیبهشت ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

بازخوردهای خود را برای ما ارسال کنید