মূল কন্টেন্টে যান
Change page

স্মার্ট কন্ট্রাক্ট নিরাপত্তা

স্মার্ট কন্ট্রাক্টগুলি অত্যন্ত নমনীয় এবং ব্লকচেইনে ডিপ্লয় করা কোডের উপর ভিত্তি করে অপরিবর্তনীয় লজিক চালানোর পাশাপাশি প্রচুর পরিমাণে মূল্য এবং ডেটা নিয়ন্ত্রণ করতে সক্ষম। এটি আস্থা-নিরপেক্ষ এবং বিকেন্দ্রীকৃত অ্যাপ্লিকেশনগুলির একটি প্রাণবন্ত ইকোসিস্টেম তৈরি করেছে যা লিগ্যাসি সিস্টেমগুলির তুলনায় অনেক সুবিধা প্রদান করে। এগুলি স্মার্ট কন্ট্রাক্টের দুর্বলতাগুলিকে কাজে লাগিয়ে লাভবান হতে চাওয়া আক্রমণকারীদের জন্য সুযোগও তৈরি করে।

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

যদিও পরিসংখ্যান ভিন্ন হতে পারে, তবে অনুমান করা হয় যে স্মার্ট কন্ট্রাক্টের নিরাপত্তা ত্রুটির কারণে চুরি হওয়া বা হারিয়ে যাওয়া মূল্যের মোট পরিমাণ সহজেই $1 বিলিয়নের বেশি। এর মধ্যে রয়েছে হাই-প্রোফাইল ঘটনা, যেমন DAO হ্যাক (নতুন ট্যাবে খোলে) (3.6M ETH চুরি হয়েছে, যার বর্তমান মূল্য $1B-এর বেশি), Parity মাল্টিসিগ ওয়ালেট হ্যাক (নতুন ট্যাবে খোলে) (হ্যাকারদের কাছে $30M হারানো), এবং Parity ফ্রোজেন ওয়ালেট সমস্যা (নতুন ট্যাবে খোলে) ($300M-এর বেশি মূল্যের ETH চিরতরে লক হয়ে যাওয়া)।

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

পূর্বশর্ত

নিরাপত্তা নিয়ে কাজ করার আগে নিশ্চিত করুন যে আপনি স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টের মৌলিক বিষয়গুলোর সাথে পরিচিত।

নিরাপদ ইথেরিয়াম স্মার্ট কন্ট্রাক্ট তৈরির নির্দেশিকা

1. সঠিক অ্যাক্সেস কন্ট্রোল ডিজাইন করুন

স্মার্ট কন্ট্রাক্টে, public বা external হিসেবে চিহ্নিত ফাংশনগুলোকে যেকোনো এক্সটার্নালি ওনড অ্যাকাউন্ট (EOA) বা কন্ট্রাক্ট অ্যাকাউন্ট কল করতে পারে। আপনি যদি চান যে অন্যরা আপনার কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করুক, তবে ফাংশনগুলোর জন্য পাবলিক ভিজিবিলিটি নির্দিষ্ট করা প্রয়োজন। তবে private হিসেবে চিহ্নিত ফাংশনগুলোকে শুধুমাত্র স্মার্ট কন্ট্রাক্টের ভেতরের ফাংশনগুলোই কল করতে পারে, কোনো এক্সটার্নাল অ্যাকাউন্ট নয়। নেটওয়ার্কের প্রতিটি অংশগ্রহণকারীকে কন্ট্রাক্ট ফাংশনে অ্যাক্সেস দেওয়া সমস্যার কারণ হতে পারে, বিশেষ করে যদি এর মানে হয় যে যেকেউ সংবেদনশীল কাজগুলো (যেমন, নতুন টোকেন মিন্টিং) করতে পারে।

স্মার্ট কন্ট্রাক্ট ফাংশনগুলোর অননুমোদিত ব্যবহার রোধ করতে, নিরাপদ অ্যাক্সেস কন্ট্রোল প্রয়োগ করা প্রয়োজন। অ্যাক্সেস কন্ট্রোল মেকানিজম স্মার্ট কন্ট্রাক্টের নির্দিষ্ট কিছু ফাংশন ব্যবহারের ক্ষমতাকে শুধুমাত্র অনুমোদিত সত্তাগুলোর মধ্যে সীমাবদ্ধ করে, যেমন কন্ট্রাক্ট পরিচালনার জন্য দায়ী অ্যাকাউন্টগুলো। Ownable প্যাটার্ন এবং রোল-ভিত্তিক কন্ট্রোল হলো স্মার্ট কন্ট্রাক্টে অ্যাক্সেস কন্ট্রোল প্রয়োগের জন্য দুটি কার্যকরী প্যাটার্ন:

Ownable প্যাটার্ন

Ownable প্যাটার্নে, কন্ট্রাক্ট তৈরির প্রক্রিয়ার সময় একটি ঠিকানাকে কন্ট্রাক্টের “মালিক” (owner) হিসেবে সেট করা হয়। সুরক্ষিত ফাংশনগুলোতে একটি OnlyOwner মডিফায়ার যুক্ত করা হয়, যা নিশ্চিত করে যে ফাংশনটি কার্যকর করার আগে কন্ট্রাক্টটি কলকারী ঠিকানার পরিচয় যাচাই করে। কন্ট্রাক্টের মালিক ছাড়া অন্য কোনো ঠিকানা থেকে সুরক্ষিত ফাংশনগুলোতে কল করা হলে তা সর্বদা রিভার্ট হয়, যা অবাঞ্ছিত অ্যাক্সেস প্রতিরোধ করে।

রোল-ভিত্তিক অ্যাক্সেস কন্ট্রোল

স্মার্ট কন্ট্রাক্টে একটিমাত্র ঠিকানাকে Owner হিসেবে নিবন্ধিত করা কেন্দ্রীকরণের ঝুঁকি তৈরি করে এবং এটি একটি সিঙ্গেল পয়েন্ট-অফ-ফেইলিওর (single point-of-failure) হিসেবে কাজ করে। যদি মালিকের অ্যাকাউন্টের কী (key) আপস করা হয়, তবে আক্রমণকারীরা মালিকানাধীন কন্ট্রাক্টে আক্রমণ করতে পারে। এ কারণেই একাধিক অ্যাডমিনিস্ট্রেটিভ অ্যাকাউন্টসহ একটি রোল-ভিত্তিক অ্যাক্সেস কন্ট্রোল প্যাটার্ন ব্যবহার করা আরও ভালো বিকল্প হতে পারে।

রোল-ভিত্তিক অ্যাক্সেস কন্ট্রোলে, সংবেদনশীল ফাংশনগুলোর অ্যাক্সেস বিশ্বস্ত অংশগ্রহণকারীদের একটি সেটের মধ্যে বিতরণ করা হয়। উদাহরণস্বরূপ, একটি অ্যাকাউন্ট টোকেন মিন্টিং এর জন্য দায়ী থাকতে পারে, যেখানে অন্য একটি অ্যাকাউন্ট আপগ্রেড করে বা কন্ট্রাক্টটি পজ (pause) করে। এভাবে অ্যাক্সেস কন্ট্রোল বিকেন্দ্রীকৃত করার ফলে সিঙ্গেল পয়েন্ট অফ ফেইলিওর দূর হয় এবং ব্যবহারকারীদের জন্য আস্থার অনুমান হ্রাস পায়।

মাল্টি-সিগনেচার ওয়ালেট ব্যবহার করা

নিরাপদ অ্যাক্সেস কন্ট্রোল প্রয়োগের আরেকটি পদ্ধতি হলো কন্ট্রাক্ট পরিচালনা করার জন্য একটি মাল্টি-সিগনেচার অ্যাকাউন্ট ব্যবহার করা। একটি সাধারণ EOA-এর বিপরীতে, মাল্টি-সিগনেচার অ্যাকাউন্টগুলোর মালিকানায় একাধিক সত্তা থাকে এবং ট্রানজ্যাকশন কার্যকর করার জন্য ন্যূনতম সংখ্যক অ্যাকাউন্টের (যেমন 5 টির মধ্যে 3 টি) স্বাক্ষরের প্রয়োজন হয়।

অ্যাক্সেস কন্ট্রোলের জন্য একটি মাল্টিসিগ ব্যবহার করা নিরাপত্তার একটি অতিরিক্ত স্তর যুক্ত করে, কারণ টার্গেট কন্ট্রাক্টে কোনো কাজ করার জন্য একাধিক পক্ষের সম্মতির প্রয়োজন হয়। এটি বিশেষভাবে কার্যকর যদি Ownable প্যাটার্ন ব্যবহার করা প্রয়োজনীয় হয়, কারণ এটি কোনো আক্রমণকারী বা ক্ষতিকারক ইনসাইডারের পক্ষে দূষিত উদ্দেশ্যে সংবেদনশীল কন্ট্রাক্ট ফাংশনগুলোকে ম্যানিপুলেট করা আরও কঠিন করে তোলে।

2. কন্ট্রাক্ট অপারেশনগুলো সুরক্ষিত রাখতে require(), assert() এবং revert() স্টেটমেন্ট ব্যবহার করুন

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

require(): require ফাংশনের শুরুতে সংজ্ঞায়িত করা হয় এবং এটি নিশ্চিত করে যে কল করা ফাংশনটি কার্যকর হওয়ার আগে পূর্বনির্ধারিত শর্তগুলো পূরণ হয়েছে। একটি require স্টেটমেন্ট ব্যবহার করে ব্যবহারকারীর ইনপুট যাচাই করা, স্টেট ভেরিয়েবল চেক করা বা ফাংশনের কাজ এগিয়ে নেওয়ার আগে কলকারী অ্যাকাউন্টের পরিচয় প্রমাণ করা যেতে পারে।

assert(): assert() ব্যবহার করা হয় অভ্যন্তরীণ ত্রুটি শনাক্ত করতে এবং আপনার কোডে “ইনভ্যারিয়েন্ট” (invariants) লঙ্ঘনের বিষয়টি পরীক্ষা করতে। ইনভ্যারিয়েন্ট হলো একটি কন্ট্রাক্টের স্টেট সম্পর্কে একটি যৌক্তিক দাবি, যা সমস্ত ফাংশন এক্সিকিউশনের জন্য সত্য হওয়া উচিত। ইনভ্যারিয়েন্টের একটি উদাহরণ হলো একটি টোকেন কন্ট্রাক্টের সর্বোচ্চ মোট সরবরাহ বা ব্যালেন্স। assert() ব্যবহার করা নিশ্চিত করে যে আপনার কন্ট্রাক্ট কখনোই কোনো ঝুঁকিপূর্ণ স্টেটে পৌঁছাবে না, এবং যদি পৌঁছায়ও, তবে স্টেট ভেরিয়েবলের সমস্ত পরিবর্তন রোল ব্যাক করা হয়।

revert(): revert() একটি if-else স্টেটমেন্টে ব্যবহার করা যেতে পারে, যা প্রয়োজনীয় শর্ত পূরণ না হলে একটি এক্সেপশন ট্রিগার করে। নিচের নমুনা কন্ট্রাক্টটি ফাংশনগুলোর এক্সিকিউশন সুরক্ষিত রাখতে revert() ব্যবহার করে:

3. স্মার্ট কন্ট্রাক্ট পরীক্ষা করুন এবং কোডের সঠিকতা যাচাই করুন

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

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

দুর্ভাগ্যবশত, যখন বিচ্ছিন্নভাবে ব্যবহার করা হয়, তখন স্মার্ট কন্ট্রাক্টের নিরাপত্তা উন্নত করার ক্ষেত্রে ইউনিট টেস্টিং খুব সামান্যই কার্যকর। একটি ইউনিট টেস্ট প্রমাণ করতে পারে যে একটি ফাংশন মক ডেটার জন্য সঠিকভাবে কাজ করে, তবে ইউনিট টেস্টগুলো কেবল ততটাই কার্যকর যতটা ভালোভাবে টেস্টগুলো লেখা হয়। এটি মিস হয়ে যাওয়া এজ কেস (edge cases) এবং দুর্বলতাগুলো শনাক্ত করা কঠিন করে তোলে, যা আপনার স্মার্ট কন্ট্রাক্টের নিরাপত্তাকে ভেঙে দিতে পারে।

একটি ভালো পদ্ধতি হলো ইউনিট টেস্টিংয়ের সাথে স্ট্যাটিক এবং ডায়নামিক অ্যানালাইসিস ব্যবহার করে প্রপার্টি-ভিত্তিক টেস্টিং যুক্ত করা। স্ট্যাটিক অ্যানালাইসিস পৌঁছানো যায় এমন প্রোগ্রাম স্টেট এবং এক্সিকিউশন পাথগুলো বিশ্লেষণ করতে লো-লেভেল রিপ্রেজেন্টেশনের ওপর নির্ভর করে, যেমন কন্ট্রোল ফ্লো গ্রাফ (নতুন ট্যাবে খোলে) এবং অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (নতুন ট্যাবে খোলে)। অন্যদিকে, ডায়নামিক অ্যানালাইসিস কৌশলগুলো, যেমন স্মার্ট কন্ট্রাক্ট ফাজিং (নতুন ট্যাবে খোলে), নিরাপত্তা বৈশিষ্ট্য লঙ্ঘন করে এমন অপারেশনগুলো শনাক্ত করতে র্যান্ডম ইনপুট ভ্যালু দিয়ে কন্ট্রাক্ট কোড এক্সিকিউট করে।

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

4. আপনার কোডের একটি স্বাধীন পর্যালোচনার জন্য অনুরোধ করুন

আপনার কন্ট্রাক্ট পরীক্ষা করার পর, কোনো নিরাপত্তা সমস্যার জন্য সোর্স কোডটি চেক করতে অন্যদের বলা ভালো। টেস্টিং একটি স্মার্ট কন্ট্রাক্টের প্রতিটি ত্রুটি উন্মোচন করবে না, তবে একটি স্বাধীন পর্যালোচনা পেলে দুর্বলতাগুলো শনাক্ত করার সম্ভাবনা বেড়ে যায়।

অডিট

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

তা সত্ত্বেও, আপনার অডিটকে সব সমস্যার সমাধান (silver bullet) হিসেবে বিবেচনা করা এড়ানো উচিত। স্মার্ট কন্ট্রাক্ট অডিট প্রতিটি বাগ ধরতে পারে না এবং এগুলো মূলত পর্যালোচনার একটি অতিরিক্ত রাউন্ড প্রদান করার জন্য ডিজাইন করা হয়েছে, যা প্রাথমিক ডেভেলপমেন্ট এবং টেস্টিংয়ের সময় ডেভেলপারদের মিস করা সমস্যাগুলো শনাক্ত করতে সাহায্য করতে পারে। স্মার্ট কন্ট্রাক্ট অডিটের সুবিধা সর্বাধিক করতে আপনার অডিটরদের সাথে কাজ করার সর্বোত্তম অনুশীলনগুলোও অনুসরণ করা উচিত, যেমন কোড সঠিকভাবে ডকুমেন্ট করা এবং ইনলাইন কমেন্ট যোগ করা।

বাগ বাউন্টি

একটি বাগ বাউন্টি প্রোগ্রাম সেট আপ করা হলো এক্সটার্নাল কোড পর্যালোচনা প্রয়োগের আরেকটি পদ্ধতি। বাগ বাউন্টি হলো একটি আর্থিক পুরস্কার যা এমন ব্যক্তিদের (সাধারণত হোয়াইটহ্যাট হ্যাকারদের) দেওয়া হয় যারা কোনো অ্যাপ্লিকেশনে দুর্বলতা আবিষ্কার করে।

সঠিকভাবে ব্যবহার করা হলে, বাগ বাউন্টি হ্যাকার কমিউনিটির সদস্যদের আপনার কোডে গুরুতর ত্রুটিগুলো পরীক্ষা করার জন্য উৎসাহিত করে। এর একটি বাস্তব উদাহরণ হলো “ইনফিনিট মানি বাগ” (infinite money bug), যা কোনো আক্রমণকারীকে ইথেরিয়ামে চলা একটি লেয়ার ২ (l2) প্রোটোকল অপটিমিজম (নতুন ট্যাবে খোলে)-এ সীমাহীন পরিমাণ ইথার তৈরি করতে দিত। সৌভাগ্যবশত, একজন হোয়াইটহ্যাট হ্যাকার ত্রুটিটি আবিষ্কার করেন (নতুন ট্যাবে খোলে) এবং টিমকে জানান, যার ফলে তিনি একটি বড় অঙ্কের অর্থ উপার্জন করেন (নতুন ট্যাবে খোলে)

একটি কার্যকরী কৌশল হলো ঝুঁকিতে থাকা ফান্ডের পরিমাণের অনুপাতে বাগ বাউন্টি প্রোগ্রামের পেআউট নির্ধারণ করা। “স্কেলিং বাগ বাউন্টি (নতুন ট্যাবে খোলে)” হিসেবে পরিচিত এই পদ্ধতিটি ব্যক্তিদের দুর্বলতাগুলো কাজে লাগানোর পরিবর্তে দায়িত্বশীলভাবে প্রকাশ করার জন্য আর্থিক প্রণোদনা প্রদান করে।

5. স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টের সময় সর্বোত্তম অনুশীলনগুলো অনুসরণ করুন

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

  • সমস্ত কোড একটি ভার্সন কন্ট্রোল সিস্টেমে সংরক্ষণ করুন, যেমন git

  • পুল রিকোয়েস্টের মাধ্যমে কোডের সমস্ত পরিবর্তন করুন

  • নিশ্চিত করুন যে পুল রিকোয়েস্টগুলোতে অন্তত একজন স্বাধীন পর্যালোচক আছেন—যদি আপনি কোনো প্রজেক্টে একাকী কাজ করেন, তবে অন্য ডেভেলপারদের খুঁজে বের করার এবং কোড পর্যালোচনার বিনিময় করার কথা বিবেচনা করুন

  • স্মার্ট কন্ট্রাক্টগুলো টেস্টিং, কম্পাইল করা এবং ডিপ্লয়মেন্টের জন্য একটি ডেভেলপমেন্ট এনভায়রনমেন্ট ব্যবহার করুন

  • আপনার কোডটি বেসিক কোড অ্যানালাইসিস টুলগুলোর মাধ্যমে রান করুন, যেমন Cyfrin Aderyn (নতুন ট্যাবে খোলে), Mythril এবং স্লিদার। আদর্শভাবে, প্রতিটি পুল রিকোয়েস্ট মার্জ করার আগে আপনার এটি করা উচিত এবং আউটপুটের পার্থক্যগুলো তুলনা করা উচিত

  • নিশ্চিত করুন যে আপনার কোড কোনো ত্রুটি ছাড়াই কম্পাইল হয় এবং Solidity কম্পাইলার কোনো সতর্কতা দেখায় না

  • আপনার কোডটি সঠিকভাবে ডকুমেন্ট করুন (NatSpec (নতুন ট্যাবে খোলে) ব্যবহার করে) এবং সহজে বোঝা যায় এমন ভাষায় কন্ট্রাক্ট আর্কিটেকচার সম্পর্কে বিস্তারিত বর্ণনা করুন। এটি অন্যদের জন্য আপনার কোড অডিট এবং পর্যালোচনা করা সহজ করে তুলবে।

6. শক্তিশালী দুর্যোগ পুনরুদ্ধার পরিকল্পনা বাস্তবায়ন করুন

নিরাপদ অ্যাক্সেস কন্ট্রোল ডিজাইন করা, ফাংশন মডিফায়ার প্রয়োগ করা এবং অন্যান্য পরামর্শগুলো স্মার্ট কন্ট্রাক্টের নিরাপত্তা উন্নত করতে পারে, তবে এগুলো ক্ষতিকারক এক্সপ্লয়েটের সম্ভাবনাকে উড়িয়ে দিতে পারে না। নিরাপদ স্মার্ট কন্ট্রাক্ট তৈরির জন্য “ব্যর্থতার জন্য প্রস্তুতি” এবং আক্রমণের কার্যকর প্রতিক্রিয়া জানানোর জন্য একটি ফলব্যাক প্ল্যান থাকা প্রয়োজন। একটি সঠিক দুর্যোগ পুনরুদ্ধার পরিকল্পনায় নিচের কিছু বা সমস্ত উপাদান অন্তর্ভুক্ত থাকবে:

কন্ট্রাক্ট আপগ্রেড

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

কন্ট্রাক্ট আপগ্রেড মেকানিজমগুলো ভিন্নভাবে কাজ করে, তবে স্মার্ট কন্ট্রাক্ট আপগ্রেড করার জন্য “প্রক্সি প্যাটার্ন” হলো অন্যতম জনপ্রিয় পদ্ধতি। প্রক্সি প্যাটার্ন (নতুন ট্যাবে খোলে) একটি অ্যাপ্লিকেশনের স্টেট এবং লজিককে দুটি কন্ট্রাক্টের মধ্যে বিভক্ত করে। প্রথম কন্ট্রাক্টটি (যাকে ‘প্রক্সি চুক্তি’ বলা হয়) স্টেট ভেরিয়েবলগুলো (যেমন, ব্যবহারকারীর ব্যালেন্স) সংরক্ষণ করে, যেখানে দ্বিতীয় কন্ট্রাক্টটি (যাকে ‘লজিক কন্ট্রাক্ট’ বলা হয়) কন্ট্রাক্ট ফাংশনগুলো কার্যকর করার কোড ধারণ করে।

অ্যাকাউন্টগুলো প্রক্সি চুক্তির সাথে ইন্টারঅ্যাক্ট করে, যা delegatecall() (নতুন ট্যাবে খোলে) লো-লেভেল কল ব্যবহার করে সমস্ত ফাংশন কলকে লজিক কন্ট্রাক্টে পাঠায়। একটি সাধারণ মেসেজ কলের বিপরীতে, delegatecall() নিশ্চিত করে যে লজিক কন্ট্রাক্টের ঠিকানায় চলা কোডটি কলিং কন্ট্রাক্টের প্রেক্ষাপটে কার্যকর হয়। এর মানে হলো লজিক কন্ট্রাক্ট সর্বদা প্রক্সির স্টোরেজে (নিজের স্টোরেজের পরিবর্তে) লিখবে এবং msg.sendermsg.value এর মূল মানগুলো সংরক্ষিত থাকবে।

লজিক কন্ট্রাক্টে কলগুলো অর্পণ করার জন্য প্রক্সি চুক্তির স্টোরেজে এর ঠিকানা সংরক্ষণ করা প্রয়োজন। অতএব, কন্ট্রাক্টের লজিক আপগ্রেড করা মানে হলো কেবল আরেকটি লজিক কন্ট্রাক্ট ডিপ্লয়মেন্ট করা এবং প্রক্সি চুক্তিতে নতুন ঠিকানাটি সংরক্ষণ করা। যেহেতু প্রক্সি চুক্তিতে পরবর্তী কলগুলো স্বয়ংক্রিয়ভাবে নতুন লজিক কন্ট্রাক্টে রাউট করা হয়, তাই আপনি আসলে কোড পরিবর্তন না করেই কন্ট্রাক্টটি “আপগ্রেড” করে ফেলবেন।

কন্ট্রাক্ট আপগ্রেড করা সম্পর্কে আরও জানুন

ইমার্জেন্সি স্টপ

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

চূড়ান্ত বিকল্প হলো একটি “ইমার্জেন্সি স্টপ” (emergency stop) ফাংশন প্রয়োগ করা যা কোনো কন্ট্রাক্টের দুর্বল ফাংশনগুলোতে কল করা ব্লক করে। ইমার্জেন্সি স্টপগুলোতে সাধারণত নিচের উপাদানগুলো থাকে:

  1. একটি গ্লোবাল বুলিয়ান ভেরিয়েবল যা নির্দেশ করে যে স্মার্ট কন্ট্রাক্টটি বন্ধ স্টেটে আছে কি না। কন্ট্রাক্ট সেট আপ করার সময় এই ভেরিয়েবলটি false এ সেট করা হয়, তবে কন্ট্রাক্টটি বন্ধ হয়ে গেলে এটি true এ রিভার্ট হবে।

  2. এমন ফাংশন যা তাদের এক্সিকিউশনে বুলিয়ান ভেরিয়েবলকে রেফারেন্স করে। স্মার্ট কন্ট্রাক্ট বন্ধ না থাকলে এই ধরনের ফাংশনগুলো অ্যাক্সেসযোগ্য থাকে এবং ইমার্জেন্সি স্টপ ফিচারটি ট্রিগার হলে এগুলো অ্যাক্সেসযোগ্য থাকে না।

  3. এমন একটি সত্তা যার ইমার্জেন্সি স্টপ ফাংশনে অ্যাক্সেস আছে, যা বুলিয়ান ভেরিয়েবলটিকে true এ সেট করে। ক্ষতিকারক কাজগুলো প্রতিরোধ করতে, এই ফাংশনে কলগুলো একটি বিশ্বস্ত ঠিকানায় (যেমন, কন্ট্রাক্টের মালিক) সীমাবদ্ধ করা যেতে পারে।

একবার কন্ট্রাক্টটি ইমার্জেন্সি স্টপ সক্রিয় করলে, নির্দিষ্ট কিছু ফাংশন কল করা যাবে না। এটি গ্লোবাল ভেরিয়েবলকে রেফারেন্স করে এমন একটি মডিফায়ারে নির্বাচিত ফাংশনগুলোকে র‍্যাপ (wrap) করে অর্জন করা হয়। নিচে কন্ট্রাক্টগুলোতে এই প্যাটার্নের একটি বাস্তবায়ন বর্ণনা করে এমন একটি উদাহরণ (নতুন ট্যাবে খোলে) দেওয়া হলো:

এই উদাহরণটি ইমার্জেন্সি স্টপের মৌলিক বৈশিষ্ট্যগুলো দেখায়:

  • isStopped হলো একটি বুলিয়ান যা শুরুতে false এবং কন্ট্রাক্টটি ইমার্জেন্সি মোডে প্রবেশ করলে true মূল্যায়ন করে।

  • ফাংশন মডিফায়ার onlyWhenStopped এবং stoppedInEmergency isStopped ভেরিয়েবলটি চেক করে। stoppedInEmergency ব্যবহার করা হয় এমন ফাংশনগুলো নিয়ন্ত্রণ করতে যা কন্ট্রাক্টটি ঝুঁকিপূর্ণ হলে অ্যাক্সেসযোগ্য হওয়া উচিত নয় (যেমন, deposit())। এই ফাংশনগুলোতে কলগুলো কেবল রিভার্ট হবে।

onlyWhenStopped এমন ফাংশনগুলোর জন্য ব্যবহার করা হয় যা ইমার্জেন্সির সময় কল করা উচিত (যেমন, emergencyWithdraw())। এই ধরনের ফাংশনগুলো পরিস্থিতি সমাধানে সাহায্য করতে পারে, তাই এগুলোকে “সীমাবদ্ধ ফাংশন” (restricted functions) তালিকা থেকে বাদ দেওয়া হয়েছে।

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

ইভেন্ট মনিটরিং

ইভেন্ট (নতুন ট্যাবে খোলে) আপনাকে স্মার্ট কন্ট্রাক্ট ফাংশনগুলোতে কল ট্র্যাক করতে এবং স্টেট ভেরিয়েবলের পরিবর্তনগুলো পর্যবেক্ষণ করতে দেয়। যখনই কোনো পক্ষ নিরাপত্তা-সংবেদনশীল কাজ (যেমন, ফান্ড উত্তোলন) করে, তখনই একটি ইভেন্ট এমিট (emit) করার জন্য আপনার স্মার্ট কন্ট্রাক্ট প্রোগ্রাম করা আদর্শ।

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

আপনি একটি অফ-দ্য-শেল্ফ (off-the-shelf) মনিটরিং টুলও বেছে নিতে পারেন যা কেউ আপনার কন্ট্রাক্টগুলোর সাথে ইন্টারঅ্যাক্ট করলেই স্বয়ংক্রিয়ভাবে অ্যালার্ট পাঠায়। এই টুলগুলো আপনাকে বিভিন্ন ট্রিগারের ওপর ভিত্তি করে কাস্টম অ্যালার্ট তৈরি করতে দেবে, যেমন ট্রানজ্যাকশন ভলিউম, ফাংশন কলের ফ্রিকোয়েন্সি বা জড়িত নির্দিষ্ট ফাংশনগুলো। উদাহরণস্বরূপ, আপনি এমন একটি অ্যালার্ট প্রোগ্রাম করতে পারেন যা একটি একক ট্রানজ্যাকশনে উত্তোলিত পরিমাণ একটি নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করলে আসে।

7. নিরাপদ গভর্ন্যান্স সিস্টেম ডিজাইন করুন

আপনি মূল স্মার্ট কন্ট্রাক্টগুলোর নিয়ন্ত্রণ কমিউনিটি সদস্যদের হাতে তুলে দিয়ে আপনার অ্যাপ্লিকেশনটিকে বিকেন্দ্রীকৃত করতে চাইতে পারেন। এক্ষেত্রে, স্মার্ট কন্ট্রাক্ট সিস্টেমে একটি গভর্ন্যান্স মডিউল অন্তর্ভুক্ত থাকবে—এমন একটি মেকানিজম যা কমিউনিটি সদস্যদের একটি অনচেইন গভর্ন্যান্স সিস্টেমের মাধ্যমে অ্যাডমিনিস্ট্রেটিভ কাজগুলো অনুমোদন করতে দেয়। উদাহরণস্বরূপ, একটি প্রক্সি চুক্তিকে নতুন ইমপ্লিমেন্টেশনে আপগ্রেড করার একটি প্রস্তাব টোকেন-হোল্ডারদের দ্বারা ভোট দেওয়া হতে পারে।

বিকেন্দ্রীকৃত গভর্ন্যান্স উপকারী হতে পারে, বিশেষ করে কারণ এটি ডেভেলপার এবং শেষ-ব্যবহারকারীদের স্বার্থকে একীভূত করে। তা সত্ত্বেও, স্মার্ট কন্ট্রাক্ট গভর্ন্যান্স মেকানিজমগুলো ভুলভাবে প্রয়োগ করা হলে নতুন ঝুঁকি তৈরি করতে পারে। একটি সম্ভাব্য পরিস্থিতি হলো যদি কোনো আক্রমণকারী একটি ফ্ল্যাশ লোন নিয়ে বিপুল ভোটিং ক্ষমতা (ধারণ করা টোকেনের সংখ্যায় পরিমাপ করা) অর্জন করে এবং একটি ক্ষতিকারক প্রস্তাব পাস করিয়ে নেয়।

অনচেইন গভর্ন্যান্স সম্পর্কিত সমস্যাগুলো প্রতিরোধের একটি উপায় হলো টাইমলক ব্যবহার করা (নতুন ট্যাবে খোলে)। একটি টাইমলক একটি নির্দিষ্ট সময় পার না হওয়া পর্যন্ত স্মার্ট কন্ট্রাক্টকে নির্দিষ্ট কাজগুলো সম্পাদন করতে বাধা দেয়। অন্যান্য কৌশলগুলোর মধ্যে রয়েছে প্রতিটি টোকেন কতক্ষণ ধরে লক করা আছে তার ওপর ভিত্তি করে একটি “ভোটিং ওয়েট” (voting weight) নির্ধারণ করা, অথবা বর্তমান ব্লকের পরিবর্তে একটি ঐতিহাসিক সময়ের (উদাহরণস্বরূপ, অতীতের 2-3 ব্লক) ঠিকানার ভোটিং ক্ষমতা পরিমাপ করা। উভয় পদ্ধতিই অনচেইন ভোটগুলোকে প্রভাবিত করার জন্য দ্রুত ভোটিং ক্ষমতা সংগ্রহ করার সম্ভাবনা হ্রাস করে।

শেয়ার করা লিঙ্কগুলোতে নিরাপদ গভর্ন্যান্স সিস্টেম ডিজাইন করা (নতুন ট্যাবে খোলে), DAO-তে বিভিন্ন ভোটিং মেকানিজম (নতুন ট্যাবে খোলে) এবং DeFi ব্যবহার করে সাধারণ DAO অ্যাটাক ভেক্টরগুলো (নতুন ট্যাবে খোলে) সম্পর্কে আরও জানুন।

8. কোডের জটিলতা সর্বনিম্নে কমিয়ে আনুন

ঐতিহ্যবাহী সফটওয়্যার ডেভেলপাররা KISS (“keep it simple, stupid”) নীতির সাথে পরিচিত, যা সফটওয়্যার ডিজাইনে অপ্রয়োজনীয় জটিলতা যুক্ত করার বিরুদ্ধে পরামর্শ দেয়। এটি দীর্ঘদিনের চিন্তাধারা অনুসরণ করে যে “জটিল সিস্টেমগুলো জটিল উপায়ে ব্যর্থ হয়” এবং এগুলো ব্যয়বহুল ত্রুটির প্রতি বেশি সংবেদনশীল।

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

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

9. সাধারণ স্মার্ট কন্ট্রাক্ট দুর্বলতাগুলোর বিরুদ্ধে রক্ষা করুন

রিএন্ট্রান্সি

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

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

ধরা যাক একটি সাধারণ স্মার্ট কন্ট্রাক্ট (‘Victim’) যা যেকাউকে ইথার জমা এবং উত্তোলন করতে দেয়:

এই কন্ট্রাক্টটি ব্যবহারকারীদের কন্ট্রাক্টে আগে জমা করা ETH উত্তোলন করার অনুমতি দেওয়ার জন্য একটি withdraw() ফাংশন প্রকাশ করে। একটি উত্তোলন প্রক্রিয়া করার সময়, কন্ট্রাক্টটি নিচের কাজগুলো সম্পাদন করে:

  1. ব্যবহারকারীর ETH ব্যালেন্স চেক করে
  2. কলিং ঠিকানায় ফান্ড পাঠায়
  3. তাদের ব্যালেন্স 0 এ রিসেট করে, ব্যবহারকারীর কাছ থেকে অতিরিক্ত উত্তোলন প্রতিরোধ করে

Victim কন্ট্রাক্টের withdraw() ফাংশনটি একটি “চেকস-ইন্টারঅ্যাকশনস-ইফেক্টস” (checks-interactions-effects) প্যাটার্ন অনুসরণ করে। এটি চেক করে যে এক্সিকিউশনের জন্য প্রয়োজনীয় শর্তগুলো পূরণ হয়েছে কি না (অর্থাৎ, ব্যবহারকারীর একটি পজিটিভ ETH ব্যালেন্স আছে) এবং ট্রানজ্যাকশনের ইফেক্টগুলো প্রয়োগ করার আগে (অর্থাৎ, ব্যবহারকারীর ব্যালেন্স কমানো) কলারের ঠিকানায় ETH পাঠিয়ে ইন্টারঅ্যাকশন সম্পাদন করে।

যদি withdraw() একটি এক্সটার্নালি ওনড অ্যাকাউন্ট (EOA) থেকে কল করা হয়, তবে ফাংশনটি প্রত্যাশা অনুযায়ী কাজ করে: msg.sender.call.value() কলারকে ETH পাঠায়। তবে, যদি msg.sender একটি স্মার্ট কন্ট্রাক্ট অ্যাকাউন্ট হয় যা withdraw() কল করে, তবে msg.sender.call.value() ব্যবহার করে ফান্ড পাঠানো হলে সেই ঠিকানায় সংরক্ষিত কোডটিও রান করার জন্য ট্রিগার হবে।

কল্পনা করুন এটি কন্ট্রাক্টের ঠিকানায় ডিপ্লয়মেন্ট করা কোড:

এই কন্ট্রাক্টটি তিনটি কাজ করার জন্য ডিজাইন করা হয়েছে:

  1. অন্য একটি অ্যাকাউন্ট থেকে জমা গ্রহণ করা (সম্ভবত আক্রমণকারীর EOA)
  2. Victim কন্ট্রাক্টে 1 ETH জমা করা
  3. স্মার্ট কন্ট্রাক্টে সংরক্ষিত 1 ETH উত্তোলন করা

এখানে কোনো ভুল নেই, তবে Attacker এর আরেকটি ফাংশন আছে যা ইনকামিং msg.sender.call.value থেকে অবশিষ্ট গ্যাস 40,000 এর বেশি হলে Victim এর withdraw() কে আবার কল করে। এটি Attacker কে Victim এ পুনরায় প্রবেশ করার এবং withdraw এর প্রথম ইনভোকেশন সম্পূর্ণ হওয়ার আগেই আরও ফান্ড উত্তোলন করার ক্ষমতা দেয়। চক্রটি দেখতে এরকম:

সারসংক্ষেপ হলো, যেহেতু ফাংশন এক্সিকিউশন সম্পূর্ণ না হওয়া পর্যন্ত কলারের ব্যালেন্স 0 এ সেট করা হয় না, তাই পরবর্তী ইনভোকেশনগুলো সফল হবে এবং কলারকে একাধিকবার তাদের ব্যালেন্স উত্তোলন করার অনুমতি দেবে। এই ধরনের আক্রমণ একটি স্মার্ট কন্ট্রাক্টের ফান্ড খালি করতে ব্যবহার করা যেতে পারে, যেমনটি 2016 সালের DAO হ্যাক (নতুন ট্যাবে খোলে)-এ ঘটেছিল। রিএন্ট্রান্সি আক্রমণগুলো আজও স্মার্ট কন্ট্রাক্টগুলোর জন্য একটি গুরুতর সমস্যা, যেমনটি রিএন্ট্রান্সি এক্সপ্লয়েটগুলোর পাবলিক তালিকা (নতুন ট্যাবে খোলে) দেখায়।

কীভাবে রিএন্ট্রান্সি আক্রমণ প্রতিরোধ করবেন

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

নিচে দেখানো Victim কন্ট্রাক্টের একটি সংশোধিত সংস্করণে চেকস-ইফেক্টস-ইন্টারঅ্যাকশনস প্যাটার্ন ব্যবহার করা হয়েছে:

contract NoLongerAVictim {
    function withdraw() external {
        uint256 amount = balances[msg.sender];
        balances[msg.sender] = 0;
        (bool success, ) = msg.sender.call.value(amount)("");
        require(success);
    }
}

এই কন্ট্রাক্টটি ব্যবহারকারীর ব্যালেন্সের ওপর একটি চেক সম্পাদন করে, withdraw() ফাংশনের ইফেক্টগুলো প্রয়োগ করে (ব্যবহারকারীর ব্যালেন্স 0 এ রিসেট করে) এবং ইন্টারঅ্যাকশন সম্পাদন করতে এগিয়ে যায় (ব্যবহারকারীর ঠিকানায় ETH পাঠানো)। এটি নিশ্চিত করে যে কন্ট্রাক্টটি এক্সটার্নাল কলের আগে তার স্টোরেজ আপডেট করে, যা প্রথম আক্রমণটিকে সক্ষম করা রি-এন্ট্রান্সি শর্তটি দূর করে। Attacker কন্ট্রাক্টটি এখনও NoLongerAVictim এ কল ব্যাক করতে পারে, তবে যেহেতু balances[msg.sender] 0 এ সেট করা হয়েছে, তাই অতিরিক্ত উত্তোলনগুলো একটি ত্রুটি দেখাবে।

আরেকটি বিকল্প হলো একটি মিউচুয়াল এক্সক্লুশন লক (সাধারণত "মিউটেক্স" হিসেবে পরিচিত) ব্যবহার করা যা একটি ফাংশন ইনভোকেশন সম্পূর্ণ না হওয়া পর্যন্ত কন্ট্রাক্টের স্টেটের একটি অংশ লক করে রাখে। এটি একটি বুলিয়ান ভেরিয়েবল ব্যবহার করে প্রয়োগ করা হয় যা ফাংশনটি কার্যকর হওয়ার আগে true এ সেট করা হয় এবং ইনভোকেশন সম্পন্ন হওয়ার পরে false এ রিভার্ট হয়। নিচের উদাহরণে যেমন দেখা যাচ্ছে, একটি মিউটেক্স ব্যবহার করা একটি ফাংশনকে রিকার্সিভ কলের বিরুদ্ধে রক্ষা করে যখন মূল ইনভোকেশনটি এখনও প্রক্রিয়াধীন থাকে, যা কার্যকরভাবে রিএন্ট্রান্সি বন্ধ করে।

আপনি একটি পুল পেমেন্টস (নতুন ট্যাবে খোলে) (pull payments) সিস্টেমও ব্যবহার করতে পারেন যার জন্য ব্যবহারকারীদের স্মার্ট কন্ট্রাক্টগুলো থেকে ফান্ড উত্তোলন করতে হয়, একটি "পুশ পেমেন্টস" (push payments) সিস্টেমের পরিবর্তে যা অ্যাকাউন্টগুলোতে ফান্ড পাঠায়। এটি অজানা ঠিকানাগুলোতে অসাবধানতাবশত কোড ট্রিগার করার সম্ভাবনা দূর করে (এবং নির্দিষ্ট ডিনায়াল-অফ-সার্ভিস আক্রমণগুলোও প্রতিরোধ করতে পারে)।

ইন্টিজার আন্ডারফ্লো এবং ওভারফ্লো

একটি ইন্টিজার ওভারফ্লো তখন ঘটে যখন একটি গাণিতিক অপারেশনের ফলাফল গ্রহণযোগ্য মানের সীমার বাইরে চলে যায়, যার ফলে এটি সর্বনিম্ন উপস্থাপনযোগ্য মানে "রোল ওভার" (roll over) করে। উদাহরণস্বরূপ, একটি uint8 শুধুমাত্র 2^8-1=255 পর্যন্ত মান সংরক্ষণ করতে পারে। গাণিতিক অপারেশনগুলোর ফলাফল 255 এর চেয়ে বেশি হলে তা ওভারফ্লো হবে এবং uint কে 0 এ রিসেট করবে, ঠিক যেমন একটি গাড়ির ওডোমিটার সর্বোচ্চ মাইলেজে (999999) পৌঁছানোর পর 0 এ রিসেট হয়।

ইন্টিজার আন্ডারফ্লো একই কারণে ঘটে: একটি গাণিতিক অপারেশনের ফলাফল গ্রহণযোগ্য সীমার নিচে নেমে যায়। ধরা যাক আপনি একটি uint80 কমানোর চেষ্টা করেছেন, ফলাফলটি কেবল সর্বোচ্চ উপস্থাপনযোগ্য মানে (255) রোল ওভার করবে।

ইন্টিজার ওভারফ্লো এবং আন্ডারফ্লো উভয়ই একটি কন্ট্রাক্টের স্টেট ভেরিয়েবলগুলোতে অপ্রত্যাশিত পরিবর্তন আনতে পারে এবং অপরিকল্পিত এক্সিকিউশনের কারণ হতে পারে। নিচে একটি উদাহরণ দেওয়া হলো যা দেখায় কীভাবে একজন আক্রমণকারী একটি অবৈধ অপারেশন সম্পাদন করতে স্মার্ট কন্ট্রাক্টে গাণিতিক ওভারফ্লোকে কাজে লাগাতে পারে:

কীভাবে ইন্টিজার আন্ডারফ্লো এবং ওভারফ্লো প্রতিরোধ করবেন

0.8.0 সংস্করণ থেকে, Solidity কম্পাইলার এমন কোড প্রত্যাখ্যান করে যার ফলে ইন্টিজার আন্ডারফ্লো এবং ওভারফ্লো হয়। তবে, নিম্ন কম্পাইলার সংস্করণ দিয়ে কম্পাইল করা কন্ট্রাক্টগুলোর গাণিতিক অপারেশন জড়িত ফাংশনগুলোতে চেক করা উচিত অথবা এমন একটি লাইব্রেরি (যেমন, SafeMath (নতুন ট্যাবে খোলে)) ব্যবহার করা উচিত যা আন্ডারফ্লো/ওভারফ্লো চেক করে।

ওরাকল ম্যানিপুলেশন

ওরাকল অফচেইন তথ্যের উৎস হিসেবে কাজ করে এবং স্মার্ট কন্ট্রাক্টগুলোর ব্যবহারের জন্য এটি অনচেইনে পাঠায়। ওরাকলের সাহায্যে, আপনি এমন স্মার্ট কন্ট্রাক্ট ডিজাইন করতে পারেন যা অফচেইন সিস্টেমগুলোর সাথে ইন্টারঅপারেট করে, যেমন ক্যাপিটাল মার্কেট, যা এদের প্রয়োগকে ব্যাপকভাবে প্রসারিত করে।

তবে যদি ওরাকলটি দূষিত হয় এবং অনচেইনে ভুল তথ্য পাঠায়, তবে স্মার্ট কন্ট্রাক্টগুলো ভুল ইনপুটের ওপর ভিত্তি করে কার্যকর হবে, যা সমস্যার কারণ হতে পারে। এটি হলো “ওরাকল সমস্যা”-এর ভিত্তি, যা একটি ব্লকচেইন ওরাকল থেকে আসা তথ্য সঠিক, আপ-টু-ডেট এবং সময়োপযোগী কিনা তা নিশ্চিত করার কাজের সাথে সম্পর্কিত।

একটি সম্পর্কিত নিরাপত্তা উদ্বেগ হলো কোনো সম্পদের স্পট প্রাইস (spot price) পেতে একটি অনচেইন ওরাকল ব্যবহার করা, যেমন একটি বিকেন্দ্রীকৃত এক্সচেঞ্জ। বিকেন্দ্রীভূত অর্থব্যবস্থা (DeFi) ইন্ডাস্ট্রির ঋণ প্রদান প্ল্যাটফর্মগুলো প্রায়ই ব্যবহারকারীর জামানতের মূল্য নির্ধারণ করতে এটি করে থাকে, যাতে তারা কত টাকা ধার করতে পারে তা নির্ধারণ করা যায়।

DEX এর দামগুলো প্রায়ই সঠিক হয়, মূলত আরবিট্রেজারদের (arbitrageurs) বাজারে সমতা ফিরিয়ে আনার কারণে। তবে, এগুলো ম্যানিপুলেশনের জন্য উন্মুক্ত, বিশেষ করে যদি অনচেইন ওরাকল ঐতিহাসিক ট্রেডিং প্যাটার্নের ওপর ভিত্তি করে সম্পদের দাম গণনা করে (যেমনটি সাধারণত হয়)।

উদাহরণস্বরূপ, একজন আক্রমণকারী আপনার ঋণ প্রদান কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করার ঠিক আগে একটি ফ্ল্যাশ লোন নিয়ে কৃত্রিমভাবে কোনো সম্পদের স্পট প্রাইস বাড়িয়ে দিতে পারে। সম্পদের দামের জন্য DEX-এ কোয়েরি করলে স্বাভাবিকের চেয়ে বেশি মান পাওয়া যাবে (আক্রমণকারীর বড় “বাই অর্ডার” সম্পদের চাহিদাকে বিকৃত করার কারণে), যা তাদের উচিতের চেয়ে বেশি ধার করার অনুমতি দেয়। এই ধরনের "ফ্ল্যাশ লোন আক্রমণ" DeFi অ্যাপ্লিকেশনগুলোর মধ্যে প্রাইস ওরাকলের ওপর নির্ভরতাকে কাজে লাগাতে ব্যবহার করা হয়েছে, যার ফলে প্রোটোকলগুলোর লক্ষ লক্ষ টাকার ফান্ড নষ্ট হয়েছে।

কীভাবে ওরাকল ম্যানিপুলেশন প্রতিরোধ করবেন

ওরাকল ম্যানিপুলেশন এড়ানোর (নতুন ট্যাবে খোলে) ন্যূনতম প্রয়োজনীয়তা হলো একটি বিকেন্দ্রীকৃত ওরাকল নেটওয়ার্ক ব্যবহার করা যা সিঙ্গেল পয়েন্ট অফ ফেইলিওর এড়াতে একাধিক উৎস থেকে তথ্য কোয়েরি করে। বেশিরভাগ ক্ষেত্রে, বিকেন্দ্রীকৃত ওরাকলগুলোতে ওরাকল নোডগুলোকে সঠিক তথ্য রিপোর্ট করতে উৎসাহিত করার জন্য বিল্ট-ইন ক্রিপ্টোইকোনমিক প্রণোদনা থাকে, যা এগুলোকে কেন্দ্রীভূত ওরাকলগুলোর চেয়ে বেশি নিরাপদ করে তোলে।

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

ডেভেলপারদের জন্য স্মার্ট কন্ট্রাক্ট সিকিউরিটি রিসোর্স

স্মার্ট কন্ট্রাক্ট বিশ্লেষণ এবং কোডের সঠিকতা যাচাই করার টুল

  • টেস্টিং টুল এবং লাইব্রেরি - স্মার্ট কন্ট্রাক্টে ইউনিট টেস্ট, স্ট্যাটিক অ্যানালাইসিস এবং ডায়নামিক অ্যানালাইসিস করার জন্য ইন্ডাস্ট্রি-স্ট্যান্ডার্ড টুল এবং লাইব্রেরির সংগ্রহ।

  • বিধিবদ্ধ যাচাইকরণ টুল - স্মার্ট কন্ট্রাক্টের কার্যকারিতার সঠিকতা যাচাই এবং ইনভ্যারিয়েন্ট চেক করার টুল।

  • স্মার্ট কন্ট্রাক্ট অডিটিং পরিষেবা - ইথেরিয়াম ডেভেলপমেন্ট প্রজেক্টের জন্য স্মার্ট কন্ট্রাক্ট অডিটিং পরিষেবা প্রদানকারী সংস্থাগুলোর তালিকা।

  • বাগ বাউন্টি প্ল্যাটফর্ম - বাগ বাউন্টি সমন্বয় এবং স্মার্ট কন্ট্রাক্টের জটিল দুর্বলতাগুলো দায়িত্বশীলভাবে প্রকাশ করার জন্য পুরস্কৃত করার প্ল্যাটফর্ম।

  • Fork Checker (নতুন ট্যাবে খোলে) - ফর্ক করা কন্ট্রাক্ট সম্পর্কিত সমস্ত উপলব্ধ তথ্য চেক করার জন্য একটি বিনামূল্যের অনলাইন টুল।

  • ABI Encoder (নতুন ট্যাবে খোলে) - আপনার Solidity কন্ট্রাক্ট ফাংশন এবং কনস্ট্রাক্টর আর্গুমেন্ট এনকোড করার জন্য একটি বিনামূল্যের অনলাইন পরিষেবা।

  • Aderyn (নতুন ট্যাবে খোলে) - Solidity স্ট্যাটিক অ্যানালাইজার, যা সন্দেহভাজন দুর্বলতাগুলো চিহ্নিত করতে অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (AST) ট্রাভার্স করে এবং সহজে ব্যবহারযোগ্য মার্কডাউন ফর্ম্যাটে সমস্যাগুলো প্রিন্ট করে।

স্মার্ট কন্ট্রাক্ট মনিটর করার টুল

স্মার্ট কন্ট্রাক্টের নিরাপদ পরিচালনার টুল

  • Safe (নতুন ট্যাবে খোলে) - ইথেরিয়ামে চলা স্মার্ট কন্ট্রাক্ট ওয়ালেট, যেখানে কোনো ট্রানজ্যাকশন সম্পন্ন হওয়ার আগে ন্যূনতম সংখ্যক মানুষের অনুমোদন প্রয়োজন হয় (M-of-N)।

  • ওপেনজেপেলিন কন্ট্রাক্টস (নতুন ট্যাবে খোলে) - কন্ট্রাক্টের মালিকানা, আপগ্রেড, অ্যাক্সেস কন্ট্রোল, গভর্ন্যান্স, পজ করার ক্ষমতাসহ অন্যান্য প্রশাসনিক বৈশিষ্ট্য বাস্তবায়নের জন্য কন্ট্রাক্ট লাইব্রেরি।

স্মার্ট কন্ট্রাক্ট অডিটিং পরিষেবা

  • ConsenSys Diligence (নতুন ট্যাবে খোলে) - স্মার্ট কন্ট্রাক্ট অডিটিং পরিষেবা, যা ব্লকচেইন ইকোসিস্টেমের প্রজেক্টগুলোকে তাদের প্রোটোকল লঞ্চের জন্য প্রস্তুত করতে এবং ব্যবহারকারীদের সুরক্ষার জন্য তৈরি করা হয়েছে তা নিশ্চিত করতে সাহায্য করে।

  • CertiK (নতুন ট্যাবে খোলে) - ব্লকচেইন সিকিউরিটি ফার্ম, যা স্মার্ট কন্ট্রাক্ট এবং ব্লকচেইন নেটওয়ার্কে অত্যাধুনিক বিধিবদ্ধ যাচাইকরণ প্রযুক্তির ব্যবহারে অগ্রণী ভূমিকা পালন করছে।

  • Trail of Bits (নতুন ট্যাবে খোলে) - সাইবার সিকিউরিটি কোম্পানি, যা ঝুঁকি কমাতে এবং কোডকে শক্তিশালী করতে আক্রমণকারীর মানসিকতার সাথে সিকিউরিটি গবেষণার সমন্বয় করে।

  • PeckShield (নতুন ট্যাবে খোলে) - ব্লকচেইন সিকিউরিটি কোম্পানি, যা সম্পূর্ণ ব্লকচেইন ইকোসিস্টেমের নিরাপত্তা, গোপনীয়তা এবং ব্যবহারযোগ্যতার জন্য পণ্য ও পরিষেবা প্রদান করে।

  • QuantStamp (নতুন ট্যাবে খোলে) - অডিটিং পরিষেবা, যা নিরাপত্তা এবং ঝুঁকি মূল্যায়ন পরিষেবার মাধ্যমে ব্লকচেইন প্রযুক্তির মূলধারায় গ্রহণকে সহজতর করে।

  • ওপেনজেপেলিন (নতুন ট্যাবে খোলে) - স্মার্ট কন্ট্রাক্ট সিকিউরিটি কোম্পানি, যা ডিস্ট্রিবিউটেড সিস্টেমের জন্য সিকিউরিটি অডিট প্রদান করে।

  • Runtime Verification (নতুন ট্যাবে খোলে) - সিকিউরিটি কোম্পানি, যা স্মার্ট কন্ট্রাক্টের ফর্মাল মডেলিং এবং যাচাইকরণে বিশেষজ্ঞ।

  • Hacken (নতুন ট্যাবে খোলে) - Web3 সাইবার সিকিউরিটি অডিটর, যা ব্লকচেইন নিরাপত্তায় 360-ডিগ্রি পদ্ধতি নিয়ে আসে।

  • নেদারমাইন্ড (নতুন ট্যাবে খোলে) - Solidity এবং Cairo অডিটিং পরিষেবা, যা ইথেরিয়াম এবং Starknet জুড়ে স্মার্ট কন্ট্রাক্টের অখণ্ডতা এবং ব্যবহারকারীদের নিরাপত্তা নিশ্চিত করে।

  • HashEx (নতুন ট্যাবে খোলে) - HashEx ক্রিপ্টোকারেন্সির নিরাপত্তা নিশ্চিত করতে ব্লকচেইন এবং স্মার্ট কন্ট্রাক্ট অডিটিংয়ের ওপর ফোকাস করে, যা স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট, পেনিট্রেশন টেস্টিং, ব্লকচেইন কনসাল্টিংয়ের মতো পরিষেবা প্রদান করে।

  • Code4rena (নতুন ট্যাবে খোলে) - প্রতিযোগিতামূলক অডিট প্ল্যাটফর্ম, যা স্মার্ট কন্ট্রাক্ট সিকিউরিটি বিশেষজ্ঞদের দুর্বলতা খুঁজে বের করতে এবং Web3-কে আরও সুরক্ষিত করতে সাহায্য করার জন্য উৎসাহিত করে।

  • CodeHawks (নতুন ট্যাবে খোলে) - প্রতিযোগিতামূলক অডিট প্ল্যাটফর্ম, যা সিকিউরিটি গবেষকদের জন্য স্মার্ট কন্ট্রাক্ট অডিটিং প্রতিযোগিতার আয়োজন করে।

  • Cyfrin (নতুন ট্যাবে খোলে) - Web3 সিকিউরিটি পাওয়ারহাউস, যা বিভিন্ন পণ্য এবং স্মার্ট কন্ট্রাক্ট অডিটিং পরিষেবার মাধ্যমে ক্রিপ্টো সিকিউরিটিকে ইনকিউবেট করে।

  • ImmuneBytes (নতুন ট্যাবে খোলে) - Web3 সিকিউরিটি ফার্ম, যা অভিজ্ঞ অডিটরদের একটি দল এবং সেরা টুলগুলোর মাধ্যমে ব্লকচেইন সিস্টেমের জন্য সিকিউরিটি অডিট অফার করে।

  • Oxorio (নতুন ট্যাবে খোলে) - ক্রিপ্টো ফার্ম এবং বিকেন্দ্রীভূত অর্থব্যবস্থা (DeFi) প্রজেক্টের জন্য EVM, Solidity, ZK, ক্রস-চেইন প্রযুক্তিতে দক্ষতাসম্পন্ন স্মার্ট কন্ট্রাক্ট অডিট এবং ব্লকচেইন সিকিউরিটি পরিষেবা।

  • Inference (নতুন ট্যাবে খোলে) - সিকিউরিটি অডিটিং কোম্পানি, যা EVM-ভিত্তিক ব্লকচেইনগুলোর স্মার্ট কন্ট্রাক্ট অডিটিংয়ে বিশেষজ্ঞ। এর বিশেষজ্ঞ অডিটরদের কারণে তারা সম্ভাব্য সমস্যাগুলো চিহ্নিত করে এবং ডিপ্লয়মেন্টের আগে সেগুলো সমাধানের জন্য কার্যকর পরামর্শ দেয়।

বাগ বাউন্টি প্ল্যাটফর্ম

  • Immunefi (নতুন ট্যাবে খোলে) - স্মার্ট কন্ট্রাক্ট এবং বিকেন্দ্রীভূত অর্থব্যবস্থা (DeFi) প্রজেক্টের জন্য বাগ বাউন্টি প্ল্যাটফর্ম, যেখানে সিকিউরিটি গবেষকরা কোড পর্যালোচনা করেন, দুর্বলতা প্রকাশ করেন, অর্থ পান এবং ক্রিপ্টোকে আরও নিরাপদ করেন।

  • HackerOne (নতুন ট্যাবে খোলে) - দুর্বলতা সমন্বয় এবং বাগ বাউন্টি প্ল্যাটফর্ম, যা পেনিট্রেশন টেস্টার এবং সাইবার সিকিউরিটি গবেষকদের সাথে ব্যবসাগুলোকে সংযুক্ত করে।

  • HackenProof (নতুন ট্যাবে খোলে) - ক্রিপ্টো প্রজেক্টের (DeFi, স্মার্ট কন্ট্রাক্ট, ওয়ালেট, CEX এবং আরও অনেক কিছু) জন্য বিশেষজ্ঞ বাগ বাউন্টি প্ল্যাটফর্ম, যেখানে সিকিউরিটি পেশাদাররা ট্রায়াজ পরিষেবা প্রদান করেন এবং গবেষকরা প্রাসঙ্গিক, যাচাইকৃত বাগ রিপোর্টের জন্য অর্থ পান।

  • Sherlock (নতুন ট্যাবে খোলে) - স্মার্ট কন্ট্রাক্ট সিকিউরিটির জন্য Web3-তে আন্ডাররাইটার, যেখানে প্রাসঙ্গিক বাগগুলোর জন্য ন্যায্য অর্থ প্রদান নিশ্চিত করতে স্মার্ট কন্ট্রাক্টের মাধ্যমে অডিটরদের পেআউট পরিচালনা করা হয়।

  • CodeHawks (নতুন ট্যাবে খোলে) - প্রতিযোগিতামূলক বাগ বাউন্টি প্ল্যাটফর্ম, যেখানে অডিটররা সিকিউরিটি প্রতিযোগিতা এবং চ্যালেঞ্জে অংশ নেন এবং (শীঘ্রই) তাদের নিজস্ব প্রাইভেট অডিটেও অংশ নেবেন।

পরিচিত স্মার্ট কন্ট্রাক্ট দুর্বলতা এবং এক্সপ্লয়েটের প্রকাশনা

স্মার্ট কন্ট্রাক্ট সিকিউরিটি শেখার চ্যালেঞ্জ

স্মার্ট কন্ট্রাক্ট সুরক্ষিত করার সর্বোত্তম অনুশীলন

স্মার্ট কন্ট্রাক্ট সিকিউরিটির ওপর টিউটোরিয়াল