در سالیدیتی، برای ردیابی زمان و مدیریت وقایع مبتنی بر زمان، میتوان از ویژگی های داخلی مانند 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
را نشان میدهد:
1 2 3 4 5 6 7 8 9 |
contract WhatTimeIsIt { function timestamp() public view returns (uint256) { return block.timestamp; } } |
این کد را در Remix اجرا کنید.
عددی که برمیگردد، تعداد ثانیههایی است که از ۱ ژانویه ۱۹۷۰ (UTC) گذشته است؛ همان زمان یونیکس سنتی. توجه داشته باشید که این مقدار بر حسب ثانیه است، نه میلیثانیه مانند آنچه ممکن است در سیستم های لینوکسی یا سایر زبان های برنامه نویسی دریافت کنید.
در اتریوم، زمان با تولید بلاک ها پیش میرود و مقدار block.timestamp
همان مقداری است که ولیدیتور (validator) هنگام تولید بلاک در آن قرار داده است. از آنجایی که بلاک ها بهطور میانگین هر ۱۲ ثانیه تولید میشوند، block.timestamp
نیز بهطور تقریبی به همین میزان افزایش پیدا میکند.
نباید به block.timestamp
در بازههای زمانی چند ثانیهای اعتماد کرد، زیرا ممکن است تفاوت زیادی داشته باشد. اما در بازه زمانی چند دقیقهای، میتوان روی آن حساب کرد.
اگر بخواهید اطمینان حاصل کنید که یک نفر بیش از یکبار در روز یک تابع را صدا نزند، میتوانید از ساختاری مانند مثال زیر استفاده کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
contract ExampleContract { uint256 public lastCall; function hasCooldown() public { uint256 day = 60 * 60 * 24; require( block.timestamp > lastCall + day, "hasn't been a day" ); lastCall = block.timestamp; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
contract ExampleContract { uint256 public lastCall; function hasCooldown() public { require( block.timestamp > lastCall + 1 days, "hasn't been a day" ); lastCall = block.timestamp; // update the last time the function was called } } |
در واقع، واحدهای زمانی مانند ثانیه، دقیقه، ساعت، روز و هفته همگی در سالیدیتی معتبر هستند. اینها در اصل میانبرهایی برای ضرب کردن در تعداد ثانیه مورد نیاز هستند. اگر برایتان سؤال پیش آمده که آیا استفاده از seconds
مقدار را تغییر میدهد، باید بگوییم که خیر، اما باعث خوانایی بیشتر کد میشود، مخصوصاً وقتی قصد دارید از ثانیه بهعنوان واحد اندازهگیری زمان استفاده کنید.
block.number در سالیدیتی
شما همچنین میتوانید با استفاده از متغیر block.number
متوجه شوید که در حال حاضر روی کدام بلاک هستید. عملکرد آن کاملاً مشخص است. اما برخی افراد به اشتباه میانگین زمان تولید بلاک را در block.number
ضرب میکنند تا گذر زمان را محاسبه کنند. این کار را انجام ندهید.
از block.number
برای ردیابی زمان استفاده نکنید؛ فقط برای ترتیبدهی تراکنش ها از آن بهره بگیرید.
چه زمانی نیاز دارید ترتیب تراکنش ها را کنترل کنید؟ بهندرت. پس اگر مطمئن نیستید، بهتر است از block.timestamp
استفاده کنید.
اگر میخواهید بدانید عدد بلاک فعلی چقدر بزرگ است، میتوانید به سایت Etherscan مراجعه کنید، چراکه عدد بلاک فعلی را نمایش میدهد.
1 2 3 4 5 6 7 8 9 |
contract ExampleContract { function whatBlockIsIt() external view returns (uint256) { return block.number; } } |
کدی که در بالا آورده شده، به شما میگوید که تراکنش در کدام بلاک اتفاق افتاده است. در این حالت، مقدار بازگشتی بهصورت پویا (دینامیک) بهروزرسانی میشود.
اگر بخواهید اطمینان حاصل کنید که یک تابع در بلاکی جدیدتر نسبت به تابعی دیگر فراخوانی شود (یعنی در بلاکی بعد از آن اجرا شود)، میتوانید از ساختار زیر استفاده کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
contract ExampleContract { // defaults to zero uint256 private calledAt; function callMeFirst() external { calledAt = block.number; } function callMeSecond() external { require( calledAt != 0 && block.number > calledAt, "callMeFirst() not called" ); } } |
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۱۶ اردیبهشت ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++C
- ADO.NET
- Adobe Flash
- Ajax
- AngularJS
- apache
- ARM
- Asp.Net
- ASP.NET MVC
- AVR
- Bootstrap
- CCNA
- CCNP
- CMD
- CSS
- Dreameaver
- EntityFramework
- HTML
- IOS
- jquery
- Linq
- Mysql
- Oracle
- PHP
- PHPMyAdmin
- Rational Rose
- silver light
- SQL Server
- Stimulsoft Reports
- Telerik
- UML
- VB.NET&VB6
- WPF
- Xml
- آموزش های پروژه محور
- اتوکد
- الگوریتم تقریبی
- امنیت
- اندروید
- اندروید استودیو
- بک ترک
- بیسیک فور اندروید
- پایتون
- جاوا
- جاوا اسکریپت
- جوملا
- دلفی
- دوره آموزش Go
- دوره های رایگان پیشنهادی
- زامارین
- سئو
- ساخت CMS
- سی شارپ
- شبکه و مجازی سازی
- طراحی الگوریتم
- طراحی بازی
- طراحی وب
- فتوشاپ
- فریم ورک codeigniter
- فلاتر
- کانستراکت
- کریستال ریپورت
- لاراول
- معماری کامپیوتر
- مهندسی اینترنت
- هوش مصنوعی
- یونیتی
- کتاب های آموزشی
- Android
- ASP.NET
- AVR
- LINQ
- php
- Workflow
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس