ویرگول
ورودثبت نام
sepisoltani
sepisoltani
خواندن ۵ دقیقه·۳ سال پیش

آموزش زبان Solidity (قسمت چهارم)

مفهوم event در سالیدیتی چیست؟

فرض کنید لازم است هنگامی که یک اتفاقی داخل بلاکچین رخ داد یک سری عملیات دیگری به صورت اتوماتیک شروع بشود. در این مواقع شما باید یک رخداد یا یک event داخل contract تعریف کنید. سپس هر موقع آن اتفاق خاص اتفاق افتاد این event را emit یا اجرا کنید. سپس در قسمت های مختلف دیگری می توان به این event گوش داد و اقدامات لازم را انجام داد.به مثال زیر دقت کنید:

https://gist.github.com/sepisoltani/035cfa13bb60f6b58c6a4e35f2fb4cdc

در contract فوق یک فانکشن با اسم add تعریف شده است که ۲ عدد دریافت می کند و سپس مقدار را بر میگرداند. یک event با نام IntegersAdded نیز در بالای contract تعریف شده است. در بدنه ی فانکشن هنگامی که عملیات جمع پایان می پذیرد event به اصطلاح fire می شود ( یا emit می شود). حال هر کجای contract یا هر کجا از front end برنامه (در جاوا اسکریپت) می توان به این رخداد گوش داد و هنگامی که این event رخ داد اقدامات لازم را انجام داد . مثلا یک alert به کاربر نمایش داد. نمونه کد جاوااسکریپ برای گوش دادن به event ها می تواند به صورت زیر باشد:

https://gist.github.com/sepisoltani/e05ca9e0ad51eee96c418378a228544b

مفهوم address در سالیدتی چیست و چه کاربری دارد؟

بلاک چین اتریوم از حساب ها (account) تشکیل شده است که می توانید مانند حساب های بانکی به آنها فکر کنید. یک حساب دارای یک balance یا مانده اتر (Ether) (ارز مورد استفاده در بلاک چین اتریوم) است و می توانید پرداخت های اتر را به سایر حساب ها ارسال و دریافت کنید ، درست مانند حساب بانکی شما که می تواند پول را به حساب های بانکی دیگر منتقل کند.

هر حساب یا account دارای یک address است که می توانید مانند شماره حساب بانکی به آن فکر کنید. این یک شناسه منحصر به فرد است که به آن حساب اشاره می کند.در واقع باید بدانید که هر آدرس متعلق به یک کاربر خاص (یا یک قرارداد هوشمند خاص) است. در سالیدی address ها یک نوع دیتا تایپ هم هستند. فرمت ظاهری address ها به صورت زیر هستند :

0x0cE446255506E92DF41614C46F1d6df9Cc969183

مفهوم mapping در سالیدیتی چیست و چه کاربردی دارد؟

تا به اینجای کار با چند دیتا تایپ در سالیدیتی آشنا شده ایم. دیتا تایپ دیگری مانند آرایه نیز وجود دارد که به آن map می گویند. map ها هم برای نگه داری اطلاعات استفاده می شوند ولی به صورت key و value هستند. مانند آرایه های key value در زبان PHP. به مثال زیر دقت کنید:

https://gist.github.com/sepisoltani/93582f518205b7671d690be26afa5166

در قرارداد فوق یک map به اسم accountBalance تعریف شده است. در این map می توان اطلاعات را به صورت key value ذخیره کرد. یعنی هر آدرس به یک عدد از نوع uint اشاره کند.از این روش می توانیم در برنامه های مالی استفاده کنیم. یعنی موجودی هر شخص را به آدرس خودش مپ کنیم. در آینده می توانیم از map استفاده کنیم و موجودی هر آدرسی که خواستیم را دریافت کنیم.

مفهوم msg.sender در سالیدیتی چیست و چه کاربری دارد؟

در سالیدیتی ، متغیرهای global خاصی وجود دارد که برای همه فانکشن ها در دسترس است. یکی از آن ها msg.sender است که به آدرس شخص (یا قرارداد هوشمند) که فانکشن فعلی را فراخوانده است اشاره می کند.

توجه: در سالیدیتی ، اجرای فانکشن های contract ها همیشه باید با یک عنصر خارجی شروع شود. یک contract روی بلاکچین هیچ کار خاصی انجام نمی دهد تا زمانی که کسی یکی از فانکشن های آن را فراخوانی کند. بنابراین همیشه یک عنصر خارجی که یک فانکشن از contract را کال کند وجود خواهد داشت. آدرس این شخص یا قرارداد هوشمند را می توان به کمک msg.sender دریافت کرد.به مثال زیر دقت کنید:

https://gist.github.com/sepisoltani/12e6b9247a055a86e8814ba7874d0e79

یک mapping با اسم favoriteNumber تعریف شده که می تواند جفت هایی به صورت آدرس و یک عدد مورد علاقه آن آدرس را ذخیره کند. یک فانکشن به اسم setMyNumber نیز تعریف شده که یک عدد را دریافت می کند و چون به صورت public نیز تعریف شده همه می توانند آن را فراخوانی کنند و یک عدد برای آن ارسال کنند. سپس این فانکشن این عدد را داخل mapping به آدرس شخصی که این فانکشن را صدا زده (msg.sender) مپ می کند و ذخیره می کند. فانکشن دیگری نیز به صورت public تعریف شده است که باز هم چون به صورت public تعریف شده هر شخصی می تواند این فانکشن را صدا بزند. سپس این فانکشن با استفاده از msg.sender از map عدد مورد علاقه آن ادرس را می خواند و بر می گرداند. در صورتی که آدرس در داخل map یافت نشود عدد صفر return می شود.

مفهوم require در سالیدیتی چیست و چه کاربردی دارد ؟

گاهی لازم است یک فانکشن فقط در صورتی که یک شرط بر قرار باشد اجرا شود. در غیر این صورت خطایی رخ بدهد و کد اجرا نشود. در این مواقع require استفاده می شود. به مثال زیر دقت کنید:

https://gist.github.com/sepisoltani/883d638a3bde231f3a7687aeddf0e869

در مثال فوق یک فانکشن با اسم sayHiToVitalik تعریف شده است که یک name به صورت string دریافت می کند و یک رشته با مقدار Hi را return می کند. در مثال فوق از require استفاده شده است تا فقط در صورتی که پارامتر ارسالی به فانکشن هنگام فراخوانی مساوی با مقدار Vitalik بود مقدار Hi بازگشت داده شود. در هنگام فراخوانی این فانکشن اگر هر مقدار به جز Vitalik ارسال شود require جلوی اجرای فانکشن را می گیرد و برنامه خطا می دهد.

از require بیشتر در مواقعی استفاده می شود که نیاز داشته باشیم هر کاربر یا آدرس فقط یک بار یک فانکشن را فراخوانی کند.



امیدوارم این قسمت مورد توجه شما قرار گرفته باشد.

در قسمت بعدی موارد بیشتری را پوشش می دهم. در صورتی که نیاز داشتید حتما مطالب قسمت های قبلی را نیز مطالعه کنید.

در صورتی که تمایل داشتید می توانید من را در لینکدین دنبال کنید و یا سوالات خود را در نظرات بپرسید. ممنونم




سالیدیتیآموزش سالیدیتیبلاک‌چیناتریومsolidity
Senior backend developer
شاید از این پست‌ها خوشتان بیاید