COMPΞZ 🧬
خب زمان این رسده که کدهای قرارداد، بخش ایردراپ رو آزمایش کنیم... 👀 همه چیز باید درست کار کنه! مراحل استقرار، تخصیص توکن و الآن آزمایش منطق ایردراپ...
خب اولین تیپ آزمایشی به دو آدرس کیف پول هم موفق بود!
حدود ۴۰ هزار توکن تخصیص یافت. ✅
بریم مراحل بعدی ببینیم چه خبره! چرا باید همش تست کنم؟ چون بعد از اینکه قرارداد رو نهایی کنم، دیگه به هیچ عنوان نمیشه اصلاحش کرد! این مراحل به شدت حساس و مهم هستن.
کوچیکترین خطا باعث میشه کل پروژه رو هوا باشه، و چنین چیزی آبرو ریزی میشه! 😂 چون حتی بخوای هم نمیتونی اصلاحش کنی. پس باید دقت ۱۰۰٪ باشه.
حدود ۴۰ هزار توکن تخصیص یافت. ✅
بریم مراحل بعدی ببینیم چه خبره! چرا باید همش تست کنم؟ چون بعد از اینکه قرارداد رو نهایی کنم، دیگه به هیچ عنوان نمیشه اصلاحش کرد! این مراحل به شدت حساس و مهم هستن.
کوچیکترین خطا باعث میشه کل پروژه رو هوا باشه، و چنین چیزی آبرو ریزی میشه! 😂 چون حتی بخوای هم نمیتونی اصلاحش کنی. پس باید دقت ۱۰۰٪ باشه.
👍2
COMPΞZ 🧬
خب اولین تیپ آزمایشی به دو آدرس کیف پول هم موفق بود! حدود ۴۰ هزار توکن تخصیص یافت. ✅ بریم مراحل بعدی ببینیم چه خبره! چرا باید همش تست کنم؟ چون بعد از اینکه قرارداد رو نهایی کنم، دیگه به هیچ عنوان نمیشه اصلاحش کرد! این مراحل به شدت حساس و مهم هستن. کوچیکترین…
خب عمل Claim هم درست کار میکنه! خطا داده! چرا؟ چون همین چند دقیقه پیش تاریخ شروع ایردراپ بود! و تا ۳۰ روز دیگه کاربر نمیتونه کلیمش کنه! برای همین چنین خطایی داد.
پس درسته! ✅🔥 باید یه تستی بزنم که کلیم نهایی رو هم آزمایش کنیم و از مقدار کل اختصاص یافته کم بشه تا مطمئن بشیم برداشت درست بوده.
پس درسته! ✅🔥 باید یه تستی بزنم که کلیم نهایی رو هم آزمایش کنیم و از مقدار کل اختصاص یافته کم بشه تا مطمئن بشیم برداشت درست بوده.
👍4
COMPΞZ 🧬
خب عمل Claim هم درست کار میکنه! خطا داده! چرا؟ چون همین چند دقیقه پیش تاریخ شروع ایردراپ بود! و تا ۳۰ روز دیگه کاربر نمیتونه کلیمش کنه! برای همین چنین خطایی داد. پس درسته! ✅🔥 باید یه تستی بزنم که کلیم نهایی رو هم آزمایش کنیم و از مقدار کل اختصاص یافته کم…
آهان یه تابعی باید بنویسم که اگه به هر نحوی مشکلی پیش اومد، بتونیم تاریخ کلیم رو کمی عقب بندازیم! این خیلی مهمه چون ممکنه به هر نحوی نیاز باشه برای ارزیابی بیشتر! اما تا بتونم سعی میکنم مشکلاتی که تو ساختار کلیم دیجن و ریر وجود داشت اینجا دیگه معنا نداشته باشه!
یه تابع مهم دیگه در نظر گرفتم با عنوان Pause که به هر نحوی عمل ایردراپ بتونه به صورت سریعی متوقف بشه! چنین چیزی من روی هیچ سیستمی ندیده بودم، داشته باشیم خوبه میتونه در بررسی مسائل کمک کنه! مثلاً توی ریر ما شاهد این بودیم کاربران نمیدونستن حالا که مشکلی وجود داره باید تیپ بدن یا ندن؟! خب این تابع باید توقف ایجاد کنه و تکلیف با همه مشخص باشه.
همه چیز ممکنه! 👊🏼
یه تابع مهم دیگه در نظر گرفتم با عنوان Pause که به هر نحوی عمل ایردراپ بتونه به صورت سریعی متوقف بشه! چنین چیزی من روی هیچ سیستمی ندیده بودم، داشته باشیم خوبه میتونه در بررسی مسائل کمک کنه! مثلاً توی ریر ما شاهد این بودیم کاربران نمیدونستن حالا که مشکلی وجود داره باید تیپ بدن یا ندن؟! خب این تابع باید توقف ایجاد کنه و تکلیف با همه مشخص باشه.
همه چیز ممکنه! 👊🏼
👍2
COMPΞZ 🧬
آهان یه تابعی باید بنویسم که اگه به هر نحوی مشکلی پیش اومد، بتونیم تاریخ کلیم رو کمی عقب بندازیم! این خیلی مهمه چون ممکنه به هر نحوی نیاز باشه برای ارزیابی بیشتر! اما تا بتونم سعی میکنم مشکلاتی که تو ساختار کلیم دیجن و ریر وجود داشت اینجا دیگه معنا نداشته…
خب اینم درست شد! دقیقاً بعد بعد از Pause زدن روی کل قرارداد، هیچ بنی بشری نمیتونه کلیم کنه! تا مشکل حل و بررسی بشه. این کار اگه شکل نگیره میشه مثل داستان این که خوردن بردن عین خیالشون هم نشد! 😂
کاربر که براش مهم نیست چی پیش میاد حق کی پایمال میشه، هرکس به دنبال کلیم خودشه! این ما هستیم که باید مطمئن بشیم هرکسی به حق خودش میرسه.
پس تابع pause هم به عنوان یک عمل توقف برای حل مسائل درست شد. ✅
کاربر که براش مهم نیست چی پیش میاد حق کی پایمال میشه، هرکس به دنبال کلیم خودشه! این ما هستیم که باید مطمئن بشیم هرکسی به حق خودش میرسه.
پس تابع pause هم به عنوان یک عمل توقف برای حل مسائل درست شد. ✅
👏4
COMPΞZ 🧬
Photo
من توی حالت عادی ساخت نرمافزار و برنامهنویسی، معمولاً تست و خطاهارو بارها انجام میدم و شاید بارها کامپایل کنم و دیباگ کنم و بعد بهروز رسانی بدم با نسخهٔ جدید.
مثلاُ بگیم نسخهٔ Alpha یا نمیدونم Beta یا Release 1.0 و بعد اینو بهترش کنیم!
اما روی بلاکچین یک تفاوت اساسی هست! وقتی نسخهای منتشر یا Release بشه، دیگه هیچ فرصتی برای کامپایل مجدد نیست! هیچ نسخهنگاری جدیدی وجود نداره و کل قرارداد باید هزاران بار از هر بعد و شکلی آزمایش بشه.
برای همینه که میگن بلاکچین واقعاً قابل تحریف نیست. چون منتشر که شد دیگه تمومه حتی منم نمیتونم کاری کنم! پس تا میشه باید همه چیزو در نظر گرفت.
مثلاُ بگیم نسخهٔ Alpha یا نمیدونم Beta یا Release 1.0 و بعد اینو بهترش کنیم!
اما روی بلاکچین یک تفاوت اساسی هست! وقتی نسخهای منتشر یا Release بشه، دیگه هیچ فرصتی برای کامپایل مجدد نیست! هیچ نسخهنگاری جدیدی وجود نداره و کل قرارداد باید هزاران بار از هر بعد و شکلی آزمایش بشه.
برای همینه که میگن بلاکچین واقعاً قابل تحریف نیست. چون منتشر که شد دیگه تمومه حتی منم نمیتونم کاری کنم! پس تا میشه باید همه چیزو در نظر گرفت.
👍3
COMPΞZ 🧬
من توی حالت عادی ساخت نرمافزار و برنامهنویسی، معمولاً تست و خطاهارو بارها انجام میدم و شاید بارها کامپایل کنم و دیباگ کنم و بعد بهروز رسانی بدم با نسخهٔ جدید. مثلاُ بگیم نسخهٔ Alpha یا نمیدونم Beta یا Release 1.0 و بعد اینو بهترش کنیم! اما روی بلاکچین…
البته!!! این باز بر میگرده به معماریای که تو خلاقیت به خرج میدی.
مثلاً من نمیام سیستم ایردراپ رو بذارم روی قرارداد اصلی! اون رو در قالب یک Helper Contract مینویسم! که اگه احیاناً لازم به اصلاح بود، دیگه متکی به قرارداد اصلی نباشه و راحت بشه یه قرارداد دیگه ساخت و اصلاحش کرد و سپس بر مبنای قرارداد اصلی توکنها رو مدیریت کرد.
راه حل از خلاقیت میاد، همه چیز بستگی به ساختار و معماری داره؛ دقیقاً مثل این باشه که سیستم رو توی قرارداد ماژولار طراحی کنی. 🔥👊🏼😎
مثلاً من نمیام سیستم ایردراپ رو بذارم روی قرارداد اصلی! اون رو در قالب یک Helper Contract مینویسم! که اگه احیاناً لازم به اصلاح بود، دیگه متکی به قرارداد اصلی نباشه و راحت بشه یه قرارداد دیگه ساخت و اصلاحش کرد و سپس بر مبنای قرارداد اصلی توکنها رو مدیریت کرد.
راه حل از خلاقیت میاد، همه چیز بستگی به ساختار و معماری داره؛ دقیقاً مثل این باشه که سیستم رو توی قرارداد ماژولار طراحی کنی. 🔥👊🏼😎
👏1
COMPΞZ 🧬
البته!!! این باز بر میگرده به معماریای که تو خلاقیت به خرج میدی. مثلاً من نمیام سیستم ایردراپ رو بذارم روی قرارداد اصلی! اون رو در قالب یک Helper Contract مینویسم! که اگه احیاناً لازم به اصلاح بود، دیگه متکی به قرارداد اصلی نباشه و راحت بشه یه قرارداد دیگه…
قرارداد اصلی معمولاً بهتره این شکلی باشه.
- اطلاعات اصلی توکن
- میزان توکن و میزان اختصاص یافتهها
- مدیریت کل قرارداد
خارج از این هر خدماتی بدی، ایردراپ میدم، نمیدونم تیم گسترش میدم، نمیدونم DAO رو مدیریت میکنم همش باید بره روی قراردادهای نوع دوم (Secondary Contract) یا همون Helpers.
- اطلاعات اصلی توکن
- میزان توکن و میزان اختصاص یافتهها
- مدیریت کل قرارداد
خارج از این هر خدماتی بدی، ایردراپ میدم، نمیدونم تیم گسترش میدم، نمیدونم DAO رو مدیریت میکنم همش باید بره روی قراردادهای نوع دوم (Secondary Contract) یا همون Helpers.
COMPΞZ 🧬
قرارداد اصلی معمولاً بهتره این شکلی باشه. - اطلاعات اصلی توکن - میزان توکن و میزان اختصاص یافتهها - مدیریت کل قرارداد خارج از این هر خدماتی بدی، ایردراپ میدم، نمیدونم تیم گسترش میدم، نمیدونم DAO رو مدیریت میکنم همش باید بره روی قراردادهای نوع دوم (Secondary…
اینم بد نیست بدونید، سازنده، یعنی من یا فاندر؛ برای هر عملی که روی قرارداد انجام میدیم هزینهٔ تراکنش میپردازیم! حالا روی بیس باشه وضعیتش بهتره ولی در کل هر اقدامی کنیم هزینه داره.
🚨 مایکروسافت هشدار داد: تهدید امنیتی جدیدی به نام StilachiRAT شناسایی شده است
مایکروسافت اعلام کرده که بدافزار جدیدی به نام StilachiRAT شناسایی شده که بهصورت خاص بیش از ۲۰ کیفپول رمزارزی را هدف قرار میدهد. این بدافزار از طریق افزونههای مرورگر گوگل کروم در کامپیوترهای شخصی (PC) منتشر میشود.
🕵️♂️این StilachiRAT چهکاری انجام میدهد؟
این بدافزار میتواند:
- کلیدهای خصوصی (Private Keys) و اطلاعات حسابها را سرقت کند
- محتوای کلیپبورد (Clipboard) شما را زیر نظر بگیرد
- دادههای ذخیرهشده در مرورگر مانند رمزها و سشنها را استخراج کند
🔍 هنوز این تهدید گسترده نشده، اما برای پیشگیری باید اقدامات جدی انجام داد.
✅ چطور از خودتان محافظت کنید:
🙅♂️ هرگز کلیدهای خصوصیتان را Copy/Paste نکنید
کپی کردن کلیدهای خصوصی در کلیپبورد یعنی باز کردن در برای هکرها.
🙅♂️ روی لینکهای ناشناس کلیک نکنید و نرمافزارهای غیرقابلاعتماد نصب نکنید
هر فایل یا افزونهای ممکن است یک تروجان باشد که بدون اطلاع شما شروع به سرقت اطلاعات میکند.
🙅♂️ به پیامهای مشکوک یا درخواستهای عجیب حساس باشید
اگر مرورگر یا سیستم ناگهان پنجرهای باز کرد یا درخواست دسترسی خاصی داد، با دقت بررسی کنید.
🛡 روشهای افزایش امنیت:
- 🔒 سیستمعامل و مرورگر خود را همیشه بهروز نگه دارید.
- 🔒 بهجای ذخیره دستی رمزها، از نرمافزارهای مدیریت رمز مثل 1Password استفاده کنید.
- 🔒 از کیفپول سختافزاری (Hardware Wallet) برای امنیت بیشتر استفاده کنید.
- 🔒برنامهٔ Microsoft Defender را بهروز نگه دارید و اگر امکانش هست، از یک آنتیویروس قوی هم استفاده کنید.
https://warpcast.com/compez.eth/0xa53f79a8
https://x.com/phantom/status/1902144741929840768
مایکروسافت اعلام کرده که بدافزار جدیدی به نام StilachiRAT شناسایی شده که بهصورت خاص بیش از ۲۰ کیفپول رمزارزی را هدف قرار میدهد. این بدافزار از طریق افزونههای مرورگر گوگل کروم در کامپیوترهای شخصی (PC) منتشر میشود.
🕵️♂️این StilachiRAT چهکاری انجام میدهد؟
این بدافزار میتواند:
- کلیدهای خصوصی (Private Keys) و اطلاعات حسابها را سرقت کند
- محتوای کلیپبورد (Clipboard) شما را زیر نظر بگیرد
- دادههای ذخیرهشده در مرورگر مانند رمزها و سشنها را استخراج کند
🔍 هنوز این تهدید گسترده نشده، اما برای پیشگیری باید اقدامات جدی انجام داد.
✅ چطور از خودتان محافظت کنید:
🙅♂️ هرگز کلیدهای خصوصیتان را Copy/Paste نکنید
کپی کردن کلیدهای خصوصی در کلیپبورد یعنی باز کردن در برای هکرها.
🙅♂️ روی لینکهای ناشناس کلیک نکنید و نرمافزارهای غیرقابلاعتماد نصب نکنید
هر فایل یا افزونهای ممکن است یک تروجان باشد که بدون اطلاع شما شروع به سرقت اطلاعات میکند.
🙅♂️ به پیامهای مشکوک یا درخواستهای عجیب حساس باشید
اگر مرورگر یا سیستم ناگهان پنجرهای باز کرد یا درخواست دسترسی خاصی داد، با دقت بررسی کنید.
🛡 روشهای افزایش امنیت:
- 🔒 سیستمعامل و مرورگر خود را همیشه بهروز نگه دارید.
- 🔒 بهجای ذخیره دستی رمزها، از نرمافزارهای مدیریت رمز مثل 1Password استفاده کنید.
- 🔒 از کیفپول سختافزاری (Hardware Wallet) برای امنیت بیشتر استفاده کنید.
- 🔒برنامهٔ Microsoft Defender را بهروز نگه دارید و اگر امکانش هست، از یک آنتیویروس قوی هم استفاده کنید.
https://warpcast.com/compez.eth/0xa53f79a8
https://x.com/phantom/status/1902144741929840768
Warpcast
C O M P Ξ Z on Warpcast
https://x.com/phantom/status/1902144741929840768
COMPΞZ 🧬
🚨 مایکروسافت هشدار داد: تهدید امنیتی جدیدی به نام StilachiRAT شناسایی شده است مایکروسافت اعلام کرده که بدافزار جدیدی به نام StilachiRAT شناسایی شده که بهصورت خاص بیش از ۲۰ کیفپول رمزارزی را هدف قرار میدهد. این بدافزار از طریق افزونههای مرورگر گوگل کروم…
روش سادش چیه؟ یه macOS بگیر یا با لینوکس کار کن لازم نیست اینهمه دردسر بکشی.😁 حالا من به عنوان متخصص هیچ تعصبی روی هیچ سیستمعاملی ندارم اما خب مک یه چیز دیگست. 😉
🔥1🤬1
هر دو کتاب مقدماتی و پیشرفتهٔ برنامهنویسی Qt رو امسال هم با کد تخقیف Nowruz صد در صد رایگان میکنم.
کتاب آموزش پیشرفته ++C همراه Qt (پیشرفته) ۱.۳.۸
کتاب آموزش مقدماتی ++C همراه Qt (مقدماتی) ۵.۰
قسمت خرید بخش کوپن رو پر کنید، نباید ازتون پرداخت بخواد، اگر مشکلی هم بود زیر همین پست بهم اطلاع بدین.
این کوپن تا ۱۲ روز دیگه یعنی تولدم اعتبار خواهد داشت.
شاد باشید. :) 👊🏼🤚🏼
کتاب آموزش پیشرفته ++C همراه Qt (پیشرفته) ۱.۳.۸
کتاب آموزش مقدماتی ++C همراه Qt (مقدماتی) ۵.۰
قسمت خرید بخش کوپن رو پر کنید، نباید ازتون پرداخت بخواد، اگر مشکلی هم بود زیر همین پست بهم اطلاع بدین.
این کوپن تا ۱۲ روز دیگه یعنی تولدم اعتبار خواهد داشت.
شاد باشید. :) 👊🏼🤚🏼
مرجع رسمی سیپلاسپلاس ایران
کتاب آموزش پیشرفته ++C همراه Qt (پیشرفته) - کتابها و مقالات - مرجع رسمی سیپلاسپلاس ایران
دنیای خود را چگونه با کیوت بسازیم!؟ با توجه به توسعهٔ روزافزون فناوری، دنیای نرمافزاری همگام با آن با سرعت بسیار زیادی در حال پیشرفت و توسعه است. ما برای رسیدن به این مسیر باید به فکر تولید و توسعهٔ محصول با کیفیت همراه با اقدامات کلیدی باشیم تا این محصول…
🥰5❤3⚡1
COMPΞZ 🧬
هر دو کتاب مقدماتی و پیشرفتهٔ برنامهنویسی Qt رو امسال هم با کد تخقیف Nowruz صد در صد رایگان میکنم. کتاب آموزش پیشرفته ++C همراه Qt (پیشرفته) ۱.۳.۸ کتاب آموزش مقدماتی ++C همراه Qt (مقدماتی) ۵.۰ قسمت خرید بخش کوپن رو پر کنید، نباید ازتون پرداخت بخواد، اگر…
میفرمایند که کادوی دیگهای بده چون قبلاً کتابهات رو خریدیم. 😁
خب من چیزی رو که الآن دارم و میتونم بدم😌، زیر همین پست آدرس کیفهاتون روی ERC20 اتریوم (Base) رو بذارید هر موقع توکنی بالا آوردم یه کادوی ناقابل از توکن براتون میفرستم.
خب من چیزی رو که الآن دارم و میتونم بدم😌، زیر همین پست آدرس کیفهاتون روی ERC20 اتریوم (Base) رو بذارید هر موقع توکنی بالا آوردم یه کادوی ناقابل از توکن براتون میفرستم.
❤4⚡2🎉2👏1
چرا من باید حس کنم بعضیها روشون نمیشه!؟ بابا بفرستین بیاد بعداً همچین پیشنهاداتی نمیدمها! خدارو چه دیدی شاید پروژه بیاد بترکه بعد یه چیزی هم شمارو شاد کنه. 😄 به هر حال بخشی از قرارداد رو طوری تنظیم کردم که از سهم خودم بتونم بپردازم و مشکلی نیست، پس بفرستین بیاد عیده و بهونه برای خیلی چیزها وجود داره.
کسانی که کیف پول ندارن، یه Metamask ای چیزی بسازن و همون آدرس شبکه اتریومی که بهشون میده رو بفرستند، همون کافیه؛ بعداً میگم چه باید کرد.
زیر همون پست قبلی. 👆🏼
کسانی که کیف پول ندارن، یه Metamask ای چیزی بسازن و همون آدرس شبکه اتریومی که بهشون میده رو بفرستند، همون کافیه؛ بعداً میگم چه باید کرد.
زیر همون پست قبلی. 👆🏼
❤6🔥1
ابزار std::invoke_r یک تابع جدید در کتابخانه استاندارد ۲۳ است که در سرآیند <functional> قرار میگیرند و برای فراخوانی اشیاء قابل فراخوانی (Callable objects) با پارامترهای دلخواه و بازگرداندن یک مقدار از نوع خاص استفاده میشود. این تابع جایگزینی قدرتمند و انعطافپذیر برای std::invoke است که در استاندارد ۱۷ زبان موجود بود که تابع std::invoke معمولاً برای فراخوانی یک تابع با پارامترها استفاده میشود.
هر دوی std::invoke و std::invoke_r از توابعی هستند که به ترتیب در استاندارد ۱۷ و ۲۳ برای فراخوانی اشیاء قابل فراخوانی (توابع، توابع عضو، لامبداها و ...) به صورت عمومی معرفی شدهاند. با این حال، نحوه مدیریت نوع بازگشتی آنها با هم تفاوت دارد که در آن std::invoke یک شیء قابل فراخوانی و آرگومانها را میگیرد و آن را مانند یک فراخوانی تابع معمولی اجرا میکند و نوع بازگشتی آن همان نوع بازگشتی خود شیء قابل فراخوانی است.
در حالی که تابع std::invoke_r یک ویژگی جدید در استاندارد ۲۳ است که به شما امکان میدهد نوع بازگشتی فراخوانی را به طور صریح مشخص کنید و زمانی مفید است که میخواهید نوع بازگشتی چیزی متفاوت از نوع بازگشتی اصلی شیء قابل فراخوانی باشد.
مثال:
#cpp20 #cpp23 #forward_like #forward #چالش #سیروزه #رمضان #روز_هفدهم
هر دوی std::invoke و std::invoke_r از توابعی هستند که به ترتیب در استاندارد ۱۷ و ۲۳ برای فراخوانی اشیاء قابل فراخوانی (توابع، توابع عضو، لامبداها و ...) به صورت عمومی معرفی شدهاند. با این حال، نحوه مدیریت نوع بازگشتی آنها با هم تفاوت دارد که در آن std::invoke یک شیء قابل فراخوانی و آرگومانها را میگیرد و آن را مانند یک فراخوانی تابع معمولی اجرا میکند و نوع بازگشتی آن همان نوع بازگشتی خود شیء قابل فراخوانی است.
در حالی که تابع std::invoke_r یک ویژگی جدید در استاندارد ۲۳ است که به شما امکان میدهد نوع بازگشتی فراخوانی را به طور صریح مشخص کنید و زمانی مفید است که میخواهید نوع بازگشتی چیزی متفاوت از نوع بازگشتی اصلی شیء قابل فراخوانی باشد.
مثال:
import std;
int main() {
auto f = [](int x, int y) { return x + y; };
std::println("{}", std::invoke(f, 1, 2));
std::println("{}", std::invoke_r<int>(f, 1, 2));
}
#cpp20 #cpp23 #forward_like #forward #چالش #سیروزه #رمضان #روز_هفدهم
❤1
COMPΞZ 🧬
ابزار std::invoke_r یک تابع جدید در کتابخانه استاندارد ۲۳ است که در سرآیند <functional> قرار میگیرند و برای فراخوانی اشیاء قابل فراخوانی (Callable objects) با پارامترهای دلخواه و بازگرداندن یک مقدار از نوع خاص استفاده میشود. این تابع جایگزینی قدرتمند و انعطافپذیر…
بخش تخصصی دوم (بهروز رسانی Solidity) | تبدیل صریح (Explicit Conversions)
در سالیدیتی اگر کامپایلر تبدیل ناخودآگاه را اجازه ندهد اما شما اطمینان دارید که یک تبدیل کار خواهد کرد، گاهی اوقات تبدیل نوع صریح ممکن است باشد. این ممکن است منجر به رفتارهای غیرمنتظره شود و به شما امکان می دهد تا از برخی از ویژگیهای امنیتی کامپایلر عبور کنید، بنابراین مطمئن شوید که نتیجه آن چیزی است که میخواهید و انتظار دارید!
مثال زیر را در نظر بگیرید که یک عدد منفی را به یک عدد بدون علامت تبدیل میکند:
در انتهای این قطعه کد، مقدار x برابر 0xfffff..fd (۶۴ حرف هگزادسیمال) خواهد بود، که 3- در نمایش دوتایی با 256 بیت است.
اگر یک عدد صحیح به طور صریح به یک نوع کوچکتر تبدیل شود، بیتهای سفارشی بالاتر قطع خواهند شد:
اگر یک عدد صحیح به طور صریح به یک نوع بزرگتر تبدیل شود، نتیجهٔ تبدیل برابر عدد صحیح اصلی آن خواهد بود:
در نوعهای بایت با اندازه ثابت، رفتارهای متفاوتی را در طول تبدیلات از خود نشان میدهند. میتوان آنها را به عنوان دنبالهای از بایتهای فردی در نظر گرفت و تبدیل به یک نوع کوچکتر منجر به قطع دنباله خواهد شد:
اگر یک نوع بایت با اندازه ثابت به طور صریح به یک نوع بزرگتر تبدیل شود. دسترسی به بایت در یک فهرست ثابت منجر به همان مقدار قبل و بعد از تبدیل خواهد شد:
از آنجا که اعداد صحیح و آرایههای بایت با اندازه ثابت هنگام قطع یا پر کردن رفتارهای متفاوتی دارند، تبدیلهای صریح بین اعداد صحیح و آرایههای بایت با اندازهٔ ثابت تنها در صورتی مجاز است که هر دو اندازه یکسان باشند. اگر بخواهید بین اعداد صحیح و آرایههای بایت با اندازه ثابت با اندازههای مختلف تبدیل کنید، باید از تبدیلهای میانی استفاده کنید که قوانین قطع و پر کردن موردنظر را صریحاً بیان کنند:
آرایههای بایت و برشهای دادههای بایت به طور صریح به نوع بایتهای ثابت (bytes1/…/bytes32) تبدیل میشوند. در صورتی که طول آرایه بیشتر از نوع بایتهای ثابت مقصد باشد، قطع دنبالهٔ آنها در انتها رخ میدهد. اگر طول آرایه کوچکتر از نوع مقصد باشد، در انتها با صفر پر خواهد شد.
#solidity #web3 #update #ether #اتریوم
در سالیدیتی اگر کامپایلر تبدیل ناخودآگاه را اجازه ندهد اما شما اطمینان دارید که یک تبدیل کار خواهد کرد، گاهی اوقات تبدیل نوع صریح ممکن است باشد. این ممکن است منجر به رفتارهای غیرمنتظره شود و به شما امکان می دهد تا از برخی از ویژگیهای امنیتی کامپایلر عبور کنید، بنابراین مطمئن شوید که نتیجه آن چیزی است که میخواهید و انتظار دارید!
مثال زیر را در نظر بگیرید که یک عدد منفی را به یک عدد بدون علامت تبدیل میکند:
int y = -3;
uint x = uint(y);
در انتهای این قطعه کد، مقدار x برابر 0xfffff..fd (۶۴ حرف هگزادسیمال) خواهد بود، که 3- در نمایش دوتایی با 256 بیت است.
اگر یک عدد صحیح به طور صریح به یک نوع کوچکتر تبدیل شود، بیتهای سفارشی بالاتر قطع خواهند شد:
uint32 a = 0x12345678;
uint16 b = uint16(a); // // b will be 0x5678 now
اگر یک عدد صحیح به طور صریح به یک نوع بزرگتر تبدیل شود، نتیجهٔ تبدیل برابر عدد صحیح اصلی آن خواهد بود:
uint16 a = 0x1234;
uint32 b = uint32(a); // b will be 0x00001234 now
assert(a == b);
در نوعهای بایت با اندازه ثابت، رفتارهای متفاوتی را در طول تبدیلات از خود نشان میدهند. میتوان آنها را به عنوان دنبالهای از بایتهای فردی در نظر گرفت و تبدیل به یک نوع کوچکتر منجر به قطع دنباله خواهد شد:
bytes2 a = 0x1234;
bytes1 b = bytes1(a); // b will be 0x12
اگر یک نوع بایت با اندازه ثابت به طور صریح به یک نوع بزرگتر تبدیل شود. دسترسی به بایت در یک فهرست ثابت منجر به همان مقدار قبل و بعد از تبدیل خواهد شد:
bytes2 a = 0x1234;
bytes4 b = bytes4(a); // b will be 0x12340000
assert(a[0] == b[0]);
assert(a[1] == b[1]);
از آنجا که اعداد صحیح و آرایههای بایت با اندازه ثابت هنگام قطع یا پر کردن رفتارهای متفاوتی دارند، تبدیلهای صریح بین اعداد صحیح و آرایههای بایت با اندازهٔ ثابت تنها در صورتی مجاز است که هر دو اندازه یکسان باشند. اگر بخواهید بین اعداد صحیح و آرایههای بایت با اندازه ثابت با اندازههای مختلف تبدیل کنید، باید از تبدیلهای میانی استفاده کنید که قوانین قطع و پر کردن موردنظر را صریحاً بیان کنند:
bytes2 a = 0x1234;
uint32 b = uint16(a); // b will be 0x00001234
uint32 c = uint32(bytes4(a)); // c will be 0x12340000
uint8 d = uint8(uint16(a)); // d will be 0x34
uint8 e = uint8(bytes1(a)); // e will be 0x12
آرایههای بایت و برشهای دادههای بایت به طور صریح به نوع بایتهای ثابت (bytes1/…/bytes32) تبدیل میشوند. در صورتی که طول آرایه بیشتر از نوع بایتهای ثابت مقصد باشد، قطع دنبالهٔ آنها در انتها رخ میدهد. اگر طول آرایه کوچکتر از نوع مقصد باشد، در انتها با صفر پر خواهد شد.
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.5;
contract C {
bytes s = "abcdefgh";
function f(bytes calldata c, bytes memory m) public view returns (bytes16, bytes3) {
require(c.length == 16, "");
bytes16 b = bytes16(m); // if length of m is greater than 16, truncation will happen
b = bytes16(s); // padded on the right, so result is "abcdefgh\0\0\0\0\0\0\0\0"
bytes3 b1 = bytes3(s); // truncated, b1 equals to "abc"
b = bytes16(c[:8]); // also padded with zeros
return (b, b1);
}
}
#solidity #web3 #update #ether #اتریوم
ویژگی std::bind_back یک الگوی تابعی جدید در کتابخانهٔ استاندارد ۲۳ است که به عنوان مکملی از std::bind_front به شما امکان میدهد ورودیها را به توابع ارجاعی (Callable objects) به صورت "bind" اما با ترتیب برعکس اعمال کنید.
- این تابع، ورودیها را به انتهای یک فراخوانی متصل میکند؛ یک شیء قابل فراخوانی (تابع، لامبدا و غیره) و فهرستی از ورودیها را میگیرد. این ورودیها اساساً در انتهای فهرست ورودی قابل فراخوانی «از پیش پر شدهاند» (pre-filled).
- این تابع یک پوشش فراخوانی ارسالی ایجاد میکند. تابع std::bind_back یک شیء قابل فراخوان جدید را برمیگرداند که ورودیهای قابل فراخوان اولیه و ورودیهای محدود را کپسوله میکند. هنگامی که این callable جدید را فراخوانی میکنید، ورودیهایی را که ارائه میدهید همراه با ورودیهای پیشپیوندی (pre-bound) به فراخوان اصلی ارسال میکند.
به عبارت سادهتر، تصور کنید تابعی دارید که چندین ورودی میگیرد، اما میخواهید برخی از آن ورودیها را از قبل اصلاح کنید. در اینجا، تابع std::bind_back به شما امکان میدهد این کار را با ایجاد یک شیء تابع مانند جدید، که از قبل دارای مقادیر مشخصی پر شده است، انجام دهید.
به طور کلی، ورودیهایی که به std::bind_back ارائه میدهید کپی یا منتقل میشوند (با مرجع ارسال نمیشوند) مگر اینکه از std::ref یا std::cref استفاده کنید.
#cpp20 #cpp23 #bind #bind_back #چالش #سیروزه #رمضان #روز_هجدهم
- این تابع، ورودیها را به انتهای یک فراخوانی متصل میکند؛ یک شیء قابل فراخوانی (تابع، لامبدا و غیره) و فهرستی از ورودیها را میگیرد. این ورودیها اساساً در انتهای فهرست ورودی قابل فراخوانی «از پیش پر شدهاند» (pre-filled).
- این تابع یک پوشش فراخوانی ارسالی ایجاد میکند. تابع std::bind_back یک شیء قابل فراخوان جدید را برمیگرداند که ورودیهای قابل فراخوان اولیه و ورودیهای محدود را کپسوله میکند. هنگامی که این callable جدید را فراخوانی میکنید، ورودیهایی را که ارائه میدهید همراه با ورودیهای پیشپیوندی (pre-bound) به فراخوان اصلی ارسال میکند.
به عبارت سادهتر، تصور کنید تابعی دارید که چندین ورودی میگیرد، اما میخواهید برخی از آن ورودیها را از قبل اصلاح کنید. در اینجا، تابع std::bind_back به شما امکان میدهد این کار را با ایجاد یک شیء تابع مانند جدید، که از قبل دارای مقادیر مشخصی پر شده است، انجام دهید.
به طور کلی، ورودیهایی که به std::bind_back ارائه میدهید کپی یا منتقل میشوند (با مرجع ارسال نمیشوند) مگر اینکه از std::ref یا std::cref استفاده کنید.
import std;
auto main() -> int {
auto add = [](int a, int b) { return a + b; };
auto bound_add = std::bind_back(add, 10);
std::println("{}", bound_add(5));
}
#cpp20 #cpp23 #bind #bind_back #چالش #سیروزه #رمضان #روز_هجدهم
COMPΞZ 🧬
ویژگی std::bind_back یک الگوی تابعی جدید در کتابخانهٔ استاندارد ۲۳ است که به عنوان مکملی از std::bind_front به شما امکان میدهد ورودیها را به توابع ارجاعی (Callable objects) به صورت "bind" اما با ترتیب برعکس اعمال کنید. - این تابع، ورودیها را به انتهای…
بخش تخصصی دوم (بهروز رسانی Solidity) | دید کلی توابع (Function Visibility)
سالیدیتی دو نوع فراخوانی تابع را میشناسد، البته با توجه به سبک برنامهنویسی در ++C و Java که خصوصیات OOP را به خوبی به نمایش میگذارند، در سالیدیتی نیز ما شاهد ویژگیهای مشابه در نوع دید اعضای یک کلاس (در اینجا قرارداد) هستیم.
بناراین، نوع دید خارجی (external) که یک فراخوان پیام واقعی EVM ایجاد میکند و داخلی (internal) که این کار را انجام نمیدهد. علاوه بر این، توابع داخلی را میتوان برای قراردادهای مشتق شده غیرقابل دسترسی کرد. این امر باعث ایجاد چهار نوع دید (visibility) برای توابع میشود.
خارجی (external)
توابع خارجی بخشی از رابط کاربری قرارداد هستند، به این معنی که میتوان از سایر قراردادها و از طریق تراکنشها آنها را فراخوانی کرد. یک تابع خارجی f را نمیتوان به صورت داخلی فراخوانی کرد، یعنی ()f کار نمیکند، اما ()this.f کار میکند.
عمومی (public)
توابع عمومی بخشی از رابطکاربری قرارداد هستند و میتوان آنها را به صورت داخلی یا از طریق فراخوانی پیام فراخوانی کرد.
داخلی (internal)
توابع داخلی فقط از درون قرارداد جاری یا قراردادهای مشتق شده از آن قابل دسترسی هستند. آنها به صورت خارجی قابل دسترسی نیستند. از آنجایی که از طریق ABI قرارداد در معرض دید قرار نمیگیرند، میتوانند ورودیهایی از انواع داخلی مانند نگاشت ها (mapping) یا مراجع ذخیرهسازی (storage references) را دریافت کنند.
خصوصی (private)
توابع خصوصی مانند توابع داخلی هستند، اما در قراردادهای مشتق شده قابل مشاهده نیستند.
مشخصکنندههای دید (Visibility Specifiers) در سالیدیتی
مشخصکنندهٔ دید در سالیدیتی برای کنترل دسترسی به عناصر قرارداد (متغیرهای حالت و توابع) استفاده میشود. انتخاب مناسب این مشخصکنندهها برای امنیت، ماژولار بودن و بهینهسازی مصرف گاز (gas) در قراردادهای هوشمند بسیار مهم است.
مشخص کننده visibility بعد از نوع برای متغیرهای حالت و بین فهرست ورودی و فهرست ورودیهای برگشتی برای توابع داده میشود.
در مثال زیر، D میتواند ()c.getData را برای بازیابی مقدار دادهها در ذخیرهسازی حالت فراخوانی کند، اما قادر به فراخوانی f نیست. قرارداد E از C مشتق شده است و بنابراین، میتواند محاسبه را فراخوانی کند.
#solidity #web3 #update #ether #اتریوم
سالیدیتی دو نوع فراخوانی تابع را میشناسد، البته با توجه به سبک برنامهنویسی در ++C و Java که خصوصیات OOP را به خوبی به نمایش میگذارند، در سالیدیتی نیز ما شاهد ویژگیهای مشابه در نوع دید اعضای یک کلاس (در اینجا قرارداد) هستیم.
بناراین، نوع دید خارجی (external) که یک فراخوان پیام واقعی EVM ایجاد میکند و داخلی (internal) که این کار را انجام نمیدهد. علاوه بر این، توابع داخلی را میتوان برای قراردادهای مشتق شده غیرقابل دسترسی کرد. این امر باعث ایجاد چهار نوع دید (visibility) برای توابع میشود.
خارجی (external)
توابع خارجی بخشی از رابط کاربری قرارداد هستند، به این معنی که میتوان از سایر قراردادها و از طریق تراکنشها آنها را فراخوانی کرد. یک تابع خارجی f را نمیتوان به صورت داخلی فراخوانی کرد، یعنی ()f کار نمیکند، اما ()this.f کار میکند.
عمومی (public)
توابع عمومی بخشی از رابطکاربری قرارداد هستند و میتوان آنها را به صورت داخلی یا از طریق فراخوانی پیام فراخوانی کرد.
داخلی (internal)
توابع داخلی فقط از درون قرارداد جاری یا قراردادهای مشتق شده از آن قابل دسترسی هستند. آنها به صورت خارجی قابل دسترسی نیستند. از آنجایی که از طریق ABI قرارداد در معرض دید قرار نمیگیرند، میتوانند ورودیهایی از انواع داخلی مانند نگاشت ها (mapping) یا مراجع ذخیرهسازی (storage references) را دریافت کنند.
خصوصی (private)
توابع خصوصی مانند توابع داخلی هستند، اما در قراردادهای مشتق شده قابل مشاهده نیستند.
مشخصکنندههای دید (Visibility Specifiers) در سالیدیتی
مشخصکنندهٔ دید در سالیدیتی برای کنترل دسترسی به عناصر قرارداد (متغیرهای حالت و توابع) استفاده میشود. انتخاب مناسب این مشخصکنندهها برای امنیت، ماژولار بودن و بهینهسازی مصرف گاز (gas) در قراردادهای هوشمند بسیار مهم است.
مشخص کننده visibility بعد از نوع برای متغیرهای حالت و بین فهرست ورودی و فهرست ورودیهای برگشتی برای توابع داده میشود.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract C {
function f(uint a) private pure returns (uint b) { return a + 1; }
function setData(uint a) internal { data = a; }
uint public data;
}
در مثال زیر، D میتواند ()c.getData را برای بازیابی مقدار دادهها در ذخیرهسازی حالت فراخوانی کند، اما قادر به فراخوانی f نیست. قرارداد E از C مشتق شده است و بنابراین، میتواند محاسبه را فراخوانی کند.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract C {
uint private data;
function f(uint a) private pure returns(uint b) { return a + 1; }
function setData(uint a) public { data = a; }
function getData() public view returns(uint) { return data; }
function compute(uint a, uint b) internal pure returns (uint) { return a + b; }
}
// This will not compile
contract D {
function readData() public {
C c = new C();
uint local = c.f(7); // error: member `f` is not visible
c.setData(3);
local = c.getData();
local = c.compute(3, 5); // error: member `compute` is not visible
}
}
contract E is C {
function g() public {
C c = new C();
uint val = compute(3, 5); // access to internal member (from derived to parent contract)
}
}
#solidity #web3 #update #ether #اتریوم