قراردادها در Solidity مشابه کلاسهای زبانهای شیگرا هستند. هر قرارداد میتواند شامل اعلانهایی از متغیرهای حالت، توابع، اصلاحکنندههای تابع، رویدادها، خطاها، انواع ساختار و انواع Enum باشد. علاوه بر این، قراردادها میتوانند از قراردادهای دیگر ارث ببرند. انواع خاصی از قراردادها به نام کتابخانهها و رابطها نیز وجود دارد. بخش مربوط به قراردادها حاوی جزئیات بیشتری نسبت به این بخش است که به ارائه یک
Table of contents [Show]
قراردادها در Solidity مشابه کلاسهای زبانهای شیگرا هستند. هر قرارداد میتواند شامل اعلانهایی از متغیرهای حالت، توابع، اصلاحکنندههای تابع، رویدادها، خطاها، انواع ساختار و انواع Enum باشد. علاوه بر این، قراردادها میتوانند از قراردادهای دیگر ارث ببرند. انواع خاصی از قراردادها به نام کتابخانهها و رابطها نیز وجود دارد. بخش مربوط به قراردادها حاوی جزئیات بیشتری نسبت به این بخش است که به ارائه یک نمای کلی سریع کمک میکند.
پیشنهاد ویژه: آموزش رایگان سالیدیتی
متغیرهای حالت متغیرهایی هستند که مقادیر آنها به طور دائم در مخزن قرارداد ذخیره می شود.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract SimpleStorage {
uint storedData; // State variable
// Additional functions or logic can be added here
}
برای دیدن انواع متغیرهای حالت معتبر و قابلیت مشاهده آنها و گیرندهها برای انتخابهای احتمالی برای مشاهده انواع متغیرها، به بخش انواع مراجعه کنید.
توابع، واحد اجرایی کد هستند. توابع معمولاً در داخل قرارداد تعریف میشوند، اما در خارج از قراردادها نیز میتوانند تعریف شوند.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;
contract SimpleAuction {
function bid() public payable {
// Function logic goes here
// ...
}
}
// 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 to restrict access to the seller
require(
msg.sender == seller,
"Only seller can call this."
);
_;
}
function abort() public view onlySeller {
// Modifier usage
// Function logic goes here
// ...
}
}
رویدادها رابطهای راحتی برای ورود به امکانات EVM هستند.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.21 <0.9.0;
contract SimpleAuction {
// Event declaration
event HighestBidIncreased(address bidder, uint amount);
function bid() public payable {
// Logic for bidding goes here
// ...
// Triggering the event
emit HighestBidIncreased(msg.sender, msg.value);
}
}
برای اطلاع از چگونگی اعلام رویدادها و استفاده از آنها از طریق 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;
// Additional logic can go here
}
}
برای اطلاعات بیشتر به خطاها و دستورات Revert در قسمت قراردادها مراجعه کنید.
Structها انواع تعریف شده سفارشی هستند که میتوانند متغیرهای مختلفی را گروه بندی کنند (به بخش Structها در بخش انواع مراجعه کنید.)
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract Ballot {
struct Voter {
// Struct definition for a voter
uint weight;
bool voted;
address delegate;
uint vote;
}
}
از Enums میتوان برای ایجاد انواع سفارشی با مجموعه محدودی از “مقادیر ثابت ” استفاده کرد (به قسمت Enumها در بخش انواع مراجعه کنید.)
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract Purchase {
// Enum to represent the state of the purchase
enum State { Created, Locked, Inactive }
}