Error Handling এবং Exception Management (এরর হ্যান্ডলিং এবং এক্সেপশন ম্যানেজমেন্ট)

সলিডিটি (Solidity) - Computer Programming

295

Solidity তে Error Handling এবং Exception Management স্মার্ট কন্ট্রাক্টের উন্নত কার্যকারিতা এবং নিরাপত্তা নিশ্চিত করার জন্য অপরিহার্য। স্মার্ট কন্ট্রাক্টের মধ্যে অনেক সময় ত্রুটি বা ভুল হতে পারে, এবং সেগুলো সঠিকভাবে হ্যান্ডল করা প্রয়োজন যাতে প্রোগ্রামের আচরণ ঠিক থাকে এবং নিরাপত্তা বজায় থাকে। Solidity তে এরর হ্যান্ডলিং সাধারণত require, revert, এবং assert ব্যবহার করে করা হয়।


১. require() – শর্ত যাচাই এবং ত্রুটি ফেরত দেওয়া

require() হল একটি ত্রুটি যাচাই করার ফাংশন যা শর্ত পূর্ণ না হলে একটি ত্রুটি ফেরত দেয় এবং ট্রানজেকশন বাতিল করে। এটি সাধারণত ইনপুট যাচাই এবং শর্তাদি পূর্ণ হলে কার্যক্রম চালানোর জন্য ব্যবহৃত হয়। require() এর মাধ্যমে ব্যবহারকারী বা ডেভেলপার স্মার্ট কন্ট্রাক্টে নিরাপত্তা এবং শর্ত যাচাই করতে পারেন।

require() Syntax
require(condition, "Error message");
  • condition: এটি একটি শর্ত যা সত্য হতে হবে, অন্যথায় ত্রুটি তৈরি হবে।
  • "Error message": একটি কাস্টম ত্রুটি বার্তা যা শর্ত পূর্ণ না হলে প্রদর্শিত হবে।
require() উদাহরণ
pragma solidity ^0.8.0;

contract RequireExample {
    uint256 public balance;

    // Deposit function with require check
    function deposit(uint256 _amount) public {
        require(_amount > 0, "Amount must be greater than zero");
        balance += _amount;
    }
}

এখানে, require() ব্যবহার করা হয়েছে _amount এর মান যাচাই করার জন্য। যদি মান শূন্য বা তার চেয়ে কম হয়, তবে ট্রানজেকশন বাতিল হবে এবং একটি ত্রুটি বার্তা প্রদর্শিত হবে।


২. revert() – শর্তপূরণে ব্যর্থ হলে ট্রানজেকশন বাতিল

revert() একটি Solidity ফাংশন যা সাধারণত ট্রানজেকশন বাতিল করার জন্য ব্যবহৃত হয়। এটি যখন কোনো নির্দিষ্ট শর্ত পূর্ণ না হয়, তখন সেটি ট্রানজেকশন ফিরিয়ে দেয় এবং সমস্ত পরিবর্তন রিভার্ট করে। revert() তে কাস্টম ত্রুটি বার্তা দেয়া যায় যা ব্যবহারকারীদের সমস্যাটি সম্পর্কে জানায়।

revert() Syntax
revert("Error message");
revert() উদাহরণ
pragma solidity ^0.8.0;

contract RevertExample {
    uint256 public balance;

    // Withdraw function with revert check
    function withdraw(uint256 _amount) public {
        if (_amount > balance) {
            revert("Insufficient funds");
        }
        balance -= _amount;
    }
}

এখানে, যদি _amount এর তুলনায় balance কম থাকে, তবে revert() ব্যবহার করা হয় এবং একটি কাস্টম ত্রুটি বার্তা প্রদর্শিত হয়। এই ক্ষেত্রে ট্রানজেকশন বাতিল হয়ে যাবে এবং কোনো পরিবর্তন করা হবে না।


৩. assert() – অবস্থান যাচাই এবং ত্রুটি সৃষ্টি করা

assert() হল এমন একটি ফাংশন যা শর্ত পূর্ণ না হলে একটি ত্রুটি তৈরি করে এবং এটি স্মার্ট কন্ট্রাক্টের মধ্যে ভুল বা অস্বাভাবিক অবস্থা চিহ্নিত করতে ব্যবহৃত হয়। assert() সাধারণত কোডের অবস্থা যাচাই করতে ব্যবহৃত হয় যেমন, কোনো সংখ্যা খারাপভাবে পরিবর্তিত হয়েছে কিনা বা ফাংশনটি সঠিকভাবে কার্যকর হচ্ছে কিনা।

assert() Syntax
assert(condition);
  • condition: এটি একটি শর্ত যা অবশ্যই সত্য হতে হবে। যদি এটি সত্য না হয়, তাহলে একটি ত্রুটি ঘটবে।
assert() উদাহরণ
pragma solidity ^0.8.0;

contract AssertExample {
    uint256 public balance;

    // Deposit function with assert check
    function deposit(uint256 _amount) public {
        uint256 oldBalance = balance;
        balance += _amount;
        assert(balance >= oldBalance);  // Ensures balance doesn't decrease
    }
}

এখানে, assert() ব্যবহার করা হয়েছে কোডে অবস্থা যাচাই করার জন্য। যদি balance এর মান আগের মানের চেয়ে কম হয়, তবে এটি একটি ত্রুটি তৈরি করবে এবং ট্রানজেকশনটি বাতিল হবে।


৪. Error Types (এরর টাইপস)

Solidity তে তিনটি প্রধান এরর টাইপ রয়েছে:

  • require errors: শর্ত পূর্ণ না হলে এটি সাধারণত ব্যবহার হয় এবং এটি ব্যবহারকারী ইনপুট বা অবস্থার জন্য উপযুক্ত।
  • revert errors: বিশেষত লজিক্যাল ত্রুটি এবং চুক্তির ভুল অবস্থা চিহ্নিত করতে ব্যবহৃত হয়।
  • assert errors: এটি এমন ত্রুটি চিহ্নিত করতে ব্যবহৃত হয় যা কোডের লজিক বা অবস্থা যাচাই করার জন্য ব্যবহৃত হয় এবং সাধারণত অভ্যন্তরীণ ত্রুটির জন্য।

৫. Custom Errors (কাস্টম এররস)

Solidity তে কাস্টম এররস ডিফাইন করা যেতে পারে যাতে স্পষ্ট ত্রুটি বার্তা প্রদান করা যায়। এটি কোডে আরও বিস্তারিত ত্রুটি বার্তা যুক্ত করতে সহায়ক।

Custom Error Declaration (কাস্টম এরর ঘোষণা)
pragma solidity ^0.8.0;

contract CustomErrorExample {
    // Custom error declaration
    error InsufficientFunds(uint256 requested, uint256 available);

    uint256 public balance;

    function withdraw(uint256 _amount) public {
        if (_amount > balance) {
            revert InsufficientFunds(_amount, balance);  // Custom error usage
        }
        balance -= _amount;
    }
}

এখানে, InsufficientFunds নামে একটি কাস্টম এরর তৈরি করা হয়েছে যা প্রয়োজনীয় এবং উপলব্ধ তহবিলের মান প্রদর্শন করবে যখন ব্যবহারকারী পর্যাপ্ত অর্থ উত্তোলন করতে চেষ্টা করবে।


সারাংশ

Solidity তে Error Handling এবং Exception Management খুবই গুরুত্বপূর্ণ, কারণ স্মার্ট কন্ট্রাক্টে কোনো ত্রুটি বা ভুলের ক্ষেত্রে সঠিকভাবে ট্রানজেকশন বাতিল এবং ত্রুটি বার্তা প্রদর্শন করা প্রয়োজন। require(), revert(), এবং assert() হল সাধারণভাবে ব্যবহৃত ত্রুটি পরিচালনা ফাংশন। এছাড়া, custom errors ব্যবহার করে কাস্টম ত্রুটি বার্তা তৈরি করা যায় যা স্মার্ট কন্ট্রাক্টের কার্যকারিতা এবং নিরাপত্তা নিশ্চিত করে। Proper error handling স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টে একটি অপরিহার্য অংশ।

Content added By

Solidity তে Errors এবং Exceptions হল এমন মেকানিজম যা স্মার্ট কন্ট্রাক্টে সমস্যা বা ত্রুটি চিহ্নিত করতে ব্যবহৃত হয়। এটি কন্ট্রাক্টের কার্যকারিতা এবং নিরাপত্তা নিশ্চিত করতে সাহায্য করে, কারণ এদের মাধ্যমে আমরা ভুল ইনপুট, অযাচিত লেনদেন, কিংবা অপ্রত্যাশিত পরিস্থিতি থেকে সুরক্ষা পেতে পারি।

1. Exceptions

Exceptions হল এমন একটি পরিস্থিতি যেখানে কোন একটি ফাংশন বা কার্যক্রম প্রত্যাশিতভাবে সম্পন্ন না হয়ে ত্রুটি তৈরি করে। Solidity তে যদি কোন ত্রুটি ঘটে, তবে সেই কার্যক্রম থেমে যায় এবং ত্রুটির কারণ ফিরিয়ে দেয়। এর মাধ্যমে আপনি কিছু পূর্বনির্ধারিত শর্ত পূর্ণ না হলে কার্যক্রম বন্ধ করতে পারেন।

Solidity তে Exception Handling

Solidity তে Exceptions হ্যান্ডেল করার জন্য require, revert, এবং assert ব্যবহার করা হয়। এগুলি মূলত স্মার্ট কন্ট্রাক্টে ভুল ইনপুট বা শর্তগত ত্রুটি চিহ্নিত করতে ব্যবহৃত হয়।

require()

require ফাংশনটি একটি শর্ত যাচাই করতে ব্যবহৃত হয় এবং যদি শর্তটি মিথ্যা হয়, তবে এটি একটি revert ত্রুটি সৃষ্টি করে এবং সমস্ত পরিবর্তন বাতিল করে দেয়। এটি সাধারণত ইনপুট ভ্যালিডেশন বা শর্ত যাচাইয়ের জন্য ব্যবহৃত হয়।

pragma solidity ^0.8.0;

contract Example {
    uint public balance;

    function deposit(uint _amount) public {
        require(_amount > 0, "Amount must be greater than zero");
        balance += _amount;
    }
}

ব্যাখ্যা:

  • এখানে require(_amount > 0, "Amount must be greater than zero") চেক করবে যে প্রেরিত পরিমাণ শূন্যের বেশি কিনা।
  • যদি এই শর্ত পূর্ণ না হয়, তবে একটি ত্রুটি হবে এবং লেনদেনটি বাতিল হয়ে যাবে।
revert()

revert ফাংশনটি কোনো অবস্থায় লেনদেন বা কার্যক্রম বাতিল করার জন্য ব্যবহৃত হয়। এটি একটি কাস্টম ত্রুটি বার্তা দিতে পারে, যা ডেভেলপার বা ব্যবহারকারীর জন্য ত্রুটির কারণ জানায়।

pragma solidity ^0.8.0;

contract Example {
    uint public balance;

    function withdraw(uint _amount) public {
        if (_amount > balance) {
            revert("Insufficient balance");
        }
        balance -= _amount;
    }
}

ব্যাখ্যা:

  • revert("Insufficient balance") কাস্টম ত্রুটি বার্তা সহ লেনদেন বাতিল করে দেয় যদি অ্যাকাউন্টে পর্যাপ্ত পরিমাণ ব্যালেন্স না থাকে।
assert()

assert ফাংশনটি মূলত কোডের অখণ্ডতা নিশ্চিত করার জন্য ব্যবহৃত হয়। এটি একটি শর্ত যাচাই করে এবং যদি শর্তটি মিথ্যা হয়, তবে ত্রুটি সৃষ্টি করে। সাধারণত এটি ইন্টারনাল চেক এবং ভুল কোডের জন্য ব্যবহৃত হয়।

pragma solidity ^0.8.0;

contract Example {
    uint public balance;

    function withdraw(uint _amount) public {
        uint prevBalance = balance;
        balance -= _amount;
        assert(balance == prevBalance - _amount);  // নিশ্চিত করা যে ব্যালেন্স সঠিকভাবে কমে গেছে
    }
}

ব্যাখ্যা:

  • assert(balance == prevBalance - _amount) নিশ্চিত করবে যে ব্যালেন্স সঠিকভাবে কমেছে। যদি শর্তটি ভুল হয়, তবে এটি একটি ত্রুটি সৃষ্টি করবে।

2. Errors

Solidity তে Errors হলো এমন ধরনের ত্রুটি যা প্রোগ্রাম চলাকালীন সময় ঘটতে পারে। এখানে দুটি প্রধান ধরনের ত্রুটি রয়েছে: Revert Errors এবং Panic Errors

Revert Errors

revert ত্রুটির মধ্যে custom errors অন্তর্ভুক্ত থাকে, যা ডেভেলপারদের জন্য একটি কাস্টম ত্রুটি বার্তা তৈরি করার সুযোগ দেয়। এটি স্মার্ট কন্ট্রাক্টের কার্যক্রম ব্যর্থ হওয়া বা ইনপুট ভুল হওয়া সনাক্ত করে এবং সঠিক ত্রুটি বার্তা প্রদান করে।

Custom Errors Example:

pragma solidity ^0.8.0;

error InsufficientBalance(uint requested, uint available);

contract Example {
    uint public balance;

    function withdraw(uint _amount) public {
        if (_amount > balance) {
            revert InsufficientBalance(_amount, balance);  // কাস্টম ত্রুটি বার্তা
        }
        balance -= _amount;
    }
}

ব্যাখ্যা:

  • এখানে InsufficientBalance নামে একটি কাস্টম ত্রুটি তৈরি করা হয়েছে, যা আর্গুমেন্ট হিসেবে চাওয়া ও উপলব্ধ ব্যালেন্স গ্রহণ করে এবং শর্ত পূর্ণ না হলে তা ট্রিগার হয়।
Panic Errors

Panic errors হল কিছু ধরনের ত্রুটি যা Solidity তে সাধারণত কোডের ভুল বা অত্যধিক প্রক্রিয়া চলতে গিয়ে ঘটে, যেমন বিভাজন দ্বারা শূন্যে ভাগ করা। Solidity তে কিছু পূর্বনির্ধারিত panic error কোড থাকে, যেমন divide by zero বা out of bounds

pragma solidity ^0.8.0;

contract Example {
    function divide(uint _numerator, uint _denominator) public pure returns (uint) {
        require(_denominator != 0, "Cannot divide by zero");  // Divide by zero চেক
        return _numerator / _denominator;
    }
}

ব্যাখ্যা:

  • এখানে require(_denominator != 0, "Cannot divide by zero") চেক করবে যে, আপনি শূন্যে ভাগ করতে চাচ্ছেন কিনা।
  • যদি শূন্যে ভাগ করার চেষ্টা করা হয়, তাহলে একটি revert ত্রুটি হবে।

3. Error Handling Best Practices

  • require এবং revert সাধারণত ব্যবহার করা হয় যখন আপনি ব্যবহারকারীর ইনপুট বা অপ্রত্যাশিত অবস্থা যাচাই করতে চান। এটি একটি transaction failure সৃষ্টি করে এবং ইউজারকে সঠিক ত্রুটি বার্তা দেয়।
  • assert ব্যবহার করা হয় কেবলমাত্র ইন্টারনাল অবস্থাগুলির জন্য, যেমন কোডের অখণ্ডতা নিশ্চিত করা। এটি সাধারণত কোডের ভুল চেক করতে ব্যবহৃত হয়।
  • Custom errors ব্যবহার করা হলে, সেগুলি কাস্টম বার্তা সহ আরও বিস্তারিত ত্রুটি প্রদান করতে সাহায্য করে।

সারাংশ

Errors এবং Exceptions Solidity তে স্মার্ট কন্ট্রাক্টের কার্যক্রমে ত্রুটি বা সমস্যা চিহ্নিত করার জন্য ব্যবহৃত হয়। Exceptions সাধারণত ত্রুটি বা ব্যর্থতার জন্য ব্যবহৃত হয়, যেখানে require, revert, এবং assert হল প্রধান exception-handling ফাংশন। Errors এর মধ্যে কাস্টম ত্রুটি (revert errors) এবং panic errors (যেমন শূন্যে ভাগ) অন্তর্ভুক্ত থাকে। ত্রুটি এবং এক্সেপশনের সঠিক ব্যবহারে স্মার্ট কন্ট্রাক্টের সুরক্ষা এবং কার্যকারিতা নিশ্চিত করা যায়।

Content added By

Solidity তে require, assert, এবং revert ফাংশনগুলি ব্যবহৃত হয় স্মার্ট কন্ট্রাক্টের ভিতরে বিভিন্ন শর্ত যাচাই করতে এবং কোডের কার্যকারিতা নিয়ন্ত্রণ করতে। এই ফাংশনগুলো স্মার্ট কন্ট্রাক্টে ত্রুটি ব্যবস্থাপনা (error handling) এবং সুরক্ষা নিশ্চিত করতে সাহায্য করে। তবে, এই তিনটি ফাংশনের মধ্যে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে, যা তাদের ব্যবহার নির্ধারণ করে।

এখানে আমরা require, assert, এবং revert ফাংশনের ব্যবহার এবং তাদের মধ্যে পার্থক্য আলোচনা করছি।


1. require ফাংশন

require ফাংশনটি ব্যবহার করা হয় যখন কোনো শর্ত সত্য হওয়া নিশ্চিত করতে হয়। যদি শর্তটি মিথ্যা হয়, তবে এটি একটি ত্রুটি ঘটায় এবং সব পরিবর্তন পূর্বাবস্থায় ফিরিয়ে আনে (অথবা রিভার্স করে)। require সাধারণত ইনপুট যাচাই, শর্ত যাচাই বা অনুমোদন পরীক্ষার জন্য ব্যবহৃত হয়।

গঠন:

require(condition, "Error message");
  • condition: একটি শর্ত যা সত্য হওয়া প্রয়োজন।
  • "Error message": ত্রুটির বার্তা যা শর্ত মিথ্যা হলে প্রদর্শিত হবে।

ব্যবহার:
require সাধারণত ফাংশনের ইনপুট যাচাই করার জন্য ব্যবহার করা হয়।

উদাহরণ:

pragma solidity ^0.8.0;

contract MyContract {
    uint256 public balance;

    // Ether জমা করার ফাংশন
    function deposit(uint256 _amount) public {
        require(_amount > 0, "Amount must be greater than zero");  // শর্ত যাচাই
        balance += _amount;
    }
}

এখানে, deposit ফাংশনে _amount যদি ০ বা তার কম হয়, তবে require শর্তটি ব্যর্থ হবে এবং "Amount must be greater than zero" বার্তা সহ একটি ত্রুটি ঘটবে।


2. assert ফাংশন

assert ফাংশনটি সাধারণত কোডের ভুল বা অবস্থা যাচাই করার জন্য ব্যবহৃত হয়, বিশেষত যখন আপনার বিশ্বাস থাকে যে একটি শর্ত কখনই ভুল হতে পারে না। এটি একটি অন্তর্নিহিত নিরাপত্তা যাচাই। assert যদি ব্যর্থ হয়, এটি স্মার্ট কন্ট্রাক্টের পরিবর্তনগুলোকে রিভার্স করে এবং গ্যাস ফিরিয়ে দেয় না।

গঠন:

assert(condition);
  • condition: একটি শর্ত যা সত্য হওয়া প্রয়োজন, না হলে এটি ব্যর্থ হবে।

ব্যবহার:
assert ব্যবহার করা হয় অযাচিত বা ত্রুটিপূর্ণ পরিস্থিতি যাচাই করার জন্য।

উদাহরণ:

pragma solidity ^0.8.0;

contract MyContract {
    uint256 public balance;

    function withdraw(uint256 _amount) public {
        assert(balance >= _amount); // শর্ত যাচাই
        balance -= _amount;
    }
}

এখানে, assert(balance >= _amount) ফাংশনটি নিশ্চিত করে যে, balance এর পরিমাণ _amount এর সমান বা তার বেশি। যদি তা না হয়, তবে assert ফাংশনটি ব্যর্থ হয়ে যাবে এবং ত্রুটি দেখাবে। এটি নিশ্চিত করে যে কন্ট্রাক্টের অবস্থা সঠিক রয়েছে।

মনে রাখা উচিত: assert সাধারণত শর্ত যাচাইয়ের জন্য ব্যবহৃত হয় যেখানে কোনো শর্ত কখনই ভুল হতে পারে না, যেমন কন্ট্রাক্টের ভেরিয়েবলের অবস্থা বা নিরাপত্তা। এর ফলস্বরূপ, assert ব্যর্থ হলে এটি গুরুতর ত্রুটি এবং গ্যাসের অপচয় ঘটাতে পারে।


3. revert ফাংশন

revert ফাংশনটি ব্যবহার করা হয় কন্ট্রাক্টের কার্যক্রম পুরোপুরি বন্ধ করতে, যখন কোনো শর্ত পূর্ণ না হয় বা কোনো ত্রুটি ঘটলে। এটি require এর মতোই কাজ করে, তবে এর মাধ্যমে আপনি ত্রুটির বার্তা প্রদান করতে পারেন এবং কোডের execution পুরোপুরি থামিয়ে দিতে পারেন। revert কাস্টম ত্রুটি বার্তা প্রদান করতে সহায়ক।

গঠন:

revert("Error message");
  • "Error message": একটি কাস্টম ত্রুটি বার্তা যা দেখানো হবে।

ব্যবহার:
revert সাধারণত ফাংশনে নির্দিষ্ট শর্ত ভাঙলে কন্ট্রাক্টের কার্যক্রম রিভার্স করার জন্য ব্যবহৃত হয়।

উদাহরণ:

pragma solidity ^0.8.0;

contract MyContract {
    uint256 public balance;

    function deposit(uint256 _amount) public {
        if (_amount <= 0) {
            revert("Amount must be greater than zero");  // রিভার্স করার জন্য revert ব্যবহার
        }
        balance += _amount;
    }
}

এখানে, যদি _amount ০ বা তার কম হয়, তবে revert ফাংশনটি ব্যবহার করা হবে এবং "Amount must be greater than zero" বার্তা সহ পুরো ট্রানজেকশন রিভার্স হবে।


4. require, assert, revert এর মধ্যে পার্থক্য

  • require: এটি ব্যবহার করা হয় ইনপুট যাচাই বা শর্ত যাচাইয়ের জন্য। শর্ত ব্যর্থ হলে, সমস্ত পরিবর্তন রিভার্স হয় এবং ত্রুটির বার্তা প্রদান করা হয়। সাধারণত ফাংশন প্যারামিটার বা অবস্থার যাচাই করতে ব্যবহৃত হয়।
  • assert: এটি সাধারণত কোডের অবস্থা যাচাই করার জন্য ব্যবহৃত হয়, যেখানে শর্তটি কখনই মিথ্যা হতে পারে না। যদি assert ব্যর্থ হয়, এটি গুরুতর ত্রুটি তৈরি করে এবং স্মার্ট কন্ট্রাক্টের নিরাপত্তা প্রশ্নবিদ্ধ হতে পারে।
  • revert: এটি কোনো শর্ত ব্যর্থ হলে সম্পূর্ণ ট্রানজেকশন রিভার্স করতে ব্যবহৃত হয়। এটি সাধারণত কাস্টম ত্রুটি বার্তা সহ কাজ করে এবং একে require এর বিকল্প হিসেবে ব্যবহার করা যায়।

সারাংশ

Solidity তে require, assert, এবং revert ফাংশনগুলো স্মার্ট কন্ট্রাক্টের কার্যকারিতা এবং নিরাপত্তা নিশ্চিত করতে ব্যবহৃত হয়।

  • require ব্যবহার করা হয় ইনপুট বা শর্ত যাচাইয়ের জন্য।
  • assert ব্যবহার করা হয় কোডের অবস্থা যাচাই করার জন্য, যেখানে শর্তটি কখনই ভুল হতে পারে না।
  • revert ব্যবহার করা হয় একটি ফাংশনের পুরো কার্যক্রম বন্ধ করতে এবং কাস্টম ত্রুটি বার্তা প্রদান করতে।
    এই ফাংশনগুলো ব্লকচেইনে নিরাপত্তা এবং সঠিকতা বজায় রাখতে সহায়তা করে।
Content added By

Solidity তে Custom Errors এবং Error Management একটি গুরুত্বপূর্ণ বিষয়, যা স্মার্ট কন্ট্রাক্টের নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করতে সহায়তা করে। Custom Errors ব্যবহার করে আপনি নিজস্ব ত্রুটি বার্তা তৈরি করতে পারেন, যা স্মার্ট কন্ট্রাক্টের মধ্যে ত্রুটি চিহ্নিত এবং ডিবাগ করার প্রক্রিয়াকে সহজ করে তোলে।

১. Custom Errors

Custom errors Solidity তে একটি নতুন বৈশিষ্ট্য (Solidity 0.8.4+) যা ডেভেলপারদেরকে নিজস্ব ত্রুটি বার্তা তৈরি করার সুযোগ দেয়। এগুলি require, revert বা assert এর মাধ্যমে ট্রিগার করা হতে পারে এবং ব্যবহারকারীদের জন্য আরও স্পষ্ট এবং কাস্টমাইজড ত্রুটি বার্তা প্রদান করতে সাহায্য করে।

এটি প্রাচীন ত্রুটি বার্তা পদ্ধতির তুলনায় আরও গ্যাস-কার্যকরী, কারণ এতে অতিরিক্ত স্ট্রিং মেসেজ সংরক্ষণ করার প্রয়োজন হয় না।

Custom Errors এর গঠন

Custom errors এ সাধারণত একটি নাম এবং এর সাথে প্রাসঙ্গিক ডেটা (যেমন, ভেরিয়েবলের মান) থাকে।

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract CustomErrorExample {

    // Custom error declaration
    error InsufficientBalance(uint requested, uint available);

    uint public balance;

    constructor() {
        balance = 1000; // Initial balance
    }

    // Deposit function
    function deposit(uint amount) public {
        balance += amount;
    }

    // Withdraw function with custom error
    function withdraw(uint amount) public {
        if (amount > balance) {
            // Trigger custom error if insufficient balance
            revert InsufficientBalance(amount, balance);
        }
        balance -= amount;
    }
}

এখানে:

  • InsufficientBalance একটি custom error যা requested এবং available মান নেয়। এটি তখন ট্রিগার হয় যখন ব্যবহারকারী যে পরিমাণ অর্থ তুলতে চায় তা ব্যালেন্সের তুলনায় বেশি হয়।
  • revert InsufficientBalance(amount, balance); এর মাধ্যমে এই কাস্টম ত্রুটি বার্তা তৈরি হয় এবং ট্রানজেকশন বাতিল করা হয়।

২. Error Management in Solidity

Error management স্মার্ট কন্ট্রাক্টে ত্রুটি সনাক্তকরণ এবং ডিবাগিং প্রক্রিয়াকে উন্নত করে। Solidity তে সাধারণত ত্রুটি ব্যবস্থাপনার জন্য require, revert, এবং assert ব্যবহার করা হয়। এগুলি কন্ট্রাক্টে শর্ত যাচাই করতে এবং যদি শর্ত পূর্ণ না হয়, তবে ট্রানজেকশন বাতিল করতে ব্যবহৃত হয়।

৩. Require এবং Revert ব্যবহারের মধ্যে পার্থক্য:

  • require: এই ফাংশনটি যখন কোনো শর্ত পূর্ণ না হয়, তখন ট্রানজেকশন বাতিল করে দেয় এবং একটি ত্রুটি বার্তা পাঠায়। এটি সাধারণত ব্যবহারকারীর ইনপুট যাচাই করতে ব্যবহৃত হয়।
  • revert: revert ব্যবহার করে আপনি কাস্টম ত্রুটি বার্তা পাঠাতে পারেন এবং ট্রানজেকশন বাতিল করতে পারেন। এটি সাধারনত require এর মতোই কাজ করে, তবে কাস্টম error এর জন্য এটি বেশি ব্যবহৃত হয়।

require এবং revert এর উদাহরণ:

pragma solidity ^0.8.0;

contract ErrorManagement {

    uint public balance;

    constructor() {
        balance = 1000; // Initial balance
    }

    // Deposit function
    function deposit(uint amount) public {
        require(amount > 0, "Deposit amount must be greater than zero");
        balance += amount;
    }

    // Withdraw function with revert and custom error
    function withdraw(uint amount) public {
        if (amount > balance) {
            revert("Insufficient balance for withdrawal");
        }
        balance -= amount;
    }
}

এখানে:

  • require(amount > 0, "Deposit amount must be greater than zero"); এই লাইনে নিশ্চিত করা হচ্ছে যে ডিপোজিটের পরিমাণ শূন্যের চেয়ে বেশি।
  • revert("Insufficient balance for withdrawal"); এই লাইনে, যদি ব্যালেন্স কম হয়, তবে ট্রানজেকশন রিভার্স হবে এবং ত্রুটি বার্তা দেখানো হবে।

৪. Assert এর ব্যবহার:

assert সাধারণত অভ্যন্তরীণ শর্ত যাচাই করতে ব্যবহৃত হয়, যেমন ডেটা ইনভ্যারিয়েন্ট বা লজিক্যাল ভুল সনাক্ত করার জন্য। এটি যখন কোনো শর্ত ভুল হয়, তখন টাকার পরিমাণের মতো ইন্টারনাল অবস্থার ত্রুটি প্রদর্শন করে এবং সম্পূর্ণ ট্রানজেকশন বাতিল করে দেয়।

assert এর উদাহরণ:

pragma solidity ^0.8.0;

contract Example {

    uint public balance;

    constructor() {
        balance = 1000;
    }

    // Withdraw function with assert
    function withdraw(uint amount) public {
        assert(amount <= balance); // Ensure that the withdrawal amount is not greater than balance
        balance -= amount;
    }
}

এখানে:

  • assert(amount <= balance); নিশ্চিত করছে যে উইথড্রয়ের জন্য নির্ধারিত পরিমাণ ব্যালেন্সের চেয়ে বেশি নয়। যদি এটি ভুল হয়, তাহলে পুরো ট্রানজেকশন বাতিল হয়ে যাবে।

Custom Errors এবং Error Management এর সুবিধা

  1. গ্যাস খরচ কমানো: Custom errors এর মাধ্যমে ডেটা স্টোরেজ খরচ কমানো যায় কারণ এতে স্ট্রিং বার্তা সংরক্ষণ করা হয় না। require বা assert এর তুলনায় revert ব্যবহার করে কাস্টম ত্রুটি বার্তা পাঠানো গ্যাস খরচে সাশ্রয়ী।
  2. উন্নত ত্রুটি সনাক্তকরণ: কাস্টম ত্রুটি ব্যবস্থাপনার মাধ্যমে আপনি স্পষ্ট এবং কাস্টমাইজড ত্রুটি বার্তা পাঠাতে পারেন, যা ডেভেলপারদের জন্য ডিবাগিং সহজ করে তোলে।
  3. নিরাপত্তা নিশ্চিতকরণ: Error management সঠিক শর্ত যাচাইয়ের মাধ্যমে নিরাপত্তা বাড়ায়, যেমন ব্যালেন্স চেক, পেমেন্ট শর্ত ইত্যাদি।

সারাংশ

Custom errors এবং error management Solidity তে স্মার্ট কন্ট্রাক্টের নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করতে ব্যবহৃত হয়। require, revert, এবং assert এর মতো ফাংশনগুলো শর্ত যাচাই করতে এবং ত্রুটি চিহ্নিত করতে ব্যবহৃত হয়, যেখানে require সাধারণত ব্যবহারকারীর ইনপুট যাচাই করে, assert অভ্যন্তরীণ ত্রুটি চিহ্নিত করে এবং revert কাস্টম ত্রুটি বার্তা পাঠানোর জন্য ব্যবহৃত হয়। Custom errors স্মার্ট কন্ট্রাক্টে ত্রুটি সনাক্তকরণের একটি কার্যকরী উপায়, যা গ্যাস খরচ কমাতে এবং ডিবাগিং সহজ করতে সহায়তা করে।

Content added By

Solidity তে Error Handling একটি গুরুত্বপূর্ণ ধারণা, যা স্মার্ট কন্ট্রাক্টের কার্যক্রম সঠিকভাবে পরিচালনা করতে এবং ত্রুটি সনাক্ত করতে ব্যবহৃত হয়। ব্লকচেইন নেটওয়ার্কে স্মার্ট কন্ট্রাক্টের কার্যক্রম সম্পাদন করার সময় বিভিন্ন ধরণের ত্রুটি (errors) ঘটতে পারে, যেমন অনুমতি নেই, অযাচিত ইনপুট, অপ্রত্যাশিত শর্ত ইত্যাদি। এই ত্রুটিগুলি সঠিকভাবে হ্যান্ডেল করা হলে স্মার্ট কন্ট্রাক্টের নিরাপত্তা, কার্যকারিতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত হয়।

Solidity তে error handling করার জন্য কয়েকটি প্রধান পদ্ধতি রয়েছে: require(), assert(), revert(), এবং custom error types

1. require()

require() একটি ইন্সট্রাকশন যা শর্ত পূর্ণ না হলে স্মার্ট কন্ট্রাক্টের কার্যক্রম থামিয়ে দেয় এবং গ্যাস অপচয় রোধ করে। require() ব্যবহৃত হয় ইনপুট যাচাই, কন্ডিশন পরীক্ষা বা অনুমতিপত্র নিশ্চিত করার জন্য। যদি শর্তটি মিথ্যা হয়, তবে একটি ত্রুটি (error) তৈরি হয় এবং execution থেমে যায়।

require() ব্যবহার উদাহরণ:
pragma solidity ^0.8.0;

contract RequireExample {
    uint public balance;

    constructor() {
        balance = 1000;
    }

    function withdraw(uint amount) public {
        require(amount <= balance, "Insufficient balance!");  // ইনপুট যাচাই
        balance -= amount;  // ব্যালেন্স আপডেট
    }
}

ব্যাখ্যা:

  • এখানে require() ব্যবহার করা হয়েছে নিশ্চিত করতে যে, withdraw ফাংশনটি শুধুমাত্র তখনই কার্যকর হবে যদি amount ছোট বা সমান হয় balance এর।
  • যদি শর্ত মিথ্যা হয় (যেমন, ব্যালেন্সের চাইতে বেশি পরিমাণ টাকা তুলে নেওয়ার চেষ্টা করা), তবে "Insufficient balance!" এরর মেসেজ সহ ত্রুটি দেখানো হবে।

require() এর বৈশিষ্ট্য:

  • সাধারণত ব্যবহার হয় শর্ত যাচাই করার জন্য (যেমন ইনপুট যাচাই বা অনুমতি যাচাই)।
  • শর্তটি মিথ্যা হলে গ্যাস অপচয় হয় না, অর্থাৎ ট্রানজেকশন বাতিল হয়ে যায় এবং খরচ কম হয়।

2. assert()

assert() একটি ফাংশন যা সাধারণত আভ্যন্তরীণ ভুল বা অবস্থার জন্য ব্যবহৃত হয়। এটি বিশেষভাবে এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে কন্ট্রাক্টের আভ্যন্তরীণ অবস্থা সঠিক কিনা তা যাচাই করা হয়। assert() শর্তটি মিথ্যা হলে একটি অপ্রত্যাশিত ত্রুটি তৈরি হয় এবং সমস্ত গ্যাস অপচয় হয়ে যায়। এটি সাধারণত শর্ত বা লজিক ভুল শনাক্ত করতে ব্যবহৃত হয়।

assert() ব্যবহার উদাহরণ:
pragma solidity ^0.8.0;

contract AssertExample {
    uint public balance;

    constructor() {
        balance = 1000;
    }

    function withdraw(uint amount) public {
        assert(balance >= amount);  // আভ্যন্তরীণ শর্ত যাচাই
        balance -= amount;  // ব্যালেন্স আপডেট
    }
}

ব্যাখ্যা:

  • এখানে assert() ব্যবহার করা হয়েছে আভ্যন্তরীণ শর্ত যাচাই করার জন্য, যা নিশ্চিত করবে যে, balance থেকে তোলার পরিমাণ কমপক্ষে amount এর সমান বা বড়।
  • যদি শর্তটি মিথ্যা হয়, তবে একটি ত্রুটি ঘটবে এবং গ্যাস অপচয় হবে।

assert() এর বৈশিষ্ট্য:

  • আভ্যন্তরীণ অবস্থার সঠিকতা যাচাই করতে ব্যবহৃত হয় (যেমন, ভারসাম্য বা অন্যান্য স্টোরড ডেটা)।
  • যদি শর্তটি মিথ্যা হয়, তবে সমস্ত গ্যাস অপচয় হয়ে যায়, এবং কন্ট্রাক্টের কার্যক্রম থেমে যায়।

3. revert()

revert() একটি ফাংশন যা ট্রানজেকশন বাতিল করার জন্য ব্যবহৃত হয় এবং ত্রুটি মেসেজ সহ পুনরুদ্ধারের (revert) কাজ করে। revert() এর মাধ্যমে আপনি শর্ত পূর্ণ না হলে কন্ট্রাক্টের কাজ বাতিল করতে পারেন এবং ব্যবহারকারীকে ত্রুটি মেসেজ প্রদান করতে পারেন।

revert() ব্যবহার উদাহরণ:
pragma solidity ^0.8.0;

contract RevertExample {
    uint public balance;

    constructor() {
        balance = 1000;
    }

    function withdraw(uint amount) public {
        if (amount > balance) {
            revert("Insufficient balance!");  // ট্রানজেকশন রিভার্ট করা
        }
        balance -= amount;  // ব্যালেন্স আপডেট
    }
}

ব্যাখ্যা:

  • এখানে revert() ব্যবহৃত হয়েছে যদি amount ব্যালেন্সের চেয়ে বেশি হয়। এই ক্ষেত্রে, ট্রানজেকশন বাতিল হবে এবং "Insufficient balance!" ত্রুটি মেসেজ প্রদর্শিত হবে।
  • revert() ব্যবহারের মাধ্যমে আমরা কন্ট্রাক্টের কার্যক্রম পুরোপুরি বাতিল করতে পারি এবং ত্রুটির কারণ প্রদান করতে পারি।

revert() এর বৈশিষ্ট্য:

  • শর্ত পূর্ণ না হলে কন্ট্রাক্টের কাজ বাতিল করা হয়।
  • একটি নির্দিষ্ট ত্রুটি মেসেজ প্রদান করা যায়।

4. Custom Error Types

Solidity তে custom errors (কাস্টম এরর টাইপ) ব্যবহার করে আপনি নিজস্ব ত্রুটি তৈরি করতে পারেন, যা স্মার্ট কন্ট্রাক্টে আরও নির্দিষ্ট ত্রুটি সংক্রান্ত তথ্য প্রদান করে। কাস্টম এরর ব্যবহার করলে গ্যাস খরচ কমে যায় কারণ এদের সাথে অতিরিক্ত স্ট্রিং মেসেজের প্রয়োজন হয় না।

Custom Error Types এর উদাহরণ:
pragma solidity ^0.8.0;

contract CustomErrorExample {
    uint public balance;

    // কাস্টম এরর ডিক্লেয়ার করা
    error InsufficientBalance(uint requested, uint available);

    constructor() {
        balance = 1000;
    }

    function withdraw(uint amount) public {
        if (amount > balance) {
            // কাস্টম এরর রিভার্ট করা
            revert InsufficientBalance(amount, balance);
        }
        balance -= amount;  // ব্যালেন্স আপডেট
    }
}

ব্যাখ্যা:

  • InsufficientBalance একটি কাস্টম এরর যা দুইটি প্যারামিটার নেয়: requested এবং available
  • withdraw ফাংশনটি কাস্টম এরর InsufficientBalance ব্যবহার করে, যাতে সরাসরি ত্রুটির কারণ (অনুরোধকৃত পরিমাণ এবং উপলব্ধ ব্যালেন্স) সঠিকভাবে প্রদান করা যায়।

Custom Errors এর বৈশিষ্ট্য:

  • কাস্টম এররগুলো গ্যাস সাশ্রয়ী হয় কারণ এগুলো স্ট্রিং মেসেজের পরিবর্তে ইনডেক্সড ডেটা ব্যবহার করে।
  • এটি সুনির্দিষ্ট ত্রুটি মেসেজ এবং ফিল্ড প্রদান করে যা স্মার্ট কন্ট্রাক্টের ডিবাগিং এবং ত্রুটি পরিচালনাকে আরও সহজ করে তোলে।

সারাংশ

Solidity তে Proper Error Handling Techniques ব্যবহারের মাধ্যমে স্মার্ট কন্ট্রাক্টের কার্যক্রম এবং নিরাপত্তা নিশ্চিত করা হয়। require(), assert(), revert(), এবং custom error types এই প্রযুক্তিগুলি স্মার্ট কন্ট্রাক্টে ত্রুটি সনাক্তকরণ, শর্ত যাচাই এবং কার্যক্রম বাতিল করার জন্য ব্যবহৃত হয়। প্রতিটি পদ্ধতির নিজস্ব বৈশিষ্ট্য এবং প্রয়োগ রয়েছে, এবং সঠিক ত্রুটি হ্যান্ডলিং স্মার্ট কন্ট্রাক্টের নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করে।

Content added By
Promotion

Are you sure to start over?

Loading...