স্মার্ট কন্ট্রাক্ট নিরাপত্তা নির্দেশিকা
আরও নিরাপদ স্মার্ট কন্ট্রাক্ট তৈরি করতে এই উচ্চ-স্তরের সুপারিশগুলো অনুসরণ করুন।
ডিজাইন নির্দেশিকা
কোডের কোনো লাইন লেখার আগে, কন্ট্রাক্টের ডিজাইন নিয়ে আগে থেকেই আলোচনা করা উচিত।
ডকুমেন্টেশন এবং স্পেসিফিকেশন
ডোকুমেন্টেশন বিভিন্ন স্তরে লেখা যেতে পারে, এবং কন্ট্রাক্টগুলো বাস্তবায়নের সময় এটি আপডেট করা উচিত:
- সিস্টেমের একটি সাধারণ ইংরেজি বর্ণনা, যেখানে কন্ট্রাক্টগুলো কী করে এবং কোডবেসের উপর কোনো অনুমান থাকলে তা বর্ণনা করা হয়।
- স্কিমা এবং আর্কিটেকচারাল ডায়াগ্রাম, যার মধ্যে কন্ট্রাক্টের মিথস্ক্রিয়া এবং সিস্টেমের স্টেট মেশিন অন্তর্ভুক্ত। Slither printers (opens in a new tab) এই স্কিমাগুলো তৈরি করতে সাহায্য করতে পারে।
- পুঙ্খানুপুঙ্খ কোড ডকুমেন্টেশন, Solidity-এর জন্য Natspec format (opens in a new tab) ব্যবহার করা যেতে পারে।
অনচেইন বনাম অফচেইন কম্পিউটেশন
- যতটা সম্ভব কোড অফচেইন রাখুন। অনচেইন লেয়ারটি ছোট রাখুন। অফচেইন কোড দিয়ে ডেটা এমনভাবে প্রি-প্রসেস করুন যাতে অনচেইন যাচাইকরণ সহজ হয়। আপনার কি একটি সাজানো তালিকা দরকার? তালিকাটি অফচেইন সাজান, তারপর শুধুমাত্র অনচেইন এর ক্রম পরীক্ষা করুন।
আপগ্রেডযোগ্যতা
আমরা আমাদের ব্লগপোস্টে (opens in a new tab) বিভিন্ন আপগ্রেডযোগ্যতা সমাধান নিয়ে আলোচনা করেছি। কোনো কোড লেখার আগে আপগ্রেডযোগ্যতা সমর্থন করবেন কি না, সে বিষয়ে একটি সুচিন্তিত সিদ্ধান্ত নিন। এই সিদ্ধান্তটি আপনার কোডের কাঠামোকে প্রভাবিত করবে। সাধারণভাবে, আমরা সুপারিশ করি:
- আপগ্রেডযোগ্যতার চেয়ে কন্ট্রাক্ট মাইগ্রেশন (opens in a new tab)-কে অগ্রাধিকার দিন। মাইগ্রেশন সিস্টেমগুলোর অনেক সুবিধা আপগ্রেডযোগ্য সিস্টেমের মতোই, তবে এগুলোর কোনো ত্রুটি নেই।
- delegatecallproxy-এর চেয়ে ডেটা সেপারেশন প্যাটার্ন ব্যবহার করুন। যদি আপনার প্রজেক্টে একটি স্পষ্ট অ্যাবস্ট্রাকশন সেপারেশন থাকে, তবে ডেটা সেপারেশন ব্যবহার করে আপগ্রেডযোগ্যতার জন্য শুধুমাত্র কয়েকটি সমন্বয় প্রয়োজন হবে। delegatecallproxy-এর জন্য EVM দক্ষতার প্রয়োজন এবং এটি অত্যন্ত ত্রুটিপ্রবণ।
- ডিপ্লয়মেন্টের আগে মাইগ্রেশন/আপগ্রেড পদ্ধতি ডকুমেন্ট করুন। যদি আপনাকে কোনো নির্দেশিকা ছাড়াই চাপের মধ্যে কাজ করতে হয়, তবে আপনি ভুল করবেন। আগে থেকেই অনুসরণ করার পদ্ধতি লিখে রাখুন। এর মধ্যে অন্তর্ভুক্ত থাকা উচিত:
- নতুন কন্ট্রাক্টগুলো শুরু করার কলগুলো
- কি (keys) কোথায় সংরক্ষিত আছে এবং কীভাবে সেগুলো অ্যাক্সেস করতে হবে
- কীভাবে ডিপ্লয়মেন্ট পরীক্ষা করতে হবে! একটি পোস্ট-ডিপ্লয়মেন্ট স্ক্রিপ্ট তৈরি এবং পরীক্ষা করুন।
বাস্তবায়ন নির্দেশিকা
সরলতার জন্য চেষ্টা করুন। সর্বদা আপনার উদ্দেশ্যের সাথে মানানসই সবচেয়ে সহজ সমাধানটি ব্যবহার করুন। আপনার টিমের যেকোনো সদস্যের আপনার সমাধানটি বুঝতে পারা উচিত।
ফাংশন কম্পোজিশন
আপনার কোডবেসের আর্কিটেকচার এমন হওয়া উচিত যাতে আপনার কোডটি রিভিউ করা সহজ হয়। এমন আর্কিটেকচারাল পছন্দগুলো এড়িয়ে চলুন যা এর সঠিকতা সম্পর্কে যুক্তি দেওয়ার ক্ষমতা হ্রাস করে।
- আপনার সিস্টেমের লজিক বিভক্ত করুন, হয় একাধিক কন্ট্রাক্টের মাধ্যমে অথবা একই ধরনের ফাংশনগুলোকে একসাথে গ্রুপ করে (উদাহরণস্বরূপ, প্রমাণীকরণ, পাটিগণিত, ...)।
- একটি স্পষ্ট উদ্দেশ্য নিয়ে ছোট ফাংশন লিখুন। এটি সহজে রিভিউ করতে সহায়তা করবে এবং পৃথক উপাদানগুলোর টেস্টিং করার অনুমতি দেবে।
ইনহেরিটেন্স
- ইনহেরিটেন্স পরিচালনাযোগ্য রাখুন। লজিক ভাগ করার জন্য ইনহেরিটেন্স ব্যবহার করা উচিত, তবে আপনার প্রজেক্টের লক্ষ্য হওয়া উচিত ইনহেরিটেন্স ট্রির গভীরতা এবং প্রস্থ কমানো।
- কন্ট্রাক্টগুলোর হায়ারার্কি পরীক্ষা করতে Slither-এর inheritance printer (opens in a new tab) ব্যবহার করুন। ইনহেরিটেন্স প্রিন্টার আপনাকে হায়ারার্কির আকার রিভিউ করতে সাহায্য করবে।
ইভেন্ট
- সব গুরুত্বপূর্ণ অপারেশন লগ করুন। ইভেন্টগুলো ডেভেলপমেন্টের সময় কন্ট্রাক্ট ডিবাগ করতে এবং ডিপ্লয়মেন্টের পরে এটি পর্যবেক্ষণ করতে সাহায্য করবে।
পরিচিত ফাঁদগুলো এড়িয়ে চলুন
- সবচেয়ে সাধারণ নিরাপত্তা সমস্যাগুলো সম্পর্কে সচেতন থাকুন। সাধারণ সমস্যাগুলো সম্পর্কে জানার জন্য অনলাইনে অনেক রিসোর্স রয়েছে, যেমন Ethernaut CTF (opens in a new tab), Capture the Ether (opens in a new tab), অথবা Not so smart contracts (opens in a new tab)।
- Solidity documentation (opens in a new tab)-এর সতর্কীকরণ বিভাগগুলো সম্পর্কে সচেতন থাকুন। সতর্কীকরণ বিভাগগুলো আপনাকে ভাষার অস্পষ্ট আচরণ সম্পর্কে অবহিত করবে।
ডিপেন্ডেন্সি
- সু-পরীক্ষিত লাইব্রেরি ব্যবহার করুন। সু-পরীক্ষিত লাইব্রেরি থেকে কোড ইমপোর্ট করলে আপনার বাগযুক্ত কোড লেখার সম্ভাবনা কমে যাবে। আপনি যদি একটি ERC20 কন্ট্রাক্ট লিখতে চান, তবে OpenZeppelin (opens in a new tab) ব্যবহার করুন।
- একটি ডিপেন্ডেন্সি ম্যানেজার ব্যবহার করুন; কোড কপি-পেস্ট করা এড়িয়ে চলুন। আপনি যদি কোনো বাহ্যিক উৎসের ওপর নির্ভর করেন, তবে আপনাকে অবশ্যই মূল উৎসের সাথে এটি আপ-টু-ডেট রাখতে হবে।
টেস্টিং এবং ভেরিফিকেশন
- পুঙ্খানুপুঙ্খ ইউনিট-টেস্ট লিখুন। উচ্চ-মানের সফটওয়্যার তৈরি করার জন্য একটি বিস্তৃত টেস্ট স্যুট অত্যন্ত গুরুত্বপূর্ণ।
- Slither (opens in a new tab), Echidna (opens in a new tab) এবং Manticore (opens in a new tab) কাস্টম চেক এবং প্রপার্টি লিখুন। স্বয়ংক্রিয় টুলগুলো আপনার কন্ট্রাক্ট নিরাপদ কিনা তা নিশ্চিত করতে সাহায্য করবে। কীভাবে কার্যকর চেক এবং প্রপার্টি লিখতে হয় তা জানতে এই গাইডের বাকি অংশটি রিভিউ করুন।
- crytic.io (opens in a new tab) ব্যবহার করুন। Crytic গিটহাবের (GitHub) সাথে একীভূত হয়, ব্যক্তিগত Slither ডিটেক্টরগুলোতে অ্যাক্সেস প্রদান করে এবং Echidna থেকে কাস্টম প্রপার্টি চেক চালায়।
Solidity
- 0.4 এবং 0.6 এর চেয়ে Solidity 0.5 কে অগ্রাধিকার দিন। আমাদের মতে, Solidity 0.5 আরও নিরাপদ এবং 0.4 এর চেয়ে ভালো বিল্ট-ইন প্র্যাকটিস রয়েছে। Solidity 0.6 প্রোডাকশনের জন্য খুব অস্থিতিশীল প্রমাণিত হয়েছে এবং পরিপক্ক হওয়ার জন্য সময়ের প্রয়োজন।
- কম্পাইল করার জন্য একটি স্থিতিশীল রিলিজ ব্যবহার করুন; সতর্কীকরণ পরীক্ষা করার জন্য সর্বশেষ রিলিজ ব্যবহার করুন। পরীক্ষা করুন যে সর্বশেষ কম্পাইলার সংস্করণের সাথে আপনার কোডে কোনো রিপোর্ট করা সমস্যা নেই। তবে, Solidity-এর একটি দ্রুত রিলিজ চক্র রয়েছে এবং কম্পাইলার বাগের ইতিহাস রয়েছে, তাই আমরা ডিপ্লয়মেন্টের জন্য সর্বশেষ সংস্করণের সুপারিশ করি না (Slither-এর solc version recommendation (opens in a new tab) দেখুন)।
- ইনলাইন অ্যাসেম্বলি ব্যবহার করবেন না। অ্যাসেম্বলির জন্য EVM দক্ষতার প্রয়োজন। আপনি যদি ইয়েলো পেপার (yellow paper) আয়ত্ত না করে থাকেন তবে EVM কোড লিখবেন না।
ডিপ্লয়মেন্ট নির্দেশিকা
একবার কন্ট্রাক্ট তৈরি এবং ডিপ্লয় করা হয়ে গেলে:
- আপনার কন্ট্রাক্টগুলো পর্যবেক্ষণ করুন। লগগুলো দেখুন এবং কন্ট্রাক্ট বা ওয়ালেট কম্প্রোমাইজ হওয়ার ক্ষেত্রে প্রতিক্রিয়া জানাতে প্রস্তুত থাকুন।
- blockchain-security-contacts (opens in a new tab)-এ আপনার যোগাযোগের তথ্য যোগ করুন। কোনো নিরাপত্তা ত্রুটি আবিষ্কৃত হলে এই তালিকাটি তৃতীয় পক্ষকে আপনার সাথে যোগাযোগ করতে সাহায্য করে।
- সুবিধাপ্রাপ্ত ব্যবহারকারীদের ওয়ালেটগুলো সুরক্ষিত করুন। আপনি যদি হার্ডওয়্যার ওয়ালেটে কি (keys) সংরক্ষণ করেন তবে আমাদের সেরা অনুশীলনগুলো (opens in a new tab) অনুসরণ করুন।
- ঘটনার প্রতিক্রিয়ার জন্য একটি পরিকল্পনা রাখুন। বিবেচনা করুন যে আপনার স্মার্ট কন্ট্রাক্টগুলো কম্প্রোমাইজ হতে পারে। এমনকি যদি আপনার কন্ট্রাক্টগুলো বাগ-মুক্ত হয়, তবুও একজন আক্রমণকারী কন্ট্রাক্ট মালিকের কি-গুলোর (keys) নিয়ন্ত্রণ নিতে পারে।
পেজ সর্বশেষ আপডেট: ৩০ সেপ্টেম্বর, ২০২৫