স্মার্ট কন্ট্রাক্ট নিরাপত্তা
পেজ সর্বশেষ আপডেট: 26 ফেব্রুয়ারী, 2026
স্মার্ট কন্ট্রাক্ট অত্যন্ত নমনীয় এবং প্রচুর পরিমাণ ভ্যালু ও ডেটা নিয়ন্ত্রণ করতে সক্ষম, যা ব্লকচেইন-এ ডিপ্লয় করা কোডের উপর ভিত্তি করে ইমমিউটেবল লজিক চালায়। এটি ট্রাস্টলেস এবং ডিসেন্ট্রালাইজড এপ্লিকেশন-এর একটি প্রাণবন্ত ইকোসিস্টেম তৈরি করেছে যা লিগ্যাসি সিস্টেমের তুলনায় অনেক সুবিধা প্রদান করে। এগুলো আক্রমণকারীদের জন্য স্মার্ট কন্ট্রাক্ট-এর দুর্বলতাগুলোকে কাজে লাগিয়ে লাভবান হওয়ার সুযোগও তৈরি করে।
পাবলিক ব্লকচেইন, যেমন ইথিরিয়াম, স্মার্ট কন্ট্রাক্ট সুরক্ষিত করার বিষয়টিকে আরও জটিল করে তোলে। ডিপ্লয় করা কন্ট্রাক্ট কোড সাধারণত সিকিউরিটি ত্রুটিগুলো ঠিক করার জন্য পরিবর্তন করা যায় না, অন্যদিকে স্মার্ট কন্ট্রাক্ট থেকে চুরি হওয়া সম্পদ ট্র্যাক করা অত্যন্ত কঠিন এবং ইমমিউটেবল হওয়ার কারণে বেশিরভাগ ক্ষেত্রেই তা পুনরুদ্ধার করা অসম্ভব।
যদিও পরিসংখ্যান ভিন্ন হতে পারে, তবে অনুমান করা হয় যে স্মার্ট কন্ট্রাক্ট-এর সিকিউরিটি ত্রুটির কারণে চুরি হওয়া বা হারিয়ে যাওয়া ভ্যালুর মোট পরিমাণ সহজেই 1 বিলিয়ন ডলারের বেশি। এর মধ্যে রয়েছে হাই-প্রোফাইল ঘটনা, যেমন DAO হ্যাক (opens in a new tab) (3.6M ETH চুরি হয়েছে, যার বর্তমান মূল্য 1B ডলারের বেশি), প্যারিটি মাল্টিসিগ ওয়ালেট হ্যাক (opens in a new tab) (হ্যাকারদের কাছে 30M ডলার হারানো), এবং প্যারিটি ফ্রোজেন ওয়ালেট ইস্যু (opens in a new tab) (300M ডলারের বেশি ETH চিরতরে লক হয়ে যাওয়া)।
উপরে উল্লিখিত সমস্যাগুলোর কারণে ডেভেলপারদের জন্য নিরাপদ, শক্তিশালী এবং স্থিতিস্থাপক স্মার্ট কন্ট্রাক্ট তৈরিতে প্রচেষ্টা বিনিয়োগ করা অপরিহার্য হয়ে ওঠে। স্মার্ট কন্ট্রাক্ট নিরাপত্তা একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়, এবং এটি শেখা প্রত্যেক ডেভেলপারের জন্যই ভালো হবে। এই নির্দেশিকাটি ইথিরিয়াম ডেভেলপারদের জন্য সিকিউরিটি বিবেচনাগুলো কভার করবে এবং স্মার্ট কন্ট্রাক্ট নিরাপত্তা উন্নত করার রিসোর্সগুলো অন্বেষণ করবে।
পূর্বশর্ত
নিরাপত্তা নিয়ে কাজ শুরু করার আগে নিশ্চিত করুন যে আপনার স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টের মৌলিক বিষয়গুলো সম্পর্কে ভালো ধারণা আছে।
নিরাপদ ইথিরিয়াম স্মার্ট কন্ট্রাক্ট তৈরির নির্দেশিকা
1. সঠিক এক্সেস কন্ট্রোল ডিজাইন করুন
স্মার্ট কন্ট্রাক্ট-এ, public বা external হিসেবে চিহ্নিত ফাংশনগুলো যেকোনো এক্সটার্নালি ওনড একাউন্ট (EOAs) বা কন্ট্রাক্ট একাউন্ট দ্বারা কল করা যেতে পারে। আপনি যদি চান অন্যরা আপনার কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করুক, তবে ফাংশনগুলোর জন্য পাবলিক ভিজিবিলিটি নির্দিষ্ট করা প্রয়োজন। তবে private হিসেবে চিহ্নিত ফাংশনগুলো শুধুমাত্র স্মার্ট কন্ট্রাক্ট-এর ভেতরের ফাংশন দ্বারাই কল করা যায়, কোনো এক্সটার্নাল একাউন্ট দ্বারা নয়। নেটওয়ার্ক-এর প্রতিটি অংশগ্রহণকারীকে কন্ট্রাক্ট ফাংশনগুলোতে এক্সেস দেওয়া সমস্যার কারণ হতে পারে, বিশেষ করে যদি এর মানে হয় যে যেকেউ সংবেদনশীল কাজগুলো (যেমন, নতুন টোকেন মিন্ট করা) করতে পারে।
স্মার্ট কন্ট্রাক্ট ফাংশনগুলোর অননুমোদিত ব্যবহার রোধ করতে, নিরাপদ এক্সেস কন্ট্রোল বাস্তবায়ন করা প্রয়োজন। এক্সেস কন্ট্রোল মেকানিজমগুলো একটি স্মার্ট কন্ট্রাক্ট-এর নির্দিষ্ট ফাংশনগুলো ব্যবহারের ক্ষমতা শুধুমাত্র অনুমোদিত সত্তাগুলোর মধ্যে সীমাবদ্ধ করে, যেমন কন্ট্রাক্ট পরিচালনার জন্য দায়ী একাউন্টগুলো। স্মার্ট কন্ট্রাক্ট-এ এক্সেস কন্ট্রোল বাস্তবায়নের জন্য Ownable pattern এবং role-based control হলো দুটি কার্যকরী প্যাটার্ন:
Ownable প্যাটার্ন
Ownable প্যাটার্নে, কন্ট্রাক্ট তৈরির প্রক্রিয়ার সময় একটি এডড্রেস-কে কন্ট্রাক্টের "মালিক" (owner) হিসেবে সেট করা হয়। সুরক্ষিত ফাংশনগুলোতে একটি OnlyOwner মডিফায়ার অ্যাসাইন করা হয়, যা নিশ্চিত করে যে ফাংশনটি এক্সিকিউট করার আগে কন্ট্রাক্টটি কলিং এডড্রেস-এর পরিচয় যাচাই করে। কন্ট্রাক্টের মালিক ছাড়া অন্য কোনো এডড্রেস থেকে সুরক্ষিত ফাংশনগুলোতে কল করা হলে তা সবসময় রিভার্ট হয়ে যায়, যা অবাঞ্ছিত এক্সেস প্রতিরোধ করে।
রোল-ভিত্তিক এক্সেস কন্ট্রোল
একটি স্মার্ট কন্ট্রাক্ট-এ শুধুমাত্র একটি এডড্রেস-কে Owner হিসেবে রেজিস্টার করা সেন্ট্রালাইজেশনের ঝুঁকি তৈরি করে এবং এটি একটি সিঙ্গেল পয়েন্ট-অফ-ফেইলিওর (single point-of-failure) হিসেবে কাজ করে। যদি মালিকের একাউন্ট কি (keys) আপস করা হয়, তবে আক্রমণকারীরা মালিকানাধীন কন্ট্রাক্টে আক্রমণ করতে পারে। এই কারণেই একাধিক অ্যাডমিনিস্ট্রেটিভ একাউন্ট-এর সাথে একটি রোল-ভিত্তিক এক্সেস কন্ট্রোল প্যাটার্ন ব্যবহার করা একটি ভালো বিকল্প হতে পারে।
রোল-ভিত্তিক এক্সেস কন্ট্রোলে, সংবেদনশীল ফাংশনগুলোর এক্সেস বিশ্বস্ত অংশগ্রহণকারীদের একটি সেটের মধ্যে ডিস্ট্রিবিউটেড থাকে। উদাহরণস্বরূপ, একটি একাউন্ট টোকেন মিন্ট করার জন্য দায়ী হতে পারে, যখন অন্য একটি একাউন্ট আপগ্রেড করে বা কন্ট্রাক্টটি পজ (pause) করে। এইভাবে এক্সেস কন্ট্রোল ডিসেন্ট্রালাইজড করা সিঙ্গেল পয়েন্ট অফ ফেইলিওর দূর করে এবং ব্যবহারকারীদের জন্য ট্রাস্ট অ্যাসাম্পশন (trust assumptions) কমায়।
মাল্টি-সিগনেচার ওয়ালেট ব্যবহার করা
নিরাপদ এক্সেস কন্ট্রোল বাস্তবায়নের আরেকটি পদ্ধতি হলো একটি কন্ট্রাক্ট পরিচালনা করার জন্য একটি মাল্টি-সিগনেচার একাউন্ট ব্যবহার করা। একটি সাধারণ EOA-এর বিপরীতে, মাল্টি-সিগনেচার একাউন্টগুলো একাধিক সত্তার মালিকানাধীন থাকে এবং লেনদেন এক্সিকিউট করার জন্য ন্যূনতম সংখ্যক একাউন্ট থেকে সিগনেচারের প্রয়োজন হয়—যেমন 5 জনের মধ্যে 3 জন।
এক্সেস কন্ট্রোলের জন্য একটি মাল্টিসিগ ব্যবহার করা নিরাপত্তার একটি অতিরিক্ত স্তর যুক্ত করে, কারণ টার্গেট কন্ট্রাক্টে কোনো কাজ করার জন্য একাধিক পক্ষের সম্মতির প্রয়োজন হয়। এটি বিশেষভাবে কার্যকর যদি Ownable প্যাটার্ন ব্যবহার করা প্রয়োজনীয় হয়, কারণ এটি কোনো আক্রমণকারী বা ক্ষতিকারক ইনসাইডারের জন্য ক্ষতিকারক উদ্দেশ্যে সংবেদনশীল কন্ট্রাক্ট ফাংশনগুলোকে ম্যানিপুলেট করা আরও কঠিন করে তোলে।
2. কন্ট্রাক্ট অপারেশনগুলো সুরক্ষিত করতে require(), assert(), এবং revert() স্টেটমেন্ট ব্যবহার করুন
যেমনটি উল্লেখ করা হয়েছে, আপনার স্মার্ট কন্ট্রাক্ট একবার ব্লকচেইন-এ ডিপ্লয় হয়ে গেলে যেকেউ এর পাবলিক ফাংশনগুলো কল করতে পারে। যেহেতু আপনি আগে থেকে জানতে পারবেন না যে এক্সটার্নাল একাউন্টগুলো কীভাবে একটি কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করবে, তাই ডিপ্লয় করার আগে সমস্যামূলক অপারেশনগুলোর বিরুদ্ধে অভ্যন্তরীণ সুরক্ষামূলক ব্যবস্থা বাস্তবায়ন করা আদর্শ। আপনি require(), assert(), এবং revert() স্টেটমেন্টগুলো ব্যবহার করে স্মার্ট কন্ট্রাক্ট-এ সঠিক আচরণ নিশ্চিত করতে পারেন, যা নির্দিষ্ট শর্ত পূরণ করতে ব্যর্থ হলে এক্সেপশন ট্রিগার করে এবং স্টেট পরিবর্তনগুলো রিভার্ট করে।
require(): require ফাংশনগুলোর শুরুতে সংজ্ঞায়িত করা হয় এবং এটি নিশ্চিত করে যে কল করা ফাংশনটি এক্সিকিউট হওয়ার আগে পূর্বনির্ধারিত শর্তগুলো পূরণ হয়েছে। একটি require স্টেটমেন্ট ব্যবহার করে ব্যবহারকারীর ইনপুট যাচাই করা, স্টেট ভেরিয়েবল চেক করা, অথবা কোনো ফাংশনের কাজ এগিয়ে নেওয়ার আগে কলিং একাউন্ট-এর পরিচয় যাচাই করা যেতে পারে।
assert(): assert() ব্যবহার করা হয় অভ্যন্তরীণ ত্রুটি শনাক্ত করতে এবং আপনার কোডে "ইনভ্যারিয়েন্ট" (invariants)-এর লঙ্ঘন চেক করতে। একটি ইনভ্যারিয়েন্ট হলো একটি কন্ট্রাক্টের স্টেট সম্পর্কে একটি যৌক্তিক দাবি যা সমস্ত ফাংশন এক্সিকিউশনের জন্য সত্য হওয়া উচিত। একটি ইনভ্যারিয়েন্টের উদাহরণ হলো একটি টোকেন কন্ট্রাক্টের সর্বোচ্চ মোট সাপ্লাই বা ব্যালেন্স। assert() ব্যবহার করা নিশ্চিত করে যে আপনার কন্ট্রাক্ট কখনোই কোনো দুর্বল স্টেটে পৌঁছাবে না, এবং যদি পৌঁছায়ও, তবে স্টেট ভেরিয়েবলের সমস্ত পরিবর্তন রোল ব্যাক করা হয়।
revert(): revert() একটি if-else স্টেটমেন্টে ব্যবহার করা যেতে পারে যা প্রয়োজনীয় শর্ত পূরণ না হলে একটি এক্সেপশন ট্রিগার করে। নিচের নমুনা কন্ট্রাক্টটি ফাংশনগুলোর এক্সিকিউশন সুরক্ষিত করতে revert() ব্যবহার করে:
1pragma solidity ^0.8.4;2
3contract VendingMachine {4 address owner;5 error Unauthorized();6 function buy(uint amount) public payable {7 if (amount > msg.value / 2 ether)8 revert("Not enough Ether provided.");9 // Perform the purchase.10 }11 function withdraw() public {12 if (msg.sender != owner)13 revert Unauthorized();14
15 payable(msg.sender).transfer(address(this).balance);16 }17}3. স্মার্ট কন্ট্রাক্ট পরীক্ষা করুন এবং কোডের সঠিকতা যাচাই করুন
ইথিরিয়াম ভার্চুয়াল মেশিন-এ চলা কোডের ইমমিউটেবল প্রকৃতির মানে হলো স্মার্ট কন্ট্রাক্টগুলো ডেভেলপমেন্ট পর্যায়ে উচ্চ স্তরের গুণমান মূল্যায়নের দাবি রাখে। আপনার কন্ট্রাক্টটি ব্যাপকভাবে পরীক্ষা করা এবং কোনো অপ্রত্যাশিত ফলাফলের জন্য এটি পর্যবেক্ষণ করা নিরাপত্তাকে অনেকাংশে উন্নত করবে এবং দীর্ঘমেয়াদে আপনার ব্যবহারকারীদের রক্ষা করবে।
সাধারণ পদ্ধতি হলো মক ডেটা ব্যবহার করে ছোট ইউনিট টেস্ট লেখা, যা কন্ট্রাক্টটি ব্যবহারকারীদের কাছ থেকে পাবে বলে আশা করা হয়। নির্দিষ্ট ফাংশনগুলোর কার্যকারিতা পরীক্ষা করার জন্য এবং একটি স্মার্ট কন্ট্রাক্ট প্রত্যাশা অনুযায়ী কাজ করছে কিনা তা নিশ্চিত করার জন্য ইউনিট টেস্টিং ভালো।
দুর্ভাগ্যবশত, যখন আলাদাভাবে ব্যবহার করা হয় তখন স্মার্ট কন্ট্রাক্ট-এর নিরাপত্তা উন্নত করার জন্য ইউনিট টেস্টিং খুব কমই কার্যকর। একটি ইউনিট টেস্ট প্রমাণ করতে পারে যে একটি ফাংশন মক ডেটার জন্য সঠিকভাবে এক্সিকিউট হয়, কিন্তু ইউনিট টেস্টগুলো কেবল ততটাই কার্যকর যতটা টেস্ট লেখা হয়। এটি মিস হওয়া এজ কেস (edge cases) এবং দুর্বলতাগুলো শনাক্ত করা কঠিন করে তোলে যা আপনার স্মার্ট কন্ট্রাক্ট-এর নিরাপত্তা ভেঙে দিতে পারে।
একটি ভালো পদ্ধতি হলো ইউনিট টেস্টিংয়ের সাথে স্ট্যাটিক এবং ডায়নামিক অ্যানালাইসিস ব্যবহার করে করা প্রপার্টি-ভিত্তিক টেস্টিং একত্রিত করা। স্ট্যাটিক অ্যানালাইসিস পৌঁছানো যায় এমন প্রোগ্রাম স্টেট এবং এক্সিকিউশন পাথগুলো বিশ্লেষণ করতে লো-লেভেল রিপ্রেজেন্টেশন, যেমন কন্ট্রোল ফ্লো গ্রাফ (opens in a new tab) এবং অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (opens in a new tab)-এর উপর নির্ভর করে। অন্যদিকে, ডায়নামিক অ্যানালাইসিস কৌশলগুলো, যেমন স্মার্ট কন্ট্রাক্ট ফাজিং (opens in a new tab), নিরাপত্তা বৈশিষ্ট্য লঙ্ঘন করে এমন অপারেশনগুলো শনাক্ত করতে র্যান্ডম ইনপুট ভ্যালু দিয়ে কন্ট্রাক্ট কোড এক্সিকিউট করে।
স্মার্ট কন্ট্রাক্ট-এ নিরাপত্তা বৈশিষ্ট্য যাচাই করার আরেকটি কৌশল হলো ফরমাল ভেরিফিকেশন। সাধারণ টেস্টিংয়ের বিপরীতে, ফরমাল ভেরিফিকেশন একটি স্মার্ট কন্ট্রাক্ট-এ ত্রুটির অনুপস্থিতি চূড়ান্তভাবে প্রমাণ করতে পারে। এটি একটি ফরমাল স্পেসিফিকেশন তৈরি করে অর্জন করা হয় যা কাঙ্ক্ষিত নিরাপত্তা বৈশিষ্ট্যগুলো ক্যাপচার করে এবং প্রমাণ করে যে কন্ট্রাক্টগুলোর একটি ফরমাল মডেল এই স্পেসিফিকেশন মেনে চলে।
4. আপনার কোডের একটি স্বাধীন পর্যালোচনার জন্য জিজ্ঞাসা করুন
আপনার কন্ট্রাক্ট পরীক্ষা করার পর, কোনো নিরাপত্তা সমস্যার জন্য সোর্স কোড চেক করতে অন্যদের বলা ভালো। টেস্টিং একটি স্মার্ট কন্ট্রাক্ট-এর প্রতিটি ত্রুটি উন্মোচন করবে না, তবে একটি স্বাধীন পর্যালোচনা পেলে দুর্বলতাগুলো শনাক্ত করার সম্ভাবনা বেড়ে যায়।
অডিট
একটি স্মার্ট কন্ট্রাক্ট অডিট করানো হলো একটি স্বাধীন কোড পর্যালোচনা পরিচালনার একটি উপায়। স্মার্ট কন্ট্রাক্টগুলো নিরাপদ এবং গুণগত ত্রুটি ও ডিজাইনের ভুল থেকে মুক্ত তা নিশ্চিত করতে অডিটররা একটি গুরুত্বপূর্ণ ভূমিকা পালন করে।
তা সত্ত্বেও, আপনার অডিটগুলোকে সব সমস্যার সমাধান (silver bullet) হিসেবে বিবেচনা করা এড়িয়ে চলা উচিত। স্মার্ট কন্ট্রাক্ট অডিট প্রতিটি বাগ ধরতে পারবে না এবং এগুলো মূলত পর্যালোচনার একটি অতিরিক্ত রাউন্ড প্রদান করার জন্য ডিজাইন করা হয়েছে, যা প্রাথমিক ডেভেলপমেন্ট এবং টেস্টিংয়ের সময় ডেভেলপারদের দ্বারা মিস হওয়া সমস্যাগুলো শনাক্ত করতে সাহায্য করতে পারে। একটি স্মার্ট কন্ট্রাক্ট অডিটের সুবিধা সর্বাধিক করতে আপনার অডিটরদের সাথে কাজ করার জন্য সর্বোত্তম অনুশীলনগুলোও অনুসরণ করা উচিত, যেমন কোড সঠিকভাবে ডকুমেন্ট করা এবং ইনলাইন কমেন্ট যোগ করা।
- স্মার্ট কন্ট্রাক্ট অডিটিং টিপস এবং ট্রিকস (opens in a new tab) - @tinchoabbate
- আপনার অডিটের সর্বোচ্চ ব্যবহার করুন (opens in a new tab) - Inference
বাগ বাউন্টি
একটি বাগ বাউন্টি প্রোগ্রাম সেট আপ করা এক্সটার্নাল কোড পর্যালোচনা বাস্তবায়নের আরেকটি পদ্ধতি। বাগ বাউন্টি হলো একটি আর্থিক পুরস্কার যা সেই ব্যক্তিদের (সাধারণত হোয়াইটহ্যাট হ্যাকারদের) দেওয়া হয় যারা কোনো অ্যাপ্লিকেশনে দুর্বলতা আবিষ্কার করে।
সঠিকভাবে ব্যবহার করা হলে, বাগ বাউন্টি হ্যাকার কমিউনিটির সদস্যদের আপনার কোডে গুরুতর ত্রুটিগুলো পরিদর্শন করার জন্য উৎসাহ দেয়। একটি বাস্তব জীবনের উদাহরণ হলো "ইনফিনিট মানি বাগ" যা একজন আক্রমণকারীকে ইথিরিয়ামে চলা একটি লেয়ার ২ প্রটোকল Optimism (opens in a new tab)-এ সীমাহীন পরিমাণ ইথার তৈরি করতে দিত। সৌভাগ্যবশত, একজন হোয়াইটহ্যাট হ্যাকার ত্রুটিটি আবিষ্কার করেন (opens in a new tab) এবং টিমকে জানান, যার ফলে তিনি একটি বড় অঙ্কের পুরস্কার অর্জন করেন (opens in a new tab)।
একটি কার্যকরী কৌশল হলো ঝুঁকিতে থাকা ফান্ডের পরিমাণের অনুপাতে একটি বাগ বাউন্টি প্রোগ্রামের পেআউট সেট করা। "স্কেলিং বাগ বাউন্টি (opens in a new tab)" হিসেবে বর্ণিত এই পদ্ধতিটি ব্যক্তিদের দুর্বলতাগুলো কাজে লাগানোর পরিবর্তে দায়িত্বশীলভাবে প্রকাশ করার জন্য আর্থিক প্রণোদনা প্রদান করে।
5. স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টের সময় সর্বোত্তম অনুশীলনগুলো অনুসরণ করুন
অডিট এবং বাগ বাউন্টির অস্তিত্ব আপনাকে উচ্চ-মানের কোড লেখার দায়িত্ব থেকে অব্যাহতি দেয় না। ভালো স্মার্ট কন্ট্রাক্ট নিরাপত্তা সঠিক ডিজাইন এবং ডেভেলপমেন্ট প্রক্রিয়া অনুসরণ করার মাধ্যমে শুরু হয়:
-
সমস্ত কোড একটি ভার্সন কন্ট্রোল সিস্টেমে সংরক্ষণ করুন, যেমন git
-
সমস্ত কোড পরিবর্তন পুল রিকোয়েস্টের (pull requests) মাধ্যমে করুন
-
নিশ্চিত করুন যে পুল রিকোয়েস্টগুলোতে অন্তত একজন স্বাধীন পর্যালোচক আছে—যদি আপনি কোনো প্রজেক্টে একা কাজ করেন, তবে অন্যান্য ডেভেলপারদের খুঁজে বের করার এবং কোড পর্যালোচনার আদান-প্রদান করার কথা বিবেচনা করুন
-
স্মার্ট কন্ট্রাক্ট পরীক্ষা, কম্পাইল এবং ডিপ্লয় করার জন্য একটি ডেভেলপমেন্ট এনভায়রনমেন্ট ব্যবহার করুন
-
আপনার কোড বেসিক কোড অ্যানালাইসিস টুলগুলোর মাধ্যমে রান করুন, যেমন Cyfrin Aderyn (opens in a new tab), Mythril এবং Slither। আদর্শভাবে, প্রতিটি পুল রিকোয়েস্ট মার্জ হওয়ার আগে আপনার এটি করা উচিত এবং আউটপুটের পার্থক্যগুলো তুলনা করা উচিত
-
নিশ্চিত করুন যে আপনার কোড কোনো ত্রুটি ছাড়াই কম্পাইল হয় এবং Solidity কম্পাইলার কোনো ওয়ার্নিং দেয় না
-
আপনার কোড সঠিকভাবে ডকুমেন্ট করুন (NatSpec (opens in a new tab) ব্যবহার করে) এবং সহজে বোঝা যায় এমন ভাষায় কন্ট্রাক্ট আর্কিটেকচার সম্পর্কে বিস্তারিত বর্ণনা করুন। এটি অন্যদের জন্য আপনার কোড অডিট এবং পর্যালোচনা করা সহজ করে তুলবে।
6. শক্তিশালী ডিজাস্টার রিকভারি প্ল্যান বাস্তবায়ন করুন
নিরাপদ এক্সেস কন্ট্রোল ডিজাইন করা, ফাংশন মডিফায়ার বাস্তবায়ন করা এবং অন্যান্য পরামর্শগুলো স্মার্ট কন্ট্রাক্ট-এর নিরাপত্তা উন্নত করতে পারে, তবে এগুলো ক্ষতিকারক এক্সপ্লয়েটের সম্ভাবনাকে বাতিল করতে পারে না। নিরাপদ স্মার্ট কন্ট্রাক্ট তৈরি করার জন্য "ব্যর্থতার জন্য প্রস্তুতি" এবং আক্রমণের কার্যকরভাবে প্রতিক্রিয়া জানানোর জন্য একটি ফলব্যাক প্ল্যান থাকা প্রয়োজন। একটি সঠিক ডিজাস্টার রিকভারি প্ল্যানে নিচের কিছু বা সমস্ত উপাদান অন্তর্ভুক্ত থাকবে:
কন্ট্রাক্ট আপগ্রেড
যদিও ইথিরিয়াম স্মার্ট কন্ট্রাক্টগুলো ডিফল্টভাবে ইমমিউটেবল, আপগ্রেড প্যাটার্ন ব্যবহার করে কিছুটা মিউটেবিলিটি অর্জন করা সম্ভব। এমন ক্ষেত্রে কন্ট্রাক্ট আপগ্রেড করা প্রয়োজন যেখানে একটি গুরুতর ত্রুটি আপনার পুরোনো কন্ট্রাক্টটিকে অকেজো করে দেয় এবং নতুন লজিক ডিপ্লয় করা সবচেয়ে সম্ভাব্য বিকল্প হয়।
কন্ট্রাক্ট আপগ্রেড মেকানিজমগুলো ভিন্নভাবে কাজ করে, তবে স্মার্ট কন্ট্রাক্ট আপগ্রেড করার জন্য "প্রক্সি প্যাটার্ন" হলো অন্যতম জনপ্রিয় পদ্ধতি। প্রক্সি প্যাটার্ন (opens in a new tab) একটি অ্যাপ্লিকেশনের স্টেট এবং লজিককে দুটি কন্ট্রাক্টের মধ্যে বিভক্ত করে। প্রথম কন্ট্রাক্টটি (যাকে 'প্রক্সি কন্ট্রাক্ট' বলা হয়) স্টেট ভেরিয়েবলগুলো (যেমন, ব্যবহারকারীর ব্যালেন্স) সংরক্ষণ করে, যখন দ্বিতীয় কন্ট্রাক্টটি (যাকে 'লজিক কন্ট্রাক্ট' বলা হয়) কন্ট্রাক্ট ফাংশনগুলো এক্সিকিউট করার জন্য কোড ধারণ করে।
একাউন্টগুলো প্রক্সি কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করে, যা delegatecall() (opens in a new tab) লো-লেভেল কল ব্যবহার করে সমস্ত ফাংশন কল লজিক কন্ট্রাক্টে পাঠায়। একটি সাধারণ মেসেজ কলের বিপরীতে, delegatecall() নিশ্চিত করে যে লজিক কন্ট্রাক্টের এডড্রেস-এ চলা কোডটি কলিং কন্ট্রাক্টের কনটেক্সটে এক্সিকিউট হয়। এর মানে হলো লজিক কন্ট্রাক্ট সবসময় প্রক্সির স্টোরেজে লিখবে (এর নিজস্ব স্টোরেজের পরিবর্তে) এবং msg.sender ও msg.value-এর আসল ভ্যালুগুলো সংরক্ষিত থাকে।
লজিক কন্ট্রাক্টে কল ডেলিগেট করার জন্য প্রক্সি কন্ট্রাক্টের স্টোরেজে এর এডড্রেস সংরক্ষণ করা প্রয়োজন। তাই, কন্ট্রাক্টের লজিক আপগ্রেড করা মানে হলো কেবল আরেকটি লজিক কন্ট্রাক্ট ডিপ্লয় করা এবং প্রক্সি কন্ট্রাক্টে নতুন এডড্রেসটি সংরক্ষণ করা। যেহেতু প্রক্সি কন্ট্রাক্টে পরবর্তী কলগুলো স্বয়ংক্রিয়ভাবে নতুন লজিক কন্ট্রাক্টে রাউট করা হয়, তাই আপনি আসলে কোড পরিবর্তন না করেই কন্ট্রাক্টটি "আপগ্রেড" করে ফেলবেন।
কন্ট্রাক্ট আপগ্রেড করা সম্পর্কে আরও জানুন।
ইমার্জেন্সি স্টপ
যেমনটি উল্লেখ করা হয়েছে, ব্যাপক অডিটিং এবং টেস্টিং একটি স্মার্ট কন্ট্রাক্ট-এর সমস্ত বাগ আবিষ্কার করতে পারে না। ডিপ্লয়মেন্টের পরে যদি আপনার কোডে কোনো দুর্বলতা দেখা দেয়, তবে এটি প্যাচ করা অসম্ভব কারণ আপনি কন্ট্রাক্ট এডড্রেস-এ চলা কোড পরিবর্তন করতে পারবেন না। এছাড়া, আপগ্রেড মেকানিজমগুলো (যেমন, প্রক্সি প্যাটার্ন) বাস্তবায়ন করতে সময় লাগতে পারে (এগুলোর জন্য প্রায়ই বিভিন্ন পক্ষের অনুমোদনের প্রয়োজন হয়), যা আক্রমণকারীদের আরও ক্ষতি করার জন্য কেবল আরও সময় দেয়।
চূড়ান্ত বিকল্প হলো একটি "ইমার্জেন্সি স্টপ" ফাংশন বাস্তবায়ন করা যা একটি কন্ট্রাক্টে দুর্বল ফাংশনগুলোতে কল ব্লক করে। ইমার্জেন্সি স্টপগুলোতে সাধারণত নিচের উপাদানগুলো থাকে:
-
একটি গ্লোবাল বুলিয়ান ভেরিয়েবল যা নির্দেশ করে যে স্মার্ট কন্ট্রাক্টটি বন্ধ অবস্থায় আছে কিনা। কন্ট্রাক্ট সেট আপ করার সময় এই ভেরিয়েবলটি
falseহিসেবে সেট করা হয়, তবে কন্ট্রাক্টটি বন্ধ হয়ে গেলে এটিtrue-তে ফিরে যাবে। -
এমন ফাংশন যা তাদের এক্সিকিউশনে বুলিয়ান ভেরিয়েবলকে রেফারেন্স করে। স্মার্ট কন্ট্রাক্ট বন্ধ না থাকলে এই ধরনের ফাংশনগুলো এক্সেসযোগ্য থাকে এবং ইমার্জেন্সি স্টপ ফিচার ট্রিগার হলে এগুলো এক্সেসযোগ্য থাকে না।
-
এমন একটি সত্তা যার ইমার্জেন্সি স্টপ ফাংশনে এক্সেস আছে, যা বুলিয়ান ভেরিয়েবলটিকে
trueহিসেবে সেট করে। ক্ষতিকারক কাজগুলো প্রতিরোধ করতে, এই ফাংশনে কলগুলো একটি বিশ্বস্ত এডড্রেস-এ (যেমন, কন্ট্রাক্টের মালিক) সীমাবদ্ধ করা যেতে পারে।
একবার কন্ট্রাক্টটি ইমার্জেন্সি স্টপ সক্রিয় করলে, নির্দিষ্ট ফাংশনগুলো কল করা যাবে না। এটি গ্লোবাল ভেরিয়েবলকে রেফারেন্স করে এমন একটি মডিফায়ারে নির্বাচিত ফাংশনগুলোকে র্যাপ করে অর্জন করা হয়। নিচে কন্ট্রাক্টগুলোতে এই প্যাটার্নের একটি বাস্তবায়নের বর্ণনা দেওয়া একটি উদাহরণ (opens in a new tab) দেওয়া হলো:
1// এই কোডটি পেশাদারভাবে অডিট করা হয়নি এবং এর নিরাপত্তা বা সঠিকতা সম্পর্কে কোনো প্রতিশ্রুতি দেয় না। নিজ ঝুঁকিতে ব্যবহার করুন।2
3contract EmergencyStop {4
5 bool isStopped = false;6
7 modifier stoppedInEmergency {8 require(!isStopped);9 _;10 }11
12 modifier onlyWhenStopped {13 require(isStopped);14 _;15 }16
17 modifier onlyAuthorized {18 // এখানে msg.sender-এর অনুমোদন চেক করুন19 _;20 }21
22 function stopContract() public onlyAuthorized {23 isStopped = true;24 }25
26 function resumeContract() public onlyAuthorized {27 isStopped = false;28 }29
30 function deposit() public payable stoppedInEmergency {31 // এখানে ডিপোজিট লজিক সম্পন্ন হচ্ছে32 }33
34 function emergencyWithdraw() public onlyWhenStopped {35 // এখানে জরুরি উত্তোলন সম্পন্ন হচ্ছে36 }37}এই উদাহরণটি ইমার্জেন্সি স্টপের মৌলিক বৈশিষ্ট্যগুলো দেখায়:
-
isStoppedহলো একটি বুলিয়ান যা শুরুতেfalseএবং কন্ট্রাক্টটি ইমার্জেন্সি মোডে প্রবেশ করলেtrueহিসেবে মূল্যায়ন করে। -
ফাংশন মডিফায়ার
onlyWhenStoppedএবংstoppedInEmergencyisStoppedভেরিয়েবলটি চেক করে।stoppedInEmergencyব্যবহার করা হয় এমন ফাংশনগুলো নিয়ন্ত্রণ করতে যা কন্ট্রাক্টটি দুর্বল হলে এক্সেসযোগ্য হওয়া উচিত নয় (যেমন,deposit())। এই ফাংশনগুলোতে কলগুলো কেবল রিভার্ট হয়ে যাবে।
onlyWhenStopped এমন ফাংশনগুলোর জন্য ব্যবহার করা হয় যা ইমার্জেন্সির সময় কল করা উচিত (যেমন, emergencyWithdraw())। এই ধরনের ফাংশনগুলো পরিস্থিতি সমাধানে সাহায্য করতে পারে, তাই এগুলোকে "সীমাবদ্ধ ফাংশন" তালিকা থেকে বাদ দেওয়া হয়।
একটি ইমার্জেন্সি স্টপ কার্যকারিতা ব্যবহার করা আপনার স্মার্ট কন্ট্রাক্ট-এ গুরুতর দুর্বলতাগুলো মোকাবিলা করার জন্য একটি কার্যকর সাময়িক সমাধান প্রদান করে। তবে, এটি ব্যবহারকারীদের ডেভেলপারদের বিশ্বাস করার প্রয়োজনীয়তা বাড়ায় যাতে তারা নিজেদের স্বার্থে এটি সক্রিয় না করে। এই লক্ষ্যে, ইমার্জেন্সি স্টপের নিয়ন্ত্রণকে একটি অনচেইন ভোটিং মেকানিজম, টাইমক্লক, বা একটি মাল্টিসিগ ওয়ালেট থেকে অনুমোদনের অধীন করে ডিসেন্ট্রালাইজড করা সম্ভাব্য সমাধান হতে পারে।
ইভেন্ট মনিটরিং
ইভেন্টগুলো (opens in a new tab) আপনাকে স্মার্ট কন্ট্রাক্ট ফাংশনগুলোতে কল ট্র্যাক করতে এবং স্টেট ভেরিয়েবলের পরিবর্তনগুলো মনিটর করতে দেয়। যখনই কোনো পক্ষ নিরাপত্তা-সংবেদনশীল কাজ (যেমন, ফান্ড তোলা) করে তখনই একটি ইভেন্ট এমিট করার জন্য আপনার স্মার্ট কন্ট্রাক্ট প্রোগ্রাম করা আদর্শ।
ইভেন্টগুলো লগ করা এবং সেগুলোকে অফচেইন মনিটর করা কন্ট্রাক্ট অপারেশনগুলোর উপর অন্তর্দৃষ্টি প্রদান করে এবং ক্ষতিকারক কাজগুলো দ্রুত আবিষ্কার করতে সাহায্য করে। এর মানে হলো আপনার টিম হ্যাকের ক্ষেত্রে দ্রুত প্রতিক্রিয়া জানাতে পারে এবং ব্যবহারকারীদের উপর প্রভাব কমানোর জন্য পদক্ষেপ নিতে পারে, যেমন ফাংশনগুলো পজ করা বা একটি আপগ্রেড করা।
আপনি একটি অফ-দ্য-শেল্ফ মনিটরিং টুলও বেছে নিতে পারেন যা যখনই কেউ আপনার কন্ট্রাক্টগুলোর সাথে ইন্টারঅ্যাক্ট করে তখনই স্বয়ংক্রিয়ভাবে অ্যালার্ট ফরোয়ার্ড করে। এই টুলগুলো আপনাকে বিভিন্ন ট্রিগারের উপর ভিত্তি করে কাস্টম অ্যালার্ট তৈরি করতে দেবে, যেমন লেনদেন ভলিউম, ফাংশন কলের ফ্রিকোয়েন্সি, বা জড়িত নির্দিষ্ট ফাংশনগুলো। উদাহরণস্বরূপ, আপনি এমন একটি অ্যালার্ট প্রোগ্রাম করতে পারেন যা একটি একক লেনদেন-এ তোলা ফান্ডের পরিমাণ একটি নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করলে আসে।
7. নিরাপদ গভর্নেন্স সিস্টেম ডিজাইন করুন
আপনি কমিউনিটি সদস্যদের কাছে মূল স্মার্ট কন্ট্রাক্টগুলোর নিয়ন্ত্রণ হস্তান্তর করে আপনার অ্যাপ্লিকেশনটিকে ডিসেন্ট্রালাইজড করতে চাইতে পারেন। এই ক্ষেত্রে, স্মার্ট কন্ট্রাক্ট সিস্টেমে একটি গভর্নেন্স মডিউল অন্তর্ভুক্ত থাকবে—এমন একটি মেকানিজম যা কমিউনিটি সদস্যদের একটি অনচেইন গভর্নেন্স সিস্টেমের মাধ্যমে অ্যাডমিনিস্ট্রেটিভ কাজগুলো অনুমোদন করতে দেয়। উদাহরণস্বরূপ, একটি প্রক্সি কন্ট্রাক্টকে একটি নতুন ইমপ্লিমেন্টেশনে আপগ্রেড করার প্রস্তাবের উপর টোকেন-হোল্ডাররা ভোট দিতে পারে।
ডিসেন্ট্রালাইজড গভর্নেন্স উপকারী হতে পারে, বিশেষ করে কারণ এটি ডেভেলপার এবং এন্ড-ইউজারদের স্বার্থকে একত্রিত করে। তা সত্ত্বেও, স্মার্ট কন্ট্রাক্ট গভর্নেন্স মেকানিজমগুলো ভুলভাবে বাস্তবায়িত হলে নতুন ঝুঁকি তৈরি করতে পারে। একটি সম্ভাব্য দৃশ্যপট হলো যদি কোনো আক্রমণকারী একটি ফ্ল্যাশ লোন নিয়ে বিপুল ভোটিং পাওয়ার (ধরে রাখা টোকেনের সংখ্যায় পরিমাপ করা হয়) অর্জন করে এবং একটি ক্ষতিকারক প্রস্তাব পাস করিয়ে নেয়।
অনচেইন গভর্নেন্স সম্পর্কিত সমস্যাগুলো প্রতিরোধের একটি উপায় হলো একটি টাইমক্লক ব্যবহার করা (opens in a new tab)। একটি টাইমক্লক একটি নির্দিষ্ট পরিমাণ সময় পার না হওয়া পর্যন্ত একটি স্মার্ট কন্ট্রাক্ট-কে নির্দিষ্ট কাজগুলো এক্সিকিউট করা থেকে বিরত রাখে। অন্যান্য কৌশলগুলোর মধ্যে রয়েছে প্রতিটি টোকেন কতক্ষণ ধরে লক করা আছে তার উপর ভিত্তি করে একটি "ভোটিং ওয়েট" (voting weight) অ্যাসাইন করা, অথবা বর্তমান ব্লকের পরিবর্তে একটি ঐতিহাসিক সময়ে (উদাহরণস্বরূপ, অতীতে 2-3 ব্লকস) একটি এডড্রেস-এর ভোটিং পাওয়ার পরিমাপ করা। উভয় পদ্ধতিই অনচেইন ভোটগুলো ঘোরানোর জন্য দ্রুত ভোটিং পাওয়ার সংগ্রহ করার সম্ভাবনা কমায়।
শেয়ার করা লিংকগুলোতে নিরাপদ গভর্নেন্স সিস্টেম ডিজাইন করা (opens in a new tab), DAO-তে বিভিন্ন ভোটিং মেকানিজম (opens in a new tab), এবং DeFi ব্যবহার করে সাধারণ DAO অ্যাটাক ভেক্টরগুলো (opens in a new tab) সম্পর্কে আরও জানুন।
8. কোডের জটিলতা সর্বনিম্নে কমিয়ে আনুন
প্রথাগত সফটওয়্যার ডেভেলপাররা KISS ("keep it simple, stupid") নীতির সাথে পরিচিত, যা সফটওয়্যার ডিজাইনে অপ্রয়োজনীয় জটিলতা প্রবর্তনের বিরুদ্ধে পরামর্শ দেয়। এটি দীর্ঘদিনের চিন্তাধারা অনুসরণ করে যে "জটিল সিস্টেমগুলো জটিল উপায়ে ব্যর্থ হয়" এবং এগুলো ব্যয়বহুল ত্রুটির জন্য বেশি সংবেদনশীল।
স্মার্ট কন্ট্রাক্ট লেখার সময় জিনিসগুলো সহজ রাখা বিশেষ গুরুত্বপূর্ণ, কারণ স্মার্ট কন্ট্রাক্টগুলো সম্ভাব্যভাবে বিপুল পরিমাণ ভ্যালু নিয়ন্ত্রণ করে। স্মার্ট কন্ট্রাক্ট লেখার সময় সরলতা অর্জনের একটি টিপ হলো যেখানে সম্ভব বিদ্যমান লাইব্রেরিগুলো পুনরায় ব্যবহার করা, যেমন OpenZeppelin Contracts (opens in a new tab)। যেহেতু এই লাইব্রেরিগুলো ডেভেলপারদের দ্বারা ব্যাপকভাবে অডিট এবং পরীক্ষা করা হয়েছে, তাই এগুলো ব্যবহার করলে স্ক্র্যাচ থেকে নতুন কার্যকারিতা লিখে বাগ প্রবর্তনের সম্ভাবনা কমে যায়।
আরেকটি সাধারণ পরামর্শ হলো ছোট ফাংশন লেখা এবং একাধিক কন্ট্রাক্ট জুড়ে বিজনেস লজিক বিভক্ত করে কন্ট্রাক্টগুলোকে মডুলার রাখা। সহজ কোড লেখা কেবল একটি স্মার্ট কন্ট্রাক্ট-এ অ্যাটাক সারফেস কমায় না, এটি সামগ্রিক সিস্টেমের সঠিকতা সম্পর্কে যুক্তি দেওয়া এবং সম্ভাব্য ডিজাইনের ত্রুটিগুলো আগে থেকেই শনাক্ত করা সহজ করে তোলে।
9. সাধারণ স্মার্ট কন্ট্রাক্ট দুর্বলতাগুলোর বিরুদ্ধে রক্ষা করুন
রিএন্ট্রান্সি (Reentrancy)
EVM কনকারেন্সি (concurrency) অনুমোদন করে না, যার মানে হলো একটি মেসেজ কলে জড়িত দুটি কন্ট্রাক্ট একই সাথে চলতে পারে না। একটি এক্সটার্নাল কল কলিং কন্ট্রাক্টের এক্সিকিউশন এবং মেমরি পজ করে যতক্ষণ না কলটি ফিরে আসে, যে পয়েন্টে এক্সিকিউশন স্বাভাবিকভাবে এগিয়ে যায়। এই প্রক্রিয়াটিকে আনুষ্ঠানিকভাবে অন্য একটি কন্ট্রাক্টে কন্ট্রোল ফ্লো (opens in a new tab) স্থানান্তর হিসেবে বর্ণনা করা যেতে পারে।
যদিও বেশিরভাগ ক্ষেত্রে ক্ষতিকারক নয়, অবিশ্বস্ত কন্ট্রাক্টগুলোতে কন্ট্রোল ফ্লো স্থানান্তর করা সমস্যা সৃষ্টি করতে পারে, যেমন রিএন্ট্রান্সি। একটি রিএন্ট্রান্সি আক্রমণ তখন ঘটে যখন একটি ক্ষতিকারক কন্ট্রাক্ট মূল ফাংশন ইনভোকেশন সম্পূর্ণ হওয়ার আগেই একটি দুর্বল কন্ট্রাক্টে কল ব্যাক করে। এই ধরনের আক্রমণ একটি উদাহরণ দিয়ে সবচেয়ে ভালোভাবে ব্যাখ্যা করা যায়।
একটি সাধারণ স্মার্ট কন্ট্রাক্ট ('Victim') বিবেচনা করুন যা যেকাউকে ইথার জমা দিতে এবং তুলতে দেয়:
1// এই কন্ট্রাক্টটি ঝুঁকিপূর্ণ। প্রোডাকশনে ব্যবহার করবেন না2
3contract Victim {4 mapping (address => uint256) public balances;5
6 function deposit() external payable {7 balances[msg.sender] += msg.value;8 }9
10 function withdraw() external {11 uint256 amount = balances[msg.sender];12 (bool success, ) = msg.sender.call.value(amount)("");13 require(success);14 balances[msg.sender] = 0;15 }16}এই কন্ট্রাক্টটি ব্যবহারকারীদের কন্ট্রাক্টে আগে জমা দেওয়া ETH তোলার অনুমতি দেওয়ার জন্য একটি withdraw() ফাংশন এক্সপোজ করে। একটি উইথড্রয়াল প্রসেস করার সময়, কন্ট্রাক্টটি নিচের অপারেশনগুলো করে:
- ব্যবহারকারীর ETH ব্যালেন্স চেক করে
- কলিং এডড্রেস-এ ফান্ড পাঠায়
- তাদের ব্যালেন্স 0-তে রিসেট করে, ব্যবহারকারীর কাছ থেকে অতিরিক্ত উইথড্রয়াল প্রতিরোধ করে
Victim কন্ট্রাক্টে withdraw() ফাংশনটি একটি "চেকস-ইন্টারঅ্যাকশনস-ইফেক্টস" (checks-interactions-effects) প্যাটার্ন অনুসরণ করে। এটি চেক করে যে এক্সিকিউশনের জন্য প্রয়োজনীয় শর্তগুলো পূরণ হয়েছে কিনা (অর্থাৎ, ব্যবহারকারীর একটি পজিটিভ ETH ব্যালেন্স আছে) এবং লেনদেন-এর ইফেক্টগুলো প্রয়োগ করার আগে (অর্থাৎ, ব্যবহারকারীর ব্যালেন্স কমানো) কলারের এডড্রেস-এ ETH পাঠিয়ে ইন্টারঅ্যাকশন করে।
যদি একটি এক্সটার্নালি ওনড একাউন্ট (EOA) থেকে withdraw() কল করা হয়, তবে ফাংশনটি প্রত্যাশা অনুযায়ী এক্সিকিউট হয়: msg.sender.call.value() কলারকে ETH পাঠায়। তবে, যদি msg.sender একটি স্মার্ট কন্ট্রাক্ট একাউন্ট হয় যা withdraw() কল করে, তবে msg.sender.call.value() ব্যবহার করে ফান্ড পাঠানো সেই এডড্রেস-এ সংরক্ষিত কোডকেও রান করতে ট্রিগার করবে।
কল্পনা করুন এটি কন্ট্রাক্ট এডড্রেস-এ ডিপ্লয় করা কোড:
1 contract Attacker {2 function beginAttack() external payable {3 Victim(victim_address).deposit.value(1 ether)();4 Victim(victim_address).withdraw();5 }6
7 function() external payable {8 if (gasleft() > 40000) {9 Victim(victim_address).withdraw();10 }11 }12}এই কন্ট্রাক্টটি তিনটি কাজ করার জন্য ডিজাইন করা হয়েছে:
- অন্য একটি একাউন্ট থেকে একটি ডিপোজিট গ্রহণ করা (সম্ভবত আক্রমণকারীর EOA)
- Victim কন্ট্রাক্টে 1 ETH জমা দেওয়া
- স্মার্ট কন্ট্রাক্ট-এ সংরক্ষিত 1 ETH তুলে নেওয়া
এখানে কোনো ভুল নেই, তবে Attacker-এর আরেকটি ফাংশন আছে যা ইনকামিং msg.sender.call.value থেকে অবশিষ্ট গ্যাস 40,000-এর বেশি হলে Victim-এ আবার withdraw() কল করে। এটি Attacker-কে Victim-এ পুনরায় প্রবেশ করার এবং withdraw-এর প্রথম ইনভোকেশন সম্পূর্ণ হওয়ার আগেই আরও ফান্ড তুলে নেওয়ার ক্ষমতা দেয়। সাইকেলটি দেখতে এরকম:
1- Attacker's EOA calls `Attacker.beginAttack()` with 1 ETH2- `Attacker.beginAttack()` deposits 1 ETH into `Victim`3- `Attacker` calls `withdraw() in `Victim`4- `Victim` checks `Attacker`’s balance (1 ETH)5- `Victim` sends 1 ETH to `Attacker` (which triggers the default function)6- `Attacker` calls `Victim.withdraw()` again (note that `Victim` hasn’t reduced `Attacker`’s balance from the first withdrawal)7- `Victim` checks `Attacker`’s balance (which is still 1 ETH because it hasn’t applied the effects of the first call)8- `Victim` sends 1 ETH to `Attacker` (which triggers the default function and allows `Attacker` to reenter the `withdraw` function)9- The process repeats until `Attacker` runs out of gas, at which point `msg.sender.call.value` returns without triggering additional withdrawals10- `Victim` finally applies the results of the first transaction (and subsequent ones) to its state, so `Attacker`’s balance is set to 0সারসংক্ষেপ হলো যেহেতু ফাংশন এক্সিকিউশন সম্পূর্ণ না হওয়া পর্যন্ত কলারের ব্যালেন্স 0-তে সেট করা হয় না, তাই পরবর্তী ইনভোকেশনগুলো সফল হবে এবং কলারকে একাধিকবার তাদের ব্যালেন্স তুলে নেওয়ার অনুমতি দেবে। এই ধরনের আক্রমণ একটি স্মার্ট কন্ট্রাক্ট-এর ফান্ড খালি করতে ব্যবহার করা যেতে পারে, যেমনটি 2016 DAO হ্যাক (opens in a new tab)-এ ঘটেছিল। রিএন্ট্রান্সি আক্রমণগুলো আজও স্মার্ট কন্ট্রাক্টগুলোর জন্য একটি গুরুতর সমস্যা, যেমনটি রিএন্ট্রান্সি এক্সপ্লয়েটগুলোর পাবলিক লিস্টিং (opens in a new tab) দেখায়।
কীভাবে রিএন্ট্রান্সি আক্রমণ প্রতিরোধ করবেন
রিএন্ট্রান্সি মোকাবিলার একটি পদ্ধতি হলো চেকস-ইফেক্টস-ইন্টারঅ্যাকশনস প্যাটার্ন (opens in a new tab) অনুসরণ করা। এই প্যাটার্নটি ফাংশনগুলোর এক্সিকিউশন এমনভাবে সাজায় যাতে এক্সিকিউশন এগিয়ে নেওয়ার আগে প্রয়োজনীয় চেকগুলো করে এমন কোড প্রথমে আসে, এরপর কন্ট্রাক্ট স্টেট ম্যানিপুলেট করে এমন কোড আসে এবং অন্যান্য কন্ট্রাক্ট বা EOA-এর সাথে ইন্টারঅ্যাক্ট করে এমন কোড সবার শেষে আসে।
চেকস-ইফেক্ট-ইন্টারঅ্যাকশন প্যাটার্নটি নিচে দেখানো Victim কন্ট্রাক্টের একটি সংশোধিত সংস্করণে ব্যবহার করা হয়েছে:
1contract NoLongerAVictim {2 function withdraw() external {3 uint256 amount = balances[msg.sender];4 balances[msg.sender] = 0;5 (bool success, ) = msg.sender.call.value(amount)("");6 require(success);7 }8}এই কন্ট্রাক্টটি ব্যবহারকারীর ব্যালেন্সের উপর একটি চেক করে, withdraw() ফাংশনের ইফেক্টগুলো প্রয়োগ করে (ব্যবহারকারীর ব্যালেন্স 0-তে রিসেট করে), এবং ইন্টারঅ্যাকশন করতে এগিয়ে যায় (ব্যবহারকারীর এডড্রেস-এ ETH পাঠানো)। এটি নিশ্চিত করে যে কন্ট্রাক্টটি এক্সটার্নাল কলের আগে এর স্টোরেজ আপডেট করে, যা প্রথম আক্রমণকে সক্ষম করা রি-এন্ট্রান্সি শর্তটি দূর করে। Attacker কন্ট্রাক্টটি এখনও NoLongerAVictim-এ কল ব্যাক করতে পারে, কিন্তু যেহেতু balances[msg.sender] 0-তে সেট করা হয়েছে, তাই অতিরিক্ত উইথড্রয়ালগুলো একটি ত্রুটি থ্রো করবে।
আরেকটি বিকল্প হলো একটি মিউচুয়াল এক্সক্লুশন লক (সাধারণত "মিউটেক্স" হিসেবে বর্ণিত) ব্যবহার করা যা একটি ফাংশন ইনভোকেশন সম্পূর্ণ না হওয়া পর্যন্ত একটি কন্ট্রাক্টের স্টেটের একটি অংশ লক করে রাখে। এটি একটি বুলিয়ান ভেরিয়েবল ব্যবহার করে বাস্তবায়িত হয় যা ফাংশন এক্সিকিউট হওয়ার আগে true হিসেবে সেট করা হয় এবং ইনভোকেশন শেষ হওয়ার পরে false-এ ফিরে যায়। নিচের উদাহরণে যেমন দেখা গেছে, একটি মিউটেক্স ব্যবহার করা একটি ফাংশনকে রিকার্সিভ কলের বিরুদ্ধে রক্ষা করে যখন মূল ইনভোকেশনটি এখনও প্রসেস হচ্ছে, যা কার্যকরভাবে রিএন্ট্রান্সি বন্ধ করে।
1pragma solidity ^0.7.0;2
3contract MutexPattern {4 bool locked = false;5 mapping(address => uint256) public balances;6
7 modifier noReentrancy() {8 require(!locked, "Blocked from reentrancy.");9 locked = true;10 _;11 locked = false;12 }13 // এই ফাংশনটি একটি মিউটেক্স দ্বারা সুরক্ষিত, তাই `msg.sender.call`-এর ভেতর থেকে রিএন্ট্রান্ট কলগুলো পুনরায় `withdraw` কল করতে পারবে না।14 // `return` স্টেটমেন্টটি `true` হিসেবে মূল্যায়িত হয় কিন্তু তারপরও এটি মডিফায়ারে থাকা `locked = false` স্টেটমেন্টটিকে মূল্যায়ন করে15 function withdraw(uint _amount) public payable noReentrancy returns(bool) {16 require(balances[msg.sender] >= _amount, "No balance to withdraw.");17
18 balances[msg.sender] -= _amount;19 (bool success, ) = msg.sender.call{value: _amount}("");20 require(success);21
22 return true;23 }24}আপনি একটি পুল পেমেন্টস (opens in a new tab) সিস্টেমও ব্যবহার করতে পারেন যার জন্য ব্যবহারকারীদের স্মার্ট কন্ট্রাক্টগুলো থেকে ফান্ড তুলতে হয়, একটি "পুশ পেমেন্টস" সিস্টেমের পরিবর্তে যা একাউন্টগুলোতে ফান্ড পাঠায়। এটি অজানা এডড্রেসগুলোতে অসাবধানতাবশত কোড ট্রিগার করার সম্ভাবনা দূর করে (এবং নির্দিষ্ট ডিনায়াল-অফ-সার্ভিস আক্রমণগুলোও প্রতিরোধ করতে পারে)।
ইন্টিজার আন্ডারফ্লো এবং ওভারফ্লো
একটি ইন্টিজার ওভারফ্লো তখন ঘটে যখন একটি গাণিতিক অপারেশনের ফলাফল ভ্যালুগুলোর গ্রহণযোগ্য রেঞ্জের বাইরে চলে যায়, যার ফলে এটি সর্বনিম্ন রিপ্রেজেন্টেবল ভ্যালুতে "রোল ওভার" করে। উদাহরণস্বরূপ, একটি uint8 শুধুমাত্র 2^8-1=255 পর্যন্ত ভ্যালু সংরক্ষণ করতে পারে। গাণিতিক অপারেশনগুলো যার ফলে 255-এর চেয়ে বেশি ভ্যালু আসে তা ওভারফ্লো হবে এবং uint-কে 0-তে রিসেট করবে, ঠিক যেমন একটি গাড়ির ওডোমিটার সর্বোচ্চ মাইলেজ (999999) পৌঁছানোর পরে 0-তে রিসেট হয়।
ইন্টিজার আন্ডারফ্লো একই কারণে ঘটে: একটি গাণিতিক অপারেশনের ফলাফল গ্রহণযোগ্য রেঞ্জের নিচে চলে যায়। ধরুন আপনি একটি uint8-এ 0 কমানোর চেষ্টা করেছেন, ফলাফলটি কেবল সর্বোচ্চ রিপ্রেজেন্টেবল ভ্যালুতে (255) রোল ওভার করবে।
ইন্টিজার ওভারফ্লো এবং আন্ডারফ্লো উভয়ই একটি কন্ট্রাক্টের স্টেট ভেরিয়েবলগুলোতে অপ্রত্যাশিত পরিবর্তন আনতে পারে এবং অপরিকল্পিত এক্সিকিউশনের কারণ হতে পারে। নিচে একটি উদাহরণ দেওয়া হলো যা দেখায় কীভাবে একজন আক্রমণকারী একটি অবৈধ অপারেশন করতে একটি স্মার্ট কন্ট্রাক্ট-এ গাণিতিক ওভারফ্লো কাজে লাগাতে পারে:
1pragma solidity ^0.7.6;2
3// This contract is designed to act as a time vault.4// User can deposit into this contract but cannot withdraw for at least a week.5// User can also extend the wait time beyond the 1 week waiting period.6
7/*81. Deploy TimeLock92. Deploy Attack with address of TimeLock103. Call Attack.attack sending 1 ether. You will immediately be able to11 withdraw your ether.12
13What happened?14Attack caused the TimeLock.lockTime to overflow and was able to withdraw15before the 1 week waiting period.16*/17
18contract TimeLock {19 mapping(address => uint) public balances;20 mapping(address => uint) public lockTime;21
22 function deposit() external payable {23 balances[msg.sender] += msg.value;24 lockTime[msg.sender] = block.timestamp + 1 weeks;25 }26
27 function increaseLockTime(uint _secondsToIncrease) public {28 lockTime[msg.sender] += _secondsToIncrease;29 }30
31 function withdraw() public {32 require(balances[msg.sender] > 0, "Insufficient funds");33 require(block.timestamp > lockTime[msg.sender], "Lock time not expired");34
35 uint amount = balances[msg.sender];36 balances[msg.sender] = 0;37
38 (bool sent, ) = msg.sender.call{value: amount}("");39 require(sent, "Failed to send Ether");40 }41}42
43contract Attack {44 TimeLock timeLock;45
46 constructor(TimeLock _timeLock) {47 timeLock = TimeLock(_timeLock);48 }49
50 fallback() external payable {}51
52 function attack() public payable {53 timeLock.deposit{value: msg.value}();54 /*55 if t = current lock time then we need to find x such that56 x + t = 2**256 = 057 so x = -t58 2**256 = type(uint).max + 159 so x = type(uint).max + 1 - t60 */61 timeLock.increaseLockTime(62 type(uint).max + 1 - timeLock.lockTime(address(this))63 );64 timeLock.withdraw();65 }66}কীভাবে ইন্টিজার আন্ডারফ্লো এবং ওভারফ্লো প্রতিরোধ করবেন
0.8.0 ভার্সন থেকে, Solidity কম্পাইলার এমন কোড প্রত্যাখ্যান করে যার ফলে ইন্টিজার আন্ডারফ্লো এবং ওভারফ্লো হয়। তবে, নিম্ন কম্পাইলার ভার্সন দিয়ে কম্পাইল করা কন্ট্রাক্টগুলোর গাণিতিক অপারেশন জড়িত ফাংশনগুলোতে চেক করা উচিত অথবা এমন একটি লাইব্রেরি (যেমন, SafeMath (opens in a new tab)) ব্যবহার করা উচিত যা আন্ডারফ্লো/ওভারফ্লো চেক করে।
ওরাকল ম্যানিপুলেশন
ওরাকলগুলো অফচেইন তথ্যের উৎস হিসেবে কাজ করে এবং স্মার্ট কন্ট্রাক্টগুলোর ব্যবহারের জন্য এটি অনচেইন পাঠায়। ওরাকলগুলোর সাহায্যে, আপনি এমন স্মার্ট কন্ট্রাক্ট ডিজাইন করতে পারেন যা অফচেইন সিস্টেমগুলোর সাথে ইন্টারঅপারেট করে, যেমন ক্যাপিটাল মার্কেট, যা তাদের অ্যাপ্লিকেশনকে ব্যাপকভাবে প্রসারিত করে।
কিন্তু যদি ওরাকলটি দূষিত হয় এবং অনচেইন ভুল তথ্য পাঠায়, তবে স্মার্ট কন্ট্রাক্টগুলো ভুল ইনপুটের উপর ভিত্তি করে এক্সিকিউট হবে, যা সমস্যা সৃষ্টি করতে পারে। এটি হলো "ওরাকল প্রবলেম"-এর ভিত্তি, যা একটি ব্লকচেইন ওরাকল থেকে পাওয়া তথ্য সঠিক, আপ-টু-ডেট এবং সময়োপযোগী তা নিশ্চিত করার কাজের সাথে সম্পর্কিত।
একটি সম্পর্কিত নিরাপত্তা উদ্বেগ হলো একটি অ্যাসেটের স্পট প্রাইস পেতে একটি অনচেইন ওরাকল ব্যবহার করা, যেমন একটি ডিসেন্ট্রালাইজড এক্সচেঞ্জ। ডিসেন্ট্রালাইজড ফাইন্যান্স (DeFi) ইন্ডাস্ট্রিতে লেন্ডিং প্ল্যাটফর্মগুলো প্রায়ই একজন ব্যবহারকারীর কোল্যাটারালের ভ্যালু নির্ধারণ করতে এটি করে যাতে তারা কত ধার নিতে পারে তা নির্ধারণ করা যায়।
DEX প্রাইসগুলো প্রায়ই সঠিক হয়, মূলত আরবিট্রেজাররা (arbitrageurs) মার্কেটে সমতা ফিরিয়ে আনার কারণে। তবে, এগুলো ম্যানিপুলেশনের জন্য উন্মুক্ত, বিশেষ করে যদি অনচেইন ওরাকল ঐতিহাসিক ট্রেডিং প্যাটার্নের উপর ভিত্তি করে অ্যাসেটের প্রাইস গণনা করে (যেমনটি সাধারণত হয়)।
উদাহরণস্বরূপ, একজন আক্রমণকারী আপনার লেন্ডিং কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করার ঠিক আগে একটি ফ্ল্যাশ লোন নিয়ে কৃত্রিমভাবে একটি অ্যাসেটের স্পট প্রাইস পাম্প করতে পারে। অ্যাসেটের প্রাইসের জন্য DEX-এ কোয়েরি করলে একটি স্বাভাবিকের চেয়ে বেশি ভ্যালু ফিরে আসবে (আক্রমণকারীর বড় "বাই অর্ডার" অ্যাসেটের চাহিদাকে স্কিউ করার কারণে), যা তাদের উচিতের চেয়ে বেশি ধার নেওয়ার অনুমতি দেয়। এই ধরনের "ফ্ল্যাশ লোন আক্রমণগুলো" DeFi অ্যাপ্লিকেশনগুলোর মধ্যে প্রাইস ওরাকলগুলোর উপর নির্ভরতা কাজে লাগাতে ব্যবহার করা হয়েছে, যার ফলে প্রটোকলগুলোর মিলিয়ন মিলিয়ন ফান্ড নষ্ট হয়েছে।
কীভাবে ওরাকল ম্যানিপুলেশন প্রতিরোধ করবেন
ওরাকল ম্যানিপুলেশন এড়ানোর (opens in a new tab) ন্যূনতম প্রয়োজনীয়তা হলো একটি ডিসেন্ট্রালাইজড ওরাকল নেটওয়ার্ক ব্যবহার করা যা সিঙ্গেল পয়েন্ট অফ ফেইলিওর এড়াতে একাধিক উৎস থেকে তথ্য কোয়েরি করে। বেশিরভাগ ক্ষেত্রে, ডিসেন্ট্রালাইজড ওরাকলগুলোতে ওরাকল নোডগুলোকে সঠিক তথ্য রিপোর্ট করতে উৎসাহিত করার জন্য বিল্ট-ইন ক্রিপ্টোইকোনমিক প্রণোদনা থাকে, যা সেগুলোকে সেন্ট্রালাইজড ওরাকলগুলোর চেয়ে বেশি নিরাপদ করে তোলে।
আপনি যদি অ্যাসেটের প্রাইসের জন্য একটি অনচেইন ওরাকল কোয়েরি করার পরিকল্পনা করেন, তবে এমন একটি ব্যবহার করার কথা বিবেচনা করুন যা একটি টাইম-ওয়েটেড অ্যাভারেজ প্রাইস (TWAP) মেকানিজম বাস্তবায়ন করে। একটি TWAP ওরাকল (opens in a new tab) দুটি ভিন্ন সময়ে (যা আপনি পরিবর্তন করতে পারেন) একটি অ্যাসেটের প্রাইস কোয়েরি করে এবং প্রাপ্ত গড়ের উপর ভিত্তি করে স্পট প্রাইস গণনা করে। দীর্ঘ সময়কাল বেছে নেওয়া আপনার প্রটোকলকে প্রাইস ম্যানিপুলেশনের বিরুদ্ধে রক্ষা করে কারণ সম্প্রতি এক্সিকিউট হওয়া বড় অর্ডারগুলো অ্যাসেটের প্রাইসকে প্রভাবিত করতে পারে না।
ডেভেলপারদের জন্য স্মার্ট কন্ট্রাক্ট সিকিউরিটি রিসোর্স
স্মার্ট কন্ট্রাক্ট বিশ্লেষণ এবং কোডের সঠিকতা যাচাই করার টুল
-
টেস্টিং টুল এবং লাইব্রেরি - স্মার্ট কন্ট্রাক্টগুলোতে ইউনিট টেস্ট, স্ট্যাটিক অ্যানালাইসিস এবং ডাইনামিক অ্যানালাইসিস করার জন্য ইন্ডাস্ট্রি-স্ট্যান্ডার্ড টুল এবং লাইব্রেরির সংগ্রহ।
-
ফরমাল ভেরিফিকেশন টুল - স্মার্ট কন্ট্রাক্টগুলোতে ফাংশনাল সঠিকতা যাচাই এবং ইনভ্যারিয়েন্ট চেক করার টুল।
-
স্মার্ট কন্ট্রাক্ট অডিটিং সার্ভিস - ইথিরিয়াম ডেভেলপমেন্ট প্রজেক্টের জন্য স্মার্ট কন্ট্রাক্ট অডিটিং সার্ভিস প্রদানকারী সংস্থাগুলোর তালিকা।
-
বাগ বাউন্টি প্ল্যাটফর্ম - বাগ বাউন্টি পরিচালনা এবং স্মার্ট কন্ট্রাক্টগুলোর জটিল দুর্বলতাগুলো দায়িত্বশীলভাবে প্রকাশ করার জন্য পুরস্কৃত করার প্ল্যাটফর্ম।
-
Fork Checker (opens in a new tab) - ফর্ক করা কন্ট্রাক্ট সম্পর্কিত সমস্ত উপলব্ধ তথ্য চেক করার জন্য একটি বিনামূল্যের অনলাইন টুল।
-
ABI Encoder (opens in a new tab) - আপনার Solidity কন্ট্রাক্ট ফাংশন এবং কনস্ট্রাক্টর আর্গুমেন্ট এনকোড করার জন্য একটি বিনামূল্যের অনলাইন সার্ভিস।
-
Aderyn (opens in a new tab) - Solidity স্ট্যাটিক অ্যানালাইজার, যা সন্দেহজনক দুর্বলতাগুলো চিহ্নিত করতে অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (AST) ট্রাভার্স করে এবং সহজে ব্যবহারযোগ্য মার্কডাউন ফরম্যাটে সমস্যাগুলো প্রিন্ট করে।
স্মার্ট কন্ট্রাক্ট মনিটরিং করার টুল
- Tenderly Real-Time Alerting (opens in a new tab) - আপনার স্মার্ট কন্ট্রাক্ট বা ওয়ালেটগুলোতে অস্বাভাবিক বা অপ্রত্যাশিত ঘটনা ঘটলে রিয়েল-টাইম নোটিফিকেশন পাওয়ার একটি টুল।
স্মার্ট কন্ট্রাক্টগুলোর নিরাপদ পরিচালনার টুল
-
Safe (opens in a new tab) - ইথিরিয়ামে চলা স্মার্ট কন্ট্রাক্ট ওয়ালেট, যেখানে কোনো লেনদেন সম্পন্ন হওয়ার আগে ন্যূনতম সংখ্যক মানুষের অনুমোদনের প্রয়োজন হয় (M-of-N)।
-
OpenZeppelin Contracts (opens in a new tab) - কন্ট্রাক্ট ওনারশিপ, আপগ্রেড, অ্যাক্সেস কন্ট্রোল, গভর্নেন্স, পজ করার ক্ষমতাসহ প্রশাসনিক ফিচারগুলো বাস্তবায়নের জন্য কন্ট্রাক্ট লাইব্রেরি।
স্মার্ট কন্ট্রাক্ট অডিটিং সার্ভিস
-
ConsenSys Diligence (opens in a new tab) - স্মার্ট কন্ট্রাক্ট অডিটিং সার্ভিস, যা ব্লকচেইন ইকোসিস্টেমের প্রজেক্টগুলোকে তাদের প্রটোকল লঞ্চের জন্য প্রস্তুত করতে এবং ব্যবহারকারীদের সুরক্ষার জন্য তৈরি করতে সাহায্য করে।
-
CertiK (opens in a new tab) - ব্লকচেইন সিকিউরিটি ফার্ম, যা স্মার্ট কন্ট্রাক্ট এবং ব্লকচেইন নেটওয়ার্কগুলোতে অত্যাধুনিক ফরমাল ভেরিফিকেশন প্রযুক্তির ব্যবহারে অগ্রণী ভূমিকা পালন করছে।
-
Trail of Bits (opens in a new tab) - সাইবার সিকিউরিটি কোম্পানি, যা ঝুঁকি কমাতে এবং কোডকে শক্তিশালী করতে আক্রমণকারীর মানসিকতার সাথে সিকিউরিটি গবেষণার সমন্বয় করে।
-
PeckShield (opens in a new tab) - ব্লকচেইন সিকিউরিটি কোম্পানি, যা সম্পূর্ণ ব্লকচেইন ইকোসিস্টেমের নিরাপত্তা, গোপনীয়তা এবং ব্যবহারযোগ্যতার জন্য প্রোডাক্ট ও সার্ভিস প্রদান করে।
-
QuantStamp (opens in a new tab) - অডিটিং সার্ভিস, যা নিরাপত্তা এবং ঝুঁকি মূল্যায়ন সার্ভিসের মাধ্যমে ব্লকচেইন প্রযুক্তির মূলধারার গ্রহণকে সহজতর করে।
-
OpenZeppelin (opens in a new tab) - স্মার্ট কন্ট্রাক্ট সিকিউরিটি কোম্পানি, যা ডিস্ট্রিবিউটেড সিস্টেমগুলোর জন্য সিকিউরিটি অডিট প্রদান করে।
-
Runtime Verification (opens in a new tab) - সিকিউরিটি কোম্পানি, যা স্মার্ট কন্ট্রাক্টগুলোর ফরমাল মডেলিং এবং ভেরিফিকেশনে বিশেষজ্ঞ।
-
Hacken (opens in a new tab) - ওয়েব3 সাইবার সিকিউরিটি অডিটর, যা ব্লকচেইন নিরাপত্তায় ৩৬০-ডিগ্রি পদ্ধতি নিয়ে আসে।
-
Nethermind (opens in a new tab) - Solidity এবং Cairo অডিটিং সার্ভিস, যা ইথিরিয়াম এবং Starknet জুড়ে স্মার্ট কন্ট্রাক্টগুলোর অখণ্ডতা এবং ব্যবহারকারীদের নিরাপত্তা নিশ্চিত করে।
-
HashEx (opens in a new tab) - HashEx ক্রিপটোকারেন্সিগুলোর নিরাপত্তা নিশ্চিত করতে ব্লকচেইন এবং স্মার্ট কন্ট্রাক্ট অডিটিংয়ের ওপর ফোকাস করে, যা স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট, পেনিট্রেশন টেস্টিং, ব্লকচেইন কনসাল্টিংয়ের মতো সার্ভিস প্রদান করে।
-
Code4rena (opens in a new tab) - প্রতিযোগিতামূলক অডিট প্ল্যাটফর্ম, যা স্মার্ট কন্ট্রাক্ট সিকিউরিটি বিশেষজ্ঞদের দুর্বলতা খুঁজে বের করতে এবং ওয়েব3-কে আরও সুরক্ষিত করতে উৎসাহিত করে।
-
CodeHawks (opens in a new tab) - প্রতিযোগিতামূলক অডিট প্ল্যাটফর্ম, যা সিকিউরিটি গবেষকদের জন্য স্মার্ট কন্ট্রাক্ট অডিটিং প্রতিযোগিতার আয়োজন করে।
-
Cyfrin (opens in a new tab) - ওয়েব3 সিকিউরিটি পাওয়ারহাউস, যা প্রোডাক্ট এবং স্মার্ট কন্ট্রাক্ট অডিটিং সার্ভিসের মাধ্যমে ক্রিপ্টো সিকিউরিটিকে ইনকিউবেট করে।
-
ImmuneBytes (opens in a new tab) - ওয়েব3 সিকিউরিটি ফার্ম, যা অভিজ্ঞ অডিটরদের একটি দল এবং সেরা টুলগুলোর মাধ্যমে ব্লকচেইন সিস্টেমগুলোর জন্য সিকিউরিটি অডিট অফার করে।
-
Oxorio (opens in a new tab) - ক্রিপ্টো ফার্ম এবং DeFi প্রজেক্টগুলোর জন্য EVM, Solidity, ZK, ক্রস-চেইন প্রযুক্তিতে দক্ষতাসম্পন্ন স্মার্ট কন্ট্রাক্ট অডিট এবং ব্লকচেইন সিকিউরিটি সার্ভিস।
-
Inference (opens in a new tab) - সিকিউরিটি অডিটিং কোম্পানি, যা EVM-ভিত্তিক ব্লকচেইনগুলোর জন্য স্মার্ট কন্ট্রাক্ট অডিটিংয়ে বিশেষজ্ঞ। এর বিশেষজ্ঞ অডিটরদের ধন্যবাদ, তারা সম্ভাব্য সমস্যাগুলো চিহ্নিত করে এবং ডিপ্লয়মেন্টের আগে সেগুলো সমাধানের জন্য কার্যকর পরামর্শ দেয়।
বাগ বাউন্টি প্ল্যাটফর্ম
-
Immunefi (opens in a new tab) - স্মার্ট কন্ট্রাক্ট এবং DeFi প্রজেক্টগুলোর জন্য বাগ বাউন্টি প্ল্যাটফর্ম, যেখানে সিকিউরিটি গবেষকরা কোড রিভিউ করেন, দুর্বলতা প্রকাশ করেন, অর্থ পান এবং ক্রিপ্টোকে আরও নিরাপদ করেন।
-
HackerOne (opens in a new tab) - দুর্বলতা সমন্বয় এবং বাগ বাউন্টি প্ল্যাটফর্ম, যা ব্যবসাগুলোকে পেনিট্রেশন টেস্টার এবং সাইবার সিকিউরিটি গবেষকদের সাথে সংযুক্ত করে।
-
HackenProof (opens in a new tab) - ক্রিপ্টো প্রজেক্টগুলোর (DeFi, স্মার্ট কন্ট্রাক্ট, ওয়ালেট, CEX এবং আরও অনেক কিছু) জন্য বিশেষজ্ঞ বাগ বাউন্টি প্ল্যাটফর্ম, যেখানে সিকিউরিটি পেশাদাররা ট্রায়াজ সার্ভিস প্রদান করেন এবং গবেষকরা প্রাসঙ্গিক, যাচাইকৃত বাগ রিপোর্টের জন্য অর্থ পান।
-
Sherlock (opens in a new tab) - স্মার্ট কন্ট্রাক্ট সিকিউরিটির জন্য ওয়েব3-তে আন্ডাররাইটার, যেখানে প্রাসঙ্গিক বাগগুলোর জন্য ন্যায্য অর্থ প্রদান নিশ্চিত করতে স্মার্ট কন্ট্রাক্টগুলোর মাধ্যমে অডিটরদের পেআউট পরিচালনা করা হয়।
-
CodeHawks (opens in a new tab) - প্রতিযোগিতামূলক বাগ বাউন্টি প্ল্যাটফর্ম, যেখানে অডিটররা সিকিউরিটি প্রতিযোগিতা এবং চ্যালেঞ্জগুলোতে অংশ নেন এবং (শীঘ্রই) তাদের নিজস্ব প্রাইভেট অডিটেও অংশ নেবেন।
পরিচিত স্মার্ট কন্ট্রাক্ট দুর্বলতা এবং এক্সপ্লয়েটগুলোর প্রকাশনা
-
ConsenSys: Smart Contract Known Attacks (opens in a new tab) - সবচেয়ে উল্লেখযোগ্য কন্ট্রাক্ট দুর্বলতাগুলোর শিক্ষানবিস-বান্ধব ব্যাখ্যা, যেখানে বেশিরভাগ ক্ষেত্রেই নমুনা কোড দেওয়া আছে।
-
SWC Registry (opens in a new tab) - কমন উইকনেস এনামারেশন (CWE) আইটেমগুলোর কিউরেট করা তালিকা, যা ইথিরিয়াম স্মার্ট কন্ট্রাক্টগুলোতে প্রযোজ্য।
-
Rekt (opens in a new tab) - হাই-প্রোফাইল ক্রিপ্টো হ্যাক এবং এক্সপ্লয়েটগুলোর নিয়মিত আপডেট করা প্রকাশনা, সাথে বিস্তারিত পোস্ট-মর্টেম রিপোর্ট।
স্মার্ট কন্ট্রাক্ট সিকিউরিটি শেখার চ্যালেঞ্জ
-
Awesome BlockSec CTF (opens in a new tab) - ব্লকচেইন সিকিউরিটি ওয়ারগেম, চ্যালেঞ্জ এবং Capture The Flag (opens in a new tab) প্রতিযোগিতা ও সমাধানের রাইটআপগুলোর কিউরেট করা তালিকা।
-
Damn Vulnerable DeFi (opens in a new tab) - DeFi স্মার্ট কন্ট্রাক্টগুলোর অফেন্সিভ সিকিউরিটি শিখতে এবং বাগ-হান্টিং ও সিকিউরিটি অডিটিংয়ে দক্ষতা তৈরি করার ওয়ারগেম।
-
Ethernaut (opens in a new tab) - ওয়েব3/Solidity-ভিত্তিক ওয়ারগেম, যেখানে প্রতিটি লেভেল হলো একটি স্মার্ট কন্ট্রাক্ট যাকে 'হ্যাক' করতে হবে।
-
HackenProof x HackTheBox (opens in a new tab) - ফ্যান্টাসি অ্যাডভেঞ্চারের ওপর ভিত্তি করে তৈরি স্মার্ট কন্ট্রাক্ট হ্যাকিং চ্যালেঞ্জ। চ্যালেঞ্জটি সফলভাবে সম্পন্ন করলে একটি প্রাইভেট বাগ বাউন্টি প্রোগ্রামে অ্যাক্সেসও পাওয়া যায়।
স্মার্ট কন্ট্রাক্ট সুরক্ষিত করার সেরা অনুশীলন
-
ConsenSys: Ethereum Smart Contract Security Best Practices (opens in a new tab) - ইথিরিয়াম স্মার্ট কন্ট্রাক্টগুলো সুরক্ষিত করার জন্য নির্দেশিকাগুলোর একটি বিস্তৃত তালিকা।
-
Nascent: Simple Security Toolkit (opens in a new tab) - স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টের জন্য ব্যবহারিক সিকিউরিটি-ফোকাসড গাইড এবং চেকলিস্টের সংগ্রহ।
-
Solidity Patterns (opens in a new tab) - স্মার্ট কন্ট্রাক্ট প্রোগ্রামিং ভাষা Solidity-এর জন্য সুরক্ষিত প্যাটার্ন এবং সেরা অনুশীলনগুলোর দরকারী সংকলন।
-
Solidity Docs: Security Considerations (opens in a new tab) - Solidity দিয়ে সুরক্ষিত স্মার্ট কন্ট্রাক্ট লেখার নির্দেশিকা।
-
Smart Contract Security Verification Standard (opens in a new tab) - ডেভেলপার, আর্কিটেক্ট, সিকিউরিটি রিভিউয়ার এবং ভেন্ডরদের জন্য স্মার্ট কন্ট্রাক্টগুলোর নিরাপত্তাকে মানসম্মত করতে তৈরি করা চৌদ্দ-অংশের চেকলিস্ট।
-
Learn Smart Contract Security and Auditing (opens in a new tab) - চূড়ান্ত স্মার্ট কন্ট্রাক্ট সিকিউরিটি এবং অডিটিং কোর্স, যা সেইসব স্মার্ট কন্ট্রাক্ট ডেভেলপারদের জন্য তৈরি করা হয়েছে যারা তাদের সিকিউরিটির সেরা অনুশীলনগুলোকে উন্নত করতে এবং সিকিউরিটি গবেষক হতে চান।