برگردیم به مثال سادهای از یک قرارداد ERC20 که در آن یک متغیر به نام banker
را مستقیماً داخل بدنه قرارداد مقداردهی کردیم:
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 |
contract ERC20 { address public banker = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4; mapping(address => uint256) public balances; function setSomeonesBalance( address owner, uint256 amount ) public { if (msg.sender == banker) { balances[owner] = amount; } // do nothing } function transfer( address receiver, uint256 amount ) public { balances[msg.sender] -= amount; balances[receiver] += amount; } } |
در این مثال، مقدار banker
بهصورت ثابت در قرارداد نوشته شده. اما اگر شخصی بخواهد خودش قرارداد را مستقر (deploy) کند و خودش را بهعنوان banker تعیین کند، چه کار باید کرد؟
معرفی تابع Constructor در سالیدیتی
در زبان برنامه نویسی Solidity که برای نوشتن قراردادهای هوشمند در بلاک چین اتریوم استفاده میشود، تابعی ویژه به نام Constructor (سازنده) وجود دارد که تنها یکبار و هنگام استقرار (Deploy) قرارداد اجرا میشود. این تابع مانند سازنده ها در زبان های شی گرا مثل Python یا Java عمل میکند و معمولاً برای تنظیم مقادیر اولیه، تعیین مالک (owner) یا تعریف متغیرهایی مانند banker
به کار میرود.
مثال:
1 2 3 4 5 6 7 8 |
contract ExampleContract { address public banker; constructor() { deployer = msg.sender; } } |
توجه داشته باشید که:
-
نام تابع باید فقط
constructor()
باشد (بدون کلید واژهfunction
). -
نیازی به مشخصکردن
public
یا دیگر مشخصه ها (مانندview
,pure
) نیست، چون برای constructor مجاز نیستند.
ارسال آرگومان به Constructor در سالیدیتی
اگر بخواهید شخص استقرار دهنده، آدرس banker را مشخص کند، میتوانید از آرگومان استفاده کنید:
1 2 3 4 5 6 7 8 |
contract ExampleContract { address public banker; constructor(address _banker) { banker = _banker; } } |
ضمناً، الگوی نگارشی مانند variable = _variable
را در سازنده ها (constructor ها) زیاد مشاهده خواهید کرد. زبان Solidity شما را مجبور به استفاده از این الگو نمیکند، اما بهعنوان یک عرف رایج و متداول در کدنویسی در نظر گرفته میشود.
زمانی که در Remix قصد دارید قراردادی را که دارای آرگومان های سازنده است مستقر (Deploy) کنید، باید مقادیر آن آرگومان ها را در کادری وارد کنید که در کنار دکمه «Deploy» نمایش داده میشود.
برخلاف سایر توابع، نمیتوان از calldata
برای آرایه ها و رشته ها (strings) استفاده کرد؛ در این موارد باید از memory
استفاده شود.
همچنین، به دلایلی که فعلاً وارد آنها نمیشویم، استفاده از calldata
در آرگومان های سازنده (constructor) امکان پذیر نیست. میدانم که این محدودیت عجیب و بیمنطق به نظر میرسد، اما وقتی با نحوه عملکرد داخلی اتریوم بیشتر آشنا شوید، این موضوع برایتان منطقی خواهد شد.
در ادامه مثالی آمده که نشان میدهد چگونه میتوان یک رشته (string) را هنگام استقرار قرارداد تنظیم کرد:
1 2 3 4 5 6 7 8 |
contract ExampleContract { string public name; // if you use calldata, it won't compile constructor(string memory _name) { name = _name; } } |
ممکن است وسوسه شوید که بهجای درگیری با calldata
، همیشه از memory
استفاده کنید. اما بهتر است فعلاً این نکته را به خاطر بسپارید، زیرا استفاده از calldata
در شرایط مناسب، منجر به کاهش هزینه تراکنش ها (یعنی گس فی کمتر برای کاربر) خواهد شد.
و در نهایت، اگر برایتان سوال پیش آمده: سازنده ها (constructors) نمیتوانند مقداری را بازگردانند (return کنند).
راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.
- انتشار: ۱۱ اردیبهشت ۱۴۰۴
دسته بندی موضوعات
- آموزش ارز دیجیتال
- آموزش برنامه نویسی
- آموزش متنی برنامه نویسی
- اطلاعیه و سایر مطالب
- پروژه برنامه نویسی
- دوره های تخصصی برنامه نویسی
- رپورتاژ
- فیلم های آموزشی
- ++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
- اچ تی ام ال
- بانک اطلاعاتی
- برنامه نویسی سوکت
- برنامه نویسی موبایل
- پاسکال
- پایان نامه
- پایتون
- جاوا
- جاوا اسکریپت
- جی کوئری
- داده کاوی
- دلفی
- رباتیک
- سئو
- سایر کتاب ها
- سخت افزار
- سی اس اس
- سی پلاس پلاس
- سی شارپ
- طراحی الگوریتم
- فتوشاپ
- مقاله
- مهندسی نرم افزار
- هک و امنیت
- هوش مصنوعی
- ویژوال بیسیک
- نرم افزار و ابزار برنامه نویسی
- وردپرس