توابع Payable در قراردادهای هوشمند Solidity
تابع payable در قرارداد سالیدیتی
توابع Payable در قراردادهای هوشمند Solidity یا تابع قابل پرداخت (payable functions in solidity) به منظور اطمینان از ارسال پول به قرارداد و خارج از آن در زمان نوشتن یک قرارداد هوشمند، مورد استفاده قرار میگیرد. هر تابعی در زبان برنامه نویسی سالیدیتی به کمک این تابع اصلاحکننده این اطمینان را برای شما فراهم میکند که میتواند اتر را دریافت و ارسال کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // تعریف قرارداد هوشمند contract payableSample{ // تعریف تابعی قابل پرداخت // برای دربافت اتر function fundMe() public payable {} // تعریف تابعی برای برداشت // transfer با استفاده از function withdraw() public { payable(msg.sender).transfer(address(this).balance); } // تعریف تابعی برای برداشت // send با استفاده از function withdrawSend() public returns(bool) { (bool status) = payable(msg.sender).send(address(this).balance); returns status; } // تعریف تابعی قابل پرداخت برای // call برداشت با استفاده از function withdrawCall() public payable { (bool callSuccess, ) = payable(msg.sender).call{value: address(this).balance}(""); require(callSuccess, "Call failed"); } } |
تابع قابل پرداخت، تراکنشهایی با اتر صفر را نمیپذیرد و تنها آن تراکنشهایی را پردازش میکند که اتر آنها صفر نباشد. در نتیجه اگر تابعی را برای پردازش تراکنشها فراخوانی کرده اید اما کلمه کلیدی Payable را وارد نکرده اید، تراکنش خودبهخود رد میشود. با این مقاله در توکن خان همراه باشید تا بیشتر با این توابع آشنا شوید.
قبل از مطالعه کامل مقاله “توابع Payable در قراردادهای سالیدیتی” پیشنهاد میکنیم مقالات دیگر حوزه آموزش برنامه نویسی سالیدیتی را هم مطالعه کنید.
نحوه ایجاد توکن ERC721 با قرارداد هوشمند
انواع داده ها و متغیرها در سالیدیتی (solidity)
کتابخانه ها (Library) در قراردادهای هوشمند Solidity
گس فی GAS FEE در شبکه اتریوم چیست؟
استفاده از Import در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
اهمیت استفاده از توابع Payable در قراردادهای هوشمند Solidity
کلمه کلیدی Payable به شما اجازه میدهد تا اتر را به یک قرارداد ارسال کنید و کدی را برای حساب این سپرده اجرا کنید. این کد به طور بالقوه میتواند یک رویداد (event) را ثبت کند، فضای ذخیرهسازی (storage) را برای ذخیره سپرده تغییر دهد، یا حتی در صورت تمایل میتواند تراکنش را برگرداند (revert).
وقتی یک توسعهدهنده صریحاً یک قرارداد هوشمند را با نوع قابل پرداخت علامتگذاری میکند، در واقع میگوید که : ” انتظار دارم اتر به این تابع ارسال شود “. برای درک اهمیت آن، تصور کنید چقدر بد خواهد بود اگر شخصی اتر را به یک قرارداد بفرستد و توسعهدهنده کدی را برای مدیریت آن رویداد ننویسد. در آن صورت، بسیار محتمل به نظر میرسد که اتر برای همیشه قفل شود یا هرگز توسط گیرنده مورد نظر خود برداشت نشود.
نکات مهم در رابطه با توابع Payable در قراردادهای هوشمند Solidity
در استفاده از توابع Payable در سالیدیتی به موارد زیر توجه کنید :
- برای دریافت یا فرستادن اتر، از کلمه کلیدی Payable در متغیر تابع یا متغیر حالت استفاده کنید.
- برای انصراف از قرارداد، از کلمه کلیدی Payable در متغیر حالت استفاده کنید.
- برای اینکه بتوانید در زمان ایجاد یا استقرار در قرارداد اتر واریز کنید، کلمه کلیدی Payable را در سازنده وارد کنید. سینتکس آن به شکل زیر است :
- constructor() public payable;
- در این حالت دکمه Deploy در ریمیکس قرمز خواهد بود که نشان میدهد میتوانیم هنگام استقرار اتر اضافه کنیم.
- برای اینکه امکان سپردهگذاری در قرارداد ایجاد شود، از کلمه کلیدی Payable در یک تابع استفاده کنید.
کد زیر، یک مثال ساده از توابع Payableدر قراردادهای هوشمند Solidity را نشان میدهد. استفاده از کلمه کلیدی payable در این تابع باعث میشود تا قرارداد دیگری بتواند آن را فراخوانی کند و اتر را به این قرارداد ارسال کند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // تعریف قرارداد هوشمند contract payableSample { // تعریف // state variable uint public balance; // تعریف تابعی قابل پرداخت // برای دربافت اتر function fundMe() public payable{ balance += msg.value; } } |
در مثالی دیگر مشاهده میکنید که متغیرها و توابع روی Payable تنظیم شده است، در صورتی که آدرس (address) قابل پرداخت نبود to.transfer عمل نمیکرد. کدهای این مثال و مثال قبلی را میتوانید در ریمیکس امتحان کنید تا بهتر آنها را درک کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // تعریف قرارداد هوشمند contract payableSample { // payable اضافه کردن کلید واژه // state variable به address payable public Owner; uint public balance; // را به عنوان msg.sender // مالک قرارداد تعیین می کنیم constructor () { Owner = payable(msg.sender); } // مادیفایری جهت مالک بودن // تعریف می کنیم msg.sender modifier onlyOwner() { require(msg.sender == Owner, 'Not owner'); _; } // تعریف تابعی قابل پرداخت // برای دربافت اتر function fundMe() public payable{ balance += msg.value; } // تنها مالک قرارداد می تواند // تابع برداشت را فراخوانی کند function withdraw (uint _amount) public onlyOwner { require(_amount <= balance, "Insufficient balance"); Owner.transfer(_amount); balance -= _amount; } // تنها به دلیل قراردادن transfer // قابل اجراست payable function transfer(address payable _to, uint _amount) public onlyOwner { require(_amount <= balance, "Insufficient balance"); _to.transfer(_amount); balance -= _amount; } } |
جمعبندی
به طور خلاصه توابع Payableدر قراردادهای هوشمند Solidity، تابعی است که میتواند اتر را دریافت کند. استفاده از این توابع به توسعهدهنده این فرصت را میدهد تا به سپرده اتر برای نگهداری سوابق یا هر منطق ضروری اضافی دیگری پاسخ دهد.
منابع معتبر مرتبط:
https://medium.com/coinmonks/how-to-use-payable-function-in-solidity-fa871e79b167
https://codedamn.com/news/solidity/payable-function-in-solidity-example-how-to-use-it
مطالب زیر را حتما مطالعه کنید
بررسی رفتار توابع View و Pure در سالیدیتی Solidity
سالیدیتی Solidity چیست؟
سطح دسترسی Visibility در سالیدیتی Solidity
توابع Function در سالیدیتی Solidity
انواع حافظه در قرارداد هوشمند سالیدیتی
استفاده از Import در سالیدیتی Solidity
8 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
مطلب به درد بخوری بود
این مطلب حرف نداشت
مثل همیشه عالی و کاربردی
مطلب خوبی بود
خیلی دنبال این موضوع بودم
خیلی محتوای خوبی بود مهندس
خیلی محتوای کامل و عالی بود
منابع این مطلب کجاست؟