COMPΞZ 🧬
389 subscribers
1.85K photos
49 videos
24 files
730 links
متخصص کامپیوتر و نرم‌افزار • سازنده • هنرمند و طراح • مجموعه‌دار • نویسنده • تحلیل‌گر • مشاور استارتاپی و ایده‌پرداز

𐎲𐎴𐎠𐎼𐎴𐎫𐎹 𐏃𐎢𐎶𐎠𐎫𐎹

We create because the world deserves better code.

https://linktr.ee/compez
Download Telegram
COMPΞZ 🧬
🔥 بخش دوم: یادگیری زبان برنامه‌نویسی Solidity البته من از ۱ سال قبل شروعش کردم و این پست بازیابی شدست، ولی اینجا به‌روز‌رسانی میدم. ## سالیدیتی چیه؟ سالیدیتی یک زبان برنامه‌نویسی سطح بالا، شیءگرا و کامپایل‌شده‌ است که برای نوشتن قراردادهای هوشمند در…
بخش تخصصی اول (به‌روز‌رسانی سی‌پلاس‌پلاس ۲۳)

کلمهٔ کلیدی constinit در زبان برنامه‌نویسی ++C به شما اجازه می‌دهد تا تضمین کنید متغیر موردنظر در زمان کامپایل مقداردهی شود، نه در زمان اجرا. این ویژگی می‌تواند کارایی برنامه را بهبود ببخشد، زیرا از مقداردهی پویا در زمان اجرا جلوگیری می‌کند.

import std;

constinit int temperature = 20;

auto main() -> int
{
std::println("Current temperature: {:+3d} degrees Celsius.", temperature);
}


در این مثال، استفاده از کلمهٔ کلیدی constinit تضمین می‌کند که مقدار temperature در زمان کامپایل مقداردهی می‌شود، بنابراین هزینهٔ مقداردهی پویا در زمان اجرا حذف خواهد شد. این قابلیت برای متغیرهایی که مقدارشان در زمان کامپایل مشخص است و نیازی به مقداردهی پویا ندارند، بسیار مفید است.

### تفاوت constinit با constexpr
ممکن است این سؤال پیش بیاید که تفاوت کلمهٔ کلیدی constinit با کلمهٔ کلیدی constexpr چیست؟ این دو در ++C برای تعریف متغیرهای ثابت استفاده می‌شوند، اما تفاوت‌هایی دارند:

- کلمهٔ کلیدی constinit به‌طور خاص برای تضمین مقداردهی در زمان کامپایل و جلوگیری از مقداردهی پویا در زمان اجرا استفاده می‌شود.
- کلمهٔ کلیدی constexpr علاوه بر این قابلیت، اجازه انجام محاسبات در زمان کامپایل را نیز دارد. متغیرهای constexpr باید مقدارشان در زمان کامپایل قابل محاسبه و قطعی باشد، اما می‌توانند شامل عملیات‌های ساده محاسباتی در زمان کامپایل باشند.

#چالش #سی‌روزه #رمضان #روز_دوم #cpp23 #update
👍1
COMPΞZ 🧬
بخش تخصصی اول (به‌روز‌رسانی سی‌پلاس‌پلاس ۲۳) کلمهٔ کلیدی constinit در زبان برنامه‌نویسی ++C به شما اجازه می‌دهد تا تضمین کنید متغیر موردنظر در زمان کامپایل مقداردهی شود، نه در زمان اجرا. این ویژگی می‌تواند کارایی برنامه را بهبود ببخشد، زیرا از مقداردهی…
### بخش تخصصی دوم (به‌روز‌رسانی Solidity) – انواع داده‌ها

زبان Solidity نیز مانند ++C یک زبان با انواع ایستا است، به این معنا که نوع هر متغیر (حالت و محلی) باید مشخص شود. Solidity چندین نوع ابتدایی را ارائه می‌دهد که می‌توان آن‌ها را برای ایجاد انواع پیچیده ترکیب کرد. علاوه بر این، انواع داده‌ها می‌توانند در عباراتی که شامل عملگر هستند با یکدیگر تعامل داشته باشند. مفهوم مقادیر "تعریف نشده" یا "null" در Solidity وجود ندارد، اما متغیرهای تازه اعلام شده همیشه دارای مقدار پیش‌فرض هستند که به نوع آن‌ها بستگی دارد.

### کلمهٔ کلیدی انواع پایه در Solidity:
- کلمهٔ کلیدی uint – اعداد صحیح بدون علامت (مثبت)
- کلمهٔ کلیدی int – اعداد صحیح با علامت (مثبت و منفی)
- کلمهٔ کلیدی bool – مقادیر درست یا غلط
- کلمهٔ کلیدی address – آدرس‌های قراردادهای هوشمند
- کلمهٔ کلیدی bytes – رشته‌های بایت
- کلمهٔ کلیدی string – رشته‌های متنی

### کلمهٔ کلیدی انواع پیچیده‌تر در Solidity:
- کلمهٔ کلیدی array – آرایه‌هایی از مقادیر هم‌نوع
- کلمهٔ کلیدی struct – ساختارهایی برای دسته‌بندی داده‌های مرتبط
- کلمهٔ کلیدی enum – نوعی داده برای مقادیر محدود و از پیش تعریف‌شده
- کلمهٔ کلیدی mapping – نگاشت‌هایی برای ذخیره‌سازی داده‌ها به‌صورت کلید-مقدار


### کلمهٔ کلیدی address در Solidity

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

به‌عنوان نمونه، کلمهٔ کلیدی address در Solidity دو حالت مختلف دارد:

- کلمهٔ کلیدی address – نوعی داده که یک مقدار ۲۰ بایتی را نگه می‌دارد (معادل یک آدرس اتریوم).
- کلمهٔ کلیدی address payable – مشابه address است، اما دارای توابع `transfer` و `send` برای ارسال اتر (ETH) نیز می‌باشد.

#### تفاوت address و address payable
اگر بخواهید اتر (ETH) به یک آدرس ارسال کنید، حتماً باید از address payable استفاده کنید. دلیل این موضوع این است که برخی قراردادهای هوشمند ممکن است برای دریافت اتر طراحی نشده باشند.

// یک آدرس عادی
address myAddress = address(0x123...);

// یک آدرس قابل پرداخت
address payable x = payable(0x123...);


از نسخه ۰.۵.۰ در Solidity، قراردادها به‌طور ضمنی به address تبدیل نمی‌شوند، اما همچنان می‌توان آن‌ها را به‌صورت صریح به address یا address payable تبدیل کرد، به شرطی که یک تابع `fallback` از نوع `receive` یا `payable` داشته باشند.

### مثالی از خواندن موجودی یک آدرس اتریوم
pragma solidity ^0.8.0;

contract AddressBalance {
// دریافت موجودی یک آدرس (بر حسب Wei)
function getAddressBalance(address addr) public view returns (uint) {
return addr.balance;
}
}

کلمهٔ کلیدی address در Solidity به‌عنوان نوعی داده ۲۰ بایتی (۱۶۰ بیت) استفاده می‌شود که می‌تواند آدرس یک حساب کاربری یا قرارداد هوشمند را در شبکه اتریوم نگه دارد.

### کاربردهای `address` در Solidity:
ارسال اتر به یک حساب کاربری یا قرارداد هوشمند
فراخوانی توابع یک قرارداد هوشمند
ذخیره آدرس‌ها در متغیرها
مقایسه آدرس‌ها

### چرا Solidity را دوست دارم؟
برخلاف ++C که یک زبان چندمنظوره است، Solidity به‌طور خاص برای قراردادهای هوشمند روی اتریوم طراحی شده است. این یعنی شما نیازی به پیاده‌سازی پایه‌ای انواع داده‌ها مثل address ندارید، چون زبان از ابتدا برای همین منظور طراحی شده است!

در حالی که در ++C باید همه چیز را دستی پیاده‌سازی کنید، Solidity ابزارهای موردنیاز برای توسعه قراردادهای هوشمند را از پیش آماده کرده است. این ویژگی باعث می‌شود که خواندن و نوشتن قراردادهای هوشمند بسیار ساده‌تر باشد!

به همین دلیل، هر زبان برنامه‌نویسی برای هدف خودش ابزار مناسبی است!

#solidity #web3 #update‌ #چالش #سی‌روزه #رمضان
2👍1
همونطور که گفتم این موارد رو از آرشیو سال قبل دارم در میارم! اما کمی هم روشون تغییرات میدم با توجه به به‌روز رسانی‌های اخیر.

هر روز یک مثال از سی++ مدرن و سالیدیتی؛ تا آخر ماه باهم یه یه قرارداد رو می‌خونیم! قراردادی که برای دیجن نوشتم رو براتون توضیح خواهم داد.

برای خوندن قرارداد نیازی نیست مهندس کامپیوتر باشی! اگه هستی که چه بهتر! اگه نیستی فقط در بالاترین سطوح ممکن کلمات کلیدی رو باید درک کنی. سالیدیتی زبان سطح بالاست که نزدیک به انگلیسیه پس درکش هم نباید سخت باشه.

مثلاً، وقتی بین کد‌ها یه چیزی مثل address payable می‌بینی، این قطعاً داره اشاره می‌کنه به آدرسی که شما می‌تونید انتظار ترنسفر یا ارسال روی یک آدرس رو داشته باشید.
یعنی آدرسی که قابلیت پرداخت روش هست!

زیاد نباید پیچیده نگاهش کنید، من انتظار ندارم بشینید قرارداد بنویسید. فعلاً فقط هدفمون خوندن قرارداد هست همین.

#موقت
👍1🙏1
یکم به کاربر حال بدیم حوصلش موقع کار با فریم سر نره! 😌
2👻1
یه Logger شیک هم براش بذاریم تمیز... 👀
1👍1
از سه تا کد دعوت فقط ۲ تاش رو دارم.

با انگیزه‌ترین فردی که به این کد‌ها نیاز داره رو بهم معرفی کنید این‌ها رو بهش بدم تا بتونه بدون موضوع پرداخت دلاری عضو فارکستر بشه.
8
اگه بخوام همچین چیزی بسازم برای فارکستر، عین آب خوردنه واسم! اما هر بار درخواستش معادل ۱ دلار روی api‌های AI آب می‌خوره!

چالش... چطور می‌شه هزینهٔ توکن‌سوزی رو به حداقل رسوند... 🤔
🤔1
COMPΞZ 🧬
اگه بخوام همچین چیزی بسازم برای فارکستر، عین آب خوردنه واسم! اما هر بار درخواستش معادل ۱ دلار روی api‌های AI آب می‌خوره! چالش... چطور می‌شه هزینهٔ توکن‌سوزی رو به حداقل رسوند... 🤔
خب یکم توکن رو تحلیل کنیم ببینیم چطور پردازش میشه. این نتیجهٔ خروجی و تعدد توکن و کاراکتری هست که بر مبنای ChatGPT برای تحلیل حساب من روی توئیتر می‌شه به دست آورد.

پس...
🔥1
COMPΞZ 🧬
خب یکم توکن رو تحلیل کنیم ببینیم چطور پردازش میشه. این نتیجهٔ خروجی و تعدد توکن و کاراکتری هست که بر مبنای ChatGPT برای تحلیل حساب من روی توئیتر می‌شه به دست آورد. پس...
نکته) تحلیلی که گروک انجام داده بر مبنای ۶۸ پست اخیر از من هست.
فرض کنیم من بخشی از هزینه‌های تحلیل رو روی سرور مرکزی خودم پردازش کنم، ۱۰۰ کست آخر رو بگیرم و تحلیلش کنم.

خب این ۱۰۰ کست روی حساب‌های مختلف می‌تونه به پاراگراف‌هایی کوتاه یا بلند تبدیل بشه و در نهایت بر تعداد توکن‌ها تقسیم و سوزونده بشه تا به یک نتیجهٔ نهایی برسیم. با توجه به اینکه روی پست قبلی متوجه شدیم چقدر توکن می‌سوزونه یعنی ۱۴۲ توکن با ۵۹۳ کاراکتر از نوه خروجی! خب این رو ضریب بدیم به هزاران کاربر! 🤔

🔹 توکن در متن یعنی چه؟
یک توکن می‌تواند شامل موارد زیر باشد:

یک کلمه کامل (مثلاً "سلام")
یک بخش از یک کلمه (مثلاً در کلمات طولانی‌تر، ممکن است به چند توکن شکسته شوند)
یک علامت نگارشی (مثل "؟" یا "،")
یک فاصله یا کاراکتر خاص


🔹 مثال‌های تعداد توکن در یک متن
متن: "سلام، حال شما چطور است؟"
تقسیم‌بندی به توکن‌ها: ["سلام"، "،"، "حال"، "شما"، "چطور"، "است", "؟"]
تعداد توکن‌ها: ۷

💡 نکته: تعداد توکن‌ها همیشه برابر با تعداد کلمات نیست، زیرا برخی از کلمات ممکن است به چند توکن شکسته شوند.

🔹 چرا توکن‌ها مهم هستند؟
هزینه پردازشی: مدل‌های زبانی معمولاً با تعداد توکن‌ها شارژ می‌شوند. هرچه متن طولانی‌تر باشد، هزینه پردازش بالاتر می‌رود.
محدودیت تعداد توکن: هر مدل زبانی یک حداکثر ظرفیت برای تعداد توکن دارد.
تأثیر در کیفیت متن: نحوه شکسته شدن متن به توکن‌ها روی دقت و سرعت پردازش مدل تأثیر می‌گذارد.

حالا هزینه‌ها رو محاسبه کنیم:
قیمت برای هر ۱ میلیون توکن برای متن ورودی ۲ دلار هست.
قیمت برای هر ۱ میلیون توکن برای متن خروجی ۱۰ دلار هست.

حالا باید فکر کنم! چقدر می‌شه کاربر رو پوشش داد و چه میزان درخواست و با چه مقدار هزینه!
خب قطعاً استفاده از چنین فریمی باید پولی باشه در این شکی نیست، اما چقدر برای هر درخواست یا کاربر باید تحلیل کنم! 👀 فکرینگ....
👍2
COMPΞZ 🧬
نکته) تحلیلی که گروک انجام داده بر مبنای ۶۸ پست اخیر از من هست. فرض کنیم من بخشی از هزینه‌های تحلیل رو روی سرور مرکزی خودم پردازش کنم، ۱۰۰ کست آخر رو بگیرم و تحلیلش کنم. خب این ۱۰۰ کست روی حساب‌های مختلف می‌تونه به پاراگراف‌هایی کوتاه یا بلند تبدیل بشه و…
برای محاسبه تعداد توکن‌هایی که در روز مصرف می‌کنی، باید چند فاکتور را در نظر بگیری:

تعداد درخواست‌ها در روز = ۱۰۰۰
تعداد کاراکترها در هر درخواست = ۱۰۰۰
میانگین نسبت توکن به کاراکتر = تقریباً ۱ توکن به ازای هر ۴ کاراکتر در زبان فارسی و انگلیسی (بسته به متن)
مرحله ۱: تبدیل کاراکتر به توکن
اگر هر درخواست ۱۰۰۰ کاراکتر باشد، تعداد تقریبی توکن‌ها:

1000÷4=250 توکن

(این مقدار تقریبی است و ممکن است بین ۲۰۰ تا ۳۰۰ توکن باشد)

مرحله ۲: محاسبه تعداد کل توکن‌های روزانه
توکن مصرفی در روز:

250×1000=250,000 توکن

مرحله ۳: هزینه و محدودیت‌ها

بسته به اینکه از چه پلنی استفاده می‌کنی، باید بررسی کنی که آیا این مقدار توکن در محدودیت پلن شما قرار دارد یا نیاز به ارتقا داری. برای مثال، اگر محدودیت ماهانه ۱۰ میلیون توکن باشد، این مقدار روزانه حدود ۲.۵٪ از کل سهمیه ماهانه را مصرف می‌کند.

نتیجه: اگر روزانه ۱۰۰۰ درخواست با ۱۰۰۰ کاراکتر بفرستی، به‌طور میانگین حدود ۲۵۰,۰۰۰ توکن در روز مصرف خواهی کرد.

هزینه‌هامون میشه بر مبنای هزار درخواست و پاسخی که ارائه می‌شه، حدود ۳۰۰ دلار در ماه. 👀
👍2🤯2
COMPΞZ 🧬
برای محاسبه تعداد توکن‌هایی که در روز مصرف می‌کنی، باید چند فاکتور را در نظر بگیری: تعداد درخواست‌ها در روز = ۱۰۰۰ تعداد کاراکترها در هر درخواست = ۱۰۰۰ میانگین نسبت توکن به کاراکتر = تقریباً ۱ توکن به ازای هر ۴ کاراکتر در زبان فارسی و انگلیسی (بسته به متن)…
من چقدر درخواست داشتم روی فریم‌ها در ماه؟ چیزی حدود ۲.۵ میلیون بار در بدترین شرایط بازار، وقتی سوپر ریر بود و بازار هم خوب بود سقف ۱۰ میلیون درخواست رو داشتیم!

خب بذاریم ۱ هزارم همون ۲.۵ میلیون یعنی ۲،۵۰۰ درخواست! 😁 محاسبهٔ ما چقدر بود؟ روی ۱۰۰۰ درخواست! 😝 پس بالای ۷۵۰ دلار در ماه همچین چیزی به شرط ثابت موندن درخواست‌ها آب می‌خوره. 😌
Gm

جسارت اجرایی کردن
ایده‌هایت را داشته باش
جهان پر است
از ترسوهای خوش فکر

https://warpcast.com/compez.eth/0xd357532b
4
👀
COMPΞZ 🧬
👀
وضعیت اتر هیچ جای تعریفی نداره! به خصوص بعد از این کثافت‌کاری‌های که روش انجام شد.
تمام 🤚🏼 اینجا دیگه کف حمایتی روی روند بلند‌مدتیش هست!

نظاره‌گر هستیم...
😢2😐2
COMPΞZ 🧬
👀
تسلط بیت‌کوین هم روی بازهٔ ۱ ماهه.
کاملاً تمایل به غالب شدن به کل بازار رو داره! اگه وارد اون کادری که حدس می‌زنم بشه، یعنی بالای ۷۰٪ تسلط و این یعنی آلت‌کوین‌ها یه کف ریزشی اساسی جدیدی خواهند دید.

نمونش، ریر، دیجن، ماکسی و هر شرو ور دیگه‌ای که هست همشون پایین‌ترین قیمت ممکن در طول تاریخ عمرشون رو خواهند دید.

البته... Rare همین الآن هم تجربش کرده. 😉
👍1
من چه می‌کنم در چنین شرایطی؟

هیچی دست به بازار نمی‌زنم، هرچی داشتم رو چشم می‌بندم به روش انگار که ندارمش.
روی مهارت‌های دیگه‌ام وقت می‌ذارم، برنامه‌نویسی و ساخت‌و‌ساز بیشتر، و اجرای ایده‌های بهتر؛ توصیه می‌کنم FOMO نشید! من وضعیت خیلی بدتر از اینارو دیدم... تهش اینه که بعد یه مدت وضعیت بهتر میشه، فقط صبور باشید و روی برنامه‌هایی که دارید تمرکز کنید که این شرایط همش فرصت برای باز‌سازی هست.
4💯2
😄 باور کن خسته‌تر از این حرفام...
🤣11😁1
COMPΞZ 🧬
بخش تخصصی اول (به‌روز‌رسانی سی‌پلاس‌پلاس ۲۳) کلمهٔ کلیدی constinit در زبان برنامه‌نویسی ++C به شما اجازه می‌دهد تا تضمین کنید متغیر موردنظر در زمان کامپایل مقداردهی شود، نه در زمان اجرا. این ویژگی می‌تواند کارایی برنامه را بهبود ببخشد، زیرا از مقداردهی…
بخش تخصصی اول (به‌روزرسانی C++23)
مثال دیروز در مورد constinit با کمی جزئیات بیشتر و مقایسه با constexpr، const و consteval

- کلمهٔ کلیدی const
این ویژگی نشان می‌دهد که یک متغیر یا پارامتر تابع جهانی (global)، محلی یا عضو، پس از مقداردهی نمی‌تواند تغییر کند. همچنین می‌تواند برای مشخص کردن یک تابع عضو غیر استاتیک استفاده شود؛ یک تابع عضو ثابت اینگونه نمی‌تواند وضعیت شیء را تغییر دهد (مگر اینکه آن‌ها به صورت mutable تعریف شده باشند) و تنها می‌تواند سایر توابع عضو ثابت را فراخوانی کند. با این حال، این تابع همچنان در زمان اجرا (Run-Time) ارزیابی می‌شود.

import std;

class foo
{
int value;
public:
foo(int const v) : value(v) {}
int get() const { return value; }
};

auto main() -> int
{
int const fortyTwo = 42;
foo f(fortyTwo);
int n = f.get();
std::println("n: {}", n);
}


- کلمه کلیدی constexpr
این ویژگی در C++11 معرفی شد تا نشان دهد یک متغیر یا تابع می‌تواند در یک عبارت ثابت ظاهر شود، که می‌توان آن را در زمان کامپایل ارزیابی کرد.

import std;

constexpr int maximum(int const a, int const b)
{
return a >= b ? a : b;
}

auto main() -> int
{
int const Size = 64;
int arr[maximum(42, Size)]{ 0 };
std::println("Size of arr: {}", sizeof(arr) / sizeof(arr[0]));
}


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

import std;

constexpr int maximum(int const a, int const b)
{
return a >= b ? a : b;
}

auto main() -> int
{
constexpr int m1 = maximum(42, 66); // compile-time evaluation
int a = 42, b = 66;
const int m2 = maximum(a, b); // run-time evaluation
std::println("m1: {0}, m2:{1}", m1, m2);
}


- کلمه کلیدی consteval
یک ویژگی جدید در C++20 است که برای مشخص کردن این استفاده می‌شود که یک تابع یک تابع فوری (immediate function) است، به این معنی که تابع باید همیشه یک عبارت ثابت تولید کند. این موضوع به این معنی است که تابع تنها در زمان کامپایل دیده می‌شود. نمادها برای تابع منتشر نمی‌شوند، شما نمی‌توانید آدرس چنین تابعی را بگیرید، و ابزارهایی مانند دیباگرها قادر به نمایش آنها نخواهند بود. در این مسأله، توابع فوری شبیه به ماکروها هستند.

import std;

consteval int maximum(int const a, int const b)
{
return a >= b ? a : b;
}

auto main() -> int
{
int const Size = 64;
constexpr int m1 = maximum(42, Size); // OK, compile-time evaluation
int a = 12, b = 66;
const int m2 = maximum(a, b); // error

using fptr = int(int, int);
fptr* pmax = maximum; // error
}


کلمه کلیدی consteval به خاصیت inline دلالت دارد. اگر هر اعلانی از یک تابع یا الگوی تابع شامل یک consteval باشد، آنگاه تمام اعلان‌های آن تابع یا الگوی تابع باید شامل نوع مشخص کننده باشند. یک تابع که consteval است، درواقع یک تابع constexpr است و باید الزامات قابل اعمال برای توابع constexpr (یا سازنده‌های constexpr) را برآورده کند.

- کلمه کلیدی constinit
یک متغیر را با مدت زمان ذخیره‌سازی static یا thread اعلام می‌کند. اگر یک متغیر با constinit اعلام شود، اعلان مقداردهی اولیه آن باید با constinit اعمال شود. اگر یک متغیر با constinit اعلام شود و مقداردهی پویا داشته باشد (حتی اگر به عنوان مقداردهی ثابت انجام شود)، برنامه ill-formed است. اگر در نقطه اعلان مقداردهی اولیه هیچ اعلان constinit قابل دسترسی نباشد، برنامه ill-formed است و تشخیص خطا نیازی نیست.

کلمهٔ کلیدی constinit نمی‌تواند همراه با constexpr استفاده شود. وقتی که متغیر اعلام شده یک مرجع است، constinit معادل با constexpr است. وقتی که متغیر اعلام شده یک شیء است، constexpr می‌تواند مقداردهی اولیه‌ای ثابت و نابودی ثابت را الزام کند و شیء را const-qualified می‌کند، با این حال، constinit نیازی به نابودی ثابت و اعمال const ندارد.

// Declare a constinit variable 
constinit int x = 42;

// Error: constinit cannot be used with constexpr
constinit constexpr int x = 42;

// Error: constinit cannot be used with consteval
constinit consteval int square(int x) { return x * x; }


#cpp20 #cpp23
#چالش #سی‌روزه #رمضان #روز_سوم
🔥3
COMPΞZ 🧬
بخش تخصصی اول (به‌روزرسانی C++23) مثال دیروز در مورد constinit با کمی جزئیات بیشتر و مقایسه با constexpr، const و consteval - کلمهٔ کلیدی const این ویژگی نشان می‌دهد که یک متغیر یا پارامتر تابع جهانی (global)، محلی یا عضو، پس از مقداردهی نمی‌تواند تغییر…
بخش تخصصی دوم (به‌روز رسانی Solidity) اعضای آدرس (address)

همانطور که در جلسهٔ قبل گفتیم، آدرس خودش دارای اعضایی است که بسیار کاربردی هستند. این اعضا به صورت زیر خواهند بود:

<address>.balance (uint256)

این عضو موجودی یک آدرس را در واحد Wei نمایش می‌دهد.

<address>.code (bytes memory)

عضو code کد آدرس است (می‌تواند خالی باشد).

<address>.codehash (bytes32)

عضو codehash، مقدار هش شدهٔ آدرس را بر می‌گرداند.

<address payable>.transfer(uint256 amount)

مقدار معینی از Wei را به آدرس موردنظر ارسال می‌کند. در صورت عدم موفقیت، عملیات با خطا مواجه می‌شود و برنامه برمی‌گردد. همچنین، این عملیات یک مقدار ۲۳۰۰ واحد گاز معوض را ارسال می‌کند و قابلیت تنظیم ندارد.

<address>.call(bytes memory) returns (bool, bytes memory)

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

<address>.delegatecall(bytes memory) returns (bool, bytes memory)

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

<address>.staticcall(bytes memory) returns (bool, bytes memory)

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

مثالی از کاربرد در مورد balance و transfer که می‌توان با استفاده از موجودی دارایی، موجودی یک آدرس را پرس و جو کرد و با استفاده از تابع انتقال، اتر (به واحد wei) را به آدرس قابل پرداخت ارسال کرد:

address payable x = payable(0x123);
address myAddress = address(this);
if (x.balance < 10 && myAddress.balance >= 10) {
x.transfer(10);
}


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

توضیحات تکمیلی در مورد واژهٔ Wei

واژهٔ Wei یکی از واحد‌های نمایشی در اتریوم است. یک عدد تحت اللفظی می‌تواند پسوندی از wei**، **gwei یا ether برای تعیین زیرمجموعه اتر بگیرد، جایی که اعداد اتر بدون پسوند Wei فرض می‌شوند.

assert(1 wei == 1);
assert(1 gwei == 1e9);
assert(1 ether == 1e18);


برای درک بهتر یک مثال کد تبدیلی هم با سی‌پلاس‌پلاس براش داشته باشیم:

import std;

uint64_t etherToWei(double ether)
{
return static_cast<uint64_t>(ether * 1e18);
}

uint64_t etherToGwei(double ether)
{
return static_cast<uint64_t>(ether * 1e9);
}

auto main() ->int
{
double etherValue = 0.001;
std::println("Value in Wei: {} ", etherToWei(etherValue));
std::println("Value in Gwei: {} ", etherToGwei(etherValue));
}


این هم یک وب‌سایت برای تبدیلات واحد‌های اتریومی: https://eth-converter.com که معمولاً این محاسبات در زمان مینت، یا اجرای یک قرارداد بلاک‌چینی مهم هستند.

#solidity #web3 #update #ether #اتریوم
🔥21🙏1