স্মার্ট কন্ট্রাক্ট আপগ্রেড করা
পেজ সর্বশেষ আপডেট: 21 অক্টোবর, 2025
ইথিরিয়ামের স্মার্ট কন্ট্রাক্ট হলো স্বয়ংক্রিয়ভাবে নির্বাহিত প্রোগ্রাম যা ইথিরিয়াম ভার্চুয়াল মেশিন (EVM)-এ রান করে। এই প্রোগ্রামগুলো ডিজাইনগতভাবেই ইমমিউটেবল, যা কন্ট্রাক্ট ডিপ্লয় হওয়ার পর এর বিজনেস লজিকে কোনো আপডেট করা প্রতিরোধ করে।
যদিও স্মার্ট কন্ট্রাক্টের ট্রাস্টলেসনেস, ডিসেন্ট্রালাইজেশন এবং নিরাপত্তার জন্য ইমমিউটেবিলিটি প্রয়োজনীয়, কিছু ক্ষেত্রে এটি একটি অসুবিধাও হতে পারে। উদাহরণস্বরূপ, ইমমিউটেবল কোডের কারণে ডেভেলপারদের পক্ষে দুর্বল বা ত্রুটিপূর্ণ কন্ট্রাক্ট ঠিক করা অসম্ভব হয়ে যেতে পারে।
তবে, স্মার্ট কন্ট্রাক্টের উন্নতির জন্য ক্রমবর্ধমান গবেষণার ফলে বেশ কয়েকটি আপগ্রেড প্যাটার্ন চালু হয়েছে। এই আপগ্রেড প্যাটার্নগুলো ডেভেলপারদের বিভিন্ন কন্ট্রাক্টে বিজনেস লজিক স্থাপন করে (ইমমিউটেবিলিটি বজায় রেখে) স্মার্ট কন্ট্রাক্ট আপগ্রেড করতে সক্ষম করে।
পূর্বশর্ত
আপনার স্মার্ট কন্ট্রাক্ট, স্মার্ট কন্ট্রাক্ট অ্যানাটমি এবং ইথিরিয়াম ভার্চুয়াল মেশিন (EVM) সম্পর্কে ভালো ধারণা থাকা উচিত। এই গাইডটি ধরে নেয় যে পাঠকদের স্মার্ট কন্ট্রাক্ট প্রোগ্রামিং সম্পর্কে ধারণা রয়েছে।
স্মার্ট কন্ট্রাক্ট আপগ্রেড কী?
একটি স্মার্ট কন্ট্রাক্ট আপগ্রেড করার অর্থ হলো কন্ট্রাক্টের স্টেট বজায় রেখে এর বিজনেস লজিক পরিবর্তন করা। এটি স্পষ্ট করা গুরুত্বপূর্ণ যে আপগ্রেডযোগ্যতা (upgradeability) এবং পরিবর্তনযোগ্যতা (mutability) এক নয়, বিশেষ করে স্মার্ট কন্ট্রাক্টের প্রেক্ষাপটে।
আপনি এখনও ইথিরিয়াম নেটওয়ার্ক-এর কোনো এডড্রেস-এ ডিপ্লয় করা প্রোগ্রাম পরিবর্তন করতে পারবেন না। তবে ব্যবহারকারীরা যখন কোনো স্মার্ট কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করে তখন যে কোডটি এক্সিকিউট হয়, তা আপনি পরিবর্তন করতে পারেন।
এটি নিচের পদ্ধতিগুলোর মাধ্যমে করা যেতে পারে:
-
একটি স্মার্ট কন্ট্রাক্টের একাধিক সংস্করণ তৈরি করা এবং পুরানো কন্ট্রাক্ট থেকে নতুন কন্ট্রাক্টে স্টেট (অর্থাৎ, ডেটা) মাইগ্রেট করা।
-
বিজনেস লজিক এবং স্টেট সংরক্ষণের জন্য আলাদা কন্ট্রাক্ট তৈরি করা।
-
একটি ইমমিউটেবল প্রক্সি কন্ট্রাক্ট থেকে পরিবর্তনযোগ্য লজিক কন্ট্রাক্টে ফাংশন কল ডেলিগেট করার জন্য প্রক্সি প্যাটার্ন ব্যবহার করা।
-
একটি ইমমিউটেবল মূল কন্ট্রাক্ট তৈরি করা যা নির্দিষ্ট ফাংশন এক্সিকিউট করার জন্য নমনীয় স্যাটেলাইট কন্ট্রাক্টগুলোর সাথে ইন্টারফেস করে এবং সেগুলোর ওপর নির্ভর করে।
-
প্রক্সি কন্ট্রাক্ট থেকে লজিক কন্ট্রাক্টগুলোতে ফাংশন কল ডেলিগেট করার জন্য ডায়মন্ড প্যাটার্ন ব্যবহার করা।
আপগ্রেড মেকানিজম 1: কন্ট্রাক্ট মাইগ্রেশন
কন্ট্রাক্ট মাইগ্রেশন ভার্সনিংয়ের ওপর ভিত্তি করে কাজ করে—যা একই সফটওয়্যারের ইউনিক স্টেট তৈরি এবং পরিচালনা করার একটি ধারণা। কন্ট্রাক্ট মাইগ্রেশনের মধ্যে বিদ্যমান স্মার্ট কন্ট্রাক্টের একটি নতুন ইনস্ট্যান্স ডিপ্লয় করা এবং নতুন কন্ট্রাক্টে স্টোরেজ ও ব্যালেন্স স্থানান্তর করা অন্তর্ভুক্ত।
নতুন ডিপ্লয় করা কন্ট্রাক্টের স্টোরেজ খালি থাকবে, যা আপনাকে পুরানো কন্ট্রাক্ট থেকে ডেটা রিকভার করে নতুন ইমপ্লিমেন্টেশনে লেখার সুযোগ দেয়। এরপর, নতুন এডড্রেস প্রতিফলিত করার জন্য পুরানো কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করা সমস্ত কন্ট্রাক্ট আপডেট করতে হবে।
কন্ট্রাক্ট মাইগ্রেশনের শেষ ধাপ হলো ব্যবহারকারীদের নতুন কন্ট্রাক্ট ব্যবহারে স্যুইচ করতে রাজি করানো। নতুন কন্ট্রাক্ট সংস্করণটি ব্যবহারকারীর ব্যালেন্স এবং এডড্রেসগুলো ধরে রাখবে, যা ইমমিউটেবিলিটি বজায় রাখে। যদি এটি টোকেন-ভিত্তিক কন্ট্রাক্ট হয়, তবে পুরানো কন্ট্রাক্ট বাতিল করে নতুন কন্ট্রাক্ট ব্যবহার করার জন্য আপনাকে এক্সচেঞ্জগুলোর সাথেও যোগাযোগ করতে হবে।
ব্যবহারকারীদের ইন্টারঅ্যাকশন ব্যাহত না করে স্মার্ট কন্ট্রাক্ট আপগ্রেড করার জন্য কন্ট্রাক্ট মাইগ্রেশন তুলনামূলকভাবে একটি সহজ এবং নিরাপদ উপায়। তবে, ম্যানুয়ালি ব্যবহারকারীর স্টোরেজ এবং ব্যালেন্স নতুন কন্ট্রাক্টে মাইগ্রেট করা সময়সাপেক্ষ এবং এতে উচ্চ গ্যাস খরচ হতে পারে।
কন্ট্রাক্ট মাইগ্রেশন সম্পর্কে আরও জানুন। (opens in a new tab)
আপগ্রেড মেকানিজম 2: ডেটা সেপারেশন
স্মার্ট কন্ট্রাক্ট আপগ্রেড করার আরেকটি পদ্ধতি হলো বিজনেস লজিক এবং ডেটা স্টোরেজকে আলাদা কন্ট্রাক্টে বিভক্ত করা। এর মানে হলো ব্যবহারকারীরা লজিক কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করে, আর ডেটা স্টোরেজ কন্ট্রাক্টে সংরক্ষিত থাকে।
লজিক কন্ট্রাক্টে সেই কোড থাকে যা ব্যবহারকারীরা অ্যাপ্লিকেশনের সাথে ইন্টারঅ্যাক্ট করার সময় এক্সিকিউট হয়। এটি স্টোরেজ কন্ট্রাক্টের এডড্রেসও ধারণ করে এবং ডেটা পেতে ও সেট করতে এর সাথে ইন্টারঅ্যাক্ট করে।
অন্যদিকে, স্টোরেজ কন্ট্রাক্ট স্মার্ট কন্ট্রাক্টের সাথে সম্পর্কিত স্টেট ধারণ করে, যেমন ব্যবহারকারীর ব্যালেন্স এবং এডড্রেস। মনে রাখবেন যে স্টোরেজ কন্ট্রাক্টটি লজিক কন্ট্রাক্টের মালিকানাধীন থাকে এবং ডিপ্লয়মেন্টের সময় লজিক কন্ট্রাক্টের এডড্রেস দিয়ে কনফিগার করা হয়। এটি অননুমোদিত কন্ট্রাক্টগুলোকে স্টোরেজ কন্ট্রাক্ট কল করা বা এর ডেটা আপডেট করা থেকে বিরত রাখে।
ডিফল্টভাবে, স্টোরেজ কন্ট্রাক্ট ইমমিউটেবল—তবে এটি যে লজিক কন্ট্রাক্টকে নির্দেশ করে তা আপনি একটি নতুন ইমপ্লিমেন্টেশন দিয়ে প্রতিস্থাপন করতে পারেন। এটি EVM-এ রান করা কোড পরিবর্তন করবে, কিন্তু স্টোরেজ এবং ব্যালেন্স অক্ষুণ্ণ রাখবে।
এই আপগ্রেড পদ্ধতি ব্যবহার করার জন্য স্টোরেজ কন্ট্রাক্টে লজিক কন্ট্রাক্টের এডড্রেস আপডেট করতে হবে। পূর্বে ব্যাখ্যা করা কারণগুলোর জন্য আপনাকে অবশ্যই নতুন লজিক কন্ট্রাক্টটিকে স্টোরেজ কন্ট্রাক্টের এডড্রেস দিয়ে কনফিগার করতে হবে।
কন্ট্রাক্ট মাইগ্রেশনের তুলনায় ডেটা সেপারেশন প্যাটার্ন বাস্তবায়ন করা তুলনামূলকভাবে সহজ। তবে, আপনাকে একাধিক কন্ট্রাক্ট পরিচালনা করতে হবে এবং ক্ষতিকারক আপগ্রেড থেকে স্মার্ট কন্ট্রাক্টগুলোকে রক্ষা করার জন্য জটিল অথোরাইজেশন স্কিম বাস্তবায়ন করতে হবে।
আপগ্রেড মেকানিজম 3: প্রক্সি প্যাটার্ন
প্রক্সি প্যাটার্নও বিজনেস লজিক এবং ডেটাকে আলাদা কন্ট্রাক্টে রাখার জন্য ডেটা সেপারেশন ব্যবহার করে। তবে, প্রক্সি প্যাটার্নে স্টোরেজ কন্ট্রাক্ট (যাকে প্রক্সি বলা হয়) কোড এক্সিকিউশনের সময় লজিক কন্ট্রাক্টকে কল করে। এটি ডেটা সেপারেশন পদ্ধতির বিপরীত, যেখানে লজিক কন্ট্রাক্ট স্টোরেজ কন্ট্রাক্টকে কল করে।
প্রক্সি প্যাটার্নে যা ঘটে তা হলো:
-
ব্যবহারকারীরা প্রক্সি কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করে, যা ডেটা সংরক্ষণ করে, কিন্তু বিজনেস লজিক ধারণ করে না।
-
প্রক্সি কন্ট্রাক্ট লজিক কন্ট্রাক্টের এডড্রেস সংরক্ষণ করে এবং
delegatecallফাংশন ব্যবহার করে সমস্ত ফাংশন কল লজিক কন্ট্রাক্টে (যা বিজনেস লজিক ধারণ করে) ডেলিগেট করে। -
কলটি লজিক কন্ট্রাক্টে ফরোয়ার্ড করার পর, লজিক কন্ট্রাক্ট থেকে রিটার্ন করা ডেটা পুনরুদ্ধার করে ব্যবহারকারীকে ফেরত দেওয়া হয়।
প্রক্সি প্যাটার্ন ব্যবহার করার জন্য delegatecall ফাংশন সম্পর্কে বোঝা প্রয়োজন। মূলত, delegatecall হলো একটি অপকোড যা একটি কন্ট্রাক্টকে অন্য একটি কন্ট্রাক্ট কল করার অনুমতি দেয়, যেখানে প্রকৃত কোড এক্সিকিউশন কলিং কন্ট্রাক্টের কনটেক্সটে ঘটে। প্রক্সি প্যাটার্নে delegatecall ব্যবহার করার একটি তাৎপর্য হলো যে প্রক্সি কন্ট্রাক্ট তার স্টোরেজে রিড এবং রাইট করে এবং লজিক কন্ট্রাক্টে সংরক্ষিত লজিক এমনভাবে এক্সিকিউট করে যেন এটি একটি ইন্টারনাল ফাংশন কল করছে।
সলিডিটি ডকুমেন্টেশন (opens in a new tab) থেকে:
মেসেজ কলের একটি বিশেষ ভ্যারিয়েন্ট রয়েছে, যার নাম delegatecall, যা মেসেজ কলের মতোই, তবে পার্থক্য হলো টার্গেট এডড্রেসের কোডটি কলিং কন্ট্রাক্টের কনটেক্সটে (অর্থাৎ, এডড্রেসে) এক্সিকিউট হয় এবং
msg.senderওmsg.valueতাদের মান পরিবর্তন করে না। এর মানে হলো একটি কন্ট্রাক্ট রানটাইমে ভিন্ন একটি এডড্রেস থেকে ডায়নামিকভাবে কোড লোড করতে পারে। স্টোরেজ, বর্তমান এডড্রেস এবং ব্যালেন্স এখনও কলিং কন্ট্রাক্টকেই নির্দেশ করে, শুধুমাত্র কোডটি কল করা এডড্রেস থেকে নেওয়া হয়।
যখনই কোনো ব্যবহারকারী একটি ফাংশন কল করে, প্রক্সি কন্ট্রাক্ট জানে যে তাকে delegatecall ইনভোক করতে হবে কারণ এতে একটি fallback ফাংশন বিল্ট-ইন থাকে। সলিডিটি প্রোগ্রামিংয়ে ফলব্যাক ফাংশন (opens in a new tab) তখন এক্সিকিউট হয় যখন কোনো ফাংশন কল কন্ট্রাক্টে নির্দিষ্ট করা ফাংশনগুলোর সাথে মেলে না।
প্রক্সি প্যাটার্ন কাজ করানোর জন্য একটি কাস্টম ফলব্যাক ফাংশন লিখতে হয় যা নির্দিষ্ট করে দেয় যে প্রক্সি কন্ট্রাক্ট কীভাবে সেই ফাংশন কলগুলো পরিচালনা করবে যা এটি সাপোর্ট করে না। এই ক্ষেত্রে প্রক্সির ফলব্যাক ফাংশনটি এমনভাবে প্রোগ্রাম করা হয় যাতে এটি একটি delegatecall শুরু করে এবং ব্যবহারকারীর রিকোয়েস্ট বর্তমান লজিক কন্ট্রাক্ট ইমপ্লিমেন্টেশনে রিরাউট করে।
প্রক্সি কন্ট্রাক্ট ডিফল্টভাবে ইমমিউটেবল, তবে আপডেট করা বিজনেস লজিক সহ নতুন লজিক কন্ট্রাক্ট তৈরি করা যেতে পারে। এরপর আপগ্রেড করা মানে হলো প্রক্সি কন্ট্রাক্টে রেফারেন্স করা লজিক কন্ট্রাক্টের এডড্রেস পরিবর্তন করা।
প্রক্সি কন্ট্রাক্টকে একটি নতুন লজিক কন্ট্রাক্টের দিকে পয়েন্ট করার মাধ্যমে, ব্যবহারকারীরা প্রক্সি কন্ট্রাক্ট ফাংশন কল করার সময় যে কোডটি এক্সিকিউট হয় তা পরিবর্তিত হয়। এটি ব্যবহারকারীদের নতুন কন্ট্রাক্টের সাথে ইন্টারঅ্যাক্ট করতে না বলেই আমাদের একটি কন্ট্রাক্টের লজিক আপগ্রেড করার সুযোগ দেয়।
স্মার্ট কন্ট্রাক্ট আপগ্রেড করার জন্য প্রক্সি প্যাটার্ন একটি জনপ্রিয় পদ্ধতি কারণ এগুলো কন্ট্রাক্ট মাইগ্রেশনের সাথে যুক্ত অসুবিধাগুলো দূর করে। তবে, প্রক্সি প্যাটার্ন ব্যবহার করা বেশি জটিল এবং সঠিকভাবে ব্যবহার না করা হলে এটি ফাংশন সিলেক্টর ক্ল্যাশ (opens in a new tab)-এর মতো গুরুতর ত্রুটি তৈরি করতে পারে।
প্রক্সি প্যাটার্ন সম্পর্কে আরও জানুন (opens in a new tab)।
আপগ্রেড মেকানিজম 4: স্ট্র্যাটেজি প্যাটার্ন
এই কৌশলটি স্ট্র্যাটেজি প্যাটার্ন (opens in a new tab) দ্বারা প্রভাবিত, যা নির্দিষ্ট ফিচারগুলো বাস্তবায়নের জন্য অন্যান্য প্রোগ্রামের সাথে ইন্টারফেস করে এমন সফটওয়্যার প্রোগ্রাম তৈরি করতে উৎসাহিত করে। ইথিরিয়াম ডেভেলপমেন্টে স্ট্র্যাটেজি প্যাটার্ন প্রয়োগ করার অর্থ হলো এমন একটি স্মার্ট কন্ট্রাক্ট তৈরি করা যা অন্যান্য কন্ট্রাক্ট থেকে ফাংশন কল করে।
এই ক্ষেত্রে মূল কন্ট্রাক্টে কোর বিজনেস লজিক থাকে, তবে নির্দিষ্ট ফাংশন এক্সিকিউট করার জন্য এটি অন্যান্য স্মার্ট কন্ট্রাক্টের ("স্যাটেলাইট কন্ট্রাক্ট") সাথে ইন্টারফেস করে। এই মূল কন্ট্রাক্টটি প্রতিটি স্যাটেলাইট কন্ট্রাক্টের এডড্রেসও সংরক্ষণ করে এবং স্যাটেলাইট কন্ট্রাক্টের বিভিন্ন ইমপ্লিমেন্টেশনের মধ্যে স্যুইচ করতে পারে।
আপনি একটি নতুন স্যাটেলাইট কন্ট্রাক্ট তৈরি করতে পারেন এবং নতুন এডড্রেস দিয়ে মূল কন্ট্রাক্টটি কনফিগার করতে পারেন। এটি আপনাকে একটি স্মার্ট কন্ট্রাক্টের জন্য স্ট্র্যাটেজি পরিবর্তন করার (অর্থাৎ, নতুন লজিক ইমপ্লিমেন্ট করার) সুযোগ দেয়।
পূর্বে আলোচিত প্রক্সি প্যাটার্নের মতো হলেও, স্ট্র্যাটেজি প্যাটার্নটি ভিন্ন কারণ মূল কন্ট্রাক্ট, যার সাথে ব্যবহারকারীরা ইন্টারঅ্যাক্ট করে, সেটি বিজনেস লজিক ধারণ করে। এই প্যাটার্নটি ব্যবহার করলে কোর ইনফ্রাস্ট্রাকচারকে প্রভাবিত না করেই স্মার্ট কন্ট্রাক্টে সীমিত পরিবর্তন আনার সুযোগ পাওয়া যায়।
এর প্রধান অসুবিধা হলো এই প্যাটার্নটি মূলত ছোটখাটো আপগ্রেড রোল আউট করার জন্য বেশি কার্যকর। এছাড়া, যদি মূল কন্ট্রাক্টটি আপোসকৃত হয় (যেমন, হ্যাকের মাধ্যমে), তবে আপনি এই আপগ্রেড পদ্ধতি ব্যবহার করতে পারবেন না।
আপগ্রেড মেকানিজম 5: ডায়মন্ড প্যাটার্ন
ডায়মন্ড প্যাটার্নকে প্রক্সি প্যাটার্নের একটি উন্নত রূপ হিসেবে বিবেচনা করা যেতে পারে। ডায়মন্ড প্যাটার্ন প্রক্সি প্যাটার্ন থেকে আলাদা কারণ ডায়মন্ড প্রক্সি কন্ট্রাক্ট একাধিক লজিক কন্ট্রাক্টে ফাংশন কল ডেলিগেট করতে পারে।
ডায়মন্ড প্যাটার্নে লজিক কন্ট্রাক্টগুলো ফ্যাসেট (facets) হিসেবে পরিচিত। ডায়মন্ড প্যাটার্ন কাজ করানোর জন্য, আপনাকে প্রক্সি কন্ট্রাক্টে একটি ম্যাপিং তৈরি করতে হবে যা ফাংশন সিলেক্টরগুলোকে (opens in a new tab) বিভিন্ন ফ্যাসেট এডড্রেসের সাথে ম্যাপ করে।
যখন কোনো ব্যবহারকারী একটি ফাংশন কল করে, প্রক্সি কন্ট্রাক্ট সেই ফাংশনটি এক্সিকিউট করার জন্য দায়ী ফ্যাসেটটি খুঁজে বের করতে ম্যাপিং চেক করে। এরপর এটি delegatecall ইনভোক করে (ফলব্যাক ফাংশন ব্যবহার করে) এবং কলটিকে উপযুক্ত লজিক কন্ট্রাক্টে রিডাইরেক্ট করে।
প্রথাগত প্রক্সি আপগ্রেড প্যাটার্নের তুলনায় ডায়মন্ড আপগ্রেড প্যাটার্নের কিছু সুবিধা রয়েছে:
-
এটি আপনাকে সমস্ত কোড পরিবর্তন না করেই কন্ট্রাক্টের একটি ছোট অংশ আপগ্রেড করার অনুমতি দেয়। আপগ্রেডের জন্য প্রক্সি প্যাটার্ন ব্যবহার করলে ছোটখাটো আপগ্রেডের জন্যও সম্পূর্ণ নতুন লজিক কন্ট্রাক্ট তৈরি করতে হয়।
-
সমস্ত স্মার্ট কন্ট্রাক্টের (প্রক্সি প্যাটার্নে ব্যবহৃত লজিক কন্ট্রাক্ট সহ) 24KB সাইজ লিমিট থাকে, যা একটি সীমাবদ্ধতা হতে পারে—বিশেষ করে জটিল কন্ট্রাক্টগুলোর জন্য যেখানে আরও বেশি ফাংশন প্রয়োজন। ডায়মন্ড প্যাটার্ন একাধিক লজিক কন্ট্রাক্ট জুড়ে ফাংশনগুলোকে বিভক্ত করে এই সমস্যার সমাধান করা সহজ করে তোলে।
-
প্রক্সি প্যাটার্ন অ্যাক্সেস কন্ট্রোলের ক্ষেত্রে একটি ক্যাচ-অল (catch-all) পদ্ধতি গ্রহণ করে। আপগ্রেড ফাংশনে অ্যাক্সেস থাকা কোনো এনটিটি সম্পূর্ণ কন্ট্রাক্ট পরিবর্তন করতে পারে। কিন্তু ডায়মন্ড প্যাটার্ন একটি মডুলার পারমিশন পদ্ধতি সক্ষম করে, যেখানে আপনি এনটিটিগুলোকে স্মার্ট কন্ট্রাক্টের মধ্যে নির্দিষ্ট ফাংশন আপগ্রেড করার মধ্যে সীমাবদ্ধ করতে পারেন।
ডায়মন্ড প্যাটার্ন সম্পর্কে আরও জানুন (opens in a new tab)।
স্মার্ট কন্ট্রাক্ট আপগ্রেড করার সুবিধা এবং অসুবিধা
| সুবিধা | অসুবিধা |
|---|---|
| একটি স্মার্ট কন্ট্রাক্ট আপগ্রেড ডিপ্লয়মেন্ট-পরবর্তী পর্যায়ে আবিষ্কৃত দুর্বলতাগুলো ঠিক করা সহজ করে তুলতে পারে। | স্মার্ট কন্ট্রাক্ট আপগ্রেড করা কোড ইমমিউটেবিলিটির ধারণাকে বাতিল করে দেয়, যার প্রভাব ডিসেন্ট্রালাইজেশন এবং নিরাপত্তার ওপর পড়ে। |
| ডেভেলপাররা ডিসেন্ট্রালাইজড এপ্লিকেশন-এ নতুন ফিচার যোগ করতে লজিক আপগ্রেড ব্যবহার করতে পারেন। | ব্যবহারকারীদের অবশ্যই ডেভেলপারদের বিশ্বাস করতে হবে যে তারা ইচ্ছামতো স্মার্ট কন্ট্রাক্ট পরিবর্তন করবেন না। |
| স্মার্ট কন্ট্রাক্ট আপগ্রেড এন্ড-ইউজারদের জন্য নিরাপত্তা উন্নত করতে পারে কারণ বাগগুলো দ্রুত ঠিক করা যায়। | স্মার্ট কন্ট্রাক্টে আপগ্রেড কার্যকারিতা প্রোগ্রাম করা জটিলতার আরেকটি স্তর যোগ করে এবং গুরুতর ত্রুটির সম্ভাবনা বাড়ায়। |
| কন্ট্রাক্ট আপগ্রেড ডেভেলপারদের বিভিন্ন ফিচার নিয়ে পরীক্ষা-নিরীক্ষা করার এবং সময়ের সাথে সাথে ডিএ্যাপস উন্নত করার আরও সুযোগ দেয়। | স্মার্ট কন্ট্রাক্ট আপগ্রেড করার সুযোগ ডেভেলপারদের ডেভেলপমেন্ট পর্যায়ে যথাযথ সতর্কতা অবলম্বন না করেই দ্রুত প্রজেক্ট লঞ্চ করতে উৎসাহিত করতে পারে। |
| স্মার্ট কন্ট্রাক্টে অনিরাপদ অ্যাক্সেস কন্ট্রোল বা সেন্ট্রালাইজেশন ক্ষতিকারক অ্যাক্টরদের জন্য অননুমোদিত আপগ্রেড করা সহজ করে তুলতে পারে। |
স্মার্ট কন্ট্রাক্ট আপগ্রেড করার ক্ষেত্রে বিবেচ্য বিষয়গুলো
-
অননুমোদিত স্মার্ট কন্ট্রাক্ট আপগ্রেড প্রতিরোধ করতে নিরাপদ অ্যাক্সেস কন্ট্রোল/অথোরাইজেশন মেকানিজম ব্যবহার করুন, বিশেষ করে যদি প্রক্সি প্যাটার্ন, স্ট্র্যাটেজি প্যাটার্ন বা ডেটা সেপারেশন ব্যবহার করেন। এর একটি উদাহরণ হলো আপগ্রেড ফাংশনে অ্যাক্সেস সীমাবদ্ধ করা, যাতে শুধুমাত্র কন্ট্রাক্টের মালিক এটি কল করতে পারে।
-
স্মার্ট কন্ট্রাক্ট আপগ্রেড করা একটি জটিল কাজ এবং দুর্বলতা তৈরি হওয়া রোধ করতে উচ্চ স্তরের সতর্কতা প্রয়োজন।
-
আপগ্রেড বাস্তবায়নের প্রক্রিয়াটি ডিসেন্ট্রালাইজড করে ট্রাস্ট অ্যাসাম্পশন হ্রাস করুন। সম্ভাব্য কৌশলগুলোর মধ্যে রয়েছে আপগ্রেড নিয়ন্ত্রণ করতে একটি মাল্টিসিগ ওয়ালেট কন্ট্রাক্ট ব্যবহার করা, অথবা আপগ্রেড অনুমোদনের জন্য DAO-এর সদস্যদের ভোট দেওয়ার প্রয়োজন করা।
-
কন্ট্রাক্ট আপগ্রেড করার সাথে জড়িত খরচ সম্পর্কে সচেতন থাকুন। উদাহরণস্বরূপ, কন্ট্রাক্ট মাইগ্রেশনের সময় পুরানো কন্ট্রাক্ট থেকে নতুন কন্ট্রাক্টে স্টেট (যেমন, ব্যবহারকারীর ব্যালেন্স) কপি করার জন্য একাধিক লেনদেন-এর প্রয়োজন হতে পারে, যার অর্থ হলো আরও বেশি গ্যাস ফি।
-
ব্যবহারকারীদের সুরক্ষার জন্য টাইমলক (timelocks) বাস্তবায়নের কথা বিবেচনা করুন। টাইমলক বলতে কোনো সিস্টেমে পরিবর্তনের ওপর প্রয়োগ করা বিলম্বকে বোঝায়। আপগ্রেড নিয়ন্ত্রণ করতে টাইমলকগুলোকে একটি মাল্টিসিগ গভর্নেন্স সিস্টেমের সাথে যুক্ত করা যেতে পারে: যদি কোনো প্রস্তাবিত পদক্ষেপ প্রয়োজনীয় অনুমোদনের থ্রেশহোল্ডে পৌঁছায়, তবে পূর্বনির্ধারিত বিলম্বের সময়কাল শেষ না হওয়া পর্যন্ত এটি এক্সিকিউট হয় না।
টাইমলক ব্যবহারকারীদের সিস্টেম থেকে বেরিয়ে যাওয়ার জন্য কিছু সময় দেয় যদি তারা কোনো প্রস্তাবিত পরিবর্তনের (যেমন, লজিক আপগ্রেড বা নতুন ফি স্কিম) সাথে একমত না হয়। টাইমলক ছাড়া, ব্যবহারকারীদের ডেভেলপারদের বিশ্বাস করতে হয় যে তারা পূর্ব নোটিশ ছাড়াই স্মার্ট কন্ট্রাক্টে ইচ্ছামতো পরিবর্তন আনবেন না। এখানকার অসুবিধা হলো টাইমলকগুলো দ্রুত দুর্বলতাগুলো প্যাচ করার ক্ষমতাকে সীমাবদ্ধ করে।
রিসোর্স
OpenZeppelin Upgrades Plugins - আপগ্রেডযোগ্য স্মার্ট কন্ট্রাক্ট ডিপ্লয় এবং সুরক্ষিত করার জন্য টুলের একটি স্যুট।
টিউটোরিয়াল
- Upgrading your Smart Contracts | YouTube Tutorial (opens in a new tab) - Patrick Collins
- Ethereum Smart Contract Migration Tutorial (opens in a new tab) - Austin Griffith
- Using the UUPS proxy pattern to upgrade smart contracts (opens in a new tab) - Pranesh A.S
- Web3 Tutorial: Write upgradeable smart contract (proxy) using OpenZeppelin (opens in a new tab) - fangjun.eth
আরও পড়াশোনা
- The State of Smart Contract Upgrades (opens in a new tab) - Santiago Palladino
- Multiple ways to upgrade a Solidity smart contract (opens in a new tab) - Crypto Market Pool ব্লগ
- Learn: Upgrading Smart Contracts (opens in a new tab) - OpenZeppelin ডক্স
- Proxy Patterns For Upgradeability Of Solidity Contracts: Transparent vs UUPS Proxies (opens in a new tab) - Naveen Sahu
- How Diamond Upgrades Work (opens in a new tab) - Nick Mudge