ساختار یک قرارداد
قراردادها در Solidity مشابه کلاسهای زبانهای شیگرا هستند. هر قرارداد میتواند شامل اعلانهایی از متغیرهای حالت، توابع، اصلاحکنندههای تابع، رویدادها، خطاها، انواع ساختار و انواع Enum باشد. علاوه بر این، قراردادها میتوانند از قراردادهای دیگر ارث ببرند. انواع خاصی از قراردادها به نام کتابخانهها و رابطها نیز وجود دارد. بخش مربوط به قراردادها حاوی جزئیات بیشتری نسبت به این بخش است که به ارائه یک نمای کلی سریع کمک میکند.
متغیرهای حالت
متغیرهای حالت متغیرهایی هستند که مقادیر آنها به طور دائم در مخزن قرارداد ذخیره می شود.
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.0 <0.9.0; contract SimpleStorage { uint storedData; // State variable // ... }
برای دیدن انواع متغیرهای حالت معتبر و قابلیت مشاهده آنها و گیرندهها برای انتخابهای احتمالی برای مشاهده انواع متغیرها، به بخش انواع مراجعه کنید.
توابع
توابع، واحد اجرایی کد هستند. توابع معمولاً در داخل قرارداد تعریف میشوند، اما در خارج از قراردادها نیز میتوانند تعریف شوند.
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.1 <0.9.0; contract SimpleAuction { function bid() public payable { // Function // ... } } // Helper function defined outside of a contract function helper(uint x) pure returns (uint) { return x * 2; }
فراخوانی توابع میتوانند به صورت داخلی یا خارجی اتفاق بیفتند و دارای قابلیت مشاهده مختلفی نسبت به سایر قراردادها هستند. توابع پارامترها را میپذیرند و متغیرها را برمیگردانند تا پارامترها و مقادیر بین آنها منتقل شود.
توابع اصلاح کننده
از تابع اصلاح کنندهها میتوان برای اصلاح معناشناسی (semantics ) توابع به روشی اعلانی استفاده کرد (به توابع اصلاح کننده در بخش قراردادها مراجعه کنید.) اضافه بار ، به این معنا که داشتن نام اصلاح کننده یکسان با پارامترهای مختلف، امکان پذیر نیست. مانند توابع، اصلاح کنندهها را میتوان لغو کرد.
مانند توابع، اصلاح کنندهها نیز میتوانند نادیده گرفته شوند.
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.22 <0.9.0; contract Purchase { address public seller; modifier onlySeller() { // Modifier require( msg.sender == seller, "Only seller can call this." ); _; } function abort() public view onlySeller { // Modifier usage // ... } }
رویدادها
رویدادها رابطهای راحتی برای ورود به امکانات EVM هستند.
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.21 <0.9.0; contract SimpleAuction { event HighestBidIncreased(address bidder, uint amount); // Event function bid() public payable { // ... emit HighestBidIncreased(msg.sender, msg.value); // Triggering event } }
برای اطلاع از چگونگی اعلام رویدادها و استفاده از آنها از طریق dapp، به بخش رویدادها در بخش قراردادها مراجعه کنید.
خطاها
خطاها به شما امکان میدهند نامها و دادههای توصیفی را برای شرایط شکست تعریف کنید. از خطاها میتوان در دستورات revert استفاده کرد. در مقایسه با توضیحات رشته ، خطاها بسیار ارزانتر هستند و به شما امکان میدهند دادههای اضافی را رمزگذاری کنید. برای توصیف خطا برای کاربر میتوانید از NatSpec استفاده کنید.
// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.4; /// Not enough funds for transfer. Requested `requested`, /// but only `available` available. error NotEnoughFunds(uint requested, uint available); contract Token { mapping(address => uint) balances; function transfer(address to, uint amount) public { uint balance = balances[msg.sender]; if (balance < amount) revert NotEnoughFunds(amount, balance); balances[msg.sender] -= amount; balances[to] += amount; // ... } }
برای اطلاعات بیشتر به خطاها و دستورات Revert در قسمت قراردادها مراجعه کنید.
انواع Struct
Structها انواع تعریف شده سفارشی هستند که میتوانند متغیرهای مختلفی را گروه بندی کنند (به بخش Structها در بخش انواع مراجعه کنید.)
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.0 <0.9.0; contract Ballot { struct Voter { // Struct uint weight; bool voted; address delegate; uint vote; } }
انواع Enum
از Enums میتوان برای ایجاد انواع سفارشی با مجموعه محدودی از “مقادیر ثابت ” استفاده کرد (به قسمت Enumها در بخش انواع مراجعه کنید.)
// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.4.0 <0.9.0; contract Purchase { enum State { Created, Locked, Inactive } // Enum }