مدیریت خطا در سالیدیتی
1 مرداد 1401 1401-05-01 13:08مدیریت خطا در سالیدیتی
مدیریت خطا در سالیدیتی
زبان برنامه نویسی سالیدیتی عملکردهای زیاد و مختلفی برای مدیریت خطا دارد. خطاها ممکن است در زمان کامپایل یا زمان اجرا رخ دهند.به طور کلی هنگامی که یک خطا رخ می دهد، وضعیت به حالت اولیه خود برمی گردد.بررسی های دیگر خطا برای جلوگیری از دسترسی غیرمجاز به کد است. سالیدیتی به byte code کامپایل می شود و در آنجا خطای نحوی در زمان کامپایل بررسی می شود، در حالی که خطاهای زمان اجرا دشوار است و عمدتاً هنگام اجرای قراردادها رخ می دهد.برخی از خطاهای زمان اجرا عبارتند از خطای out-of-gas ، خطای سرریز نوع داده ، خطای آرایه خارج از فهرست و … می باشد.بعد از نسخه 4.10 ساختار جدیدی از مدیریت خطاها با عنوان های assert, require, revert معرفی شدند که در بخش زیر به معرفی انواع مدیریت خطا در سالیدیتی خواهیم پرداخت.
جهت دریافت اطلاعات بیشتر قبل از مطالعه مقاله مدیریت خطا در سالیدیتی توصیه می کنیم مقالات و محتواهای آموزش زبان سالیدیتی را هم مطالعه نمایید.
- هر آنچه که باید در مورد اتریوم بدانید
- قرارداد هوشمند یا اسمارت کانترکت (Smart Contract) چیست؟
- چگونه یک برنامه نویس سالیدیتی شویم؟
- کاربردهای برنامه نویسی سالیدیتی
- توسعه قرارداد هوشمند در محیط ریمیکس
- مکان داده در برنامه نویسی سالیدیتی
- دستورات شرطی در سالیدیتی
- دستور Enums در برنامه نویسی سالیدیتی
مدیریت خطا در سالیدیتی (Require)
برای ارزیابی ورودی ها، پیش شرط ها و خروجی های توابع استفاده می شود. در صورت خطا در ارزیابی، سالیدیتی یک خطا به کاربر نمایش می دهد. عبارت require یک پیام خطای اختیاری را می پذیرد. اگر خرابی وجود داشته باشد، تمام گس مصرف نمی شود.عبارات “require” پیش نیازهای اجرای تابع را اعلام می کند، یعنی محدودیت هایی را که باید قبل از اجرای کد رعایت شوند، اعلام می کند. یک آرگومان واحد را می پذیرد و پس از ارزیابی یک مقدار بولی را برمی گرداند، همچنین یک گزینه پیام رشته سفارشی دارد. اگر false باشد، استثنا مطرح می شود و اجرا خاتمه می یابد. Gas استفاده نشده به تماس گیرنده برمی گردد و حالت به حالت اولیه خود برمی گردد.
مثال:درقطعه کد زیر در قرارداد نحوه ی استفاده از حالت require نمایش داده شده است.
// Solidity program to demonstrate require statement
pragma solidity ^0.5.0;
// Creating a contract
contract requireStatement {
// Defining function to check input
function checkInput(uint _input) public view returns(string memory){
require(_input >= 0, "invalid uint8");
require(_input <= 255, "invalid uint8");
return "Input is Uint8";
}
// Defining function to use require statement
function Odd(uint _input) public view returns(bool){
require(_input % 2 != 0);
return true;
}
}
مثالی دیگر از مدیریت خطا حالت require
Function deposit (uint _amount) public {
Uint oldBalance = balance;
Uint newBalance = balance +amount
Require(newBalance >= oldBalance, “Overflow”); // we need to check the requirement first then update the balance
Balance += +amount; // after checking our condition then perform adding the amount to the balance
Assert(balance>= +amount; // this assert statement should be true
تصویر مربوط به کدهای Require در محیط ریمیکس
مدیریت خطا در سالیدیتی (Assert)
سینتکس آن مشابه عبارت require است. پس از ارزیابی شرط، یک مقدار بولی برمی گرداند. بر اساس مقدار بازگشتی یا برنامه به اجرای خود ادامه می دهد یا یک استثنا ایجاد می کند. به جای بازگرداندن Gas استفاده نشده، عبارت assert کل منبع Gas را مصرف می کند و سپس حالت به حالت اولیه بر می گردد. Assert برای بررسی وضعیت فعلی و شرایط عملکرد قبل از اجرای قرارداد استفاده می شوداز Assert برای بررسی شرایطی استفاده می شود که هرگز نباید امکان پذیر باشد. Assert باید همیشه درست ارزیابی شوند و هرگز نباید شکست بخورند. اگر شکست بخورند، یک اشکال در کد به وجود می آید و شبکه تمام گس را مصرف می کند و تراکنش برگشت داده می شود.
مثال:درقطعه کد زیر در قرارداد نحوه ی استفاده از حالت Assert نمایش داده شده است.
// Solidity program to demonstrate assert statement
pragma solidity ^0.5.0;
// Creating a contract
contract assertStatement {
// Defining a state variable
bool result;
// Defining a function to check condition
function checkOverflow(uint _num1, uint _num2) public {
uint sum = _num1 + _num2;
assert(sum<=255);
result = true;
}
// Defining a function to print result of assert statement
function getResult() public view returns(string memory){
if(result == true){
return "No Overflow";
}
else{
return "Overflow exist";
}
}
}
تصویر مربوط به کدهای Assert در محیط ریمیکس
مثالی دیگر از مدیریت خطا حالت Assert
مدیریت خطا در سالیدیتی (Revert)
این عبارت مشابه عبارت require است. هیچ شرطی را ارزیابی نمی کند و به هیچ حالت یا عبارتی بستگی ندارد. برای ایجاد استثناها، نمایش خطاها و برگرداندن فراخوانی تابع استفاده می شود. این عبارت حاوی یک پیام رشته ای است که مشکل مربوط به اطلاعات استثنا را نشان می دهد. فراخوانی عبارت revert به این معنی است که یک استثنا نمایش داده می شود، Gas استفاده نشده برمی گردد و حالت به حالت اولیه خود باز می گردد. Revert برای رسیدگی به انواع استثناهای مورد نیاز استفاده می شود، اما با منطق کمی پیچیده تر.(Revert) شبیه به (Require) است اما فقط یک آرگومان می گیرد که پیام خطا است. هنگامی که شرایط بررسی پیچیده است، استفاده از Revert ممکن است بهتر باشد.
مثال:درقطعه کد زیر در قرارداد نحوه ی استفاده از حالت Revert نمایش داده شده است.
// Solidity program to demonstrate revert statement
pragma solidity ^0.5.0;
// Creating a contract
contract revertStatement {
// Defining a function to check condition
function checkOverflow(uint _num1, uint _num2) public view returns(string memory, uint){
uint sum = _num1 + _num2;
if(sum < 0 || sum > 255){
revert(" Overflow Exist");
}
else{
return ("No Overflow", sum);
}
}
}
}
تصویر مربوط به کدهای Revert در محیط ریمیکس
مثالی دیگر از مدیریت خطا حالت Revert
منبع کدهای مقاله مدیریت خطا در سالیدیتی
وب سایت: geeksforgeeks