آموزش block.timestamp و block.number در سالیدیتی

در سالیدیتی، برای ردیابی زمان و مدیریت وقایع مبتنی بر زمان، می‌توان از ویژگی های داخلی مانند block.timestamp و block.number استفاده کرد. این ابزارها به توسعه دهندگان کمک می‌کنند تا عملکرد قراردادهای هوشمند را در بستر بلاک چین با توجه به زمان یا شماره بلاک محدود یا زمان بندی کنند.

block.timestamp و block.number در سالیدیتی چیست؟

block.timestamp زمان بلاک فعلی را به‌صورت «یونیکس تایم‌استمپ» (تعداد ثانیه‌ها از اول ژانویه 1970 میلادی به وقت UTC) بازمی‌گرداند. این متغیر اغلب برای بررسی زمان‌هایی مانند انقضای قرارداد، محدود کردن تعداد دفعات اجرای یک تابع در بازه زمانی مشخص، یا ایجاد تأخیر در دسترسی به عملکردهای خاص استفاده می‌شود. از آنجا که زمان هر بلاک توسط ولیدیتور (یا ماینر) مشخص می‌شود، این مقدار ممکن است کمی متغیر باشد و برای اندازه‌گیری‌های دقیق در مقیاس ثانیه‌ای مناسب نیست. اما در بازه‌های زمانی بلندتر مانند چند دقیقه یا چند ساعت، block.timestamp به اندازه کافی دقیق و قابل اعتماد است.

block.number شماره بلاک فعلی را در شبکه اتریوم بازمی‌گرداند. این عدد مشخص می‌کند که تراکنش در چه بلاکی انجام شده است و به‌طور پیوسته با تولید بلاک های جدید افزایش می‌یابد. از این متغیر معمولاً برای اطمینان از ترتیب اجرای تراکنش ها یا برای جلوگیری از اجرای مجدد توابع در بلاک های متوالی استفاده می‌شود. اما باید توجه داشت که از block.number نباید به‌عنوان ابزار اندازه‌گیری زمان استفاده کرد، چرا که فاصله زمانی بین تولید بلاک ها همواره ثابت نیست و به شرایط شبکه بستگی دارد.

آموزش block.timestamp و block.number در سالیدیتی

block.timestamp در سالیدیتی

تابع زیر مثالی ساده از نحوه استفاده از block.timestamp را نشان می‌دهد:

این کد را در Remix اجرا کنید.

عددی که برمی‌گردد، تعداد ثانیه‌هایی است که از ۱ ژانویه ۱۹۷۰ (UTC) گذشته است؛ همان زمان یونیکس سنتی. توجه داشته باشید که این مقدار بر حسب ثانیه است، نه میلی‌ثانیه مانند آنچه ممکن است در سیستم های لینوکسی یا سایر زبان های برنامه نویسی دریافت کنید.

در اتریوم، زمان با تولید بلاک ها پیش می‌رود و مقدار block.timestamp همان مقداری است که ولیدیتور (validator) هنگام تولید بلاک در آن قرار داده است. از آنجایی که بلاک ها به‌طور میانگین هر ۱۲ ثانیه تولید می‌شوند، block.timestamp نیز به‌طور تقریبی به همین میزان افزایش پیدا می‌کند.

نباید به block.timestamp در بازه‌های زمانی چند ثانیه‌ای اعتماد کرد، زیرا ممکن است تفاوت زیادی داشته باشد. اما در بازه زمانی چند دقیقه‌ای، می‌توان روی آن حساب کرد.

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

سالیدیتی به جای ضرب ثانیه‌ها به این شکل، روش بسیار بهتری برای نمایش زمان دارد:

در واقع، واحدهای زمانی مانند ثانیه، دقیقه، ساعت، روز و هفته همگی در سالیدیتی معتبر هستند. این‌ها در اصل میانبرهایی برای ضرب کردن در تعداد ثانیه مورد نیاز هستند. اگر برایتان سؤال پیش آمده که آیا استفاده از seconds مقدار را تغییر می‌دهد، باید بگوییم که خیر، اما باعث خوانایی بیشتر کد می‌شود، مخصوصاً وقتی قصد دارید از ثانیه به‌عنوان واحد اندازه‌گیری زمان استفاده کنید.

block.number در سالیدیتی

شما همچنین می‌توانید با استفاده از متغیر block.number متوجه شوید که در حال حاضر روی کدام بلاک هستید. عملکرد آن کاملاً مشخص است. اما برخی افراد به اشتباه میانگین زمان تولید بلاک را در block.number ضرب می‌کنند تا گذر زمان را محاسبه کنند. این کار را انجام ندهید.

از block.number برای ردیابی زمان استفاده نکنید؛ فقط برای ترتیب‌دهی تراکنش ها از آن بهره بگیرید.

چه زمانی نیاز دارید ترتیب تراکنش ها را کنترل کنید؟ به‌ندرت. پس اگر مطمئن نیستید، بهتر است از block.timestamp استفاده کنید.

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

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

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

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

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

پکیج جامع و پروژه محور ASP.NET MVC + طراحی فروشگاه اینترنتی فروش فایل
  • انتشار: ۱۶ اردیبهشت ۱۴۰۴

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

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

مشاهده همه

نظرات

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