স্মার্ট কন্ট্রাক্ট টেস্টিং
ইথেরিয়ামের মতো পাবলিক ব্লকচেইনগুলো অপরিবর্তনীয়, যার ফলে ডিপ্লয়মেন্টের পরে একটি স্মার্ট কন্ট্রাক্টের কোড পরিবর্তন করা কঠিন হয়ে পড়ে। "ভার্চুয়াল আপগ্রেড" করার জন্য কন্ট্রাক্ট আপগ্রেড প্যাটার্ন বিদ্যমান, তবে এগুলো বাস্তবায়ন করা কঠিন এবং এর জন্য সামাজিক ঐক্যমতের প্রয়োজন। তাছাড়া, একটি আপগ্রেড কেবল একটি ত্রুটি আবিষ্কার হওয়ার পরেই তা ঠিক করতে পারে—যদি কোনো আক্রমণকারী প্রথমে দুর্বলতাটি আবিষ্কার করে, তবে আপনার স্মার্ট কন্ট্রাক্টটি শোষণের ঝুঁকিতে থাকে।
এসব কারণে, মেইননেটে ডিপ্লয় করার আগে স্মার্ট কন্ট্রাক্ট টেস্টিং করা নিরাপত্তার জন্য একটি ন্যূনতম প্রয়োজনীয়তা। কন্ট্রাক্ট টেস্টিং এবং কোডের সঠিকতা মূল্যায়নের জন্য অনেক কৌশল রয়েছে; আপনি কোনটি বেছে নেবেন তা আপনার প্রয়োজনের ওপর নির্ভর করে। তবুও, কন্ট্রাক্ট কোডের ছোট এবং বড় উভয় ধরনের নিরাপত্তা ত্রুটি ধরার জন্য বিভিন্ন টুল এবং পদ্ধতির সমন্বয়ে তৈরি একটি টেস্ট স্যুট আদর্শ।
পূর্বশর্ত
এই পৃষ্ঠাটি ইথেরিয়াম নেটওয়ার্কে ডিপ্লয় করার আগে কীভাবে স্মার্ট কন্ট্রাক্ট টেস্টিং করতে হয় তা ব্যাখ্যা করে। এটি ধরে নেয় যে আপনি স্মার্ট কন্ট্রাক্ট সম্পর্কে পরিচিত।
স্মার্ট কন্ট্রাক্ট টেস্টিং কী?
স্মার্ট কন্ট্রাক্ট টেস্টিং হলো একটি স্মার্ট কন্ট্রাক্টের কোড প্রত্যাশা অনুযায়ী কাজ করছে কিনা তা যাচাই করার প্রক্রিয়া। একটি নির্দিষ্ট স্মার্ট কন্ট্রাক্ট নির্ভরযোগ্যতা, ব্যবহারযোগ্যতা এবং নিরাপত্তার প্রয়োজনীয়তা পূরণ করে কিনা তা পরীক্ষা করার জন্য টেস্টিং কার্যকর।
যদিও পদ্ধতিগুলো ভিন্ন হতে পারে, বেশিরভাগ টেস্টিং পদ্ধতিতে একটি স্মার্ট কন্ট্রাক্টকে এমন কিছু ডেটার ছোট নমুনা দিয়ে এক্সিকিউট করতে হয় যা এটি পরিচালনা করবে বলে আশা করা হয়। যদি কন্ট্রাক্টটি নমুনা ডেটার জন্য সঠিক ফলাফল তৈরি করে, তবে ধরে নেওয়া হয় যে এটি সঠিকভাবে কাজ করছে। বেশিরভাগ টেস্টিং টুল টেস্ট কেস (নতুন ট্যাবে খোলে) লেখা এবং এক্সিকিউট করার জন্য রিসোর্স প্রদান করে, যাতে একটি কন্ট্রাক্টের এক্সিকিউশন প্রত্যাশিত ফলাফলের সাথে মেলে কিনা তা পরীক্ষা করা যায়।
স্মার্ট কন্ট্রাক্ট টেস্টিং করা কেন গুরুত্বপূর্ণ?
যেহেতু স্মার্ট কন্ট্রাক্টগুলো প্রায়শই উচ্চ-মূল্যের আর্থিক সম্পদ পরিচালনা করে, তাই ছোটখাটো প্রোগ্রামিং ত্রুটিগুলো ব্যবহারকারীদের জন্য বিপুল ক্ষতির (নতুন ট্যাবে খোলে) কারণ হতে পারে। তবে কঠোর টেস্টিং আপনাকে একটি স্মার্ট কন্ট্রাক্টের কোডের ত্রুটি এবং সমস্যাগুলো আগেভাগেই আবিষ্কার করতে এবং মেইননেটে লঞ্চ করার আগে সেগুলো ঠিক করতে সাহায্য করতে পারে।
যদিও কোনো বাগ আবিষ্কৃত হলে একটি কন্ট্রাক্ট আপগ্রেড করা সম্ভব, আপগ্রেডগুলো জটিল এবং সঠিকভাবে পরিচালনা না করা হলে ত্রুটি দেখা দিতে পারে (নতুন ট্যাবে খোলে)। একটি কন্ট্রাক্ট আপগ্রেড করা অপরিবর্তনযোগ্যতার নীতিকে আরও ক্ষুণ্ণ করে এবং ব্যবহারকারীদের ওপর অতিরিক্ত আস্থার অনুমানের বোঝা চাপিয়ে দেয়। বিপরীতে, আপনার কন্ট্রাক্ট টেস্টিং করার জন্য একটি বিস্তৃত পরিকল্পনা স্মার্ট কন্ট্রাক্টের নিরাপত্তা ঝুঁকি কমায় এবং ডিপ্লয় করার পরে জটিল লজিক আপগ্রেড করার প্রয়োজনীয়তা হ্রাস করে।
স্মার্ট কন্ট্রাক্ট টেস্টিংয়ের পদ্ধতি
ইথেরিয়াম স্মার্ট কন্ট্রাক্ট টেস্টিংয়ের পদ্ধতিগুলো দুটি বিস্তৃত বিভাগের অধীনে পড়ে: স্বয়ংক্রিয় টেস্টিং (automated testing) এবং ম্যানুয়াল টেস্টিং (manual testing)। স্বয়ংক্রিয় টেস্টিং এবং ম্যানুয়াল টেস্টিং অনন্য সুবিধা এবং ট্রেডঅফ প্রদান করে, তবে আপনি আপনার কন্ট্রাক্টগুলো বিশ্লেষণ করার জন্য একটি শক্তিশালী পরিকল্পনা তৈরি করতে উভয়কেই একত্রিত করতে পারেন।
স্বয়ংক্রিয় টেস্টিং
স্বয়ংক্রিয় টেস্টিং এমন টুল ব্যবহার করে যা এক্সিকিউশনে ত্রুটির জন্য স্বয়ংক্রিয়ভাবে একটি স্মার্ট কন্ট্রাক্টের কোড পরীক্ষা করে। স্বয়ংক্রিয় টেস্টিংয়ের সুবিধা আসে কন্ট্রাক্টের কার্যকারিতা মূল্যায়নের জন্য স্ক্রিপ্ট (নতুন ট্যাবে খোলে) ব্যবহার করার মাধ্যমে। স্ক্রিপ্ট করা টেস্টগুলো ন্যূনতম মানুষের হস্তক্ষেপে বারবার চালানোর জন্য শিডিউল করা যেতে পারে, যা স্বয়ংক্রিয় টেস্টিং পদ্ধতিকে ম্যানুয়াল টেস্টিংয়ের চেয়ে বেশি দক্ষ করে তোলে।
স্বয়ংক্রিয় টেস্টিং বিশেষভাবে কার্যকর যখন টেস্টগুলো পুনরাবৃত্তিমূলক এবং সময়সাপেক্ষ হয়; ম্যানুয়ালি করা কঠিন হয়; মানুষের ভুলের প্রবণতা থাকে; অথবা গুরুত্বপূর্ণ কন্ট্রাক্ট ফাংশন মূল্যায়নের সাথে জড়িত থাকে। তবে স্বয়ংক্রিয় টেস্টিং টুলের কিছু অসুবিধাও থাকতে পারে—এগুলো নির্দিষ্ট কিছু বাগ মিস করতে পারে এবং অনেক ফলস পজিটিভ (নতুন ট্যাবে খোলে) তৈরি করতে পারে। তাই, স্মার্ট কন্ট্রাক্টের জন্য ম্যানুয়াল টেস্টিংয়ের সাথে স্বয়ংক্রিয় টেস্টিং যুক্ত করা আদর্শ।
ম্যানুয়াল টেস্টিং
ম্যানুয়াল টেস্টিং মানুষের সহায়তায় করা হয় এবং একটি স্মার্ট কন্ট্রাক্টের সঠিকতা বিশ্লেষণ করার সময় আপনার টেস্ট স্যুটের প্রতিটি টেস্ট কেস একের পর এক এক্সিকিউট করার সাথে জড়িত। এটি স্বয়ংক্রিয় টেস্টিংয়ের মতো নয় যেখানে আপনি একটি কন্ট্রাক্টে একই সাথে একাধিক বিচ্ছিন্ন টেস্ট চালাতে পারেন এবং সমস্ত ব্যর্থ ও সফল টেস্ট দেখানো একটি রিপোর্ট পেতে পারেন।
ম্যানুয়াল টেস্টিং একজন ব্যক্তি দ্বারা একটি লিখিত টেস্ট প্ল্যান অনুসরণ করে করা যেতে পারে যা বিভিন্ন টেস্ট পরিস্থিতি কভার করে। ম্যানুয়াল টেস্টিংয়ের অংশ হিসেবে আপনি একাধিক ব্যক্তি বা গ্রুপকে একটি নির্দিষ্ট সময়ের মধ্যে একটি স্মার্ট কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করাতেও পারেন। টেস্টাররা কন্ট্রাক্টের প্রকৃত আচরণকে প্রত্যাশিত আচরণের সাথে তুলনা করবে এবং যেকোনো পার্থক্যকে বাগ হিসেবে চিহ্নিত করবে।
কার্যকর ম্যানুয়াল টেস্টিংয়ের জন্য উল্লেখযোগ্য রিসোর্স (দক্ষতা, সময়, অর্থ এবং প্রচেষ্টা) প্রয়োজন, এবং মানুষের ভুলের কারণে টেস্ট এক্সিকিউট করার সময় নির্দিষ্ট কিছু ত্রুটি মিস করা সম্ভব। তবে ম্যানুয়াল টেস্টিং উপকারীও হতে পারে—উদাহরণস্বরূপ, একজন মানব টেস্টার (যেমন, একজন অডিটর) এমন এজ কেসগুলো শনাক্ত করতে তাদের অন্তর্দৃষ্টি ব্যবহার করতে পারেন যা একটি স্বয়ংক্রিয় টেস্টিং টুল মিস করতে পারে।
স্মার্ট কন্ট্রাক্টের জন্য স্বয়ংক্রিয় টেস্টিং
ইউনিট টেস্টিং
ইউনিট টেস্টিং কন্ট্রাক্ট ফাংশনগুলোকে আলাদাভাবে মূল্যায়ন করে এবং প্রতিটি উপাদান সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করে। ভালো ইউনিট টেস্টগুলো সহজ, দ্রুত চালানোর মতো হওয়া উচিত এবং টেস্ট ব্যর্থ হলে কী ভুল হয়েছে তার একটি পরিষ্কার ধারণা প্রদান করা উচিত।
ফাংশনগুলো প্রত্যাশিত মান প্রদান করে কিনা এবং ফাংশন এক্সিকিউশনের পরে কন্ট্রাক্ট স্টোরেজ সঠিকভাবে আপডেট হয় কিনা তা পরীক্ষা করার জন্য ইউনিট টেস্টগুলো কার্যকর। তাছাড়া, একটি কন্ট্রাক্টের কোডবেসে পরিবর্তন করার পরে ইউনিট টেস্ট চালানো নিশ্চিত করে যে নতুন লজিক যোগ করার ফলে কোনো ত্রুটি দেখা দেয়নি। কার্যকর ইউনিট টেস্ট চালানোর জন্য নিচে কিছু নির্দেশিকা দেওয়া হলো:
স্মার্ট কন্ট্রাক্টের ইউনিট টেস্টিংয়ের জন্য নির্দেশিকা
1. আপনার কন্ট্রাক্টের বিজনেস লজিক এবং ওয়ার্কফ্লো বুঝুন
ইউনিট টেস্ট লেখার আগে, একটি স্মার্ট কন্ট্রাক্ট কী কী কার্যকারিতা প্রদান করে এবং ব্যবহারকারীরা কীভাবে সেই ফাংশনগুলো অ্যাক্সেস ও ব্যবহার করবে তা জানা সহায়ক। এটি বিশেষ করে হ্যাপি পাথ টেস্ট (নতুন ট্যাবে খোলে) চালানোর জন্য কার্যকর, যা নির্ধারণ করে যে একটি কন্ট্রাক্টের ফাংশনগুলো বৈধ ব্যবহারকারী ইনপুটের জন্য সঠিক আউটপুট প্রদান করে কিনা। আমরা একটি নিলাম কন্ট্রাক্টের (নতুন ট্যাবে খোলে) এই (সংক্ষিপ্ত) উদাহরণটি ব্যবহার করে এই ধারণাটি ব্যাখ্যা করব
constructor(
uint biddingTime,
address payable beneficiaryAddress
) {
beneficiary = beneficiaryAddress;
auctionEndTime = block.timestamp + biddingTime;
}
function bid() external payable {
if (block.timestamp > auctionEndTime)
revert AuctionAlreadyEnded();
if (msg.value <= highestBid)
revert BidNotHighEnough(highestBid);
if (highestBid != 0) {
pendingReturns[highestBidder] += highestBid;
}
highestBidder = msg.sender;
highestBid = msg.value;
emit HighestBidIncreased(msg.sender, msg.value);
}
function withdraw() external returns (bool) {
uint amount = pendingReturns[msg.sender];
if (amount > 0) {
pendingReturns[msg.sender] = 0;
if (!payable(msg.sender).send(amount)) {
pendingReturns[msg.sender] = amount;
return false;
}
}
return true;
}
function auctionEnd() external {
if (block.timestamp < auctionEndTime)
revert AuctionNotYetEnded();
if (ended)
revert AuctionEndAlreadyCalled();
ended = true;
emit AuctionEnded(highestBidder, highestBid);
beneficiary.transfer(highestBid);
}
}
এটি একটি সাধারণ নিলাম কন্ট্রাক্ট যা বিডিং পিরিয়ডের সময় বিড গ্রহণ করার জন্য ডিজাইন করা হয়েছে। যদি highestBid বৃদ্ধি পায়, তবে পূর্ববর্তী সর্বোচ্চ দরদাতা তাদের অর্থ ফেরত পান; বিডিং পিরিয়ড শেষ হয়ে গেলে, beneficiary তাদের অর্থ পাওয়ার জন্য কন্ট্রাক্টটিকে কল করে।
এই ধরনের একটি কন্ট্রাক্টের জন্য ইউনিট টেস্টগুলো বিভিন্ন ফাংশন কভার করবে যা একজন ব্যবহারকারী কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করার সময় কল করতে পারে। একটি উদাহরণ হতে পারে এমন একটি ইউনিট টেস্ট যা পরীক্ষা করে যে নিলাম চলাকালীন কোনো ব্যবহারকারী বিড করতে পারে কিনা (অর্থাৎ, bid()-এ কল সফল হয়) অথবা এমন একটি টেস্ট যা পরীক্ষা করে যে কোনো ব্যবহারকারী বর্তমান highestBid-এর চেয়ে বেশি বিড করতে পারে কিনা।
একটি কন্ট্রাক্টের অপারেশনাল ওয়ার্কফ্লো বোঝা ইউনিট টেস্ট লিখতেও সাহায্য করে যা পরীক্ষা করে যে এক্সিকিউশন প্রয়োজনীয়তা পূরণ করে কিনা। উদাহরণস্বরূপ, নিলাম কন্ট্রাক্টটি নির্দিষ্ট করে যে নিলাম শেষ হয়ে গেলে ব্যবহারকারীরা বিড করতে পারবে না (অর্থাৎ, যখন auctionEndTime, block.timestamp-এর চেয়ে কম হয়)। সুতরাং, একজন ডেভেলপার এমন একটি ইউনিট টেস্ট চালাতে পারেন যা পরীক্ষা করে যে নিলাম শেষ হয়ে গেলে (অর্থাৎ, যখন auctionEndTime > block.timestamp) bid() ফাংশনে কল সফল হয় নাকি ব্যর্থ হয়।
2. কন্ট্রাক্ট এক্সিকিউশন সম্পর্কিত সমস্ত অনুমান মূল্যায়ন করুন
একটি কন্ট্রাক্টের এক্সিকিউশন সম্পর্কে যেকোনো অনুমান ডকুমেন্ট করা এবং সেই অনুমানগুলোর বৈধতা যাচাই করার জন্য ইউনিট টেস্ট লেখা গুরুত্বপূর্ণ। অপ্রত্যাশিত এক্সিকিউশনের বিরুদ্ধে সুরক্ষা প্রদান করার পাশাপাশি, টেস্টিং অ্যাসার্টগুলো আপনাকে এমন অপারেশনগুলো সম্পর্কে ভাবতে বাধ্য করে যা একটি স্মার্ট কন্ট্রাক্টের নিরাপত্তা মডেল ভেঙে দিতে পারে। একটি কার্যকর টিপ হলো "হ্যাপি ইউজার টেস্ট"-এর বাইরে গিয়ে নেগেটিভ টেস্ট লেখা যা পরীক্ষা করে যে ভুল ইনপুটের জন্য কোনো ফাংশন ব্যর্থ হয় কিনা।
অনেক ইউনিট টেস্টিং ফ্রেমওয়ার্ক আপনাকে অ্যাসার্ট তৈরি করার অনুমতি দেয়—সাধারণ স্টেটমেন্ট যা বলে যে একটি কন্ট্রাক্ট কী করতে পারে এবং কী করতে পারে না—এবং এক্সিকিউশনের অধীনে সেই অ্যাসার্টগুলো বজায় থাকে কিনা তা দেখার জন্য টেস্ট চালাতে দেয়। আগে বর্ণিত নিলাম কন্ট্রাক্টে কাজ করা একজন ডেভেলপার নেগেটিভ টেস্ট চালানোর আগে এর আচরণ সম্পর্কে নিম্নলিখিত অ্যাসার্টগুলো তৈরি করতে পারেন:
-
নিলাম শেষ হয়ে গেলে বা শুরু না হলে ব্যবহারকারীরা বিড করতে পারবেন না।
-
যদি কোনো বিড গ্রহণযোগ্য সীমার নিচে থাকে তবে নিলাম কন্ট্রাক্টটি রিভার্ট করে।
-
যে ব্যবহারকারীরা বিড জিততে ব্যর্থ হন তাদের ফান্ড ফেরত দেওয়া হয়
দ্রষ্টব্য: অনুমানগুলো পরীক্ষা করার আরেকটি উপায় হলো এমন টেস্ট লেখা যা একটি কন্ট্রাক্টে ফাংশন মডিফায়ারগুলো (নতুন ট্যাবে খোলে) ট্রিগার করে, বিশেষ করে require, assert এবং if…else স্টেটমেন্টগুলো।
3. কোড কভারেজ পরিমাপ করুন
কোড কভারেজ (নতুন ট্যাবে খোলে) হলো একটি টেস্টিং মেট্রিক যা টেস্ট চলাকালীন এক্সিকিউট হওয়া আপনার কোডের ব্রাঞ্চ, লাইন এবং স্টেটমেন্টের সংখ্যা ট্র্যাক করে। টেস্ট না করা দুর্বলতার ঝুঁকি কমানোর জন্য টেস্টগুলোতে ভালো কোড কভারেজ থাকা উচিত। পর্যাপ্ত কভারেজ ছাড়া, আপনি ভুলভাবে ধরে নিতে পারেন যে আপনার কন্ট্রাক্টটি নিরাপদ কারণ সমস্ত টেস্ট পাস করেছে, অথচ টেস্ট না করা কোড পাথগুলোতে দুর্বলতাগুলো এখনও বিদ্যমান থাকতে পারে। তবে উচ্চ কোড কভারেজ রেকর্ড করা এই নিশ্চয়তা দেয় যে একটি স্মার্ট কন্ট্রাক্টের সমস্ত স্টেটমেন্ট/ফাংশন সঠিকতার জন্য পর্যাপ্তভাবে পরীক্ষা করা হয়েছে।
4. সুগঠিত টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করুন
আপনার স্মার্ট কন্ট্রাক্টের জন্য ইউনিট টেস্ট চালানোর ক্ষেত্রে ব্যবহৃত টুলগুলোর গুণমান অত্যন্ত গুরুত্বপূর্ণ। একটি আদর্শ টেস্টিং ফ্রেমওয়ার্ক হলো সেটি যা নিয়মিত রক্ষণাবেক্ষণ করা হয়; দরকারী বৈশিষ্ট্য প্রদান করে (যেমন, লগিং এবং রিপোর্টিং ক্ষমতা); এবং অবশ্যই অন্যান্য ডেভেলপারদের দ্বারা ব্যাপকভাবে ব্যবহৃত এবং পরীক্ষিত হতে হবে।
Solidity স্মার্ট কন্ট্রাক্টের জন্য ইউনিট টেস্টিং ফ্রেমওয়ার্কগুলো বিভিন্ন ভাষায় আসে (বেশিরভাগই JavaScript, Python এবং Rust)। বিভিন্ন টেস্টিং ফ্রেমওয়ার্কের সাহায্যে কীভাবে ইউনিট টেস্ট চালানো শুরু করবেন সে সম্পর্কে তথ্যের জন্য নিচের কিছু গাইড দেখুন:
- Brownie-এর সাহায্যে ইউনিট টেস্ট চালানো (নতুন ট্যাবে খোলে)
- Foundry-এর সাহায্যে ইউনিট টেস্ট চালানো (নতুন ট্যাবে খোলে)
- Waffle-এর সাহায্যে ইউনিট টেস্ট চালানো (নতুন ট্যাবে খোলে)
- Remix-এর সাহায্যে ইউনিট টেস্ট চালানো (নতুন ট্যাবে খোলে)
- Ape-এর সাহায্যে ইউনিট টেস্ট চালানো (নতুন ট্যাবে খোলে)
- Hardhat-এর সাহায্যে ইউনিট টেস্ট চালানো (নতুন ট্যাবে খোলে)
- Wake-এর সাহায্যে ইউনিট টেস্ট চালানো (নতুন ট্যাবে খোলে)
ইন্টিগ্রেশন টেস্টিং
ইউনিট টেস্টিং যেখানে কন্ট্রাক্ট ফাংশনগুলোকে বিচ্ছিন্নভাবে ডিবাগ করে, সেখানে ইন্টিগ্রেশন টেস্টগুলো একটি স্মার্ট কন্ট্রাক্টের উপাদানগুলোকে সামগ্রিকভাবে মূল্যায়ন করে। ইন্টিগ্রেশন টেস্টিং ক্রস-কন্ট্রাক্ট কল বা একই স্মার্ট কন্ট্রাক্টের বিভিন্ন ফাংশনের মধ্যে ইন্টারঅ্যাকশন থেকে উদ্ভূত সমস্যাগুলো শনাক্ত করতে পারে। উদাহরণস্বরূপ, ইন্টিগ্রেশন টেস্টগুলো ইনহেরিটেন্স (নতুন ট্যাবে খোলে) এবং ডিপেন্ডেন্সি ইনজেকশনের মতো বিষয়গুলো সঠিকভাবে কাজ করে কিনা তা পরীক্ষা করতে সাহায্য করতে পারে।
যদি আপনার কন্ট্রাক্ট একটি মডুলার আর্কিটেকচার গ্রহণ করে বা এক্সিকিউশনের সময় অন্যান্য অনচেইন কন্ট্রাক্টের সাথে ইন্টারফেস করে তবে ইন্টিগ্রেশন টেস্টিং কার্যকর। ইন্টিগ্রেশন টেস্ট চালানোর একটি উপায় হলো একটি নির্দিষ্ট উচ্চতায় (Forge (নতুন ট্যাবে খোলে) বা Hardhat (নতুন ট্যাবে খোলে)-এর মতো টুল ব্যবহার করে) এবং আপনার কন্ট্রাক্ট ও ডিপ্লয় করা কন্ট্রাক্টগুলোর মধ্যে ইন্টারঅ্যাকশন সিমুলেট করা।
ফর্ক করা ব্লকচেইনটি মেইননেটের মতোই আচরণ করবে এবং এতে সংশ্লিষ্ট স্টেট ও ব্যালেন্সসহ অ্যাকাউন্ট থাকবে। তবে এটি কেবল একটি স্যান্ডবক্সড লোকাল ডেভেলপমেন্ট এনভায়রনমেন্ট হিসেবে কাজ করে, যার অর্থ হলো ট্রানজ্যাকশনের জন্য আপনার আসল ETH-এর প্রয়োজন হবে না, এবং আপনার পরিবর্তনগুলো আসল ইথেরিয়াম প্রোটোকলকেও প্রভাবিত করবে না।
প্রপার্টি-ভিত্তিক টেস্টিং
প্রপার্টি-ভিত্তিক টেস্টিং হলো একটি স্মার্ট কন্ট্রাক্ট কিছু সংজ্ঞায়িত প্রপার্টি পূরণ করে কিনা তা পরীক্ষা করার প্রক্রিয়া। প্রপার্টিগুলো একটি কন্ট্রাক্টের আচরণ সম্পর্কে এমন তথ্য নিশ্চিত করে যা বিভিন্ন পরিস্থিতিতে সত্য থাকবে বলে আশা করা হয়—একটি স্মার্ট কন্ট্রাক্ট প্রপার্টির উদাহরণ হতে পারে "কন্ট্রাক্টে গাণিতিক অপারেশনগুলো কখনোই ওভারফ্লো বা আন্ডারফ্লো হয় না।"
স্ট্যাটিক অ্যানালাইসিস এবং ডায়নামিক অ্যানালাইসিস হলো প্রপার্টি-ভিত্তিক টেস্টিং এক্সিকিউট করার দুটি সাধারণ কৌশল, এবং উভয়ই যাচাই করতে পারে যে একটি প্রোগ্রামের কোড (এই ক্ষেত্রে একটি স্মার্ট কন্ট্রাক্ট) কিছু পূর্বনির্ধারিত প্রপার্টি পূরণ করে কিনা। কিছু প্রপার্টি-ভিত্তিক টেস্টিং টুল প্রত্যাশিত কন্ট্রাক্ট প্রপার্টি সম্পর্কে পূর্বনির্ধারিত নিয়মগুলোর সাথে আসে এবং সেই নিয়মগুলোর বিপরীতে কোড পরীক্ষা করে, অন্যদিকে অন্যগুলো আপনাকে একটি স্মার্ট কন্ট্রাক্টের জন্য কাস্টম প্রপার্টি তৈরি করার অনুমতি দেয়।
স্ট্যাটিক অ্যানালাইসিস
একটি স্ট্যাটিক অ্যানালাইজার একটি স্মার্ট কন্ট্রাক্টের সোর্স কোডকে ইনপুট হিসেবে নেয় এবং একটি কন্ট্রাক্ট কোনো প্রপার্টি পূরণ করে কিনা তা ঘোষণা করে ফলাফল আউটপুট দেয়। ডায়নামিক অ্যানালাইসিসের বিপরীতে, স্ট্যাটিক অ্যানালাইসিসে সঠিকতার জন্য বিশ্লেষণ করতে কোনো কন্ট্রাক্ট এক্সিকিউট করার প্রয়োজন হয় না। এর পরিবর্তে স্ট্যাটিক অ্যানালাইসিস এক্সিকিউশনের সময় একটি স্মার্ট কন্ট্রাক্ট নিতে পারে এমন সমস্ত সম্ভাব্য পাথ সম্পর্কে যুক্তি দেয় (অর্থাৎ, রানটাইমে কন্ট্রাক্টের অপারেশনের জন্য এর অর্থ কী হবে তা নির্ধারণ করতে সোর্স কোডের কাঠামো পরীক্ষা করে)।
কন্ট্রাক্টগুলোতে স্ট্যাটিক অ্যানালাইসিস চালানোর জন্য লিন্টিং (নতুন ট্যাবে খোলে) এবং স্ট্যাটিক টেস্টিং (নতুন ট্যাবে খোলে) হলো সাধারণ পদ্ধতি। উভয়ের জন্যই একটি কন্ট্রাক্টের এক্সিকিউশনের লো-লেভেল উপস্থাপনা বিশ্লেষণ করা প্রয়োজন, যেমন কম্পাইলার দ্বারা আউটপুট করা অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (নতুন ট্যাবে খোলে) এবং কন্ট্রোল ফ্লো গ্রাফ (নতুন ট্যাবে খোলে)।
বেশিরভাগ ক্ষেত্রে, স্ট্যাটিক অ্যানালাইসিস একটি কন্ট্রাক্টের কোডে অনিরাপদ কনস্ট্রাক্টের ব্যবহার, সিনট্যাক্স ত্রুটি বা কোডিং স্ট্যান্ডার্ড লঙ্ঘনের মতো নিরাপত্তা সমস্যাগুলো শনাক্ত করার জন্য কার্যকর। তবে, স্ট্যাটিক অ্যানালাইজারগুলো সাধারণত গভীর দুর্বলতাগুলো শনাক্ত করার ক্ষেত্রে ত্রুটিপূর্ণ বলে পরিচিত, এবং অতিরিক্ত ফলস পজিটিভ তৈরি করতে পারে।
ডায়নামিক অ্যানালাইসিস
ডায়নামিক অ্যানালাইসিস একটি স্মার্ট কন্ট্রাক্টের ফাংশনগুলোতে সিম্বলিক ইনপুট (যেমন, সিম্বলিক এক্সিকিউশনে (নতুন ট্যাবে খোলে)) বা কংক্রিট ইনপুট (যেমন, ফাজিংয়ে (নতুন ট্যাবে খোলে)) তৈরি করে যাতে দেখা যায় যে কোনো এক্সিকিউশন ট্রেস নির্দিষ্ট প্রপার্টি লঙ্ঘন করে কিনা। প্রপার্টি-ভিত্তিক টেস্টিংয়ের এই রূপটি ইউনিট টেস্টের থেকে আলাদা কারণ টেস্ট কেসগুলো একাধিক পরিস্থিতি কভার করে এবং একটি প্রোগ্রাম টেস্ট কেস তৈরির কাজ পরিচালনা করে।
স্মার্ট কন্ট্রাক্টে নির্বিচার প্রপার্টি যাচাই করার জন্য ডায়নামিক অ্যানালাইসিস কৌশলের একটি উদাহরণ হলো ফাজিং (নতুন ট্যাবে খোলে)। একটি ফাজার একটি সংজ্ঞায়িত ইনপুট মানের র্যান্ডম বা বিকৃত বৈচিত্র্যসহ একটি টার্গেট কন্ট্রাক্টে ফাংশনগুলোকে ইনভোক করে। যদি স্মার্ট কন্ট্রাক্টটি কোনো ত্রুটি স্টেটে প্রবেশ করে (যেমন, যেখানে একটি অ্যাসার্ট ব্যর্থ হয়), তবে সমস্যাটি চিহ্নিত করা হয় এবং যে ইনপুটগুলো এক্সিকিউশনকে দুর্বল পাথের দিকে নিয়ে যায় সেগুলো একটি রিপোর্টে তৈরি করা হয়।
একটি স্মার্ট কন্ট্রাক্টের ইনপুট ভ্যালিডেশন মেকানিজম মূল্যায়ন করার জন্য ফাজিং কার্যকর, কারণ অপ্রত্যাশিত ইনপুটগুলোর অনুপযুক্ত পরিচালনার ফলে অনাকাঙ্ক্ষিত এক্সিকিউশন হতে পারে এবং বিপজ্জনক প্রভাব তৈরি করতে পারে। প্রপার্টি-ভিত্তিক টেস্টিংয়ের এই রূপটি অনেক কারণে আদর্শ হতে পারে:
-
অনেক পরিস্থিতি কভার করার জন্য টেস্ট কেস লেখা কঠিন। একটি প্রপার্টি টেস্টের জন্য কেবল প্রয়োজন যে আপনি একটি আচরণ এবং সেই আচরণটি পরীক্ষা করার জন্য ডেটার একটি পরিসর সংজ্ঞায়িত করুন—প্রোগ্রামটি স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত প্রপার্টির ওপর ভিত্তি করে টেস্ট কেস তৈরি করে।
-
আপনার টেস্ট স্যুট প্রোগ্রামের মধ্যে সমস্ত সম্ভাব্য পাথ পর্যাপ্তভাবে কভার নাও করতে পারে। এমনকি 100% কভারেজ থাকা সত্ত্বেও, এজ কেসগুলো মিস করা সম্ভব।
-
ইউনিট টেস্ট প্রমাণ করে যে একটি কন্ট্রাক্ট নমুনা ডেটার জন্য সঠিকভাবে এক্সিকিউট করে, তবে নমুনার বাইরের ইনপুটগুলোর জন্য কন্ট্রাক্টটি সঠিকভাবে এক্সিকিউট করে কিনা তা অজানা থেকে যায়। প্রপার্টি টেস্টগুলো অ্যাসার্ট ব্যর্থতার কারণ হওয়া এক্সিকিউশন ট্রেসগুলো খুঁজে পেতে একটি প্রদত্ত ইনপুট মানের একাধিক বৈচিত্র্যসহ একটি টার্গেট কন্ট্রাক্ট এক্সিকিউট করে। সুতরাং, একটি প্রপার্টি টেস্ট আরও বেশি গ্যারান্টি প্রদান করে যে একটি কন্ট্রাক্ট ইনপুট ডেটার একটি বিস্তৃত শ্রেণির জন্য সঠিকভাবে এক্সিকিউট করে।
স্মার্ট কন্ট্রাক্টের জন্য প্রপার্টি-ভিত্তিক টেস্টিং চালানোর নির্দেশিকা
প্রপার্টি-ভিত্তিক টেস্টিং চালানো সাধারণত একটি প্রপার্টি (যেমন, ইন্টিজার ওভারফ্লোর (নতুন ট্যাবে খোলে) অনুপস্থিতি) বা প্রপার্টির সংগ্রহ সংজ্ঞায়িত করার মাধ্যমে শুরু হয় যা আপনি একটি স্মার্ট কন্ট্রাক্টে যাচাই করতে চান। প্রপার্টি টেস্ট লেখার সময় আপনাকে এমন মানগুলোর একটি পরিসরও সংজ্ঞায়িত করতে হতে পারে যার মধ্যে প্রোগ্রামটি ট্রানজ্যাকশন ইনপুটগুলোর জন্য ডেটা তৈরি করতে পারে।
একবার সঠিকভাবে কনফিগার করা হলে, প্রপার্টি টেস্টিং টুলটি র্যান্ডমভাবে তৈরি করা ইনপুটগুলোর সাহায্যে আপনার স্মার্ট কন্ট্রাক্টের ফাংশনগুলো এক্সিকিউট করবে। যদি কোনো অ্যাসার্ট লঙ্ঘন হয়, তবে আপনার এমন কংক্রিট ইনপুট ডেটাসহ একটি রিপোর্ট পাওয়া উচিত যা মূল্যায়নাধীন প্রপার্টি লঙ্ঘন করে। বিভিন্ন টুলের সাহায্যে প্রপার্টি-ভিত্তিক টেস্টিং চালানো শুরু করতে নিচের কিছু গাইড দেখুন:
- স্লিদার-এর সাহায্যে স্মার্ট কন্ট্রাক্টের স্ট্যাটিক অ্যানালাইসিস (নতুন ট্যাবে খোলে)
- Wake-এর সাহায্যে স্মার্ট কন্ট্রাক্টের স্ট্যাটিক অ্যানালাইসিস (নতুন ট্যাবে খোলে)
- Brownie-এর সাহায্যে প্রপার্টি-ভিত্তিক টেস্টিং (নতুন ট্যাবে খোলে)
- Foundry-এর সাহায্যে কন্ট্রাক্ট ফাজিং (নতুন ট্যাবে খোলে)
- একিডনা-এর সাহায্যে কন্ট্রাক্ট ফাজিং (নতুন ট্যাবে খোলে)
- Wake-এর সাহায্যে কন্ট্রাক্ট ফাজিং (নতুন ট্যাবে খোলে)
- ম্যান্টিকোর-এর সাহায্যে স্মার্ট কন্ট্রাক্টের সিম্বলিক এক্সিকিউশন (নতুন ট্যাবে খোলে)
- Mythril-এর সাহায্যে স্মার্ট কন্ট্রাক্টের সিম্বলিক এক্সিকিউশন (নতুন ট্যাবে খোলে)
স্মার্ট কন্ট্রাক্টের জন্য ম্যানুয়াল টেস্টিং
স্মার্ট কন্ট্রাক্টের ম্যানুয়াল টেস্টিং প্রায়শই স্বয়ংক্রিয় টেস্ট চালানোর পরে ডেভেলপমেন্ট সাইকেলের পরবর্তী ধাপে আসে। টেস্টিংয়ের এই রূপটি স্মার্ট কন্ট্রাক্টটিকে একটি সম্পূর্ণ সমন্বিত পণ্য হিসেবে মূল্যায়ন করে যাতে দেখা যায় যে এটি প্রযুক্তিগত প্রয়োজনীয়তাগুলোতে নির্দিষ্ট করা অনুযায়ী কাজ করে কিনা।
লোকাল ব্লকচেইনে কন্ট্রাক্ট টেস্টিং
যদিও একটি লোকাল ডেভেলপমেন্ট এনভায়রনমেন্টে করা স্বয়ংক্রিয় টেস্টিং দরকারী ডিবাগিং তথ্য প্রদান করতে পারে, আপনি জানতে চাইবেন যে আপনার স্মার্ট কন্ট্রাক্ট একটি প্রোডাকশন এনভায়রনমেন্টে কীভাবে আচরণ করে। তবে, প্রধান ইথেরিয়াম চেইনে ডিপ্লয় করার জন্য গ্যাস ফি লাগে—তাছাড়া আপনার স্মার্ট কন্ট্রাক্টে এখনও বাগ থাকলে আপনি বা আপনার ব্যবহারকারীরা আসল অর্থ হারাতে পারেন।
মেইননেটে টেস্টিং করার একটি প্রস্তাবিত বিকল্প হলো একটি লোকাল ব্লকচেইনে (যা ডেভেলপমেন্ট নেটওয়ার্ক হিসেবেও পরিচিত) আপনার কন্ট্রাক্ট টেস্টিং করা। একটি লোকাল ব্লকচেইন হলো আপনার কম্পিউটারে স্থানীয়ভাবে চলা ইথেরিয়াম ব্লকচেইনের একটি অনুলিপি যা ইথেরিয়ামের এক্সিকিউশন লেয়ারের আচরণ সিমুলেট করে। এর ফলে, আপনি উল্লেখযোগ্য ওভারহেড ছাড়াই একটি কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করার জন্য ট্রানজ্যাকশন প্রোগ্রাম করতে পারেন।
একটি লোকাল ব্লকচেইনে কন্ট্রাক্ট চালানো ম্যানুয়াল ইন্টিগ্রেশন টেস্টিংয়ের একটি রূপ হিসেবে কার্যকর হতে পারে। স্মার্ট কন্ট্রাক্টগুলো অত্যন্ত সংযোজনযোগ্য, যা আপনাকে বিদ্যমান প্রোটোকলগুলোর সাথে একীভূত হওয়ার অনুমতি দেয়—তবে আপনাকে এখনও নিশ্চিত করতে হবে যে এই ধরনের জটিল অনচেইন ইন্টারঅ্যাকশনগুলো সঠিক ফলাফল তৈরি করে।
ডেভেলপমেন্ট নেটওয়ার্ক সম্পর্কে আরও জানুন।
টেস্টনেটে কন্ট্রাক্ট টেস্টিং
একটি টেস্ট নেটওয়ার্ক বা টেস্টনেট ঠিক ইথেরিয়াম মেইননেটের মতোই কাজ করে, তবে এটি এমন ইথার (ETH) ব্যবহার করে যার কোনো বাস্তব-বিশ্বের মূল্য নেই। একটি টেস্টনেটে আপনার কন্ট্রাক্ট ডিপ্লয় করার অর্থ হলো যে কেউ ফান্ড ঝুঁকিতে না ফেলেই এর সাথে ইন্টারঅ্যাক্ট করতে পারে (যেমন, dapp-এর ফ্রন্টএন্ডের মাধ্যমে)।
ম্যানুয়াল টেস্টিংয়ের এই রূপটি একজন ব্যবহারকারীর দৃষ্টিকোণ থেকে আপনার অ্যাপ্লিকেশনের এন্ড-টু-এন্ড ফ্লো মূল্যায়ন করার জন্য কার্যকর। এখানে, বিটা টেস্টাররাও ট্রায়াল রান করতে পারে এবং কন্ট্রাক্টের বিজনেস লজিক ও সামগ্রিক কার্যকারিতা নিয়ে কোনো সমস্যা থাকলে তা রিপোর্ট করতে পারে।
একটি লোকাল ব্লকচেইনে টেস্টিং করার পরে একটি টেস্টনেটে ডিপ্লয় করা আদর্শ কারণ এটি ইথেরিয়াম ভার্চুয়াল মেশিনের আচরণের কাছাকাছি। তাই, বাস্তব-বিশ্বের পরিস্থিতিতে একটি স্মার্ট কন্ট্রাক্টের অপারেশন মূল্যায়ন করার জন্য অনেক ইথেরিয়াম-নেটিভ প্রজেক্টের টেস্টনেটে dapp ডিপ্লয় করা সাধারণ।
ইথেরিয়াম টেস্টনেট সম্পর্কে আরও জানুন।
টেস্টিং বনাম বিধিবদ্ধ যাচাইকরণ
যদিও টেস্টিং নিশ্চিত করতে সাহায্য করে যে একটি কন্ট্রাক্ট কিছু ডেটা ইনপুটের জন্য প্রত্যাশিত ফলাফল প্রদান করে, এটি টেস্টের সময় ব্যবহৃত না হওয়া ইনপুটগুলোর জন্য চূড়ান্তভাবে একই প্রমাণ করতে পারে না। তাই, একটি স্মার্ট কন্ট্রাক্ট টেস্টিং করা "কার্যকরী সঠিকতা" গ্যারান্টি দিতে পারে না (অর্থাৎ, এটি দেখাতে পারে না যে একটি প্রোগ্রাম ইনপুট মানগুলোর সমস্ত সেটের জন্য প্রয়োজনীয় আচরণ করে)।
বিধিবদ্ধ যাচাইকরণ হলো প্রোগ্রামের একটি ফর্মাল মডেল ফর্মাল স্পেসিফিকেশনের সাথে মেলে কিনা তা পরীক্ষা করে সফটওয়্যারের সঠিকতা মূল্যায়ন করার একটি পদ্ধতি। একটি ফর্মাল মডেল হলো একটি প্রোগ্রামের একটি বিমূর্ত গাণিতিক উপস্থাপনা, অন্যদিকে একটি ফর্মাল স্পেসিফিকেশন একটি প্রোগ্রামের প্রপার্টিগুলো সংজ্ঞায়িত করে (অর্থাৎ, প্রোগ্রামের এক্সিকিউশন সম্পর্কে যৌক্তিক অ্যাসার্ট)।
যেহেতু প্রপার্টিগুলো গাণিতিক পরিভাষায় লেখা হয়, তাই অনুমানের যৌক্তিক নিয়মগুলো ব্যবহার করে সিস্টেমের একটি ফর্মাল (গাণিতিক) মডেল একটি স্পেসিফিকেশন পূরণ করে কিনা তা যাচাই করা সম্ভব হয়। সুতরাং, বিধিবদ্ধ যাচাইকরণ টুলগুলো একটি সিস্টেমের সঠিকতার 'গাণিতিক প্রমাণ' তৈরি করে বলে বলা হয়।
টেস্টিংয়ের বিপরীতে, বিধিবদ্ধ যাচাইকরণ ব্যবহার করে যাচাই করা যেতে পারে যে একটি স্মার্ট কন্ট্রাক্টের এক্সিকিউশন নমুনা ডেটা দিয়ে এক্সিকিউট করার প্রয়োজন ছাড়াই সমস্ত এক্সিকিউশনের জন্য একটি ফর্মাল স্পেসিফিকেশন পূরণ করে (অর্থাৎ, এতে কোনো বাগ নেই)। এটি কেবল ডজন ডজন ইউনিট টেস্ট চালানোর সময়ই কমায় না, বরং এটি লুকানো দুর্বলতাগুলো ধরার ক্ষেত্রেও বেশি কার্যকর। তবে, বিধিবদ্ধ যাচাইকরণ কৌশলগুলো তাদের বাস্তবায়নের অসুবিধা এবং উপযোগিতার ওপর নির্ভর করে একটি বর্ণালীতে অবস্থান করে।
স্মার্ট কন্ট্রাক্টের জন্য বিধিবদ্ধ যাচাইকরণ সম্পর্কে আরও জানুন।
টেস্টিং বনাম অডিট এবং বাগ বাউন্টি
যেমনটি উল্লেখ করা হয়েছে, কঠোর টেস্টিং খুব কমই একটি কন্ট্রাক্টে বাগের অনুপস্থিতির গ্যারান্টি দিতে পারে; বিধিবদ্ধ যাচাইকরণ পদ্ধতিগুলো সঠিকতার শক্তিশালী নিশ্চয়তা প্রদান করতে পারে তবে বর্তমানে এগুলো ব্যবহার করা কঠিন এবং এতে উল্লেখযোগ্য খরচ হয়।
তবুও, আপনি একটি স্বাধীন কোড রিভিউ পেয়ে কন্ট্রাক্টের দুর্বলতাগুলো ধরার সম্ভাবনা আরও বাড়াতে পারেন। স্মার্ট কন্ট্রাক্ট অডিট (নতুন ট্যাবে খোলে) এবং বাগ বাউন্টি (নতুন ট্যাবে খোলে) হলো অন্যদের দিয়ে আপনার কন্ট্রাক্টগুলো বিশ্লেষণ করানোর দুটি উপায়।
অডিটগুলো এমন অডিটরদের দ্বারা করা হয় যারা স্মার্ট কন্ট্রাক্টে নিরাপত্তা ত্রুটি এবং দুর্বল ডেভেলপমেন্ট অনুশীলনের ঘটনাগুলো খুঁজে বের করতে অভিজ্ঞ। একটি অডিটে সাধারণত টেস্টিং (এবং সম্ভবত বিধিবদ্ধ যাচাইকরণ) এর পাশাপাশি সম্পূর্ণ কোডবেসের একটি ম্যানুয়াল রিভিউ অন্তর্ভুক্ত থাকবে।
বিপরীতে, একটি বাগ বাউন্টি প্রোগ্রামে সাধারণত এমন একজন ব্যক্তিকে (যাকে সাধারণত হোয়াইটহ্যাট হ্যাকার (নতুন ট্যাবে খোলে) হিসেবে বর্ণনা করা হয়) আর্থিক পুরস্কার দেওয়া জড়িত থাকে যে একটি স্মার্ট কন্ট্রাক্টে একটি দুর্বলতা আবিষ্কার করে এবং এটি ডেভেলপারদের কাছে প্রকাশ করে। বাগ বাউন্টিগুলো অডিটের মতোই কারণ এতে স্মার্ট কন্ট্রাক্টে ত্রুটি খুঁজে পেতে অন্যদের সাহায্য চাওয়া জড়িত।
প্রধান পার্থক্য হলো যে বাগ বাউন্টি প্রোগ্রামগুলো বৃহত্তর ডেভেলপার/হ্যাকার সম্প্রদায়ের জন্য উন্মুক্ত এবং অনন্য দক্ষতা ও অভিজ্ঞতাসম্পন্ন এথিক্যাল হ্যাকার এবং স্বাধীন নিরাপত্তা পেশাদারদের একটি বিস্তৃত শ্রেণিকে আকর্ষণ করে। এটি স্মার্ট কন্ট্রাক্ট অডিটের তুলনায় একটি সুবিধা হতে পারে যা প্রধানত এমন দলগুলোর ওপর নির্ভর করে যাদের সীমিত বা সংকীর্ণ দক্ষতা থাকতে পারে।
টেস্টিং টুল এবং লাইব্রেরি
ইউনিট টেস্টিং টুল
-
solidity-coverage (নতুন ট্যাবে খোলে) - Solidity-তে লেখা স্মার্ট কন্ট্রাক্টের জন্য কোড কভারেজ টুল।
-
Waffle (নতুন ট্যাবে খোলে) - উন্নত স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট এবং টেস্টিংয়ের জন্য ফ্রেমওয়ার্ক (Ethers.js-এর ওপর ভিত্তি করে)।
-
Remix Tests (নতুন ট্যাবে খোলে) - Solidity স্মার্ট কন্ট্রাক্ট টেস্টিংয়ের জন্য টুল। Remix IDE "Solidity Unit Testing" প্লাগইনের অধীনে কাজ করে যা একটি কন্ট্রাক্টের জন্য টেস্ট কেস লিখতে এবং চালাতে ব্যবহৃত হয়।
-
OpenZeppelin Test Helpers (নতুন ট্যাবে খোলে) - ইথেরিয়াম স্মার্ট কন্ট্রাক্ট টেস্টিংয়ের জন্য অ্যাসার্শন লাইব্রেরি। নিশ্চিত করুন যে আপনার কন্ট্রাক্টগুলো প্রত্যাশা অনুযায়ী আচরণ করে!
-
Brownie ইউনিট টেস্টিং ফ্রেমওয়ার্ক (নতুন ট্যাবে খোলে) - Brownie Pytest ব্যবহার করে, যা একটি বৈশিষ্ট্য-সমৃদ্ধ টেস্ট ফ্রেমওয়ার্ক যা আপনাকে ন্যূনতম কোড দিয়ে ছোট টেস্ট লিখতে দেয়, বড় প্রজেক্টের জন্য ভালোভাবে স্কেল করে এবং অত্যন্ত সম্প্রসারণযোগ্য।
-
Foundry Tests (নতুন ট্যাবে খোলে) - Foundry Forge অফার করে, যা একটি দ্রুত এবং নমনীয় ইথেরিয়াম টেস্টিং ফ্রেমওয়ার্ক যা সাধারণ ইউনিট টেস্ট, গ্যাস অপ্টিমাইজেশন চেক এবং কন্ট্রাক্ট ফাজিং এক্সিকিউট করতে সক্ষম।
-
Hardhat Tests (নতুন ট্যাবে খোলে) - Ethers.js, Mocha এবং Chai-এর ওপর ভিত্তি করে স্মার্ট কন্ট্রাক্ট টেস্টিংয়ের জন্য ফ্রেমওয়ার্ক।
-
ApeWorx (নতুন ট্যাবে খোলে) - ইথেরিয়াম ভার্চুয়াল মেশিনকে টার্গেট করা স্মার্ট কন্ট্রাক্টের জন্য Python-ভিত্তিক ডেভেলপমেন্ট এবং টেস্টিং ফ্রেমওয়ার্ক।
-
Wake (নতুন ট্যাবে খোলে) - শক্তিশালী ডিবাগিং ক্ষমতা এবং ক্রস-চেইন টেস্টিং সমর্থনসহ ইউনিট টেস্টিং এবং ফাজিংয়ের জন্য Python-ভিত্তিক ফ্রেমওয়ার্ক, যা সেরা ব্যবহারকারীর অভিজ্ঞতা এবং পারফরম্যান্সের জন্য pytest এবং Anvil ব্যবহার করে।
প্রপার্টি-ভিত্তিক টেস্টিং টুল
স্ট্যাটিক অ্যানালাইসিস টুল
-
স্লিদার (নতুন ট্যাবে খোলে) - দুর্বলতা খুঁজে বের করতে, কোড বোঝার ক্ষমতা বাড়াতে এবং স্মার্ট কন্ট্রাক্টের জন্য কাস্টম বিশ্লেষণ লিখতে Python-ভিত্তিক Solidity স্ট্যাটিক অ্যানালাইসিস ফ্রেমওয়ার্ক।
-
Ethlint (নতুন ট্যাবে খোলে) - Solidity স্মার্ট কন্ট্রাক্ট প্রোগ্রামিং ভাষার জন্য স্টাইল এবং নিরাপত্তার সর্বোত্তম অনুশীলনগুলো প্রয়োগ করার জন্য লিন্টার।
-
Cyfrin Aderyn (নতুন ট্যাবে খোলে) - Web3 স্মার্ট কন্ট্রাক্ট নিরাপত্তা এবং ডেভেলপমেন্টের জন্য বিশেষভাবে ডিজাইন করা Rust-ভিত্তিক স্ট্যাটিক অ্যানালাইজার।
-
Wake (নতুন ট্যাবে খোলে) - দুর্বলতা এবং কোড কোয়ালিটি ডিটেক্টর, কোড থেকে দরকারী তথ্য বের করার জন্য প্রিন্টার এবং কাস্টম সাবমডিউল লেখার সমর্থনসহ Python-ভিত্তিক স্ট্যাটিক অ্যানালাইসিস ফ্রেমওয়ার্ক।
-
Slippy (নতুন ট্যাবে খোলে) - Solidity-এর জন্য একটি সহজ এবং শক্তিশালী লিন্টার।
ডায়নামিক অ্যানালাইসিস টুল
-
একিডনা (নতুন ট্যাবে খোলে) - প্রপার্টি-ভিত্তিক টেস্টিংয়ের মাধ্যমে স্মার্ট কন্ট্রাক্টে দুর্বলতা শনাক্ত করার জন্য দ্রুত কন্ট্রাক্ট ফাজার।
-
Diligence Fuzzing (নতুন ট্যাবে খোলে) - স্মার্ট কন্ট্রাক্ট কোডে প্রপার্টি লঙ্ঘন শনাক্ত করার জন্য কার্যকর স্বয়ংক্রিয় ফাজিং টুল।
-
ম্যান্টিকোর (নতুন ট্যাবে খোলে) - EVM বাইটকোড বিশ্লেষণ করার জন্য ডায়নামিক সিম্বলিক এক্সিকিউশন ফ্রেমওয়ার্ক।
-
Mythril (নতুন ট্যাবে খোলে) - টেইন্ট অ্যানালাইসিস, কনকোলিক অ্যানালাইসিস এবং কন্ট্রোল ফ্লো চেকিং ব্যবহার করে কন্ট্রাক্টের দুর্বলতা শনাক্ত করার জন্য EVM বাইটকোড মূল্যায়ন টুল।
-
Diligence Scribble (নতুন ট্যাবে খোলে) - Scribble হলো একটি স্পেসিফিকেশন ভাষা এবং রানটাইম ভেরিফিকেশন টুল যা আপনাকে প্রপার্টিসহ স্মার্ট কন্ট্রাক্টগুলো টীকা করতে দেয় যা আপনাকে Diligence Fuzzing বা MythX-এর মতো টুলগুলোর সাহায্যে স্বয়ংক্রিয়ভাবে কন্ট্রাক্টগুলো পরীক্ষা করার অনুমতি দেয়।
সম্পর্কিত টিউটোরিয়াল
- বিভিন্ন টেস্টিং পণ্যের একটি ওভারভিউ এবং তুলনা _
- স্মার্ট কন্ট্রাক্ট টেস্টিং করতে কীভাবে একিডনা ব্যবহার করবেন
- স্মার্ট কন্ট্রাক্টের বাগ খুঁজে পেতে কীভাবে ম্যান্টিকোর ব্যবহার করবেন
- স্মার্ট কন্ট্রাক্টের বাগ খুঁজে পেতে কীভাবে স্লিদার ব্যবহার করবেন
- টেস্টিংয়ের জন্য কীভাবে Solidity কন্ট্রাক্ট মক করবেন
- Foundry ব্যবহার করে Solidity-তে কীভাবে ইউনিট টেস্ট চালাবেন (নতুন ট্যাবে খোলে)
আরও পড়ুন
- ইথেরিয়াম স্মার্ট কন্ট্রাক্ট টেস্টিংয়ের একটি গভীর গাইড (নতুন ট্যাবে খোলে)
- কীভাবে ইথেরিয়াম স্মার্ট কন্ট্রাক্ট টেস্টিং করবেন (নতুন ট্যাবে খোলে)
- ডেভেলপারদের জন্য MolochDAO-এর ইউনিট টেস্টিং গাইড (নতুন ট্যাবে খোলে)
- কীভাবে একজন রকস্টারের মতো স্মার্ট কন্ট্রাক্ট টেস্টিং করবেন (নতুন ট্যাবে খোলে)
টিউটোরিয়াল: ইথেরিয়ামে স্মার্ট কন্ট্রাক্ট টেস্টিং
- একটি লোকাল, মাল্টি-ক্লায়েন্ট টেস্টনেটে কীভাবে একটি dApp তৈরি এবং টেস্টিং করবেন – একটি লোকাল টেস্টনেটে একটি স্মার্ট কন্ট্রাক্ট ডিপ্লয় করা এবং টেস্ট করার ওয়াকথ্রু।
- টেস্টিংয়ের জন্য কীভাবে Solidity স্মার্ট কন্ট্রাক্ট মক করবেন – কীভাবে মক ডেটা ব্যবহার করতে হয় এবং ইউনিট টেস্টিং বাস্তবায়ন করতে হয় তার ওপর ইন্টারমিডিয়েট টিউটোরিয়াল।
- স্মার্ট কন্ট্রাক্ট টেস্টিং করতে কীভাবে একিডনা ব্যবহার করবেন – ফাজিং এবং স্মার্ট কন্ট্রাক্ট টেস্টিংয়ের উন্নত পদ্ধতি।