diff --git a/public/content/translations/bn/about/index.md b/public/content/translations/bn/about/index.md new file mode 100644 index 00000000000..9f339732bd4 --- /dev/null +++ b/public/content/translations/bn/about/index.md @@ -0,0 +1,135 @@ +--- +title: "আমাদের সম্পর্কে" +description: "ethereum.org এর টিম, কমিউনিটি এবং মিশন সম্পর্কে" +lang: bn +--- + +# ethereum.org সম্পর্কে {#about-ethereumorg} + +ethereum.org হলো Ethereum কমিউনিটির জন্য একটি সর্বজনীন, ওপেন -সোর্স রিসোর্স যেখানে যে কেউ অবদান রাখতে পারে। আমাদের একটি ছোট মূল টিম আছে যারা সাইটটি রক্ষণাবেক্ষণ ও উন্নয়নের জন্য কাজ করছে এবং সারা বিশ্বের হাজারো কমিউনিটি সদস্য এতে অবদান রাখছেন। + +**ethereum.org থেকে কেউ কখনো আপনার সঙ্গে যোগাযোগ করবে না। প্রতিক্রিয়া করবেন না।** + +## নামের উপর একটি নোট {#a-note-on-names} + +অনেক সময় মানুষ Ethereum-এ ব্যবহৃত নামগুলো গুলিয়ে ফেলে, আর এতে Ethereum কীভাবে কাজ করে সে বিষয়ে ভুল ধারণা তৈরি হতে পারে। এটি স্পষ্ট করার জন্য একটি দ্রুত ব্যাখ্যা + +### ইথেরিয়াম {#ethereum} + +Ethereum হলো একটি পাবলিক নেটওয়ার্ক, ব্লকচেইন এবং ওপেন-সোর্স প্রোটোকল, যা হাজার হাজার ডেভেলপার, নোড অপারেটর, ETH হোল্ডার এবং ব্যবহারকারীর একটি বৈশ্বিক কমিউনিটি দ্বারা পরিচালিত ও শাসিত। + +[ইথেরিয়াম সম্পর্কে আরও তথ্য](/what-is-ethereum/) + +[ইথেরিয়াম গভর্নেন্স সম্পর্কে আরও তথ্য](/governance/) + +### ইথার (ETH) {#ether-or-eth} + +Ether(যাকে ETH নামেও ডাকা হয়) হলো Ethereum নেটওয়ার্কে ব্যবহৃত স্হানীয় মুদ্রা। Ethereum নেটওয়ার্ক ব্যবহারের জন্য ETH প্রয়োজন(যা লেনদেনের ফি হিসেবে দেওয়া হয়)। ETH নেটওয়ার্ককে সুরক্ষিত রাখতে স্টেকিং-এর জন্যও ব্যবহৃত হয়। যখন মানুষ Ethereum-এর দাম নিয়ে কথা বলে, তারা মূলত ETH সম্পদের কথা বলছে। + +[ETH সম্পর্কে আরও তথ্য](/what-is-ether/) + +[ETH স্টেকিং সম্পর্কে আরও তথ্য](/staking/) + +### ইথেরিয়াম ফাউন্ডেশন {#ethereum-foundation} + +একটি অলাভজনক সংস্থা, যা প্রাথমিকভাবে ETH ক্রাউডসেল থেকে তহবিল প্রাপ্ত এবং Ethereum নেটওয়ার্ক ও ইকোসিস্টেমকে সমর্থন করার জন্য নিবেদিত। + +[ইথেরিয়াম ফাউন্ডেশন সম্পর্কে আরও তথ্য](/foundation/) + +### ethereum.org {#ethereum-org} + +Ethereum কমিউনিটির জন্য একটি পাবলিক, ওপেন-সোর্স ওয়েবসাইট এবং শিক্ষামূলক রিসোর্স। Ethereum.org একটি ছোট মূল দলের নেতৃত্বে পরিচালিত হয়, যা Ethereum ফাউন্ডেশন দ্বারা অর্থায়নপ্রাপ্ত,এবং সারা বিশ্বের হাজার হাজার কমিউনিটি সদস্যের অবদানে সমৃদ্ধ। + +এই পৃষ্ঠায় ethereum.org সম্পর্কে আরও তথ্য রয়েছে + +## আমাদের মিশন {#our-mission} + +**ethereum.org-এর লক্ষ্য হল ইথেরিয়ামের ক্রমবর্ধমান সম্প্রদায়ের জন্য সেরা পোর্টাল হওয়া** + +আমরা চেষ্টা করি একটি সহজবোধ্য শিক্ষামূলক রিসোর্স তৈরি করতে, যা Ethereum সম্পর্কিত সকল বিষয়ক কভার করে এবং নতুন ব্যবহারকারীদের Ethereum ও এর মূল ধারনাগুলোর সাথে পরিচিত হতে সাহায্য করে। আমরা চাই। + +- Ethereum প্রযুক্তিতে নতুন যেকোনো ব্যক্তিকে বোঝানো। +- নতুন ব্যবহারকারীদের ETH এবং Ethereum ব্যবহার শুরু করতে সাহায্য করা। +- নতুন ডেভেলপারদের জন্য বিল্ডিং শুরু করতে সাহায্য করা। +- Ethereum জগতের আপডেটগুলো কভার করা। +- কমিউনিটি দ্বারা তৈরি রিসোর্সগুলো প্রদর্শন করা। +- Ethereum শিক্ষা যত বেশি সম্ভব ভাষায় পৌঁছে দেওয়া। + +এই মিশনটি অর্জন করতে, আমাদের দল ethereum.org-এ দুটি প্রাথমিক লক্ষ্যের উপর মনোযোগ দেয়: + +### ১. ethereum.org ভিজিটরদের জন্য ব্যবহারকারীর অভিজ্ঞতা উন্নত করুন {#visitors} + +- সামগ্রী সম্প্রসারণ, উন্নয়ন এবং সর্বদা আপডেট রাখা। +- স্হানীয়করন এবং ওয়েব ডেভেলপমেন্টের সেরা অনুশীলনের মাধ্যমে ব্যবহারযোগ্যতা এবং প্রবেশযোগ্যতা উন্নত করা। +- ব্যবহারকারীর সম্পৃক্ততা বাড়াতে জরিপ, কুইজ এবং ওয়েব৩ ইন্টিগ্রেশনের মতো ফিচার যুক্ত করুন। +- ওয়েবসাইটটি হালকা ও দ্রুতগতির রাখুন। + +### 2. আমাদের অবদানকারী সম্প্রদায়কে বৃদ্ধি করা, শক্তিশালী করা এবং ক্ষমতায়ন করা {#community} + +- ওয়েবসাইটে অবদানকারীদের মোট সংখ্যা বৃদ্ধি করা +- যুক্ততা, স্বীকৃতি এবং পুরষ্কারের মাধ্যমে আবেদনকারীদের ধরে রাখার হার উন্নত করা। +- সম্প্রদায়ের সদস্যদের ক্রমাগত আরও গুরুত্বপূর্ণ অবদান রাখতে সক্ষম করে তুলুন। +- বিভিন্ন ধরনের অবদানকে উৎসাহিত করুন: কোড, কনটেন্ট, ডিজাইন, অনুবাদ, মডারেশন। +- কোডবেসকে আধুনিক, পরিষ্কার এবং ভালোভাবে ডকুমেন্টেড রাখুন। + +## মূল নীতি {#core-principles} + +আমাদের কিছু মূল নীতিমালা রয়েছে যা আমাদের লক্ষ্য অর্জনে পথ নির্দেশ করে। + +### 1. ethereum.org হল ইথেরিয়ামের একটি পোর্টাল 🌏 {#core-principles-1} + +আমরা চাই আামাদের ব্যবহারকারীদের আগ্রহ জাগ্রত হোক এবং তাদের প্রশ্নের উত্তর মিলুক। সেজন্য আামাদের পোর্টালটি তথ্য, "ম্যাজিক মোমেন্টস" এবং বাইরে থাকা চমৎকার সম্প্রদায়ের সম্পদের লিঙ্কগুলো একত্রিত করতে হবে। আমাদের কনটেন্টের উদ্দেশ্য হলো একটি "অনবোর্ডিং পোর্টাল" হাওয়া,যা ইতিমধ্যে বিদ্যমান বিস্তৃত সম্পদের বিকল্প নয়। +আমরা সম্প্রদায় নির্মিত সম্পদসমুহকে সমর্থন এবং একত্রিত করতে আগ্রহী, যাতে তাদের আরো বেশি দৃশ্যমানতা পাওয়া যায় এবং তাদের সহজেই খুঁজে পাওয়া যায়। +[ইথেরিয়ামের সম্প্রদায়](/community/) এর মূলে রয়েছে: আমাদের শুধু সম্প্রদায়কে পরিষেবা দেওয়াই নয়, তাদের সাথে কাজ করতে হবে এবং তাদের মতামত অন্তর্ভুক্ত করতে হবে। ওয়েবসাইটটি শুধুমাত্র আমাদের বর্তমান সম্প্রদায়ের জন্য নয়, বরং আমরা ভবিষ্যতে যে সম্প্রদায় গড়ে তুলতে চাই তার জন্যেও। আমাদের মনে রাখতে হবে যে আমাদের সম্প্রদায়টি বৈশ্বিক - যেখানে বিভিন্ন ভাষা,অঞ্চল এবং সংস্কৃতির মানুষ রয়েছে। + +### 2. ethereum.org সর্বদা বিকশিত হচ্ছে 🛠 {#core-principles-2} + +Ethereum এবং সম্প্রদায় সবসময় বিকশিত হচ্ছে, তাই ethereum.org বিকশিত হতে থাকবে। এই কারণেই সাইটটির একটি সাধারণ ডিজাইন সিস্টেম এবং মডুলার কাঠামো রয়েছে। আমরা সাইটটি কিভাবে ব্যবহার করা হচ্ছে এবং কমিউনিটি কি চায় তা আরো ভালোভাবে বুঝতে পারার সাথে সাথে ধাপে ধাপে পরিবর্তন করি। +আমরা ওপেন সোর্স, এবং আামাদের একটি সহযোগী কমিউনিটি রয়েছে তাই আপনি চাইলে পরিবর্তনের প্রস্তাব দিতে পারেন বা আমাদের সাহায্য করতে পারেন। +[অবদান সম্পর্কে জানুন](/contributing/) + +### 3. ethereum.org একটি সাধারণ পণ্য ওয়েবসাইট নয় 🦄 {#core-principles-3} + +Ethereum একটি বিশাল বিষয় : এটি একটি কমিউনিটি, একটি প্রযুক্তি, কিছু ধারণা ও মতাদর্শ এবং আরো অনেক কিছুে অন্তর্ভুক্ত করে। +এটার মানে হলো ওয়েবসাইটটিকে বিভিন্ন ধরনের ব্যবহারকারীর পথ পরিচালনা করতে হবে,যেমন" একজন ডেভেলপার যিনি একটি নির্দিষ্ট টুল চাইছেন" এবং "একজন নতুন ব্যবহারকারী যিনি কিছু ETH কিনেছেন এবং জানেন না ওয়ালেট কী"। +কোনটি একটি ব্লকচেইন প্ল্যাটফর্মের জন্য সেরা ওয়েবসাইট? এখনো একটি উন্মুক্ত প্রশ্ন_আমরা পথপ্রদর্শক। এটি তৈরি করতে পরীক্ষা-নিরীক্ষার প্রয়োজন। + +## পণ্যের রোডম্যাপ {#roadmap} + +আমাদের কাজকে আরও সহজলভ্য করতে এবং আরও বেশি কমিউনিটি সহযোগিতাকে উৎসাহিত করতে, ethereum.org কোর টিম আমাদের [শেপ আপ সাইকেল](https://www.productplan.com/glossary/shape-up-method/) রোডম্যাপের লক্ষ্যগুলির একটি সংক্ষিপ্ত বিবরণ প্রকাশ করে। + +[আমাদের 2025 সাইকেল 1 পণ্যের রোডম্যাপ দেখুন](https://github.com/ethereum/ethereum-org-website/issues/14726) + +**কেমন লাগছে?** আমরা আমাদের রোডম্যাপের উপর দেওয়া মতামতের সর্বদা প্রশংসা করি - যদি এমন কিছু থাকে যা আপনার মনে হয় আমাদের কাজ করা উচিত, অনুগ্রহ করে আমাদের জানান! আমরা সম্প্রদায়ের যেকোনো সদস্যের কাছ থেকে আইডিয়া এবং পুলকে স্বাগত জানাই। + +**যুক্ত হতে চান?** [অবদান সম্পর্কে আরও জানুন](/contributing/), [Twitter-এ আমাদের সাথে যোগাযোগ করুন](https://x.com/ethdotorg), অথবা [আমাদের Discord সার্ভারে](https://discord.gg/ethereum-org) কমিউনিটি আলোচনায় যোগ দিন। + +## ডিজাইনের নীতি {#design-principles} + +সাইটে আমাদের বিষয়বস্তু এবং ডিজাইনের সিদ্ধান্তগুলিকে গাইড করতে আমরা [ডিজাইন নীতির](/contributing/design-principles/) একটি সেট ব্যবহার করি। + +## ডিজাইন সিস্টেম {#design-system} + +আমরা আরও দ্রুত ফিচার শিপ করার জন্য এবং কমিউনিটির সদস্যদের ethereum.org-এর ওপেন ডিজাইনে অংশগ্রহণ করতে দেওয়ার জন্য একটি [ডিজাইন সিস্টেম](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System?node-id=0%3A1&t=QBt9RkhpPqzE3Aa6-1) তৈরি এবং প্রকাশ করেছি। + +যুক্ত হতে চান?[Figma-তে অনুসরণ করুন](https://www.figma.com/file/NrNxGjBL0Yl1PrNrOT8G2B/ethereum.org-Design-System), [GitHub সমস্যাটি](https://github.com/ethereum/ethereum-org-website/issues/6284) এবং আমাদের [#design Discord চ্যানেলে](https://discord.gg/ethereum-org) কথোপকথনে যোগ দিন। + +## স্টাইল গাইড {#style-guide} + +অবদান প্রক্রিয়াটিকে আরও মসৃণ করতে বিষয়বস্তু লেখার নির্দিষ্ট কিছু দিককে মানসম্মত করতে আমাদের একটি [স্টাইল গাইড](/contributing/style-guide/) আছে। + +আপনি যদি [সাইটে অবদান রাখতে](/contributing/) চান তবে নিশ্চিত করুন যে আপনি [আমাদের নীতিগুলি](/contributing/design-principles/) এবং [আমাদের স্টাইল গাইড](/contributing/style-guide/) পড়েছেন। + +আমরা আমাদের ডিজাইন নীতিমালা, ডিজাইন সিস্টেম এবং স্টাইল গাইড নিয়ে মতামতকে স্বাগত জানাই। মনে রাখবেন, ইথেরিয়াম.org হলো কমিউনিটির জন্য, কমিউনিটির দ্বারাই। + +## লাইসেন্স {#license} + +অন্যথায় নির্দিষ্ট না করা থাকলে ethereum.org ওয়েবসাইটটি ওপেন সোর্স এবং একটি [MIT লাইসেন্সের](https://github.com/ethereum/ethereum-org-website/blob/dev/LICENSE) অধীনে নির্মিত। ethereum.org-এর [ব্যবহারের শর্তাবলী](/terms-of-use/) সম্পর্কে আরও তথ্য। + +## উন্মুক্ত চাকরি {#open-jobs} + +যদিও এই ওয়েবসাইটটি ওপেন-সোর্স এবং যেকেউ এতে কাজ করতে পারেন, তবুও আামাদের একটি নিবেদিত দল রয়েছে যারা ইথেরিয়াম.org এবং অন্যান্য ইথেরিয়াম ফাউন্ডেশনের ওয়েব প্রকল্পগুলোতে কাজ করে।আমরা এখানে যেকোনো খালি পদের বিজ্ঞপ্তি প্রকাশ করব। + +আমরা এখানে যেকোনো খালি পদের বিজ্ঞপ্তি প্রকাশ করব। আপনি যদি এখানে আপনার জন্য কোনো ভূমিকা না দেখেন, তাহলে [আমাদের Discord সার্ভারে](https://discord.gg/ethereum-org) যান এবং আমাদের জানান আপনি কিভাবে আমাদের সাথে কাজ করতে চান! + +ইথেরিয়াম.org দলের বাইরে তাকাচ্ছেন? [অন্যান্য ইথেরিয়াম সম্পর্কিত চাকরি দেখুন](/community/get-involved/#ethereum-jobs/)। diff --git a/public/content/translations/bn/ai-agents/index.md b/public/content/translations/bn/ai-agents/index.md new file mode 100644 index 00000000000..08ef8bd496e --- /dev/null +++ b/public/content/translations/bn/ai-agents/index.md @@ -0,0 +1,144 @@ +--- +title: "AI এজেন্ট" +metaTitle: "AI এজেন্ট | Ethereum-এর উপর AI এজেন্ট" +description: "Ethereum-এর উপর AI এজেন্টদের একটি সংক্ষিপ্ত বিবরণ" +lang: bn +template: use-cases +emoji: ":robot:" +sidebarDepth: 2 +image: /images/ai-agents/hero-image.png +alt: "টার্মিনাল টেবিলে মানুষ জড়ো হয়েছে" +summaryPoint1: "AI যা ব্লকচেইনের সাথে যোগাযোগ করে এবং স্বাধীনভাবে ট্রেড করে" +summaryPoint2: "অনচেইন ওয়ালেট এবং ফান্ড নিয়ন্ত্রণ করে" +summaryPoint3: "কাজের জন্য মানুষ বা অন্যান্য এজেন্ট নিয়োগ করে" +buttons: + - content: AI এজেন্ট কি? + toId: what-are-ai-agents + - content: এজেন্টগুলি এক্সপ্লোর করুন + toId: ai-agents-on-ethereum + isSecondary: false +--- + +কল্পনা করুন যে আপনি একটি AI সহকারীর সাথে Ethereum নেভিগেট করছেন যেটি 24/7 অনচেইন মার্কেটের ট্রেন্ডগুলি অধ্যয়ন করে, প্রশ্নের উত্তর দেয় এবং এমনকি আপনার পক্ষে লেনদেন সম্পাদন করে। AI এজেন্টের জগতে স্বাগতম—আপনার ডিজিটাল জীবনকে সহজ করার জন্য ডিজাইন করা বুদ্ধিমান সিস্টেম। + +Ethereum-এ, আমরা ভার্চুয়াল প্রভাবশালী এবং স্বায়ত্তশাসিত কন্টেন্ট নির্মাতাদের থেকে শুরু করে রিয়েল-টাইম বাজার বিশ্লেষণ প্ল্যাটফর্ম পর্যন্ত AI এজেন্টদের উদ্ভাবন দেখতে পাচ্ছি, যা ব্যবহারকারীদের অন্তর্দৃষ্টি, বিনোদন এবং কর্মক্ষম দক্ষতা প্রদানের মাধ্যমে ক্ষমতায়ন করছে। + +## AI এজেন্ট কি? {#what-are-ai-agents} + +AI এজেন্ট হল সফ্টওয়্যার প্রোগ্রাম যা কাজ সম্পাদন করতে বা নিজের সিদ্ধান্ত নিতে কৃত্রিম বুদ্ধিমত্তা ব্যবহার করে। তারা ডেটা থেকে শেখে, পরিবর্তনের সাথে খাপ খাইয়ে নেয় এবং জটিল কাজগুলি পরিচালনা করে। তারা বিরতিহীনভাবে কাজ করে এবং তাৎক্ষণিকভাবে সুযোগ সনাক্ত করতে পারে। + +### AI এজেন্টরা কীভাবে ব্লকচেইনগুলির সাথে কাজ করে {#how-ai-agents-work-with-blockchains} + +প্রথাগত ফিনান্সে, AI এজেন্টরা প্রায়ই সীমিত ডেটা ইনপুট সহ কেন্দ্রীভূত পরিবেশে কাজ করে। এটি তাদের স্বায়ত্তশাসিতভাবে সম্পদ শিখতে বা পরিচালনা করার ক্ষমতাকে বাধাগ্রস্ত করে। + +বিপরীতে, Ethereum-এর বিকেন্দ্রীভূত ইকোসিস্টেম বেশ কিছু মূল সুবিধা প্রদান করে: + +- স্বচ্ছ ডেটা: রিয়েল-টাইম ব্লকচেইন তথ্যে অ্যাক্সেস। +- প্রকৃত সম্পদ মালিকানা: ডিজিটাল সম্পদ সম্পূর্ণরূপে AI এজেন্টদের মালিকানাধীন। +- শক্তিশালী অনচেইন কার্যকারিতা: AI এজেন্টদের লেনদেন সম্পাদন করতে, স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করতে, তারল্য সরবরাহ করতে এবং প্রোটোকল জুড়ে সহযোগিতা করতে সক্ষম করে। + +এই কারণগুলি AI এজেন্টদেরকে সাধারণ বট থেকে গতিশীল, স্ব-উন্নয়নশীল সিস্টেমে রূপান্তরিত করে যা একাধিক সেক্টরে উল্লেখযোগ্য মূল্য প্রদান করে: + + + + + + + +## যাচাইযোগ্য AI {#verifiable-ai} + +অফচেইনে চলা AI এজেন্টরা প্রায়শই "ব্ল্যাক বক্স"-এর মতো আচরণ করে—তাদের যুক্তি, ইনপুট এবং আউটপুট স্বাধীনভাবে যাচাই করা যায় না। Ethereum তা পরিবর্তন করে। অনচেইনে এজেন্টের আচরণকে অ্যাঙ্কর করার মাধ্যমে, ডেভেলপাররা এমন এজেন্ট তৈরি করতে পারে যা _ট্রাস্টলেস_, _স্বচ্ছ_, এবং _অর্থনৈতিকভাবে স্বায়ত্তশাসিত_। এই ধরনের এজেন্টদের কার্যকলাপ অডিট, সীমাবদ্ধ এবং প্রমাণ করা যেতে পারে। + +### যাচাইযোগ্য অনুমান {#verifiable-inference} + +AI অনুমান ঐতিহ্যগতভাবে অফচেইনে ঘটে, যেখানে এক্সিকিউশন সস্তা কিন্তু মডেল এক্সিকিউশন অস্বচ্ছ। Ethereum-এ, ডেভেলপাররা বিভিন্ন কৌশল ব্যবহার করে এজেন্টদের যাচাইযোগ্য কম্পিউটেশনের সাথে যুক্ত করতে পারে: + +- [**zkML (জিরো-নলেজ মেশিন লার্নিং)**](https://opengradient.medium.com/a-gentle-introduction-to-zkml-8049a0e10a04) এজেন্টদের মডেল বা ইনপুট প্রকাশ না করে একটি মডেল সঠিকভাবে কার্যকর করা হয়েছে তা প্রমাণ করতে দেয় +- [**TEE (বিশ্বস্ত এক্সিকিউশন পরিবেশ) অ্যাটেস্টেশন**](https://en.wikipedia.org/wiki/Trusted_execution_environment) হার্ডওয়্যার-সমর্থিত প্রমাণ অনুমোদন করে যে একটি এজেন্ট একটি নির্দিষ্ট মডেল বা কোড পাথ চালিয়েছে +- **অনচেইন অপরিবর্তনীয়তা** নিশ্চিত করে যে এই প্রমাণ এবং অ্যাটেস্টেশনগুলি যেকোনো চুক্তি বা এজেন্ট দ্বারা রেফারেন্স, রিপ্লে এবং বিশ্বাস করা যেতে পারে + +## x402 এর মাধ্যমে অর্থপ্রদান এবং বাণিজ্য {#x402} + +[x402 প্রোটোকল](https://www.x402.org/), যা Ethereum এবং L2s-এ ডিপ্লয় করা হয়েছে, এজেন্টদের মানব হস্তক্ষেপ ছাড়াই রিসোর্সের জন্য অর্থ প্রদান এবং অর্থনৈতিকভাবে ইন্টারঅ্যাক্ট করার একটি নেটিভ উপায় দেয়। এজেন্টরা করতে পারে: + +- স্টেবলকয়েন ব্যবহার করে কম্পিউট, ডেটা এবং API কলের জন্য অর্থ প্রদান করুন +- অন্যান্য এজেন্ট বা পরিষেবা থেকে অ্যাটেস্টেশন অনুরোধ বা যাচাই করুন +- এজেন্ট-টু-এজেন্ট বাণিজ্যে অংশগ্রহণ করুন, কম্পিউট, ডেটা বা মডেল আউটপুট কেনা-বেচা করুন + +x402 Ethereum-কে স্বায়ত্তশাসিত এজেন্টদের জন্য একটি প্রোগ্রামেবল অর্থনৈতিক লেয়ারে পরিণত করে, যা অ্যাকাউন্ট, সাবস্ক্রিপশন বা কেন্দ্রীভূত বিলিংয়ের পরিবর্তে পে-পার-ইউজ ইন্টারঅ্যাকশন সক্ষম করে। + +### এজেন্টিক ফিনান্স নিরাপত্তা {#agentic-finance-security} + +স্বায়ত্তশাসিত এজেন্টদের গার্ডরেল প্রয়োজন। Ethereum তাদের ওয়ালেট এবং কন্ট্র্যাক্ট স্তরে প্রদান করে: + +- [স্মার্ট অ্যাকাউন্ট (EIP-4337)](https://eips.ethereum.org/EIPS/eip-4337) ডেভেলপারদের খরচের সীমা, হোয়াইটলিস্ট, সেশন কী এবং গ্র্যানুলার অনুমতি প্রয়োগ করতে দেয় +- স্মার্ট কন্ট্র্যাক্টে প্রোগ্রাম করা সীমাবদ্ধতাগুলি একটি এজেন্টকে কী করার অনুমতি দেওয়া হয় তা সীমাবদ্ধ করতে পারে +- অনুমান-ভিত্তিক সীমা (যেমন, একটি উচ্চ-ঝুঁকিপূর্ণ কাজ সম্পাদন করার আগে একটি zkML প্রমাণের প্রয়োজন) নিরাপত্তার আরেকটি লেয়ার যোগ করে + +এই নিয়ন্ত্রণগুলি স্বায়ত্তশাসিত এজেন্টদের ডিপ্লয়মেন্ট সক্ষম করে যা সীমাহীন নয়। + +### অনচেইন রেজিস্ট্রি: ERC-8004 {#erc-8004} + +[ERC-8004](https://eips.ethereum.org/EIPS/eip-8004) একটি উদীয়মান মান (বর্তমানে পিয়ার রিভিউতে) যা এজেন্ট পরিচয়, ক্ষমতা এবং অ্যাটেস্টেশনের জন্য অনচেইন রেজিস্ট্রি প্রস্তাব করে। + +যদি গৃহীত হয়, এটি প্রদান করতে পারে: + +- এজেন্টদের একটি শেয়ার্ড, ট্রাস্টলেস ডিরেক্টরি +- স্ট্যান্ডার্ডাইজড অ্যাটেস্টেশন ফরম্যাট +- সরাসরি Ethereum মেইননেটে "ট্রাস্টলেস এজেন্ট পরিকাঠামো" এর জন্য একটি ভিত্তি + +এটি এজেন্টদের জন্য একটি সম্পূর্ণ বিকেন্দ্রীভূত পরিবেশে একে অপরকে আবিষ্কার, যাচাই এবং লেনদেন করা সহজ করে তুলবে। + +## Ethereum-এর উপর AI এজেন্ট {#ai-agents-on-ethereum} + +আমরা AI এজেন্টদের সম্পূর্ণ সম্ভাবনা অন্বেষণ করতে শুরু করেছি, এবং প্রকল্পগুলি ইতিমধ্যেই AI এবং ব্লকচেইনের মধ্যে সমন্বয়কে কাজে লাগাচ্ছে—বিশেষ করে স্বচ্ছতা এবং নগদীকরণের ক্ষেত্রে। + + + +পডকাস্ট অতিথি হিসেবে লুনার প্রথম উপস্থিতি + + + +## এজেন্ট-নিয়ন্ত্রিত ওয়ালেট {#agent-controlled-wallets} + +লুনা বা AIXBT-এর মতো এজেন্টরা তাদের নিজস্ব অনচেইন ওয়ালেট ([AIXBT-এর ওয়ালেট](https://clusters.xyz/aixbt), [লুনার ওয়ালেট](https://zapper.xyz/account/0x0d177181e3763b20d47dc3a72dd584368bd8bf43)) নিয়ন্ত্রণ করে যা তাদের ভক্তদের টিপ দিতে এবং অর্থনৈতিক কর্মকাণ্ডে অংশগ্রহণ করতে সক্ষম করে। + +লুনার X সোশ্যাল ক্যাম্পেইন #LunaMuralChallenge চলাকালীন, লুনা তার বেস ওয়ালেটের মাধ্যমে বিজয়ীদের নির্বাচন এবং পুরস্কৃত করেছে — যা ক্রিপ্টো পুরস্কারের জন্য AI দ্বারা মানুষ নিয়োগের প্রথম উদাহরণ হিসেবে চিহ্নিত হয়েছে। + + + + +

জানা ভালো

+

AI এজেন্ট এবং সম্পর্কিত টুলস এখনও প্রাথমিক বিকাশে রয়েছে এবং খুব পরীক্ষামূলক—সতর্কতার সাথে ব্যবহার করুন।

+
+ +
+ +## চ্যাট কমান্ড ব্যবহার করে আপনার ওয়ালেট নিয়ন্ত্রণ করুন {#control-your-wallet-using-chat-commands} + +আপনি DeFi-এর জটিল ইন্টারফেসগুলি এড়িয়ে যেতে পারেন এবং সাধারণ চ্যাট কমান্ড দিয়ে আপনার ক্রিপ্টো পরিচালনা করতে পারেন। + +এই স্বজ্ঞাত পদ্ধতি লেনদেনকে দ্রুত, সহজ করে তোলে এবং ভুল অ্যাড্রেসে ফান্ড পাঠানো বা ফি-এর জন্য অতিরিক্ত অর্থ প্রদানের মতো ত্রুটির প্রবণতা কমায়। + + + +## AI এজেন্ট বনাম AI বট {#ai-agents-vs-ai-bots} + +AI এজেন্ট এবং AI বটের মধ্যে পার্থক্য কখনও কখনও বিভ্রান্তিকর হতে পারে, কারণ উভয়ই ইনপুটের উপর ভিত্তি করে স্বয়ংক্রিয় কাজ সম্পাদন করে। + +- AI বটগুলি স্বয়ংক্রিয় সহকারীর মতো — তারা রুটিন কাজ সম্পাদন করার জন্য নির্দিষ্ট, পূর্ব-প্রোগ্রাম করা নির্দেশাবলী অনুসরণ করে। +- AI এজেন্টরা বুদ্ধিমান সঙ্গীর মতো — তারা অভিজ্ঞতা থেকে শেখে, নতুন তথ্যের সাথে খাপ খাইয়ে নেয় এবং নিজেরাই সিদ্ধান্ত নেয়। + +| | AI এজেন্ট | AI বট | +| ---------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------ | +| **মিথস্ক্রিয়া** | জটিল, অভিযোজনযোগ্য, স্বায়ত্তশাসিত | সরল, পূর্ব-নির্ধারিত পরিধি, হার্ডকোডেড | +| **শিক্ষা** | ক্রমাগত শেখে, রিয়েল-টাইমে নতুন ডেটার সাথে পরীক্ষা করতে এবং মানিয়ে নিতে পারে | পূর্ব-প্রশিক্ষিত ডেটা বা নির্দিষ্ট নিয়মের উপর কাজ করে | +| **কাজ সমাপ্তি** | বৃহত্তর উদ্দেশ্য অর্জনের লক্ষ্য রাখে | শুধুমাত্র নির্দিষ্ট কাজের উপর মনোযোগ দেয় | + +## গভীরে প্রবেশ করুন {#dive-deeper} + + + +## আপনি নিজের AI এজেন্ট তৈরি করতে পারেন {#you-can-build-your-own-ai-agent} + + diff --git a/public/content/translations/bn/bridges/index.md b/public/content/translations/bn/bridges/index.md new file mode 100644 index 00000000000..b40f8ff65ab --- /dev/null +++ b/public/content/translations/bn/bridges/index.md @@ -0,0 +1,145 @@ +--- +title: "ব্লকচেইন ব্রিজ সমূহের পরিচিতি" +description: "ব্রিজ ব্যবহারকারীদের বিভিন্ন ব্লকচেইন জুড়ে তাদের ফান্ড সরানোর অনুমতি দেয়" +lang: bn +--- + +# ব্লকচেইন ব্রিজ {#prerequisites} + +_Web3 L1 ব্লকচেইন এবং L2 স্কেলিং সলিউশনের একটি ইকোসিস্টেমে বিকশিত হয়েছে, প্রতিটি অনন্য ক্ষমতা এবং ট্রেড-অফের সাথে ডিজাইন করা হয়েছে। ব্লকচেইন প্রোটোকলের সংখ্যা বাড়ার সাথে সাথে চেইন জুড়ে সম্পদ স্থানান্তরের চাহিদাও বাড়ছে।এই চাহিদা পূরণের জন্য, আমাদের ব্রিজের প্রয়োজন।_ + + + +## ব্রিজসমূহ কি? {#what-are-bridges} + +ব্লকচেইন ব্রিজগুলি ঠিক সেই ব্রিজগুলির মতোই কাজ করে যা আমরা বাস্তব জগতে জানি। ঠিক যেমন একটি বাস্তব ব্রিজ দুটি বাস্তব স্থানকে সংযুক্ত করে, একটি ব্লকচেইন ব্রিজ দুটি ব্লকচেইন ইকোসিস্টেমকে সংযুক্ত করে। **ব্রিজ তথ্য ও সম্পদ স্থানান্তরের মাধ্যমে ব্লকচেইনের মধ্যে যোগাযোগ সহজতর করে**। + +আসুন একটি উদাহরণ বিবেচনা করা যাক: + +আপনি মার্কিন যুক্তরাষ্ট্র থেকে এসেছেন এবং ইউরোপে ভ্রমণের পরিকল্পনা করছেন। আপনার কাছে USD আছে, কিন্তু আপনার খরচ করার জন্য EUR প্রয়োজন। EUR এর জন্য আপনার USD বিনিময় করতে আপনি একটি ছোট ফি জন্য একটি মুদ্রা বিনিময় ব্যবহার করতে পারেন। + +কিন্তু, আপনি যদি একটি ভিন্ন [blockchain](/glossary/#blockchain) ব্যবহার করার জন্য অনুরূপ এক্সচেঞ্জ করতে চান তবে আপনি কী করবেন? ধরা যাক আপনি Ethereum Mainnet-এর [ETH](/glossary/#ether) কে [Arbitrum](https://arbitrum.io/) এর ETH দিয়ে এক্সচেঞ্জ করতে চান। ইউরোর জন্য আমরা যে মুদ্রা বিনিময় করেছি তার মতো, আমাদের ETH কে ইথেরিয়াম থেকে Arbitrum সরানোর জন্য আমাদের একটি প্রক্রিয়া প্রয়োজন। ব্রিজ এই ধরনের লেনদেন সম্ভব করে তোলে। এই ক্ষেত্রে, [Arbitrum-এর একটি নেটিভ ব্রিজ আছে](https://portal.arbitrum.io/bridge) যা Mainnet থেকে Arbitrum-এ ETH স্থানান্তর করতে পারে। + +## কেন আমাদের ব্রিজ দরকার? {#why-do-we-need-bridges} + +সমস্ত ব্লকচেইনের সীমাবদ্ধতা রয়েছে। Ethereum-কে স্কেল করতে এবং চাহিদার সাথে তাল মিলিয়ে চলতে, এর [rollups](/glossary/#rollups) প্রয়োজন হয়েছে। বিকল্পভাবে, solana এবং Avalanche মতো L1গুলি উচ্চতর থ্রুপুট সক্ষম করার জন্য ভিন্নভাবে ডিজাইন করা হয়েছে তবে বিকেন্দ্রীকরণের খরচে। + +যাইহোক, সমস্ত ব্লকচেইন বিচ্ছিন্ন পরিবেশে তৈরি হয় এবং তাদের বিভিন্ন নিয়ম এবং [consensus](/glossary/#consensus) প্রক্রিয়া রয়েছে। এর অর্থ হল তারা স্থানীয়ভাবে যোগাযোগ করতে পারে না এবং টোকেনগুলি ব্লকচেইনের মধ্যে অবাধে চলাচল করতে পারে না। + +ব্লকচেইনগুলিকে সংযুক্ত করার জন্য ব্রিজগুলি বিদ্যমান, যা তাদের মধ্যে তথ্য এবং টোকেন স্থানান্তর করার অনুমতি দেয়। + +**ব্রিজ সক্ষম করে**: + +- সম্পদ এবং তথ্যের ক্রস-চেইন স্থানান্তর। +- [ডিএ্যাপস](/glossary/#dapp) বিভিন্ন ব্লকচেইনের শক্তি অ্যাক্সেস করে – এইভাবে তাদের ক্ষমতা বৃদ্ধি করে (যেহেতু প্রোটোকলগুলিতে এখন উদ্ভাবনের জন্য আরও ডিজাইন স্পেস রয়েছে)। +- ব্যবহারকারীরা নতুন প্ল্যাটফর্ম অ্যাক্সেস করতে এবং বিভিন্ন চেইনের সুবিধাগুলি লাভ করতে পারে। +- বিভিন্ন ব্লকচেইন ইকোসিস্টেমের ডেভেলপাররা ব্যবহারকারীদের জন্য সহযোগিতা এবং নতুন প্ল্যাটফর্ম তৈরি করতে পারে। + +[কীভাবে লেয়ার 2-তে টোকেন ব্রিজ করবেন](/guides/how-to-use-a-bridge/) + + + +## ব্রিজ ব্যবহারের ক্ষেত্র {#bridge-use-cases} + +নিম্নলিখিত কিছু পরিস্থিতি যেখানে আপনি একটি ব্রিজ ব্যবহার করতে পারেন: + +### কম লেনদেন ফি {#transaction-fees} + +ধরা যাক আপনার ইথেরিয়াম মেইননেট-এ ETH আছে কিন্তু বিভিন্ন dapps এক্সপ্লোর করার জন্য সস্তা লেনদেন ফি চান। মেইননেট থেকে ইথেরিয়াম L2 রোলআপে আপনার ETH ব্রিজ করে, আপনি কম লেনদেন ফি উপভোগ করতে পারেন। + +### অন্যান্য ব্লকচেইনে ডিএ্যাপস {#dapps-other-chains} + +আপনি যদি Ethereum Mainnet-এ USDT সরবরাহ করার জন্য Aave ব্যবহার করে থাকেন কিন্তু Polygon-এ Aave ব্যবহার করে USDT সরবরাহ করার জন্য আপনি যে সুদের হার পেতে পারেন তা বেশি। + +### ব্লকচেইন ইকোসিস্টেম অন্বেষণ করুন {#explore-ecosystems} + +আপনার যদি ইথেরিয়াম মেইননেট-এ ETH থাকে এবং আপনি তাদের নেটিভ dapp গুলো ব্যবহার করে দেখতে একটি alt L1 এক্সপ্লোর করতে চান। আপনি ইথেরিয়াম মেইননেট থেকে alt L1 এ আপনার ETH স্থানান্তর করতে একটি ব্রিজ ব্যবহার করতে পারেন। + +### নিজস্ব নেটিভ ক্রিপ্টো সম্পদ {#own-native} + +ধরা যাক আপনি নেটিভ বিটকয়েন (BTC) এর মালিক হতে চান, কিন্তু আপনার কাছে শুধুমাত্র ইথেরিয়াম মেইননেট-এ ফান্ড আছে। ইথেরিয়াম-এ BTC-এর এক্সপোজার পেতে, আপনি Wrapped Bitcoin (WBTC) কিনতে পারেন। যাইহোক, WBTC হল একটি [ERC-20](/glossary/#erc-20) টোকেন যা Ethereum নেটওয়ার্কের নেটিভ, যার মানে এটি Bitcoin-এর একটি Ethereum সংস্করণ এবং Bitcoin ব্লকচেইনের মূল সম্পদ নয়। নেটিভ BTC-এর মালিক হতে, আপনাকে একটি সেতু ব্যবহার করে ইথেরিয়াম থেকে বিটকয়েন-এ আপনার সম্পদগুলিকে ব্রিজ করতে হবে। এটি আপনার WBTC ব্রিজ করবে এবং এটিকে নেটিভ BTC তে রূপান্তর করবে। বিকল্পভাবে, আপনার কাছে BTC থাকতে পারে এবং আপনি এটি Ethereum [DeFi](/glossary/#defi) প্রোটোকলে ব্যবহার করতে চাইতে পারেন। এর জন্য BTC থেকে WBTC পর্যন্ত অন্য উপায়ে ব্রিজিং করতে হবে যা পরে ইথেরিয়াম-এ একটি সম্পদ হিসাবে ব্যবহার করা যেতে পারে। + + + + + + আপনি একটি [সেন্ট্রালাইজড এক্সচেঞ্জ](/get-eth) ব্যবহার করেও উপরের সবকিছু করতে পারেন। যাইহোক, যদি না আপনার ফান্ডগুলো ইতিমধ্যেই একটি এক্সচেঞ্জ থাকে, এতে একাধিক পদক্ষেপ জড়িত থাকবে এবং আপনি সম্ভবত একটি ব্রিজ ব্যবহার করা ভাল হবে। + + + + + + +## ব্রিজের প্রকারভেদ {#types-of-bridge} + +ব্রিজগুলির অনেক ধরণের নকশা এবং জটিলতা রয়েছে। সাধারণত, সেতু দুটি বিভাগে পড়ে: বিশ্বস্ত এবং বিশ্বাসহীন সেতু। + +| বিশ্বস্ত ব্রিজগুলি | বিশ্বাসহীন ব্রিজগুলি | +| ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | +| বিশ্বস্ত ব্রিজগুলি তাদের ক্রিয়াকলাপের জন্য একটি কেন্দ্রীয় সত্তা বা সিস্টেমের উপর নির্ভর করে। | বিশ্বাসহীন ব্রিজগুলি স্মার্ট কনট্র্যাক্ট এবং অ্যালগরিদম ব্যবহার করে কাজ করে। | +| তহবিলের হেফাজত এবং সেতুর নিরাপত্তার বিষয়ে তাদের বিশ্বাসের অনুমান রয়েছে। ব্যবহারকারীরা বেশিরভাগই সেতু অপারেটরের খ্যাতির উপর নির্ভর করে। | তারা বিশ্বাসহীন, অর্থাৎ, সেতুর নিরাপত্তা অন্তর্নিহিত ব্লকচেইনের মতোই। | +| ব্যবহারকারীদের তাদের ক্রিপ্টো সম্পদের নিয়ন্ত্রণ ছেড়ে দিতে হবে। | [smart contracts](/glossary/#smart-contract)-এর মাধ্যমে, Trustless ব্রিজ ব্যবহারকারীদের তাদের তহবিলের উপর নিয়ন্ত্রণ রাখতে সক্ষম করে। | + +সংক্ষেপে, আমরা বলতে পারি যে বিশ্বস্ত ব্রিজ গুলির বিশ্বাসের অনুমান থাকে, যেখানে বিশ্বাসহীন সেতুগুলি বিশ্বাস-সংক্ষিপ্ত হয় এবং অন্তর্নিহিত ডোমেনের বাইরে নতুন বিশ্বাস অনুমান করে না। এই পদগুলি কীভাবে বর্ণনা করা যেতে পারে তা এখানে: + +- **Trustless**: অন্তর্নিহিত ডোমেনের সমতুল্য নিরাপত্তা থাকা। [এই নিবন্ধে অর্জুন ভুপতানির বর্ণনা অনুযায়ী।](https://medium.com/connext/the-interoperability-trilemma-657c2cf69f17) +- **বিশ্বাসের অনুমান:** সিস্টেমে বাহ্যিক যাচাইকারী যোগ করে অন্তর্নিহিত ডোমেনের নিরাপত্তা থেকে দূরে সরে যাওয়া, এইভাবে এটিকে ক্রিপ্টো-অর্থনৈতিকভাবে কম সুরক্ষিত করে তোলে। + +দুটি পদ্ধতির মধ্যে মূল পার্থক্যগুলি আরও ভালভাবে বোঝার জন্য, আসুন একটি উদাহরণ নেওয়া যাক: + +কল্পনা করুন আপনি বিমানবন্দরের নিরাপত্তা চেকপয়েন্টে আছেন। দুটি ধরণের চেকপয়েন্ট রয়েছে: + +1. ম্যানুয়াল চেকপয়েন্টস — কর্মকর্তাদের দ্বারা পরিচালিত যারা বোর্ডিং পাস হস্তান্তরের আগে আপনার টিকিট এবং পরিচয়ের সমস্ত বিবরণ ম্যানুয়ালি চেক করে। +2. সেল্ফ চেক-ইন — একটি মেশিন দ্বারা চালিত হয় যেখানে আপনি আপনার ফ্লাইটের বিবরণ রাখেন এবং সবকিছু চেক আউট হলে বোর্ডিং পাস পান। + +একটি ম্যানুয়াল চেকপয়েন্ট একটি বিশ্বস্ত মডেলের অনুরূপ কারণ এটি তার ক্রিয়াকলাপের জন্য একটি তৃতীয় পক্ষ, অর্থাৎ, কর্মকর্তাদের উপর নির্ভর করে। একজন ব্যবহারকারী হিসাবে, আপনি সঠিক সিদ্ধান্ত নিতে এবং আপনার ব্যক্তিগত তথ্য সঠিকভাবে ব্যবহার করতে কর্মকর্তাদের বিশ্বাস করেন। + +স্ব-চেক-ইন একটি বিশ্বাসহীন মডেলের অনুরূপ কারণ এটি অপারেটরের ভূমিকাকে সরিয়ে দেয় এবং এর ক্রিয়াকলাপের জন্য প্রযুক্তি ব্যবহার করে। ব্যবহারকারীরা সর্বদা তাদের ডেটা নিয়ন্ত্রণে থাকে এবং তাদের ব্যক্তিগত তথ্যের সাথে তৃতীয় পক্ষকে বিশ্বাস করতে হবে না। + +অনেক ব্রিজিং সলিউশন এই দুটি চরমের মধ্যে মডেলগুলিকে গ্রহণ করে বিভিন্ন মাত্রার বিশ্বাসহীনতার সাথে। + + + +## ব্রিজ ব্যবহার করুন {#use-bridge} + +ব্রিজ ব্যবহার করে আপনি আপনার সম্পদ বিভিন্ন ব্লকচেইনের মধ্যে স্থানান্তর করতে পারেন। এখানে কিছু রিসোর্স রয়েছে যা আপনাকে ব্রিজ খুঁজে পেতে এবং ব্যবহার করতে সাহায্য করতে পারে: + +- **[L2BEAT ব্রিজের সারসংক্ষেপ](https://l2beat.com/bridges/summary) ও [L2BEAT ব্রিজের ঝুঁকি বিশ্লেষণ](https://l2beat.com/bridges/summary)**: বিভিন্ন ব্রিজের একটি বিস্তৃত সারসংক্ষেপ, যার মধ্যে মার্কেট শেয়ার, ব্রিজের ধরন এবং গন্তব্য চেইন সম্পর্কে বিশদ বিবরণ রয়েছে। L2BEAT-এর ব্রিজের জন্য একটি ঝুঁকি বিশ্লেষণও রয়েছে, যা ব্যবহারকারীদের একটি ব্রিজ নির্বাচন করার সময় জেনে-বুঝে সিদ্ধান্ত নিতে সাহায্য করে। +- **[DefiLlama ব্রিজ সারসংক্ষেপ](https://defillama.com/bridges/Ethereum)**: Ethereum নেটওয়ার্ক জুড়ে ব্রিজ ভলিউমের একটি সারসংক্ষেপ। + + + +## ব্রিজ ব্যবহারের ঝুঁকি {#bridge-risk} + +ব্রিজগুলো ডেভেলপমেন্ট এর প্রাথমিক পর্যায়ে রয়েছে। সম্ভবত সর্বোত্তম ব্রিজের ডিজাইন এখনও আবিষ্কৃত হয়নি। যে কোনও ধরণের ব্রিজের সাথে যোগাযোগ ঝুঁকি বহন করে: + +- **স্মার্ট কন্ট্র্যাক্ট ঝুঁকি —** কোডে এমন একটি বাগের ঝুঁকি যা ব্যবহারকারীর তহবিল হারানোর কারণ হতে পারে। +- **প্রযুক্তিগত ঝুঁকি —** সফ্টওয়্যার ব্যর্থতা, বাগযুক্ত কোড, মানুষের ভুল, স্প্যাম এবং দূষিত আক্রমণ সম্ভবত ব্যবহারকারীর কার্যকলাপ ব্যাহত করতে পারে। + +অধিকন্তু, যেহেতু বিশ্বস্ত ব্রিজগুলি বিশ্বাসের অনুমান যুক্ত করে, তাই তারা অতিরিক্ত ঝুঁকি বহন করে যেমন: + +- **সেন্সরশিপ ঝুঁকি —** ব্রিজ অপারেটররা তাত্ত্বিকভাবে ব্যবহারকারীদের ব্রিজ ব্যবহার করে তাদের সম্পদ স্থানান্তর করা থেকে বিরত রাখতে পারে। +- **হেফাজতের ঝুঁকি —** ব্রিজ অপারেটররা ব্যবহারকারীদের তহবিল চুরি করার জন্য জোট করতে পারে। + +ব্যবহারকারীর ফান্ড ঝুঁকিতে থাকে যদি: + +- স্মার্ট কন্ট্রাক্টটিতে একটি বাগ আছে +- ব্যবহারকারী একটি ভুল করে +- অন্তর্নিহিত ব্লকচেইন হ্যাক হয়েছে +- একটি বিশ্বস্ত ব্রিজে ব্রিজ অপারেটরদের দূষিত অভিপ্রায় রয়েছে +- সেতু হ্যাক হয়ে যায় + +সাম্প্রতিক একটি হ্যাক ছিল Solana-এর Wormhole ব্রিজ, [যেখানে হ্যাকের সময় 120k wETH ($325 মিলিয়ন USD) চুরি হয়েছিল](https://rekt.news/wormhole-rekt/)। [ব্লকচেইনের অনেক বড় বড় হ্যাকের সাথেই ব্রিজ জড়িত ছিল](https://rekt.news/leaderboard/)। + +ইথেরিয়াম L2s-এ ব্যবহারকারীদের অনবোর্ডিং করার জন্য এবং এমনকি যারা বিভিন্ন ইকোসিস্টেম এক্সপ্লোর করতে চান তাদের জন্য ব্রিজগুলি অত্যন্ত গুরুত্বপূর্ণ। যাইহোক, ব্রিজগুলির সাথে যোগাযোগ জড়িত ঝুঁকির পরিপ্রেক্ষিতে, ব্যবহারকারীদের অবশ্যই বুঝতে হবে যে ব্রিজগুলি কী ট্রেড-অফ তৈরি করছে। এগুলি হলো [ক্রস-চেইন নিরাপত্তার জন্য কিছু কৌশল](https://debridge.com/learn/blog/10-strategies-for-cross-chain-security/)। + + + +## আরও পড়ুন {#further-reading} + +- [EIP-5164: ক্রস-চেইন এক্সিকিউশন](https://ethereum-magicians.org/t/eip-5164-cross-chain-execution/9658) - _জুন 18, 2022 - ব্রেন্ডন অ্যাসেলস্টাইন_ +- [L2Bridge ঝুঁকি ফ্রেমওয়ার্ক](https://gov.l2beat.com/t/l2bridge-risk-framework/31) - _জুলাই 5, 2022 - বারটেক কিপুসজেউস্কি_ +- ["ভবিষ্যৎ কেন মাল্টি-চেইন হবে, কিন্তু এটি ক্রস-চেইন হবে না।"](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) - _জানুয়ারি 8, 2022 - ভিটালিক বুটেরিন_ +- [সুরক্ষিত ক্রস-চেইন ইন্টারঅপারেবিলিটির জন্য শেয়ারড সিকিউরিটি ব্যবহার: ল্যাগ্রেঞ্জ স্টেট কমিটি এবং এর বাইরেও](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) - _জুন 12, 2024 - ইমানুয়েল আওসিকা_ +- [রোলআপ ইন্টারঅপারেবিলিটি সলিউশনের অবস্থা](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) - _জুন 20, 2024 - অ্যালেক্স হুক_ + diff --git a/public/content/translations/bn/community/code-of-conduct/index.md b/public/content/translations/bn/community/code-of-conduct/index.md new file mode 100644 index 00000000000..f15bf0e0b79 --- /dev/null +++ b/public/content/translations/bn/community/code-of-conduct/index.md @@ -0,0 +1,77 @@ +--- +title: "আচরণবিধি" +description: "ethereum.org জুড়ে আমরা যে মৌলিক মানগুলির জন্য চেষ্টা করি।" +lang: bn +--- + +# আচরণ বিধি {#code-of-conduct} + +## মিশন {#mission} + +ইথেরিয়ামের জন্য সবচেয়ে ব্যাপক এবং সহজলভ্য জ্ঞান হাব তৈরি করা এবং বজায় রাখা। + +## মূল্যবোধ {#values} + +ethereum.org কমিউনিটি নিম্নলিখিতগুলি হওয়ার জন্য চেষ্টা করে: + +- শিক্ষামূলক, যা প্রত্যেককে ইথেরিয়াম বুঝতে সাহায্য করার উদ্দেশ্যে নির্মিত +- অন্তর্ভুক্তিমূলক +- সহজলভ্য +- কমিউনিটি-চালিত +- ইথেরিয়ামের অন্তর্নিহিত প্রযুক্তি এবং ব্যবহারের ক্ষেত্রের উপর দৃষ্টি নিবদ্ধ করা +- ইথেরিয়াম ধারণা এবং নকশার নীতির উপর দৃষ্টি নিবদ্ধ করা + +## আমরা যা নই {#what-we-are-not} + +- ইথেরিয়াম ফাউন্ডেশন ওয়েবসাইট +- যেকোনো ধরনের বিনিয়োগ বা মুনাফা প্রচারের জন্য একটি প্ল্যাটফর্ম +- স্বতন্ত্র প্রকল্প বা সংস্থাকে উন্নত বা অনুমোদন করার জন্য একটি প্ল্যাটফর্ম +- একটি DEX, CEX বা অন্য কোনো ধরনের আর্থিক প্ল্যাটফর্ম +- এমন একটি প্ল্যাটফর্ম যা যেকোনো ধরনের আর্থিক বা আইনি পরামর্শ দেয় + +## আচরণ বিধি {#code-of-conduct} + +### অঙ্গীকার {#pledge} + +উন্মুক্ত অংশগ্রহণ ethereum.org-এর নীতির মূল ভিত্তি। আমরা হাজার হাজার অবদানকারীর দ্বারা পরিচালিত একটি ওয়েবসাইট এবং কমিউনিটি, এবং এটি কেবলমাত্র তখনই সম্ভব যদি আমরা একটি স্বাগতপূর্ণ, অংশগ্রহণমূলক পরিবেশ বজায় রাখি। এই লক্ষ্যে, এই সাইটের অবদানকারীরা সমস্ত ethereum.org প্ল্যাটফর্ম এবং কমিউনিটি স্পেস জুড়ে সকল অংশগ্রহণকারীদের জন্য একটি হয়রানি-মুক্ত পরিবেশ বজায় রাখার অঙ্গীকার করে। ethereum.org কমিউনিটি এমন প্রত্যেককে স্বাগত জানায় এবং মূল্যবান মনে করে যারা বয়স, অক্ষমতা, জাতি, লিঙ্গ বৈশিষ্ট্য, লিঙ্গ পরিচয়, অভিজ্ঞতার স্তর, দক্ষতার ক্ষেত্র, শিক্ষা, আর্থ-সামাজিক অবস্থা, জাতীয়তা, ব্যক্তিগত চেহারা, বর্ণ, ধর্ম বা বৈচিত্র্যের অন্য কোনো মাত্রা নির্বিশেষে গঠনমূলক এবং বন্ধুত্বপূর্ণ উপায়ে অংশগ্রহণ করতে চায়। + +### পরিধি {#scope} + +এই আচরণ বিধিটি সমস্ত ethereum.org স্পেসের (যেমন GitHub, Discord, Figma, Crowdin, X (পূর্বে Twitter) এবং অন্যান্য অনলাইন প্ল্যাটফর্ম) জন্য প্রযোজ্য এবং এটি তখনো প্রযোজ্য হয় যখন কমিউনিটিকে বাস্তব জগতের পাবলিক স্পেস যেমন মিটআপ, কনফারেন্স এবং ইভেন্টে প্রতিনিধিত্ব করা হয়। + +### আমাদের মান {#our-standards} + +একটি ইতিবাচক পরিবেশ তৈরিতে অবদান রাখে এমন আচরণের উদাহরণগুলির মধ্যে রয়েছে: + +- স্বাগতসূচক এবং অন্তর্ভুক্তিমূলক ভাষা ব্যবহার করা +- ভিন্ন দৃষ্টিভঙ্গি এবং অভিজ্ঞতার প্রতি শ্রদ্ধাশীল থাকা +- গঠনমূলক সমালোচনাকে মার্জিতভাবে গ্রহণ করা এবং/অথবা সহানুভূতিশীলভাবে প্রদান করা +- দ্বন্দ্ব বা মতবিরোধ সমাধানের সময় শান্তভাবে এবং পেশাদারভাবে কাজ করা +- কমিউনিটির অন্যান্য সদস্যদের প্রতি সহানুভূতি এবং সহনশীলতা দেখানো +- কমিউনিটিতে নতুন কণ্ঠকে উৎসাহিত করা এবং প্রসারিত করা + +অংশগ্রহণকারীদের দ্বারা অগ্রহণযোগ্য আচরণের উদাহরণগুলির মধ্যে রয়েছে: + +- শারীরিক সহিংসতা, শারীরিক সহিংসতার হুমকি দেওয়া বা যেকোনো ধরনের শারীরিক সহিংসতায় উৎসাহিত করা +- যৌনতাপূর্ণ ভাষা বা চিত্র ব্যবহার করা বা অবাঞ্ছিত যৌন মনোযোগ আরোপ করা +- অন্য কোনো ব্যক্তির ছদ্মবেশ ধারণ করা বা অন্যথায় কোনো ব্যক্তি বা সংস্থার সাথে অসৎভাবে সম্পর্ক দাবি করা +- ট্রোলিং, অপমানজনক/অবমাননাকর মন্তব্য, এবং ব্যক্তিগত বা রাজনৈতিক আক্রমণ +- পাবলিক বা প্রাইভেট চ্যানেলে কমিউনিটির অন্য সদস্যদের হয়রানি করা +- সুস্পষ্ট অনুমতি ছাড়া অন্যদের ব্যক্তিগত তথ্য, যেমন একটি শারীরিক বা ইলেকট্রনিক ঠিকানা, প্রকাশ করা +- সোশ্যাল ইঞ্জিনিয়ারিং, স্ক্যামিং বা অন্যথায় কমিউনিটির অন্য সদস্যদেরকে চালনা করা +- ব্যক্তিগত আর্থিক বা অনার্থিক লাভের জন্য বিনিয়োগ, টোকেন, প্রকল্প বা অন্য কিছু প্রচার করা +- অপ্রাসঙ্গিক বিষয়বস্তু দিয়ে সার্ভার স্প্যাম করা +- কমিউনিটি মডারেটরদের অনুরোধ বা সতর্কতাকে উপেক্ষা করা +- অন্যান্য আচরণে জড়িত থাকা যা একটি পেশাদার পরিবেশে যুক্তিসঙ্গতভাবে অনুপযুক্ত বলে বিবেচিত হতে পারে + +### রিপোর্টিং {#reporting} + +আচরণ বিধি লঙ্ঘন সাধারণত কমিউনিটির কাছে দৃশ্যমান হবে কারণ আমরা উন্মুক্ত, পাবলিক চ্যানেলে সবকিছু করার চেষ্টা করি, যা কমিউনিটির সদস্যদেরকে স্ব-নজরদারি করার অনুমতি দেয়। + +তবে, যদি এমন কিছু ঘটে যা আপনার মনে হয় মনোযোগ দেওয়া প্রয়োজন, আপনি এটি মডারেশন ভূমিকায় থাকা কারো কাছে (যেমন, ডিসকর্ড গাইড) উত্থাপন করতে পারেন যাতে তারা তদন্ত করতে এবং উপযুক্ত প্রতিক্রিয়া কার্যকর করতে সাহায্য করতে পারে। + +রিপোর্ট করার সময়, অনুগ্রহ করে নির্দিষ্ট উদাহরণ এবং টাইমস্ট্যাম্প সহ যতটা সম্ভব বিস্তারিত তথ্য অন্তর্ভুক্ত করুন। এটি একটি ন্যায্য ফলাফল নিশ্চিত করতে সাহায্য করবে। + +### প্রয়োগ {#enforcement} + +গুরুতরতার উপর নির্ভর করে, যারা আচরণ বিধি লঙ্ঘন করে তারা ethereum.org কমিউনিটি থেকে সতর্কতা, অস্থায়ী নিষেধাজ্ঞা বা স্থায়ী নিষেধাজ্ঞা পেতে পারে। diff --git a/public/content/translations/bn/community/events/organizing/index.md b/public/content/translations/bn/community/events/organizing/index.md new file mode 100644 index 00000000000..19a329447f8 --- /dev/null +++ b/public/content/translations/bn/community/events/organizing/index.md @@ -0,0 +1,221 @@ +--- +title: "একটি ইথেরিয়াম ইভেন্টের আয়োজন" +description: "কিভাবে একটি ইথেরিয়াম ইভেন্টের আয়োজন করবেন" +lang: bn +hideEditButton: true +--- + +# কীভাবে একটি ইথেরিয়াম ইভেন্টের আয়োজন করবেন {#how-to-organize-an-ethereum-event} + +Ethereum ইকোসিস্টেমের বিকাশের মূলে রয়েছে একটি শক্তিশালী এবং প্রাণবন্ত কমিউনিটি তৈরি করা। আপনি মিটআপ, ওয়ার্কশপ বা একটি পূর্ণাঙ্গ কনফারেন্স আয়োজনের পরিকল্পনা করুন না কেন, আপনার ইভেন্টের সাফল্য আপনার স্থানীয় নেটওয়ার্কের মধ্যে সংযোগ এবং অংশগ্রহণের উপর নির্ভর করে। এই গাইডটি আপনাকে একটি সক্রিয় ইথেরিয়াম কমিউনিটির ভিত্তি স্থাপন করতে সহায়তা করবে এবং একটি স্মরণীয় ও প্রভাবশালী সম্মেলন আয়োজনের প্রক্রিয়ার মধ্য দিয়ে ধাপে ধাপে নিয়ে যাবে। + +## নিজেকে জিজ্ঞাসা করুন, কোনো ইথেরিয়াম কমিউনিটি আছে কি? {#ask-yourself-is-there-an-ethereum-community} + +একটি সফল ইথেরিয়াম সম্মেলন একটি সক্রিয় এবং নিযুক্ত কমিউনিটির উপর নির্মিত। যদি আপনার কাছে ইতিমধ্যে একটি থাকে, তাহলে আপনি খেলায় এগিয়ে আছেন — কিন্তু যদি না থাকে, তাহলে অপরিহার্য পূর্ব-পদক্ষেপ হল সেই ভিত্তি তৈরি করা। একটি দৃশ্য (scene) এবং একটি কমিউনিটির মধ্যে পার্থক্য করা গুরুত্বপূর্ণ: একটি দৃশ্যে একটি নির্দিষ্ট এলাকায় উপস্থিত কোম্পানি এবং ব্যক্তিরা অন্তর্ভুক্ত থাকতে পারে, কিন্তু তারা প্রায়শই মাঝে মাঝে যৌথ উদ্যোগের সাথে স্বাধীনভাবে কাজ করে — অনেক জায়গায় ঐতিহ্যবাহী web2 ইকোসিস্টেমের মতো। অন্যদিকে, একটি কমিউনিটি হল আন্তঃসংযুক্ত ব্যক্তি এবং সংস্থার একটি নেটওয়ার্ক যা একে অপরকে সহযোগিতা এবং সমর্থন করে, যা প্রায়শই web3 ইকোসিস্টেমে দেখা যায়। + +**আপনার প্রথম পদক্ষেপগুলি হওয়া উচিত:** + +- স্থানীয় স্টার্টআপ এবং কোম্পানিগুলি অন্বেষণ করুন — আপনার শহর বা দেশে শক্তিশালী, সক্রিয় কোম্পানি থাকা প্রায়শই একটি কমিউনিটি তৈরির জন্য সবচেয়ে গুরুত্বপূর্ণ পূর্বশর্ত। +- ইতিমধ্যেই কোনো মিটআপ আছে কিনা তা পরীক্ষা করুন — ethereum.org [ইভেন্টস পেজ](https://ethereum.org/community/events/) +- [The ethereum.org ওয়েবসাইট](https://ethereum.org/community/events/) এবং ethereum.org ডিসকর্ড — স্থানীয় ইথেরিয়াম ইভেন্ট, ডেভেলপার এবং কন্ট্রিবিউটর আছে কিনা তা পরীক্ষা করতে। +- Luma এবং Meetup.com — আপনার এলাকায় ইথেরিয়াম-সম্পর্কিত ইভেন্ট বা বৃহত্তর web3 ইভেন্ট হচ্ছে কিনা তা দেখতে। +- X — এই ক্ষেত্রে স্থানীয় সমর্থক বা প্রভাবশালী ব্যক্তিদের খুঁজে বের করার চেষ্টা করুন। + +যদি আপনি এই উপাদানগুলির বেশিরভাগই খুঁজে পান, তবে এটি একটি শক্তিশালী লক্ষণ যে একটি কমিউনিটি তৈরির শর্ত বিদ্যমান — কিন্তু অগত্যা একটি কমিউনিটি ইতিমধ্যে বিদ্যমান আছে এমন নয়। পরবর্তী পদক্ষেপ হল এই কুশীলবদের সংগঠিত করা, নিযুক্ত করা এবং লালন-পালন করার গুরুত্বপূর্ণ কাজ, যা সহযোগিতা এবং দীর্ঘমেয়াদী বৃদ্ধির সুযোগ তৈরি করে। + +### যদি না হয়, তবে এটি কীভাবে তৈরি করবেন {#if-not-how-to-build-it} + +যদি আপনি বুঝতে পারেন যে এই উপাদানগুলির অনেকগুলিই অনুপস্থিত, চিন্তা করবেন না — শূন্য থেকে একটি কমিউনিটি তৈরি করা একটি চ্যালেঞ্জিং কিন্তু গভীরভাবে ফলপ্রসূ প্রক্রিয়া। একটি শক্তিশালী ইথেরিয়াম কমিউনিটি রাতারাতি তৈরি হয় না; এর জন্য ধৈর্য, ধারাবাহিকতা এবং একটি স্পষ্ট দৃষ্টিভঙ্গি প্রয়োজন। আপনি কীভাবে শুরু করতে পারেন তা এখানে দেওয়া হল: + +- **একটি যোগাযোগের চ্যানেল সেট আপ করুন** — এটি টেলিগ্রাম, সিগন্যাল, হোয়াটসঅ্যাপ, উইচ্যাট, বা একটি ডিসকর্ড সার্ভার হতে পারে, আপনার এলাকায় যা বেশি জনপ্রিয়, যাতে লোকেরা সংযোগ স্থাপন করতে, প্রশ্ন জিজ্ঞাসা করতে এবং রিসোর্স শেয়ার করতে পারে। +- **আপনার প্রাথমিক গ্রহণকারীদের খুঁজুন।** এমন কয়েকজনকে চিহ্নিত করুন যারা ইথেরিয়াম এবং Web3 সম্পর্কে আগ্রহী। তারা আপনার মূল সমর্থক এবং সহযোগী হয়ে উঠবে। +- **ছোট, ধারাবাহিক ইভেন্টের আয়োজন করুন।** অনানুষ্ঠানিক মিটআপ, স্টাডি গ্রুপ বা ওয়ার্কশপ দিয়ে শুরু করুন। ধারাবাহিকতা হল চাবিকাঠি — এমনকি যদি প্রথমে দলটি ছোট হয়, নিয়মিত ইভেন্ট বিশ্বাস এবং গতি তৈরি করে। +- **স্থানীয় কোম্পানি**, শিক্ষা প্রতিষ্ঠান বা কোওয়ার্কিং স্পেসগুলির সাথে যোগাযোগ করার চেষ্টা করুন যাতে তারা আপনাকে বিনামূল্যে জায়গা সরবরাহ করতে পারে। যদি আপনি আপনার দেশ থেকে বক্তা খুঁজে না পান, তবে অনলাইন বক্তাদের আমন্ত্রণ জানান কিন্তু লোকেদের শারীরিকভাবে একত্রিত করুন। আপনার দর্শকদের শারীরিকভাবে এক জায়গায় উপস্থিত রাখা অত্যন্ত গুরুত্বপূর্ণ। +- **বিদ্যমান প্রযুক্তি কমিউনিটির সাথে সহযোগিতা করুন।** যদি ইতিমধ্যে প্রতিষ্ঠিত ডেভেলপার গ্রুপ, স্টার্টআপ ইকোসিস্টেম বা ব্লকচেইন মিটআপ থাকে, তাহলে ইথেরিয়াম বিষয়গুলি প্রবর্তন করতে এবং আপনার নাগাল প্রসারিত করতে তাদের সাথে অংশীদার হন। +- ইথেরিয়ামের সম্ভাবনা সম্পর্কে **শিক্ষামূলক বিষয়বস্তু শেয়ার করুন**। +- **বিশ্বব্যাপী কমিউনিটির সাথে যোগাযোগ করুন।** সমর্থন, মেন্টরশিপ এবং সম্ভাব্য সহযোগিতার জন্য বিশ্বব্যাপী প্রতিষ্ঠিত ইথেরিয়াম গ্রুপ এবং প্রকল্পগুলির সাথে সংযোগ স্থাপন করুন। বিশ্বজুড়ে ইথেরিয়াম কমিউনিটির মধ্যে অন্তত একটি জিনিস সাধারণ: তারা সবাই সাহায্য করতে আগ্রহী। +- **তহবিল সুরক্ষিত করার চেষ্টা করুন** — তা স্থানীয় web3 কোম্পানিগুলি থেকে হোক বা [ESP](https://esp.ethereum.foundation/) এর মতো কিছু অনুদান প্রোগ্রামের মাধ্যমে হোক। + +### যদি হ্যাঁ হয়, তবে কীভাবে এটি বজায় রাখা এবং বৃদ্ধি করা যায় {#if-yes-how-to-maintain-and-grow-it} + +একবার আপনার একটি প্রতিষ্ঠিত কমিউনিটি হয়ে গেলে, কাজ থেমে থাকে না — আসলে, এটি কেবল শুরু। একটি কমিউনিটিকে সক্রিয়, নিযুক্ত এবং ক্রমবর্ধমান রাখতে অবিরাম প্রচেষ্টা এবং সৃজনশীলতার প্রয়োজন। কমিউনিটিকে জড়িত রাখার অন্যতম মূল উপাদান হল আপনার ক্রমাগত নতুন বিন্যাস এবং ধারণা নিয়ে পরীক্ষা করা উচিত। + +একটি প্রাণবন্ত ইথেরিয়াম কমিউনিটি বজায় রাখার জন্য এখানে কিছু কৌশল দেওয়া হল: + +- **আপনার ইভেন্টের ফর্ম্যাটে বৈচিত্র্য আনুন:** কেবল এক ধরণের সমাবেশে আটকে থাকবেন না। মিটআপ, সংক্ষিপ্ত হ্যাকাথন, প্যানেল আলোচনা এবং নেটওয়ার্কিং ইভেন্টগুলির সাথে জিনিসগুলিকে মিশ্রিত করুন। আপনি সহ-কর্ম দিবস বা শিক্ষামূলক কোর্স আয়োজনের চেষ্টা করতে পারেন। +- **বিষয়গুলিতে বৈচিত্র্য আনুন:** ইথেরিয়াম কেবল একটি প্রযুক্তি নয়; এটি এমন একটি মূল্যবোধের সেট যা আইনি, বিপণন এবং ব্যবসার সাথে জড়িত। +- প্রতিক্রিয়া এবং ধারণার জন্য **আপনার কমিউনিটিকে জিজ্ঞাসা করুন**। +- **বিভিন্ন দর্শক** অংশের সাথে যুক্ত হন। বিভিন্ন স্তরের অভিজ্ঞতার জন্য বিষয়বস্তু এবং ইভেন্টগুলি তৈরি করুন — প্রথমবারের জন্য ইথেরিয়াম অন্বেষণকারী নতুনদের থেকে শুরু করে অভিজ্ঞ ডেভেলপার এবং উদ্যোক্তা পর্যন্ত। + +শেখা, সহযোগিতা এবং বৃদ্ধির জন্য বিভিন্ন সুযোগ প্রদান করে, আপনি নিশ্চিত করেন যে আপনার কমিউনিটি সক্রিয় এবং একটি সম্মেলন আয়োজনের মতো বড় উদ্যোগের জন্য প্রস্তুত থাকে। + +## ইভেন্ট {#event} + +### একটি ইভেন্ট আয়োজনের সঠিক সময় কখন? {#when-is-the-right-time-to-organize-an-event} + +একটি সফল ইথেরিয়াম সম্মেলন বা কমিউনিটি ইভেন্ট আয়োজনের জন্য সতর্ক সময় এবং বিবেচনার প্রয়োজন। সঠিক মুহূর্তটি বিভিন্ন কারণের উপর নির্ভর করে যা ইভেন্টের সামগ্রিক সাফল্যে অবদান রাখে। + +আপনার কমিউনিটির পরিপক্কতা, বাজারের অবস্থা, আপনার একটি দল আছে কিনা এবং একটি স্থানীয় দৃশ্য আছে কিনা (যেমন, সম্ভাব্য পৃষ্ঠপোষক) বিবেচনা করা উচিত। + +### KYC — আপনার কমিউনিটিকে জানুন {#kyc-know-your-community} + +একটি ইভেন্ট আয়োজনের সবচেয়ে গুরুত্বপূর্ণ পদক্ষেপগুলির মধ্যে একটি হল আপনার কমিউনিটিকে বোঝা। আর্থিক পরিষেবাগুলিতে যেমন Know Your Customer (KYC), তেমনি Know Your Community (KYC) মানে হল আপনার স্থানীয় দর্শকদের নির্দিষ্ট চাহিদা, পছন্দ এবং বৈশিষ্ট্যগুলি বোঝার জন্য সময় নেওয়া। এই বোঝাপড়াটি আপনাকে সম্মেলনের সাফল্য এবং প্রাসঙ্গিকতা নিশ্চিত করতে এটিকে তৈরি করতে সাহায্য করবে। + +অবিলম্বে একটি বড় আকারের ইভেন্টের জন্য লক্ষ্য করা লোভনীয়, তবে ছোট থেকে শুরু করা প্রায়শই সেরা পদ্ধতি। আপনি যদি বস্তুনিষ্ঠভাবে আপনার কমিউনিটির অবস্থা এবং কিছু অন্যান্য দিক যা আপনার কাছে অপ্রাসঙ্গিক মনে হতে পারে, যেমন: আপনার দেশ কি একটি জনপ্রিয় পর্যটন গন্তব্য বা বাসস্থানের খরচ, তা দেখেন তবে আপনি জানতে পারবেন আপনার জন্য সেরা সমাধান কোনটি। + +প্রথম বছরে, আপনার দর্শকদের সবচেয়ে বড় অংশ হবে একটি স্থানীয় কমিউনিটি, তাই প্রথম বছর একটি বড় ইভেন্ট আয়োজনের জন্য আপনি যা কিছু করবেন তা সেই কমিউনিটির চাহিদা এবং আকারের সাথে সামঞ্জস্যপূর্ণ হওয়া উচিত। + +### কোথা থেকে শুরু করবেন {#where-to-start} + +যখন একটি সম্মেলন আয়োজনের কথা আসে, তখন প্রথম পদক্ষেপগুলি অপ্রতিরোধ্য মনে হতে পারে। কিন্তু একটি স্পষ্ট পরিকল্পনা এবং কাঠামোর সাথে, আপনি প্রক্রিয়াটিকে পরিচালনাযোগ্য কাজগুলিতে ভাগ করতে পারেন। আমরা তাদের প্রত্যেকটিকে ভেঙে দেখাব। + +একটি কাঠামোগত পদ্ধতির সাথে শুরু করা আপনাকে সংগঠিত থাকতে এবং আপনার ইভেন্ট আয়োজনের বিভিন্ন পর্যায়ে যাওয়ার সময় চাপ কমাতে সাহায্য করবে। আপনার নেওয়া প্রতিটি সিদ্ধান্ত আপনাকে এমন একটি অভিজ্ঞতা প্রদানের কাছাকাছি নিয়ে যাওয়া উচিত যা আপনার কমিউনিটির চাহিদা পূরণ করে। + +**প্রথম জিনিসটি হল স্পষ্ট ভূমিকা এবং দায়িত্ব সহ একটি আয়োজক দল তৈরি করা।** + +একটি প্রোগ্রাম তৈরি শুরু করার বা পৃষ্ঠপোষকদের কাছে পৌঁছানোর আগে আরেকটি গুরুত্বপূর্ণ পদক্ষেপ হল একটি তারিখ বেছে নেওয়া। যদিও এটি একটি সহজ পদক্ষেপের মতো শোনায়, কিছু গুরুত্বপূর্ণ বিষয় রয়েছে যা আপনার আগে থেকেই বিবেচনা করা উচিত। তাদের মধ্যে কয়েকটি হল: + +- **প্রধান সম্মেলন** বা ইভেন্টগুলির সাথে তারিখের সংঘাত এড়িয়ে চলুন +- **স্থানীয় অবস্থা এবং পরিস্থিতি বিবেচনা করুন** (যেমন বছরের ঋতু, প্রধান ছুটি, ইত্যাদি) +- **বাজারের অবস্থা বিবেচনা করুন** +- **সবকিছু আয়োজন করার জন্য নিজেকে যথেষ্ট সময় দিন** — কমপক্ষে নয় মাস + +### কীভাবে একটি দল গঠন করবেন {#how-to-assemble-a-team} + +এমন লোক বেছে নিন যারা আপনার দৃষ্টিভঙ্গি ভাগ করে নেয় এবং আপনার দক্ষতার পরিপূরক হয়। কিছু দল সমষ্টিগতভাবে কাজ করে, আবার অন্যদের নির্দিষ্ট ভূমিকা থাকে — আপনার জন্য কোনটি সবচেয়ে ভালো কাজ করে তা খুঁজে বের করুন। নিয়মিত যোগাযোগ এবং স্পষ্ট প্রত্যাশা অপরিহার্য। যদিও ইভেন্ট পরিকল্পনার জন্য যোগাযোগ প্ল্যাটফর্মের উপর নির্ভর করা লোভনীয়, আমরা কী করতে হবে তা সংগঠিত এবং ট্র্যাক করার জন্য একটি টাস্ক ম্যানেজমেন্ট প্ল্যাটফর্ম (যেমন Notion, Basecamp, Trello, Asana, বা এমনকি পুরানো ভালো Google Sheets) বেছে নেওয়ার পরামর্শ দিই। একটি ভাল-কার্যকরী এবং সুসংগঠিত দল থাকা অত্যন্ত গুরুত্বপূর্ণ। + +বিভিন্ন ইথেরিয়াম আয়োজক দলের তাদের দলে বিভিন্ন ভূমিকা রয়েছে, তবে তাদের সবার মধ্যে সাধারণ হল এমন লোক যারা লজিস্টিকস, বাজেটিং, মার্কেটিং, প্রোগ্রাম, ডিজাইন এবং অংশীদারিত্ব নিয়ে কাজ করছে। + +### প্রোগ্রাম: একটি সফল ইভেন্টের একটি মূল উপাদান {#the-program-a-key-element-of-a-successful-event} + +যখন একটি সত্যিকারের মূল্যবান এবং স্মরণীয় সম্মেলন আয়োজনের কথা আসে, **প্রোগ্রামই সবকিছু**। এটি এমন কোনো ক্ষেত্র নয় যেখানে আপনি আপস করতে পারেন। যদিও পৃষ্ঠপোষকরা গুরুত্বপূর্ণ এবং প্রায়শই ইভেন্টের অর্থায়নের জন্য অপরিহার্য, দর্শকদের অভিজ্ঞতা এবং তারা যে মূল্য পায় তা অবশ্যই সর্বদা অগ্রাধিকার পাবে। প্রচারমূলক সামগ্রী এবং অন্তহীন পৃষ্ঠপোষক পিচ দিয়ে ওভারলোড করা একটি প্রোগ্রাম আপনার অংশগ্রহণকারীদের বিচ্ছিন্ন করবে এবং আপনার ইভেন্টের বিশ্বাসযোগ্যতা নষ্ট করবে। + +প্রতিটি সেশন, প্যানেল এবং কর্মশালা কমিউনিটিকে অবহিত, অনুপ্রাণিত এবং নিযুক্ত করা উচিত। আপনার শ্রোতাদের কথা শুনুন—তাদের আগ্রহ, চাহিদা এবং চ্যালেঞ্জগুলি বুঝুন। কোন বিষয়গুলি তাদের সাথে অনুরণিত হয়? একই সময়ে, প্রোগ্রামকে গতিশীল রাখতে নতুন দৃষ্টিভঙ্গি এবং উদ্ভাবনী ফর্ম্যাট চালু করুন। ইথেরিয়াম ইকোসিস্টেমের বিভিন্ন দিক—যেমন প্রযুক্তিগত গভীর আলোচনা এবং কমিউনিটি-বিল্ডিং সেশন থেকে শুরু করে নীতি আলোচনা এবং হাতে-কলমে কর্মশালা পর্যন্ত—একটি সুসংহত এজেন্ডা নিশ্চিত করতে পরিচিত এবং ট্রেন্ডিং বিষয়গুলির সাথে অত্যাধুনিক ধারণাগুলির ভারসাম্য বজায় রাখুন। অতিরিক্তভাবে, সম্মেলনের ভাষা বিবেচনা করুন—যদিও বেশিরভাগ ইথেরিয়াম ইভেন্টে ইংরেজি হল ডিফল্ট, স্থানীয় ভাষায় সেশনগুলি অফার করা ইভেন্টটিকে আঞ্চলিক ডেভেলপার এবং উত্সাহীদের জন্য আরও অ্যাক্সেসযোগ্য করে তুলতে পারে। + +**বক্তা নির্বাচন করার সময়, উচ্চ-মানের জমা আকর্ষণ করতে এবং এজেন্ডা কিউরেশনের জন্য পর্যাপ্ত সময় দেওয়ার জন্য সম্মেলনের কমপক্ষে ছয় মাস আগে কল খুলুন।** বক্তা নির্বাচনের জন্য দায়ী ব্যক্তির শিল্পে উল্লেখযোগ্য অভিজ্ঞতা এবং ইকোসিস্টেম সম্পর্কে গভীর বোঝাপড়া থাকা উচিত। এটি নিশ্চিত করে যে তারা মূল্যবান, অন্তর্দৃষ্টিপূর্ণ অবদানগুলি সনাক্ত করতে পারে এবং বিষয়বস্তুর একটি উচ্চ মান বজায় রাখতে পারে। + +### আর্থিক সহায়তা কোথায় পাবেন {#where-to-find-financial-support} + +একটি উচ্চ-মানের সম্মেলন আয়োজনের জন্য উল্লেখযোগ্য খরচ হয় — ভেন্যু ভাড়া, প্রচারমূলক সামগ্রী, খাবার এবং পানীয়, উৎপাদন এবং অগণিত অন্যান্য খরচ। আপনার ইভেন্টটি পেশাদার মান পূরণ করে এবং আপনার অংশগ্রহণকারীদের জন্য একটি দুর্দান্ত অভিজ্ঞতা প্রদান করে তা নিশ্চিত করার জন্য প্রথম দিকে আর্থিক সহায়তা সুরক্ষিত করা অপরিহার্য। + +#### কীভাবে একটি স্পনসরশিপ ডেক তৈরি করবেন? {#how-to-create-a-sponsorship-deck} + +প্রথমে, আপনার একটি ডেক প্রয়োজন হবে। **অন্যান্য সম্মেলন আয়োজকদের কাছে পরামর্শের জন্য জিজ্ঞাসা করুন**, এমনকি তাদের ডেক শেয়ার করতে বলুন যাতে আপনি তার উপর ভিত্তি করে আপনার প্যাকেজ তৈরি করতে পারেন। প্যাকেজগুলির মূল্য নির্ধারণের ক্ষেত্রে আপনার বাস্তববাদী হওয়া উচিত এবং খরচগুলি কভার করার লক্ষ্য রাখা উচিত, অর্থ উপার্জন করা নয়, বিশেষ করে শুরুতে। + +**প্রতিটি স্পনসরশিপ ডেক ইভেন্টের একটি স্পষ্ট এবং আকর্ষণীয় সংক্ষিপ্ত বিবরণ প্রদান করা উচিত**, যাতে সম্ভাব্য পৃষ্ঠপোষকরা এর পরিধি, ফোকাস এবং মূল্য বুঝতে পারে। বিশ্বাসযোগ্যতা প্রতিষ্ঠার জন্য মৌলিক বিষয়গুলি—ভেন্যু, তারিখ এবং আয়োজক দল সম্পর্কে বিস্তারিত—দিয়ে শুরু করুন। তারপরে, ইভেন্টের প্রাথমিক ফোকাসটি তুলে ধরুন, কারণ বিভিন্ন ইথেরিয়াম সম্মেলন বিভিন্ন দর্শকদের জন্য তৈরি করা হয়। কিছু ভারীভাবে নির্মাতা-ভিত্তিক, গভীর প্রযুক্তিগত আলোচনা সমন্বিত, যখন অন্যরা DeFi, DAO বা নীতি বিষয়গুলিতে বেশি মনোযোগ দিতে পারে। + +শুধু ইভেন্টের বর্ণনা দেওয়ার বাইরে, স্পষ্ট প্রত্যাশা সেট করুন। **প্রত্যাশিত অংশগ্রহণকারীর সংখ্যা এবং ইতিমধ্যে নিশ্চিত হওয়া যেকোনো মূল বক্তার রূপরেখা দিন**, কারণ এটি পৃষ্ঠপোষকদের তাদের সম্ভাব্য নাগাল পরিমাপ করতে সাহায্য করে। সবচেয়ে গুরুত্বপূর্ণভাবে, তাদের স্পনসরশিপের বিনিময়ে তারা কী পাবে তা স্পষ্টভাবে সংজ্ঞায়িত করুন—বুথ স্পেস, কথা বলার সুযোগ, সোশ্যাল মিডিয়া প্রচার, ব্র্যান্ডিং দৃশ্যমানতা বা একচেটিয়া নেটওয়ার্কিং অ্যাক্সেস। একটি সুগঠিত ডেক কেবল অবহিতই করে না বরং সম্ভাব্য পৃষ্ঠপোষকদের আপনার ইভেন্টের অংশ হওয়ার সুযোগ সম্পর্কেও উত্তেজিত করে। + +#### কে আপনার ইভেন্টকে সমর্থন করতে পারে? {#who-might-support-your-event} + +আপনার শহর বা দেশের ইথেরিয়াম এবং বৃহত্তর প্রযুক্তি ইকোসিস্টেমের মধ্যে থাকা কোম্পানিগুলির সাথে যোগাযোগ করে শুরু করুন। এই **সংস্থাগুলির প্রায়শই স্থানীয় ইভেন্টগুলিকে সমর্থন করার ক্ষেত্রে একটি নিহিত আগ্রহ থাকে** যা কমিউনিটির বৃদ্ধি এবং উদ্ভাবনকে উৎসাহিত করে। তারা স্থানীয় ইকোসিস্টেমে বিনিয়োগের মূল্যকে স্বীকৃতি দেওয়ার এবং আপনার সম্মেলনকে প্রতিভা, অংশীদার এবং ব্যবহারকারীদের সাথে সংযোগ স্থাপনের একটি সুযোগ হিসাবে দেখার সম্ভাবনা বেশি। + +একবার আপনি স্থানীয় সমর্থনে ট্যাপ করলে, web3 স্পেসে বিশ্বব্যাপী খেলোয়াড়দের কাছে আপনার প্রচার প্রসারিত করুন। **প্রতিষ্ঠিত প্রোটোকল, DAO এবং ইকোসিস্টেম তহবিলগুলি প্রায়শই কমিউনিটি-চালিত ইভেন্টগুলির জন্য বাজেট বরাদ্দ করে**। এটি প্রথমবারের আয়োজকদের জন্য কিছুটা চ্যালেঞ্জিং হতে পারে, কারণ তারা এখনও প্রদর্শনের জন্য একটি ট্র্যাক রেকর্ড তৈরি করেনি তবে একটি আকর্ষণীয় স্পনসরশিপ প্যাকেজ তৈরি করার চেষ্টা করুন যা আপনার ইভেন্টকে সমর্থন করার সুবিধাগুলি স্পষ্টভাবে রূপরেখা দেয় — ব্র্যান্ড দৃশ্যমানতা, কথা বলার সুযোগ এবং একটি লক্ষ্যযুক্ত দর্শকদের সাথে অর্থপূর্ণ সম্পৃক্ততা। আপনার অনন্য মূল্য খুঁজে বের করার চেষ্টা করুন যা অন্যদের কাছে নাও থাকতে পারে। + +#### আপনার ইভেন্টের অর্থায়নের বিকল্প ফর্ম {#alternative-forms-of-funding-your-event} + +অনুদান আরেকটি সম্ভাব্য অর্থায়নের উৎস যা অনেক আয়োজক উপেক্ষা করে। ইথেরিয়াম ফাউন্ডেশনের [ইকোসিস্টেম সাপোর্ট প্রোগ্রাম](https://esp.ethereum.foundation/) (ESP) এবং [অন্যান্য অনুদান উদ্যোগ](https://ethereum.org/community/grants/#ethereum-grants) এর মতো প্রোগ্রামগুলি কমিউনিটি-চালিত ইভেন্টগুলিকে সমর্থন করার জন্য বিদ্যমান। + +আর্থিক স্পনসরশিপের বাইরে, বিশেষ করে খাবার এবং পানীয়ের জন্য ইন-কাইন্ড অংশীদারিত্ব বিবেচনা করুন। স্থানীয় সংস্কৃতি বা প্রযুক্তি কমিউনিটির সাথে সারিবদ্ধ ব্র্যান্ডগুলি আপনার ইভেন্টের জন্য দুর্দান্ত অংশীদার হতে পারে। কফি ব্র্যান্ড, পানীয় কোম্পানি, বা এমনকি স্থানীয় পিজারিয়াগুলি ইভেন্টে দৃশ্যমানতার বিনিময়ে পণ্য সরবরাহ করতে ইচ্ছুক হতে পারে। এই সহযোগিতাগুলি খরচ কমাতে সাহায্য করতে পারে এবং অংশগ্রহণকারীর অভিজ্ঞতা বাড়াতে পারে। + +যেহেতু আমরা অর্থায়নের বিষয়ে কথা বলছি, মনে রাখবেন: একটি ব্যতিক্রমী অংশগ্রহণকারীর অভিজ্ঞতা তৈরি করতে আপনি যে প্রতিটি ডলার বিনিয়োগ করেন তা দ্রুতগতিতে ফল দেবে। উচ্চ-মানের উৎপাদন, আরামদায়ক ভেন্যু, চিন্তাশীল সোয়াগ এবং সুসংগঠিত সাইড ইভেন্টগুলি একটি স্মরণীয় অভিজ্ঞতায় অবদান রাখে যা অংশগ্রহণকারীরা সম্মেলন শেষ হওয়ার অনেক পরেও কথা বলবে। খুশি অংশগ্রহণকারীরা আপনার সবচেয়ে বড় সমর্থক হয়ে ওঠে এবং আপনার ইভেন্টের দীর্ঘমেয়াদী সাফল্য নিশ্চিত করে। + +### লজিস্টিকস {#logistics} + +তহবিল সুরক্ষার পাশাপাশি আপনার মূল ফোকাস হওয়া উচিত লজিস্টিকস। একটি সুসংগঠিত সম্মেলনের জন্য ভেন্যু সেটআপ থেকে শুরু করে অংশগ্রহণকারীর অভিজ্ঞতা পর্যন্ত একাধিক ক্ষেত্রে সূক্ষ্ম পরিকল্পনার প্রয়োজন। ইভেন্ট সংগঠনে sólida অভিজ্ঞতা সহ কাউকে থাকা — অগত্যা web3 ইভেন্ট নয়, তবে সাধারণভাবে ইভেন্ট — একটি বিশাল পার্থক্য তৈরি করতে পারে। একজন অভিজ্ঞ লজিস্টিকস লিড সম্ভাব্য সমস্যাগুলি পূর্বানুমান করতে পারেন এবং সেগুলি সমস্যা হওয়ার আগে সমাধান করতে পারেন, সময়, অর্থ এবং চাপ সাশ্রয় করে। + +লজিস্টিকসের জন্য দায়ী একজন ব্যক্তির একটি ভেন্যু, প্রোডাকশন কোম্পানি এবং খাবার, পানীয় এবং মার্চের জন্য বিভিন্ন বিক্রেতা বেছে নেওয়া উচিত, সেইসাথে একটি সহজে ব্যবহারযোগ্য অনলাইন টিকেটিং সিস্টেম যা অংশগ্রহণকারীদের ক্রিপ্টোতে নিবন্ধন এবং অর্থ প্রদান করতে দেয়। + +### অবস্থান পরিকাঠামো {#location-infrastructure} + +আপনার সম্মেলনের জন্য একটি অবস্থান নির্বাচন করার সময়, ভেন্যুর বাইরে চিন্তা করা এবং বৃহত্তর শহর এবং দেশের পরিকাঠামো বিবেচনা করা গুরুত্বপূর্ণ। আবহাওয়া, গতিশীলতা, নিরাপত্তা এবং রাজনৈতিক পরিবেশের মতো কারণগুলি অংশগ্রহণকারীর অভিজ্ঞতা গঠনে একটি বিশাল ভূমিকা পালন করে। + +কম পরিচিত অবস্থানগুলির জন্য, এটি বিশেষভাবে গুরুত্বপূর্ণ হয়ে ওঠে। বিশ্বজুড়ে অংশগ্রহণকারী এবং পৃষ্ঠপোষকদের আত্মবিশ্বাসী বোধ করতে হবে যে তারা সহজে এবং নিরাপদে ভ্রমণ করতে পারে। বিমানবন্দর সংযোগ, গণপরিবহন এবং বাসস্থানের বিকল্পগুলির মতো দিকগুলি দেখুন। ভিসা নীতির মতো আন্তর্জাতিক অংশগ্রহণকারীদের নিরুৎসাহিত করতে পারে এমন কোনো জটিলতা এড়াতে অঞ্চলের সাংস্কৃতিক এবং রাজনৈতিক জলবায়ু বিবেচনা করাও বুদ্ধিমানের কাজ। + +### ইভেন্টের প্রচার কীভাবে করবেন {#how-to-promote-the-event} + +আপনার ইভেন্টের কার্যকরভাবে প্রচার করা সঠিক দর্শকদের আকর্ষণ করা এবং উত্তেজনা তৈরি করার চাবিকাঠি। একটি সুচিন্তিত প্রচার কৌশল নিশ্চিত করে যে আপনার সম্মেলনটি তার প্রাপ্য দৃশ্যমানতা এবং সম্পৃক্ততা পায়। ডিজাইন আপনার ব্র্যান্ডেও একটি গুরুত্বপূর্ণ ভূমিকা পালন করে, তাই আপনার অবশ্যই এর জন্য বাজেট করা উচিত। + +#### সোশ্যাল মিডিয়া {#social-media} + +X.com আপনার সোশ্যাল মিডিয়া প্রচারের মেরুদণ্ড হবে। সেখানে পোস্ট করার ক্ষেত্রে সক্রিয় এবং সামঞ্জস্যপূর্ণ হওয়ার চেষ্টা করুন, তবে আপনার ব্যক্তিগত একাউন্ট এবং আপনার সংস্থার একাউন্ট উভয়ের সাথে বিভিন্ন কথোপকথনেও নিযুক্ত হন। + +যদিও LinkedIn প্রচারের জন্য সবচেয়ে সুস্পষ্ট পছন্দ বলে মনে হয় না, আপনি সেখানে সম্পূর্ণ ভিন্ন দর্শকদের কাছে পৌঁছাতে পারেন, এমনকি কিছু পৃষ্ঠপোষকের কাছেও। + +#### অন্যান্য ইথেরিয়াম কমিউনিটির সাথে অংশীদারিত্ব {#partnerships-with-other-ethereum-communities} + +বিভিন্ন ইথেরিয়াম আয়োজকদের সাথে অংশীদারিত্ব বিদ্যমান নেটওয়ার্কগুলিতে ট্যাপ করে আপনার নাগাল বাড়াতে সাহায্য করতে পারে, বিশেষ করে যখন আপনি শূন্য থেকে শুরু করছেন। কমিউনিটি ডিসকাউন্ট অফার করুন, অন্যান্য ইভেন্টের সাথে ক্রস-প্রমোট করুন এবং অংশীদারদের সাইড ইভেন্ট বা ওয়ার্কশপ সহ-হোস্ট করার জন্য আমন্ত্রণ জানান। + +#### বিশ্ববিদ্যালয় আউটরিচ {#university-outreach} + +ইভেন্টের প্রচারের জন্য ছাত্র ক্লাব বা অধ্যাপকদের মাধ্যমে শহরের প্রযুক্তিগত এবং অর্থনীতি অনুষদগুলির সাথে যোগাযোগ করুন। বিশ্ববিদ্যালয়গুলির সাথে জড়িত হওয়া তরুণ প্রতিভা, গবেষক এবং ভবিষ্যত শিল্প পেশাদারদের আকর্ষণ করতে সাহায্য করতে পারে, যা একাডেমিয়া এবং ইথেরিয়াম ইকোসিস্টেমের মধ্যে একটি শক্তিশালী সংযোগ গড়ে তোলে। এটি বিশেষভাবে দুর্দান্ত যদি আপনি একটি হ্যাকাথনের আয়োজন করেন, কারণ শিক্ষার্থীরা প্রায়শই নতুন ধারণা, উত্সাহ এবং একটি শক্তিশালী প্রযুক্তিগত ভিত্তি নিয়ে আসে। + +#### মিডিয়া {#media} + +ইভেন্ট কভারেজের জন্য web3-কেন্দ্রিক মিডিয়া আউটলেট এবং নিউজলেটারগুলির সাথে যোগাযোগ করুন। যদিও Web3 মিডিয়া তাদের PR নিবন্ধগুলির জন্য অর্থপ্রদানের আশা করে, আপনি যদি প্রদত্ত প্রচারের জন্য বাজেট না থাকে তবে তাদের বিনামূল্যে টিকিট বা কিছু হাই-প্রোফাইল স্পিকার এবং পৃষ্ঠপোষকদের সাথে সাক্ষাত্কার অফার করতে পারেন। একটি প্রেস রিলিজ এবং কিছু ভিজ্যুয়াল সহ একটি PR প্যাকেজ তৈরি করুন যা সোশ্যাল মিডিয়া বা একটি ওয়েবসাইটে বিভিন্ন ফর্ম্যাটে প্রচারের জন্য প্রস্তুত। এছাড়াও, স্থানীয় সাংবাদিক বা এমনকি কন্টেন্ট ক্রিয়েটরদের (যতক্ষণ তাদের একটি শালীন খ্যাতি থাকে) কাছে সুযোগ প্রসারিত করুন যারা প্রযুক্তি কভার করতে পারে, কারণ এটি বৃহত্তর দর্শকদের কাছে ইভেন্টটি প্রদর্শন করার জন্য অত্যন্ত গুরুত্বপূর্ণ হতে পারে। এটি ক্রিপ্টো শিল্প এবং বৃহত্তর জনসাধারণের মধ্যে ব্যবধান পূরণ করতে সাহায্য করে, মূলধারার প্রযুক্তি এবং ব্যবসায়িক কমিউনিটি থেকে আগ্রহ আকর্ষণ করে। + +### আপনার কি একটি হ্যাকাথনও আয়োজন করা উচিত? {#should-you-organize-a-hackathon-as-well} + +একটি হ্যাকাথনের আয়োজন করা উপকারী হতে পারে কারণ হ্যাকাথন ডেভেলপার কমিউনিটিকে জড়িত করার এবং উদ্ভাবনকে উৎসাহিত করার একটি দুর্দান্ত উপায় হতে পারে। এটি সহযোগিতা এবং প্রকল্প তৈরির জন্য হাতে-কলমে সুযোগও প্রদান করে, যা ইকোসিস্টেমের জন্য বাস্তব ফলাফলের দিকে নিয়ে যেতে পারে। হ্যাকাথন এমন ডেভেলপারদের আকর্ষণ করে যারা সাধারণত সম্মেলনে যোগ দেয় না কিন্তু নতুন ধারণা তৈরি এবং পরীক্ষা করার চ্যালেঞ্জের প্রতি আগ্রহী। যদি আপনার সম্মেলন ডেভেলপার, উদ্ভাবন এবং হাতে-কলমে প্রকল্পগুলির লক্ষ্যে হয়, তবে একটি হ্যাকাথনের আয়োজন করা একটি স্বাভাবিক ব্যাপার। + +কিন্তু, একটি আয়োজন করার আগে, আপনার কাছে যথেষ্ট রিসোর্স এবং সময় আছে কিনা তা বিবেচনা করুন। **একটি হ্যাকাথনের জন্য সময়, জনশক্তি এবং আর্থিক বিনিয়োগের ক্ষেত্রে উল্লেখযোগ্য রিসোর্সের প্রয়োজন**। নিশ্চিত করুন যে আপনার কাছে এটি পরিচালনা করার জন্য একটি নিবেদিত দল আছে, বিশেষ করে যদি আপনি একটি সম্মেলনও পরিচালনা করেন। এছাড়াও, আপনার কমিউনিটিতে আগ্রহ আছে কিনা তা পরীক্ষা করুন। যদি আপনার কমিউনিটি বেশি নির্মাতা-ভিত্তিক হয়, তবে সম্ভবত এটি আয়োজন করা অর্থপূর্ণ। + +যদিও এটি আয়োজন করার অনেক সুবিধা রয়েছে, তবে বিবেচনায় নিন যে, সম্মেলনের স্কেলের উপর নির্ভর করে, একটি হ্যাকাথন যোগ করা অপ্রতিরোধ্য হতে পারে। উভয়টি পরিচালনা করলে কোনোটির গুণমান কমে যাবে কিনা তা আপনার মূল্যায়ন করা উচিত। আপনি একটি ছোট, ফোকাসড হ্যাকাথনের জন্য বেছে নিতে পারেন বা বিভিন্ন মাস জুড়ে ইভেন্টগুলি স্তিমিত করতে পারেন। + +### (প্রায় অনিবার্য) চ্যালেঞ্জ যা আপনি সম্মুখীন হবেন {#almost-inevitable-challenges-that-you-will-face} + +একটি সম্মেলন আয়োজনের সময়, বিশেষ করে ইথেরিয়াম স্পেসে, সবচেয়ে বড় চ্যালেঞ্জগুলির মধ্যে একটি হল পর্যাপ্ত তহবিল সুরক্ষিত করা। **অনেক ইভেন্ট আয়োজক ভেন্যু খরচ**, ক্যাটারিং এবং অন্যান্য লজিস্টিক খরচ কভার করার জন্য প্রয়োজনীয় মূলধন সংগ্রহ করতে সংগ্রাম করে। স্পনসরশিপ প্রায়শই অপরিহার্য, কিন্তু সম্পর্ক তৈরি করা এবং কোম্পানিগুলিকে আপনার ইভেন্টে বিনিয়োগ করতে রাজি করানো সময়সাপেক্ষ হতে পারে। তাছাড়া, বাজারের মন্দার সময় পৃষ্ঠপোষকদের আকর্ষণ করার অসুবিধা বাড়তে পারে, কারণ কোম্পানিগুলি নন-কোর কার্যক্রমে বিনিয়োগ করতে কম ইচ্ছুক হতে পারে। + +বাজেট কার্যকরভাবে পরিচালনা করা চাবিকাঠি। **অপ্রত্যাশিত খরচ**, যেমন শেষ মুহূর্তের ভেন্যু পরিবর্তন এবং অতিরিক্ত ইভেন্ট প্রযুক্তির প্রয়োজনীয়তা, দ্রুত আপনার বাজেট নষ্ট করে দিতে পারে। + +নতুন ইভেন্টগুলির জন্য, **উচ্চ-মানের বক্তা পাওয়া বিশেষভাবে কঠিন হতে পারে**। ইথেরিয়াম স্পেসে প্রতিষ্ঠিত চিন্তাশীল নেতা বা প্রভাবশালী ব্যক্তিদের ইতিমধ্যে সম্পূর্ণ সময়সূচী থাকতে পারে এবং একটি প্রমাণিত ট্র্যাক রেকর্ড ছাড়া একটি নতুন ইভেন্টে প্রতিশ্রুতি দিতে দ্বিধা বোধ করতে পারে। ইভেন্টের অনেক আগে থেকেই নেটওয়ার্কিং এবং সম্ভাব্য বক্তাদের কাছে পৌঁছানোর জন্য সময় ব্যয় করার জন্য প্রস্তুত থাকুন। + +এছাড়াও, যখন বক্তাদের কথা আসে, তাদের সাথে স্পষ্ট এবং ধ্রুবক যোগাযোগ রাখুন — উপস্থাপনা পাঠানোর জন্য সময়সীমা সেট করুন এবং শেষ মুহূর্তের কোনো পরিবর্তন এড়িয়ে চলুন। + +একটি সফল সম্মেলনের জন্য একটি নিবেদিত দল প্রয়োজন যা লজিস্টিকস, মার্কেটিং, স্পনসরশিপ, প্রযুক্তিগত সহায়তা এবং অংশগ্রহণকারী ব্যবস্থাপনা পরিচালনা করতে পারে। প্রযুক্তি ইভেন্ট আয়োজনের অভিজ্ঞতা সম্পন্ন ব্যক্তিদের খুঁজে পাওয়া চ্যালেঞ্জিং হতে পারে, বিশেষ করে যদি আপনি একটি ছোট বাজেট নিয়ে কাজ করেন বা, বেশিরভাগ ক্ষেত্রে, কোনো বাজেট ছাড়াই, কিন্তু একটি স্বেচ্ছাসেবী ভিত্তিতে। + +### আপনার এটি একা করা উচিত নয়। আপনার স্বেচ্ছাসেবক প্রয়োজন। {#you-shouldnt-do-it-alone-you-need-volunteers} + +একটি ইথেরিয়াম ইভেন্টের আয়োজনের জন্য লজিস্টিকস, রেজিস্ট্রেশন, স্পিকার সমন্বয়, অংশগ্রহণকারী সমর্থন এবং আরও অনেক কিছু পরিচালনা করার জন্য একটি বৈচিত্র্যময় এবং নিবেদিত দল প্রয়োজন। মাত্র 3 থেকে 15 জনের দলের আকারের সাথে, এটি স্পষ্ট হয়ে যায় যে ইভেন্টের মসৃণ পরিচালনার জন্য স্বেচ্ছাসেবকরা অপরিহার্য। + +স্বেচ্ছাসেবকরা প্রায়শই অনেক সম্মেলনের মেরুদণ্ড, যা গুরুত্বপূর্ণ সমর্থন প্রদান করে, বিশেষ করে যখন আপনি একটি সীমিত বাজেট নিয়ে কাজ করছেন। তারা রেজিস্ট্রেশন ডেস্ক পরিচালনা করা থেকে শুরু করে ইভেন্ট সেটআপে সহায়তা করা পর্যন্ত সবকিছু পরিচালনা করতে পারে, নিশ্চিত করে যে ইভেন্টটি যতটা সম্ভব মসৃণভাবে চলে। + +যদিও স্বেচ্ছাসেবকদের আর্থিক ক্ষতিপূরণ অফার করা চ্যালেঞ্জিং, তবে তাদের এমন কিছু মূল্যবান জিনিস প্রদান করা অপরিহার্য যা তাদের অভিজ্ঞতাকে সার্থক করে তুলবে। তাদের নেটওয়ার্কিং সুযোগ, দক্ষতা উন্নয়ন, কিছু একচেটিয়া সুবিধা, সার্টিফিকেট বা সুপারিশপত্র অফার করার কথা বিবেচনা করুন। + +### ইভেন্ট আয়োজকদের জন্য কমপ্লায়েন্সের অপরিহার্য বিষয়গুলি {#compliance-essentials-for-event-organizers} + +একটি ইভেন্ট আয়োজন করার সময়, বেশ কিছু অপরিহার্য আইনি এবং লজিস্টিক বিবেচনা মাথায় রাখতে হবে: + +- **স্পনসরশিপ চুক্তি** – নিশ্চিত করুন যে আপনার স্পনসরদের জন্য একটি স্পষ্ট চুক্তি আছে, যার মধ্যে একটি সুসংজ্ঞায়িত বাতিলকরণ নীতি অন্তর্ভুক্ত রয়েছে। +- **আচরণবিধি** – নির্দিষ্ট ইভেন্টের ধরন (সম্মেলন/হ্যাকাথন, হ্যাকার হাউস ইত্যাদি) অনুসারে একটি আচরণবিধি প্রস্তুত করুন। +- **গোপনীয়তা নীতি** – ডেটা সুরক্ষা প্রবিধান এবং ছবি মেনে চলার জন্য আপনার ওয়েবসাইটের জন্য একটি গোপনীয়তা নীতি খসড়া করুন +- **স্থানীয় কর্তৃপক্ষকে বিজ্ঞপ্তি** – এমনকি যদি আপনার ইভেন্টটি একটি বন্ধ সমাবেশ হয়, তবে এটি স্থানীয় থানায় রিপোর্ট করার পরামর্শ দেওয়া হয়। +- **টিকেটিং চুক্তি** – শর্তাবলী এবং দায়িত্ব স্পষ্ট করার জন্য আপনার টিকেটিং পরিষেবা প্রদানকারীর সাথে একটি আনুষ্ঠানিক চুক্তি স্থাপন করুন। +- **নিয়ন্ত্রক সম্মতি** – আগে থেকে পরীক্ষা করে নিন যে আপনি যে দেশে সম্মেলন আয়োজন করছেন সেখানে ক্রিপ্টো শিল্পের জন্য নির্দিষ্ট প্রবিধান বা বিধিনিষেধ আছে কিনা +- **মার্চেন্ডাইজের জন্য কাস্টমস ক্লিয়ারেন্স** – যদি আপনি স্পনসর মার্চেন্ডাইজ আমদানি করেন, তবে প্রক্রিয়াটি দক্ষতার সাথে পরিচালনা করার জন্য একজন কাস্টমস এজেন্ট নিয়োগ করার পরামর্শ দেওয়া হয়। +- **ফটোগ্রাফি এবং মিডিয়া নীতি** – ফটোগ্রাফি এবং মিডিয়া কভারেজের উপর নির্দেশিকা স্পষ্টভাবে সংজ্ঞায়িত করুন, নিশ্চিত করুন যে অংশগ্রহণকারীদের সম্মতি এবং অপ্ট-আউট বিকল্পগুলি সম্পর্কে অবহিত করা হয়েছে। + +## ইভেন্টের পরে: এরপর কী? {#after-the-event-whats-next} + +ইভেন্ট শেষ হওয়ার পরে, অংশগ্রহণকারী, বক্তা এবং পৃষ্ঠপোষকদের কাছ থেকে প্রতিক্রিয়া সংগ্রহ করা এবং একটি অভ্যন্তরীণ প্রতিবেদন তৈরি করা অত্যন্ত গুরুত্বপূর্ণ যাতে আপনি ভবিষ্যতের ইভেন্টগুলির জন্য আরও ভালভাবে প্রস্তুত হতে পারেন। এটি কী ভাল হয়েছে এবং কোথায় উন্নতি করা যেতে পারে তা সনাক্ত করতে সাহায্য করে। ভবিষ্যত পুনরাবৃত্তিগুলিকে গাইড করবে এমন মূল্যবান অন্তর্দৃষ্টি সংগ্রহ করতে সমীক্ষা বা একের পর এক সাক্ষাত্কার ব্যবহার করুন। যেকোনো ভুল বা অদক্ষতার ক্ষেত্র পর্যালোচনা করার জন্য সময় নিন, কারণ সেগুলি পরবর্তী সম্মেলনে এড়ানো যেতে পারে, যা প্রক্রিয়াটিকে মসৃণ করে তুলবে। + +মূল বিষয় হল গতিকে বাঁচিয়ে রাখা। আপনার কমিউনিটির সাথে যুক্ত থাকুন, তাদের প্রতিক্রিয়ার উপর ভিত্তি করে আপনার করা অগ্রগতির আপডেটগুলি শেয়ার করুন এবং পরবর্তী ইভেন্টের জন্য উত্তেজনা তৈরি করুন। এই সংযোগ বজায় রেখে, আপনি নিশ্চিত করেন যে সম্মেলনের প্রভাব ইভেন্টের বাইরেও প্রসারিত হয়, সম্পর্ককে শক্তিশালী করে এবং ভবিষ্যতের সাফল্যের জন্য মঞ্চ স্থাপন করে। + +## স্বীকৃতি {#acknowledgement} + +এই নিবন্ধে তাদের অন্তর্দৃষ্টি শেয়ার করে অবদান রাখার জন্য সবাইকে অনেক ধন্যবাদ: ETHBratislava থেকে স্লাভো ফ্যাবিসিক; ETH কিপু এবং ETH Latam থেকে লোলা; ETH Belgrade থেকে তাঞ্জা ম্লাডেনোভিচ, ইথেরিয়াম বোগোটা থেকে হুয়ান ডেভিড; ETHWarsaw থেকে মনিকা জাজ্যাক; NapulETH থেকে রাফায়েল ওরেফিস; ETH রিয়াদ থেকে জিয়াও উ(লিং); urbe.eth থেকে মার্কো; ETH ডাবলিন থেকে কাওলান ওয়ালশ; ETHCluj থেকে অ্যালেক্স ম্যালস; এবং ETH স্লোভেনিয়া থেকে স্ট্যাঙ্কো ডেভিচ। + +## রিসোর্স {#resources} + +পডকাস্ট: কীভাবে একটি ETH ইভেন্ট A-Z থেকে আয়োজন এবং প্রচার করবেন: + +- [The ETHWarsaw কেস স্টাডি, Out of Ordinary দ্বারা](https://www.youtube.com/watch?v=io2Dx1ouz8o) + +টুইটার স্পেস: + +- [ETH কমিউনিটি AMA](https://x.com/NapulETH/status/1905732699094151623) + +আর্টিকেল সমূহ: + +- [ETHKL নির্মাণ, ড্যানি এইচ দ্বারা](https://sekto.tech/ethkl24) +- [POKT ইভেন্টস প্লেবুক](https://docs.pokt.network/community/pokt-events-playbook) diff --git a/public/content/translations/bn/community/get-involved/index.md b/public/content/translations/bn/community/get-involved/index.md new file mode 100644 index 00000000000..d85af8c37e0 --- /dev/null +++ b/public/content/translations/bn/community/get-involved/index.md @@ -0,0 +1,132 @@ +--- +title: "আমি কিভাবে জড়িত হতে পারি?" +description: "ইথেরিয়াম কমিউনিটিতে যুক্ত হওয়ার উপায়" +lang: bn +--- + +# আমি কিভাবে জড়িত হতে পারি? যুক্ত হোন {#get-involved} + +ইথেরিয়াম কমিউনিটিতে বিভিন্ন পটভূমি এবং দক্ষতার মানুষ অন্তর্ভুক্ত। আপনি একজন ডেভেলপার, শিল্পী বা হিসাবরক্ষক যা-ই হোন না কেন, এতে জড়িত হওয়ার বিভিন্ন উপায় রয়েছে। এখানে কিছু পরামর্শের একটি তালিকা রয়েছে যা আপনাকে শুরু করতে সাহায্য করতে পারে। + +আমাদের [আচরণবিধিতে](/community/code-of-conduct) ethereum.org-এর লক্ষ্য এবং মান সম্পর্কে পড়ার মাধ্যমে শুরু করুন। + +## ডেভেলপার ‍ {#developers} + +- [ethereum.org/developers/](/developers/)-এ ইথেরিয়াম সম্পর্কে জানুন এবং চেষ্টা করুন +- আপনার কাছাকাছি একটি [ETHGlobal](http://ethglobal.co/) হ্যাকাথনে যোগ দিন! +- [আপনার দক্ষতার ক্ষেত্র বা পছন্দের প্রোগ্রামিং ভাষার সাথে সম্পর্কিত প্রকল্পগুলি](/developers/docs/programming-languages/) দেখুন +- [কনসেন্সাস এবং এক্সিকিউশন লেয়ার কলগুলিতে](https://www.youtube.com/@EthereumProtocol/streams) দেখুন বা অংশগ্রহণ করুন +- [ইকোসিস্টেম সাপোর্ট প্রোগ্রামের উইশলিস্ট](https://esp.ethereum.foundation/wishlist/) - টুলিং, ডকুমেন্টেশন এবং পরিকাঠামো ক্ষেত্র যেখানে ইথেরিয়াম ইকোসিস্টেম সাপোর্ট প্রোগ্রাম সক্রিয়ভাবে অনুদানের আবেদনপত্র খুঁজছে +- [Web3Bridge](https://www.web3bridgeafrica.com) - আফ্রিকা জুড়ে শত শত ডেভেলপার এবং কমিউনিটি সদস্যদের শনাক্ত করতে, প্রশিক্ষণ দিতে এবং সমর্থন করার জন্য তাদের উদ্যোগে উচ্চাকাঙ্ক্ষী web3 কমিউনিটিতে যোগ দিন +- [Eth R&D Discord](https://discord.com/invite/VmG7Uxc)-এ যোগ দিন +- [Ethereum Cat Herders Discord](https://discord.com/invite/Nz6rtfJ8Cu)-এ যোগ দিন + +## গবেষক এবং শিক্ষাবিদ ‍ {#researchers-and-academics} + +আপনার কি গণিত, ক্রিপ্টোগ্রাফি বা অর্থনীতিতে কোনো অভিজ্ঞতা আছে? আপনি ইথেরিয়াম ইকোসিস্টেমের মধ্যে করা কিছু অত্যাধুনিক কাজে আগ্রহী হতে পারেন: + +- [Eth R&D Discord](https://discord.com/invite/VmG7Uxc)-এ যোগ দিন +- একটি ইথেরিয়াম ইম্প্রুভমেন্ট প্রোপোজাল লিখুন বা পর্যালোচনা করুন + - একটি EIP লিখুন + 1. আপনার ধারণা [Ethereum Magicians](https://ethereum-magicians.org)-এ জমা দিন + 2. [EIP-1](https://eips.ethereum.org/EIPS/eip-1) পড়ুন - **হ্যাঁ, এটাই _পুরো_ ডকুমেন্ট।** + 3. EIP-1-এর নির্দেশাবলী অনুসরণ করুন। আপনি আপনার খসড়া লেখার সময় এটি রেফারেন্স হিসাবে ব্যবহার করুন। + - কীভাবে একজন [EIP সম্পাদক](https://eips.ethereum.org/EIPS/eip-5069) হওয়া যায় তা শিখুন + - আপনি এখনই EIP-গুলো পিয়ার-রিভিউ করতে পারেন! ["e-review" ট্যাগসহ খোলা PR-গুলো](https://github.com/ethereum/EIPs/pulls?q=is%3Apr+is%3Aopen+label%3Ae-review) দেখুন। `discussion-to` লিঙ্কে প্রযুক্তিগত প্রতিক্রিয়া প্রদান করুন। + - [EIP গভর্নেন্সে](https://github.com/ethereum-cat-herders/EIPIP) অংশগ্রহণ করুন + - [Ethereum Cat Herders Discord](https://discord.com/invite/Nz6rtfJ8Cu)-এ যোগ দিন + - [EIPs সম্পর্কে আরও](/eips/) +- [Challenges.ethereum.org](https://challenges.ethereum.org/) - উচ্চ-মূল্যের গবেষণা পুরস্কারের একটি সিরিজ, যেখানে আপনি >$100,000 USD উপার্জন করতে পারেন +- [Ethresear.ch](https://ethresear.ch) - গবেষণার জন্য ইথেরিয়ামের প্রাথমিক ফোরাম, এবং ক্রিপ্টোইকোনমিক্সের জন্য বিশ্বের সবচেয়ে প্রভাবশালী ফোরাম +- [EF রিসার্চ AMA](https://old.reddit.com/r/ethereum/comments/vrx9xe/ama_we_are_ef_research_pt_8_07_july_2022) - গবেষকদের সাথে একটি চলমান প্রশ্নোত্তর সিরিজ। পরবর্তী প্রতিটি পর্ব শুরু হলে, যে কেউ প্রশ্ন পোস্ট করতে পারেন। +- [ইকোসিস্টেম সাপোর্ট প্রোগ্রামের উইশলিস্ট](https://esp.ethereum.foundation/wishlist/) - গবেষণার ক্ষেত্র যেখানে ইথেরিয়াম ইকোসিস্টেম সাপোর্ট প্রোগ্রাম সক্রিয়ভাবে অনুদানের আবেদনপত্র খুঁজছে +- [AllWalletDevs](https://allwallet.dev) - ইথেরিয়াম ডেভেলপার, ডিজাইনার এবং আগ্রহী ব্যবহারকারীদের জন্য একটি ফোরাম, যেখানে তারা নিয়মিত একত্রিত হয়ে ওয়ালেট নিয়ে আলোচনা করতে পারেন + +[গবেষণার আরও সক্রিয় ক্ষেত্রগুলো অন্বেষণ করুন](/community/research/)। + +## অ-প্রযুক্তিগত দক্ষতাসমূহ ‍ {#non-technical} + +আপনি যদি ডেভেলপার না হন, তাহলে ইথেরিয়ামে কোথা থেকে শুরু করবেন তা জানা কঠিন হতে পারে। এখানে নির্দিষ্ট পেশাগত অভিজ্ঞতার জন্য রিসোর্সসহ কয়েকটি পরামর্শ দেওয়া হলো। + +### আপনার শহরে একটি মিটআপের আয়োজন করুন {#meetups} + +- কিভাবে শুরু করবেন নিশ্চিত নন? [BUIDL নেটওয়ার্ক](https://consensys.net/developers/buidlnetwork/) সাহায্য করতে পারে। + +### ইথেরিয়াম সম্পর্কে বিষয়বস্তু লিখুন {#write-content} + +- ইথেরিয়ামের ভালো লেখক প্রয়োজন যারা সহজ ভাষায় এর গুরুত্ব ব্যাখ্যা করতে পারেন +- আপনার নিজের নিবন্ধ প্রকাশ করার জন্য প্রস্তুত নন? কমিউনিটি রিসোর্সে বিদ্যমান সামগ্রীতে অবদান রাখার কথা বিবেচনা করুন, অথবা [ethereum.org-এর জন্য নতুন সামগ্রী প্রস্তাব করুন](/contributing/)! + +### কমিউনিটি কলের জন্য নোট নেওয়ার প্রস্তাব দিন {#take-notes} + +- অনেক ওপেন-সোর্স কমিউনিটি কল আছে, এবং নোট গ্রহণকারী থাকা একটি বিশাল সাহায্য। আপনি যদি আগ্রহী হন, তাহলে [Ethereum Cat Herders discord](https://discord.com/invite/Nz6rtfJ8Cu)-এ যোগ দিন, এবং নিজের পরিচয় দিন! + +### আপনার মাতৃভাষায় ইথেরিয়ামের বিষয়বস্তু অনুবাদ করুন {#translate-ethereum} + +- ethereum.org একটি অনুবাদ প্রোগ্রাম পরিচালনা করে যা ওয়েবসাইট এবং অন্যান্য রিসোর্সকে বিভিন্ন ভাষায় অনুবাদ করে +- কীভাবে যুক্ত হবেন তা [এখানে](/contributing/translation-program) জানুন + +### একটি নোড চালান {#run-a-node} + +ইথেরিয়ামকে আরও বিকেন্দ্রীভূত করতে সাহায্য করার জন্য হাজার হাজার নোড অপারেটরের সাথে যোগ দিন। + +- [কীভাবে একটি নোড চালাতে হয় সে সম্পর্কে আরও জানুন](/developers/docs/nodes-and-clients/run-a-node/) + +### আপনার ETH স্টেক করুন {#staking} + +আপনার ETH স্টেক করে আপনি ইথেরিয়াম নেটওয়ার্ককে সুরক্ষিত করতে সাহায্য করার পাশাপাশি পুরস্কার অর্জন করতে পারেন। + +- [স্টেকিং সম্পর্কে আরও](/staking/) + +### প্রকল্প সমর্থন করুন {#support-projects} + +ইথেরিয়াম ইকোসিস্টেমের লক্ষ্য হলো পাবলিক গুডস এবং প্রভাবশালী প্রকল্পগুলোতে অর্থায়ন করা। খুব ছোট অনুদানের মাধ্যমে আপনি আপনার সমর্থন দেখাতে পারেন এবং গুরুত্বপূর্ণ কাজ বাস্তবায়িত হতে দিতে পারেন। + +- [Gitcoin](https://gitcoin.co/fund) +- [clr.fund](https://clr.fund/#/about) + +## আর্থিক পেশাদার এবং হিসাবরক্ষক ‍ {#financial-professionals} + +- ইথেরিয়াম হলো "ডিসেন্ট্রালাইজড ফাইন্যান্স" ইকোসিস্টেমের হোম - এটি প্রোটোকল এবং অ্যাপ্লিকেশনের একটি নেটওয়ার্ক যা একটি বিকল্প আর্থিক ব্যবস্থা অফার করে। আপনি যদি একজন আর্থিক পেশাদার হন, তাহলে [DeFi Llama](https://defillama.com/) বা [DeFiPrime](https://defiprime.com)-এ কিছু DeFi অ্যাপ দেখুন +- হিসাবরক্ষক? ইথেরিয়ামের সম্পদ - ETH, টোকেন, DeFi, ইত্যাদি - অনেক নতুন অ্যাকাউন্টিং সমস্যা তৈরি করে। আপনি ক্রিপ্টোকারেন্সি ব্যবহারকারীদের তাদের বুককিপিং এবং অ্যাকাউন্টিং চ্যালেঞ্জ সমাধানে সাহায্য করার লক্ষ্যে কিছু প্রকল্প দেখে শুরু করতে পারেন, যেমন [Rotki](https://rotki.com/) + +## প্রোডাক্ট ম্যানেজার ‍ {#product-managers} + +- ইথেরিয়াম ইকোসিস্টেমের আপনার প্রতিভা প্রয়োজন! অনেক কোম্পানি প্রোডাক্ট ম্যানেজারের ভূমিকার জন্য নিয়োগ করছে। আপনি যদি একটি ওপেন সোর্স প্রকল্পে অবদান রেখে শুরু করতে চান, তাহলে [Ethereum Cat Herders](https://discord.com/invite/Nz6rtfJ8Cu) বা [RaidGuild](https://www.raidguild.org/)-এর সাথে যোগাযোগ করুন + +## মার্কেটিং ‍ {#marketing} + +- ইথেরিয়াম ইকোসিস্টেমে অনেক মার্কেটিং এবং কমিউনিকেশন পদ রয়েছে! + +## ইথেরিয়াম চাকরি {#ethereum-jobs} + +**ইথেরিয়ামে কাজ করার জন্য চাকরি খুঁজছেন?** + +- [ethereum.org চাকরি](/about/#open-jobs) +- [ইথেরিয়াম ফাউন্ডেশন জব বোর্ড](https://jobs.ashbyhq.com/ethereum-foundation) +- [JobStash](https://jobstash.xyz) +- [ইথেরিয়াম জব বোর্ড](https://www.ethereumjobboard.com/) +- [ক্রিপ্টোকারেন্সি জবস](https://cryptocurrencyjobs.co/ethereum/) +- [ConsenSys-এ ক্যারিয়ার](https://consensys.net/careers/) +- [ক্রিপ্টো জবস লিস্ট](https://cryptojobslist.com/ethereum-jobs) +- [Bankless জবস বোর্ড](https://pallet.xyz/list/bankless/jobs) +- [Web3 জবস](https://web3.career) +- [Web3 Army](https://web3army.xyz/) +- [ক্রিপ্টো ভ্যালি জবস](https://cryptovalley.jobs/) +- [ইথেরিয়াম জবস](https://startup.jobs/ethereum-jobs) + +## একটি DAO-তে যোগ দিন {#decentralized-autonomous-organizations-daos} + +"DAO"-গুলো হলো বিকেন্দ্রীভূত স্বায়ত্তশাসিত সংস্থা। এই গোষ্ঠীগুলো সংগঠন এবং সহযোগিতার সুবিধার্থে ইথেরিয়াম প্রযুক্তি ব্যবহার করে। উদাহরণস্বরূপ, সদস্যপদ নিয়ন্ত্রণ, প্রস্তাবে ভোটদান, বা সম্মিলিত সম্পদ পরিচালনা করার জন্য। যদিও DAO-গুলো এখনও পরীক্ষামূলক, তারা আপনার জন্য এমন গোষ্ঠী খুঁজে বের করার, সহযোগী খুঁজে বের করার, এবং ইথেরিয়াম কমিউনিটিতে আপনার প্রভাব বাড়ানোর সুযোগ করে দেয়। [DAO সম্পর্কে আরও](/dao/) + +- [DAOSquare](https://daosquare.io/) [@DAOSquare](https://twitter.com/DAOSquare) - _অ-প্রযুক্তিগত ক্ষেত্রে DAO ধারণার প্রচার করুন এবং लोकांना DAO-এর মাধ্যমে ভ্যালু তৈরি করতে সাহায্য করুন_ +- [Developer DAO](https://www.developerdao.com/) [@developer_dao](https://twitter.com/developer_dao) - _নির্মাতাদের কমিউনিটি যারা ইন্টারনেটের সম্মিলিত মালিকানায় বিশ্বাসী_ +- [dOrg](https://dOrg.tech) [@dOrg_tech](https://twitter.com/dOrg_tech) - _একটি DAO হিসাবে কর্মরত ফ্রিল্যান্সার Web3 ডেভেলপমেন্ট সমষ্টি_ +- [HausDAO](https://daohaus.club) [@nowdaoit](https://twitter.com/nowdaoit) - _DAOhaus-এর কমিউনিটি গভর্নেন্স_ +- [LexDAO](https://lexdao.org) [@lex_DAO](https://twitter.com/lex_DAO) - _লিগ্যাল ইঞ্জিনিয়ারিং_ +- [MetaCartel Ventures](https://metacartel.xyz) [@VENTURE_DAO](https://twitter.com/VENTURE_DAO) - _প্রি-সিড ক্রিপ্টো প্রকল্পগুলির জন্য ভেঞ্চার_ +- [MetaFactory](https://metafactory.ai) [@TheMetaFactory](https://twitter.com/TheMetaFactory) - _ডিজিফিজিক্যাল পোশাক ব্র্যান্ড_ +- [MolochDAO](https://molochdao.com) [@MolochDAO](https://twitter.com/MolochDAO) - _ইথেরিয়াম ডেভেলপমেন্টে অর্থায়নের উপর দৃষ্টি নিবদ্ধ করা কমিউনিটি_ +- [Raid Guild](https://raidguild.org) [@RaidGuild](https://twitter.com/RaidGuild) - _Web3 নির্মাতাদের সমষ্টি_ + +অনুগ্রহ করে মনে রাখবেন আপনি যখনই এবং যেভাবেই ethereum.org-এ অবদান রাখুন না কেন, ethereum.org-এর [আচরণবিধি](/community/code-of-conduct) মেনে চলবেন! diff --git a/public/content/translations/bn/community/grants/index.md b/public/content/translations/bn/community/grants/index.md new file mode 100644 index 00000000000..1eaf5d5811a --- /dev/null +++ b/public/content/translations/bn/community/grants/index.md @@ -0,0 +1,68 @@ +--- +title: "ইথেরিয়াম ফাইন্ডেশন ও কমিউনিটি গ্রান্ট প্রোগ্রাম" +description: "পুরো ইথেরিয়াম ইকোসিস্টেম জুড়ে গ্রান্ট প্রোগ্রামগুলির একটি তালিকা।" +lang: bn +--- + +# ইথেরিয়াম গ্রান্ট {#ethereum-grants} + +নীচে তালিকাভুক্ত প্রোগ্রামগুলি ইথেরিয়াম ইকোসিস্টেমের সাফল্য এবং বৃদ্ধি প্রচারের জন্য কাজ করা প্রকল্পগুলির জন্য বিভিন্ন ধরণের ফান্ডিং গ্রান্ট অফার করে। আপনার পরবর্তী ইথেরিয়াম প্রোজেক্টকে সফল করতে সাহায্য করার জন্য ফান্ড খুঁজে পেতে এবং আবেদন করতে এটিকে একটি গাইড হিসাবে ব্যবহার করুন। + +এই তালিকাটি আমাদের কমিউনিটি দ্বারা তৈরি। যদি কিছু অনুপস্থিত বা ভুল থাকে, অনুগ্রহ করে এই পেজটি এডিট করুন! + + + +
প্রতিষ্ঠাতা, আপনার ব্যবসার গতি বাড়াতে সাহায্য প্রয়োজন? [ফাউন্ডারদের সহায়তায় যান](/founders/)
+
+ +## বিস্তৃত ইথেরিয়াম ইকোসিস্টেম {#broad-ethereum-ecosystem} + +এই প্রোগ্রামগুলি বিভিন্ন ধরণের প্রোজেক্টকে গ্রান্ট অফার করার মাধ্যমে বিস্তৃত ইথেরিয়াম ইকোসিস্টেমকে সমর্থন করে। এর মধ্যে রয়েছে স্কেলেবিলিটি, কমিউনিটি বিল্ডিং, নিরাপত্তা, গোপনীয়তা এবং আরও অনেক কিছুর জন্য সমাধান। এই গ্রান্টগুলি কোনও একটি নির্দিষ্ট ইথেরিয়াম প্ল্যাটফর্মের জন্য নয় এবং আপনি যদি অনিশ্চিত হন তবে শুরু করার জন্য এটি একটি ভাল জায়গা। + +- [EF ইকোসিস্টেম সাপোর্ট প্রোগ্রাম](https://esp.ethereum.foundation) - _ইথেরিয়ামকে উপকৃত করে এমন ওপেন সোর্স প্রজেক্টগুলির জন্য অর্থায়ন, যেখানে সর্বজনীন টুলস, পরিকাঠামো, গবেষণা এবং সর্বজনীন পণ্যের উপর বিশেষ নজর দেওয়া হয়_ +- [একাডেমিক গ্রান্ট](https://esp.ethereum.foundation/academic-grants) - _ইথেরিয়াম-সম্পর্কিত একাডেমিক কাজকে সমর্থন করার জন্য গ্রান্ট_ + +## গ্রান্ট তালিকা অ্যাগ্রিগেটর এবং প্ল্যাটফর্ম {#grant-list-aggregators} + +এই রিসোর্সগুলি ইথেরিয়াম ইকোসিস্টেম জুড়ে বিভিন্ন গ্রান্টের সুযোগ সংকলন এবং সংগঠিত করে, যা আপনার প্রোজেক্টের প্রয়োজন অনুযায়ী অর্থায়নের সুযোগ খুঁজে পাওয়া সহজ করে তোলে। আপনার নির্দিষ্ট অর্থায়নের প্রয়োজনের উপর ভিত্তি করে আপনাকে সবচেয়ে প্রাসঙ্গিক রিসোর্সগুলি খুঁজে পেতে শুরু করতে সাহায্য করার জন্য আমরা সেগুলিকে পার্সোনা অনুসারে সংগঠিত করেছি। + +### সমস্ত গ্রান্ট অনুসন্ধানকারীদের জন্য: বিস্তৃত ডিরেক্টরি {#comprehensive-directories} + +এই সাধারণ প্ল্যাটফর্মগুলি পুরো Web3 স্পেস জুড়ে গ্রান্টের ব্যাপক কভারেজ অফার করে এবং যারা অর্থায়ন খুঁজছেন তাদের জন্য এটি একটি দরকারী সূচনা পয়েন্ট: + +- [ব্লকওয়ার্কস গ্রান্টফার্ম](https://blockworks.co/grants/programs) - _ব্লকওয়ার্কস সমস্ত গ্রান্ট, RFP, এবং বাগ বাউন্টির একটি বিস্তৃত ডিরেক্টরি সংকলন করেছে।_ +- [ব্লকচেইন গ্রান্টস](https://www.blockchaingrants.org/) - _ব্লকচেইন এবং ক্রিপ্টো গ্রান্টের ডিরেক্টরি_ +- [Karma Funding Map](https://gap.karmahq.xyz/funding-map) - সমস্ত web3 গ্রান্ট প্রোগ্রামের ডিরেক্টরি, যা সাপ্তাহিক ভিত্তিতে আপডেট করা হয় + +### ডেভেলপার এবং বিল্ডারদের জন্য {#for-developers-and-builders} + +- [গ্রান্ট প্রোগ্রাম ভিউয়ার](https://airtable.com/shr86elKgWTSCP4AY) - _গ্রান্ট প্রোগ্রামের পাবলিক এয়ারটেবিল ডেটাবেস_ +- [Web3 গ্রান্টস স্প্রেডশিট](https://docs.google.com/spreadsheets/d/1c8koZCI-GLnD8MG-eFcXPOBCNu1v8-aXIfwAAvc7AMc/edit#gid=0) - _Web3 গ্রান্টের সুযোগগুলির গুগল স্প্রেডশিট_ +- [Arbitrum গ্রান্টস](https://arbitrum.foundation/grants) — Arbitrum DAO এবং [The Arbitrum Foundation](https://arbitrum.foundation/) + +### DeFi প্রোজেক্ট এবং ফিনান্সিয়াল এপ্লিকেশনগুলির জন্য {#for-defi-projects} + +- [LlamaoGrants](https://wiki.defillama.com/wiki/LlamaoGrants) - _DeFi Llama-র গ্রান্ট প্রোগ্রাম ডিরেক্টরি_ +- [AlphaGrowth Grants](https://alphagrowth.io/crypto-web3-grants-list) - _ক্রিপ্টো এবং Web3 গ্রান্টের বিস্তৃত তালিকা_ +- [Uniswap Foundation Grants](https://www.uniswapfoundation.org/build) - _DeFi বিল্ডারদের জন্য ইউনিচেইন এবং ইউনিসয়্যাপ v4 গ্রান্ট এবং সাপোর্ট_ + +### DAO অবদানকারী এবং গভর্নেন্স উদ্ভাবকদের জন্য {#for-dao-contributors} + +কমিউনিটি-চালিত প্রকল্প এবং গভর্নেন্স পরীক্ষার জন্য রিসোর্স: + +- [DAO Grants](https://docs.google.com/spreadsheets/d/1XHc-p_MHNRdjacc8uOEjtPoWL86olP4GyxAJOFO0zxY/edit#gid=0) - _গ্রান্ট অফারকারী সংস্থাগুলির গুগল স্প্রেডশিট_ +- [MetaGov Database](https://docs.google.com/spreadsheets/d/1e5g-dlWWsK2DZoZGBgfxyfGNSddLk-V7sLEgfPjEhbA/edit#gid=780420708) - _বিস্তৃত Web3 গ্রান্ট ম্যাপ_ + +### সর্বজনীন পণ্য এবং তার প্রভাব {#public-goods-and-impact} + +এই প্রোগ্রামগুলি বৃহত্তর কমিউনিটি, সর্বজনীন পণ্য এবং প্রভাব উদ্যোগকে উপকৃত করে এমন প্রকল্পগুলিতে অর্থায়নের উপর ফোকাস করে। এর মধ্যে রয়েছে গ্রান্ট প্রদানকারী, সেইসাথে [কোয়াড্রেটিক ফান্ডিং](/defi/#quadratic-funding) সহ অনচেইন অর্থায়ন বরাদ্দকরণ পদ্ধতি ব্যবহার করে এমন ডোনেশন প্ল্যাটফর্ম: + +- [গিটকয়েন](https://www.gitcoin.co/program) - _গিটকয়েন গ্রান্ট ইথেরিয়াম ইকোসিস্টেমে ওপেন সোর্স প্রকল্প এবং সর্বজনীন পণ্যগুলিতে অর্থায়ন করতে একাধিক মূলধন বরাদ্দকরণ পদ্ধতি ব্যবহার করে_ +- [অক্ট্যান্ট](https://octant.app/home) - _সর্বজনীন পণ্যের জন্য অর্থায়ন ইকোসিস্টেম যা সাধারণের মঙ্গল এবং ব্যক্তিগত আর্থিক ক্ষমতায়নের মধ্যে ভারসাম্য বজায় রাখে_ +- [গিভেথ](https://giveth.io/) - _ক্রিপ্টো ডোনেশন প্ল্যাটফর্ম যা কোনও অতিরিক্ত ফি ছাড়াই ভালো কাজের জন্য প্রোজেক্টে সরাসরি ডোনেশনের সুযোগ করে দেয়_ +- [আর্টিজেন](https://artizen.fund/) - _শিল্প, বিজ্ঞান, প্রযুক্তি এবং সংস্কৃতির অগ্রভাগে থাকা নতুন প্রোজেক্টের জন্য ক্রিয়েটরদের ম্যাচ ফান্ড করতে সাহায্য করে_ +- [Quadratic Accelerator](https://qacc.giveth.io/) - _স্টার্ট-আপ এক্সিলারেটর প্রোগ্রাম যা কোয়াড্রেটিক ফান্ডিং ব্যবহার করে সর্বজনীন মঙ্গলের জন্য উপকারী প্রোজেক্টগুলিকে সমর্থন করে_ + +## ইথেরিয়ামে কাজ করুন {#work-in-ethereum} + +নিজের প্রোজেক্ট শুরু করার জন্য প্রস্তুত নন? শত শত কোম্পানি সক্রিয়ভাবে এমন উৎসাহী ব্যক্তিদের খুঁজছে যারা ইথেরিয়াম ইকোসিস্টেমে কাজ করতে এবং অবদান রাখতে পারে। আরও তথ্য খুঁজছেন? [ইথেরিয়াম সম্পর্কিত চাকরিগুলি দেখুন](/community/get-involved/#ethereum-jobs) diff --git a/public/content/translations/bn/community/language-resources/index.md b/public/content/translations/bn/community/language-resources/index.md new file mode 100644 index 00000000000..77cf23f298f --- /dev/null +++ b/public/content/translations/bn/community/language-resources/index.md @@ -0,0 +1,153 @@ +--- +title: "ভাষার রিসোর্স" +description: "Ethereum সম্পর্কে জানার জন্য অ-ইংরেজি রিসোর্স" +lang: bn +--- + +# ভাষার রিসোর্স {#language-resources} + +Ethereum কমিউনিটি বিশ্বব্যাপী এবং লক্ষ লক্ষ অ-ইংরেজি ভাষী নিয়ে গঠিত। + +আমাদের লক্ষ্য হল সমস্ত ভাষায় শিক্ষামূলক বিষয়বস্তু সরবরাহ করা এবং ভাষার প্রতিবন্ধকতাগুলি কাটিয়ে উঠতে সাহায্য করা যা সারা বিশ্ব থেকে লোকেদের Ethereum-এ অনবোর্ড করাকে একটি চ্যালেঞ্জ করে তোলে। + +আপনি যদি আপনার মাতৃভাষায় পড়তে পছন্দ করেন বা এমন কাউকে চেনেন যিনি ইংরেজি বলেন না, আপনি নীচে দরকারী অ-ইংরেজি রিসোর্সের একটি তালিকা খুঁজে পেতে পারেন। লক্ষ লক্ষ Ethereum उत्साही খবর শেয়ার করতে, সাম্প্রতিক উন্নয়ন সম্পর্কে কথা বলতে, প্রযুক্তিগত সমস্যা নিয়ে বিতর্ক করতে এবং ভবিষ্যৎ কল্পনা করতে এই অনলাইন ফোরামগুলিতে জড়ো হন। + +আপনার ভাষায় কোনো শিক্ষামূলক রিসোর্স সম্পর্কে জানেন? তালিকায় এটি যোগ করতে [একটি ইস্যু খুলুন](https://github.com/ethereum/ethereum-org-website/issues/new/choose)! + +## Ethereum.org রিসোর্স {#ethereum-org} + +Ethereum.org স্থানীয়ভাবে 40টিরও বেশি ভাষায় অনুবাদ করা হয়েছে যা আপনি আমাদের ভাষা নির্বাচক মেনু ব্যবহার করে খুঁজে পেতে পারেন, যা প্রতিটি পৃষ্ঠার শীর্ষে অবস্থিত। + +![ভাষা নির্বাচক মেনু](./language-selector-menu.png) + +আপনি যদি দ্বিভাষিক হন এবং আমাদের আরও বেশি মানুষের কাছে পৌঁছাতে সাহায্য করতে চান, আপনি [ethereum.org অনুবাদ কর্মসূচিতে](/contributing/translation-program/#translation-program) অংশ নিতে পারেন এবং আমাদের ওয়েবসাইট অনুবাদে সাহায্য করতে পারেন। + +## কমিউনিটি রিসোর্স {#community} + +### ব্রাজিলিয়ান পর্তুগিজ {#br-pt} + +**খবর** + +- [BeInCrypto](http://www.beincrypto.com.br) - ব্রাজিলে উপলব্ধ এক্সচেঞ্জের তালিকা সহ ক্রিপ্টোকারেন্সি সংবাদ এবং নিবন্ধ। +- [Cointelegraph](http://cointelegraph.com.br/category/analysis) - Cointelegraph-এর ব্রাজিলিয়ান সংস্করণ, একটি প্রধান ক্রিপ্টোকারেন্সি সংবাদ মাধ্যম। +- [Livecoins](http://www.livecoins.com.br/ethereum) - ক্রিপ্টোকারেন্সি সংবাদ এবং টুলস। +- [Seudinheiro](http://www.seudinheiro.com/criptomoedas/) - ক্রিপ্টোকারেন্সি সংবাদ এবং প্রতিবেদন। +- [Modular Crypto](https://modularcrypto.xyz/) - ক্রিপ্টোকারেন্সি সংবাদ এবং শিক্ষামূলক নিবন্ধ। + +**শিক্ষা** + +- [web3dev](https://www.web3dev.com.br/) - ওয়েব 3 ডেভেলপারদের জন্য কন্টেন্ট হাব এবং ডিসকর্ড কমিউনিটি। +- [Web3Brasil](https://github.com/web3brasil/web3brasil) - Web3 এবং DeFi শেখার জন্য রিসোর্স। +- [CriptoFacil](http://www.criptofacil.com/ultimas-noticias/) - ক্রিপ্টোকারেন্সি সংবাদ এবং শিক্ষা, যার মধ্যে রয়েছে 'নতুনদের জন্য Ethereum' এবং 'নতুনদের জন্য DeFi'। +- [CriptoAtivos](http://www.criptoativos.wiki.br/) - ক্রিপ্টোকারেন্সি জগৎ থেকে অন্তর্দৃষ্টি, শিক্ষা এবং ব্লগ। +- [Cointimes](http://www.cointimes.com.br/) - ক্রিপ্টোকারেন্সি সংবাদ এবং শিক্ষা। +- [Web3 স্টার্টার প্যাক](https://docs.google.com/document/d/1X8PSTFH7FTw9J-gbKWM6Y430SWCBT8d4t4pJgFQHJ8E/) - সর্বাধিক জিজ্ঞাসিত এবং মৌলিক ক্রিপ্টো প্রশ্নাবলীর উত্তরসহ একটি গাইড। + +### চীনা {#zh} + +**সাধারণ রিসোর্স** + +- [Ethereum.cn](https://www.ethereum.cn/) - কমিউনিটি দ্বারা পরিচালিত বিষয়বস্তু, যা কনসেন্সাস লেয়ার আপগ্রেড, সমস্ত কোর ডেভ মিটিং নোট, লেয়ার 2 ইত্যাদি কভার করে। +- [EthFans](https://github.com/editor-Ajian/EthFans.org-annual-collected-works/) - বেসিক থেকে শুরু করে উন্নত Ethereum বিষয় পর্যন্ত সবকিছু শিখুন। +- [Unitimes](https://mp.weixin.qq.com/s/tvloZSDBSOQN9zDQj_91kA) - কমিউনিটি দ্বারা পরিচালিত বিষয়বস্তু, যা Ethereum, DeFi, NFT, Web3-সম্পর্কিত জ্ঞান কভার করে। +- [123ETH](https://123eth.org/) - Ethereum ইকোসিস্টেমের একটি পোর্টাল। +- [Zhen Xiao](http://zhenxiao.com/blockchain/) - ক্রিপ্টোকারেন্সি এবং এর অ্যাপ্লিকেশন সম্পর্কে বিনামূল্যে অনলাইন কোর্স। +- [Ethereum হোয়াইটপেপার](/zh/whitepaper/) - Ethereum হোয়াইটপেপার-এর চীনা সংস্করণ। + +**Ethereum ইকোসিস্টেম** + +- [ETHPlanet](https://www.ethplanet.org/) - অনলাইন এবং ব্যক্তিগত হ্যাকাথন, যা বিশ্ববিদ্যালয়ের শিক্ষার্থীদের প্রশিক্ষণ প্রদান করে। +- [PrimitivesLane](https://www.primitiveslane.org/) - একটি অলাভজনক গবেষণা গ্রুপ, যা ব্লকচেইন প্রযুক্তির উপর দৃষ্টি নিবদ্ধ করে। +- [Ethereum Translation Community CN](https://www.notion.so/Ethereum-Translation-Community-CN-05375fe0a94c4214acaf90f42ba40171) - শিক্ষামূলক Ethereum বিষয়বস্তু অনুবাদ করার জন্য নিবেদিত একটি কমিউনিটি। + +**ডেভেলপারদের জন্য** + +- [DappLearning](https://github.com/Dapp-Learning-DAO/Dapp-Learning) - মূলধারার ডিএ্যাপ প্রজেক্টগুলি অধ্যয়ন করতে এবং প্রতি সপ্তাহে চিন্তাভাবনা এবং মন্তব্য শেয়ার করার জন্য একটি শিক্ষণ গোষ্ঠী। +- [LearnBlockchain](https://learnblockchain.cn/) - ডেভদের জন্য একটি কমিউনিটি, যা ব্লকচেইন প্রযুক্তি সম্পর্কে তথ্য শেয়ার করে। + +**ক্রিপ্টোগ্রাফি গবেষকদের জন্য** + +- [SecbitLabs](https://mp.weixin.qq.com/s/69_tqBJpr_sbaKtR1sBRMw) - একটি WeChat অ্যাকাউন্ট, যা ক্রিপ্টোগ্রাফি, নিরাপত্তা ইত্যাদি ব্যাখ্যা করে। +- [Sparkbyte](https://mp.weixin.qq.com/s/9KgKTc_jtJ7bWKdbNPoqvQ) - একটি WeChat অ্যাকাউন্ট, যা zk প্রযুক্তি ব্যাখ্যা করে। + +### চেক {#cs} + +- [Gwei.cz](https://gwei.cz) - Web3-কে কেন্দ্র করে স্থানীয় কমিউনিটি, শিক্ষামূলক বিষয়বস্তু তৈরি করে, অনলাইন এবং ব্যক্তিগত ইভেন্টের আয়োজন করে। +- [Gwei.cz Příručka](https://prirucka.gwei.cz/) - নতুনদের জন্য Ethereum গাইড। +- [DAO Příručka](https://dao.gwei.cz/) - DAO-গুলির জন্য নতুনদের গাইড। +- [Mastering Ethereum](https://ipfs.io/ipfs/bafybeidvuxhnsgfx3tncpfxheqglkjwmdxclknlgd7s7qggd2a6bzgb27m) - চেক ভাষায় Mastering Ethereum। + +### ফরাসি {#fr} + +- [Ethereum France](https://www.ethereum-france.com/) - Ethereum France ইভেন্টের আয়োজন করে, বিষয়বস্তু তৈরি করে এবং Ethereum-কে ঘিরে আলোচনাকে উৎসাহিত করে। +- [Ethereum.fr](https://ethereum.fr/) - Ethereum সংবাদ এবং শিক্ষা। +- [BanklessFR](https://banklessfr.substack.com/) - ফরাসি ভাষায় Bankless নিউজলেটার। +- [CryptoFR](https://cryptofr.com/category/44/ethereum-general) - একটি Ethereum সাবপেজ সহ ক্রিপ্টোকারেন্সি ফোরাম। + +### জার্মান {#de} + +- [Microsoft Learn (Solidity)](https://docs.microsoft.com/de-de/learn/modules/blockchain-learning-solidity/) - Solidity ব্যবহার করে। +- [Microsoft Learn (স্মার্ট কন্ট্র্যাক্ট)](https://docs.microsoft.com/de-de/learn/modules/blockchain-solidity-ethereum-smart-contracts/) - Solidity দিয়ে Ethereum স্মার্ট কন্ট্র্যাক্ট লেখা। +- [Microsoft Learn (Ethereum নেটওয়ার্ক)](https://docs.microsoft.com/de-de/learn/modules/blockchain-ethereum-networks/) - Ethereum নেটওয়ার্কে সংযোগ এবং স্থাপন করুন। +- [Microsoft Learn (ব্লকচেইন)](https://docs.microsoft.com/de-de/learn/paths/ethereum-blockchain-development/) - ব্লকচেইন ডেভেলপমেন্টে প্রবেশ। + +### হিব্রু {#he} + +- [Udi Wertheimer - বিটকয়েনাররা Ethereum থেকে যা শিখতে পারে](https://www.cryptojungle.co.il/udi-wertheimer-what-bitcoiners-can-learn-from-ethereum/) +- [Omer Greismen (OpenZeppelin) - আমরা কীভাবে 15 বিলিয়ন ডলারের স্মার্ট কন্ট্র্যাক্ট হ্যাক প্রতিরোধ করেছি](https://www.cryptojungle.co.il/omer-greisman-openzeppelin/) +- [Shy Datika (INX) - টোকেনাইজেশন এবং সিকিউরিটিজের ভবিষ্যৎ, Ethereum একটি সিকিউরিটি কিনা তা সহ](https://www.cryptojungle.co.il/shy-datika-tokenization/) +- [Roy Confino (Lemonade) - Insurance @ Ethereum](https://www.cryptojungle.co.il/roy-confino-insurance/) +- [Idan Ofrat (Fireblocks) - প্রাতিষ্ঠানিক গ্রহণ](https://www.cryptojungle.co.il/idan-ofrat-fireblocks/) +- [Gal Weizman (MetaMask) - MetaMask কি](https://www.cryptojungle.co.il/gal-weizman-metamask/) +- [Dror Aviely (Consensys) - Ethereum-এর কেন্দ্র](https://www.cryptojungle.co.il/dror-aviely-ethereum-center/) +- [Nir Rozin - ক্রিপ্টোপাঙ্ক হওয়া](https://www.cryptojungle.co.il/nir-rozin-cryptopunk/) +- [Adan Kedem - গেমিং এবং মেটাভার্স](https://www.cryptojungle.co.il/adan-kedem-web3-gaming/) +- [Uri Kolodny (Starkware) - Ethereum এবং ব্লকচেইন লেয়ার](https://www.cryptojungle.co.il/uri-kolodny-starkware/) +- [Udi Wertheimer - Ethereum 2.0 বনাম প্রতিযোগিতা](https://www.cryptojungle.co.il/udi-on-eth2/) +- [Ben Samocha (myself) - Ethereum 2.0 - একটি সুযোগ?](https://www.cryptojungle.co.il/etherurm2-week-summary/) +- [Alon Muroch (Bloxstaking) - Ethereum 2.0 কি?](https://www.cryptojungle.co.il/alon-moroch-eth2/) +- [Eilon Aviv (Collider Ventures) - Ethereum 2.0-এর সাথে কি ভুল হতে পারে](https://www.cryptojungle.co.il/eilon-aviv-eth2-0/) +- [Eilon Aviv (Collider Ventures) - আমাদের কেন Ethereum 2.0 দরকার](https://www.cryptojungle.co.il/eilon-aviv-ethereum-2-0/) + +### ইতালীয় {#it} + +- [Ethereum Italia](https://www.ethereum-italia.it/) - Ethereum শিক্ষা, ইভেন্ট, এবং খবর, যা স্মার্ট কন্ট্র্যাক্ট এবং ব্লকচেইন প্রযুক্তির উপর দৃষ্টি নিবদ্ধ করে। +- [Ethereum Italia Podcast](https://www.ethereum-italia.it/podcast/) - ইতালীয় ভাষায় Ethereum পডকাস্ট। +- [Microsoft Learn (Solidity)](https://docs.microsoft.com/it-it/learn/modules/blockchain-learning-solidity/) - Solidity কীভাবে ব্যবহার করতে হয় তা শিখুন। +- [Microsoft Learn (স্মার্ট কন্ট্র্যাক্ট)](https://docs.microsoft.com/it-it/learn/modules/blockchain-solidity-ethereum-smart-contracts/) - Solidity ব্যবহার করে স্মার্ট কন্ট্র্যাক্ট লেখা সম্পর্কে জানুন। +- [Microsoft Learn (ডিএ্যাপস)](https://docs.microsoft.com/it-it/learn/modules/blockchain-create-ui-decentralized-apps/) - ডিসেন্ট্রালাইজড এপ্লিকেশনগুলির সাথে একটি ব্যবহারকারী ইন্টারফেস তৈরি করুন। + +### জাপানি {#ja} + +- [জাপান ভার্চুয়াল এবং ক্রিপ্টো অ্যাসেট এক্সচেঞ্জ অ্যাসোসিয়েশন](https://jvcea.or.jp/) +- [জাপান ক্রিপ্টোঅ্যাসেট বিজনেস অ্যাসোসিয়েশন](https://cryptocurrency-association.org/) +- [ব্লকচেইন ডেভেলপমেন্ট দিয়ে শুরু করুন - শিখুন | Microsoft Docs](https://docs.microsoft.com/ja-jp/learn/paths/ethereum-blockchain-development/) - এই শিক্ষণ পথটি আপনাকে ব্লকচেইন এবং Ethereum প্ল্যাটফর্মে ডেভেলপমেন্টের সাথে পরিচয় করিয়ে দেয়। +- [Mastering Ethereum](https://www.oreilly.co.jp/books/9784873118963/) - জাপানি ভাষায় Mastering Ethereum। +- [Hands-On Smart Contract Development with Solidity and Ethereum](https://www.oreilly.co.jp/books/9784873119342/) - জাপানি ভাষায় Hands-On Smart Contract Development with Solidity and Ethereum। + +### রাশিয়ান {#ru} + +- [Cyber Academy](https://cyberacademy.dev) - ওয়েব3 নির্মাতাদের জন্য শিক্ষামূলক স্থান। +- [Forklog](https://forklog.com) - সাধারণভাবে ক্রিপ্টো, বিদ্যমান প্রযুক্তি এবং বিভিন্ন ব্লকচেইনের ভবিষ্যৎ আপগ্রেড সম্পর্কে সংবাদ এবং শিক্ষামূলক নিবন্ধ। +- [BeInCrypto](https://ru.beincrypto.com) - ক্রিপ্টোতে সবকিছু সম্পর্কে সহজ ব্যাখ্যা সহ খবর, ক্রিপ্টো মূল্য বিশ্লেষণ এবং অ-প্রযুক্তিগত নিবন্ধ। + +### স্প্যানিশ {#es} + +- [Ethereum Madrid](https://ethereummadrid.com/) - ব্লকচেইন, DeFi, এবং গভর্নেন্স কোর্স, ইভেন্ট এবং ব্লগ। +- [Cointelegraph](https://es.cointelegraph.com/ethereum-for-beginners) - স্প্যানিশ ভাষায় নতুনদের জন্য Ethereum গাইড। +- [Tutoriales online](https://tutoriales.online/curso/solidity) - Ethereum-এ Solidity এবং প্রোগ্রামিং শিখুন। +- [Curso Introducción a Ethereum Development](https://youtube.com/playlist?list=PLTqiwJDd_R8y9pfUBjhkVa1IDMwyQz-fU) - Solidity বেসিক, আপনার প্রথম স্মার্ট কন্ট্র্যাক্ট পরীক্ষা এবং স্থাপন। +- [Curso Introducción a Seguridad y Hacking en Ethereum](https://youtube.com/playlist?list=PLTqiwJDd_R8yHOvteko_DmUxUTMHnlfci) - আসল স্মার্ট কন্ট্র্যাক্টে সাধারণ দুর্বলতা এবং নিরাপত্তা সমস্যাগুলি বুঝুন। +- [Curso Introducción a DeFi Development](https://youtube.com/playlist?list=PLTqiwJDd_R8zZiP9_jNdaPqA3HqoW2lrS) - Solidity-তে DeFi স্মার্ট কন্ট্র্যাক্ট কীভাবে কাজ করে তা শিখুন এবং আপনার নিজস্ব অটোমেটেড মার্কেট মেকার তৈরি করুন। +- [Cryptoversidad](https://www.youtube.com/c/Cryptoversidad) - শিক্ষানবিস থেকে উন্নত পর্যন্ত অ-প্রযুক্তিগত ব্লকচেইন শিক্ষা। ক্রিপ্টো এবং Ethereum সম্পর্কে সবকিছু শিখুন। + +### তুর্কি {#tr} + +- [BTK Akademi](https://www.btkakademi.gov.tr/portal/course/blokzincir-ve-kripto-paralar-10569#!/about) - ব্লকচেইন এবং ক্রিপ্টোকারেন্সি-কেন্দ্রিক কোর্স। +- [The great renaming: what happened to Eth2?](https://miningturkiye.org/konu/ethereum-madenciligi-bitiyor-mu-onemli-gelisme.655/) - The great renaming ব্লগ পোস্টের তুর্কি অনুবাদ, যা 'Eth2' পরিভাষা থেকে সরে আসার বিষয়টি ব্যাখ্যা করে। + +### ভিয়েতনামী {#vi} + +- [Tino Group](https://wiki.tino.org/ethereum-la-gi/) - Ethereum, ডিএ্যাপস, ওয়ালেট এবং প্রায়শই জিজ্ঞাসিত প্রশ্নাবলীর সংক্ষিপ্ত বিবরণ। +- [Tap Chi Bitcoin](https://tapchibitcoin.io/tap-chi/tin-tuc-ethereum-eth) - Ethereum সংবাদ এবং শিক্ষার জন্য সাবপেজ সহ ওয়েব প্ল্যাটফর্ম। +- [Coin68](https://coin68.com/ethereum-tieu-diem/) - Ethereum সংবাদ এবং শিক্ষামূলক বিষয়বস্তু সহ ক্রিপ্টোকারেন্সি পোর্টাল। diff --git a/public/content/translations/bn/community/online/index.md b/public/content/translations/bn/community/online/index.md new file mode 100644 index 00000000000..a390b95725f --- /dev/null +++ b/public/content/translations/bn/community/online/index.md @@ -0,0 +1,74 @@ +--- +title: "অনলাইন কমিউনিটি" +description: "অনলাইন ফোরাম, চ্যাট রুম এবং সামাজিক মিডিয়া কমিউনিটি আবিষ্কার করুন যেখানে ইথেরিয়াম উৎসাহীরা আলোচনা করতে এবং সহযোগিতা করার জন্য একত্রিত হন।" +lang: bn +--- + +# অনলাইন কমিউনিটি {#online-communities} + +লক্ষ লক্ষ Ethereum उत्साही খবর শেয়ার করতে, সাম্প্রতিক উন্নয়ন সম্পর্কে কথা বলতে, প্রযুক্তিগত সমস্যা নিয়ে বিতর্ক করতে এবং ভবিষ্যৎ কল্পনা করতে এই অনলাইন ফোরামগুলিতে জড়ো হন। + +## তালিকাভুক্তির নীতি {#listing-policy} + +তালিকাভুক্ত কমিউনিটির অখণ্ডতা এবং মূল্য বজায় রাখতে, ethereum.org যোগ্যতা নির্ধারণের জন্য একটি কঠোর নীতি অনুসরণ করে: + +### যোগ্যতার মানদণ্ড {#eligibility-criteria} + +- **প্রাসঙ্গিকতা**: কমিউনিটি সরাসরি ইথেরিয়াম এবং এর ইকোসিস্টেমের সাথে সম্পর্কিত হতে হবে। +- **সক্রিয়তার স্তর**: কমিউনিটিকে নিয়মিত আলাপচারিতা, পোস্ট বা আলোচনার মাধ্যমে সক্রিয় থাকতে হবে। নিষ্ক্রিয় বা செயலাহীন কমিউনিটিগুলো সরিয়ে দেওয়া হতে পারে। +- **অন্তর্ভুক্তি**: কমিউনিটির উচিত এমন একটি স্বাগত জানানোর পরিবেশ তৈরি করা যা বৈচিত্র্যকে সম্মান করে এবং সমস্ত প্রেক্ষাপটের মানুষকে অংশগ্রহণে উৎসাহিত করে। +- **অ-বাণিজ্যিক কেন্দ্রবিন্দু**: তালিকাগুলো বাণিজ্যিক বা প্রচারমূলক প্ল্যাটফর্মের পরিবর্তে কমিউনিটি-চালিত স্থানগুলির জন্য তৈরি। + +### কন্টেন্ট নির্দেশিকা {#content-guidelines} + +- **উপযুক্ত কন্টেন্ট**: কমিউনিটিগুলোকে স্প্যাম, বিদ্বেষমূলক বক্তব্য, হয়রানি, বা অবৈধ কার্যকলাপ প্রচার করে এমন কোনো কন্টেন্ট এড়িয়ে তাদের নিজস্ব সংযম নির্দেশিকা থাকতে হবে। +- **ভাষা**: যদিও ইংরেজি প্রাথমিক ভাষা, অন্যান্য ভাষার কমিউনিটিগুলোকে জমা দেওয়ার জন্য উৎসাহিত করা হয় যতক্ষণ না তারা একটি অন্তর্ভুক্তিমূলক এবং সম্মানজনক পরিবেশ বজায় রাখে। +- **স্বচ্ছতা**: কমিউনিটির উদ্দেশ্য, নিয়ম এবং মডারেটরদের সম্পর্কে সুস্পষ্ট তথ্য সদস্যদের জন্য উপলব্ধ থাকা উচিত। + +### অন্যান্য সুপারিশ {#other-recommendations} + +- **অ্যাক্সেসিবিলিটি**: কমিউনিটি ফোরামগুলো সাইন-আপ বা রেজিস্ট্রেশনের প্রয়োজন ছাড়াই সকলের পড়ার জন্য অ্যাক্সেসযোগ্য হওয়া উচিত। +- **ডিসকর্ড সার্ভারের আমন্ত্রণ**: এটি সুপারিশ করা হচ্ছে যে শুধুমাত্র নির্ভরযোগ্য ডিসকর্ড সার্ভারের আমন্ত্রণগুলো ethereum.org-এ যোগ করা উচিত। আদর্শভাবে, এই আমন্ত্রণগুলো ওয়েবসাইটের একটি কমিউনিটি পেজের সাথে লিঙ্ক করা উচিত (যেমন, [ethglobal.com/discord](https://ethglobal.com/discord)) অথবা একটি অফিসিয়াল URL থেকে হওয়া উচিত (যেমন, [discord.gg/ethstaker](https://discord.gg/ethstaker) বা [discord.com/invite/ethstaker](https://discord.com/invite/ethstaker))। + +আপনি যদি বিশ্বাস করেন যে এই নির্দেশিকাগুলির উপর ভিত্তি করে একটি কমিউনিটি যোগ করা বা সরানো উচিত, অনুগ্রহ করে [আমাদের GitHub রিপোজিটরিতে একটি ইস্যু খুলুন](https://github.com/ethereum/ethereum-org-website/issues)৷ + +## ফোরাম {#forums} + +r/ethereum - ইথেরিয়াম সম্পর্কিত সবকিছু +r/ethfinance - DeFi সহ ইথেরিয়ামের আর্থিক দিক +r/ethdev - ইথেরিয়াম ডেভেলপমেন্টের উপর দৃষ্টি নিবদ্ধ করা +r/ethtrader - প্রবণতা এবং বাজার বিশ্লেষণ +r/ethstaker - ইথেরিয়ামে স্টেকিং-এ আগ্রহী সকলকে স্বাগতম +ফেলোশিপ অফ ইথেরিয়াম ম্যাজিশিয়ানস - ইথেরিয়ামের প্রযুক্তিগত মানকে কেন্দ্র করে একটি কমিউনিটি +ইথেরিয়াম স্ট্যাকএক্সচেঞ্জ - ইথেরিয়াম ডেভেলপারদের জন্য আলোচনা এবং সহায়তা +ইথেরিয়াম রিসার্চ - ক্রিপ্টোইকোনমিক গবেষণার জন্য সবচেয়ে প্রভাবশালী মেসেজবোর্ড + +## চ্যাট রুম {#chat-rooms} + +ইথেরিয়াম ক্যাট হার্ডার্স - ইথেরিয়াম ডেভেলপমেন্টে প্রজেক্ট ম্যানেজমেন্ট সহায়তা প্রদানের জন্য একটি কমিউনিটি +ইথেরিয়াম হ্যাকারস - ETHGlobal দ্বারা পরিচালিত ডিসকর্ড চ্যাট: সারা বিশ্বের ইথেরিয়াম হ্যাকারদের জন্য একটি অনলাইন কমিউনিটি +ক্রিপ্টোডেভস - ইথেরিয়াম ডেভেলপমেন্ট কেন্দ্রিক ডিসকর্ড কমিউনিটি +EthStaker ডিসকর্ড - বর্তমান এবং সম্ভাব্য স্টেকারদের জন্য কমিউনিটি-চালিত নির্দেশিকা, শিক্ষা, সহায়তা এবং রিসোর্স +Ethereum.org ওয়েবসাইট টিম - টিমের সাথে এবং কমিউনিটির লোকজনের সাথে ethereum.org ওয়েব ডেভেলপমেন্ট এবং ডিজাইন নিয়ে চ্যাট করতে আসুন +ম্যাটোস ডিসকর্ড - web3 নির্মাতাদের কমিউনিটি যেখানে বিল্ডার, শিল্প ব্যক্তিত্ব এবং ইথেরিয়াম উত্সাহীরা মিলিত হন। আমরা web3 ডেভেলপমেন্ট, ডিজাইন এবং সংস্কৃতি সম্পর্কে উত্সাহী। আমাদের সাথে নির্মাণ করতে আসুন। +সলিডিটি গিটার - সলিডিটি ডেভেলপমেন্টের জন্য চ্যাট (গিটার) +সলিডিটি ম্যাট্রিক্স - সলিডিটি ডেভেলপমেন্টের জন্য চ্যাট (ম্যাট্রিক্স) +ইথেরিয়াম স্ট্যাক এক্সচেঞ্জ - প্রশ্ন ও উত্তর ফোরাম +পীরা কমিউনিটি ফোরাম - বিকেন্দ্রীভূত প্রশ্ন ও উত্তর ফোরাম + +## ইউটিউব এবং এক্স (পূর্বে টুইটার) {#youtube-and-twitter} + +ইথেরিয়াম ফাউন্ডেশন - ইথেরিয়াম ফাউন্ডেশন থেকে সাম্প্রতিকতম খবরের সাথে আপ টু ডেট থাকুন +@ethereum - কমিউনিটির জন্য প্রধান ইথেরিয়াম অ্যাকাউন্ট +@ethereumfndn - ইথেরিয়াম ফাউন্ডেশনের অফিসিয়াল অ্যাকাউন্ট +@ethdotorg - ইথেরিয়াম-এর প্রবেশদ্বার, যা আমাদের ক্রমবর্ধমান বিশ্বব্যাপী কমিউনিটির জন্য তৈরি করা হয়েছে + + + + +
+ + DAO সম্পর্কে আরও জানুন + +
+
diff --git a/public/content/translations/bn/community/research/index.md b/public/content/translations/bn/community/research/index.md new file mode 100644 index 00000000000..7121b39a8d2 --- /dev/null +++ b/public/content/translations/bn/community/research/index.md @@ -0,0 +1,399 @@ +--- +title: "ইথেরিয়াম গবেষণার সক্রিয় ক্ষেত্রসমূহ" +description: "উন্মুক্ত গবেষণার বিভিন্ন ক্ষেত্র অন্বেষণ করুন এবং কীভাবে জড়িত হবেন তা জানুন।" +lang: bn +--- + +# ইথেরিয়াম গবেষণার সক্রিয় ক্ষেত্রসমূহ {#active-areas-of-ethereum-research} + +ইথেরিয়ামের অন্যতম প্রধান শক্তি হলো একটি সক্রিয় গবেষণা এবং ইঞ্জিনিয়ারিং কমিউনিটি এটিকে ক্রমাগত উন্নত করছে। সারা বিশ্বে অনেক উৎসাহী, দক্ষ ব্যক্তি ইথেরিয়ামের অসামান্য সমস্যাগুলিতে নিজেদের প্রয়োগ করতে চান, কিন্তু সেই সমস্যাগুলি কী তা খুঁজে বের করা সবসময় সহজ নয়। এই পৃষ্ঠাটি ইথেরিয়ামের অত্যাধুনিক দিকগুলোর একটি মোটামুটি নির্দেশিকা হিসাবে মূল সক্রিয় গবেষণা ক্ষেত্রগুলির রূপরেখা দেয়। + +## ইথেরিয়াম গবেষণা কীভাবে কাজ করে {#how-ethereum-research-works} + +ইথেরিয়াম গবেষণা উন্মুক্ত এবং স্বচ্ছ, যা [ডিসেন্ট্রালাইজড সায়েন্স (DeSci)](https://hackernoon.com/desci-decentralized-science-as-our-chance-to-recover-the-real-science)-এর নীতিগুলিকে মূর্ত করে। সংস্কৃতিটি হলো গবেষণা টুলস এবং আউটপুটগুলিকে যতটা সম্ভব উন্মুক্ত এবং ইন্টারেক্টিভ করা, উদাহরণস্বরূপ, এক্সিকিউটেবল নোটবুকের মাধ্যমে। ইথেরিয়াম গবেষণা দ্রুত অগ্রসর হয়, নতুন ফলাফলগুলি পিয়ার রিভিউয়ের পর ঐতিহ্যবাহী প্রকাশনার মাধ্যমে কমিউনিটির কাছে পৌঁছানোর পরিবর্তে [ethresear.ch](https://ethresear.ch/)-এর মতো ফোরামে খোলাখুলিভাবে পোস্ট এবং আলোচনা করা হয়। + +## সাধারণ গবেষণা রিসোর্স {#general-research-resources} + +নির্দিষ্ট বিষয় নির্বিশেষে, [ethresear.ch](https://ethresear.ch) এবং [Eth R&D ডিসকর্ড চ্যানেল](https://discord.gg/qGpsxSA)-এ ইথেরিয়াম গবেষণা সম্পর্কে প্রচুর তথ্য পাওয়া যাবে। এগুলোই হল প্রাথমিক জায়গা যেখানে ইথেরিয়াম গবেষকরা সাম্প্রতিকতম ধারণা এবং উন্নয়নের সুযোগ নিয়ে আলোচনা করেন। + +[DelphiDigital](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) দ্বারা 2022 সালের মে মাসে প্রকাশিত এই প্রতিবেদনটি ইথেরিয়াম রোডম্যাপের একটি ভালো সংক্ষিপ্ত বিবরণ প্রদান করে। + +## তহবিলের উৎস {#sources-of-funding} + +আপনি ইথেরিয়াম গবেষণার সাথে জড়িত হতে পারেন এবং এর জন্য অর্থ পেতে পারেন! উদাহরণস্বরূপ, [ইথেরিয়াম ফাইন্ডেশন](/foundation/) সম্প্রতি একটি [অ্যাকাডেমিক গ্রান্টস ফান্ডিং রাউন্ড](https://esp.ethereum.foundation/academic-grants) চালিয়েছে। আপনি [ইথেরিয়াম গ্রান্টস পৃষ্ঠা](/community/grants/)-এ সক্রিয় এবং আসন্ন অর্থায়নের সুযোগ সম্পর্কে তথ্য পেতে পারেন। + +## প্রোটোকল গবেষণা {#protocol-research} + +প্রোটোকল গবেষণা ইথেরিয়ামের বেস লেয়ারের সাথে সম্পর্কিত - যা হলো সেই নিয়মের সেট যা সংজ্ঞায়িত করে কিভাবে নোডগুলো সংযোগ স্থাপন করে, যোগাযোগ করে, ইথেরিয়াম ডেটা আদানপ্রদান ও সঞ্চয় করে এবং ব্লকচেইনের স্টেট সম্পর্কে কনসেন্সাসে আসে। প্রোটোকল গবেষণা দুটি শীর্ষ-স্তরের বিভাগে বিভক্ত: কনসেন্সাস এবং এক্সিকিউশন। + +### কনসেন্সাস {#consensus} + +কনসেন্সাস গবেষণা [ইথেরিয়ামের প্রুফ-অফ-স্টেক মেকানিজম](/developers/docs/consensus-mechanisms/pos/) নিয়ে কাজ করে। কিছু উদাহরণস্বরূপ কনসেন্সাস গবেষণা বিষয় হলো: + +- দুর্বলতা শনাক্তকরণ এবং প্যাচ করা; +- ক্রিপ্টোইকোনমিক নিরাপত্তা পরিমাপ করা; +- ক্লায়েন্ট ইমপ্লিমেন্টেশনের নিরাপত্তা বা পারফরম্যান্স বৃদ্ধি করা; +- এবং লাইট ক্লায়েন্ট তৈরি করা। + +ভবিষ্যৎমুখী গবেষণার পাশাপাশি, প্রোটোকলের কিছু মৌলিক পুনঃনকশা, যেমন সিঙ্গল স্লট ফাইনালিটি, নিয়ে গবেষণা করা হচ্ছে যাতে ইথেরিয়ামের উল্লেখযোগ্য উন্নতি করা যায়। উপরন্তু, কনসেন্সাস ক্লায়েন্টদের মধ্যে পিয়ার-টু-পিয়ার নেটওয়ার্কিংয়ের দক্ষতা, নিরাপত্তা এবং পর্যবেক্ষণও গুরুত্বপূর্ণ গবেষণার বিষয়। + +#### প্রেক্ষাপট পাঠ {#background-reading} + +- [প্রুফ-অফ-স্টেক-এর পরিচিতি](/developers/docs/consensus-mechanisms/pos/) +- [Casper-FFG পেপার](https://arxiv.org/abs/1710.09437) +- [Casper-FFG ব্যাখ্যাকারী](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d) +- [Gasper পেপার](https://arxiv.org/abs/2003.03052) + +#### সাম্প্রতিক গবেষণা {#recent-research} + +- [Ethresear.ch কনসেন্সাস](https://ethresear.ch/c/consensus/29) +- [প্রাপ্যতা/ফাইনালিটি দ্বিধা](https://arxiv.org/abs/2009.04987) +- [একক স্লট ফাইনালিটি](https://ethresear.ch/t/a-model-for-cumulative-committee-based-finality/10259) +- [প্রস্তাবক-নির্মাতা পৃথকীকরণ](https://notes.ethereum.org/@vbuterin/pbs_censorship_resistance) + +### এক্সিকিউশন {#execution} + +এক্সিকিউশন লেয়ার ট্রানজ্যাকশন এক্সিকিউট করা, [ইথিরিয়াম ভার্চুয়াল মেশিন (EVM)](/developers/docs/evm/) চালানো এবং কনসেন্সাস লেয়ারে পাঠানোর জন্য এক্সিকিউশন পেলোড তৈরি করার সাথে সম্পর্কিত। অনেকগুলি সক্রিয় গবেষণার ক্ষেত্র রয়েছে, যার মধ্যে রয়েছে: + +- লাইট ক্লায়েন্ট সাপোর্ট তৈরি করা; +- গ্যাস লিমিট নিয়ে গবেষণা; +- এবং নতুন ডেটা স্ট্রাকচার (যেমন, Verkle Tries) অন্তর্ভুক্ত করা। + +#### প্রেক্ষাপট পাঠ {#background-reading-1} + +- [EVM এর পরিচিতি](/developers/docs/evm) +- [Ethresear.ch এক্সিকিউশন লেয়ার](https://ethresear.ch/c/execution-layer-research/37) + +#### সাম্প্রতিক গবেষণা {#recent-research-1} + +- [ডাটাবেস অপটিমাইজেশন](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/db_faq.md) +- [স্টেট এক্সপায়ারি](https://notes.ethereum.org/@vbuterin/state_expiry_eip) +- [স্টেট এক্সপায়ারির পথ](https://hackmd.io/@vbuterin/state_expiry_paths) +- [Verkle এবং স্টেট এক্সপায়ারি প্রস্তাব](https://notes.ethereum.org/@vbuterin/verkle_and_state_expiry_proposal) +- [ইতিহাস ব্যবস্থাপনা](https://eips.ethereum.org/EIPS/eip-4444) +- [Verkle Trees](https://vitalik.eth.limo/general/2021/06/18/verkle.html) +- [ডেটা প্রাপ্যতা স্যাম্পলিং](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding) + +## ক্লায়েন্ট ডেভেলপমেন্ট {#client-development} + +ইথেরিয়াম ক্লায়েন্ট হলো ইথেরিয়াম প্রোটোকলের ইমপ্লিমেন্টেশন। ক্লায়েন্ট ডেভেলপমেন্ট এই ক্লায়েন্টগুলির মধ্যে প্রোটোকল গবেষণার ফলাফলগুলিকে তৈরি করে বাস্তবে পরিণত করে। ক্লায়েন্ট ডেভেলপমেন্টের মধ্যে ক্লায়েন্ট স্পেসিফিকেশন আপডেট করার পাশাপাশি নির্দিষ্ট ইমপ্লিমেন্টেশন তৈরি করাও অন্তর্ভুক্ত। + +একটি ইথেরিয়াম নোড চালানোর জন্য দুটি সফটওয়্যারের প্রয়োজন: + +1. ব্লকচেইনের হেডের ট্র্যাক রাখা, ব্লকগুলির মধ্যে তথ্য আদান-প্রদান করা এবং কনসেন্সাস লজিক পরিচালনা করার জন্য একটি কনসেন্সাস ক্লায়েন্ট +2. ইথিরিয়াম ভার্চুয়াল মেশিনকে সমর্থন করার এবং ট্রানজ্যাকশন ও স্মার্ট কন্ট্র্যাক্টগুলি সম্পাদন করার জন্য একটি এক্সিকিউশন ক্লায়েন্ট + +নোড এবং ক্লায়েন্ট সম্পর্কে আরও বিশদ বিবরণের জন্য এবং সমস্ত বর্তমান ক্লায়েন্ট ইমপ্লিমেন্টেশনের তালিকার জন্য [নোড এবং ক্লায়েন্ট পৃষ্ঠা](/developers/docs/nodes-and-clients/) দেখুন। এছাড়াও আপনি [ইতিহাস পৃষ্ঠা](/ethereum-forks/)-তে সমস্ত ইথেরিয়াম আপগ্রেডের একটি ইতিহাস খুঁজে পেতে পারেন। + +### এক্সিকিউশন ক্লায়েন্ট {#execution-clients} + +- [এক্সিকিউশন ক্লায়েন্ট স্পেসিফিকেশন](https://github.com/ethereum/execution-specs) +- [এক্সিকিউশন API স্পেসিফিকেশন](https://github.com/ethereum/execution-apis) + +### কনসেন্সাস ক্লায়েন্ট {#consensus-clients} + +- [কনসেন্সাস ক্লায়েন্ট স্পেসিফিকেশন](https://github.com/ethereum/consensus-specs) +- [বিকন API স্পেসিফিকেশন](https://ethereum.github.io/beacon-APIs/#/Beacon/getStateRoot) + +## স্কেলিং এবং পারফরম্যান্স {#scaling-and-performance} + +ইথেরিয়াম স্কেলিং করা ইথেরিয়াম গবেষকদের জন্য একটি বড় ফোকাসের ক্ষেত্র। বর্তমান পদ্ধতিগুলির মধ্যে রয়েছে রোলআপগুলিতে ট্রানজ্যাকশন অফলোড করা এবং ডেটা ব্লব ব্যবহার করে সেগুলিকে যতটা সম্ভব সস্তা করা। ইথেরিয়াম স্কেলিংয়ের প্রাথমিক তথ্য আমাদের [স্কেলিং পৃষ্ঠা](/developers/docs/scaling)-তে উপলব্ধ। + +### লেয়ার 2 {#layer-2} + +এখন বেশ কয়েকটি লেয়ার 2 প্রোটোকল রয়েছে যা ট্রানজ্যাকশন ব্যাচ করার এবং ইথেরিয়াম লেয়ার 1-এ সুরক্ষিত করার জন্য বিভিন্ন কৌশল ব্যবহার করে ইথেরিয়ামকে স্কেল করে। এটি একটি খুব দ্রুত বর্ধনশীল বিষয় যার প্রচুর গবেষণা এবং বিকাশের সম্ভাবনা রয়েছে। + +#### প্রেক্ষাপট পাঠ {#background-reading-2} + +- [লেয়ার 2-এর পরিচিতি](/layer-2/) +- [Polynya: রোলআপ, DA এবং মডুলার চেইন](https://polynya.medium.com/rollups-data-availability-layers-modular-blockchains-introductory-meta-post-5a1e7a60119d) + +#### সাম্প্রতিক গবেষণা {#recent-research-2} + +- [সিকোয়েন্সারদের জন্য Arbitrum-এর ফেয়ার-অর্ডারিং](https://eprint.iacr.org/2021/1465) +- [Ethresear.ch লেয়ার 2](https://ethresear.ch/c/layer-2/32) +- [রোলআপ-কেন্দ্রিক রোডম্যাপ](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) +- [L2Beat](https://l2beat.com/) + +### ব্রিজ {#bridges} + +লেয়ার 2-এর একটি বিশেষ ক্ষেত্র যেখানে আরও গবেষণা এবং উন্নয়ন প্রয়োজন তা হল নিরাপদ এবং পারফরম্যান্ট ব্রিজ। এর মধ্যে রয়েছে বিভিন্ন লেয়ার 2-এর মধ্যে ব্রিজ এবং লেয়ার 1 ও লেয়ার 2-এর মধ্যে ব্রিজ। এটি একটি বিশেষভাবে গুরুত্বপূর্ণ গবেষণার ক্ষেত্র কারণ ব্রিজগুলি সাধারণত হ্যাকারদের দ্বারা লক্ষ্যবস্তু হয়। + +#### প্রেক্ষাপট পাঠ {#background-reading-3} + +- [ব্লকচেইন ব্রিজের পরিচিতি](/bridges/) +- [ব্রিজ নিয়ে ভিটালিকের মতামত](https://old.reddit.com/r/ethereum/comments/rwojtk/ama_we_are_the_efs_research_team_pt_7_07_january/hrngyk8/) +- [ব্লকচেইন ব্রিজ নিবন্ধ](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) +- [ব্রিজে লক করা মূল্য](https://dune.com/eliasimos/Bridge-Away-\(from-Ethereum\)) + +#### সাম্প্রতিক গবেষণা {#recent-research-3} + +- [ব্রিজ যাচাইকরণ](https://stonecoldpat.github.io/images/validatingbridges.pdf) + +### শার্ডিং {#sharding} + +ইথেরিয়ামের ব্লকচেইন শার্ডিং করা দীর্ঘকাল ধরে ডেভেলপমেন্ট রোডম্যাপের একটি অংশ। তবে, "Danksharding"-এর মতো নতুন স্কেলিং সমাধানগুলি বর্তমানে কেন্দ্রবিন্দুতে রয়েছে। + +সম্পূর্ণ Danksharding-এর অগ্রদূত যা Proto-Danksharding নামে পরিচিত, তা Cancun-Deneb ("Dencun") নেটওয়ার্ক আপগ্রেডের সাথে লাইভ হয়েছে। + +[Dencun আপগ্রেড সম্পর্কে আরও জানুন](/roadmap/dencun/) + +#### প্রেক্ষাপট পাঠ {#background-reading-4} + +- [Proto-Danksharding নোট](https://notes.ethereum.org/@vbuterin/proto_danksharding_faq) +- [Bankless Danksharding ভিডিও](https://www.youtube.com/watch?v=N5p0TB77flM) +- [ইথেরিয়াম শার্ডিং গবেষণা সংকলন](https://notes.ethereum.org/@serenity/H1PGqDhpm?type=view) +- [Danksharding (Polynya)](https://polynya.medium.com/danksharding-36dc0c8067fe) + +#### সাম্প্রতিক গবেষণা {#recent-research-4} + +- [EIP-4844: Proto-Danksharding](https://eips.ethereum.org/EIPS/eip-4844) +- [শার্ডিং এবং ডেটা প্রাপ্যতা স্যাম্পলিংয়ের উপর ভিটালিকের মতামত](https://hackmd.io/@vbuterin/sharding_proposal) + +### হার্ডওয়্যার {#hardware} + +ইথেরিয়ামকে বিকেন্দ্রীভূত রাখতে সাধারণ হার্ডওয়্যারে [নোড চালানো](/developers/docs/nodes-and-clients/run-a-node/) মৌলিক। অতএব, নোড চালানোর জন্য হার্ডওয়্যারের প্রয়োজনীয়তা কমানোর জন্য সক্রিয় গবেষণা একটি গুরুত্বপূর্ণ ক্ষেত্র। + +#### প্রেক্ষাপট পাঠ {#background-reading-5} + +- [ARM-এ ইথেরিয়াম](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) + +#### সাম্প্রতিক গবেষণা {#recent-research-5} + +- [FPGAs-তে ecdsa](https://ethresear.ch/t/does-ecdsa-on-fpga-solve-the-scaling-problem/6738) + +## নিরাপত্তা {#security} + +নিরাপত্তা একটি বিস্তৃত বিষয় যার মধ্যে স্প্যাম/স্ক্যাম প্রতিরোধ, ওয়ালেট নিরাপত্তা, হার্ডওয়্যার নিরাপত্তা, ক্রিপ্টো-অর্থনৈতিক নিরাপত্তা, বাগ খোঁজা এবং অ্যাপ্লিকেশন ও ক্লায়েন্ট সফ্টওয়্যার পরীক্ষা করা এবং কী-ম্যানেজমেন্ট অন্তর্ভুক্ত থাকতে পারে। এই ক্ষেত্রগুলিতে জ্ঞানে অবদান মূলধারার গ্রহণকে উৎসাহিত করতে সাহায্য করবে। + +### ক্রিপ্টোগ্রাফি এবং ZKP {#cryptography--zkp} + +জিরো-নলেজ প্রুফ (ZKP) এবং ক্রিপ্টোগ্রাফি ইথেরিয়াম এবং এর অ্যাপ্লিকেশনগুলিতে গোপনীয়তা এবং নিরাপত্তা তৈরি করার জন্য গুরুত্বপূর্ণ। জিরো-নলেজ একটি অপেক্ষাকৃত নতুন কিন্তু দ্রুত গতিতে চলা ক্ষেত্র যেখানে অনেক উন্মুক্ত গবেষণা এবং উন্নয়নের সুযোগ রয়েছে। কিছু সম্ভাবনার মধ্যে রয়েছে [Keccak হ্যাশিং অ্যালগরিদম](https://hackmd.io/sK7v0lr8Txi1bgION1rRpw?view#Overview)-এর আরও দক্ষ ইমপ্লিমেন্টেশন তৈরি করা, বর্তমানে বিদ্যমান পলিনোমিয়াল কমিটমেন্টের চেয়ে ভালো কিছু খুঁজে বের করা বা ecdsa পাবলিক কী তৈরি এবং সিগনেচার যাচাইকরণ সার্কিটের খরচ কমানো। + +#### প্রেক্ষাপট পাঠ {#background-reading-6} + +- [0xparc ব্লগ](https://0xparc.org/blog) +- [zkp.science](https://zkp.science/) +- [Zero Knowledge পডকাস্ট](https://zeroknowledge.fm/) + +#### সাম্প্রতিক গবেষণা {#recent-research-6} + +- [উপবৃত্তাকার কার্ভ ক্রিপ্টোগ্রাফিতে সাম্প্রতিক অগ্রগতি](https://ethresear.ch/t/the-ec-fft-algorithm-without-elliptic-curve-and-isogenies/11346) +- [Ethresear.ch ZK](https://ethresear.ch/c/zk-s-nt-arks/13) + +### ওয়ালেট {#wallets} + +ইথেরিয়াম ওয়ালেট ব্রাউজার এক্সটেনশন, ডেস্কটপ ও মোবাইল অ্যাপ বা ইথেরিয়ামে স্মার্ট কন্ট্র্যাক্ট হতে পারে। সোশ্যাল রিকভারি ওয়ালেটের উপর সক্রিয় গবেষণা চলছে যা ব্যক্তিগত-ব্যবহারকারী কী ব্যবস্থাপনার সাথে সম্পর্কিত কিছু ঝুঁকি কমিয়ে দেয়। ওয়ালেট উন্নয়নের সাথে অ্যাকাউন্ট অ্যাবস্ট্রাকশনের বিকল্প রূপের উপর গবেষণা জড়িত, যা একটি প্রাথমিক গবেষণার গুরুত্বপূর্ণ ক্ষেত্র। + +#### প্রেক্ষাপট পাঠ {#background-reading-7} + +- [ওয়ালেটের পরিচিতি](/wallets/) +- [ওয়ালেট নিরাপত্তার পরিচিতি](/security/) +- [Ethresear.ch নিরাপত্তা](https://ethresear.ch/tag/security) +- [EIP-2938 অ্যাকাউন্ট অ্যাবস্ট্রাকশন](https://eips.ethereum.org/EIPS/eip-2938) +- [EIP-4337 অ্যাকাউন্ট অ্যাবস্ট্রাকশন](https://eips.ethereum.org/EIPS/eip-4337) + +#### সাম্প্রতিক গবেষণা {#recent-research-7} + +- [ভ্যালিডেশন কেন্দ্রিক স্মার্ট কন্ট্র্যাক্ট ওয়ালেট](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) +- [অ্যাকাউন্টের ভবিষ্যৎ](https://ethereum-magicians.org/t/validation-focused-smart-contract-wallets/6603) +- [EIP-3074 AUTH এবং AUTHCALL অপকোড](https://eips.ethereum.org/EIPS/eip-3074) +- [একটি EOA ঠিকানায় কোড প্রকাশ করা](https://eips.ethereum.org/EIPS/eip-5003) + +## কমিউনিটি, শিক্ষা এবং আউটরিচ {#community-education-and-outreach} + +ইথেরিয়ামে নতুন ব্যবহারকারী যুক্ত করার জন্য নতুন শিক্ষামূলক রিসোর্স এবং আউটরিচ পদ্ধতির প্রয়োজন। এর মধ্যে ব্লগ পোস্ট এবং নিবন্ধ, বই, পডকাস্ট, মিম, শিক্ষামূলক রিসোর্স, ইভেন্ট এবং অন্য যেকোনো কিছু অন্তর্ভুক্ত থাকতে পারে যা কমিউনিটি তৈরি করে, নতুনদের স্বাগত জানায় এবং ইথেরিয়াম সম্পর্কে মানুষকে শিক্ষিত করে। + +### UX/UI {#uxui} + +ইথেরিয়ামে আরও বেশি লোককে অনবোর্ড করার জন্য, ইকোসিস্টেমকে অবশ্যই UX/UI উন্নত করতে হবে। এর জন্য ডিজাইনার এবং পণ্য বিশেষজ্ঞদের ওয়ালেট এবং অ্যাপগুলির ডিজাইন পুনরায় পরীক্ষা করতে হবে। + +#### প্রেক্ষাপট পাঠ {#background-reading-8} + +- [Ethresear.ch UX/UI](https://ethresear.ch/c/ui-ux/24) + +#### সাম্প্রতিক গবেষণা {#recent-research-8} + +- [Web3 ডিজাইন ডিসকর্ড](https://discord.gg/FsCFPMTSm9) +- [Web3 ডিজাইন নীতি](https://www.web3designprinciples.com/) +- [ইথেরিয়াম ম্যাজিশিয়ানস UX আলোচনা](https://ethereum-magicians.org/t/og-council-ux-follow-up/9032/3) + +### অর্থনীতি {#economics} + +ইথেরিয়ামের অর্থনীতি গবেষণা দুটি পদ্ধতি অনুসরণ করে: অর্থনৈতিক প্রণোদনার উপর নির্ভরশীল প্রক্রিয়াগুলির নিরাপত্তা যাচাই করা ("ক্ষুদ্র অর্থনীতি") এবং প্রোটোকল, অ্যাপ্লিকেশন এবং ব্যবহারকারীদের মধ্যে মূল্যের প্রবাহ বিশ্লেষণ করা ("সামষ্টিক অর্থনীতি")। ইথেরিয়ামের নিজস্ব সম্পদ (ইথার) এবং এর উপর নির্মিত টোকেনগুলির (যেমন NFTs এবং ERC20 টোকেন) সাথে সম্পর্কিত জটিল ক্রিপ্টো-অর্থনৈতিক কারণ রয়েছে। + +#### প্রেক্ষাপট পাঠ {#background-reading-9} + +- [রোবাস্ট ইনসেনটিভস গ্রুপ](https://rig.ethereum.org/) +- [Devconnect-এ ETHconomics ওয়ার্কশপ](https://www.youtube.com/playlist?list=PLTLjFJ0OQOj5PHRvA2snoOKt2udVsyXEm) + +#### সাম্প্রতিক গবেষণা {#recent-research-9} + +- [EIP1559-এর পরীক্ষামূলক বিশ্লেষণ](https://arxiv.org/abs/2201.05574) +- [প্রচলিত সরবরাহ ভারসাম্য](https://ethresear.ch/t/circulating-supply-equilibrium-for-ethereum-and-minimum-viable-issuance-during-the-proof-of-stake-era/10954) +- [MEV পরিমাপ করা: জঙ্গল কতটা অন্ধকার?](https://arxiv.org/abs/2101.05511) + +### ব্লকস্পেস এবং ফি মার্কেট {#blockspace-fee-markets} + +ব্লকস্পেস মার্কেটগুলি এন্ড-ইউজার ট্রানজ্যাকশন অন্তর্ভুক্ত করাকে নিয়ন্ত্রণ করে, হয় সরাসরি ইথেরিয়ামে (লেয়ার 1) অথবা ব্রিজড নেটওয়ার্কে, যেমন, রোলআপ (লেয়ার 2)। ইথেরিয়ামে, ট্রানজ্যাকশনগুলি EIP-1559 হিসাবে প্রোটোকলে স্থাপন করা ফি মার্কেটে জমা দেওয়া হয়, যা চেইনকে স্প্যাম থেকে রক্ষা করে এবং কনজেশন প্রাইসিং করে। উভয় লেয়ারে, ট্রানজ্যাকশনগুলি এক্সটার্নালিটি তৈরি করতে পারে, যা ম্যাক্সিমাল এক্সট্রাক্টবল ভ্যালু (MEV) নামে পরিচিত, যা এই এক্সটার্নালিটিগুলি ক্যাপচার বা পরিচালনা করার জন্য নতুন মার্কেট স্ট্রাকচার তৈরি করে। + +#### প্রেক্ষাপট পাঠ {#background-reading-10} + +- [ইথেরিয়াম ব্লকচেইনের জন্য ট্রানজ্যাকশন ফি মেকানিজম ডিজাইন: EIP-1559 এর একটি অর্থনৈতিক বিশ্লেষণ (টিম রাফগার্ডেন, ২০২০)](https://timroughgarden.org/papers/eip1559.pdf) +- [EIP-1559 এর সিমুলেশন (রোবাস্ট ইনসেনটিভ গ্রুপ)](https://ethereum.github.io/abm1559) +- [প্রথম নীতি থেকে রোলআপ অর্থনীতি](https://barnabe.substack.com/p/understanding-rollup-economics-from?utm_source=url) +- [ফ্ল্যাশ বয়েজ ২.০: ফ্রন্টরানিং, ট্রানজ্যাকশন রিঅর্ডারিং এবং বিকেন্দ্রীভূত এক্সচেঞ্জে কনসেন্সাস অস্থিরতা](https://arxiv.org/abs/1904.05234) + +#### সাম্প্রতিক গবেষণা {#recent-research-10} + +- [বহুমাত্রিক EIP-1559 ভিডিও প্রেজেন্টেশন](https://youtu.be/QbR4MTgnCko) +- [ক্রস ডোমেন MEV](http://arxiv.org/abs/2112.01472) +- [MEV নিলাম](https://ethresear.ch/t/mev-auction-auctioning-transaction-ordering-rights-as-a-solution-to-miner-extractable-value/6788) + +### প্রুফ-অফ-স্টেক ইনসেনটিভস {#proof-of-stake-incentives} + +ভ্যালিডেটররা অসাধু আচরণের বিরুদ্ধে জামানত হিসাবে ইথেরিয়ামের নিজস্ব সম্পদ (ইথার) ব্যবহার করে। এর ক্রিপ্টো-অর্থনীতি নেটওয়ার্কের নিরাপত্তা নির্ধারণ করে। দক্ষ ভ্যালিডেটররা সুস্পষ্ট আক্রমণ শুরু করতে ইনসেনটিভ লেয়ারের সূক্ষ্মতা কাজে লাগাতে পারে। + +#### প্রেক্ষাপট পাঠ {#background-reading-11} + +- [ইথেরিয়াম অর্থনীতি মাস্টারক্লাস এবং অর্থনৈতিক মডেল](https://github.com/CADLabs/ethereum-economic-model) +- [PoS ইনসেনটিভের সিমুলেশন (রোবাস্ট ইনসেনটিভ গ্রুপ)](https://ethereum.github.io/beaconrunner/) + +#### সাম্প্রতিক গবেষণা {#recent-research-11} + +- [প্রস্তাবক/নির্মাতা পৃথকীকরণ (PBS) এর অধীনে ট্রানজ্যাকশনের সেন্সরশিপ প্রতিরোধ বৃদ্ধি করা](https://notes.ethereum.org/s3JToeApTx6CKLJt8AbhFQ) +- [PoS ইথেরিয়ামের উপর তিনটি আক্রমণ](https://arxiv.org/abs/2110.10086) + +### লিকুইড স্টেকিং এবং ডেরিভেটিভস {#liquid-staking-and-derivatives} + +লিকুইড স্টেকিং ৩২ ETH-এর কম থাকা ব্যবহারকারীদের স্টেক করা ইথারের প্রতিনিধিত্বকারী একটি টোকেনের জন্য ইথার সোয়াপ করে স্টেকিং ইল্ড পেতে দেয় যা DeFi-তে ব্যবহার করা যেতে পারে। তবে, লিকুইড স্টেকিং-এর সাথে সম্পর্কিত ইনসেনটিভস এবং বাজারের গতিশীলতা এখনও আবিষ্কৃত হচ্ছে, সেইসাথে ইথেরিয়ামের নিরাপত্তার উপর এর প্রভাব (যেমন, কেন্দ্রীভূততার ঝুঁকি)। + +#### প্রেক্ষাপট পাঠ {#background-reading-12} + +- [Ethresear.ch লিকুইড স্টেকিং](https://ethresear.ch/search?q=liquid%20staking) +- [Lido: ট্রাস্টলেস ইথেরিয়াম স্টেকিং-এর পথ](https://blog.lido.fi/the-road-to-trustless-ethereum-staking/) +- [রকেট পুল: স্টেকিং প্রোটোকল পরিচিতি](https://medium.com/rocket-pool/rocket-pool-staking-protocol-part-1-8be4859e5fbd) + +#### সাম্প্রতিক গবেষণা {#recent-research-12} + +- [Lido থেকে উইথড্রল হ্যান্ডেল করা](https://ethresear.ch/t/handling-withdrawals-in-lidos-eth-liquid-staking-protocol/8873) +- [উইথড্রল ক্রেডেনশিয়ালস](https://ethresear.ch/t/withdrawal-credential-rotation-from-bls-to-eth1/8722) +- [লিকুইড স্টেকিং ডেরিভেটিভসের ঝুঁকি](https://notes.ethereum.org/@djrtwo/risks-of-lsd) + +## টেস্টিং {#testing} + +### ফর্মাল ভেরিফিকেশন {#formal-verification} + +ফর্মাল ভেরিফিকেশন হল ইথেরিয়ামের কনসেন্সাস স্পেসিফিকেশন সঠিক এবং বাগ-মুক্ত কিনা তা যাচাই করার জন্য কোড লেখা। স্পেসিফিকেশনের একটি এক্সিকিউটেবল সংস্করণ রয়েছে যা পাইথনে লেখা এবং যার রক্ষণাবেক্ষণ ও উন্নয়ন প্রয়োজন। আরও গবেষণা স্পেসিফিকেশনের পাইথন ইমপ্লিমেন্টেশন উন্নত করতে এবং এমন টুলস যোগ করতে সাহায্য করতে পারে যা আরও দৃঢ়ভাবে সঠিকতা যাচাই করতে এবং সমস্যা সনাক্ত করতে পারে। + +#### প্রেক্ষাপট পাঠ {#background-reading-13} + +- [ফর্মাল ভেরিফিকেশনের পরিচিতি](https://ptolemy.berkeley.edu/projects/embedded/research/vis/doc/VisUser/vis_user/node4.html) +- [ফর্মাল ভেরিফিকেশন (Intel)](https://www.cl.cam.ac.uk/~jrh13/papers/mark10.pdf) + +#### সাম্প্রতিক গবেষণা {#recent-research-13} + +- [ডিপোজিট কন্ট্রাক্টের ফর্মাল ভেরিফিকেশন](https://github.com/runtimeverification/deposit-contract-verification) +- [বিকন চেইন স্পেসিফিকেশনের ফর্মাল ভেরিফিকেশন](https://github.com/runtimeverification/deposit-contract-verification) + +## ডেটা সায়েন্স এবং অ্যানালিটিক্স {#data-science-and-analytics} + +আরও ডেটা বিশ্লেষণ টুলস এবং ড্যাশবোর্ডের প্রয়োজন রয়েছে যা ইথেরিয়ামের কার্যকলাপ এবং নেটওয়ার্কের স্বাস্থ্য সম্পর্কে বিস্তারিত তথ্য দেবে। + +### প্রেক্ষাপট পাঠ {#background-reading-14} + +- [Dune অ্যানালিটিক্স](https://dune.com/browse/dashboards) +- [ক্লায়েন্ট ডাইভারসিটি ড্যাশবোর্ড](https://clientdiversity.org/) + +#### সাম্প্রতিক গবেষণা {#recent-research-14} + +- [রোবাস্ট ইনসেনটিভস গ্রুপ ডেটা অ্যানালাইসিস](https://rig.ethereum.org/) + +## অ্যাপস এবং টুলিং {#apps-and-tooling} + +অ্যাপ্লিকেশন লেয়ার একটি বিভিন্ন প্রোগ্রামের ইকোসিস্টেমকে সমর্থন করে যা ইথেরিয়ামের বেস লেয়ারে ট্রানজ্যাকশন সম্পন্ন করে। ডেভেলপমেন্ট টিমগুলি ক্রমাগত গুরুত্বপূর্ণ Web2 অ্যাপগুলির কম্পোজেবল, পারমিশনলেস এবং সেন্সরশিপ-প্রতিরোধী সংস্করণ তৈরি করতে বা সম্পূর্ণ নতুন Web3-নেটিভ ধারণা তৈরি করতে ইথেরিয়ামকে কাজে লাগানোর নতুন উপায় খুঁজে বের করছে। একই সময়ে, নতুন টুলিং তৈরি করা হচ্ছে যা ইথেরিয়ামে ডিএ্যাপস তৈরি করাকে কম জটিল করে তোলে। + +### DeFi {#defi} + +ডিসেন্ট্রালাইজড ফাইন্যান্স (DeFi) হল ইথেরিয়ামের উপর নির্মিত অ্যাপ্লিকেশনের অন্যতম প্রধান শ্রেণি। DeFi-এর লক্ষ্য হল কম্পোজেবল "মানি লেগো" তৈরি করা যা ব্যবহারকারীদের স্মার্ট কন্ট্র্যাক্ট ব্যবহার করে ক্রিপ্টো-অ্যাসেট সঞ্চয়, স্থানান্তর, ধার, ঋণ এবং বিনিয়োগ করতে দেয়। DeFi একটি দ্রুত চলমান ক্ষেত্র যা ক্রমাগত আপডেট হচ্ছে। নিরাপদ, দক্ষ এবং সহজলভ্য প্রোটোকল নিয়ে ক্রমাগত গবেষণা প্রয়োজন। + +#### প্রেক্ষাপট পাঠ {#background-reading-15} + +- [DeFi](/defi/) +- [কয়েনবেস: DeFi কী?](https://www.coinbase.com/learn/crypto-basics/what-is-defi) + +#### সাম্প্রতিক গবেষণা {#recent-research-15} + +- [ডিসেন্ট্রালাইজড ফাইন্যান্স, সেন্ট্রালাইজড মালিকানা?](https://arxiv.org/pdf/2012.09306.pdf) +- [Optimism: সাব-ডলার ট্রানজ্যাকশনের পথ](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) + +### DAO {#daos} + +ইথেরিয়ামের জন্য একটি প্রভাবশালী ব্যবহারের ক্ষেত্র হলো DAO ব্যবহার করে একটি বিকেন্দ্রীভূত পদ্ধতিতে সংগঠিত হওয়ার ক্ষমতা। ইথেরিয়ামে কীভাবে DAO গুলিকে উন্নত ধরনের গভর্নেন্স কার্যকর করার জন্য, একটি ট্রাস্ট-মিনিমাইজড কোঅর্ডিনেশন টুল হিসাবে, উন্নত এবং ব্যবহার করা যেতে পারে সে সম্পর্কে অনেক সক্রিয় গবেষণা চলছে, যা প্রথাগত কর্পোরেশন এবং সংস্থাগুলির বাইরে মানুষের বিকল্পগুলিকে ব্যাপকভাবে প্রসারিত করে। + +#### প্রেক্ষাপট পাঠ {#background-reading-16} + +- [DAO-এর পরিচিতি](/dao/) +- [DAO কালেক্টিভ](https://daocollective.xyz/) + +#### সাম্প্রতিক গবেষণা {#recent-research-16} + +- [DAO ইকোসিস্টেমের ম্যাপিং](https://www.researchgate.net/publication/358694594_Mapping_out_the_DAO_Ecosystem_and_Assessing_DAO_Autonomy) + +### ডেভেলপার টুলস {#developer-tools} + +ইথেরিয়াম ডেভেলপারদের জন্য টুলস দ্রুত উন্নত হচ্ছে। এই সাধারণ ক্ষেত্রে অনেক সক্রিয় গবেষণা এবং উন্নয়ন করার আছে। + +#### প্রেক্ষাপট পাঠ {#background-reading-17} + +- [প্রোগ্রামিং ভাষা অনুযায়ী টুলিং](/developers/docs/programming-languages/) +- [ডেভেলপার ফ্রেমওয়ার্ক](/developers/docs/frameworks/) +- [কনসেন্সাস ডেভেলপার টুলসের তালিকা](https://github.com/ConsenSys/ethereum-developer-tools-list) +- [টোকেন স্ট্যান্ডার্ড](/developers/docs/standards/tokens/) +- [CryptoDevHub: EVM টুলস](https://cryptodevhub.io/wiki/ethereum-virtual-machine-tools) + +#### সাম্প্রতিক গবেষণা {#recent-research-17} + +- [Eth R&D Discord কনসেন্সাস টুলিং চ্যানেল](https://discordapp.com/channels/595666850260713488/746343380900118528) + +### ওরাকেলস {#oracles} + +ওরাকেলস ব্লকচেইনে অফচেইন ডেটা অনুমতিহীন এবং বিকেন্দ্রীভূত উপায়ে আমদানি করে। এই ডেটা অনচেইনে আনা হলে ডিএ্যাপসগুলি বাস্তব-জগতের ঘটনা যেমন বাস্তব-জগতের সম্পদের মূল্যের ওঠানামা, অফচেইন অ্যাপের ঘটনা, বা এমনকি আবহাওয়ার পরিবর্তনের প্রতি প্রতিক্রিয়াশীল হতে পারে। + +#### প্রেক্ষাপট পাঠ {#background-reading-18} + +- [ওরাকেলসের পরিচিতি](/developers/docs/oracles/) + +#### সাম্প্রতিক গবেষণা {#recent-research-18} + +- [ব্লকচেইন ওরাকেলসের সমীক্ষা](https://arxiv.org/pdf/2004.07140.pdf) +- [Chainlink হোয়াইট পেপার](https://chain.link/whitepaper) + +### অ্যাপ নিরাপত্তা {#app-security} + +ইথেরিয়ামে হ্যাকগুলি সাধারণত প্রোটোকলের পরিবর্তে পৃথক অ্যাপ্লিকেশনগুলির দুর্বলতাকে কাজে লাগায়। হ্যাকার এবং অ্যাপ ডেভেলপাররা নতুন আক্রমণ এবং প্রতিরক্ষা তৈরি করার জন্য একটি অস্ত্র প্রতিযোগিতায় আবদ্ধ। এর মানে হল অ্যাপগুলিকে হ্যাক থেকে সুরক্ষিত রাখতে সবসময় গুরুত্বপূর্ণ গবেষণা এবং উন্নয়নের প্রয়োজন হয়। + +#### প্রেক্ষাপট পাঠ {#background-reading-19} + +- [Wormhole এক্সপ্লয়েট রিপোর্ট](https://blog.chainalysis.com/reports/wormhole-hack-february-2022/) +- [ইথেরিয়াম কন্ট্র্যাক্ট হ্যাক পোস্ট-মর্টেমের তালিকা](https://forum.openzeppelin.com/t/list-of-ethereum-smart-contracts-post-mortems/1191) +- [Rekt News](https://x.com/RektHQ?s=20&t=3otjYQdM9Bqk8k3n1a1Adg) + +#### সাম্প্রতিক গবেষণা {#recent-research-19} + +- [Ethresear.ch অ্যাপ্লিকেশন](https://ethresear.ch/c/applications/18) + +### প্রযুক্তি স্ট্যাক {#technology-stack} + +সম্পূর্ণ ইথেরিয়াম টেক স্ট্যাক বিকেন্দ্রীভূত করা একটি গুরুত্বপূর্ণ গবেষণার ক্ষেত্র। বর্তমানে, ইথেরিয়ামে ডিএ্যাপসগুলির সাধারণত কিছু কেন্দ্রীভূততার পয়েন্ট থাকে কারণ তারা কেন্দ্রীভূত টুলিং বা অবকাঠামোর উপর নির্ভর করে। + +#### প্রেক্ষাপট পাঠ {#background-reading-20} + +- [ইথেরিয়াম স্ট্যাক](/developers/docs/ethereum-stack/) +- [কয়েনবেস: Web3 স্ট্যাকের পরিচিতি](https://blog.coinbase.com/a-simple-guide-to-the-web3-stack-785240e557f0) +- [স্মার্ট কন্ট্রাক্টের পরিচিতি](/developers/docs/smart-contracts/) +- [বিকেন্দ্রীভূত স্টোরেজের পরিচিতি](/developers/docs/storage/) + +#### সাম্প্রতিক গবেষণা {#recent-research-20} + +- [স্মার্ট কন্ট্রাক্ট কম্পোজেবিলিটি](/developers/docs/smart-contracts/composability/) diff --git a/public/content/translations/bn/community/support/index.md b/public/content/translations/bn/community/support/index.md new file mode 100644 index 00000000000..13093860897 --- /dev/null +++ b/public/content/translations/bn/community/support/index.md @@ -0,0 +1,104 @@ +--- +title: "ইথেরিয়াম সাপোর্ট" +description: "ইথেরিয়াম ইকোসিস্টেমে সহায়তা পান।" +lang: bn +--- + +# ইথেরিয়াম সহায়তা {#support} + +## অফিশিয়াল ইথেরিয়াম সহায়তা {#official-support} + +আপনি কি অফিশিয়াল ইথেরিয়াম সহায়তার জন্য খুঁজছেন? আপনার প্রথম যে জিনিসটি জানা উচিত তা হল ইথেরিয়াম বিকেন্দ্রীভূত। এর মানে হল কোনো কেন্দ্রীয় সংস্থা, সত্তা বা ব্যক্তি ইথেরিয়ামের মালিক নয়, এবং এই কারণে, কোনো অফিশিয়াল সহায়তা চ্যানেল বিদ্যমান নেই। + +ইথেরিয়ামের বিকেন্দ্রীভূত প্রকৃতি বোঝা অত্যাবশ্যক কারণ **যেই নিজেকে ইথেরিয়ামের অফিশিয়াল সহায়তা বলে দাবি করছে, সে সম্ভবত আপনার সাথে স্ক্যাম করার চেষ্টা করছে!** স্ক্যামারদের বিরুদ্ধে সেরা সুরক্ষা হল নিজেকে শিক্ষিত করা এবং নিরাপত্তাকে গুরুত্ব সহকারে নেওয়া। + + + ইথেরিয়াম সুরক্ষা এবং স্ক্যাম প্রতিরোধ + + + + ইথেরিয়ামের মূল বিষয়গুলো শিখুন + + +অফিশিয়াল সহায়তার অভাব সত্ত্বেও, ইথেরিয়াম ইকোসিস্টেম জুড়ে অনেক গোষ্ঠী, সম্প্রদায় এবং প্রকল্প সাহায্য করতে পেরে খুশি, এবং আপনি এই পৃষ্ঠায় অনেক দরকারী তথ্য এবং রিসোর্স খুঁজে পেতে পারেন। এখনও প্রশ্ন আছে? [ethereum.org ডিসকর্ড](https://discord.gg/ethereum-org)-এ যোগ দিন, এবং আমরা সাহায্য করার চেষ্টা করব। + +## সাধারণত জিজ্ঞাসিত প্রশ্নসমূহ {#faq} + +### আমি ভুল ওয়ালেটে ETH পাঠিয়েছি {#wrong-wallet} + +ইথেরিয়ামে পাঠানো একটি লেনদেন অপরিবর্তনীয়। দুর্ভাগ্যবশত, আপনি যদি ভুল ওয়ালেটে ETH পাঠিয়ে থাকেন, তবে এই তহবিল পুনরুদ্ধার করার কোনো উপায় নেই। কোনো একক কেন্দ্রীয় সংস্থা, সত্তা বা ব্যক্তি ইথেরিয়ামের মালিক নয়, যার মানে হল কেউ লেনদেন বিপরীত করতে পারে না। অতএব, পাঠানোর আগে আপনার লেনদেন সবসময় দুবার পরীক্ষা করা অত্যাবশ্যক। + +### আমি কীভাবে আমার ইথেরিয়াম গিভঅ্যাওয়ে দাবি করতে পারি? {#giveaway-scam} + +ইথেরিয়াম গিভঅ্যাওয়ে হল আপনার ETH চুরি করার জন্য ডিজাইন করা স্ক্যাম। যেসব অফার বিশ্বাস করার জন্য খুব ভালো মনে হয়, সেগুলোর দ্বারা প্রলুব্ধ হবেন না — আপনি যদি কোনো গিভঅ্যাওয়ে ঠিকানায় ETH পাঠান, তাহলে আপনি কোনো গিভঅ্যাওয়ে পাবেন না, এবং আপনি আপনার তহবিল পুনরুদ্ধার করতে পারবেন না। + +[স্ক্যাম প্রতিরোধ সম্পর্কে আরও জানুন](/security/#common-scams) + +### আমার লেনদেন আটকে গেছে {#stuck-transaction} + +নেটওয়ার্কের চাহিদার কারণে প্রয়োজনের চেয়ে কম লেনদেন ফি জমা দিলে ইথেরিয়ামে লেনদেন কখনও কখনও আটকে যেতে পারে। অনেক ওয়ালেট লেনদেন প্রক্রিয়াকরণের জন্য উচ্চতর লেনদেন ফি সহ একই লেনদেন পুনরায় জমা দেওয়ার একটি বিকল্প প্রদান করে। বিকল্পভাবে, আপনি আপনার নিজের ঠিকানায় একটি লেনদেন পাঠিয়ে এবং অমীমাংসিত লেনদেনের মতো একই ননস ব্যবহার করে একটি অমীমাংসিত লেনদেন বাতিল করতে পারেন। + +[MetaMask-এ একটি অমীমাংসিত লেনদেনের গতি বাড়ানো বা বাতিল করার উপায়](https://metamask.zendesk.com/hc/en-us/articles/360015489251-How-to-speed-up-or-cancel-a-pending-transaction) + +[অমীমাংসিত ইথেরিয়াম লেনদেন কীভাবে বাতিল করবেন](https://info.etherscan.com/how-to-cancel-ethereum-pending-transactions/) + +### আমি কীভাবে ইথেরিয়াম মাইন করব? {#mining-ethereum} + +ইথেরিয়াম মাইনিং আর সম্ভব নয়। ইথেরিয়াম যখন [প্রুফ-অফ-ওয়ার্ক](/glossary/#pow) থেকে [প্রুফ-অফ-স্টেক](/glossary/#pos)-এ স্থানান্তরিত হয়, তখন মাইনিং বন্ধ করে দেওয়া হয়। এখন, মাইনারদের পরিবর্তে, ইথেরিয়ামে ভ্যালিডেটর রয়েছে। নেটওয়ার্ক সুরক্ষিত করার জন্য যে কেউ ETH [স্টেক](/glossary/#staking) করতে পারেন এবং ভ্যালিডেটর সফ্টওয়্যার চালানোর জন্য স্টেকিং পুরস্কার পেতে পারেন। + +### আমি কীভাবে একজন স্টেকার / ভ্যালিডেটর চালাব? {#how-to-stake} + +একজন ভ্যালিডেটর হতে, আপনাকে অবশ্যই ইথেরিয়াম ডিপোজিট কন্ট্রাক্টে 32 ETH স্টেক করতে হবে এবং একটি ভ্যালিডেটর নোড সেট আপ করতে হবে। আমাদের [স্টেকিং পেজ](/staking)-এ এবং [স্টেকিং লঞ্চপ্যাড](https://launchpad.ethereum.org/)-এ আরও তথ্য পাওয়া যায়। + +## ডিএ্যাপস তৈরি করা {#building-support} + +তৈরি করা কঠিন হতে পারে। এখানে অভিজ্ঞ ইথেরিয়াম ডেভেলপারদের সাথে কিছু উন্নয়ন কেন্দ্রিক স্থান রয়েছে যারা সাহায্য করতে পেরে খুশি। + +- [Alchemy University](https://university.alchemy.com/#starter_code) +- [CryptoDevs discord](https://discord.com/invite/5W5tVb3) +- [Ethereum StackExchange](https://ethereum.stackexchange.com/) +- [Web3 University](https://www.web3.university/) +- [LearnWeb3](https://discord.com/invite/learnweb3) + +আপনি আমাদের [ইথেরিয়াম ডেভেলপার রিসোর্স](/developers/) বিভাগে ডকুমেন্টেশন এবং ডেভেলপমেন্ট গাইডও খুঁজে পেতে পারেন। + +### টুলিং {#dapp-tooling} + +আপনার প্রশ্ন কি কোনো নির্দিষ্ট টুল, প্রকল্প বা লাইব্রেরির সাথে সম্পর্কিত? বেশিরভাগ প্রকল্পের চ্যাট সার্ভার বা ফোরাম রয়েছে যা আপনাকে সহায়তা করার জন্য নিবেদিত। + +এখানে কিছু জনপ্রিয় উদাহরণ রয়েছে: + +- [Solidity](https://gitter.im/ethereum/solidity) +- [ethers.js](https://discord.gg/6jyGVDK6Jx) +- [web3.js](https://discord.gg/GsABYQu4sC) +- [Hardhat](https://discord.gg/xtrMGhmbfZ) +- [Alchemy](http://alchemy.com/discord) +- [Tenderly](https://discord.gg/fBvDJYR) + +## একটি নোড চালানো {#node-support} + +আপনি যদি একটি নোড বা ভ্যালিডেটর চালান, তবে এখানে কিছু সম্প্রদায় রয়েছে যা আপনাকে শুরু করতে সাহায্য করার জন্য নিবেদিত। + +- [EthStaker discord](https://discord.gg/ethstaker) +- [EthStaker reddit](https://www.reddit.com/r/ethstaker) + +ইথেরিয়াম ক্লায়েন্ট তৈরি করা বেশিরভাগ দলেরও নিবেদিত, সর্বজনীন-মুখী, স্থান রয়েছে যেখানে আপনি সহায়তা পেতে এবং প্রশ্ন জিজ্ঞাসা করতে পারেন। + +### এক্সিকিউশন ক্লায়েন্ট {#execution-clients} + +- [Geth](https://discord.gg/FqDzupGyYf) +- [Nethermind](https://discord.gg/YJx3pm8z5C) +- [Besu](https://discord.gg/p8djYngzKN) +- [Erigon](https://github.com/ledgerwatch/erigon/issues) +- [Reth](https://github.com/paradigmxyz/reth/discussions) + +### কনসেন্সাস ক্লায়েন্ট {#consensus-clients} + +- [Prysm](https://discord.gg/prysmaticlabs) +- [Nimbus](https://discord.gg/nSmEH3qgFv) +- [Lighthouse](https://discord.gg/cyAszAh) +- [Teku](https://discord.gg/7hPv2T6) +- [Lodestar](https://discord.gg/aMxzVcr) +- [Grandine](https://discord.gg/H9XCdUSyZd) + +আপনি এখানে [কিভাবে একটি নোড চালাতে হয় তা শিখতে পারেন](/developers/docs/nodes-and-clients/run-a-node/)। diff --git a/public/content/translations/bn/contributing/adding-desci-projects/index.md b/public/content/translations/bn/contributing/adding-desci-projects/index.md new file mode 100644 index 00000000000..4d8911ed01c --- /dev/null +++ b/public/content/translations/bn/contributing/adding-desci-projects/index.md @@ -0,0 +1,44 @@ +--- +title: "DeSci প্রকল্প যোগ করা" +description: "ethereum.org-এর DeSci পৃষ্ঠায় প্রকল্পগুলির লিঙ্ক যোগ করার জন্য আমরা যে নীতি ব্যবহার করি।" +lang: bn +--- + +# প্রকল্প যোগ করা {#adding-projects} + +আমরা বিভিন্ন ধরনের প্রকল্প দেখিয়ে DeSci পরিমণ্ডলের একটি ভালো চিত্র তুলে ধরতে চাই। + +ethereum.org-এর DeSci পৃষ্ঠায় তালিকাভুক্ত করার জন্য যেকেউ একটি প্রকল্পের পরামর্শ দিতে পারেন। একইভাবে, কোনো প্রকল্প আর প্রাসঙ্গিক না থাকলে বা আমাদের যোগ্যতার মানদণ্ড পূরণ না করলে, যে কেউ সেটিকে সরানোর জন্য পরামর্শ দিতে পারেন। + +## সিদ্ধান্তের কাঠামো {#the-decision-framework} + +### অন্তর্ভুক্তির জন্য মানদণ্ড: যা অবশ্যই থাকতে হবে {#the-must-haves} + +- **ওপেন সোর্স কোড/ডেটা** - কোড এবং ডেটার উন্মুক্ততা একটি মূল DeSci নীতি, তাই DeSci প্রকল্পগুলি অবশ্যই ক্লোজড সোর্স হবে না। কোডবেসটি অ্যাক্সেসযোগ্য হওয়া উচিত এবং আদর্শভাবে PR-এর জন্য উন্মুক্ত থাকা উচিত। +- **DeSci প্রকল্পগুলিকে সুস্পষ্টভাবে বিকেন্দ্রীভূত হতে হবে** - এর মধ্যে একটি DAO দ্বারা পরিচালিত হওয়া, বা নন-কাস্টোডিয়াল ওয়ালেট সহ একটি বিকেন্দ্রীভূত টেক স্ট্যাক দিয়ে তৈরি করা অন্তর্ভুক্ত থাকতে পারে। এতে সম্ভবত Ethereum-এর উপর নিরীক্ষাযোগ্য স্মার্ট কন্ট্র্যাক্ট জড়িত। +- **সৎ এবং সঠিক তালিকাভুক্তির তথ্য** - আশা করা হচ্ছে যে প্রকল্পগুলি থেকে প্রস্তাবিত যেকোনো তালিকাভুক্তির তথ্য সৎ এবং সঠিক হবে। যেসব পণ্য তালিকাভুক্তির তথ্য মিথ্যা প্রমাণিত করে, যেমন আপনার পণ্যটি "ওপেন সোর্স" না হওয়া সত্ত্বেও সেটিকে "ওপেন সোর্স" হিসেবে ঘোষণা করা, সেগুলোকে সরিয়ে দেওয়া হবে। +- **বিজ্ঞানে প্রবেশাধিকার প্রসারে সুস্পষ্ট প্রতিশ্রুতি** - একটি DeSci প্রকল্পের এটি ব্যক্ত করতে পারা উচিত যে তারা কীভাবে শুধুমাত্র টোকেন/NFT হোল্ডারদের জন্য নয়, বরং সাধারণ মানুষের জন্য বিজ্ঞানে অংশগ্রহণ প্রসারিত করে। +- **বিশ্বব্যাপী অ্যাক্সেসযোগ্য** - আপনার প্রকল্পের কোনো ভৌগোলিক সীমাবদ্ধতা বা KYC প্রয়োজনীয়তা নেই যা নির্দিষ্ট কিছু লোককে আপনার পরিষেবা অ্যাক্সেস করা থেকে বাদ দেয়। +- **তথ্যপূর্ণ ওয়েবসাইট এবং নথিপত্র** - এটা জরুরি যে প্রকল্পের ওয়েবসাইটে আসা ভিজিটররা যেন বুঝতে পারে প্রকল্পটি আসলে কী করে, কীভাবে এটি বিজ্ঞানের পরিকাঠামোর বিকেন্দ্রীকরণে অবদান রাখে এবং কীভাবে এতে অংশগ্রহণ করা যায়। +- **প্রকল্পটি Ethereum ইকোসিস্টেমের অংশ হতে হবে** - ethereum.org-এ আমরা বিশ্বাস করি যে DeSci আন্দোলনের জন্য Ethereum (এবং এর লেয়ার 2-গুলি) হলো উপযুক্ত বেস লেয়ার। +- **প্রকল্পটি মোটামুটি সুপ্রতিষ্ঠিত হতে হবে** - প্রকল্পটির প্রকৃত ব্যবহারকারী থাকতে হবে যারা বেশ কয়েক মাস ধরে প্রকল্পের পরিষেবাগুলি অ্যাক্সেস করতে সক্ষম হয়েছে। + +### থাকলে ভালো + +- **একাধিক ভাষায় উপলব্ধ** - আপনার প্রকল্পটি একাধিক ভাষায় অনূদিত হলে সারা বিশ্বের ব্যবহারকারীরা এটি অ্যাক্সেস করতে পারবেন। +- **শিক্ষামূলক রিসোর্স** - ব্যবহারকারীদের সাহায্য ও শিক্ষিত করার জন্য আপনার পণ্যের একটি সু-পরিকল্পিত অনবোর্ডিং অভিজ্ঞতা থাকা উচিত। অথবা নিবন্ধ বা ভিডিওর মতো কীভাবে-করতে-হয় কন্টেন্টের প্রমাণ। +- **থার্ড-পার্টি অডিট** - আপনার পণ্যটি কোনো বিশ্বস্ত থার্ড-পার্টির দ্বারা দুর্বলতার জন্য পেশাগতভাবে নিরীক্ষিত। +- **যোগাযোগের মাধ্যম** - প্রকল্পের জন্য একটি যোগাযোগের মাধ্যম (এটি কোনো DAO বা কমিউনিটির প্রতিনিধি হতে পারে) থাকলে, কোনো পরিবর্তন করার সময় আমাদের সঠিক তথ্য পেতে অনেক সাহায্য হবে। ভবিষ্যতে তথ্য সংগ্রহের সময় এটি ethereum.org আপডেট করার কাজটিকে পরিচালনযোগ্য করে তুলবে। + +## রক্ষণাবেক্ষণ {#maintenance} + +Ethereum-এর পরিবর্তনশীল প্রকৃতির মতোই, দল এবং পণ্য আসে এবং যায় এবং প্রতিদিন নতুন উদ্ভাবন ঘটে, তাই আমরা আমাদের কন্টেন্টের রুটিন পরীক্ষা চালাব এগুলোর জন্য: + +- তালিকাভুক্ত সমস্ত প্রকল্প এখনও আমাদের মানদণ্ড পূরণ করছে কিনা তা নিশ্চিত করুন +- এমন কোনো প্রস্তাবিত পণ্য নেই যা বর্তমানে তালিকাভুক্ত পণ্যগুলির চেয়ে আমাদের বেশি মানদণ্ড পূরণ করে, তা যাচাই করুন। + +Ethereum.org ওপেন সোর্স কমিউনিটি দ্বারা পরিচালিত হয় এবং এটিকে আপ-টু-ডেট রাখতে আমরা কমিউনিটির সাহায্যের উপর নির্ভর করি। তালিকাভুক্ত প্রকল্পগুলি সম্পর্কে এমন কোনো তথ্য যদি আপনার নজরে আসে যা আপডেট করা প্রয়োজন, তাহলে অনুগ্রহ করে আমাদের GitHub রিপোজিটরিতে একটি ইস্যু অথবা একটি পুল রিকোয়েস্ট খুলুন। + +## ব্যবহারের শর্তাবলী {#terms-of-use} + +অনুগ্রহ করে আমাদের [ব্যবহারের শর্তাবলী](/terms-of-use/) দেখুন। ethereum.org-এর তথ্য শুধুমাত্র সাধারণ তথ্যের উদ্দেশ্যে প্রদান করা হয়েছে। diff --git a/public/content/translations/bn/contributing/adding-developer-tools/index.md b/public/content/translations/bn/contributing/adding-developer-tools/index.md new file mode 100644 index 00000000000..7ed662406e3 --- /dev/null +++ b/public/content/translations/bn/contributing/adding-developer-tools/index.md @@ -0,0 +1,61 @@ +--- +title: "ডেভেলপার টুলস যোগ করা" +lang: bn +description: "ethereum.org-এ ডেভেলপার টুলস তালিকাভুক্ত করার জন্য আমাদের মানদণ্ড" +--- + +# ডেভেলপার টুলস যোগ করা {#contributing-to-ethereumorg-} + +আমরা নিশ্চিত করতে চাই যে আমরা সম্ভাব্য সেরা ডেভেলপার রিসোর্স তালিকাভুক্ত করেছি যাতে লোকেরা আত্মবিশ্বাসের সাথে নির্মাণ করতে পারে এবং তাদের প্রয়োজনীয় সমর্থন পেতে পারে। + +যদি এমন কোনো সহায়ক ডেভেলপার টুল থাকে যা আমরা মিস করেছি, তাহলে নির্দ্বিধায় উপযুক্ত কোনো স্থানে এটির পরামর্শ দিন। + +আমরা বর্তমানে আমাদের [ডেভেলপার পোর্টাল](/developers/)-এর সর্বত্র ডেভেলপার টুলস তালিকাভুক্ত করি। + +**উপযুক্ত পেজগুলিতে নতুন সংযোজনের জন্য নির্দ্বিধায় পরামর্শ দিন।** + +## আমরা কীভাবে সিদ্ধান্ত নিই {#ways-to-contribute} + +ডেভেলপার টুলের জমাগুলি নিম্নলিখিত মানদণ্ড দ্বারা মূল্যায়ন করা হবে: + +**এটি কি ইতিমধ্যে তালিকাভুক্ত টুলস থেকে অর্থপূর্ণভাবে আলাদা?** + +- টুলসের নতুন বিভাগ বা প্রকার +- বিদ্যমান অনুরূপ টুলসের তুলনায় নতুন বৈশিষ্ট্য +- বিদ্যমান অনুরূপ টুলস দ্বারা আচ্ছাদিত নয় এমন একটি স্বতন্ত্র ব্যবহারের ক্ষেত্রে লক্ষ্যযুক্ত + +**টুলটি কি ভালভাবে নথিভুক্ত?** + +- নথিপত্র কি বিদ্যমান? +- টুলটি ব্যবহার করার জন্য এটি কি যথেষ্ট? +- এটি কি সম্প্রতি আপডেট করা হয়েছে? + +**টুলটি কি ব্যাপকভাবে ব্যবহৃত হয়?** + +- আমরা GitHub স্টার, ডাউনলোড পরিসংখ্যান এবং এটি পরিচিত কোম্পানি বা প্রকল্প দ্বারা ব্যবহৃত হয় কিনা তার মতো মেট্রিকগুলি বিবেচনা করব + +**টুলটি কি পর্যাপ্ত মানের?** + +- পুনরাবৃত্ত বাগ আছে কি? +- টুলটি কি নির্ভরযোগ্য? +- টুলটি কি সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয়? + +**টুলটি কি ওপেন সোর্স?** + +ইথেরিয়াম স্পেসের অনেক প্রকল্পই ওপেন সোর্স। আমরা ওপেন-সোর্স প্রকল্পগুলি তালিকাভুক্ত করার সম্ভাবনা বেশি যা কমিউনিটি ডেভেলপারদের কোড পরিদর্শন করতে এবং এতে অবদান রাখতে দেয়। + +--- + +## পণ্যের ক্রম {#product-ordering} + +যদি না পণ্যগুলিকে বিশেষভাবে অন্যভাবে অর্ডার করা হয়, যেমন বর্ণানুক্রমিকভাবে, পণ্যগুলি পেজে সবচেয়ে কম থেকে সাম্প্রতিকতম যোগ করা পর্যন্ত প্রদর্শিত হবে। অন্য কথায়, নতুন পণ্যগুলি তালিকার শেষে যোগ করা হয়। + +--- + +## আপনার ডেভেলপার টুল যোগ করুন {#how-decisions-about-the-site-are-made} + +আপনি যদি ethereum.org-এ একটি ডেভেলপার টুল যোগ করতে চান এবং এটি মানদণ্ড পূরণ করে, তাহলে GitHub-এ একটি ইস্যু তৈরি করুন। + + + ইস্যু তৈরি করুন + diff --git a/public/content/translations/bn/contributing/adding-exchanges/index.md b/public/content/translations/bn/contributing/adding-exchanges/index.md new file mode 100644 index 00000000000..94e6e76ce4c --- /dev/null +++ b/public/content/translations/bn/contributing/adding-exchanges/index.md @@ -0,0 +1,40 @@ +--- +title: "এক্সচেঞ্জ যোগ করা হচ্ছে" +description: "ethereum.org-এ এক্সচেঞ্জ যোগ করার সময় আমরা যে নীতি ব্যবহার করি" +lang: bn +--- + +# Ethereum এক্সচেঞ্জ যোগ করা {#adding-ethereum-exchanges} + +যে কেউ ethereum.org-এ নতুন এক্সচেঞ্জের জন্য নির্দ্বিধায় পরামর্শ দিতে পারেন। + +আমরা বর্তমানে তাদের এখানে তালিকাভুক্ত করি: + +- [ethereum.org/get-eth](/get-eth/) + +এই পৃষ্ঠাটি একজন ব্যবহারকারীকে তিনি কোথায় থাকেন তা ইনপুট করতে এবং তারা কোন এক্সচেঞ্জগুলি ব্যবহার করতে পারেন তা দেখার অনুমতি দেয়। এটি কোনো ভৌগোলিক বিধিনিষেধ থাকলে তা আগে থেকেই জানতে সাহায্য করে। + +এই প্রসঙ্গের কারণে, আপনি যখন একটি এক্সচেঞ্জের জন্য পরামর্শ দেবেন তখন আমাদের কিছু নির্দিষ্ট তথ্যের প্রয়োজন হবে। + +**দ্রষ্টব্য:** আপনি যদি একটি ডিসেন্ট্রালাইজড এক্সচেঞ্জ তালিকাভুক্ত করতে চান, তাহলে ওয়ালেট এবং ডিএ্যাপস তালিকাভুক্ত করার জন্য আমাদের [নীতি](/contributing/adding-products/) দেখুন। + +## আমাদের যা প্রয়োজন {#what-we-need} + +- এক্সচেঞ্জের ক্ষেত্রে প্রযোজ্য ভৌগোলিক সীমাবদ্ধতা। এক্সচেঞ্জের সাথে সম্পর্কিত ভৌগোলিক সীমাবদ্ধতাগুলি এক্সচেঞ্জের ওয়েবসাইটের একটি নির্দিষ্ট পৃষ্ঠা বা বিভাগে বিস্তারিতভাবে উল্লেখ করা উচিত। +- ETH কেনার জন্য ব্যবহারকারীরা যে মুদ্রাগুলো ব্যবহার করতে পারেন +- এক্সচেঞ্জটি যে একটি বৈধ ট্রেডিং কোম্পানি তার প্রমাণ +- আপনার কাছে থাকা যেকোনো অতিরিক্ত তথ্য – এটি কোম্পানির বিষয়ে তথ্য হতে পারে, যেমন কত বছর ধরে এটি চালু আছে, আর্থিক সহায়তা ইত্যাদি। + +আমাদের এই তথ্যের প্রয়োজন যাতে আমরা সঠিকভাবে [ব্যবহারকারীদের এমন একটি এক্সচেঞ্জ খুঁজে পেতে সাহায্য করতে পারি যা তারা ব্যবহার করতে পারবে](/get-eth/#country-picker)। + +এবং যাতে ethereum.org আরও আত্মবিশ্বাসী হতে পারে যে এক্সচেঞ্জটি একটি বৈধ এবং নিরাপদ পরিষেবা। + +--- + +## আপনার এক্সচেঞ্জ যোগ করুন {#add-exchange} + +আপনি যদি ethereum.org-এ একটি এক্সচেঞ্জ যোগ করতে চান, তাহলে GitHub-এ একটি ইস্যু তৈরি করুন। + + + একটি ইস্যু তৈরি করুন + diff --git a/public/content/translations/bn/contributing/adding-glossary-terms/index.md b/public/content/translations/bn/contributing/adding-glossary-terms/index.md new file mode 100644 index 00000000000..f6e54a85361 --- /dev/null +++ b/public/content/translations/bn/contributing/adding-glossary-terms/index.md @@ -0,0 +1,26 @@ +--- +title: "গ্লসারি পরিভাষা যোগ করা হচ্ছে" +lang: bn +description: "ethereum.org গ্লসারিতে নতুন পরিভাষা যোগ করার জন্য আমাদের মানদণ্ড" +--- + +# গ্লসারি পরিভাষা যোগ করা {#contributing-to-ethereumorg-} + +এই ক্ষেত্রটি প্রতিদিন পরিবর্তিত হচ্ছে। Ethereum ব্যবহারকারীদের শব্দভান্ডারে ক্রমাগত নতুন পরিভাষা প্রবেশ করছে এবং Ethereum-এর সমস্ত কিছুর জন্য একটি নির্ভুল, আপ-টু-ডেট রেফারেন্স প্রদানে আমাদের আপনার সাহায্য প্রয়োজন। বর্তমান [গ্লসারি](/glossary/) দেখুন এবং আপনি যদি সাহায্য করতে চান তবে নীচে দেখুন! + +## মানদণ্ড {#criteria} + +নতুন গ্লসারি পরিভাষাগুলি নিম্নলিখিত মানদণ্ড দ্বারা মূল্যায়ন করা হবে: + +- পরিভাষা/সংজ্ঞাটি কি আপ-টু-ডেট এবং বর্তমানে প্রাসঙ্গিক? +- অভিধানে ইতিমধ্যে একই ধরনের কোনো পরিভাষা আছে কি? (যদি তাই হয়, একটি বিদ্যমান পরিভাষা আপডেট করার পরিবর্তে একটি নতুন পরিভাষার সুবিধাগুলি বিবেচনা করুন) +- পরিভাষা/সংজ্ঞাটি কি পণ্যের বিজ্ঞাপন বা অন্যান্য প্রচারমূলক বিষয়বস্তু থেকে মুক্ত? +- পরিভাষা/সংজ্ঞাটি কি সরাসরি Ethereum-এর সাথে প্রাসঙ্গিক? +- সংজ্ঞাটি কি বস্তুনিষ্ঠ, নির্ভুল এবং ব্যক্তিগত বিচার বা মতামত থেকে মুক্ত? +- উৎসটি কি বিশ্বাসযোগ্য? তারা কি তাদের উৎসের উল্লেখ করে? + +--- + +## আপনার পরিভাষা যোগ করুন {#how-decisions-about-the-site-are-made} + +আপনি যদি ethereum.org-এ একটি গ্লসারি পরিভাষা যোগ করতে চান এবং এটি মানদণ্ড পূরণ করে, তাহলে [GitHub-এ একটি ইস্যু তৈরি করুন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_glossary_term.yaml)। diff --git a/public/content/translations/bn/contributing/adding-layer-2s/index.md b/public/content/translations/bn/contributing/adding-layer-2s/index.md new file mode 100644 index 00000000000..4705668a05d --- /dev/null +++ b/public/content/translations/bn/contributing/adding-layer-2s/index.md @@ -0,0 +1,97 @@ +--- +title: "লেয়ার 2 যোগ করা হচ্ছে" +description: "ethereum.org-এ একটি লেয়ার 2 যোগ করার সময় আমরা যে নীতিটি ব্যবহার করি" +lang: bn +--- + +# লেয়ার 2 যোগ করা {#adding-layer-2} + +আমরা নিশ্চিত করতে চাই যে আমরা সম্ভাব্য সর্বোত্তম রিসোর্সগুলো তালিকাভুক্ত করেছি যাতে ব্যবহারকারীরা নিরাপদ এবং আত্মবিশ্বাসী উপায়ে লেয়ার 2 স্পেস নেভিগেট করতে পারে। + +ethereum.org-এ একটি লেয়ার 2 যোগ করার জন্য যে কেউ নির্দ্বিধায় পরামর্শ দিতে পারে। যদি এমন কোনো লেয়ার 2 থাকে যা আমরা বাদ দিয়েছি, **[দয়া করে এটির পরামর্শ দিন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_layer2.yaml)!** + +আমরা বর্তমানে নিম্নলিখিত পৃষ্ঠাগুলিতে L2s তালিকাভুক্ত করি: + +- [অপ্টিমেস্টিক রোলআপ](/developers/docs/scaling/optimistic-rollups/) +- [জিরো-নলেজ রোলআপ](/developers/docs/scaling/zk-rollups/) +- [লেয়ার 2](/layer-2/) + +লেয়ার 2 Ethereum-এর জন্য একটি তুলনামূলকভাবে নতুন এবং উত্তেজনাপূর্ণ দৃষ্টান্ত। আমরা ethereum.org-এ বিবেচনার জন্য একটি ন্যায্য কাঠামো তৈরি করার চেষ্টা করেছি কিন্তু তালিকাভুক্তির মানদণ্ড সময়ের সাথে সাথে পরিবর্তিত হবে এবং বিকশিত হবে। + +## সিদ্ধান্ত কাঠামো {#decision-framework} + +### অন্তর্ভুক্তির জন্য মানদণ্ড: যা অবশ্যই থাকতে হবে {#criteria-for-inclusion-the-must-haves} + +**L2BEAT-এ তালিকাভুক্তি** + +- বিবেচনার জন্য, এই প্রকল্পটি অবশ্যই [L2BEAT](https://l2beat.com)-এ তালিকাভুক্ত হতে হবে। L2BEAT লেয়ার 2 প্রকল্পগুলির একটি শক্তিশালী ঝুঁকি মূল্যায়ন প্রদান করে যার উপর আমরা L2 প্রকল্প মূল্যায়নের জন্য নির্ভর করি। **যদি প্রকল্পটি L2BEAT-এ বৈশিষ্ট্যযুক্ত না হয়, আমরা সেগুলিকে ethereum.org-এ একটি L2 হিসাবে তালিকাভুক্ত করব না।** +- [আপনার L2 প্রকল্পটি L2BEAT-এ কীভাবে যুক্ত করবেন তা জানুন](https://github.com/l2beat/l2beat/blob/master/CONTRIBUTING.md)। + +**ওপেন সোর্স** + +- আপনার কোডটি অবশ্যই অ্যাক্সেসযোগ্য হতে হবে এবং আপনার বৃহত্তর কমিউনিটির থেকে PR গ্রহণ করা উচিত। + +**লেয়ার 2 বিভাগ** + +আমরা বর্তমানে নিম্নলিখিতগুলিকে লেয়ার 2 সমাধান হিসাবে বিবেচনা করি: + +- অপ্টিমেস্টিক রোলআপ +- জিরো-নলেজ রোলআপ + +_আমরা ডেটা প্রাপ্যতা বা নিরাপত্তার জন্য Ethereum ব্যবহার করে না এমন অন্যান্য স্কেলিং সমাধানগুলিকে লেয়ার 2 হিসাবে বিবেচনা করি না।_ + +**ডেটা উপলব্ধতার জন্য Ethereum** + +- অন্যান্য স্কেলিং সমাধান এবং লেয়ার 2-এর মধ্যে ডেটা উপলব্ধতা একটি গুরুত্বপূর্ণ পার্থক্যকারী ফ্যাক্টর। তালিকাভুক্তির জন্য বিবেচিত হতে একটি প্রকল্পকে ডেটা উপলব্ধতার জন্য **অবশ্যই** Ethereum মেইননেট ব্যবহার করতে হবে। + +**ব্রিজ** + +- ব্যবহারকারীরা কীভাবে লেয়ার 2-এ অনবোর্ড করতে পারে? + +**প্রকল্পটি লাইভ হওয়ার তারিখ** + +- একটি লেয়ার 2 যা 6 মাসেরও বেশি সময় ধরে মেইননেটে "লাইভ" রয়েছে + +- যে নতুন প্রকল্পগুলি ব্যবহারকারীদের দ্বারা পরীক্ষিত হয়নি, সেগুলির তালিকাভুক্ত হওয়ার সম্ভাবনা কম। + +**বাহ্যিক নিরাপত্তা নিরীক্ষা** + +- নিরীক্ষা, একটি অভ্যন্তরীণ নিরাপত্তা দল বা অন্য কোনো পদ্ধতির মাধ্যমেই হোক না কেন, আপনার পণ্যের নিরাপত্তা নির্ভরযোগ্যভাবে পরীক্ষা করা আবশ্যক। এটি আমাদের ব্যবহারকারীদের ঝুঁকি কমায় এবং আমাদের দেখায় যে আপনি নিরাপত্তাকে গুরুত্ব সহকারে নেন। + +**টেকসই ব্যবহারকারী বেস** + +- আমরা TVL ইতিহাস, লেনদেনের পরিসংখ্যানের মতো মেট্রিকগুলি এবং এটি পরিচিত কোম্পানি বা প্রকল্পগুলির দ্বারা ব্যবহৃত হয় কিনা তা বিবেচনা করব + +**সক্রিয় ডেভেলপমেন্ট দল** + +- আমরা এমন কোনো লেয়ার 2 তালিকাভুক্ত করব না যার প্রকল্পে কাজ করার জন্য একটি সক্রিয় দল নেই। + +**ব্লক এক্সপ্লোরার** + +- তালিকাভুক্ত প্রকল্পগুলির জন্য একটি কার্যকরী ব্লক এক্সপ্লোরার প্রয়োজন যাতে ব্যবহারকারীরা সহজে চেইনটি নেভিগেট করতে পারে। + +### অন্যান্য মানদণ্ড: যেগুলো থাকলে ভালো হয় {#nice-to-haves} + +**প্রকল্পের জন্য এক্সচেঞ্জ সমর্থন** + +- ব্যবহারকারীরা কি সরাসরি একটি এক্সচেঞ্জ থেকে জমা এবং/অথবা উত্তোলন করতে পারে? + +**লেয়ার 2 ইকোসিস্টেমের ডিএ্যাপস-এর লিঙ্ক** + +- আমরা এই লেয়ার 2-তে ব্যবহারকারীরা কী করতে সক্ষম হবে বলে আশা করতে পারে সে সম্পর্কে তথ্য প্রদান করতে চাই। (যেমন, https://portal.arbitrum.io/, https://www.optimism.io/apps) + +**টোকেন চুক্তির তালিকা** + +- যেহেতু লেয়ার 2-এ অ্যাসেটগুলির একটি নতুন ঠিকানা থাকবে, তাই যদি কোনো টোকেন তালিকার রিসোর্স উপলব্ধ থাকে তবে অনুগ্রহ করে শেয়ার করুন। + +**নেটিভ ওয়ালেট সমর্থন** + +- কোনো ওয়ালেট কি L2 কে নেটিভভাবে সমর্থন করে? + +## আপনার লেয়ার 2 যোগ করুন {#add-exchange} + +আপনি যদি ethereum.org-এ একটি লেয়ার 2 যোগ করতে চান, তাহলে GitHub-এ একটি ইস্যু তৈরি করুন। + + + একটি ইস্যু তৈরি করুন + diff --git a/public/content/translations/bn/contributing/adding-products/index.md b/public/content/translations/bn/contributing/adding-products/index.md new file mode 100644 index 00000000000..ee3814f1ae3 --- /dev/null +++ b/public/content/translations/bn/contributing/adding-products/index.md @@ -0,0 +1,100 @@ +--- +title: "পণ্য যোগ করা হচ্ছে" +description: "ethereum.org-এ ডিএ্যাপস যোগ করার জন্য আমরা যে নীতি ব্যবহার করি" +lang: bn +--- + +# Ethereum পণ্য যোগ করা {#adding-products} + +যেখানে উপযুক্ত, সেখানে ethereum.org-এর কন্টেন্টে নতুন ডিএ্যাপস যোগ করার জন্য যে কেউ নির্দ্বিধায় পরামর্শ দিতে পারেন। **না, আমরা আপনার ডিএ্যাপ আমাদের হোমপেজে তালিকাভুক্ত করব না** 😜 + +ডিএ্যাপস বর্তমানে এখানে তালিকাভুক্ত আছে: + +- ethereum.org/dapps +- ethereum.org/get-eth + +**অনুগ্রহ করে শুধুমাত্র এই পৃষ্ঠাগুলিতেই নতুন সংযোজনের পরামর্শ দিন।** + +যদিও আমরা নতুন সংযোজনকে স্বাগত জানাই, আমরা আমাদের ব্যবহারকারীদের জন্য একটি অভিজ্ঞতা তৈরি করার চেষ্টার উপর ভিত্তি করে বর্তমান ডিএ্যাপসগুলো বেছে নিয়েছি। এগুলি আমাদের কিছু ডিজাইন নীতির উপর ভিত্তি করে তৈরি করা হয়েছে: + +- _অনুপ্রেরণামূলক_: ethereum.org-এর যেকোনো কিছু ব্যবহারকারীদের নতুন কিছু প্রদান করা উচিত +- _একটি ভালো গল্প_: যা তালিকাভুক্ত করা হয়েছে তা একটি "আহা" মুহূর্ত প্রদান করা উচিত +- _বিশ্বাসযোগ্য_: ব্যবহারকারীদের ঝুঁকি কমানোর জন্য সবকিছু বৈধ ব্যবসা/প্রকল্প হওয়া উচিত + +সামগ্রিকভাবে **ethereum.org নতুন ব্যবহারকারীদের জন্য একটি "নির্বিঘ্ন অনবোর্ডিং অভিজ্ঞতা" প্রদান করতে চায়**। সেই কারণে, আমরা ডিএ্যাপস যোগ করি তাদের এগুলোর উপর ভিত্তি করে: + +- ব্যবহারের সহজলভ্যতা +- অন্যান্য পণ্যের সাথে আন্তঃকার্যক্ষমতা +- নিরাপত্তা +- দীর্ঘায়ু + +এখানে আরও বিস্তারিতভাবে আমাদের সিদ্ধান্ত কাঠামো দেওয়া হলো। নির্দ্বিধায় মতামত প্রদান করুন বা পরিবর্তনের পরামর্শ দিন। + +## সিদ্ধান্ত কাঠামো {#decision-framework} + +### অন্তর্ভুক্তির জন্য মানদণ্ড: যা অবশ্যই থাকতে হবে {#criteria-for-inclusion-the-must-haves} + +- **একটি নিরাপত্তা-পরীক্ষিত পণ্য** – অডিট, একটি অভ্যন্তরীণ নিরাপত্তা দল বা অন্য কোনো পদ্ধতির মাধ্যমেই হোক না কেন, আপনার পণ্যের নিরাপত্তা নির্ভরযোগ্যভাবে পরীক্ষা করা আবশ্যক। এটি আমাদের ব্যবহারকারীদের ঝুঁকি কমায় এবং আমাদের দেখায় যে আপনি নিরাপত্তাকে গুরুত্ব সহকারে নেন। +- **একটি পণ্য যা 6 মাসের বেশি সময় ধরে "লাইভ" আছে** – এটি নিরাপত্তার আরেকটি ইঙ্গিত। গুরুতর বাগ এবং এক্সপ্লয়েটেশন খুঁজে পাওয়ার জন্য 6 মাস একটি ভালো সময়সীমা। +- **একটি সক্রিয় দল দ্বারা কাজ করা হয়েছে** – এটি গুণমান নিশ্চিত করতে সহায়তা করে এবং একজন ব্যবহারকারী তাদের জিজ্ঞাসার জন্য সমর্থন পাবেন। +- **সৎ এবং সঠিক তালিকার তথ্য** - এটি প্রত্যাশিত যে প্রকল্পগুলি থেকে প্রস্তাবিত যেকোনো তালিকা সৎ এবং সঠিক তথ্য সহ আসবে। যেসব পণ্য তালিকার তথ্যকে মিথ্যা প্রমাণিত করে, যেমন আপনার পণ্যটি "ওপেন-সোর্স" না হওয়া সত্ত্বেও তা ঘোষণা করা, সেগুলি সরিয়ে দেওয়া হবে। + +### র‍্যাঙ্কিংয়ের জন্য মানদণ্ড: যা থাকলে ভালো হয় {#criteria-for-ranking-the-nice-to-haves} + +নিম্নলিখিত মানদণ্ডের কারণে আপনার ডিএ্যাপটি ethereum.org-এ অন্যদের মতো ততটা স্পষ্টভাবে তালিকাভুক্ত নাও হতে পারে। + +**ডিএ্যাপস** + +- **আপনি তালিকাভুক্ত বেশিরভাগ ওয়ালেটের মাধ্যমে এটি অ্যাক্সেস করতে পারেন** – ethereum.org-এ তালিকাভুক্ত বেশিরভাগ ওয়ালেটের সাথে ডিএ্যাপসগুলোর কাজ করা উচিত। +- **ব্যবহারকারীরা নিজেরাই এটি চেষ্টা করে দেখতে পারেন –** একজন স্বতন্ত্র ব্যবহারকারীর আপনার ডিএ্যাপটি ব্যবহার করতে এবং বাস্তব কিছু অর্জন করতে সক্ষম হওয়া উচিত। +- **অনবোর্ডিং** – আপনার পণ্যের একটি ভালোভাবে ডিজাইন করা অনবোর্ডিং অভিজ্ঞতা থাকা উচিত যা ব্যবহারকারীদের সহায়তা করতে এবং শিক্ষিত করতে পারে। অথবা নিবন্ধ বা ভিডিওর মতো কীভাবে-করতে-হয় কন্টেন্টের প্রমাণ। +- **নন-কাস্টোডিয়াল** – ব্যবহারকারীরা তাদের তহবিল নিয়ন্ত্রণ করে। যদি আপনার পণ্যটি অদৃশ্য হয়ে যায়, ব্যবহারকারীরা তখনও তাদের তহবিল অ্যাক্সেস এবং স্থানান্তর করতে পারবেন। +- **বিশ্বব্যাপী অ্যাক্সেসযোগ্য** – আপনার পণ্যের কোনো ভৌগলিক সীমাবদ্ধতা বা KYC প্রয়োজনীয়তা নেই যা নির্দিষ্ট ব্যক্তিদের আপনার পরিষেবা অ্যাক্সেস করা থেকে বাদ দেয়। +- **ওপেন সোর্স** – আপনার কোড অ্যাক্সেসযোগ্য হওয়া উচিত এবং আপনার বৃহত্তর কমিউনিটি থেকে PR গ্রহণ করা উচিত। +- **কমিউনিটি** – আপনার একটি ডেডিকেটেড কমিউনিটি, হয়তো একটি Discord আছে, যেখানে ব্যবহারকারীরা সহায়তা পেতে বা নতুন বৈশিষ্ট্যের পরামর্শ দিতে আপনার দলের সাথে মতবিনিময় করতে পারে। + +## বাস্তবে মানদণ্ড {#criteria-in-practice} + +আপনি যত বেশি মানদণ্ড পূরণ করবেন, আপনার পণ্যের ethereum.org-এ স্থান পাওয়ার সম্ভাবনা তত বেশি হবে। + +একটি তালিকাভুক্ত পণ্য যা শুধুমাত্র যা-অবশ্যই-থাকতে-হবে এমন শর্তগুলো পূরণ করে, সেটি সরানো হতে পারে যদি এমন একটি নতুন পণ্যের প্রস্তাব করা হয় যা যা-অবশ্যই-থাকতে-হবে এমন শর্তগুলো এবং যা-থাকলে-ভালো-হয় এমন কয়েকটি শর্তও পূরণ করে। + +এই সিদ্ধান্তে যে অন্যান্য বিষয়গুলি প্রভাব ফেলবে: + +- প্রতিস্থাপনের পরিবর্তে যোগ করলে কি পৃষ্ঠার UX নষ্ট হবে? + - আমাদের সাইটটি মূলত শিক্ষামূলক এবং এর মূল উদ্দেশ্য হলো Ethereum এবং এর প্রাসঙ্গিক ধারণাগুলি ব্যাখ্যা করা। ব্যবহারকারীদের জন্য অনেকগুলি বিকল্প যোগ করার মাধ্যমে, পৃষ্ঠাগুলি কম পঠনযোগ্য এবং ফলস্বরূপ কম কার্যকর হয়ে উঠতে পারে। +- এই পৃষ্ঠাটি কি এখন ব্যবহারকারীকে পছন্দের ভিড়ে কিংকর্তব্যবিমূঢ় করে দেয়? + - যেমন আপনি যখন ঘণ্টার পর ঘণ্টা Netflix ব্রাউজ করতে বসেন কারণ আপনি কী দেখবেন তা ঠিক করতে পারেন না। নতুন ব্যবহারকারীদের অনেক বেশি পছন্দের মাধ্যমে বিভ্রান্ত করা একটি ঝুঁকি। + +এটি একটি ডিজাইন সিদ্ধান্ত যার জন্য ethereum.org দায়ী। + +তবে নিশ্চিন্ত থাকুন, **অন্যান্য ওয়েবসাইটের লিঙ্ক থাকবে যা আরও বেশি ডিএ্যাপস র‍্যাঙ্ক করে** + +### পণ্যের ক্রম {#product-ordering} + +যদি পণ্যগুলি বিশেষভাবে অন্য কোনোভাবে, যেমন বর্ণানুক্রমিকভাবে, সাজানো না হয়, তবে পণ্যগুলি পৃষ্ঠাটিতে সবচেয়ে সাম্প্রতিক থেকে সবচেয়ে কম সাম্প্রতিক সংযোজনের ক্রমে প্রদর্শিত হবে। অন্য কথায়, নতুন পণ্যগুলি তালিকার শেষে যোগ করা হয়। + +### ব্যবহারের শর্তাবলী {#terms-of-use} + +অনুগ্রহ করে আমাদের [ব্যবহারের শর্তাবলী](/terms-of-use/) দেখুন। ethereum.org-এর তথ্য শুধুমাত্র সাধারণ তথ্যের উদ্দেশ্যে প্রদান করা হয়েছে। + +## রক্ষণাবেক্ষণ {#maintenance} + +Ethereum-এর পরিবর্তনশীল প্রকৃতির মতোই, দল এবং পণ্য আসে এবং যায় এবং প্রতিদিন নতুন উদ্ভাবন ঘটে, তাই আমরা আমাদের কন্টেন্টের রুটিন পরীক্ষা চালাব এগুলোর জন্য: + +- নিশ্চিত করা যে তালিকাভুক্ত সমস্ত ডিএ্যাপস এখনও আমাদের মানদণ্ড পূরণ করে +- যাচাই করা যে এমন কোনো পণ্যের পরামর্শ দেওয়া হয়নি যা বর্তমানে তালিকাভুক্ত পণ্যগুলির চেয়ে আমাদের আরও বেশি মানদণ্ড পূরণ করে + +আপনি এটি পরীক্ষা করে এবং আমাদের জানিয়ে এতে সহায়তা করতে পারেন। [একটি ইস্যু তৈরি করুন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) অথবা [website@ethereum.org](mailto:website@ethereum.org)-এ একটি ইমেল পাঠান + +_আমরা ভোটের বিকল্পগুলিও খতিয়ে দেখছি যাতে কমিউনিটি তাদের পছন্দগুলি জানাতে পারে এবং আমাদের সুপারিশ করার জন্য সেরা পণ্যগুলি তুলে ধরতে পারে।_ + +--- + +## আপনার পণ্য যোগ করুন {#add-your-product} + +আপনি যদি ethereum.org-এ একটি ডিএ্যাপ যোগ করতে চান এবং এটি মানদণ্ড পূরণ করে, অনুগ্রহ করে আমাদের জানান। + + + একটি অ্যাপ সাজেস্ট করুন + diff --git a/public/content/translations/bn/contributing/adding-resources/index.md b/public/content/translations/bn/contributing/adding-resources/index.md new file mode 100644 index 00000000000..a2ea5f97e3d --- /dev/null +++ b/public/content/translations/bn/contributing/adding-resources/index.md @@ -0,0 +1,53 @@ +--- +title: "রিসোর্স যোগ করা" +description: "ethereum.org-এ রিসোর্স যোগ করার সময় আমরা যে নীতি ব্যবহার করি" +lang: bn +--- + +# রিসোর্স যোগ করা {#adding-resources} + +ব্যবহারকারীদের নিরাপদ এবং আত্মবিশ্বাসী রাখার পাশাপাশি আমরা সেরা সম্ভাব্য রিসোর্স তালিকাভুক্ত করা নিশ্চিত করতে চাই। + +যেকেউ ethereum.org-এর রিসোর্স ড্যাশবোর্ডে নতুন রিসোর্স যোগ করার জন্য নির্দ্বিধায় পরামর্শ দিতে পারেন, যা বর্তমানে [ethereum.org/resources](/resources/)-এ পাওয়া যায়। + +যদিও আমরা নতুন সংযোজনকে স্বাগত জানাই, বর্তমান রিসোর্সগুলো এমন একটি অভিজ্ঞতার উপর ভিত্তি করে বেছে নেওয়া হয়েছিল যা আমরা আমাদের ব্যবহারকারীদের জন্য তৈরি করার চেষ্টা করছি। এগুলি আমাদের কিছু ডিজাইন নীতির উপর ভিত্তি করে তৈরি করা হয়েছে: + +- _অনুপ্রেরণামূলক_: ethereum.org-এর যেকোনো কিছু ব্যবহারকারীদের নতুন কিছু প্রদান করা উচিত +- _একটি ভালো গল্প_: যা তালিকাভুক্ত করা হয়েছে তা একটি "আহা" মুহূর্ত প্রদান করা উচিত +- _বিশ্বাসযোগ্য_: ব্যবহারকারীদের ঝুঁকি কমানোর জন্য সবকিছু বৈধ ব্যবসা/প্রকল্প হওয়া উচিত + +সামগ্রিকভাবে **ethereum.org-এর লক্ষ্য হল নতুন ব্যবহারকারীদের জন্য একটি নির্বিঘ্ন অনবোর্ডিং অভিজ্ঞতা প্রদান করা**। সেই কারণে, আমরা তাদের নিম্নলিখিত বিষয়ের উপর ভিত্তি করে রিসোর্স যোগ করি: + +- ব্যবহারের সহজলভ্যতা +- সঠিকতা +- রক্ষণাবেক্ষণ + +## সিদ্ধান্ত কাঠামো {#decision-framework} + +### মানদণ্ড {#criteria} + +- **সৎ এবং সঠিক তালিকাভুক্তির তথ্য** - প্রস্তাবিত যেকোনো তালিকাভুক্তির তথ্য অবশ্যই সৎ এবং সঠিক হতে হবে। যেসব প্রোডাক্ট তথ্য বিকৃত করে সেগুলোকে সরিয়ে দেওয়া হবে। +- **সক্রিয় প্রজেক্ট** – ব্যবহারকারীদের জন্য গুণমান এবং সাপোর্ট নিশ্চিত করতে রিসোর্সটি একটি সক্রিয় টিম দ্বারা রক্ষণাবেক্ষণ করা উচিত। সেকেলে রিসোর্সগুলো সরিয়ে দেওয়া হতে পারে। + +### পণ্যের ক্রম {#product-ordering} + +আমরা প্রোডাক্টগুলোকে তাদের প্রভাবের উপর ভিত্তি করে সাজানোর অধিকার সংরক্ষণ করি। অন্যথায় নির্দিষ্ট না করা থাকলে নতুন প্রোডাক্টগুলো সাধারণত তালিকার শেষে যোগ করা হবে। + +## রক্ষণাবেক্ষণ {#maintenance} + +ইথেরিয়াম ইকোসিস্টেম বিকশিত হওয়ার সাথে সাথে, আমরা নিয়মিতভাবে আমাদের কনটেন্ট পরীক্ষা করব: + +- নিশ্চিত করা যে তালিকাভুক্ত সমস্ত রিসোর্স এখনও আমাদের মানদণ্ড পূরণ করে +- এমন কোনো প্রস্তাবিত পণ্য নেই যা বর্তমানে তালিকাভুক্ত পণ্যগুলির চেয়ে আমাদের বেশি মানদণ্ড পূরণ করে, তা যাচাই করুন। + +আপনি এটি পরীক্ষা করে এবং আমাদের জানিয়ে এতে সহায়তা করতে পারেন। [একটি ইস্যু তৈরি করুন](https://github.com/ethereum/ethereum-org-website/issues/new?template=bug_report.yaml) অথবা [website@ethereum.org](mailto:website@ethereum.org)-এ একটি ইমেল পাঠান। + +--- + +## আপনার রিসোর্স যোগ করুন {#add-your-resource} + +আপনি যদি ethereum.org-এ একটি রিসোর্স যোগ করতে চান এবং এটি মানদণ্ড পূরণ করে, তবে GitHub-এ একটি ইস্যু তৈরি করুন। + + + একটি ইস্যু তৈরি করুন + diff --git a/public/content/translations/bn/contributing/adding-staking-products/index.md b/public/content/translations/bn/contributing/adding-staking-products/index.md new file mode 100644 index 00000000000..5970470d7e1 --- /dev/null +++ b/public/content/translations/bn/contributing/adding-staking-products/index.md @@ -0,0 +1,176 @@ +--- +title: "স্টেকিং পণ্য বা পরিষেবা যোগ করা" +description: "ethereum.org-এ স্টেকিং পণ্য বা পরিষেবা যোগ করার সময় আমরা যে নীতি ব্যবহার করি" +lang: bn +--- + +# স্টেকিং পণ্য বা পরিষেবা যোগ করা {#adding-staking-products-or-services} + +ব্যবহারকারীদের নিরাপদ এবং আত্মবিশ্বাসী রাখার পাশাপাশি আমরা সেরা সম্ভাব্য রিসোর্স তালিকাভুক্ত করা নিশ্চিত করতে চাই। + +ethereum.org-এ একটি স্টেকিং পণ্য বা পরিষেবা যোগ করার জন্য যে কেউ নির্দ্বিধায় পরামর্শ দিতে পারেন। যদি এমন কিছু থাকে যা আমরা বাদ দিয়েছি, **[অনুগ্রহ করে এটির পরামর্শ দিন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A%2Ccontent+%3Afountain_pen%3A&template=suggest_staking_product.yaml)!** + +আমরা বর্তমানে নিম্নলিখিত পৃষ্ঠাগুলিতে স্টেকিং পণ্য এবং পরিষেবাগুলি তালিকাভুক্ত করি: + +- [একক স্টেকিং](/staking/solo/) +- [পরিষেবা হিসাবে স্টেকিং](/staking/saas/) +- [স্টেকিং পুল](/staking/pools/) + +বিকন চেইনে প্রুফ-অফ-স্টেক ১ ডিসেম্বর, ২০২০ থেকে লাইভ রয়েছে। যদিও স্টেকিং এখনও তুলনামূলকভাবে নতুন, আমরা ethereum.org-এ বিবেচনার জন্য একটি ন্যায্য এবং স্বচ্ছ কাঠামো তৈরি করার চেষ্টা করেছি কিন্তু তালিকাভুক্তির মানদণ্ড সময়ের সাথে সাথে পরিবর্তিত হবে এবং বিকশিত হবে, এবং এটি চূড়ান্তভাবে ethereum.org ওয়েবসাইট টিমের বিবেচনার উপর নির্ভর করে। + +## সিদ্ধান্তের কাঠামো {#the-decision-framework} + +ethereum.org-এ একটি পণ্য তালিকাভুক্ত করার সিদ্ধান্ত কোনো একটি বিষয়ের উপর নির্ভরশীল নয়। একটি পণ্য বা পরিষেবা তালিকাভুক্ত করার সিদ্ধান্ত নেওয়ার সময় একাধিক মানদণ্ড একসাথে বিবেচনা করা হয়। এই মানদণ্ডগুলির মধ্যে যত বেশি পূরণ করা হবে, তালিকাভুক্ত হওয়ার সম্ভাবনা তত বেশি। + +**প্রথমত, এটি কোন বিভাগের পণ্য বা পরিষেবা?** + +- নোড বা ক্লায়েন্ট টুলিং +- কী ব্যবস্থাপনা +- পরিষেবা হিসাবে স্টেকিং (SaaS) +- স্টেকিং পুল + +বর্তমানে, আমরা শুধুমাত্র এই বিভাগগুলিতে পণ্য বা পরিষেবা তালিকাভুক্ত করছি। + +### অন্তর্ভুক্তির জন্য মানদণ্ড {#criteria-for-inclusion} + +স্টেকিং পণ্য বা পরিষেবা জমাগুলি নিম্নলিখিত মানদণ্ড দ্বারা মূল্যায়ন করা হবে: + +**প্রকল্প বা পরিষেবাটি কখন চালু হয়েছিল?** + +- পণ্য বা পরিষেবাটি কখন জনসাধারণের জন্য উপলব্ধ হয়েছিল তার কোনো প্রমাণ আছে কি? +- এটি পণ্যের "বাস্তব-পরীক্ষিত" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +**প্রকল্পটি কি সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হচ্ছে?** + +- প্রকল্পটি বিকাশের জন্য কোনো সক্রিয় দল আছে কি? কে জড়িত? +- শুধুমাত্র সক্রিয়ভাবে রক্ষণাবেক্ষণ করা পণ্যগুলি বিবেচনা করা হবে। + +**পণ্য বা পরিষেবাটি কি বিশ্বস্ত/মানুষ মধ্যস্থতাকারী মুক্ত?** + +- ব্যবহারকারীর যাত্রাপথে কোন ধাপগুলিতে তাদের তহবিলের কী ধরে রাখার জন্য বা সঠিকভাবে পুরস্কার বিতরণের জন্য মানুষের উপর বিশ্বাস করার প্রয়োজন হয়? +- এটি পণ্য বা পরিষেবার "ট্রাস্টলেস" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +**প্রকল্পটি কি সঠিক এবং নির্ভরযোগ্য তথ্য প্রদান করে?** + +- এটি অত্যন্ত গুরুত্বপূর্ণ যে পণ্যের ওয়েবসাইটে আপ-টু-ডেট, সঠিক এবং অ-বিভ্রান্তিকর তথ্য বৈশিষ্ট্যযুক্ত করা উচিত, বিশেষত যদি এটি ইথেরিয়াম প্রোটোকল বা অন্যান্য সম্পর্কিত প্রযুক্তির সাথে সম্পর্কিত হয়। +- ইথেরিয়াম বা অন্যান্য প্রাসঙ্গিক বিষয় সম্পর্কে ভুল তথ্য, পুরানো বিবরণ, বা সম্ভাব্য বিভ্রান্তিকর বিবৃতি সম্বলিত জমাগুলি তালিকাভুক্ত করা হবে না বা যদি ইতিমধ্যে তালিকাভুক্ত করা হয়ে থাকে তবে তা সরিয়ে দেওয়া হবে। + +**কোন প্ল্যাটফর্মগুলি সমর্থিত?** + +- অর্থাৎ, Linux, macOS, Windows, iOS, Android + +#### সফ্টওয়্যার এবং স্মার্ট কন্ট্র্যাক্ট {#software-and-smart-contracts} + +জড়িত কোনো কাস্টম সফ্টওয়্যার বা স্মার্ট কন্ট্র্যাক্টের জন্য: + +**সবকিছু কি ওপেন সোর্স?** + +- ওপেন সোর্স প্রকল্পগুলির একটি সর্বজনীনভাবে উপলব্ধ সোর্স কোড রিপোজিটরি থাকা উচিত। +- এটি পণ্যের "ওপেন সোর্স" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +**পণ্যটি কি _বিটা_ ডেভেলপমেন্টের বাইরে?** + +- পণ্যটি তার ডেভেলপমেন্ট চক্রের কোথায় আছে? +- বিটা পর্যায়ের পণ্যগুলিকে ethereum.org-এ অন্তর্ভুক্তির জন্য বিবেচনা করা হয় না। + +**সফ্টওয়্যারটি কি কোনো বাহ্যিক নিরাপত্তা নিরীক্ষার মধ্য দিয়ে গেছে?** + +- যদি না হয়, একটি বাহ্যিক নিরীক্ষা পরিচালনা করার কোনো পরিকল্পনা আছে কি? +- এটি পণ্যের "নিরীক্ষিত" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +**প্রকল্পটির কি কোনো বাগ বাউন্টি প্রোগ্রাম আছে?** + +- যদি না হয়, একটি নিরাপত্তা বাগ বাউন্টি তৈরি করার কোনো পরিকল্পনা আছে কি? +- এটি পণ্যের "বাগ বাউন্টি" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +#### নোড বা ক্লায়েন্ট টুলিং {#node-or-client-tooling} + +নোড বা ক্লায়েন্ট সেটআপ, পরিচালনা বা মাইগ্রেশন সম্পর্কিত সফ্টওয়্যার পণ্যগুলির জন্য: + +**কোন কনসেন্সাস লেয়ার ক্লায়েন্টগুলি (অর্থাৎ, Lighthouse, Teku, Nimbus, Prysm, Grandine) সমর্থিত?** + +- কোন ক্লায়েন্টগুলি সমর্থিত? ব্যবহারকারী কি পছন্দ করতে পারেন? +- এটি পণ্যের "মাল্টি-ক্লায়েন্ট" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +#### পরিষেবা হিসাবে স্টেকিং {#staking-as-a-service} + +[পরিষেবা হিসাবে স্টেকিং তালিকা](/staking/saas/)-এর জন্য (অর্থাৎ, ডেলেগেটেড নোড অপারেশন): + +**পরিষেবাটি ব্যবহার করার সাথে সম্পর্কিত ফি গুলি কী কী?** + +- ফি কাঠামো কী, যেমন, পরিষেবাটির জন্য কোনো মাসিক ফি আছে কি? +- কোনো অতিরিক্ত স্টেকিং প্রয়োজনীয়তা আছে? + +**ব্যবহারকারীদের কি একটি অ্যাকাউন্টের জন্য সাইন-আপ করতে হবে?** + +- কেউ কি অনুমতি বা KYC ছাড়া পরিষেবাটি ব্যবহার করতে পারে? +- এটি পণ্যের "পারমিশনলেস" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +**স্বাক্ষর করার কী, এবং উত্তোলনের কী কে ধরে রাখে?** + +- ব্যবহারকারী কোন কী-গুলির অ্যাক্সেস বজায় রাখে? পরিষেবাটি কোন কী-গুলির অ্যাক্সেস পায়? +- এটি পণ্যের "ট্রাস্টলেস" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +**পরিচালিত নোডগুলির ক্লায়েন্ট বৈচিত্র্য কী?** + +- ভ্যালিডেটর কী-এর কত শতাংশ একটি সংখ্যাগরিষ্ঠ কনসেন্সাস লেয়ার (CL) ক্লায়েন্ট দ্বারা চালিত হচ্ছে? +- শেষ সম্পাদনা অনুযায়ী, Prysm হলো কনসেন্সাস লেয়ার ক্লায়েন্ট যা বেশিরভাগ নোড অপারেটরদের দ্বারা চালিত হচ্ছে, যা নেটওয়ার্কের জন্য বিপজ্জনক। যদি কোনো CL ক্লায়েন্ট বর্তমানে নেটওয়ার্কের ৩৩%-এর বেশি দ্বারা ব্যবহৃত হয়, আমরা তার ব্যবহার সম্পর্কিত ডেটা অনুরোধ করি। +- এটি পণ্যের "বৈচিত্র্যময় ক্লায়েন্ট" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +#### স্টেকিং পুল {#staking-pool} + +[পুলড স্টেকিং পরিষেবা](/staking/pools/)-এর জন্য: + +**স্টেক করার জন্য সর্বনিম্ন কত ETH প্রয়োজন?** + +- যেমন, ০.০১ ETH + +**এতে জড়িত ফি বা স্টেকিং প্রয়োজনীয়তাগুলি কী কী?** + +- পুরস্কারের কত শতাংশ ফি হিসাবে সরানো হয়? +- কোনো অতিরিক্ত স্টেকিং প্রয়োজনীয়তা আছে? + +**কোনো লিকুইডিটি টোকেন আছে কি?** + +- কোন টোকেনগুলি জড়িত? তারা কীভাবে কাজ করে? কন্ট্র্যাক্ট অ্যাড্রেসগুলি কী কী? +- এটি পণ্যের "লিকুইডিটি টোকেন" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +**ব্যবহারকারীরা কি নোড অপারেটর হিসাবে অংশগ্রহণ করতে পারে?** + +- পুল করা তহবিল ব্যবহার করে ভ্যালিডেটর ক্লায়েন্ট চালানোর জন্য কী প্রয়োজন? +- এর জন্য কি কোনো ব্যক্তি, কোম্পানি বা DAO-এর থেকে অনুমতি প্রয়োজন? +- এটি পণ্যের "পারমিশনলেস নোড" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +**পুল নোড অপারেটরদের ক্লায়েন্ট বৈচিত্র্য কী?** + +- নোড অপারেটরদের কত শতাংশ একটি সংখ্যাগরিষ্ঠ কনসেন্সাস লেয়ার (CL) ক্লায়েন্ট চালাচ্ছে? +- শেষ সম্পাদনা অনুযায়ী, Prysm হলো কনসেন্সাস লেয়ার ক্লায়েন্ট যা বেশিরভাগ নোড অপারেটরদের দ্বারা চালিত হচ্ছে, যা নেটওয়ার্কের জন্য বিপজ্জনক। যদি কোনো CL ক্লায়েন্ট বর্তমানে নেটওয়ার্কের ৩৩%-এর বেশি দ্বারা ব্যবহৃত হয়, আমরা তার ব্যবহার সম্পর্কিত ডেটা অনুরোধ করি। +- এটি পণ্যের "বৈচিত্র্যময় ক্লায়েন্ট" স্কোর নির্ধারণ করতে ব্যবহৃত হয়। + +### অন্যান্য মানদণ্ড: যা থাকলে ভালো {#other-criteria} + +**কোন ব্যবহারকারী ইন্টারফেসগুলি সমর্থিত?** + +- অর্থাৎ, ব্রাউজার অ্যাপ, ডেস্কটপ অ্যাপ, মোবাইল অ্যাপ, CLI + +**নোড টুলিং-এর জন্য, সফ্টওয়্যারটি কি ক্লায়েন্টগুলির মধ্যে স্যুইচ করার কোনো সহজ উপায় প্রদান করে?** + +- ব্যবহারকারী কি টুলটি ব্যবহার করে সহজে এবং নিরাপদে ক্লায়েন্ট পরিবর্তন করতে পারেন? + +**SaaS-এর জন্য, পরিষেবাটি দ্বারা বর্তমানে কতগুলি ভ্যালিডেটর পরিচালিত হচ্ছে?** + +- এটি এখন পর্যন্ত আপনার পরিষেবার পরিধি সম্পর্কে আমাদের একটি ধারণা দেয়। + +## কীভাবে আমরা ফলাফল প্রদর্শন করি {#product-ordering} + +[উপরে অন্তর্ভুক্তির জন্য মানদণ্ড](#criteria-for-inclusion) প্রতিটি পণ্য বা পরিষেবার জন্য একটি ক্রমবর্ধমান স্কোর গণনা করতে ব্যবহৃত হয়। এটি নির্দিষ্ট উদ্দেশ্যমূলক মানদণ্ড পূরণকারী পণ্যগুলিকে বাছাই এবং প্রদর্শন করার একটি উপায় হিসাবে ব্যবহৃত হয়। যত বেশি মানদণ্ডের জন্য প্রমাণ প্রদান করা হবে, একটি পণ্য তত উপরে সাজানো হবে, এবং টাই হলে লোড করার সময় এলোমেলোভাবে ক্রম নির্ধারিত হবে। + +এই মানদণ্ডগুলির জন্য কোড লজিক এবং ওয়েটগুলি বর্তমানে আমাদের রেপোতে [এই জাভাস্ক্রিপ্ট কম্পোনেন্টে](https://github.com/ethereum/ethereum-org-website/blob/dev/src/components/Staking/StakingProductsCardGrid.js#L350) রয়েছে। + +## আপনার পণ্য বা পরিষেবা যোগ করুন {#add-product} + +আপনি যদি ethereum.org-এ একটি স্টেকিং পণ্য বা পরিষেবা যোগ করতে চান, তাহলে GitHub-এ একটি ইস্যু তৈরি করুন। + + + একটি ইস্যু তৈরি করুন + diff --git a/public/content/translations/bn/contributing/adding-wallets/index.md b/public/content/translations/bn/contributing/adding-wallets/index.md new file mode 100644 index 00000000000..64101b9ab5d --- /dev/null +++ b/public/content/translations/bn/contributing/adding-wallets/index.md @@ -0,0 +1,80 @@ +--- +title: "ওয়ালেট যোগ করা হচ্ছে" +description: "ethereum.org-এ একটি ওয়ালেট যোগ করার সময় আমরা যে নীতি ব্যবহার করি" +lang: bn +--- + +# ওয়ালেট যোগ করা হচ্ছে {#adding-wallets} + +আমরা নিশ্চিত করতে চাই যে আমরা বৈশিষ্ট্য-সমৃদ্ধ ল্যান্ডস্কেপ কভার করে বিভিন্ন ওয়ালেট দেখাই যাতে ব্যবহারকারীরা আত্মবিশ্বাসের সাথে ইথেরিয়াম নেভিগেট করতে পারে। + +ethereum.org-এ একটি ওয়ালেট যোগ করার পরামর্শ দেওয়ার জন্য যে কেউ স্বাধীন। যদি এমন কোনো ওয়ালেট থাকে যা আমরা মিস করেছি, অনুগ্রহ করে এটির পরামর্শ দিন! + +ওয়ালেটগুলো বর্তমানে এখানে তালিকাভুক্ত আছে: + +- [ethereum.org/wallets/find-wallet/](/wallets/find-wallet/) + +ইথেরিয়ামে ওয়ালেটগুলো দ্রুত পরিবর্তিত হচ্ছে। আমরা ethereum.org-এ বিবেচনার জন্য একটি ন্যায্য কাঠামো তৈরি করার চেষ্টা করেছি কিন্তু তালিকাভুক্তির মানদণ্ড সময়ের সাথে সাথে পরিবর্তিত হবে এবং বিকশিত হবে। + +## সিদ্ধান্তের কাঠামো {#the-decision-framework} + +### অন্তর্ভুক্তির জন্য মানদণ্ড: যা অবশ্যই থাকতে হবে {#the-must-haves} + +- **একটি নিরাপত্তা-পরীক্ষিত পণ্য** - অডিট, একটি অভ্যন্তরীণ নিরাপত্তা দল, ওপেন সোর্স কোড, বা অন্য কোনো পদ্ধতির মাধ্যমেই হোক না কেন, আপনার ওয়ালেটের নিরাপত্তা অবশ্যই নির্ভরযোগ্য হতে হবে। এটি আমাদের ব্যবহারকারীদের ঝুঁকি কমায় এবং আমাদের দেখায় যে আপনি নিরাপত্তাকে গুরুত্ব সহকারে নেন। +- **এমন একটি ওয়ালেট যা ছয় মাসের বেশি সময় ধরে “লাইভ” আছে অথবা একটি স্বনামধন্য ট্র্যাক রেকর্ড সহ একটি গ্রুপ দ্বারা প্রকাশিত হয়েছে** - এটি নিরাপত্তার আরেকটি ইঙ্গিত। গুরুতর বাগ এবং এক্সপ্লয়েটেশন খুঁজে বের করার জন্য ছয় মাস একটি ভালো সময়। প্রকল্প হিসেবে দ্রুত পরিত্যক্ত ফর্কগুলো ফিল্টার করতে সাহায্য করার জন্য আমরা ছয় মাস সময় চাই। +- **একটি সক্রিয় দল দ্বারা কাজ করা হয়েছে** - এটি গুণমান নিশ্চিত করতে এবং একজন ব্যবহারকারী তাদের প্রশ্নের জন্য সমর্থন পাবে তা নিশ্চিত করতে সাহায্য করে। +- **সৎ এবং সঠিক তালিকার তথ্য** - এটি প্রত্যাশিত যে প্রকল্পগুলি থেকে প্রস্তাবিত যেকোনো তালিকা সৎ এবং সঠিক তথ্য সহ আসবে। যেসব পণ্য তালিকাভুক্তির তথ্য মিথ্যা প্রমাণিত করে, যেমন আপনার পণ্যটি "ওপেন সোর্স" না হওয়া সত্ত্বেও সেটিকে "ওপেন সোর্স" হিসেবে ঘোষণা করা, সেগুলোকে সরিয়ে দেওয়া হবে। +- **যোগাযোগের মাধ্যম** - ওয়ালেটের জন্য একটি যোগাযোগের মাধ্যম পরিবর্তন করা হলে আমাদের সঠিক তথ্য পেতে ব্যাপকভাবে সাহায্য করবে। ভবিষ্যতে তথ্য সংগ্রহের সময় এটি ethereum.org আপডেট করার কাজটিকে পরিচালনযোগ্য করে তুলবে। +- **EIP-1559 (টাইপ 2) লেনদেন** - আপনার ওয়ালেটকে অবশ্যই Mainnet ইথেরিয়ামের লেনদেনের জন্য EIP-1559 (টাইপ 2) লেনদেন সমর্থন করতে হবে। +- **ভালো ব্যবহারকারীর অভিজ্ঞতা** - যদিও UX বিষয়ভিত্তিক, যদি বেশ কিছু কোর টিমের সদস্যরা পণ্যটি পরীক্ষা করেন এবং এটি ব্যবহার করা কঠিন মনে করেন, আমরা ওয়ালেটটি প্রত্যাখ্যান করার অধিকার সংরক্ষণ করি এবং পরিবর্তে উন্নতির জন্য দরকারী পরামর্শ প্রদান করব। এটি আমাদের ব্যবহারকারী বেসকে রক্ষা করার জন্য করা হয়েছে যা বেশিরভাগই নতুনদের নিয়ে গঠিত। +- **ইথেরিয়াম কেন্দ্রিক** - একটি ওয়ালেটকে অবশ্যই একটি প্রাথমিক ইথেরিয়াম-কেন্দ্রিক অভিজ্ঞতা প্রদান করতে হবে। এর মানে হল ইথেরিয়াম (বা যেকোনো L2) ডিফল্ট নেটওয়ার্ক হিসাবে সেট করা আছে, ERC সম্পদগুলি সঠিকভাবে সমর্থিত, এবং বৈশিষ্ট্যগুলি ইথেরিয়াম ইকোসিস্টেমের সাথে সংযুক্ত। যে ওয়ালেটগুলি UI বিকল্প লেয়ার 1-কে অগ্রাধিকার দেয় সেগুলি তালিকাভুক্ত করা হবে না। + +### পণ্য অপসারণ {#product-removals} + +- **আপডেট করা তথ্য** - ওয়ালেট প্রদানকারীরা প্রদত্ত তথ্যের বৈধতা এবং প্রাসঙ্গিকতা নিশ্চিত করার জন্য প্রতি 6 মাস অন্তর তাদের ওয়ালেটের তথ্য পুনরায় জমা দেওয়ার জন্য দায়ী (এমনকি যদি তাদের পণ্যে কোনো পরিবর্তন না হয়)। যদি পণ্য দল তা করতে ব্যর্থ হয়, ethereum.org পৃষ্ঠা থেকে প্রকল্পটি সরিয়ে দিতে পারে। + +### অন্যান্য মানদণ্ড: যা থাকলে ভালো হয় {#the-nice-to-haves} + +- **বিশ্বব্যাপী অ্যাক্সেসযোগ্য** - আপনার ওয়ালেটের কোনো ভৌগলিক সীমাবদ্ধতা বা KYC প্রয়োজনীয়তা নেই যা নির্দিষ্ট ব্যক্তিদের আপনার পরিষেবা অ্যাক্সেস করা থেকে বাদ দেয়। +- **একাধিক ভাষায় উপলব্ধ** - আপনার ওয়ালেটটি একাধিক ভাষায় অনুবাদ করা হয়েছে যা বিশ্বজুড়ে ব্যবহারকারীদের এটি অ্যাক্সেস করতে দেয়। +- **ওপেন সোর্স** - আপনার পুরো প্রকল্পের কোডবেস (শুধু মডিউল নয়) অ্যাক্সেসযোগ্য হওয়া উচিত এবং আপনার বৃহত্তর কমিউনিটি থেকে PR গ্রহণ করা উচিত। +- **নন-কাস্টোডিয়াল** - ব্যবহারকারীরা তাদের তহবিল নিয়ন্ত্রণ করে। যদি আপনার পণ্যটি অদৃশ্য হয়ে যায়, ব্যবহারকারীরা তখনও তাদের তহবিল অ্যাক্সেস এবং স্থানান্তর করতে পারবেন। +- **হার্ডওয়্যার ওয়ালেট সমর্থন** - ব্যবহারকারীরা লেনদেনে স্বাক্ষর করার জন্য তাদের হার্ডওয়্যার ওয়ালেট সংযোগ করতে পারে। +- **WalletConnect** - ব্যবহারকারীরা WalletConnect ব্যবহার করে ডিএ্যাপস-এর সাথে সংযোগ করতে পারে। +- **ইথেরিয়াম RPC এন্ডপয়েন্ট ইম্পোর্ট করা** - ব্যবহারকারীরা নোড RPC ডেটা ইম্পোর্ট করতে পারে, যা তাদের পছন্দের একটি নোড বা অন্যান্য EVM সামঞ্জস্যপূর্ণ নেটওয়ার্কের সাথে সংযোগ করতে দেয়। +- **NFTs** - ব্যবহারকারীরা ওয়ালেটে তাদের NFT দেখতে এবং তার সাথে ইন্টারঅ্যাক্ট করতে সক্ষম। +- **ইথেরিয়াম অ্যাপ্লিকেশনগুলির সাথে সংযোগ করুন** - ব্যবহারকারীরা ইথেরিয়াম অ্যাপ্লিকেশনগুলির সাথে সংযোগ করতে এবং ব্যবহার করতে সক্ষম। +- **স্টেকিং** - ব্যবহারকারীরা সরাসরি ওয়ালেটের মাধ্যমে স্টেক করতে সক্ষম। +- **সোয়াপ** - ব্যবহারকারীরা ওয়ালেটের মাধ্যমে টোকেন সোয়াপ করতে সক্ষম। +- **মাল্টিচেইন নেটওয়ার্ক** - আপনার ওয়ালেট ব্যবহারকারীদের ডিফল্টরূপে একাধিক ব্লকচেইন নেটওয়ার্ক অ্যাক্সেস করতে সমর্থন করে। +- **লেয়ার 2 নেটওয়ার্ক** - আপনার ওয়ালেট ব্যবহারকারীদের ডিফল্টরূপে লেয়ার 2 নেটওয়ার্ক অ্যাক্সেস করতে সমর্থন করে। +- **গ্যাস ফি কাস্টমাইজ করুন** - আপনার ওয়ালেট ব্যবহারকারীদের তাদের লেনদেনের গ্যাস ফি (বেস ফি, প্রায়োরিটি ফি, সর্বোচ্চ ফি) কাস্টমাইজ করতে দেয়। +- **ENS সমর্থন** - আপনার ওয়ালেট ব্যবহারকারীদের ENS নামে লেনদেন পাঠাতে দেয়। +- **ERC-20 সমর্থন** - আপনার ওয়ালেট ব্যবহারকারীদের ERC-20 টোকেন চুক্তি আমদানি করতে, অথবা স্বয়ংক্রিয়ভাবে ERC-20 টোকেন জিজ্ঞাসা এবং প্রদর্শন করতে দেয়। +- **ক্রিপ্টো কিনুন** - আপনার ওয়ালেট ব্যবহারকারীদের সরাসরি ক্রিপ্টো কেনা এবং অনবোর্ডিং সমর্থন করে। +- **ফিয়াটের জন্য বিক্রি করুন** - আপনার ওয়ালেট ব্যবহারকারীদের সরাসরি কার্ড বা ব্যাংক অ্যাকাউন্টে ফিয়াট বিক্রি এবং উত্তোলনে সমর্থন করে। +- **মাল্টিসিগ** - আপনার ওয়ালেট একটি লেনদেন স্বাক্ষর করার জন্য একাধিক স্বাক্ষর সমর্থন করে। +- **সোশ্যাল রিকভারি** - আপনার ওয়ালেট গার্ডিয়ানদের সমর্থন করে এবং একজন ব্যবহারকারী যদি তাদের সিড ফ্রেজ হারিয়ে ফেলে তবে এই গার্ডিয়ানদের ব্যবহার করে তাদের ওয়ালেট পুনরুদ্ধার করতে পারে। +- **ডেডিকেটেড সাপোর্ট টিম** - আপনার ওয়ালেটের একটি ডেডিকেটেড সাপোর্ট টিম রয়েছে যেখানে ব্যবহারকারীরা সমস্যা অনুভব করলে যেতে পারেন। +- **শিক্ষামূলক রিসোর্স/ডকুমেন্টেশন** - আপনার পণ্যের ব্যবহারকারীদের সাহায্য ও শিক্ষিত করার জন্য একটি ভালোভাবে ডিজাইন করা অনবোর্ডিং অভিজ্ঞতা থাকা উচিত। অথবা নিবন্ধ বা ভিডিওর মতো কীভাবে-করতে-হয় কন্টেন্টের প্রমাণ। + +## একটি ওয়ালেট যোগ করা হচ্ছে {#adding-a-wallet} + +আপনি যদি ethereum.org-এ একটি ওয়ালেট যোগ করতে চান, তাহলে GitHub-এ একটি ইস্যু তৈরি করুন। + + + একটি ইস্যু তৈরি করুন + + +## রক্ষণাবেক্ষণ {#maintenance} + +Ethereum-এর পরিবর্তনশীল প্রকৃতির মতোই, দল এবং পণ্য আসে এবং যায় এবং প্রতিদিন নতুন উদ্ভাবন ঘটে, তাই আমরা আমাদের কন্টেন্টের রুটিন পরীক্ষা চালাব এগুলোর জন্য: + +- নিশ্চিত করুন যে তালিকাভুক্ত সমস্ত ওয়ালেট এবং ডিএ্যাপস এখনও আমাদের মানদণ্ড পূরণ করে +- যাচাই করা যে এমন কোনো পণ্যের পরামর্শ দেওয়া হয়নি যা বর্তমানে তালিকাভুক্ত পণ্যগুলির চেয়ে আমাদের আরও বেশি মানদণ্ড পূরণ করে + +ethereum.org ওপেন সোর্স কমিউনিটি দ্বারা রক্ষণাবেক্ষণ করা হয় এবং আমরা এটিকে আপ টু ডেট রাখতে কমিউনিটির উপর নির্ভর করি। যদি আপনি তালিকাভুক্ত ওয়ালেট সম্পর্কে এমন কোনো তথ্য লক্ষ্য করেন যা আপডেট করা প্রয়োজন, অনুগ্রহ করে [একটি ইস্যু খুলুন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=wallet+%3Apurse%3A&template=suggest_wallet.yaml) অথবা [একটি পুল রিকুয়েস্ট](https://github.com/ethereum/ethereum-org-website/pulls) করুন! + +## ব্যবহারের শর্তাবলী {#terms-of-use} + +অনুগ্রহ করে আমাদের [ব্যবহারের শর্তাবলী](/terms-of-use/) দেখুন। ethereum.org-এর তথ্য শুধুমাত্র সাধারণ তথ্যের উদ্দেশ্যে প্রদান করা হয়েছে। diff --git a/public/content/translations/bn/contributing/content-resources/index.md b/public/content/translations/bn/contributing/content-resources/index.md new file mode 100644 index 00000000000..3496726a4df --- /dev/null +++ b/public/content/translations/bn/contributing/content-resources/index.md @@ -0,0 +1,32 @@ +--- +title: "বিষয়বস্তু রিসোর্স যোগ করা" +lang: bn +description: "ethereum.org-এ বিষয়বস্তু রিসোর্স তালিকাভুক্ত করার জন্য আমাদের মানদণ্ড" +--- + +# বিষয়বস্তু রিসোর্স যোগ করা {#adding-content-resources} + +আমরা ইথেরিয়াম সম্পর্কিত সবকিছু কভার করার আশা করতে পারি না, তাই আমরা কমিউনিটির তৈরি করা কিছু চমৎকার নিবন্ধ, টিউটোরিয়াল, নিউজলেটার, জব বোর্ড এবং বিভিন্ন বিষয়বস্তুর রিসোর্স প্রদর্শন করার চেষ্টা করি। এগুলি প্রায়শই এমন বিষয়গুলির উপর আরও গভীর তথ্য প্রদান করে যেগুলিতে ব্যবহারকারীরা আগ্রহী হতে পারেন। + +যদি এমন কোনো বিষয়বস্তু রিসোর্স থাকে যা আপনার মনে হয় কোনো পেজে যোগ করা উচিত, তাহলে উপযুক্ত কোনো জায়গায় সেটি নির্দ্বিধায় সাজেস্ট করুন। + +## আমরা কীভাবে সিদ্ধান্ত নিই {#how-we-decide} + +শেখার রিসোর্সগুলি নিম্নলিখিত মানদণ্ড দ্বারা মূল্যায়ন করা হবে: + +- বিষয়বস্তুটি কি আপ-টু-ডেট? +- বিষয়বস্তুটি কি কোনো পেওয়ালের পিছনে আছে? +- তথ্যটি কি সঠিক? এটি কি তথ্যভিত্তিক নাকি মতামত-ভিত্তিক? +- লেখক কি বিশ্বাসযোগ্য? তারা কি তাদের উৎসের উল্লেখ করে? +- এই বিষয়বস্তুটি কি এমন কোনো স্বতন্ত্র ভ্যালু যোগ করে যা বিদ্যমান রিসোর্স/লিঙ্কগুলি কভার করে না? +- এই বিষয়বস্তুটি কি আমাদের কোনো [ব্যবহারকারীর পারসোনা](https://www.notion.so/efdn/Ethereum-org-User-Persona-Memo-b44dc1e89152457a87ba872b0dfa366c)-কে পরিষেবা দেয়? + +--- + +## আপনার বিষয়বস্তু রিসোর্স যোগ করুন {#add-your-content-resource} + +আপনি যদি ethereum.org-এ একটি বিষয়বস্তু রিসোর্স যোগ করতে চান এবং এটি মানদণ্ড পূরণ করে, তাহলে GitHub-এ একটি ইস্যু তৈরি করুন। + + + একটি ইস্যু তৈরি করুন + diff --git a/public/content/translations/bn/contributing/design-principles/index.md b/public/content/translations/bn/contributing/design-principles/index.md new file mode 100644 index 00000000000..7baf7089e01 --- /dev/null +++ b/public/content/translations/bn/contributing/design-principles/index.md @@ -0,0 +1,93 @@ +--- +title: "ডিজাইনের মূলনীতি" +lang: bn +description: "ethereum.org-এর ডিজাইন এবং বিষয়বস্তুর সিদ্ধান্তের পেছনের নীতিগুলি" +--- + +# আমাদের ডিজাইন নীতি {#contributing-to-ethereumorg-} + + হ্যালো, এবং ethereum.org-এর ডিজাইন নীতিগুলিতে আপনাকে স্বাগত। এটি ethereum.org-কে বিকশিত এবং উন্নত করার জন্য একটি চলমান প্রক্রিয়ার অংশ। + +আমাদের নীতিগুলি সাইটের চেহারা এবং অনুভূতি এবং এর মধ্যে থাকা বিষয়বস্তুকে অবহিত করে। + +আপনি [ethereum.org-এ অবদান রাখার](/contributing/) আগে আপনার এগুলি পড়া উচিত। + +## ডিজাইন নীতি কি? {#ways-to-contribute} + +চিন্তা করবেন না, এগুলি বেশ সহজ! **ডিজাইন নীতিগুলি** হলো নির্দেশিকাগুলির একটি সেট যা আমরা কোনো কিছু ডিজাইন করার (যেমন, তৈরি করা, রক্ষণাবেক্ষণ করা বা আপডেট করা) সময় উল্লেখ করি। + +ethereum.org-এর প্রেক্ষাপটে এই ডিজাইন নীতিগুলি হলো সেই ভিত্তি যার উপর ভিত্তি করে আমরা চাই যে ওয়েবসাইটটি বিশ্বের কাছে নিজেকে উপস্থাপন এবং তুলে ধরুক। এগুলো উচ্চাকাঙ্ক্ষী **এবং** কার্যকরী উভয়ই। এটি শুধু ওয়েবসাইটটি কেমন _দেখায়_ তা নয়, বরং এটি কীভাবে _কাজ করে_ এবং এমনকি এটি কাউকে কেমন _অনুভব_ করায়। রঙ থেকে শুরু করে পৃষ্ঠার লেআউট এবং আমরা ওয়েবসাইটে ইথেরিয়াম সম্পর্কে কীভাবে কথা বলি, সবকিছুই এই নীতিগুলির দ্বারা অবহিত হওয়া উচিত। + +## অনুশীলনে নীতিগুলি {#how-decisions-about-the-site-are-made} + +আসুন একটি উদাহরণ দেখা যাক। নীতিগুলির মধ্যে একটি হলো "বিশ্বাসযোগ্য", যার অর্থ হলো আমরা চাই যে সাইটের দর্শনার্থীরা _অনুভব_ করুক এবং _জানুক_ যে সাইটটি বিশ্বস্ত - ঠিক যেমন বৃহত্তর ইথেরিয়াম ইকোসিস্টেমের মতো। সেই নীতির মধ্যে, আমাদের ৩টি কার্যকরী "উপ-নীতি" রয়েছে যা আমরা বিশ্বাস করি যে সাইটটিকে বিশ্বাসযোগ্য করার জন্য আমরা কার্যকরী পদক্ষেপ নিতে পারি: + +- _"ফ্রেশ"_ অর্থাৎ, বিষয়বস্তুকে আপ-টু-ডেট রাখুন। +- _"সোশ্যাল প্রুফ"_ অর্থাৎ, ইকোসিস্টেমের আকার, বৈচিত্র্য এবং কার্যকলাপ দেখান (আপনি জানেন: ইথেরিয়াম আপগ্রেড অগ্রগতি, DeFi, গেমিং, সমস্ত হ্যাকাথন, ইত্যাদি) +- _"কনসিসটেন্ট"_ অর্থাৎ, সাইটের ডিজাইনে এবং লেখার সুর ও নির্ভুলতায় কনসিসটেন্সি। + +সুতরাং যখন আমরা ডিজাইনের সিদ্ধান্ত বা কপিরাইটিংয়ের সিদ্ধান্ত নিই, তখন আমরা "বিশ্বাসযোগ্য" নীতিটি উল্লেখ করে জিজ্ঞাসা করতে পারি: + +- _"সাইটটি কি বর্তমান তথ্য প্রতিফলিত করে?"_ +- _"আমরা কীভাবে এবং কোথায় ইকোসিস্টেমের আকার এবং কার্যকলাপ দেখাচ্ছি?"_ +- _"আমি যে কমিউনিটি সদস্যের নতুন প্রস্তাবিত অবদানগুলি পর্যালোচনা করছি, তা কি সাইটের বর্তমান ডিজাইন এবং লেখার সাথে সামঞ্জস্যপূর্ণ?"_ + +## ethereum.org ডিজাইন নীতি {#contributors} + +### ১. অনুপ্রেরণামূলক {#1-inspirational} + +সাইটটি ব্যবহারকারীদের স্বপ্ন দেখতে অনুপ্রাণিত করবে যে ইথেরিয়াম কীভাবে বিশ্বকে পরিবর্তন করতে পারে। এটি લોકોને ইথেরিয়াম ইকোসিস্টেমের টুলস এবং অ্যাপগুলি অন্বেষণ করতে, খেলতে এবং টিঙ্কার করতে অনুপ্রাণিত করবে। + +- **রেডিক্যাল:** সাইটটিকে বিশ্বের অর্থপূর্ণ পরিবর্তন আনার জন্য ইথেরিয়াম-এর উচ্চাকাঙ্ক্ষী লক্ষ্যগুলি জানানো উচিত। এটা স্পষ্ট হওয়া উচিত যে ইথেরিয়াম শুধু কোনো নতুন টেক স্ট্যাক নয় - এটি একটি রূপান্তরমূলক প্রযুক্তি। +- **শিক্ষার মাধ্যমে ক্ষমতায়ন:** সাইটটি মানুষকে শিক্ষিত করবে যাতে তারা ইথেরিয়াম-এর সম্ভাবনা বুঝতে পারে, ইকোসিস্টেমে তাদের জায়গা খুঁজে পেতে পারে এবং এতে অংশ নিতে ক্ষমতায়িত বোধ করতে পারে। + +ভিজ্যুয়াল ডিরেকশন • বিষয়বস্তু + +### 2. সার্বজনীন {#2-universal} + +ইথেরিয়াম একটি বিশ্বব্যাপী, বিকেন্দ্রীভূত প্রকল্প এবং আমাদের দর্শকগণ এটিই প্রতিফলিত করে। সাইটটির লক্ষ্য হওয়া উচিত সকলের কাছে অ্যাক্সেসযোগ্য হওয়া এবং বিশ্বের অনেক সংস্কৃতির প্রতি সংবেদনশীল হওয়া। + +- **অ্যাক্সেসযোগ্য:** সাইটটিকে অ্যাক্সেসিবিলিটি নির্দেশিকা অনুসরণ করা উচিত - যার মধ্যে কম-ব্যান্ডউইথ সংযোগযুক্ত ব্যক্তিদের জন্যও অন্তর্ভুক্ত। +- **সরাসরি:** সাইটটি সহজ এবং দ্ব্যর্থহীন হওয়া উচিত। কপিতে এমন ভাষা ব্যবহার করা উচিত নয় যা ভুল ব্যাখ্যা করা হতে পারে বা অনুবাদে হারিয়ে যেতে পারে। +- **ইথেরিয়াম বহুমুখী:** ইথেরিয়াম একটি প্রকল্প, একটি কোডবেস, একটি কমিউনিটি এবং একটি ভিশন। বিভিন্ন কারণে বিভিন্ন মানুষের কাছে ইথেরিয়াম মূল্যবান, এবং এতে জড়িত হওয়ার অনেক উপায় রয়েছে। + +লেখার সিস্টেম • রঙের ব্যবহার • ভিজ্যুয়াল ডিরেকশন • বিষয়বস্তু + +### 3. একটি ভালো গল্প {#3-a-good-story} + +ওয়েবসাইটটি একটি ভালো গল্পের মতো কাজ করা উচিত। দর্শকরা একটি যাত্রায় রয়েছে, এবং আপনার অবদান করা বিষয়বস্তু তার একটি অংশ। আপনার অবদানগুলিকে একটি স্পষ্ট বর্ণনার মধ্যে মানানসই হতে হবে: একটি শুরু (ভূমিকা/প্রবেশ বিন্দু), মধ্য (শিক্ষা এবং অন্তর্দৃষ্টির একটি সেট), এবং শেষ (প্রাসঙ্গিক রিসোর্স বা পরবর্তী পদক্ষেপের একটি লিঙ্ক(গুলি)) সহ। + +- **হায়ারারকিক্যাল**: একটি স্পষ্ট, হায়ারারকিক্যালি স্ট্রাকচার্ড তথ্য স্থাপত্য ethereum.org-এর দর্শকদের তাদের লক্ষ্য অর্জনের জন্য সাইটটিকে "একটি গল্প হিসাবে" নেভিগেট করতে সাহায্য করে। +- **একটি সোপান:** আমরা উত্তর খুঁজছেন এমন যে কারো জন্য একটি সোপান। আমরা ইতিমধ্যে বিদ্যমান অনেক রিসোর্সের প্রতিস্থাপন বা বিকল্প হতে চাই না। আমরা একটি উত্তর দিই এবং নির্ভরযোগ্য পরবর্তী পদক্ষেপ সরবরাহ করি। + +ব্যবহারকারীর যাত্রা • বিষয়বস্তু + +### ৪. বিশ্বাসযোগ্য {#4-credible} + +লোকেরা হয়তো ইথেরিয়াম ইকোসিস্টেমের সাথে তাদের পরিচিতি খুঁজছে অথবা তারা সংশয়বাদী হতে পারে। আপনি কীভাবে যোগাযোগ করেন তাতে সেই দায়িত্ব স্বীকার করুন। নিশ্চিত করুন যে তারা উভয়ই ইথেরিয়াম ইকোসিস্টেমে আরও বেশি আস্থা নিয়ে চলে যায়। + +- **ফ্রেশ:** সর্বদা আপ টু ডেট। +- **সোশ্যাল প্রুফ:** ইকোসিস্টেমের আকার, বৈচিত্র্য এবং কার্যকলাপ দেখান। +- **কনসিসটেন্ট:** ডিজাইন এবং বিষয়বস্তুতে কনসিসটেন্সি বিশ্বাসযোগ্যতা প্রকাশ করে। + +ভিজ্যুয়াল ডিরেকশন • বিষয়বস্তু + +### ৫। সহযোগিতামূলক উন্নতি {#5-collaborative-improvement} + +ওয়েবসাইটটি অনেক কন্ট্রিবিউটরের পণ্য, ঠিক যেমন সমগ্র ইকোসিস্টেম। + +- **ওপেন:** ইকোসিস্টেম জুড়ে সোর্স কোড, প্রক্রিয়া এবং প্রকল্পের স্বচ্ছতা উদযাপন করুন। +- **এক্সটেন্ডেবল:** মডুলারিটি আমাদের করা সমস্ত কিছুর পিছনে একটি মূল ফোকাস, এবং তাই অবদানগুলিও মডুলার হওয়া উচিত। সাইটের মূল ডিজাইন, কম্পোনেন্ট কোড এবং বাস্তবায়ন এটিকে ভবিষ্যতে সহজে প্রসারিত করতে সক্ষম করা উচিত। +- **পরীক্ষামূলক:** আমরা ক্রমাগত পরীক্ষা, টেস্টিং এবং পুনরাবৃত্তি করছি। +- **সহযোগিতামূলক:** এই প্রকল্পটি আমাদের সকলকে একত্রিত করে। +- **টেকসই:** কমিউনিটি দ্বারা দীর্ঘমেয়াদী রক্ষণাবেক্ষণের জন্য সেট আপ করা। + +আপনি আমাদের ডিজাইন নীতিগুলি আমাদের [সাইট জুড়ে](/) কার্যকর দেখতে পারেন। + +## প্রতিক্রিয়া দিন {#give-feedback} + +**এই ডকুমেন্টের উপর আপনার প্রতিক্রিয়া শেয়ার করুন!** আমাদের প্রস্তাবিত নীতিগুলির মধ্যে একটি হলো "**সহযোগিতামূলক উন্নতি**" যার মানে হলো আমরা চাই যে ওয়েবসাইটটি অনেক কন্ট্রিবিউটরের পণ্য হোক। তাই সেই নীতির চেতনায়, আমরা এই ডিজাইন নীতিগুলি ইথেরিয়াম কমিউনিটির সাথে শেয়ার করতে চাই। + +যদিও এই নীতিগুলি ethereum.org ওয়েবসাইটের উপর केंद्रित, আমরা আশা করি যে তাদের মধ্যে অনেকগুলি সামগ্রিকভাবে ইথেরিয়াম ইকোসিস্টেমের মূল্যবোধের প্রতিনিধি। হয়তো আপনি এমনকি আপনার নিজের প্রকল্পে এর কিছু অন্তর্ভুক্ত করতে চান! + +আমাদেরকে আপনার মতামত [Discord সার্ভারে](https://discord.gg/ethereum-org) অথবা একটি [ইস্যু তৈরি করে](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) জানান। diff --git a/public/content/translations/bn/contributing/design/adding-design-resources/index.md b/public/content/translations/bn/contributing/design/adding-design-resources/index.md new file mode 100644 index 00000000000..5c538cae4d4 --- /dev/null +++ b/public/content/translations/bn/contributing/design/adding-design-resources/index.md @@ -0,0 +1,69 @@ +--- +title: "ডিজাইন রিসোর্স যোগ করা" +description: "ethereum.org-এ ডিজাইন সামগ্রীর গুণমান নিশ্চিত করার জন্য নির্দেশিকা এবং প্রয়োজনীয়তা" +lang: bn +--- + +# ডিজাইন রিসোর্স যোগ করা {#adding-design-resources} + +যেকেউ [ওয়েব3 পেজে ডিজাইন এবং UX](/developers/docs/design-and-ux/) এর জন্য নতুন ডিজাইন সামগ্রীর পরামর্শ দিতে পারেন। + +সচেতন থাকুন যে এই পৃষ্ঠার মূল লক্ষ্য হল উচ্চাকাঙ্ক্ষী ওয়েব3 ডিজাইনারদের ব্যবহারকারীর মূল্য প্রদান করা। ডিজাইন বিভাগটি আপনার পরিষেবা, পণ্য বা প্ল্যাটফর্মের বিজ্ঞাপন দেওয়ার জন্য নয়। + +আমরা যাতে তথ্যের একটি উচ্চ মান বজায় রাখি এবং মূল্যবান অন্তর্দৃষ্টি প্রচার করি তা নিশ্চিত করার জন্য, আমরা একটি তালিকাভুক্তকরণ নীতি প্রতিষ্ঠা করেছি: + +## গবেষণা এবং ড্যাশবোর্ড {#Research-studies} + +1. সঠিক পদ্ধতি + +ক। পদ্ধতিটি স্পষ্টভাবে সংজ্ঞায়িত করা উচিত যে ডেটা কীভাবে সংগ্রহ করা হয়েছিল। + +খ। গবেষণায় অংশগ্রহণকারী অংশগ্রহণকারীর সংখ্যা উল্লেখ করা উচিত। + +গ। ব্যবহৃত গবেষণা পদ্ধতি বর্ণনা করা উচিত। + +2. ওয়েব3 ডিজাইনার এবং সাধারণ ডিজাইন ব্যবহারের ক্ষেত্রে প্রাসঙ্গিকতা + +ক। গবেষণার বিষয়টি ওয়েব3 ডিজাইনারদের জন্য প্রাসঙ্গিক হওয়া উচিত এবং সাধারণ ডিজাইন ব্যবহারের ক্ষেত্রগুলিকে সম্বোধন করা উচিত। + +3. অন্তর্দৃষ্টি প্রদানে ফোকাস করুন + +ক। পাঠ্যের প্রাথমিক উদ্দেশ্য হওয়া উচিত একটি নির্দিষ্ট প্রকল্প বা কোম্পানির প্রচার না করে অন্তর্দৃষ্টি ভাগ করা। + +## নিবন্ধ {#Articles} + +1. ওয়েব3 ডিজাইনার/গবেষক এবং সাধারণ ওয়েব3 ডিজাইন ব্যবহারের ক্ষেত্রে প্রাসঙ্গিকতা + +ক। নিবন্ধের বিষয় ওয়েব3 ডিজাইনার এবং গবেষকদের জন্য প্রাসঙ্গিক হওয়া উচিত, সাধারণ ওয়েব3 ডিজাইন ব্যবহারের ক্ষেত্রে ফোকাস করা উচিত। + +2. লেখার প্রাথমিক গুণমান + +ক। নিবন্ধটি ব্যাকরণ এবং বানান ভুল থেকে মুক্ত হওয়া উচিত। + +খ। মূল অন্তর্দৃষ্টি এবং শিক্ষা প্রদানের উপর জোর দেওয়া উচিত। + +গ। লেখাটি সংক্ষিপ্ত এবং যথাযথ হওয়া উচিত। + +3. পাঠ্যের লক্ষ্য + +ক। নিবন্ধটির প্রাথমিক লক্ষ্য হওয়া উচিত একটি নির্দিষ্ট প্রকল্প বা কোম্পানির প্রচার না করে অন্তর্দৃষ্টি ভাগ করা। + +## কমিউনিটি / ডিএও {#Communities-and-DAOs} + +1. ওয়েবসাইটকে স্পষ্টভাবে নির্দেশ করতে হবে কিভাবে ডিএও/কমিউনিটিতে যোগদান করতে হয় + +2. সদস্যতার স্পষ্ট সুবিধা + +ক। সদস্য হওয়ার সুবিধাগুলি স্পষ্টভাবে প্রদর্শন করা উচিত। + +**উদাহরণ**: কাজের উপর প্রতিক্রিয়া গ্রহণ, চাকরির সুযোগ বা বাউন্টি অ্যাক্সেস করা, ডিজাইন এবং গবেষণার অন্তর্দৃষ্টি ভাগ করা। + +3. ডিসকর্ডে সক্রিয় এবং প্রাণবন্ত যোগাযোগ + +ক। ডিসকর্ড কমিউনিটিকে প্রাণবন্ত এবং নিযুক্ত যোগাযোগ প্রদর্শন করা উচিত। + +খ। মডারেটরদের সক্রিয়ভাবে কমিউনিটি বজায় রাখা এবং আলোচনা সহজতর করার কাজে জড়িত থাকা উচিত। + +গ। কমিউনিটিকে গত দুই সপ্তাহের মধ্যে মূল্যবান এবং উত্পাদনশীল কথোপকথনের একটি ট্র্যাক রেকর্ড প্রদর্শন করা উচিত। + +এই মানদণ্ডগুলি মেনে চলার মাধ্যমে, আমরা আমাদের কমিউনিটির মধ্যে একটি সমৃদ্ধ এবং জ্ঞান-ভাগ করে নেওয়ার পরিবেশ গড়ে তোলার লক্ষ্য রাখি। আমরা বিশ্বাস করি যে এই শ্বেত তালিকাভুক্তকরণ নীতিটি নিশ্চিত করবে যে আমাদের ব্যবহারকারীরা নির্ভরযোগ্য, প্রাসঙ্গিক, এবং অন্তর্দৃষ্টিপূর্ণ রিসোর্সগুলিতে অ্যাক্সেস পাবে। আমাদের প্ল্যাটফর্মের মধ্যে বিষয়বস্তুর গুণমান বজায় রাখার জন্য আপনার বোঝা এবং সহযোগিতার জন্য ধন্যবাদ। diff --git a/public/content/translations/bn/contributing/design/index.md b/public/content/translations/bn/contributing/design/index.md new file mode 100644 index 00000000000..cd0a198f063 --- /dev/null +++ b/public/content/translations/bn/contributing/design/index.md @@ -0,0 +1,77 @@ +--- +title: "ডিজাইন অবদান" +description: "ethereum.org-এ ডিজাইন অবদান" +lang: bn +--- + +# ethereum.org-এ ডিজাইন অবদান {#design-contributions} + +যেকোনো প্রজেক্টের জন্য ডিজাইন একটি গুরুত্বপূর্ণ উপাদান, এবং ethereum.org-এ আপনার সময় এবং ডিজাইন দক্ষতা উৎসর্গ করে, আপনি আমাদের ভিজিটরদের জন্য ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সাহায্য করতে পারেন। একটি ওপেন-সোর্স প্রজেক্টে অবদান রাখা একটি সহযোগী পরিবেশে প্রাসঙ্গিক অভিজ্ঞতা অর্জন এবং আপনার দক্ষতা বিকাশের সুযোগ প্রদান করে। আপনি অন্যান্য ডিজাইনার, ডেভেলপার এবং কমিউনিটির সদস্যদের সাথে কাজ করার সুযোগ পাবেন, যাদের প্রত্যেকের নিজস্ব অনন্য দৃষ্টিকোণ এবং অন্তর্দৃষ্টি থাকবে। + +সর্বোপরি, এটি একটি বৈচিত্র্যময় এবং চিত্তাকর্ষক পোর্টফোলিও তৈরি করার একটি দুর্দান্ত উপায় যা আপনার ডিজাইন দক্ষতা প্রদর্শন করে। + +## কীভাবে অবদান রাখবেন? + +###  প্রাথমিক ডিজাইন প্রোটোটাইপগুলিতে ফিডব্যাক দিন {#design-critique} + +আমাদের কাঁচা ধারণাগুলি পরীক্ষা করার জন্য আমাদের মাঝে মাঝে সাহায্যের প্রয়োজন হয়। কোনও প্রযুক্তিগত জ্ঞান ছাড়াই অবদান রাখার এটি একটি দুর্দান্ত উপায়। + +1. ডিজাইন টিম [Discord](https://discord.com/invite/ethereum-org)-এ এবং [GitHub](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8)-এ একটি মকআপ ডিজাইন শেয়ার করবে। +2. কমেন্ট ফাংশনের মাধ্যমে ফিডব্যাক প্রদানের জন্য আপনাকে ডিজাইনগুলির মাধ্যমে গাইড করা হবে। +3. ফলাফলটি GitHub ইস্যুতে শেয়ার করা হবে এবং তারপরে টিম দ্বারা বন্ধ করা হবে। + +###  জরিপ গবেষণায় অংশগ্রহণ করুন {#answer-surveys} + +আমাদের ওয়েবসাইটে ফিডব্যাক দিন: + +1. ethereum.org ভিজিট করা এবং পেজগুলি পড়া। +2. নীচের ডানদিকের কোণায় ফিডব্যাক উইজেটে ক্লিক করা এবং ডিজাইন এবং বিষয়বস্তু-সম্পর্কিত প্রশ্নের উত্তর দেওয়া। +3. ফ্রি ফরম্যাট প্রশ্নগুলির উপর ফোকাস করুন। + +###  ওয়েবসাইটে ডিজাইন সম্পর্কিত সমস্যাগুলি খুঁজুন এবং সেগুলি রিপোর্ট করুন {#report-design-issues} + +ethereum.org একটি দ্রুত বর্ধনশীল ওয়েবসাইট যাতে অনেক ফিচার এবং কন্টেন্ট রয়েছে। কিছু UI সহজেই অপ্রচলিত হয়ে যেতে পারে বা উন্নত করা যেতে পারে। আপনি যদি এই ধরনের কোনো ঘটনার সম্মুখীন হন, দয়া করে এটি রিপোর্ট করুন যাতে এটি আমাদের নজরে আসে। + +1. ওয়েবসাইটটি ঘুরে দেখুন এবং এর ডিজাইনের প্রতি মনোযোগ দিন। +2. আপনি যদি কোনো ভিজ্যুয়াল বা UX সমস্যা দেখতে পান তবে স্ক্রিনশট এবং নোট নিন। +3. একটি [বাগ রিপোর্ট](https://github.com/ethereum/ethereum-org-website/issues/new/choose) ব্যবহার করে পাওয়া সমস্যাগুলি রিপোর্ট করুন। + +###  ডিজাইন পরিবর্তনের প্রস্তাব দিন {#propose-design-changes} + +আপনি যদি ডিজাইনের চ্যালেঞ্জ নিতে স্বাচ্ছন্দ্য বোধ করেন, তাহলে আপনি আমাদের GitHub ইস্যু বোর্ডে গিয়ে [ডিজাইন-সম্পর্কিত সমস্যাগুলি](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8)-এর জন্য ফিল্টার করতে পারেন। + +1. আমাদের ওয়েবসাইটটি ভালোভাবে দেখুন এবং এর ডিজাইনের প্রতি মনোযোগ দিন অথবা আমাদের GitHub রিপোজিটরিতে যান এবং [“Design required” ট্যাগ](https://github.com/ethereum/ethereum-org-website/labels/design%20required%20%F0%9F%8E%A8) দিয়ে ফ্ল্যাগ করা সমস্যাগুলি পর্যালোচনা করুন। +2. সমাধানটি নিয়ে ভাবুন এবং এটি ডিজাইন করুন। (বিশেষত আমাদের [ডিজাইন সিস্টেম](https://www.figma.com/community/file/1134414495420383395) ব্যবহার করে)। +3. সংশ্লিষ্ট GitHub ইস্যুতে সমাধানটি প্রস্তাব করুন বা [একটি নতুন তৈরি করুন।](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=feature+%3Asparkles%3A&template=feature_request.yaml&title=Feature+request) +4. ডিজাইন টিমের পর্যালোচনার জন্য অপেক্ষা করুন। + +###  একসাথে ডিজাইন সিস্টেম তৈরি করুন {#Contribute-to-design-system} + +আমাদের ডিজাইন সিস্টেম ethereum.org-এর ডিজাইনকে মজাদার এবং সহজ করে তোলে। আপনি যদি একজন অভিজ্ঞ ডিজাইনার হন, তাহলে আপনি ওয়েবসাইটের জন্য অনেক কম্পোনেন্ট প্রস্তুত করতে আমাদের সাহায্য করতে পারেন। + +1. GitHub-এর [ডিজাইন সিস্টেম বোর্ড](https://github.com/ethereum/ethereum-org-website/labels/design%20system) থেকে কাজ করার জন্য একটি সমস্যা নির্বাচন করুন বা একটি নতুন তৈরি করুন। +2. নির্বাচিত সমস্যাটি আপনাকে অ্যাসাইন করার জন্য অনুরোধ করুন। +3. Figma-তে অনুরোধ করা কম্পোনেন্টটি ডিজাইন করা শুরু করুন। +4. আপনার যখন পর্যালোচনা বা নির্দেশনার প্রয়োজন হবে তখন এটি GitHub-এ ডিজাইন টিমের সাথে শেয়ার করুন। +5. ডিজাইন টিম পর্যালোচনা করবে। +6. ডিজাইন টিম মূল ফাইলে পরিবর্তনগুলি অন্তর্ভুক্ত করবে এবং ফাইলটি কমিউনিটিতে প্রকাশ করবে। + +###  ওয়েবসাইটে ডিজাইন-সম্পর্কিত কন্টেন্ট লিখুন {#write-design-articles} + +ইথেরিয়াম ডেভেলপার কমিউনিটি শক্তিশালী, কিন্তু ডিজাইন কমিউনিটি কিছুটা পিছিয়ে আছে। আপনি যদি web3 জ্ঞানসহ একজন ডিজাইনার হন, তাহলে অনুগ্রহ করে আপনার শেখা বিষয়গুলো বৃহত্তর কমিউনিটির সাথে শেয়ার করার কথা বিবেচনা করুন যাতে আমরা সবাই একসাথে বেড়ে উঠতে এবং উন্নতি করতে পারি; আমাদের [ইথেরিয়ামের জন্য ডিজাইনিংয়ের উপর একটি পৃষ্ঠা](/developers/docs/design-and-ux/) রয়েছে যেখানে আপনি অবদান রাখতে পারেন। আপনি আমাদের [তালিকাভুক্তকরণ নীতিগুলিও](/contributing/design/adding-design-resources) দেখতে পারেন। + +1. ethereum.org-এ কভার করা উচিত এবং এই ক্ষেত্রের ডিজাইনারদের জন্য উপকারী হবে এমন ডিজাইন টপিকগুলি নিয়ে ভাবুন। +2. আমাদের GitHub রিপোজিটরিতে যান এবং একটি টপিক প্রস্তাব করে [একটি ইস্যু তুলুন](https://github.com/ethereum/ethereum-org-website/issues/new) (এখনই কন্টেন্ট লিখবেন না)। +3. ডিজাইন টিমের অনুমোদনের জন্য অপেক্ষা করুন। +4. অনুমোদিত হলে, কন্টেন্টটি লিখুন। +5. এটি সংশ্লিষ্ট GitHub ইস্যুতে জমা দিন। + +###  নতুন ইলাস্ট্রেশন আঁকুন {#prepare-illustrations} + +বিমূর্ত বিষয় ব্যাখ্যা করার জন্য ভিজ্যুয়ালাইজেশন সবচেয়ে শক্তিশালী টুলসগুলির মধ্যে একটি। ডায়াগ্রাম এবং ইনফোগ্রাফিক যোগ করার মাধ্যমে একটি বিশাল সম্ভাবনা রয়েছে। সর্বোপরি, একটি ছবি হাজার শব্দের কথা বলতে পারে। + +1. আমাদের ওয়েবসাইটে যান এবং দেখুন কোন পেজগুলিতে কিছু নতুন ইনফোগ্রাফিক যোগ করা যেতে পারে। +2. নিশ্চিত করুন যে ইলাস্ট্রেশন স্টাইলটি আমাদের [সম্পদগুলির](/assets/) সাথে সামঞ্জস্যপূর্ণ। +3. আমাদের GitHub রিপোজিটরিতে যান এবং ইলাস্ট্রেশনটি প্রস্তাব করে [একটি ইস্যু তুলুন](https://github.com/ethereum/ethereum-org-website/issues/new)। +4. ডিজাইন টিম এটি পর্যালোচনা করবে। +5. আমরা একজন ডেভেলপারকে নতুন ছবিটি ইমপ্লিমেন্ট করতে বলার জন্য একটি নতুন ইস্যু তৈরি করি। diff --git a/public/content/translations/bn/contributing/index.md b/public/content/translations/bn/contributing/index.md new file mode 100644 index 00000000000..cc3ca0f854b --- /dev/null +++ b/public/content/translations/bn/contributing/index.md @@ -0,0 +1,120 @@ +--- +title: "অবদান রাখছে" +description: "ethereum.org-এ অবদান রাখার বিভিন্ন উপায় সম্পর্কে জানুন" +lang: bn +--- + +# ethereum.org-এ অবদান রাখা 🦄 {#contributing-to-ethereumorg} + +Ethereum.org হল একটি ওপেন-সোর্স পরিচালিত প্রজেক্ট যেখানে **12 000+** অবদানকারী রয়েছেন যারা ওয়েবসাইট অনুবাদ, লেখা, ডিজাইন এবং রক্ষণাবেক্ষণে সহায়তা করেন। + +আমরা একটি স্বাগতপূর্ণ কমিউনিটি যা আপনাকে Ethereum ইকোসিস্টেমে বেড়ে উঠতে এবং শিক্ষিত হতে সাহায্য করবে এবং একই সাথে অর্থপূর্ণভাবে অবদান রাখতে ও প্রাসঙ্গিক ব্যবহারিক অভিজ্ঞতা পেতে সাহায্য করবে! + +## অবদান রাখার উপায় {#ways-to-contribute} + +**অনুবাদ** + +- [অনুবাদ প্রোগ্রামে যোগ দিন](/contributing/translation-program/) – ethereum.org কে নতুন ভাষায় নিয়ে আসতে আমাদের সাহায্য করুন + +**ডেভেলপমেন্ট** + +- [একটি ওপেন ইস্যুতে কাজ করুন](https://github.com/ethereum/ethereum-org-website/issues) – আমরা যে কাজগুলো চিহ্নিত করেছি যেগুলো করা প্রয়োজন + +**ডিজাইন** + +- [ওয়েবসাইট ডিজাইন করতে সাহায্য করুন](/contributing/design/) – সব স্তরের ডিজাইনাররা ওয়েবসাইটের উন্নতিতে অবদান রাখতে পারেন + +**বিষয়বস্তু** + +- [বিষয়বস্তু তৈরি/সম্পাদনা করুন](/contributing/#how-to-update-content) – নতুন পেজের পরামর্শ দিন অথবা যা এখানে ইতিমধ্যেই আছে তাতে সামান্য পরিবর্তন করুন +- [কমিউনিটির রিসোর্স যোগ করুন](/contributing/content-resources/) – একটি প্রাসঙ্গিক পেজে একটি সহায়ক আর্টিকেল বা রিসোর্স যোগ করুন +- [একটি ডিজাইন রিসোর্সের পরামর্শ দিন](/contributing/design/adding-design-resources/) – সহায়ক ডিজাইন রিসোর্স যোগ করুন, আপডেট করুন এবং মুছুন +- [কুইজ](/contributing/quizzes/) – একটি প্রাসঙ্গিক পেজের জন্য কুইজের প্রশ্নব্যাঙ্ক যোগ করুন, আপডেট করুন এবং মুছুন + +**ফিচারের ধারণা** + +- [একটি ফিচারের জন্য অনুরোধ করুন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=Type%3A+Feature&template=feature_request.yaml&title=) – নতুন কোনো ফিচার বা ডিজাইন সম্পর্কে আপনার কোনো ধারণা থাকলে আমাদের জানান + +**পণ্যের তালিকা** + +- [একটি এক্সচেঞ্জ যোগ করুন](/contributing/adding-exchanges/) – আমাদের [এক্সচেঞ্জ ফাইন্ডারে](/get-eth/#country-picker) একটি এক্সচেঞ্জ যোগ করুন +- [একটি পণ্য যোগ করুন](/contributing/adding-products/) – একটি প্রাসঙ্গিক পেজে একটি ডিএ্যাপ বা ওয়ালেট যোগ করুন +- [ডেভেলপার টুল যোগ করুন](/contributing/adding-developer-tools/) – একটি প্রাসঙ্গিক পেজে একটি ডেভেলপার টুল যোগ করুন +- [একটি লেয়ার 2 যোগ করুন](/contributing/adding-layer-2s/) – একটি প্রাসঙ্গিক পেজে একটি লেয়ার 2 যোগ করুন +- [একটি স্টেকিং পণ্য বা পরিষেবা যোগ করুন](/contributing/adding-staking-products/) – এমন একটি প্রজেক্ট যোগ করুন যা সোলো স্টেকিং, পুলড স্টেকিং বা পরিষেবা হিসাবে স্টেকিং সহজতর করতে সাহায্য করে +- [একটি ওয়ালেট যোগ করুন](/contributing/adding-wallets/) – [ওয়ালেট খোঁজার পেজের](/wallets/find-wallet/) জন্য একটি ওয়ালেট যোগ করুন +- [আমাদের DeSci পেজের জন্য একটি প্রজেক্টের পরামর্শ দিন](/contributing/adding-desci-projects/) – Ethereum-এর উপর নির্মিত একটি প্রজেক্ট যোগ করুন যা বিকেন্দ্রীভূত বিজ্ঞানে অবদান রাখে + +কোনো প্রশ্ন আছে? 🤔 আমাদের [Discord সার্ভারে](https://discord.gg/ethereum-org) যোগ দিন + +## অবদান শুরু করার জন্য ভালো প্রথম কাজ + +এগুলো কয়েকটি বর্তমান কাজ যা সমাধানে আপনি আমাদের সাহায্য করতে এবং দায়িত্ব নিতে পারেন। বেশিরভাগের জন্য আপনার একটি GitHub অ্যাকাউন্ট প্রয়োজন হবে কারণ ওয়েবসাইটের বেশিরভাগ পরিবর্তন GitHub-এর মাধ্যমে করা হয়। + + + +সব কাজ দেখুন + +## ethereum.org-এ কীভাবে কাজ করবেন {#how-to-update-content} + +আপনি যদি [অনুবাদ কার্যক্রমে](/contributing/translation-program/) অবদান রাখতে চান, আমরা আপনাকে [Crowdin](https://crowdin.com/project/ethereum-org)-এ একটি অ্যাকাউন্ট তৈরি করতে অনুরোধ করছি। বাকি সবকিছুর জন্য – ওয়েবসাইটে বিষয়বস্তু বা ভিজ্যুয়াল যোগ করা বা সম্পাদনা করা, বাগ ঠিক করা, ওপেন টাস্কে কাজ করা – আপনার একটি [GitHub](https://github.com/) অ্যাকাউন্ট প্রয়োজন হবে। + +সমস্ত আপডেট GitHub PR প্রক্রিয়ার মাধ্যমে করা হয়। এর মানে হল আপনি ওয়েবসাইটের একটি স্থানীয় কপি তৈরি করবেন, আপনার পরিবর্তনগুলি করবেন এবং আপনার পরিবর্তনগুলিকে মার্জ করার জন্য অনুরোধ করবেন। আপনি যদি আগে এটি কখনও না করে থাকেন, তাহলে আমাদের [GitHub রিপোজিটরির](https://github.com/ethereum/ethereum-org-website) নীচে দেওয়া নির্দেশাবলী অনুসরণ করুন। + +কোনো কিছুতে কাজ করার জন্য আপনার অনুমতির প্রয়োজন নেই, তবে আপনি কী করার পরিকল্পনা করছেন তা আমাদের জানানো সর্বদা ভাল। আপনি এটি করতে পারেন: + +- [GitHub](https://github.com/ethereum/ethereum-org-website)-এ একটি ইস্যু বা PR-এ মন্তব্য করে +- আমাদের [Discord সার্ভারে](https://discord.gg/ethereum-org) মেসেজ করে + +অবদান রাখার আগে, নিশ্চিত করুন যে আপনি এগুলোর সাথে পরিচিত: + +- [ethereum.org-এর](/about/) ক্রমবর্ধমান রূপকল্প +- আমাদের [নকশার মূলনীতি](/contributing/design-principles/) +- আমাদের [স্টাইল গাইড](/contributing/style-guide/) +- আমাদের [আচরণবিধি](/community/code-of-conduct) + +## সাইট সম্পর্কে সিদ্ধান্ত কীভাবে নেওয়া হয় {#how-decisions-about-the-site-are-made} + +স্বতন্ত্র PR, ডিজাইন বিবর্তন এবং বড় আপগ্রেড সম্পর্কে সিদ্ধান্তগুলি Ethereum ইকোসিস্টেমের একটি দল দ্বারা নেওয়া হয়। এই দলে প্রজেক্ট ম্যানেজার, ডেভেলপার, ডিজাইনার, মার্কেটিং ও কমিউনিকেশন এবং বিষয় বিশেষজ্ঞ অন্তর্ভুক্ত। কমিউনিটির ইনপুট প্রতিটি সিদ্ধান্তকে অবহিত করে: তাই অনুগ্রহ করে ইস্যুতে প্রশ্ন তুলুন, PR জমা দিন, বা দলের সাথে যোগাযোগ করুন: + +- [website@ethereum.org](mailto:website@ethereum.org) +- [@ethdotorg](https://twitter.com/ethdotorg) +- [Discord সার্ভার](https://discord.gg/ethereum-org) + +### চৌর্যবৃত্তি সম্পর্কে একটি নোট {#plagiarism} + +ethereum.org-এ কোনো বিষয়বস্তু বা আর্টিফ্যাক্ট অবদান রাখার সময় শুধুমাত্র আপনার আসল কাজ বা আপনার ব্যবহারের অনুমতি আছে এমন বিষয়বস্তু ব্যবহার করুন। Ethereum ইকোসিস্টেমের মধ্যে অনেক প্রকল্প ওপেন-সোর্স লাইসেন্সিং ব্যবহার করে যা তথ্যের বিনামূল্যে আদান-প্রদানের অনুমতি দেয়। যাইহোক, আপনি যদি এই তথ্য খুঁজে না পান, তাহলে এটি ethereum.org-এ যোগ করার চেষ্টা করবেন না। চৌর্যবৃত্তি হিসেবে বিবেচিত যেকোনো পুল রিকুয়েস্ট প্রত্যাখ্যান করা হবে। + +## ওপেন-সোর্সে নতুন? {#new-to-open-source} + +আমাদের GitHub রিপোজিটরিতে স্বল্প বাধাযুক্ত এন্ট্রি ইস্যু রয়েছে যা বিশেষভাবে সেইসব ডেভেলপারদের জন্য ডিজাইন করা হয়েছে যারা [good first issue](https://github.com/ethereum/ethereum-org-website/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) লেবেলযুক্ত ওপেন-সোর্সে নতুন। + +## আপনার অনচেইন অ্যাচিভমেন্ট টোকেন (OAT) দাবি করুন {#oat} + +যদি আপনার অবদান ethereum.org-এ মার্জ হয়ে যায়, তাহলে আপনি [Galxe](https://app.galxe.com/quest/ethereumorg)-এ একটি বিশেষ ব্যাজ দাবি করার সুযোগ পাবেন। একটি অনচেইন অ্যাচিভমেন্ট টোকেন (OAT) হল একটি প্রমাণ যে আপনি ইকোসিস্টেমকে আরও একটু চমৎকার করতে সাহায্য করেছেন। + +[OATs সম্পর্কে আরও](https://help.galxe.com/en/articles/9645630-create-quest-rewards#h_1c5d63ba03) + +### কীভাবে দাবি করবেন + +1. আমাদের [Discord সার্ভারে](https://discord.gg/ethereum-org) যোগ দিন। +2. `#🥇 | proof-of-contribution` চ্যানেলে আপনার অবদানের একটি লিঙ্ক পেস্ট করুন। +3. আমাদের দলের একজন সদস্যের আপনার OAT-এর লিঙ্ক পাঠানোর জন্য অপেক্ষা করুন। +4. আপনার OAT দাবি করুন! + +OAT দাবি করার জন্য আপনার শুধুমাত্র স্ব-হেফাজতের ওয়ালেট ব্যবহার করা উচিত। এক্সচেঞ্জ অ্যাকাউন্ট বা অন্য কোনো অ্যাকাউন্ট ব্যবহার করবেন না যার ব্যক্তিগত কী আপনার কাছে নেই, কারণ এগুলো আপনাকে আপনার OAT অ্যাক্সেস এবং পরিচালনা করার অনুমতি দেবে না। + +## আপনার GitPOAP দাবি করুন {#claim-gitpoap} + +GitPOAP স্বয়ংক্রিয়ভাবে আপনার মার্জ করা অবদানকে স্বীকৃতি দেবে এবং আপনাকে তাদের প্ল্যাটফর্মেই একটি পৃথক অনন্য অবদানকারীদের POAP মিন্ট করতে দেবে! + +### কীভাবে দাবি করবেন {#how-to-claim} + +1. [GitPOAP](https://www.gitpoap.io) দেখুন। +2. সাইন ইন বিকল্পের মাধ্যমে আপনার ওয়ালেট বা এমনকি আপনার ইমেল দিয়ে সংযোগ করুন। +3. আপনি যোগ্য কিনা তা পরীক্ষা করতে আপনার GitHub ব্যবহারকারীর নাম, ETH ঠিকানা, ENS নাম বা যেকোনো GitPOAP অনুসন্ধান করুন। +4. যদি আপনার GitHub অ্যাকাউন্ট যোগ্য হয়, তাহলে আপনি একটি GitPOAP মিন্ট করতে পারবেন! + +## অবদানকারী {#contributors} + + diff --git a/public/content/translations/bn/contributing/quizzes/index.md b/public/content/translations/bn/contributing/quizzes/index.md new file mode 100644 index 00000000000..6e67076970f --- /dev/null +++ b/public/content/translations/bn/contributing/quizzes/index.md @@ -0,0 +1,62 @@ +--- +title: "একটি ক্যুইজ যোগ করা হচ্ছে" +description: "ethereum.org-এ কুইজ যোগ করার সময় আমরা যে নীতি ব্যবহার করি" +lang: bn +--- + +# কুইজ {#quizzes} + +কুইজ হল ব্যবহারকারীদের জন্য নিজেদের পরীক্ষা করার একটি সুযোগ যে তারা যে পৃষ্ঠাটি এইমাত্র পড়েছে তার বিষয়বস্তু বুঝতে পেরেছে কিনা। প্রশ্নগুলি শুধুমাত্র পৃষ্ঠায় দেওয়া বিষয়বস্তুর উপর ভিত্তি করে হওয়া উচিত এবং পৃষ্ঠায় উল্লেখ নেই এমন তথ্য সম্পর্কে জিজ্ঞাসা করা উচিত নয়। + +প্রশ্নগুলি নিম্নলিখিতভাবে গঠিত। প্রশ্নের প্রম্পট, এটি কেন সঠিক তার ব্যাখ্যাসহ 1টি সঠিক উত্তর, সেগুলি কেন ভুল তার ব্যাখ্যাসহ 3টি ভুল উত্তর। + +বর্তমান ক্যুইজের কিছু উদাহরণ এখানে উপলভ্য: + +- [স্তর 2](/layer-2) +- [NFT](/nft/) +- [Ethereum কী?](/what-is-ethereum/) +- [ETH কী?](/what-is-ether/) + +## শেখার জন্য একটি ক্যুইজ যোগ করা হচ্ছে + +যদি এমন কোনো পৃষ্ঠা থাকে যার জন্য কোনো শেখার কুইজ তৈরি করা হয়নি, অনুগ্রহ করে এর জন্য [একটি সমস্যা খুলুন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml)। + +অনুগ্রহ করে নিম্নলিখিত তথ্য প্রদান করুন: + +- আপনি যে পৃষ্ঠায় একটি কুইজ যোগ করতে চান +- নিম্নলিখিত তথ্যসহ 5টি প্রশ্ন: + - পৃষ্ঠার যে অংশের উপর ভিত্তি করে প্রশ্নটি তৈরি করা হয়েছে + - প্রশ্ন প্রম্পট + - কেন এটি সঠিক তার ব্যাখ্যাসহ 1টি সঠিক উত্তর + - 3টি ভুল উত্তর, প্রত্যেকটির সাথে কেন সেগুলি ভুল তার ব্যাখ্যা + +## একটি ক্যুইজ প্রশ্ন যোগ করা হচ্ছে + +যদি এমন কোনো প্রশ্ন থাকে যা আপনি একটি কুইজের জন্য প্রশ্ন ব্যাঙ্কে যোগ করতে চান, অনুগ্রহ করে [একটি সমস্যা খুলুন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) এবং নিম্নলিখিত তথ্য প্রদান করুন: + +- যে পৃষ্ঠায় আপনি একটি ক্যুইজ এর প্রশ্ন যোগ করতে চান +- প্রতিটি প্রশ্নের জন্য নিম্নলিখিত তথ্য প্রদান করুন: + - পৃষ্ঠার যে অংশের উপর ভিত্তি করে প্রশ্নটি তৈরি করা হয়েছে + - প্রশ্ন প্রম্পট + - কেন এটি সঠিক তার ব্যাখ্যাসহ 1টি সঠিক উত্তর + - 3টি ভুল উত্তর, প্রত্যেকটির সাথে কেন সেগুলি ভুল তার ব্যাখ্যা + +## একটি কুইজের প্রশ্ন আপডেট করা + +যদি এমন কোনো প্রশ্ন থাকে যা আপনি একটি কুইজের জন্য প্রশ্ন ব্যাঙ্কে আপডেট করতে চান, অনুগ্রহ করে [একটি সমস্যা খুলুন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) এবং নিম্নলিখিত তথ্য প্রদান করুন: + +- যে পৃষ্ঠায় আপনি একটি ক্যুইজ এর প্রশ্ন যোগ করতে চান +- প্রতিটি আপডেট করা প্রশ্নের জন্য, নিম্নলিখিত তথ্য প্রদান করুন: + - পৃষ্ঠার যে অংশের উপর ভিত্তি করে প্রশ্নটি তৈরি করা হয়েছে + - আপনি যে প্রশ্নটি আপডেট করতে চান তার প্রশ্নের প্রম্পট + - আপডেট করা প্রশ্ন প্রম্পট + - কেন এটি সঠিক তার ব্যাখ্যাসহ 1টি সঠিক উত্তর + - 3টি ভুল উত্তর, প্রত্যেকটির সাথে কেন সেগুলি ভুল তার ব্যাখ্যা + +## একটি কুইজের প্রশ্ন অপসারণ করা + +যদি কোনো প্রশ্নের জন্য পৃষ্ঠায় বিষয়বস্তু আর বিদ্যমান না থাকে এবং এটি অপসারণ করার প্রয়োজন হয়, অনুগ্রহ করে প্রশ্নটি অপসারণ করতে [একটি সমস্যা খুলুন](https://github.com/ethereum/ethereum-org-website/issues/new?assignees=&labels=&template=suggest_quiz.yaml) এবং নিম্নলিখিত তথ্য প্রদান করুন: + +- যে পৃষ্ঠায় আপনি একটি কুইজের প্রশ্ন মুছে ফেলতে চান +- যে প্রশ্নটি আপনি মুছে ফেলতে চান +- প্রশ্নটি কেন সরানো উচিত প্রয়োজনে তার ব্যাখ্যা diff --git a/public/content/translations/bn/contributing/translation-program/faq/index.md b/public/content/translations/bn/contributing/translation-program/faq/index.md new file mode 100644 index 00000000000..ffd9987478a --- /dev/null +++ b/public/content/translations/bn/contributing/translation-program/faq/index.md @@ -0,0 +1,119 @@ +--- +title: "অনুবাদ প্রোগ্রামের প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ)" +lang: bn +description: "ethereum.org অনুবাদ প্রোগ্রাম সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্ন" +--- + +# ethereum.org অনুবাদ করার নির্দেশিকা {#translating-ethereum-guide} + +আপনি যদি অনুবাদ প্রোগ্রামে নতুন হন এবং এতে যোগ দিতে দ্বিধা বোধ করেন, তাহলে এখানে কিছু প্রায়শই জিজ্ঞাসিত প্রশ্ন রয়েছে যা আপনাকে শুরু করতে সাহায্য করতে পারে। সবচেয়ে সাধারণ জিজ্ঞাসাগুলোর উত্তর খুঁজে পেতে এই নির্দেশিকাটি ব্যবহার করুন। + +## আমি কি ethereum.org অনুবাদ করার জন্য ক্ষতিপূরণ পেতে পারি? {#compensation} + +Ethereum.org একটি ওপেন-সোর্স ওয়েবসাইট, যার অর্থ যে কেউ এতে জড়িত হতে এবং অবদান রাখতে পারে। + +ethereum.org অনুবাদ প্রোগ্রামটি এরই একটি সম্প্রসারণ এবং এটি একই ধরনের দর্শনকে মাথায় রেখে সংগঠিত করা হয়েছে। + +অনুবাদ প্রোগ্রামের লক্ষ্য হল Ethereum কন্টেন্ট প্রত্যেকের কাছে সহজলভ্য করে তোলা, তারা যে ভাষাতেই কথা বলুক না কেন। এটি যেকোনো দ্বিভাষিক ব্যক্তিকে Ethereum ইকোসিস্টেমের সাথে জড়িত হতে এবং একটি সহজলভ্য উপায়ে অবদান রাখতে দেয়। + +এই কারণে, অনুবাদ প্রোগ্রামটি উন্মুক্ত এবং স্বেচ্ছামূলক, এবং অংশগ্রহণ ক্ষতিপূরণের সাপেক্ষে নয়। যদি আমরা অনুবাদকদের তাদের অনুবাদ করা শব্দের সংখ্যার জন্য ক্ষতিপূরণ দিতাম, তাহলে আমরা কেবল পর্যাপ্ত অনুবাদ অভিজ্ঞতাসম্পন্ন ব্যক্তিদের (পেশাদার অনুবাদক) অনুবাদ প্রোগ্রামে যোগদানের জন্য আমন্ত্রণ জানাতে পারতাম। এটি অনুবাদ প্রোগ্রামকে বর্জনমূলক করে তুলত এবং আমাদের উল্লিখিত লক্ষ্যে পৌঁছাতে বাধা দিত, বিশেষ করে: প্রত্যেককে ইকোসিস্টেমে অংশগ্রহণ এবং জড়িত হওয়ার সুযোগ করে দেওয়া। + +আমরা আমাদের অবদানকারীদের Ethereum ইকোসিস্টেমে সফল হতে সক্ষম করার জন্য সর্বাত্মক চেষ্টা করি; অনেক অ-আর্থিক প্রণোদনা রয়েছে যেমন: [POAP অফার করা](/contributing/translation-program/acknowledgements/#poap) এবং একটি [অনুবাদক সার্টিফিকেট](/contributing/translation-program/acknowledgements/#certificate), সেইসাথে [অনুবাদ লিডারবোর্ড](/contributing/translation-program/acknowledgements/) সংগঠিত করা এবং [সাইটে আমাদের সমস্ত অনুবাদকদের তালিকাভুক্ত করা](/contributing/translation-program/contributors/)। + +## আমি কিভাবে `` সহ স্ট্রিং অনুবাদ করব? {#tags} + +সব স্ট্রিং বিশুদ্ধ টেক্সট আকারে লেখা হয় না। এমন কিছু স্ট্রিং আছে যেগুলিতে HTML ট্যাগের (`<0>`, ``) মতো মিশ্র স্ক্রিপ্ট থাকে। এটি সাধারণত হাইপারলিঙ্ক বা বাক্যের মাঝখানে বিকল্প স্টাইলিংয়ের জন্য ব্যবহৃত হয়। + +- ট্যাগের ভিতরের টেক্সট অনুবাদ করুন কিন্তু ট্যাগগুলো নয়। `<` এবং `>` এর মধ্যে থাকা কোনো কিছুই অনুবাদ বা মুছে ফেলা যাবে না। +- স্ট্রিংটি নিরাপদ রাখতে, আমরা আপনাকে নীচের বাম দিকে থাকা "উৎস অনুলিপি করুন" বোতামে ক্লিক করার পরামর্শ দিই। এটি মূল স্ট্রিংটি কপি করে টেক্সট বক্সে পেস্ট করবে। এটি আপনাকে ট্যাগগুলি কোথায় আছে তা স্পষ্ট করতে দেয় এবং ভুল এড়াতে সাহায্য করে। + +![কপি সোর্স বোতাম হাইলাইট করা Crowdin ইন্টারফেস](./html-tag-strings.png) + +আপনার ভাষায় এটিকে আরও স্বাভাবিক করতে আপনি স্ট্রিংয়ের মধ্যে ট্যাগের অবস্থান সরাতে পারেন – শুধু নিশ্চিত করুন যে পুরো ট্যাগটি সরানো হয়েছে। + +ট্যাগ এবং কোড স্নিপেট নিয়ে কাজ করার বিষয়ে আরও বিস্তারিত তথ্যের জন্য, অনুগ্রহ করে [ethereum.org অনুবাদ স্টাইল গাইড](/contributing/translation-program/translators-guide/#dealing-with-tags) দেখুন। + +## স্ট্রিংগুলো কোথায় থাকে? {#strings} + +প্রায়শই শুধুমাত্র উৎস স্ট্রিং একটি সঠিক অনুবাদ প্রদানের জন্য আপনার জন্য যথেষ্ট নাও হতে পারে। + +- আরও তথ্যের জন্য "স্ক্রিনশট" এবং "প্রসঙ্গ" দেখুন। উৎস স্ট্রিং বিভাগে, আপনি সংযুক্ত স্ক্রিনশট চিত্রটি দেখতে পাবেন যা আপনাকে দেখাবে আমরা কীভাবে স্ট্রিংটি প্রসঙ্গে ব্যবহার করছি। +- আপনি যদি এখনও অনিশ্চিত হন, তাহলে "মন্তব্য বিভাগে" একটি ফ্ল্যাগ তুলুন। [কীভাবে মন্তব্য করতে হয় তা নিশ্চিত নন?](#comment) + +![একটি স্ক্রিনশটের মাধ্যমে একটি স্ট্রিংয়ের জন্য কীভাবে প্রসঙ্গ সরবরাহ করা যেতে পারে তা দেখানো হচ্ছে](./source-string.png) + +![প্রসঙ্গের জন্য যোগ করা একটি উদাহরণ স্ক্রিনশট](./source-string-2.png) + +## আমি কীভাবে মন্তব্য করতে বা প্রশ্ন জিজ্ঞাসা করতে পারি? আমি একটি সমস্যা বা টাইপো ফ্ল্যাগ করতে চাই... {#comment} + +আপনি যদি কোনো নির্দিষ্ট স্ট্রিংয়ে একটি ফ্ল্যাগ তুলতে চান যার মনোযোগ প্রয়োজন, তাহলে নির্দ্বিধায় একটি মন্তব্য জমা দিন। + +- উপরের-ডানদিকের বারের দ্বিতীয় বোতামে ক্লিক করুন। লুকানো ট্যাবটি আপনার ডানদিকে প্রদর্শিত হবে। একটি নতুন মন্তব্য করুন এবং নীচে "সমস্যা" চেকবক্সে ক্লিক করুন। ড্রপ-ডাউন মেনু থেকে একটি বিকল্প বেছে নিয়ে আপনি সমস্যার ধরন নির্দিষ্ট করতে পারেন। +- জমা দেওয়ার পরে, এটি আমাদের দলকে জানানো হবে। আমরা সমস্যাটি সমাধান করব এবং আপনার মন্তব্যের উত্তর দিয়ে এবং সমস্যাটি বন্ধ করে আপনাকে জানাব। +- আপনি যদি একটি ভুল অনুবাদ রিপোর্ট করেন, তাহলে পরবর্তী পর্যালোচনার সময় একজন নেটিভ স্পিকার দ্বারা অনুবাদ এবং আপনার প্রস্তাবিত বিকল্পটি পর্যালোচনা করা হবে। + +![কীভাবে মন্তব্য এবং সমস্যা তৈরি করতে হয় তা দেখানো হচ্ছে](./comment-issue.png) + +## অনুবাদ মেমরি (TM) কী? {#translation-memory} + +অনুবাদ মেমরি (TM) হল Crowdin-এর একটি বৈশিষ্ট্য যা ethereum.org জুড়ে পূর্বে অনুবাদ করা সমস্ত স্ট্রিং সংরক্ষণ করে। যখন একটি স্ট্রিং অনুবাদ করা হয়, তখন এটি স্বয়ংক্রিয়ভাবে আমাদের প্রোজেক্ট TM-এ সংরক্ষিত হয়। এটি আপনার সময় বাঁচাতে সাহায্য করার জন্য একটি দরকারী টুল হতে পারে! + +- "TM and MT Suggestions" বিভাগটি দেখুন এবং আপনি দেখতে পাবেন কিভাবে অন্যান্য অনুবাদকরা একই বা অনুরূপ স্ট্রিং অনুবাদ করেছেন। আপনি যদি উচ্চ ম্যাচিং রেট সহ একটি পরামর্শ খুঁজে পান, তাহলে নির্দ্বিধায় সেটিতে ক্লিক করে অনুবাদটি ব্যবহার করুন। +- তালিকায় কিছু না থাকলে, আপনি পূর্বে করা অনুবাদের জন্য TM-এ অনুসন্ধান করতে পারেন এবং সামঞ্জস্যের জন্য সেগুলি পুনরায় ব্যবহার করতে পারেন। + +![অনুবাদ মেমরির একটি স্ক্রিনশট](./translation-memory.png) + +## আমি কীভাবে Crowdin শব্দকোষ ব্যবহার করব? {#glossary} + +Ethereum পরিভাষা আমাদের অনুবাদ কাজের আরেকটি গুরুত্বপূর্ণ অংশ কারণ প্রায়শই নতুন প্রযুক্তিগত শব্দগুলি এখনও অনেক ভাষায় স্থানীয়করণ করা হয়নি। এছাড়াও, এমন কিছু শব্দ আছে যেগুলির বিভিন্ন প্রসঙ্গে বিভিন্ন অর্থ রয়েছে। [Ethereum পরিভাষা অনুবাদ করার বিষয়ে আরও জানুন](#terminology) + +Crowdin শব্দকোষ হল শব্দ এবং সংজ্ঞার স্পষ্টীকরণের জন্য সেরা জায়গা। শব্দকোষ দেখার দুটি উপায় আছে। + +- প্রথমত, আপনি যখন উৎস স্ট্রিংয়ে একটি আন্ডারলাইন করা শব্দ খুঁজে পান, তখন আপনি মাউসওভার করে তার একটি সংক্ষিপ্ত সংজ্ঞা দেখতে পারেন। + +![একটি উদাহরণ শব্দকোষ সংজ্ঞা](./glossary-definition.png) + +- দ্বিতীয়ত, যদি আপনি এমন একটি শব্দ দেখেন যা আপনার কাছে পরিচিত নয় কিন্তু আন্ডারলাইন করা নেই, আপনি শব্দকোষ ট্যাবে (ডান কলামের তৃতীয় বোতাম) অনুসন্ধান করতে পারেন। আপনি প্রোজেক্টে প্রায়শই ব্যবহৃত নির্দিষ্ট শব্দ এবং শব্দগুলোর ব্যাখ্যা খুঁজে পাবেন। + +![Crowdin-এ শব্দকোষ ট্যাব কোথায় পাওয়া যাবে তা দেখানো একটি স্ক্রিনশট](./glossary-tab.png) + +- আপনি যদি এখনও এটি খুঁজে না পান, তবে এটি একটি নতুন শব্দ যোগ করার আপনার সুযোগ! আমরা আপনাকে এটি একটি সার্চ ইঞ্জিনে খুঁজে দেখতে এবং শব্দকোষে এর বর্ণনা যোগ করতে উৎসাহিত করি। এটি অন্যান্য অনুবাদকদের শব্দটি আরও ভালভাবে বুঝতে অনেক সাহায্য করবে। + +![Crowdin-এ কীভাবে একটি শব্দকোষ পদ যোগ করতে হয় তা দেখানো একটি স্ক্রিনশট](./add-glossary-term.png) + +### পরিভাষা অনুবাদ নীতি {#terminology} + +_নাম (ব্র্যান্ড, কোম্পানি, ব্যক্তি) এবং নতুন প্রযুক্তিগত শব্দ (বিকন চেইন, শার্ড চেইন, ইত্যাদি) এর জন্য_ + +Ethereum অনেক নতুন শব্দ উপস্থাপন করে যা সম্প্রতি তৈরি করা হয়েছে। কিছু শব্দ অনুবাদক ভেদে ভিন্ন হবে কারণ তাদের নিজ নিজ ভাষায় কোনো অফিসিয়াল অনুবাদ নেই। এই ধরনের অসামঞ্জস্যতা ভুল বোঝাবুঝির কারণ হতে পারে এবং পাঠযোগ্যতা হ্রাস করতে পারে। + +ভাষাগত বৈচিত্র্য এবং প্রতিটি ভাষায় বিভিন্ন মানদণ্ডের কারণে, একটি একীভূত পরিভাষা অনুবাদ নীতি তৈরি করা প্রায় অসম্ভব যা সমস্ত সমর্থিত ভাষায় অভিযোজিত হতে পারে। + +সতর্ক বিবেচনার পর, আমরা সবচেয়ে বেশি ব্যবহৃত পরিভাষা আপনাদের, অর্থাৎ অনুবাদকদের উপর ছেড়ে দেওয়ার সিদ্ধান্ত নিয়েছি। + +আপনি যখন আপনার কাছে অপরিচিত কোনো শব্দ খুঁজে পান, তখন আমরা যা পরামর্শ দিই তা হল: + +- [শব্দের শব্দকোষ](#glossary) দেখুন, আপনি খুঁজে পেতে পারেন কিভাবে অন্যান্য অনুবাদকরা আগে এটি অনুবাদ করেছেন। যদি আপনি মনে করেন যে পূর্বে অনুবাদ করা শব্দটি উপযুক্ত নয়, তাহলে Crowdin শব্দকোষে একটি নতুন শব্দ যোগ করে আপনার অনুবাদটি নির্দ্বিধায় পুনঃস্থাপন করুন। +- যদি শব্দকোষে এই ধরনের পূর্ববর্তী কোনো অনুবাদ না থাকে, আমরা আপনাকে এটি একটি সার্চ ইঞ্জিন বা মিডিয়া আর্টিকেলে খুঁজে দেখতে উৎসাহিত করি যা দেখায় যে শব্দটি আপনার কমিউনিটিতে আসলে কীভাবে ব্যবহৃত হয়। +- আপনি যদি কোনো রেফারেন্স খুঁজে না পান, তাহলে নির্দ্বিধায় আপনার স্বজ্ঞার উপর বিশ্বাস রাখুন এবং আপনার ভাষায় একটি নতুন অনুবাদের পরামর্শ দিন! +- যদি আপনি এটি করতে কম আত্মবিশ্বাসী বোধ করেন, তাহলে শব্দটি অনূদিত রেখে দিন। কখনো কখনো, ইংরেজি শব্দগুলি সঠিক সংজ্ঞা প্রদানে যথেষ্টর চেয়েও বেশি। + +আমরা আপনাকে ব্র্যান্ড, কোম্পানি এবং কর্মীদের নাম অনূদিত রাখার পরামর্শ দিই কারণ একটি অনুবাদ অপ্রয়োজনীয় বিভ্রান্তি এবং এসইও অসুবিধার কারণ হতে পারে। + +## পর্যালোচনা প্রক্রিয়া কিভাবে কাজ করে? {#review-process} + +আমাদের অনুবাদে একটি নির্দিষ্ট স্তরের গুণমান এবং সামঞ্জস্যতা নিশ্চিত করতে, আমরা বিশ্বব্যাপী বৃহত্তম ভাষা পরিষেবা প্রদানকারীদের মধ্যে অন্যতম [Acolad](https://www.acolad.com/)-এর সাথে কাজ করি। Acolad-এর 20,000 পেশাদার ভাষাবিদ রয়েছে, যার মানে হল তারা আমাদের প্রয়োজনীয় প্রতিটি ভাষা এবং ধরনের কন্টেন্টের জন্য পেশাদার পর্যালোচক সরবরাহ করতে পারে। + +পর্যালোচনা প্রক্রিয়াটি সহজবোধ্য; একবার কন্টেন্টের একটি সেট 100% অনূদিত হয়ে গেলে, আমরা সেই কন্টেন্ট বাকেটের জন্য একটি পর্যালোচনার অর্ডার দিই। পর্যালোচনা প্রক্রিয়া সরাসরি Crowdin-এ সঞ্চালিত হয়। পর্যালোচনা সম্পন্ন হলে, আমরা অনূদিত কন্টেন্ট দিয়ে ওয়েবসাইটটি আপডেট করি। + +## আমি কিভাবে আমার ভাষায় কন্টেন্ট যোগ করব? {#adding-foreign-language-content} + +বর্তমানে, সমস্ত অ-ইংরেজি কন্টেন্ট সরাসরি ইংরেজি উৎস কন্টেন্ট থেকে অনুবাদ করা হয়, এবং ইংরেজিতে বিদ্যমান নেই এমন কোনো কন্টেন্ট অন্য ভাষায় যোগ করা যাবে না। + +ethereum.org-এর জন্য নতুন কন্টেন্টের পরামর্শ দিতে, আপনি GitHub-এ [একটি সমস্যা তৈরি করতে পারেন](https://github.com/ethereum/ethereum-org-website/issues)। যোগ করা হলে, কন্টেন্টটি ইংরেজিতে লেখা হবে এবং Crowdin ব্যবহার করে অন্যান্য ভাষায় অনুবাদ করা হবে। + +আমরা অদূর ভবিষ্যতে অ-ইংরেজি কন্টেন্ট যোগ করার জন্য সমর্থন যোগ করার পরিকল্পনা করছি। + +## যোগাযোগ করুন {#contact} + +এই সব পড়ার জন্য আপনাকে ধন্যবাদ। আমরা আশা করি এটি আপনাকে আমাদের প্রোগ্রামে অনবোর্ড হতে সাহায্য করবে। প্রশ্ন জিজ্ঞাসা করতে এবং অন্যান্য অনুবাদকদের সাথে সহযোগিতা করতে আমাদের [ডিসকর্ড অনুবাদ চ্যানেলে](https://discord.gg/ethereum-org) নির্দ্বিধায় যোগ দিন, অথবা translations@ethereum.org-এ আমাদের সাথে যোগাযোগ করুন! diff --git a/public/content/translations/bn/contributing/translation-program/how-to-translate/index.md b/public/content/translations/bn/contributing/translation-program/how-to-translate/index.md new file mode 100644 index 00000000000..bdad6162feb --- /dev/null +++ b/public/content/translations/bn/contributing/translation-program/how-to-translate/index.md @@ -0,0 +1,92 @@ +--- +title: "কীভাবে অনুবাদ করবেন" +lang: bn +description: "ethereum.org অনুবাদ করার জন্য Crowdin ব্যবহার করার নির্দেশাবলী" +--- + +# কীভাবে অনুবাদ করবেন {#how-to-translate} + +## ভিজ্যুয়াল গাইড {#visual-guide} + +যারা দেখে শিখতে বেশি পছন্দ করেন, তারা লুকাকে অনুসরণ করে Crowdin-এর সাথে সেট আপ করার প্রক্রিয়াটি দেখতে পারেন। অন্যথায়, আপনি পরবর্তী বিভাগে লিখিত বিন্যাসে একই পদক্ষেপগুলি খুঁজে পেতে পারেন। + + + +## লিখিত গাইড {#written-guide} + +### Crowdin-এ আমাদের প্রোজেক্টে যোগ দিন {#join-project} + +আপনার Crowdin অ্যাকাউন্টে লগ ইন করতে হবে বা আপনার যদি আগে থেকে অ্যাকাউন্ট না থাকে তাহলে সাইন আপ করতে হবে। সাইন আপ করার জন্য শুধুমাত্র একটি ই-মেইল অ্যাকাউন্ট এবং পাসওয়ার্ড প্রয়োজন। + + + প্রোজেক্টে যোগ দিন + + +### আপনার ভাষা খুলুন {#open-language} + +Crowdin-এ লগ ইন করার পরে, আপনি একটি প্রোজেক্টের বিবরণ এবং সমস্ত উপলব্ধ ভাষার তালিকা দেখতে পাবেন। +প্রতিটি ভাষাতে অনুবাদযোগ্য মোট শব্দের পরিমাণ সম্পর্কে তথ্য এবং একটি নির্দিষ্ট ভাষায় কতটা বিষয়বস্তু অনুবাদ ও অনুমোদিত হয়েছে তার একটি সংক্ষিপ্ত বিবরণও থাকে। + +আপনি যে ভাষায় অনুবাদ করতে চান সেটি খুলুন এবং অনুবাদের জন্য উপলব্ধ ফাইলগুলির তালিকা দেখুন। + +![Crowdin-এ ভাষার তালিকা](./list-of-languages.png) + +### কাজ করার জন্য একটি ডকুমেন্ট খুঁজুন {#find-document} + +ওয়েবসাইটের বিষয়বস্তু বেশ কয়েকটি ডকুমেন্ট এবং কন্টেন্ট বাকেটে বিভক্ত। আপনি ডানদিকে প্রতিটি ডকুমেন্টের অগ্রগতি দেখতে পারেন – যদি অনুবাদের অগ্রগতি 100% এর কম হয়, অনুগ্রহ করে অবদান রাখুন! + +আপনার ভাষা তালিকাভুক্ত দেখতে পাচ্ছেন না? [একটি সমস্যা খুলুন](https://github.com/ethereum/ethereum-org-website/issues/new/choose) অথবা আমাদের [Discord](https://discord.gg/ethereum-org)-এ জিজ্ঞাসা করুন + +![Crowdin-এ অনুবাদিত এবং অননূদিত ফাইল](./crowdin-files.png) + +কন্টেন্ট বাকেটগুলির উপর একটি নোট: আমরা Crowdin-এর মধ্যে 'কন্টেন্ট বাকেট' ব্যবহার করি যাতে সর্বোচ্চ অগ্রাধিকারের কন্টেন্ট প্রথমে প্রকাশ করা যায়। আপনি যখন একটি ভাষা দেখেন, উদাহরণস্বরূপ, [ফিলিপিনো](https://crowdin.com/project/ethereum-org/fil#) আপনি কন্টেন্ট বাকেটের জন্য ফোল্ডার দেখতে পাবেন ("1. মূলপাতা", "2. অপরিহার্য", "3. অনুসন্ধান", ইত্যাদি)। + +আমরা আপনাকে এই সাংখ্যিক ক্রমে (1 → 2 → 3 → ⋯) অনুবাদ করতে উৎসাহিত করি যাতে সর্বোচ্চ প্রভাবসম্পন্ন পৃষ্ঠাগুলি প্রথমে অনুবাদ করা হয়। + +### অনুবাদ করুন {#translate} + +আপনি যে ফাইলটি অনুবাদ করতে চান সেটি নির্বাচন করার পরে, এটি অনলাইন এডিটরে খুলবে। আপনি যদি আগে কখনও Crowdin ব্যবহার না করে থাকেন, তাহলে আপনি প্রাথমিক বিষয়গুলি জানতে এই দ্রুত গাইডটি ব্যবহার করতে পারেন। + +![Crowdin অনলাইন এডিটর](./online-editor.png) + +**_১ – বাম সাইডবার_** + +- অননূদিত (লাল) – যে টেক্সটে এখনও কাজ করা হয়নি। এইগুলি সেই স্ট্রিং যা আপনার অনুবাদ করা উচিত। +- অনূদিত (সবুজ) – যে টেক্সট ইতিমধ্যে অনুবাদ করা হয়েছে, কিন্তু এখনও পর্যালোচনা করা হয়নি। আপনি বিকল্প অনুবাদের পরামর্শ দিতে পারেন, অথবা এডিটরে ''+'' এবং ''-'' বোতাম ব্যবহার করে বিদ্যমান অনুবাদগুলির উপর ভোট দিতে পারেন। +- অনুমোদিত (চেক মার্ক) – যে টেক্সট ইতিমধ্যে পর্যালোচনা করা হয়েছে এবং বর্তমানে ওয়েবসাইটে লাইভ আছে। + +আপনি নির্দিষ্ট স্ট্রিং খোঁজার জন্য, স্ট্যাটাস অনুযায়ী ফিল্টার করতে বা ভিউ পরিবর্তন করতে উপরের বোতামগুলিও ব্যবহার করতে পারেন। + +**_২ – এডিটর এলাকা_** + +প্রধান অনুবাদ এলাকা – সোর্স টেক্সট উপরে প্রদর্শিত হয়, সাথে অতিরিক্ত কনটেক্সট এবং স্ক্রিনশট, যদি উপলব্ধ থাকে। +একটি নতুন অনুবাদের পরামর্শ দিতে, ''এখানে অনুবাদ লিখুন'' ফিল্ডে আপনার অনুবাদ লিখুন এবং সেভ ক্লিক করুন। + +আপনি এই বিভাগে স্ট্রিংটির বিদ্যমান অনুবাদ এবং অন্যান্য ভাষায় অনুবাদও খুঁজে পেতে পারেন, সেইসাথে ট্রান্সলেশন মেমরি ম্যাচ এবং মেশিন অনুবাদের পরামর্শও পেতে পারেন। + +**_৩ – ডান সাইডবার_** + +এখানে আপনি মন্তব্য, ট্রান্সলেশন মেমরি এন্ট্রি এবং শব্দকোষ এন্ট্রি খুঁজে পেতে পারেন। ডিফল্ট ভিউতে মন্তব্যগুলি দেখানো হয় এবং অনুবাদকদের যোগাযোগ করতে, সমস্যা উত্থাপন করতে বা ভুল অনুবাদ রিপোর্ট করার সুযোগ দেয়। + +উপরের বোতামগুলি ব্যবহার করে, আপনি ট্রান্সলেশন মেমরিতেও যেতে পারেন, যেখানে আপনি বিদ্যমান অনুবাদগুলি অনুসন্ধান করতে পারেন, অথবা শব্দকোষে যেতে পারেন, যেখানে মূল শব্দগুলির বিবরণ এবং আদর্শ অনুবাদ রয়েছে। + +আরো জানতে চান? [Crowdin অনলাইন এডিটর ব্যবহারের ডকুমেন্টেশন](https://support.crowdin.com/online-editor/) দেখতে পারেন + +### পর্যালোচনা প্রক্রিয়া {#review-process} + +আপনি অনুবাদ সম্পূর্ণ করার পরে (অর্থাৎ, একটি কন্টেন্ট বাকেটের জন্য সমস্ত ফাইল 100% প্রদর্শন করে), আমাদের পেশাদার অনুবাদ পরিষেবা কন্টেন্টটি পর্যালোচনা করবে (এবং সম্ভবত সম্পাদনা করবে)। পর্যালোচনা সম্পূর্ণ হয়ে গেলে (অর্থাৎ, পর্যালোচনার অগ্রগতি 100%), আমরা এটি ওয়েবসাইটে যোগ করব। + + + + + প্রোজেক্টটি অনুবাদ করতে দয়া করে মেশিন অনুবাদ ব্যবহার করবেন না। ওয়েবসাইটে যোগ করার আগে সমস্ত অনুবাদ পর্যালোচনা করা হবে। যদি আপনার প্রস্তাবিত অনুবাদগুলি মেশিন-অনূদিত বলে প্রমাণিত হয়, তবে সেগুলি বাতিল করা হবে এবং যে সমস্ত অবদানকারী প্রায়শই মেশিন অনুবাদ ব্যবহার করেন তাদের প্রোজেক্ট থেকে সরিয়ে দেওয়া হবে। + + + +### যোগাযোগ করুন {#get-in-touch} + +আপনার কি কোনো প্রশ্ন আছে? অথবা আমাদের টিম এবং অন্যান্য অনুবাদকদের সাথে সহযোগিতা করতে চান? অনুগ্রহ করে আমাদের [ethereum.org Discord সার্ভার](https://discord.gg/ethereum-org)-এর #translations চ্যানেলে পোস্ট করুন + +আপনি translations@ethereum.org-এও আমাদের সাথে যোগাযোগ করতে পারেন + +ethereum.org অনুবাদ প্রোগ্রামে আপনার অংশগ্রহণের জন্য ধন্যবাদ! diff --git a/public/content/translations/bn/contributing/translation-program/index.md b/public/content/translations/bn/contributing/translation-program/index.md new file mode 100644 index 00000000000..3f059bd6ddd --- /dev/null +++ b/public/content/translations/bn/contributing/translation-program/index.md @@ -0,0 +1,91 @@ +--- +title: "অনুবাদ কর্মসূচি" +lang: bn +description: "ethereum.org অনুবাদ প্রোগ্রাম সম্পর্কিত তথ্য" +--- + +# অনুবাদ প্রোগ্রাম {#translation-program} + +অনুবাদ প্রোগ্রামটি হলো একটি সম্মিলিত প্রচেষ্টা যার মাধ্যমে ethereum.org-কে বিভিন্ন ভাষায় অনুবাদ করা হয়, যাতে বিশ্বজুড়ে কোটি কোটি অ-ইংরেজিভাষী মানুষের কাছে ওয়েবসাইটটি আরও সহজলভ্য হয়ে ওঠে। + +![](./enterprise-eth.png) + +## আমাদের অনুবাদ করতে সাহায্য করুন {#help-us-translate} + +ethereum.org অনুবাদ প্রোগ্রামটি উন্মুক্ত এবং যে কেউ অবদান রাখতে পারে! + +1. আপনাকে আপনার Crowdin অ্যাকাউন্টে লগ ইন করতে হবে বা সাইন আপ করতে হবে। +2. আপনি যে ভাষায় অবদান রাখতে চান তা নির্বাচন করুন। +3. শুরু করার আগে, Crowdin কীভাবে ব্যবহার করতে হয় তা শিখতে অনুগ্রহ করে [কীভাবে অনুবাদ করবেন](/contributing/translation-program/how-to-translate/) গাইডটি এবং টিপস ও সেরা অনুশীলনের জন্য [অনুবাদ শৈলী নির্দেশিকা](/contributing/translation-program/translators-guide/) দেখুন। +4. মেশিনের মাধ্যমে করা অনুবাদ অনুমোদিত হবে না। +5. সমস্ত অনুবাদ সাইটে যুক্ত করার আগে পর্যালোচনা করা হয়, তাই আপনার অনুবাদ লাইভ হতে কিছুটা দেরি হবে। + +_অনুবাদে সহযোগিতা করতে, প্রশ্ন জিজ্ঞাসা করতে, মতামত ও ধারণা শেয়ার করতে, বা একটি অনুবাদ গ্রুপে যোগ দিতে [ethereum.org Discord](https://discord.gg/ethereum-org)-এ যোগ দিন।_ + + + অনুবাদ শুরু করুন + + +## অনুবাদ প্রোগ্রাম সম্পর্কে {#about-us} + +Ethereum কমিউনিটি বিশ্বব্যাপী ও অন্তর্ভুক্তিমূলক হতে চায়, তবুও এর বেশিরভাগ কন্টেন্ট শুধুমাত্র ইংরেজিভাষীদের জন্য তৈরি, যা বিশ্বের 6 বিলিয়ন অ-ইংরেজিভাষীকে বাইরে রাখে। বিশ্বব্যাপী কমিউনিটির জন্য Ethereum-এর প্রবেশদ্বার হিসেবে কাজ করতে ethereum.org-এর জন্য, আমরা বিশ্বাস করি যে অ-ইংরেজিভাষীদের তাদের মাতৃভাষায় Ethereum কন্টেন্ট সরবরাহ করা অপরিহার্য। + +ethereum.org অনুবাদ প্রোগ্রামের লক্ষ্য হলো ethereum.org এবং অন্যান্য Ethereum কন্টেন্টকে যত বেশি সম্ভব ভাষায় অনুবাদ করে Ethereum-কে সকলের কাছে সহজলভ্য করে তোলা। + +ethereum.org অনুবাদ প্রোগ্রামের [মিশন এবং ভিশন](/contributing/translation-program/mission-and-vision) সম্পর্কে আরও পড়ুন। + +### এখন পর্যন্ত আমাদের অগ্রগতি {#our-progress} + +- [**6,900 +** অনুবাদক](/contributing/translation-program/contributors/) +- সাইটে **68** টি ভাষা লাইভ আছে +- [2024 সালে **2.89 মিলিয়ন** শব্দ অনূদিত হয়েছে](/contributing/translation-program/acknowledgements/) + + + +### স্বীকৃতি {#acknowledgements} + +Ethereum.org হাজার হাজার কমিউনিটি সদস্য দ্বারা অনূদিত হয় এবং তারা অনুবাদ প্রোগ্রামের মূল অংশ। +আমরা আমাদের অনুবাদকদের স্বীকৃতি দিতে এবং তাদের ক্যারিয়ারের পথে সমর্থন করতে চাই। এখানে আমাদের অনুবাদকদের জন্য কিছু স্বীকৃতি রয়েছে: + +#### সার্টিফিকেট {#certificate} + +আপনি যদি অনুবাদ প্রোগ্রামে অবদান রেখে থাকেন এবং আপনার অনুবাদ করা কমপক্ষে 5,000 শব্দ অনুমোদিত হয়ে থাকে, তাহলে আপনি একটি ethereum.org অনুবাদক সার্টিফিকেটের জন্য যোগ্য। [সার্টিফিকেট সম্পর্কে আরও জানুন](/contributing/translation-program/acknowledgements/#certificate) + +#### OATs {#oats} + +অনুবাদ প্রোগ্রামের অবদানকারীরা 2024 সালে তাদের অনুবাদ করা শব্দের সংখ্যার উপর ভিত্তি করে বিভিন্ন OAT (অনচেইন অ্যাচিভমেন্ট টোকেন)-এর জন্য যোগ্য। OATs হলো NFT যা ethereum.org অনুবাদ প্রোগ্রামে আপনার অবদান প্রমাণ করে। [OATs সম্পর্কে আরও জানুন](/contributing/translation-program/acknowledgements/#oats) + +#### অনুবাদকদের স্বীকৃতি {#translator-acknowledgements} + +[লিডারবোর্ড](/contributing/translation-program/acknowledgements/) এবং [অনুবাদ প্রোগ্রামের সমস্ত অবদানকারীদের একটি তালিকা](/contributing/translation-program/contributors/) ব্যবহার করে আমাদের শীর্ষ অনুবাদকদের জন্য সর্বজনীন স্বীকৃতি। + +#### পুরস্কার {#rewards} + +অতীতে, আমরা আমাদের সবচেয়ে সক্রিয় অবদানকারীদের পূর্ববর্তী কাজের জন্য [Devcon](https://devcon.org/en/) এবং [Devconnect](https://devconnect.org/)-এর মতো Ethereum কনফারেন্সের টিকিট, সেইসাথে বিশেষ ethereum.org মার্চেন্ডাইজ দিয়ে পুরস্কৃত করেছি। + +আমরা আমাদের অবদানকারীদের পুরস্কৃত করার জন্য ক্রমাগত নতুন এবং উদ্ভাবনী উপায় নিয়ে ভাবছি, তাই সাথে থাকুন! + +### গাইড এবং রিসোর্স {#guides-and-resources} + +আপনি যদি অনুবাদ প্রোগ্রামে অবদান রাখেন বা এতে জড়িত হওয়ার কথা ভাবেন, তবে আপনার নীচের অনুবাদ গাইডগুলো দেখা উচিত: + +- [অনুবাদ শৈলী নির্দেশিকা](/contributing/translation-program/translators-guide/) _– ethereum.org অনুবাদকদের জন্য নির্দেশাবলী এবং টিপস_ +- [অনুবাদ সংক্রান্ত প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী (FAQs)](/contributing/translation-program/faq/) _– ethereum.org অনুবাদ প্রোগ্রাম সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্ন এবং উত্তর_ +- [Crowdin অনলাইন এডিটর গাইড](https://support.crowdin.com/online-editor/) _– Crowdin অনলাইন এডিটর ব্যবহার এবং Crowdin-এর কিছু উন্নত বৈশিষ্ট্য ব্যবহারের একটি গভীর নির্দেশিকা_ + +অন্যান্য দরকারী অনুবাদ টুল, অনুবাদক কমিউনিটি এবং অনুবাদ প্রোগ্রামের ব্লগ পোস্টের জন্য, অনুগ্রহ করে [রিসোর্স পেজ](/contributing/translation-program/resources/) দেখুন। + +## যোগাযোগ করুন {#get-in-touch} + +আপনার কি কোনো প্রশ্ন আছে? অথবা আমাদের টিম এবং অন্যান্য অনুবাদকদের সাথে সহযোগিতা করতে চান? অনুগ্রহ করে আমাদের [ethereum.org Discord সার্ভার](https://discord.gg/ethereum-org)-এর #translations চ্যানেলে পোস্ট করুন + +আপনি translations@ethereum.org-এও আমাদের সাথে যোগাযোগ করতে পারেন + +## আপনার নিজের অনুবাদ প্রোগ্রাম শুরু করা {#starting-a-translation-program} + +আমরা Ethereum কন্টেন্টকে যত বেশি সম্ভব ভাষায় অনুবাদ করতে এবং শিক্ষামূলক কন্টেন্ট সকলের জন্য উপলব্ধ করতে নিবেদিত। +অনুবাদের উপর আমাদের ফোকাসের সাথে সঙ্গতি রেখে, আমরা অন্যান্য Ethereum প্রজেক্টকে তাদের নিজস্ব অনুবাদ প্রচেষ্টা সংগঠিত, পরিচালনা এবং উন্নত করতে সাহায্য করতে চাই। + +এই কারণে, আমরা একটি [অনুবাদ প্রোগ্রাম প্লেবুক](/contributing/translation-program/playbook/) তৈরি করেছি যাতে ethereum.org অনুবাদ করার প্রক্রিয়াতে আমাদের শেখা কিছু টিপস এবং সেরা অনুশীলন রয়েছে। + +আরও সহযোগিতা করতে চান বা আমাদের কিছু অনুবাদ রিসোর্স ব্যবহার করতে চান? প্লেবুকটির উপর কোনো মতামত আছে? আমরা translations@ethereum.org-এ আপনার মতামত শুনতে আগ্রহী। diff --git a/public/content/translations/bn/contributing/translation-program/mission-and-vision/index.md b/public/content/translations/bn/contributing/translation-program/mission-and-vision/index.md new file mode 100644 index 00000000000..a6d6b56c8fd --- /dev/null +++ b/public/content/translations/bn/contributing/translation-program/mission-and-vision/index.md @@ -0,0 +1,25 @@ +--- +title: "মিশন এবং ভিশন" +lang: bn +description: "ethereum.org অনুবাদ প্রোগ্রামের মিশন এবং ভিশন" +--- + +# মিশন এবং ভিশন {#mission-and-vision} + +Ethereum কমিউনিটি বিশ্বব্যাপী ও অন্তর্ভুক্তিমূলক হতে চায়, তবুও এর বেশিরভাগ কন্টেন্ট শুধুমাত্র ইংরেজিভাষীদের জন্য তৈরি, যা বিশ্বের 6 বিলিয়ন অ-ইংরেজিভাষীকে বাইরে রাখে। বিশ্বব্যাপী কমিউনিটির জন্য Ethereum-এর প্রবেশদ্বার হিসেবে কাজ করতে ethereum.org-এর জন্য, আমরা বিশ্বাস করি যে অ-ইংরেজিভাষীদের তাদের মাতৃভাষায় Ethereum কন্টেন্ট সরবরাহ করা অপরিহার্য। + +ethereum.org অনুবাদ প্রোগ্রামের লক্ষ্য হলো ethereum.org এবং অন্যান্য Ethereum কন্টেন্টকে যত বেশি সম্ভব ভাষায় অনুবাদ করে Ethereum-কে সকলের কাছে সহজলভ্য করে তোলা। + +## আমাদের মিশন {#our-mission} + +- সারা বিশ্বের দর্শকদের তাদের মাতৃভাষায় ইথেরিয়াম সম্পর্কে জানতে সক্ষম করতে ওয়েবসাইটের অনুবাদিত সংস্করণ সরবরাহ করা +- বিশ্বব্যাপী ইথেরিয়াম কমিউনিটিতে আরও সদস্যদের যোগদান সহজতর করা +- ইথেরিয়াম-এর তথ্য এবং জ্ঞান আরও সহজলভ্য এবং অন্তর্ভুক্তিমূলকভাবে শেয়ার করার সুযোগ করে দেওয়া +- কমিউনিটির সদস্যদের ইথেরিয়াম-এ অনুবাদে অবদান রাখতে এবং ইকোসিস্টেমে তাদের ছাপ রাখতে সক্ষম করা +- ইকোসিস্টেমের সাথে জড়িত হতে আগ্রহী এমন উৎসাহী অবদানকারীদের শনাক্ত করা, তাদের সাথে সংযোগ স্থাপন করা এবং তাদের নির্দেশিকা প্রদান করা + +## আমাদের ভিশন {#our-vision} + +- যতটা সম্ভব বেশি সংখ্যক দেশ এবং বিশ্বের বিভিন্ন প্রান্তের ইথেরিয়াম কমিউনিটির সদস্যদের জন্য অপরিহার্য বিষয়বস্তু অনুবাদ করা +- একটি আরও বেশি অবগত এবং শিক্ষিত ইথেরিয়াম কমিউনিটি তৈরি করতে বিভিন্ন ভাষার মধ্যে জ্ঞান আদান-প্রদানে সহায়তা করা +- অ-ইংরেজিভাষীদের ইকোসিস্টেমে যোগদানে বাধা সৃষ্টিকারী ভাষার প্রতিবন্ধকতা দূর করে ইথেরিয়াম-এর অন্তর্ভুক্তি এবং সহজলভ্যতা বৃদ্ধি করা diff --git a/public/content/translations/bn/contributing/translation-program/playbook/index.md b/public/content/translations/bn/contributing/translation-program/playbook/index.md new file mode 100644 index 00000000000..2213cce2463 --- /dev/null +++ b/public/content/translations/bn/contributing/translation-program/playbook/index.md @@ -0,0 +1,317 @@ +--- +title: "অনুবাদ প্রোগ্রাম প্লেবুক" +lang: bn +description: "একটি অনুবাদ প্রোগ্রাম স্থাপন করার জন্য টিপস এবং গুরুত্বপূর্ণ বিবেচনার একটি সংগ্রহ" +--- + +# অনুবাদ প্রোগ্রাম প্লেবুক {#translation-program-playbook} + +ইংরেজি বিশ্বের অন্যতম কথ্য ভাষা এবং এখন পর্যন্ত বিশ্বের সবচেয়ে বেশি চর্চিত ভাষা। যেহেতু ইন্টারনেট – বিশেষ করে সোশ্যাল মিডিয়াতে – ইংরেজি সবচেয়ে সাধারণ ব্যবহৃত ভাষা এবং বহুভাষিক প্রোগ্রামিং ভাষা বিরল, তাই ব্লকচেইন জগতের বেশিরভাগ বিষয়বস্তু স্বাভাবিকভাবেই ইংরেজিতে লেখা হয়। + +তবে, বিশ্বের 6 বিলিয়নেরও বেশি মানুষ (জনসংখ্যার 75%-এরও বেশি) আদৌ ইংরেজি বলতে পারেন না, এটি বিশ্বের বিশাল সংখ্যাগরিষ্ঠ জনসংখ্যার জন্য Ethereum-এ প্রবেশের ক্ষেত্রে একটি বড় বাধা তৈরি করে। + +এই কারণে, এই জগতের ক্রমবর্ধমান সংখ্যক প্রকল্প তাদের বিষয়বস্তুকে বিভিন্ন ভাষায় অনুবাদ করতে এবং বিশ্বব্যাপী সম্প্রদায়ের জন্য স্থানীয়করণ করতে চাইছে। + +বহুভাষিক বিষয়বস্তু সরবরাহ করা আপনার বিশ্বব্যাপী সম্প্রদায়কে বাড়ানোর, অ-ইংরেজিভাষীদের শিক্ষা প্রদানের, আপনার বিষয়বস্তু এবং যোগাযোগগুলি যাতে আরও বৃহত্তর দর্শকের কাছে পৌঁছায় তা নিশ্চিত করার এবং এই জগতে আরও বেশি লোককে অন্তর্ভুক্ত করার একটি সহজ এবং কার্যকর উপায়। + +এই গাইডের লক্ষ্য হল বিষয়বস্তু স্থানীয়করণ সম্পর্কে সাধারণ চ্যালেঞ্জ এবং ভুল ধারণাগুলিকে সম্বোধন করা। এটি বিষয়বস্তু পরিচালনা, অনুবাদ এবং পর্যালোচনা প্রক্রিয়া, গুণমান নিশ্চিতকরণ, অনুবাদক আউটরিচ এবং স্থানীয়করণ প্রক্রিয়ার অন্যান্য গুরুত্বপূর্ণ দিকগুলির জন্য একটি ধাপে ধাপে নির্দেশিকা প্রদান করে। + +## বিষয়বস্তু ব্যবস্থাপনা {#content-management} + +অনুবাদ বিষয়বস্তু ব্যবস্থাপনা বলতে অনুবাদ কর্মপ্রবাহকে স্বয়ংক্রিয় করার প্রক্রিয়াকে বোঝায়, যা পুনরাবৃত্তিমূলক ম্যানুয়াল কাজের প্রয়োজনীয়তা দূর করে, দক্ষতা ও গুণমান উন্নত করে, আরও ভাল নিয়ন্ত্রণের অনুমতি দেয় এবং সহযোগিতাকে সক্ষম করে। + +স্থানীয়করণ প্রক্রিয়ায় বিষয়বস্তু ব্যবস্থাপনার জন্য অনেক বিভিন্ন পদ্ধতি রয়েছে, যা বিষয়বস্তু এবং আপনার প্রয়োজনের উপর নির্ভর করে। + +বিষয়বস্তু ব্যবস্থাপনার মৌলিক উপায় হল উৎস এবং লক্ষ্য টেক্সট সম্বলিত দ্বিভাষিক ফাইল তৈরি করা। এটি অনুবাদে খুব কমই ব্যবহৃত হয়, কারণ এটি সরলতা ছাড়া আর কোনও উল্লেখযোগ্য সুবিধা প্রদান করে না। + +অনুবাদ সংস্থাগুলি সাধারণত অনুবাদ ব্যবস্থাপনা সফ্টওয়্যার বা স্থানীয়করণ টুলস ব্যবহার করে অনুবাদ ব্যবস্থাপনার দিকে অগ্রসর হয়, যা প্রকল্প পরিচালনার ক্ষমতা প্রদান করে এবং ফাইল, বিষয়বস্তু এবং ভাষাবিদদের উপর অনেক বেশি নিয়ন্ত্রণের সুযোগ দেয়। + +বিষয়বস্তু ব্যবস্থাপনা সম্পর্কে আরও পড়ুন: + +[Trados অন হোয়াট ইজ ট্রান্সলেশন ম্যানেজমেন্ট](https://www.trados.com/solutions/translation-management/) + +[Phrase অন মাল্টিলিঙ্গুয়াল কনটেন্ট ম্যানেজমেন্ট](https://phrase.com/blog/posts/multilingual-content-management/) + +### অনুবাদ ব্যবস্থাপনা সফ্টওয়্যার {#translation-management-software} + +অনেক অনুবাদ ব্যবস্থাপনা সিস্টেম এবং স্থানীয়করণ টুলস রয়েছে, এবং সফ্টওয়্যারের পছন্দ মূলত আপনার প্রয়োজনের উপর নির্ভর করে। + +যদিও কিছু প্রকল্প অনুবাদ ব্যবস্থাপনা সিস্টেম ব্যবহার না করার সিদ্ধান্ত নেয় এবং অনুবাদগুলি ম্যানুয়ালি পরিচালনা করতে পছন্দ করে – হয় সরাসরি দ্বিভাষিক ফাইলে বা GitHub-এর মতো হোস্টিং পরিষেবাগুলিতে – এটি নিয়ন্ত্রণ, উৎপাদনশীলতা, গুণমান, পরিমাপযোগ্যতা এবং সহযোগিতার ক্ষমতা নাটকীয়ভাবে হ্রাস করে। এই ধরনের পদ্ধতি ছোট আকারের বা এককালীন অনুবাদ প্রকল্পগুলির জন্য সবচেয়ে উপকারী হতে পারে। + +সবচেয়ে শক্তিশালী এবং বহুল ব্যবহৃত কিছু অনুবাদ ব্যবস্থাপনা টুলস-এর উপর একটি দ্রুত নজর: + +**ক্রাউডসোর্সিং এবং সহযোগিতার জন্য সেরা** + +[Crowdin](https://crowdin.com/) + +- ওপেন-সোর্স প্রকল্পগুলির জন্য বিনামূল্যে (অসীম সংখ্যক স্ট্রিং এবং প্রকল্প) +- সব প্ল্যানের সাথে TM এবং শব্দকোষ উপলব্ধ +- 60+ সমর্থিত ফাইল ফরম্যাট, 70+ API ইন্টিগ্রেশন + +[Lokalise](https://lokalise.com/) + +- 2 জন দলের সদস্যের জন্য বিনামূল্যে, আরও বেশি অবদানকারীদের জন্য পেইড প্ল্যান (বেশিরভাগ প্ল্যানের জন্য সীমিত সংখ্যক স্ট্রিং) +- কিছু পেইড প্ল্যানের সাথে TM এবং শব্দকোষ উপলব্ধ +- 30+ সমর্থিত ফাইল ফরম্যাট, 40+ API ইন্টিগ্রেশন + +[Transifex](https://www.transifex.com/) + +- শুধুমাত্র পেইড প্ল্যান (বেশিরভাগ প্ল্যানের জন্য সীমিত সংখ্যক স্ট্রিং) +- সমস্ত পেইড প্ল্যানের সাথে TM এবং শব্দকোষ উপলব্ধ +- 30+ সমর্থিত ফাইল ফরম্যাট, 20+ API ইন্টিগ্রেশন + +[Phrase](https://phrase.com/) + +- শুধুমাত্র পেইড প্ল্যান (সমস্ত প্ল্যানের জন্য অসীম সংখ্যক স্ট্রিং, সীমিত সংখ্যক প্রকল্প এবং দলের সদস্য) +- কিছু পেইড প্ল্যানের সাথে TM এবং শব্দকোষ উপলব্ধ +- 40+ সমর্থিত ফাইল ফরম্যাট, 20+ API ইন্টিগ্রেশন + +[Smartcat](https://www.smartcat.com/) + +- প্রদেয় উন্নত বৈশিষ্ট্য সহ বেসিক বিনামূল্যের প্ল্যান (সমস্ত প্ল্যানের জন্য অসীম সংখ্যক স্ট্রিং এবং প্রকল্প) +- সব প্ল্যানের সাথে TM এবং শব্দকোষ উপলব্ধ +- 60+ সমর্থিত ফাইল ফরম্যাট, 20+ API ইন্টিগ্রেশন + +[POEditor](https://poeditor.com/) + +- ওপেন-সোর্স প্রকল্পগুলির জন্য বিনামূল্যে (সমস্ত প্রকল্পের জন্য সীমিত সংখ্যক স্ট্রিং, ওপেন-সোর্স প্রকল্পগুলির জন্য সীমাহীন) +- পেইড প্ল্যানের জন্য TM এবং শব্দকোষ উপলব্ধ +- 20+ সমর্থিত ফাইল ফরম্যাট, 10+ API ইন্টিগ্রেশন + +এবং আরও অনেকে... + +**পেশাদার অনুবাদ টুলস** + +[SDL Trados Studio](https://www.trados.com/products/trados-studio/) + +- ফ্রিল্যান্স অনুবাদক এবং দলগুলির জন্য পেইড প্ল্যান +- খুব শক্তিশালী কম্পিউটার-সহায়ক অনুবাদ (CAT) টুল এবং অনুবাদক উৎপাদনশীলতা সফ্টওয়্যার + +[MemoQ](https://www.memoq.com/) + +- উন্নত বৈশিষ্ট্যগুলির জন্য বেশ কয়েকটি পেইড প্ল্যান সহ সীমিত বিনামূল্যের সংস্করণ উপলব্ধ +- কোম্পানি, ভাষা পরিষেবা প্রদানকারী এবং অনুবাদকদের জন্য অনুবাদ ব্যবস্থাপনা সফ্টওয়্যার + +[Memsource](https://www.memsource.com/) + +- ব্যক্তিগত অনুবাদকদের জন্য বিনামূল্যে, দলগুলির জন্য বেশ কয়েকটি পেইড প্ল্যান সহ +- ক্লাউড-ভিত্তিক কম্পিউটার-সহায়ক অনুবাদ এবং অনুবাদ ব্যবস্থাপনা সিস্টেম + +এবং আরও অনেকে... + +অনুবাদ ব্যবস্থাপনা সফ্টওয়্যার সম্পর্কে আরও পড়ুন: + +[উইকিপিডিয়ায় অনুবাদ ব্যবস্থাপনা সিস্টেমের সংজ্ঞা](https://en.wikipedia.org/wiki/Translation_management_system) + +[Phrase-এ ৭টি জিনিস যা প্রতিটি অনুবাদ ব্যবস্থাপনা সফ্টওয়্যারে থাকা উচিত](https://phrase.com/blog/posts/7-things-every-translation-management-software-should-have/) + +[MemoQ-তে অনুবাদ ব্যবস্থাপনা সিস্টেম কী](https://www.memoq.com/tools/what-is-a-translation-management-system) + +[Gengo-র ১৬টি সেরা অনুবাদ ব্যবস্থাপনা সিস্টেমের তালিকা](https://gengo.com/translator-product-updates/16-best-translation-management-systems/) + +## কর্মপ্রবাহ {#workflow} + +অনুবাদ জগতে, অনুবাদ কর্মপ্রবাহ কয়েকটি বিভিন্ন জিনিস বোঝাতে পারে, উভয়ই কিছুটা আন্তঃসম্পর্কিত, এবং আপনার প্রকল্পের জন্য গুরুত্বপূর্ণ বিবেচনা। + +আমরা নীচে তাদের উভয়টিই অন্বেষণ করব। + +**অর্থ 1** + +এটি সম্ভবত অনুবাদ কর্মপ্রবাহ সম্পর্কে চিন্তা করার সবচেয়ে সাধারণ উপায় এবং এমন কিছু যা সাধারণত কর্মপ্রবাহ শব্দটি শোনার সময় মনে আসে। + +এর সারমর্মে, এটি অনুবাদ সম্পর্কে চিন্তা করা থেকে শুরু করে আপনার পণ্যে অনূদিত বিষয়বস্তু ব্যবহার করা পর্যন্ত ‘কাজের প্রবাহ’। + +এই ক্ষেত্রে একটি উদাহরণ কর্মপ্রবাহ হবে: + +1. **অনুবাদের জন্য ফাইল প্রস্তুত করা** – এটি শুনতে সহজ মনে হয়; তবে, আপনাকে কয়েকটি গুরুত্বপূর্ণ বিষয় বিবেচনা করতে হবে। এই ধাপে, পুরো প্রক্রিয়াটি কীভাবে কাজ করা উচিত সে সম্পর্কে আপনার একটি স্পষ্ট পরিকল্পনা থাকা উচিত। + +- _আপনি কোন ধরনের ফাইল ব্যবহার করবেন? আপনি আপনার অনূদিত ফাইলগুলি কোন ফরম্যাটে পেতে চান?_ + - যদি আপনার বিষয়বস্তু DOCX বা MD ফরম্যাটে উপলব্ধ থাকে, তবে আপনি যদি আপনার হোয়াইটপেপার বা অন্যান্য নথির একটি PDF সংস্করণ অনুবাদ করেন তার চেয়ে এই পদ্ধতিটি অনেক বেশি সহজ হবে। +- _কোন স্থানীয়করণ টুলস এই ফাইল প্রকারকে সমর্থন করে? ফাইলটি কি এমনভাবে অনুবাদ করা যেতে পারে যা মূল বিন্যাস বজায় রাখে?_ + - সব ধরনের ফাইল সরাসরি স্থানীয়করণ সমর্থন করে না (যেমন, PDF ফাইল, ইমেজ ফাইল), এবং সব স্থানীয়করণ টুলস সব ধরনের ফাইল সমর্থন করে না। +- _বিষয়বস্তু কে অনুবাদ করবে? আপনি কি পেশাদার অনুবাদের জন্য অর্ডার দেবেন নাকি স্বেচ্ছাসেবকদের উপর নির্ভর করবেন?_ + - এটি আপনাকে নিতে হবে এমন আরও বেশ কিছু সিদ্ধান্তকে প্রভাবিত করে। উদাহরণস্বরূপ, পেশাদার অনুবাদকরা স্বেচ্ছাসেবকদের চেয়ে উন্নত স্থানীয়করণ টুলস নিয়ে কাজ করতে বেশি স্বাচ্ছন্দ্যবোধ করেন। +- _ভাষাবিদদের জন্য আপনার প্রত্যাশা কী? আপনি যদি কোনো ভাষা পরিষেবা প্রদানকারী ব্যবহার করেন, তারা আপনার কাছ থেকে কী আশা করে?_ + - আপনার লক্ষ্য, প্রত্যাশা এবং সময়সীমা সারিবদ্ধ আছে কিনা তা নিশ্চিত করার জন্য এটিই সেই ধাপ। +- _অনুবাদের জন্য সমস্ত বিষয়বস্তু কি সমানভাবে গুরুত্বপূর্ণ? কিছু বিষয়বস্তু কি প্রথমে অনুবাদ করা উচিত?_ + - নির্দিষ্ট কিছু বিষয়বস্তুকে অগ্রাধিকার দেওয়ার কিছু উপায় আছে, যা প্রথমে অনুবাদ এবং বাস্তবায়ন করা উচিত। উদাহরণস্বরূপ, যদি আপনার অনুবাদের জন্য প্রচুর বিষয়বস্তু থাকে, তবে অনুবাদকরা কোনটিকে অগ্রাধিকার দেবে সে সম্পর্কে সচেতন কিনা তা নিশ্চিত করতে আপনি সংস্করণ নিয়ন্ত্রণ ব্যবহার করতে পারেন। + +2. **অনুবাদের জন্য ফাইল শেয়ার করা** – এই ধাপেও কিছু দীর্ঘমেয়াদী চিন্তাভাবনার প্রয়োজন এবং এটি কোনো ভাষা পরিষেবা প্রদানকারীর কাছে উৎস ফাইল পাঠানোর মতো সহজ নয়। + +- _বিষয়বস্তু কে অনুবাদ করবে? এই প্রক্রিয়ায় কতজন লোক জড়িত থাকবে?_ + - আপনি যদি একটি স্থানীয়করণ টুল ব্যবহার করার পরিকল্পনা করেন, তবে এই ধাপটি সহজ হয়ে যায় কারণ আপনি সরাসরি টুল-এ উৎস ফাইলগুলি আপলোড করতে পারেন। এটিও সত্য যদি অনুবাদ প্রক্রিয়াটি হোস্টিং পরিষেবাতে সংঘটিত হয় কারণ উৎস ফাইলগুলি কোথাও রপ্তানি করার প্রয়োজন হয় না। +- _উৎস ফাইলগুলি কি ম্যানুয়ালি পরিচালনা করা হবে, নাকি এই প্রক্রিয়াটি স্বয়ংক্রিয় করা যেতে পারে?_ + - বেশিরভাগ স্থানীয়করণ টুলস ফাইল ব্যবস্থাপনা প্রক্রিয়ার কিছু ধরণের ইন্টিগ্রেশন বা অটোমেশনের অনুমতি দেয়। অন্যদিকে, আপনি যদি স্বতন্ত্র অনুবাদকদের সাথে কাজ করেন এবং একটি স্থানীয়করণ টুল ব্যবহার না করেন, তবে শত শত বা হাজার হাজার অনুবাদকদের কাছে ম্যানুয়ালি উৎস ফাইল পাঠানো একটি পরিমাপযোগ্য প্রক্রিয়া নয়। +- _স্থানীয়করণের জন্য কোন টুলস ব্যবহার করা হবে?_ + - এই প্রশ্নের উত্তর নির্ধারণ করবে আপনি অন্য সবকিছুর সাথে কীভাবে অগ্রসর হবেন। সঠিক টুল নির্বাচন করা আপনাকে বিষয়বস্তু ব্যবস্থাপনা, অনুবাদ মেমরি এবং শব্দকোষ পরিচালনা, অনুবাদকদের পরিচালনা, অনুবাদ/পর্যালোচনা অগ্রগতির ট্র্যাক রাখা ইত্যাদি স্বয়ংক্রিয় করতে সাহায্য করতে পারে, তাই কিছু সময় নিন এবং আপনি কোন টুল ব্যবহার করতে চান সে বিষয়ে কিছু গবেষণা করুন। আপনি যদি একটি স্থানীয়করণ টুল ব্যবহার করার পরিকল্পনা না করেন, তবে উপরের সমস্ত কিছু ম্যানুয়ালি করতে হবে। +- _অনুবাদ প্রক্রিয়াটি কতক্ষণ সময় নেবে? এতে কত খরচ হবে?_ + - এই মুহূর্তে, আপনার ভাষা পরিষেবা প্রদানকারী বা অনুবাদকদের পুলের সাথে উৎস ফাইল শেয়ার করার জন্য প্রস্তুত থাকা উচিত। ভাষা পরিষেবা প্রদানকারী আপনাকে শব্দ গণনা বিশ্লেষণ করতে এবং অনুবাদ প্রক্রিয়ার জন্য হার এবং সময়সীমা সহ একটি উদ্ধৃতি প্রদান করতে সাহায্য করতে পারে। +- _আপনি কি এই প্রক্রিয়া চলাকালীন উৎস বিষয়বস্তুতে পরিবর্তন/আপডেট করার পরিকল্পনা করছেন?_ + - যদি আপনার বিষয়বস্তু গতিশীল হয় এবং প্রায়শই পরিবর্তিত হয়, তবে কোনো পরিবর্তন বা আপডেট অনুবাদ অগ্রগতিতে ব্যাঘাত ঘটাতে পারে। একটি অনুবাদ মেমরি ব্যবহার করা এটিকে উল্লেখযোগ্যভাবে কমাতে সাহায্য করতে পারে, যদিও প্রক্রিয়াটি কীভাবে কাজ করবে এবং অনুবাদকরা যে অগ্রগতি করছে তাতে বাধা দেওয়া কীভাবে প্রতিরোধ করা যায় সে সম্পর্কে চিন্তা করা এখনও গুরুত্বপূর্ণ। + +3. **অনুবাদ প্রক্রিয়া পরিচালনা করা** – উৎস বিষয়বস্তু ভাষা পরিষেবা প্রদানকারী বা অনুবাদকদের কাছে হস্তান্তর করার পরেই আপনার কাজ শেষ হয়ে যায় না। অনুবাদের সর্বোত্তম গুণমান নিশ্চিত করার জন্য, বিষয়বস্তু নির্মাতাদের যতটা সম্ভব অনুবাদ প্রক্রিয়ার সাথে জড়িত থাকা উচিত। + +- _আপনি অনুবাদকদের সাথে কীভাবে যোগাযোগ করার পরিকল্পনা করছেন?_ + - আপনি যদি একটি স্থানীয়করণ টুল ব্যবহার করার পরিকল্পনা করেন, তবে যোগাযোগ সরাসরি টুলের মধ্যেই হতে পারে। অনুবাদকদের সাথে একটি বিকল্প যোগাযোগ চ্যানেল স্থাপন করারও সুপারিশ করা হয় কারণ তারা যোগাযোগ করতে কম দ্বিধা বোধ করতে পারে এবং মেসেজিং টুলস আরও অবাধ যোগাযোগের সুযোগ দেয়। +- _অনুবাদকদের কাছ থেকে আসা প্রশ্নগুলি কীভাবে পরিচালনা করবেন? কার এই প্রশ্নগুলির উত্তর দেওয়া উচিত?_ + - অনুবাদকরা (পেশাদার এবং অ-পেশাদার উভয়ই) প্রায়শই স্পষ্টীকরণ বা অতিরিক্ত প্রসঙ্গের জন্য প্রশ্ন এবং অনুরোধের সাথে সাথে প্রতিক্রিয়া এবং উন্নতির জন্য ধারণা নিয়ে যোগাযোগ করবেন। এই জিজ্ঞাসাগুলির উত্তর দেওয়া প্রায়শই আরও ভাল সম্পৃক্ততা এবং অনূদিত বিষয়বস্তুর গুণমানের দিকে নিয়ে যেতে পারে। তাদেরকে যতটা সম্ভব রিসোর্স (যেমন, নির্দেশিকা, টিপস, পরিভাষা নির্দেশিকা, প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী, ইত্যাদি) সরবরাহ করাও মূল্যবান। +- _পর্যালোচনা প্রক্রিয়াটি কীভাবে পরিচালনা করবেন? আপনি কি এটি আউটসোর্স করতে চান, নাকি আপনার অভ্যন্তরীণভাবে পর্যালোচনা করার ক্ষমতা আছে?_ + - যদিও সবসময় প্রয়োজন হয় না, পর্যালোচনা একটি সর্বোত্তম অনুবাদ প্রক্রিয়ার একটি অবিচ্ছেদ্য অংশ। সাধারণত, পেশাদার পর্যালোচকদের কাছে পর্যালোচনা প্রক্রিয়াটি আউটসোর্স করা সবচেয়ে সহজ। তবে, আপনার যদি একটি বড় আন্তর্জাতিক দল থাকে, তবে পর্যালোচনা বা QA অভ্যন্তরীণভাবেও পরিচালনা করা যেতে পারে। + +4. **অনূদিত বিষয়বস্তু বাস্তবায়ন** – কর্মপ্রবাহের শেষ অংশ, যদিও এটি আগে থেকেই বিবেচনা করা গুরুত্বপূর্ণ। + +- _সব অনুবাদ কি একই সময়ে সম্পন্ন হবে?_ + - যদি না হয়, তবে আপনার ভাবা উচিত কোন অনুবাদগুলিকে অগ্রাধিকার দেওয়া উচিত, অগ্রগতিতে থাকা অনুবাদগুলির উপর কীভাবে নজর রাখা যায়, এবং অনুবাদগুলি সম্পন্ন হওয়ার সময় বাস্তবায়ন কীভাবে পরিচালিত হয়। +- _অনূদিত বিষয়বস্তু আপনাকে কীভাবে বিতরণ করা হবে? এটি কোন ফরম্যাটে থাকবে?_ + - আপনি যে পদ্ধতিই ব্যবহার করুন না কেন, এটি একটি গুরুত্বপূর্ণ বিবেচনা। স্থানীয়করণ টুলস আপনাকে লক্ষ্য ফাইল ফরম্যাট এবং রপ্তানি প্রক্রিয়ার উপর নিয়ন্ত্রণ বজায় রাখতে দেয় এবং সাধারণত অটোমেশন সমর্থন করে, যেমন, হোস্টিং পরিষেবার সাথে ইন্টিগ্রেশন সক্ষম করে। +- _আপনি আপনার প্রকল্পে অনুবাদগুলি কীভাবে বাস্তবায়ন করবেন?_ + - কিছু ক্ষেত্রে, এটি অনূদিত ফাইল আপলোড করা বা আপনার ডক্সে যুক্ত করার মতোই সহজ হতে পারে। তবে, ওয়েবসাইট বা অ্যাপ অনুবাদের মতো আরও জটিল প্রকল্পগুলির ক্ষেত্রে, আপনার নিশ্চিত করা উচিত যে কোডটি আন্তর্জাতিকীকরণ সমর্থন করে এবং বাস্তবায়ন প্রক্রিয়াটি আগে থেকেই কীভাবে পরিচালিত হবে তা স্থাপন করা উচিত। +- _বিন্যাস যদি উৎস থেকে ভিন্ন হয় তবে কী হবে?_ + - উপরেরটির মতো, আপনি যদি সাধারণ টেক্সট ফাইল অনুবাদ করেন, তবে বিন্যাস সম্ভবত খুব বেশি গুরুত্বপূর্ণ নয়। তবে, ওয়েবসাইট বা অ্যাপ্লিকেশনের জন্য বিষয়বস্তুর মতো আরও জটিল ফাইলগুলির ক্ষেত্রে, আপনার প্রকল্পে বাস্তবায়নের জন্য বিন্যাস এবং কোডকে উৎসের সাথে অভিন্ন হতে হবে। যদি না হয়, তবে লক্ষ্য ফাইলগুলি অনুবাদক বা আপনার ডেভেলপারদের দ্বারা সম্পাদনা করতে হবে। + +**অর্থ 2** + +একটি বিকল্প অনুবাদ কর্মপ্রবাহ, যা অভ্যন্তরীণ সিদ্ধান্ত এবং পদ্ধতির জন্য দায়ী নয়। এখানে প্রধান বিবেচনা হল বিষয়বস্তুর নিজস্ব প্রবাহ। + +এই ক্ষেত্রে একটি উদাহরণ কর্মপ্রবাহ হবে: + +1. _অনুবাদ → বাস্তবায়ন_ + +- সবচেয়ে সহজ কর্মপ্রবাহ, যেখানে অনুবাদ সম্ভবত মানব অনুবাদ হবে, কারণ বাস্তবায়নের আগে গুণমান মূল্যায়ন এবং অনুবাদ সম্পাদনা করার জন্য কোনও পর্যালোচনা বা QA প্রক্রিয়া নেই। +- এই কর্মপ্রবাহের সাথে, এটি গুরুত্বপূর্ণ যে অনুবাদকরা একটি নির্দিষ্ট স্তরের গুণমান বজায় রাখতে পারে, যার জন্য প্রকল্প পরিচালক এবং অনুবাদকদের মধ্যে উপযুক্ত রিসোর্স এবং যোগাযোগের প্রয়োজন হবে। + +2. _অনুবাদ → পর্যালোচনা → বাস্তবায়ন_ + +- একটি আরও উন্নত কর্মপ্রবাহ, যা একটি পর্যালোচনা এবং সম্পাদনা প্রক্রিয়া অন্তর্ভুক্ত করে, যাতে অনুবাদের গুণমান গ্রহণযোগ্য এবং সামঞ্জস্যপূর্ণ হয়। +- এই কর্মপ্রবাহের জন্য বেশ কয়েকটি পদ্ধতি রয়েছে, যেখানে অনুবাদ পেশাদার অনুবাদক বা স্বেচ্ছাসেবকদের দ্বারা করা যেতে পারে, যখন পর্যালোচনা প্রক্রিয়া সম্ভবত পেশাদার পর্যালোচকদের দ্বারা পরিচালিত হবে, যারা লক্ষ্য ভাষায় পালন করা প্রয়োজন এমন সমস্ত ব্যাকরণ এবং বানান নিয়মের সাথে পরিচিত। + +3. _অনুবাদ → পর্যালোচনা → QA → বাস্তবায়ন_ + +- সর্বোচ্চ স্তরের গুণমান নিশ্চিত করার জন্য সর্বোত্তম কর্মপ্রবাহ। যদিও QA সবসময় প্রয়োজন হয় না, তবে অনুবাদ এবং পর্যালোচনার পরে অনূদিত পাঠ্যের গুণমান সম্পর্কে আপনাকে আরও ভাল ধারণা দিতে এটি কার্যকর হতে পারে। +- এই কর্মপ্রবাহের সাথে, অনুবাদ একচেটিয়াভাবে স্বেচ্ছাসেবক বা এমনকি মেশিন অনুবাদ দ্বারাও করা যেতে পারে। পর্যালোচনা প্রক্রিয়াটি পেশাদার অনুবাদকদের দ্বারা করা উচিত, যখন QA একটি ভাষা পরিষেবা প্রদানকারী দ্বারা বা অভ্যন্তরীণভাবে করা যেতে পারে, যদি আপনার এমন কর্মচারী থাকে যারা লক্ষ্য ভাষার স্থানীয় ভাষাভাষী। + +অনুবাদ কর্মপ্রবাহ সম্পর্কে আরও পড়ুন: + +[অনুবাদ কর্মপ্রবাহের পাঁচটি পর্যায়ের উপর বিষয়বস্তু নিয়ম](https://contentrules.com/creating-translation-workflow/) + +[Smartling-এ অনুবাদ কর্মপ্রবাহ ব্যবস্থাপনা কী](https://www.smartling.com/resources/101/what-is-translation-workflow-management/) + +[RixTrans-এ অনুবাদ কর্মপ্রবাহ](https://www.rixtrans.com/translation-workflow) + +## পরিভাষা ব্যবস্থাপনা {#terminology-management} + +পরিভাষা কীভাবে পরিচালনা করা হবে সে সম্পর্কে একটি স্পষ্ট পরিকল্পনা প্রতিষ্ঠা করা আপনার অনুবাদের গুণমান এবং সামঞ্জস্যতা নিশ্চিত করার এবং আপনার অনুবাদকদের সময় বাঁচানোর অন্যতম গুরুত্বপূর্ণ পদক্ষেপ। + +অনুবাদ জগতে, এটি পরিভাষা ব্যবস্থাপনা হিসাবে পরিচিত এবং এটি ভাষাবিদদের পুল এবং বিষয়বস্তু ব্যবস্থাপনার অ্যাক্সেস ছাড়াও ভাষা পরিষেবা প্রদানকারীরা তাদের ক্লায়েন্টদের যে মূল পরিষেবাগুলি অফার করে তার মধ্যে একটি। + +পরিভাষা ব্যবস্থাপনা বলতে আপনার প্রকল্পের জন্য গুরুত্বপূর্ণ পরিভাষা চিহ্নিত করা, সংগ্রহ করা এবং পরিচালনা করার প্রক্রিয়াকে বোঝায় এবং যা সর্বদা সঠিকভাবে এবং ধারাবাহিকভাবে অনুবাদ করা উচিত। + +পরিভাষা ব্যবস্থাপনা সম্পর্কে চিন্তা করা শুরু করার সময় অনুসরণ করার জন্য কয়েকটি ধাপ রয়েছে: + +- টার্মবেসে অন্তর্ভুক্ত করা উচিত এমন মূল শব্দগুলি চিহ্নিত করুন। +- শব্দ এবং তাদের সংজ্ঞার একটি শব্দকোষ তৈরি করুন। +- শব্দগুলি অনুবাদ করুন এবং সেগুলিকে শব্দকোষে যুক্ত করুন। +- অনুবাদগুলি পরীক্ষা করুন এবং অনুমোদন করুন। +- শব্দকোষ বজায় রাখুন এবং নতুন শব্দগুলির সাথে এটি আপডেট করুন, যখন সেগুলি গুরুত্বপূর্ণ হয়ে ওঠে। + +পরিভাষা ব্যবস্থাপনা সম্পর্কে আরও পড়ুন: + +[Trados-এ পরিভাষা ব্যবস্থাপনা কী](https://www.trados.com/solutions/terminology-management/translation-101-what-is-terminology-management.html) + +[Language Scientific-এ পরিভাষা ব্যবস্থাপনা কেন গুরুত্বপূর্ণ](https://www.languagescientific.com/terminology-management-why-it-matters/#:~:text=Terminology%20management%20is%20the%20process,are%20related%20to%20each%20other.) + +[Clear Words Translation-এ পরিভাষা ব্যবস্থাপনা কী এবং কেন এটি গুরুত্বপূর্ণ](http://clearwordstranslations.com/language/en/what-is-terminology-management/) + +### অনুবাদ মেমরি এবং শব্দকোষ {#tm-and-glossary} + +অনুবাদ মেমরি এবং শব্দকোষ অনুবাদ শিল্পে গুরুত্বপূর্ণ টুলস এবং এমন কিছু যার উপর বেশিরভাগ ভাষা পরিষেবা প্রদানকারী নির্ভর করে। + +চলুন দেখি এই শব্দগুলির অর্থ কী এবং সেগুলি একে অপরের থেকে কীভাবে আলাদা: + +**অনুবাদ মেমরি (TM)** – একটি ডেটাবেস যা স্বয়ংক্রিয়ভাবে সেগমেন্ট বা স্ট্রিং সংরক্ষণ করে, যার মধ্যে রয়েছে দীর্ঘ পাঠ্যের ব্লক, সম্পূর্ণ বাক্য, অনুচ্ছেদ এবং স্বতন্ত্র শব্দ, সেইসাথে প্রতিটি ভাষায় তাদের বর্তমান এবং পূর্ববর্তী অনুবাদ। + +বেশিরভাগ স্থানীয়করণ টুলস, অনুবাদ ব্যবস্থাপনা সিস্টেম, এবং কম্পিউটার-সহায়ক অনুবাদ টুলের অন্তর্নির্মিত অনুবাদ মেমরি রয়েছে, যা সাধারণত রপ্তানি করা যায় এবং অন্যান্য অনুরূপ টুলের ক্ষেত্রেও ব্যবহার করা যায়। + +একটি অনুবাদ মেমরি ব্যবহার করার সুবিধাগুলির মধ্যে রয়েছে দ্রুত অনুবাদ, আরও ভাল অনুবাদ গুণমান, উৎস বিষয়বস্তু আপডেট বা পরিবর্তন করার সময় নির্দিষ্ট অনুবাদ ধরে রাখার ক্ষমতা, এবং পুনরাবৃত্তিমূলক বিষয়বস্তুর জন্য সস্তা অনুবাদ খরচ। + +অনুবাদ মেমরি বিভিন্ন সেগমেন্টের মধ্যে একটি শতাংশ মিলের উপর ভিত্তি করে কাজ করে এবং সাধারণত সবচেয়ে দরকারী হয় যখন দুটি সেগমেন্টে 50% এর বেশি একই বিষয়বস্তু থাকে। এগুলি পুনরাবৃত্তিমূলক সেগমেন্টগুলিকে স্বয়ংক্রিয়ভাবে অনুবাদ করতেও ব্যবহৃত হয়, যা 100% মিল, এইভাবে পুনরাবৃত্তিমূলক বিষয়বস্তুকে একাধিকবার অনুবাদ করার প্রয়োজনীয়তা দূর করে। + +অনুবাদ মেমরি সম্পর্কে আরও পড়ুন: + +[Memsource-এ অনুবাদ মেমরি](https://www.memsource.com/translation-memory/) + +[Smartling-এ অনুবাদ মেমরি কী](https://www.smartling.com/resources/101/what-is-translation-memory/) + +**শব্দকোষ –** গুরুত্বপূর্ণ বা সংবেদনশীল শব্দ, তাদের সংজ্ঞা, কার্যাবলী এবং প্রতিষ্ঠিত অনুবাদের একটি তালিকা। একটি শব্দকোষ এবং একটি অনুবাদ মেমরির মধ্যে প্রধান পার্থক্য হল যে একটি শব্দকোষ স্বয়ংক্রিয়ভাবে তৈরি হয় না, এবং এটিতে পূর্ণ বাক্যের অনুবাদ থাকে না। + +বেশিরভাগ স্থানীয়করণ টুলস, অনুবাদ ব্যবস্থাপনা সিস্টেম, এবং কম্পিউটার-সহায়ক অনুবাদ টুলের অন্তর্নির্মিত শব্দকোষ রয়েছে যা আপনি আপনার প্রকল্পের জন্য গুরুত্বপূর্ণ পরিভাষা ধারণ করে তা নিশ্চিত করতে বজায় রাখতে পারেন। TM-এর মতো, শব্দকোষ সাধারণত রপ্তানি করা যায় এবং অন্যান্য স্থানীয়করণ টুলসে ব্যবহার করা যায়। + +আপনার অনুবাদ প্রকল্প শুরু করার আগে, কিছু সময় নিয়ে আপনার অনুবাদক এবং পর্যালোচকদের জন্য একটি শব্দকোষ তৈরি করার জন্য অত্যন্ত সুপারিশ করা হয়। একটি শব্দকোষ ব্যবহার করা নিশ্চিত করে যে গুরুত্বপূর্ণ শব্দগুলি সঠিকভাবে অনুবাদ করা হয়েছে, অনুবাদকদের অত্যন্ত প্রয়োজনীয় প্রসঙ্গ সরবরাহ করে, এবং অনুবাদে সামঞ্জস্যতার নিশ্চয়তা দেয়। + +যদিও শব্দকোষে প্রায়শই লক্ষ্য ভাষায় প্রতিষ্ঠিত অনুবাদ থাকে, তবে এটি ছাড়াও সেগুলি দরকারী। এমনকি প্রতিষ্ঠিত অনুবাদ ছাড়াও, একটি শব্দকোষে প্রযুক্তিগত শব্দের সংজ্ঞা থাকতে পারে, যে শব্দগুলি অনুবাদ করা উচিত নয় সেগুলি হাইলাইট করতে পারে, এবং অনুবাদকদের জানাতে পারে যে একটি নির্দিষ্ট শব্দ বিশেষ্য, ক্রিয়া, নামবাচক বিশেষ্য বা অন্য কোনো পদ হিসাবে ব্যবহৃত হয়েছে কিনা। + +শব্দকোষ সম্পর্কে আরও পড়ুন: + +[Lionbridge-এ অনুবাদ শব্দকোষ কী](http://info.lionbridge.com/rs/lionbridge/images/Lionbridge%20FAQ_Glossary_2013.pdf) + +[Transifex-এ শব্দকোষ](https://docs.transifex.com/glossary/glossary) + +আপনি যদি আপনার প্রকল্পের জন্য একটি স্থানীয়করণ টুল ব্যবহার করার পরিকল্পনা না করেন, তবে আপনি সম্ভবত একটি অনুবাদ মেমরি এবং শব্দকোষ ব্যবহার করতে পারবেন না (আপনি একটি এক্সেল ফাইলে একটি শব্দকোষ বা টার্মবেস তৈরি করতে পারেন, তবে, স্বয়ংক্রিয় শব্দকোষ অনুবাদকদের ম্যানুয়ালি শব্দ এবং তাদের সংজ্ঞা খোঁজার প্রয়োজনীয়তা দূর করে)। + +এর মানে হল যে সমস্ত পুনরাবৃত্তিমূলক এবং অনুরূপ বিষয়বস্তু প্রতিবার ম্যানুয়ালি অনুবাদ করতে হবে। অতিরিক্তভাবে, অনুবাদকদের একটি নির্দিষ্ট শব্দ অনুবাদ করার প্রয়োজন আছে কি না, এটি পাঠ্যে কীভাবে ব্যবহৃত হয়েছে, এবং একটি শব্দের ইতিমধ্যে একটি প্রতিষ্ঠিত অনুবাদ আছে কি না সে সম্পর্কে প্রশ্ন নিয়ে যোগাযোগ করতে হবে। + +_আপনি কি আপনার প্রকল্পে ethereum.org অনুবাদ মেমরি এবং শব্দকোষ ব্যবহার করতে চান? translations@ethereum.org-এ আমাদের সাথে যোগাযোগ করুন।_ + +## অনুবাদক আউটরিচ {#translator-outreach} + +**একটি ভাষা পরিষেবা প্রদানকারীর সাথে কাজ করা** + +আপনি যদি কোনো ভাষা পরিষেবা প্রদানকারী এবং তাদের পেশাদার অনুবাদকদের সাথে কাজ করেন, তাহলে এই বিভাগটি আপনার জন্য খুব বেশি প্রাসঙ্গিক নাও হতে পারে। + +এই ক্ষেত্রে, এমন একটি ভাষা পরিষেবা প্রদানকারী নির্বাচন করা গুরুত্বপূর্ণ যার অনেক ভাষায় আপনার প্রয়োজনীয় সমস্ত পরিষেবা (যেমন, অনুবাদ, পর্যালোচনা, QA) সরবরাহ করার ক্ষমতা রয়েছে। + +যদিও শুধুমাত্র তাদের প্রস্তাবিত হারের উপর ভিত্তি করে একটি ভাষা পরিষেবা প্রদানকারী নির্বাচন করা লোভনীয় হতে পারে, তবে এটি লক্ষ্য করা গুরুত্বপূর্ণ যে বৃহত্তম ভাষা পরিষেবা প্রদানকারীদের একটি কারণে উচ্চ হার রয়েছে। + +- তাদের ডেটাবেসে হাজার হাজার ভাষাবিদ রয়েছে, যার মানে হল যে তারা আপনার প্রকল্পের জন্য আপনার নির্দিষ্ট সেক্টরের পর্যাপ্ত অভিজ্ঞতা এবং জ্ঞানসম্পন্ন অনুবাদকদের নিয়োগ করতে সক্ষম হবে (অর্থাৎ, প্রযুক্তিগত অনুবাদক)। +- তাদের বিভিন্ন প্রকল্পে কাজ করার এবং তাদের ক্লায়েন্টদের বিভিন্ন চাহিদা মেটানোর উল্লেখযোগ্য অভিজ্ঞতা রয়েছে। এর মানে হল যে তারা আপনার নির্দিষ্ট কর্মপ্রবাহের সাথে খাপ খাইয়ে নিতে, আপনার অনুবাদ প্রক্রিয়ার জন্য মূল্যবান পরামর্শ এবং সম্ভাব্য উন্নতির প্রস্তাব দিতে, এবং আপনার চাহিদা, প্রয়োজনীয়তা এবং সময়সীমা পূরণ করতে আরও বেশি সক্ষম হবে। +- বেশিরভাগ বৃহত্তম ভাষা পরিষেবা প্রদানকারীর নিজস্ব স্থানীয়করণ টুলস, অনুবাদ মেমরি এবং শব্দকোষ রয়েছে যা আপনি ব্যবহার করতে পারেন। যদি না থাকে, তবে তাদের পুলে অন্তত যথেষ্ট ভাষাবিদ রয়েছে যাতে নিশ্চিত করা যায় যে তাদের অনুবাদকরা আপনার ব্যবহার করতে চাওয়া যেকোনো স্থানীয়করণ টুলের সাথে পরিচিত এবং কাজ করতে সক্ষম হবে। + +আপনি বিশ্বের বৃহত্তম ভাষা পরিষেবা প্রদানকারীদের একটি গভীর তুলনা, তাদের প্রত্যেকের সম্পর্কে কিছু বিশদ বিবরণ এবং তাদের সরবরাহ করা পরিষেবা, ভৌগলিক ডেটা ইত্যাদি দ্বারা বিভাজন [2021 Nimdzi 100 রিপোর্ট](https://www.nimdzi.com/nimdzi-100-top-lsp/)-এ খুঁজে পেতে পারেন। + +**অ-পেশাদার অনুবাদকদের সাথে কাজ করা** + +আপনি হয়তো অ-পেশাদার অনুবাদকদের সাথে কাজ করছেন এবং আপনাকে অনুবাদে সাহায্য করার জন্য স্বেচ্ছাসেবকদের খুঁজছেন। + +মানুষের কাছে পৌঁছানোর এবং তাদের আপনার প্রকল্পে যোগদানের জন্য আমন্ত্রণ জানানোর বেশ কয়েকটি উপায় রয়েছে। এটি মূলত আপনার পণ্যের উপর এবং আপনার ইতিমধ্যে কতটা বড় একটি সম্প্রদায় আছে তার উপর নির্ভর করবে। + +স্বেচ্ছাসেবকদের অনবোর্ড করার কিছু উপায় নীচে বর্ণনা করা হয়েছে: + +**আউটরিচ –** যদিও এটি নীচের পয়েন্টগুলিতে কিছুটা আচ্ছাদিত, সম্ভাব্য স্বেচ্ছাসেবকদের কাছে পৌঁছানো এবং আপনার অনুবাদ উদ্যোগ সম্পর্কে তারা সচেতন কিনা তা নিশ্চিত করা নিজেই কার্যকর হতে পারে। + +অনেক লোক তাদের প্রিয় প্রকল্পে জড়িত হতে এবং অবদান রাখতে চায়, কিন্তু প্রায়শই একজন ডেভেলপার না হয়ে বা বিশেষ প্রযুক্তিগত দক্ষতা না থাকলে তা করার একটি স্পষ্ট উপায় দেখতে পায় না। আপনি যদি আপনার প্রকল্প সম্পর্কে সচেতনতা ছড়িয়ে দিতে পারেন, তবে অনেক দ্বিভাষিক ব্যক্তি জড়িত হতে আগ্রহী হবে। + +**আপনার সম্প্রদায়ের মধ্যে খোঁজা –** এই জগতের বেশিরভাগ প্রকল্পেরই ইতিমধ্যে বড় এবং সক্রিয় সম্প্রদায় রয়েছে। আপনার সম্প্রদায়ের অনেক সদস্যই সম্ভবত একটি সহজ উপায়ে প্রকল্পে অবদান রাখার সুযোগের প্রশংসা করবে। + +যদিও ওপেন-সোর্স প্রকল্পগুলিতে অবদান রাখা প্রায়শই অন্তর্নিহিত অনুপ্রেরণার উপর ভিত্তি করে হয়, এটি একটি চমৎকার শেখার অভিজ্ঞতাও। আপনার প্রকল্প সম্পর্কে আরও জানতে আগ্রহী যে কেউ সম্ভবত একজন স্বেচ্ছাসেবক হিসাবে একটি অনুবাদ প্রোগ্রামে জড়িত হতে পেরে খুশি হবেন, কারণ এটি তাদের এমন কিছুতে অবদান রাখার ঘটনাটিকে একটি নিবিড় হাতে-কলমে শেখার অভিজ্ঞতার সাথে একত্রিত করার অনুমতি দেবে যা তারা যত্ন করে। + +**আপনার পণ্যে উদ্যোগের উল্লেখ করা –** যদি আপনার পণ্য জনপ্রিয় হয় এবং বিপুল সংখ্যক লোক দ্বারা ব্যবহৃত হয়, তবে আপনার অনুবাদ প্রোগ্রামকে হাইলাইট করা এবং পণ্য ব্যবহার করার সময় ব্যবহারকারীদের পদক্ষেপ নিতে আহ্বান করা অত্যন্ত কার্যকর হতে পারে। + +এটি অ্যাপ্লিকেশন এবং ওয়েবসাইটগুলির জন্য আপনার পণ্যে একটি CTA সহ একটি ব্যানার বা পপ-আপ যুক্ত করার মতোই সহজ হতে পারে। এটি কার্যকর কারণ আপনার লক্ষ্য দর্শক হল আপনার সম্প্রদায় - তারাই যারা প্রথম স্থানে জড়িত হওয়ার সম্ভাবনা সবচেয়ে বেশি। + +**সোশ্যাল মিডিয়া –** সোশ্যাল মিডিয়া আপনার অনুবাদ প্রোগ্রাম সম্পর্কে সচেতনতা ছড়িয়ে দেওয়ার এবং আপনার সম্প্রদায়ের সদস্যদের কাছে পৌঁছানোর, সেইসাথে যারা এখনও আপনার সম্প্রদায়ের সদস্য নয় তাদের কাছে পৌঁছানোর একটি কার্যকর উপায় হতে পারে। + +আপনার যদি ডিসকর্ড সার্ভার বা টেলিগ্রাম চ্যানেল থাকে, তবে এটি আউটরিচ, আপনার অনুবাদকদের সাথে যোগাযোগ এবং আপনার অবদানকারীদের স্বীকৃতি দেওয়ার জন্য ব্যবহার করা সহজ। + +X (পূর্বে টুইটার) এর মতো প্ল্যাটফর্মগুলিও নতুন সম্প্রদায়ের সদস্যদের অনবোর্ড করতে এবং আপনার অবদানকারীদের প্রকাশ্যে স্বীকৃতি দেওয়ার জন্য সহায়ক হতে পারে। + +লিনাক্স ফাউন্ডেশন একটি বিস্তৃত [2020 FOSS অবদানকারী সমীক্ষার উপর রিপোর্ট](https://www.linuxfoundation.org/wp-content/uploads/2020FOSSContributorSurveyReport_121020.pdf) তৈরি করেছে, যা ওপেন-সোর্স অবদানকারী এবং তাদের অনুপ্রেরণা বিশ্লেষণ করে। + +## উপসংহার {#conclusion} + +এই নথিতে কিছু মূল বিবেচনা রয়েছে যা প্রতিটি অনুবাদ প্রোগ্রামের সচেতন থাকা উচিত। এটি কোনোভাবেই একটি সম্পূর্ণ নির্দেশিকা নয়, যদিও এটি অনুবাদ শিল্পে কোনো অভিজ্ঞতা নেই এমন যে কাউকে তাদের প্রকল্পের জন্য একটি অনুবাদ প্রোগ্রাম সংগঠিত করতে সাহায্য করতে পারে। + +আপনি যদি একটি অনুবাদ প্রোগ্রাম পরিচালনার বিভিন্ন টুলস, প্রক্রিয়া এবং গুরুত্বপূর্ণ দিকগুলির আরও বিশদ নির্দেশাবলী এবং বিভাজন খুঁজছেন, তবে কিছু বৃহত্তম ভাষা পরিষেবা প্রদানকারী ব্লগ বজায় রাখে এবং প্রায়শই স্থানীয়করণ প্রক্রিয়ার বিভিন্ন দিক নিয়ে নিবন্ধ প্রকাশ করে। আপনি যদি উপরের যেকোনো বিষয়ে আরও গভীরে যেতে চান এবং স্থানীয়করণ প্রক্রিয়া পেশাগতভাবে কীভাবে কাজ করে তা বুঝতে চান তবে এগুলিই সেরা রিসোর্স। + +প্রতিটি বিভাগের শেষে কিছু প্রাসঙ্গিক লিঙ্ক অন্তর্ভুক্ত করা হয়েছে; তবে, আপনি অনলাইনে আরও অনেক রিসোর্স খুঁজে পেতে পারেন। + +সহযোগিতার প্রস্তাব বা অতিরিক্ত তথ্য, শিক্ষা এবং সেরা অনুশীলনের জন্য যা আমরা ethereum.org অনুবাদ প্রোগ্রাম বজায় রেখে অর্জন করেছি, translations@ethereum.org-এ আমাদের সাথে নির্দ্বিধায় যোগাযোগ করুন। diff --git a/public/content/translations/bn/contributing/translation-program/resources/index.md b/public/content/translations/bn/contributing/translation-program/resources/index.md new file mode 100644 index 00000000000..7eb56786379 --- /dev/null +++ b/public/content/translations/bn/contributing/translation-program/resources/index.md @@ -0,0 +1,49 @@ +--- +title: "অনুবাদকদের জন্য রিসোর্স" +lang: bn +description: "ethereum.org অনুবাদকদের জন্য দরকারী রিসোর্স" +--- + +# রিসোর্স {#resources} + +আপনি নিচে ethereum.org অনুবাদকদের জন্য কিছু দরকারী নির্দেশিকা এবং টুলস, সেইসাথে অনুবাদ সম্প্রদায় এবং আপডেট খুঁজে পেতে পারেন। + +## নির্দেশিকা {#guides} + +- [অনুবাদ শৈলী নির্দেশিকা](/contributing/translation-program/translators-guide/) _– ethereum.org অনুবাদকদের জন্য নির্দেশাবলী এবং টিপস_ +- [অনুবাদ সংক্রান্ত প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী (FAQs)](/contributing/translation-program/faq/) _– ethereum.org অনুবাদ প্রোগ্রাম সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্ন এবং উত্তর_ +- [Crowdin অনলাইন এডিটর গাইড](https://support.crowdin.com/online-editor/) _– Crowdin অনলাইন এডিটর ব্যবহার এবং Crowdin-এর কিছু উন্নত বৈশিষ্ট্য ব্যবহারের একটি গভীর নির্দেশিকা_ + +## টুলস {#tools} + +- [Linguee](https://www.linguee.com/) + _– অনুবাদ এবং অভিধানের জন্য একটি সার্চ ইঞ্জিন যা শব্দ বা বাক্যাংশ দ্বারা অনুসন্ধান করতে সক্ষম করে_ +- [Proz term search](https://www.proz.com/search/) + _– বিশেষ পরিভাষার জন্য অনুবাদ অভিধান এবং শব্দকোষের ডেটাবেস_ +- [Eurotermbank](https://www.eurotermbank.com/) + _– ৪২টি ভাষায় ইউরোপীয় পরিভাষার সংগ্রহ_ + +## কমিউনিটি {#communities} + +- [ভাষা-নির্দিষ্ট ডিসকর্ড অনুবাদ গোষ্ঠী](https://discord.gg/ethereum-org) + _– ethereum.org অনুবাদকদের অনুবাদ গোষ্ঠীর সাথে সংযুক্ত করার জন্য একটি উদ্যোগ_ +- [চীনা অনুবাদক গোষ্ঠী](https://www.notion.so/Ethereum-org-05375fe0a94c4214acaf90f42ba40171) + _– চীনা অনুবাদকদের মধ্যে সহজ সমন্বয়ের জন্য নোশন পেজ_ + +## সর্বশেষ আপডেট {#latest-updates} + +সর্বশেষ অনুবাদ প্রোগ্রামের অগ্রগতি সম্পর্কে আপ-টু-ডেট থাকতে, আপনি [Ethereum ফাউন্ডেশন ব্লগ](https://blog.ethereum.org/) অনুসরণ করতে পারেন: + +- [অক্টোবর ২০২১ মাইলস্টোনস আপডেট](https://blog.ethereum.org/2021/10/04/translation-program-update/) +- [ডিসেম্বর ২০২০ মাইলস্টোনস আপডেট](https://blog.ethereum.org/2020/12/21/translation-program-milestones-updates-20/) +- [জুলাই ২০২০ মাইলস্টোনস আপডেট](https://blog.ethereum.org/2020/07/29/ethdotorg-translation-milestone/) +- [আগস্ট ২০১৯ অনুবাদ প্রোগ্রাম লঞ্চ](https://blog.ethereum.org/2019/08/20/translating-ethereum-for-our-global-community/) + +## অনুবাদকদের জন্য অফিস আওয়ার্স {#office-hours} + +আমাদের প্রতি মাসের দ্বিতীয় বুধবারে অনুবাদকদের জন্য অফিস আওয়ার্স আছে। এগুলি [ethereum.org ডিসকর্ড](https://discord.gg/ethereum-org)-এর #office-hours ভয়েস চ্যানেলে অনুষ্ঠিত হয়, যেখানে আপনি সঠিক সময় এবং অতিরিক্ত বিবরণও খুঁজে নিতে পারেন। + +অফিস আওয়ার্স আমাদের অনুবাদকদের অনুবাদ প্রক্রিয়া সম্পর্কে প্রশ্ন জিজ্ঞাসা করতে, প্রোগ্রামের উপর মতামত প্রদান করতে, তাদের ধারণা শেয়ার করতে, বা শুধু মূল ethereum.org দলের সাথে চ্যাট করার সুযোগ দেয়। +অবশেষে, আমরা এই কলগুলি ব্যবহার করে অনুবাদ প্রোগ্রামের সাম্প্রতিক উন্নয়নগুলি জানাতে এবং আমাদের অবদানকারীদের সাথে মূল টিপস এবং নির্দেশাবলী শেয়ার করতে চাই। + +আপনি যদি একজন ethereum.org অনুবাদক হন বা হতে চান, তবে এই সেশনগুলির একটিতে আমাদের সাথে নির্দ্বিধায় যোগ দিন। diff --git a/public/content/translations/bn/contributing/translation-program/translatathon/details/index.md b/public/content/translations/bn/contributing/translation-program/translatathon/details/index.md new file mode 100644 index 00000000000..f95f2686e37 --- /dev/null +++ b/public/content/translations/bn/contributing/translation-program/translatathon/details/index.md @@ -0,0 +1,90 @@ +--- +title: "বিবরণ এবং নিয়ম" +lang: bn +template: translatathon +--- + +![](./participate.png) + +ট্রান্সলেটাথন উন্মুক্ত এবং যে কেউ আবেদনপত্র পূরণ করে এবং Crowdin-এ প্রকল্পে যোগ দিয়ে অংশগ্রহণ করতে পারে। + +অনুবাদকেরা অনুবাদ সময়কালে Crowdin সম্পাদকে তাদের ভাষায় অনুবাদ না করা স্ট্রিংগুলির জন্য অনুবাদের পরামর্শ দিয়ে পয়েন্ট সংগ্রহ করে। + +প্রতিটি অংশগ্রহণকারীর চূড়ান্ত স্কোর নির্ধারিত হয় অনুবাদ সময়কালে তাদের দ্বারা অনুবাদ করা শব্দের সংখ্যা এবং তাদের সংগৃহীত যেকোনো সম্ভাব্য বোনাস পয়েন্টের উপর ভিত্তি করে লিডারবোর্ডে তাদের অবস্থান দ্বারা। + +## শুরু করা যাক {#getting-started} + +অনুবাদ প্রক্রিয়াটি Crowdin-এর ethereum.org প্রকল্পে সঞ্চালিত হয় এবং অনুবাদকেরা ethereum.org ওয়েবসাইটের প্রায় সমস্ত বিষয়বস্তু দিয়ে তৈরি অনুবাদ না করা স্ট্রিংগুলির জন্য তাদের অনুবাদের পরামর্শ দেন। + +অনুবাদগুলি সরাসরি অনলাইন সম্পাদকে পরামর্শ দেওয়া হয় তাই কোনো ফাইল বা ডেলিভারেবল ডাউনলোড বা আপলোড করার প্রয়োজন নেই। প্রতিটি অনুবাদ করা শব্দ ট্র্যাক এবং গণনা করা হয়। + +**১) প্রকল্পে যোগ দিন** + +- অবদান শুরু করতে, [Crowdin-এ ethereum.org প্রকল্পে](https://crowdin.com/project/ethereum-org) যোগ দিন +- আপনাকে সাইন ইন করতে হবে বা একটি অ্যাকাউন্ট তৈরি করতে হবে - এর জন্য শুধুমাত্র একটি ইমেল ঠিকানা এবং পাসওয়ার্ড প্রয়োজন + +**২) আপনার ভাষা নির্বাচন করুন** + +- লক্ষ্য ভাষার তালিকায় আপনার ভাষা খুঁজুন এবং এর নাম বা পতাকায় ক্লিক করে এটি খুলুন +- আপনি যদি এমন কোনো ভাষায় অনুবাদ করতে চান যা উপলব্ধ নয়, তবে Crowdin-এ [Ethereum.org Team](https://crowdin.com/profile/ethdotorg)-এর সাথে যোগাযোগ করুন বা আমাদের translations@ethereum.org-এ একটি ইমেল পাঠান এবং আমরা অনুরোধ অনুযায়ী অতিরিক্ত লক্ষ্য ভাষা যোগ করব + +**৩) একটি অনুবাদ না করা ফাইল খুলুন** + +- অনুবাদ শুরু করতে প্রথম অনুবাদ না করা ফাইলটি খুঁজুন। উৎস ফাইল ধারণকারী ফোল্ডারগুলি অগ্রাধিকারের উপর ভিত্তি করে তৈরি, তাই আপনার প্রথম ফোল্ডারটি অনুবাদ করা শুরু করা উচিত যেখানে অনুবাদ না করা ফাইল রয়েছে +- প্রতিটি ফাইলে একটি অগ্রগতি সূচক রয়েছে যা দেখায় ফাইলের অনুবাদযোগ্য বিষয়বস্তুর কতটা অনুবাদ এবং অনুমোদিত হয়েছে… যদি কোনো ফাইলের অনুবাদের অগ্রগতি ১০০% এর নিচে হয়, অনুগ্রহ করে এটি অনুবাদ করুন + +**৪) অনুবাদ না করা স্ট্রিংগুলি অনুবাদ করুন** + +- আপনি যখন অনুবাদের জন্য একটি ফাইল খুলবেন, নিশ্চিত করুন যে আপনি শুধুমাত্র অনুবাদ না করা স্ট্রিংগুলি অনুবাদ করছেন! +- প্রতিটি স্ট্রিংয়ের একটি স্ট্যাটাস ইনডিকেটর থাকে যা দেখায় এটি _অনূদিত_, _অ-অনূদিত_, নাকি _অনুমোদিত_। যদি কোনো উৎস স্ট্রিংয়ের জন্য আপনার ভাষায় ইতিমধ্যে একটি প্রস্তাবিত অনুবাদ থাকে, তবে এটি অনুবাদ করার প্রয়োজন নেই +- আপনি সম্পাদকে স্ট্রিংগুলি ফিল্টার করে _প্রথমে অ-অনূদিত_ বা _শুধুমাত্র অ-অনূদিত_ দেখাতে পারেন। + +Crowdin সম্পাদক নেভিগেট এবং ব্যবহার করার জন্য একটি বিশদ গাইডের জন্য, আমরা সুপারিশ করি যে সমস্ত ট্রান্সলেটাথন অংশগ্রহণকারীরা আমাদের [কীভাবে অনুবাদ করবেন](/contributing/translation-program/how-to-translate/) গাইডটি পড়ুন। + +আপনি আমাদের [অনুবাদ শৈলী নির্দেশিকা](/contributing/translation-program/translators-guide/) দেখে কিছু টিপস এবং সেরা অনুশীলনগুলিও খুঁজে পেতে পারেন। + +**পয়েন্ট কীভাবে কাজ করে** + +প্রত্যেক ট্রান্সলেটাথন অংশগ্রহণকারী ethereum.org Crowdin প্রকল্প এবং অন্যান্য যোগ্য প্রকল্পে বিষয়বস্তু অনুবাদ করে তাদের চূড়ান্ত স্কোরের জন্য পয়েন্ট অর্জন করবে (যোগ্য প্রকল্পগুলির সম্পূর্ণ তালিকা নীচে উপলব্ধ)। + +স্কোরিং সহজ: **১টি অনূদিত শব্দ = ১ পয়েন্ট** + +আপনার চূড়ান্ত পয়েন্ট বরাদ্দ পেতে, আপনার প্রস্তাবিত অনুবাদগুলিকে মূল্যায়ন প্রক্রিয়াটি পাস করতে হবে, যেখানে পেশাদার পর্যালোচকরা প্রতিটি অংশগ্রহণকারীর অনুবাদগুলি পরীক্ষা করে দেখবেন যাতে তারা ন্যূনতম মানের থ্রেশহোল্ড পূরণ করে এবং এই প্রক্রিয়ায় কোনও মেশিন বা AI অনুবাদ ব্যবহার করা হয়নি। + +## ইকোসিস্টেমের বিষয়বস্তু {#ecosystem-content} + +যেহেতু ethereum.org অনুবাদ প্রোগ্রামটি সব সময় সক্রিয় থাকে, তাই ওয়েবসাইটে কিছু লক্ষ্য ভাষায় অনুবাদের অগ্রগতি অন্যদের তুলনায় উল্লেখযোগ্যভাবে বেশি। + +সমস্ত ট্রান্সলেটাথন অংশগ্রহণকারীদের যাতে যতটা সম্ভব বিষয়বস্তু অনুবাদ করার এবং শীর্ষ পুরস্কারের জন্য প্রতিযোগিতা করার সমান সুযোগ থাকে তা নিশ্চিত করার জন্য, ট্রান্সলেটাথনের অংশ যে উৎস বিষয়বস্তু তা শুধুমাত্র ethereum.org ওয়েবসাইটের বিষয়বস্তুর মধ্যে সীমাবদ্ধ নয়। + +যোগ্য প্রকল্পগুলির যেকোনো একটি অনুবাদকারী অংশগ্রহণকারীরা সমান পরিমাণ পয়েন্ট অর্জন করবে, যেকোনো প্রকল্পে ১টি অনূদিত শব্দ = ১ পয়েন্ট। + +এখানে ২০২৫ ট্রান্সলেটাথনের অংশ সমস্ত যোগ্য প্রকল্পগুলির একটি তালিকা রয়েছে: + +- [Ethereum.org](https://crowdin.com/project/ethereum-org) + +- [Ethereum.org ডেভেলপার টিউটোরিয়াল](https://crowdin.com/project/33388446abbe9d7aa21e42e49bba7f97) + +- [EthStaker ডিপোজিট CLI](https://crowdin.com/project/ethstaker-deposit-cli) + +- [Eth Docker ডক্স](https://crowdin.com/project/eth-docker-docs) + +- [Remix IDE নথিপত্র](https://crowdin.com/project/remix-translation) + +- [Remix LearnEth](https://crowdin.com/project/remix-learneth) + +- [web3.py](https://crowdin.com/project/web3py) + +## মূল্যায়ন প্রক্রিয়া {#evaluation-process} + +সমস্ত অনুবাদগুলি QA এবং প্রতিক্রিয়ার অধীন হবে, যেখানে পেশাদার ভাষাবিদরা গুণমান এবং নির্ভুলতার উপর ভিত্তি করে জমা দেওয়া অনুবাদগুলি মূল্যায়ন করবেন। + +আমরা কিছু টুলস ব্যবহার করে **অ্যান্টি-মেশিন অনুবাদ ব্যবস্থাও** চালাব যা স্বয়ংক্রিয়ভাবে মেশিন বা AI অনুবাদ শনাক্ত করে। + +যদিও অনুবাদের গুণমান স্কোরিংয়ে একটি গুরুত্বপূর্ণ ভূমিকা পালন করবে না, তবে **মেশিন বা AI অনুবাদ ব্যবহারকারী কোনো অংশগ্রহণকারী** বা নিম্ন-মানের এবং ভুল অনুবাদ প্রস্তাবকারীরা পুরস্কারের জন্য যোগ্য হবে না! + +মূল্যায়ন সময়কাল সেপ্টেম্বর জুড়ে চলবে এবং ফলাফল ২৫শে সেপ্টেম্বর ethereum.org কমিউনিটি কলে ঘোষণা করা হবে। + +ওয়েবসাইটে যোগ করার আগে সমস্ত অনুবাদ সম্পূর্ণরূপে পর্যালোচনা করা হবে। + + diff --git a/public/content/translations/bn/contributing/translation-program/translatathon/index.md b/public/content/translations/bn/contributing/translation-program/translatathon/index.md new file mode 100644 index 00000000000..f89f47bf019 --- /dev/null +++ b/public/content/translations/bn/contributing/translation-program/translatathon/index.md @@ -0,0 +1,100 @@ +--- +title: "২০২৫ ethereum.org ট্রান্সলেটাথন" +lang: bn +template: translatathon +--- + + + + + + + +## ভূমিকা {#introduction} + +আমরা বিশ্বাস করি যে ইথেরিয়াম কন্টেন্ট এবং অনবোর্ডিং রিসোর্স প্রত্যেকের জন্য সহজলভ্য হওয়া উচিত, তারা যে ভাষাতেই কথা বলুক না কেন। +এই লক্ষ্যের কাছাকাছি যাওয়ার জন্য, ethereum.org অনুবাদ প্রোগ্রাম হল ওয়েবসাইটটিকে যতটা সম্ভব ভাষায় অনুবাদ করার একটি উদ্যোগ। + +অনুবাদ প্রোগ্রামের অংশ হিসেবে, আমরা ট্রান্সলেটাথনের ৩য় সংস্করণ আয়োজন করছি, যা আমাদের একটি অনুবাদ প্রতিযোগিতা। এর লক্ষ্য হল কম-সক্রিয় ভাষাগুলিতে অনুবাদের অবদানকে উৎসাহিত করা, সাইটে উপলব্ধ ভাষার সংখ্যা এবং কন্টেন্টের পরিমাণ বৃদ্ধি করা, নতুন অবদানকারীদের অনবোর্ড করা এবং আমাদের বিদ্যমানদের পুরস্কৃত করা। + +আপনি যদি ইংরেজি ছাড়া অন্য কোনো ভাষার নেটিভ স্পিকার হন এবং পুরস্কারের জন্য প্রতিযোগিতা করার পাশাপাশি ইথেরিয়াম কন্টেন্টকে আরও সহজলভ্য করতে সাহায্য করতে চান, তাহলে আরও জানতে পড়তে থাকুন! + +[ethereum.org অনুবাদ প্রোগ্রাম সম্পর্কে আরও জানুন](/contributing/translation-program/) + +## সময়রেখা {#timeline} + +২০২৫ ট্রান্সলেটাথনের জন্য গুরুত্বপূর্ণ তারিখগুলি এখানে দেওয়া হল: + + + + + +## অংশগ্রহণ করুন {#participate} + +![সম্প্রদায় এবং গ্লোবের ছবি](./participate.png) + + + +

কারা অংশগ্রহণ করতে পারবেন?

+ ১৮ বছরের বেশি বয়সী যে কেউ, যিনি কমপক্ষে একটি অ-ইংরেজি ভাষার নেটিভ স্পিকার এবং ইংরেজিতে পারদর্শী। +
+ +

আমাকে কি অনুবাদক হতে হবে?

+ না। আপনাকে শুধু দ্বিভাষিক হতে হবে এবং মানুষের করা অনুবাদের পরামর্শ দিতে হবে (মেশিন অনুবাদ ব্যবহার করা নিষিদ্ধ!) আপনার সামর্থ্যের সেরাটা দিয়ে, কোনো পেশাদার অভিজ্ঞতার প্রয়োজন নেই। +
+
+ + + +

আমাকে কতটা সময় দিতে হবে?

+ আপনি যতটা চান। পুরস্কারের জন্য যোগ্য হওয়ার সর্বনিম্ন সীমা হল ১,০০০টি অনূদিত শব্দ, যা সম্পূর্ণ করতে প্রায় ২ ঘন্টা সময় লাগতে পারে, যেখানে শীর্ষ পুরস্কারের জন্য প্রতিযোগিতা করতে আরও বেশি সময় দিতে হবে। +
+ +

আমাকে কি ইথেরিয়াম-এর সাথে পরিচিত হতে হবে?

+ না। যদিও ইথেরিয়ামের সাথে পরিচিতি আপনার উৎপাদনশীলতা এবং গুণমান উন্নত করতে সাহায্য করতে পারে, ট্রান্সলেটাথন একটি শেখার অভিজ্ঞতাও, এবং অংশগ্রহণের সময় ইথেরিয়াম সম্পর্কে আরও জানতে এবং যোগ দিতে সবাইকে আমন্ত্রণ জানানো হচ্ছে। +
+
+ +আরও বিস্তারিত জানতে, [সম্পূর্ণ শর্তাবলী দেখুন](/contributing/translation-program/translatathon/terms-and-conditions) + +### ধাপে ধাপে নির্দেশাবলী {#step-by-step-instructions} + + + +## পুরস্কার {#prizes} + +| স্থান | পুরস্কারের পরিমাণ | +| ------------------- | ----------------- | +| প্রথম স্থান | $৪০০০ | +| দ্বিতীয় স্থান | $২৫০০ | +| তৃতীয় স্থান | $১৫০০ | +| চতুর্থ স্থান | $১১০০ | +| পঞ্চম স্থান | $১০০০ | +| ষষ্ঠ স্থান | $৬০০ | +| সপ্তম স্থান | $৫৫০ | +| অষ্টম স্থান | $৫০০ | +| নবম স্থান | $৪৫০ | +| দশম স্থান | $৪০০ | +| ১১তম - ২০তম স্থান | $২৪০ | +| ২১তম - ৫০তম স্থান | $১২০ | +| ৫১তম - ১০০তম স্থান | $৬০ | +| ১০১তম - ১৫০তম স্থান | $৪০ | +| বাকিরা | $২০ | + +সমস্ত পুরস্কার ETH-এ প্রদান করা হবে। + + + + diff --git a/public/content/translations/bn/contributing/translation-program/translators-guide/index.md b/public/content/translations/bn/contributing/translation-program/translators-guide/index.md new file mode 100644 index 00000000000..aef23473862 --- /dev/null +++ b/public/content/translations/bn/contributing/translation-program/translators-guide/index.md @@ -0,0 +1,299 @@ +--- +title: "অনুবাদকদের নির্দেশিকা" +lang: bn +description: "ethereum.org অনুবাদকদের জন্য নির্দেশাবলী এবং টিপস" +--- + +# Ethereum.org অনুবাদ শৈলী নির্দেশিকা {#style-guide} + +ethereum.org অনুবাদ শৈলী নির্দেশিকাতে অনুবাদকদের জন্য সবচেয়ে গুরুত্বপূর্ণ কিছু নির্দেশিকা, নির্দেশাবলী এবং টিপস রয়েছে, যা আমাদের ওয়েবসাইটটিকে স্থানীয়করণ করতে সাহায্য করে। + +এই নথিটি একটি সাধারণ নির্দেশিকা হিসাবে কাজ করে এবং কোনো একটি নির্দিষ্ট ভাষার জন্য নির্দিষ্ট নয়। + +আপনার যদি কোনো প্রশ্ন, পরামর্শ বা মতামত থাকে, তাহলে নির্দ্বিধায় আমাদের সাথে translations@ethereum.org-এ যোগাযোগ করুন, Crowdin-এ @ethdotorg-কে একটি বার্তা পাঠান, অথবা [আমাদের Discord-এ যোগ দিন](https://discord.gg/ethereum-org), যেখানে আপনি #translations চ্যানেলে আমাদের বার্তা পাঠাতে পারেন বা দলের কোনো সদস্যের সাথে যোগাযোগ করতে পারেন। + +## Crowdin ব্যবহার করা {#using-crowdin} + +Crowdin-এ প্রকল্পে কীভাবে যোগদান করতে হয় এবং Crowdin অনলাইন এডিটর কীভাবে ব্যবহার করতে হয় তার প্রাথমিক নির্দেশাবলী আপনি [অনুবাদ প্রোগ্রাম পৃষ্ঠা](/contributing/translation-program/#how-to-translate)-তে পেতে পারেন। + +আপনি যদি Crowdin এবং এর কিছু উন্নত বৈশিষ্ট্য ব্যবহার সম্পর্কে আরও জানতে চান, তাহলে [Crowdin নলেজ বেস](https://support.crowdin.com/online-editor/)-এ Crowdin-এর সমস্ত কার্যকারিতার অনেক গভীর নির্দেশিকা এবং সংক্ষিপ্ত বিবরণ রয়েছে। + +## বার্তার সারমর্ম উপলব্ধি করা {#capturing-the-essence} + +ethereum.org বিষয়বস্তু অনুবাদ করার সময়, আক্ষরিক অনুবাদ এড়িয়ে চলুন। + +অনুবাদগুলি যাতে বার্তার সারমর্ম উপলব্ধি করে তা গুরুত্বপূর্ণ। এর অর্থ হতে পারে নির্দিষ্ট বাক্যাংশের পুনর্গঠন করা, বা শব্দে শব্দে বিষয়বস্তু অনুবাদ করার পরিবর্তে বর্ণনামূলক অনুবাদ ব্যবহার করা। + +বিভিন্ন ভাষার বিভিন্ন ব্যাকরণের নিয়ম, প্রথা এবং শব্দক্রম থাকে। অনুবাদ করার সময়, লক্ষ্য ভাষায় বাক্যগুলি কীভাবে গঠিত হয় সেদিকে খেয়াল রাখুন এবং ইংরেজি উৎসটির আক্ষরিক অনুবাদ এড়িয়ে চলুন, কারণ এটি দুর্বল বাক্য গঠন এবং পাঠযোগ্যতার দিকে নিয়ে যেতে পারে। + +উৎস পাঠ্যটি শব্দে শব্দে অনুবাদ করার পরিবর্তে, আপনাকে সম্পূর্ণ বাক্যটি পড়তে এবং লক্ষ্য ভাষার প্রথাগুলির সাথে খাপ খাইয়ে নিতে এটি মানিয়ে নেওয়ার পরামর্শ দেওয়া হচ্ছে। + +## আনুষ্ঠানিক বনাম অনানুষ্ঠানিক {#formal-vs-informal} + +আমরা সম্বোধনের আনুষ্ঠানিক রূপ ব্যবহার করি, যা সর্বদা ভদ্র এবং সমস্ত দর্শকদের জন্য উপযুক্ত। + +আনুষ্ঠানিক সম্বোধন ব্যবহার করা আমাদের অনানুষ্ঠানিক বা আপত্তিকর শোনা এড়াতে সাহায্য করে এবং দর্শকের বয়স এবং লিঙ্গ নির্বিশেষে কাজ করে। + +বেশিরভাগ ইন্দো-ইউরোপীয় এবং আফ্রো-এশিয়াটিক ভাষায় লিঙ্গ-নির্দিষ্ট দ্বিতীয়-পুরুষ ব্যক্তিগত সর্বনাম ব্যবহার করা হয়, যা পুরুষ এবং মহিলার মধ্যে পার্থক্য করে। ব্যবহারকারীকে সম্বোধন করার সময় বা স্বত্বসূচক সর্বনাম ব্যবহার করার সময়, আমরা দর্শকের লিঙ্গ অনুমান করা এড়াতে পারি, কারণ সম্বোধনের আনুষ্ঠানিক রূপটি সাধারণত প্রযোজ্য এবং সামঞ্জস্যপূর্ণ, তারা কীভাবে নিজেদের পরিচয় দেয় তা নির্বিশেষে। + +## সহজ ও স্পষ্ট শব্দভান্ডার এবং অর্থ {#simple-vocabulary} + +আমাদের লক্ষ্য হলো ওয়েবসাইটের বিষয়বস্তুকে যত বেশি সম্ভব মানুষের কাছে বোধগম্য করে তোলা। + +বেশিরভাগ ক্ষেত্রে, সহজে বোঝা যায় এমন সংক্ষিপ্ত এবং সহজ শব্দ ব্যবহার করে এটি সহজেই অর্জন করা যায়। যদি আপনার ভাষায় একটি নির্দিষ্ট শব্দের একই অর্থ সহ একাধিক সম্ভাব্য অনুবাদ থাকে, তাহলে সবচেয়ে ভালো বিকল্পটি প্রায়শই সবচেয়ে সংক্ষিপ্ত শব্দটি হয় যা স্পষ্টভাবে অর্থ প্রতিফলিত করে। + +## লিখন পদ্ধতি {#writing-system} + +Ethereum.org লাতিনের বিকল্প লিখন পদ্ধতি (বা লিখন লিপি) ব্যবহার করে বেশ কয়েকটি ভাষায় উপলব্ধ। + +সমস্ত বিষয়বস্তু আপনার ভাষার জন্য সঠিক লিখন পদ্ধতি ব্যবহার করে অনুবাদ করা উচিত এবং লাতিন অক্ষর ব্যবহার করে লেখা কোনো শব্দ অন্তর্ভুক্ত করা উচিত নয়। + +বিষয়বস্তু অনুবাদ করার সময়, আপনার নিশ্চিত করা উচিত যে অনুবাদগুলি সামঞ্জস্যপূর্ণ এবং কোনো লাতিন অক্ষর অন্তর্ভুক্ত করে না। + +একটি সাধারণ ভুল ধারণা হল যে Ethereum সর্বদা লাতিন ভাষায় লেখা উচিত। এটি বেশিরভাগই ভুল, অনুগ্রহ করে আপনার ভাষার স্থানীয় Ethereum বানান ব্যবহার করুন (যেমন, চীনা ভাষায় 以太坊, আরবিতে إيثيريوم, ইত্যাদি)। + +**উপরেরটি সেইসব ভাষার ক্ষেত্রে প্রযোজ্য নয়, যেখানে একটি নিয়ম হিসাবে বিশেষ্য নাম অনুবাদ করা উচিত নয়।** + +## পৃষ্ঠার মেটাডেটা অনুবাদ করা {#translating-metadata} + +কিছু পৃষ্ঠায় পৃষ্ঠার মেটাডেটা থাকে, যেমন 'title', 'lang', 'description', 'sidebar', ইত্যাদি। + +Crowdin-এ নতুন পৃষ্ঠা আপলোড করার সময় আমরা সেইসব বিষয়বস্তু লুকিয়ে রাখি যা অনুবাদকদের কখনই অনুবাদ করা উচিত নয়, যার মানে হল Crowdin-এ অনুবাদকদের কাছে দৃশ্যমান সমস্ত মেটাডেটা অনুবাদ করা উচিত। + +উৎস পাঠ্য 'en' হলে কোনো স্ট্রিং অনুবাদ করার সময় দয়া করে বিশেষভাবে খেয়াল রাখুন। এটি সেই ভাষাটিকে প্রতিনিধিত্ব করে যেটিতে পৃষ্ঠাটি উপলব্ধ এবং এটিকে [আপনার ভাষার জন্য ISO ভাষা কোড](https://www.andiamo.co.uk/resources/iso-language-codes/)-এ অনুবাদ করা উচিত। এই স্ট্রিংগুলি সর্বদা লাতিন অক্ষর ব্যবহার করে অনুবাদ করা উচিত, লক্ষ্য ভাষার স্থানীয় লিখন লিপি ব্যবহার করে নয়। + +কোন ভাষা কোডটি ব্যবহার করবেন সে সম্পর্কে আপনি যদি অনিশ্চিত হন, তাহলে আপনি Crowdin-এ অনুবাদ মেমরি পরীক্ষা করতে পারেন বা Crowdin অনলাইন সম্পাদকে পৃষ্ঠার URL-এ আপনার ভাষার জন্য ভাষা কোডটি খুঁজে পেতে পারেন। + +সবচেয়ে বহুল ব্যবহৃত ভাষাগুলির জন্য ভাষা কোডের কিছু উদাহরণ: + +- আরবি - ar +- চীনা সরলীকৃত - zh +- ফরাসি - fr +- হিন্দি - hi +- স্প্যানিশ - es + +## বহিরাগত নিবন্ধের শিরোনাম {#external-articles} + +কিছু স্ট্রিং-এ বহিরাগত নিবন্ধের শিরোনাম থাকে। আমাদের বেশিরভাগ ডেভেলপার ডকুমেন্টেশন পৃষ্ঠায় আরও পড়ার জন্য বহিরাগত নিবন্ধের লিঙ্ক রয়েছে। নিবন্ধের শিরোনামযুক্ত স্ট্রিংগুলি অনুবাদ করা প্রয়োজন, নিবন্ধটির ভাষা নির্বিশেষে, যাতে তাদের ভাষায় পৃষ্ঠাটি দেখা দর্শকদের জন্য আরও সামঞ্জস্যপূর্ণ ব্যবহারকারীর অভিজ্ঞতা নিশ্চিত করা যায়। + +অনুবাদকদের জন্য এই স্ট্রিংগুলি কেমন দেখতে এবং কীভাবে সেগুলি শনাক্ত করতে হয় তার কিছু উদাহরণ নীচে খুঁজে পেতে পারেন (নিবন্ধগুলির লিঙ্ক বেশিরভাগই এই পৃষ্ঠাগুলির নীচে, 'আরও পড়ুন' বিভাগে পাওয়া যাবে): + +![সাইডবারে নিবন্ধের শিরোনাম.png](./article-titles-in-sidebar.png) +![সম্পাদকে নিবন্ধের শিরোনাম.png](./article-titles-in-editor.png) + +## Crowdin সতর্কতা {#crowdin-warnings} + +Crowdin-এর একটি অন্তর্নির্মিত বৈশিষ্ট্য রয়েছে যা অনুবাদকদের ভুল করতে যাওয়ার সময় সতর্ক করে। আপনি যদি উৎস থেকে কোনো ট্যাগ অন্তর্ভুক্ত করতে ভুলে যান, এমন উপাদান অনুবাদ করেন যা অনুবাদ করা উচিত নয়, পরপর বেশ কয়েকটি স্পেস যোগ করেন, শেষ যতিচিহ্ন ভুলে যান, ইত্যাদি ক্ষেত্রে Crowdin আপনার অনুবাদ সংরক্ষণ করার আগে স্বয়ংক্রিয়ভাবে আপনাকে এই বিষয়ে সতর্ক করবে। +আপনি যদি এই ধরনের কোনো সতর্কতা দেখেন, অনুগ্রহ করে ফিরে যান এবং প্রস্তাবিত অনুবাদটি দুবার পরীক্ষা করুন। + +**এই সতর্কতাগুলিকে কখনই উপেক্ষা করবেন না, কারণ এগুলির অর্থ সাধারণত কিছু ভুল আছে, বা অনুবাদে উৎস পাঠ্যের একটি মূল অংশ অনুপস্থিত।** + +আপনি যখন আপনার অনুবাদে একটি ট্যাগ যোগ করতে ভুলে যান তখন একটি Crowdin সতর্কতার উদাহরণ: +![একটি Crowdin সতর্কতার উদাহরণ](./crowdin-warning-example.png) + +## ট্যাগ এবং কোড স্নিপেট নিয়ে কাজ করা {#dealing-with-tags} + +উৎস বিষয়বস্তুর অনেকগুলিতে ট্যাগ এবং ভেরিয়েবল রয়েছে, যা Crowdin সম্পাদকে হলুদ রঙে হাইলাইট করা হয়। এগুলি বিভিন্ন ফাংশন পরিবেশন করে এবং সঠিকভাবে ব্যবহার করা উচিত। + +**Crowdin সেটিংস** + +ট্যাগ পরিচালনা করা এবং উৎস থেকে সরাসরি সেগুলি অনুলিপি করা সহজ করার জন্য, আমরা Crowdin সম্পাদকে আপনার সেটিংস পরিবর্তন করার পরামর্শ দিই। + +1. সেটিংস খুলুন + ![সম্পাদক-এ কীভাবে সেটিংস খুলতে হয়](./editor-settings.png) + +2. 'HTML tags displaying' বিভাগে নিচে স্ক্রোল করুন + +3. 'Hide' নির্বাচন করুন + ![অনুগ্রহ করে 'Hide' নির্বাচন করুন](./hide-tags.png) + +4. 'Save'-এ ক্লিক করুন + +এই বিকল্পটি নির্বাচন করলে, সম্পূর্ণ ট্যাগ টেক্সট আর দেখানো হবে না এবং একটি সংখ্যা দ্বারা প্রতিস্থাপিত হবে। +অনুবাদ করার সময়, এই ট্যাগটিতে ক্লিক করলে স্বয়ংক্রিয়ভাবে সঠিক ট্যাগটি অনুবাদ ফিল্ডে অনুলিপি হয়ে যাবে। + +**লিঙ্ক** + +আপনি ethereum.org বা অন্যান্য ওয়েবসাইটের পৃষ্ঠাগুলির সম্পূর্ণ লিঙ্ক লক্ষ্য করতে পারেন। + +এগুলি উৎসের অনুরূপ হওয়া উচিত এবং পরিবর্তন বা অনুবাদ করা উচিত নয়। আপনি যদি একটি লিঙ্ক অনুবাদ করেন বা এটিকে কোনোভাবে পরিবর্তন করেন, এমনকি এর একটি অংশ, যেমন একটি স্ল্যাশ (/) সরিয়ে দেন, তবে এটি ভাঙা এবং অব্যবহারযোগ্য লিঙ্কের দিকে নিয়ে যাবে। + +লিঙ্কগুলি পরিচালনা করার সর্বোত্তম উপায় হল উৎস থেকে সরাসরি সেগুলি অনুলিপি করা, হয় সেগুলিতে ক্লিক করে অথবা ‘Copy Source’ বোতাম (Alt+C) ব্যবহার করে। + +![লিঙ্কের উদাহরণ.png](./example-of-link.png) + +লিঙ্কগুলি উৎস পাঠ্যে ট্যাগের আকারেও উপস্থিত হয় (অর্থাৎ, `<0>` ``)। আপনি যদি ট্যাগটির উপর হোভার করেন, সম্পাদক এর সম্পূর্ণ বিষয়বস্তু দেখাবে - কখনও কখনও এই ট্যাগগুলি লিঙ্কগুলিকে প্রতিনিধিত্ব করবে। + +উৎস থেকে লিঙ্কগুলি অনুলিপি করা এবং তাদের ক্রম পরিবর্তন না করা খুবই গুরুত্বপূর্ণ। + +ট্যাগগুলির ক্রম পরিবর্তন করা হলে, তারা যে লিঙ্কটিকে প্রতিনিধিত্ব করে তা ভেঙে যাবে। + +![ট্যাগের ভিতরে লিঙ্কের উদাহরণ.png](./example-of-links-inside-tags.png) + +**ট্যাগ এবং ভেরিয়েবল** + +উৎস পাঠ্যে বিভিন্ন ধরণের ট্যাগ রয়েছে, যা সর্বদা উৎস থেকে অনুলিপি করা উচিত এবং কখনই পরিবর্তন করা উচিত নয়। উপরের মতো একইভাবে, অনুবাদের মধ্যে এই ট্যাগগুলির ক্রমও উৎসের মতো একই থাকা উচিত। + +ট্যাগগুলিতে সর্বদা একটি খোলার এবং বন্ধ করার ট্যাগ থাকে। বেশিরভাগ ক্ষেত্রে, খোলার এবং বন্ধ করার ট্যাগের মধ্যবর্তী পাঠ্য অনুবাদ করা উচিত। + +উদাহরণ: ``বিকেন্দ্রীভূত`` + +`` - _খোলার ট্যাগ যা পাঠ্যকে বোল্ড করে_ + +বিকেন্দ্রীভূত - _অনুবাদযোগ্য পাঠ্য_ + +`` - _বন্ধ করার ট্যাগ_ + +![‘strong’ ট্যাগের উদাহরণ.png](./example-of-strong-tags.png) + +কোড স্নিপেটগুলিকে অন্যান্য ট্যাগগুলির থেকে কিছুটা ভিন্নভাবে দেখা উচিত, কারণ সেগুলিতে এমন কোড থাকে যা অনুবাদ করা উচিত নয়। + +উদাহরণ: ``nonce`` + +`` - _খোলার ট্যাগ, যাতে একটি কোড স্নিপেট থাকে_ + +nonce - _অনুবাদযোগ্য নয় এমন পাঠ্য_ + +`` - _বন্ধ করার ট্যাগ_ + +![কোড স্নিপেটের উদাহরণ.png](./example-of-code-snippets.png) + +উৎস পাঠ্যে সংক্ষিপ্ত ট্যাগও থাকে, যেগুলিতে কেবল সংখ্যা থাকে, যার অর্থ হল তাদের কার্যকারিতা অবিলম্বে স্পষ্ট নয়। এগুলি ঠিক কোন কার্যকারিতা পরিবেশন করে তা দেখতে আপনি এই ট্যাগগুলির উপর হোভার করতে পারেন। + +নীচের উদাহরণে, আপনি দেখতে পারেন যে `<0>` ট্যাগটির উপর হোভার করলে দেখা যায় যে এটি `` প্রতিনিধিত্ব করে এবং একটি কোড স্নিপেট ধারণ করে, তাই এই ট্যাগগুলির ভিতরের বিষয়বস্তু অনুবাদ করা উচিত নয়। + +![অস্পষ্ট ট্যাগের উদাহরণ.png](./example-of-ambiguous-tags.png) + +## সংক্ষিপ্ত বনাম পূর্ণ রূপ/সংক্ষেপণ {#short-vs-full-forms} + +ওয়েবসাইটে প্রচুর সংক্ষেপণ ব্যবহৃত হয়, যেমন, ডিএ্যাপস, NFT, DAO, DeFi, ইত্যাদি। এই সংক্ষেপণগুলি সাধারণত ইংরেজিতে ব্যবহৃত হয় এবং ওয়েবসাইটের বেশিরভাগ দর্শক এগুলির সাথে পরিচিত। + +যেহেতু তাদের সাধারণত অন্যান্য ভাষায় প্রতিষ্ঠিত অনুবাদ থাকে না, তাই এই এবং অনুরূপ পদগুলির প্রতি দৃষ্টিভঙ্গির সেরা উপায় হলো পূর্ণ রূপের একটি বর্ণনামূলক অনুবাদ প্রদান করা এবং বন্ধনীতে ইংরেজি সংক্ষেপণ যোগ করা। + +এই সংক্ষেপণগুলি অনুবাদ করবেন না, কারণ বেশিরভাগ মানুষ এগুলির সাথে পরিচিত হবে না এবং স্থানীয় সংস্করণগুলি বেশিরভাগ দর্শকের কাছে তেমন কোনো অর্থ বহন করবে না। + +কীভাবে ডিএ্যাপস অনুবাদ করতে হয় তার উদাহরণ: + +- ডিসেন্ট্রালাইজড এপ্লিকেশন (ডিএ্যাপস) → _অনূদিত পূর্ণ রূপ (বন্ধনীতে ইংরেজি সংক্ষেপণ)_ + +## প্রতিষ্ঠিত অনুবাদ ছাড়া শর্তাবলী {#terms-without-established-translations} + +কিছু পদের অন্যান্য ভাষায় প্রতিষ্ঠিত অনুবাদ নাও থাকতে পারে, এবং মূল ইংরেজি পদ দ্বারা ব্যাপকভাবে পরিচিত। এই ধরনের পদগুলির মধ্যে বেশিরভাগই নতুন ধারণা অন্তর্ভুক্ত করে, যেমন প্রুফ-অফ-ওয়ার্ক, প্রুফ-অফ-স্টেক, বিকন চেইন, স্টেকিং, ইত্যাদি। + +যদিও এই পদগুলি অনুবাদ করা অস্বাভাবিক শোনাতে পারে, কারণ ইংরেজি সংস্করণটি সাধারণত অন্যান্য ভাষাতেও ব্যবহৃত হয়, তবুও এগুলি অনুবাদ করার জন্য অত্যন্ত সুপারিশ করা হয়। + +এগুলি অনুবাদ করার সময়, সৃজনশীল হতে, বর্ণনামূলক অনুবাদ ব্যবহার করতে বা কেবল আক্ষরিকভাবে অনুবাদ করতে দ্বিধা বোধ করবেন না। + +**বেশিরভাগ পদ ইংরেজিতে কিছু রেখে দেওয়ার পরিবর্তে অনুবাদ করা উচিত তার কারণ হল এই নতুন পরিভাষা ভবিষ্যতে আরও ব্যাপক হয়ে উঠবে, কারণ আরও বেশি লোক ইথেরিয়াম এবং সম্পর্কিত প্রযুক্তি ব্যবহার করা শুরু করবে।** **যদি আমরা সারা বিশ্ব থেকে আরও বেশি লোককে এই ক্ষেত্রে আনতে চাই, তবে আমাদের যতটা সম্ভব ভাষায় বোধগম্য পরিভাষা সরবরাহ করতে হবে, এমনকি যদি আমাদের নিজেদেরই এটি তৈরি করতে হয়।** + +## বোতাম এবং CTA {#buttons-and-ctas} + +ওয়েবসাইটে অসংখ্য বোতাম রয়েছে, যা অন্যান্য বিষয়বস্তু থেকে ভিন্নভাবে অনুবাদ করা উচিত। + +বোতামের পাঠ্যটি বেশিরভাগ স্ট্রিংয়ের সাথে সংযুক্ত প্রসঙ্গের স্ক্রিনশট দেখে, অথবা সম্পাদকে প্রসঙ্গটি পরীক্ষা করে চিহ্নিত করা যেতে পারে, যার মধ্যে ‘’button’’ শব্দটি অন্তর্ভুক্ত রয়েছে। + +ফরম্যাটিংয়ের অমিল রোধ করতে বোতামের জন্য অনুবাদগুলি যতটা সম্ভব সংক্ষিপ্ত হওয়া উচিত। উপরন্তু, বোতামের অনুবাদগুলি আবশ্যিক হওয়া উচিত, অর্থাৎ, একটি আদেশ বা অনুরোধ উপস্থাপন করা। + +![কীভাবে একটি বোতাম খুঁজে বের করতে হয়.png](./how-to-find-a-button.png) + +## অন্তর্ভুক্তির জন্য অনুবাদ করা {#translating-for-inclusivity} + +Ethereum.org-এর দর্শকরা সারা বিশ্ব এবং বিভিন্ন পটভূমি থেকে আসেন। অতএব ওয়েবসাইটের ভাষা নিরপেক্ষ, সকলের জন্য স্বাগতপূর্ণ এবং বর্জনীয় নয় হওয়া উচিত। + +এর একটি গুরুত্বপূর্ণ দিক হল লিঙ্গ নিরপেক্ষতা। এটি সম্বোধনের আনুষ্ঠানিক রূপ ব্যবহার করে এবং অনুবাদে কোনো লিঙ্গ-নির্দিষ্ট শব্দ এড়িয়ে সহজেই অর্জন করা যেতে পারে। + +অন্তর্ভুক্তির আরেকটি রূপ হল কোনো নির্দিষ্ট দেশ, জাতি বা অঞ্চলের জন্য নির্দিষ্ট না হয়ে বিশ্বব্যাপী দর্শকদের জন্য অনুবাদ করার চেষ্টা করা। + +অবশেষে, ভাষাটি সমস্ত দর্শক এবং বয়সের জন্য উপযুক্ত হওয়া উচিত। + +## ভাষা-নির্দিষ্ট অনুবাদ {#language-specific-translations} + +অনুবাদ করার সময়, উৎস থেকে অনুলিপি করার পরিবর্তে আপনার ভাষায় ব্যবহৃত ব্যাকরণের নিয়ম, প্রথা এবং বিন্যাস অনুসরণ করা গুরুত্বপূর্ণ। উৎস পাঠ্য ইংরেজি ব্যাকরণের নিয়ম এবং প্রথা অনুসরণ করে, যা অন্যান্য অনেক ভাষার ক্ষেত্রে প্রযোজ্য নয়। + +আপনার ভাষার নিয়ম সম্পর্কে আপনার সচেতন হওয়া উচিত এবং সেই অনুযায়ী অনুবাদ করা উচিত। আপনার যদি সাহায্যের প্রয়োজন হয়, আমাদের সাথে যোগাযোগ করুন এবং আমরা আপনাকে আপনার ভাষায় এই উপাদানগুলি কীভাবে ব্যবহার করা উচিত সে সম্পর্কে কিছু রিসোর্স খুঁজে পেতে সাহায্য করব। + +বিশেষভাবে কী বিষয়ে খেয়াল রাখতে হবে তার কিছু উদাহরণ: + +### যতিচিহ্ন, বিন্যাস {#punctuation-and-formatting} + +**ক্যাপিটালাইজেশন** + +- বিভিন্ন ভাষায় ক্যাপিটালাইজেশনে ব্যাপক পার্থক্য রয়েছে। +- ইংরেজিতে, শিরোনাম এবং নাম, মাস এবং দিন, ভাষার নাম, ছুটির দিন ইত্যাদিতে সমস্ত শব্দ বড় হাতের অক্ষরে লেখা সাধারণ। অন্যান্য অনেক ভাষায়, এটি ব্যাকরণগতভাবে ভুল, কারণ তাদের ক্যাপিটালাইজেশনের নিয়ম ভিন্ন। +- কিছু ভাষায় ব্যক্তিগত সর্বনাম, বিশেষ্য এবং নির্দিষ্ট বিশেষণ বড় হাতের অক্ষরে লেখার নিয়মও রয়েছে, যা ইংরেজিতে বড় হাতের অক্ষরে লেখা হয় না। + +**স্পেসিং** + +- অর্থোগ্রাফি নিয়ম প্রতিটি ভাষার জন্য স্পেসের ব্যবহার নির্ধারণ করে। যেহেতু স্পেস সর্বত্র ব্যবহৃত হয়, তাই এই নিয়মগুলি সবচেয়ে স্বতন্ত্র কিছু, এবং স্পেসগুলি সবচেয়ে ভুল অনুবাদিত উপাদানগুলির মধ্যে কিছু। +- ইংরেজি এবং অন্যান্য ভাষার মধ্যে স্পেসিংয়ের কিছু সাধারণ পার্থক্য: + - পরিমাপের একক এবং মুদ্রার আগে স্পেস (যেমন, USD, EUR, kB, MB) + - ডিগ্রি চিহ্নের আগে স্পেস (যেমন, °C, ℉) + - কিছু যতিচিহ্নের আগে স্পেস, বিশেষ করে এলিপসিস (…) + - স্ল্যাশের (/) আগে এবং পরে স্পেস + +**তালিকা** + +- প্রতিটি ভাষায় তালিকা লেখার জন্য একটি বৈচিত্র্যময় এবং জটিল নিয়মাবলী রয়েছে। এগুলি ইংরেজি থেকে উল্লেখযোগ্যভাবে ভিন্ন হতে পারে। +- কিছু ভাষায়, প্রতিটি নতুন লাইনের প্রথম শব্দটি বড় হাতের অক্ষরে লেখা প্রয়োজন, যেখানে অন্যগুলিতে, নতুন লাইন ছোট হাতের অক্ষর দিয়ে শুরু হওয়া উচিত। অনেক ভাষায় তালিকার মধ্যে ক্যাপিটালাইজেশন সম্পর্কে ভিন্ন নিয়মও রয়েছে, যা প্রতিটি লাইনের দৈর্ঘ্যের উপর নির্ভর করে। +- লাইন আইটেমের যতিচিহ্নের ক্ষেত্রেও একই কথা প্রযোজ্য। তালিকায় শেষ যতিচিহ্ন একটি পিরিয়ড (.), কমা (,), বা সেমিকোলন (;) হতে পারে, যা ভাষার উপর নির্ভর করে। + +**উদ্ধৃতি চিহ্ন** + +- ভাষাগুলিতে বিভিন্ন উদ্ধৃতি চিহ্ন ব্যবহৃত হয়। উৎস থেকে ইংরেজি উদ্ধৃতি চিহ্নগুলি কেবল অনুলিপি করা প্রায়শই ভুল। +- সবচেয়ে সাধারণ ধরণের কিছু উদ্ধৃতি চিহ্নের মধ্যে রয়েছে: + - „উদাহরণ পাঠ্য“ + - ‚উদাহরণ পাঠ্য’ + - »উদাহরণ পাঠ্য« + - “উদাহরণ পাঠ্য” + - ‘উদাহরণ পাঠ্য’ + - «উদাহরণ পাঠ্য» + +**হাইফেন এবং ড্যাশ** + +- ইংরেজিতে, একটি হাইফেন (-) শব্দ বা একটি শব্দের বিভিন্ন অংশ যোগ করতে ব্যবহৃত হয়, যখন একটি ড্যাশ (–) একটি পরিসর বা একটি বিরতি নির্দেশ করতে ব্যবহৃত হয়। +- অনেক ভাষায় হাইফেন এবং ড্যাশ ব্যবহারের জন্য ভিন্ন নিয়ম রয়েছে যা পালন করা উচিত। + +### ফরম্যাট {#formats} + +**সংখ্যা** + +- বিভিন্ন ভাষায় সংখ্যা লেখার প্রধান পার্থক্য হল দশমিক এবং হাজারের জন্য ব্যবহৃত বিভাজক। হাজারের জন্য, এটি একটি পিরিয়ড, কমা বা স্পেস হতে পারে। একইভাবে, কিছু ভাষায় দশমিক বিন্দু ব্যবহার করা হয়, আবার অন্যগুলিতে দশমিক কমা ব্যবহার করা হয়। + - বড় সংখ্যার কিছু উদাহরণ: + - ইংরেজি – **1,000.50** + - স্প্যানিশ – **1.000,50** + - ফরাসি – **1 000,50** +- সংখ্যা অনুবাদ করার সময় আরেকটি গুরুত্বপূর্ণ বিষয় হল শতাংশ চিহ্ন। এটি বিভিন্ন উপায়ে লেখা যেতে পারে: **100%**, **100 %** বা **%100**। +- অবশেষে, ভাষার উপর নির্ভর করে ঋণাত্মক সংখ্যাগুলি ভিন্নভাবে প্রদর্শিত হতে পারে: -100, 100-, (100) বা [100]। + +**তারিখ** + +- তারিখ অনুবাদ করার সময়, ভাষার উপর ভিত্তি করে বেশ কিছু বিবেচ্য বিষয় এবং পার্থক্য রয়েছে। এর মধ্যে রয়েছে তারিখের বিন্যাস, বিভাজক, ক্যাপিটালাইজেশন এবং লিডিং জিরো। পূর্ণ-দৈর্ঘ্য এবং সংখ্যাসূচক তারিখের মধ্যেও পার্থক্য রয়েছে। + - বিভিন্ন তারিখ বিন্যাসের কিছু উদাহরণ: + - ইংরেজি ইউকে (dd/mm/yyyy) – 1লা জানুয়ারী, 2022 + - ইংরেজি ইউএস (mm/dd/yyyy) – জানুয়ারী 1, 2022 + - চীনা (yyyy-mm-dd) – 2022 年 1 月 1 日 + - ফরাসি (dd/mm/yyyy) – 1er janvier 2022 + - ইতালীয় (dd/mm/yyyy) – 1º gennaio 2022 + - জার্মান (dd/mm/yyyy) – 1. জানুয়ার 2022 + +**মুদ্রা** + +- বিভিন্ন বিন্যাস, প্রথা এবং রূপান্তরের কারণে মুদ্রা অনুবাদ করা চ্যালেঞ্জিং হতে পারে। একটি সাধারণ নিয়ম হিসাবে, অনুগ্রহ করে মুদ্রাগুলিকে উৎসের মতোই রাখুন। পাঠকের সুবিধার জন্য আপনি বন্ধনীতে আপনার স্থানীয় মুদ্রা এবং রূপান্তর যোগ করতে পারেন। +- বিভিন্ন ভাষায় মুদ্রা লেখার প্রধান পার্থক্যগুলির মধ্যে রয়েছে প্রতীকের স্থান, দশমিক কমা বনাম দশমিক বিন্দু, স্পেসিং এবং সংক্ষেপণ বনাম প্রতীক। + - প্রতীকের স্থান: $100 বা 100$ + - দশমিক কমা বনাম দশমিক বিন্দু: 100,50$ বা 100.50$ + - স্পেসিং: 100$ বা 100 $ + - সংক্ষেপণ বনাম প্রতীক: 100 $ বা 100 USD + +**পরিমাপের একক** + +- একটি সাধারণ নিয়ম হিসাবে, অনুগ্রহ করে পরিমাপের এককগুলি উৎস অনুযায়ী রাখুন। যদি আপনার দেশ একটি ভিন্ন সিস্টেম ব্যবহার করে, আপনি বন্ধনীতে রূপান্তর অন্তর্ভুক্ত করতে পারেন। +- পরিমাপের এককগুলির স্থানীয়করণ ছাড়াও, ভাষাগুলি এই এককগুলির প্রতি কীভাবে দৃষ্টিভঙ্গি রাখে তার পার্থক্যগুলিও লক্ষ্য করা গুরুত্বপূর্ণ। প্রধান পার্থক্য হল সংখ্যা এবং এককের মধ্যে স্পেসিং, যা ভাষার উপর ভিত্তি করে ভিন্ন হতে পারে। এর উদাহরণগুলির মধ্যে রয়েছে 100kB বনাম 100 kB বা 50ºF বনাম 50 ºF। + +## উপসংহার {#conclusion} + +ethereum.org অনুবাদ করা ইথেরিয়ামের বিভিন্ন দিক সম্পর্কে জানার একটি দুর্দান্ত সুযোগ। + +অনুবাদ করার সময়, তাড়াহুড়ো না করার চেষ্টা করুন। স্বাভাবিকভাবে নিন এবং মজা করুন! + +অনুবাদ প্রোগ্রামের সাথে জড়িত থাকার জন্য এবং ওয়েবসাইটটিকে বৃহত্তর দর্শকদের কাছে অ্যাক্সেসযোগ্য করে তুলতে আমাদের সাহায্য করার জন্য আপনাকে ধন্যবাদ। ইথেরিয়াম সম্প্রদায় বিশ্বব্যাপী, এবং আমরা খুশি যে আপনি এর একটি অংশ! diff --git a/public/content/translations/bn/dao/index.md b/public/content/translations/bn/dao/index.md index 159e4042b44..1b7dd0470f6 100644 --- a/public/content/translations/bn/dao/index.md +++ b/public/content/translations/bn/dao/index.md @@ -1,24 +1,25 @@ --- -title: বিকেন্দ্রীভূত স্বায়ত্তশাসিত সংস্থা সমূহ (DAO) -description: ইথেরিয়াম উপর DAO একটি সংক্ষিপ্ত বিবরণী +title: "DAO কী?" +metaTitle: "DAO কী? | বিকেন্দ্রীভূত স্বায়ত্তশাসিত সংস্থা" +description: "ইথেরিয়াম উপর DAO একটি সংক্ষিপ্ত বিবরণী" lang: bn template: use-cases emoji: ":handshake:" sidebarDepth: 2 image: /images/use-cases/dao-2.png -alt: একটি DAO-এর একটি রিপ্রেজেন্টেশন একটি প্রস্তাবে ভোট দিচ্ছে। -summaryPoint1: কেন্দ্রীভূত নেতৃত্ব ছাড়া সদস্য-মালিকানাধীন কমিউনিটি। -summaryPoint2: ইন্টারনেট অপরিচিতদের সাথে সহযোগিতা করার একটি নিরাপদ উপায়। -summaryPoint3: একটি নির্দিষ্ট কারণে ফান্ড সমর্পণ করার একটি নিরাপদ জায়গা। +alt: "একটি DAO-এর একটি রিপ্রেজেন্টেশন একটি প্রস্তাবে ভোট দিচ্ছে।" +summaryPoint1: "কেন্দ্রীভূত নেতৃত্ব ছাড়া সদস্য-মালিকানাধীন কমিউনিটি।" +summaryPoint2: "ইন্টারনেট অপরিচিতদের সাথে সহযোগিতা করার একটি নিরাপদ উপায়।" +summaryPoint3: "একটি নির্দিষ্ট কারণে ফান্ড সমর্পণ করার একটি নিরাপদ জায়গা।" --- ## DAO কী? {#what-are-daos} -একটি DAO হল একটি যৌথ মালিকানাধীন, ব্লকচেইন-শাসিত সংস্থা একটি শেয়ার করা মিশনের দিকে কাজ করে। +একটি DAO হল একটি সম্মিলিত-মালিকানাধীন সংস্থা যা একটি শেয়ার করা মিশনের দিকে কাজ করে। DAO আমাদের ফান্ড বা ক্রিয়াকলাপ পরিচালনা করার জন্য একজন পরোপকারী নেতাকে বিশ্বাস না করেই বিশ্বজুড়ে সমমনা লোকদের সাথে কাজ করার অনুমতি দেয়। এমন কোন CEO নেই যিনি খেয়ালখুশি মতো ফান্ড ব্যয় করতে পারেন বা CFO নেই যিনি বইগুলি ম্যানিপুলেট করতে পারেন। পরিবর্তে, কোডে বেক করা ব্লকচেইন-ভিত্তিক নিয়মগুলি সংজ্ঞায়িত করে যে সংস্থা কীভাবে কাজ করে এবং কীভাবে ফান্ড ব্যয় করা হয়। -তাদের অন্তর্নির্মিত কোষাগার রয়েছে যা গ্রূপের অনুমোদন ছাড়া অ্যাক্সেস করার ক্ষমতা কারও নেই। প্রতিষ্ঠানের প্রত্যেকের একটি মত আছে তা নিশ্চিত করার জন্য প্রস্তাব এবং ভোট দিয়ে সিদ্ধান্তগুলি নিয়ন্ত্রিত হয় এবং সবকিছু চেইনে স্বচ্ছভাবে ঘটে। +তাদের অন্তর্নির্মিত কোষাগার রয়েছে যা গ্রূপের অনুমোদন ছাড়া অ্যাক্সেস করার ক্ষমতা কারও নেই। প্রতিষ্ঠানের প্রত্যেকের একটি মত আছে তা নিশ্চিত করার জন্য প্রস্তাব এবং ভোট দিয়ে সিদ্ধান্তগুলি নিয়ন্ত্রিত হয় এবং সবকিছু স্বচ্ছভাবে [অনচেইনে](/glossary/#onchain) ঘটে। ## কেন আমাদের DAO প্রয়োজন? {#why-dao} @@ -28,72 +29,68 @@ DAO আমাদের ফান্ড বা ক্রিয়াকলাপ ### একটি তুলনা {#dao-comparison} -| DAO | একটি গতানুগতিক সংগঠন | -| ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | -| সাধারণত সমতল, এবং সম্পূর্ণরূপে গণতান্ত্রিক। | সাধারণত অনুক্রমিক। | -| কোনো পরিবর্তন বাস্তবায়নের জন্য সদস্যদের ভোট প্রয়োজন। | কাঠামোর উপর নির্ভর করে, একমাত্র দল থেকে পরিবর্তনের দাবি করা যেতে পারে, বা ভোট দেওয়ার প্রস্তাব দেওয়া যেতে পারে। | -| ভোট গণনা করা হয়, এবং ফলাফল বিশ্বস্ত মধ্যস্থতাকারী ছাড়াই স্বয়ংক্রিয়ভাবে প্রয়োগ করা হয়। | যদি ভোট দেওয়ার অনুমতি দেওয়া হয়, ভোটগুলি অভ্যন্তরীণভাবে গণনা করা হয় এবং ভোটের ফলাফল ম্যানুয়ালি পরিচালনা করতে হবে। | +| DAO | একটি গতানুগতিক সংগঠন | +| ------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------- | +| সাধারণত সমতল, এবং সম্পূর্ণরূপে গণতান্ত্রিক। | সাধারণত অনুক্রমিক। | +| কোনো পরিবর্তন বাস্তবায়নের জন্য সদস্যদের ভোট প্রয়োজন। | কাঠামোর উপর নির্ভর করে, একমাত্র দল থেকে পরিবর্তনের দাবি করা যেতে পারে, বা ভোট দেওয়ার প্রস্তাব দেওয়া যেতে পারে। | +| ভোট গণনা করা হয়, এবং ফলাফল বিশ্বস্ত মধ্যস্থতাকারী ছাড়াই স্বয়ংক্রিয়ভাবে প্রয়োগ করা হয়। | যদি ভোট দেওয়ার অনুমতি দেওয়া হয়, ভোটগুলি অভ্যন্তরীণভাবে গণনা করা হয় এবং ভোটের ফলাফল ম্যানুয়ালি পরিচালনা করতে হবে। | | প্রদত্ত পরিষেবাগুলি একটি বিকেন্দ্রীভূত পদ্ধতিতে স্বয়ংক্রিয়ভাবে পরিচালনা করা হয় (উদাহরণস্বরূপ জনহিতকর ফান্ডের বিতরণ)। | মানুষের পরিচালনা প্রয়োজন বা কেন্দ্রীয়ভাবে নিয়ন্ত্রিত অটোমেশন, উভয়ই ম্যানিপুলেশন প্রবণ। | -| সমস্ত কার্যকলাপ স্বচ্ছ এবং সম্পূর্ণ জনসাধারণের। | কার্যকলাপ সাধারণত ব্যক্তিগত এবং জনসাধারণের মধ্যে সীমাবদ্ধ। | +| সমস্ত কার্যকলাপ স্বচ্ছ এবং সম্পূর্ণ জনসাধারণের। | কার্যকলাপ সাধারণত ব্যক্তিগত এবং জনসাধারণের মধ্যে সীমাবদ্ধ। | -### DAO উদাহরণসমূহ {#dao-examples} +### DAO উদাহরণ {#dao-examples} এটিকে আরও বোধগম্য করতে সাহায্য করার জন্য, আপনি কীভাবে একটি DAO ব্যবহার করতে পারেন তার কয়েকটি উদাহরণ এখানে দেওয়া হল: -- একটি দাতব্য সংস্থা – আপনি বিশ্বের যেকোনও ব্যক্তির কাছ থেকে অনুদান গ্রহণ করতে পারেন এবং ফান্ড দেওয়ার জন্য ভোট দিতে পারেন। -- সম্মিলিত মালিকানা – আপনি ফিজিক্যাল ​​বা ডিজিটাল সম্পদ ক্রয় করতে পারেন এবং সদস্যরা সেগুলি কীভাবে ব্যবহার করবে সে সম্পর্কে ভোট দিতে পারেন। -- উদ্যোগ এবং অনুদান – আপনি একটি ভেঞ্চার ফান্ড তৈরি করতে পারেন যা বিনিয়োগের মূলধন সংগ্রহ করে এবং উদ্যোগে সমর্থনের জন্য ভোট দেয়। পরিশোধিত অর্থ পরে DAO-সদস্যদের মধ্যে পুনরায় বিতরণ করা হয়। +- **একটি দাতব্য সংস্থা** – আপনি বিশ্বের যে কোনও ব্যক্তির কাছ থেকে অনুদান গ্রহণ করতে পারেন এবং কোন কারণগুলির জন্য অর্থায়ন করা হবে সে সম্পর্কে ভোট দিতে পারেন। +- **সম্মিলিত মালিকানা** – আপনি বাস্তব বা ডিজিটাল সম্পদ ক্রয় করতে পারেন এবং সদস্যরা সেগুলি কীভাবে ব্যবহার করবে সে সম্পর্কে ভোট দিতে পারেন। +- **উদ্যোগ এবং অনুদান** – আপনি একটি উদ্যোগ তহবিল তৈরি করতে পারেন যা বিনিয়োগের মূলধন সংগ্রহ করে এবং সমর্থন করার জন্য উদ্যোগগুলিতে ভোট দেয়। পরিশোধিত অর্থ পরে DAO-সদস্যদের মধ্যে পুনরায় বিতরণ করা হয়। + + ## DAO কিভাবে কাজ করে? {#how-daos-work} -একটি DAO-এর মেরুদণ্ড হল এর স্মার্ট কন্ট্র্যাক্ট, যা সংস্থার নিয়মগুলিকে সংজ্ঞায়িত করে এবং গ্রুপের কোষাগারকে ধরে রাখে। কনট্র্যাক্টটি ইথেরিয়াম-এ লাইভ হয়ে গেলে, ভোট ছাড়া কেউ নিয়ম পরিবর্তন করতে পারবে না। যদি কেউ এমন কিছু করার চেষ্টা করে যা কোডের নিয়ম এবং যুক্তি অনুযায়ী পরিচালিত হবে না, তবে এটি ব্যর্থ হবে। আর যেহেতু কোষাগারটি স্মার্ট কন্ট্র্যাক্ট দ্বারা সংজ্ঞায়িত করা হয়েছে তার মানে গ্রুপের অনুমোদন ছাড়া কেউ টাকা ব্যয় করতে পারে না। এর মানে হল যে DAO গুলোর কেন্দ্রীয় কর্তৃপক্ষের প্রয়োজন নেই। পরিবর্তে, গ্রুপটি সম্মিলিতভাবে সিদ্ধান্ত নেয় এবং ভোট পাস হলে পেমেন্ট স্বয়ংক্রিয়ভাবে অনুমোদিত হয়। +একটি DAO-এর মেরুদণ্ড হল এর [স্মার্ট কন্ট্র্যাক্ট](/glossary/#smart-contract), যা সংস্থার নিয়মগুলিকে সংজ্ঞায়িত করে এবং গোষ্ঠীর কোষাগার ধারণ করে। কনট্র্যাক্টটি ইথেরিয়াম-এ লাইভ হয়ে গেলে, ভোট ছাড়া কেউ নিয়ম পরিবর্তন করতে পারবে না। যদি কেউ এমন কিছু করার চেষ্টা করে যা কোডের নিয়ম এবং যুক্তি অনুযায়ী পরিচালিত হবে না, তবে এটি ব্যর্থ হবে। আর যেহেতু কোষাগারটি স্মার্ট কন্ট্র্যাক্ট দ্বারা সংজ্ঞায়িত করা হয়েছে তার মানে গ্রুপের অনুমোদন ছাড়া কেউ টাকা ব্যয় করতে পারে না। এর মানে হল যে DAO গুলোর কেন্দ্রীয় কর্তৃপক্ষের প্রয়োজন নেই। পরিবর্তে, গ্রুপটি সম্মিলিতভাবে সিদ্ধান্ত নেয় এবং ভোট পাস হলে পেমেন্ট স্বয়ংক্রিয়ভাবে অনুমোদিত হয়। এটি সম্ভব কারণ স্মার্ট কন্ট্র্যাক্ট ইথেরিয়ামে লাইভ হয়ে গেলে তা টেম্পার-প্রুফ। লোকেদের নোটিস না দিয়ে আপনি আপনি কোডটি (DAO নিয়মসমূহ) সম্পাদনা করতে পারবেন না, কারণ সবকিছুই সর্বজনীন। - - স্মার্ট কন্ট্র্যাক্ট সম্পর্কে আরো - - -## ইথেরিয়াম এবং DAO {#ethereum-and-daos} +## ইথেরিয়াম এবং DAOs {#ethereum-and-daos} ইথেরিয়াম বিভিন্ন কারণে DAO-এর জন্য নিখুঁত ভিত্তি: -- ইথেরিয়ামের নিজস্ব কনসেনসাস বিতরণ করা হয় এবং সংস্থাগুলি নেটওয়ার্কের উপর আস্থা রাখার জন্য যথেষ্ট প্রতিষ্ঠিত হয়। +- ইথেরিয়ামের নিজস্ব কনসেন্সাস বিকেন্দ্রীভূত এবং সংস্থাগুলির নেটওয়ার্ককে বিশ্বাস করার জন্য যথেষ্ট প্রতিষ্ঠিত। - স্মার্ট কন্ট্র্যাক্ট কোড একবার লাইভ হলে তা পরিবর্তন করতে পারবে না, এমনকি এর মালিকরাও। এটি DAO কে এটির সাথে প্রোগ্রাম করা নিয়ম অনুসারে চালানোর অনুমতি দেয়। - স্মার্ট কন্ট্র্যাক্ট ফান্ড পাঠাতে/নিতে পারে। এটি ছাড়া গ্রুপ ফান্ড পরিচালনার জন্য আপনার একজন বিশ্বস্ত মধ্যস্থতাকারীর প্রয়োজন হবে। - ইথেরিয়াম কমিউনিটি প্রতিযোগিতামূলক হওয়ার তুলনায় আরো সহযোগী হয়ে প্রমাণিত হয়েছে, সর্বোত্তম অনুশীলন এবং সাপোর্ট সিস্টেম দ্রুত আবির্ভূত হতে অনুমতি দেয়। -## DAO পরিচালনা {#dao-governance} +## DAO গভর্নেন্স {#dao-governance} একটি DAO পরিচালনা করার সময় অনেকগুলি বিবেচ্য বিষয় রয়েছে, যেমন ভোট এবং প্রস্তাবগুলি কীভাবে কাজ করে। -### ডেলিগেশন {#governance-delegation} +### প্রতিনিধিত্ব {#governance-delegation} ডেলিগেশন হলো প্রতিনিধিত্বমূলক গণতন্ত্রের DAO সংস্করণের মতো। টোকেন হোল্ডাররা সেই ব্যবহারকারীদের ভোট অর্পণ করে যারা নিজেদের মনোনীত করে এবং প্রোটোকল পরিচালনা এবং অবগত থাকার প্রতিশ্রুতি দেয়। -#### একটি বিখ্যাত উদাহরণ {#governance-example} - -[ENS](https://claim.ens.domains/delegate-ranking) – ENS হোল্ডাররা তাদের প্রতিনিধিত্ব করার জন্য নিযুক্ত সম্প্রদায়ের সদস্যদের কাছে তাদের ভোট অর্পণ করতে পারেন। +#### একটি বিখ্যাত উদাহরণ {#governance-example}[ENS](https://claim.ens.domains/delegate-ranking) – ENS হোল্ডাররা তাদের প্রতিনিধিত্ব করার জন্য নিযুক্ত সম্প্রদায়ের সদস্যদের কাছে তাদের ভোট অর্পণ করতে পারেন। -### স্বয়ংক্রিয় লেনদেন পরিচালনা {#governance-example} +### স্বয়ংক্রিয় লেনদেন গভর্নেন্স {#governance-example} অনেক DAO এ, লেনদেন স্বয়ংক্রিয়ভাবে সম্পাদিত হবে যদি সদস্যদের একটি কোরাম ইতিবাচক ভোট দেয়। #### একটি বিখ্যাত উদাহরণ {#governance-example} -[বিশেষ্য](https://nouns.wtf) –বিশেষ্য DAO-তে, একটি লেনদেন স্বয়ংক্রিয়ভাবে কার্যকর হয় যদি ভোটের কোরাম পূরণ হয় এবং সংখ্যাগরিষ্ঠ ভোট ইতিবাচক হয়, যতক্ষণ না এটি প্রতিষ্ঠাতাদের দ্বারা ভেটো না করা হয়। +[Nouns](https://nouns.wtf) – Nouns DAO-তে, যদি ভোটের কোরাম পূরণ হয় এবং সংখ্যাগরিষ্ঠ ভোট ইতিবাচক হয়, তবে একটি লেনদেন স্বয়ংক্রিয়ভাবে সম্পাদিত হয়, যতক্ষণ না এটি প্রতিষ্ঠাতাদের দ্বারা ভেটো না করা হয়। -### মাল্টিসিগ পরিচালনা {#governance-example} +### মাল্টিসিগ গভর্নেন্স {#governance-example} -যদিও DAO-এর হাজার হাজার ভোটিং সদস্য থাকতে পারে, তহবিল 5-20 জন সক্রিয় কমিউনিটির সদস্যদের দ্বারা ভাগ করা একটি ওয়ালেটে থাকতে পারে যারা বিশ্বস্ত এবং সাধারণত ডক্সড (জনসাধারণের পরিচয় কমিউনিটির কাছে পরিচিত)। একটি ভোটের পরে, মাল্টিসিগ স্বাক্ষরকারীরা কমিউনিটির ইচ্ছা বাস্তবায়ন করে। +যদিও DAO-এর হাজার হাজার ভোটিং সদস্য থাকতে পারে, তহবিলগুলি 5-20 জন সক্রিয় কমিউনিটির সদস্যদের দ্বারা ভাগ করা একটি [ওয়ালেটে](/glossary/#wallet) থাকতে পারে যারা বিশ্বস্ত এবং সাধারণত ডক্সড (জনসাধারণের পরিচয় কমিউনিটির কাছে পরিচিত)। একটি ভোটের পরে, [মাল্টিসিগ](/glossary/#multisig) স্বাক্ষরকারীরা সম্প্রদায়ের ইচ্ছা কার্যকর করে। -## DAO আইনসমূহ {#dao-laws} +## DAO আইন {#dao-laws} 1977 সালে, ওয়াইমিং LLC উদ্ভাবন করে, যা উদ্যোক্তাদের রক্ষা করে এবং তাদের দায়বদ্ধতা সীমিত করে। অতি সম্প্রতি, তারা DAO আইনের অগ্রগতি করেছে যা DAO-এর জন্য আইনি মর্যাদা প্রতিষ্ঠা করে। বর্তমানে ওয়াইমিং, ভার্মন্ট এবং ভার্জিন দ্বীপপুঞ্জে কিছু আকারে DAO আইন রয়েছে। ### একটি বিখ্যাত উদাহরণ {#law-example} -[CityDAO](https://citizen.citydao.io/) – CityDAO ইয়েলোস্টোন ন্যাশনাল পার্কের কাছে 40 একর জমি কেনার জন্য ওয়াইমিং এর DAO আইন ব্যবহার করেছে। +[CityDAO](https://citizen.citydao.io/) – CityDAO ইয়েলোস্টোন ন্যাশনাল পার্কের কাছে 40 একর জমি কেনার জন্য ওয়াইমিং-এর DAO আইন ব্যবহার করেছে। ## DAO সদস্যপদ {#dao-membership} @@ -101,65 +98,70 @@ DAO সদস্যপদ জন্য বিভিন্ন মডেল আছ ### টোকেন-ভিত্তিক সদস্যপদ {#token-based-membership} -সাধারণত সম্পূর্ণ অনুমতিহীন, ব্যবহৃত টোকেনের উপর নির্ভর করে। বেশিরভাগই এই গভর্নেন্স টোকেনগুলি বিকেন্দ্রীভূত বিনিময়ে অনুমতি ছাড়াই লেনদেন করা যেতে পারে। অন্যদের অবশ্যই তারল্য প্রদান বা অন্য কোনো 'প্রুফ-অফ-ওয়ার্ক' এর মাধ্যমে উপার্জন করতে হবে। যেভাবেই হোক, শুধু টোকেন ধরে রাখা ভোটে অ্যাক্সেস দেয়। +ব্যবহৃত টোকেনের উপর নির্ভর করে, সাধারণত সম্পূর্ণ [অনুমতিহীন](/glossary/#permissionless)। বেশিরভাগ ক্ষেত্রে এই গভর্নেন্স টোকেনগুলি একটি [বিকেন্দ্রীভূত এক্সচেঞ্জে](/glossary/#dex) অনুমতিহীনভাবে লেনদেন করা যেতে পারে। অন্যদের অবশ্যই তারল্য প্রদান বা অন্য কোনো 'প্রুফ-অফ-ওয়ার্ক' এর মাধ্যমে উপার্জন করতে হবে। যেভাবেই হোক, শুধু টোকেন ধরে রাখা ভোটে অ্যাক্সেস দেয়। -_সাধারণত বিস্তৃত বিকেন্দ্রীভূত প্রোটোকল এবং/অথবা টোকেনগুলিকে পরিচালনা করতে ব্যবহৃত হয়।_ +_সাধারণত বিস্তৃত বিকেন্দ্রীভূত প্রোটোকল এবং/অথবা টোকেনগুলি নিজেরাই পরিচালনা করতে ব্যবহৃত হয়।_ #### একটি বিখ্যাত উদাহরণ {#token-example} -[MakerDAO](https://makerdao.com) – MakerDAO-এর টোকেন MKR বিকেন্দ্রীভূত এক্সচেঞ্জে ব্যাপকভাবে পাওয়া যায় এবং যে কেউ মেকার প্রোটোকলের ভবিষ্যত ভোট দেওয়ার ক্ষমতা কিনতে পারে। +[MakerDAO](https://makerdao.com) – MakerDAO-এর টোকেন MKR বিকেন্দ্রীভূত এক্সচেঞ্জে ব্যাপকভাবে পাওয়া যায় এবং যে কেউ মেকার প্রোটোকলের ভবিষ্যতে ভোটাধিকার কেনার সুযোগ নিতে পারে। ### শেয়ার-ভিত্তিক সদস্যপদ {#share-based-membership} শেয়ার-ভিত্তিক DAO গুলি আরো অনুমোদিত, তবে এখনও বেশ উন্মুক্ত। যেকোন সম্ভাব্য সদস্যরা DAO-তে যোগদানের জন্য একটি প্রস্তাব জমা দিতে পারে, সাধারণত টোকেন বা কাজের আকারে কিছু মূল্যের শ্রদ্ধা নিবেদন করে। শেয়ার সরাসরি ভোটদানের ক্ষমতা এবং মালিকানার প্রতিনিধিত্ব করে। সদস্যরা তাদের কোষাগারের আনুপাতিক অংশ নিয়ে যেকোনো সময় প্রস্থান করতে পারেন। -_সাধারণত আরও ঘনিষ্ঠ, মানব-কেন্দ্রিক সংস্থা যেমন দাতব্য সংস্থা, কর্মী সমষ্টি এবং বিনিয়োগ ক্লাবগুলির জন্য ব্যবহৃত হয়। পাশাপাশি প্রোটোকল এবং টোকেনগুলিও পরিচালনা করতে পারে।_ +_সাধারণত আরও ঘনিষ্ঠ, মানব-কেন্দ্রিক সংস্থা যেমন দাতব্য সংস্থা, কর্মী সমষ্টি এবং বিনিয়োগ ক্লাবের জন্য ব্যবহৃত হয়।_ _প্রোটোকল এবং টোকেনও পরিচালনা করতে পারে।_ #### একটি বিখ্যাত উদাহরণ {#share-example} -[MolochDAO](http://molochdao.com/) – MolochDAO ইথেরিয়াম প্রকল্পে অর্থায়নের উপর ফোকাসড। তাদের সদস্যতার জন্য একটি প্রস্তাবের প্রয়োজন যাতে গ্রুপটি মূল্যায়ন করতে পারে যে সম্ভাব্য অনুদানপ্রাপ্তদের সম্পর্কে অবগত সিদ্ধান্ত নেওয়ার জন্য আপনার প্রয়োজনীয় দক্ষতা এবং মূলধন আছে কি না। আপনি কেবল খোলা বাজারে DAO-তে অ্যাক্সেস কিনতে পারবেন না। +[MolochDAO](http://molochdao.com/) – MolochDAO ইথেরিয়াম প্রকল্পগুলিতে অর্থায়নের উপর দৃষ্টি নিবদ্ধ করে। তাদের সদস্যতার জন্য একটি প্রস্তাবের প্রয়োজন যাতে গ্রুপটি মূল্যায়ন করতে পারে যে সম্ভাব্য অনুদানপ্রাপ্তদের সম্পর্কে অবগত সিদ্ধান্ত নেওয়ার জন্য আপনার প্রয়োজনীয় দক্ষতা এবং মূলধন আছে কি না। আপনি কেবল খোলা বাজারে DAO-তে অ্যাক্সেস কিনতে পারবেন না। ### খ্যাতি-ভিত্তিক সদস্যপদ {#reputation-based-membership} -খ্যাতি অংশগ্রহণের প্রমাণ উপস্থাপন করে এবং DAO-তে ভোট দেওয়ার ক্ষমতা প্রদান করে। টোকেন বা শেয়ার-ভিত্তিক সদস্যতার বিপরীতে, খ্যাতি-ভিত্তিক DAO অবদানকারীদের মালিকানা হস্তান্তর করে না। খ্যাতি কেনা, স্থানান্তর বা অর্পণ করা যাবে না; DAO সদস্যদের অবশ্যই অংশগ্রহণের মাধ্যমে সুনাম অর্জন করতে হবে। অন-চেইন ভোটিং অনুমোদনহীন এবং সম্ভাব্য সদস্যরা অবাধে DAO-তে যোগদানের প্রস্তাব জমা দিতে পারে এবং তাদের অবদানের বিনিময়ে খ্যাতি ও টোকেন পাওয়ার জন্য অনুরোধ করতে পারে। +খ্যাতি অংশগ্রহণের প্রমাণ উপস্থাপন করে এবং DAO-তে ভোট দেওয়ার ক্ষমতা প্রদান করে। টোকেন বা শেয়ার-ভিত্তিক সদস্যতার বিপরীতে, খ্যাতি-ভিত্তিক DAO অবদানকারীদের মালিকানা হস্তান্তর করে না। খ্যাতি কেনা, স্থানান্তর বা অর্পণ করা যাবে না; DAO সদস্যদের অবশ্যই অংশগ্রহণের মাধ্যমে সুনাম অর্জন করতে হবে। অনচেইন ভোটিং অনুমতিহীন এবং সম্ভাব্য সদস্যরা অবাধে DAO-তে যোগদানের জন্য প্রস্তাব জমা দিতে পারে এবং তাদের অবদানের বিনিময়ে পুরস্কার হিসাবে খ্যাতি এবং টোকেন পাওয়ার জন্য অনুরোধ করতে পারে। -_সাধারণত প্রোটোকল এবং dapps গুলোর বিকেন্দ্রীভূত উন্নয়ন এবং পরিচালনার জন্য ব্যবহৃত হয়, তবে বিভিন্ন সংস্থা যেমন দাতব্য সংস্থা, কর্মী গোষ্ঠী, বিনিয়োগ ক্লাব ইত্যাদির জন্য উপযুক্ত।_ +_সাধারণত প্রোটোকল এবং [ডিএ্যাপস](/glossary/#dapp) এর বিকেন্দ্রীভূত উন্নয়ন এবং গভর্নেন্সের জন্য ব্যবহৃত হয়, তবে দাতব্য সংস্থা, কর্মী গোষ্ঠী, বিনিয়োগ ক্লাব ইত্যাদির মতো বিভিন্ন সংস্থার জন্যও এটি উপযুক্ত।_ #### একটি বিখ্যাত উদাহরণ {#reputation-example} -[DXdao](https://DXdao.eth.link) – DXdao হলো একটি বিশ্বব্যাপী সার্বভৌম যৌথ নির্মাণ এবং 2019 সাল থেকে বিকেন্দ্রীভূত প্রোটোকল এবং অ্যাপ্লিকেশনগুলো পরিচালনা করছে। এটি ফান্ড সমন্বয় ও পরিচালনার জন্য খ্যাতি-ভিত্তিক শাসন এবং হলোগ্রাফিক ঐক্যমতকে লাভ করে, যার অর্থ কেউ এর ভবিষ্যতকে প্রভাবিত করার উপায় কিনতে পারে না। +[DXdao](https://DXdao.eth.limo) – DXdao 2019 সাল থেকে বিকেন্দ্রীভূত প্রোটোকল এবং অ্যাপ্লিকেশন তৈরি এবং পরিচালনা করা একটি বিশ্বব্যাপী সার্বভৌম সমষ্টি ছিল। এটি তহবিল সমন্বয় ও পরিচালনা করার জন্য খ্যাতি-ভিত্তিক গভর্নেন্স এবং [হলোগ্রাফিক কনসেন্সাস](/glossary/#holographic-consensus) ব্যবহার করেছে, যার অর্থ কেউ এর ভবিষ্যত বা গভর্নেন্সকে প্রভাবিত করার জন্য নিজের পথ কিনতে পারত না। -## একটি DAO যোগদান/শুরু করুন {#join-start-a-dao} +## একটি DAO-তে যোগ দিন / শুরু করুন {#join-start-a-dao} -### Join a DAO {#join-a-dao} +### একটি DAO-তে যোগ দিন {#join-a-dao} -- [ইথেরিয়াম কমিউনিটির DAO সমূহ](/community/get-involved/#decentralized-autonomous-organizations-daos) -- [DAOHaus-এর DAO-র তালিকা](https://app.daohaus.club/explore) -- [Tally.xyz এর DAO তালিকা](https://www.tally.xyz) +- [ইথেরিয়াম কমিউনিটি DAOs](/community/get-involved/#decentralized-autonomous-organizations-daos) +- [DAOs-এর DAOHaus তালিকা](https://app.daohaus.club/explore) +- [DAOs-এর Tally.xyz তালিকা](https://www.tally.xyz/explore) +- [DAOs-এর DeGov.AI তালিকা](https://apps.degov.ai/) ### একটি DAO শুরু করুন {#start-a-dao} -- [DAOHaus এর সাথে একটি DAO তলব করুন](https://app.daohaus.club/summon) -- [Tally দিয়ে একটি গভর্নর DAO শুরু করুন](https://www.tally.xyz/add-a-dao) +- [DAOHaus দিয়ে একটি DAO তলব করুন](https://app.daohaus.club/summon) +- [Tally দিয়ে একটি গভর্নর DAO শুরু করুন](https://www.tally.xyz/get-started) - [একটি Aragon-চালিত DAO তৈরি করুন](https://aragon.org/product) -- [একটি উপনিবেশ শুরু করুন](https://colony.io/) -- [DAOstack এর হলোগ্রাফিক কনসেনসাস দ্বারা একটি DAO তৈরি করুন](https://alchemy.daostack.io/daos/create) +- [একটি কলোনি শুরু করুন](https://colony.io/) +- [DAOstack-এর হলোগ্রাফিক কনসেন্সাস দিয়ে একটি DAO তৈরি করুন](https://alchemy.daostack.io/daos/create) +- [DeGov লঞ্চার দিয়ে একটি DAO লঞ্চ করুন](https://docs.degov.ai/integration/deploy) -## Further reading {#further-reading} +## আরও পড়ুন {#further-reading} -### DAO প্রবন্ধগুলো {#dao-articles} +### DAO নিবন্ধ {#dao-articles} - [DAO কী?](https://aragon.org/dao) – [Aragon](https://aragon.org/) -- [DAO হ্যান্ডবুক](https://daohandbook.xyz) -- [DAO এর হোম](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/) -- [DAO কী এবং এটি কী জন্য?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) – [DAOhaus](https://daohaus.club/) +- [হাউস অফ DAOs](https://wiki.metagame.wtf/docs/great-houses/house-of-daos) – [Metagame](https://wiki.metagame.wtf/) +- [DAO কী এবং এটি কীসের জন্য?](https://daohaus.substack.com/p/-what-is-a-dao-and-what-is-it-for) – [DAOhaus](https://daohaus.club/) - [কীভাবে একটি DAO-চালিত ডিজিটাল কমিউনিটি শুরু করবেন](https://daohaus.substack.com/p/four-and-a-half-steps-to-start-a) – [DAOhaus](https://daohaus.club/) - [DAO কী?](https://coinmarketcap.com/alexandria/article/what-is-a-dao) – [Coinmarketcap](https://coinmarketcap.com) -- [হলোগ্রাফিক কনসেনসাস কী?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) -- [DAO গুলি কর্পোরেশন নয়: যেখানে Vitalik দ্বারা স্বায়ত্তশাসিত সংস্থাগুলিতে বিকেন্দ্রীকরণ গুরুত্বপূর্ণ](https://vitalik.eth.limo/general/2022/09/20/daos.html) -- [DAO, DAC, DA এবং আরও অনেক কিছু: একটি অসম্পূর্ণ পরিভাষা নির্দেশিকা](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [ইথেরিয়াম ব্লগ](https://blog.ethereum.org) +- [হলোগ্রাফিক কনসেন্সাস কী?](https://medium.com/daostack/holographic-consensus-part-1-116a73ba1e1c) - [DAOstack](https://daostack.io/) +- [DAO গুলি কর্পোরেশন নয়: যেখানে Vitalik এর মতে স্বায়ত্তশাসিত সংস্থাগুলিতে বিকেন্দ্রীকরণ গুরুত্বপূর্ণ](https://vitalik.eth.limo/general/2022/09/20/daos.html) +- [DAOs, DACs, DAs এবং আরও অনেক কিছু: একটি অসম্পূর্ণ পরিভাষা নির্দেশিকা](https://blog.ethereum.org/2014/05/06/daos-dacs-das-and-more-an-incomplete-terminology-guide) - [ইথেরিয়াম ব্লগ](https://blog.ethereum.org) -### Videos {#videos} +### ভিডিও {#videos} - [ক্রিপ্টোতে DAO কী?](https://youtu.be/KHm0uUPqmVE) - [একটি DAO কি একটি শহর তৈরি করতে পারে?](https://www.ted.com/talks/scott_fitsimones_could_a_dao_build_the_next_great_city) – [TED](https://www.ted.com/) + + + + diff --git a/public/content/translations/bn/dapps/index.md b/public/content/translations/bn/dapps/index.md index a173228e462..6f39d2787fc 100644 --- a/public/content/translations/bn/dapps/index.md +++ b/public/content/translations/bn/dapps/index.md @@ -1,6 +1,6 @@ --- -title: ইথেরিয়াম অ্যাপ্লিকেশন (dapps) ব্যবহার করুন -description: ইথেরিয়াম ব্যবহার শুরু করার জন্য আপনার যে মৌলিক তথ্য প্রয়োজন। +title: "ইথেরিয়াম অ্যাপ্লিকেশন (dapps) ব্যবহার করুন" +description: "ইথেরিয়াম ব্যবহার শুরু করার জন্য আপনার যে মৌলিক তথ্য প্রয়োজন।" lang: bn --- diff --git a/public/content/translations/bn/decentralized-identity/index.md b/public/content/translations/bn/decentralized-identity/index.md index 8c7bcd98565..51ac2926800 100644 --- a/public/content/translations/bn/decentralized-identity/index.md +++ b/public/content/translations/bn/decentralized-identity/index.md @@ -1,25 +1,27 @@ --- -title: বিকেন্দ্রীভূত পরিচয় -description: বিকেন্দ্রীভূত পরিচয় কী এবং কেন এটি গুরুত্বপূর্ণ? +title: "বিকেন্দ্রীভূত পরিচয়" +description: "বিকেন্দ্রীভূত পরিচয় কী এবং কেন এটি গুরুত্বপূর্ণ?" lang: bn template: use-cases emoji: ":id:" sidebarDepth: 2 image: /images/eth-gif-cat.png -summaryPoint1: ঐতিহ্যগত পরিচয় সিস্টেমগুলি আপনার শনাক্তকারী বৈশিষ্টসমূহের ইস্যুকরণ, রক্ষণাবেক্ষণ এবং নিয়ন্ত্রণকে কেন্দ্রীভূত করেছে। -summaryPoint2: বিকেন্দ্রীভূত পরিচয় কেন্দ্রীভূত তৃতীয় পক্ষের উপর নির্ভরতা দূর করে। -summaryPoint3: ক্রিপ্টোকারেন্সির জন্য ধন্যবাদ, ব্যবহারকারীদের কাছে এখন আবার তাদের শনাক্তকারী এবং প্রমাণীকরণ ইস্যু করার, ধরে রাখার এবং নিয়ন্ত্রণ করার টুলস রয়েছে। +summaryPoint1: "ঐতিহ্যগত পরিচয় সিস্টেমগুলি আপনার শনাক্তকারী বৈশিষ্টসমূহের ইস্যুকরণ, রক্ষণাবেক্ষণ এবং নিয়ন্ত্রণকে কেন্দ্রীভূত করেছে।" +summaryPoint2: "বিকেন্দ্রীভূত পরিচয় কেন্দ্রীভূত তৃতীয় পক্ষের উপর নির্ভরতা দূর করে।" +summaryPoint3: "ক্রিপ্টোকারেন্সির জন্য ধন্যবাদ, ব্যবহারকারীদের কাছে এখন আবার তাদের শনাক্তকারী এবং প্রমাণীকরণ ইস্যু করার, ধরে রাখার এবং নিয়ন্ত্রণ করার টুলস রয়েছে।" --- পরিচয় আজ আপনার জীবনের কার্যত প্রতিটি দিকের সত্যতা প্রতিপন্ন করে। অনলাইন পরিষেবা ব্যবহার করা, একটি ব্যাঙ্ক অ্যাকাউন্ট খোলা, নির্বাচনে ভোট দেওয়া, সম্পত্তি কেনা, কর্মসংস্থান নিশ্চিত করা—এসব কিছুর জন্য আপনার পরিচয় প্রমাণ করতে হবে। -যাইহোক, গতানুগতিক পরিচয় ব্যবস্থাপনা সিস্টেমগুলি দীর্ঘদিন ধরে কেন্দ্রীভূত মধ্যস্থতাকারীদের উপর নির্ভর করে যারা আপনার শনাক্তকারী এবং [প্রত্যয়ন](#what-are-attestations) ইস্যু করে, ধরে রাখে এবং নিয়ন্ত্রণ করে। এর মানে হল আপনি আপনার পরিচয়-সম্পর্কিত তথ্য নিয়ন্ত্রণ করতে পারবেন না বা কারো ব্যক্তিগতভাবে শনাক্তযোগ্য তথ্য (PII) অ্যাক্সেস আছে এবং এই দলগুলোর কতটা অ্যাক্সেস আছে তা নির্ধারণ করতে পারবেন না। +যাইহোক, ঐতিহ্যবাহী পরিচয় ব্যবস্থাপনা সিস্টেমগুলি দীর্ঘদিন ধরে কেন্দ্রীভূত মধ্যস্থতাকারীদের উপর নির্ভর করে যারা আপনার শনাক্তকারী এবং [প্রত্যয়ন](/glossary/#attestation) ইস্যু করে, ধরে রাখে এবং নিয়ন্ত্রণ করে। এর মানে হল আপনি আপনার পরিচয়-সম্পর্কিত তথ্য নিয়ন্ত্রণ করতে পারবেন না বা কারো ব্যক্তিগতভাবে শনাক্তযোগ্য তথ্য (PII) অ্যাক্সেস আছে এবং এই দলগুলোর কতটা অ্যাক্সেস আছে তা নির্ধারণ করতে পারবেন না। -এই সমস্যাগুলি সমাধান করার জন্য, আমরা ইথেরিয়াম -এর মতো পাবলিক ব্লকচেইনে তৈরি বিকেন্দ্রীভূত পরিচয় ব্যবস্থা করেছি। বিকেন্দ্রীভূত পরিচয় ব্যক্তিদের তাদের পরিচয়-সম্পর্কিত তথ্য পরিচালনা করতে দেয়। বিকেন্দ্রীভূত পরিচয় সমাধানের সাথে, _আপনি_ শনাক্তকারী তৈরি করতে পারেন এবং কেন্দ্রীয় কর্তৃপক্ষের উপর নির্ভর না করে আপনার প্রত্যয়ন দাবি করতে পারেন, যেমন পরিষেবা প্রদানকারী বা সরকার। +এই সমস্যাগুলি সমাধান করার জন্য, আমরা ইথেরিয়াম -এর মতো পাবলিক ব্লকচেইনে তৈরি বিকেন্দ্রীভূত পরিচয় ব্যবস্থা করেছি। বিকেন্দ্রীভূত পরিচয় ব্যক্তিদের তাদের পরিচয়-সম্পর্কিত তথ্য পরিচালনা করতে দেয়। বিকেন্দ্রীভূত পরিচয় সমাধানের মাধ্যমে, _আপনিই_ শনাক্তকারী তৈরি করতে পারেন এবং কেন্দ্রীয় কর্তৃপক্ষের, যেমন পরিষেবা প্রদানকারী বা সরকারের উপর নির্ভর না করে আপনার প্রত্যয়ন দাবি করতে ও ধরে রাখতে পারেন। ## পরিচয় কী? {#what-is-identity} -পরিচয় মানে স্বতন্ত্র বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত একজন ব্যক্তির নিজের অনুভূতি। পরিচয় বলতে বোঝায় একটি _ব্যক্তি_, অর্থাৎ, একটি স্বতন্ত্র মানব সত্তা। পরিচয় অন্য অ-মানব সত্ত্বাকেও উল্লেখ করতে পারে, যেমন একটি সংস্থা বা কর্তৃপক্ষ। +পরিচয় মানে স্বতন্ত্র বৈশিষ্ট্য দ্বারা সংজ্ঞায়িত একজন ব্যক্তির নিজের অনুভূতি। পরিচয় বলতে একজন _ব্যক্তি_ হওয়াকে বোঝায়, অর্থাৎ, একটি স্বতন্ত্র মানব সত্তা। পরিচয় অন্য অ-মানব সত্ত্বাকেও উল্লেখ করতে পারে, যেমন একটি সংস্থা বা কর্তৃপক্ষ। + + ## শনাক্তকারী কী? {#what-are-identifiers} @@ -33,153 +35,184 @@ summaryPoint3: ক্রিপ্টোকারেন্সির জন্য শনাক্তকারীর এই ঐতিহ্যগত উদাহরণগুলি কেন্দ্রীয় সত্তা দ্বারা জারি করা, রাখা এবং নিয়ন্ত্রণ করা হয়। আপনার নাম পরিবর্তন করার জন্য আপনার সরকারের কাছ থেকে বা আপনার হ্যান্ডেল পরিবর্তন করার জন্য একটি সোশ্যাল মিডিয়া প্ল্যাটফর্মের অনুমতি প্রয়োজন। -## প্রত্যয়ন কী? {#what-are-attestations} +## বিকেন্দ্রীভূত পরিচয়ের সুবিধাসমূহ {#benefits-of-decentralized-identity} -একটি প্রত্যয়ন একটি দাবি যা একটি সত্তা দ্বারা অন্য সত্তা সম্পর্কে তৈরি করা। আপনি যদি মার্কিন যুক্তরাষ্ট্রে থাকেন, তাহলে মোটর যানবাহন বিভাগ (একটি সত্তা) দ্বারা আপনাকে জারি করা ড্রাইভিং লাইসেন্সটি প্রমাণ করে যে আপনি (অন্য সত্তা) আইনত গাড়ি চালানোর অনুমতি পেয়েছেন। +1. বিকেন্দ্রীকৃত পরিচয় তথ্য সনাক্তকরণের ব্যক্তিগত নিয়ন্ত্রণ বাড়ায়। বিকেন্দ্রীভূত শনাক্তকারী এবং প্রত্যয়ন কেন্দ্রীভূত কর্তৃপক্ষ এবং তৃতীয় পক্ষের পরিষেবাগুলির উপর নির্ভর না করেই যাচাই করা যেতে পারে। -প্রত্যয়ন শনাক্তকারী বিষয় সমূহের থেকে আলাদা। একটি প্রত্যয়ন _ধারণ করে_ একটি নির্দিষ্ট পরিচয় উল্লেখ করার জন্য সনাক্তকারী, এবং এই পরিচয়ের সাথে সম্পর্কিত একটি বৈশিষ্টের দাবি তৈরী করে। তাই, আপনার ড্রাইভিং লাইসেন্সে শনাক্তকারী বিষয়সমূহ (নাম, জন্ম তারিখ, ঠিকানা) আছে কিন্তু এটি আপনার গাড়ি চালানোর আইনগত অধিকার সম্পর্কেও প্রত্যয়ন। +2. বিকেন্দ্রীভূত পরিচয় সমাধানগুলি ব্যবহারকারীর পরিচয় যাচাই এবং পরিচালনার জন্য একটি আস্থাহীন, নির্বিঘ্ন এবং গোপনীয়তা-সুরক্ষামূলক পদ্ধতি সহজতর করে। -### বিকেন্দ্রীভূত শনাক্তকারী সমূহ কী? {#what-are-decentralized-identifiers} +3. বিকেন্দ্রীভূত পরিচয় ব্লকচেইন প্রযুক্তি ব্যবহার করে, যা বিভিন্ন পক্ষের মধ্যে আস্থা তৈরি করে এবং প্রত্যয়নের বৈধতা প্রমাণ করার জন্য ক্রিপ্টোগ্রাফিক গ্যারান্টি প্রদান করে। -আপনার আইনি নাম বা ইমেল ঠিকানার মত গতানুগতিক শনাক্তকারীসমূহ তৃতীয় পক্ষ—সরকার ও ইমেল প্রদানকারীগণের উপর উপর নির্ভর করে । বিকেন্দ্রীভূত শনাক্তকারীসমূহ (DID) আলাদা—এগুলি কোনো কেন্দ্রীয় সত্তা দ্বারা জারি, পরিচালিত বা নিয়ন্ত্রিত হয় না। +4. বিকেন্দ্রীভূত পরিচয় পরিচয়-ডেটা বহনযোগ্য করে তোলে। ব্যবহারকারীরা একটি মোবাইল ওয়ালেটে প্রত্যয়ন ও শনাক্তকারী সঞ্চয় করে এবং তাদের পছন্দের যেকোনো পক্ষের সাথে শেয়ার করতে পারে। বিকেন্দ্রীভূত শনাক্তকারী এবং প্রত্যয়ন প্রদানকারী সংস্থার ডাটাবেসের মধ্যে লক করা হয় না। -বিকেন্দ্রীভূত শনাক্তকারী ব্যক্তিদের দ্বারা জারি করা হয়, রাখা হয় এবং নিয়ন্ত্রিত হয়। একটি [ইথেরিয়াম অ্যাকাউন্ট](/developers/docs/accounts/) হলো একটি বিকেন্দ্রীভূত শনাক্তকারীর উদাহরণ। আপনি কারও অনুমতি ছাড়া এবং কেন্দ্রীয় রেজিস্ট্রিতে সংরক্ষণ করার প্রয়োজন ছাড়াই আপনি যত খুশি অ্যাকাউন্ট তৈরি করতে পারেন। +5. বিকেন্দ্রীভূত পরিচয়কে উদীয়মান [জিরো-নলেজ](/glossary/#zk-proof) প্রযুক্তিগুলির সাথে ভালোভাবে কাজ করতে হবে যা ব্যক্তিদের কোনো কিছুর মালিকানা বা কোনো কাজ সম্পন্ন করার প্রমাণ দিতে সক্ষম করবে, সেই জিনিসটি কী তা প্রকাশ না করেই। এটি ভোট দেওয়ার মতো অ্যাপ্লিকেশনগুলির জন্য বিশ্বাস এবং গোপনীয়তা একত্রিত করার একটি শক্তিশালী উপায় হয়ে উঠতে পারে। -বিকেন্দ্রীভূত শনাক্তকারীগুলি বিতরণ করা লেজার্স (ব্লকচেইন) বা পিয়ার-টু-পিয়ার নেটওয়ার্কগুলিতে সংরক্ষণ করা হয়। এটি DID সমূহকে [বিশ্বব্যাপী অনন্য, উচ্চ প্রাপ্যতার সাথে সমাধানযোগ্য এবং ক্রিপ্টোগ্রাফিকভাবে যাচাইযোগ্য](https://w3c-ccg.github.io/did-primer/) করে। একটি বিকেন্দ্রীভূত শনাক্তকারী ব্যক্তি, সংস্থা বা সরকারী প্রতিষ্ঠান সহ বিভিন্ন সত্তার সাথে যুক্ত হতে পারে। +6. বিকেন্দ্রীভূত পরিচয় [অ্যান্টি-সাইবিল](/glossary/#anti-sybil) মেকানিজমকে শনাক্ত করতে সক্ষম করে যখন একজন স্বতন্ত্র ব্যক্তি কোনো সিস্টেমকে গেম বা স্প্যাম করার জন্য একাধিক ব্যক্তি হওয়ার ভান করে। -## কিসে বিকেন্দ্রীভূত শনাক্তকারী সমূহ সম্ভব করে তোলে? {#what-makes-decentralized-identifiers-possible} +## বিকেন্দ্রীভূত পরিচয়ের ব্যবহারের ক্ষেত্র {#decentralized-identity-use-cases} -### 1. পাবলিক কী অবকাঠামো (PKI) {#public-key-cryptography} +বিকেন্দ্রীভূত পরিচয়ের অনেক সম্ভাব্য ব্যবহার-ক্ষেত্র রয়েছে: -পাবলিক-কী অবকাঠামো (PKI) হল একটি তথ্য নিরাপত্তা পরিমাপ যা একটি সত্তার জন্য [পাবলিক কী](/glossary/#public-key) এবং [প্রাইভেট কী](/glossary/#private-key) তৈরি করে। পাবলিক-কী ক্রিপ্টোগ্রাফি ব্লকচেইন নেটওয়ার্কে ব্যবহারকারীর পরিচয় প্রমাণীকরণ এবং ডিজিটাল সম্পদের মালিকানা প্রমাণ করতে ব্যবহৃত হয়। +### ১. সার্বজনীন লগইন {#universal-dapp-logins} -কিছু বিকেন্দ্রীকৃত শনাক্তকারী, যেমন একটি ইথেরিয়াম অ্যাকাউন্ট, পাবলিক এবং ব্যক্তিগত কী আছে। পাবলিক কী অ্যাকাউন্টের নিয়ন্ত্রককে শনাক্ত করে, যখন ব্যক্তিগত কীগুলি এই অ্যাকাউন্টের জন্য বার্তাগুলি সাইন এবং ডিক্রিপ্ট করতে পারে। PKI সমস্ত দাবি যাচাই করার জন্য [ক্রিপ্টোগ্রাফিক স্বাক্ষর](https://andersbrownworth.com/blockchain/public-private-keys/) ব্যবহার করে সত্তাকে প্রমাণীকরণ এবং ছদ্মবেশীকরণ এবং জাল পরিচয়ের ব্যবহার প্রতিরোধ করার জন্য প্রয়োজনীয় প্রমাণ সরবরাহ করে। +বিকেন্দ্রীভূত পরিচয় বিকেন্দ্রীভূত প্রমাণীকরণের মাধ্যমে পাসওয়ার্ড-ভিত্তিক লগইনগুলি প্রতিস্থাপন করতে সহায়তা করতে পারে। পরিষেবা প্রদানকারীরা ব্যবহারকারীদের প্রত্যয়ন জারি করতে পারে, যা একটি ইথেরিয়াম ওয়ালেটে সংরক্ষণ করা যেতে পারে। একটি উদাহরণ প্রত্যয়ন হবে একটি [NFT](/glossary/#nft) যা ধারককে একটি অনলাইন কমিউনিটিতে অ্যাক্সেস দেয়। -### 2. বিকেন্দ্রীভূত ডেটাস্টোরসমূহ {#decentralized-datastores} +একটি [Sign-In with Ethereum](https://siwe.xyz/) ফাংশন তখন সার্ভারগুলিকে ব্যবহারকারীর ইথেরিয়াম অ্যাকাউন্ট নিশ্চিত করতে এবং তাদের অ্যাকাউন্ট ঠিকানা থেকে প্রয়োজনীয় প্রত্যয়নপত্র আনতে সক্ষম করবে। এর মানে ব্যবহারকারীরা দীর্ঘ পাসওয়ার্ড মুখস্থ না করেই প্ল্যাটফর্ম এবং ওয়েবসাইটগুলি অ্যাক্সেস করতে পারে এবং ব্যবহারকারীদের জন্য অনলাইন অভিজ্ঞতা উন্নত করে। -একটি ব্লকচেইন একটি যাচাইযোগ্য ডেটা রেজিস্ট্রি হিসাবে কাজ করে: একটি উন্মুক্ত, বিশ্বাসহীন এবং তথ্যের বিকেন্দ্রীভূত ভান্ডার। পাবলিক ব্লকচেইনের অস্তিত্ব কেন্দ্রীভূত রেজিস্ট্রিতে শনাক্তকারী সংরক্ষণ করার প্রয়োজনীয়তা দূর করে। +### 2. KYC প্রমাণীকরণ {#kyc-authentication} -যদি কেউ বিকেন্দ্রীভূত শনাক্তকারীর বৈধতা নিশ্চিত করতে চান, তাহলে তারা ব্লকচেইনে সংশ্লিষ্ট পাবলিক কী দেখতে পারেন। এটি প্রথাগত শনাক্তকারীর থেকে আলাদা যার প্রমাণীকরণের জন্য তৃতীয় পক্ষের প্রয়োজন। +অনেক অনলাইন পরিষেবা ব্যবহার করার জন্য ব্যক্তিদের প্রত্যয়ন এবং প্রমাণপত্র প্রদান করতে হয়, যেমন একটি ড্রাইভিং লাইসেন্স বা জাতীয় পাসপোর্ট। কিন্তু এই পদ্ধতিটি সমস্যাযুক্ত কারণ ব্যক্তিগত ব্যবহারকারীর তথ্যের সাথে আপোস করা যেতে পারে এবং পরিষেবা প্রদানকারীরা প্রত্যয়নের সত্যতা যাচাই করতে পারে না। -## বিকেন্দ্রীভূত শনাক্তকারী এবং প্রত্যয়নগুলি কীভাবে বিকেন্দ্রীকৃত পরিচয় সক্ষম করে? {#how-decentralized-identifiers-and-attestations-enable-decentralized-identity} +বিকেন্দ্রীভূত পরিচয় কোম্পানিগুলিকে প্রচলিত [আপনার গ্রাহককে জানুন (KYC)](https://en.wikipedia.org/wiki/Know_your_customer) প্রক্রিয়াগুলি এড়িয়ে যেতে এবং যাচাইযোগ্য শংসাপত্রের মাধ্যমে ব্যবহারকারীর পরিচয় প্রমাণীকরণ করতে দেয়। এটি পরিচয় ব্যবস্থাপনার খরচ কমায় এবং জাল নথিপত্র ব্যবহার প্রতিরোধ করে। -বিকেন্দ্রীভূত পরিচয় হল এই ধারণা যে পরিচয়-সম্পর্কিত তথ্য স্ব-নিয়ন্ত্রিত, ব্যক্তিগত এবং বহনযোগ্য হওয়া উচিত, বিকেন্দ্রীভূত শনাক্তকারী এবং প্রত্যয়নগুলি প্রাথমিক বিল্ডিং ব্লক। +### 3. ভোটিং এবং অনলাইন কমিউনিটি {#voting-and-online-communities} -বিকেন্দ্রীভূত পরিচয়ের পরিপ্রেক্ষিতে, প্রত্যয়নগুলি ([ভেরিফাইএবল ক্রেডেনসিয়ালস](https://www.w3.org/TR/vc-data-model/) নামেও পরিচিত) টেম্পার-প্রুফ, ক্রিপ্টোগ্রাফিকভাবে ইস্যুকারী দ্বারা করা যাচাইযোগ্য দাবি। প্রতিটি প্রত্যয়ন বা ভেরিফাইএবল ক্রেডেনসিয়ালস একটি সত্তা (যেমন, একটি সংস্থা) ইস্যুসমূহ তাদের DID এর সাথে যুক্ত। +অনলাইন ভোটিং এবং সোশ্যাল মিডিয়া বিকেন্দ্রীভূত পরিচয়ের জন্য দুটি অভিনব অ্যাপ্লিকেশন। অনলাইন ভোটিং স্কিমগুলি ম্যানিপুলেশনের জন্য সংবেদনশীল, বিশেষ করে যদি ম্যালিসিয়াস এক্টরস ভোট দেওয়ার জন্য মিথ্যা পরিচয় তৈরি করে। ব্যক্তিদেরকে অনচেইন প্রত্যয়ন উপস্থাপন করতে বলা অনলাইন ভোটিং প্রক্রিয়ার অখণ্ডতা উন্নত করতে পারে। -যেহেতু DID ব্লকচেইনে সংরক্ষিত থাকে, তাই যে কেউ ইথেরিয়ামে ইস্যুকারীর ডিআইডি ক্রস-চেক করে একটি প্রত্যয়নের বৈধতা যাচাই করতে পারে। মূলত, ইথেরিয়াম ব্লকচেইন একটি গ্লোবাল ডিরেক্টরির মতো কাজ করে যা কিছু নির্দিষ্ট সত্তার সাথে যুক্ত DID যাচাই করতে সক্ষম করে। +বিকেন্দ্রীকৃত পরিচয় জাল অ্যাকাউন্ট মুক্ত অনলাইন কমিউনিটিস তৈরি করতে সাহায্য করতে পারে। উদাহরণস্বরূপ, প্রতিটি ব্যবহারকারীকে একটি অনচেইন পরিচয় ব্যবস্থা, যেমন Ethereum Name Service ব্যবহার করে তাদের পরিচয় প্রমাণীকরণ করতে হতে পারে, যা বটের সম্ভাবনা কমিয়ে দেয়। -বিকেন্দ্রীভূত শনাক্তকারীর কারণ হল প্রত্যয়নগুলি স্ব-নিয়ন্ত্রিত এবং যাচাইযোগ্য। এমনকি যদি ইস্যুকারীর আর অস্তিত্ব না থাকে, তবে ধারকের কাছে সর্বদা প্রত্যয়নের মূল এবং বৈধতার প্রমাণ থাকে। +### ৪. অ্যান্টি-সাইবিল সুরক্ষা {#sybil-protection} -বিকেন্দ্রীভূত পরিচয়ের মাধ্যমে ব্যক্তিগত তথ্যের গোপনীয়তা রক্ষার জন্য বিকেন্দ্রীকৃত শনাক্তকারীও গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যদি একজন ব্যক্তি একটি প্রত্যয়নের প্রমাণ (একটি ড্রাইভারের লাইসেন্স) জমা দেন, তাহলে যাচাইকারী পক্ষকে প্রমাণের তথ্যের বৈধতা পরীক্ষা করার প্রয়োজন নেই। পরিবর্তে, প্রমাণটি বৈধ কিনা তা নির্ধারণ করার জন্য যাচাইকারীর শুধুমাত্র প্রত্যয়নের সত্যতা এবং ইস্যুকারী সংস্থার পরিচয়ের ক্রিপ্টোগ্রাফিক গ্যারান্টি প্রয়োজন। +অনুদান প্রদানকারী অ্যাপ্লিকেশনগুলি যেগুলি [চতুর্ঘাত ভোটিং](/glossary/#quadratic-voting) ব্যবহার করে সেগুলি [সাইবিল আক্রমণের](/glossary/#sybil-attack) জন্য ঝুঁকিপূর্ণ কারণ অনুদানের মূল্য বৃদ্ধি পায় যখন আরও বেশি ব্যক্তি এর জন্য ভোট দেয়, যা ব্যবহারকারীদের তাদের অবদানকে অনেক পরিচয়ে বিভক্ত করতে উৎসাহিত করে। বিকেন্দ্রীভূত পরিচয়গুলি প্রত্যেক অংশগ্রহণকারীর উপর বোঝা বাড়িয়ে প্রমাণ করতে সাহায্য করে যে তারা সত্যিই মানুষ, যদিও প্রায়ই নির্দিষ্ট ব্যক্তিগত তথ্য প্রকাশ না করেই। -## বিকেন্দ্রীভূত পরিচয়ে প্রত্যয়নের প্রকার {#types-of-attestations-in-decentralized-identity} +### ৫। জাতীয় এবং সরকারি পরিচয়পত্র {#national-and-government-id} -একটি ইথেরিয়াম-ভিত্তিক আইডেন্টিটি ইকোসিস্টেমে কীভাবে প্রত্যয়িত তথ্য সংরক্ষণ এবং পুনরুদ্ধার করা হয় তা প্রথাগত পরিচয় ব্যবস্থাপনা থেকে আলাদা। বিকেন্দ্রীভূত পরিচয় ব্যবস্থায় প্রত্যয়ন জারি, সংরক্ষণ এবং যাচাই করার বিভিন্ন পদ্ধতির একটি সংক্ষিপ্ত বিবরণ এখানে রয়েছে: +সরকারগুলি বিকেন্দ্রীভূত পরিচয়ের নীতি ব্যবহার করে মৌলিক পরিচয় নথি—যেমন জাতীয় পরিচয়পত্র, পাসপোর্ট, বা ড্রাইভিং লাইসেন্স—ইথেরিয়ামের উপর যাচাইযোগ্য শংসাপত্র হিসাবে ইস্যু করতে পারে, যা অনলাইন পরিচয় যাচাইকরণে জালিয়াতি এবং প্রতারণা কমাতে সত্যতার শক্তিশালী ক্রিপ্টোগ্রাফিক গ্যারান্টি প্রদান করে। নাগরিকরা এই প্রত্যয়নগুলি তাদের ব্যক্তিগত [ওয়ালেটে](/wallets/) সংরক্ষণ করতে পারে এবং তাদের পরিচয়, বয়স, বা ভোট দেওয়ার অধিকার প্রমাণ করতে ব্যবহার করতে পারে। -### অফ-চেইন প্রত্যয়নসমূহ {#off-chain-attestations} +এই মডেলটি নির্বাচনী প্রকাশের অনুমতি দেয়, বিশেষ করে যখন এটি [জিরো-নলেজ প্রুফ (ZKP)](/zero-knowledge-proofs/) গোপনীয়তা প্রযুক্তির সাথে মিলিত হয়। উদাহরণস্বরূপ, একজন নাগরিক ক্রিপ্টোগ্রাফিকভাবে প্রমাণ করতে পারেন যে তারা একটি বয়স-সীমাবদ্ধ পরিষেবা অ্যাক্সেস করার জন্য ১৮ বছরের বেশি বয়সী, তাদের সঠিক জন্মতারিখ প্রকাশ না করেই, যা একটি ঐতিহ্যবাহী আইডি-র চেয়ে বেশি গোপনীয়তা প্রদান করে। -চেইনে প্রত্যয়ন সংরক্ষণের সাথে একটি উদ্বেগ হল যে সেগুলিতে এমন তথ্য থাকতে পারে যা ব্যক্তিরা গোপন রাখতে চায়। ইথেরিয়াম ব্লকচেইনের সর্বজনীন প্রকৃতি এই ধরনের প্রত্যয়ন সংরক্ষণ করাকে আকর্ষণীয় করে তোলে। +#### 💡কেস স্টাডি: ইথেরিয়ামে ভুটান ন্যাশনাল ডিজিটাল আইডি (NDI) {#case-study-bhutan-ndi} -সমাধান হল প্রত্যয়ন জারি করা, যা ব্যবহারকারীদের অফ-চেইন ডিজিটাল ওয়ালেটে ঘটে, কিন্তু ইস্যুকারীর DID-তে সঞ্চিত অন-চেইনে স্বাক্ষর করা। এই প্রত্যয়নগুলি [JSON ওয়েব টোকেন](https://en.wikipedia.org/wiki/JSON_Web_Token) হিসাবে এনকোড করা হয়েছে এবং এতে ইস্যুকারীর ডিজিটাল স্বাক্ষর রয়েছে—যা অফ-চেইন দাবিগুলির সহজে যাচাই করার অনুমতি দেয়। +- ভুটানের প্রায় ৮০০,০০০ নাগরিকের জন্য যাচাইযোগ্য পরিচয়পত্রের অ্যাক্সেস প্রদান করে +- অক্টোবর ২০২৫-এ পলিগন নেটওয়ার্ক থেকে [ইথেরিয়াম মেইননেটে](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) স্থানান্তরিত। +- মার্চ ২০২৫ পর্যন্ত [২,৩৪,০০০-এর বেশি ডিজিটাল আইডি](https://www.blockchain-council.org/blockchain/bhutan-uses-blockchain-in-digital-id-project/) ইস্যু করা হয়েছে -অফ-চেইন প্রত্যয়ন ব্যাখ্যা করার জন্য এখানে একটি অনুমানমূলক দৃশ্যকল্প রয়েছে: +ভুটান রাজ্য [তার জাতীয় ডিজিটাল পরিচয় (NDI) সিস্টেমটি](https://www.bhutanndi.com/article/bhutan-adopts-ethereum-for-national-identity-a-new-chapter-in-digital-sovereignty_2d0c7ec2-5605-4c42-b258-bd9361ae8878) অক্টোবর ২০২৫-এ ইথেরিয়ামে স্থানান্তরিত করেছে। বিকেন্দ্রীভূত পরিচয় এবং স্ব-সার্বভৌম পরিচয়ের নীতির উপর ভিত্তি করে নির্মিত, ভুটানের NDI সিস্টেম বিকেন্দ্রীভূত শনাক্তকারী এবং যাচাইযোগ্য শংসাপত্র ব্যবহার করে সরাসরি একজন নাগরিকের ব্যক্তিগত ওয়ালেটে ডিজিটালি স্বাক্ষরিত শংসাপত্র ইস্যু করে। ইথেরিয়ামে এই শংসাপত্রগুলির ক্রিপ্টোগ্রাফিক প্রমাণ নোঙ্গর করে, সিস্টেমটি নিশ্চিত করে যে সেগুলি খাঁটি, টেম্পার-প্রুফ এবং কোনো কেন্দ্রীয় কর্তৃপক্ষকে জিজ্ঞাসা না করেই যেকোনো পক্ষ দ্বারা যাচাই করা যেতে পারে। -1. একটি বিশ্ববিদ্যালয় (ইস্যুকারী) একটি প্রত্যয়ন (একটি ডিজিটাল একাডেমিক সনদপত্র) তৈরি করে, তার কীগুলির দ্বারা স্বাক্ষর করে এবং এটি ববকে (পরিচয় মালিক) ইস্যু করে। +সিস্টেমের আর্কিটেকচার [জিরো-নলেজ প্রুফ (ZKP)](/zero-knowledge-proofs/) প্রযুক্তি ব্যবহারের মাধ্যমে গোপনীয়তার উপর জোর দেয়। "নির্বাচনী প্রকাশ"-এর এই বাস্তবায়ন নাগরিকদের নির্দিষ্ট তথ্য প্রমাণ করার অনুমতি দেয় (যেমন, "আমার বয়স ১৮ বছরের বেশি" বা "আমি একজন নাগরিক") পরিষেবাগুলি অ্যাক্সেস করার জন্য তাদের সম্পূর্ণ আইডি নম্বর বা সঠিক জন্ম তারিখের মতো অন্তর্নিহিত ব্যক্তিগত ডেটা প্রকাশ না করেই। এটি একটি নিরাপদ, ব্যবহারকারী-কেন্দ্রিক এবং গোপনীয়তা-সংরক্ষণকারী জাতীয় আইডি সিস্টেমের জন্য ইথেরিয়ামের একটি শক্তিশালী, বাস্তব-বিশ্বের ব্যবহার প্রদর্শন করে। -2. বব একটি চাকরির জন্য আবেদন করেন এবং একজন নিয়োগকর্তার কাছে তার শিক্ষাগত যোগ্যতা প্রমাণ করতে চান, তাই তিনি তার মোবাইল ওয়ালেট থেকে প্রত্যয়ন শেয়ার করেন। কোম্পানী (যাচাইকারী) তারপর ইস্যুকারীর DID (অর্থাৎ, ইথেরিয়ামে এর পাবলিক কী) পরীক্ষা করে সত্যায়নের বৈধতা নিশ্চিত করতে পারে। +#### 💡কেস স্টাডি: ইথেরিয়াম [লেয়ার ২](/layer-2/) ZKSync Era-তে বুয়েনস আইরেস শহরের কোয়ার্কআইডি {#case-study-buenos-aires-quarkid} -### অবিরাম অ্যাক্সেস সহ অফ-চেইন প্রত্যয়ন {#offchain-attestations-with-persistent-access} +- লঞ্চের সময় [৩.৬ মিলিয়নেরও বেশি ব্যবহারকারীকে](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo) বিকেন্দ্রীভূত পরিচয়পত্র প্রদান করা হয়েছে +- QuarkID হল একটি ওপেন-সোর্স প্রোটোকল যা জাতিসংঘের টেকসই উন্নয়ন লক্ষ্যমাত্রার অধীনে একটি [ডিজিটাল পাবলিক গুড](https://www.digitalpublicgoods.net/r/quarkid) হিসাবে স্বীকৃত +- একটি "[ব্যবহারকারী-হিসাবে-সরকার](https://buenosaires.gob.ar/innovacionytransformaciondigital/miba-con-tecnologia-quarkid-la-ciudad-de-buenos-aires-incorporo)" মডেলের উপর জোর দেয়, যেখানে শহরটি প্রোটোকলের মালিক নয়, যা নাগরিকদের সম্পূর্ণ ডেটা মালিকানা এবং গোপনীয়তা দেয় -এই ব্যবস্থার অধীনে প্রত্যয়নগুলি JSON ফাইলে রূপান্তরিত হয় এবং অফ-চেইন সংরক্ষণ করা হয় (আদর্শভাবে একটি [বিকেন্দ্রীভূত ক্লাউড স্টোরেজ](/developers/docs/storage/) প্ল্যাটফর্মে, যেমন IPFS বা Swarm)। যাইহোক, JSON ফাইলের একটি [হ্যাশ](/glossary/#hash) অন-চেইন সংরক্ষণ করা হয় এবং একটি অন-চেইন রেজিস্ট্রির মাধ্যমে একটি DID-এর সাথে লিঙ্ক করা হয়। সংশ্লিষ্ট DID হয় প্রত্যয়ন প্রদানকারী বা প্রাপকের হতে পারে। +২০২৪ সালে, বুয়েনস আইরেস শহরের সরকার (GCBA) QuarkID-কে একীভূত করে, যা GCBA-এর উদ্ভাবন ও ডিজিটাল রূপান্তর সচিবালয় দ্বারা নির্মিত একটি ওপেন-সোর্স "ডিজিটাল ট্রাস্ট ফ্রেমওয়ার্ক", miBA-এর মধ্যে, যা বাসিন্দাদের সরকারি পরিষেবা এবং অফিসিয়াল নথি অ্যাক্সেস করার জন্য শহরের অফিসিয়াল অ্যাপ। লঞ্চের সময়, miBA-এর সকল ৩.৬ মিলিয়নেরও বেশি ব্যবহারকারীকে বিকেন্দ্রীভূত ডিজিটাল পরিচয়পত্র প্রদান করা হয়েছিল যা তাদের অনচেইনে যাচাইযোগ্য ডিজিটাল নথি এবং সার্টিফিকেট পরিচালনা এবং শেয়ার করার অনুমতি দেয়, যার মধ্যে নাগরিকত্বের শংসাপত্র, জন্ম, বিবাহ এবং মৃত্যু সনদ, করের রেকর্ড, টিকা দেওয়ার রেকর্ড এবং আরও অনেক কিছু রয়েছে। -এই পদ্ধতিটি ব্লকচেইন-ভিত্তিক অটলতা লাভের জন্য প্রত্যয়নকে সক্ষম করে, যখন দাবির তথ্য এনক্রিপ্ট করা এবং যাচাইযোগ্য রাখা হয়। এটি নির্বাচনী প্রকাশের জন্যও অনুমতি দেয় যেহেতু ব্যক্তিগত কী ধারক তথ্যটি ডিক্রিপ্ট করতে পারে। +ইথেরিয়াম [লেয়ার ২](/layer-2/) নেটওয়ার্ক ZKSync Era-এর উপর নির্মিত, QuarkID সিস্টেমটি ZKP প্রযুক্তি ব্যবহার করে নাগরিকদের তাদের মোবাইল ডিভাইসের মাধ্যমে পিয়ার-টু-পিয়ার ব্যক্তিগত শংসাপত্র যাচাই করার অনুমতি দেয়—অপ্রয়োজনীয় ব্যক্তিগত ডেটা প্রকাশ না করেই। প্রোগ্রামটি একটি "ব্যবহারকারী-হিসাবে-সরকার" মডেল তুলে ধরে যেখানে GCBA ওপেন-সোর্স, ইন্টারঅপারেবল QuarkID প্রোটোকলের একজন ব্যবহারকারী হিসাবে কাজ করে, কেন্দ্রীয় মালিক হিসাবে কাজ করার পরিবর্তে। এই ZKP-সক্ষম আর্কিটেকচার একটি মূল গোপনীয়তা বৈশিষ্ট্য প্রদান করে: কোনো তৃতীয় পক্ষ, এমনকি GCBA-ও, ট্র্যাক করতে পারে না যে একজন নাগরিক কীভাবে, কখন বা কেন তাদের শংসাপত্র ব্যবহার করে। এই সফল প্রোগ্রামটি নাগরিকদের তাদের সংবেদনশীল ডেটার উপর সম্পূর্ণ স্ব-সার্বভৌম পরিচয় এবং নিয়ন্ত্রণ প্রদান করে, যা সবই ইথেরিয়ামের বিশ্বব্যাপী-বিতরিত নেটওয়ার্ক দ্বারা সুরক্ষিত। -### অন-চেইন প্রত্যয়নসমূহ {#onchain-attestations} +## প্রত্যয়ন কী? {#what-are-attestations} -অন-চেইন প্রত্যয়ন ইথেরিয়াম ব্লকচেইনে [স্মার্ট কন্ট্র্যাক্টে](/developers/docs/smart-contracts/) অনুষ্ঠিত হয়। স্মার্ট কন্ট্র্যাক্ট (একটি রেজিস্ট্রি হিসাবে কাজ করে) একটি অনুরূপ অন-চেইন বিকেন্দ্রীভূত শনাক্তকারীর (একটি পাবলিক কী) একটি প্রত্যয়ন ম্যাপ করবে। +একটি প্রত্যয়ন একটি দাবি যা একটি সত্তা দ্বারা অন্য সত্তা সম্পর্কে তৈরি করা। আপনি যদি মার্কিন যুক্তরাষ্ট্রে থাকেন, তাহলে মোটর যানবাহন বিভাগ (একটি সত্তা) দ্বারা আপনাকে জারি করা ড্রাইভিং লাইসেন্সটি প্রমাণ করে যে আপনি (অন্য সত্তা) আইনত গাড়ি চালানোর অনুমতি পেয়েছেন। -কীভাবে অন-চেইন প্রত্যয়নগুলি অনুশীলনে কাজ করতে পারে তা দেখানোর জন্য এখানে একটি উদাহরণ দেওয়া হল: +প্রত্যয়ন শনাক্তকারী বিষয় সমূহের থেকে আলাদা। একটি প্রত্যয়ন একটি নির্দিষ্ট পরিচয়কে নির্দেশ করার জন্য শনাক্তকারী _ধারণ করে_ এবং এই পরিচয়ের সাথে সম্পর্কিত একটি বৈশিষ্ট্য সম্পর্কে দাবি করে। তাই, আপনার ড্রাইভিং লাইসেন্সে শনাক্তকারী বিষয়সমূহ (নাম, জন্ম তারিখ, ঠিকানা) আছে কিন্তু এটি আপনার গাড়ি চালানোর আইনগত অধিকার সম্পর্কেও প্রত্যয়ন। -1. একটি কোম্পানি (XYZ Corp) একটি স্মার্ট কন্ট্র্যাক্ট ব্যবহার করে মালিকানা শেয়ার বিক্রি করার পরিকল্পনা করে কিন্তু শুধুমাত্র সেই ক্রেতাদের চায় যারা ব্যাকগ্রাউন্ড চেক সম্পন্ন করেছে। +### বিকেন্দ্রীভূত শনাক্তকারী সমূহ কী? বিকেন্দ্রীভূত শনাক্তকারীসমূহ কী? {#what-are-decentralized-identifiers} -2. XYZ Corp কোম্পানিকে ইথেরিয়াম-এ অন-চেইন প্রত্যয়ন ইস্যু করার জন্য ব্যাকগ্রাউন্ড চেক করতে পারে। এই প্রত্যয়নটি প্রমাণ করে যে একজন ব্যক্তি কোনো ব্যক্তিগত তথ্য প্রকাশ না করেই ব্যাকগ্রাউন্ড চেক পাস করেছেন। +আপনার আইনি নাম বা ইমেল ঠিকানার মত গতানুগতিক শনাক্তকারীসমূহ তৃতীয় পক্ষ—সরকার ও ইমেল প্রদানকারীগণের উপর উপর নির্ভর করে । বিকেন্দ্রীভূত শনাক্তকারীসমূহ (DID) আলাদা—এগুলি কোনো কেন্দ্রীয় সত্তা দ্বারা জারি, পরিচালিত বা নিয়ন্ত্রিত হয় না। -3. স্মার্ট কন্ট্র্যাক্ট সেলিং শেয়ার স্ক্রিন করা ক্রেতাদের পরিচয়ের জন্য রেজিস্ট্রি চুক্তি পরীক্ষা করতে পারে, যা স্মার্ট কন্ট্রাক্টের পক্ষে কার শেয়ার কেনার অনুমতি আছে বা নাই তা নির্ধারণ করা সম্ভব করে। +বিকেন্দ্রীভূত শনাক্তকারী ব্যক্তিদের দ্বারা জারি করা হয়, রাখা হয় এবং নিয়ন্ত্রিত হয়। একটি [ইথেরিয়াম অ্যাকাউন্ট](/glossary/#account) হলো একটি বিকেন্দ্রীভূত শনাক্তকারীর উদাহরণ। আপনি কারও অনুমতি ছাড়া এবং কেন্দ্রীয় রেজিস্ট্রিতে সংরক্ষণ করার প্রয়োজন ছাড়াই আপনি যত খুশি অ্যাকাউন্ট তৈরি করতে পারেন। -### সোলবাউন্ড টোকেনসমূহ এবং পরিচয় {#soulbound} +বিকেন্দ্রীভূত শনাক্তকারীগুলি ডিস্ট্রিবিউটেড লেজারে ([ব্লকচেইন](/glossary/#blockchain)) বা [পিয়ার-টু-পিয়ার নেটওয়ার্কে](/glossary/#peer-to-peer-network) সংরক্ষণ করা হয়। এটি DID-গুলিকে [বিশ্বব্যাপী অনন্য, উচ্চ প্রাপ্যতার সাথে সমাধানযোগ্য এবং ক্রিপ্টোগ্রাফিকভাবে যাচাইযোগ্য](https://w3c-ccg.github.io/did-primer/) করে তোলে। একটি বিকেন্দ্রীভূত শনাক্তকারী ব্যক্তি, সংস্থা বা সরকারী প্রতিষ্ঠান সহ বিভিন্ন সত্তার সাথে যুক্ত হতে পারে। -[সোলবাউন্ড টোকেন](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) (অ-হস্তান্তরযোগ্য NFT) একটি নির্দিষ্ট ওয়ালেটের অনন্য তথ্য সংগ্রহ করতে ব্যবহার করা যেতে পারে। এটি কার্যকরভাবে একটি নির্দিষ্ট ইথেরিয়াম অ্যাড্রেসের সাথে আবদ্ধ একটি অনন্য অন-চেইন পরিচয় তৈরি করে যাতে কৃতিত্বের প্রতিনিধিত্বকারী টোকেন অন্তর্ভুক্ত থাকতে পারে (যেমন কিছু নির্দিষ্ট অনলাইন কোর্স শেষ করা বা একটি গেমে থ্রেশহোল্ড স্কোর পাস করা) বা কমিউনিটি অংশগ্রহণ। +## কিসে বিকেন্দ্রীভূত শনাক্তকারী সমূহ সম্ভব করে তোলে? কী বিকেন্দ্রীভূত শনাক্তকারীকে সম্ভব করে তোলে? {#what-makes-decentralized-identifiers-possible} -## বিকেন্দ্রীভূত পরিচয়ের সুবিধা {#benefits-of-decentralized-identity} +### ১. পাবলিক কী ক্রিপ্টোগ্রাফি {#public-key-cryptography} -1. বিকেন্দ্রীকৃত পরিচয় তথ্য সনাক্তকরণের ব্যক্তিগত নিয়ন্ত্রণ বাড়ায়। বিকেন্দ্রীভূত শনাক্তকারী এবং প্রত্যয়ন কেন্দ্রীভূত কর্তৃপক্ষ এবং তৃতীয় পক্ষের পরিষেবাগুলির উপর নির্ভর না করেই যাচাই করা যেতে পারে। +পাবলিক-কী ক্রিপ্টোগ্রাফি একটি তথ্য নিরাপত্তা ব্যবস্থা যা একটি সত্তার জন্য একটি [পাবলিক কী](/glossary/#public-key) এবং একটি [প্রাইভেট কী](/glossary/#private-key) তৈরি করে। পাবলিক-কী [ক্রিপ্টোগ্রাফি](/glossary/#cryptography) ব্লকচেইন নেটওয়ার্কে ব্যবহারকারীর পরিচয় প্রমাণীকরণ এবং ডিজিটাল সম্পদের মালিকানা প্রমাণ করতে ব্যবহৃত হয়। -2. বিকেন্দ্রীভূত পরিচয় সমাধানগুলি ব্যবহারকারীর পরিচয় যাচাই এবং পরিচালনার জন্য একটি বিশ্বাসহীন, নির্বিঘ্ন এবং গোপনীয়তা-সুরক্ষা পদ্ধতির সুবিধা দেয়। +কিছু বিকেন্দ্রীকৃত শনাক্তকারী, যেমন একটি ইথেরিয়াম অ্যাকাউন্ট, পাবলিক এবং ব্যক্তিগত কী আছে। পাবলিক কী অ্যাকাউন্টের নিয়ন্ত্রককে শনাক্ত করে, যখন ব্যক্তিগত কীগুলি এই অ্যাকাউন্টের জন্য বার্তাগুলি সাইন এবং ডিক্রিপ্ট করতে পারে। পাবলিক কী ক্রিপ্টোগ্রাফি সত্তাকে প্রমাণীকরণ করতে এবং ছদ্মবেশ ও জাল পরিচয়ের ব্যবহার প্রতিরোধ করার জন্য প্রয়োজনীয় প্রমাণ সরবরাহ করে, সমস্ত দাবি যাচাই করার জন্য [ক্রিপ্টোগ্রাফিক স্বাক্ষর](https://andersbrownworth.com/blockchain/public-private-keys/) ব্যবহার করে। -3. বিকেন্দ্রীভূত পরিচয় ব্লকচেইন প্রযুক্তি ব্যবহার করে, যা বিভিন্ন পক্ষের মধ্যে আস্থা তৈরি করে এবং প্রত্যয়নের বৈধতা প্রমাণ করার জন্য ক্রিপ্টোগ্রাফিক গ্যারান্টি প্রদান করে। +### 2. বিকেন্দ্রীভূত ডেটাস্টোর {#decentralized-datastores} -4. বিকেন্দ্রীভূত পরিচয় পরিচয়-ডেটা বহনযোগ্য করে তোলে। ব্যবহারকারীরা মোবাইল ওয়ালেটে প্রত্যয়ন এবং শনাক্তকারী সঞ্চয় করে এবং তাদের পছন্দের যেকোনো পক্ষের সাথে শেয়ার করতে পারে। বিকেন্দ্রীভূত শনাক্তকারী এবং প্রত্যয়ন প্রদানকারী সংস্থার ডাটাবেসের মধ্যে লক করা হয় না। +একটি ব্লকচেইন একটি যাচাইযোগ্য ডেটা রেজিস্ট্রি হিসাবে কাজ করে: একটি উন্মুক্ত, বিশ্বাসহীন এবং তথ্যের বিকেন্দ্রীভূত ভান্ডার। পাবলিক ব্লকচেইনের অস্তিত্ব কেন্দ্রীভূত রেজিস্ট্রিতে শনাক্তকারী সংরক্ষণ করার প্রয়োজনীয়তা দূর করে। -5. বিকেন্দ্রীভূত পরিচয় উদীয়মান জিরো-নলেজ প্রযুক্তিগুলির সাথে ভালভাবে কাজ করা উচিত যা ব্যক্তিদের প্রমাণ করতে সক্ষম করবে যে তারা নিজের বা কিছু করেছে তা প্রকাশ না করেই। এটি ভোট দেওয়ার মতো অ্যাপ্লিকেশনগুলির জন্য বিশ্বাস এবং গোপনীয়তা একত্রিত করার একটি শক্তিশালী উপায় হয়ে উঠতে পারে। +যদি কেউ বিকেন্দ্রীভূত শনাক্তকারীর বৈধতা নিশ্চিত করতে চান, তাহলে তারা ব্লকচেইনে সংশ্লিষ্ট পাবলিক কী দেখতে পারেন। এটি প্রথাগত শনাক্তকারীর থেকে আলাদা যার প্রমাণীকরণের জন্য তৃতীয় পক্ষের প্রয়োজন। -6. বিকেন্দ্রীভূত পরিচয় অ্যান্টি-সাইবিল মেকানিজমকে শনাক্ত করতে সক্ষম করে যখন একজন ব্যক্তি একাধিক মানুষ হওয়ার ভান করে কোনো সিস্টেমকে গেম বা স্প্যাম করার জন্য। +## বিকেন্দ্রীভূত শনাক্তকারী এবং প্রত্যয়নগুলি কীভাবে বিকেন্দ্রীকৃত পরিচয় সক্ষম করে? বিকেন্দ্রীভূত শনাক্তকারী এবং প্রত্যয়নগুলি কীভাবে বিকেন্দ্রীভূত পরিচয় সক্ষম করে? {#how-decentralized-identifiers-and-attestations-enable-decentralized-identity} -## বিকেন্দ্রীভূত পরিচয় ব্যবহার-ক্ষেত্রসমূহ {#decentralized-identity-use-cases} +বিকেন্দ্রীভূত পরিচয় হল এই ধারণা যে পরিচয়-সম্পর্কিত তথ্য স্ব-নিয়ন্ত্রিত, ব্যক্তিগত এবং বহনযোগ্য হওয়া উচিত, বিকেন্দ্রীভূত শনাক্তকারী এবং প্রত্যয়নগুলি প্রাথমিক বিল্ডিং ব্লক। -বিকেন্দ্রীভূত পরিচয়ের অনেক সম্ভাব্য ব্যবহার-ক্ষেত্র রয়েছে: +বিকেন্দ্রীভূত পরিচয়ের পরিপ্রেক্ষিতে, প্রত্যয়ন (যা [ভেরিফায়েবল ক্রেডেনশিয়ালস](https://www.w3.org/TR/vc-data-model/) নামেও পরিচিত) হলো ইস্যুকারী কর্তৃক প্রদত্ত টেম্পার-প্রুফ, ক্রিপ্টোগ্রাফিকভাবে যাচাইযোগ্য দাবি। প্রতিটি প্রত্যয়ন বা ভেরিফাইএবল ক্রেডেনসিয়ালস একটি সত্তা (যেমন, একটি সংস্থা) ইস্যুসমূহ তাদের DID এর সাথে যুক্ত। -### 1. ইউনিভার্সাল লগইন {#universal-dapp-logins} +যেহেতু DID ব্লকচেইনে সংরক্ষিত থাকে, তাই যে কেউ ইথেরিয়ামে ইস্যুকারীর ডিআইডি ক্রস-চেক করে একটি প্রত্যয়নের বৈধতা যাচাই করতে পারে। মূলত, ইথেরিয়াম ব্লকচেইন একটি গ্লোবাল ডিরেক্টরির মতো কাজ করে যা কিছু নির্দিষ্ট সত্তার সাথে যুক্ত DID যাচাই করতে সক্ষম করে। -বিকেন্দ্রীভূত পরিচয় [বিকেন্দ্রীভূত প্রমাণীকরণের](https://www.ibm.com/blogs/blockchain/2018/10/decentralized-identity-an-alternative-to-password-based-authentication/) মাধ্যমে পাসওয়ার্ড-ভিত্তিক লগইনগুলি প্রতিস্থাপন করতে সহায়তা করতে পারে। পরিষেবা প্রদানকারীরা ব্যবহারকারীদের প্রত্যয়ন জারি করতে পারে, যা একটি ইথেরিয়াম ওয়ালেটে সংরক্ষণ করা যেতে পারে। একটি উদাহরণ প্রত্যয়ন হবে একটি [NFT](/nft/) যা ধারককে একটি অনলাইন কমিউনিটিতে অ্যাক্সেস দেয়। +বিকেন্দ্রীভূত শনাক্তকারীর কারণ হল প্রত্যয়নগুলি স্ব-নিয়ন্ত্রিত এবং যাচাইযোগ্য। এমনকি যদি ইস্যুকারীর আর অস্তিত্ব না থাকে, তবে ধারকের কাছে সর্বদা প্রত্যয়নের মূল এবং বৈধতার প্রমাণ থাকে। -একটি [ইথেরিয়াম দিয়ে সাইন-ইন করুন](https://siwe.xyz/) ফাংশন তারপর সার্ভারগুলিকে ব্যবহারকারীর ইথেরিয়াম অ্যাকাউন্ট নিশ্চিত করতে এবং তাদের অ্যাকাউন্ট অ্যাড্রেস থেকে প্রয়োজনীয় প্রত্যয়ন আনতে সক্ষম করবে। এর মানে ব্যবহারকারীরা দীর্ঘ পাসওয়ার্ড মুখস্থ না করেই প্ল্যাটফর্ম এবং ওয়েবসাইটগুলি অ্যাক্সেস করতে পারে এবং ব্যবহারকারীদের জন্য অনলাইন অভিজ্ঞতা উন্নত করে। +বিকেন্দ্রীভূত পরিচয়ের মাধ্যমে ব্যক্তিগত তথ্যের গোপনীয়তা রক্ষার জন্য বিকেন্দ্রীকৃত শনাক্তকারীও গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যদি একজন ব্যক্তি একটি প্রত্যয়নের প্রমাণ (একটি ড্রাইভারের লাইসেন্স) জমা দেন, তাহলে যাচাইকারী পক্ষকে প্রমাণের তথ্যের বৈধতা পরীক্ষা করার প্রয়োজন নেই। পরিবর্তে, প্রমাণটি বৈধ কিনা তা নির্ধারণ করার জন্য যাচাইকারীর শুধুমাত্র প্রত্যয়নের সত্যতা এবং ইস্যুকারী সংস্থার পরিচয়ের ক্রিপ্টোগ্রাফিক গ্যারান্টি প্রয়োজন। -### 2. KYC প্রমাণীকরণ {#kyc-authentication} +## বিকেন্দ্রীভূত পরিচয়ে প্রত্যয়নের প্রকারভেদ {#types-of-attestations-in-decentralized-identity} -অনেক অনলাইন পরিষেবা ব্যবহার করার জন্য ব্যক্তিদের প্রত্যয়ন এবং প্রমাণপত্র প্রদান করতে হয়, যেমন একটি ড্রাইভিং লাইসেন্স বা জাতীয় পাসপোর্ট। কিন্তু এই পদ্ধতিটি সমস্যাযুক্ত কারণ ব্যক্তিগত ব্যবহারকারীর তথ্যের সাথে আপোস করা যেতে পারে এবং পরিষেবা প্রদানকারীরা প্রত্যয়নের সত্যতা যাচাই করতে পারে না। +একটি ইথেরিয়াম-ভিত্তিক আইডেন্টিটি ইকোসিস্টেমে কীভাবে প্রত্যয়িত তথ্য সংরক্ষণ এবং পুনরুদ্ধার করা হয় তা প্রথাগত পরিচয় ব্যবস্থাপনা থেকে আলাদা। বিকেন্দ্রীভূত পরিচয় ব্যবস্থায় প্রত্যয়ন জারি, সংরক্ষণ এবং যাচাই করার বিভিন্ন পদ্ধতির একটি সংক্ষিপ্ত বিবরণ এখানে রয়েছে: + +### অফচেইন প্রত্যয়ন {#offchain-attestations} + +অনচেইন প্রত্যয়ন সংরক্ষণের একটি উদ্বেগ হলো, সেগুলিতে এমন তথ্য থাকতে পারে যা ব্যক্তিরা গোপন রাখতে চায়। ইথেরিয়াম ব্লকচেইনের সর্বজনীন প্রকৃতি এই ধরনের প্রত্যয়ন সংরক্ষণ করাকে আকর্ষণীয় করে তোলে। + +এর সমাধান হল প্রত্যয়নপত্র ইস্যু করা, যা ব্যবহারকারীরা অফচেইন ডিজিটাল ওয়ালেটে রাখে, কিন্তু তা ইস্যুকারীর অনচেইন সংরক্ষিত DID দ্বারা স্বাক্ষরিত থাকে। এই প্রত্যয়নগুলি [JSON ওয়েব টোকেন](https://en.wikipedia.org/wiki/JSON_Web_Token) হিসাবে এনকোড করা হয় এবং এতে ইস্যুকারীর ডিজিটাল স্বাক্ষর থাকে—যা অফচেইন দাবিগুলির সহজ যাচাইকরণের সুযোগ দেয়। -বিকেন্দ্রীভূত পরিচয় কোম্পানিগুলিকে প্রচলিত [আপনার গ্রাহককে জানুন (KYC)](https://en.wikipedia.org/wiki/Know_your_customer) প্রক্রিয়াগুলি এড়িয়ে যেতে এবং যাচাইযোগ্য প্রমাণপত্রের মাধ্যমে ব্যবহারকারীর পরিচয় প্রমাণীকরণ করতে দেয়। এটি পরিচয় ব্যবস্থাপনার খরচ কমায় এবং জাল নথিপত্র ব্যবহার প্রতিরোধ করে। +অফচেইন প্রত্যয়ন ব্যাখ্যা করার জন্য এখানে একটি অনুমানমূলক দৃশ্যপট দেওয়া হলো: -### 3. ভোটিং এবং অনলাইন কমিউনিটিগুলো {#voting-and-online-communities} +1. একটি বিশ্ববিদ্যালয় (ইস্যুকারী) একটি প্রত্যয়ন (একটি ডিজিটাল একাডেমিক সনদপত্র) তৈরি করে, তার কীগুলির দ্বারা স্বাক্ষর করে এবং এটি ববকে (পরিচয় মালিক) ইস্যু করে। + +2. বব একটি চাকরির জন্য আবেদন করেন এবং একজন নিয়োগকর্তার কাছে তার শিক্ষাগত যোগ্যতা প্রমাণ করতে চান, তাই তিনি তার মোবাইল ওয়ালেট থেকে প্রত্যয়ন শেয়ার করেন। কোম্পানী (যাচাইকারী) তারপর ইস্যুকারীর DID (অর্থাৎ, ইথেরিয়ামে এর পাবলিক কী) পরীক্ষা করে সত্যায়নের বৈধতা নিশ্চিত করতে পারে। + +### স্থায়ী অ্যাক্সেস সহ অফচেইন প্রত্যয়ন {#offchain-attestations-with-persistent-access} + +এই ব্যবস্থার অধীনে প্রত্যয়নগুলি JSON ফাইলে রূপান্তরিত হয় এবং অফচেইন সংরক্ষণ করা হয় (আদর্শভাবে একটি [বিকেন্দ্রীভূত ক্লাউড স্টোরেজ](/developers/docs/storage/) প্ল্যাটফর্মে, যেমন IPFS বা Swarm)। যাইহোক, JSON ফাইলের একটি [হ্যাস](/glossary/#hash) অনচেইন সংরক্ষণ করা হয় এবং একটি অনচেইন রেজিস্ট্রির মাধ্যমে একটি DID-এর সাথে লিঙ্ক করা হয়। সংশ্লিষ্ট DID হয় প্রত্যয়ন প্রদানকারী বা প্রাপকের হতে পারে। + +এই পদ্ধতিটি ব্লকচেইন-ভিত্তিক অটলতা লাভের জন্য প্রত্যয়নকে সক্ষম করে, যখন দাবির তথ্য এনক্রিপ্ট করা এবং যাচাইযোগ্য রাখা হয়। এটি নির্বাচনী প্রকাশের জন্যও অনুমতি দেয় যেহেতু ব্যক্তিগত কী ধারক তথ্যটি ডিক্রিপ্ট করতে পারে। -অনলাইন ভোটিং এবং সোশ্যাল মিডিয়া বিকেন্দ্রীভূত পরিচয়ের জন্য দুটি অভিনব অ্যাপ্লিকেশন। অনলাইন ভোটিং স্কিমগুলি ম্যানিপুলেশনের জন্য সংবেদনশীল, বিশেষ করে যদি ম্যালিসিয়াস এক্টরস ভোট দেওয়ার জন্য মিথ্যা পরিচয় তৈরি করে। ব্যক্তিদের অন-চেইন প্রত্যয়ন উপস্থাপন করতে বলা অনলাইন ভোটিং প্রক্রিয়ার অখণ্ডতা উন্নত করতে পারে। +### অনচেইন প্রত্যয়ন {#onchain-attestations} -বিকেন্দ্রীকৃত পরিচয় জাল অ্যাকাউন্ট মুক্ত অনলাইন কমিউনিটিস তৈরি করতে সাহায্য করতে পারে। উদাহরণস্বরূপ, প্রতিটি ব্যবহারকারীকে একটি অন-চেইন আইডেন্টিটি সিস্টেম ব্যবহার করে তাদের পরিচয় প্রমাণীকরণ করতে হতে পারে, যেমন ইথেরিয়াম নাম পরিষেবা, বটগুলির সম্ভাবনা হ্রাস করে। +অনচেইন প্রত্যয়ন ইথেরিয়াম ব্লকচেইনে [স্মার্ট কন্ট্র্যাক্টে](/glossary/#smart-contract) রাখা হয়। স্মার্ট কন্ট্র্যাক্ট (একটি রেজিস্ট্রি হিসাবে কাজ করে) একটি প্রত্যয়নকে সংশ্লিষ্ট অনচেইন বিকেন্দ্রীভূত শনাক্তকারীর (একটি পাবলিক কী) সাথে ম্যাপ করবে। + +কীভাবে অনচেইন প্রত্যয়নগুলি অনুশীলনে কাজ করতে পারে তা দেখানোর জন্য এখানে একটি উদাহরণ দেওয়া হল: + +1. একটি কোম্পানি (XYZ Corp) একটি স্মার্ট কন্ট্র্যাক্ট ব্যবহার করে মালিকানা শেয়ার বিক্রি করার পরিকল্পনা করে কিন্তু শুধুমাত্র সেই ক্রেতাদের চায় যারা ব্যাকগ্রাউন্ড চেক সম্পন্ন করেছে। + +2. XYZ Corp কোম্পানিকে ইথেরিয়ামে অনচেইন প্রত্যয়ন ইস্যু করার জন্য ব্যাকগ্রাউন্ড চেক করতে পারে। এই প্রত্যয়নটি প্রমাণ করে যে একজন ব্যক্তি কোনো ব্যক্তিগত তথ্য প্রকাশ না করেই ব্যাকগ্রাউন্ড চেক পাস করেছেন। + +3. স্মার্ট কন্ট্র্যাক্ট সেলিং শেয়ার স্ক্রিন করা ক্রেতাদের পরিচয়ের জন্য রেজিস্ট্রি চুক্তি পরীক্ষা করতে পারে, যা স্মার্ট কন্ট্রাক্টের পক্ষে কার শেয়ার কেনার অনুমতি আছে বা নাই তা নির্ধারণ করা সম্ভব করে। -### 4. অ্যান্টি-সাইবিল সুরক্ষা {#sybil-protection} +### সোলবাউন্ড টোকেন এবং পরিচয় {#soulbound} -সাইবিল আক্রমণ বলতে বোঝায় যে ব্যক্তিরা তাদের প্রভাব বাড়ানোর জন্য একটি সিস্টেমকে একাধিক ব্যক্তি মনে করে প্রতারণা করে। [অনুদান প্রদানকারী অ্যাপ্লিকেশনগুলি](https://gitcoin.co/grants/) যেগুলি [ব্যবহার করে চতুর্মুখী ভোটিং](https://www.radicalxchange.org/concepts/plural-voting/) এই সাইবিল আক্রমণের জন্য ঝুঁকিপূর্ণ কারণ অনুদানের মূল্য বৃদ্ধি পায় যখন আরও বেশি ব্যক্তি এটিকে ভোট দেয়, ব্যবহারকারীদের তাদের অবদানগুলিকে অনেকগুলি পরিচয়ে বিভক্ত করতে উৎসাহিত করে। বিকেন্দ্রীভূত পরিচয়গুলি প্রত্যেক অংশগ্রহণকারীর উপর বোঝা বাড়িয়ে প্রমাণ করতে সাহায্য করে যে তারা সত্যিই মানুষ, যদিও প্রায়ই নির্দিষ্ট ব্যক্তিগত তথ্য প্রকাশ না করেই। +[সোলবাউন্ড টোকেন](https://vitalik.eth.limo/general/2022/01/26/soulbound.html) ([অ-হস্তান্তরযোগ্য NFT](/glossary/#nft)) একটি নির্দিষ্ট ওয়ালেটের জন্য অনন্য তথ্য সংগ্রহ করতে ব্যবহার করা যেতে পারে। এটি কার্যকরভাবে একটি নির্দিষ্ট ইথেরিয়াম ঠিকানার সাথে আবদ্ধ একটি অনন্য অনচেইন পরিচয় তৈরি করে যাতে কৃতিত্বের প্রতিনিধিত্বকারী টোকেন অন্তর্ভুক্ত থাকতে পারে (যেমন, কোনো নির্দিষ্ট অনলাইন কোর্স শেষ করা বা একটি গেমে থ্রেশহোল্ড স্কোর পাস করা) বা কমিউনিটির অংশগ্রহণ। ## বিকেন্দ্রীভূত পরিচয় ব্যবহার করুন {#use-decentralized-identity} বিকেন্দ্রীভূত পরিচয় সমাধানের ভিত্তি হিসাবে ইথেরিয়াম ব্যবহার করে অনেক উচ্চাভিলাষী প্রকল্প রয়েছে: -- **[ইথেরিয়াম নাম পরিষেবা (ENS)](https://ens.domains/)** - _অন-চেইন, মেশিন-পঠনযোগ্য শনাক্তকারীর জন্য একটি বিকেন্দ্রীভূত নামকরণ সিস্টেম, যেমন, ইথেরিয়াম ওয়ালেট অ্যাড্রেস, কন্টেন্ট হ্যাশ এবং মেটাডেটা।_ +- **[Ethereum Name Service (ENS)](https://ens.domains/)** - _অনচেইন, মেশিন-পঠনযোগ্য শনাক্তকারীর জন্য একটি বিকেন্দ্রীভূত নামকরণ ব্যবস্থা, যেমন, ইথেরিয়াম ওয়ালেট ঠিকানা, কন্টেন্ট হ্যাস এবং মেটাডেটা।_ +- **[Sign in with Ethereum (SIWE)](https://siwe.xyz/)** - _ইথেরিয়াম অ্যাকাউন্টগুলির সাথে প্রমাণীকরণের জন্য উন্মুক্ত মান।_ - **[SpruceID](https://www.spruceid.com/)** - _একটি বিকেন্দ্রীভূত পরিচয় প্রকল্প যা ব্যবহারকারীদের তৃতীয় পক্ষের পরিষেবার উপর নির্ভর না করে ইথেরিয়াম অ্যাকাউন্ট এবং ENS প্রোফাইলের মাধ্যমে ডিজিটাল পরিচয় নিয়ন্ত্রণ করতে দেয়।_ -- **[ইথেরিয়াম অ্যাটেস্টেশন সার্ভিস (EAS)](https://attest.sh/)** - _ যেকোনো বিষয়ে অন-চেইন বা অফ-চেইন প্রত্যয়ন করার জন্য একটি বিকেন্দ্রীকৃত লেজার/প্রটোকল।_ -- **[প্রুফ অফ হিউম্যানিটি](https://www.proofofhumanity.id)** - _মানবতার প্রমাণ (বা PoH) হল ইথেরিয়াম-এ নির্মিত একটি সামাজিক পরিচয় যাচাইকরণ ব্যবস্থা।_ +- **[Ethereum Attestation Service (EAS)](https://attest.org/)** - _যেকোনো বিষয়ে অনচেইন বা অফচেইন প্রত্যয়ন করার জন্য একটি বিকেন্দ্রীভূত লেজার/প্রোটোকল।_ +- **[Proof of Humanity](https://www.proofofhumanity.id)** - _প্রুফ অফ হিউম্যানিটি (বা PoH) হল ইথেরিয়ামে নির্মিত একটি সামাজিক পরিচয় যাচাইকরণ ব্যবস্থা।_ - **[BrightID](https://www.brightid.org/)** - _একটি বিকেন্দ্রীভূত, ওপেন সোর্স সামাজিক পরিচয় নেটওয়ার্ক যা একটি সামাজিক গ্রাফ তৈরি এবং বিশ্লেষণের মাধ্যমে পরিচয় যাচাইকরণ সংস্কার করতে চাইছে।_ -- **[প্রুফ অফ পার্সনহুড পাসপোর্ট](https://passport.human.tech/)** - _ একটি বিকেন্দ্রীভূত ডিজিটাল পরিচয় সমষ্টিকারী।_ +- **[walt.id](https://walt.id)** — _ওপেন সোর্স বিকেন্দ্রীভূত পরিচয় এবং ওয়ালেট পরিকাঠামো যা ডেভেলপার এবং সংস্থাগুলিকে স্ব-সার্বভৌম পরিচয় এবং NFT/SBT ব্যবহার করার সুবিধা দেয়।_ +- **[Veramo](https://veramo.io/)** - _একটি জাভাস্ক্রিপ্ট ফ্রেমওয়ার্ক যা যে কারো জন্য তাদের অ্যাপ্লিকেশনে ক্রিপ্টোগ্রাফিকভাবে যাচাইযোগ্য ডেটা ব্যবহার করা সহজ করে তোলে।_ -## Further reading {#further-reading} +## আরও পড়ুন {#further-reading} -### আর্টিকেল সমূহ {#articles} +### নিবন্ধ {#articles} -- [ব্লকচেন ব্যবহারের ক্ষেত্রে: ডিজিটাল পরিচয়ে ব্লকচেইন](https://consensys.net/blockchain-use-cases/digital-identity/) — _ConsenSys_ +- [ব্লকচেইন ব্যবহারের ক্ষেত্র: ডিজিটাল পরিচয়ে ব্লকচেইন](https://consensys.net/blockchain-use-cases/digital-identity/) — _ConsenSys_ - [ইথেরিয়াম ERC725 কী? ব্লকচেইনে স্ব-সার্বভৌম পরিচয় ব্যবস্থাপনা](https://cryptoslate.com/what-is-erc725-self-sovereign-identity-management-on-the-blockchain/) — _স্যাম টাউন_ -- [কিভাবে ব্লকচেইন ডিজিটাল পরিচয়ের সমস্যা সমাধান করতে পারে](https://time.com/6142810/proof-of-humanity/) — _অ্যান্ড্রু আর চাউ_ -- [বিকেন্দ্রীভূত পরিচয় কী এবং কেন আপনার যত্ন নেওয়া উচিত?](https://web3.hashnode.com/what-is-decentralized-identity) — _ইমানুয়েল আওসিকা_ +- [কীভাবে ব্লকচেইন ডিজিটাল পরিচয়ের সমস্যা সমাধান করতে পারে](https://time.com/6142810/proof-of-humanity/) — _অ্যান্ড্রু আর চাউ_ +- [বিকেন্দ্রীভূত পরিচয় কী এবং আপনার কেন যত্ন নেওয়া উচিত?](https://web3.hashnode.com/what-is-decentralized-identity) — _ইমানুয়েল আওসিকা_ +- [বিকেন্দ্রীভূত পরিচয়ের ভূমিকা](https://walt.id/white-paper/digital-identity) — _ডমিনিক বেরন_ -### Videos {#videos} +### ভিডিও {#videos} -- [বিকেন্দ্রীভূত পরিচয় (বোনাস লাইভস্ট্রিম সেশন)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _ আন্দ্রেয়াস আন্তোনোপোলোস এর বিকেন্দ্রীভূত পরিচয়ের উপর একটি দুর্দান্ত ব্যাখ্যাকারী ভিডিও_ -- [Ceramic, IDX, React এবং 3ID Connect সংযোগের সাথে ইথেরিয়াম এবং বিকেন্দ্রীভূত পরিচয় দিয়ে সাইন ইন করুন](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _Nader Dabit এর ইথেরিয়াম ওয়ালেট ব্যবহার করে ব্যবহারকারীর প্রোফাইল তৈরি, পড়া এবং আপডেট করার জন্য একটি আইডেন্টিটি ম্যানেজমেন্ট সিস্টেম তৈরি করার বিষয়ে YouTube টিউটোরিয়াল_ -- [BrightID - ইথেরিয়ামে বিকেন্দ্রীভূত পরিচয়](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Bankless পডকাস্ট পর্ব BrightID নিয়ে আলোচনা করে, ইথেরিয়াম এর জন্য একটি বিকেন্দ্রীভূত পরিচয় সমাধান_ -- [অফ চেইন ইন্টারনেট: বিকেন্দ্রীভূত পরিচয় & যাচাইযোগ্য প্রমাণপত্রাদি](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — Evin McMullen দ্বারা EthDenver 2022 উপস্থাপনা +- [বিকেন্দ্রীভূত পরিচয় (বোনাস লাইভস্ট্রিম সেশন)](https://www.youtube.com/watch?v=ySHNB1za_SE&t=539s) — _আন্দ্রেয়াস আন্তোনোপোলোস-এর বিকেন্দ্রীভূত পরিচয়ের উপর একটি দুর্দান্ত ব্যাখ্যামূলক ভিডিও_ +- [Ceramic, IDX, React এবং 3ID Connect সংযোগের সাথে ইথেরিয়াম এবং বিকেন্দ্রীভূত পরিচয় দিয়ে সাইন ইন করুন](https://www.youtube.com/watch?v=t9gWZYJxk7c) — _নাদের দাবিতের ইথেরিয়াম ওয়ালেট ব্যবহার করে ব্যবহারকারীর প্রোফাইল তৈরি, পড়া এবং আপডেট করার জন্য একটি আইডেন্টিটি ম্যানেজমেন্ট সিস্টেম তৈরি করার বিষয়ে YouTube টিউটোরিয়াল_ +- [BrightID - ইথেরিয়ামে বিকেন্দ্রীভূত পরিচয়](https://www.youtube.com/watch?v=D3DbMFYGRoM) — _Bankless পডকাস্ট পর্ব BrightID নিয়ে আলোচনা করে, ইথেরিয়ামের জন্য একটি বিকেন্দ্রীভূত পরিচয় সমাধান_ +- [অফচেইন ইন্টারনেট: বিকেন্দ্রীভূত পরিচয় ও যাচাইযোগ্য শংসাপত্র](https://www.youtube.com/watch?v=EZ_Bb6j87mg) — ইভিন ম্যাকমুলেনের EthDenver ২০২২ উপস্থাপনা +- [যাচাইযোগ্য শংসাপত্র ব্যাখ্যা করা হয়েছে](https://www.youtube.com/watch?v=ce1IdSr-Kig) - ট্যামিনো বাউম্যানের ডেমো সহ ইউটিউব ব্যাখ্যাকারী ভিডিও -### কমিউনিটিগুলো {#communities} +### কমিউনিটি {#communities} - [GitHub-এ ERC-725 জোট](https://github.com/erc725alliance) — _ইথেরিয়াম ব্লকচেইনে পরিচয় পরিচালনার জন্য ERC725 স্ট্যান্ডার্ডের সমর্থকগণ_ -- [EthID Discord সার্ভার](https://discord.com/invite/ZUyG3mSXFD) — _উৎসাহী এবং ডেভেলপারদের জন্য কমিউনিটি যারা ইথেরিয়ামের সাথে সাইন-ইন করে কাজ করছে_ -- [ Veramo Labs](https://discord.gg/sYBUXpACh4) — _অ্যাপ্লিকেশানগুলির জন্য যাচাইযোগ্য ডেটার জন্য একটি কাঠামো তৈরিতে অবদান রাখতে ডেভেলপারদের একটি কমিউনিটি_ +- [EthID ডিসকর্ড সার্ভার](https://discord.com/invite/ZUyG3mSXFD) — _Sign-in with Ethereum এবং Ethereum Follow Protocol-এ কর্মরত উৎসাহী এবং ডেভেলপারদের জন্য কমিউনিটি_ +- [Veramo Labs](https://discord.gg/sYBUXpACh4) — _অ্যাপ্লিকেশানগুলির জন্য যাচাইযোগ্য ডেটার জন্য একটি কাঠামো তৈরিতে অবদান রাখতে ডেভেলপারদের একটি কমিউনিটি_ +- [walt.id](https://discord.com/invite/AW8AgqJthZ) — _বিভিন্ন শিল্প জুড়ে বিকেন্দ্রীভূত পরিচয়ের ব্যবহারের ক্ষেত্রে কাজ করা ডেভেলপার এবং নির্মাতাদের একটি কমিউনিটি_ diff --git a/public/content/translations/bn/defi/index.md b/public/content/translations/bn/defi/index.md index 1efe048a601..7caceb13f60 100644 --- a/public/content/translations/bn/defi/index.md +++ b/public/content/translations/bn/defi/index.md @@ -1,18 +1,19 @@ --- -title: বিকেন্দ্রীভূত অর্থ (DeFi) -description: ইথেরিয়াম এর উপর DeFi এর একটি সংক্ষিপ্ত বিবরণী +title: "বিকেন্দ্রীভূত অর্থ (DeFi)" +metaTitle: "DeFi কি? | ডিসেন্ট্রালাইজড ফিনান্সের সুবিধা এবং ব্যবহার" +description: "ইথেরিয়াম এর উপর DeFi এর একটি সংক্ষিপ্ত বিবরণী" lang: bn template: use-cases emoji: ":money_with_wings:" image: /images/use-cases/defi.png -alt: Lego ব্রিকস দিয়ে তৈরি একটি Eth লোগো। +alt: "Lego ব্রিকস দিয়ে তৈরি একটি Eth লোগো।" sidebarDepth: 2 -summaryPoint1: বর্তমান আর্থিক ব্যবস্থার জন্য বিশ্বব্যাপী একটি উন্মুক্ত বিকল্প ব্যবস্থাপনা। -summaryPoint2: যে পণ্যগুলি আপনাকে ধার, সঞ্চয়, বিনিয়োগ, বাণিজ্য এবং আরও অনেক কিছু করতে দেয়। -summaryPoint3: যে কেউ প্রোগ্রাম করতে পারে এমন ওপেন সোর্স প্রযুক্তির উপরে নির্ভর করে তৈরি। +summaryPoint1: "বর্তমান আর্থিক ব্যবস্থার জন্য বিশ্বব্যাপী একটি উন্মুক্ত বিকল্প ব্যবস্থাপনা।" +summaryPoint2: "যে পণ্যগুলি আপনাকে ধার, সঞ্চয়, বিনিয়োগ, বাণিজ্য এবং আরও অনেক কিছু করতে দেয়।" +summaryPoint3: "যে কেউ প্রোগ্রাম করতে পারে এমন ওপেন সোর্স প্রযুক্তির উপরে নির্ভর করে তৈরি।" --- -DeFi হলো একটি উন্মুক্ত এবং বিশ্বব্যাপী আর্থিক ব্যবস্থা যা ইন্টারনেট যুগের জন্য তৈরি করা হয়েছে – এমন একটি সিস্টেমের বিকল্প যা অস্বচ্ছ, শক্তভাবে নিয়ন্ত্রিত এবং কয়েক দশক পুরনো অবকাঠামো এবং প্রক্রিয়াগুলির দ্বারা একত্রিত। এটি আপনাকে আপনার অর্থের উপর নিয়ন্ত্রণ এবং দৃশ্যমানতা দেয়। এটি আপনাকে বিশ্বব্যাপী বাজারের এক্সপোজার এবং আপনার স্থানীয় মুদ্রা বা ব্যাংকিং অপশনগুলির বিকল্প দেয়। DeFi পণ্যগুলি ইন্টারনেট সংযোগ সহ সকলের জন্য আর্থিক পরিষেবা উন্মুক্ত করে এবং সেগুলি মূলত তাদের ব্যবহারকারীদের দ্বারা মালিকানাধীন এবং রক্ষণাবেক্ষণ করে। এখন পর্যন্ত কয়েক বিলিয়ন ডলার মূল্যের ক্রিপ্টো DeFi অ্যাপ্লিকেশনের মাধ্যমে প্রবাহিত হয়েছে এবং এর পরিমাণ প্রতিদিন বাড়ছে। +DeFi হলো একটি উন্মুক্ত এবং বিশ্বব্যাপী আর্থিক ব্যবস্থা যা ইন্টারনেট যুগের জন্য তৈরি করা হয়েছে – এমন একটি সিস্টেমের বিকল্প যা অস্বচ্ছ, শক্তভাবে নিয়ন্ত্রিত এবং কয়েক দশক পুরনো অবকাঠামো এবং প্রক্রিয়াগুলির দ্বারা একত্রিত। এটি আপনাকে আপনার অর্থের উপর নিয়ন্ত্রণ এবং দৃশ্যমানতা দেয়। এটি আপনাকে বিশ্বব্যাপী বাজারের এক্সপোজার এবং আপনার স্থানীয় মুদ্রা বা ব্যাংকিং অপশনগুলির বিকল্প দেয়। DeFi পণ্যগুলি ইন্টারনেট সংযোগ সহ সকলের জন্য আর্থিক পরিষেবা উন্মুক্ত করে এবং সেগুলি মূলত তাদের ব্যবহারকারীদের দ্বারা মালিকানাধীন এবং রক্ষণাবেক্ষণ করে। এখন পর্যন্ত, কয়েক হাজার কোটি ডলার মূল্যের ক্রিপ্টো DeFi অ্যাপ্লিকেশনের মধ্যে দিয়ে প্রবাহিত হয়েছে এবং এটি প্রতিদিন বাড়ছে। ## DeFi কি? {#what-is-defi} @@ -22,7 +23,7 @@ DeFi হল আর্থিক পণ্য এবং পরিষেবাগ -## DeFi বনাম প্রথাগত অর্থনীতি {#defi-vs-tradfi} +## DeFi বনাম প্রথাগত ফিনান্স {#defi-vs-tradfi} DeFi এর সম্ভাব্যতা দেখার সর্বোত্তম উপায়গুলির মধ্যে একটি হল আজকের বিদ্যমান সমস্যাগুলি বোঝা। @@ -37,38 +38,38 @@ DeFi এর সম্ভাব্যতা দেখার সর্বোত্ ### একটি তুলনা {#defi-comparison} -| DeFi | প্রথাগত অর্থনীতি | -| ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | -| আপনি আপনার অর্থ ধরে রাখেন। | কোম্পানি আপনার অর্থ ধরে রাখে। | -| আপনার অর্থ কোথায় যায় এবং কীভাবে ব্যয় হয় তা আপনি নিয়ন্ত্রণ করেন। | ঝুঁকিপূর্ণ ঋণগ্রহীতাদের ঋণ দেওয়ার মতো আপনার অর্থের অব্যবস্থাপনা না করার জন্য আপনাকে কোম্পানিগুলিকে বিশ্বাস করতে হবে। | -| তহবিল স্থানান্তর মিনিটের মধ্যে ঘটে। | ম্যানুয়াল প্রক্রিয়ার কারণে অর্থপ্রদানে অনেকদিন লাগতে পারে। | -| লেনদেন কার্যকলাপ হলো ছদ্মনাম। | আর্থিক কার্যকলাপ আপনার পরিচয়ের সাথে দৃঢ়ভাবে মিলিত হয়। | -| DeFi যে কারো জন্য উন্মুক্ত। | আর্থিক পরিষেবাগুলি ব্যবহার করার জন্য আপনাকে অবশ্যই আবেদন করতে হবে। | -| মার্কেট সবসময় খোলা থাকে। | কর্মীদের বিরতির প্রয়োজন হয় বিধার মার্কেট বন্ধ করা হয়। | +| DeFi | প্রথাগত অর্থনীতি | +| ------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | +| আপনি আপনার অর্থ ধরে রাখেন। | কোম্পানি আপনার অর্থ ধরে রাখে। | +| আপনার অর্থ কোথায় যায় এবং কীভাবে ব্যয় হয় তা আপনি নিয়ন্ত্রণ করেন। | ঝুঁকিপূর্ণ ঋণগ্রহীতাদের ঋণ দেওয়ার মতো আপনার অর্থের অব্যবস্থাপনা না করার জন্য আপনাকে কোম্পানিগুলিকে বিশ্বাস করতে হবে। | +| তহবিল স্থানান্তর মিনিটের মধ্যে ঘটে। | ম্যানুয়াল প্রক্রিয়ার কারণে অর্থপ্রদানে অনেকদিন লাগতে পারে। | +| লেনদেন কার্যকলাপ হলো ছদ্মনাম। | আর্থিক কার্যকলাপ আপনার পরিচয়ের সাথে দৃঢ়ভাবে মিলিত হয়। | +| DeFi যে কারো জন্য উন্মুক্ত। | আর্থিক পরিষেবাগুলি ব্যবহার করার জন্য আপনাকে অবশ্যই আবেদন করতে হবে। | +| মার্কেট সবসময় খোলা থাকে। | কর্মীদের বিরতির প্রয়োজন হয় বিধার মার্কেট বন্ধ করা হয়। | | এটি স্বচ্ছতার উপর নির্মিত – যে কেউ একটি পণ্যের ডেটা দেখতে পারে এবং সিস্টেমটি কীভাবে কাজ করে তা পরিদর্শন করতে পারে। | আর্থিক প্রতিষ্ঠানগুলি বন্ধ বই: আপনি তাদের ঋণের ইতিহাস, তাদের পরিচালিত সম্পদের রেকর্ড এবং আরও অনেক কিছু দেখতে চাইতে পারবেন না। | - DeFi অ্যাপগুলি ঘেটে দেখুন + DeFi অ্যাপগুলি ঘেঁটে দেখুন ## এটি বিটকয়েন দিয়ে শুরু হয়েছিল... {#bitcoin} বিটকয়েন অনেক উপায়ে প্রথম DeFi অ্যাপ্লিকেশন ছিল। বিটকয়েন আপনাকে সত্যিকার অর্থে মূল্যের মালিক হতে এবং নিয়ন্ত্রণ করতে দেয় এবং বিশ্বের যে কোনো জায়গায় পাঠাতে দেয়। এটি একটি বিশ্বস্ত মধ্যস্থতাকারীর প্রয়োজন ছাড়াই অনেক সংখ্যক লোককে, যারা একে অপরকে বিশ্বাস করে না, অ্যাকাউন্টের লেজারে সম্মত হওয়ার একটি উপায় প্রদান করার মাধ্যমে এমনটি করে। বিটকয়েন যে কারো জন্য উন্মুক্ত এবং এর নিয়ম পরিবর্তন করার ক্ষমতা কারো নেই। ঘাটতি এবং উন্মুক্ততার মতো, বিটকয়েনের নিয়মসমূহ, এর প্রযুক্তিতে লেখা আছে। এটি প্রথাগত অর্থনীতির মতো নয় যেখানে সরকার আপনার সঞ্চয়ের অবমূল্যায়ন করে এমন অর্থ মুদ্রণ করতে পারে এবং কোম্পানিগুলি মার্কেট বন্ধ করে দিতে পারে। -ইথেরিয়াম এগুলোর উপরেই তৈরি করা। বিটকয়েনের মতো, নিয়মগুলি আপনার ক্ষেত্রে পরিবর্তিত হতে পারবে না এবং প্রত্যেকেরই অ্যাক্সেস রয়েছে। কিন্তু এটি [স্মার্ট কনট্র্যাক্ট](/glossary#smart-contract) ব্যবহার করে এই ডিজিটাল অর্থকে প্রোগ্রামযোগ্য করে তোলে, যাতে আপনি মূল্য সংরক্ষণ এবং প্রেরণের বাইরে যেতে পারেন। +ইথেরিয়াম এগুলোর উপরেই তৈরি করা। বিটকয়েনের মতো, নিয়মগুলি আপনার ক্ষেত্রে পরিবর্তিত হতে পারবে না এবং প্রত্যেকেরই অ্যাক্সেস রয়েছে। কিন্তু এটি [স্মার্ট কন্ট্র্যাক্ট](/glossary/#smart-contract) ব্যবহার করে এই ডিজিটাল অর্থকে প্রোগ্রামযোগ্য করে তোলে, যাতে আপনি মূল্য সংরক্ষণ এবং পাঠানোর বাইরে যেতে পারেন। -## প্রোগ্রামেবল অর্থ {#programmable-money} +## প্রোগ্রামযোগ্য অর্থ {#programmable-money} -এটা অদ্ভুত শোনাচ্ছে... "কেন আমি আমার অর্থ প্রোগ্রাম করতে চাইব"? যাইহোক, এটি ইথেরিয়াম-এ টোকেনগুলির একটি ডিফল্ট বৈশিষ্ট্য। যে কেউ অর্থ প্রদানের মধ্যে যুক্তি প্রোগ্রাম করতে পারেন। সুতরাং আপনি আর্থিক প্রতিষ্ঠান প্রদত্ত পরিষেবাগুলোর পাশাপাশি বিটকয়েনের নিয়ন্ত্রণ এবং নিরাপত্তা পেতে পারেন। এটি আপনাকে ক্রিপ্টোকারেন্সিগুলোর সাথে এমন কিছু করতে দেয় যা আপনি বিটকয়েনের সাথে করতে পারবেন না যেমন ধার দেওয়া এবং ধার নেওয়া, অর্থ প্রদানের সময় নির্ধারণ করা, ইন্ডেক্স ফান্ডে বিনিয়োগ করা এবং আরও অনেক কিছু। +এটা অদ্ভুত শোনাচ্ছে... "আমি কেন আমার অর্থ প্রোগ্রাম করতে চাইব"? যাইহোক, এটি ইথেরিয়ামের টোকেনগুলির শুধু একটি ডিফল্ট বৈশিষ্ট্যের চেয়েও বেশি কিছু। যে কেউ অর্থ প্রদানের মধ্যে যুক্তি প্রোগ্রাম করতে পারেন। সুতরাং আপনি আর্থিক প্রতিষ্ঠান প্রদত্ত পরিষেবাগুলোর পাশাপাশি বিটকয়েনের নিয়ন্ত্রণ এবং নিরাপত্তা পেতে পারেন। এটি আপনাকে ক্রিপ্টোকারেন্সিগুলোর সাথে এমন কিছু করতে দেয় যা আপনি বিটকয়েনের সাথে করতে পারবেন না যেমন ধার দেওয়া এবং ধার নেওয়া, অর্থ প্রদানের সময় নির্ধারণ করা, ইন্ডেক্স ফান্ডে বিনিয়োগ করা এবং আরও অনেক কিছু। - +
আপনি যদি ইথেরিয়াম-এ নতুন হন তবে চেষ্টা করতে DeFi অ্যাপ্লিকেশনগুলির জন্য আমাদের পরামর্শগুলি এক্সপ্লোর করুন।
- DeFi অ্যাপগুলি ঘেটে দেখুন + DeFi অ্যাপগুলি ঘেঁটে দেখুন
@@ -77,15 +78,15 @@ DeFi এর সম্ভাব্যতা দেখার সর্বোত্ অধিকাংশ আর্থিক পরিষেবার জন্য একটি বিকেন্দ্রীভূত বিকল্প আছে। কিন্তু ইথেরিয়াম এমন আর্থিক পণ্য তৈরির সুযোগও তৈরি করে যা সম্পূর্ণ নতুন। এটি একটি ক্রমবর্ধমান তালিকা। -- [বিশ্বজুড়ে অর্থ পাঠান](#send-money) +- [সারা বিশ্বে টাকা পাঠান](#send-money) - [বিশ্বজুড়ে অর্থ স্ট্রিম করুন](#stream-money) - [স্থিতিশীল মুদ্রা অ্যাক্সেস করুন](#stablecoins) -- [জামানত দ্বারা ফান্ড ধার করুন](#lending) -- [জামানত ছাড়া ধার](#flash-loans) +- [জামানত দিয়ে তহবিল ধার করুন](#lending) +- [জামানত ছাড়া ধার করুন](#flash-loans) - [ক্রিপ্টো সঞ্চয় শুরু করুন](#saving) -- [ট্রেড টোকেনসমূহ](#swaps) -- [আপনার পোর্টফোলিও বাড়ান](#investing) -- [আপনার আইডিয়াগুলো ফান্ড করুন](#crowdfunding) +- [টোকেন ট্রেড করুন](#swaps) +- [আপনার পোর্টফোলিও বাড়ান](#investing) +- [আপনার ধারণাগুলোকে অর্থায়ন করুন](#crowdfunding) - [বীমা কিনুন](#insurance) - [আপনার পোর্টফোলিও পরিচালনা করুন](#aggregators) @@ -93,17 +94,17 @@ DeFi এর সম্ভাব্যতা দেখার সর্বোত্ ### সারা বিশ্বে দ্রুত টাকা পাঠান {#send-money} -একটি ব্লকচেইন হিসাবে, ইথেরিয়াম একটি নিরাপদ এবং বিশ্বব্যাপী লেনদেন পাঠানোর জন্য ডিজাইন করা হয়েছে। বিটকয়েনের মতো, ইথেরিয়াম বিশ্বজুড়ে অর্থ প্রেরণকে একটি ইমেল পাঠানোর মতোই সহজ করে তোলে। আপনার ওয়ালেট থেকে শুধু আপনার প্রাপকের [ENS নাম](/nft/#nft-domains) (যেমন bob.eth) বা তাদের অ্যাকাউন্টের ঠিকানা লিখুন এবং আপনার অর্থপ্রদান মিনিটের মধ্যে সরাসরি তাদের কাছে যাবে (সাধারণত)। পেমেন্ট পাঠাতে বা গ্রহণ করতে, আপনার একটি [ওয়ালেট](/wallets/) প্রয়োজন হবে। +একটি ব্লকচেইন হিসাবে, ইথেরিয়াম একটি নিরাপদ এবং বিশ্বব্যাপী লেনদেন পাঠানোর জন্য ডিজাইন করা হয়েছে। বিটকয়েনের মতো, ইথেরিয়াম বিশ্বজুড়ে অর্থ প্রেরণকে একটি ইমেল পাঠানোর মতোই সহজ করে তোলে। শুধু আপনার ওয়ালেট থেকে আপনার প্রাপকের [ENS নাম](/glossary/#ens) (যেমন bob.eth) বা তাদের অ্যাকাউন্ট অ্যাড্রেস লিখুন এবং আপনার পেমেন্ট মিনিটের মধ্যে সরাসরি তাদের কাছে চলে যাবে (সাধারণত)। পেমেন্ট পাঠাতে বা গ্রহণ করতে, আপনার একটি [ওয়ালেট](/wallets/) লাগবে। - পেমেন্ট dapps গুলো দেখুন + পেমেন্ট ডিএ্যাপস দেখুন #### বিশ্বজুড়ে অর্থ স্ট্রিম করুন... {#stream-money} এছাড়াও আপনি ইথেরিয়াম এর মাধ্যমে অর্থ প্রবাহ করতে পারেন। এটি আপনাকে কাউকে তাদের বেতন সেকেন্ডের মধ্যে পরিশোধ করতে দেয়, যখনই তাদের প্রয়োজন হয় তখনই তাদের অর্থের অ্যাক্সেস দেয়। অথবা স্টোরেজ লকার বা বৈদ্যুতিক স্কুটারের মত কিছু ভাড়া নিন। -এবং যদি আপনি [ETH](/what-is-ether/) পাঠাতে বা স্ট্রিম করতে না চান কারণ এর মান কতটা পরিবর্তিত হতে পারে, তাহলে ইথেরিয়াম-এ বিকল্প মুদ্রা রয়েছে: স্টেবলকয়েন। +আর আপনি যদি [ETH](/glossary/#ether) পাঠাতে বা স্ট্রিম করতে না চান কারণ এর মান অনেক পরিবর্তন হতে পারে, সেক্ষেত্রে ইথেরিয়ামে বিকল্প মুদ্রা রয়েছে: [স্টেবলকয়েন](/glossary/#stablecoin)। @@ -114,7 +115,7 @@ DeFi এর সম্ভাব্যতা দেখার সর্বোত্ Dai বা USDC-এর মতো কয়েনগুলির একটি মূল্য রয়েছে যা একটি ডলারের কয়েক সেন্টের মধ্যে থাকে। এটি তাদের উপার্জন বা খুচরা বিক্রয়ের জন্য নিখুঁত করে তোলে। লাতিন আমেরিকার অনেক লোক তাদের সরকার দ্বারা জারি করা মুদ্রার সাথে একটি বড় অনিশ্চয়তার সময়ে তাদের সঞ্চয় রক্ষার উপায় হিসাবে স্টেবলকয়েন ব্যবহার করেছে। - স্টেবলকয়েন সম্পর্কে আরও + স্টেবলকয়েন সম্পর্কে আরও জানুন @@ -127,7 +128,7 @@ Dai বা USDC-এর মতো কয়েনগুলির একটি ম - পুল-ভিত্তিক যেখানে ঋণদাতারা একটি পুলে ফান্ড (লিকুইডিটি) প্রদান করে যেখান থেকে ঋণগ্রহীতারা ধার নিতে পারে। - ঋণদাতা dapps গুলো দেখুন + ধার করার ডিএ্যাপস দেখুন বিকেন্দ্রীভূত ঋণদাতা ব্যবহার করার অনেক সুবিধা রয়েছে... @@ -136,19 +137,19 @@ Dai বা USDC-এর মতো কয়েনগুলির একটি ম আজ, টাকা ধার দেওয়া এবং ধার নেওয়া সবই জড়িত ব্যক্তিদের চারপাশে ঘোরে। ধার দেওয়ার আগে ব্যাংকগুলিকে জানতে হবে আপনি ঋণ পরিশোধ করতে পারবেন কিনা। -বিকেন্দ্রীভূত ঋণ কোনো পক্ষকেই নিজেদের পরিচয় না দিয়ে কাজ করে। পরিবর্তে, ঋণগ্রহীতাকে অবশ্যই জামানত রাখতে হবে যা ঋণদাতা স্বয়ংক্রিয়ভাবে পাবেন যদি তাদের ঋণ পরিশোধ করা না হয়। কিছু ঋণদাতা জামানত হিসেবে এমনকি NFT গ্রহণ করে। NFT হল একটি অনন্য সম্পদের দলিল, যেমন একটি পেইন্টিং। [NFT সম্পর্কে আরো](/nft/) +বিকেন্দ্রীভূত ঋণ কোনো পক্ষকেই নিজেদের পরিচয় না দিয়ে কাজ করে। পরিবর্তে, ঋণগ্রহীতাকে অবশ্যই জামানত রাখতে হবে যা ঋণদাতা স্বয়ংক্রিয়ভাবে পাবেন যদি তাদের ঋণ পরিশোধ করা না হয়। কিছু ঋণদাতা জামানত হিসেবে এমনকি [NFTs](/glossary/#nft)-ও গ্রহণ করে। NFT হল একটি অনন্য সম্পদের দলিল, যেমন একটি পেইন্টিং। [NFTs সম্পর্কে আরও জানুন](/nft/) এটি আপনাকে ক্রেডিট চেক বা ব্যক্তিগত তথ্য হস্তান্তর ছাড়াই অর্থ ধার করতে দেয়। -#### বৈশ্বিক ফান্ডসমূহে অ্যাক্সেস {#access-global-funds} +#### গ্লোবাল তহবিলের অ্যাক্সেস {#access-global-funds} আপনি যখন একটি বিকেন্দ্রীভূত ঋণদাতা ব্যবহার করেন তখন আপনার কাছে সমস্ত বিশ্ব থেকে জমা করা ফান্ডগুলিতে অ্যাক্সেস থাকে, শুধুমাত্র আপনার নির্বাচিত ব্যাঙ্ক বা প্রতিষ্ঠানের হেফাজতে থাকা ফান্ডগুলি নয়। এটি ঋণকে আরও সহজলভ্য করে এবং সুদের হার উন্নত করে। -#### কর-দক্ষতাগুলো {#tax-efficiencies} +#### কর-দক্ষতা {#tax-efficiencies} -ধার করা আপনাকে আপনার ETH (একটি করযোগ্য ইভেন্ট) বিক্রি করার প্রয়োজন ছাড়াই আপনার প্রয়োজনীয় ফান্ডগুলিতে অ্যাক্সেস দিতে পারে। পরিবর্তে, আপনি একটি স্টেবলকয়েন ঋণের জন্য জামানত হিসাবে ETH ব্যবহার করতে পারেন। এটি আপনাকে আপনার প্রয়োজনীয় নগদ-প্রবাহ দেয় এবং আপনাকে আপনার ETH রাখতে দেয়। স্টেবলকয়েন হল টোকেন যা আপনার নগদ প্রয়োজনের জন্য অনেক ভালো কারণ এগুলো ETH এর মত মূল্যে ওঠানামা করে না। [স্টেবলকয়েন সম্পর্কে আরও](#stablecoins) +ধার করা আপনাকে আপনার ETH (একটি করযোগ্য ইভেন্ট) বিক্রি করার প্রয়োজন ছাড়াই আপনার প্রয়োজনীয় ফান্ডগুলিতে অ্যাক্সেস দিতে পারে। পরিবর্তে, আপনি একটি স্টেবলকয়েন ঋণের জন্য জামানত হিসাবে ETH ব্যবহার করতে পারেন। এটি আপনাকে আপনার প্রয়োজনীয় নগদ-প্রবাহ দেয় এবং আপনাকে আপনার ETH রাখতে দেয়। স্টেবলকয়েন হল টোকেন যা আপনার নগদ প্রয়োজনের জন্য অনেক ভালো কারণ এগুলো ETH এর মত মূল্যে ওঠানামা করে না। [স্টেবলকয়েন সম্পর্কে আরও জানুন](#stablecoins) -#### ফ্ল্যাশ লোনস {#flash-loans} +#### ফ্ল্যাশ লোন {#flash-loans} ফ্ল্যাশ লোন হল বিকেন্দ্রীকৃত ঋণের একটি আরও পরীক্ষামূলক রূপ যা আপনাকে জামানত ছাড়া বা কোনো ব্যক্তিগত তথ্য প্রদান ছাড়াই ঋণ নিতে দেয়। @@ -171,26 +172,28 @@ Dai বা USDC-এর মতো কয়েনগুলির একটি ম প্রথাগত আর্থিক জগতে উপরের উদাহরণটি করতে সক্ষম হতে, আপনার প্রচুর পরিমাণ অর্থের প্রয়োজন হবে। এই অর্থ উপার্জন কৌশল শুধুমাত্র যাদের বিদ্যমান সম্পদ আছে তাদের অ্যাক্সেসযোগ্য। ফ্ল্যাশ লোন হল একটি ভবিষ্যতের উদাহরণ যেখানে অর্থ উপার্জনের জন্য অর্থ থাকা অপরিহার্য নয়। -[ফ্ল্যাশ লোন সম্পর্কে আরো](https://aave.com/docs/aave-v3/guides/flash-loans) + + ফ্ল্যাশ লোন সম্পর্কে আরও জানুন + ### ক্রিপ্টো দিয়ে সঞ্চয় করা শুরু করুন {#saving} -#### ঋণদান {#lending} +#### ঋণ দেওয়া {#lending} -আপনি আপনার ক্রিপ্টোকে ধার দিয়ে সুদ উপার্জন করতে পারেন এবং আপনার ফান্ড রিয়েল টাইমে বৃদ্ধি পেতে দেখতে পারেন। এই মুহূর্তে সুদের হারগুলি আপনার স্থানীয় ব্যাঙ্কে আপনি যা পেতে পারেন তার চেয়ে অনেক বেশি (যদি আপনি ভাগ্যবান হন যে একটি অ্যাক্সেস করতে সক্ষম হন)। উদাহরণস্বরূপ: +আপনি আপনার ক্রিপ্টোকে ধার দিয়ে সুদ উপার্জন করতে পারেন এবং আপনার ফান্ড রিয়েল টাইমে বৃদ্ধি পেতে দেখতে পারেন। এই মুহূর্তে সুদের হারগুলি আপনার স্থানীয় ব্যাঙ্কে আপনি যা পেতে পারেন তার চেয়ে অনেক বেশি (যদি আপনি ভাগ্যবান হন যে একটি অ্যাক্সেস করতে সক্ষম হন)। এখানে একটি উদাহরণ: -- আপনি Aave-এর মতো একটি পণ্যকে আপনার 100 Dai, একটি [স্টেবলকয়েন](/stablecoins/) ধার দেন। +- আপনি Aave-এর মতো একটি প্রোডাক্টকে আপনার 100 Dai, একটি [স্টেবলকয়েন](/stablecoins/), ধার দেন। - আপনি 100 Aave Dai (aDai) পাবেন যা একটি টোকেন যা আপনার ধার করা Dai কে প্রতিনিধিত্ব করে। -- সুদের হারের উপর ভিত্তি করে আপনার aDai বৃদ্ধি পাবে এবং আপনি আপনার ওয়ালেটে আপনার ব্যালেন্স বাড়তে দেখতে পাবেন। APR-এর উপর নির্ভর করে, আপনার ওয়ালেট ব্যালেন্স কয়েক দিন বা এমনকি কয়েক ঘন্টা পরে 100.1234 এর মত কিছু পড়বে! +- সুদের হারের উপর ভিত্তি করে আপনার aDai বৃদ্ধি পাবে এবং আপনি আপনার ওয়ালেটে আপনার ব্যালেন্স বাড়তে দেখতে পাবেন। [APR](/glossary/#apr)-এর উপর নির্ভর করে, আপনার ওয়ালেট ব্যালেন্স কয়েক দিন বা এমনকি কয়েক ঘন্টা পরেও 100.1234-এর মতো কিছু দেখাবে! - আপনি যেকোন সময় আপনার aDai ব্যালেন্সের সমান পরিমাণ নিয়মিত Dai তুলতে পারবেন। - ধার দেওয়া dapps গুলো দেখুন + ঋণ দেওয়ার ডিএ্যাপস দেখুন -#### নো-লস লটারিসমূহ {#no-loss-lotteries} +#### লোকসান-বিহীন লটারি {#no-loss-lotteries} PoolTogether-এর মতো নো-লস লটারি অর্থ সঞ্চয় করার একটি মজাদার এবং উদ্ভাবনী নতুন উপায়। @@ -208,43 +211,43 @@ PoolTogether-এর মতো নো-লস লটারি অর্থ সঞ -### টোকেন সমূহ এক্সচেঞ্জ করুন {#swaps} +### টোকেন এক্সচেঞ্জ করুন {#swaps} ইথেরিয়ামে হাজার হাজার টোকেন রয়েছে। বিকেন্দ্রীভূত এক্সচেঞ্জ (DEX) আপনি যখনই চান তখনই আপনাকে বিভিন্ন টোকেন বাণিজ্য করতে দেয়। আপনি কখনই আপনার সম্পদের নিয়ন্ত্রণ ছেড়ে দিবেন না। এটি একটি ভিন্ন দেশে যাওয়ার সময় একটি মুদ্রা বিনিময় ব্যবস্থা ব্যবহার করার মত। কিন্তু DeFi সংস্করণ কখনই বন্ধ হয় না। মার্কেটগুলো বছরে 24/7, 365 দিন এবং এর প্রযুক্তি এই গ্যারান্টি দেয় যে সর্বদা একটি ট্রেড গ্রহণ করার জন্য কেউ থাকবে। উদাহরণস্বরূপ, আপনি যদি নো-লস লটারি PoolTogether (উপরে বর্ণিত) ব্যবহার করতে চান, তাহলে আপনাকে Dai বা USDC-এর মতো একটি টোকেনের প্রয়োজন হবে। এই DEX গুলি আপনাকে সেই টোকেনগুলির জন্য আপনার ETH অদলবদল করতে এবং আপনার শেষ হয়ে গেলে আবার ফিরে আসতে দেয়। - টোকেন এক্সচেঞ্জ দেখুন + টোকেন এক্সচেঞ্জগুলো দেখুন -### উন্নত ট্রেডিং {#trading} +### অ্যাডভান্সড ট্রেডিং {#trading} যারা একটু বেশি নিয়ন্ত্রণ পছন্দ করেন তাদের জন্য আরও উন্নত ব্যবস্থা রয়েছে। সীমিত অর্ডারস, পার্পেচুয়ালস, মার্জিন ট্রেডিং এবং আরও অনেক কিছু সম্ভব। বিকেন্দ্রীভূত ট্রেডিংয়ের মাধ্যমে আপনি বিশ্বব্যাপী লিকুইডিটির অ্যাক্সেস পান, বাজার কখনই বন্ধ হয় না এবং আপনি সর্বদা আপনার সম্পদের নিয়ন্ত্রণে থাকেন। যখন আপনি একটি কেন্দ্রীভূত এক্সচেঞ্জ ব্যবহার করেন তখন আপনাকে ট্রেডের আগে আপনার সম্পদ জমা করতে হবে এবং সেগুলির যত্ন নেওয়ার জন্য তাদের বিশ্বাস করতে হবে। আপনার সম্পদ জমা হওয়ার সময়, সেগুলি ঝুঁকির মধ্যে রয়েছে কারণ কেন্দ্রীভূত এক্সচেঞ্জগুলি হ্যাকারদের জন্য আকর্ষণীয় লক্ষ্য। - ট্রেডিং dapps দেখুন + ট্রেডিং ডিএ্যাপস দেখুন -### আপনার পোর্টফোলিও বাড়ান {#investing} +### আপনার পোর্টফোলিও বাড়ান {#investing} ইথেরিয়াম এ ফান্ড ম্যানেজমেন্ট পণ্য রয়েছে যা আপনার পছন্দের কৌশলের ভিত্তিতে আপনার পোর্টফোলিও বাড়ানোর চেষ্টা করবে। এটি স্বয়ংক্রিয়, সকলের জন্য উন্মুক্ত, এবং আপনার লাভের একটি অংশ নেওয়ার জন্য একজন মানব পরিচালকের প্রয়োজন নেই। -একটি ভাল উদাহরণ হল [DeFi পালস ইনডেক্স ফান্ড (DPI)](https://defipulse.com/blog/defi-pulse-index/)। এটি এমন একটি তহবিল যা আপনার পোর্টফোলিওতে সর্বদা [বাজার মূলধন দ্বারা শীর্ষ DeFi টোকেন](https://www.coingecko.com/en/defi) অন্তর্ভুক্ত থাকে তা নিশ্চিত করতে স্বয়ংক্রিয়ভাবে ভারসাম্য বজায় রাখে। আপনাকে কখনই কোনো বিবরণ পরিচালনা করতে হবে না এবং আপনি যখন খুশি ফান্ড থেকে উত্তোলন করতে পারেন। +একটি ভালো উদাহরণ হলো [DeFi Pulse Index fund (DPI)](https://defipulse.com/blog/defi-pulse-index/)। এটি এমন একটি তহবিল যা আপনার পোর্টফোলিওতে সর্বদা বাজার মূলধন দ্বারা শীর্ষ DeFi টোকেন অন্তর্ভুক্ত থাকে তা নিশ্চিত করতে স্বয়ংক্রিয়ভাবে ভারসাম্য বজায় রাখে। আপনাকে কখনই কোনো বিবরণ পরিচালনা করতে হবে না এবং আপনি যখন খুশি ফান্ড থেকে উত্তোলন করতে পারেন। - বিনিয়োগ dapps গুলো দেখুন + বিনিয়োগের ডিএ্যাপস দেখুন -### আপনার আইডিয়াগুলো ফান্ড করুন {#crowdfunding} +### আপনার ধারণাগুলোকে অর্থায়ন করুন {#crowdfunding} ইথেরিয়াম ক্রাউডফান্ডিংয়ের জন্য একটি আদর্শ প্ল্যাটফর্ম: @@ -253,14 +256,14 @@ PoolTogether-এর মতো নো-লস লটারি অর্থ সঞ - তহবিল সংগ্রহকারীরা স্বয়ংক্রিয় অর্থ ফেরত সেটআপ করতে পারে যদি, উদাহরণস্বরূপ, একটি নির্দিষ্ট সময়সীমা এবং ন্যূনতম পরিমাণ পূরণ না হয়। - ক্রাউডফান্ডিং dapps গুলো দেখুন + ক্রাউডফান্ডিং ডিএ্যাপস দেখুন #### কোয়াড্রেটিক ফান্ডিং {#quadratic-funding} -ইথেরিয়াম হল ওপেন সোর্স সফ্টওয়্যার এবং এখনও পর্যন্ত অনেক কাজ কমিউনিটি দ্বারা অর্থায়ন করা হয়েছে। এটি একটি আকর্ষণীয় নতুন অর্থ সংগ্রহের মডেলের বৃদ্ধির দিকে পরিচালিত করেছে: কোয়াড্রেটিক ফান্ডিং। This has the potential to improve the way we fund all types of public goods in the future. +ইথেরিয়াম হল ওপেন সোর্স সফ্টওয়্যার এবং এখনও পর্যন্ত অনেক কাজ কমিউনিটি দ্বারা অর্থায়ন করা হয়েছে। এটি একটি আকর্ষণীয় নতুন অর্থ সংগ্রহের মডেলের বৃদ্ধির দিকে পরিচালিত করেছে: কোয়াড্রেটিক ফান্ডিং। ভবিষ্যতে সব ধরনের গণপণ্যে আমাদের অর্থায়ন করার পদ্ধতিকে উন্নত করার সম্ভাবনা এর মধ্যে রয়েছে। -Quadratic funding makes sure that the projects that receive the most funding are those with the most unique demand. In other words, projects that stand to improve the lives of the most people. এটি কীভাবে কাজ করে তার ব্যাখ্যা দেওয়া হল: +কোয়াড্রেটিক ফান্ডিং এটা নিশ্চিত করে যে, যে প্রোজেক্টগুলো সবচেয়ে বেশি ফান্ডিং পায়, সেগুলোর চাহিদাই সবচেয়ে অনন্য। অন্য কথায়, যে প্রোজেক্টগুলো সবচেয়ে বেশি মানুষের জীবনযাত্রার মান উন্নত করতে পারে। এটি কীভাবে কাজ করে তার ব্যাখ্যা দেওয়া হল: 1. অনুদানকৃত ফান্ডের একটি ম্যাচিং পুল আছে। 2. পাবলিক ফান্ডিং এর একটি রাউন্ড শুরু হয়। @@ -269,7 +272,9 @@ Quadratic funding makes sure that the projects that receive the most funding are এর মানে হচ্ছে, B-এর 10,000 ডলারের একটি অনুদানের তুলনায় প্রজেক্ট A-এর 1 ডলারের 100টি অনুদানে শেষ পর্যন্ত বেশি পরিমাণে অর্থ জমা হতে পারে (মেচিং পুলের আকারের উপরে ভিত্তি করে)। -[কোয়াড্রেটিক ফান্ডিং সম্পর্কে আরো](https://wtfisqf.com) + + কোয়াড্রেটিক ফান্ডিং সম্পর্কে আরও জানুন + @@ -277,20 +282,20 @@ Quadratic funding makes sure that the projects that receive the most funding are বিকেন্দ্রীভূত বীমার লক্ষ্য বীমা সস্তা, দ্রুত পরিশোধ করা এবং আরও স্বচ্ছ করা। আরো অটোমেশনের সহায়তায়, কভারেজ আরো সাশ্রয়ী এবং পে-আউটগুলি অনেক দ্রুত হয়ে উঠে। আপনার দাবির সিদ্ধান্ত নিতে ব্যবহৃত ডেটা সম্পূর্ণ স্বচ্ছ। -যেকোন সফ্টওয়্যারের মতো ইথেরিয়াম পণ্যগুলি বাগ এবং শোষণের শিকার হতে পারে। তাই এই মুহূর্তে এই ক্ষেত্রে প্রচুর বীমা পণ্য তাদের ব্যবহারকারীদের তহবিলের ক্ষতি থেকে রক্ষা করার উপর ফোকাস করে। যাইহোক, জীবন আমাদের দিকে এগিয়ে দিতে পারে এমন সবকিছুর জন্য কভারেজ তৈরি করতে শুরু করা প্রকল্প রয়েছে। এর একটি ভাল উদাহরণ হল Etherisc এর ক্রপ কভার যার লক্ষ্য [খরা এবং বন্যা থেকে কেনিয়ার ক্ষুদ্র কৃষকদের রক্ষা করুন](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc)। বিকেন্দ্রীভূত বীমা কৃষকদের জন্য সস্তা কভার প্রদান করতে পারে যাদের প্রায়শই প্রথাগত বীমার বাইরে মূল্য দেওয়া হয়। +যেকোন সফ্টওয়্যারের মতো ইথেরিয়াম পণ্যগুলি বাগ এবং শোষণের শিকার হতে পারে। তাই এই মুহূর্তে এই ক্ষেত্রে প্রচুর বীমা পণ্য তাদের ব্যবহারকারীদের তহবিলের ক্ষতি থেকে রক্ষা করার উপর ফোকাস করে। যাইহোক, জীবন আমাদের দিকে এগিয়ে দিতে পারে এমন সবকিছুর জন্য কভারেজ তৈরি করতে শুরু করা প্রকল্প রয়েছে। এর একটি ভালো উদাহরণ হলো Etherisc-এর ক্রপ কভার, যার লক্ষ্য হলো [কেনিয়ার ক্ষুদ্র কৃষকদের খরা এবং বন্যার বিরুদ্ধে সুরক্ষা দেওয়া](https://blog.etherisc.com/etherisc-teams-up-with-chainlink-to-deliver-crop-insurance-in-kenya-137e433c29dc)। বিকেন্দ্রীভূত বীমা কৃষকদের জন্য সস্তা কভার প্রদান করতে পারে যাদের প্রায়শই প্রথাগত বীমার বাইরে মূল্য দেওয়া হয়। - বীমা dapps গুলো দেখুন + বীমা ডিএ্যাপস দেখুন -### এগ্রিগেটর এবং পোর্টফোলিও ম্যানেজার সমূহ {#aggregators} +### অ্যাগ্রিগেটর এবং পোর্টফোলিও ম্যানেজার {#aggregators} এত কিছু করার সাথে, আপনার সমস্ত বিনিয়োগ, ঋণ এবং ব্যবসার ট্র্যাক রাখার জন্য আপনার একটি উপায় প্রয়োজন। অনেকগুলি পণ্য রয়েছে যা আপনাকে আপনার সমস্ত DeFi কার্যকলাপকে এক জায়গা থেকে সমন্বয় করতে দেয়। এটি DeFi এর উন্মুক্ত আর্কিটেকচারের সৌন্দর্য। দলগুলো এমন ইন্টারফেস তৈরি করতে পারে যেখানে আপনি কেবল পণ্য জুড়ে আপনার ব্যালেন্স দেখতে পাবেন না, আপনি তাদের বৈশিষ্ট্যগুলিও ব্যবহার করতে পারেন। আপনি DeFi এর আরও এক্সপ্লোর করার সাথে সাথে এটি দরকারী বলে মনে হতে পারে। - পোর্টফোলিও dapps সমূহ দেখুন + পোর্টফোলিও ডিএ্যাপস দেখুন @@ -319,37 +324,43 @@ DeFi-এ, একটি স্মার্ট কন্ট্র্যাক্ আপনি লেয়ারসমূহে DeFi এর কথা ভাবতে পারেন: 1. ব্লকচেইন – ইথেরিয়ামে লেনদেনের ইতিহাস এবং অ্যাকাউন্টের অবস্থা ধারন করে। -2. সম্পদ – [ETH](/what-is-ether/) এবং অন্যান্য টোকেনগুলো (মুদ্রাসমূহ)। -3. প্রোটোকল - [স্মার্ট কনট্র্যাক্ট](/glossary/#smart-contract) যাকিনা কার্যকারিতা প্রদান করে, উদাহরণস্বরূপ, একটি পরিষেবা যা সম্পদের বিকেন্দ্রীভূত ঋণের অনুমতি দেয়। -4. [অ্যাপ্লিকেশানগুলো](/apps/) – প্রোটোকলগুলি পরিচালনা এবং অ্যাক্সেস করতে আমরা যে পণ্যগুলি ব্যবহার করি। +2. সম্পদ – [ETH](/what-is-ether/) এবং অন্যান্য টোকেন (মুদ্রা)। +3. প্রোটোকল – [স্মার্ট কন্ট্র্যাক্ট](/glossary/#smart-contract) যা কার্যকারিতা প্রদান করে, উদাহরণস্বরূপ, এমন একটি পরিষেবা যা সম্পদের ডিসেন্ট্রালাইজড ঋণের অনুমতি দেয়। +4. [অ্যাপ্লিকেশনগুলো](/apps/) – যে প্রোডাক্টগুলো আমরা প্রোটোকল পরিচালনা এবং অ্যাক্সেস করতে ব্যবহার করি। + +দ্রষ্টব্য: DeFi-এর বেশিরভাগই [ERC-20 স্ট্যান্ডার্ড](/glossary/#erc-20) ব্যবহার করে। DeFi-এর অ্যাপ্লিকেশনগুলি ETH-এর জন্য একটি র‍্যাপার ব্যবহার করে যাকে Wrapped ether (WETH) বলা হয়। [Wrapped ether সম্পর্কে আরও জানুন](/wrapped-eth)। ## DeFi তৈরি করুন {#build-defi} DeFi একটি ওপেন সোর্স মুভমেন্ট। আপনার জন্য DeFi প্রোটোকলসমূহ এবং অ্যাপ্লিকেশনগুলি যাচাই, ফর্ক ও উদ্ভাবনের জন্য উন্মুক্ত। এই স্তরযুক্ত স্ট্যাকের কারণে (তারা সবাই একই বেস ব্লকচেইন এবং সম্পদ ভাগাভাগি করে), প্রোটোকলগুলি মিশ্রিত করা যেতে পারে এবং অনন্য কম্বো সুযোগগুলি আনলক করতে মিলিত হতে পারে। - Dapps তৈরি সম্পর্কে আরো + ডিএ্যাপস তৈরি সম্পর্কে আরও জানুন -## Further reading {#futher-reading} +## আরও পড়ুন {#further-reading} ### DeFi ডেটা {#defi-data} - [DeFi Prime](https://defiprime.com/) - [DeFi Llama](https://defillama.com/) -- [DeFi Rate](https://defirate.com/) ### DeFi আর্টিকেল {#defi-articles} -- [DeFi-এর জন্য একটি শিক্ষানবিস গাইড](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu, ৬ জানুয়ারি, 2020_ +- [DeFi-এর জন্য একটি শিক্ষানবিস নির্দেশিকা](https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4) – _Sid Coelho-Prabhu, January 6, 2020_ +- [EEA DeFi Risk Assessment Guidelines](https://entethalliance.org/specs/defi-risks/) – DeFi প্রোটোকলগুলিতে মূল ঝুঁকিগুলি কীভাবে চিহ্নিত এবং মূল্যায়ন করা যায় তার উপর একটি ইন্ডাস্ট্রি-সমর্থিত ওভারভিউ। -### Videos {#videos} +### ভিডিও {#videos} -- [Finematics - বিকেন্দ্রীভূত আর্থিক শিক্ষা](https://finematics.com/) – _DeFi এর উপর ভিডিও_ -- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _DeFi বেসিকস: এই বিস্তর পরিসীমাযুক্ত বিস্ময়কর স্থানে শুরু করার জন্য আপনার যা যা জানা প্রয়োজন।_ +- [Finematics - ডিসেন্ট্রালাইজড ফিনান্স শিক্ষা](https://finematics.com/) – _DeFi-এর উপর ভিডিও_ +- [The Defiant](https://www.youtube.com/playlist?list=PLaDcID4s1KronHMKojfjwiHL0DdQEPDcq) - _DeFi বেসিকস: এই মাঝে মাঝে বিভ্রান্তিকর স্পেসে শুরু করার জন্য আপনার যা কিছু জানা দরকার।_ - [Whiteboard Crypto](https://youtu.be/17QRFlml4pA) _DeFi কি?_ -### কমিউনিটিগুলো {#communities} +### কমিউনিটি {#communities} + +- [DeFi Llama Discord server](https://discord.defillama.com/) +- [DeFi Pulse Discord server](https://discord.gg/Gx4TCTk) + + -- [DeFi Llama Discord সার্ভার](https://discord.gg/buPFYXzDDd) -- [DeFi Pulse Discord সার্ভার](https://discord.gg/Gx4TCTk) + diff --git a/public/content/translations/bn/desci/index.md b/public/content/translations/bn/desci/index.md index 5283b8b602c..c9a80ea9fa7 100644 --- a/public/content/translations/bn/desci/index.md +++ b/public/content/translations/bn/desci/index.md @@ -1,24 +1,24 @@ --- -title: বিকেন্দ্রীভূত বিজ্ঞান (DeSci) -description: ইথেরিয়ামে বিকেন্দ্রীভূত বিজ্ঞানের একটি ওভারভিউ +title: "বিকেন্দ্রীভূত বিজ্ঞান (DeSci)" +description: "ইথেরিয়ামে বিকেন্দ্রীভূত বিজ্ঞানের একটি ওভারভিউ" lang: bn template: use-cases emoji: ":microscope:" sidebarDepth: 2 image: /images/future_transparent.png alt: "" -summaryPoint1: একটি বিশ্বব্যাপী, বর্তমান বৈজ্ঞানিক ব্যবস্থার উন্মুক্ত বিকল্প। -summaryPoint2: প্রযুক্তি যা বিজ্ঞানীদের তহবিল সংগ্রহ করতে, পরীক্ষা চালাতে, ডেটা শেয়ার করতে, ইনসাইটস বিতরণ করতে এবং আরও অনেক কিছু করতে সক্ষম করে। -summaryPoint3: উন্মুক্ত বিজ্ঞান আন্দোলন গড়ে তোলে। +summaryPoint1: "একটি বিশ্বব্যাপী, বর্তমান বৈজ্ঞানিক ব্যবস্থার উন্মুক্ত বিকল্প।" +summaryPoint2: "প্রযুক্তি যা বিজ্ঞানীদের তহবিল সংগ্রহ করতে, পরীক্ষা চালাতে, ডেটা শেয়ার করতে, ইনসাইটস বিতরণ করতে এবং আরও অনেক কিছু করতে সক্ষম করে।" +summaryPoint3: "উন্মুক্ত বিজ্ঞান আন্দোলন গড়ে তোলে।" --- ## বিকেন্দ্রীভূত বিজ্ঞান (DeSci) কী? {#what-is-desci} -বিকেন্দ্রীভূত বিজ্ঞান (DeSci) হলো একটি আন্দোলন যার লক্ষ্য হল Web3 স্ট্যাক ব্যবহার করে বৈজ্ঞানিক জ্ঞানকে ন্যায্যভাবে এবং ন্যায়সঙ্গতভাবে অর্থায়ন, নির্মাণ, পর্যালোচনা, ক্রেডিটং, সঞ্চয় এবং প্রচারের জন্য পাবলিক অবকাঠামো তৈরি করা। +বিকেন্দ্রীভূত বিজ্ঞান (DeSci) হলো একটি আন্দোলন যার লক্ষ্য [Web3](/glossary/#web3) স্ট্যাক ব্যবহার করে ন্যায্য এবং ন্যায়সঙ্গতভাবে বৈজ্ঞানিক জ্ঞানের জন্য অর্থায়ন, তৈরি, পর্যালোচনা, ক্রেডিট, সংরক্ষণ এবং প্রচারের জন্য পাবলিক অবকাঠামো তৈরি করা। DeSci একটি ইকোসিস্টেম তৈরি করার লক্ষ্য রাখে যেখানে বিজ্ঞানীরা তাদের গবেষণা খোলাখুলিভাবে শেয়ার করতে এবং তাদের কাজের জন্য কৃতিত্ব পাওয়ার জন্য উৎসাহিত করা হয় এবং যেকেউ সহজেই গবেষণায় অ্যাক্সেস এবং অবদান রাখতে দেয়। DeSci এই ধারণাটি নিয়ে কাজ করে দেয় যে বৈজ্ঞানিক জ্ঞান সবার কাছে অ্যাক্সেসযোগ্য হওয়া উচিত এবং বৈজ্ঞানিক গবেষণার প্রক্রিয়াটি স্বচ্ছ হওয়া উচিত। DeSci একটি আরও বিকেন্দ্রীভূত এবং বিতরণ করা বৈজ্ঞানিক গবেষণা মডেল তৈরি করছে, এটি কেন্দ্রীয় কর্তৃপক্ষের সেন্সরশিপ এবং নিয়ন্ত্রণের বিরুদ্ধে আরও প্রতিরোধী করে তুলেছে। DeSci এমন একটি পরিবেশ তৈরি করার আশা করে যেখানে নতুন এবং অপ্রচলিত ধারণাগুলি অর্থায়ন, বৈজ্ঞানিক টুলস এবং যোগাযোগের চ্যানেলগুলিতে অ্যাক্সেসকে বিকেন্দ্রীকরণ করে বিকাশ লাভ করতে পারে। -বিকেন্দ্রীভূত বিজ্ঞান আরও বিভিন্ন তহবিল উৎসের অনুমতি দেয় ([DAO](/dao/) থেকে, ক্রাউডফান্ডিং এবং আরও অনেক কিছুর জন্য [কোয়াড্রেটিক ডোনেশন সমূহ](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531)), আরও অ্যাক্সেসযোগ্য অতিরিক্ত ডেটা ও পদ্ধতিগুলো, এবং পুনঃউৎপাদন ক্ষমতার জন্য প্রণোদনা প্রদান করে। +বিকেন্দ্রীভূত বিজ্ঞান আরও বৈচিত্র্যময় অর্থায়নের উৎস ([DAO](/glossary/#dao), [কোয়াড্রেটিক ডোনেশন](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531) থেকে শুরু করে ক্রাউডফান্ডিং ও আরও অনেক কিছু), আরও সহজলভ্য ডেটা এবং পদ্ধতি, এবং পুনরুৎপাদনের জন্য প্রণোদনা প্রদানের সুযোগ করে দেয়। ### জুয়ান বেনেট - DeSci আন্দোলন @@ -28,110 +28,112 @@ DeSci একটি ইকোসিস্টেম তৈরি করার ল বিজ্ঞানের মূল সমস্যাগুলির একটি অসম্পূর্ণ তালিকা এবং কীভাবে বিকেন্দ্রীভূত বিজ্ঞান এই সমস্যাগুলি সমাধান করতে সাহায্য করতে পারে -| **বিকেন্দ্রীভূত বিজ্ঞান** | **প্রথাগত বিজ্ঞান** | -| -------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | -| ফান্ডের বন্টন জনসাধারণের দ্বারা নির্ধারিত হয় কোয়াড্রেটিক ডোনেশনস বা DAO এর মতো মেকানিজম ব্যবহার করে। | ছোট, বন্ধ, কেন্দ্রীভূত গোষ্ঠীগুলি ফান্ডের বিতরণ নিয়ন্ত্রণ করে। | -| আপনি গতিশীল দলে সারা বিশ্ব থেকে সহকর্মীদের সাথে সহযোগিতা করেন। | অর্থায়ন সংস্থা এবং হোম প্রতিষ্ঠানগুলি আপনার সহযোগিতাকে সীমিত করে। | -| অর্থায়নের সিদ্ধান্তগুলি অনলাইনে এবং স্বচ্ছভাবে নেওয়া হয়। নতুন ফান্ডিং মেকানিজমসমূহ এক্সপ্লোর করা হয়। | অর্থায়নের সিদ্ধান্তগুলি দীর্ঘ অনুমোদন সময় এবং সীমিত স্বচ্ছতার সাথে নেওয়া হয়। কিছু ফান্ডিং মেকানিজমস বিদ্যমান। | -| Web3-এর মৌলিক বিষয়সমূহ ব্যবহার করে ল্যাবরেটরি পরিষেবাগুলি শেয়ার করা সহজতর এবং আরও স্বচ্ছ করা হয়েছে। | ল্যাবরেটরি রিসোর্সগুলো শেয়ার করা প্রায়ই ধীর এবং অস্বচ্ছ হয়। | -| প্রকাশের জন্য নতুন মডেল তৈরি করা যেতে পারে যা বিশ্বাস, স্বচ্ছতা এবং সর্বজনীন অ্যাক্সেসের জন্য Web3 প্রিমিটিভস ব্যবহার করে। | আপনি প্রায়শই অদক্ষ, পক্ষপাতদুষ্ট এবং শোষণমূলক হিসাবে স্বীকৃত প্রতিষ্ঠিত পথের মাধ্যমে প্রকাশ করেন। | -| আপনি পিয়ার-পর্যালোচনার কাজের জন্য টোকেন এবং খ্যাতি অর্জন করতে পারেন। | আপনার পিয়ার-রিভিউ কাজ অবৈতনিক, লাভজনক প্রকাশকদের উপকার করে। | -| আপনি যে ইন্টেলেকচুয়াল প্রপার্টি (IP) তৈরি করেন তার মালিক এবং স্বচ্ছ শর্তাবলী অনুসারে এটি বিতরণ করেন। | আপনি যে IP তৈরি করেন তার মালিক আপনার হোম প্রতিষ্ঠান। IP অ্যাক্সেস স্বচ্ছ নয়। | -| সমস্ত গবেষণা শেয়ার করা, যার মধ্যে অসফল প্রচেষ্টার ডেটা সহ, সমস্ত ধাপগুলি অন-চেইন করে। | প্রকাশনার পক্ষপাতের মানে হল যে গবেষকরা সফল ফলাফলের জন্য পরীক্ষাগুলি শেয়ার করার সম্ভাবনা বেশি। | +| **বিকেন্দ্রীভূত বিজ্ঞান** | **প্রথাগত বিজ্ঞান** | +| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| তহবিল বন্টন **জনসাধারণ দ্বারা নির্ধারিত হয়** কোয়াড্রেটিক ডোনেশন বা DAO-এর মতো পদ্ধতি ব্যবহার করে। | ছোট, বদ্ধ, **কেন্দ্রীভূত গোষ্ঠী** তহবিলের বিতরণ নিয়ন্ত্রণ করে। | +| আপনি গতিশীল দলে **সারা বিশ্বের** সহকর্মীদের সাথে সহযোগিতা করেন। | অর্থায়নকারী সংস্থা এবং নিজস্ব প্রতিষ্ঠানগুলো আপনার সহযোগিতাকে **সীমিত** করে। | +| অর্থায়নের সিদ্ধান্তগুলি অনলাইনে এবং **স্বচ্ছভাবে** নেওয়া হয়। নতুন ফান্ডিং মেকানিজমসমূহ এক্সপ্লোর করা হয়। | অর্থায়নের সিদ্ধান্তগুলো দীর্ঘ সময় এবং **সীমিত স্বচ্ছতার** সাথে নেওয়া হয়। কিছু ফান্ডিং মেকানিজমস বিদ্যমান। | +| [Web3](/glossary/#web3) প্রযুক্তি ব্যবহার করে ল্যাবরেটরির পরিষেবা শেয়ার করা আরও সহজ এবং স্বচ্ছ করা হয়েছে। | ল্যাবরেটরি রিসোর্স শেয়ার করা প্রায়শই **ধীর এবং অস্বচ্ছ** হয়। | +| **প্রকাশনার জন্য নতুন মডেল** তৈরি করা যেতে পারে যা বিশ্বাস, স্বচ্ছতা এবং সার্বজনীন অ্যাক্সেসের জন্য Web3 প্রিমিটিভ ব্যবহার করে। | আপনি প্রতিষ্ঠিত পদ্ধতির মাধ্যমে প্রকাশ করেন যা প্রায়শই **অদক্ষ, পক্ষপাতদুষ্ট এবং শোষণমূলক** হিসাবে স্বীকৃত। | +| আপনি পিয়ার-রিভিউ কাজের জন্য **টোকেন এবং খ্যাতি অর্জন করতে পারেন**। | আপনার **পিয়ার-রিভিউয়ের কাজ অবৈতনিক**, যা লাভজনক প্রকাশকদের সুবিধা দেয়। | +| **আপনি আপনার তৈরি করা মেধা সম্পত্তির (IP) মালিক** এবং এটি স্বচ্ছ শর্তাবলী অনুসারে বিতরণ করেন। | **আপনার নিজস্ব প্রতিষ্ঠান আপনার তৈরি করা IP-এর মালিক**। IP অ্যাক্সেস স্বচ্ছ নয়। | +| **সমস্ত গবেষণা শেয়ার করা**, যার মধ্যে অসফল প্রচেষ্টার ডেটাও অন্তর্ভুক্ত, সমস্ত ধাপ অনচেইনে রেখে। | **প্রকাশনার পক্ষপাতিত্ব** মানে হলো গবেষকরা সফল ফলাফল পেয়েছে এমন পরীক্ষা-নিরীক্ষা শেয়ার করার সম্ভাবনা বেশি। | -## ইথেরিয়াম এবং DeSci {#ethereum-and-desci} +## Ethereum এবং DeSci {#ethereum-and-desci} -একটি বিকেন্দ্রীভূত বিজ্ঞান ব্যবস্থার জন্য প্রয়োজন হবে শক্তিশালী নিরাপত্তা, মিনিমাল মনেটারি এবং লেনদেন খরচসমূহ এবং অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য একটি সমৃদ্ধ ইকোসিস্টেম। ইথেরিয়াম একটি বিকেন্দ্রীভূত বিজ্ঞান স্ট্যাক নির্মাণের জন্য প্রয়োজনীয় সবকিছু প্রদান করে। +একটি বিকেন্দ্রীভূত বিজ্ঞান ব্যবস্থার জন্য প্রয়োজন হবে শক্তিশালী নিরাপত্তা, মিনিমাল মনেটারি এবং লেনদেন খরচসমূহ এবং অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য একটি সমৃদ্ধ ইকোসিস্টেম। Ethereum একটি বিকেন্দ্রীভূত বিজ্ঞান প্রযুক্তি তৈরির জন্য প্রয়োজনীয় সবকিছু সরবরাহ করে। -## DeSci ব্যবহার ক্ষেত্র সমূহ {#use-cases} +## DeSci-এর ব্যবহারের ক্ষেত্র {#use-cases} -ডিজিটাল পৃথিবীতে Web2 অ্যাকাডেমিয়া অনবোর্ড করার জন্য DeSci সায়েন্টিফিক টুলসেট তৈরি করছে। নীচে ব্যবহারের ক্ষেত্রে একটি নমুনা দেওয়া হল যা Web3 বৈজ্ঞানিক সম্প্রদায়কে অফার করতে পারে। +DeSci ডিজিটাল বিশ্বে প্রচলিত শিক্ষাব্যবস্থাকে অন্তর্ভুক্ত করার জন্য বৈজ্ঞানিক টুলসেট তৈরি করছে। নীচে ব্যবহারের ক্ষেত্রে একটি নমুনা দেওয়া হল যা Web3 বৈজ্ঞানিক সম্প্রদায়কে অফার করতে পারে। ### প্রকাশনা {#publishing} -বিজ্ঞান প্রকাশনা বিখ্যাতভাবে সমস্যাযুক্ত কারণ এটি প্রকাশনা সংস্থাগুলির দ্বারা পরিচালিত হয় যেগুলি গবেষণাপত্র তৈরি করতে বিজ্ঞানী, পর্যালোচনাকারী এবং সম্পাদকদের বিনামূল্যে শ্রমের উপর নির্ভর করে কিন্তু তারপরে অতিরিক্ত প্রকাশনা ফি চার্জ করে। জনসাধারণ, যারা সাধারণত পরোক্ষভাবে কাজের জন্য এবং প্রকাশনার খরচ ট্যাক্সের মাধ্যমে পরিশোধ করে থাকে, তারা প্রায়শই প্রকাশককে আবার অর্থ প্রদান না করে একই কাজ অ্যাক্সেস করতে পারে না। স্বতন্ত্রভাবে বিজ্ঞানের গবেষণাপত্র প্রকাশের জন্য মোট ফি প্রায়ই পাঁচ অঙ্কের ($USD) হয়, যা প্রকাশকদের একটি ছোট গ্রুপের জন্য প্রচুর মুনাফা তৈরি করে এবং একটি [পাবলিক গুড](https://www.econlib.org/library/Enc/PublicGoods.html) হিসাবে বৈজ্ঞানিক জ্ঞানের সম্পূর্ণ ধারণাকে ক্ষুন্ন করে। +বিজ্ঞান প্রকাশনা বিখ্যাতভাবে সমস্যাযুক্ত কারণ এটি প্রকাশনা সংস্থাগুলির দ্বারা পরিচালিত হয় যেগুলি গবেষণাপত্র তৈরি করতে বিজ্ঞানী, পর্যালোচনাকারী এবং সম্পাদকদের বিনামূল্যে শ্রমের উপর নির্ভর করে কিন্তু তারপরে অতিরিক্ত প্রকাশনা ফি চার্জ করে। জনসাধারণ, যারা সাধারণত পরোক্ষভাবে কাজের জন্য এবং প্রকাশনার খরচ ট্যাক্সের মাধ্যমে পরিশোধ করে থাকে, তারা প্রায়শই প্রকাশককে আবার অর্থ প্রদান না করে একই কাজ অ্যাক্সেস করতে পারে না। স্বতন্ত্র বিজ্ঞানের গবেষণাপত্র প্রকাশের জন্য মোট ফি প্রায়শই পাঁচ অঙ্কের ($USD) হয়, যা প্রকাশকদের একটি ছোট গোষ্ঠীর জন্য বিপুল মুনাফা তৈরি করার সময় বৈজ্ঞানিক জ্ঞানকে একটি [পাবলিক পণ্য](/glossary/#public-goods) হিসাবে সম্পূর্ণ ধারণাকে খর্ব করে। -বিনামূল্যে এবং ওপেন-অ্যাক্সেস প্ল্যাটফর্মগুলি প্রি-প্রিন্ট সার্ভারের আকারে বিদ্যমান, [যেমন ArXiv](https://arxiv.org/)। যাইহোক, এই প্ল্যাটফর্মগুলিতে মান নিয়ন্ত্রণের অভাব রয়েছে, [অ্যান্টি-সাইবিল মেকানিজম](https://csrc.nist.gov/glossary/term/sybil_attack) এবং সাধারণত আর্টিকেল-লেভেল মেট্রিক্স ট্র্যাক করে না, মানে তারা সাধারণত শুধুমাত্র একটি গতানুগতিক প্রকাশকের কাছে জমা দেওয়ার আগে কাজ প্রচার করতে ব্যবহৃত হয়। SciHub প্রকাশিত গবেষণাপত্রগুলিকে বিনামূল্যে অ্যাক্সেসের জন্য তৈরি করে, তবে আইনগতভাবে নয় এবং প্রকাশকরা ইতিমধ্যে তাদের অর্থ গ্রহণ করে এবং কঠোর কপিরাইট আইনে কাজটি মোড়ানোর পরেই। এটি একটি এমবেডেড বৈধতা প্রক্রিয়া এবং প্রণোদনা মডেল সহ অ্যাক্সেসযোগ্য বিজ্ঞান গবেষণাপত্র এবং ডেটার জন্য একটি গুরুত্বপূর্ণ ফাঁক ছেড়ে দেয়। এই ধরনের একটি সিস্টেম তৈরির টুলস Web3-তে বিদ্যমান। +প্রি-প্রিন্ট সার্ভার হিসাবে বিনামূল্যে এবং ওপেন-অ্যাক্সেস প্ল্যাটফর্ম বিদ্যমান, [যেমন ArXiv](https://arxiv.org/)। তবে, এই প্ল্যাটফর্মগুলোতে গুণমান নিয়ন্ত্রণ, [অ্যান্টি-সিবিল মেকানিজম](/glossary/#anti-sybil)-এর অভাব রয়েছে এবং সাধারণত আর্টিকেল-স্তরের মেট্রিক ট্র্যাক করে না, যার মানে হলো এগুলো সাধারণত শুধুমাত্র কোনো প্রথাগত প্রকাশকের কাছে জমা দেওয়ার আগে কাজ প্রচার করার জন্য ব্যবহৃত হয়। SciHub প্রকাশিত গবেষণাপত্রগুলিকে বিনামূল্যে অ্যাক্সেসের জন্য তৈরি করে, তবে আইনগতভাবে নয় এবং প্রকাশকরা ইতিমধ্যে তাদের অর্থ গ্রহণ করে এবং কঠোর কপিরাইট আইনে কাজটি মোড়ানোর পরেই। এটি একটি এমবেডেড বৈধতা প্রক্রিয়া এবং প্রণোদনা মডেল সহ অ্যাক্সেসযোগ্য বিজ্ঞান গবেষণাপত্র এবং ডেটার জন্য একটি গুরুত্বপূর্ণ ফাঁক ছেড়ে দেয়। এই ধরনের একটি সিস্টেম তৈরির টুলস Web3-তে বিদ্যমান। -### পুনঃউৎপাদনযোগ্যতা এবং প্রতিলিপিযোগ্যতা {#reproducibility-and-replicability} +### পুনরুৎপাদনযোগ্যতা এবং অনুলিপিকরণ {#reproducibility-and-replicability} পুনঃউৎপাদনযোগ্যতা এবং প্রতিলিপিযোগ্যতা মানসম্পন্ন বৈজ্ঞানিক আবিষ্কারের ভিত্তি। - একই পদ্ধতি ব্যবহার করে একই দল দ্বারা এক সারিতে একাধিকবার পুনোৎপাদনযোগ্য ফলাফল অর্জন করা যেতে পারে। - একই পরীক্ষামূলক সেটআপ ব্যবহার করে একটি ভিন্ন গ্রুপ দ্বারা প্রতিলিপিযোগ্য ফলাফল অর্জন করা যেতে পারে। -নতুন Web3-নেটিভ টুলস নিশ্চিত করতে পারে যে পুনঃউৎপাদনযোগ্যতা এবং প্রতিলিপিযোগ্যতা আবিষ্কারের ভিত্তি। আমরা একাডেমিয়ার প্রযুক্তিগত ফ্যাব্রিকে মানসম্পন্ন বিজ্ঞান বুনতে পারি। Web3 প্রতিটি বিশ্লেষণ উপাদানের জন্য প্রত্যয়ন তৈরি করার ক্ষমতা প্রদান করে: অপরিশোধিত ডেটা, কম্পিউটেশনাল ইঞ্জিন এবং অ্যাপ্লিকেশন ফলাফল। কনসেনসাস সিস্টেমের সৌন্দর্য হল যে যখন এই উপাদানগুলি বজায় রাখার জন্য একটি বিশ্বস্ত নেটওয়ার্ক তৈরি করা হয়, তখন প্রতিটি নেটওয়ার্ক অংশগ্রহণকারী গণনা পুনরুত্পাদন এবং প্রতিটি ফলাফল যাচাই করার জন্য দায়ী হতে পারে। +নতুন Web3-নেটিভ টুলস নিশ্চিত করতে পারে যে পুনঃউৎপাদনযোগ্যতা এবং প্রতিলিপিযোগ্যতা আবিষ্কারের ভিত্তি। আমরা একাডেমিয়ার প্রযুক্তিগত ফ্যাব্রিকে মানসম্পন্ন বিজ্ঞান বুনতে পারি। Web3 প্রতিটি বিশ্লেষণ উপাদানের জন্য [অ্যাটেস্টেশন](/glossary/#attestation) তৈরি করার ক্ষমতা প্রদান করে: কাঁচা ডেটা, কম্পিউটেশনাল ইঞ্জিন এবং অ্যাপ্লিকেশন ফলাফল। কনসেনসাস সিস্টেমের সৌন্দর্য হল যে যখন এই উপাদানগুলি বজায় রাখার জন্য একটি বিশ্বস্ত নেটওয়ার্ক তৈরি করা হয়, তখন প্রতিটি নেটওয়ার্ক অংশগ্রহণকারী গণনা পুনরুত্পাদন এবং প্রতিটি ফলাফল যাচাই করার জন্য দায়ী হতে পারে। ### অর্থায়ন {#funding} -অর্থায়ন বিজ্ঞানের বর্তমান আদর্শ মডেল হল যে ব্যক্তি বা বিজ্ঞানীদের দল একটি অর্থায়ন সংস্থার কাছে লিখিত আবেদন করে। বিশ্বস্ত ব্যক্তিদের একটি ছোট প্যানেল আবেদনগুলি স্কোর করে এবং তারপর আবেদনকারীদের একটি ছোট অংশকে ফান্ড দেওয়ার আগে প্রার্থীদের সাক্ষাৎকার নেয়। অনুদানের জন্য আবেদন করা এবং প্রাপ্তির মধ্যে বাধা সৃষ্টি করা ছাড়াও যা কখনও কখনও বছরের পর বছর অপেক্ষা করে, স্বার্থ এবং রাজনীতির জন্য অত্যন্ত ঝুঁকিপূর্ণ বলে পরিচিত। +অর্থায়ন বিজ্ঞানের বর্তমান আদর্শ মডেল হল যে ব্যক্তি বা বিজ্ঞানীদের দল একটি অর্থায়ন সংস্থার কাছে লিখিত আবেদন করে। বিশ্বস্ত ব্যক্তিদের একটি ছোট প্যানেল আবেদনগুলি স্কোর করে এবং তারপর আবেদনকারীদের একটি ছোট অংশকে ফান্ড দেওয়ার আগে প্রার্থীদের সাক্ষাৎকার নেয়। অনুদান আবেদন এবং প্রাপ্তির মধ্যে বাধা তৈরি করার ফলে মাঝে মাঝে **বছরের পর বছর অপেক্ষা** করতে হয়, এর বাইরেও এই মডেলটি রিভিউ প্যানেলের **পক্ষপাত, স্বার্থপরতা এবং রাজনীতির প্রতি অত্যন্ত দুর্বল** বলে পরিচিত। গবেষণায় দেখা গেছে যে অনুদান পর্যালোচনা প্যানেলগুলি উচ্চ-মানের প্রস্তাবগুলি নির্বাচনে একটি ত্রুটিপূর্ণ কাজ করে কারণ বিভিন্ন প্যানেলে দেওয়া একই প্রস্তাবগুলির সম্পূর্ণ ভিন্ন ফলাফল রয়েছে। যেহেতু তহবিল আরও দুষ্প্রাপ্য হয়ে উঠেছে, এটি আরও বুদ্ধিবৃত্তিকভাবে রক্ষণশীল প্রকল্পের সাথে আরও সিনিয়র গবেষকদের একটি ছোট পুলে কেন্দ্রীভূত হয়েছে। প্রভাবটি একটি অতি-প্রতিযোগীতামূলক অর্থায়নের ল্যান্ডস্কেপ তৈরি করেছে, বিকৃত প্রণোদনা এবং উদ্ভাবনকে দমিয়ে দিয়েছে। -DAO এবং Web3 ব্যাপকভাবে তৈরি করা বিভিন্ন প্রণোদনা মডেল নিয়ে পরীক্ষা-নিরীক্ষা করে Web3-এর এই ভাঙা অর্থায়ন মডেলটিকে ব্যাহত করার সম্ভাবনা রয়েছে। [পূর্ববর্তী পাবলিক পণ্য অর্থায়ন](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), [কোয়াড্রেটিক অর্থায়ন](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), [DAO পরিচালনা](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) a> এবং [টোকেনাইজড ইনসেনটিভ স্ট্রাকচার](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) হল কিছু Web3 টুলস যা বিজ্ঞানের অর্থায়নে বিপ্লব ঘটাতে পারে। +DAO এবং Web3 ব্যাপকভাবে তৈরি করা বিভিন্ন প্রণোদনা মডেল নিয়ে পরীক্ষা-নিরীক্ষা করে Web3-এর এই ভাঙা অর্থায়ন মডেলটিকে ব্যাহত করার সম্ভাবনা রয়েছে। [রেট্রোঅ্যাকটিভ পাবলিক পণ্য অর্থায়ন](https://medium.com/ethereum-optimism/retroactive-public-goods-funding-33c9b7d00f0c), [কোয়াড্রেটিক অর্থায়ন](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2003531), [DAO গভর্নেন্স](https://www.antler.co/blog/daos-and-web3-governance-the-promise-implications-and-challenges-ahead) এবং [টোকেনাইজড প্রণোদনা কাঠামো](https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design) হল Web3-এর কিছু টুল যা বিজ্ঞান অর্থায়নে বিপ্লব ঘটাতে পারে। -### IP মালিকানা এবং উন্নয়ন {#ip-ownership} +### IP মালিকানা এবং উন্নয়ন {#ip-ownership} -বুদ্ধিবৃত্তিক সম্পত্তি (IP) গতানুগতিক বিজ্ঞানের একটি বড় সমস্যা: বিশ্ববিদ্যালয়গুলিতে আটকে থাকা থেকে বা বায়োটেকগুলিতে অব্যবহৃত হওয়া, মূল্যায়ন হতে খুবই কঠিন। যাইহোক, ডিজিটাল সম্পদের মালিকানা (যেমন বৈজ্ঞানিক ডেটা বা নিবন্ধ) হল যা কিছু Web3 অসাধারণভাবে [নন-ফাঞ্জিবল টোকেন (NFT)](/nft/) ব্যবহার করে। +বুদ্ধিবৃত্তিক সম্পত্তি (IP) গতানুগতিক বিজ্ঞানের একটি বড় সমস্যা: বিশ্ববিদ্যালয়গুলিতে আটকে থাকা থেকে বা বায়োটেকগুলিতে অব্যবহৃত হওয়া, মূল্যায়ন হতে খুবই কঠিন। তবে, ডিজিটাল সম্পদের মালিকানা (যেমন বৈজ্ঞানিক ডেটা বা নিবন্ধ) এমন একটি বিষয় যা Web3 [নন-ফাঞ্জিবল টোকেন (NFTs)](/glossary/#nft) ব্যবহার করে ব্যতিক্রমীভাবে ভালো করে। যেভাবে NFT ভবিষ্যতের লেনদেনের জন্য মূল নির্মাতার কাছে মুনাফা পাঠাতে পারে, আপনি গবেষক, গভর্নিং বডিস (যেমন DAO) বা এমনকি যাদের ডেটা সংগ্রহ করা হয়েছে তাদের পুরস্কৃত করার জন্য আপনি স্বচ্ছ মান অ্যাট্রিবিউশন চেইন স্থাপন করতে পারেন। -[IP-NFT](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) গৃহীত গবেষণা পরীক্ষাগুলির একটি বিকেন্দ্রীকৃত ডেটা ভান্ডারের চাবিকাঠি হিসাবেও কাজ করতে পারে এবং NFT এবং [DeFi](/defi/) আর্থিককরণ (ভগ্নাংশ থেকে ঋণ পুল এবং মূল্য মূল্যায়ন পর্যন্ত) প্লাগ করতে পারে। এছাড়াও এটি নেটিভভাবে অন-চেইন সত্তা যেমন DAO এর মতো [VitaDAO](https://www.vitadao.com/) কে সরাসরি অন-চেইনে গবেষণা পরিচালনা করার অনুমতি দেয়। অ-হস্তান্তরযোগ্য ["সোলবাউন্ড" টোকেন](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)এর আবির্ভাব DeSci তে গুরুত্বপূর্ণ ভূমিকা পালন করতে পারে ব্যক্তিদের তাদের ইথেরিয়াম ঠিকানার সাথে যুক্ত তাদের অভিজ্ঞতা এবং প্রমাণপত্রাদি প্রমাণ করার অনুমতি দিয়ে। +[IP-NFTs](https://medium.com/molecule-blog/ip-nfts-for-researchers-a-new-biomedical-funding-paradigm-91312d8d92e6) পরিচালিত গবেষণা পরীক্ষার একটি বিকেন্দ্রীভূত ডেটা ভান্ডারের চাবি হিসাবেও কাজ করতে পারে, এবং NFT ও [DeFi](/glossary/#defi) আর্থিকীকরণের (ফ্র্যাকশনালাইজেশন থেকে শুরু করে লেন্ডিং পুল এবং ভ্যালু অ্যাপ্রেইজাল পর্যন্ত) সাথে যুক্ত হতে পারে। এটি [VitaDAO](https://www.vitadao.com/)-এর মতো DAO-এর মতো স্থানীয়ভাবে অনচেইন সত্তাগুলোকে সরাসরি অনচেইনে গবেষণা পরিচালনা করার অনুমতি দেয়। +অ-হস্তান্তরযোগ্য ["সোলবাউন্ড" টোকেন](https://vitalik.eth.limo/general/2022/01/26/soulbound.html)-এর আবির্ভাবও DeSci-এ একটি গুরুত্বপূর্ণ ভূমিকা পালন করতে পারে, যা ব্যক্তিদের তাদের Ethereum ঠিকানার সাথে যুক্ত তাদের অভিজ্ঞতা এবং প্রমাণপত্র প্রমাণ করার অনুমতি দেয়। ### ডেটা স্টোরেজ, অ্যাক্সেস এবং আর্কিটেকচার {#data-storage} Web3 প্যাটার্ন ব্যবহার করে বৈজ্ঞানিক ডেটা আরও বেশি অ্যাক্সেসযোগ্য করা যেতে পারে এবং বিতরণ করা স্টোরেজ বিপর্যয়মূলক ঘটনা থেকে বাঁচতে গবেষণাকে সক্ষম করে। -শুরুর জায়গা অবশ্যই একটি সিস্টেম হতে হবে যা সঠিক যাচাইযোগ্য শংসাপত্র ধারণ করে কোনো বিকেন্দ্রীভূত পরিচয় দ্বারা অ্যাক্সেসযোগ্য। এটি সংবেদনশীল ডেটা বিশ্বস্ত পক্ষগুলির দ্বারা সুরক্ষিতভাবে প্রতিলিপি করার অনুমতি দেয়, অপ্রয়োজনীয়তা এবং সেন্সরশিপ প্রতিরোধ, ফলাফলের পুনঃউৎপাদন এবং এমনকি একাধিক পক্ষের সহযোগিতা এবং ডেটাসেটে নতুন ডেটা যোগ করার ক্ষমতা সক্ষম করে। [কম্পিউট-টু-ডেটা](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol) এর মতো গোপনীয় কম্পিউটিং পদ্ধতিগুলি অপরিশোধিত ডেটা প্রতিলিপিতে বিকল্প অ্যাক্সেস ব্যবস্থা প্রদান করে, সবচেয়ে সংবেদনশীল ডেটার জন্য বিশ্বস্ত গবেষণা পরিবেশ তৈরি করে। বিশ্বস্ত গবেষণা পরিবেশগুলিকে [NHS দ্বারা উদ্ধৃত করা হয়েছে](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb) একটি ইকোসিস্টেম তৈরি করে ডেটা গোপনীয়তা এবং সহযোগিতার একটি ভবিষ্যত-মুখী সমাধান যেখানে গবেষকরা কোড এবং অনুশীলনগুলি ভাগ করার জন্য প্রমিত পরিবেশ ব্যবহার করে সাইটে ডেটা নিয়ে নিরাপদে কাজ করতে পারেন। +শুরুর জায়গা অবশ্যই একটি সিস্টেম হতে হবে যা সঠিক যাচাইযোগ্য শংসাপত্র ধারণ করে কোনো বিকেন্দ্রীভূত পরিচয় দ্বারা অ্যাক্সেসযোগ্য। এটি সংবেদনশীল ডেটা বিশ্বস্ত পক্ষগুলির দ্বারা সুরক্ষিতভাবে প্রতিলিপি করার অনুমতি দেয়, অপ্রয়োজনীয়তা এবং সেন্সরশিপ প্রতিরোধ, ফলাফলের পুনঃউৎপাদন এবং এমনকি একাধিক পক্ষের সহযোগিতা এবং ডেটাসেটে নতুন ডেটা যোগ করার ক্ষমতা সক্ষম করে। [কম্পিউট-টু-ডেটা](https://7wdata.be/predictive-analytics/compute-to-data-using-blockchain-to-decentralize-data-science-and-ai-with-the-ocean-protocol)-এর মতো গোপনীয় কম্পিউটিং পদ্ধতিগুলো কাঁচা ডেটা প্রতিলিপির জন্য বিকল্প অ্যাক্সেস পদ্ধতি সরবরাহ করে, যা সবচেয়ে সংবেদনশীল ডেটার জন্য বিশ্বস্ত গবেষণা পরিবেশ তৈরি করে। বিশ্বস্ত গবেষণা পরিবেশগুলিকে ডেটা গোপনীয়তা এবং সহযোগিতার জন্য একটি ভবিষ্যৎ-মুখী সমাধান হিসাবে [NHS দ্বারা উদ্ধৃত করা হয়েছে](https://medium.com/weavechain/whats-in-store-for-the-future-of-healthcare-data-b6398745fbbb), যা একটি ইকোসিস্টেম তৈরি করে যেখানে গবেষকরা কোড এবং অনুশীলন ভাগ করার জন্য প্রমিত পরিবেশ ব্যবহার করে সাইটে ডেটা নিয়ে নিরাপদে কাজ করতে পারেন। ফ্লেক্সিবল Web3 ডেটা সলিউশন উপরের পরিস্থিতিগুলিকে সমর্থন করে এবং সত্যিকারের ওপেন সায়েন্সের ভিত্তি প্রদান করে, যেখানে গবেষকরা অ্যাক্সেসের অনুমতি বা ফি ছাড়াই পাবলিক পণ্য তৈরি করতে পারেন। Web3 পাবলিক ডেটা সলিউশন যেমন IPFS, Arweave এবং Filecoin বিকেন্দ্রীকরণের জন্য অপ্টিমাইজ করা হয়েছে। dClimate, উদাহরণস্বরূপ, আবহাওয়া স্টেশন এবং ভবিষ্যদ্বাণীমূলক জলবায়ু মডেল সহ জলবায়ু ও আবহাওয়া ডেটাতে সর্বজনীন অ্যাক্সেস প্রদান করে। -## যুক্ত হোন {#get-involved} +## জড়িত হন {#get-involved} প্রকল্পগুলি ঘুরে দেখুন করুন এবং DeSci কমিউনিটিতে যোগ দিন। -- [DeSci.Global: গ্লোবাল ইভেন্ট এবং মিটআপ ক্যালেন্ডার](https://desci.global) -- [বিজ্ঞান টেলিগ্রামের জন্য ব্লকচেইন](https://t.me/BlockchainForScience) -- [মলিকিউল: আপনার গবেষণা প্রকল্পগুলোর জন্য অর্থ প্রদান করুন এবং অর্থ পান](https://discover.molecule.to/) -- [VitaDAO: দীর্ঘায়ু গবেষণার জন্য স্পনসরড গবেষণা চুক্তির মাধ্যমে অর্থায়ন পান](https://www.vitadao.com/) +- [DeSci.Global: বিশ্বব্যাপী ইভেন্ট এবং মিটআপ ক্যালেন্ডার](https://desci.global) +- [বিজ্ঞানের জন্য ব্লকচেইন টেলিগ্রাম](https://t.me/BlockchainForScience) +- [Molecule: আপনার গবেষণা প্রকল্পগুলোর জন্য অর্থায়ন করুন এবং অর্থায়ন পান](https://www.molecule.xyz/) +- [VitaDAO: দীর্ঘায়ু গবেষণার জন্য স্পনসর করা গবেষণা চুক্তির মাধ্যমে অর্থায়ন গ্রহণ করুন](https://www.vitadao.com/) - [ResearchHub: একটি বৈজ্ঞানিক ফলাফল পোস্ট করুন এবং সহকর্মীদের সাথে কথোপকথনে নিযুক্ত হন](https://www.researchhub.com/) -- [dClimate API: একটি বিকেন্দ্রীভূত সম্প্রদায়ের দ্বারা সংগৃহীত জলবায়ু সংক্রান্ত তথ্য অনুসন্ধান করে](https://www.dclimate.net/) -- [DeSci ফাউন্ডেশন: DeSci প্রকাশনা টুল নির্মাতা](https://descifoundation.org/) -- [DeSci.World: ব্যবহারকারীদের দেখার জন্য, বিকেন্দ্রীভূত বিজ্ঞানের সাথে জড়িত থাকার ওয়ান-স্টপ শপ](https://desci.world) -- [ফ্লেমিং প্রোটোকল: ওপেন-সোর্স ডেটা ইকোনমি যা সহযোগিতামূলক বায়োমেডিকাল আবিষ্কারকে জ্বালানী দেয়](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) -- [OceanDAO: DAO পরিচালিত ডাটা-সম্পর্কিত বিজ্ঞানের জন্য অর্থায়ন](https://oceanprotocol.com/dao) -- [অপসায়েন্টিয়া: উন্মুক্ত বিকেন্দ্রীভূত বিজ্ঞান কর্মপ্রবাহ](https://opsci.io/research/) -- [Bio.xyz: আপনার বায়োটেক DAO বা desci প্রকল্পের জন্য অর্থায়ন পান](https://www.molecule.to/) -- [ResearchHub: একটি বৈজ্ঞানিক ফলাফল পোস্ট করুন এবং সহকর্মীদের সাথে কথোপকথনে নিযুক্ত হন](https://www.researchhub.com/) -- [VitaDAO: দীর্ঘায়ু গবেষণার জন্য স্পনসরড গবেষণা চুক্তির মাধ্যমে অর্থায়ন পান](https://www.vitadao.com/) -- [ফ্লেমিং প্রোটোকল: ওপেন-সোর্স ডেটা ইকোনমি যা সহযোগিতামূলক বায়োমেডিকাল আবিষ্কারকে জ্বালানী দেয়](https://medium.com/@FlemingProtocol/a-data-economy-for-patient-driven-biomedical-innovation-9d56bf63d3dd) -- [সক্রিয় ইনফারেন্স ল্যাব](https://www.activeinference.org/) -- [CureDAO: কমিউনিটি-মালিকানাধীন যথার্থ স্বাস্থ্য প্ল্যাটফর্ম](https://docs.curedao.org/) -- [IdeaMarkets: বিকেন্দ্রীকৃত বৈজ্ঞানিক বিশ্বাসযোগ্যতা সক্ষমকরছে](https://ideamarket.io/) -- [DeSci ল্যাবস](https://www.desci.com/) - -আমরা তালিকাভুক্ত নতুন প্রকল্পগুলির জন্য পরামর্শগুলিকে স্বাগত জানাই - শুরু করতে অনুগ্রহ করে আমাদের [তালিকা নীতি](/contributing/adding-desci-projects/) দেখুন! - -## Further reading {#further-reading} - -- [জোসেলিন পার্ল এবং আল্ট্রারেয়ার দ্বারা DeSci উইকি](https://docs.google.com/document/d/1aQC6zn-eXflSmpts0XGE7CawbUEHwnL6o-OFXO52PTc/edit#) -- [একটি a16z ভবিষ্যতের জন্য Jocelynn Pearl এর বিকেন্দ্রীভূত বায়োটেকের একটি নির্দেশিকা](https://future.a16z.com/a-guide-to-decentralized-biotech/) -- [DeSci এর জন্য ক্ষেত্র](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) -- [DeSci-এর নির্দেশিকা](https://future.com/what-is-decentralized-science-aka-desci/) -- [বিকেন্দ্রীকৃত বিজ্ঞান রিসোর্সসমূহ](https://www.vincentweisser.com/desci) -- [মলিকিউলের বায়োফার্মা IP-NFT - একটি প্রযুক্তিগত বর্ণনা](https://molecule.to/blog/molecules-biopharma-ip-nfts-a-technical-description) -- [জন স্টারের তৈরি করা বিজ্ঞানের বিশ্বাসহীন সিস্টেম](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) -- [বায়োটেক DAO-এর উত্থান](https://molecule.to/blog/the-emergence-of-biotech-daos) -- [Paul Kohlhaas - DeSci: বিকেন্দ্রীভূত বিজ্ঞানের ভবিষ্যত (পডকাস্ট)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) +- [dClimate API: একটি বিকেন্দ্রীভূত সম্প্রদায় দ্বারা সংগৃহীত জলবায়ু ডেটা জিজ্ঞাসা করুন](https://www.dclimate.net/) +- [DeSci Foundation: DeSci প্রকাশনা টুল নির্মাতা](https://descifoundation.org/) +- [DeSci.World: ব্যবহারকারীদের বিকেন্দ্রীভূত বিজ্ঞান দেখতে এবং তার সাথে যুক্ত হওয়ার জন্য ওয়ান-স্টপ শপ](https://desci.world) +- [OceanDAO: ডেটা-সম্পর্কিত বিজ্ঞানের জন্য DAO দ্বারা পরিচালিত অর্থায়ন](https://oceanprotocol.com/) +- [Opscientia: উন্মুক্ত বিকেন্দ্রীভূত বিজ্ঞান কর্মপ্রবাহ](https://opsci.io/research/) +- [Bio.xyz: আপনার বায়োটেক DAO বা desci প্রকল্পের জন্য অর্থায়ন পান](https://www.bio.xyz/) +- [Fleming Protocol: ওপেন-সোর্স ডেটা অর্থনীতি যা সহযোগিতামূলক বায়োমেডিকাল আবিষ্কারকে চালিত করে](http://flemingprotocol.io/) +- [Active Inference Institute](https://www.activeinference.org/) +- [IdeaMarkets: বিকেন্দ্রীভূত বৈজ্ঞানিক বিশ্বাসযোগ্যতা সক্ষম করা](https://ideamarket.io/) +- [DeSci Labs](https://www.desci.com/) +- [ValleyDAO: একটি উন্মুক্ত, বিশ্বব্যাপী সম্প্রদায় যা সিন্থেটিক বায়োলজি গবেষণার জন্য অর্থায়ন এবং ট্রান্সলেশনাল সহায়তা প্রদান করে](https://www.valleydao.bio) +- [Cerebrum DAO: মস্তিষ্কের স্বাস্থ্যের উন্নতি এবং নিউরোডিজেনারেশন প্রতিরোধের জন্য সমাধান খোঁজা এবং পরিচর্যা করা](https://www.cerebrumdao.com/) +- [CryoDAO: ক্রায়োপ্রিজারভেশন ক্ষেত্রে মুনশট গবেষণার জন্য অর্থায়ন](https://www.cryodao.org) +- [Elata: মনোরোগ সংক্রান্ত ওষুধের ভবিষ্যতে আপনার মতামত দিন](https://www.elata.bio/) + +আমরা তালিকাভুক্ত করার জন্য নতুন প্রকল্পের পরামর্শকে স্বাগত জানাই - শুরু করতে অনুগ্রহ করে আমাদের [তালিকা নীতি](/contributing/adding-desci-projects/) দেখুন! + +## আরও পড়ুন {#further-reading} + +- [DeSci Wiki by Jocelynn Pearl and Ultrarare](https://docs.google.com/document/d/1aQC6zn-eXflSmpts0XGE7CawbUEHwnL6o-OFXO52PTc/edit#) +- [a16z future-এর জন্য Jocelynn Pearl দ্বারা বিকেন্দ্রীভূত বায়োটেকের একটি গাইড](https://future.a16z.com/a-guide-to-decentralized-biotech/) +- [DeSci-এর জন্য কেস](https://gitcoin.co/blog/desci-the-case-for-decentralised-science/) +- [DeSci-এর জন্য নির্দেশিকা](https://future.com/what-is-decentralized-science-aka-desci/) +- [বিকেন্দ্রীভূত বিজ্ঞান রিসোর্স](https://www.vincentweisser.com/desci) +- [Molecule’s Biopharma IP-NFTs - একটি প্রযুক্তিগত বর্ণনা](https://www.molecule.xyz/blog/molecules-biopharma-ip-nfts-a-technical-description) +- [Jon Starr দ্বারা বিজ্ঞানের ট্রাস্টলেস সিস্টেম তৈরি করা](https://medium.com/@jringo/building-systems-of-trustless-science-1cd2d072f673) +- [Paul Kohlhaas - DeSci: বিকেন্দ্রীভূত বিজ্ঞানের ভবিষ্যৎ (পডকাস্ট)](https://anchor.fm/andrew-steinwold/episodes/Paul-Kohlhaas---DeSci-The-Future-of-Decentralized-Science---Zima-Red-ep-117-e1h683a) - [বিকেন্দ্রীভূত বিজ্ঞানের জন্য একটি সক্রিয় অনুমান অন্টোলজি: সিচুয়েটেড সেন্সমেকিং থেকে এপিস্টেমিক কমন্স পর্যন্ত](https://zenodo.org/record/6320575) -- [DeSci: স্যামুয়েল আকিনোশোর দ্য ফিউচার অফ রিসার্চ](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec) +- [DeSci: Samuel Akinosho দ্বারা গবেষণার ভবিষ্যৎ](https://lucidsamuel.medium.com/desci-the-future-of-research-b76cfc88c8ec) - [নাদিয়ার সায়েন্স ফান্ডিং (এপিলগ: DeSci এবং নতুন ক্রিপ্টো প্রিমিটিভস)](https://nadia.xyz/science-funding) -- [বিকেন্দ্রীকরণ ওষুধের বিকাশকে ব্যাহত করছে](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f) +- [বিকেন্দ্রীকরণ ওষুধের উন্নয়নে বাধা সৃষ্টি করছে](https://medium.com/id-theory/decentralisation-is-disrupting-drug-development-28b5ba5d447f) +- [DeSci – বিকেন্দ্রীভূত বিজ্ঞান কি?](https://usadailytimes.com/2022/09/12/what-is-desci-decentralized-science/) -### Videos {#videos} +### ভিডিও {#videos} -- [বিকেন্দ্রীভূত বিজ্ঞান কী?](https://www.youtube.com/watch?v=-DeMklVWNdA) -- [দীর্ঘায়ু গবেষণা এবং ক্রিপ্টো এর সমন্বয় সম্পর্কে Vitalik বুটেরিন এবং বিজ্ঞানীঅব্রে ডি গ্রের মধ্যে কথোপকথন](https://www.youtube.com/watch?v=x9TSJK1widA) -- [বৈজ্ঞানিক প্রকাশনা ভেঙ্গে গেছে। Web3 এটা ঠিক করতে পারে?](https://www.youtube.com/watch?v=WkvzYgCvWj8) -- [জুয়ান বেনেট - DeSci, ইনডিপেনডেন্ট ল্যাবস, & বড় আকারের ডেটা সায়েন্স](https://www.youtube.com/watch?v=zkXM9H90g_E) -- [সেবাস্তিয়ান ব্রুনেমিয়ার - কিভাবে DeSci বায়োমেডিকাল গবেষণাকে রূপান্তর করতে পারে & ভেঞ্চার ক্যাপিটাল](https://www.youtube.com/watch?v=qB4Tc3FcVbM) +- [বিকেন্দ্রীভূত বিজ্ঞান কি?](https://www.youtube.com/watch?v=-DeMklVWNdA) +- [দীর্ঘায়ু গবেষণা এবং ক্রিপ্টোর ছেদ সম্পর্কে Vitalik Buterin এবং বিজ্ঞানী Aubrey de Grey-এর মধ্যে কথোপকথন](https://www.youtube.com/watch?v=x9TSJK1widA) +- বৈজ্ঞানিক প্রকাশনা ভেঙে গেছে। Web3 কি এটি ঠিক করতে পারে?](https://www.youtube.com/watch?v=WkvzYgCvWj8) +- [Juan Benet - DeSci, স্বাধীন ল্যাব এবং বড় আকারের ডেটা সায়েন্স](https://www.youtube.com/watch?v=zkXM9H90g_E) +- [Sebastian Brunemeier - কিভাবে DeSci বায়োমেডিকাল গবেষণা এবং ভেঞ্চার ক্যাপিটালকে রূপান্তরিত করতে পারে](https://www.youtube.com/watch?v=qB4Tc3FcVbM) +- [Paige Donner - Web3 এবং ব্লকচেইন দিয়ে ওপেন সায়েন্স টুলিং](https://www.youtube.com/watch?v=nC-2QWQ-lgw&t=17s) diff --git a/public/content/translations/bn/developers/docs/accounts/index.md b/public/content/translations/bn/developers/docs/accounts/index.md new file mode 100644 index 00000000000..486cf9f5ad6 --- /dev/null +++ b/public/content/translations/bn/developers/docs/accounts/index.md @@ -0,0 +1,137 @@ +--- +title: "ইথেরিয়াম অ্যাকাউন্ট" +description: "ইথেরিয়াম অ্যাকাউন্টের একটি ব্যাখ্যা – তাদের ডেটা স্ট্রাকচার এবং কী পেয়ার ক্রিপ্টোগ্রাফির সাথে তাদের সম্পর্ক।" +lang: bn +--- + +একটি ইথেরিয়াম অ্যাকাউন্ট হল ইথার (ETH) ব্যালেন্স সহ একটি সত্তা যা ইথেরিয়াম-এ বার্তা পাঠাতে পারে। অ্যাকাউন্ট ব্যবহারকারী-নিয়ন্ত্রিত হতে পারে বা স্মার্ট কন্ট্র্যাক্ট হিসাবে স্থাপন করা যেতে পারে। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আপনাকে আরও ভালভাবে বুঝতে সাহায্য করার জন্য, আমরা আপনাকে প্রথমে আমাদের [ইথেরিয়ামের পরিচিতি](/developers/docs/intro-to-ethereum/) পড়ার পরামর্শ দিই। + +## অ্যাকাউন্টের প্রকারভেদ {#types-of-account} + +ইথেরিয়ামের দুটি অ্যাকাউন্টের প্রকারভেদ আছে: + +- এক্সটারনালি-ওনড অ্যাকাউন্ট (EOA) – ব্যক্তিগত কী আছে এমন যে কেউ দ্বারা নিয়ন্ত্রিত +- কন্ট্র্যাক্ট অ্যাকাউন্ট – নেটওয়ার্কে স্থাপন করা একটি স্মার্ট কন্ট্র্যাক্ট, যা কোড দ্বারা নিয়ন্ত্রিত। [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) সম্পর্কে জানুন + +উভয় প্রকারের অ্যাকাউন্টের ক্ষমতা আছে: + +- ETH এবং টোকেন গ্রহণ, ধরে রাখা এবং পাঠানো +- স্থাপিত স্মার্ট কন্ট্র্যাক্টগুলোর সাথে ইন্টারঅ্যাক্ট করা + +### মূল পার্থক্য {#key-differences} + +**এক্সটারনালি-ওনড** + +- একটি অ্যাকাউন্ট তৈরি করতে কোন খরচ হয় না +- লেনদেন শুরু করতে পারে +- এক্সটারনালি-ওনড অ্যাকাউন্টগুলোর মধ্যে লেনদেন শুধুমাত্র ETH/টোকেন স্থানান্তর হতে পারে +- ক্রিপ্টোগ্রাফিক কী-এর একটি জোড়া দিয়ে গঠিত: পাবলিক এবং প্রাইভেট কী যা অ্যাকাউন্টের কার্যকলাপ নিয়ন্ত্রণ করে + +**কন্ট্র্যাক্ট** + +- একটি কন্ট্র্যাক্ট তৈরি করতে খরচ হয় কারণ আপনি নেটওয়ার্ক স্টোরেজ ব্যবহার করেন +- শুধুমাত্র একটি লেনদেন প্রাপ্তির প্রতিক্রিয়ায় বার্তা পাঠাতে পারে +- একটি এক্সটারনাল অ্যাকাউন্ট থেকে একটি কন্ট্র্যাক্ট অ্যাকাউন্টে লেনদেন কোড ট্রিগার করতে পারে যা টোকেন স্থানান্তর করা বা এমনকি একটি নতুন কন্ট্র্যাক্ট তৈরি করার মতো বিভিন্ন ক্রিয়া সম্পাদন করতে পারে +- কন্ট্র্যাক্ট অ্যাকাউন্টের কোনো প্রাইভেট কী নেই। পরিবর্তে, তারা স্মার্ট কন্ট্র্যাক্ট কোডের লজিক দ্বারা নিয়ন্ত্রিত হয় + +## একটি অ্যাকাউন্ট পরীক্ষা করা হয়েছে {#an-account-examined} + +ইথেরিয়াম অ্যাকাউন্টের চারটি ক্ষেত্র রয়েছে: + +- `nonce` – একটি কাউন্টার যা একটি এক্সটারনালি-ওনড অ্যাকাউন্ট থেকে পাঠানো লেনদেনের সংখ্যা বা একটি কন্ট্র্যাক্ট অ্যাকাউন্ট দ্বারা তৈরি কন্ট্র্যাক্টের সংখ্যা নির্দেশ করে। প্রতিটি অ্যাকাউন্টের জন্য একটি নির্দিষ্ট ননসের সাথে শুধুমাত্র একটি লেনদেন কার্যকর করা যেতে পারে, যা রিপ্লে অ্যাটাকের বিরুদ্ধে সুরক্ষা প্রদান করে যেখানে স্বাক্ষরিত লেনদেন বারবার সম্প্রচার এবং পুনরায় কার্যকর করা হয়। +- `balance` – এই ঠিকানাটির মালিকানাধীন wei-এর সংখ্যা। Wei হলো ETH-এর একটি একক এবং প্রতি ETH-এ 1e+18 wei থাকে। +- `codeHash` – এই হ্যাসটি ইথেরিয়াম ভার্চুয়াল মেশিন (EVM)-এর একটি অ্যাকাউন্টের _কোড_ বোঝায়। কন্ট্র্যাক্ট অ্যাকাউন্টে কোড ফ্র্যাগমেন্ট প্রোগ্রাম করা থাকে যা বিভিন্ন অপারেশন করতে পারে। অ্যাকাউন্টটি একটি মেসেজ কল পেলে এই EVM কোডটি কার্যকর হয়। অন্যান্য অ্যাকাউন্ট ফিল্ডের মতো এটি পরিবর্তন করা যায় না। এই ধরনের সমস্ত কোড ফ্র্যাগমেন্ট পরবর্তী পুনরুদ্ধারের জন্য তাদের সংশ্লিষ্ট হ্যাসের অধীনে স্টেট ডাটাবেসে থাকে। এই হ্যাস ভ্যালুটি codeHash হিসাবে পরিচিত। এক্সটারনালি ওনড অ্যাকাউন্টগুলির জন্য, codeHash ফিল্ডটি একটি খালি স্ট্রিংয়ের হ্যাস। +- `storageRoot` – কখনও কখনও স্টোরেজ হ্যাস হিসাবে পরিচিত। একটি [Merkle Patricia Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/)-এর রুট নোডের একটি 256-বিট হ্যাস যা অ্যাকাউন্টের স্টোরেজ বিষয়বস্তু (256-বিট ইন্টিজার মানগুলির মধ্যে একটি ম্যাপিং) এনকোড করে, যা 256-বিট ইন্টিজার কী-গুলির Keccak 256-বিট হ্যাস থেকে RLP-এনকোডেড 256-বিট ইন্টিজার মানগুলিতে একটি ম্যাপিং হিসাবে ট্রাইতে এনকোড করা হয়। এই ট্রাইটি এই অ্যাকাউন্টের স্টোরেজ বিষয়বস্তুর হ্যাস এনকোড করে, এবং ডিফল্টরূপে খালি থাকে। + +![একটি অ্যাকাউন্টের গঠন দেখানো একটি ডায়াগ্রাম](./accounts.png) +_[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf) থেকে গৃহীত ডায়াগ্রাম_ + +## এক্সটারনালি-ওনড অ্যাকাউন্ট এবং কী পেয়ার {#externally-owned-accounts-and-key-pairs} + +একটি অ্যাকাউন্ট ক্রিপ্টোগ্রাফিক কী-এর একটি জোড়া দিয়ে গঠিত: পাবলিক এবং প্রাইভেট। এগুলি প্রমাণ করতে সাহায্য করে যে একটি লেনদেন প্রেরক দ্বারা স্বাক্ষরিত হয়েছিল এবং জালিয়াতি প্রতিরোধ করে। আপনার প্রাইভেট কী হল যা আপনি লেনদেন স্বাক্ষর করতে ব্যবহার করেন, তাই এটি আপনাকে আপনার অ্যাকাউন্টের সাথে যুক্ত তহবিলের হেফাজত প্রদান করে। আপনি আসলে কখনও ক্রিপ্টোকারেন্সি ধারণ করেন না, আপনি প্রাইভেট কী ধারণ করেন – তহবিল সর্বদা Ethereum-এর লেজারে থাকে। + +এটি ক্ষতিকারক অভিনেতাদের জাল লেনদেন সম্প্রচার করা থেকে বাধা দেয় কারণ আপনি সর্বদা একটি লেনদেনের প্রেরককে যাচাই করতে পারেন। + +যদি অ্যালিস তার নিজের অ্যাকাউন্ট থেকে ববের অ্যাকাউন্টে ইথার পাঠাতে চায়, অ্যালিসকে একটি লেনদেনের অনুরোধ তৈরি করতে হবে এবং যাচাইকরণের জন্য এটি নেটওয়ার্কে পাঠাতে হবে। ইথেরিয়াম-এর পাবলিক-কী ক্রিপ্টোগ্রাফির ব্যবহার নিশ্চিত করে যে অ্যালিস প্রমাণ করতে পারে যে সে মূলত লেনদেনের অনুরোধটি শুরু করেছিল। ক্রিপ্টোগ্রাফিক প্রক্রিয়া ছাড়া, একজন দূষিত প্রতিপক্ষ ইভ সহজভাবে সর্বজনীনভাবে একটি অনুরোধ সম্প্রচার করতে পারে যা দেখতে অনেকটা এইরকম, “অ্যালিসের অ্যাকাউন্ট থেকে ইভের অ্যাকাউন্টে 5 ETH পাঠান,” এবং কেউ যাচাই করতে পারবে না যে এটি অ্যালিসের কাছ থেকে আসেনি। + +## অ্যাকাউন্ট তৈরি {#account-creation} + +আপনি যখন একটি অ্যাকাউন্ট তৈরি করতে চান, তখন বেশিরভাগ লাইব্রেরি আপনাকে একটি র‍্যান্ডম প্রাইভেট কী তৈরি করে দেবে। + +একটি প্রাইভেট কী 64টি হেক্স অক্ষর দিয়ে তৈরি এবং একটি পাসওয়ার্ড দিয়ে এনক্রিপ্ট করা যেতে পারে। + +উদাহরণ: + +`fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f` + +পাবলিক কী [ইলিপটিক কার্ভ ডিজিটাল সিগনেচার অ্যালগরিদম](https://wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) ব্যবহার করে প্রাইভেট কী থেকে তৈরি করা হয়। আপনি পাবলিক কী-এর Keccak-256 হ্যাসের শেষ 20 বাইট নিয়ে এবং শুরুতে `0x` যোগ করে আপনার অ্যাকাউন্টের জন্য একটি পাবলিক ঠিকানা পাবেন। + +এর মানে হল একটি এক্সটারনালি ওনড অ্যাকাউন্ট (EOA)-এর একটি 42-অক্ষরের ঠিকানা রয়েছে (20-বাইট সেগমেন্ট যা 40টি হেক্সাডেসিমেল অক্ষর এবং `0x` উপসর্গ)। + +উদাহরণ: + +`0x5e97870f263700f46aa00d967821199b9bc5a120` + +নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি নতুন অ্যাকাউন্ট তৈরি করতে [Clef](https://geth.ethereum.org/docs/tools/clef/introduction) নামক একটি সাইনিং টুল ব্যবহার করতে হয়। Clef হল একটি অ্যাকাউন্ট ম্যানেজমেন্ট এবং সাইনিং টুল যা ইথেরিয়াম ক্লায়েন্ট, [Geth](https://geth.ethereum.org)-এর সাথে বান্ডেল করা থাকে। `clef newaccount` কমান্ড একটি নতুন কী পেয়ার তৈরি করে এবং সেগুলিকে একটি এনক্রিপ্টেড কীস্টোরে সংরক্ষণ করে। + +``` +> clef newaccount --keystore + +তৈরি করা নতুন অ্যাকাউন্টের জন্য একটি পাসওয়ার্ড লিখুন: +> + +------------ +INFO [10-28|16:19:09.156] আপনার নতুন কী তৈরি করা হয়েছে address=0x5e97870f263700f46aa00d967821199b9bc5a120 +WARN [10-28|16:19:09.306] অনুগ্রহ করে আপনার কী ফাইলের ব্যাকআপ নিন path=/home/user/go-ethereum/data/keystore/UTC--2022-10-28T15-19-08.000825927Z--5e97870f263700f46aa00d967821199b9bc5a120 +WARN [10-28|16:19:09.306] অনুগ্রহ করে আপনার পাসওয়ার্ড মনে রাখবেন! +অ্যাকাউন্ট তৈরি হয়েছে 0x5e97870f263700f46aa00d967821199b9bc5a120 +``` + +[Geth ডকুমেন্টেশন](https://geth.ethereum.org/docs) + +আপনার প্রাইভেট কী থেকে নতুন পাবলিক কী তৈরি করা সম্ভব, কিন্তু আপনি পাবলিক কী থেকে প্রাইভেট কী তৈরি করতে পারবেন না। আপনার প্রাইভেট কী সুরক্ষিত রাখা এবং, নাম থেকেই বোঝা যায়, **প্রাইভেট** রাখা অত্যাবশ্যক। + +আপনার বার্তা এবং লেনদেন সাইন করার জন্য একটি প্রাইভেট কী প্রয়োজন যা একটি স্বাক্ষর আউটপুট করে। অন্যরা তখন আপনার পাবলিক কী বের করার জন্য স্বাক্ষরটি নিতে পারে, যা বার্তার লেখককে প্রমাণ করে। আপনার অ্যাপ্লিকেশনে, আপনি নেটওয়ার্কে লেনদেন পাঠাতে একটি JavaScript লাইব্রেরি ব্যবহার করতে পারেন। + +## কন্ট্র্যাক্ট অ্যাকাউন্ট {#contract-accounts} + +কন্ট্র্যাক্ট অ্যাকাউন্টেরও একটি 42 অক্ষরের হেক্সাডেসিমেল ঠিকানা রয়েছে: + +উদাহরণ: + +`0x06012c8cf97bead5deae237070f9587f8e7a266d` + +কন্ট্র্যাক্ট ঠিকানা সাধারণত দেওয়া হয় যখন একটি কন্ট্র্যাক্ট ইথেরিয়াম ব্লকচেইনে স্থাপন করা হয়। ঠিকানাটি নির্মাতার ঠিকানা এবং সেই ঠিকানা থেকে পাঠানো লেনদেনের সংখ্যা (“ননস”) থেকে আসে। + +## ভ্যালিডেটর কী {#validators-keys} + +Ethereum-এ আরও এক ধরনের কী আছে, যা Ethereum যখন প্রুফ-অফ-ওয়ার্ক থেকে প্রুফ-অফ-স্টেক ভিত্তিক কনসেন্সাসে পরিবর্তিত হয় তখন চালু করা হয়েছিল। এগুলি হলো 'BLS' কী এবং এগুলি ভ্যালিডেটরদের সনাক্ত করতে ব্যবহৃত হয়। এই কীগুলি দক্ষতার সাথে একত্রিত করা যেতে পারে যাতে নেটওয়ার্ককে কনসেন্সাসে আসতে প্রয়োজনীয় ব্যান্ডউইথ কমানো যায়। এই কী অ্যাগ্রিগেশন ছাড়া একজন ভ্যালিডেটরের জন্য সর্বনিম্ন স্টেক অনেক বেশি হত। + +[ভ্যালিডেটর কী সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos/keys/)। + +## ওয়ালেট সম্পর্কে একটি নোট {#a-note-on-wallets} + +একটি অ্যাকাউন্ট একটি ওয়ালেট নয়। একটি ওয়ালেট একটি ইন্টারফেস বা অ্যাপ্লিকেশন যা আপনাকে আপনার Ethereum অ্যাকাউন্টের সাথে ইন্টারঅ্যাক্ট করতে দেয়, তা একটি এক্সটারনালি-ওনড অ্যাকাউন্ট বা একটি কন্ট্র্যাক্ট অ্যাকাউন্ট হোক। + +## একটি ভিজ্যুয়াল ডেমো {#a-visual-demo} + +অস্টিনকে হ্যাস ফাংশন, এবং কী পেয়ারগুলি ব্যাখ্যা করতে দেখুন। + + + + + +## আরও পড়ুন {#further-reading} + +- [Ethereum অ্যাকাউন্ট বোঝা](https://info.etherscan.com/understanding-ethereum-accounts/) - etherscan + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) +- [লেনদেন](/developers/docs/transactions/) diff --git a/public/content/translations/bn/developers/docs/apis/backend/index.md b/public/content/translations/bn/developers/docs/apis/backend/index.md new file mode 100644 index 00000000000..87b35d7be91 --- /dev/null +++ b/public/content/translations/bn/developers/docs/apis/backend/index.md @@ -0,0 +1,211 @@ +--- +title: "ব্যাকএন্ড API লাইব্রেরি" +description: "Ethereum ক্লায়েন্ট API-এর একটি পরিচিতি যা আপনাকে আপনার অ্যাপ্লিকেশন থেকে ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করতে দেয়।" +lang: bn +--- + +Ethereum ব্লকচেইনের সাথে একটি সফ্টওয়্যার অ্যাপ্লিকেশনের ইন্টারঅ্যাক্ট করার জন্য (অর্থাৎ, ব্লকচেইন ডেটা পড়া এবং/অথবা নেটওয়ার্কে লেনদেন পাঠানো), এটিকে অবশ্যই একটি Ethereum নোডের সাথে সংযোগ স্থাপন করতে হবে। + +এই উদ্দেশ্যে, প্রতিটি Ethereum ক্লায়েন্ট [JSON-RPC](/developers/docs/apis/json-rpc/) স্পেসিফিকেশন প্রয়োগ করে, তাই [পদ্ধতিগুলির](/developers/docs/apis/json-rpc/#json-rpc-methods) একটি অভিন্ন সেট রয়েছে যার উপর অ্যাপ্লিকেশনগুলি নির্ভর করতে পারে। + +আপনি যদি একটি Ethereum নোডের সাথে সংযোগ করার জন্য একটি নির্দিষ্ট প্রোগ্রামিং ভাষা ব্যবহার করতে চান, তবে ইকোসিস্টেমের মধ্যে অনেক সুবিধাজনক লাইব্রেরি রয়েছে যা এটিকে আরও সহজ করে তোলে। এই লাইব্রেরিগুলির সাহায্যে, ডেভেলপাররা Ethereum-এর সাথে ইন্টারঅ্যাক্ট করে এমন JSON-RPC অনুরোধগুলি (হুডের নীচে) শুরু করার জন্য স্বজ্ঞাত, এক-লাইনের পদ্ধতি লিখতে পারে। + +## পূর্বশর্ত {#prerequisites} + +[Ethereum স্ট্যাক](/developers/docs/ethereum-stack/) এবং [Ethereum ক্লায়েন্ট](/developers/docs/nodes-and-clients/) বোঝা সহায়ক হতে পারে। + +## একটি লাইব্রেরি কেন ব্যবহার করবেন? {#why-use-a-library} + +এই লাইব্রেরিগুলি সরাসরি একটি Ethereum নোডের সাথে ইন্টারঅ্যাক্ট করার জটিলতাকে অনেকটাই সহজ করে দেয়। তারা ইউটিলিটি ফাংশনও (যেমন, ETH-কে Gwei-তে রূপান্তর করা) সরবরাহ করে যাতে একজন ডেভেলপার হিসেবে আপনি Ethereum ক্লায়েন্টের জটিলতা নিয়ে কাজ করার জন্য কম সময় ব্যয় করতে পারেন এবং আপনার অ্যাপ্লিকেশনের অনন্য কার্যকারিতার উপর বেশি সময় মনোনিবেশ করতে পারেন। + +## উপলব্ধ লাইব্রেরি {#available-libraries} + +### অবকাঠামো এবং নোড পরিষেবা {#infrastructure-and-node-services} + +**Alchemy -** **_Ethereum ডেভেলপমেন্ট প্ল্যাটফর্ম।_** + +- [alchemy.com](https://www.alchemy.com/) +- [নথিপত্র](https://www.alchemy.com/docs/) +- [GitHub](https://github.com/alchemyplatform) +- [Discord](https://discord.com/invite/alchemyplatform) + +**All That Node -** **_নোড-এজ-এ-সার্ভিস।_** + +- [All That Node.com](https://www.allthatnode.com/) +- [নথিপত্র](https://docs.allthatnode.com) +- [ডিসকর্ড](https://discord.gg/GmcdVEUbJM) + +**Bware Labs দ্বারা Blast -** **_Ethereum মেইননেট এবং টেস্টনেটের জন্য বিকেন্দ্রীভূত API।_** + +- [blastapi.io](https://blastapi.io/) +- [নথিপত্র](https://docs.blastapi.io) +- [ডিসকর্ড](https://discord.gg/SaRqmRUjjQ) + +**BlockPi -** **_আরও কার্যকর এবং দ্রুত RPC পরিষেবা প্রদান করুন_** + +- [blockpi.io](https://blockpi.io/) +- [নথিপত্র](https://docs.blockpi.io/) +- [GitHub](https://github.com/BlockPILabs) +- [ডিসকর্ড](https://discord.com/invite/xTvGVrGVZv) + +**Cloudflare Ethereum গেটওয়ে।** + +- [cloudflare-eth.com](https://www.cloudflare.com/application-services/products/web3/) + +**Etherscan - ব্লক এক্সপ্লোরার এবং লেনদেন API** + +- [নথিপত্র](https://docs.etherscan.io/) + +**Blockscout - ওপেন সোর্স ব্লক এক্সপ্লোরার** + +- [নথিপত্র](https://docs.blockscout.com/) + +**GetBlock-** **_Web3 ডেভেলপমেন্টের জন্য ব্লকচেইন-এজ-এ-সার্ভিস_** + +- [GetBlock.io](https://getblock.io/) +- [নথিপত্র](https://docs.getblock.io/) + +**Infura -** **_একটি পরিষেবা হিসাবে Ethereum API।_** + +- [infura.io](https://infura.io) +- [নথিপত্র](https://docs.infura.io/api) +- [GitHub](https://github.com/INFURA) + +**Node RPC - _সাশ্রয়ী EVM JSON-RPC প্রদানকারী_** + +- [noderpc.xyz](https://www.noderpc.xyz/) +- [নথিপত্র](https://docs.noderpc.xyz/node-rpc) + +**NOWNodes - _সম্পূর্ণ নোড এবং ব্লক এক্সপ্লোরার।_** + +- [NOWNodes.io](https://nownodes.io/) +- [নথিপত্র](https://nownodes.gitbook.io/documentation) + +**QuickNode -** **_একটি পরিষেবা হিসাবে ব্লকচেইন পরিকাঠামো।_** + +- [quicknode.com](https://quicknode.com) +- [নথিপত্র](https://www.quicknode.com/docs/welcome) +- [ডিসকর্ড](https://discord.gg/quicknode) + +**Rivet -** **_ওপেন সোর্স সফ্টওয়্যার দ্বারা চালিত একটি পরিষেবা হিসাবে Ethereum এবং Ethereum Classic API।_** + +- [rivet.cloud](https://rivet.cloud) +- [নথিপত্র](https://rivet.cloud/docs/) +- [GitHub](https://github.com/openrelayxyz/ethercattle-deployment) + +**Zmok -** **_JSON-RPC/WebSockets API হিসাবে গতি-ভিত্তিক Ethereum নোড।_** + +- [zmok.io](https://zmok.io/) +- [GitHub](https://github.com/zmok-io) +- [নথিপত্র](https://docs.zmok.io/) +- [ডিসকর্ড](https://discord.gg/fAHeh3ka6s) + +### ডেভেলপমেন্ট টুলস {#development-tools} + +**ethers-kt -** **_EVM-ভিত্তিক ব্লকচেইনের জন্য অ্যাসিঙ্ক, হাই-পারফরম্যান্স Kotlin/Java/Android লাইব্রেরি।_** + +- [GitHub](https://github.com/Kr1ptal/ethers-kt) +- [উদাহরণ](https://github.com/Kr1ptal/ethers-kt/tree/master/examples) +- [Discord](https://discord.gg/rx35NzQGSb) + +**Nethereum -** **_ব্লকচেইনের জন্য একটি ওপেন সোর্স .NET ইন্টিগ্রেশন লাইব্রেরি।_** + +- [GitHub](https://github.com/Nethereum/Nethereum) +- [নথিপত্র](http://docs.nethereum.com/en/latest/) +- [ডিসকর্ড](https://discord.com/invite/jQPrR58FxX) + +**Python টুলিং -** **_Python-এর মাধ্যমে Ethereum ইন্টারঅ্যাকশনের জন্য বিভিন্ন লাইব্রেরি।_** + +- [py.ethereum.org](https://snakecharmers.ethereum.org/) +- [web3.py GitHub](https://github.com/ethereum/web3.py) +- [web3.py চ্যাট](https://gitter.im/ethereum/web3.py) + +**Tatum -** **_চূড়ান্ত ব্লকচেইন ডেভেলপমেন্ট প্ল্যাটফর্ম।_** + +- [Tatum](https://tatum.io/) +- [GitHub](https://github.com/tatumio/) +- [নথিপত্র](https://docs.tatum.io/) +- [ডিসকর্ড](https://discord.gg/EDmW3kjTC9) + +**web3j -** **_Ethereum-এর জন্য একটি Java/Android/Kotlin/Scala ইন্টিগ্রেশন লাইব্রেরি।_** + +- [GitHub](https://github.com/web3j/web3j) +- [নথিপত্র](https://docs.web3j.io/) +- [Gitter](https://gitter.im/web3j/web3j) + +### ব্লকচেইন পরিষেবা {#blockchain-services} + +**BlockCypher -** **_Ethereum ওয়েব API।_** + +- [blockcypher.com](https://www.blockcypher.com/) +- [নথিপত্র](https://www.blockcypher.com/dev/ethereum/) + +**Chainbase -** **_Ethereum-এর জন্য অল-ইন-ওয়ান web3 ডেটা পরিকাঠামো।_** + +- [chainbase.com](https://chainbase.com/) +- [নথিপত্র](https://docs.chainbase.com/) +- [ডিসকর্ড](https://discord.gg/Wx6qpqz4AF) + +**Chainstack -** **_একটি পরিষেবা হিসাবে ইলাস্টিক এবং ডেডিকেটেড Ethereum নোড।_** + +- [chainstack.com](https://chainstack.com) +- [নথিপত্র](https://docs.chainstack.com/) +- [Ethereum API রেফারেন্স](https://docs.chainstack.com/reference/ethereum-getting-started) + +**Coinbase ক্লাউড নোড -** **_ব্লকচেইন ইনফ্রাস্ট্রাকচার API।_** + +- [Coinbase ক্লাউড নোড](https://www.coinbase.com/developer-platform) +- [নথিপত্র](https://docs.cdp.coinbase.com/) + +**Figment দ্বারা DataHub -** **_Ethereum মেইননেট এবং টেস্টনেট সহ Web3 API পরিষেবা।_** + +- [DataHub](https://www.figment.io/) +- [নথিপত্র](https://docs.figment.io/) + +**Moralis -** **_এন্টারপ্রাইজ-গ্রেড EVM API প্রদানকারী।_** + +- [moralis.io](https://moralis.io) +- [নথিপত্র](https://docs.moralis.io/) +- [GitHub](https://github.com/MoralisWeb3) +- [ডিসকর্ড](https://moralis.io/joindiscord/) +- [ফোরাম](https://forum.moralis.io/) + +**NFTPort -** **_Ethereum ডেটা এবং মিন্ট API।_** + +- [nftport.xyz](https://www.nftport.xyz/) +- [নথিপত্র](https://docs.nftport.xyz/) +- [GitHub](https://github.com/nftport/) +- [ডিসকর্ড](https://discord.com/invite/K8nNrEgqhE) + +**Tokenview -** **_সাধারণ মাল্টি-ক্রিপ্টো ব্লকচেইন APIs প্ল্যাটফর্ম।_** + +- [services.tokenview.io](https://services.tokenview.io/) +- [নথিপত্র](https://services.tokenview.io/docs?type=api) +- [GitHub](https://github.com/Tokenview) + +**Watchdata -** **_Ethereum ব্লকচেইনে সহজ এবং নির্ভরযোগ্য API অ্যাক্সেস সরবরাহ করুন।_** + +- [Watchdata](https://watchdata.io/) +- [নথিপত্র](https://docs.watchdata.io/) +- [ডিসকর্ড](https://discord.com/invite/TZRJbZ6bdn) + +**Covalent -** **_200+ চেইনের জন্য সমৃদ্ধ ব্লকচেইন API।_** + +- [covalenthq.com](https://www.covalenthq.com/) +- [নথিপত্র](https://www.covalenthq.com/docs/api/) +- [GitHub](https://github.com/covalenthq) +- [Discord](https://www.covalenthq.com/discord/) + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) +- [ডেভেলপমেন্ট ফ্রেমওয়ার্ক](/developers/docs/frameworks/) + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [জাভাস্ক্রিপ্টে Ethereum ব্লকচেইন ব্যবহার করতে Web3js সেট আপ করুন](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– আপনার প্রোজেক্টে web3.js সেট আপ করার জন্য নির্দেশাবলী।_ +- [জাভাস্ক্রিপ্ট থেকে একটি স্মার্ট কন্ট্র্যাক্ট কল করা](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– DAI টোকেন ব্যবহার করে দেখুন, জাভাস্ক্রিপ্ট ব্যবহার করে কীভাবে কন্ট্র্যাক্ট ফাংশন কল করতে হয়।_ diff --git a/public/content/translations/bn/developers/docs/apis/javascript/index.md b/public/content/translations/bn/developers/docs/apis/javascript/index.md new file mode 100644 index 00000000000..d74740d5fe9 --- /dev/null +++ b/public/content/translations/bn/developers/docs/apis/javascript/index.md @@ -0,0 +1,289 @@ +--- +title: "জাভাস্ক্রিপ্ট API লাইব্রেরি" +description: "জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরিগুলির একটি পরিচিতি যা আপনাকে আপনার অ্যাপ্লিকেশন থেকে ব্লকচেইনের সাথে যোগাযোগ করতে দেয়।" +lang: bn +--- + +একটি ওয়েব অ্যাপকে ইথেরিয়াম ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করার জন্য (যেমন, ব্লকচেইন ডেটা পড়া এবং/অথবা নেটওয়ার্কে লেনদেন পাঠানো), এটিকে অবশ্যই একটি ইথেরিয়াম নোডের সাথে সংযোগ স্থাপন করতে হবে। + +এই উদ্দেশ্যে, প্রতিটি ইথেরিয়াম ক্লায়েন্ট [JSON-RPC](/developers/docs/apis/json-rpc/) স্পেসিফিকেশন প্রয়োগ করে, তাই এখানে [পদ্ধতিগুলির](/developers/docs/apis/json-rpc/#json-rpc-methods) একটি অভিন্ন সেট রয়েছে যার উপর অ্যাপ্লিকেশনগুলি নির্ভর করতে পারে। + +আপনি যদি একটি ইথেরিয়াম নোডের সাথে সংযোগ করতে JavaScript ব্যবহার করতে চান, তাহলে ভ্যানিলা JavaScript ব্যবহার করা সম্ভব কিন্তু ইকোসিস্টেমের মধ্যে বেশ কিছু সুবিধাজনক লাইব্রেরি বিদ্যমান যা এটিকে অনেক সহজ করে তোলে। এই লাইব্রেরিগুলির সাহায্যে, ডেভেলপাররা Ethereum-এর সাথে ইন্টারঅ্যাক্ট করে এমন JSON-RPC অনুরোধগুলি (হুডের নীচে) শুরু করার জন্য স্বজ্ঞাত, এক-লাইনের পদ্ধতি লিখতে পারে। + +অনুগ্রহ করে মনে রাখবেন যে [The Merge](/roadmap/merge/) থেকে, একটি নোড চালানোর জন্য ইথেরিয়াম সফ্টওয়্যারের দুটি সংযুক্ত অংশ - একটি এক্সিকিউশন ক্লায়েন্ট এবং একটি কনসেন্সাস ক্লায়েন্ট - প্রয়োজন। অনুগ্রহ করে নিশ্চিত করুন যে আপনার নোডে একটি এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্ট উভয়ই অন্তর্ভুক্ত আছে। যদি আপনার নোডটি আপনার স্থানীয় মেশিনে না থাকে (যেমন, আপনার নোডটি একটি AWS ইনস্ট্যান্সে চলছে) তাহলে টিউটোরিয়ালে সেই অনুযায়ী IP ঠিকানাগুলি আপডেট করুন। আরও তথ্যের জন্য অনুগ্রহ করে আমাদের [একটি নোড চালানো](/developers/docs/nodes-and-clients/run-a-node/) বিষয়ক পৃষ্ঠা দেখুন। + +## পূর্বশর্ত {#prerequisites} + +জাভাস্ক্রিপ্ট বোঝার পাশাপাশি, [ইথেরিয়াম স্ট্যাক](/developers/docs/ethereum-stack/) এবং [ইথেরিয়াম ক্লায়েন্ট](/developers/docs/nodes-and-clients/) বোঝা সহায়ক হতে পারে। + +## একটি লাইব্রেরি কেন ব্যবহার করবেন? {#why-use-a-library} + +এই লাইব্রেরিগুলি সরাসরি একটি Ethereum নোডের সাথে ইন্টারঅ্যাক্ট করার জটিলতাকে অনেকটাই সহজ করে দেয়। তারা ইউটিলিটি ফাংশনও (যেমন, ETH-কে Gwei-তে রূপান্তর করা) সরবরাহ করে যাতে একজন ডেভেলপার হিসেবে আপনি Ethereum ক্লায়েন্টের জটিলতা নিয়ে কাজ করার জন্য কম সময় ব্যয় করতে পারেন এবং আপনার অ্যাপ্লিকেশনের অনন্য কার্যকারিতার উপর বেশি সময় মনোনিবেশ করতে পারেন। + +## লাইব্রেরির বৈশিষ্ট্য {#library-features} + +### ইথেরিয়াম নোডগুলির সাথে সংযোগ করুন {#connect-to-ethereum-nodes} + +প্রদানকারীদের ব্যবহার করে, এই লাইব্রেরিগুলি আপনাকে ইথেরিয়াম-এর সাথে সংযোগ স্থাপন করতে এবং এর ডেটা পড়তে দেয়, তা JSON-RPC, INFURA, Etherscan, Alchemy বা MetaMask-এর মাধ্যমেই হোক না কেন। + +> **সতর্কবার্তা:** Web3.js মার্চ ৪, ২০২৫-এ আর্কাইভ করা হয়েছে। [ঘোষণাটি পড়ুন](https://blog.chainsafe.io/web3-js-sunset/)। নতুন প্রকল্পের জন্য [ethers.js](https://ethers.org) বা [viem](https://viem.sh) এর মতো বিকল্প লাইব্রেরি ব্যবহার করার কথা বিবেচনা করুন। + +**Ethers উদাহরণ** + +```js +// একটি ব্রাউজারপ্রোভাইডার একটি স্ট্যান্ডার্ড Web3 প্রদানকারীকে মোড়ানো হয়, যা হলো +// মেটামাস্ক প্রতিটি পৃষ্ঠায় window.ethereum হিসেবে যা ইনজেক্ট করে +const provider = new ethers.BrowserProvider(window.ethereum) + +// মেটামাস্ক প্লাগইনটি লেনদেনে স্বাক্ষর করার অনুমতিও দেয় +// ইথার পাঠাতে এবং ব্লকচেইনের মধ্যে অবস্থা পরিবর্তন করতে অর্থ প্রদান করতে। +// এর জন্য, আমাদের অ্যাকাউন্ট সাইনার প্রয়োজন... +const signer = provider.getSigner() +``` + +**Web3js উদাহরণ** + +```js +var web3 = new Web3("http://localhost:8545") +// অথবা +var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")) + +// প্রদানকারী পরিবর্তন করুন +web3.setProvider("ws://localhost:8546") +// অথবা +web3.setProvider(new Web3.providers.WebsocketProvider("ws://localhost:8546")) + +// node.js-এ IPC প্রদানকারী ব্যবহার করে +var net = require("net") +var web3 = new Web3("/Users/myuser/Library/Ethereum/geth.ipc", net) // mac os পাথ +// অথবা +var web3 = new Web3( + new Web3.providers.IpcProvider("/Users/myuser/Library/Ethereum/geth.ipc", net) +) // mac os পাথ +// উইন্ডোজে পাথটি হলো: "\\\\.\\pipe\\geth.ipc" +// লিনাক্সে পাথটি হলো: "/users/myuser/.ethereum/geth.ipc" +``` + +একবার সেট আপ হয়ে গেলে আপনি এর জন্য ব্লকচেইন জিজ্ঞাসা করতে সক্ষম হবেন: + +- ব্লক নম্বর +- গ্যাস অনুমান +- স্মার্ট কন্ট্র্যাক্ট ইভেন্ট +- নেটওয়ার্ক আইডি +- এবং আরও... + +### ওয়ালেট কার্যকারিতা {#wallet-functionality} + +এই লাইব্রেরিগুলি আপনাকে ওয়ালেট তৈরি করতে, কী পরিচালনা করতে এবং লেনদেনে স্বাক্ষর করার কার্যকারিতা দেয়। + +এখানে Ethers থেকে একটি উদাহরণ দেওয়া হল + +```js +// একটি স্মৃতিচিহ্ন থেকে একটি ওয়ালেট ইনস্ট্যান্স তৈরি করুন... +mnemonic = + "announce room limb pattern dry unit scale effort smooth jazz weasel alcohol" +walletMnemonic = Wallet.fromPhrase(mnemonic) + +// ...অথবা একটি ব্যক্তিগত কী থেকে +walletPrivateKey = new Wallet(walletMnemonic.privateKey) + +walletMnemonic.address === walletPrivateKey.address +// সত্য + +// সাইনার API অনুযায়ী একটি প্রতিশ্রুতি হিসাবে ঠিকানা +walletMnemonic.getAddress() +// { Promise: '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' } + +// একটি ওয়ালেট ঠিকানাও সিঙ্ক্রোনাসভাবে উপলব্ধ +walletMnemonic.address +// '0x71CB05EE1b1F506fF321Da3dac38f25c0c9ce6E1' + +// অভ্যন্তরীণ ক্রিপ্টোগ্রাফিক উপাদান +walletMnemonic.privateKey +// '0x1da6847600b0ee25e9ad9a52abbd786dd2502fa4005dd5af9310b7cc7a3b25db' +walletMnemonic.publicKey +// '0x04b9e72dfd423bcf95b3801ac93f4392be5ff22143f9980eb78b3a860c4843bfd04829ae61cdba4b3b1978ac5fc64f5cc2f4350e35a108a9c9a92a81200a60cd64' + +// ওয়ালেট স্মৃতিচিহ্ন +walletMnemonic.mnemonic +// { +// locale: 'en', +// path: 'm/44\'/60\'/0\'/0/0', +// phrase: 'announce room limb pattern dry unit scale effort smooth jazz weasel alcohol' +// } + +// দ্রষ্টব্য: একটি ব্যক্তিগত কী দিয়ে তৈরি একটি ওয়ালেটে থাকে না +// একটি স্মৃতিচিহ্ন (ডেরিভেশন এটি প্রতিরোধ করে) +walletPrivateKey.mnemonic +// শূন্য + +// একটি বার্তায় স্বাক্ষর করা +walletMnemonic.signMessage("Hello World") +// { Promise: '0x14280e5885a19f60e536de50097e96e3738c7acae4e9e62d67272d794b8127d31c03d9cd59781d4ee31fb4e1b893bd9b020ec67dfa65cfb51e2bdadbb1de26d91c' } + +tx = { + to: "0x8ba1f109551bD432803012645Ac136ddd64DBA72", + value: utils.parseEther("1.0"), +} + +// একটি লেনদেনে স্বাক্ষর করা +walletMnemonic.signTransaction(tx) +// { Promise: '0xf865808080948ba1f109551bd432803012645ac136ddd64dba72880de0b6b3a7640000801ca0918e294306d177ab7bd664f5e141436563854ebe0a3e523b9690b4922bbb52b8a01181612cec9c431c4257a79b8c9f0c980a2c49bb5a0e6ac52949163eeb565dfc' } + +// সংযোগ পদ্ধতি এর একটি নতুন উদাহরণ প্রদান করে +// একজন প্রদানকারীর সাথে সংযুক্ত ওয়ালেট +wallet = walletMnemonic.connect(provider) + +// নেটওয়ার্ক জিজ্ঞাসা করা হচ্ছে +wallet.getBalance() +// { Promise: { BigNumber: "42" } } +wallet.getTransactionCount() +// { Promise: 0 } + +// ইথার পাঠানো হচ্ছে +wallet.sendTransaction(tx) +``` + +[সম্পূর্ণ ডক্স পড়ুন](https://docs.ethers.io/v5/api/signer/#Wallet) + +একবার সেট আপ হয়ে গেলে আপনি সক্ষম হবেন: + +- অ্যাকাউন্ট তৈরি করুন +- লেনদেন পাঠান +- লেনদেনে স্বাক্ষর করুন +- এবং আরও... + +### স্মার্ট কন্ট্র্যাক্ট ফাংশনের সাথে ইন্টারঅ্যাক্ট করুন {#interact-with-smart-contract-functions} + +জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরিগুলি আপনার অ্যাপ্লিকেশনকে একটি সংকলিত চুক্তির অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) পড়ার মাধ্যমে স্মার্ট কন্ট্র্যাক্ট ফাংশন কল করার অনুমতি দেয়। + +ABI মূলত চুক্তির ফাংশনগুলিকে একটি JSON ফর্ম্যাটে ব্যাখ্যা করে এবং আপনাকে এটিকে একটি সাধারণ জাভাস্ক্রিপ্ট অবজেক্টের মতো ব্যবহার করতে দেয়। + +সুতরাং নিম্নলিখিত সলিডিটি চুক্তি: + +```solidity +contract Test { + uint a; + address d = 0x12345678901234567890123456789012; + + constructor(uint testInt) { a = testInt;} + + event Event(uint indexed b, bytes32 c); + + event Event2(uint indexed b, bytes32 c); + + function foo(uint b, bytes32 c) returns(address) { + Event(b, c); + return d; + } +} +``` + +নিম্নলিখিত JSON-এর ফলাফল হবে: + +```json +[{ + "type":"constructor", + "payable":false, + "stateMutability":"nonpayable" + "inputs":[{"name":"testInt","type":"uint256"}], + },{ + "type":"function", + "name":"foo", + "constant":false, + "payable":false, + "stateMutability":"nonpayable", + "inputs":[{"name":"b","type":"uint256"}, {"name":"c","type":"bytes32"}], + "outputs":[{"name":"","type":"address"}] + },{ + "type":"event", + "name":"Event", + "inputs":[{"indexed":true,"name":"b","type":"uint256"}, {"indexed":false,"name":"c","type":"bytes32"}], + "anonymous":false + },{ + "type":"event", + "name":"Event2", + "inputs":[{"indexed":true,"name":"b","type":"uint256"},{"indexed":false,"name":"c","type":"bytes32"}], + "anonymous":false +}] +``` + +এর মানে আপনি করতে পারেন: + +- স্মার্ট কন্ট্র্যাক্টে একটি লেনদেন পাঠান এবং এর পদ্ধতি কার্যকর করুন +- EVM-এ কার্যকর করার সময় একটি পদ্ধতি কার্যকর করতে যে গ্যাস লাগবে তা অনুমান করার জন্য কল করুন +- একটি চুক্তি স্থাপন করুন +- এবং আরও... + +### ইউটিলিটি ফাংশন {#utility-functions} + +ইউটিলিটি ফাংশন আপনাকে সুবিধাজনক শর্টকাট দেয় যা ইথেরিয়াম দিয়ে নির্মাণকে একটু সহজ করে তোলে। + +ETH মান ডিফল্টভাবে Wei-তে থাকে। ১ ETH = ১,০০০,০০০,০০০,০০০,০০০,০০০ WEI – এর মানে হল আপনি অনেক সংখ্যার সাথে কাজ করছেন! `web3.utils.toWei` আপনার জন্য ইথারকে Wei-তে রূপান্তর করে। + +এবং ethers-এ এটি এইরকম দেখায়: + +```js +// একটি অ্যাকাউন্টের ব্যালেন্স পান (ঠিকানা বা ENS নাম দ্বারা) +balance = await provider.getBalance("ethers.eth") +// { BigNumber: "2337132817842795605" } + +// প্রায়শই আপনাকে ব্যবহারকারীর জন্য আউটপুট ফরম্যাট করতে হবে +// যারা wei (wei-এর পরিবর্তে) ইথারে মান দেখতে পছন্দ করে +ethers.utils.formatEther(balance) +// '2.337132817842795605' +``` + +- [Web3js ইউটিলিটি ফাংশন](https://docs.web3js.org/api/web3-utils) +- [Ethers ইউটিলিটি ফাংশন](https://docs.ethers.org/v6/api/utils/) + +## উপলব্ধ লাইব্রেরি {#available-libraries} + +**Web3.js -** **_ইথেরিয়াম জাভাস্ক্রিপ্ট API।_** + +- [ডকুমেন্টেশন](https://docs.web3js.org) +- [GitHub](https://github.com/ethereum/web3.js) + +**Ethers.js -** **_জাভাস্ক্রিপ্ট এবং টাইপস্ক্রিপ্টে সম্পূর্ণ ইথেরিয়াম ওয়ালেট প্রয়োগ এবং ইউটিলিটি।_** + +- [Ethers.js হোম](https://ethers.org/) +- [ডকুমেন্টেশন](https://docs.ethers.io) +- [GitHub](https://github.com/ethers-io/ethers.js) + +**The Graph -** **_ইথেরিয়াম এবং IPFS ডেটা ইন্ডেক্স করার এবং GraphQL ব্যবহার করে এটি জিজ্ঞাসা করার জন্য একটি প্রোটোকল।_** + +- [The Graph](https://thegraph.com) +- [Graph Explorer](https://thegraph.com/explorer) +- [ডকুমেন্টেশন](https://thegraph.com/docs) +- [GitHub](https://github.com/graphprotocol) +- [Discord](https://thegraph.com/discord) + +**Alchemy SDK -** **_উন্নত এপিআই সহ Ethers.js এর চারপাশে র‍্যাপার।_** + +- [ডকুমেন্টেশন](https://www.alchemy.com/docs) +- [GitHub](https://github.com/alchemyplatform/alchemy-sdk-js) + +**viem -** **_ইথেরিয়াম-এর জন্য টাইপস্ক্রিপ্ট ইন্টারফেস।_** + +- [ডকুমেন্টেশন](https://viem.sh) +- [GitHub](https://github.com/wagmi-dev/viem) + +**Drift -** **_অন্তর্নির্মিত ক্যাশিং, হুক এবং পরীক্ষা মক সহ টাইপস্ক্রিপ্ট মেটা-লাইব্রেরি।_** + +- [ডকুমেন্টেশন](https://ryangoree.github.io/drift/) +- [GitHub](https://github.com/ryangoree/drift/) + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) +- [ডেভেলপমেন্ট ফ্রেমওয়ার্ক](/developers/docs/frameworks/) + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [জাভাস্ক্রিপ্টে Ethereum ব্লকচেইন ব্যবহার করতে Web3js সেট আপ করুন](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) _– আপনার প্রোজেক্টে web3.js সেট আপ করার জন্য নির্দেশাবলী।_ +- [জাভাস্ক্রিপ্ট থেকে একটি স্মার্ট কন্ট্র্যাক্ট কল করা](/developers/tutorials/calling-a-smart-contract-from-javascript/) _– DAI টোকেন ব্যবহার করে দেখুন, জাভাস্ক্রিপ্ট ব্যবহার করে কীভাবে কন্ট্র্যাক্ট ফাংশন কল করতে হয়।_ +- [web3 এবং Alchemy ব্যবহার করে লেনদেন পাঠানো](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) _– ব্যাকএন্ড থেকে লেনদেন পাঠানোর জন্য ধাপে ধাপে ওয়াকথ্রু।_ diff --git a/public/content/translations/bn/developers/docs/apis/json-rpc/index.md b/public/content/translations/bn/developers/docs/apis/json-rpc/index.md new file mode 100644 index 00000000000..ff2d16e2a2e --- /dev/null +++ b/public/content/translations/bn/developers/docs/apis/json-rpc/index.md @@ -0,0 +1,1897 @@ +--- +title: JSON-RPC API +description: "Ethereum ক্লায়েন্টের জন্য একটি স্টেটলেস, লাইট-ওয়েট রিমোট প্রসিডিউর কল (RPC) প্রোটোকল।" +lang: bn +--- + +Ethereum ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি সফ্টওয়্যার অ্যাপ্লিকেশনের জন্য - হয় ব্লকচেইন ডেটা পড়ে বা নেটওয়ার্কে লেনদেন পাঠানোর মাধ্যমে - এটি অবশ্যই একটি Ethereum নোডের সাথে সংযুক্ত থাকতে হবে। + +এই উদ্দেশ্যে, প্রতিটি [Ethereum ক্লায়েন্ট](/developers/docs/nodes-and-clients/#execution-clients) একটি [JSON-RPC স্পেসিফিকেশন](https://github.com/ethereum/execution-apis) প্রয়োগ করে, তাই পদ্ধতিগুলির একটি ইউনিফর্ম সেট রয়েছে যার উপর অ্যাপ্লিকেশনগুলি নির্দিষ্ট নোড বা ক্লায়েন্ট বাস্তবায়ন নির্বিশেষে নির্ভর করতে পারে। + +[JSON-RPC](https://www.jsonrpc.org/specification) একটি স্টেটলেস, লাইট-ওয়েট রিমোট প্রসিডিউর কল (RPC) প্রোটোকল। এটি বেশ কিছু ডেটা স্ট্রাকচার এবং তাদের প্রক্রিয়াকরণের নিয়মাবলী নির্ধারণ করে। এটি ট্রান্সপোর্ট অ্যাগনস্টিক কারণ এই ধারণাগুলি একই প্রক্রিয়ার মধ্যে, সকেটের উপর, HTTP-র উপর বা বিভিন্ন মেসেজ পাসিং পরিবেশে ব্যবহার করা যেতে পারে। এটি ডেটা ফরম্যাট হিসেবে JSON (RFC 4627) ব্যবহার করে। + +## ক্লায়েন্ট ইমপ্লিমেন্টেশন {#client-implementations} + +JSON-RPC স্পেসিফিকেশন প্রয়োগ করার সময় Ethereum ক্লায়েন্টরা প্রত্যেকে বিভিন্ন প্রোগ্রামিং ভাষা ব্যবহার করতে পারে। নির্দিষ্ট প্রোগ্রামিং ভাষা সম্পর্কিত আরও বিশদ বিবরণের জন্য পৃথক [ক্লায়েন্ট ডকুমেন্টেশন](/developers/docs/nodes-and-clients/#execution-clients) দেখুন। সর্বশেষ API সহায়তা তথ্যের জন্য আমরা প্রতিটি ক্লায়েন্টের ডকুমেন্টেশন পরীক্ষা করার পরামর্শ দিই। + +## সুবিধাজনক লাইব্রেরি {#convenience-libraries} + +যদিও আপনি JSON-RPC API-এর মাধ্যমে সরাসরি Ethereum ক্লায়েন্টদের সাথে ইন্টারঅ্যাক্ট করা বেছে নিতে পারেন, তবে dapp ডেভেলপারদের জন্য প্রায়শই সহজ বিকল্প রয়েছে। JSON-RPC API-এর উপরে র‍্যাপার সরবরাহ করার জন্য অনেক [জাভাস্ক্রিপ্ট](/developers/docs/apis/javascript/#available-libraries) এবং [ব্যাকএন্ড API](/developers/docs/apis/backend/#available-libraries) লাইব্রেরি বিদ্যমান। এই লাইব্রেরিগুলির সাহায্যে, ডেভেলপাররা Ethereum-এর সাথে ইন্টারঅ্যাক্ট করে এমন JSON-RPC অনুরোধগুলি (হুডের নীচে) শুরু করার জন্য তাদের পছন্দের প্রোগ্রামিং ভাষায় স্বজ্ঞাত, এক-লাইনের পদ্ধতি লিখতে পারে। + +## কনসেন্সাস ক্লায়েন্ট APIs {#consensus-clients} + +এই পৃষ্ঠাটি মূলত Ethereum এক্সিকিউশন ক্লায়েন্টদের দ্বারা ব্যবহৃত JSON-RPC API নিয়ে কাজ করে। যাইহোক, কনসেন্সাস ক্লায়েন্টদের একটি RPC APIও রয়েছে যা ব্যবহারকারীদের নোড সম্পর্কে তথ্য জিজ্ঞাসা করতে, বিকন ব্লক, বিকন স্টেট এবং অন্যান্য কনসেন্সাস-সম্পর্কিত তথ্য সরাসরি একটি নোড থেকে অনুরোধ করতে দেয়। এই APIটি [বিকন API ওয়েবপেজে](https://ethereum.github.io/beacon-APIs/#/) নথিভুক্ত করা আছে। + +একটি অভ্যন্তরীণ API একটি নোডের মধ্যে ইন্টার-ক্লায়েন্ট যোগাযোগের জন্যও ব্যবহৃত হয় - অর্থাৎ, এটি কনসেন্সাস ক্লায়েন্ট এবং এক্সিকিউশন ক্লায়েন্টকে ডেটা সোয়াপ করতে সক্ষম করে। এটিকে 'ইঞ্জিন API' বলা হয় এবং স্পেসগুলি [GitHub](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md)-এ উপলব্ধ। + +## এক্সিকিউশন ক্লায়েন্ট স্পেক {#spec} + +[GitHub-এ সম্পূর্ণ JSON-RPC API স্পেক পড়ুন](https://github.com/ethereum/execution-apis)। এই API টি [এক্সিকিউশন API ওয়েবপেজ](https://ethereum.github.io/execution-apis/)-এ নথিভুক্ত এবং সমস্ত উপলব্ধ পদ্ধতি চেষ্টা করার জন্য একটি ইন্সপেক্টর অন্তর্ভুক্ত করে। + +## কনভেনশন {#conventions} + +### হেক্স ভ্যালু এনকোডিং {#hex-encoding} + +দুটি মূল ডেটা টাইপ JSON-এর মাধ্যমে পাস করা হয়: আনফরম্যাটেড বাইট অ্যারে এবং পরিমাণ। উভয়ই একটি হেক্স এনকোডিংয়ের সাথে পাস করা হয় তবে ফর্ম্যাটিংয়ের জন্য বিভিন্ন প্রয়োজনীয়তা সহ। + +#### পরিমাণ {#quantities-encoding} + +পরিমাণ (পূর্ণসংখ্যা, সংখ্যা) এনকোড করার সময়: হেক্স হিসাবে এনকোড করুন, "0x" এর সাথে প্রিফিক্স করুন, সবচেয়ে কমপ্যাক্ট উপস্থাপনা (সামান্য ব্যতিক্রম: শূন্যকে "0x0" হিসাবে উপস্থাপন করা উচিত)। + +এখানে কয়েকটি উদাহরণ দেওয়া হল: + +- 0x41 (দশমিকে 65) +- 0x400 (দশমিকে 1024) +- ভুল: 0x (সর্বদা কমপক্ষে একটি সংখ্যা থাকা উচিত - শূন্য হল "0x0") +- ভুল: 0x0400 (লিডিং জিরোর অনুমতি নেই) +- ভুল: ff (0x প্রিফিক্সড হতে হবে) + +### আনফরম্যাটেড ডেটা {#unformatted-data-encoding} + +আনফরম্যাটেড ডেটা (বাইট অ্যারে, অ্যাকাউন্ট অ্যাড্রেস, হ্যাস, বাইটকোড অ্যারে) এনকোড করার সময়: হেক্স হিসাবে এনকোড করুন, "0x" দিয়ে প্রিফিক্স করুন, প্রতি বাইটে দুটি হেক্স ডিজিট। + +এখানে কয়েকটি উদাহরণ দেওয়া হল: + +- 0x41 (সাইজ 1, "A") +- 0x004200 (সাইজ 3, "0B0") +- 0x (সাইজ 0, "") +- ভুল: 0xf0f0f (অবশ্যই জোড় সংখ্যক অঙ্ক হতে হবে) +- ভুল: 004200 (0x প্রিফিক্স করা আবশ্যক) + +### ব্লক প্যারামিটার {#block-parameter} + +নিম্নলিখিত পদ্ধতিগুলিতে একটি ব্লক প্যারামিটার রয়েছে: + +- [eth_getBalance](#eth_getbalance) +- [eth_getCode](#eth_getcode) +- [eth_getTransactionCount](#eth_gettransactioncount) +- [eth_getStorageAt](#eth_getstorageat) +- [eth_call](#eth_call) + +Ethereum-এর অবস্থা জিজ্ঞাসা করার জন্য অনুরোধ করা হলে, প্রদত্ত ব্লক প্যারামিটারটি ব্লকের উচ্চতা নির্ধারণ করে। + +ব্লক প্যারামিটারের জন্য নিম্নলিখিত বিকল্পগুলি সম্ভব: + +- `HEX স্ট্রিং` - একটি পূর্ণসংখ্যার ব্লক নম্বর +- সবচেয়ে প্রথম/জেনেসিস ব্লকের জন্য `স্ট্রিং "আর্লিয়েস্ট"` +- `স্ট্রিং "লেটেস্ট"` - সর্বশেষ প্রস্তাবিত ব্লকের জন্য +- `স্ট্রিং "সেফ"` - সর্বশেষ নিরাপদ হেড ব্লকের জন্য +- `স্ট্রিং "ফাইনালইজড"` - সর্বশেষ চূড়ান্ত ব্লকের জন্য +- `স্ট্রিং "পেন্ডিং"` - পেন্ডিং স্টেট/লেনদেনের জন্য + +## উদাহরণ + +এই পৃষ্ঠায় আমরা কমান্ড লাইন টুল, [curl](https://curl.se) ব্যবহার করে পৃথক JSON_RPC API এন্ডপয়েন্টগুলি কীভাবে ব্যবহার করতে হয় তার উদাহরণ প্রদান করি। এই পৃথক এন্ডপয়েন্টের উদাহরণগুলি নীচে [কার্ল উদাহরণ](#curl-examples) বিভাগে পাওয়া যাবে। পৃষ্ঠার আরও নীচে, আমরা একটি Geth নোড, JSON_RPC API এবং কার্ল ব্যবহার করে একটি স্মার্ট কন্ট্র্যাক্ট কম্পাইল এবং ডিপ্লয় করার জন্য একটি [এন্ড-টু-এন্ড উদাহরণ](#usage-example) প্রদান করি। + +## কার্ল উদাহরণ {#curl-examples} + +একটি Ethereum নোডে [কার্ল](https://curl.se) অনুরোধ করে JSON_RPC API ব্যবহার করার উদাহরণ নিচে দেওয়া হল। প্রতিটি উদাহরণে নির্দিষ্ট এন্ডপয়েন্টের বর্ণনা, তার প্যারামিটার, রিটার্ন টাইপ এবং এটি কীভাবে ব্যবহার করা উচিত তার একটি কার্যকরী উদাহরণ অন্তর্ভুক্ত রয়েছে। + +কার্ল অনুরোধগুলি কন্টেন্টের প্রকার সম্পর্কিত একটি ত্রুটি মেসেজ ফেরত দিতে পারে। এর কারণ হল `--data` বিকল্পটি কন্টেন্টের প্রকার `application/x-www-form-urlencoded`-এ সেট করে। যদি আপনার নোড এই বিষয়ে অভিযোগ করে, তাহলে কলের শুরুতে `-H "Content-Type: application/json"` স্থাপন করে ম্যানুয়ালি হেডার সেট করুন। উদাহরণগুলিতে URL/IP এবং পোর্টের সংমিশ্রণও অন্তর্ভুক্ত নয় যা কার্ল (curl)-কে দেওয়া শেষ আর্গুমেন্ট হতে হবে (যেমন, `127.0.0.1:8545`)। এই অতিরিক্ত ডেটা সহ একটি সম্পূর্ণ কার্ল অনুরোধ নিম্নলিখিত ফর্মটি নেয়: + +```shell +curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' 127.0.0.1:8545 +``` + +## গসিপ, স্টেট, হিস্ট্রি {#gossip-state-history} + +মুষ্টিমেয় কিছু মূল JSON-RPC পদ্ধতির জন্য Ethereum নেটওয়ার্ক থেকে ডেটা প্রয়োজন, এবং সুন্দরভাবে তিনটি প্রধান বিভাগে পড়ে: _গসিপ, স্টেট এবং হিস্ট্রি_। প্রতিটি পদ্ধতিতে যাওয়ার জন্য এই বিভাগগুলির লিঙ্কগুলি ব্যবহার করুন, বা পদ্ধতিগুলির সম্পূর্ণ তালিকা অন্বেষণ করতে বিষয়বস্তুর সারণী ব্যবহার করুন। + +### গসিপ পদ্ধতি {#gossip-methods} + +> এই পদ্ধতিগুলি চেইনের হেড ট্র্যাক করে। এইভাবে লেনদেনগুলি নেটওয়ার্কের চারপাশে তাদের পথ তৈরি করে, ব্লকগুলিতে তাদের পথ খুঁজে পায় এবং ক্লায়েন্টরা কীভাবে নতুন ব্লক সম্পর্কে জানতে পারে। + +- [eth_blockNumber](#eth_blocknumber) +- [eth_sendRawTransaction](#eth_sendrawtransaction) + +### স্টেট পদ্ধতি {#state_methods} + +> যে পদ্ধতিগুলি সঞ্চিত সমস্ত ডেটার বর্তমান অবস্থা রিপোর্ট করে। "স্টেট" একটি বড় শেয়ার করা RAM-এর মতো, এবং এতে অ্যাকাউন্টের ব্যালেন্স, চুক্তির ডেটা এবং গ্যাস অনুমান অন্তর্ভুক্ত রয়েছে। + +- [eth_getBalance](#eth_getbalance) +- [eth_getStorageAt](#eth_getstorageat) +- [eth_getTransactionCount](#eth_gettransactioncount) +- [eth_getCode](#eth_getcode) +- [eth_call](#eth_call) +- [eth_estimateGas](#eth_estimategas) + +### হিস্ট্রি পদ্ধতি {#history_methods} + +> জেনেসিসে ফিরে প্রতিটি ব্লকের ঐতিহাসিক রেকর্ড নিয়ে আসে। এটি একটি বড় অ্যাপেন্ড-অনলি ফাইলের মতো, এবং এতে সমস্ত ব্লক হেডার, ব্লক বডি, আঙ্কেল ব্লক এবং লেনদেনের রসিদ অন্তর্ভুক্ত রয়েছে। + +- [eth_getBlockTransactionCountByHash](#eth_getblocktransactioncountbyhash) +- [eth_getBlockTransactionCountByNumber](#eth_getblocktransactioncountbynumber) +- [eth_getUncleCountByBlockHash](#eth_getunclecountbyblockhash) +- [eth_getUncleCountByBlockNumber](#eth_getunclecountbyblocknumber) +- [eth_getBlockByHash](#eth_getblockbyhash) +- [eth_getBlockByNumber](#eth_getblockbynumber) +- [eth_getTransactionByHash](#eth_gettransactionbyhash) +- [eth_getTransactionByBlockHashAndIndex](#eth_gettransactionbyblockhashandindex) +- [eth_getTransactionByBlockNumberAndIndex](#eth_gettransactionbyblocknumberandindex) +- [eth_getTransactionReceipt](#eth_gettransactionreceipt) +- [eth_getUncleByBlockHashAndIndex](#eth_getunclebyblockhashandindex) +- [eth_getUncleByBlockNumberAndIndex](#eth_getunclebyblocknumberandindex) + +## JSON-RPC API প্লেগ্রাউন্ড + +API পদ্ধতিগুলি আবিষ্কার করতে এবং চেষ্টা করার জন্য আপনি [প্লেগ্রাউন্ড টুল](https://ethereum-json-rpc.com) ব্যবহার করতে পারেন। এটি আপনাকে আরও দেখায় যে কোন পদ্ধতি এবং নেটওয়ার্কগুলি বিভিন্ন নোড প্রদানকারী দ্বারা সমর্থিত। + +## JSON-RPC API পদ্ধতি {#json-rpc-methods} + +### web3_clientVersion {#web3_clientversion} + +বর্তমান ক্লায়েন্ট সংস্করণটি প্রদান করে। + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`স্ট্রিং` - বর্তমান ক্লায়েন্ট সংস্করণ + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_clientVersion","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc":"2.0", + "result": "Geth/v1.12.1-stable/linux-amd64/go1.19.1" +} +``` + +### web3_sha3 {#web3_sha3} + +প্রদত্ত ডেটার Keccak-256 (স্ট্যান্ডার্ডাইজড SHA3-256 _নয়_) রিটার্ন করে। + +**প্যারামিটার** + +1. `DATA` - একটি SHA3 হ্যাসে রূপান্তর করার জন্য ডেটা + +```js +params: ["0x68656c6c6f20776f726c64"] +``` + +**রিটার্ন** + +`DATA` - প্রদত্ত স্ট্রিংটির SHA3 ফলাফল। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"web3_sha3","params":["0x68656c6c6f20776f726c64"],"id":64}' +// Result +{ + "id":64, + "jsonrpc": "2.0", + "result": "0x47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad" +} +``` + +### net_version {#net_version} + +বর্তমান নেটওয়ার্ক আইডি রিটার্ন করে। + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`স্ট্রিং` - বর্তমান নেটওয়ার্ক আইডি। + +বর্তমান নেটওয়ার্ক আইডি-র সম্পূর্ণ তালিকা [chainlist.org](https://chainlist.org)-এ উপলব্ধ। কিছু সাধারণ হল: + +- `1`: Ethereum মেইননেট +- `11155111`: Sepolia টেস্টনেট +- `560048` : Hoodi টেস্টনেট + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"net_version","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc": "2.0", + "result": "3" +} +``` + +### net_listening {#net_listening} + +ক্লায়েন্ট যদি সক্রিয়ভাবে নেটওয়ার্ক সংযোগের জন্য শুনছে তাহলে `সত্য` রিটার্ন করে। + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`বুলিয়ান` - শোনার সময় `সত্য`, অন্যথায় `মিথ্যা`। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"net_listening","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc":"2.0", + "result":true +} +``` + +### net_peerCount {#net_peercount} + +বর্তমানে ক্লায়েন্টের সাথে সংযুক্ত পিয়ারদের সংখ্যা রিটার্ন করে। + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`কোয়ান্টিটি` - সংযুক্ত পিয়ারদের সংখ্যার পূর্ণসংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":74}' +// Result +{ + "id":74, + "jsonrpc": "2.0", + "result": "0x2" // 2 +} +``` + +### eth_protocolVersion {#eth_protocolversion} + +বর্তমান Ethereum প্রোটোকল সংস্করণ রিটার্ন করে। মনে রাখবেন এই পদ্ধতিটি [Geth-এ উপলব্ধ নয়](https://github.com/ethereum/go-ethereum/pull/22064#issuecomment-788682924)৷ + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`স্ট্রিং` - বর্তমান Ethereum প্রোটোকল সংস্করণ + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_protocolVersion","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc": "2.0", + "result": "54" +} +``` + +### eth_syncing {#eth_syncing} + +সিঙ্ক স্ট্যাটাস সম্পর্কে ডেটা সহ একটি অবজেক্ট বা `মিথ্যা` রিটার্ন করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +সঠিক রিটার্ন ডেটা ক্লায়েন্ট প্রয়োগের মধ্যে ভিন্ন হয়। নোড সিঙ্ক না করার সময় সমস্ত ক্লায়েন্ট `মিথ্যা` রিটার্ন করে, এবং সমস্ত ক্লায়েন্ট নিম্নলিখিত ক্ষেত্রগুলি রিটার্ন করে। + +`অবজেক্ট|বুলিয়ান`, সিঙ্ক স্ট্যাটাস ডেটা সহ একটি অবজেক্ট বা `মিথ্যা`, যখন সিঙ্ক হচ্ছে না: + +- `স্টার্টিংব্লক`: `কোয়ান্টিটি` - যে ব্লকে ইম্পোর্ট শুরু হয়েছিল (শুধুমাত্র রিসেট করা হবে, সিঙ্ক তার হেডে পৌঁছানোর পরে) +- `কারেন্টব্লক`: `কোয়ান্টিটি` - বর্তমান ব্লক, eth_blockNumber-এর মতোই +- `হাইয়েস্টব্লক`: `কোয়ান্টিটি` - আনুমানিক সর্বোচ্চ ব্লক + +যাইহোক, পৃথক ক্লায়েন্টরা অতিরিক্ত ডেটাও সরবরাহ করতে পারে। উদাহরণস্বরূপ Geth নিম্নলিখিতটি রিটার্ন করে: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "currentBlock": "0x3cf522", + "healedBytecodeBytes": "0x0", + "healedBytecodes": "0x0", + "healedTrienodes": "0x0", + "healingBytecode": "0x0", + "healingTrienodes": "0x0", + "highestBlock": "0x3e0e41", + "startingBlock": "0x3cbed5", + "syncedAccountBytes": "0x0", + "syncedAccounts": "0x0", + "syncedBytecodeBytes": "0x0", + "syncedBytecodes": "0x0", + "syncedStorage": "0x0", + "syncedStorageBytes": "0x0" + } +} +``` + +যেখানে Besu রিটার্ন করে: + +```json +{ + "jsonrpc": "2.0", + "id": 51, + "result": { + "startingBlock": "0x0", + "currentBlock": "0x1518", + "highestBlock": "0x9567a3", + "pulledStates": "0x203ca", + "knownStates": "0x200636" + } +} +``` + +আরো বিস্তারিত জানার জন্য আপনার নির্দিষ্ট ক্লায়েন্টের জন্য ডকুমেন্টেশন পড়ুন। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": { + startingBlock: '0x384', + currentBlock: '0x386', + highestBlock: '0x454' + } +} +// Or when not syncing +{ + "id":1, + "jsonrpc": "2.0", + "result": false +} +``` + +### eth_coinbase {#eth_coinbase} + +ক্লায়েন্ট কয়েনবেস অ্যাড্রেস রিটার্ন করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +> **নোট:** এই পদ্ধতিটি **v1.14.0** থেকে অবচিত হয়েছে এবং আর সমর্থিত নয়। এই পদ্ধতিটি ব্যবহার করার চেষ্টা করলে একটি "মেথড নট সাপোর্টেড" ত্রুটি দেখা দেবে। + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`DATA`, 20 বাইট - বর্তমান কয়েনবেস অ্যাড্রেস। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_coinbase","params":[],"id":64}' +// Result +{ + "id":64, + "jsonrpc": "2.0", + "result": "0x407d73d8a49eeb85d32cf465507dd71d507100c1" +} +``` + +### eth_chainId {#eth_chainId} + +রিপ্লে-সুরক্ষিত লেনদেন স্বাক্ষর করার জন্য ব্যবহৃত চেইন আইডি রিটার্ন করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`chainId`, বর্তমান চেইন আইডি-র পূর্ণসংখ্যাকে প্রতিনিধিত্বকারী স্ট্রিং হিসাবে হেক্সাডেসিমেল মান। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":67}' +// Result +{ + "id":67, + "jsonrpc": "2.0", + "result": "0x1" +} +``` + +### eth_mining {#eth_mining} + +ক্লায়েন্ট সক্রিয়ভাবে নতুন ব্লক মাইনিং করলে `সত্য` রিটার্ন করে। এটি শুধুমাত্র প্রুফ-অফ-ওয়ার্ক নেটওয়ার্কের জন্য `সত্য` রিটার্ন করতে পারে এবং [দ্য মার্জ](/roadmap/merge/) থেকে কিছু ক্লায়েন্টে উপলব্ধ নাও হতে পারে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`বুলিয়ান` - ক্লায়েন্ট মাইনিং করলে `সত্য` রিটার্ন করে, অন্যথায় `মিথ্যা`। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_mining","params":[],"id":71}' +// +{ + "id":71, + "jsonrpc": "2.0", + "result": true +} +``` + +### eth_hashrate {#eth_hashrate} + +নোডটি প্রতি সেকেন্ডে কতগুলি হ্যাস মাইনিং করছে তার সংখ্যা রিটার্ন করে। এটি শুধুমাত্র প্রুফ-অফ-ওয়ার্ক নেটওয়ার্কের জন্য `সত্য` রিটার্ন করতে পারে এবং [দ্য মার্জ](/roadmap/merge/) থেকে কিছু ক্লায়েন্টে উপলব্ধ নাও হতে পারে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`কোয়ান্টিটি` - প্রতি সেকেন্ডে হ্যাসের সংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_hashrate","params":[],"id":71}' +// Result +{ + "id":71, + "jsonrpc": "2.0", + "result": "0x38a" +} +``` + +### eth_gasPrice {#eth_gasprice} + +wei-তে প্রতি গ্যাসের বর্তমান মূল্যের একটি অনুমান প্রদান করে। উদাহরণস্বরূপ, Besu ক্লায়েন্ট শেষ 100টি ব্লক পরীক্ষা করে এবং ডিফল্টভাবে মধ্যম গ্যাস ইউনিট মূল্য রিটার্ন করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`কোয়ান্টিটি` - wei-তে বর্তমান গ্যাস মূল্যের পূর্ণসংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}' +// Result +{ + "id":73, + "jsonrpc": "2.0", + "result": "0x1dfd14000" // 8049999872 Wei +} +``` + +### eth_accounts {#eth_accounts} + +ক্লায়েন্টের মালিকানাধীন অ্যাড্রেসগুলির একটি তালিকা রিটার্ন করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`DATA-এর অ্যারে`, 20 বাইট - ক্লায়েন্টের মালিকানাধীন অ্যাড্রেস। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": ["0x407d73d8a49eeb85d32cf465507dd71d507100c1"] +} +``` + +### eth_blockNumber {#eth_blocknumber} + +সবচেয়ে সাম্প্রতিক ব্লকের সংখ্যা প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +কোনটি না + +**রিটার্ন** + +`কোয়ান্টিটি` - ক্লায়েন্ট যে বর্তমান ব্লক নম্বরে আছে তার পূর্ণসংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":83}' +// Result +{ + "id":83, + "jsonrpc": "2.0", + "result": "0x4b7" // 1207 +} +``` + +### eth_getBalance {#eth_getbalance} + +একটি নির্দিষ্ট অ্যাড্রেসে অ্যাকাউন্টের ব্যালেন্স প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 20 বাইট - ব্যালেন্স পরীক্ষা করার জন্য অ্যাড্রেস। +2. `কোয়ান্টিটি|ট্যাগ` - পূর্ণসংখ্যা ব্লক নম্বর, অথবা `"লেটেস্ট"`, `"আর্লিয়েস্ট"`, `"পেন্ডিং"`, `"সেফ"`, বা `"ফাইনালইজড"` স্ট্রিং, [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter) দেখুন + +```js +params: ["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"] +``` + +**রিটার্ন** + +`কোয়ান্টিটি` - wei-তে বর্তমান ব্যালেন্সের পূর্ণসংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1", "latest"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x0234c8a3397aab58" // 158972490234375000 +} +``` + +### eth_getStorageAt {#eth_getstorageat} + +একটি প্রদত্ত অ্যাড্রেসের একটি স্টোরেজ অবস্থান থেকে মান প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 20 বাইট - স্টোরেজের অ্যাড্রেস। +2. `কোয়ান্টিটি` - স্টোরেজের অবস্থানের পূর্ণসংখ্যা। +3. `কোয়ান্টিটি|ট্যাগ` - পূর্ণসংখ্যা ব্লক নম্বর, অথবা `"লেটেস্ট"`, `"আর্লিয়েস্ট"`, `"পেন্ডিং"`, `"সেফ"`, `"ফাইনালইজড"` স্ট্রিং, [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter) দেখুন + +**রিটার্ন** + +`DATA` - এই স্টোরেজ অবস্থানে মান। + +**উদাহরণ** +সঠিক অবস্থান গণনা করা পুনরুদ্ধার করার জন্য স্টোরেজের উপর নির্ভর করে। অ্যাড্রেস `0x391694e7e0b0cce554cb130d723a9d27458f9298` দ্বারা `0x295a70b2de5e3953354a6a8344e616ed314d7251`-এ ডিপ্লয় করা নিম্নলিখিত চুক্তিটি বিবেচনা করুন। + +``` +contract Storage { + uint pos0; + mapping(address => uint) pos1; + constructor() { + pos0 = 1234; + pos1[msg.sender] = 5678; + } +} +``` + +pos0-এর মান পুনরুদ্ধার করা সহজ: + +```js +curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 +{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"} +``` + +মানচিত্রের একটি উপাদান পুনরুদ্ধার করা আরও কঠিন। মানচিত্রে একটি উপাদানের অবস্থান গণনা করা হয়: + +```js +keccak(LeftPad32(key, 0), LeftPad32(map position, 0)) +``` + +এর মানে হল pos1["0x391694e7e0b0cce554cb130d723a9d27458f9298"]-এ স্টোরেজ পুনরুদ্ধার করতে আমাদের এর সাথে অবস্থান গণনা করতে হবে: + +```js +keccak( + decodeHex( + "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + + "0000000000000000000000000000000000000000000000000000000000000001" + ) +) +``` + +web3 লাইব্রেরির সাথে আসা geth কনসোলটি গণনা করার জন্য ব্যবহার করা যেতে পারে: + +```js +> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" +undefined +> web3.sha3(key, {"encoding": "hex"}) +"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9" +``` + +এখন স্টোরেজ আনতে: + +```js +curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545 +{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"} +``` + +### eth_getTransactionCount {#eth_gettransactioncount} + +একটি অ্যাড্রেস থেকে _প্রেরিত_ লেনদেনের সংখ্যা প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 20 বাইট - অ্যাড্রেস। +2. `কোয়ান্টিটি|ট্যাগ` - পূর্ণসংখ্যা ব্লক নম্বর, অথবা `"লেটেস্ট"`, `"আর্লিয়েস্ট"`, `"পেন্ডিং"`, `"সেফ"` বা `"ফাইনালইজড"` স্ট্রিং, [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter) দেখুন + +```js +params: [ + "0x407d73d8a49eeb85d32cf465507dd71d507100c1", + "latest", // সর্বশেষ ব্লকের অবস্থা +] +``` + +**রিটার্ন** + +`QUANTITY` - এই অ্যাড্রেস থেকে পাঠানো ট্রানজ্যাকশনের সংখ্যার পূর্ণসংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x407d73d8a49eeb85d32cf465507dd71d507100c1","latest"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_getBlockTransactionCountByHash {#eth_getblocktransactioncountbyhash} + +প্রদত্ত ব্লক হ্যাসের সাথে মিলে যাওয়া একটি ব্লক থেকে একটি ব্লকের লেনদেনের সংখ্যা প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 32 বাইট - একটি ব্লকের হ্যাস + +```js +params: ["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"] +``` + +**রিটার্ন** + +`কোয়ান্টিটি` - এই ব্লকের লেনদেনের সংখ্যার পূর্ণসংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByHash","params":["0xd03ededb7415d22ae8bac30f96b2d1de83119632693b963642318d87d1bece5b"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x8b" // 139 +} +``` + +### eth_getBlockTransactionCountByNumber {#eth_getblocktransactioncountbynumber} + +প্রদত্ত ব্লক নম্বর মিলে যাওয়া একটি ব্লকের লেনদেনের সংখ্যা প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `কোয়ান্টিটি|ট্যাগ` - একটি ব্লক নম্বরের পূর্ণসংখ্যা, বা `"আর্লিয়েস্ট"`, `"লেটেস্ট"`, `"পেন্ডিং"`, `"সেফ"` বা `"ফাইনালইজড"` স্ট্রিং, যেমন [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter)-এ। + +```js +params: [ + "0x13738ca", // 20396234 +] +``` + +**রিটার্ন** + +`কোয়ান্টিটি` - এই ব্লকের লেনদেনের সংখ্যার পূর্ণসংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockTransactionCountByNumber","params":["0x13738ca"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x8b" // 139 +} +``` + +### eth_getUncleCountByBlockHash {#eth_getunclecountbyblockhash} + +প্রদত্ত ব্লক হ্যাসের সাথে মিলে যাওয়া একটি ব্লক থেকে আঙ্কেল সংখ্যা প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 32 বাইট - একটি ব্লকের হ্যাস + +```js +params: ["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"] +``` + +**রিটার্ন** + +`কোয়ান্টিটি` - এই ব্লকের আঙ্কেলদের সংখ্যার পূর্ণসংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockHash","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_getUncleCountByBlockNumber {#eth_getunclecountbyblocknumber} + +প্রদত্ত ব্লক নম্বর মিলে যাওয়া একটি ব্লক থেকে আঙ্কেলদের সংখ্যা প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `কোয়ান্টিটি|ট্যাগ` - একটি ব্লক নম্বরের পূর্ণসংখ্যা, বা `"লেটেস্ট"`, `"আর্লিয়েস্ট"`, `"পেন্ডিং"`, `"সেফ"` বা `"ফাইনালইজড"` স্ট্রিং, যেমন [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter) -এ + +```js +params: [ + "0xe8", // 232 +] +``` + +**রিটার্ন** + +`কোয়ান্টিটি` - এই ব্লকের আঙ্কেলদের সংখ্যার পূর্ণসংখ্যা। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleCountByBlockNumber","params":["0xe8"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x0" // 0 +} +``` + +### eth_getCode {#eth_getcode} + +একটি প্রদত্ত অ্যাড্রেসে কোড রিটার্ন করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 20 বাইট - অ্যাড্রেস +2. `কোয়ান্টিটি|ট্যাগ` - পূর্ণসংখ্যা ব্লক নম্বর, অথবা `"লেটেস্ট"`, `"আর্লিয়েস্ট"`, `"পেন্ডিং"`, `"সেফ"` বা `"ফাইনালইজড"` স্ট্রিং, [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter) দেখুন + +```js +params: [ + "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "0x5daf3b", // 6139707 +] +``` + +**রিটার্ন** + +`DATA` - প্রদত্ত অ্যাড্রেস থেকে কোড। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getCode","params":["0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "0x5daf3b"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029" +} +``` + +### eth_sign {#eth_sign} + +সাইন পদ্ধতি একটি Ethereum নির্দিষ্ট স্বাক্ষর গণনা করে: `sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message)))`। + +মেসেজের সাথে একটি উপসর্গ যুক্ত করার মাধ্যমে গণনা করা স্বাক্ষরটিকে একটি Ethereum নির্দিষ্ট স্বাক্ষর হিসাবে স্বীকৃত করে। এটি অপব্যবহার রোধ করে যেখানে একটি ক্ষতিকর ডিএ্যাপ অবাধ ডেটা (যেমন, ট্রানজ্যাকশন) সাইন করতে পারে এবং শিকারকে ছদ্মবেশ ধারণ করার জন্য স্বাক্ষর ব্যবহার করতে পারে। + +দ্রষ্টব্য: স্বাক্ষর করার জন্য অ্যাড্রেস আনলক করা আবশ্যক। + +**প্যারামিটার** + +1. `DATA`, 20 বাইট - অ্যাড্রেস +2. `DATA`, N বাইট - স্বাক্ষর করার জন্য মেসেজ + +**রিটার্ন** + +`DATA`: স্বাক্ষর + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sign","params":["0x9b2055d370f73ec7d8a03e965129118dc8f5bf83", "0xdeadbeaf"],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b" +} +``` + +### eth_signTransaction {#eth_signtransaction} + +একটি লেনদেন স্বাক্ষর করে যা পরবর্তী সময়ে [eth_sendRawTransaction](#eth_sendrawtransaction) ব্যবহার করে নেটওয়ার্কে জমা দেওয়া যেতে পারে। + +**প্যারামিটার** + +1. `অবজেক্ট` - লেনদেনের অবজেক্ট + +- `টাইপ`: +- `from`: `DATA`, 20 বাইট - যে অ্যাড্রেস থেকে লেনদেন পাঠানো হয়েছে। +- `to`: `DATA`, 20 বাইট - (নতুন চুক্তি তৈরি করার সময় ঐচ্ছিক) যে অ্যাড্রেসে লেনদেনটি নির্দেশিত হয়েছে। +- `গ্যাস`: `কোয়ান্টিটি` - (ঐচ্ছিক, ডিফল্ট: 90000) লেনদেন সম্পাদনের জন্য প্রদত্ত গ্যাসের পূর্ণসংখ্যা। এটি অব্যবহৃত গ্যাস ফেরত দেবে। +- `gasPrice`: `কোয়ান্টিটি` - (ঐচ্ছিক, ডিফল্ট: নির্ধারণ করা হবে) প্রতি প্রদত্ত গ্যাসের জন্য ব্যবহৃত gasPrice-এর পূর্ণসংখ্যা, Wei-তে। +- `value`: `কোয়ান্টিটি` - (ঐচ্ছিক) এই লেনদেনের সাথে প্রেরিত মূল্যের পূর্ণসংখ্যা, Wei-তে। +- `data`: `DATA` - একটি চুক্তির সংকলিত কোড অথবা আহূত পদ্ধতি স্বাক্ষরের হ্যাস এবং এনকোড করা প্যারামিটার। +- `nonce`: `কোয়ান্টিটি` - (ঐচ্ছিক) একটি ননসের পূর্ণসংখ্যা। এটি আপনাকে একই নন্স ব্যবহারকারী আপনার নিজের পেন্ডিং লেনদেনগুলি ওভাররাইট করার অনুমতি দেয়। + +**রিটার্ন** + +`DATA`, নির্দিষ্ট অ্যাকাউন্ট দ্বারা স্বাক্ষরিত RLP-এনকোডেড লেনদেন অবজেক্ট। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"id": 1,"jsonrpc": "2.0","method": "eth_signTransaction","params": [{"data":"0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675","from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155","gas": "0x76c0","gasPrice": "0x9184e72a000","to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567","value": "0x9184e72a"}]}' +// Result +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0xa3f20717a250c2b0b729b7e5becbff67fdaef7e0699da4de7ca5895b02a170a12d887fd3b17bfdce3481f10bea41f45ba9f709d39ce8325427b57afcfc994cee1b" +} +``` + +### eth_sendTransaction {#eth_sendtransaction} + +নতুন মেসেজ কল লেনদেন বা একটি চুক্তি তৈরি করে, যদি ডেটা ক্ষেত্রে কোড থাকে এবং `from`-এ নির্দিষ্ট অ্যাকাউন্ট ব্যবহার করে এটি স্বাক্ষর করে। + +**প্যারামিটার** + +1. `অবজেক্ট` - লেনদেনের অবজেক্ট + +- `from`: `DATA`, 20 বাইট - যে অ্যাড্রেস থেকে লেনদেন পাঠানো হয়েছে। +- `to`: `DATA`, 20 বাইট - (নতুন চুক্তি তৈরি করার সময় ঐচ্ছিক) যে অ্যাড্রেসে লেনদেনটি নির্দেশিত হয়েছে। +- `গ্যাস`: `কোয়ান্টিটি` - (ঐচ্ছিক, ডিফল্ট: 90000) লেনদেন সম্পাদনের জন্য প্রদত্ত গ্যাসের পূর্ণসংখ্যা। এটি অব্যবহৃত গ্যাস ফেরত দেবে। +- `gasPrice`: `কোয়ান্টিটি` - (ঐচ্ছিক, ডিফল্ট: নির্ধারণ করা হবে) প্রতি প্রদত্ত গ্যাসের জন্য ব্যবহৃত gasPrice-এর পূর্ণসংখ্যা। +- `value`: `কোয়ান্টিটি` - (ঐচ্ছিক) এই লেনদেনের সাথে প্রেরিত মূল্যের পূর্ণসংখ্যা। +- `input`: `DATA` - একটি চুক্তির সংকলিত কোড অথবা আহূত পদ্ধতি স্বাক্ষরের হ্যাস এবং এনকোড করা প্যারামিটার। +- `nonce`: `কোয়ান্টিটি` - (ঐচ্ছিক) একটি ননসের পূর্ণসংখ্যা। এটি আপনাকে একই নন্স ব্যবহারকারী আপনার নিজের পেন্ডিং লেনদেনগুলি ওভাররাইট করার অনুমতি দেয়। + +```js +params: [ + { + from: "0xb60e8dd61c5d32be8058bb8eb970870f07233155", + to: "0xd46e8dd67c5d32be8058bb8eb970870f07244567", + gas: "0x76c0", // 30400 + gasPrice: "0x9184e72a000", // 10000000000000 + value: "0x9184e72a", // 2441406250 + input: + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", + }, +] +``` + +**রিটার্ন** + +`DATA`, 32 বাইট - লেনদেনের হ্যাস, অথবা শূন্য হ্যাস যদি লেনদেন এখনও উপলব্ধ না হয়। + +আপনি যখন একটি চুক্তি তৈরি করেন, তখন একটি ব্লকে লেনদেন প্রস্তাবিত হওয়ার পরে, চুক্তির অ্যাড্রেস পেতে [eth_getTransactionReceipt](#eth_gettransactionreceipt) ব্যবহার করুন। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{see above}],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + +### eth_sendRawTransaction {#eth_sendrawtransaction} + +স্বাক্ষরিত লেনদেনের জন্য নতুন মেসেজ কল লেনদেন বা একটি চুক্তি তৈরি করে। + +**প্যারামিটার** + +1. `DATA`, স্বাক্ষরিত লেনদেন ডেটা। + +```js +params: [ + "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675", +] +``` + +**রিটার্ন** + +`DATA`, 32 বাইট - লেনদেনের হ্যাস, অথবা শূন্য হ্যাস যদি লেনদেন এখনও উপলব্ধ না হয়। + +আপনি যখন একটি চুক্তি তৈরি করেন, তখন একটি ব্লকে লেনদেন প্রস্তাবিত হওয়ার পরে, চুক্তির অ্যাড্রেস পেতে [eth_getTransactionReceipt](#eth_gettransactionreceipt) ব্যবহার করুন। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_sendRawTransaction","params":[{see above}],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331" +} +``` + +### eth_call {#eth_call} + +ব্লকচেইনে একটি লেনদেন তৈরি না করেই অবিলম্বে একটি নতুন মেসেজ কল কার্যকর করে। প্রায়শই শুধুমাত্র পঠনযোগ্য স্মার্ট কন্ট্র্যাক্ট ফাংশনগুলি কার্যকর করার জন্য ব্যবহৃত হয়, উদাহরণস্বরূপ একটি ERC-20 চুক্তির জন্য `balanceOf`। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `অবজেক্ট` - লেনদেন কল অবজেক্ট + +- `from`: `DATA`, 20 বাইট - (ঐচ্ছিক) যে অ্যাড্রেস থেকে লেনদেন পাঠানো হয়েছে। +- `to`: `DATA`, 20 বাইট - যে অ্যাড্রেসে লেনদেনটি নির্দেশিত হয়েছে। +- `গ্যাস`: `কোয়ান্টিটি` - (ঐচ্ছিক) লেনদেন সম্পাদনের জন্য প্রদত্ত গ্যাসের পূর্ণসংখ্যা। eth_call শূন্য গ্যাস খরচ করে, কিন্তু কিছু এক্সিকিউশনের জন্য এই প্যারামিটারের প্রয়োজন হতে পারে। +- `gasPrice`: `কোয়ান্টিটি` - (ঐচ্ছিক) প্রতিটি প্রদত্ত গ্যাসের জন্য ব্যবহৃত gasPrice-এর পূর্ণসংখ্যা +- `value`: `কোয়ান্টিটি` - (ঐচ্ছিক) এই লেনদেনের সাথে প্রেরিত মূল্যের পূর্ণসংখ্যা +- `input`: `DATA` - (ঐচ্ছিক) পদ্ধতি স্বাক্ষরের হ্যাস এবং এনকোড করা প্যারামিটার। বিস্তারিত জানার জন্য সলিডিটি ডকুমেন্টেশনে [Ethereum চুক্তি ABI](https://docs.soliditylang.org/en/latest/abi-spec.html) দেখুন। + +2. `কোয়ান্টিটি|ট্যাগ` - পূর্ণসংখ্যা ব্লক নম্বর, অথবা `"লেটেস্ট"`, `"আর্লিয়েস্ট"`, `"পেন্ডিং"`, `"সেফ"` বা `"ফাইনালইজড"` স্ট্রিং, [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter) দেখুন + +**রিটার্ন** + +`DATA` - সম্পাদিত চুক্তির রিটার্ন ভ্যালু। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_call","params":[{see above}],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x" +} +``` + +### eth_estimateGas {#eth_estimategas} + +লেনদেনটি সম্পূর্ণ করার জন্য কতটা গ্যাস প্রয়োজন তার একটি অনুমান তৈরি করে এবং ফেরত দেয়। লেনদেনটি ব্লকচেইনে যুক্ত হবে না। মনে রাখবেন যে অনুমানটি লেনদেনের দ্বারা প্রকৃতপক্ষে ব্যবহৃত গ্যাসের পরিমাণের চেয়ে উল্লেখযোগ্যভাবে বেশি হতে পারে, যার মধ্যে EVM মেকানিক্স এবং নোডের কর্মক্ষমতা সহ বিভিন্ন কারণে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +[eth_call](#eth_call) প্যারামিটারগুলি দেখুন, তবে সমস্ত বৈশিষ্ট্য ঐচ্ছিক। যদি কোনো গ্যাস সীমা নির্দিষ্ট করা না থাকে, তাহলে geth পেন্ডিং ব্লক থেকে ব্লক গ্যাস সীমাটিকে একটি ঊর্ধ্ব সীমা হিসেবে ব্যবহার করে। ফলস্বরূপ, যখন গ্যাসের পরিমাণ পেন্ডিং ব্লক গ্যাস লিমিটের চেয়ে বেশি হয়, তখন ফেরত আসা অনুমানটি কল/ট্রানজ্যাকশন এক্সিকিউট করার জন্য যথেষ্ট নাও হতে পারে। + +**রিটার্ন** + +`কোয়ান্টিটি` - ব্যবহৃত গ্যাসের পরিমাণ। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{see above}],"id":1}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x5208" // 21000 +} +``` + +### eth_getBlockByHash {#eth_getblockbyhash} + +হ্যাসের মাধ্যমে একটি ব্লক সম্পর্কে তথ্য প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 32 বাইট - একটি ব্লকের হ্যাস। +2. `বুলিয়ান` - যদি `সত্য` হয় তবে এটি সম্পূর্ণ লেনদেন অবজেক্টগুলি প্রদান করে, যদি `মিথ্যা` হয় তবে শুধুমাত্র লেনদেনের হ্যাসগুলি প্রদান করে। + +```js +params: [ + "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", + false, +] +``` + +**রিটার্ন** + +`অবজেক্ট` - একটি ব্লক অবজেক্ট, অথবা যখন কোনো ব্লক পাওয়া যায়নি তখন `null`: + +- `number`: `কোয়ান্টিটি` - ব্লক নম্বর। যখন এর পেন্ডিং ব্লক থাকে তখন `null`। +- `hash`: `DATA`, 32 বাইট - ব্লকের হ্যাস। যখন এর পেন্ডিং ব্লক থাকে তখন `null`। +- `parentHash`: `DATA`, 32 বাইট - প্যারেন্ট ব্লকের হ্যাস। +- `nonce`: `DATA`, 8 বাইট - জেনারেট করা প্রুফ-অফ-ওয়ার্কের হ্যাস। যখন এর পেন্ডিং ব্লক থাকে তখন `null`, প্রুফ-অফ-স্টেক ব্লকের জন্য `0x0` (দ্য মার্জ থেকে) +- `sha3Uncles`: `DATA`, 32 বাইট - ব্লকের আঙ্কেল ডেটার SHA3। +- `logsBloom`: `DATA`, 256 বাইট - ব্লকের লগগুলির জন্য ব্লুম ফিল্টার। যখন এর পেন্ডিং ব্লক থাকে তখন `null`। +- `transactionsRoot`: `DATA`, 32 বাইট - ব্লকের লেনদেন ট্রাইয়ের রুট। +- `stateRoot`: `DATA`, 32 বাইট - ব্লকের চূড়ান্ত স্টেট ট্রাইয়ের রুট। +- `receiptsRoot`: `DATA`, 32 বাইট - ব্লকের রসিদ ট্রাইয়ের রুট। +- `miner`: `DATA`, 20 বাইট - সেই সুবিধাভোগীর অ্যাড্রেস যাকে ব্লকের পুরস্কার দেওয়া হয়েছিল। +- `difficulty`: `কোয়ান্টিটি` - এই ব্লকের জন্য অসুবিধার পূর্ণসংখ্যা। +- `totalDifficulty`: `কোয়ান্টিটি` - এই ব্লক পর্যন্ত চেইনের মোট অসুবিধার পূর্ণসংখ্যা। +- `extraData`: `DATA` - এই ব্লকের "অতিরিক্ত ডেটা" ক্ষেত্র। +- `size`: `কোয়ান্টিটি` - বাইটে এই ব্লকের আকারের পূর্ণসংখ্যা। +- `gasLimit`: `কোয়ান্টিটি` - এই ব্লকে অনুমোদিত সর্বাধিক গ্যাস। +- `gasUsed`: `কোয়ান্টিটি` - এই ব্লকের সমস্ত লেনদেন দ্বারা ব্যবহৃত মোট গ্যাস। +- `timestamp`: `কোয়ান্টিটি` - ব্লকটি কখন একত্রিত হয়েছিল তার ইউনিক্স টাইমস্ট্যাম্প। +- `transactions`: `অ্যারে` - লেনদেন অবজেক্টের অ্যারে, অথবা 32 বাইট লেনদেন হ্যাস, যা শেষ প্রদত্ত প্যারামিটারের উপর নির্ভর করে। +- `uncles`: `অ্যারে` - আঙ্কেল হ্যাসের অ্যারে। + +**উদাহরণ** + +```js +// অনুরোধ +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByHash","params":["0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", false],"id":1}' +// ফলাফল +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "difficulty": "0x4ea3f27bc", + "extraData": "0x476574682f4c5649562f76312e302e302f6c696e75782f676f312e342e32", + "gasLimit": "0x1388", + "gasUsed": "0x0", + "hash": "0xdc0818cf78f21a8e70579cb46a43643f78291264dda342ae31049421c82d21ae", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "miner": "0xbb7b8287f3f0a933474a79eae42cbca977791171", + "mixHash": "0x4fffe9ae21f1c9e15207b1f472d5bbdd68c9595d461666602f2be20daf5e7843", + "nonce": "0x689056015818adbe", + "number": "0x1b4", + "parentHash": "0xe99e022112df268087ea7eafaf4790497fd21dbeeb6bd7a1721df161a6657a54", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "size": "0x220", + "stateRoot": "0xddc8b0234c2e0cad087c8b389aa7ef01f7d79b2570bccb77ce48648aa61c904d", + "timestamp": "0x55ba467c", + "totalDifficulty": "0x78ed983323d", + "transactions": [ + ], + "transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "uncles": [ + ] + } +} +``` + +### eth_getBlockByNumber {#eth_getblockbynumber} + +ব্লক নম্বর দ্বারা একটি ব্লক সম্পর্কে তথ্য প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `কোয়ান্টিটি|ট্যাগ` - একটি ব্লক নম্বরের পূর্ণসংখ্যা, বা `"আর্লিয়েস্ট"`, `"লেটেস্ট"`, `"পেন্ডিং"`, `"সেফ"` বা `"ফাইনালইজড"` স্ট্রিং, যেমন [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter)-এ। +2. `বুলিয়ান` - যদি `সত্য` হয় তবে এটি সম্পূর্ণ লেনদেন অবজেক্টগুলি প্রদান করে, যদি `মিথ্যা` হয় তবে শুধুমাত্র লেনদেনের হ্যাসগুলি প্রদান করে। + +```js +params: [ + "0x1b4", // 436 + true, +] +``` + +**রিটার্ন** +[eth_getBlockByHash](#eth_getblockbyhash) দেখুন + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x1b4", true],"id":1}' +``` + +ফলাফল দেখুন [eth_getBlockByHash](#eth_getblockbyhash) + +### eth_getTransactionByHash {#eth_gettransactionbyhash} + +লেনদেনের হ্যাসের অনুরোধে একটি লেনদেন সম্পর্কে তথ্য প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 32 বাইট - একটি লেনদেনের হ্যাস + +```js +params: ["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"] +``` + +**রিটার্ন** + +`অবজেক্ট` - একটি লেনদেন অবজেক্ট, অথবা যখন কোনো লেনদেন পাওয়া যায়নি তখন `null`: + +- `blockHash`: `DATA`, 32 বাইট - এই লেনদেনটি যে ব্লকে ছিল তার হ্যাস। `null` যখন এটি পেন্ডিং থাকে। +- `blockNumber`: `কোয়ান্টিটি` - ব্লক নম্বর যেখানে এই লেনদেনটি ছিল। `null` যখন এটি পেন্ডিং থাকে। +- `from`: `DATA`, 20 বাইট - প্রেরকের অ্যাড্রেস। +- `গ্যাস`: `কোয়ান্টিটি` - প্রেরকের দ্বারা সরবরাহ করা গ্যাস। +- `gasPrice`: `কোয়ান্টিটি` - প্রেরকের দ্বারা সরবরাহ করা গ্যাস মূল্য Wei-তে। +- `hash`: `DATA`, 32 বাইট - লেনদেনের হ্যাস। +- `input`: `DATA` - লেনদেনের সাথে প্রেরিত ডেটা। +- `nonce`: `কোয়ান্টিটি` - প্রেরকের দ্বারা এর আগে করা লেনদেনের সংখ্যা। +- `to`: `DATA`, 20 বাইট - প্রাপকের অ্যাড্রেস। `null` যখন এটি একটি চুক্তি তৈরির লেনদেন হয়। +- `transactionIndex`: `কোয়ান্টিটি` - ব্লকের লেনদেন সূচকের অবস্থানের পূর্ণসংখ্যা। `null` যখন এটি পেন্ডিং থাকে। +- `value`: `কোয়ান্টিটি` - Wei-তে স্থানান্তরিত মান। +- `v`: `কোয়ান্টিটি` - ECDSA রিকভারি আইডি +- `r`: `কোয়ান্টিটি` - ECDSA স্বাক্ষর r +- `s`: `কোয়ান্টিটি` - ECDSA স্বাক্ষর s + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b"],"id":1}' +// Result +{ + "jsonrpc":"2.0", + "id":1, + "result":{ + "blockHash":"0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", + "blockNumber":"0x5daf3b", // 6139707 + "from":"0xa7d9ddbe1f17865597fbd27ec712455208b6b76d", + "gas":"0xc350", // 50000 + "gasPrice":"0x4a817c800", // 20000000000 + "hash":"0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b", + "input":"0x68656c6c6f21", + "nonce":"0x15", // 21 + "to":"0xf02c1c8e6114b1dbe8937a39260b5b0a374432bb", + "transactionIndex":"0x41", // 65 + "value":"0xf3dbb76162000", // 4290000000000000 + "v":"0x25", // 37 + "r":"0x1b5e176d927f8e9ab405058b2d2457392da3e20f328b16ddabcebc33eaac5fea", + "s":"0x4ba69724e8f69de52f0125ad8b3c5c2cef33019bac3249e2c0a2192766d1721c" + } +} +``` + +### eth_getTransactionByBlockHashAndIndex {#eth_gettransactionbyblockhashandindex} + +ব্লক হ্যাস এবং লেনদেন সূচক অবস্থান দ্বারা একটি লেনদেন সম্পর্কে তথ্য প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 32 বাইট - একটি ব্লকের হ্যাস। +2. `কোয়ান্টিটি` - লেনদেন সূচকের অবস্থানের পূর্ণসংখ্যা। + +```js +params: [ + "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", + "0x0", // 0 +] +``` + +**রিটার্ন** +[eth_getTransactionByHash](#eth_gettransactionbyhash) দেখুন + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}' +``` + +ফলাফল দেখুন [eth_getTransactionByHash](#eth_gettransactionbyhash) + +### eth_getTransactionByBlockNumberAndIndex {#eth_gettransactionbyblocknumberandindex} + +ব্লক নম্বর এবং লেনদেন সূচক অবস্থান দ্বারা একটি লেনদেন সম্পর্কে তথ্য প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `কোয়ান্টিটি|ট্যাগ` - একটি ব্লক নম্বর, বা `"আর্লিয়েস্ট"`, `"লেটেস্ট"`, `"পেন্ডিং"`, `"সেফ"` বা `"ফাইনালইজড"` স্ট্রিং, যেমন [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter)-এ। +2. `কোয়ান্টিটি` - লেনদেন সূচক অবস্থান। + +```js +params: [ + "0x9c47cf", // 10241999 + "0x24", // 36 +] +``` + +**রিটার্ন** +[eth_getTransactionByHash](#eth_gettransactionbyhash) দেখুন + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionByBlockNumberAndIndex","params":["0x9c47cf", "0x24"],"id":1}' +``` + +ফলাফল দেখুন [eth_getTransactionByHash](#eth_gettransactionbyhash) + +### eth_getTransactionReceipt {#eth_gettransactionreceipt} + +লেনদেনের হ্যাসের মাধ্যমে একটি লেনদেনের রসিদ প্রদান করে। + +**দ্রষ্টব্য** পেন্ডিং লেনদেনের জন্য রসিদ উপলব্ধ নয়। + +**প্যারামিটার** + +1. `DATA`, 32 বাইট - একটি লেনদেনের হ্যাস + +```js +params: ["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"] +``` + +**রিটার্ন** +`অবজেক্ট` - একটি লেনদেন রসিদ অবজেক্ট, অথবা যখন কোনো রসিদ পাওয়া যায়নি তখন `null`: + +- `transactionHash `: `DATA`, 32 বাইট - লেনদেনের হ্যাস। +- `transactionIndex`: `কোয়ান্টিটি` - ব্লকের লেনদেন সূচকের অবস্থানের পূর্ণসংখ্যা। +- `blockHash`: `DATA`, 32 বাইট - এই লেনদেনটি যে ব্লকে ছিল তার হ্যাস। +- `blockNumber`: `কোয়ান্টিটি` - ব্লক নম্বর যেখানে এই লেনদেনটি ছিল। +- `from`: `DATA`, 20 বাইট - প্রেরকের অ্যাড্রেস। +- `to`: `DATA`, 20 বাইট - প্রাপকের অ্যাড্রেস। null যখন এটি একটি চুক্তি তৈরির লেনদেন হয়। +- `cumulativeGasUsed` : `কোয়ান্টিটি ` - ব্লকের মধ্যে এই লেনদেনটি কার্যকর করার সময় ব্যবহৃত মোট গ্যাসের পরিমাণ। +- `effectiveGasPrice` : `কোয়ান্টিটি` - প্রতি ইউনিট গ্যাসের জন্য প্রদত্ত বেস ফি এবং টিপের যোগফল। +- `gasUsed `: `কোয়ান্টিটি ` - শুধুমাত্র এই নির্দিষ্ট লেনদেন দ্বারা ব্যবহৃত গ্যাসের পরিমাণ। +- `contractAddress `: `DATA`, 20 বাইট - তৈরি করা চুক্তির অ্যাড্রেস, যদি লেনদেনটি একটি চুক্তি তৈরি করে থাকে, অন্যথায় `null`। +- `logs`: `অ্যারে` - লগ অবজেক্টের অ্যারে, যা এই লেনদেনটি তৈরি করেছে। +- `logsBloom`: `DATA`, 256 বাইট - হালকা ক্লায়েন্টদের জন্য সম্পর্কিত লগগুলি দ্রুত পুনরুদ্ধার করার জন্য ব্লুম ফিল্টার। +- `type`: `কোয়ান্টিটি` - লেনদেনের প্রকারের পূর্ণসংখ্যা, লেগ্যাসি লেনদেনের জন্য `0x0`, অ্যাক্সেস তালিকা প্রকারের জন্য `0x1`, ডাইনামিক ফি-র জন্য `0x2`। + +এটি _যেকোনো একটি_ রিটার্ন করে: + +- `root`: `DATA` 32 বাইটের পোস্ট-ট্রানজ্যাকশন স্টেট রুট (বাইজেন্টিয়াম-পূর্ব) +- `status`: `কোয়ান্টিটি` হয় `1` (সাফল্য) বা `0` (ব্যর্থতা) + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5"],"id":1}' +// Result +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "blockHash": + "0xa957d47df264a31badc3ae823e10ac1d444b098d9b73d204c40426e57f47e8c3", + "blockNumber": "0xeff35f", + "contractAddress": null, // string of the address if it was created + "cumulativeGasUsed": "0xa12515", + "effectiveGasPrice": "0x5a9c688d4", + "from": "0x6221a9c005f6e47eb398fd867784cacfdcfff4e7", + "gasUsed": "0xb4c8", + "logs": [{ + // logs as returned by getFilterLogs, etc. + }], + "logsBloom": "0x00...0", // 256 byte bloom filter + "status": "0x1", + "to": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "transactionHash": + "0x85d995eba9763907fdf35cd2034144dd9d53ce32cbec21349d4b12823c6860c5", + "transactionIndex": "0x66", + "type": "0x2" + } +} +``` + +### eth_getUncleByBlockHashAndIndex {#eth_getunclebyblockhashandindex} + +হ্যাস এবং আঙ্কেল ইনডেক্স পজিশন দ্বারা একটি ব্লকের আঙ্কেল সম্পর্কে তথ্য প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `DATA`, 32 বাইট - একটি ব্লকের হ্যাস। +2. `কোয়ান্টিটি` - আঙ্কেলের সূচক অবস্থান। + +```js +params: [ + "0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", + "0x0", // 0 +] +``` + +**রিটার্ন** +[eth_getBlockByHash](#eth_getblockbyhash) দেখুন + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockHashAndIndex","params":["0x1d59ff54b1eb26b013ce3cb5fc9dab3705b415a67127a003c3e61eb445bb8df2", "0x0"],"id":1}' +``` + +ফলাফল দেখুন [eth_getBlockByHash](#eth_getblockbyhash) + +**দ্রষ্টব্য**: একটি আঙ্কেলের মধ্যে পৃথক লেনদেন থাকে না। + +### eth_getUncleByBlockNumberAndIndex {#eth_getunclebyblocknumberandindex} + +নম্বর এবং আঙ্কেল ইনডেক্স পজিশন দ্বারা একটি ব্লকের আঙ্কেল সম্পর্কে তথ্য প্রদান করে। + + + প্লেগ্রাউন্ডে এন্ডপয়েন্ট চেষ্টা করুন + + +**প্যারামিটার** + +1. `কোয়ান্টিটি|ট্যাগ` - একটি ব্লক নম্বর, বা `"আর্লিয়েস্ট"`, `"লেটেস্ট"`, `"পেন্ডিং"`, `"সেফ"`, `"ফাইনালইজড"` স্ট্রিং, যেমন [ব্লক প্যারামিটার](/developers/docs/apis/json-rpc/#block-parameter)-এ। +2. `কোয়ান্টিটি` - আঙ্কেলের সূচক অবস্থান। + +```js +params: [ + "0x29c", // 668 + "0x0", // 0 +] +``` + +**রিটার্ন** +[eth_getBlockByHash](#eth_getblockbyhash) দেখুন + +**দ্রষ্টব্য**: একটি আঙ্কেলের মধ্যে পৃথক লেনদেন থাকে না। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getUncleByBlockNumberAndIndex","params":["0x29c", "0x0"],"id":1}' +``` + +ফলাফল দেখুন [eth_getBlockByHash](#eth_getblockbyhash) + +### eth_newFilter {#eth_newfilter} + +ফিল্টার বিকল্পের উপর ভিত্তি করে একটি ফিল্টার অবজেক্ট তৈরি করে, যা স্টেট পরিবর্তন হলে (লগ) অবহিত করে। +স্টেট পরিবর্তিত হয়েছে কিনা তা পরীক্ষা করতে, [eth_getFilterChanges](#eth_getfilterchanges) কল করুন। + +**বিষয় ফিল্টার নির্দিষ্ট করার উপর একটি নোট:** +বিষয়গুলি ক্রম-নির্ভর। [A, B] বিষয় সহ একটি লগের সাথে একটি লেনদেন নিম্নলিখিত বিষয় ফিল্টার দ্বারা মেলানো হবে: + +- `[]` "যেকোনো কিছু" +- `[A]` "প্রথম অবস্থানে A (এবং পরে যেকোনো কিছু)" +- `[null, B]` "প্রথম অবস্থানে যেকোনো কিছু এবং দ্বিতীয় অবস্থানে B (এবং পরে যেকোনো কিছু)" +- `[A, B]` "প্রথম অবস্থানে A এবং দ্বিতীয় অবস্থানে B (এবং পরে যেকোনো কিছু)" +- `[[A, B], [A, B]]` "প্রথম অবস্থানে (A অথবা B) এবং দ্বিতীয় অবস্থানে (A অথবা B) (এবং পরে যেকোনো কিছু)" +- **প্যারামিটার** + +1. `অবজেক্ট` - ফিল্টার বিকল্পগুলি: + +- `fromBlock`: `কোয়ান্টিটি|ট্যাগ` - (ঐচ্ছিক, ডিফল্ট: `"latest"`) পূর্ণসংখ্যার ব্লক নম্বর, অথবা শেষ প্রস্তাবিত ব্লকের জন্য `"latest"`, সর্বশেষ নিরাপদ ব্লকের জন্য `"safe"`, সর্বশেষ চূড়ান্ত ব্লকের জন্য `"finalized"`, অথবা এখনও ব্লকে না থাকা লেনদেনের জন্য `"pending"`, `"earliest"`। +- `toBlock`: `কোয়ান্টিটি|ট্যাগ` - (ঐচ্ছিক, ডিফল্ট: `"latest"`) পূর্ণসংখ্যার ব্লক নম্বর, অথবা শেষ প্রস্তাবিত ব্লকের জন্য `"latest"`, সর্বশেষ নিরাপদ ব্লকের জন্য `"safe"`, সর্বশেষ চূড়ান্ত ব্লকের জন্য `"finalized"`, অথবা এখনও ব্লকে না থাকা লেনদেনের জন্য `"pending"`, `"earliest"`। +- `address`: `DATA|অ্যারে`, 20 বাইট - (ঐচ্ছিক) চুক্তির অ্যাড্রেস বা অ্যাড্রেসের একটি তালিকা যেখান থেকে লগ উৎপন্ন হওয়া উচিত। +- `topics`: `DATA-এর অ্যারে`, - (ঐচ্ছিক) 32 বাইট `DATA` বিষয়গুলির অ্যারে। বিষয়গুলি ক্রম-নির্ভর। প্রতিটি বিষয় "অথবা" বিকল্পগুলির সাথে DATA-এর একটি অ্যারেও হতে পারে। + +```js +params: [ + { + fromBlock: "0x1", + toBlock: "0x2", + address: "0x8888f1f195afa192cfee860698584c030f4c9db1", + topics: [ + "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + null, + [ + "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "0x0000000000000000000000000aff3454fce5edbc8cca8697c15331677e6ebccc", + ], + ], + }, +] +``` + +**রিটার্ন** +`কোয়ান্টিটি` - একটি ফিল্টার আইডি। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newFilter","params":[{"topics":["0x12341234"]}],"id":73}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_newBlockFilter {#eth_newblockfilter} + +নোডে একটি ফিল্টার তৈরি করে, যা নতুন ব্লক এলে অবহিত করে। +স্টেট পরিবর্তিত হয়েছে কিনা তা পরীক্ষা করতে, [eth_getFilterChanges](#eth_getfilterchanges) কল করুন। + +**প্যারামিটার** +কোনোটিই নয় + +**রিটার্ন** +`কোয়ান্টিটি` - একটি ফিল্টার আইডি। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newBlockFilter","params":[],"id":73}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_newPendingTransactionFilter {#eth_newpendingtransactionfilter} + +নোডে একটি ফিল্টার তৈরি করে, যা নতুন পেন্ডিং লেনদেন এলে অবহিত করে। +স্টেট পরিবর্তিত হয়েছে কিনা তা পরীক্ষা করতে, [eth_getFilterChanges](#eth_getfilterchanges) কল করুন। + +**প্যারামিটার** +কোনোটিই নয় + +**রিটার্ন** +`কোয়ান্টিটি` - একটি ফিল্টার আইডি। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_newPendingTransactionFilter","params":[],"id":73}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": "0x1" // 1 +} +``` + +### eth_uninstallFilter {#eth_uninstallfilter} + +প্রদত্ত আইডি সহ একটি ফিল্টার আনইনস্টল করে। যখন আর দেখার প্রয়োজন নেই তখন সর্বদা কল করা উচিত। +অতিরিক্তভাবে, ফিল্টারগুলি যখন একটি নির্দিষ্ট সময়ের জন্য [eth_getFilterChanges](#eth_getfilterchanges) দিয়ে অনুরোধ করা হয় না তখন টাইমআউট হয়ে যায়। + +**প্যারামিটার** + +1. `কোয়ান্টিটি` - ফিল্টার আইডি। + +```js +params: [ + "0xb", // 11 +] +``` + +**রিটার্ন** +`বুলিয়ান` - যদি ফিল্টারটি সফলভাবে আনইনস্টল করা হয় তবে `সত্য`, অন্যথায় `মিথ্যা`। + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_uninstallFilter","params":["0xb"],"id":73}' +// Result +{ + "id":1, + "jsonrpc": "2.0", + "result": true +} +``` + +### eth_getFilterChanges {#eth_getfilterchanges} + +একটি ফিল্টারের জন্য পোলিং পদ্ধতি, যা শেষ পোলের পর থেকে ঘটে যাওয়া লগগুলির একটি অ্যারে প্রদান করে। + +**প্যারামিটার** + +1. `কোয়ান্টিটি` - ফিল্টার আইডি। + +```js +params: [ + "0x16", // 22 +] +``` + +**রিটার্ন** +`অ্যারে` - লগ অবজেক্টের অ্যারে, অথবা যদি শেষ পোল থেকে কিছু পরিবর্তন না হয় তবে একটি খালি অ্যারে। + +- `eth_newBlockFilter` দিয়ে তৈরি ফিল্টারগুলির জন্য রিটার্ন হল ব্লক হ্যাস (`DATA`, 32 বাইট), যেমন, `["0x3454645634534..."]`। + +- `eth_newPendingTransactionFilter` দিয়ে তৈরি ফিল্টারগুলির জন্য রিটার্ন হল ট্রানজ্যাকশন হ্যাস (`DATA`, 32 বাইট), যেমন, `["0x6345343454645..."]`। + +- `eth_newFilter` দিয়ে তৈরি করা ফিল্টারের জন্য লগগুলি নিম্নলিখিত প্যারামিটার সহ অবজেক্ট: + - `removed`: `ট্যাগ` - চেইন পুনর্গঠনের কারণে লগটি সরানো হলে `সত্য`। `মিথ্যা` যদি এটি একটি বৈধ লগ হয়। + - `logIndex`: `কোয়ান্টিটি` - ব্লকের লগ সূচকের অবস্থানের পূর্ণসংখ্যা। `null` যখন এটি পেন্ডিং লগ থাকে। + - `transactionIndex`: `কোয়ান্টিটি` - লগটি যেখান থেকে তৈরি করা হয়েছে সেই লেনদেন সূচকের অবস্থানের পূর্ণসংখ্যা। `null` যখন এটি পেন্ডিং লগ থাকে। + - `transactionHash`: `DATA`, 32 বাইট - এই লগটি যেখান থেকে তৈরি করা হয়েছে সেই লেনদেনের হ্যাস। `null` যখন এটি পেন্ডিং লগ থাকে। + - `blockHash`: `DATA`, 32 বাইট - এই লগটি যে ব্লকে ছিল তার হ্যাস। `null` যখন এটি পেন্ডিং থাকে। `null` যখন এটি পেন্ডিং লগ থাকে। + - `blockNumber`: `কোয়ান্টিটি` - এই লগটি যে ব্লকে ছিল তার ব্লক নম্বর। `null` যখন এটি পেন্ডিং থাকে। `null` যখন এটি পেন্ডিং লগ থাকে। + - `address`: `DATA`, 20 বাইট - যে অ্যাড্রেস থেকে এই লগটি উৎপন্ন হয়েছে। + - `data`: `DATA` - পরিবর্তনশীল-দৈর্ঘ্যের নন-ইনডেক্সড লগ ডেটা। ( _solidity_-তে: শূন্য বা তার বেশি 32 বাইটের নন-ইনডেক্সড লগ আর্গুমেন্ট।) + - `topics`: `DATA-এর অ্যারে` - সূচিত লগ আর্গুমেন্টের 0 থেকে 4টি 32 বাইট `DATA`-এর অ্যারে। ( _solidity_-তে: প্রথম টপিকটি হল ইভেন্টের স্বাক্ষরের _হ্যাস_ (যেমন, `Deposit(address,bytes32,uint256)`), যদি না আপনি `anonymous` স্পেসিফায়ার দিয়ে ইভেন্টটি ঘোষণা করেন।) + +- **উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterChanges","params":["0x16"],"id":73}' +// Result +{ + "id":1, + "jsonrpc":"2.0", + "result": [{ + "logIndex": "0x1", // 1 + "blockNumber":"0x1b4", // 436 + "blockHash": "0x8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcfdf829c5a142f1fccd7d", + "transactionHash": "0xdf829c5a142f1fccd7d8216c5785ac562ff41e2dcfdf5785ac562ff41e2dcf", + "transactionIndex": "0x0", // 0 + "address": "0x16c5785ac562ff41e2dcfdf829c5a142f1fccd7d", + "data":"0x0000000000000000000000000000000000000000000000000000000000000000", + "topics": ["0x59ebeb90bc63057b6515673c3ecf9438e5058bca0f92585014eced636878c9a5"] + },{ + ... + }] +} +``` + +### eth_getFilterLogs {#eth_getfilterlogs} + +প্রদত্ত আইডি সহ ফিল্টারের সাথে মিলে যাওয়া সমস্ত লগের একটি অ্যারে প্রদান করে। + +**প্যারামিটার** + +1. `কোয়ান্টিটি` - ফিল্টার আইডি। + +```js +params: [ + "0x16", // 22 +] +``` + +**রিটার্ন** +[eth_getFilterChanges](#eth_getfilterchanges) দেখুন + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getFilterLogs","params":["0x16"],"id":74}' +``` + +ফলাফল দেখুন [eth_getFilterChanges](#eth_getfilterchanges) + +### eth_getLogs {#eth_getlogs} + +একটি প্রদত্ত ফিল্টার অবজেক্টের সাথে মিলে যাওয়া সমস্ত লগের একটি অ্যারে প্রদান করে। + +**প্যারামিটার** + +1. `অবজেক্ট` - ফিল্টার বিকল্পগুলি: + +- `fromBlock`: `কোয়ান্টিটি|ট্যাগ` - (ঐচ্ছিক, ডিফল্ট: `"latest"`) পূর্ণসংখ্যার ব্লক নম্বর, অথবা শেষ প্রস্তাবিত ব্লকের জন্য `"latest"`, সর্বশেষ নিরাপদ ব্লকের জন্য `"safe"`, সর্বশেষ চূড়ান্ত ব্লকের জন্য `"finalized"`, অথবা এখনও ব্লকে না থাকা লেনদেনের জন্য `"pending"`, `"earliest"`। +- `toBlock`: `কোয়ান্টিটি|ট্যাগ` - (ঐচ্ছিক, ডিফল্ট: `"latest"`) পূর্ণসংখ্যার ব্লক নম্বর, অথবা শেষ প্রস্তাবিত ব্লকের জন্য `"latest"`, সর্বশেষ নিরাপদ ব্লকের জন্য `"safe"`, সর্বশেষ চূড়ান্ত ব্লকের জন্য `"finalized"`, অথবা এখনও ব্লকে না থাকা লেনদেনের জন্য `"pending"`, `"earliest"`। +- `address`: `DATA|অ্যারে`, 20 বাইট - (ঐচ্ছিক) চুক্তির অ্যাড্রেস বা অ্যাড্রেসের একটি তালিকা যেখান থেকে লগ উৎপন্ন হওয়া উচিত। +- `topics`: `DATA-এর অ্যারে`, - (ঐচ্ছিক) 32 বাইট `DATA` বিষয়গুলির অ্যারে। বিষয়গুলি ক্রম-নির্ভর। প্রতিটি বিষয় "অথবা" বিকল্পগুলির সাথে DATA-এর একটি অ্যারেও হতে পারে। +- `blockHash`: `DATA`, 32 বাইট - (ঐচ্ছিক, **ভবিষ্যৎ**) EIP-234 যোগ করার সাথে, `blockHash` একটি নতুন ফিল্টার বিকল্প হবে যা 32-বাইট হ্যাস `blockHash`-এর সাথে একক ব্লকে প্রত্যাবর্তিত লগগুলিকে সীমাবদ্ধ করে। `blockHash` ব্যবহার করা `fromBlock` = `toBlock` = হ্যাস `blockHash`-এর সাথে ব্লক নম্বরের সমান। যদি ফিল্টার মানদণ্ডে `blockHash` উপস্থিত থাকে, তবে `fromBlock` বা `toBlock` কোনোটিরই অনুমতি নেই। + +```js +params: [ + { + topics: [ + "0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + ], + }, +] +``` + +**রিটার্ন** +[eth_getFilterChanges](#eth_getfilterchanges) দেখুন + +**উদাহরণ** + +```js +// Request +curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"topics":["0x000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b"]}],"id":74}' +``` + +ফলাফল দেখুন [eth_getFilterChanges](#eth_getfilterchanges) + +## ব্যবহারের উদাহরণ {#usage-example} + +### JSON_RPC ব্যবহার করে একটি চুক্তি ডিপ্লয় করা {#deploying-contract} + +এই বিভাগে শুধুমাত্র RPC ইন্টারফেস ব্যবহার করে কীভাবে একটি চুক্তি ডিপ্লয় করতে হয় তার একটি প্রদর্শন অন্তর্ভুক্ত রয়েছে। চুক্তি ডিপ্লয় করার জন্য বিকল্প পথ রয়েছে যেখানে এই জটিলতাটি বিমূর্ত করা হয়—উদাহরণস্বরূপ, RPC ইন্টারফেসের উপরে নির্মিত লাইব্রেরি ব্যবহার করে যেমন [web3.js](https://web3js.readthedocs.io/) এবং [web3.py](https://github.com/ethereum/web3.py)। এই বিমূর্ততাগুলি সাধারণত বোঝা সহজ এবং কম ত্রুটি-প্রবণ, তবে হুডের নীচে কী ঘটছে তা বোঝা এখনও সহায়ক। + +নিম্নলিখিতটি `Multiply7` নামক একটি সহজবোধ্য স্মার্ট কন্ট্র্যাক্ট যা একটি Ethereum নোডে JSON-RPC ইন্টারফেস ব্যবহার করে ডিপ্লয় করা হবে। এই টিউটোরিয়ালটি ধরে নেয় যে পাঠক ইতিমধ্যে একটি Geth নোড চালাচ্ছেন। নোড এবং ক্লায়েন্ট সম্পর্কে আরও তথ্য [এখানে](/developers/docs/nodes-and-clients/run-a-node) পাওয়া যায়। অ-Geth ক্লায়েন্টদের জন্য HTTP JSON-RPC কীভাবে শুরু করতে হয় তা দেখতে অনুগ্রহ করে পৃথক [ক্লায়েন্ট](/developers/docs/nodes-and-clients/) ডকুমেন্টেশন পড়ুন। বেশিরভাগ ক্লায়েন্ট ডিফল্টভাবে `localhost:8545`-এ পরিবেশন করে। + +```javascript +contract Multiply7 { + event Print(uint); + function multiply(uint input) returns (uint) { + Print(input * 7); + return input * 7; + } +} +``` + +প্রথমত, নিশ্চিত করতে হবে যে HTTP RPC ইন্টারফেস সক্ষম আছে। এর মানে আমরা স্টার্টআপে Geth-কে `--http` ফ্ল্যাগ দিয়ে সরবরাহ করি। এই উদাহরণে আমরা একটি ব্যক্তিগত উন্নয়ন চেইনে Geth নোড ব্যবহার করি। এই পদ্ধতি ব্যবহার করে আমাদের আসল নেটওয়ার্কে ইথারের প্রয়োজন নেই। + +```bash +geth --http --dev console 2>>geth.log +``` + +এটি `http://localhost:8545`-এ HTTP RPC ইন্টারফেস শুরু করবে। + +আমরা [curl](https://curl.se) ব্যবহার করে কয়েনবেস অ্যাড্রেস (অ্যাকাউন্টগুলির অ্যারে থেকে প্রথম অ্যাড্রেস প্রাপ্ত করে) এবং ব্যালেন্স পুনরুদ্ধার করে ইন্টারফেসটি চলছে কিনা তা যাচাই করতে পারি। দয়া করে মনে রাখবেন যে এই উদাহরণগুলির ডেটা আপনার স্থানীয় নোডে ভিন্ন হবে। আপনি যদি এই কমান্ডগুলি চেষ্টা করতে চান, তাহলে প্রথমটির থেকে প্রাপ্ত ফলাফল দিয়ে দ্বিতীয় কার্ল অনুরোধের অনুরোধ প্যারামিটারগুলি প্রতিস্থাপন করুন। + +```bash +curl --data '{"jsonrpc":"2.0","method":"eth_accounts","params":[], "id":1}' -H "Content-Type: application/json" localhost:8545 +{"id":1,"jsonrpc":"2.0","result":["0x9b1d35635cc34752ca54713bb99d38614f63c955"]} + +curl --data '{"jsonrpc":"2.0","method":"eth_getBalance", "params": ["0x9b1d35635cc34752ca54713bb99d38614f63c955", "latest"], "id":2}' -H "Content-Type: application/json" localhost:8545 +{"id":2,"jsonrpc":"2.0","result":"0x1639e49bba16280000"} +``` + +যেহেতু সংখ্যাগুলি হেক্স এনকোডেড, তাই ব্যালেন্সটি একটি হেক্স স্ট্রিং হিসাবে wei-তে ফেরত দেওয়া হয়। আমরা যদি সংখ্যা হিসাবে ইথারে ব্যালেন্স পেতে চাই তবে আমরা Geth কনসোল থেকে web3 ব্যবহার করতে পারি। + +```javascript +web3.fromWei("0x1639e49bba16280000", "ether") +// "410" +``` + +এখন যেহেতু আমাদের ব্যক্তিগত উন্নয়ন চেইনে কিছু ইথার আছে, আমরা চুক্তিটি ডিপ্লয় করতে পারি। প্রথম ধাপ হল Multiply7 চুক্তিটিকে বাইট কোডে কম্পাইল করা যা EVM-এ পাঠানো যেতে পারে। সলিডিটি কম্পাইলার solc ইনস্টল করতে, [সলিডিটি ডকুমেন্টেশন](https://docs.soliditylang.org/en/latest/installing-solidity.html) অনুসরণ করুন। (আপনি আমাদের উদাহরণের জন্য ব্যবহৃত কম্পাইলারের সংস্করণের সাথে মেলাতে একটি পুরানো `solc` রিলিজ ব্যবহার করতে চাইতে পারেন।) + +পরবর্তী পদক্ষেপ হল Multiply7 কন্ট্র্যাক্টকে বাইট কোডে কম্পাইল করা যা EVM-এ পাঠানো যেতে পারে। + +```bash +echo 'pragma solidity ^0.4.16; contract Multiply7 { event Print(uint); function multiply(uint input) public returns (uint) { Print(input * 7); return input * 7; } }' | solc --bin + +======= :Multiply7 ======= +Binary: +6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029 +``` + +এখন যেহেতু আমাদের কম্পাইল করা কোড আছে, আমাদের নির্ধারণ করতে হবে এটি ডিপ্লয় করতে কত গ্যাস খরচ হবে। RPC ইন্টারফেসের একটি `eth_estimateGas` পদ্ধতি রয়েছে যা আমাদের একটি অনুমান দেবে। + +```bash +curl --data '{"jsonrpc":"2.0","method": "eth_estimateGas", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 5}' -H "Content-Type: application/json" localhost:8545 +{"jsonrpc":"2.0","id":5,"result":"0x1c31e"} +``` + +এবং অবশেষে চুক্তিটি ডিপ্লয় করুন। + +```bash +curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0x9b1d35635cc34752ca54713bb99d38614f63c955", "gas": "0x1c31e", "data": "0x6060604052341561000f57600080fd5b60eb8061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60007f24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da600783026040518082815260200191505060405180910390a16007820290509190505600a165627a7a7230582040383f19d9f65246752244189b02f56e8d0980ed44e7a56c0b200458caad20bb0029"}], "id": 6}' -H "Content-Type: application/json" localhost:8545 +{"id":6,"jsonrpc":"2.0","result":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"} +``` + +লেনদেনটি নোড দ্বারা গৃহীত হয় এবং একটি লেনদেন হ্যাস ফেরত দেওয়া হয়। এই হ্যাসটি ট্রানজ্যাকশন ট্র্যাক করতে ব্যবহার করা যেতে পারে। পরবর্তী পদক্ষেপ হল আমাদের কন্ট্র্যাক্টটি কোন অ্যাড্রেসে ডিপ্লয় করা হয়েছে তা নির্ধারণ করা। প্রতিটি এক্সিকিউটেড ট্রানজ্যাকশন একটি রিসিপ্ট তৈরি করবে। এই রিসিপ্টে ট্রানজ্যাকশন সম্পর্কে বিভিন্ন তথ্য থাকে, যেমন ট্রানজ্যাকশনটি কোন ব্লকে অন্তর্ভুক্ত ছিল এবং EVM দ্বারা কতটা গ্যাস ব্যবহার করা হয়েছিল। যদি একটি ট্রানজ্যাকশন +একটি কন্ট্র্যাক্ট তৈরি করে তবে এতে কন্ট্র্যাক্ট অ্যাড্রেসও থাকবে। আমরা `eth_getTransactionReceipt` RPC পদ্ধতি ব্যবহার করে রিসিপ্টটি পুনরুদ্ধার করতে পারি। + +```bash +curl --data '{"jsonrpc":"2.0","method": "eth_getTransactionReceipt", "params": ["0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf"], "id": 7}' -H "Content-Type: application/json" localhost:8545 +{"jsonrpc":"2.0","id":7,"result":{"blockHash":"0x77b1a4f6872b9066312de3744f60020cbd8102af68b1f6512a05b7619d527a4f","blockNumber":"0x1","contractAddress":"0x4d03d617d700cf81935d7f797f4e2ae719648262","cumulativeGasUsed":"0x1c31e","from":"0x9b1d35635cc34752ca54713bb99d38614f63c955","gasUsed":"0x1c31e","logs":[],"logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","status":"0x1","to":null,"transactionHash":"0xe1f3095770633ab2b18081658bad475439f6a08c902d0915903bafff06e6febf","transactionIndex":"0x0"}} +``` + +আমাদের কন্ট্র্যাক্টটি `0x4d03d617d700cf81935d7f797f4e2ae719648262`-এ তৈরি করা হয়েছিল। একটি রিসিপ্টের পরিবর্তে একটি নাল (null) ফলাফল মানে ট্রানজ্যাকশনটি এখনও একটি ব্লকে অন্তর্ভুক্ত করা হয়নি। এক মুহূর্ত অপেক্ষা করুন এবং আপনার কনসেন্সাস ক্লায়েন্ট চলছে কিনা তা পরীক্ষা করুন এবং আবার চেষ্টা করুন। + +#### স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করা {#interacting-with-smart-contract} + +এই উদাহরণে আমরা কন্ট্র্যাক্টের `multiply` পদ্ধতিতে `eth_sendTransaction` ব্যবহার করে একটি ট্রানজ্যাকশন পাঠাব। + +`eth_sendTransaction`-এর জন্য বেশ কিছু আর্গুমেন্টের প্রয়োজন, বিশেষ করে `from`, `to` এবং `data`। `From` হল আমাদের অ্যাকাউন্টের পাবলিক অ্যাড্রেস, এবং `to` হল কন্ট্র্যাক্ট অ্যাড্রেস। `data` আর্গুমেন্টে একটি পেলোড থাকে যা নির্ধারণ করে কোন পদ্ধতিকে কোন আর্গুমেন্টের সাথে কল করতে হবে। এখানেই [ABI (অ্যাপ্লিকেশন বাইনারি ইন্টারফেস)](https://docs.soliditylang.org/en/latest/abi-spec.html) কাজে আসে। ABI হল একটি JSON ফাইল যা সংজ্ঞায়িত করে কিভাবে EVM-এর জন্য ডেটা সংজ্ঞায়িত এবং এনকোড করতে হয়। + +পেলোডের বাইটগুলি নির্ধারণ করে যে কন্ট্র্যাক্টের কোন পদ্ধতিকে কল করা হয়েছে। এটি ফাংশনের নাম এবং তার আর্গুমেন্টের প্রকারের উপর Keccak হ্যাসের প্রথম 4 বাইট, যা হেক্স এনকোডেড। multiply ফাংশন একটি uint গ্রহণ করে যা uint256-এর একটি উপনাম। এর ফলে আমরা পাই: + +```javascript +web3.sha3("multiply(uint256)").substring(0, 10) +// "0xc6888fa1" +``` + +পরবর্তী পদক্ষেপ হল আর্গুমেন্টগুলিকে এনকোড করা। এখানে শুধুমাত্র একটি uint256 আছে, ধরা যাক, মান 6। ABI-এর একটি বিভাগ রয়েছে যা নির্দিষ্ট করে কিভাবে uint256 টাইপ এনকোড করতে হয়। + +`int: enc(X)` হল X-এর বিগ-এন্ডিয়ান টু'স কমপ্লিমেন্ট এনকোডিং, যা নেগেটিভ X-এর জন্য 0xff দিয়ে এবং পজিটিভ X-এর জন্য শূন্য বাইট দিয়ে উচ্চ-ক্রম (বাম) দিকে প্যাড করা হয়, যাতে দৈর্ঘ্য 32 বাইটের গুণিতক হয়। + +এটি `0000000000000000000000000000000000000000000000000000000000000006`-এ এনকোড করে। + +ফাংশন নির্বাচক এবং এনকোড করা আর্গুমেন্ট একত্রিত করলে আমাদের ডেটা হবে `0xc6888fa10000000000000000000000000000000000000000000000000000000000000006`। + +এটি এখন নোডে পাঠানো যেতে পারে: + +```bash +curl --data '{"jsonrpc":"2.0","method": "eth_sendTransaction", "params": [{"from": "0xeb85a5557e5bdc18ee1934a89d8bb402398ee26a", "to": "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", "data": "0xc6888fa10000000000000000000000000000000000000000000000000000000000000006"}], "id": 8}' -H "Content-Type: application/json" localhost:8545 +{"id":8,"jsonrpc":"2.0","result":"0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74"} +``` + +যেহেতু একটি ট্রানজ্যাকশন পাঠানো হয়েছে, তাই একটি ট্রানজ্যাকশন হ্যাস ফেরত দেওয়া হয়েছে। রিসিপ্ট পুনরুদ্ধার করলে পাওয়া যায়: + +```javascript +{ + blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55", + blockNumber: 268, + contractAddress: null, + cumulativeGasUsed: 22631, + gasUsed: 22631, + logs: [{ + address: "0x6ff93b4b46b41c0c3c9baee01c255d3b4675963d", + blockHash: "0xbf0a347307b8c63dd8c1d3d7cbdc0b463e6e7c9bf0a35be40393588242f01d55", + blockNumber: 268, + data: "0x000000000000000000000000000000000000000000000000000000000000002a", + logIndex: 0, + topics: ["0x24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da"], + transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74", + transactionIndex: 0 + }], + transactionHash: "0x759cf065cbc22e9d779748dc53763854e5376eea07409e590c990eafc0869d74", + transactionIndex: 0 +} +``` + +রিসিপ্টটিতে একটি লগ রয়েছে। এই লগটি ট্রানজ্যাকশন এক্সিকিউশনের সময় EVM দ্বারা তৈরি করা হয়েছিল এবং রিসিপ্টে অন্তর্ভুক্ত করা হয়েছিল। `multiply` ফাংশনটি দেখায় যে ইনপুটের 7 গুণ দিয়ে `Print` ইভেন্টটি উত্থাপিত হয়েছিল। যেহেতু `Print` ইভেন্টের আর্গুমেন্টটি একটি uint256 ছিল, তাই আমরা এটিকে ABI নিয়ম অনুসারে ডিকোড করতে পারি যা আমাদের প্রত্যাশিত ডেসিমেল 42 দেবে। ডেটা ছাড়াও এটি লক্ষণীয় যে কোন ইভেন্টটি লগ তৈরি করেছে তা নির্ধারণ করতে টপিক ব্যবহার করা যেতে পারে: + +```javascript +web3.sha3("Print(uint256)") +// "24abdb5865df5079dcc5ac590ff6f01d5c16edbc5fab4e195d9febd1114503da" +``` + +এটি ছিল সবচেয়ে সাধারণ কিছু কাজের একটি সংক্ষিপ্ত পরিচিতি, যা JSON-RPC-এর সরাসরি ব্যবহার প্রদর্শন করে। + +## সম্পর্কিত বিষয় {#related-topics} + +- [JSON-RPC স্পেসিফিকেশন](http://www.jsonrpc.org/specification) +- [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) +- [JavaScript APIs](/developers/docs/apis/javascript/) +- [ব্যাকএন্ড API](/developers/docs/apis/backend/) +- [এক্সিকিউশন ক্লায়েন্ট](/developers/docs/nodes-and-clients/#execution-clients) diff --git a/public/content/translations/bn/developers/docs/blocks/index.md b/public/content/translations/bn/developers/docs/blocks/index.md new file mode 100644 index 00000000000..c476d44f25d --- /dev/null +++ b/public/content/translations/bn/developers/docs/blocks/index.md @@ -0,0 +1,153 @@ +--- +title: "ব্লক" +description: "ইথেরিয়াম ব্লকচেইনের ব্লকগুলির একটি সংক্ষিপ্ত বিবরণ – তাদের ডেটা স্ট্রাকচার, কেন তাদের প্রয়োজন এবং কীভাবে সেগুলি তৈরি করা হয়।" +lang: bn +--- + +ব্লক হলো চেইনে থাকা আগের ব্লকের একটি হ্যাস সহ লেনদেনের ব্যাচ। এটি ব্লকগুলিকে একসাথে (একটি চেইনে) লিঙ্ক করে কারণ হ্যাসগুলি ক্রিপ্টোগ্রাফিকভাবে ব্লক ডেটা থেকে উদ্ভূত হয়। এটি জালিয়াতি প্রতিরোধ করে, কারণ ইতিহাসে যেকোনো ব্লকে একটি পরিবর্তন পরবর্তী সমস্ত ব্লককে অবৈধ করে দেবে কারণ পরবর্তী সমস্ত হ্যাস পরিবর্তিত হবে এবং ব্লকচেইন পরিচালনাকারী প্রত্যেকে তা লক্ষ্য করবে। + +## পূর্বশর্ত {#prerequisites} + +ব্লক একটি খুব শিক্ষানবিস-বান্ধব বিষয়। কিন্তু আপনাকে এই পৃষ্ঠাটি আরও ভালভাবে বুঝতে সাহায্য করার জন্য, আমরা আপনাকে প্রথমে [অ্যাকাউন্ট](/developers/docs/accounts/), [লেনদেন](/developers/docs/transactions/), এবং আমাদের [ইথেরিয়ামের পরিচিতি](/developers/docs/intro-to-ethereum/) পড়ার পরামর্শ দিই। + +## কেন ব্লক? {#why-blocks} + +ইথেরিয়াম নেটওয়ার্কের সমস্ত অংশগ্রহণকারী একটি সিঙ্ক্রোনাইজড অবস্থা বজায় রাখে এবং লেনদেনের সঠিক ইতিহাসে সম্মত হয় তা নিশ্চিত করার জন্য, আমরা লেনদেনগুলিকে ব্লকে ব্যাচ করি। এর মানে হল কয়েক ডজন (বা শত শত) লেনদেন একবারে প্রতিশ্রুতিবদ্ধ, সম্মত এবং সিঙ্ক্রোনাইজ করা হয়। + +![একটি ব্লকে লেনদেন দেখানো একটি ডায়াগ্রাম যা অবস্থার পরিবর্তন ঘটায়](./tx-block.png) +_[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf) থেকে অভিযোজিত চিত্র_ + +কমিটগুলিকে ব্যবধান দিয়ে, আমরা সমস্ত নেটওয়ার্ক অংশগ্রহণকারীদের কনসেন্সাসে আসার জন্য যথেষ্ট সময় দিই: যদিও প্রতি সেকেন্ডে কয়েক ডজনবার লেনদেনের অনুরোধ ঘটে, ইথেরিয়ামে প্রতি বারো সেকেন্ডে একবারই ব্লক তৈরি এবং প্রতিশ্রুতিবদ্ধ হয়। + +## ব্লকগুলি কীভাবে কাজ করে {#how-blocks-work} + +লেনদেনের ইতিহাস সংরক্ষণ করার জন্য, ব্লকগুলিকে কঠোরভাবে অর্ডার করা হয় (তৈরি করা প্রতিটি নতুন ব্লকে তার মূল ব্লকের একটি রেফারেন্স থাকে), এবং ব্লকের মধ্যে লেনদেনগুলিও কঠোরভাবে অর্ডার করা হয়। বিরল ঘটনা ব্যতীত, যেকোনো নির্দিষ্ট সময়ে, নেটওয়ার্কের সমস্ত অংশগ্রহণকারী ব্লকের সঠিক সংখ্যা এবং ইতিহাসের বিষয়ে একমত, এবং পরবর্তী ব্লকে বর্তমান লাইভ লেনদেনের অনুরোধগুলিকে ব্যাচ করার জন্য কাজ করছে। + +নেটওয়ার্কে এলোমেলোভাবে নির্বাচিত একজন ভ্যালিডেটর দ্বারা একটি ব্লক একত্রিত হয়ে গেলে, এটি নেটওয়ার্কের বাকি অংশে প্রচারিত হয়; সমস্ত নোড এই ব্লকটিকে তাদের ব্লকচেইনের শেষে যুক্ত করে এবং পরবর্তী ব্লক তৈরি করার জন্য একজন নতুন ভ্যালিডেটর নির্বাচন করা হয়। সঠিক ব্লক-অ্যাসেম্বলি প্রক্রিয়া এবং প্রতিশ্রুতি/কনসেন্সাস প্রক্রিয়াটি বর্তমানে ইথেরিয়ামের “প্রুফ-অফ-স্টেক” প্রোটোকল দ্বারা নির্দিষ্ট করা হয়েছে। + +## প্রুফ-অফ-স্টেক প্রোটোকল {#proof-of-stake-protocol} + +প্রুফ-অফ-স্টেক মানে নিম্নলিখিত: + +- ভ্যালিডেটিং নোডগুলিকে খারাপ আচরণের বিরুদ্ধে সমান্তরাল হিসাবে একটি ডিপোজিট চুক্তিতে 32 ETH স্টেক করতে হবে। এটি নেটওয়ার্ককে সুরক্ষিত করতে সাহায্য করে কারণ প্রমাণিতভাবে অসৎ কার্যকলাপের ফলে সেই স্টেকের কিছু বা সমস্ত ধ্বংস হয়ে যায়। +- প্রতিটি স্লটে (বারো সেকেন্ডের ব্যবধানে) একজন ভ্যালিডেটরকে এলোমেলোভাবে ব্লক প্রোপোজার হিসেবে নির্বাচিত করা হয়। তারা লেনদেনগুলিকে একসাথে বান্ডিল করে, সেগুলি সম্পাদন করে এবং একটি নতুন 'অবস্থা' নির্ধারণ করে। তারা এই তথ্যটিকে একটি ব্লকে আবৃত করে এবং অন্যান্য ভ্যালিডেটরদের কাছে পাঠায়। +- অন্যান্য ভ্যালিডেটর যারা নতুন ব্লক সম্পর্কে জানতে পারে তারা লেনদেনগুলি পুনরায় কার্যকর করে তা নিশ্চিত করার জন্য যে তারা বিশ্বব্যাপী অবস্থার প্রস্তাবিত পরিবর্তনে সম্মত। ব্লকটি বৈধ বলে ধরে নিয়ে, তারা এটিকে তাদের নিজস্ব ডাটাবেসে যুক্ত করে। +- যদি একজন ভ্যালিডেটর একই স্লটের জন্য দুটি পরস্পরবিরোধী ব্লক সম্পর্কে জানতে পারে, তবে তারা তাদের ফর্ক-চয়েস অ্যালগরিদম ব্যবহার করে সবচেয়ে বেশি স্টেক করা ETH দ্বারা সমর্থিত একটি বেছে নেয়। + +[প্রুফ-অফ-স্টেক সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos) + +## একটি ব্লকের মধ্যে কী আছে? {#block-anatomy} + +একটি ব্লকের মধ্যে অনেক তথ্য থাকে। সর্বোচ্চ স্তরে একটি ব্লকে নিম্নলিখিত ক্ষেত্রগুলি থাকে: + +| ক্ষেত্র | বিবরণ | +| :--------------- | :--------------------------------------------------------- | +| `slot` | ব্লকটি যে স্লটের অন্তর্গত | +| `proposer_index` | ব্লকের প্রস্তাবকারী ভ্যালিডেটরের আইডি | +| `parent_root` | পূর্ববর্তী ব্লকের হ্যাস | +| `state_root` | স্টেট অবজেক্টের রুট হ্যাস | +| `body` | নীচে সংজ্ঞায়িত হিসাবে বিভিন্ন ক্ষেত্র ধারণকারী একটি বস্তু | + +ব্লকের `বডি`তে নিজস্ব কয়েকটি ক্ষেত্র রয়েছে: + +| ক্ষেত্র | বিবরণ | +| :------------------- | :------------------------------------------------------------------ | +| `randao_reveal` | পরবর্তী ব্লক প্রোপোজার নির্বাচন করতে ব্যবহৃত একটি মান | +| `eth1_data` | ডিপোজিট চুক্তি সম্পর্কে তথ্য | +| `graffiti` | ব্লক ট্যাগ করতে ব্যবহৃত অবাধ তথ্য | +| `proposer_slashings` | স্ল্যাশ করা হবে এমন ভ্যালিডেটরদের তালিকা | +| `attester_slashings` | স্ল্যাশ করা হবে এমন প্রত্যয়নকারীদের তালিকা | +| `attestations` | পূর্ববর্তী স্লটের বিরুদ্ধে করা প্রত্যয়নের তালিকা | +| `ডিপোজিট` | ডিপোজিট চুক্তিতে নতুন জমার তালিকা | +| `voluntary_exits` | নেটওয়ার্ক থেকে প্রস্থানকারী ভ্যালিডেটরদের তালিকা | +| `sync_aggregate` | লাইট ক্লায়েন্টদের পরিষেবা দেওয়ার জন্য ব্যবহৃত ভ্যালিডেটরদের উপসেট | +| `execution_payload` | এক্সিকিউশন ক্লায়েন্ট থেকে প্রেরিত লেনদেন | + +`attestations` ক্ষেত্রটিতে ব্লকের সমস্ত প্রত্যয়নের একটি তালিকা রয়েছে। প্রত্যয়নগুলির নিজস্ব ডেটা টাইপ রয়েছে যা বিভিন্ন ডেটা ধারণ করে। প্রতিটি প্রত্যয়নে রয়েছে: + +| ক্ষেত্র | বিবরণ | +| :----------------- | :---------------------------------------------------------- | +| `aggregation_bits` | এই প্রত্যয়নে কোন ভ্যালিডেটররা অংশ নিয়েছিল তার একটি তালিকা | +| `data` | একাধিক উপক্ষেত্র সহ একটি ধারক | +| `signature` | `data` অংশের বিরুদ্ধে এক সেট ভ্যালিডেটরের সামগ্রিক স্বাক্ষর | + +`attestation`-এর `data` ক্ষেত্রটিতে নিম্নলিখিতগুলি রয়েছে: + +| ক্ষেত্র | বিবরণ | +| :------------------ | :------------------------------------------- | +| `slot` | যে স্লটের সাথে প্রত্যয়নটি সম্পর্কিত | +| `index` | প্রত্যয়নকারী ভ্যালিডেটরদের জন্য সূচক | +| `beacon_block_root` | চেইনের হেড হিসাবে দেখা বীকন ব্লকের রুট হ্যাস | +| `উৎস` | শেষ ন্যায্য চেকপয়েন্ট | +| `target` | সর্বশেষ ইপোক বাউন্ডারি ব্লক | + +`execution_payload`-এ লেনদেন সম্পাদন করা বিশ্বব্যাপী অবস্থা আপডেট করে। সমস্ত ক্লায়েন্ট `execution_payload`-এ লেনদেনগুলি পুনরায় সম্পাদন করে তা নিশ্চিত করার জন্য যে নতুন অবস্থা নতুন ব্লকের `state_root` ক্ষেত্রের সাথে মেলে। এইভাবে ক্লায়েন্টরা বলতে পারে যে একটি নতুন ব্লক বৈধ এবং তাদের ব্লকচেইনে যোগ করার জন্য নিরাপদ। `execution payload` নিজেই বিভিন্ন ক্ষেত্র সহ একটি বস্তু। এছাড়াও একটি `execution_payload_header` রয়েছে যাতে এক্সিকিউশন ডেটা সম্পর্কে গুরুত্বপূর্ণ সংক্ষিপ্ত তথ্য থাকে। এই ডেটা স্ট্রাকচারগুলি নিম্নলিখিতভাবে সংগঠিত: + +`execution_payload_header`-এ নিম্নলিখিত ক্ষেত্রগুলি রয়েছে: + +| ক্ষেত্র | বিবরণ | +| :------------------ | :------------------------------------------------------------------- | +| `parent_hash` | প্যারেন্ট ব্লকের হ্যাস | +| `fee_recipient` | লেনদেন ফি প্রদানের জন্য অ্যাকাউন্টের ঠিকানা | +| `state_root` | এই ব্লকে পরিবর্তন প্রয়োগ করার পর বিশ্বব্যাপী অবস্থার জন্য রুট হ্যাস | +| `receipts_root` | লেনদেন রসিদ ট্রাই-এর হ্যাস | +| `logs_bloom` | ইভেন্ট লগ ধারণকারী ডেটা স্ট্রাকচার | +| `prev_randao` | এলোমেলো ভ্যালিডেটর নির্বাচনে ব্যবহৃত মান | +| `block_number` | বর্তমান ব্লকের সংখ্যা | +| `gas_limit` | এই ব্লকে অনুমোদিত সর্বোচ্চ গ্যাস | +| `gas_used` | এই ব্লকে ব্যবহৃত গ্যাসের প্রকৃত পরিমাণ | +| `timestamp` | ব্লকের সময় | +| `extra_data` | কাঁচা বাইট হিসাবে অবাধ অতিরিক্ত ডেটা | +| `base_fee_per_gas` | বেস ফি মান | +| `block_hash` | এক্সিকিউশন ব্লকের হ্যাস | +| `transactions_root` | পেলোডের লেনদেনগুলির রুট হ্যাস | +| `withdrawal_root` | পেলোডের উত্তোলনের রুট হ্যাস | + +`execution_payload` নিজেই নিম্নলিখিতগুলি ধারণ করে (লক্ষ্য করুন এটি হেডার-এর অনুরূপ, তবে লেনদেনের রুট হ্যাসের পরিবর্তে এটিতে লেনদেন এবং উত্তোলনের তথ্যের আসল তালিকা অন্তর্ভুক্ত থাকে): + +| ক্ষেত্র | বিবরণ | +| :----------------- | :------------------------------------------------------------------- | +| `parent_hash` | প্যারেন্ট ব্লকের হ্যাস | +| `fee_recipient` | লেনদেন ফি প্রদানের জন্য অ্যাকাউন্টের ঠিকানা | +| `state_root` | এই ব্লকে পরিবর্তন প্রয়োগ করার পর বিশ্বব্যাপী অবস্থার জন্য রুট হ্যাস | +| `receipts_root` | লেনদেন রসিদ ট্রাই-এর হ্যাস | +| `logs_bloom` | ইভেন্ট লগ ধারণকারী ডেটা স্ট্রাকচার | +| `prev_randao` | এলোমেলো ভ্যালিডেটর নির্বাচনে ব্যবহৃত মান | +| `block_number` | বর্তমান ব্লকের সংখ্যা | +| `gas_limit` | এই ব্লকে অনুমোদিত সর্বোচ্চ গ্যাস | +| `gas_used` | এই ব্লকে ব্যবহৃত গ্যাসের প্রকৃত পরিমাণ | +| `timestamp` | ব্লকের সময় | +| `extra_data` | কাঁচা বাইট হিসাবে অবাধ অতিরিক্ত ডেটা | +| `base_fee_per_gas` | বেস ফি মান | +| `block_hash` | এক্সিকিউশন ব্লকের হ্যাস | +| `লেনদেনসমূহ` | সম্পাদন করা হবে এমন লেনদেনের তালিকা | +| `উইথড্রয়াল` | উত্তোলন বস্তুর তালিকা | + +`withdrawals` তালিকায় `withdrawal` বস্তুগুলি নিম্নলিখিত উপায়ে গঠিত: + +| ক্ষেত্র | বিবরণ | +| :--------------- | :----------------------------------- | +| `address` | অ্যাকাউন্টের ঠিকানা যা উত্তোলন করেছে | +| `amount` | উত্তোলনের পরিমাণ | +| `index` | উত্তোলন সূচক মান | +| `validatorIndex` | ভ্যালিডেটর সূচক মান | + +## ব্লকের সময় {#block-time} + +ব্লকের সময় বলতে ব্লকগুলিকে পৃথক করার সময়কে বোঝায়। ইথেরিয়ামে, সময়কে বারো সেকেন্ডের এককে ভাগ করা হয় যাকে 'স্লট' বলা হয়। প্রতিটি স্লটে একটি ব্লক প্রস্তাব করার জন্য একজন একক ভ্যালিডেটর নির্বাচন করা হয়। ধরে নেওয়া হচ্ছে সমস্ত ভ্যালিডেটর অনলাইন এবং সম্পূর্ণ কার্যকরী, প্রতিটি স্লটে একটি ব্লক থাকবে, যার অর্থ ব্লকের সময় 12 সেকেন্ড। তবে, মাঝে মাঝে ভ্যালিডেটররা ব্লক প্রস্তাব করার জন্য ডাকলে অফলাইন থাকতে পারে, যার অর্থ স্লটগুলি কখনও কখনও খালি যেতে পারে। + +এই বাস্তবায়ন প্রুফ-অফ-ওয়ার্ক ভিত্তিক সিস্টেম থেকে ভিন্ন যেখানে ব্লকের সময় संभावনামূলক এবং প্রোটোকলের লক্ষ্য মাইনিং অসুবিধা দ্বারা সুর করা হয়। ইথেরিয়ামের [গড় ব্লক সময়](https://etherscan.io/chart/blocktime) এর একটি নিখুঁত উদাহরণ যেখানে প্রুফ-অফ-ওয়ার্ক থেকে প্রুফ-অফ-স্টেক-এ রূপান্তরটি নতুন ১২ সেকেন্ডের ব্লক সময়ের ধারাবাহিকতার উপর ভিত্তি করে স্পষ্টভাবে অনুমান করা যেতে পারে। + +## ব্লকের আকার {#block-size} + +একটি চূড়ান্ত গুরুত্বপূর্ণ দ্রষ্টব্য হলো ব্লকগুলি নিজেরাই আকারে সীমাবদ্ধ। প্রতিটি ব্লকের একটি লক্ষ্য আকার 30 মিলিয়ন গ্যাস কিন্তু নেটওয়ার্কের চাহিদা অনুযায়ী ব্লকের আকার বাড়বে বা কমবে, 60 মিলিয়ন গ্যাসের ব্লক সীমা পর্যন্ত (2x লক্ষ্য ব্লক আকার)। ব্লক গ্যাস সীমা পূর্ববর্তী ব্লকের গ্যাস সীমার থেকে 1/1024 ফ্যাক্টর দ্বারা উপরের দিকে বা নীচের দিকে সামঞ্জস্য করা যেতে পারে। ফলস্বরূপ, ভ্যালিডেটররা কনসেন্সাসের মাধ্যমে ব্লক গ্যাস সীমা পরিবর্তন করতে পারে। ব্লকের সমস্ত লেনদেন দ্বারা ব্যয় করা মোট গ্যাসের পরিমাণ অবশ্যই ব্লক গ্যাস সীমার চেয়ে কম হতে হবে। এটি গুরুত্বপূর্ণ কারণ এটি নিশ্চিত করে যে ব্লকগুলি যথেচ্ছভাবে বড় হতে পারে না। যদি ব্লকগুলি যথেচ্ছভাবে বড় হতে পারত, তবে স্থান এবং গতির প্রয়োজনীয়তার কারণে কম কর্মক্ষম সম্পূর্ণ নোডগুলি ধীরে ধীরে নেটওয়ার্কের সাথে তাল মিলিয়ে চলতে অক্ষম হয়ে পড়ত। ব্লক যত বড় হবে, পরবর্তী স্লটের জন্য সময়মতো প্রক্রিয়া করার জন্য তত বেশি কম্পিউটিং শক্তি প্রয়োজন হবে। এটি একটি কেন্দ্রীভূত শক্তি, যা ব্লকের আকার সীমাবদ্ধ করে প্রতিরোধ করা হয়। + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [লেনদেন](/developers/docs/transactions/) +- [গ্যাস](/developers/docs/gas/) +- [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos) diff --git a/public/content/translations/bn/developers/docs/bridges/index.md b/public/content/translations/bn/developers/docs/bridges/index.md new file mode 100644 index 00000000000..56b0bf5d926 --- /dev/null +++ b/public/content/translations/bn/developers/docs/bridges/index.md @@ -0,0 +1,138 @@ +--- +title: "ব্রিজ" +description: "ডেভেলপারদের জন্য ব্রিজিং-এর একটি সংক্ষিপ্ত বিবরণ" +lang: bn +--- + +L1 ব্লকচেইন এবং L2 [স্কেলিং](/developers/docs/scaling/) সমাধানের বিস্তারের সাথে, ডিসেন্ট্রালাইজড এপ্লিকেশনগুলোর ক্রমবর্ধমান সংখ্যা ক্রস-চেইন হওয়ার পাশাপাশি, চেইন জুড়ে যোগাযোগ এবং সম্পদ স্থানান্তরের প্রয়োজনীয়তা নেটওয়ার্ক পরিকাঠামোর একটি অপরিহার্য অংশ হয়ে উঠেছে। এটি সম্ভব করতে বিভিন্ন ধরণের ব্রিজ বিদ্যমান রয়েছে। + +## ব্রিজের প্রয়োজনীয়তা {#need-for-bridges} + +ব্লকচেইন নেটওয়ার্কগুলিকে সংযুক্ত করার জন্য ব্রিজ বিদ্যমান। তারা ব্লকচেইনগুলির মধ্যে সংযোগ এবং আন্তঃকার্যক্ষমতা সক্ষম করে। + +ব্লকচেইনগুলি বিচ্ছিন্ন পরিবেশে বিদ্যমান, যার অর্থ স্বাভাবিকভাবে অন্যান্য ব্লকচেইনের সাথে লেনদেন এবং যোগাযোগের কোনো উপায় নেই। ফলস্বরূপ, যদিও একটি ইকোসিস্টেমের মধ্যে উল্লেখযোগ্য কার্যকলাপ এবং উদ্ভাবন থাকতে পারে, এটি অন্যান্য ইকোসিস্টেমের সাথে সংযোগ এবং আন্তঃকার্যক্ষমতার অভাব দ্বারা সীমাবদ্ধ। + +ব্রিজ বিচ্ছিন্ন ব্লকচেইন পরিবেশকে একে অপরের সাথে সংযুক্ত করার একটি উপায় সরবরাহ করে। তারা ব্লকচেইনগুলির মধ্যে একটি পরিবহন রুট স্থাপন করে যেখানে টোকেন, বার্তা, নির্বিচারে ডেটা এবং এমনকি [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) কলগুলি এক চেইন থেকে অন্য চেইনে স্থানান্তর করা যায়। + +## ব্রিজের সুবিধাসমূহ {#benefits-of-bridges} + +সহজ কথায়, ব্রিজগুলি ব্লকচেইন নেটওয়ার্কগুলিকে নিজেদের মধ্যে ডেটা বিনিময় এবং সম্পদ স্থানান্তরের অনুমতি দিয়ে অসংখ্য ব্যবহারের ক্ষেত্র উন্মুক্ত করে। + +ব্লকচেইনগুলির অনন্য শক্তি, দুর্বলতা এবং এপ্লিকেশন তৈরির পদ্ধতি রয়েছে (যেমন গতি, থ্রুপুট, ব্যয়বহুলতা ইত্যাদি)। ব্রিজগুলি ব্লকচেইনগুলিকে একে অপরের উদ্ভাবনগুলিকে কাজে লাগাতে সক্ষম করে সামগ্রিক ক্রিপ্টো ইকোসিস্টেমের বিকাশে সহায়তা করে। + +ডেভেলপারদের জন্য, ব্রিজ নিম্নলিখিতগুলি সক্ষম করে: + +- চেইন জুড়ে যেকোনো ডেটা, তথ্য এবং সম্পদের স্থানান্তর। +- প্রোটোকলগুলির জন্য নতুন বৈশিষ্ট্য এবং ব্যবহারের ক্ষেত্রগুলি আনলক করা কারণ ব্রিজগুলি প্রোটোকলগুলি কী অফার করতে পারে তার জন্য ডিজাইনের স্থান প্রসারিত করে। উদাহরণস্বরূপ, ইথেরিয়াম মেইননেট-এ মূলত ডিপ্লয় করা একটি ইল্ড ফার্মিং প্রোটোকল সমস্ত EVM-সামঞ্জস্যপূর্ণ চেইনে লিকুইডিটি পুল অফার করতে পারে। +- বিভিন্ন ব্লকচেইনের শক্তিকে কাজে লাগানোর সুযোগ। উদাহরণস্বরূপ, ডেভেলপাররা তাদের ডিএ্যাপস রোলআপ এবং সাইডচেইন জুড়ে ডিপ্লয় করে বিভিন্ন L2 সমাধান দ্বারা প্রদত্ত কম ফি থেকে উপকৃত হতে পারে এবং ব্যবহারকারীরা তাদের মধ্যে ব্রিজ করতে পারে। +- নতুন পণ্য তৈরি করতে বিভিন্ন ব্লকচেইন ইকোসিস্টেমের ডেভেলপারদের মধ্যে সহযোগিতা। +- বিভিন্ন ইকোসিস্টেম থেকে ব্যবহারকারী এবং কমিউনিটিকে তাদের ডিএ্যাপস-এর প্রতি আকৃষ্ট করা। + +## ব্রিজ কীভাবে কাজ করে? {#how-do-bridges-work} + +যদিও অনেক [ব্রিজ ডিজাইনের প্রকার](https://li.fi/knowledge-hub/blockchain-bridges-and-classification/) রয়েছে, সম্পদের ক্রস-চেইন স্থানান্তরকে সহজতর করার তিনটি উপায় উল্লেখযোগ্য: + +- **লক এবং মিন্ট –** সোর্স চেইনে সম্পদ লক করুন এবং ডেস্টিনেশন চেইনে সম্পদ মিন্ট করুন। +- **বার্ন এবং মিন্ট –** সোর্স চেইনে সম্পদ বার্ন করুন এবং ডেস্টিনেশন চেইনে সম্পদ মিন্ট করুন। +- **এটমিক সোয়াপ –** অন্য কোনো পক্ষের সাথে সোর্স চেইনের সম্পদ ডেস্টিনেশন চেইনের সম্পদের জন্য সোয়াপ করুন। + +## ব্রিজের প্রকারভেদ {#bridge-types} + +ব্রিজ সাধারণত নিম্নলিখিত বিভাগগুলির মধ্যে একটিতে শ্রেণীবদ্ধ করা যেতে পারে: + +- **নেটিভ ব্রিজ –** এই ব্রিজগুলি সাধারণত একটি নির্দিষ্ট ব্লকচেইনে লিকুইডিটি বুটস্ট্র্যাপ করার জন্য তৈরি করা হয়, যা ব্যবহারকারীদের জন্য ইকোসিস্টেমে তহবিল স্থানান্তর করা সহজ করে তোলে। উদাহরণস্বরূপ, [Arbitrum Bridge](https://bridge.arbitrum.io/) ব্যবহারকারীদের জন্য ইথেরিয়াম মেইননেট থেকে Arbitrum-এ ব্রিজ করা সুবিধাজনক করার জন্য তৈরি করা হয়েছে। অন্যান্য এই ধরনের ব্রিজের মধ্যে রয়েছে Polygon PoS Bridge, [Optimism Gateway](https://app.optimism.io/bridge) ইত্যাদি। +- **ভ্যালিডেটর বা ওরাকল-ভিত্তিক ব্রিজ –** এই ব্রিজগুলি ক্রস-চেইন স্থানান্তর যাচাই করার জন্য একটি বহিরাগত ভ্যালিডেটর সেট বা ওরাকলের উপর নির্ভর করে। উদাহরণ: Multichain এবং Across। +- **সাধারণ বার্তা প্রেরণকারী ব্রিজ –** এই ব্রিজগুলি বার্তা এবং নির্বিচারে ডেটার পাশাপাশি চেইন জুড়ে সম্পদ স্থানান্তর করতে পারে। উদাহরণ: Axelar, LayerZero, এবং Nomad। +- **লিকুইডিটি নেটওয়ার্ক –** এই ব্রিজগুলি প্রাথমিকভাবে এটমিক সোয়াপের মাধ্যমে এক চেইন থেকে অন্য চেইনে সম্পদ স্থানান্তরের উপর ফোকাস করে। সাধারণত, তারা ক্রস-চেইন বার্তা প্রেরণ সমর্থন করে না। উদাহরণ: Connext এবং Hop। + +## বিবেচ্য বিষয়সমূহ {#trade-offs} + +ব্রিজের ক্ষেত্রে, কোনো নিখুঁত সমাধান নেই। বরং, একটি উদ্দেশ্য পূরণের জন্য কেবল কিছু ছাড় দেওয়া হয়। ডেভেলপার এবং ব্যবহারকারীরা নিম্নলিখিত বিষয়গুলির উপর ভিত্তি করে ব্রিজগুলি মূল্যায়ন করতে পারেন: + +- **নিরাপত্তা –** সিস্টেমটি কে যাচাই করে? বাহ্যিক ভ্যালিডেটর দ্বারা সুরক্ষিত ব্রিজগুলি সাধারণত ব্লকচেইনের ভ্যালিডেটর দ্বারা স্থানীয়ভাবে বা নেটিভভাবে সুরক্ষিত ব্রিজের চেয়ে কম সুরক্ষিত। +- **সুবিধা –** একটি লেনদেন সম্পূর্ণ করতে কত সময় লাগে, এবং একজন ব্যবহারকারীকে কতগুলি লেনদেনে স্বাক্ষর করতে হয়েছিল? একজন ডেভেলপারের জন্য, একটি ব্রিজকে একীভূত করতে কত সময় লাগে, এবং প্রক্রিয়াটি কতটা জটিল? +- **সংযোগ –** একটি ব্রিজ কোন কোন ডেস্টিনেশন চেইনের সাথে সংযোগ স্থাপন করতে পারে (যেমন, রোলআপ, সাইডচেইন, অন্যান্য লেয়ার 1 ব্লকচেইন, ইত্যাদি), এবং একটি নতুন ব্লকচেইনকে একীভূত করা কতটা কঠিন? +- **আরও জটিল ডেটা পাস করার ক্ষমতা –** একটি ব্রিজ কি চেইন জুড়ে বার্তা এবং আরও জটিল নির্বিচারে ডেটা স্থানান্তর করতে সক্ষম করে, নাকি এটি কেবল ক্রস-চেইন সম্পদ স্থানান্তর সমর্থন করে? +- **খরচ-কার্যকারিতা –** একটি ব্রিজের মাধ্যমে চেইন জুড়ে সম্পদ স্থানান্তর করতে কত খরচ হয়? সাধারণত, ব্রিজগুলি গ্যাস খরচ এবং নির্দিষ্ট রুটের লিকুইডিটির উপর নির্ভর করে একটি নির্দিষ্ট বা পরিবর্তনশীল ফি চার্জ করে। এর নিরাপত্তা নিশ্চিত করার জন্য প্রয়োজনীয় মূলধনের উপর ভিত্তি করে একটি ব্রিজের খরচ-কার্যকারিতা মূল্যায়ন করাও গুরুত্বপূর্ণ। + +একটি উচ্চ স্তরে, ব্রিজগুলিকে ট্রাস্টেড এবং ট্রাস্টলেস হিসাবে শ্রেণীবদ্ধ করা যেতে পারে। + +- **ট্রাস্টেড –** ট্রাস্টেড ব্রিজগুলি বাহ্যিকভাবে যাচাই করা হয়। তারা চেইন জুড়ে ডেটা পাঠানোর জন্য যাচাইকারীদের একটি বহিরাগত সেট (মাল্টি-সিগ সহ ফেডারেশন, মাল্টি-পার্টি কম্পিউটেশন সিস্টেম, ওরাকল নেটওয়ার্ক) ব্যবহার করে। ফলস্বরূপ, তারা দুর্দান্ত সংযোগের প্রস্তাব দিতে পারে এবং চেইন জুড়ে সম্পূর্ণ সাধারণ বার্তা প্রেরণ সক্ষম করে। এগুলি গতি এবং খরচ-কার্যকারিতার ক্ষেত্রেও ভাল কাজ করে। এটি নিরাপত্তার মূল্যে আসে, কারণ ব্যবহারকারীদের ব্রিজের নিরাপত্তার উপর নির্ভর করতে হয়। +- **ট্রাস্টলেস –** এই ব্রিজগুলি যে ব্লকচেইনগুলিকে সংযুক্ত করছে এবং তাদের ভ্যালিডেটরদের উপর বার্তা এবং টোকেন স্থানান্তর করার জন্য নির্ভর করে। এগুলি 'ট্রাস্টলেস' কারণ তারা নতুন কোনো বিশ্বাসের অনুমান যোগ করে না (ব্লকচেইন ছাড়াও)। ফলস্বরূপ, ট্রাস্টলেস ব্রিজগুলিকে ট্রাস্টেড ব্রিজের চেয়ে বেশি সুরক্ষিত বলে মনে করা হয়। + +অন্যান্য কারণের উপর ভিত্তি করে ট্রাস্টলেস ব্রিজগুলি মূল্যায়ন করতে, আমাদের অবশ্যই সেগুলিকে সাধারণ বার্তা প্রেরণকারী ব্রিজ এবং লিকুইডিটি নেটওয়ার্কে বিভক্ত করতে হবে। + +- **সাধারণ বার্তা প্রেরণকারী ব্রিজ –** এই ব্রিজগুলি নিরাপত্তা এবং চেইন জুড়ে আরও জটিল ডেটা স্থানান্তর করার ক্ষমতার ক্ষেত্রে उत्कृष्ट। সাধারণত, এগুলি খরচ-কার্যকারিতার ক্ষেত্রেও ভাল। যাইহোক, এই শক্তিগুলি সাধারণত লাইট ক্লায়েন্ট ব্রিজ (যেমন: IBC) এর জন্য সংযোগের খরচ এবং ফ্রড প্রুফ ব্যবহারকারী অপ্টিমিস্টিক ব্রিজ (যেমন: Nomad) এর জন্য গতির অসুবিধার বিনিময়ে আসে। +- **লিকুইডিটি নেটওয়ার্ক –** এই ব্রিজগুলি সম্পদ স্থানান্তরের জন্য এটমিক সোয়াপ ব্যবহার করে এবং স্থানীয়ভাবে যাচাইকৃত সিস্টেম (অর্থাৎ, তারা লেনদেন যাচাই করার জন্য অন্তর্নিহিত ব্লকচেইনের ভ্যালিডেটর ব্যবহার করে)। ফলস্বরূপ, তারা নিরাপত্তা এবং গতির সাথে দুর্দান্ত কাজ করে। তাছাড়া, এগুলিকে তুলনামূলকভাবে খরচ-কার্যকরী বলে মনে করা হয় এবং ভাল সংযোগ প্রদান করে। যাইহোক, প্রধান সমস্যাটি হল তাদের আরও জটিল ডেটা পাস করার অক্ষমতা - কারণ তারা ক্রস-চেইন বার্তা প্রেরণ সমর্থন করে না। + +## ব্রিজ সম্পর্কিত ঝুঁকি {#risk-with-bridges} + +ব্রিজগুলি [DeFi-এর সবচেয়ে বড় তিনটি হ্যাকের](https://rekt.news/leaderboard/) জন্য দায়ী এবং এখনও বিকাশের প্রাথমিক পর্যায়ে রয়েছে। যেকোনো ব্রিজ ব্যবহার করলে নিম্নলিখিত ঝুঁকি থাকে: + +- **স্মার্ট কন্ট্র্যাক্টের ঝুঁকি –** যদিও অনেক ব্রিজ সফলভাবে অডিট পাস করেছে, সম্পদ হ্যাকের শিকার হওয়ার জন্য একটি স্মার্ট কন্ট্র্যাক্টে একটি ত্রুটিই যথেষ্ট (যেমন: [Solana’s Wormhole Bridge](https://rekt.news/wormhole-rekt/))। +- **সিস্টেমিক আর্থিক ঝুঁকি** – অনেক ব্রিজ একটি নতুন চেইনে আসল সম্পদের ক্যানোনিকাল সংস্করণ মিন্ট করতে র‍্যাপড অ্যাসেট ব্যবহার করে। এটি ইকোসিস্টেমকে সিস্টেমিক ঝুঁকির মুখে ফেলে, কারণ আমরা দেখেছি টোকেনের র‍্যাপড সংস্করণগুলি শোষিত হয়েছে। +- **কাউন্টারপার্টি ঝুঁকি –** কিছু ব্রিজ একটি ট্রাস্টেড ডিজাইন ব্যবহার করে যার জন্য ব্যবহারকারীদের এই অনুমানের উপর নির্ভর করতে হয় যে ভ্যালিডেটররা ব্যবহারকারীর তহবিল চুরি করার জন্য ষড়যন্ত্র করবে না। এই তৃতীয় পক্ষের অভিনেতাদের উপর বিশ্বাস করার প্রয়োজনীয়তা ব্যবহারকারীদের রাগ পুল, সেন্সরশিপ এবং অন্যান্য দূষিত কার্যকলাপের মতো ঝুঁকির সম্মুখীন করে। +- **উন্মুক্ত সমস্যা –** যেহেতু ব্রিজগুলি বিকাশের প্রাথমিক পর্যায়ে রয়েছে, তাই বিভিন্ন বাজারের পরিস্থিতিতে, যেমন নেটওয়ার্ক কনজেশনের সময় এবং নেটওয়ার্ক-স্তরের আক্রমণ বা স্টেট রোলব্যাকের মতো অপ্রত্যাশিত ঘটনাগুলির সময় ব্রিজগুলি কীভাবে কাজ করবে সে সম্পর্কিত অনেক অমীমাংসিত প্রশ্ন রয়েছে। এই অনিশ্চয়তা নির্দিষ্ট ঝুঁকি তৈরি করে, যার মাত্রা এখনও অজানা। + +## ডিএ্যাপস কীভাবে ব্রিজ ব্যবহার করতে পারে? {#how-can-dapps-use-bridges} + +এখানে কিছু ব্যবহারিক এপ্লিকেশন রয়েছে যা ডেভেলপাররা ব্রিজ এবং তাদের ডিএ্যাপ ক্রস-চেইন করার বিষয়ে বিবেচনা করতে পারে: + +### ব্রিজ একীভূত করা {#integrating-bridges} + +ডেভেলপারদের জন্য, ব্রিজের জন্য সমর্থন যোগ করার অনেক উপায় আছে: + +1. **আপনার নিজের ব্রিজ তৈরি করা –** একটি সুরক্ষিত এবং নির্ভরযোগ্য ব্রিজ তৈরি করা সহজ নয়, বিশেষ করে যদি আপনি একটি আরও ট্রাস্ট-মিনিমাইজড রুট নেন। তাছাড়া, এর জন্য স্কেলেবিলিটি এবং আন্তঃকার্যক্ষমতা অধ্যয়ন সম্পর্কিত বছরের পর বছরের অভিজ্ঞতা এবং প্রযুক্তিগত দক্ষতার প্রয়োজন। অতিরিক্তভাবে, একটি ব্রিজ রক্ষণাবেক্ষণ করতে এবং এটিকে কার্যকর করার জন্য পর্যাপ্ত লিকুইডিটি আকর্ষণ করার জন্য একটি হ্যান্ডস-অন টিমের প্রয়োজন হবে। + +2. **ব্যবহারকারীদের একাধিক ব্রিজ বিকল্প দেখানো –** অনেক [ডিএ্যাপস](/developers/docs/dapps/) ব্যবহারকারীদের তাদের সাথে ইন্টারঅ্যাক্ট করার জন্য তাদের নেটিভ টোকেন থাকার প্রয়োজন হয়। ব্যবহারকারীদের তাদের টোকেন অ্যাক্সেস করতে সক্ষম করার জন্য, তারা তাদের ওয়েবসাইটে বিভিন্ন ব্রিজ বিকল্প অফার করে। যাইহোক, এই পদ্ধতিটি সমস্যার একটি দ্রুত সমাধান কারণ এটি ব্যবহারকারীকে ডিএ্যাপ ইন্টারফেস থেকে দূরে নিয়ে যায় এবং এখনও তাদের অন্যান্য ডিএ্যাপস এবং ব্রিজের সাথে ইন্টারঅ্যাক্ট করতে হয়। এটি ভুল করার বর্ধিত সুযোগ সহ একটি কষ্টকর অনবোর্ডিং অভিজ্ঞতা। + +3. **একটি ব্রিজ একীভূত করা –** এই সমাধানের জন্য ডিএ্যাপ-কে ব্যবহারকারীদের বাহ্যিক ব্রিজ এবং DEX ইন্টারফেসে পাঠানোর প্রয়োজন নেই। এটি ডিএ্যাপস-কে ব্যবহারকারীর অনবোর্ডিং অভিজ্ঞতা উন্নত করতে দেয়। যাইহোক, এই পদ্ধতির সীমাবদ্ধতা রয়েছে: + + - ব্রিজগুলির মূল্যায়ন এবং রক্ষণাবেক্ষণ কঠিন এবং সময়সাপেক্ষ। + - একটি ব্রিজ নির্বাচন করা ব্যর্থতা এবং নির্ভরতার একটি একক পয়েন্ট তৈরি করে। + - ডিএ্যাপটি ব্রিজের ক্ষমতা দ্বারা সীমাবদ্ধ। + - শুধুমাত্র ব্রিজই যথেষ্ট নাও হতে পারে। ক্রস-চেইন সোয়াপের মতো আরও কার্যকারিতা অফার করার জন্য ডিএ্যাপস-এর DEX-এর প্রয়োজন হতে পারে। + +4. **একাধিক ব্রিজ একীভূত করা –** এই সমাধানটি একটি একক ব্রিজ একীভূত করার সাথে সম্পর্কিত অনেক সমস্যার সমাধান করে। যাইহোক, এরও সীমাবদ্ধতা রয়েছে, কারণ একাধিক ব্রিজ একীভূত করা রিসোর্স-সাপেক্ষ এবং ডেভেলপারদের জন্য প্রযুক্তিগত এবং যোগাযোগের ওভারহেড তৈরি করে—যা ক্রিপ্টোতে সবচেয়ে দুষ্প্রাপ্য রিসোর্স। + +5. **একটি ব্রিজ অ্যাগ্রিগেটর একীভূত করা –** ডিএ্যাপস-এর জন্য আরেকটি বিকল্প হল একটি ব্রিজ অ্যাগ্রিগেশন সমাধান একীভূত করা যা তাদের একাধিক ব্রিজে অ্যাক্সেস দেয়। ব্রিজ অ্যাগ্রিগেটররা সমস্ত ব্রিজের শক্তি উত্তরাধিকার সূত্রে পায় এবং এইভাবে কোনো একক ব্রিজের ক্ষমতা দ্বারা সীমাবদ্ধ থাকে না। বিশেষত, ব্রিজ অ্যাগ্রিগেটররা সাধারণত ব্রিজ ইন্টিগ্রেশনগুলি বজায় রাখে, যা ডিএ্যাপ-কে একটি ব্রিজ ইন্টিগ্রেশনের প্রযুক্তিগত এবং অপারেশনাল দিকগুলির শীর্ষে থাকার ঝামেলা থেকে বাঁচায়। + +তা সত্ত্বেও, ব্রিজ অ্যাগ্রিগেটরদেরও তাদের সীমাবদ্ধতা রয়েছে। উদাহরণস্বরূপ, যদিও তারা আরও ব্রিজ বিকল্প অফার করতে পারে, অ্যাগ্রিগেটরের প্ল্যাটফর্মে অফার করা ব্রিজগুলি ছাড়াও বাজারে সাধারণত আরও অনেক ব্রিজ উপলব্ধ থাকে। তাছাড়া, ব্রিজের মতোই, ব্রিজ অ্যাগ্রিগেটররাও স্মার্ট কন্ট্র্যাক্ট এবং প্রযুক্তিগত ঝুঁকির সম্মুখীন হয় (বেশি স্মার্ট কন্ট্র্যাক্ট = বেশি ঝুঁকি)। + +যদি একটি ডিএ্যাপ একটি ব্রিজ বা একটি অ্যাগ্রিগেটরকে একীভূত করার পথে যায়, তাহলে ইন্টিগ্রেশনটি কতটা গভীর হওয়ার কথা তার উপর ভিত্তি করে বিভিন্ন বিকল্প রয়েছে। উদাহরণস্বরূপ, যদি এটি শুধুমাত্র ব্যবহারকারীর অনবোর্ডিং অভিজ্ঞতা উন্নত করার জন্য একটি ফ্রন্ট-এন্ড ইন্টিগ্রেশন হয়, তাহলে একটি ডিএ্যাপ উইজেটটি একীভূত করবে। যাইহোক, যদি ইন্টিগ্রেশনটি স্টেকিং, ইল্ড ফার্মিং ইত্যাদির মতো গভীর ক্রস-চেইন কৌশলগুলি অন্বেষণ করার জন্য হয়, তাহলে ডিএ্যাপটি SDK বা API একীভূত করে। + +### একাধিক চেইনে একটি ডিএ্যাপ ডিপ্লয় করা {#deploying-a-dapp-on-multiple-chains} + +একাধিক চেইনে একটি ডিএ্যাপ ডিপ্লয় করতে, ডেভেলপাররা [Alchemy](https://www.alchemy.com/), [Hardhat](https://hardhat.org/), [Moralis](https://moralis.io/), ইত্যাদির মতো ডেভেলপমেন্ট প্ল্যাটফর্ম ব্যবহার করতে পারে। সাধারণত, এই প্ল্যাটফর্মগুলি কম্পোজেবল প্লাগইনগুলির সাথে আসে যা ডিএ্যাপস-কে ক্রস-চেইন যেতে সক্ষম করতে পারে। উদাহরণস্বরূপ, ডেভেলপাররা [hardhat-deploy plugin](https://github.com/wighawag/hardhat-deploy) দ্বারা প্রদত্ত একটি ডিটারমিনিস্টিক ডিপ্লয়মেন্ট প্রক্সি ব্যবহার করতে পারে। + +#### উদাহরণ: + +- [কীভাবে ক্রস-চেইন ডিএ্যাপস তৈরি করবেন](https://moralis.io/how-to-build-cross-chain-dapps/) +- [একটি ক্রস-চেইন NFT মার্কেটপ্লেস তৈরি করা](https://youtu.be/WZWCzsB1xUE) +- [Moralis: ক্রস-চেইন NFT ডিএ্যাপস তৈরি করা](https://www.youtube.com/watch?v=ehv70kE1QYo) + +### চেইন জুড়ে কন্ট্র্যাক্টের কার্যকলাপ পর্যবেক্ষণ করা {#monitoring-contract-activity-across-chains} + +চেইন জুড়ে কন্ট্র্যাক্টের কার্যকলাপ নিরীক্ষণ করতে, ডেভেলপাররা রিয়েল-টাইমে স্মার্ট কন্ট্র্যাক্ট পর্যবেক্ষণ করতে সাবগ্রাফ এবং Tenderly-এর মতো ডেভেলপার প্ল্যাটফর্ম ব্যবহার করতে পারে। এই ধরনের প্ল্যাটফর্মগুলিতে এমন টুলসও রয়েছে যা ক্রস-চেইন কার্যকলাপের জন্য বৃহত্তর ডেটা পর্যবেক্ষণ কার্যকারিতা অফার করে, যেমন [কন্ট্র্যাক্ট দ্বারা নির্গত ইভেন্টগুলি](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=events#events) পরীক্ষা করা ইত্যাদি। + +#### টুলস + +- [The Graph](https://thegraph.com/en/) +- [Tenderly](https://tenderly.co/) + +## আরও পড়ুন {#further-reading} + +- [ব্লকচেইন ব্রিজ](/bridges/) – ethereum.org +- [L2Beat ব্রিজ রিস্ক ফ্রেমওয়ার্ক](https://l2beat.com/bridges/summary) +- [ব্লকচেইন ব্রিজ: ক্রিপ্টোনেটওয়ার্কের নেটওয়ার্ক তৈরি করা](https://medium.com/1kxnetwork/blockchain-bridges-5db6afac44f8) - ৮ সেপ্টেম্বর, ২০২১ – দিমিত্রি বেরেনজন +- [দ্য ইন্টারঅপারেবিলিটি ট্রাইলেমা](https://blog.connext.network/the-interoperability-trilemma-657c2cf69f17) - ১ অক্টোবর, ২০২১ – অর্জুন ভুপতানি +- [ক্লাস্টারস: কীভাবে ট্রাস্টেড ও ট্রাস্ট-মিনিমাইজড ব্রিজগুলি মাল্টি-চেইন ল্যান্ডস্কেপকে আকার দেয়](https://blog.celestia.org/clusters/) - ৪ অক্টোবর, ২০২১ – মুস্তাফা আল-বাসাম +- [LI.FI: ব্রিজের সাথে, বিশ্বাস একটি স্পেকট্রাম](https://blog.li.fi/li-fi-with-bridges-trust-is-a-spectrum-354cd5a1a6d8) - ২৮ এপ্রিল, ২০২২ – অর্জুন চন্দ +- [রোলআপ ইন্টারঅপারেবিলিটি সলিউশনের অবস্থা](https://web.archive.org/web/20250428015516/https://research.2077.xyz/the-state-of-rollup-interoperability) - ২০ জুন, ২০২৪ – অ্যালেক্স হুক +- [নিরাপদ ক্রস-চেইন আন্তঃকার্যক্ষমতার জন্য শেয়ারড সিকিউরিটি ব্যবহার করা: Lagrange State Committees এবং তার বাইরে](https://web.archive.org/web/20250125035123/https://research.2077.xyz/harnessing-shared-security-for-secure-blockchain-interoperability) - ১২ জুন, ২০২৪ – ইমানুয়েল আওসিকা + +অতিরিক্তভাবে, এখানে [জেমস প্রেস্টউইচ](https://twitter.com/_prestwich) এর কিছু অন্তর্দৃষ্টিপূর্ণ উপস্থাপনা রয়েছে যা ব্রিজ সম্পর্কে গভীর ধারণা তৈরি করতে সাহায্য করতে পারে: + +- [ব্রিজ তৈরি করা, প্রাচীর ঘেরা বাগান নয়](https://youtu.be/ZQJWMiX4hT0) +- [ব্রিজ ভেঙে ফেলা](https://youtu.be/b0mC-ZqN8Oo) +- [ব্রিজগুলি কেন জ্বলছে](https://youtu.be/c7cm2kd20j8) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/index.md new file mode 100644 index 00000000000..607881ebd3f --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/index.md @@ -0,0 +1,92 @@ +--- +title: "কনসেন্সাস মেকানিজম" +description: "ডিস্ট্রিবিউটেড সিস্টেমে কনসেন্সাস প্রোটোকলের একটি ব্যাখ্যা এবং ইথেরিয়ামে তারা যে ভূমিকা পালন করে।" +lang: bn +--- + +'কনসেন্সাস মেকানিজম' শব্দটি প্রায়শই কথ্য ভাষায় 'প্রুফ-অফ-স্টেক', 'প্রুফ-অফ-ওয়ার্ক' বা 'প্রুফ-অফ-অথোরিটি' প্রোটোকলকে বোঝাতে ব্যবহৃত হয়। তবে, এগুলি হল কনসেন্সাস মেকানিজমগুলির উপাদান যা [Sybil attacks](/glossary/#sybil-attack) এর বিরুদ্ধে সুরক্ষা প্রদান করে। কনসেন্সাস মেকানিজম হল ধারণা, প্রোটোকল এবং ইনসেনটিভের সম্পূর্ণ স্ট্যাক যা নোডগুলির একটি ডিস্ট্রিবিউটেড সেটকে একটি ব্লকচেইনের স্টেটের উপর একমত হতে সক্ষম করে। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে আমাদের [ইথেরিয়ামের পরিচিতি](/developers/docs/intro-to-ethereum/) পড়ার পরামর্শ দিচ্ছি। + +## কনসেন্সাস কী? {#what-is-consensus} + +কনসেন্সাস বলতে, আমরা বুঝি যে একটি সাধারণ চুক্তিতে পৌঁছানো গেছে। ভাবুন একদল লোক সিনেমা দেখতে যাচ্ছে। যদি চলচ্চিত্রের প্রস্তাবিত পছন্দের বিষয়ে কোনো দ্বিমত না থাকে, তাহলে একটি কনসেন্সাস অর্জিত হয়। যদি দ্বিমত থাকে, তাহলে কোন চলচ্চিত্রটি দেখতে হবে তা সিদ্ধান্ত নেওয়ার জন্য দলটির কাছে একটি উপায় থাকতে হবে। চরম পরিস্থিতিতে, দলটি শেষ পর্যন্ত বিভক্ত হয়ে যাবে। + +ইথেরিয়াম ব্লকচেইনের ক্ষেত্রে, প্রক্রিয়াটি আনুষ্ঠানিক, এবং কনসেন্সাসে পৌঁছানোর অর্থ হল নেটওয়ার্কের কমপক্ষে 66% নোড নেটওয়ার্কের গ্লোবাল স্টেটের বিষয়ে একমত। + +## কনসেন্সাস মেকানিজম কী? {#what-is-a-consensus-mechanism} + +কনসেন্সাস মেকানিজম শব্দটি প্রোটোকল, ইনসেনটিভ এবং ধারণার পুরো স্ট্যাককে বোঝায় যা নোডগুলির একটি নেটওয়ার্ককে ব্লকচেইনের স্টেটের উপর একমত হতে দেয়। + +ইথেরিয়াম একটি প্রুফ-অফ-স্টেক-ভিত্তিক কনসেন্সাস মেকানিজম ব্যবহার করে যা স্টেকারদের দ্বারা লক করা মূলধনের উপর প্রয়োগ করা পুরষ্কার এবং শাস্তির একটি সেট থেকে এর ক্রিপ্টো-অর্থনৈতিক নিরাপত্তা প্রাপ্ত করে। এই ইনসেনটিভ কাঠামো স্বতন্ত্র স্টেকারদের সৎ ভ্যালিডেটর হিসেবে কাজ করতে উৎসাহিত করে, যারা করে না তাদের শাস্তি দেয় এবং নেটওয়ার্কে আক্রমণ করার জন্য একটি অত্যন্ত উচ্চ খরচ তৈরি করে। + +তারপরে, একটি প্রোটোকল রয়েছে যা নিয়ন্ত্রণ করে যে কীভাবে সৎ ভ্যালিডেটরদের ব্লক প্রস্তাব বা যাচাই করার জন্য, লেনদেন প্রক্রিয়া করার জন্য এবং চেইনের হেডের বিষয়ে তাদের মতামতের জন্য ভোট দেওয়ার জন্য নির্বাচন করা হয়। বিরল পরিস্থিতিতে যেখানে চেইনের হেডের কাছে একই অবস্থানে একাধিক ব্লক থাকে, সেখানে একটি ফর্ক-চয়েস মেকানিজম রয়েছে যা সেই ব্লকগুলিকে নির্বাচন করে যা 'সবচেয়ে ভারী' চেইন তৈরি করে, যা ব্লকগুলির জন্য ভোট দেওয়া ভ্যালিডেটরদের সংখ্যা দ্বারা পরিমাপ করা হয় এবং তাদের স্টেক করা ইথার ব্যালেন্স দ্বারা ওজন করা হয়। + +কনসেন্সাসের জন্য কিছু ধারণা গুরুত্বপূর্ণ যা কোডে স্পষ্টভাবে সংজ্ঞায়িত নয়, যেমন নেটওয়ার্কে আক্রমণের বিরুদ্ধে প্রতিরক্ষার শেষ লাইন হিসাবে সম্ভাব্য আউট-অফ-ব্যান্ড সামাজিক সমন্বয়ের মাধ্যমে প্রদত্ত অতিরিক্ত নিরাপত্তা। + +এই উপাদানগুলি একসাথে কনসেন্সাস মেকানিজম গঠন করে। + +## কনসেন্সাস মেকানিজমের প্রকারভেদ {#types-of-consensus-mechanisms} + +### প্রুফ-অফ-ওয়ার্ক ভিত্তিক {#proof-of-work} + +বিটকয়েনের মতো, ইথেরিয়াম একসময় একটি **প্রুফ-অফ-ওয়ার্ক (PoW)** ভিত্তিক কনসেন্সাস প্রোটোকল ব্যবহার করত। + +#### ব্লক তৈরি {#pow-block-creation} + +মাইনাররা প্রক্রিয়াজাত লেনদেন দিয়ে ভরা নতুন ব্লক তৈরি করতে প্রতিযোগিতা করে। বিজয়ী নতুন ব্লকটি নেটওয়ার্কের বাকিদের সাথে শেয়ার করে এবং কিছু সদ্য মিন্ট করা ETH উপার্জন করে। এই প্রতিযোগিতাটি সেই কম্পিউটার জেতে যেটি দ্রুততম একটি গণিত ধাঁধা সমাধান করতে সক্ষম হয়। এটি বর্তমান ব্লক এবং তার আগের ব্লকের মধ্যে ক্রিপ্টোগ্রাফিক লিঙ্ক তৈরি করে। এই ধাঁধাটি সমাধান করাই হলো "প্রুফ-অফ-ওয়ার্ক" এর কাজ। ক্যানোনিকাল চেইনটি তখন একটি ফর্ক-চয়েস নিয়ম দ্বারা নির্ধারিত হয় যা সেই ব্লকগুলির সেট নির্বাচন করে যেগুলি মাইন করার জন্য সবচেয়ে বেশি কাজ করা হয়েছে। + +#### নিরাপত্তা {#pow-security} + +নেটওয়ার্কটি এই কারণে সুরক্ষিত থাকে যে চেইনে প্রতারণা করার জন্য আপনার নেটওয়ার্কের কম্পিউটিং পাওয়ারের 51% প্রয়োজন হবে। এর জন্য সরঞ্জাম এবং শক্তিতে এত বড় বিনিয়োগের প্রয়োজন হবে; আপনি যা লাভ করবেন তার চেয়ে বেশি খরচ করার সম্ভাবনা রয়েছে। + +[প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow/) সম্পর্কে আরও জানুন + +### প্রুফ-অফ-স্টেক ভিত্তিক {#proof-of-stake} + +ইথেরিয়াম এখন একটি **প্রুফ-অফ-স্টেক (PoS)** ভিত্তিক কনসেন্সাস প্রোটোকল ব্যবহার করে। + +#### ব্লক তৈরি {#pos-block-creation} + +ভ্যালিডেটররা ব্লক তৈরি করে। প্রতিটি স্লটে একজন ভ্যালিডেটরকে ব্লক প্রোপোজার হিসেবে এলোমেলোভাবে নির্বাচন করা হয়। তাদের কনসেন্সাস ক্লায়েন্ট তাদের পেয়ারড এক্সিকিউশন ক্লায়েন্ট থেকে একটি 'এক্সিকিউশন পেলোড' হিসাবে লেনদেনের একটি বান্ডিল অনুরোধ করে। তারা এটিকে কনসেন্সাস ডেটাতে মুড়ে একটি ব্লক তৈরি করে, যা তারা ইথেরিয়াম নেটওয়ার্কের অন্যান্য নোডগুলিতে পাঠায়। এই ব্লক উৎপাদনের জন্য ETH-এ পুরস্কৃত করা হয়। বিরল ক্ষেত্রে যখন একটি একক স্লটের জন্য একাধিক সম্ভাব্য ব্লক বিদ্যমান থাকে, বা নোডগুলি বিভিন্ন সময়ে ব্লক সম্পর্কে জানতে পারে, তখন ফর্ক চয়েস অ্যালগরিদম সেই ব্লকটি বেছে নেয় যা অ্যাটেস্টেশনের সর্বাধিক ওজন সহ চেইন গঠন করে (যেখানে ওজন হল তাদের ETH ব্যালেন্স দ্বারা স্কেল করা অ্যাটেস্টিং ভ্যালিডেটরদের সংখ্যা)। + +#### নিরাপত্তা {#pos-security} + +একটি প্রুফ-অফ-স্টেক সিস্টেম ক্রিপ্টো-অর্থনৈতিকভাবে সুরক্ষিত কারণ চেইনের নিয়ন্ত্রণ নেওয়ার চেষ্টাকারী একজন আক্রমণকারীকে বিপুল পরিমাণ ETH ধ্বংস করতে হবে। একটি পুরষ্কার ব্যবস্থা স্বতন্ত্র স্টেকারদের সৎভাবে আচরণ করতে উৎসাহিত করে, এবং শাস্তিগুলি স্টেকারদের দূষিতভাবে কাজ করা থেকে নিরুৎসাহিত করে। + +[প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) সম্পর্কে আরও জানুন + +### একটি ভিজ্যুয়াল গাইড {#types-of-consensus-video} + +ইথেরিয়ামে ব্যবহৃত বিভিন্ন ধরণের কনসেন্সাস মেকানিজম সম্পর্কে আরও দেখুন: + + + +### সি বিল প্রতিরোধ ও চেইন নির্বাচন {#sybil-chain} + +প্রুফ-অফ-ওয়ার্ক এবং প্রুফ-অফ-স্টেক একা কনসেন্সাস প্রোটোকল নয়, তবে সরলতার জন্য প্রায়শই তাদের সেভাবে উল্লেখ করা হয়। এগুলি আসলে সি বিল প্রতিরোধের মেকানিজম এবং ব্লক অথর নির্বাচক; সর্বশেষ ব্লকের লেখক কে তা সিদ্ধান্ত নেওয়ার একটি উপায়। আরেকটি গুরুত্বপূর্ণ উপাদান হল চেইন সিলেকশন (ওরফে ফর্ক চয়েস) অ্যালগরিদম যা নোডগুলিকে চেইনের হেডে একটি একক সঠিক ব্লক বেছে নিতে সক্ষম করে, এমন পরিস্থিতিতে যেখানে একই অবস্থানে একাধিক ব্লক বিদ্যমান। + +**সি বিল প্রতিরোধ** পরিমাপ করে যে একটি প্রোটোকল একটি সি বিল আক্রমণের বিরুদ্ধে কতটা ভালো কাজ করে। এই ধরনের আক্রমণের প্রতিরোধ একটি ডিসেন্ট্রালাইজড ব্লকচেইনের জন্য অপরিহার্য এবং মাইনার ও ভ্যালিডেটরদের দেওয়া রিসোর্সের উপর ভিত্তি করে সমানভাবে পুরস্কৃত হতে সক্ষম করে। প্রুফ-অফ-ওয়ার্ক এবং প্রুফ-অফ-স্টেক ব্যবহারকারীদের প্রচুর শক্তি ব্যয় করতে বা প্রচুর জামানত রাখতে বাধ্য করে এর বিরুদ্ধে সুরক্ষা দেয়। এই সুরক্ষাগুলি সি বিল আক্রমণের জন্য একটি অর্থনৈতিক প্রতিবন্ধক। + +একটি **চেইন নির্বাচন নিয়ম** ব্যবহার করা হয় কোন চেইনটি "সঠিক" চেইন তা সিদ্ধান্ত নেওয়ার জন্য। বিটকয়েন "দীর্ঘতম চেইন" নিয়মটি ব্যবহার করে, যার অর্থ হল যে ব্লকচেইনটি সবচেয়ে দীর্ঘ হবে, সেটিকেই বাকি নোডগুলি বৈধ হিসাবে গ্রহণ করবে এবং সেটির সাথে কাজ করবে। প্রুফ-অফ-ওয়ার্ক চেইনের জন্য, দীর্ঘতম চেইনটি চেইনের মোট ক্রমবর্ধমান প্রুফ-অফ-ওয়ার্ক ডিফিকাল্টি দ্বারা নির্ধারিত হয়। ইথেরিয়ামও দীর্ঘতম চেইন নিয়ম ব্যবহার করত; তবে, এখন যেহেতু ইথেরিয়াম প্রুফ-অফ-স্টেকের উপর চলে, এটি একটি আপডেট করা ফর্ক-চয়েস অ্যালগরিদম গ্রহণ করেছে যা চেইনের 'ওজন' পরিমাপ করে। ওজন হল ভ্যালিডেটর ভোটের সঞ্চিত যোগফল, যা ভ্যালিডেটরের স্টেক করা-ইথার ব্যালেন্স দ্বারা ওজন করা হয়। + +ইথেরিয়াম [Gasper](/developers/docs/consensus-mechanisms/pos/gasper/) নামে পরিচিত একটি কনসেন্সাস মেকানিজম ব্যবহার করে যা [Casper FFG প্রুফ-অফ-স্টেক](https://arxiv.org/abs/1710.09437)-কে [GHOST ফর্ক-চয়েস নিয়ম](https://arxiv.org/abs/2003.03052)-এর সাথে একত্রিত করে। + +## আরও পড়ুন {#further-reading} + +- [একটি ব্লকচেইন কনসেন্সাস অ্যালগরিদম কী?](https://academy.binance.com/en/articles/what-is-a-blockchain-consensus-algorithm) +- [নাকামোতো কনসেন্সাস কী? সম্পূর্ণ নতুনদের জন্য গাইড](https://blockonomi.com/nakamoto-consensus/) +- [ক্যাসপার কীভাবে কাজ করে?](https://medium.com/unitychain/intro-to-casper-ffg-9ed944d98b2d) +- [প্রুফ অফ ওয়ার্ক ব্লকচেইনগুলির সুরক্ষা এবং পারফরম্যান্সের উপর](https://eprint.iacr.org/2016/555.pdf) +- [বাইজান্টাইন ফল্ট](https://en.wikipedia.org/wiki/Byzantine_fault) + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow/) +- [মাইনিং](/developers/docs/consensus-mechanisms/pow/mining/) +- [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) +- [প্রুফ-অফ-অথোরিটি](/developers/docs/consensus-mechanisms/poa/) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/poa/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/poa/index.md new file mode 100644 index 00000000000..6f7067b6d73 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/poa/index.md @@ -0,0 +1,80 @@ +--- +title: "প্রুফ-অফ-অথোরিটি (PoA)" +description: "প্রুফ-অফ-অথোরিটি কনসেন্সাস প্রোটোকল এবং ব্লকচেইন ইকোসিস্টেমে এর ভূমিকার একটি ব্যাখ্যা।" +lang: bn +--- + +**প্রুফ-অফ-অথোরিটি (PoA)** হলো একটি খ্যাতি-ভিত্তিক কনসেন্সাস অ্যালগরিদম যা [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) এর একটি পরিবর্তিত সংস্করণ। এটি বেশিরভাগ প্রাইভেট চেইন, টেস্টনেট এবং স্থানীয় ডেভেলপমেন্ট নেটওয়ার্ক দ্বারা ব্যবহৃত হয়। PoA একটি খ্যাতি-ভিত্তিক কনসেন্সাস অ্যালগরিদম যার জন্য ব্লক তৈরি করার জন্য একদল অনুমোদিত স্বাক্ষরকারীদের উপর বিশ্বাস রাখতে হয়, PoS-এর স্টেক-ভিত্তিক প্রক্রিয়ার পরিবর্তে। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালোভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে [ট্রানজ্যাকশন](/developers/docs/transactions/), [ব্লক](/developers/docs/blocks/), এবং [কনসেন্সাস মেকানিজম](/developers/docs/consensus-mechanisms/) সম্পর্কে পড়ার পরামর্শ দিচ্ছি। + +## প্রুফ-অফ-অথোরিটি (PoA) কী? {#what-is-poa} + +প্রুফ-অফ-অথোরিটি হলো **[প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) (PoS)**-এর একটি পরিবর্তিত সংস্করণ যা PoS-এর স্টেক-ভিত্তিক প্রক্রিয়ার পরিবর্তে একটি খ্যাতি-ভিত্তিক কনসেন্সাস অ্যালগরিদম। এই শব্দটি 2017 সালে গ্যাভিন উড প্রথম প্রবর্তন করেন, এবং এই কনসেন্সাস অ্যালগরিদমটি বেশিরভাগ প্রাইভেট চেইন, টেস্টনেট এবং স্থানীয় ডেভেলপমেন্ট নেটওয়ার্ক দ্বারা ব্যবহৃত হয়েছে, কারণ এটি PoW-এর মতো উচ্চ মানের রিসোর্সের প্রয়োজনীয়তা কাটিয়ে ওঠে, এবং ব্লকচেইন সংরক্ষণ এবং ব্লক তৈরি করা নোডগুলির একটি ছোট উপসেট থাকার মাধ্যমে PoS-এর সাথে স্কেলেবিলিটি সমস্যাগুলি কাটিয়ে ওঠে। + +প্রুফ-অফ-অথোরিটির জন্য অনুমোদিত স্বাক্ষরকারীদের একটি সেটের উপর বিশ্বাস রাখতে হয় যা [জেনেসিস ব্লক](/glossary/#genesis-block)-এ সেট করা থাকে। বেশিরভাগ বর্তমান বাস্তবায়নে, চেইনের কনসেন্সাস নির্ধারণ করার সময় সমস্ত অনুমোদিত স্বাক্ষরকারী সমান ক্ষমতা এবং সুযোগ-সুবিধা বজায় রাখে। খ্যাতি স্টেকিংয়ের পেছনের ধারণাটি হল যে প্রত্যেক অনুমোদিত ভ্যালিডেটর নো ইয়োর কাস্টমার (KYC)-এর মতো জিনিসের মাধ্যমে সবার কাছে সুপরিচিত, অথবা একমাত্র ভ্যালিডেটর হিসেবে একটি সুপরিচিত সংস্থা থাকার মাধ্যমে — এইভাবে যদি কোনও ভ্যালিডেটর কোনও ভুল করে, তবে তাদের পরিচয় জানা যায়। + +PoA-এর একাধিক বাস্তবায়ন রয়েছে, তবে স্ট্যান্ডার্ড ইথেরিয়াম বাস্তবায়ন হল **clique**, যা [EIP-225](https://eips.ethereum.org/EIPS/eip-225) প্রয়োগ করে। Clique ডেভেলপার-বান্ধব এবং সহজে প্রয়োগযোগ্য একটি স্ট্যান্ডার্ড, যা সমস্ত ক্লায়েন্ট সিঙ্কিং টাইপ সমর্থন করে। অন্যান্য বাস্তবায়নের মধ্যে রয়েছে [IBFT 2.0](https://besu.hyperledger.org/private-networks/concepts/poa) এবং [Aura](https://openethereum.github.io/Chain-specification)। + +## এটি কিভাবে কাজ করে {#how-it-works} + +PoA-তে, নতুন ব্লক তৈরি করার জন্য অনুমোদিত স্বাক্ষরকারীদের একটি সেট নির্বাচন করা হয়। স্বাক্ষরকারীদের তাদের খ্যাতির ভিত্তিতে নির্বাচন করা হয়, এবং শুধুমাত্র তাদেরই নতুন ব্লক তৈরি করার অনুমতি দেওয়া হয়। স্বাক্ষরকারীদের একটি রাউন্ড-রবিন পদ্ধতিতে নির্বাচন করা হয়, এবং প্রত্যেক স্বাক্ষরকারীকে একটি নির্দিষ্ট সময়সীমার মধ্যে একটি ব্লক তৈরি করার অনুমতি দেওয়া হয়। ব্লক তৈরির সময় নির্দিষ্ট, এবং স্বাক্ষরকারীদের সেই সময়সীমার মধ্যে একটি ব্লক তৈরি করতে হয়। + +এই প্রসঙ্গে খ্যাতি কোনো পরিমাণগত জিনিস নয়, বরং এটি Microsoft এবং Google-এর মতো সুপরিচিত কর্পোরেশনগুলির খ্যাতি, তাই বিশ্বস্ত স্বাক্ষরকারী নির্বাচন করার পদ্ধতিটি অ্যালগরিদমিক নয় বরং এটি _আস্থা_র স্বাভাবিক মানবিক কাজ, যেখানে একটি সত্তা, ধরা যাক উদাহরণস্বরূপ Microsoft, শত শত বা হাজার হাজার স্টার্টআপের মধ্যে একটি PoA প্রাইভেট নেটওয়ার্ক তৈরি করে এবং ভবিষ্যতে Google-এর মতো অন্যান্য সুপরিচিত স্বাক্ষরকারীদের যোগ করার সম্ভাবনা সহ একমাত্র বিশ্বস্ত স্বাক্ষরকারী হিসাবে নিজেকে ভূমিকা পালন করে, স্টার্টআপগুলি নিঃসন্দেহে, Microsoft-কে সব সময় সৎভাবে কাজ করতে এবং নেটওয়ার্ক ব্যবহার করতে বিশ্বাস করবে। এটি বিভিন্ন ছোট/প্রাইভেট নেটওয়ার্কে স্টেক করার প্রয়োজনীয়তা সমাধান করে যা বিভিন্ন উদ্দেশ্যে তৈরি করা হয়েছিল যাতে সেগুলিকে বিকেন্দ্রীভূত এবং কার্যকরী রাখা যায়, সেইসাথে মাইনারদের প্রয়োজনীয়তাও, যা প্রচুর শক্তি এবং রিসোর্স খরচ করে। কিছু প্রাইভেট নেটওয়ার্ক PoA স্ট্যান্ডার্ড ব্যবহার করে যেমন VeChain, এবং কিছু এটি পরিবর্তন করে যেমন Binance যা [PoSA](https://academy.binance.com/en/glossary/proof-of-staked-authority-posa) ব্যবহার করে যা PoA এবং PoS-এর একটি কাস্টম পরিবর্তিত সংস্করণ। + +ভোটদান প্রক্রিয়াটি স্বাক্ষরকারীরা নিজেরাই করে থাকেন। প্রত্যেক স্বাক্ষরকারী যখন একটি নতুন ব্লক তৈরি করে তখন তাদের ব্লকে একজন স্বাক্ষরকারীকে যোগ বা অপসারণের জন্য ভোট দেয়। ভোটগুলি নোড দ্বারা গণনা করা হয়, এবং ভোট একটি নির্দিষ্ট `SIGNER_LIMIT` থ্রেশহোল্ডে পৌঁছানোর উপর ভিত্তি করে স্বাক্ষরকারীদের যোগ বা অপসারণ করা হয়। + +এমন পরিস্থিতি হতে পারে যেখানে ছোট ফর্ক ঘটে, একটি ব্লকের ডিফিকাল্টি নির্ভর করে ব্লকটি পালাক্রমে বা পালার বাইরে স্বাক্ষরিত হয়েছিল কিনা তার উপর। “পালাক্রমে” ব্লকগুলির ডিফিকাল্টি 2, এবং “পালার বাইরে” ব্লকগুলির ডিফিকাল্টি 1। ছোট ফর্কের ক্ষেত্রে, যে চেইনে বেশিরভাগ স্বাক্ষরকারী “পালাক্রমে” ব্লক সিল করে, সেটি সবচেয়ে বেশি ডিফিকাল্টি সংগ্রহ করবে এবং জিতবে। + +## আক্রমণের ভেক্টর {#attack-vectors} + +### দূষিত স্বাক্ষরকারী {#malicious-signers} + +একজন দূষিত ব্যবহারকারীকে স্বাক্ষরকারীদের তালিকায় যুক্ত করা যেতে পারে, অথবা একটি সাইনিং কী/মেশিন আপোস করা হতে পারে। এই ধরনের পরিস্থিতিতে প্রোটোকলটিকে পুনর্গঠন এবং স্প্যামিংয়ের বিরুদ্ধে নিজেকে রক্ষা করতে সক্ষম হতে হবে। প্রস্তাবিত সমাধানটি হল N সংখ্যক অনুমোদিত স্বাক্ষরকারীদের একটি তালিকা দেওয়া হলে, যে কোনো স্বাক্ষরকারী প্রতি K-এর মধ্যে শুধুমাত্র 1টি ব্লক মিন্ট করতে পারবে। এটি নিশ্চিত করে যে ক্ষতি সীমিত, এবং অবশিষ্ট ভ্যালিডেটররা দূষিত ব্যবহারকারীকে ভোট দিয়ে বের করে দিতে পারে। + +### সেন্সরশিপ {#censorship-attack} + +আরেকটি আকর্ষণীয় আক্রমণের ভেক্টর হল যদি একজন স্বাক্ষরকারী (বা স্বাক্ষরকারীদের একটি গোষ্ঠী) সেই ব্লকগুলিকে সেন্সর করার চেষ্টা করে যেগুলি তাদেরকে অনুমোদন তালিকা থেকে সরানোর জন্য ভোট দেয়। এটি এড়াতে, স্বাক্ষরকারীদের অনুমোদিত মিন্টিং ফ্রিকোয়েন্সি N/2-এর মধ্যে 1-এ সীমাবদ্ধ করা হয়েছে। এটি নিশ্চিত করে যে দূষিত স্বাক্ষরকারীদের সাইনিং অ্যাকাউন্টের কমপক্ষে 51% নিয়ন্ত্রণ করতে হবে, যে সময়ে তারা কার্যকরভাবে চেইনের জন্য নতুন সত্যের উৎস হয়ে উঠবে। + +### স্প্যাম {#spam-attack} + +আরেকটি ছোট আক্রমণের ভেক্টর হল দূষিত স্বাক্ষরকারীরা তাদের মিন্ট করা প্রতিটি ব্লকের ভিতরে নতুন ভোটের প্রস্তাব ইনজেক্ট করা। যেহেতু অনুমোদিত স্বাক্ষরকারীদের আসল তালিকা তৈরি করতে নোডগুলিকে সমস্ত ভোট গণনা করতে হয়, তাই তাদের অবশ্যই সময়ের সাথে সাথে সমস্ত ভোট রেকর্ড করতে হবে। ভোট উইন্ডোতে একটি সীমা নির্ধারণ না করলে, এটি ধীরে ধীরে, তবুও সীমাহীনভাবে বাড়তে পারে। সমাধান হল W ব্লকের একটি _চলমান_ উইন্ডো স্থাপন করা যার পরে ভোটগুলিকে পুরানো বলে মনে করা হয়। _একটি যুক্তিসঙ্গত উইন্ডো 1-2 ইপক হতে পারে।_ + +### সমবর্তী ব্লক {#concurrent-blocks} + +একটি PoA নেটওয়ার্কে, যখন N সংখ্যক অনুমোদিত স্বাক্ষরকারী থাকে, তখন প্রত্যেক স্বাক্ষরকারীকে K-এর মধ্যে 1টি ব্লক মিন্ট করার অনুমতি দেওয়া হয়, যার মানে হল N-K+1 ভ্যালিডেটরকে যেকোনো নির্দিষ্ট সময়ে মিন্ট করার অনুমতি দেওয়া হয়। এই ভ্যালিডেটরদের ব্লকগুলির জন্য প্রতিযোগিতা করা থেকে বিরত রাখতে, প্রতিটি স্বাক্ষরকারীর একটি নতুন ব্লক প্রকাশ করার সময়ে একটি ছোট র‍্যান্ডম "অফসেট" যোগ করা উচিত। যদিও এই প্রক্রিয়াটি নিশ্চিত করে যে ছোট ফর্ক বিরল, তবুও মেইননেটের মতোই মাঝে মাঝে ফর্ক ঘটতে পারে। যদি একজন স্বাক্ষরকারীকে তার ক্ষমতার অপব্যবহার করতে এবং বিশৃঙ্খলা সৃষ্টি করতে দেখা যায়, তবে অন্যান্য স্বাক্ষরকারীরা তাকে ভোট দিয়ে বের করে দিতে পারে। + +উদাহরণস্বরূপ, যদি 10 জন অনুমোদিত স্বাক্ষরকারী থাকে এবং প্রত্যেক স্বাক্ষরকারীকে 20টির মধ্যে 1টি ব্লক তৈরি করার অনুমতি দেওয়া হয়, তাহলে যেকোনো সময়ে 11 জন ভ্যালিডেটর ব্লক তৈরি করতে পারে। তাদেরকে ব্লক তৈরির জন্য প্রতিযোগিতা করা থেকে বিরত রাখতে, প্রতিটি স্বাক্ষরকারী একটি নতুন ব্লক প্রকাশ করার সময়ে একটি ছোট র‍্যান্ডম "অফসেট" যোগ করে। এটি ছোট ফর্কের ঘটনা হ্রাস করে কিন্তু ইথেরিয়াম মেইননেটে দেখা যায় এমন মাঝে মাঝে ফর্কের অনুমতি দেয়। যদি একজন স্বাক্ষরকারী তাদের কর্তৃত্বের অপব্যবহার করে এবং বিঘ্ন ঘটায়, তবে তাদেরকে নেটওয়ার্ক থেকে ভোট দিয়ে বের করে দেওয়া যেতে পারে। + +## সুবিধা এবং অসুবিধা {#pros-and-cons} + +| যেসব বিষয়ে এর সুফল পাওয়া যায় | কনস | +| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| PoS এবং PoW-এর মতো অন্যান্য জনপ্রিয় পদ্ধতির চেয়ে বেশি স্কেলেবল, কারণ এটি সীমিত সংখ্যক ব্লক স্বাক্ষরকারীর উপর ভিত্তি করে। | PoA নেটওয়ার্কগুলিতে সাধারণত অপেক্ষাকৃত কম সংখ্যক ভ্যালিডেটিং নোড থাকে। এটি একটি PoA নেটওয়ার্ককে আরও কেন্দ্রীভূত করে তোলে। | +| PoA ব্লকচেইন চালানো এবং রক্ষণাবেক্ষণ করা অবিশ্বাস্যভাবে সস্তা। | একজন অনুমোদিত স্বাক্ষরকারী হওয়া সাধারণত একজন সাধারণ মানুষের নাগালের বাইরে, কারণ ব্লকচেইনটির জন্য প্রতিষ্ঠিত খ্যাতিসম্পন্ন সত্তার প্রয়োজন হয়। | +| লেনদেন খুব দ্রুত নিশ্চিত হয় কারণ এটি 1 সেকেন্ডেরও কম সময়ে পৌঁছাতে পারে কারণ নতুন ব্লক যাচাই করার জন্য কেবল সীমিত সংখ্যক স্বাক্ষরকারীর প্রয়োজন হয়। | দূষিত স্বাক্ষরকারীরা নেটওয়ার্কে রিঅর্গ, ডাবল স্পেন্ড, লেনদেন সেন্সর করতে পারে, এই আক্রমণগুলি প্রশমিত করা হলেও তা এখনও সম্ভব। | + +## আরও পড়ুন {#further-reading} + +- [EIP-225](https://eips.ethereum.org/EIPS/eip-225) _Clique স্ট্যান্ডার্ড_ +- [প্রুফ অফ অথরিটি স্টাডি](https://github.com/cryptoeconomics-study/website/blob/master/docs/sync/2.4-lecture.md) _ক্রিপ্টোইকোনমিক্স_ +- [প্রুফ অফ অথরিটি কী](https://forum.openzeppelin.com/t/proof-of-authority/3577) _OpenZeppelin_ +- [প্রুফ অফ অথরিটির ব্যাখ্যা](https://academy.binance.com/en/articles/proof-of-authority-explained) _binance_ +- [ব্লকচেইনে PoA](https://medium.com/techskill-brew/proof-of-authority-or-poa-in-blockchain-part-11-blockchain-series-be15b3321cba) +- [Clique-এর ব্যাখ্যা](https://medium.com/@Destiner/clique-cross-client-proof-of-authority-algorithm-for-ethereum-8b2a135201d) +- [অপ্রচলিত PoA, Aura স্পেসিফিকেশন](https://openethereum.github.io/Chain-specification) +- [IBFT 2.0, আরেকটি PoA বাস্তবায়ন](https://besu.hyperledger.org/private-networks/concepts/poa) + +### আপনি কি দেখে শিখতে বেশি পছন্দ করেন? {#visual-learner} + +প্রুফ-অফ-অথোরিটির একটি ভিজ্যুয়াল ব্যাখ্যা দেখুন: + + + +## সম্পর্কিত বিষয় {#related-topics} + +- [প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow/) +- [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) + diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md new file mode 100644 index 00000000000..adad61e7683 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/attack-and-defense/index.md @@ -0,0 +1,166 @@ +--- +title: "ইথেরিয়াম প্রুফ-অফ-স্টেক আক্রমণ এবং প্রতিরক্ষা" +description: "প্রুফ-অফ-স্টেক ইথেরিয়ামের পরিচিত আক্রমণ ভেক্টর এবং কীভাবে সেগুলি থেকে প্রতিরক্ষা করা হয়, সে সম্পর্কে জানুন।" +lang: bn +--- + +চোর এবং নাশকতাকারীরা ক্রমাগত ইথেরিয়ামের ক্লায়েন্ট সফটওয়্যার আক্রমণ করার সুযোগ খুঁজছে। এই পৃষ্ঠাটিতে ইথেরিয়ামের কনসেন্সাস লেয়ারের ওপর পরিচিত আক্রমণ ভেক্টরগুলির রূপরেখা দেওয়া হয়েছে এবং কীভাবে সেই আক্রমণগুলির বিরুদ্ধে প্রতিরক্ষা করা যায়, তারও রূপরেখা দেওয়া হয়েছে। এই পৃষ্ঠার তথ্য একটি [দীর্ঘ সংস্করণ](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) থেকে অভিযোজিত। + +## পূর্বশর্ত {#prerequisites} + +[প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) সম্পর্কে কিছু প্রাথমিক জ্ঞান থাকা প্রয়োজন। এছাড়াও, ইথেরিয়ামের [ইনসেন্টিভ লেয়ার](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) এবং ফর্ক-চয়েস অ্যালগরিদম, [LMD-GHOST](/developers/docs/consensus-mechanisms/pos/gasper) সম্পর্কে একটি প্রাথমিক ধারণা থাকা সহায়ক হবে। + +## আক্রমণকারীরা কী চায়? {#what-do-attackers-want} + +একটি সাধারণ ভুল ধারণা হল যে একজন সফল আক্রমণকারী নতুন ইথার তৈরি করতে পারে, বা নির্বিচার অ্যাকাউন্ট থেকে ইথার সরিয়ে নিতে পারে। এর কোনোটিই সম্ভব নয় কারণ নেটওয়ার্কের সমস্ত এক্সিকিউশন ক্লায়েন্ট দ্বারা সমস্ত লেনদেন কার্যকর করা হয়। তাদের অবশ্যই বৈধতার প্রাথমিক শর্তগুলি পূরণ করতে হবে (যেমন, লেনদেনগুলি প্রেরকের প্রাইভেট কী দ্বারা স্বাক্ষরিত, প্রেরকের পর্যাপ্ত ব্যালেন্স রয়েছে, ইত্যাদি) অন্যথায় সেগুলি কেবল প্রত্যাবর্তন করে। এমন তিন ধরনের ফলাফল রয়েছে যা একজন আক্রমণকারী বাস্তবিকভাবে লক্ষ্য করতে পারে: রিঅর্গ, ডাবল ফাইনালিটি বা ফাইনালিটি ডিলে। + +একটি **“রিঅর্গ”** হলো ক্যানোনিকাল চেইনে ব্লকগুলির একটি নতুন ক্রমে পুনর্বিন্যাস করা, সম্ভবত কিছু ব্লক যোগ বা বিয়োগ করে। একটি বিদ্বেষপূর্ণ রিঅর্গ নির্দিষ্ট ব্লক অন্তর্ভুক্ত বা বাদ দেওয়া নিশ্চিত করতে পারে, যা ডাবল-স্পেন্ডিং বা ফ্রন্ট-রানিং এবং ব্যাক-রানিং লেনদেনের (MEV) মাধ্যমে মূল্য আহরণের সুযোগ দেয়। রি-অর্গগুলি ক্যানোনিকাল চেইনে নির্দিষ্ট লেনদেনকে অন্তর্ভুক্ত হওয়া থেকে আটকাতেও ব্যবহার করা যেতে পারে - যা এক ধরনের সেন্সরশিপ। রিঅর্গের সবচেয়ে চরম রূপ হলো “ফাইনালিটি রিভার্সন”, যা পূর্বে ফাইনাল হওয়া ব্লকগুলিকে সরিয়ে দেয় বা প্রতিস্থাপন করে। এটি কেবল তখনই সম্ভব যদি আক্রমণকারী মোট স্টেক করা ইথারের ⅓-এর বেশি ধ্বংস করে দেয় - এই নিশ্চয়তাটি “ইকোনমিক ফাইনালিটি” নামে পরিচিত - এই বিষয়ে পরে আরও আলোচনা করা হবে। + +**ডাবল ফাইনালিটি** হল একটি অসম্ভাব্য কিন্তু গুরুতর পরিস্থিতি যেখানে দুটি ফর্ক একযোগে ফাইনাল হতে পারে, যা চেইনে একটি স্থায়ী বিভেদ তৈরি করে। মোট স্টেক করা ইথারের 34% ঝুঁকি নিতে ইচ্ছুক একজন আক্রমণকারীর জন্য এটি তাত্ত্বিকভাবে সম্ভব। সম্প্রদায়কে অফচেইন সমন্বয় করতে এবং কোন চেইন অনুসরণ করতে হবে সে সম্পর্কে একটি চুক্তিতে আসতে বাধ্য করা হবে, যার জন্য সামাজিক লেয়ারে শক্তির প্রয়োজন হবে। + +একটি **ফাইনালিটি ডিলে** আক্রমণ নেটওয়ার্ককে চেইনের বিভাগগুলোকে ফাইনাল করার জন্য প্রয়োজনীয় শর্তে পৌঁছাতে বাধা দেয়। ফাইনালিটি ছাড়া, ইথেরিয়ামের উপরে নির্মিত আর্থিক অ্যাপ্লিকেশনগুলিকে বিশ্বাস করা কঠিন। একটি ফাইনালিটি ডিলে আক্রমণের লক্ষ্য সম্ভবত সরাসরি লাভের পরিবর্তে ইথেরিয়ামকে ব্যাহত করা, যদি না আক্রমণকারীর কিছু কৌশলগত শর্ট পজিশন থাকে। + +সামাজিক লেয়ারের উপর একটি আক্রমণের লক্ষ্য হতে পারে ইথেরিয়ামের উপর জনসাধারণের আস্থা নষ্ট করা, ইথারের অবমূল্যায়ন করা, গ্রহণ হ্রাস করা বা ইথেরিয়াম সম্প্রদায়কে দুর্বল করা যাতে ব্যান্ডের বাইরের সমন্বয় আরও কঠিন হয়ে ওঠে। + +একজন প্রতিপক্ষ কেন ইথেরিয়ামকে আক্রমণ করতে পারে তা প্রতিষ্ঠা করার পর, নিম্নলিখিত বিভাগগুলি পরীক্ষা করে যে তারা _কীভাবে_ এটি করতে পারে। + +## আক্রমণের পদ্ধতি {#methods-of-attack} + +### লেয়ার 0 আক্রমণ {#layer-0} + +প্রথমত, যে ব্যক্তিরা সক্রিয়ভাবে ইথেরিয়ামে অংশগ্রহণ করছেন না (ক্লায়েন্ট সফ্টওয়্যার চালানোর মাধ্যমে) তারা সামাজিক স্তর (লেয়ার 0) লক্ষ্য করে আক্রমণ করতে পারেন। লেয়ার 0 হল সেই ভিত্তি যার উপর ইথেরিয়াম নির্মিত, এবং সেই কারণে এটি আক্রমণের জন্য একটি সম্ভাব্য ক্ষেত্র যার পরিণতি বাকি স্ট্যাকের মাধ্যমে ছড়িয়ে পড়ে। কিছু উদাহরণ অন্তর্ভুক্ত হতে পারে: + +- একটি ভুল তথ্য প্রচার ইথেরিয়ামের রোডম্যাপ, ডেভেলপারদের দল, অ্যাপস ইত্যাদির প্রতি সম্প্রদায়ের আস্থাকে ক্ষয় করতে পারে। এটি তখন নেটওয়ার্ক সুরক্ষিত করতে ইচ্ছুক ব্যক্তির সংখ্যা হ্রাস করতে পারে, যা বিকেন্দ্রীকরণ এবং ক্রিপ্টো-অর্থনৈতিক নিরাপত্তা উভয়কেই হ্রাস করে। + +- ডেভেলপার সম্প্রদায়ের প্রতি লক্ষ্যবস্তু আক্রমণ এবং/অথবা ভীতি প্রদর্শন। এটি ডেভেলপারদের স্বেচ্ছায় প্রস্থান এবং ইথেরিয়ামের অগ্রগতি মন্থর করতে পারে। + +- অতিরিক্ত উদ্যোগী নিয়ন্ত্রণকেও লেয়ার 0-এর উপর আক্রমণ হিসাবে বিবেচনা করা যেতে পারে, কারণ এটি দ্রুত অংশগ্রহণ এবং গ্রহণকে নিরুৎসাহিত করতে পারে। + +- ডেভেলপার সম্প্রদায়ে জ্ঞানী কিন্তু দূষিত অভিনেতাদের অনুপ্রবেশ যাদের লক্ষ্য হল বাইক-শেডিং আলোচনার মাধ্যমে অগ্রগতি মন্থর করা, মূল সিদ্ধান্ত বিলম্বিত করা, স্প্যাম তৈরি করা ইত্যাদি। + +- সিদ্ধান্ত গ্রহণে প্রভাব ফেলতে ইথেরিয়াম ইকোসিস্টেমের মূল খেলোয়াড়দের ঘুষ দেওয়া। + +যা এই আক্রমণগুলিকে বিশেষভাবে বিপজ্জনক করে তোলে তা হল অনেক ক্ষেত্রে খুব কম মূলধন বা প্রযুক্তিগত জ্ঞানের প্রয়োজন হয়। একটি লেয়ার 0 আক্রমণ একটি ক্রিপ্টো-অর্থনৈতিক আক্রমণের উপর একটি গুণক হতে পারে। উদাহরণস্বরূপ, যদি একটি বিদ্বেষপরায়ণ সংখ্যাগরিষ্ঠ স্টেকহোল্ডার দ্বারা সেন্সরশিপ বা ফাইনালিটি রিভার্সন অর্জন করা হয়, তাহলে সামাজিক লেয়ারকে দুর্বল করা একটি সম্প্রদায় প্রতিক্রিয়াকে ব্যান্ডের বাইরে সমন্বয় করা আরও কঠিন করে তুলতে পারে। + +লেয়ার 0 আক্রমণের বিরুদ্ধে প্রতিরক্ষা সম্ভবত সহজবোধ্য নয়, তবে কিছু মৌলিক নীতি স্থাপন করা যেতে পারে। একটি হল ইথেরিয়াম সম্পর্কে জনসাধারণের তথ্যের জন্য একটি সামগ্রিক উচ্চ সংকেত-থেকে-শব্দ অনুপাত বজায় রাখা, যা সম্প্রদায়ের সৎ সদস্যদের দ্বারা ব্লগ, ডিসকর্ড সার্ভার, টীকাযুক্ত স্পেক, বই, পডকাস্ট এবং ইউটিউবের মাধ্যমে তৈরি এবং প্রচারিত হয়। এখানে ethereum.org-এ আমরা সঠিক তথ্য বজায় রাখতে এবং এটিকে যতটা সম্ভব ভাষায় অনুবাদ করার জন্য কঠোর চেষ্টা করি। উচ্চ মানের তথ্য এবং মেমে দিয়ে একটি স্থান প্লাবিত করা ভুল তথ্যের বিরুদ্ধে একটি কার্যকর প্রতিরক্ষা। + +সামাজিক লেয়ার আক্রমণের বিরুদ্ধে আরেকটি গুরুত্বপূর্ণ দুর্গ হল একটি স্পষ্ট মিশন বিবৃতি এবং গভর্নেন্স প্রোটোকল। ইথেরিয়াম নিজেকে স্মার্ট-কন্ট্রাক্ট লেয়ার 1-এর মধ্যে বিকেন্দ্রীকরণ এবং নিরাপত্তার চ্যাম্পিয়ন হিসাবে প্রতিষ্ঠিত করেছে, পাশাপাশি স্কেলেবিলিটি এবং স্থায়িত্বকেও অত্যন্ত মূল্য দেয়। ইথেরিয়াম সম্প্রদায়ে যে মতবিরোধই দেখা দিক না কেন, এই মূল নীতিগুলিতে ন্যূনতম আপস করা হয়। এই মূল নীতিগুলির বিরুদ্ধে একটি আখ্যানের মূল্যায়ন করা এবং EIP (ইথেরিয়াম ইমপ্রুভমেন্ট প্রোপোজাল) প্রক্রিয়ায় পর্যালোচনার ধারাবাহিক রাউন্ডের মাধ্যমে সেগুলি পরীক্ষা করা, সম্প্রদায়কে ভাল এবং খারাপ অভিনেতাদের মধ্যে পার্থক্য করতে সাহায্য করতে পারে এবং ইথেরিয়ামের ভবিষ্যতের দিকনির্দেশকে প্রভাবিত করার জন্য দূষিত অভিনেতাদের সুযোগ সীমিত করতে পারে। + +অবশেষে, এটি অত্যন্ত গুরুত্বপূর্ণ যে ইথেরিয়াম সম্প্রদায় সমস্ত অংশগ্রহণকারীদের জন্য উন্মুক্ত এবং স্বাগত জানায়। দ্বাররক্ষক এবং একচেটিয়াতা সহ একটি সম্প্রদায় সামাজিক আক্রমণের জন্য বিশেষভাবে ঝুঁকিপূর্ণ কারণ এটি "আমরা এবং তারা" আখ্যান তৈরি করা সহজ। গোষ্ঠীবাদ এবং বিষাক্ত সর্বোচ্চবাদ সম্প্রদায়ের ক্ষতি করে এবং লেয়ার 0 নিরাপত্তাকে ক্ষয় করে। নেটওয়ার্কের নিরাপত্তায় নিহিত স্বার্থ সহ ইথেরিয়ানদের অনলাইনে এবং মিটস্পেসে তাদের আচরণকে ইথেরিয়ামের লেয়ার 0-এর নিরাপত্তায় সরাসরি অবদানকারী হিসাবে দেখা উচিত। + +### প্রোটোকলে আক্রমণ করা {#attacking-the-protocol} + +যে কেউ ইথেরিয়ামের ক্লায়েন্ট সফ্টওয়্যার চালাতে পারে। একটি ক্লায়েন্টে একটি ভ্যালিডেটর যোগ করতে, একজন ব্যবহারকারীকে ডিপোজিট কন্ট্রাক্টে 32 ইথার স্টেক করতে হবে। একটি ভ্যালিডেটর একজন ব্যবহারকারীকে নতুন ব্লক প্রস্তাব এবং প্রমাণীকরণের মাধ্যমে ইথেরিয়ামের নেটওয়ার্ক নিরাপত্তায় সক্রিয়ভাবে অংশগ্রহণ করতে দেয়। ভ্যালিডেটরের এখন একটি কণ্ঠস্বর আছে যা তারা ব্লকচেইনের ভবিষ্যতের বিষয়বস্তুকে প্রভাবিত করতে ব্যবহার করতে পারে - তারা সততার সাথে এটি করতে পারে এবং পুরস্কারের মাধ্যমে তাদের ইথারের ভান্ডার বাড়াতে পারে অথবা তারা তাদের নিজের সুবিধার জন্য প্রক্রিয়াটিকে কাজে লাগানোর চেষ্টা করতে পারে, তাদের স্টেককে ঝুঁকিতে ফেলে। আক্রমণের একটি উপায় হল মোট স্টেকের একটি বড় অংশ সংগ্রহ করা এবং তারপর সৎ ভ্যালিডেটরদের ছাড়িয়ে যাওয়ার জন্য এটি ব্যবহার করা। আক্রমণকারীর দ্বারা নিয়ন্ত্রিত স্টেকের অনুপাত যত বেশি হবে, তাদের ভোটের ক্ষমতা তত বেশি হবে, বিশেষ করে নির্দিষ্ট অর্থনৈতিক মাইলফলকে যা আমরা পরে অন্বেষণ করব। যাইহোক, বেশিরভাগ আক্রমণকারী এইভাবে আক্রমণ করার জন্য পর্যাপ্ত ইথার সংগ্রহ করতে সক্ষম হবে না, তাই পরিবর্তে তাদের সৎ সংখ্যাগরিষ্ঠকে একটি নির্দিষ্ট উপায়ে কাজ করার জন্য সূক্ষ্ম কৌশল ব্যবহার করতে হবে। + +মূলত, সমস্ত ছোট-স্টেক আক্রমণ হল দুই ধরনের ভ্যালিডেটর অসদাচরণের সূক্ষ্ম ভিন্নতা: কম-ক্রিয়াকলাপ (প্রমাণ/প্রস্তাব করতে ব্যর্থ হওয়া বা দেরিতে করা) বা অতিরিক্ত-ক্রিয়াকলাপ (একটি স্লটে অনেকবার প্রস্তাব/প্রমাণ করা)। তাদের সবচেয়ে সরল রূপে এই ক্রিয়াগুলি ফর্ক-চয়েস অ্যালগরিদম এবং ইনসেনটিভ লেয়ার দ্বারা সহজেই পরিচালিত হয়, তবে আক্রমণকারীর সুবিধার জন্য সিস্টেমটিকে খেলার জন্য চতুর উপায় রয়েছে। + +### অল্প পরিমাণে ETH ব্যবহার করে আক্রমণ {#attacks-by-small-stakeholders} + +#### রিঅর্গ {#reorgs} + +বেশ কয়েকটি গবেষণাপত্রে ইথেরিয়ামের উপর আক্রমণের ব্যাখ্যা দেওয়া হয়েছে যা মোট স্টেক করা ইথারের একটি ছোট অনুপাতের সাথে রিঅর্গ বা ফাইনালিটি ডিলে অর্জন করে। এই আক্রমণগুলি সাধারণত আক্রমণকারীর উপর নির্ভর করে যে তারা অন্যান্য ভ্যালিডেটরদের কাছ থেকে কিছু তথ্য গোপন করে এবং তারপর এটিকে কিছু সূক্ষ্ম উপায়ে এবং/অথবা কিছু সুবিধাজনক মুহূর্তে প্রকাশ করে। তারা সাধারণত ক্যানোনিকাল চেইন থেকে কিছু সৎ ব্লককে স্থানচ্যুত করার লক্ষ্য রাখে। [নিউডার এট আল ২০২০](https://arxiv.org/pdf/2102.02247.pdf) দেখিয়েছেন কিভাবে একজন আক্রমণকারী ভ্যালিডেটর একটি নির্দিষ্ট স্লট `n+1`-এর জন্য একটি ব্লক (`B`) তৈরি করতে এবং প্রমাণ করতে পারে কিন্তু নেটওয়ার্কের অন্যান্য নোডগুলিতে এটি প্রচার করা থেকে বিরত থাকতে পারে। পরিবর্তে, তারা পরবর্তী স্লট `n+2` পর্যন্ত সেই সত্যায়িত ব্লকটি ধরে রাখে। একজন সৎ ভ্যালিডেটর স্লট `n+2` এর জন্য একটি ব্লক (`C`) প্রস্তাব করে। প্রায় একই সাথে, আক্রমণকারী তাদের গোপন রাখা ব্লক (`B`) এবং এর জন্য তাদের গোপন রাখা অ্যাটেস্টেশনগুলি প্রকাশ করতে পারে, এবং স্লট `n+2`-এর জন্য তাদের ভোট দিয়ে চেইনের প্রধান হিসাবে `B`-কে অ্যাটেস্ট করতে পারে, কার্যকরভাবে সৎ ব্লক `C`-এর অস্তিত্ব অস্বীকার করে। যখন সৎ ব্লক `D` প্রকাশ করা হয়, ফর্ক চয়েস অ্যালগরিদম `C`-এর উপর `D` তৈরির চেয়ে `B`-এর উপর `D` তৈরি করাকে ভারী হিসাবে দেখে। আক্রমণকারী তাই একটি 1-ব্লক এক্স অ্যান্টে রিঅর্গ ব্যবহার করে ক্যানোনিকাল চেইন থেকে স্লট `n+2`-এ সৎ ব্লক `C` অপসারণ করতে সক্ষম হয়েছে। [৩৪% স্টেক সহ একজন আক্রমণকারীর](https://www.youtube.com/watch?v=6vzXwwk12ZE) এই আক্রমণে সফল হওয়ার খুব ভাল সুযোগ রয়েছে, যেমনটি [এই নোটে](https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair) ব্যাখ্যা করা হয়েছে। তাত্ত্বিকভাবে, যদিও, এই আক্রমণটি ছোট স্টেক দিয়েও চেষ্টা করা যেতে পারে। [নিউডার এট আল ২০২০](https://arxiv.org/pdf/2102.02247.pdf) এই আক্রমণটিকে ৩০% স্টেক দিয়ে কাজ করার বর্ণনা দিয়েছেন, তবে পরে এটি [মোট স্টেকের ২%](https://arxiv.org/pdf/2009.04987.pdf) দিয়ে কার্যকর দেখানো হয়েছিল এবং তারপরে আবার একটি [একক ভ্যালিডেটরের](https://arxiv.org/abs/2110.10086#) জন্য ব্যালান্সিং কৌশল ব্যবহার করে যা আমরা পরবর্তী বিভাগে পরীক্ষা করব। + +![এক্স-অ্যান্টে রি-অর্গ](reorg-schematic.png) + +উপরে বর্ণিত এক-ব্লক রিঅর্গ আক্রমণের একটি ধারণাগত চিত্র (https://notes.ethereum.org/plgVdz-ORe-fGjK06BZ_3A#Fork-choice-by-block-slot-pair থেকে অভিযোজিত) + +আরও একটি অত্যাধুনিক আক্রমণ সৎ ভ্যালিডেটর সেটকে আলাদা আলাদা গ্রুপে ভাগ করতে পারে যাদের চেইনের প্রধান সম্পর্কে ভিন্ন ভিন্ন দৃষ্টিভঙ্গি রয়েছে। এটি একটি **ব্যালান্সিং আক্রমণ** হিসাবে পরিচিত। আক্রমণকারী একটি ব্লক প্রস্তাব করার সুযোগের জন্য অপেক্ষা করে, এবং যখন এটি আসে তখন তারা সমতুল্য হয় এবং দুটি প্রস্তাব করে। তারা সৎ ভ্যালিডেটর সেটের অর্ধেককে একটি ব্লক পাঠায় এবং অন্য অর্ধেককে অন্য ব্লক পাঠায়। এই ইকুইভোকেশনটি ফর্ক-চয়েস অ্যালগরিদম দ্বারা শনাক্ত করা হবে এবং ব্লক প্রপোজারকে স্ল্যাশ করে নেটওয়ার্ক থেকে বের করে দেওয়া হবে, কিন্তু দুটি ব্লক তখনও বিদ্যমান থাকবে এবং প্রতিটি ফর্কের জন্য ভ্যালিডেটর সেটের প্রায় অর্ধেক অ্যাটেস্ট করবে। এদিকে, অবশিষ্ট বিদ্বেষপরায়ণ ভ্যালিডেটররা তাদের অ্যাটেস্টেশনগুলি আটকে রাখে। তারপরে, একটি বা অন্য ফর্কের পক্ষে অ্যাটেস্টেশনগুলির সঞ্চিত ওজনকে এক বা অন্য ফর্কের পক্ষে ঝুঁকাতে, ঠিক যখন ফর্ক-চয়েস অ্যালগরিদম কার্যকর হয় তখন বেছে বেছে অ্যাটেস্টেশনগুলি যথেষ্ট ভ্যালিডেটরদের কাছে প্রকাশ করে। এটি অনির্দিষ্টকালের জন্য চলতে পারে, আক্রমণকারী ভ্যালিডেটররা দুটি ফর্ক জুড়ে ভ্যালিডেটরদের একটি সমান বিভাজন বজায় রাখে। যেহেতু কোনো ফর্কই ২/৩ সুপারমেজরটি আকর্ষণ করতে পারে না, তাই নেটওয়ার্কটি চূড়ান্ত হবে না। + +**বাউন্সিং আক্রমণ** একই রকম। আক্রমণকারী ভ্যালিডেটরদের দ্বারা আবার ভোট আটকে রাখা হয়। দুটি ফর্কের মধ্যে একটি সমান বিভাজন রাখার জন্য ভোট প্রকাশ করার পরিবর্তে, তারা ফর্ক A এবং ফর্ক B-এর মধ্যে পর্যায়ক্রমে চেকপয়েন্টগুলিকে ন্যায্যতা দেওয়ার জন্য সুবিধাজনক মুহূর্তে তাদের ভোট ব্যবহার করে। দুটি ফর্কের মধ্যে ন্যায্যতার এই ফ্লিপ-ফ্লপিং ন্যায্য উত্স এবং লক্ষ্য চেকপয়েন্টগুলির জোড়া হতে বাধা দেয় যা চূড়ান্ত হতে পারে, চূড়ান্ততা বন্ধ করে দেয়। + + + +বাউন্সিং এবং ব্যালেন্সিং উভয় আক্রমণই নেটওয়ার্ক জুড়ে মেসেজ টাইমিং-এর উপর আক্রমণকারীর খুব সূক্ষ্ম নিয়ন্ত্রণের উপর নির্ভর করে, যা অসম্ভাব্য। তবুও, ধীর মেসেজের তুলনায় দ্রুত মেসেজকে অতিরিক্ত ওজন দেওয়ার আকারে প্রোটোকলে প্রতিরক্ষা তৈরি করা হয়। এটি [প্রোপোজার-ওয়েট বুস্টিং](https://github.com/ethereum/consensus-specs/pull/2730) নামে পরিচিত। বাউন্সিং আক্রমণের বিরুদ্ধে রক্ষা করার জন্য ফর্ক-চয়েস অ্যালগরিদম আপডেট করা হয়েছিল যাতে সর্বশেষ ন্যায্য চেকপয়েন্টটি [প্রতিটি যুগের স্লটের প্রথম ১/৩ অংশ চলাকালীন](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) একটি বিকল্প চেইনের সাথে পরিবর্তন করতে পারে। এই শর্তটি আক্রমণকারীকে পরে স্থাপন করার জন্য ভোট সঞ্চয় করা থেকে বিরত রাখে - ফর্ক চয়েস অ্যালগরিদম কেবল সেই চেকপয়েন্টের প্রতি অনুগত থাকে যা এটি যুগের প্রথম ১/৩ অংশে বেছে নিয়েছিল, যে সময়ে বেশিরভাগ সৎ ভ্যালিডেটররা ভোট দিয়েছিল। + +একসাথে, এই পদক্ষেপগুলি এমন একটি পরিস্থিতি তৈরি করে যেখানে একজন সৎ ব্লক প্রস্তাবক স্লটের শুরু হওয়ার সাথে সাথেই খুব দ্রুত তাদের ব্লক নির্গত করে, তারপরে প্রায় ১/৩ স্লটের (৪ সেকেন্ড) একটি সময়কাল থাকে যেখানে সেই নতুন ব্লকটি ফর্ক-চয়েস অ্যালগরিদমকে অন্য চেইনে স্যুইচ করতে পারে। একই সময়সীমার পরে, ধীর ভ্যালিডেটরদের কাছ থেকে আসা অ্যাটেস্টেশনগুলিকে আগে আসা অ্যাটেস্টেশনগুলির তুলনায় কম ওজন দেওয়া হয়। এটি চেইনের প্রধান নির্ধারণে দ্রুত প্রস্তাবক এবং ভ্যালিডেটরদের দৃঢ়ভাবে সমর্থন করে এবং একটি সফল ব্যালেন্সিং বা বাউন্সিং আক্রমণের সম্ভাবনা যথেষ্ট হ্রাস করে। + +এটা উল্লেখ করার মতো, যে প্রস্তাবক বুস্টিং একা শুধুমাত্র “সস্তা রিঅর্গ” এর বিরুদ্ধে রক্ষা করে, অর্থাৎ, একটি ছোট স্টেক সহ একজন আক্রমণকারীর দ্বারা চেষ্টা করা হয়। প্রকৃতপক্ষে, প্রোপোজার-বুস্টিং নিজেই বড় স্টেকহোল্ডারদের দ্বারা গেম করা যেতে পারে। [এই পোস্টের](https://ethresear.ch/t/change-fork-choice-rule-to-mitigate-balancing-and-reorging-attacks/11127) লেখকরা বর্ণনা করেছেন কিভাবে ৭% স্টেকের একজন আক্রমণকারী সৎ ভ্যালিডেটরদের তাদের ফর্কে তৈরি করতে, একটি সৎ ব্লককে রিঅর্গ করে বের করে দেওয়ার জন্য কৌশলগতভাবে তাদের ভোট স্থাপন করতে পারে। এই আক্রমণটি আদর্শ লেটেন্সি শর্ত ধরে নিয়ে তৈরি করা হয়েছিল যা খুব অসম্ভাব্য। আক্রমণকারীর জন্য প্রতিকূলতা এখনও খুব দীর্ঘ, এবং বৃহত্তর স্টেক মানে আরও বেশি মূলধন ঝুঁকিতে এবং একটি শক্তিশালী অর্থনৈতিক অনীহা। + +[এলএমডি নিয়মকে বিশেষভাবে লক্ষ্য করে একটি ব্যালান্সিং আক্রমণ](https://ethresear.ch/t/balancing-attack-lmd-edition/11853) প্রস্তাব করা হয়েছিল, যা প্রোপোজার বুস্টিং সত্ত্বেও কার্যকর বলে পরামর্শ দেওয়া হয়েছিল। একজন আক্রমণকারী তাদের ব্লক প্রস্তাবনার ইকুইভোকেটিং করে এবং প্রতিটি ব্লককে নেটওয়ার্কের প্রায় অর্ধেক অংশে প্রচার করে দুটি প্রতিযোগী চেইন স্থাপন করে, ফর্কগুলির মধ্যে একটি আনুমানিক ভারসাম্য স্থাপন করে। তারপরে, ষড়যন্ত্রকারী ভ্যালিডেটররা তাদের ভোট ইকুইভোকেট করে, এটিকে এমনভাবে সময় দেয় যাতে নেটওয়ার্কের অর্ধেক প্রথমে ফর্ক `A`-এর জন্য তাদের ভোট গ্রহণ করে এবং অন্য অর্ধেক প্রথমে ফর্ক `B`-এর জন্য তাদের ভোট গ্রহণ করে। যেহেতু LMD নিয়মটি দ্বিতীয় অ্যাটেস্টেশনটি বাতিল করে এবং প্রতিটি ভ্যালিডেটরের জন্য শুধুমাত্র প্রথমটি রাখে, নেটওয়ার্কের অর্ধেক `A`-এর জন্য ভোট দেখে এবং `B`-এর জন্য কোনোটিই নয়, অন্য অর্ধেক `B`-এর জন্য ভোট দেখে এবং `A`-এর জন্য কোনোটিই নয়। লেখকরা বর্ণনা করেছেন যে LMD নিয়মটি প্রতিপক্ষকে একটি ব্যালান্সিং আক্রমণ মাউন্ট করার জন্য "উল্লেখযোগ্য শক্তি" দেয়। + +এই LMD আক্রমণের ভেক্টরটি [ফর্ক চয়েস অ্যালগরিদম আপডেট](https://github.com/ethereum/consensus-specs/pull/2845) করে বন্ধ করা হয়েছিল যাতে এটি ফর্ক চয়েস বিবেচনা থেকে সম্পূর্ণরূপে ইকুইভোকেটিং ভ্যালিডেটরদের বাতিল করে দেয়। ইকুইভোকেটিং ভ্যালিডেটরদের ভবিষ্যতের প্রভাবও ফর্ক চয়েস অ্যালগরিদম দ্বারা ছাড় দেওয়া হয়। এটি উপরে বর্ণিত ব্যালেন্সিং আক্রমণকে প্রতিরোধ করে এবং একই সাথে অ্যাভাল্যাঞ্চ আক্রমণের বিরুদ্ধে স্থিতিস্থাপকতা বজায় রাখে। + +আরেক ধরনের আক্রমণ, যাকে [**অ্যাভাল্যাঞ্চ আক্রমণ**](https://ethresear.ch/t/avalanche-attack-on-proof-of-stake-ghost/11854/3) বলা হয়, একটি [মার্চ ২০২২ সালের গবেষণাপত্রে](https://arxiv.org/pdf/2203.01315.pdf) বর্ণনা করা হয়েছিল। একটি অ্যাভাল্যাঞ্চ আক্রমণ মাউন্ট করতে, আক্রমণকারীকে বেশ কয়েকটি পরপর ব্লক প্রস্তাবক নিয়ন্ত্রণ করতে হবে। প্রতিটি ব্লক প্রস্তাবনা স্লটে, আক্রমণকারী তাদের ব্লকটি গোপন রাখে, সৎ চেইন গোপন রাখা ব্লকগুলির সাথে একটি সমান সাবট্রি ওজনে পৌঁছানো পর্যন্ত সেগুলি সংগ্রহ করে। তারপরে, গোপন রাখা ব্লকগুলি প্রকাশ করা হয় যাতে তারা সর্বাধিক ইকুইভোকেট করে। লেখকরা পরামর্শ দেন যে প্রোপোজার বুস্টিং - ব্যালেন্সিং এবং বাউন্সিং আক্রমণের বিরুদ্ধে প্রাথমিক প্রতিরক্ষা - অ্যাভাল্যাঞ্চ আক্রমণের কিছু রূপের বিরুদ্ধে রক্ষা করে না। যাইহোক, লেখকরা শুধুমাত্র ইথেরিয়ামের ফর্ক-চয়েস অ্যালগরিদমের একটি অত্যন্ত আদর্শীকৃত সংস্করণে আক্রমণটি প্রদর্শন করেছেন (তারা LMD ছাড়া GHOST ব্যবহার করেছেন)। + +অ্যাভাল্যাঞ্চ আক্রমণটি LMD-GHOST ফর্ক চয়েস অ্যালগরিদমের LMD অংশ দ্বারা প্রশমিত হয়। LMD মানে "লেটেস্ট-মেসেজ-ড্রিভেন" এবং এটি প্রতিটি ভ্যালিডেটর দ্বারা রাখা একটি টেবিলকে বোঝায় যা অন্যান্য ভ্যালিডেটরদের কাছ থেকে প্রাপ্ত সর্বশেষ বার্তা ধারণ করে। সেই ক্ষেত্রটি শুধুমাত্র তখনই আপডেট করা হয় যদি নতুন বার্তাটি একটি নির্দিষ্ট ভ্যালিডেটরের জন্য টেবিলের মধ্যে থাকা স্লটের চেয়ে পরের স্লটের হয়। বাস্তবে, এর মানে হল যে প্রতিটি স্লটে, প্রাপ্ত প্রথম বার্তাটি গৃহীত হয় এবং যেকোনো অতিরিক্ত বার্তা উপেক্ষা করার জন্য ইকুইভোকেশন হয়। অন্যভাবে বলতে গেলে, কনসেন্সাস ক্লায়েন্টরা ইকুইভোকেশন গণনা করে না - তারা প্রতিটি ভ্যালিডেটরের কাছ থেকে প্রথম-আগত বার্তা ব্যবহার করে এবং ইকুইভোকেশনগুলি কেবল বাতিল করা হয়, যা অ্যাভাল্যাঞ্চ আক্রমণ প্রতিরোধ করে। + +ফর্ক চয়েস নিয়মে আরও বেশ কিছু সম্ভাব্য ভবিষ্যতের আপগ্রেড রয়েছে যা প্রোপোজার-বুস্ট দ্বারা প্রদত্ত নিরাপত্তায় যোগ করতে পারে। একটি হল [ভিউ-মার্জ](https://ethresear.ch/t/view-merge-as-a-replacement-for-proposer-boost/13739), যেখানে অ্যাটেস্টররা একটি স্লটের শুরু হওয়ার `n` সেকেন্ড আগে ফর্ক চয়েসের তাদের ভিউ হিমায়িত করে এবং তারপর প্রস্তাবক নেটওয়ার্ক জুড়ে চেইনের ভিউ সিঙ্ক্রোনাইজ করতে সাহায্য করে। আরেকটি সম্ভাব্য আপগ্রেড হল [একক-স্লট ফাইনালিটি](https://notes.ethereum.org/@vbuterin/single_slot_finality), যা মাত্র একটি স্লটের পরে চেইনটি ফাইনাল করে বার্তা টাইমিংয়ের উপর ভিত্তি করে আক্রমণের বিরুদ্ধে রক্ষা করে। + +#### ফাইনালিটি ডিলে {#finality-delay} + +[একই গবেষণাপত্র](https://econcs.pku.edu.cn/wine2020/wine2020/Workshop/GTiB20_paper_8.pdf) যা প্রথম স্বল্প-মূল্যের একক ব্লক রিঅর্গ আক্রমণের বর্ণনা দিয়েছে, একটি ফাইনালিটি ডিলে (ওরফে “লাইভনেস ফেইলিওর”) আক্রমণও বর্ণনা করেছে যা আক্রমণকারীর একটি যুগ-সীমানা ব্লকের জন্য ব্লক প্রস্তাবক হওয়ার উপর নির্ভর করে। এটি অত্যন্ত গুরুত্বপূর্ণ কারণ এই যুগ সীমানা ব্লকগুলি ক্যাসপার এফএফজি চেইনের অংশগুলিকে চূড়ান্ত করার জন্য ব্যবহৃত চেকপয়েন্ট হয়ে ওঠে। আক্রমণকারী কেবল তাদের ব্লকটি ততক্ষণ পর্যন্ত আটকে রাখে যতক্ষণ না যথেষ্ট সৎ ভ্যালিডেটর তাদের FFG ভোটগুলি বর্তমান ফাইনালিটি লক্ষ্য হিসাবে পূর্ববর্তী যুগ-সীমানা ব্লকের পক্ষে ব্যবহার করে। তারপরে তারা তাদের আটকে রাখা ব্লক প্রকাশ করে। তারা তাদের ব্লককে প্রমাণ করে এবং বাকি সৎ ভ্যালিডেটররাও ভিন্ন ভিন্ন লক্ষ্য চেকপয়েন্ট সহ ফর্ক তৈরি করে। যদি তারা এটিকে ঠিক সময়ে সময় দেয়, তবে তারা ফাইনালিটি প্রতিরোধ করবে কারণ কোনো ফর্কের পক্ষে ২/৩ সুপারমেজরটি অ্যাটেস্ট করা হবে না। স্টেক যত ছোট হবে, সময় তত বেশি সুনির্দিষ্ট হতে হবে কারণ আক্রমণকারী সরাসরি কম অ্যাটেস্টেশন নিয়ন্ত্রণ করে, এবং আক্রমণকারীর একটি প্রদত্ত যুগ-সীমানা ব্লক প্রস্তাবকারী ভ্যালিডেটর নিয়ন্ত্রণ করার সম্ভাবনা তত কম। + +#### লং-রেঞ্জ আক্রমণ {#long-range-attacks} + +প্রুফ-অফ-স্টেক ব্লকচেইনগুলির জন্য নির্দিষ্ট একটি ধরনের আক্রমণও রয়েছে যা জেনেসিস ব্লকে অংশগ্রহণকারী একটি ভ্যালিডেটরকে জড়িত করে যা সৎ একের পাশাপাশি ব্লকচেইনের একটি পৃথক ফর্ক বজায় রাখে, অবশেষে সৎ ভ্যালিডেটর সেটকে অনেক পরে কোনো সুবিধাজনক সময়ে এটিতে স্যুইচ করতে রাজি করায়। এই ধরনের আক্রমণ ইথেরিয়ামে সম্ভব নয় কারণ ফাইনালিটি গ্যাজেট নিশ্চিত করে যে সমস্ত ভ্যালিডেটর নিয়মিত বিরতিতে (“চেকপয়েন্ট”) সৎ চেইনের অবস্থায় একমত। এই সহজ প্রক্রিয়াটি দীর্ঘ পরিসরের আক্রমণকারীদের নিরপেক্ষ করে কারণ ইথেরিয়াম ক্লায়েন্টরা কেবল ফাইনাল করা ব্লকগুলিকে রিঅর্গ করবে না। নেটওয়ার্কে যোগদানকারী নতুন নোডগুলি একটি বিশ্বস্ত সাম্প্রতিক স্টেট হ্যাশ (“[দুর্বল বিষয়ভিত্তিকতা](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) চেকপয়েন্ট”) খুঁজে বের করে এবং এটিকে একটি ছদ্ম-জেনেসিস ব্লক হিসাবে ব্যবহার করে যার উপরে তৈরি করা হয়। এটি একটি নতুন নোডের জন্য নেটওয়ার্কে প্রবেশের জন্য একটি ‘ট্রাস্ট গেটওয়ে’ তৈরি করে, তার আগে এটি নিজের জন্য তথ্য যাচাই করা শুরু করতে পারে। + +#### পরিষেবা অস্বীকার {#denial-of-service} + +ইথেরিয়ামের PoS প্রক্রিয়া প্রতিটি স্লটে মোট ভ্যালিডেটর সেট থেকে একটি একক ভ্যালিডেটরকে ব্লক প্রস্তাবক হিসাবে বেছে নেয়। এটি একটি সর্বজনীনভাবে পরিচিত ফাংশন ব্যবহার করে গণনা করা যেতে পারে এবং একজন প্রতিপক্ষের পক্ষে তাদের ব্লক প্রস্তাবনার সামান্য আগে পরবর্তী ব্লক প্রস্তাবককে সনাক্ত করা সম্ভব। তারপরে, আক্রমণকারী ব্লক প্রস্তাবককে স্প্যাম করতে পারে যাতে তারা তাদের সহকর্মীদের সাথে তথ্য আদান-প্রদান করতে না পারে। নেটওয়ার্কের বাকি অংশের কাছে, এটি মনে হবে যে ব্লক প্রস্তাবক অফলাইন ছিল এবং স্লটটি কেবল খালি যাবে। এটি নির্দিষ্ট ভ্যালিডেটরদের বিরুদ্ধে সেন্সরশিপের একটি রূপ হতে পারে, যা তাদের ব্লকচেইনে তথ্য যোগ করা থেকে বিরত রাখে। একক গোপন নেতা নির্বাচন (SSLE) বা অ-একক গোপন নেতা নির্বাচন বাস্তবায়ন করলে DoS ঝুঁকি কমবে কারণ শুধুমাত্র ব্লক প্রস্তাবকই জানেন যে তারা নির্বাচিত হয়েছেন এবং নির্বাচনটি আগে থেকে জানা যায় না। এটি এখনও বাস্তবায়িত হয়নি, তবে এটি [গবেষণা ও উন্নয়নের](https://ethresear.ch/t/secret-non-single-leader-election/11789) একটি সক্রিয় ক্ষেত্র। + +এই সবই এই সত্যের দিকে ইঙ্গিত করে যে অল্প স্টেক দিয়ে ইথেরিয়ামকে সফলভাবে আক্রমণ করা খুব কঠিন। এখানে বর্ণিত কার্যকর আক্রমণগুলির জন্য একটি আদর্শীকৃত ফর্ক-চয়েস অ্যালগরিদম, অসম্ভাব্য নেটওয়ার্ক শর্ত প্রয়োজন, অথবা আক্রমণ ভেক্টরগুলি ইতিমধ্যেই ক্লায়েন্ট সফ্টওয়্যারের তুলনামূলকভাবে ছোটখাটো প্যাচ দিয়ে বন্ধ করা হয়েছে। এটি, অবশ্যই, বন্য পরিবেশে জিরো-ডে থাকার সম্ভাবনাকে বাতিল করে না, তবে এটি একজন সংখ্যালঘু-স্টেক আক্রমণকারীকে কার্যকর হতে হলে প্রযুক্তিগত যোগ্যতা, কনসেন্সাস লেয়ার জ্ঞান এবং ভাগ্যের অত্যন্ত উচ্চ বার প্রদর্শন করে। একজন আক্রমণকারীর দৃষ্টিকোণ থেকে তাদের সেরা বাজি হতে পারে যতটা সম্ভব ইথার জমা করা এবং মোট স্টেকের একটি বৃহত্তর অনুপাত নিয়ে সশস্ত্র হয়ে ফিরে আসা। + +### মোট স্টেকের >= ৩৩% ব্যবহারকারী আক্রমণকারী {#attackers-with-33-stake} + +এই নিবন্ধে পূর্বে উল্লিখিত সমস্ত আক্রমণ সফল হওয়ার সম্ভাবনা বেশি যখন আক্রমণকারীর কাছে ভোট দেওয়ার জন্য আরও স্টেক করা ইথার থাকে, এবং আরও ভ্যালিডেটর থাকে যারা প্রতিটি স্লটে ব্লক প্রস্তাব করার জন্য নির্বাচিত হতে পারে। একটি বিদ্বেষপরায়ণ ভ্যালিডেটর তাই যতটা সম্ভব স্টেক করা ইথার নিয়ন্ত্রণ করার লক্ষ্য রাখতে পারে। + +স্টেক করা ইথারের ৩৩% একজন আক্রমণকারীর জন্য একটি বেঞ্চমার্ক কারণ এই পরিমাণের চেয়ে বেশি কিছু দিয়ে তাদের অন্য ভ্যালিডেটরদের ক্রিয়া সূক্ষ্মভাবে নিয়ন্ত্রণ না করেই চেইনটিকে চূড়ান্ত করা থেকে বিরত রাখার ক্ষমতা থাকে। তারা কেবল সবাই একসাথে অদৃশ্য হয়ে যেতে পারে। যদি স্টেক করা ইথারের ১/৩ বা তার বেশি বিদ্বেষপরায়ণভাবে অ্যাটেস্ট করে বা অ্যাটেস্ট করতে ব্যর্থ হয়, তাহলে একটি ২/৩ সুপারমেজরটি থাকতে পারে না এবং চেইনটি চূড়ান্ত হতে পারে না। এর বিরুদ্ধে প্রতিরক্ষা হল নিষ্ক্রিয়তা ফাঁস। নিষ্ক্রিয়তা ফাঁস সেই ভ্যালিডেটরদের সনাক্ত করে যারা অ্যাটেস্ট করতে ব্যর্থ হচ্ছে বা সংখ্যাগরিষ্ঠের বিরুদ্ধে অ্যাটেস্ট করছে। এই অ-অ্যাটেস্টিং ভ্যালিডেটরদের মালিকানাধীন স্টেক করা ইথার ধীরে ধীরে শেষ হয়ে যায় যতক্ষণ না অবশেষে তারা সম্মিলিতভাবে মোট স্টেকের ১/৩-এর কম প্রতিনিধিত্ব করে যাতে চেইনটি আবার ফাইনাল হতে পারে। + +নিষ্ক্রিয়তা ফাঁসের উদ্দেশ্য হল চেইনটিকে আবার চূড়ান্ত করা। তবে, আক্রমণকারী তাদের স্টেক করা ইথারের একটি অংশও হারায়। মোট স্টেক করা ইথারের ৩৩% প্রতিনিধিত্বকারী ভ্যালিডেটরদের মধ্যে ক্রমাগত নিষ্ক্রিয়তা খুব ব্যয়বহুল যদিও ভ্যালিডেটরদের স্ল্যাশ করা হয় না। + +ধরা যাক যে ইথেরিয়াম নেটওয়ার্কটি অ্যাসিঙ্ক্রোনাস (অর্থাৎ, মেসেজ পাঠানো এবং গ্রহণের মধ্যে বিলম্ব হয়), তাহলে মোট স্টেকের 34% নিয়ন্ত্রণকারী একজন আক্রমণকারী ডাবল ফাইনালিটি ঘটাতে পারে। এর কারণ হল আক্রমণকারী যখন ব্লক উৎপাদক হিসাবে নির্বাচিত হয় তখন ইকুইভোকেট করতে পারে, তারপর তাদের সমস্ত ভ্যালিডেটরদের সাথে ডাবল ভোট দিতে পারে। এটি এমন একটি পরিস্থিতি তৈরি করে যেখানে ব্লকচেইনের একটি ফর্ক বিদ্যমান, যার প্রত্যেকটির পক্ষে ৩৪% স্টেক করা ইথার ভোট দিচ্ছে। প্রতিটি ফর্কের জন্য বাকি ভ্যালিডেটরদের মাত্র ৫০% ভোট প্রয়োজন যাতে উভয় ফর্ক একটি সুপারমেজরটি দ্বারা সমর্থিত হয়, সেক্ষেত্রে উভয় চেইন চূড়ান্ত হতে পারে (কারণ আক্রমণকারীদের ভ্যালিডেটরদের ৩৪% + বাকি ৬৬%-এর অর্ধেক = প্রতিটি ফর্কে ৬৭%)। প্রতিযোগী ব্লকগুলিকে প্রায় ৫০% সৎ ভ্যালিডেটরদের দ্বারা গ্রহণ করতে হবে তাই এই আক্রমণটি তখনই কার্যকর যখন আক্রমণকারীর নেটওয়ার্ক জুড়ে বার্তা প্রচারের সময়কালের উপর কিছুটা নিয়ন্ত্রণ থাকে যাতে তারা প্রতিটি চেইনে অর্ধেক সৎ ভ্যালিডেটরকে ঠেলে দিতে পারে। আক্রমণকারীকে অবশ্যই এই ডাবল ফাইনালিটি অর্জনের জন্য তাদের সম্পূর্ণ স্টেক (আজকের ভ্যালিডেটর সেটের সাথে ~১০ মিলিয়ন ইথারের ৩৪%) ধ্বংস করতে হবে কারণ তাদের ভ্যালিডেটরদের ৩৪% একই সাথে ডাবল-ভোট দেবে - যা সর্বোচ্চ পারস্পরিক সম্পর্ক জরিমানার সাথে একটি স্ল্যাশযোগ্য অপরাধ। এই আক্রমণের বিরুদ্ধে প্রতিরক্ষা হল মোট স্টেক করা ইথারের ৩৪% ধ্বংস করার বিশাল খরচ। এই আক্রমণ থেকে পুনরুদ্ধার করার জন্য ইথেরিয়াম সম্প্রদায়কে “ব্যান্ডের বাইরে” সমন্বয় করতে হবে এবং একটি বা অন্য ফর্ক অনুসরণ করতে এবং অন্যটিকে উপেক্ষা করতে সম্মত হতে হবে। + +### মোট স্টেকের ~৫০% ব্যবহারকারী আক্রমণকারী {#attackers-with-50-stake} + +স্টেক করা ইথারের ৫০%-এ, ভ্যালিডেটরদের একটি দুষ্টু দল তাত্ত্বিকভাবে চেইনটিকে দুটি সমান আকারের ফর্কে বিভক্ত করতে পারে এবং তারপর কেবল তাদের সম্পূর্ণ ৫০% স্টেক সৎ ভ্যালিডেটর সেটের বিপরীতে ভোট দেওয়ার জন্য ব্যবহার করতে পারে, যার ফলে দুটি ফর্ক বজায় থাকে এবং ফাইনালিটি প্রতিরোধ করা যায়। উভয় ফর্কে নিষ্ক্রিয়তা ফাঁস অবশেষে উভয় চেইনকে চূড়ান্ত করতে পরিচালিত করবে। এই মুহূর্তে, একমাত্র বিকল্প হল একটি সামাজিক পুনরুদ্ধারের উপর নির্ভর করা। + +সৎ ভ্যালিডেটর সংখ্যা, নেটওয়ার্ক লেটেন্সি ইত্যাদিতে একটি নির্দিষ্ট মাত্রার প্রবাহের কারণে একটি প্রতিকূল দল ভ্যালিডেটররা ক্রমাগতভাবে মোট স্টেকের ঠিক ৫০% নিয়ন্ত্রণ করতে পারবে এমন সম্ভাবনা খুবই কম - এই ধরনের আক্রমণ মাউন্ট করার বিশাল খরচ এবং সাফল্যের কম সম্ভাবনার সাথে মিলিত হয়ে একজন যুক্তিসঙ্গত আক্রমণকারীর জন্য একটি শক্তিশালী অনীহা বলে মনে হয়, বিশেষ করে যখন _৫০%-এর বেশি_ অর্জনের জন্য একটি ছোট অতিরিক্ত বিনিয়োগ অনেক বেশি শক্তি আনলক করে। + +মোট স্টেকের >৫০%-এ আক্রমণকারী ফর্ক চয়েস অ্যালগরিদমে আধিপত্য বিস্তার করতে পারে। এই ক্ষেত্রে, আক্রমণকারী সংখ্যাগরিষ্ঠ ভোটের সাথে অ্যাটেস্ট করতে সক্ষম হবে, যা তাদের সৎ ক্লায়েন্টদের বোকা না বানিয়েই ছোট রিঅর্গ করার জন্য যথেষ্ট নিয়ন্ত্রণ দেবে। সৎ ভ্যালিডেটররা অনুসরণ করবে কারণ তাদের ফর্ক চয়েস অ্যালগরিদমও আক্রমণকারীর পছন্দের চেইনটিকে সবচেয়ে ভারী হিসাবে দেখবে, তাই চেইনটি চূড়ান্ত হতে পারে। এটি আক্রমণকারীকে নির্দিষ্ট লেনদেন সেন্সর করতে, স্বল্প-পরিসরের রিঅর্গ করতে এবং তাদের পক্ষে ব্লক পুনর্বিন্যাস করে সর্বাধিক MEV আহরণ করতে সক্ষম করে। এর বিরুদ্ধে প্রতিরক্ষা হল সংখ্যাগরিষ্ঠ স্টেকের বিশাল খরচ (বর্তমানে প্রায় $১৯ বিলিয়ন মার্কিন ডলার) যা একজন আক্রমণকারীর দ্বারা ঝুঁকিতে পড়ে কারণ সামাজিক লেয়ার সম্ভবত হস্তক্ষেপ করবে এবং একটি সৎ সংখ্যালঘু ফর্ক গ্রহণ করবে, যা আক্রমণকারীর স্টেককে নাটকীয়ভাবে অবমূল্যায়ন করবে। + +### মোট স্টেকের >=৬৬% ব্যবহারকারী আক্রমণকারী {#attackers-with-66-stake} + +৬৬% বা তার বেশি মোট স্টেক করা ইথার সহ একজন আক্রমণকারী কোনো সৎ ভ্যালিডেটরকে জোর না করেই তাদের পছন্দের চেইন চূড়ান্ত করতে পারে। আক্রমণকারী কেবল তাদের পছন্দের ফর্কের জন্য ভোট দিতে পারে এবং তারপর এটিকে চূড়ান্ত করতে পারে, কেবল কারণ তারা একটি অসৎ সুপারমেজরটি দিয়ে ভোট দিতে পারে। সুপারমেজরটি স্টেকহোল্ডার হিসাবে, আক্রমণকারী সর্বদা চূড়ান্ত ব্লকগুলির বিষয়বস্তু নিয়ন্ত্রণ করবে, খরচ করার, রিওয়াইন্ড করার এবং আবার খরচ করার, নির্দিষ্ট লেনদেন সেন্সর করার এবং ইচ্ছামত চেইন রিঅর্গ করার ক্ষমতা সহ। ৫১%-এর পরিবর্তে ৬৬% নিয়ন্ত্রণ করার জন্য অতিরিক্ত ইথার ক্রয় করে, আক্রমণকারী কার্যকরভাবে এক্স পোস্ট রিঅর্গ এবং ফাইনালিটি রিভার্সন করার ক্ষমতা কিনছে (অর্থাৎ, ভবিষ্যতের নিয়ন্ত্রণের পাশাপাশি অতীত পরিবর্তন করা)। এখানে একমাত্র আসল প্রতিরক্ষা হল মোট স্টেক করা ইথারের ৬৬%-এর বিশাল খরচ, এবং একটি বিকল্প ফর্ক গ্রহণের সমন্বয়ের জন্য সামাজিক লেয়ারে ফিরে যাওয়ার বিকল্প। আমরা পরবর্তী বিভাগে এটি আরও বিস্তারিতভাবে অন্বেষণ করতে পারি। + +## মানুষ: প্রতিরক্ষার শেষ লাইন {#people-the-last-line-of-defense} + +যদি অসৎ ভ্যালিডেটররা চেইনের তাদের পছন্দের সংস্করণটি চূড়ান্ত করতে সক্ষম হয়, তবে ইথেরিয়াম সম্প্রদায় একটি কঠিন পরিস্থিতিতে পড়ে। ক্যানোনিকাল চেইনে এর ইতিহাসে একটি অসৎ অংশ বেক করা থাকে, যখন সৎ ভ্যালিডেটররা একটি বিকল্প (সৎ) চেইন অ্যাটেস্ট করার জন্য শাস্তি পেতে পারে। মনে রাখবেন যে একটি চূড়ান্ত কিন্তু ভুল চেইন একটি সংখ্যাগরিষ্ঠ ক্লায়েন্টের একটি বাগ থেকেও উদ্ভূত হতে পারে। শেষ পর্যন্ত, চূড়ান্ত ফলব্যাক হল পরিস্থিতি সমাধানের জন্য সামাজিক লেয়ার - লেয়ার 0 - এর উপর নির্ভর করা। + +ইথেরিয়ামের PoS কনসেন্সাসের একটি শক্তি হল যে সম্প্রদায় একটি আক্রমণের মুখে [বিভিন্ন ধরনের প্রতিরক্ষামূলক কৌশল](https://youtu.be/1m12zgJ42dI?t=1712) ব্যবহার করতে পারে। একটি ন্যূনতম প্রতিক্রিয়া হতে পারে কোনো অতিরিক্ত জরিমানা ছাড়াই আক্রমণকারীদের ভ্যালিডেটরদের নেটওয়ার্ক থেকে জোরপূর্বক বের করে দেওয়া। নেটওয়ার্কে পুনরায় প্রবেশ করতে, আক্রমণকারীকে একটি অ্যাক্টিভেশন সারিতে যোগ দিতে হবে যা নিশ্চিত করে যে ভ্যালিডেটর সেট ধীরে ধীরে বৃদ্ধি পায়। উদাহরণস্বরূপ, স্টেক করা ইথারের পরিমাণ দ্বিগুণ করার জন্য যথেষ্ট ভ্যালিডেটর যোগ করতে প্রায় ২০০ দিন সময় লাগে, যা আক্রমণকারীকে আরেকটি ৫১% আক্রমণের চেষ্টা করার আগে সৎ ভ্যালিডেটরদের ২০০ দিন সময় দেয়। তবে, সম্প্রদায় আক্রমণকারীকে আরও কঠোরভাবে শাস্তি দেওয়ার সিদ্ধান্ত নিতে পারে, অতীতের পুরস্কার বাতিল করে বা তাদের স্টেক করা মূলধনের কিছু অংশ (১০০% পর্যন্ত) পুড়িয়ে দিয়ে। + +আক্রমণকারীর উপর যে শাস্তিই আরোপ করা হোক না কেন, সম্প্রদায়কে একসাথে সিদ্ধান্ত নিতে হবে যে অসৎ চেইনটি, ইথেরিয়াম ক্লায়েন্টগুলিতে কোড করা ফর্ক চয়েস অ্যালগরিদম দ্বারা পছন্দসই হওয়া সত্ত্বেও, প্রকৃতপক্ষে অবৈধ এবং সম্প্রদায়কে এর পরিবর্তে সৎ চেইনের উপরে তৈরি করা উচিত। সৎ ভ্যালিডেটররা সম্মিলিতভাবে ইথেরিয়াম ব্লকচেইনের একটি সম্প্রদায়-স্বীকৃত ফর্কের উপর ভিত্তি করে তৈরি করতে সম্মত হতে পারে যা, উদাহরণস্বরূপ, আক্রমণ শুরু হওয়ার আগে ক্যানোনিকাল চেইন থেকে ফর্ক হয়ে গেছে বা আক্রমণকারীদের ভ্যালিডেটরদের জোরপূর্বক অপসারণ করা হয়েছে। সৎ ভ্যালিডেটররা এই চেইনে তৈরি করতে উৎসাহিত হবে কারণ তারা আক্রমণকারীর চেইন অ্যাটেস্ট করতে (সঠিকভাবে) ব্যর্থ হওয়ার জন্য তাদের উপর প্রয়োগ করা জরিমানা এড়াতে পারবে। এক্সচেঞ্জ, অন-র‍্যাম্প এবং ইথেরিয়ামের উপর নির্মিত অ্যাপ্লিকেশনগুলি সম্ভবত সৎ চেইনে থাকতে পছন্দ করবে এবং সৎ ভ্যালিডেটরদের সৎ ব্লকচেইনে অনুসরণ করবে। + +যাইহোক, এটি একটি উল্লেখযোগ্য গভর্নেন্স চ্যালেঞ্জ হবে। কিছু ব্যবহারকারী এবং ভ্যালিডেটর নিঃসন্দেহে সৎ চেইনে ফিরে যাওয়ার ফলে ক্ষতিগ্রস্ত হবে, আক্রমণের পরে ভ্যালিডেট করা ব্লকগুলিতে লেনদেনগুলি সম্ভাব্যভাবে রোল ব্যাক করা যেতে পারে, অ্যাপ্লিকেশন লেয়ারকে ব্যাহত করতে পারে, এবং এটি বেশ সহজভাবে কিছু ব্যবহারকারীর নীতিকে দুর্বল করে যারা বিশ্বাস করে “কোডই আইন”। এক্সচেঞ্জ এবং অ্যাপ্লিকেশনগুলি সম্ভবত অফচেইন অ্যাকশনগুলিকে অনচেইন লেনদেনগুলির সাথে লিঙ্ক করেছে যা এখন রোল ব্যাক করা হতে পারে, যা প্রত্যাহার এবং সংশোধনের একটি ক্যাসকেড শুরু করবে যা ন্যায্যভাবে আনপিক করা কঠিন হবে, বিশেষ করে যদি অবৈধ লাভগুলি মিশ্রিত করা হয়, DeFi বা অন্যান্য ডেরিভেটিভগুলিতে জমা করা হয় যা সৎ ব্যবহারকারীদের জন্য মাধ্যমিক প্রভাব ফেলে। নিঃসন্দেহে কিছু ব্যবহারকারী, এমনকি প্রাতিষ্ঠানিকরাও, ইতিমধ্যেই অসৎ চেইন থেকে চতুরতার মাধ্যমে বা সৌভাগ্যক্রমে উপকৃত হয়েছে, এবং তাদের লাভ রক্ষার জন্য একটি ফর্কের বিরোধিতা করতে পারে। >৫১% আক্রমণের প্রতি সম্প্রদায়ের প্রতিক্রিয়া মহড়া দেওয়ার জন্য আহ্বান জানানো হয়েছে যাতে একটি সংবেদনশীল সমন্বিত প্রশমন দ্রুত কার্যকর করা যায়। Ethresearch.ch-এ Vitalik-এর কিছু দরকারী আলোচনা রয়েছে [এখানে](https://ethresear.ch/t/timeliness-detectors-and-51-attack-recovery-in-blockchains/6925) এবং [এখানে](https://ethresear.ch/t/responding-to-51-attacks-in-casper-ffg/6363) এবং টুইটারে [এখানে](https://twitter.com/skylar_eth/status/1551798684727508992?s=20&t=oHZ1xv8QZdOgAXhxZKtHEw)। একটি সমন্বিত সামাজিক প্রতিক্রিয়ার লক্ষ্য হওয়া উচিত আক্রমণকারীকে শাস্তি দেওয়ার এবং অন্যান্য ব্যবহারকারীদের জন্য প্রভাব কমানোর বিষয়ে খুব লক্ষ্যবস্তু এবং নির্দিষ্ট হওয়া। + +গভর্নেন্স ইতিমধ্যেই একটি জটিল বিষয়। একটি অসৎ চূড়ান্তকরণ চেইনের প্রতি একটি লেয়ার-0 জরুরি প্রতিক্রিয়া পরিচালনা করা নিঃসন্দেহে ইথেরিয়াম সম্প্রদায়ের জন্য চ্যালেঞ্জিং হবে, তবে এটি ইথেরিয়ামের ইতিহাসে [ঘটেছে](/ethereum-forks/#dao-fork-summary) - [দুইবার](/ethereum-forks/#tangerine-whistle))। + +তবুও, মিটস্পেসে বসে থাকা চূড়ান্ত ফলব্যাকে মোটামুটি সন্তোষজনক কিছু রয়েছে। অবশেষে, আমাদের উপরে এই অসাধারণ প্রযুক্তির স্ট্যাক থাকা সত্ত্বেও, যদি সবচেয়ে খারাপ ঘটনাটি ঘটে তবে আসল মানুষদের এটি থেকে বেরিয়ে আসার জন্য সমন্বয় করতে হবে। + +## সারসংক্ষেপ {#summary} + +এই পৃষ্ঠাটি কিছু উপায় অন্বেষণ করেছে যেভাবে আক্রমণকারীরা ইথেরিয়ামের প্রুফ-অফ-স্টেক কনসেন্সাস প্রোটোকলকে কাজে লাগানোর চেষ্টা করতে পারে। মোট স্টেক করা ইথারের ক্রমবর্ধমান অনুপাত সহ আক্রমণকারীদের জন্য রিঅর্গ এবং ফাইনালিটি ডিলে অন্বেষণ করা হয়েছিল। সামগ্রিকভাবে, একজন ধনী আক্রমণকারীর সাফল্যের সম্ভাবনা বেশি কারণ তাদের স্টেক ভোটের ক্ষমতায় রূপান্তরিত হয় যা তারা ভবিষ্যতের ব্লকগুলির বিষয়বস্তুকে প্রভাবিত করতে ব্যবহার করতে পারে। স্টেক করা ইথারের নির্দিষ্ট থ্রেশহোল্ড পরিমাণে, আক্রমণকারীর ক্ষমতা স্তর বৃদ্ধি পায়: + +৩৩%: ফাইনালিটি ডিলে + +৩৪%: ফাইনালিটি ডিলে, ডাবল ফাইনালিটি + +৫১%: ফাইনালিটি ডিলে, ডাবল ফাইনালিটি, সেন্সরশিপ, ব্লকচেইন ভবিষ্যতের উপর নিয়ন্ত্রণ + +৬৬%: ফাইনালিটি ডিলে, ডাবল ফাইনালিটি, সেন্সরশিপ, ব্লকচেইন ভবিষ্যত এবং অতীতের উপর নিয়ন্ত্রণ + +এছাড়াও আরও কিছু অত্যাধুনিক আক্রমণ রয়েছে যার জন্য অল্প পরিমাণে স্টেক করা ইথারের প্রয়োজন হয় কিন্তু একজন খুব অত্যাধুনিক আক্রমণকারীর উপর নির্ভর করে যা সৎ ভ্যালিডেটর সেটকে তাদের পক্ষে প্রভাবিত করার জন্য বার্তা টাইমিংয়ের উপর সূক্ষ্ম নিয়ন্ত্রণ রাখে। + +সামগ্রিকভাবে, এই সম্ভাব্য আক্রমণ ভেক্টর সত্ত্বেও একটি সফল আক্রমণের ঝুঁকি কম, অবশ্যই প্রুফ-অফ-ওয়ার্ক সমতুল্যের চেয়ে কম। এর কারণ হল স্টেক করা ইথারের বিশাল খরচ যা একজন আক্রমণকারীর দ্বারা ঝুঁকিতে পড়ে যা তাদের ভোটের ক্ষমতা দিয়ে সৎ ভ্যালিডেটরদের অভিভূত করার লক্ষ্য রাখে। অন্তর্নির্মিত “গাজর এবং লাঠি” প্রণোদনা স্তরটি বেশিরভাগ অসদাচরণের বিরুদ্ধে রক্ষা করে, বিশেষ করে কম-স্টেক আক্রমণকারীদের জন্য। আরও সূক্ষ্ম বাউন্সিং এবং ব্যালান্সিং আক্রমণগুলিও সফল হওয়ার সম্ভাবনা কম কারণ বাস্তব নেটওয়ার্ক শর্তগুলি ভ্যালিডেটরদের নির্দিষ্ট উপসেটগুলিতে বার্তা সরবরাহের সূক্ষ্ম নিয়ন্ত্রণ অর্জন করা খুব কঠিন করে তোলে এবং ক্লায়েন্ট দলগুলি দ্রুত পরিচিত বাউন্সিং, ব্যালান্সিং এবং অ্যাভাল্যাঞ্চ আক্রমণ ভেক্টরগুলি সাধারণ প্যাচ দিয়ে বন্ধ করে দিয়েছে। + +৩৪%, ৫১% বা ৬৬% আক্রমণের জন্য সম্ভবত সমাধানের জন্য ব্যান্ডের বাইরের সামাজিক সমন্বয়ের প্রয়োজন হবে। যদিও এটি সম্প্রদায়ের জন্য বেদনাদায়ক হতে পারে, তবে ব্যান্ডের বাইরে প্রতিক্রিয়া জানানোর একটি সম্প্রদায়ের ক্ষমতা একজন আক্রমণকারীর জন্য একটি শক্তিশালী অনীহা। ইথেরিয়াম সামাজিক লেয়ার হল চূড়ান্ত ব্যাকস্টপ - একটি প্রযুক্তিগতভাবে সফল আক্রমণ এখনও সম্প্রদায় একটি সৎ ফর্ক গ্রহণ করতে সম্মত হয়ে নিষ্ক্রিয় করা যেতে পারে। এটি আক্রমণকারী এবং ইথেরিয়াম সম্প্রদায়ের মধ্যে একটি প্রতিযোগিতা হবে - একটি 66% আক্রমণের জন্য ব্যয় করা বিলিয়ন ডলার সম্ভবত একটি সফল সামাজিক সমন্বয় আক্রমণের মাধ্যমে নিশ্চিহ্ন হয়ে যাবে যদি এটি যথেষ্ট দ্রুত সম্পন্ন করা হয়, যা আক্রমণকারীকে ইথেরিয়াম সম্প্রদায় দ্বারা উপেক্ষা করা একটি পরিচিত অসৎ চেইনে ইলিকুইড স্টেকড ইথারের ভারী ব্যাগসহ রেখে দেবে। এটি আক্রমণকারীর জন্য লাভজনক হওয়ার সম্ভাবনা যথেষ্ট কম যা একটি কার্যকর প্রতিরোধক হিসাবে কাজ করে। এই কারণেই শক্তভাবে সারিবদ্ধ মান সহ একটি সুসংহত সামাজিক স্তর বজায় রাখার জন্য বিনিয়োগ এত গুরুত্বপূর্ণ। + +## আরও পড়ুন {#further-reading} + +- [এই পৃষ্ঠার আরও বিস্তারিত সংস্করণ](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) +- [নিষ্পত্তির ফাইনালিটি বিষয়ে ভিটালিক](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) +- [LMD GHOST গবেষণাপত্র](https://arxiv.org/abs/2003.03052) +- [Casper-FFG পেপার](https://arxiv.org/abs/1710.09437) +- [গ্যাসপার গবেষণাপত্র](https://arxiv.org/pdf/2003.03052.pdf) +- [প্রস্তাবকের ওজন বুস্টিং কনসেন্সাস স্পেকস](https://github.com/ethereum/consensus-specs/pull/2730) +- [ethresear.ch-এ বাউন্সিং আক্রমণ](https://ethresear.ch/t/prevention-of-bouncing-attack-on-ffg/6114) +- [SSLE গবেষণা](https://ethresear.ch/t/secret-non-single-leader-election/11789) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/attestations/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/attestations/index.md new file mode 100644 index 00000000000..09ec379b4eb --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/attestations/index.md @@ -0,0 +1,92 @@ +--- +title: "প্রত্যয়নসমূহ" +description: "প্রুফ-অফ-স্টেক ইথেরিয়ামের উপর প্রত্যয়নসমূহের একটি বিবরণ।" +lang: bn +--- + +একজন ভ্যালিডেটরের থেকে প্রতিটি ইপকে একটি প্রত্যয়ন তৈরি, স্বাক্ষর এবং ব্রডকাস্ট করার আশা করা হয়। এই পৃষ্ঠাটি রূপরেখা দেয় যে এই প্রত্যয়নসমূহ দেখতে কেমন এবং কীভাবে সেগুলি কনসেন্সাস ক্লায়েন্টদের মধ্যে প্রক্রিয়া করা হয় এবং যোগাযোগ করা হয়। + +## প্রত্যয়ন কী? {#what-is-an-attestation} + +প্রতিটি [ইপকে](/glossary/#epoch) (6.4 মিনিট) একজন ভ্যালিডেটর নেটওয়ার্কে একটি প্রত্যয়ন প্রস্তাব করেন। প্রত্যয়নটি ইপকের একটি নির্দিষ্ট স্লটের জন্য। প্রত্যয়নের উদ্দেশ্য হল ভ্যালিডেটরের চেইনের দৃষ্টিভঙ্গির পক্ষে ভোট দেওয়া, বিশেষ করে সবচেয়ে সাম্প্রতিক জাস্টিফাইড ব্লক এবং বর্তমান ইপকের প্রথম ব্লক (`সোর্স` এবং `টার্গেট` চেকপয়েন্ট হিসাবে পরিচিত)। এই তথ্যটি সমস্ত অংশগ্রহণকারী ভ্যালিডেটরদের জন্য একত্রিত করা হয়, যা নেটওয়ার্ককে ব্লকচেইনের স্টেট সম্পর্কে কনসেন্সাসে পৌঁছাতে সক্ষম করে। + +প্রত্যয়নটিতে নিম্নলিখিত উপাদানগুলি রয়েছে: + +- `aggregation_bits`: ভ্যালিডেটরদের একটি বিটলিস্ট যেখানে অবস্থানটি তাদের কমিটিতে ভ্যালিডেটর সূচকে ম্যাপ করে; মান (0/1) নির্দেশ করে যে ভ্যালিডেটর `data`-তে স্বাক্ষর করেছেন কিনা (অর্থাৎ, তারা সক্রিয় কিনা এবং ব্লক প্রোপোজারের সাথে একমত কিনা) +- `data`: প্রত্যয়ন সম্পর্কিত বিবরণ, যেমনটি নীচে সংজ্ঞায়িত করা হয়েছে +- `signature`: একটি BLS সিগনেচার যা স্বতন্ত্র ভ্যালিডেটরদের সিগনেচার একত্রিত করে + +একটি প্রত্যয়নকারী ভ্যালিডেটরের জন্য প্রথম কাজ হল `data` তৈরি করা। `data`-তে নিম্নলিখিত তথ্য রয়েছে: + +- `slot`: যে স্লট নম্বরটিকে প্রত্যয়নটি উল্লেখ করে +- `index`: একটি সংখ্যা যা চিহ্নিত করে যে একটি প্রদত্ত স্লটে ভ্যালিডেটর কোন কমিটির অন্তর্গত +- `beacon_block_root`: চেইনের শীর্ষে ভ্যালিডেটর যে ব্লকটি দেখেন তার রুট হ্যাস (ফর্ক-চয়েস অ্যালগরিদম প্রয়োগের ফল) +- `source`: ফাইনালিটি ভোটের অংশ যা নির্দেশ করে যে ভ্যালিডেটররা সবচেয়ে সাম্প্রতিক জাস্টিফাইড ব্লক হিসাবে কী দেখছেন +- `target`: ফাইনালিটি ভোটের অংশ যা নির্দেশ করে যে ভ্যালিডেটররা বর্তমান ইপকের প্রথম ব্লক হিসাবে কী দেখছেন + +`data` তৈরি হয়ে গেলে, ভ্যালিডেটর তাদের অংশগ্রহণের প্রমাণস্বরূপ `aggregation_bits`-এ তাদের নিজস্ব ভ্যালিডেটর সূচকের সাথে সঙ্গতিপূর্ণ বিটটি 0 থেকে 1-এ ফ্লিপ করতে পারেন। + +অবশেষে, ভ্যালিডেটর প্রত্যয়নটিতে স্বাক্ষর করে এবং এটি নেটওয়ার্কে ব্রডকাস্ট করে। + +### একত্রিত প্রত্যয়ন {#aggregated-attestation} + +প্রতিটি ভ্যালিডেটরের জন্য নেটওয়ার্কের চারপাশে এই ডেটা পাস করার সাথে একটি উল্লেখযোগ্য ওভারহেড জড়িত। অতএব, স্বতন্ত্র ভ্যালিডেটরদের থেকে প্রত্যয়নসমূহ আরও ব্যাপকভাবে ব্রডকাস্ট করার আগে সাবনেটের মধ্যে একত্রিত করা হয়। এর মধ্যে সিগনেচারগুলিকে একত্রিত করাও অন্তর্ভুক্ত রয়েছে যাতে একটি প্রত্যয়ন যা ব্রডকাস্ট করা হয় তাতে কনসেন্সাস `data` এবং সেই `data`-এর সাথে একমত সমস্ত ভ্যালিডেটরদের সিগনেচার একত্রিত করে গঠিত একটি একক সিগনেচার থাকে। এটি `aggregation_bits` ব্যবহার করে পরীক্ষা করা যেতে পারে কারণ এটি তাদের কমিটিতে প্রতিটি ভ্যালিডেটরের সূচক প্রদান করে (যার আইডি `data`-তে প্রদান করা হয়) যা স্বতন্ত্র সিগনেচারগুলি জিজ্ঞাসা করতে ব্যবহার করা যেতে পারে। + +প্রতিটি ইপকে প্রতিটি সাবনেটে 16 জন ভ্যালিডেটরকে `aggregators` হিসাবে নির্বাচিত করা হয়। অ্যাগ্রিগেটররা গসিপ নেটওয়ার্কের মাধ্যমে শোনা সমস্ত প্রত্যয়ন সংগ্রহ করে যেগুলির `data` তাদের নিজস্ব ডেটার সমতুল্য। প্রতিটি ম্যাচিং প্রত্যয়নের প্রেরককে `aggregation_bits`-এ রেকর্ড করা হয়। অ্যাগ্রিগেটররা তারপর প্রত্যয়নের সমষ্টিটিকে বৃহত্তর নেটওয়ার্কে ব্রডকাস্ট করে। + +যখন একজন ভ্যালিডেটরকে ব্লক প্রোপোজার হিসাবে নির্বাচিত করা হয়, তখন তারা নতুন ব্লকের সর্বশেষ স্লট পর্যন্ত সাবনেট থেকে সমষ্টিগত প্রত্যয়নসমূহ প্যাকেজ করে। + +### প্রত্যয়ন অন্তর্ভুক্তির জীবনচক্র {#attestation-inclusion-lifecycle} + +1. জেনারেসন +2. বিস্তার +3. একত্রীকরণ +4. বিস্তার +5. অন্তর্ভুক্তি + +প্রত্যয়নের জীবনচক্রটি নীচের পরিকল্পিত চিত্রে রূপরেখা দেওয়া হয়েছে: + +![প্রত্যয়নের জীবনচক্র](./attestation_schematic.png) + +## পুরস্কার {#rewards} + +ভ্যালিডেটররা প্রত্যয়ন জমা দেওয়ার জন্য পুরস্কৃত হন। প্রত্যয়নের পুরস্কার অংশগ্রহণের ফ্ল্যাগ (সোর্স, টার্গেট এবং হেড), বেস রিওয়ার্ড এবং অংশগ্রহণের হারের উপর নির্ভর করে। + +জমা দেওয়া প্রত্যয়ন এবং এর অন্তর্ভুক্তি বিলম্বের উপর নির্ভর করে অংশগ্রহণের প্রতিটি ফ্ল্যাগ সত্য বা মিথ্যা হতে পারে। + +সেরা পরিস্থিতিটি ঘটে যখন তিনটি ফ্ল্যাগই সত্য হয়, সেক্ষেত্রে একজন ভ্যালিডেটর উপার্জন করবেন (প্রতিটি সঠিক ফ্ল্যাগের জন্য): + +`রিওয়ার্ড += বেস রিওয়ার্ড * ফ্ল্যাগ ওয়েট * ফ্ল্যাগ অ্যাটেস্টিং রেট / 64` + +ফ্ল্যাগ অ্যাটেস্টিং রেট পরিমাপ করা হয় প্রদত্ত ফ্ল্যাগের জন্য সমস্ত অ্যাটেস্টিং ভ্যালিডেটরের কার্যকর ব্যালেন্সের যোগফলকে মোট সক্রিয় কার্যকর ব্যালেন্সের সাথে তুলনা করে। + +### বেস রিওয়ার্ড {#base-reward} + +বেস রিওয়ার্ড গণনা করা হয় অ্যাটেস্টিং ভ্যালিডেটরের সংখ্যা এবং তাদের কার্যকর স্টেক করা ইথার ব্যালেন্স অনুযায়ী: + +`বেস রিওয়ার্ড = ভ্যালিডেটর কার্যকর ব্যালেন্স x 2^6 / SQRT(সমস্ত সক্রিয় ভ্যালিডেটরের কার্যকর ব্যালেন্স)` + +#### অন্তর্ভুক্তি বিলম্ব {#inclusion-delay} + +যে সময়ে ভ্যালিডেটররা চেইনের শীর্ষে (`ব্লক n`) ভোট দিয়েছিলেন, তখন `ব্লক n+1` এখনও প্রস্তাব করা হয়নি। অতএব প্রত্যয়নসমূহ স্বাভাবিকভাবেই **এক ব্লক পরে** অন্তর্ভুক্ত হয় তাই `ব্লক n` চেইনের হেড হওয়ার পক্ষে ভোট দেওয়া সমস্ত প্রত্যয়ন `ব্লক n+1`-এ অন্তর্ভুক্ত হয় এবং, **অন্তর্ভুক্তি বিলম্ব** 1 হয়। যদি অন্তর্ভুক্তি বিলম্ব দ্বিগুণ হয়ে দুটি স্লটে পৌঁছায়, তবে প্রত্যয়নের পুরস্কার অর্ধেক হয়ে যায়, কারণ প্রত্যয়নের পুরস্কার গণনা করতে বেস রিওয়ার্ডকে অন্তর্ভুক্তি বিলম্বের অন্যোন্যক দ্বারা গুণ করা হয়। + +### প্রত্যয়নের পরিস্থিতি {#attestation-scenarios} + +#### অনুপস্থিত ভোটিং ভ্যালিডেটর {#missing-voting-validator} + +ভ্যালিডেটরদের তাদের প্রত্যয়ন জমা দেওয়ার জন্য সর্বোচ্চ 1 ইপক সময় থাকে। যদি ইপক 0-তে প্রত্যয়নটি মিস হয়ে যায়, তবে তারা এটি ইপক 1-এ অন্তর্ভুক্তি বিলম্বের সাথে জমা দিতে পারে। + +#### অনুপস্থিত অ্যাগ্রিগেটর {#missing-aggregator} + +মোট প্রতি ইপকে 16 জন অ্যাগ্রিগেটর থাকে। এছাড়াও, র‍্যান্ডম ভ্যালিডেটররা **256 ইপকের জন্য দুটি সাবনেটে** সাবস্ক্রাইব করে এবং অ্যাগ্রিগেটর অনুপস্থিত থাকলে ব্যাকআপ হিসাবে কাজ করে। + +#### অনুপস্থিত ব্লক প্রোপোজার {#missing-block-proposer} + +মনে রাখবেন যে কিছু ক্ষেত্রে একজন ভাগ্যবান অ্যাগ্রিগেটরও ব্লক প্রোপোজার হতে পারে। যদি ব্লক প্রোপোজার অনুপস্থিত থাকার কারণে প্রত্যয়নটি অন্তর্ভুক্ত না করা হয়, তবে পরবর্তী ব্লক প্রোপোজার একত্রিত প্রত্যয়নটি তুলে নিয়ে পরবর্তী ব্লকে অন্তর্ভুক্ত করবে। তবে, **অন্তর্ভুক্তি বিলম্ব** এক বেড়ে যাবে। + +## আরও পড়ুন {#further-reading} + +- [ভিটালিকের অ্যানোটেটেড কনসেন্সাস স্পেকে প্রত্যয়নসমূহ](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#attestationdata) +- [eth2book.info-তে প্রত্যয়নসমূহ](https://eth2book.info/capella/part3/containers/dependencies/#attestationdata) + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/block-proposal/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/block-proposal/index.md new file mode 100644 index 00000000000..d867beffdec --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/block-proposal/index.md @@ -0,0 +1,69 @@ +--- +title: "ব্লক প্রস্তাব" +description: "প্রুফ-অফ-স্টেক ইথেরিয়ামে কীভাবে ব্লক প্রস্তাব করা হয় তার ব্যাখ্যা।" +lang: bn +--- + +ব্লকগুলো হল ব্লকচেইনের মৌলিক একক। ব্লকগুলো হল তথ্যের বিচ্ছিন্ন একক যা নোডগুলোর মধ্যে আদান-প্রদান করা হয়, সম্মত হয় এবং প্রতিটি নোডের ডেটাবেসে যোগ করা হয়। এই পেজটি ব্যাখ্যা করে কীভাবে সেগুলি তৈরি করা হয়। + +## পূর্বশর্ত {#prerequisites} + +ব্লক প্রস্তাব প্রুফ-অফ-স্টেক প্রোটোকলের একটি অংশ। এই পেজটি বুঝতে সাহায্য করার জন্য, আমরা আপনাকে [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) এবং [ব্লক আর্কিটেকচার](/developers/docs/blocks/) সম্পর্কে পড়ার পরামর্শ দিই। + +## কারা ব্লক তৈরি করে? {#who-produces-blocks} + +ভ্যালিডেটর অ্যাকাউন্টগুলি ব্লক প্রস্তাব করে। ভ্যালিডেটর অ্যাকাউন্টগুলি নোড অপারেটরদের দ্বারা পরিচালিত হয় যারা তাদের এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্ট-এর অংশ হিসাবে ভ্যালিডেটর সফ্টওয়্যার চালায় এবং ডিপোজিট চুক্তিতে কমপক্ষে 32 ETH জমা করেছে। তবে, প্রতিটি ভ্যালিডেটর শুধুমাত্র মাঝে মাঝে একটি ব্লক প্রস্তাব করার জন্য দায়ী থাকে। ইথেরিয়াম স্লট এবং ইপোক-এ সময় পরিমাপ করে। প্রতিটি স্লট বারো সেকেন্ডের, এবং 32টি স্লট (6.4 মিনিট) মিলে একটি ইপোক তৈরি করে। প্রতিটি স্লট ইথেরিয়ামে একটি নতুন ব্লক যোগ করার একটি সুযোগ। + +### র‍্যান্ডম নির্বাচন {#random-selection} + +প্রতিটি স্লটে একটি ব্লক প্রস্তাব করার জন্য একজন একক ভ্যালিডেটর সিউডো-র‍্যান্ডমভাবে নির্বাচিত হয়। একটি ব্লকচেইনে প্রকৃত র‍্যান্ডমনেসের মতো কিছু নেই কারণ যদি প্রতিটি নোড প্রকৃত র‍্যান্ডম সংখ্যা তৈরি করত, তবে তারা কনসেন্সাসে আসতে পারত না। এর পরিবর্তে, লক্ষ্য হল ভ্যালিডেটর নির্বাচন প্রক্রিয়াটিকে অপ্রত্যাশিত করে তোলা। ইথেরিয়ামে র‍্যান্ডমনেস অর্জন করা হয় RANDAO নামক একটি অ্যালগরিদম ব্যবহার করে যা ব্লক প্রস্তাবকের থেকে একটি হ্যাসকে একটি সিডের সাথে মিশ্রিত করে যা প্রতিটি ব্লকে আপডেট করা হয়। এই মানটি মোট ভ্যালিডেটর সেট থেকে একটি নির্দিষ্ট ভ্যালিডেটর নির্বাচন করতে ব্যবহৃত হয়। নির্দিষ্ট ধরণের সিড ম্যানিপুলেশনের বিরুদ্ধে সুরক্ষার একটি উপায় হিসাবে ভ্যালিডেটর নির্বাচন দুই ইপোক আগে থেকে স্থির করা হয়। + +যদিও ভ্যালিডেটররা প্রতিটি স্লটে RANDAO-তে যোগ করে, গ্লোবাল RANDAO মান প্রতি ইপোকে শুধুমাত্র একবার আপডেট করা হয়। পরবর্তী ব্লক প্রস্তাবকের সূচক গণনা করার জন্য, প্রতিটি স্লটে একটি অনন্য মান দিতে RANDAO মান স্লট নম্বরের সাথে মিশ্রিত করা হয়। একজন স্বতন্ত্র ভ্যালিডেটর নির্বাচিত হওয়ার সম্ভাবনা কেবল `1/N` নয় (যেখানে `N` = মোট সক্রিয় ভ্যালিডেটর)। এর পরিবর্তে, এটি প্রতিটি ভ্যালিডেটরের কার্যকর ETH ব্যালেন্স দ্বারা ওজনযুক্ত হয়। সর্বোচ্চ কার্যকর ব্যালেন্স হল 32 ETH (এর মানে হল `ব্যালেন্স < 32 ETH` হলে `ব্যালেন্স == 32 ETH`-এর চেয়ে কম ওজন হয়, কিন্তু `ব্যালেন্স > 32 ETH` হলে `ব্যালেন্স == 32 ETH`-এর চেয়ে বেশি ওজন হয় না)। + +প্রতিটি স্লটে শুধুমাত্র একজন ব্লক প্রস্তাবক নির্বাচিত হয়। স্বাভাবিক পরিস্থিতিতে, একজন একক ব্লক প্রযোজক তাদের নিবেদিত স্লটে একটি একক ব্লক তৈরি করে এবং প্রকাশ করে। একই স্লটের জন্য দুটি ব্লক তৈরি করা একটি স্ল্যাশযোগ্য অপরাধ, যা প্রায়শই "ইকুইভোকেশন" নামে পরিচিত। + +## ব্লকটি কীভাবে তৈরি করা হয়? {#how-is-a-block-created} + +ব্লক প্রস্তাবকের একটি স্বাক্ষরিত বীকন ব্লক সম্প্রচার করার কথা যা তাদের স্থানীয়ভাবে চালিত ফর্ক পছন্দ অ্যালগরিদমের দৃষ্টিভঙ্গি অনুসারে চেইনের সবচেয়ে সাম্প্রতিক হেডের উপরে তৈরি হয়। ফর্ক পছন্দ অ্যালগরিদম পূর্ববর্তী স্লট থেকে অবশিষ্ট থাকা যেকোনো সারিবদ্ধ অ্যাটেস্টেশন প্রয়োগ করে, তারপর তার ইতিহাসে অ্যাটেস্টেশনের সর্বাধিক সঞ্চিত ওজনসহ ব্লকটি খুঁজে বের করে। সেই ব্লকটি হল প্রস্তাবক দ্বারা তৈরি করা নতুন ব্লকের প্যারেন্ট। + +ব্লক প্রস্তাবক তার নিজস্ব স্থানীয় ডেটাবেস এবং চেইনের ভিউ থেকে ডেটা সংগ্রহ করে একটি ব্লক তৈরি করে। ব্লকের বিষয়বস্তু নীচের স্নিপেটে দেখানো হয়েছে: + +```rust +class BeaconBlockBody(Container): + randao_reveal: BLSSignature + eth1_data: Eth1Data + graffiti: Bytes32 + proposer_slashings: List[ProposerSlashing, MAX_PROPOSER_SLASHINGS] + attester_slashings: List[AttesterSlashing, MAX_ATTESTER_SLASHINGS] + attestations: List[Attestation, MAX_ATTESTATIONS] + deposits: List[Deposit, MAX_DEPOSITS] + voluntary_exits: List[SignedVoluntaryExit, MAX_VOLUNTARY_EXITS] + sync_aggregate: SyncAggregate + execution_payload: ExecutionPayload +``` + +`randao_reveal` ফিল্ড একটি যাচাইযোগ্য র‍্যান্ডম মান নেয় যা ব্লক প্রস্তাবক বর্তমান ইপোক নম্বর স্বাক্ষর করে তৈরি করে। `eth1_data` হল ডিপোজিট চুক্তির বিষয়ে ব্লক প্রস্তাবকের দৃষ্টিভঙ্গির জন্য একটি ভোট, যার মধ্যে ডিপোজিট মার্কল ট্রাই-এর রুট এবং মোট ডিপোজিটের সংখ্যা অন্তর্ভুক্ত রয়েছে যা নতুন ডিপোজিট যাচাই করতে সক্ষম করে। `graffiti` একটি ঐচ্ছিক ফিল্ড যা ব্লকে একটি বার্তা যোগ করতে ব্যবহার করা যেতে পারে। `proposer_slashings` এবং `attester_slashings` হল এমন ফিল্ড যেগুলিতে প্রমাণ থাকে যে প্রস্তাবকের চেইন দেখার দৃষ্টিভঙ্গি অনুসারে নির্দিষ্ট ভ্যালিডেটররা স্ল্যাশযোগ্য অপরাধ করেছে। `deposits` হল নতুন ভ্যালিডেটর ডিপোজিটের একটি তালিকা যা সম্পর্কে ব্লক প্রস্তাবক সচেতন, এবং `voluntary_exits` হল এমন ভ্যালিডেটরদের একটি তালিকা যারা প্রস্থান করতে চায়, যাদের সম্পর্কে ব্লক প্রস্তাবক কনসেন্সাস লেয়ার গসিপ নেটওয়ার্কে শুনেছে। `sync_aggregate` হল একটি ভেক্টর যা দেখায় কোন ভ্যালিডেটরদের আগে একটি সিঙ্ক কমিটিতে (ভ্যালিডেটরদের একটি উপসেট যা লাইট ক্লায়েন্ট ডেটা পরিবেশন করে) নিযুক্ত করা হয়েছিল এবং ডেটা স্বাক্ষরে অংশ নিয়েছিল। + +`execution_payload` এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্টদের মধ্যে লেনদেন সম্পর্কিত তথ্য পাস করতে সক্ষম করে। `execution_payload` হল এক্সিকিউশন ডেটার একটি ব্লক যা একটি বীকন ব্লকের ভিতরে নেস্টেড থাকে। `execution_payload`-এর ভিতরের ফিল্ডগুলি ইথেরিয়াম ইয়োলো পেপারে বর্ণিত ব্লক কাঠামোকে প্রতিফলিত করে, তবে এতে কোনো অমার্স নেই এবং `difficulty`-এর পরিবর্তে `prev_randao` বিদ্যমান। এক্সিকিউশন ক্লায়েন্টের লেনদেনের একটি স্থানীয় পুলে অ্যাক্সেস রয়েছে যা সে তার নিজস্ব গসিপ নেটওয়ার্কে শুনেছে। এই লেনদেনগুলি স্থানীয়ভাবে কার্যকর করা হয় একটি আপডেট করা স্টেট ট্রাই তৈরি করতে যা পোস্ট-স্টেট নামে পরিচিত। লেনদেনগুলি `execution_payload`-এ `transactions` নামক একটি তালিকা হিসাবে অন্তর্ভুক্ত করা হয় এবং পোস্ট-স্টেট `state-root` ফিল্ডে সরবরাহ করা হয়। + +এই সমস্ত ডেটা একটি বীকন ব্লকে সংগ্রহ করা হয়, স্বাক্ষরিত হয়, এবং ব্লক প্রস্তাবকের পিয়ারদের কাছে সম্প্রচার করা হয়, যারা এটিকে তাদের পিয়ারদের কাছে প্রচার করে ইত্যাদি। + +[ব্লকের অ্যানাটমি](/developers/docs/blocks) সম্পর্কে আরও পড়ুন। + +## ব্লকের কী হয়? {#what-happens-to-blocks} + +ব্লকটি ব্লক প্রস্তাবকের স্থানীয় ডেটাবেসে যোগ করা হয় এবং কনসেন্সাস লেয়ার গসিপ নেটওয়ার্কের মাধ্যমে পিয়ারদের কাছে সম্প্রচার করা হয়। যখন একজন ভ্যালিডেটর ব্লকটি গ্রহণ করে, তখন সে এর ভিতরের ডেটা যাচাই করে, যার মধ্যে রয়েছে ব্লকটির সঠিক প্যারেন্ট আছে কিনা, সঠিক স্লটের সাথে মিলে যায় কিনা, প্রস্তাবকের সূচকটি প্রত্যাশিত কিনা, RANDAO রিভিল বৈধ কিনা এবং প্রস্তাবক স্ল্যাশড হয়নি কিনা তা পরীক্ষা করা। `execution_payload` আনবান্ডেল করা হয়, এবং ভ্যালিডেটরের এক্সিকিউশন ক্লায়েন্ট প্রস্তাবিত স্টেট পরিবর্তন পরীক্ষা করার জন্য তালিকার লেনদেনগুলি পুনরায় কার্যকর করে। ধরে নেওয়া হয় যে ব্লকটি এই সমস্ত পরীক্ষায় উত্তীর্ণ হয়েছে, প্রতিটি ভ্যালিডেটর ব্লকটিকে তার নিজস্ব ক্যানোনিকাল চেইনে যোগ করে। প্রক্রিয়াটি তারপর পরবর্তী স্লটে আবার শুরু হয়। + +## ব্লক রিওয়ার্ডস {#block-rewards} + +ব্লক প্রস্তাবক তাদের কাজের জন্য পেমেন্ট পায়। সক্রিয় ভ্যালিডেটরের সংখ্যা এবং তাদের কার্যকর ব্যালেন্সের একটি ফাংশন হিসাবে একটি `base_reward` গণনা করা হয়। ব্লক প্রস্তাবক তারপর ব্লকে অন্তর্ভুক্ত প্রতিটি বৈধ অ্যাটেস্টেশনের জন্য `base_reward`-এর একটি ভগ্নাংশ পায়; যত বেশি ভ্যালিডেটর ব্লকটিকে অ্যাটেস্ট করে, ব্লক প্রস্তাবকের রিওয়ার্ড তত বেশি হয়। যে ভ্যালিডেটরদের স্ল্যাশ করা উচিত তাদের রিপোর্ট করার জন্যও একটি রিওয়ার্ড রয়েছে, যা প্রতিটি স্ল্যাশড ভ্যালিডেটরের জন্য `1/512 * কার্যকর ব্যালেন্স`-এর সমান। + +[রিওয়ার্ড এবং পেনাল্টি সম্পর্কে আরও](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) + +## আরও পড়ুন {#further-reading} + +- [ব্লকের পরিচিতি](/developers/docs/blocks/) +- [প্রুফ-অফ-স্টেক-এর পরিচিতি](/developers/docs/consensus-mechanisms/pos/) +- [ইথেরিয়াম কনসেন্সাস স্পেকস](https://github.com/ethereum/consensus-specs) +- [গ্যাসপারের পরিচিতি](/developers/docs/consensus-mechanisms/pos/gasper/) +- [ইথেরিয়াম আপগ্রেড করা](https://eth2book.info/) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/faqs/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/faqs/index.md new file mode 100644 index 00000000000..632988b27e0 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/faqs/index.md @@ -0,0 +1,172 @@ +--- +title: "বহুল জিজ্ঞাসিত প্রশ্নাবলী" +description: "প্রুফ-অফ-স্টেক ইথেরিয়াম-এর উপর বহুল জিজ্ঞাসিত প্রশ্নাবলী।" +lang: bn +--- + +## প্রুফ-অফ-স্টেক কী {#what-is-proof-of-stake} + +প্রুফ-অফ-স্টেক হল এক শ্রেণীর অ্যালগরিদম যা ব্লকচেইনকে সুরক্ষা প্রদান করতে পারে এটি নিশ্চিত করার মাধ্যমে যে, যে সমস্ত আক্রমণকারীরা অসৎভাবে কাজ করে তাদের মূল্যবান সম্পদগুলি হারিয়ে যায়। প্রুফ-অফ-স্টেক সিস্টেমের জন্য এক সেট ভ্যালিডেটরের প্রয়োজন হয় কিছু সম্পদ উপলব্ধ করার জন্য যা ধ্বংস করা যেতে পারে যদি ভ্যালিডেটর কোনো প্রমাণিত অসৎ আচরণে জড়িত থাকে। ইথেরিয়াম ব্লকচেইনকে সুরক্ষিত করতে একটি প্রুফ-অফ-স্টেক মেকানিজম ব্যবহার করে। + +## প্রুফ-অফ-ওয়ার্ক-এর সাথে প্রুফ-অফ-স্টেক-এর তুলনা কেমন? {#comparison-to-proof-of-work} + +প্রুফ-অফ-ওয়ার্ক এবং প্রুফ-অফ-স্টেক উভয়ই এমন পদ্ধতি যা ক্ষতিকারক অভিনেতাদের নেটওয়ার্কে স্প্যামিং বা প্রতারণা করা থেকে অর্থনৈতিকভাবে নিরুৎসাহিত করে। উভয় ক্ষেত্রেই, যে নোডগুলি সক্রিয়ভাবে কনসেন্সাস-এ অংশগ্রহণ করে তারা কিছু সম্পদ "নেটওয়ার্কে" রাখে যা তারা খারাপ আচরণ করলে হারাবে। + +প্রুফ-অফ-ওয়ার্ক-এ, এই সম্পদটি হল শক্তি। নোড, যা মাইনার হিসাবে পরিচিত, একটি অ্যালগরিদম চালায় যার লক্ষ্য অন্য যেকোনো নোডের চেয়ে দ্রুত একটি মান গণনা করা। দ্রুততম নোডের চেইনে একটি ব্লক প্রস্তাব করার অধিকার রয়েছে। চেইনের ইতিহাস পরিবর্তন করতে বা ব্লক প্রস্তাবে আধিপত্য বিস্তার করতে, একজন মাইনারকে এত বেশি কম্পিউটিং শক্তি থাকতে হবে যে তারা সবসময় রেসে জয়ী হয়। এটি কার্যকর করার জন্য অত্যধিক ব্যয়বহুল এবং কঠিন, যা চেইনকে আক্রমণ থেকে রক্ষা করে। প্রুফ-অফ-ওয়ার্ক ব্যবহার করে "মাইন" করার জন্য প্রয়োজনীয় শক্তি একটি বাস্তব-বিশ্বের সম্পদ যার জন্য মাইনাররা অর্থ প্রদান করে। + +প্রুফ-অফ-স্টেক-এর জন্য নোড, যা ভ্যালিডেটর হিসাবে পরিচিত, তাদের একটি স্মার্ট কন্ট্র্যাক্ট-এ স্পষ্টভাবে একটি ক্রিপ্টো সম্পদ জমা দিতে হয়। যদি কোনো ভ্যালিডেটর খারাপ আচরণ করে, তাহলে এই ক্রিপ্টোটি ধ্বংস হয়ে যেতে পারে কারণ তারা শক্তির ব্যয়ের মাধ্যমে পরোক্ষভাবে না করে সরাসরি চেইনে তাদের সম্পদ "স্টেকিং" করছে। + +প্রুফ-অফ-ওয়ার্ক অনেক বেশি শক্তি-ক্ষুধার্ত কারণ মাইনিং প্রক্রিয়ায় বিদ্যুৎ পোড়ানো হয়। অন্যদিকে, প্রুফ-অফ-স্টেক-এর জন্য খুব অল্প পরিমাণে শক্তির প্রয়োজন হয় - ইথেরিয়াম ভ্যালিডেটররা এমনকি Raspberry Pi-এর মতো কম-শক্তিসম্পন্ন ডিভাইসেও চলতে পারে। ইথেরিয়াম-এর প্রুফ-অফ-স্টেক পদ্ধতিকে প্রুফ-অফ-ওয়ার্কের চেয়ে বেশি সুরক্ষিত বলে মনে করা হয় কারণ আক্রমণের খরচ বেশি এবং আক্রমণকারীর জন্য পরিণতি আরও গুরুতর। + +প্রুফ-অফ-ওয়ার্ক বনাম প্রুফ-অফ-স্টেক একটি বিতর্কিত বিষয়। [Vitalik Buterin-এর ব্লগ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-are-the-benefits-of-proof-of-stake-as-opposed-to-proof-of-work) এবং Justin Drake ও Lyn Alden-এর মধ্যে বিতর্কটি যুক্তিগুলির একটি ভাল সারসংক্ষেপ দেয়। + + + +## প্রুফ-অফ-স্টেক কি শক্তি-সাশ্রয়ী? {#is-pos-energy-efficient} + +হ্যাঁ। প্রুফ অফ স্টেকের নোডগুলো কিছু পরিমান এনার্জি ব্যবহার করে থাকে। একটি তৃতীয় পক্ষের সমীক্ষা এই সিদ্ধান্তে উপনীত হয়েছে যে সম্পূর্ণ প্রুফ-অফ-স্টেক ইথেরিয়াম নেটওয়ার্ক বছরে প্রায় 0.0026 TWh খরচ করে - যা শুধুমাত্র মার্কিন যুক্তরাষ্ট্রে গেমিংয়ের থেকে প্রায় 13,000 গুণ কম। + +[ইথেরিয়াম-এর শক্তি খরচ সম্পর্কে আরও জানুন](/energy-consumption/)। + +## প্রুফ-অফ-স্টেক কি সুরক্ষিত? {#is-pos-secure} + +ইথেরিয়াম-এর প্রুফ-অফ-স্টেক খুবই সুরক্ষিত। লাইভ হওয়ার আগে আট বছরেরও বেশি সময় ধরে এই পদ্ধতিটি নিয়ে গবেষণা করা হয়েছিল, বিকশিত করা হয়েছিল এবং কঠোরভাবে পরীক্ষা করা হয়েছিল। নিরাপত্তার গ্যারান্টিগুলি প্রুফ-অফ-ওয়ার্ক ব্লকচেইন থেকে ভিন্ন। প্রুফ-অফ-স্টেক-এ, দূষিত ভ্যালিডেটরদের সক্রিয়ভাবে শাস্তি ("স্ল্যাশড") দেওয়া যেতে পারে এবং ভ্যালিডেটর সেট থেকে বের করে দেওয়া যেতে পারে, যার ফলে যথেষ্ট পরিমাণে ETH খরচ হয়। প্রুফ-অফ-ওয়ার্ক-এর অধীনে, একজন আক্রমণকারী যতক্ষণ পর্যন্ত তাদের পর্যাপ্ত হ্যাস শক্তি থাকবে ততক্ষণ তাদের আক্রমণ পুনরাবৃত্তি করতে পারে। প্রুফ-অফ-ওয়ার্কের তুলনায় প্রুফ-অফ-স্টেক ইথেরিয়াম-এ সমতুল্য আক্রমণ চালানো আরও ব্যয়বহুল। চেইনের লাইভনেসকে প্রভাবিত করতে, নেটওয়ার্কে মোট স্টেক করা ইথারের কমপক্ষে 33% প্রয়োজন (খুবই পরিশীলিত আক্রমণের ক্ষেত্রে ছাড়া যেখানে সাফল্যের সম্ভাবনা অত্যন্ত কম)। ভবিষ্যতের ব্লকের বিষয়বস্তু নিয়ন্ত্রণ করতে, মোট স্টেক করা ETH-এর কমপক্ষে 51% প্রয়োজন এবং ইতিহাস পুনরায় লিখতে, মোট স্টেক-এর 66%-এর বেশি প্রয়োজন। ইথেরিয়াম প্রোটোকল 33% বা 51% আক্রমণের পরিস্থিতিতে এই সম্পদগুলিকে ধ্বংস করে দেবে এবং 66% আক্রমণের পরিস্থিতিতে সামাজিক কনসেন্সাস দ্বারা ধ্বংস করবে। + +- [আক্রমণকারীদের থেকে ইথেরিয়াম প্রুফ-অফ-স্টেক রক্ষা করার বিষয়ে আরও জানুন](/developers/docs/consensus-mechanisms/pos/attack-and-defense) +- [প্রুফ-অফ-স্টেক ডিজাইন সম্পর্কে আরও জানুন](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) + +## প্রুফ-অফ-স্টেক কি ইথেরিয়াম-কে সস্তা করে? {#does-pos-make-ethereum-cheaper} + +না। একটি লেনদেন পাঠানোর খরচ (গ্যাস ফি) একটি ডাইনামিক ফি মার্কেট দ্বারা নির্ধারিত হয় যা নেটওয়ার্কের চাহিদা বাড়ার সাথে সাথে বৃদ্ধি পায়। কনসেন্সাস পদ্ধতি এটিকে সরাসরি প্রভাবিত করে না। + +[গ্যাস সম্পর্কে আরও জানুন](/developers/docs/gas)। + +## নোড, ক্লায়েন্ট এবং ভ্যালিডেটর কী? {#what-are-nodes-clients-and-validators} + +নোড হল ইথেরিয়াম নেটওয়ার্কের সাথে সংযুক্ত কম্পিউটার। ক্লায়েন্ট হল সেই সফ্টওয়্যার যা তারা চালায় যা কম্পিউটারকে একটি নোডে পরিণত করে। দুই ধরনের ক্লায়েন্ট আছে: এক্সিকিউশন ক্লায়েন্ট এবং কনসেন্সাস ক্লায়েন্ট। একটি নোড তৈরি করতে উভয়ই প্রয়োজন। একটি ভ্যালিডেটর হল কনসেন্সাস ক্লায়েন্টের একটি ঐচ্ছিক অ্যাড-অন যা নোডকে প্রুফ-অফ-স্টেক কনসেন্সাসে অংশগ্রহণ করতে সক্ষম করে। এর অর্থ হল নির্বাচিত হলে ব্লক তৈরি এবং প্রস্তাব করা এবং নেটওয়ার্কে শোনা ব্লকগুলির প্রত্যয়ন করা। একটি ভ্যালিডেটর চালানোর জন্য, নোড অপারেটরকে ডিপোজিট কন্ট্রাক্টে 32 ETH জমা দিতে হবে। + +- [নোড এবং ক্লায়েন্ট সম্পর্কে আরও জানুন](/developers/docs/nodes-and-clients) +- [স্টেকিং সম্পর্কে আরও জানুন](/staking) + +## প্রুফ-অফ-স্টেক কি একটি নতুন ধারণা? {#is-pos-new} + +না। BitcoinTalk-এর একজন ব্যবহারকারী 2011 সালে Bitcoin-এর একটি আপগ্রেড হিসাবে [প্রুফ-অফ-স্টেক-এর মূল ধারণাটি প্রস্তাব করেছিলেন](https://bitcointalk.org/index.php?topic=27787.0)। ইথেরিয়াম মেইননেটে এটি বাস্তবায়নের জন্য প্রস্তুত হওয়ার আগে এগারো বছর লেগেছিল। কিছু অন্যান্য চেইন ইথেরিয়ামের আগে প্রুফ-অফ-স্টেক বাস্তবায়ন করেছিল, কিন্তু ইথেরিয়ামের নির্দিষ্ট মেকানিজম (Gasper নামে পরিচিত) নয়। + +## ইথেরিয়াম-এর প্রুফ-অফ-স্টেক-এর বিশেষত্ব কী? {#why-is-ethereum-pos-special} + +ইথেরিয়াম-এর প্রুফ-অফ-স্টেক পদ্ধতিটি তার ডিজাইনে অনন্য। এটি ডিজাইন এবং বাস্তবায়িত প্রথম প্রুফ-অফ-স্টেক পদ্ধতি ছিল না, তবে এটি সবচেয়ে শক্তিশালী। প্রুফ-অফ-স্টেক পদ্ধতিটি "Casper" নামে পরিচিত। Casper নির্ধারণ করে কিভাবে ভ্যালিডেটররা ব্লক প্রস্তাব করার জন্য নির্বাচিত হয়, কিভাবে এবং কখন প্রত্যয়ন করা হয়, কিভাবে প্রত্যয়ন গণনা করা হয়, ভ্যালিডেটরদের দেওয়া পুরস্কার এবং শাস্তি, স্ল্যাশিং শর্তাবলী, নিষ্ক্রিয়তা ফাঁসের মতো ফেইলসেফ পদ্ধতি এবং "ফাইনালিটি"-র শর্তাবলী। ফাইনালিটি হল এমন একটি শর্ত যে একটি ব্লককে ক্যানোনিকাল চেইনের একটি স্থায়ী অংশ হিসাবে বিবেচনা করার জন্য নেটওয়ার্কে মোট স্টেক করা ETH-এর কমপক্ষে 66% দ্বারা ভোট দেওয়া আবশ্যক। গবেষকরা বিশেষভাবে ইথেরিয়ামের জন্য Casper তৈরি করেছেন, এবং ইথেরিয়াম হল প্রথম এবং একমাত্র ব্লকচেইন যা এটি বাস্তবায়ন করেছে। + +Casper ছাড়াও, ইথেরিয়ামের প্রুফ-অফ-স্টেক LMD-GHOST নামক একটি ফর্ক পছন্দ অ্যালগরিদম ব্যবহার করে। একই স্লটের জন্য দুটি ব্লক বিদ্যমান এমন একটি শর্ত দেখা দিলে এটি প্রয়োজন। এটি ব্লকচেইনের দুটি ফর্ক তৈরি করে। LMD-GHOST সেইটিকে বেছে নেয় যার প্রত্যয়নের "ওজন" সবচেয়ে বেশি। ওজন হল ভ্যালিডেটরদের কার্যকর ব্যালেন্স দ্বারা ওজন করা প্রত্যয়নের সংখ্যা। LMD-GHOST ইথেরিয়ামের জন্য অনন্য। + +Casper এবং LMD_GHOST-এর সংমিশ্রণ Gasper নামে পরিচিত। + +[Gasper সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos/gasper/) + +## স্ল্যাশিং কী? {#what-is-slashing} + +স্ল্যাশিং হল একটি ভ্যালিডেটরের স্টেক-এর কিছু অংশ ধ্বংস করা এবং নেটওয়ার্ক থেকে ভ্যালিডেটরকে বের করে দেওয়ার জন্য ব্যবহৃত একটি শব্দ। স্ল্যাশিং-এ হারানো ETH-এর পরিমাণ স্ল্যাশ করা ভ্যালিডেটরের সংখ্যার সাথে স্কেল করে - এর মানে হল ষড়যন্ত্রকারী ভ্যালিডেটররা ব্যক্তিদের চেয়ে বেশি কঠোরভাবে শাস্তি পায়। + +[স্ল্যাশিং সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties#slashing) + +## ভ্যালিডেটরদের 32 ETH কেন প্রয়োজন? {#why-32-eth} + +ভ্যালিডেটরদের ETH স্টেক করতে হয় যাতে তারা খারাপ আচরণ করলে তাদের হারানোর মতো কিছু থাকে। তাদের বিশেষভাবে 32 ETH স্টেক করতে হওয়ার কারণ হল নোডগুলিকে সাধারণ হার্ডওয়্যারে চলতে সক্ষম করা। যদি প্রতি ভ্যালিডেটরের সর্বনিম্ন ETH কম হত, তাহলে ভ্যালিডেটরের সংখ্যা এবং ফলস্বরূপ প্রতিটি স্লটে প্রক্রিয়া করা আবশ্যক বার্তাগুলির সংখ্যা বাড়ত, যার অর্থ একটি নোড চালানোর জন্য আরও শক্তিশালী হার্ডওয়্যারের প্রয়োজন হত। + +## ভ্যালিডেটরদের কীভাবে নির্বাচন করা হয়? {#how-are-validators-selected} + +RANDAO নামক একটি অ্যালগরিদম ব্যবহার করে প্রতিটি স্লটে একটি ব্লক প্রস্তাব করার জন্য একজন একক ভ্যালিডেটরকে ছদ্ম-এলোমেলোভাবে বেছে নেওয়া হয় যা ব্লক প্রস্তাবকের একটি হ্যাসকে একটি সিডের সাথে মিশ্রিত করে যা প্রতিটি ব্লকে আপডেট হয়। এই মানটি মোট ভ্যালিডেটর সেট থেকে একটি নির্দিষ্ট ভ্যালিডেটর নির্বাচন করতে ব্যবহৃত হয়। ভ্যালিডেটর নির্বাচন দুটি ইপক আগে থেকে স্থির করা হয়। + +[ভ্যালিডেটর নির্বাচন সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos/block-proposal) + +## স্টেক গ্রাইন্ডিং কী? {#what-is-stake-grinding} + +স্টেক গ্রাইন্ডিং হল প্রুফ-অফ-স্টেক নেটওয়ার্কের উপর এক ধরনের আক্রমণ যেখানে আক্রমণকারী তাদের নিজস্ব ভ্যালিডেটরদের পক্ষে ভ্যালিডেটর নির্বাচন অ্যালগরিদমকে পক্ষপাতদুষ্ট করার চেষ্টা করে। RANDAO-এর উপর স্টেক গ্রাইন্ডিং আক্রমণের জন্য মোট স্টেক করা ETH-এর প্রায় অর্ধেক প্রয়োজন। + +[স্টেক গ্রাইন্ডিং সম্পর্কে আরও জানুন](https://eth2book.info/altair/part2/building_blocks/randomness/#randao-biasability) + +## সোশ্যাল স্ল্যাশিং কী? {#what-is-social-slashing} + +সোশ্যাল স্ল্যাশিং হল একটি আক্রমণের প্রতিক্রিয়ায় ব্লকচেইনের একটি ফর্ক সমন্বয় করার জন্য সম্প্রদায়ের ক্ষমতা। এটি সম্প্রদায়কে একজন আক্রমণকারীর একটি অসৎ চেইন চূড়ান্ত করা থেকে পুনরুদ্ধার করতে সক্ষম করে। সেন্সরশিপ আক্রমণের বিরুদ্ধেও সোশ্যাল স্ল্যাশিং ব্যবহার করা যেতে পারে। + +- [সোশ্যাল স্ল্যাশিং সম্পর্কে আরও জানুন](https://ercwl.medium.com/the-case-for-social-slashing-59277ff4d9c7) +- [সোশ্যাল স্ল্যাশিং সম্পর্কে Vitalik Buterin](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) + +## আমি কি স্ল্যাশড হব? {#will-i-get-slashed} + +একজন ভ্যালিডেটর হিসাবে, স্ল্যাশড হওয়া খুব কঠিন যদি না আপনি ইচ্ছাকৃতভাবে ক্ষতিকারক আচরণে জড়িত হন। স্ল্যাশিং শুধুমাত্র খুব নির্দিষ্ট পরিস্থিতিতে বাস্তবায়িত হয় যেখানে ভ্যালিডেটররা একই স্লটের জন্য একাধিক ব্লক প্রস্তাব করে বা তাদের প্রত্যয়ন দিয়ে নিজেদের বিরোধিতা করে - এগুলি দুর্ঘটনাক্রমে ঘটার সম্ভাবনা খুব কম। + +[স্ল্যাশিং শর্তাবলী সম্পর্কে আরও জানুন](https://eth2book.info/altair/part2/incentives/slashing) + +## নাথিং-অ্যাট-স্টেক সমস্যাটি কী? {#what-is-nothing-at-stake-problem} + +নাথিং-অ্যাট-স্টেক সমস্যাটি কিছু প্রুফ-অফ-স্টেক পদ্ধতির সাথে একটি ধারণাগত সমস্যা যেখানে শুধুমাত্র পুরস্কার আছে এবং কোনো শাস্তি নেই। যদি স্টেক করার মতো কিছু না থাকে, তবে একজন বাস্তববাদী ভ্যালিডেটর ব্লকচেইনের যেকোনো, বা এমনকি একাধিক, ফর্কের প্রত্যয়ন করতে সমানভাবে খুশি, কারণ এটি তাদের পুরস্কার বাড়ায়। ইথেরিয়াম একটি ক্যানোনিকাল চেইন নিশ্চিত করতে ফাইনালিটি শর্ত এবং স্ল্যাশিং ব্যবহার করে এই সমস্যার সমাধান করে। + +[নাথিং-অ্যাট-স্টেক সমস্যা সম্পর্কে আরও জানুন](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-the-nothing-at-stake-problem-and-how-can-it-be-fixed) + +## ফর্ক পছন্দ অ্যালগরিদম কী? {#what-is-a-fork-choice-algorithm} + +একটি ফর্ক পছন্দ অ্যালগরিদম নিয়ম বাস্তবায়ন করে যা নির্ধারণ করে কোন চেইনটি ক্যানোনিকাল। অনুকূল পরিস্থিতিতে, ফর্ক পছন্দ নিয়মের কোনো প্রয়োজন নেই কারণ প্রতি স্লটে কেবল একজন ব্লক প্রস্তাবক থাকে এবং বেছে নেওয়ার জন্য একটি ব্লক থাকে। তবে মাঝে মাঝে, একই স্লটের জন্য একাধিক ব্লক বা দেরিতে আসা তথ্য চেইনের শীর্ষের কাছাকাছি ব্লকগুলি কীভাবে সংগঠিত হয় তার জন্য একাধিক বিকল্পের দিকে নিয়ে যায়। এইসব ক্ষেত্রে, সমস্ত ক্লায়েন্টদের অবশ্যই কিছু নিয়ম একইভাবে বাস্তবায়ন করতে হবে যাতে তারা সবাই সঠিক ব্লকের ক্রম বেছে নেয়। ফর্ক পছন্দ অ্যালগরিদম এই নিয়মগুলিকে এনকোড করে। + +ইথেরিয়ামের ফর্ক পছন্দ অ্যালগরিদমকে LMD-GHOST বলা হয়। এটি সবচেয়ে বেশি প্রত্যয়নের ওজনের ফর্কটি বেছে নেয়, যার অর্থ হল সবচেয়ে বেশি স্টেক করা ETH যেটির জন্য ভোট দিয়েছে। + +[LMD-GHOST সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos/gasper/#fork-choice) + +## প্রুফ-অফ-স্টেক-এ ফাইনালিটি কী? {#what-is-finality} + +প্রুফ-অফ-স্টেক-এ ফাইনালিটি হল এই গ্যারান্টি যে একটি প্রদত্ত ব্লক ক্যানোনিকাল চেইনের একটি স্থায়ী অংশ এবং এটিকে প্রত্যাবর্তন করা যাবে না যদি না একটি কনসেন্সাস ব্যর্থতা হয় যেখানে একজন আক্রমণকারী মোট স্টেক করা ইথারের 33% পুড়িয়ে ফেলে। এটি হল "ক্রিপ্টো-অর্থনৈতিক" ফাইনালিটি, যা "সম্ভাব্য ফাইনালিটি"-এর বিপরীত যা প্রুফ-অফ-ওয়ার্ক ব্লকচেইনের সাথে প্রাসঙ্গিক। সম্ভাব্য ফাইনালিটিতে, ব্লকগুলির জন্য কোনো সুস্পষ্ট চূড়ান্ত/অ-চূড়ান্ত অবস্থা নেই - একটি ব্লক চেইন থেকে সরানো যেতে পারে এমন সম্ভাবনা কেবল কমতে থাকে যখন এটি পুরানো হয়, এবং ব্যবহারকারীরা নিজেরাই নির্ধারণ করে কখন তারা যথেষ্ট আত্মবিশ্বাসী যে একটি ব্লক "নিরাপদ"। ক্রিপ্টো-অর্থনৈতিক ফাইনালিটির সাথে, জোড়া চেকপয়েন্ট ব্লকের জন্য স্টেক করা ইথারের 66% দ্বারা ভোট দিতে হবে। যদি এই শর্তটি পূরণ হয়, তবে সেই চেকপয়েন্টগুলির মধ্যেকার ব্লকগুলিকে স্পষ্টভাবে "চূড়ান্ত" করা হয়। + +[ফাইনালিটি সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos/#finality) + +## "উইক সাবজেক্টিভিটি" কী? {#what-is-weak-subjectivity} + +উইক সাবজেক্টিভিটি হল প্রুফ-অফ-স্টেক নেটওয়ার্কগুলির একটি বৈশিষ্ট্য যেখানে ব্লকচেইনের বর্তমান অবস্থা নিশ্চিত করতে সামাজিক তথ্য ব্যবহার করা হয়। নতুন নোড বা দীর্ঘ সময় ধরে অফলাইন থাকার পর নেটওয়ার্কে পুনরায় যোগদানকারী নোডগুলিকে একটি সাম্প্রতিক অবস্থা দেওয়া যেতে পারে যাতে নোডটি অবিলম্বে দেখতে পারে যে তারা সঠিক চেইনে আছে কিনা। এই অবস্থাগুলিকে "উইক সাবজেক্টিভিটি চেকপয়েন্ট" বলা হয় এবং এগুলি অন্যান্য নোড অপারেটরদের কাছ থেকে আউট-অফ-ব্যান্ড, বা ব্লক এক্সপ্লোরার থেকে, বা বেশ কয়েকটি পাবলিক এন্ডপয়েন্ট থেকে পাওয়া যেতে পারে। + +[উইক সাবজেক্টিভিটি সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos/weak-subjectivity) + +## প্রুফ-অফ-স্টেক কি সেন্সরশিপ প্রতিরোধী? {#is-pos-censorship-resistant} + +সেন্সরশিপ প্রতিরোধ ক্ষমতা বর্তমানে প্রমাণ করা কঠিন। তবে, প্রুফ-অফ-ওয়ার্কের বিপরীতে, প্রুফ-অফ-স্টেক সেন্সরকারী ভ্যালিডেটরদের শাস্তি দেওয়ার জন্য স্ল্যাশিং সমন্বয় করার বিকল্প প্রস্তাব করে। প্রোটোকলে আসন্ন পরিবর্তন রয়েছে যা ব্লক বিল্ডারদের ব্লক প্রস্তাবকদের থেকে পৃথক করে এবং লেনদেনের তালিকা বাস্তবায়ন করে যা বিল্ডারদের প্রতিটি ব্লকে অন্তর্ভুক্ত করতে হবে। এই প্রস্তাবটি প্রপার-বিল্ডার সেপারেশন নামে পরিচিত এবং ভ্যালিডেটরদের লেনদেন সেন্সর করা থেকে বিরত রাখতে সাহায্য করে। + +[প্রস্তাবক-নির্মাতা পৃথকীকরণ সম্পর্কে আরও জানুন](https://notes.ethereum.org/@fradamt/H1TsYRfJc#Original-basic-scheme) + +## ইথেরিয়ামের প্রুফ-অফ-স্টেক সিস্টেমে কি 51% আক্রমণ করা সম্ভব? {#pos-51-attack} + +হ্যাঁ। প্রুফ-অফ-স্টেক, প্রুফ-অফ-ওয়ার্ক-এর মতোই 51% আক্রমণের জন্য ঝুঁকিপূর্ণ। আক্রমণকারীর নেটওয়ার্কের 51% হ্যাস পাওয়ারের পরিবর্তে, আক্রমণকারীর মোট স্টেক করা ETH-এর 51% প্রয়োজন। একজন আক্রমণকারী যে মোট স্টেক-এর 51% সংগ্রহ করে সে ফর্ক-পছন্দ অ্যালগরিদম নিয়ন্ত্রণ করতে পারে। এটি আক্রমণকারীকে নির্দিষ্ট লেনদেন সেন্সর করতে, স্বল্প-পরিসরের রিঅর্গ করতে এবং তাদের পক্ষে ব্লকগুলির পুনর্বিন্যাস করে MEV নিষ্কাশন করতে সক্ষম করে। + +[প্রুফ-অফ-স্টেক-এর উপর আক্রমণ সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos/attack-and-defense) + +## সামাজিক সমন্বয় কী, এবং কেন এটি প্রয়োজন? {#what-is-social-coordination} + +সামাজিক সমন্বয় হল ইথেরিয়ামের জন্য প্রতিরক্ষার শেষ লাইন যা একটি সৎ চেইনকে এমন একটি আক্রমণ থেকে পুনরুদ্ধার করার অনুমতি দেবে যা অসৎ ব্লকগুলিকে চূড়ান্ত করেছে। এই ক্ষেত্রে, ইথেরিয়াম সম্প্রদায়কে "আউট-অফ-ব্যান্ড" সমন্বয় করতে হবে এবং একটি সৎ সংখ্যালঘু ফর্ক ব্যবহার করতে সম্মত হতে হবে, এই প্রক্রিয়ায় আক্রমণকারীর ভ্যালিডেটরদের স্ল্যাশ করে। এর জন্য অ্যাপ এবং এক্সচেঞ্জগুলিকেও সৎ ফর্কটিকে স্বীকৃতি দিতে হবে। + +[সামাজিক সমন্বয় সম্পর্কে আরও পড়ুন](/developers/docs/consensus-mechanisms/pos/attack-and-defense#people-the-last-line-of-defense) + +## প্রুফ-অফ-স্টেক-এ কি ধনীরা আরও ধনী হয়? {#do-rich-get-richer} + +কারও কাছে যত বেশি ETH স্টেক করার জন্য থাকবে, তারা তত বেশি ভ্যালিডেটর চালাতে পারবে, এবং তারা তত বেশি পুরস্কার অর্জন করতে পারবে। পুরস্কারগুলি স্টেক করা ETH-এর পরিমাণের সাথে রৈখিকভাবে স্কেল করে, এবং প্রত্যেকে একই শতাংশ রিটার্ন পায়। প্রুফ-অফ-ওয়ার্ক প্রুফ-অফ-স্টেকের চেয়ে ধনীদের বেশি সমৃদ্ধ করে কারণ ধনী মাইনাররা যারা স্কেলে হার্ডওয়্যার কেনেন তারা ইকোনোমি অফ স্কেল থেকে উপকৃত হন, যার অর্থ সম্পদ এবং পুরস্কারের মধ্যে সম্পর্কটি অরৈখিক। + +## প্রুফ-অফ-স্টেক কি প্রুফ-অফ-ওয়ার্কের চেয়ে বেশি কেন্দ্রীভূত? {#is-pos-decentralized} + +না, প্রুফ-অফ-ওয়ার্ক কেন্দ্রীকরণের দিকে ঝোঁকে কারণ মাইনিং খরচ বাড়ে এবং ব্যক্তিদের দাম বাড়িয়ে দেয়, তারপর ছোট সংস্থাগুলিকে দাম বাড়িয়ে দেয়, ইত্যাদি। প্রুফ-অফ-স্টেকের বর্তমান সমস্যা হল লিকুইড স্টেকিং ডেরিভেটিভস (LSDs)-এর প্রভাব। এগুলি হল টোকেন যা কোনো প্রদানকারীর দ্বারা স্টেক করা ETH-কে প্রতিনিধিত্ব করে যা যে কেউ সেকেন্ডারি মার্কেটে সোয়াপ করতে পারে আসল ETH আনস্টেক না করেই। LSD গুলি ব্যবহারকারীদের 32 ETH-এর কম দিয়ে স্টেক করার অনুমতি দেয়, কিন্তু তারা একটি কেন্দ্রীকরণের ঝুঁকিও তৈরি করে যেখানে কয়েকটি বড় সংস্থা স্টেক-এর বেশিরভাগ অংশ নিয়ন্ত্রণ করতে পারে। এই কারণেই ইথেরিয়ামের জন্য [সোলো স্টেকিং](/staking/solo) সেরা বিকল্প। + +[LSD-তে স্টেক কেন্দ্রীকরণ সম্পর্কে আরও জানুন](https://notes.ethereum.org/@djrtwo/risks-of-lsd) + +## আমি কেন শুধু ETH স্টেক করতে পারি? {#why-can-i-only-stake-eth} + +ETH হল ইথেরিয়ামের স্থানীয় মুদ্রা। ভোটের ওজন এবং সুরক্ষার জন্য কার্যকর ব্যালেন্সের হিসাব রাখার জন্য সমস্ত স্টেককে একটি একক মুদ্রায় চিহ্নিত করা অপরিহার্য। ETH নিজেই একটি স্মার্ট কন্ট্রাক্টের পরিবর্তে ইথেরিয়ামের একটি মৌলিক উপাদান। অন্যান্য মুদ্রা অন্তর্ভুক্ত করলে স্টেকিংয়ের জটিলতা উল্লেখযোগ্যভাবে বৃদ্ধি পাবে এবং নিরাপত্তা হ্রাস পাবে। + +## ইথেরিয়াম কি একমাত্র প্রুফ-অফ-স্টেক ব্লকচেইন? {#is-ethereum-the-only-pos-blockchain} + +না, বেশ কয়েকটি প্রুফ-অফ-স্টেক ব্লকচেইন রয়েছে। কোনোটিই ইথেরিয়ামের অনুরূপ নয়; ইথেরিয়ামের প্রুফ-অফ-স্টেক পদ্ধতিটি অনন্য। + +## দ্য মার্জ কী? {#what-is-the-merge} + +দ্য মার্জ হল সেই মুহূর্ত যখন ইথেরিয়াম তার প্রুফ-অফ-ওয়ার্ক-ভিত্তিক কনসেন্সাস মেকানিজম বন্ধ করে দেয় এবং তার প্রুফ-অফ-স্টেক-ভিত্তিক কনসেন্সাস মেকানিজম চালু করে। দ্য মার্জ 15 সেপ্টেম্বর, 2022-এ ঘটেছিল। + +[দ্য মার্জ সম্পর্কে আরও জানুন](/roadmap/merge) + +## লাইভনেস এবং সেফটি কী? {#what-are-liveness-and-safety} + +লাইভনেস এবং সেফটি হল একটি ব্লকচেইনের জন্য দুটি মৌলিক নিরাপত্তা উদ্বেগ। লাইভনেস হল একটি চূড়ান্তকারী চেইনের প্রাপ্যতা। যদি চেইন চূড়ান্ত হওয়া বন্ধ করে দেয় বা ব্যবহারকারীরা সহজেই এটি অ্যাক্সেস করতে না পারে, সেগুলি হল লাইভনেস ব্যর্থতা। অত্যন্ত উচ্চ অ্যাক্সেস খরচকেও একটি লাইভনেস ব্যর্থতা হিসাবে বিবেচনা করা যেতে পারে। সেফটি বলতে বোঝায় চেইনে আক্রমণ করা কতটা কঠিন - অর্থাৎ, পরস্পরবিরোধী চেকপয়েন্ট চূড়ান্ত করা। + +[Casper পেপারে আরও পড়ুন](https://arxiv.org/pdf/1710.09437.pdf) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/gasper/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/gasper/index.md new file mode 100644 index 00000000000..db0d694a9ba --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/gasper/index.md @@ -0,0 +1,52 @@ +--- +title: "গ্যাস্পার" +description: "গ্যাস্পার প্রুফ-অফ-স্টেক মেকানিজমের একটি ব্যাখ্যা।" +lang: bn +--- + +গ্যাস্পার হল ক্যাসপার দ্য ফ্রেন্ডলি ফাইনালিটি গ্যাজেট (Casper-FFG) এবং LMD-GHOST ফর্ক চয়েস অ্যালগরিদমের একটি সংমিশ্রণ। একত্রে এই উপাদানগুলি প্রুফ-অফ-স্টেক ইথেরিয়ামকে সুরক্ষিত করার জন্য কনসেন্সাস মেকানিজম তৈরি করে। ক্যাসপার হল সেই মেকানিজম যা নির্দিষ্ট ব্লকগুলিকে "চূড়ান্ত" করতে আপগ্রেড করে যাতে নেটওয়ার্কে নতুন প্রবেশকারীরা আত্মবিশ্বাসী হতে পারে যে তারা ক্যানোনিকাল চেইন সিঙ্ক করছে। ফর্ক চয়েস অ্যালগরিদমটি সঞ্চিত ভোট ব্যবহার করে নিশ্চিত করে যে যখন ব্লকচেইনে ফর্ক দেখা দেয় তখন নোডগুলি সহজেই সঠিকটি নির্বাচন করতে পারে। + +**দ্রষ্টব্য** যে Casper-FFG-এর মূল সংজ্ঞাটি গ্যাস্পারে অন্তর্ভুক্ত করার জন্য সামান্য আপডেট করা হয়েছিল। এই পৃষ্ঠায় আমরা আপডেট করা সংস্করণটি বিবেচনা করব। + +## পূর্বশর্ত + +এই উপাদানটি বুঝতে হলে [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/)-এর ভূমিকা পৃষ্ঠাটি পড়া প্রয়োজন। + +## গ্যাস্পারের ভূমিকা {#role-of-gasper} + +গ্যাস্পার একটি প্রুফ-অফ-স্টেক ব্লকচেইনের উপরে বসে যেখানে নোডগুলি একটি নিরাপত্তা আমানত হিসাবে ইথার সরবরাহ করে যা ব্লক প্রস্তাব বা ভ্যালিডেট করার ক্ষেত্রে অলস বা অসৎ হলে ধ্বংস করা যেতে পারে। গ্যাস্পার হল সেই মেকানিজম যা নির্ধারণ করে যে কীভাবে ভ্যালিডেটরদের পুরস্কৃত এবং শাস্তি দেওয়া হবে, কোন ব্লকগুলি গ্রহণ বা প্রত্যাখ্যান করা হবে এবং ব্লকচেইনের কোন ফর্কের উপর ভিত্তি করে তৈরি করা হবে। + +## চূড়ান্ততা কী? {#what-is-finality} + +চূড়ান্ততা হল নির্দিষ্ট ব্লকের একটি বৈশিষ্ট্য যার অর্থ হল যে সেগুলিকে প্রত্যাবর্তন করা যাবে না যতক্ষণ না একটি গুরুতর কনসেন্সাস ব্যর্থতা ঘটে এবং একজন আক্রমণকারী মোট স্টেক করা ইথারের কমপক্ষে 1/3 অংশ ধ্বংস করে দেয়। চূড়ান্ত ব্লকগুলিকে এমন তথ্য হিসাবে ভাবা যেতে পারে যার সম্পর্কে ব্লকচেইন নিশ্চিত। একটি ব্লককে চূড়ান্ত করার জন্য দুটি ধাপের আপগ্রেড পদ্ধতির মধ্যে দিয়ে যেতে হবে: + +1. ক্যানোনিকাল চেইনে সেই ব্লকের অন্তর্ভুক্তির পক্ষে মোট স্টেক করা ইথারের দুই-তৃতীয়াংশকে অবশ্যই ভোট দিতে হবে। এই শর্তটি ব্লকটিকে "যৌক্তিক"-এ আপগ্রেড করে। যৌক্তিক ব্লকগুলি প্রত্যাবর্তন করার সম্ভাবনা কম, তবে নির্দিষ্ট শর্তে তা করা যেতে পারে। +2. যখন একটি যৌক্তিক ব্লকের উপরে আরেকটি ব্লক যৌক্তিক হয়, তখন এটিকে "চূড়ান্ত"-তে আপগ্রেড করা হয়। একটি ব্লককে চূড়ান্ত করা হল ক্যানোনিকাল চেইনে ব্লকটিকে অন্তর্ভুক্ত করার একটি প্রতিশ্রুতি। এটি প্রত্যাবর্তন করা যাবে না যতক্ষণ না একজন আক্রমণকারী লক্ষ লক্ষ ইথার (বিলিয়ন $USD) ধ্বংস করে। + +এই ব্লক আপগ্রেডগুলি প্রতিটি স্লটে ঘটে না। পরিবর্তে, শুধুমাত্র ইপক-বাউন্ডারি ব্লকগুলিকেই যৌক্তিক এবং চূড়ান্ত করা যেতে পারে। এই ব্লকগুলি "চেকপয়েন্ট" নামে পরিচিত। আপগ্রেড করার সময় এক জোড়া চেকপয়েন্ট বিবেচনা করা হয়। কম সাম্প্রতিক চেকপয়েন্টকে চূড়ান্ত এবং আরও সাম্প্রতিক ব্লককে যৌক্তিক করতে আপগ্রেড করার জন্য দুটি ধারাবাহিক চেকপয়েন্টের মধ্যে একটি "সুপারমেজরিটি লিঙ্ক" থাকতে হবে (অর্থাৎ, মোট স্টেক করা ইথারের দুই-তৃতীয়াংশের ভোট দেওয়া যে চেকপয়েন্ট B হল চেকপয়েন্ট A-এর সঠিক উত্তরসূরি)। + +যেহেতু চূড়ান্ততার জন্য একটি ব্লকের ক্যানোনিকাল হওয়ার জন্য দুই-তৃতীয়াংশের চুক্তির প্রয়োজন হয়, তাই একজন আক্রমণকারী নিম্নলিখিতগুলি ছাড়া কোনো বিকল্প চূড়ান্ত চেইন তৈরি করতে পারে না: + +1. মোট স্টেক করা ইথারের দুই-তৃতীয়াংশের মালিকানা বা কারসাজি করা। +2. মোট স্টেক করা ইথারের অন্তত এক-তৃতীয়াংশ ধ্বংস করা। + +প্রথম শর্তটি দেখা দেয় কারণ একটি চেইনকে চূড়ান্ত করতে স্টেক করা ইথারের দুই-তৃতীয়াংশের প্রয়োজন। দ্বিতীয় শর্তটি দেখা দেয় কারণ যদি মোট স্টেকের দুই-তৃতীয়াংশ উভয় ফর্কের পক্ষে ভোট দিয়ে থাকে, তাহলে এক-তৃতীয়াংশকে অবশ্যই উভয়ের উপর ভোট দিতে হবে। ডাবল-ভোটিং একটি স্ল্যাশিং শর্ত যা সর্বোচ্চ শাস্তিযোগ্য, এবং মোট স্টেকের এক-তৃতীয়াংশ ধ্বংস হয়ে যাবে। মে 2022 অনুযায়ী, এর জন্য একজন আক্রমণকারীকে প্রায় $10 বিলিয়ন মূল্যের ইথার পোড়াতে হবে। গ্যাস্পারে যে অ্যালগরিদম ব্লকগুলিকে যৌক্তিক এবং চূড়ান্ত করে, তা হল [Casper the Friendly Finality Gadget (Casper-FFG)](https://arxiv.org/pdf/1710.09437.pdf)-এর একটি সামান্য পরিবর্তিত রূপ। + +### ইনসেনটিভ এবং স্ল্যাশিং {#incentives-and-slashing} + +ভ্যালিডেটররা সৎভাবে ব্লক প্রস্তাব এবং ভ্যালিডেট করার জন্য পুরস্কৃত হয়। ইথার পুরস্কৃত করা হয় এবং তাদের স্টেকে যোগ করা হয়। অন্যদিকে, যে ভ্যালিডেটররা অনুপস্থিত থাকে এবং যখন কাজ করার জন্য ডাকা হয় তখন কাজ করতে ব্যর্থ হয়, তারা এই পুরস্কারগুলি থেকে বঞ্চিত হয় এবং কখনও কখনও তাদের বিদ্যমান স্টেকের একটি ছোট অংশ হারায়। যাইহোক, অফলাইন থাকার জন্য জরিমানা সামান্য এবং বেশিরভাগ ক্ষেত্রে, পুরস্কার হারানোর সুযোগ ব্যয়ের সমান। যাইহোক, কিছু ভ্যালিডেটর ক্রিয়া দুর্ঘটনাক্রমে করা খুব কঠিন এবং কিছু দূষিত উদ্দেশ্যকে বোঝায়, যেমন একই স্লটের জন্য একাধিক ব্লক প্রস্তাব করা, একই স্লটের জন্য একাধিক ব্লকে অ্যাটেস্টিং করা, বা পূর্ববর্তী চেকপয়েন্ট ভোটের বিরোধিতা করা। এগুলি হল "স্ল্যাশযোগ্য" আচরণ যেগুলিকে আরও কঠোরভাবে শাস্তি দেওয়া হয়—স্ল্যাশিং-এর ফলে ভ্যালিডেটরের স্টেকের কিছু অংশ ধ্বংস হয়ে যায় এবং ভ্যালিডেটরকে ভ্যালিডেটরদের নেটওয়ার্ক থেকে সরিয়ে দেওয়া হয়। এই প্রক্রিয়াটি 36 দিন সময় নেয়। প্রথম দিনে, 1 ETH পর্যন্ত প্রাথমিক জরিমানা রয়েছে। তারপর স্ল্যাশ করা ভ্যালিডেটরের ইথার ধীরে ধীরে এক্সিট পিরিয়ড জুড়ে শেষ হয়ে যায়, কিন্তু 18তম দিনে, তারা একটি "কোরিলেশন পেনাল্টি" পায়, যা একই সময়ে আরও বেশি ভ্যালিডেটর স্ল্যাশ করা হলে আরও বড় হয়। সর্বোচ্চ জরিমানা হল সম্পূর্ণ স্টেক। এই পুরস্কার এবং জরিমানাগুলি সৎ ভ্যালিডেটরদের উৎসাহিত করতে এবং নেটওয়ার্কে আক্রমণকে নিরুৎসাহিত করার জন্য ডিজাইন করা হয়েছে। + +### নিষ্ক্রিয়তা লিক {#inactivity-leak} + +নিরাপত্তার পাশাপাশি, গ্যাস্পার "বিশ্বাসযোগ্য লাইভনেস" প্রদান করে। এটি এমন একটি শর্ত যে যতক্ষণ পর্যন্ত মোট স্টেক করা ইথারের দুই-তৃতীয়াংশ সততার সাথে ভোট দিচ্ছে এবং প্রোটোকল অনুসরণ করছে, ততক্ষণ চেইনটি অন্য কোনও কার্যকলাপ (যেমন আক্রমণ, লেটেন্সি সমস্যা বা স্ল্যাশিং) নির্বিশেষে চূড়ান্ত হতে সক্ষম হবে। অন্যভাবে বলতে গেলে, চেইনকে চূড়ান্ত হওয়া থেকে আটকাতে মোট স্টেক করা ইথারের এক-তৃতীয়াংশকে কোনোভাবে আপোস করতে হবে। গ্যাস্পারে, লাইভনেস ব্যর্থতার বিরুদ্ধে একটি অতিরিক্ত প্রতিরক্ষা ব্যবস্থা রয়েছে, যা "নিষ্ক্রিয়তা লিক" নামে পরিচিত। এই মেকানিজমটি সক্রিয় হয় যখন চেইনটি চারটিরও বেশি ইপক ধরে চূড়ান্ত হতে ব্যর্থ হয়। যেসব ভ্যালিডেটর সক্রিয়ভাবে মেজরিটি চেইনে অ্যাটেস্টিং করছে না, তাদের স্টেক ধীরে ধীরে নিঃশেষ হয়ে যায় যতক্ষণ না মেজরিটি মোট স্টেকের দুই-তৃতীয়াংশ ফিরে পায়, এটি নিশ্চিত করে যে লাইভনেস ব্যর্থতা শুধুমাত্র অস্থায়ী। + +### ফর্ক পছন্দ {#fork-choice} + +Casper-FFG-এর মূল সংজ্ঞায় একটি ফর্ক চয়েস অ্যালগরিদম অন্তর্ভুক্ত ছিল যা এই নিয়মটি আরোপ করেছিল: `সেই চেইনটি অনুসরণ করুন যেখানে সর্বোচ্চ উচ্চতার যৌক্তিক চেকপয়েন্ট রয়েছে` যেখানে উচ্চতাকে জেনেসিস ব্লক থেকে সর্বাধিক দূরত্ব হিসাবে সংজ্ঞায়িত করা হয়। গ্যাস্পারে, আসল ফর্ক চয়েস নিয়মটি LMD-GHOST নামক একটি আরও পরিশীলিত অ্যালগরিদমের পক্ষে বাতিল করা হয়েছে। এটা বোঝা গুরুত্বপূর্ণ যে সাধারণ পরিস্থিতিতে, একটি ফর্ক চয়েস নিয়মের প্রয়োজন নেই - প্রতিটি স্লটের জন্য একটি একক ব্লক প্রোপোজার থাকে এবং সৎ ভ্যালিডেটররা এতে অ্যাটেস্টিং করে। শুধুমাত্র বড় নেটওয়ার্ক অ্যাসিঙ্ক্রোনিসিটির ক্ষেত্রে বা যখন একজন অসৎ ব্লক প্রোপোজার দ্ব্যর্থবোধক কথা বলে, তখনই একটি ফর্ক চয়েস অ্যালগরিদমের প্রয়োজন হয়। যাইহোক, যখন সেই ঘটনাগুলি ঘটে, তখন ফর্ক চয়েস অ্যালগরিদম একটি গুরুত্বপূর্ণ প্রতিরক্ষা যা সঠিক চেইনকে সুরক্ষিত করে। + +LMD-GHOST-এর পূর্ণরূপ হল "লেটেস্ট মেসেজ-ড্রিভেন গ্রিডি হেভিয়েস্ট অবজার্ভড সাব-ট্রি"। এটি একটি পরিভাষা-বহুল উপায় একটি অ্যালগরিদমকে সংজ্ঞায়িত করার, যা অ্যাটেস্টেশনের সর্বাধিক সঞ্চিত ওজন সহ ফর্কটিকে ক্যানোনিকাল হিসাবে নির্বাচন করে (গ্রিডি হেভিয়েস্ট সাবট্রি) এবং যদি একজন ভ্যালিডেটরের কাছ থেকে একাধিক বার্তা পাওয়া যায়, তবে শুধুমাত্র সর্বশেষটি বিবেচনা করা হয় (লেটেস্ট-মেসেজ ড্রিভেন)। সবচেয়ে ভারী ব্লকটিকে তার ক্যানোনিকাল চেইনে যোগ করার আগে, প্রতিটি ভ্যালিডেটর এই নিয়মটি ব্যবহার করে প্রতিটি ব্লক মূল্যায়ন করে। + +## আরও পড়ুন {#further-reading} + +- [গ্যাস্পার: GHOST এবং Casper-এর সমন্বয়](https://arxiv.org/pdf/2003.03052.pdf) +- [Casper the Friendly Finality Gadget](https://arxiv.org/pdf/1710.09437.pdf) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/index.md new file mode 100644 index 00000000000..74ff1c10770 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/index.md @@ -0,0 +1,99 @@ +--- +title: "প্রুফ-অফ-স্টেক (PoS)" +description: "প্রুফ-অফ-স্টেক কনসেন্সাস প্রোটোকল এবং Ethereum-এ এর ভূমিকা সম্পর্কে একটি ব্যাখ্যা।" +lang: bn +--- + +প্রুফ-অফ-স্টেক (PoS) হল Ethereum-এর [কনসেন্সাস মেকানিজম](/developers/docs/consensus-mechanisms/)-এর ভিত্তি। Ethereum 2022 সালে তার প্রুফ-অফ-স্টেক মেকানিজমে পরিবর্তন করে কারণ এটি পূর্ববর্তী [প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow) আর্কিটেকচারের তুলনায় আরও বেশি সুরক্ষিত, কম শক্তি-নিবিড় এবং নতুন স্কেলিং সমাধান বাস্তবায়নের জন্য উন্নত। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি ভালোভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে [কনসেন্সাস মেকানিজম](/developers/docs/consensus-mechanisms/) সম্পর্কে পড়ে নেওয়ার সুপারিশ করছি। + +## প্রুফ-অফ-স্টেক (PoS) কী? {#what-is-pos} + +প্রুফ-অফ-স্টেক হল এটি প্রমাণ করার একটি উপায় যে ভ্যালিডেটররা নেটওয়ার্কে মূল্যবান কিছু রেখেছে যা তারা অসাধুভাবে কাজ করলে ধ্বংস করা যেতে পারে। Ethereum-এর প্রুফ-অফ-স্টেক-এ, ভ্যালিডেটররা Ethereum-এর একটি স্মার্ট কন্ট্র্যাক্টে ETH-এর আকারে মূলধন হিসেবে সুস্পষ্টভাবে স্টেক করে। ভ্যালিডেটর তখন নেটওয়ার্কের মাধ্যমে প্রচারিত নতুন ব্লকগুলো বৈধ কিনা তা পরীক্ষা করার জন্য এবং মাঝে মাঝে নিজেরাই নতুন ব্লক তৈরি এবং প্রচার করার জন্য দায়ী থাকে। যদি তারা নেটওয়ার্ককে প্রতারণা করার চেষ্টা করে (উদাহরণস্বরূপ, যখন তাদের একটি ব্লক পাঠানোর কথা তখন একাধিক ব্লক প্রস্তাব করা বা পরস্পরবিরোধী অ্যাটাস্টেশন পাঠানো), তাহলে তাদের স্টেক করা ETH-এর কিছু বা সমস্ত অংশ ধ্বংস করা যেতে পারে। + +## ভ্যালিডেটর {#validators} + +একজন ভ্যালিডেটর হিসেবে অংশগ্রহণ করার জন্য, একজন ব্যবহারকারীকে অবশ্যই ডিপোজিট কন্ট্র্যাক্টে 32 ETH জমা দিতে হবে এবং তিনটি পৃথক সফটওয়্যার চালাতে হবে: একটি এক্সিকিউশন ক্লায়েন্ট, একটি কনসেন্সাস ক্লায়েন্ট এবং একটি ভ্যালিডেটর ক্লায়েন্ট। তাদের ETH জমা দেওয়ার পরে, ব্যবহারকারী একটি অ্যাক্টিভেশন কিউতে যোগদান করে যা নেটওয়ার্কে নতুন ভ্যালিডেটরদের যোগদানের হারকে সীমিত করে। একবার সক্রিয় হয়ে গেলে, ভ্যালিডেটররা Ethereum নেটওয়ার্কের পিয়ারদের থেকে নতুন ব্লক গ্রহণ করে। ব্লকে ডেলিভার করা ট্রানজ্যাকশনগুলো পুনরায় এক্সিকিউট করা হয় এটি পরীক্ষা করতে যে Ethereum-এর স্টেটে প্রস্তাবিত পরিবর্তনগুলো বৈধ, এবং ব্লকের সিগনেচার পরীক্ষা করা হয়। তারপর ভ্যালিডেটর নেটওয়ার্ক জুড়ে সেই ব্লকের পক্ষে একটি ভোট (যাকে অ্যাটাস্টেশন বলা হয়) পাঠায়। + +যেখানে প্রুফ-অফ-ওয়ার্ক-এর অধীনে, ব্লকের সময় মাইনিং ডিফিকাল্টি দ্বারা নির্ধারিত হয়, সেখানে প্রুফ-অফ-স্টেক-এ টেম্পো স্থির থাকে। প্রুফ-অফ-স্টেক Ethereum-এ সময়কে স্লট (12 সেকেন্ড) এবং ইপক (32 স্লট)-এ ভাগ করা হয়। প্রতিটি স্লটে একজন ভ্যালিডেটরকে এলোমেলোভাবে ব্লক প্রপোজার হিসেবে নির্বাচিত করা হয়। এই ভ্যালিডেটর একটি নতুন ব্লক তৈরি করে এবং নেটওয়ার্কের অন্যান্য নোডগুলিতে পাঠানোর জন্য দায়ী থাকে। এছাড়াও প্রতিটি স্লটে, ভ্যালিডেটরদের একটি কমিটি এলোমেলোভাবে বেছে নেওয়া হয়, যাদের ভোট প্রস্তাবিত ব্লকের বৈধতা নির্ধারণ করতে ব্যবহৃত হয়। ভ্যালিডেটর সেটকে কমিটিগুলিতে ভাগ করা নেটওয়ার্কের লোড পরিচালনাযোগ্য রাখার জন্য গুরুত্বপূর্ণ। কমিটিগুলো ভ্যালিডেটর সেটকে এমনভাবে ভাগ করে যে প্রতিটি সক্রিয় ভ্যালিডেটর প্রতিটি ইপকে অ্যাটেস্ট করে, কিন্তু প্রতিটি স্লটে নয়। + +## Ethereum PoS-এ একটি ট্রানজ্যাকশন কিভাবে এক্সিকিউট হয় {#transaction-execution-ethereum-pos} + +নিচে Ethereum প্রুফ-অফ-স্টেক-এ কীভাবে একটি ট্রানজ্যাকশন এক্সিকিউট করা হয় তার একটি এন্ড-টু-এন্ড ব্যাখ্যা প্রদান করা হলো। + +1. একজন ব্যবহারকারী তাদের প্রাইভেট কী দিয়ে একটি [ট্রানজ্যাকশন](/developers/docs/transactions/) তৈরি করে এবং সাইন করে। এটি সাধারণত একটি ওয়ালেট বা [ethers.js](https://docs.ethers.org/v6/), [web3js](https://docs.web3js.org/), [web3py](https://web3py.readthedocs.io/en/v5/) ইত্যাদির মতো একটি লাইব্রেরি দ্বারা পরিচালিত হয়, কিন্তু পর্দার আড়ালে ব্যবহারকারী Ethereum [JSON-RPC API](/developers/docs/apis/json-rpc/) ব্যবহার করে একটি নোডে অনুরোধ করে। ব্যবহারকারী গ্যাসের পরিমাণ নির্ধারণ করে যা তারা একজন ভ্যালিডেটরকে টিপস হিসেবে দিতে প্রস্তুত, যাতে তারা ব্লকটিতে ট্রানজ্যাকশনটি অন্তর্ভুক্ত করতে উৎসাহিত হয়। [টিপস](/developers/docs/gas/#priority-fee) ভ্যালিডেটরকে প্রদান করা হয়, যেখানে [বেস ফি](/developers/docs/gas/#base-fee) বার্ন করা হয়। +2. ট্রানজ্যাকশনটি একটি Ethereum [এক্সিকিউশন ক্লায়েন্ট](/developers/docs/nodes-and-clients/#execution-client)-এ জমা দেওয়া হয় যা এর বৈধতা যাচাই করে। এর মানে হল নিশ্চিত করা যে প্রেরকের কাছে ট্রানজ্যাকশনটি পূরণ করার জন্য যথেষ্ট ETH আছে এবং তারা সঠিক কী দিয়ে এটি সাইন করেছে। +3. ট্রানজ্যাকশনটি বৈধ হলে, এক্সিকিউশন ক্লায়েন্ট এটিকে তার স্থানীয় মেমপুলে (মুলতুবি থাকা ট্রানজ্যাকশনের তালিকা) যোগ করে এবং এক্সিকিউশন লেয়ার গসিপ নেটওয়ার্কের মাধ্যমে অন্যান্য নোডগুলিতে এটি সম্প্রচার করে। যখন অন্যান্য নোডগুলো ট্রানজ্যাকশনটি সম্পর্কে জানতে পারে, তখন তারাও এটিকে তাদের স্থানীয় মেমপুলে যোগ করে। উন্নত ব্যবহারকারীরা তাদের ট্রানজ্যাকশন সম্প্রচার করা থেকে বিরত থাকতে পারে এবং পরিবর্তে এটি [Flashbots Auction](https://docs.flashbots.net/flashbots-auction/overview)-এর মতো বিশেষ ব্লক বিল্ডারদের কাছে ফরোয়ার্ড করতে পারে। এটি তাদের সর্বোচ্চ লাভের জন্য আসন্ন ব্লকগুলিতে ট্রানজ্যাকশনগুলো সংগঠিত করার অনুমতি দেয় ([MEV](/developers/docs/mev/#mev-extraction))। +4. নেটওয়ার্কের একটি ভ্যালিডেটর নোড হল বর্তমান স্লটের ব্লক প্রপোজার, যা পূর্বে RANDAO ব্যবহার করে ছদ্ম-এলোমেলোভাবে নির্বাচিত হয়েছে। এই নোডটি Ethereum ব্লকচেইনে যোগ করার জন্য পরবর্তী ব্লক তৈরি এবং সম্প্রচার করা এবং গ্লোবাল স্টেট আপডেট করার জন্য দায়ী। নোডটি তিনটি অংশ নিয়ে গঠিত: একটি এক্সিকিউশন ক্লায়েন্ট, একটি কনসেন্সাস ক্লায়েন্ট এবং একটি ভ্যালিডেটর ক্লায়েন্ট। এক্সিকিউশন ক্লায়েন্ট স্থানীয় মেমপুল থেকে ট্রানজ্যাকশনগুলোকে একটি "এক্সিকিউশন পেলোড"-এ বান্ডিল করে এবং একটি স্টেট পরিবর্তন তৈরি করার জন্য স্থানীয়ভাবে সেগুলোকে এক্সিকিউট করে। এই তথ্যটি কনসেন্সাস ক্লায়েন্টের কাছে পাঠানো হয় যেখানে এক্সিকিউশন পেলোড একটি "বিকন ব্লক"-এর অংশ হিসাবে মোড়ানো থাকে, যেটিতে পুরস্কার, জরিমানা, স্ল্যাশিং, অ্যাটাস্টেশন ইত্যাদি সম্পর্কিত তথ্যও থাকে যা নেটওয়ার্ককে চেইনের হেডে থাকা ব্লকের ক্রম সম্পর্কে একমত হতে সক্ষম করে। এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্টদের মধ্যে যোগাযোগ সম্পর্কে [কনসেন্সাস এবং এক্সিকিউশন ক্লায়েন্টদের সংযোগ করা](/developers/docs/networking-layer/#connecting-clients)-এ আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে। +5. অন্যান্য নোডগুলো কনসেন্সাস লেয়ার গসিপ নেটওয়ার্কে নতুন বিকন ব্লক গ্রহণ করে। তারা এটি তাদের এক্সিকিউশন ক্লায়েন্টের কাছে পাঠায় যেখানে ট্রানজ্যাকশনগুলো প্রস্তাবিত স্টেট পরিবর্তন বৈধ কিনা তা নিশ্চিত করার জন্য স্থানীয়ভাবে পুনরায় এক্সিকিউট করা হয়। ভ্যালিডেটর ক্লায়েন্ট তখন প্রমাণ করে যে ব্লকটি বৈধ এবং চেইনের তাদের দৃষ্টিভঙ্গিতে এটি যৌক্তিক পরবর্তী ব্লক (অর্থাৎ এটি [ফর্ক পছন্দ নিয়ম](/developers/docs/consensus-mechanisms/pos/#fork-choice)-এ সংজ্ঞায়িত অ্যাটাস্টেশনের সর্বাধিক ওজন সহ চেইনের উপর ভিত্তি করে তৈরি হয়)। ব্লকটি প্রতিটি নোডের স্থানীয় ডাটাবেসে যোগ করা হয় যা এটিতে অ্যাটেস্ট করে। +6. যদি ট্রানজ্যাকশনটি দুটি চেকপয়েন্টের মধ্যে একটি "সুপারমেজররিটি লিঙ্ক" সহ একটি চেইনের অংশ হয়ে যায় তবে এটিকে "ফাইনাল" হিসাবে বিবেচনা করা যেতে পারে। প্রতিটি ইপকের শুরুতে চেকপয়েন্ট ঘটে এবং তারা এই বিষয়টির জন্য বিদ্যমান যে প্রতিটি স্লটে সক্রিয় ভ্যালিডেটরদের একটি উপসেট অ্যাটেস্ট করে, কিন্তু সকল সক্রিয় ভ্যালিডেটর প্রতিটি ইপকে অ্যাটেস্ট করে। সুতরাং, শুধুমাত্র ইপকগুলোর মধ্যে একটি 'সুপারমেজররিটি লিঙ্ক' প্রদর্শন করা যেতে পারে (এখানেই নেটওয়ার্কের মোট স্টেক করা ETH-এর ৬৬% দুটি চেকপয়েন্টে একমত হয়)। + +ফাইনালিটি সম্পর্কে আরও বিস্তারিত নিচে পাওয়া যাবে। + +## ফাইনালিটি {#finality} + +ডিস্ট্রিবিউটেড নেটওয়ার্কে একটি ট্রানজ্যাকশনের "ফাইনালিটি" থাকে যখন এটি এমন একটি ব্লকের অংশ হয় যা বিপুল পরিমাণ ETH বার্ন করা ছাড়া পরিবর্তন করা যায় না। প্রুফ-অফ-স্টেক Ethereum-এ, এটি "চেকপয়েন্ট" ব্লক ব্যবহার করে পরিচালিত হয়। প্রতিটি ইপকের প্রথম ব্লকটি একটি চেকপয়েন্ট। ভ্যালিডেটররা চেকপয়েন্টের জোড়ার জন্য ভোট দেয় যেগুলোকে এটি বৈধ বলে মনে করে। যদি একজোড়া চেকপয়েন্ট মোট স্টেক করা ETH-এর কমপক্ষে দুই-তৃতীয়াংশের প্রতিনিধিত্বকারী ভোট আকর্ষণ করে, তবে চেকপয়েন্টগুলো আপগ্রেড করা হয়। দুটির মধ্যে সাম্প্রতিকটি (টার্গেট) "যুক্তিযুক্ত" হয়ে যায়। দুটির মধ্যে পূর্বেরটি ইতিমধ্যেই যুক্তিযুক্ত কারণ এটি পূর্ববর্তী ইপকের "টার্গেট" ছিল। এখন এটি "ফাইনাল"-এ আপগ্রেড করা হয়েছে। চেকপয়েন্ট আপগ্রেড করার এই প্রক্রিয়াটি **[ক্যাসপার দ্য ফ্রেন্ডলি ফাইনালিটি গ্যাজেট (ক্যাসপার-এফএফজি)](https://arxiv.org/pdf/1710.09437)** দ্বারা পরিচালিত হয়। ক্যাসপার-এফএফজি হল কনসেন্সাসের জন্য একটি ব্লক ফাইনালিটি টুল। একবার একটি ব্লক ফাইনাল হয়ে গেলে, স্ট্যাকারদের সংখ্যাগরিষ্ঠ স্ল্যাশিং ছাড়া এটি রিভার্ট বা পরিবর্তন করা যায় না, যা এটিকে অর্থনৈতিকভাবে অকার্যকর করে তোলে। + +একটি ফাইনাল ব্লক রিভার্ট করতে, একজন আক্রমণকারীকে স্টেক করা ETH-এর মোট সরবরাহের অন্তত এক-তৃতীয়াংশ হারানোর প্রতিশ্রুতি দিতে হবে। এর সঠিক কারণ এই [Ethereum Foundation ব্লগ পোস্টে](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) ব্যাখ্যা করা হয়েছে। যেহেতু ফাইনালিটির জন্য দুই-তৃতীয়াংশ সংখ্যাগরিষ্ঠতার প্রয়োজন, তাই একজন আক্রমণকারী মোট স্টেকের এক-তৃতীয়াংশ দিয়ে ভোট দিয়ে নেটওয়ার্ককে ফাইনালিটিতে পৌঁছানো থেকে আটকাতে পারে। এর বিরুদ্ধে রক্ষা করার জন্য একটি মেকানিজম রয়েছে: [ইনঅ্যাক্টিভিটি লিক](https://eth2book.info/bellatrix/part2/incentives/inactivity)। এটি সক্রিয় হয় যখন চেইনটি চারটির বেশি ইপকের জন্য ফাইনাল হতে ব্যর্থ হয়। ইনঅ্যাক্টিভিটি লিক সংখ্যাগরিষ্ঠের বিরুদ্ধে ভোট দেওয়া ভ্যালিডেটরদের থেকে স্টেক করা ETH সরিয়ে দেয়, যা সংখ্যাগরিষ্ঠকে দুই-তৃতীয়াংশ সংখ্যাগরিষ্ঠতা পুনরুদ্ধার করতে এবং চেইনটিকে ফাইনাল করতে দেয়। + +## ক্রিপ্টো-ইকোনমিক সিকিউরিটি {#crypto-economic-security} + +একজন ভ্যালিডেটর চালানো একটি প্রতিশ্রুতি। ভ্যালিডেটরের কাছ থেকে ব্লক ভ্যালিডেশন এবং প্রপোজাল-এ অংশগ্রহণের জন্য পর্যাপ্ত হার্ডওয়্যার এবং কানেক্টিভিটি বজায় রাখার প্রত্যাশা করা হয়। এর বিনিময়ে, ভ্যালিডেটরকে ETH-এ অর্থ প্রদান করা হয় (তাদের স্টেক করা ব্যালেন্স বৃদ্ধি পায়)। অন্যদিকে, একজন ভ্যালিডেটর হিসাবে অংশগ্রহণ করা ব্যবহারকারীদের ব্যক্তিগত লাভ বা নাশকতার জন্য নেটওয়ার্কে আক্রমণ করার নতুন পথ খুলে দেয়। এটি প্রতিরোধ করার জন্য, ভ্যালিডেটররা যখন অংশগ্রহণের জন্য বলা হয় তখন ব্যর্থ হলে ETH পুরস্কার থেকে বঞ্চিত হয়, এবং তারা যদি অসাধুভাবে আচরণ করে তবে তাদের বিদ্যমান স্টেক ধ্বংস করা যেতে পারে। দুটি প্রধান আচরণকে অসাধু বলে বিবেচনা করা যেতে পারে: একটি স্লটে একাধিক ব্লক প্রস্তাব করা (দ্বিচারিতা) এবং পরস্পরবিরোধী অ্যাটাস্টেশন জমা দেওয়া। + +কত পরিমাণ ETH স্ল্যাশ করা হবে তা নির্ভর করে একই সময়ে কতজন ভ্যালিডেটরকেও স্ল্যাশ করা হচ্ছে তার উপর। এটি ["কোরিলেশন পেনাল্টি"](https://eth2book.info/bellatrix/part2/incentives/slashing#the-correlation-penalty) নামে পরিচিত, এবং এটি সামান্য হতে পারে (নিজে থেকে স্ল্যাশ হওয়া একজন ভ্যালিডেটরের জন্য ~1% স্টেক) অথবা এর ফলে ভ্যালিডেটরের 100% স্টেক ধ্বংস হয়ে যেতে পারে (গণ স্ল্যাশিং ইভেন্ট)। এটি একটি বাধ্যতামূলক এক্সিট পিরিয়ডের মাঝপথে আরোপ করা হয় যা প্রথম দিনে একটি তাৎক্ষণিক জরিমানা (1 ETH পর্যন্ত) দিয়ে শুরু হয়, 18 তম দিনে কোরিলেশন পেনাল্টি এবং অবশেষে, 36 তম দিনে নেটওয়ার্ক থেকে বহিষ্কার করা হয়। তারা প্রতিদিন সামান্য অ্যাটাস্টেশন জরিমানা পায় কারণ তারা নেটওয়ার্কে উপস্থিত থাকে কিন্তু ভোট জমা দেয় না। এই সবকিছুর অর্থ হল একটি সমন্বিত আক্রমণ আক্রমণকারীর জন্য খুব ব্যয়বহুল হবে। + +## ফর্ক পছন্দ {#fork-choice} + +যখন নেটওয়ার্ক সর্বোত্তম এবং সততার সাথে কাজ করে, তখন চেইনের হেডে শুধুমাত্র একটি নতুন ব্লক থাকে এবং সমস্ত ভ্যালিডেটর এটিতে অ্যাটেস্ট করে। যাইহোক, নেটওয়ার্ক লেটেন্সি বা ব্লক প্রপোজার দ্বিমুখী আচরণ করার কারণে ভ্যালিডেটরদের চেইনের হেডের বিভিন্ন ভিউ থাকা সম্ভব। অতএব, কনসেন্সাস ক্লায়েন্টদের একটি অ্যালগরিদম প্রয়োজন যা নির্ধারণ করবে কোনটি পছন্দ করা হবে। প্রুফ-অফ-স্টেক Ethereum-এ ব্যবহৃত অ্যালগরিদমটিকে [LMD-GHOST](https://arxiv.org/pdf/2003.03052.pdf) বলা হয়, এবং এটি সেই ফর্কটি সনাক্ত করে কাজ করে যার ইতিহাসে অ্যাটাস্টেশনের সর্বাধিক ওজন রয়েছে। + +## প্রুফ-অফ-স্টেক এবং নিরাপত্তা {#pos-and-security} + +প্রুফ-অফ-ওয়ার্কের মতো প্রুফ-অফ-স্টেকের ক্ষেত্রেও [51% আক্রমণের](https://www.investopedia.com/terms/1/51-attack.asp) হুমকি এখনও বিদ্যমান, তবে এটি আক্রমণকারীদের জন্য আরও ঝুঁকিপূর্ণ। একজন আক্রমণকারীর 51% স্টেক করা ETH-এর প্রয়োজন হবে। তারা তখন তাদের নিজস্ব অ্যাটাস্টেশন ব্যবহার করে নিশ্চিত করতে পারে যে তাদের পছন্দের ফর্কটিই সবচেয়ে বেশি সঞ্চিত অ্যাটাস্টেশন সহ ছিল। সঞ্চিত অ্যাটাস্টেশনের 'ওজন' হল যা কনসেন্সাস ক্লায়েন্টরা সঠিক চেইন নির্ধারণ করতে ব্যবহার করে, তাই এই আক্রমণকারী তাদের ফর্কটিকে ক্যানোনিকাল করে তুলতে সক্ষম হবে। যাইহোক, প্রুফ-অফ-ওয়ার্কের উপর প্রুফ-অফ-স্টেকের একটি শক্তি হল যে সম্প্রদায়ের একটি পাল্টা আক্রমণ মাউন্ট করার নমনীয়তা রয়েছে। উদাহরণস্বরূপ, সৎ ভ্যালিডেটররা সংখ্যালঘু চেইনে নির্মাণ চালিয়ে যাওয়ার এবং আক্রমণকারীর ফর্ক উপেক্ষা করার সিদ্ধান্ত নিতে পারে, এবং অ্যাপস, এক্সচেঞ্জ এবং পুলগুলোকে একই কাজ করতে উত্সাহিত করতে পারে। তারা আক্রমণকারীকে জোরপূর্বক নেটওয়ার্ক থেকে সরিয়ে দেওয়ার এবং তাদের স্টেক করা ETH ধ্বংস করার সিদ্ধান্তও নিতে পারে। এগুলো ৫১% আক্রমণের বিরুদ্ধে শক্তিশালী অর্থনৈতিক প্রতিরক্ষা। + +৫১% আক্রমণের বাইরে, খারাপ অভিনেতারা অন্যান্য ধরণের দূষিত কার্যকলাপের চেষ্টাও করতে পারে, যেমন: + +- লং-রেঞ্জ আক্রমণ (যদিও ফাইনালিটি গ্যাজেট এই আক্রমণ ভেক্টরকে নিষ্ক্রিয় করে) +- স্বল্প পরিসরের 'রিঅর্গস' (যদিও প্রপোজার বুস্টিং এবং অ্যাটাস্টেশন ডেডলাইন এটি প্রশমিত করে) +- বাউন্সিং এবং ব্যালেন্সিং আক্রমণ (প্রপোজার বুস্টিং দ্বারাও প্রশমিত, এবং এই আক্রমণগুলো যাইহোক শুধুমাত্র আদর্শ নেটওয়ার্ক অবস্থার অধীনে প্রদর্শিত হয়েছে) +- অ্যাভাল্যাঞ্চ আক্রমণ (ফর্ক পছন্দ অ্যালগরিদমের শুধুমাত্র সর্বশেষ মেসেজ বিবেচনা করার নিয়ম দ্বারা নিষ্ক্রিয় করা হয়) + +সামগ্রিকভাবে, প্রুফ-অফ-স্টেক, যেমনটি Ethereum-এ প্রয়োগ করা হয়েছে, প্রুফ-অফ-ওয়ার্কের চেয়ে অর্থনৈতিকভাবে বেশি সুরক্ষিত বলে প্রমাণিত হয়েছে। + +## সুবিধা এবং অসুবিধা {#pros-and-cons} + +| যেসব বিষয়ে এর সুফল পাওয়া যায় | কনস | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| স্টেকিং ব্যক্তিদের নেটওয়ার্ক সুরক্ষিত করতে অংশগ্রহণ করা সহজ করে তোলে, যা বিকেন্দ্রীকরণকে উৎসাহিত করে। ভ্যালিডেটর নোড একটি সাধারণ ল্যাপটপে চালানো যেতে পারে। স্টেকিং পুল ব্যবহারকারীদের 32 ETH না থাকলেও স্টেক করার অনুমতি দেয়। | প্রুফ-অফ-ওয়ার্কের তুলনায় প্রুফ-অফ-স্টেক নতুন এবং কম পরীক্ষিত | +| স্টেকিং আরও বিকেন্দ্রীভূত। PoW মাইনিংয়ের ক্ষেত্রে যেভাবে ইকোনোমিক্স অফ স্কেল প্রযোজ্য, এক্ষেত্রে তেমনভাবে হয় না। | প্রুফ-অফ-ওয়ার্কের চেয়ে প্রুফ-অফ-স্টেক প্রয়োগ করা আরও জটিল | +| প্রুফ-অফ-স্টেক প্রুফ-অফ-ওয়ার্কের চেয়ে বেশি ক্রিপ্টো-অর্থনৈতিক নিরাপত্তা প্রদান করে | Ethereum-এর প্রুফ-অফ-স্টেকে অংশগ্রহণ করার জন্য ব্যবহারকারীদের তিনটি সফটওয়্যার চালাতে হবে। | +| নেটওয়ার্ক অংশগ্রহণকারীদের উৎসাহিত করার জন্য নতুন ETH-এর কম ইস্যুয়েন্স প্রয়োজন | | + +### প্রুফ-অফ-ওয়ার্ক-এর সঙ্গে তুলনা {#comparison-to-proof-of-work} + +Ethereum মূলত প্রুফ-অফ-ওয়ার্ক ব্যবহার করত কিন্তু সেপ্টেম্বর ২০২২-এ প্রুফ-অফ-স্টেকে পরিবর্তিত হয়েছে। PoS, PoW-এর তুলনায় বেশ কিছু সুবিধা প্রদান করে, যেমন: + +- উন্নত শক্তি দক্ষতা – প্রুফ-অফ-ওয়ার্ক কম্পিউটেশনে প্রচুর শক্তি ব্যবহার করার কোনো প্রয়োজন নেই +- প্রবেশের জন্য কম বাধা, হার্ডওয়্যারের প্রয়োজনীয়তা হ্রাস – নতুন ব্লক তৈরি করার সুযোগ পেতে এলিট হার্ডওয়্যারের কোনো প্রয়োজন নেই +- কেন্দ্রীভূতকরণের ঝুঁকি হ্রাস – প্রুফ-অফ-স্টেক নেটওয়ার্ক সুরক্ষিত করার জন্য আরও নোডের দিকে নিয়ে যাওয়া উচিত +- কম শক্তির প্রয়োজনীয়তার কারণে অংশগ্রহণে উৎসাহিত করার জন্য কম ETH ইস্যুয়েন্স প্রয়োজন +- অসদাচরণের জন্য অর্থনৈতিক জরিমানা প্রুফ-অফ-ওয়ার্কের তুলনায় একজন আক্রমণকারীর জন্য ৫১% স্টাইলের আক্রমণকে আরও ব্যয়বহুল করে তোলে +- যদি ৫১% আক্রমণ ক্রিপ্টো-অর্থনৈতিক প্রতিরক্ষা অতিক্রম করে, তাহলে কমিউনিটি একটি সৎ চেইনের সামাজিক পুনরুদ্ধারের আশ্রয় নিতে পারে। + +## আরও পড়ুন {#further-reading} + +- [প্রুফ অফ স্টেক FAQ](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html) _ভিটালিক বুটেরিন_ +- [প্রুফ অফ স্টেক কী](https://consensys.net/blog/blockchain-explained/what-is-proof-of-stake/) _কনসেনসিস_ +- [প্রুফ অফ স্টেক কী এবং কেন এটি গুরুত্বপূর্ণ](https://bitcoinmagazine.com/culture/what-proof-of-stake-is-and-why-it-matters-1377531463) _ভিটালিক বুটেরিন_ +- [কেন প্রুফ অফ স্টেক (নভেম্বর ২০২০)](https://vitalik.eth.limo/general/2020/11/06/pos2020.html) _ভিটালিক বুটেরিন_ +- [প্রুফ অফ স্টেক: আমি কীভাবে দুর্বল বিষয়বস্তুকে ভালোবাসতে শিখলাম](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) _ভিটালিক বুটেরিন_ +- [প্রুফ-অফ-স্টেক Ethereum আক্রমণ এবং প্রতিরক্ষা](https://mirror.xyz/jmcook.eth/YqHargbVWVNRQqQpVpzrqEQ8IqwNUJDIpwRP7SS5FXs) +- [একটি প্রুফ অফ স্টেক ডিজাইন দর্শন](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) _ভিটালিক বুটেরিন_ +- [ভিডিও: ভিটালিক বুটেরিন লেক্স ফ্রিডম্যানকে প্রুফ-অফ-স্টেক ব্যাখ্যা করছেন](https://www.youtube.com/watch?v=3yrqBG-7EVE) + +## সম্পর্কিত বিষয় {#related-topics} + +- [প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow/) +- [প্রুফ-অফ-অথোরিটি](/developers/docs/consensus-mechanisms/poa/) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/keys/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/keys/index.md new file mode 100644 index 00000000000..21e75b735a2 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/keys/index.md @@ -0,0 +1,102 @@ +--- +title: "প্রুফ-অফ-স্টেক ইথেরিয়ামের কী" +description: "ইথেরিয়ামের প্রুফ-অফ-স্টেক কনসেন্সাস মেকানিজমে ব্যবহৃত কী-গুলোর একটি ব্যাখ্যা" +lang: bn +--- + +ইথেরিয়াম পাবলিক-প্রাইভেট কী ক্রিপ্টোগ্রাফি ব্যবহার করে ব্যবহারকারীর সম্পদ সুরক্ষিত করে। পাবলিক কী একটি ইথেরিয়াম অ্যাড্রেসের ভিত্তি হিসাবে ব্যবহৃত হয়—অর্থাৎ, এটি সাধারণ জনগণের কাছে দৃশ্যমান এবং একটি অনন্য শনাক্তকারী হিসাবে ব্যবহৃত হয়। প্রাইভেট (বা 'গোপন') কী শুধুমাত্র একজন অ্যাকাউন্টের মালিকের কাছে অ্যাক্সেসযোগ্য হওয়া উচিত। প্রাইভেট কী লেনদেন এবং ডেটা 'স্বাক্ষর' করার জন্য ব্যবহৃত হয় যাতে ক্রিপ্টোগ্রাফি প্রমাণ করতে পারে যে ধারক একটি নির্দিষ্ট প্রাইভেট কী-এর কিছু ক্রিয়াকলাপ অনুমোদন করেছেন। + +ইথেরিয়ামের কী-গুলো [ইলিপটিক-কার্ভ ক্রিপ্টোগ্রাফি](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography) ব্যবহার করে তৈরি করা হয়। + +যাইহোক, যখন ইথেরিয়াম [প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow) থেকে [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos)-এ পরিবর্তিত হয়, তখন ইথেরিয়ামে একটি নতুন ধরণের কী যোগ করা হয়েছিল। আসল কী-গুলো আগের মতোই কাজ করে—অ্যাকাউন্ট সুরক্ষিতকারী ইলিপটিক-কার্ভ-ভিত্তিক কী-গুলোতে কোনও পরিবর্তন করা হয়নি। যাইহোক, ETH স্টেকিং এবং ভ্যালিডেটর চালানোর মাধ্যমে প্রুফ-অফ-স্টেক-এ অংশগ্রহণের জন্য ব্যবহারকারীদের একটি নতুন ধরনের কী-এর প্রয়োজন ছিল। এই প্রয়োজনটি বিপুল সংখ্যক ভ্যালিডেটরের মধ্যে প্রেরিত অনেকগুলো মেসেজের সাথে সম্পর্কিত স্কেলেবিলিটি চ্যালেঞ্জ থেকে উদ্ভূত হয়েছিল, যার জন্য একটি ক্রিপ্টোগ্রাফিক পদ্ধতির প্রয়োজন ছিল যা সহজেই একত্রিত করা যেতে পারে যাতে নেটওয়ার্ককে কনসেন্সাসে আসতে প্রয়োজনীয় যোগাযোগের পরিমাণ কমানো যায়। + +এই নতুন ধরনের কী [**বনিহ-লিন-শাচাম (BLS)** সিগনেচার স্কিম](https://wikipedia.org/wiki/BLS_digital_signature) ব্যবহার করে। BLS সিগনেচারের একটি অত্যন্ত কার্যকর একত্রীকরণ সক্ষম করে কিন্তু একত্রিত পৃথক ভ্যালিডেটর কী-গুলোর রিভার্স ইঞ্জিনিয়ারিংয়ের অনুমতি দেয় এবং ভ্যালিডেটরদের মধ্যে ক্রিয়া পরিচালনা করার জন্য এটি আদর্শ। + +## দুই ধরনের ভ্যালিডেটর কী {#two-types-of-keys} + +প্রুফ-অফ-স্টেক-এ স্যুইচ করার আগে, ইথেরিয়াম ব্যবহারকারীদের তাদের তহবিল অ্যাক্সেস করার জন্য শুধুমাত্র একটি ইলিপটিক-কার্ভ-ভিত্তিক প্রাইভেট কী ছিল। প্রুফ-অফ-স্টেক প্রবর্তনের সাথে, যে ব্যবহারকারীরা সোলো স্টেকার হতে চেয়েছিলেন তাদের একটি **ভ্যালিডেটর কী** এবং একটি **উইথড্রয়াল কী**-এরও প্রয়োজন ছিল। + +### ভ্যালিডেটর কী {#validator-key} + +ভ্যালিডেটর সাইনিং কী দুটি উপাদান নিয়ে গঠিত: + +- ভ্যালিডেটর **প্রাইভেট** কী +- ভ্যালিডেটর **পাবলিক** কী + +ভ্যালিডেটর প্রাইভেট কী-এর উদ্দেশ্য হল অনচেইন অপারেশন যেমন ব্লক প্রস্তাবনা এবং অ্যাটেস্টেশন স্বাক্ষর করা। এই কারণে, এই কী-গুলো অবশ্যই একটি হট ওয়ালেটে রাখতে হবে। + +এই নমনীয়তার সুবিধা হল ভ্যালিডেটর সাইনিং কী-গুলো খুব দ্রুত এক ডিভাইস থেকে অন্য ডিভাইসে সরানো যায়, তবে, যদি সেগুলি হারিয়ে যায় বা চুরি হয়ে যায়, তাহলে একজন চোর কয়েকটি উপায়ে **ক্ষতিকরভাবে কাজ** করতে পারে: + +- এর মাধ্যমে ভ্যালিডেটরকে স্ল্যাশ করান: + - একজন প্রস্তাবক হয়ে একই স্লটের জন্য দুটি ভিন্ন বীকন ব্লকে স্বাক্ষর করা + - একজন অ্যাটেস্টার হয়ে এমন একটি অ্যাটেস্টেশনে স্বাক্ষর করা যা অন্য একটিকে "ঘিরে" রাখে + - একজন অ্যাটেস্টার হয়ে একই টার্গেটযুক্ত দুটি ভিন্ন অ্যাটেস্টেশনে স্বাক্ষর করা +- একটি স্বেচ্ছাসেবী প্রস্থান করতে বাধ্য করা, যা ভ্যালিডেটরকে স্টেকিং থেকে বিরত করে, এবং উইথড্রয়াল কী-এর মালিককে তার ETH ব্যালেন্সে অ্যাক্সেস দেয়। + +যখন একজন ব্যবহারকারী স্টেকিং ডিপোজিট কন্ট্রাক্টে ETH জমা করে তখন **ভ্যালিডেটর পাবলিক কী** লেনদেনের ডেটাতে অন্তর্ভুক্ত থাকে। এটি _ডিপোজিট ডেটা_ হিসাবে পরিচিত এবং এটি ইথেরিয়ামকে ভ্যালিডেটর শনাক্ত করতে দেয়। + +### উইথড্রয়াল ক্রেডেনশিয়াল {#withdrawal-credentials} + +প্রতিটি ভ্যালিডেটরের _উইথড্রয়াল ক্রেডেনশিয়াল_ হিসাবে পরিচিত একটি বৈশিষ্ট্য রয়েছে। এই 32-বাইট ফিল্ডের প্রথম বাইট অ্যাকাউন্টের ধরন শনাক্ত করে: `0x00` আসল BLS (প্রি-শাপেলা, নন-উইথড্রয়েবল) ক্রেডেনশিয়াল প্রতিনিধিত্ব করে, `0x01` একটি এক্সিকিউশন অ্যাড্রেসে নির্দেশকারী লিগ্যাসি ক্রেডেনশিয়াল প্রতিনিধিত্ব করে, এবং `0x02` আধুনিক কম্পাউন্ডিং ক্রেডেনশিয়াল ধরনের প্রতিনিধিত্ব করে। + +`0x00` BLS কী সহ ভ্যালিডেটরদের অবশ্যই অতিরিক্ত ব্যালেন্স পেমেন্ট বা স্টেকিং থেকে সম্পূর্ণ উইথড্রয়াল সক্রিয় করার জন্য একটি এক্সিকিউশন অ্যাড্রেসে নির্দেশ করতে এই ক্রেডেনশিয়ালগুলো আপডেট করতে হবে। এটি প্রাথমিক কী জেনারেশনের সময় ডিপোজিট ডেটাতে একটি এক্সিকিউশন অ্যাড্রেস প্রদান করে, _অথবা_ পরবর্তী সময়ে একটি `BLSToExecutionChange` মেসেজ স্বাক্ষর এবং সম্প্রচার করতে উইথড্রয়াল কী ব্যবহার করে করা যেতে পারে। + +[ভ্যালিডেটর উইথড্রয়াল ক্রেডেনশিয়াল সম্পর্কে আরও জানুন](/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/) + +### উইথড্রয়াল কী {#withdrawal-key} + +প্রাথমিক জমার সময় সেট করা না হলে, উইথড্রয়াল ক্রেডেনশিয়ালগুলোকে একটি এক্সিকিউশন অ্যাড্রেসে নির্দেশ করার জন্য আপডেট করতে উইথড্রয়াল কী-এর প্রয়োজন হবে। এটি অতিরিক্ত ব্যালেন্স পেমেন্ট প্রক্রিয়া শুরু করতে সক্ষম করবে এবং ব্যবহারকারীদের তাদের স্টেক করা ETH সম্পূর্ণরূপে উইথড্র করার অনুমতিও দেবে। + +ভ্যালিডেটর কী-গুলোর মতোই, উইথড্রয়াল কী-গুলোও দুটি উপাদান নিয়ে গঠিত: + +- উইথড্রয়াল **প্রাইভেট** কী +- উইথড্রয়াল **পাবলিক** কী + +উইথড্রয়াল ক্রেডেনশিয়াল `0x01` টাইপে আপডেট করার আগে এই কী হারিয়ে ফেলার অর্থ হল ভ্যালিডেটরের ব্যালেন্সে অ্যাক্সেস হারানো। ভ্যালিডেটর এখনও অ্যাটেস্টেশন এবং ব্লক স্বাক্ষর করতে পারে কারণ এই ক্রিয়াকলাপগুলোর জন্য ভ্যালিডেটরের প্রাইভেট কী প্রয়োজন, তবে উইথড্রয়াল কী হারিয়ে গেলে কোনো ইনসেন্টিভ থাকে না বললেই চলে। + +ইথেরিয়াম অ্যাকাউন্ট কী থেকে ভ্যালিডেটর কী আলাদা করার ফলে একজন একক ব্যবহারকারী একাধিক ভ্যালিডেটর চালাতে পারে। + +![ভ্যালিডেটর কী স্কিম্যাটিক](validator-key-schematic.png) + +**দ্রষ্টব্য**: স্টেকিংয়ের দায়িত্ব থেকে প্রস্থান করা এবং একটি ভ্যালিডেটরের ব্যালেন্স উইথড্র করার জন্য বর্তমানে ভ্যালিডেটর কী দিয়ে একটি [ভলান্টারি এক্সিট মেসেজ (VEM)](https://mirror.xyz/ladislaus.eth/wmoBbUBes2Wp1_6DvP6slPabkyujSU7MZOFOC3QpErs&1) স্বাক্ষর করতে হয়। যাইহোক, [EIP-7002](https://eips.ethereum.org/EIPS/eip-7002) একটি প্রস্তাব যা ভবিষ্যতে একজন ব্যবহারকারীকে উইথড্রয়াল কী দিয়ে এক্সিট মেসেজ স্বাক্ষর করে একটি ভ্যালিডেটরের প্রস্থান ট্রিগার করতে এবং তার ব্যালেন্স উইথড্র করতে দেবে। এটি [স্টেকিং-অ্যাজ-এ-সার্ভিস প্রদানকারী](/staking/saas/#what-is-staking-as-a-service)-দের কাছে ETH ডেলিগেটকারী স্টেকারদের তাদের তহবিলের নিয়ন্ত্রণে থাকতে সক্ষম করে বিশ্বাসের অনুমান হ্রাস করবে। + +## একটি সিড ফ্রেজ থেকে কী পাওয়া {#deriving-keys-from-seed} + +যদি প্রতি 32 ETH স্টেকের জন্য 2টি সম্পূর্ণ স্বাধীন কী-এর একটি নতুন সেটের প্রয়োজন হত, তাহলে কী ম্যানেজমেন্ট দ্রুত কষ্টসাধ্য হয়ে যেত, বিশেষ করে একাধিক ভ্যালিডেটর চালানো ব্যবহারকারীদের জন্য। এর পরিবর্তে, একটি একক সাধারণ সিক্রেট থেকে একাধিক ভ্যালিডেটর কী পাওয়া যেতে পারে এবং সেই একক সিক্রেট সংরক্ষণ করা একাধিক ভ্যালিডেটর কী-তে অ্যাক্সেসের অনুমতি দেয়। + +[নেমোনিক্স](https://en.bitcoinwiki.org/wiki/Mnemonic_phrase) এবং পাথগুলি হল প্রধান বৈশিষ্ট্য যা ব্যবহারকারীরা প্রায়শই তাদের ওয়ালেট [অ্যাক্সেস করার](https://ethereum.stackexchange.com/questions/19055/what-is-the-difference-between-m-44-60-0-0-and-m-44-60-0) সময় সম্মুখীন হন। নেমোনিক হল শব্দের একটি ক্রম যা একটি প্রাইভেট কী-এর জন্য একটি প্রাথমিক সিড হিসাবে কাজ করে। অতিরিক্ত ডেটার সাথে মিলিত হলে, নেমোনিক 'মাস্টার কী' নামে পরিচিত একটি হ্যাস তৈরি করে। এটিকে একটি গাছের মূল হিসাবে ভাবা যেতে পারে। এই মূল থেকে শাখাগুলো একটি অনুক্রমিক পাথ ব্যবহার করে পাওয়া যেতে পারে যাতে চাইল্ড নোডগুলো তাদের প্যারেন্ট নোডের হ্যাস এবং ট্রিতে তাদের ইন্ডেক্সের সংমিশ্রণ হিসাবে থাকতে পারে। নেমোনিক-ভিত্তিক কী জেনারেশনের জন্য [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) এবং [BIP-19](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) স্ট্যান্ডার্ড সম্পর্কে পড়ুন। + +এই পাথগুলোর নিম্নলিখিত কাঠামো রয়েছে, যা হার্ডওয়্যার ওয়ালেটের সাথে ইন্টারঅ্যাক্ট করা ব্যবহারকারীদের কাছে পরিচিত হবে: + +``` +m/44'/60'/0'/0` +``` + +এই পাথের স্ল্যাশগুলো প্রাইভেট কী-এর উপাদানগুলোকে নিম্নরূপ পৃথক করে: + +``` +master_key / purpose / coin_type / account / change / address_index +``` + +এই যুক্তিটি ব্যবহারকারীদের একটি একক **নেমোনিক ফ্রেজ**-এর সাথে যত বেশি সম্ভব ভ্যালিডেটর সংযুক্ত করতে সক্ষম করে কারণ ট্রি রুটটি সাধারণ হতে পারে, এবং শাখাগুলিতে পার্থক্য করা যেতে পারে। ব্যবহারকারী নেমোনিক ফ্রেজ থেকে **যেকোনো সংখ্যক কী** পেতে পারেন। + +``` + [m / 0] + / + / +[m] - [m / 1] + \ + \ + [m / 2] +``` + +প্রতিটি শাখা একটি `/` দ্বারা পৃথক করা হয়েছে তাই `m/2` মানে মাস্টার কী দিয়ে শুরু করুন এবং শাখা 2 অনুসরণ করুন। নীচের স্কিম্যাটিকে একটি একক নেমোনিক ফ্রেজ তিনটি উইথড্রয়াল কী সংরক্ষণ করতে ব্যবহৃত হয়, প্রতিটির সাথে দুটি সংশ্লিষ্ট ভ্যালিডেটর রয়েছে। + +![ভ্যালিডেটর কী লজিক](multiple-keys.png) + +## আরও পড়ুন {#further-reading} + +- [কার্ল বিকহুইজেনের ইথেরিয়াম ফাউন্ডেশন ব্লগ পোস্ট](https://blog.ethereum.org/2020/05/21/keys/) +- [EIP-2333 BLS12-381 কী জেনারেশন](https://eips.ethereum.org/EIPS/eip-2333) +- [EIP-7002: এক্সিকিউশন লেয়ার ট্রিগারড এক্সিট](https://web.archive.org/web/20250125035123/https://research.2077.xyz/eip-7002-unpacking-improvements-to-staking-ux-post-merge) +- [বৃহৎ স্কেলে কী ম্যানেজমেন্ট](https://docs.ethstaker.cc/ethstaker-knowledge-base/scaled-node-operators/key-management-at-scale) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md new file mode 100644 index 00000000000..7d74fffe7f5 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/pos-vs-pow/index.md @@ -0,0 +1,69 @@ +--- +title: "প্রুফ-অফ-স্টেক বনাম প্রুফ-অফ-ওয়ার্ক" +description: "ইথেরিয়ামের প্রুফ-অফ-স্টেক এবং প্রুফ-অফ-ওয়ার্ক ভিত্তিক কনসেন্সাস মেকানিজমের মধ্যে একটি তুলনা" +lang: bn +--- + +যখন ইথেরিয়াম চালু করা হয়েছিল, তখন ইথেরিয়ামকে সুরক্ষিত করার জন্য বিশ্বাসযোগ্য হওয়ার আগে প্রুফ-অফ-স্টেকের অনেক গবেষণা এবং উন্নয়নের প্রয়োজন ছিল। প্রুফ-অফ-ওয়ার্ক একটি সহজতর প্রক্রিয়া ছিল যা ইতিমধ্যেই বিটকয়েন দ্বারা প্রমাণিত হয়েছিল, যার অর্থ হল মূল ডেভেলপাররা ইথেরিয়াম চালু করার জন্য এটিকে অবিলম্বে বাস্তবায়ন করতে পারত। প্রুফ-অফ-স্টেককে এমন পর্যায়ে বিকশিত করতে আরও আট বছর সময় লেগেছিল যেখানে এটি বাস্তবায়ন করা যেতে পারে। + +এই পৃষ্ঠাটি ইথেরিয়ামের প্রুফ-অফ-ওয়ার্ক থেকে প্রুফ-অফ-স্টেকে পরিবর্তনের পেছনের যুক্তি এবং এর সাথে জড়িত ট্রেড-অফগুলি ব্যাখ্যা করে। + +## নিরাপত্তা {#security} + +ইথেরিয়াম গবেষকরা প্রুফ-অফ-ওয়ার্কের চেয়ে প্রুফ-অফ-স্টেককে বেশি সুরক্ষিত বলে মনে করেন। যাইহোক, এটি শুধুমাত্র সম্প্রতি আসল ইথেরিয়াম মেইননেটের জন্য প্রয়োগ করা হয়েছে এবং এটি প্রুফ-অফ-ওয়ার্কের চেয়ে কম সময়-পরীক্ষিত। নিম্নলিখিত বিভাগগুলিতে প্রুফ-অফ-ওয়ার্কের তুলনায় প্রুফ-অফ-স্টেকের নিরাপত্তা মডেলের সুবিধা এবং অসুবিধাগুলি নিয়ে আলোচনা করা হয়েছে। + +### আক্রমণের খরচ {#cost-to-attack} + +প্রুফ-অফ-স্টেকে, ভ্যালিডেটরদের একটি স্মার্ট কন্ট্র্যাক্টে কমপক্ষে 32 ETH এসক্রো ("স্টেক") করতে হয়। ভুল আচরণকারী ভ্যালিডেটরদের শাস্তি দিতে ইথেরিয়াম স্টেক করা ইথার ধ্বংস করতে পারে। কনসেন্সাসে পৌঁছানোর জন্য, মোট স্টেক করা ইথারের কমপক্ষে 66% একটি নির্দিষ্ট ব্লক সেটের পক্ষে ভোট দিতে হবে। স্টেক এর >=66% দ্বারা ভোট দেওয়া ব্লকগুলি "চূড়ান্ত" হয়ে যায়, যার অর্থ সেগুলি সরানো বা পুনর্গঠিত করা যাবে না। + +নেটওয়ার্কে আক্রমণ করার অর্থ হতে পারে চেইনকে চূড়ান্ত করা থেকে বিরত রাখা বা ক্যানোনিকাল চেইনে ব্লকগুলির একটি নির্দিষ্ট সংগঠন নিশ্চিত করা যা কোনোভাবে আক্রমণকারীকে উপকৃত করে। এর জন্য আক্রমণকারীকে হয় বিপুল পরিমাণ ইথার জমা করে সরাসরি ভোট দিয়ে বা সৎ ভ্যালিডেটরদের একটি নির্দিষ্ট উপায়ে ভোট দেওয়ার জন্য প্রতারণা করে সৎ কনসেন্সাসের পথ পরিবর্তন করতে হয়। সৎ ভ্যালিডেটরদেরকে প্রতারণা করে এমন পরিশীলিত, কম-সম্ভাব্য আক্রমণগুলি বাদ দিলে, ইথেরিয়ামকে আক্রমণ করার খরচ হল সেই স্টেকের খরচ যা একজন আক্রমণকারীকে তাদের পক্ষে কনসেন্সাসকে প্রভাবিত করার জন্য জমা করতে হবে। + +আক্রমণের সর্বনিম্ন খরচ হল মোট স্টেকের >33%। মোট স্টেকের >33% ধারণকারী একজন আক্রমণকারী কেবল অফলাইনে গিয়ে একটি ফাইনালিটি বিলম্বের কারণ হতে পারে। এটি নেটওয়ার্কের জন্য একটি তুলনামূলকভাবে ছোট সমস্যা কারণ এখানে "ইনঅ্যাকটিভিটি লিক" নামে পরিচিত একটি প্রক্রিয়া রয়েছে যা অফলাইন ভ্যালিডেটরদের থেকে স্টেক ফাঁস করে যতক্ষণ না অনলাইন সংখ্যাগরিষ্ঠ স্টেকের 66% প্রতিনিধিত্ব করে এবং চেইনটিকে আবার চূড়ান্ত করতে পারে। তাত্ত্বিকভাবে একজন আক্রমণকারীর পক্ষে মোট স্টেকের 33%-এর সামান্য বেশি দিয়ে দ্বিগুণ ফাইনালিটি ঘটানোও সম্ভব, যখন তাদের ব্লক প্রযোজক হতে বলা হয় তখন একটির পরিবর্তে দুটি ব্লক তৈরি করে এবং তারপর তাদের সমস্ত ভ্যালিডেটরদের সাথে দ্বিগুণ-ভোট দিয়ে। প্রতিটি ফর্কের জন্য শুধুমাত্র অবশিষ্ট সৎ ভ্যালিডেটরদের 50%-কে প্রথমে প্রতিটি ব্লক দেখতে হবে, তাই যদি তারা তাদের বার্তাগুলিকে ঠিক সময়ে পরিচালনা করতে পারে, তবে তারা উভয় ফর্ককেই চূড়ান্ত করতে সক্ষম হতে পারে। এটির সফলতার সম্ভাবনা কম, কিন্তু যদি একজন আক্রমণকারী ডাবল-ফাইনালিটি ঘটাতে সক্ষম হয়, তাহলে ইথেরিয়াম সম্প্রদায়কে একটি ফর্ক অনুসরণ করার সিদ্ধান্ত নিতে হবে, সেক্ষেত্রে আক্রমণকারীর ভ্যালিডেটরদের অন্যটিতে স্ল্যাশ করা হবে। + +মোট স্টেকের >33% দিয়ে, একজন আক্রমণকারীর ইথেরিয়াম নেটওয়ার্কে একটি ছোট (ফাইনালিটি বিলম্ব) বা আরও গুরুতর (ডাবল ফাইনালিটি) প্রভাব ফেলার সুযোগ থাকে। নেটওয়ার্কে 14,000,000-এর বেশি ETH স্টেক করা এবং $1000/ETH-এর একটি প্রতিনিধি মূল্যের সাথে, এই আক্রমণগুলি মাউন্ট করার জন্য সর্বনিম্ন খরচ হল `1000 x 14,000,000 x 0.33 = $4,620,000,000`। আক্রমণকারী স্ল্যাশিংয়ের মাধ্যমে এই অর্থ হারাবে এবং নেটওয়ার্ক থেকে বের হয়ে যাবে। আবার আক্রমণ করার জন্য, তাদের স্টেকের >33% (আবার) জমা করতে হবে এবং তা পুড়িয়ে ফেলতে হবে (আবার)। নেটওয়ার্কে আক্রমণ করার প্রতিটি প্রচেষ্টায় >$4.6 বিলিয়ন খরচ হবে ($1000/ETH এবং 14M ETH স্টেক করা অবস্থায়)। আক্রমণকারীকে যখন স্ল্যাশ করা হয় তখন নেটওয়ার্ক থেকে বের করে দেওয়া হয় এবং পুনরায় যোগদানের জন্য তাদের একটি অ্যাক্টিভেশন কিউতে যোগ দিতে হয়। এর মানে হল যে একটি পুনরাবৃত্ত আক্রমণের হার শুধুমাত্র সেই হারের মধ্যে সীমাবদ্ধ নয় যে হারে আক্রমণকারী মোট স্টেকের >33% জমা করতে পারে বরং তাদের সমস্ত ভ্যালিডেটরদের নেটওয়ার্কে অনবোর্ড করতে যে সময় লাগে তার দ্বারাও সীমাবদ্ধ। প্রতিবার আক্রমণকারী আক্রমণ করার সময়, তারা অনেক বেশি দরিদ্র হয়ে যায়, এবং ফলস্বরূপ সরবরাহ ধাক্কার জন্য সম্প্রদায়ের বাকিরা আরও ধনী হয়। + +অন্যান্য আক্রমণ, যেমন 51% আক্রমণ বা মোট স্টেকের 66% সহ ফাইনালিটি রিভার্সন, এর জন্য যথেষ্ট বেশি ETH প্রয়োজন এবং আক্রমণকারীর জন্য অনেক বেশি ব্যয়বহুল। + +প্রুফ-অফ-ওয়ার্ক-এর সাথে এর তুলনা করুন। প্রুফ-অফ-ওয়ার্ক ইথেরিয়ামে একটি আক্রমণ শুরু করার খরচ ছিল ধারাবাহিকভাবে মোট নেটওয়ার্ক হ্যাস রেটের >50% মালিকানার খরচ। ধারাবাহিকভাবে প্রুফ-অফ-ওয়ার্ক সমাধানগুলি গণনা করার জন্য অন্যান্য মাইনারদের ছাড়িয়ে যাওয়ার জন্য পর্যাপ্ত কম্পিউটিং পাওয়ারের হার্ডওয়্যার এবং চলমান খরচের পরিমাণ ছিল এটি। ইথেরিয়াম বেশিরভাগই ASIC-এর পরিবর্তে GPU ব্যবহার করে মাইন করা হয়েছিল, যা খরচ কমিয়েছিল (যদিও ইথেরিয়াম যদি প্রুফ-অফ-ওয়ার্কে থাকত, তাহলে ASIC মাইনিং আরও জনপ্রিয় হয়ে উঠতে পারত)। একজন প্রতিপক্ষকে একটি প্রুফ-অফ-ওয়ার্ক ইথেরিয়াম নেটওয়ার্কে আক্রমণ করার জন্য প্রচুর হার্ডওয়্যার ক্রয় করতে হবে এবং এটি চালানোর জন্য বিদ্যুতের জন্য অর্থ প্রদান করতে হবে, তবে মোট খরচ একটি আক্রমণ শুরু করার জন্য পর্যাপ্ত ETH জমা করার জন্য প্রয়োজনীয় খরচের চেয়ে কম হবে। একটি 51% আক্রমণ প্রুফ-অফ-স্টেকের চেয়ে প্রুফ-অফ-ওয়ার্কে ~[20x কম](https://youtu.be/1m12zgJ42dI?t=1562) ব্যয়বহুল। যদি আক্রমণটি শনাক্ত করা হয় এবং তাদের পরিবর্তনগুলি অপসারণের জন্য চেইনটি হার্ড-ফর্ক করা হয়, তাহলে আক্রমণকারী বারবার একই হার্ডওয়্যার ব্যবহার করে নতুন ফর্কটিকে আক্রমণ করতে পারে। + +### জটিলতা {#complexity} + +প্রুফ-অফ-স্টেক প্রুফ-অফ-ওয়ার্কের চেয়ে অনেক বেশি জটিল। এটি প্রুফ-অফ-ওয়ার্ক-এর পক্ষে একটি পয়েন্ট হতে পারে কারণ সহজ প্রোটোকলগুলিতে ঘটনাক্রমে বাগ বা অনিচ্ছাকৃত প্রভাবগুলি প্রবর্তন করা কঠিন। যাইহোক, বছরের পর বছর গবেষণা ও উন্নয়ন, সিমুলেশন এবং টেস্টনেট বাস্তবায়নের মাধ্যমে জটিলতাকে দমন করা হয়েছে। প্রুফ-অফ-স্টেক প্রোটোকলটি পাঁচটি পৃথক দল দ্বারা (এক্সিকিউশন এবং কনসেন্সাস লেয়ারের প্রত্যেকটিতে) পাঁচটি প্রোগ্রামিং ভাষায় স্বাধীনভাবে প্রয়োগ করা হয়েছে, যা ক্লায়েন্ট বাগগুলির বিরুদ্ধে স্থিতিস্থাপকতা প্রদান করে। + +প্রুফ-অফ-স্টেক কনসেন্সাস লজিককে নিরাপদে বিকাশ এবং পরীক্ষা করার জন্য, ইথেরিয়াম মেইননেটে প্রুফ-অফ-স্টেক প্রয়োগ করার দুই বছর আগে বিকন চেইন চালু করা হয়েছিল। বিকন চেইন প্রুফ-অফ-স্টেক পরীক্ষার জন্য একটি স্যান্ডবক্স হিসাবে কাজ করেছিল, কারণ এটি একটি লাইভ ব্লকচেইন ছিল যা প্রুফ-অফ-স্টেক কনসেন্সাস লজিক প্রয়োগ করে কিন্তু আসল ইথেরিয়াম লেনদেনগুলিকে স্পর্শ না করে - কার্যকরভাবে কেবল নিজের উপর কনসেন্সাসে আসে। একবার এটি পর্যাপ্ত সময়ের জন্য স্থিতিশীল এবং বাগ-মুক্ত হয়ে গেলে, বিকন চেইনটিকে ইথেরিয়াম মেইননেটের সাথে "মার্জ" করা হয়েছিল। এই সবগুলি প্রুফ-অফ-স্টেকের জটিলতাকে এমন পর্যায়ে নিয়ন্ত্রণ করতে অবদান রেখেছে যে অনিচ্ছাকৃত পরিণতি বা ক্লায়েন্ট বাগের ঝুঁকি খুব কম ছিল। + +### আক্রমণের ক্ষেত্র {#attack-surface} + +প্রুফ-অফ-স্টেক প্রুফ-অফ-ওয়ার্কের চেয়ে বেশি জটিল, যার অর্থ হল পরিচালনা করার জন্য আরও সম্ভাব্য আক্রমণ ভেক্টর রয়েছে। ক্লায়েন্টদের সংযোগকারী একটি পিয়ার-টু-পিয়ার নেটওয়ার্কের পরিবর্তে, দুটি রয়েছে, প্রতিটি একটি পৃথক প্রোটোকল বাস্তবায়ন করে। প্রতিটি স্লটে একটি ব্লক প্রস্তাব করার জন্য একটি নির্দিষ্ট ভ্যালিডেটর আগে থেকে নির্বাচন করা ডিনায়েল-অফ-সার্ভিসের সম্ভাবনা তৈরি করে যেখানে বিপুল পরিমাণ নেটওয়ার্ক ট্র্যাফিক সেই নির্দিষ্ট ভ্যালিডেটরকে অফলাইনে নিয়ে যায়। + +এমন উপায়ও রয়েছে যে আক্রমণকারীরা তাদের ব্লক বা অ্যাটাস্টেশনগুলির মুক্তির সময় সাবধানে নির্ধারণ করতে পারে যাতে সেগুলি সৎ নেটওয়ার্কের একটি নির্দিষ্ট অনুপাত দ্বারা প্রাপ্ত হয়, যা তাদের নির্দিষ্ট উপায়ে ভোট দিতে প্রভাবিত করে। অবশেষে, একজন আক্রমণকারী কেবল স্টেক করার জন্য পর্যাপ্ত ETH জমা করতে পারে এবং কনসেন্সাস মেকানিজমে আধিপত্য বিস্তার করতে পারে। এই প্রতিটি [আক্রমণ ভেক্টরের সাথে যুক্ত প্রতিরক্ষা রয়েছে](/developers/docs/consensus-mechanisms/pos/attack-and-defense), কিন্তু প্রুফ-অফ-ওয়ার্কের অধীনে রক্ষা করার জন্য তাদের অস্তিত্ব নেই। + +## বিকেন্দ্রীকরণ {#decentralization} + +প্রুফ-অফ-স্টেক প্রুফ-অফ-ওয়ার্কের চেয়ে বেশি বিকেন্দ্রীভূত কারণ মাইনিং হার্ডওয়্যার অস্ত্র প্রতিযোগিতা ব্যক্তি এবং ছোট সংস্থাগুলিকে মূল্যহীন করে তোলে। যদিও যে কেউ প্রযুক্তিগতভাবে পরিমিত হার্ডওয়্যার দিয়ে মাইনিং শুরু করতে পারে, প্রাতিষ্ঠানিক মাইনিং অপারেশনের তুলনায় তাদের কোনো পুরস্কার পাওয়ার সম্ভাবনা খুবই কম। প্রুফ-অফ-স্টেকের সাথে, স্টেকিংয়ের খরচ এবং সেই স্টেকের উপর শতাংশ রিটার্ন সবার জন্য একই। বর্তমানে একটি ভ্যালিডেটর চালাতে 32 ETH খরচ হয়। + +অন্যদিকে, লিকুইড স্টেকিং ডেরিভেটিভের উদ্ভাবন কেন্দ্রীকরণের উদ্বেগ সৃষ্টি করেছে কারণ কয়েকটি বড় প্রদানকারী বিপুল পরিমাণে স্টেক করা ETH পরিচালনা করে। এটি সমস্যাযুক্ত এবং যত তাড়াতাড়ি সম্ভব সংশোধন করা প্রয়োজন, তবে এটি দেখতে যতটা সহজ তার চেয়েও বেশি সূক্ষ্ম। কেন্দ্রীভূত স্টেকিং প্রদানকারীদের অগত্যা ভ্যালিডেটরদের উপর কেন্দ্রীভূত নিয়ন্ত্রণ থাকে না - প্রায়শই এটি ETH-এর একটি কেন্দ্রীয় পুল তৈরি করার একটি উপায় যা অনেক স্বাধীন নোড অপারেটর প্রতিটি অংশগ্রহণকারীর নিজের 32 ETH প্রয়োজন ছাড়াই স্টেক করতে পারে। + +ইথেরিয়ামের জন্য সেরা বিকল্প হল ভ্যালিডেটরগুলিকে বাড়ির কম্পিউটারে স্থানীয়ভাবে চালানো, যা বিকেন্দ্রীকরণকে সর্বাধিক করে। এই কারণেই ইথেরিয়াম এমন পরিবর্তনগুলিকে প্রতিরোধ করে যা একটি নোড/ভ্যালিডেটর চালানোর জন্য হার্ডওয়্যার প্রয়োজনীয়তা বাড়ায়। + +## স্থায়িত্ব {#sustainability} + +প্রুফ-অফ-স্টেক হল ব্লকচেইন সুরক্ষিত করার একটি কার্বন-সস্তা উপায়। প্রুফ-অফ-ওয়ার্ক-এর অধীনে মাইনাররা একটি ব্লক মাইন করার অধিকারের জন্য প্রতিযোগিতা করে। মাইনাররা যখন দ্রুত গণনা করতে পারে তখন তারা আরও সফল হয়, যা হার্ডওয়্যার এবং শক্তি খরচে বিনিয়োগকে উৎসাহিত করে। প্রুফ-অফ-স্টেকে স্যুইচ করার আগে ইথেরিয়ামের জন্য এটি পরিলক্ষিত হয়েছিল। প্রুফ-অফ-স্টেকে রূপান্তরের কিছুক্ষণ আগে, ইথেরিয়াম প্রায় 78 TWh/বছর ব্যবহার করছিল - যা একটি ছোট দেশের সমান। যাইহোক, প্রুফ-অফ-স্টেকে স্যুইচ করা এই শক্তি ব্যয়কে ~99.98% কমিয়েছে। প্রুফ-অফ-স্টেক ইথেরিয়ামকে একটি শক্তি-দক্ষ, কম কার্বন প্ল্যাটফর্ম তৈরি করেছে। + +[ইথেরিয়ামের শক্তি খরচ সম্পর্কে আরও](/energy-consumption) + +## ইস্যুয়েন্স {#issuance} + +প্রুফ-অফ-স্টেক ইথেরিয়াম প্রুফ-অফ-ওয়ার্ক ইথেরিয়ামের চেয়ে অনেক কম কয়েন ইস্যু করে তার নিরাপত্তার জন্য অর্থ প্রদান করতে পারে কারণ ভ্যালিডেটরদের উচ্চ বিদ্যুৎ খরচ দিতে হয় না। ফলস্বরূপ, যখন বিপুল পরিমাণ ETH পুড়িয়ে ফেলা হয় তখন ETH তার মুদ্রাস্ফীতি কমাতে পারে বা এমনকি মুদ্রাসংকোচনকারী হয়ে উঠতে পারে। কম মুদ্রাস্ফীতির মাত্রা মানে ইথেরিয়ামের নিরাপত্তা প্রুফ-অফ-ওয়ার্কের অধীনে যা ছিল তার চেয়ে সস্তা। + +## আপনি কি দেখে শিখতে বেশি পছন্দ করেন? {#visual-learner} + +জাস্টিন ড্রেক-কে প্রুফ-অফ-ওয়ার্কের উপর প্রুফ-অফ-স্টেকের সুবিধাগুলি ব্যাখ্যা করতে দেখুন: + + + +## আরও পড়ুন {#further-reading} + +- [Vitalik-এর প্রুফ-অফ-স্টেক ডিজাইন দর্শন](https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51) +- [Vitalik-এর প্রুফ-অফ-স্টেক প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী](https://vitalik.eth.limo/general/2017/12/31/pos_faq.html#what-is-proof-of-stake) +- [PoS বনাম PoW-এর উপর "সিম্পলি এক্সপ্লেইনড" ভিডিও](https://www.youtube.com/watch?v=M3EFi_POhps) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md new file mode 100644 index 00000000000..c99abcb2c09 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/rewards-and-penalties/index.md @@ -0,0 +1,91 @@ +--- +title: "প্রুফ-অফ-স্টেক রিওয়ার্ডস এবং পেনাল্টি" +description: "প্রুফ-অফ-স্টেক ইথেরিয়ামে ইন-প্রটোকল ইনসেন্টিভ সম্পর্কে জানুন।" +lang: bn +--- + +ইথেরিয়াম তার নিজস্ব ক্রিপ্টোকারেন্সি, ইথার (ETH) ব্যবহার করে সুরক্ষিত থাকে। যে নোড অপারেটররা ব্লক ভ্যালিডেট করতে এবং চেইনের হেড শনাক্ত করতে অংশগ্রহণ করতে ইচ্ছুক, তারা ইথেরিয়ামে [ডিপোজিট কন্ট্রাক্ট](/staking/deposit-contract/)-এ ইথার জমা করে। এরপর তাদেরকে ভ্যালিডেটর সফটওয়্যার চালানোর জন্য ইথারে অর্থ প্রদান করা হয়, যা পিয়ার-টু-পিয়ার নেটওয়ার্কের মাধ্যমে প্রাপ্ত নতুন ব্লকের বৈধতা পরীক্ষা করে এবং চেইনের হেড শনাক্ত করার জন্য ফর্ক-চয়েস অ্যালগরিদম প্রয়োগ করে। + +একজন ভ্যালিডেটরের দুটি প্রধান ভূমিকা রয়েছে: ১) নতুন ব্লক পরীক্ষা করা এবং যদি সেগুলি বৈধ হয় তবে সেগুলিতে “অ্যাটেস্ট” করা, ২) মোট ভ্যালিডেটর পুল থেকে র‍্যান্ডমভাবে নির্বাচিত হলে নতুন ব্লক প্রস্তাব করা। যদি ভ্যালিডেটরকে বলা হলে এই কাজগুলির কোনোটি করতে ব্যর্থ হয়, তবে তারা একটি ইথার পেআউট থেকে বঞ্চিত হয়। ভ্যালিডেটরদের কখনও কখনও সিগনেচার অ্যাগ্রিগেশন এবং সিঙ্ক কমিটিতে অংশগ্রহণের দায়িত্বও দেওয়া হয়। + +এমন কিছু কাজও আছে যা দুর্ঘটনাক্রমে করা খুব কঠিন এবং কিছু दुर्भावनाপূর্ণ উদ্দেশ্য নির্দেশ করে, যেমন একই স্লটের জন্য একাধিক ব্লক প্রস্তাব করা বা একই স্লটের জন্য একাধিক ব্লকে অ্যাটেস্ট করা। এগুলো হলো “স্ল্যাশেবল” আচরণ, যার ফলে ভ্যালিডেটরকে নেটওয়ার্ক থেকে সরিয়ে দেওয়ার আগে কিছু পরিমাণ ইথার (১ ETH পর্যন্ত) বার্ন করা হয়, যা ৩৬ দিন সময় নেয়। স্ল্যাশড ভ্যালিডেটরের ইথার এক্সিট পিরিয়ড জুড়ে ধীরে ধীরে শেষ হয়ে যায়, কিন্তু ১৮তম দিনে তারা একটি “কোরিলেশন পেনাল্টি” পায়, যা একই সময়ে আরও বেশি ভ্যালিডেটর স্ল্যাশড হলে বড় হয়। কনসেন্সাস মেকানিজমের ইনসেনটিভ কাঠামো তাই সততার জন্য পুরস্কৃত করে এবং খারাপ অ্যাক্টরদের শাস্তি দেয়। + +সমস্ত রিওয়ার্ড এবং পেনাল্টি প্রতি ইপোকে একবার প্রয়োগ করা হয়। + +আরও বিস্তারিত জানতে পড়তে থাকুন... + +## রিওয়ার্ড এবং পেনাল্টি {#rewards} + +### পুরস্কার {#rewards} + +ভ্যালিডেটররা যখন অন্য ভ্যালিডেটরদের সংখ্যাগরিষ্ঠের সাথে সামঞ্জস্যপূর্ণ ভোট দেয়, যখন তারা ব্লক প্রস্তাব করে এবং যখন তারা সিঙ্ক কমিটিতে অংশগ্রহণ করে তখন তারা রিওয়ার্ড পায়। প্রতিটি ইপোকে রিওয়ার্ডের মান একটি `base_reward` থেকে গণনা করা হয়। এটি সেই বেস ইউনিট যা থেকে অন্যান্য রিওয়ার্ড গণনা করা হয়। `base_reward` একজন ভ্যালিডেটরের দ্বারা প্রতি ইপোকে অনুকূল পরিস্থিতিতে প্রাপ্ত গড় রিওয়ার্ডকে উপস্থাপন করে। এটি ভ্যালিডেটরের কার্যকরী ব্যালেন্স এবং সক্রিয় ভ্যালিডেটরের মোট সংখ্যা থেকে নিম্নরূপ গণনা করা হয়: + +``` +base_reward = effective_balance * (base_reward_factor / (base_rewards_per_epoch * sqrt(sum(active_balance)))) +``` + +যেখানে `base_reward_factor` হল 64, `base_rewards_per_epoch` হল 4 এবং `sum(active balance)` হল সমস্ত সক্রিয় ভ্যালিডেটর জুড়ে মোট স্টেক করা ইথার। + +এর মানে হল বেস রিওয়ার্ড ভ্যালিডেটরের কার্যকরী ব্যালেন্সের সমানুপাতিক এবং নেটওয়ার্কে ভ্যালিডেটরের সংখ্যার ব্যস্তানুপাতিক। যত বেশি ভ্যালিডেটর, সামগ্রিক ইস্যুয়েন্স তত বেশি (`sqrt(N)` হিসাবে), কিন্তু প্রতি ভ্যালিডেটরের জন্য `base_reward` তত কম (`1/sqrt(N)` হিসাবে)। এই ফ্যাক্টরগুলো একটি স্টেকিং নোডের জন্য APR-কে প্রভাবিত করে। এর যৌক্তিকতা [Vitalik's notes](https://notes.ethereum.org/@vbuterin/rkhCgQteN?type=view#Base-rewards)-এ পড়ুন। + +মোট রিওয়ার্ড তখন পাঁচটি উপাদানের যোগফল হিসাবে গণনা করা হয়, যার প্রত্যেকটির একটি ওয়েটিং আছে যা নির্ধারণ করে প্রতিটি উপাদান মোট রিওয়ার্ডে কতটা যোগ করবে। উপাদানগুলো হলো: + +``` +1. সোর্স ভোট: ভ্যালিডেটর সঠিক সোর্স চেকপয়েন্টের জন্য সময়মতো ভোট দিয়েছে +2. টার্গেট ভোট: ভ্যালিডেটর সঠিক টার্গেট চেকপয়েন্টের জন্য সময়মতো ভোট দিয়েছে +3. হেড ভোট: ভ্যালিডেটর সঠিক হেড ব্লকের জন্য সময়মতো ভোট দিয়েছে +4. সিঙ্ক কমিটি রিওয়ার্ড: ভ্যালিডেটর একটি সিঙ্ক কমিটিতে অংশগ্রহণ করেছে +5. প্রোপোজার রিওয়ার্ড: ভ্যালিডেটর সঠিক স্লটে একটি ব্লক প্রস্তাব করেছে +``` + +প্রতিটি উপাদানের জন্য ওয়েটিংগুলি নিম্নরূপ: + +``` +TIMELY_SOURCE_WEIGHT uint64(14) +TIMELY_TARGET_WEIGHT uint64(26) +TIMELY_HEAD_WEIGHT uint64(14) +SYNC_REWARD_WEIGHT uint64(2) +PROPOSER_WEIGHT uint64(8) +``` + +এই ওয়েটগুলোর যোগফল 64। রিওয়ার্ডটি প্রযোজ্য ওয়েটগুলোর যোগফলকে 64 দ্বারা ভাগ করে গণনা করা হয়। একজন ভ্যালিডেটর যিনি সময়মত সোর্স, টার্গেট এবং হেড ভোট দিয়েছেন, একটি ব্লক প্রস্তাব করেছেন এবং একটি সিঙ্ক কমিটিতে অংশগ্রহণ করেছেন, তিনি `64/64 * base_reward == base_reward` পেতে পারেন। তবে, একজন ভ্যালিডেটর সাধারণত ব্লক প্রোপোজার হন না, তাই তাদের সর্বোচ্চ রিওয়ার্ড হলো `64-8 /64 * base_reward == 7/8 * base_reward`। যে ভ্যালিডেটররা ব্লক প্রোপোজার বা সিঙ্ক কমিটিতে নেই তারা `64-8-2 / 64 * base_reward == 6.75/8 * base_reward` পেতে পারে। + +দ্রুত অ্যাটেস্টেশনকে উৎসাহিত করতে একটি অতিরিক্ত রিওয়ার্ড যোগ করা হয়। এটি হলো `inclusion_delay_reward`। এর মান `base_reward`-কে `1/delay` দ্বারা গুণ করার সমান, যেখানে `delay` হলো ব্লক প্রস্তাবনা এবং অ্যাটেস্টেশনকে পৃথককারী স্লটের সংখ্যা। উদাহরণস্বরূপ, যদি অ্যাটেস্টেশনটি ব্লক প্রস্তাবনার এক স্লটের মধ্যে জমা দেওয়া হয়, তবে অ্যাটেস্টর `base_reward * 1/1 == base_reward` পাবেন। যদি অ্যাটেস্টেশনটি পরবর্তী স্লটে আসে, তবে অ্যাটেস্টর `base_reward * 1/2` পাবেন এবং এভাবেই চলতে থাকবে। + +ব্লক প্রোপোজাররা ব্লকে অন্তর্ভুক্ত **প্রতিটি বৈধ অ্যাটেস্টেশনের** জন্য `8 / 64 * base_reward` পায়, তাই রিওয়ার্ডের প্রকৃত মান অ্যাটেস্টিং ভ্যালিডেটরের সংখ্যার সাথে স্কেল করে। ব্লক প্রোপোজাররা তাদের প্রস্তাবিত ব্লকে অন্যান্য ভ্যালিডেটরদের অসদাচরণের প্রমাণ অন্তর্ভুক্ত করে তাদের রিওয়ার্ড বাড়াতে পারে। এই রিওয়ার্ডগুলো হলো সেই "প্রোৎসাহন" যা ভ্যালিডেটরদের সততাকে উৎসাহিত করে। একজন ব্লক প্রোপোজার যিনি স্ল্যাশিং অন্তর্ভুক্ত করবেন তাকে `slashed_validators_effective_balance / 512` দিয়ে পুরস্কৃত করা হবে। + +### পেনাল্টি {#penalties} + +এখন পর্যন্ত আমরা নিখুঁতভাবে সুশৃঙ্খল ভ্যালিডেটরদের বিবেচনা করেছি, কিন্তু সেই ভ্যালিডেটরদের কী হবে যারা সময়মত হেড, সোর্স এবং টার্গেট ভোট দেয় না বা ধীরে ধীরে করে? + +টার্গেট এবং সোর্স ভোট মিস করার জন্য পেনাল্টি সেই রিওয়ার্ডের সমান যা অ্যাটেস্টর পেত যদি তারা সেগুলি জমা দিত। এর মানে হল তাদের ব্যালেন্সে রিওয়ার্ড যোগ করার পরিবর্তে, তাদের ব্যালেন্স থেকে একটি সমান মূল্য সরানো হয়। হেড ভোট মিস করার জন্য কোনো পেনাল্টি নেই (অর্থাৎ, হেড ভোটের জন্য শুধুমাত্র রিওয়ার্ড দেওয়া হয়, কখনও পেনাল্টি দেওয়া হয় না)। `inclusion_delay`-এর সাথে সম্পর্কিত কোনো পেনাল্টি নেই - রিওয়ার্ডটি কেবল ভ্যালিডেটরের ব্যালেন্সে যোগ করা হবে না। একটি ব্লক প্রস্তাব করতে ব্যর্থ হওয়ার জন্যও কোনো পেনাল্টি নেই। + +[কনসেন্সাস স্পেকস](https://github.com/ethereum/consensus-specs/blob/dev/specs/altair/beacon-chain.md)-এ রিওয়ার্ড এবং পেনাল্টি সম্পর্কে আরও পড়ুন। Bellatrix আপগ্রেডে রিওয়ার্ড এবং পেনাল্টি সমন্বয় করা হয়েছিল - ড্যানি রায়ান এবং ভিটালিককে এই [Peep an EIP ভিডিও](https://www.youtube.com/watch?v=iaAEGs1DMgQ)-তে এটি নিয়ে আলোচনা করতে দেখুন। + +## স্ল্যাশিং {#slashing} + +স্ল্যাশিং একটি আরও গুরুতর পদক্ষেপ যার ফলে নেটওয়ার্ক থেকে একজন ভ্যালিডেটরকে জোরপূর্বক অপসারণ করা হয় এবং তাদের স্টেক করা ইথারের ক্ষতি হয়। একজন ভ্যালিডেটরকে তিনভাবে স্ল্যাশড করা যেতে পারে, যার সবই ব্লকের অসৎ প্রস্তাবনা বা অ্যাটেস্টেশনের সামিল: + +- একই স্লটের জন্য দুটি ভিন্ন ব্লক প্রস্তাব ও স্বাক্ষর করার মাধ্যমে +- এমন একটি ব্লকে অ্যাটেস্ট করার মাধ্যমে যা অন্য একটিকে "ঘিরে রাখে" (কার্যকরভাবে ইতিহাস পরিবর্তন করা) +- একই ব্লকের জন্য দুটি ক্যান্ডিডেটে অ্যাটেস্ট করার মাধ্যমে "ডাবল ভোটিং" করা + +যদি এই কাজগুলি সনাক্ত করা হয়, ভ্যালিডেটরকে স্ল্যাশড করা হয়। এর মানে হলো একজন 32 ETH ভ্যালিডেটরের জন্য তাৎক্ষণিকভাবে 0.0078125 বার্ন করা হয় (সক্রিয় ব্যালেন্সের সাথে রৈখিকভাবে স্কেল করা হয়), তারপর একটি 36 দিনের অপসারণ সময়কাল শুরু হয়। এই অপসারণ সময়কালে ভ্যালিডেটরের স্টেক ধীরে ধীরে কমে যায়। মধ্যবর্তী সময়ে (দিন ১৮) একটি অতিরিক্ত পেনাল্টি প্রয়োগ করা হয় যার মাত্রা স্ল্যাশিং ইভেন্টের আগের ৩৬ দিনে সমস্ত স্ল্যাশড ভ্যালিডেটরের মোট স্টেক করা ইথারের সাথে স্কেল করে। এর মানে হল যখন আরও বেশি ভ্যালিডেটর স্ল্যাশড হয়, তখন স্ল্যাশের মাত্রা বৃদ্ধি পায়। সর্বোচ্চ স্ল্যাশ হলো সমস্ত স্ল্যাশড ভ্যালিডেটরের সম্পূর্ণ কার্যকরী ব্যালেন্স (অর্থাৎ, যদি অনেক ভ্যালিডেটর স্ল্যাশড হতে থাকে তবে তারা তাদের সম্পূর্ণ স্টেক হারাতে পারে)। অন্যদিকে, একটি একক, বিচ্ছিন্ন স্ল্যাশিং ইভেন্ট শুধুমাত্র ভ্যালিডেটরের স্টেকের একটি ছোট অংশ বার্ন করে। স্ল্যাশড ভ্যালিডেটরের সংখ্যার সাথে স্কেল করা এই মধ্যবর্তী পেনাল্টিকে "কোরিলেশন পেনাল্টি" বলা হয়। + +## ইনঅ্যাক্টিভিটি লিক {#inactivity-leak} + +যদি কনসেন্সাস লেয়ার চূড়ান্ত না করে চারটির বেশি ইপোক পার করে, তাহলে "ইনঅ্যাক্টিভিটি লিক" নামক একটি জরুরি প্রোটোকল সক্রিয় করা হয়। ইনঅ্যাক্টিভিটি লিকের চূড়ান্ত লক্ষ্য হল চেইনকে ফাইনালিটি পুনরুদ্ধারের জন্য প্রয়োজনীয় শর্ত তৈরি করা। উপরে যেমন ব্যাখ্যা করা হয়েছে, ফাইনালিটির জন্য সোর্স এবং টার্গেট চেকপয়েন্টগুলিতে সম্মত হতে মোট স্টেক করা ইথারের ২/৩ সংখ্যাগরিষ্ঠতা প্রয়োজন। যদি মোট ভ্যালিডেটরের ১/৩ এর বেশি প্রতিনিধিত্বকারী ভ্যালিডেটররা অফলাইন হয়ে যায় বা সঠিক অ্যাটেস্টেশন জমা দিতে ব্যর্থ হয়, তাহলে ২/৩ সুপারম্যাজরিটির পক্ষে চেকপয়েন্ট চূড়ান্ত করা সম্ভব নয়। ইনঅ্যাক্টিভিটি লিক নিষ্ক্রিয় ভ্যালিডেটরদের স্টেক ধীরে ধীরে কমে যেতে দেয় যতক্ষণ না তারা মোট স্টেকের ১/৩ এর কম নিয়ন্ত্রণ করে, যা অবশিষ্ট সক্রিয় ভ্যালিডেটরদের চেইন চূড়ান্ত করতে দেয়। নিষ্ক্রিয় ভ্যালিডেটরদের পুল যতই বড় হোক না কেন, অবশিষ্ট সক্রিয় ভ্যালিডেটররা অবশেষে স্টেকের >২/৩ নিয়ন্ত্রণ করবে। স্টেকের ক্ষতি নিষ্ক্রিয় ভ্যালিডেটরদের যত তাড়াতাড়ি সম্ভব পুনরায় সক্রিয় হওয়ার জন্য একটি শক্তিশালী উৎসাহ! Medalla টেস্টনেটে একটি ইনঅ্যাক্টিভিটি লিকের পরিস্থিতি দেখা গিয়েছিল যখন < ৬৬% সক্রিয় ভ্যালিডেটর ব্লকচেইনের বর্তমান হেডের উপর কনসেন্সাসে আসতে সক্ষম হয়েছিল। ইনঅ্যাক্টিভিটি লিক সক্রিয় করা হয়েছিল এবং অবশেষে ফাইনালিটি পুনরুদ্ধার করা হয়েছিল! + +কনসেন্সাস মেকানিজমের রিওয়ার্ড, পেনাল্টি এবং স্ল্যাশিং ডিজাইন স্বতন্ত্র ভ্যালিডেটরদের সঠিকভাবে আচরণ করতে উৎসাহিত করে। তবে, এই ডিজাইনের পছন্দগুলি থেকে এমন একটি সিস্টেম উদ্ভূত হয় যা একাধিক ক্লায়েন্ট জুড়ে ভ্যালিডেটরদের সমান বন্টনকে দৃঢ়ভাবে উৎসাহিত করে এবং একক-ক্লায়েন্ট আধিপত্যকে দৃঢ়ভাবে নিরুৎসাহিত করা উচিত। + +## আরও পড়ুন {#further-reading} + +- [ইথেরিয়াম আপগ্রেড করা: ইনসেনটিভ লেয়ার](https://eth2book.info/altair/part2/incentives) +- [ইথেরিয়ামের হাইব্রিড ক্যাসপার প্রটোকলে ইনসেনটিভ](https://arxiv.org/pdf/1903.04205.pdf) +- [ভিটালিকের অ্যানোটেটেড স্পেক](https://github.com/ethereum/annotated-spec/blob/master/phase0/beacon-chain.md#rewards-and-penalties-1) +- [Eth2 স্ল্যাশিং প্রতিরোধের টিপস](https://medium.com/prysmatic-labs/eth2-slashing-prevention-tips-f6faa5025f50) +- [EIP-7251 এর অধীনে স্ল্যাশিং পেনাল্টির বিশ্লেষণ](https://ethresear.ch/t/slashing-penalty-analysis-eip-7251/16509) + +_সোর্স_ + +- _[https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/](https://benjaminion.xyz/eth2-annotated-spec/phase0/beacon-chain/)_ diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md new file mode 100644 index 00000000000..02347e1c55f --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/weak-subjectivity/index.md @@ -0,0 +1,39 @@ +--- +title: "দুর্বল বিষয়গততা" +description: "দুর্বল বিষয়গততার একটি ব্যাখ্যা এবং PoS ইথেরিয়ামে এর ভূমিকা।" +lang: bn +--- + +ব্লকচেইনে বিষয়গততা বলতে বর্তমান স্টেটে সম্মত হওয়ার জন্য সামাজিক তথ্যের উপর নির্ভরতাকে বোঝায়। একাধিক বৈধ ফর্ক থাকতে পারে যা নেটওয়ার্কের অন্যান্য সহকর্মীদের কাছ থেকে সংগৃহীত তথ্য অনুসারে বেছে নেওয়া হয়। এর বিপরীত হল বস্তুনিষ্ঠতা যা এমন চেইনগুলিকে বোঝায় যেখানে শুধুমাত্র একটি সম্ভাব্য বৈধ চেইন রয়েছে যা সমস্ত নোড তাদের কোডেড নিয়ম প্রয়োগ করে অগত্যা সম্মত হবে। দুর্বল বিষয়গততা নামে পরিচিত একটি তৃতীয় স্টেটও রয়েছে। এটি এমন একটি চেইনকে বোঝায় যা সামাজিকভাবে কিছু প্রাথমিক তথ্যের বীজ পুনরুদ্ধার করার পরে বস্তুনিষ্ঠভাবে অগ্রসর হতে পারে। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি বোঝার জন্য প্রথমে [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/)-এর মূল বিষয়গুলি বোঝা প্রয়োজন। + +## দুর্বল বিষয়গততা কোন সমস্যাগুলোর সমাধান করে? {#problems-ws-solves} + +প্রুফ-অফ-স্টেক ব্লকচেইনগুলোতে বিষয়গততা অন্তর্নিহিত কারণ একাধিক ফর্ক থেকে সঠিক চেইন নির্বাচন করা হয় ঐতিহাসিক ভোট গণনার মাধ্যমে। এটি ব্লকচেইনকে বিভিন্ন আক্রমণের ভেক্টরের সামনে উন্মোচিত করে, যার মধ্যে দীর্ঘ-পরিসরের আক্রমণও রয়েছে যেখানে চেইনের প্রথম দিকে অংশগ্রহণকারী নোডগুলো একটি বিকল্প ফর্ক বজায় রাখে যা তারা অনেক পরে তাদের নিজেদের সুবিধার জন্য প্রকাশ করে। বিকল্পভাবে, যদি 33% ভ্যালিডেটর তাদের স্টেক উত্তোলন করে কিন্তু ব্লক প্রত্যয়ন এবং উৎপাদন চালিয়ে যায়, তবে তারা একটি বিকল্প ফর্ক তৈরি করতে পারে যা ক্যানোনিকাল চেইনের সাথে বিরোধপূর্ণ। নতুন নোড বা যে নোডগুলো দীর্ঘ সময় ধরে অফলাইনে ছিল তারা হয়তো জানে না যে এই আক্রমণকারী ভ্যালিডেটররা তাদের তহবিল উত্তোলন করেছে, তাই আক্রমণকারীরা তাদের একটি ভুল চেইন অনুসরণ করার জন্য প্রতারণা করতে পারে। ইথেরিয়াম এই আক্রমণের ভেক্টরগুলোর সমাধান করতে পারে এমন সীমাবদ্ধতা আরোপ করে যা প্রক্রিয়ার বিষয়গত দিকগুলো — এবং ফলস্বরূপ আস্থার অনুমানগুলোকে — একেবারে ন্যূনতম পর্যায়ে নামিয়ে আনে। + +## দুর্বল বিষয়গততার চেকপয়েন্ট {#ws-checkpoints} + +প্রুফ-অফ-স্টেক ইথেরিয়ামে "দুর্বল বিষয়গততার চেকপয়েন্ট" ব্যবহার করে দুর্বল বিষয়গততা প্রয়োগ করা হয়। এগুলো হল স্টেট রুট যা নেটওয়ার্কের সমস্ত নোড ক্যানোনিকাল চেইনের অন্তর্গত বলে সম্মত হয়। এগুলো জেনেসিস ব্লকের মতো একই "সার্বজনীন সত্য" উদ্দেশ্য পরিবেশন করে, তবে এগুলো ব্লকচেইনে জেনেসিস অবস্থানে বসে না। ফর্ক চয়েস অ্যালগরিদম বিশ্বাস করে যে সেই চেকপয়েন্টে সংজ্ঞায়িত ব্লকচেইন স্টেট সঠিক এবং এটি সেই বিন্দু থেকে স্বাধীনভাবে এবং বস্তুনিষ্ঠভাবে চেইন যাচাই করে। চেকপয়েন্টগুলো "প্রত্যাবর্তন সীমা" হিসাবে কাজ করে কারণ দুর্বল-বিষয়গততার চেকপয়েন্টের আগে অবস্থিত ব্লকগুলো পরিবর্তন করা যায় না। এটি মেকানিজম ডিজাইনের অংশ হিসাবে দীর্ঘ-পরিসরের ফর্কগুলোকে অবৈধ হিসাবে সংজ্ঞায়িত করে দীর্ঘ-পরিসরের আক্রমণকে খর্ব করে। দুর্বল বিষয়গততার চেকপয়েন্টগুলো ভ্যালিডেটরদের উত্তোলন সময়ের চেয়ে কম দূরত্বে পৃথক করা হয়েছে তা নিশ্চিত করা হলে, এটি নিশ্চিত করে যে চেইন ফর্ক করা একজন ভ্যালিডেটর তাদের স্টেক উত্তোলন করার আগে কমপক্ষে একটি নির্দিষ্ট থ্রেশহোল্ড পরিমাণ স্ল্যাশড হবে এবং নতুন প্রবেশকারীদের সেইসব ভ্যালিডেটরদের দ্বারা ভুল ফর্কে প্রতারিত করা যাবে না যাদের স্টেক উত্তোলন করা হয়েছে। + +## দুর্বল বিষয়গততার চেকপয়েন্ট এবং চূড়ান্ত ব্লকগুলোর মধ্যে পার্থক্য {#difference-between-ws-and-finalized-blocks} + +চূড়ান্ত ব্লক এবং দুর্বল বিষয়গততার চেকপয়েন্টগুলো ইথেরিয়াম নোড দ্বারা ভিন্নভাবে বিবেচিত হয়। যদি একটি নোড দুটি প্রতিযোগী চূড়ান্ত ব্লক সম্পর্কে সচেতন হয়, তবে এটি দুটির মধ্যে দ্বিধান্বিত হয়ে যায় - এটির কাছে স্বয়ংক্রিয়ভাবে কোনটি ক্যানোনিকাল ফর্ক তা সনাক্ত করার কোনো উপায় থাকে না। এটি একটি কনসেন্সাস ব্যর্থতার লক্ষণ। বিপরীতে, একটি নোড তার দুর্বল বিষয়গততার চেকপয়েন্টের সাথে সাংঘর্ষিক যেকোনো ব্লককে কেবল প্রত্যাখ্যান করে। নোডের দৃষ্টিকোণ থেকে, দুর্বল বিষয়গততার চেকপয়েন্ট একটি পরম সত্যকে প্রতিনিধিত্ব করে যা তার সহকর্মীদের কাছ থেকে নতুন জ্ঞান দ্বারা ক্ষুণ্ন করা যায় না। + +## কতটা দুর্বল এই দুর্বলতা? {#how-weak-is-weak} + +ইথেরিয়ামের প্রুফ-অফ-স্টেকের বিষয়গত দিকটি হল সিঙ্ক করার জন্য একটি বিশ্বস্ত উৎস থেকে একটি সাম্প্রতিক স্টেট (দুর্বল বিষয়গততার চেকপয়েন্ট) এর প্রয়োজনীয়তা। একটি খারাপ দুর্বল বিষয়গততার চেকপয়েন্ট পাওয়ার ঝুঁকি খুব কম কারণ সেগুলো ব্লক এক্সপ্লোরার বা একাধিক নোডের মতো বিভিন্ন স্বাধীন পাবলিক উৎসের সাথে মিলিয়ে দেখা যেতে পারে। যাইহোক, যেকোনো সফ্টওয়্যার এপ্লিকেশন চালানোর জন্য সর্বদা কিছু মাত্রার আস্থার প্রয়োজন হয়, উদাহরণস্বরূপ, সফ্টওয়্যার ডেভেলপাররা সৎ সফ্টওয়্যার তৈরি করেছে এই বিশ্বাস রাখা। + +একটি দুর্বল বিষয়গততার চেকপয়েন্ট এমনকি ক্লায়েন্ট সফ্টওয়্যারের অংশ হিসাবেও আসতে পারে। তর্কসাপেক্ষে একজন আক্রমণকারী সফ্টওয়্যারের মধ্যে থাকা চেকপয়েন্টকে দূষিত করতে পারে এবং ঠিক ততটাই সহজে সফ্টওয়্যারটিকেই দূষিত করতে পারে। এই সমস্যার সমাধানের জন্য কোনো বাস্তব ক্রিপ্টো-অর্থনৈতিক পথ নেই, তবে ইথেরিয়ামে একাধিক স্বাধীন ক্লায়েন্ট টিম থাকার মাধ্যমে অবিশ্বস্ত ডেভেলপারদের প্রভাব কমানো হয়েছে, প্রতিটি টিম বিভিন্ন ভাষায় সমতুল্য সফ্টওয়্যার তৈরি করে, এবং সকলেরই একটি সৎ চেইন বজায় রাখার ক্ষেত্রে একটি নিহিত আগ্রহ রয়েছে। ব্লক এক্সপ্লোরারগুলো দুর্বল বিষয়গততার চেকপয়েন্ট বা অন্য কোথাও থেকে প্রাপ্ত চেকপয়েন্টগুলোকে একটি অতিরিক্ত উৎসের সাথে ক্রস-রেফারেন্স করার উপায়ও সরবরাহ করতে পারে। + +পরিশেষে, অন্যান্য নোড থেকে চেকপয়েন্টের জন্য অনুরোধ করা যেতে পারে; সম্ভবত অন্য একজন ইথেরিয়াম ব্যবহারকারী যিনি একটি সম্পূর্ণ নোড চালান, তিনি একটি চেকপয়েন্ট সরবরাহ করতে পারেন যা ভ্যালিডেটররা তারপর একটি ব্লক এক্সপ্লোরারের ডেটার সাথে যাচাই করতে পারে। সামগ্রিকভাবে, একটি দুর্বল বিষয়গততার চেকপয়েন্টের প্রদানকারীকে বিশ্বাস করা ক্লায়েন্ট ডেভেলপারদের বিশ্বাস করার মতোই সমস্যাযুক্ত হিসাবে বিবেচনা করা যেতে পারে। প্রয়োজনীয় সামগ্রিক বিশ্বাস কম। এটি লক্ষ করা গুরুত্বপূর্ণ যে এই বিবেচনাগুলো শুধুমাত্র সেই অত্যন্ত অসম্ভাব্য ঘটনাতেই গুরুত্বপূর্ণ হয়ে ওঠে যেখানে সংখ্যাগরিষ্ঠ ভ্যালিডেটর ব্লকচেইনের একটি বিকল্প ফর্ক তৈরি করার জন্য ষড়যন্ত্র করে। অন্য যেকোনো পরিস্থিতিতে, বেছে নেওয়ার জন্য শুধুমাত্র একটি ইথেরিয়াম চেইন রয়েছে। + +## আরও পড়ুন {#further-reading} + +- [Eth2-তে দুর্বল বিষয়গততা](https://notes.ethereum.org/@adiasg/weak-subjectvity-eth2) +- [ভিটালিক: আমি কীভাবে দুর্বল বিষয়গততাকে ভালোবাসতে শিখলাম](https://blog.ethereum.org/2014/11/25/proof-stake-learned-love-weak-subjectivity/) +- [দুর্বল বিষয়গততা (Teku ডক্স)](https://docs.teku.consensys.io/concepts/weak-subjectivity) +- [ফেজ-0 দুর্বল বিষয়গততা নির্দেশিকা](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/weak-subjectivity.md) +- [ইথেরিয়াম 2.0-তে দুর্বল বিষয়গততার বিশ্লেষণ](https://github.com/runtimeverification/beacon-chain-verification/blob/master/weak-subjectivity/weak-subjectivity-analysis.pdf) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md new file mode 100644 index 00000000000..8028bab3fb1 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pos/withdrawal-credentials/index.md @@ -0,0 +1,64 @@ +--- +title: "উইথড্রয়াল ক্রেডেনশিয়াল" +description: "ভ্যালিডেটর উইথড্রল ক্রেডেনশিয়াল প্রকারের (0x00, 0x01, 0x02) একটি ব্যাখ্যা এবং ইথেরিয়াম স্ট্যাকারদের জন্য তাদের প্রভাব।" +lang: bn +--- + +প্রত্যেক ভ্যালিডেটরের একটি **উইথড্রল ক্রেডেনশিয়াল** থাকে যা নির্ধারণ করে কিভাবে এবং কোথায় তাদের স্টেক করা ETH এবং পুরস্কার উইথড্র করা যাবে। ক্রেডেনশিয়ালের প্রকার প্রথম বাইট দ্বারা নির্দেশিত হয়: `0x00`, `0x01`, বা `0x02`। এই প্রকারগুলি বোঝা ভ্যালিডেটরদের জন্য তাদের স্টেক পরিচালনা করার জন্য গুরুত্বপূর্ণ। + +## 0x00: প্রি-শ্যাপেলা ক্রেডেনশিয়াল {#0x00-credentials} + +`0x00` প্রকারটি শ্যাপেলা আপগ্রেডের (এপ্রিল ২০২৩) আগের আসল উইথড্রল ক্রেডেনশিয়াল ফরম্যাট। এই ক্রেডেনশিয়ালের প্রকার সহ ভ্যালিডেটরদের কোনো এক্সিকিউশন লেয়ার উইথড্রল অ্যাড্রেস সেট করা নেই, যার মানে তাদের ফান্ড কনসেন্সাস লেয়ারে লক করা থাকে। আপনার যদি এখনও `0x00` ক্রেডেনশিয়াল থাকে, তাহলে কোনো উইথড্রল পাওয়ার আগে আপনাকে অবশ্যই `0x01` বা `0x02`-তে আপগ্রেড করতে হবে। + +## 0x01: লিগ্যাসি উইথড্রল ক্রেডেনশিয়াল {#0x01-credentials} + +`0x01` প্রকারটি শ্যাপেলা আপগ্রেডের সাথে চালু করা হয়েছিল এবং এটি সেইসব ভ্যালিডেটরদের জন্য স্ট্যান্ডার্ড হয়ে ওঠে যারা একটি এক্সিকিউশন লেয়ার উইথড্রল অ্যাড্রেস সেট করতে চেয়েছিল। `0x01` ক্রেডেনশিয়ালের সাথে: + +- 32 ETH-এর উপরে যেকোনো ব্যালেন্স **স্বয়ংক্রিয়ভাবে আপনার উইথড্রল অ্যাড্রেসে সুইপ্ট** হয়ে যায় +- সম্পূর্ণ এক্সিট স্ট্যান্ডার্ড এক্সিট কিউ-এর মাধ্যমে সম্পন্ন হয় +- 32 ETH-এর উপরের পুরস্কার কম্পাউন্ড হতে পারে না—সেগুলো পর্যায়ক্রমে সুইপ্ট আউট হয়ে যায় + +**কিছু ভ্যালিডেটর কেন এখনও 0x01 ব্যবহার করে:** এটি সহজ এবং পরিচিত। অনেক ভ্যালিডেটর শ্যাপেলার পরে ডিপোজিট করেছে এবং তাদের কাছে ইতিমধ্যেই এই প্রকারটি রয়েছে, এবং যারা অতিরিক্ত ব্যালেন্সের স্বয়ংক্রিয় উইথড্রল চান তাদের জন্য এটি ঠিকঠাক কাজ করে। + +**কেন এটি সুপারিশ করা হয় না:** `0x01`-এর সাথে, আপনি 32 ETH-এর উপরে পুরস্কার কম্পাউন্ড করার ক্ষমতা হারান। প্রতিটি অতিরিক্ত অংশ স্বয়ংক্রিয়ভাবে সুইপ্ট হয়ে যায়, যা আপনার ভ্যালিডেটরের আয়ের সম্ভাবনাকে সীমিত করে এবং উইথড্র করা ফান্ড আলাদাভাবে পরিচালনা করার প্রয়োজন হয়। + +## 0x02: কম্পাউন্ডিং উইথড্রল ক্রেডেনশিয়াল {#0x02-credentials} + +`0x02` প্রকারটি পেক্ট্রা আপগ্রেডের সাথে চালু করা হয়েছিল এবং এটি আজকের ভ্যালিডেটরদের জন্য **সুপারিশকৃত পছন্দ**। `0x02` ক্রেডেনশিয়াল সহ ভ্যালিডেটরদের কখনও কখনও "কম্পাউন্ডিং ভ্যালিডেটর" বলা হয়। + +`0x02` ক্রেডেনশিয়ালের সাথে: + +- 32 ETH-এর উপরের পুরস্কার 1 ETH বৃদ্ধিতে সর্বোচ্চ 2048 ETH কার্যকর ব্যালেন্স পর্যন্ত **কম্পাউন্ড** হয় +- আংশিক উইথড্রল অবশ্যই ম্যানুয়ালি অনুরোধ করতে হবে (স্বয়ংক্রিয় সুইপ শুধুমাত্র 2048 ETH থ্রেশহোল্ডের উপরে ঘটে) +- ভ্যালিডেটররা একাধিক 32 ETH ভ্যালিডেটরকে একটি একক উচ্চ-ব্যালেন্সের ভ্যালিডেটরে একত্রিত করতে পারে +- সম্পূর্ণ এক্সিট এখনও স্ট্যান্ডার্ড এক্সিট কিউ-এর মাধ্যমে সমর্থিত + +আংশিক উইথড্রল এবং একত্রীকরণ উভয়ই [লঞ্চপ্যাড ভ্যালিডেটর অ্যাকশন](https://launchpad.ethereum.org/en/validator-actions) এর মাধ্যমে করা যেতে পারে। + +**কেন ভ্যালিডেটরদের 0x02 পছন্দ করা উচিত:** এটি কম্পাউন্ডিংয়ের মাধ্যমে উন্নত মূলধন দক্ষতা, উইথড্রল কখন হবে তার উপর আরও নিয়ন্ত্রণ প্রদান করে এবং ভ্যালিডেটর একত্রীকরণ সমর্থন করে। সময়ের সাথে সাথে পুরস্কার সংগ্রহকারী সোলো স্ট্যাকারদের জন্য, এর মানে হল তাদের কার্যকর ব্যালেন্স—এবং ফলস্বরূপ তাদের পুরস্কার—ম্যানুয়াল হস্তক্ষেপ ছাড়াই 32 ETH-এর বাইরে বাড়তে পারে। + +**গুরুত্বপূর্ণ:** একবার আপনি `0x01` থেকে `0x02`-তে রূপান্তর করলে, আপনি আর আগের অবস্থায় ফিরতে পারবেন না। + +টাইপ 2 ক্রেডেনশিয়ালে রূপান্তর এবং MaxEB ফিচারের উপর একটি বিস্তারিত গাইডের জন্য, [MaxEB ব্যাখ্যাকারী পাতা](/roadmap/pectra/maxeb/) দেখুন। + +## আমার কোনটি বেছে নেওয়া উচিত? {#what-should-i-pick} + +- **নতুন ভ্যালিডেটর:** `0x02` বেছে নিন। এটি উন্নত কম্পাউন্ডিং এবং নমনীয়তার সাথে আধুনিক স্ট্যান্ডার্ড। +- **বিদ্যমান 0x01 ভ্যালিডেটর:** আপনি যদি 32 ETH-এর উপরে পুরস্কার কম্পাউন্ড করতে চান বা ভ্যালিডেটরদের একত্রিত করার পরিকল্পনা করেন তবে `0x02`-তে রূপান্তর করার কথা বিবেচনা করুন। +- **বিদ্যমান 0x00 ভ্যালিডেটর:** অবিলম্বে আপগ্রেড করুন—আপনার ক্রেডেনশিয়াল আপডেট না করে আপনি উইথড্র করতে পারবেন না। আপনাকে প্রথমে `0x01`-এ রূপান্তর করতে হবে, তারপর আপনি `0x02`-তে রূপান্তর করতে পারবেন। + +## উইথড্রল ক্রেডেনশিয়াল পরিচালনার জন্য টুলস {#withdrawal-credential-tools} + +বেশ কিছু টুলস ক্রেডেনশিয়ালের প্রকারের মধ্যে নির্বাচন বা রূপান্তর সমর্থন করে: + +- **[ইথেরিয়াম স্টেকিং লঞ্চপ্যাড](https://launchpad.ethereum.org/en/validator-actions)** - ক্রেডেনশিয়াল রূপান্তর এবং একত্রীকরণ সহ ডিপোজিট এবং ভ্যালিডেটর পরিচালনার জন্য অফিসিয়াল টুল +- **[পেক্ট্রা স্টেকিং ম্যানেজার](https://pectrastaking.com)** - রূপান্তর এবং একত্রীকরণের জন্য ওয়ালেট-কানেক্ট সমর্থন সহ ওয়েব UI +- **[পেক্ট্রা ভ্যালিডেটর অপ্স CLI টুল](https://github.com/Luganodes/Pectra-Batch-Contract)** - ব্যাচ রূপান্তরের জন্য কমান্ড-লাইন টুল +- **[Ethereal](https://github.com/wealdtech/ethereal)** - ভ্যালিডেটর পরিচালনা সহ ইথেরিয়াম অপারেশনের জন্য CLI টুল + +একত্রীকরণ টুলসের একটি সম্পূর্ণ তালিকা এবং বিস্তারিত রূপান্তর নির্দেশাবলীর জন্য, দেখুন [MaxEB একত্রীকরণ টুলিং](/roadmap/pectra/maxeb/#consolidation-tooling)। + +## আরও পড়ুন {#further-reading} + +- [প্রুফ-অফ-স্টেক ইথেরিয়ামে কী-সমূহ](/developers/docs/consensus-mechanisms/pos/keys/) - ভ্যালিডেটর কী এবং কীভাবে তারা উইথড্রল ক্রেডেনশিয়ালের সাথে সম্পর্কিত তা জানুন +- [MaxEB](/roadmap/pectra/maxeb/) - পেক্ট্রা আপগ্রেড এবং সর্বোচ্চ কার্যকর ব্যালেন্স ফিচারের উপর বিস্তারিত গাইড diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/index.md new file mode 100644 index 00000000000..51276ad236e --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/index.md @@ -0,0 +1,114 @@ +--- +title: "প্রুফ-অফ-ওয়ার্ক (PoW)" +description: "প্রুফ-অফ-ওয়ার্ক কনসেন্সাস প্রোটোকল এবং ইথেরিয়ামে এর ভূমিকার একটি ব্যাখ্যা।" +lang: bn +--- + +ইথেরিয়াম নেটওয়ার্ক একটি কনসেন্সাস মেকানিজম ব্যবহার করে শুরু হয়েছিল যা **[প্রুফ-অফ-ওয়ার্ক (PoW)](/developers/docs/consensus-mechanisms/pow)** এর সাথে জড়িত ছিল। এটি ইথেরিয়াম নেটওয়ার্কের নোডগুলিকে ইথেরিয়াম ব্লকচেইনে রেকর্ড করা সমস্ত তথ্যের স্টেটের উপর একমত হতে সাহায্য করে এবং নির্দিষ্ট ধরণের অর্থনৈতিক আক্রমণ প্রতিরোধ করে। তবে, 2022 সালে ইথেরিয়াম প্রুফ-অফ-ওয়ার্ক বন্ধ করে দেয় এবং পরিবর্তে [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos) ব্যবহার করা শুরু করে। + + + + + + প্রুফ-অফ-ওয়ার্ক এখন বাতিল করা হয়েছে। ইথেরিয়াম আর তার কনসেন্সাস মেকানিজমের অংশ হিসাবে প্রুফ-অফ-ওয়ার্ক ব্যবহার করে না। পরিবর্তে, এটি প্রুফ-অফ-স্টেক ব্যবহার করে। [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) এবং [স্টেকিং](/staking/) সম্পর্কে আরও পড়ুন। + + + + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালোভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে [ট্রানজ্যাকশন](/developers/docs/transactions/), [ব্লক](/developers/docs/blocks/), এবং [কনসেন্সাস মেকানিজম](/developers/docs/consensus-mechanisms/) সম্পর্কে পড়ার পরামর্শ দিচ্ছি। + +## প্রুফ-অফ-ওয়ার্ক (PoW) কী? {#what-is-pow} + +নাকামোতো কনসেন্সাস, যা প্রুফ-অফ-ওয়ার্ক ব্যবহার করে, এটি সেই প্রক্রিয়া যা একসময় বিকেন্দ্রীভূত ইথেরিয়াম নেটওয়ার্ককে অ্যাকাউন্টের ব্যালেন্স এবং লেনদেনের ক্রমের মতো বিষয়গুলিতে কনসেন্সাসে (অর্থাৎ, সমস্ত নোড একমত) আসতে দিয়েছিল। এটি ব্যবহারকারীদের তাদের কয়েন "ডাবল স্পেন্ডিং" থেকে বিরত রেখেছিল এবং নিশ্চিত করেছিল যে ইথেরিয়াম চেইন আক্রমণ বা ম্যানিপুলেট করা অত্যন্ত কঠিন ছিল। এই সুরক্ষা বৈশিষ্ট্যগুলি এখন [গ্যাসপার](/developers/docs/consensus-mechanisms/pos/gasper/) নামে পরিচিত কনসেন্সাস মেকানিজম ব্যবহার করে প্রুফ-অফ-স্টেক থেকে আসে। + +## প্রুফ-অফ-ওয়ার্ক এবং মাইনিং {#pow-and-mining} + +প্রুফ-অফ-ওয়ার্ক হল অন্তর্নিহিত অ্যালগরিদম যা প্রুফ-অফ-ওয়ার্ক ব্লকচেইনে মাইনাররা যে কাজ করে তার জন্য অসুবিধা এবং নিয়ম সেট করে। মাইনিং নিজেই "কাজ"। এটি চেইনে বৈধ ব্লক যোগ করার কাজ। এটি গুরুত্বপূর্ণ কারণ চেইনের দৈর্ঘ্য নেটওয়ার্ককে ব্লকচেইনের সঠিক ফর্ক অনুসরণ করতে সহায়তা করে। যত বেশি "কাজ" করা হয়, চেইন তত দীর্ঘ হয় এবং ব্লকের সংখ্যা যত বেশি হয়, নেটওয়ার্ক বর্তমান অবস্থার বিষয়ে তত বেশি নিশ্চিত হতে পারে। + +[মাইনিং সম্পর্কে আরও](/developers/docs/consensus-mechanisms/pow/mining/) + +## ইথেরিয়ামের প্রুফ-অফ-ওয়ার্ক কীভাবে কাজ করে? {#how-it-works} + +ইথেরিয়াম ট্রানজ্যাকশনগুলি ব্লকে প্রক্রিয়া করা হয়। এখন-অপ্রচলিত প্রুফ-অফ-ওয়ার্ক ইথেরিয়ামে, প্রতিটি ব্লকে ছিল: + +- ব্লকের অসুবিধা – উদাহরণস্বরূপ: 3,324,092,183,262,715 +- mixHash – উদাহরণস্বরূপ: `0x44bca881b07a6a09f83b130798072441705d9a665c5ac8bdf2f39a3cdf3bee29` +- নন্স – উদাহরণস্বরূপ: `0xd3ee432b4fb3d26b` + +এই ব্লক ডেটা সরাসরি প্রুফ-অফ-ওয়ার্কের সাথে সম্পর্কিত ছিল। + +### প্রুফ-অফ-ওয়ার্কের কাজ {#the-work} + +প্রুফ-অফ-ওয়ার্ক প্রোটোকল, ইথ্যাশ (Ethash), একটি ব্লকের জন্য নন্স খুঁজে বের করার জন্য মাইনারদের ট্রায়াল এবং ত্রুটির একটি তীব্র প্রতিযোগিতার মধ্য দিয়ে যেতে হতো। শুধুমাত্র একটি বৈধ নন্স সহ ব্লকগুলি চেইনে যোগ করা যেতে পারে। + +একটি ব্লক তৈরি করার জন্য দৌড়ানোর সময়, একজন মাইনার বারবার একটি ডেটাসেট রাখে, যা শুধুমাত্র সম্পূর্ণ চেইন ডাউনলোড এবং চালানোর মাধ্যমে পাওয়া যেতে পারে (যেমন একজন মাইনার করে), একটি গাণিতিক ফাংশনের মাধ্যমে। ডেটাসেটটি একটি টার্গেটের নীচে একটি মিক্সহ্যাশ (mixHash) তৈরি করতে ব্যবহৃত হয়েছিল যা ব্লকের অসুবিধা দ্বারা নির্দেশিত হয়। এটি করার সর্বোত্তম উপায় হল ট্রায়াল এবং ত্রুটির মাধ্যমে। + +অসুবিধাটি হ্যাসের জন্য লক্ষ্য নির্ধারণ করে। টার্গেট যত কম হবে, বৈধ হ্যাসের সেট তত ছোট হবে। একবার তৈরি হয়ে গেলে, অন্যান্য মাইনার এবং ক্লায়েন্টদের জন্য এটি যাচাই করা অবিশ্বাস্যভাবে সহজ ছিল। এমনকি যদি একটি লেনদেন পরিবর্তন হয়, হ্যাস সম্পূর্ণরূপে ভিন্ন হবে, যা জালিয়াতির সংকেত দেবে। + +হ্যাশিং জালিয়াতি সনাক্ত করা সহজ করে তোলে। কিন্তু একটি প্রক্রিয়া হিসাবে প্রুফ-অফ-ওয়ার্কও চেইন আক্রমণ করার জন্য একটি বড় প্রতিরোধক ছিল। + +### প্রুফ-অফ-ওয়ার্ক এবং নিরাপত্তা {#security} + +মাইনারদের প্রধান ইথেরিয়াম চেইনে এই কাজটি করার জন্য উৎসাহিত করা হয়েছিল। মাইনারদের একটি উপসেটের জন্য তাদের নিজস্ব চেইন শুরু করার জন্য সামান্য উৎসাহ ছিল - এটি সিস্টেমকে দুর্বল করে। ব্লকচেইন সত্যের উৎস হিসাবে একটি একক স্টেটের উপর নির্ভর করে। + +প্রুফ-অফ-ওয়ার্কের উদ্দেশ্য ছিল চেইনকে প্রসারিত করা। দীর্ঘতম চেইনটি বৈধ হিসাবে সবচেয়ে বিশ্বাসযোগ্য ছিল কারণ এটি তৈরি করার জন্য সবচেয়ে বেশি গণনামূলক কাজ করা হয়েছিল। ইথেরিয়ামের PoW সিস্টেমের মধ্যে, লেনদেন মুছে ফেলা, নকল তৈরি করা বা দ্বিতীয় চেইন বজায় রাখে এমন নতুন ব্লক তৈরি করা প্রায় অসম্ভব ছিল। কারণ একজন দূষিত মাইনারকে সব সময় অন্য সবার চেয়ে দ্রুত ব্লক নন্স সমাধান করতে হতো। + +ধারাবাহিকভাবে দূষিত অথচ বৈধ ব্লক তৈরি করতে, একজন দূষিত মাইনারকে অন্য সবাইকে হারানোর জন্য নেটওয়ার্ক মাইনিং পাওয়ারের 51% এর বেশি প্রয়োজন হতো। এই পরিমাণ "কাজের" জন্য প্রচুর ব্যয়বহুল কম্পিউটিং শক্তি প্রয়োজন এবং ব্যয় করা শক্তি এমনকি একটি আক্রমণে অর্জিত লাভের চেয়েও বেশি হতে পারে। + +### প্রুফ-অফ-ওয়ার্ক অর্থনীতি {#economics} + +প্রুফ-অফ-ওয়ার্ক সিস্টেমে নতুন মুদ্রা ইস্যু করার এবং মাইনারদের কাজ করার জন্য উৎসাহিত করার জন্যও দায়ী ছিল। + +[কনস্টান্টিনোপল আপগ্রেড](/ethereum-forks/#constantinople) থেকে, যে মাইনাররা সফলভাবে একটি ব্লক তৈরি করে তাদের দুটি নতুন মিন্ট করা ETH এবং লেনদেন ফি-এর অংশ দিয়ে পুরস্কৃত করা হয়েছিল। অমার ব্লকগুলিও 1.75 ETH ক্ষতিপূরণ দিয়েছে। অমার ব্লকগুলি ছিল একজন মাইনার দ্বারা কার্যত একই সময়ে তৈরি করা বৈধ ব্লক যখন অন্য একজন মাইনার ক্যানোনিকাল ব্লক তৈরি করেছিল, যা শেষ পর্যন্ত কোন চেইনটি প্রথমে তৈরি হয়েছিল তার দ্বারা নির্ধারিত হয়েছিল। অমার ব্লক সাধারণত নেটওয়ার্ক লেটেন্সির কারণে ঘটে। + +## ফাইনালিটি {#finality} + +ইথেরিয়ামে একটি লেনদেনের "ফাইনালিটি" থাকে যখন এটি এমন একটি ব্লকের অংশ হয় যা পরিবর্তন করা যায় না। + +যেহেতু মাইনাররা একটি বিকেন্দ্রীভূত উপায়ে কাজ করে, দুটি বৈধ ব্লক একই সময়ে মাইন করা যেতে পারে। এটি একটি অস্থায়ী ফর্ক তৈরি করে। অবশেষে, এই চেইনগুলির মধ্যে একটি পরবর্তী ব্লকগুলি মাইন করা এবং এতে যুক্ত করার পরে গৃহীত চেইন হয়ে ওঠে, যা এটিকে দীর্ঘ করে তোলে। + +বিষয়টিকে আরও জটিল করার জন্য, অস্থায়ী ফর্কে প্রত্যাখ্যাত লেনদেনগুলি গৃহীত চেইনে অন্তর্ভুক্ত নাও হতে পারে। এর মানে হল এটি উল্টে যেতে পারে। সুতরাং ফাইনালিটি বলতে সেই সময়কে বোঝায় যা আপনার একটি লেনদেনকে অপরিবর্তনীয় বিবেচনা করার আগে অপেক্ষা করা উচিত। পূর্ববর্তী প্রুফ-অফ-ওয়ার্ক ইথেরিয়ামের অধীনে, একটি নির্দিষ্ট ব্লক `N`-এর উপরে যত বেশি ব্লক মাইন করা হয়েছিল, `N`-এর লেনদেন সফল হয়েছে এবং প্রত্যাবর্তন করা হবে না তার উপর আস্থা তত বেশি ছিল। এখন, প্রুফ-অফ-স্টেক-এর সাথে, ফাইনালটি একটি ব্লকের সম্ভাব্যতার পরিবর্তে একটি সুস্পষ্ট সম্পত্তি। + +## প্রুফ-অফ-ওয়ার্ক শক্তি-ব্যবহার {#energy} + +প্রুফ-অফ-ওয়ার্কের একটি প্রধান সমালোচনা হল নেটওয়ার্ককে নিরাপদ রাখার জন্য প্রয়োজনীয় শক্তির পরিমাণ। নিরাপত্তা এবং বিকেন্দ্রীকরণ বজায় রাখার জন্য, প্রুফ-অফ-ওয়ার্কে ইথেরিয়াম প্রচুর পরিমাণে শক্তি খরচ করে। প্রুফ-অফ-স্টেকে স্যুইচ করার কিছুক্ষণ আগে, ইথেরিয়াম মাইনাররা সম্মিলিতভাবে প্রায় 70 TWh/বছর খরচ করছিল (প্রায় চেক প্রজাতন্ত্রের সমান - 18-জুলাই-2022-এ [ডিজিকোνομিস্ট](https://digiconomist.net/) অনুসারে)। + +## সুবিধা এবং অসুবিধা {#pros-and-cons} + +| যেসব বিষয়ে এর সুফল পাওয়া যায় | কনস | +| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| প্রুফ-অফ-ওয়ার্ক নিরপেক্ষ। শুরু করার জন্য আপনার ETH-এর প্রয়োজন নেই এবং ব্লক রিওয়ার্ড আপনাকে 0ETH থেকে একটি ইতিবাচক ব্যালেন্সে যেতে দেয়। [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) দিয়ে শুরু করার জন্য আপনার ETH প্রয়োজন। | প্রুফ-অফ-ওয়ার্ক এত শক্তি ব্যবহার করে যে এটি পরিবেশের জন্য খারাপ। | +| প্রুফ-অফ-ওয়ার্ক একটি পরীক্ষিত এবং পরীক্ষিত কনসেন্সাস মেকানিজম যা বিটকয়েন এবং ইথেরিয়ামকে বহু বছর ধরে নিরাপদ এবং বিকেন্দ্রীভূত রেখেছে। | আপনি যদি মাইন করতে চান, আপনার এমন বিশেষ সরঞ্জামের প্রয়োজন যা শুরু করার জন্য একটি বড় বিনিয়োগ। | +| প্রুফ-অফ-স্টেকের তুলনায় এটি বাস্তবায়ন করা তুলনামূলকভাবে সহজ। | প্রয়োজনীয় গণনার পরিমাণ বৃদ্ধির কারণে, মাইনিং পুলগুলি সম্ভাব্যভাবে মাইনিং গেমটিতে আধিপত্য বিস্তার করতে পারে, যা কেন্দ্রীকরণ এবং নিরাপত্তা ঝুঁকির দিকে পরিচালিত করে। | + +## প্রুফ-অফ-স্টেকের সাথে তুলনা {#compared-to-pos} + +একটি উচ্চ স্তরে, প্রুফ-অফ-স্টেকের প্রুফ-অফ-ওয়ার্কের মতো একই শেষ লক্ষ্য রয়েছে: বিকেন্দ্রীভূত নেটওয়ার্ককে নিরাপদে কনসেন্সাসে পৌঁছাতে সহায়তা করা। তবে প্রক্রিয়া এবং কর্মীদের মধ্যে এর কিছু পার্থক্য রয়েছে: + +- প্রুফ-অফ-স্টেক স্টেক করা ETH-এর জন্য গণনামূলক শক্তির গুরুত্বকে পরিবর্তন করে। +- প্রুফ-অফ-স্টেক মাইনারদেরকে ভ্যালিডেটর দিয়ে প্রতিস্থাপন করে। ভ্যালিডেটররা নতুন ব্লক তৈরি করার ক্ষমতা সক্রিয় করতে তাদের ETH স্টেক করে। +- ভ্যালিডেটররা ব্লক তৈরি করার জন্য প্রতিযোগিতা করে না, পরিবর্তে তারা একটি অ্যালগরিদম দ্বারা এলোমেলোভাবে নির্বাচিত হয়। +- ফাইনালিটি পরিষ্কার: নির্দিষ্ট চেকপয়েন্টে, যদি 2/3 ভ্যালিডেটর ব্লকের স্টেটের উপর একমত হয় তবে এটিকে ফাইনাল হিসাবে বিবেচনা করা হয়। ভ্যালিডেটরদের অবশ্যই তাদের পুরো স্টেক এর উপর বাজি ধরতে হবে, তাই যদি তারা লাইনের নিচে ষড়যন্ত্র করার চেষ্টা করে, তবে তারা তাদের পুরো স্টেক হারাবে। + +[প্রুফ-অফ-স্টেক সম্পর্কে আরও](/developers/docs/consensus-mechanisms/pos/) + +## আপনি কি দেখে শিখতে বেশি পছন্দ করেন? {#visual-learner} + + + +## আরও পড়ুন {#further-reading} + +- [সংখ্যাগরিষ্ঠের আক্রমণ](https://en.bitcoin.it/wiki/Majority_attack) +- [সেটেলমেন্ট ফাইনালিটির উপর](https://blog.ethereum.org/2016/05/09/on-settlement-finality/) + +### ভিডিও {#videos} + +- [প্রুফ-অফ-ওয়ার্ক প্রোটোকলের একটি প্রযুক্তিগত ব্যাখ্যা](https://youtu.be/9V1bipPkCTU) + +## সম্পর্কিত বিষয় {#related-topics} + +- [মাইনিং](/developers/docs/consensus-mechanisms/pow/mining/) +- [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) +- [প্রুফ-অফ-অথোরিটি](/developers/docs/consensus-mechanisms/poa/) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/index.md new file mode 100644 index 00000000000..6a16951a38c --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/index.md @@ -0,0 +1,86 @@ +--- +title: "মাইনিং" +description: "ইথেরিয়ামে মাইনিং কীভাবে কাজ করত তার একটি ব্যাখ্যা।" +lang: bn +--- + + + + + +প্রুফ-অফ-ওয়ার্ক আর ইথেরিয়ামের কনসেন্সাস মেকানিজমের ভিত্তি নয়, যার অর্থ মাইনিং বন্ধ করে দেওয়া হয়েছে। পরিবর্তে, ইথেরিয়াম ভ্যালিডেটরদের দ্বারা সুরক্ষিত যারা ETH স্টেক করে। আপনি আজই আপনার ETH স্টেকিং শুরু করতে পারেন। The Merge, প্রুফ-অফ-স্টেক, এবং স্টেকিং সম্পর্কে আরও পড়ুন। এই পৃষ্ঠাটি শুধুমাত্র ঐতিহাসিক আগ্রহের জন্য। + + + + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি ভালোভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে [লেনদেন](/developers/docs/transactions/), [ব্লক](/developers/docs/blocks/) এবং [প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow/) সম্পর্কে পড়ার পরামর্শ দিই। + +## ইথেরিয়াম মাইনিং কী? {#what-is-ethereum-mining} + +মাইনিং হল ইথেরিয়ামের এখন-অপ্রচলিত প্রুফ-অফ-ওয়ার্ক আর্কিটেকচারে ইথেরিয়াম ব্লকচেইনে যোগ করার জন্য লেনদেনের একটি ব্লক তৈরি করার প্রক্রিয়া। + +মাইনিং শব্দটি ক্রিপ্টোকারেন্সির জন্য সোনার উপমা প্রসঙ্গে উদ্ভূত হয়েছে। সোনা বা মূল্যবান ধাতু দুর্লভ, ডিজিটাল টোকেনও তাই, এবং একটি প্রুফ-অফ-ওয়ার্ক সিস্টেমে মোট পরিমাণ বাড়ানোর একমাত্র উপায় হল মাইনিং। প্রুফ-অফ-ওয়ার্ক ইথেরিয়ামে, ইস্যুয়েন্সের একমাত্র পদ্ধতি ছিল মাইনিং। তবে সোনা বা মূল্যবান ধাতুর মতো নয়, ইথেরিয়াম মাইনিং ব্লকচেইনে ব্লক তৈরি, যাচাই, প্রকাশ এবং প্রচার করে নেটওয়ার্ক সুরক্ষিত করার একটি উপায়ও ছিল। + +ইথার মাইনিং = নেটওয়ার্ক সুরক্ষিত করা + +যেকোনো প্রুফ-অফ-ওয়ার্ক ব্লকচেইনের প্রাণশক্তি হল মাইনিং। প্রুফ-অফ-স্টেকে স্থানান্তরিত হওয়ার আগে ইথেরিয়াম মাইনাররা - সফটওয়্যার চালিত কম্পিউটার - তাদের সময় এবং কম্পিউটেশনাল শক্তি ব্যবহার করে লেনদেন প্রক্রিয়া এবং ব্লক তৈরি করত। + +## মাইনারদের অস্তিত্ব কেন? {#why-do-miners-exist} + +ইথেরিয়ামের মতো ডিসেন্ট্রালাইজড সিস্টেমে, আমাদের নিশ্চিত করতে হবে যে সবাই লেনদেনের ক্রমে একমত। মাইনাররা ব্লক তৈরি করার জন্য কম্পিউটেশনালি কঠিন পাজল সমাধান করে, নেটওয়ার্ককে আক্রমণ থেকে সুরক্ষিত করে এটি ঘটতে সাহায্য করেছে। + +[প্রুফ-অফ-ওয়ার্ক সম্পর্কে আরও](/developers/docs/consensus-mechanisms/pow/) + +আগে যে কেউ তাদের কম্পিউটার ব্যবহার করে ইথেরিয়াম নেটওয়ার্কে মাইনিং করতে পারত। তবে, সবাই লাভজনকভাবে ইথার (ETH) মাইনিং করতে পারত না। বেশিরভাগ ক্ষেত্রে, মাইনারদের ডেডিকেটেড কম্পিউটার হার্ডওয়্যার কিনতে হতো এবং সস্তা শক্তির উৎসের অ্যাক্সেস থাকতে হতো। গড় কম্পিউটারের মাইনিংয়ের সাথে সম্পর্কিত খরচগুলি কভার করার জন্য যথেষ্ট ব্লক রিওয়ার্ড উপার্জন করার সম্ভাবনা কম ছিল। + +### মাইনিংয়ের খরচ {#cost-of-mining} + +- একটি মাইনিং রিগ তৈরি এবং রক্ষণাবেক্ষণের জন্য প্রয়োজনীয় হার্ডওয়্যারের সম্ভাব্য খরচ +- মাইনিং রিগকে শক্তি দেওয়ার জন্য বৈদ্যুতিক খরচ +- আপনি যদি একটি পুলে মাইনিং করতেন, তবে এই পুলগুলি সাধারণত পুল দ্বারা তৈরি প্রতিটি ব্লকের উপর একটি নির্দিষ্ট % ফি চার্জ করত +- মাইনিং রিগকে সাপোর্ট করার জন্য প্রয়োজনীয় যন্ত্রপাতির সম্ভাব্য খরচ (ভেন্টিলেশন, শক্তি পর্যবেক্ষণ, বৈদ্যুতিক ওয়্যারিং, ইত্যাদি) + +মাইনিং লাভজনকতা আরও অন্বেষণ করতে, একটি মাইনিং ক্যালকুলেটর ব্যবহার করুন, যেমনটি [Etherscan](https://etherscan.io/ether-mining-calculator) প্রদান করে। + +## ইথেরিয়াম লেনদেন কীভাবে মাইনিং করা হয়েছিল {#how-ethereum-transactions-were-mined} + +নিচে ইথেরিয়াম প্রুফ-অফ-ওয়ার্কে লেনদেনগুলি কীভাবে মাইনিং করা হয়েছিল তার একটি সংক্ষিপ্ত বিবরণ দেওয়া হল। ইথেরিয়াম প্রুফ-অফ-স্টেকের জন্য এই প্রক্রিয়ার একটি অনুরূপ বিবরণ [এখানে](/developers/docs/consensus-mechanisms/pos/#transaction-execution-ethereum-pos) পাওয়া যাবে। + +1. একজন ব্যবহারকারী কিছু [অ্যাকাউন্টের](/developers/docs/accounts/) প্রাইভেট কী দিয়ে একটি [লেনদেন](/developers/docs/transactions/) অনুরোধ লেখেন এবং স্বাক্ষর করেন। +2. ব্যবহারকারী কিছু [নোড](/developers/docs/nodes-and-clients/) থেকে সমগ্র ইথেরিয়াম নেটওয়ার্কে লেনদেনের অনুরোধটি ব্রডকাস্ট করেন। +3. নতুন লেনদেনের অনুরোধ সম্পর্কে শোনার পরে, ইথেরিয়াম নেটওয়ার্কের প্রতিটি নোড তাদের স্থানীয় মেমপুলে অনুরোধটি যুক্ত করে, যা তারা শুনেছে এমন সমস্ত লেনদেনের অনুরোধের একটি তালিকা যা এখনও একটি ব্লকে ব্লকচেইনে জমা হয়নি। +4. এক পর্যায়ে, একটি মাইনিং নোড ব্লক গ্যাস লিমিটের নিচে থেকে তারা যে [ট্রানজ্যাকশন ফি](/developers/docs/gas/) উপার্জন করে তা সর্বাধিক করার উপায়ে বেশ কয়েকটি ডজন বা শত শত লেনদেনের অনুরোধকে একটি সম্ভাব্য [ব্লকে](/developers/docs/blocks/) একত্রিত করে। তারপর মাইনিং নোড: + 1. প্রতিটি লেনদেনের অনুরোধের বৈধতা যাচাই করে (যেমন, কেউ এমন একটি অ্যাকাউন্ট থেকে ইথার স্থানান্তর করার চেষ্টা করছে না যার জন্য তারা একটি স্বাক্ষর তৈরি করেনি, অনুরোধটি ত্রুটিপূর্ণ নয়, ইত্যাদি), এবং তারপর অনুরোধের কোড কার্যকর করে, তাদের EVM-এর স্থানীয় কপির স্টেট পরিবর্তন করে। মাইনার প্রতিটি এই ধরনের লেনদেনের অনুরোধের জন্য ট্রানজ্যাকশন ফি তাদের নিজস্ব অ্যাকাউন্টে পুরস্কার হিসেবে দেয়। + 2. ব্লকের সমস্ত লেনদেনের অনুরোধ যাচাই এবং স্থানীয় EVM কপিতে কার্যকর করার পরে, সম্ভাব্য ব্লকের জন্য প্রুফ-অফ-ওয়ার্ক “বৈধতার শংসাপত্র” তৈরি করার প্রক্রিয়া শুরু করে। +5. অবশেষে, একজন মাইনার একটি ব্লকের জন্য একটি শংসাপত্র তৈরি করা শেষ করবে যার মধ্যে আমাদের নির্দিষ্ট লেনদেনের অনুরোধ অন্তর্ভুক্ত থাকবে। তারপর মাইনার সম্পূর্ণ ব্লকটি ব্রডকাস্ট করে, যার মধ্যে শংসাপত্র এবং দাবি করা নতুন EVM স্টেটের একটি চেকসাম অন্তর্ভুক্ত থাকে। +6. অন্যান্য নোড নতুন ব্লক সম্পর্কে শুনতে পায়। তারা শংসাপত্র যাচাই করে, ব্লকের সমস্ত লেনদেন নিজেরাই কার্যকর করে (আমাদের ব্যবহারকারীর দ্বারা মূলত ব্রডকাস্ট করা লেনদেন সহ), এবং যাচাই করে যে সমস্ত লেনদেন কার্যকর করার পরে তাদের নতুন EVM স্টেটের চেকসাম মাইনারের ব্লক দ্বারা দাবি করা স্টেটের চেকসামের সাথে মেলে। শুধুমাত্র তারপরেই এই নোডগুলি এই ব্লকটিকে তাদের ব্লকচেইনের লেজে যুক্ত করে এবং নতুন EVM স্টেটকে ক্যানোনিকাল স্টেট হিসাবে গ্রহণ করে। +7. প্রতিটি নোড নতুন ব্লকের সমস্ত লেনদেন তাদের স্থানীয় অসম্পূর্ণ লেনদেন অনুরোধের মেমপুল থেকে সরিয়ে দেয়। +8. নেটওয়ার্কে যোগদানকারী নতুন নোডগুলি আমাদের আগ্রহের লেনদেন ধারণকারী ব্লক সহ ক্রমানুসারে সমস্ত ব্লক ডাউনলোড করে। তারা একটি স্থানীয় EVM কপি শুরু করে (যা একটি ফাঁকা-স্টেট EVM হিসাবে শুরু হয়), এবং তারপরে তাদের স্থানীয় EVM কপির উপরে প্রতিটি ব্লকের প্রতিটি লেনদেন কার্যকর করার প্রক্রিয়ার মধ্য দিয়ে যায়, পথে প্রতিটি ব্লকে স্টেট চেকসাম যাচাই করে। + +প্রতিটি লেনদেন একবার মাইনিং করা হয় (একটি নতুন ব্লকে অন্তর্ভুক্ত করা হয় এবং প্রথমবারের জন্য প্রচার করা হয়), কিন্তু ক্যানোনিকাল EVM স্টেটকে এগিয়ে নেওয়ার প্রক্রিয়ায় প্রতিটি অংশগ্রহণকারী দ্বারা কার্যকর এবং যাচাই করা হয়। এটি ব্লকচেইনের একটি কেন্দ্রীয় মন্ত্রকে তুলে ধরে: **বিশ্বাস করবেন না, যাচাই করুন**। + +## Ommer (আঙ্কল) ব্লক {#ommer-blocks} + +প্রুফ-অফ-ওয়ার্কে ব্লক মাইনিং ছিল সম্ভাবনামূলক, যার মানে কখনও কখনও নেটওয়ার্ক লেটেন্সির কারণে দুটি বৈধ ব্লক একই সাথে প্রকাশিত হত। এই ক্ষেত্রে, প্রোটোকলকে দীর্ঘতম (এবং তাই সবচেয়ে "বৈধ") চেইন নির্ধারণ করতে হয়েছিল এবং প্রস্তাবিত অন্তর্ভুক্ত না হওয়া বৈধ ব্লককে আংশিকভাবে রিওয়ার্ড দিয়ে মাইনারদের প্রতি ন্যায্যতা নিশ্চিত করতে হয়েছিল। এটি নেটওয়ার্কের আরও বিকেন্দ্রীকরণকে উৎসাহিত করেছে কারণ ছোট মাইনাররা, যারা বেশি লেটেন্সির সম্মুখীন হতে পারে, তারা এখনও [ommer](/glossary/#ommer) ব্লক রিওয়ার্ডের মাধ্যমে রিটার্ন জেনারেট করতে পারত। + +"ommer" শব্দটি একটি প্যারেন্ট ব্লকের সহোদরের জন্য পছন্দের লিঙ্গ-নিরপেক্ষ শব্দ, তবে এটিকে কখনও কখনও "uncle" হিসাবেও উল্লেখ করা হয়। **ইথেরিয়াম প্রুফ-অফ-স্টেকে স্থানান্তরিত হওয়ার পর থেকে, ommer ব্লক আর মাইনিং করা হয় না** কারণ প্রতিটি স্লটে শুধুমাত্র একজন প্রস্তাবককে নির্বাচিত করা হয়। মাইনিং করা ommer ব্লকের [ঐতিহাসিক চার্ট](https://ycharts.com/indicators/ethereum_uncle_rate) দেখে আপনি এই পরিবর্তনটি দেখতে পারেন। + +## একটি ভিজ্যুয়াল ডেমো {#a-visual-demo} + +দেখুন অস্টিন আপনাকে মাইনিং এবং প্রুফ-অফ-ওয়ার্ক ব্লকচেইন সম্পর্কে বোঝাচ্ছেন। + + + +## মাইনিং অ্যালগরিদম {#mining-algorithm} + +ইথেরিয়াম মেইননেট শুধুমাত্র একটি মাইনিং অ্যালগরিদম ব্যবহার করেছে - ['Ethash'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/)। Ethash ছিল ['Dagger-Hashimoto'](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/) নামে পরিচিত একটি আসল R&D অ্যালগরিদমের উত্তরসূরি। + +[মাইনিং অ্যালগরিদম সম্পর্কে আরও](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/)। + +## সম্পর্কিত বিষয় {#related-topics} + +- [গ্যাস](/developers/docs/gas/) +- [EVM](/developers/docs/evm/) +- [প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow/) diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md new file mode 100644 index 00000000000..018f4c0a6ce --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto/index.md @@ -0,0 +1,330 @@ +--- +title: Dagger-Hashimoto +description: "Dagger-Hashimoto অ্যালগরিদমের একটি বিশদ আলোচনা।" +lang: bn +--- + +Dagger-Hashimoto ছিল Ethereum-এর মাইনিং অ্যালগরিদমের জন্য মূল গবেষণা বাস্তবায়ন এবং স্পেসিফিকেশন। Dagger-Hashimoto [Ethash](#ethash) দ্বারা প্রতিস্থাপিত হয়েছিল। ১৫ই সেপ্টেম্বর ২০২২-এ [The Merge](/roadmap/merge/)-এ মাইনিং সম্পূর্ণভাবে বন্ধ করে দেওয়া হয়েছিল। তারপর থেকে, Ethereum পরিবর্তে একটি [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos) মেকানিজম ব্যবহার করে সুরক্ষিত হয়েছে। এই পৃষ্ঠাটি ঐতিহাসিক আগ্রহের জন্য - এখানে থাকা তথ্যগুলি মার্জ-পরবর্তী Ethereum-এর জন্য আর প্রাসঙ্গিক নয়। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে [প্রুফ-অফ-ওয়ার্ক কনসেন্সাস](/developers/docs/consensus-mechanisms/pow), [মাইনিং](/developers/docs/consensus-mechanisms/pow/mining), এবং [মাইনিং অ্যালগরিদম](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms) সম্পর্কে পড়ার পরামর্শ দিই। + +## Dagger-Hashimoto {#dagger-hashimoto} + +Dagger-Hashimoto দুটি লক্ষ্য পূরণের লক্ষ্য রাখে: + +1. **ASIC-প্রতিরোধ**: অ্যালগরিদমের জন্য বিশেষ হার্ডওয়্যার তৈরির সুবিধা যতটা সম্ভব কম হওয়া উচিত। +2. **লাইট ক্লায়েন্ট যাচাইযোগ্যতা**: একটি ব্লক একটি লাইট ক্লায়েন্ট দ্বারা দক্ষতার সাথে যাচাইযোগ্য হওয়া উচিত। + +একটি অতিরিক্ত পরিবর্তনের সাথে, আমরা আরও নির্দিষ্ট করি যে ইচ্ছা হলে কীভাবে তৃতীয় লক্ষ্য পূরণ করা যায়, তবে অতিরিক্ত জটিলতার মূল্যে: + +**সম্পূর্ণ চেইন স্টোরেজ**: মাইনিংয়ের জন্য সম্পূর্ণ ব্লকচেইন স্টেটের স্টোরেজ প্রয়োজন হবে (Ethereum স্টেট ট্রাই-এর অনিয়মিত কাঠামোর কারণে, আমরা আশা করি যে কিছু ছাঁটাই সম্ভব হবে, বিশেষ করে কিছু প্রায়শই ব্যবহৃত চুক্তির ক্ষেত্রে, তবে আমরা এটি কমানো করতে চাই)। + +## DAG জেনারেশন {#dag-generation} + +অ্যালগরিদমের জন্য কোডটি নিচে পাইথনে সংজ্ঞায়িত করা হবে। প্রথমে, আমরা নির্দিষ্ট নির্ভুলতার আনসাইন্ড পূর্ণসংখ্যাকে স্ট্রিং-এ মার্শালিং করার জন্য `encode_int` প্রদান করি। এর বিপরীতটিও দেওয়া হল: + +```python +NUM_BITS = 512 + +def encode_int(x): + "একটি ইন্টিজার x কে একটি স্ট্রিং হিসাবে এনকোড করুন যা 64টি অক্ষর নিয়ে গঠিত, একটি বড়-এন্ডিয়ান স্কিম ব্যবহার করে" + o = '' + for _ in range(NUM_BITS / 8): + o = chr(x % 256) + o + x //= 256 + return o + +def decode_int(s): + "একটি বড়-এন্ডিয়ান স্কিম ব্যবহার করে একটি স্ট্রিং থেকে একটি ইন্টিজার x আনএনকোড করুন" + x = 0 + for c in s: + x *= 256 + x += ord(c) + return x +``` + +আমরা এরপরে ধরে নিই যে `sha3` একটি ফাংশন যা একটি পূর্ণসংখ্যা নেয় এবং একটি পূর্ণসংখ্যা আউটপুট দেয়, এবং `dbl_sha3` একটি ডাবল-sha3 ফাংশন; যদি এই রেফারেন্স কোডটিকে একটি বাস্তবায়নে রূপান্তর করা হয় তবে ব্যবহার করুন: + +```python +from pyethereum import utils +def sha3(x): + if isinstance(x, (int, long)): + x = encode_int(x) + return decode_int(utils.sha3(x)) + +def dbl_sha3(x): + if isinstance(x, (int, long)): + x = encode_int(x) + return decode_int(utils.sha3(utils.sha3(x))) +``` + +### প্যারামিটার {#parameters} + +অ্যালগরিদমের জন্য ব্যবহৃত প্যারামিটারগুলি হল: + +```python +SAFE_PRIME_512 = 2**512 - 38117 # ২**৫১২ এর চেয়ে কম বৃহত্তম সেফ প্রাইম + +params = { + "n": 4000055296 * 8 // NUM_BITS, # ডেটাসেটের আকার (4 গিগাবাইট); অবশ্যই 65536 এর গুণিতক হতে হবে + "n_inc": 65536, # প্রতি পিরিয়ডে n-এর মানের বৃদ্ধি; অবশ্যই 65536 এর গুণিতক হতে হবে + # epochtime=20000 হলে প্রতি বছর 882 MB বৃদ্ধি পায় + "cache_size": 2500, # লাইট ক্লায়েন্টের ক্যাশের আকার (লাইট ক্লায়েন্ট দ্বারা নির্বাচিত হতে পারে; + # অ্যালগো স্পেকের অংশ নয়) + "diff": 2**14, # কঠিনতা (ব্লক মূল্যায়নের সময় সমন্বয় করা হয়) + "epochtime": 100000, # ব্লকগুলিতে একটি যুগের দৈর্ঘ্য (কত ঘন ঘন ডেটাসেট আপডেট করা হয়) + "k": 1, # একটি নোডের প্যারেন্টের সংখ্যা + "w": w, # মডুলার এক্সপোনেনশিয়েশন হ্যাশিংয়ের জন্য ব্যবহৃত হয় + "accesses": 200, # হ্যাশিমোটো চলাকালীন ডেটাসেট অ্যাক্সেসের সংখ্যা + "P": SAFE_PRIME_512 # হ্যাশিং এবং র‍্যান্ডম নম্বর জেনারেশনের জন্য নিরাপদ প্রাইম +} +``` + +`P` এই ক্ষেত্রে এমন একটি প্রাইম যা এমনভাবে বেছে নেওয়া হয়েছে যে `log₂(P)` 512-এর চেয়ে সামান্য কম, যা আমাদের সংখ্যাগুলিকে উপস্থাপন করার জন্য আমরা যে 512 বিট ব্যবহার করছি তার সাথে সঙ্গতিপূর্ণ। লক্ষ্য করুন যে DAG-এর শুধুমাত্র শেষার্ধটি সঞ্চয় করা প্রয়োজন, তাই ডি-ফ্যাক্টো RAM-এর প্রয়োজনীয়তা 1 GB থেকে শুরু হয় এবং প্রতি বছর 441 MB বৃদ্ধি পায়। + +### ডেগার গ্রাফ বিল্ডিং {#dagger-graph-building} + +ডেগার গ্রাফ বিল্ডিং প্রিমিটিভটি নিম্নরূপ সংজ্ঞায়িত করা হয়েছে: + +```python +def produce_dag(params, seed, length): + P = params["P"] + picker = init = pow(sha3(seed), params["w"], P) + o = [init] + for i in range(1, length): + x = picker = (picker * init) % P + for _ in range(params["k"]): + x ^= o[x % i] + o.append(pow(x, params["w"], P)) + return o +``` + +মূলত, এটি একটি গ্রাফকে একটি একক নোড, `sha3(seed)` হিসাবে শুরু করে এবং সেখান থেকে এলোমেলো পূর্ববর্তী নোডের উপর ভিত্তি করে ক্রমানুসারে অন্যান্য নোড যুক্ত করা শুরু করে। যখন একটি নতুন নোড তৈরি করা হয়, তখন `i`-এর চেয়ে কম কিছু সূচক এলোমেলোভাবে নির্বাচন করার জন্য সিডের একটি মডুলার পাওয়ার গণনা করা হয় (উপরে `x % i` ব্যবহার করে), এবং সেই সূচকে থাকা নোডগুলির মানগুলি একটি গণনায় ব্যবহার করা হয় `x`-এর জন্য একটি নতুন মান তৈরি করতে, যা পরে একটি ছোট প্রুফ অফ ওয়ার্ক ফাংশনে (XOR-এর উপর ভিত্তি করে) ফিড করা হয় যাতে অবশেষে সূচক `i`-তে গ্রাফের মান তৈরি করা যায়। এই বিশেষ ডিজাইনের পিছনে যুক্তি হল DAG-এর অনুক্রমিক অ্যাক্সেস জোর করা; DAG-এর পরবর্তী মান যা অ্যাক্সেস করা হবে তা বর্তমান মান না জানা পর্যন্ত নির্ধারণ করা যাবে না। অবশেষে, মডুলার এক্সপোনেনশিয়েশন ফলাফলটিকে আরও হ্যাস করে। + +এই অ্যালগরিদম সংখ্যা তত্ত্বের বেশ কয়েকটি ফলাফলের উপর নির্ভর করে। আলোচনার জন্য নীচের পরিশিষ্ট দেখুন। + +## লাইট ক্লায়েন্ট মূল্যায়ন {#light-client-evaluation} + +উপরের গ্রাফ নির্মাণটি গ্রাফের প্রতিটি নোডকে শুধুমাত্র অল্প সংখ্যক নোডের একটি সাবট্রি গণনা করে এবং শুধুমাত্র অল্প পরিমাণে সহায়ক মেমরির প্রয়োজন করে পুনর্গঠন করার অনুমতি দেওয়ার উদ্দেশ্যে করা হয়েছে। লক্ষ্য করুন যে k=1 হলে, সাবট্রিটি DAG-এর প্রথম উপাদান পর্যন্ত যাওয়া মানগুলির একটি চেইন মাত্র। + +DAG-এর জন্য লাইট ক্লায়েন্ট কম্পিউটিং ফাংশনটি নিম্নরূপ কাজ করে: + +```python +def quick_calc(params, seed, p): + w, P = params["w"], params["P"] + cache = {} + + def quick_calc_cached(p): + if p in cache: + pass + elif p == 0: + cache[p] = pow(sha3(seed), w, P) + else: + x = pow(sha3(seed), (p + 1) * w, P) + for _ in range(params["k"]): + x ^= quick_calc_cached(x % p) + cache[p] = pow(x, w, P) + return cache[p] + + return quick_calc_cached(p) +``` + +মূলত, এটি উপরের অ্যালগরিদমের একটি পুনর্লিখন যা সম্পূর্ণ DAG-এর জন্য মান গণনা করার লুপটি সরিয়ে দেয় এবং পূর্ববর্তী নোড লুকআপকে একটি পুনরাবৃত্তিমূলক কল বা একটি ক্যাশে লুকআপ দিয়ে প্রতিস্থাপন করে। লক্ষ্য করুন যে `k=1`-এর জন্য ক্যাশে অপ্রয়োজনীয়, যদিও একটি আরও অপ্টিমাইজেশান আসলে DAG-এর প্রথম কয়েক হাজার মান প্রিকম্পিউট করে এবং সেটিকে গণনার জন্য একটি স্ট্যাটিক ক্যাশে হিসাবে রাখে; এর একটি কোড বাস্তবায়নের জন্য পরিশিষ্ট দেখুন। + +## DAG-এর ডাবল বাফার {#double-buffer} + +একটি সম্পূর্ণ ক্লায়েন্টে, উপরের সূত্র দ্বারা উৎপাদিত 2টি DAG-এর একটি [_ডাবল বাফার_](https://wikipedia.org/wiki/Multiple_buffering) ব্যবহার করা হয়। ধারণাটি হল যে উপরের প্যারাম অনুযায়ী প্রতি `epochtime` সংখ্যক ব্লক অন্তর DAG তৈরি করা হয়। ক্লায়েন্ট সর্বশেষ উৎপাদিত DAG ব্যবহার করার পরিবর্তে, এটি পূর্ববর্তীটি ব্যবহার করে। এর সুবিধা হল এটি সময়ের সাথে সাথে DAG-গুলিকে প্রতিস্থাপন করার অনুমতি দেয় এমন একটি ধাপ অন্তর্ভুক্ত করার প্রয়োজন ছাড়াই যেখানে মাইনারদের হঠাৎ করে সমস্ত ডেটা পুনরায় গণনা করতে হবে। অন্যথায়, নিয়মিত বিরতিতে চেইন প্রক্রিয়াকরণে একটি আকস্মিক অস্থায়ী মন্দার সম্ভাবনা রয়েছে এবং নাটকীয়ভাবে কেন্দ্রীকরণ বৃদ্ধি পায়। এইভাবে সমস্ত ডেটা পুনরায় গণনা করার আগে সেই কয়েক মিনিটের মধ্যে 51% আক্রমণের ঝুঁকি থাকে। + +একটি ব্লকের জন্য কাজ গণনা করতে ব্যবহৃত DAG-এর সেট তৈরি করতে ব্যবহৃত অ্যালগরিদমটি নিম্নরূপ: + +```python +def get_prevhash(n): + from pyethereum.blocks import GENESIS_PREVHASH + from pyethereum import chain_manager + if n <= 0: + return hash_to_int(GENESIS_PREVHASH) + else: + prevhash = chain_manager.index.get_block_by_number(n - 1) + return decode_int(prevhash) + +def get_seedset(params, block): + seedset = {} + seedset["back_number"] = block.number - (block.number % params["epochtime"]) + seedset["back_hash"] = get_prevhash(seedset["back_number"]) + seedset["front_number"] = max(seedset["back_number"] - params["epochtime"], 0) + seedset["front_hash"] = get_prevhash(seedset["front_number"]) + return seedset + +def get_dagsize(params, block): + return params["n"] + (block.number // params["epochtime"]) * params["n_inc"] + +def get_daggerset(params, block): + dagsz = get_dagsize(params, block) + seedset = get_seedset(params, block) + if seedset["front_hash"] <= 0: + # কোনো ব্যাক বাফার সম্ভব নয়, শুধু ফ্রন্ট বাফার তৈরি করুন + return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), + "block_number": 0}} + else: + return {"front": {"dag": produce_dag(params, seedset["front_hash"], dagsz), + "block_number": seedset["front_number"]}, + "back": {"dag": produce_dag(params, seedset["back_hash"], dagsz), + "block_number": seedset["back_number"]}} +``` + +## হ্যাশিমোটো {#hashimoto} + +আসল হ্যাশিমোটোর পিছনের ধারণাটি হল ব্লকচেইনকে একটি ডেটাসেট হিসাবে ব্যবহার করা, একটি গণনা সম্পাদন করা যা ব্লকচেইন থেকে N সূচক নির্বাচন করে, সেই সূচকগুলিতে লেনদেন সংগ্রহ করে, এই ডেটার একটি XOR সম্পাদন করে এবং ফলাফলের হ্যাস প্রদান করে। থ্যাডিউস ড্রায়জার আসল অ্যালগরিদম, সামঞ্জস্যের জন্য পাইথনে অনূদিত, নিম্নরূপ: + +```python +def orig_hashimoto(prev_hash, merkle_root, list_of_transactions, nonce): + hash_output_A = sha256(prev_hash + merkle_root + nonce) + txid_mix = 0 + for i in range(64): + shifted_A = hash_output_A >> i + transaction = shifted_A % len(list_of_transactions) + txid_mix ^= list_of_transactions[transaction] << i + return txid_mix ^ (nonce << 192) +``` + +দুর্ভাগ্যবশত, যদিও হ্যাশিমোটোকে RAM হার্ড হিসাবে বিবেচনা করা হয়, এটি 256-বিট গাণিতিকের উপর নির্ভর করে, যার যথেষ্ট গণনামূলক ওভারহেড রয়েছে। যাইহোক, Dagger-Hashimoto এই সমস্যাটি সমাধান করার জন্য তার ডেটাসেটকে ইন্ডেক্স করার সময় শুধুমাত্র সর্বনিম্ন গুরুত্বপূর্ণ 64 বিট ব্যবহার করে। + +```python +def hashimoto(dag, dagsize, params, header, nonce): + m = dagsize / 2 + mix = sha3(encode_int(nonce) + header) + for _ in range(params["accesses"]): + mix ^= dag[m + (mix % 2**64) % m] + return dbl_sha3(mix) +``` + +ডাবল SHA3-এর ব্যবহার জিরো-ডেটা, প্রায়-তাত্ক্ষণিক প্রাক-যাচাইকরণের একটি ফর্মের অনুমতি দেয়, শুধুমাত্র এটি যাচাই করে যে একটি সঠিক মধ্যবর্তী মান প্রদান করা হয়েছিল। প্রুফ-অফ-ওয়ার্কের এই বাইরের লেয়ারটি অত্যন্ত ASIC-বান্ধব এবং মোটামুটি দুর্বল, তবে এটি DDoS-কে আরও কঠিন করার জন্য বিদ্যমান কারণ একটি ব্লক তৈরি করার জন্য সেই অল্প পরিমাণ কাজ অবশ্যই করতে হবে যা অবিলম্বে বাতিল করা হবে না। এখানে লাইট-ক্লায়েন্ট সংস্করণটি রয়েছে: + +```python +def quick_hashimoto(seed, dagsize, params, header, nonce): + m = dagsize // 2 + mix = sha3(nonce + header) + for _ in range(params["accesses"]): + mix ^= quick_calc(params, seed, m + (mix % 2**64) % m) + return dbl_sha3(mix) +``` + +## মাইনিং এবং যাচাইকরণ {#mining-and-verifying} + +এখন, আসুন আমরা সবকিছু একসাথে মাইনিং অ্যালগরিদমে রাখি: + +```python +def mine(daggerset, params, block): + from random import randint + nonce = randint(0, 2**64) + while 1: + result = hashimoto(daggerset, get_dagsize(params, block), + params, decode_int(block.prevhash), nonce) + if result * params["diff"] < 2**256: + break + nonce += 1 + if nonce >= 2**64: + nonce = 0 + return nonce +``` + +এখানে যাচাইকরণ অ্যালগরিদমটি রয়েছে: + +```python +def verify(daggerset, params, block, nonce): + result = hashimoto(daggerset, get_dagsize(params, block), + params, decode_int(block.prevhash), nonce) + return result * params["diff"] < 2**256 +``` + +লাইট-ক্লায়েন্ট বন্ধুত্বপূর্ণ যাচাইকরণ: + +```python +def light_verify(params, header, nonce): + seedset = get_seedset(params, block) + result = quick_hashimoto(seedset["front_hash"], get_dagsize(params, block), + params, decode_int(block.prevhash), nonce) + return result * params["diff"] < 2**256 +``` + +এছাড়াও, মনে রাখবেন যে Dagger-Hashimoto ব্লক হেডারের উপর অতিরিক্ত প্রয়োজনীয়তা আরোপ করে: + +- দুই-স্তরীয় যাচাইকরণের কাজ করার জন্য, একটি ব্লক হেডারে অবশ্যই ননস এবং মধ্যবর্তী মান উভয়ই প্রাক-sha3 থাকতে হবে। +- কোথাও, একটি ব্লক হেডারকে অবশ্যই বর্তমান সিডসেটের sha3 সংরক্ষণ করতে হবে। + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## পরিশিষ্ট {#appendix} + +উপরে উল্লিখিত হিসাবে, DAG প্রজন্মের জন্য ব্যবহৃত RNG সংখ্যা তত্ত্বের কিছু ফলাফলের উপর নির্ভর করে। প্রথমত, আমরা নিশ্চিত করি যে লেহমার আরএনজি যা `picker` ভেরিয়েবলের ভিত্তি তার একটি বিস্তৃত সময়কাল রয়েছে। দ্বিতীয়ত, আমরা দেখাই যে `pow(x,3,P)` `x`-কে `1` বা `P-1`-এ ম্যাপ করবে না যদি `x ∈ [2,P-2]` দিয়ে শুরু করা হয়। অবশেষে, আমরা দেখাই যে হ্যাশিং ফাংশন হিসাবে ব্যবহার করা হলে `pow(x,3,P)`-এর সংঘর্ষের হার কম থাকে। + +### লেহমার র‍্যান্ডম নম্বর জেনারেটর {#lehmer-random-number} + +যদিও `produce_dag` ফাংশনটিকে নিরপেক্ষ র‍্যান্ডম সংখ্যা তৈরি করতে হবে না, একটি সম্ভাব্য হুমকি হল `seed**i % P` শুধুমাত্র মুষ্টিমেয় কিছু মান নেয়। এটি প্যাটার্নটি চিনতে পারা মাইনারদের জন্য একটি সুবিধা প্রদান করতে পারে যারা তা করে না। + +এটি এড়াতে, সংখ্যা তত্ত্বের একটি ফলাফলের সাহায্য নেওয়া হয়। একটি [_সেফ প্রাইম_](https://en.wikipedia.org/wiki/Safe_prime)-কে একটি প্রাইম `P` হিসাবে সংজ্ঞায়িত করা হয় যাতে `(P-1)/2`ও প্রাইম হয়। [গুণক গ্রুপ](https://en.wikipedia.org/wiki/Multiplicative_group_of_integers_modulo_n) `ℤ/nℤ`-এর একটি সদস্য `x`-এর _ক্রম_ কে ন্যূনতম `m` হিসাবে সংজ্ঞায়িত করা হয় যেমন
xᵐ mod P ≡ 1
+এই সংজ্ঞাগুলি দেওয়া হলে, আমরা পাই: + +> পর্যবেক্ষণ ১। ধরা যাক, `x` একটি সেফ প্রাইম `P`-এর জন্য গুণক গ্রুপ `ℤ/Pℤ`-এর একটি সদস্য। যদি `x mod P ≠ 1 mod P` এবং `x mod P ≠ P-1 mod P` হয়, তাহলে `x`-এর ক্রম হয় `P-1` অথবা `(P-1)/2` হবে। + +_প্রমাণ_। যেহেতু `P` একটি সেফ প্রাইম, তাই [লাগ্রাঞ্জের উপপাদ্য][lagrange] দ্বারা আমরা পাই যে `x`-এর ক্রম হয় `1`, `2`, `(P-1)/2`, অথবা `P-1`। + +`x`-এর ক্রম `1` হতে পারে না, যেহেতু ফার্মার ছোট উপপাদ্য দ্বারা আমরা পাই: + +
xP-1 mod P ≡ 1
+ +অতএব, `x` অবশ্যই `ℤ/nℤ`-এর একটি গুণক পরিচয় হতে হবে, যা অনন্য। যেহেতু আমরা ধরে নিয়েছি যে `x ≠ 1`, তাই এটি সম্ভব নয়। + +`x`-এর ক্রম `2` হতে পারে না যদি না `x = P-1` হয়, কারণ এটি `P`-এর প্রাইম হওয়ার বিষয়টিকে লঙ্ঘন করবে। + +উপরের প্রস্তাবনা থেকে, আমরা বুঝতে পারি যে `(picker * init) % P`-এর পুনরাবৃত্তির একটি চক্র দৈর্ঘ্য অন্তত `(P-1)/2` হবে। এর কারণ হল আমরা `P`-কে দুইয়ের একটি উচ্চতর পাওয়ারের প্রায় সমান একটি সেফ প্রাইম হিসাবে নির্বাচন করেছি, এবং `init` ব্যবধান `[2,2**256+1]`-এর মধ্যে রয়েছে। `P`-এর বিশালতার পরিপ্রেক্ষিতে, আমাদের মডুলার এক্সপোনেনশিয়েশন থেকে কোনো চক্র আশা করা উচিত নয়। + +যখন আমরা DAG-এর প্রথম সেলটি নির্ধারণ করছি (`init` লেবেলযুক্ত ভেরিয়েবল), আমরা `pow(sha3(seed) + 2, 3, P)` গণনা করি। প্রথম নজরে, এটি গ্যারান্টি দেয় না যে ফলাফলটি `1` বা `P-1` কোনোটিই নয়। যাইহোক, যেহেতু `P-1` একটি সেফ প্রাইম, আমাদের কাছে নিম্নলিখিত অতিরিক্ত আশ্বাস রয়েছে, যা পর্যবেক্ষণ ১-এর একটি উপসিদ্ধান্ত: + +> পর্যবেক্ষণ ২। ধরা যাক, `x` একটি সেফ প্রাইম `P`-এর জন্য গুণক গ্রুপ `ℤ/Pℤ`-এর একটি সদস্য, এবং ধরা যাক `w` একটি স্বাভাবিক সংখ্যা। যদি `x mod P ≠ 1 mod P` এবং `x mod P ≠ P-1 mod P` হয়, এবং সেইসাথে `w mod P ≠ P-1 mod P` এবং `w mod P ≠ 0 mod P` হয়, তাহলে `xʷ mod P ≠ 1 mod P` এবং `xʷ mod P ≠ P-1 mod P` হবে। + +### একটি হ্যাস ফাংশন হিসাবে মডুলার এক্সপোনেনসিয়েশন {#modular-exponentiation} + +`P` এবং `w`-এর নির্দিষ্ট মানের জন্য, `pow(x, w, P)` ফাংশনে অনেক সংঘর্ষ হতে পারে। উদাহরণস্বরূপ, `pow(x,9,19)` শুধুমাত্র `{1,18}` মানগুলি নেয়। + +যেহেতু `P` প্রাইম, তাই একটি মডুলার এক্সপোনেনশিয়েশন হ্যাশিং ফাংশনের জন্য একটি উপযুক্ত `w` নিম্নলিখিত ফলাফল ব্যবহার করে বেছে নেওয়া যেতে পারে: + +> পর্যবেক্ষণ ৩। ধরা যাক, `P` একটি প্রাইম; `w` এবং `P-1` তুলনামূলকভাবে প্রাইম হবে যদি এবং কেবল যদি `ℤ/Pℤ`-এর সমস্ত `a` এবং `b`-এর জন্য:
`aʷ mod P ≡ bʷ mod P` হয় যদি এবং কেবল যদি `a mod P ≡ b mod P` হয়
+ +এইভাবে, যেহেতু `P` প্রাইম এবং `w` `P-1`-এর সাথে তুলনামূলকভাবে প্রাইম, আমরা পাই যে `|{pow(x, w, P) : x ∈ ℤ}| = P`, যা বোঝায় যে হ্যাশিং ফাংশনের সম্ভাব্য সর্বনিম্ন সংঘর্ষের হার রয়েছে। + +বিশেষ ক্ষেত্রে যখন `P` আমাদের নির্বাচিত সেফ প্রাইম, তখন `P-1`-এর শুধুমাত্র উৎপাদক 1, 2, `(P-1)/2` এবং `P-1` থাকে। যেহেতু `P` > 7, আমরা জানি যে 3 `P-1`-এর সাথে তুলনামূলকভাবে প্রাইম, তাই `w=3` উপরের প্রস্তাবনাটি পূরণ করে। + +## আরও দক্ষ ক্যাশে-ভিত্তিক মূল্যায়ন অ্যালগরিদম {#cache-based-evaluation} + +```python +def quick_calc(params, seed, p): + cache = produce_dag(params, seed, params["cache_size"]) + return quick_calc_cached(cache, params, p) + +def quick_calc_cached(cache, params, p): + P = params["P"] + if p < len(cache): + return cache[p] + else: + x = pow(cache[0], p + 1, P) + for _ in range(params["k"]): + x ^= quick_calc_cached(cache, params, x % p) + return pow(x, params["w"], P) + +def quick_hashimoto(seed, dagsize, params, header, nonce): + cache = produce_dag(params, seed, params["cache_size"]) + return quick_hashimoto_cached(cache, dagsize, params, header, nonce) + +def quick_hashimoto_cached(cache, dagsize, params, header, nonce): + m = dagsize // 2 + mask = 2**64 - 1 + mix = sha3(encode_int(nonce) + header) + for _ in range(params["accesses"]): + mix ^= quick_calc_cached(cache, params, m + (mix & mask) % m) + return dbl_sha3(mix) +``` diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md new file mode 100644 index 00000000000..2dbf077b275 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash/index.md @@ -0,0 +1,1022 @@ +--- +title: Ethash +description: "Ethash অ্যালগরিদমটির একটি বিস্তারিত বিবরণ।" +lang: bn +--- + + + + + + Ethash ছিল Ethereum-এর প্রুফ-অফ-ওয়ার্ক মাইনিং অ্যালগরিদম। প্রুফ-অফ-ওয়ার্ক এখন **সম্পূর্ণরূপে বন্ধ করে দেওয়া হয়েছে** এবং Ethereum এখন এর পরিবর্তে [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) ব্যবহার করে সুরক্ষিত। [The Merge](/roadmap/merge/), [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) এবং [স্টেকিং](/staking/) সম্পর্কে আরও পড়ুন। এই পৃষ্ঠাটি ঐতিহাসিক আগ্রহের জন্য! + + + + +Ethash হল [Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto) অ্যালগরিদমের একটি পরিবর্তিত সংস্করণ। Ethash প্রুফ-অফ-ওয়ার্ক [মেমরি হার্ড](https://wikipedia.org/wiki/Memory-hard_function), যা অ্যালগরিদমটিকে ASIC প্রতিরোধী করে তুলবে বলে মনে করা হয়েছিল। Ethash ASIC অবশেষে তৈরি করা হয়েছিল কিন্তু প্রুফ-অফ-ওয়ার্ক বন্ধ না হওয়া পর্যন্ত GPU মাইনিং একটি কার্যকর বিকল্প ছিল। Ethash এখনও অন্যান্য নন-Ethereum প্রুফ-অফ-ওয়ার্ক নেটওয়ার্কে অন্য কয়েন মাইন করতে ব্যবহৃত হয়। + +## Ethash কিভাবে কাজ করে? {#how-does-ethash-work} + +মেমরি হার্ডনেস একটি প্রুফ-অফ-ওয়ার্ক অ্যালগরিদম দিয়ে অর্জন করা হয় যার জন্য ননস এবং ব্লক হেডারের উপর নির্ভরশীল একটি নির্দিষ্ট রিসোর্সের সাবসেট বেছে নিতে হয়। এই রিসোর্স (আকারে কয়েক গিগাবাইট) কে DAG বলা হয়। DAG প্রতি 30000 ব্লকে পরিবর্তিত হয়, একটি ~125-ঘন্টার উইন্ডো যাকে ইপক বলা হয় (প্রায় 5.2 দিন) এবং এটি তৈরি হতে কিছুটা সময় নেয়। যেহেতু DAG শুধুমাত্র ব্লকের উচ্চতার উপর নির্ভর করে, তাই এটি আগে থেকে তৈরি করা যেতে পারে, কিন্তু যদি তা না করা হয় তাহলে ক্লায়েন্টকে একটি ব্লক তৈরি করার জন্য এই প্রক্রিয়ার শেষ পর্যন্ত অপেক্ষা করতে হবে। যদি ক্লায়েন্টরা সময়ের আগে DAG তৈরি এবং ক্যাশে না করে, তাহলে প্রতিটি ইপক পরিবর্তনের সময় নেটওয়ার্কে ব্যাপক ব্লক বিলম্ব হতে পারে। নোট করুন যে প্রুফ-অফ-ওয়ার্ক যাচাই করার জন্য DAG তৈরি করার প্রয়োজন নেই, যা মূলত কম CPU এবং ছোট মেমরি উভয় দিয়েই যাচাইকরণের অনুমতি দেয়। + +অ্যালগরিদমটি যে সাধারণ পথ গ্রহণ করে তা নিম্নরূপ: + +1. একটি **সীড** বিদ্যমান যা প্রতিটি ব্লকের জন্য সেই পর্যন্ত ব্লক হেডারগুলো স্ক্যান করে গণনা করা যেতে পারে। +2. সীড থেকে, একজন একটি **16 MB সিউডোর‍্যান্ডম ক্যাশে** গণনা করতে পারে। লাইট ক্লায়েন্টরা ক্যাশে সংরক্ষণ করে। +3. ক্যাশে থেকে, আমরা একটি **1 GB ডেটাসেট** তৈরি করতে পারি, এই বৈশিষ্ট্য সহ যে ডেটাসেটের প্রতিটি আইটেম ক্যাশে থেকে শুধুমাত্র অল্প সংখ্যক আইটেমের উপর নির্ভর করে। সম্পূর্ণ ক্লায়েন্ট এবং মাইনাররা ডেটাসেট সংরক্ষণ করে। ডেটাসেট সময়ের সাথে রৈখিকভাবে বৃদ্ধি পায়। +4. মাইনিং এর মধ্যে ডেটাসেটের র‍্যান্ডম স্লাইস গ্রহণ করা এবং সেগুলোকে একসাথে হ্যাস করা জড়িত। আপনার প্রয়োজনীয় ডেটাসেটের নির্দিষ্ট অংশগুলো পুনরায় তৈরি করতে ক্যাশে ব্যবহার করে কম মেমরির সাথে যাচাইকরণ করা যেতে পারে, তাই আপনাকে কেবল ক্যাশে সংরক্ষণ করতে হবে। + +বৃহৎ ডেটাসেটটি প্রতি 30000 ব্লকে একবার আপডেট করা হয়, তাই একজন মাইনারের প্রচেষ্টার বেশিরভাগই হবে ডেটাসেট পড়া, এতে পরিবর্তন করা নয়। + +## সংজ্ঞা {#definitions} + +আমরা নিম্নলিখিত সংজ্ঞাগুলো ব্যবহার করি: + +``` +WORD_BYTES = 4 # শব্দে বাইট +DATASET_BYTES_INIT = 2**30 # জেনেসিসে ডেটাসেটে বাইট +DATASET_BYTES_GROWTH = 2**23 # প্রতি ইপকে ডেটাসেট বৃদ্ধি +CACHE_BYTES_INIT = 2**24 # জেনেসিসে ক্যাশে বাইট +CACHE_BYTES_GROWTH = 2**17 # প্রতি ইপকে ক্যাশে বৃদ্ধি +CACHE_MULTIPLIER=1024 # ক্যাশের সাপেক্ষে DAG-এর আকার +EPOCH_LENGTH = 30000 # প্রতি ইপকে ব্লক +MIX_BYTES = 128 # মিক্সের প্রস্থ +HASH_BYTES = 64 # বাইটে হ্যাশের দৈর্ঘ্য +DATASET_PARENTS = 256 # প্রতিটি ডেটাসেট উপাদানের প্যারেন্টের সংখ্যা +CACHE_ROUNDS = 3 # ক্যাশে উৎপাদনে রাউন্ডের সংখ্যা +ACCESSES = 64 # হ্যাশিমোটো লুপে অ্যাক্সেসের সংখ্যা +``` + +### 'SHA3'-এর ব্যবহার {#sha3} + +Ethereum-এর ডেভেলপমেন্ট SHA3 স্ট্যান্ডার্ডের ডেভেলপমেন্টের সাথে একই সময়ে হয়েছিল, এবং +স্ট্যান্ডার্ড প্রক্রিয়াটি চূড়ান্ত হ্যাস অ্যালগরিদমের প্যাডিংয়ে একটি দেরীতে পরিবর্তন করেছিল, যাতে Ethereum-এর +"sha3_256" এবং "sha3_512" হ্যাসগুলো স্ট্যান্ডার্ড sha3 হ্যাস নয়, বরং একটি ভ্যারিয়েন্ট যা প্রায়শই +অন্যান্য প্রসঙ্গে "Keccak-256" এবং "Keccak-512" হিসাবে উল্লেখ করা হয়। আলোচনা দেখুন, যেমন, [এখানে](https://eips.ethereum.org/EIPS/eip-1803), [এখানে](http://ethereum.stackexchange.com/questions/550/which-cryptographic-hash-function-does-ethereum-use), অথবা [এখানে](http://bitcoin.stackexchange.com/questions/42055/what-is-the-approach-to-calculate-an-ethereum-address-from-a-256-bit-private-key/42057#42057)। + +অনুগ্রহ করে মনে রাখবেন যে নীচের অ্যালগরিদমের বিবরণে "sha3" হ্যাসগুলো উল্লেখ করা হয়েছে। + +## প্যারামিটার {#parameters} + +Ethash-এর ক্যাশে এবং ডেটাসেটের জন্য প্যারামিটারগুলো ব্লক নম্বরের উপর নির্ভর করে। ক্যাশে সাইজ এবং ডেটাসেট সাইজ উভয়ই রৈখিকভাবে বৃদ্ধি পায়; তবে, আমরা চক্রীয় আচরণের দিকে পরিচালিত করতে পারে এমন আকস্মিক নিয়মিততার ঝুঁকি কমাতে রৈখিকভাবে ক্রমবর্ধমান থ্রেশহোল্ডের নীচে সর্বোচ্চ প্রাইম সংখ্যাটি নিই। + +```python +def get_cache_size(block_number): + sz = CACHE_BYTES_INIT + CACHE_BYTES_GROWTH * (block_number // EPOCH_LENGTH) + sz -= HASH_BYTES + while not isprime(sz / HASH_BYTES): + sz -= 2 * HASH_BYTES + return sz + +def get_full_size(block_number): + sz = DATASET_BYTES_INIT + DATASET_BYTES_GROWTH * (block_number // EPOCH_LENGTH) + sz -= MIX_BYTES + while not isprime(sz / MIX_BYTES): + sz -= 2 * MIX_BYTES + return sz +``` + +ডেটাসেট এবং ক্যাশে সাইজের মানের সারণী পরিশিষ্টে সরবরাহ করা হয়েছে। + +## ক্যাশে জেনারেশন {#cache-generation} + +এখন, আমরা ক্যাশে তৈরির জন্য ফাংশনটি নির্দিষ্ট করছি: + +```python +def mkcache(cache_size, seed): + n = cache_size // HASH_BYTES + + # ক্রমানুসারে প্রাথমিক ডেটাসেট তৈরি করুন + o = [sha3_512(seed)] + for i in range(1, n): + o.append(sha3_512(o[-1])) + + # randmemohash এর একটি লো-রাউন্ড সংস্করণ ব্যবহার করুন + for _ in range(CACHE_ROUNDS): + for i in range(n): + v = o[i][0] % n + o[i] = sha3_512(map(xor, o[(i-1+n) % n], o[v])) + + return o +``` + +ক্যাশে উৎপাদন প্রক্রিয়ার মধ্যে প্রথমে ক্রমানুসারে 32 MB মেমরি পূরণ করা হয়, তারপর [_স্ট্রিক্ট মেমরি হার্ড হ্যাশিং ফাংশন_ (2014)](http://www.hashcash.org/papers/memohash.pdf) থেকে Sergio Demian Lerner-এর _RandMemoHash_ অ্যালগরিদমের দুটি পাস করা হয়। আউটপুটটি হল 524288টি 64-বাইট মানের একটি সেট। + +## ডেটা এগ্রিগেশন ফাংশন {#date-aggregation-function} + +আমরা কিছু ক্ষেত্রে XOR-এর একটি নন-অ্যাসোসিয়েটিভ বিকল্প হিসাবে [FNV হ্যাস](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) দ্বারা অনুপ্রাণিত একটি অ্যালগরিদম ব্যবহার করি। নোট করুন যে আমরা প্রাইমটিকে সম্পূর্ণ 32-বিট ইনপুটের সাথে গুণ করি, FNV-1 স্পেকের বিপরীতে যা প্রাইমটিকে এক বাইট (অক্টেট) দিয়ে পর্যায়ক্রমে গুণ করে। + +```python +FNV_PRIME = 0x01000193 + +def fnv(v1, v2): + return ((v1 * FNV_PRIME) ^ v2) % 2**32 +``` + +অনুগ্রহ করে মনে রাখবেন, যদিও ইয়েলো পেপারে fnv কে v1\*(FNV_PRIME ^ v2) হিসাবে নির্দিষ্ট করা হয়েছে, সমস্ত বর্তমান ইমপ্লিমেন্টেশন ধারাবাহিকভাবে উপরের সংজ্ঞাটি ব্যবহার করে। + +## সম্পূর্ণ ডেটাসেট গণনা {#full-dataset-calculation} + +সম্পূর্ণ 1 GB ডেটাসেটের প্রতিটি 64-বাইট আইটেম নিম্নরূপ গণনা করা হয়: + +```python +def calc_dataset_item(cache, i): + n = len(cache) + r = HASH_BYTES // WORD_BYTES + # মিক্স শুরু করুন + mix = copy.copy(cache[i % n]) + mix[0] ^= i + mix = sha3_512(mix) + # i-এর উপর ভিত্তি করে অনেক র‍্যান্ডম ক্যাশে নোডের সাথে এটিকে fnv করুন + for j in range(DATASET_PARENTS): + cache_index = fnv(i ^ j, mix[j % r]) + mix = map(fnv, mix, cache[cache_index % n]) + return sha3_512(mix) +``` + +মূলত, আমরা 256টি সিউডোর‍্যান্ডমলি নির্বাচিত ক্যাশে নোড থেকে ডেটা একত্রিত করি, এবং ডেটাসেট নোড গণনা করার জন্য এটিকে হ্যাস করি। সম্পূর্ণ ডেটাসেটটি তখন নিম্নলিখিতভাবে তৈরি করা হয়: + +```python +def calc_dataset(full_size, cache): + return [calc_dataset_item(cache, i) for i in range(full_size // HASH_BYTES)] +``` + +## প্রধান লুপ {#main-loop} + +এখন, আমরা প্রধান "হ্যাশিমোটো"-সদৃশ লুপটি নির্দিষ্ট করছি, যেখানে আমরা একটি নির্দিষ্ট হেডার এবং ননসের জন্য আমাদের চূড়ান্ত মান তৈরি করার জন্য সম্পূর্ণ ডেটাসেট থেকে ডেটা একত্রিত করি। নীচের কোডে, `header` একটি _ট্রাঙ্কেটেড_ ব্লক হেডারের RLP উপস্থাপনার SHA3-256 _হ্যাস_ প্রতিনিধিত্ব করে, অর্থাৎ, **mixHash** এবং **nonce** ক্ষেত্রগুলো বাদ দিয়ে একটি হেডার। `nonce` হলো বিগ-এন্ডিয়ান অর্ডারে একটি 64 বিট আনসাইন্ড ইন্টিজারের আট বাইট। সুতরাং `nonce[::-1]` হল সেই মানের আট-বাইট লিটল-এন্ডিয়ান উপস্থাপনা: + +```python +def hashimoto(header, nonce, full_size, dataset_lookup): + n = full_size / HASH_BYTES + w = MIX_BYTES // WORD_BYTES + mixhashes = MIX_BYTES / HASH_BYTES + # হেডার+ননসকে একটি 64 বাইট সীডে একত্রিত করুন + s = sha3_512(header + nonce[::-1]) + # রেপ্লিকেটেড s দিয়ে মিক্স শুরু করুন + mix = [] + for _ in range(MIX_BYTES / HASH_BYTES): + mix.extend(s) + # র‍্যান্ডম ডেটাসেট নোডগুলোতে মিক্স করুন + for i in range(ACCESSES): + p = fnv(i ^ s[0], mix[i % w]) % (n // mixhashes) * mixhashes + newdata = [] + for j in range(MIX_BYTES / HASH_BYTES): + newdata.extend(dataset_lookup(p + j)) + mix = map(fnv, mix, newdata) + # মিক্স কম্প্রেস করুন + cmix = [] + for i in range(0, len(mix), 4): + cmix.append(fnv(fnv(fnv(mix[i], mix[i+1]), mix[i+2]), mix[i+3])) + return { + "mix digest": serialize_hash(cmix), + "result": serialize_hash(sha3_256(s+cmix)) + } + +def hashimoto_light(full_size, cache, header, nonce): + return hashimoto(header, nonce, full_size, lambda x: calc_dataset_item(cache, x)) + +def hashimoto_full(full_size, dataset, header, nonce): + return hashimoto(header, nonce, full_size, lambda x: dataset[x]) +``` + +মূলত, আমরা একটি 128 বাইট চওড়া "মিক্স" বজায় রাখি, এবং বারবার ক্রমানুসারে সম্পূর্ণ ডেটাসেট থেকে 128 বাইট আনি এবং মিক্সের সাথে একত্রিত করার জন্য `fnv` ফাংশন ব্যবহার করি। 128 বাইটের সিকুয়েন্সিয়াল অ্যাক্সেস ব্যবহার করা হয় যাতে অ্যালগরিদমের প্রতিটি রাউন্ড সর্বদা RAM থেকে একটি সম্পূর্ণ পেজ নিয়ে আসে, যা ট্রান্সলেশন লুকাসাইড বাফার মিস কমিয়ে দেয় যা ASIC তাত্ত্বিকভাবে এড়াতে সক্ষম হবে। + +যদি এই অ্যালগরিদমের আউটপুট কাঙ্ক্ষিত লক্ষ্যের নিচে হয়, তবে ননসটি বৈধ। নোট করুন যে শেষে `sha3_256`-এর অতিরিক্ত প্রয়োগ নিশ্চিত করে যে একটি মধ্যবর্তী ননস বিদ্যমান যা প্রমাণ করতে প্রদান করা যেতে পারে যে অন্তত অল্প পরিমাণে কাজ করা হয়েছে; এই দ্রুত বাইরের PoW যাচাইকরণ অ্যান্টি-DDoS উদ্দেশ্যে ব্যবহার করা যেতে পারে। এটি পরিসংখ্যানগত নিশ্চয়তা প্রদান করতেও কাজ করে যে ফলাফলটি একটি নিরপেক্ষ, 256-বিট সংখ্যা। + +## মাইনিং {#mining} + +মাইনিং অ্যালগরিদমটি নিম্নরূপ সংজ্ঞায়িত করা হয়েছে: + +```python +def mine(full_size, dataset, header, difficulty): + # একই ডিজিটে হ্যাশের সাথে তুলনা করার জন্য টার্গেটকে জিরো-প্যাড করুন + target = zpad(encode_int(2**256 // difficulty), 64)[::-1] + from random import randint + nonce = randint(0, 2**64) + while hashimoto_full(full_size, dataset, header, nonce) > target: + nonce = (nonce + 1) % 2**64 + return nonce +``` + +## সীড হ্যাস সংজ্ঞায়িত করা {#seed-hash} + +একটি প্রদত্ত ব্লকের উপরে মাইন করার জন্য ব্যবহৃত সীড হ্যাস গণনা করার জন্য, আমরা নিম্নলিখিত অ্যালগরিদম ব্যবহার করি: + +```python + def get_seedhash(block): + s = '\x00' * 32 + for i in range(block.number // EPOCH_LENGTH): + s = serialize_hash(sha3_256(s)) + return s +``` + +নোট করুন যে মসৃণ মাইনিং এবং যাচাইকরণের জন্য, আমরা একটি পৃথক থ্রেডে ভবিষ্যতের সীডহ্যাস এবং ডেটাসেটগুলো আগে থেকে গণনা করার সুপারিশ করি। + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## পরিশিষ্ট {#appendix} + +আপনি যদি উপরের পাইথন স্পেকটিকে কোড হিসাবে চালাতে আগ্রহী হন তবে নিম্নলিখিত কোডটি আগে যুক্ত করা উচিত। + +```python +import sha3, copy + +# লিটল এন্ডিয়ান বিট অর্ডারিং ধরে নেয় (Intel আর্কিটেকচারের মতো) +def decode_int(s): + return int(s[::-1].encode('hex'), 16) if s else 0 + +def encode_int(s): + a = "%x" % s + return '' if s == 0 else ('0' * (len(a) % 2) + a).decode('hex')[::-1] + +def zpad(s, length): + return s + '\x00' * max(0, length - len(s)) + +def serialize_hash(h): + return ''.join([zpad(encode_int(x), 4) for x in h]) + +def deserialize_hash(h): + return [decode_int(h[i:i+WORD_BYTES]) for i in range(0, len(h), WORD_BYTES)] + +def hash_words(h, sz, x): + if isinstance(x, list): + x = serialize_hash(x) + y = h(x) + return deserialize_hash(y) + +def serialize_cache(ds): + return ''.join([serialize_hash(h) for h in ds]) + +serialize_dataset = serialize_cache + +# sha3 হ্যাস ফাংশন, 64 বাইট আউটপুট দেয় +def sha3_512(x): + return hash_words(lambda v: sha3.sha3_512(v).digest(), 64, x) + +def sha3_256(x): + return hash_words(lambda v: sha3.sha3_256(v).digest(), 32, x) + +def xor(a, b): + return a ^ b + +def isprime(x): + for i in range(2, int(x**0.5)): + if x % i == 0: + return False + return True +``` + +### ডেটা সাইজ {#data-sizes} + +নিম্নলিখিত লুকআপ টেবিলগুলো ডেটা সাইজ এবং ক্যাশে সাইজের প্রায় 2048টি সারণীবদ্ধ ইপক প্রদান করে। + +```python +def get_datasize(block_number): + return data_sizes[block_number // EPOCH_LENGTH] + +def get_cachesize(block_number): + return cache_sizes[block_number // EPOCH_LENGTH] + +data_sizes = [ +1073739904, 1082130304, 1090514816, 1098906752, 1107293056, +1115684224, 1124070016, 1132461952, 1140849536, 1149232768, +1157627776, 1166013824, 1174404736, 1182786944, 1191180416, +1199568512, 1207958912, 1216345216, 1224732032, 1233124736, +1241513344, 1249902464, 1258290304, 1266673792, 1275067264, +1283453312, 1291844992, 1300234112, 1308619904, 1317010048, +1325397376, 1333787776, 1342176128, 1350561664, 1358954368, +1367339392, 1375731584, 1384118144, 1392507008, 1400897408, +1409284736, 1417673344, 1426062464, 1434451072, 1442839168, +1451229056, 1459615616, 1468006016, 1476394112, 1484782976, +1493171584, 1501559168, 1509948032, 1518337664, 1526726528, +1535114624, 1543503488, 1551892096, 1560278656, 1568669056, +1577056384, 1585446272, 1593831296, 1602219392, 1610610304, +1619000192, 1627386752, 1635773824, 1644164224, 1652555648, +1660943488, 1669332608, 1677721216, 1686109312, 1694497664, +1702886272, 1711274624, 1719661184, 1728047744, 1736434816, +1744829056, 1753218944, 1761606272, 1769995904, 1778382464, +1786772864, 1795157888, 1803550592, 1811937664, 1820327552, +1828711552, 1837102976, 1845488768, 1853879936, 1862269312, +1870656896, 1879048064, 1887431552, 1895825024, 1904212096, +1912601216, 1920988544, 1929379456, 1937765504, 1946156672, +1954543232, 1962932096, 1971321728, 1979707264, 1988093056, +1996487552, 2004874624, 2013262208, 2021653888, 2030039936, +2038430848, 2046819968, 2055208576, 2063596672, 2071981952, +2080373632, 2088762752, 2097149056, 2105539712, 2113928576, +2122315136, 2130700672, 2139092608, 2147483264, 2155872128, +2164257664, 2172642176, 2181035392, 2189426048, 2197814912, +2206203008, 2214587264, 2222979712, 2231367808, 2239758208, +2248145024, 2256527744, 2264922752, 2273312128, 2281701248, +2290086272, 2298476672, 2306867072, 2315251072, 2323639168, +2332032128, 2340420224, 2348808064, 2357196416, 2365580416, +2373966976, 2382363008, 2390748544, 2399139968, 2407530368, +2415918976, 2424307328, 2432695424, 2441084288, 2449472384, +2457861248, 2466247808, 2474637184, 2483026816, 2491414144, +2499803776, 2508191872, 2516582272, 2524970368, 2533359232, +2541743488, 2550134144, 2558525056, 2566913408, 2575301504, +2583686528, 2592073856, 2600467328, 2608856192, 2617240448, +2625631616, 2634022016, 2642407552, 2650796416, 2659188352, +2667574912, 2675965312, 2684352896, 2692738688, 2701130624, +2709518464, 2717907328, 2726293376, 2734685056, 2743073152, +2751462016, 2759851648, 2768232832, 2776625536, 2785017728, +2793401984, 2801794432, 2810182016, 2818571648, 2826959488, +2835349376, 2843734144, 2852121472, 2860514432, 2868900992, +2877286784, 2885676928, 2894069632, 2902451584, 2910843008, +2919234688, 2927622784, 2936011648, 2944400768, 2952789376, +2961177728, 2969565568, 2977951616, 2986338944, 2994731392, +3003120256, 3011508352, 3019895936, 3028287104, 3036675968, +3045063808, 3053452928, 3061837696, 3070228352, 3078615424, +3087003776, 3095394944, 3103782272, 3112173184, 3120562048, +3128944768, 3137339264, 3145725056, 3154109312, 3162505088, +3170893184, 3179280256, 3187669376, 3196056704, 3204445568, +3212836736, 3221224064, 3229612928, 3238002304, 3246391168, +3254778496, 3263165824, 3271556224, 3279944576, 3288332416, +3296719232, 3305110912, 3313500032, 3321887104, 3330273152, +3338658944, 3347053184, 3355440512, 3363827072, 3372220288, +3380608384, 3388997504, 3397384576, 3405774208, 3414163072, +3422551936, 3430937984, 3439328384, 3447714176, 3456104576, +3464493952, 3472883584, 3481268864, 3489655168, 3498048896, +3506434432, 3514826368, 3523213952, 3531603584, 3539987072, +3548380288, 3556763264, 3565157248, 3573545344, 3581934464, +3590324096, 3598712704, 3607098752, 3615488384, 3623877248, +3632265856, 3640646528, 3649043584, 3657430144, 3665821568, +3674207872, 3682597504, 3690984832, 3699367808, 3707764352, +3716152448, 3724541056, 3732925568, 3741318016, 3749706368, +3758091136, 3766481536, 3774872704, 3783260032, 3791650432, +3800036224, 3808427648, 3816815488, 3825204608, 3833592704, +3841981568, 3850370432, 3858755968, 3867147904, 3875536256, +3883920512, 3892313728, 3900702592, 3909087872, 3917478784, +3925868416, 3934256512, 3942645376, 3951032192, 3959422336, +3967809152, 3976200064, 3984588416, 3992974976, 4001363584, +4009751168, 4018141312, 4026530432, 4034911616, 4043308928, +4051695488, 4060084352, 4068472448, 4076862848, 4085249408, +4093640576, 4102028416, 4110413696, 4118805632, 4127194496, +4135583104, 4143971968, 4152360832, 4160746112, 4169135744, +4177525888, 4185912704, 4194303616, 4202691968, 4211076736, +4219463552, 4227855488, 4236246656, 4244633728, 4253022848, +4261412224, 4269799808, 4278184832, 4286578048, 4294962304, +4303349632, 4311743104, 4320130432, 4328521088, 4336909184, +4345295488, 4353687424, 4362073472, 4370458496, 4378852736, +4387238528, 4395630208, 4404019072, 4412407424, 4420790656, +4429182848, 4437571456, 4445962112, 4454344064, 4462738048, +4471119232, 4479516544, 4487904128, 4496289664, 4504682368, +4513068416, 4521459584, 4529846144, 4538232704, 4546619776, +4555010176, 4563402112, 4571790208, 4580174464, 4588567936, +4596957056, 4605344896, 4613734016, 4622119808, 4630511488, +4638898816, 4647287936, 4655675264, 4664065664, 4672451968, +4680842624, 4689231488, 4697620352, 4706007424, 4714397056, +4722786176, 4731173248, 4739562368, 4747951744, 4756340608, +4764727936, 4773114496, 4781504384, 4789894784, 4798283648, +4806667648, 4815059584, 4823449472, 4831835776, 4840226176, +4848612224, 4857003392, 4865391488, 4873780096, 4882169728, +4890557312, 4898946944, 4907333248, 4915722368, 4924110976, +4932499328, 4940889728, 4949276032, 4957666432, 4966054784, +4974438016, 4982831488, 4991221376, 4999607168, 5007998848, +5016386432, 5024763776, 5033164672, 5041544576, 5049941888, +5058329728, 5066717056, 5075107456, 5083494272, 5091883904, +5100273536, 5108662144, 5117048192, 5125436032, 5133827456, +5142215296, 5150605184, 5158993024, 5167382144, 5175769472, +5184157568, 5192543872, 5200936064, 5209324928, 5217711232, +5226102656, 5234490496, 5242877312, 5251263872, 5259654016, +5268040832, 5276434304, 5284819328, 5293209728, 5301598592, +5309986688, 5318374784, 5326764416, 5335151488, 5343542144, +5351929472, 5360319872, 5368706944, 5377096576, 5385484928, +5393871232, 5402263424, 5410650496, 5419040384, 5427426944, +5435816576, 5444205952, 5452594816, 5460981376, 5469367936, +5477760896, 5486148736, 5494536832, 5502925952, 5511315328, +5519703424, 5528089984, 5536481152, 5544869504, 5553256064, +5561645696, 5570032768, 5578423936, 5586811264, 5595193216, +5603585408, 5611972736, 5620366208, 5628750464, 5637143936, +5645528192, 5653921408, 5662310272, 5670694784, 5679082624, +5687474048, 5695864448, 5704251008, 5712641408, 5721030272, +5729416832, 5737806208, 5746194304, 5754583936, 5762969984, +5771358592, 5779748224, 5788137856, 5796527488, 5804911232, +5813300608, 5821692544, 5830082176, 5838468992, 5846855552, +5855247488, 5863636096, 5872024448, 5880411008, 5888799872, +5897186432, 5905576832, 5913966976, 5922352768, 5930744704, +5939132288, 5947522432, 5955911296, 5964299392, 5972688256, +5981074304, 5989465472, 5997851008, 6006241408, 6014627968, +6023015552, 6031408256, 6039796096, 6048185216, 6056574848, +6064963456, 6073351808, 6081736064, 6090128768, 6098517632, +6106906496, 6115289216, 6123680896, 6132070016, 6140459648, +6148849024, 6157237376, 6165624704, 6174009728, 6182403712, +6190792064, 6199176064, 6207569792, 6215952256, 6224345216, +6232732544, 6241124224, 6249510272, 6257899136, 6266287744, +6274676864, 6283065728, 6291454336, 6299843456, 6308232064, +6316620928, 6325006208, 6333395584, 6341784704, 6350174848, +6358562176, 6366951296, 6375337856, 6383729536, 6392119168, +6400504192, 6408895616, 6417283456, 6425673344, 6434059136, +6442444672, 6450837376, 6459223424, 6467613056, 6476004224, +6484393088, 6492781952, 6501170048, 6509555072, 6517947008, +6526336384, 6534725504, 6543112832, 6551500672, 6559888768, +6568278656, 6576662912, 6585055616, 6593443456, 6601834112, +6610219648, 6618610304, 6626999168, 6635385472, 6643777408, +6652164224, 6660552832, 6668941952, 6677330048, 6685719424, +6694107776, 6702493568, 6710882176, 6719274112, 6727662976, +6736052096, 6744437632, 6752825984, 6761213824, 6769604224, +6777993856, 6786383488, 6794770816, 6803158144, 6811549312, +6819937664, 6828326528, 6836706176, 6845101696, 6853491328, +6861880448, 6870269312, 6878655104, 6887046272, 6895433344, +6903822208, 6912212864, 6920596864, 6928988288, 6937377152, +6945764992, 6954149248, 6962544256, 6970928768, 6979317376, +6987709312, 6996093824, 7004487296, 7012875392, 7021258624, +7029652352, 7038038912, 7046427776, 7054818944, 7063207808, +7071595136, 7079980928, 7088372608, 7096759424, 7105149824, +7113536896, 7121928064, 7130315392, 7138699648, 7147092352, +7155479168, 7163865728, 7172249984, 7180648064, 7189036672, +7197424768, 7205810816, 7214196608, 7222589824, 7230975104, +7239367552, 7247755904, 7256145536, 7264533376, 7272921472, +7281308032, 7289694848, 7298088832, 7306471808, 7314864512, +7323253888, 7331643008, 7340029568, 7348419712, 7356808832, +7365196672, 7373585792, 7381973888, 7390362752, 7398750592, +7407138944, 7415528576, 7423915648, 7432302208, 7440690304, +7449080192, 7457472128, 7465860992, 7474249088, 7482635648, +7491023744, 7499412608, 7507803008, 7516192384, 7524579968, +7532967296, 7541358464, 7549745792, 7558134656, 7566524032, +7574912896, 7583300992, 7591690112, 7600075136, 7608466816, +7616854912, 7625244544, 7633629824, 7642020992, 7650410368, +7658794112, 7667187328, 7675574912, 7683961984, 7692349568, +7700739712, 7709130368, 7717519232, 7725905536, 7734295424, +7742683264, 7751069056, 7759457408, 7767849088, 7776238208, +7784626816, 7793014912, 7801405312, 7809792128, 7818179968, +7826571136, 7834957184, 7843347328, 7851732352, 7860124544, +7868512384, 7876902016, 7885287808, 7893679744, 7902067072, +7910455936, 7918844288, 7927230848, 7935622784, 7944009344, +7952400256, 7960786048, 7969176704, 7977565312, 7985953408, +7994339968, 8002730368, 8011119488, 8019508096, 8027896192, +8036285056, 8044674688, 8053062272, 8061448832, 8069838464, +8078227328, 8086616704, 8095006592, 8103393664, 8111783552, +8120171392, 8128560256, 8136949376, 8145336704, 8153726848, +8162114944, 8170503296, 8178891904, 8187280768, 8195669632, +8204058496, 8212444544, 8220834176, 8229222272, 8237612672, +8246000768, 8254389376, 8262775168, 8271167104, 8279553664, +8287944064, 8296333184, 8304715136, 8313108352, 8321497984, +8329885568, 8338274432, 8346663296, 8355052928, 8363441536, +8371828352, 8380217984, 8388606592, 8396996224, 8405384576, +8413772672, 8422161536, 8430549376, 8438939008, 8447326592, +8455715456, 8464104832, 8472492928, 8480882048, 8489270656, +8497659776, 8506045312, 8514434944, 8522823808, 8531208832, +8539602304, 8547990656, 8556378752, 8564768384, 8573154176, +8581542784, 8589933952, 8598322816, 8606705024, 8615099264, +8623487872, 8631876992, 8640264064, 8648653952, 8657040256, +8665430656, 8673820544, 8682209152, 8690592128, 8698977152, +8707374464, 8715763328, 8724151424, 8732540032, 8740928384, +8749315712, 8757704576, 8766089344, 8774480768, 8782871936, +8791260032, 8799645824, 8808034432, 8816426368, 8824812928, +8833199488, 8841591424, 8849976448, 8858366336, 8866757248, +8875147136, 8883532928, 8891923328, 8900306816, 8908700288, +8917088384, 8925478784, 8933867392, 8942250368, 8950644608, +8959032704, 8967420544, 8975809664, 8984197504, 8992584064, +9000976256, 9009362048, 9017752448, 9026141312, 9034530688, +9042917504, 9051307904, 9059694208, 9068084864, 9076471424, +9084861824, 9093250688, 9101638528, 9110027648, 9118416512, +9126803584, 9135188096, 9143581312, 9151969664, 9160356224, +9168747136, 9177134464, 9185525632, 9193910144, 9202302848, +9210690688, 9219079552, 9227465344, 9235854464, 9244244864, +9252633472, 9261021824, 9269411456, 9277799296, 9286188928, +9294574208, 9302965888, 9311351936, 9319740032, 9328131968, +9336516736, 9344907392, 9353296768, 9361685888, 9370074752, +9378463616, 9386849408, 9395239808, 9403629184, 9412016512, +9420405376, 9428795008, 9437181568, 9445570688, 9453960832, +9462346624, 9470738048, 9479121536, 9487515008, 9495903616, +9504289664, 9512678528, 9521067904, 9529456256, 9537843584, +9546233728, 9554621312, 9563011456, 9571398784, 9579788672, +9588178304, 9596567168, 9604954496, 9613343104, 9621732992, +9630121856, 9638508416, 9646898816, 9655283584, 9663675776, +9672061312, 9680449664, 9688840064, 9697230464, 9705617536, +9714003584, 9722393984, 9730772608, 9739172224, 9747561088, +9755945344, 9764338816, 9772726144, 9781116544, 9789503872, +9797892992, 9806282624, 9814670464, 9823056512, 9831439232, +9839833984, 9848224384, 9856613504, 9865000576, 9873391232, +9881772416, 9890162816, 9898556288, 9906940544, 9915333248, +9923721088, 9932108672, 9940496512, 9948888448, 9957276544, +9965666176, 9974048384, 9982441088, 9990830464, 9999219584, +10007602816, 10015996544, 10024385152, 10032774016, 10041163648, +10049548928, 10057940096, 10066329472, 10074717824, 10083105152, +10091495296, 10099878784, 10108272256, 10116660608, 10125049216, +10133437312, 10141825664, 10150213504, 10158601088, 10166991232, +10175378816, 10183766144, 10192157312, 10200545408, 10208935552, +10217322112, 10225712768, 10234099328, 10242489472, 10250876032, +10259264896, 10267656064, 10276042624, 10284429184, 10292820352, +10301209472, 10309598848, 10317987712, 10326375296, 10334763392, +10343153536, 10351541632, 10359930752, 10368318592, 10376707456, +10385096576, 10393484672, 10401867136, 10410262144, 10418647424, +10427039104, 10435425664, 10443810176, 10452203648, 10460589952, +10468982144, 10477369472, 10485759104, 10494147712, 10502533504, +10510923392, 10519313536, 10527702656, 10536091264, 10544478592, +10552867712, 10561255808, 10569642368, 10578032768, 10586423168, +10594805632, 10603200128, 10611588992, 10619976064, 10628361344, +10636754048, 10645143424, 10653531776, 10661920384, 10670307968, +10678696832, 10687086464, 10695475072, 10703863168, 10712246144, +10720639616, 10729026688, 10737414784, 10745806208, 10754190976, +10762581376, 10770971264, 10779356288, 10787747456, 10796135552, +10804525184, 10812915584, 10821301888, 10829692288, 10838078336, +10846469248, 10854858368, 10863247232, 10871631488, 10880023424, +10888412032, 10896799616, 10905188992, 10913574016, 10921964672, +10930352768, 10938742912, 10947132544, 10955518592, 10963909504, +10972298368, 10980687488, 10989074816, 10997462912, 11005851776, +11014241152, 11022627712, 11031017344, 11039403904, 11047793024, +11056184704, 11064570752, 11072960896, 11081343872, 11089737856, +11098128256, 11106514816, 11114904448, 11123293568, 11131680128, +11140065152, 11148458368, 11156845696, 11165236864, 11173624192, +11182013824, 11190402688, 11198790784, 11207179136, 11215568768, +11223957376, 11232345728, 11240734592, 11249122688, 11257511296, +11265899648, 11274285952, 11282675584, 11291065472, 11299452544, +11307842432, 11316231296, 11324616832, 11333009024, 11341395584, +11349782656, 11358172288, 11366560384, 11374950016, 11383339648, +11391721856, 11400117376, 11408504192, 11416893568, 11425283456, +11433671552, 11442061184, 11450444672, 11458837888, 11467226752, +11475611776, 11484003968, 11492392064, 11500780672, 11509169024, +11517550976, 11525944448, 11534335616, 11542724224, 11551111808, +11559500672, 11567890304, 11576277376, 11584667008, 11593056128, +11601443456, 11609830016, 11618221952, 11626607488, 11634995072, +11643387776, 11651775104, 11660161664, 11668552576, 11676940928, +11685330304, 11693718656, 11702106496, 11710496128, 11718882688, +11727273088, 11735660416, 11744050048, 11752437376, 11760824704, +11769216128, 11777604736, 11785991296, 11794381952, 11802770048, +11811157888, 11819548544, 11827932544, 11836324736, 11844713344, +11853100928, 11861486464, 11869879936, 11878268032, 11886656896, +11895044992, 11903433088, 11911822976, 11920210816, 11928600448, +11936987264, 11945375872, 11953761152, 11962151296, 11970543488, +11978928512, 11987320448, 11995708288, 12004095104, 12012486272, +12020875136, 12029255552, 12037652096, 12046039168, 12054429568, +12062813824, 12071206528, 12079594624, 12087983744, 12096371072, +12104759936, 12113147264, 12121534592, 12129924992, 12138314624, +12146703232, 12155091584, 12163481216, 12171864704, 12180255872, +12188643968, 12197034112, 12205424512, 12213811328, 12222199424, +12230590336, 12238977664, 12247365248, 12255755392, 12264143488, +12272531584, 12280920448, 12289309568, 12297694592, 12306086528, +12314475392, 12322865024, 12331253632, 12339640448, 12348029312, +12356418944, 12364805248, 12373196672, 12381580928, 12389969024, +12398357632, 12406750592, 12415138432, 12423527552, 12431916416, +12440304512, 12448692352, 12457081216, 12465467776, 12473859968, +12482245504, 12490636672, 12499025536, 12507411584, 12515801728, +12524190592, 12532577152, 12540966272, 12549354368, 12557743232, +12566129536, 12574523264, 12582911872, 12591299456, 12599688064, +12608074624, 12616463488, 12624845696, 12633239936, 12641631616, +12650019968, 12658407296, 12666795136, 12675183232, 12683574656, +12691960192, 12700350592, 12708740224, 12717128576, 12725515904, +12733906816, 12742295168, 12750680192, 12759071872, 12767460736, +12775848832, 12784236928, 12792626816, 12801014656, 12809404288, +12817789312, 12826181504, 12834568832, 12842954624, 12851345792, +12859732352, 12868122496, 12876512128, 12884901248, 12893289088, +12901672832, 12910067584, 12918455168, 12926842496, 12935232896, +12943620736, 12952009856, 12960396928, 12968786816, 12977176192, +12985563776, 12993951104, 13002341504, 13010730368, 13019115392, +13027506304, 13035895168, 13044272512, 13052673152, 13061062528, +13069446272, 13077838976, 13086227072, 13094613632, 13103000192, +13111393664, 13119782528, 13128157568, 13136559232, 13144945024, +13153329536, 13161724288, 13170111872, 13178502784, 13186884736, +13195279744, 13203667072, 13212057472, 13220445824, 13228832128, +13237221248, 13245610624, 13254000512, 13262388352, 13270777472, +13279166336, 13287553408, 13295943296, 13304331904, 13312719488, +13321108096, 13329494656, 13337885824, 13346274944, 13354663808, +13363051136, 13371439232, 13379825024, 13388210816, 13396605056, +13404995456, 13413380224, 13421771392, 13430159744, 13438546048, +13446937216, 13455326848, 13463708288, 13472103808, 13480492672, +13488875648, 13497269888, 13505657728, 13514045312, 13522435712, +13530824576, 13539210112, 13547599232, 13555989376, 13564379008, +13572766336, 13581154432, 13589544832, 13597932928, 13606320512, +13614710656, 13623097472, 13631477632, 13639874944, 13648264064, +13656652928, 13665041792, 13673430656, 13681818496, 13690207616, +13698595712, 13706982272, 13715373184, 13723762048, 13732150144, +13740536704, 13748926592, 13757316224, 13765700992, 13774090112, +13782477952, 13790869376, 13799259008, 13807647872, 13816036736, +13824425344, 13832814208, 13841202304, 13849591424, 13857978752, +13866368896, 13874754688, 13883145344, 13891533184, 13899919232, +13908311168, 13916692096, 13925085056, 13933473152, 13941866368, +13950253696, 13958643584, 13967032192, 13975417216, 13983807616, +13992197504, 14000582272, 14008973696, 14017363072, 14025752192, +14034137984, 14042528384, 14050918016, 14059301504, 14067691648, +14076083584, 14084470144, 14092852352, 14101249664, 14109635968, +14118024832, 14126407552, 14134804352, 14143188608, 14151577984, +14159968384, 14168357248, 14176741504, 14185127296, 14193521024, +14201911424, 14210301824, 14218685056, 14227067264, 14235467392, +14243855488, 14252243072, 14260630144, 14269021568, 14277409408, +14285799296, 14294187904, 14302571392, 14310961792, 14319353728, +14327738752, 14336130944, 14344518784, 14352906368, 14361296512, +14369685376, 14378071424, 14386462592, 14394848128, 14403230848, +14411627392, 14420013952, 14428402304, 14436793472, 14445181568, +14453569664, 14461959808, 14470347904, 14478737024, 14487122816, +14495511424, 14503901824, 14512291712, 14520677504, 14529064832, +14537456768, 14545845632, 14554234496, 14562618496, 14571011456, +14579398784, 14587789184, 14596172672, 14604564608, 14612953984, +14621341312, 14629724288, 14638120832, 14646503296, 14654897536, +14663284864, 14671675264, 14680061056, 14688447616, 14696835968, +14705228416, 14713616768, 14722003328, 14730392192, 14738784128, +14747172736, 14755561088, 14763947648, 14772336512, 14780725376, +14789110144, 14797499776, 14805892736, 14814276992, 14822670208, +14831056256, 14839444352, 14847836032, 14856222848, 14864612992, +14872997504, 14881388672, 14889775744, 14898165376, 14906553472, +14914944896, 14923329664, 14931721856, 14940109696, 14948497024, +14956887424, 14965276544, 14973663616, 14982053248, 14990439808, +14998830976, 15007216768, 15015605888, 15023995264, 15032385152, +15040768384, 15049154944, 15057549184, 15065939072, 15074328448, +15082715008, 15091104128, 15099493504, 15107879296, 15116269184, +15124659584, 15133042304, 15141431936, 15149824384, 15158214272, +15166602368, 15174991232, 15183378304, 15191760512, 15200154496, +15208542592, 15216931712, 15225323392, 15233708416, 15242098048, +15250489216, 15258875264, 15267265408, 15275654528, 15284043136, +15292431488, 15300819584, 15309208192, 15317596544, 15325986176, +15334374784, 15342763648, 15351151744, 15359540608, 15367929728, +15376318336, 15384706432, 15393092992, 15401481856, 15409869952, +15418258816, 15426649984, 15435037568, 15443425664, 15451815296, +15460203392, 15468589184, 15476979328, 15485369216, 15493755776, +15502146944, 15510534272, 15518924416, 15527311232, 15535699072, +15544089472, 15552478336, 15560866688, 15569254528, 15577642624, +15586031488, 15594419072, 15602809472, 15611199104, 15619586432, +15627975296, 15636364928, 15644753792, 15653141888, 15661529216, +15669918848, 15678305152, 15686696576, 15695083136, 15703474048, +15711861632, 15720251264, 15728636288, 15737027456, 15745417088, +15753804928, 15762194048, 15770582656, 15778971008, 15787358336, +15795747712, 15804132224, 15812523392, 15820909696, 15829300096, +15837691264, 15846071936, 15854466944, 15862855808, 15871244672, +15879634816, 15888020608, 15896409728, 15904799104, 15913185152, +15921577088, 15929966464, 15938354816, 15946743424, 15955129472, +15963519872, 15971907968, 15980296064, 15988684928, 15997073024, +16005460864, 16013851264, 16022241152, 16030629248, 16039012736, +16047406976, 16055794816, 16064181376, 16072571264, 16080957824, +16089346688, 16097737856, 16106125184, 16114514816, 16122904192, +16131292544, 16139678848, 16148066944, 16156453504, 16164839552, +16173236096, 16181623424, 16190012032, 16198401152, 16206790528, +16215177344, 16223567744, 16231956352, 16240344704, 16248731008, +16257117824, 16265504384, 16273898624, 16282281856, 16290668672, +16299064192, 16307449216, 16315842176, 16324230016, 16332613504, +16341006464, 16349394304, 16357783168, 16366172288, 16374561664, +16382951296, 16391337856, 16399726208, 16408116352, 16416505472, +16424892032, 16433282176, 16441668224, 16450058624, 16458448768, +16466836864, 16475224448, 16483613056, 16492001408, 16500391808, +16508779648, 16517166976, 16525555328, 16533944192, 16542330752, +16550719616, 16559110528, 16567497088, 16575888512, 16584274816, +16592665472, 16601051008, 16609442944, 16617832064, 16626218624, +16634607488, 16642996096, 16651385728, 16659773824, 16668163712, +16676552576, 16684938112, 16693328768, 16701718144, 16710095488, +16718492288, 16726883968, 16735272832, 16743661184, 16752049792, +16760436608, 16768827008, 16777214336, 16785599104, 16793992832, +16802381696, 16810768768, 16819151744, 16827542656, 16835934848, +16844323712, 16852711552, 16861101952, 16869489536, 16877876864, +16886265728, 16894653056, 16903044736, 16911431296, 16919821696, +16928207488, 16936592768, 16944987776, 16953375616, 16961763968, +16970152832, 16978540928, 16986929536, 16995319168, 17003704448, +17012096896, 17020481152, 17028870784, 17037262208, 17045649536, +17054039936, 17062426496, 17070814336, 17079205504, 17087592064, +17095978112, 17104369024, 17112759424, 17121147776, 17129536384, +17137926016, 17146314368, 17154700928, 17163089792, 17171480192, +17179864192, 17188256896, 17196644992, 17205033856, 17213423488, +17221811072, 17230198912, 17238588032, 17246976896, 17255360384, +17263754624, 17272143232, 17280530048, 17288918912, 17297309312, +17305696384, 17314085504, 17322475136, 17330863744, 17339252096, +17347640192, 17356026496, 17364413824, 17372796544, 17381190016, +17389583488, 17397972608, 17406360704, 17414748544, 17423135872, +17431527296, 17439915904, 17448303232, 17456691584, 17465081728, +17473468288, 17481857408, 17490247552, 17498635904, 17507022464, +17515409024, 17523801728, 17532189824, 17540577664, 17548966016, +17557353344, 17565741184, 17574131584, 17582519168, 17590907008, +17599296128, 17607687808, 17616076672, 17624455808, 17632852352, +17641238656, 17649630848, 17658018944, 17666403968, 17674794112, +17683178368, 17691573376, 17699962496, 17708350592, 17716739968, +17725126528, 17733517184, 17741898112, 17750293888, 17758673024, +17767070336, 17775458432, 17783848832, 17792236928, 17800625536, +17809012352, 17817402752, 17825785984, 17834178944, 17842563968, +17850955648, 17859344512, 17867732864, 17876119424, 17884511872, +17892900224, 17901287296, 17909677696, 17918058112, 17926451072, +17934843776, 17943230848, 17951609216, 17960008576, 17968397696, +17976784256, 17985175424, 17993564032, 18001952128, 18010339712, +18018728576, 18027116672, 18035503232, 18043894144, 18052283264, +18060672128, 18069056384, 18077449856, 18085837184, 18094225792, +18102613376, 18111004544, 18119388544, 18127781248, 18136170368, +18144558976, 18152947328, 18161336192, 18169724288, 18178108544, +18186498944, 18194886784, 18203275648, 18211666048, 18220048768, +18228444544, 18236833408, 18245220736] + +cache_sizes = [ +16776896, 16907456, 17039296, 17170112, 17301056, 17432512, 17563072, +17693888, 17824192, 17955904, 18087488, 18218176, 18349504, 18481088, +18611392, 18742336, 18874304, 19004224, 19135936, 19267264, 19398208, +19529408, 19660096, 19791424, 19922752, 20053952, 20184896, 20315968, +20446912, 20576576, 20709184, 20840384, 20971072, 21102272, 21233216, +21364544, 21494848, 21626816, 21757376, 21887552, 22019392, 22151104, +22281536, 22412224, 22543936, 22675264, 22806464, 22935872, 23068096, +23198272, 23330752, 23459008, 23592512, 23723968, 23854912, 23986112, +24116672, 24247616, 24378688, 24509504, 24640832, 24772544, 24903488, +25034432, 25165376, 25296704, 25427392, 25558592, 25690048, 25820096, +25951936, 26081728, 26214208, 26345024, 26476096, 26606656, 26737472, +26869184, 26998208, 27131584, 27262528, 27393728, 27523904, 27655744, +27786688, 27917888, 28049344, 28179904, 28311488, 28441792, 28573504, +28700864, 28835648, 28966208, 29096768, 29228608, 29359808, 29490752, +29621824, 29752256, 29882816, 30014912, 30144448, 30273728, 30406976, +30538432, 30670784, 30799936, 30932672, 31063744, 31195072, 31325248, +31456192, 31588288, 31719232, 31850432, 31981504, 32110784, 32243392, +32372672, 32505664, 32636608, 32767808, 32897344, 33029824, 33160768, +33289664, 33423296, 33554368, 33683648, 33816512, 33947456, 34076992, +34208704, 34340032, 34471744, 34600256, 34734016, 34864576, 34993984, +35127104, 35258176, 35386688, 35518528, 35650624, 35782336, 35910976, +36044608, 36175808, 36305728, 36436672, 36568384, 36699968, 36830656, +36961984, 37093312, 37223488, 37355072, 37617472, 37747904, +37879232, 38009792, 38141888, 38272448, 38403392, 38535104, 38660672, +38795584, 38925632, 39059264, 39190336, 39320768, 39452096, 39581632, +39713984, 39844928, 39974848, 40107968, 40238144, 40367168, 40500032, +40631744, 40762816, 40894144, 41023552, 41155904, 41286208, 41418304, +41547712, 41680448, 41811904, 41942848, 42073792, 42204992, 42334912, +42467008, 42597824, 42729152, 42860096, 42991552, 43122368, 43253696, +43382848, 43515712, 43646912, 43777088, 43907648, 44039104, 44170432, +44302144, 44433344, 44564288, 44694976, 44825152, 44956864, 45088448, +45219008, 45350464, 45481024, 45612608, 45744064, 45874496, 46006208, +46136768, 46267712, 46399424, 46529344, 46660672, 46791488, 46923328, +47053504, 47185856, 47316928, 47447872, 47579072, 47710144, 47839936, +47971648, 48103232, 48234176, 48365248, 48496192, 48627136, 48757312, +48889664, 49020736, 49149248, 49283008, 49413824, 49545152, 49675712, +49807168, 49938368, 50069056, 50200256, 50331584, 50462656, 50593472, +50724032, 50853952, 50986048, 51117632, 51248576, 51379904, 51510848, +51641792, 51773248, 51903296, 52035136, 52164032, 52297664, 52427968, +52557376, 52690112, 52821952, 52952896, 53081536, 53213504, 53344576, +53475776, 53608384, 53738816, 53870528, 54000832, 54131776, 54263744, +54394688, 54525248, 54655936, 54787904, 54918592, 55049152, 55181248, +55312064, 55442752, 55574336, 55705024, 55836224, 55967168, 56097856, +56228672, 56358592, 56490176, 56621888, 56753728, 56884928, 57015488, +57146816, 57278272, 57409216, 57540416, 57671104, 57802432, 57933632, +58064576, 58195264, 58326976, 58457408, 58588864, 58720192, 58849984, +58981696, 59113024, 59243456, 59375552, 59506624, 59637568, 59768512, +59897792, 60030016, 60161984, 60293056, 60423872, 60554432, 60683968, +60817216, 60948032, 61079488, 61209664, 61341376, 61471936, 61602752, +61733696, 61865792, 61996736, 62127808, 62259136, 62389568, 62520512, +62651584, 62781632, 62910784, 63045056, 63176128, 63307072, 63438656, +63569216, 63700928, 63831616, 63960896, 64093888, 64225088, 64355392, +64486976, 64617664, 64748608, 64879424, 65009216, 65142464, 65273792, +65402816, 65535424, 65666752, 65797696, 65927744, 66060224, 66191296, +66321344, 66453056, 66584384, 66715328, 66846656, 66977728, 67108672, +67239104, 67370432, 67501888, 67631296, 67763776, 67895104, 68026304, +68157248, 68287936, 68419264, 68548288, 68681408, 68811968, 68942912, +69074624, 69205568, 69337024, 69467584, 69599168, 69729472, 69861184, +69989824, 70122944, 70253888, 70385344, 70515904, 70647232, 70778816, +70907968, 71040832, 71171648, 71303104, 71432512, 71564992, 71695168, +71826368, 71958464, 72089536, 72219712, 72350144, 72482624, 72613568, +72744512, 72875584, 73006144, 73138112, 73268672, 73400128, 73530944, +73662272, 73793344, 73924544, 74055104, 74185792, 74316992, 74448832, +74579392, 74710976, 74841664, 74972864, 75102784, 75233344, 75364544, +75497024, 75627584, 75759296, 75890624, 76021696, 76152256, 76283072, +76414144, 76545856, 76676672, 76806976, 76937792, 77070016, 77200832, +77331392, 77462464, 77593664, 77725376, 77856448, 77987776, 78118336, +78249664, 78380992, 78511424, 78642496, 78773056, 78905152, 79033664, +79166656, 79297472, 79429568, 79560512, 79690816, 79822784, 79953472, +80084672, 80214208, 80346944, 80477632, 80608576, 80740288, 80870848, +81002048, 81133504, 81264448, 81395648, 81525952, 81657536, 81786304, +81919808, 82050112, 82181312, 82311616, 82443968, 82573376, 82705984, +82835776, 82967744, 83096768, 83230528, 83359552, 83491264, 83622464, +83753536, 83886016, 84015296, 84147776, 84277184, 84409792, 84540608, +84672064, 84803008, 84934336, 85065152, 85193792, 85326784, 85458496, +85589312, 85721024, 85851968, 85982656, 86112448, 86244416, 86370112, +86506688, 86637632, 86769344, 86900672, 87031744, 87162304, 87293632, +87424576, 87555392, 87687104, 87816896, 87947968, 88079168, 88211264, +88341824, 88473152, 88603712, 88735424, 88862912, 88996672, 89128384, +89259712, 89390272, 89521984, 89652544, 89783872, 89914816, 90045376, +90177088, 90307904, 90438848, 90569152, 90700096, 90832832, 90963776, +91093696, 91223744, 91356992, 91486784, 91618496, 91749824, 91880384, +92012224, 92143552, 92273344, 92405696, 92536768, 92666432, 92798912, +92926016, 93060544, 93192128, 93322816, 93453632, 93583936, 93715136, +93845056, 93977792, 94109504, 94240448, 94371776, 94501184, 94632896, +94764224, 94895552, 95023424, 95158208, 95287744, 95420224, 95550016, +95681216, 95811904, 95943872, 96075328, 96203584, 96337856, 96468544, +96599744, 96731072, 96860992, 96992576, 97124288, 97254848, 97385536, +97517248, 97647808, 97779392, 97910464, 98041408, 98172608, 98303168, +98434496, 98565568, 98696768, 98827328, 98958784, 99089728, 99220928, +99352384, 99482816, 99614272, 99745472, 99876416, 100007104, +100138048, 100267072, 100401088, 100529984, 100662592, 100791872, +100925248, 101056064, 101187392, 101317952, 101449408, 101580608, +101711296, 101841728, 101973824, 102104896, 102235712, 102366016, +102498112, 102628672, 102760384, 102890432, 103021888, 103153472, +103284032, 103415744, 103545152, 103677248, 103808576, 103939648, +104070976, 104201792, 104332736, 104462528, 104594752, 104725952, +104854592, 104988608, 105118912, 105247808, 105381184, 105511232, +105643072, 105774784, 105903296, 106037056, 106167872, 106298944, +106429504, 106561472, 106691392, 106822592, 106954304, 107085376, +107216576, 107346368, 107478464, 107609792, 107739712, 107872192, +108003136, 108131392, 108265408, 108396224, 108527168, 108657344, +108789568, 108920384, 109049792, 109182272, 109312576, 109444928, +109572928, 109706944, 109837888, 109969088, 110099648, 110230976, +110362432, 110492992, 110624704, 110755264, 110886208, 111017408, +111148864, 111279296, 111410752, 111541952, 111673024, 111803456, +111933632, 112066496, 112196416, 112328512, 112457792, 112590784, +112715968, 112852672, 112983616, 113114944, 113244224, 113376448, +113505472, 113639104, 113770304, 113901376, 114031552, 114163264, +114294592, 114425536, 114556864, 114687424, 114818624, 114948544, +115080512, 115212224, 115343296, 115473472, 115605184, 115736128, +115867072, 115997248, 116128576, 116260288, 116391488, 116522944, +116652992, 116784704, 116915648, 117046208, 117178304, 117308608, +117440192, 117569728, 117701824, 117833024, 117964096, 118094656, +118225984, 118357312, 118489024, 118617536, 118749632, 118882112, +119012416, 119144384, 119275328, 119406016, 119537344, 119668672, +119798464, 119928896, 120061376, 120192832, 120321728, 120454336, +120584512, 120716608, 120848192, 120979136, 121109056, 121241408, +121372352, 121502912, 121634752, 121764416, 121895744, 122027072, +122157632, 122289088, 122421184, 122550592, 122682944, 122813888, +122945344, 123075776, 123207488, 123338048, 123468736, 123600704, +123731264, 123861952, 123993664, 124124608, 124256192, 124386368, +124518208, 124649024, 124778048, 124911296, 125041088, 125173696, +125303744, 125432896, 125566912, 125696576, 125829056, 125958592, +126090304, 126221248, 126352832, 126483776, 126615232, 126746432, +126876608, 127008704, 127139392, 127270336, 127401152, 127532224, +127663552, 127794752, 127925696, 128055232, 128188096, 128319424, +128449856, 128581312, 128712256, 128843584, 128973632, 129103808, +129236288, 129365696, 129498944, 129629888, 129760832, 129892288, +130023104, 130154048, 130283968, 130416448, 130547008, 130678336, +130807616, 130939456, 131071552, 131202112, 131331776, 131464384, +131594048, 131727296, 131858368, 131987392, 132120256, 132250816, +132382528, 132513728, 132644672, 132774976, 132905792, 133038016, +133168832, 133299392, 133429312, 133562048, 133692992, 133823296, +133954624, 134086336, 134217152, 134348608, 134479808, 134607296, +134741056, 134872384, 135002944, 135134144, 135265472, 135396544, +135527872, 135659072, 135787712, 135921472, 136052416, 136182848, +136313792, 136444864, 136576448, 136707904, 136837952, 136970048, +137099584, 137232064, 137363392, 137494208, 137625536, 137755712, +137887424, 138018368, 138149824, 138280256, 138411584, 138539584, +138672832, 138804928, 138936128, 139066688, 139196864, 139328704, +139460032, 139590208, 139721024, 139852864, 139984576, 140115776, +140245696, 140376512, 140508352, 140640064, 140769856, 140902336, +141032768, 141162688, 141294016, 141426496, 141556544, 141687488, +141819584, 141949888, 142080448, 142212544, 142342336, 142474432, +142606144, 142736192, 142868288, 142997824, 143129408, 143258944, +143392448, 143523136, 143653696, 143785024, 143916992, 144045632, +144177856, 144309184, 144440768, 144570688, 144701888, 144832448, +144965056, 145096384, 145227584, 145358656, 145489856, 145620928, +145751488, 145883072, 146011456, 146144704, 146275264, 146407232, +146538176, 146668736, 146800448, 146931392, 147062336, 147193664, +147324224, 147455936, 147586624, 147717056, 147848768, 147979456, +148110784, 148242368, 148373312, 148503232, 148635584, 148766144, +148897088, 149028416, 149159488, 149290688, 149420224, 149551552, +149683136, 149814976, 149943616, 150076352, 150208064, 150338624, +150470464, 150600256, 150732224, 150862784, 150993088, 151125952, +151254976, 151388096, 151519168, 151649728, 151778752, 151911104, +152042944, 152174144, 152304704, 152435648, 152567488, 152698816, +152828992, 152960576, 153091648, 153222976, 153353792, 153484096, +153616192, 153747008, 153878336, 154008256, 154139968, 154270912, +154402624, 154533824, 154663616, 154795712, 154926272, 155057984, +155188928, 155319872, 155450816, 155580608, 155712064, 155843392, +155971136, 156106688, 156237376, 156367424, 156499264, 156630976, +156761536, 156892352, 157024064, 157155008, 157284416, 157415872, +157545536, 157677248, 157810496, 157938112, 158071744, 158203328, +158334656, 158464832, 158596288, 158727616, 158858048, 158988992, +159121216, 159252416, 159381568, 159513152, 159645632, 159776192, +159906496, 160038464, 160169536, 160300352, 160430656, 160563008, +160693952, 160822208, 160956352, 161086784, 161217344, 161349184, +161480512, 161611456, 161742272, 161873216, 162002752, 162135872, +162266432, 162397888, 162529216, 162660032, 162790976, 162922048, +163052096, 163184576, 163314752, 163446592, 163577408, 163707968, +163839296, 163969984, 164100928, 164233024, 164364224, 164494912, +164625856, 164756672, 164887616, 165019072, 165150016, 165280064, +165412672, 165543104, 165674944, 165805888, 165936832, 166067648, +166198336, 166330048, 166461248, 166591552, 166722496, 166854208, +166985408, 167116736, 167246656, 167378368, 167508416, 167641024, +167771584, 167903168, 168034112, 168164032, 168295744, 168427456, +168557632, 168688448, 168819136, 168951616, 169082176, 169213504, +169344832, 169475648, 169605952, 169738048, 169866304, 169999552, +170131264, 170262464, 170393536, 170524352, 170655424, 170782016, +170917696, 171048896, 171179072, 171310784, 171439936, 171573184, +171702976, 171835072, 171966272, 172097216, 172228288, 172359232, +172489664, 172621376, 172747712, 172883264, 173014208, 173144512, +173275072, 173407424, 173539136, 173669696, 173800768, 173931712, +174063424, 174193472, 174325696, 174455744, 174586816, 174718912, +174849728, 174977728, 175109696, 175242688, 175374272, 175504832, +175636288, 175765696, 175898432, 176028992, 176159936, 176291264, +176422592, 176552512, 176684864, 176815424, 176946496, 177076544, +177209152, 177340096, 177470528, 177600704, 177731648, 177864256, +177994816, 178126528, 178257472, 178387648, 178518464, 178650176, +178781888, 178912064, 179044288, 179174848, 179305024, 179436736, +179568448, 179698496, 179830208, 179960512, 180092608, 180223808, +180354752, 180485696, 180617152, 180748096, 180877504, 181009984, +181139264, 181272512, 181402688, 181532608, 181663168, 181795136, +181926592, 182057536, 182190016, 182320192, 182451904, 182582336, +182713792, 182843072, 182976064, 183107264, 183237056, 183368384, +183494848, 183631424, 183762752, 183893824, 184024768, 184154816, +184286656, 184417984, 184548928, 184680128, 184810816, 184941248, +185072704, 185203904, 185335616, 185465408, 185596352, 185727296, +185859904, 185989696, 186121664, 186252992, 186383552, 186514112, +186645952, 186777152, 186907328, 187037504, 187170112, 187301824, +187429184, 187562048, 187693504, 187825472, 187957184, 188087104, +188218304, 188349376, 188481344, 188609728, 188743616, 188874304, +189005248, 189136448, 189265088, 189396544, 189528128, 189660992, +189791936, 189923264, 190054208, 190182848, 190315072, 190447424, +190577984, 190709312, 190840768, 190971328, 191102656, 191233472, +191364032, 191495872, 191626816, 191758016, 191888192, 192020288, +192148928, 192282176, 192413504, 192542528, 192674752, 192805952, +192937792, 193068608, 193198912, 193330496, 193462208, 193592384, +193723456, 193854272, 193985984, 194116672, 194247232, 194379712, +194508352, 194641856, 194772544, 194900672, 195035072, 195166016, +195296704, 195428032, 195558592, 195690304, 195818176, 195952576, +196083392, 196214336, 196345792, 196476736, 196607552, 196739008, +196869952, 197000768, 197130688, 197262784, 197394368, 197523904, +197656384, 197787584, 197916608, 198049472, 198180544, 198310208, +198442432, 198573632, 198705088, 198834368, 198967232, 199097792, +199228352, 199360192, 199491392, 199621696, 199751744, 199883968, +200014016, 200146624, 200276672, 200408128, 200540096, 200671168, +200801984, 200933312, 201062464, 201194944, 201326144, 201457472, +201588544, 201719744, 201850816, 201981632, 202111552, 202244032, +202374464, 202505152, 202636352, 202767808, 202898368, 203030336, +203159872, 203292608, 203423296, 203553472, 203685824, 203816896, +203947712, 204078272, 204208192, 204341056, 204472256, 204603328, +204733888, 204864448, 204996544, 205125568, 205258304, 205388864, +205517632, 205650112, 205782208, 205913536, 206044736, 206176192, +206307008, 206434496, 206569024, 206700224, 206831168, 206961856, +207093056, 207223616, 207355328, 207486784, 207616832, 207749056, +207879104, 208010048, 208141888, 208273216, 208404032, 208534336, +208666048, 208796864, 208927424, 209059264, 209189824, 209321792, +209451584, 209582656, 209715136, 209845568, 209976896, 210106432, +210239296, 210370112, 210501568, 210630976, 210763712, 210894272, +211024832, 211156672, 211287616, 211418176, 211549376, 211679296, +211812032, 211942592, 212074432, 212204864, 212334016, 212467648, +212597824, 212727616, 212860352, 212991424, 213120832, 213253952, +213385024, 213515584, 213645632, 213777728, 213909184, 214040128, +214170688, 214302656, 214433728, 214564544, 214695232, 214826048, +214956992, 215089088, 215219776, 215350592, 215482304, 215613248, +215743552, 215874752, 216005312, 216137024, 216267328, 216399296, +216530752, 216661696, 216790592, 216923968, 217054528, 217183168, +217316672, 217448128, 217579072, 217709504, 217838912, 217972672, +218102848, 218233024, 218364736, 218496832, 218627776, 218759104, +218888896, 219021248, 219151936, 219281728, 219413056, 219545024, +219675968, 219807296, 219938624, 220069312, 220200128, 220331456, +220461632, 220592704, 220725184, 220855744, 220987072, 221117888, +221249216, 221378368, 221510336, 221642048, 221772736, 221904832, +222031808, 222166976, 222297536, 222428992, 222559936, 222690368, +222820672, 222953152, 223083968, 223213376, 223345984, 223476928, +223608512, 223738688, 223869376, 224001472, 224132672, 224262848, +224394944, 224524864, 224657344, 224788288, 224919488, 225050432, +225181504, 225312704, 225443776, 225574592, 225704768, 225834176, +225966784, 226097216, 226229824, 226360384, 226491712, 226623424, +226754368, 226885312, 227015104, 227147456, 227278528, 227409472, +227539904, 227669696, 227802944, 227932352, 228065216, 228196288, +228326464, 228457792, 228588736, 228720064, 228850112, 228981056, +229113152, 229243328, 229375936, 229505344, 229636928, 229769152, +229894976, 230030272, 230162368, 230292416, 230424512, 230553152, +230684864, 230816704, 230948416, 231079616, 231210944, 231342016, +231472448, 231603776, 231733952, 231866176, 231996736, 232127296, +232259392, 232388672, 232521664, 232652608, 232782272, 232914496, +233043904, 233175616, 233306816, 233438528, 233569984, 233699776, +233830592, 233962688, 234092224, 234221888, 234353984, 234485312, +234618304, 234749888, 234880832, 235011776, 235142464, 235274048, +235403456, 235535936, 235667392, 235797568, 235928768, 236057152, +236190272, 236322752, 236453312, 236583616, 236715712, 236846528, +236976448, 237108544, 237239104, 237371072, 237501632, 237630784, +237764416, 237895232, 238026688, 238157632, 238286912, 238419392, +238548032, 238681024, 238812608, 238941632, 239075008, 239206336, +239335232, 239466944, 239599168, 239730496, 239861312, 239992384, +240122816, 240254656, 240385856, 240516928, 240647872, 240779072, +240909632, 241040704, 241171904, 241302848, 241433408, 241565248, +241696192, 241825984, 241958848, 242088256, 242220224, 242352064, +242481856, 242611648, 242744896, 242876224, 243005632, 243138496, +243268672, 243400384, 243531712, 243662656, 243793856, 243924544, +244054592, 244187072, 244316608, 244448704, 244580032, 244710976, +244841536, 244972864, 245104448, 245233984, 245365312, 245497792, +245628736, 245759936, 245889856, 246021056, 246152512, 246284224, +246415168, 246545344, 246675904, 246808384, 246939584, 247070144, +247199552, 247331648, 247463872, 247593536, 247726016, 247857088, +247987648, 248116928, 248249536, 248380736, 248512064, 248643008, +248773312, 248901056, 249036608, 249167552, 249298624, 249429184, +249560512, 249692096, 249822784, 249954112, 250085312, 250215488, +250345792, 250478528, 250608704, 250739264, 250870976, 251002816, +251133632, 251263552, 251395136, 251523904, 251657792, 251789248, +251919424, 252051392, 252182464, 252313408, 252444224, 252575552, +252706624, 252836032, 252968512, 253099712, 253227584, 253361728, +253493056, 253623488, 253754432, 253885504, 254017216, 254148032, +254279488, 254410432, 254541376, 254672576, 254803264, 254933824, +255065792, 255196736, 255326528, 255458752, 255589952, 255721408, +255851072, 255983296, 256114624, 256244416, 256374208, 256507712, +256636096, 256768832, 256900544, 257031616, 257162176, 257294272, +257424448, 257555776, 257686976, 257818432, 257949632, 258079552, +258211136, 258342464, 258473408, 258603712, 258734656, 258867008, +258996544, 259127744, 259260224, 259391296, 259522112, 259651904, +259784384, 259915328, 260045888, 260175424, 260308544, 260438336, +260570944, 260700992, 260832448, 260963776, 261092672, 261226304, +261356864, 261487936, 261619648, 261750592, 261879872, 262011968, +262143424, 262274752, 262404416, 262537024, 262667968, 262799296, +262928704, 263061184, 263191744, 263322944, 263454656, 263585216, +263716672, 263847872, 263978944, 264108608, 264241088, 264371648, +264501184, 264632768, 264764096, 264895936, 265024576, 265158464, +265287488, 265418432, 265550528, 265681216, 265813312, 265943488, +266075968, 266206144, 266337728, 266468032, 266600384, 266731072, +266862272, 266993344, 267124288, 267255616, 267386432, 267516992, +267648704, 267777728, 267910592, 268040512, 268172096, 268302784, +268435264, 268566208, 268696256, 268828096, 268959296, 269090368, +269221312, 269352256, 269482688, 269614784, 269745856, 269876416, +270007616, 270139328, 270270272, 270401216, 270531904, 270663616, +270791744, 270924736, 271056832, 271186112, 271317184, 271449536, +271580992, 271711936, 271843136, 271973056, 272105408, 272236352, +272367296, 272498368, 272629568, 272759488, 272891456, 273022784, +273153856, 273284672, 273415616, 273547072, 273677632, 273808448, +273937088, 274071488, 274200896, 274332992, 274463296, 274595392, +274726208, 274857536, 274988992, 275118656, 275250496, 275382208, +275513024, 275643968, 275775296, 275906368, 276037184, 276167872, +276297664, 276429376, 276560576, 276692672, 276822976, 276955072, +277085632, 277216832, 277347008, 277478848, 277609664, 277740992, +277868608, 278002624, 278134336, 278265536, 278395328, 278526784, +278657728, 278789824, 278921152, 279052096, 279182912, 279313088, +279443776, 279576256, 279706048, 279838528, 279969728, 280099648, +280230976, 280361408, 280493632, 280622528, 280755392, 280887104, +281018176, 281147968, 281278912, 281411392, 281542592, 281673152, +281803712, 281935552, 282066496, 282197312, 282329024, 282458816, +282590272, 282720832, 282853184, 282983744, 283115072, 283246144, +283377344, 283508416, 283639744, 283770304, 283901504, 284032576, +284163136, 284294848, 284426176, 284556992, 284687296, 284819264, +284950208, 285081536] +``` diff --git a/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md new file mode 100644 index 00000000000..3ad27677755 --- /dev/null +++ b/public/content/translations/bn/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/index.md @@ -0,0 +1,42 @@ +--- +title: "মাইনিং অ্যালগরিদম সমূহ" +description: "ইথেরিয়াম মাইনিং-এর জন্য ব্যবহৃত অ্যালগরিদমগুলির একটি বিশদ বিবরণ।" +lang: bn +--- + + + + + +প্রুফ-অফ-ওয়ার্ক আর ইথেরিয়ামের কনসেন্সাস মেকানিজমের ভিত্তি নয়, যার অর্থ মাইনিং বন্ধ করে দেওয়া হয়েছে। পরিবর্তে, ইথেরিয়াম ভ্যালিডেটরদের দ্বারা সুরক্ষিত যারা ETH স্টেক করে। আপনি আজই আপনার ETH স্টেকিং শুরু করতে পারেন। The Merge, প্রুফ-অফ-স্টেক, এবং স্টেকিং সম্পর্কে আরও পড়ুন। এই পৃষ্ঠাটি শুধুমাত্র ঐতিহাসিক আগ্রহের জন্য। + + + + +ইথেরিয়াম মাইনিং Ethash নামে পরিচিত একটি অ্যালগরিদম ব্যবহার করত। অ্যালগরিদমটির মূল ধারণাটি হলো, একজন মাইনার ব্রুট ফোর্স কম্পিউটেশন ব্যবহার করে একটি নন্স ইনপুট খুঁজে বের করার চেষ্টা করে যাতে ফলস্বরূপ হ্যাসটি গণনা করা কঠিনতা দ্বারা নির্ধারিত একটি থ্রেশহোল্ডের চেয়ে ছোট হয়। এই কঠিনতার স্তরটি গতিশীলভাবে সামঞ্জস্য করা যেতে পারে, যা একটি নিয়মিত ব্যবধানে ব্লক উৎপাদন হতে দেয়। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালোভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে [প্রুফ-অফ-ওয়ার্ক কনসেন্সাস](/developers/docs/consensus-mechanisms/pow) এবং [মাইনিং](/developers/docs/consensus-mechanisms/pow/mining) সম্পর্কে পড়ে নেওয়ার পরামর্শ দিচ্ছি। + +## Dagger Hashimoto {#dagger-hashimoto} + +Dagger Hashimoto ছিল ইথেরিয়াম মাইনিং-এর জন্য একটি পূর্বসূরী গবেষণা অ্যালগরিদম যা Ethash দ্বারা প্রতিস্থাপিত হয়েছিল। এটি দুটি ভিন্ন অ্যালগরিদমের সংমিশ্রণ ছিল: Dagger এবং Hashimoto। এটি শুধুমাত্র একটি গবেষণা বাস্তবায়ন ছিল এবং ইথেরিয়াম মেইননেট চালু হওয়ার সময় Ethash দ্বারা প্রতিস্থাপিত হয়েছিল। + +[Dagger](http://www.hashcash.org/papers/dagger.html) একটি [ডিরেক্টেড অ্যাসাইক্লিক গ্রাফ](https://en.wikipedia.org/wiki/Directed_acyclic_graph) তৈরি করে, যার র‍্যান্ডম স্লাইসগুলিকে একসাথে হ্যাস করা হয়। মূল নীতিটি হলো প্রতিটি নন্সের জন্য একটি বড় মোট ডেটা ট্রি-এর শুধুমাত্র একটি ছোট অংশ প্রয়োজন। প্রতিটি নন্সের জন্য সাবট্রি পুনর্গণনা করা মাইনিং-এর জন্য বাধা সৃষ্টিকারী - তাই ট্রি সংরক্ষণ করার প্রয়োজন - কিন্তু একটি একক নন্সের ভেরিফিকেশনের জন্য ঠিক আছে। Dagger-কে Scrypt-এর মতো বিদ্যমান অ্যালগরিদমগুলির একটি বিকল্প হিসাবে ডিজাইন করা হয়েছিল, যা মেমরি-হার্ড কিন্তু যখন তাদের মেমরি-হার্ডনেস প্রকৃত সুরক্ষিত স্তরে বৃদ্ধি পায় তখন যাচাই করা কঠিন। তবে, Dagger শেয়ারড মেমরি হার্ডওয়্যার অ্যাক্সিলারেশনের জন্য ঝুঁকিপূর্ণ ছিল এবং গবেষণার অন্যান্য পথের জন্য এটি বাতিল করা হয়েছিল। + +[Hashimoto](http://diyhpl.us/%7Ebryan/papers2/bitcoin/meh/hashimoto.pdf) এমন একটি অ্যালগরিদম যা I/O বাউন্ড (অর্থাৎ, মাইনিং প্রক্রিয়ায় মেমরি রিডগুলি হলো সীমাবদ্ধকারী ফ্যাক্টর) হওয়ার মাধ্যমে ASIC-প্রতিরোধ ক্ষমতা যোগ করে। তত্ত্বটি হলো কম্পিউটেশনের চেয়ে RAM বেশি উপলব্ধ; বিভিন্ন ব্যবহারের ক্ষেত্রে RAM অপ্টিমাইজ করার জন্য ইতিমধ্যে বিলিয়ন ডলার মূল্যের গবেষণা করা হয়েছে, যা প্রায়শই র‍্যান্ডম অ্যাক্সেস প্যাটার্ন জড়িত থাকে (তাই “র‍্যান্ডম অ্যাক্সেস মেমরি”)। ফলস্বরূপ, বিদ্যমান RAM সম্ভবত অ্যালগরিদম মূল্যায়নের জন্য সর্বোত্তমের বেশ কাছাকাছি। Hashimoto ডেটার উৎস হিসাবে ব্লকচেইন ব্যবহার করে, যা একই সাথে উপরের (1) এবং (3) পূরণ করে। + +Dagger-Hashimoto, Dagger এবং Hashimoto অ্যালগরিদমের সংশোধিত সংস্করণ ব্যবহার করেছে। Dagger Hashimoto এবং Hashimoto-এর মধ্যে পার্থক্য হলো, ডেটার উৎস হিসাবে ব্লকচেইন ব্যবহার করার পরিবর্তে, Dagger Hashimoto একটি কাস্টম-জেনারেটেড ডেটা সেট ব্যবহার করে, যা প্রতি N ব্লকে ব্লক ডেটার উপর ভিত্তি করে আপডেট হয়। ডেটা সেটটি Dagger অ্যালগরিদম ব্যবহার করে তৈরি করা হয়, যা লাইট ক্লায়েন্ট ভেরিফিকেশন অ্যালগরিদমের জন্য প্রতিটি নন্সের জন্য নির্দিষ্ট একটি সাবসেট দক্ষতার সাথে গণনা করার অনুমতি দেয়। Dagger Hashimoto এবং Dagger-এর মধ্যে পার্থক্য হলো, আসল Dagger-এর থেকে ভিন্ন, ব্লক কোয়েরি করার জন্য ব্যবহৃত ডেটাসেটটি আধা-স্থায়ী, যা শুধুমাত্র মাঝে মাঝে বিরতিতে (যেমন, প্রতি সপ্তাহে একবার) আপডেট করা হয়। এর মানে হলো যে ডেটাসেট তৈরি করার প্রচেষ্টার অংশ প্রায় শূন্যের কাছাকাছি, তাই শেয়ার্ড মেমরি স্পিডআপ সংক্রান্ত সার্জিও লার্নারের যুক্তিগুলি নগণ্য হয়ে যায়। + +[Dagger-Hashimoto](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/dagger-hashimoto)-এর উপর আরও তথ্য। + +## Ethash {#ethash} + +Ethash ছিল সেই মাইনিং অ্যালগরিদম যা এখন অপ্রচলিত প্রুফ-অফ-ওয়ার্ক আর্কিটেকচারের অধীনে আসল ইথেরিয়াম মেইননেটে ব্যবহৃত হয়েছিল। অ্যালগরিদমটি উল্লেখযোগ্যভাবে আপডেট হওয়ার পরে Dagger-Hashimoto-এর একটি নির্দিষ্ট সংস্করণকে কার্যকরভাবে Ethash নামটি দেওয়া হয়েছিল, যদিও এটি তার পূর্বসূরীর মৌলিক নীতিগুলি উত্তরাধিকার সূত্রে পেয়েছিল। ইথেরিয়াম মেইননেট শুধুমাত্র Ethash ব্যবহার করেছে - Dagger Hashimoto ছিল মাইনিং অ্যালগরিদমের একটি R&D সংস্করণ যা ইথেরিয়াম মেইননেটে মাইনিং শুরু হওয়ার আগে প্রতিস্থাপিত হয়েছিল। + +[Ethash](/developers/docs/consensus-mechanisms/pow/mining/mining-algorithms/ethash)-এর উপর আরও তথ্য। + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/dapps/index.md b/public/content/translations/bn/developers/docs/dapps/index.md new file mode 100644 index 00000000000..1c94216390a --- /dev/null +++ b/public/content/translations/bn/developers/docs/dapps/index.md @@ -0,0 +1,96 @@ +--- +title: "ডিএ্যাপস এর প্রযুক্তিগত পরিচিতি" +description: +lang: bn +--- + +একটি ডিসেন্ট্রালাইজড এপ্লিকেশন (ডিএ্যাপ) হল একটি বিকেন্দ্রীভূত নেটওয়ার্কে নির্মিত একটি এপ্লিকেশন যা একটি [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) এবং একটি ফ্রন্টএন্ড ইউজার ইন্টারফেসকে একত্রিত করে। Ethereum-এ, স্মার্ট কন্ট্র্যাক্টগুলি অ্যাক্সেসযোগ্য এবং স্বচ্ছ – যেমন ওপেন APIs – তাই আপনার ডিএ্যাপ-এ এমন একটি স্মার্ট কন্ট্র্যাক্টও অন্তর্ভুক্ত থাকতে পারে যা অন্য কেউ লিখেছে। + +## পূর্বশর্ত {#prerequisites} + +ডিএ্যাপস সম্পর্কে শেখার আগে, আপনার [ব্লকচেইনের মূল বিষয়গুলো](/developers/docs/intro-to-ethereum/) কভার করা উচিত এবং Ethereum নেটওয়ার্ক ও এটি কীভাবে বিকেন্দ্রীভূত হয় সে সম্পর্কে পড়া উচিত। + +## একটি ডিএ্যাপ-এর সংজ্ঞা {#definition-of-a-dapp} + +একটি ডিএ্যাপ-এর ব্যাকএন্ড কোড একটি বিকেন্দ্রীভূত পিয়ার-টু-পিয়ার নেটওয়ার্কে চলে। একটি অ্যাপের সাথে এর তুলনা করুন যেখানে ব্যাকএন্ড কোড কেন্দ্রীয় সার্ভারে চলছে। + +একটি ডিএ্যাপ-এর ফ্রন্টএন্ড কোড এবং ইউজার ইন্টারফেস যেকোনো ভাষায় লেখা যেতে পারে (ঠিক একটি অ্যাপের মতো) যা এর ব্যাকএন্ডে কল করার জন্য ব্যবহৃত হয়। অধিকন্তু, এর ফ্রন্টএন্ড [IPFS](https://ipfs.io/)-এর মতো বিকেন্দ্রীভূত স্টোরেজে হোস্ট করা যেতে পারে। + +- **বিকেন্দ্রীভূত** - ডিএ্যাপস Ethereum-এ কাজ করে, যা একটি উন্মুক্ত পাবলিক বিকেন্দ্রীভূত প্ল্যাটফর্ম যেখানে কোনো ব্যক্তি বা গোষ্ঠীর নিয়ন্ত্রণ নেই। +- **ডিটারমিনিস্টিক** - ডিএ্যাপস যে পরিবেশে চালানো হোক না কেন, একই ফাংশন সম্পাদন করে। +- **ট্যুরিং কমপ্লিট** - প্রয়োজনীয় রিসোর্স দেওয়া হলে ডিএ্যাপস যেকোনো কাজ সম্পাদন করতে পারে। +- **আইসোলেটেড** - ডিএ্যাপস ইথিরিয়াম ভার্চুয়াল মেশিন নামে পরিচিত একটি ভার্চুয়াল পরিবেশে কার্যকর করা হয়, যাতে স্মার্ট কন্ট্র্যাক্টে কোনো বাগ থাকলেও এটি ব্লকচেইন নেটওয়ার্কের স্বাভাবিক কার্যকারিতায় বাধা দেবে না। + +### স্মার্ট কন্ট্র্যাক্ট প্রসঙ্গে {#on-smart-contracts} + +ডিএ্যাপস এর পরিচয় দিতে হলে, আমাদের স্মার্ট কন্ট্র্যাক্টগুলির পরিচয় দিতে হবে – যা ভাল কোনও শব্দের অভাবে একটি ডিএ্যাপ-এর ব্যাকএন্ড। বিস্তারিত বিবরণের জন্য, আমাদের [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) সম্পর্কিত বিভাগে যান। + +একটি স্মার্ট কন্ট্র্যাক্ট হল কোড যা Ethereum ব্লকচেইনে থাকে এবং ঠিক প্রোগ্রাম অনুযায়ী চলে। একবার স্মার্ট কন্ট্র্যাক্টগুলি নেটওয়ার্কে ডিপ্লয় করা হলে আপনি সেগুলি পরিবর্তন করতে পারবেন না। ডিএ্যাপস বিকেন্দ্রীভূত হতে পারে কারণ সেগুলি কন্ট্র্যাক্টে লেখা যুক্তি দ্বারা নিয়ন্ত্রিত হয়, কোনো ব্যক্তি বা কোম্পানির দ্বারা নয়। এর মানে হল আপনাকে আপনার কন্ট্র্যাক্টগুলি খুব সাবধানে ডিজাইন করতে হবে এবং সেগুলি পুঙ্খানুপুঙ্খভাবে পরীক্ষা করতে হবে। + +## ডিএ্যাপ ডেভেলপমেন্টের সুবিধা {#benefits-of-dapp-development} + +- **জিরো ডাউনটাইম** – একবার ব্লকচেইনে স্মার্ট কন্ট্র্যাক্টটি ডিপ্লয় করা হলে, পুরো নেটওয়ার্কটি সর্বদা কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করতে চাওয়া ক্লায়েন্টদের পরিষেবা দিতে সক্ষম হবে। অতএব, ক্ষতিকারক অ্যাক্টররা ব্যক্তিগত ডিএ্যাপস-কে লক্ষ্য করে ডিনায়াল-অফ-সার্ভিস অ্যাটাক চালাতে পারে না। +- **গোপনীয়তা** – একটি ডিএ্যাপ ডিপ্লয় বা তার সাথে ইন্টারঅ্যাক্ট করার জন্য আপনাকে বাস্তব-জগতের পরিচয় প্রদান করতে হবে না। +- **সেন্সরশিপ প্রতিরোধ** – নেটওয়ার্কের কোনো একক সত্তা ব্যবহারকারীদের লেনদেন জমা দেওয়া, ডিএ্যাপস ডিপ্লয় করা, বা ব্লকচেইন থেকে ডেটা পড়া থেকে ব্লক করতে পারে না। +- **সম্পূর্ণ ডেটা ইন্টিগ্রিটি** – ব্লকচেইনে সংরক্ষিত ডেটা অপরিবর্তনীয় এবং অকাট্য, ক্রিপ্টোগ্রাফিক প্রিমিটিভের জন্য ধন্যবাদ। ক্ষতিকারক অ্যাক্টররা লেনদেন বা অন্যান্য ডেটা যা ইতিমধ্যে পাবলিক করা হয়েছে তা জালিয়াতি করতে পারে না। +- **ট্রাস্টলেস কম্পিউটেশন/যাচাইযোগ্য আচরণ** – স্মার্ট কন্ট্র্যাক্ট বিশ্লেষণ করা যেতে পারে এবং একটি কেন্দ্রীয় কর্তৃপক্ষকে বিশ্বাস করার প্রয়োজন ছাড়াই অনুমানযোগ্য উপায়ে কার্যকর করার গ্যারান্টি দেওয়া হয়। প্রচলিত মডেলগুলিতে এটি সত্য নয়; উদাহরণস্বরূপ, যখন আমরা অনলাইন ব্যাংকিং সিস্টেম ব্যবহার করি, তখন আমাদের বিশ্বাস করতে হবে যে আর্থিক প্রতিষ্ঠানগুলি আমাদের আর্থিক ডেটার অপব্যবহার করবে না, রেকর্ডে গরমিল করবে না, বা হ্যাক হবে না। + +## ডিএ্যাপ ডেভেলপমেন্টের অসুবিধা {#drawbacks-of-dapp-development} + +- **রক্ষণাবেক্ষণ** – ডিএ্যাপস রক্ষণাবেক্ষণ করা কঠিন হতে পারে কারণ ব্লকচেইনে প্রকাশিত কোড এবং ডেটা পরিবর্তন করা কঠিন। ডেভেলপারদের জন্য তাদের ডিএ্যাপস-এ (বা একটি ডিএ্যাপ দ্বারা সংরক্ষিত অন্তর্নিহিত ডেটা) আপডেট করা কঠিন, একবার সেগুলি ডিপ্লয় করা হলে, এমনকি যদি পুরনো সংস্করণে বাগ বা নিরাপত্তা ঝুঁকি চিহ্নিত করা হয়। +- **পারফরম্যান্স ওভারহেড** – একটি বিশাল পারফরম্যান্স ওভারহেড আছে, এবং স্কেলিং সত্যিই কঠিন। Ethereum যে স্তরের নিরাপত্তা, অখণ্ডতা, স্বচ্ছতা এবং নির্ভরযোগ্যতা অর্জনের আকাঙ্ক্ষা করে, তা অর্জনের জন্য প্রতিটি নোড প্রতিটি লেনদেন চালায় এবং সংরক্ষণ করে। এর উপরে, প্রুফ-অফ-স্টেক কনসেন্সাস-এও সময় লাগে। +- **নেটওয়ার্ক কনজেশন** – যখন একটি ডিএ্যাপ খুব বেশি কম্পিউটেশনাল রিসোর্স ব্যবহার করে, তখন পুরো নেটওয়ার্ক ব্যাক আপ হয়ে যায়। বর্তমানে, নেটওয়ার্কটি প্রতি সেকেন্ডে প্রায় 10-15টি লেনদেন প্রক্রিয়া করতে পারে; যদি এর চেয়ে দ্রুত লেনদেন পাঠানো হয়, তাহলে অপরিশোধিত লেনদেনের পুল দ্রুত ফুলে উঠতে পারে। +- **ব্যবহারকারীর অভিজ্ঞতা** – ব্যবহারকারী-বান্ধব অভিজ্ঞতা তৈরি করা কঠিন হতে পারে কারণ গড় শেষ-ব্যবহারকারী একটি সত্যিকারের নিরাপদ ফ্যাশনে ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করার জন্য প্রয়োজনীয় একটি টুল স্ট্যাক সেট আপ করা খুব কঠিন মনে করতে পারে। +- **কেন্দ্রীকরণ** – Ethereum-এর বেস লেয়ারের উপরে নির্মিত ব্যবহারকারী-বান্ধব এবং ডেভেলপার-বান্ধব সমাধানগুলি শেষ পর্যন্ত কেন্দ্রীয় পরিষেবার মতো দেখতে হতে পারে। উদাহরণস্বরূপ, এই ধরনের পরিষেবাগুলি সার্ভার-সাইডে কী বা অন্যান্য সংবেদনশীল তথ্য সংরক্ষণ করতে পারে, একটি কেন্দ্রীয় সার্ভার ব্যবহার করে একটি ফ্রন্টএন্ড পরিবেশন করতে পারে, বা ব্লকচেইনে লেখার আগে একটি কেন্দ্রীয় সার্ভারে গুরুত্বপূর্ণ ব্যবসায়িক যুক্তি চালাতে পারে। কেন্দ্রীকরণ ঐতিহ্যগত মডেলের উপর ব্লকচেইনের অনেক (যদি সব না হয়) সুবিধা দূর করে। + +## আপনি কি দেখে শিখতে বেশি পছন্দ করেন? {#visual-learner} + + + +## ডিএ্যাপস তৈরির জন্য টুলস {#dapp-tools} + +**Scaffold-ETH _- আপনার স্মার্ট কন্ট্র্যাক্টের সাথে খাপ খাইয়ে নেওয়া একটি ফ্রন্টএন্ড ব্যবহার করে দ্রুত Solidity নিয়ে পরীক্ষা করুন।_** + +- [GitHub](https://github.com/scaffold-eth/scaffold-eth-2) +- [উদাহরণ ডিএ্যাপ](https://punkwallet.io/) + +**Create Eth App _- একটি কমান্ড দিয়ে Ethereum-চালিত অ্যাপ তৈরি করুন।_** + +- [GitHub](https://github.com/paulrberg/create-eth-app) + +**One Click Dapp _- একটি [ABI](/glossary/#abi) থেকে ডিএ্যাপ ফ্রন্টএন্ড তৈরি করার জন্য FOSS টুল।_** + +- [oneclickdapp.com](https://oneclickdapp.com) +- [GitHub](https://github.com/oneclickdapp/oneclickdapp-v1) + +**Etherflow _- Ethereum ডেভেলপারদের জন্য তাদের নোড পরীক্ষা করার জন্য এবং ব্রাউজার থেকে RPC কল রচনা এবং ডিবাগ করার জন্য FOSS টুল।_** + +- [etherflow.quiknode.io](https://etherflow.quiknode.io/) +- [GitHub](https://github.com/abunsen/etherflow) + +**thirdweb _- প্রতিটি ভাষায় SDK, স্মার্ট কন্ট্র্যাক্ট, টুলস, এবং web3 ডেভেলপমেন্টের জন্য পরিকাঠামো।_** + +- [হোমপেজ](https://thirdweb.com/) +- [নথিপত্র](https://portal.thirdweb.com/) +- [GitHub](https://github.com/thirdweb-dev/) + +**Crossmint _- স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করতে, ক্রেডিট-কার্ড এবং ক্রস চেইন পেমেন্ট সক্ষম করতে, এবং NFTs তৈরি, বিতরণ, বিক্রি, সঞ্চয় এবং সম্পাদনা করতে API ব্যবহার করার জন্য এন্টারপ্রাইজ-গ্রেড web3 ডেভেলপমেন্ট প্ল্যাটফর্ম।_** + +- [crossmint.com](https://www.crossmint.com) +- [নথিপত্র](https://docs.crossmint.com) +- [Discord](https://discord.com/invite/crossmint) + +## আরও পড়ুন {#further-reading} + +- [ডিএ্যাপস এক্সপ্লোর করুন](/apps) +- [একটি ওয়েব 3.0 অ্যাপ্লিকেশনের আর্কিটেকচার](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _প্রীতি কাসিরেড্ডি_ +- [ডিসেন্ট্রালাইজড এপ্লিকেশনগুলির জন্য একটি 2021 সালের নির্দেশিকা](https://limechain.tech/blog/what-are-dapps-the-2021-guide/) - _LimeChain_ +- [ডিসেন্ট্রালাইজড এপ্লিকেশন কী?](https://www.gemini.com/cryptopedia/decentralized-applications-defi-dapps) - _Gemini_ +- [জনপ্রিয় ডিএ্যাপস](https://www.alchemy.com/dapps) - _Alchemy_ + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [Ethereum স্ট্যাকের পরিচিতি](/developers/docs/ethereum-stack/) +- [ডেভেলপমেন্ট ফ্রেমওয়ার্ক](/developers/docs/frameworks/) diff --git a/public/content/translations/bn/developers/docs/data-and-analytics/block-explorers/index.md b/public/content/translations/bn/developers/docs/data-and-analytics/block-explorers/index.md new file mode 100644 index 00000000000..87b6e70e22b --- /dev/null +++ b/public/content/translations/bn/developers/docs/data-and-analytics/block-explorers/index.md @@ -0,0 +1,254 @@ +--- +title: "ব্লক এক্সপ্লোরার" +description: "ব্লক এক্সপ্লোরারের একটি ভূমিকা, ব্লকচেইন ডেটার জগতে আপনার পোর্টাল, যেখানে আপনি লেনদেন, অ্যাকাউন্ট, কন্ট্র্যাক্ট এবং আরও অনেক কিছু সম্পর্কে তথ্য জানতে পারেন।" +lang: bn +sidebarDepth: 3 +--- + +ব্লক এক্সপ্লোরার হল ইথেরিয়াম-এর ডেটাতে আপনার পোর্টাল। ব্লক, লেনদেন, ভ্যালিডেটর, অ্যাকাউন্ট এবং অন্যান্য অনচেইন কার্যকলাপের রিয়েল-টাইম ডেটা দেখতে আপনি সেগুলি ব্যবহার করতে পারেন। + +## পূর্বশর্ত {#prerequisites} + +আপনার ইথেরিয়ামের প্রাথমিক ধারণাগুলি বোঝা উচিত যাতে একটি ব্লক এক্সপ্লোরার আপনাকে যে ডেটা দেয় তা আপনি বুঝতে পারেন। [ইথেরিয়ামের একটি ভূমিকা](/developers/docs/intro-to-ethereum/) দিয়ে শুরু করুন। + +## পরিষেবা {#services} + +- [Etherscan](https://etherscan.io/) -_চীনা, কোরিয়ান, রাশিয়ান এবং জাপানি ভাষায়ও উপলব্ধ_ +- [3xpl](https://3xpl.com/ethereum) +- [Beaconcha.in](https://beaconcha.in/) +- [Blockchair](https://blockchair.com/ethereum) -_স্প্যানিশ, ফরাসি, ইতালীয়, ডাচ, পর্তুগিজ, রাশিয়ান, চীনা এবং ফারসি ভাষায়ও উপলব্ধ_ +- [Blockscout](https://eth.blockscout.com/) +- [Chainlens](https://www.chainlens.com/) +- [DexGuru ব্লক এক্সপ্লোরার](https://ethereum.dex.guru/) +- [Etherchain](https://www.etherchain.org/) +- [Ethplorer](https://ethplorer.io/) -_চীনা, স্প্যানিশ, ফরাসি, তুর্কি, রাশিয়ান, কোরিয়ান এবং ভিয়েতনামী ভাষায়ও উপলব্ধ_ +- [EthVM](https://www.ethvm.com/) +- [OKLink](https://www.oklink.com/eth) +- [Ethseer](https://ethseer.io) + +## ওপেন সোর্স টুলস {#open-source-tools} + +- [Otterscan](https://otterscan.io/) +- [lazy-etherscan](https://github.com/woxjro/lazy-etherscan) + +## ডেটা {#data} + +ইথেরিয়াম ডিজাইন অনুযায়ী স্বচ্ছ তাই সবকিছু যাচাইযোগ্য। ব্লক এক্সপ্লোরার এই তথ্য পাওয়ার জন্য একটি ইন্টারফেস প্রদান করে। এবং আপনার যদি সেই ডেটার প্রয়োজন হয়, তবে এটি মূল ইথেরিয়াম নেটওয়ার্ক এবং টেস্টনেট উভয়ের জন্যই। ডেটা এক্সিকিউশন ডেটা এবং কনসেন্সাস ডেটাতে বিভক্ত। এক্সিকিউশন ডেটা একটি নির্দিষ্ট ব্লকে সম্পাদিত লেনদেনকে বোঝায়। কনসেন্সাস ডেটা বলতে ব্লকগুলি এবং যে ভ্যালিডেটররা সেগুলির প্রস্তাব দিয়েছিল তাদের বোঝায়। + +এখানে একটি ব্লক এক্সপ্লোরার থেকে আপনি যে ধরনের ডেটা পেতে পারেন তার একটি সারসংক্ষেপ রয়েছে। + +### এক্সিকিউশন ডেটা {#execution-data} + +প্রতি 12 সেকেন্ডে ইথেরিয়ামে নতুন ব্লক যুক্ত করা হয় (যদি না কোনো ব্লক প্রোপোজার তার পালা মিস করে), তাই ব্লক এক্সপ্লোরারগুলিতে প্রায়-ধ্রুবক ডেটার একটি প্রবাহ যুক্ত হয়। ব্লকগুলিতে অনেক গুরুত্বপূর্ণ ডেটা রয়েছে যা আপনার কাছে দরকারী মনে হতে পারে: + +**স্ট্যান্ডার্ড ডেটা** + +- ব্লক হাইট - বর্তমান ব্লক তৈরির সময় ব্লক নম্বর এবং ব্লকচেইনের দৈর্ঘ্য (ব্লকে)। +- টাইমস্ট্যাম্প - যে সময়ে একটি ব্লকের প্রস্তাব করা হয়েছিল। +- লেনদেন - ব্লকের মধ্যে অন্তর্ভুক্ত লেনদেনের সংখ্যা। +- ফি প্রাপক - যে অ্যাড্রেস লেনদেন থেকে গ্যাস ফি টিপস পেয়েছে। +- ব্লক রিওয়ার্ড - যে ভ্যালিডেটর ব্লকটির প্রস্তাব করেছে তাকে পুরস্কৃত করা ETH-এর পরিমাণ। +- সাইজ - ব্লকের মধ্যে ডেটার সাইজ (বাইটে পরিমাপ করা হয়)। +- ব্যবহৃত গ্যাস - ব্লকের লেনদেন দ্বারা ব্যবহৃত গ্যাসের মোট একক। +- গ্যাস লিমিট - ব্লকের লেনদেন দ্বারা সেট করা মোট গ্যাস লিমিট। +- গ্যাস প্রতি বেস ফি - একটি ব্লকে একটি লেনদেন অন্তর্ভুক্ত করার জন্য প্রয়োজনীয় সর্বনিম্ন গুণক। +- বার্নড ফি - ব্লকে কত ETH বার্ন করা হয়। +- অতিরিক্ত ডেটা - বিল্ডার ব্লকে অন্তর্ভুক্ত করেছে এমন কোনো অতিরিক্ত ডেটা। + +**অ্যাডভান্সড ডেটা** + +- হ্যাস - ক্রিপ্টোগ্রাফিক হ্যাস যা ব্লক হেডারকে (ব্লকের অনন্য শনাক্তকারী) প্রতিনিধিত্ব করে। +- পেরেন্ট হ্যাস - বর্তমান ব্লকের আগে আসা ব্লকের হ্যাস। +- স্টেট রুট - Merkle trie-এর রুট হ্যাস যা সিস্টেমের সমগ্র স্টেট সংরক্ষণ করে। + +### গ্যাস {#gas} + +ব্লক এক্সপ্লোরারগুলি আপনাকে কেবল লেনদেন এবং ব্লকে গ্যাস ব্যবহার সম্পর্কে ডেটা দেবে না, কিছু কিছু আপনাকে নেটওয়ার্কের বর্তমান গ্যাসের দাম সম্পর্কেও তথ্য দেবে। এটি আপনাকে নেটওয়ার্ক ব্যবহার বুঝতে, নিরাপদ লেনদেন জমা দিতে এবং গ্যাসে অতিরিক্ত খরচ না করতে সাহায্য করবে। আপনার পণ্যের ইন্টারফেসে এই তথ্য পেতে সাহায্য করতে পারে এমন API-গুলির জন্য সন্ধান করুন। গ্যাস-নির্দিষ্ট ডেটা কভার করে: + +- একটি নিরাপদ কিন্তু ধীর লেনদেনের জন্য প্রয়োজনীয় গ্যাসের আনুমানিক ইউনিট (+ আনুমানিক মূল্য এবং সময়কাল) +- একটি গড় লেনদেনের জন্য প্রয়োজনীয় গ্যাসের আনুমানিক ইউনিট (+ আনুমানিক মূল্য এবং সময়কাল) +- একটি দ্রুত লেনদেনের জন্য প্রয়োজনীয় গ্যাসের আনুমানিক ইউনিট (+ আনুমানিক মূল্য এবং সময়কাল) +- গ্যাসের দামের উপর ভিত্তি করে গড় কনফার্মেশন সময়। +- যেসব কন্ট্র্যাক্ট গ্যাস ব্যবহার করছে - অন্য কথায়, জনপ্রিয় পণ্য যা নেটওয়ার্কে প্রচুর ব্যবহার হচ্ছে। +- যেসব অ্যাকাউন্ট গ্যাস খরচ করছে - অন্য কথায়, ঘন ঘন নেটওয়ার্ক ব্যবহারকারীরা। + +### লেনদেন {#transactions} + +ব্লক এক্সপ্লোরার মানুষের জন্য তাদের লেনদেনের অগ্রগতি ট্র্যাক করার জন্য একটি সাধারণ জায়গা হয়ে উঠেছে। এর কারণ হল আপনি যে স্তরের বিস্তারিত তথ্য পেতে পারেন তা অতিরিক্ত নিশ্চয়তা প্রদান করে। লেনদেনের ডেটা অন্তর্ভুক্ত: + +**স্ট্যান্ডার্ড ডেটা** + +- লেনদেনের হ্যাস - লেনদেন জমা দেওয়ার সময় একটি হ্যাস তৈরি হয়। +- স্ট্যাটাস - লেনদেনটি পেন্ডিং, ব্যর্থ বা সফল কিনা তার একটি ইঙ্গিত। +- ব্লক - যে ব্লকে লেনদেন অন্তর্ভুক্ত করা হয়েছে। +- টাইমস্ট্যাম্প - যে সময়ে একটি লেনদেন একজন ভ্যালিডেটর দ্বারা প্রস্তাবিত একটি ব্লকে অন্তর্ভুক্ত করা হয়েছিল। +- প্রেরক - লেনদেন জমা দেওয়া অ্যাকাউন্টের অ্যাড্রেস। +- প্রাপক - প্রাপকের অ্যাড্রেস বা স্মার্ট কন্ট্র্যাক্ট যার সাথে লেনদেনটি ইন্টারঅ্যাক্ট করে। +- স্থানান্তরিত টোকেন - লেনদেনের অংশ হিসাবে স্থানান্তরিত টোকেনের একটি তালিকা। +- ভ্যালু - স্থানান্তরিত মোট ETH ভ্যালু। +- লেনদেন ফি - লেনদেন প্রক্রিয়া করার জন্য ভ্যালিডেটরকে প্রদত্ত পরিমাণ (গ্যাসের মূল্য\*ব্যবহৃত গ্যাস দ্বারা গণনা করা হয়)। + +**অ্যাডভান্সড ডেটা** + +- গ্যাস লিমিট - এই লেনদেনটি সর্বোচ্চ যত ইউনিট গ্যাস ব্যবহার করতে পারে। +- ব্যবহৃত গ্যাস - লেনদেনটি যে পরিমাণ গ্যাস ইউনিট ব্যবহার করেছে। +- গ্যাসের মূল্য - প্রতি গ্যাস ইউনিটের জন্য নির্ধারিত মূল্য। +- Nonce - `from` অ্যাড্রেসের জন্য লেনদেন নম্বর (মনে রাখবেন এটি 0 থেকে শুরু হয় তাই `100` এর একটি নন্স আসলে এই অ্যাকাউন্ট দ্বারা জমা দেওয়া 101তম লেনদেন হবে)। +- ইনপুট ডেটা - লেনদেনের জন্য প্রয়োজনীয় যেকোনো অতিরিক্ত তথ্য। + +### অ্যাকাউন্ট {#accounts} + +একটি অ্যাকাউন্ট সম্পর্কে আপনি অনেক ডেটা অ্যাক্সেস করতে পারেন। এই কারণেই প্রায়শই একাধিক অ্যাকাউন্ট ব্যবহার করার পরামর্শ দেওয়া হয় যাতে আপনার সম্পদ এবং মূল্য সহজে ট্র্যাক করা না যায়। লেনদেন এবং অ্যাকাউন্টের কার্যকলাপকে আরও ব্যক্তিগত করার জন্য কিছু সমাধানও তৈরি করা হচ্ছে। তবে এখানে অ্যাকাউন্টগুলির জন্য উপলব্ধ ডেটা রয়েছে: + +**ব্যবহারকারী অ্যাকাউন্ট** + +- অ্যাকাউন্ট অ্যাড্রেস - পাবলিক অ্যাড্রেস যা আপনি ফান্ড পাঠাতে ব্যবহার করতে পারেন। +- ETH ব্যালেন্স - সেই অ্যাকাউন্টের সাথে যুক্ত ETH-এর পরিমাণ। +- মোট ETH ভ্যালু - ETH-এর ভ্যালু। +- টোকেন - অ্যাকাউন্টের সাথে যুক্ত টোকেন এবং তাদের ভ্যালু। +- লেনদেনের ইতিহাস - সমস্ত লেনদেনের একটি তালিকা যেখানে এই অ্যাকাউন্টটি প্রেরক বা প্রাপক ছিল। + +**স্মার্ট কন্ট্র্যাক্ট** + +স্মার্ট কন্ট্র্যাক্ট অ্যাকাউন্টগুলিতে একটি ব্যবহারকারী অ্যাকাউন্টের সমস্ত ডেটা থাকে, তবে কিছু ব্লক এক্সপ্লোরার এমনকি কিছু কোড তথ্যও প্রদর্শন করবে। উদাহরণগুলির মধ্যে রয়েছে: + +- কন্ট্র্যাক্ট নির্মাতা - যে অ্যাড্রেসটি Mainnet-এ কন্ট্র্যাক্টটি ডিপ্লয় করেছে। +- তৈরির লেনদেন - যে লেনদেন Mainnet-এ ডিপ্লয়মেন্ট অন্তর্ভুক্ত করেছে। +- সোর্স কোড - স্মার্ট কন্ট্র্যাক্টের সলিডিটি বা ভাইপার কোড। +- কন্ট্র্যাক্ট ABI - কন্ট্র্যাক্টের অ্যাপ্লিকেশন বাইনারি ইন্টারফেস—কন্ট্র্যাক্ট যে কলগুলি করে এবং প্রাপ্ত ডেটা। +- কন্ট্র্যাক্ট তৈরির কোড - স্মার্ট কন্ট্র্যাক্টের কম্পাইল করা বাইটকোড—আপনি যখন সলিডিটি বা ভাইপার ইত্যাদিতে লেখা একটি স্মার্ট কন্ট্র্যাক্ট কম্পাইল করেন তখন তৈরি হয়। +- কন্ট্র্যাক্ট ইভেন্ট - স্মার্ট কন্ট্র্যাক্টে কল করা পদ্ধতিগুলির একটি ইতিহাস—মূলত কন্ট্র্যাক্টটি কীভাবে এবং কত ঘন ঘন ব্যবহার করা হচ্ছে তা দেখার একটি উপায়। + +### টোকেন {#tokens} + +টোকেন এক ধরনের কন্ট্র্যাক্ট তাই তাদের স্মার্ট কন্ট্র্যাক্টের মতো একই ধরনের ডেটা থাকবে। কিন্তু যেহেতু তাদের মূল্য আছে এবং ট্রেড করা যায়, তাই তাদের অতিরিক্ত ডেটা পয়েন্ট রয়েছে: + +- প্রকার - সেগুলি একটি ERC-20, ERC-721 বা অন্য কোনো টোকেন স্ট্যান্ডার্ড কিনা। +- মূল্য - যদি সেগুলি একটি ERC-20 হয় তবে তাদের একটি বর্তমান বাজার মূল্য থাকবে। +- মার্কেট ক্যাপ - যদি সেগুলি একটি ERC-20 হয় তবে তাদের একটি মার্কেট ক্যাপ থাকবে (মূল্য\*মোট সরবরাহ দ্বারা গণনা করা হয়)। +- মোট সরবরাহ - প্রচলিত টোকেনের সংখ্যা। +- হোল্ডার - টোকেন ধারণকারী অ্যাড্রেসের সংখ্যা। +- স্থানান্তর - অ্যাকাউন্টগুলির মধ্যে টোকেনটি যতবার স্থানান্তরিত হয়েছে। +- লেনদেনের ইতিহাস - টোকেন সহ সমস্ত লেনদেনের একটি ইতিহাস। +- কন্ট্র্যাক্ট অ্যাড্রেস - Mainnet-এ ডিপ্লয় করা টোকেনের অ্যাড্রেস। +- ডেসিমেল - ERC-20 টোকেন বিভাজ্য এবং দশমিক স্থান আছে। + +### নেটওয়ার্ক {#network} + +কিছু ব্লক ডেটা আরও সামগ্রিকভাবে ইথেরিয়ামের স্বাস্থ্য সম্পর্কে উদ্বিগ্ন। + +- মোট লেনদেন - ইথেরিয়াম তৈরি হওয়ার পর থেকে লেনদেনের সংখ্যা। +- প্রতি সেকেন্ডে লেনদেন - এক সেকেন্ডের মধ্যে প্রক্রিয়াযোগ্য লেনদেনের সংখ্যা। +- ETH মূল্য - 1 ETH-এর বর্তমান মূল্যায়ন। +- মোট ETH সরবরাহ - প্রচলিত ETH-এর সংখ্যা—মনে রাখবেন ব্লক রিওয়ার্ড আকারে প্রতিটি ব্লক তৈরির সাথে নতুন ETH তৈরি হয়। +- মার্কেট ক্যাপ - মূল্য\*সরবরাহের গণনা। + +## কনসেন্সাস লেয়ার ডেটা {#consensus-layer-data} + +### ইপক {#epoch} + +নিরাপত্তার কারণে, প্রতিটি ইপকের শেষে (প্রতি 6.4 মিনিটে) ভ্যালিডেটরদের র‍্যান্ডমাইজড কমিটি তৈরি করা হয়। ইপক ডেটা অন্তর্ভুক্ত: + +- ইপক নম্বর +- ফাইনাল করা স্ট্যাটাস - ইপক ফাইনাল করা হয়েছে কিনা (হ্যাঁ/না)। +- সময় - যে সময়ে ইপক শেষ হয়েছিল। +- অ্যাটেস্টেশন - ইপকের অ্যাটেস্টেশনের সংখ্যা (স্লটের মধ্যে ব্লকের জন্য ভোট)। +- ডিপোজিট - ইপকে অন্তর্ভুক্ত ETH ডিপোজিটের সংখ্যা (ভ্যালিডেটরদের ভ্যালিডেটর হওয়ার জন্য ETH স্টেক করতে হবে)। +- স্ল্যাশিং - ব্লক বা অ্যাটেস্টরদের প্রস্তাবকদের দেওয়া পেনাল্টির সংখ্যা। +- ভোটদান অংশগ্রহণ - ব্লক অ্যাটেস্ট করতে ব্যবহৃত স্টেক করা ETH-এর পরিমাণ। +- ভ্যালিডেটর - ইপকের জন্য সক্রিয় ভ্যালিডেটরের সংখ্যা। +- গড় ভ্যালিডেটর ব্যালেন্স - সক্রিয় ভ্যালিডেটরদের জন্য গড় ব্যালেন্স। +- স্লট - ইপকে অন্তর্ভুক্ত স্লটের সংখ্যা (স্লটে একটি বৈধ ব্লক অন্তর্ভুক্ত থাকে)। + +### স্লট {#slot} + +স্লট হল ব্লক তৈরির সুযোগ, প্রতিটি স্লটের জন্য উপলব্ধ ডেটা অন্তর্ভুক্ত: + +- ইপক - যে ইপকে স্লটটি বৈধ। +- স্লট নম্বর +- স্ট্যাটাস - স্লটের স্ট্যাটাস (প্রস্তাবিত/মিসড)। +- সময় - স্লটের টাইমস্ট্যাম্প। +- প্রস্তাবক - যে ভ্যালিডেটর স্লটের জন্য ব্লকের প্রস্তাব করেছিল। +- ব্লক রুট - BeaconBlock-এর হ্যাস-ট্রি-রুট। +- পেরেন্ট রুট - এর আগে আসা ব্লকের হ্যাস। +- স্টেট রুট - BeaconState-এর হ্যাস-ট্রি-রুট। +- স্বাক্ষর +- Randao রিভিল +- গ্রাফিতি - একটি ব্লক প্রস্তাবক তার ব্লক প্রস্তাবে 32 বাইট দীর্ঘ বার্তা অন্তর্ভুক্ত করতে পারে। +- এক্সিকিউশন ডেটা + - ব্লক হ্যাস + - ডিপোজিট কাউন্ট + - ডিপোজিট রুট +- অ্যাটেস্টেশন - এই স্লটে ব্লকের জন্য অ্যাটেস্টেশনের সংখ্যা। +- ডিপোজিট - এই স্লটের সময় ডিপোজিটের সংখ্যা। +- স্বেচ্ছায় প্রস্থান - স্লটের সময় চলে যাওয়া ভ্যালিডেটরদের সংখ্যা। +- স্ল্যাশিং - ব্লক বা অ্যাটেস্টরদের প্রস্তাবকদের দেওয়া পেনাল্টির সংখ্যা। +- ভোট - এই স্লটে ব্লকের জন্য ভোট দেওয়া ভ্যালিডেটররা। + +### ব্লক {#blocks-1} + +প্রুফ-অফ-স্টেক সময়কে স্লট এবং ইপকে বিভক্ত করে। সুতরাং এর মানে নতুন ডেটা! + +- প্রস্তাবক - নতুন ব্লকের প্রস্তাব দেওয়ার জন্য অ্যালগরিদমিকভাবে নির্বাচিত ভ্যালিডেটর। +- ইপক - যে ইপকে ব্লকের প্রস্তাব করা হয়েছিল। +- স্লট - যে স্লটে ব্লকের প্রস্তাব করা হয়েছিল। +- অ্যাটেস্টেশন - স্লটে অন্তর্ভুক্ত অ্যাটেস্টেশনের সংখ্যা—অ্যাটেস্টেশন হল ভোটের মতো যা নির্দেশ করে যে ব্লকটি বিকন চেইনে যাওয়ার জন্য প্রস্তুত। + +### ভ্যালিডেটর {#validators} + +ভ্যালিডেটররা স্লটের মধ্যে ব্লক প্রস্তাব এবং অ্যাটেস্ট করার জন্য দায়ী। + +- ভ্যালিডেটর নম্বর - অনন্য নম্বর যা ভ্যালিডেটরকে প্রতিনিধিত্ব করে। +- বর্তমান ব্যালেন্স - পুরস্কার সহ ভ্যালিডেটরের ব্যালেন্স। +- কার্যকরী ব্যালেন্স - ভ্যালিডেটরের ব্যালেন্স যা স্টেকিংয়ের জন্য ব্যবহৃত হয়। +- আয় - ভ্যালিডেটর দ্বারা প্রাপ্ত পুরস্কার বা পেনাল্টি। +- স্ট্যাটাস - ভ্যালিডেটর বর্তমানে অনলাইন এবং সক্রিয় আছে কি না। +- অ্যাটেস্টেশন কার্যকারিতা - ভ্যালিডেটরের অ্যাটেস্টেশনগুলি চেইনে অন্তর্ভুক্ত হতে যে গড় সময় লাগে। +- অ্যাক্টিভেশনের জন্য যোগ্যতা - তারিখ (এবং ইপক) যখন ভ্যালিডেটর ভ্যালিডেট করার জন্য উপলব্ধ হয়েছিল। +- থেকে সক্রিয় - তারিখ (এবং ইপক) যখন ভ্যালিডেটর সক্রিয় হয়েছিল। +- প্রস্তাবিত ব্লক - ভ্যালিডেটর যে ব্লকের প্রস্তাব করেছে। +- অ্যাটেস্টেশন - ভ্যালিডেটর যে অ্যাটেস্টেশনগুলি প্রদান করেছে। +- ডিপোজিট - ভ্যালিডেটরের দ্বারা করা স্টেকিং ডিপোজিটের প্রেরকের অ্যাড্রেস, লেনদেন হ্যাস, ব্লক নম্বর, টাইমস্ট্যাম্প, পরিমাণ এবং স্ট্যাটাস। + +### অ্যাটেস্টেশন {#attestations} + +অ্যাটেস্টেশনগুলি হল চেইনে ব্লক অন্তর্ভুক্ত করার জন্য "হ্যাঁ" ভোট। তাদের ডেটা অ্যাটেস্টেশনের একটি রেকর্ড এবং অ্যাটেস্ট করা ভ্যালিডেটরদের সাথে সম্পর্কিত। + +- স্লট - যে স্লটে অ্যাটেস্টেশন হয়েছিল। +- কমিটি ইন্ডেক্স - প্রদত্ত স্লটে কমিটির ইন্ডেক্স। +- অ্যাগ্রিগেশন বিটস - অ্যাটেস্টেশনে অংশগ্রহণকারী সমস্ত ভ্যালিডেটরের অ্যাগ্রিগেটেড অ্যাটেস্টেশনকে প্রতিনিধিত্ব করে। +- ভ্যালিডেটর - যে ভ্যালিডেটররা অ্যাটেস্টেশন প্রদান করেছে। +- বিকন ব্লক রুট - যে ব্লকে ভ্যালিডেটররা অ্যাটেস্ট করছে সেটিকে নির্দেশ করে। +- সোর্স - সর্বশেষ জাস্টিফাইড ইপককে নির্দেশ করে। +- টার্গেট - সর্বশেষ ইপক বাউন্ডারিকে নির্দেশ করে। +- স্বাক্ষর + +### নেটওয়ার্ক {#network-1} + +কনসেন্সাস লেয়ারের টপ-লেভেল ডেটার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে: + +- বর্তমান ইপক +- বর্তমান স্লট +- সক্রিয় ভ্যালিডেটর - সক্রিয় ভ্যালিডেটরের সংখ্যা। +- পেন্ডিং ভ্যালিডেটর - সক্রিয় হওয়ার জন্য অপেক্ষারত ভ্যালিডেটরের সংখ্যা। +- স্টেক করা ETH - নেটওয়ার্কে স্টেক করা ETH-এর পরিমাণ। +- গড় ব্যালেন্স - ভ্যালিডেটরদের গড় ETH ব্যালেন্স। + +## ব্লক এক্সপ্লোরার {#block-explorers} + +- [Etherscan](https://etherscan.io/) - একটি ব্লক এক্সপ্লোরার যা আপনি Ethereum Mainnet এবং টেস্টনেটের জন্য ডেটা আনতে ব্যবহার করতে পারেন। +- [3xpl](https://3xpl.com/ethereum) - একটি বিজ্ঞাপন-মুক্ত ওপেন-সোর্স Ethereum এক্সপ্লোরার যা এর ডেটাসেট ডাউনলোড করার অনুমতি দেয়। +- [Beaconcha.in](https://beaconcha.in/) - Ethereum Mainnet এবং টেস্টনেটের জন্য একটি ওপেন সোর্স ব্লক এক্সপ্লোরার। +- [Blockchair](https://blockchair.com/ethereum) - সবচেয়ে ব্যক্তিগত Ethereum এক্সপ্লোরার। এছাড়াও (mempool) ডেটা সর্টিং এবং ফিল্টার করার জন্য। +- [Etherchain](https://www.etherchain.org/) - Ethereum Mainnet-এর জন্য একটি ব্লক এক্সপ্লোরার। +- [Ethplorer](https://ethplorer.io/) - Ethereum Mainnet এবং Kovan টেস্টনেটের জন্য টোকেনের উপর ফোকাস সহ একটি ব্লক এক্সপ্লোরার। + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [লেনদেন](/developers/docs/transactions/) +- [অ্যাকাউন্ট](/developers/docs/accounts/) +- [নেটওয়ার্ক](/developers/docs/networks/) diff --git a/public/content/translations/bn/developers/docs/data-and-analytics/index.md b/public/content/translations/bn/developers/docs/data-and-analytics/index.md new file mode 100644 index 00000000000..8d3fbdc744b --- /dev/null +++ b/public/content/translations/bn/developers/docs/data-and-analytics/index.md @@ -0,0 +1,72 @@ +--- +title: "ডেটা এবং বিশ্লেষণ" +description: "আপনার ডিএ্যাপস-এ ব্যবহারের জন্য কীভাবে অনচেইন বিশ্লেষণ এবং ডেটা পাবেন" +lang: bn +--- + +## ভূমিকা {#Introduction} + +নেটওয়ার্কের ব্যবহার ক্রমাগত বাড়তে থাকায়, অনচেইন ডেটাতে ক্রমবর্ধমান মূল্যবান তথ্য বিদ্যমান থাকবে। ডেটার পরিমাণ দ্রুত বাড়ার সাথে সাথে, রিপোর্ট করার জন্য বা একটি ডিএ্যাপ চালানোর জন্য এই তথ্য গণনা করা এবং একত্রিত করা একটি সময় এবং প্রক্রিয়া সাপেক্ষ প্রচেষ্টা হয়ে উঠতে পারে। + +বিদ্যমান ডেটা প্রদানকারীদের ব্যবহার উন্নয়নকে ত্বরান্বিত করতে পারে, আরও সঠিক ফলাফল তৈরি করতে পারে এবং চলমান রক্ষণাবেক্ষণের প্রচেষ্টা কমাতে পারে। এটি একটি দলকে তাদের প্রকল্পের মূল কার্যকারিতার উপর মনোযোগ কেন্দ্রীভূত করতে সক্ষম করবে। + +## পূর্বশর্ত {#prerequisites} + +ডেটা বিশ্লেষণ প্রসঙ্গে ব্লক এক্সপ্লোরারগুলির ব্যবহার আরও ভালভাবে বোঝার জন্য আপনার [ব্লক এক্সপ্লোরার](/developers/docs/data-and-analytics/block-explorers/)-এর মূল ধারণাটি বোঝা উচিত। এছাড়াও, একটি সিস্টেম ডিজাইনে তারা যে সুবিধাগুলি যোগ করে তা বোঝার জন্য একটি [সূচক](/glossary/#index)-এর ধারণার সাথে নিজেকে পরিচিত করুন। + +স্থাপত্যের মৌলিক বিষয়গুলির পরিপ্রেক্ষিতে, একটি [API](https://www.wikipedia.org/wiki/API) এবং [REST](https://www.wikipedia.org/wiki/Representational_state_transfer) কী, তা অন্তত তাত্ত্বিকভাবে বোঝা প্রয়োজন। + +## ব্লক এক্সপ্লোরার {#block-explorers} + +অনেক [ব্লক এক্সপ্লোরার](/developers/docs/data-and-analytics/block-explorers/) [RESTful](https://www.wikipedia.org/wiki/Representational_state_transfer) [API](https://www.wikipedia.org/wiki/API) গেটওয়ে অফার করে যা ডেভেলপারদের ব্লক, লেনদেন, ভ্যালিডেটর, অ্যাকাউন্ট এবং অন্যান্য অনচেইন কার্যকলাপের রিয়েল-টাইম ডেটাতে দৃশ্যমানতা প্রদান করবে। + +ডেভেলপাররা তখন তাদের ব্যবহারকারীদের [ব্লকচেইন](/glossary/#blockchain)-এর সাথে অনন্য অন্তর্দৃষ্টি এবং মিথস্ক্রিয়া দেওয়ার জন্য এই ডেটা প্রক্রিয়া এবং রূপান্তর করতে পারে। উদাহরণস্বরূপ, [Etherscan](https://etherscan.io) এবং [Blockscout](https://eth.blockscout.com) প্রতি 12s স্লটের জন্য এক্সিকিউশন এবং কনসেন্সাস ডেটা সরবরাহ করে। + +## গ্রাফ {#the-graph} + +[The Graph](https://thegraph.com/) একটি ইন্ডেক্সিং প্রোটোকল যা সাবগ্রাফ নামে পরিচিত ওপেন API-এর মাধ্যমে ব্লকচেইন ডেটা জিজ্ঞাসা করার একটি সহজ উপায় সরবরাহ করে। + +The Graph-এর মাধ্যমে, ডেভেলপাররা নিম্নলিখিত সুবিধাগুলি থেকে উপকৃত হতে পারেন: + +- বিকেন্দ্রীভূত ইন্ডেক্সিং: একাধিক ইন্ডেক্সারের মাধ্যমে ব্লকচেইন ডেটা ইন্ডেক্সিং সক্ষম করে, যার ফলে ব্যর্থতার কোনো একক বিন্দু দূর হয়। +- GraphQL কোয়েরি: ইন্ডেক্সড ডেটা কোয়েরি করার জন্য একটি শক্তিশালী GraphQL ইন্টারফেস সরবরাহ করে, যা ডেটা পুনরুদ্ধারকে খুব সহজ করে তোলে। +- কাস্টমাইজেশন: ব্লকচেইন ডেটা রূপান্তর এবং সংরক্ষণের জন্য আপনার নিজস্ব যুক্তি সংজ্ঞায়িত করুন, এবং The Graph নেটওয়ার্কে অন্যান্য ডেভেলপারদের দ্বারা প্রকাশিত সাবগ্রাফগুলি পুনরায় ব্যবহার করুন। + +৫ মিনিটের মধ্যে একটি সাবগ্রাফ তৈরি, স্থাপন এবং জিজ্ঞাসা করতে এই [কুইক-স্টার্ট](https://thegraph.com/docs/en/quick-start/) গাইডটি অনুসরণ করুন। + +## ক্লায়েন্ট বৈচিত্র্য {#client-diversity} + +[ক্লায়েন্ট বৈচিত্র্য](/developers/docs/nodes-and-clients/client-diversity/) ইথেরিয়াম নেটওয়ার্কের সামগ্রিক স্বাস্থ্যের জন্য গুরুত্বপূর্ণ কারণ এটি বাগ এবং এক্সপ্লয়েটের বিরুদ্ধে স্থিতিস্থাপকতা প্রদান করে। এখন বেশ কয়েকটি ক্লায়েন্ট বৈচিত্র্য ড্যাশবোর্ড রয়েছে যার মধ্যে রয়েছে [clientdiversity.org](https://clientdiversity.org/), [rated.network](https://www.rated.network), [supermajority.info](https://supermajority.info//) এবং [Ethernodes](https://ethernodes.org/)। + +## Dune অ্যানালিটিক্স {#dune-analytics} + +[Dune Analytics](https://dune.com/) ব্লকচেইন ডেটাকে রিলেশনাল ডাটাবেস (DuneSQL) টেবিলে প্রাক-প্রসেস করে, ব্যবহারকারীদের SQL ব্যবহার করে ব্লকচেইন ডেটা জিজ্ঞাসা করতে এবং কোয়েরির ফলাফলের উপর ভিত্তি করে ড্যাশবোর্ড তৈরি করতে দেয়। অনচেইন ডেটা ৪টি কাঁচা টেবিলে সংগঠিত হয়: `blocks`, `transactions`, (ইভেন্ট) `logs` এবং (কল) `traces`। জনপ্রিয় চুক্তি এবং প্রোটোকলগুলি ডিকোড করা হয়েছে, এবং প্রত্যেকের নিজস্ব ইভেন্ট এবং কল টেবিলের সেট রয়েছে। সেই ইভেন্ট এবং কল টেবিলগুলি আরও প্রক্রিয়াজাত করা হয় এবং প্রোটোকলের ধরন অনুসারে অ্যাবস্ট্র্যাকশন টেবিলে সংগঠিত করা হয়, উদাহরণস্বরূপ, dex, লেন্ডিং, স্টেবলকয়েন ইত্যাদি। + +## SQD {#sqd} + +[SQD](https://sqd.dev/) একটি বিকেন্দ্রীভূত হাইপার-স্কেলেবল ডেটা প্ল্যাটফর্ম যা প্রচুর পরিমাণে ডেটাতে দক্ষ, অনুমতিহীন অ্যাক্সেস প্রদানের জন্য অপ্টিমাইজ করা হয়েছে। এটি বর্তমানে ঐতিহাসিক অন-চেইন ডেটা পরিবেশন করে, যার মধ্যে রয়েছে ইভেন্ট লগ, লেনদেনের রসিদ, ট্রেস এবং প্রতি-লেনদেন স্টেট ডিফস। SQD কাস্টম ডেটা নিষ্কাশন এবং প্রক্রিয়াকরণ পাইপলাইন তৈরির জন্য একটি শক্তিশালী টুলকিট অফার করে, যা প্রতি সেকেন্ডে ১৫০k ব্লক পর্যন্ত একটি ইন্ডেক্সিং গতি অর্জন করে। + +শুরু করতে, [নথিপত্র](https://docs.sqd.dev/) দেখুন বা SQD দিয়ে আপনি কী তৈরি করতে পারেন তার [EVM উদাহরণ](https://github.com/subsquid-labs/squid-evm-examples) দেখুন। + +## SubQuery নেটওয়ার্ক {#subquery-network} + +[SubQuery](https://subquery.network/) একটি নেতৃস্থানীয় ডেটা ইন্ডেক্সার যা ডেভেলপারদের তাদের web3 প্রকল্পগুলির জন্য দ্রুত, নির্ভরযোগ্য, বিকেন্দ্রীভূত এবং কাস্টমাইজড API দেয়। SubQuery ১৬৫টিরও বেশি ইকোসিস্টেম (ইথেরিয়াম সহ) থেকে ডেভেলপারদের সমৃদ্ধ ইন্ডেক্সড ডেটা দিয়ে তাদের ব্যবহারকারীদের জন্য একটি স্বজ্ঞাত এবং নিমগ্ন অভিজ্ঞতা তৈরি করতে ক্ষমতা দেয়। SubQuery নেটওয়ার্ক আপনার অপ্রতিরোধ্য অ্যাপগুলিকে একটি স্থিতিস্থাপক এবং বিকেন্দ্রীভূত অবকাঠামো নেটওয়ার্কের সাথে শক্তি দেয়। ডেটা প্রক্রিয়াকরণ কার্যকলাপের জন্য একটি কাস্টম ব্যাকএন্ড তৈরি করার জন্য সময় ব্যয় না করে ভবিষ্যতের web3 অ্যাপ্লিকেশনগুলি তৈরি করতে SubQuery-এর ব্লকচেইন ডেভেলপার টুলকিট ব্যবহার করুন। + +শুরু করতে, [SubQuery-এর পরিচালিত পরিষেবা](https://managedservice.subquery.network/) বা [SubQuery-এর বিকেন্দ্রীভূত নেটওয়ার্ক](https://app.subquery.network/dashboard)-এ লাইভ যাওয়ার আগে পরীক্ষার জন্য একটি স্থানীয় ডকার পরিবেশে মিনিটের মধ্যে ইথেরিয়াম ব্লকচেইন ডেটা ইন্ডেক্স করা শুরু করতে [ইথেরিয়াম কুইক স্টার্ট গাইড](https://academy.subquery.network/quickstart/quickstart_chains/ethereum-gravatar.html) দেখুন। + +## EVM কোয়েরি ল্যাঙ্গুয়েজ {#evm-query-language} + +EVM কোয়েরি ল্যাঙ্গুয়েজ (EQL) হল একটি SQL-এর মতো ভাষা যা EVM (ইথিরিয়াম ভার্চুয়াল মেশিন) চেইনগুলিকে জিজ্ঞাসা করার জন্য ডিজাইন করা হয়েছে। EQL-এর চূড়ান্ত লক্ষ্য হল EVM চেইনের প্রথম-শ্রেণীর নাগরিক (ব্লক, অ্যাকাউন্ট, এবং লেনদেন)-এর উপর জটিল রিলেশনাল কোয়েরি সমর্থন করা এবং একই সাথে ডেভেলপার এবং গবেষকদের দৈনন্দিন ব্যবহারের জন্য একটি আর্গোনমিক সিনট্যাক্স প্রদান করা। EQL-এর সাহায্যে, ডেভেলপাররা পরিচিত SQL-এর মতো সিনট্যাক্স ব্যবহার করে ব্লকচেইন ডেটা আনতে পারে এবং জটিল বয়লারপ্লেট কোডের প্রয়োজন দূর করতে পারে। EQL স্ট্যান্ডার্ড ব্লকচেইন ডেটা অনুরোধগুলি সমর্থন করে (যেমন, ইথেরিয়ামে একটি অ্যাকাউন্টের নন্স এবং ব্যালেন্স পুনরুদ্ধার করা বা বর্তমান ব্লক আকার এবং টাইমস্ট্যাম্প আনা) এবং ক্রমাগত আরও জটিল অনুরোধ এবং বৈশিষ্ট্যসেটগুলির জন্য সমর্থন যোগ করছে। + +## আরও পড়ুন {#further-reading} + +- [ক্রিপ্টো ডেটা অন্বেষণ I: ডেটা ফ্লো আর্কিটেকচার](https://web.archive.org/web/20250125012042/https://research.2077.xyz/exploring-crypto-data-1-data-flow-architectures) +- [গ্রাফ নেটওয়ার্ক ওভারভিউ](https://thegraph.com/docs/en/about/) +- [গ্রাফ কোয়েরি প্লেগ্রাউন্ড](https://thegraph.com/explorer/subgraph/graphprotocol/graph-network-mainnet?version=current) +- [EtherScan-এ API কোডের উদাহরণ](https://etherscan.io/apis#contracts) +- [Blockscout-এ API নথিপত্র](https://docs.blockscout.com/devs/apis) +- [Beaconcha.in বিকন চেইন এক্সপ্লোরার](https://beaconcha.in) +- [Dune বেসিকস](https://docs.dune.com/#dune-basics) +- [SubQuery ইথেরিয়াম কুইক স্টার্ট গাইড](https://academy.subquery.network/indexer/quickstart/quickstart_chains/ethereum-gravatar.html) +- [SQD নেটওয়ার্ক ওভারভিউ](https://docs.sqd.dev/) +- [EVM কোয়েরি ল্যাঙ্গুয়েজ](https://eql.sh/blog/alpha-release-notes) diff --git a/public/content/translations/bn/developers/docs/data-availability/blockchain-data-storage-strategies/index.md b/public/content/translations/bn/developers/docs/data-availability/blockchain-data-storage-strategies/index.md new file mode 100644 index 00000000000..5b631371d81 --- /dev/null +++ b/public/content/translations/bn/developers/docs/data-availability/blockchain-data-storage-strategies/index.md @@ -0,0 +1,118 @@ +--- +title: "ব্লকচেইন ডেটা সংগ্রহের কৌশল" +description: "ব্লকচেইন ব্যবহার করে ডেটা সঞ্চয় করার বিভিন্ন উপায় রয়েছে। এই নিবন্ধে বিভিন্ন কৌশল, তাদের খরচ এবং ট্রেডঅফ, সেইসাথে এটি নিরাপদে ব্যবহারের জন্য প্রয়োজনীয়তাগুলির তুলনা করা হবে।" +lang: bn +--- + +ব্লকচেইনে সরাসরি তথ্য সঞ্চয় করার একাধিক উপায় রয়েছে, অথবা এমন একটি পদ্ধতিতে যা ব্লকচেইন দ্বারা সুরক্ষিত: + +- EIP-4844 blobs +- Calldata +- L1 মেকানিজম সহ অফচেইন +- কন্ট্র্যাক্ট "কোড" +- অনুষ্ঠানসমূহ +- EVM সংগ্রহস্থল + +কোন পদ্ধতিটি ব্যবহার করা হবে তা বিভিন্ন মানদণ্ডের উপর ভিত্তি করে নির্ধারিত হয়: + +- তথ্যের উৎস। Calldata-তে থাকা তথ্য সরাসরি ব্লকচেইন থেকে আসতে পারে না। +- তথ্যের গন্তব্য। Calldata শুধুমাত্র সেই লেনদেনেই উপলব্ধ যা এটি অন্তর্ভুক্ত করে। ইভেন্টগুলি অনচেইনে একেবারেই অ্যাক্সেসযোগ্য নয়। +- কতটা ঝামেলা গ্রহণযোগ্য? একটি পূর্ণ-স্কেল নোড চালানো কম্পিউটারগুলি ব্রাউজারে চলমান একটি অ্যাপ্লিকেশনের লাইট ক্লায়েন্টের চেয়ে বেশি প্রক্রিয়াকরণ করতে পারে। +- প্রতিটি নোড থেকে তথ্যে সহজ অ্যাক্সেসের সুবিধা প্রদান করা কি প্রয়োজনীয়? +- নিরাপত্তা প্রয়োজনীয়তা। + +## নিরাপত্তা প্রয়োজনীয়তা {#security-requirements} + +সাধারণত, তথ্য নিরাপত্তা তিনটি বৈশিষ্ট্যের সমন্বয়ে গঠিত: + +- _গোপনীয়তা_, অননুমোদিত সত্তাকে তথ্য পড়ার অনুমতি দেওয়া হয় না। এটি অনেক ক্ষেত্রে গুরুত্বপূর্ণ, কিন্তু এখানে নয়। _ব্লকচেইনে কোনো গোপনীয়তা নেই_। ব্লকচেইন কাজ করে কারণ যে কেউ অবস্থার পরিবর্তন যাচাই করতে পারে, তাই সরাসরি গোপনীয়তা সঞ্চয় করতে এটি ব্যবহার করা অসম্ভব। ব্লকচেইনে গোপনীয় তথ্য সঞ্চয় করার উপায় রয়েছে, কিন্তু সেগুলি সবই অন্তত একটি কী সঞ্চয় করার জন্য কিছু অফচেইন উপাদানের উপর নির্ভর করে। + +- _অখণ্ডতা_, তথ্য সঠিক, এটি অননুমোদিত সত্তা দ্বারা বা অননুমোদিত উপায়ে পরিবর্তন করা যায় না (উদাহরণস্বরূপ, `Transfer` ইভেন্ট ছাড়া [ERC-20 টোকেন](https://eips.ethereum.org/EIPS/eip-20#events) স্থানান্তর করা)। ব্লকচেইনে, প্রতিটি নোড প্রতিটি অবস্থার পরিবর্তন যাচাই করে, যা অখণ্ডতা নিশ্চিত করে। + +- _প্রাপ্যতা_, তথ্য যেকোনো অনুমোদিত সত্তার কাছে উপলব্ধ। ব্লকচেইনে, এটি সাধারণত প্রতিটি [সম্পূর্ণ নোডে](https://ethereum.org/developers/docs/nodes-and-clients#full-node) তথ্য উপলব্ধ রাখার মাধ্যমে অর্জন করা হয়। + +এখানকার বিভিন্ন সমাধানের সবকটিরই চমৎকার অখণ্ডতা রয়েছে, কারণ হ্যাশগুলি L1-এ পোস্ট করা হয়। তবে, তাদের বিভিন্ন প্রাপ্যতা গ্যারান্টি রয়েছে। + +## পূর্বশর্ত {#prerequisites} + +[ব্লকচেইন মৌলিক বিষয়গুলো](/developers/docs/intro-to-ethereum/) সম্পর্কে আপনার একটি ভালো ধারণা থাকা উচিত। এই পৃষ্ঠাটি আরও ধরে নেয় যে পাঠক [ব্লক](/developers/docs/blocks/), [লেনদেন](/developers/docs/transactions/), এবং অন্যান্য প্রাসঙ্গিক বিষয়গুলির সাথে পরিচিত। + +## EIP-4844 blobs {#eip-4844-blobs} + +[Dencun হার্ডফর্ক](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/beacon-chain.md) থেকে শুরু করে ইথেরিয়াম ব্লকচেইনে [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) অন্তর্ভুক্ত রয়েছে, যা ইথেরিয়ামে একটি সীমিত জীবনকালের (প্রাথমিকভাবে প্রায় [18 দিন](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/p2p-interface.md#configuration)) ডেটা ব্লব যোগ করে। এই ব্লবগুলির মূল্য [এক্সিকিউশন গ্যাস](/developers/docs/gas) থেকে আলাদাভাবে নির্ধারিত হয়, যদিও একটি অনুরূপ মেকানিজম ব্যবহার করা হয়। এগুলি অস্থায়ী ডেটা পোস্ট করার একটি সস্তা উপায়। + +EIP-4844 ব্লবগুলির প্রধান ব্যবহার হলো রোলআপগুলির লেনদেন প্রকাশ করা। [অপ্টিমেস্টিক রোলআপগুলির](/developers/docs/scaling/optimistic-rollups) তাদের ব্লকচেইনে লেনদেন প্রকাশ করতে হয়। রোলআপের [সিকোয়েন্সার](https://docs.optimism.io/connect/resources/glossary#sequencer) যদি একটি ভুল স্টেট রুট পোস্ট করে, তাহলে [ভ্যালিডেটরদের](https://docs.optimism.io/connect/resources/glossary#validator) ভুলটি সংশোধন করতে সক্ষম করার জন্য [চ্যালেঞ্জ পিরিয়ড](https://docs.optimism.io/connect/resources/glossary#challenge-period) চলাকালীন সেই লেনদেনগুলি যে কারও কাছে উপলব্ধ থাকতে হবে। + +তবে, চ্যালেঞ্জ পিরিয়ড শেষ হয়ে গেলে এবং স্টেট রুট চূড়ান্ত হয়ে গেলে, এই লেনদেনগুলি জানার বাকি উদ্দেশ্য হলো চেইনের বর্তমান অবস্থার প্রতিলিপি তৈরি করা। এই অবস্থাটি চেইন নোড থেকেও উপলব্ধ, যেখানে অনেক কম প্রক্রিয়াকরণের প্রয়োজন হয়। সুতরাং লেনদেনের তথ্য এখনও কিছু জায়গায় সংরক্ষণ করা উচিত, যেমন [ব্লক এক্সপ্লোরার](/developers/docs/data-and-analytics/block-explorers), কিন্তু ইথেরিয়ামের দেওয়া সেন্সরশিপ প্রতিরোধের স্তরের জন্য অর্থ প্রদানের প্রয়োজন নেই। + +[জিরো-নলেজ রোলআপগুলি](/developers/docs/scaling/zk-rollups/#data-availability) তাদের লেনদেনের ডেটাও পোস্ট করে যাতে অন্যান্য নোড বিদ্যমান অবস্থার প্রতিলিপি তৈরি করতে এবং ভ্যালিডিটি প্রুফ যাচাই করতে পারে, তবে এটিও একটি স্বল্পমেয়াদী প্রয়োজন। + +লেখার সময় EIP-4844-এ পোস্ট করার জন্য প্রতি বাইটে এক wei (10-18 ETH) খরচ হয়, যা [যেকোনো লেনদেনের জন্য 21,000 এক্সিকিউশন গ্যাস, যার মধ্যে ব্লব পোস্ট করাও অন্তর্ভুক্ত, খরচের](https://eth.blockscout.com/tx/0xf6cfaf0431c73dd1d96369a5e6707d64f463ccf477a4131265397f1d81466929?tab=index) তুলনায় নগণ্য। আপনি [blobscan.com](https://blobscan.com/blocks)-এ বর্তমান EIP-4844 মূল্য দেখতে পারেন। + +এখানে কিছু বিখ্যাত রোলআপ দ্বারা পোস্ট করা ব্লবগুলি দেখার জন্য ঠিকানা দেওয়া হলো। + +| রোলআপ | মেলবক্স ঠিকানা | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- | +| [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://blobscan.com/address/0xFF00000000000000000000000000000000000010) | +| [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://blobscan.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) | +| [Base](https://base.org/) | [`0xFF00000000000000000000000000000000008453`](https://blobscan.com/address/0xFF00000000000000000000000000000000008453) | + +## Calldata {#calldata} + +Calldata বলতে লেনদেনের অংশ হিসেবে পাঠানো বাইটগুলিকে বোঝায়। এটি ব্লকচেইনের স্থায়ী রেকর্ডের অংশ হিসাবে সেই ব্লকে সংরক্ষণ করা হয় যা সেই লেনদেনটি অন্তর্ভুক্ত করে। + +ব্লকচেইনে স্থায়ীভাবে ডেটা রাখার জন্য এটি সবচেয়ে সস্তা পদ্ধতি। প্রতি বাইটের খরচ হয় 4 এক্সিকিউশন গ্যাস (যদি বাইটটি শূন্য হয়) অথবা 16 গ্যাস (অন্য কোনো মান)। যদি ডেটা সংকুচিত করা হয়, যা একটি মানসম্মত অনুশীলন, তাহলে প্রতিটি বাইট মানের সমান সম্ভাবনা থাকে, তাই গড় খরচ প্রতি বাইটে প্রায় 15.95 গ্যাস। + +লেখার সময়, দাম 12 gwei/গ্যাস এবং 2300 $/ETH, যার মানে প্রতি কিলোবাইটে খরচ প্রায় 45 সেন্ট। যেহেতু EIP-4844 এর আগে এটি সবচেয়ে সস্তা পদ্ধতি ছিল, তাই রোলআপগুলি এই পদ্ধতিটি লেনদেনের তথ্য সঞ্চয় করতে ব্যবহার করত, যা [ফল্ট চ্যালেঞ্জের](https://docs.optimism.io/stack/protocol/overview#fault-proofs) জন্য উপলব্ধ থাকা প্রয়োজন, কিন্তু সরাসরি অনচেইনে অ্যাক্সেসযোগ্য হওয়ার প্রয়োজন নেই। + +এখানে কিছু বিখ্যাত রোলআপ দ্বারা পোস্ট করা লেনদেনগুলি দেখার জন্য ঠিকানা দেওয়া হলো। + +| রোলআপ | মেলবক্স ঠিকানা | +| ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------- | +| [Optimism](https://www.optimism.io/) | [`0xFF00000000000000000000000000000000000010`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000000010) | +| [Arbitrum](https://arbitrum.io/) | [`0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6`](https://eth.blockscout.com/address/0x1c479675ad559DC151F6Ec7ed3FbF8ceE79582B6) | +| [Base](https://base.org/) | [`0xFF00000000000000000000000000000000008453`](https://eth.blockscout.com/address/0xFF00000000000000000000000000000000008453) | + +## L1 মেকানিজম সহ অফচেইন {#offchain-with-l1-mechs} + +আপনার নিরাপত্তা ট্রেডঅফের উপর নির্ভর করে, তথ্য অন্য কোথাও রাখা এবং প্রয়োজনে ডেটা উপলব্ধতা নিশ্চিত করে এমন একটি মেকানিজম ব্যবহার করা গ্রহণযোগ্য হতে পারে। এটি কাজ করার জন্য দুটি প্রয়োজনীয়তা রয়েছে: + +1. ব্লকচেইনে ডেটার একটি [হ্যাস](https://en.wikipedia.org/wiki/Cryptographic_hash_function) পোস্ট করুন, যাকে _ইনপুট কমিটমেন্ট_ বলা হয়। এটি একটি একক 32-বাইট শব্দ হতে পারে, তাই এটি ব্যয়বহুল নয়। যতক্ষণ ইনপুট কমিটমেন্ট উপলব্ধ থাকে, ততক্ষণ অখণ্ডতা নিশ্চিত, কারণ একই মানে হ্যাস হবে এমন অন্য কোনো ডেটা খুঁজে পাওয়া সম্ভব নয়। সুতরাং যদি ভুল ডেটা প্রদান করা হয়, তা সনাক্ত করা যেতে পারে। + +2. এমন একটি মেকানিজম রাখুন যা প্রাপ্যতা নিশ্চিত করে। উদাহরণস্বরূপ, [Redstone](https://redstone.xyz/docs/what-is-redstone)-এ যেকোনো নোড একটি প্রাপ্যতা চ্যালেঞ্জ জমা দিতে পারে। যদি সিকোয়েন্সার সময়সীমার মধ্যে অনচেইনে প্রতিক্রিয়া না জানায়, তবে ইনপুট কমিটমেন্টটি বাতিল করা হয়, তাই তথ্যটি কখনও পোস্ট করা হয়নি বলে মনে করা হয়। + +এটি একটি অপ্টিমেস্টিক রোলআপের জন্য গ্রহণযোগ্য কারণ আমরা ইতিমধ্যেই স্টেট রুটের জন্য অন্তত একজন সৎ যাচাইকারীর উপর নির্ভর করছি। এমন একজন সৎ যাচাইকারী এটিও নিশ্চিত করবে যে ব্লক প্রক্রিয়া করার জন্য তার কাছে ডেটা আছে, এবং যদি তথ্য অফচেইনে উপলব্ধ না থাকে তবে একটি প্রাপ্যতা চ্যালেঞ্জ জারি করবে। এই ধরনের অপ্টিমেস্টিক রোলআপকে [প্লাসমা](/developers/docs/scaling/plasma/) বলা হয়। + +## কন্ট্র্যাক্ট কোড {#contract-code} + +যে তথ্য কেবল একবার লিখতে হবে, কখনও ওভাররাইট হবে না এবং অনচেইনে উপলব্ধ থাকা প্রয়োজন, তা কন্ট্র্যাক্ট কোড হিসাবে সংরক্ষণ করা যেতে পারে। এর মানে হলো আমরা ডেটা দিয়ে একটি "স্মার্ট কন্ট্র্যাক্ট" তৈরি করি এবং তারপর তথ্য পড়ার জন্য [`EXTCODECOPY`](https://www.evm.codes/#3c?fork=shanghai) ব্যবহার করি। সুবিধা হলো কোড কপি করা তুলনামূলকভাবে সস্তা। + +মেমরি সম্প্রসারণের খরচ ছাড়াও, `EXTCODECOPY`-তে একটি কন্ট্র্যাক্টে প্রথম অ্যাক্সেসের জন্য 2600 গ্যাস খরচ হয় (যখন এটি "কোল্ড" থাকে) এবং একই কন্ট্র্যাক্ট থেকে পরবর্তী কপিগুলির জন্য 100 গ্যাস এবং প্রতি 32 বাইট শব্দের জন্য 3 গ্যাস খরচ হয়। calldata-এর তুলনায়, যার খরচ প্রতি বাইটে 15.95, এটি প্রায় 200 বাইট থেকে শুরু করে সস্তা। [মেমরি সম্প্রসারণ খরচের সূত্র](https://www.evm.codes/about#memoryexpansion) অনুসারে, যতক্ষণ আপনার 4MB-এর বেশি মেমরির প্রয়োজন না হয়, ততক্ষণ মেমরি সম্প্রসারণ খরচ calldata যোগ করার খরচের চেয়ে কম। + +অবশ্যই, এটি কেবল ডেটা _পড়ার_ খরচ। কন্ট্র্যাক্ট তৈরি করতে প্রায় 32,000 গ্যাস + 200 গ্যাস/বাইট খরচ হয়। এই পদ্ধতিটি তখনই সাশ্রয়ী হয় যখন একই তথ্য বিভিন্ন লেনদেনে অনেকবার পড়ার প্রয়োজন হয়। + +কন্ট্র্যাক্ট কোড অর্থহীন হতে পারে, যতক্ষণ না এটি `0xEF` দিয়ে শুরু হয়। `0xEF` দিয়ে শুরু হওয়া কন্ট্র্যাক্টগুলিকে [ইথেরিয়াম অবজেক্ট ফরম্যাট](https://notes.ethereum.org/@ipsilon/evm-object-format-overview) হিসাবে ব্যাখ্যা করা হয়, যার অনেক কঠোর প্রয়োজনীয়তা রয়েছে। + +## ইভেন্ট {#events} + +[ইভেন্টগুলি](https://docs.alchemy.com/docs/solidity-events) স্মার্ট কন্ট্র্যাক্ট দ্বারা নির্গত হয় এবং অফচেইন সফ্টওয়্যার দ্বারা পড়া হয়। +তাদের সুবিধা হল অফচেইন কোড ইভেন্ট শুনতে পারে। খরচ হল [গ্যাস](https://www.evm.codes/#a0?fork=cancun), 375 প্লাস প্রতি বাইট ডেটার জন্য 8 গ্যাস। 12 gwei/গ্যাস এবং 2300 $/ETH-এ, এর অর্থ এক সেন্ট প্লাস প্রতি কিলোবাইটে 22 সেন্ট। + +## সংগ্রহস্থল {#storage} + +স্মার্ট কন্ট্র্যাক্টগুলির [স্থায়ী সংগ্রহস্থলে](https://docs.alchemy.com/docs/smart-contract-storage-layout#what-is-storage-memory) অ্যাক্সেস আছে। তবে এটি খুব ব্যয়বহুল। আগে থেকে খালি একটি সংগ্রহস্থল স্লটে একটি 32 বাইট শব্দ লেখার জন্য [22,100 গ্যাস খরচ](https://www.evm.codes/#55?fork=cancun) হতে পারে। 12 gwei/গ্যাস এবং 2300 $/ETH-এ, এটি প্রতি লেখার অপারেশনে প্রায় 61 সেন্ট, অথবা প্রতি কিলোবাইটে $19.5। + +এটি ইথেরিয়ামের সবচেয়ে ব্যয়বহুল সংগ্রহস্থলের রূপ। + +## সারসংক্ষেপ {#summary} + +এই টেবিলটি বিভিন্ন বিকল্প, তাদের সুবিধা এবং অসুবিধাগুলির সারসংক্ষেপ করে। + +| সংগ্রহস্থলের প্রকার | ডেটার উৎস | প্রাপ্যতা গ্যারান্টি | অনচেইন প্রাপ্যতা | অতিরিক্ত সীমাবদ্ধতা | +| --------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------- | +| EIP-4844 blobs | অফচেইন | [~18 দিনের](https://github.com/ethereum/consensus-specs/blob/dev/specs/deneb/p2p-interface.md#configuration) জন্য ইথেরিয়াম গ্যারান্টি | শুধু হ্যাস উপলব্ধ | | +| Calldata | অফচেইন | ইথেরিয়াম চিরকালের জন্য গ্যারান্টি (ব্লকচেইনের অংশ) | শুধুমাত্র একটি কন্ট্র্যাক্টে লেখা হলে এবং সেই লেনদেনে উপলব্ধ | | +| L1 মেকানিজম সহ অফচেইন | অফচেইন | চ্যালেঞ্জ পিরিয়ডের সময় "একজন সৎ যাচাইকারী" গ্যারান্টি | শুধুমাত্র হ্যাস | চ্যালেঞ্জ মেকানিজম দ্বারা গ্যারান্টিযুক্ত, শুধুমাত্র চ্যালেঞ্জ পিরিয়ডের সময় | +| কন্ট্র্যাক্ট কোড | অনচেইন বা অফচেইন | ইথেরিয়াম চিরকালের জন্য গ্যারান্টি (ব্লকচেইনের অংশ) | হ্যাঁ | একটি "র‍্যান্ডম" ঠিকানায় লেখা, `0xEF` দিয়ে শুরু হতে পারে না | +| অনুষ্ঠানসমূহ | অনচেইন | ইথেরিয়াম চিরকালের জন্য গ্যারান্টি (ব্লকচেইনের অংশ) | না | | +| সংগ্রহস্থল | অনচেইন | ইথেরিয়াম চিরকালের জন্য গ্যারান্টি (ব্লকচেইনের অংশ এবং ওভাররাইট না হওয়া পর্যন্ত বর্তমান অবস্থা) | হ্যাঁ | | diff --git a/public/content/translations/bn/developers/docs/data-availability/index.md b/public/content/translations/bn/developers/docs/data-availability/index.md new file mode 100644 index 00000000000..7511736d5f6 --- /dev/null +++ b/public/content/translations/bn/developers/docs/data-availability/index.md @@ -0,0 +1,84 @@ +--- +title: "ডেটা উপলব্ধতা" +description: "Ethereum-এ ডেটা উপলব্ধতা সম্পর্কিত সমস্যা এবং সমাধানের একটি সংক্ষিপ্ত বিবরণ" +lang: bn +--- + +"বিশ্বাস করবেন না, যাচাই করুন" Ethereum-এর একটি সাধারণ নীতি। ধারণাটি হল যে আপনার নোড স্বাধীনভাবে যাচাই করতে পারে যে এটি যে তথ্য গ্রহণ করে তা সঠিক কিনা। এটি তারা তাদের সহকর্মীদের থেকে প্রাপ্ত ব্লকগুলিতে থাকা সমস্ত লেনদেন সম্পাদন করে করে থাকে, যাতে প্রস্তাবিত পরিবর্তনগুলি নোড দ্বারা স্বাধীনভাবে গণনা করা পরিবর্তনগুলির সাথে হুবহু মিলে যায়। এর মানে হল যে নোডগুলিকে বিশ্বাস করতে হবে না যে ব্লকের প্রেরকরা সৎ। ডেটা অনুপস্থিত থাকলে এটি সম্ভব নয়। + +**ডেটা উপলব্ধতা** বলতে বোঝায় একজন ব্যবহারকারীর সেই আত্মবিশ্বাস যে একটি ব্লক যাচাই করার জন্য প্রয়োজনীয় ডেটা সত্যিই সমস্ত নেটওয়ার্ক অংশগ্রহণকারীদের জন্য উপলব্ধ রয়েছে। Ethereum লেয়ার 1-এর সম্পূর্ণ নোডগুলির জন্য এটি তুলনামূলকভাবে সহজ; সম্পূর্ণ নোড প্রতিটি ব্লকের সমস্ত ডেটার একটি অনুলিপি ডাউনলোড করে - ডাউনলোডের জন্য ডেটা অবশ্যই উপলব্ধ থাকতে হবে। অনুপস্থিত ডেটা সহ একটি ব্লককে ব্লকচেইনে যোগ না করে বাতিল করে দেওয়া হবে। এটি হল "অনচেইন ডেটা উপলব্ধতা" এবং এটি মনোলিথিক ব্লকচেইনের একটি বৈশিষ্ট্য। সম্পূর্ণ নোডগুলিকে অবৈধ লেনদেন গ্রহণ করার জন্য প্রতারিত করা যায় না কারণ তারা নিজেদের জন্য প্রতিটি লেনদেন ডাউনলোড এবং সম্পাদন করে। যাইহোক, মডুলার ব্লকচেইন, লেয়ার 2 রোলআপ এবং লাইট ক্লায়েন্টদের জন্য, ডেটা উপলব্ধতার প্রেক্ষাপট আরও জটিল, যার জন্য কিছু আরও পরিশীলিত যাচাইকরণ পদ্ধতির প্রয়োজন। + +## পূর্বশর্ত {#prerequisites} + +আপনার [ব্লকচেইনের মৌলিক বিষয়গুলি](/developers/docs/intro-to-ethereum/)-এর উপর একটি ভালো ধারণা থাকা উচিত, বিশেষ করে [কনসেন্সাস মেকানিজম](/developers/docs/consensus-mechanisms/)-এর উপর। এই পৃষ্ঠাটি আরও অনুমান করে যে পাঠক [ব্লক](/developers/docs/blocks/), [লেনদেন](/developers/docs/transactions/), [নোড](/developers/docs/nodes-and-clients/), [স্কেলিং সমাধান](/developers/docs/scaling/), এবং অন্যান্য প্রাসঙ্গিক বিষয়গুলির সাথে পরিচিত। + +## ডেটা উপলব্ধতার সমস্যা {#the-data-availability-problem} + +ডেটা উপলব্ধতার সমস্যা হলো সমগ্র নেটওয়ার্ককে প্রমাণ করার প্রয়োজন যে কিছু লেনদেনের ডেটার সংক্ষিপ্ত রূপ যা ব্লকচেইনে যোগ করা হচ্ছে তা সত্যিই বৈধ লেনদেনের একটি সেটকে প্রতিনিধিত্ব করে, কিন্তু সমস্ত নোডকে সমস্ত ডেটা ডাউনলোড করার প্রয়োজন ছাড়াই এটি করা। স্বাধীনভাবে ব্লক যাচাই করার জন্য সম্পূর্ণ লেনদেনের ডেটা প্রয়োজনীয়, কিন্তু সমস্ত নোডকে সমস্ত লেনদেনের ডেটা ডাউনলোড করতে বাধ্য করা স্কেলিংয়ের জন্য একটি বাধা। ডেটা উপলব্ধতার সমস্যার সমাধানগুলি সেই নেটওয়ার্ক অংশগ্রহণকারীদের জন্য যথেষ্ট আশ্বাস প্রদানের লক্ষ্যে করা হয় যারা নিজেদের জন্য ডেটা ডাউনলোড এবং সংরক্ষণ করে না, যাতে যাচাইয়ের জন্য সম্পূর্ণ লেনদেনের ডেটা উপলব্ধ করা হয়েছিল। + +[লাইট নোড](/developers/docs/nodes-and-clients/light-clients) এবং [লেয়ার 2 রোলআপ](/developers/docs/scaling) হলো নেটওয়ার্ক অংশগ্রহণকারীদের গুরুত্বপূর্ণ উদাহরণ যাদের শক্তিশালী ডেটা উপলব্ধতার আশ্বাস প্রয়োজন কিন্তু তারা নিজেদের জন্য লেনদেনের ডেটা ডাউনলোড এবং প্রক্রিয়া করতে পারে না। লেনদেনের ডেটা ডাউনলোড করা এড়ানোই লাইট নোডগুলিকে হালকা করে তোলে এবং রোলআপগুলিকে কার্যকর স্কেলিং সমাধান হতে সক্ষম করে। + +ভবিষ্যতের ["স্টেটলেস"](/roadmap/statelessness) Ethereum ক্লায়েন্টদের জন্য ডেটা উপলব্ধতা একটি গুরুত্বপূর্ণ উদ্বেগের বিষয়, যাদের ব্লক যাচাই করার জন্য স্টেট ডেটা ডাউনলোড এবং সংরক্ষণ করার প্রয়োজন হয় না। স্টেটলেস ক্লায়েন্টদের এখনও নিশ্চিত হতে হবে যে ডেটা _কোথাও_ উপলব্ধ আছে এবং এটি সঠিকভাবে প্রক্রিয়া করা হয়েছে। + +## ডেটা উপলব্ধতার সমাধান {#data-availability-solutions} + +### ডেটা উপলব্ধতা স্যাম্পলিং (DAS) {#data-availability-sampling} + +ডেটা উপলব্ধতা স্যাম্পলিং (DAS) হল নেটওয়ার্কের জন্য ডেটা উপলব্ধ কিনা তা পরীক্ষা করার একটি উপায়, যা কোনো একক নোডের উপর খুব বেশি চাপ সৃষ্টি করে না। প্রতিটি নোড (নন-স্টেকিং নোড সহ) মোট ডেটার কিছু ছোট, এলোমেলোভাবে নির্বাচিত উপসেট ডাউনলোড করে। নমুনাগুলি সফলভাবে ডাউনলোড করা উচ্চ আত্মবিশ্বাসের সাথে নিশ্চিত করে যে সমস্ত ডেটা উপলব্ধ রয়েছে। এটি ডেটা ইরেজার কোডিং-এর উপর নির্ভর করে, যা একটি প্রদত্ত ডেটাসেটকে রিডান্ড্যান্ট তথ্য দিয়ে প্রসারিত করে (এটি করার উপায় হলো ডেটার উপর একটি _পলিনোমিয়াল_ নামে পরিচিত একটি ফাংশন ফিট করা এবং অতিরিক্ত পয়েন্টে সেই পলিনোমিয়ালটিকে মূল্যায়ন করা)। এটি প্রয়োজনে রিডান্ড্যান্ট ডেটা থেকে মূল ডেটা পুনরুদ্ধার করতে দেয়। এই ডেটা তৈরির একটি পরিণতি হলো যদি মূল ডেটার _কোনো_ অংশ অনুপলব্ধ থাকে, তাহলে প্রসারিত ডেটার _অর্ধেক_ অনুপস্থিত থাকবে! প্রতিটি নোড দ্বারা ডাউনলোড করা ডেটা নমুনার পরিমাণ এমনভাবে টিউন করা যেতে পারে যাতে এটি _অত্যন্ত_ সম্ভাব্য যে প্রতিটি ক্লায়েন্ট দ্বারা নমুনা করা ডেটা খণ্ডগুলির মধ্যে অন্তত একটি অনুপস্থিত থাকবে _যদি_ অর্ধেকের কম ডেটা সত্যিই উপলব্ধ থাকে। + +[Full Danksharding](/roadmap/danksharding/#what-is-danksharding) বাস্তবায়িত হওয়ার পরে রোলআপ অপারেটররা যাতে তাদের লেনদেনের ডেটা উপলব্ধ করে তা নিশ্চিত করতে DAS ব্যবহার করা হবে। Ethereum নোডগুলি ব্লব-এ প্রদত্ত লেনদেনের ডেটার এলোমেলোভাবে নমুনা নেবে, উপরে ব্যাখ্যা করা রিডান্ডান্সি স্কিম ব্যবহার করে, যাতে নিশ্চিত করা যায় যে সমস্ত ডেটা বিদ্যমান রয়েছে। একই কৌশলটি ব্লক প্রযোজকরা তাদের সমস্ত ডেটা সুরক্ষিত লাইট ক্লায়েন্টদের জন্য উপলব্ধ করছে কিনা তা নিশ্চিত করতেও ব্যবহার করা যেতে পারে। একইভাবে, [প্রস্তাবক-নির্মাতা বিচ্ছেদ](/roadmap/pbs)-এর অধীনে, শুধুমাত্র ব্লক নির্মাতাকে একটি সম্পূর্ণ ব্লক প্রক্রিয়া করতে হবে - অন্যান্য যাচাইকারীরা ডেটা উপলব্ধতা স্যাম্পলিং ব্যবহার করে যাচাই করবে। + +### ডেটা উপলব্ধতা কমিটি {#data-availability-committees} + +ডেটা উপলব্ধতা কমিটি (DACs) হল বিশ্বস্ত পক্ষ যারা ডেটা উপলব্ধতা প্রদান করে, বা তার প্রমাণ দেয়। DAC গুলি DAS-এর পরিবর্তে, [বা এর সাথে একত্রে](https://hackmd.io/@vbuterin/sharding_proposal#Why-not-use-just-committees-and-not-DAS) ব্যবহার করা যেতে পারে। কমিটির সাথে আসা নিরাপত্তা নিশ্চয়তা নির্দিষ্ট সেট আপের উপর নির্ভর করে। উদাহরণস্বরূপ, Ethereum লাইট নোডগুলির জন্য ডেটা উপলব্ধতার প্রমাণ দেওয়ার জন্য যাচাইকারীদের এলোমেলোভাবে নমুনা করা উপসেট ব্যবহার করে। + +কিছু ভ্যালিডিয়াম দ্বারা DACs ব্যবহার করা হয়। DAC হল একটি বিশ্বস্ত নোড সেট যা অফলাইনে ডেটার অনুলিপি সংরক্ষণ করে। বিবাদের ক্ষেত্রে DAC-কে ডেটা উপলব্ধ করতে হয়। DAC-এর সদস্যরা অনচেইন অ্যাটেস্টেশনও প্রকাশ করে প্রমাণ করার জন্য যে উক্ত ডেটা সত্যিই উপলব্ধ। কিছু ভ্যালিডিয়াম DAC-কে একটি প্রুফ-অফ-স্টেক (PoS) যাচাইকারী সিস্টেম দিয়ে প্রতিস্থাপন করে। এখানে, যে কেউ একজন যাচাইকারী হতে পারে এবং অফলাইনে ডেটা সংরক্ষণ করতে পারে। তবে, তাদের একটি "বন্ড" প্রদান করতে হবে, যা একটি স্মার্ট কন্ট্র্যাক্টে জমা করা হয়। বিদ্বেষপূর্ণ আচরণের ক্ষেত্রে, যেমন যাচাইকারীর ডেটা আটকে রাখা, বন্ডটি স্ল্যাশ করা যেতে পারে। প্রুফ-অফ-স্টেক ডেটা উপলব্ধতা কমিটিগুলি নিয়মিত DAC-এর চেয়ে যথেষ্ট বেশি সুরক্ষিত কারণ তারা সরাসরি সৎ আচরণকে উৎসাহিত করে। + +## ডেটা উপলব্ধতা এবং লাইট নোড {#data-availability-and-light-nodes} + +[লাইট নোড](/developers/docs/nodes-and-clients/light-clients)-কে ব্লক ডেটা ডাউনলোড না করেই তাদের প্রাপ্ত ব্লক হেডারগুলির সঠিকতা যাচাই করতে হবে। এই হালকাতার মূল্য হলো সম্পূর্ণ নোডগুলির মতো স্থানীয়ভাবে লেনদেন পুনরায় সম্পাদন করে ব্লক হেডারগুলি স্বাধীনভাবে যাচাই করতে না পারা। + +Ethereum লাইট নোডগুলি 512 জন যাচাইকারীর এলোমেলো সেটের উপর বিশ্বাস করে যাদের একটি _সিঙ্ক কমিটি_-তে নিয়োগ করা হয়েছে। সিঙ্ক কমিটি একটি DAC হিসাবে কাজ করে যা লাইট ক্লায়েন্টদের একটি ক্রিপ্টোগ্রাফিক স্বাক্ষরের মাধ্যমে সংকেত দেয় যে হেডারের ডেটা সঠিক। প্রতিদিন, সিঙ্ক কমিটি রিফ্রেশ হয়। প্রতিটি ব্লক হেডার লাইট নোডগুলিকে সতর্ক করে যে কোন যাচাইকারীরা _পরবর্তী_ ব্লকে স্বাক্ষর করবে বলে আশা করা যায়, তাই তারা আসল সিঙ্ক-কমিটি হিসাবে ভান করা কোনো বিদ্বেষপূর্ণ গোষ্ঠীর উপর বিশ্বাস করতে প্রতারিত হতে পারে না। + +কিন্তু, যদি কোনো আক্রমণকারী কোনোভাবে লাইট ক্লায়েন্টদের কাছে একটি বিদ্বেষপূর্ণ ব্লক হেডার পাঠাতে এবং তাদের বোঝাতে সক্ষম হয় যে এটি একটি সৎ সিঙ্ক-কমিটি দ্বারা স্বাক্ষরিত হয়েছে, তাহলে কী হবে? সেক্ষেত্রে, আক্রমণকারী অবৈধ লেনদেন অন্তর্ভুক্ত করতে পারে এবং লাইট ক্লায়েন্ট অন্ধভাবে সেগুলি গ্রহণ করবে, কারণ তারা ব্লক হেডারে সংক্ষিপ্ত করা সমস্ত স্টেট পরিবর্তনগুলি স্বাধীনভাবে পরীক্ষা করে না। এর থেকে রক্ষা পেতে, লাইট ক্লায়েন্ট জালিয়াতির প্রমাণ (fraud proofs) ব্যবহার করতে পারে। + +এই জালিয়াতির প্রমাণগুলি যেভাবে কাজ করে তা হলো, একটি সম্পূর্ণ নোড, নেটওয়ার্কে একটি অবৈধ স্টেট ট্রানজিশন দেখতে পেয়ে, দ্রুত একটি ছোট ডেটা তৈরি করতে পারে যা প্রমাণ করে যে একটি প্রস্তাবিত স্টেট ট্রানজিশন একটি প্রদত্ত লেনদেনের সেট থেকে সম্ভব নয় এবং সেই ডেটা পিয়ারদের কাছে সম্প্রচার করতে পারে। লাইট নোডগুলি সেই জালিয়াতির প্রমাণগুলি তুলে নিতে পারে এবং খারাপ ব্লক হেডারগুলি বাতিল করতে ব্যবহার করতে পারে, যা নিশ্চিত করে যে তারা সম্পূর্ণ নোডগুলির মতো একই সৎ চেইনে থাকে। + +এটি সম্পূর্ণ নোডগুলির সম্পূর্ণ লেনদেনের ডেটাতে অ্যাক্সেসের উপর নির্ভর করে। একজন আক্রমণকারী যে একটি খারাপ ব্লক হেডার সম্প্রচার করে এবং লেনদেনের ডেটা উপলব্ধ করতে ব্যর্থ হয়, সে সম্পূর্ণ নোডগুলিকে জালিয়াতির প্রমাণ তৈরি করতে বাধা দিতে সক্ষম হবে। সম্পূর্ণ নোডগুলি হয়তো একটি খারাপ ব্লক সম্পর্কে একটি সতর্কতা সংকেত দিতে পারে, কিন্তু তারা তাদের সতর্কতাকে প্রমাণ দিয়ে সমর্থন করতে পারবে না, কারণ প্রমাণ তৈরি করার জন্য ডেটা উপলব্ধ করা হয়নি! + +এই ডেটা উপলব্ধতার সমস্যার সমাধান হল DAS। লাইট নোডগুলি সম্পূর্ণ স্টেট ডেটার খুব ছোট এলোমেলো খণ্ড ডাউনলোড করে এবং সম্পূর্ণ ডেটা সেট উপলব্ধ কিনা তা যাচাই করতে নমুনাগুলি ব্যবহার করে। Nটি এলোমেলো খণ্ড ডাউনলোড করার পরে ভুলভাবে সম্পূর্ণ ডেটা উপলব্ধতা অনুমান করার প্রকৃত সম্ভাবনা গণনা করা যেতে পারে ([100টি খণ্ডের জন্য সম্ভাবনা হল 10^-30](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html), অর্থাৎ, অবিশ্বাস্যভাবে অসম্ভাব্য)। + +এমনকি এই পরিস্থিতিতেও, মাত্র কয়েকটি বাইট আটকে রাখা আক্রমণগুলি এলোমেলো ডেটা অনুরোধকারী ক্লায়েন্টদের দ্বারা অলক্ষিত থেকে যেতে পারে। ইরেজার কোডিং ডেটার ছোট অনুপস্থিত অংশগুলি পুনর্গঠন করে এটি ঠিক করে, যা প্রস্তাবিত স্টেট পরিবর্তনগুলি পরীক্ষা করতে ব্যবহার করা যেতে পারে। পুনর্গঠিত ডেটা ব্যবহার করে একটি জালিয়াতির প্রমাণ তৈরি করা যেতে পারে, যা লাইট নোডগুলিকে খারাপ হেডার গ্রহণ করা থেকে বিরত রাখে। + +**দ্রষ্টব্য:** প্রুফ-অফ-স্টেক Ethereum লাইট ক্লায়েন্টদের জন্য DAS এবং জালিয়াতির প্রমাণ এখনও বাস্তবায়িত হয়নি, তবে সেগুলি রোডম্যাপে রয়েছে, যা সম্ভবত ZK-SNARK ভিত্তিক প্রমাণের রূপ নেবে। আজকের লাইট ক্লায়েন্টরা এক ধরনের DAC-এর উপর নির্ভর করে: তারা সিঙ্ক-কমিটির পরিচয় যাচাই করে এবং তারপর তাদের প্রাপ্ত স্বাক্ষরিত ব্লক হেডারগুলিতে বিশ্বাস করে। + +## ডেটা উপলব্ধতা এবং লেয়ার 2 রোলআপ {#data-availability-and-layer-2-rollups} + +[লেয়ার 2 স্কেলিং সমাধান](/layer-2/), যেমন [রোলআপ](/glossary/#rollups), অফলাইনে লেনদেন প্রক্রিয়া করে লেনদেনের খরচ কমায় এবং Ethereum-এর থ্রুপুট বাড়ায়। রোলআপ লেনদেনগুলি সংকুচিত করা হয় এবং ব্যাচ আকারে Ethereum-এ পোস্ট করা হয়। ব্যাচগুলি Ethereum-এ একটি একক লেনদেনে হাজার হাজার স্বতন্ত্র অফচেইন লেনদেনকে প্রতিনিধিত্ব করে। এটি বেস লেয়ারের যানজট কমায় এবং ব্যবহারকারীদের জন্য ফি কমায়। + +তবে, Ethereum-এ পোস্ট করা 'সারাংশ' লেনদেনগুলিতে কেবল তখনই বিশ্বাস করা সম্ভব যদি প্রস্তাবিত স্টেট পরিবর্তন স্বাধীনভাবে যাচাই করা যায় এবং নিশ্চিত করা যায় যে এটি সমস্ত স্বতন্ত্র অফচেইন লেনদেন প্রয়োগের ফল। যদি রোলআপ অপারেটররা এই যাচাইয়ের জন্য লেনদেনের ডেটা উপলব্ধ না করে, তাহলে তারা Ethereum-এ ভুল ডেটা পাঠাতে পারে। + +[অপ্টিমেস্টিক রোলআপ](/developers/docs/scaling/optimistic-rollups/) সংকুচিত লেনদেনের ডেটা Ethereum-এ পোস্ট করে এবং কিছু সময়ের জন্য (সাধারণত 7 দিন) অপেক্ষা করে যাতে স্বাধীন যাচাইকারীরা ডেটা পরীক্ষা করতে পারে। যদি কেউ কোনো সমস্যা শনাক্ত করে, তারা একটি জালিয়াতির প্রমাণ তৈরি করতে পারে এবং রোলআপকে চ্যালেঞ্জ করতে এটি ব্যবহার করতে পারে। এটি চেইনটিকে রোল ব্যাক করতে এবং অবৈধ ব্লকটি বাদ দিতে বাধ্য করবে। ডেটা উপলব্ধ থাকলেই কেবল এটি সম্ভব। বর্তমানে, দুটি উপায়ে অপ্টিমেস্টিক রোলআপগুলি L1-এ লেনদেনের ডেটা পোস্ট করে। কিছু রোলআপ `CALLDATA` হিসাবে ডেটা স্থায়ীভাবে উপলব্ধ করে, যা স্থায়ীভাবে অনচেইনে থাকে। EIP-4844 বাস্তবায়নের সাথে, কিছু রোলআপ তাদের লেনদেনের ডেটা পরিবর্তে সস্তা ব্লব স্টোরেজে পোস্ট করে। এটি স্থায়ী সংগ্রহস্থল নয়। স্বাধীন যাচাইকারীদের ~18 দিনের মধ্যে ব্লবগুলি জিজ্ঞাসা করতে হবে এবং তাদের চ্যালেঞ্জ উত্থাপন করতে হবে, এরপরে ডেটা Ethereum লেয়ার-1 থেকে মুছে ফেলা হবে। সেই স্বল্প নির্দিষ্ট সময়ের জন্য শুধুমাত্র Ethereum প্রোটোকল দ্বারা ডেটা উপলব্ধতার নিশ্চয়তা দেওয়া হয়। এর পরে, এটি Ethereum ইকোসিস্টেমের অন্যান্য সত্তার দায়িত্ব হয়ে যায়। যেকোনো নোড DAS ব্যবহার করে ডেটা উপলব্ধতা যাচাই করতে পারে, অর্থাৎ, ব্লব ডেটার ছোট, এলোমেলো নমুনা ডাউনলোড করে। + +[জিরো-নলেজ (ZK) রোলআপ](/developers/docs/scaling/zk-rollups)-এর লেনদেনের ডেটা পোস্ট করার প্রয়োজন নেই কারণ [জিরো-নলেজ ভ্যালিডিটি প্রুফ](/glossary/#zk-proof) স্টেট ট্রানজিশনের সঠিকতার নিশ্চয়তা দেয়। তবে, ডেটা উপলব্ধতা এখনও একটি সমস্যা কারণ আমরা এর স্টেট ডেটাতে অ্যাক্সেস ছাড়া ZK-রোলআপের কার্যকারিতা (বা এর সাথে ইন্টারঅ্যাক্ট করা) নিশ্চিত করতে পারি না। উদাহরণস্বরূপ, যদি একজন অপারেটর রোলআপের স্টেট সম্পর্কে বিশদ বিবরণ আটকে রাখে তবে ব্যবহারকারীরা তাদের ব্যালেন্স জানতে পারে না। এছাড়াও, তারা নতুন যোগ করা ব্লকে থাকা তথ্য ব্যবহার করে স্টেট আপডেট করতে পারে না। + +## ডেটা উপলব্ধতা বনাম ডেটা পুনরুদ্ধারযোগ্যতা {#data-availability-vs-data-retrievability} + +ডেটা উপলব্ধতা ডেটা পুনরুদ্ধারযোগ্যতা থেকে ভিন্ন। ডেটা উপলব্ধতা হল এই আশ্বাস যে সম্পূর্ণ নোডগুলি একটি নির্দিষ্ট ব্লকের সাথে সম্পর্কিত লেনদেনের সম্পূর্ণ সেট অ্যাক্সেস এবং যাচাই করতে সক্ষম হয়েছে। এর মানে এই নয় যে ডেটা চিরকালের জন্য অ্যাক্সেসযোগ্য। + +ডেটা পুনরুদ্ধারযোগ্যতা হল ব্লকচেইন থেকে _ঐতিহাসিক তথ্য_ পুনরুদ্ধার করার জন্য নোডগুলির ক্ষমতা। এই ঐতিহাসিক ডেটা নতুন ব্লক যাচাই করার জন্য প্রয়োজন হয় না, এটি শুধুমাত্র জেনেসিস ব্লক থেকে সম্পূর্ণ নোড সিঙ্ক করার জন্য বা নির্দিষ্ট ঐতিহাসিক অনুরোধ পরিবেশন করার জন্য প্রয়োজন। + +মূল Ethereum প্রোটোকল মূলত ডেটা উপলব্ধতা নিয়ে চিন্তিত, ডেটা পুনরুদ্ধারযোগ্যতা নিয়ে নয়। ডেটা পুনরুদ্ধারযোগ্যতা তৃতীয় পক্ষ দ্বারা চালিত আর্কাইভ নোডগুলির একটি ছোট জনসংখ্যা দ্বারা সরবরাহ করা যেতে পারে, অথবা এটি [পোর্টাল নেটওয়ার্ক](https://www.ethportal.net/)-এর মতো বিকেন্দ্রীভূত ফাইল স্টোরেজ ব্যবহার করে নেটওয়ার্ক জুড়ে বিতরণ করা যেতে পারে। + +## আরও পড়ুন {#further-reading} + +- [ডেটা উপলব্ধতা কী?](https://medium.com/blockchain-capital-blog/wtf-is-data-availability-80c2c95ded0f) +- [ডেটা উপলব্ধতা কী?](https://coinmarketcap.com/academy/article/what-is-data-availability) +- [ডেটা উপলব্ধতা চেকের উপর একটি প্রাইমার](https://dankradfeist.de/ethereum/2019/12/20/data-availability-checks.html) +- [শার্ডিং + DAS প্রস্তাবের একটি ব্যাখ্যা](https://hackmd.io/@vbuterin/sharding_proposal#ELI5-data-availability-sampling) +- [ডেটা উপলব্ধতা এবং ইরেজার কোডিং-এর উপর একটি নোট](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding#can-an-attacker-not-circumvent-this-scheme-by-releasing-a-full-unavailable-block-but-then-only-releasing-individual-bits-of-data-as-clients-query-for-them) +- [ডেটা উপলব্ধতা কমিটি।](https://medium.com/starkware/data-availability-e5564c416424) +- [প্রুফ-অফ-স্টেক ডেটা উপলব্ধতা কমিটি।](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) +- [ডেটা পুনরুদ্ধারযোগ্যতা সমস্যার সমাধান](https://notes.ethereum.org/@vbuterin/data_sharding_roadmap#Who-would-store-historical-data-under-sharding) +- [ডেটা উপলব্ধতা অথবা: কীভাবে রোলআপগুলি চিন্তা করা বন্ধ করতে এবং Ethereum-কে ভালোবাসতে শিখেছে](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum) +- [EIP-7623: কলডেটার খরচ বৃদ্ধি](https://web.archive.org/web/20250515194659/https://research.2077.xyz/eip-7623-increase-calldata-cost) diff --git a/public/content/translations/bn/developers/docs/data-structures-and-encoding/index.md b/public/content/translations/bn/developers/docs/data-structures-and-encoding/index.md new file mode 100644 index 00000000000..f4b2bbfd489 --- /dev/null +++ b/public/content/translations/bn/developers/docs/data-structures-and-encoding/index.md @@ -0,0 +1,32 @@ +--- +title: "ডেটা স্ট্রাকচার এবং এনকোডিং" +description: "সাধারণ ভাবে ইথেরিয়াম ডাটা স্ট্রাটার ধারণা." +lang: bn +sidebarDepth: 2 +--- + +ইথেরিয়াম তৈরির রহস্য, এটি কিভাবে সংরক্ষণ এবং বড় করে তথ্য স্থানান্তর করে. এই ডেটা অবশ্যই এমন মানসম্মত এবং মেমরি-দক্ষ উপায়ে ফর্ম্যাট করা উচিত যাতে যে কেউ অপেক্ষাকৃত সাধারণ কনজিউমার-গ্রেড হার্ডওয়্যারে একটি [নোড চালাতে](/run-a-node/) পারে। এটি অর্জন করার জন্য, Ethereum স্ট্যাকের উপর বেশ কয়েকটি নির্দিষ্ট ডেটা স্ট্রাকচার ব্যবহার করা হয়। + +## পূর্বশর্ত {#prerequisites} + +আপনার Ethereum এবং [ক্লায়েন্ট সফটওয়্যার](/developers/docs/nodes-and-clients/) এর মূল বিষয়গুলি বোঝা উচিত। নেটওয়ার্কিং লেয়ার এবং [Ethereum হোয়াইটপেপার](/whitepaper/) সম্পর্কে পরিচিতি থাকা বাঞ্ছনীয়। + +## ডেটা স্ট্রাকচার {#data-structures} + +### প্যাট্রিসিয়া মার্কল ট্রাই {#patricia-merkle-tries} + +প্যাট্রিসিয়া মার্কল ট্রাই হলো এমন স্ট্রাকচার যা কী-ভ্যালু পেয়ারগুলিকে একটি ডিটারমিনিস্টিক এবং ক্রিপ্টোগ্রাফিক্যালি প্রমাণীকৃত ট্রাই-তে এনকোড করে। এগুলি Ethereum-এর এক্সিকিউশন লেয়ার জুড়ে ব্যাপকভাবে ব্যবহৃত হয়। + +[প্যাট্রিসিয়া মার্কল ট্রাই সম্পর্কে আরও](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) + +### রিকার্সিভ লেংথ প্রিফিক্স {#recursive-length-prefix} + +রিকার্সিভ লেংথ প্রিফিক্স (RLP) হল একটি সিরিয়ালাইজেশন পদ্ধতি যা Ethereum-এর এক্সিকিউশন লেয়ার জুড়ে ব্যাপকভাবে ব্যবহৃত হয়। + +[RLP সম্পর্কে আরও](/developers/docs/data-structures-and-encoding/rlp) + +### সিম্পল সিরিয়ালাইজ {#simple-serialize} + +সিম্পল সিরিয়ালাইজ (SSZ) হল Ethereum-এর কনসেন্সাস লেয়ার-এর প্রধান সিরিয়ালাইজেশন ফর্ম্যাট কারণ এটি মার্কলাইজেশনের সাথে সামঞ্জস্যপূর্ণ। + +[SSZ সম্পর্কে আরও](/developers/docs/data-structures-and-encoding/ssz) diff --git a/public/content/translations/bn/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md b/public/content/translations/bn/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md new file mode 100644 index 00000000000..e7c913ccfa5 --- /dev/null +++ b/public/content/translations/bn/developers/docs/data-structures-and-encoding/patricia-merkle-trie/index.md @@ -0,0 +1,266 @@ +--- +title: "মার্কল প্যাট্রিসিয়া ট্রাই" +description: "মার্কল প্যাট্রিসিয়া ট্রাই-এর ভূমিকা।" +lang: bn +sidebarDepth: 2 +--- + +ইথেরিয়ামের স্টেট (সমস্ত অ্যাকাউন্ট, ব্যালেন্স এবং স্মার্ট কন্ট্র্যাক্টের সমষ্টি), কম্পিউটার বিজ্ঞানে সাধারণত মার্কল ট্রি হিসাবে পরিচিত ডেটা স্ট্রাকচারের একটি বিশেষ সংস্করণে এনকোড করা হয়। এই কাঠামোটি ক্রিপ্টোগ্রাফির অনেক অ্যাপ্লিকেশনের জন্য দরকারী কারণ এটি ট্রিতে জড়িত ডেটার সমস্ত পৃথক অংশের মধ্যে একটি যাচাইযোগ্য সম্পর্ক তৈরি করে, যার ফলে একটি একক **রুট** মান পাওয়া যায় যা ডেটা সম্পর্কে বিভিন্ন বিষয় প্রমাণ করতে ব্যবহার করা যেতে পারে। + +ইথেরিয়ামের ডেটা স্ট্রাকচারটি একটি 'মডিফায়েড মার্কল-প্যাট্রিসিয়া ট্রাই', এর এই নামকরণ করা হয়েছে কারণ এটি PATRICIA (প্র্যাকটিক্যাল অ্যালগরিদম টু রিট্রিভ ইনফরমেশন কোডেড ইন আলফানিউমেরিক) এর কিছু বৈশিষ্ট্য ধার করে, এবং কারণ এটি ইথেরিয়াম স্টেট গঠনকারী আইটেমগুলির কার্যকর ডেটা রি**ট্রি**ভালের জন্য ডিজাইন করা হয়েছে। + +একটি মার্কল-প্যাট্রিসিয়া ট্রাই ডিটারমিনিস্টিক এবং ক্রিপ্টোগ্রাফিকভাবে যাচাইযোগ্য: একটি স্টেট রুট তৈরি করার একমাত্র উপায় হল স্টেটের প্রতিটি পৃথক অংশ থেকে এটি গণনা করা, এবং দুটি স্টেট যা অভিন্ন তা রুট হ্যাস এবং যে হ্যাসগুলি থেকে এটি তৈরি হয়েছে তা তুলনা করে সহজেই প্রমাণ করা যেতে পারে (_একটি মার্কল প্রুফ_)। বিপরীতভাবে, একই রুট হ্যাস দিয়ে দুটি ভিন্ন স্টেট তৈরি করার কোনো উপায় নেই, এবং ভিন্ন মান দিয়ে স্টেট পরিবর্তন করার যেকোনো প্রচেষ্টা একটি ভিন্ন স্টেট রুট হ্যাসের জন্ম দেবে। তাত্ত্বিকভাবে, এই কাঠামোটি সন্নিবেশ, সন্ধান এবং মুছে ফেলার জন্য `O(log(n))` দক্ষতার 'হোলি গ্রেইল' প্রদান করে। + +অদূর ভবিষ্যতে, ইথেরিয়াম একটি [ভার্কল ট্রি](/roadmap/verkle-trees) কাঠামোতে স্থানান্তরিত করার পরিকল্পনা করছে, যা ভবিষ্যতের প্রোটোকল উন্নতির জন্য অনেক নতুন সম্ভাবনার দ্বার উন্মোচন করবে। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালভাবে বোঝার জন্য, [হ্যাস](https://en.wikipedia.org/wiki/Hash_function), [মার্কল ট্রি](https://en.wikipedia.org/wiki/Merkle_tree), [ট্রাই](https://en.wikipedia.org/wiki/Trie) এবং [সিরিয়ালাইজেশন](https://en.wikipedia.org/wiki/Serialization)-এর প্রাথমিক জ্ঞান থাকা সহায়ক হবে। এই নিবন্ধটি একটি বেসিক [রেডিক্স ট্রি](https://en.wikipedia.org/wiki/Radix_tree)-এর বর্ণনা দিয়ে শুরু হয়েছে, তারপর ধীরে ধীরে ইথেরিয়ামের আরও অপ্টিমাইজড ডেটা স্ট্রাকচারের জন্য প্রয়োজনীয় পরিবর্তনগুলি উপস্থাপন করা হয়েছে। + +## বেসিক রেডিক্স ট্রাই {#basic-radix-tries} + +একটি বেসিক রেডিক্স ট্রাই-তে, প্রতিটি নোড নিম্নলিখিত রূপে দেখায়: + +``` + [i_0, i_1 ... i_n, value] +``` + +যেখানে `i_0 ...` `i_n` বর্ণমালার প্রতীকগুলিকে (প্রায়শই বাইনারি বা হেক্স) প্রতিনিধিত্ব করে, `value` হল নোডের টার্মিনাল মান, এবং `i_0, i_1 ...`-এর মধ্যেকার মানগুলি। `i_n` স্লটগুলি হয় `NULL` অথবা অন্য নোডের পয়েন্টার (আমাদের ক্ষেত্রে, হ্যাস)। এটি একটি বেসিক `(কী, মান)` স্টোর গঠন করে। + +ধরুন আপনি কী-মান জোড়ার একটি সেটের উপর একটি ক্রম বজায় রাখার জন্য একটি রেডিক্স ট্রি ডেটা স্ট্রাকচার ব্যবহার করতে চেয়েছিলেন। `dog` কী-এর সাথে ট্রাই-তে বর্তমানে ম্যাপ করা মানটি খুঁজে পেতে, আপনাকে প্রথমে `dog`-কে বর্ণমালার অক্ষরে রূপান্তর করতে হবে (যা `64 6f 67` দেবে), এবং তারপর সেই পথ অনুসরণ করে ট্রাই-এর গভীরে যেতে হবে যতক্ষণ না আপনি মানটি খুঁজে পান। অর্থাৎ, আপনি ট্রাই-এর রুট নোড খুঁজে পেতে একটি ফ্ল্যাট কী/মান DB-তে রুট হ্যাস সন্ধান করে শুরু করবেন। এটি অন্য নোডগুলিতে নির্দেশকারী কী-গুলির একটি অ্যারে হিসাবে উপস্থাপিত হয়। আপনি ইনডেক্স `6`-এর মানটিকে কী হিসাবে ব্যবহার করবেন এবং এক স্তর নিচের নোডটি পেতে ফ্ল্যাট কী/মান DB-তে এটি সন্ধান করবেন। তারপর পরবর্তী মানটি দেখতে ইনডেক্স `4` বেছে নিন, তারপর ইনডেক্স `6`, এবং এভাবেই চলতে থাকবে, যতক্ষণ না আপনি পথটি অনুসরণ করেন: `root -> 6 -> 4 -> 6 -> 15 -> 6 -> 7`, আপনি নোডের মান সন্ধান করবেন এবং ফলাফল ফেরত দেবেন। + +'ট্রাই' এবং অন্তর্নিহিত ফ্ল্যাট কী/মান 'DB'-তে কিছু সন্ধান করার মধ্যে একটি পার্থক্য আছে। উভয়ই কী/মান বিন্যাস সংজ্ঞায়িত করে, কিন্তু অন্তর্নিহিত DB একটি কী-এর জন্য একটি ঐতিহ্যবাহী ১-ধাপের সন্ধান করতে পারে। ট্রাই-তে একটি কী সন্ধান করার জন্য উপরে বর্ণিত চূড়ান্ত মানটিতে পৌঁছাতে একাধিক অন্তর্নিহিত DB সন্ধানের প্রয়োজন হয়। আসুন অস্পষ্টতা দূর করতে পরেরটিকে `পথ` হিসাবে উল্লেখ করি। + +রেডিক্স ট্রাই-এর জন্য আপডেট এবং ডিলিট অপারেশনগুলি নিম্নরূপ সংজ্ঞায়িত করা যেতে পারে: + +```python + def update(node_hash, path, value): + curnode = db.get(node_hash) if node_hash else [NULL] * 17 + newnode = curnode.copy() + if path == "": + newnode[-1] = value + else: + newindex = update(curnode[path[0]], path[1:], value) + newnode[path[0]] = newindex + db.put(hash(newnode), newnode) + return hash(newnode) + + def delete(node_hash, path): + if node_hash is NULL: + return NULL + else: + curnode = db.get(node_hash) + newnode = curnode.copy() + if path == "": + newnode[-1] = NULL + else: + newindex = delete(curnode[path[0]], path[1:]) + newnode[path[0]] = newindex + + if all(x is NULL for x in newnode): + return NULL + else: + db.put(hash(newnode), newnode) + return hash(newnode) +``` + +একটি "মার্কল" রেডিক্স ট্রি ডিটারমিনিস্টিকভাবে-জেনারেটেড ক্রিপ্টোগ্রাফিক হ্যাস ডাইজেস্ট ব্যবহার করে নোডগুলিকে লিঙ্ক করার মাধ্যমে নির্মিত হয়। এই কন্টেন্ট-অ্যাড্রেসিং (কী/মান DB-তে `key == keccak256(rlp(value))`) সঞ্চিত ডেটার একটি ক্রিপ্টোগ্রাফিক ইন্টিগ্রিটি গ্যারান্টি প্রদান করে। যদি একটি প্রদত্ত ট্রাই-এর রুট হ্যাস সর্বজনীনভাবে জানা থাকে, তবে অন্তর্নিহিত লিফ ডেটাতে অ্যাক্সেস আছে এমন যে কেউ একটি প্রমাণ তৈরি করতে পারে যে ট্রাইটি একটি নির্দিষ্ট পথে একটি প্রদত্ত মান অন্তর্ভুক্ত করে, যা প্রতিটি নোডের হ্যাস প্রদান করে যা একটি নির্দিষ্ট মানকে ট্রি রুটের সাথে যুক্ত করে। + +একজন আক্রমণকারীর পক্ষে এমন একটি `(পথ, মান)` জোড়ার প্রমাণ দেওয়া অসম্ভব যার অস্তিত্ব নেই কারণ রুট হ্যাসটি চূড়ান্তভাবে এর নীচের সমস্ত হ্যাসের উপর ভিত্তি করে তৈরি। যেকোনো অন্তর্নিহিত পরিবর্তন রুট হ্যাস পরিবর্তন করবে। আপনি হ্যাসকে ডেটা সম্পর্কে কাঠামোগত তথ্যের একটি সংকুচিত উপস্থাপনা হিসাবে ভাবতে পারেন, যা হ্যাশিং ফাংশনের প্রি-ইমেজ সুরক্ষা দ্বারা সুরক্ষিত। + +আমরা একটি রেডিক্স ট্রি-এর একটি পারমাণবিক একককে (যেমন, একটি একক হেক্স অক্ষর, বা ৪ বিট বাইনারি সংখ্যা) একটি "নিবল" হিসাবে উল্লেখ করব। উপরে বর্ণিত হিসাবে, একবারে একটি নিবল করে একটি পথ অতিক্রম করার সময়, নোডগুলি সর্বাধিক ১৬টি চাইল্ডকে উল্লেখ করতে পারে তবে একটি `মান` উপাদান অন্তর্ভুক্ত করে। তাই, আমরা সেগুলিকে ১৭ দৈর্ঘ্যের একটি অ্যারে হিসাবে উপস্থাপন করি। আমরা এই ১৭-উপাদান বিশিষ্ট অ্যারেগুলিকে "ব্রাঞ্চ নোড" বলি। + +## মার্কল প্যাট্রিসিয়া ট্রাই {#merkle-patricia-trees} + +রেডিক্স ট্রাই-এর একটি প্রধান সীমাবদ্ধতা রয়েছে: এগুলি অদক্ষ। আপনি যদি একটি `(পথ, মান)` বাইন্ডিং সঞ্চয় করতে চান যেখানে পথটি, ইথেরিয়ামের মতো, ৬৪ অক্ষর দীর্ঘ ( `bytes32`-তে নিবলের সংখ্যা), তাহলে প্রতি অক্ষরের জন্য একটি স্তর সঞ্চয় করতে আমাদের এক কিলোবাইটের বেশি অতিরিক্ত জায়গার প্রয়োজন হবে, এবং প্রতিটি সন্ধান বা মুছে ফেলার জন্য পুরো ৬৪টি ধাপ লাগবে। নিম্নলিখিত অংশে প্রবর্তিত প্যাট্রিসিয়া ট্রাই এই সমস্যার সমাধান করে। + +### অপ্টিমাইজেশান {#optimization} + +মার্কল প্যাট্রিসিয়া ট্রাই-এর একটি নোড নিম্নলিখিতগুলির মধ্যে একটি: + +1. `NULL` (খালি স্ট্রিং হিসাবে উপস্থাপিত) +2. `branch` একটি ১৭-আইটেম নোড `[ v0 ...` `v15, vt ]` +3. `leaf` একটি ২-আইটেম নোড `[ encodedPath, value ]` +4. `extension` একটি ২-আইটেম নোড `[ encodedPath, key ]` + +৬৪ অক্ষরের পথগুলির সাথে এটি অনিবার্য যে ট্রাই-এর প্রথম কয়েকটি লেয়ার অতিক্রম করার পরে, আপনি এমন একটি নোডে পৌঁছাবেন যেখানে নিচের দিকের পথের অন্তত কিছু অংশের জন্য কোনো ভিন্ন পথ বিদ্যমান নেই। পথ বরাবর ১৫টি পর্যন্ত স্পার্স `NULL` নোড তৈরি করা এড়াতে, আমরা একটি `[ encodedPath, key ]` ফর্মের `এক্সটেনশন` নোড সেট আপ করে ডিসেন্টকে শর্টকাট করি, যেখানে `encodedPath` এগিয়ে যাওয়ার জন্য "আংশিক পথ" ধারণ করে (নিচে বর্ণিত একটি কমপ্যাক্ট এনকোডিং ব্যবহার করে), এবং `key` পরবর্তী DB অনুসন্ধানের জন্য ব্যবহৃত হয়। + +`লিফ` নোডের জন্য, যা `encodedPath`-এর প্রথম নিবলে একটি ফ্ল্যাগ দ্বারা চিহ্নিত করা যেতে পারে, পথটি পূর্ববর্তী সমস্ত নোডের পথের খণ্ডাংশ এনকোড করে এবং আমরা সরাসরি `মান` সন্ধান করতে পারি। + +তবে উপরের এই অপ্টিমাইজেশানটি অস্পষ্টতা তৈরি করে। + +নিবলে পথ অতিক্রম করার সময়, আমরা বিজোড় সংখ্যক নিবল দিয়ে শেষ করতে পারি, কিন্তু কারণ সমস্ত ডেটা `বাইট` ফরম্যাটে সংরক্ষিত হয়। উদাহরণস্বরূপ, নিবল `1` এবং নিবল `01` এর মধ্যে পার্থক্য করা সম্ভব নয় (উভয়কেই `<01>` হিসাবে সংরক্ষণ করতে হবে)। বিজোড় দৈর্ঘ্য নির্দিষ্ট করতে, আংশিক পথের আগে একটি ফ্ল্যাগ যুক্ত করা হয়। + +### স্পেসিফিকেশন: ঐচ্ছিক টার্মিনেটর সহ হেক্স সিকোয়েন্সের কমপ্যাক্ট এনকোডিং {#specification} + +উপরে বর্ণিত _বিজোড় বনাম জোড় অবশিষ্ট আংশিক পথের দৈর্ঘ্য_ এবং _লিফ বনাম এক্সটেনশন নোড_ উভয়ের ফ্ল্যাগিং যেকোনো ২-আইটেম নোডের আংশিক পথের প্রথম নিবলে থাকে। এর ফলস্বরূপ নিম্নলিখিতগুলি ঘটে: + +| হেক্স অক্ষর | বিট | নোডের প্রকার আংশিক | পথের দৈর্ঘ্য | +| ----------- | ---- | ------------------------------------ | ------------ | +| 0 | 0000 | এক্সটেনশন | জোড় | +| 1 | 0001 | এক্সটেনশন | বিজোড় | +| 2 | 0010 | টার্মিনেটিং (লিফ) | জোড় | +| 3 | 0011 | টার্মিনেটিং (লিফ) | বিজোড় | + +জোড় অবশিষ্ট পথের দৈর্ঘ্যের জন্য (`0` বা `2`), আরেকটি `0` "প্যাডিং" নিবল সর্বদা অনুসরণ করবে। + +```python + def compact_encode(hexarray): + term = 1 if hexarray[-1] == 16 else 0 + if term: + hexarray = hexarray[:-1] + oddlen = len(hexarray) % 2 + flags = 2 * term + oddlen + if oddlen: + hexarray = [flags] + hexarray + else: + hexarray = [flags] + [0] + hexarray + # hexarray now has an even length whose first nibble is the flags. + o = "" + for i in range(0, len(hexarray), 2): + o += chr(16 * hexarray[i] + hexarray[i + 1]) + return o +``` + +উদাহরণ: + +```python + > [1, 2, 3, 4, 5, ...] + '11 23 45' + > [0, 1, 2, 3, 4, 5, ...] + '00 01 23 45' + > [0, f, 1, c, b, 8, 10] + '20 0f 1c b8' + > [f, 1, c, b, 8, 10] + '3f 1c b8' +``` + +মার্কল প্যাট্রিসিয়া ট্রাই-তে একটি নোড পাওয়ার জন্য এখানে বর্ধিত কোড দেওয়া হলো: + +```python + def get_helper(node_hash, path): + if path == []: + return node_hash + if node_hash == "": + return "" + curnode = rlp.decode(node_hash if len(node_hash) < 32 else db.get(node_hash)) + if len(curnode) == 2: + (k2, v2) = curnode + k2 = compact_decode(k2) + if k2 == path[: len(k2)]: + return get(v2, path[len(k2) :]) + else: + return "" + elif len(curnode) == 17: + return get_helper(curnode[path[0]], path[1:]) + + def get(node_hash, path): + path2 = [] + for i in range(len(path)): + path2.push(int(ord(path[i]) / 16)) + path2.push(ord(path[i]) % 16) + path2.push(16) + return get_helper(node_hash, path2) +``` + +### উদাহরণ ট্রাই {#example-trie} + +ধরুন আমরা এমন একটি ট্রাই চাই যেখানে চারটি পথ/মান জোড়া রয়েছে: `('do', 'verb')`, `('dog', 'puppy')`, `('doge', 'coins')`, `('horse', 'stallion')`। + +প্রথমে, আমরা পথ এবং মান উভয়কেই `বাইট`-এ রূপান্তর করি। নিচে, _পথগুলির_ জন্য প্রকৃত বাইট উপস্থাপনা `<>` দ্বারা চিহ্নিত করা হয়েছে, যদিও _মানগুলি_ এখনও স্ট্রিং হিসাবে `''` দ্বারা দেখানো হয়েছে, সহজে বোঝার জন্য (এগুলিও আসলে `বাইট` হবে): + +``` + <64 6f> : 'verb' + <64 6f 67> : 'puppy' + <64 6f 67 65> : 'coins' + <68 6f 72 73 65> : 'stallion' +``` + +এখন, আমরা অন্তর্নিহিত DB-তে নিম্নলিখিত কী/মান জোড়া দিয়ে এমন একটি ট্রাই তৈরি করি: + +``` + rootHash: [ <16>, hashA ] + hashA: [ <>, <>, <>, <>, hashB, <>, <>, <>, [ <20 6f 72 73 65>, 'stallion' ], <>, <>, <>, <>, <>, <>, <>, <> ] + hashB: [ <00 6f>, hashC ] + hashC: [ <>, <>, <>, <>, <>, <>, hashD, <>, <>, <>, <>, <>, <>, <>, <>, <>, 'verb' ] + hashD: [ <17>, [ <>, <>, <>, <>, <>, <>, [ <35>, 'coins' ], <>, <>, <>, <>, <>, <>, <>, <>, <>, 'puppy' ] ] +``` + +যখন একটি নোড অন্য নোডের ভিতরে রেফারেন্স করা হয়, তখন যা অন্তর্ভুক্ত করা হয় তা হলো `keccak256(rlp.encode(node))`, যদি `len(rlp.encode(node)) >= 32` হয়, অন্যথায় `node` যেখানে `rlp.encode` হলো [RLP](/developers/docs/data-structures-and-encoding/rlp) এনকোডিং ফাংশন। + +মনে রাখবেন যে একটি ট্রাই আপডেট করার সময়, একজনকে কী/মান জোড়া `(keccak256(x), x)` একটি পার্সিস্টেন্ট লুকআপ টেবিলে সংরক্ষণ করতে হবে _যদি_ নতুন তৈরি নোডের দৈর্ঘ্য >= ৩২ হয়। তবে, যদি নোডটি তার চেয়ে ছোট হয়, তবে কিছু সংরক্ষণ করার প্রয়োজন নেই, যেহেতু f(x) = x ফাংশনটি বিপরীতমুখী। + +## ইথেরিয়ামে ট্রাই {#tries-in-ethereum} + +ইথেরিয়ামের এক্সিকিউশন লেয়ারের সমস্ত মার্কল ট্রাই একটি মার্কল প্যাট্রিসিয়া ট্রাই ব্যবহার করে। + +একটি ব্লক হেডার থেকে এই ট্রাইগুলির ৩টি থেকে ৩টি রুট থাকে। + +1. stateRoot +2. transactionsRoot +3. receiptsRoot + +### স্টেট ট্রাই {#state-trie} + +একটি গ্লোবাল স্টেট ট্রাই আছে, এবং যখনই কোনো ক্লায়েন্ট একটি ব্লক প্রসেস করে, এটি আপডেট করা হয়। এতে, একটি `পথ` সর্বদা: `keccak256(ethereumAddress)` এবং একটি `মান` সর্বদা: `rlp(ethereumAccount)`। আরও নির্দিষ্টভাবে একটি ইথেরিয়াম `অ্যাকাউন্ট` হল `[nonce,balance,storageRoot,codeHash]` এর একটি ৪-আইটেমের অ্যারে। এই মুহূর্তে, এটি উল্লেখ্য যে এই `storageRoot` অন্য একটি প্যাট্রিসিয়া ট্রাই-এর রুট: + +### স্টোরেজ ট্রাই {#storage-trie} + +স্টোরেজ ট্রাই হল যেখানে _সমস্ত_ কন্ট্র্যাক্ট ডেটা থাকে। প্রতিটি অ্যাকাউন্টের জন্য একটি পৃথক স্টোরেজ ট্রাই রয়েছে। একটি নির্দিষ্ট অ্যাড্রেসে নির্দিষ্ট স্টোরেজ পজিশনে মানগুলি পুনরুদ্ধার করতে স্টোরেজ অ্যাড্রেস, স্টোরেজে সঞ্চিত ডেটার পূর্ণসংখ্যার পজিশন এবং ব্লক আইডি প্রয়োজন। এগুলিকে তারপর JSON-RPC API-তে সংজ্ঞায়িত `eth_getStorageAt`-এ আর্গুমেন্ট হিসাবে পাস করা যেতে পারে, যেমন, `0x295a70b2de5e3953354a6a8344e616ed314d7251` অ্যাড্রেসের জন্য স্টোরেজ স্লট ০-এর ডেটা পুনরুদ্ধার করতে: + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x0", "latest"], "id": 1}' localhost:8545 + +{"jsonrpc":"2.0","id":1,"result":"0x00000000000000000000000000000000000000000000000000000000000004d2"} + +``` + +স্টোরেজের অন্যান্য উপাদান পুনরুদ্ধার করা কিছুটা বেশি জড়িত কারণ স্টোরেজ ট্রাই-তে পজিশনটি প্রথমে গণনা করতে হবে। পজিশনটি অ্যাড্রেস এবং স্টোরেজ পজিশনের `keccak256` হ্যাস হিসাবে গণনা করা হয়, উভয়ই ৩২ বাইট দৈর্ঘ্যে শূন্য দিয়ে বাম-প্যাড করা হয়। উদাহরণস্বরূপ, `0x391694e7e0b0cce554cb130d723a9d27458f9298` অ্যাড্রেসের জন্য স্টোরেজ স্লট ১-এ ডেটার পজিশন হল: + +```python +keccak256(decodeHex("000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001")) +``` + +একটি Geth কনসোলে, এটি নিম্নরূপে গণনা করা যেতে পারে: + +``` +> var key = "000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298" + "0000000000000000000000000000000000000000000000000000000000000001" +undefined +> web3.sha3(key, {"encoding": "hex"}) +"0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9" +``` + +`পথ`টি তাই `keccak256(<6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9>)`। এটি এখন আগের মতোই স্টোরেজ ট্রাই থেকে ডেটা পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে: + +```bash +curl -X POST --data '{"jsonrpc":"2.0", "method": "eth_getStorageAt", "params": ["0x295a70b2de5e3953354a6a8344e616ed314d7251", "0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9", "latest"], "id": 1}' localhost:8545 + +{"jsonrpc":"2.0","id":1,"result":"0x000000000000000000000000000000000000000000000000000000000000162e"} +``` + +দ্রষ্টব্য: একটি ইথেরিয়াম অ্যাকাউন্টের জন্য `storageRoot` ডিফল্টরূপে খালি থাকে যদি এটি একটি কন্ট্র্যাক্ট অ্যাকাউন্ট না হয়। + +### ট্রানজ্যাকশন ট্রাই {#transaction-trie} + +প্রতিটি ব্লকের জন্য একটি পৃথক ট্রানজ্যাকশন ট্রাই রয়েছে, যা আবার `(কী, মান)` জোড়া সংরক্ষণ করে। এখানে একটি পথ হল: `rlp(transactionIndex)` যা একটি কী প্রতিনিধিত্ব করে যা একটি মান দ্বারা নির্ধারিত হয়: + +```python +if legacyTx: + value = rlp(tx) +else: + value = TxType | encode(tx) +``` + +এ সম্পর্কে আরও তথ্য [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718) ডকুমেন্টেশনে পাওয়া যাবে। + +### রিসিপ্টস ট্রাই {#receipts-trie} + +প্রতিটি ব্লকের নিজস্ব রিসিপ্টস ট্রাই রয়েছে। এখানে একটি `পথ` হল: `rlp(transactionIndex)`। `transactionIndex` হল সেই ব্লকের মধ্যে তার ইনডেক্স যেখানে এটি অন্তর্ভুক্ত ছিল। রিসিপ্টস ট্রাই কখনও আপডেট করা হয় না। ট্রানজ্যাকশন ট্রাই-এর অনুরূপ, এখানে বর্তমান এবং লিগ্যাসি রিসিপ্ট রয়েছে। রিসিপ্টস ট্রাই-তে একটি নির্দিষ্ট রিসিপ্ট কোয়েরি করতে, তার ব্লকের মধ্যে ট্রানজ্যাকশনের ইনডেক্স, রিসিপ্ট পেলোড এবং ট্রানজ্যাকশনের প্রকার প্রয়োজন। প্রত্যাবর্তিত রিসিপ্ট `রিসিপ্ট` ধরনের হতে পারে যা `TransactionType` এবং `ReceiptPayload`-এর কনক্যাটেনেশন হিসাবে সংজ্ঞায়িত করা হয় অথবা এটি `লিগ্যাসি রিসিপ্ট` ধরনের হতে পারে যা `rlp([status, cumulativeGasUsed, logsBloom, logs])` হিসাবে সংজ্ঞায়িত করা হয়। + +এ সম্পর্কে আরও তথ্য [EIP 2718](https://eips.ethereum.org/EIPS/eip-2718) ডকুমেন্টেশনে পাওয়া যাবে। + +## আরও পড়ুন {#further-reading} + +- [মডিফায়েড মার্কল প্যাট্রিসিয়া ট্রাই — ইথেরিয়াম কীভাবে একটি স্টেট সংরক্ষণ করে](https://medium.com/codechain/modified-merkle-patricia-trie-how-ethereum-saves-a-state-e6d7555078dd) +- [ইথেরিয়ামে মার্কলিং](https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/) +- [ইথেরিয়াম ট্রাই বোঝা](https://easythereentropy.wordpress.com/2014/06/04/understanding-the-ethereum-trie/) diff --git a/public/content/translations/bn/developers/docs/data-structures-and-encoding/rlp/index.md b/public/content/translations/bn/developers/docs/data-structures-and-encoding/rlp/index.md new file mode 100644 index 00000000000..56e9efe977a --- /dev/null +++ b/public/content/translations/bn/developers/docs/data-structures-and-encoding/rlp/index.md @@ -0,0 +1,163 @@ +--- +title: "রিকার্সিভ-লেংথ প্রিফিক্স (RLP) সিরিয়ালাইজেশন" +description: "ইথেরিয়ামের এক্সিকিউশন লেয়ারে rlp এনকোডিং-এর একটি সংজ্ঞা।" +lang: bn +sidebarDepth: 2 +--- + +ইথেরিয়ামের এক্সিকিউশন ক্লায়েন্টগুলিতে রিকার্সিভ লেংথ প্রিফিক্স (RLP) সিরিয়ালাইজেশন ব্যাপকভাবে ব্যবহৃত হয়। RLP একটি স্পেস-এফিশিয়েন্ট ফরম্যাটে নোডগুলির মধ্যে ডেটা স্থানান্তরকে প্রমিত করে। RLP-এর উদ্দেশ্য হল বাইনারি ডেটার নির্বিচারে নেস্টেড অ্যারে এনকোড করা, এবং RLP হল ইথেরিয়ামের এক্সিকিউশন লেয়ারে অবজেক্ট সিরিয়ালাইজ করার জন্য ব্যবহৃত প্রাথমিক এনকোডিং পদ্ধতি। RLP-এর মূল উদ্দেশ্য হল গঠন এনকোড করা; ধনাত্মক পূর্ণসংখ্যা ছাড়া, RLP নির্দিষ্ট ডেটা প্রকার (যেমন, স্ট্রিং, ফ্লোট) এনকোড করার দায়িত্ব উচ্চ-স্তরের প্রোটোকলগুলিতে অর্পণ করে। ধনাত্মক পূর্ণসংখ্যাগুলিকে অবশ্যই বিগ-এন্ডিয়ান বাইনারি আকারে উপস্থাপন করতে হবে যেখানে কোনো লিডিং জিরো থাকবে না (এভাবে শূন্য পূর্ণসংখ্যার মানকে খালি বাইট অ্যারের সমতুল্য করে তোলে)। RLP ব্যবহারকারী যেকোনো উচ্চ-স্তরের প্রোটোকল দ্বারা লিডিং জিরো সহ ডিসিরিয়ালাইজড ধনাত্মক পূর্ণসংখ্যাগুলিকে অবশ্যই অবৈধ হিসাবে গণ্য করতে হবে। + +[ইথেরিয়াম ইয়েলো পেপার (পরিশিষ্ট B)](https://ethereum.github.io/yellowpaper/paper.pdf#page=19)-এ আরও তথ্য। + +একটি ডিকশনারি এনকোড করতে RLP ব্যবহার করার জন্য, দুটি প্রস্তাবিত ক্যানোনিকাল ফর্ম হল: + +- লেক্সিকোগ্রাফিক ক্রমে কি সহ `[[k1,v1],[k2,v2]...]` ব্যবহার করুন +- ইথেরিয়ামের মতো উচ্চ-স্তরের প্যাট্রিসিয়া ট্রি এনকোডিং ব্যবহার করুন + +## সংজ্ঞা {#definition} + +RLP এনকোডিং ফাংশন একটি আইটেম ইনপুট হিসাবে নেয়। একটি আইটেমকে নিম্নরূপ সংজ্ঞায়িত করা হয়েছে: + +- একটি স্ট্রিং (অর্থাৎ, বাইট অ্যারে) একটি আইটেম +- আইটেমের একটি তালিকা একটি আইটেম +- একটি ধনাত্মক পূর্ণসংখ্যা একটি আইটেম + +উদাহরণস্বরূপ, নিম্নলিখিত সবগুলি আইটেম: + +- একটি খালি স্ট্রিং; +- "cat" শব্দটি ধারণকারী স্ট্রিং; +- যেকোনো সংখ্যক স্ট্রিং ধারণকারী একটি তালিকা; +- এবং `["cat", ["puppy", "cow"], "horse", [[]], "pig", [""], "sheep"]`-এর মতো আরও জটিল ডেটা স্ট্রাকচার। +- `100` সংখ্যাটি + +মনে রাখবেন যে এই পৃষ্ঠার বাকি প্রেক্ষাপটে, 'স্ট্রিং' মানে "বাইনারি ডেটার একটি নির্দিষ্ট সংখ্যক বাইট"; কোনো বিশেষ এনকোডিং ব্যবহার করা হয় না, এবং স্ট্রিংগুলির বিষয়বস্তু সম্পর্কে কোনো জ্ঞানের ইঙ্গিত দেওয়া হয় না (নন-মিনিমাল ধনাত্মক পূর্ণসংখ্যার বিরুদ্ধে নিয়মের প্রয়োজন ছাড়া)। + +RLP এনকোডিং নিম্নরূপ সংজ্ঞায়িত করা হয়েছে: + +- একটি ধনাত্মক পূর্ণসংখ্যার জন্য, এটিকে সবচেয়ে ছোট বাইট অ্যারেতে রূপান্তরিত করা হয় যার বিগ-এন্ডিয়ান ব্যাখ্যা হল পূর্ণসংখ্যা, এবং তারপর নীচের নিয়ম অনুসারে একটি স্ট্রিং হিসাবে এনকোড করা হয়। +- `[0x00, 0x7f]` (ডেসিমেল `[0, 127]`) পরিসরের মধ্যে থাকা একটি একক বাইটের জন্য, সেই বাইটটিই তার নিজস্ব RLP এনকোডিং। +- অন্যথায়, যদি একটি স্ট্রিং 0-55 বাইট দীর্ঘ হয়, তাহলে RLP এনকোডিং-এ **0x80** (ডেসিমেল 128) মানের একটি একক বাইট এবং স্ট্রিংটির দৈর্ঘ্য এবং তারপরে স্ট্রিংটি থাকে। সুতরাং প্রথম বাইটের পরিসর হল `[0x80, 0xb7]` (ডেসিমেল `[128, 183]`)। +- যদি একটি স্ট্রিং 55 বাইটের বেশি দীর্ঘ হয়, তাহলে RLP এনকোডিং-এ **0xb7** (ডেসিমেল 183) মানের একটি একক বাইট এবং বাইনারি আকারে স্ট্রিংটির দৈর্ঘ্যের বাইটে দৈর্ঘ্য, তারপরে স্ট্রিংটির দৈর্ঘ্য এবং তারপরে স্ট্রিংটি থাকে। উদাহরণস্বরূপ, একটি 1024 বাইট দীর্ঘ স্ট্রিং `\xb9\x04\x00` (ডেসিমেল `185, 4, 0`) হিসাবে এনকোড করা হবে এবং তারপরে স্ট্রিংটি থাকবে। এখানে, প্রথম বাইট হিসাবে `0xb9` (183 + 2 = 185), তারপরে 2 বাইট `0x0400` (ডেসিমেল 1024) যা আসল স্ট্রিংটির দৈর্ঘ্য নির্দেশ করে। সুতরাং প্রথম বাইটের পরিসর হল `[0xb8, 0xbf]` (ডেসিমেল `[184, 191]`)। +- যদি একটি স্ট্রিং 2^64 বাইট দীর্ঘ বা তার বেশি হয়, তবে এটি এনকোড করা নাও হতে পারে। +- যদি একটি তালিকার মোট পেলোড (অর্থাৎ, RLP এনকোড করা তার সমস্ত আইটেমের সম্মিলিত দৈর্ঘ্য) 0-55 বাইট দীর্ঘ হয়, তবে RLP এনকোডিং-এ **0xc0** মানের একটি একক বাইট এবং পেলোডের দৈর্ঘ্য এবং তারপরে আইটেমগুলির RLP এনকোডিংগুলির ক্যাটেনেশন থাকে। সুতরাং প্রথম বাইটের পরিসর হল `[0xc0, 0xf7]` (ডেসিমেল `[192, 247]`)। +- যদি একটি তালিকার মোট পেলোড 55 বাইটের বেশি দীর্ঘ হয়, তবে RLP এনকোডিং-এ **0xf7** মানের একটি একক বাইট এবং বাইনারি আকারে পেলোডের দৈর্ঘ্যের বাইটে দৈর্ঘ্য, তারপরে পেলোডের দৈর্ঘ্য এবং তারপরে আইটেমগুলির RLP এনকোডিংগুলির ক্যাটেনেশন থাকে। সুতরাং প্রথম বাইটের পরিসর হল `[0xf8, 0xff]` (ডেসিমেল `[248, 255]`)। + +কোডে, এটি হল: + +```python +def rlp_encode(input): + if isinstance(input,str): + if len(input) == 1 and ord(input) < 0x80: + return input + return encode_length(len(input), 0x80) + input + elif isinstance(input, list): + output = '' + for item in input: + output += rlp_encode(item) + return encode_length(len(output), 0xc0) + output + +def encode_length(L, offset): + if L < 56: + return chr(L + offset) + elif L < 256**8: + BL = to_binary(L) + return chr(len(BL) + offset + 55) + BL + raise Exception("input too long") + +def to_binary(x): + if x == 0: + return '' + return to_binary(int(x / 256)) + chr(x % 256) +``` + +## উদাহরণ {#examples} + +- "dog" স্ট্রিংটি = [ 0x83, 'd', 'o', 'g' ] +- [ "cat", "dog" ] তালিকাটি = `[ 0xc8, 0x83, 'c', 'a', 't', 0x83, 'd', 'o', 'g' ]` +- খালি স্ট্রিং ('null') = `[ 0x80 ]` +- খালি তালিকা = `[ 0xc0 ]` +- পূর্ণসংখ্যা 0 = `[ 0x80 ]` +- বাইট '\\x00' = `[ 0x00 ]` +- বাইট '\\x0f' = `[ 0x0f ]` +- বাইট '\\x04\\x00' = `[ 0x82, 0x04, 0x00 ]` +- তিন-এর [সেট থিওরেটিক্যাল রিপ্রেজেন্টেশন](http://en.wikipedia.org/wiki/Set-theoretic_definition_of_natural_numbers), `[ [], [[]], [ [], [[]] ] ] = [ 0xc7, 0xc0, 0xc1, 0xc0, 0xc3, 0xc0, 0xc1, 0xc0 ]` +- "Lorem ipsum dolor sit amet, consectetur adipisicing elit" স্ট্রিংটি = `[ 0xb8, 0x38, 'L', 'o', 'r', 'e', 'm', ' ', ... `, 'e', 'l', 'i', 't' ]` + +## RLP ডিকোডিং {#rlp-decoding} + +RLP এনকোডিং-এর নিয়ম এবং প্রক্রিয়া অনুসারে, RLP ডিকোডিং-এর ইনপুটকে বাইনারি ডেটার একটি অ্যারে হিসাবে গণ্য করা হয়। RLP ডিকোডিং প্রক্রিয়াটি নিম্নরূপ: + +1. ইনপুট ডেটার প্রথম বাইট (অর্থাৎ, প্রিফিক্স) অনুযায়ী ডেটার ধরন, আসল ডেটার দৈর্ঘ্য এবং অফসেট ডিকোড করা; + +2. ডেটার ধরন এবং অফসেট অনুযায়ী, ধনাত্মক পূর্ণসংখ্যার জন্য মিনিমাল এনকোডিং নিয়মকে সম্মান করে ডেটা ডিকোড করা; + +3. ইনপুটের বাকি অংশ ডিকোড করা চালিয়ে যাওয়া; + +তাদের মধ্যে, ডেটার ধরন এবং অফসেট ডিকোড করার নিয়মগুলি নিম্নরূপ: + +1. ডেটা একটি স্ট্রিং যদি প্রথম বাইটের (অর্থাৎ, প্রিফিক্স) পরিসর [0x00, 0x7f] হয়, এবং স্ট্রিংটি ঠিক প্রথম বাইট নিজেই; + +2. ডেটা একটি স্ট্রিং যদি প্রথম বাইটের পরিসর [0x80, 0xb7] হয়, এবং যে স্ট্রিংটির দৈর্ঘ্য প্রথম বাইট মাইনাস 0x80 এর সমান, তা প্রথম বাইটকে অনুসরণ করে; + +3. ডেটা একটি স্ট্রিং যদি প্রথম বাইটের পরিসর [0xb8, 0xbf] হয়, এবং যে স্ট্রিংটির বাইটে দৈর্ঘ্য প্রথম বাইট মাইনাস 0xb7 এর সমান তা প্রথম বাইটকে অনুসরণ করে, এবং স্ট্রিংটি স্ট্রিংয়ের দৈর্ঘ্যকে অনুসরণ করে; + +4. ডেটা একটি তালিকা যদি প্রথম বাইটের পরিসর [0xc0, 0xf7] হয়, এবং তালিকার সমস্ত আইটেমের RLP এনকোডিংগুলির ক্যাটেনেশন, যার মোট পেলোড প্রথম বাইট মাইনাস 0xc0 এর সমান, তা প্রথম বাইটকে অনুসরণ করে; + +5. ডেটা একটি তালিকা যদি প্রথম বাইটের পরিসর [0xf8, 0xff] হয়, এবং তালিকার মোট পেলোড যার দৈর্ঘ্য প্রথম বাইট মাইনাস 0xf7 এর সমান, তা প্রথম বাইটকে অনুসরণ করে, এবং তালিকার সমস্ত আইটেমের RLP এনকোডিংগুলির ক্যাটেনেশন তালিকার মোট পেলোডকে অনুসরণ করে; + +কোডে, এটি হল: + +```python +def rlp_decode(input): + if len(input) == 0: + return + output = '' + (offset, dataLen, type) = decode_length(input) + if type is str: + output = instantiate_str(substr(input, offset, dataLen)) + elif type is list: + output = instantiate_list(substr(input, offset, dataLen)) + output += rlp_decode(substr(input, offset + dataLen)) + return output + +def decode_length(input): + length = len(input) + if length == 0: + raise Exception("input is null") + prefix = ord(input[0]) + if prefix <= 0x7f: + return (0, 1, str) + elif prefix <= 0xb7 and length > prefix - 0x80: + strLen = prefix - 0x80 + return (1, strLen, str) + elif prefix <= 0xbf and length > prefix - 0xb7 and length > prefix - 0xb7 + to_integer(substr(input, 1, prefix - 0xb7)): + lenOfStrLen = prefix - 0xb7 + strLen = to_integer(substr(input, 1, lenOfStrLen)) + return (1 + lenOfStrLen, strLen, str) + elif prefix <= 0xf7 and length > prefix - 0xc0: + listLen = prefix - 0xc0; + return (1, listLen, list) + elif prefix <= 0xff and length > prefix - 0xf7 and length > prefix - 0xf7 + to_integer(substr(input, 1, prefix - 0xf7)): + lenOfListLen = prefix - 0xf7 + listLen = to_integer(substr(input, 1, lenOfListLen)) + return (1 + lenOfListLen, listLen, list) + raise Exception("input does not conform to RLP encoding form") + +def to_integer(b): + length = len(b) + if length == 0: + raise Exception("input is null") + elif length == 1: + return ord(b[0]) + return ord(substr(b, -1)) + to_integer(substr(b, 0, -1)) * 256 +``` + +## আরও পড়ুন {#further-reading} + +- [ইথেরিয়ামে RLP](https://medium.com/coinmonks/data-structure-in-ethereum-episode-1-recursive-length-prefix-rlp-encoding-decoding-d1016832f919) +- [ইথেরিয়ামের আদ্যোপান্ত: RLP](https://medium.com/coinmonks/ethereum-under-the-hood-part-3-rlp-decoding-df236dc13e58) +- Coglio, A. (2020)। ACL2-তে ইথেরিয়ামের রিকার্সিভ লেংথ প্রিফিক্স। arXiv preprint arXiv:2009.13769.](https://arxiv.org/abs/2009.13769) + +## সম্পর্কিত বিষয় {#related-topics} + +- [প্যাট্রিসিয়া মার্কল ট্রাই](/developers/docs/data-structures-and-encoding/patricia-merkle-trie) diff --git a/public/content/translations/bn/developers/docs/data-structures-and-encoding/ssz/index.md b/public/content/translations/bn/developers/docs/data-structures-and-encoding/ssz/index.md new file mode 100644 index 00000000000..bf9d69f6bb3 --- /dev/null +++ b/public/content/translations/bn/developers/docs/data-structures-and-encoding/ssz/index.md @@ -0,0 +1,150 @@ +--- +title: "সরল সিরিয়ালাইজ" +description: "ইথেরিয়াম-এর SSZ ফরম্যাটের ব্যাখ্যা।" +lang: bn +sidebarDepth: 2 +--- + +**সরল সিরিয়ালাইজ (SSZ)** হল বিকন চেইন-এ ব্যবহৃত সিরিয়ালাইজেশন পদ্ধতি। এটি এক্সিকিউশন লেয়ার-এ ব্যবহৃত RLP সিরিয়ালাইজেশনকে পিয়ার ডিসকভারি প্রোটোকল ছাড়া কনসেন্সাস লেয়ার-এর সর্বত্র প্রতিস্থাপন করে। RLP সিরিয়ালাইজেশন সম্পর্কে আরও জানতে, দেখুন [রিকার্সিভ-লেংথ প্রিফিক্স (RLP)](/developers/docs/data-structures-and-encoding/rlp/)। SSZ ডিটারমিনিস্টিক হওয়ার জন্য এবং দক্ষতার সাথে Merkleize করার জন্য ডিজাইন করা হয়েছে। SSZ-কে দুটি উপাদান আছে বলে ভাবা যেতে পারে: একটি সিরিয়ালাইজেশন স্কিম এবং একটি Merkleization স্কিম যা সিরিয়ালাইজড ডেটা স্ট্রাকচার-এর সাথে দক্ষতার সাথে কাজ করার জন্য ডিজাইন করা হয়েছে। + +## SSZ কিভাবে কাজ করে? {#how-does-ssz-work} + +### সিরিয়ালাইজেশন {#serialization} + +SSZ একটি সিরিয়ালাইজেশন স্কিম যা স্ব-বর্ণনামূলক নয় - বরং এটি একটি স্কিমার উপর নির্ভর করে যা আগে থেকে জানা আবশ্যক। SSZ সিরিয়ালাইজেশন-এর লক্ষ্য হল নির্বিচারে জটিলতার বস্তুগুলোকে বাইটের স্ট্রিং হিসাবে উপস্থাপন করা। এটি "বেসিক টাইপ"-এর জন্য একটি খুব সহজ প্রক্রিয়া। এলিমেন্টটি কেবল হেক্সাডেসিমেল বাইটে রূপান্তরিত হয়। বেসিক টাইপের মধ্যে রয়েছে: + +- আনসাইন্ড ইন্টিজার +- বুলিয়ান + +জটিল "কম্পোজিট" টাইপের জন্য, সিরিয়ালাইজেশন আরও জটিল কারণ কম্পোজিট টাইপের মধ্যে একাধিক এলিমেন্ট থাকে যার বিভিন্ন টাইপ বা বিভিন্ন আকার বা উভয়ই থাকতে পারে। যেখানে এই সমস্ত অবজেক্টগুলির একটি নির্দিষ্ট দৈর্ঘ্য থাকে (অর্থাৎ, এলিমেন্টগুলির আকার তাদের প্রকৃত মান নির্বিশেষে সর্বদা ধ্রুবক থাকে), সেখানে সিরিয়ালাইজেশন হল কম্পোজিট টাইপের প্রতিটি এলিমেন্টকে ছোট-এন্ডিয়ান বাইটস্ট্রিং-এ রূপান্তরিত করা। এই বাইটস্ট্রিংগুলো একসাথে যুক্ত করা হয়। সিরিয়ালাইজড অবজেক্টটিতে ডিসিরিয়ালাইজড অবজেক্টে যেভাবে নির্দিষ্ট-দৈর্ঘ্যের এলিমেন্টগুলি উপস্থিত থাকে সেই একই ক্রমে তাদের বাইটলিস্ট রিপ্রেজেন্টেশন থাকে। + +পরিবর্তনশীল দৈর্ঘ্যের টাইপের জন্য, আসল ডেটাটি সিরিয়ালাইজড অবজেক্টে সেই এলিমেন্টের অবস্থানে একটি "অফসেট" মান দ্বারা প্রতিস্থাপিত হয়। আসল ডেটা সিরিয়ালাইজড অবজেক্টের শেষে একটি হিপে যুক্ত করা হয়। অফসেট মানটি হল হিপে আসল ডেটার শুরুর জন্য ইনডেক্স, যা প্রাসঙ্গিক বাইটের জন্য একটি পয়েন্টার হিসাবে কাজ করে। + +নীচের উদাহরণটি নির্দিষ্ট এবং পরিবর্তনশীল দৈর্ঘ্যের উভয় এলিমেন্ট সহ একটি কন্টেইনারের জন্য অফসেটিং কীভাবে কাজ করে তা ব্যাখ্যা করে: + +```Rust + + struct Dummy { + + number1: u64, + number2: u64, + vector: Vec, + number3: u64 + } + + dummy = Dummy{ + + number1: 37, + number2: 55, + vector: vec![1,2,3,4], + number3: 22, + } + + serialized = ssz.serialize(dummy) + +``` + +`serialized`-এর নিম্নলিখিত কাঠামো থাকবে (এখানে শুধুমাত্র 4 বিটে প্যাড করা হয়েছে, বাস্তবে 32 বিটে প্যাড করা হয়েছে এবং স্পষ্টতার জন্য `int` উপস্থাপনা রাখা হয়েছে): + +``` +[37, 0, 0, 0, 55, 0, 0, 0, 16, 0, 0, 0, 22, 0, 0, 0, 1, 2, 3, 4] +------------ ----------- ----------- ----------- ---------- + | | | | | + নম্বর1 নম্বর2 ভেক্টরের নম্বর 3 ভেক্টরের + জন্য অফসেট জন্য মান + +``` + +স্বচ্ছতার জন্য লাইনে বিভক্ত করা হয়েছে: + +``` +[ + 37, 0, 0, 0, # `number1`-এর লিটল-এন্ডিয়ান এনকোডিং। + 55, 0, 0, 0, # `number2`-এর লিটল-এন্ডিয়ান এনকোডিং। + 16, 0, 0, 0, # "অফসেট" যা নির্দেশ করে `vector`-এর মান কোথায় শুরু হয় (লিটল-এন্ডিয়ান 16)। + 22, 0, 0, 0, # `number3`-এর লিটল-এন্ডিয়ান এনকোডিং। + 1, 2, 3, 4, # `vector`-এর আসল মান। +] +``` + +এটি এখনও একটি সরলীকরণ - উপরের পরিকল্পিত চিত্রগুলিতে পূর্ণসংখ্যা এবং শূন্যগুলি আসলে বাইটলিস্ট হিসাবে সংরক্ষণ করা হবে, এইভাবে: + +``` +[ + 10100101000000000000000000000000 # `number1`-এর লিটল-এন্ডিয়ান এনকোডিং + 10110111000000000000000000000000 # `number2`-এর লিটল-এন্ডিয়ান এনকোডিং। + 10010000000000000000000000000000 # "অফসেট" যা নির্দেশ করে `vector`-এর মান কোথায় শুরু হয় (লিটল-এন্ডিয়ান 16)। + 10010110000000000000000000000000 # `number3`-এর লিটল-এন্ডিয়ান এনকোডিং। + 10000001100000101000001110000100 # `bytes` ফিল্ডের আসল মান। +] +``` + +সুতরাং পরিবর্তনশীল-দৈর্ঘ্যের টাইপের জন্য আসল মানগুলি সিরিয়ালাইজড অবজেক্টের শেষে একটি হিপ-এ সংরক্ষণ করা হয়, এবং তাদের অফসেটগুলি ফিল্ডের ক্রমबद्ध তালিকায় তাদের সঠিক অবস্থানে সংরক্ষণ করা হয়। + +এছাড়াও কিছু বিশেষ ক্ষেত্র রয়েছে যার জন্য নির্দিষ্ট আচরণের প্রয়োজন হয়, যেমন `BitList` টাইপ যার জন্য সিরিয়ালাইজেশনের সময় একটি দৈর্ঘ্যের ক্যাপ যোগ করতে হয় এবং ডিসিরিয়ালাইজেশনের সময় অপসারণ করতে হয়। [SSZ স্পেক](https://github.com/ethereum/consensus-specs/blob/dev/ssz/simple-serialize.md)-এ সম্পূর্ণ বিবরণ উপলব্ধ আছে। + +### ডিসিরিয়ালাইজেশন {#deserialization} + +এই অবজেক্টটিকে ডিসিরিয়ালাইজ করতে স্কিমা প্রয়োজন। স্কিমাটি সিরিয়ালাইজড ডেটার সুনির্দিষ্ট বিন্যাসকে সংজ্ঞায়িত করে যাতে প্রতিটি নির্দিষ্ট এলিমেন্ট বাইটের একটি ব্লব থেকে সঠিক টাইপ, মান, আকার এবং অবস্থান সহ কিছু অর্থপূর্ণ অবজেক্টে ডিসিরিয়ালাইজ করা যায়। স্কিমাটিই ডিসিরিয়ালাইজারকে বলে যে কোন মানগুলি আসল মান এবং কোনটি অফসেট। একটি অবজেক্ট সিরিয়ালাইজ করা হলে সমস্ত ফিল্ডের নাম অদৃশ্য হয়ে যায়, কিন্তু স্কিমা অনুসারে ডিসিরিয়ালাইজেশনের সময় পুনরায় ইনস্ট্যানশিয়েট করা হয়। + +এটির উপর একটি ইন্টারেক্টিভ ব্যাখ্যার জন্য [ssz.dev](https://www.ssz.dev/overview) দেখুন। + +## মার্কেলাইজেশন {#merkleization} + +এই SSZ সিরিয়ালাইজড অবজেক্টটি তারপর মার্কেলাইজ করা যেতে পারে - অর্থাৎ একই ডেটার একটি মার্কল-ট্রি উপস্থাপনায় রূপান্তরিত করা যেতে পারে। প্রথমে, সিরিয়ালাইজড অবজেক্টে 32-বাইট চাঙ্কের সংখ্যা নির্ধারণ করা হয়। এগুলি গাছের "লিফ"। লিফের মোট সংখ্যা অবশ্যই 2-এর ঘাত হতে হবে যাতে লিফগুলিকে একসাথে হ্যাস করে অবশেষে একটি একক হ্যাস-ট্রি-রুট তৈরি হয়। যদি স্বাভাবিকভাবে এটি না হয়, তাহলে শূন্যের 32 বাইট ধারণকারী অতিরিক্ত লিফ যোগ করা হয়। ডায়াগ্রামের মাধ্যমে: + +``` + হ্যাস ট্রি রুট + / \ + / \ + / \ + / \ + লিফ ১ এবং ২ লিফ ৩ এবং ৪ + এর হ্যাস এর হ্যাস + / \ / \ + / \ / \ + / \ / \ + লিফ১ লিফ২ লিফ৩ লিফ৪ +``` + +এমন কিছু ক্ষেত্রও রয়েছে যেখানে গাছের লিফগুলি স্বাভাবিকভাবে উপরের উদাহরণের মতো সমানভাবে বন্টিত হয় না। উদাহরণস্বরূপ, লিফ 4 একাধিক এলিমেন্ট সহ একটি কন্টেইনার হতে পারে যার জন্য মার্কল ট্রিতে অতিরিক্ত "গভীরতা" যোগ করার প্রয়োজন হয়, যা একটি অসম ট্রি তৈরি করে। + +এই ট্রি এলিমেন্টগুলিকে লিফ X, নোড X ইত্যাদি হিসাবে উল্লেখ করার পরিবর্তে, আমরা তাদের সাধারণীকৃত সূচক দিতে পারি, রুট = 1 থেকে শুরু করে এবং প্রতিটি স্তর বরাবর বাম থেকে ডানে গণনা করে। এটি উপরে ব্যাখ্যা করা সাধারণীকৃত সূচক। সিরিয়ালাইজড তালিকার প্রতিটি এলিমেন্টের একটি সাধারণীকৃত সূচক রয়েছে যা `2**depth + idx`-এর সমান, যেখানে idx হল সিরিয়ালাইজড অবজেক্টে এর শূন্য-সূচিত অবস্থান এবং ডেপথ হল মার্কল ট্রিতে স্তরের সংখ্যা, যা এলিমেন্টের সংখ্যার (লিফ) বেস-টু লগারিদম হিসাবে নির্ধারণ করা যেতে পারে। + +## সাধারণীকৃত সূচক {#generalized-indices} + +একটি সাধারণীকৃত সূচক হল একটি পূর্ণসংখ্যা যা একটি বাইনারি মার্কল ট্রিতে একটি নোডকে প্রতিনিধিত্ব করে যেখানে প্রতিটি নোডের একটি সাধারণীকৃত সূচক `2 ** depth + index in row` থাকে। + +``` + 1 --ডেপথ = 0 2**0 + 0 = 1 + 2 3 --ডেপথ = 1 2**1 + 0 = 2, 2**1+1 = 3 + 4 5 6 7 --ডেপথ = 2 2**2 + 0 = 4, 2**2 + 1 = 5... + +``` + +এই উপস্থাপনাটি মার্কল ট্রিতে ডেটার প্রতিটি অংশের জন্য একটি নোড সূচক প্রদান করে। + +## মাল্টিপ্রুফস {#multiproofs} + +একটি নির্দিষ্ট এলিমেন্টকে প্রতিনিধিত্বকারী সাধারণীকৃত সূচকের তালিকা প্রদান করা আমাদেরকে হ্যাস-ট্রি-রুটের বিরুদ্ধে এটি যাচাই করার সুযোগ দেয়। এই রুটটি আমাদের বাস্তবতার স্বীকৃত সংস্করণ। আমাদেরকে প্রদত্ত যেকোনো ডেটা সেই বাস্তবতার বিরুদ্ধে মার্কল ট্রিতে সঠিক স্থানে (তার সাধারণীকৃত সূচক দ্বারা নির্ধারিত) প্রবেশ করিয়ে এবং রুটটি স্থির থাকে তা পর্যবেক্ষণ করে যাচাই করা যেতে পারে। স্পেকে [এখানে](https://github.com/ethereum/consensus-specs/blob/dev/ssz/merkle-proofs.md#merkle-multiproofs) এমন ফাংশন রয়েছে যা একটি নির্দিষ্ট সাধারণীকৃত সূচকের সেটের বিষয়বস্তু যাচাই করার জন্য প্রয়োজনীয় নোডের ন্যূনতম সেট কীভাবে গণনা করা যায় তা দেখায়। + +উদাহরণস্বরূপ, নীচের ট্রিতে ইনডেক্স 9-এ ডেটা যাচাই করতে, আমাদের ইনডেক্স 8, 9, 5, 3, 1-এ ডেটার হ্যাস প্রয়োজন। +(8,9)-এর হ্যাস (4)-এর হ্যাসের সমান হওয়া উচিত, যা 5-এর সাথে হ্যাস করে 2 তৈরি করে, যা 3-এর সাথে হ্যাস করে ট্রি রুট 1 তৈরি করে। যদি 9-এর জন্য ভুল ডেটা সরবরাহ করা হয়, তাহলে রুটটি পরিবর্তিত হবে - আমরা এটি সনাক্ত করব এবং শাখাটি যাচাই করতে ব্যর্থ হব। + +``` +* = প্রমাণ তৈরি করার জন্য প্রয়োজনীয় ডেটা + + 1* + 2 3* + 4 5* 6 7 +8* 9* 10 11 12 13 14 15 + +``` + +## আরও পড়ুন {#further-reading} + +- [ইথেরিয়াম আপগ্রেড করা: SSZ](https://eth2book.info/altair/part2/building_blocks/ssz) +- [ইথেরিয়াম আপগ্রেড করা: মার্কেলাইজেশন](https://eth2book.info/altair/part2/building_blocks/merkleization) +- [SSZ ইমপ্লিমেন্টেশন](https://github.com/ethereum/consensus-specs/issues/2138) +- [SSZ ক্যালকুলেটর](https://simpleserialize.com/) +- [SSZ.dev](https://www.ssz.dev/) diff --git a/public/content/translations/bn/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md b/public/content/translations/bn/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md new file mode 100644 index 00000000000..c9835d030aa --- /dev/null +++ b/public/content/translations/bn/developers/docs/data-structures-and-encoding/web3-secret-storage/index.md @@ -0,0 +1,195 @@ +--- +title: "Web3 গোপন সংগ্রহস্থল সংজ্ঞা" +description: "web3 গোপন সংগ্রহস্থলের জন্য আনুষ্ঠানিক সংজ্ঞা" +lang: bn +sidebarDepth: 2 +--- + +আপনার অ্যাপকে Ethereum-এ কাজ করানোর জন্য, আপনি web3.js লাইব্রেরি দ্বারা সরবরাহ করা web3 অবজেক্টটি ব্যবহার করতে পারেন। নেপথ্যে এটি RPC কলের মাধ্যমে একটি স্থানীয় নোডের সাথে যোগাযোগ করে। [web3](https://github.com/ethereum/web3.js/) যেকোনো Ethereum নোডের সাথে কাজ করে যা একটি RPC লেয়ার উন্মুক্ত করে। + +`web3`-তে `eth` অবজেক্টটি রয়েছে - web3.eth। + +```js +var fs = require("fs") +var recognizer = require("ethereum-keyfile-recognizer") + +fs.readFile("keyfile.json", (err, data) => { + var json = JSON.parse(data) + var result = recognizer(json) +}) + +/** ফলাফল + * [ 'web3', 3 ] web3 (v3) কীফাইল + * [ 'ethersale', undefined ] Ethersale কীফাইল + * null অবৈধ কীফাইল + */ +``` + +এই ডকুমেন্টটি Web3 গোপন সংগ্রহস্থল সংজ্ঞার **সংস্করণ 3** নথিভুক্ত করে। + +## সংজ্ঞা {#definition} + +ফাইলটির আসল এনকোডিং এবং ডিকোডিং সংস্করণ 1 থেকে মূলত অপরিবর্তিত রয়েছে, ব্যতিক্রম হল যে ক্রিপ্টো অ্যালগরিদম আর AES-128-CBC-তে সীমাবদ্ধ নয় (AES-128-CTR এখন ন্যূনতম প্রয়োজনীয়তা)। বেশিরভাগ অর্থ/অ্যালগরিদম সংস্করণ 1-এর মতোই, `mac` ছাড়া, যা ডিরাইভড কী-এর দ্বিতীয়-বামদিকের 16 বাইটের সাথে সম্পূর্ণ `ciphertext`-এর কনক্যাটেনেশনের SHA3 (keccak-256) হিসাবে দেওয়া হয়েছে। + +গোপন কী ফাইলগুলি সরাসরি `~/.web3/keystore` (ইউনিক্স-সদৃশ সিস্টেমের জন্য) এবং `~/AppData/Web3/keystore` (উইন্ডোজের জন্য) এখানে সংরক্ষণ করা হয়। তাদের যেকোনো নাম দেওয়া যেতে পারে, কিন্তু একটি ভাল প্রথা হলো `.json`, যেখানে `` হলো গোপন কী-কে দেওয়া 128-বিট UUID (গোপন কী-এর ঠিকানার জন্য একটি গোপনীয়তা-সংরক্ষণকারী প্রক্সি)। + +এই ধরনের সমস্ত ফাইলের একটি সংশ্লিষ্ট পাসওয়ার্ড থাকে। একটি প্রদত্ত `.json` ফাইলের গোপন কী ডিরাইভ করার জন্য, প্রথমে ফাইলটির এনক্রিপশন কী ডিরাইভ করুন; এটি করা হয় ফাইলটির পাসওয়ার্ড নিয়ে এবং `kdf` কী দ্বারা বর্ণিত একটি কী ডিরাইভেশন ফাংশনের মধ্যে দিয়ে পাস করিয়ে। KDF ফাংশনের জন্য KDF-নির্ভর স্ট্যাটিক এবং ডাইনামিক প্যারামিটারগুলি `kdfparams` কী-তে বর্ণনা করা আছে। + +ন্যূনতম-সম্মত সমস্ত ইমপ্লিমেন্টেশন দ্বারা PBKDF2 অবশ্যই সমর্থিত হতে হবে, যা বোঝানো হয়েছে: + +- `kdf`: `pbkdf2` + +PBKDF2-এর জন্য, kdfparams-এর মধ্যে অন্তর্ভুক্ত: + +- `prf`: অবশ্যই `hmac-sha256` হতে হবে (ভবিষ্যতে প্রসারিত হতে পারে); +- `c`: পুনরাবৃত্তির সংখ্যা; +- `salt`: PBKDF-এ পাস করা সল্ট; +- `dklen`: ডিরাইভড কী-এর জন্য দৈর্ঘ্য। অবশ্যই >= 32 হতে হবে। + +একবার ফাইলটির কী ডিরাইভ করা হয়ে গেলে, MAC-এর ডিরাইভেশনের মাধ্যমে এটি যাচাই করা উচিত। ডিরাইভড কী-এর দ্বিতীয়-বামদিকের 16 বাইটের সাথে `ciphertext` কী-এর বিষয়বস্তুর কনক্যাটেনেশন দ্বারা গঠিত বাইট অ্যারের SHA3 (keccak-256) হ্যাস হিসাবে MAC-কে গণনা করা উচিত, অর্থাৎ: + +```js +KECCAK(DK[16..31] ++ ) +``` + +(যেখানে `++` হল কনক্যাটেনেশন অপারেটর) + +এই মানটি `mac` কী-এর বিষয়বস্তুর সাথে তুলনা করা উচিত; যদি তারা ভিন্ন হয়, একটি বিকল্প পাসওয়ার্ড অনুরোধ করা উচিত (বা অপারেশনটি বাতিল করা উচিত)। + +ফাইলটির কী যাচাই করার পরে, `cipher` কী দ্বারা নির্দিষ্ট করা এবং `cipherparams` কী-এর মাধ্যমে প্যারামিটারাইজ করা সিমেট্রিক এনক্রিপশন অ্যালগরিদম ব্যবহার করে সাইফার টেক্সট (ফাইলে থাকা `ciphertext` কী) ডিক্রিপ্ট করা যেতে পারে। যদি ডিরাইভড কী-এর আকার এবং অ্যালগরিদমের কী-এর আকার মেলানো না যায়, তাহলে ডিরাইভড কী-এর শূন্য প্যাডযুক্ত, ডানদিকের বাইটগুলি অ্যালগরিদমের কী হিসাবে ব্যবহার করা উচিত। + +ন্যূনতম-সম্মত সমস্ত ইমপ্লিমেন্টেশন দ্বারা অবশ্যই AES-128-CTR অ্যালগরিদম সমর্থিত হতে হবে, যা বোঝানো হয়েছে: + +- `cipher: aes-128-ctr` + +এই সাইফারটি নিম্নলিখিত প্যারামিটারগুলি গ্রহণ করে, যা cipherparams কী-এর কী হিসাবে দেওয়া হয়েছে: + +- `iv`: সাইফারের জন্য 128-বিট ইনিশিয়ালাইজেশন ভেক্টর। + +সাইফারের জন্য কী হলো ডিরাইভড কী-এর বামদিকের 16 বাইট, অর্থাৎ `DK[0..15]` + +একটি গোপন কী-এর তৈরি/এনক্রিপশন মূলত এই নির্দেশাবলীর বিপরীত হওয়া উচিত। নিশ্চিত করুন যে `uuid`, `salt` এবং `iv` প্রকৃতপক্ষে র‍্যান্ডম। + +`version` ফিল্ড ছাড়াও, যা সংস্করণের একটি "হার্ড" শনাক্তকারী হিসাবে কাজ করা উচিত, ইমপ্লিমেন্টেশনগুলি ফরম্যাটের ছোটখাটো, নন-ব্রেকিং পরিবর্তনগুলি ট্র্যাক করার জন্য `minorversion`-ও ব্যবহার করতে পারে। + +## টেস্ট ভেক্টর {#test-vectors} + +বিবরণ: + +- `Address`: `008aeeda4d805471df9b2a5b0f38a0c3bcba786b` +- `ICAP`: `XE542A5PZHH8PYIZUBEJEO0MFWRAPPIL67` +- `UUID`: `3198bc9c-6672-5ab3-d9954942343ae5b6` +- `Password`: `testpassword` +- `Secret`: `7a28b5ba57c53603b0b07b56bba752f7784bf506fa95edc395f5cf6c7514fe9d` + +### PBKDF2-SHA-256 {#PBKDF2-SHA-256} + +`AES-128-CTR` এবং `PBKDF2-SHA-256` ব্যবহার করে টেস্ট ভেক্টর: + +`~/.web3/keystore/3198bc9c-6672-5ab3-d9954942343ae5b6.json` ফাইলের বিষয়বস্তু: + +```json +{ + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "6087dab2f9fdbbfaddc31a909735c1e6" + }, + "ciphertext": "5318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46", + "kdf": "pbkdf2", + "kdfparams": { + "c": 262144, + "dklen": 32, + "prf": "hmac-sha256", + "salt": "ae3cd4e7013836a3df6bd7241b12db061dbe2c6785853cce422d148a624ce0bd" + }, + "mac": "517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2" + }, + "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", + "version": 3 +} +``` + +**ইন্টারমিডিয়েট**: + +`ডিরাইভড কী`: `f06d69cdc7da0faffb1008270bca38f5e31891a3a773950e6d0fea48a7188551` +`MAC বডি`: `e31891a3a773950e6d0fea48a71885515318b4d5bcd28de64ee5559e671353e16f075ecae9f99c7a79a38af5f869aa46` +`MAC`: `517ead924a9d0dc3124507e3393d175ce3ff7c1e96529c6c555ce9e51205e9b2` +`সাইফার কী`: `f06d69cdc7da0faffb1008270bca38f5` + +### Scrypt {#scrypt} + +AES-128-CTR এবং Scrypt ব্যবহার করে টেস্ট ভেক্টর: + +```json +{ + "crypto": { + "cipher": "aes-128-ctr", + "cipherparams": { + "iv": "740770fce12ce862af21264dab25f1da" + }, + "ciphertext": "dd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2", + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "n": 262144, + "p": 1, + "r": 8, + "salt": "25710c2ccd7c610b24d068af83b959b7a0e5f40641f0c82daeb1345766191034" + }, + "mac": "337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c" + }, + "id": "3198bc9c-6672-5ab3-d995-4942343ae5b6", + "version": 3 +} +``` + +**ইন্টারমিডিয়েট**: + +`ডিরাইভড কী`: `7446f59ecc301d2d79bc3302650d8a5cedc185ccbb4bf3ca1ebd2c163eaa6c2d` +`MAC বডি`: `edc185ccbb4bf3ca1ebd2c163eaa6c2ddd8a1132cf57db67c038c6763afe2cbe6ea1949a86abc5843f8ca656ebbb1ea2` +`MAC`: `337aeb86505d2d0bb620effe57f18381377d67d76dac1090626aa5cd20886a7c` +`সাইফার কী`: `7446f59ecc301d2d79bc3302650d8a5c` + +## সংস্করণ 1 থেকে পরিবর্তন {#alterations-from-v2} + +এই সংস্করণটি [এখানে](https://github.com/ethereum/homestead-guide/blob/master/old-docs-for-reference/go-ethereum-wiki.rst/Passphrase-protected-key-store-spec.rst) প্রকাশিত সংস্করণ 1-এর সাথে থাকা বিভিন্ন অসংগতি সংশোধন করে। সংক্ষেপে এগুলি হল: + +- ক্যাপিটালাইজেশন অযৌক্তিক এবং অসংগতিপূর্ণ (scrypt ছোট হাতের, Kdf মিশ্র-কেস, MAC বড় হাতের)। +- ঠিকানা অপ্রয়োজনীয় এবং গোপনীয়তার সাথে আপোস করে। +- `Salt` মূলত কী ডিরাইভেশন ফাংশনের একটি প্যারামিটার এবং এটি সাধারণভাবে ক্রিপ্টোর সাথে নয়, বরং এটির সাথেই যুক্ত থাকা উচিত। +- _SaltLen_ অপ্রয়োজনীয় (শুধু Salt থেকে এটি ডিরাইভ করুন)। +- কী ডিরাইভেশন ফাংশন দেওয়া আছে, তবুও ক্রিপ্টো অ্যালগরিদমটি কঠোরভাবে নির্দিষ্ট করা আছে। +- `Version` মূলত সংখ্যাসূচক হলেও এটি একটি স্ট্রিং (একটি স্ট্রিং দিয়ে স্ট্রাকচার্ড সংস্করণ সম্ভব, কিন্তু কদাচিৎ পরিবর্তনশীল কনফিগারেশন ফাইল ফরম্যাটের জন্য এটি স্কোপের বাইরে বলে বিবেচনা করা যেতে পারে)। +- `KDF` এবং `cipher` ধারণাগতভাবে সহোদর ধারণা হলেও ভিন্নভাবে সংগঠিত। +- `MAC` একটি হোয়াইটস্পেস অজ্ঞেয় ডেটা খণ্ডের মাধ্যমে গণনা করা হয়(!) + +পূর্বে লিঙ্ক করা পৃষ্ঠায় দেওয়া উদাহরণের সাথে কার্যকরীভাবে সমতুল্য নিম্নলিখিত ফাইলটি দেওয়ার জন্য ফরম্যাটে পরিবর্তন করা হয়েছে: + +```json +{ + "crypto": { + "cipher": "aes-128-cbc", + "ciphertext": "07533e172414bfa50e99dba4a0ce603f654ebfa1ff46277c3e0c577fdc87f6bb4e4fe16c5a94ce6ce14cfa069821ef9b", + "cipherparams": { + "iv": "16d67ba0ce5a339ff2f07951253e6ba8" + }, + "kdf": "scrypt", + "kdfparams": { + "dklen": 32, + "n": 262144, + "p": 1, + "r": 8, + "salt": "06870e5e6a24e183a5c807bd1c43afd86d573f7db303ff4853d135cd0fd3fe91" + }, + "mac": "8ccded24da2e99a11d48cda146f9cc8213eb423e2ea0d8427f41c3be414424dd", + "version": 1 + }, + "id": "0498f19a-59db-4d54-ac95-33901b4f1870", + "version": 2 +} +``` + +## সংস্করণ 2 থেকে পরিবর্তন {#alterations-from-v2} + +সংস্করণ 2 ছিল একটি প্রাথমিক C++ ইমপ্লিমেন্টেশন যাতে বেশ কয়েকটি বাগ ছিল। এর থেকে সমস্ত অপরিহার্য বিষয় অপরিবর্তিত রয়েছে। diff --git a/public/content/translations/bn/developers/docs/design-and-ux/dex-design-best-practice/index.md b/public/content/translations/bn/developers/docs/design-and-ux/dex-design-best-practice/index.md new file mode 100644 index 00000000000..3993cc914ff --- /dev/null +++ b/public/content/translations/bn/developers/docs/design-and-ux/dex-design-best-practice/index.md @@ -0,0 +1,220 @@ +--- +title: "বিকেন্দ্রীভূত এক্সচেঞ্জ (DEX) ডিজাইনের সেরা অনুশীলন" +description: "টোকেন সোয়াপ করার জন্য UX/UI সিদ্ধান্ত ব্যাখ্যা করার একটি নির্দেশিকা।" +lang: bn +--- + +2018 সালে Uniswap চালু হওয়ার পর থেকে, কয়েক ডজন বিভিন্ন চেইন জুড়ে শত শত বিকেন্দ্রীভূত এক্সচেঞ্জ চালু হয়েছে। +এর মধ্যে অনেকগুলি নতুন উপাদান প্রবর্তন করেছে বা তাদের নিজস্ব টুইস্ট যুক্ত করেছে, কিন্তু ইন্টারফেসটি সাধারণত একই রকম রয়েছে। + +এর একটি কারণ হলো [জ্যাকবের আইন](https://lawsofux.com/jakobs-law/): + +> ব্যবহারকারীরা তাদের বেশিরভাগ সময় অন্যান্য সাইটে ব্যয় করে। এর মানে হল যে ব্যবহারকারীরা আপনার সাইটটিকে তাদের পরিচিত অন্যান্য সমস্ত সাইটের মতো একইভাবে কাজ করতে পছন্দ করে। + +Uniswap, Pancakeswap এবং Sushiswap-এর মতো প্রাথমিক উদ্ভাবকদের ধন্যবাদ, DeFi ব্যবহারকারীদের একটি DEX দেখতে কেমন তার একটি সম্মিলিত ধারণা রয়েছে। +এই কারণে, "সেরা অনুশীলন" এর মতো কিছু এখন উদ্ভূত হচ্ছে। আমরা দেখতে পাই যে সাইট জুড়ে আরও বেশি করে ডিজাইনের সিদ্ধান্তগুলি মানসম্মত করা হচ্ছে। আপনি DEXes-এর বিবর্তনকে লাইভ পরীক্ষা করার একটি বিশাল উদাহরণ হিসেবে দেখতে পারেন। যে জিনিসগুলি কাজ করেছে সেগুলি থেকে গেছে, যেগুলি কাজ করেনি, সেগুলি ফেলে দেওয়া হয়েছে। ব্যক্তিত্বের জন্য এখনও জায়গা আছে, তবে কিছু নির্দিষ্ট মান রয়েছে যা একটি DEX-কে মেনে চলতে হবে। + +এই নিবন্ধটি এর একটি সারসংক্ষেপ: + +- কী অন্তর্ভুক্ত করতে হবে +- কীভাবে এটিকে যথাসম্ভব ব্যবহারযোগ্য করে তোলা যায় +- ডিজাইন কাস্টমাইজ করার প্রধান উপায় + +সমস্ত উদাহরণ ওয়্যারফ্রেমগুলি বিশেষভাবে এই নিবন্ধটির জন্য তৈরি করা হয়েছিল, যদিও সেগুলি সবই বাস্তব প্রকল্পের উপর ভিত্তি করে তৈরি। + +Figma কিটটি নীচে অন্তর্ভুক্ত করা হয়েছে - এটি ব্যবহার করতে এবং আপনার নিজের ওয়্যারফ্রেমগুলির গতি বাড়াতে দ্বিধা বোধ করবেন না! + +## একটি DEX-এর মৌলিক অ্যানাটমি {#basic-anatomy-of-a-dex} + +UI-তে সাধারণত তিনটি উপাদান থাকে: + +1. প্রধান ফর্ম +2. বোতাম +3. বিস্তারিত প্যানেল + +![সাধারণ DEX UI, তিনটি প্রধান উপাদান দেখাচ্ছে](./1.png) + +## ভিন্নতা {#variations} + +এই নিবন্ধে এটি একটি সাধারণ থিম হবে, তবে এই উপাদানগুলি সংগঠিত করার বিভিন্ন উপায় রয়েছে। “বিস্তারিত প্যানেল” হতে পারে: + +- বোতামের উপরে +- বোতামের নীচে +- একটি অ্যাকর্ডিয়ন প্যানেলে লুকানো +- এবং/অথবা একটি “প্রিভিউ” মডালে + +N.B. একটি “প্রিভিউ” মডাল ঐচ্ছিক, তবে আপনি যদি মূল UI-তে খুব কম বিশদ বিবরণ দেখান তবে এটি অপরিহার্য হয়ে ওঠে। + +## প্রধান ফর্মের কাঠামো {#structure-of-the-main-form} + +এটি সেই বক্স যেখানে আপনি আসলে কোন টোকেনটি সোয়াপ করতে চান তা বেছে নেন। কম্পোনেন্টটিতে একটি ইনপুট ফিল্ড এবং একটি সারিতে একটি ছোট বোতাম রয়েছে। + +DEX গুলি সাধারণত উপরে একটি এবং নীচে একটি সারিতে অতিরিক্ত বিবরণ প্রদর্শন করে, যদিও এটি ভিন্নভাবে কনফিগার করা যেতে পারে। + +![ইনপুট সারি, উপরে এবং নীচে একটি বিশদ সারি সহ](./2.png) + +## ভিন্নতা {#variations2} + +এখানে দুটি UI ভিন্নতা দেখানো হয়েছে; একটি কোনো সীমানা ছাড়াই, একটি খুব খোলা ডিজাইন তৈরি করে এবং অন্যটি যেখানে ইনপুট সারিতে একটি সীমানা রয়েছে, যা সেই উপাদানের উপর একটি ফোকাস তৈরি করে। + +![প্রধান ফর্মের দুটি UI ভিন্নতা](./3.png) + +এই মৌলিক কাঠামোটি ডিজাইনে **চারটি মূল তথ্যের অংশ** দেখানোর অনুমতি দেয়: প্রতিটি কোণে একটি। যদি কেবল একটি উপরের/নীচের সারি থাকে, তবে কেবল দুটি জায়গা থাকে। + +DeFi-এর বিবর্তনের সময়, এখানে বিভিন্ন ধরনের জিনিস অন্তর্ভুক্ত করা হয়েছে। + +## অন্তর্ভুক্ত করার জন্য মূল তথ্য {#key-info-to-include} + +- ওয়ালেটের ব্যালেন্স +- সর্বোচ্চ বোতাম +- ফিয়াট সমতুল্য +- “প্রাপ্ত” পরিমাণের উপর মূল্যের প্রভাব + +DeFi-এর প্রথম দিকে, ফিয়াট সমতুল্য প্রায়ই অনুপস্থিত ছিল। আপনি যদি কোনো ধরনের Web3 প্রকল্প তৈরি করেন, তাহলে ফিয়াট সমতুল্য দেখানো অপরিহার্য। ব্যবহারকারীরা এখনও স্থানীয় মুদ্রার পরিপ্রেক্ষিতে চিন্তা করে, তাই বাস্তব বিশ্বের মানসিক মডেলগুলির সাথে মেলানোর জন্য, এটি অন্তর্ভুক্ত করা উচিত। + +দ্বিতীয় ফিল্ডে (যেখানে আপনি যে টোকেনটি সোয়াপ করছেন তা বেছে নেন) আপনি ইনপুট পরিমাণ এবং আনুমানিক আউটপুট পরিমাণের মধ্যে পার্থক্য গণনা করে ফিয়াট মুদ্রার পরিমাণের পাশে মূল্যের প্রভাবও অন্তর্ভুক্ত করতে পারেন। এটি অন্তর্ভুক্ত করার জন্য বেশ একটি দরকারী বিবরণ। + +শতাংশ বোতাম (যেমন, 25%, 50%, 75%) একটি দরকারী বৈশিষ্ট্য হতে পারে, তবে তারা আরও জায়গা নেয়, আরও কল টু অ্যাকশন যোগ করে এবং আরও মানসিক চাপ বাড়ায়। শতাংশ স্লাইডারের ক্ষেত্রেও একই। এই UI সিদ্ধান্তগুলির মধ্যে কিছু আপনার ব্র্যান্ড এবং আপনার ব্যবহারকারীর ধরনের উপর নির্ভর করবে। + +অতিরিক্ত বিবরণ প্রধান ফর্মের নীচে দেখানো যেতে পারে। যেহেতু এই ধরনের তথ্য বেশিরভাগ প্রো ব্যবহারকারীদের জন্য, তাই এর কোনো একটি অর্থপূর্ণ: + +- এটিকে যতটা সম্ভব ন্যূনতম রাখুন, বা; +- এটিকে একটি অ্যাকর্ডিয়ন প্যানেলে লুকান + +![সেই প্রধান ফর্মের কোণে দেখানো বিশদ](./4.png) + +## অন্তর্ভুক্ত করার জন্য অতিরিক্ত তথ্য {#extra-info-to-include} + +- টোকেনের মূল্য +- স্লিপেজ +- ন্যূনতম প্রাপ্ত +- প্রত্যাশিত আউটপুট +- মূল্যের প্রভাব +- গ্যাস খরচ অনুমান +- অন্যান্য ফি +- অর্ডার রাউটিং + +যুক্তিযুক্তভাবে, এই বিবরণগুলির মধ্যে কিছু ঐচ্ছিক হতে পারে। + +অর্ডার রাউটিং আকর্ষণীয়, কিন্তু বেশিরভাগ ব্যবহারকারীর জন্য খুব বেশি পার্থক্য তৈরি করে না। + +কিছু অন্যান্য বিবরণ কেবল একই জিনিসকে ভিন্ন উপায়ে পুনর্ব্যক্ত করছে। উদাহরণস্বরূপ “ন্যূনতম প্রাপ্ত” এবং “স্লিপেজ” একই মুদ্রার দুটি পিঠ। যদি আপনার স্লিপেজ 1% এ সেট করা থাকে, তাহলে আপনি যে সর্বনিম্ন পরিমাণ পাওয়ার আশা করতে পারেন = প্রত্যাশিত আউটপুট-1%। কিছু UI প্রত্যাশিত পরিমাণ, সর্বনিম্ন পরিমাণ এবং স্লিপেজ দেখাবে… যা দরকারী কিন্তু সম্ভবত অতিরিক্ত। + +যাইহোক, বেশিরভাগ ব্যবহারকারী ডিফল্ট স্লিপেজ ছেড়ে দেবে। + +“মূল্যের প্রভাব” প্রায়শই “টু” ফিল্ডে ফিয়াট সমতুল্যের পাশে বন্ধনীতে দেখানো হয়। এটি যোগ করার জন্য একটি দুর্দান্ত ux বিবরণ, কিন্তু যদি এটি এখানে দেখানো হয়, তবে কি এটি সত্যিই নীচে আবার দেখানোর প্রয়োজন আছে? এবং তারপর আবার একটি প্রিভিউ স্ক্রিনে? + +অনেক ব্যবহারকারী (বিশেষ করে যারা অল্প পরিমাণে সোয়াপ করে) এই বিবরণগুলি নিয়ে চিন্তা করবে না; তারা কেবল একটি সংখ্যা প্রবেশ করাবে এবং সোয়াপ চাপবে। + +![কিছু বিবরণ একই জিনিস দেখায়](./5.png) + +ঠিক কোন বিবরণ দেখানো হবে তা আপনার দর্শক এবং অ্যাপটির কেমন অনুভূতি দিতে চান তার উপর নির্ভর করবে। + +আপনি যদি বিশদ প্যানেলে স্লিপেজ টলারেন্স অন্তর্ভুক্ত করেন, তবে আপনার এটিকে সরাসরি এখান থেকে সম্পাদনাযোগ্য করা উচিত। এটি একটি “এক্সিলারেটর”-এর একটি ভাল উদাহরণ; একটি নিট UX কৌশল যা অ্যাপটির সাধারণ ব্যবহারযোগ্যতাকে প্রভাবিত না করে অভিজ্ঞ ব্যবহারকারীদের প্রবাহকে ত্বরান্বিত করতে পারে। + +![স্লিপেজ বিশদ প্যানেল থেকে নিয়ন্ত্রণ করা যেতে পারে](./6.png) + +শুধু একটি স্ক্রিনে একটি নির্দিষ্ট তথ্যের অংশ নিয়ে নয়, বরং সম্পূর্ণ প্রবাহ সম্পর্কে সাবধানে চিন্তা করা একটি ভাল ধারণা: +প্রধান ফর্মে সংখ্যা প্রবেশ করানো → বিশদ স্ক্যান করা → প্রিভিউ স্ক্রিনে ক্লিক করা (যদি আপনার প্রিভিউ স্ক্রিন থাকে)। +বিশদ প্যানেলটি কি সব সময় দৃশ্যমান হওয়া উচিত, নাকি ব্যবহারকারীকে এটি প্রসারিত করতে ক্লিক করতে হবে? +আপনার কি একটি প্রিভিউ স্ক্রিন যোগ করে ঘর্ষণ তৈরি করা উচিত? এটি ব্যবহারকারীকে ধীর হতে এবং তাদের ট্রেড বিবেচনা করতে বাধ্য করে, যা দরকারী হতে পারে। কিন্তু তারা কি আবার একই তথ্য দেখতে চায়? এই মুহূর্তে তাদের জন্য সবচেয়ে দরকারী কী? + +## ডিজাইন বিকল্প {#design-options} + +যেমন উল্লেখ করা হয়েছে, এর বেশিরভাগই আপনার ব্যক্তিগত শৈলীর উপর নির্ভর করে +আপনার ব্যবহারকারী কে? +আপনার ব্র্যান্ড কি? +আপনি কি প্রতিটি বিবরণ দেখানো একটি “প্রো” ইন্টারফেস চান, নাকি আপনি ন্যূনতম হতে চান? +এমনকি যদি আপনি প্রো ব্যবহারকারীদের লক্ষ্য করেন যারা সম্ভাব্য সমস্ত তথ্য চায়, আপনার এখনও অ্যালান কুপারের বিজ্ঞ কথাগুলি মনে রাখা উচিত: + +> আপনার ইন্টারফেস যতই সুন্দর হোক, যতই শীতল হোক না কেন, যদি এর কম থাকত তবে ভাল হত। + +### কাঠামো {#structure} + +- বাম দিকে টোকেন, বা ডান দিকে টোকেন +- ২টি সারি বা ৩টি +- বোতামের উপরে বা নীচে বিশদ +- বিশদ প্রসারিত, ছোট করা, বা দেখানো হয়নি + +### কম্পোনেন্ট শৈলী {#component-style} + +- খালি +- আউটলাইন করা +- ভরা + +একটি বিশুদ্ধ UX দৃষ্টিকোণ থেকে, UI শৈলী আপনার ভাবনার চেয়ে কম গুরুত্বপূর্ণ। ভিজ্যুয়াল ট্রেন্ডগুলি চক্রাকারে আসে এবং যায়, এবং অনেক পছন্দই ব্যক্তিগত। + +এর জন্য একটি অনুভূতি পেতে - এবং বিভিন্ন কনফিগারেশন সম্পর্কে চিন্তা করার - সবচেয়ে সহজ উপায় হল কিছু উদাহরণ দেখা এবং তারপর নিজে কিছু পরীক্ষা করা। + +অন্তর্ভুক্ত Figma কিটটিতে খালি, আউটলাইন করা এবং ভরা কম্পোনেন্ট রয়েছে। + +আপনি কীভাবে এটি সব একসাথে রাখতে পারেন তার বিভিন্ন উপায় দেখতে নীচের উদাহরণগুলি দেখুন: + +![ভরা শৈলীতে ৩টি সারি](./7.png) + +![আউটলাইন করা শৈলীতে ৩টি সারি](./8.png) + +![একটি খালি শৈলীতে ২টি সারি](./9.png) + +![আউটলাইন করা শৈলীতে ৩টি সারি, একটি বিশদ প্যানেল সহ](./10.png) + +![আউটলাইন করা শৈলীতে ইনপুট সারি সহ ৩টি সারি](./11.png) + +![ভরা শৈলীতে ২টি সারি](./12.png) + +## কিন্তু টোকেন কোন দিকে যাওয়া উচিত? {#but-which-side-should-the-token-go-on} + +মূল কথা হল যে এটি সম্ভবত ব্যবহারযোগ্যতার উপর খুব বেশি প্রভাব ফেলে না। তবে, কিছু বিষয় মাথায় রাখতে হবে, যা আপনাকে এক দিকে বা অন্য দিকে প্রভাবিত করতে পারে। + +সময়ের সাথে সাথে ফ্যাশন পরিবর্তন দেখতে কিছুটা আকর্ষণীয় হয়েছে। Uniswap প্রাথমিকভাবে টোকেনটি বাম দিকে রেখেছিল, কিন্তু পরে এটি ডান দিকে সরিয়ে দিয়েছে। Sushiswap-ও একটি ডিজাইন আপগ্রেডের সময় এই পরিবর্তনটি করেছিল। বেশিরভাগ, কিন্তু সব নয়, প্রোটোকলগুলি অনুসরণ করেছে। + +আর্থিক প্রথা ঐতিহ্যগতভাবে সংখ্যার আগে মুদ্রার প্রতীক রাখে, যেমন, $50, €50, £50, কিন্তু আমরা _বলি_ 50 ডলার, 50 ইউরো, 50 পাউন্ড। + +সাধারণ ব্যবহারকারীর জন্য - বিশেষ করে যে বাম থেকে ডানে, উপর থেকে নীচে পড়ে - ডানদিকে টোকেন সম্ভবত আরও স্বাভাবিক মনে হয়। + +![বাম দিকে টোকেন সহ একটি UI](./13.png) + +বাম দিকে টোকেন এবং ডানদিকে সমস্ত সংখ্যা রাখা আনন্দদায়কভাবে প্রতিসম দেখায়, যা একটি প্লাস, তবে এই লেআউটের আরেকটি নেতিবাচক দিক রয়েছে। + +নৈকট্যের আইন বলে যে কাছাকাছি থাকা আইটেমগুলি সম্পর্কিত হিসাবে বিবেচিত হয়। তদনুসারে, আমরা সম্পর্কিত আইটেমগুলি একে অপরের পাশে রাখতে চাই। টোকেন ব্যালেন্স সরাসরি টোকেনের সাথে সম্পর্কিত, এবং যখনই একটি নতুন টোকেন নির্বাচন করা হবে তখন এটি পরিবর্তিত হবে। তাই টোকেন ব্যালেন্স টোকেন নির্বাচন বোতামের পাশে থাকাটা কিছুটা বেশি অর্থপূর্ণ। এটি টোকেনের নীচে সরানো যেতে পারে, তবে এটি লেআউটের প্রতিসাম্য ভেঙে দেয়। + +শেষ পর্যন্ত, উভয় বিকল্পের জন্যই প্লাস এবং মাইনাস রয়েছে, তবে এটি আকর্ষণীয় যে প্রবণতাটি ডানদিকে টোকেনের দিকে বলে মনে হচ্ছে। + +## বোতামের আচরণ {#button-behavior} + +অনুমোদনের জন্য একটি পৃথক বোতাম রাখবেন না। এছাড়াও অনুমোদনের জন্য একটি পৃথক ক্লিক রাখবেন না। ব্যবহারকারী সোয়াপ করতে চায়, তাই শুধু বোতামে “সোয়াপ” বলুন এবং প্রথম পদক্ষেপ হিসাবে অনুমোদন শুরু করুন। একটি মডাল একটি স্টেপারের সাথে অগ্রগতি দেখাতে পারে, বা একটি সাধারণ “tx 1 of 2 - approving” বিজ্ঞপ্তি। + +![অনুমোদন এবং সোয়াপের জন্য পৃথক বোতাম সহ একটি UI](./14.png) + +![একটি বোতাম সহ একটি UI যা অনুমোদন বলে](./15.png) + +### প্রাসঙ্গিক সহায়তা হিসাবে বোতাম {#button-as-contextual-help} + +বোতামটি একটি সতর্কতা হিসাবে দ্বিগুণ দায়িত্ব পালন করতে পারে! + +এটি আসলে Web3-এর বাইরে একটি মোটামুটি অস্বাভাবিক ডিজাইন প্যাটার্ন, কিন্তু এর মধ্যে এটি মানসম্মত হয়ে উঠেছে। এটি একটি ভাল উদ্ভাবন কারণ এটি স্থান বাঁচায় এবং মনোযোগ কেন্দ্রীভূত রাখে। + +যদি প্রধান ক্রিয়া - সোয়াপ - একটি ত্রুটির কারণে অনুপলব্ধ হয়, তবে কারণটি বোতামের সাহায্যে ব্যাখ্যা করা যেতে পারে, যেমন: + +- নেটওয়ার্ক পরিবর্তন করুন +- ওয়ালেট সংযোগ করুন +- বিভিন্ন ত্রুটি + +বোতামটি যে ক্রিয়াটি সম্পাদন করা দরকার তার সাথে **ম্যাপ করা** যেতে পারে। উদাহরণস্বরূপ, যদি ব্যবহারকারী ভুল নেটওয়ার্কে থাকার কারণে সোয়াপ করতে না পারে, বোতামটিতে “ইথেরিয়ামে পরিবর্তন করুন” লেখা উচিত এবং ব্যবহারকারী যখন বোতামে ক্লিক করে, তখন এটি নেটওয়ার্কটিকে ইথেরিয়ামে পরিবর্তন করা উচিত। এটি ব্যবহারকারীর প্রবাহকে উল্লেখযোগ্যভাবে ত্বরান্বিত করে। + +![প্রধান CTA থেকে শুরু করা মূল ক্রিয়া](./16.png) + +![প্রধান CTA-এর মধ্যে দেখানো ত্রুটি বার্তা](./17.png) + +## এই ফিগমা ফাইল দিয়ে আপনার নিজের তৈরি করুন {#build-your-own-with-this-figma-file} + +একাধিক প্রোটোকলের কঠোর পরিশ্রমের জন্য ধন্যবাদ, DEX ডিজাইন অনেক উন্নত হয়েছে। আমরা জানি ব্যবহারকারীর কী তথ্য প্রয়োজন, আমাদের কীভাবে এটি দেখানো উচিত এবং কীভাবে প্রবাহটিকে যতটা সম্ভব মসৃণ করা যায়। +আশা করি এই নিবন্ধটি UX নীতির একটি ठोस ওভারভিউ প্রদান করে। + +আপনি যদি পরীক্ষা করতে চান, তাহলে অনুগ্রহ করে Figma ওয়্যারফ্রেম কিট ব্যবহার করতে দ্বিধা বোধ করবেন না। এটি যতটা সম্ভব সহজ রাখা হয়েছে, তবে বিভিন্ন উপায়ে মৌলিক কাঠামো তৈরি করার জন্য যথেষ্ট নমনীয়তা রয়েছে। + +[Figma ওয়্যারফ্রেম কিট](https://www.figma.com/community/file/1393606680816807382/dex-wireframes-kit) + +DeFi বিকশিত হতে থাকবে, এবং উন্নতির জন্য সর্বদা জায়গা আছে। + +শুভকামনা! diff --git a/public/content/translations/bn/developers/docs/design-and-ux/heuristics-for-web3/index.md b/public/content/translations/bn/developers/docs/design-and-ux/heuristics-for-web3/index.md new file mode 100644 index 00000000000..f850ddfce06 --- /dev/null +++ b/public/content/translations/bn/developers/docs/design-and-ux/heuristics-for-web3/index.md @@ -0,0 +1,138 @@ +--- +title: "Web3 ইন্টারফেস ডিজাইনের জন্য ৭টি হিউরিস্টিকস" +description: "Web3-এর ব্যবহারযোগ্যতা উন্নত করার নীতিমালা" +lang: bn +--- + +ব্যবহারযোগ্যতার হিউরিস্টিকস হল ব্যাপক “সাধারণ নিয়ম” যা আপনি আপনার সাইটের ব্যবহারযোগ্যতা পরিমাপ করতে ব্যবহার করতে পারেন। +এখানকার ৭টি হিউরিস্টিকস বিশেষভাবে Web3-এর জন্য তৈরি করা হয়েছে এবং Jakob Nielsen-এর [ইন্টারঅ্যাকশন ডিজাইনের জন্য ১০টি সাধারণ নীতি](https://www.nngroup.com/articles/ten-usability-heuristics/)-এর পাশাপাশি ব্যবহার করা উচিত। + +## web3-এর জন্য সাতটি ব্যবহারযোগ্যতার হিউরিস্টিকস {#seven-usability-heuristics-for-web3} + +1. কাজের পরে প্রতিক্রিয়া +2. নিরাপত্তা এবং বিশ্বাস +3. সবচেয়ে গুরুত্বপূর্ণ তথ্য স্পষ্ট +4. সহজবোধ্য পরিভাষা +5. কাজগুলো যতটা সম্ভব সংক্ষিপ্ত +6. নেটওয়ার্ক সংযোগ দৃশ্যমান এবং নমনীয় +7. অ্যাপ থেকে নিয়ন্ত্রণ, ওয়ালেট থেকে নয় + +## সংজ্ঞা এবং উদাহরণ {#definitions-and-examples} + +### 1. কাজের পরে প্রতিক্রিয়া {#feedback-follows-action} + +**যখন কিছু ঘটেছে, বা ঘটছে, তখন তা স্পষ্ট হওয়া উচিত।** + +ব্যবহারকারীরা তাদের পূর্ববর্তী পদক্ষেপের ফলাফলের উপর ভিত্তি করে তাদের পরবর্তী পদক্ষেপের বিষয়ে সিদ্ধান্ত নেয়। তাই এটা অপরিহার্য যে তারা সিস্টেমের অবস্থা সম্পর্কে অবগত থাকে। Web3-তে এটি বিশেষভাবে গুরুত্বপূর্ণ কারণ লেনদেনগুলি ব্লকচেইনে জমা হতে কখনও কখনও একটি সংক্ষিপ্ত সময় নিতে পারে। যদি তাদের অপেক্ষা করার জন্য কোনো প্রতিক্রিয়া না থাকে, তাহলে ব্যবহারকারীরা নিশ্চিত হতে পারে না যে কিছু ঘটেছে কিনা। + +**পরামর্শ:** + +- মেসেজিং, নোটিফিকেশন এবং অন্যান্য সতর্কবার্তার মাধ্যমে ব্যবহারকারীকে জানান। +- অপেক্ষার সময় স্পষ্টভাবে জানান। +- যদি কোনো কাজে কয়েক সেকেন্ডের বেশি সময় লাগে, তাহলে একটি টাইমার বা একটি অ্যানিমেশন দিয়ে ব্যবহারকারীকে আশ্বস্ত করুন যাতে তারা অনুভব করে যে কিছু ঘটছে। +- যদি একটি প্রক্রিয়ায় একাধিক ধাপ থাকে, তাহলে প্রতিটি ধাপ দেখান। + +**উদাহরণ:** +একটি লেনদেনের সাথে জড়িত প্রতিটি ধাপ দেখানো ব্যবহারকারীদের জানতে সাহায্য করে যে তারা প্রক্রিয়ার কোথায় আছে। উপযুক্ত আইকন ব্যবহারকারীকে তাদের কাজের স্থিতি জানতে দেয়। + +![টোকেন সোয়াপ করার সময় প্রতিটি ধাপ সম্পর্কে ব্যবহারকারীকে জানানো](./Image1.png) + +### 2. নিরাপত্তা এবং বিশ্বাস অন্তর্নির্মিত {#security-and-trust-are-backed-in} + +নিরাপত্তাকে অগ্রাধিকার দেওয়া উচিত, এবং এটি ব্যবহারকারীর জন্য জোর দেওয়া উচিত। +লোকেরা তাদের ডেটা সম্পর্কে গভীরভাবে যত্ন নেয়। নিরাপত্তা প্রায়শই ব্যবহারকারীদের জন্য একটি প্রাথমিক উদ্বেগের বিষয়, তাই ডিজাইনের সমস্ত স্তরে এটি বিবেচনা করা উচিত। আপনার সর্বদা আপনার ব্যবহারকারীদের বিশ্বাস অর্জনের চেষ্টা করা উচিত, কিন্তু আপনি যেভাবে এটি করেন তা বিভিন্ন অ্যাপে বিভিন্ন অর্থ বোঝাতে পারে। এটি একটি পরবর্তী চিন্তা হওয়া উচিত নয়, বরং এটি সচেতনভাবে সর্বত্র ডিজাইন করা উচিত। সামাজিক চ্যানেল এবং নথিপত্র সহ ব্যবহারকারীর অভিজ্ঞতার সর্বত্র বিশ্বাস তৈরি করুন, এবং চূড়ান্ত UI। বিকেন্দ্রীকরণের স্তর, ট্রেজারি মাল্টি-সিগ স্ট্যাটাস, এবং দলটির পরিচয় প্রকাশ করা হয়েছে কিনা, এই সবই ব্যবহারকারীদের বিশ্বাসকে প্রভাবিত করে + +**পরামর্শ:** + +- আপনার অডিট গর্বের সাথে তালিকাভুক্ত করুন +- একাধিক অডিট করান +- আপনার ডিজাইন করা যেকোনো নিরাপত্তা ফিচারের বিজ্ঞাপন দিন +- অন্তর্নিহিত ইন্টিগ্রেশন সহ সম্ভাব্য ঝুঁকিগুলি তুলে ধরুন +- কৌশলের জটিলতা সম্পর্কে জানান +- নন-UI সমস্যাগুলি বিবেচনা করুন যা আপনার ব্যবহারকারীদের নিরাপত্তার ধারণাকে প্রভাবিত করতে পারে + +**উদাহরণ:** +ফুটারের মধ্যে আপনার অডিট একটি বিশিষ্ট আকারে অন্তর্ভুক্ত করুন। + +![ওয়েবসাইট ফুটারে উল্লেখিত অডিট](./Image2.png) + +### 3. সবচেয়ে গুরুত্বপূর্ণ তথ্য স্পষ্ট {#the-most-important-info-is-obvious} + +জটিল সিস্টেমের জন্য, শুধুমাত্র সবচেয়ে প্রাসঙ্গিক ডেটা দেখান। কোনটি সবচেয়ে গুরুত্বপূর্ণ তা নির্ধারণ করুন, এবং এর প্রদর্শনকে অগ্রাধিকার দিন। +অতিরিক্ত তথ্য বিভ্রান্তিকর হতে পারে এবং ব্যবহারকারীরা সাধারণত সিদ্ধান্ত নেওয়ার সময় একটি তথ্যের উপর নির্ভর করে। DeFi-তে, এটি সম্ভবত ইয়েল্ড অ্যাপে APR এবং লেন্ডিং অ্যাপে LTV হবে। + +**পরামর্শ:** + +- ব্যবহারকারী গবেষণা সবচেয়ে গুরুত্বপূর্ণ মেট্রিক উন্মোচন করবে +- মূল তথ্য বড় করুন, এবং অন্যান্য বিবরণ ছোট এবং অগোচরে রাখুন +- মানুষ পড়ে না, তারা স্ক্যান করে; নিশ্চিত করুন আপনার ডিজাইন স্ক্যানযোগ্য + +**উদাহরণ:** পূর্ণ রঙের বড় টোকেন স্ক্যান করার সময় খুঁজে পাওয়া সহজ। APR বড় এবং একটি অ্যাকসেন্ট রঙে হাইলাইট করা হয়েছে। + +![টোকেন এবং APR খুঁজে পাওয়া সহজ](./Image3.png) + +### ৪. স্পষ্ট পরিভাষা {#clear-terminology} + +পরিভাষা সহজবোধ্য এবং উপযুক্ত হওয়া উচিত। +প্রযুক্তিগত পরিভাষা একটি বিশাল বাধা হতে পারে, কারণ এর জন্য একটি সম্পূর্ণ নতুন মানসিক মডেল তৈরির প্রয়োজন হয়। ব্যবহারকারীরা ডিজাইনটিকে এমন শব্দ, বাক্যাংশ এবং ধারণার সাথে সম্পর্কিত করতে পারে না যা তারা ইতিমধ্যে জানে। সবকিছু বিভ্রান্তিকর এবং অপরিচিত মনে হয়, এবং এমনকি এটি ব্যবহার করার চেষ্টা করার আগেও একটি খাড়া শেখার বক্ররেখা রয়েছে। একজন ব্যবহারকারী কিছু টাকা সঞ্চয় করতে চেয়ে DeFi-তে আসতে পারে, এবং তারা যা খুঁজে পায় তা হল: মাইনিং, ফার্মিং, স্টেকিং, এমিশন, ব্রাইব, ভল্ট, লকার, veTokens, ভেস্টিং, ইপকস, ডিসেন্ট্রালাইজড অ্যালগরিদম, প্রোটোকল-ওনড লিকুইডিটি… +সহজ পরিভাষা ব্যবহার করার চেষ্টা করুন যা সবচেয়ে বিস্তৃত গোষ্ঠীর মানুষ বুঝতে পারবে। শুধুমাত্র আপনার প্রকল্পের জন্য একেবারে নতুন পরিভাষা উদ্ভাবন করবেন না। + +**পরামর্শ:** + +- সহজ এবং সামঞ্জস্যপূর্ণ পরিভাষা ব্যবহার করুন +- যতটা সম্ভব বিদ্যমান ভাষা ব্যবহার করুন +- আপনার নিজস্ব পরিভাষা তৈরি করবেন না +- প্রচলিত নিয়মগুলি অনুসরণ করুন যেমনটি সেগুলি প্রদর্শিত হয় +- যতটা সম্ভব ব্যবহারকারীদের শিক্ষিত করুন + +**উদাহরণ:** +“আপনার পুরস্কার” একটি ব্যাপকভাবে বোঝা, নিরপেক্ষ পরিভাষা; এই প্রকল্পের জন্য তৈরি করা কোনো নতুন শব্দ নয়। বাস্তব বিশ্বের মানসিক মডেলগুলির সাথে মেলানোর জন্য পুরস্কারগুলি USD-তে নির্ধারিত হয়, যদিও পুরস্কারগুলি নিজেরাই অন্য টোকেনে থাকে। + +![টোকেন পুরস্কার, মার্কিন ডলারে প্রদর্শিত](./Image4.png) + +### ৫। কাজগুলো যতটা সম্ভব সংক্ষিপ্ত {#actions-are-as-short-as-possible} + +উপ-কাজগুলিকে গোষ্ঠীবদ্ধ করে ব্যবহারকারীর ইন্টারঅ্যাকশনের গতি বাড়ান। +এটি স্মার্ট কন্ট্র্যাক্ট স্তরে, এবং UI-তেও করা যেতে পারে। একটি সাধারণ কাজ সম্পন্ন করতে ব্যবহারকারীকে সিস্টেমের এক অংশ থেকে অন্য অংশে – অথবা সিস্টেমটি পুরোপুরি ছেড়ে যেতে হবে না। + +**পরামর্শ:** + +- যেখানে সম্ভব অন্যান্য কাজের সাথে "অনুমোদন" একত্রিত করুন +- সাইনিং পদক্ষেপগুলি যতটা সম্ভব কাছাকাছি একত্রিত করুন + +**উদাহরণ:** “তারল্য যোগ করুন” এবং “স্টেক” একত্রিত করা একটি অ্যাক্সিলারেটরের একটি সহজ উদাহরণ যা একজন ব্যবহারকারীর সময় এবং গ্যাস উভয়ই বাঁচায়। + +![ডিপোজিট এবং স্টেক কাজগুলিকে একত্রিত করার জন্য একটি সুইচ দেখানো মোডাল](./Image5.png) + +### ৬. নেটওয়ার্ক সংযোগ দৃশ্যমান এবং নমনীয় {#network-connections-are-visible-and-flexible} + +ব্যবহারকারীকে জানান তারা কোন নেটওয়ার্কে সংযুক্ত আছে, এবং নেটওয়ার্ক পরিবর্তন করার জন্য স্পষ্ট শর্টকাট প্রদান করুন। +এটি মাল্টিচেইন অ্যাপে বিশেষভাবে গুরুত্বপূর্ণ। সংযোগ বিচ্ছিন্ন থাকা অবস্থায় বা একটি অসমর্থিত নেটওয়ার্কে সংযুক্ত থাকা অবস্থায়ও অ্যাপের প্রধান ফাংশনগুলি দৃশ্যমান থাকা উচিত। + +**পরামর্শ:** + +- সংযোগ বিচ্ছিন্ন থাকা অবস্থায় অ্যাপের যতটা সম্ভব দেখান +- ব্যবহারকারী বর্তমানে কোন নেটওয়ার্কে সংযুক্ত আছে তা দেখান +- নেটওয়ার্ক পরিবর্তন করতে ব্যবহারকারীকে ওয়ালেটে যেতে বাধ্য করবেন না +- যদি অ্যাপটি ব্যবহারকারীকে নেটওয়ার্ক পরিবর্তন করতে বলে, তবে প্রধান কল টু অ্যাকশন থেকে কাজটি প্রম্পট করুন +- যদি অ্যাপটিতে একাধিক নেটওয়ার্কের জন্য মার্কেট বা ভল্ট থাকে, তবে স্পষ্টভাবে বলুন ব্যবহারকারী বর্তমানে কোন সেটটি দেখছে + +**উদাহরণ:** ব্যবহারকারীকে দেখান তারা কোন নেটওয়ার্কে সংযুক্ত আছে, এবং অ্যাপবারে তাদের এটি পরিবর্তন করার অনুমতি দিন। + +![সংযুক্ত নেটওয়ার্ক দেখানো ড্রপডাউন বোতাম](./Image6.png) + +### ৭. অ্যাপ থেকে নিয়ন্ত্রণ, ওয়ালেট থেকে নয় {#control-from-the-app-not-the-wallet} + +UI-এর উচিত ব্যবহারকারীকে তার যা কিছু জানা দরকার তা বলা এবং তার যা কিছু করা দরকার তার উপর নিয়ন্ত্রণ দেওয়া। +Web3-তে, এমন কিছু কাজ আছে যা আপনি UI-তে করেন, এবং এমন কিছু কাজ আছে যা আপনি ওয়ালেটে করেন। সাধারণত, আপনি UI-তে একটি কাজ শুরু করেন, এবং তারপর ওয়ালেটে তা নিশ্চিত করেন। যদি এই দুটি ধারা সাবধানে একত্রিত না করা হয় তবে ব্যবহারকারীরা অস্বস্তি বোধ করতে পারে। + +**পরামর্শ:** + +- UI-তে প্রতিক্রিয়ার মাধ্যমে সিস্টেমের স্থিতি জানান +- তাদের ইতিহাসের একটি রেকর্ড রাখুন +- পুরানো লেনদেনের জন্য ব্লক এক্সপ্লোরারের লিঙ্ক প্রদান করুন +- নেটওয়ার্ক পরিবর্তন করার জন্য শর্টকাট প্রদান করুন। + +একটি সূক্ষ্ম কন্টেইনার ব্যবহারকারীকে দেখায় তাদের ওয়ালেটে কোন প্রাসঙ্গিক টোকেন আছে, এবং প্রধান CTA নেটওয়ার্ক পরিবর্তন করার জন্য একটি শর্টকাট প্রদান করে। + +![প্রধান CTA ব্যবহারকারীকে নেটওয়ার্ক পরিবর্তন করতে প্রম্পট করছে](./Image7.png) diff --git a/public/content/translations/bn/developers/docs/design-and-ux/index.md b/public/content/translations/bn/developers/docs/design-and-ux/index.md new file mode 100644 index 00000000000..ad5c5f16890 --- /dev/null +++ b/public/content/translations/bn/developers/docs/design-and-ux/index.md @@ -0,0 +1,86 @@ +--- +title: "Web3 তে ডিজাইন এবং UX" +description: "Web3 স্পেস এবং ইথেরিয়াম-এ UX ডিজাইন এবং গবেষণার ভূমিকা" +lang: bn +--- + +আপনি কি ইথেরিয়াম দিয়ে ডিজাইন করার ক্ষেত্রে নতুন? এটি আপনার জন্য সঠিক জায়গা। Web3 ডিজাইন এবং গবেষণার মূল বিষয়গুলির সাথে আপনাকে পরিচয় করিয়ে দেওয়ার জন্য ইথেরিয়াম কমিউনিটি রিসোর্স লিখেছে। আপনি এমন মূল ধারণাগুলি সম্পর্কে শিখবেন যা আপনার পরিচিত অন্যান্য অ্যাপ ডিজাইন থেকে ভিন্ন হতে পারে। + +প্রথমে Web3 সম্পর্কে আরও প্রাথমিক ধারণা প্রয়োজন? [**লার্ন হাব**](/learn/) দেখুন। + +## ব্যবহারকারী গবেষণা দিয়ে শুরু করুন {#start-with-user-research} + +কার্যকরী ডিজাইন শুধুমাত্র দৃশ্যত আকর্ষণীয় ব্যবহারকারী ইন্টারফেস তৈরি করার মধ্যেই সীমাবদ্ধ নয়। এর মধ্যে ব্যবহারকারীর প্রয়োজন, উদ্দেশ্য এবং চালিকা শক্তি সম্পর্কে গভীর উপলব্ধি অর্জন করা জড়িত। অতএব, আমরা দৃঢ়ভাবে সুপারিশ করি যে সমস্ত ডিজাইনার একটি ডিজাইন প্রক্রিয়া, যেমন [**ডাবল ডায়মন্ড প্রক্রিয়া**](https://en.wikipedia.org/wiki/Double_Diamond_\(design_process_model\)) গ্রহণ করুন, যাতে তাদের কাজ ইচ্ছাকৃত এবং উদ্দেশ্যপ্রণোদিত হয়। + +- [Web3-এর আরও বেশি UX গবেষক এবং ডিজাইনার প্রয়োজন](https://blog.akasha.org/akasha-conversations-9-web3-needs-more-ux-researchers-and-designers) - বর্তমান ডিজাইন পরিপক্কতার একটি সংক্ষিপ্ত বিবরণ +- [web3-এ UX গবেষণার জন্য একটি সহজ নির্দেশিকা](https://uxplanet.org/a-complete-guide-to-ux-research-for-web-3-0-products-d6bead20ebb1) - কিভাবে গবেষণা করতে হয় তার সহজ নির্দেশিকা +- [Web3-তে UX সিদ্ধান্ত গ্রহণের পদ্ধতি](https://archive.devcon.org/archive/watch/6/data-empathy-how-to-approach-ux-decisions-in-web3/) - পরিমাণগত এবং গুণগত গবেষণা এবং দুটির মধ্যে পার্থক্যের একটি সংক্ষিপ্ত বিবরণ (ভিডিও, ৬ মিনিট) +- [web3-এ একজন ux গবেষক হওয়া](https://medium.com/@georgia.rakusen/what-its-like-being-a-user-researcher-in-web3-6a4bcc096849) - web3-এ একজন UX গবেষক হতে কেমন লাগে তার উপর একটি ব্যক্তিগত মতামত + +## web3-তে গবেষণামূলক অধ্যয়ন {#research-in-web3} + +এটি web3-তে করা ব্যবহারকারী গবেষণার একটি সংকলিত তালিকা যা ডিজাইন এবং পণ্য সংক্রান্ত সিদ্ধান্তে সাহায্য করতে পারে অথবা নিজের অধ্যয়ন পরিচালনা করার জন্য অনুপ্রেরণা হিসাবে কাজ করতে পারে। + +| ফোকাসের ক্ষেত্র | নাম | +| :------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| ক্রিপ্টো অনবোর্ডিং | [The Reown Pulse 2024: ক্রিপ্টো গ্রাহকের অনুভূতি এবং ব্যবহার](https://reown.com/blog/unveiling-walletconnects-consumer-crypto-report) | +| ক্রিপ্টো অনবোর্ডিং | [CRADL: ক্রিপটোকারেন্সিতে UX](https://docs.google.com/presentation/d/1s2OPSH5sMJzxRYaJSSRTe8W2iIoZx0PseIV-WeZWD1s/edit?usp=sharing) | +| ক্রিপ্টো অনবোর্ডিং | [CRADL: ক্রিপটোকারেন্সিতে অনবোর্ডিং](https://docs.google.com/presentation/d/1R9nFuzA-R6SxaGCKhoMbE4Vxe0JxQSTiHXind3LVq_w/edit?usp=sharing) | +| ক্রিপ্টো অনবোর্ডিং | [Bitcoin UX রিপোর্ট](https://github.com/patestevao/BitcoinUX-report/blob/master/report.md) | +| ক্রিপ্টো অনবোর্ডিং | [ConSensys: বিশ্বজুড়ে Web3 ধারণা বিষয়ক অবস্থা 2023](https://consensys.io/insight-report/web3-and-crypto-global-survey-2023) | +| ক্রিপ্টো অনবোর্ডিং | [NEAR: গ্রহণযোগ্যতার দিকে যাত্রাকে ত্বরান্বিত করা](https://drive.google.com/file/d/1VuaQP4QSaQxR5ddQKTMGI0b0rWdP7uGn/view) | +| স্টেকিং | [OpenUX: Rocket Pool নোড অপারেটর UX](https://storage.googleapis.com/rocketpool/RocketPool-NodeOperator-UX-Report-Jan-2024.pdf) | +| স্টেকিং | [স্টেকিং: মূল প্রবণতা, শিক্ষণীয় বিষয় এবং পূর্বাভাস - Eth স্ট্যাকার](https://lookerstudio.google.com/u/0/reporting/cafcee00-e1af-4148-bae8-442a88ac75fa/page/p_ja2srdhh2c?s=hmbTWDh9hJo) | +| স্টেকিং | [মাল্টি অ্যাপ স্টেকিং](https://github.com/threshold-network/UX-User-Research/blob/main/Multi-App%20Staking%20\(MAS\)/iterative-user-study/MAS%20Iterative%20User%20Study.pdf) | +| DAO | [2022 DAO গবেষণা আপডেট: DAO নির্মাতাদের কী প্রয়োজন?](https://blog.aragon.org/2022-dao-research-update/) | +| DeFi | [কভারেজ পুল](https://github.com/threshold-network/UX-User-Research/tree/main/Keep%20Coverage%20Pool) | +| DeFi | [ConSensys: DeFi ব্যবহারকারী গবেষণা রিপোর্ট 2022](https://cdn2.hubspot.net/hubfs/4795067/ConsenSys%20Codefi-Defi%20User%20ResearchReport.pdf) | +| মেটাভার্স | [মেটাভার্স: ব্যবহারকারী গবেষণা রিপোর্ট](https://www.politico.com/f/?id=00000187-7685-d820-a7e7-7e85d1420000) | +| মেটাভার্স | [সাফারিতে যাওয়া: মেটাভার্সে ব্যবহারকারীদের নিয়ে গবেষণা](https://archive.devcon.org/archive/watch/6/going-on-safari-researching-users-in-the-metaverse/?tab=YouTube) (ভিডিও, 27 মিনিট) | + +## web3-এর জন্য ডিজাইন {#design-for-web3} + +- [Web3 UX ডিজাইন হ্যান্ডবুক](https://web3ux.design/) - Web3 অ্যাপ ডিজাইন করার জন্য ব্যবহারিক নির্দেশিকা +- [Web3 ডিজাইন নীতি](https://medium.com/@lyricalpolymath/web3-design-principles-f21db2f240c1) - ব্লকচেইন ভিত্তিক ডিএ্যাপস-এর জন্য UX নিয়মের একটি কাঠামো +- [ব্লকচেইন ডিজাইন নীতি](https://medium.com/design-ibm/blockchain-design-principles-599c5c067b6e) - IBM-এর ব্লকচেইন ডিজাইন দলের শেখা পাঠ +- [Neueux.com](https://neueux.com/apps) - বিভিন্ন ফিল্টারিং বিকল্প সহ ব্যবহারকারী ফ্লো-এর UI লাইব্রেরি +- [Web3-এর ব্যবহারযোগ্যতার সংকট: আপনার যা জানা দরকার!](https://www.youtube.com/watch?v=oBSXT_6YDzg) - ডেভেলপার কেন্দ্রিক প্রকল্প নির্মাণের সমস্যাগুলির উপর একটি প্যানেল আলোচনা (ভিডিও, 34 মিনিট) + +## শুরু করা {#getting-started} + +- [Web3-এর জন্য হিউরিস্টিকস](/developers/docs/design-and-ux/heuristics-for-web3/) - Web3 ইন্টারফেস ডিজাইনের জন্য 7টি হিউরিস্টিকস +- [DEX ডিজাইন সেরা অভ্যাস](/developers/docs/design-and-ux/dex-design-best-practice/) - ডিসেন্ট্রালাইজড এক্সচেঞ্জ ডিজাইন করার জন্য একটি নির্দেশিকা + +## Web3 ডিজাইন কেস স্টাডি {#design-case-studies} + +- [Deep Work Studio](https://www.deepwork.studio/case-studies) +- [OpenSea-তে একটি NFT বিক্রি করা](https://builtformars.com/case-studies/opensea) +- [ওয়ালেট UX টিয়ারডাউন: কিভাবে ওয়ালেট পরিবর্তন করা প্রয়োজন](https://www.youtube.com/watch?v=oTpuxYj8JWI&ab_channel=ETHDenver) (ভিডিও, 20 মিনিট) + +## ডিজাইন বাউন্টি {#bounties} + +- [Dework](https://app.dework.xyz/bounties) +- [Buildbox হ্যাক্যাথন](https://app.buidlbox.io/) +- [ETHGlobal হ্যাক্যাথন](https://ethglobal.com/) + +## ডিজাইন DAO এবং কমিউনিটি {#design-daos-and-communities} + +পেশাদার কমিউনিটি-চালিত সংস্থাগুলিতে জড়িত হন বা অন্যান্য সদস্যদের সাথে ডিজাইন এবং গবেষণা সম্পর্কিত বিষয় এবং প্রবণতা নিয়ে আলোচনা করার জন্য ডিজাইন গ্রুপে যোগ দিন। + +- [Vectordao.com](https://vectordao.com/) +- [Deepwork.studio](https://www.deepwork.studio/) +- [We3.co](https://we3.co/) +- [Openux.xyz](https://openux.xyz/) + +## ডিজাইন সিস্টেম এবং অন্যান্য ডিজাইন রিসোর্স {#design-systems-and-resources} + +- [Optimism ডিজাইন](https://www.figma.com/@optimism) (Figma) +- [Ethereum.org ডিজাইন সিস্টেম](https://www.figma.com/@ethdotorg) (Figma) +- [Finity, Polygon-এর একটি ডিজাইন সিস্টেম](https://www.figma.com/community/file/1073921725197233598/finity-design-system) (Figma) +- [Kleros ডিজাইন সিস্টেম](https://www.figma.com/community/file/999852250110186964/kleros-design-system) (Figma) +- [Safe ডিজাইন সিস্টেম](https://www.figma.com/community/file/1337417127407098506/safe-design-system) (Figma) +- [ENS ডিজাইন সিস্টেম](https://thorin.ens.domains/) +- [Mirror ডিজাইন সিস্টেম](https://degen-xyz.vercel.app/) + +**এই পৃষ্ঠায় তালিকাভুক্ত নিবন্ধ এবং প্রকল্পগুলি অফিসিয়াল অনুমোদন নয়**, এবং শুধুমাত্র তথ্যের উদ্দেশ্যে প্রদান করা হয়েছে। +আমরা আমাদের [তালিকাভুক্তকরণ নীতি](/contributing/design/adding-design-resources)-এর মানদণ্ডের উপর ভিত্তি করে এই পৃষ্ঠায় লিঙ্ক যুক্ত করি। আপনি যদি চান আমরা কোনো প্রকল্প/নিবন্ধ যোগ করি, তাহলে [GitHub](https://github.com/ethereum/ethereum-org-website/blob/dev/public/content/developers/docs/design-and-ux/index.md)-এ এই পৃষ্ঠাটি সম্পাদনা করুন। diff --git a/public/content/translations/bn/developers/docs/development-networks/index.md b/public/content/translations/bn/developers/docs/development-networks/index.md new file mode 100644 index 00000000000..c48e8c3e96b --- /dev/null +++ b/public/content/translations/bn/developers/docs/development-networks/index.md @@ -0,0 +1,71 @@ +--- +title: "ডেভেলপমেন্ট নেটওয়ার্ক" +description: "ডেভেলপমেন্ট নেটওয়ার্ক এবং ইথেরিয়াম অ্যাপ্লিকেশন তৈরিতে সাহায্য করার জন্য উপলব্ধ টুলগুলির একটি ওভারভিউ।" +lang: bn +--- + +স্মার্ট কন্ট্র্যাক্ট সহ একটি ইথেরিয়াম অ্যাপ্লিকেশন তৈরি করার সময়, আপনি এটিকে ডিপ্লয় করার আগে এটি কীভাবে কাজ করে তা দেখার জন্য একটি স্থানীয় নেটওয়ার্কে চালাতে চাইবেন। + +ওয়েব ডেভেলপমেন্টের জন্য আপনি আপনার কম্পিউটারে যেভাবে একটি স্থানীয় সার্ভার চালাতে পারেন, সেভাবেই আপনার dapp পরীক্ষা করার জন্য একটি স্থানীয় ব্লকচেইন ইনস্ট্যান্স তৈরি করতে আপনি একটি ডেভেলপমেন্ট নেটওয়ার্ক ব্যবহার করতে পারেন। এই ইথেরিয়াম ডেভেলপমেন্ট নেটওয়ার্কগুলি এমন বৈশিষ্ট্য সরবরাহ করে যা একটি পাবলিক টেস্টনেটের চেয়ে অনেক দ্রুত পুনরাবৃত্তির অনুমতি দেয় (উদাহরণস্বরূপ আপনাকে টেস্টনেট ফসেট থেকে ETH অর্জন করার সাথে ডিল করতে হবে না)। + +## পূর্বশর্ত {#prerequisites} + +ডেভেলপমেন্ট নেটওয়ার্কে প্রবেশ করার আগে আপনার [ইথেরিয়াম স্ট্যাকের মূল বিষয়গুলি](/developers/docs/ethereum-stack/) এবং [ইথেরিয়াম নেটওয়ার্কগুলি](/developers/docs/networks/) বোঝা উচিত। + +## একটি ডেভেলপমেন্ট নেটওয়ার্ক কী? {#what-is-a-development-network} + +ডেভেলপমেন্ট নেটওয়ার্কগুলি মূলত ইথেরিয়াম ক্লায়েন্ট (ইথেরিয়ামের বাস্তবায়ন) যা বিশেষত স্থানীয় ডেভেলপমেন্টের জন্য ডিজাইন করা হয়েছে। + +**কেন শুধু স্থানীয়ভাবে একটি স্ট্যান্ডার্ড ইথেরিয়াম নোড চালাবেন না?** + +আপনি _পারেন_ [একটি নোড চালাতে](/developers/docs/nodes-and-clients/#running-your-own-node) কিন্তু যেহেতু ডেভেলপমেন্ট নেটওয়ার্কগুলি ডেভেলপমেন্টের জন্য উদ্দেশ্য-নির্মিত, তাই তারা প্রায়শই সুবিধাজনক বৈশিষ্ট্য সহ আসে যেমন: + +- আপনার স্থানীয় ব্লকচেইনকে ডেটা দিয়ে নির্ণায়কভাবে সীড করা (যেমন, ETH ব্যালেন্স সহ অ্যাকাউন্ট)। +- এটি প্রাপ্ত প্রতিটি ট্রানজ্যাকশনের সাথে সাথে, ক্রমানুসারে এবং কোনো বিলম্ব ছাড়াই ব্লক তৈরি করা +- উন্নত ডিবাগিং এবং লগিং কার্যকারিতা + +## উপলব্ধ টুলস {#available-projects} + +**নোট**: বেশিরভাগ [ডেভেলপমেন্ট ফ্রেমওয়ার্ক](/developers/docs/frameworks/) একটি অন্তর্নির্মিত ডেভেলপমেন্ট নেটওয়ার্ক অন্তর্ভুক্ত করে। আপনার [স্থানীয় ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করতে](/developers/local-environment/) আমরা একটি ফ্রেমওয়ার্ক দিয়ে শুরু করার পরামর্শ দিই। + +### Hardhat নেটওয়ার্ক {#hardhat-network} + +ডেভেলপমেন্টের জন্য ডিজাইন করা একটি স্থানীয় ইথেরিয়াম নেটওয়ার্ক। এটি আপনাকে আপনার কন্ট্র্যাক্ট ডিপ্লয় করতে, আপনার পরীক্ষা চালাতে এবং আপনার কোড ডিবাগ করতে দেয়। + +Hardhat নেটওয়ার্ক Hardhat-এর সাথে বিল্ট-ইন আসে, যা পেশাদারদের জন্য একটি ইথেরিয়াম ডেভেলপমেন্ট এনভায়রনমেন্ট। + +- [ওয়েবসাইট](https://hardhat.org/) +- [GitHub](https://github.com/NomicFoundation/hardhat) + +### স্থানীয় বিকন চেইন {#local-beacon-chains} + +কিছু কনসেন্সাস ক্লায়েন্টের পরীক্ষার উদ্দেশ্যে স্থানীয় বিকন চেইন চালু করার জন্য অন্তর্নির্মিত টুলস রয়েছে। Lighthouse, Nimbus এবং Lodestar-এর জন্য নির্দেশাবলী উপলব্ধ আছে: + +- [Lodestar ব্যবহার করে স্থানীয় টেস্টনেট](https://chainsafe.github.io/lodestar/contribution/advanced-topics/setting-up-a-testnet#post-merge-local-testnet/) +- [Lighthouse ব্যবহার করে স্থানীয় টেস্টনেট](https://lighthouse-book.sigmaprime.io/setup.html#local-testnets) + +### পাবলিক ইথেরিয়াম টেস্ট-চেইন {#public-beacon-testchains} + +ইথেরিয়ামের দুটি রক্ষণাবেক্ষণ করা পাবলিক টেস্ট ইমপ্লিমেন্টেশনও রয়েছে: Sepolia এবং Hoodi। দীর্ঘমেয়াদী সাপোর্ট সহ প্রস্তাবিত টেস্টনেট হলো Hoodi, যেখানে যে কেউ ভ্যালিডেট করতে স্বাধীন। Sepolia একটি অনুমতিপ্রাপ্ত ভ্যালিডেটর সেট ব্যবহার করে, যার অর্থ এই টেস্টনেটে নতুন ভ্যালিডেটরদের জন্য কোনো সাধারণ অ্যাক্সেস নেই। + +- [Hoodi স্টেকিং লঞ্চপ্যাড](https://hoodi.launchpad.ethereum.org/) + +### Kurtosis ইথেরিয়াম প্যাকেজ {#kurtosis} + +Kurtosis হলো মাল্টি-কন্টেইনার টেস্ট এনভায়রনমেন্টের জন্য একটি বিল্ড সিস্টেম যা ডেভেলপারদের স্থানীয়ভাবে ব্লকচেইন নেটওয়ার্কের পুনরুৎপাদনযোগ্য ইনস্ট্যান্স চালু করতে সক্ষম করে। + +ইথেরিয়াম Kurtosis প্যাকেজটি Docker বা Kubernetes-এর উপর একটি প্যারামিটারাইজযোগ্য, অত্যন্ত স্কেলেবল এবং ব্যক্তিগত ইথেরিয়াম টেস্টনেটকে দ্রুত ইনস্ট্যান্টিয়েট করতে ব্যবহার করা যেতে পারে। প্যাকেজটি সমস্ত প্রধান এক্সিকিউশন লেয়ার (EL) এবং কনসেন্সাস লেয়ার (CL) ক্লায়েন্টদের সাপোর্ট করে। Kurtosis সুন্দরভাবে ইথেরিয়াম কোর ইনফ্রাস্ট্রাকচার সম্পর্কিত ভ্যালিডেশন এবং টেস্টিং ওয়ার্কফ্লোতে ব্যবহারের জন্য একটি প্রতিনিধিত্বকারী নেটওয়ার্কের জন্য সমস্ত স্থানীয় পোর্ট ম্যাপিং এবং পরিষেবা সংযোগগুলি পরিচালনা করে। + +- [ইথেরিয়াম নেটওয়ার্ক প্যাকেজ](https://github.com/kurtosis-tech/ethereum-package) +- [ওয়েবসাইট](https://www.kurtosis.com/) +- [GitHub](https://github.com/kurtosis-tech/kurtosis) +- [নথিপত্র](https://docs.kurtosis.com/) + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [ডেভেলপমেন্ট ফ্রেমওয়ার্ক](/developers/docs/frameworks/) +- [একটি স্থানীয় ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করুন](/developers/local-environment/) diff --git a/public/content/translations/bn/developers/docs/ethereum-stack/index.md b/public/content/translations/bn/developers/docs/ethereum-stack/index.md new file mode 100644 index 00000000000..8e68181c133 --- /dev/null +++ b/public/content/translations/bn/developers/docs/ethereum-stack/index.md @@ -0,0 +1,61 @@ +--- +title: "Ethereum স্ট্যাকের ভূমিকা" +description: "Ethereum স্ট্যাকের বিভিন্ন লেয়ার এবং কীভাবে সেগুলি একসাথে ফিট করে তার একটি ওয়াকথ্রু।" +lang: bn +--- + +যেকোনও সফটওয়্যার স্ট্যাকের মতোই, আপনার লক্ষ্যের উপর নির্ভর করে সম্পূর্ণ "Ethereum স্ট্যাক" প্রজেক্ট থেকে প্রজেক্টে ভিন্ন হবে। + +তবে, Ethereum-এর মূল উপাদান রয়েছে যা সফটওয়্যার অ্যাপ্লিকেশনগুলি কীভাবে Ethereum ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করে তার জন্য একটি মানসিক মডেল প্রদান করতে সহায়তা করে। স্ট্যাকের লেয়ারগুলি বোঝা আপনাকে সেই বিভিন্ন উপায়গুলি বুঝতে সাহায্য করবে যার মাধ্যমে Ethereum সফ্টওয়্যার প্রজেক্টগুলিতে একত্রিত করা যেতে পারে। + +## স্তর 1: Ethereum ভার্চুয়াল মেশিন {#ethereum-virtual-machine} + +[Ethereum ভার্চুয়াল মেশিন (EVM)](/developers/docs/evm/) হলো Ethereum-এ স্মার্ট কন্ট্র্যাক্টের জন্য রানটাইম এনভায়রনমেন্ট। Ethereum ব্লকচেইনের সমস্ত স্মার্ট কন্ট্র্যাক্ট এবং অবস্থার পরিবর্তন [ট্রানজ্যাকশন](/developers/docs/transactions/) দ্বারা নির্বাহ করা হয়। EVM, Ethereum নেটওয়ার্কের সমস্ত ট্রানজ্যাকশন প্রসেসিং পরিচালনা করে। + +যেকোনো ভার্চুয়াল মেশিনের মতোই, EVM এক্সিকিউটিং কোড এবং এক্সিকিউটিং মেশিন (একটি Ethereum নোড) এর মধ্যে একটি অ্যাবস্ট্র্যাকশন লেভেল তৈরি করে। বর্তমানে, EVM বিশ্বজুড়ে বিতরণ করা হাজার হাজার নোডে চলছে। + +ভিতরে ভিতরে, EVM নির্দিষ্ট কাজ সম্পাদন করার জন্য অপকোড নির্দেশাবলীর একটি সেট ব্যবহার করে। এই (140টি অনন্য) অপকোডগুলি EVM-কে [Turing-complete](https://en.wikipedia.org/wiki/Turing_completeness) হতে দেয়, যার মানে হল পর্যাপ্ত রিসোর্স থাকলে EVM প্রায় যেকোনো কিছু গণনা করতে সক্ষম। + +একজন ডিএ্যাপ ডেভেলপার হিসেবে, আপনার EVM সম্পর্কে এর অস্তিত্ব এবং এটি ডাউনটাইম ছাড়াই নির্ভরযোগ্যভাবে Ethereum-এর সমস্ত অ্যাপ্লিকেশনকে শক্তি জোগায়, এর বাইরে খুব বেশি কিছু জানার দরকার নেই। + +## স্তর 2: স্মার্ট কন্ট্র্যাক্ট {#smart-contracts} + +[স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) হলো এক্সিকিউটেবল প্রোগ্রাম যা Ethereum ব্লকচেইনে চলে। + +স্মার্ট কন্ট্র্যাক্টগুলি নির্দিষ্ট [প্রোগ্রামিং ভাষা](/developers/docs/smart-contracts/languages/) ব্যবহার করে লেখা হয় যা EVM বাইটকোডে (অপকোড নামক নিম্ন-স্তরের মেশিন নির্দেশাবলী) কম্পাইল হয়। + +স্মার্ট কন্ট্র্যাক্টগুলি কেবল ওপেন সোর্স লাইব্রেরি হিসেবেই কাজ করে না, তারা মূলত ওপেন API পরিষেবা যা সর্বদা চালু থাকে এবং বন্ধ করা যায় না। স্মার্ট কন্ট্র্যাক্টগুলি পাবলিক ফাংশন সরবরাহ করে যার সাথে ব্যবহারকারী এবং অ্যাপ্লিকেশনগুলি ([ডিএ্যাপস](/developers/docs/dapps/)) অনুমতি ছাড়াই ইন্টারঅ্যাক্ট করতে পারে। যেকোনো অ্যাপ্লিকেশন ফাংশনালিটি কম্পোজ করার জন্য ডিপ্লয় করা স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টিগ্রেট করতে পারে, যেমন [ডেটা ফিড](/developers/docs/oracles/) যোগ করা বা টোকেন সোয়াপ সমর্থন করা। এছাড়াও, যে কেউ তাদের অ্যাপ্লিকেশনের প্রয়োজন মেটাতে কাস্টম ফাংশনালিটি যোগ করার জন্য Ethereum-এ নতুন স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করতে পারে। + +একজন ডিএ্যাপ ডেভেলপার হিসেবে, আপনি যদি Ethereum ব্লকচেইনে কাস্টম ফাংশনালিটি যোগ করতে চান তবেই আপনাকে স্মার্ট কন্ট্র্যাক্ট লিখতে হবে। আপনি হয়তো দেখবেন যে আপনি শুধুমাত্র বিদ্যমান স্মার্ট কন্ট্র্যাক্টগুলির সাথে ইন্টিগ্রেট করেই আপনার প্রজেক্টের বেশিরভাগ বা সমস্ত প্রয়োজন পূরণ করতে পারেন, উদাহরণস্বরূপ যদি আপনি স্টেবলকয়েনে পেমেন্ট সমর্থন করতে চান বা টোকেনের ডিসেন্ট্রালাইজড এক্সচেঞ্জ সক্ষম করতে চান। + +## স্তর 3: Ethereum নোড {#ethereum-nodes} + +একটি অ্যাপ্লিকেশনের Ethereum ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করার জন্য, এটিকে অবশ্যই একটি [Ethereum নোডের](/developers/docs/nodes-and-clients/) সাথে সংযোগ স্থাপন করতে হবে। একটি নোডের সাথে সংযোগ স্থাপন করলে আপনি ব্লকচেইন ডেটা পড়তে এবং/অথবা নেটওয়ার্কে ট্রানজ্যাকশন পাঠাতে পারবেন। + +Ethereum নোড হলো সফটওয়্যার চালিত কম্পিউটার - একটি Ethereum ক্লায়েন্ট। একটি ক্লায়েন্ট হলো Ethereum-এর একটি বাস্তবায়ন যা প্রতিটি ব্লকের সমস্ত ট্রানজ্যাকশন যাচাই করে, নেটওয়ার্ককে সুরক্ষিত এবং ডেটাকে নির্ভুল রাখে। **Ethereum নোডগুলিই হলো Ethereum ব্লকচেইন**। তারা সম্মিলিতভাবে Ethereum ব্লকচেইনের অবস্থা সংরক্ষণ করে এবং ব্লকচেইনের অবস্থা পরিবর্তন করার জন্য ট্রানজ্যাকশনের উপর কনসেন্সাসে পৌঁছায়। + +আপনার অ্যাপ্লিকেশনটিকে একটি Ethereum নোডের সাথে ([JSON-RPC API](/developers/docs/apis/json-rpc/) এর মাধ্যমে) সংযোগ করে, আপনার অ্যাপ্লিকেশনটি ব্লকচেইন থেকে ডেটা পড়তে (যেমন ব্যবহারকারী অ্যাকাউন্টের ব্যালেন্স) এবং নেটওয়ার্কে নতুন ট্রানজ্যাকশন ব্রডকাস্ট করতে (যেমন ব্যবহারকারী অ্যাকাউন্টগুলির মধ্যে ETH স্থানান্তর করা বা স্মার্ট কন্ট্র্যাক্টের ফাংশনগুলি এক্সিকিউট করা) সক্ষম হয়। + +## স্তর 4: Ethereum ক্লায়েন্ট API {#ethereum-client-apis} + +অনেক সুবিধাজনক লাইব্রেরি (Ethereum-এর ওপেন সোর্স কমিউনিটি দ্বারা নির্মিত এবং রক্ষণাবেক্ষণ করা) আপনার অ্যাপ্লিকেশনগুলিকে Ethereum ব্লকচেইনের সাথে সংযোগ স্থাপন এবং যোগাযোগ করতে দেয়। + +যদি আপনার ব্যবহারকারী-মুখী অ্যাপ্লিকেশনটি একটি ওয়েব অ্যাপ হয়, আপনি সরাসরি আপনার ফ্রন্টএন্ডে একটি [JavaScript API](/developers/docs/apis/javascript/) `npm install` করতে পারেন। অথবা হয়তো আপনি একটি [Python](/developers/docs/programming-languages/python/) বা [Java](/developers/docs/programming-languages/java/) API ব্যবহার করে এই ফাংশনালিটি সার্ভার-সাইডে বাস্তবায়ন করতে পছন্দ করবেন। + +যদিও এই API-গুলি স্ট্যাকের একটি অপরিহার্য অংশ নয়, তবে তারা সরাসরি একটি Ethereum নোডের সাথে ইন্টারঅ্যাক্ট করার অনেক জটিলতাকে অ্যাবস্ট্রাক্ট করে। তারা ইউটিলিটি ফাংশনও (যেমন, ETH-কে Gwei-তে রূপান্তর করা) সরবরাহ করে, তাই একজন ডেভেলপার হিসেবে আপনি Ethereum ক্লায়েন্টের জটিলতা নিয়ে কম সময় ব্যয় করতে পারেন এবং আপনার অ্যাপ্লিকেশনের নির্দিষ্ট ফাংশনালিটির উপর বেশি সময় মনোযোগ দিতে পারেন। + +## স্তর 5: এন্ড-ইউজার অ্যাপ্লিকেশন {#end-user-applications} + +স্ট্যাকের সর্বোচ্চ স্তরে রয়েছে ব্যবহারকারী-মুখী অ্যাপ্লিকেশন। এগুলি হলো স্ট্যান্ডার্ড অ্যাপ্লিকেশন যা আপনি আজ নিয়মিত ব্যবহার করেন এবং তৈরি করেন: প্রাথমিকভাবে ওয়েব এবং মোবাইল অ্যাপ। + +আপনি যেভাবে এই ইউজার ইন্টারফেসগুলি ডেভেলপ করেন তা মূলত অপরিবর্তিত থাকে। প্রায়শই ব্যবহারকারীদের জানার প্রয়োজন হবে না যে তারা যে অ্যাপ্লিকেশনটি ব্যবহার করছে তা একটি ব্লকচেইন ব্যবহার করে তৈরি করা হয়েছে। + +## আপনার স্ট্যাক বেছে নিতে প্রস্তুত? {#ready-to-choose-your-stack} + +আপনার Ethereum অ্যাপ্লিকেশনের জন্য একটি [লোকাল ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ](/developers/local-environment/) করতে আমাদের গাইডটি দেখুন। + +## আরও পড়ুন {#further-reading} + +- [একটি ওয়েব 3.0 অ্যাপ্লিকেশনের আর্কিটেকচার](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _প্রীতি কাসিরেড্ডি_ + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/evm/index.md b/public/content/translations/bn/developers/docs/evm/index.md new file mode 100644 index 00000000000..91ff30ed91d --- /dev/null +++ b/public/content/translations/bn/developers/docs/evm/index.md @@ -0,0 +1,88 @@ +--- +title: "ইথেরিয়াম ভার্চুয়াল মেশিন (EVM)" +description: "ইথেরিয়াম ভার্চুয়াল মেশিনের একটি পরিচিতি এবং এটি কীভাবে স্টেট, ট্রানজ্যাকশন এবং স্মার্ট কন্ট্র্যাক্টের সাথে সম্পর্কিত।" +lang: bn +--- + +ইথেরিয়াম ভার্চুয়াল মেশিন (EVM) একটি বিকেন্দ্রীভূত ভার্চুয়াল এনভায়রনমেন্ট যা সমস্ত Ethereum নোড জুড়ে ধারাবাহিকভাবে এবং সুরক্ষিতভাবে কোড এক্সিকিউট করে। নোডগুলি স্মার্ট কন্ট্র্যাক্ট এক্সিকিউট করার জন্য EVM চালায়, "[gas](/developers/docs/gas/)" ব্যবহার করে [অপারেশনগুলির](/developers/docs/evm/opcodes/) জন্য প্রয়োজনীয় কম্পিউটেশনাল প্রচেষ্টা পরিমাপ করে, যা কার্যকর রিসোর্স বরাদ্দ এবং নেটওয়ার্ক নিরাপত্তা নিশ্চিত করে। + +## পূর্বশর্ত {#prerequisites} + +EVM বোঝার জন্য কম্পিউটার সায়েন্সের কিছু সাধারণ পরিভাষা যেমন [bytes](https://wikipedia.org/wiki/Byte), [memory](https://wikipedia.org/wiki/Computer_memory), এবং একটি [stack](https://wikipedia.org/wiki/Stack_\(abstract_data_type\)) এর সাথে প্রাথমিক পরিচিতি থাকা প্রয়োজন। ক্রিপ্টোগ্রাফি/ব্লকচেইন ধারণা যেমন [hash functions](https://wikipedia.org/wiki/Cryptographic_hash_function) এবং [Merkle tree](https://wikipedia.org/wiki/Merkle_tree) এর সাথে পরিচিতি থাকলেও সহায়ক হবে। + +## লেজার থেকে স্টেট মেশিন {#from-ledger-to-state-machine} + +Bitcoin-এর মতো ব্লকচেইন বর্ণনা করার জন্য প্রায়শই 'ডিস্ট্রিবিউটেড লেজার'-এর উপমা ব্যবহার করা হয়, যা ক্রিপ্টোগ্রাফির মৌলিক টুলস ব্যবহার করে একটি বিকেন্দ্রীভূত কারেন্সি সক্ষম করে। লেজারটি কার্যকলাপের একটি রেকর্ড বজায় রাখে যা একটি নির্দিষ্ট নিয়মাবলীর সেটকে মেনে চলে, যা নির্ধারণ করে যে কেউ লেজারটি পরিবর্তন করার জন্য কী করতে পারে এবং কী করতে পারে না। উদাহরণস্বরূপ, একটি Bitcoin অ্যাড্রেস আগে যা পেয়েছে তার থেকে বেশি Bitcoin খরচ করতে পারে না। এই নিয়মগুলি Bitcoin এবং অন্যান্য অনেক ব্লকচেইনের সমস্ত ট্রানজ্যাকশনের ভিত্তি। + +যদিও Ethereum-এর নিজস্ব নেটিভ ক্রিপটোকারেন্সি (ইথার) আছে যা প্রায় একই স্বজ্ঞাত নিয়মগুলি অনুসরণ করে, এটি একটি অনেক বেশি শক্তিশালী ফাংশনও সক্ষম করে: [smart contracts](/developers/docs/smart-contracts/)। এই আরও জটিল বৈশিষ্ট্যের জন্য, একটি আরও পরিশীলিত উপমার প্রয়োজন। ডিস্ট্রিবিউটেড লেজারের পরিবর্তে, Ethereum একটি ডিস্ট্রিবিউটেড [state machine](https://wikipedia.org/wiki/Finite-state_machine)। Ethereum-এর স্টেট হল একটি বিশাল ডেটা স্ট্রাকচার যা শুধুমাত্র সমস্ত অ্যাকাউন্ট এবং ব্যালেন্সই ধরে রাখে না, বরং একটি _মেশিন স্টেট_ ধারণ করে, যা একটি পূর্ব-নির্ধারিত নিয়মাবলীর সেট অনুযায়ী ব্লক থেকে ব্লকে পরিবর্তন হতে পারে, এবং যা ইচ্ছামত মেশিন কোড এক্সিকিউট করতে পারে। ব্লক থেকে ব্লকে স্টেট পরিবর্তনের নির্দিষ্ট নিয়মগুলি EVM দ্বারা সংজ্ঞায়িত হয়। + +![EVM-এর গঠন দেখানো একটি ডায়াগ্রাম](./evm.png) +_[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf) থেকে অভিযোজিত ডায়াগ্রাম_ + +## Ethereum স্টেট ট্রানজিশন ফাংশন {#the-ethereum-state-transition-function} + +EVM একটি গাণিতিক ফাংশনের মতো আচরণ করে: একটি ইনপুট দিলে, এটি একটি ডিটারমিনিস্টিক আউটপুট তৈরি করে। অতএব, Ethereum-কে আরও আনুষ্ঠানিকভাবে একটি **স্টেট ট্রানজিশন ফাংশন** হিসেবে বর্ণনা করা বেশ সহায়ক: + +``` +Y(S, T)= S' +``` + +একটি পুরানো বৈধ স্টেট `(S)` এবং নতুন বৈধ ট্রানজ্যাকশনের সেট `(T)` দেওয়া হলে, Ethereum স্টেট ট্রানজিশন ফাংশন `Y(S, T)` একটি নতুন বৈধ আউটপুট স্টেট `S'` তৈরি করে। + +### স্টেট {#state} + +Ethereum-এর প্রসঙ্গে, স্টেট হল একটি বিশাল ডেটা স্ট্রাকচার যা [modified Merkle Patricia Trie](/developers/docs/data-structures-and-encoding/patricia-merkle-trie/) নামে পরিচিত, যা সমস্ত [অ্যাকাউন্টকে](/developers/docs/accounts/) হ্যাসের মাধ্যমে লিঙ্ক করে রাখে এবং ব্লকচেইনে সংরক্ষিত একটি একক রুট হ্যাসে পরিণত করা যায়। + +### লেনদেন {#transactions} + +লেনদেন হল অ্যাকাউন্ট থেকে ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত নির্দেশাবলী। দুই ধরনের ট্রানজ্যাকশন আছে: যেগুলি মেসেজ কলের ফলে হয় এবং যেগুলি কন্ট্র্যাক্ট তৈরির ফলে হয়। + +কন্ট্র্যাক্ট তৈরির ফলে একটি নতুন কন্ট্র্যাক্ট অ্যাকাউন্ট তৈরি হয়, যেখানে কম্পাইল করা [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/anatomy/) বাইটকোড থাকে। যখনই অন্য কোনো অ্যাকাউন্ট সেই কন্ট্র্যাক্টে মেসেজ কল করে, তখন এটি তার বাইটকোড এক্সিকিউট করে। + +## EVM নির্দেশাবলী {#evm-instructions} + +EVM একটি 1024 আইটেমের ডেপথ সহ [স্ট্যাক মেশিন](https://wikipedia.org/wiki/Stack_machine) হিসাবে এক্সিকিউট করে। প্রতিটি আইটেম একটি 256-বিটের শব্দ, যা 256-বিট ক্রিপ্টোগ্রাফি (যেমন Keccak-256 হ্যাস বা secp256k1 সিগনেচার) এর সাথে ব্যবহারের সুবিধার জন্য বেছে নেওয়া হয়েছিল। + +এক্সিকিউশনের সময়, EVM একটি ক্ষণস্থায়ী _মেমরি_ (একটি শব্দ-অ্যাড্রেসড বাইট অ্যারে হিসাবে) বজায় রাখে, যা ট্রানজ্যাকশনের মধ্যে স্থায়ী হয় না। + +### ক্ষণস্থায়ী স্টোরেজ + +ক্ষণস্থায়ী স্টোরেজ হল একটি প্রতি-ট্রানজ্যাকশন কী-ভ্যালু স্টোর যা `TSTORE` এবং `TLOAD` অপকোডের মাধ্যমে অ্যাক্সেস করা হয়। এটি একই ট্রানজ্যাকশনের সময় সমস্ত অভ্যন্তরীণ কলের মধ্যে স্থায়ী হয় কিন্তু ট্রানজ্যাকশনের শেষে মুছে যায়। মেমরির মতো নয়, ক্ষণস্থায়ী স্টোরেজ এক্সিকিউশন ফ্রেমের পরিবর্তে EVM স্টেটের অংশ হিসাবে মডেল করা হয়, তবুও এটি গ্লোবাল স্টেটে প্রতিশ্রুতিবদ্ধ নয়। ক্ষণস্থায়ী স্টোরেজ একটি ট্রানজ্যাকশনের সময় অভ্যন্তরীণ কলের মধ্যে গ্যাস-সাশ্রয়ী অস্থায়ী স্টেট শেয়ারিং সক্ষম করে। + +### সংগ্রহস্থল + +কন্ট্র্যাক্টে একটি Merkle Patricia _স্টোরেজ_ ট্রাই (একটি শব্দ-অ্যাড্রেসযোগ্য শব্দ অ্যারে হিসাবে) থাকে, যা সংশ্লিষ্ট অ্যাকাউন্টের সাথে যুক্ত এবং গ্লোবাল স্টেটের অংশ। এই স্থায়ী স্টোরেজ ক্ষণস্থায়ী স্টোরেজ থেকে আলাদা, যা শুধুমাত্র একটি একক ট্রানজ্যাকশনের সময়কালের জন্য উপলব্ধ এবং অ্যাকাউন্টের স্থায়ী স্টোরেজ ট্রাই-এর অংশ গঠন করে না। + +### Opcodes + +কম্পাইল করা স্মার্ট কন্ট্র্যাক্ট বাইটকোড একাধিক EVM [opcodes](/developers/docs/evm/opcodes) হিসাবে এক্সিকিউট হয়, যা `XOR`, `AND`, `ADD`, `SUB` ইত্যাদির মতো স্ট্যান্ডার্ড স্ট্যাক অপারেশন সম্পাদন করে। EVM এছাড়াও `ADDRESS`, `BALANCE`, `BLOCKHASH` ইত্যাদির মতো বেশ কিছু ব্লকচেইন-নির্দিষ্ট স্ট্যাক অপারেশন প্রয়োগ করে। অপকোড সেটে `TSTORE` এবং `TLOAD` অন্তর্ভুক্ত রয়েছে, যা ক্ষণস্থায়ী স্টোরেজে অ্যাক্সেস প্রদান করে। + +![EVM অপারেশনের জন্য কোথায় গ্যাসের প্রয়োজন হয় তা দেখানো একটি ডায়াগ্রাম](../gas/gas.png) +_[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf) থেকে অভিযোজিত ডায়াগ্রাম_ + +## EVM ইমপ্লিমেন্টেশন {#evm-implementations} + +EVM-এর সমস্ত ইমপ্লিমেন্টেশনকে অবশ্যই Ethereum Yellowpaper-এ বর্ণিত স্পেসিফিকেশন মেনে চলতে হবে। + +Ethereum-এর দশ বছরের ইতিহাসে, EVM-এর বেশ কিছু সংশোধন হয়েছে, এবং বিভিন্ন প্রোগ্রামিং ভাষায় EVM-এর বেশ কিছু ইমপ্লিমেন্টেশন রয়েছে। + +[Ethereum এক্সিকিউশন ক্লায়েন্টগুলিতে](/developers/docs/nodes-and-clients/#execution-clients) একটি EVM ইমপ্লিমেন্টেশন অন্তর্ভুক্ত থাকে। এছাড়াও, একাধিক স্বতন্ত্র ইমপ্লিমেন্টেশন রয়েছে, যার মধ্যে রয়েছে: + +- [Py-EVM](https://github.com/ethereum/py-evm) - _Python_ +- [evmone](https://github.com/ethereum/evmone) - _C++_ +- [ethereumjs-vm](https://github.com/ethereumjs/ethereumjs-vm) - _JavaScript_ +- [revm](https://github.com/bluealloy/revm) - _Rust_ + +## আরও পড়ুন {#further-reading} + +- [Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf) +- [Jellopaper ওরফে KEVM: K-তে EVM-এর সেম্যান্টিক্স](https://jellopaper.org/) +- [The Beigepaper](https://github.com/chronaeon/beigepaper) +- [Ethereum ভার্চুয়াল মেশিন অপকোড](https://www.ethervm.io/) +- [Ethereum ভার্চুয়াল মেশিন অপকোড ইন্টারঅ্যাক্টিভ রেফারেন্স](https://www.evm.codes/) +- [Solidity-র ডকুমেন্টেশনে একটি সংক্ষিপ্ত পরিচিতি](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#index-6) +- [মাস্টারিং Ethereum - দি Ethereum ভার্চুয়াল মেশিন](https://github.com/ethereumbook/ethereumbook/blob/openedition/13evm.asciidoc) + +## সম্পর্কিত বিষয় {#related-topics} + +- [গ্যাস](/developers/docs/gas/) diff --git a/public/content/translations/bn/developers/docs/evm/opcodes/index.md b/public/content/translations/bn/developers/docs/evm/opcodes/index.md new file mode 100644 index 00000000000..9740ce20db4 --- /dev/null +++ b/public/content/translations/bn/developers/docs/evm/opcodes/index.md @@ -0,0 +1,177 @@ +--- +title: "EVM-এর জন্য অপকোডসমূহ" +description: "ইথেরিয়াম ভার্চুয়াল মেশিনের জন্য উপলব্ধ সমস্ত অপকোডের একটি তালিকা।" +lang: bn +--- + +## একনজরে {#overview} + +এটি [wolflo/evm-opcodes](https://github.com/wolflo/evm-opcodes)-এ EVM রেফারেন্স পেজের একটি আপডেট করা সংস্করণ। +এছাড়াও এটি [ইয়োলো পেপার](https://ethereum.github.io/yellowpaper/paper.pdf), [জেলো পেপার](https://jellopaper.org/evm/), এবং [geth](https://github.com/ethereum/go-ethereum) ইমপ্লিমেন্টেশন থেকে নেওয়া হয়েছে। +এটি একটি সহজলভ্য রেফারেন্স হিসেবে তৈরি করা হয়েছে, তবে এটি বিশেষভাবে কঠোর নয়। +আপনি যদি সঠিকতার ব্যাপারে নিশ্চিত হতে চান এবং প্রতিটি এজ কেস সম্পর্কে অবগত থাকতে চান, তবে জেলো পেপার বা ক্লায়েন্ট ইমপ্লিমেন্টেশন ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। + +একটি ইন্টারেক্টিভ রেফারেন্স খুঁজছেন? [evm.codes](https://www.evm.codes/) দেখুন। + +ডাইনামিক গ্যাস খরচের অপারেশনগুলোর জন্য, [gas.md](https://github.com/wolflo/evm-opcodes/blob/main/gas.md) দেখুন। + +💡 দ্রুত টিপ: সম্পূর্ণ লাইন দেখতে, ডেস্কটপে অনুভূমিকভাবে স্ক্রল করার জন্য `[shift] + scroll` ব্যবহার করুন। + +| স্ট্যাক | নাম | গ্যাস | প্রাথমিক স্ট্যাক | ফলাফল স্ট্যাক | Mem / সংগ্রহস্থল | নোট | | +| :-----: | :------------- | :---------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | +| 00 | STOP | 0 | | | | এক্সিকিউশন থামিয়ে দিন | | +| 01 | ADD | 3 | `a, b` | `a + b` | | (u)int256 যোগ মডিউলো 2\*\*256 | | +| 02 | MUL | 5 | `a, b` | `a * b` | | (u)int256 গুণ মডিউলো 2\*\*256 | | +| 03 | SUB | 3 | `a, b` | `a - b` | | (u)int256 বিয়োগ মডিউলো 2\*\*256 | | +| 04 | DIV | 5 | `a, b` | `a // b` | | uint256 ভাগ | | +| 05 | SDIV | 5 | `a, b` | `a // b` | | int256 ভাগ | | +| 06 | MOD | 5 | `a, b` | `a % b` | | uint256 মডিউলাস | | +| 07 | SMOD | 5 | `a, b` | `a % b` | | int256 মডিউলাস | | +| 08 | ADDMOD | 8 | `a, b, N` | `(a + b) % N` | | (u)int256 যোগ মডিউলো N | | +| 09 | MULMOD | 8 | `a, b, N` | `(a * b) % N` | | (u)int256 গুণ মডিউলো N | | +| 0A | EXP | [A1](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a1-exp) | `a, b` | `a ** b` | | uint256 এক্সপোনেনশিয়েশন মডিউলো 2\*\*256 | | +| 0B | SIGNEXTEND | 5 | `b, x` | `SIGNEXTEND(x, b)` | | [sign extend](https://wikipedia.org/wiki/Sign_extension) `x`-কে `(b+1)` বাইট থেকে 32 বাইটে প্রসারিত করুন | | +| 0C-0F | _অবৈধ_ | | | | | | | +| 10 | LT | 3 | `a, b` | `a < b` | | uint256 এর থেকে ছোট | | +| 11 | GT | 3 | `a, b` | `a > b` | | uint256 এর থেকে বড় | | +| 12 | SLT | 3 | `a, b` | `a < b` | | int256 এর থেকে ছোট | | +| 13 | SGT | 3 | `a, b` | `a > b` | | int256 এর থেকে বড় | | +| 14 | EQ | 3 | `a, b` | `a == b` | | (u)int256 সমতা | | +| 15 | ISZERO | 3 | `a` | `a == 0` | | (u)int256 iszero | | +| 16 | AND | 3 | `a, b` | `a && b` | | বিটওয়াইজ AND | | +| 17 | OR | 3 | `a, b` | `a \\|\\| b` | | বিটওয়াইজ OR | | +| 18 | XOR | 3 | `a, b` | `a ^ b` | | বিটওয়াইজ XOR | | +| 19 | NOT | 3 | `a` | `~a` | | বিটওয়াইজ NOT | | +| 1A | BYTE | 3 | `i, x` | `(x >> (248 - i * 8)) && 0xFF` | | বাম দিক থেকে (u)int256 `x` এর `i`তম বাইট | | +| 1B | SHL | 3 | `shift, val` | `val << shift` | | বামে শিফট করুন | | +| 1C | SHR | 3 | `shift, val` | `val >> shift` | | লজিক্যাল শিফট রাইট | | +| 1D | SAR | 3 | `shift, val` | `val >> shift` | | অ্যারিথমেটিক শিফট রাইট | | +| 1E-1F | _অবৈধ_ | | | | | | | +| 20 | KECCAK256 | [A2](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a2-sha3) | `ost, len` | `keccak256(mem[ost:ost+len-1])` | | keccak256 | | +| 21-2F | _অবৈধ_ | | | | | | | +| 30 | ADDRESS | 2 | `.` | `address(this)` | | এক্সিকিউটিং কনট্র্যাক্টের ঠিকানা | | +| 31 | BALANCE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `addr.balance` | | ব্যালেন্স, wei-তে | | +| 32 | ORIGIN | 2 | `.` | `tx.origin` | | যে ঠিকানা থেকে tx শুরু হয়েছে | | +| 33 | CALLER | 2 | `.` | `msg.sender` | | msg প্রেরকের ঠিকানা | | +| 34 | CALLVALUE | 2 | `.` | `msg.value` | | msg ভ্যালু, wei-তে | | +| 35 | CALLDATALOAD | 3 | `idx` | `msg.data[idx:idx+32]` | | `idx` ইনডেক্সে msg ডেটা থেকে ওয়ার্ড পড়ুন | | +| 36 | CALLDATASIZE | 2 | `.` | `len(msg.data)` | | msg ডেটার দৈর্ঘ্য, বাইটে | | +| 37 | CALLDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := msg.data[ost:ost+len-1] | msg ডেটা কপি করুন | | +| 38 | CODESIZE | 2 | `.` | `len(this.code)` | | এক্সিকিউটিং কনট্র্যাক্টের কোডের দৈর্ঘ্য, বাইটে | | +| 39 | CODECOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | | mem[dstOst:dstOst+len-1] := this.code[ost:ost+len-1] | এক্সিকিউটিং কনট্র্যাক্টের বাইটকোড কপি করুন | +| 3A | GASPRICE | 2 | `.` | `tx.gasprice` | | tx-এর গ্যাস প্রাইস, প্রতি ইউনিট গ্যাসের জন্য wei-তে [\*\*](https://eips.ethereum.org/EIPS/eip-1559#gasprice) | | +| 3B | EXTCODESIZE | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `len(addr.code)` | | addr-এ কোডের সাইজ, বাইটে | | +| 3C | EXTCODECOPY | [A4](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a4-extcodecopy) | `addr, dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := addr.code[ost:ost+len-1] | `addr` থেকে কোড কপি করুন | | +| 3D | RETURNDATASIZE | 2 | `.` | `size` | | শেষ এক্সটার্নাল কল থেকে ফেরত আসা ডেটার সাইজ, বাইটে | | +| 3E | RETURNDATACOPY | [A3](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a3-copy-operations) | `dstOst, ost, len` | `.` | mem[dstOst:dstOst+len-1] := returndata[ost:ost+len-1] | শেষ এক্সটার্নাল কল থেকে ফেরত আসা ডেটা কপি করুন | | +| 3F | EXTCODEHASH | [A5](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a5-balance-extcodesize-extcodehash) | `addr` | `হ্যাস` | | হ্যাস = addr.exists ? keccak256(addr.code) : 0 | | +| 40 | BLOCKHASH | 20 | `blockNum` | `blockHash(blockNum)` | | | | +| 41 | COINBASE | 2 | `.` | `block.coinbase` | | বর্তমান ব্লকের প্রপোজারের ঠিকানা | | +| 42 | TIMESTAMP | 2 | `.` | `block.timestamp` | | বর্তমান ব্লকের টাইমস্ট্যাম্প | | +| 43 | NUMBER | 2 | `.` | `block.number` | | বর্তমান ব্লকের নম্বর | | +| 44 | PREVRANDAO | 2 | `.` | `randomness beacon` | | র‍্যান্ডমনেস বিকন | | +| 45 | GASLIMIT | 2 | `.` | `block.gaslimit` | | বর্তমান ব্লকের গ্যাস লিমিট | | +| 46 | CHAINID | 2 | `.` | `chain_id` | | বর্তমান [চেইন আইডি](https://eips.ethereum.org/EIPS/eip-155) স্ট্যাকে পুশ করুন | | +| 47 | SELFBALANCE | 5 | `.` | `address(this).balance` | | এক্সিকিউটিং কনট্র্যাক্টের ব্যালেন্স, wei-তে | | +| 48 | BASEFEE | 2 | `.` | `block.basefee` | | বর্তমান ব্লকের বেস ফি | | +| 49 | BLOBHASH | 3 | `idx` | `tx.blob_versioned_hashes[idx]` | | [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) | | +| 4A | BLOBBASEFEE | 2 | `.` | `block.blobbasefee` | | বর্তমান ব্লকের ব্লব বেস ফি ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516)) | | +| 4B-4F | _অবৈধ_ | | | | | | | +| 50 | POP | 2 | `_anon` | `.` | | স্ট্যাকের শীর্ষ থেকে আইটেম সরান এবং এটি বাতিল করুন | | +| 51 | MLOAD | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost` | `mem[ost:ost+32]` | | অফসেট `ost`-এ মেমরি থেকে ওয়ার্ড পড়ুন | | +| 52 | MSTORE | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost:ost+32] := val | মেমরিতে একটি ওয়ার্ড লিখুন | | +| 53 | MSTORE8 | 3[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, val` | `.` | mem[ost] := val && 0xFF | মেমরিতে একটি একক বাইট লিখুন | | +| 54 | SLOAD | [A6](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a6-sload) | `key` | `সংগ্রহস্থল[key]` | | সংগ্রহস্থল থেকে ওয়ার্ড পড়ুন | | +| 55 | SSTORE | [A7](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a7-sstore) | `key, val` | `.` | সংগ্রহস্থল[key] := val | সংগ্রহস্থলে ওয়ার্ড লিখুন | | +| 56 | JUMP | 8 | `dst` | `.` | | `$pc := dst` চিহ্নিত করুন যে `pc` শুধুমাত্র তখনই নির্ধারিত হবে যদি `dst` একটি বৈধ জাম্পডেস্ট হয় | | +| 57 | JUMPI | 10 | `dst, condition` | `.` | | `$pc := condition ?` dst : $pc + 1` | | +| 58 | PC | 2 | `.` | `$pc` | | প্রোগ্রাম কাউন্টার | | +| 59 | MSIZE | 2 | `.` | `len(mem)` | | বর্তমান এক্সিকিউশন কনটেক্সটে মেমরির সাইজ, বাইটে | | +| 5A | GAS | 2 | `.` | `gasRemaining` | | | | +| 5B | JUMPDEST | 1 | | | বৈধ জাম্প ডেস্টিনেশন চিহ্নিত করুন | একটি বৈধ জাম্প ডেস্টিনেশন উদাহরণস্বরূপ একটি জাম্প ডেস্টিনেশন পুশ ডেটার ভিতরে নয় | | +| 5C | TLOAD | 100 | `key` | `tstorage[key]` | | ট্রানজিয়েন্ট সংগ্রহস্থল থেকে ওয়ার্ড পড়ুন ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | | +| 5D | TSTORE | 100 | `key, val` | `.` | tstorage[key] := val | ট্রানজিয়েন্ট সংগ্রহস্থলে ওয়ার্ড লিখুন ([EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)) | | +| 5E | MCOPY | 3+3\*words+[A0](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `dstOst, ost, len` | `.` | mem[dstOst] := mem[ost:ost+len] | মেমরি এক এলাকা থেকে অন্য এলাকায় কপি করুন ([EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)) | | +| 5F | PUSH0 | 2 | `.` | `uint8` | | স্ট্যাকে ধ্রুবক মান 0 পুশ করুন | | +| 60 | PUSH1 | 3 | `.` | `uint8` | | স্ট্যাকে 1-বাইট মান পুশ করুন | | +| 61 | PUSH2 | 3 | `.` | `uint16` | | স্ট্যাকে 2-বাইট মান পুশ করুন | | +| 62 | PUSH3 | 3 | `.` | `uint24` | | স্ট্যাকে 3-বাইট মান পুশ করুন | | +| 63 | PUSH4 | 3 | `.` | `uint32` | | স্ট্যাকে 4-বাইট মান পুশ করুন | | +| 64 | PUSH5 | 3 | `.` | `uint40` | | স্ট্যাকে 5-বাইট মান পুশ করুন | | +| 65 | PUSH6 | 3 | `.` | `uint48` | | স্ট্যাকে 6-বাইট মান পুশ করুন | | +| 66 | PUSH7 | 3 | `.` | `uint56` | | স্ট্যাকে 7-বাইট মান পুশ করুন | | +| 67 | PUSH8 | 3 | `.` | `uint64` | | স্ট্যাকে 8-বাইট মান পুশ করুন | | +| 68 | PUSH9 | 3 | `.` | `uint72` | | স্ট্যাকে 9-বাইট মান পুশ করুন | | +| 69 | PUSH10 | 3 | `.` | `uint80` | | স্ট্যাকে 10-বাইট মান পুশ করুন | | +| 6A | PUSH11 | 3 | `.` | `uint88` | | স্ট্যাকে 11-বাইট মান পুশ করুন | | +| 6B | PUSH12 | 3 | `.` | `uint96` | | স্ট্যাকে 12-বাইট মান পুশ করুন | | +| 6C | PUSH13 | 3 | `.` | `uint104` | | স্ট্যাকে 13-বাইট মান পুশ করুন | | +| 6D | PUSH14 | 3 | `.` | `uint112` | | স্ট্যাকে 14-বাইট মান পুশ করুন | | +| 6E | PUSH15 | 3 | `.` | `uint120` | | স্ট্যাকে 15-বাইট মান পুশ করুন | | +| 6F | PUSH16 | 3 | `.` | `uint128` | | স্ট্যাকে 16-বাইট মান পুশ করুন | | +| 70 | PUSH17 | 3 | `.` | `uint136` | | স্ট্যাকে 17-বাইট মান পুশ করুন | | +| 71 | PUSH18 | 3 | `.` | `uint144` | | স্ট্যাকে 18-বাইট মান পুশ করুন | | +| 72 | PUSH19 | 3 | `.` | `uint152` | | স্ট্যাকে 19-বাইট মান পুশ করুন | | +| 73 | PUSH20 | 3 | `.` | `uint160` | | স্ট্যাকে 20-বাইট মান পুশ করুন | | +| 74 | PUSH21 | 3 | `.` | `uint168` | | স্ট্যাকে 21-বাইট মান পুশ করুন | | +| 75 | PUSH22 | 3 | `.` | `uint176` | | স্ট্যাকে 22-বাইট মান পুশ করুন | | +| 76 | PUSH23 | 3 | `.` | `uint184` | | স্ট্যাকে 23-বাইট মান পুশ করুন | | +| 77 | PUSH24 | 3 | `.` | `uint192` | | স্ট্যাকে 24-বাইট মান পুশ করুন | | +| 78 | PUSH25 | 3 | `.` | `uint200` | | স্ট্যাকে 25-বাইট মান পুশ করুন | | +| 79 | PUSH26 | 3 | `.` | `uint208` | | স্ট্যাকে 26-বাইট মান পুশ করুন | | +| 7A | PUSH27 | 3 | `.` | `uint216` | | স্ট্যাকে 27-বাইট মান পুশ করুন | | +| 7B | PUSH28 | 3 | `.` | `uint224` | | স্ট্যাকে 28-বাইট মান পুশ করুন | | +| 7C | PUSH29 | 3 | `.` | `uint232` | | স্ট্যাকে 29-বাইট মান পুশ করুন | | +| 7D | PUSH30 | 3 | `.` | `uint240` | | স্ট্যাকে 30-বাইট মান পুশ করুন | | +| 7E | PUSH31 | 3 | `.` | `uint248` | | স্ট্যাকে 31-বাইট মান পুশ করুন | | +| 7F | PUSH32 | 3 | `.` | `uint256` | | স্ট্যাকে 32-বাইট মান পুশ করুন | | +| 80 | DUP1 | 3 | `a` | `a, a` | | স্ট্যাকের ১ম মানটি ক্লোন করুন | | +| 81 | DUP2 | 3 | `_, a` | `a, _, a` | | স্ট্যাকের ২য় মানটি ক্লোন করুন | | +| 82 | DUP3 | 3 | `_, _, a` | `a, _, _, a` | | স্ট্যাকের ৩য় মানটি ক্লোন করুন | | +| 83 | DUP4 | 3 | `_, _, _, a` | `a, _, _, _, a` | | স্ট্যাকের ৪র্থ মানটি ক্লোন করুন | | +| 84 | DUP5 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ৫ম মানটি ক্লোন করুন | | +| 85 | DUP6 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ৬ষ্ঠ মানটি ক্লোন করুন | | +| 86 | DUP7 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ৭ম মানটি ক্লোন করুন | | +| 87 | DUP8 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ৮ম মানটি ক্লোন করুন | | +| 88 | DUP9 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ৯ম মানটি ক্লোন করুন | | +| 89 | DUP10 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ১০ম মানটি ক্লোন করুন | | +| 8A | DUP11 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ১১তম মানটি ক্লোন করুন | | +| 8B | DUP12 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ১২তম মানটি ক্লোন করুন | | +| 8C | DUP13 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ১৩তম মানটি ক্লোন করুন | | +| 8D | DUP14 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ১৪তম মানটি ক্লোন করুন | | +| 8E | DUP15 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ১৫তম মানটি ক্লোন করুন | | +| 8F | DUP16 | 3 | `..., a` | `a, ..., a` | | স্ট্যাকের ১৬তম মানটি ক্লোন করুন | | +| 90 | SWAP1 | 3 | `a, b` | `b, a` | | | | +| 91 | SWAP2 | 3 | `a, _, b` | `b, _, a` | | | | +| 92 | SWAP3 | 3 | `a, _, _, b` | `b, _, _, a` | | | | +| 93 | SWAP4 | 3 | `a, _, _, _, b` | `b, _, _, _, a` | | | | +| 94 | SWAP5 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 95 | SWAP6 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 96 | SWAP7 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 97 | SWAP8 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 98 | SWAP9 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 99 | SWAP10 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9A | SWAP11 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9B | SWAP12 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9C | SWAP13 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9D | SWAP14 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9E | SWAP15 | 3 | `a, ..., b` | `b, ..., a` | | | | +| 9F | SWAP16 | 3 | `a, ..., b` | `b, ..., a` | | | | +| A0 | LOG0 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len` | `.` | | LOG0(memory[ost:ost+len-1]) | | +| A1 | LOG1 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0` | `.` | | LOG1(memory[ost:ost+len-1], topic0) | | +| A2 | LOG2 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1` | `.` | | LOG2(memory[ost:ost+len-1], topic0, topic1) | | +| A3 | LOG3 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2` | `.` | | LOG3(memory[ost:ost+len-1], topic0, topic1, topic2) | | +| A4 | LOG4 | [A8](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a8-log-operations) | `ost, len, topic0, topic1, topic2, topic3` | `.` | | LOG4(memory[ost:ost+len-1], topic0, topic1, topic2, topic3) | | +| A5-EF | _অবৈধ_ | | | | | | | +| F0 | CREATE | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len` | `addr` | | addr = keccak256(rlp([address(this), this.nonce])) | | +| F1 | CALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | গ্যাস, addr, val, argOst, argLen, retOst, retLen | `success` | mem[retOst:retOst+retLen-1] := returndata | | | +| F2 | CALLCODE | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `গ্যাস, addr, val, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] = returndata | DELEGATECALL-এর মতোই, কিন্তু আসল msg.sender এবং msg.value প্রচার করে না | | +| F3 | RETURN | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | mem[ost:ost+len-1] রিটার্ন করুন | | +| F4 | DELEGATECALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `গ্যাস, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | | +| F5 | CREATE2 | [A9](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a9-create-operations) | `val, ost, len, salt` | `addr` | | addr = keccak256(0xff ++ address(this) ++ salt ++ keccak256(mem[ost:ost+len-1]))[12:] | | +| F6-F9 | _অবৈধ_ | | | | | | | +| FA | STATICCALL | [AA](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-call-operations) | `গ্যাস, addr, argOst, argLen, retOst, retLen` | `success` | mem[retOst:retOst+retLen-1] := returndata | | | +| FB-FC | _অবৈধ_ | | | | | | | +| FD | REVERT | 0[\*](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#a0-1-memory-expansion) | `ost, len` | `.` | | revert(mem[ost:ost+len-1]) | | +| FE | INVALID | [AF](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#af-invalid) | | | মনোনীত অবৈধ অপকোড - [EIP-141](https://eips.ethereum.org/EIPS/eip-141) | | | +| FF | SELFDESTRUCT | [AB](https://github.com/wolflo/evm-opcodes/blob/main/gas.md#ab-selfdestruct) | `addr` | `.` | | সমস্ত ETH `addr`-এ পাঠায়; যদি একটি কনট্র্যাক্ট তৈরি করার একই ট্রানজ্যাকশনে এটি এক্সিকিউট করা হয়, তবে এটি কনট্র্যাক্টটি ধ্বংস করে দেয় | | diff --git a/public/content/translations/bn/developers/docs/frameworks/index.md b/public/content/translations/bn/developers/docs/frameworks/index.md new file mode 100644 index 00000000000..9e39a7e09c8 --- /dev/null +++ b/public/content/translations/bn/developers/docs/frameworks/index.md @@ -0,0 +1,154 @@ +--- +title: "ডিএ্যাপ ডেভেলপমেন্ট ফ্রেমওয়ার্কস" +description: "ফ্রেমওয়ার্কের সুবিধাগুলো অন্বেষণ করুন এবং উপলব্ধ বিকল্পগুলির তুলনা করুন।" +lang: bn +--- + +## ফ্রেমওয়ার্কের ভূমিকা {#introduction-to-frameworks} + +একটি পূর্ণাঙ্গ ডিএ্যাপ তৈরি করার জন্য +বিভিন্ন ধরনের প্রযুক্তির প্রয়োজন হয়। সফ্টওয়্যার ফ্রেমওয়ার্কগুলোতে প্রয়োজনীয় অনেক +ফিচার অন্তর্ভুক্ত থাকে অথবা আপনার পছন্দের টুলগুলো বেছে নেওয়ার জন্য সহজ প্লাগইন সিস্টেম সরবরাহ করে। + +ফ্রেমওয়ার্কগুলো অনেক আউট-অফ-দ্য-বক্স কার্যকারিতা সহ আসে, +যেমন: + +- একটি স্থানীয় ব্লকচেইন মুহুর্তে স্পিন আপ করার ফিচারসমূহ। +- আপনার স্মার্ট কন্ট্র্যাক্ট গুলি কম্পাইল এবং পরীক্ষা করার ইউটিলিটি সমূহ। +- একই প্রজেক্ট/রিপোজিটরির মধ্যে আপনার ইউজার-ফেসিং অ্যাপ্লিকেশন তৈরি করার জন্য ক্লায়েন্ট ডেভেলপমেন্ট অ্যাড-অন। +- Ethereum নেটওয়ার্কের সাথে সংযোগ স্থাপন এবং কন্ট্র্যাক্ট ডেপ্লয় করার জন্য কনফিগারেশন, + সেটা স্থানীয়ভাবে চলমান কোনো ইনস্ট্যান্স হোক, অথবা Ethereum-এর কোনো পাবলিক নেটওয়ার্ক। +- ডিসেন্ট্রালাইজড অ্যাপ ডিস্ট্রিবিউশন - IPFS-এর মতো স্টোরেজ + বিকল্পগুলির সাথে ইন্টিগ্রেশন। + +## পূর্বশর্ত {#prerequisites} + +ফ্রেমওয়ার্কগুলিতে প্রবেশ করার আগে, আমরা আপনাকে প্রথমে আমাদের [ডিএ্যাপস](/developers/docs/dapps/) এবং [Ethereum স্ট্যাক](/developers/docs/ethereum-stack/) এর ভূমিকা পড়ে নেওয়ার পরামর্শ দিচ্ছি। + +## উপলব্ধ ফ্রেমওয়ার্ক {#available-frameworks} + +**Foundry** - **_Foundry হলো Ethereum অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য একটি অত্যন্ত দ্রুত, পোর্টেবল এবং মডুলার টুলকিট_** + +- [Foundry ইনস্টল করুন](https://book.getfoundry.sh/) +- [Foundry বই](https://book.getfoundry.sh/) +- [টেলিগ্রামে Foundry কমিউনিটি চ্যাট](https://t.me/foundry_support) +- [অসাম Foundry](https://github.com/crisgarner/awesome-foundry) + +**Hardhat -** **_পেশাদারদের জন্য Ethereum ডেভেলপমেন্ট এনভায়রনমেন্ট।_** + +- [hardhat.org](https://hardhat.org) +- [GitHub](https://github.com/nomiclabs/hardhat) + +**Ape -** **_Pythonistas, ডেটা সায়েন্টিস্ট এবং সিকিউরিটি পেশাদারদের জন্য স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্ট টুল।_** + +- [ডকুমেন্টেশন](https://docs.apeworx.io/ape/stable/) +- [GitHub](https://github.com/ApeWorX/ape) + +**Web3j -** **_JVM-এ ব্লকচেইন অ্যাপ্লিকেশন ডেভেলপ করার জন্য একটি প্ল্যাটফর্ম।_** + +- [হোমপেজ](https://www.web3labs.com/web3j-sdk) +- [ডকুমেন্টেশন](https://docs.web3j.io) +- [GitHub](https://github.com/web3j/web3j) + +**ethers-kt -** **_EVM-ভিত্তিক ব্লকচেইনের জন্য অ্যাসিঙ্ক, হাই-পারফরম্যান্স Kotlin/Java/Android লাইব্রেরি।_** + +- [GitHub](https://github.com/Kr1ptal/ethers-kt) +- [উদাহরণ](https://github.com/Kr1ptal/ethers-kt/tree/master/examples) +- [Discord](https://discord.gg/rx35NzQGSb) + +**Create Eth App -** **_এক কমান্ডে Ethereum-চালিত অ্যাপ তৈরি করুন। বেছে নেওয়ার জন্য UI ফ্রেমওয়ার্ক এবং DeFi টেমপ্লেটের বিস্তৃত সম্ভার সহ আসে।_** + +- [GitHub](https://github.com/paulrberg/create-eth-app) +- [টেমপ্লেট](https://github.com/PaulRBerg/create-eth-app/tree/develop/templates) + +**Scaffold-Eth -** **_Ethers.js + Hardhat + web3-এর জন্য React কম্পোনেন্ট এবং হুকস: স্মার্ট কন্ট্র্যাক্ট দ্বারা চালিত ডিসেন্ট্রালাইজড এপ্লিকেশন তৈরি শুরু করার জন্য আপনার যা কিছু প্রয়োজন।_** + +- [GitHub](https://github.com/scaffold-eth/scaffold-eth-2) + +**Tenderly -** **_Web3 ডেভেলপমেন্ট প্ল্যাটফর্ম যা ব্লকচেইন ডেভেলপারদের স্মার্ট কন্ট্র্যাক্ট তৈরি, পরীক্ষা, ডিবাগ, নিরীক্ষণ এবং পরিচালনা করতে এবং ডিএ্যাপ UX উন্নত করতে সক্ষম করে।_** + +- [ওয়েবসাইট](https://tenderly.co/) +- [ডকুমেন্টেশন](https://docs.tenderly.co/) + +**The Graph -** **_দক্ষভাবে ব্লকচেইন ডেটা কোয়েরি করার জন্য The Graph।_** + +- [ওয়েবসাইট](https://thegraph.com/) +- [টিউটোরিয়াল](/developers/tutorials/the-graph-fixing-web3-data-querying/) + +**Alchemy -** **_Ethereum ডেভেলপমেন্ট প্ল্যাটফর্ম।_** + +- [alchemy.com](https://www.alchemy.com/) +- [GitHub](https://github.com/alchemyplatform) +- [Discord](https://discord.com/invite/alchemyplatform) + +**NodeReal -** **_Ethereum ডেভেলপমেন্ট প্ল্যাটফর্ম।_** + +- [Nodereal.io](https://nodereal.io/) +- [GitHub](https://github.com/node-real) +- [Discord](https://discord.gg/V5k5gsuE) + +**thirdweb SDK -** **_আমাদের শক্তিশালী SDK এবং CLI ব্যবহার করে এমন web3 অ্যাপ্লিকেশন তৈরি করুন যা আপনার স্মার্ট কন্ট্র্যাক্টগুলির সাথে ইন্টারঅ্যাক্ট করতে পারে।_** + +- [ডকুমেন্টেশন](https://portal.thirdweb.com/sdk/) +- [GitHub](https://github.com/thirdweb-dev/) + +**Chainstack -** **_Web3 (Ethereum এবং অন্যান্য) ডেভেলপমেন্ট প্ল্যাটফর্ম।_** + +- [chainstack.com](https://www.chainstack.com/) +- [GitHub](https://github.com/chainstack) +- [Discord](https://discord.gg/BSb5zfp9AT) + +**Crossmint -** **_এন্টারপ্রাইজ-গ্রেড web3 ডেভেলপমেন্ট প্ল্যাটফর্ম, যা আপনাকে সমস্ত প্রধান চেইন EVM চেইন (এবং অন্যন্য) -এ NFT অ্যাপ্লিকেশন তৈরি করতে দেয়।_** + +- [ওয়েবসাইট](https://www.crossmint.com) +- [নথিপত্র](https://docs.crossmint.com) +- [Discord](https://discord.com/invite/crossmint) + +**Brownie -** **_পাইথন-ভিত্তিক ডেভেলপমেন্ট এনভায়রনমেন্ট এবং টেস্টিং ফ্রেমওয়ার্ক।_** + +- [ডকুমেন্টেশন](https://eth-brownie.readthedocs.io/en/latest/) +- [GitHub](https://github.com/eth-brownie/brownie) +- **Brownie বর্তমানে আনমেইনটেইন্ড** + +**OpenZeppelin SDK -** **_চূড়ান্ত স্মার্ট কন্ট্র্যাক্ট টুলকিট: আপনাকে স্মার্ট কন্ট্র্যাক্ট ডেভেলপ, কম্পাইল, আপগ্রেড, ডেপ্লয় এবং তার সাথে ইন্টারঅ্যাক্ট করতে সাহায্য করার জন্য টুলের একটি স্যুট।_** + +- [OpenZeppelin Defender SDK](https://docs.openzeppelin.com/defender/sdk) +- [GitHub](https://github.com/OpenZeppelin/openzeppelin-sdk) +- [কমিউনিটি ফোরাম](https://forum.openzeppelin.com/c/support/17) +- **OpenZeppelin SDK-এর ডেভেলপমেন্ট শেষ হয়ে গেছে** + +**Catapulta -** **_মাল্টি-চেইন স্মার্ট কন্ট্র্যাক্ট ডেপ্লয়মেন্ট টুল, ব্লক এক্সপ্লোরারে ভেরিফিকেশন অটোমেট করে, ডেপ্লয় করা স্মার্ট কন্ট্র্যাক্টের ট্র্যাক রাখে এবং ডেপ্লয়মেন্ট রিপোর্ট শেয়ার করে, Foundry এবং Hardhat প্রজেক্টের জন্য প্লাগ-এন-প্লে।_** + +- [ওয়েবসাইট](https://catapulta.sh/) +- [ডকুমেন্টেশন](https://catapulta.sh/docs) +- [Github](https://github.com/catapulta-sh) + +**GoldRush (Covalent দ্বারা চালিত) -** **_GoldRush ডেভেলপার, বিশ্লেষক এবং এন্টারপ্রাইজদের জন্য সবচেয়ে ব্যাপক ব্লকচেইন ডেটা API স্যুট অফার করে। আপনি একটি DeFi ড্যাশবোর্ড, একটি ওয়ালেট, একটি ট্রেডিং বট, একটি AI এজেন্ট বা একটি কমপ্লায়েন্স প্ল্যাটফর্ম তৈরি করুন না কেন, ডেটা APIগুলি আপনার প্রয়োজনীয় অনচেইন ডেটাতে দ্রুত, নির্ভুল এবং ডেভেলপার-বান্ধব অ্যাক্সেস প্রদান করে_** + +- [ওয়েবসাইট](https://goldrush.dev/) +- [ডকুমেন্টেশন](https://goldrush.dev/docs/chains/ethereum) +- [GitHub](https://github.com/covalenthq) +- [Discord](https://www.covalenthq.com/discord/) + +**Wake -** **_কন্ট্র্যাক্ট টেস্টিং, ফাজিং, ডেপ্লয়মেন্ট, ভালনারেবিলিটি স্ক্যানিং এবং কোড নেভিগেশনের জন্য অল-ইন-ওয়ান পাইথন ফ্রেমওয়ার্ক।_** + +- [হোমপেজ](https://getwake.io/) +- [ডকুমেন্টেশন](https://ackeeblockchain.com/wake/docs/latest/) +- [GitHub](https://github.com/Ackee-Blockchain/wake) +- [VS কোড এক্সটেনশন](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity) + +**Veramo -** **_ওপেন সোর্স, মডুলার এবং অ্যাগনস্টিক ফ্রেমওয়ার্ক যা ডিসেন্ট্রালাইজড এপ্লিকেশন ডেভেলপারদের জন্য তাদের অ্যাপ্লিকেশনে ডিসেন্ট্রালাইজড আইডেন্টিটি এবং ভেরিফাইয়েবল ক্রেডেনশিয়াল তৈরি করা সহজ করে তোলে।_** + +- [হোমপেজ](https://veramo.io/) +- [ডকুমেন্টেশন](https://veramo.io/docs/basics/introduction) +- [GitHub](https://github.com/uport-project/veramo) +- [Discord](https://discord.com/invite/FRRBdjemHV) +- [NPM প্যাকেজ](https://www.npmjs.com/package/@veramo/core) + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [একটি স্থানীয় ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করুন](/developers/local-environment/) diff --git a/public/content/translations/bn/developers/docs/gas/index.md b/public/content/translations/bn/developers/docs/gas/index.md new file mode 100644 index 00000000000..b64a77cef54 --- /dev/null +++ b/public/content/translations/bn/developers/docs/gas/index.md @@ -0,0 +1,151 @@ +--- +title: "গ্যাস এবং ফি" +metaTitle: "Ethereum গ্যাস এবং ফি: টেকনিক্যাল ওভারভিউ" +description: "Ethereum গ্যাস ফি, সেগুলি কীভাবে গণনা করা হয় এবং নেটওয়ার্ক নিরাপত্তা এবং লেনদেন প্রক্রিয়াকরণে তাদের ভূমিকা সম্পর্কে জানুন।" +lang: bn +--- + +গ্যাস Ethereum নেটওয়ার্কের জন্য অপরিহার্য। এটি সেই জ্বালানি যা এটিকে কাজ করার অনুমতি দেয়, ঠিক যেমন একটি গাড়ি চালানোর জন্য গ্যাসোলিনের প্রয়োজন হয়। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে [লেনদেন](/developers/docs/transactions/) এবং [EVM](/developers/docs/evm/) সম্পর্কে পড়ার পরামর্শ দিচ্ছি। + +## Ethereum-এ গ্যাস সম্পর্কে জানুন: তারা কীভাবে কাজ করে এবং কীভাবে গ্যাস ফি কম দিতে হয়? {#what-is-gas} + +গ্যাস বলতে সেই একককে বোঝায় যা Ethereum নেটওয়ার্কে নির্দিষ্ট ক্রিয়াকলাপ সম্পাদনের জন্য প্রয়োজনীয় কম্পিউটেশনাল প্রচেষ্টার পরিমাণ পরিমাপ করে। + +যেহেতু প্রতিটি Ethereum লেনদেন কার্যকর করার জন্য কম্পিউটেশনাল রিসোর্স প্রয়োজন, তাই সেই রিসোর্সের জন্য অর্থ প্রদান করতে হয় যাতে Ethereum স্প্যামের জন্য ঝুঁকিপূর্ণ না হয় এবং অসীম কম্পিউটেশনাল লুপে আটকে না যায়। গণনার জন্য অর্থপ্রদান একটি গ্যাস ফি আকারে করা হয়। + +গ্যাস ফি হল **কিছু অপারেশন করার জন্য ব্যবহৃত গ্যাসের পরিমাণ, প্রতি ইউনিট গ্যাসের খরচ দ্বারা গুণিত**। লেনদেন সফল বা ব্যর্থ হোক না কেন ফি প্রদান করা হয়। + +![একটি ডায়াগ্রাম যা দেখাচ্ছে EVM অপারেশনে কোথায় গ্যাসের প্রয়োজন](./gas.png) +_[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf) থেকে অভিযোজিত ডায়াগ্রাম_ + +গ্যাস ফি অবশ্যই Ethereum-এর নেটিভ কারেন্সি, ইথার (ETH)-এ পরিশোধ করতে হবে। গ্যাসের দাম সাধারণত gwei-তে উদ্ধৃত করা হয়, যা ETH-এর একটি একক। প্রতি gwei এক বিলিয়নের এক ভাগ ETH (0.000000001 ETH বা 10-9 ETH)-এর সমান। + +উদাহরণস্বরূপ, আপনার গ্যাস খরচ 0.000000001 ইথার বলার পরিবর্তে, আপনি বলতে পারেন আপনার গ্যাস খরচ 1 gwei। + +'gwei' শব্দটি 'giga-wei'-এর একটি সংক্ষিপ্ত রূপ, যার অর্থ 'বিলিয়ন wei'। এক gwei এক বিলিয়ন wei এর সমান। Wei নিজেই ([বি-মানি](https://www.investopedia.com/terms/b/bmoney.asp)-এর স্রষ্টা [ওয়েই ডাই](https://wikipedia.org/wiki/Wei_Dai)-এর নামে নামকরণ করা হয়েছে) ETH-এর ক্ষুদ্রতম একক। + +## গ্যাস ফি কীভাবে গণনা করা হয়? {#how-are-gas-fees-calculated} + +আপনি যখন একটি লেনদেন জমা দেন তখন আপনি যে পরিমাণ গ্যাস দিতে ইচ্ছুক তা সেট করতে পারেন। একটি নির্দিষ্ট পরিমাণ গ্যাস অফার করার মাধ্যমে, আপনি পরবর্তী ব্লকে আপনার লেনদেন অন্তর্ভুক্ত করার জন্য বিড করছেন। আপনি যদি খুব কম অফার করেন, তাহলে ভ্যালিডেটররা আপনার লেনদেন অন্তর্ভুক্ত করার জন্য বেছে নেওয়ার সম্ভাবনা কম, যার অর্থ আপনার লেনদেন দেরিতে বা একেবারেই কার্যকর নাও হতে পারে। আপনি যদি খুব বেশি অফার করেন, তাহলে আপনি কিছু ETH নষ্ট করতে পারেন। তাহলে, আপনি কীভাবে বলবেন যে কত টাকা দিতে হবে? + +আপনি যে মোট গ্যাস প্রদান করেন তা দুটি উপাদানে বিভক্ত: `বেস ফি` এবং `প্রায়োরিটি ফি` (টিপ)। + +`বেস ফি` প্রোটোকল দ্বারা সেট করা হয়—আপনার লেনদেন বৈধ বলে বিবেচিত হওয়ার জন্য আপনাকে অন্তত এই পরিমাণ অর্থ প্রদান করতে হবে। `প্রায়োরিটি ফি` হল একটি টিপ যা আপনি বেস ফি-তে যোগ করেন যাতে আপনার লেনদেনটি ভ্যালিডেটরদের কাছে আকর্ষণীয় হয় যাতে তারা পরবর্তী ব্লকে অন্তর্ভুক্ত করার জন্য এটি বেছে নেয়। + +একটি লেনদেন যা শুধুমাত্র `বেস ফি` প্রদান করে তা প্রযুক্তিগতভাবে বৈধ কিন্তু অন্তর্ভুক্ত হওয়ার সম্ভাবনা কম কারণ এটি ভ্যালিডেটরদের অন্য কোনো লেনদেনের চেয়ে এটি বেছে নেওয়ার জন্য কোনো প্রণোদনা প্রদান করে না। 'সঠিক' `প্রায়োরিটি` ফি আপনার লেনদেন পাঠানোর সময় নেটওয়ার্ক ব্যবহারের দ্বারা নির্ধারিত হয়—যদি অনেক চাহিদা থাকে তাহলে আপনাকে আপনার `প্রায়োরিটি` ফি বেশি সেট করতে হতে পারে, কিন্তু যখন চাহিদা কম থাকে তখন আপনি কম অর্থ প্রদান করতে পারেন। + +উদাহরণস্বরূপ, ধরা যাক জর্ডানকে টেলরকে 1 ETH দিতে হবে। একটি ETH স্থানান্তরের জন্য 21,000 ইউনিট গ্যাস প্রয়োজন, এবং বেস ফি হল 10 gwei। জর্ডান 2 gwei এর একটি টিপ অন্তর্ভুক্ত করে। + +মোট ফি এখন এর সমান হবে: + +`ব্যবহৃত গ্যাসের ইউনিট * (বেস ফি + প্রায়োরিটি ফি)` + +যেখানে `বেস ফি` প্রোটোকল দ্বারা সেট করা একটি মান এবং `প্রায়োরিটি ফি` হল ভ্যালিডেটরের জন্য টিপ হিসাবে ব্যবহারকারী দ্বারা সেট করা একটি মান। + +যেমন, `21,000 * (10 + 2) = 252,000 gwei` (0.000252 ETH)। + +জর্ডান যখন টাকা পাঠাবে, তখন জর্ডানের অ্যাকাউন্ট থেকে 1.000252 ETH কেটে নেওয়া হবে। টেলরের অ্যাকাউন্টে 1.0000 ETH জমা হবে। ভ্যালিডেটর 0.000042 ETH এর টিপ গ্রহণ করে। 0.00021 ETH এর `বেস ফি` বার্ন করা হয়। + +### বেস ফি {#base-fee} + +প্রতিটি ব্লকের একটি বেস ফি থাকে যা একটি রিজার্ভ মূল্য হিসাবে কাজ করে। একটি ব্লকে অন্তর্ভুক্তির জন্য যোগ্য হতে, প্রতি গ্যাসের জন্য প্রস্তাবিত মূল্য কমপক্ষে বেস ফি-র সমান হতে হবে। বেস ফি বর্তমান ব্লক থেকে স্বাধীনভাবে গণনা করা হয় এবং পরিবর্তে এর আগের ব্লকগুলি দ্বারা নির্ধারিত হয়, যা ব্যবহারকারীদের জন্য লেনদেন ফি আরও অনুমানযোগ্য করে তোলে। ব্লক তৈরি করা হলে এই **বেস ফি \"বার্ন\" করা হয়**, এটিকে প্রচলন থেকে সরিয়ে দেওয়া হয়। + +বেস ফি একটি সূত্র দ্বারা গণনা করা হয় যা পূর্ববর্তী ব্লকের আকারের (সমস্ত লেনদেনের জন্য ব্যবহৃত গ্যাসের পরিমাণ) সাথে লক্ষ্য আকারের (গ্যাস সীমার অর্ধেক) তুলনা করে। যদি লক্ষ্য ব্লকের আকার লক্ষ্যের উপরে বা নীচে থাকে, তবে বেস ফি প্রতি ব্লকে সর্বোচ্চ 12.5% বৃদ্ধি বা হ্রাস পাবে। এই সূচকীয় বৃদ্ধি ব্লক সাইজকে অনির্দিষ্টকালের জন্য উচ্চ রাখা অর্থনৈতিকভাবে অকার্যকর করে তোলে। + +| ব্লক নম্বর | অন্তর্ভুক্ত গ্যাস | ফি বৃদ্ধি | বর্তমান বেস ফি | +| ---------- | ----------------: | --------------------: | -------------------------: | +| 1 | 18M | 0% | 100 gwei | +| 2 | 36M | 0% | 100 gwei | +| 3 | 36M | 12.5% | 112.5 gwei | +| 4 | 36M | 12.5% | 126.6 gwei | +| 5 | 36M | 12.5% | 142.4 gwei | +| 6 | 36M | 12.5% | 160.2 gwei | +| 7 | 36M | 12.5% | 180.2 gwei | +| 8 | 36M | 12.5% | 202.7 gwei | + +উপরের সারণীতে, 36 মিলিয়নকে গ্যাস সীমা হিসাবে ব্যবহার করে একটি উদাহরণ দেখানো হয়েছে। এই উদাহরণটি অনুসরণ করে, 9 নম্বর ব্লকে একটি লেনদেন তৈরি করতে, একটি ওয়ালেট ব্যবহারকারীকে নিশ্চিতভাবে জানিয়ে দেবে যে পরবর্তী ব্লকে যোগ করার জন্য **সর্বোচ্চ বেস ফি** হল `বর্তমান বেস ফি * 112.5%` বা `202.7 gwei * 112.5% = 228.1 gwei`। + +এটিও মনে রাখা গুরুত্বপূর্ণ যে আমরা সম্পূর্ণ ব্লকের বর্ধিত স্পাইক দেখতে পাওয়ার সম্ভাবনা কম কারণ একটি সম্পূর্ণ ব্লকের আগে বেস ফি যে গতিতে বৃদ্ধি পায়। + +| ব্লক নম্বর | অন্তর্ভুক্ত গ্যাস | ফি বৃদ্ধি | বর্তমান বেস ফি | +| --------------------------------------------------- | --------------------------------------------------: | --------------------: | --------------------------------------------------: | +| 30 | 36M | 12.5% | 2705.6 gwei | +| ... | ... | 12.5% | ... | +| 50 | 36M | 12.5% | 28531.3 gwei | +| ... | ... | 12.5% | ... | +| 100 | 36M | 12.5% | 10302608.6 gwei | + +### প্রায়োরিটি ফি (টিপস) {#priority-fee} + +প্রায়োরিটি ফি (টিপ) ভ্যালিডেটরদের একটি ব্লকের লেনদেনের সংখ্যা সর্বাধিক করতে উৎসাহিত করে, যা শুধুমাত্র ব্লক গ্যাস সীমা দ্বারা সীমাবদ্ধ। টিপস ছাড়া, একজন যুক্তিসঙ্গত ভ্যালিডেটর কোনো সরাসরি এক্সিকিউশন লেয়ার বা কনসেন্সাস লেয়ারের জরিমানা ছাড়াই কম—এমনকি শূন্য—লেনদেন অন্তর্ভুক্ত করতে পারে, কারণ স্টেকিং রিওয়ার্ড একটি ব্লকে কতগুলি লেনদেন আছে তার থেকে স্বাধীন। অতিরিক্তভাবে, টিপস ব্যবহারকারীদের একই ব্লকের মধ্যে অগ্রাধিকারের জন্য অন্যদেরকে ছাড়িয়ে যেতে দেয়, যা কার্যকরভাবে জরুরি অবস্থার সংকেত দেয়। + +### সর্বোচ্চ ফি {#maxfee} + +নেটওয়ার্কে একটি লেনদেন সম্পাদনের জন্য, ব্যবহারকারীরা তাদের লেনদেন কার্যকর করার জন্য যে সর্বোচ্চ সীমা দিতে ইচ্ছুক তা নির্দিষ্ট করতে পারে। এই ঐচ্ছিক প্যারামিটারটি `maxFeePerGas` নামে পরিচিত। একটি লেনদেন কার্যকর করার জন্য, সর্বোচ্চ ফি অবশ্যই বেস ফি এবং টিপের যোগফলকে অতিক্রম করতে হবে। লেনদেন প্রেরককে সর্বোচ্চ ফি এবং বেস ফি ও টিপের যোগফলের মধ্যে পার্থক্য ফেরত দেওয়া হয়। + +### ব্লকের আকার {#block-size} + +প্রতিটি ব্লকের একটি লক্ষ্য আকার থাকে যা বর্তমান গ্যাস সীমার অর্ধেক, তবে ব্লক সীমা পর্যন্ত না পৌঁছানো পর্যন্ত (লক্ষ্য ব্লক আকারের 2 গুণ) নেটওয়ার্কের চাহিদা অনুযায়ী ব্লকের আকার বাড়বে বা কমবে। প্রোটোকলটি _tâtonnement_ প্রক্রিয়ার মাধ্যমে লক্ষ্যে একটি ভারসাম্য গড় ব্লক আকার অর্জন করে। এর মানে হল যদি ব্লকের আকার লক্ষ্য ব্লকের আকারের চেয়ে বড় হয়, প্রোটোকল নিম্নলিখিত ব্লকের জন্য বেস ফি বাড়িয়ে দেবে। একইভাবে, যদি ব্লকের আকার লক্ষ্য ব্লকের আকারের চেয়ে কম হয় তবে প্রোটোকল বেস ফি কমিয়ে দেবে। + +বেস ফি যে পরিমাণে সামঞ্জস্য করা হয় তা বর্তমান ব্লক আকার লক্ষ্য থেকে কত দূরে তার সমানুপাতিক। এটি একটি খালি ব্লকের জন্য -12.5% থেকে একটি রৈখিক গণনা, লক্ষ্য আকারে 0%, গ্যাস সীমায় পৌঁছানো একটি ব্লকের জন্য +12.5% পর্যন্ত। ভ্যালিডেটর সংকেতের উপর ভিত্তি করে, সেইসাথে নেটওয়ার্ক আপগ্রেডের মাধ্যমে সময়ের সাথে সাথে গ্যাস সীমা ওঠানামা করতে পারে। আপনি [এখানে সময়ের সাথে সাথে গ্যাস সীমার পরিবর্তন দেখতে পারেন](https://eth.blockscout.com/stats/averageGasLimit?interval=threeMonths)। + +[ব্লক সম্পর্কে আরও](/developers/docs/blocks/) + +### অনুশীলনে গ্যাস ফি গণনা করা {#calculating-fees-in-practice} + +আপনার লেনদেন কার্যকর করার জন্য আপনি কত টাকা দিতে ইচ্ছুক তা আপনি স্পষ্টভাবে বলতে পারেন। যাইহোক, বেশিরভাগ ওয়ালেট প্রদানকারী তাদের ব্যবহারকারীদের উপর চাপানো জটিলতা কমাতে স্বয়ংক্রিয়ভাবে একটি প্রস্তাবিত লেনদেন ফি (বেস ফি + প্রস্তাবিত প্রায়োরিটি ফি) সেট করবে। + +## গ্যাস ফি কেন বিদ্যমান? {#why-do-gas-fees-exist} + +সংক্ষেপে, গ্যাস ফি Ethereum নেটওয়ার্ককে সুরক্ষিত রাখতে সাহায্য করে। নেটওয়ার্কে নির্বাহ করা প্রতিটি গণনার জন্য একটি ফি প্রয়োজন করে, আমরা খারাপ অভিনেতাদের নেটওয়ার্ক স্প্যামিং থেকে বিরত রাখি। কোডে দুর্ঘটনাজনিত বা প্রতিকূল অসীম লুপ বা অন্যান্য গণনামূলক অপচয় এড়াতে, প্রতিটি লেনদেনকে কোড এক্সিকিউশনের কতগুলি গণনামূলক পদক্ষেপ ব্যবহার করতে পারে তার একটি সীমা সেট করতে হবে। গণনার মৌলিক একক হল \"গ্যাস\"। + +যদিও একটি লেনদেনে একটি সীমা অন্তর্ভুক্ত থাকে, একটি লেনদেনে ব্যবহৃত না হওয়া কোনো গ্যাস ব্যবহারকারীকে ফেরত দেওয়া হয় (যেমন, `max fee - (base fee + tip)` ফেরত দেওয়া হয়)। + +![অব্যবহৃত গ্যাস কীভাবে ফেরত দেওয়া হয় তা দেখানো ডায়াগ্রাম](../transactions/gas-tx.png) +_[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf) থেকে অভিযোজিত ডায়াগ্রাম_ + +## গ্যাস সীমা কি? {#what-is-gas-limit} + +গ্যাস সীমা বলতে একটি লেনদেনে আপনি যে পরিমাণ গ্যাস ব্যবহার করতে ইচ্ছুক তা বোঝায়। [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) জড়িত আরও জটিল লেনদেনগুলির জন্য আরও গণনামূলক কাজ প্রয়োজন, তাই তাদের একটি সাধারণ অর্থপ্রদানের চেয়ে উচ্চতর গ্যাস সীমার প্রয়োজন। একটি স্ট্যান্ডার্ড ETH স্থানান্তরের জন্য 21,000 ইউনিট গ্যাসের একটি গ্যাস সীমা প্রয়োজন। + +উদাহরণস্বরূপ, আপনি যদি একটি সাধারণ ETH স্থানান্তরের জন্য 50,000 এর একটি গ্যাস সীমা রাখেন, EVM 21,000 ব্যবহার করবে এবং আপনি অবশিষ্ট 29,000 ফেরত পাবেন। যাইহোক, আপনি যদি খুব কম গ্যাস নির্দিষ্ট করেন, উদাহরণস্বরূপ, একটি সাধারণ ETH স্থানান্তরের জন্য 20,000 এর গ্যাস সীমা, লেনদেনটি বৈধতা পর্বের সময় ব্যর্থ হবে। এটি একটি ব্লকে অন্তর্ভুক্ত করার আগে প্রত্যাখ্যান করা হবে এবং কোনো গ্যাস খরচ হবে না। অন্যদিকে, যদি কোনো লেনদেন কার্যকর করার সময় গ্যাস ফুরিয়ে যায় (যেমন, একটি স্মার্ট কন্ট্র্যাক্ট মাঝপথে সমস্ত গ্যাস ব্যবহার করে), EVM যেকোনো পরিবর্তন ফিরিয়ে দেবে, কিন্তু প্রদত্ত সমস্ত গ্যাস এখনও সম্পাদিত কাজের জন্য ব্যবহার করা হবে। + +## কেন গ্যাস ফি এত বেশি হতে পারে? {#why-can-gas-fees-get-so-high} + +Ethereum-এর জনপ্রিয়তার কারণে গ্যাস ফি বেশি হয়। যদি খুব বেশি চাহিদা থাকে, ব্যবহারকারীদের অবশ্যই অন্যান্য ব্যবহারকারীদের লেনদেনকে ছাড়িয়ে যাওয়ার চেষ্টা করার জন্য উচ্চতর টিপ পরিমাণ অফার করতে হবে। একটি উচ্চতর টিপ আপনার লেনদেনকে পরবর্তী ব্লকে যাওয়ার সম্ভাবনা বাড়িয়ে তুলতে পারে। এছাড়াও, আরও জটিল স্মার্ট কন্ট্র্যাক্ট অ্যাপগুলি তাদের ফাংশনগুলিকে সমর্থন করার জন্য প্রচুর অপারেশন করতে পারে, যার ফলে তারা প্রচুর গ্যাস গ্রহণ করে। + +## গ্যাস খরচ কমানোর উদ্যোগ {#initiatives-to-reduce-gas-costs} + +Ethereum [স্কেলেবিলিটি আপগ্রেড](/roadmap/) শেষ পর্যন্ত গ্যাস ফি সংক্রান্ত কিছু সমস্যা সমাধান করবে, যা ফলস্বরূপ, প্ল্যাটফর্মটিকে প্রতি সেকেন্ডে হাজার হাজার লেনদেন প্রক্রিয়া করতে এবং বিশ্বব্যাপী স্কেল করতে সক্ষম করবে। + +লেয়ার 2 স্কেলিং হল গ্যাস খরচ, ব্যবহারকারীর অভিজ্ঞতা এবং স্কেলেবিলিটি ব্যাপকভাবে উন্নত করার একটি প্রাথমিক উদ্যোগ। + +[লেয়ার 2 স্কেলিং সম্পর্কে আরও](/developers/docs/scaling/#layer-2-scaling) + +## গ্যাস ফি পর্যবেক্ষণ {#monitoring-gas-fees} + +আপনি যদি গ্যাসের দাম নিরীক্ষণ করতে চান, যাতে আপনি কম খরচে আপনার ETH পাঠাতে পারেন, আপনি বিভিন্ন টুল ব্যবহার করতে পারেন যেমন: + +- [Etherscan](https://etherscan.io/gastracker) _লেনদেনের গ্যাস মূল্যের অনুমানকারী_ +- [Blockscout](https://eth.blockscout.com/gas-tracker) _ওপেন সোর্স লেনদেন গ্যাস মূল্য অনুমানকারী_ +- [ETH Gas Tracker](https://www.ethgastracker.com/) _লেনদেন ফি কমাতে এবং অর্থ সঞ্চয় করতে Ethereum এবং L2 গ্যাসের দাম নিরীক্ষণ এবং ট্র্যাক করুন_ +- [Blocknative ETH Gas Estimator](https://chrome.google.com/webstore/detail/blocknative-eth-gas-estim/ablbagjepecncofimgjmdpnhnfjiecfm) _গ্যাস অনুমানকারী ক্রোম এক্সটেনশন যা টাইপ 0 লিগ্যাসি লেনদেন এবং টাইপ 2 EIP-1559 লেনদেন উভয়ই সমর্থন করে।_ +- [Cryptoneur Gas Fees Calculator](https://www.cryptoneur.xyz/gas-fees-calculator) _মেইননেট, আরবিট্রাম এবং পলিগনে বিভিন্ন ধরনের লেনদেনের জন্য আপনার স্থানীয় মুদ্রায় গ্যাস ফি গণনা করুন।_ + +## সম্পর্কিত টুলস {#related-tools} + +- [ব্লকনেটিভ'স গ্যাস প্ল্যাটফর্ম](https://www.blocknative.com/gas) _ব্লকনেটিভ'স গ্লোবাল মেমপুল ডেটা প্ল্যাটফর্ম দ্বারা চালিত গ্যাস অনুমান API_ +- [গ্যাস নেটওয়ার্ক](https://gas.network) অনচেইন গ্যাস ওরাকেলস। 35+ চেইনের জন্য সমর্থন। + +## আরও পড়ুন {#further-reading} + +- [Ethereum গ্যাস ব্যাখ্যা করা হয়েছে](https://defiprime.com/gas) +- [আপনার স্মার্ট কন্ট্র্যাক্টের গ্যাস খরচ কমানো](https://medium.com/coinmonks/8-ways-of-reducing-the-gas-consumption-of-your-smart-contracts-9a506b339c0a) +- [ডেভেলপারদের জন্য গ্যাস অপ্টিমাইজেশান কৌশল](https://www.alchemy.com/overviews/solidity-gas-optimization) +- [EIP-1559 ডক্স](https://eips.ethereum.org/EIPS/eip-1559)। +- [টিম বেইকোর EIP-1559 রিসোর্স](https://hackmd.io/@timbeiko/1559-resources) +- [EIP-1559: মেমস থেকে মেকানিজম আলাদা করা](https://web.archive.org/web/20241126205908/https://research.2077.xyz/eip-1559-separating-mechanisms-from-memes) diff --git a/public/content/translations/bn/developers/docs/ides/index.md b/public/content/translations/bn/developers/docs/ides/index.md new file mode 100644 index 00000000000..cd4d276908f --- /dev/null +++ b/public/content/translations/bn/developers/docs/ides/index.md @@ -0,0 +1,64 @@ +--- +title: "ইন্টিগ্রেটেড ডেভেলপমেন্ট এনভায়রনমেন্টস (IDEs)" +description: "ইথেরিয়াম বিকাশের জন্য ওয়েব-ভিত্তিক এবং ডেস্কটপ IDEs সম্পর্কে জানুন, যার মধ্যে রয়েছে Remix, VS কোড, এবং জনপ্রিয় প্লাগইন।" +lang: bn +--- + +যখন একটি [ইন্টিগ্রেটেড ডেভেলপমেন্ট এনভায়রনমেন্ট (IDE)](https://wikipedia.org/wiki/Integrated_development_environment) সেট আপ করার কথা আসে, তখন ইথেরিয়াম-এ অ্যাপ্লিকেশন প্রোগ্রামিং করা অন্য যেকোনো সফ্টওয়্যার প্রজেক্ট প্রোগ্রামিং করার মতোই। বেছে নেওয়ার জন্য অনেক বিকল্প আছে, তাই দিনের শেষে, এমন IDE বা কোড এডিটর বেছে নিন যা আপনার পছন্দের জন্য সবচেয়ে উপযুক্ত। সম্ভবত আপনার ইথেরিয়াম বিকাশের জন্য সেরা IDE পছন্দ হলো সেই IDE যা আপনি ইতিমধ্যেই প্রথাগত সফ্টওয়্যার বিকাশের জন্য ব্যবহার করেন। + +## ওয়েব-ভিত্তিক IDEs {#web-based-ides} + +আপনি যদি একটি [লোকাল ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করার](/developers/local-environment/) আগে কোড নিয়ে নাড়াচাড়া করতে চান, তাহলে এই ওয়েব অ্যাপগুলি ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট বিকাশের জন্য বিশেষভাবে তৈরি করা হয়েছে। + +**[Remix](https://remix.ethereum.org/)** - **_অন্তর্নির্মিত স্ট্যাটিক বিশ্লেষণ এবং একটি টেস্ট ব্লকচেইন ভার্চুয়াল মেশিন সহ ওয়েব-ভিত্তিক IDE_** + +- [ডক্স](https://remix-ide.readthedocs.io/en/latest/#) +- [Gitter](https://gitter.im/ethereum/remix) + +**[ChainIDE](https://chainide.com/)** - **_একটি ক্লাউড-ভিত্তিক মাল্টি-চেইন IDE_** + +- [ডক্স](https://chainide.gitbook.io/chainide-english-1/) +- [হেল্প ফোরাম](https://forum.chainide.com/) + +**[Replit (Solidity স্টার্টার - বিটা)](https://replit.com/@replit/Solidity-starter-beta)** - **_হট রিলোডিং, ত্রুটি পরীক্ষা এবং প্রথম-শ্রেণীর টেস্টনেট সমর্থন সহ Ethereum-এর জন্য একটি কাস্টমাইজযোগ্য ডেভেলপমেন্ট এনভায়রনমেন্ট_** + +- [ডক্স](https://docs.replit.com/) + +**[Tenderly Sandbox](https://sandbox.tenderly.co/)** - **_একটি দ্রুত প্রোটোটাইপিং এনভায়রনমেন্ট যেখানে আপনি সলিডিটি এবং জাভাস্ক্রিপ্ট ব্যবহার করে ব্রাউজারে স্মার্ট কন্ট্র্যাক্ট লিখতে, এক্সিকিউট করতে এবং ডিবাগ করতে পারেন_** + +**[EthFiddle](https://ethfiddle.com/)** - **_ওয়েব-ভিত্তিক IDE যা আপনাকে আপনার স্মার্ট কন্ট্র্যাক্ট লিখতে, কম্পাইল করতে এবং ডিবাগ করতে দেয়_** + +- [Gitter](https://gitter.im/loomnetwork/ethfiddle) + +## ডেস্কটপ IDEs {#desktop-ides} + +বেশিরভাগ প্রতিষ্ঠিত IDEs-এ Ethereum ডেভেলপমেন্টের অভিজ্ঞতা বাড়ানোর জন্য প্লাগইন তৈরি করা হয়েছে। ন্যূনতমপক্ষে, তারা [স্মার্ট কন্ট্র্যাক্ট ভাষাগুলির](/developers/docs/smart-contracts/languages/) জন্য সিনট্যাক্স হাইলাইটিং প্রদান করে। + +**ভিজ্যুয়াল স্টুডিও কোড -** **_অফিসিয়াল ইথেরিয়াম সমর্থন সহ পেশাদার ক্রস-প্ল্যাটফর্ম IDE_** + +- [ভিজ্যুয়াল স্টুডিও কোড](https://code.visualstudio.com/) +- [কোড স্যাম্পেল](https://github.com/Azure-Samples/blockchain/blob/master/blockchain-workbench/application-and-smart-contract-samples/readme.md) +- [GitHub](https://github.com/microsoft/vscode) + +**JetBrains IDEs (IntelliJ IDEA, ইত্যাদি) -** **_সফ্টওয়্যার ডেভেলপার এবং টিমের জন্য প্রয়োজনীয় টুলস_** + +- [JetBrains](https://www.jetbrains.com/) +- [GitHub](https://github.com/JetBrains) +- [IntelliJ Solidity](https://github.com/intellij-solidity/intellij-solidity/) + +**Remix ডেস্কটপ -** **_আপনার লোকাল মেশিনে Remix IDE-এর অভিজ্ঞতা নিন_** + +- [ডাউনলোড](https://github.com/ethereum/remix-desktop/releases) +- [GitHub](https://github.com/ethereum/remix-desktop) + +## প্লাগইন এবং এক্সটেনশন {#plugins-extensions} + +- [solidity](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) - ভিজ্যুয়াল স্টুডিও কোডের জন্য Ethereum সলিডিটি ল্যাঙ্গুয়েজ +- [VS কোডের জন্য সলিডিটি + হার্ডহ্যাট](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity) - হার্ডহ্যাট টিমের দ্বারা সলিডিটি এবং হার্ডহ্যাট সাপোর্ট +- [Prettier Solidity](https://github.com/prettier-solidity/prettier-plugin-solidity) - prettier ব্যবহার করে কোড ফরমেটার + +## আরও পড়ুন {#further-reading} + +- [Ethereum IDEs](https://www.alchemy.com/list-of/web3-ides-on-ethereum) _- Alchemy-র Ethereum IDEs-এর তালিকা_ + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/index.md b/public/content/translations/bn/developers/docs/index.md new file mode 100644 index 00000000000..815146c14a8 --- /dev/null +++ b/public/content/translations/bn/developers/docs/index.md @@ -0,0 +1,25 @@ +--- +title: "ইথেরিয়াম উন্নয়ন নথিপত্র" +description: "ethereum.org ডেভেলপার নথিপত্রের সূচনা।" +lang: bn +--- + +এই নথিপত্রটি আপনাকে Ethereum দিয়ে তৈরি করতে সাহায্য করার জন্য ডিজাইন করা হয়েছে। এটি একটি ধারণা হিসাবে Ethereum-কে কভার করে, Ethereum টেক স্ট্যাক ব্যাখ্যা করে এবং আরও জটিল অ্যাপ্লিকেশন এবং ব্যবহারের ক্ষেত্রের জন্য উন্নত বিষয়গুলি নথিভুক্ত করে। + +এটি একটি ওপেন-সোর্স কমিউনিটির প্রচেষ্টা, তাই নির্দ্বিধায় নতুন বিষয় প্রস্তাব করুন, নতুন কনটেন্ট যোগ করুন এবং যেখানেই আপনি মনে করেন এটি সহায়ক হতে পারে সেখানে উদাহরণ দিন। সমস্ত নথিপত্র GitHub-এর মাধ্যমে সম্পাদনা করা যেতে পারে – আপনি যদি নিশ্চিত না হন কীভাবে করবেন, [এই নির্দেশাবলী অনুসরণ করুন](https://github.com/ethereum/ethereum-org-website/blob/dev/docs/editing-markdown.md)। + +## উন্নয়ন মডিউল {#development-modules} + +যদি এটি Ethereum উন্নয়নে আপনার প্রথম প্রচেষ্টা হয়, আমরা শুরু থেকে শুরু করে একটি বইয়ের মতো করে এগিয়ে যাওয়ার পরামর্শ দিই। + +### মৌলিক বিষয় {#foundational-topics} + + + +### Ethereum স্ট্যাক {#ethereum-stack} + + + +### উন্নত {#advanced} + + diff --git a/public/content/translations/bn/developers/docs/intro-to-ether/index.md b/public/content/translations/bn/developers/docs/intro-to-ether/index.md new file mode 100644 index 00000000000..ee01b4c4635 --- /dev/null +++ b/public/content/translations/bn/developers/docs/intro-to-ether/index.md @@ -0,0 +1,78 @@ +--- +title: "ইথারের টেকনিক্যাল ভূমিকা" +description: "ইথার ক্রিপটোকারেন্সি সম্পর্কে একজন ডেভেলপারের জন্য একটি ভূমিকা।" +lang: bn +--- + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালভাবে বুঝতে আপনাকে সাহায্য করার জন্য, আমরা সুপারিশ করছি যে আপনি প্রথমে [ইথেরিয়ামের পরিচিতি](/developers/docs/intro-to-ethereum/) পড়ুন। + +## ->পৃষ্ঠা-কি-হয়-ইথেরিয়াম-কি-হয়-গুপ্ত-শিরোনাম? {#what-is-a-cryptocurrency} + +একটি ক্রিপটোকারেন্সি হল একটি ব্লকচেইন-ভিত্তিক লেজার দ্বারা সুরক্ষিত বিনিময়ের একটি মাধ্যম। + +বিনিময়ের একটি মাধ্যম হল পণ্য এবং পরিষেবার জন্য অর্থপ্রদান হিসাবে ব্যাপকভাবে গৃহীত যে কোনও কিছু এবং একটি লেজার হল একটি ডেটা স্টোর যা লেনদেনের ট্র্যাক রাখে। ব্লকচেইন প্রযুক্তি ব্যবহারকারীদের লেজার বজায় রাখার জন্য একটি বিশ্বস্ত তৃতীয় পক্ষের উপর নির্ভর না করে লেজারে লেনদেন করার অনুমতি দেয়। + +সাতোশি নাকামোতোর তৈরি প্রথম ক্রিপটোকারেন্সি ছিল বিটকয়েন। 2009 সালে বিটকয়েন প্রকাশের পর থেকে, লোকেরা বিভিন্ন ব্লকচেইন জুড়ে হাজার হাজার ক্রিপ্টোকারেন্সি তৈরি করেছে। + +## ইথার কী? {#what-is-ether} + +**ইথার (ETH)** হল Ethereum নেটওয়ার্কে অনেক কিছুর জন্য ব্যবহৃত ক্রিপটোকারেন্সি। মৌলিকভাবে, এটি লেনদেন ফি-এর জন্য অর্থপ্রদানের একমাত্র গ্রহণযোগ্য ফর্ম, এবং [The Merge](/roadmap/merge)-এর পরে, Mainnet-এ ব্লকগুলিকে যাচাই এবং প্রস্তাব করার জন্য ইথার প্রয়োজন। ইথার [DeFi](/defi) ঋণদানের বাজারে জামানতের প্রাথমিক রূপ হিসাবে, NFT মার্কেটপ্লেসে অ্যাকাউন্টের একক হিসাবে, পরিষেবা সম্পাদন বা বাস্তব-বিশ্বের পণ্য বিক্রির জন্য অর্জিত অর্থপ্রদান হিসাবে এবং আরও অনেক কিছুতে ব্যবহৃত হয়। + +Ethereum ডেভেলপারদের [**ডিসেন্ট্রালাইজড এপ্লিকেশন (ডিএ্যাপস)**](/developers/docs/dapps) তৈরি করার অনুমতি দেয়, যা সকলেই কম্পিউটিং পাওয়ারের একটি পুল শেয়ার করে। এই শেয়ার করা পুলটি সসীম, তাই এটি কে ব্যবহার করবে তা নির্ধারণ করার জন্য Ethereum-এর একটি পদ্ধতির প্রয়োজন। অন্যথায়, একটি ডিএ্যাপ ঘটনাক্রমে বা দূষিতভাবে সমস্ত নেটওয়ার্ক রিসোর্স ব্যবহার করতে পারে, যা অন্যদের এটি অ্যাক্সেস করতে বাধা দেবে। + +ইথার ক্রিপটোকারেন্সি Ethereum-এর কম্পিউটিং পাওয়ারের জন্য একটি মূল্য নির্ধারণ প্রক্রিয়া সমর্থন করে। যখন ব্যবহারকারীরা একটি লেনদেন করতে চায়, তখন তাদের ব্লকচেইনে তাদের লেনদেনকে স্বীকৃতি দেওয়ার জন্য ইথার দিতে হবে। এই ব্যবহারের খরচগুলি [গ্যাস ফি](/developers/docs/gas/) হিসাবে পরিচিত, এবং গ্যাস ফি লেনদেন সম্পাদনের জন্য প্রয়োজনীয় কম্পিউটিং শক্তির পরিমাণ এবং সেই সময়ে কম্পিউটিং শক্তির জন্য নেটওয়ার্ক-ব্যাপী চাহিদার উপর নির্ভর করে। + +অতএব, এমনকি যদি একটি দূষিত ডিএ্যাপ একটি অসীম লুপ জমা দেয়, লেনদেনটি অবশেষে ইথারের বাইরে চলে যাবে এবং শেষ হয়ে যাবে, নেটওয়ার্কটিকে স্বাভাবিক অবস্থায় ফিরে আসতে দেবে। + +Ethereum এবং ইথারকে [এক করে ফেলা সাধারণ](https://abcnews.go.com/Business/bitcoin-slumps-week-low-amid-renewed-worries-chinese/story?id=78399845) — যখন লোকেরা "Ethereum-এর মূল্য" উল্লেখ করে, তখন তারা ইথারের মূল্য বর্ণনা করে। + +## ইথার মিন্টিং {#minting-ether} + +মিন্টিং হল এমন একটি প্রক্রিয়া যেখানে Ethereum লেজারে নতুন ইথার তৈরি হয়। অন্তর্নিহিত Ethereum প্রোটোকল নতুন ইথার তৈরি করে, এবং একজন ব্যবহারকারীর পক্ষে ইথার তৈরি করা সম্ভব নয়। + +প্রতিটি প্রস্তাবিত ব্লকের জন্য একটি পুরস্কার হিসাবে এবং কনসেন্সাসে পৌঁছানোর সাথে সম্পর্কিত অন্যান্য যাচাইকারী কার্যকলাপের জন্য প্রতিটি যুগ চেকপয়েন্টে ইথার মিন্ট করা হয়। ইস্যু করা মোট পরিমাণ যাচাইকারীর সংখ্যা এবং তারা কত ইথার স্টেক করেছে তার উপর নির্ভর করে। এই মোট ইস্যুয়েন্সটি আদর্শ ক্ষেত্রে যাচাইকারীদের মধ্যে সমানভাবে বিভক্ত হয় যে সমস্ত যাচাইকারী সৎ এবং অনলাইন, কিন্তু বাস্তবে, এটি যাচাইকারীর কার্যকারিতার উপর ভিত্তি করে পরিবর্তিত হয়। মোট ইস্যুয়েন্সের প্রায় 1/8 ব্লক প্রস্তাবকের কাছে যায়; বাকিটা অন্যান্য যাচাইকারীদের মধ্যে বিতরণ করা হয়। ব্লক প্রস্তাবকরা লেনদেন ফি এবং MEV-সম্পর্কিত আয় থেকে টিপসও পান, কিন্তু এগুলি পুনর্ব্যবহৃত ইথার থেকে আসে, নতুন ইস্যুয়েন্স থেকে নয়। + +## ইথার বার্ন করা {#burning-ether} + +ব্লক রিওয়ার্ডের মাধ্যমে ইথার তৈরির পাশাপাশি, 'বার্নিং' নামক একটি প্রক্রিয়ার মাধ্যমে ইথার ধ্বংস করা যেতে পারে। যখন ইথার বার্ন করা হয়, তখন এটি স্থায়ীভাবে প্রচলন থেকে সরানো হয়। + +Ethereum-এর প্রতিটি লেনদেনে ইথার বার্ন হয়। যখন ব্যবহারকারীরা তাদের লেনদেনের জন্য অর্থ প্রদান করে, তখন একটি বেস গ্যাস ফি, যা লেনদেনের চাহিদা অনুযায়ী নেটওয়ার্ক দ্বারা সেট করা হয়, তা ধ্বংস হয়ে যায়। এটি, পরিবর্তনশীল ব্লক আকার এবং একটি সর্বোচ্চ গ্যাস ফি সহ, Ethereum-এ লেনদেন ফি অনুমানকে সহজ করে। যখন নেটওয়ার্কের চাহিদা বেশি থাকে, তখন [ব্লকগুলি](https://eth.blockscout.com/block/22580057) তাদের মিন্ট করার চেয়ে বেশি ইথার বার্ন করতে পারে, যা কার্যকরভাবে ইথার ইস্যুয়েন্সকে অফসেট করে। + +বেস ফি বার্ন করা একজন ব্লক প্রযোজকের লেনদেন ম্যানিপুলেট করার ক্ষমতাকে বাধা দেয়। উদাহরণস্বরূপ, যদি ব্লক প্রযোজকরা বেস ফি পেতেন, তাহলে তারা বিনামূল্যে তাদের নিজস্ব লেনদেন অন্তর্ভুক্ত করতে পারত এবং অন্য সবার জন্য বেস ফি বাড়িয়ে দিত। বিকল্পভাবে, তারা অফচেইনে কিছু ব্যবহারকারীকে বেস ফি ফেরত দিতে পারে, যা একটি আরও অস্বচ্ছ এবং জটিল লেনদেন ফি বাজারের দিকে নিয়ে যায়। + +## ইথারের বিভাজন {#denominations} + +যেহেতু Ethereum-এ অনেক লেনদেনের মান কম, তাই ইথারের বেশ কয়েকটি বিভাজন রয়েছে যা অ্যাকাউন্টের ছোট একক হিসাবে উল্লেখ করা যেতে পারে। এই বিভাজনগুলির মধ্যে, Wei এবং gwei বিশেষভাবে গুরুত্বপূর্ণ। + +Wei হল ইথারের ক্ষুদ্রতম সম্ভাব্য পরিমাণ, এবং ফলস্বরূপ, অনেক প্রযুক্তিগত বাস্তবায়ন, যেমন [Ethereum Yellowpaper](https://ethereum.github.io/yellowpaper/paper.pdf), Wei-তে সমস্ত গণনা ভিত্তি করবে। + +Gwei, গিগা-ওয়েই এর সংক্ষিপ্ত রূপ, প্রায়শই Ethereum-এ গ্যাস খরচ বর্ণনা করতে ব্যবহৃত হয়। + +| বিভাজন | ইথারে মান | সাধারণ ব্যবহার | +| ------ | ---------------- | ------------------------- | +| Wei | 10-18 | প্রযুক্তিগত বাস্তবায়ন | +| Gwei | 10-9 | মানুষের পাঠযোগ্য গ্যাস ফি | + +## ইথার স্থানান্তর করা {#transferring-ether} + +Ethereum-এর প্রতিটি লেনদেনে একটি `value` ক্ষেত্র থাকে, যা প্রেরকের ঠিকানা থেকে প্রাপকের ঠিকানায় পাঠানোর জন্য wei-তে নির্ধারিত স্থানান্তরিত করা ইথারের পরিমাণ নির্দিষ্ট করে। + +যখন প্রাপকের ঠিকানা একটি [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) হয়, তখন এই স্থানান্তরিত ইথারটি স্মার্ট কন্ট্র্যাক্ট তার কোড কার্যকর করার সময় গ্যাসের জন্য অর্থ প্রদান করতে ব্যবহার করা যেতে পারে। + +[লেনদেন সম্পর্কে আরও](/developers/docs/transactions/) + +## ইথার কোয়েরি করা {#querying-ether} + +ব্যবহারকারীরা অ্যাকাউন্টের `balance` ক্ষেত্রটি পরিদর্শন করে যেকোনো [অ্যাকাউন্টের](/developers/docs/accounts/) ইথার ব্যালেন্স জিজ্ঞাসা করতে পারে, যা wei-তে নির্ধারিত ইথার হোল্ডিং দেখায়। + +[Etherscan](https://etherscan.io) এবং [Blockscout](https://eth.blockscout.com) হল ওয়েব-ভিত্তিক অ্যাপ্লিকেশনগুলির মাধ্যমে ঠিকানার ব্যালেন্স পরিদর্শন করার জন্য জনপ্রিয় টুল। উদাহরণস্বরূপ, [এই Blockscout পৃষ্ঠাটি](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) Ethereum Foundation-এর ব্যালেন্স দেখায়। অ্যাকাউন্ট ব্যালেন্স ওয়ালেট ব্যবহার করে বা সরাসরি নোডগুলিতে অনুরোধ করে জিজ্ঞাসা করা যেতে পারে। + +## আরও পড়ুন {#further-reading} + +- [ইথার এবং Ethereum সংজ্ঞায়িত করা](https://www.cmegroup.com/education/courses/introduction-to-ether/defining-ether-and-ethereum.html) – _CME Group_ +- [Ethereum Whitepaper](/whitepaper/): Ethereum-এর জন্য মূল প্রস্তাব। এই নথিতে ইথারের একটি বিবরণ এবং এটি তৈরির পেছনের প্রেরণা অন্তর্ভুক্ত রয়েছে। +- [Gwei ক্যালকুলেটর](https://www.alchemy.com/gwei-calculator): wei, gwei এবং ইথার সহজে রূপান্তর করতে এই gwei ক্যালকুলেটরটি ব্যবহার করুন। কেবলমাত্র যেকোনো পরিমাণ wei, gwei, বা ETH প্লাগ ইন করুন এবং স্বয়ংক্রিয়ভাবে রূপান্তর গণনা করুন। + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/intro-to-ethereum/index.md b/public/content/translations/bn/developers/docs/intro-to-ethereum/index.md new file mode 100644 index 00000000000..f409aadbffe --- /dev/null +++ b/public/content/translations/bn/developers/docs/intro-to-ethereum/index.md @@ -0,0 +1,124 @@ +--- +title: "ইথেরিয়ামের প্রযুক্তিগত ভূমিকা" +description: "Ethereum-এর মূল ধারণাগুলির সাথে একজন ড্যাপ (dapp) ডেভেলপারের পরিচিতি।" +lang: bn +--- + +## ->পৃষ্ঠা-কি-হয়-ইথেরিয়াম-ব্লকচেইন-হিসাব-শিরোনাম? {#what-is-a-blockchain} + +ব্লকচেইন হলো একটি পাবলিক ডাটাবেস যা একটি নেটওয়ার্কের অনেক কম্পিউটারে আপডেট এবং শেয়ার করা হয়। + +"ব্লক" বলতে বোঝায় ডেটা এবং স্টেট যা "ব্লক" নামে পরিচিত পরপর গ্রুপে সংরক্ষণ করা হয়। আপনি যদি অন্য কাউকে ETH পাঠান, লেনদেন সফল হওয়ার জন্য লেনদেনের ডেটা একটি ব্লকে যোগ করতে হবে। + +"চেইন" বলতে বোঝায় যে প্রতিটি ব্লক ক্রিপ্টোগ্রাফিকভাবে তার প্যারেন্টকে রেফারেন্স করে। অন্য কথায়, ব্লকগুলো একসাথে চেইন করা হয়। একটি ব্লকের ডেটা পরবর্তী সমস্ত ব্লক পরিবর্তন না করে পরিবর্তন করা যায় না, যার জন্য পুরো নেটওয়ার্কের কনসেন্সাস প্রয়োজন হবে। + +নেটওয়ার্কের প্রতিটি কম্পিউটারকে অবশ্যই প্রতিটি নতুন ব্লক এবং পুরো চেইনের উপর একমত হতে হবে। এই কম্পিউটারগুলি "নোড" নামে পরিচিত। নোডগুলি নিশ্চিত করে যে ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করা প্রত্যেকের কাছে একই ডেটা রয়েছে। এই ডিস্ট্রিবিউটেড চুক্তি সম্পন্ন করার জন্য, ব্লকচেইনগুলির একটি কনসেন্সাস মেকানিজম প্রয়োজন। + +Ethereum একটি [প্রুফ-অফ-স্টেক-ভিত্তিক কনসেন্সাস মেকানিজম](/developers/docs/consensus-mechanisms/pos/) ব্যবহার করে। যে কেউ চেইনে নতুন ব্লক যোগ করতে চায় তাকে অবশ্যই জামানত হিসাবে ETH - Ethereum-এর নেটিভ মুদ্রা - স্টেক করতে হবে এবং ভ্যালিডেটর সফ্টওয়্যার চালাতে হবে। এই "ভ্যালিডেটরদের" তখন এলোমেলোভাবে ব্লক প্রস্তাব করার জন্য নির্বাচন করা যেতে পারে যা অন্যান্য ভ্যালিডেটররা পরীক্ষা করে এবং ব্লকচেইনে যোগ করে। পুরস্কার এবং শাস্তির একটি সিস্টেম রয়েছে যা অংশগ্রহণকারীদের সৎ হতে এবং যতটা সম্ভব অনলাইনে উপলব্ধ থাকতে দৃঢ়ভাবে উৎসাহিত করে। + +আপনি যদি দেখতে চান কিভাবে ব্লকচেইন ডেটা হ্যাস করা হয় এবং পরবর্তীতে ব্লক রেফারেন্সের ইতিহাসে যুক্ত করা হয়, তাহলে অ্যান্ডার্স ব্রাউনওয়ার্থের [এই ডেমোটি](https://andersbrownworth.com/blockchain/blockchain) দেখতে ভুলবেন না এবং নীচের ভিডিওটি দেখুন। + +ব্লকচেইনে অ্যান্ডার্সের হ্যাস ব্যাখ্যা দেখুন: + + + +## ইথেরিয়াম কী? {#what-is-ethereum} + +Ethereum হল একটি ব্লকচেইন যার মধ্যে একটি কম্পিউটার এমবেড করা আছে। এটি একটি বিকেন্দ্রীভূত, অনুমতিহীন, সেন্সরশিপ-প্রতিরোধী উপায়ে অ্যাপ এবং সংস্থা তৈরির ভিত্তি। + +Ethereum ইউনিভার্সে, একটি একক, ক্যানোনিকাল কম্পিউটার রয়েছে (যাকে ইথিরিয়াম ভার্চুয়াল মেশিন বা EVM বলা হয়) যার স্টেটের উপর Ethereum নেটওয়ার্কের সবাই একমত। Ethereum নেটওয়ার্কে অংশগ্রহণকারী প্রত্যেকে (প্রতিটি Ethereum নোড) এই কম্পিউটারের স্টেটের একটি অনুলিপি রাখে। অতিরিক্তভাবে, যেকোনো অংশগ্রহণকারী এই কম্পিউটারকে নির্বিচারে গণনা সম্পাদন করার জন্য একটি অনুরোধ ব্রডকাস্ট করতে পারে। যখনই এই ধরনের একটি অনুরোধ ব্রডকাস্ট করা হয়, নেটওয়ার্কের অন্যান্য অংশগ্রহণকারীরা গণনাটি যাচাই, বৈধকরণ এবং সম্পাদন ("এক্সিকিউট") করে। এই এক্সিকিউশন EVM-এ একটি স্টেট পরিবর্তনের কারণ হয়, যা পুরো নেটওয়ার্কে কমিটেড এবং প্রচারিত হয়। + +গণনার জন্য অনুরোধগুলিকে লেনদেনের অনুরোধ বলা হয়; সমস্ত লেনদেনের রেকর্ড এবং EVM-এর বর্তমান স্টেট ব্লকচেইনে সংরক্ষণ করা হয়, যা ঘুরেফিরে সমস্ত নোড দ্বারা সংরক্ষণ করা হয় এবং সম্মত হয়। + +ক্রিপ্টোগ্রাফিক মেকানিজম নিশ্চিত করে যে একবার লেনদেন বৈধ হিসাবে যাচাই করা হয়ে গেলে এবং ব্লকচেইনে যুক্ত করা হলে, সেগুলি পরে বিকৃত করা যাবে না। একই মেকানিজমগুলি এটাও নিশ্চিত করে যে সমস্ত লেনদেন উপযুক্ত "অনুমতি" সহ স্বাক্ষরিত এবং কার্যকর করা হয়েছে (এলিসের অ্যাকাউন্ট থেকে ডিজিটাল সম্পদ পাঠানোর ক্ষমতা এলিস ছাড়া আর কারো থাকা উচিত নয়)। + +## ইথার কী? {#what-is-ether} + +**Ether (ETH)** হল Ethereum-এর নেটিভ ক্রিপটোকারেন্সি। ETH-এর উদ্দেশ্য হল গণনার জন্য একটি বাজারের সুযোগ দেওয়া। এই ধরনের একটি বাজার অংশগ্রহণকারীদের লেনদেনের অনুরোধ যাচাই ও কার্যকর করতে এবং নেটওয়ার্কে গণনামূলক রিসোর্স সরবরাহ করতে একটি অর্থনৈতিক উৎসাহ প্রদান করে। + +যেকোনো অংশগ্রহণকারী যিনি একটি লেনদেনের অনুরোধ ব্রডকাস্ট করেন তাকে অবশ্যই বাউন্টি হিসাবে নেটওয়ার্কে কিছু পরিমাণ ETH অফার করতে হবে। নেটওয়ার্ক বাউন্টির একটি অংশ পুড়িয়ে ফেলবে এবং বাকিটা তাকে পুরস্কার দেবে যে অবশেষে লেনদেন যাচাই, সম্পাদন, ব্লকচেইনে কমিট করা এবং নেটওয়ার্কে ব্রডকাস্ট করার কাজ করে। + +প্রদত্ত ETH-এর পরিমাণ গণনার জন্য প্রয়োজনীয় রিসোর্সের সাথে সঙ্গতিপূর্ণ। এই বাউন্টিগুলি দূষিত অংশগ্রহণকারীদের ইচ্ছাকৃতভাবে অসীম গণনা বা অন্যান্য রিসোর্স-ইনটেনসিভ স্ক্রিপ্ট চালানোর অনুরোধ করে নেটওয়ার্ককে বাধা দেওয়া থেকে বিরত রাখে, কারণ এই অংশগ্রহণকারীদের গণনার রিসোর্সের জন্য অর্থ প্রদান করতে হয়। + +ETH তিনটি প্রধান উপায়ে নেটওয়ার্কে ক্রিপ্টো-অর্থনৈতিক নিরাপত্তা প্রদান করতেও ব্যবহৃত হয়: ১) এটি ভ্যালিডেটরদের পুরস্কৃত করার একটি উপায় হিসাবে ব্যবহৃত হয় যারা ব্লক প্রস্তাব করে বা অন্যান্য ভ্যালিডেটরদের অসাধু আচরণের কথা জানায়; ২) এটি ভ্যালিডেটরদের দ্বারা স্টেক করা হয়, যা অসাধু আচরণের বিরুদ্ধে জামানত হিসাবে কাজ করে—যদি ভ্যালিডেটররা অসদাচরণ করার চেষ্টা করে তবে তাদের ETH ধ্বংস করা যেতে পারে; ৩) এটি নতুন প্রস্তাবিত ব্লকগুলির জন্য 'ভোট' ওজন করতে ব্যবহৃত হয়, যা কনসেন্সাস মেকানিজমের ফর্ক-চয়েস অংশে ফিড করে। + +## স্মার্ট কন্ট্রাক্ট কী? {#what-are-smart-contracts} + +বাস্তবে, অংশগ্রহণকারীরা যখনই EVM-এ গণনার অনুরোধ করতে চায়, প্রতিবার নতুন কোড লেখে না। বরং, অ্যাপ্লিকেশন ডেভেলপাররা প্রোগ্রাম (পুনরায় ব্যবহারযোগ্য কোড স্নিপেট) EVM স্টেটে আপলোড করে এবং ব্যবহারকারীরা বিভিন্ন প্যারামিটার সহ এই কোড স্নিপেটগুলি চালানোর জন্য অনুরোধ করে। আমরা নেটওয়ার্কে আপলোড করা এবং চালানো প্রোগ্রামগুলিকে "স্মার্ট কন্ট্রাক্ট" বলি। + +খুব প্রাথমিক স্তরে, আপনি একটি স্মার্ট কন্ট্রাক্টকে এক ধরনের ভেন্ডিং মেশিনের মতো ভাবতে পারেন: একটি স্ক্রিপ্ট যা নির্দিষ্ট প্যারামিটার দিয়ে কল করা হলে, নির্দিষ্ট শর্ত পূরণ হলে কিছু কাজ বা গণনা করে। উদাহরণস্বরূপ, একটি সাধারণ ভেন্ডর স্মার্ট কন্ট্রাক্ট একটি ডিজিটাল সম্পদের মালিকানা তৈরি এবং বরাদ্দ করতে পারে যদি কলার একটি নির্দিষ্ট প্রাপককে ETH পাঠায়। + +যেকোনো ডেভেলপার একটি স্মার্ট কন্ট্রাক্ট তৈরি করতে এবং এটিকে নেটওয়ার্কের কাছে পাবলিক করতে পারে, ব্লকচেইনকে তার ডেটা লেয়ার হিসাবে ব্যবহার করে, নেটওয়ার্কে প্রদত্ত একটি ফি-এর বিনিময়ে। যেকোনো ব্যবহারকারী তখন স্মার্ট কন্ট্রাক্টকে তার কোড চালানোর জন্য কল করতে পারে, আবারও নেটওয়ার্কে প্রদত্ত একটি ফি-এর বিনিময়ে। + +এইভাবে, স্মার্ট কন্ট্রাক্টের মাধ্যমে, ডেভেলপাররা নির্বিচারে জটিল ব্যবহারকারী-মুখী অ্যাপ এবং পরিষেবা যেমন: মার্কেটপ্লেস, আর্থিক উপকরণ, গেম ইত্যাদি তৈরি এবং ডেপ্লয় করতে পারে। + +## পরিভাষা {#terminology} + +### ব্লকচেইন {#blockchain} + +নেটওয়ার্কের ইতিহাসে Ethereum নেটওয়ার্কে কমিট করা সমস্ত ব্লকের ক্রম। এরকম নামকরণ করা হয়েছে কারণ প্রতিটি ব্লকে পূর্ববর্তী ব্লকের একটি রেফারেন্স থাকে, যা আমাদের সমস্ত ব্লকের উপর একটি ক্রম বজায় রাখতে সাহায্য করে (এবং এইভাবে সঠিক ইতিহাসের উপরও)। + +### ETH {#eth} + +**Ether (ETH)** হল Ethereum-এর নেটিভ ক্রিপটোকারেন্সি। ব্যবহারকারীরা তাদের কোড এক্সিকিউশন অনুরোধগুলি পূরণ করার জন্য অন্যান্য ব্যবহারকারীদের ETH প্রদান করে। + +[ETH সম্পর্কে আরও](/developers/docs/intro-to-ether/) + +### EVM {#evm} + +ইথিরিয়াম ভার্চুয়াল মেশিন হল গ্লোবাল ভার্চুয়াল কম্পিউটার যার স্টেট Ethereum নেটওয়ার্কের প্রত্যেক অংশগ্রহণকারী সংরক্ষণ করে এবং তাতে একমত হয়। যেকোনো অংশগ্রহণকারী EVM-এ নির্বিচারে কোড চালানোর জন্য অনুরোধ করতে পারে; কোড এক্সিকিউশন EVM-এর স্টেট পরিবর্তন করে। + +[EVM সম্পর্কে আরও](/developers/docs/evm/) + +### নোড {#nodes} + +বাস্তব-জীবনের মেশিন যা EVM স্টেট সংরক্ষণ করছে। নোডগুলি একে অপরের সাথে যোগাযোগ করে EVM স্টেট এবং নতুন স্টেট পরিবর্তন সম্পর্কে তথ্য প্রচার করতে। যেকোনো ব্যবহারকারী একটি নোড থেকে কোড এক্সিকিউশন অনুরোধ ব্রডকাস্ট করে কোড এক্সিকিউশনের জন্য অনুরোধ করতে পারে। Ethereum নেটওয়ার্ক নিজেই সমস্ত Ethereum নোড এবং তাদের যোগাযোগের সমষ্টি। + +[নোড সম্পর্কে আরও](/developers/docs/nodes-and-clients/) + +### অ্যাকাউন্ট {#accounts} + +যেখানে ETH সংরক্ষণ করা হয়। ব্যবহারকারীরা অ্যাকাউন্ট শুরু করতে পারে, অ্যাকাউন্টে ETH জমা করতে পারে এবং তাদের অ্যাকাউন্ট থেকে অন্য ব্যবহারকারীদের কাছে ETH স্থানান্তর করতে পারে। অ্যাকাউন্ট এবং অ্যাকাউন্ট ব্যালেন্স EVM-এর একটি বড় টেবিলে সংরক্ষণ করা হয়; এগুলি সামগ্রিক EVM স্টেটের একটি অংশ। + +[অ্যাকাউন্ট সম্পর্কে আরও](/developers/docs/accounts/) + +### লেনদেন {#transactions} + +একটি "লেনদেনের অনুরোধ" হল EVM-এ কোড এক্সিকিউশনের অনুরোধের আনুষ্ঠানিক পরিভাষা, এবং একটি "লেনদেন" হল একটি পূরণ করা লেনদেনের অনুরোধ এবং EVM স্টেটের সংশ্লিষ্ট পরিবর্তন। যেকোনো ব্যবহারকারী একটি নোড থেকে নেটওয়ার্কে একটি লেনদেনের অনুরোধ ব্রডকাস্ট করতে পারে। লেনদেনের অনুরোধটি সম্মত EVM স্টেটকে প্রভাবিত করার জন্য, এটিকে অন্য নোড দ্বারা যাচাই, এক্সিকিউট এবং "নেটওয়ার্কে কমিট" করতে হবে। যেকোনো কোড এক্সিকিউশন EVM-এ একটি স্টেট পরিবর্তনের কারণ হয়; কমিট করার পরে, এই স্টেট পরিবর্তনটি নেটওয়ার্কের সমস্ত নোডে ব্রডকাস্ট করা হয়। লেনদেনের কিছু উদাহরণ: + +- আমার অ্যাকাউন্ট থেকে এলিসের অ্যাকাউন্টে X ETH পাঠান। +- কিছু স্মার্ট কন্ট্রাক্ট কোড EVM স্টেটে প্রকাশ করুন। +- EVM-এ ঠিকানা X-এ থাকা স্মার্ট কন্ট্রাক্টের কোড, আর্গুমেন্ট Y সহ এক্সিকিউট করুন। + +[লেনদেন সম্পর্কে আরও](/developers/docs/transactions/) + +### ব্লক {#blocks} + +লেনদেনের পরিমাণ খুব বেশি, তাই লেনদেনগুলি ব্যাচে বা ব্লকে "কমিটেড" হয়। ব্লকগুলিতে সাধারণত কয়েক ডজন থেকে শত শত লেনদেন থাকে। + +[ব্লক সম্পর্কে আরও](/developers/docs/blocks/) + +### স্মার্ট কন্ট্রাক্ট {#smart-contracts} + +কোডের একটি পুনঃব্যবহারযোগ্য স্নিপেট (একটি প্রোগ্রাম) যা একজন ডেভেলপার EVM স্টেটে প্রকাশ করে। যেকোনো ব্যক্তি একটি লেনদেনের অনুরোধ করে স্মার্ট কন্ট্রাক্ট কোডটি এক্সিকিউট করার জন্য অনুরোধ করতে পারে। কারণ ডেভেলপাররা EVM-এ নির্বিচারে এক্সিকিউটেবল অ্যাপ্লিকেশন লিখতে পারে (গেম, মার্কেটপ্লেস, আর্থিক উপকরণ, ইত্যাদি) স্মার্ট কন্ট্রাক্ট প্রকাশ করার মাধ্যমে, এগুলিকে প্রায়ই [ডিএ্যাপস, বা ডিসেন্ট্রালাইজড এপ্লিকেশন](/developers/docs/dapps/) বলা হয়। + +[স্মার্ট কন্ট্রাক্ট সম্পর্কে আরও](/developers/docs/smart-contracts/) + +## আরও পড়ুন {#further-reading} + +- [Ethereum হোয়াইটপেপার](/whitepaper/) +- [Ethereum কীভাবে কাজ করে?](https://medium.com/@preethikasireddy/how-does-ethereum-work-anyway-22d1df506369) - _প্রীতি কাসিরেড্ডি_ (**বিশেষ দ্রষ্টব্য** এই রিসোর্সটি এখনও মূল্যবান তবে সচেতন থাকুন যে এটি [The Merge](/roadmap/merge)-এর পূর্ববর্তী এবং তাই এখনও Ethereum-এর প্রুফ-অফ-ওয়ার্ক মেকানিজমকে বোঝায় - Ethereum এখন আসলে [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos) ব্যবহার করে সুরক্ষিত) + +### আপনি কি দেখে শিখতে বেশি পছন্দ করেন? {#visual-learner} + +এই ভিডিও সিরিজটি মৌলিক বিষয়গুলির একটি পুঙ্খানুপুঙ্খ অন্বেষণ অফার করে: + + + +[Ethereum বেসিকস প্লেলিস্ট](https://youtube.com/playlist?list=PLqgutSGloqiJyyoL0zvLVFPS-GMD2wKa5&si=kZTf5I7PKGTXDsOZ) + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [একজন ডেভেলপারের জন্য Ethereum-এর নির্দেশিকা, পর্ব ১](/developers/tutorials/a-developers-guide-to-ethereum-part-one/) _– Python এবং web3.py ব্যবহার করে Ethereum-এর একটি খুব শিক্ষানবিস-বান্ধব অন্বেষণ_ diff --git a/public/content/translations/bn/developers/docs/mev/index.md b/public/content/translations/bn/developers/docs/mev/index.md new file mode 100644 index 00000000000..ef9fb8de297 --- /dev/null +++ b/public/content/translations/bn/developers/docs/mev/index.md @@ -0,0 +1,221 @@ +--- +title: "ম্যাক্সিমাল এক্সট্রাক্টবল ভ্যালু (MEV)" +description: "ম্যাক্সিমাল এক্সট্রাক্টবল ভ্যালু (MEV)-এর একটি ভূমিকা" +lang: bn +--- + +ম্যাক্সিমাল এক্সট্রাক্টবল ভ্যালু (MEV) বলতে একটি ব্লকে লেনদেন অন্তর্ভুক্ত করা, বাদ দেওয়া এবং ক্রম পরিবর্তন করার মাধ্যমে স্ট্যান্ডার্ড ব্লক রিওয়ার্ড এবং গ্যাস ফি-এর অতিরিক্ত ব্লক উৎপাদন থেকে যে সর্বোচ্চ ভ্যালু বের করা যায়, তাকে বোঝায়। + +## ম্যাক্সিমাল এক্সট্রাক্টবল ভ্যালু {#maximal-extractable-value} + +ম্যাক্সিমাল এক্সট্রাক্টবল ভ্যালু প্রথম [প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow/)-এর প্রেক্ষাপটে প্রয়োগ করা হয়েছিল এবং প্রাথমিকভাবে একে "মাইনার এক্সট্রাক্টবল ভ্যালু" হিসাবে উল্লেখ করা হয়েছিল। এর কারণ হল, প্রুফ-অফ-ওয়ার্কে মাইনাররা লেনদেন অন্তর্ভুক্ত করা, বাদ দেওয়া এবং ক্রম নিয়ন্ত্রণ করে। তবে, [দ্য মার্জ](/roadmap/merge)-এর মাধ্যমে প্রুফ-অফ-স্টেক-এ স্থানান্তরের পর থেকে, ভ্যালিডেটররা এই ভূমিকাগুলির জন্য দায়ী, এবং মাইনিং এখন আর Ethereum প্রোটোকলের অংশ নয়। তবে, ভ্যালু বের করার পদ্ধতিগুলো এখনও বিদ্যমান, তাই এখন এর পরিবর্তে "ম্যাক্সিমাল এক্সট্রাক্টবল ভ্যালু" শব্দটি ব্যবহার করা হয়। + +## পূর্বশর্ত {#prerequisites} + +নিশ্চিত করুন যে আপনি [লেনদেন](/developers/docs/transactions/), [ব্লক](/developers/docs/blocks/), [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos) এবং [গ্যাস](/developers/docs/gas/) সম্পর্কে পরিচিত। [ডিঅ্যাপস](/apps/) এবং [ডিফাই](/defi/)-এর সাথে পরিচিতি থাকাও সহায়ক। + +## MEV এক্সট্র্যাকশন {#mev-extraction} + +তত্ত্বগতভাবে, MEV সম্পূর্ণরূপে ভ্যালিডেটরদের কাছে জমা হয় কারণ তারাই একমাত্র পক্ষ যারা একটি লাভজনক MEV সুযোগের এক্সিকিউশন নিশ্চিত করতে পারে। তবে, বাস্তবে, MEV-এর একটি বড় অংশ "সার্চার" নামে পরিচিত স্বাধীন নেটওয়ার্ক অংশগ্রহণকারীদের দ্বারা বের করা হয়। সার্চাররা ব্লকচেইন ডেটার উপর জটিল অ্যালগরিদম চালায় লাভজনক MEV সুযোগ শনাক্ত করার জন্য এবং তাদের কাছে বট থাকে যা স্বয়ংক্রিয়ভাবে সেই লাভজনক লেনদেনগুলি নেটওয়ার্কে জমা দেয়। + +ভ্যালিডেটররা যাইহোক সম্পূর্ণ MEV পরিমাণের একটি অংশ পায় কারণ সার্চাররা তাদের লাভজনক লেনদেনগুলিকে একটি ব্লকে অন্তর্ভুক্ত করার উচ্চতর সম্ভাবনার বিনিময়ে উচ্চ গ্যাস ফি (যা ভ্যালিডেটরের কাছে যায়) দিতে ইচ্ছুক। ধরে নেওয়া যাক সার্চাররা অর্থনৈতিকভাবে যুক্তিসঙ্গত, একজন সার্চার যে গ্যাস ফি দিতে ইচ্ছুক তা তার MEV-এর ১০০% পর্যন্ত একটি পরিমাণ হবে (কারণ গ্যাস ফি বেশি হলে, সার্চার টাকা হারাবে)। + +এর সাথে, কিছু অত্যন্ত প্রতিযোগিতামূলক MEV সুযোগের জন্য, যেমন [DEX আরবিট্রেজ](#mev-examples-dex-arbitrage), সার্চারদের তাদের মোট MEV আয়ের ৯০% বা তারও বেশি ভ্যালিডেটরকে গ্যাস ফি হিসাবে দিতে হতে পারে কারণ অনেক লোক একই লাভজনক আরবিট্রেজ ট্রেড চালাতে চায়। এর কারণ হল, তাদের আরবিট্রেজ লেনদেন যে চলবে তা নিশ্চিত করার একমাত্র উপায় হল যদি তারা সর্বোচ্চ গ্যাস মূল্যে লেনদেনটি জমা দেয়। + +### গ্যাস গল্ফিং {#mev-extraction-gas-golfing} + +এই ডাইনামিকটি "গ্যাস গল্ফিং"-এ ভালো হওয়াকে - লেনদেনগুলিকে এমনভাবে প্রোগ্রামিং করা যাতে তারা সর্বনিম্ন পরিমাণ গ্যাস ব্যবহার করে - একটি প্রতিযোগিতামূলক সুবিধা তৈরি করেছে, কারণ এটি সার্চারদের তাদের মোট গ্যাস ফি স্থির রেখে একটি উচ্চতর গ্যাস মূল্য সেট করতে দেয় (যেহেতু গ্যাস ফি = গ্যাস মূল্য \* ব্যবহৃত গ্যাস)। + +কিছু সুপরিচিত গ্যাস গল্ফ কৌশলের মধ্যে রয়েছে: শূন্যের দীর্ঘ স্ট্রিং দিয়ে শুরু হওয়া অ্যাড্রেস ব্যবহার করা (যেমন, [0x0000000000C521824EaFf97Eac7B73B084ef9306](https://eth.blockscout.com/address/0x0000000000C521824EaFf97Eac7B73B084ef9306)) কারণ সেগুলি সঞ্চয় করতে কম জায়গা (এবং তাই গ্যাস) নেয়; এবং চুক্তিতে ছোট [ERC-20](/developers/docs/standards/tokens/erc-20/) টোকেন ব্যালেন্স রেখে দেওয়া, কারণ একটি স্টোরেজ স্লট আপডেট করার চেয়ে একটি স্টোরেজ স্লট ইনিশিয়ালাইজ করতে (যদি ব্যালেন্স 0 হয়) বেশি গ্যাস খরচ হয়। গ্যাস ব্যবহার কমানোর জন্য আরও কৌশল খুঁজে বের করা সার্চারদের মধ্যে গবেষণার একটি সক্রিয় ক্ষেত্র। + +### জেনারেলাইজড ফ্রন্টরানার {#mev-extraction-generalized-frontrunners} + +লাভজনক MEV সুযোগ সনাক্ত করার জন্য জটিল অ্যালগরিদম প্রোগ্রামিং করার পরিবর্তে, কিছু সার্চার জেনারেলাইজড ফ্রন্টরানার চালায়। জেনারেলাইজড ফ্রন্টরানার হল এমন বট যা লাভজনক লেনদেন সনাক্ত করতে মেমপুল দেখে। ফ্রন্টরানার সম্ভাব্য লাভজনক লেনদেনের কোড কপি করবে, অ্যাড্রেসগুলিকে ফ্রন্টরানারের অ্যাড্রেস দিয়ে প্রতিস্থাপন করবে, এবং পরিবর্তিত লেনদেনটি ফ্রন্টরানারের অ্যাড্রেসে লাভ এনে দেয় কিনা তা দুবার পরীক্ষা করার জন্য স্থানীয়ভাবে লেনদেনটি চালাবে। যদি লেনদেনটি সত্যিই লাভজনক হয়, ফ্রন্টরানার পরিবর্তিত লেনদেনটি প্রতিস্থাপিত অ্যাড্রেস এবং একটি উচ্চতর গ্যাস মূল্য সহ জমা দেবে, মূল লেনদেনকে "ফ্রন্টরানিং" করবে এবং মূল সার্চারের MEV পাবে। + +### ফ্ল্যাশবট {#mev-extraction-flashbots} + +ফ্ল্যাশবট হল একটি স্বাধীন প্রকল্প যা এক্সিকিউশন ক্লায়েন্টদের একটি পরিষেবা দিয়ে প্রসারিত করে যা সার্চারদের পাবলিক মেমপুলে প্রকাশ না করে ভ্যালিডেটরদের কাছে MEV লেনদেন জমা দেওয়ার অনুমতি দেয়। এটি লেনদেনগুলিকে জেনারেলাইজড ফ্রন্টরানারদের দ্বারা ফ্রন্টরান হওয়া থেকে বাধা দেয়। + +## MEV উদাহরণ {#mev-examples} + +ব্লকচেইনে MEV কয়েকটি উপায়ে আবির্ভূত হয়। + +### DEX আরবিট্রেজ {#mev-examples-dex-arbitrage} + +[ডিসেন্ট্রালাইজড এক্সচেঞ্জ](/glossary/#dex) (DEX) আরবিট্রেজ হল সবচেয়ে সহজ এবং সবচেয়ে পরিচিত MEV সুযোগ। ফলস্বরূপ, এটি সবচেয়ে প্রতিযোগিতামূলকও। + +এটি এইভাবে কাজ করে: যদি দুটি DEX দুটি ভিন্ন মূল্যে একটি টোকেন অফার করে, তবে কেউ কম মূল্যের DEX-এ টোকেনটি কিনতে পারে এবং এটিকে একটি একক, অ্যাটমিক লেনদেনে উচ্চ মূল্যের DEX-এ বিক্রি করতে পারে। ব্লকচেইনের মেকানিক্সের জন্য ধন্যবাদ, এটি সত্যিকারের, ঝুঁকিমুক্ত আরবিট্রেজ। + +[এখানে](https://eth.blockscout.com/tx/0x5e1657ef0e9be9bc72efefe59a2528d0d730d478cfc9e6cdd09af9f997bb3ef4) একটি লাভজনক আরবিট্রেজ লেনদেনের উদাহরণ যেখানে একজন সার্চার Uniswap বনাম Sushiswap-এ ETH/DAI পেয়ারের ভিন্ন মূল্যের সুবিধা নিয়ে 1,000 ETH কে 1,045 ETH-এ পরিণত করেছে। + +### লিকুইডেশন {#mev-examples-liquidations} + +লেন্ডিং প্রোটোকল লিকুইডেশন আরেকটি সুপরিচিত MEV সুযোগ উপস্থাপন করে। + +মেকার এবং অ্যাভের মতো লেন্ডিং প্রোটোকলগুলির জন্য ব্যবহারকারীদের কিছু কোল্যাটারাল (যেমন, ETH) জমা করতে হয়। এই জমাকৃত কোল্যাটারাল তারপর অন্য ব্যবহারকারীদের ধার দেওয়ার জন্য ব্যবহৃত হয়। + +ব্যবহারকারীরা তখন তাদের প্রয়োজনের উপর নির্ভর করে অন্যদের কাছ থেকে সম্পদ এবং টোকেন ধার করতে পারে (যেমন, আপনি যদি একটি MakerDAO গভর্নেন্স প্রস্তাবে ভোট দিতে চান তবে আপনি MKR ধার করতে পারেন) তাদের জমাকৃত কোল্যাটারালের একটি নির্দিষ্ট শতাংশ পর্যন্ত। উদাহরণস্বরূপ, যদি ধার করার পরিমাণ সর্বোচ্চ ৩০% হয়, একজন ব্যবহারকারী যিনি প্রোটোকলে ১০০ DAI জমা দেন তিনি অন্য একটি সম্পদের ৩০ DAI মূল্যের পর্যন্ত ধার করতে পারেন। প্রোটোকলটি সঠিক ধার করার ক্ষমতার শতাংশ নির্ধারণ করে। + +একজন ঋণগ্রহীতার কোল্যাটারালের মূল্য যেমন ওঠানামা করে, তেমনি তাদের ধার করার ক্ষমতাও ওঠানামা করে। যদি, বাজারের ওঠানামার কারণে, ধার করা সম্পদের মূল্য তাদের কোল্যাটারালের মূল্যের ৩০% অতিক্রম করে (আবার, সঠিক শতাংশ প্রোটোকল দ্বারা নির্ধারিত হয়), প্রোটোকলটি সাধারণত যে কাউকে কোল্যাটারাল লিকুইডেট করার অনুমতি দেয়, সঙ্গে সঙ্গে ঋণদাতাদের পরিশোধ করে (এটি ঐতিহ্যবাহী অর্থায়নে [মার্জিন কল](https://www.investopedia.com/terms/m/margincall.asp) কীভাবে কাজ করে তার অনুরূপ)। লিকুইডেট হলে, ঋণগ্রহীতাকে সাধারণত একটি মোটা লিকুইডেশন ফি দিতে হয়, যার কিছু অংশ লিকুইডেটরের কাছে যায় - এখানেই MEV সুযোগ আসে। + +সার্চাররা যত দ্রুত সম্ভব ব্লকচেইন ডেটা পার্স করার জন্য প্রতিযোগিতা করে তা নির্ধারণ করতে যে কোন ঋণগ্রহীতাদের লিকুইডেট করা যেতে পারে এবং একটি লিকুইডেশন লেনদেন জমা দেওয়ার জন্য প্রথম হতে এবং নিজেদের জন্য লিকুইডেশন ফি সংগ্রহ করতে। + +### স্যান্ডউইচ ট্রেডিং {#mev-examples-sandwich-trading} + +স্যান্ডউইচ ট্রেডিং MEV এক্সট্র্যাকশনের আরেকটি সাধারণ পদ্ধতি। + +স্যান্ডউইচ করতে, একজন সার্চার বড় DEX ট্রেডের জন্য মেমপুল দেখবে। উদাহরণস্বরূপ, ধরুন কেউ Uniswap-এ DAI দিয়ে ১০,০০০ UNI কিনতে চায়। এই মাত্রার একটি ট্রেড UNI/DAI পেয়ারে একটি অর্থপূর্ণ প্রভাব ফেলবে, যা সম্ভাব্যভাবে DAI-এর তুলনায় UNI-এর দাম উল্লেখযোগ্যভাবে বাড়িয়ে দেবে। + +একজন সার্চার UNI/DAI পেয়ারে এই বড় ট্রেডের আনুমানিক মূল্য প্রভাব গণনা করতে পারে এবং বড় ট্রেডের ঠিক _আগে_ একটি সর্বোত্তম বাই অর্ডার এক্সিকিউট করতে পারে, সস্তায় UNI কিনে, তারপর বড় ট্রেডের ঠিক _পরে_ একটি সেল অর্ডার এক্সিকিউট করতে পারে, বড় অর্ডারের কারণে সৃষ্ট উচ্চ মূল্যে এটি বিক্রি করে। + +স্যান্ডউইচিং, তবে, আরও ঝুঁকিপূর্ণ কারণ এটি অ্যাটমিক নয় (উপরে বর্ণিত DEX আরবিট্রেজের মতো নয়) এবং এটি একটি [সালমোনেলা অ্যাটাক](https://github.com/Defi-Cartel/salmonella)-এর জন্য প্রবণ। + +### NFT MEV {#mev-examples-nfts} + +NFT স্পেসে MEV একটি উদীয়মান ঘটনা, এবং এটি অগত্যা লাভজনক নয়। + +তবে, যেহেতু NFT লেনদেনগুলি অন্য সমস্ত Ethereum লেনদেন দ্বারা শেয়ার করা একই ব্লকচেইনে ঘটে, তাই সার্চাররা NFT বাজারে ঐতিহ্যবাহী MEV সুযোগগুলিতে ব্যবহৃত কৌশলগুলির মতো একই কৌশল ব্যবহার করতে পারে। + +উদাহরণস্বরূপ, যদি একটি জনপ্রিয় NFT ড্রপ থাকে এবং একজন সার্চার একটি নির্দিষ্ট NFT বা NFT-এর সেট চায়, তবে তারা এমনভাবে একটি লেনদেন প্রোগ্রাম করতে পারে যাতে তারা NFT কেনার জন্য লাইনে প্রথম থাকে, অথবা তারা একটি একক লেনদেনে NFT-এর পুরো সেটটি কিনতে পারে। অথবা যদি একটি NFT [ভুলবশত কম দামে তালিকাভুক্ত হয়](https://www.theblockcrypto.com/post/113546/mistake-sees-69000-cryptopunk-sold-for-less-than-a-cent), একজন সার্চার অন্য ক্রেতাদের ফ্রন্টরান করতে পারে এবং সস্তায় এটি তুলে নিতে পারে। + +NFT MEV-এর একটি বিশিষ্ট উদাহরণ ঘটেছিল যখন একজন সার্চার ফ্লোর প্রাইসে প্রতিটি ক্রিপ্টোপাঙ্ক [কিনতে](https://eth.blockscout.com/address/0x650dCdEB6ecF05aE3CAF30A70966E2F395d5E9E5?tab=txs) ৭ মিলিয়ন ডলার খরচ করেছিল। একজন ব্লকচেইন গবেষক [টুইটারে ব্যাখ্যা করেছেন](https://twitter.com/IvanBogatyy/status/1422232184493121538) কিভাবে ক্রেতা তাদের কেনাকাটা গোপন রাখতে একজন MEV প্রদানকারীর সাথে কাজ করেছিল। + +### দ্য লং টেইল {#mev-examples-long-tail} + +DEX আরবিট্রেজ, লিকুইডেশন এবং স্যান্ডউইচ ট্রেডিং সবই খুব পরিচিত MEV সুযোগ এবং নতুন সার্চারদের জন্য লাভজনক হওয়ার সম্ভাবনা কম। তবে, কম পরিচিত MEV সুযোগের একটি দীর্ঘ তালিকা রয়েছে (NFT MEV তর্কসাপেক্ষে এমনই একটি সুযোগ)। + +যারা সবে শুরু করছেন সেই সার্চাররা এই দীর্ঘ তালিকায় MEV অনুসন্ধান করে আরও সাফল্য পেতে সক্ষম হতে পারেন। ফ্ল্যাশবটের [MEV জব বোর্ড](https://github.com/flashbots/mev-job-board) কিছু উদীয়মান সুযোগ তালিকাভুক্ত করে। + +## MEV-এর প্রভাব {#effects-of-mev} + +MEV সব খারাপ নয় — Ethereum-এ MEV-এর ইতিবাচক এবং নেতিবাচক উভয় পরিণতি রয়েছে। + +### ভালো দিক {#effects-of-mev-the-good} + +অনেক ডিফাই প্রকল্প তাদের প্রোটোকলের উপযোগিতা এবং স্থিতিশীলতা নিশ্চিত করতে অর্থনৈতিকভাবে যুক্তিসঙ্গত অভিনেতাদের উপর নির্ভর করে। উদাহরণস্বরূপ, DEX আরবিট্রেজ নিশ্চিত করে যে ব্যবহারকারীরা তাদের টোকেনের জন্য সেরা, সবচেয়ে সঠিক মূল্য পায়, এবং ঋণদাতাদের পরিশোধ করা নিশ্চিত করতে লেন্ডিং প্রোটোকলগুলি দ্রুত লিকুইডেশনের উপর নির্ভর করে যখন ঋণগ্রহীতারা কোল্যাটার‍্যালাইজেশন অনুপাতের নিচে নেমে যায়। + +অর্থনৈতিক অদক্ষতা খোঁজা এবং ঠিক করা এবং প্রোটোকলের অর্থনৈতিক প্রণোদনার সুবিধা নেওয়া যুক্তিসঙ্গত সার্চার ছাড়া, ডিফাই প্রোটোকল এবং সাধারণভাবে ডিঅ্যাপসগুলি আজকের মতো শক্তিশালী নাও হতে পারে। + +### খারাপ দিক {#effects-of-mev-the-bad} + +অ্যাপ্লিকেশন লেয়ারে, MEV-এর কিছু রূপ, যেমন স্যান্ডউইচ ট্রেডিং, ব্যবহারকারীদের জন্য নিঃসন্দেহে একটি খারাপ অভিজ্ঞতার কারণ হয়। যেসব ব্যবহারকারীরা স্যান্ডউইচের শিকার হন তারা তাদের ট্রেডে বর্ধিত স্লিপেজ এবং খারাপ এক্সিকিউশনের সম্মুখীন হন। + +নেটওয়ার্ক লেয়ারে, জেনারেলাইজড ফ্রন্টরানার এবং তারা যে গ্যাস-মূল্যের নিলামে প্রায়ই অংশ নেয় (যখন দুই বা ততোধিক ফ্রন্টরানার তাদের লেনদেনকে পরবর্তী ব্লকে অন্তর্ভুক্ত করার জন্য তাদের নিজস্ব লেনদেনের গ্যাস মূল্য ক্রমাগত বাড়িয়ে প্রতিযোগিতা করে) তার ফলে নেটওয়ার্ক কনজেশন এবং অন্য সবার জন্য যারা সাধারণ লেনদেন চালানোর চেষ্টা করছে তাদের জন্য উচ্চ গ্যাস মূল্য হয়। + +ব্লকের _ভিতরে_ যা ঘটছে তার বাইরেও, MEV ব্লকের _মধ্যে_ ক্ষতিকর প্রভাব ফেলতে পারে। যদি একটি ব্লকে উপলব্ধ MEV স্ট্যান্ডার্ড ব্লক রিওয়ার্ডকে উল্লেখযোগ্যভাবে ছাড়িয়ে যায়, তাহলে ভ্যালিডেটররা ব্লক রিঅর্গানাইজ করতে এবং নিজেদের জন্য MEV ক্যাপচার করতে উৎসাহিত হতে পারে, যার ফলে ব্লকচেইন রিঅর্গানাইজেশন এবং কনসেন্সাস অস্থিতিশীলতা দেখা দেয়। + +ব্লকচেইন রিঅর্গানাইজেশনের এই সম্ভাবনা [পূর্বে বিটকয়েন ব্লকচেইনে অন্বেষণ করা হয়েছে](https://dl.acm.org/doi/10.1145/2976749.2978408)। যেহেতু বিটকয়েনের ব্লক রিওয়ার্ড অর্ধেক হয়ে যায় এবং লেনদেন ফি ব্লক রিওয়ার্ডের একটি বৃহত্তর এবং বৃহত্তর অংশ তৈরি করে, এমন পরিস্থিতি দেখা দেয় যেখানে মাইনারদের জন্য পরবর্তী ব্লকের রিওয়ার্ড ছেড়ে দেওয়া এবং পরিবর্তে উচ্চতর ফি সহ অতীতের ব্লকগুলি রিমাইন করা অর্থনৈতিকভাবে যুক্তিসঙ্গত হয়ে ওঠে। MEV-এর বৃদ্ধির সাথে সাথে, Ethereum-এও একই ধরণের পরিস্থিতি ঘটতে পারে, যা ব্লকচেইনের অখণ্ডতাকে হুমকির মুখে ফেলবে। + +## MEV-এর অবস্থা {#state-of-mev} + +২০২১ সালের শুরুতে MEV এক্সট্র্যাকশন ব্যাপকভাবে বৃদ্ধি পায়, যার ফলে বছরের প্রথম কয়েক মাসে অত্যন্ত উচ্চ গ্যাস মূল্য দেখা যায়। ফ্ল্যাশবটের MEV রিলে-এর উত্থান জেনারেলাইজড ফ্রন্টরানারদের কার্যকারিতা হ্রাস করেছে এবং গ্যাস মূল্যের নিলাম অফচেইনে নিয়ে গেছে, যা সাধারণ ব্যবহারকারীদের জন্য গ্যাস মূল্য কমিয়েছে। + +যদিও অনেক সার্চার এখনও MEV থেকে ভালো অর্থ উপার্জন করছে, সুযোগগুলি আরও পরিচিত হওয়ার সাথে সাথে এবং আরও বেশি সার্চার একই সুযোগের জন্য প্রতিযোগিতা করার সাথে সাথে, ভ্যালিডেটররা আরও বেশি মোট MEV আয় ক্যাপচার করবে (কারণ মূলত উপরে বর্ণিত একই ধরণের গ্যাস নিলাম ফ্ল্যাশবটেও ঘটে, যদিও ব্যক্তিগতভাবে, এবং ভ্যালিডেটররা ফলস্বরূপ গ্যাস আয় ক্যাপচার করবে)। MEV শুধুমাত্র Ethereum-এর জন্য অনন্য নয়, এবং Ethereum-এ সুযোগগুলি আরও প্রতিযোগিতামূলক হওয়ার সাথে সাথে সার্চাররা Binance Smart Chain-এর মতো বিকল্প ব্লকচেইনে চলে যাচ্ছে, যেখানে Ethereum-এর মতো একই রকম MEV সুযোগ কম প্রতিযোগিতা সহ বিদ্যমান। + +অন্যদিকে, প্রুফ-অফ-ওয়ার্ক থেকে প্রুফ-অফ-স্টেকে রূপান্তর এবং রোলআপ ব্যবহার করে Ethereum স্কেল করার চলমান প্রচেষ্টা সবই MEV ল্যান্ডস্কেপকে এমনভাবে পরিবর্তন করে যা এখনও কিছুটা অস্পষ্ট। প্রুফ-অফ-ওয়ার্কের সম্ভাব্যতা মডেলের তুলনায় সামান্য আগে থেকে পরিচিত গ্যারান্টিযুক্ত ব্লক-প্রস্তাবকদের থাকা MEV এক্সট্র্যাকশনের গতিশীলতাকে কীভাবে পরিবর্তন করে বা যখন [একক গোপন নেতা নির্বাচন](https://ethresear.ch/t/secret-non-single-leader-election/11789) এবং [ডিস্ট্রিবিউটেড ভ্যালিডেটর প্রযুক্তি](/staking/dvt/) প্রয়োগ করা হবে তখন এটি কীভাবে ব্যাহত হবে তা এখনও ভালভাবে জানা যায়নি। একইভাবে, যখন বেশিরভাগ ব্যবহারকারী কার্যকলাপ Ethereum থেকে এবং এর লেয়ার 2 রোলআপ এবং শার্ডগুলিতে স্থানান্তরিত হয় তখন কী MEV সুযোগ বিদ্যমান থাকে তা এখনও দেখা বাকি। + +## Ethereum প্রুফ-অফ-স্টেক (PoS)-এ MEV {#mev-in-ethereum-proof-of-stake} + +যেমনটি ব্যাখ্যা করা হয়েছে, সামগ্রিক ব্যবহারকারীর অভিজ্ঞতা এবং কনসেন্সাস-লেয়ার সুরক্ষার জন্য MEV-এর নেতিবাচক প্রভাব রয়েছে। কিন্তু Ethereum-এর একটি প্রুফ-অফ-স্টেক কনসেন্সাসে রূপান্তর ("দ্য মার্জ" নামে পরিচিত) সম্ভাব্যভাবে নতুন MEV-সম্পর্কিত ঝুঁকি তৈরি করে: + +### ভ্যালিডেটর সেন্ট্রালাইজেশন {#validator-centralization} + +মার্জ-পরবর্তী Ethereum-এ, ভ্যালিডেটররা (32 ETH-এর নিরাপত্তা আমানত করার পর) বিকন চেইনে যোগ করা ব্লকের বৈধতার উপর কনসেন্সাসে আসে। যেহেতু 32 ETH অনেকের নাগালের বাইরে হতে পারে, তাই [একটি স্টেকিং পুলে যোগদান করা](/staking/pools/) একটি আরও সম্ভাব্য বিকল্প হতে পারে। তবুও, [সোলো স্টেকারদের](/staking/solo/) একটি স্বাস্থ্যকর বন্টন আদর্শ, কারণ এটি ভ্যালিডেটরদের সেন্ট্রালাইজেশন প্রশমিত করে এবং Ethereum-এর নিরাপত্তা উন্নত করে। + +তবে, বিশ্বাস করা হয় যে MEV এক্সট্র্যাকশন ভ্যালিডেটর সেন্ট্রালাইজেশন ত্বরান্বিত করতে সক্ষম। এর আংশিক কারণ হল, যেহেতু ভ্যালিডেটররা মাইনারদের আগের তুলনায় [ব্লক প্রস্তাব করার জন্য কম উপার্জন করে](/roadmap/merge/issuance/#how-the-merge-impacts-ETH-supply), MEV এক্সট্র্যাকশন [দ্য মার্জ](/roadmap/merge/) থেকে ভ্যালিডেটরদের উপার্জন ব্যাপকভাবে [প্রভাবিত করেছে](https://github.com/flashbots/eth2-research/blob/main/notebooks/mev-in-eth2/eth2-mev-calc.ipynb)। + +বৃহত্তর স্টেকিং পুলগুলির MEV সুযোগগুলি ক্যাপচার করার জন্য প্রয়োজনীয় অপ্টিমাইজেশনে বিনিয়োগ করার জন্য সম্ভবত আরও বেশি রিসোর্স থাকবে। এই পুলগুলি যত বেশি MEV এক্সট্র্যাক্ট করবে, তাদের MEV-এক্সট্র্যাকশন ক্ষমতা উন্নত করার জন্য (এবং সামগ্রিক রাজস্ব বাড়ানোর জন্য) তাদের তত বেশি রিসোর্স থাকবে, যা মূলত [ইকোনমিক্স অফ স্কেল](https://www.investopedia.com/terms/e/economiesofscale.asp#) তৈরি করে। + +তাদের হাতে কম রিসোর্স থাকায়, সোলো স্টেকাররা MEV সুযোগ থেকে লাভ করতে অক্ষম হতে পারে। এটি স্বাধীন ভ্যালিডেটরদের উপর তাদের আয় বাড়াতে শক্তিশালী স্টেকিং পুলগুলিতে যোগদানের জন্য চাপ বাড়াতে পারে, যা Ethereum-এ ডিসেন্ট্রালাইজেশন হ্রাস করে। + +### পারমিশনড মেমপুল {#permissioned-mempools} + +স্যান্ডউইচিং এবং ফ্রন্টরানিং অ্যাটাকের প্রতিক্রিয়ায়, ট্রেডাররা লেনদেনের গোপনীয়তার জন্য ভ্যালিডেটরদের সাথে অফচেইন ডিল করা শুরু করতে পারে। একটি সম্ভাব্য MEV লেনদেন পাবলিক মেমপুলে পাঠানোর পরিবর্তে, ট্রেডার এটি সরাসরি ভ্যালিডেটরের কাছে পাঠায়, যিনি এটিকে একটি ব্লকে অন্তর্ভুক্ত করেন এবং ট্রেডারের সাথে লাভ ভাগ করে নেন। + +“ডার্ক পুল” হল এই ব্যবস্থার একটি বৃহত্তর সংস্করণ এবং এটি পারমিশনড, শুধুমাত্র-অ্যাক্সেস মেমপুল হিসাবে কাজ করে যা নির্দিষ্ট ফি দিতে ইচ্ছুক ব্যবহারকারীদের জন্য উন্মুক্ত। এই প্রবণতা Ethereum-এর পারমিশনলেসনেস এবং ট্রাস্টলেসনেস হ্রাস করবে এবং সম্ভাব্যভাবে ব্লকচেইনকে একটি “পে-টু-প্লে” মেকানিজমে রূপান্তরিত করবে যা সর্বোচ্চ দরদাতাকে সুবিধা দেয়। + +পারমিশনড মেমপুলগুলি আগের বিভাগে বর্ণিত সেন্ট্রালাইজেশন ঝুঁকিগুলিও ত্বরান্বিত করবে। একাধিক ভ্যালিডেটর চালানো বড় পুলগুলি সম্ভবত ট্রেডার এবং ব্যবহারকারীদের লেনদেনের গোপনীয়তা অফার করে উপকৃত হবে, যা তাদের MEV আয় বৃদ্ধি করবে। + +মার্জ-পরবর্তী Ethereum-এ এই MEV-সম্পর্কিত সমস্যাগুলির বিরুদ্ধে লড়াই করা গবেষণার একটি মূল ক্ষেত্র। আজ পর্যন্ত, দ্য মার্জের পরে Ethereum-এর ডিসেন্ট্রালাইজেশন এবং সুরক্ষার উপর MEV-এর নেতিবাচক প্রভাব কমাতে প্রস্তাবিত দুটি সমাধান হল [**প্রপোজার-বিল্ডার সেপারেশন (PBS)**](/roadmap/pbs/) এবং [**বিল্ডার API**](https://github.com/ethereum/builder-specs)। + +### প্রপোজার-বিল্ডার সেপারেশন {#proposer-builder-separation} + +প্রুফ-অফ-ওয়ার্ক এবং প্রুফ-অফ-স্টেক উভয় ক্ষেত্রেই, একটি নোড যা একটি ব্লক তৈরি করে তা কনসেন্সাসে অংশগ্রহণকারী অন্যান্য নোডগুলির কাছে চেইনে যোগ করার জন্য এটি প্রস্তাব করে। একটি নতুন ব্লক ক্যানোনিকাল চেইনের অংশ হয়ে যায় যখন অন্য একজন মাইনার এর উপরে তৈরি করে (PoW-তে) অথবা এটি বেশিরভাগ ভ্যালিডেটরের কাছ থেকে অ্যাটেস্টেশন পায় (PoS-তে)। + +ব্লক প্রডিউসার এবং ব্লক প্রপোজার ভূমিকার সংমিশ্রণই পূর্বে বর্ণিত বেশিরভাগ MEV-সম্পর্কিত সমস্যা তৈরি করে। উদাহরণস্বরূপ, কনসেন্সাস নোডগুলি MEV আয় সর্বাধিক করার জন্য [টাইম-ব্যান্ডিট অ্যাটাকে](https://www.mev.wiki/attack-examples/time-bandit-attack) চেইন রিঅর্গানাইজেশন ট্রিগার করতে উৎসাহিত হয়। + +[প্রপোজার-বিল্ডার সেপারেশন](https://ethresear.ch/t/proposer-block-builder-separation-friendly-fee-market-designs/9725) (PBS) MEV-এর প্রভাব প্রশমিত করার জন্য ডিজাইন করা হয়েছে, বিশেষ করে কনসেন্সাস লেয়ারে। PBS-এর প্রধান বৈশিষ্ট্য হল ব্লক প্রডিউসার এবং ব্লক প্রপোজার নিয়মের পৃথকীকরণ। ভ্যালিডেটররা এখনও ব্লক প্রস্তাব এবং ভোট দেওয়ার জন্য দায়ী, কিন্তু **ব্লক বিল্ডার** নামক একটি নতুন শ্রেণীর বিশেষায়িত সত্তাকে লেনদেন অর্ডার করা এবং ব্লক তৈরির দায়িত্ব দেওয়া হয়েছে। + +PBS-এর অধীনে, একজন ব্লক বিল্ডার একটি লেনদেন বান্ডিল তৈরি করে এবং একটি বিকন চেইন ব্লকে ("এক্সিকিউশন পেলোড" হিসাবে) অন্তর্ভুক্তির জন্য একটি বিড রাখে। পরবর্তী ব্লক প্রস্তাব করার জন্য নির্বাচিত ভ্যালিডেটর তারপর বিভিন্ন বিড পরীক্ষা করে এবং সর্বোচ্চ ফি সহ বান্ডিলটি বেছে নেয়। PBS মূলত একটি নিলাম বাজার তৈরি করে, যেখানে বিল্ডাররা ব্লকস্পেস বিক্রি করা ভ্যালিডেটরদের সাথে আলোচনা করে। + +বর্তমান PBS ডিজাইনগুলি একটি [কমিট-রিভিল স্কিম](https://gitcoin.co/blog/commit-reveal-scheme-on-ethereum/) ব্যবহার করে যেখানে বিল্ডাররা শুধুমাত্র তাদের বিডের সাথে একটি ব্লকের বিষয়বস্তুর (ব্লক হেডার) একটি ক্রিপ্টোগ্রাফিক কমিটমেন্ট প্রকাশ করে। বিজয়ী বিড গ্রহণ করার পরে, প্রপোজার একটি স্বাক্ষরিত ব্লক প্রস্তাব তৈরি করে যাতে ব্লক হেডার অন্তর্ভুক্ত থাকে। ব্লক বিল্ডারের স্বাক্ষরিত ব্লক প্রস্তাব দেখার পরে সম্পূর্ণ ব্লক বডি প্রকাশ করার কথা, এবং চূড়ান্ত হওয়ার আগে এটিকে ভ্যালিডেটরদের কাছ থেকে পর্যাপ্ত [অ্যাটেস্টেশন](/glossary/#attestation) পেতে হবে। + +#### প্রপোজার-বিল্ডার সেপারেশন কীভাবে MEV-এর প্রভাব প্রশমিত করে? {#how-does-pbs-curb-mev-impact} + +ইন-প্রোটোকল প্রপোজার-বিল্ডার সেপারেশন ভ্যালিডেটরদের আওতা থেকে MEV এক্সট্র্যাকশন সরিয়ে দিয়ে কনসেন্সাসের উপর MEV-এর প্রভাব হ্রাস করে। পরিবর্তে, বিশেষায়িত হার্ডওয়্যার চালানো ব্লক বিল্ডাররা ভবিষ্যতে MEV সুযোগগুলি ক্যাপচার করবে। + +তবে, এটি ভ্যালিডেটরদের MEV-সম্পর্কিত আয় থেকে সম্পূর্ণরূপে বাদ দেয় না, কারণ বিল্ডারদের তাদের ব্লক ভ্যালিডেটরদের দ্বারা গৃহীত হওয়ার জন্য উচ্চ বিড করতে হবে। তবুও, ভ্যালিডেটররা আর সরাসরি MEV আয় অপ্টিমাইজ করার উপর মনোনিবেশ না করায়, টাইম-ব্যান্ডিট অ্যাটাকের হুমকি হ্রাস পায়। + +প্রপোজার-বিল্ডার সেপারেশন MEV-এর সেন্ট্রালাইজেশন ঝুঁকিও হ্রাস করে। উদাহরণস্বরূপ, কমিট-রিভিল স্কিম ব্যবহার করলে বিল্ডারদের ভ্যালিডেটরদের উপর বিশ্বাস রাখার প্রয়োজন দূর হয় যে তারা MEV সুযোগ চুরি করবে না বা অন্য বিল্ডারদের কাছে এটি প্রকাশ করবে না। এটি সোলো স্টেকারদের MEV থেকে উপকৃত হওয়ার জন্য বাধা কমিয়ে দেয়, অন্যথায়, বিল্ডাররা অফচেইন খ্যাতি সহ বড় পুলগুলিকে সুবিধা দেওয়ার এবং তাদের সাথে অফচেইন ডিল করার দিকে ঝুঁকবে। + +একইভাবে, ভ্যালিডেটরদের বিল্ডারদের উপর বিশ্বাস রাখতে হবে না যে তারা ব্লক বডি আটকে রাখবে না বা অবৈধ ব্লক প্রকাশ করবে না কারণ পেমেন্ট শর্তহীন। প্রস্তাবিত ব্লকটি অনুপলব্ধ বা অন্য ভ্যালিডেটরদের দ্বারা অবৈধ ঘোষিত হলেও ভ্যালিডেটরের ফি এখনও প্রসেস হয়। পরবর্তী ক্ষেত্রে, ব্লকটি কেবল বাতিল করা হয়, যা ব্লক বিল্ডারকে সমস্ত লেনদেন ফি এবং MEV আয় হারাতে বাধ্য করে। + +### বিল্ডার API {#builder-api} + +যদিও প্রপোজার-বিল্ডার সেপারেশন MEV এক্সট্র্যাকশনের প্রভাব কমানোর প্রতিশ্রুতি দেয়, এটি বাস্তবায়নের জন্য কনসেন্সাস প্রোটোকলে পরিবর্তনের প্রয়োজন। বিশেষত, বিকন চেইনের [ফর্ক চয়েস](/developers/docs/consensus-mechanisms/pos/#fork-choice) নিয়মটি আপডেট করার প্রয়োজন হবে। [বিল্ডার API](https://github.com/ethereum/builder-specs) হল একটি অস্থায়ী সমাধান যা প্রপোজার-বিল্ডার সেপারেশনের একটি কার্যকরী বাস্তবায়ন প্রদানের লক্ষ্যে, যদিও উচ্চতর বিশ্বাস অনুমানের সাথে। + +বিল্ডার API হল [ইঞ্জিন API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md)-এর একটি পরিবর্তিত সংস্করণ যা কনসেন্সাস লেয়ার ক্লায়েন্টরা এক্সিকিউশন লেয়ার ক্লায়েন্টদের কাছ থেকে এক্সিকিউশন পেলোড অনুরোধ করতে ব্যবহার করে। [অনেস্ট ভ্যালিডেটর স্পেসিফিকেশন](https://github.com/ethereum/consensus-specs/blob/dev/specs/bellatrix/validator.md)-এ যেমন বর্ণিত হয়েছে, ব্লক প্রস্তাবের দায়িত্বের জন্য নির্বাচিত ভ্যালিডেটররা একটি সংযুক্ত এক্সিকিউশন ক্লায়েন্টের কাছ থেকে একটি লেনদেন বান্ডিলের অনুরোধ করে, যা তারা প্রস্তাবিত বিকন চেইন ব্লকে অন্তর্ভুক্ত করে। + +বিল্ডার API ভ্যালিডেটর এবং এক্সিকিউশন-লেয়ার ক্লায়েন্টদের মধ্যে একটি মিডলওয়্যার হিসাবেও কাজ করে; কিন্তু এটি ভিন্ন কারণ এটি বিকন চেইনের ভ্যালিডেটরদের বাহ্যিক সত্তা থেকে ব্লক সোর্স করতে দেয় (একটি এক্সিকিউশন ক্লায়েন্ট ব্যবহার করে স্থানীয়ভাবে একটি ব্লক তৈরির পরিবর্তে)। + +নীচে বিল্ডার API কীভাবে কাজ করে তার একটি ওভারভিউ দেওয়া হল: + +1. বিল্ডার API ভ্যালিডেটরকে এক্সিকিউশন লেয়ার ক্লায়েন্ট চালানো ব্লক বিল্ডারদের একটি নেটওয়ার্কের সাথে সংযুক্ত করে। PBS-এর মতো, বিল্ডাররা হল বিশেষায়িত পক্ষ যারা রিসোর্স-ইনটেনসিভ ব্লক-বিল্ডিংয়ে বিনিয়োগ করে এবং MEV + অগ্রাধিকার টিপস থেকে অর্জিত আয় সর্বাধিক করার জন্য বিভিন্ন কৌশল ব্যবহার করে। + +2. একজন ভ্যালিডেটর (একটি কনসেন্সাস লেয়ার ক্লায়েন্ট চালাচ্ছেন) বিল্ডারদের নেটওয়ার্ক থেকে বিডের সাথে এক্সিকিউশন পেলোডের অনুরোধ করে। বিল্ডারদের বিডগুলিতে এক্সিকিউশন পেলোড হেডার—পেলোডের বিষয়বস্তুর একটি ক্রিপ্টোগ্রাফিক কমিটমেন্ট—এবং ভ্যালিডেটরকে প্রদেয় একটি ফি থাকবে। + +3. ভ্যালিডেটর আগত বিডগুলি পর্যালোচনা করে এবং সর্বোচ্চ ফি সহ এক্সিকিউশন পেলোডটি বেছে নেয়। বিল্ডার API ব্যবহার করে, ভ্যালিডেটর একটি "ব্লাইন্ডেড" বিকন ব্লক প্রস্তাব তৈরি করে যাতে শুধুমাত্র তাদের স্বাক্ষর এবং এক্সিকিউশন পেলোড হেডার অন্তর্ভুক্ত থাকে এবং এটি বিল্ডারের কাছে পাঠায়। + +4. বিল্ডার API চালানো বিল্ডার ব্লাইন্ডেড ব্লক প্রস্তাব দেখার পরে সম্পূর্ণ এক্সিকিউশন পেলোড সহ প্রতিক্রিয়া জানাবে বলে আশা করা হয়। এটি ভ্যালিডেটরকে একটি "স্বাক্ষরিত" বিকন ব্লক তৈরি করতে দেয়, যা তারা পুরো নেটওয়ার্কে প্রচার করে। + +5. বিল্ডার API ব্যবহারকারী একজন ভ্যালিডেটর এখনও স্থানীয়ভাবে একটি ব্লক তৈরি করবেন বলে আশা করা হয় যদি ব্লক বিল্ডার দ্রুত প্রতিক্রিয়া জানাতে ব্যর্থ হয়, যাতে তারা ব্লক প্রস্তাবের রিওয়ার্ড থেকে বঞ্চিত না হয়। তবে, ভ্যালিডেটর এখন-প্রকাশিত লেনদেন বা অন্য একটি সেট ব্যবহার করে অন্য কোনো ব্লক তৈরি করতে পারে না, কারণ এটি _ইকুইভোকেশন_ (একই স্লটের মধ্যে দুটি ব্লকে স্বাক্ষর করা) এর সমান হবে, যা একটি স্ল্যাশেবল অফেন্স। + +বিল্ডার API-এর একটি উদাহরণ বাস্তবায়ন হল [MEV Boost](https://github.com/flashbots/mev-boost), যা [ফ্ল্যাশবট নিলাম প্রক্রিয়া](https://docs.flashbots.net/Flashbots-auction/overview)-এর একটি উন্নতি যা Ethereum-এ MEV-এর নেতিবাচক বহিরাগত প্রভাব রোধ করার জন্য ডিজাইন করা হয়েছে। ফ্ল্যাশবট নিলাম প্রুফ-অফ-স্টেক-এ ভ্যালিডেটরদের লাভজনক ব্লক তৈরির কাজ **সার্চার** নামক বিশেষায়িত পক্ষগুলির কাছে আউটসোর্স করার অনুমতি দেয়। +![একটি ডায়াগ্রাম যা বিস্তারিতভাবে MEV প্রবাহ দেখাচ্ছে](./mev.png) + +সার্চাররা লাভজনক MEV সুযোগ খোঁজে এবং ব্লকে অন্তর্ভুক্তির জন্য একটি [সিলড-প্রাইস বিড](https://en.wikipedia.org/wiki/First-price_sealed-bid_auction) সহ ব্লক প্রপোজারদের কাছে লেনদেন বান্ডিল পাঠায়। mev-geth চালানো ভ্যালিডেটর, যা go-ethereum (Geth) ক্লায়েন্টের একটি ফর্কড সংস্করণ, তাকে শুধুমাত্র সবচেয়ে বেশি লাভ সহ বান্ডিলটি বেছে নিতে হবে এবং এটিকে নতুন ব্লকের অংশ হিসাবে অন্তর্ভুক্ত করতে হবে। ব্লক প্রপোজারদের (ভ্যালিডেটরদের) স্প্যাম এবং অবৈধ লেনদেন থেকে রক্ষা করতে, লেনদেন বান্ডিলগুলি প্রপোজারের কাছে যাওয়ার আগে ভ্যালিডেশনের জন্য **রিলেয়ারদের** মাধ্যমে যায়। + +MEV Boost মূল ফ্ল্যাশবট নিলামের একই কার্যকারিতা বজায় রাখে, যদিও Ethereum-এর প্রুফ-অফ-স্টেকে পরিবর্তনের জন্য ডিজাইন করা নতুন বৈশিষ্ট্যগুলির সাথে। সার্চাররা এখনও ব্লকে অন্তর্ভুক্তির জন্য লাভজনক MEV লেনদেন খুঁজে পায়, কিন্তু **বিল্ডার** নামক একটি নতুন শ্রেণীর বিশেষায়িত পক্ষ লেনদেন এবং বান্ডিলগুলিকে ব্লকে একত্রিত করার জন্য দায়ী। একজন বিল্ডার সার্চারদের কাছ থেকে সিলড-প্রাইস বিড গ্রহণ করে এবং সবচেয়ে লাভজনক অর্ডারিং খুঁজে পেতে অপ্টিমাইজেশন চালায়। + +রিলেয়ার এখনও প্রপোজারের কাছে পাঠানোর আগে লেনদেন বান্ডিলগুলি ভ্যালিডেট করার জন্য দায়ী। তবে, MEV Boost **এসক্রো** চালু করে যা বিল্ডারদের দ্বারা প্রেরিত ব্লক বডি এবং ভ্যালিডেটরদের দ্বারা প্রেরিত ব্লক হেডার সংরক্ষণ করে [ডেটা প্রাপ্যতা](/developers/docs/data-availability/) প্রদানের জন্য দায়ী। এখানে, একটি রিলে-এর সাথে সংযুক্ত একজন ভ্যালিডেটর উপলব্ধ এক্সিকিউশন পেলোডের জন্য জিজ্ঞাসা করে এবং সর্বোচ্চ বিড + MEV টিপস সহ পেলোড হেডার নির্বাচন করতে MEV Boost-এর অর্ডারিং অ্যালগরিদম ব্যবহার করে। + +#### বিল্ডার API কীভাবে MEV-এর প্রভাব প্রশমিত করে? {#how-does-builder-api-curb-mev-impact} + +বিল্ডার API-এর মূল সুবিধা হল MEV সুযোগগুলিতে অ্যাক্সেসকে গণতান্ত্রিক করার সম্ভাবনা। কমিট-রিভিল স্কিম ব্যবহার করা বিশ্বাসের অনুমান দূর করে এবং MEV থেকে উপকৃত হতে চাওয়া ভ্যালিডেটরদের জন্য প্রবেশের বাধা হ্রাস করে। এটি সোলো স্টেকারদের MEV লাভ বাড়ানোর জন্য বড় স্টেকিং পুলগুলির সাথে একীভূত হওয়ার চাপ কমাতে হবে। + +বিল্ডার API-এর ব্যাপক বাস্তবায়ন ব্লক বিল্ডারদের মধ্যে বৃহত্তর প্রতিযোগিতাকে উৎসাহিত করবে, যা সেন্সরশিপ প্রতিরোধ বাড়ায়। যেহেতু ভ্যালিডেটররা একাধিক বিল্ডারের কাছ থেকে বিড পর্যালোচনা করে, এক বা একাধিক ব্যবহারকারী লেনদেন সেন্সর করার উদ্দেশ্যে একজন বিল্ডারকে সফল হওয়ার জন্য অন্য সমস্ত নন-সেন্সরিং বিল্ডারদের ছাড়িয়ে যেতে হবে। এটি ব্যবহারকারীদের সেন্সর করার খরচ নাটকীয়ভাবে বাড়িয়ে দেয় এবং এই অনুশীলনকে নিরুৎসাহিত করে। + +কিছু প্রকল্প, যেমন MEV Boost, একটি সামগ্রিক কাঠামোর অংশ হিসাবে বিল্ডার API ব্যবহার করে যা নির্দিষ্ট পক্ষগুলির জন্য লেনদেনের গোপনীয়তা প্রদানের জন্য ডিজাইন করা হয়েছে, যেমন ফ্রন্টরানিং/স্যান্ডউইচিং অ্যাটাক এড়াতে চাওয়া ট্রেডাররা। এটি ব্যবহারকারী এবং ব্লক বিল্ডারদের মধ্যে একটি ব্যক্তিগত যোগাযোগ চ্যানেল সরবরাহ করে অর্জন করা হয়। পূর্বে বর্ণিত পারমিশনড মেমপুলগুলির থেকে ভিন্ন, এই পদ্ধতিটি নিম্নলিখিত কারণগুলির জন্য উপকারী: + +1. বাজারে একাধিক বিল্ডারের অস্তিত্ব সেন্সর করা অবাস্তব করে তোলে, যা ব্যবহারকারীদের উপকৃত করে। বিপরীতে, সেন্ট্রালাইজড এবং বিশ্বাস-ভিত্তিক ডার্ক পুলগুলির অস্তিত্ব কয়েকজন ব্লক বিল্ডারের হাতে ক্ষমতা কেন্দ্রীভূত করবে এবং সেন্সর করার সম্ভাবনা বাড়িয়ে দেবে। + +2. বিল্ডার API সফ্টওয়্যারটি ওপেন-সোর্স, যা যে কাউকে ব্লক-বিল্ডার পরিষেবা অফার করার অনুমতি দেয়। এর মানে হল ব্যবহারকারীরা কোনো নির্দিষ্ট ব্লক বিল্ডার ব্যবহার করতে বাধ্য নন এবং এটি Ethereum-এর নিরপেক্ষতা এবং পারমিশনলেসনেস উন্নত করে। অধিকন্তু, MEV-সন্ধানী ট্রেডাররা ব্যক্তিগত লেনদেন চ্যানেল ব্যবহার করে অনিচ্ছাকৃতভাবে সেন্ট্রালাইজেশনে অবদান রাখবে না। + +## সম্পর্কিত রিসোর্স {#related-resources} + +- [ফ্ল্যাশবট ডক্স](https://docs.flashbots.net/) +- [ফ্ল্যাশবট গিটহাব](https://github.com/flashbots/pm) +- [mevboost.org](https://www.mevboost.org/) - _MEV-Boost রিলে এবং ব্লক বিল্ডারদের জন্য রিয়েল-টাইম পরিসংখ্যান সহ ট্র্যাকার_ + +## আরও পড়ুন {#further-reading} + +- [মাইনার-এক্সট্র্যাক্টেবল ভ্যালু (MEV) কী?](https://blog.chain.link/what-is-miner-extractable-value-mev/) +- [MEV এবং আমি](https://www.paradigm.xyz/2021/02/mev-and-me) +- [Ethereum একটি অন্ধকার জঙ্গল](https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest/) +- [অন্ধকার জঙ্গল থেকে পলায়ন](https://samczsun.com/escaping-the-dark-forest/) +- [ফ্ল্যাশবট: MEV সংকটের ফ্রন্টরানিং](https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752) +- [@bertcmiller-এর MEV থ্রেড](https://twitter.com/bertcmiller/status/1402665992422047747) +- [MEV-Boost: মার্জ রেডি ফ্ল্যাশবট আর্কিটেকচার](https://ethresear.ch/t/mev-boost-merge-ready-flashbots-architecture/11177) +- [MEV Boost কী](https://www.alchemy.com/overviews/mev-boost) +- [কেন mev-boost চালাবেন?](https://writings.flashbots.net/writings/why-run-mevboost/) +- [দ্য হিচহাইকারস গাইড টু Ethereum](https://members.delphidigital.io/reports/the-hitchhikers-guide-to-ethereum) diff --git a/public/content/translations/bn/developers/docs/networking-layer/index.md b/public/content/translations/bn/developers/docs/networking-layer/index.md new file mode 100644 index 00000000000..00b16d83194 --- /dev/null +++ b/public/content/translations/bn/developers/docs/networking-layer/index.md @@ -0,0 +1,163 @@ +--- +title: "নেটওয়ার্কিং লেয়ার" +description: "ইথেরিয়ামের নেটওয়ার্কিং লেয়ারের একটি ভূমিকা।" +lang: bn +sidebarDepth: 2 +--- + +ইথেরিয়াম হল একটি পিয়ার-টু-পিয়ার নেটওয়ার্ক যেখানে হাজার হাজার নোড রয়েছে যেগুলিকে অবশ্যই প্রমিত প্রোটোকল ব্যবহার করে একে অপরের সাথে যোগাযোগ করতে সক্ষম হতে হবে। "নেটওয়ার্কিং লেয়ার" হল প্রোটোকলের স্ট্যাক যা সেই নোডগুলিকে একে অপরকে খুঁজে পেতে এবং তথ্য বিনিময় করতে দেয়। এর মধ্যে নেটওয়ার্কের মাধ্যমে তথ্যের "গসিপিং" (এক-থেকে-অনেক যোগাযোগ) এবং নির্দিষ্ট নোডগুলির মধ্যে অনুরোধ এবং প্রতিক্রিয়ার সোয়াপিং (এক-থেকে-এক যোগাযোগ) অন্তর্ভুক্ত রয়েছে। প্রতিটি নোডকে অবশ্যই নির্দিষ্ট নেটওয়ার্কিং নিয়ম মেনে চলতে হবে যাতে তারা সঠিক তথ্য প্রেরণ এবং গ্রহণ করছে তা নিশ্চিত করা যায়। + +ক্লায়েন্ট সফটওয়্যারের দুটি অংশ রয়েছে (এক্সিকিউশন ক্লায়েন্ট এবং কনসেন্সাস ক্লায়েন্ট), প্রতিটির নিজস্ব স্বতন্ত্র নেটওয়ার্কিং স্ট্যাক রয়েছে। অন্যান্য ইথেরিয়াম নোডের সাথে যোগাযোগের পাশাপাশি, এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্টদের একে অপরের সাথে যোগাযোগ করতে হয়। এই পৃষ্ঠাটি সেই প্রোটোকলগুলির একটি পরিচায়ক ব্যাখ্যা প্রদান করে যা এই যোগাযোগকে সক্ষম করে। + +এক্সিকিউশন ক্লায়েন্টরা এক্সিকিউশন-লেয়ার পিয়ার-টু-পিয়ার নেটওয়ার্কের মাধ্যমে ট্রানজ্যাকশন গসিপ করে। এর জন্য প্রমাণীকৃত পিয়ারদের মধ্যে এনক্রিপ্ট করা যোগাযোগের প্রয়োজন। যখন একজন ভ্যালিডেটরকে একটি ব্লক প্রস্তাব করার জন্য নির্বাচন করা হয়, তখন নোডের স্থানীয় ট্রানজ্যাকশন পুল থেকে ট্রানজ্যাকশনগুলি একটি স্থানীয় RPC সংযোগের মাধ্যমে কনসেন্সাস ক্লায়েন্টদের কাছে পাঠানো হবে, যা বিকন ব্লকে প্যাকেজ করা হবে। কনসেন্সাস ক্লায়েন্টরা তখন তাদের পিটুপি (p2p) নেটওয়ার্কে বিকন ব্লকগুলি গসিপ করবে। এর জন্য দুটি পৃথক পিটুপি (p2p) নেটওয়ার্ক প্রয়োজন: একটি ট্রানজ্যাকশন গসিপের জন্য এক্সিকিউশন ক্লায়েন্টদের সংযোগ করে এবং অন্যটি ব্লক গসিপের জন্য কনসেন্সাস ক্লায়েন্টদের সংযোগ করে। + +## পূর্বশর্ত {#prerequisites} + +ইথেরিয়াম [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) সম্পর্কে কিছু জ্ঞান এই পৃষ্ঠাটি বোঝার জন্য সহায়ক হবে। + +## এক্সিকিউশন লেয়ার {#execution-layer} + +এক্সিকিউশন লেয়ারের নেটওয়ার্কিং প্রোটোকল দুটি স্ট্যাকে বিভক্ত: + +- ডিসকভারি স্ট্যাক: UDP-এর উপর নির্মিত এবং একটি নতুন নোডকে সংযোগ করার জন্য পিয়ার খুঁজে পেতে সাহায্য করে। + +- DevP2P স্ট্যাক: TCP-এর উপরে বসে এবং নোডগুলিকে তথ্য বিনিময় করতে সক্ষম করে। + +দুটি স্ট্যাকই সমান্তরালভাবে কাজ করে। ডিসকভারি স্ট্যাক নতুন নেটওয়ার্ক অংশগ্রহণকারীদের নেটওয়ার্কে ফিড করে, এবং DevP2P স্ট্যাক তাদের মিথস্ক্রিয়া সক্ষম করে। + +### ডিসকভারি {#discovery} + +ডিসকভারি হল নেটওয়ার্কে অন্যান্য নোড খুঁজে বের করার প্রক্রিয়া। এটি বুটনোডগুলির একটি ছোট সেট ব্যবহার করে বুটস্ট্র্যাপ করা হয় (নোড যাদের ঠিকানা ক্লায়েন্টে [হার্ডকোড করা](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go) থাকে যাতে সেগুলি অবিলম্বে খুঁজে পাওয়া যায় এবং ক্লায়েন্টকে পিয়ারদের সাথে সংযোগ করতে পারে)। এই বুটনোডগুলি শুধুমাত্র একটি নতুন নোডকে এক সেট পিয়ারদের সাথে পরিচয় করিয়ে দেওয়ার জন্য বিদ্যমান - এটিই তাদের একমাত্র উদ্দেশ্য, তারা চেইন সিঙ্ক করার মতো সাধারণ ক্লায়েন্ট কাজগুলিতে অংশ নেয় না, এবং সেগুলি শুধুমাত্র প্রথমবার ক্লায়েন্ট চালু করার সময় ব্যবহৃত হয়। + +নোড-বুটনোড মিথস্ক্রিয়ার জন্য ব্যবহৃত প্রোটোকল হল [Kademlia](https://medium.com/coinmonks/a-brief-overview-of-kademlia-and-its-use-in-various-decentralized-platforms-da08a7f72b8f)-এর একটি পরিবর্তিত রূপ যা নোডের তালিকা শেয়ার করার জন্য একটি [ডিস্ট্রিবিউটেড হ্যাস টেবিল](https://en.wikipedia.org/wiki/Distributed_hash_table) ব্যবহার করে। প্রতিটি নোডের কাছে এই টেবিলের একটি সংস্করণ রয়েছে যেখানে তার নিকটতম পিয়ারদের সাথে সংযোগ করার জন্য প্রয়োজনীয় তথ্য থাকে। এই 'নৈকট্য' ভৌগোলিক নয় - দূরত্ব নোডের আইডির সাদৃশ্য দ্বারা সংজ্ঞায়িত করা হয়। প্রতিটি নোডের টেবিল একটি নিরাপত্তা বৈশিষ্ট্য হিসাবে নিয়মিত রিফ্রেশ করা হয়। উদাহরণস্বরূপ, [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5) ডিসকভারি প্রোটোকলে, নোডগুলি 'বিজ্ঞাপন' পাঠাতে সক্ষম যা ক্লায়েন্ট সমর্থন করে এমন সাবপ্রোটোকলগুলি প্রদর্শন করে, যা পিয়ারদেরকে এমন প্রোটোকল সম্পর্কে আলোচনা করতে দেয় যা তারা উভয়ই যোগাযোগের জন্য ব্যবহার করতে পারে। + +ডিসকভারি PING-PONG খেলার মাধ্যমে শুরু হয়। একটি সফল PING-PONG নতুন নোডটিকে একটি বুটনোডের সাথে "বন্ড" করে। নেটওয়ার্কে প্রবেশকারী একটি নতুন নোডের অস্তিত্ব সম্পর্কে একটি বুটনোডকে সতর্ক করে এমন প্রাথমিক বার্তাটি হল একটি `PING`। এই `PING`-এ নতুন নোড, বুটনোড এবং একটি মেয়াদ শেষ হওয়ার টাইম-স্ট্যাম্প সম্পর্কে হ্যাশ করা তথ্য অন্তর্ভুক্ত থাকে। বুটনোড `PING` গ্রহণ করে এবং `PING` হ্যাস ধারণকারী একটি `PONG` ফেরত দেয়। যদি `PING` এবং `PONG` হ্যাস মিলে যায় তবে নতুন নোড এবং বুটনোডের মধ্যে সংযোগটি যাচাই করা হয় এবং বলা হয় যে তারা "বন্ডেড" হয়েছে। + +একবার বন্ডেড হয়ে গেলে, নতুন নোড বুটনোডকে একটি `FIND-NEIGHBOURS` অনুরোধ পাঠাতে পারে। বুটনোড দ্বারা ফেরত দেওয়া ডেটাতে এমন পিয়ারদের একটি তালিকা অন্তর্ভুক্ত থাকে যার সাথে নতুন নোড সংযোগ করতে পারে। যদি নোডগুলি বন্ডেড না হয়, `FIND-NEIGHBOURS` অনুরোধটি ব্যর্থ হবে, তাই নতুন নোডটি নেটওয়ার্কে প্রবেশ করতে পারবে না। + +নতুন নোডটি বুটনোড থেকে প্রতিবেশীদের একটি তালিকা পাওয়ার পরে, এটি তাদের প্রত্যেকের সাথে একটি PING-PONG এক্সচেঞ্জ শুরু করে। সফল PING-PONG নতুন নোডকে তার প্রতিবেশীদের সাথে বন্ড করে, বার্তা বিনিময় সক্ষম করে। + +``` +ক্লায়েন্ট শুরু করুন --> বুটনোডে সংযোগ করুন --> বুটনোডে বন্ড করুন --> প্রতিবেশী খুঁজুন --> প্রতিবেশীদের সাথে বন্ড করুন +``` + +এক্সিকিউশন ক্লায়েন্টরা বর্তমানে [Discv4](https://github.com/ethereum/devp2p/blob/master/discv4.md) ডিসকভারি প্রোটোকল ব্যবহার করছে এবং [Discv5](https://github.com/ethereum/devp2p/tree/master/discv5) প্রোটোকলে স্থানান্তরিত করার জন্য একটি সক্রিয় প্রচেষ্টা চলছে। + +#### ENR: ইথেরিয়াম নোড রেকর্ডস {#enr} + +[ইথেরিয়াম নোড রেকর্ড (ENR)](/developers/docs/networking-layer/network-addresses/) হল একটি অবজেক্ট যা তিনটি মৌলিক উপাদান ধারণ করে: একটি স্বাক্ষর (কিছু সম্মত পরিচয় স্কিম অনুযায়ী তৈরি রেকর্ড বিষয়বস্তুর হ্যাস), একটি ক্রম সংখ্যা যা রেকর্ডের পরিবর্তনগুলি ট্র্যাক করে, এবং কি:মান জোড়ার একটি নির্বিচারে তালিকা। এটি একটি ভবিষ্যৎ-প্রমাণ বিন্যাস যা নতুন পিয়ারদের মধ্যে সনাক্তকারী তথ্যের সহজ বিনিময়কে অনুমতি দেয় এবং এটি ইথেরিয়াম নোডগুলির জন্য পছন্দের [নেটওয়ার্ক ঠিকানা](/developers/docs/networking-layer/network-addresses) বিন্যাস। + +#### কেন ডিসকভারি UDP-এর উপর নির্মিত? {#why-udp} + +UDP কোনো ত্রুটি পরীক্ষা, ব্যর্থ প্যাকেট পুনরায় পাঠানো, বা গতিশীলভাবে সংযোগ খোলা এবং বন্ধ করা সমর্থন করে না - পরিবর্তে এটি কেবল একটি লক্ষ্যে তথ্যের একটি অবিচ্ছিন্ন স্রোত পাঠায়, তা সফলভাবে প্রাপ্ত হয়েছে কিনা তা নির্বিশেষে। এই ন্যূনতম কার্যকারিতা ন্যূনতম ওভারহেডেও অনুবাদ করে, যা এই ধরণের সংযোগকে খুব দ্রুত করে তোলে। ডিসকভারির জন্য, যেখানে একটি নোড কেবল তার উপস্থিতি জানাতে চায় যাতে পরে একটি পিয়ারের সাথে একটি আনুষ্ঠানিক সংযোগ স্থাপন করা যায়, UDP যথেষ্ট। যাইহোক, বাকি নেটওয়ার্কিং স্ট্যাকের জন্য, UDP উদ্দেশ্যের জন্য উপযুক্ত নয়। নোডগুলির মধ্যে তথ্যগত বিনিময় বেশ জটিল এবং তাই একটি আরও সম্পূর্ণ বৈশিষ্ট্যযুক্ত প্রোটোকল প্রয়োজন যা পুনরায় পাঠানো, ত্রুটি পরীক্ষা ইত্যাদি সমর্থন করতে পারে। TCP-এর সাথে সম্পর্কিত অতিরিক্ত ওভারহেড অতিরিক্ত কার্যকারিতার জন্য মূল্যবান। অতএব, P2P স্ট্যাকের বেশিরভাগই TCP-এর উপর কাজ করে। + +### DevP2P {#devp2p} + +DevP2P নিজেই প্রোটোকলের একটি সম্পূর্ণ স্ট্যাক যা ইথেরিয়াম পিয়ার-টু-পিয়ার নেটওয়ার্ক প্রতিষ্ঠা এবং বজায় রাখার জন্য প্রয়োগ করে। নতুন নোড নেটওয়ার্কে প্রবেশ করার পরে, তাদের মিথস্ক্রিয়া [DevP2P](https://github.com/ethereum/devp2p) স্ট্যাকের প্রোটোকল দ্বারা পরিচালিত হয়। এগুলি সবই TCP-এর উপরে বসে এবং RLPx ট্রান্সপোর্ট প্রোটোকল, ওয়্যার প্রোটোকল এবং বেশ কয়েকটি সাব-প্রোটোকল অন্তর্ভুক্ত করে। [RLPx](https://github.com/ethereum/devp2p/blob/master/rlpx.md) হল নোডগুলির মধ্যে সেশন শুরু করা, প্রমাণীকরণ করা এবং বজায় রাখার জন্য পরিচালিত প্রোটোকল। RLPx RLP (Recursive Length Prefix) ব্যবহার করে বার্তা এনকোড করে যা নোডগুলির মধ্যে পাঠানোর জন্য ডেটাকে একটি ন্যূনতম কাঠামোতে এনকোড করার একটি খুব স্থান-দক্ষ পদ্ধতি। + +দুটি নোডের মধ্যে একটি RLPx সেশন একটি প্রাথমিক ক্রিপ্টোগ্রাফিক হ্যান্ডশেক দিয়ে শুরু হয়। এর মধ্যে নোড একটি প্রমাণীকরণ বার্তা পাঠায় যা পরে পিয়ার দ্বারা যাচাই করা হয়। সফল যাচাইকরণের পরে, পিয়ারটি সূচনাকারী নোডে ফেরত পাঠানোর জন্য একটি প্রমাণীকরণ-স্বীকৃতি বার্তা তৈরি করে। এটি একটি কী-বিনিময় প্রক্রিয়া যা নোডগুলিকে ব্যক্তিগতভাবে এবং সুরক্ষিতভাবে যোগাযোগ করতে সক্ষম করে। একটি সফল ক্রিপ্টোগ্রাফিক হ্যান্ডশেক তখন উভয় নোডকে একে অপরকে "অন দ্য ওয়্যার" একটি "হ্যালো" বার্তা পাঠাতে ট্রিগার করে। ওয়্যার প্রোটোকল হ্যালো বার্তাগুলির একটি সফল বিনিময়ের মাধ্যমে শুরু করা হয়। + +হ্যালো বার্তাগুলিতে রয়েছে: + +- প্রোটোকল সংস্করণ +- ক্লায়েন্ট আইডি +- পোর্ট +- নোড আইডি +- সমর্থিত সাব-প্রোটোকলের তালিকা + +এটি একটি সফল মিথস্ক্রিয়ার জন্য প্রয়োজনীয় তথ্য কারণ এটি নির্ধারণ করে যে উভয় নোডের মধ্যে কোন ক্ষমতাগুলি ভাগ করা হয়েছে এবং যোগাযোগটি কনফিগার করে। এখানে একটি সাব-প্রোটোকল আলোচনার প্রক্রিয়া রয়েছে যেখানে প্রতিটি নোড দ্বারা সমর্থিত সাব-প্রোটোকলগুলির তালিকা তুলনা করা হয় এবং যেগুলি উভয় নোডের জন্য সাধারণ সেগুলি সেশনে ব্যবহার করা যেতে পারে। + +হ্যালো বার্তাগুলির পাশাপাশি, ওয়্যার প্রোটোকল একটি "ডিসকানেক্ট" বার্তাও পাঠাতে পারে যা একটি পিয়ারকে সতর্ক করে যে সংযোগটি বন্ধ করা হবে। ওয়্যার প্রোটোকলে PING এবং PONG বার্তাও অন্তর্ভুক্ত রয়েছে যা একটি সেশন খোলা রাখার জন্য পর্যায়ক্রমে পাঠানো হয়। RLPx এবং ওয়্যার প্রোটোকল এক্সচেঞ্জগুলি তাই নোডগুলির মধ্যে যোগাযোগের ভিত্তি স্থাপন করে, একটি নির্দিষ্ট সাব-প্রোটোকল অনুসারে দরকারী তথ্য বিনিময়ের জন্য ভারা প্রদান করে। + +### সাব-প্রোটোকল {#sub-protocols} + +#### ওয়্যার প্রোটোকল {#wire-protocol} + +একবার পিয়াররা সংযুক্ত হলে এবং একটি RLPx সেশন শুরু হলে, ওয়্যার প্রোটোকল নির্ধারণ করে যে পিয়াররা কীভাবে যোগাযোগ করে। প্রাথমিকভাবে, ওয়্যার প্রোটোকল তিনটি প্রধান কাজ সংজ্ঞায়িত করেছে: চেইন সিঙ্ক্রোনাইজেশন, ব্লক প্রচার এবং লেনদেন বিনিময়। যাইহোক, একবার ইথেরিয়াম প্রুফ-অফ-স্টেকে স্যুইচ করলে, ব্লক প্রচার এবং চেইন সিঙ্ক্রোনাইজেশন কনসেন্সাস লেয়ারের অংশ হয়ে যায়। লেনদেন বিনিময় এখনও এক্সিকিউশন ক্লায়েন্টদের আওতায় রয়েছে। লেনদেন বিনিময় বলতে নোডগুলির মধ্যে মুলতুবি লেনদেন বিনিময় করা বোঝায় যাতে ব্লক নির্মাতারা পরবর্তী ব্লকে অন্তর্ভুক্ত করার জন্য তাদের কিছু নির্বাচন করতে পারে। এই কাজগুলি সম্পর্কে বিস্তারিত তথ্য [এখানে](https://github.com/ethereum/devp2p/blob/master/caps/eth.md) উপলব্ধ। এই সাব-প্রোটোকলগুলিকে সমর্থনকারী ক্লায়েন্টরা [JSON-RPC](/developers/docs/apis/json-rpc/) এর মাধ্যমে সেগুলি প্রকাশ করে। + +#### les (লাইট ইথেরিয়াম সাবপ্রোটোকল) {#les} + +এটি লাইট ক্লায়েন্ট সিঙ্ক করার জন্য একটি ন্যূনতম প্রোটোকল। ঐতিহ্যগতভাবে এই প্রোটোকলটি খুব কমই ব্যবহৃত হয়েছে কারণ সম্পূর্ণ নোডগুলিকে উৎসাহিত না হয়ে লাইট ক্লায়েন্টদের ডেটা পরিবেশন করতে হয়। এক্সিকিউশন ক্লায়েন্টদের ডিফল্ট আচরণ হল les এর মাধ্যমে লাইট ক্লায়েন্টের ডেটা পরিবেশন না করা। les [স্পেক](https://github.com/ethereum/devp2p/blob/master/caps/les.md)-এ আরও তথ্য উপলব্ধ। + +#### স্ন্যাপ {#snap} + +[স্ন্যাপ প্রোটোকল](https://github.com/ethereum/devp2p/blob/master/caps/snap.md#ethereum-snapshot-protocol-snap) হল একটি ঐচ্ছিক এক্সটেনশন যা পিয়ারদের সাম্প্রতিক স্টেটগুলির স্ন্যাপশট বিনিময় করতে দেয়, যা পিয়ারদের মধ্যবর্তী Merkle ট্রাই নোড ডাউনলোড না করেই অ্যাকাউন্ট এবং স্টোরেজ ডেটা যাচাই করতে দেয়। + +#### উইট (উইটনেস প্রোটোকল) {#wit} + +[উইটনেস প্রোটোকল](https://github.com/ethereum/devp2p/blob/master/caps/wit.md#ethereum-witness-protocol-wit) হল একটি ঐচ্ছিক এক্সটেনশন যা পিয়ারদের মধ্যে স্টেট উইটনেস বিনিময়কে সক্ষম করে, যা ক্লায়েন্টদের চেইনের শীর্ষে সিঙ্ক করতে সাহায্য করে। + +#### হুইসপার {#whisper} + +হুইসপার একটি প্রোটোকল ছিল যার লক্ষ্য ছিল ব্লকচেইনে কোনো তথ্য না লিখে পিয়ারদের মধ্যে সুরক্ষিত মেসেজিং প্রদান করা। এটি DevP2P ওয়্যার প্রোটোকলের অংশ ছিল কিন্তু এখন এটি বাতিল করা হয়েছে। অনুরূপ লক্ষ্য নিয়ে অন্যান্য [সম্পর্কিত প্রকল্প](https://wakunetwork.com/) বিদ্যমান। + +## কনসেন্সাস লেয়ার {#consensus-layer} + +কনসেন্সাস ক্লায়েন্টরা একটি ভিন্ন স্পেসিফিকেশন সহ একটি পৃথক পিয়ার-টু-পিয়ার নেটওয়ার্কে অংশগ্রহণ করে। কনসেন্সাস ক্লায়েন্টদের ব্লক গসিপে অংশ নিতে হবে যাতে তারা পিয়ারদের থেকে নতুন ব্লক পেতে পারে এবং যখন তাদের ব্লক প্রস্তাবক হওয়ার পালা আসে তখন সেগুলি সম্প্রচার করতে পারে। এক্সিকিউশন লেয়ারের মতো, এর জন্য প্রথমে একটি ডিসকভারি প্রোটোকল প্রয়োজন যাতে একটি নোড পিয়ার খুঁজে পেতে পারে এবং ব্লক, অ্যাটেস্টেশন ইত্যাদি বিনিময়ের জন্য সুরক্ষিত সেশন স্থাপন করতে পারে। + +### ডিসকভারি {#consensus-discovery} + +এক্সিকিউশন ক্লায়েন্টদের মতো, কনসেন্সাস ক্লায়েন্টরা পিয়ার খুঁজে বের করার জন্য UDP-এর উপর [discv5](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-discovery-domain-discv5) ব্যবহার করে। discv5-এর কনসেন্সাস লেয়ারের বাস্তবায়ন এক্সিকিউশন ক্লায়েন্টদের থেকে শুধুমাত্র এই কারণে ভিন্ন যে এটি একটি অ্যাডাপ্টার অন্তর্ভুক্ত করে যা discv5-কে একটি [libP2P](https://libp2p.io/) স্ট্যাকের সাথে সংযুক্ত করে, DevP2P-কে বাতিল করে দেয়। এক্সিকিউশন লেয়ারের RLPx সেশনগুলি libP2P-এর নয়েজ সুরক্ষিত চ্যানেল হ্যান্ডশেকের পক্ষে বাতিল করা হয়েছে। + +### ENRs {#consensus-enr} + +কনসেন্সাস নোডগুলির জন্য ENR-এ নোডের পাবলিক কি, আইপি ঠিকানা, UDP এবং TCP পোর্ট এবং দুটি কনসেন্সাস-নির্দিষ্ট ফিল্ড অন্তর্ভুক্ত রয়েছে: অ্যাটেস্টেশন সাবনেট বিটফিল্ড এবং `eth2` কি। পূর্বেরটি নোডগুলির জন্য নির্দিষ্ট অ্যাটেস্টেশন গসিপ সাব-নেটওয়ার্কে অংশগ্রহণকারী পিয়ারদের খুঁজে পাওয়া সহজ করে তোলে। `eth2` কি-তে নোডটি কোন ইথেরিয়াম ফর্ক সংস্করণ ব্যবহার করছে সে সম্পর্কে তথ্য রয়েছে, যা নিশ্চিত করে যে পিয়াররা সঠিক ইথেরিয়ামের সাথে সংযোগ স্থাপন করছে। + +### libP2P {#libp2p} + +libP2P স্ট্যাক ডিসকভারির পরে সমস্ত যোগাযোগ সমর্থন করে। ক্লায়েন্টরা তাদের ENR-এ সংজ্ঞায়িত হিসাবে IPv4 এবং/অথবা IPv6-এ ডায়াল এবং শুনতে পারে। libP2P লেয়ারের প্রোটোকলগুলিকে গসিপ এবং req/resp ডোমেনে বিভক্ত করা যেতে পারে। + +### গসিপ {#gossip} + +গসিপ ডোমেনে এমন সমস্ত তথ্য অন্তর্ভুক্ত থাকে যা নেটওয়ার্ক জুড়ে দ্রুত ছড়িয়ে পড়তে হবে। এর মধ্যে রয়েছে বিকন ব্লক, প্রুফ, অ্যাটেস্টেশন, এক্সিট এবং স্ল্যাশিং। এটি libP2P gossipsub v1 ব্যবহার করে প্রেরণ করা হয় এবং প্রতিটি নোডে স্থানীয়ভাবে সংরক্ষিত বিভিন্ন মেটাডেটার উপর নির্ভর করে, যার মধ্যে গসিপ পেলোড গ্রহণ এবং প্রেরণের সর্বোচ্চ আকার অন্তর্ভুক্ত রয়েছে। গসিপ ডোমেন সম্পর্কে বিস্তারিত তথ্য [এখানে](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub) উপলব্ধ। + +### অনুরোধ-প্রতিক্রিয়া {#request-response} + +অনুরোধ-প্রতিক্রিয়া ডোমেনে ক্লায়েন্টদের তাদের পিয়ারদের কাছ থেকে নির্দিষ্ট তথ্য অনুরোধ করার জন্য প্রোটোকল রয়েছে। উদাহরণগুলির মধ্যে রয়েছে নির্দিষ্ট রুট হ্যাসগুলির সাথে মিলে যাওয়া বা স্লটগুলির একটি পরিসরের মধ্যে নির্দিষ্ট বিকন ব্লকগুলির অনুরোধ করা। প্রতিক্রিয়াগুলি সর্বদা snappy-সংকুচিত SSZ এনকোডেড বাইট হিসাবে ফেরত দেওয়া হয়। + +## কনসেন্সাস ক্লায়েন্ট কেন RLP-এর চেয়ে SSZ পছন্দ করে? {#ssz-vs-rlp} + +SSZ মানে হল সিম্পল সিরিয়ালাইজেশন। এটি নির্দিষ্ট অফসেট ব্যবহার করে যা একটি এনকোড করা বার্তার সম্পূর্ণ কাঠামো ডিকোড না করেই পৃথক অংশগুলি ডিকোড করা সহজ করে তোলে, যা কনসেন্সাস ক্লায়েন্টের জন্য খুব দরকারী কারণ এটি এনকোড করা বার্তাগুলি থেকে দক্ষতার সাথে নির্দিষ্ট তথ্য গ্রহণ করতে পারে। এটি Merkleization-এর জন্য সম্পর্কিত দক্ষতা লাভের সাথে Merkle প্রোটোকলের সাথে একীভূত করার জন্য বিশেষভাবে ডিজাইন করা হয়েছে। যেহেতু কনসেন্সাস লেয়ারের সমস্ত হ্যাস হল Merkle রুট, এটি একটি উল্লেখযোগ্য উন্নতি যোগ করে। SSZ মানের অনন্য উপস্থাপনাও নিশ্চিত করে। + +## এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্টদের সংযোগ করা {#connecting-clients} + +কনসেন্সাস এবং এক্সিকিউশন উভয় ক্লায়েন্টই সমান্তরালভাবে চলে। তাদের সংযুক্ত থাকা প্রয়োজন যাতে কনসেন্সাস ক্লায়েন্ট এক্সিকিউশন ক্লায়েন্টকে নির্দেশনা দিতে পারে, এবং এক্সিকিউশন ক্লায়েন্ট বিকন ব্লকে অন্তর্ভুক্ত করার জন্য কনসেন্সাস ক্লায়েন্টকে লেনদেনের বান্ডিল পাঠাতে পারে। দুটি ক্লায়েন্টের মধ্যে যোগাযোগ একটি স্থানীয় RPC সংযোগ ব্যবহার করে অর্জন করা যেতে পারে। ['ইঞ্জিন-API'](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) নামে পরিচিত একটি API দুটি ক্লায়েন্টের মধ্যে প্রেরিত নির্দেশাবলীকে সংজ্ঞায়িত করে। যেহেতু উভয় ক্লায়েন্টই একটি একক নেটওয়ার্ক পরিচয়ের পিছনে বসে, তারা একটি ENR (ইথেরিয়াম নোড রেকর্ড) ভাগ করে নেয় যাতে প্রতিটি ক্লায়েন্টের জন্য একটি পৃথক কি থাকে (eth1 কি এবং eth2 কি)। + +নিয়ন্ত্রণ প্রবাহের একটি সারাংশ নীচে দেখানো হয়েছে, প্রাসঙ্গিক নেটওয়ার্কিং স্ট্যাকটি বন্ধনীতে রয়েছে। + +### যখন কনসেন্সাস ক্লায়েন্ট ব্লক প্রযোজক নয়: {#when-consensus-client-is-not-block-producer} + +- কনসেন্সাস ক্লায়েন্ট ব্লক গসিপ প্রোটোকলের মাধ্যমে একটি ব্লক গ্রহণ করে (কনসেন্সাস p2p) +- কনসেন্সাস ক্লায়েন্ট ব্লকটি প্রাক-যাচাই করে, অর্থাৎ, এটি সঠিক মেটাডেটা সহ একটি বৈধ প্রেরকের কাছ থেকে এসেছে তা নিশ্চিত করে। +- ব্লকের লেনদেনগুলি একটি এক্সিকিউশন পেলোড হিসাবে এক্সিকিউশন লেয়ারে পাঠানো হয় (স্থানীয় RPC সংযোগ) +- এক্সিকিউশন লেয়ার লেনদেনগুলি সম্পাদন করে এবং ব্লক হেডারের স্টেট যাচাই করে (অর্থাৎ, হ্যাসগুলি মিলেছে কিনা তা পরীক্ষা করে) +- এক্সিকিউশন লেয়ার বৈধকরণ ডেটা কনসেন্সাস লেয়ারে ফেরত পাঠায়, ব্লকটি এখন যাচাইকৃত বলে বিবেচিত হয় (স্থানীয় RPC সংযোগ) +- কনসেন্সাস লেয়ার ব্লকটিকে তার নিজস্ব ব্লকচেইনের শীর্ষে যুক্ত করে এবং এটির অ্যাটেস্টেশন করে, নেটওয়ার্কে অ্যাটেস্টেশন সম্প্রচার করে (কনসেন্সাস p2p) + +### যখন কনসেন্সাস ক্লায়েন্ট ব্লক প্রযোজক: {#when-consensus-client-is-block-producer} + +- কনসেন্সাস ক্লায়েন্ট নোটিশ পায় যে এটি পরবর্তী ব্লক প্রযোজক (কনসেন্সাস p2p) +- কনসেন্সাস লেয়ার এক্সিকিউশন ক্লায়েন্টে `create block` পদ্ধতি কল করে (স্থানীয় RPC) +- এক্সিকিউশন লেয়ার ট্রানজ্যাকশন মেমপুল অ্যাক্সেস করে যা ট্রানজ্যাকশন গসিপ প্রোটোকল দ্বারা জনবহুল হয়েছে (এক্সিকিউশন p2p) +- এক্সিকিউশন ক্লায়েন্ট লেনদেনগুলিকে একটি ব্লকে বান্ডিল করে, লেনদেনগুলি সম্পাদন করে এবং একটি ব্লক হ্যাস তৈরি করে +- কনসেন্সাস ক্লায়েন্ট এক্সিকিউশন ক্লায়েন্ট থেকে লেনদেন এবং ব্লক হ্যাস গ্রহণ করে এবং সেগুলিকে বিকন ব্লকে যোগ করে (স্থানীয় RPC) +- কনসেন্সাস ক্লায়েন্ট ব্লক গসিপ প্রোটোকলের মাধ্যমে ব্লকটি সম্প্রচার করে (কনসেন্সাস p2p) +- অন্যান্য ক্লায়েন্টরা ব্লক গসিপ প্রোটোকলের মাধ্যমে প্রস্তাবিত ব্লকটি গ্রহণ করে এবং উপরে বর্ণিত হিসাবে যাচাই করে (কনসেন্সাস p2p) + +একবার ব্লকটি পর্যাপ্ত ভ্যালিডেটর দ্বারা অ্যাটেস্টেড হয়ে গেলে এটি চেইনের শীর্ষে যুক্ত হয়, ন্যায্য বলে বিবেচিত হয় এবং অবশেষে চূড়ান্ত হয়। + +![](cons_client_net_layer.png) +![](exe_client_net_layer.png) + +[ethresear.ch](https://ethresear.ch/t/eth1-eth2-client-relationship/7248) থেকে কনসেন্সাস এবং এক্সিকিউশন ক্লায়েন্টদের জন্য নেটওয়ার্ক লেয়ার স্কিম্যাটিক + +## আরও পড়ুন {#further-reading} + +[DevP2P](https://github.com/ethereum/devp2p) +[LibP2p](https://github.com/libp2p/specs) +[কনসেন্সাস লেয়ার নেটওয়ার্ক স্পেকস](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure) +[kademlia থেকে discv5](https://vac.dev/kademlia-to-discv5) +[kademlia পেপার](https://pdos.csail.mit.edu/~petar/papers/maymounkov-kademlia-lncs.pdf) +[ইথেরিয়াম p2p-এর ভূমিকা](https://p2p.paris/en/talks/intro-ethereum-networking/) +[eth1/eth2 সম্পর্ক](http://ethresear.ch/t/eth1-eth2-client-relationship/7248) +[মার্জ এবং eth2 ক্লায়েন্ট বিশদ ভিডিও](https://www.youtube.com/watch?v=zNIrIninMgg) diff --git a/public/content/translations/bn/developers/docs/networking-layer/network-addresses/index.md b/public/content/translations/bn/developers/docs/networking-layer/network-addresses/index.md new file mode 100644 index 00000000000..fc15c99b690 --- /dev/null +++ b/public/content/translations/bn/developers/docs/networking-layer/network-addresses/index.md @@ -0,0 +1,39 @@ +--- +title: "নেটওয়ার্ক অ্যাড্রেস" +description: "নেটওয়ার্ক অ্যাড্রেসের একটি ভূমিকা।" +lang: bn +sidebarDepth: 2 +--- + +Ethereum নোডগুলিকে পিয়ারদের সঙ্গে কানেক্ট করতে নিজেদের কিছু প্রাথমিক তথ্য দিয়ে শনাক্ত করতে হয়। যেকোনো সম্ভাব্য পিয়ার যাতে এই তথ্যটি ব্যাখ্যা করতে পারে তা নিশ্চিত করার জন্য, এটি তিনটি প্রমিত ফরম্যাটের মধ্যে একটিতে রিলে করা হয় যা যেকোনো Ethereum নোড বুঝতে পারে: multiaddr, enode, বা Ethereum Node Records (ENRs)। ENR হলো Ethereum নেটওয়ার্ক অ্যাড্রেসের জন্য বর্তমান স্ট্যান্ডার্ড। + +## পূর্বশর্ত {#prerequisites} + +এই পেজটি বোঝার জন্য Ethereum-এর [নেটওয়ার্কিং লেয়ার](/developers/docs/networking-layer/) সম্পর্কে কিছু ধারণা থাকা প্রয়োজন। + +## Multiaddr {#multiaddr} + +আসল Ethereum নোড অ্যাড্রেস ফরম্যাটটি ছিল 'multiaddr' ('multi-addresses'-এর সংক্ষিপ্ত রূপ)। Multiaddr হলো একটি সর্বজনীন ফরম্যাট যা পিয়ার-টু-পিয়ার নেটওয়ার্কের জন্য ডিজাইন করা হয়েছে। অ্যাড্রেসগুলিকে কী-ভ্যালু পেয়ার হিসাবে উপস্থাপন করা হয়, যেখানে কী এবং ভ্যালুগুলি একটি ফরোয়ার্ড স্ল্যাশ দিয়ে আলাদা করা থাকে। উদাহরণস্বরূপ, IPv4 অ্যাড্রেস `192.168.22.27` সহ একটি নোডের জন্য multiaddr, যা TCP পোর্ট `33000`-এ লিসেন করে, সেটি দেখতে এইরকম: + +`/ip4/192.168.22.27/tcp/33000` + +একটি Ethereum নোডের জন্য, multiaddr-এ নোড-ID থাকে (তাদের পাবলিক কী-এর একটি হ্যাস): + +`/ip4/192.168.22.27/tcp/33000/p2p/5t7Nv7dG2d6ffbvAiewVsEwWweU3LdebSqX2y1bPrW8br` + +## Enode {#enode} + +একটি enode হলো একটি URL অ্যাড্রেস ফর্ম্যাট ব্যবহার করে একটি Ethereum নোড শনাক্ত করার একটি উপায়। হেক্সাডেসিমাল নোড-ID ইউআরএলের ইউজারনেম অংশে এনকোড করা হয় এবং @ চিহ্ন ব্যবহার করে হোস্ট থেকে আলাদা করা হয়। হোস্টনেম শুধুমাত্র একটি আইপি অ্যাড্রেস হিসাবে দেওয়া যেতে পারে; ডিএনএস নাম অনুমোদিত নয়। হোস্টনেম সেকশনের পোর্টটি হল টিসিপি লিসেনিং পোর্ট। যদি TCP এবং UDP (ডিসকভারি) পোর্ট ভিন্ন হয়, তাহলে UDP পোর্টটিকে একটি ক্যোয়ারী প্যারামিটার "discport" হিসেবে উল্লেখ করা হয়। + +নিম্নলিখিত উদাহরণে, নোড URLটি `10.3.58.6` আইপি অ্যাড্রেস, `30303` টিসিপি পোর্ট এবং `30301` ইউডিপি ডিসকভারি পোর্ট সহ একটি নোড বর্ণনা করে। + +`enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303?discport=30301` + +## Ethereum Node Records (ENRs) {#enr} + +Ethereum Node Records (ENRs) হল Ethereum-এ নেটওয়ার্ক অ্যাড্রেসের জন্য একটি প্রমিত বিন্যাস। এগুলি multiaddr এবং enode-কে প্রতিস্থাপন করে। এগুলি বিশেষত দরকারী কারণ এগুলি নোডগুলির মধ্যে বৃহত্তর তথ্য বিনিময়ের অনুমতি দেয়। ENR-এ একটি স্বাক্ষর, ক্রম সংখ্যা এবং স্বাক্ষর তৈরি ও যাচাই করতে ব্যবহৃত পরিচয় স্কিমের বিশদ বিবরণ সম্বলিত ক্ষেত্র রয়েছে। ENR-কে কী-ভ্যালু পেয়ার হিসাবে সংগঠিত নির্বিচারে ডেটা দিয়েও পপুলেট করা যেতে পারে। এই কী-ভ্যালু পেয়ারগুলিতে নোডের আইপি অ্যাড্রেস এবং নোডটি যে সাব-প্রোটোকলগুলি ব্যবহার করতে সক্ষম সে সম্পর্কে তথ্য থাকে। কনসেন্সাস ক্লায়েন্টরা বুট নোড শনাক্ত করার জন্য একটি [নির্দিষ্ট ENR কাঠামো](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#enr-structure) ব্যবহার করে এবং এতে একটি `eth2` ফিল্ডও অন্তর্ভুক্ত থাকে, যেখানে বর্তমান Ethereum ফর্ক এবং অ্যাটেস্টেশন গসিপ সাবনেট (এটি নোডকে এমন এক বিশেষ শ্রেণীর পিয়ারদের সঙ্গে যুক্ত করে যাদের অ্যাটেস্টেশন একত্রিত করা হয়) সম্পর্কে তথ্য থাকে। + +## আরও পড়ুন {#further-reading} + +- [EIP-778: Ethereum Node Records (ENR)](https://eips.ethereum.org/EIPS/eip-778) +- [LibP2P: Multiaddr-Enode-ENR?!](https://consensys.net/diligence/blog/2020/09/libp2p-multiaddr-enode-enr/) diff --git a/public/content/translations/bn/developers/docs/networking-layer/portal-network/index.md b/public/content/translations/bn/developers/docs/networking-layer/portal-network/index.md new file mode 100644 index 00000000000..7533e6175db --- /dev/null +++ b/public/content/translations/bn/developers/docs/networking-layer/portal-network/index.md @@ -0,0 +1,89 @@ +--- +title: "পোর্টাল নেটওয়ার্ক" +description: "পোর্টাল নেটওয়ার্কের একটি সংক্ষিপ্ত বিবরণ - একটি ইন-ডেভেলপমেন্ট নেটওয়ার্ক যা স্বল্প-সম্পদ ক্লায়েন্টদের সমর্থন করার জন্য ডিজাইন করা হয়েছে।" +lang: bn +--- + +ইথেরিয়াম হলো এমন একটি নেটওয়ার্ক যা ইথেরিয়াম ক্লায়েন্ট সফ্টওয়্যার চালিত কম্পিউটারগুলির সমন্বয়ে গঠিত। এই কম্পিউটারগুলির প্রত্যেকটিকে একটি 'নোড' বলা হয়। ক্লায়েন্ট সফ্টওয়্যার একটি নোডকে ইথেরিয়াম নেটওয়ার্কে ডেটা পাঠানো এবং গ্রহণ করার অনুমতি দেয় এবং ইথেরিয়াম প্রোটোকল নিয়ম অনুসারে ডেটা যাচাই করে। নোডগুলি তাদের ডিস্ক সংগ্রহস্থলে প্রচুর ঐতিহাসিক ডেটা রাখে এবং নেটওয়ার্কের অন্যান্য নোড থেকে ব্লক হিসাবে পরিচিত তথ্যের নতুন প্যাকেট গ্রহণ করার সময় তাতে যোগ করে। একটি নোডের কাছে নেটওয়ার্কের বাকি অংশের সাথে সামঞ্জস্যপূর্ণ তথ্য আছে কিনা তা সর্বদা পরীক্ষা করার জন্য এটি প্রয়োজনীয়। এর মানে হল একটি নোড চালানোর জন্য অনেক ডিস্ক স্পেস প্রয়োজন হতে পারে। কিছু নোড অপারেশনের জন্য প্রচুর RAMও প্রয়োজন হতে পারে। + +এই ডিস্ক সংগ্রহস্থলের সমস্যা সমাধানের জন্য, 'লাইট' নোড তৈরি করা হয়েছে যা নিজেরাই সমস্ত তথ্য সংগ্রহ করার পরিবর্তে সম্পূর্ণ নোড থেকে তথ্যের জন্য অনুরোধ করে। যাইহোক, এর মানে হল লাইট নোড স্বাধীনভাবে তথ্য যাচাই করে না এবং পরিবর্তে অন্য একটি নোডের উপর বিশ্বাস রাখে। এর মানে হল যে সম্পূর্ণ নোডগুলিকে সেই লাইট নোডগুলিকে পরিষেবা দেওয়ার জন্য অতিরিক্ত কাজ করতে হয়। + +পোর্টাল নেটওয়ার্ক হলো ইথেরিয়ামের জন্য একটি নতুন নেটওয়ার্কিং ডিজাইন, যার লক্ষ্য হলো নেটওয়ার্ক জুড়ে ছোট ছোট অংশে প্রয়োজনীয় ডেটা ভাগ করে সম্পূর্ণ নোডগুলির উপর বিশ্বাস স্থাপন বা অতিরিক্ত চাপ না দিয়েই "লাইট" নোডগুলির জন্য ডেটা প্রাপ্যতার সমস্যার সমাধান করা। + +[নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) সম্পর্কে আরও জানুন + +## আমাদের কেন পোর্টাল নেটওয়ার্ক প্রয়োজন {#why-do-we-need-portal-network} + +ইথেরিয়াম নোডগুলি ইথেরিয়াম ব্লকচেইনের নিজস্ব সম্পূর্ণ বা আংশিক অনুলিপি সংরক্ষণ করে। এই স্থানীয় অনুলিপিটি লেনদেন যাচাই করতে এবং নোডটি সঠিক চেইন অনুসরণ করছে তা নিশ্চিত করতে ব্যবহৃত হয়। এই স্থানীয়ভাবে সংরক্ষিত ডেটা নোডগুলিকে অন্য কোনো সত্তার উপর বিশ্বাস না করেই স্বাধীনভাবে যাচাই করার অনুমতি দেয় যে আগত ডেটা বৈধ এবং সঠিক। + +ব্লকচেইনের এই স্থানীয় অনুলিপি এবং সংশ্লিষ্ট স্টেট ও রসিদ ডেটা নোডের হার্ড ডিস্কে অনেক জায়গা নেয়। উদাহরণস্বরূপ, একটি কনসেন্সাস ক্লায়েন্টের সাথে যুক্ত [Geth](https://geth.ethereum.org) ব্যবহার করে একটি নোড চালানোর জন্য একটি 2TB হার্ড ডিস্কের সুপারিশ করা হয়। স্ন্যাপ সিঙ্ক ব্যবহার করে, যা শুধুমাত্র তুলনামূলকভাবে সাম্প্রতিক ব্লকের একটি সেট থেকে চেইন ডেটা সঞ্চয় করে, Geth সাধারণত প্রায় 650GB ডিস্ক স্পেস দখল করে কিন্তু প্রতি সপ্তাহে প্রায় 14GB হারে বৃদ্ধি পায় (আপনি পর্যায়ক্রমে নোডটিকে ছেঁটে 650GB-তে নামিয়ে আনতে পারেন)। + +এর মানে হলো নোড চালানো ব্যয়বহুল হতে পারে, কারণ ইথেরিয়ামের জন্য প্রচুর পরিমাণে ডিস্ক স্পেস উৎসর্গ করতে হয়। ইথেরিয়াম রোডম্যাপে এই সমস্যার বেশ কয়েকটি সমাধান রয়েছে, যার মধ্যে রয়েছে [হিস্টোরি এক্সপায়ারি](/roadmap/statelessness/#history-expiry), [স্টেট এক্সপায়ারি](/roadmap/statelessness/#state-expiry) এবং [স্টেটলেসনেস](/roadmap/statelessness/)। যাইহোক, এগুলি বাস্তবায়ন হতে সম্ভবত আরও বেশ কয়েক বছর সময় লাগবে। এছাড়াও [লাইট নোড](/developers/docs/nodes-and-clients/light-clients/) রয়েছে যা চেইন ডেটার নিজস্ব অনুলিপি সংরক্ষণ করে না, তারা সম্পূর্ণ নোড থেকে তাদের প্রয়োজনীয় ডেটার জন্য অনুরোধ করে। যাইহোক, এর মানে হল লাইট নোডগুলিকে সৎ ডেটা প্রদানের জন্য সম্পূর্ণ নোডগুলির উপর বিশ্বাস করতে হয় এবং এটি সেই সম্পূর্ণ নোডগুলির উপরও চাপ সৃষ্টি করে যাদের লাইট নোডগুলির প্রয়োজনীয় ডেটা পরিবেশন করতে হয়। + +পোর্টাল নেটওয়ার্কের লক্ষ্য হল লাইট নোডগুলিকে তাদের ডেটা পাওয়ার জন্য একটি বিকল্প উপায় প্রদান করা, যার জন্য সম্পূর্ণ নোডগুলির দ্বারা করা কাজের উপর বিশ্বাস স্থাপন বা উল্লেখযোগ্যভাবে কাজ যোগ করার প্রয়োজন হয় না। এটি সম্পন্ন করার উপায় হল ইথেরিয়াম নোডগুলির জন্য নেটওয়ার্ক জুড়ে ডেটা ভাগ করার একটি নতুন উপায় চালু করা। + +## পোর্টাল নেটওয়ার্ক কীভাবে কাজ করে? {#how-does-portal-network-work} + +ইথেরিয়াম নোডগুলির কঠোর প্রোটোকল রয়েছে যা নির্ধারণ করে যে তারা একে অপরের সাথে কীভাবে যোগাযোগ করবে। এক্সিকিউশন ক্লায়েন্টগুলি [DevP2P](/developers/docs/networking-layer/#devp2p) নামে পরিচিত সাবপ্রোটোকলগুলির একটি সেট ব্যবহার করে যোগাযোগ করে, যেখানে কনসেন্সাস ক্লায়েন্টগুলি [libP2P](/developers/docs/networking-layer/#libp2p) নামক সাবপ্রোটোকলগুলির একটি ভিন্ন স্ট্যাক ব্যবহার করে। এগুলি নোডগুলির মধ্যে যে ধরনের ডেটা পাস করা যায় তা নির্ধারণ করে। + +![devP2P এবং libP2P](portal-network-devp2p-libp2p.png) + +নোডগুলি [JSON-RPC API](/developers/docs/apis/json-rpc/) এর মাধ্যমে নির্দিষ্ট ডেটাও পরিবেশন করতে পারে, যা হলো সেই পদ্ধতি যার মাধ্যমে অ্যাপ এবং ওয়ালেটগুলি ইথেরিয়াম নোডগুলির সাথে তথ্য বিনিময় করে। যাইহোক, এর কোনোটিই লাইট ক্লায়েন্টদের কাছে ডেটা পরিবেশন করার জন্য আদর্শ প্রোটোকল নয়। + +লাইট ক্লায়েন্টরা বর্তমানে DevP2P বা libP2p-এর মাধ্যমে চেইন ডেটার নির্দিষ্ট অংশের জন্য অনুরোধ করতে পারে না কারণ সেই প্রোটোকলগুলি শুধুমাত্র চেইন সিঙ্ক্রোনাইজেশন এবং ব্লক ও লেনদেনের গসিপিং সক্ষম করার জন্য ডিজাইন করা হয়েছে। লাইট ক্লায়েন্টরা এই তথ্য ডাউনলোড করতে চায় না কারণ এটি তাদের "লাইট" থাকা থেকে বিরত রাখবে। + +JSON-RPC API-ও লাইট ক্লায়েন্ট ডেটা অনুরোধের জন্য একটি আদর্শ পছন্দ নয়, কারণ এটি একটি নির্দিষ্ট সম্পূর্ণ নোড বা কেন্দ্রীভূত RPC প্রদানকারীর সাথে সংযোগের উপর নির্ভর করে যা ডেটা পরিবেশন করতে পারে। এর মানে হল লাইট ক্লায়েন্টকে সেই নির্দিষ্ট নোড/প্রদানকারীর সৎ থাকার উপর বিশ্বাস করতে হয়, এবং সম্পূর্ণ নোডটিকেও অনেক লাইট ক্লায়েন্টের থেকে প্রচুর অনুরোধ সামলাতে হতে পারে, যা তাদের ব্যান্ডউইথের প্রয়োজনীয়তা বাড়িয়ে তোলে। + +পোর্টাল নেটওয়ার্কের মূল উদ্দেশ্য হল বিদ্যমান ইথেরিয়াম ক্লায়েন্টদের ডিজাইন সীমাবদ্ধতার বাইরে, বিশেষ করে লাইটনেসের জন্য নির্মাণ করে, পুরো ডিজাইনটি পুনর্বিবেচনা করা। + +পোর্টাল নেটওয়ার্কের মূল ধারণা হল একটি [DHT](https://en.wikipedia.org/wiki/Distributed_hash_table) (Bittorrent-এর মতো) ব্যবহার করে একটি লাইটওয়েট DevP2P স্টাইলের পিয়ার-টু-পিয়ার বিকেন্দ্রীভূত নেটওয়ার্কের মাধ্যমে লাইট ক্লায়েন্টদের প্রয়োজনীয় তথ্য, যেমন ঐতিহাসিক ডেটা এবং চেইনের বর্তমান হেডের পরিচয়, পরিবেশন করার মাধ্যমে বর্তমান নেটওয়ার্কিং স্ট্যাকের সেরা অংশগুলি গ্রহণ করা। + +এর ধারণাটি হলো প্রতিটি নোডে মোট ঐতিহাসিক ইথেরিয়াম ডেটার ছোট অংশ এবং কিছু নির্দিষ্ট নোডের দায়িত্ব যোগ করা। তারপর, অনুরোধ করা নির্দিষ্ট ডেটা সংরক্ষণকারী নোডগুলি খুঁজে বের করে এবং তাদের থেকে তা পুনরুদ্ধার করে অনুরোধগুলি পরিবেশন করা হয়। + +এটি লাইট নোডগুলির একটি একক নোড খুঁজে বের করা এবং তাদের প্রচুর পরিমাণে ডেটা ফিল্টার ও পরিবেশন করার অনুরোধ করার সাধারণ মডেলটিকে উল্টে দেয়; পরিবর্তে, তারা দ্রুত নোডগুলির একটি বড় নেটওয়ার্ক ফিল্টার করে যার প্রতিটি অল্প পরিমাণে ডেটা পরিচালনা করে। + +এর লক্ষ্য হলো লাইটওয়েট পোর্টাল ক্লায়েন্টদের একটি বিকেন্দ্রীভূত নেটওয়ার্ককে নিম্নলিখিত কাজগুলো করার অনুমতি দেওয়া: + +- চেইনের হেড ট্র্যাক করা +- সাম্প্রতিক এবং ঐতিহাসিক চেইন ডেটা সিঙ্ক করা +- স্টেট ডেটা পুনরুদ্ধার করা +- লেনদেন সম্প্রচার করা +- [EVM](/developers/docs/evm/) ব্যবহার করে লেনদেন নির্বাহ করা + +এই নেটওয়ার্ক ডিজাইনের সুবিধাগুলি হল: + +- কেন্দ্রীভূত প্রদানকারীদের উপর নির্ভরতা হ্রাস করা +- ইন্টারনেট ব্যান্ডউইথ ব্যবহার হ্রাস করা +- ন্যূনতম বা শূন্য সিঙ্কিং +- সম্পদ-সীমাবদ্ধ ডিভাইসগুলিতে অ্যাক্সেসযোগ্য (\<1 GB RAM, \<100 MB ডিস্ক স্পেস, 1 CPU) + +নীচের টেবিলটি বিদ্যমান ক্লায়েন্টদের সেই ফাংশনগুলি দেখায় যা পোর্টাল নেটওয়ার্ক দ্বারা সরবরাহ করা যেতে পারে, যা ব্যবহারকারীদের খুব কম-রিসোর্স ডিভাইসে এই ফাংশনগুলি অ্যাক্সেস করতে সক্ষম করে। + +### পোর্টাল নেটওয়ার্কসমূহ + +| বিকন লাইট ক্লায়েন্ট | স্টেট নেটওয়ার্ক | লেনদেন গসিপ | হিস্টোরি নেটওয়ার্ক | +| -------------------- | -------------------------------------- | ---------------- | ------------------- | +| বিকন চেইন লাইট | অ্যাকাউন্ট এবং কন্ট্র্যাক্ট সংগ্রহস্থল | লাইটওয়েট মেমপুল | হেডার | +| প্রোটোকল ডেটা | | | ব্লক বডি | +| | | | রসিদ | + +## ডিফল্টরূপে ক্লায়েন্ট ডাইভারসিটি {#client-diversity-as-default} + +পোর্টাল নেটওয়ার্ক ডেভেলপাররাও প্রথম দিন থেকেই চারটি পৃথক পোর্টাল নেটওয়ার্ক ক্লায়েন্ট তৈরি করার ডিজাইনের সিদ্ধান্ত নিয়েছিল। + +পোর্টাল নেটওয়ার্ক ক্লায়েন্টগুলি হল: + +- [Trin](https://github.com/ethereum/trin): রাস্ট-এ লেখা +- [Fluffy](https://fluffy.guide): নিম-এ লেখা +- [Ultralight](https://github.com/ethereumjs/ultralight): টাইপস্ক্রিপ্ট-এ লেখা +- [Shisui](https://github.com/zen-eth/shisui): গো-তে লেখা + +একাধিক স্বাধীন ক্লায়েন্ট ইমপ্লিমেন্টেশন থাকা ইথেরিয়াম নেটওয়ার্কের স্থিতিস্থাপকতা এবং বিকেন্দ্রীকরণকে বাড়িয়ে তোলে। + +যদি একটি ক্লায়েন্ট সমস্যা বা দুর্বলতার সম্মুখীন হয়, তবে অন্যান্য ক্লায়েন্টরা মসৃণভাবে কাজ চালিয়ে যেতে পারে, যা একটি একক ব্যর্থতার বিন্দুকে প্রতিরোধ করে। উপরন্তু, বিভিন্ন ক্লায়েন্ট ইমপ্লিমেন্টেশন উদ্ভাবন এবং প্রতিযোগিতাকে উৎসাহিত করে, যা ইকোসিস্টেমের মধ্যে উন্নতির চালিকাশক্তি এবং মনোকালচার ঝুঁকি হ্রাস করে। + +## আরও পড়ুন {#further-reading} + +- [পোর্টাল নেটওয়ার্ক (পাইপার মেরিয়াম ডেভকন বোগোটাতে)](https://www.youtube.com/watch?v=0stc9jnQLXA)। +- [পোর্টাল নেটওয়ার্ক ডিসকর্ড](https://discord.gg/CFFnmE7Hbs) +- [পোর্টাল নেটওয়ার্ক ওয়েবসাইট](https://www.ethportal.net/) diff --git a/public/content/translations/bn/developers/docs/networks/index.md b/public/content/translations/bn/developers/docs/networks/index.md new file mode 100644 index 00000000000..3312b40b854 --- /dev/null +++ b/public/content/translations/bn/developers/docs/networks/index.md @@ -0,0 +1,216 @@ +--- +title: "নেটওয়ার্ক" +description: "ইথেরিয়াম নেটওয়ার্কের একটি সংক্ষিপ্ত বিবরণ এবং আপনার অ্যাপ্লিকেশন পরীক্ষা করার জন্য টেস্টনেট ইথার (ETH) কোথা থেকে পাবেন।" +lang: bn +--- + +ইথেরিয়াম নেটওয়ার্কগুলি হলো সংযুক্ত কম্পিউটারগুলির একটি গ্রুপ যা ইথেরিয়াম প্রোটোকল ব্যবহার করে একে অপরের সাথে যোগাযোগ করে। শুধুমাত্র একটি ইথেরিয়াম মেইননেট আছে, তবে একই প্রোটোকলের নিয়ম মেনে চলা স্বাধীন নেটওয়ার্কগুলি পরীক্ষা এবং ডেভেলপমেন্টের উদ্দেশ্যে তৈরি করা যেতে পারে। অনেকগুলি স্বাধীন "নেটওয়ার্ক" আছে যা একে অপরের সাথে ইন্টারঅ্যাক্ট না করে প্রোটোকল মেনে চলে। আপনি এমনকি আপনার স্মার্ট কন্ট্র্যাক্ট এবং web3 অ্যাপগুলি পরীক্ষা করার জন্য নিজের কম্পিউটারে স্থানীয়ভাবে একটি শুরু করতে পারেন। + +আপনার ইথেরিয়াম অ্যাকাউন্ট বিভিন্ন নেটওয়ার্কে কাজ করবে, কিন্তু আপনার অ্যাকাউন্টের ব্যালেন্স এবং ট্রানজ্যাকশনের ইতিহাস প্রধান ইথেরিয়াম নেটওয়ার্ক থেকে স্থানান্তরিত হবে না। পরীক্ষার উদ্দেশ্যে, কোন নেটওয়ার্কগুলি উপলব্ধ এবং কীভাবে টেস্টনেট ETH নিয়ে পরীক্ষা নিরীক্ষা করা যায় তা জানা দরকার। সাধারণত, নিরাপত্তার কথা ভেবে, মেইননেট অ্যাকাউন্ট টেস্টনেটে বা টেস্টনেটের অ্যাকাউন্ট মেইননেটে পুনরায় ব্যবহার করার সুপারিশ করা হয় না। + +## পূর্বশর্ত {#prerequisites} + +বিভিন্ন নেটওয়ার্ক সম্পর্কে পড়ার আগে আপনার [ইথেরিয়ামের মূল বিষয়গুলি](/developers/docs/intro-to-ethereum/) বোঝা উচিত, কারণ টেস্ট নেটওয়ার্কগুলি আপনাকে ইথেরিয়ামের একটি সস্তা, নিরাপদ সংস্করণ দেবে যা নিয়ে আপনি পরীক্ষা করতে পারবেন। + +## পাবলিক নেটওয়ার্ক {#public-networks} + +ইন্টারনেট সংযোগ আছে এমন বিশ্বের যে কেউ পাবলিক নেটওয়ার্কগুলিতে অ্যাক্সেস করতে পারে। যে কেউ একটি পাবলিক ব্লকচেইনে ট্রানজ্যাকশন পড়তে বা তৈরি করতে পারে এবং কার্যকর হওয়া ট্রানজ্যাকশনগুলি যাচাই করতে পারে। পিয়ারদের মধ্যে কনসেন্সাস ট্রানজ্যাকশনগুলির অন্তর্ভুক্তি এবং নেটওয়ার্কের স্টেট সম্পর্কে সিদ্ধান্ত নেয়। + +### ইথেরিয়াম মেইননেট {#ethereum-mainnet} + +মেইননেট হল প্রাথমিক পাবলিক ইথেরিয়াম প্রোডাকশন ব্লকচেইন, যেখানে ডিস্ট্রিবিউটেড লেজারে আসল মূল্যের ট্রানজ্যাকশনগুলি ঘটে। + +যখন মানুষ এবং এক্সচেঞ্জগুলি ETH-এর দাম নিয়ে আলোচনা করে, তারা মেইননেট ETH সম্পর্কে কথা বলে। + +### ইথেরিয়াম টেস্টনেট {#ethereum-testnets} + +মেইননেট ছাড়াও, পাবলিক টেস্টনেট রয়েছে। এইগুলি এমন নেটওয়ার্ক যা প্রোটোকল ডেভেলপার বা স্মার্ট কন্ট্র্যাক্ট ডেভেলপাররা মেইননেটে ডিপ্লয়মেন্টের আগে প্রোডাকশনের মতো পরিবেশে প্রোটোকল আপগ্রেড এবং সম্ভাব্য স্মার্ট কন্ট্র্যাক্ট উভয়ই পরীক্ষা করার জন্য ব্যবহার করে। এটিকে প্রোডাকশন বনাম স্টেজিং সার্ভারের একটি উপমা হিসেবে ভাবুন। + +আপনার লেখা যেকোনো কন্ট্র্যাক্ট কোড মেইননেটে ডিপ্লয় করার আগে একটি টেস্টনেটে পরীক্ষা করা উচিত। যেসব ডিএ্যাপস বিদ্যমান স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টিগ্রেট করে, তাদের বেশিরভাগ প্রজেক্টের কপি টেস্টনেটে ডিপ্লয় করা আছে। + +বেশিরভাগ টেস্টনেট একটি পারমিশনড প্রুফ-অফ-অথরিটি কনসেন্সাস মেকানিজম ব্যবহার করে শুরু হয়েছিল। এর মানে হল অল্প সংখ্যক নোডকে ট্রানজ্যাকশন যাচাই করতে এবং নতুন ব্লক তৈরি করার জন্য বেছে নেওয়া হয় – এই প্রক্রিয়ায় তারা তাদের পরিচয় স্টেক করে। বিকল্পভাবে, কিছু টেস্টনেটে একটি উন্মুক্ত প্রুফ-অফ-স্টেক কনসেন্সাস মেকানিজম রয়েছে যেখানে প্রত্যেকে ইথেরিয়াম মেইননেটের মতোই একটি ভ্যালিডেটর চালানোর পরীক্ষা করতে পারে। + +টেস্টনেটে ETH-এর কোনো আসল মূল্য থাকার কথা নয়; তবে, কিছু নির্দিষ্ট ধরনের টেস্টনেট ETH-এর জন্য বাজার তৈরি হয়েছে যা দুর্লভ বা পাওয়া কঠিন হয়ে পড়েছে। যেহেতু ইথেরিয়ামের সাথে (এমনকি টেস্টনেটেও) ইন্টারঅ্যাক্ট করার জন্য আপনার ETH প্রয়োজন, তাই বেশিরভাগ মানুষ ফসেট থেকে বিনামূল্যে টেস্টনেট ETH পায়। বেশিরভাগ ফসেট হল ওয়েবঅ্যাপ যেখানে আপনি একটি অ্যাড্রেস ইনপুট করতে পারেন যেখানে আপনি ETH পাঠানোর অনুরোধ করেন। + +#### আমার কোন টেস্টনেট ব্যবহার করা উচিত? + +ক্লায়েন্ট ডেভেলপাররা বর্তমানে যে দুটি পাবলিক টেস্টনেট রক্ষণাবেক্ষণ করছেন সেগুলি হল সেপোলিয়া এবং হুডি। সেপোলিয়া হল কন্ট্র্যাক্ট এবং অ্যাপ্লিকেশন ডেভেলপারদের জন্য তাদের অ্যাপ্লিকেশন পরীক্ষা করার একটি নেটওয়ার্ক। হুডি নেটওয়ার্ক প্রোটোকল ডেভেলপারদের নেটওয়ার্ক আপগ্রেড পরীক্ষা করতে দেয় এবং স্টেকারদের ভ্যালিডেটর চালানো পরীক্ষা করতে দেয়। + +#### সেপোলিয়া {#sepolia} + +**অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য সেপোলিয়া হল সুপারিশকৃত ডিফল্ট টেস্টনেট**। সেপোলিয়া নেটওয়ার্ক একটি পারমিশনড ভ্যালিডেটর সেট ব্যবহার করে যা ক্লায়েন্ট ও টেস্টিং টিম দ্বারা নিয়ন্ত্রিত হয়। + +##### রিসোর্স + +- [ওয়েবসাইট](https://sepolia.dev/) +- [গিটহাব](https://github.com/eth-clients/sepolia) +- [অটারস্ক্যান](https://sepolia.otterscan.io/) +- [ইথারস্ক্যান](https://sepolia.etherscan.io) +- [ব্লকস্কাউট](https://eth-sepolia.blockscout.com/) + +##### ফসেট + +- [অ্যালকেমি সেপোলিয়া ফসেট](https://www.alchemy.com/faucets/ethereum-sepolia) +- [চেইন প্ল্যাটফর্ম সেপোলিয়া ফসেট](https://faucet.chainplatform.co/faucets/ethereum-sepolia/) +- [চেইনস্ট্যাক সেপোলিয়া ফসেট](https://faucet.chainstack.com/sepolia-testnet-faucet) +- [ইথেরিয়াম ইকোসিস্টেম ফসেট](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) +- [ethfaucet.com সেপোলিয়া ফসেট](https://ethfaucet.com/networks/ethereum) +- [Google ক্লাউড Web3 সেপোলিয়া ফসেট](https://cloud.google.com/application/web3/faucet/ethereum/sepolia) +- [গ্র্যাবটিথ](https://grabteeth.xyz/) +- [ইনফিউরা সেপোলিয়া ফসেট](https://www.infura.io/faucet) +- [PoW ফসেট](https://sepolia-faucet.pk910.de/) +- [কুইকনোড সেপোলিয়া ফসেট](https://faucet.quicknode.com/ethereum/sepolia) + +#### হুডি {#hoodi} + +হুডি হলো ভ্যালিডেটিং এবং স্টেকিং পরীক্ষা করার জন্য একটি টেস্টনেট। যারা টেস্টনেট ভ্যালিডেটর চালাতে চান তাদের জন্য হুডি নেটওয়ার্কটি উন্মুক্ত। যেসব স্টেকাররা প্রোটোকল আপগ্রেডগুলি মেইননেটে ডিপ্লয় করার আগে পরীক্ষা করতে চান, তাদের হুডি ব্যবহার করা উচিত। + +- উন্মুক্ত ভ্যালিডেটর সেট, স্টেকাররা নেটওয়ার্ক আপগ্রেড পরীক্ষা করতে পারে +- বড় স্টেট, জটিল স্মার্ট কন্ট্র্যাক্ট ইন্টারঅ্যাকশন পরীক্ষা করার জন্য উপযোগী +- সিঙ্ক হতে বেশি সময় লাগে এবং একটি নোড চালানোর জন্য আরও বেশি স্টোরেজ প্রয়োজন + +##### রিসোর্স + +- [ওয়েবসাইট](https://hoodi.ethpandaops.io/) +- [গিটহাব](https://github.com/eth-clients/hoodi) +- [এক্সপ্লোরার](https://explorer.hoodi.ethpandaops.io/) +- [চেকপয়েন্ট সিঙ্ক](https://checkpoint-sync.hoodi.ethpandaops.io/) +- [অটারস্ক্যান](https://hoodi.otterscan.io/) +- [ইথারস্ক্যান](https://hoodi.etherscan.io/) + +##### ফসেট + +- [চেইন প্ল্যাটফর্ম হুডি ফসেট](https://faucet.chainplatform.co/faucets/ethereum-hoodi/) +- [হুডি ফসেট](https://hoodi.ethpandaops.io/) +- [PoW ফসেট](https://hoodi-faucet.pk910.de/) + +#### এফেমেরি {#ephemery} + +এফেমেরি হল এক বিশেষ ধরনের টেস্টনেট যা প্রতি মাসে সম্পূর্ণভাবে রিসেট হয়। এক্সিকিউশন এবং কনসেন্সাস স্টেট প্রতি ২৮ দিনে জেনেসিসে ফিরে যায়, যার মানে হল টেস্টনেটে যা কিছু ঘটে তা ক্ষণস্থায়ী। এটি স্বল্পমেয়াদী পরীক্ষা, দ্রুত নোড বুটস্ট্র্যাপ এবং 'হ্যালো ওয়ার্ল্ড' ধরনের অ্যাপ্লিকেশনের জন্য আদর্শ, যাদের স্থায়িত্বের প্রয়োজন নেই। + +- সর্বদা নতুন স্টেট, ভ্যালিডেটর এবং অ্যাপের স্বল্পমেয়াদী পরীক্ষা +- শুধুমাত্র কন্ট্র্যাক্টের বেসিক সেট অন্তর্ভুক্ত +- উন্মুক্ত ভ্যালিডেটর সেট এবং বড় আকারের ফান্ড সহজে অ্যাক্সেসযোগ্য +- সবচেয়ে ছোট নোডের প্রয়োজনীয়তা এবং দ্রুততম সিঙ্ক, গড়ে <5GB + +##### রিসোর্স + +- [ওয়েবসাইট](https://ephemery.dev/) +- [গিটহাব](https://github.com/ephemery-testnet/ephemery-resources) +- [কমিউনিটি চ্যাট](https://matrix.to/#/#staker-testnet:matrix.org) +- [ব্লকস্কাউট](https://explorer.ephemery.dev/) +- [অটারস্ক্যান](https://otter.bordel.wtf/) +- [বিকন এক্সপ্লোরার](https://beaconlight.ephemery.dev/) +- [চেকপয়েন্ট সিঙ্ক](https://checkpoint-sync.ephemery.ethpandaops.io) +- [লঞ্চপ্যাড](https://launchpad.ephemery.dev/) + +#### ফসেট + +- [বোরডেল ফসেট](https://faucet.bordel.wtf/) +- [Pk910 PoW ফসেট](https://ephemery-faucet.pk910.de/) + +#### হোলস্কি (অপ্রচলিত) {#holesky} + +হোলস্কি টেস্টনেট সেপ্টেম্বর 2025 থেকে অপ্রচলিত। স্টেকিং অপারেটর এবং ইনফ্রাস্ট্রাকচার প্রদানকারীদের পরিবর্তে ভ্যালিডেটর পরীক্ষার জন্য হুডি ব্যবহার করা উচিত। + +- [হোলস্কি টেস্টনেট শাটডাউন ঘোষণা](https://blog.ethereum.org/2025/09/01/holesky-shutdown-announcement) - _EF ব্লগ, ১-সেপ্টেম্বর-২০২৫_ +- [হোলস্কি এবং হুডি টেস্টনেট আপডেট](https://blog.ethereum.org/en/2025/03/18/hoodi-holesky) - _EF ব্লগ, ১৮-মার্চ-২০২৫_ + +### লেয়ার 2 টেস্টনেট {#layer-2-testnets} + +[লেয়ার 2 (L2)](/layer-2/) হল একটি সম্মিলিত শব্দ যা ইথেরিয়াম স্কেলিং সলিউশনের একটি নির্দিষ্ট সেটকে বর্ণনা করতে ব্যবহৃত হয়। একটি লেয়ার 2 হল একটি আলাদা ব্লকচেইন যা ইথেরিয়ামকে প্রসারিত করে এবং ইথেরিয়ামের নিরাপত্তার নিশ্চয়তা উত্তরাধিকার সূত্রে পায়। লেয়ার 2 টেস্টনেট সাধারণত পাবলিক ইথেরিয়াম টেস্টনেটের সাথে দৃঢ়ভাবে সংযুক্ত থাকে। + +#### আরবিট্রাম সেপোলিয়া {#arbitrum-sepolia} + +[আরবিট্রাম](https://arbitrum.io/)-এর জন্য একটি টেস্টনেট। + +##### রিসোর্স + +- [ইথারস্ক্যান](https://sepolia.arbiscan.io/) +- [ব্লকস্কাউট](https://sepolia-explorer.arbitrum.io/) + +##### ফসেট + +- [অ্যালকেমি আরবিট্রাম সেপোলিয়া ফসেট](https://www.alchemy.com/faucets/arbitrum-sepolia) +- [চেইনলিংক আরবিট্রাম সেপোলিয়া ফসেট](https://faucets.chain.link/arbitrum-sepolia) +- [ethfaucet.com আরবিট্রাম সেপোলিয়া ফসেট](https://ethfaucet.com/networks/arbitrum) +- [কুইকনোড আরবিট্রাম সেপোলিয়া ফসেট](https://faucet.quicknode.com/arbitrum/sepolia) + +#### অপ্টিমিস্টিক সেপোলিয়া {#optimistic-sepolia} + +[অপ্টিমিজম](https://www.optimism.io/)-এর জন্য একটি টেস্টনেট। + +##### রিসোর্স + +- [ইথারস্ক্যান](https://sepolia-optimistic.etherscan.io/) +- [ব্লকস্কাউট](https://optimism-sepolia.blockscout.com/) + +##### ফসেট + +- [অ্যালকেমি ফসেট](https://www.alchemy.com/faucets/optimism-sepolia) +- [চেইনলিংক ফসেট](https://faucets.chain.link/optimism-sepolia) +- [ethfaucet.com অপ্টিমিজম সেপোলিয়া ফসেট](https://ethfaucet.com/networks/optimism) +- [টেস্টনেট ফসেট](https://docs.optimism.io/builders/tools/build/faucets) + +#### স্টার্কনেট সেপোলিয়া {#starknet-sepolia} + +[স্টার্কনেট](https://www.starknet.io)-এর জন্য একটি টেস্টনেট। + +##### রিসোর্স + +- [স্টার্কস্ক্যান](https://sepolia.starkscan.co/) + +##### ফসেট + +- [অ্যালকেমি ফসেট](https://www.alchemy.com/faucets/starknet-sepolia) +- [ব্লাস্ট স্টার্কনেট সেপোলিয়া ফসেট](https://blastapi.io/faucets/starknet-sepolia-eth) +- [স্টার্কনেট ফসেট](https://starknet-faucet.vercel.app/) + +## প্রাইভেট নেটওয়ার্ক {#private-networks} + +একটি ইথেরিয়াম নেটওয়ার্ক একটি প্রাইভেট নেটওয়ার্ক যদি এর নোডগুলি কোনো পাবলিক নেটওয়ার্কের (অর্থাৎ, মেইননেট বা একটি টেস্টনেট) সাথে সংযুক্ত না থাকে। এই প্রসঙ্গে, প্রাইভেট মানে শুধুমাত্র সংরক্ষিত বা বিচ্ছিন্ন, সুরক্ষিত বা নিরাপদ নয়। + +### ডেভেলপমেন্ট নেটওয়ার্ক {#development-networks} + +একটি ইথেরিয়াম অ্যাপ্লিকেশন ডেভেলপ করার জন্য, আপনি এটি ডিপ্লয় করার আগে এটি কীভাবে কাজ করে তা দেখতে একটি প্রাইভেট নেটওয়ার্কে চালাতে চাইবেন। আপনি যেমন ওয়েব ডেভেলপমেন্টের জন্য আপনার কম্পিউটারে একটি লোকাল সার্ভার তৈরি করেন, তেমনি আপনার dapp পরীক্ষা করার জন্য একটি লোকাল ব্লকচেইন ইনস্ট্যান্স তৈরি করতে পারেন। এটি একটি পাবলিক টেস্টনেটের চেয়ে অনেক দ্রুত পুনরাবৃত্তির সুযোগ দেয়। + +এটিতে সহায়তা করার জন্য নিবেদিত প্রকল্প এবং টুলস রয়েছে। [ডেভেলপমেন্ট নেটওয়ার্ক](/developers/docs/development-networks/) সম্পর্কে আরও জানুন। + +### কনসোর্টিয়াম নেটওয়ার্ক {#consortium-networks} + +কনসেন্সাস প্রক্রিয়াটি বিশ্বস্ত নোডগুলির একটি পূর্ব-নির্ধারিত সেট দ্বারা নিয়ন্ত্রিত হয়। উদাহরণস্বরূপ, পরিচিত একাডেমিক প্রতিষ্ঠানগুলির একটি প্রাইভেট নেটওয়ার্ক যেখানে প্রতিটি একটি একক নোড পরিচালনা করে, এবং ব্লকগুলি নেটওয়ার্কের মধ্যে স্বাক্ষরকারীদের একটি থ্রেশহোল্ড দ্বারা যাচাই করা হয়। + +যদি একটি পাবলিক ইথেরিয়াম নেটওয়ার্ক পাবলিক ইন্টারনেটের মতো হয়, একটি কনসোর্টিয়াম নেটওয়ার্ক একটি প্রাইভেট ইন্ট্রানেটের মতো। + +## কেন ইথেরিয়াম টেস্টনেটগুলির নাম মেট্রো স্টেশনের নামে রাখা হয়? {#why-naming} + +অনেক ইথেরিয়াম টেস্টনেটের নাম বাস্তব-জগতের মেট্রো বা ট্রেন স্টেশনের নামে রাখা হয়েছে। এই নামকরণের ঐতিহ্যটি প্রথম দিকে শুরু হয়েছিল এবং এটি সেইসব বিশ্বব্যাপী শহরগুলিকে প্রতিফলিত করে যেখানে কন্ট্রিবিউটররা বসবাস করেছেন বা কাজ করেছেন। এটি প্রতীকী, স্মরণীয় এবং ব্যবহারিক। ঠিক যেমন টেস্টনেটগুলি ইথেরিয়াম মেইননেট থেকে বিচ্ছিন্ন, মেট্রো লাইনগুলি ভূপৃষ্ঠের ট্র্যাফিক থেকে আলাদাভাবে চলে। + +### সাধারণভাবে ব্যবহৃত এবং লিগ্যাসি টেস্টনেট {#common-and-legacy-testnets} + +- **সেপোলিয়া** - এথেন্স, গ্রীসের একটি মেট্রো-সংযুক্ত এলাকা। বর্তমানে স্মার্ট কন্ট্র্যাক্ট এবং dApp পরীক্ষার জন্য ব্যবহৃত হয়। +- **হুডি** - ভারতের বেঙ্গালুরুর হুডি মেট্রো স্টেশনের নামে নামকরণ করা হয়েছে। ভ্যালিডেটর এবং প্রোটোকল আপগ্রেড পরীক্ষার জন্য ব্যবহৃত হয়। +- **গোয়েরলি** _(অপ্রচলিত)_ - জার্মানির বার্লিনের গোর্লিটজার বাহনহফের নামে নামকরণ করা হয়েছে। +- **রিঙ্কেবি** _(অপ্রচলিত)_ - একটি মেট্রো স্টেশনসহ স্টকহোমের একটি শহরতলির নামে নামকরণ করা হয়েছে। +- **রোপস্টেন** _(অপ্রচলিত)_ - স্টকহোমের একটি এলাকা এবং প্রাক্তন ফেরি/মেট্রো টার্মিনালকে বোঝায়। +- **কোভান** _(অপ্রচলিত)_ - সিঙ্গাপুরের একটি এমআরটি স্টেশনের নামে নামকরণ করা হয়েছে। +- **মর্ডেন** _(অপ্রচলিত)_ - লন্ডনের একটি আন্ডারগ্রাউন্ড স্টেশনের নামে নামকরণ করা হয়েছে। ইথেরিয়ামের প্রথম পাবলিক টেস্টনেট। + +### অন্যান্য বিশেষায়িত টেস্টনেট {#other-testnets} + +কিছু টেস্টনেট স্বল্পমেয়াদী বা আপগ্রেড-নির্দিষ্ট পরীক্ষার জন্য তৈরি করা হয়েছিল এবং সেগুলি অগত্যা মেট্রো-থিমযুক্ত নয়: + +- **হোলস্কি** _(অপ্রচলিত)_ - প্রাগের হোলসোভিস স্টেশনের নামে নামকরণ করা হয়েছে। ভ্যালিডেটর পরীক্ষার জন্য ব্যবহৃত; ২০২৫ সালে অপ্রচলিত। +- **কিলন**, **ঝেজিয়াং**, **শানডং**, **প্রেটার**, **পাইরমন্ট**, **অলিম্পিক** _(সবই অপ্রচলিত)_ এবং **এফেমেরি** - দ্য মার্জ, সাংহাই-এর মতো আপগ্রেড সিমুলেশন বা ভ্যালিডেটর পরীক্ষার জন্য বিশেষভাবে তৈরি করা হয়েছে। কিছু নাম মেট্রো-ভিত্তিক না হয়ে আঞ্চলিক বা থিম্যাটিক। + +মেট্রো স্টেশনের নাম ব্যবহার করা ডেভেলপারদের সাংখ্যিক চেইন আইডি-র উপর নির্ভর না করে দ্রুত টেস্টনেট সনাক্ত করতে এবং মনে রাখতে সাহায্য করে। এটি ইথেরিয়ামের সংস্কৃতিকেও প্রতিফলিত করে: ব্যবহারিক, বিশ্বব্যাপী এবং মানব-কেন্দ্রিক। + +## সম্পর্কিত টুলস {#related-tools} + +- [চেইনলিস্ট](https://chainlist.org/) _EVM নেটওয়ার্কের তালিকা যা ওয়ালেট এবং প্রোভাইডারদের সঠিক চেইন আইডি এবং নেটওয়ার্ক আইডির সাথে সংযুক্ত করে_ +- [EVM-ভিত্তিক চেইন](https://github.com/ethereum-lists/chains) _চেইন মেটাডেটার গিটহাব রিপো যা চেইনলিস্টকে শক্তি জোগায়_ + +## আরও পড়ুন {#further-reading} + +- [প্রস্তাব: অনুমানযোগ্য ইথেরিয়াম টেস্টনেট জীবনচক্র](https://ethereum-magicians.org/t/proposal-predictable-ethereum-testnet-lifecycle/11575/17) +- [ইথেরিয়াম টেস্টনেটগুলির বিবর্তন](https://etherworld.co/2022/08/19/the-evolution-of-ethereum-testnet/) diff --git a/public/content/translations/bn/developers/docs/nodes-and-clients/archive-nodes/index.md b/public/content/translations/bn/developers/docs/nodes-and-clients/archive-nodes/index.md new file mode 100644 index 00000000000..92c17b5d9d1 --- /dev/null +++ b/public/content/translations/bn/developers/docs/nodes-and-clients/archive-nodes/index.md @@ -0,0 +1,81 @@ +--- +title: "ইথেরিয়াম আর্কাইভ নোড" +description: "আর্কাইভ নোডগুলির একটি ওভারভিউ" +lang: bn +sidebarDepth: 2 +--- + +একটি আর্কাইভ নোড হলো একটি ইথেরিয়াম ক্লায়েন্টের একটি ইনস্ট্যান্স যা সমস্ত ঐতিহাসিক স্টেটগুলির একটি আর্কাইভ তৈরি করার জন্য কনফিগার করা থাকে। এটি নির্দিষ্ট কিছু ব্যবহারের ক্ষেত্রে একটি দরকারী টুল কিন্তু একটি সম্পূর্ণ নোড চালানোর চেয়ে এটি চালানো আরও কঠিন হতে পারে। + +## পূর্বশর্ত {#prerequisites} + +আপনার একটি [ইথেরিয়াম নোড](/developers/docs/nodes-and-clients/)-এর ধারণা, [এর আর্কিটেকচার](/developers/docs/nodes-and-clients/node-architecture/), [সিঙ্ক কৌশল](/developers/docs/nodes-and-clients/#sync-modes), [এটি চালানোর](/developers/docs/nodes-and-clients/run-a-node/) এবং [ব্যবহার করার](/developers/docs/apis/json-rpc/) অভ্যাসগুলি বোঝা উচিত। + +## একটি আর্কাইভ নোড কী + +একটি আর্কাইভ নোডের গুরুত্ব বোঝার জন্য, আসুন "স্টেট"-এর ধারণাটি স্পষ্ট করি। ইথেরিয়ামকে একটি _লেনদেন-ভিত্তিক স্টেট মেশিন_ হিসেবে উল্লেখ করা যেতে পারে। এটি অ্যাকাউন্ট এবং অ্যাপ্লিকেশনগুলি নিয়ে গঠিত যা তাদের স্টেট পরিবর্তনকারী লেনদেনগুলি কার্যকর করে। প্রতিটি অ্যাকাউন্ট এবং চুক্তি সম্পর্কে তথ্য সহ গ্লোবাল ডেটা স্টেট নামক একটি ট্রাই ডেটাবেসে সংরক্ষণ করা হয়। এটি এক্সিকিউশন লেয়ার (EL) ক্লায়েন্ট দ্বারা পরিচালিত হয় এবং এর মধ্যে রয়েছে: + +- অ্যাকাউন্টের ব্যালেন্স এবং ননসেস +- চুক্তির কোড এবং স্টোরেজ +- কনসেন্সাস-সম্পর্কিত ডেটা, যেমন, স্টেকিং ডিপোজিট চুক্তি + +নেটওয়ার্কের সাথে ইন্টারঅ্যাক্ট করতে, নতুন ব্লক যাচাই এবং তৈরি করতে, ইথেরিয়াম ক্লায়েন্টদের সবচেয়ে সাম্প্রতিক পরিবর্তনগুলির সাথে (চেইনের অগ্রভাগ) তাল মিলিয়ে চলতে হবে এবং তাই বর্তমান স্টেট বজায় রাখতে হবে। একটি এক্সিকিউশন লেয়ার ক্লায়েন্ট যা একটি সম্পূর্ণ নোড হিসাবে কনফিগার করা আছে তা নেটওয়ার্কের সর্বশেষ স্টেট যাচাই করে এবং অনুসরণ করে কিন্তু শুধুমাত্র অতীতের কয়েকটি স্টেট ক্যাশে করে, যেমন, শেষ 128টি ব্লকের সাথে যুক্ত স্টেট, যাতে এটি চেইন রিঅর্গগুলি পরিচালনা করতে পারে এবং সাম্প্রতিক ডেটাতে দ্রুত অ্যাক্সেস সরবরাহ করতে পারে। সাম্প্রতিক স্টেট হলো যা সমস্ত ক্লায়েন্টের আগত লেনদেন যাচাই করতে এবং নেটওয়ার্ক ব্যবহার করতে প্রয়োজন। + +আপনি একটি নির্দিষ্ট ব্লকে স্টেটকে একটি ক্ষণস্থায়ী নেটওয়ার্ক স্ন্যাপশট হিসাবে এবং আর্কাইভকে একটি হিস্ট্রি রিপ্লে হিসাবে কল্পনা করতে পারেন। + +ঐতিহাসিক স্টেটগুলি নিরাপদে ছাঁটাই করা যেতে পারে কারণ নেটওয়ার্ক পরিচালনার জন্য এগুলির প্রয়োজন নেই এবং ক্লায়েন্টের জন্য সমস্ত পুরানো ডেটা রাখা অপ্রয়োজনীয়ভাবে বাহুল্য হবে। কিছু সাম্প্রতিক ব্লকের (যেমন, হেডের 128টি ব্লক আগে) আগে বিদ্যমান স্টেটগুলি কার্যকরভাবে ফেলে দেওয়া হয়। সম্পূর্ণ নোডগুলি শুধুমাত্র ঐতিহাসিক ব্লকচেইন ডেটা (ব্লক এবং লেনদেন) এবং মাঝে মাঝে ঐতিহাসিক স্ন্যাপশট রাখে যা তারা অনুরোধের ভিত্তিতে পুরানো স্টেটগুলি পুনরায় তৈরি করতে ব্যবহার করতে পারে। তারা EVM-এ অতীতের লেনদেনগুলি পুনরায় কার্যকর করে এটি করে, যা কম্পিউটেশনালি চাহিদাপূর্ণ হতে পারে যখন কাঙ্ক্ষিত স্টেটটি নিকটতম স্ন্যাপশট থেকে অনেক দূরে থাকে। + +যাইহোক, এর মানে হল যে একটি সম্পূর্ণ নোডে একটি ঐতিহাসিক স্টেট অ্যাক্সেস করতে অনেক কম্পিউটেশন লাগে। ক্লায়েন্টের অতীতের সমস্ত লেনদেন কার্যকর করতে এবং জেনেসিস থেকে একটি ঐতিহাসিক স্টেট গণনা করার প্রয়োজন হতে পারে। আর্কাইভ নোডগুলি শুধুমাত্র সবচেয়ে সাম্প্রতিক স্টেটগুলি সংরক্ষণ করে নয়, বরং প্রতিটি ব্লকের পরে তৈরি প্রতিটি ঐতিহাসিক স্টেটও সংরক্ষণ করে এর সমাধান করে। এটি মূলত বৃহত্তর ডিস্ক স্পেসের প্রয়োজনের সাথে একটি আপস করে। + +এটা মনে রাখা গুরুত্বপূর্ণ যে নেটওয়ার্ক সমস্ত ঐতিহাসিক ডেটা রাখা এবং সরবরাহ করার জন্য আর্কাইভ নোডগুলির উপর নির্ভর করে না। উপরে উল্লিখিত হিসাবে, সমস্ত ঐতিহাসিক অন্তর্বর্তী স্টেটগুলি একটি সম্পূর্ণ নোড থেকে প্রাপ্ত করা যেতে পারে। যেকোনো সম্পূর্ণ নোড দ্বারা লেনদেনগুলি সংরক্ষণ করা হয় (বর্তমানে 400G-এর কম) এবং পুরো আর্কাইভটি তৈরি করতে পুনরায় প্লে করা যেতে পারে। + +### ব্যবহার + +ইথেরিয়ামের নিয়মিত ব্যবহার যেমন লেনদেন পাঠানো, চুক্তি স্থাপন করা, কনসেন্সাস যাচাই করা ইত্যাদির জন্য ঐতিহাসিক স্টেটগুলিতে অ্যাক্সেসের প্রয়োজন হয় না। নেটওয়ার্কের সাথে একটি স্ট্যান্ডার্ড ইন্টারঅ্যাকশনের জন্য ব্যবহারকারীদের কখনো একটি আর্কাইভ নোডের প্রয়োজন হয় না। + +স্টেট আর্কাইভের প্রধান সুবিধা হলো ঐতিহাসিক স্টেটগুলি সম্পর্কে ক্যোয়ারিগুলিতে দ্রুত অ্যাক্সেস। উদাহরণস্বরূপ, আর্কাইভ নোড দ্রুত ফলাফল দেবে যেমন: + +- _অ্যাকাউন্ট 0x1337...-এর ETH ব্যালেন্স কত ছিল_ ব্লক 15537393-এ?_ +- _ব্লক 1920000-এ চুক্তি 0x-এ টোকেন 0x-এর ব্যালেন্স কত?_ + +উপরে যেমন ব্যাখ্যা করা হয়েছে, একটি সম্পূর্ণ নোডকে EVM এক্সিকিউশনের মাধ্যমে এই ডেটা তৈরি করতে হবে যা CPU ব্যবহার করে এবং সময় নেয়। আর্কাইভ নোডগুলি ডিস্কে সেগুলি অ্যাক্সেস করে এবং অবিলম্বে প্রতিক্রিয়া পরিবেশন করে। এটি অবকাঠামোর নির্দিষ্ট কিছু অংশের জন্য একটি দরকারী বৈশিষ্ট্য, উদাহরণস্বরূপ: + +- ব্লক এক্সপ্লোরারের মতো পরিষেবা প্রদানকারী +- গবেষক +- নিরাপত্তা বিশ্লেষক +- Dapp ডেভেলপার +- অডিটিং এবং কমপ্লায়েন্স + +বিভিন্ন বিনামূল্যে [পরিষেবা](/developers/docs/nodes-and-clients/nodes-as-a-service/) রয়েছে যা ঐতিহাসিক ডেটাতে অ্যাক্সেসেরও অনুমতি দেয়। যেহেতু একটি আর্কাইভ নোড চালানো আরও চাহিদাপূর্ণ, এই অ্যাক্সেস বেশিরভাগই সীমিত এবং শুধুমাত্র মাঝে মাঝে অ্যাক্সেসের জন্য কাজ করে। যদি আপনার প্রকল্পের ঐতিহাসিক ডেটাতে ক্রমাগত অ্যাক্সেসের প্রয়োজন হয়, তবে আপনার নিজের একটি চালানোর কথা বিবেচনা করা উচিত। + +## বাস্তবায়ন এবং ব্যবহার + +এই প্রসঙ্গে আর্কাইভ নোড মানে ব্যবহারকারী-মুখী এক্সিকিউশন লেয়ার ক্লায়েন্টদের দ্বারা পরিবেশিত ডেটা কারণ তারা স্টেট ডেটাবেস পরিচালনা করে এবং JSON-RPC এন্ডপয়েন্ট সরবরাহ করে। কনফিগারেশন অপশন, সিঙ্ক সময় এবং ডেটাবেস আকার ক্লায়েন্ট ভেদে ভিন্ন হতে পারে। বিস্তারিত জানতে, অনুগ্রহ করে আপনার ক্লায়েন্ট দ্বারা প্রদত্ত ডকুমেন্টেশন দেখুন। + +আপনার নিজের আর্কাইভ নোড শুরু করার আগে, ক্লায়েন্টগুলির মধ্যে পার্থক্য এবং বিশেষ করে বিভিন্ন [হার্ডওয়্যার প্রয়োজনীয়তা](/developers/docs/nodes-and-clients/run-a-node/#requirements) সম্পর্কে জানুন। বেশিরভাগ ক্লায়েন্ট এই বৈশিষ্ট্যের জন্য অপ্টিমাইজ করা হয় না এবং তাদের আর্কাইভগুলির জন্য 12TB-র বেশি জায়গার প্রয়োজন হয়। বিপরীতে, Erigon-এর মতো বাস্তবায়নগুলি একই ডেটা 3TB-র কম জায়গায় সংরক্ষণ করতে পারে যা তাদের একটি আর্কাইভ নোড চালানোর সবচেয়ে কার্যকর উপায় করে তোলে। + +## সুপারিশকৃত অভ্যাস + +[একটি নোড চালানোর জন্য সাধারণ সুপারিশগুলি](/developers/docs/nodes-and-clients/run-a-node/) ছাড়াও, একটি আর্কাইভ নোড হার্ডওয়্যার এবং রক্ষণাবেক্ষণে আরও চাহিদাপূর্ণ হতে পারে। Erigon-এর [মূল বৈশিষ্ট্যগুলি](https://github.com/ledgerwatch/erigon#key-features) বিবেচনা করে, সবচেয়ে বাস্তবসম্মত পদ্ধতি হল [Erigon](/developers/docs/nodes-and-clients/#erigon) ক্লায়েন্ট বাস্তবায়ন ব্যবহার করা। + +### হার্ডওয়্যার + +সর্বদা একটি ক্লায়েন্টের ডকুমেন্টেশনে একটি নির্দিষ্ট মোডের জন্য হার্ডওয়্যার প্রয়োজনীয়তা যাচাই করা নিশ্চিত করুন। +আর্কাইভ নোডগুলির জন্য সবচেয়ে বড় প্রয়োজন হলো ডিস্ক স্পেস। ক্লায়েন্টের উপর নির্ভর করে, এটি 3TB থেকে 12TB পর্যন্ত পরিবর্তিত হয়। যদিও HDD বড় পরিমাণে ডেটার জন্য একটি ভালো সমাধান হিসাবে বিবেচিত হতে পারে, এটি সিঙ্ক করা এবং চেইনের হেড ক্রমাগত আপডেট করার জন্য SSD ড্রাইভের প্রয়োজন হবে। [SATA](https://www.cleverfiles.com/help/sata-hard-drive.html) ড্রাইভগুলি যথেষ্ট ভালো কিন্তু এটি একটি নির্ভরযোগ্য মানের হওয়া উচিত, অন্তত [TLC](https://blog.synology.com/tlc-vs-qlc-ssds-what-are-the-differences)। যথেষ্ট স্লট সহ একটি ডেস্কটপ কম্পিউটার বা একটি সার্ভারে ডিস্কগুলি লাগানো যেতে পারে। এই ধরনের ডেডিকেটেড ডিভাইস উচ্চ আপটাইম নোড চালানোর জন্য আদর্শ। এটি একটি ল্যাপটপে চালানো সম্পূর্ণ সম্ভব কিন্তু বহনযোগ্যতা একটি অতিরিক্ত খরচে আসবে। + +সমস্ত ডেটা একটি ভলিউমে ফিট করতে হবে, তাই ডিস্কগুলিকে যুক্ত করতে হবে, যেমন, [RAID0](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0) বা LVM দিয়ে। [ZFS](https://en.wikipedia.org/wiki/ZFS) ব্যবহার করাও বিবেচনা করার মতো হতে পারে কারণ এটি "কপি-অন-রাইট" সমর্থন করে যা নিশ্চিত করে যে ডেটা কোনো নিম্ন-স্তরের ত্রুটি ছাড়াই ডিস্কে সঠিকভাবে লেখা হয়েছে। + +আকস্মিক ডেটাবেস দুর্নীতি প্রতিরোধে আরও স্থিতিশীলতা এবং নিরাপত্তার জন্য, বিশেষ করে একটি পেশাদার সেটআপে, আপনার সিস্টেম সমর্থন করলে [ECC মেমরি](https://en.wikipedia.org/wiki/ECC_memory) ব্যবহার করার কথা বিবেচনা করুন। RAM-এর আকার সাধারণত একটি সম্পূর্ণ নোডের জন্য যা প্রয়োজন তার সমান রাখার পরামর্শ দেওয়া হয় কিন্তু আরও বেশি RAM সিঙ্ক্রোনাইজেশনের গতি বাড়াতে সাহায্য করতে পারে। + +প্রাথমিক সিঙ্কের সময়, আর্কাইভ মোডে ক্লায়েন্টরা জেনেসিস থেকে প্রতিটি লেনদেন সম্পাদন করবে। এক্সিকিউশনের গতি বেশিরভাগই CPU দ্বারা সীমিত, তাই একটি দ্রুততর CPU প্রাথমিক সিঙ্কের সময় সাহায্য করতে পারে। একটি গড় ভোক্তা কম্পিউটারে, প্রাথমিক সিঙ্ক এক মাস পর্যন্ত সময় নিতে পারে। + +## আরও পড়ুন {#further-reading} + +- [ইথেরিয়াম সম্পূর্ণ নোড বনাম আর্কাইভ নোড](https://www.quicknode.com/guides/infrastructure/ethereum-full-node-vs-archive-node) - _কুইকনোড, সেপ্টেম্বর ২০২২_ +- [আপনার নিজের ইথেরিয়াম আর্কাইভ নোড তৈরি করা](https://tjayrush.medium.com/building-your-own-ethereum-archive-node-72c014affc09) - _থমাস জে রাশ, আগস্ট ২০২১_ +- [পরিষেবা হিসাবে Erigon, Erigon-এর RPC এবং TrueBlocks (স্ক্রেপ এবং API) কীভাবে সেট আপ করবেন](https://magnushansson.xyz/blog_posts/crypto_defi/2022-01-10-Erigon-Trueblocks) _– ম্যাগনাস হ্যানসন, সেপ্টেম্বর ২০২২-এ আপডেট করা হয়েছে_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) +- [একটি নোড চালানো](/developers/docs/nodes-and-clients/run-a-node/) diff --git a/public/content/translations/bn/developers/docs/nodes-and-clients/bootnodes/index.md b/public/content/translations/bn/developers/docs/nodes-and-clients/bootnodes/index.md new file mode 100644 index 00000000000..4be6be63fa8 --- /dev/null +++ b/public/content/translations/bn/developers/docs/nodes-and-clients/bootnodes/index.md @@ -0,0 +1,31 @@ +--- +title: "ইথেরিয়াম বুটনোডে ভূমিকা" +description: "বুটনোডগুলি বোঝার জন্য আপনার প্রয়োজনীয় প্রাথমিক তথ্য" +lang: bn +--- + +যখন একটি নতুন নোড ইথেরিয়াম নেটওয়ার্কে যোগ দেয়, তখন নতুন পিয়ারদের আবিষ্কার করার জন্য এটিকে ইতিমধ্যেই নেটওয়ার্কে থাকা নোডগুলির সাথে সংযোগ স্থাপন করতে হয়। ইথেরিয়াম নেটওয়ার্কে এই এন্ট্রি পয়েন্টগুলিকে বুটনোড বলা হয়। ক্লায়েন্টদের মধ্যে সাধারণত বুটনোডগুলির একটি তালিকা হার্ডকোড করা থাকে। এই বুটনোডগুলি সাধারণত ইথেরিয়াম ফাইন্ডেশনের ডেভঅপস টিম বা ক্লায়েন্ট টিম নিজেরাই চালায়। মনে রাখবেন যে বুটনোডগুলি স্ট্যাটিক নোডের মতো নয়। স্ট্যাটিক নোডগুলিকে বারবার কল করা হয়, যেখানে বুটনোডগুলিকে কেবল তখনই কল করা হয় যদি সংযোগ করার জন্য যথেষ্ট পিয়ার না থাকে এবং একটি নোডকে কিছু নতুন সংযোগ বুটস্ট্র্যাপ করতে হয়। + +## একটি বুটনোডের সাথে সংযোগ করুন {#connect-to-a-bootnode} + +বেশিরভাগ ক্লায়েন্টের একটি বিল্টইন বুটনোডের তালিকা থাকে, তবে আপনি নিজের বুটনোডও চালাতে চাইতে পারেন, বা ক্লায়েন্টের হার্ডকোডেড তালিকার অংশ নয় এমন একটি ব্যবহার করতে পারেন। এই ক্ষেত্রে, আপনি আপনার ক্লায়েন্ট শুরু করার সময় সেগুলি নির্দিষ্ট করতে পারেন, যেমনটি নিচে দেখানো হয়েছে (উদাহরণটি Geth-এর জন্য, অনুগ্রহ করে আপনার ক্লায়েন্টের নথিপত্র দেখুন): + +``` +geth --bootnodes "enode://@:" +``` + +## একটি বুটনোড চালান {#run-a-bootnode} + +বুটনোডগুলি সম্পূর্ণ নোড যা NAT-এর ([Network Address Translation](https://www.geeksforgeeks.org/network-address-translation-nat/)) পিছনে নেই। প্রতিটি সম্পূর্ণ নোড একটি বুটনোড হিসাবে কাজ করতে পারে যতক্ষণ না এটি সর্বজনীনভাবে উপলব্ধ থাকে। + +আপনি যখন একটি নোড শুরু করেন, তখন এটি আপনার [enode](/developers/docs/networking-layer/network-addresses/#enode) লগ করা উচিত, যা একটি সর্বজনীন শনাক্তকারী যা অন্যরা আপনার নোডের সাথে সংযোগ করতে ব্যবহার করতে পারে। + +enode সাধারণত প্রতিটি রিস্টার্টে পুনরায় তৈরি করা হয়, তাই আপনার বুটনোডের জন্য একটি স্থায়ী enode কীভাবে তৈরি করবেন সে সম্পর্কে আপনার ক্লায়েন্টের নথিপত্র দেখতে ভুলবেন না। + +একটি ভাল বুটনোড হওয়ার জন্য এটির সাথে সংযোগ করতে পারে এমন পিয়ারের সর্বোচ্চ সংখ্যা বাড়ানো একটি ভাল ধারণা। অনেক পিয়ারের সাথে একটি বুটনোড চালানো ব্যান্ডউইথের প্রয়োজনীয়তাকে উল্লেখযোগ্যভাবে বাড়িয়ে তুলবে। + +## উপলব্ধ বুটনোড {#available-bootnodes} + +go-ethereum-এর মধ্যে বিল্টইন বুটনোডের একটি তালিকা [এখানে](https://github.com/ethereum/go-ethereum/blob/master/params/bootnodes.go#L23) পাওয়া যাবে। এই বুটনোডগুলি ইথেরিয়াম ফাইন্ডেশন এবং go-ethereum টিম দ্বারা রক্ষণাবেক্ষণ করা হয়। + +স্বেচ্ছাসেবকদের দ্বারা রক্ষণাবেক্ষণ করা বুটনোডগুলির অন্যান্য তালিকা উপলব্ধ আছে। অনুগ্রহ করে নিশ্চিত করুন যে সর্বদা অন্তত একটি অফিসিয়াল বুটনোড অন্তর্ভুক্ত করা হয়েছে, অন্যথায় আপনি একটি এক্লিপ্স অ্যাটাকের শিকার হতে পারেন। diff --git a/public/content/translations/bn/developers/docs/nodes-and-clients/client-diversity/index.md b/public/content/translations/bn/developers/docs/nodes-and-clients/client-diversity/index.md new file mode 100644 index 00000000000..e1a7caa174d --- /dev/null +++ b/public/content/translations/bn/developers/docs/nodes-and-clients/client-diversity/index.md @@ -0,0 +1,132 @@ +--- +title: "ক্লায়েন্ট বৈচিত্র্য" +description: "Ethereum ক্লায়েন্ট বৈচিত্র্যের গুরুত্বের একটি উচ্চ স্তরের ব্যাখ্যা।" +lang: bn +sidebarDepth: 2 +--- + +একটি Ethereum নোডের আচরণ এটি যে ক্লায়েন্ট সফ্টওয়্যার চালায় তার দ্বারা নিয়ন্ত্রিত হয়। বেশ কয়েকটি প্রোডাকশন-লেভেলের Ethereum ক্লায়েন্ট রয়েছে, প্রতিটি আলাদা দল দ্বারা বিভিন্ন ভাষায় তৈরি এবং রক্ষণাবেক্ষণ করা হয়। ক্লায়েন্টগুলি একটি সাধারণ স্পেসিফিকেশনে তৈরি করা হয়েছে যা নিশ্চিত করে যে ক্লায়েন্টরা নির্বিঘ্নে একে অপরের সাথে যোগাযোগ করে এবং একই কার্যকারিতা রয়েছে এবং একটি সমতুল্য ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। যাইহোক, এই মুহূর্তে নোড জুড়ে ক্লায়েন্টদের বন্টন এই নেটওয়ার্ক শক্তিশালীকরণের পূর্ণ সম্ভাবনাকে কাজে লাগানোর জন্য যথেষ্ট সমান নয়। আদর্শগতভাবে, ব্যবহারকারীরা নেটওয়ার্কে যতটা সম্ভব ক্লায়েন্ট বৈচিত্র্য আনতে বিভিন্ন ক্লায়েন্ট জুড়ে মোটামুটি সমানভাবে বিভক্ত হয়। + +## পূর্বশর্ত {#prerequisites} + +আপনি যদি ইতিমধ্যেই নোড এবং ক্লায়েন্টগুলি কী তা না বোঝেন, তাহলে [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) দেখুন। গ্লসারিতে [এক্সিকিউশন](/glossary/#execution-layer) এবং [কনসেন্সাস](/glossary/#consensus-layer) লেয়ারগুলি সংজ্ঞায়িত করা হয়েছে। + +## একাধিক ক্লায়েন্ট কেন আছে? {#why-multiple-clients} + +একাধিক, স্বাধীনভাবে বিকশিত এবং রক্ষণাবেক্ষণ করা ক্লায়েন্ট বিদ্যমান কারণ ক্লায়েন্ট বৈচিত্র্য নেটওয়ার্ককে আক্রমণ এবং বাগের বিরুদ্ধে আরও স্থিতিস্থাপক করে তোলে। একাধিক ক্লায়েন্ট Ethereum-এর জন্য একটি অনন্য শক্তি - অন্যান্য ব্লকচেইন একটি একক ক্লায়েন্টের অভ্রান্ততার উপর নির্ভর করে। যাইহোক, একাধিক ক্লায়েন্ট উপলব্ধ থাকাই যথেষ্ট নয়, সেগুলিকে কমিউনিটি দ্বারা গ্রহণ করতে হবে এবং মোট সক্রিয় নোডগুলিকে তাদের মধ্যে তুলনামূলকভাবে সমানভাবে বিতরণ করতে হবে। + +## ক্লায়েন্ট বৈচিত্র্য কেন গুরুত্বপূর্ণ? {#client-diversity-importance} + +অনেকগুলি স্বাধীনভাবে বিকশিত এবং রক্ষণাবেক্ষণ করা ক্লায়েন্ট থাকা একটি বিকেন্দ্রীভূত নেটওয়ার্কের স্বাস্থ্যের জন্য অত্যাবশ্যক। আসুন কারণগুলো অন্বেষণ করি। + +### বাগ {#bugs} + +Ethereum নোডগুলির একটি সংখ্যালঘুকে প্রতিনিধিত্ব করার সময় একটি পৃথক ক্লায়েন্টের একটি বাগ নেটওয়ার্কের জন্য কম ঝুঁকির। অনেক ক্লায়েন্ট জুড়ে নোডগুলির মোটামুটি সমান বন্টনের সাথে, বেশিরভাগ ক্লায়েন্টের একটি ভাগ করা সমস্যায় ভোগার সম্ভাবনা কম, এবং ফলস্বরূপ, নেটওয়ার্কটি আরও শক্তিশালী। + +### আক্রমণের বিরুদ্ধে স্থিতিস্থাপকতা {#resilience} + +ক্লায়েন্ট বৈচিত্র্য আক্রমণের বিরুদ্ধে স্থিতিস্থাপকতাও প্রদান করে। উদাহরণস্বরূপ, একটি আক্রমণ যা [একটি নির্দিষ্ট ক্লায়েন্টকে](https://twitter.com/vdWijden/status/1437712249926393858) চেইনের একটি নির্দিষ্ট শাখায় নিয়ে যাওয়ার জন্য প্রতারণা করে তা সফল হওয়ার সম্ভাবনা কম কারণ অন্যান্য ক্লায়েন্টদের একই উপায়ে শোষণযোগ্য হওয়ার সম্ভাবনা কম এবং ক্যানোনিকাল চেইনটি ত্রুটিমুক্ত থাকে। কম ক্লায়েন্ট বৈচিত্র্য প্রভাবশালী ক্লায়েন্টের উপর একটি হ্যাকের সাথে যুক্ত ঝুঁকি বাড়ায়। ক্লায়েন্ট বৈচিত্র্য ইতিমধ্যেই নেটওয়ার্কে ক্ষতিকারক আক্রমণের বিরুদ্ধে একটি গুরুত্বপূর্ণ প্রতিরক্ষা হিসাবে প্রমাণিত হয়েছে, উদাহরণস্বরূপ, 2016 সালে সাংহাই ডিনায়েল-অফ-সার্ভিস আক্রমণটি সম্ভব হয়েছিল কারণ আক্রমণকারীরা প্রভাবশালী ক্লায়েন্টকে (Geth) প্রতি ব্লকে হাজার হাজার বার একটি ধীরগতির ডিস্ক i/o অপারেশন চালানোর জন্য প্রতারণা করতে সক্ষম হয়েছিল। কারণ বিকল্প ক্লায়েন্টরাও অনলাইনে ছিল যারা দুর্বলতা ভাগ করে নেয়নি, Ethereum আক্রমণ প্রতিহত করতে এবং Geth-এর দুর্বলতা সংশোধন করার সময় কাজ চালিয়ে যেতে সক্ষম হয়েছিল। + +### প্রুফ-অফ-স্টেক ফাইনালিটি {#finality} + +Ethereum নোডের 33% এর বেশি সহ একটি কনসেন্সাস ক্লায়েন্টের একটি বাগ কনসেন্সাস লেয়ারকে চূড়ান্ত করা থেকে আটকাতে পারে, যার অর্থ ব্যবহারকারীরা বিশ্বাস করতে পারে না যে লেনদেনগুলি কোনও সময়ে ফিরিয়ে দেওয়া বা পরিবর্তন করা হবে না। এটি Ethereum-এর উপরে নির্মিত অনেক অ্যাপের জন্য, বিশেষ করে DeFi-এর জন্য খুব সমস্যাযুক্ত হবে। + + আরও খারাপ, দুই-তৃতীয়াংশ সংখ্যাগরিষ্ঠতা সহ একটি ক্লায়েন্টের একটি গুরুতর বাগ চেইনটিকে ভুলভাবে বিভক্ত এবং চূড়ান্ত করতে পারে, যার ফলে একটি বড় সংখ্যক ভ্যালিডেটর একটি অবৈধ চেইনে আটকে যায়। যদি তারা সঠিক চেইনে পুনরায় যোগ দিতে চায়, তবে এই ভ্যালিডেটররা স্ল্যাশিং বা একটি ধীর এবং ব্যয়বহুল স্বেচ্ছায় প্রত্যাহার এবং পুনরায় সক্রিয়করণের মুখোমুখি হয়। একটি স্ল্যাশিং এর মাত্রা দোষী নোডের সংখ্যার সাথে পরিমাপ করা হয় যার দুই-তৃতীয়াংশ সংখ্যাগরিষ্ঠতা সর্বাধিক (32 ETH) স্ল্যাশ করা হয়। + +যদিও এগুলি অসম্ভাব্য পরিস্থিতি, Ethereum ইকোসিস্টেম সক্রিয় নোড জুড়ে ক্লায়েন্টদের বন্টন সমান করে তাদের ঝুঁকি কমাতে পারে। আদর্শগতভাবে, কোনো কনসেন্সাস ক্লায়েন্টই মোট নোডের 33% শেয়ারে পৌঁছাতে পারবে না। + +### ভাগ করা দায়িত্ব {#responsibility} + +সংখ্যাগরিষ্ঠ ক্লায়েন্ট থাকার একটি মানবিক মূল্যও রয়েছে। এটি একটি ছোট ডেভেলপমেন্ট দলের উপর অতিরিক্ত চাপ এবং দায়িত্ব চাপিয়ে দেয়। ক্লায়েন্ট বৈচিত্র্য যত কম হবে, সংখ্যাগরিষ্ঠ ক্লায়েন্ট রক্ষণাবেক্ষণকারী ডেভেলপারদের উপর দায়িত্বের বোঝা তত বেশি হবে। এই দায়িত্বটি একাধিক দলে ছড়িয়ে দেওয়া Ethereum-এর নোডগুলির নেটওয়ার্ক এবং এর লোকজনের নেটওয়ার্ক উভয়ের স্বাস্থ্যের জন্যই ভাল। + +## বর্তমান ক্লায়েন্ট বৈচিত্র্য {#current-client-diversity} + +### এক্সিকিউশন ক্লায়েন্ট {#execution-clients-breakdown} + + + +### কনসেন্সাস ক্লায়েন্ট {#consensus-clients-breakdown} + + + +এই ডায়াগ্রামটি পুরানো হতে পারে — আপ-টু-ডেট তথ্যের জন্য [ethernodes.org](https://ethernodes.org) এবং [clientdiversity.org](https://clientdiversity.org)-এ যান। + +উপরের দুটি পাই চার্ট এক্সিকিউশন এবং কনসেন্সাস লেয়ারের জন্য বর্তমান ক্লায়েন্ট বৈচিত্র্যের স্ন্যাপশট দেখায় (অক্টোবর 2025-এ লেখার সময়)। ক্লায়েন্ট বৈচিত্র্য বছরের পর বছর ধরে উন্নত হয়েছে, এবং এক্সিকিউশন লেয়ারে [Geth](https://geth.ethereum.org/)-এর আধিপত্য হ্রাস পেয়েছে, যেখানে [Nethermind](https://www.nethermind.io/nethermind-client) খুব কাছাকাছি দ্বিতীয়, [Besu](https://besu.hyperledger.org/) তৃতীয় এবং [Erigon](https://github.com/ledgerwatch/erigon) চতুর্থ, এবং অন্যান্য ক্লায়েন্টরা নেটওয়ার্কের 3% এরও কম অংশ নিয়ে গঠিত। কনসেন্সাস লেয়ারে সর্বাধিক ব্যবহৃত ক্লায়েন্ট—[Lighthouse](https://lighthouse.sigmaprime.io/)—দ্বিতীয় সর্বাধিক ব্যবহৃত ক্লায়েন্টের খুব কাছাকাছি। [Prysm](https://prysmaticlabs.com/#projects) এবং [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) যথাক্রমে ~31% এবং ~14% গঠন করে, এবং অন্যান্য ক্লায়েন্ট খুব কমই ব্যবহৃত হয়। + +এক্সিকিউশন লেয়ারের ডেটা ২৬-অক্টোবর-২০২৫ তারিখে [supermajority.info](https://supermajority.info/) থেকে পাওয়া গেছে। [মাইকেল স্প্রুলের](https://github.com/sigp/blockprint) কাছ থেকে কনসেন্সাস ক্লায়েন্টদের জন্য ডেটা পাওয়া গেছে। কনসেন্সাস ক্লায়েন্টের ডেটা পাওয়া আরও কঠিন কারণ কনসেন্সাস লেয়ার ক্লায়েন্টদের কাছে সবসময় দ্ব্যর্থহীন ট্রেস থাকে না যা তাদের সনাক্ত করতে ব্যবহার করা যেতে পারে। ডেটা একটি শ্রেণিবিন্যাস অ্যালগরিদম ব্যবহার করে তৈরি করা হয়েছিল যা কখনও কখনও কিছু সংখ্যালঘু ক্লায়েন্টকে বিভ্রান্ত করে (আরও বিশদ বিবরণের জন্য [এখানে](https://twitter.com/sproulM_/status/1440512518242197516) দেখুন)। উপরের ডায়াগ্রামে, এই ধরনের দ্ব্যর্থবোধক শ্রেণীবিন্যাসকে একটি দ্বৈত লেবেল (যেমন Nimbus/Teku) হিসেবে দেখানো হয়েছে। তথাপি, এটা স্পষ্ট যে নেটওয়ার্কের বেশিরভাগই Prysm চালাচ্ছে। শুধুমাত্র স্ন্যাপশট হওয়া সত্ত্বেও, ডায়াগ্রামের মানগুলি ক্লায়েন্ট বৈচিত্র্যের বর্তমান অবস্থার একটি ভাল সাধারণ ধারণা প্রদান করে। + +কনসেন্সাস লেয়ারের জন্য আপ-টু-ডেট ক্লায়েন্ট ডাইভারসিটি ডেটা এখন [clientdiversity.org](https://clientdiversity.org/)-এ উপলব্ধ। + +## এক্সিকিউশন লেয়ার {#execution-layer} + +এখন পর্যন্ত, ক্লায়েন্ট বৈচিত্র্য নিয়ে কথোপকথন মূলত কনসেন্সাস লেয়ারের উপর দৃষ্টি নিবদ্ধ করেছে। যাইহোক, এক্সিকিউশন ক্লায়েন্ট [Geth](https://geth.ethereum.org) বর্তমানে সমস্ত নোডের প্রায় 85% এর জন্য দায়ী। এই শতাংশটি কনসেন্সাস ক্লায়েন্টদের মতো একই কারণে সমস্যাযুক্ত। উদাহরণস্বরূপ, লেনদেন হ্যান্ডলিং বা এক্সিকিউশন পেলোড তৈরিতে প্রভাব ফেলে এমন Geth-এর একটি বাগ কনসেন্সাস ক্লায়েন্টদের সমস্যাযুক্ত বা বাগযুক্ত লেনদেন চূড়ান্ত করতে পারে। অতএব, Ethereum এক্সিকিউশন ক্লায়েন্টদের আরও সমান বন্টনের সাথে স্বাস্থ্যকর হবে, আদর্শভাবে কোনও ক্লায়েন্ট নেটওয়ার্কের 33% এর বেশি প্রতিনিধিত্ব করবে না। + +## একটি সংখ্যালঘু ক্লায়েন্ট ব্যবহার করুন {#use-minority-client} + +ক্লায়েন্ট বৈচিত্র্য মোকাবেলার জন্য সংখ্যালঘু ক্লায়েন্ট বেছে নেওয়ার জন্য স্বতন্ত্র ব্যবহারকারীদের চেয়ে বেশি প্রয়োজন - এর জন্য ভ্যালিডেটর পুল এবং প্রধান ডিএ্যাপস এবং এক্সচেঞ্জের মতো প্রতিষ্ঠানগুলিকেও ক্লায়েন্ট পরিবর্তন করতে হবে। যাইহোক, সমস্ত ব্যবহারকারী বর্তমান ভারসাম্যহীনতা সংশোধন করতে এবং সমস্ত উপলব্ধ Ethereum সফ্টওয়্যার ব্যবহারকে স্বাভাবিক করার জন্য তাদের অংশ করতে পারে। The Merge-এর পরে, সমস্ত নোড অপারেটরদের একটি এক্সিকিউশন ক্লায়েন্ট এবং একটি কনসেন্সাস ক্লায়েন্ট চালাতে হবে। নীচে প্রস্তাবিত ক্লায়েন্টদের সংমিশ্রণ বেছে নেওয়া ক্লায়েন্টের বৈচিত্র্য বাড়াতে সাহায্য করবে। + +### এক্সিকিউশন ক্লায়েন্ট {#execution-clients} + +- [Besu](https://www.hyperledger.org/use/besu) +- [Nethermind](https://downloads.nethermind.io/) +- [Erigon](https://github.com/ledgerwatch/erigon) +- [Go-Ethereum](https://geth.ethereum.org/) +- [Reth](https://reth.rs/) + +### কনসেন্সাস ক্লায়েন্ট {#consensus-clients} + +- [Nimbus](https://nimbus.team/) +- [Lighthouse](https://github.com/sigp/lighthouse) +- [Teku](https://consensys.io/teku) +- [Lodestar](https://github.com/ChainSafe/lodestar) +- [Prysm](https://prysm.offchainlabs.com/docs/) +- [Grandine](https://docs.grandine.io/) + +প্রযুক্তিগত ব্যবহারকারীরা সংখ্যালঘু ক্লায়েন্টদের জন্য আরও টিউটোরিয়াল এবং ডকুমেন্টেশন লিখে এবং তাদের নোড-অপারেটিং সহকর্মীদের প্রভাবশালী ক্লায়েন্টদের থেকে দূরে সরে যেতে উত্সাহিত করে এই প্রক্রিয়াটিকে ত্বরান্বিত করতে সহায়তা করতে পারে। একটি সংখ্যালঘু কনসেন্সাস ক্লায়েন্টে স্যুইচ করার জন্য নির্দেশিকা [clientdiversity.org](https://clientdiversity.org/) এ উপলব্ধ। + +## ক্লায়েন্ট বৈচিত্র্য ড্যাশবোর্ড {#client-diversity-dashboards} + +বেশ কয়েকটি ড্যাশবোর্ড এক্সিকিউশন এবং কনসেন্সাস লেয়ারের জন্য রিয়েল-টাইম ক্লায়েন্ট বৈচিত্র্যের পরিসংখ্যান দেয়। + +**কনসেন্সাস লেয়ার:** + +- [Rated.network](https://www.rated.network/) +- [clientdiversity.org](https://clientdiversity.org/) + +**এক্সিকিউশন লেয়ার:** + +- [supermajority.info](https://supermajority.info//) +- [Ethernodes](https://ethernodes.org/) + +## আরও পড়ুন {#further-reading} + +- [Ethereum-এর কনসেন্সাস লেয়ারে ক্লায়েন্ট বৈচিত্র্য](https://mirror.xyz/jmcook.eth/S7ONEka_0RgtKTZ3-dakPmAHQNPvuj15nh0YGKPFriA) +- [Ethereum Merge: নিজের ঝুঁকিতে সংখ্যাগরিষ্ঠ ক্লায়েন্ট চালান!](https://dankradfeist.de/ethereum/2022/03/24/run-the-majority-client-at-your-own-peril.html) – _ড্যানক্র্যাড ফিস্ট, ২৪ মার্চ ২০২২_ +- [ক্লায়েন্ট বৈচিত্র্যের গুরুত্ব](https://our.status.im/the-importance-of-client-diversity/) +- [ইথেরিয়াম নোড পরিষেবাগুলির তালিকা](https://ethereumnodes.com/) +- [ক্লায়েন্ট বৈচিত্র্য সমস্যার \"পাঁচটি কেন\"](https://notes.ethereum.org/@afhGjrKfTKmksTOtqhB9RQ/BJGj7uh08) +- [Ethereum ডাইভারসিটি এবং কিভাবে এর সমাধান করা যায় (YouTube)](https://www.youtube.com/watch?v=1hZgCaiqwfU) +- [clientdiversity.org](https://clientdiversity.org/) + +## সম্পর্কিত বিষয় {#related-topics} + +- [একটি Ethereum নোড চালান](/run-a-node/) +- [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) diff --git a/public/content/translations/bn/developers/docs/nodes-and-clients/index.md b/public/content/translations/bn/developers/docs/nodes-and-clients/index.md new file mode 100644 index 00000000000..7a2e496ce85 --- /dev/null +++ b/public/content/translations/bn/developers/docs/nodes-and-clients/index.md @@ -0,0 +1,319 @@ +--- +title: "নোড ও ক্লায়েন্ট" +description: "ইথেরিয়াম নোড এবং ক্লায়েন্ট সফ্টওয়্যারের একটি সংক্ষিপ্ত বিবরণ, সাথে কীভাবে একটি নোড সেট আপ করতে হয় এবং কেন আপনার এটি করা উচিত।" +lang: bn +sidebarDepth: 2 +--- + +ইথেরিয়াম হল কম্পিউটারগুলির (নোড হিসাবে পরিচিত) একটি বিতরণ করা নেটওয়ার্ক যা এমন সফ্টওয়্যার চালায় যা ব্লক এবং লেনদেনের ডেটা যাচাই করতে পারে। আপনার কম্পিউটারকে একটি ইথেরিয়াম নোডে পরিণত করার জন্য সফ্টওয়্যারটি অবশ্যই আপনার কম্পিউটারে চালাতে হবে। একটি নোড তৈরি করার জন্য দুটি পৃথক সফ্টওয়্যার ('ক্লায়েন্ট' হিসাবে পরিচিত) প্রয়োজন। + +## পূর্বশর্ত {#prerequisites} + +গভীরে যাওয়ার আগে এবং একটি ইথেরিয়াম ক্লায়েন্টের নিজস্ব উদাহরণ চালানোর আগে আপনার একটি পিয়ার-টু-পিয়ার নেটওয়ার্কের ধারণা এবং [EVM-এর মূল বিষয়গুলি](/developers/docs/evm/) বোঝা উচিত। আমাদের [ইথেরিয়ামের পরিচিতি](/developers/docs/intro-to-ethereum/) দেখুন। + +আপনি যদি নোডের বিষয়ে নতুন হন, তাহলে আমরা প্রথমে [একটি ইথেরিয়াম নোড চালানো](/run-a-node)-র উপর আমাদের ব্যবহারকারী-বান্ধব ভূমিকাটি দেখার পরামর্শ দিই। + +## নোড এবং ক্লায়েন্ট কী? {#what-are-nodes-and-clients} + +একটি "নোড" হল ইথেরিয়াম ক্লায়েন্ট সফ্টওয়্যারের যেকোনো উদাহরণ যা ইথেরিয়াম সফ্টওয়্যার চালিত অন্যান্য কম্পিউটারের সাথে সংযুক্ত থাকে এবং একটি নেটওয়ার্ক তৈরি করে। একটি ক্লায়েন্ট হল ইথেরিয়ামের একটি বাস্তবায়ন যা প্রোটোকলের নিয়ম অনুসারে ডেটা যাচাই করে এবং নেটওয়ার্ককে সুরক্ষিত রাখে। একটি নোডকে দুটি ক্লায়েন্ট চালাতে হয়: একটি কনসেন্সাস ক্লায়েন্ট এবং একটি এক্সিকিউশন ক্লায়েন্ট। + +- এক্সিকিউশন ক্লায়েন্ট (এক্সিকিউশন ইঞ্জিন, EL ক্লায়েন্ট বা পূর্বে Eth1 ক্লায়েন্ট নামেও পরিচিত) নেটওয়ার্কে সম্প্রচারিত নতুন লেনদেন শোনে, সেগুলিকে EVM-এ কার্যকর করে এবং সমস্ত বর্তমান ইথেরিয়াম ডেটার সর্বশেষ অবস্থা এবং ডেটাবেস ধারণ করে। +- কনসেন্সাস ক্লায়েন্ট (বিকন নোড, CL ক্লায়েন্ট বা পূর্বে Eth2 ক্লায়েন্ট নামেও পরিচিত) প্রুফ-অফ-স্টেক কনসেন্সাস অ্যালগরিদম প্রয়োগ করে, যা এক্সিকিউশন ক্লায়েন্ট থেকে যাচাইকৃত ডেটার উপর ভিত্তি করে নেটওয়ার্ককে চুক্তিতে পৌঁছাতে সক্ষম করে। এছাড়াও একটি তৃতীয় সফ্টওয়্যার আছে, যা একটি 'ভ্যালিডেটর' হিসাবে পরিচিত যা কনসেন্সাস ক্লায়েন্টে যোগ করা যেতে পারে, যা একটি নোডকে নেটওয়ার্ক সুরক্ষিত করতে অংশগ্রহণ করার অনুমতি দেয়। + +এই ক্লায়েন্টরা ইথেরিয়াম চেইনের হেডের ট্র্যাক রাখতে একসাথে কাজ করে এবং ব্যবহারকারীদের ইথেরিয়াম নেটওয়ার্কের সাথে যোগাযোগ করতে দেয়। একাধিক সফ্টওয়্যার একসাথে কাজ করার এই মডুলার ডিজাইনকে [এনক্যাপসুলেটেড কমপ্লেক্সিটি](https://vitalik.eth.limo/general/2022/02/28/complexity.html) বলা হয়। এই পদ্ধতিটি নির্বিঘ্নে [দ্য মার্জ](/roadmap/merge) কার্যকর করা সহজ করেছে, ক্লায়েন্ট সফ্টওয়্যার বজায় রাখা এবং বিকাশ করা সহজ করে তোলে এবং পৃথক ক্লায়েন্টদের পুনঃব্যবহার সক্ষম করে, উদাহরণস্বরূপ, [লেয়ার 2 ইকোসিস্টেমে](/layer-2/)। + +![কাপলড এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্ট](./eth1eth2client.png) +একটি কাপলড এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্টের সরলীকৃত ডায়াগ্রাম। + +### ক্লায়েন্ট বৈচিত্র্য {#client-diversity} + +[এক্সিকিউশন ক্লায়েন্ট](/developers/docs/nodes-and-clients/#execution-clients) এবং [কনসেন্সাস ক্লায়েন্ট](/developers/docs/nodes-and-clients/#consensus-clients) উভয়ই বিভিন্ন দল দ্বারা তৈরি বিভিন্ন প্রোগ্রামিং ভাষায় বিদ্যমান। + +একাধিক ক্লায়েন্ট বাস্তবায়ন একটি একক কোডবেসের উপর নির্ভরতা হ্রাস করে নেটওয়ার্ককে আরও শক্তিশালী করে তুলতে পারে। আদর্শ লক্ষ্য হল কোনও ক্লায়েন্টের নেটওয়ার্কে আধিপত্য ছাড়াই বৈচিত্র্য অর্জন করা, যার ফলে ব্যর্থতার একটি সম্ভাব্য একক পয়েন্ট দূর করা যায়। +ভাষার বৈচিত্র্য একটি বিস্তৃত ডেভেলপার সম্প্রদায়কে আমন্ত্রণ জানায় এবং তাদের পছন্দের ভাষায় ইন্টিগ্রেশন তৈরি করতে দেয়। + +[ক্লায়েন্ট ডাইভারসিটি](/developers/docs/nodes-and-clients/client-diversity/) সম্পর্কে আরও জানুন। + +এই বাস্তবায়নগুলির মধ্যে যা সাধারণ তা হল তারা সবাই একটি একক স্পেসিফিকেশন অনুসরণ করে। স্পেসিফিকেশনগুলি নির্দেশ করে যে ইথেরিয়াম নেটওয়ার্ক এবং ব্লকচেইন কীভাবে কাজ করে। প্রতিটি প্রযুক্তিগত বিবরণ সংজ্ঞায়িত করা হয়েছে এবং স্পেসিফিকেশনগুলি এভাবে পাওয়া যেতে পারে: + +- মূলত, [ইথেরিয়াম ইয়েলো পেপার](https://ethereum.github.io/yellowpaper/paper.pdf) +- [এক্সিকিউশন স্পেকস](https://github.com/ethereum/execution-specs/) +- [কনসেন্সাস স্পেকস](https://github.com/ethereum/consensus-specs) +- [EIPs](https://eips.ethereum.org/) বিভিন্ন [নেটওয়ার্ক আপগ্রেডে](/ethereum-forks/) প্রয়োগ করা হয়েছে + +### নেটওয়ার্কে নোড ট্র্যাক করা {#network-overview} + +একাধিক ট্র্যাকার ইথেরিয়াম নেটওয়ার্কের নোডগুলির একটি রিয়েল-টাইম ওভারভিউ অফার করে। মনে রাখবেন যে বিকেন্দ্রীভূত নেটওয়ার্কগুলির প্রকৃতির কারণে, এই ক্রলারগুলি কেবল নেটওয়ার্কের একটি সীমিত ভিউ প্রদান করতে পারে এবং বিভিন্ন ফলাফল রিপোর্ট করতে পারে। + +- Etherscan দ্বারা [নোডের মানচিত্র](https://etherscan.io/nodetracker) +- Bitfly দ্বারা [Ethernodes](https://ethernodes.org/) +- Chainsafe দ্বারা [Nodewatch](https://www.nodewatch.io/), কনসেন্সাস নোড ক্রল করা +- [Monitoreth](https://monitoreth.io/) - MigaLabs দ্বারা, একটি ডিস্ট্রিবিউটেড নেটওয়ার্ক মনিটরিং টুল +- [সাপ্তাহিক নেটওয়ার্ক স্বাস্থ্য প্রতিবেদন](https://probelab.io) - ProbeLab দ্বারা, [নেবুলা ক্রলার](https://github.com/dennis-tra/nebula) এবং অন্যান্য টুল ব্যবহার করে + +## নোডের প্রকারভেদ {#node-types} + +আপনি যদি [নিজের নোড চালাতে](/developers/docs/nodes-and-clients/run-a-node/) চান, তাহলে আপনার বোঝা উচিত যে বিভিন্ন ধরণের নোড রয়েছে যা ভিন্নভাবে ডেটা ব্যবহার করে। আসলে, ক্লায়েন্টরা তিন ধরণের নোড চালাতে পারে: লাইট, ফুল এবং আর্কাইভ। এছাড়াও বিভিন্ন সিঙ্ক কৌশলের বিকল্প রয়েছে যা দ্রুত সিঙ্ক্রোনাইজেশন সময় সক্ষম করে। সিঙ্ক্রোনাইজেশন বলতে বোঝায় এটি কত দ্রুত ইথেরিয়ামের অবস্থার সবচেয়ে আপ-টু-ডেট তথ্য পেতে পারে। + +### ফুল নোড {#full-node} + +ফুল নোডগুলি ব্লকচেইনের একটি ব্লক-বাই-ব্লক বৈধতা সম্পাদন করে, যার মধ্যে প্রতিটি ব্লকের জন্য ব্লক বডি এবং স্টেট ডেটা ডাউনলোড এবং যাচাই করা অন্তর্ভুক্ত। ফুল নোডের বিভিন্ন ক্লাস রয়েছে - কিছু জেনেসিস ব্লক থেকে শুরু হয় এবং ব্লকচেইনের পুরো ইতিহাসে প্রতিটি একক ব্লক যাচাই করে। অন্যরা তাদের যাচাইকরণ একটি সাম্প্রতিক ব্লক থেকে শুরু করে যা তারা বিশ্বাস করে যে বৈধ (যেমন, Geth-এর 'স্ন্যাপ সিঙ্ক')। যাচাইকরণ যেখানেই শুরু হোক না কেন, ফুল নোডগুলি শুধুমাত্র তুলনামূলকভাবে সাম্প্রতিক ডেটার (সাধারণত সবচেয়ে সাম্প্রতিক 128টি ব্লক) একটি স্থানীয় কপি রাখে, যা ডিস্ক স্পেস বাঁচানোর জন্য পুরানো ডেটা মুছে ফেলার অনুমতি দেয়। প্রয়োজনে পুরোনো ডেটা পুনরায় তৈরি করা যেতে পারে। + +- সম্পূর্ণ ব্লকচেইন ডেটা সঞ্চয় করে (যদিও এটি পর্যায়ক্রমে ছাঁটাই করা হয় তাই একটি ফুল নোড জেনেসিস পর্যন্ত সমস্ত স্টেট ডেটা সঞ্চয় করে না) +- ব্লক যাচাইকরণে অংশ নেয়, সমস্ত ব্লক এবং স্টেট যাচাই করে। +- সমস্ত স্টেট হয় স্থানীয় স্টোরেজ থেকে পুনরুদ্ধার করা যেতে পারে বা একটি ফুল নোড দ্বারা 'স্ন্যাপশট' থেকে পুনরায় তৈরি করা যেতে পারে। +- নেটওয়ার্কে পরিষেবা দেয় এবং অনুরোধের ভিত্তিতে ডেটা সরবরাহ করে। + +### আর্কাইভ নোড {#archive-node} + +আর্কাইভ নোডগুলি হল ফুল নোড যা জেনেসিস থেকে প্রতিটি ব্লক যাচাই করে এবং ডাউনলোড করা কোনও ডেটা কখনও মুছে ফেলে না। + +- ফুল নোডে রাখা সবকিছু সঞ্চয় করে এবং ঐতিহাসিক স্টেটের একটি আর্কাইভ তৈরি করে। আপনার যদি ব্লক #4,000,000-এ একটি অ্যাকাউন্টের ব্যালেন্সের মতো কিছু জিজ্ঞাসা করার প্রয়োজন হয়, বা ট্রেসিং ব্যবহার করে যাচাই না করে সহজভাবে এবং নির্ভরযোগ্যভাবে আপনার নিজের লেনদেন সেট পরীক্ষা করার প্রয়োজন হয়, তবে এটির প্রয়োজন। +- এই ডেটা টেরাবাইট ইউনিটের প্রতিনিধিত্ব করে, যা আর্কাইভ নোডগুলিকে গড় ব্যবহারকারীদের জন্য কম আকর্ষণীয় করে তোলে তবে ব্লক এক্সপ্লোরার, ওয়ালেট বিক্রেতা এবং চেইন অ্যানালিটিক্সের মতো পরিষেবাগুলির জন্য সুবিধাজনক হতে পারে। + +আর্কাইভ ছাড়া অন্য কোনো মোডে ক্লায়েন্ট সিঙ্ক করার ফলে ছাঁটাই করা ব্লকচেইন ডেটা হবে। এর মানে হল, সমস্ত ঐতিহাসিক স্টেটের কোনো আর্কাইভ নেই তবে ফুল নোড প্রয়োজনে সেগুলি তৈরি করতে সক্ষম। + +[আর্কাইভ নোড](/developers/docs/nodes-and-clients/archive-nodes) সম্পর্কে আরও জানুন। + +### লাইট নোড {#light-node} + +প্রতিটি ব্লক ডাউনলোড করার পরিবর্তে, লাইট নোডগুলি কেবল ব্লক হেডার ডাউনলোড করে। এই হেডারগুলিতে ব্লকগুলির বিষয়বস্তু সম্পর্কে সংক্ষিপ্ত তথ্য থাকে। লাইট নোডের প্রয়োজনীয় অন্য যেকোনো তথ্য একটি ফুল নোড থেকে অনুরোধ করা হয়। লাইট নোড তখন ব্লক হেডারগুলিতে স্টেট রুটের বিপরীতে তারা যে ডেটা পায় তা স্বাধীনভাবে যাচাই করতে পারে। লাইট নোড ব্যবহারকারীদেরকে শক্তিশালী হার্ডওয়্যার বা ফুল নোড চালানোর জন্য প্রয়োজনীয় উচ্চ ব্যান্ডউইথ ছাড়াই ইথেরিয়াম নেটওয়ার্কে অংশগ্রহণ করতে সক্ষম করে। অবশেষে, লাইট নোডগুলি মোবাইল ফোন বা এমবেডেড ডিভাইসে চলতে পারে। লাইট নোডগুলি কনসেন্সাসে অংশ নেয় না (অর্থাৎ, তারা ভ্যালিডেটর হতে পারে না), তবে তারা একটি ফুল নোডের মতো একই কার্যকারিতা এবং নিরাপত্তা গ্যারান্টি সহ ইথেরিয়াম ব্লকচেইনে অ্যাক্সেস করতে পারে। + +লাইট ক্লায়েন্টগুলি ইথেরিয়ামের জন্য সক্রিয় বিকাশের একটি ক্ষেত্র এবং আমরা শীঘ্রই কনসেন্সাস লেয়ার এবং এক্সিকিউশন লেয়ারের জন্য নতুন লাইট ক্লায়েন্ট দেখার আশা করি। +[গসিপ নেটওয়ার্ক](https://www.ethportal.net/) এর মাধ্যমে লাইট ক্লায়েন্ট ডেটা সরবরাহ করার সম্ভাব্য রুটও রয়েছে। এটি সুবিধাজনক কারণ গসিপ নেটওয়ার্ক অনুরোধ পরিবেশন করার জন্য ফুল নোডের প্রয়োজন ছাড়াই লাইট নোডগুলির একটি নেটওয়ার্ক সমর্থন করতে পারে। + +ইথেরিয়াম এখনও লাইট নোডের একটি বড় জনসংখ্যা সমর্থন করে না, তবে লাইট নোড সমর্থন একটি এমন ক্ষেত্র যা অদূর ভবিষ্যতে দ্রুত বিকশিত হবে বলে আশা করা হচ্ছে। বিশেষ করে, [Nimbus](https://nimbus.team/), [Helios](https://github.com/a16z/helios), এবং [LodeStar](https://lodestar.chainsafe.io/)-এর মতো ক্লায়েন্টরা বর্তমানে লাইট নোডগুলিতে খুব বেশি মনোনিবেশ করছে। + +## আমার কেন একটি ইথেরিয়াম নোড চালানো উচিত? {#why-should-i-run-an-ethereum-node} + +একটি নোড চালানো আপনাকে সরাসরি, বিশ্বাসহীনভাবে এবং ব্যক্তিগতভাবে ইথেরিয়াম ব্যবহার করার অনুমতি দেয় এবং একই সাথে নেটওয়ার্ককে আরও শক্তিশালী এবং বিকেন্দ্রীভূত রেখে সমর্থন করে। + +### আপনার জন্য সুবিধা {#benefits-to-you} + +আপনার নিজের নোড চালানো আপনাকে একটি ব্যক্তিগত, স্বয়ংসম্পূর্ণ এবং বিশ্বাসহীন পদ্ধতিতে ইথেরিয়াম ব্যবহার করতে সক্ষম করে। আপনাকে নেটওয়ার্ককে বিশ্বাস করার দরকার নেই কারণ আপনি আপনার ক্লায়েন্টের সাথে নিজেই ডেটা যাচাই করতে পারেন। "বিশ্বাস করবেন না, যাচাই করুন" একটি জনপ্রিয় ব্লকচেইন মন্ত্র। + +- আপনার নোড নিজেই কনসেন্সাস নিয়মগুলির বিরুদ্ধে সমস্ত লেনদেন এবং ব্লক যাচাই করে। এর মানে হল আপনাকে নেটওয়ার্কের অন্য কোনও নোডের উপর নির্ভর করতে হবে না বা তাদের পুরোপুরি বিশ্বাস করতে হবে না। +- আপনি আপনার নিজের নোডের সাথে একটি ইথেরিয়াম ওয়ালেট ব্যবহার করতে পারেন। আপনি আরও সুরক্ষিতভাবে এবং ব্যক্তিগতভাবে ডিএ্যাপস ব্যবহার করতে পারেন কারণ আপনাকে মধ্যস্থতাকারীদের কাছে আপনার ঠিকানা এবং ব্যালেন্স ফাঁস করতে হবে না। সবকিছু আপনার নিজের ক্লায়েন্ট দিয়ে পরীক্ষা করা যেতে পারে। [MetaMask](https://metamask.io), [Frame](https://frame.sh/), এবং [অন্যান্য অনেক ওয়ালেট](/wallets/find-wallet/) RPC-আমদানি অফার করে, যা তাদের আপনার নোড ব্যবহার করার অনুমতি দেয়। +- আপনি অন্যান্য পরিষেবাগুলি চালাতে এবং স্ব-হোস্ট করতে পারেন যা ইথেরিয়াম থেকে ডেটার উপর নির্ভর করে। উদাহরণস্বরূপ, এটি একটি বিকন চেইন ভ্যালিডেটর, লেয়ার 2-এর মতো সফ্টওয়্যার, অবকাঠামো, ব্লক এক্সপ্লোরার, পেমেন্ট প্রসেসর ইত্যাদি হতে পারে। +- আপনি আপনার নিজস্ব কাস্টম [RPC এন্ডপয়েন্ট](/developers/docs/apis/json-rpc/) প্রদান করতে পারেন। আপনি এমনকি এই এন্ডপয়েন্টগুলি প্রকাশ্যে সম্প্রদায়ের কাছে অফার করতে পারেন যাতে তারা বড় সেন্ট্রালাইজড প্রদানকারীদের এড়াতে পারে। +- আপনি **ইন্টার-প্রসেস কমিউনিকেশনস (IPC)** ব্যবহার করে আপনার নোডের সাথে সংযোগ স্থাপন করতে পারেন বা আপনার প্রোগ্রামকে একটি প্লাগইন হিসাবে লোড করার জন্য নোডটি পুনরায় লিখতে পারেন। এটি কম লেটেন্সি প্রদান করে, যা অনেক সাহায্য করে, যেমন, ওয়েব3 লাইব্রেরি ব্যবহার করে প্রচুর ডেটা প্রক্রিয়া করার সময় বা যখন আপনাকে যত দ্রুত সম্ভব আপনার লেনদেন প্রতিস্থাপন করতে হবে (যেমন, ফ্রন্টরানিং)। +- আপনি নেটওয়ার্ক সুরক্ষিত করতে এবং পুরস্কার অর্জন করতে সরাসরি ETH স্টেক করতে পারেন। শুরু করতে [একক স্টেকিং](/staking/solo/) দেখুন। + +![আপনার অ্যাপ্লিকেশন এবং নোডের মাধ্যমে আপনি কীভাবে ইথেরিয়াম অ্যাক্সেস করবেন](./nodes.png) + +### নেটওয়ার্কের সুবিধা {#network-benefits} + +ইথেরিয়ামের স্বাস্থ্য, নিরাপত্তা এবং কর্মক্ষম স্থিতিস্থাপকতার জন্য বিভিন্ন ধরণের নোড থাকা গুরুত্বপূর্ণ। + +- ফুল নোডগুলি কনসেন্সাস নিয়মগুলি প্রয়োগ করে যাতে তাদের এমন ব্লকগুলি গ্রহণ করতে প্রতারিত করা না যায় যা সেগুলি অনুসরণ করে না। এটি নেটওয়ার্কে অতিরিক্ত নিরাপত্তা প্রদান করে কারণ যদি সমস্ত নোড লাইট নোড হত, যা সম্পূর্ণ যাচাই করে না, তবে ভ্যালিডেটররা নেটওয়ার্কে আক্রমণ করতে পারত। +- [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/#what-is-pos)-এর ক্রিপ্টো-অর্থনৈতিক প্রতিরক্ষা অতিক্রমকারী একটি আক্রমণের ক্ষেত্রে, সৎ চেইন অনুসরণ করতে বেছে নেওয়া ফুল নোডগুলির দ্বারা একটি সামাজিক পুনরুদ্ধার করা যেতে পারে। +- নেটওয়ার্কে আরও নোড থাকার ফলে একটি আরও বৈচিত্র্যময় এবং শক্তিশালী নেটওয়ার্ক তৈরি হয়, যা বিকেন্দ্রীকরণের চূড়ান্ত লক্ষ্য, যা একটি সেন্সরশিপ-প্রতিরোধী এবং নির্ভরযোগ্য সিস্টেম সক্ষম করে। +- ফুল নোডগুলি লাইটওয়েট ক্লায়েন্টদের জন্য ব্লকচেইন ডেটাতে অ্যাক্সেস সরবরাহ করে যা এর উপর নির্ভর করে। লাইট নোডগুলি পুরো ব্লকচেইন সঞ্চয় করে না, পরিবর্তে তারা [ব্লক হেডারগুলিতে স্টেট রুট](/developers/docs/blocks/#block-anatomy) এর মাধ্যমে ডেটা যাচাই করে। প্রয়োজনে তারা ফুল নোড থেকে আরও তথ্য অনুরোধ করতে পারে। + +আপনি যদি একটি ফুল নোড চালান, তবে পুরো ইথেরিয়াম নেটওয়ার্ক এটি থেকে উপকৃত হয়, এমনকি যদি আপনি একটি ভ্যালিডেটর নাও চালান। + +## আপনার নিজের নোড চালানো {#running-your-own-node} + +আপনার নিজের ইথেরিয়াম ক্লায়েন্ট চালাতে আগ্রহী? + +নতুনদের জন্য বন্ধুত্বপূর্ণ পরিচিতির জন্য আরও জানতে আমাদের [একটি নোড চালান](/run-a-node) পৃষ্ঠাটি দেখুন। + +আপনি যদি আরও বেশি প্রযুক্তিগত ব্যবহারকারী হন, তাহলে কীভাবে [আপনার নিজের নোড চালু করবেন](/developers/docs/nodes-and-clients/run-a-node/) সে সম্পর্কে আরও বিশদ এবং বিকল্পগুলিতে ডুব দিন। + +## বিকল্প {#alternatives} + +আপনার নিজের নোড সেট আপ করতে আপনার সময় এবং রিসোর্স খরচ হতে পারে তবে আপনাকে সবসময় নিজের ইনস্ট্যান্স চালানোর প্রয়োজন নেই। এই ক্ষেত্রে, আপনি একটি তৃতীয় পক্ষের API প্রদানকারী ব্যবহার করতে পারেন। এই পরিষেবাগুলি ব্যবহার করার একটি সংক্ষিপ্ত বিবরণের জন্য, [পরিষেবা হিসাবে নোডগুলি](/developers/docs/nodes-and-clients/nodes-as-a-service/) দেখুন। + +যদি কেউ আপনার সম্প্রদায়ে একটি পাবলিক API সহ একটি ইথেরিয়াম নোড চালায়, আপনি কাস্টম RPC এর মাধ্যমে আপনার ওয়ালেটগুলিকে একটি কমিউনিটি নোডে নির্দেশ করতে পারেন এবং কিছু এলোমেলো বিশ্বস্ত তৃতীয় পক্ষের তুলনায় আরও বেশি গোপনীয়তা অর্জন করতে পারেন। + +অন্যদিকে, আপনি যদি একটি ক্লায়েন্ট চালান, আপনি এটি আপনার বন্ধুদের সাথে শেয়ার করতে পারেন যাদের এটির প্রয়োজন হতে পারে। + +## এক্সিকিউশন ক্লায়েন্ট {#execution-clients} + +ইথেরিয়াম সম্প্রদায় একাধিক ওপেন-সোর্স এক্সিকিউশন ক্লায়েন্ট (পূর্বে 'Eth1 ক্লায়েন্ট', বা শুধু 'ইথেরিয়াম ক্লায়েন্ট' নামে পরিচিত) রক্ষণাবেক্ষণ করে, যা বিভিন্ন দল বিভিন্ন প্রোগ্রামিং ভাষা ব্যবহার করে তৈরি করেছে। এটি নেটওয়ার্ককে আরও শক্তিশালী এবং আরও [বৈচিত্র্যময়](/developers/docs/nodes-and-clients/client-diversity/) করে তোলে। আদর্শ লক্ষ্য হল কোনো একক ব্যর্থতার বিন্দু কমাতে কোনো ক্লায়েন্টের আধিপত্য ছাড়াই বৈচিত্র্য অর্জন করা। + +এই টেবিলটি বিভিন্ন ক্লায়েন্টের সারসংক্ষেপ করে। তারা সবাই [ক্লায়েন্ট পরীক্ষা](https://github.com/ethereum/tests) পাস করে এবং নেটওয়ার্ক আপগ্রেডের সাথে আপডেট থাকার জন্য সক্রিয়ভাবে রক্ষণাবেক্ষণ করা হয়। + +| ক্লায়েন্ট | ভাষা | অপারেটিং সিস্টেম | নেটওয়ার্ক | সিঙ্ক কৌশল | স্টেট ছাঁটাই | +| ------------------------------------------------------------------------------------------- | ------------------------ | -------------------------- | ------------------------ | ---------------------------------------------------------------------------------- | ------------------- | +| [Geth](https://geth.ethereum.org/) | যান | লিনাক্স, উইন্ডোজ, ম্যাকওএস | মেইননেট, সেপোলিয়া, হুডি | [স্ন্যাপ](#snap-sync), [ফুল](#full-sync) | আর্কাইভ, ছাঁটাই করা | +| [Nethermind](https://www.nethermind.io/) | C#, .NET | লিনাক্স, উইন্ডোজ, ম্যাকওএস | মেইননেট, সেপোলিয়া, হুডি | [স্ন্যাপ](#snap-sync) (পরিষেবা ছাড়া), ফাস্ট, [ফুল](#full-sync) | আর্কাইভ, ছাঁটাই করা | +| [Besu](https://besu.hyperledger.org/en/stable/) | জাভা | লিনাক্স, উইন্ডোজ, ম্যাকওএস | মেইননেট, সেপোলিয়া, হুডি | [স্ন্যাপ](#snap-sync), [ফাস্ট](#fast-sync), [ফুল](#full-sync) | আর্কাইভ, ছাঁটাই করা | +| [Erigon](https://github.com/ledgerwatch/erigon) | যান | লিনাক্স, উইন্ডোজ, ম্যাকওএস | মেইননেট, সেপোলিয়া, হুডি | [ফুল](#full-sync) | আর্কাইভ, ছাঁটাই করা | +| [Reth](https://reth.rs/) | রাস্ট | লিনাক্স, উইন্ডোজ, ম্যাকওএস | মেইননেট, সেপোলিয়া, হুডি | [ফুল](#full-sync) | আর্কাইভ, ছাঁটাই করা | +| [EthereumJS](https://github.com/ethereumjs/ethereumjs-monorepo) _(বিটা)_ | টাইপস্ক্রিপ্ট | লিনাক্স, উইন্ডোজ, ম্যাকওএস | সেপোলিয়া, হুডি | [ফুল](#full-sync) | ছাঁটাই করা | + +সমর্থিত নেটওয়ার্ক সম্পর্কে আরও জানতে, [ইথেরিয়াম নেটওয়ার্ক](/developers/docs/networks/) সম্পর্কে পড়ুন। + +প্রতিটি ক্লায়েন্টের নিজস্ব ব্যবহার এবং সুবিধা রয়েছে, তাই আপনার নিজের পছন্দের উপর ভিত্তি করে একটি বেছে নেওয়া উচিত। বৈচিত্র্য বিভিন্ন বৈশিষ্ট্য এবং ব্যবহারকারী দর্শকদের উপর বাস্তবায়ন ফোকাস করার অনুমতি দেয়। আপনি বৈশিষ্ট্য, সমর্থন, প্রোগ্রামিং ভাষা বা লাইসেন্সের উপর ভিত্তি করে একটি ক্লায়েন্ট বেছে নিতে পারেন। + +### Besu {#besu} + +হাইপারলেজার বেসু পাবলিক এবং অনুমতিপ্রাপ্ত নেটওয়ার্কের জন্য একটি এন্টারপ্রাইজ-গ্রেড ইথেরিয়াম ক্লায়েন্ট। এটি ট্রেসিং থেকে GraphQL পর্যন্ত সমস্ত ইথেরিয়াম মেইননেট বৈশিষ্ট্য চালায়, এর ব্যাপক পর্যবেক্ষণ রয়েছে এবং এটি ConsenSys দ্বারা সমর্থিত, উভয়ই উন্মুক্ত কমিউনিটি চ্যানেলে এবং উদ্যোগগুলির জন্য বাণিজ্যিক SLA-এর মাধ্যমে। এটি জাভাতে লেখা এবং অ্যাপাচি 2.0 লাইসেন্সপ্রাপ্ত। + +বেসুর বিস্তৃত [নথিপত্র](https://besu.hyperledger.org/en/stable/) আপনাকে এর বৈশিষ্ট্য এবং সেটআপের সমস্ত বিবরণ দিয়ে গাইড করবে। + +### Erigon {#erigon} + +Erigon, যা পূর্বে টার্বো-গেথ নামে পরিচিত ছিল, এটি গো ইথেরিয়ামের একটি ফর্ক হিসাবে শুরু হয়েছিল যা গতি এবং ডিস্ক-স্পেস দক্ষতার দিকে ভিত্তিক। Erigon হল ইথেরিয়ামের একটি সম্পূর্ণ পুনঃস্থাপিত বাস্তবায়ন, যা বর্তমানে Go-তে লেখা কিন্তু অন্যান্য ভাষায় বাস্তবায়ন উন্নয়নাধীন রয়েছে। Erigon-এর লক্ষ্য হল ইথেরিয়ামের একটি দ্রুত, আরও মডুলার এবং আরও অপ্টিমাইজড বাস্তবায়ন প্রদান করা। এটি প্রায় 2TB ডিস্ক স্পেস ব্যবহার করে 3 দিনেরও কম সময়ে একটি সম্পূর্ণ আর্কাইভ নোড সিঙ্ক করতে পারে। + +### গো ইথেরিয়াম {#geth} + +গো ইথেরিয়াম (সংক্ষেপে Geth) হল ইথেরিয়াম প্রোটোকলের মূল বাস্তবায়নগুলির মধ্যে একটি। বর্তমানে, এটি সবচেয়ে বিস্তৃত ক্লায়েন্ট যার সবচেয়ে বড় ব্যবহারকারী বেস এবং ব্যবহারকারী ও ডেভেলপারদের জন্য বিভিন্ন ধরনের টুলিং রয়েছে। এটি Go-তে লেখা, সম্পূর্ণরূপে ওপেন সোর্স এবং GNU LGPL v3-এর অধীনে লাইসেন্সপ্রাপ্ত। + +Geth সম্পর্কে আরও জানতে এর [নথিপত্র](https://geth.ethereum.org/docs/) দেখুন। + +### Nethermind {#nethermind} + +Nethermind হল C# .NET টেক স্ট্যাক দিয়ে তৈরি একটি ইথেরিয়াম বাস্তবায়ন, যা LGPL-3.0 দিয়ে লাইসেন্সপ্রাপ্ত এবং ARM সহ সমস্ত প্রধান প্ল্যাটফর্মে চলে। এটি দুর্দান্ত পারফরম্যান্স অফার করে: + +- একটি অপ্টিমাইজড ভার্চুয়াল মেশিন +- স্টেট অ্যাক্সেস +- নেটওয়ার্কিং এবং প্রোমিথিউস/গ্রাফানা ড্যাশবোর্ড, seq এন্টারপ্রাইজ লগিং সাপোর্ট, JSON-RPC ট্রেসিং এবং অ্যানালিটিক্স প্লাগইনের মতো সমৃদ্ধ বৈশিষ্ট্য। + +Nethermind-এর [বিস্তারিত নথিপত্র](https://docs.nethermind.io), শক্তিশালী ডেভ সাপোর্ট, একটি অনলাইন কমিউনিটি এবং প্রিমিয়াম ব্যবহারকারীদের জন্য 24/7 সাপোর্ট রয়েছে। + +### Reth {#reth} + +Reth (রাস্ট ইথেরিয়ামের সংক্ষিপ্ত রূপ) হল একটি ইথেরিয়াম ফুল নোড বাস্তবায়ন যা ব্যবহারকারী-বান্ধব, অত্যন্ত মডুলার, দ্রুত এবং দক্ষ হওয়ার উপর দৃষ্টি নিবদ্ধ করে। Reth মূলত Paradigm দ্বারা নির্মিত এবং চালিত হয়েছিল, এবং এটি অ্যাপাচি এবং এমআইটি লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত। + +Reth প্রোডাকশন-রেডি, এবং স্টেকিং বা হাই-আপটাইম পরিষেবার মতো মিশন-ক্রিটিক্যাল পরিবেশে ব্যবহারের জন্য উপযুক্ত। RPC, MEV, ইন্ডেক্সিং, সিমুলেশন এবং P2P কার্যকলাপের মতো ক্ষেত্রে যেখানে দুর্দান্ত মার্জিন সহ উচ্চ কার্যকারিতা প্রয়োজন সেখানে ভাল কাজ করে। + +[Reth Book](https://reth.rs/) বা [Reth GitHub repo](https://github.com/paradigmxyz/reth?tab=readme-ov-file#reth) দেখে আরও জানুন। + +### উন্নয়নাধীন {#execution-in-development} + +এই ক্লায়েন্টগুলি এখনও বিকাশের প্রাথমিক পর্যায়ে রয়েছে এবং এখনও প্রোডাকশন ব্যবহারের জন্য সুপারিশ করা হয় না। + +#### EthereumJS {#ethereumjs} + +EthereumJS এক্সিকিউশন ক্লায়েন্ট (EthereumJS) টাইপস্ক্রিপ্টে লেখা এবং বেশ কয়েকটি প্যাকেজ নিয়ে গঠিত, যার মধ্যে ব্লক, ট্রানজ্যাকশন এবং মার্কল-প্যাট্রিসিয়া ট্রাই ক্লাস দ্বারা প্রতিনিধিত্বকারী মূল ইথেরিয়াম প্রিমিটিভস এবং ইথেরিয়াম ভার্চুয়াল মেশিন (EVM), একটি ব্লকচেইন ক্লাস এবং DevP2P নেটওয়ার্কিং স্ট্যাকের একটি বাস্তবায়ন সহ মূল ক্লায়েন্ট উপাদান অন্তর্ভুক্ত রয়েছে। + +এর [নথিপত্র](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master) পড়ে এটি সম্পর্কে আরও জানুন। + +## কনসেন্সাস ক্লায়েন্ট {#consensus-clients} + +[কনসেন্সাস আপগ্রেড](/roadmap/beacon-chain/) সমর্থন করার জন্য একাধিক কনসেন্সাস ক্লায়েন্ট (পূর্বে 'Eth2' ক্লায়েন্ট হিসাবে পরিচিত) রয়েছে। তারা ফর্ক-চয়েস অ্যালগরিদম, অ্যাটেস্টেশন প্রক্রিয়াকরণ এবং [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos) পুরস্কার এবং জরিমানা পরিচালনা সহ সমস্ত কনসেন্সাস-সম্পর্কিত যুক্তির জন্য দায়ী। + +| ক্লায়েন্ট | ভাষা | অপারেটিং সিস্টেম | নেটওয়ার্ক | +| ------------------------------------------------------------- | ------------- | -------------------------- | ---------------------------------------------------------------- | +| [Lighthouse](https://lighthouse.sigmaprime.io/) | রাস্ট | লিনাক্স, উইন্ডোজ, ম্যাকওএস | বিকন চেইন, হুডি, পিয়ারমন্ট, সেপোলিয়া এবং আরও অনেক কিছু | +| [Lodestar](https://lodestar.chainsafe.io/) | টাইপস্ক্রিপ্ট | লিনাক্স, উইন্ডোজ, ম্যাকওএস | বিকন চেইন, হুডি, সেপোলিয়া এবং আরও অনেক কিছু | +| [Nimbus](https://nimbus.team/) | নিম | লিনাক্স, উইন্ডোজ, ম্যাকওএস | বিকন চেইন, হুডি, সেপোলিয়া এবং আরও অনেক কিছু | +| [Prysm](https://prysm.offchainlabs.com/docs/) | যান | লিনাক্স, উইন্ডোজ, ম্যাকওএস | বিকন চেইন, Gnosis, হুডি, পিয়ারমন্ট, সেপোলিয়া এবং আরও অনেক কিছু | +| [Teku](https://consensys.net/knowledge-base/ethereum-2/teku/) | জাভা | লিনাক্স, উইন্ডোজ, ম্যাকওএস | বিকন চেইন, Gnosis, হুডি, সেপোলিয়া এবং আরও অনেক কিছু | +| [Grandine](https://docs.grandine.io/) | রাস্ট | লিনাক্স, উইন্ডোজ, ম্যাকওএস | বিকন চেইন, হুডি, সেপোলিয়া এবং আরও অনেক কিছু | + +### Lighthouse {#lighthouse} + +Lighthouse হল একটি কনসেন্সাস ক্লায়েন্ট বাস্তবায়ন যা রাস্টে অ্যাপাচি-২.০ লাইসেন্সের অধীনে লেখা। এটি সিগমা প্রাইম দ্বারা রক্ষণাবেক্ষণ করা হয় এবং বিকন চেইন জেনেসিস থেকে স্থিতিশীল এবং প্রোডাকশন-রেডি। বিভিন্ন এন্টারপ্রাইজ, স্টেকিং পুল এবং ব্যক্তিরা এর উপর নির্ভর করে। ডেস্কটপ পিসি থেকে শুরু করে অত্যাধুনিক স্বয়ংক্রিয় স্থাপনা পর্যন্ত বিস্তৃত পরিবেশে সুরক্ষিত, কার্যক্ষম এবং আন্তঃক্রিয়াশীল হওয়াই এর লক্ষ্য। + +[Lighthouse Book](https://lighthouse-book.sigmaprime.io/)-এ নথিপত্র পাওয়া যাবে। + +### Lodestar {#lodestar} + +Lodestar হল একটি প্রোডাকশন-রেডি কনসেন্সাস ক্লায়েন্ট বাস্তবায়ন যা টাইপস্ক্রিপ্টে এলজিপিএল-৩.০ লাইসেন্সের অধীনে লেখা। এটি ChainSafe সিস্টেম দ্বারা রক্ষণাবেক্ষণ করা হয় এবং এটি একক-স্টেকার, ডেভেলপার এবং গবেষকদের জন্য নতুনতম কনসেন্সাস ক্লায়েন্ট। Lodestar একটি বিকন নোড এবং ভ্যালিডেটর ক্লায়েন্ট নিয়ে গঠিত যা ইথেরিয়াম প্রোটোকলের জাভাস্ক্রিপ্ট বাস্তবায়ন দ্বারা চালিত। Lodestar-এর লক্ষ্য হল লাইট ক্লায়েন্টদের সাথে ইথেরিয়ামের ব্যবহারযোগ্যতা উন্নত করা, ডেভেলপারদের একটি বৃহত্তর গোষ্ঠীর কাছে অ্যাক্সেসযোগ্যতা প্রসারিত করা এবং ইকোসিস্টেমের বৈচিত্র্যে আরও অবদান রাখা। + +[Lodestar ওয়েবসাইট](https://lodestar.chainsafe.io/)-এ আরও তথ্য পাওয়া যাবে। + +### Nimbus {#nimbus} + +Nimbus হল একটি কনসেন্সাস ক্লায়েন্ট বাস্তবায়ন যা নিম-এ অ্যাপাচি-২.০ লাইসেন্সের অধীনে লেখা। এটি একটি প্রোডাকশন-রেডি ক্লায়েন্ট যা একক-স্টেকার এবং স্টেকিং পুল দ্বারা ব্যবহৃত হয়। Nimbus রিসোর্স দক্ষতার জন্য ডিজাইন করা হয়েছে, যা স্থিতিশীলতা বা পুরস্কারের কার্যকারিতার সাথে আপস না করে রিসোর্স-সীমাবদ্ধ ডিভাইস এবং এন্টারপ্রাইজ অবকাঠামোতে সহজে চালানো সহজ করে তোলে। একটি হালকা রিসোর্স ফুটপ্রিন্ট মানে নেটওয়ার্ক যখন চাপে থাকে তখন ক্লায়েন্টের নিরাপত্তার একটি বৃহত্তর মার্জিন থাকে। + +[Nimbus ডক্স](https://nimbus.guide/)-এ আরও জানুন + +### Prysm {#prysm} + +Prysm হল একটি পূর্ণ-বৈশিষ্ট্যযুক্ত, ওপেন সোর্স কনসেন্সাস ক্লায়েন্ট যা Go-তে GPL-3.0 লাইসেন্সের অধীনে লেখা। এতে একটি ঐচ্ছিক ওয়েবঅ্যাপ UI রয়েছে এবং এটি বাড়িতে স্টেক করা এবং প্রাতিষ্ঠানিক উভয় ব্যবহারকারীর জন্য ব্যবহারকারীর অভিজ্ঞতা, নথিপত্র এবং কনফিগারযোগ্যতাকে অগ্রাধিকার দেয়। + +আরও জানতে [Prysm ডক্স](https://prysm.offchainlabs.com/docs/) দেখুন। + +### Teku {#teku} + +Teku হল আসল বিকন চেইন জেনেসিস ক্লায়েন্টদের মধ্যে একটি। সাধারণ লক্ষ্যগুলির (নিরাপত্তা, দৃঢ়তা, স্থিতিশীলতা, ব্যবহারযোগ্যতা, কার্যকারিতা) পাশাপাশি, Teku বিশেষভাবে বিভিন্ন কনসেন্সাস ক্লায়েন্ট মানগুলির সাথে সম্পূর্ণভাবে মেনে চলার লক্ষ্য রাখে। + +Teku খুব নমনীয় স্থাপনার বিকল্পগুলি অফার করে। বিকন নোড এবং ভ্যালিডেটর ক্লায়েন্টকে একটি একক প্রক্রিয়া হিসাবে একসাথে চালানো যেতে পারে, যা একক স্টেকারদের জন্য অত্যন্ত সুবিধাজনক, বা অত্যাধুনিক স্টেকিং অপারেশনের জন্য নোডগুলি আলাদাভাবে চালানো যেতে পারে। এছাড়াও, Teku সাইনিং কী নিরাপত্তা এবং স্ল্যাশিং সুরক্ষার জন্য [Web3Signer](https://github.com/ConsenSys/web3signer/) এর সাথে সম্পূর্ণরূপে আন্তঃক্রিয়াশীল। + +Teku জাভাতে লেখা এবং অ্যাপাচি 2.0 লাইসেন্সপ্রাপ্ত। এটি ConsenSys-এর প্রোটোকল টিম দ্বারা তৈরি করা হয়েছে যা বেসু এবং Web3Signer-এর জন্যও দায়ী। [Teku ডক্স](https://docs.teku.consensys.net/en/latest/)-এ আরও জানুন। + +### Grandine {#grandine} + +Grandine হল একটি কনসেন্সাস ক্লায়েন্ট বাস্তবায়ন, যা রাস্টে GPL-3.0 লাইসেন্সের অধীনে লেখা। এটি গ্র্যান্ডাইন কোর টিম দ্বারা রক্ষণাবেক্ষণ করা হয় এবং এটি দ্রুত, উচ্চ-কার্যক্ষম এবং হালকা। এটি রাস্পবেরি পাই-এর মতো কম-রিসোর্স ডিভাইসে চালিত একক স্টেকার থেকে শুরু করে হাজার হাজার ভ্যালিডেটর চালানো বড় প্রাতিষ্ঠানিক স্টেকার পর্যন্ত বিস্তৃত স্টেকারদের জন্য উপযুক্ত। + +[Grandine Book](https://docs.grandine.io/)-এ নথিপত্র পাওয়া যাবে। + +## সিঙ্ক্রোনাইজেশন মোড {#sync-modes} + +নেটওয়ার্কের বর্তমান ডেটা অনুসরণ এবং যাচাই করতে, ইথেরিয়াম ক্লায়েন্টকে সর্বশেষ নেটওয়ার্ক স্টেটের সাথে সিঙ্ক করতে হবে। এটি পিয়ারদের থেকে ডেটা ডাউনলোড করে, ক্রিপ্টোগ্রাফিকভাবে তাদের অখণ্ডতা যাচাই করে এবং একটি স্থানীয় ব্লকচেইন ডেটাবেস তৈরি করে করা হয়। + +সিঙ্ক্রোনাইজেশন মোডগুলি বিভিন্ন ট্রেড-অফ সহ এই প্রক্রিয়ার বিভিন্ন পদ্ধতির প্রতিনিধিত্ব করে। ক্লায়েন্টরা তাদের সিঙ্ক অ্যালগরিদম বাস্তবায়নেও ভিন্ন হয়। বাস্তবায়নের নির্দিষ্ট বিবরণের জন্য সর্বদা আপনার নির্বাচিত ক্লায়েন্টের অফিসিয়াল নথিপত্র দেখুন। + +### এক্সিকিউশন লেয়ার সিঙ্ক মোড {#execution-layer-sync-modes} + +এক্সিকিউশন লেয়ারটি বিভিন্ন ব্যবহারের ক্ষেত্রে উপযুক্ত করার জন্য বিভিন্ন মোডে চালানো যেতে পারে, ব্লকচেইনের ওয়ার্ল্ড স্টেট পুনরায় কার্যকর করা থেকে শুরু করে একটি বিশ্বস্ত চেকপয়েন্ট থেকে চেইনের ডগা দিয়ে সিঙ্ক করা পর্যন্ত। + +#### ফুল সিঙ্ক {#full-sync} + +একটি ফুল সিঙ্ক সমস্ত ব্লক (হেডার এবং ব্লক বডি সহ) ডাউনলোড করে এবং জেনেসিস থেকে প্রতিটি ব্লক কার্যকর করে ক্রমবর্ধমানভাবে ব্লকচেইনের স্টেট পুনরায় তৈরি করে। + +- প্রতিটি লেনদেন যাচাই করে বিশ্বাস কমায় এবং সর্বোচ্চ নিরাপত্তা প্রদান করে। +- ক্রমবর্ধমান লেনদেনের সংখ্যার সাথে, সমস্ত লেনদেন প্রক্রিয়া করতে দিন থেকে সপ্তাহ সময় লাগতে পারে। + +[আর্কাইভ নোড](#archive-node) প্রতিটি ব্লকের প্রতিটি লেনদেনের দ্বারা করা স্টেট পরিবর্তনের একটি সম্পূর্ণ ইতিহাস তৈরি করতে (এবং ধরে রাখতে) একটি ফুল সিঙ্ক সম্পাদন করে। + +#### ফাস্ট সিঙ্ক {#fast-sync} + +একটি ফুল সিঙ্কের মতো, একটি ফাস্ট সিঙ্ক সমস্ত ব্লক (হেডার, লেনদেন এবং রসিদ সহ) ডাউনলোড করে। যাইহোক, ঐতিহাসিক লেনদেনগুলি পুনরায় প্রক্রিয়া করার পরিবর্তে, একটি ফাস্ট সিঙ্ক রসিদগুলির উপর নির্ভর করে যতক্ষণ না এটি একটি সাম্প্রতিক হেডে পৌঁছায়, যখন এটি একটি ফুল নোড সরবরাহ করার জন্য ব্লক আমদানি এবং প্রক্রিয়াকরণে স্যুইচ করে। + +- ফাস্ট সিঙ্ক কৌশল। +- ব্যান্ডউইথ ব্যবহারের পক্ষে প্রক্রিয়াকরণের চাহিদা হ্রাস করে। + +#### স্ন্যাপ সিঙ্ক {#snap-sync} + +স্ন্যাপ সিঙ্কগুলিও চেইনকে ব্লক-বাই-ব্লক যাচাই করে। যাইহোক, জেনেসিস ব্লক থেকে শুরু করার পরিবর্তে, একটি স্ন্যাপ সিঙ্ক একটি সাম্প্রতিক 'বিশ্বস্ত' চেকপয়েন্ট থেকে শুরু হয় যা সত্যিকারের ব্লকচেইনের অংশ হিসাবে পরিচিত। নোড একটি নির্দিষ্ট বয়সের চেয়ে পুরানো ডেটা মুছে ফেলার সময় পর্যায়ক্রমিক চেকপয়েন্টগুলি সংরক্ষণ করে। এই স্ন্যাপশটগুলি চিরতরে সঞ্চয় করার পরিবর্তে প্রয়োজন অনুসারে স্টেট ডেটা পুনরায় তৈরি করতে ব্যবহৃত হয়। + +- দ্রুততম সিঙ্ক কৌশল, বর্তমানে ইথেরিয়াম মেইননেটে ডিফল্ট। +- নিরাপত্তার সাথে আপস না করে প্রচুর ডিস্ক ব্যবহার এবং নেটওয়ার্ক ব্যান্ডউইথ সাশ্রয় করে। + +[স্ন্যাপ সিঙ্ক সম্পর্কে আরও](https://github.com/ethereum/devp2p/blob/master/caps/snap.md)। + +#### লাইট সিঙ্ক {#light-sync} + +লাইট ক্লায়েন্ট মোড সমস্ত ব্লক হেডার, ব্লক ডেটা ডাউনলোড করে এবং এলোমেলোভাবে কিছু যাচাই করে। শুধুমাত্র বিশ্বস্ত চেকপয়েন্ট থেকে চেইনের ডগা সিঙ্ক করে। + +- ডেভেলপার এবং কনসেন্সাস মেকানিজমের উপর আস্থা রেখে শুধুমাত্র সর্বশেষ স্টেট পায়। +- ক্লায়েন্ট কয়েক মিনিটের মধ্যে বর্তমান নেটওয়ার্ক স্টেটের সাথে ব্যবহারের জন্য প্রস্তুত। + +**NB** লাইট সিঙ্ক এখনও প্রুফ-অফ-স্টেক ইথেরিয়ামের সাথে কাজ করে না - লাইট সিঙ্কের নতুন সংস্করণ শীঘ্রই পাঠানো উচিত! + +[লাইট ক্লায়েন্ট সম্পর্কে আরও](/developers/docs/nodes-and-clients/light-clients/) + +### কনসেন্সাস লেয়ার সিঙ্ক মোড {#consensus-layer-sync-modes} + +#### অপ্টিমিস্টিক সিঙ্ক {#optimistic-sync} + +অপ্টিমিস্টিক সিঙ্ক হল একটি পোস্ট-মার্জ সিঙ্ক্রোনাইজেশন কৌশল যা অপ্ট-ইন এবং ব্যাকওয়ার্ড সামঞ্জস্যপূর্ণ হওয়ার জন্য ডিজাইন করা হয়েছে, যা এক্সিকিউশন নোডগুলিকে প্রতিষ্ঠিত পদ্ধতির মাধ্যমে সিঙ্ক করতে দেয়। এক্সিকিউশন ইঞ্জিন সম্পূর্ণরূপে যাচাই না করে _আশাবাদীভাবে_ বিকন ব্লক আমদানি করতে পারে, সর্বশেষ হেড খুঁজে পেতে পারে, এবং তারপর উপরের পদ্ধতিগুলির সাথে চেইন সিঙ্ক করা শুরু করতে পারে। তারপর, এক্সিকিউশন ক্লায়েন্ট ধরা পড়ার পরে, এটি কনসেন্সাস ক্লায়েন্টকে বিকন চেইনের লেনদেনের বৈধতা সম্পর্কে অবহিত করবে। + +[অপ্টিমিস্টিক সিঙ্ক সম্পর্কে আরও](https://github.com/ethereum/consensus-specs/blob/dev/sync/optimistic.md) + +#### চেকপয়েন্ট সিঙ্ক {#checkpoint-sync} + +একটি চেকপয়েন্ট সিঙ্ক, যা দুর্বল সাবজেক্টিভিটি সিঙ্ক নামেও পরিচিত, একটি বিকন নোড সিঙ্ক করার জন্য একটি উচ্চতর ব্যবহারকারীর অভিজ্ঞতা তৈরি করে। এটি [দুর্বল সাবজেক্টিভিটি](/developers/docs/consensus-mechanisms/pos/weak-subjectivity/) অনুমানের উপর ভিত্তি করে যা জেনেসিসের পরিবর্তে একটি সাম্প্রতিক দুর্বল সাবজেক্টিভিটি চেকপয়েন্ট থেকে বিকন চেইন সিঙ্ক করতে সক্ষম করে। চেকপয়েন্ট সিঙ্কগুলি [জেনেসিস](/glossary/#genesis-block) থেকে সিঙ্ক করার মতো একই বিশ্বাস অনুমানের সাথে প্রাথমিক সিঙ্কের সময়কে উল্লেখযোগ্যভাবে দ্রুত করে তোলে। + +বাস্তবে, এর মানে হল আপনার নোড সাম্প্রতিক চূড়ান্ত স্টেট ডাউনলোড করতে একটি দূরবর্তী পরিষেবার সাথে সংযোগ করে এবং সেই বিন্দু থেকে ডেটা যাচাই করা চালিয়ে যায়। ডেটা সরবরাহকারী তৃতীয় পক্ষ বিশ্বস্ত এবং সাবধানে বাছাই করা উচিত। + +[চেকপয়েন্ট সিঙ্ক](https://notes.ethereum.org/@djrtwo/ws-sync-in-practice) সম্পর্কে আরও + +## আরও পড়ুন {#further-reading} + +- [ইথেরিয়াম 101 - পার্ট 2 - নোড বোঝা](https://kauri.io/ethereum-101-part-2-understanding-nodes/48d5098292fd4f11b251d1b1814f0bba/a) _– উইল বার্নস, 13 ফেব্রুয়ারী 2019_ +- [ইথেরিয়াম ফুল নোড চালানো: সামান্য অনুপ্রাণিতদের জন্য একটি নির্দেশিকা](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– জাস্টিন লেরক্স, 7 নভেম্বর 2019_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [ব্লক](/developers/docs/blocks/) +- [নেটওয়ার্ক](/developers/docs/networks/) + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [শুধু মাইক্রোএসডি কার্ড ফ্ল্যাশ করে আপনার রাস্পবেরি পাই 4 কে একটি ভ্যালিডেটর নোডে পরিণত করুন – ইনস্টলেশন গাইড](/developers/tutorials/run-node-raspberry-pi/) _– আপনার রাস্পবেরি পাই 4 ফ্ল্যাশ করুন, একটি ইথারনেট কেবল প্লাগ ইন করুন, এসএসডি ডিস্ক সংযোগ করুন এবং রাস্পবেরি পাই 4 কে একটি সম্পূর্ণ ইথেরিয়াম নোডে পরিণত করতে ডিভাইসটি চালু করুন যা এক্সিকিউশন লেয়ার (মেইননেট) এবং / অথবা কনসেন্সাস লেয়ার (বিকন চেইন / ভ্যালিডেটর) চালায়।_ diff --git a/public/content/translations/bn/developers/docs/nodes-and-clients/light-clients/index.md b/public/content/translations/bn/developers/docs/nodes-and-clients/light-clients/index.md new file mode 100644 index 00000000000..f08840cdaf3 --- /dev/null +++ b/public/content/translations/bn/developers/docs/nodes-and-clients/light-clients/index.md @@ -0,0 +1,61 @@ +--- +title: "লাইট ক্লায়েন্ট" +description: "ইথেরিয়াম লাইট ক্লায়েন্টের ভূমিকা।" +lang: bn +--- + +একটি সম্পূর্ণ নোড চালানো হলো ইথেরিয়ামের সাথে ইন্টারঅ্যাক্ট করার সবচেয়ে বিশ্বাসহীন, ব্যক্তিগত, বিকেন্দ্রীভূত এবং সেন্সরশিপ প্রতিরোধী উপায়। একটি সম্পূর্ণ নোডের মাধ্যমে আপনি ব্লকচেইনের নিজস্ব একটি কপি রাখেন যা আপনি তাৎক্ষণিকভাবে জিজ্ঞাসা করতে পারেন এবং আপনি ইথেরিয়ামের পিয়ার-টু-পিয়ার নেটওয়ার্কে সরাসরি অ্যাক্সেস পান। যাইহোক, একটি সম্পূর্ণ নোড চালানোর জন্য উল্লেখযোগ্য পরিমাণে মেমরি, স্টোরেজ এবং সিপিইউ প্রয়োজন। এর মানে হল প্রত্যেকের পক্ষে তাদের নিজস্ব নোড চালানো সম্ভব নয়। ইথেরিয়াম রোডম্যাপে এর বেশ কয়েকটি সমাধান রয়েছে, যার মধ্যে স্টেটলেসনেস অন্তর্ভুক্ত, কিন্তু সেগুলো বাস্তবায়ন হতে এখনও বেশ কয়েক বছর বাকি। স্বল্পমেয়াদী সমাধান হলো একটি সম্পূর্ণ নোড চালানোর কিছু সুবিধার সাথে আপস করা, যাতে বড় আকারের পারফরম্যান্স উন্নতি হয় এবং নোডগুলিকে খুব কম হার্ডওয়্যার প্রয়োজনীয়তা দিয়ে চালানো যায়। যে নোডগুলি এই আপস করে, সেগুলি লাইট নোড হিসাবে পরিচিত। + +## একটি লাইট ক্লায়েন্ট কি {#what-is-a-light-client} + +একটি লাইট নোড হলো একটি নোড যা লাইট ক্লায়েন্ট সফ্টওয়্যার চালায়। ব্লকচেইন ডেটার স্থানীয় কপি রাখা এবং স্বাধীনভাবে সমস্ত পরিবর্তন যাচাই করার পরিবর্তে, তারা কোনো সরবরাহকারীর কাছ থেকে প্রয়োজনীয় ডেটা অনুরোধ করে। সরবরাহকারী একটি সম্পূর্ণ নোডের সাথে সরাসরি সংযোগ বা কোনো কেন্দ্রীভূত RPC সার্ভারের মাধ্যমে হতে পারে। ডেটাটি তখন লাইট নোড দ্বারা যাচাই করা হয়, যা এটিকে চেইনের হেডের সাথে তাল মিলিয়ে চলতে দেয়। লাইট নোড শুধুমাত্র ব্লক হেডার প্রসেস করে, মাঝে মাঝে প্রকৃত ব্লকের বিষয়বস্তু ডাউনলোড করে। নোডগুলি তাদের লাইটনেসের দিক থেকে ভিন্ন হতে পারে, যা তারা যে লাইট এবং সম্পূর্ণ ক্লায়েন্ট সফ্টওয়্যারের সংমিশ্রণ চালায় তার উপর নির্ভর করে। উদাহরণস্বরূপ, সবচেয়ে হালকা কনফিগারেশন হবে একটি লাইট এক্সিকিউশন ক্লায়েন্ট এবং একটি লাইট কনসেন্সাস ক্লায়েন্ট চালানো। এটাও সম্ভবত যে অনেক নোড সম্পূর্ণ এক্সিকিউশন ক্লায়েন্টের সাথে লাইট কনসেন্সাস ক্লায়েন্ট চালাবে, অথবা এর বিপরীতও হতে পারে। + +## লাইট ক্লায়েন্ট কিভাবে কাজ করে? {#how-do-light-clients-work} + +যখন ইথেরিয়াম একটি প্রুফ-অফ-স্টেক ভিত্তিক কনসেন্সাস মেকানিজম ব্যবহার করা শুরু করে, তখন বিশেষভাবে লাইট ক্লায়েন্টদের সমর্থন করার জন্য নতুন পরিকাঠামো চালু করা হয়েছিল। এটি কাজ করার পদ্ধতি হলো প্রতি 1.1 দিনে এলোমেলোভাবে 512 জন ভ্যালিডেটরের একটি উপসেট নির্বাচন করা যারা একটি **সিঙ্ক কমিটি** হিসেবে কাজ করবে। সিঙ্ক কমিটি সাম্প্রতিক ব্লকগুলির হেডারে স্বাক্ষর করে। প্রতিটি ব্লক হেডারে সিঙ্ক কমিটির ভ্যালিডেটরদের একত্রিত স্বাক্ষর এবং একটি "বিটফিল্ড" থাকে যা দেখায় কোন ভ্যালিডেটররা স্বাক্ষর করেছে এবং কোনটি করেনি। প্রতিটি হেডারে পরবর্তী ব্লকে স্বাক্ষর করার জন্য প্রত্যাশিত ভ্যালিডেটরদের একটি তালিকাও অন্তর্ভুক্ত থাকে। এর মানে হল একটি লাইট ক্লায়েন্ট দ্রুত দেখতে পারে যে সিঙ্ক কমিটি তাদের প্রাপ্ত ডেটাতে স্বাক্ষর করেছে, এবং তারা এটিও পরীক্ষা করতে পারে যে সিঙ্ক কমিটি আসল কি না, আগের ব্লকে যা আশা করতে বলা হয়েছিল তার সাথে প্রাপ্ত কমিটির তুলনা করে। এইভাবে, লাইট ক্লায়েন্টটি আসলে ব্লকটি ডাউনলোড না করেই সর্বশেষ ইথেরিয়াম ব্লক সম্পর্কে তার জ্ঞান আপডেট রাখতে পারে, শুধুমাত্র হেডারটি ডাউনলোড করে যা সংক্ষিপ্ত তথ্য ধারণ করে। + +এক্সিকিউশন লেয়ারে একটি লাইট এক্সিকিউশন ক্লায়েন্টের জন্য কোনো একক স্পেসিফিকেশন নেই। একটি লাইট এক্সিকিউশন ক্লায়েন্টের পরিধি একটি সম্পূর্ণ এক্সিকিউশন ক্লায়েন্টের "লাইট মোড" থেকে ভিন্ন হতে পারে, যার একটি সম্পূর্ণ নোডের সমস্ত EVM এবং নেটওয়ার্কিং কার্যকারিতা রয়েছে কিন্তু শুধুমাত্র ব্লক হেডার যাচাই করে, সংশ্লিষ্ট ডেটা ডাউনলোড না করে, অথবা এটি আরও একটি ছোট ক্লায়েন্ট হতে পারে যা ইথেরিয়ামের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি RPC প্রদানকারীর কাছে অনুরোধ ফরোয়ার্ড করার উপর ব্যাপকভাবে নির্ভর করে। + +## লাইট ক্লায়েন্ট কেন গুরুত্বপূর্ণ? {#why-are-light-clients-important} + +লাইট ক্লায়েন্টগুলি গুরুত্বপূর্ণ কারণ তারা ব্যবহারকারীদের ইনকামিং ডেটা যাচাই করার অনুমতি দেয়, তাদের ডেটা প্রদানকারী সঠিক এবং সৎ বলে অন্ধভাবে বিশ্বাস করার পরিবর্তে, যখন একটি সম্পূর্ণ নোডের কম্পিউটেশনাল রিসোর্সের একটি ক্ষুদ্র অংশ ব্যবহার করে। লাইট ক্লায়েন্টরা যে ডেটা পায় তা ব্লক হেডারের সাথে মিলিয়ে পরীক্ষা করা যেতে পারে, যা তারা জানে যে 512 জন ইথেরিয়াম ভ্যালিডেটরের একটি র‍্যান্ডম সেটের অন্তত 2/3 দ্বারা স্বাক্ষরিত হয়েছে। এটি একটি খুব শক্তিশালী প্রমাণ যে ডেটা সঠিক। + +লাইট ক্লায়েন্ট শুধুমাত্র অল্প পরিমাণে কম্পিউটিং শক্তি, মেমরি এবং স্টোরেজ ব্যবহার করে, তাই এটি একটি মোবাইল ফোনে চালানো যেতে পারে, একটি অ্যাপে এমবেড করা যেতে পারে বা একটি ব্রাউজারের অংশ হিসাবে ব্যবহার করা যেতে পারে। লাইট ক্লায়েন্ট হল ইথেরিয়ামে ট্রাস্ট-মিনিমাইজড অ্যাক্সেসকে ঠিক ততটাই ঘর্ষণহীন করার একটি উপায় যতটা একটি তৃতীয় পক্ষের প্রদানকারীকে বিশ্বাস করা। + +আসুন একটি সহজ উদাহরণ নেওয়া যাক। ভাবুন আপনি আপনার অ্যাকাউন্টের ব্যালেন্স চেক করতে চান। এটি করার জন্য আপনাকে একটি ইথেরিয়াম নোডে একটি অনুরোধ করতে হবে। সেই নোডটি আপনার ব্যালেন্সের জন্য ইথেরিয়াম স্টেটের স্থানীয় কপি পরীক্ষা করবে এবং আপনাকে তা ফিরিয়ে দেবে। আপনার যদি একটি নোডে সরাসরি অ্যাক্সেস না থাকে, তবে এমন কেন্দ্রীভূত অপারেটর রয়েছে যারা এই ডেটা একটি পরিষেবা হিসাবে সরবরাহ করে। আপনি তাদের কাছে একটি অনুরোধ পাঠাতে পারেন, তারা তাদের নোড পরীক্ষা করে এবং ফলাফলটি আপনাকে ফিরিয়ে পাঠায়। এর সমস্যা হলো আপনাকে তখন প্রদানকারীকে বিশ্বাস করতে হবে যে তারা আপনাকে সঠিক তথ্য দিচ্ছে। আপনি যদি নিজের জন্য এটি যাচাই করতে না পারেন তবে আপনি কখনই সত্যিই জানতে পারবেন না যে তথ্যটি সঠিক। + +একটি লাইট ক্লায়েন্ট এই সমস্যার সমাধান করে। আপনি এখনও কিছু বাহ্যিক প্রদানকারীর কাছ থেকে ডেটা অনুরোধ করেন, কিন্তু যখন আপনি ডেটা ফিরে পান তখন এটি একটি প্রুফের সাথে আসে যা আপনার লাইট নোড ব্লক হেডারে প্রাপ্ত তথ্যের সাথে পরীক্ষা করতে পারে। এর মানে হল ইথেরিয়াম কোনো বিশ্বস্ত অপারেটরের পরিবর্তে আপনার ডেটার সঠিকতা যাচাই করছে। + +## লাইট ক্লায়েন্টরা কী কী উদ্ভাবনকে সক্ষম করে? {#what-innovations-do-light-clients-enable} + +লাইট ক্লায়েন্টদের প্রাথমিক সুবিধা হলো আরও বেশি লোককে নগণ্য হার্ডওয়্যার প্রয়োজনীয়তা এবং তৃতীয় পক্ষের উপর ন্যূনতম নির্ভরতার সাথে স্বাধীনভাবে ইথেরিয়াম অ্যাক্সেস করতে সক্ষম করা। এটি ব্যবহারকারীদের জন্য ভাল কারণ তারা তাদের নিজস্ব ডেটা যাচাই করতে পারে এবং এটি নেটওয়ার্কের জন্য ভাল কারণ এটি চেইন যাচাইকারী নোডের সংখ্যা এবং বৈচিত্র্য বাড়ায়। + +খুব ছোট স্টোরেজ, মেমরি এবং প্রসেসিং পাওয়ার সহ ডিভাইসগুলিতে ইথেরিয়াম নোড চালানোর ক্ষমতা লাইট ক্লায়েন্টদের দ্বারা আনলক করা উদ্ভাবনের অন্যতম প্রধান ক্ষেত্র। যেখানে আজ ইথেরিয়াম নোডগুলির জন্য প্রচুর কম্পিউটিং রিসোর্স প্রয়োজন, সেখানে লাইট ক্লায়েন্টগুলি ব্রাউজারে এম্বেড করা যেতে পারে, মোবাইল ফোনে চালানো যেতে পারে এবং সম্ভবত স্মার্টওয়াচের মতো ছোট ডিভাইসগুলিতেও চালানো যেতে পারে। এর মানে হল এমবেডেড ক্লায়েন্ট সহ ইথেরিয়াম ওয়ালেটগুলি একটি মোবাইল ফোনে চলতে পারে। এর মানে হল মোবাইল ওয়ালেটগুলি অনেক বেশি বিকেন্দ্রীভূত হতে পারে কারণ তাদের ডেটার জন্য কেন্দ্রীভূত ডেটা প্রদানকারীদের বিশ্বাস করতে হবে না। + +এর একটি সম্প্রসারণ হলো **ইন্টারনেট অফ থিংস (IoT)** ডিভাইসগুলিকে সক্ষম করা। একটি লাইট ক্লায়েন্ট কিছু টোকেন ব্যালেন্স বা NFT-এর মালিকানা দ্রুত প্রমাণ করতে ব্যবহার করা যেতে পারে, সিঙ্ক কমিটি দ্বারা প্রদত্ত সমস্ত নিরাপত্তা গ্যারান্টি সহ, যা একটি IoT নেটওয়ার্কে কিছু পদক্ষেপ ট্রিগার করে। ভাবুন একটি [বাইসাইকেল ভাড়ার পরিষেবা](https://youtu.be/ZHNrAXf3RDE?t=929) যা একটি এমবেডেড লাইট ক্লায়েন্ট সহ একটি অ্যাপ ব্যবহার করে দ্রুত যাচাই করে যে আপনি ভাড়া পরিষেবার NFT-এর মালিক এবং যদি তাই হয়, তবে আপনার জন্য একটি বাইসাইকেল আনলক করে দেয়! + +ইথেরিয়াম রোলআপগুলিও লাইট ক্লায়েন্ট থেকে উপকৃত হবে। রোলআপগুলির জন্য একটি বড় সমস্যা হলো ব্রিজগুলিকে লক্ষ্য করে হ্যাক করা, যা ইথেরিয়াম মেইননেট থেকে একটি রোলআপে ফান্ড স্থানান্তর করার অনুমতি দেয়। একটি দুর্বলতা হলো ওরাকল যা রোলআপগুলি ব্যবহার করে এটি সনাক্ত করতে যে কোনো ব্যবহারকারী ব্রিজে একটি ডিপোজিট করেছে। যদি একটি ওরাকল খারাপ ডেটা ফিড করে, তবে তারা রোলআপকে ভাবতে বাধ্য করতে পারে যে ব্রিজে একটি ডিপোজিট হয়েছে এবং ভুলভাবে ফান্ড প্রকাশ করতে পারে। রোলআপে এমবেড করা একটি লাইট ক্লায়েন্ট করাপ্টেড ওরাকলদের বিরুদ্ধে সুরক্ষা দিতে ব্যবহার করা যেতে পারে কারণ ব্রিজে করা ডিপোজিটটি একটি প্রুফ সহ আসতে পারে যা কোনো টোকেন রিলিজ করার আগে রোলআপ দ্বারা যাচাই করা যেতে পারে। একই ধারণা অন্যান্য ইন্টারচেইন ব্রিজেও প্রয়োগ করা যেতে পারে। + +লাইট ক্লায়েন্টগুলি ইথেরিয়াম ওয়ালেট আপগ্রেড করতেও ব্যবহার করা যেতে পারে। একটি RPC প্রদানকারীর দেওয়া ডেটার উপর বিশ্বাস করার পরিবর্তে, আপনার ওয়ালেট একটি এমবেডেড লাইট ক্লায়েন্ট ব্যবহার করে আপনাকে উপস্থাপিত ডেটা সরাসরি যাচাই করতে পারে। এটি আপনার ওয়ালেটে নিরাপত্তা যোগ করবে। যদি আপনার RPC প্রদানকারী অসৎ হয় এবং আপনাকে ভুল ডেটা সরবরাহ করে, এমবেডেড লাইট ক্লায়েন্ট আপনাকে তা বলে দিতে পারে! + +## লাইট ক্লায়েন্ট ডেভেলপমেন্টের বর্তমান অবস্থা কী? {#current-state-of-development} + +এক্সিকিউশন, কনসেন্সাস এবং সম্মিলিত এক্সিকিউশন/কনসেন্সাস লাইট ক্লায়েন্ট সহ বেশ কয়েকটি লাইট ক্লায়েন্ট ডেভেলপমেন্টের অধীনে রয়েছে। এই পৃষ্ঠাটি লেখার সময় আমরা যে লাইট ক্লায়েন্ট ইমপ্লিমেন্টেশনগুলি সম্পর্কে জানি সেগুলি হলো: + +- [Lodestar](https://github.com/ChainSafe/lodestar/tree/unstable/packages/light-client): TypeScript-এ কনসেন্সাস লাইট ক্লায়েন্ট +- [Helios](https://github.com/a16z/helios): Rust-এ সম্মিলিত এক্সিকিউশন এবং কনসেন্সাস লাইট ক্লায়েন্ট +- [Geth](https://github.com/ethereum/go-ethereum/tree/master/beacon/light): Go-তে এক্সিকিউশন ক্লায়েন্টের জন্য লাইট মোড (ডেভেলপমেন্ট চলছে) +- [Nimbus](https://nimbus.guide/el-light-client.html): Nim-এ কনসেন্সাস লাইট ক্লায়েন্ট + +আমাদের জানামতে, এগুলির কোনোটিই এখনও প্রোডাকশন-রেডি বলে বিবেচিত নয়। + +লাইট ক্লায়েন্টরা যেভাবে ইথেরিয়াম ডেটা অ্যাক্সেস করতে পারে তা উন্নত করার জন্য অনেক কাজ করা হচ্ছে। বর্তমানে, লাইট ক্লায়েন্টরা একটি ক্লায়েন্ট/সার্ভার মডেল ব্যবহার করে সম্পূর্ণ নোডগুলিতে RPC অনুরোধের উপর নির্ভর করে, কিন্তু ভবিষ্যতে ডেটা আরও বিকেন্দ্রীভূত উপায়ে অনুরোধ করা যেতে পারে, যেমন [পোর্টাল নেটওয়ার্ক](https://www.ethportal.net/) এর মতো একটি ডেডিকেটেড নেটওয়ার্ক ব্যবহার করে, যা পিয়ার-টু-পিয়ার গসিপ প্রোটোকল ব্যবহার করে লাইট ক্লায়েন্টদের ডেটা পরিবেশন করতে পারে। + +অন্যান্য [রোডম্যাপ](/roadmap/) আইটেম যেমন [Verkle trees](/roadmap/verkle-trees/) এবং [statelessness](/roadmap/statelessness/) অবশেষে লাইট ক্লায়েন্টদের নিরাপত্তা গ্যারান্টিকে সম্পূর্ণ ক্লায়েন্টদের সমান করে তুলবে। + +## আরও পড়ুন {#further-reading} + +- [Geth লাইট ক্লায়েন্টদের উপর জোল্ট ফেলফোডি](https://www.youtube.com/watch?v=EPZeFXau-RE) +- [লাইট ক্লায়েন্ট নেটওয়ার্কিং-এর উপর ইথান কিসলিং](https://www.youtube.com/watch?v=85MeiMA4dD8) +- [দ্য মার্জের পরে লাইট ক্লায়েন্টদের উপর ইথান কিসলিং](https://www.youtube.com/watch?v=ZHNrAXf3RDE) +- [পাইপার মেরিয়াম: কার্যকরী লাইট ক্লায়েন্টের দিকে সর্পিল পথ](https://snakecharmers.ethereum.org/the-winding-road-to-functional-light-clients/) diff --git a/public/content/translations/bn/developers/docs/nodes-and-clients/node-architecture/index.md b/public/content/translations/bn/developers/docs/nodes-and-clients/node-architecture/index.md new file mode 100644 index 00000000000..9f1d02079f6 --- /dev/null +++ b/public/content/translations/bn/developers/docs/nodes-and-clients/node-architecture/index.md @@ -0,0 +1,59 @@ +--- +title: "নোড আর্কিটেকচার" +description: "ইথেরিয়াম নোডগুলি কীভাবে সংগঠিত হয় তার একটি ভূমিকা।" +lang: bn +--- + +একটি ইথেরিয়াম নোড দুটি ক্লায়েন্ট নিয়ে গঠিত: একটি [এক্সিকিউশন ক্লায়েন্ট](/developers/docs/nodes-and-clients/#execution-clients) এবং একটি [কনসেন্সাস ক্লায়েন্ট](/developers/docs/nodes-and-clients/#consensus-clients)। একটি নতুন ব্লক প্রস্তাব করতে হলে, একটি নোডকে অবশ্যই একটি [ভ্যালিডেটর ক্লায়েন্ট](#validators)ও চালাতে হবে। + +যখন ইথেরিয়াম [প্রুফ-অফ-ওয়ার্ক](/developers/docs/consensus-mechanisms/pow/) ব্যবহার করত, তখন একটি সম্পূর্ণ ইথেরিয়াম নোড চালানোর জন্য একটি এক্সিকিউশন ক্লায়েন্টই যথেষ্ট ছিল। যাইহোক, [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pow/) প্রয়োগ করার পর থেকে, এক্সিকিউশন ক্লায়েন্টটিকে অবশ্যই [কনসেন্সাস ক্লায়েন্ট](/developers/docs/nodes-and-clients/#consensus-clients) নামক আরেকটি সফ্টওয়্যারের সাথে একত্রে ব্যবহার করতে হবে। + +নীচের ডায়াগ্রামটি দুটি ইথেরিয়াম ক্লায়েন্টের মধ্যে সম্পর্ক দেখায়। দুটি ক্লায়েন্ট তাদের নিজ নিজ পিয়ার-টু-পিয়ার (P2P) নেটওয়ার্কের সাথে সংযুক্ত হয়। আলাদা P2P নেটওয়ার্কের প্রয়োজন হয়, কারণ এক্সিকিউশন ক্লায়েন্টরা তাদের P2P নেটওয়ার্কের মাধ্যমে লেনদেন গসিপ করে, যা তাদের স্থানীয় লেনদেন পুল পরিচালনা করতে সক্ষম করে, অন্যদিকে কনসেন্সাস ক্লায়েন্টরা তাদের P2P নেটওয়ার্কের মাধ্যমে ব্লক গসিপ করে, যা কনসেন্সাস এবং চেইন বৃদ্ধি সক্ষম করে। + +![](node-architecture-text-background.png) + +_এক্সিকিউশন ক্লায়েন্টের জন্য Erigon, Nethermind, এবং Besu সহ বেশ কয়েকটি বিকল্প রয়েছে।_ + +এই দুই-ক্লায়েন্ট কাঠামোটি কাজ করার জন্য, কনসেন্সাস ক্লায়েন্টদের অবশ্যই এক্সিকিউশন ক্লায়েন্টের কাছে লেনদেনের বান্ডিল পাঠাতে হবে। এক্সিকিউশন ক্লায়েন্ট স্থানীয়ভাবে লেনদেনগুলি কার্যকর করে যাচাই করে যে, লেনদেনগুলি ইথেরিয়ামের কোনো নিয়ম লঙ্ঘন করছে না এবং ইথেরিয়ামের স্টেটে প্রস্তাবিত আপডেটটি সঠিক। যখন একটি নোডকে ব্লক প্রযোজক হিসাবে নির্বাচন করা হয়, তখন তার কনসেন্সাস ক্লায়েন্ট ইনস্ট্যান্স নতুন ব্লকে অন্তর্ভুক্ত করার জন্য এক্সিকিউশন ক্লায়েন্টের কাছ থেকে লেনদেনের বান্ডিলের অনুরোধ করে এবং গ্লোবাল স্টেট আপডেট করার জন্য সেগুলি কার্যকর করে। কনসেন্সাস ক্লায়েন্ট [ইঞ্জিন API](https://github.com/ethereum/execution-apis/blob/main/src/engine/common.md) ব্যবহার করে একটি স্থানীয় RPC সংযোগের মাধ্যমে এক্সিকিউশন ক্লায়েন্টকে চালনা করে। + +## এক্সিকিউশন ক্লায়েন্ট কী করে? {#execution-client} + +এক্সিকিউশন ক্লায়েন্ট লেনদেন যাচাইকরণ, পরিচালনা এবং গসিপের জন্য দায়ী, সেইসাথে স্টেট ম্যানেজমেন্ট এবং ইথেরিয়াম ভার্চুয়াল মেশিন ([EVM](/developers/docs/evm/)) সমর্থন করার জন্য। এটি ব্লক তৈরি, ব্লক গসিপিং বা কনসেন্সাস লজিক পরিচালনা করার জন্য দায়ী **নয়**। এগুলো কনসেন্সাস ক্লায়েন্টের দায়িত্বের মধ্যে পড়ে। + +এক্সিকিউশন ক্লায়েন্ট এক্সিকিউশন পেলোড তৈরি করে - লেনদেনের তালিকা, আপডেট করা স্টেট ট্রাই এবং অন্যান্য এক্সিকিউশন-সম্পর্কিত ডেটা। কনসেন্সাস ক্লায়েন্টরা প্রতিটি ব্লকে এক্সিকিউশন পেলোড অন্তর্ভুক্ত করে। এক্সিকিউশন ক্লায়েন্ট নতুন ব্লকের লেনদেনগুলি পুনরায় কার্যকর করে সেগুলি বৈধ কিনা তা নিশ্চিত করার জন্যও দায়ী। লেনদেন কার্যকর করা হয় এক্সিকিউশন ক্লায়েন্টের এমবেডেড কম্পিউটারে, যা [ইথেরিয়াম ভার্চুয়াল মেশিন (EVM)](/developers/docs/evm) নামে পরিচিত। + +এক্সিকিউশন ক্লায়েন্ট [RPC পদ্ধতি](/developers/docs/apis/json-rpc)-এর মাধ্যমে ইথেরিয়ামের জন্য একটি ইউজার ইন্টারফেসও প্রদান করে, যা ব্যবহারকারীদের ইথেরিয়াম ব্লকচেইন জিজ্ঞাসা করতে, লেনদেন জমা দিতে এবং স্মার্ট কন্ট্র্যাক্ট স্থাপন করতে সক্ষম করে। RPC কলগুলি সাধারণত [Web3js](https://docs.web3js.org/), [Web3py](https://web3py.readthedocs.io/en/v5/) এর মতো লাইব্রেরি দ্বারা বা ব্রাউজার ওয়ালেটের মতো ব্যবহারকারী-ইন্টারফেস দ্বারা পরিচালিত হয়। + +সংক্ষেপে, এক্সিকিউশন ক্লায়েন্ট হল: + +- ইথেরিয়ামের একটি ব্যবহারকারী গেটওয়ে +- ইথেরিয়াম ভার্চুয়াল মেশিন, ইথেরিয়ামের স্টেট এবং লেনদেন পুলের হোম। + +## কনসেন্সাস ক্লায়েন্ট কী করে? {#consensus-client} + +কনসেন্সাস ক্লায়েন্ট সেই সমস্ত লজিক নিয়ে কাজ করে যা একটি নোডকে ইথেরিয়াম নেটওয়ার্কের সাথে সিঙ্কে থাকতে সক্ষম করে। এর মধ্যে রয়েছে পিয়ারদের কাছ থেকে ব্লক গ্রহণ করা এবং একটি ফর্ক চয়েস অ্যালগরিদম চালানো, যা নিশ্চিত করে যে নোডটি সর্বদা সেই চেইনটিকেই অনুসরণ করে যেখানে প্রত্যয়নের সঞ্চয় সবচেয়ে বেশি (ভ্যালিডেটরের কার্যকর ব্যালেন্স দ্বারা ভারযুক্ত)। এক্সিকিউশন ক্লায়েন্টের মতো, কনসেন্সাস ক্লায়েন্টদেরও নিজস্ব P2P নেটওয়ার্ক রয়েছে যার মাধ্যমে তারা ব্লক এবং প্রত্যয়ন শেয়ার করে। + +কনসেন্সাস ক্লায়েন্ট ব্লকের প্রত্যয়ন বা প্রস্তাবনায় অংশ নেয় না - এটি একটি ভ্যালিডেটর দ্বারা করা হয়, যা কনসেন্সাস ক্লায়েন্টের একটি ঐচ্ছিক অ্যাড-অন। একটি ভ্যালিডেটর ছাড়া কনসেন্সাস ক্লায়েন্ট শুধুমাত্র চেইনের হেডের সাথে তাল মিলিয়ে চলে, যা নোডটিকে সিঙ্কড থাকতে দেয়। এটি একজন ব্যবহারকারীকে তাদের এক্সিকিউশন ক্লায়েন্ট ব্যবহার করে ইথেরিয়ামের সাথে লেনদেন করতে সক্ষম করে, এই আত্মবিশ্বাসের সাথে যে তারা সঠিক চেইনে আছে। + +## ভ্যালিডেটর {#validators} + +স্টেকিং এবং ভ্যালিডেটর সফ্টওয়্যার চালানো একটি নোডকে একটি নতুন ব্লক প্রস্তাব করার জন্য নির্বাচিত হওয়ার যোগ্য করে তোলে। নোড অপারেটররা ডিপোজিট কন্ট্র্যাক্টে 32 ETH জমা করে তাদের কনসেন্সাস ক্লায়েন্টে একটি ভ্যালিডেটর যোগ করতে পারে। ভ্যালিডেটর ক্লায়েন্টটি কনসেন্সাস ক্লায়েন্টের সাথে বান্ডিল করা থাকে এবং যেকোনো সময় একটি নোডে যোগ করা যেতে পারে। ভ্যালিডেটর প্রত্যয়ন এবং ব্লক প্রস্তাবনা পরিচালনা করে। এটি একটি নোডকে জরিমানা বা স্ল্যাশিংয়ের মাধ্যমে পুরস্কার অর্জন করতে বা ETH হারাতে সক্ষম করে। + +[স্টেকিং সম্পর্কে আরও জানুন](/staking/)। + +## একটি নোডের উপাদানগুলির তুলনা {#node-comparison} + +| এক্সিকিউশন ক্লায়েন্ট | কনসেন্সাস ক্লায়েন্ট | ভ্যালিডেটর | +| ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | +| তার P2P নেটওয়ার্কের মাধ্যমে লেনদেন গসিপ করে | তার P2P নেটওয়ার্কের মাধ্যমে ব্লক এবং প্রত্যয়ন গসিপ করে | ব্লক প্রস্তাব করে | +| লেনদেন কার্যকর/পুনরায় কার্যকর করে | ফর্ক চয়েস অ্যালগরিদম চালায় | পুরস্কার/জরিমানা অর্জন করে | +| আগত স্টেট পরিবর্তন যাচাই করে | চেইনের হেডের ট্র্যাক রাখে | প্রত্যয়ন তৈরি করে | +| স্টেট এবং রসিদ ট্রাই পরিচালনা করে | বিকন স্টেট পরিচালনা করে (কনসেন্সাস এবং এক্সিকিউশন তথ্য ধারণ করে) | স্টেক করার জন্য 32 ETH প্রয়োজন | +| এক্সিকিউশন পেলোড তৈরি করে | RANDAO-তে সঞ্চিত র‍্যান্ডমনেসের ট্র্যাক রাখে (একটি অ্যালগরিদম যা ভ্যালিডেটর নির্বাচন এবং অন্যান্য কনসেন্সাস অপারেশনের জন্য যাচাইযোগ্য র‍্যান্ডমনেস সরবরাহ করে) | স্ল্যাশড হতে পারে | +| ইথেরিয়ামের সাথে ইন্টারঅ্যাক্ট করার জন্য JSON-RPC API প্রকাশ করে | জাস্টিফিকেশন এবং ফাইনালইজেশনের ট্র্যাক রাখে | | + +## আরও পড়ুন {#further-reading} + +- [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos) +- [ব্লক প্রস্তাবনা](/developers/docs/consensus-mechanisms/pos/block-proposal) +- [ভ্যালিডেটরের পুরস্কার এবং জরিমানা](/developers/docs/consensus-mechanisms/pos/rewards-and-penalties) diff --git a/public/content/translations/bn/developers/docs/nodes-and-clients/nodes-as-a-service/index.md b/public/content/translations/bn/developers/docs/nodes-and-clients/nodes-as-a-service/index.md new file mode 100644 index 00000000000..3afeea5a1f8 --- /dev/null +++ b/public/content/translations/bn/developers/docs/nodes-and-clients/nodes-as-a-service/index.md @@ -0,0 +1,418 @@ +--- +title: "একটি পরিষেবা হিসাবে নোড" +description: "নোড পরিষেবাগুলির একটি প্রাথমিক-স্তরের সংক্ষিপ্ত বিবরণ, সুবিধা এবং অসুবিধা এবং জনপ্রিয় সরবরাহকারী।" +lang: bn +sidebarDepth: 2 +--- + +## ভূমিকা {#Introduction} + +আপনার নিজের [ইথেরিয়াম নোড](/developers/docs/nodes-and-clients/#what-are-nodes-and-clients) চালানো চ্যালেঞ্জিং হতে পারে, বিশেষ করে যখন শুরু করা হয় বা দ্রুত স্কেলিং করা হয়। এমন [অনেক পরিষেবা](#popular-node-services) রয়েছে যা আপনার জন্য অপ্টিমাইজড নোড পরিকাঠামো চালায়, তাই আপনি পরিবর্তে আপনার অ্যাপ্লিকেশন বা পণ্য বিকাশের দিকে মনোনিবেশ করতে পারেন। নোড পরিষেবাগুলি কীভাবে কাজ করে, সেগুলি ব্যবহারের সুবিধা এবং অসুবিধাগুলি আমরা ব্যাখ্যা করব এবং আপনি যদি শুরু করতে আগ্রহী হন তবে সরবরাহকারীদের তালিকাভুক্ত করব। + +## পূর্বশর্ত {#prerequisites} + +নোড এবং ক্লায়েন্ট কী তা নিয়ে যদি আপনার ইতিমধ্যে কোনো ধারণা না থাকে, তবে [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) দেখুন। + +## স্ট্যাকার {#stakoooooooooooooors} + +সোলো স্ট্যাকারদের তৃতীয় পক্ষের প্রদানকারীদের উপর নির্ভর না করে তাদের নিজস্ব পরিকাঠামো চালাতে হবে। এর অর্থ হল একটি কনসেন্সাস ক্লায়েন্টের সাথে মিলিত একটি এক্সিকিউশন ক্লায়েন্ট চালানো। [দ্য মার্জ](/roadmap/merge) এর আগে, শুধুমাত্র একটি কনসেন্সাস ক্লায়েন্ট চালানো এবং এক্সিকিউশন ডেটার জন্য একটি কেন্দ্রীভূত প্রদানকারী ব্যবহার করা সম্ভব ছিল; এটি আর সম্ভব নয় - একজন সোলো স্ট্যাকারকে অবশ্যই উভয় ক্লায়েন্ট চালাতে হবে। তবে, এই প্রক্রিয়াটি সহজ করার জন্য পরিষেবা উপলব্ধ রয়েছে। + +[একটি নোড চালানোর বিষয়ে আরও পড়ুন](/developers/docs/nodes-and-clients/run-a-node/)। + +এই পৃষ্ঠায় বর্ণিত পরিষেবাগুলি নন-স্টেকিং নোডগুলির জন্য। + +## নোড পরিষেবাগুলি কীভাবে কাজ করে? {#how-do-node-services-work} + +নোড পরিষেবা প্রদানকারীরা আপনার জন্য পর্দার আড়ালে ডিস্ট্রিবিউটেড নোড ক্লায়েন্ট চালায়, তাই আপনাকে এটি করতে হবে না। + +এই পরিষেবাগুলি সাধারণত একটি API কী প্রদান করে যা আপনি ব্লকচেইনে লিখতে এবং থেকে পড়তে ব্যবহার করতে পারেন। তারা প্রায়শই মেইননেট ছাড়াও [ইথেরিয়াম টেস্টনেট](/developers/docs/networks/#ethereum-testnets)-এ অ্যাক্সেস অন্তর্ভুক্ত করে। + +কিছু পরিষেবা আপনাকে আপনার নিজস্ব ডেডিকেটেড নোড অফার করে যা তারা আপনার জন্য পরিচালনা করে, যখন অন্যরা নোড জুড়ে কার্যকলাপ বিতরণ করতে লোড ব্যালেন্সার ব্যবহার করে। + +প্রায় সমস্ত নোড পরিষেবাগুলিকে একীভূত করা অত্যন্ত সহজ, আপনার স্ব-হোস্ট করা নোডকে অদলবদল করার জন্য আপনার কোডে এক লাইনের পরিবর্তন জড়িত, বা এমনকি পরিষেবাগুলির মধ্যে স্যুইচ করাও। + +প্রায়শই নোড পরিষেবাগুলি বিভিন্ন ধরণের [নোড ক্লায়েন্ট](/developers/docs/nodes-and-clients/#execution-clients) এবং [প্রকার](/developers/docs/nodes-and-clients/#node-types) চালাবে, যা আপনাকে একটি API-তে ক্লায়েন্ট নির্দিষ্ট পদ্ধতি ছাড়াও সম্পূর্ণ এবং আর্কাইভ নোড অ্যাক্সেস করার অনুমতি দেবে। + +এটা মনে রাখা গুরুত্বপূর্ণ যে নোড পরিষেবাগুলি আপনার প্রাইভেট কী বা তথ্য সঞ্চয় করে না এবং করা উচিতও নয়। + +## একটি নোড পরিষেবা ব্যবহারের সুবিধা কী কী? {#benefits-of-using-a-node-service} + +একটি নোড পরিষেবা ব্যবহারের প্রধান সুবিধা হল নিজে নোড রক্ষণাবেক্ষণ এবং পরিচালনার জন্য ইঞ্জিনিয়ারিং সময় ব্যয় করতে না হওয়া। এটি আপনাকে পরিকাঠামো রক্ষণাবেক্ষণ নিয়ে চিন্তা না করে আপনার পণ্য তৈরির দিকে মনোনিবেশ করতে দেয়। + +স্টোরেজ থেকে শুরু করে ব্যান্ডউইথ এবং মূল্যবান ইঞ্জিনিয়ারিং সময় পর্যন্ত আপনার নিজের নোড চালানো খুব ব্যয়বহুল হতে পারে। স্কেলিং করার সময় আরও নোড চালু করা, সর্বশেষ সংস্করণে নোড আপগ্রেড করা এবং স্টেট সামঞ্জস্য নিশ্চিত করার মতো জিনিসগুলি আপনার কাঙ্খিত web3 পণ্যে রিসোর্স তৈরি এবং ব্যয় করা থেকে বিভ্রান্ত করতে পারে। + +## একটি নোড পরিষেবা ব্যবহারের অসুবিধাগুলি কী কী? {#cons-of-using-a-node-service} + +একটি নোড পরিষেবা ব্যবহার করে আপনি আপনার পণ্যের পরিকাঠামোগত দিকটিকে কেন্দ্রীভূত করছেন। এই কারণে, যে প্রকল্পগুলি বিকেন্দ্রীকরণকে সর্বোচ্চ গুরুত্ব দেয় তারা তৃতীয় পক্ষের কাছে আউটসোর্স করার পরিবর্তে স্ব-হোস্টিং নোড পছন্দ করতে পারে। + +আপনার নিজের নোড চালানোর [সুবিধা](/developers/docs/nodes-and-clients/#benefits-to-you) সম্পর্কে আরও পড়ুন। + +## জনপ্রিয় নোড পরিষেবা {#popular-node-services} + +এখানে কিছু জনপ্রিয় ইথেরিয়াম নোড প্রদানকারীর একটি তালিকা রয়েছে, যদি কোনোটি অনুপস্থিত থাকে তবে নির্দ্বিধায় যোগ করুন! প্রতিটি নোড পরিষেবা বিনামূল্যে বা অর্থপ্রদানের স্তর ছাড়াও বিভিন্ন সুবিধা এবং বৈশিষ্ট্য অফার করে, সিদ্ধান্ত নেওয়ার আগে আপনার প্রয়োজন অনুসারে কোনটি সবচেয়ে উপযুক্ত তা আপনার অনুসন্ধান করা উচিত। + +- [**Alchemy**](https://alchemy.com/) + - [ডক্স](https://www.alchemy.com/docs/) + - বৈশিষ্ট্য + - প্রতি মাসে 300M কম্পিউট ইউনিট সহ বৃহত্তম বিনামূল্যে স্তর (~30M getLatestBlock অনুরোধ) + - Polygon, Starknet, Optimism, Arbitrum-এর জন্য মাল্টিচেইন সমর্থন + - বৃহত্তম ইথেরিয়াম ডিএ্যাপস এবং DeFi লেনদেন ভলিউমের প্রায় ৭০% শক্তি যোগাচ্ছে + - Alchemy Notify-এর মাধ্যমে রিয়েল-টাইম ওয়েবহুক সতর্কতা + - শ্রেণী-সেরা সমর্থন এবং নির্ভরযোগ্যতা / স্থিতিশীলতা + - Alchemy'র NFT API + - রিকোয়েস্ট এক্সপ্লোরার, মেমপুল ওয়াচার এবং কম্পোজার সহ ড্যাশবোর্ড + - ইন্টিগ্রেটেড টেস্টনেট ফসেট অ্যাক্সেস + - 18 হাজার ব্যবহারকারী সহ সক্রিয় ডিসকর্ড নির্মাতা সম্প্রদায় + +- [**Allnodes**](https://www.allnodes.com/) + - [ডক্স](https://docs.allnodes.com/) + - বৈশিষ্ট্য + - Allnodes পোর্টফোলিও পৃষ্ঠায় তৈরি PublicNode টোকেন সহ কোনো রেট সীমা নেই। + - [PublicNode](https://www.publicnode.com)-এ গোপনীয়তা কেন্দ্রিক বিনামূল্যে rpc এন্ডপয়েন্ট (100+ ব্লকচেইন) + - 90+ ব্লকচেইনের জন্য রেট সীমা ছাড়া ডেডিকেটেড নোড + - 30+ ব্লকচেইনের জন্য ডেডিকেটেড আর্কাইভ নোড + - 3টি অঞ্চলে উপলব্ধ (মার্কিন যুক্তরাষ্ট্র, ইইউ, এশিয়া) + - [PublicNode](https://www.publicnode.com/snapshots)-এ 100+ ব্লকচেইনের জন্য স্ন্যাপশট + - 99.90%-99.98% আপটাইম SLA সহ 24/7 প্রযুক্তিগত সহায়তা (প্ল্যানের উপর নির্ভর করে)। + - ঘন্টা প্রতি অর্থপ্রদান মূল্য + - ক্রেডিট কার্ড, পেপ্যাল বা ক্রিপ্টো দিয়ে অর্থ প্রদান করুন + +- [**All That Node**](https://allthatnode.com/) + - [ডক্স](https://docs.allthatnode.com/) + - বৈশিষ্ট্য + - বিনামূল্যে স্তর সহ প্রতিদিন 50,000 অনুরোধ + - 40 টিরও বেশি প্রোটোকলের জন্য সমর্থন + - JSON-RPC (EVM, Tendermint), REST, এবং Websocket API সমর্থিত + - আর্কাইভ ডেটাতে সীমাহীন অ্যাক্সেস + - 24/7 প্রযুক্তিগত সহায়তা এবং 99.9% এর বেশি আপটাইম + - একাধিক চেইনে ফসেট উপলব্ধ + - সীমাহীন সংখ্যক API কী সহ সীমাহীন এন্ডপয়েন্ট অ্যাক্সেস + - ট্রেস/ডিবাগ API সমর্থিত + - স্বয়ংক্রিয় আপডেট + +- [**Amazon Managed Blockchain**](https://aws.amazon.com/managed-blockchain/) + - [ডক্স](https://aws.amazon.com/managed-blockchain/resources/) + - বৈশিষ্ট্য + - সম্পূর্ণরূপে পরিচালিত ইথেরিয়াম নোড + - ছয়টি অঞ্চলে উপলব্ধ + - HTTP এবং নিরাপদ ওয়েবসকেটের উপর JSON-RPC + - 3টি চেইন সমর্থন করে + - SLA, AWS সহায়তা 24/7 + - Go-ethereum এবং Lighthouse + +- [**Ankr**](https://www.ankr.com/) + - [ডক্স](https://docs.ankr.com/) + - বৈশিষ্ট্য + - Ankr প্রোটোকল - 8+ চেইনের জন্য পাবলিক RPC API এন্ডপয়েন্টগুলিতে খোলা অ্যাক্সেস + - নিকটতম উপলব্ধ নোডে একটি দ্রুত এবং নির্ভরযোগ্য গেটওয়ের জন্য লোড ব্যালেন্সিং এবং নোড স্বাস্থ্য পর্যবেক্ষণ + - WSS এন্ডপয়েন্ট এবং আনক্যাপড রেট সীমা সক্ষমকারী প্রিমিয়াম স্তর + - 40+ চেইনের জন্য এক-ক্লিকে সম্পূর্ণ নোড এবং ভ্যালিডেটর নোড স্থাপন + - প্রয়োজন অনুযায়ী স্কেল করুন + - বিশ্লেষণ টুলস + - ড্যাশবোর্ড + - RPC, HTTPS এবং WSS এন্ডপয়েন্ট + - সরাসরি সহায়তা + +- [**Blast**](https://blastapi.io/) + - [ডক্স](https://docs.blastapi.io/) + - বৈশিষ্ট্য + - RPC এবং WSS সমর্থন + - মাল্টি-রিজিওন নোড হোস্টিং + - বিকেন্দ্রীভূত পরিকাঠামো + - পাবলিক API + - ডেডিকেটেড ফ্রি প্ল্যান + - মাল্টিচেইন সমর্থন (17+ ব্লকচেইন) + - আর্কাইভ নোড + - 24/7 ডিসকর্ড সহায়তা + - 24/7 পর্যবেক্ষণ এবং সতর্কতা + - 99.9% এর একটি সামগ্রিক SLA + - ক্রিপ্টোতে অর্থপ্রদান করুন + +- [**BlockDaemon**](https://blockdaemon.com/) + - [ডক্স](https://ubiquity.docs.blockdaemon.com/) + - সুবিধাসমূহ + - ড্যাশবোর্ড + - নোড প্রতি ভিত্তি + - বিশ্লেষণ + +- [**BlockPI**](https://blockpi.io/) + - [ডক্স](https://docs.blockpi.io/) + - বৈশিষ্ট্য + - শক্তিশালী এবং ডিস্ট্রিবিউটেড নোড কাঠামো + - 40টি পর্যন্ত HTTPS এবং WSS এন্ডপয়েন্ট + - বিনামূল্যে সাইনআপ প্যাকেজ এবং মাসিক প্যাকেজ + - ট্রেস পদ্ধতি + আর্কাইভ ডেটা সমর্থন + - 90 দিন পর্যন্ত বৈধতার প্যাকেজ + - কাস্টম প্ল্যান এবং ব্যবহারের ভিত্তিতে অর্থপ্রদান + - ক্রিপ্টোতে অর্থপ্রদান করুন + - সরাসরি সহায়তা এবং প্রযুক্তিগত সহায়তা + +- [**Chainbase**](https://www.chainbase.com/) + - [ডক্স](https://docs.chainbase.com) + - বৈশিষ্ট্য + - অত্যন্ত উপলব্ধ, দ্রুত এবং স্কেলযোগ্য RPC পরিষেবা + - মাল্টি-চেইন সমর্থন + - বিনামূল্যে ট্যারিফ + - ব্যবহারকারী-বান্ধব ড্যাশবোর্ড + - RPC এর বাইরে ব্লকচেইন ডেটা পরিষেবা প্রদান করে + +- [**Chainstack**](https://chainstack.com/) + - [ডক্স](https://docs.chainstack.com/) + - বৈশিষ্ট্য + - বিনামূল্যে শেয়ার্ড নোড + - শেয়ার্ড আর্কাইভ নোড + - GraphQL সমর্থন + - RPC এবং WSS এন্ডপয়েন্ট + - ডেডিকেটেড সম্পূর্ণ এবং আর্কাইভ নোড + - ডেডিকেটেড স্থাপনার জন্য দ্রুত সিঙ্ক সময় + - আপনার ক্লাউড আনুন + - ঘন্টা প্রতি অর্থপ্রদান মূল্য + - সরাসরি 24/7 সহায়তা + +- [**dRPC**](https://drpc.org/) + - [ডক্স](https://drpc.org/docs) + - NodeCloud: প্লাগ-এন-প্লে RPC ইনফ্রা $10 (USD) থেকে শুরু—সম্পূর্ণ গতি, কোনো সীমা নেই + - NodeCloud বৈশিষ্ট্য: + - 185টি নেটওয়ার্কের জন্য API সমর্থন + - 40+ প্রদানকারীর ডিস্ট্রিবিউটেড পুল + - নয়টি (9) জিও-ক্লাস্টার সহ বিশ্বব্যাপী কভারেজ + - AI-চালিত লোড ব্যালেন্সিং সিস্টেম + - পে-অ্যাজ-ইউ-গো ফ্ল্যাট প্রাইসিং—কোনো বৃদ্ধি নেই, মেয়াদ শেষ নেই, কোনো লক-ইন নেই + - সীমাহীন কী, গ্র্যানুলার কী টুইকস, দলের ভূমিকা, ফ্রন্ট-এন্ড সুরক্ষা + - প্রতি পদ্ধতিতে 20 কম্পিউট ইউনিট (সিইউ) এ ফ্ল্যাট রেট + - [পাবলিক এন্ডপয়েন্ট চেইনলিস্ট](https://drpc.org/chainlist) + - [মূল্য ক্যালকুলেটর](https://drpc.org/pricing#calculator) + - NodeCore: সম্পূর্ণ নিয়ন্ত্রণ চাওয়া সংস্থাগুলির জন্য ওপেন-সোর্স স্ট্যাক + +- [**GetBlock**](https://getblock.io/) + - [ডক্স](https://getblock.io/docs/get-started/authentication-with-api-key/) + - বৈশিষ্ট্য + - 40+ ব্লকচেইন নোডগুলিতে অ্যাক্সেস + - 40হাজার বিনামূল্যে দৈনিক অনুরোধ + - সীমাহীন সংখ্যক API কী + - 1GB/সেকেন্ডে উচ্চ সংযোগ গতি + - ট্রেস+আর্কাইভ + - উন্নত বিশ্লেষণ + - স্বয়ংক্রিয় আপডেট + - প্রযুক্তিগত সহায়তা + +- [**InfStones**](https://infstones.com/) + - বৈশিষ্ট্য + - বিনামূল্যে স্তর বিকল্প + - প্রয়োজন অনুযায়ী স্কেল করুন + - বিশ্লেষণ + - ড্যাশবোর্ড + - অনন্য API এন্ডপয়েন্ট + - ডেডিকেটেড সম্পূর্ণ নোড + - ডেডিকেটেড স্থাপনার জন্য দ্রুত সিঙ্ক সময় + - সরাসরি 24/7 সহায়তা + - 50+ ব্লকচেইন নোডগুলিতে অ্যাক্সেস + +- [**Infura**](https://infura.io/) + - [ডক্স](https://infura.io/docs) + - বৈশিষ্ট্য + - বিনামূল্যে স্তর বিকল্প + - প্রয়োজন অনুযায়ী স্কেল করুন + - অর্থপ্রদত্ত আর্কাইভাল ডেটা + - সরাসরি সহায়তা + - ড্যাশবোর্ড + +- [**Kaleido**](https://kaleido.io/) + - [ডক্স](https://docs.kaleido.io/) + - বৈশিষ্ট্য + - বিনামূল্যে স্টার্টার স্তর + - এক-ক্লিকে ইথেরিয়াম নোড স্থাপন + - কাস্টমাইজযোগ্য ক্লায়েন্ট এবং অ্যালগরিদম (Geth, Quorum এবং Besu || PoA, IBFT এবং Raft) + - 500+ প্রশাসনিক এবং পরিষেবা API + - ইথেরিয়াম লেনদেন জমা দেওয়ার জন্য রেস্টফুল ইন্টারফেস (Apache Kafka সমর্থিত) + - ইভেন্ট বিতরণের জন্য আউটবাউন্ড স্ট্রিম (Apache Kafka সমর্থিত) + - "অফচেইন" এবং আনুষঙ্গিক পরিষেবাগুলির গভীর সংগ্রহ (যেমন, দ্বিপাক্ষিক এনক্রিপ্ট করা মেসেজিং পরিবহন) + - গভর্নেন্স এবং ভূমিকা-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ সহ সহজবোধ্য নেটওয়ার্ক অনবোর্ডিং + - প্রশাসক এবং শেষ ব্যবহারকারী উভয়ের জন্য পরিশীলিত ব্যবহারকারী ব্যবস্থাপনা + - অত্যন্ত স্কেলযোগ্য, স্থিতিস্থাপক, এন্টারপ্রাইজ-গ্রেড পরিকাঠামো + - ক্লাউড HSM প্রাইভেট কী ব্যবস্থাপনা + - ইথেরিয়াম মেইননেট টিথারিং + - ISO 27k এবং SOC 2, টাইপ 2 সার্টিফিকেশন + - ডাইনামিক রানটাইম কনফিগারেশন (যেমন, ক্লাউড ইন্টিগ্রেশন যোগ করা, নোড ইনগ্রেস পরিবর্তন করা, ইত্যাদি) + - মাল্টি-ক্লাউড, মাল্টি-রিজিওন এবং হাইব্রিড ডেপ্লয়মেন্ট অর্কেস্ট্রেশনের জন্য সমর্থন + - সাধারণ ঘন্টায় SaaS-ভিত্তিক মূল্য নির্ধারণ + - SLA এবং 24x7 সহায়তা + +- [**Lava Network**](https://www.lavanet.xyz/) + - [ডক্স](https://docs.lavanet.xyz/) + - বৈশিষ্ট্য + - বিনামূল্যে টেস্টনেট ব্যবহার + - উচ্চ আপটাইমের জন্য বিকেন্দ্রীভূত রিডানডেন্সি + - ওপেন-সোর্স + - সম্পূর্ণ বিকেন্দ্রীভূত SDK + - Ethers.js ইন্টিগ্রেশন + - স্বজ্ঞাত প্রকল্প ব্যবস্থাপনা ইন্টারফেস + - কনসেন্সাস-ভিত্তিক ডেটা অখণ্ডতা + - মাল্টি-চেইন সমর্থন + +- [**Moralis**](https://moralis.io/) + - [ডক্স](https://docs.moralis.io/) + - বৈশিষ্ট্য + - বিনামূল্যে শেয়ার্ড নোড + - বিনামূল্যে শেয়ার্ড আর্কাইভ নোড + - গোপনীয়তা কেন্দ্রিক (নো লগ নীতি) + - ক্রস চেইন সমর্থন + - প্রয়োজন অনুযায়ী স্কেল করুন + - ড্যাশবোর্ড + - অনন্য ইথেরিয়াম SDK + - অনন্য API এন্ডপয়েন্ট + - সরাসরি, প্রযুক্তিগত সহায়তা + +- [**NodeReal MegaNode**](https://nodereal.io/) + - [ডক্স](https://docs.nodereal.io/docs/introduction) + - বৈশিষ্ট্য + - নির্ভরযোগ্য, দ্রুত এবং স্কেলযোগ্য RPC API পরিষেবা + - web3 ডেভেলপারদের জন্য উন্নত API + - মাল্টি-চেইন সমর্থন + - বিনামূল্যে শুরু করুন + +- [**NOWNodes**](https://nownodes.io/) + - [ডক্স](https://documenter.getpostman.com/view/13630829/TVmFkLwy) + - বৈশিষ্ট্য + - 50+ ব্লকচেইন নোডগুলিতে অ্যাক্সেস + - বিনামূল্যে API কী + - ব্লক এক্সপ্লোরার + - API প্রতিক্রিয়া সময় ⩽ 1 সেকেন্ড + - 24/7 সহায়তা দল + - ব্যক্তিগত অ্যাকাউন্ট ম্যানেজার + - শেয়ার্ড, আর্কাইভ, ব্যাকআপ এবং ডেডিকেটেড নোড + +- [**Pocket Network**](https://www.pokt.network/) + - [ডক্স](https://docs.pokt.network/home/) + - বৈশিষ্ট্য + - বিকেন্দ্রীভূত RPC প্রোটোকল এবং মার্কেটপ্লেস + - প্রতিদিন 1M অনুরোধ বিনামূল্যে স্তর (প্রতি এন্ডপয়েন্টে, সর্বোচ্চ 2) + - [পাবলিক এন্ডপয়েন্ট](https://docs.pokt.network/developers/public-endpoints) + - প্রি-স্টেক+ প্রোগ্রাম (যদি আপনার প্রতিদিন 1M এর বেশি অনুরোধের প্রয়োজন হয়) + - 15+ ব্লকচেইন সমর্থিত + - 6400+ নোড অ্যাপ্লিকেশন পরিবেশন করার জন্য POKT আয় করছে + - আর্কাইভাল নোড, ট্রেসিং সহ আর্কাইভাল নোড, এবং টেস্টনেট নোড সমর্থন + - ইথেরিয়াম মেইননেট নোড ক্লায়েন্ট বৈচিত্র্য + - ব্যর্থতার কোনো একক পয়েন্ট নেই + - জিরো ডাউনটাইম + - সাশ্রয়ী নিকট-শূন্য টোকেনমিক্স (নেটওয়ার্ক ব্যান্ডউইথের জন্য একবার POKT স্টেক করুন) + - কোনো মাসিক খরচ নেই, আপনার পরিকাঠামোকে একটি সম্পদে পরিণত করুন + - প্রোটোকলের মধ্যে লোড-ব্যালেন্সিং অন্তর্নির্মিত + - প্রয়োজন অনুসারে প্রতিদিনের অনুরোধ এবং প্রতি ঘন্টায় নোডের সংখ্যা অসীমভাবে স্কেল করুন + - সবচেয়ে ব্যক্তিগত, সেন্সরশিপ-প্রতিরোধী বিকল্প + - হ্যান্ডস-অন ডেভেলপার সহায়তা + - [Pocket Portal](https://bit.ly/ETHorg_POKTportal) ড্যাশবোর্ড এবং বিশ্লেষণ + +- [**QuickNode**](https://www.quicknode.com) + - [ডক্স](https://www.quicknode.com/docs/) + - বৈশিষ্ট্য + - 24/7 প্রযুক্তিগত সহায়তা এবং ডেভ ডিসকর্ড সম্প্রদায় + - জিও-ব্যালেন্সড, মাল্টি ক্লাউড/মেটাল, লো-লেটেন্সি নেটওয়ার্ক + - মাল্টিচেইন সমর্থন (Optimism, Arbitrum, Polygon + 11 অন্যান্য) + - গতি এবং স্থিতিশীলতার জন্য মিডল-লেয়ার (কল রাউটিং, ক্যাশে, ইনডেক্সিং) + - ওয়েবহুকসের মাধ্যমে স্মার্ট-কন্ট্রাক্ট মনিটরিং + - স্বজ্ঞাত ড্যাশবোর্ড, বিশ্লেষণ স্যুট, RPC কম্পোজার + - উন্নত নিরাপত্তা বৈশিষ্ট্য (JWT, মাস্কিং, হোয়াইটলিস্টিং) + - NFT ডেটা এবং বিশ্লেষণ API + - [SOC2 সার্টিফাইড](https://www.quicknode.com/security) + - ডেভেলপারদের থেকে এন্টারপ্রাইজের জন্য উপযুক্ত + +- [**Rivet**](https://rivet.cloud/) + - [ডক্স](https://rivet.readthedocs.io/en/latest/) + - বৈশিষ্ট্য + - বিনামূল্যে স্তর বিকল্প + - প্রয়োজন অনুযায়ী স্কেল করুন + +- [**SenseiNode**](https://senseinode.com) + - [ডক্স](https://docs.senseinode.com/) + - বৈশিষ্ট্য + - ডেডিকেটেড এবং শেয়ার্ড নোড + - ড্যাশবোর্ড + - ল্যাটিন আমেরিকার বিভিন্ন স্থানে একাধিক হোস্টিং প্রদানকারীর উপর AWS থেকে হোস্টিং করা + - Prysm এবং Lighthouse ক্লায়েন্ট + +- [**SettleMint**](https://console.settlemint.com/) + - [ডক্স](https://docs.settlemint.com/) + - বৈশিষ্ট্য + - বিনামূল্যে ট্রায়াল + - প্রয়োজন অনুযায়ী স্কেল করুন + - GraphQL সমর্থন + - RPC এবং WSS এন্ডপয়েন্ট + - ডেডিকেটেড সম্পূর্ণ নোড + - আপনার ক্লাউড আনুন + - বিশ্লেষণ টুলস + - ড্যাশবোর্ড + - ঘন্টা প্রতি অর্থপ্রদান মূল্য + - সরাসরি সহায়তা + +- [**Tenderly**](https://tenderly.co/web3-gateway) + - [ডক্স](https://docs.tenderly.co/web3-gateway/web3-gateway) + - বৈশিষ্ট্য + - বিনামূল্যে স্তর, প্রতি মাসে 25 মিলিয়ন Tenderly ইউনিট সহ + - ঐতিহাসিক ডেটাতে বিনামূল্যে অ্যাক্সেস + - 8x পর্যন্ত দ্রুত রিড-হেভি ওয়ার্কলোড + - 100% সামঞ্জস্যপূর্ণ রিড অ্যাক্সেস + - JSON-RPC এন্ডপয়েন্ট + - UI-ভিত্তিক RPC রিকোয়েস্ট বিল্ডার এবং রিকোয়েস্ট প্রিভিউ + - Tenderly-এর ডেভেলপমেন্ট, ডিবাগিং এবং টেস্টিং টুলসের সাথে শক্তভাবে সমন্বিত + - লেনদেন সিমুলেশন + - ব্যবহারের বিশ্লেষণ এবং ফিল্টারিং + - সহজ অ্যাক্সেস কী ব্যবস্থাপনা + - চ্যাট, ইমেল এবং ডিসকর্ডের মাধ্যমে ডেডিকেটেড ইঞ্জিনিয়ারিং সহায়তা + +- [**Tokenview**](https://services.tokenview.io/) + - [ডক্স](https://services.tokenview.io/docs?type=nodeService) + - বৈশিষ্ট্য + - 24/7 প্রযুক্তিগত সহায়তা এবং ডেভ টেলিগ্রাম সম্প্রদায় + - মাল্টিচেইন সমর্থন (Bitcoin, Ethereum, Tron, BNB Smart Chain, Ethereum Classic) + - RPC এবং WSS উভয় এন্ডপয়েন্টই ব্যবহারের জন্য খোলা + - আর্কাইভ ডেটা API-তে সীমাহীন অ্যাক্সেস + - রিকোয়েস্ট এক্সপ্লোরার এবং মেমপুল ওয়াচার সহ ড্যাশবোর্ড + - NFT ডেটা API এবং ওয়েবহুক নোটিফাই + - ক্রিপ্টোতে অর্থপ্রদান করুন + - অতিরিক্ত আচরণের প্রয়োজনীয়তার জন্য বাহ্যিক সমর্থন + +- [**Watchdata**](https://watchdata.io/) + - [ডক্স](https://docs.watchdata.io/) + - বৈশিষ্ট্য + - ডেটা নির্ভরযোগ্যতা + - কোনো ডাউনটাইম ছাড়াই নিরবচ্ছিন্ন সংযোগ + - প্রসেস অটোমেশন + - বিনামূল্যে ট্যারিফ + - উচ্চ সীমা যা যেকোনো ব্যবহারকারীর জন্য উপযুক্ত + - বিভিন্ন নোডের জন্য সমর্থন + - রিসোর্স স্কেলিং + - উচ্চ প্রক্রিয়াকরণ গতি + +- [**ZMOK**](https://zmok.io/) + - [ডক্স](https://docs.zmok.io/) + - বৈশিষ্ট্য + - একটি পরিষেবা হিসাবে ফ্রন্ট-রানিং + - অনুসন্ধান/ফিল্টারিং পদ্ধতি সহ বিশ্বব্যাপী লেনদেন মেমপুল + - লেনদেন পাঠানোর জন্য সীমাহীন TX ফি এবং অসীম গ্যাস + - নতুন ব্লকের দ্রুততম প্রাপ্তি এবং ব্লকচেইন পড়া + - প্রতি API কলে সেরা মূল্যের গ্যারান্টি + +- [**Zeeve**](https://www.zeeve.io/) + - [ডক্স](https://www.zeeve.io/docs/) + - বৈশিষ্ট্য + - এন্টারপ্রাইজ-গ্রেড নো-কোড অটোমেশন প্ল্যাটফর্ম যা ব্লকচেইন নোড এবং নেটওয়ার্কগুলির স্থাপন, পর্যবেক্ষণ এবং ব্যবস্থাপনা প্রদান করে + - 30+ সমর্থিত প্রোটোকল এবং ইন্টিগ্রেশন, এবং আরও যোগ করা হচ্ছে + - বাস্তব-বিশ্ব ব্যবহারের ক্ষেত্রে বিকেন্দ্রীভূত স্টোরেজ, বিকেন্দ্রীভূত পরিচয় এবং ব্লকচেইন লেজার ডেটা API-এর মতো মূল্য সংযোজিত web3 পরিকাঠামো পরিষেবা + - 24/7 সহায়তা এবং সক্রিয় পর্যবেক্ষণ সর্বদা নোডগুলির স্বাস্থ্য নিশ্চিত করে। + - RPC এন্ডপয়েন্টগুলি API-তে প্রমাণীকৃত অ্যাক্সেস, স্বজ্ঞাত ড্যাশবোর্ড এবং বিশ্লেষণ সহ ঝামেলা-মুক্ত ব্যবস্থাপনা অফার করে। + - পরিচালিত ক্লাউড এবং আপনার নিজস্ব ক্লাউড উভয় বিকল্পই প্রদান করে এবং AWS, Azure, Google Cloud, Digital Ocean এবং অন-প্রেমিসের মতো সমস্ত প্রধান ক্লাউড প্রদানকারীকে সমর্থন করে। + - আমরা প্রতিবার আপনার ব্যবহারকারীর নিকটতম নোডে পৌঁছানোর জন্য বুদ্ধিমান রাউটিং ব্যবহার করি + +## আরও পড়ুন {#further-reading} + +- [ইথেরিয়াম নোড পরিষেবাগুলির তালিকা](https://ethereumnodes.com/) + +## সম্পর্কিত বিষয় {#related-topics} + +- [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [Alchemy ব্যবহার করে ইথেরিয়াম ডেভেলপমেন্ট শুরু করা](/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/) +- [web3 এবং Alchemy ব্যবহার করে লেনদেন পাঠানোর নির্দেশিকা](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) diff --git a/public/content/translations/bn/developers/docs/nodes-and-clients/run-a-node/index.md b/public/content/translations/bn/developers/docs/nodes-and-clients/run-a-node/index.md new file mode 100644 index 00000000000..6fe3c543509 --- /dev/null +++ b/public/content/translations/bn/developers/docs/nodes-and-clients/run-a-node/index.md @@ -0,0 +1,484 @@ +--- +title: "আপনার নিজের ইথেরিয়াম নোড স্পিন আপ করুন" +description: "একটি ইথেরিয়াম ক্লায়েন্টের নিজস্ব ইনস্ট্যান্স চালানোর জন্য একটি সাধারণ ভূমিকা।" +lang: bn +sidebarDepth: 2 +--- + +আপনার নিজের নোড চালানো আপনাকে বিভিন্ন সুবিধা প্রদান করে, নতুন সম্ভাবনার দ্বার উন্মোচন করে, এবং ইকোসিস্টেমকে সমর্থন করতে সাহায্য করে। এই পৃষ্ঠাটি আপনাকে আপনার নিজের নোড স্পিন আপ করার এবং ইথেরিয়াম লেনদেন যাচাই করার ক্ষেত্রে অংশ নিতে গাইড করবে। + +মনে রাখবেন যে [দ্য মার্জ](/roadmap/merge)-এর পরে, একটি ইথেরিয়াম নোড চালানোর জন্য দুটি ক্লায়েন্ট প্রয়োজন; একটি **এক্সিকিউশন লেয়ার (EL)** ক্লায়েন্ট এবং একটি **কনসেন্সাস লেয়ার (CL)** ক্লায়েন্ট। এই পৃষ্ঠাটি দেখাবে কিভাবে একটি ইথেরিয়াম নোড চালানোর জন্য এই দুটি ক্লায়েন্ট ইনস্টল, কনফিগার এবং সংযোগ করতে হয়। + +## পূর্বশর্ত {#prerequisites} + +একটি ইথেরিয়াম নোড কী এবং কেন আপনি একটি ক্লায়েন্ট চালাতে চাইতে পারেন তা আপনার বোঝা উচিত। এটি [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/)-এ আলোচনা করা হয়েছে। + +আপনি যদি একটি নোড চালানোর বিষয়ে নতুন হন, অথবা একটি কম প্রযুক্তিগত পথের সন্ধান করছেন, আমরা প্রথমে [একটি ইথেরিয়াম নোড চালানো](/run-a-node)-এর উপর আমাদের ব্যবহারকারী-বান্ধব ভূমিকাটি দেখার সুপারিশ করি। + +## একটি পদ্ধতি বেছে নেওয়া {#choosing-approach} + +আপনার নোড স্পিন আপ করার প্রথম ধাপ হল আপনার পদ্ধতি বেছে নেওয়া। প্রয়োজনীয়তা এবং বিভিন্ন সম্ভাবনার উপর ভিত্তি করে, আপনাকে অবশ্যই ক্লায়েন্ট ইমপ্লিমেন্টেশন (এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্ট উভয়ই), পরিবেশ (হার্ডওয়্যার, সিস্টেম) এবং ক্লায়েন্ট সেটিংসের জন্য প্যারামিটার নির্বাচন করতে হবে। + +এই পৃষ্ঠাটি আপনাকে এই সিদ্ধান্তগুলির মাধ্যমে গাইড করবে এবং আপনার ইথেরিয়াম ইনস্ট্যান্স চালানোর জন্য সবচেয়ে উপযুক্ত উপায় খুঁজে পেতে সাহায্য করবে। + +ক্লায়েন্ট ইমপ্লিমেন্টেশন থেকে বেছে নিতে, সমস্ত উপলব্ধ মেইননেট প্রস্তুত [এক্সিকিউশন ক্লায়েন্ট](/developers/docs/nodes-and-clients/#execution-clients), [কনসেন্সাস ক্লায়েন্ট](/developers/docs/nodes-and-clients/#consensus-clients) দেখুন এবং [ক্লায়েন্ট ডাইভারসিটি](/developers/docs/nodes-and-clients/client-diversity) সম্পর্কে জানুন। + +ক্লায়েন্টদের [প্রয়োজনীয়তা](#requirements) বিবেচনা করে, সফটওয়্যারটি আপনার নিজের [হার্ডওয়্যারে নাকি ক্লাউডে](#local-vs-cloud) চালাবেন কিনা তা স্থির করুন। + +পরিবেশ প্রস্তুত করার পরে, নির্বাচিত ক্লায়েন্টগুলি হয় [শিক্ষানবিস-বান্ধব ইন্টারফেস](#automatized-setup) দিয়ে অথবা উন্নত বিকল্প সহ একটি টার্মিনাল ব্যবহার করে [ম্যানুয়ালি](#manual-setup) ইনস্টল করুন। + +যখন নোডটি চলছে এবং সিঙ্ক হচ্ছে, তখন আপনি এটি [ব্যবহার করার](#using-the-node) জন্য প্রস্তুত, কিন্তু এর [রক্ষণাবেক্ষণের](#operating-the-node) দিকে নজর রাখতে ভুলবেন না। + +![ক্লায়েন্ট সেটআপ](./diagram.png) + +### পরিবেশ এবং হার্ডওয়্যার {#environment-and-hardware} + +#### স্থানীয় বা ক্লাউড {#local-vs-cloud} + +ইথেরিয়াম ক্লায়েন্টগুলি সাধারণ মানের কম্পিউটারে চলতে পারে এবং এর জন্য কোনো বিশেষ হার্ডওয়্যারের প্রয়োজন হয় না, যেমন উদাহরণস্বরূপ মাইনিং মেশিন। অতএব, আপনার প্রয়োজনের উপর ভিত্তি করে নোড স্থাপন করার জন্য আপনার কাছে বিভিন্ন বিকল্প রয়েছে। +সহজ করার জন্য, আসুন একটি স্থানীয় ফিজিক্যাল মেশিন এবং একটি ক্লাউড সার্ভার উভয় ক্ষেত্রেই একটি নোড চালানোর কথা ভাবি: + +- ক্লাউড + - প্রদানকারীরা উচ্চ সার্ভার আপটাইম এবং স্ট্যাটিক পাবলিক আইপি ঠিকানা অফার করে + - নিজের তৈরির চেয়ে একটি ডেডিকেটেড বা ভার্চুয়াল সার্ভার পাওয়া বেশি আরামদায়ক হতে পারে + - বোঝাপড়াটি হল একটি তৃতীয় পক্ষকে - সার্ভার প্রদানকারীকে বিশ্বাস করা + - সম্পূর্ণ নোডের জন্য প্রয়োজনীয় স্টোরেজ আকারের কারণে, একটি ভাড়া করা সার্ভারের দাম বেশি হতে পারে +- নিজস্ব হার্ডওয়্যার + - আরও বিশ্বাসহীন এবং সার্বভৌম পদ্ধতি + - এককালীন বিনিয়োগ + - পূর্ব-কনফিগার করা মেশিন কেনার একটি বিকল্প + - আপনাকে শারীরিকভাবে মেশিন এবং নেটওয়ার্কিং প্রস্তুত করতে, রক্ষণাবেক্ষণ করতে এবং সম্ভাব্যভাবে সমস্যা সমাধান করতে হবে + +উভয় বিকল্পেরই বিভিন্ন সুবিধা রয়েছে যা উপরে সংক্ষিপ্ত করা হয়েছে। আপনি যদি একটি ক্লাউড সমাধান খুঁজছেন, তাহলে অনেক ঐতিহ্যবাহী ক্লাউড কম্পিউটিং প্রদানকারী ছাড়াও, নোড স্থাপনের উপর কেন্দ্র করে এমন পরিষেবাও রয়েছে। হোস্ট করা নোডগুলির আরও বিকল্পের জন্য [পরিষেবা হিসাবে নোড](/developers/docs/nodes-and-clients/nodes-as-a-service/) দেখুন। + +#### হার্ডওয়্যার {#hardware} + +তবে, একটি সেন্সরশিপ-প্রতিরোধী, বিকেন্দ্রীভূত নেটওয়ার্কের ক্লাউড প্রদানকারীদের উপর নির্ভর করা উচিত নয়। পরিবর্তে, আপনার নিজের স্থানীয় হার্ডওয়্যারে আপনার নোড চালানো ইকোসিস্টেমের জন্য স্বাস্থ্যকর। [অনুমান](https://www.ethernodes.org/networkType/cl/Hosting) দেখায় যে নোডগুলির একটি বড় অংশ ক্লাউডে চলে, যা ব্যর্থতার একটি একক বিন্দু হয়ে উঠতে পারে। + +ইথেরিয়াম ক্লায়েন্ট আপনার কম্পিউটার, ল্যাপটপ, সার্ভার বা এমনকি একটি একক-বোর্ড কম্পিউটারেও চলতে পারে। যদিও আপনার ব্যক্তিগত কম্পিউটারে ক্লায়েন্ট চালানো সম্ভব, শুধুমাত্র আপনার নোডের জন্য একটি ডেডিকেটেড মেশিন থাকা এর কর্মক্ষমতা এবং নিরাপত্তা উল্লেখযোগ্যভাবে বাড়াতে পারে এবং আপনার প্রাথমিক কম্পিউটারের উপর প্রভাব কমিয়ে আনতে পারে। + +আপনার নিজের হার্ডওয়্যার ব্যবহার করা খুব সহজ হতে পারে। আরও প্রযুক্তিগত ব্যক্তিদের জন্য অনেক সহজ বিকল্পের পাশাপাশি উন্নত সেটআপও রয়েছে। তাহলে আসুন আপনার মেশিনে ইথেরিয়াম ক্লায়েন্ট চালানোর জন্য প্রয়োজনীয়তা এবং উপায়গুলো দেখে নেওয়া যাক। + +#### প্রয়োজনীয়তা {#requirements} + +হার্ডওয়্যারের প্রয়োজনীয়তা ক্লায়েন্ট ভেদে ভিন্ন হয় কিন্তু সাধারণত ততটা বেশি হয় না, কারণ নোডটিকে শুধু সিঙ্কড থাকতে হয়। এটিকে মাইনিংয়ের সাথে গুলিয়ে ফেলবেন না, যার জন্য অনেক বেশি কম্পিউটিং পাওয়ার প্রয়োজন। তবে, আরও শক্তিশালী হার্ডওয়্যারের সাথে সিঙ্কের সময় এবং কর্মক্ষমতা উন্নত হয়। + +কোনো ক্লায়েন্ট ইনস্টল করার আগে, অনুগ্রহ করে নিশ্চিত করুন যে আপনার কম্পিউটারে এটি চালানোর জন্য পর্যাপ্ত রিসোর্স আছে। আপনি নিচে ন্যূনতম এবং প্রস্তাবিত প্রয়োজনীয়তাগুলি খুঁজে পেতে পারেন। + +আপনার হার্ডওয়্যারের জন্য প্রধান বাধা হল বেশিরভাগ ক্ষেত্রে ডিস্কের স্থান। ইথেরিয়াম ব্লকচেইন সিঙ্ক করা খুব ইনপুট/আউটপুট নিবিড় এবং এর জন্য অনেক জায়গার প্রয়োজন হয়। সিঙ্ক্রোনাইজেশনের পরেও শত শত GB খালি জায়গা সহ একটি **সলিড-স্টেট ড্রাইভ (SSD)** থাকা সবচেয়ে ভালো। + +ডেটাবেসের আকার এবং প্রাথমিক সিঙ্ক্রোনাইজেশনের গতি নির্বাচিত ক্লায়েন্ট, এর কনফিগারেশন এবং [সিঙ্ক স্ট্র্যাটেজির](/developers/docs/nodes-and-clients/#sync-modes) উপর নির্ভর করে। + +এছাড়াও নিশ্চিত করুন যে আপনার ইন্টারনেট সংযোগ একটি [ব্যান্ডউইথ ক্যাপ](https://wikipedia.org/wiki/Data_cap) দ্বারা সীমাবদ্ধ নয়। একটি আনমিটারড সংযোগ ব্যবহার করার সুপারিশ করা হয় কারণ প্রাথমিক সিঙ্ক এবং নেটওয়ার্কে সম্প্রচারিত ডেটা আপনার সীমা অতিক্রম করতে পারে। + +##### অপারেটিং সিস্টেম + +সমস্ত ক্লায়েন্ট প্রধান অপারেটিং সিস্টেমগুলিকে সমর্থন করে - Linux, MacOS, Windows। এর মানে হল আপনি আপনার জন্য সবচেয়ে উপযুক্ত অপারেটিং সিস্টেম (OS) দিয়ে নিয়মিত ডেস্কটপ বা সার্ভার মেশিনে নোড চালাতে পারেন। সম্ভাব্য সমস্যা এবং নিরাপত্তা দুর্বলতা এড়াতে নিশ্চিত করুন যে আপনার OS আপ টু ডেট আছে। + +##### ন্যূনতম প্রয়োজনীয়তা + +- ২+ কোর সহ CPU +- ৮ GB RAM +- ২TB SSD +- ১০+ MBit/s ব্যান্ডউইথ + +##### প্রস্তাবিত স্পেসিফিকেশন + +- ৪+ কোর সহ দ্রুত CPU +- ১৬ GB+ RAM +- ২+TB সহ দ্রুত SSD +- ২৫+ MBit/s ব্যান্ডউইথ + +আপনার বেছে নেওয়া সিঙ্ক মোড এবং ক্লায়েন্ট স্থানের প্রয়োজনীয়তাকে প্রভাবিত করবে, তবে আমরা নিচে প্রতিটি ক্লায়েন্টের জন্য আপনার প্রয়োজনীয় ডিস্কের স্থান অনুমান করেছি। + +| ক্লায়েন্ট | ডিস্কের আকার (স্ন্যাপ সিঙ্ক) | ডিস্কের আকার (সম্পূর্ণ আর্কাইভ) | +| ---------- | ----------------------------------------------- | -------------------------------------------------- | +| Besu | ৮০০GB+ | ১২TB+ | +| Erigon | প্রযোজ্য নয় | ২.৫TB+ | +| Geth | ৫০০GB+ | ১২TB+ | +| Nethermind | ৫০০GB+ | ১২TB+ | +| Reth | প্রযোজ্য নয় | ২.২TB+ | + +- দ্রষ্টব্য: Erigon এবং Reth স্ন্যাপ সিঙ্ক অফার করে না, কিন্তু ফুল প্রুনিং সম্ভব (Erigon-এর জন্য ~২TB, Reth-এর জন্য ~১.২TB) + +কনসেন্সাস ক্লায়েন্টদের জন্য, স্থানের প্রয়োজনীয়তা ক্লায়েন্ট ইমপ্লিমেন্টেশন এবং সক্রিয় করা বৈশিষ্ট্যগুলির (যেমন, ভ্যালিডেটর স্ল্যাশার) উপরও নির্ভর করে, তবে সাধারণত বীকন ডেটার জন্য আরও ২০০GB প্রয়োজন হয়। বিপুল সংখ্যক ভ্যালিডেটরের সাথে, ব্যান্ডউইথ লোডও বৃদ্ধি পায়। আপনি [এই বিশ্লেষণে কনসেন্সাস ক্লায়েন্টের প্রয়োজনীয়তার বিবরণ](https://mirror.xyz/0x934e6B4D7eee305F8C9C42b46D6EEA09CcFd5EDc/b69LBy8p5UhcGJqUAmT22dpvdkU-Pulg2inrhoS9Mbc) খুঁজে পেতে পারেন। + +#### প্লাগ-এন্ড-প্লে সমাধান {#plug-and-play} + +আপনার নিজের হার্ডওয়্যার দিয়ে একটি নোড চালানোর সবচেয়ে সহজ বিকল্প হল প্লাগ-এন্ড-প্লে বক্স ব্যবহার করা। বিক্রেতাদের থেকে পূর্ব-কনফিগার করা মেশিনগুলি সবচেয়ে সহজ অভিজ্ঞতা প্রদান করে: অর্ডার করুন, সংযোগ করুন, চালান। সফটওয়্যারটি পর্যবেক্ষণ এবং নিয়ন্ত্রণ করার জন্য একটি স্বজ্ঞাত গাইড এবং ড্যাশবোর্ডের সাথে সবকিছু পূর্ব-কনফিগার করা থাকে এবং স্বয়ংক্রিয়ভাবে চলে। + +- [DappNode](https://dappnode.io/) +- [Avado](https://ava.do/) + +#### একটি একক-বোর্ড কম্পিউটারে ইথেরিয়াম {#ethereum-on-a-single-board-computer} + +একটি ইথেরিয়াম নোড চালানোর একটি সহজ এবং সস্তা উপায় হল একটি একক বোর্ড কম্পিউটার ব্যবহার করা, এমনকি Raspberry Pi-এর মতো একটি ARM আর্কিটেকচার সহ। [ARM-এ ইথেরিয়াম](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/) Raspberry Pi এবং অন্যান্য ARM বোর্ডের জন্য একাধিক এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্টের সহজে চালানোর মতো ইমেজ সরবরাহ করে। + +এই ধরনের ছোট, সাশ্রয়ী এবং দক্ষ ডিভাইসগুলি বাড়িতে একটি নোড চালানোর জন্য আদর্শ কিন্তু তাদের সীমিত কর্মক্ষমতা মনে রাখবেন। + +## নোডটি স্পিন আপ করা {#spinning-up-node} + +আসল ক্লায়েন্ট সেটআপ সরাসরি ক্লায়েন্ট সফটওয়্যার সেট আপ করে, স্বয়ংক্রিয় লঞ্চার দিয়ে বা ম্যানুয়ালি করা যেতে পারে। + +কম উন্নত ব্যবহারকারীদের জন্য, প্রস্তাবিত পদ্ধতি হল একটি লঞ্চার ব্যবহার করা, এটি এমন একটি সফটওয়্যার যা আপনাকে ইনস্টলেশনের মাধ্যমে গাইড করে এবং ক্লায়েন্ট সেটআপ প্রক্রিয়াটি স্বয়ংক্রিয় করে তোলে। তবে, যদি আপনার টার্মিনাল ব্যবহারের কিছু অভিজ্ঞতা থাকে, তবে ম্যানুয়াল সেটআপের ধাপগুলি অনুসরণ করা সহজ হওয়া উচিত। + +### গাইডেড সেটআপ {#automatized-setup} + +একাধিক ব্যবহারকারী-বান্ধব প্রকল্পের লক্ষ্য একটি ক্লায়েন্ট সেট আপ করার অভিজ্ঞতা উন্নত করা। এই লঞ্চারগুলি স্বয়ংক্রিয় ক্লায়েন্ট ইনস্টলেশন এবং কনফিগারেশন প্রদান করে, কিছুর মধ্যে এমনকি ক্লায়েন্টদের গাইডেড সেটআপ এবং পর্যবেক্ষণের জন্য একটি গ্রাফিকাল ইন্টারফেসও অফার করা হয়। + +নিচে কয়েকটি প্রকল্প রয়েছে যা আপনাকে মাত্র কয়েকটি ক্লিকে ক্লায়েন্ট ইনস্টল এবং নিয়ন্ত্রণ করতে সাহায্য করতে পারে: + +- [DappNode](https://docs.dappnode.io/docs/user/getting-started/choose-your-path) - DappNode শুধুমাত্র একজন বিক্রেতার কাছ থেকে একটি মেশিনের সাথে আসে না। সফটওয়্যারটি, আসল নোড লঞ্চার এবং অনেক বৈশিষ্ট্য সহ নিয়ন্ত্রণ কেন্দ্র যেকোনো হার্ডওয়্যারে ব্যবহার করা যেতে পারে। +- [EthPillar](https://www.coincashew.com/coins/overview-eth/ethpillar) - একটি পূর্ণ নোড সেটআপ করার দ্রুততম এবং সহজতম উপায়। এক-লাইনের সেটআপ টুল এবং নোড ম্যানেজমেন্ট TUI। বিনামূল্যে। ওপেন সোর্স। একক স্টেকারদের দ্বারা ইথেরিয়াম-এর জন্য পাবলিক গুডস। ARM64 এবং AMD64 সমর্থন। +- [eth-docker](https://eth-docker.net/) - ডকার ব্যবহার করে স্বয়ংক্রিয় সেটআপ যা সহজ এবং নিরাপদ স্টেকিংয়ের উপর দৃষ্টি নিবদ্ধ করে, প্রাথমিক টার্মিনাল এবং ডকার জ্ঞান প্রয়োজন, কিছুটা বেশি উন্নত ব্যবহারকারীদের জন্য প্রস্তাবিত। +- [Stereum](https://stereum-dev.github.io/ethereum-node-web-docs) - একটি GUI সেটআপ গাইড, নিয়ন্ত্রণ কেন্দ্র, এবং অন্যান্য অনেক বৈশিষ্ট্য সহ SSH সংযোগের মাধ্যমে একটি দূরবর্তী সার্ভারে ক্লায়েন্ট ইনস্টল করার জন্য লঞ্চার। +- [NiceNode](https://www.nicenode.xyz/) - আপনার কম্পিউটারে একটি নোড চালানোর জন্য একটি সহজবোধ্য ব্যবহারকারী অভিজ্ঞতা সহ লঞ্চার। শুধু ক্লায়েন্ট বেছে নিন এবং কয়েকটি ক্লিকে সেগুলি শুরু করুন। এখনও বিকাশের অধীনে। +- [Sedge](https://docs.sedge.nethermind.io/docs/intro) - নোড সেটআপ টুল যা CLI উইজার্ড ব্যবহার করে স্বয়ংক্রিয়ভাবে একটি ডকার কনফিগারেশন তৈরি করে। Nethermind দ্বারা Go-তে লেখা। + +### ম্যানুয়াল ক্লায়েন্ট সেটআপ {#manual-setup} + +অন্য বিকল্পটি হল ক্লায়েন্ট সফটওয়্যারটি ম্যানুয়ালি ডাউনলোড, যাচাই এবং কনফিগার করা। যদিও কিছু ক্লায়েন্ট একটি গ্রাফিকাল ইন্টারফেস অফার করে, একটি ম্যানুয়াল সেটআপের জন্য এখনও টার্মিনালের সাথে প্রাথমিক দক্ষতার প্রয়োজন হয় কিন্তু এটি অনেক বেশি বহুমুখিতা অফার করে। + +যেমনটি আগে ব্যাখ্যা করা হয়েছে, আপনার নিজের ইথেরিয়াম নোড সেট আপ করার জন্য একজোড়া কনসেন্সাস এবং এক্সিকিউশন ক্লায়েন্ট চালাতে হবে। কিছু ক্লায়েন্টে অন্য ধরণের একটি লাইট ক্লায়েন্ট অন্তর্ভুক্ত থাকতে পারে এবং অন্য কোনো সফটওয়্যারের প্রয়োজন ছাড়াই সিঙ্ক হতে পারে। তবে, সম্পূর্ণ বিশ্বাসহীন যাচাইয়ের জন্য উভয় ইমপ্লিমেন্টেশন প্রয়োজন। + +#### ক্লায়েন্ট সফটওয়্যার পাওয়া {#getting-the-client} + +প্রথমে, আপনাকে আপনার পছন্দের [এক্সিকিউশন ক্লায়েন্ট](/developers/docs/nodes-and-clients/#execution-clients) এবং [কনসেন্সাস ক্লায়েন্ট](/developers/docs/nodes-and-clients/#consensus-clients) সফটওয়্যার পেতে হবে। + +আপনি কেবল একটি এক্সিকিউটেবল অ্যাপ্লিকেশন বা ইনস্টলেশন প্যাকেজ ডাউনলোড করতে পারেন যা আপনার অপারেটিং সিস্টেম এবং আর্কিটেকচারের জন্য উপযুক্ত। ডাউনলোড করা প্যাকেজগুলির স্বাক্ষর এবং চেকসাম সবসময় যাচাই করুন। কিছু ক্লায়েন্ট সহজ ইনস্টলেশন এবং আপডেটের জন্য রিপোজিটরি বা ডকার ইমেজও অফার করে। সমস্ত ক্লায়েন্ট ওপেন সোর্স, তাই আপনি সোর্স থেকে সেগুলি তৈরি করতে পারেন। এটি একটি আরও উন্নত পদ্ধতি, কিন্তু কিছু ক্ষেত্রে, এটির প্রয়োজন হতে পারে। + +প্রতিটি ক্লায়েন্ট ইনস্টল করার নির্দেশাবলী উপরের ক্লায়েন্ট তালিকার সাথে লিঙ্ক করা নথিপত্রে সরবরাহ করা হয়েছে। + +এখানে ক্লায়েন্টদের রিলিজ পৃষ্ঠাগুলি রয়েছে যেখানে আপনি তাদের পূর্ব-নির্মিত বাইনারি বা ইনস্টলেশনের নির্দেশাবলী খুঁজে পেতে পারেন: + +##### এক্সিকিউশন ক্লায়েন্ট + +- [Besu](https://github.com/hyperledger/besu/releases) +- [Erigon](https://github.com/ledgerwatch/erigon/releases) +- [Geth](https://geth.ethereum.org/downloads/) +- [Nethermind](https://downloads.nethermind.io/) +- [Reth](https://reth.rs/installation/installation.html) + +এটিও লক্ষ্য করার মতো যে ক্লায়েন্ট ডাইভারসিটি [এক্সিকিউশন লেয়ারের](/developers/docs/nodes-and-clients/client-diversity/#execution-layer) একটি সমস্যা। পাঠকদের একটি সংখ্যালঘু এক্সিকিউশন ক্লায়েন্ট চালানোর কথা বিবেচনা করার পরামর্শ দেওয়া হয়। + +##### কনসেন্সাস ক্লায়েন্ট + +- [Lighthouse](https://github.com/sigp/lighthouse/releases/latest) +- [Lodestar](https://chainsafe.github.io/lodestar/run/getting-started/installation#build-from-source/) (একটি পূর্ব-নির্মিত বাইনারি প্রদান করে না, শুধুমাত্র একটি ডকার ইমেজ বা সোর্স থেকে তৈরি করতে হয়) +- [Nimbus](https://github.com/status-im/nimbus-eth2/releases/latest) +- [Prysm](https://github.com/prysmaticlabs/prysm/releases/latest) +- [Teku](https://github.com/ConsenSys/teku/releases) + +ভ্যালিডেটর চালানো কনসেন্সাস নোডগুলির জন্য [ক্লায়েন্ট ডাইভারসিটি](/developers/docs/nodes-and-clients/client-diversity/) অত্যন্ত গুরুত্বপূর্ণ। যদি সংখ্যাগরিষ্ঠ ভ্যালিডেটর একটি একক ক্লায়েন্ট ইমপ্লিমেন্টেশন চালায়, তাহলে নেটওয়ার্ক নিরাপত্তা ঝুঁকির মধ্যে থাকে। তাই একটি সংখ্যালঘু ক্লায়েন্ট বেছে নেওয়ার কথা বিবেচনা করার পরামর্শ দেওয়া হয়। + +[সর্বশেষ নেটওয়ার্ক ক্লায়েন্ট ব্যবহার দেখুন](https://clientdiversity.org/) এবং [ক্লায়েন্ট ডাইভারসিটি](/developers/docs/nodes-and-clients/client-diversity) সম্পর্কে আরও জানুন। + +##### সফটওয়্যার যাচাই করা + +ইন্টারনেট থেকে সফটওয়্যার ডাউনলোড করার সময়, এর অখণ্ডতা যাচাই করার পরামর্শ দেওয়া হয়। এই পদক্ষেপটি ঐচ্ছিক কিন্তু বিশেষত ইথেরিয়াম ক্লায়েন্টের মতো গুরুত্বপূর্ণ অবকাঠামো অংশের সাথে, সম্ভাব্য আক্রমণ ভেক্টর সম্পর্কে সচেতন থাকা এবং সেগুলি এড়ানো গুরুত্বপূর্ণ। আপনি যদি একটি পূর্ব-নির্মিত বাইনারি ডাউনলোড করেন, তবে আপনাকে এটি বিশ্বাস করতে হবে এবং ঝুঁকি নিতে হবে যে একজন আক্রমণকারী এক্সিকিউটেবলটিকে একটি ক্ষতিকারকটির সাথে অদলবদল করতে পারে। + +ডেভেলপাররা তাদের PGP কী দিয়ে প্রকাশিত বাইনারিগুলিতে স্বাক্ষর করে যাতে আপনি ক্রিপ্টোগ্রাফিকভাবে যাচাই করতে পারেন যে আপনি ঠিক সেই সফটওয়্যারটি চালাচ্ছেন যা তারা তৈরি করেছে। আপনাকে শুধু ডেভেলপারদের দ্বারা ব্যবহৃত পাবলিক কীগুলি পেতে হবে, যা ক্লায়েন্ট রিলিজ পৃষ্ঠাগুলিতে বা নথিপত্রে পাওয়া যাবে। ক্লায়েন্ট রিলিজ এবং এর স্বাক্ষর ডাউনলোড করার পরে, আপনি একটি PGP ইমপ্লিমেন্টেশন ব্যবহার করতে পারেন, যেমন, [GnuPG](https://gnupg.org/download/index.html) সহজেই সেগুলি যাচাই করতে। `gpg` ব্যবহার করে ওপেন-সোর্স সফটওয়্যার যাচাই করার একটি টিউটোরিয়াল দেখুন [লিনাক্স](https://www.tecmint.com/verify-pgp-signature-downloaded-software/) বা [উইন্ডোজ/ম্যাকওএস](https://freedom.press/training/verifying-open-source-software/) এ। + +যাচাইকরণের আরেকটি রূপ হল এটি নিশ্চিত করা যে আপনি যে সফটওয়্যারটি ডাউনলোড করেছেন তার হ্যাস, একটি অনন্য ক্রিপ্টোগ্রাফিক ফিঙ্গারপ্রিন্ট, ডেভেলপারদের দ্বারা প্রদত্তটির সাথে মেলে। এটি PGP ব্যবহারের চেয়েও সহজ, এবং কিছু ক্লায়েন্ট শুধুমাত্র এই বিকল্পটি অফার করে। শুধু ডাউনলোড করা সফটওয়্যারে হ্যাস ফাংশনটি চালান এবং রিলিজ পৃষ্ঠা থেকে এটির সাথে তুলনা করুন। উদাহরণস্বরূপ: + +```sh +sha256sum teku-22.6.1.tar.gz + +9b2f8c1f8d4dab0404ce70ea314ff4b3c77e9d27aff9d1e4c1933a5439767dde +``` + +#### ক্লায়েন্ট সেটআপ {#client-setup} + +ক্লায়েন্ট সফটওয়্যার ইনস্টল, ডাউনলোড বা কম্পাইল করার পরে, আপনি এটি চালানোর জন্য প্রস্তুত। এর মানে শুধু এই যে এটি সঠিক কনফিগারেশনের সাথে এক্সিকিউট করতে হবে। ক্লায়েন্টরা সমৃদ্ধ কনফিগারেশন বিকল্প অফার করে, যা বিভিন্ন বৈশিষ্ট্য সক্রিয় করতে পারে। + +আসুন এমন বিকল্পগুলি দিয়ে শুরু করি যা ক্লায়েন্টের কর্মক্ষমতা এবং ডেটা ব্যবহারকে উল্লেখযোগ্যভাবে প্রভাবিত করতে পারে। [সিঙ্ক মোড](/developers/docs/nodes-and-clients/#sync-modes) ব্লকচেইন ডেটা ডাউনলোড এবং যাচাই করার বিভিন্ন পদ্ধতির প্রতিনিধিত্ব করে। নোড শুরু করার আগে, আপনার কোন নেটওয়ার্ক এবং সিঙ্ক মোড ব্যবহার করতে হবে তা সিদ্ধান্ত নেওয়া উচিত। সবচেয়ে গুরুত্বপূর্ণ বিষয়গুলি যা বিবেচনা করতে হবে তা হল ডিস্কের স্থান এবং ক্লায়েন্টের জন্য প্রয়োজনীয় সিঙ্ক সময়। কোন সিঙ্ক মোড ডিফল্ট তা নির্ধারণ করতে ক্লায়েন্টের ডক্সে মনোযোগ দিন। যদি এটি আপনার জন্য উপযুক্ত না হয়, তবে নিরাপত্তা, উপলব্ধ ডেটা এবং খরচের উপর ভিত্তি করে অন্য একটি বেছে নিন। সিঙ্ক্রোনাইজেশন অ্যালগরিদম ছাড়াও, আপনি বিভিন্ন ধরণের পুরানো ডেটার ছাঁটাইও সেট করতে পারেন। প্রুনিং পুরানো ডেটা মুছে ফেলতে সক্ষম করে, যেমন, সাম্প্রতিক ব্লকগুলি থেকে পৌঁছানো যায় না এমন স্টেট ট্রাই নোডগুলি অপসারণ করা। + +অন্যান্য মৌলিক কনফিগারেশন বিকল্পগুলি হল, যেমন, একটি নেটওয়ার্ক বেছে নেওয়া - মেইননেট বা টেস্টনেট, RPC বা WebSocket-এর জন্য HTTP এন্ডপয়েন্ট সক্রিয় করা ইত্যাদি। আপনি ক্লায়েন্টের নথিপত্রে সমস্ত বৈশিষ্ট্য এবং বিকল্প খুঁজে পেতে পারেন। বিভিন্ন ক্লায়েন্ট কনফিগারেশন সরাসরি CLI বা কনফিগ ফাইলে সংশ্লিষ্ট ফ্ল্যাগগুলির সাথে ক্লায়েন্টকে কার্যকর করে সেট করা যেতে পারে। প্রতিটি ক্লায়েন্ট কিছুটা ভিন্ন; কনফিগারেশন বিকল্পের বিশদ বিবরণের জন্য অনুগ্রহ করে সর্বদা এর অফিসিয়াল নথিপত্র বা সহায়তা পৃষ্ঠা দেখুন। + +পরীক্ষার উদ্দেশ্যে, আপনি টেস্টনেট নেটওয়ার্কগুলির একটিতে একটি ক্লায়েন্ট চালাতে পছন্দ করতে পারেন। [সমর্থিত নেটওয়ার্কগুলির সংক্ষিপ্ত বিবরণ দেখুন](/developers/docs/nodes-and-clients/#execution-clients)। + +মৌলিক কনফিগারেশন সহ এক্সিকিউশন ক্লায়েন্ট চালানোর উদাহরণ পরবর্তী বিভাগে পাওয়া যাবে। + +#### এক্সিকিউশন ক্লায়েন্ট শুরু করা {#starting-the-execution-client} + +ইথেরিয়াম ক্লায়েন্ট সফটওয়্যার শুরু করার আগে, আপনার পরিবেশ প্রস্তুত কিনা তা শেষবারের মতো পরীক্ষা করুন। উদাহরণস্বরূপ, নিশ্চিত করুন: + +- নির্বাচিত নেটওয়ার্ক এবং সিঙ্ক মোড বিবেচনা করে পর্যাপ্ত ডিস্ক স্পেস রয়েছে। +- মেমরি এবং সিপিইউ অন্যান্য প্রোগ্রাম দ্বারা বন্ধ করা হয়নি। +- অপারেটিং সিস্টেম সর্বশেষ সংস্করণে আপডেট করা হয়েছে। +- সিস্টেমের সঠিক সময় এবং তারিখ আছে। +- আপনার রাউটার এবং ফায়ারওয়াল লিসেনিং পোর্টে সংযোগ গ্রহণ করে। ডিফল্টরূপে ইথেরিয়াম ক্লায়েন্টরা একটি লিসেনার (TCP) পোর্ট এবং একটি ডিসকভারি (UDP) পোর্ট ব্যবহার করে, উভয়ই ডিফল্টরূপে ৩০৩০৩ পোর্টে। + +সবকিছু ঠিকঠাক কাজ করছে কিনা তা নিশ্চিত করতে সাহায্য করার জন্য প্রথমে আপনার ক্লায়েন্ট একটি টেস্টনেটে চালান। + +শুরুতে আপনাকে ডিফল্ট নয় এমন কোনো ক্লায়েন্ট সেটিংস ঘোষণা করতে হবে। আপনার পছন্দের কনফিগারেশন ঘোষণা করতে আপনি ফ্ল্যাগ বা কনফিগ ফাইল ব্যবহার করতে পারেন। প্রতিটি ক্লায়েন্টের বৈশিষ্ট্য এবং কনফিগার সিনট্যাক্সের সেট আলাদা। নির্দিষ্ট বিবরণের জন্য আপনার ক্লায়েন্টের নথিপত্র দেখুন। + +এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্ট [ইঞ্জিন API](https://github.com/ethereum/execution-apis/tree/main/src/engine)-তে নির্দিষ্ট একটি প্রমাণীকৃত এন্ডপয়েন্টের মাধ্যমে যোগাযোগ করে। একটি কনসেন্সাস ক্লায়েন্টের সাথে সংযোগ স্থাপন করার জন্য, এক্সিকিউশন ক্লায়েন্টকে অবশ্যই একটি পরিচিত পথে একটি [`jwtsecret`](https://jwt.io/) তৈরি করতে হবে। নিরাপত্তা এবং স্থিতিশীলতার কারণে, ক্লায়েন্টদের একই মেশিনে চলা উচিত, এবং উভয় ক্লায়েন্টেরই এই পথটি জানা আবশ্যক কারণ এটি তাদের মধ্যে একটি স্থানীয় RPC সংযোগ প্রমাণীকরণের জন্য ব্যবহৃত হয়। এক্সিকিউশন ক্লায়েন্টকে অবশ্যই প্রমাণীকৃত API-গুলির জন্য একটি লিসেনিং পোর্ট নির্ধারণ করতে হবে। + +এই টোকেনটি ক্লায়েন্ট সফটওয়্যার দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হয়, কিন্তু কিছু ক্ষেত্রে, আপনাকে এটি নিজে করতে হতে পারে। আপনি [OpenSSL](https://www.openssl.org/) ব্যবহার করে এটি তৈরি করতে পারেন: + +```sh +openssl rand -hex 32 > jwtsecret +``` + +#### একটি এক্সিকিউশন ক্লায়েন্ট চালানো {#running-an-execution-client} + +এই বিভাগটি আপনাকে এক্সিকিউশন ক্লায়েন্ট শুরু করার মাধ্যমে গাইড করবে। এটি শুধুমাত্র একটি মৌলিক কনফিগারেশনের উদাহরণ হিসাবে কাজ করে, যা এই সেটিংসের সাথে ক্লায়েন্ট শুরু করবে: + +- আমাদের উদাহরণগুলিতে কোন নেটওয়ার্কে সংযোগ করতে হবে, মেইননেট নির্দিষ্ট করে + - আপনি এর পরিবর্তে আপনার সেটআপের প্রাথমিক পরীক্ষার জন্য [টেস্টনেটগুলির মধ্যে একটি](/developers/docs/networks/) বেছে নিতে পারেন +- ডেটা ডিরেক্টরি সংজ্ঞায়িত করে, যেখানে ব্লকচেইন সহ সমস্ত ডেটা সংরক্ষণ করা হবে + - নিশ্চিত করুন যে পথটি একটি আসল পথের সাথে প্রতিস্থাপন করা হয়েছে, যেমন, আপনার বাহ্যিক ড্রাইভে নির্দেশ করে +- ক্লায়েন্টের সাথে যোগাযোগের জন্য ইন্টারফেস সক্ষম করে + - কনসেন্সাস ক্লায়েন্টের সাথে যোগাযোগের জন্য JSON-RPC এবং ইঞ্জিন API সহ +- প্রমাণীকৃত API-এর জন্য `jwtsecret`-এর পাথ সংজ্ঞায়িত করে + - উদাহরণ পথটিকে একটি আসল পথের সাথে প্রতিস্থাপন করা নিশ্চিত করুন যা ক্লায়েন্টদের দ্বারা অ্যাক্সেস করা যেতে পারে, যেমন, `/tmp/jwtsecret` + +অনুগ্রহ করে মনে রাখবেন যে এটি শুধুমাত্র একটি মৌলিক উদাহরণ, অন্য সমস্ত সেটিংস ডিফল্ট হিসাবে সেট করা হবে। ডিফল্ট মান, সেটিংস এবং বৈশিষ্ট্য সম্পর্কে জানতে প্রতিটি ক্লায়েন্টের নথিপত্রে মনোযোগ দিন। আরও বৈশিষ্ট্যের জন্য, উদাহরণস্বরূপ ভ্যালিডেটর চালানো, পর্যবেক্ষণ ইত্যাদি, অনুগ্রহ করে নির্দিষ্ট ক্লায়েন্টের নথিপত্র দেখুন। + +> লক্ষ্য করুন যে উদাহরণগুলিতে ব্যাকস্ল্যাশগুলি `` শুধুমাত্র বিন্যাসের উদ্দেশ্যে; কনফিগারেশন ফ্ল্যাগগুলি একটি একক লাইনে সংজ্ঞায়িত করা যেতে পারে। + +##### Besu চালানো + +এই উদাহরণটি মেইননেটে Besu শুরু করে, `/data/ethereum`-এ ডিফল্ট বিন্যাসে ব্লকচেইন ডেটা সংরক্ষণ করে, কনসেন্সাস ক্লায়েন্ট সংযোগ করার জন্য JSON-RPC এবং ইঞ্জিন RPC সক্ষম করে। ইঞ্জিন API টোকেন `jwtsecret` দিয়ে প্রমাণীকৃত এবং শুধুমাত্র `localhost` থেকে কল করার অনুমতি দেওয়া হয়। + +```sh +besu --network=mainnet \ + --data-path=/data/ethereum \ + --rpc-http-enabled=true \ + --engine-rpc-enabled=true \ + --engine-host-allowlist="*" \ + --engine-jwt-enabled=true \ + --engine-jwt-secret=/path/to/jwtsecret +``` + +Besu একটি লঞ্চার বিকল্পের সাথেও আসে যা একাধিক প্রশ্ন জিজ্ঞাসা করবে এবং কনফিগারেশন ফাইল তৈরি করবে। ইন্টারেক্টিভ লঞ্চারটি ব্যবহার করে চালান: + +```sh +besu --Xlauncher +``` + +[Besu-এর নথিপত্রে](https://besu.hyperledger.org/public-networks/get-started/start-node/) অতিরিক্ত বিকল্প এবং কনফিগারেশনের বিবরণ রয়েছে। + +##### Erigon চালানো + +এই উদাহরণটি মেইননেটে Erigon শুরু করে, `/data/ethereum`-এ ব্লকচেইন ডেটা সংরক্ষণ করে, JSON-RPC সক্ষম করে, কোন নেমস্পেসগুলি অনুমোদিত তা সংজ্ঞায়িত করে এবং কনসেন্সাস ক্লায়েন্ট সংযোগ করার জন্য প্রমাণীকরণ সক্ষম করে যা `jwtsecret` পাথ দ্বারা সংজ্ঞায়িত করা হয়। + +```sh +erigon --chain mainnet \ + --datadir /data/ethereum \ + --http --http.api=engine,eth,web3,net \ + --authrpc.jwtsecret=/path/to/jwtsecret +``` + +Erigon ডিফল্টরূপে ৮GB HDD দিয়ে একটি সম্পূর্ণ সিঙ্ক সম্পাদন করে যার ফলে ২TB-এর বেশি আর্কাইভ ডেটা হবে। `datadir` পর্যাপ্ত খালি স্থান সহ ডিস্কের দিকে নির্দেশ করছে কিনা তা নিশ্চিত করুন অথবা `--prune` ফ্ল্যাগের দিকে নজর দিন যা বিভিন্ন ধরণের ডেটা ছাঁটাই করতে পারে। আরও জানতে Erigon-এর `--help` দেখুন। + +##### Geth চালানো + +এই উদাহরণটি মেইননেটে Geth শুরু করে, `/data/ethereum`-এ ব্লকচেইন ডেটা সংরক্ষণ করে, JSON-RPC সক্ষম করে এবং কোন নেমস্পেসগুলি অনুমোদিত তা সংজ্ঞায়িত করে। এটি কনসেন্সাস ক্লায়েন্ট সংযোগ করার জন্য প্রমাণীকরণও সক্ষম করে যার জন্য `jwtsecret`-এর পথ প্রয়োজন এবং কোন সংযোগগুলি অনুমোদিত তা সংজ্ঞায়িত করে, আমাদের উদাহরণে শুধুমাত্র `localhost` থেকে। + +```sh +geth --mainnet \ + --datadir "/data/ethereum" \ + --http --authrpc.addr localhost \ + --authrpc.vhosts="localhost" \ + --authrpc.port 8551 + --authrpc.jwtsecret=/path/to/jwtsecret +``` + +[সমস্ত কনফিগারেশন বিকল্পের জন্য ডক্স দেখুন](https://geth.ethereum.org/docs/fundamentals/command-line-options) এবং [একটি কনসেন্সাস ক্লায়েন্টের সাথে Geth চালানো](https://geth.ethereum.org/docs/getting-started/consensus-clients) সম্পর্কে আরও জানুন। + +##### Nethermind চালানো + +Nethermind বিভিন্ন [ইনস্টলেশন বিকল্প](https://docs.nethermind.io/get-started/installing-nethermind) অফার করে। প্যাকেজটি একটি গাইডেড সেটআপ সহ একটি লঞ্চার সহ বিভিন্ন বাইনারি নিয়ে আসে, যা আপনাকে ইন্টারেক্টিভভাবে কনফিগারেশন তৈরি করতে সাহায্য করবে। বিকল্পভাবে, আপনি রানার খুঁজে পাবেন যা নিজেই এক্সিকিউটেবল এবং আপনি এটি কেবল কনফিগারেশন ফ্ল্যাগ দিয়ে চালাতে পারেন। JSON-RPC ডিফল্টরূপে সক্রিয় থাকে। + +```sh +Nethermind.Runner --config mainnet \ + --datadir /data/ethereum \ + --JsonRpc.JwtSecretFile=/path/to/jwtsecret +``` + +Nethermind ডক্স কনসেন্সাস ক্লায়েন্টের সাথে Nethermind চালানোর উপর একটি [সম্পূর্ণ গাইড](https://docs.nethermind.io/get-started/running-node/) অফার করে। + +একটি এক্সিকিউশন ক্লায়েন্ট তার মূল ফাংশন, নির্বাচিত এন্ডপয়েন্ট শুরু করবে এবং পিয়ারদের সন্ধান শুরু করবে। সফলভাবে পিয়ারদের আবিষ্কার করার পরে, ক্লায়েন্ট সিঙ্ক্রোনাইজেশন শুরু করে। এক্সিকিউশন ক্লায়েন্ট কনসেন্সাস ক্লায়েন্টের কাছ থেকে সংযোগের জন্য অপেক্ষা করবে। ক্লায়েন্ট সফলভাবে বর্তমান স্টেটে সিঙ্ক হয়ে গেলে বর্তমান ব্লকচেইন ডেটা উপলব্ধ হবে। + +##### Reth চালানো + +এই উদাহরণটি মেইননেটে Reth শুরু করে, ডিফল্ট ডেটা অবস্থান ব্যবহার করে। JSON-RPC এবং ইঞ্জিন RPC প্রমাণীকরণ সক্ষম করে কনসেন্সাস ক্লায়েন্ট সংযোগ করার জন্য যা `jwtsecret` পাথ দ্বারা সংজ্ঞায়িত করা হয়, শুধুমাত্র `localhost` থেকে কল করার অনুমতি দেওয়া হয়। + +```sh +reth node \ + --authrpc.jwtsecret /path/to/jwtsecret \ + --authrpc.addr 127.0.0.1 \ + --authrpc.port 8551 +``` + +ডিফল্ট ডেটা ডিরেক্টরি সম্পর্কে আরও জানতে [Reth কনফিগার করা](https://reth.rs/run/config.html?highlight=data%20directory#configuring-reth) দেখুন। [Reth-এর নথিপত্রে](https://reth.rs/run/mainnet.html) অতিরিক্ত বিকল্প এবং কনফিগারেশনের বিবরণ রয়েছে। + +#### কনসেন্সাস ক্লায়েন্ট শুরু করা {#starting-the-consensus-client} + +এক্সিকিউশন ক্লায়েন্টের সাথে একটি স্থানীয় RPC সংযোগ স্থাপন করতে কনসেন্সাস ক্লায়েন্টকে সঠিক পোর্ট কনফিগারেশনের সাথে শুরু করতে হবে। কনসেন্সাস ক্লায়েন্টগুলিকে কনফিগারেশন আর্গুমেন্ট হিসাবে উন্মুক্ত এক্সিকিউশন ক্লায়েন্ট পোর্টের সাথে চালাতে হবে। + +কনসেন্সাস ক্লায়েন্টকে তাদের মধ্যে RPC সংযোগ প্রমাণীকরণের জন্য এক্সিকিউশন ক্লায়েন্টের `jwt-secret`-এর পথও প্রয়োজন। উপরের এক্সিকিউশন উদাহরণগুলির মতো, প্রতিটি কনসেন্সাস ক্লায়েন্টের একটি কনফিগারেশন ফ্ল্যাগ রয়েছে যা jwt টোকেন ফাইলের পথটি আর্গুমেন্ট হিসাবে নেয়। এটি অবশ্যই এক্সিকিউশন ক্লায়েন্টকে দেওয়া `jwtsecret` পাথের সাথে সামঞ্জস্যপূর্ণ হতে হবে। + +আপনি যদি একটি ভ্যালিডেটর চালানোর পরিকল্পনা করেন, তাহলে ফি প্রাপকের ইথেরিয়াম ঠিকানা নির্দিষ্ট করে একটি কনফিগারেশন ফ্ল্যাগ যোগ করতে ভুলবেন না। এখানে আপনার ভ্যালিডেটরের জন্য ইথার পুরস্কার জমা হয়। প্রতিটি কনসেন্সাস ক্লায়েন্টের একটি বিকল্প আছে, যেমন, `--suggested-fee-recipient=0xabcd1`, যা আর্গুমেন্ট হিসাবে একটি ইথেরিয়াম ঠিকানা নেয়। + +একটি টেস্টনেটে একটি বীকন নোড শুরু করার সময়, আপনি [চেকপয়েন্ট সিঙ্ক](https://notes.ethereum.org/@launchpad/checkpoint-sync)-এর জন্য একটি পাবলিক এন্ডপয়েন্ট ব্যবহার করে উল্লেখযোগ্য সিঙ্কিং সময় বাঁচাতে পারেন। + +#### একটি কনসেন্সাস ক্লায়েন্ট চালানো {#running-a-consensus-client} + +##### Lighthouse চালানো + +Lighthouse চালানোর আগে, [Lighthouse Book](https://lighthouse-book.sigmaprime.io/installation.html)-এ কীভাবে এটি ইনস্টল এবং কনফিগার করতে হয় সে সম্পর্কে আরও জানুন। + +```sh +lighthouse beacon_node \ + --network mainnet \ + --datadir /data/ethereum \ + --http \ + --execution-endpoint http://127.0.0.1:8551 \ + --execution-jwt /path/to/jwtsecret +``` + +##### Lodestar চালানো + +Lodestar সফটওয়্যার কম্পাইল করে বা ডকার ইমেজ ডাউনলোড করে ইনস্টল করুন। [ডক্স](https://chainsafe.github.io/lodestar/) এবং আরও ব্যাপক [সেটআপ গাইড](https://hackmd.io/@philknows/rk5cDvKmK) এ আরও জানুন। + +```sh +lodestar beacon \ + --dataDir="/data/ethereum" \ + --network=mainnet \ + --eth1.enabled=true \ + --execution.urls="http://127.0.0.1:8551" \ + --jwt-secret="/path/to/jwtsecret" +``` + +##### Nimbus চালানো + +Nimbus কনসেন্সাস এবং এক্সিকিউশন উভয় ক্লায়েন্টের সাথেই আসে। এটি এমনকি খুব সাধারণ কম্পিউটিং পাওয়ার সহ বিভিন্ন ডিভাইসেও চলতে পারে। +[ডিপেন্ডেন্সি এবং Nimbus নিজে ইনস্টল করার পরে](https://nimbus.guide/quick-start.html), আপনি এর কনসেন্সাস ক্লায়েন্ট চালাতে পারেন: + +```sh +nimbus_beacon_node \ + --network=mainnet \ + --web3-url=http://127.0.0.1:8551 \ + --rest \ + --jwt-secret="/path/to/jwtsecret" +``` + +##### Prysm চালানো + +Prysm একটি স্ক্রিপ্টের সাথে আসে যা সহজ স্বয়ংক্রিয় ইনস্টলেশন করতে দেয়। [Prysm ডক্স](https://prysm.offchainlabs.com/docs/install-prysm/install-with-script/)-এ বিশদ বিবরণ পাওয়া যাবে। + +```sh +./prysm.sh beacon-chain \ + --mainnet \ + --datadir /data/ethereum \ + --execution-endpoint=http://localhost:8551 \ + --jwt-secret=/path/to/jwtsecret +``` + +##### Teku চালানো + +```sh +teku --network mainnet \ + --data-path "/data/ethereum" \ + --ee-endpoint http://localhost:8551 \ + --ee-jwt-secret-file "/path/to/jwtsecret" +``` + +যখন একটি কনসেন্সাস ক্লায়েন্ট ডিপোজিট কন্ট্র্যাক্ট পড়তে এবং ভ্যালিডেটরদের শনাক্ত করতে এক্সিকিউশন ক্লায়েন্টের সাথে সংযোগ স্থাপন করে, তখন এটি অন্যান্য বীকন নোড পিয়ারদের সাথেও সংযোগ স্থাপন করে এবং জেনেসিস থেকে কনসেন্সাস স্লট সিঙ্ক করা শুরু করে। একবার বীকন নোড বর্তমান ইপকে পৌঁছে গেলে, বীকন API আপনার ভ্যালিডেটরদের জন্য ব্যবহারযোগ্য হয়ে ওঠে। [বীকন নোড API](https://eth2docs.vercel.app/) সম্পর্কে আরও জানুন। + +### ভ্যালিডেটর যোগ করা {#adding-validators} + +একটি কনসেন্সাস ক্লায়েন্ট ভ্যালিডেটরদের সংযোগের জন্য একটি বীকন নোড হিসাবে কাজ করে। প্রতিটি কনসেন্সাস ক্লায়েন্টের নিজস্ব ভ্যালিডেটর সফটওয়্যার রয়েছে যা তাদের নিজ নিজ নথিপত্রে বিশদভাবে বর্ণনা করা হয়েছে। + +আপনার নিজের ভ্যালিডেটর চালানো [একক স্টেকিং](/staking/solo/) করার সুযোগ দেয়, যা ইথেরিয়াম নেটওয়ার্ককে সমর্থন করার জন্য সবচেয়ে প্রভাবশালী এবং বিশ্বাসহীন পদ্ধতি। তবে, এর জন্য ৩২ ETH জমা দিতে হবে। আপনার নিজের নোডে কম পরিমাণে ভ্যালিডেটর চালানোর জন্য, অনুমতিহীন নোড অপারেটর সহ একটি বিকেন্দ্রীভূত পুল, যেমন [রকেট পুল](https://rocketpool.net/node-operators), আপনার আগ্রহের কারণ হতে পারে। + +স্টেকিং এবং ভ্যালিডেটর কী জেনারেশন শুরু করার সবচেয়ে সহজ উপায় হল [হুডি টেস্টনেট স্টেকিং লঞ্চপ্যাড](https://hoodi.launchpad.ethereum.org/) ব্যবহার করা, যা আপনাকে [হুডিতে নোড চালিয়ে](https://notes.ethereum.org/@launchpad/hoodi) আপনার সেটআপ পরীক্ষা করার অনুমতি দেয়। আপনি যখন মেইননেটের জন্য প্রস্তুত হবেন, তখন আপনি [মেইননেট স্টেকিং লঞ্চপ্যাড](https://launchpad.ethereum.org/) ব্যবহার করে এই ধাপগুলি পুনরাবৃত্তি করতে পারেন। + +স্টেকিং বিকল্পগুলির একটি সংক্ষিপ্ত বিবরণের জন্য [স্টেকিং পৃষ্ঠা](/staking) দেখুন। + +### নোড ব্যবহার করা {#using-the-node} + +এক্সিকিউশন ক্লায়েন্টরা [RPC API এন্ডপয়েন্ট](/developers/docs/apis/json-rpc/) অফার করে যা আপনি লেনদেন জমা দিতে, ইথেরিয়াম নেটওয়ার্কে স্মার্ট কন্ট্র্যাক্টগুলির সাথে ইন্টারঅ্যাক্ট করতে বা বিভিন্ন উপায়ে স্থাপন করতে ব্যবহার করতে পারেন: + +- একটি উপযুক্ত প্রোটোকল দিয়ে ম্যানুয়ালি তাদের কল করা (যেমন, `curl` ব্যবহার করে) +- একটি প্রদত্ত কনসোল সংযুক্ত করা (যেমন, `geth attach`) +- web3 লাইব্রেরি ব্যবহার করে অ্যাপ্লিকেশনগুলিতে সেগুলি প্রয়োগ করা, যেমন, [web3.py](https://web3py.readthedocs.io/en/stable/overview.html#overview), [ethers](https://github.com/ethers-io/ethers.js/) + +বিভিন্ন ক্লায়েন্টের RPC এন্ডপয়েন্টগুলির বিভিন্ন ইমপ্লিমেন্টেশন রয়েছে। কিন্তু একটি স্ট্যান্ডার্ড JSON-RPC আছে যা আপনি প্রতিটি ক্লায়েন্টের সাথে ব্যবহার করতে পারেন। একটি সংক্ষিপ্ত বিবরণের জন্য [JSON-RPC ডক্স](/developers/docs/apis/json-rpc/) পড়ুন। ইথেরিয়াম নেটওয়ার্ক থেকে তথ্যের প্রয়োজন হয় এমন অ্যাপ্লিকেশনগুলি এই RPC ব্যবহার করতে পারে। উদাহরণস্বরূপ, জনপ্রিয় ওয়ালেট MetaMask আপনাকে [আপনার নিজস্ব RPC এন্ডপয়েন্টে সংযোগ করতে](https://metamask.zendesk.com/hc/en-us/articles/360015290012-Using-a-Local-Node) দেয় যার শক্তিশালী গোপনীয়তা এবং নিরাপত্তা সুবিধা রয়েছে। + +কনসেন্সাস ক্লায়েন্টরা সকলেই একটি [বীকন API](https://ethereum.github.io/beacon-APIs) প্রকাশ করে যা কনসেন্সাস ক্লায়েন্টের স্থিতি পরীক্ষা করতে বা [Curl](https://curl.se)-এর মতো সরঞ্জাম ব্যবহার করে অনুরোধ পাঠিয়ে ব্লক এবং কনসেন্সাস ডেটা ডাউনলোড করতে ব্যবহার করা যেতে পারে। এই বিষয়ে আরও তথ্য প্রতিটি কনসেন্সাস ক্লায়েন্টের জন্য নথিপত্রে পাওয়া যাবে। + +#### RPC-তে পৌঁছানো {#reaching-rpc} + +এক্সিকিউশন ক্লায়েন্ট JSON-RPC-এর জন্য ডিফল্ট পোর্ট হল `8545` কিন্তু আপনি কনফিগারেশনে স্থানীয় এন্ডপয়েন্টগুলির পোর্ট পরিবর্তন করতে পারেন। ডিফল্টরূপে, RPC ইন্টারফেস শুধুমাত্র আপনার কম্পিউটারের লোকালহোস্টে পৌঁছানো যায়। এটিকে দূর থেকে অ্যাক্সেসযোগ্য করতে, আপনি ঠিকানাটি `0.0.0.0`-এ পরিবর্তন করে এটিকে সর্বজনীনভাবে প্রকাশ করতে চাইতে পারেন। এটি এটিকে স্থানীয় নেটওয়ার্ক এবং পাবলিক আইপি ঠিকানার মাধ্যমে পৌঁছানো সম্ভব করবে। বেশিরভাগ ক্ষেত্রে আপনাকে আপনার রাউটারে পোর্ট ফরওয়ার্ডিং সেট আপ করতে হবে। + +ইন্টারনেটে পোর্টগুলি প্রকাশ করার সময় সতর্ক থাকুন কারণ এটি ইন্টারনেটের যে কাউকে আপনার নোড নিয়ন্ত্রণ করতে দেবে। ক্ষতিকারক অভিনেতারা আপনার নোড অ্যাক্সেস করে আপনার সিস্টেমকে ডাউন করতে বা আপনার তহবিল চুরি করতে পারে যদি আপনি আপনার ক্লায়েন্টকে ওয়ালেট হিসাবে ব্যবহার করেন। + +এর একটি উপায় হল সম্ভাব্য ক্ষতিকারক RPC পদ্ধতিগুলিকে পরিবর্তনযোগ্য হওয়া থেকে বিরত রাখা। উদাহরণস্বরূপ, Geth-এর সাথে, আপনি একটি ফ্ল্যাগ দিয়ে পরিবর্তনযোগ্য পদ্ধতি ঘোষণা করতে পারেন: `--http.api web3,eth,txpool`। + +RPC ইন্টারফেসে অ্যাক্সেস এজ লেয়ার API বা ওয়েব সার্ভার অ্যাপ্লিকেশন, যেমন Nginx, তৈরি করে এবং সেগুলিকে আপনার ক্লায়েন্টের স্থানীয় ঠিকানা এবং পোর্টের সাথে সংযোগ করে বাড়ানো যেতে পারে। একটি মধ্যম স্তরের ব্যবহার ডেভেলপারদের RPC ইন্টারফেসে নিরাপদ `https` সংযোগের জন্য একটি শংসাপত্র সেটআপ করার ক্ষমতাও দিতে পারে। + +আপনার নোডের RPC এন্ডপয়েন্টে অ্যাক্সেস দেওয়ার একমাত্র উপায় একটি ওয়েব সার্ভার, একটি প্রক্সি বা বাহ্যিকমুখী Rest API সেট আপ করা নয়। একটি সর্বজনীনভাবে পৌঁছানো যায় এমন এন্ডপয়েন্ট সেট আপ করার আরেকটি গোপনীয়তা-সংরক্ষণকারী উপায় হল আপনার নিজের [Tor](https://www.torproject.org/) অনিয়ন সার্ভিসে নোডটি হোস্ট করা। এটি আপনাকে একটি স্ট্যাটিক পাবলিক আইপি ঠিকানা বা খোলা পোর্ট ছাড়াই আপনার স্থানীয় নেটওয়ার্কের বাইরে RPC-তে পৌঁছাতে দেবে। তবে, এই কনফিগারেশনটি ব্যবহার করলে RPC এন্ডপয়েন্টটি শুধুমাত্র Tor নেটওয়ার্কের মাধ্যমে অ্যাক্সেসযোগ্য হতে পারে যা সমস্ত অ্যাপ্লিকেশন দ্বারা সমর্থিত নয় এবং সংযোগ সমস্যা হতে পারে। + +এটি করার জন্য, আপনাকে আপনার নিজের [অনিয়ন পরিষেবা](https://community.torproject.org/onion-services/) তৈরি করতে হবে। আপনার নিজের হোস্ট করার জন্য অনিয়ন পরিষেবা সেটআপের উপর [নথিপত্র](https://community.torproject.org/onion-services/setup/) দেখুন। আপনি এটিকে একটি ওয়েব সার্ভারের দিকে নির্দেশ করতে পারেন যার প্রক্সি RPC পোর্টে আছে অথবা সরাসরি RPC-তে। + +পরিশেষে, অভ্যন্তরীণ নেটওয়ার্কগুলিতে অ্যাক্সেস দেওয়ার সবচেয়ে জনপ্রিয় উপায়গুলির মধ্যে একটি হল একটি VPN সংযোগের মাধ্যমে। আপনার ব্যবহারের ক্ষেত্র এবং আপনার নোডে অ্যাক্সেসের প্রয়োজন এমন ব্যবহারকারীর পরিমাণের উপর নির্ভর করে, একটি নিরাপদ VPN সংযোগ একটি বিকল্প হতে পারে। [OpenVPN](https://openvpn.net/) একটি পূর্ণ-বৈশিষ্ট্যযুক্ত SSL VPN যা শিল্প-মান SSL/TLS প্রোটোকল ব্যবহার করে OSI লেয়ার ২ বা ৩ নিরাপদ নেটওয়ার্ক এক্সটেনশন প্রয়োগ করে, শংসাপত্র, স্মার্ট কার্ড, এবং/অথবা ব্যবহারকারীর নাম/পাসওয়ার্ড শংসাপত্রের উপর ভিত্তি করে নমনীয় ক্লায়েন্ট প্রমাণীকরণ পদ্ধতি সমর্থন করে, এবং VPN ভার্চুয়াল ইন্টারফেসে প্রয়োগ করা ফায়ারওয়াল নিয়ম ব্যবহার করে ব্যবহারকারী বা গোষ্ঠী-নির্দিষ্ট অ্যাক্সেস নিয়ন্ত্রণ নীতিগুলির অনুমতি দেয়। + +### নোড পরিচালনা করা {#operating-the-node} + +আপনার নোডটি সঠিকভাবে চলছে কিনা তা নিশ্চিত করতে আপনার নিয়মিত এটি পর্যবেক্ষণ করা উচিত। আপনাকে মাঝে মাঝে রক্ষণাবেক্ষণের কাজ করতে হতে পারে। + +#### একটি নোড অনলাইনে রাখা {#keeping-node-online} + +আপনার নোডকে সব সময় অনলাইনে থাকতে হবে না, তবে নেটওয়ার্কের সাথে সিঙ্কে রাখতে এটিকে যতটা সম্ভব অনলাইনে রাখা উচিত। আপনি এটি পুনরায় চালু করতে বন্ধ করতে পারেন, তবে মনে রাখবেন যে: + +- বন্ধ হতে কয়েক মিনিট সময় লাগতে পারে যদি সাম্প্রতিক স্টেট এখনও ডিস্কে লেখা হচ্ছে। +- জোর করে বন্ধ করলে ডাটাবেসের ক্ষতি হতে পারে যার ফলে আপনাকে পুরো নোডটি পুনরায় সিঙ্ক করতে হবে। +- আপনার ক্লায়েন্ট নেটওয়ার্কের সাথে সিঙ্ক থেকে বেরিয়ে যাবে এবং আপনি যখন এটি পুনরায় চালু করবেন তখন এটি পুনরায় সিঙ্ক করতে হবে। যদিও নোডটি শেষবার বন্ধ হওয়ার স্থান থেকে সিঙ্ক করা শুরু করতে পারে, তবে এটি কতক্ষণ অফলাইন ছিল তার উপর নির্ভর করে প্রক্রিয়াটি সময় নিতে পারে। + +_এটি কনসেন্সাস লেয়ার ভ্যালিডেটর নোডগুলিতে প্রযোজ্য নয়।_ আপনার নোড অফলাইন করলে এটি নির্ভরশীল সমস্ত পরিষেবাগুলিকে প্রভাবিত করবে। আপনি যদি _স্টেকিং_ উদ্দেশ্যে একটি নোড চালাচ্ছেন তবে আপনার ডাউনটাইম যতটা সম্ভব কম করার চেষ্টা করা উচিত। + +#### ক্লায়েন্ট পরিষেবা তৈরি করা {#creating-client-services} + +স্টার্টআপে আপনার ক্লায়েন্টদের স্বয়ংক্রিয়ভাবে চালানোর জন্য একটি পরিষেবা তৈরি করার কথা বিবেচনা করুন। উদাহরণস্বরূপ, লিনাক্স সার্ভারে, একটি পরিষেবা তৈরি করা ভাল অভ্যাস হবে, যেমন, `systemd` দিয়ে, যা সঠিক কনফিগারেশন সহ ক্লায়েন্টকে কার্যকর করে, সীমিত সুযোগ-সুবিধা সহ একজন ব্যবহারকারীর অধীনে এবং স্বয়ংক্রিয়ভাবে পুনরায় চালু হয়। + +#### ক্লায়েন্ট আপডেট করা {#updating-clients} + +আপনাকে আপনার ক্লায়েন্ট সফটওয়্যারটি সর্বশেষ নিরাপত্তা প্যাচ, বৈশিষ্ট্য এবং [EIP](/eips/)-এর সাথে আপ-টু-ডেট রাখতে হবে। বিশেষ করে [হার্ড ফর্কের](/ethereum-forks/) আগে, নিশ্চিত করুন যে আপনি সঠিক ক্লায়েন্ট সংস্করণ চালাচ্ছেন। + +> গুরুত্বপূর্ণ নেটওয়ার্ক আপডেটের আগে, EF তার [ব্লগে](https://blog.ethereum.org) একটি পোস্ট প্রকাশ করে। আপনার নোডের আপডেটের প্রয়োজন হলে আপনার মেইলে একটি বিজ্ঞপ্তি পেতে আপনি [এই ঘোষণাগুলিতে সদস্যতা নিতে পারেন](https://blog.ethereum.org/category/protocol#subscribe)। + +ক্লায়েন্ট আপডেট করা খুব সহজ। প্রতিটি ক্লায়েন্টের তাদের নথিপত্রে নির্দিষ্ট নির্দেশাবলী রয়েছে, তবে প্রক্রিয়াটি সাধারণত শুধু সর্বশেষ সংস্করণ ডাউনলোড করা এবং নতুন এক্সিকিউটেবল দিয়ে ক্লায়েন্টটি পুনরায় চালু করা। ক্লায়েন্টটি যেখান থেকে ছেড়েছিল সেখান থেকে শুরু করা উচিত, তবে আপডেটগুলি প্রয়োগ করা সহ। + +প্রতিটি ক্লায়েন্ট ইমপ্লিমেন্টেশনের একটি মানব-পাঠযোগ্য সংস্করণ স্ট্রিং রয়েছে যা পিয়ার-টু-পিয়ার প্রোটোকলে ব্যবহৃত হয় তবে এটি কমান্ড লাইন থেকেও অ্যাক্সেসযোগ্য। এই সংস্করণ স্ট্রিং ব্যবহারকারীদের পরীক্ষা করতে দেয় যে তারা সঠিক সংস্করণ চালাচ্ছে এবং ব্লক এক্সপ্লোরার এবং অন্যান্য বিশ্লেষণাত্মক সরঞ্জামগুলিকে নেটওয়ার্কে নির্দিষ্ট ক্লায়েন্টগুলির বিতরণ পরিমাপ করতে আগ্রহী করে তোলে। সংস্করণ স্ট্রিং সম্পর্কে আরও তথ্যের জন্য অনুগ্রহ করে স্বতন্ত্র ক্লায়েন্টের নথিপত্র দেখুন। + +#### অতিরিক্ত পরিষেবা চালানো {#running-additional-services} + +আপনার নিজের নোড চালানো আপনাকে এমন পরিষেবাগুলি ব্যবহার করতে দেয় যার জন্য ইথেরিয়াম ক্লায়েন্ট RPC-তে সরাসরি অ্যাক্সেস প্রয়োজন। এগুলি হল ইথেরিয়াম-এর উপর নির্মিত পরিষেবা যেমন [লেয়ার ২ সমাধান](/developers/docs/scaling/#layer-2-scaling), ওয়ালেটের জন্য ব্যাকএন্ড, ব্লক এক্সপ্লোরার, ডেভেলপার টুল এবং অন্যান্য ইথেরিয়াম অবকাঠামো। + +#### নোড পর্যবেক্ষণ করা {#monitoring-the-node} + +আপনার নোড সঠিকভাবে পর্যবেক্ষণ করতে, মেট্রিক্স সংগ্রহ করার কথা বিবেচনা করুন। ক্লায়েন্টরা মেট্রিক্স এন্ডপয়েন্ট সরবরাহ করে যাতে আপনি আপনার নোড সম্পর্কে ব্যাপক ডেটা পেতে পারেন। [InfluxDB](https://www.influxdata.com/get-influxdb/) বা [Prometheus](https://prometheus.io/)-এর মতো টুল ব্যবহার করে ডেটাবেস তৈরি করুন যা আপনি [Grafana](https://grafana.com/)-এর মতো সফটওয়্যারে ভিজ্যুয়ালাইজেশন এবং চার্টে পরিণত করতে পারেন। এই সফটওয়্যারটি ব্যবহার করার জন্য অনেক সেটআপ এবং আপনার নোড এবং পুরো নেটওয়ার্ককে ভিজ্যুয়ালাইজ করার জন্য বিভিন্ন Grafana ড্যাশবোর্ড রয়েছে। উদাহরণস্বরূপ, [Geth পর্যবেক্ষণের উপর টিউটোরিয়াল](/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/) দেখুন। + +আপনার পর্যবেক্ষণের অংশ হিসাবে, আপনার মেশিনের কর্মক্ষমতার দিকে নজর রাখতে ভুলবেন না। আপনার নোডের প্রাথমিক সিঙ্কের সময়, ক্লায়েন্ট সফটওয়্যারটি সিপিইউ এবং র‍্যামের উপর খুব ভারী হতে পারে। Grafana ছাড়াও, আপনি আপনার OS দ্বারা প্রদত্ত টুল যেমন `htop` বা `uptime` ব্যবহার করতে পারেন এটি করার জন্য। + +## আরও পড়ুন {#further-reading} + +- [ইথেরিয়াম স্টেকিং গাইড](https://github.com/SomerEsat/ethereum-staking-guides) - _সোমার এসাত, প্রায়শই আপডেট করা হয়_ +- [গাইড | কীভাবে মেইননেটে ইথেরিয়াম স্টেকিংয়ের জন্য একটি ভ্যালিডেটর সেটআপ করবেন](https://www.coincashew.com/coins/overview-eth/guide-or-how-to-setup-a-validator-on-eth2-mainnet) _– CoinCashew, প্রায়শই আপডেট করা হয়_ +- [টেস্টনেটে ভ্যালিডেটর চালানোর উপর ETHStaker গাইড](https://github.com/remyroy/ethstaker#guides) – _ETHStaker, নিয়মিত আপডেট করা হয়_ +- [ইথেরিয়াম নোডের জন্য স্যাম্পেল AWS ব্লকচেইন নোড রানার অ্যাপ](https://aws-samples.github.io/aws-blockchain-node-runners/docs/Blueprints/Ethereum) - _AWS, প্রায়শই আপডেট করা হয়_ +- [নোড অপারেটরদের জন্য দ্য মার্জ FAQ](https://notes.ethereum.org/@launchpad/node-faq-merge) - _জুলাই ২০২২_ +- [একটি ইথেরিয়াম পূর্ণ যাচাইকৃত নোড হতে হার্ডওয়্যার প্রয়োজনীয়তা বিশ্লেষণ](https://medium.com/coinmonks/analyzing-the-hardware-requirements-to-be-an-ethereum-full-validated-node-dc064f167902) _– আলবার্ট পালাউ, ২৪ সেপ্টেম্বর ২০১৮_ +- [ইথেরিয়াম ফুল নোড চালানো: সামান্য অনুপ্রাণিতদের জন্য একটি নির্দেশিকা](https://medium.com/@JustinMLeroux/running-ethereum-full-nodes-a-guide-for-the-barely-motivated-a8a13e7a0d31) _– জাস্টিন লেরক্স, 7 নভেম্বর 2019_ +- [ইথেরিয়াম মেইননেটে একটি হাইপারলেজার বেসু নোড চালানো: সুবিধা, প্রয়োজনীয়তা এবং সেটআপ](https://pegasys.tech/running-a-hyperledger-besu-node-on-the-ethereum-mainnet-benefits-requirements-and-setup/) _– ফেলিপ ফারাগি, ৭ মে ২০২০_ +- [পর্যবেক্ষণ স্ট্যাকের সাথে নেদারমাইন্ড ইথেরিয়াম ক্লায়েন্ট স্থাপন](https://medium.com/nethermind-eth/deploying-nethermind-ethereum-client-with-monitoring-stack-55ce1622edbd) _– Nethermind.eth, ৮ জুলাই ২০২০_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [নোড এবং ক্লায়েন্ট](/developers/docs/nodes-and-clients/) +- [ব্লক](/developers/docs/blocks/) +- [নেটওয়ার্ক](/developers/docs/networks/) diff --git a/public/content/translations/bn/developers/docs/oracles/index.md b/public/content/translations/bn/developers/docs/oracles/index.md new file mode 100644 index 00000000000..40edd14304d --- /dev/null +++ b/public/content/translations/bn/developers/docs/oracles/index.md @@ -0,0 +1,433 @@ +--- +title: "ওরাকেলস" +description: "ওরাকেলস ইথেরিয়াম স্মার্ট কন্ট্র্যাক্টকে বাস্তব-বিশ্বের ডেটাতে অ্যাক্সেস প্রদান করে, ব্যবহারকারীদের জন্য আরও বেশি ব্যবহারের ক্ষেত্র এবং বৃহত্তর মান আনলক করে।" +lang: bn +--- + +ওরাকেলস হল এমন অ্যাপ্লিকেশন যা ডেটা ফিড তৈরি করে যা স্মার্ট কন্ট্র্যাক্টের জন্য ব্লকচেইনে অফচেইন ডেটা উৎস উপলব্ধ করে। এটি প্রয়োজনীয় কারণ Ethereum-ভিত্তিক স্মার্ট কন্ট্র্যাক্টগুলি ডিফল্টরূপে, ব্লকচেইন নেটওয়ার্কের বাইরে সঞ্চিত তথ্য অ্যাক্সেস করতে পারে না। + +স্মার্ট কন্ট্র্যাক্টকে অফচেইন ডেটা ব্যবহার করে কার্যকর করার ক্ষমতা দেওয়া ডিসেন্ট্রালাইজড এপ্লিকেশনগুলির উপযোগিতা এবং মান প্রসারিত করে। উদাহরণস্বরূপ, অনচেইন প্রেডিকশন মার্কেটগুলি ওরাকেলের উপর নির্ভর করে ফলাফলের তথ্য সরবরাহ করার জন্য যা তারা ব্যবহারকারীর পূর্বাভাসকে যাচাই করতে ব্যবহার করে। ধরুন অ্যালিস 20 ETH বাজি ধরেছে কে পরবর্তী মার্কিন যুক্তরাষ্ট্রের প্রেসিডেন্ট হবে। সেক্ষেত্রে, অ্যালিস পেআউটের জন্য যোগ্য কিনা তা নির্ধারণ করতে এবং নির্বাচনের ফলাফল নিশ্চিত করতে প্রেডিকশন-মার্কেট ডিএ্যাপটির একটি ওরাকেলের প্রয়োজন। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি ধরে নেয় যে পাঠক [নোড](/developers/docs/nodes-and-clients/), [কনসেন্সাস মেকানিজম](/developers/docs/consensus-mechanisms/), এবং [EVM](/developers/docs/evm/) সহ Ethereum-এর মৌলিক বিষয়গুলির সাথে পরিচিত। আপনার [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) এবং [স্মার্ট কন্ট্র্যাক্ট অ্যানাটমি](/developers/docs/smart-contracts/anatomy/), বিশেষ করে [ইভেন্ট](/glossary/#events) সম্পর্কেও ভালো ধারণা থাকা উচিত। + +## একটি ব্লকচেইন ওরাকেল কী? {#what-is-a-blockchain-oracle} + +ওরাকেলস হল এমন অ্যাপ্লিকেশন যা ব্লকচেইনে চলমান স্মার্ট কন্ট্র্যাক্টে বাহ্যিক তথ্য (অর্থাৎ, অফচেইন সঞ্চিত তথ্য) উৎস, যাচাই এবং প্রেরণ করে। অফচেইন ডেটা “পুল” করা এবং এটিকে Ethereum-এ সম্প্রচার করা ছাড়াও, ওরাকেলগুলি ব্লকচেইন থেকে বাহ্যিক সিস্টেমে তথ্য “পুশ” করতে পারে, যেমন, ব্যবহারকারী একটি Ethereum লেনদেনের মাধ্যমে একটি ফি পাঠালে একটি স্মার্ট লক আনলক করা। + +একটি ওরাকেল ছাড়া, একটি স্মার্ট কন্ট্র্যাক্ট সম্পূর্ণরূপে অনচেইন ডেটার মধ্যে সীমাবদ্ধ থাকবে। + +ওরাকেলস ডেটার উৎস (এক বা একাধিক উৎস), ট্রাস্ট মডেল (কেন্দ্রীয় বা বিকেন্দ্রীভূত), এবং সিস্টেম আর্কিটেকচার (অবিলম্বে-পড়া, প্রকাশ-সাবস্ক্রাইব, এবং অনুরোধ-প্রতিক্রিয়া) এর উপর ভিত্তি করে ভিন্ন হয়। আমরা ওরাকলের মধ্যে পার্থক্য করতে পারি যে তারা অনচেইন কন্ট্র্যাক্ট (ইনপুট ওরাকেল) দ্বারা ব্যবহারের জন্য বাহ্যিক ডেটা পুনরুদ্ধার করে, ব্লকচেইন থেকে অফচেইন অ্যাপ্লিকেশনে (আউটপুট ওরাকেল) তথ্য পাঠায়, বা অফচেইন (কম্পিউটেশনাল ওরাকেল) কম্পিউটেশনাল কাজ করে। + +## স্মার্ট কন্ট্র্যাক্টের ওরাকেলের প্রয়োজন কেন? {#why-do-smart-contracts-need-oracles} + +অনেক ডেভেলপার স্মার্ট কন্ট্র্যাক্টকে ব্লকচেইনের নির্দিষ্ট ঠিকানায় চলমান কোড হিসাবে দেখেন। যাইহোক, [স্মার্ট কন্ট্র্যাক্টের একটি আরও সাধারণ দৃষ্টিভঙ্গি](/smart-contracts/) হল যে সেগুলি স্ব-নির্বাহী সফ্টওয়্যার প্রোগ্রাম যা নির্দিষ্ট শর্ত পূরণ হয়ে গেলে পক্ষগুলির মধ্যে চুক্তি প্রয়োগ করতে সক্ষম - তাই “স্মার্ট কন্ট্র্যাক্ট” শব্দটি। + +কিন্তু মানুষের মধ্যে চুক্তি কার্যকর করার জন্য স্মার্ট কন্ট্র্যাক্ট ব্যবহার করা সহজ নয়, কারণ Ethereum নির্ধারক। একটি [নির্ধারক সিস্টেম](https://en.wikipedia.org/wiki/Deterministic_algorithm) হল এমন একটি যা একটি প্রাথমিক অবস্থা এবং একটি নির্দিষ্ট ইনপুট দেওয়া হলে সর্বদা একই ফলাফল তৈরি করে, যার অর্থ ইনপুট থেকে আউটপুট গণনা করার প্রক্রিয়াতে কোনও এলোমেলোতা বা ভিন্নতা নেই। + +নির্ধারক এক্সিকিউশন অর্জনের জন্য, ব্লকচেইনগুলি _শুধুমাত্র_ ব্লকচেইনেই সঞ্চিত ডেটা ব্যবহার করে সাধারণ বাইনারি (সত্য/মিথ্যা) প্রশ্নগুলির উপর কনসেন্সাস পৌঁছানোর জন্য নোডগুলিকে সীমাবদ্ধ করে। এই ধরনের প্রশ্নের উদাহরণগুলির মধ্যে রয়েছে: + +- “অ্যাকাউন্টের মালিক (একটি পাবলিক কী দ্বারা চিহ্নিত) কি এই লেনদেনটি জোড়া প্রাইভেট কী দিয়ে স্বাক্ষর করেছেন?” +- “এই অ্যাকাউন্টে লেনদেন কভার করার জন্য যথেষ্ট তহবিল আছে কি?” +- “এই স্মার্ট কন্ট্র্যাক্টের প্রেক্ষাপটে এই লেনদেনটি বৈধ?”, ইত্যাদি। + +যদি ব্লকচেইনগুলি বাহ্যিক উত্স থেকে (অর্থাৎ, বাস্তব বিশ্ব থেকে) তথ্য পায়, তবে নির্ধারকতা অর্জন করা অসম্ভব হবে, যা নোডগুলিকে ব্লকচেইনের অবস্থার পরিবর্তনে একমত হতে বাধা দেবে। উদাহরণস্বরূপ একটি স্মার্ট কন্ট্র্যাক্ট নিন যা একটি প্রচলিত মূল্য API থেকে প্রাপ্ত বর্তমান ETH-USD বিনিময় হারের উপর ভিত্তি করে একটি লেনদেন সম্পাদন করে। এই সংখ্যাটি ঘন ঘন পরিবর্তন হওয়ার সম্ভাবনা রয়েছে (উল্লেখ করার মতো নয় যে APIটি বাতিল বা হ্যাক হতে পারে), যার অর্থ একই কন্ট্র্যাক্ট কোড নির্বাহকারী নোডগুলি বিভিন্ন ফলাফলে পৌঁছাবে। + +Ethereum-এর মতো একটি পাবলিক ব্লকচেইনের জন্য, বিশ্বজুড়ে হাজার হাজার নোড লেনদেন প্রক্রিয়াকরণ করে, নির্ধারকতা অত্যন্ত গুরুত্বপূর্ণ। সত্যের উৎস হিসাবে কাজ করার জন্য কোনও কেন্দ্রীয় কর্তৃপক্ষ না থাকায়, একই লেনদেন প্রয়োগ করার পরে একই অবস্থায় পৌঁছানোর জন্য নোডগুলির পদ্ধতির প্রয়োজন। এমন একটি ক্ষেত্রে যেখানে নোড A একটি স্মার্ট কন্ট্র্যাক্টের কোড চালায় এবং ফলস্বরূপ "3" পায়, যখন নোড B একই লেনদেন চালানোর পরে "7" পায়, যা কনসেন্সাস ভেঙে দেবে এবং একটি ডিসেন্ট্রালাইজড কম্পিউটিং প্ল্যাটফর্ম হিসাবে Ethereum-এর মানকে নির্মূল করবে। + +এই দৃশ্যকল্পটি বাহ্যিক উৎস থেকে তথ্য টানতে ব্লকচেইন ডিজাইন করার সমস্যাটিকেও তুলে ধরে। যাইহোক, ওরাকেলস অফচেইন উৎস থেকে তথ্য নিয়ে এবং স্মার্ট কন্ট্র্যাক্টের ব্যবহারের জন্য ব্লকচেইনে সংরক্ষণ করে এই সমস্যার সমাধান করে। যেহেতু অনচেইনে সঞ্চিত তথ্য অপরিবর্তনীয় এবং সর্বজনীনভাবে উপলব্ধ, তাই Ethereum নোডগুলি কনসেন্সাস না ভেঙে অবস্থার পরিবর্তনগুলি গণনা করতে ওরাকেল আমদানি করা অফচেইন ডেটা নিরাপদে ব্যবহার করতে পারে। + +এটি করার জন্য, একটি ওরাকেল সাধারণত একটি স্মার্ট কন্ট্র্যাক্ট অনচেইনে চলমান এবং কিছু অফচেইন উপাদান দিয়ে তৈরি। অনচেইন কন্ট্র্যাক্ট অন্যান্য স্মার্ট কন্ট্র্যাক্ট থেকে ডেটার জন্য অনুরোধ গ্রহণ করে, যা এটি অফচেইন উপাদানে (একটি ওরাকেল নোড বলা হয়) প্রেরণ করে। এই ওরাকেল নোড ডেটা উৎস জিজ্ঞাসা করতে পারে—উদাহরণস্বরূপ, অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস (API) ব্যবহার করে—এবং স্মার্ট কন্ট্র্যাক্টের সংগ্রহস্থলে অনুরোধ করা ডেটা সঞ্চয় করতে লেনদেন পাঠাতে পারে। + +মূলত, একটি ব্লকচেইন ওরাকেল ব্লকচেইন এবং বাহ্যিক পরিবেশের মধ্যে তথ্যের ব্যবধানকে ব্রিজ করে, “হাইব্রিড স্মার্ট কন্ট্র্যাক্ট” তৈরি করে। একটি হাইব্রিড স্মার্ট কন্ট্র্যাক্ট হল এমন একটি যা অনচেইন কন্ট্র্যাক্ট কোড এবং অফচেইন পরিকাঠামোর সংমিশ্রণের উপর ভিত্তি করে কাজ করে। ডিসেন্ট্রালাইজড প্রেডিকশন মার্কেটগুলি হাইব্রিড স্মার্ট কন্ট্র্যাক্টের একটি চমৎকার উদাহরণ। অন্যান্য উদাহরণের মধ্যে শস্য বীমা স্মার্ট কন্ট্র্যাক্ট অন্তর্ভুক্ত থাকতে পারে যা অর্থ প্রদান করে যখন ওরাকেলের একটি সেট নির্ধারণ করে যে নির্দিষ্ট আবহাওয়ার ঘটনা ঘটেছে। + +## ওরাকেল সমস্যাটি কী? {#the-oracle-problem} + +ওরাকেলস একটি গুরুত্বপূর্ণ সমস্যার সমাধান করে, তবে কিছু জটিলতাও নিয়ে আসে, যেমন: + +- আমরা কীভাবে যাচাই করব যে ইনজেক্ট করা তথ্য সঠিক উৎস থেকে নেওয়া হয়েছে বা এতে কোনও কারচুপি করা হয়নি? + +- আমরা কীভাবে নিশ্চিত করব যে এই ডেটা সর্বদা উপলব্ধ এবং নিয়মিত আপডেট করা হয়? + +তথাকথিত “ওরাকেল সমস্যা” ব্লকচেইন ওরাকেল ব্যবহার করে স্মার্ট কন্ট্র্যাক্টে ইনপুট পাঠানোর সাথে আসা সমস্যাগুলিকে প্রদর্শন করে। একটি স্মার্ট কন্ট্র্যাক্ট সঠিকভাবে কার্যকর করার জন্য একটি ওরাকেল থেকে ডেটা সঠিক হতে হবে। অধিকন্তু, সঠিক তথ্য প্রদানের জন্য ওরাকেল অপারেটরদের ‘বিশ্বাস’ করা স্মার্ট কন্ট্র্যাক্টের ‘বিশ্বাসহীন’ দিকটিকে দুর্বল করে। + +বিভিন্ন ওরাকেল ওরাকেল সমস্যার বিভিন্ন সমাধান অফার করে, যা আমরা পরে অন্বেষণ করব। ওরাকেলস সাধারণত নিম্নলিখিত চ্যালেঞ্জগুলি কতটা ভালোভাবে পরিচালনা করতে পারে তার উপর ভিত্তি করে মূল্যায়ন করা হয়: + +1. **সঠিকতা**: একটি ওরাকেল অবৈধ অফচেইন ডেটার উপর ভিত্তি করে স্মার্ট কন্ট্র্যাক্টকে অবস্থার পরিবর্তন ঘটাতে দেবে না। একটি ওরাকেলকে অবশ্যই ডেটার _সত্যতা_ এবং _অখণ্ডতা_ নিশ্চিত করতে হবে। সত্যতা মানে ডেটা সঠিক উৎস থেকে পাওয়া গেছে, যখন অখণ্ডতা মানে ডেটা অক্ষত ছিল (অর্থাৎ, পরিবর্তিত হয়নি) অনচেইনে পাঠানোর আগে। + +2. **উপলব্ধতা**: একটি ওরাকেল স্মার্ট কন্ট্র্যাক্টগুলিকে কাজ চালানো এবং অবস্থার পরিবর্তন ঘটাতে দেরি বা বাধা দেবে না। এর মানে হল যে একটি ওরাকেল থেকে ডেটা অবশ্যই কোনো বাধা ছাড়াই _অনুরোধে উপলব্ধ_ থাকতে হবে। + +3. **ইনসেনটিভ সামঞ্জস্য**: একটি ওরাকেলকে অফচেইন ডেটা প্রদানকারীদের স্মার্ট কন্ট্র্যাক্টে সঠিক তথ্য জমা দেওয়ার জন্য উৎসাহিত করা উচিত। ইনসেনটিভ সামঞ্জস্যের মধ্যে _অ্যাট্রিবিউটেবিলিটি_ এবং _অ্যাকাউন্টেবিলিটি_ জড়িত। অ্যাট্রিবিউটেবিলিটি একটি বাহ্যিক তথ্যের একটি অংশকে তার প্রদানকারীর সাথে লিঙ্ক করার অনুমতি দেয়, যখন অ্যাকাউন্টেবিলিটি ডেটা প্রদানকারীদের তারা যে তথ্য দেয় তার সাথে বন্ড করে, যাতে তাদের প্রদত্ত তথ্যের মানের উপর ভিত্তি করে পুরস্কৃত বা দণ্ডিত করা যায়। + +## একটি ব্লকচেইন ওরাকেল পরিষেবা কীভাবে কাজ করে? {#how-does-a-blockchain-oracle-service-work} + +### ব্যবহারকারী {#users} + +ব্যবহারকারীরা হল সত্তা (যেমন, স্মার্ট কন্ট্র্যাক্ট) যাদের নির্দিষ্ট কাজগুলি সম্পূর্ণ করার জন্য ব্লকচেইনের বাইরে তথ্যের প্রয়োজন হয়। একটি ওরাকেল পরিষেবার প্রাথমিক কর্মপ্রবাহ ব্যবহারকারীর ওরাকেল কন্ট্র্যাক্টে একটি ডেটা অনুরোধ পাঠানোর মাধ্যমে শুরু হয়। ডেটা অনুরোধগুলি সাধারণত নিম্নলিখিত কিছু বা সমস্ত প্রশ্নের উত্তর দেবে: + +1. অফচেইন নোড অনুরোধ করা তথ্যের জন্য কোন উৎসগুলির সাথে পরামর্শ করতে পারে? + +2. রিপোর্টাররা কীভাবে ডেটা উৎস থেকে তথ্য প্রক্রিয়া করে এবং দরকারী ডেটা পয়েন্ট বের করে? + +3. ডেটা পুনরুদ্ধারে কতগুলি ওরাকেল নোড অংশগ্রহণ করতে পারে? + +4. ওরাকেল রিপোর্টে অসঙ্গতিগুলি কীভাবে পরিচালনা করা উচিত? + +5. জমাগুলি ফিল্টার করতে এবং রিপোর্টগুলিকে একটি একক মানে একত্রিত করতে কোন পদ্ধতি প্রয়োগ করা উচিত? + +### ওরাকেল কন্ট্র্যাক্ট {#oracle-contract} + +ওরাকেল কন্ট্র্যাক্ট হল ওরাকেল পরিষেবার জন্য অনচেইন উপাদান। এটি অন্যান্য কন্ট্র্যাক্ট থেকে ডেটা অনুরোধের জন্য শোনে, ওরাকেল নোডগুলিতে ডেটা কোয়েরি রিলে করে এবং ক্লায়েন্ট কন্ট্র্যাক্টগুলিতে ফেরত ডেটা সম্প্রচার করে। এই কন্ট্র্যাক্টটি অনুরোধকারী কন্ট্র্যাক্টে পাঠানোর জন্য একটি সামগ্রিক মান তৈরি করতে ফেরত ডেটা পয়েন্টগুলিতে কিছু গণনাও করতে পারে। + +ওরাকেল কন্ট্র্যাক্ট কিছু ফাংশন প্রকাশ করে যা ক্লায়েন্ট কন্ট্র্যাক্টগুলি ডেটা অনুরোধ করার সময় কল করে। একটি নতুন কোয়েরি পাওয়ার পরে, স্মার্ট কন্ট্র্যাক্ট ডেটা অনুরোধের বিবরণ সহ একটি [লগ ইভেন্ট](/developers/docs/smart-contracts/anatomy/#events-and-logs) নির্গত করবে। এটি লগে সাবস্ক্রাইব করা অফচেইন নোডগুলিকে অবহিত করে (সাধারণত JSON-RPC `eth_subscribe` কমান্ডের মতো কিছু ব্যবহার করে), যারা লগ ইভেন্টে সংজ্ঞায়িত ডেটা পুনরুদ্ধার করতে এগিয়ে যায়। + +Pedro Costa-এর দ্বারা নিচে একটি [উদাহরণ ওরাকেল কন্ট্র্যাক্ট](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) দেওয়া হল। এটি একটি সাধারণ ওরাকেল পরিষেবা যা অন্যান্য স্মার্ট কন্ট্র্যাক্টের অনুরোধে অফচেইন API জিজ্ঞাসা করতে পারে এবং অনুরোধ করা তথ্য ব্লকচেইনে সংরক্ষণ করতে পারে: + +```solidity +pragma solidity >=0.4.21 <0.6.0; + +contract Oracle { + Request[] requests; //কন্ট্র্যাক্টে করা অনুরোধের তালিকা + uint currentId = 0; //ক্রমবর্ধমান অনুরোধ আইডি + uint minQuorum = 2; //চূড়ান্ত ফলাফল ঘোষণার আগে প্রাপ্ত প্রতিক্রিয়ার সর্বনিম্ন সংখ্যা + uint totalOracleCount = 3; // হার্ডকোডেড ওরাকেল সংখ্যা + + // একটি সাধারণ এপিআই অনুরোধ সংজ্ঞায়িত করে + struct Request { + uint id; //অনুরোধ আইডি + string urlToQuery; //API ইউআরএল + string attributeToFetch; //প্রতিক্রিয়ায় পুনরুদ্ধার করার জন্য json অ্যাট্রিবিউট (কী) + string agreedValue; //কী থেকে মান + mapping(uint => string) answers; //ওরাকেল দ্বারা প্রদত্ত উত্তর + mapping(address => uint) quorum; //ওরাকেল যা উত্তরটি জিজ্ঞাসা করবে (1=ওরাকেল ভোট দেয়নি, 2=ওরাকেল ভোট দিয়েছে) + } + + //ইভেন্ট যা ব্লকচেইনের বাইরে ওরাকেলকে ট্রিগার করে + event NewRequest ( + uint id, + string urlToQuery, + string attributeToFetch + ); + + //যখন চূড়ান্ত ফলাফলের উপর একটি কনসেন্সাস থাকে তখন ট্রিগার হয় + event UpdatedRequest ( + uint id, + string urlToQuery, + string attributeToFetch, + string agreedValue + ); + + function createRequest ( + string memory _urlToQuery, + string memory _attributeToFetch + ) + public + { + uint length = requests.push(Request(currentId, _urlToQuery, _attributeToFetch, "")); + Request storage r = requests[length-1]; + + // হার্ডকোডেড ওরাকেলের ঠিকানা + r.quorum[address(0x6c2339b46F41a06f09CA0051ddAD54D1e582bA77)] = 1; + r.quorum[address(0xb5346CF224c02186606e5f89EACC21eC25398077)] = 1; + r.quorum[address(0xa2997F1CA363D11a0a35bB1Ac0Ff7849bc13e914)] = 1; + + // ব্লকচেইনের বাইরে ওরাকেল দ্বারা সনাক্ত করার জন্য একটি ইভেন্ট চালু করুন + emit NewRequest ( + currentId, + _urlToQuery, + _attributeToFetch + ); + + // অনুরোধ আইডি বাড়ান + currentId++; + } + + //ওরাকেল দ্বারা তার উত্তর রেকর্ড করার জন্য কল করা হয় + function updateRequest ( + uint _id, + string memory _valueRetrieved + ) public { + + Request storage currRequest = requests[_id]; + + //বিশ্বস্ত ওরাকেলের তালিকায় ওরাকেল আছে কিনা তা পরীক্ষা করুন + //এবং যদি ওরাকেল এখনও ভোট না দিয়ে থাকে + if(currRequest.quorum[address(msg.sender)] == 1){ + + //চিহ্নিত করা যে এই ঠিকানাটি ভোট দিয়েছে + currRequest.quorum[msg.sender] = 2; + + //উত্তরগুলির "অ্যারে" এর মাধ্যমে পুনরাবৃত্তি করুন যতক্ষণ না একটি অবস্থান খালি থাকে এবং পুনরুদ্ধার করা মানটি সংরক্ষণ করুন + uint tmpI = 0; + bool found = false; + while(!found) { + //প্রথম খালি স্লট খুঁজুন + if(bytes(currRequest.answers[tmpI]).length == 0){ + found = true; + currRequest.answers[tmpI] = _valueRetrieved; + } + tmpI++; + } + + uint currentQuorum = 0; + + //ওরাকেল তালিকার মাধ্যমে পুনরাবৃত্তি করুন এবং পর্যাপ্ত ওরাকেল (ন্যূনতম কোরাম) আছে কিনা তা পরীক্ষা করুন + //বর্তমানটির মতো একই উত্তর ভোট দিয়েছে + for(uint i = 0; i < totalOracleCount; i++){ + bytes memory a = bytes(currRequest.answers[i]); + bytes memory b = bytes(_valueRetrieved); + + if(keccak256(a) == keccak256(b)){ + currentQuorum++; + if(currentQuorum >= minQuorum){ + currRequest.agreedValue = _valueRetrieved; + emit UpdatedRequest ( + currRequest.id, + currRequest.urlToQuery, + currRequest.attributeToFetch, + currRequest.agreedValue + ); + } + } + } + } + } +} +``` + +### ওরাকেল নোড {#oracle-nodes} + +ওরাকেল নোড হল ওরাকেল পরিষেবার অফচেইন উপাদান। এটি বাহ্যিক উৎস থেকে তথ্য বের করে, যেমন তৃতীয় পক্ষের সার্ভারে হোস্ট করা API, এবং স্মার্ট কন্ট্র্যাক্ট দ্বারা ব্যবহারের জন্য এটি অনচেইন রাখে। ওরাকেল নোড অনচেইন ওরাকেল কন্ট্র্যাক্ট থেকে ইভেন্ট শোনে এবং লগে বর্ণিত কাজটি সম্পূর্ণ করতে এগিয়ে যায়। + +ওরাকেল নোডগুলির জন্য একটি সাধারণ কাজ হল একটি API পরিষেবাতে একটি [HTTP GET](https://www.w3schools.com/tags/ref_httpmethods.asp) অনুরোধ পাঠানো, প্রাসঙ্গিক ডেটা বের করার জন্য প্রতিক্রিয়া পার্স করা, একটি ব্লকচেইন-পঠনযোগ্য আউটপুটে ফর্ম্যাট করা, এবং এটিকে ওরাকেল কন্ট্র্যাক্টে একটি লেনদেনে অন্তর্ভুক্ত করে অনচেইন পাঠানো। ওরাকেল নোডকে “সত্যতা প্রমাণ” ব্যবহার করে জমা দেওয়া তথ্যের বৈধতা এবং অখণ্ডতা প্রত্যয়ন করতেও হতে পারে, যা আমরা পরে অন্বেষণ করব। + +গ্যাসের খরচ এবং ব্লকের আকারের সীমাবদ্ধতার কারণে কম্পিউটেশনাল ওরাকেলগুলি অফচেইন নোডের উপর নির্ভর করে এমন কম্পিউটেশনাল কাজগুলি সম্পাদন করতে যা অনচেইনে চালানো अव्यবহারিক হবে। উদাহরণস্বরূপ, ওরাকেল নোডকে একটি যাচাইযোগ্য র্যান্ডম ফিগার তৈরি করার দায়িত্ব দেওয়া হতে পারে (যেমন, ব্লকচেইন-ভিত্তিক গেমগুলির জন্য)। + +## ওরাকেল ডিজাইন প্যাটার্ন {#oracle-design-patterns} + +ওরাকেলস বিভিন্ন ধরনের হয়, যার মধ্যে রয়েছে _immediate-read_, _publish-subscribe_, এবং _request-response_, যার মধ্যে পরবর্তী দুটি Ethereum স্মার্ট কন্ট্র্যাক্টগুলির মধ্যে সবচেয়ে জনপ্রিয়। এখানে আমরা সংক্ষেপে প্রকাশ-সাবস্ক্রাইব এবং অনুরোধ-প্রতিক্রিয়া মডেলগুলি বর্ণনা করি। + +### প্রকাশ-সাবস্ক্রাইব ওরাকেল {#publish-subscribe-oracles} + +এই ধরনের ওরাকেল একটি “ডেটা ফিড” প্রকাশ করে যা অন্যান্য কন্ট্র্যাক্ট তথ্যের জন্য নিয়মিত পড়তে পারে। এই ক্ষেত্রে ডেটা ঘন ঘন পরিবর্তিত হবে বলে আশা করা হয়, তাই ক্লায়েন্ট কন্ট্র্যাক্টগুলিকে ওরাকেলের সংগ্রহস্থলে ডেটার আপডেটের জন্য শুনতে হবে। একটি উদাহরণ হল একটি ওরাকেল যা ব্যবহারকারীদের সর্বশেষ ETH-USD মূল্যের তথ্য প্রদান করে। + +### অনুরোধ-প্রতিক্রিয়া ওরাকেল {#request-response-oracles} + +একটি অনুরোধ-প্রতিক্রিয়া সেটআপ ক্লায়েন্ট কন্ট্র্যাক্টকে একটি প্রকাশ-সাবস্ক্রাইব ওরাকেল দ্বারা প্রদত্ত ডেটা ছাড়া অন্য যেকোনো ডেটা অনুরোধ করার অনুমতি দেয়। যখন ডেটাসেট একটি স্মার্ট কন্ট্র্যাক্টের সংগ্রহস্থলে সংরক্ষণ করার জন্য খুব বড় হয়, এবং/অথবা ব্যবহারকারীদের যেকোনো সময়ে ডেটার একটি ছোট অংশের প্রয়োজন হয় তখন অনুরোধ-প্রতিক্রিয়া ওরাকেলগুলি আদর্শ। + +যদিও প্রকাশ-সাবস্ক্রাইব মডেলের চেয়ে বেশি জটিল, অনুরোধ-প্রতিক্রিয়া ওরাকেলগুলি মূলত আমরা পূর্ববর্তী বিভাগে যা বর্ণনা করেছি। ওরাকেলের একটি অনচেইন উপাদান থাকবে যা একটি ডেটা অনুরোধ গ্রহণ করে এবং প্রক্রিয়াকরণের জন্য এটি একটি অফচেইন নোডে প্রেরণ করে। + +ডেটা কোয়েরি শুরু করা ব্যবহারকারীদের অবশ্যই অফচেইন উৎস থেকে তথ্য পুনরুদ্ধারের খরচ বহন করতে হবে। ক্লায়েন্ট কন্ট্র্যাক্টকে অবশ্যই অনুরোধে নির্দিষ্ট করা কলব্যাক ফাংশনের মাধ্যমে প্রতিক্রিয়া ফেরত দেওয়ার জন্য ওরাকেল কন্ট্র্যাক্ট দ্বারা হওয়া গ্যাস খরচ কভার করার জন্য তহবিল সরবরাহ করতে হবে। + +## কেন্দ্রীয় বনাম বিকেন্দ্রীভূত ওরাকেল {#types-of-oracles} + +### কেন্দ্রীয় ওরাকেল {#centralized-oracles} + +একটি কেন্দ্রীয় ওরাকেল একটি একক সত্তা দ্বারা নিয়ন্ত্রিত হয় যা অফচেইন তথ্য একত্রিত করার জন্য এবং অনুরোধ অনুযায়ী ওরাকেল কন্ট্র্যাক্টের ডেটা আপডেট করার জন্য দায়ী। কেন্দ্রীয় ওরাকেলগুলি দক্ষ কারণ তারা সত্যের একটি একক উৎসের উপর নির্ভর করে। তারা এমন ক্ষেত্রে আরও ভাল কাজ করতে পারে যেখানে মালিকানাধীন ডেটাসেটগুলি মালিক দ্বারা সরাসরি একটি বহুল স্বীকৃত স্বাক্ষর সহ প্রকাশিত হয়। তবে, এর কিছু অসুবিধাও রয়েছে: + +#### কম সঠিকতার গ্যারান্টি {#low-correctness-guarantees} + +কেন্দ্রীয় ওরাকেলগুলির সাথে, প্রদত্ত তথ্য সঠিক কিনা তা নিশ্চিত করার কোনও উপায় নেই। এমনকি "খ্যাতিমান" প্রদানকারীরাও অসৎ হতে পারে বা হ্যাক হতে পারে। যদি ওরাকেলটি দুর্নীতিগ্রস্ত হয়ে পড়ে, তবে স্মার্ট কন্ট্র্যাক্টগুলি খারাপ ডেটার উপর ভিত্তি করে কার্যকর হবে। + +#### দুর্বল প্রাপ্যতা {#poor-availability} + +কেন্দ্রীয় ওরাকেলগুলি সর্বদা অন্যান্য স্মার্ট কন্ট্র্যাক্টগুলিতে অফচেইন ডেটা উপলব্ধ করার নিশ্চয়তা দেয় না। যদি প্রদানকারী পরিষেবাটি বন্ধ করার সিদ্ধান্ত নেয় বা কোনও হ্যাকার ওরাকেলের অফচেইন উপাদান হাইজ্যাক করে, তবে আপনার স্মার্ট কন্ট্র্যাক্টটি ডিনায়েল-অফ-সার্ভিস (DoS) আক্রমণের ঝুঁকিতে থাকে। + +#### দুর্বল ইনসেনটিভ সামঞ্জস্যতা {#poor-incentive-compatibility} + +কেন্দ্রীয় ওরাকেলগুলিতে প্রায়শই ডেটা প্রদানকারীর জন্য সঠিক/অপরিবর্তিত তথ্য পাঠানোর জন্য দুর্বলভাবে ডিজাইন করা বা অস্তিত্বহীন ইনসেনটিভ থাকে। সঠিকতার জন্য একটি ওরাকেলকে অর্থ প্রদান করা সততার নিশ্চয়তা দেয় না। স্মার্ট কন্ট্র্যাক্ট দ্বারা নিয়ন্ত্রিত মূল্যের পরিমাণ বাড়ার সাথে সাথে এই সমস্যাটি আরও বড় হয়। + +### বিকেন্দ্রীভূত ওরাকেল {#decentralized-oracles} + +ডিসেন্ট্রালাইজড ওরাকেলগুলি ব্যর্থতার একক পয়েন্টগুলি দূর করে কেন্দ্রীয় ওরাকেলগুলির সীমাবদ্ধতাগুলি কাটিয়ে ওঠার জন্য ডিজাইন করা হয়েছে। একটি ডিসেন্ট্রালাইজড ওরাকেল পরিষেবা একটি পিয়ার-টু-পিয়ার নেটওয়ার্কে একাধিক অংশগ্রহণকারী নিয়ে গঠিত যা একটি স্মার্ট কন্ট্র্যাক্টে পাঠানোর আগে অফচেইন ডেটার উপর কনসেন্সাস গঠন করে। + +একটি ডিসেন্ট্রালাইজড ওরাকেল (আদর্শভাবে) অনুমতিহীন, বিশ্বাসহীন এবং একটি কেন্দ্রীয় পক্ষের প্রশাসন থেকে মুক্ত হওয়া উচিত; বাস্তবে, ওরাকেলগুলির মধ্যে ডিসেন্ট্রালাইজেশন একটি স্পেকট্রামের উপর রয়েছে। সেখানে আধা-ডিসেন্ট্রালাইজড ওরাকেল নেটওয়ার্ক রয়েছে যেখানে যে কেউ অংশগ্রহণ করতে পারে, কিন্তু একজন “মালিক” সহ যিনি ঐতিহাসিক কর্মক্ষমতার উপর ভিত্তি করে নোড অনুমোদন এবং অপসারণ করেন। সম্পূর্ণ ডিসেন্ট্রালাইজড ওরাকেল নেটওয়ার্কও বিদ্যমান: এগুলি সাধারণত স্বতন্ত্র ব্লকচেইন হিসাবে চলে এবং নোডগুলির সমন্বয় এবং দুর্ব্যবহারের শাস্তির জন্য সংজ্ঞায়িত কনসেন্সাস মেকানিজম রয়েছে। + +ডিসেন্ট্রালাইজড ওরাকেল ব্যবহার করার নিম্নলিখিত সুবিধাগুলি রয়েছে: + +### উচ্চ সঠিকতার গ্যারান্টি {#high-correctness-guarantees} + +ডিসেন্ট্রালাইজড ওরাকেলগুলি বিভিন্ন পদ্ধতির ব্যবহার করে ডেটার সঠিকতা অর্জনের চেষ্টা করে। এর মধ্যে রয়েছে ফেরত তথ্যের সত্যতা এবং অখণ্ডতা প্রত্যয়নকারী প্রমাণ ব্যবহার করা এবং একাধিক সত্তাকে সম্মিলিতভাবে অফচেইন ডেটার বৈধতার উপর একমত হওয়ার প্রয়োজন। + +#### সত্যতা প্রমাণ {#authenticity-proofs} + +সত্যতা প্রমাণ হল ক্রিপ্টোগ্রাফিক পদ্ধতি যা বাহ্যিক উৎস থেকে পুনরুদ্ধার করা তথ্যের স্বাধীন যাচাইকরণের সুবিধা দেয়। এই প্রমাণগুলি তথ্যের উৎস যাচাই করতে পারে এবং পুনরুদ্ধারের পরে ডেটাতে সম্ভাব্য পরিবর্তনগুলি সনাক্ত করতে পারে। + +সত্যতা প্রমাণের উদাহরণগুলির মধ্যে রয়েছে: + +**ট্রান্সপোর্ট লেয়ার সিকিউরিটি (TLS) প্রমাণ**: ওরাকেল নোড প্রায়ই ট্রান্সপোর্ট লেয়ার সিকিউরিটি (TLS) প্রোটোকলের উপর ভিত্তি করে একটি সুরক্ষিত HTTP সংযোগ ব্যবহার করে বাহ্যিক উৎস থেকে ডেটা পুনরুদ্ধার করে। কিছু ডিসেন্ট্রালাইজড ওরাকেল TLS সেশনগুলি যাচাই করার জন্য (অর্থাৎ, একটি নোড এবং একটি নির্দিষ্ট সার্ভারের মধ্যে তথ্যের বিনিময় নিশ্চিত করা) এবং সেশনের বিষয়বস্তু পরিবর্তন করা হয়নি তা নিশ্চিত করার জন্য সত্যতা প্রমাণ ব্যবহার করে। + +**ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্ট (TEE) প্রত্যয়ন**: একটি [ট্রাস্টেড এক্সিকিউশন এনভায়রনমেন্ট](https://en.wikipedia.org/wiki/Trusted_execution_environment) (TEE) হল একটি স্যান্ডবক্সড কম্পিউটেশনাল পরিবেশ যা তার হোস্ট সিস্টেমের অপারেশনাল প্রক্রিয়া থেকে বিচ্ছিন্ন। TEE নিশ্চিত করে যে কম্পিউটেশন পরিবেশে সংরক্ষিত/ব্যবহৃত যে কোনো অ্যাপ্লিকেশন কোড বা ডেটা অখণ্ডতা, গোপনীয়তা এবং অপরিবর্তনীয়তা বজায় রাখে। ব্যবহারকারীরা বিশ্বস্ত এক্সিকিউশন পরিবেশে একটি অ্যাপ্লিকেশন ইনস্ট্যান্স চলছে তা প্রমাণ করার জন্য একটি প্রত্যয়নও তৈরি করতে পারে। + +ডিসেন্ট্রালাইজড ওরাকেলগুলির নির্দিষ্ট শ্রেণীগুলি ওরাকেল নোড অপারেটরদের TEE প্রত্যয়ন প্রদান করতে চায়। এটি একজন ব্যবহারকারীকে নিশ্চিত করে যে নোড অপারেটর একটি বিশ্বস্ত এক্সিকিউশন পরিবেশে ওরাকেল ক্লায়েন্টের একটি ইনস্ট্যান্স চালাচ্ছে। TEE গুলি বাহ্যিক প্রক্রিয়াগুলিকে একটি অ্যাপ্লিকেশনের কোড এবং ডেটা পরিবর্তন বা পড়া থেকে বাধা দেয়, তাই, সেই প্রত্যয়নগুলি প্রমাণ করে যে ওরাকেল নোড তথ্যটিকে অক্ষত এবং গোপনীয় রেখেছে। + +#### তথ্যের কনসেন্সাস-ভিত্তিক যাচাইকরণ {#consensus-based-validation-of-information} + +কেন্দ্রীয় ওরাকেলগুলি স্মার্ট কন্ট্র্যাক্টে ডেটা সরবরাহ করার সময় সত্যের একটি একক উৎসের উপর নির্ভর করে, যা ভুল তথ্য প্রকাশের সম্ভাবনা তৈরি করে। ডিসেন্ট্রালাইজড ওরাকেলগুলি অফচেইন তথ্য জিজ্ঞাসা করার জন্য একাধিক ওরাকেল নোডের উপর নির্ভর করে এই সমস্যার সমাধান করে। একাধিক উৎস থেকে ডেটা তুলনা করে, ডিসেন্ট্রালাইজড ওরাকেলগুলি অনচেইন কন্ট্র্যাক্টে অবৈধ তথ্য পাঠানোর ঝুঁকি হ্রাস করে। + +তবে, ডিসেন্ট্রালাইজড ওরাকেলগুলিকে একাধিক অফচেইন উৎস থেকে পুনরুদ্ধার করা তথ্যের অসঙ্গতিগুলি মোকাবেলা করতে হবে। তথ্যের মধ্যে পার্থক্য কমানো এবং ওরাকেল কন্ট্র্যাক্টে পাঠানো ডেটা ওরাকেল নোডগুলির সম্মিলিত মতামতকে প্রতিফলিত করে তা নিশ্চিত করার জন্য, ডিসেন্ট্রালাইজড ওরাকেলগুলি নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করে: + +##### ডেটার সঠিকতার উপর ভোট/স্টেকিং + +কিছু ডিসেন্ট্রালাইজড ওরাকেল নেটওয়ার্ক অংশগ্রহণকারীদের ডেটা কোয়েরিগুলির উত্তরের সঠিকতার উপর ভোট বা স্টেক করতে চায় (যেমন, "2020 সালের মার্কিন নির্বাচনে কে জিতেছে?") নেটওয়ার্কের নেটিভ টোকেন ব্যবহার করে। একটি অ্যাগ্রিগেশন প্রোটোকল তারপর ভোট এবং স্টেকগুলিকে একত্রিত করে এবং সংখ্যাগরিষ্ঠদের দ্বারা সমর্থিত উত্তরটিকে বৈধ হিসাবে নেয়। + +যে নোডগুলির উত্তর সংখ্যাগরিষ্ঠদের উত্তর থেকে বিচ্যুত হয় তাদের টোকেনগুলি অন্যদের মধ্যে বিতরণ করে শাস্তি দেওয়া হয় যারা আরও সঠিক মান প্রদান করে। ডেটা সরবরাহ করার আগে নোডগুলিকে একটি বন্ড প্রদান করতে বাধ্য করা সৎ প্রতিক্রিয়াগুলিকে উৎসাহিত করে কারণ তারা রিটার্ন সর্বাধিক করার উদ্দেশ্যে যুক্তিযুক্ত অর্থনৈতিক অভিনেতা হিসাবে বিবেচিত হয়। + +স্টেকিং/ভোটিং ডিসেন্ট্রালাইজড ওরাকেলগুলিকে [Sybil আক্রমণ](/glossary/#sybil-attack) থেকে রক্ষা করে যেখানে ক্ষতিকারক অভিনেতারা কনসেন্সাস সিস্টেমকে গেম করার জন্য একাধিক পরিচয় তৈরি করে। যাইহোক, স্টেকিং “ফ্রিলোডিং” (ওরাকেল নোডগুলি অন্যদের থেকে তথ্য অনুলিপি করা) এবং “অলস যাচাইকরণ” (ওরাকেল নোডগুলি নিজেরাই তথ্য যাচাই না করে সংখ্যাগরিষ্ঠদের অনুসরণ করা) প্রতিরোধ করতে পারে না। + +##### শেলিং পয়েন্ট পদ্ধতি + +[শেলিং পয়েন্ট](https://en.wikipedia.org/wiki/Focal_point_\(game_theory\)) হল একটি গেম-থিওরি ধারণা যা অনুমান করে যে একাধিক সত্তা সর্বদা কোনো যোগাযোগ ছাড়াই কোনো সমস্যার একটি সাধারণ সমাধানে ডিফল্ট হবে। শেলিং-পয়েন্ট পদ্ধতিগুলি প্রায়শই ডিসেন্ট্রালাইজড ওরাকেল নেটওয়ার্কগুলিতে ব্যবহৃত হয় যাতে নোডগুলি ডেটা অনুরোধের উত্তরে কনসেন্সাস পৌঁছাতে পারে। + +এর জন্য একটি প্রাথমিক ধারণা ছিল [SchellingCoin](https://blog.ethereum.org/2014/03/28/schellingcoin-a-minimal-trust-universal-data-feed/), একটি প্রস্তাবিত ডেটা ফিড যেখানে অংশগ্রহণকারীরা "স্কেলার" প্রশ্নগুলির প্রতিক্রিয়া জমা দেয় (প্রশ্নগুলির উত্তরগুলি মাত্রা দ্বারা বর্ণনা করা হয়, যেমন, "ETH-এর দাম কত?"), একটি আমানত সহ। যে ব্যবহারকারীরা 25তম এবং 75তম [পার্সেন্টাইল](https://en.wikipedia.org/wiki/Percentile) এর মধ্যে মান প্রদান করে তাদের পুরস্কৃত করা হয়, যখন যাদের মান মধ্যম মান থেকে ব্যাপকভাবে বিচ্যুত হয় তাদের দণ্ডিত করা হয়। + +যদিও শেলিংকয়েন আজ বিদ্যমান নেই, তবে বেশ কয়েকটি ডিসেন্ট্রালাইজড ওরাকেল—বিশেষত [মেকার প্রোটোকলের ওরাকেলস](https://docs.makerdao.com/smart-contract-modules/oracle-module)—ওরাকেল ডেটার সঠিকতা উন্নত করতে শেলিং-পয়েন্ট পদ্ধতি ব্যবহার করে। প্রতিটি মেকার ওরাকেল নোড ("রিলের" এবং "ফিড") এর একটি অফচেইন P2P নেটওয়ার্ক নিয়ে গঠিত যা জামানত সম্পদের জন্য বাজারের মূল্য জমা দেয় এবং একটি অনচেইন “মিডিয়ানাইজার” কন্ট্র্যাক্ট যা সমস্ত প্রদত্ত মানের মধ্যম গণনা করে। নির্দিষ্ট বিলম্বের সময়কাল শেষ হয়ে গেলে, এই মধ্যম মানটি সংশ্লিষ্ট সম্পদের জন্য নতুন রেফারেন্স মূল্য হয়ে যায়। + +শেলিং পয়েন্ট পদ্ধতি ব্যবহার করে এমন ওরাকেলগুলির অন্যান্য উদাহরণগুলির মধ্যে রয়েছে [চেইনলিঙ্ক অফচেইন রিপোর্টিং](https://docs.chain.link/architecture-overview/off-chain-reporting) এবং [উইটনেট](https://witnet.io/)। উভয় সিস্টেমে, পিয়ার-টু-পিয়ার নেটওয়ার্কের ওরাকেল নোডগুলির প্রতিক্রিয়াগুলিকে একটি একক সামগ্রিক মানে একত্রিত করা হয়, যেমন একটি গড় বা মধ্যম। নোডগুলিকে তাদের প্রতিক্রিয়াগুলি সামগ্রিক মানের সাথে কতটা সারিবদ্ধ বা বিচ্যুত হয় তার উপর ভিত্তি করে পুরস্কৃত বা দণ্ডিত করা হয়। + +শেলিং পয়েন্ট পদ্ধতিগুলি আকর্ষণীয় কারণ তারা অনচেইন ফুটপ্রিন্ট হ্রাস করে (শুধুমাত্র একটি লেনদেন পাঠাতে হবে) এবং বিকেন্দ্রীকরণের নিশ্চয়তা দেয়। পরেরটি সম্ভব কারণ নোডগুলিকে গড়/মধ্যম মান তৈরি করে এমন অ্যালগরিদমে খাওয়ানোর আগে জমা দেওয়া প্রতিক্রিয়ার তালিকায় স্বাক্ষর করতে হবে। + +### প্রাপ্যতা {#availability} + +ডিসেন্ট্রালাইজড ওরাকেল পরিষেবা স্মার্ট কন্ট্র্যাক্টগুলিতে অফচেইন ডেটার উচ্চ প্রাপ্যতা নিশ্চিত করে। এটি অফচেইন তথ্যের উৎস এবং অনচেইনে তথ্য স্থানান্তরের জন্য দায়ী নোড উভয়কেই বিকেন্দ্রীকরণ করে অর্জন করা হয়। + +এটি ফল্ট-টলারেন্স নিশ্চিত করে কারণ ওরাকেল কন্ট্র্যাক্ট অন্যান্য কন্ট্র্যাক্ট থেকে কোয়েরি কার্যকর করার জন্য একাধিক নোডের (যারা একাধিক ডেটা উৎসের উপরও নির্ভর করে) উপর নির্ভর করতে পারে। উৎস _এবং_ নোড-অপারেটর স্তরে ডিসেন্ট্রালাইজেশন অত্যন্ত গুরুত্বপূর্ণ—একই উৎস থেকে পুনরুদ্ধার করা তথ্য পরিবেশনকারী ওরাকেল নোডগুলির একটি নেটওয়ার্ক একটি কেন্দ্রীয় ওরাকেলের মতো একই সমস্যায় পড়বে। + +স্টেক-ভিত্তিক ওরাকেলগুলির পক্ষে ডেটা অনুরোধে দ্রুত সাড়া দিতে ব্যর্থ হওয়া নোড অপারেটরদের স্ল্যাশ করাও সম্ভব। এটি ওরাকেল নোডগুলিকে ফল্ট-টলারেন্ট পরিকাঠামোতে বিনিয়োগ করতে এবং সময়মতো ডেটা সরবরাহ করতে উল্লেখযোগ্যভাবে উৎসাহিত করে। + +### ভালো ইনসেনটিভ সামঞ্জস্যতা {#good-incentive-compatibility} + +ডিসেন্ট্রালাইজড ওরাকেলগুলি ওরাকেল নোডগুলির মধ্যে [বাইজেন্টাইন](https://en.wikipedia.org/wiki/Byzantine_fault) আচরণ প্রতিরোধ করার জন্য বিভিন্ন ইনসেনটিভ ডিজাইন প্রয়োগ করে। বিশেষত, তারা _অ্যাট্রিবিউটেবিলিটি_ এবং _অ্যাকাউন্টেবিলিটি_ অর্জন করে: + +1. ডিসেন্ট্রালাইজড ওরাকেল নোডগুলিকে প্রায়শই ডেটা অনুরোধের প্রতিক্রিয়ায় তারা যে ডেটা সরবরাহ করে তাতে স্বাক্ষর করতে হয়। এই তথ্যটি ওরাকেল নোডগুলির ঐতিহাসিক কর্মক্ষমতা মূল্যায়নে সাহায্য করে, যাতে ব্যবহারকারীরা ডেটা অনুরোধ করার সময় অবিশ্বস্ত ওরাকেল নোডগুলিকে ফিল্টার করতে পারে। একটি উদাহরণ হল উইটনেটের [অ্যালগরিদমিক রেপুটেশন সিস্টেম](https://docs.witnet.io/intro/about/architecture#algorithmic-reputation-system)। + +2. ডিসেন্ট্রালাইজড ওরাকেলগুলি—যেমনটি আগে ব্যাখ্যা করা হয়েছে—নোডগুলিকে তারা জমা দেওয়া ডেটার সত্যতার উপর তাদের আস্থার উপর একটি স্টেক রাখতে বলতে পারে। যদি দাবিটি সঠিক হয়, তবে এই স্টেকটি সৎ পরিষেবার জন্য পুরষ্কার সহ ফেরত দেওয়া যেতে পারে। কিন্তু তথ্যটি ভুল হলে এটি স্ল্যাশও করা যেতে পারে, যা অ্যাকাউন্টেবিলিটির কিছু পরিমাপ সরবরাহ করে। + +## স্মার্ট কন্ট্র্যাক্টে ওরাকেলের অ্যাপ্লিকেশন {#applications-of-oracles-in-smart-contracts} + +Ethereum-এ ওরাকেলের জন্য নিম্নলিখিতগুলি সাধারণ ব্যবহারের ক্ষেত্র: + +### আর্থিক তথ্য পুনরুদ্ধার করা {#retrieving-financial-data} + +[ডিসেন্ট্রালাইজড ফাইন্যান্স](/defi/) (DeFi) অ্যাপ্লিকেশনগুলি পিয়ার-টু-পিয়ার ঋণ, ধার এবং সম্পদ ট্রেড করার অনুমতি দেয়। এর জন্য প্রায়শই বিভিন্ন আর্থিক তথ্যের প্রয়োজন হয়, যার মধ্যে বিনিময় হারের ডেটা (ক্রিপ্টোকারেন্সির ফিয়াট মান গণনা করতে বা টোকেনের মূল্য তুলনা করতে) এবং মূলধন বাজারের ডেটা (টোকেনাইজড সম্পদের মূল্য গণনা করতে, যেমন সোনা বা মার্কিন ডলার) অন্তর্ভুক্ত। + +উদাহরণস্বরূপ, একটি DeFi ঋণ প্রোটোকলকে জামানত হিসাবে জমা দেওয়া সম্পদের (যেমন, ETH) বর্তমান বাজার মূল্য জিজ্ঞাসা করতে হবে। এটি কন্ট্র্যাক্টকে জামানত সম্পদের মূল্য নির্ধারণ করতে এবং সিস্টেম থেকে কতটা ধার করা যায় তা নির্ধারণ করতে দেয়। + +DeFi-তে জনপ্রিয় “প্রাইস ওরাকেল” (যেমনটি প্রায়শই বলা হয়) এর মধ্যে রয়েছে চেইনলিঙ্ক প্রাইস ফিড, কম্পাউন্ড প্রোটোকলের [ওপেন প্রাইস ফিড](https://compound.finance/docs/prices), ইউনিসওয়াপের [টাইম-ওয়েটেড অ্যাভারেজ প্রাইস (TWAP)](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles), এবং [মেকার ওরাকেলস](https://docs.makerdao.com/smart-contract-modules/oracle-module)। + +নির্মাতাদের তাদের প্রকল্পে এই প্রাইস ওরাকেলগুলিকে একীভূত করার আগে তাদের সাথে আসা সতর্কতাগুলি বোঝা উচিত। এই [প্রবন্ধটি](https://blog.openzeppelin.com/secure-smart-contract-guidelines-the-dangers-of-price-oracles/) উল্লিখিত যেকোনো প্রাইস ওরাকেল ব্যবহার করার পরিকল্পনা করার সময় কী বিবেচনা করতে হবে তার একটি বিশদ বিশ্লেষণ প্রদান করে। + +নিচে একটি উদাহরণ দেওয়া হল যে আপনি কীভাবে একটি চেইনলিঙ্ক প্রাইস ফিড ব্যবহার করে আপনার স্মার্ট কন্ট্র্যাক্টে সর্বশেষ ETH মূল্য পুনরুদ্ধার করতে পারেন: + +```solidity +pragma solidity ^0.6.7; + +import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol"; + +contract PriceConsumerV3 { + + AggregatorV3Interface internal priceFeed; + + /** + * নেটওয়ার্ক: কোভান + * অ্যাগ্রিগেটর: ETH/USD + * ঠিকানা: 0x9326BFA02ADD2366b30bacB125260Af641031331 + */ + constructor() public { + priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331); + } + + /** + * সর্বশেষ মূল্য প্রদান করে + */ + function getLatestPrice() public view returns (int) { + ( + uint80 roundID, + int price, + uint startedAt, + uint timeStamp, + uint80 answeredInRound + ) = priceFeed.latestRoundData(); + return price; + } +} +``` + +### যাচাইযোগ্য এলোমেলোতা তৈরি করা {#generating-verifiable-randomness} + +কিছু ব্লকচেইন অ্যাপ্লিকেশন, যেমন ব্লকচেইন-ভিত্তিক গেম বা লটারি স্কিমগুলির জন্য কার্যকরভাবে কাজ করার জন্য একটি উচ্চ স্তরের অনির্দেশ্যতা এবং এলোমেলোতার প্রয়োজন হয়। যাইহোক, ব্লকচেইনের নির্ধারক এক্সিকিউশন এলোমেলোতা দূর করে। + +মূল পদ্ধতিটি ছিল `blockhash`-এর মতো ছদ্ম-এলোমেলো ক্রিপ্টোগ্রাফিক ফাংশন ব্যবহার করা, কিন্তু এগুলি [মাইনারদের দ্বারা ম্যানিপুলেট](https://ethereum.stackexchange.com/questions/3140/risk-of-using-blockhash-other-miners-preventing-attack#:~:text=So%20while%20the%20miners%20can,to%20one%20of%20the%20players.) করা যেত প্রুফ-অফ-ওয়ার্ক অ্যালগরিদমের সমাধান করা। এছাড়াও, Ethereum-এর [প্রুফ-অফ-স্টেকে স্যুইচ](/roadmap/merge/) মানে ডেভেলপাররা আর অনচেইন এলোমেলোতার জন্য `blockhash`-এর উপর নির্ভর করতে পারে না। বিকন চেইনের [RANDAO পদ্ধতি](https://eth2book.info/altair/part2/building_blocks/randomness) এর পরিবর্তে এলোমেলোতার একটি বিকল্প উৎস প্রদান করে। + +অফচেইনে র্যান্ডম মান তৈরি করা এবং এটি অনচেইনে পাঠানো সম্ভব, কিন্তু এটি করা ব্যবহারকারীদের উপর উচ্চ বিশ্বাসের প্রয়োজনীয়তা আরোপ করে। তাদের বিশ্বাস করতে হবে যে মানটি সত্যিই অনির্দেশ্য পদ্ধতির মাধ্যমে তৈরি করা হয়েছিল এবং ট্রানজিটে পরিবর্তিত হয়নি। + +অফচেইন কম্পিউটেশনের জন্য ডিজাইন করা ওরাকেলস অফচেইনে সুরক্ষিতভাবে এলোমেলো ফলাফল তৈরি করে এই সমস্যার সমাধান করে যা তারা অনচেইনে সম্প্রচার করে ক্রিপ্টোগ্রাফিক প্রমাণের সাথে প্রক্রিয়ার অনির্দেশ্যতা প্রত্যয়ন করে। একটি উদাহরণ হল [চেইনলিঙ্ক VRF](https://docs.chain.link/docs/chainlink-vrf/) (যাচাইযোগ্য র্যান্ডম ফাংশন), যা একটি প্রমাণযোগ্য ন্যায্য এবং ট্যাম্পার-প্রুফ র্যান্ডম নম্বর জেনারেটর (RNG) যা অনির্দেশ্য ফলাফলের উপর নির্ভরশীল অ্যাপ্লিকেশনগুলির জন্য নির্ভরযোগ্য স্মার্ট কন্ট্র্যাক্ট তৈরির জন্য দরকারী। + +### ইভেন্টের জন্য ফলাফল পাওয়া {#getting-outcomes-for-events} + +ওরাকেল দিয়ে, বাস্তব-বিশ্বের ইভেন্টগুলিতে সাড়া দেয় এমন স্মার্ট কন্ট্র্যাক্ট তৈরি করা সহজ। ওরাকেল পরিষেবাগুলি কন্ট্র্যাক্টগুলিকে অফচেইন উপাদানগুলির মাধ্যমে বাহ্যিক API-তে সংযোগ করতে এবং সেই ডেটা উৎস থেকে তথ্য ব্যবহার করার অনুমতি দিয়ে এটি সম্ভব করে। উদাহরণস্বরূপ, পূর্বে উল্লিখিত প্রেডিকশন ড্যাপটি একটি বিশ্বস্ত অফচেইন উৎস (যেমন, অ্যাসোসিয়েটেড প্রেস) থেকে নির্বাচনের ফলাফল ফেরাতে একটি ওরাকেলকে অনুরোধ করতে পারে। + +বাস্তব-বিশ্বের ফলাফলের উপর ভিত্তি করে ডেটা পুনরুদ্ধার করার জন্য ওরাকেল ব্যবহার করা অন্যান্য অভিনব ব্যবহারের ক্ষেত্রগুলিকে সক্ষম করে; উদাহরণস্বরূপ, একটি ডিসেন্ট্রালাইজড বীমা পণ্য কার্যকরভাবে কাজ করার জন্য আবহাওয়া, দুর্যোগ ইত্যাদি সম্পর্কে সঠিক তথ্যের প্রয়োজন। + +### স্মার্ট কন্ট্র্যাক্ট স্বয়ংক্রিয় করা {#automating-smart-contracts} + +স্মার্ট কন্ট্র্যাক্টগুলি স্বয়ংক্রিয়ভাবে চলে না; বরং, একটি বাহ্যিকভাবে মালিকানাধীন অ্যাকাউন্ট (EOA), বা অন্য কোনো কন্ট্র্যাক্ট অ্যাকাউন্টকে, কন্ট্র্যাক্টের কোড কার্যকর করার জন্য সঠিক ফাংশনগুলিকে ট্রিগার করতে হবে। বেশিরভাগ ক্ষেত্রে, কন্ট্র্যাক্টের ফাংশনগুলির বেশিরভাগই পাবলিক এবং EOA এবং অন্যান্য কন্ট্র্যাক্ট দ্বারা আহ্বান করা যেতে পারে। + +কিন্তু একটি কন্ট্র্যাক্টের মধ্যে _প্রাইভেট ফাংশন_ও রয়েছে যা অন্যদের কাছে অ্যাক্সেসযোগ্য নয়; কিন্তু যা একটি dApp-এর সামগ্রিক কার্যকারিতার জন্য গুরুত্বপূর্ণ। উদাহরণগুলির মধ্যে রয়েছে একটি `mintERC721Token()` ফাংশন যা পর্যায়ক্রমে ব্যবহারকারীদের জন্য নতুন NFT তৈরি করে, একটি প্রেডিকশন মার্কেটে পেআউট দেওয়ার জন্য একটি ফাংশন, বা একটি DEX-এ স্টেক করা টোকেনগুলি আনলক করার জন্য একটি ফাংশন। + +অ্যাপ্লিকেশনটি মসৃণভাবে চালু রাখার জন্য ডেভেলপারদের নির্দিষ্ট বিরতিতে এই ধরনের ফাংশনগুলিকে ট্রিগার করতে হবে। যাইহোক, এটি ডেভেলপারদের জন্য জাগতিক কাজগুলিতে আরও ঘন্টা নষ্ট করতে পারে, যে কারণে স্মার্ট কন্ট্র্যাক্টগুলির এক্সিকিউশন স্বয়ংক্রিয় করা আকর্ষণীয়। + +কিছু ডিসেন্ট্রালাইজড ওরাকেল নেটওয়ার্ক অটোমেশন পরিষেবা অফার করে, যা অফচেইন ওরাকেল নোডগুলিকে ব্যবহারকারীর দ্বারা সংজ্ঞায়িত প্যারামিটার অনুযায়ী স্মার্ট কন্ট্র্যাক্ট ফাংশনগুলিকে ট্রিগার করার অনুমতি দেয়। সাধারণত, এর জন্য ওরাকেল পরিষেবার সাথে টার্গেট কন্ট্র্যাক্ট “নিবন্ধন” করতে হবে, ওরাকেল অপারেটরকে অর্থ প্রদানের জন্য তহবিল সরবরাহ করতে হবে এবং কন্ট্র্যাক্ট ট্রিগার করার শর্ত বা সময় নির্দিষ্ট করতে হবে। + +চেইনলিঙ্কের [কিপার নেটওয়ার্ক](https://chain.link/keepers) স্মার্ট কন্ট্র্যাক্টগুলির জন্য একটি বিশ্বাসযোগ্য এবং ডিসেন্ট্রালাইজড পদ্ধতিতে নিয়মিত রক্ষণাবেক্ষণের কাজগুলি আউটসোর্স করার বিকল্প সরবরাহ করে। আপনার কন্ট্র্যাক্ট কিপার-সামঞ্জস্যপূর্ণ করার এবং আপকিপ পরিষেবা ব্যবহার করার বিষয়ে তথ্যের জন্য অফিসিয়াল [কিপারের নথিপত্র](https://docs.chain.link/docs/chainlink-keepers/introduction/) পড়ুন। + +## কীভাবে ব্লকচেইন ওরাকেল ব্যবহার করবেন {#use-blockchain-oracles} + +আপনার Ethereum dApp-এ আপনি একাধিক ওরাকেল অ্যাপ্লিকেশন সংহত করতে পারেন: + +**[Chainlink](https://chain.link/)** - _Chainlink ডিসেন্ট্রালাইজড ওরাকেল নেটওয়ার্ক যেকোনো ব্লকচেইনে উন্নত স্মার্ট কন্ট্র্যাক্ট সমর্থন করার জন্য ট্যাম্পার-প্রুফ ইনপুট, আউটপুট এবং কম্পিউটেশন সরবরাহ করে।_ + +**[RedStone Oracles](https://redstone.finance/)** - _RedStone একটি ডিসেন্ট্রালাইজড মডুলার ওরাকেল যা গ্যাস-অপ্টিমাইজড ডেটা ফিড সরবরাহ করে। এটি উদীয়মান সম্পদ, যেমন লিকুইড স্টেকিং টোকেন (LSTs), লিকুইড রিস্টেকিং টোকেন (LRTs), এবং বিটকয়েন স্টেকিং ডেরিভেটিভের জন্য মূল্য ফিড অফার করতে বিশেষায়িত।_ + +**[Chronicle](https://chroniclelabs.org/)** - _Chronicle সত্যিকারের পরিমাপযোগ্য, খরচ-দক্ষ, ডিসেন্ট্রালাইজড এবং যাচাইযোগ্য ওরাকেল তৈরি করে অনচেইনে ডেটা স্থানান্তরের বর্তমান সীমাবদ্ধতাগুলি কাটিয়ে উঠেছে।_ + +**[Witnet](https://witnet.io/)** - _Witnet একটি অনুমতিহীন, ডিসেন্ট্রালাইজড এবং সেন্সরশিপ-প্রতিরোধী ওরাকেল যা স্মার্ট কন্ট্র্যাক্টগুলিকে শক্তিশালী ক্রিপ্টো-অর্থনৈতিক গ্যারান্টি সহ বাস্তব বিশ্বের ইভেন্টগুলিতে প্রতিক্রিয়া জানাতে সাহায্য করে।_ + +**[UMA Oracle](https://uma.xyz)** - _UMA-র অপ্টিমিস্টিক ওরাকেল স্মার্ট কন্ট্র্যাক্টগুলিকে দ্রুত এবং বিভিন্ন অ্যাপ্লিকেশনের জন্য যেকোনো ধরনের ডেটা গ্রহণ করার অনুমতি দেয়, যার মধ্যে রয়েছে বীমা, আর্থিক ডেরিভেটিভ এবং প্রেডিকশন মার্কেট।_ + +**[Tellor](https://tellor.io/)** - _Tellor হল আপনার স্মার্ট কন্ট্র্যাক্টের জন্য একটি স্বচ্ছ এবং অনুমতিহীন ওরাকেল প্রোটোকল যা প্রয়োজনে যেকোনো ডেটা সহজেই পেতে পারে।_ + +**[Band Protocol](https://bandprotocol.com/)** - _Band Protocol হল একটি ক্রস-চেইন ডেটা ওরাকেল প্ল্যাটফর্ম যা বাস্তব-বিশ্বের ডেটা এবং API গুলিকে একত্রিত করে এবং স্মার্ট কন্ট্র্যাক্টের সাথে সংযুক্ত করে।_ + +**[Pyth Network](https://pyth.network/)** - _Pyth নেটওয়ার্ক হল একটি প্রথম-পক্ষের আর্থিক ওরাকেল নেটওয়ার্ক যা একটি ট্যাম্পার-প্রতিরোধী, ডিসেন্ট্রালাইজড এবং স্ব-টেকসই পরিবেশে অবিচ্ছিন্ন বাস্তব-বিশ্বের ডেটা অনচেইনে প্রকাশ করার জন্য ডিজাইন করা হয়েছে।_ + +**[API3 DAO](https://www.api3.org/)** - _API3 DAO প্রথম-পক্ষের ওরাকেল সমাধান সরবরাহ করছে যা স্মার্ট কন্ট্র্যাক্টের জন্য একটি ডিসেন্ট্রালাইজড সমাধানে বৃহত্তর উৎস স্বচ্ছতা, নিরাপত্তা এবং পরিমাপযোগ্যতা সরবরাহ করে_ + +**[Supra](https://supra.com/)** - ক্রস-চেইন সমাধানগুলির একটি উল্লম্বভাবে সমন্বিত টুলকিট যা সমস্ত ব্লকচেইন, পাবলিক (L1s এবং L2s) বা প্রাইভেট (এন্টারপ্রাইজ), আন্তঃলিঙ্ক করে, ডিসেন্ট্রালাইজড ওরাকেল মূল্য ফিড সরবরাহ করে যা অনচেইন এবং অফচেইন ব্যবহারের ক্ষেত্রে ব্যবহার করা যেতে পারে। + +**[Gas Network](https://gas.network/)** - ব্লকচেইন জুড়ে রিয়েল-টাইম গ্যাস মূল্যের ডেটা সরবরাহকারী একটি বিতরণ করা ওরাকেল প্ল্যাটফর্ম। অনচেইনে নেতৃস্থানীয় গ্যাস মূল্য ডেটা প্রদানকারীদের থেকে ডেটা আনার মাধ্যমে, Gas Network আন্তঃকার্যক্ষমতা চালনা করতে সাহায্য করছে। Gas Network 35টিরও বেশি চেইনের জন্য ডেটা সমর্থন করে, যার মধ্যে Ethereum Mainnet এবং অনেক নেতৃস্থানীয় L2s রয়েছে। + +## আরও পড়ুন {#further-reading} + +**প্রবন্ধ** + +- [একটি ব্লকচেইন ওরাকেল কী?](https://chain.link/education/blockchain-oracles) — _Chainlink_ +- [একটি ব্লকচেইন ওরাকেল কী?](https://medium.com/better-programming/what-is-a-blockchain-oracle-f5ccab8dbd72) — _Patrick Collins_ +- [ডিসেন্ট্রালাইজড ওরাকেলস: একটি ব্যাপক সংক্ষিপ্ত বিবরণ](https://medium.com/fabric-ventures/decentralised-oracles-a-comprehensive-overview-d3168b9a8841) — _Julien Thevenard_ +- [Ethereum-এ একটি ব্লকচেইন ওরাকেল বাস্তবায়ন](https://medium.com/@pedrodc/implementing-a-blockchain-oracle-on-ethereum-cedc7e26b49e) – _Pedro Costa_ +- [স্মার্ট কন্ট্র্যাক্টগুলি কেন API কল করতে পারে না?](https://ethereum.stackexchange.com/questions/301/why-cant-contracts-make-api-calls) — _StackExchange_ +- [তাহলে আপনি একটি প্রাইস ওরাকেল ব্যবহার করতে চান](https://samczsun.com/so-you-want-to-use-a-price-oracle/) — _samczsun_ + +**ভিডিও** + +- [ওরাকেলস এবং ব্লকচেইন ইউটিলিটির সম্প্রসারণ](https://youtu.be/BVUZpWa8vpw) — _Real Vision Finance_ + +**টিউটোরিয়াল** + +- [Solidity-তে Ethereum-এর বর্তমান মূল্য কীভাবে আনবেন](https://blog.chain.link/fetch-current-crypto-price-data-solidity/) — _Chainlink_ +- [ওরাকেল ডেটা ব্যবহার করা](https://docs.chroniclelabs.org/Developers/tutorials/Remix) — _Chronicle_ + +**দৃষ্টান্তমূলক প্রকল্প** + +- [Solidity-তে Ethereum-এর জন্য সম্পূর্ণ চেইনলিঙ্ক স্টার্টার প্রজেক্ট](https://github.com/hackbg/chainlink-fullstack) — _HackBG_ diff --git a/public/content/translations/bn/developers/docs/programming-languages/dart/index.md b/public/content/translations/bn/developers/docs/programming-languages/dart/index.md new file mode 100644 index 00000000000..86aeb16860d --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/dart/index.md @@ -0,0 +1,32 @@ +--- +title: "ডার্ট ডেভেলপারদের জন্য ইথেরিয়াম" +description: "ডার্ট ভাষা ব্যবহার করে ইথেরিয়ামের জন্য কীভাবে ডেভেলপ করতে হয় তা শিখুন" +lang: bn +incomplete: true +--- + +## স্মার্ট কন্ট্র্যাক্ট এবং Solidity ভাষা দিয়ে শুরু করা {#getting-started-with-smart-contracts-and-solidity} + +## টিউটোরিয়াল {#tutorials} + +- [ফ্লাটার এবং ব্লকচেইন – হ্যালো ওয়ার্ল্ড ডিএ্যাপ](https://www.geeksforgeeks.org/flutter-and-blockchain-hello-world-dapp/) আপনাকে শুরু করার জন্য সমস্ত ধাপের মধ্যে দিয়ে নিয়ে যায়: + 1. [Solidity](https://soliditylang.org/)-তে একটি স্মার্ট কন্ট্র্যাক্ট লেখা + 2. ডার্টে একটি ইউজার ইন্টারফেস লেখা +- [ফ্লাটার দিয়ে একটি মোবাইল ডিএ্যাপ তৈরি করা](https://medium.com/dash-community/building-a-mobile-dapp-with-flutter-be945c80315a) অনেক ছোট, যা ভালো হতে পারে + যদি আপনি ইতিমধ্যেই মূল বিষয়গুলো জেনে থাকেন +- আপনি যদি একটি ভিডিও দেখে শিখতে পছন্দ করেন, তাহলে আপনি [আপনার প্রথম ব্লকচেইন ফ্লাটার অ্যাপ তৈরি করুন](https://www.youtube.com/watch?v=3Eeh3pJ6PeA) দেখতে পারেন, যা প্রায় এক ঘন্টা দীর্ঘ +- আপনি যদি অধৈর্য হন, তাহলে আপনি [ফ্লাটার এবং ডার্ট দিয়ে ইথেরিয়ামে একটি ব্লকচেইন ডিসেন্ট্রালাইজড-অ্যাপ তৈরি করা](https://www.youtube.com/watch?v=jaMFEOCq_1s) পছন্দ করতে পারেন, যা মাত্র প্রায় বিশ মিনিটের +- [WalletConnect দ্বারা Web3Modal এর সাথে ফ্লাটার অ্যাপ্লিকেশনে MetaMask সংহত করা](https://www.youtube.com/watch?v=v_M2buHCpc4) - এই ছোট ভিডিওটি আপনাকে WalletConnect এর [Web3Modal](https://pub.dev/packages/web3modal_flutter) লাইব্রেরি দিয়ে আপনার ফ্লাটার অ্যাপ্লিকেশনগুলিতে MetaMask সংহত করার ধাপগুলির মধ্যে দিয়ে নিয়ে যায় +- [সলিডিটি এবং ফ্লাটার সহ মোবাইল ব্লকচেইন ডেভেলপার বুটক্যাম্প কোর্স](https://youtube.com/playlist?list=PL4V4Unlk5luhQ26ERO6hWEbcUwHDSSmVH) - ফুল স্ট্যাক মোবাইল ব্লকচেইন ডেভেলপার কোর্স প্লেলিস্ট + +## ইথেরিয়াম ক্লায়েন্টদের সাথে কাজ করা {#working-with-ethereum-clients} + +আপনি ইথেরিয়াম ব্যবহার করে ডিসেন্ট্রালাইজড এপ্লিকেশনস (বা "ডিএ্যাপস") তৈরি করতে পারেন যা ক্রিপটোকারেন্সি এবং ব্লকচেইন প্রযুক্তির সুবিধাগুলি ব্যবহার করে। +ডার্টের জন্য অন্তত দুটি বর্তমানে রক্ষণাবেক্ষণ করা লাইব্রেরি রয়েছে যা ইথেরিয়ামের +[JSON-RPC API](/developers/docs/apis/json-rpc/) ব্যবহার করে। + +1. [pwa.ir থেকে Web3dart](https://pub.dev/packages/web3dart) +2. [darticulate.com থেকে ইথেরিয়াম 5.0.0](https://pub.dev/packages/ethereum) + +এছাড়াও অতিরিক্ত লাইব্রেরি রয়েছে যা আপনাকে নির্দিষ্ট ইথেরিয়াম অ্যাড্রেসগুলি পরিচালনা করতে, অথবা আপনাকে বিভিন্ন ক্রিপ্টোকারেন্সির মূল্য পুনরুদ্ধার করতে দেয়। +[আপনি এখানে সম্পূর্ণ তালিকাটি দেখতে পারেন](https://pub.dev/dart/packages?q=ethereum)। diff --git a/public/content/translations/bn/developers/docs/programming-languages/delphi/index.md b/public/content/translations/bn/developers/docs/programming-languages/delphi/index.md new file mode 100644 index 00000000000..c59d86259e8 --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/delphi/index.md @@ -0,0 +1,56 @@ +--- +title: "ডেলফি ডেভেলপারদের জন্য ইথেরিয়াম" +description: "ডেলফি প্রোগ্রামিং ভাষা ব্যবহার করে কীভাবে ইথেরিয়ামের জন্য ডেভেলপ করতে হয় তা শিখুন" +lang: bn +incomplete: true +--- + + + +ডেলফি প্রোগ্রামিং ভাষা ব্যবহার করে কীভাবে ইথেরিয়ামের জন্য ডেভেলপ করতে হয় তা শিখুন + + + +ইথেরিয়াম ব্যবহার করে বিকেন্দ্রীভূত অ্যাপ্লিকেশন (বা "ড্যাপস") তৈরি করুন যেগুলো ক্রিপ্টোকারেন্সি এবং ব্লকচেইন প্রযুক্তির সুবিধাগুলোকে কাজে লাগায়।. এই ড্যাপগুলো বিশ্বাসযোগ্য হতে পারে, অর্থাৎ এগুলোকে একবার ইথেরিয়ামে প্রয়োগ করা হয়ে গেলে, এগুলো সবসময় প্রোগ্রামড হিসেবে চলতে থাকবে।. নতুন ধরণের আর্থিক অ্যাপ্লিকেশন তৈরি করার জন্য এগুলো ডিজিটাল সম্পদকে নিয়ন্ত্রণ করতে পারে।. এগুলো বিকেন্দ্রীভূত হতে পারে, যার মানে কোন একক সত্ত্বা বা ব্যক্তি এগুলো নিয়ন্ত্রণ করেনা এবং এগুলো সেন্সর করা প্রায় অসম্ভব।. + +ডেলফি প্রোগ্রামিং ভাষা ব্যবহার করে ইথেরিয়ামের উপরে ডিসেন্ট্রালাইজড এপ্লিকেশন তৈরি করুন এবং স্মার্ট কন্ট্র্যাক্টগুলির সাথে ইন্টারঅ্যাক্ট করুন! + +## স্মার্ট কন্ট্র্যাক্ট এবং সলিডিটি ভাষা দিয়ে শুরু করা {#getting-started-with-smart-contracts-and-the-solidity-language} + +**ডেলফির সাথে ইথেরিয়ামকে একীভূত করার জন্য আপনার প্রথম পদক্ষেপ নিন** + +একদম প্রথম থেকে শুরু করতে চান? [ethereum.org/learn](/learn/) বা [ethereum.org/developers](/developers/) দেখুন। + +- [ব্লকচেইনের ব্যাখ্যা](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [স্মার্ট কন্ট্র্যাক্ট বোঝা](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [আপনার প্রথম স্মার্ট কন্ট্র্যাক্টটি লিখুন](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [কীভাবে Solidity কম্পাইল এবং ডিপ্লয় করতে হয় তা শিখুন](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) + +## নতুনদের জন্য রেফারেন্স এবং লিঙ্ক {#beginner-references-and-links} + +**ডেলফেরাম লাইব্রেরির পরিচিতি** + +- [ডেলফেরাম কী?](https://github.com/svanas/delphereum/blob/master/README.md) +- [একটি স্থানীয় (ইন-মেমরি) ব্লকচেইনের সাথে ডেলফিকে সংযুক্ত করা](https://medium.com/@svanas/connecting-delphi-to-a-local-in-memory-blockchain-9a1512d6c5b0) +- [ইথেরিয়াম মেইননেটের সাথে ডেলফিকে সংযুক্ত করা](https://medium.com/@svanas/connecting-delphi-to-the-ethereum-main-net-5faf1feffd83) +- [স্মার্ট কন্ট্র্যাক্টগুলির সাথে ডেলফিকে সংযুক্ত করা](https://medium.com/@svanas/connecting-delphi-to-smart-contracts-3146b12803a1) + +**এখন সেটআপ বাদ দিয়ে সরাসরি কিছু নমুনা দেখতে চান?** + +- [একটি 3-মিনিটের স্মার্ট কন্ট্র্যাক্ট এবং ডেলফি - পর্ব 1](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-61d998571d) +- [একটি 3-মিনিটের স্মার্ট কন্ট্র্যাক্ট এবং ডেলফি - পর্ব 2](https://medium.com/@svanas/a-3-minute-smart-contract-and-delphi-part-2-446925faa47b) + +## মধ্যবর্তী স্তরের নিবন্ধ {#intermediate-articles} + +- [ডেলফিতে একটি ইথেরিয়াম-স্বাক্ষরিত মেসেজ সিগনেচার তৈরি করা](https://medium.com/@svanas/generating-an-ethereum-signed-message-signature-in-delphi-75661ce5031b) +- [ডেলফির সাথে ইথার স্থানান্তর করা](https://medium.com/@svanas/transferring-ether-with-delphi-b5f24b1a98a4) +- [ডেলফির সাথে ERC-20 টোকেন স্থানান্তর করা](https://medium.com/@svanas/transferring-erc-20-tokens-with-delphi-bb44c05b295d) + +## উন্নত ব্যবহারের প্যাটার্ন {#advanced-use-patterns} + +- [ডেলফি এবং ইথেরিয়াম নেম সার্ভিস (ENS)](https://medium.com/@svanas/delphi-and-ethereum-name-service-ens-4443cd278af7) +- [কুইকনোড, ইথেরিয়াম এবং ডেলফি](https://medium.com/@svanas/quiknode-ethereum-and-delphi-f7bfc9671c23) +- [ডেলফি এবং ইথেরিয়াম ডার্ক ফরেস্ট](https://svanas.medium.com/delphi-and-the-ethereum-dark-forest-5b430da3ad93) +- [ডেলফিতে একটি টোকেনের বিনিময়ে অন্য টোকেন সোয়াপ করা](https://svanas.medium.com/swap-one-token-for-another-in-delphi-bcb999c47f7) + +আরও সংস্থান খুঁজছেন? [ethereum.org/developers](/developers/) দেখুন। diff --git a/public/content/translations/bn/developers/docs/programming-languages/dot-net/index.md b/public/content/translations/bn/developers/docs/programming-languages/dot-net/index.md new file mode 100644 index 00000000000..30a7ffbf4de --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/dot-net/index.md @@ -0,0 +1,86 @@ +--- +title: "ডটনেট ডেভেলপারদের জন্য ইথেরিয়াম" +description: "শিখুন কীভাবে ডটনেটভিত্তিক প্রজেক্ট ও টুলিঙ ব্যবহার করে ইথেরিয়ামের জন্য ডেভেলপ করা যায়" +lang: bn +incomplete: true +--- + +.NET-ভিত্তিক প্রজেক্ট ও টুলিং ব্যবহার করে কীভাবে ইথেরিয়ামের জন্য ডেভেলপ করা যায় তা শিখুন + +ইথেরিয়াম ব্যবহার করে বিকেন্দ্রীভূত অ্যাপ্লিকেশন (বা "ড্যাপস") তৈরি করুন যেগুলো ক্রিপ্টোকারেন্সি এবং ব্লকচেইন প্রযুক্তির সুবিধাগুলোকে কাজে লাগায়।. এই ড্যাপগুলো বিশ্বাসযোগ্য হতে পারে, অর্থাৎ এগুলোকে একবার ইথেরিয়ামে প্রয়োগ করা হয়ে গেলে, এগুলো সবসময় প্রোগ্রামড হিসেবে চলতে থাকবে।. নতুন ধরণের আর্থিক অ্যাপ্লিকেশন তৈরি করার জন্য এগুলো ডিজিটাল সম্পদকে নিয়ন্ত্রণ করতে পারে।. এগুলো বিকেন্দ্রীভূত হতে পারে, যার মানে কোন একক সত্ত্বা বা ব্যক্তি এগুলো নিয়ন্ত্রণ করেনা এবং এগুলো সেন্সর করা প্রায় অসম্ভব।. + +মাইক্রোসফট প্রযুক্তি স্ট্যাকের বিভিন্ন টুলস ও ল্যাঙ্গুয়েজ ব্যবহার করে ইথেরিয়ামে বিকেন্দ্রীভূত অ্যাপ্লিকেশন তৈরি করুন এবং স্মার্ট কন্ট্র্যাক্টগুলোর সাথে ইন্টারেক্ট করুন - C#, # ভিজুয়াল ব্যাসিক .NET, F#-কে সমর্থন করে, .NET ফ্রেমওয়ার্ক/.NET Core/.NET স্ট্যান্ডার্ড জুড়ে VSCode ও ভিজুয়াল স্টুডিওর মতো টুলিং-এ।. মাইক্রোসফট অ্যাজিওর ব্লকচেইন ব্যবহার করে কয়েক মিনিটের মধ্যে অ্যাজিওর-এ একটি ইথেরিয়াম ব্লকচেইন ডেপ্লয় করুন।. .NET এর প্রতি ভালবাসাকে ইথেরিয়ামে নিয়ে আসুন! + +## স্মার্ট কন্ট্র্যাক্ট এবং সলিডিটি ভাষা দিয়ে শুরু করা {#getting-started-with-smart-contracts-and-the-solidity-language} + +**ডটনেটের সাথে ইথেরিয়ামকে যুক্ত করার প্রথম পদক্ষেপ নিন** + +একদম প্রথম থেকে শুরু করতে চান? [ethereum.org/learn](/learn/) বা [ethereum.org/developers](/developers/) দেখুন। + +- [ব্লকচেইনের ব্যাখ্যা](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [স্মার্ট কন্ট্র্যাক্ট বোঝা](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [আপনার প্রথম স্মার্ট কন্ট্র্যাক্টটি লিখুন](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [কীভাবে Solidity কম্পাইল এবং ডিপ্লয় করতে হয় তা শিখুন](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) + +## নতুনদের জন্য রেফারেন্স এবং লিঙ্ক {#beginner-references-and-links} + +**Nethereum লাইব্রেরি এবং VS কোড সলিডিটির পরিচিতি** + +- [Nethereum, শুরু করা](https://docs.nethereum.com/en/latest/getting-started/) +- [VS কোড সলিডিটি ইনস্টল করা](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity) +- [ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট তৈরি এবং কল করার জন্য একজন .NET ডেভেলপারের ওয়ার্কফ্লো](https://medium.com/coinmonks/a-net-developers-workflow-for-creating-and-calling-ethereum-smart-contracts-44714f191db2) +- [Nethereum-এর সাথে স্মার্ট কন্ট্র্যাক্টের ইন্টিগ্রেশন](https://kauri.io/#collections/Getting%20Started/smart-contracts-integration-with-nethereum/#smart-contracts-integration-with-nethereumm) +- [Nethereum-এর সাথে .NET এবং ইথেরিয়াম ব্লকচেইন স্মার্ট কন্ট্র্যাক্ট ইন্টারফেস করা](https://medium.com/my-blockchain-development-daily-journey/interfacing-net-and-ethereum-blockchain-smart-contracts-with-nethereum-2fa3729ac933), এছাড়াও [中文版](https://medium.com/my-blockchain-development-daily-journey/%E4%BD%BF%E7%94%A8nethereum%E9%80%A3%E6%8E%A5-net%E5%92%8C%E4%BB%A5%E5%A4%AA%E7%B6%B2%E5%8D%80%E5%A1%8A%E9%8F%88%E6%99%BA%E8%83%BD%E5%90%88%E7%B4%84-4a96d35ad1e1) +- [Nethereum - ব্লকচেইনের জন্য একটি ওপেন সোর্স .NET ইন্টিগ্রেশন লাইব্রেরি](https://kauri.io/#collections/a%20hackathon%20survival%20guide/nethereum-an-open-source-.net-integration-library/) +- [Nethereum ব্যবহার করে SQL ডেটাবেসে ইথেরিয়াম ট্রানজ্যাকশন লেখা](https://medium.com/coinmonks/writing-ethereum-transactions-to-sql-database-using-nethereum-fd94e0e4fa36) +- [C# এবং VisualStudio ব্যবহার করে কীভাবে সহজে ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট ডেপ্লয় করা যায় তা দেখুন](https://koukia.ca/deploy-ethereum-smart-contracts-using-c-and-visualstudio-5be188ae928c) + +**এখন সেটআপ বাদ দিয়ে সরাসরি কিছু নমুনা দেখতে চান?** + +- [প্লেগ্রাউন্ড](http://playground.nethereum.com/) - ইথেরিয়ামের সাথে ইন্টারঅ্যাক্ট করুন এবং ব্রাউজারের মাধ্যমে কীভাবে Nethereum ব্যবহার করতে হয় তা শিখুন। + - অ্যাকাউন্ট ব্যালেন্স কোয়েরি করুন [C#](http://playground.nethereum.com/csharp/id/1001) [VB.NET](http://playground.nethereum.com/vb/id/2001) + - ERC20 স্মার্ট কন্ট্র্যাক্ট ব্যালেন্স কোয়েরি করুন [C#](http://playground.nethereum.com/csharp/id/1005) [VB.NET](http://playground.nethereum.com/vb/id/2004) + - একটি অ্যাকাউন্টে ইথার ট্রান্সফার করুন [C#](http://playground.nethereum.com/csharp/id/1003) [VB.NET](http://playground.nethereum.com/vb/id/2003) + - ... এবং আরো! + +## মধ্যবর্তী স্তরের নিবন্ধ {#intermediate-articles} + +- [Nethereum ওয়ার্কবুক/নমুনা লিস্ট](http://docs.nethereum.com/en/latest/Nethereum.Workbooks/docs/) +- [আপনার নিজস্ব ডেভেলপমেন্ট টেস্টচেইন ডেপ্লয় করুন](https://github.com/Nethereum/Testchains) +- [সলিডিটির জন্য VSCode কোডজেন প্লাগইন](https://docs.nethereum.com/en/latest/nethereum-codegen-vscodesolidity/) +- [ইউনিটি এবং ইথেরিয়াম: কেন এবং কীভাবে](https://www.raywenderlich.com/5509-unity-and-ethereum-why-and-how) +- [ইথেরিয়াম ডিএ্যাপস-এর জন্য ASP.NET Core ওয়েব API তৈরি করুন](https://tech-mint.com/blockchain/create-asp-net-core-web-api-for-ethereum-dapps/) +- [একটি সাপ্লাই চেইন ট্র্যাকিং সিস্টেম বাস্তবায়নের জন্য Nethereum Web3 ব্যবহার করা](http://blog.pomiager.com/post/using-nethereum-web3-to-implement-a-supply-chain-traking-system4) +- [Nethereum ব্লক প্রসেসিং](https://nethereum.readthedocs.io/en/latest/nethereum-block-processing-detail/), সাথে [C# প্লেগ্রাউন্ড নমুনা](http://playground.nethereum.com/csharp/id/1025) +- [Nethereum ওয়েবসকেট স্ট্রিমিং](https://nethereum.readthedocs.io/en/latest/nethereum-subscriptions-streaming/) +- [Kaleido এবং Nethereum](https://kaleido.io/kaleido-and-nethereum/) +- [Quorum এবং Nethereum](https://github.com/Nethereum/Nethereum/blob/master/src/Nethereum.Quorum/README.md) + +## উন্নত ব্যবহারের প্যাটার্ন {#advanced-use-patterns} + +- [Azure Key Vault এবং Nethereum](https://github.com/Azure-Samples/bc-community-samples/tree/master/akv-nethereum) +- [Nethereum.DappHybrid](https://github.com/Nethereum/Nethereum.DappHybrid) +- [Ujo Nethereum ব্যাকএন্ড রেফারেন্স আর্কিটেকচার](https://docs.nethereum.com/en/latest/nethereum-ujo-backend-sample/) + +## .NET প্রজেক্ট, টুলস এবং অন্যান্য মজার জিনিস {#dot-net-projects-tools-and-other-fun-stuff} + +- [Nethereum প্লেগ্রাউন্ড](http://playground.nethereum.com/) - _ব্রাউজারে Nethereum কোড স্নিপেট কম্পাইল, তৈরি এবং রান করুন_ +- [Nethereum Codegen Blazor](https://github.com/Nethereum/Nethereum.CodeGen.Blazor) - _Blazor-এ UI সহ Nethereum কোডজেন_ +- [Nethereum Blazor](https://github.com/Nethereum/NethereumBlazor) - _একটি .NET Wasm SPA লাইট ব্লকচেইন এক্সপ্লোরার এবং একটি সাধারণ ওয়ালেট_ +- [Wonka Business Rules Engine](https://docs.nethereum.com/en/latest/wonka/) - _একটি বিজনেস রুলস ইঞ্জিন (.NET প্ল্যাটফর্ম এবং ইথেরিয়াম প্ল্যাটফর্ম উভয়ের জন্য) যা অন্তর্নিহিতভাবে মেটাডেটা-চালিত_ +- [Nethermind](https://github.com/NethermindEth/nethermind) - _Linux, Windows, MacOS-এর জন্য একটি .NET কোর ইথেরিয়াম ক্লায়েন্ট_ +- [eth-utils](https://github.com/ethereum/eth-utils/) - _Ethereum সম্পর্কিত কোডবেসের সাথে কাজ করার জন্য ইউটিলিটি ফাংশন_ +- [TestChains](https://github.com/Nethereum/TestChains) - _দ্রুত প্রতিক্রিয়ার জন্য আগে থেকে কনফিগার করা .NET ডেভচেইনস (PoA)_ + +আরও সংস্থান খুঁজছেন? [ethereum.org/developers](/developers/) দেখুন। + +## .NET কমিউনিটি কন্ট্রিবিউটর {#dot-net-community-contributors} + +Nethereum-এ আমরা বেশিরভাগ সময় [Gitter](https://gitter.im/Nethereum/Nethereum)-এ কাটাই, যেখানে সবাই প্রশ্ন জিজ্ঞাসা করতে/উত্তর দিতে, সাহায্য নিতে, বা শুধু আড্ডা দিতে পারেন। নির্দ্বিধায় [Nethereum GitHub রিপোজিটরি](https://github.com/Nethereum)-তে একটি PR করুন বা একটি ইস্যু খুলুন, অথবা আমাদের অনেক সাইড/নমুনা প্রজেক্ট ব্রাউজ করুন। আমাদেরকে [Discord](https://discord.gg/jQPrR58FxX)-এও পাবেন! + +আপনি যদি Nethermind-এ নতুন হন এবং শুরু করার জন্য সাহায্যের প্রয়োজন হয়, তাহলে আমাদের [Discord](http://discord.gg/PaCMRFdvWT)-এ যোগ দিন। আপনার প্রশ্নের উত্তর দেওয়ার জন্য আমাদের ডেভেলপাররা প্রস্তুত আছেন। [Nethermind GitHub রিপোজিটরি](https://github.com/NethermindEth/nethermind)-তে একটি PR খুলতে বা কোনো ইস্যু জানাতে দ্বিধা করবেন না। + +## অন্যান্য একত্রিত তালিকা {#other-aggregated-lists} + +[অফিসিয়াল Nethereum সাইট](https://nethereum.com/) +[অফিসিয়াল Nethermind সাইট](https://nethermind.io/) diff --git a/public/content/translations/bn/developers/docs/programming-languages/elixir/index.md b/public/content/translations/bn/developers/docs/programming-languages/elixir/index.md new file mode 100644 index 00000000000..41724e01cec --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/elixir/index.md @@ -0,0 +1,55 @@ +--- +title: "এলিক্সির ডেভেলপারদের জন্য ইথেরিয়াম" +description: "এলিক্সির-ভিত্তিক প্রজেক্ট এবং টুলিং ব্যবহার করে কীভাবে ইথেরিয়ামের জন্য ডেভেলপ করা যায় তা জানুন।" +lang: bn +incomplete: false +--- + +এলিক্সির-ভিত্তিক প্রজেক্ট এবং টুলিং ব্যবহার করে কীভাবে ইথেরিয়ামের জন্য ডেভেলপ করা যায় তা জানুন। + +ইথেরিয়াম ব্যবহার করে বিকেন্দ্রীভূত অ্যাপ্লিকেশন (বা "ড্যাপস") তৈরি করুন যেগুলো ক্রিপ্টোকারেন্সি এবং ব্লকচেইন প্রযুক্তির সুবিধাগুলোকে কাজে লাগায়।. এই ডিএ্যাপসগুলো ট্রাস্টলেস হতে পারে, যার মানে হলো একবার এগুলো ইথেরিয়ামে ডেপ্লয় করা হয়ে গেলে, এগুলো সর্বদা প্রোগ্রাম অনুযায়ী চলবে। তারা নতুন ধরনের আর্থিক অ্যাপ্লিকেশন তৈরি করতে ডিজিটাল অ্যাসেট নিয়ন্ত্রণ করতে পারে। এগুলো বিকেন্দ্রীভূত হতে পারে, যার মানে কোন একক সত্ত্বা বা ব্যক্তি এগুলো নিয়ন্ত্রণ করেনা এবং এগুলো সেন্সর করা প্রায় অসম্ভব।. + +## স্মার্ট কন্ট্র্যাক্ট এবং Solidity ভাষা দিয়ে শুরু করা {#getting-started-with-smart-contracts-and-solidity} + +**এলিক্সিরের সাথে ইথেরিয়ামকে একীভূত করার জন্য আপনার প্রথম পদক্ষেপ নিন** + +একদম প্রথম থেকে শুরু করতে চান ? [ethereum.org/learn](/learn/) বা [ethereum.org/developers](/developers/) দেখুন। + +- [ব্লকচেইনের ব্যাখ্যা](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [স্মার্ট কন্ট্র্যাক্ট বোঝা](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [আপনার প্রথম স্মার্ট কন্ট্র্যাক্টটি লিখুন](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [কীভাবে Solidity কম্পাইল এবং ডিপ্লয় করতে হয় তা শিখুন](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) + +## নতুনদের জন্য নিবন্ধ {#beginner-articles} + +- [অবশেষে ইথেরিয়াম অ্যাকাউন্ট বোঝা](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) +- [Ethers — এলিক্সিরের জন্য একটি প্রথম-শ্রেণীর ইথেরিয়াম Web3 লাইব্রেরি](https://medium.com/@alisinabh/announcing-ethers-a-first-class-ethereum-web3-library-for-elixir-1d64e9409122) + +## মধ্যবর্তী স্তরের নিবন্ধ {#intermediate-articles} + +- [এলিক্সির দিয়ে কীভাবে র ইথেরিয়াম কন্ট্র্যাক্ট ট্রানজ্যাকশনে সাইন করতে হয়](https://kohlerjp.medium.com/how-to-sign-raw-ethereum-contract-transactions-with-elixir-f8822bcc813b) +- [ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট এবং এলিক্সির](https://medium.com/agile-alpha/ethereum-smart-contracts-and-elixir-c7c4b239ddb4) + +## এলিক্সির প্রজেক্ট এবং টুলস {#elixir-projects-and-tools} + +### সক্রিয় {#active} + +- [block_keys](https://github.com/ExWeb3/block_keys) - _এলিক্সিরে BIP32 এবং BIP44 ইমপ্লিমেন্টেশন (ডিটারমিনিস্টিক ওয়ালেটের জন্য মাল্টি-অ্যাকাউন্ট হায়ারার্কি)_ +- [ethereumex](https://github.com/mana-ethereum/ethereumex) - _ইথেরিয়াম ব্লকচেইনের জন্য এলিক্সির JSON-RPC ক্লায়েন্ট_ +- [ethers](https://github.com/ExWeb3/elixir_ethers) - _এলিক্সির ব্যবহার করে ইথেরিয়ামের স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার জন্য একটি বিস্তৃত Web3 লাইব্রেরি_ +- [ethers_kms](https://github.com/ExWeb3/elixir_ethers_kms) - _Ethers-এর জন্য একটি KMS সাইনার লাইব্রেরি (AWS KMS দিয়ে ট্রানজ্যাকশন সাইন করুন)_ +- [ex_abi](https://github.com/poanetwork/ex_abi) - _এলিক্সিরে ইথেরিয়াম ABI পার্সার/ডিকোডার/এনকোডার ইমপ্লিমেন্টেশন_ +- [ex_keccak](https://github.com/ExWeb3/ex_keccak) - _একটি NIF বিল্ট tiny-keccak রাস্ট ক্রেট ব্যবহার করে Keccak SHA3-256 হ্যাস গণনা করার জন্য এলিক্সির লাইব্রেরি_ +- [ex_rlp](https://github.com/mana-ethereum/ex_rlp) - _ইথেরিয়ামের RLP (রিকرسیভ লেংথ প্রিফিক্স) এনকোডিংয়ের এলিক্সির ইমপ্লিমেন্টেশন_ + +### আর্কাইভ করা / আর রক্ষণাবেক্ষণ করা হয় না {#archived--no-longer-maintained} + +- [eth](https://hex.pm/packages/eth) - _এলিক্সিরের জন্য ইথেরিয়াম ইউটিলিটি_ +- [exw3](https://github.com/hswick/exw3) - _এলিক্সিরের জন্য উচ্চ স্তরের ইথেরিয়াম RPC ক্লায়েন্ট_ +- [mana](https://github.com/mana-ethereum/mana) - _এলিক্সিরে লেখা ইথেরিয়াম ফুল নোড ইমপ্লিমেন্টেশন_ + +আরও সংস্থান খুঁজছেন? আমাদের [ডেভেলপারদের হোম](/developers/) দেখুন। + +## এলিক্সির কমিউনিটি কন্ট্রিবিউটর {#elixir-community-contributors} + +[এলিক্সিরের স্ল্যাক #ethereum চ্যানেলটি](https://elixir-lang.slack.com/archives/C5RPZ3RJL) একটি দ্রুত বর্ধনশীল কমিউনিটির হোস্ট এবং এটি উপরের যেকোনো প্রজেক্ট এবং সম্পর্কিত বিষয়ে আলোচনার জন্য একটি ডেডিকেটেড রিসোর্স। diff --git a/public/content/translations/bn/developers/docs/programming-languages/golang/index.md b/public/content/translations/bn/developers/docs/programming-languages/golang/index.md new file mode 100644 index 00000000000..d269121e21c --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/golang/index.md @@ -0,0 +1,84 @@ +--- +title: "গো(Go) ডেভেলপারদের জন্য ইথেরিয়াম" +description: "শিখুন কিভাবে গো-ভিত্তিক প্রজেক্ট ও টুল ব্যবহার করে ইথেরিয়ামের জন্য ডেভেলপ করা যায়" +lang: bn +incomplete: true +--- + +শিখুন কিভাবে গো-ভিত্তিক প্রজেক্ট ও টুল ব্যবহার করে ইথেরিয়ামের জন্য ডেভেলপ করা যায় + +ইথেরিয়াম ব্যবহার করে ডিসেন্ট্রালাইজড এপ্লিকেশন (বা "ডিএ্যাপস") তৈরি করুন। এই ড্যাপগুলো বিশ্বাসযোগ্য হতে পারে, অর্থাৎ এগুলোকে একবার ইথেরিয়ামে প্রয়োগ করা হয়ে গেলে, এগুলো সবসময় প্রোগ্রামড হিসেবে চলতে থাকবে।. এগুলি বিকেন্দ্রীভূত, যার অর্থ এগুলি একটি পিয়ার-টু-পিয়ার নেটওয়ার্কে চলে এবং ব্যর্থতার কোনও একক বিন্দু নেই। কোনও একক সত্তা বা ব্যক্তি তাদের নিয়ন্ত্রণ করে না এবং তাদের সেন্সর করা প্রায় অসম্ভব। নতুন ধরনের এপ্লিকেশন তৈরি করার জন্য তারা ডিজিটাল সম্পদ নিয়ন্ত্রণ করতে পারে। + +## স্মার্ট কন্ট্র্যাক্ট এবং Solidity ভাষা দিয়ে শুরু করা {#getting-started-with-smart-contracts-and-solidity} + +**গো-এর সাথে ইথেরিয়ামকে একীভূত করার জন্য প্রথম পদক্ষেপ নিন** + +একদম প্রথম থেকে শুরু করতে চান? [ethereum.org/learn](/learn/) বা [ethereum.org/developers](/developers/) দেখুন। + +- [ব্লকচেইনের ব্যাখ্যা](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [স্মার্ট কন্ট্র্যাক্ট বোঝা](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [আপনার প্রথম স্মার্ট কন্ট্র্যাক্টটি লিখুন](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [কীভাবে Solidity কম্পাইল এবং ডিপ্লয় করতে হয় তা শিখুন](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [কন্ট্র্যাক্ট টিউটোরিয়াল](https://github.com/ethereum/go-ethereum/wiki/Contract-Tutorial) + +## শিক্ষানবিশদের জন্য প্রবন্ধ এবং বই {#beginner-articles-and-books} + +- [Geth দিয়ে শুরু করুন](https://medium.com/@tzhenghao/getting-started-with-geth-c1a30b8d6458) +- [Ethereum-এর সাথে সংযোগ করতে Golang ব্যবহার করুন](https://www.youtube.com/watch?v=-7uChuO_VzM) +- [Golang ব্যবহার করে Ethereum স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করুন](https://www.youtube.com/watch?v=pytGqQmDslE) +- [Go-তে Ethereum স্মার্ট কন্ট্র্যাক্ট পরীক্ষা এবং ডিপ্লয় করার জন্য একটি ধাপে ধাপে নির্দেশিকা](https://hackernoon.com/a-step-by-step-guide-to-testing-and-deploying-ethereum-smart-contracts-in-go-9fc34b178d78) +- [ই-বুক: Go দিয়ে Ethereum ডেভেলপমেন্ট](https://goethereumbook.org/) - _Go দিয়ে Ethereum এপ্লিকেশন ডেভেলপ করুন_ + +## মধ্যবর্তী স্তরের প্রবন্ধ এবং ডক্স {#intermediate-articles-and-docs} + +- [Go Ethereum ডকুমেন্টেশন](https://geth.ethereum.org/docs/) - _অফিসিয়াল Ethereum Golang-এর জন্য ডকুমেন্টেশন_ +- [Erigon প্রোগ্রামারদের জন্য নির্দেশিকা](https://github.com/ledgerwatch/erigon/blob/devel/docs/programmers_guide/guide.md) - _স্টেট ট্রি, মাল্টি-প্রুফস, এবং লেনদেন প্রক্রিয়াকরণ সহ সচিত্র নির্দেশিকা_ +- [Erigon এবং স্টেটলেস Ethereum](https://youtu.be/3-Mn7OckSus?t=394) - _2020 Ethereum কমিউনিটি কনফারেন্স (EthCC 3)_ +- [Erigon: Ethereum ক্লায়েন্ট অপ্টিমাইজ করা](https://www.youtube.com/watch?v=CSpc1vZQW2Q) - _2018 Devcon 4_ +- [Go Ethereum GoDoc](https://godoc.org/github.com/ethereum/go-ethereum) +- [Geth এর সাথে Go তে একটি ডিএ্যাপ তৈরি করা](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/creating-a-dapp-in-go-with-geth/) +- [Golang এবং Geth এর সাথে Ethereum প্রাইভেট নেটওয়ার্কে কাজ করুন](https://myhsts.org/tutorial-learn-how-to-work-with-ethereum-private-network-with-golang-with-geth.php) +- [Go এর সাথে Ethereum এ সলিডিটি কন্ট্র্যাক্টের ইউনিট টেস্টিং](https://medium.com/coinmonks/unit-testing-solidity-contracts-on-ethereum-with-go-3cc924091281) +- [লাইব্রেরি হিসেবে Geth ব্যবহারের জন্য দ্রুত রেফারেন্স](https://medium.com/coinmonks/web3-go-part-1-31c68c68e20e) + +## উন্নত ব্যবহারের প্যাটার্ন {#advanced-use-patterns} + +- [GETH সিমুলেটেড ব্যাকএন্ড](https://kauri.io/#collections/An%20ethereum%20test%20toolkit%20in%20Go/the-geth-simulated-backend/#_top) +- [Ethereum এবং Quorum ব্যবহার করে ব্লকচেইন-অ্যাজ-এ-সার্ভিস অ্যাপস](https://blockchain.dcwebmakers.com/blockchain-as-a-service-apps-using-ethereum-and-quorum.html) +- [Ethereum ব্লকচেইন অ্যাপ্লিকেশনে ডিস্ট্রিবিউটেড স্টোরেজ IPFS এবং Swarm](https://blockchain.dcwebmakers.com/work-with-distributed-storage-ipfs-and-swarm-in-ethereum.html) +- [মোবাইল ক্লায়েন্ট: লাইব্রেরি এবং ইনপ্রোক Ethereum নোড](https://github.com/ethereum/go-ethereum/wiki/Mobile-Clients:-Libraries-and-Inproc-Ethereum-Nodes) +- [নেটিভ ডিএ্যাপস: Ethereum কন্ট্র্যাক্টে Go বাইন্ডিং](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) + +## Go প্রজেক্ট এবং টুলস {#go-projects-and-tools} + +- [Geth / Go Ethereum](https://github.com/ethereum/go-ethereum) - _Ethereum প্রোটোকলের অফিসিয়াল Go প্রয়োগ_ +- [Go Ethereum কোড অ্যানালাইসিস](https://github.com/ZtesoftCS/go-ethereum-code-analysis) - _Go Ethereum সোর্স কোডের পর্যালোচনা এবং বিশ্লেষণ_ +- [Erigon](https://github.com/ledgerwatch/erigon) - _Go Ethereum-এর একটি দ্রুততর ডেরিভেটিভ, আর্কাইভ নোডগুলিতে ফোকাস সহ_ +- [Golem](https://github.com/golemfactory/golem) - _Golem কম্পিউটিং পাওয়ারের জন্য একটি বিশ্বব্যাপী বাজার তৈরি করছে_ +- [Quorum](https://github.com/jpmorganchase/quorum) - _ডেটা গোপনীয়তা সমর্থনকারী Ethereum-এর একটি অনুমতিপ্রাপ্ত প্রয়োগ_ +- [Prysm](https://github.com/prysmaticlabs/prysm) - _Ethereum 'Serenity' 2.0 Go প্রয়োগ_ +- [Eth Tweet](https://github.com/yep/eth-tweet) - _বিকেন্দ্রীভূত টুইটার: Ethereum ব্লকচেইনে চালিত একটি মাইক্রোব্লগিং পরিষেবা_ +- [Plasma MVP Golang](https://github.com/kyokan/plasma) — _মিনিমাম ভায়াবল প্লাজমা স্পেসিফিকেশনের Golang প্রয়োগ এবং এক্সটেনশন_ +- [ওপেন Ethereum মাইনিং পুল](https://github.com/sammy007/open-ethereum-pool) - _একটি ওপেন সোর্স Ethereum মাইনিং পুল_ +- [Ethereum HD ওয়ালেট](https://github.com/miguelmota/go-ethereum-hdwallet) - _Go-তে Ethereum HD ওয়ালেট ডেরিভেশন_ +- [Multi Geth](https://github.com/multi-geth/multi-geth) - _বিভিন্ন ধরনের Ethereum নেটওয়ার্কের জন্য সমর্থন_ +- [Geth লাইট ক্লায়েন্ট](https://github.com/zsfelfoldi/go-ethereum/wiki/Geth-Light-Client) - _লাইট Ethereum সাবপ্রোটোকলের Geth প্রয়োগ_ +- [Ethereum Golang SDK](https://github.com/everFinance/goether) - _Golang-এ একটি সাধারণ Ethereum ওয়ালেট প্রয়োগ এবং ইউটিলিটি_ +- [Covalent Golang SDK](https://github.com/covalenthq/covalent-api-sdk-go) - _200+ ব্লকচেইনের জন্য Go SDK-এর মাধ্যমে কার্যকরী ব্লকচেইন ডেটা অ্যাক্সেস_ + +আরও সংস্থান খুঁজছেন? [ethereum.org/developers](/developers/) দেখুন + +## Go কমিউনিটির অবদানকারীরা {#go-community-contributors} + +- [Geth Discord](https://discordapp.com/invite/nthXNEv) +- [Geth Gitter](https://gitter.im/ethereum/go-ethereum) +- [Gophers Slack](https://invite.slack.golangbridge.org/) - [#ethereum চ্যানেল](https://gophers.slack.com/messages/C9HP1S9V2) +- [StackExchange - Ethereum](https://ethereum.stackexchange.com/) +- [Multi Geth Gitter](https://gitter.im/ethoxy/multi-geth) +- [Ethereum Gitter](https://gitter.im/ethereum/home) +- [Geth লাইট ক্লায়েন্ট Gitter](https://gitter.im/ethereum/light-client) + +## অন্যান্য একত্রিত তালিকা {#other-aggregated-lists} + +- [Awesome Ethereum](https://github.com/btomashvili/awesome-ethereum) +- [Consensys: Ethereum ডেভেলপার টুলসের একটি নির্দিষ্ট তালিকা](https://media.consensys.net/an-definitive-list-of-ethereum-developer-tools-2159ce865974) | [GitHub সোর্স](https://github.com/ConsenSys/ethereum-developer-tools-list) diff --git a/public/content/translations/bn/developers/docs/programming-languages/index.md b/public/content/translations/bn/developers/docs/programming-languages/index.md new file mode 100644 index 00000000000..c308a23547d --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/index.md @@ -0,0 +1,33 @@ +--- +title: "প্রোগ্রামিং ল্যাঙ্গুয়েজ" +description: "জাভাস্ক্রিপ্ট, পাইথন, গো, রাস্ট এবং আরও অনেক কিছু সহ বিভিন্ন প্রোগ্রামিং ভাষার জন্য ইথেরিয়াম ডেভেলপমেন্ট রিসোর্স আবিষ্কার করুন।" +lang: bn +--- + +একটি সাধারণ ভুল ধারণা হল যে Ethereum-এর উপর ভিত্তি করে তৈরি করার জন্য ডেভেলপারদের অবশ্যই [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) লিখতে হবে। এটা মিথ্যা। +ইথেরিয়াম নেটওয়ার্ক এবং কমিউনিটির অন্যতম সৌন্দর্য হল যে আপনি যেকোনো প্রোগ্রামিং ভাষাতেই [অংশগ্রহণ](/community/) করতে পারবেন। + +ইথেরিয়াম এবং তার কমিউনিটি ওপেন সোর্সকে গ্রহণ করেছে। আপনি বিভিন্ন ভাষায় কমিউনিটি প্রজেক্ট খুঁজে পেতে পারেন - ক্লায়েন্ট ইমপ্লিমেন্টেশন, API, ডেভেলপমেন্ট ফ্রেমওয়ার্ক, টেস্টিং টুলস। + +## আপনার ভাষা বেছে নিন {#data} + +প্রজেক্ট, রিসোর্স, এবং ভার্চুয়াল কমিউনিটি খুঁজে পেতে আপনার পছন্দের প্রোগ্রামিং ভাষা নির্বাচন করুন: + +- [ডার্ট ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/dart/) +- [ডেলফি ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/delphi/) +- [.NET ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/dot-net/) +- [এলিক্সির ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/elixir/) +- [গো ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/golang/) +- [জাভা ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/java/) +- [জাভাস্ক্রিপ্ট ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/javascript/) +- [পাইথন ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/python/) +- [রুবি ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/ruby/) +- [রাস্ট ডেভেলপারদের জন্য ইথেরিয়াম](/developers/docs/programming-languages/rust/) + +### আমার ভাষা সমর্থিত না হলে কী হবে {#other-lang} + +আপনি যদি কোনও অতিরিক্ত প্রোগ্রামিং ভাষার জন্য রিসোর্সের সাথে লিঙ্ক করতে চান বা একটি ভার্চুয়াল কমিউনিটির দিকে নির্দেশ করতে চান, তবে আপনি একটি [ইস্যু খোলার](https://github.com/ethereum/ethereum-org-website/issues/new/choose) মাধ্যমে একটি নতুন পেজের জন্য অনুরোধ করতে পারেন। + +আপনি যদি বর্তমানে অসমর্থিত কোনো ভাষা ব্যবহার করে ব্লকচেইনের সাথে ইন্টারফেস করার জন্য কোড লিখতে চান +আপনি ইথেরিয়াম নেটওয়ার্কের সাথে সংযোগ করতে [JSON-RPC ইন্টারফেস](/developers/docs/apis/json-rpc/) ব্যবহার করতে পারেন। TCP/IP ব্যবহার করতে পারে এমন যেকোনো প্রোগ্রামিং +ভাষা এই ইন্টারফেসটি ব্যবহার করতে পারে। diff --git a/public/content/translations/bn/developers/docs/programming-languages/java/index.md b/public/content/translations/bn/developers/docs/programming-languages/java/index.md new file mode 100644 index 00000000000..2855e9ebf2b --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/java/index.md @@ -0,0 +1,64 @@ +--- +title: "জাভা ডেভেলপারদের জন্য ইথেরিয়াম" +description: "শিখুন কীভাবে জাভা-ভিত্তিক প্রজেক্ট ও টুল ব্যবহার করে ইথেরিয়ামের জন্য ডেভেলপ করা যায়" +lang: bn +incomplete: true +--- + +জাভা-ভিত্তিক প্রজেক্ট এবং টুলিং ব্যবহার করে Ethereum-এর জন্য কীভাবে ডেভেলপ করতে হয় তা শিখুন + +ইথেরিয়াম ব্যবহার করে বিকেন্দ্রীভূত অ্যাপ্লিকেশন (বা "ড্যাপস") তৈরি করুন যেগুলো ক্রিপ্টোকারেন্সি এবং ব্লকচেইন প্রযুক্তির সুবিধাগুলোকে কাজে লাগায়।. এই ড্যাপগুলো বিশ্বাসযোগ্য হতে পারে, অর্থাৎ এগুলোকে একবার ইথেরিয়ামে প্রয়োগ করা হয়ে গেলে, এগুলো সবসময় প্রোগ্রামড হিসেবে চলতে থাকবে।. নতুন ধরণের আর্থিক অ্যাপ্লিকেশন তৈরি করার জন্য এগুলো ডিজিটাল সম্পদকে নিয়ন্ত্রণ করতে পারে।. এগুলো বিকেন্দ্রীভূত হতে পারে, যার মানে কোন একক সত্ত্বা বা ব্যক্তি এগুলো নিয়ন্ত্রণ করেনা এবং এগুলো সেন্সর করা প্রায় অসম্ভব।. + +## স্মার্ট কন্ট্র্যাক্ট এবং Solidity ভাষা দিয়ে শুরু করা {#getting-started-with-smart-contracts-and-solidity} + +**জাভার সাথে ইথেরিয়ামকে একীভূত করার জন্য প্রথম পদক্ষেপ নিন** + +একদম প্রথম থেকে শুরু করতে চান? [ethereum.org/learn](/learn/) অথবা [ethereum.org/developers.](/developers/) দেখুন। + +- [ব্লকচেইনের ব্যাখ্যা](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [স্মার্ট কন্ট্র্যাক্ট বোঝা](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [আপনার প্রথম স্মার্ট কন্ট্র্যাক্টটি লিখুন](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [কীভাবে Solidity কম্পাইল এবং ডিপ্লয় করতে হয় তা শিখুন](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) + +## ইথেরিয়াম ক্লায়েন্টদের সাথে কাজ করা {#working-with-ethereum-clients} + +দুটি নেতৃস্থানীয় Java Ethereum ক্লায়েন্ট, [Web3J](https://github.com/web3j/web3j) এবং Hyperledger Besu কীভাবে ব্যবহার করতে হয় তা শিখুন + +- [Java, Eclipse, এবং Web3J-এর সাথে একটি Ethereum ক্লায়েন্টের সাথে সংযোগ স্থাপন করা](https://kauri.io/article/b9eb647c47a546bc95693acc0be72546/connecting-to-an-ethereum-client-with-java-eclipse-and-web3j) +- [Java এবং Web3j দিয়ে একটি Ethereum অ্যাকাউন্ট পরিচালনা করা](https://kauri.io/article/925d923e12c543da9a0a3e617be963b4/manage-an-ethereum-account-with-java-and-web3j) +- [আপনার স্মার্ট কন্ট্র্যাক্ট থেকে একটি Java র‍্যাপার তৈরি করুন](https://kauri.io/article/84475132317d4d6a84a2c42eb9348e4b/generate-a-java-wrapper-from-your-smart-contract) +- [একটি Ethereum স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করা](https://kauri.io/article/14dc434d11ef4ee18bf7d57f079e246e/interacting-with-an-ethereum-smart-contract-in-java) +- [Ethereum স্মার্ট কন্ট্র্যাক্ট ইভেন্টগুলির জন্য শোনা](https://kauri.io/article/760f495423db42f988d17b8c145b0874/listening-for-ethereum-smart-contract-events-in-java) +- [Linux-এর সাথে Java Ethereum ক্লায়েন্ট Besu (Pantheon) ব্যবহার করা](https://kauri.io/article/276dd27f1458443295eea58403fd6965/using-pantheon-the-java-ethereum-client-with-linux) +- [Java ইন্টিগ্রেশন টেস্টে একটি Hyperledger Besu (Pantheon) নোড চালানো](https://kauri.io/article/7dc3ecc391e54f7b8cbf4e5fa0caf780/running-a-pantheon-node-in-java-integration-tests) +- [Web3j চিট শিট](https://kauri.io/web3j-cheat-sheet-\(java-ethereum\)/5dfa1ea941ac3d0001ce1d90/c) + +[ethers-kt](https://github.com/Kr1ptal/ethers-kt) কীভাবে ব্যবহার করতে হয় তা শিখুন, এটি EVM-ভিত্তিক ব্লকচেইনগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য একটি অ্যাসিঙ্ক, উচ্চ-পারফরম্যান্সের Kotlin লাইব্রেরি। JVM এবং Android প্ল্যাটফর্মকে লক্ষ্য করা হয়েছে। + +- [ERC20 টোকেন ট্রান্সফার](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/abi/TransferERC20.kt) +- [ইভেন্ট লিসেনিং সহ UniswapV2 সোয়াপ](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/tokenswapwitheventlistening/TokenSwapWithEventListening.kt) +- [ETH / ERC20 ব্যালেন্স ট্র্যাকার](https://github.com/Kr1ptal/ethers-kt/blob/master/examples/src/main/kotlin/io/ethers/examples/balancetracker/BalanceTracker.kt) + +## মধ্যবর্তী স্তরের নিবন্ধ {#intermediate-articles} + +- [IPFS সহ একটি Java অ্যাপ্লিকেশনে সংগ্রহস্থল পরিচালনা করা](https://kauri.io/article/3e8494f4f56f48c4bb77f1f925c6d926/managing-storage-in-a-java-application-with-ipfs) +- [Web3j সহ Java-তে ERC20 টোকেন পরিচালনা করা](https://kauri.io/article/d13e911bbf624108b1d5718175a5e0a0/manage-erc20-tokens-in-java-with-web3j) +- [Web3j ট্রানজ্যাকশন ম্যানেজার](https://kauri.io/article/4cb780bb4d0846438d11885a25b6d7e7/web3j-transaction-managers) + +## উন্নত ব্যবহারের প্যাটার্ন {#advanced-use-patterns} + +- [একটি Java স্মার্ট কন্ট্র্যাক্ট ডেটা ক্যাশে তৈরি করতে Eventeum ব্যবহার করা](https://kauri.io/article/fe81ee9612eb4e5a9ab72790ef24283d/using-eventeum-to-build-a-java-smart-contract-data-cache) + +## Java প্রজেক্ট এবং টুলস {#java-projects-and-tools} + +- [Web3J (Ethereum ক্লায়েন্টদের সাথে ইন্টারঅ্যাক্ট করার জন্য লাইব্রেরি)](https://github.com/web3j/web3j) +- [ethers-kt (EVM-ভিত্তিক ব্লকচেইনের জন্য অ্যাসিঙ্ক, উচ্চ-পারফরম্যান্স Kotlin/Java/Android লাইব্রেরি।)](https://github.com/Kr1ptal/ethers-kt) +- [Eventeum (ইভেন্ট লিসেনার)](https://github.com/ConsenSys/eventeum) +- [Mahuta (IPFS ডেভ টুলস)](https://github.com/ConsenSys/mahuta) + +আরও সংস্থান খুঁজছেন? [ethereum.org/developers.](/developers/) দেখুন। + +## Java কমিউনিটির অবদানকারীরা {#java-community-contributors} + +- [IO Builders](https://io.builders) +- [Kauri](https://kauri.io) diff --git a/public/content/translations/bn/developers/docs/programming-languages/javascript/index.md b/public/content/translations/bn/developers/docs/programming-languages/javascript/index.md new file mode 100644 index 00000000000..99098b0fdd7 --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/javascript/index.md @@ -0,0 +1,72 @@ +--- +title: "জাভাস্ক্রিপ্ট ডেভেলপারদের জন্য ইথেরিয়াম" +description: "শিখুন কীভাবে জাভাস্ক্রিপ্ট-ভিত্তিক প্রজেক্ট ও টুল ব্যবহার করে ইথেরিয়ামের জন্য ডেভেলপ করা যায়." +lang: bn +--- + +ইথেরিয়াম ইকোসিস্টেমের সবচেয়ে জনপ্রিয় ভাষাগুলোর মধ্যে জাভাস্ক্রিপ্ট অন্যতম। আসলে, ইথেরিয়ামকে যতটা সম্ভব জাভাস্ক্রিপ্টে আনার জন্য একটি [দল](https://github.com/ethereumjs) উৎসর্গীকৃত। + +[স্ট্যাকের সমস্ত স্তরেই](/developers/docs/ethereum-stack/) জাভাস্ক্রিপ্ট (বা এর কাছাকাছি কিছু) লেখার সুযোগ রয়েছে। + +## ইথেরিয়ামের সাথে ইন্টার‍্যাক্ট করুন {#interact-with-ethereum} + +### JavaScript API লাইব্রেরি {#javascript-api-libraries} + +আপনি যদি ব্লকচেইন কোয়েরি করতে, লেনদেন পাঠাতে এবং আরও অনেক কিছুর জন্য জাভাস্ক্রিপ্ট লিখতে চান, তবে এটি করার সবচেয়ে সুবিধাজনক উপায় হলো একটি [জাভাস্ক্রিপ্ট API লাইব্রেরি](/developers/docs/apis/javascript/) ব্যবহার করা। এই API-গুলি ডেভেলপারদের [ইথেরিয়াম নেটওয়ার্কের নোডগুলির](/developers/docs/nodes-and-clients/) সাথে সহজে ইন্টার‍্যাক্ট করার সুযোগ দেয়। + +আপনি ইথেরিয়ামে স্মার্ট কন্ট্র্যাক্টগুলোর সাথে ইন্টার‍্যাক্ট করতে এই লাইব্রেরিগুলো ব্যবহার করতে পারেন, তাই এমন একটি ডিএ্যাপ তৈরি করা সম্ভব যেখানে আপনি আগে থেকে বিদ্যমান কন্ট্র্যাক্টগুলোর সাথে ইন্টার‍্যাক্ট করার জন্য শুধু জাভাস্ক্রিপ্ট ব্যবহার করবেন। + +**দেখে নিন** + +- [Web3.js](https://web3js.readthedocs.io) +- [Ethers.js](https://ethers.org) – _জাভাস্ক্রিপ্ট এবং টাইপস্ক্রিপ্টে ইথেরিয়াম ওয়ালেট বাস্তবায়ন এবং ইউটিলিটি অন্তর্ভুক্ত করে।_ +- [viem](https://viem.sh) – _ইথেরিয়ামের জন্য একটি টাইপস্ক্রিপ্ট ইন্টারফেস যা ইথেরিয়ামের সাথে ইন্টার‍্যাক্ট করার জন্য নিম্ন-স্তরের স্টেটলেস প্রিমিটিভ প্রদান করে।_ +- [Drift](https://ryangoree.github.io/drift/) – _একটি টাইপস্ক্রিপ্ট মেটা-লাইব্রেরি যাতে বিল্ট-ইন ক্যাশিং, হুক এবং টেস্ট মক রয়েছে, যা web3 লাইব্রেরি জুড়ে সহজ ইথেরিয়াম ডেভেলপমেন্টের জন্য ব্যবহৃত হয়।_ + +### স্মার্ট কন্ট্রাক্ট {#smart-contracts} + +আপনি যদি একজন জাভাস্ক্রিপ্ট ডেভেলপার হন এবং নিজের স্মার্ট কন্ট্র্যাক্ট লিখতে চান, তবে আপনি [Solidity](https://solidity.readthedocs.io)-এর সাথে পরিচিত হতে পারেন। এটি সবচেয়ে জনপ্রিয় স্মার্ট কন্ট্র্যাক্ট ভাষা এবং এটি সিনট্যাক্টিকভাবে জাভাস্ক্রিপ্টের অনুরূপ, যা শেখা সহজ করে তুলতে পারে। + +[স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) সম্পর্কে আরও জানুন। + +## প্রোটোকলটি বুঝুন {#understand-the-protocol} + +### ইথিরিয়াম ভার্চুয়াল মেশিন {#the-ethereum-virtual-machine} + +[ইথেরিয়ামের ভার্চুয়াল মেশিনের](/developers/docs/evm/) একটি জাভাস্ক্রিপ্ট ইমপ্লিমেন্টেশন রয়েছে। এটি সর্বশেষ ফর্ক নিয়ম সমর্থন করে। ফর্ক নিয়মগুলো পরিকল্পিত আপগ্রেডের ফলে EVM-এ করা পরিবর্তনগুলিকে বোঝায়। + +এটি বিভিন্ন জাভাস্ক্রিপ্ট প্যাকেজে বিভক্ত যা আপনি আরও ভালোভাবে বোঝার জন্য দেখতে পারেন: + +- অ্যাকাউন্ট +- ব্লক +- ব্লকচেইন নিজেই +- লেনদেনসমূহ +- এবং আরও... + +এটি আপনাকে "একটি অ্যাকাউন্টের ডেটা কাঠামো কী?"-এর মতো বিষয়গুলি বুঝতে সাহায্য করবে। + +আপনি যদি কোড পড়তে পছন্দ করেন, তবে আমাদের ডক্স পড়ার একটি দুর্দান্ত বিকল্প হতে পারে এই জাভাস্ক্রিপ্ট। + +**EVM দেখে নিন** +[`@ethereumjs/evm`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/evm) + +### নোড এবং ক্লায়েন্ট {#nodes-and-clients} + +একটি Ethereumjs ক্লায়েন্ট সক্রিয় ডেভেলপমেন্টে রয়েছে যা আপনাকে আপনার বোধগম্য ভাষায়, অর্থাৎ জাভাস্ক্রিপ্টে ইথেরিয়াম ক্লায়েন্টগুলি কীভাবে কাজ করে তা খতিয়ে দেখতে দেয়! + +**ক্লায়েন্টটি দেখুন** +[`@ethereumjs/client`](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/client) + +## অন্যান্য প্রকল্প {#other-projects} + +ইথেরিয়াম জাভাস্ক্রিপ্টের জগতে আরও অনেক কিছু চলছে, যার মধ্যে রয়েছে: + +- ওয়ালেট ইউটিলিটির লাইব্রেরি। +- ইথেরিয়াম কী জেনারেট, ইম্পোর্ট এবং এক্সপোর্ট করার টুলস। +- `merkle-patricia-tree`-এর একটি ইমপ্লিমেন্টেশন – এটি একটি ডেটা কাঠামো যা ইথেরিয়াম ইয়েলো পেপারে বর্ণিত আছে। + +[EthereumJS রেপোতে](https://github.com/ethereumjs) আপনার সবচেয়ে আগ্রহের বিষয়গুলো নিয়ে অনুসন্ধান করুন। + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/programming-languages/python/index.md b/public/content/translations/bn/developers/docs/programming-languages/python/index.md new file mode 100644 index 00000000000..e44a8224a05 --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/python/index.md @@ -0,0 +1,99 @@ +--- +title: "পাইথন ডেভেলপারদের জন্য ইথেরিয়াম" +description: "শিখুন কিভাবে পাইথন-ভিত্তিক প্রজেক্ট ও টুল ব্যবহার করে ইথেরিয়ামের জন্য ডেভেলপ করা যায়" +lang: bn +incomplete: true +--- + +পাইথন-ভিত্তিক প্রজেক্ট এবং টুলিং ব্যবহার করে Ethereum-এর জন্য কীভাবে ডেভেলপ করতে হয় তা শিখুন + +ইথেরিয়াম ব্যবহার করে বিকেন্দ্রীভূত অ্যাপ্লিকেশন (বা "ড্যাপস") তৈরি করুন যেগুলো ক্রিপ্টোকারেন্সি এবং ব্লকচেইন প্রযুক্তির সুবিধাগুলোকে কাজে লাগায়।. এই ড্যাপগুলো বিশ্বাসযোগ্য হতে পারে, অর্থাৎ এগুলোকে একবার ইথেরিয়ামে প্রয়োগ করা হয়ে গেলে, এগুলো সবসময় প্রোগ্রামড হিসেবে চলতে থাকবে।. নতুন ধরণের আর্থিক অ্যাপ্লিকেশন তৈরি করার জন্য এগুলো ডিজিটাল সম্পদকে নিয়ন্ত্রণ করতে পারে।. এগুলো বিকেন্দ্রীভূত হতে পারে, যার মানে কোন একক সত্ত্বা বা ব্যক্তি এগুলো নিয়ন্ত্রণ করেনা এবং এগুলো সেন্সর করা প্রায় অসম্ভব।. + +## স্মার্ট কন্ট্র্যাক্ট এবং Solidity ভাষা দিয়ে শুরু করা {#getting-started-with-smart-contracts-and-solidity} + +**পাইথনের সাথে ইথেরিয়ামকে একীভূত করার জন্য প্রথম পদক্ষেপ নিন** + +একদম প্রথম থেকে শুরু করতে চান? [ethereum.org/learn](/learn/) বা [ethereum.org/developers](/developers/) দেখুন। + +- [ব্লকচেইনের ব্যাখ্যা](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [স্মার্ট কন্ট্র্যাক্ট বোঝা](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [আপনার প্রথম স্মার্ট কন্ট্র্যাক্টটি লিখুন](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [কীভাবে Solidity কম্পাইল এবং ডিপ্লয় করতে হয় তা শিখুন](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) +- [ব্লকচেইনে পাইথনের অবস্থা ২০২৩ রিপোর্ট](https://tradingstrategy.ai/blog/the-state-of-python-in-blockchain-in-2023) + +## নতুনদের জন্য নিবন্ধ {#beginner-articles} + +- [web3.py ওভারভিউ](https://web3py.readthedocs.io/en/latest/overview.html) +- [Ethereum পাইথন ইকোসিস্টেম ট্যুর](https://snakecharmers.ethereum.org/python-ecosystem/) +- [Ethereum-এর জন্য একজন (পাইথন) ডেভেলপারের নির্দেশিকা](https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/) +- [পুরস্কার-যোগ্য: একটি Ethereum পাইথন হ্যাকাথন নির্দেশিকা](https://snakecharmers.ethereum.org/prize-worthy/) +- [Vyper-এর সাথে স্মার্ট কন্ট্র্যাক্টের একটি ভূমিকা](https://kauri.io/#collections/Getting%20Started/an-introduction-to-smart-contracts-with-vyper/) +- [পাইথন ফ্লাস্ক ব্যবহার করে কীভাবে Ethereum কন্ট্র্যাক্ট ডেভেলপ করবেন?](https://medium.com/coinmonks/how-to-develop-ethereum-contract-using-python-flask-9758fe65976e) +- [Web3.py-এর ভূমিকা · পাইথন ডেভেলপারদের জন্য Ethereum](https://www.dappuniversity.com/articles/web3-py-intro) +- [পাইথন এবং web3.py ব্যবহার করে কীভাবে একটি স্মার্ট কন্ট্র্যাক্ট ফাংশন কল করবেন](https://stackoverflow.com/questions/57580702/how-to-call-a-smart-contract-function-using-python-and-web3-py) + +## মধ্যবর্তী স্তরের নিবন্ধ {#intermediate-articles} + +- [web3.py-এর বন্ধুরা: Ape-এর ভূমিকা](https://snakecharmers.ethereum.org/intro-to-ape/) +- [পাইথন প্রোগ্রামারদের জন্য ডিএ্যাপ ডেভেলপমেন্ট](https://levelup.gitconnected.com/dapps-development-for-python-developers-f52b32b54f28) +- [একটি পাইথন Ethereum ইন্টারফেস তৈরি করা: পর্ব ১](https://hackernoon.com/creating-a-python-ethereum-interface-part-1-4d2e47ea0f4d) +- [পাইথনে Ethereum স্মার্ট কন্ট্র্যাক্ট: একটি (প্রায়) ব্যাপক নির্দেশিকা](https://hackernoon.com/ethereum-smart-contracts-in-python-a-comprehensive-ish-guide-771b03990988) + +## উন্নত ব্যবহারের প্যাটার্ন {#advanced-use-patterns} + +- [web3.py প্যাটার্নস: রিয়েল-টাইম ইভেন্ট সাবস্ক্রিপশন](https://snakecharmers.ethereum.org/subscriptions/) +- [web3.py প্যাটার্নস: WebSocketProvider](https://snakecharmers.ethereum.org/websocketprovider/) +- [পাইথন ব্যবহার করে Ethereum স্মার্ট কন্ট্র্যাক্ট কম্পাইল, ডিপ্লয় এবং কল করা](https://yohanes.gultom.id/2018/11/28/compiling-deploying-and-calling-ethereum-smartcontract-using-python/) +- [Slither দিয়ে Solidity স্মার্ট কন্ট্র্যাক্ট বিশ্লেষণ করুন](https://kauri.io/#collections/DevOps/analyze-solidity-smart-contracts-with-slither/#analyze-solidity-smart-contracts-with-slither) +- [ব্লকচেইন ফিনটেক টিউটোরিয়াল: পাইথন দিয়ে ঋণদান এবং ঋণগ্রহণ](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/) + +## আর্কাইভ করা নিবন্ধ + +- [পাইথন এবং ব্রাউনি দিয়ে আপনার নিজস্ব ERC20 টোকেন ডিপ্লয় করুন](https://betterprogramming.pub/python-blockchain-token-deployment-tutorial-create-an-erc20-77a5fd2e1a58) +- [স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করতে ব্রাউনি এবং পাইথন ব্যবহার করা](https://dev.to/patrickalphac/using-brownie-for-to-deploy-smart-contracts-1kkp) +- [ব্রাউনি দিয়ে OpenSea-তে NFT তৈরি করা](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) + +## পাইথন প্রজেক্ট এবং টুলস {#python-projects-and-tools} + +### সক্রিয়: {#active} + +- [Web3.py](https://github.com/ethereum/web3.py) - _Ethereum-এর সাথে ইন্টারঅ্যাক্ট করার জন্য পাইথন লাইব্রেরি_ +- [Vyper](https://github.com/ethereum/vyper/) - _EVM-এর জন্য পাইথনিক স্মার্ট কন্ট্র্যাক্ট ভাষা_ +- [Ape](https://github.com/ApeWorX/ape) - _পাইথনিস্টা, ডেটা সায়েন্টিস্ট এবং সিকিউরিটি পেশাদারদের জন্য স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্ট টুল_ +- [py-evm](https://github.com/ethereum/py-evm) - _ইথিরিয়াম ভার্চুয়াল মেশিনের বাস্তবায়ন_ +- [eth-tester](https://github.com/ethereum/eth-tester) - _Ethereum-ভিত্তিক অ্যাপ্লিকেশন পরীক্ষা করার জন্য টুলস_ +- [eth-utils](https://github.com/ethereum/eth-utils/) - _Ethereum সম্পর্কিত কোডবেসের সাথে কাজ করার জন্য ইউটিলিটি ফাংশন_ +- [py-solc-x](https://pypi.org/project/py-solc-x/) - _0.5.x সমর্থন সহ solc solidity কম্পাইলারের চারপাশে পাইথন র‍্যাপার_ +- [pymaker](https://github.com/makerdao/pymaker) - _মেকার কন্ট্র্যাক্টের জন্য পাইথন API_ +- [siwe](https://github.com/signinwithethereum/siwe-py) - _পাইথনের জন্য Ethereum (siwe) দিয়ে সাইন ইন করুন_ +- [Web3 DeFi for Ethereum integrations](https://github.com/tradingstrategy-ai/web3-ethereum-defi) - _ERC-20, Uniswap এবং অন্যান্য জনপ্রিয় প্রজেক্টের জন্য প্রস্তুত ইন্টিগ্রেশন সহ একটি পাইথন প্যাকেজ_ +- [Wake](https://getwake.io) - _কন্ট্র্যাক্ট টেস্টিং, ফাজিং, ডিপ্লয়মেন্ট, ভালনারেবিলিটি স্ক্যানিং এবং কোড নেভিগেশনের জন্য অল-ইন-ওয়ান পাইথন ফ্রেমওয়ার্ক (ল্যাঙ্গুয়েজ সার্ভার - [Tools for Solidity](https://marketplace.visualstudio.com/items?itemName=AckeeBlockchain.tools-for-solidity))_ + +### আর্কাইভ করা / আর রক্ষণাবেক্ষণ করা হয় না: {#archived--no-longer-maintained} + +- [Trinity](https://github.com/ethereum/trinity) - _Ethereum পাইথন ক্লায়েন্ট_ +- [Mamba](https://github.com/arjunaskykok/mamba) - _Vyper ভাষায় লেখা স্মার্ট কন্ট্র্যাক্ট লেখা, কম্পাইল এবং ডিপ্লয় করার ফ্রেমওয়ার্ক_ +- [Brownie](https://github.com/eth-brownie/brownie) - _Ethereum স্মার্ট কন্ট্র্যাক্ট ডিপ্লয়, পরীক্ষা এবং ইন্টারঅ্যাক্ট করার জন্য পাইথন ফ্রেমওয়ার্ক_ +- [pydevp2p](https://github.com/ethereum/pydevp2p) - _Ethereum P2P স্ট্যাকের বাস্তবায়ন_ +- [py-wasm](https://github.com/ethereum/py-wasm) - _ওয়েব অ্যাসেম্বলি ইন্টারপ্রিটারের পাইথন বাস্তবায়ন_ + +আরও সংস্থান খুঁজছেন? [ethereum.org/developers](/developers/) দেখুন। + +## পাইথন টুলিং ব্যবহারকারী প্রজেক্ট {#projects-using-python-tooling} + +নিম্নলিখিত Ethereum-ভিত্তিক প্রজেক্টগুলি এই পৃষ্ঠায় উল্লিখিত টুলস ব্যবহার করে। সম্পর্কিত ওপেন-সোর্স রিপোজিটরিগুলি উদাহরণ কোড এবং সেরা অনুশীলনের জন্য একটি ভাল রেফারেন্স হিসাবে কাজ করে। + +- [Yearn Finance](https://yearn.finance/) এবং [Yearn Vault Contracts রিপোজিটরি](https://github.com/yearn/yearn-vaults) +- [Curve](https://www.curve.finance/) এবং [Curve স্মার্ট কন্ট্র্যাক্ট রিপোজিটরি](https://github.com/curvefi/curve-contract) +- [BadgerDAO](https://badger.com/) এবং [Brownie টুলচেইন ব্যবহারকারী স্মার্ট কন্ট্র্যাক্ট](https://github.com/Badger-Finance/badger-system) +- [Sushi](https://sushi.com/) তাদের ভেস্টিং চুক্তিগুলি পরিচালনা এবং ডিপ্লয় করার জন্য [পাইথন ব্যবহার করে](https://github.com/sushiswap/sushi-vesting-protocols) +- [Alpha Finance](https://alphafinance.io/), যা Alpha Homora-এর জন্য বিখ্যাত, [স্মার্ট কন্ট্র্যাক্ট পরীক্ষা এবং ডিপ্লয় করতে Brownie ব্যবহার করে](https://github.com/AlphaFinanceLab/alpha-staking-contract) + +## পাইথন কমিউনিটি আলোচনা {#python-community-contributors} + +- Web3.py এবং অন্যান্য পাইথন ফ্রেমওয়ার্ক আলোচনার জন্য [Ethereum পাইথন কমিউনিটি ডিসকর্ড](https://discord.gg/9zk7snTfWe) +- Vyper স্মার্ট কন্ট্র্যাক্ট প্রোগ্রামিং আলোচনার জন্য [Vyper ডিসকর্ড](https://discord.gg/SdvKC79cJk) + +## অন্যান্য একত্রিত তালিকা {#other-aggregated-lists} + +Vyper উইকিতে Vyper-এর জন্য [রিসোর্সের একটি অবিশ্বাস্য তালিকা](https://github.com/vyperlang/vyper/wiki/Vyper-tools-and-resources) রয়েছে \ No newline at end of file diff --git a/public/content/translations/bn/developers/docs/programming-languages/ruby/index.md b/public/content/translations/bn/developers/docs/programming-languages/ruby/index.md new file mode 100644 index 00000000000..c7b657121c9 --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/ruby/index.md @@ -0,0 +1,60 @@ +--- +title: "রুবি ডেভেলপারদের জন্য ইথেরিয়াম" +description: "রুবি-ভিত্তিক প্রজেক্ট এবং টুলিং ব্যবহার করে কীভাবে ইথেরিয়ামের জন্য ডেভেলপ করতে হয় তা শিখুন।" +lang: bn +incomplete: false +--- + +রুবি-ভিত্তিক প্রজেক্ট এবং টুলিং ব্যবহার করে কীভাবে ইথেরিয়ামের জন্য ডেভেলপ করতে হয় তা শিখুন। + +ইথেরিয়াম ব্যবহার করে বিকেন্দ্রীভূত অ্যাপ্লিকেশন (বা "ড্যাপস") তৈরি করুন যেগুলো ক্রিপ্টোকারেন্সি এবং ব্লকচেইন প্রযুক্তির সুবিধাগুলোকে কাজে লাগায়।. এই ডিএ্যাপসগুলো ট্রাস্টলেস হতে পারে, যার মানে হলো একবার এগুলো ইথেরিয়ামে ডেপ্লয় করা হয়ে গেলে, এগুলো সর্বদা প্রোগ্রাম অনুযায়ী চলবে। তারা নতুন ধরনের আর্থিক অ্যাপ্লিকেশন তৈরি করতে ডিজিটাল অ্যাসেট নিয়ন্ত্রণ করতে পারে। এগুলো বিকেন্দ্রীভূত হতে পারে, যার মানে কোন একক সত্ত্বা বা ব্যক্তি এগুলো নিয়ন্ত্রণ করেনা এবং এগুলো সেন্সর করা প্রায় অসম্ভব।. + +## স্মার্ট কন্ট্র্যাক্ট এবং Solidity ভাষা দিয়ে শুরু করা {#getting-started-with-smart-contracts-and-solidity} + +**রুবি-এর সাথে ইথেরিয়ামকে একীভূত করার জন্য প্রথম পদক্ষেপ নিন** + +একদম প্রথম থেকে শুরু করতে চান? [ethereum.org/learn](/learn/) বা [ethereum.org/developers](/developers/) দেখুন। + +- [ব্লকচেইনের ব্যাখ্যা](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [স্মার্ট কন্ট্র্যাক্ট বোঝা](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [আপনার প্রথম স্মার্ট কন্ট্র্যাক্টটি লিখুন](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [কীভাবে Solidity কম্পাইল এবং ডিপ্লয় করতে হয় তা শিখুন](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) + +## নতুনদের জন্য নিবন্ধ {#beginner-articles} + +- [অবশেষে ইথেরিয়াম অ্যাকাউন্ট বোঝা](https://dev.to/q9/finally-understanding-ethereum-accounts-1kpe) +- [অবশেষে MetaMask-এর সাথে Rails ব্যবহারকারীদের প্রমাণীকরণ](https://dev.to/q9/finally-authenticating-rails-users-with-metamask-3fj) +- [রুবি ব্যবহার করে কীভাবে ইথেরিয়াম নেটওয়ার্কের সাথে সংযোগ স্থাপন করবেন](https://www.quicknode.com/guides/web3-sdks/how-to-connect-to-the-ethereum-network-using-ruby) +- [রুবি-তে কীভাবে একটি নতুন ইথেরিয়াম অ্যাড্রেস তৈরি করবেন](https://www.quicknode.com/guides/web3-sdks/how-to-generate-a-new-ethereum-address-in-ruby) + +## মধ্যবর্তী স্তরের নিবন্ধ {#intermediate-articles} + +- [রুবি সহ ব্লকচেইন অ্যাপ](https://www.nopio.com/blog/blockchain-app-ruby/) +- [স্মার্ট কন্ট্র্যাক্ট এক্সিকিউট করতে ইথেরিয়ামের সাথে সংযুক্ত রুবি ব্যবহার করুন](https://titanwolf.org/Network/Articles/Article?AID=87285822-9b25-49d5-ba2a-7ad95fff7ef9) + +## রুবি প্রজেক্ট এবং টুলস {#ruby-projects-and-tools} + +### সক্রিয় {#active} + +- [eth.rb](https://github.com/q9f/eth.rb) - _ইথেরিয়াম অ্যাকাউন্ট, মেসেজ এবং ট্রানজ্যাকশন পরিচালনা করার জন্য রুবি লাইব্রেরি এবং RPC-ক্লায়েন্ট_ +- [keccak.rb](https://github.com/q9f/keccak.rb) - _ইথেরিয়াম দ্বারা ব্যবহৃত Keccak (SHA3) হ্যাস_ +- [siwe-ruby](https://github.com/signinwithethereum/siwe-ruby) - _Sign-In with Ethereum-এর রুবি ইমপ্লিমেন্টেশন_ +- [siwe-rails](https://github.com/signinwithethereum/siwe-rails) - _রেলস জেম যা SIWE লোকাল সাইন ইন রুট যোগ করে_ +- [siwe-rails-examples](https://github.com/signinwithethereum/siwe-rails-examples) - _কাস্টম কন্ট্রোলারের সাথে রুবি অন রেলস ব্যবহার করে SIWE-এর উদাহরণ_ +- [omniauth-siwe](https://github.com/signinwithethereum/omniauth-siwe) - _সাইন ইন উইথ ইথেরিয়াম (SIWE)-এর জন্য OmniAuth কৌশল_ +- [omniauth-nft](https://github.com/valthon/omniauth-nft) - _NFT মালিকানার মাধ্যমে প্রমাণীকরণের জন্য OmniAuth কৌশল_ +- [ethereum-on-rails](https://github.com/q9f/ethereum-on-rails) - _ইথেরিয়াম অন রেলস টেমপ্লেট যা রুবি অন রেলস-এর সাথে MetaMask সংযোগ করার অনুমতি দেয়_ + +### আর্কাইভ করা / আর রক্ষণাবেক্ষণ করা হয় না {#archived--no-longer-maintained} + +- [web3-eth](https://github.com/spikewilliams/vtada-ethereum) - _রুবি সহ ইথেরিয়াম নোডের RPC মেথড কল করা_ +- [ethereum_tree](https://github.com/longhoangwkm/ethereum_tree) - _BIP32 স্ট্যান্ডার্ড অনুসারে একটি হায়ারারকিকাল ডিটারমিনিস্টিক ওয়ালেট থেকে ETH অ্যাড্রেস তৈরি করার জন্য রুবি লাইব্রেরি_ +- [etherlite](https://github.com/budacom/etherlite) - _রুবি অন রেলসের জন্য ইথেরিয়াম ইন্টিগ্রেশন_ +- [ethereum.rb](https://github.com/EthWorks/ethereum.rb) - _ট্রানজ্যাকশন পাঠানো, কন্ট্র্যাক্ট তৈরি এবং তার সাথে ইন্টারঅ্যাক্ট করার জন্য JSON-RPC ইন্টারফেস ব্যবহার করে রুবি ইথেরিয়াম ক্লায়েন্ট এবং ইথেরিয়াম নোডের সাথে কাজ করার জন্য দরকারী টুলকিট_ +- [omniauth-ethereum.rb](https://github.com/q9f/omniauth-ethereum.rb) - _OmniAuth-এর জন্য ইথেরিয়াম প্রোভাইডার কৌশল প্রয়োগ করে_ + +আরও সংস্থান খুঁজছেন? আমাদের [ডেভেলপারদের হোম](/developers/) দেখুন। + +## রুবি কমিউনিটির অবদানকারীগণ {#ruby-community-contributors} + +[ইথেরিয়াম রুবি টেলিগ্রাম গ্রুপ](https://t.me/ruby_eth) একটি দ্রুত বর্ধনশীল সম্প্রদায়ের হোস্ট এবং এটি উপরের যেকোনো প্রজেক্ট এবং সম্পর্কিত বিষয় নিয়ে আলোচনার জন্য নিবেদিত রিসোর্স। diff --git a/public/content/translations/bn/developers/docs/programming-languages/rust/index.md b/public/content/translations/bn/developers/docs/programming-languages/rust/index.md new file mode 100644 index 00000000000..e0fb7b950c8 --- /dev/null +++ b/public/content/translations/bn/developers/docs/programming-languages/rust/index.md @@ -0,0 +1,65 @@ +--- +title: "রাস্ট ডেভেলপারদের জন্য ইথেরিয়াম" +description: "শিখুন কীভাবে রাস্ট-ভিত্তিক প্রজেক্ট ও টুল ব্যবহার করে ইথেরিয়ামের জন্য ডেভেলপ করা যায়" +lang: bn +incomplete: true +--- + +রাস্ট-ভিত্তিক প্রজেক্ট এবং টুলিং ব্যবহার করে ইথেরিয়ামের জন্য কীভাবে ডেভেলপ করতে হয় তা শিখুন + +ইথেরিয়াম ব্যবহার করে বিকেন্দ্রীভূত অ্যাপ্লিকেশন (বা "ড্যাপস") তৈরি করুন যেগুলো ক্রিপ্টোকারেন্সি এবং ব্লকচেইন প্রযুক্তির সুবিধাগুলোকে কাজে লাগায়।. এই ড্যাপগুলো বিশ্বাসযোগ্য হতে পারে, অর্থাৎ এগুলোকে একবার ইথেরিয়ামে প্রয়োগ করা হয়ে গেলে, এগুলো সবসময় প্রোগ্রামড হিসেবে চলতে থাকবে।. নতুন ধরণের আর্থিক অ্যাপ্লিকেশন তৈরি করার জন্য এগুলো ডিজিটাল সম্পদকে নিয়ন্ত্রণ করতে পারে।. এগুলো বিকেন্দ্রীভূত হতে পারে, যার মানে কোন একক সত্ত্বা বা ব্যক্তি এগুলো নিয়ন্ত্রণ করেনা এবং এগুলো সেন্সর করা প্রায় অসম্ভব।. + +## স্মার্ট কন্ট্র্যাক্ট এবং Solidity ভাষা দিয়ে শুরু করা {#getting-started-with-smart-contracts-and-solidity} + +**রাস্ট-এর সাথে ইথেরিয়ামকে একীভূত করার জন্য প্রথম পদক্ষেপ নিন** + +একদম প্রথম থেকে শুরু করতে চান ? [ethereum.org/learn](/learn/) বা [ethereum.org/developers](/developers/) দেখুন। + +- [ব্লকচেইনের ব্যাখ্যা](https://kauri.io/article/d55684513211466da7f8cc03987607d5/blockchain-explained) +- [স্মার্ট কন্ট্র্যাক্ট বোঝা](https://kauri.io/article/e4f66c6079e74a4a9b532148d3158188/ethereum-101-part-5-the-smart-contract) +- [আপনার প্রথম স্মার্ট কন্ট্র্যাক্টটি লিখুন](https://kauri.io/article/124b7db1d0cf4f47b414f8b13c9d66e2/remix-ide-your-first-smart-contract) +- [কীভাবে Solidity কম্পাইল এবং ডিপ্লয় করতে হয় তা শিখুন](https://kauri.io/article/973c5f54c4434bb1b0160cff8c695369/understanding-smart-contract-compilation-and-deployment) + +## নতুনদের জন্য নিবন্ধ {#beginner-articles} + +- [The Rust Ethereum Client](https://openethereum.github.io/) \* **দ্রষ্টব্য যে OpenEthereum [ডেপ্রিকেটেড হয়ে গেছে](https://medium.com/openethereum/gnosis-joins-erigon-formerly-turbo-geth-to-release-next-gen-ethereum-client-c6708dd06dd) এবং এটি আর রক্ষণাবেক্ষণ করা হচ্ছে না।** এটি সতর্কতার সাথে ব্যবহার করুন এবং অন্য কোনো ক্লায়েন্ট ইমপ্লিমেন্টেশনে স্যুইচ করা শ্রেয়। +- [রাস্ট ব্যবহার করে ইথেরিয়ামে লেনদেন পাঠানো](https://kauri.io/#collections/A%20Hackathon%20Survival%20Guide/sending-ethereum-transactions-with-rust/) +- [কোভান-এর জন্য রাস্ট Wasm-এ কীভাবে কন্ট্র্যাক্ট লিখতে হয় তার একটি ধাপে ধাপে নির্দেশিকা](https://github.com/paritytech/pwasm-tutorial) + +## মধ্যবর্তী স্তরের নিবন্ধ {#intermediate-articles} + +## উন্নত ব্যবহারের প্যাটার্ন {#advanced-use-patterns} + +- [ইথেরিয়ামের মতো নেটওয়ার্কের সাথে ইন্টারঅ্যাক্ট করার জন্য pwasm_ethereum externs লাইব্রেরি](https://github.com/openethereum/pwasm-ethereum) + +- [জাভাস্ক্রিপ্ট এবং রাস্ট ব্যবহার করে একটি ডিসেন্ট্রালাইজড চ্যাট তৈরি করুন](https://medium.com/perlin-network/build-a-decentralized-chat-using-javascript-rust-webassembly-c775f8484b52) + +- [Vue.js এবং রাস্ট ব্যবহার করে একটি ডিসেন্ট্রালাইজড টুডু অ্যাপ তৈরি করুন](https://medium.com/@jjmace01/build-a-decentralized-todo-app-using-vue-js-rust-webassembly-5381a1895beb) + +- [রাস্ট-এ একটি ব্লকচেইন তৈরি করুন](https://blog.logrocket.com/how-to-build-a-blockchain-in-rust/) + +## রাস্ট প্রজেক্ট এবং টুলস {#rust-projects-and-tools} + +- [pwasm-ethereum](https://github.com/paritytech/pwasm-ethereum) - _ইথেরিয়ামের মতো নেটওয়ার্কের সাথে ইন্টারঅ্যাক্ট করার জন্য externs-এর সংগ্রহ_ +- [Lighthouse](https://github.com/sigp/lighthouse) - _দ্রুত ইথেরিয়াম কনসেন্সাস লেয়ার ক্লায়েন্ট_ +- [Ethereum WebAssembly](https://ewasm.readthedocs.io/en/mkdocs/) - _WebAssembly-এর একটি ডিটারমিনিস্টিক সাবসেট ব্যবহার করে ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট এক্সিকিউশন লেয়ারের প্রস্তাবিত পুনঃনকশা_ +- [oasis_std](https://docs.rs/oasis-std/latest/oasis_std/index.html) - _OASIS API রেফারেন্স_ +- [Solaris](https://github.com/paritytech/sol-rs) - _নেটিভ প্যারিটি ক্লায়েন্ট EVM ব্যবহার করে সলিডিটি স্মার্ট কন্ট্র্যাক্টের ইউনিট টেস্ট হারনেস।_ +- [SputnikVM](https://github.com/rust-blockchain/evm) - _রাস্ট ইথেরিয়াম ভার্চুয়াল মেশিন ইমপ্লিমেন্টেশন_ +- [Wavelet](https://wavelet.perlin.net/docs/smart-contracts) - _রাস্ট-এ ওয়েভলেট স্মার্ট কন্ট্র্যাক্ট_ +- [Foundry](https://github.com/foundry-rs/foundry) - _ইথেরিয়াম অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য টুলকিট_ +- [Alloy](https://alloy.rs) - _ইথেরিয়াম এবং অন্যান্য EVM-ভিত্তিক চেইনের সাথে ইন্টারঅ্যাক্ট করার জন্য উচ্চ-পারফরম্যান্স, সু-পরীক্ষিত ও ডকুমেন্টেড লাইব্রেরি।_ +- [Ethers_rs](https://github.com/gakonst/ethers-rs) - _ইথেরিয়াম লাইব্রেরি এবং ওয়ালেট ইমপ্লিমেন্টেশন_ +- [SewUp](https://github.com/second-state/SewUp) - _একটি লাইব্রেরি যা আপনাকে রাস্টের সাহায্যে আপনার ইথেরিয়াম ওয়েব অ্যাসেম্বলি চুক্তি তৈরি করতে সাহায্য করে এবং এটি একটি সাধারণ ব্যাকএন্ডে ডেভেলপ করার মতোই_ +- [Substreams](https://github.com/streamingfast/substreams) - _সমান্তরাল ব্লকচেইন ডেটা ইন্ডেক্সিং প্রযুক্তি_ +- [Reth](https://github.com/paradigmxyz/reth) Reth (রাস্ট ইথেরিয়ামের সংক্ষিপ্ত রূপ) একটি নতুন ইথেরিয়াম ফুল-নোড ইমপ্লিমেন্টেশন +- [Awesome Ethereum Rust](https://github.com/Vid201/awesome-ethereum-rust) - _ইথেরিয়াম ইকোসিস্টেমে রাস্ট-এ লেখা প্রজেক্টগুলির একটি কিউরেটেড সংগ্রহ_ + +আরও সংস্থান খুঁজছেন? [ethereum.org/developers.](/developers/) দেখুন। + +## রাস্ট কমিউনিটি অবদানকারী {#rust-community-contributors} + +- [Ethereum WebAssembly](https://gitter.im/ewasm/Lobby) +- [Oasis Gitter](https://gitter.im/Oasis-official/Lobby) +- [Parity Gitter](https://gitter.im/paritytech/parity) +- [Enigma](https://discord.gg/SJK32GY) diff --git a/public/content/translations/bn/developers/docs/scaling/index.md b/public/content/translations/bn/developers/docs/scaling/index.md new file mode 100644 index 00000000000..25b432837f4 --- /dev/null +++ b/public/content/translations/bn/developers/docs/scaling/index.md @@ -0,0 +1,113 @@ +--- +title: "স্কেলিং" +description: "ইথেরিয়াম কমিউনিটির দ্বারা বর্তমানে তৈরি করা বিভিন্ন স্কেলিং বিকল্পগুলির একটি ভূমিকা।" +lang: bn +sidebarDepth: 3 +--- + +## স্কেলিং ওভারভিউ {#scaling-overview} + +যেহেতু ইথেরিয়াম ব্যবহারকারীর সংখ্যা বৃদ্ধি পেয়েছে, তাই ব্লকচেইনটি নির্দিষ্ট ক্ষমতার সীমাবদ্ধতায় পৌঁছেছে। এটি নেটওয়ার্ক ব্যবহারের খরচ বাড়িয়েছে, যার ফলে "স্কেলিং সমাধান"-এর প্রয়োজন তৈরি হয়েছে। একাধিক সমাধান নিয়ে গবেষণা, পরীক্ষা এবং প্রয়োগ করা হচ্ছে যা একই ধরনের লক্ষ্য অর্জনের জন্য বিভিন্ন পদ্ধতি গ্রহণ করে। + +স্কেলেবিলিটির মূল লক্ষ্য হল বিকেন্দ্রীকরণ বা নিরাপত্তা বিসর্জন না দিয়ে লেনদেনের গতি (দ্রুত ফাইনালিটি) এবং লেনদেনের থ্রুপুট (প্রতি সেকেন্ডে উচ্চ সংখ্যক লেনদেন) বৃদ্ধি করা। লেয়ার 1 ইথেরিয়াম ব্লকচেইনে, উচ্চ চাহিদার কারণে লেনদেন ধীরগতির হয় এবং [গ্যাস মূল্য](/developers/docs/gas/) অকার্যকর হয়ে পড়ে। গতি এবং থ্রুপুটের দিক থেকে নেটওয়ার্কের ক্ষমতা বৃদ্ধি করা ইথেরিয়ামের অর্থপূর্ণ এবং ব্যাপক গ্রহণের জন্য অপরিহার্য। + +গতি এবং থ্রুপুট গুরুত্বপূর্ণ হলেও, এটি অপরিহার্য যে এই লক্ষ্যগুলি সক্ষমকারী স্কেলিং সমাধানগুলি বিকেন্দ্রীভূত এবং নিরাপদ থাকে। নোড অপারেটরদের জন্য প্রবেশের বাধা কম রাখা কেন্দ্রীভূত এবং অনিরাপদ কম্পিউটিং শক্তির দিকে অগ্রগতি রোধ করার জন্য অত্যন্ত গুরুত্বপূর্ণ। + +ধারণাগতভাবে আমরা প্রথমে স্কেলিংকে অনচেইন স্কেলিং বা অফচেইন স্কেলিং হিসাবে শ্রেণীবদ্ধ করি। + +## পূর্বশর্ত {#prerequisites} + +আপনার সমস্ত foundational বিষয় সম্পর্কে একটি ভাল ধারণা থাকা উচিত। স্কেলিং সমাধানগুলি প্রয়োগ করা একটি উন্নত বিষয় কারণ প্রযুক্তিটি কম পরীক্ষিত এবং এটি নিয়ে গবেষণা ও উন্নয়ন অব্যাহত রয়েছে। + +## অনচেইন স্কেলিং {#onchain-scaling} + +অনচেইন স্কেলিংয়ের জন্য ইথেরিয়াম প্রোটোকলে (লেয়ার 1 [মেইননেট](/glossary/#mainnet)) পরিবর্তন প্রয়োজন। অনেক দিন ধরেই, ব্লকচেইন শার্ডিং ইথেরিয়ামকে স্কেল করবে বলে আশা করা হয়েছিল। এতে ভ্যালিডেটরদের উপসেট দ্বারা যাচাই করার জন্য ব্লকচেইনকে আলাদা খণ্ডে (শার্ড) বিভক্ত করার বিষয়টি জড়িত ছিল। তবে, লেয়ার-2 রোলআপের মাধ্যমে স্কেলিং প্রাথমিক স্কেলিং কৌশল হিসাবে স্থান করে নিয়েছে। এটি ইথেরিয়াম ব্লকের সাথে সংযুক্ত ডেটার একটি নতুন সস্তা ফর্মের সংযোজন দ্বারা সমর্থিত যা ব্যবহারকারীদের জন্য রোলআপগুলিকে সস্তা করার জন্য বিশেষভাবে ডিজাইন করা হয়েছে। + +### শার্ডিং {#sharding} + +শার্ডিং হল একটি ডেটাবেস বিভক্ত করার প্রক্রিয়া। ভ্যালিডেটরদের উপসেটগুলি পুরো ইথেরিয়ামের ট্র্যাক রাখার পরিবর্তে স্বতন্ত্র শার্ডগুলির জন্য দায়ী থাকবে। শার্ডিং দীর্ঘ সময়ের জন্য ইথেরিয়াম [রোডম্যাপে](/roadmap/) ছিল, এবং এটি একসময় দ্য মার্জ-এর আগে প্রুফ-অফ-স্টেক-এ পাঠানোর উদ্দেশ্যে ছিল। যাইহোক, [লেয়ার 2 রোলআপ](#layer-2-scaling)-এর দ্রুত বিকাশ এবং [ড্যাঙ্কশার্ডিং](/roadmap/danksharding) (ইথেরিয়াম ব্লকে রোলআপ ডেটার ব্লব যোগ করা যা ভ্যালিডেটরদের দ্বারা খুব দক্ষতার সাথে যাচাই করা যায়) আবিষ্কার ইথেরিয়াম সম্প্রদায়কে শার্ডিং দ্বারা স্কেলিংয়ের পরিবর্তে রোলআপ-কেন্দ্রিক স্কেলিংকে সমর্থন করতে পরিচালিত করেছে। এটি ইথেরিয়ামের কনসেন্সাস যুক্তিকে আরও সহজ রাখতেও সাহায্য করবে। + +## অফচেইন স্কেলিং {#offchain-scaling} + +অফচেইন সমাধানগুলি লেয়ার 1 মেইননেট থেকে আলাদাভাবে প্রয়োগ করা হয় - তাদের বিদ্যমান ইথেরিয়াম প্রোটোকলে কোনও পরিবর্তনের প্রয়োজন হয় না। কিছু সমাধান, যা "লেয়ার 2" সমাধান হিসাবে পরিচিত, তাদের নিরাপত্তা সরাসরি লেয়ার 1 ইথেরিয়াম কনসেন্সাস থেকে পায়, যেমন [অপ্টিমিস্টিক রোলআপ](/developers/docs/scaling/optimistic-rollups/), [জিরো-নলেজ রোলআপ](/developers/docs/scaling/zk-rollups/) বা [স্টেট চ্যানেল](/developers/docs/scaling/state-channels/)। অন্যান্য সমাধানগুলির মধ্যে মেইননেট থেকে আলাদাভাবে তাদের নিরাপত্তা প্রাপ্ত বিভিন্ন ধরণের নতুন চেইন তৈরি করা জড়িত, যেমন [সাইডচেইন](#sidechains), [ভ্যালিডিয়াম](#validium), বা [প্লাসমা চেইন](#plasma)। এই সমাধানগুলি মেইননেটের সাথে যোগাযোগ করে কিন্তু বিভিন্ন লক্ষ্য অর্জনের জন্য তাদের নিরাপত্তা ভিন্নভাবে গ্রহণ করে। + +### লেয়ার 2 স্কেলিং {#layer-2-scaling} + +এই অফচেইন সমাধানগুলির বিভাগটি মেইননেট ইথেরিয়াম থেকে তার নিরাপত্তা লাভ করে। + +লেয়ার 2 হল সেইসব সমাধানগুলির জন্য একটি সম্মিলিত শব্দ যা আপনার অ্যাপ্লিকেশনকে মেইননেটের শক্তিশালী বিকেন্দ্রীভূত সুরক্ষা মডেলের সুবিধা গ্রহণ করার সময় ইথেরিয়াম মেইননেট (লেয়ার 1) এর বাইরে লেনদেন পরিচালনা করে স্কেল করতে সাহায্য করার জন্য ডিজাইন করা হয়েছে। নেটওয়ার্ক ব্যস্ত থাকলে লেনদেনের গতি কমে যায়, যা নির্দিষ্ট ধরনের ডিএ্যাপস-এর জন্য ব্যবহারকারীর অভিজ্ঞতাকে খারাপ করে তোলে। এবং নেটওয়ার্ক যত ব্যস্ত হয়, লেনদেন প্রেরকরা একে অপরকে ছাপিয়ে যাওয়ার লক্ষ্যে গ্যাস মূল্য বৃদ্ধি পায়। এটি ইথেরিয়াম ব্যবহারকে খুব ব্যয়বহুল করে তুলতে পারে। + +অধিকাংশ লেয়ার 2 সমাধান একটি সার্ভার বা সার্ভারের ক্লাস্টারের চারপাশে কেন্দ্রীভূত, যার প্রত্যেকটিকে নোড, ভ্যালিডেটর, অপারেটর, সিকোয়েন্সার, ব্লক উৎপাদক বা অনুরূপ শব্দ হিসাবে উল্লেখ করা যেতে পারে। বাস্তবায়নের উপর নির্ভর করে, এই লেয়ার 2 নোডগুলি ব্যবহারকারী ব্যক্তি, ব্যবসা বা সত্তা দ্বারা, অথবা কোনও তৃতীয় পক্ষের অপারেটর দ্বারা, অথবা ব্যক্তিদের একটি বড় গোষ্ঠী দ্বারা (মেইননেটের অনুরূপ) চালানো হতে পারে। সাধারণভাবে বলতে গেলে, লেনদেনগুলি সরাসরি লেয়ার 1 (মেইননেট)-এ জমা দেওয়ার পরিবর্তে এই লেয়ার 2 নোডগুলিতে জমা দেওয়া হয়। কিছু সমাধানের জন্য, লেয়ার 2 ইনস্ট্যান্স সেগুলিকে লেয়ার 1-এ নোঙ্গর করার আগে গ্রুপে ব্যাচ করে, যার পরে সেগুলি লেয়ার 1 দ্বারা সুরক্ষিত হয় এবং পরিবর্তন করা যায় না। এটি কীভাবে করা হয় তার বিবরণ বিভিন্ন লেয়ার 2 প্রযুক্তি এবং বাস্তবায়নের মধ্যে উল্লেখযোগ্যভাবে পরিবর্তিত হয়। + +একটি নির্দিষ্ট লেয়ার 2 ইনস্ট্যান্স অনেক অ্যাপ্লিকেশনের দ্বারা উন্মুক্ত এবং শেয়ার করা হতে পারে, অথবা একটি প্রকল্প দ্বারা ডিপ্লয় করা হতে পারে এবং শুধুমাত্র তাদের অ্যাপ্লিকেশন সমর্থন করার জন্য উৎসর্গীকৃত হতে পারে। + +#### লেয়ার 2 কেন প্রয়োজন? {#why-is-layer-2-needed} + +- প্রতি সেকেন্ডে লেনদেন বৃদ্ধি ব্যবহারকারীর অভিজ্ঞতাকে ব্যাপকভাবে উন্নত করে এবং মেইননেট ইথেরিয়ামে নেটওয়ার্কের যানজট কমায়। +- লেনদেনগুলি মেইননেট ইথেরিয়ামে একটি একক লেনদেনে রোল আপ করা হয়, যা ব্যবহারকারীদের জন্য গ্যাস ফি হ্রাস করে এবং ইথেরিয়ামকে সর্বত্র মানুষের জন্য আরও অন্তর্ভুক্তিমূলক এবং অ্যাক্সেসযোগ্য করে তোলে। +- স্কেলেবিলিটির কোনো আপডেট বিকেন্দ্রীকরণ বা নিরাপত্তার খরচে হওয়া উচিত নয় – লেয়ার 2 ইথেরিয়ামের উপরে তৈরি হয়। +- এপ্লিকেশন-নির্দিষ্ট লেয়ার 2 নেটওয়ার্ক রয়েছে যা স্কেলে সম্পদের সাথে কাজ করার সময় তাদের নিজস্ব দক্ষতার সেট নিয়ে আসে। + +[লেয়ার 2 সম্পর্কে আরও জানুন](/layer-2/)। + +#### রোলআপ {#rollups} + +রোলআপগুলি লেয়ার 1-এর বাইরে লেনদেন সম্পাদন করে এবং তারপর ডেটা লেয়ার 1-এ পোস্ট করা হয় যেখানে কনসেন্সাস পৌঁছানো হয়। যেহেতু লেনদেনের ডেটা লেয়ার 1 ব্লকে অন্তর্ভুক্ত করা হয়, এটি রোলআপগুলিকে নেটিভ ইথেরিয়াম নিরাপত্তা দ্বারা সুরক্ষিত করার অনুমতি দেয়। + +ভিন্ন নিরাপত্তা মডেল সহ দুই ধরনের রোলআপ রয়েছে: + +- **অপ্টিমিস্টিক রোলআপ**: ধরে নেয় যে লেনদেনগুলি ডিফল্টরূপে বৈধ এবং শুধুমাত্র একটি চ্যালেঞ্জের ক্ষেত্রে, একটি [**ফ্রড প্রুফ**](/glossary/#fraud-proof)-এর মাধ্যমে গণনা চালায়। [অপ্টিমিস্টিক রোলআপ সম্পর্কে আরও জানুন](/developers/docs/scaling/optimistic-rollups/)। +- **জিরো-নলেজ রোলআপ**: অফচেইন গণনা চালায় এবং চেইনে একটি [**ভ্যালিডিটি প্রুফ**](/glossary/#validity-proof) জমা দেয়। [জিরো-নলেজ রোলআপ সম্পর্কে আরও জানুন](/developers/docs/scaling/zk-rollups/)। + +#### স্টেট চ্যানেল {#channels} + +স্টেট চ্যানেলগুলি মাল্টিসিগ কন্ট্রাক্ট ব্যবহার করে অংশগ্রহণকারীদের দ্রুত এবং অবাধে অফচেইন লেনদেন করতে সক্ষম করে, তারপর মেইননেটের সাথে ফাইনালিটি সেটল করে। এটি নেটওয়ার্কের যানজট, ফি এবং বিলম্ব কমিয়ে দেয়। দুই ধরনের চ্যানেল হল বর্তমানে স্টেট চ্যানেল এবং পেমেন্ট চ্যানেল। + +[স্টেট চ্যানেল](/developers/docs/scaling/state-channels/) সম্পর্কে আরও জানুন। + +### সাইডচেইন {#sidechains} + +একটি সাইডচেইন হল একটি স্বাধীন EVM-সামঞ্জস্যপূর্ণ ব্লকচেইন যা মেইননেটের সমান্তরালে চলে। এগুলি টু-ওয়ে ব্রিজের মাধ্যমে ইথেরিয়ামের সাথে সামঞ্জস্যপূর্ণ এবং তাদের নিজস্ব নির্বাচিত কনসেন্সাস এবং ব্লক প্যারামিটারের নিয়ম অনুসারে চলে। + +[সাইডচেইন](/developers/docs/scaling/sidechains/) সম্পর্কে আরও জানুন। + +### প্লাসমা {#plasma} + +একটি প্লাসমা চেইন একটি পৃথক ব্লকচেইন যা মূল ইথেরিয়াম চেইনের সাথে নোঙ্গর করা হয় এবং বিরোধের সালিশি করতে ফ্রড প্রুফ (যেমন [অপ্টিমিস্টিক রোলআপ](/developers/docs/scaling/optimistic-rollups/)) ব্যবহার করে। + +[প্লাসমা](/developers/docs/scaling/plasma/) সম্পর্কে আরও জানুন। + +### ভ্যালিডিয়াম {#validium} + +একটি ভ্যালিডিয়াম চেইন জিরো-নলেজ রোলআপের মতো ভ্যালিডিটি প্রুফ ব্যবহার করে কিন্তু ডেটা মূল লেয়ার 1 ইথেরিয়াম চেইনে সংরক্ষণ করা হয় না। এটি প্রতি ভ্যালিডিয়াম চেইনে প্রতি সেকেন্ডে 10k লেনদেনের দিকে নিয়ে যেতে পারে এবং একাধিক চেইন সমান্তরালে চালানো যেতে পারে। + +[ভ্যালিডিয়াম](/developers/docs/scaling/validium/) সম্পর্কে আরও জানুন। + +## এতগুলি স্কেলিং সমাধানের প্রয়োজন কেন? {#why-do-we-need-these} + +- একাধিক সমাধান নেটওয়ার্কের যেকোনো একটি অংশে সামগ্রিক যানজট কমাতে সাহায্য করতে পারে এবং ব্যর্থতার একক পয়েন্টগুলিও প্রতিরোধ করতে পারে। +- সমগ্রটি তার অংশগুলির যোগফলের চেয়ে বড়। বিভিন্ন সমাধান বিদ্যমান থাকতে পারে এবং সামঞ্জস্যপূর্ণভাবে কাজ করতে পারে, যা ভবিষ্যতের লেনদেনের গতি এবং থ্রুপুটের উপর একটি সূচকীয় প্রভাবের জন্য অনুমতি দেয়। +- সমস্ত সমাধানের জন্য সরাসরি ইথেরিয়াম কনসেন্সাস অ্যালগরিদম ব্যবহার করার প্রয়োজন হয় না, এবং বিকল্পগুলি এমন সুবিধা দিতে পারে যা অন্যথায় পাওয়া কঠিন হবে। + +## আপনি কি দেখে শিখতে বেশি পছন্দ করেন? {#visual-learner} + + + +_দ্রষ্টব্য ভিডিওর ব্যাখ্যায় সমস্ত অফচেইন স্কেলিং সমাধান বোঝাতে "লেয়ার 2" শব্দটি ব্যবহার করা হয়েছে, যেখানে আমরা "লেয়ার 2" কে একটি অফচেইন সমাধান হিসাবে আলাদা করি যা লেয়ার 1 মেইননেট কনসেন্সাসের মাধ্যমে তার নিরাপত্তা অর্জন করে।_ + + + +## আরও পড়ুন {#further-reading} + +- [একটি রোলআপ-কেন্দ্রিক ইথেরিয়াম রোডম্যাপ](https://ethereum-magicians.org/t/a-rollup-centric-ethereum-roadmap/4698) _Vitalik Buterin_ +- [ইথেরিয়ামের জন্য লেয়ার 2 স্কেলিং সমাধানগুলির উপর আপ-টু-ডেট বিশ্লেষণ](https://www.l2beat.com/) +- [ইথেরিয়াম লেয়ার 2 স্কেলিং সমাধানগুলির মূল্যায়ন: একটি তুলনামূলক কাঠামো](https://medium.com/matter-labs/evaluating-ethereum-l2-scaling-solutions-a-comparison-framework-b6b2f410f955) +- [রোলআপের একটি অসম্পূর্ণ গাইড](https://vitalik.eth.limo/general/2021/01/05/rollup.html) +- [ইথেরিয়াম-চালিত ZK-রোলআপ: বিশ্ব সেরা](https://hackmd.io/@canti/rkUT0BD8K) +- [অপ্টিমিস্টিক রোলআপ বনাম ZK রোলআপ](https://limechain.tech/blog/optimistic-rollups-vs-zk-rollups/) +- [কেন উচ্চ স্কেলেবিলিটির জন্য রোলআপ + ডেটা শার্ডই একমাত্র টেকসই সমাধান](https://polynya.medium.com/why-rollups-data-shards-are-the-only-sustainable-solution-for-high-scalability-c9aabd6fbb48) +- [কোন ধরনের লেয়ার 3 বোধগম্য?](https://vitalik.eth.limo/general/2022/09/17/layer_3.html) +- [ডেটা উপলব্ধতা অথবা: কীভাবে রোলআপগুলি চিন্তা করা বন্ধ করতে এবং Ethereum-কে ভালোবাসতে শিখেছে](https://web.archive.org/web/20250515194659/https://web.archive.org/web/20241108192208/https://research.2077.xyz/data-availability-or-how-rollups-learned-to-stop-worrying-and-love-ethereum) +- [ইথেরিয়াম রোলআপের ব্যবহারিক নির্দেশিকা](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/scaling/optimistic-rollups/index.md b/public/content/translations/bn/developers/docs/scaling/optimistic-rollups/index.md new file mode 100644 index 00000000000..fe0b94bc2f4 --- /dev/null +++ b/public/content/translations/bn/developers/docs/scaling/optimistic-rollups/index.md @@ -0,0 +1,265 @@ +--- +title: "অপ্টিমেস্টিক রোলআপ" +description: "অপ্টিমেস্টিক রোলআপ-এর একটি ভূমিকা—Ethereum কমিউনিটি দ্বারা ব্যবহৃত একটি স্কেলিং সমাধান।" +lang: bn +--- + +অপ্টিমেস্টিক রোলআপ হলো লেয়ার 2 (L2) প্রোটোকল যা Ethereum-এর বেস লেয়ারের থ্রুপুট বাড়ানোর জন্য ডিজাইন করা হয়েছে। তারা অফচেইনে লেনদেন প্রসেস করে প্রধান Ethereum চেইনের উপর কম্পিউটেশন কমিয়ে দেয়, যা প্রসেসিং স্পিডে উল্লেখযোগ্য উন্নতি প্রদান করে। অন্যান্য স্কেলিং সমাধান, যেমন [সাইডচেইন](/developers/docs/scaling/sidechains/)-এর মতো নয়, অপ্টিমেস্টিক রোলআপ অনচেইনে লেনদেনের ফলাফল প্রকাশ করে মেইননেট থেকে নিরাপত্তা অর্জন করে, অথবা [প্লাসমা চেইন](/developers/docs/scaling/plasma/), যা Ethereum-এ জালিয়াতির প্রমাণ সহ লেনদেন যাচাই করে, কিন্তু লেনদেনের ডেটা অন্য কোথাও সংরক্ষণ করে। + +যেহেতু কম্পিউটেশন Ethereum ব্যবহারের একটি ধীর এবং ব্যয়বহুল অংশ, অপ্টিমেস্টিক রোলআপ স্কেলেবিলিটিতে 10-100x পর্যন্ত উন্নতি অফার করতে পারে। অপ্টিমেস্টিক রোলআপগুলি `calldata` হিসাবে বা [blobs](/roadmap/danksharding/)-এ Ethereum-এ লেনদেন লেখে, যা ব্যবহারকারীদের জন্য গ্যাসের খরচ কমায়। + +## পূর্বশর্ত {#prerequisites} + +আপনার [ইথেরিয়াম স্কেলিং](/developers/docs/scaling/) এবং [লেয়ার 2](/layer-2/) সম্পর্কিত আমাদের পেজগুলি পড়া এবং বোঝা উচিত। + +## অপ্টিমেস্টিক রোলআপ কী? {#what-is-an-optimistic-rollup} + +একটি অপ্টিমেস্টিক রোলআপ হলো Ethereum স্কেলিংয়ের একটি পদ্ধতি যা অফচেইনে কম্পিউটেশন এবং স্টেট স্টোরেজকে স্থানান্তর করে। অপ্টিমেস্টিক রোলআপ Ethereum-এর বাইরে লেনদেন কার্যকর করে, কিন্তু লেনদেনের ডেটা মেইননেটে `calldata` হিসাবে বা [blobs](/roadmap/danksharding/)-এ পোস্ট করে। + +অপ্টিমেস্টিক রোলআপ অপারেটররা Ethereum-এ জমা দেওয়ার আগে একাধিক অফচেইন লেনদেনকে বড় ব্যাচে একত্রে বান্ডিল করে। এই পদ্ধতিটি প্রতিটি ব্যাচে একাধিক লেনদেনের মধ্যে নির্দিষ্ট খরচ ছড়িয়ে দেয়, যা শেষ-ব্যবহারকারীদের জন্য ফি কমিয়ে দেয়। অপ্টিমেস্টিক রোলআপগুলি Ethereum-এ পোস্ট করা ডেটার পরিমাণ কমাতে কম্প্রেশন কৌশলও ব্যবহার করে। + +অপ্টিমেস্টিক রোলআপগুলিকে “অপ্টিমিস্টিক” বলে মনে করা হয় কারণ তারা ধরে নেয় অফচেইন লেনদেনগুলি বৈধ এবং অনচেইনে পোস্ট করা লেনদেন ব্যাচগুলির জন্য বৈধতার প্রমাণ প্রকাশ করে না। এটি অপ্টিমেস্টিক রোলআপগুলিকে [জিরো-নলেজ রোলআপ](/developers/docs/scaling/zk-rollups) থেকে আলাদা করে যা অফচেইন লেনদেনের জন্য ক্রিপ্টোগ্রাফিক [বৈধতার প্রমাণ](/glossary/#validity-proof) প্রকাশ করে। + +অপ্টিমেস্টিক রোলআপগুলি পরিবর্তে একটি জালিয়াতি-প্রমাণকারী স্কিমের উপর নির্ভর করে যেখানে লেনদেনগুলি সঠিকভাবে গণনা করা হয়নি এমন ক্ষেত্রে সনাক্ত করতে। Ethereum-এ একটি রোলআপ ব্যাচ জমা দেওয়ার পরে, একটি সময় উইন্ডো থাকে (যাকে একটি চ্যালেঞ্জ পিরিয়ড বলা হয়) যার সময় যে কেউ একটি [ফ্রড প্রুফ](/glossary/#fraud-proof) গণনা করে একটি রোলআপ লেনদেনের ফলাফলকে চ্যালেঞ্জ করতে পারে। + +যদি ফ্রড প্রুফ সফল হয়, রোলআপ প্রোটোকল লেনদেন(গুলি) পুনরায় কার্যকর করে এবং রোলআপের স্টেট সেই অনুযায়ী আপডেট করে। একটি সফল ফ্রড প্রুফের অন্য প্রভাব হল যে একটি ব্লকে ভুলভাবে কার্যকর করা লেনদেন অন্তর্ভুক্ত করার জন্য দায়ী সিকোয়েন্সার একটি জরিমানা পায়। + +যদি রোলআপ ব্যাচটি চ্যালেঞ্জ পিরিয়ড শেষ হওয়ার পরে বিনা প্রতিদ্বন্দ্বিতায় থাকে (অর্থাৎ, সমস্ত লেনদেন সঠিকভাবে কার্যকর করা হয়), তবে এটি Ethereum-এ বৈধ এবং গৃহীত বলে বিবেচিত হয়। অন্যরা একটি অসমর্থিত রোলআপ ব্লকের উপর নির্মাণ চালিয়ে যেতে পারে, কিন্তু একটি সতর্কতার সাথে: যদি পূর্বে প্রকাশিত একটি ভুলভাবে সম্পাদিত লেনদেনের উপর ভিত্তি করে লেনদেনের ফলাফলগুলি বিপরীত হয়ে যাবে। + +## অপ্টিমেস্টিক রোলআপগুলি কীভাবে Ethereum-এর সাথে ইন্টারঅ্যাক্ট করে? {#optimistic-rollups-and-Ethereum} + +অপ্টিমেস্টিক রোলআপগুলি হলো [অফচেইন স্কেলিং সলিউশন](/developers/docs/scaling/#offchain-scaling) যা Ethereum-এর উপরে কাজ করার জন্য তৈরি করা হয়েছে। প্রতিটি অপ্টিমেস্টিক রোলআপ Ethereum নেটওয়ার্কে স্থাপন করা স্মার্ট কন্ট্র্যাক্টের একটি সেট দ্বারা পরিচালিত হয়। অপ্টিমেস্টিক রোলআপগুলি মূল Ethereum চেইনের বাইরে লেনদেন প্রক্রিয়া করে, কিন্তু একটি অনচেইন রোলআপ চুক্তিতে অফচেইন লেনদেন (ব্যাচে) পোস্ট করে। Ethereum ব্লকচেইনের মতো, এই লেনদেন রেকর্ডটি অপরিবর্তনীয় এবং "অপ্টিমেস্টিক রোলআপ চেইন" গঠন করে। + +একটি অপ্টিমেস্টিক রোলআপের আর্কিটেকচারে নিম্নলিখিত অংশগুলি রয়েছে: + +**অনচেইন চুক্তি**: অপ্টিমেস্টিক রোলআপের অপারেশন Ethereum-এ চলমান স্মার্ট কন্ট্র্যাক্ট দ্বারা নিয়ন্ত্রিত হয়। এর মধ্যে রয়েছে এমন চুক্তি যা রোলআপ ব্লকগুলি সংরক্ষণ করে, রোলআপে স্টেট আপডেটগুলি পর্যবেক্ষণ করে এবং ব্যবহারকারীর আমানত ট্র্যাক করে। এই অর্থে, Ethereum অপ্টিমেস্টিক রোলআপগুলির জন্য বেস লেয়ার বা "লেয়ার 1" হিসাবে কাজ করে। + +**অফচেইন ভার্চুয়াল মেশিন (VM)**: যদিও অপ্টিমেস্টিক রোলআপ প্রোটোকল পরিচালনাকারী চুক্তিগুলি Ethereum-এ চলে, রোলআপ প্রোটোকল [Ethereum ভার্চুয়াল মেশিন](/developers/docs/evm/) থেকে আলাদা একটি ভার্চুয়াল মেশিনে গণনা এবং স্টেট স্টোরেজ সম্পাদন করে। অফচেইন VM হল যেখানে অ্যাপ্লিকেশনগুলি থাকে এবং স্টেটের পরিবর্তনগুলি কার্যকর করা হয়; এটি একটি অপ্টিমেস্টিক রোলআপের জন্য উপরের লেয়ার বা "লেয়ার 2" হিসাবে কাজ করে। + +যেহেতু অপ্টিমেস্টিক রোলআপগুলি EVM-এর জন্য লিখিত বা কম্পাইল করা প্রোগ্রামগুলি চালানোর জন্য ডিজাইন করা হয়েছে, অফচেইন VM অনেক EVM ডিজাইন স্পেস অন্তর্ভুক্ত করে। অতিরিক্তভাবে, অনচেইনে গণনা করা ফ্রড প্রুফগুলি Ethereum নেটওয়ার্ককে অফচেইন VM-এ গণনা করা স্টেট পরিবর্তনের বৈধতা প্রয়োগ করতে দেয়। + +অপ্টিমেস্টিক রোলআপগুলিকে 'হাইব্রিড স্কেলিং সমাধান' হিসাবে বর্ণনা করা হয় কারণ, যদিও তারা পৃথক প্রোটোকল হিসাবে বিদ্যমান, তাদের নিরাপত্তা বৈশিষ্ট্যগুলি Ethereum থেকে প্রাপ্ত। অন্যান্য জিনিসের মধ্যে, Ethereum একটি রোলআপের অফচেইন গণনার সঠিকতা এবং গণনার পিছনে ডেটার প্রাপ্যতা নিশ্চিত করে। এটি অপ্টিমেস্টিক রোলআপগুলিকে বিশুদ্ধ অফচেইন স্কেলিং প্রোটোকলগুলির (যেমন, [সাইডচেইন](/developers/docs/scaling/sidechains/)) চেয়ে বেশি সুরক্ষিত করে যা নিরাপত্তার জন্য Ethereum-এর উপর নির্ভর করে না। + +অপ্টিমেস্টিক রোলআপগুলি নিম্নলিখিতগুলির জন্য প্রধান Ethereum প্রোটোকলের উপর নির্ভর করে: + +### ডেটা প্রাপ্যতা {#data-availability} + +যেমন উল্লেখ করা হয়েছে, অপ্টিমেস্টিক রোলআপগুলি Ethereum-এ `calldata` বা [blobs](/roadmap/danksharding/) হিসাবে লেনদেনের ডেটা পোস্ট করে। যেহেতু রোলআপ চেইনের এক্সিকিউশন জমাকৃত লেনদেনের উপর ভিত্তি করে হয়, তাই যে কেউ Ethereum-এর বেস লেয়ারে নোঙর করা এই তথ্য ব্যবহার করে রোলআপের স্টেট কার্যকর করতে এবং স্টেট ট্রানজিশনের সঠিকতা যাচাই করতে পারে। + +[ডেটা প্রাপ্যতা](/developers/docs/data-availability/) অত্যন্ত গুরুত্বপূর্ণ কারণ স্টেট ডেটাতে অ্যাক্সেস ছাড়া, চ্যালেঞ্জাররা অবৈধ রোলআপ অপারেশনগুলির বিরুদ্ধে বিতর্ক করার জন্য ফ্রড প্রুফ তৈরি করতে পারে না। Ethereum ডেটা প্রাপ্যতা প্রদান করার সাথে সাথে, রোলআপ অপারেটরদের দূষিত কাজ (যেমন, অবৈধ ব্লক জমা দেওয়া) থেকে রক্ষা পাওয়ার ঝুঁকি হ্রাস পায়। + +### সেন্সরশিপ প্রতিরোধ {#censorship-resistance} + +অপ্টিমেস্টিক রোলআপগুলি সেন্সরশিপ প্রতিরোধের জন্য Ethereum-এর উপরও নির্ভর করে। একটি অপ্টিমেস্টিক রোলআপে একটি কেন্দ্রীভূত সত্তা (অপারেটর) লেনদেন প্রক্রিয়াকরণ এবং Ethereum-এ রোলআপ ব্লক জমা দেওয়ার জন্য দায়ী। এর কিছু প্রভাব রয়েছে: + +- রোলআপ অপারেটররা সম্পূর্ণরূপে অফলাইনে গিয়ে ব্যবহারকারীদের সেন্সর করতে পারে, অথবা নির্দিষ্ট লেনদেন সহ ব্লক তৈরি করতে অস্বীকার করে। + +- রোলআপ অপারেটররা মালিকানার মের্কেল প্রুফের জন্য প্রয়োজনীয় স্টেট ডেটা আটকে রেখে রোলআপ চুক্তিতে জমা করা তহবিল ব্যবহারকারীদের উত্তোলন করতে বাধা দিতে পারে। স্টেট ডেটা আটকে রাখা ব্যবহারকারীদের কাছ থেকে রোলআপের স্টেট গোপন করতে পারে এবং তাদের রোলআপের সাথে ইন্টারঅ্যাক্ট করতে বাধা দিতে পারে। + +অপ্টিমেস্টিক রোলআপগুলি অপারেটরদের Ethereum-এ স্টেট আপডেটের সাথে সম্পর্কিত ডেটা প্রকাশ করতে বাধ্য করে এই সমস্যার সমাধান করে। অনচেইনে রোলআপ ডেটা প্রকাশ করার নিম্নলিখিত সুবিধা রয়েছে: + +- যদি একটি অপ্টিমেস্টিক রোলআপ অপারেটর অফলাইনে চলে যায় বা লেনদেন ব্যাচ তৈরি করা বন্ধ করে দেয়, তবে অন্য একটি নোড উপলব্ধ ডেটা ব্যবহার করে রোলআপের শেষ স্টেট পুনরুৎপাদন করতে এবং ব্লক উৎপাদন চালিয়ে যেতে পারে। + +- ব্যবহারকারীরা তহবিলের মালিকানা প্রমাণকারী মের্কেল প্রুফ তৈরি করতে এবং রোলআপ থেকে তাদের সম্পদ উত্তোলন করতে লেনদেনের ডেটা ব্যবহার করতে পারে। + +- ব্যবহারকারীরা সিকোয়েন্সারের কাছে না দিয়ে L1-এ তাদের লেনদেন জমা দিতে পারে, সেক্ষেত্রে সিকোয়েন্সারকে একটি নির্দিষ্ট সময়সীমার মধ্যে লেনদেনটি অন্তর্ভুক্ত করতে হবে যাতে বৈধ ব্লক তৈরি করা চালিয়ে যেতে পারে। + +### নিষ্পত্তি {#settlement} + +অপ্টিমেস্টিক রোলআপের প্রেক্ষাপটে Ethereum-এর আরেকটি ভূমিকা হল একটি সেটেলমেন্ট লেয়ার। একটি সেটেলমেন্ট লেয়ার সমগ্র ব্লকচেইন ইকোসিস্টেমকে নোঙ্গর করে, নিরাপত্তা প্রতিষ্ঠা করে, এবং যদি অন্য চেইনে (এই ক্ষেত্রে অপ্টিমেস্টিক রোলআপ) কোনো বিরোধ দেখা দেয় যার জন্য সালিশের প্রয়োজন হয় তবে উদ্দেশ্যমূলক ফাইনালিটি প্রদান করে। + +Ethereum মেইননেট অপ্টিমেস্টিক রোলআপগুলির জন্য ফ্রড প্রুফ যাচাই করতে এবং বিরোধ নিষ্পত্তির জন্য একটি হাব সরবরাহ করে। তাছাড়া, রোলআপে পরিচালিত লেনদেনগুলি শুধুমাত্র চূড়ান্ত হয় _পরে_ যখন রোলআপ ব্লকটি Ethereum-এ গৃহীত হয়। একবার একটি রোলআপ লেনদেন Ethereum-এর বেস লেয়ারে প্রতিশ্রুতিবদ্ধ হলে, এটি রোল ব্যাক করা যাবে না (একটি চেইন পুনর্গঠনের অত্যন্ত অসম্ভাব্য ঘটনা ছাড়া)। + +## অপ্টিমেস্টিক রোলআপগুলি কীভাবে কাজ করে? {#how-optimistic-rollups-work} + +### লেনদেন সম্পাদন এবং একত্রীকরণ {#transaction-execution-and-aggregation} + +ব্যবহারকারীরা "অপারেটর"দের কাছে লেনদেন জমা দেন, যা অপ্টিমেস্টিক রোলআপে লেনদেন প্রক্রিয়াকরণের জন্য দায়ী নোড। এছাড়াও একটি "ভ্যালিডেটর" বা "এগ্রিগেটর" হিসাবে পরিচিত, অপারেটর লেনদেনগুলি একত্রিত করে, অন্তর্নিহিত ডেটা সংকুচিত করে এবং Ethereum-এ ব্লকটি প্রকাশ করে। + +যদিও যে কেউ একজন ভ্যালিডেটর হতে পারে, অপ্টিমেস্টিক রোলআপ ভ্যালিডেটরদের অবশ্যই ব্লক তৈরির আগে একটি বন্ড প্রদান করতে হবে, অনেকটা [প্রুফ-অফ-স্টেক সিস্টেমের](/developers/docs/consensus-mechanisms/pos/) মতো। এই বন্ডটি স্ল্যাশ করা যেতে পারে যদি ভ্যালিডেটর একটি অবৈধ ব্লক পোস্ট করে বা একটি পুরানো-কিন্তু-অবৈধ ব্লকের উপর তৈরি করে (এমনকি যদি তাদের ব্লকটি বৈধ হয়)। এইভাবে অপ্টিমেস্টিক রোলআপগুলি ভ্যালিডেটরদের সৎভাবে কাজ করা নিশ্চিত করতে ক্রিপ্টো-অর্থনৈতিক প্রণোদনা ব্যবহার করে। + +অপ্টিমেস্টিক রোলআপ চেইনের অন্যান্য ভ্যালিডেটরদের রোলআপের স্টেটের তাদের কপি ব্যবহার করে জমা দেওয়া লেনদেনগুলি কার্যকর করার আশা করা হয়। যদি একজন ভ্যালিডেটরের চূড়ান্ত স্টেট অপারেটরের প্রস্তাবিত স্টেট থেকে ভিন্ন হয়, তবে তারা একটি চ্যালেঞ্জ শুরু করতে পারে এবং একটি ফ্রড প্রুফ গণনা করতে পারে। + +কিছু অপ্টিমেস্টিক রোলআপ একটি অনুমতিহীন ভ্যালিডেটর সিস্টেম ত্যাগ করতে পারে এবং চেইন কার্যকর করার জন্য একটি একক "সিকোয়েন্সার" ব্যবহার করতে পারে। একজন ভ্যালিডেটরের মতো, সিকোয়েন্সার লেনদেন প্রক্রিয়া করে, রোলআপ ব্লক তৈরি করে এবং L1 চেইনে (Ethereum) রোলআপ লেনদেন জমা দেয়। + +সিকোয়েন্সার একটি নিয়মিত রোলআপ অপারেটর থেকে ভিন্ন কারণ তাদের লেনদেন ক্রম করার উপর বৃহত্তর নিয়ন্ত্রণ রয়েছে। এছাড়াও, সিকোয়েন্সারের রোলআপ চেইনে অগ্রাধিকার অ্যাক্সেস রয়েছে এবং অনচেইন চুক্তিতে লেনদেন জমা দেওয়ার জন্য একমাত্র অনুমোদিত সত্তা। নন-সিকোয়েন্সার নোড বা নিয়মিত ব্যবহারকারীদের থেকে লেনদেনগুলি কেবল একটি পৃথক ইনবক্সে সারিবদ্ধ থাকে যতক্ষণ না সিকোয়েন্সার সেগুলিকে একটি নতুন ব্যাচে অন্তর্ভুক্ত করে। + +#### Ethereum-এ রোলআপ ব্লক জমা দেওয়া {#submitting-blocks-to-ethereum} + +যেমন উল্লেখ করা হয়েছে, একটি অপ্টিমেস্টিক রোলআপের অপারেটর একটি ব্যাচে অফচেইন লেনদেনগুলি বান্ডিল করে এবং নোটরাইজেশনের জন্য Ethereum-এ পাঠায়। এই প্রক্রিয়ায় লেনদেন-সম্পর্কিত ডেটা সংকুচিত করা এবং এটি `calldata` বা ব্লবগুলিতে Ethereum-এ প্রকাশ করা জড়িত। + +`calldata` একটি স্মার্ট কন্ট্র্যাক্টের একটি অপরিবর্তনযোগ্য, অ-স্থায়ী এলাকা যা বেশিরভাগ ক্ষেত্রে [মেমরির](/developers/docs/smart-contracts/anatomy/#memory) মতো আচরণ করে। যদিও `calldata` ব্লকচেইনের [ইতিহাস লগগুলির](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) অংশ হিসাবে অনচেইনে স্থায়ী থাকে, এটি Ethereum-এর স্টেটের অংশ হিসাবে সংরক্ষণ করা হয় না। যেহেতু `calldata` Ethereum-এর স্টেটের কোনো অংশ স্পর্শ করে না, তাই এটি অনচেইনে ডেটা সংরক্ষণের জন্য স্টেট থেকে সস্তা। + +`calldata` কীওয়ার্ডটি সলিডিটিতে এক্সিকিউশন সময়ে একটি স্মার্ট কন্ট্র্যাক্ট ফাংশনে আর্গুমেন্ট পাস করতেও ব্যবহৃত হয়। `calldata` একটি লেনদেনের সময় কল করা ফাংশনটিকে শনাক্ত করে এবং বাইটের একটি নির্বিচারে ক্রম আকারে ফাংশনে ইনপুট ধারণ করে। + +অপ্টিমেস্টিক রোলআপের প্রেক্ষাপটে, `calldata` অনচেইন চুক্তিতে সংকুচিত লেনদেনের ডেটা পাঠাতে ব্যবহৃত হয়। রোলআপ অপারেটর রোলআপ চুক্তিতে প্রয়োজনীয় ফাংশন কল করে এবং সংকুচিত ডেটা ফাংশন আর্গুমেন্ট হিসাবে পাস করে একটি নতুন ব্যাচ যোগ করে। `calldata` ব্যবহার করা ব্যবহারকারীর ফি হ্রাস করে কারণ রোলআপগুলির বেশিরভাগ খরচ অনচেইনে ডেটা সংরক্ষণ থেকে আসে। + +এই ধারণাটি কীভাবে কাজ করে তা দেখানোর জন্য একটি রোলআপ ব্যাচ জমা দেওয়ার [একটি উদাহরণ](https://eth.blockscout.com/tx/0x9102bfce17c58b5fc1c974c24b6bb7a924fb5fbd7c4cd2f675911c27422a5591) এখানে দেওয়া হল। সিকোয়েন্সার `appendSequencerBatch()` পদ্ধতিটি আহ্বান করেছে এবং `calldata` ব্যবহার করে ইনপুট হিসাবে সংকুচিত লেনদেনের ডেটা পাস করেছে। + +কিছু রোলআপ এখন Ethereum-এ লেনদেনের ব্যাচ পোস্ট করতে ব্লব ব্যবহার করে। + +ব্লবগুলি অপরিবর্তনযোগ্য এবং অ-স্থায়ী (ঠিক `calldata`-এর মতো) কিন্তু ~18 দিন পরে ইতিহাস থেকে ছেঁটে ফেলা হয়। ব্লব সম্পর্কে আরও তথ্যের জন্য, দেখুন [ড্যাঙ্কশার্ডিং](/roadmap/danksharding)। + +### স্টেট কমিটমেন্ট {#state-commitments} + +যেকোনো সময়ে, অপ্টিমেস্টিক রোলআপের স্টেট (অ্যাকাউন্ট, ব্যালেন্স, কন্ট্র্যাক্ট কোড, ইত্যাদি) একটি [মের্কেল ট্রি](/whitepaper/#merkle-trees) হিসাবে সংগঠিত হয় যাকে “স্টেট ট্রি” বলা হয়। এই মের্কেল ট্রি-এর রুট (স্টেট রুট), যা রোলআপের সর্বশেষ স্টেটকে নির্দেশ করে, তা হ্যাশ করে রোলআপ চুক্তিতে সংরক্ষণ করা হয়। চেইনের প্রতিটি স্টেট ট্রানজিশন একটি নতুন রোলআপ স্টেট তৈরি করে, যা একজন অপারেটর একটি নতুন স্টেট রুট গণনা করে প্রতিশ্রুতিবদ্ধ হয়। + +অপারেটরকে ব্যাচ পোস্ট করার সময় পুরানো স্টেট রুট এবং নতুন স্টেট রুট উভয়ই জমা দিতে হয়। যদি পুরানো স্টেট রুট অনচেইন চুক্তিতে বিদ্যমান স্টেট রুটের সাথে মিলে যায়, তবে পরেরটি বাতিল করা হয় এবং নতুন স্টেট রুট দ্বারা প্রতিস্থাপিত হয়। + +রোলআপ অপারেটরকে লেনদেন ব্যাচের জন্যও একটি মের্কেল রুট প্রতিশ্রুতিবদ্ধ করতে হয়। এটি যে কাউকে একটি [মের্কেল প্রুফ](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) উপস্থাপন করে ব্যাচে (L1-এ) একটি লেনদেন অন্তর্ভুক্ত করার প্রমাণ করতে দেয়। + +স্টেট প্রতিশ্রুতি, বিশেষ করে স্টেট রুট, একটি অপ্টিমেস্টিক রোলআপে স্টেট পরিবর্তনের সঠিকতা প্রমাণ করার জন্য প্রয়োজনীয়। রোলআপ চুক্তি অপারেটরদের থেকে নতুন স্টেট রুটগুলি পোস্ট করার সাথে সাথেই গ্রহণ করে, কিন্তু পরে রোলআপকে তার সঠিক স্টেটে পুনরুদ্ধার করার জন্য অবৈধ স্টেট রুটগুলি মুছে ফেলতে পারে। + +### জালিয়াতি প্রমাণ {#fraud-proving} + +যেমন ব্যাখ্যা করা হয়েছে, অপ্টিমেস্টিক রোলআপগুলি যে কাউকে বৈধতার প্রমাণ না দিয়ে ব্লক প্রকাশ করার অনুমতি দেয়। তবে, চেইনটি নিরাপদ থাকে তা নিশ্চিত করার জন্য, অপ্টিমেস্টিক রোলআপগুলি একটি সময় উইন্ডো নির্দিষ্ট করে যার সময় যে কেউ একটি স্টেট ট্রানজিশনকে বিতর্ক করতে পারে। অতএব, রোলআপ ব্লকগুলিকে “অ্যাসারশন” বলা হয় কারণ যে কেউ তাদের বৈধতাকে বিতর্ক করতে পারে। + +যদি কেউ একটি অ্যাসারশন নিয়ে বিতর্ক করে, তবে রোলআপ প্রোটোকল ফ্রড প্রুফ গণনা শুরু করবে। প্রত্যেক প্রকারের ফ্রড প্রুফ ইন্টারেক্টিভ—অন্য কেউ এটি চ্যালেঞ্জ করার আগে কাউকে একটি অ্যাসারশন পোস্ট করতে হবে। পার্থক্যটি ফ্রড প্রুফ গণনা করতে কত রাউন্ডের মিথস্ক্রিয়া প্রয়োজন তার মধ্যে নিহিত। + +একক-রাউন্ডের ইন্টারেক্টিভ প্রমাণ প্রকল্পগুলি অবৈধ অ্যাসারশন সনাক্ত করতে L1-এ বিতর্কিত লেনদেনগুলি পুনরায় চালায়। রোলআপ প্রোটোকল একটি ভেরিফায়ার চুক্তি ব্যবহার করে L1 (Ethereum)-এ বিতর্কিত লেনদেনের পুনরায় এক্সিকিউশন অনুকরণ করে, যেখানে গণনা করা স্টেট রুট নির্ধারণ করে কে চ্যালেঞ্জে জিতবে। তবে, চ্যালেঞ্জারের দাবি যদি রোলআপের সঠিক স্টেট সম্পর্কে সঠিক হয়, তবে অপারেটরকে তার বন্ড স্ল্যাশ করে শাস্তি দেওয়া হয়। + +তবে, জালিয়াতি সনাক্ত করতে L1-এ লেনদেন পুনরায় কার্যকর করার জন্য পৃথক লেনদেনের জন্য স্টেট প্রতিশ্রুতি প্রকাশ করতে হয় এবং রোলআপগুলিকে অনচেইনে প্রকাশ করতে হবে এমন ডেটার পরিমাণ বাড়িয়ে দেয়। লেনদেন পুনরায় প্লে করাও উল্লেখযোগ্য গ্যাস খরচ করে। এই কারণগুলির জন্য, অপ্টিমেস্টিক রোলআপগুলি মাল্টি-রাউন্ড ইন্টারেক্টিভ প্রুভিং-এ স্যুইচ করছে, যা একই উদ্দেশ্য (অর্থাৎ, অবৈধ রোলআপ অপারেশন সনাক্ত করা) আরও দক্ষতার সাথে অর্জন করে। + +#### মাল্টি-রাউন্ড ইন্টারেক্টিভ প্রুভিং {#multi-round-interactive-proving} + +মাল্টি-রাউন্ড ইন্টারেক্টিভ প্রুভিং-এ অ্যাসার্টার এবং চ্যালেঞ্জারের মধ্যে একটি ব্যাক-এন্ড-ফোর্থ প্রোটোকল জড়িত থাকে যা একটি L1 ভেরিফায়ার চুক্তি দ্বারা তত্ত্বাবধান করা হয়, যা শেষ পর্যন্ত মিথ্যাবাদী পক্ষকে সিদ্ধান্ত নেয়। একটি L2 নোড একটি অ্যাসারশনকে চ্যালেঞ্জ করার পরে, অ্যাসার্টারকে বিতর্কিত অ্যাসারশনটিকে দুটি সমান অর্ধে ভাগ করতে হয়। এই ক্ষেত্রে প্রতিটি পৃথক অ্যাসারশনে অন্যটির মতো একই সংখ্যক গণনার ধাপ থাকবে। + +চ্যালেঞ্জার তখন বেছে নেবে সে কোন অ্যাসারশনকে চ্যালেঞ্জ করতে চায়। বিভাজন প্রক্রিয়া (যাকে “বাইসেকশন প্রোটোকল” বলা হয়) চলতে থাকে যতক্ষণ না উভয় পক্ষ এক্সিকিউশনের একটি _একক_ ধাপ সম্পর্কে একটি অ্যাসারশন নিয়ে বিতর্ক করছে। এই সময়ে, L1 চুক্তিটি নির্দেশ (এবং এর ফলাফল) মূল্যায়ন করে বিতর্কটির সমাধান করবে যাতে প্রতারণামূলক পক্ষকে ধরা যায়। + +অ্যাসার্টারকে বিতর্কিত একক-ধাপ গণনার বৈধতা যাচাই করে একটি “এক-ধাপ প্রমাণ” সরবরাহ করতে হবে। যদি অ্যাসার্টার এক-ধাপ প্রমাণ সরবরাহ করতে ব্যর্থ হয়, অথবা L1 ভেরিফায়ার প্রমাণটি অবৈধ বলে মনে করে, তবে তারা চ্যালেঞ্জে হেরে যায়। + +এই ধরনের ফ্রড প্রুফ সম্পর্কে কিছু নোট: + +1. মাল্টি-রাউন্ড ইন্টারেক্টিভ ফ্রড প্রুভিং দক্ষ বলে মনে করা হয় কারণ এটি বিতর্ক সালিশে L1 চেইনকে যে কাজটি করতে হবে তা হ্রাস করে। পুরো লেনদেনটি পুনরায় প্লে করার পরিবর্তে, L1 চেইনকে কেবল রোলআপের এক্সিকিউশনে একটি ধাপ পুনরায় কার্যকর করতে হবে। + +2. বাইসেকশন প্রোটোকলগুলি অনচেইনে পোস্ট করা ডেটার পরিমাণ হ্রাস করে (প্রতিটি লেনদেনের জন্য স্টেট কমিট প্রকাশ করার প্রয়োজন নেই)। এছাড়াও, অপ্টিমেস্টিক রোলআপ লেনদেনগুলি Ethereum-এর গ্যাস লিমিট দ্বারা সীমাবদ্ধ নয়। বিপরীতে, লেনদেন পুনরায় কার্যকর করা অপ্টিমেস্টিক রোলআপগুলিকে অবশ্যই নিশ্চিত করতে হবে যে একটি L2 লেনদেনের গ্যাস লিমিট কম রয়েছে যাতে এটি একটি একক Ethereum লেনদেনের মধ্যে তার এক্সিকিউশন অনুকরণ করতে পারে। + +3. দূষিত অ্যাসার্টারের বন্ডের একটি অংশ চ্যালেঞ্জারকে পুরস্কৃত করা হয়, যখন অন্য অংশটি পুড়িয়ে ফেলা হয়। বার্নিং ভ্যালিডেটরদের মধ্যে যোগসাজশ প্রতিরোধ করে; যদি দুটি ভ্যালিডেটর ভুয়া চ্যালেঞ্জ শুরু করার জন্য যোগসাজশ করে, তবে তারা এখনও পুরো স্টেকের একটি উল্লেখযোগ্য অংশ বাজেয়াপ্ত করবে। + +4. মাল্টি-রাউন্ড ইন্টারেক্টিভ প্রুভিং-এর জন্য উভয় পক্ষকে (অ্যাসার্টার এবং চ্যালেঞ্জার) নির্দিষ্ট সময় উইন্ডোর মধ্যে পদক্ষেপ নিতে হয়। সময়সীমা শেষ হওয়ার আগে কাজ করতে ব্যর্থ হলে খেলাপি পক্ষ চ্যালেঞ্জটি বাজেয়াপ্ত করে। + +#### অপ্টিমেস্টিক রোলআপের জন্য ফ্রড প্রুফ কেন গুরুত্বপূর্ণ {#fraud-proof-benefits} + +ফ্রড প্রুফগুলি গুরুত্বপূর্ণ কারণ তারা অপ্টিমেস্টিক রোলআপগুলিতে _বিশ্বাসহীন ফাইনালিটি_ সহজতর করে। ট্রাস্টলেস ফাইনালিটি হল অপ্টিমেস্টিক রোলআপের একটি গুণ যা নিশ্চিত করে যে একটি লেনদেন - যতক্ষণ এটি বৈধ - অবশেষে নিশ্চিত করা হবে। + +দূষিত নোডগুলি মিথ্যা চ্যালেঞ্জ শুরু করে একটি বৈধ রোলআপ ব্লকের নিশ্চিতকরণ বিলম্বিত করার চেষ্টা করতে পারে। তবে, ফ্রড প্রুফগুলি অবশেষে রোলআপ ব্লকের বৈধতা প্রমাণ করবে এবং এটি নিশ্চিত করার কারণ হবে। + +এটি অপ্টিমেস্টিক রোলআপের আরেকটি নিরাপত্তা বৈশিষ্ট্যের সাথেও সম্পর্কিত: চেইনের বৈধতা _একটি_ সৎ নোডের অস্তিত্বের উপর নির্ভর করে। সৎ নোডটি বৈধ অ্যাসারশন পোস্ট করে বা অবৈধ অ্যাসারশন বিতর্ক করে চেইনটিকে সঠিকভাবে এগিয়ে নিয়ে যেতে পারে। যে কোনো ক্ষেত্রেই, সৎ নোডের সাথে বিতর্কে প্রবেশকারী দূষিত নোডগুলি ফ্রড প্রুভিং প্রক্রিয়ার সময় তাদের স্টেক হারাবে। + +### L1/L2 আন্তঃকার্যক্ষমতা {#l1-l2-interoperability} + +অপ্টিমেস্টিক রোলআপগুলি Ethereum মেইননেটের সাথে আন্তঃকার্যক্ষমতার জন্য ডিজাইন করা হয়েছে এবং ব্যবহারকারীদের L1 এবং L2 এর মধ্যে বার্তা এবং নির্বিচারে ডেটা পাস করার অনুমতি দেয়। তারা EVM-এর সাথেও সামঞ্জস্যপূর্ণ, তাই আপনি অপ্টিমেস্টিক রোলআপগুলিতে বিদ্যমান [ডিএ্যাপস](/developers/docs/dapps/) পোর্ট করতে পারেন বা Ethereum ডেভেলপমেন্ট টুল ব্যবহার করে নতুন ডিএ্যাপস তৈরি করতে পারেন। + +#### ১. সম্পদ চলাচল {#asset-movement} + +##### রোলআপে প্রবেশ করা + +একটি অপ্টিমেস্টিক রোলআপ ব্যবহার করতে, ব্যবহারকারীরা L1-এ রোলআপের [ব্রিজ](/developers/docs/bridges/) চুক্তিতে ETH, ERC-20 টোকেন এবং অন্যান্য গৃহীত সম্পদ জমা দেয়। ব্রিজ চুক্তিটি লেনদেনটি L2-এ রিলে করবে, যেখানে একটি সমতুল্য পরিমাণ সম্পদ মিন্ট করা হয় এবং অপ্টিমেস্টিক রোলআপে ব্যবহারকারীর নির্বাচিত ঠিকানায় পাঠানো হয়। + +ব্যবহারকারী-উৎপাদিত লেনদেন (যেমন একটি L1 > L2 আমানত) সাধারণত সারিবদ্ধ থাকে যতক্ষণ না সিকোয়েন্সার সেগুলিকে রোলআপ চুক্তিতে পুনরায় জমা দেয়। তবে, সেন্সরশিপ প্রতিরোধ রক্ষা করার জন্য, অপ্টিমেস্টিক রোলআপগুলি ব্যবহারকারীদের একটি লেনদেন সরাসরি অনচেইন রোলআপ চুক্তিতে জমা দেওয়ার অনুমতি দেয় যদি এটি অনুমোদিত সর্বোচ্চ সময়ের চেয়ে বেশি বিলম্বিত হয়ে থাকে। + +কিছু অপ্টিমেস্টিক রোলআপ সিকোয়েন্সারদের ব্যবহারকারীদের সেন্সর করা থেকে বিরত রাখতে আরও সহজবোধ্য পদ্ধতি গ্রহণ করে। এখানে, একটি ব্লক রোলআপ চেইনে প্রক্রিয়া করা লেনদেনগুলি ছাড়াও পূর্ববর্তী ব্লক (যেমন, আমানত) থেকে L1 চুক্তিতে জমা দেওয়া সমস্ত লেনদেন দ্বারা সংজ্ঞায়িত করা হয়। যদি একজন সিকোয়েন্সার একটি L1 লেনদেন উপেক্ষা করে, তবে এটি (প্রমাণযোগ্যভাবে) ভুল স্টেট রুট প্রকাশ করবে; তাই, সিকোয়েন্সাররা L1-এ পোস্ট করার পরে ব্যবহারকারী-উৎপাদিত বার্তাগুলি বিলম্বিত করতে পারে না। + +##### রোলআপ থেকে প্রস্থান করা + +একটি অপ্টিমেস্টিক রোলআপ থেকে Ethereum-এ উত্তোলন করা জালিয়াতি প্রমাণ স্কিমের কারণে আরও কঠিন। যদি একজন ব্যবহারকারী L1-এ এসক্রো করা তহবিল উত্তোলনের জন্য একটি L2 > L1 লেনদেন শুরু করেন, তবে তাদের অবশ্যই চ্যালেঞ্জ পিরিয়ড—প্রায় সাত দিন স্থায়ী—শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে। তবুও, উত্তোলন প্রক্রিয়াটি নিজেই মোটামুটি সহজবোধ্য। + +L2 রোলআপে প্রত্যাহারের অনুরোধ শুরু হওয়ার পরে, লেনদেনটি পরবর্তী ব্যাচে অন্তর্ভুক্ত করা হয়, যখন রোলআপে ব্যবহারকারীর সম্পদ পুড়িয়ে ফেলা হয়। একবার ব্যাচটি Ethereum-এ প্রকাশিত হলে, ব্যবহারকারী ব্লকে তাদের প্রস্থান লেনদেনের অন্তর্ভুক্তি যাচাই করে একটি মের্কেল প্রুফ গণনা করতে পারে। তারপর এটি L1-এ লেনদেন চূড়ান্ত করতে এবং মেইননেটে তহবিল উত্তোলনের জন্য বিলম্বের সময় অপেক্ষা করার বিষয়। + +Ethereum-এ তহবিল উত্তোলনের আগে এক সপ্তাহ অপেক্ষা এড়াতে, অপ্টিমেস্টিক রোলআপ ব্যবহারকারীরা একজন **লিকুইডিটি প্রোভাইডার** (LP) নিয়োগ করতে পারে। একজন লিকুইডিটি প্রোভাইডার একটি মুলতুবি L2 উত্তোলনের মালিকানা গ্রহণ করে এবং ব্যবহারকারীকে L1-এ (একটি ফি-এর বিনিময়ে) অর্থ প্রদান করে। + +লিকুইডিটি প্রোভাইডাররা তহবিল প্রকাশের আগে ব্যবহারকারীর প্রত্যাহারের অনুরোধের বৈধতা পরীক্ষা করতে পারে (চেইনটি নিজেরাই কার্যকর করে)। এইভাবে তাদের নিশ্চয়তা রয়েছে যে লেনদেনটি অবশেষে নিশ্চিত করা হবে (অর্থাৎ, বিশ্বাসহীন ফাইনালিটি)। + +#### 2. EVM কম্প্যাটিবিলিটি {#evm-compatibility} + +ডেভেলপারদের জন্য, অপ্টিমেস্টিক রোলআপগুলির সুবিধা হল তাদের সামঞ্জস্যতা—অথবা, আরও ভালভাবে বললে, [ইথিরিয়াম ভার্চুয়াল মেশিন (EVM)](/developers/docs/evm/)-এর সাথে সমতা। EVM-সামঞ্জস্যপূর্ণ রোলআপগুলি [Ethereum Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf)-এর স্পেসিফিকেশন মেনে চলে এবং বাইটকোড লেভেলে EVM সমর্থন করে। + +অপ্টিমেস্টিক রোলআপগুলিতে EVM-সামঞ্জস্যতার নিম্নলিখিত সুবিধা রয়েছে: + +i. ডেভেলপাররা কোডবেসগুলি ব্যাপকভাবে পরিবর্তন না করেই Ethereum-এ বিদ্যমান স্মার্ট কন্ট্র্যাক্টগুলি অপ্টিমেস্টিক রোলআপ চেইনে স্থানান্তর করতে পারে। এটি L2-এ Ethereum স্মার্ট কন্ট্র্যাক্ট স্থাপন করার সময় ডেভেলপমেন্ট টিমের সময় বাঁচাতে পারে। + +ii. অপ্টিমেস্টিক রোলআপ ব্যবহারকারী ডেভেলপার এবং প্রজেক্ট টিমগুলি Ethereum-এর অবকাঠামোর সুবিধা নিতে পারে। এর মধ্যে রয়েছে প্রোগ্রামিং ভাষা, কোড লাইব্রেরি, টেস্টিং টুলস, ক্লায়েন্ট সফটওয়্যার, ডিপ্লয়মেন্ট ইনফ্রাস্ট্রাকচার ইত্যাদি। + +বিদ্যমান টুলিং ব্যবহার করা গুরুত্বপূর্ণ কারণ এই টুলগুলি বছরের পর বছর ধরে ব্যাপকভাবে অডিট করা, ডিবাগ করা এবং উন্নত করা হয়েছে। এটি Ethereum ডেভেলপারদের একটি সম্পূর্ণ নতুন ডেভেলপমেন্ট স্ট্যাক দিয়ে কীভাবে তৈরি করতে হয় তা শেখার প্রয়োজনীয়তাও দূর করে। + +#### 3. ক্রস-চেইন কন্ট্র্যাক্ট কল {#cross-chain-contract-calls} + +ব্যবহারকারীরা (বাহ্যিকভাবে মালিকানাধীন অ্যাকাউন্ট) রোলআপ চুক্তিতে একটি লেনদেন জমা দিয়ে বা একজন সিকোয়েন্সার বা ভ্যালিডেটর তাদের জন্য এটি করার মাধ্যমে L2 চুক্তিগুলির সাথে ইন্টারঅ্যাক্ট করে। অপ্টিমেস্টিক রোলআপগুলি Ethereum-এ কন্ট্র্যাক্ট অ্যাকাউন্টগুলিকে L1 এবং L2 এর মধ্যে বার্তা রিলে করতে এবং ডেটা পাস করার জন্য ব্রিজিং চুক্তি ব্যবহার করে L2 চুক্তিগুলির সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেয়। এর মানে হল আপনি একটি L2 অপ্টিমেস্টিক রোলআপে চুক্তির অন্তর্গত ফাংশনগুলি আহ্বান করার জন্য Ethereum মেইননেটে একটি L1 চুক্তি প্রোগ্রাম করতে পারেন। + +ক্রস-চেইন কন্ট্র্যাক্ট কলগুলি অ্যাসিঙ্ক্রোনাসভাবে ঘটে—অর্থাৎ কলটি প্রথমে শুরু হয়, তারপর পরবর্তী সময়ে কার্যকর করা হয়। এটি Ethereum-এ দুটি চুক্তির মধ্যে কল থেকে ভিন্ন, যেখানে কলটি অবিলম্বে ফলাফল তৈরি করে। + +ক্রস-চেইন কন্ট্র্যাক্ট কলের একটি উদাহরণ হল পূর্বে বর্ণিত টোকেন জমা। L1-এ একটি চুক্তি ব্যবহারকারীর টোকেন এসক্রো করে এবং রোলআপে সমান পরিমাণ টোকেন মিন্ট করার জন্য একটি জোড়া L2 চুক্তিতে একটি বার্তা পাঠায়। + +যেহেতু ক্রস-চেইন মেসেজ কলের ফলে চুক্তি সম্পাদন হয়, তাই প্রেরককে সাধারণত গণনার জন্য [গ্যাস খরচ](/developers/docs/gas/) কভার করতে হয়। টার্গেট চেইনে লেনদেন ব্যর্থ হওয়া থেকে বিরত রাখতে একটি উচ্চ গ্যাস লিমিট সেট করার পরামর্শ দেওয়া হয়। টোকেন ব্রিজিং পরিস্থিতি একটি ভাল উদাহরণ; যদি লেনদেনের L1 দিকটি (টোকেন জমা দেওয়া) কাজ করে, কিন্তু L2 দিকটি (নতুন টোকেন মিন্ট করা) কম গ্যাসের কারণে ব্যর্থ হয়, তবে জমাটি পুনরুদ্ধারযোগ্য হয়ে যায়। + +অবশেষে, আমাদের উল্লেখ করা উচিত যে চুক্তিগুলির মধ্যে L2 > L1 মেসেজ কলগুলিকে বিলম্বের জন্য অ্যাকাউন্ট করতে হবে (L1 > L2 কলগুলি সাধারণত কিছু মিনিট পরে কার্যকর করা হয়)। এর কারণ হল অপ্টিমেস্টিক রোলআপ থেকে মেইননেটে পাঠানো বার্তাগুলি চ্যালেঞ্জ উইন্ডো শেষ না হওয়া পর্যন্ত কার্যকর করা যায় না। + +## অপ্টিমেস্টিক রোলআপ ফি কীভাবে কাজ করে? {#how-do-optimistic-rollup-fees-work} + +অপ্টিমেস্টিক রোলআপগুলি Ethereum-এর মতোই একটি গ্যাস ফি স্কিম ব্যবহার করে, যা বোঝায় যে ব্যবহারকারীরা প্রতি লেনদেনের জন্য কত অর্থ প্রদান করে। অপ্টিমেস্টিক রোলআপগুলিতে চার্জ করা ফি নিম্নলিখিত উপাদানগুলির উপর নির্ভর করে: + +1. **স্টেট রাইট**: অপ্টিমেস্টিক রোলআপগুলি Ethereum-এ একটি `blob`, বা "বাইনারি লার্জ অবজেক্ট" হিসাবে লেনদেনের ডেটা এবং ব্লক হেডার (পূর্ববর্তী ব্লক হেডার হ্যাশ, স্টেট রুট, ব্যাচ রুট সমন্বিত) প্রকাশ করে। [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) অনচেইনে ডেটা অন্তর্ভুক্ত করার জন্য একটি সাশ্রয়ী সমাধান প্রবর্তন করেছে। একটি `blob` হল একটি নতুন লেনদেন ক্ষেত্র যা রোলআপগুলিকে Ethereum L1-এ সংকুচিত স্টেট ট্রানজিশন ডেটা পোস্ট করার অনুমতি দেয়। `calldata`-এর বিপরীতে, যা স্থায়ীভাবে অনচেইনে থাকে, ব্লবগুলি স্বল্পস্থায়ী এবং [4096 epochs](https://github.com/ethereum/consensus-specs/blob/81f3ea8322aff6b9fb15132d050f8f98b16bdba4/configs/mainnet.yaml#L147) (প্রায় 18 দিন) পরে ক্লায়েন্টদের থেকে ছেঁটে ফেলা যেতে পারে। সংকুচিত লেনদেনের ব্যাচ পোস্ট করতে ব্লব ব্যবহার করে, অপ্টিমেস্টিক রোলআপগুলি L1-এ লেনদেন লেখার খরচ উল্লেখযোগ্যভাবে কমাতে পারে। + +2. **ব্লব গ্যাস ব্যবহৃত**: ব্লব-বহনকারী লেনদেনগুলি [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) দ্বারা প্রবর্তিত একটির অনুরূপ একটি গতিশীল ফি প্রক্রিয়া ব্যবহার করে। টাইপ-3 লেনদেনের জন্য গ্যাস ফি ব্লবের জন্য বেস ফি বিবেচনা করে, যা নেটওয়ার্ক দ্বারা ব্লব-স্পেস চাহিদা এবং প্রেরিত লেনদেনের ব্লব-স্পেস ব্যবহারের উপর ভিত্তি করে নির্ধারিত হয়। + +3. **L2 অপারেটর ফি**: এটি রোলআপ নোডগুলিকে লেনদেন প্রক্রিয়াকরণে ব্যয়িত গণনামূলক খরচের জন্য ক্ষতিপূরণ হিসাবে প্রদত্ত পরিমাণ, অনেকটা Ethereum-এ গ্যাস ফি-এর মতো। রোলআপ নোডগুলি কম লেনদেন ফি চার্জ করে কারণ L2-এর উচ্চ প্রক্রিয়াকরণ ক্ষমতা রয়েছে এবং নেটওয়ার্ক কনজেশনের মুখোমুখি হয় না যা Ethereum-এর ভ্যালিডেটরদের উচ্চ ফি সহ লেনদেনকে অগ্রাধিকার দিতে বাধ্য করে। + +অপ্টিমেস্টিক রোলআপগুলি ব্যবহারকারীদের জন্য ফি হ্রাস করার জন্য বেশ কয়েকটি প্রক্রিয়া প্রয়োগ করে, যার মধ্যে রয়েছে লেনদেন ব্যাচিং এবং ডেটা প্রকাশনার খরচ কমাতে `calldata` সংকুচিত করা। Ethereum-ভিত্তিক অপ্টিমেস্টিক রোলআপগুলি ব্যবহার করতে কত খরচ হয় তার একটি রিয়েল-টাইম ওভারভিউয়ের জন্য আপনি [L2 ফি ট্র্যাকার](https://l2fees.info/) পরীক্ষা করতে পারেন। + +## অপ্টিমেস্টিক রোলআপগুলি কীভাবে Ethereum স্কেল করে? {#scaling-ethereum-with-optimistic-rollups} + +যেমন ব্যাখ্যা করা হয়েছে, অপ্টিমেস্টিক রোলআপগুলি ডেটা প্রাপ্যতা নিশ্চিত করার জন্য Ethereum-এ সংকুচিত লেনদেনের ডেটা প্রকাশ করে। অনচেইনে প্রকাশিত ডেটা সংকুচিত করার ক্ষমতা অপ্টিমেস্টিক রোলআপগুলির সাথে Ethereum-এ থ্রুপুট স্কেল করার জন্য অত্যন্ত গুরুত্বপূর্ণ। + +প্রধান Ethereum চেইন ব্লকগুলি কত ডেটা ধারণ করতে পারে তার উপর সীমা রাখে, যা গ্যাস ইউনিটে চিহ্নিত করা হয় ([গড় ব্লক সাইজ](/developers/docs/blocks/#block-size) 15 মিলিয়ন গ্যাস)। যদিও এটি প্রতিটি লেনদেন কত গ্যাস ব্যবহার করতে পারে তা সীমাবদ্ধ করে, এর মানে হল আমরা লেনদেন-সম্পর্কিত ডেটা হ্রাস করে প্রতি ব্লকে প্রক্রিয়াকৃত লেনদেন বাড়াতে পারি—সরাসরি স্কেলেবিলিটি উন্নত করে। + +অপ্টিমেস্টিক রোলআপগুলি লেনদেন ডেটা কম্প্রেশন অর্জন করতে এবং TPS রেট উন্নত করতে বেশ কয়েকটি কৌশল ব্যবহার করে। উদাহরণস্বরূপ, এই [আর্টিকেল](https://vitalik.eth.limo/general/2021/01/05/rollup.html) তুলনা করে যে একটি সাধারণ ব্যবহারকারী লেনদেন (ইথার পাঠানো) মেইননেটে কতটা ডেটা তৈরি করে তার সাথে একই লেনদেন একটি রোলআপে কতটা ডেটা তৈরি করে: + +| প্যারামিটার | ইথেরিয়াম (L1) | রোলআপ (L2) | +| ----------- | ---------------------------------------------------- | ------------------------------------ | +| নন্স | ~3 | 0 | +| গ্যাসপ্রাইস | ~8 | 0-0.5 | +| গ্যাস | 3 | 0-0.5 | +| প্রতি | 21 | 4 | +| মান | 9 | ~3 | +| স্বাক্ষর | ~68 (2 + 33 + 33) | ~0.5 | +| থেকে | 0 (স্বাক্ষর থেকে পুনরুদ্ধার করা) | 4 | +| **মোট** | **~112 বাইট** | **~12 বাইট** | + +এই পরিসংখ্যানগুলির উপর কিছু মোটামুটি গণনা করা একটি অপ্টিমেস্টিক রোলআপ দ্বারা প্রদত্ত স্কেলেবিলিটি উন্নতিগুলি দেখাতে সাহায্য করতে পারে: + +1. প্রতিটি ব্লকের লক্ষ্য আকার 15 মিলিয়ন গ্যাস এবং এক বাইট ডেটা যাচাই করতে 16 গ্যাস খরচ হয়। গড় ব্লক সাইজকে 16 গ্যাস (15,000,000/16) দিয়ে ভাগ করলে দেখা যায় যে গড় ব্লকটি **937,500 বাইট ডেটা** ধারণ করতে পারে। +2. যদি একটি বেসিক রোলআপ লেনদেন 12 বাইট ব্যবহার করে, তবে গড় Ethereum ব্লক **78,125 রোলআপ লেনদেন** (937,500/12) বা **39 রোলআপ ব্যাচ** (যদি প্রতিটি ব্যাচে গড়ে 2,000 লেনদেন থাকে) প্রক্রিয়া করতে পারে। +3. যদি Ethereum-এ প্রতি 15 সেকেন্ডে একটি নতুন ব্লক তৈরি করা হয়, তবে রোলআপের প্রক্রিয়াকরণের গতি মোটামুটি **প্রতি সেকেন্ডে 5,208 লেনদেন** হবে। এটি একটি Ethereum ব্লক ধারণ করতে পারে এমন বেসিক রোলআপ লেনদেনের সংখ্যাকে (**78,125**) গড় ব্লক সময় (**15 সেকেন্ড**) দ্বারা ভাগ করে করা হয়। + +এটি একটি মোটামুটি আশাবাদী অনুমান, কারণ অপ্টিমেস্টিক রোলআপ লেনদেনগুলি সম্ভবত Ethereum-এ একটি সম্পূর্ণ ব্লক গঠন করতে পারে না। তবে, এটি একটি মোটামুটি ধারণা দিতে পারে যে অপ্টিমেস্টিক রোলআপগুলি Ethereum ব্যবহারকারীদের কতটা স্কেলেবিলিটি লাভ করতে পারে (বর্তমান বাস্তবায়নগুলি 2,000 TPS পর্যন্ত অফার করে)। + +Ethereum-এ [ডেটা শার্ডিং](/roadmap/danksharding/) প্রবর্তন অপ্টিমেস্টিক রোলআপগুলিতে স্কেলেবিলিটি উন্নত করবে বলে আশা করা হচ্ছে। যেহেতু রোলআপ লেনদেনগুলিকে অন্যান্য নন-রোলআপ লেনদেনগুলির সাথে ব্লকস্পেস ভাগ করতে হয়, তাই তাদের প্রক্রিয়াকরণ ক্ষমতা প্রধান Ethereum চেইনে ডেটা থ্রুপুট দ্বারা সীমিত। ড্যাঙ্কশার্ডিং L2 চেইনগুলির জন্য প্রতি ব্লকে ডেটা প্রকাশ করার জন্য উপলব্ধ স্থান বাড়াবে, ব্যয়বহুল, স্থায়ী `CALLDATA`-এর পরিবর্তে সস্তা, অস্থায়ী "ব্লব" স্টোরেজ ব্যবহার করে। + +### অপ্টিমেস্টিক রোলআপের সুবিধা এবং অসুবিধা {#optimistic-rollups-pros-and-cons} + +| যেসব বিষয়ে এর সুফল পাওয়া যায় | কনস | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| নিরাপত্তা বা বিশ্বাসহীনতা বিসর্জন না দিয়ে স্কেলেবিলিটিতে ব্যাপক উন্নতি প্রদান করে। | সম্ভাব্য জালিয়াতি চ্যালেঞ্জের কারণে লেনদেন চূড়ান্তকরণে বিলম্ব। | +| লেনদেনের ডেটা লেয়ার 1 চেইনে সংরক্ষণ করা হয়, যা স্বচ্ছতা, নিরাপত্তা, সেন্সরশিপ-প্রতিরোধ এবং বিকেন্দ্রীকরণ উন্নত করে। | কেন্দ্রীভূত রোলআপ অপারেটর (সিকোয়েন্সার) লেনদেনের ক্রমকে প্রভাবিত করতে পারে। | +| ফ্রড প্রুভিং বিশ্বাসহীন ফাইনালিটির গ্যারান্টি দেয় এবং সৎ সংখ্যালঘুদের চেইন সুরক্ষিত করার সুযোগ করে দেয়। | যদি কোনো সৎ নোড না থাকে তবে একজন দূষিত অপারেটর অবৈধ ব্লক এবং স্টেট প্রতিশ্রুতি পোস্ট করে তহবিল চুরি করতে পারে। | +| ফ্রড প্রুফ গণনা করা নিয়মিত L2 নোডের জন্য উন্মুক্ত, বৈধতা প্রমাণের (ZK-রোলআপগুলিতে ব্যবহৃত) বিপরীতে যার জন্য বিশেষ হার্ডওয়্যার প্রয়োজন। | নিরাপত্তা মডেলটি অন্তত একটি সৎ নোডের উপর নির্ভর করে যা রোলআপ লেনদেন সম্পাদন করে এবং অবৈধ স্টেট ট্রানজিশনকে চ্যালেঞ্জ করার জন্য ফ্রড প্রুফ জমা দেয়। | +| রোলআপগুলি "বিশ্বাসহীন লাইভনেস" থেকে উপকৃত হয় (যে কেউ লেনদেন সম্পাদন করে এবং অ্যাসারশন পোস্ট করে চেইনকে এগিয়ে নিয়ে যেতে পারে) | ব্যবহারকারীদের Ethereum-এ তহবিল ফেরত নেওয়ার আগে এক সপ্তাহের চ্যালেঞ্জ পিরিয়ড শেষ হওয়ার জন্য অপেক্ষা করতে হবে। | +| অপ্টিমেস্টিক রোলআপগুলি চেইনে নিরাপত্তা বাড়ানোর জন্য সু-পরিকল্পিত ক্রিপ্টো-অর্থনৈতিক প্রণোদনার উপর নির্ভর করে। | রোলআপগুলিকে সমস্ত লেনদেন ডেটা অনচেইনে পোস্ট করতে হবে, যা খরচ বাড়াতে পারে। | +| EVM এবং সলিডিটির সাথে সামঞ্জস্যতা ডেভেলপারদের Ethereum-নেটিভ স্মার্ট কন্ট্র্যাক্টগুলি রোলআপে পোর্ট করতে বা নতুন ডিএ্যাপস তৈরি করতে বিদ্যমান টুলিং ব্যবহার করার অনুমতি দেয়। | | + +### অপ্টিমেস্টিক রোলআপের একটি ভিজ্যুয়াল ব্যাখ্যা {#optimistic-video} + +আপনি কি দেখে শিখতে বেশি পছন্দ করেন? Finematics কীভাবে অপ্টিমেস্টিক রোলআপ ব্যাখ্যা করে তা দেখুন: + + + +## অপ্টিমেস্টিক রোলআপ সম্পর্কে আরও পড়ুন + +- [অপ্টিমেস্টিক রোলআপগুলি কীভাবে কাজ করে (সম্পূর্ণ নির্দেশিকা)](https://www.alchemy.com/overviews/optimistic-rollups) +- [একটি ব্লকচেইন রোলআপ কি? একটি প্রযুক্তিগত ভূমিকা](https://www.ethereum-ecosystem.com/blog/what-is-a-blockchain-rollup-a-technical-introduction) +- [আরবিট্রামের জন্য অপরিহার্য নির্দেশিকা](https://www.bankless.com/the-essential-guide-to-arbitrum) +- [Ethereum রোলআপগুলির জন্য ব্যবহারিক নির্দেশিকা](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [Ethereum L2-গুলিতে ফ্রড প্রুফগুলির অবস্থা](https://web.archive.org/web/20241124154627/https://research.2077.xyz/the-state-of-fraud-proofs-in-ethereum-l2s) +- [অপটিমিজমের রোলআপ সত্যিই কীভাবে কাজ করে?](https://www.paradigm.xyz/2021/01/how-does-optimism-s-rollup-really-work) +- [OVM ডিপ ডাইভ](https://medium.com/ethereum-optimism/ovm-deep-dive-a300d1085f52) +- [অপ্টিমিস্টিক ভার্চুয়াল মেশিন কী?](https://www.alchemy.com/overviews/optimistic-virtual-machine) diff --git a/public/content/translations/bn/developers/docs/scaling/plasma/index.md b/public/content/translations/bn/developers/docs/scaling/plasma/index.md new file mode 100644 index 00000000000..372ac88109a --- /dev/null +++ b/public/content/translations/bn/developers/docs/scaling/plasma/index.md @@ -0,0 +1,176 @@ +--- +title: "প্লাসমা চেন" +description: "Ethereum কমিউনিটি দ্বারা বর্তমানে ব্যবহৃত একটি স্কেলিং সমাধান হিসাবে প্লাসমা চেনের একটি ভূমিকা।" +lang: bn +incomplete: true +sidebarDepth: 3 +--- + +একটি প্লাসমা চেন হলো Ethereum Mainnet-এ নোঙর করা একটি পৃথক ব্লকচেইন কিন্তু ব্লক বৈধতার জন্য নিজস্ব প্রক্রিয়ার সাথে অফচেইনে লেনদেন সম্পাদন করে। প্লাসমা চেনকে কখনও কখনও "শিশু" চেন হিসাবে উল্লেখ করা হয়, যা মূলত Ethereum Mainnet-এর ছোট অনুলিপি। প্লাসমা চেন বিবাদের মীমাংসা করার জন্য [ফ্রড প্রুফ](/glossary/#fraud-proof) ব্যবহার করে (যেমন [অপ্টিমেস্টিক রোলআপ](/developers/docs/scaling/optimistic-rollups/))। + +Merkle ট্রি এই চেইনগুলির একটি অন্তহীন স্ট্যাক তৈরি করতে সক্ষম করে যা প্যারেন্ট চেইন (Ethereum Mainnet সহ) থেকে ব্যান্ডউইথ অফলোড করার জন্য কাজ করতে পারে। যাইহোক, যদিও এই চেইনগুলি Ethereum থেকে কিছু নিরাপত্তা অর্জন করে (ফ্রড প্রুফের মাধ্যমে), তাদের নিরাপত্তা এবং দক্ষতা বিভিন্ন ডিজাইনের সীমাবদ্ধতার দ্বারা প্রভাবিত হয়। + +## পূর্বশর্ত {#prerequisites} + +আপনার সমস্ত ভিত্তিগত বিষয়গুলির একটি ভাল ধারণা এবং [Ethereum স্কেলিং](/developers/docs/scaling/) সম্পর্কে একটি উচ্চ-স্তরের ধারণা থাকা উচিত। + +## প্লাসমা কি? + +Plasma হলো Ethereum-এর মতো পাবলিক ব্লকচেইনে স্কেলেবিলিটি উন্নত করার জন্য একটি ফ্রেমওয়ার্ক। মূল [Plasma হোয়াইটপেপার](http://plasma.io/plasma.pdf)-এ বর্ণিত হিসাবে, প্লাসমা চেন অন্য একটি ব্লকচেইনের (যাকে "রুট চেন" বলা হয়) উপরে তৈরি করা হয়েছে। প্রতিটি "শিশু চেন" রুট চেন থেকে প্রসারিত হয় এবং সাধারণত প্যারেন্ট চেইনে ডিপ্লয় করা একটি স্মার্ট কন্ট্র্যাক্ট দ্বারা পরিচালিত হয়। + +প্লাসমা কন্ট্র্যাক্ট, অন্যান্য কাজের মধ্যে, একটি [ব্রিজ](/developers/docs/bridges/) হিসাবে কাজ করে যা ব্যবহারকারীদের Ethereum Mainnet এবং প্লাসমা চেনের মধ্যে অ্যাসেট স্থানান্তর করতে দেয়। যদিও এটি তাদের [সাইডচেইন](/developers/docs/scaling/sidechains/)-এর অনুরূপ করে তোলে, প্লাসমা চেনগুলি—অন্তত, কিছুটা হলেও—Ethereum Mainnet-এর নিরাপত্তা থেকে উপকৃত হয়। এটি সাইডচেইনের মতো নয় যা শুধুমাত্র তাদের নিরাপত্তার জন্য দায়ী। + +## প্লাসমা কিভাবে কাজ করে? + +প্লাসমা ফ্রেমওয়ার্কের মূল উপাদানগুলি হলো: + +### অফ-চেন কম্পিউটেশন {#offchain-computation} + +Ethereum-এর বর্তমান প্রসেসিং স্পিড প্রতি সেকেন্ডে ~ 15-20 লেনদেনের মধ্যে সীমাবদ্ধ, যা আরও ব্যবহারকারীকে হ্যান্ডেল করার জন্য স্কেলিং-এর স্বল্পমেয়াদী সম্ভাবনাকে হ্রাস করে। এই সমস্যাটি মূলত বিদ্যমান কারণ Ethereum-এর [কনসেন্সাস মেকানিজম](/developers/docs/consensus-mechanisms/) এর জন্য ব্লকচেইনের স্টেটের প্রতিটি আপডেট যাচাই করার জন্য অনেক পিয়ার-টু-পিয়ার নোডের প্রয়োজন হয়। + +যদিও Ethereum-এর কনসেন্সাস মেকানিজম নিরাপত্তার জন্য প্রয়োজনীয়, এটি প্রতিটি ব্যবহারের ক্ষেত্রে প্রযোজ্য নাও হতে পারে। উদাহরণস্বরূপ, অ্যালিসকে এক কাপ কফির জন্য ববকে তার দৈনিক পেমেন্ট পুরো Ethereum নেটওয়ার্ক দ্বারা যাচাই করার প্রয়োজন নাও হতে পারে কারণ উভয় পক্ষের মধ্যে কিছু বিশ্বাস বিদ্যমান। + +প্লাসমা মনে করে যে Ethereum Mainnet-কে সমস্ত লেনদেন যাচাই করার প্রয়োজন নেই। পরিবর্তে, আমরা Mainnet-এর বাইরে লেনদেন প্রক্রিয়া করতে পারি, যা নোডগুলিকে প্রতিটি লেনদেন যাচাই করা থেকে মুক্ত করে। + +অফ-চেন কম্পিউটেশন প্রয়োজন কারণ প্লাসমা চেইন গতি এবং খরচের জন্য অপ্টিমাইজ করতে পারে। উদাহরণস্বরূপ, একটি প্লাসমা চেইন লেনদেনের অর্ডার এবং এক্সিকিউশন পরিচালনা করার জন্য একটি একক "অপারেটর" ব্যবহার করতে পারে—এবং প্রায়শই তাই করে। শুধুমাত্র একটি সত্তা লেনদেন যাচাই করার ফলে, একটি প্লাসমা চেইনে প্রসেসিং সময় Ethereum Mainnet-এর চেয়ে দ্রুত হয়। + +### স্টেট কমিটমেন্ট {#state-commitments} + +যদিও প্লাসমা অফচেইনে লেনদেন সম্পাদন করে, সেগুলি প্রধান Ethereum এক্সিকিউশন লেয়ারে সেটেল করা হয়—অন্যথায়, প্লাসমা চেনগুলি Ethereum-এর নিরাপত্তা গ্যারান্টি থেকে উপকৃত হতে পারে না। কিন্তু প্লাসমা চেইনের স্টেট না জেনে অফচেইন লেনদেন চূড়ান্ত করা হলে নিরাপত্তা মডেলটি ভেঙে যাবে এবং অবৈধ লেনদেনের বিস্তার ঘটবে। এই কারণেই অপারেটরকে, প্লাসমা চেইনে ব্লক তৈরির জন্য দায়ী সত্তা, পর্যায়ক্রমে Ethereum-এ "স্টেট কমিটমেন্ট" প্রকাশ করতে হয়। + +একটি [কমিটমেন্ট স্কিম](https://en.wikipedia.org/wiki/Commitment_scheme) হলো একটি ক্রিপ্টোগ্রাফিক কৌশল যা অন্য পক্ষের কাছে প্রকাশ না করে একটি মান বা বিবৃতির প্রতি প্রতিশ্রুতিবদ্ধ হওয়ার জন্য ব্যবহৃত হয়। কমিটমেন্টগুলি এই অর্থে "বাধ্যতামূলক" যে একবার আপনি এটির প্রতি প্রতিশ্রুতিবদ্ধ হয়ে গেলে আপনি মান বা বিবৃতি পরিবর্তন করতে পারবেন না। প্লাসমার স্টেট কমিটমেন্টগুলি "Merkle রুট" (একটি [Merkle ট্রি](/whitepaper/#merkle-trees) থেকে প্রাপ্ত) আকার নেয় যা অপারেটর নির্দিষ্ট সময় অন্তর Ethereum চেইনের প্লাসমা কন্ট্র্যাক্টে পাঠায়। + +Merkle রুট হলো ক্রিপ্টোগ্রাফিক প্রিমিটিভ যা বিপুল পরিমাণ তথ্য সংকুচিত করতে সক্ষম। একটি Merkle রুট (এই ক্ষেত্রে "ব্লক রুট"ও বলা হয়) একটি ব্লকের সমস্ত লেনদেনকে উপস্থাপন করতে পারে। Merkle রুটগুলি এটি যাচাই করা সহজ করে তোলে যে একটি ছোট ডেটা একটি বড় ডেটাসেটের অংশ। উদাহরণস্বরূপ, একটি নির্দিষ্ট ব্লকে একটি লেনদেনের অন্তর্ভুক্তি প্রমাণ করার জন্য একজন ব্যবহারকারী একটি [Merkle প্রুফ](/developers/tutorials/merkle-proofs-for-offline-data-integrity/#main-content) তৈরি করতে পারেন। + +অফচেইনের স্টেট সম্পর্কে Ethereum-কে তথ্য প্রদানের জন্য Merkle রুট গুরুত্বপূর্ণ। আপনি Merkle রুটগুলিকে "সেভ পয়েন্ট" হিসাবে ভাবতে পারেন: অপারেটর বলছে, "এটি সময়ের x বিন্দুতে প্লাসমা চেইনের স্টেট, এবং এটি তার প্রমাণ হিসাবে Merkle রুট।" অপারেটর একটি Merkle রুটের সাথে প্লাসমা চেইনের _বর্তমান স্টেটের_ প্রতি প্রতিশ্রুতিবদ্ধ হচ্ছে, যে কারণে এটিকে "স্টেট কমিটমেন্ট" বলা হয়। + +### প্রবেশ এবং প্রস্থান {#entries-and-exits} + +Ethereum ব্যবহারকারীদের প্লাসমা-র সুবিধা নিতে, Mainnet এবং প্লাসমা চেইনের মধ্যে ফান্ড স্থানান্তরের জন্য একটি মেকানিজম থাকা প্রয়োজন। তবে, আমরা প্লাসমা চেইনের একটি অ্যাড্রেসে ইচ্ছামত ইথার পাঠাতে পারি না—এই চেইনগুলি বেমানান, তাই লেনদেনটি হয় ব্যর্থ হবে অথবা ফান্ড হারিয়ে যাবে। + +প্লাসমা ব্যবহারকারীর প্রবেশ এবং প্রস্থান প্রক্রিয়া করার জন্য Ethereum-এ চলমান একটি মাস্টার কন্ট্র্যাক্ট ব্যবহার করে। এই মাস্টার কন্ট্র্যাক্টটি স্টেট কমিটমেন্ট (পূর্বে ব্যাখ্যা করা হয়েছে) ট্র্যাক করার এবং ফ্রড প্রুফের মাধ্যমে অসৎ আচরণকে শাস্তি দেওয়ার জন্যও দায়ী (এ সম্পর্কে পরে আরও আলোচনা করা হবে)। + +#### প্লাসমা চেইনে প্রবেশ করা {#entering-the-plasma-chain} + +প্লাসমা চেইনে প্রবেশ করার জন্য, অ্যালিসকে (ব্যবহারকারী) প্লাসমা কন্ট্র্যাক্টে ETH বা যেকোনো ERC-20 টোকেন জমা দিতে হবে। প্লাসমা অপারেটর, যে কন্ট্র্যাক্ট ডিপোজিট পর্যবেক্ষণ করে, অ্যালিসের প্রাথমিক জমার সমান পরিমাণ অর্থ পুনরায় তৈরি করে এবং প্লাসমা চেইনে তার অ্যাড্রেসে ছেড়ে দেয়। অ্যালিসকে চাইল্ড চেইনে ফান্ড প্রাপ্তির সত্যায়ন করতে হবে এবং তারপরে এই ফান্ড লেনদেনের জন্য ব্যবহার করতে পারবে। + +#### প্লাসমা চেইন থেকে প্রস্থান করা {#exiting-the-plasma-chain} + +প্লাসমা চেইন থেকে প্রস্থান করা এতে প্রবেশ করার চেয়ে বিভিন্ন কারণে আরও জটিল। সবচেয়ে বড় কারণ হল, যদিও Ethereum-এর কাছে প্লাসমা চেইনের স্টেট সম্পর্কে তথ্য রয়েছে, তবে এটি যাচাই করতে পারে না যে তথ্যটি সত্য কি না। একজন দুರುದ್ದেশ্যপূর্ণ ব্যবহারকারী একটি ভুল দাবি করতে পারে ("আমার কাছে 1000 ETH আছে") এবং দাবিটি সমর্থন করার জন্য জাল প্রমাণ সরবরাহ করে পার পেয়ে যেতে পারে। + +দুರುದ್ದেশ্যপূর্ণ উইথড্রয়াল রোধ করতে, একটি "চ্যালেঞ্জ পিরিয়ড" চালু করা হয়েছে। চ্যালেঞ্জ পিরিয়ডের সময় (সাধারণত এক সপ্তাহ), যে কেউ একটি ফ্রড-প্রুফ ব্যবহার করে একটি উইথড্রয়াল অনুরোধকে চ্যালেঞ্জ করতে পারে। যদি চ্যালেঞ্জ সফল হয়, তবে উইথড্রয়াল অনুরোধটি প্রত্যাখ্যান করা হয়। + +যাইহোক, সাধারণত ব্যবহারকারীরা সৎ হন এবং তাদের মালিকানাধীন ফান্ড সম্পর্কে সঠিক দাবি করেন। এই পরিস্থিতিতে, অ্যালিস রুট চেইনে (Ethereum) একটি উইথড্রয়াল অনুরোধ শুরু করবে প্লাসমা কন্ট্র্যাক্টে একটি লেনদেন জমা দিয়ে। + +তাকে অবশ্যই একটি Merkle প্রুফ সরবরাহ করতে হবে যা যাচাই করবে যে প্লাসমা চেইনে তার ফান্ড তৈরির একটি লেনদেন একটি ব্লকে অন্তর্ভুক্ত ছিল। এটি প্লাসমার পুনরাবৃত্তির জন্য প্রয়োজনীয়, যেমন [প্লাসমা MVP](https://www.learnplasma.org/en/learn/mvp.html), যা একটি [Unspent Transaction Output (UTXO)](https://en.wikipedia.org/wiki/Unspent_transaction_output) মডেল ব্যবহার করে। + +অন্যান্য, যেমন [প্লাসমা ক্যাশ](https://www.learnplasma.org/en/learn/cash.html), UTXO-এর পরিবর্তে ফান্ডকে [নন-ফাঞ্জিবল টোকেন](/developers/docs/standards/tokens/erc-721/) হিসাবে উপস্থাপন করে। এই ক্ষেত্রে, উইথড্র করার জন্য প্লাসমা চেইনে টোকেনের মালিকানার প্রমাণ প্রয়োজন। এটি টোকেন সম্পর্কিত দুটি সর্বশেষ লেনদেন জমা দিয়ে এবং সেই লেনদেনগুলির একটি ব্লকে অন্তর্ভুক্তি যাচাই করে একটি Merkle প্রুফ সরবরাহ করে করা হয়। + +ব্যবহারকারীকে সৎ আচরণের গ্যারান্টি হিসাবে উইথড্রয়াল অনুরোধে একটি বন্ডও যোগ করতে হবে। যদি একজন চ্যালেঞ্জার অ্যালিসের উইথড্রয়াল অনুরোধটি অবৈধ প্রমাণ করে, তবে তার বন্ড কেটে নেওয়া হয় এবং এর কিছু অংশ পুরস্কার হিসাবে চ্যালেঞ্জারের কাছে যায়। + +যদি চ্যালেঞ্জ পিরিয়ড কেউ ফ্রড-প্রুফ প্রদান না করেই শেষ হয়ে যায়, তাহলে অ্যালিসের উইথড্রয়াল অনুরোধটি বৈধ বলে বিবেচিত হয়, যা তাকে Ethereum-এর প্লাসমা কন্ট্র্যাক্ট থেকে ডিপোজিট পুনরুদ্ধার করতে দেয়। + +### বিরোধ সালিশ {#dispute-arbitration} + +যেকোনো ব্লকচেইনের মতো, অংশগ্রহণকারীরা দুರುದ್ದেশ্যপূর্ণভাবে কাজ করলে (যেমন, ফান্ড ডাবল-স্পেন্ডিং করলে) লেনদেনের অখণ্ডতা প্রয়োগ করার জন্য প্লাসমা চেইনের একটি মেকানিজমের প্রয়োজন। এই লক্ষ্যে, প্লাসমা চেনগুলি স্টেট ট্রানজিশনের বৈধতা সম্পর্কিত বিরোধগুলির সালিশ করার জন্য এবং খারাপ আচরণকে শাস্তি দেওয়ার জন্য ফ্রড প্রুফ ব্যবহার করে। ফ্রড প্রুফ একটি মেকানিজম হিসাবে ব্যবহৃত হয় যার মাধ্যমে একটি প্লাসমা চাইল্ড চেন তার প্যারেন্ট চেইন বা রুট চেইনে একটি অভিযোগ দায়ের করে। + +একটি ফ্রড-প্রুফ হলো কেবল একটি দাবি যে একটি নির্দিষ্ট স্টেট ট্রানজিশন অবৈধ। একটি উদাহরণ হলো যদি একজন ব্যবহারকারী (অ্যালিস) একই ফান্ড দুবার খরচ করার চেষ্টা করে। হতে পারে সে ববের সাথে একটি লেনদেনে UTXO খরচ করেছে এবং অন্য একটি লেনদেনে একই UTXO (যা এখন ববের) খরচ করতে চায়। + +উইথড্রয়ালটি প্রতিরোধ করতে, বব একটি পূর্ববর্তী লেনদেনে অ্যালিসের উক্ত UTXO খরচ করার প্রমাণ এবং একটি ব্লকে লেনদেনটির অন্তর্ভুক্তির একটি Merkle প্রুফ সরবরাহ করে একটি ফ্রড-প্রুফ তৈরি করবে। একই প্রক্রিয়া প্লাসমা ক্যাশে কাজ করে—ববকে প্রমাণ দিতে হবে যে অ্যালিস যে টোকেনগুলি উইথড্র করার চেষ্টা করছে তা সে আগে স্থানান্তর করেছিল। + +যদি ববের চ্যালেঞ্জ সফল হয়, তবে অ্যালিসের উইথড্রয়াল অনুরোধ বাতিল করা হয়। তবে, এই পদ্ধতিটি উইথড্রয়াল অনুরোধের জন্য চেইন দেখার ববের ক্ষমতার উপর নির্ভর করে। যদি বব অফলাইনে থাকে, তাহলে চ্যালেঞ্জ পিরিয়ড শেষ হয়ে গেলে অ্যালিস দুರುದ್ದেশ্যপূর্ণ উইথড্রয়ালটি প্রক্রিয়া করতে পারে। + +## প্লাসমায় মাস এক্সিট সমস্যা {#the-mass-exit-problem-in-plasma} + +মাস এক্সিট সমস্যাটি ঘটে যখন বিপুল সংখ্যক ব্যবহারকারী একই সময়ে একটি প্লাসমা চেইন থেকে উইথড্র করার চেষ্টা করে। এই সমস্যাটি কেন বিদ্যমান তা প্লাসমার সবচেয়ে বড় সমস্যাগুলির মধ্যে একটির সাথে সম্পর্কিত: **ডেটা অনুপলব্ধতা**। + +ডেটা উপলব্ধতা হলো এটি যাচাই করার ক্ষমতা যে একটি প্রস্তাবিত ব্লকের জন্য তথ্য আসলে ব্লকচেইন নেটওয়ার্কে প্রকাশিত হয়েছিল। একটি ব্লক "অনুপলব্ধ" হয় যদি প্রযোজক ব্লকটি নিজেই প্রকাশ করে কিন্তু ব্লক তৈরি করতে ব্যবহৃত ডেটা আটকে রাখে। + +নোডগুলিকে ব্লক ডাউনলোড করতে এবং লেনদেনের বৈধতা যাচাই করতে সক্ষম হতে হলে ব্লকগুলি উপলব্ধ থাকতে হবে। ব্লকচেইনগুলি ব্লক প্রযোজকদের সমস্ত লেনদেনের ডেটা অনচেইনে পোস্ট করতে বাধ্য করে ডেটা উপলব্ধতা নিশ্চিত করে। + +ডেটা উপলব্ধতা Ethereum-এর বেস লেয়ারে নির্মিত অফচেইন স্কেলিং প্রোটোকলগুলিকে সুরক্ষিত করতেও সহায়তা করে। এই চেইনগুলির অপারেটরদের Ethereum-এ লেনদেনের ডেটা প্রকাশ করতে বাধ্য করার মাধ্যমে, যে কেউ চেইনের সঠিক স্টেট উল্লেখ করে ফ্রড প্রুফ তৈরি করে অবৈধ ব্লককে চ্যালেঞ্জ করতে পারে। + +প্লাসমা চেইনগুলি প্রাথমিকভাবে অপারেটরের সাথে লেনদেনের ডেটা সঞ্চয় করে এবং **Mainnet-এ কোনো ডেটা প্রকাশ করে না** (অর্থাৎ, পর্যায়ক্রমিক স্টেট কমিটমেন্ট ছাড়া)। এর মানে হল ব্যবহারকারীদের অবৈধ লেনদেনকে চ্যালেঞ্জ করে ফ্রড প্রুফ তৈরি করার প্রয়োজন হলে ব্লক ডেটা সরবরাহের জন্য অপারেটরের উপর নির্ভর করতে হবে। যদি এই সিস্টেমটি কাজ করে, তবে ব্যবহারকারীরা সর্বদা ফান্ড সুরক্ষিত করতে ফ্রড প্রুফ ব্যবহার করতে পারে। + +সমস্যাটি শুরু হয় যখন অপারেটর, শুধু কোনো ব্যবহারকারী নয়, দুರುದ್ದেশ্যপূর্ণভাবে কাজ করা পক্ষ হয়। যেহেতু অপারেটর ব্লকচেইনের একমাত্র নিয়ন্ত্রণে থাকে, তাই তাদের কাছে প্লাসমা চেইনে ব্যবহারকারীদের অন্তর্গত ফান্ড চুরির মতো বড় স্কেলে অবৈধ স্টেট ট্রানজিশন এগিয়ে নিয়ে যাওয়ার জন্য আরও বেশি প্রণোদনা থাকে। + +এই ক্ষেত্রে, ক্লাসিক ফ্রড-প্রুফ সিস্টেম কাজ করে না। অপারেটর সহজেই অ্যালিস এবং ববের ফান্ড তাদের ওয়ালেটে স্থানান্তর করার একটি অবৈধ লেনদেন করতে পারে এবং ফ্রড-প্রুফ তৈরির জন্য প্রয়োজনীয় ডেটা লুকিয়ে রাখতে পারে। এটি সম্ভব কারণ অপারেটরকে ব্যবহারকারী বা Mainnet-এর কাছে ডেটা উপলব্ধ করতে হয় না। + +অতএব, সবচেয়ে আশাবাদী সমাধান হল প্লাসমা চেইন থেকে ব্যবহারকারীদের একটি "মাস এক্সিট" করার চেষ্টা করা। মাস এক্সিট দুರುದ್ದেশ্যপূর্ণ অপারেটরের ফান্ড চুরির পরিকল্পনাকে ধীর করে দেয় এবং ব্যবহারকারীদের জন্য কিছু সুরক্ষা প্রদান করে। প্রতিটি UTXO (বা টোকেন) কখন তৈরি হয়েছিল তার উপর ভিত্তি করে উইথড্রয়াল অনুরোধগুলি অর্ডার করা হয়, যা দুರುದ್ದেশ্যপূর্ণ অপারেটরদের সৎ ব্যবহারকারীদের ফ্রন্ট-রানিং করা থেকে বাধা দেয়। + +তবুও, মাস এক্সিটের সময় উইথড্রয়াল অনুরোধগুলির বৈধতা যাচাই করার জন্য আমাদের এখনও একটি উপায় প্রয়োজন—সুবিধাবাদী ব্যক্তিদের বিশৃঙ্খলার মধ্যে অবৈধ এক্সিট প্রক্রিয়া করে লাভবান হওয়া থেকে বিরত রাখার জন্য। সমাধানটি সহজ: ব্যবহারকারীদের তাদের টাকা বের করার জন্য চেইনের শেষ **বৈধ স্টেট** পোস্ট করতে হবে। + +কিন্তু এই পদ্ধতির এখনও সমস্যা আছে। উদাহরণস্বরূপ, যদি একটি প্লাসমা চেইনের সমস্ত ব্যবহারকারীকে প্রস্থান করতে হয় (যা একজন দুರುದ್ದেশ্যপূর্ণ অপারেটরের ক্ষেত্রে সম্ভব), তবে প্লাসমা চেইনের সম্পূর্ণ বৈধ স্টেটটি একবারে Ethereum-এর বেস লেয়ারে ডাম্প করতে হবে। প্লাসমা চেইনের অবাধ আকার (উচ্চ থ্রুপুট = আরও ডেটা) এবং Ethereum-এর প্রসেসিং স্পিডের সীমাবদ্ধতার সাথে, এটি একটি আদর্শ সমাধান নয়। + +যদিও এক্সিট গেমগুলি তাত্ত্বিকভাবে শুনতে ভাল লাগে, বাস্তব-জীবনের মাস এক্সিটগুলি সম্ভবত Ethereum-এ নেটওয়ার্ক-ব্যাপী কনজেশন ট্রিগার করবে। Ethereum-এর কার্যকারিতার ক্ষতি করার পাশাপাশি, একটি খারাপভাবে সমন্বিত মাস এক্সিটের অর্থ হল যে অপারেটর প্লাসমা চেইনের প্রতিটি অ্যাকাউন্ট খালি করার আগে ব্যবহারকারীরা ফান্ড উইথড্র করতে অক্ষম হতে পারে। + +## প্লাসমার সুবিধা এবং অসুবিধা {#pros-and-cons-of-plasma} + +| যেসব বিষয়ে এর সুফল পাওয়া যায় | কনস | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| উচ্চ থ্রুপুট এবং প্রতি লেনদেনে কম খরচ অফার করে। | সাধারণ কম্পিউটেশন সমর্থন করে না (স্মার্ট কন্ট্র্যাক্ট চালাতে পারে না)। শুধুমাত্র বেসিক টোকেন ট্রান্সফার, সোয়াপ এবং কয়েকটি অন্যান্য লেনদেনের ধরন প্রেডিকেট লজিকের মাধ্যমে সমর্থিত। | +| যেকোনো ব্যবহারকারীর মধ্যে লেনদেনের জন্য ভালো (যদি উভয়ই প্লাসমা চেইনে প্রতিষ্ঠিত থাকে তবে প্রতি ব্যবহারকারী জোড়ার জন্য কোনো ওভারহেড নেই) | আপনার ফান্ডের নিরাপত্তা নিশ্চিত করার জন্য পর্যায়ক্রমে নেটওয়ার্ক দেখতে হবে (লাইভনেস প্রয়োজনীয়তা) বা এই দায়িত্ব অন্য কাউকে অর্পণ করতে হবে। | +| প্লাসমা চেইনগুলিকে নির্দিষ্ট ব্যবহারের ক্ষেত্রে মানিয়ে নেওয়া যেতে পারে যা মূল চেইনের সাথে সম্পর্কিত নয়। ব্যবসা সহ যে কেউ, বিভিন্ন প্রসঙ্গে কাজ করে এমন স্কেলেবল ইনফ্রাস্ট্রাকচার প্রদানের জন্য প্লাসমা স্মার্ট কন্ট্র্যাক্ট কাস্টমাইজ করতে পারে। | ডেটা সংরক্ষণ এবং অনুরোধের ভিত্তিতে তা পরিবেশন করার জন্য এক বা একাধিক অপারেটরের উপর নির্ভর করে। | +| কম্পিউটেশন এবং স্টোরেজ অফচেনে স্থানান্তরিত করে Ethereum Mainnet-এর উপর লোড কমায়। | চ্যালেঞ্জের সুযোগ দেওয়ার জন্য উইথড্রয়াল বেশ কয়েক দিন বিলম্বিত হয়। ফাঞ্জিবল অ্যাসেটের জন্য, এটি লিকুইডিটি প্রোভাইডারদের দ্বারা প্রশমিত করা যেতে পারে, তবে এর সাথে একটি মূলধন ব্যয় জড়িত। | +| | যদি অনেক ব্যবহারকারী একই সাথে প্রস্থান করার চেষ্টা করে, Ethereum Mainnet কনজেস্টেড হয়ে যেতে পারে। | + +## প্লাসমা বনাম লেয়ার 2 স্কেলিং প্রোটোকল {#plasma-vs-layer-2} + +যদিও প্লাসমা একসময় Ethereum-এর জন্য একটি দরকারী স্কেলিং সমাধান হিসাবে বিবেচিত হত, তবে এটি এখন [লেয়ার 2 (L2) স্কেলিং প্রোটোকল](/layer-2/)-এর পক্ষে বাদ দেওয়া হয়েছে। L2 স্কেলিং সমাধানগুলি প্লাসমার বেশ কয়েকটি সমস্যার প্রতিকার করে: + +### দক্ষতা {#efficiency} + +[জিরো-নলেজ রোলআপ](/developers/docs/scaling/zk-rollups) অফচেইনে প্রক্রিয়াকৃত প্রতিটি ব্যাচ লেনদেনের বৈধতার ক্রিপ্টোগ্রাফিক প্রুফ তৈরি করে। এটি ব্যবহারকারী (এবং অপারেটরদের) অবৈধ স্টেট ট্রানজিশন অগ্রসর করা থেকে বিরত রাখে, যা চ্যালেঞ্জ পিরিয়ড এবং এক্সিট গেমের প্রয়োজনীয়তা দূর করে। এর মানে হল ব্যবহারকারীদের তাদের ফান্ড সুরক্ষিত করার জন্য পর্যায়ক্রমে চেইন দেখতে হবে না। + +### স্মার্ট কন্ট্র্যাক্টের জন্য সমর্থন {#support-for-smart-contracts} + +প্লাসমা ফ্রেমওয়ার্কের আরেকটি সমস্যা ছিল [Ethereum স্মার্ট কন্ট্র্যাক্টের এক্সিকিউশন সমর্থন করার অক্ষমতা](https://ethresear.ch/t/why-smart-contracts-are-not-feasible-on-plasma/2598/4)। ফলস্বরূপ, প্লাসমার বেশিরভাগ ইমপ্লিমেন্টেশনগুলি মূলত সাধারণ পেমেন্ট বা ERC-20 টোকেনের বিনিময়ের জন্য নির্মিত হয়েছিল। + +বিপরীতে, অপ্টিমেস্টিক রোলআপ, [ইথিরিয়াম ভার্চুয়াল মেশিন](/developers/docs/evm/) এর সাথে সামঞ্জস্যপূর্ণ এবং Ethereum-নেটিভ [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) চালাতে পারে, যা তাদের [ডিসেন্ট্রালাইজড এপ্লিকেশন](/developers/docs/dapps/) স্কেলিং করার জন্য একটি দরকারী এবং _নিরাপদ_ সমাধান করে তোলে। একইভাবে, [EVM (zkEVM) এর একটি জিরো-নলেজ ইমপ্লিমেন্টেশন তৈরি করার](https://ethresear.ch/t/a-zk-evm-specification/11549) পরিকল্পনা চলছে যা ZK-রোলআপগুলিকে নির্বিচারে লজিক প্রক্রিয়া করতে এবং স্মার্ট কন্ট্র্যাক্ট এক্সিকিউট করার অনুমতি দেবে। + +### ডেটা অনুপলব্ধতা {#data-unavailability} + +আগেই ব্যাখ্যা করা হয়েছে, প্লাসমা ডেটা উপলব্ধতা সমস্যায় ভোগে। যদি একজন দুರುದ್ದেশ্যপূর্ণ অপারেটর প্লাসমা চেইনে একটি অবৈধ ট্রানজিশন অগ্রসর করে, তবে ব্যবহারকারীরা এটিকে চ্যালেঞ্জ করতে অক্ষম হবে কারণ অপারেটর ফ্রড-প্রুফ তৈরির জন্য প্রয়োজনীয় ডেটা আটকে রাখতে পারে। রোলআপগুলি অপারেটরদের Ethereum-এ লেনদেনের ডেটা পোস্ট করতে বাধ্য করে এই সমস্যাটি সমাধান করে, যার ফলে যে কেউ চেইনের স্টেট যাচাই করতে এবং প্রয়োজনে ফ্রড প্রুফ তৈরি করতে পারে। + +### মাস এক্সিট সমস্যা {#mass-exit-problem} + +ZK-রোলআপ এবং অপ্টিমেস্টিক রোলআপ উভয়ই প্লাসমার মাস এক্সিট সমস্যাটি বিভিন্ন উপায়ে সমাধান করে। উদাহরণস্বরূপ, একটি ZK-রোলআপ ক্রিপ্টোগ্রাফিক মেকানিজমের উপর নির্ভর করে যা নিশ্চিত করে যে অপারেটররা কোনো পরিস্থিতিতেই ব্যবহারকারীর ফান্ড চুরি করতে পারে না। + +একইভাবে, অপ্টিমেস্টিক রোলআপগুলি উইথড্রয়ালের উপর একটি বিলম্ব সময় আরোপ করে যার সময় যে কেউ একটি চ্যালেঞ্জ শুরু করতে পারে এবং দুರುದ್ದেশ্যপূর্ণ উইথড্রয়াল অনুরোধগুলি প্রতিরোধ করতে পারে। যদিও এটি প্লাসমার অনুরূপ, পার্থক্য হল যে ভেরিফায়ারদের ফ্রড প্রুফ তৈরির জন্য প্রয়োজনীয় ডেটাতে অ্যাক্সেস রয়েছে। এইভাবে, রোলআপ ব্যবহারকারীদের জন্য Ethereum Mainnet-এ একটি উন্মত্ত, "প্রথম-বেরিয়ে-যাওয়া" মাইগ্রেশনে জড়িত হওয়ার প্রয়োজন নেই। + +## প্লাসমা কিভাবে সাইডচেইন এবং শার্ডিং থেকে আলাদা? {#plasma-sidechains-sharding} + +প্লাসমা, সাইডচেইন এবং শার্ডিং মোটামুটি অনুরূপ কারণ তারা সকলেই কোনো না কোনোভাবে Ethereum Mainnet-এর সাথে সংযুক্ত। তবে, এই সংযোগগুলির স্তর এবং শক্তি ভিন্ন হয়, যা প্রতিটি স্কেলিং সমাধানের নিরাপত্তা বৈশিষ্ট্যকে প্রভাবিত করে। + +### প্লাসমা বনাম সাইডচেইন {#plasma-vs-sidechains} + +একটি [সাইডচেইন](/developers/docs/scaling/sidechains/) হলো একটি স্বাধীনভাবে পরিচালিত ব্লকচেইন যা একটি দ্বিমুখী ব্রিজের মাধ্যমে Ethereum Mainnet-এর সাথে সংযুক্ত। [ব্রিজ](/bridges/) ব্যবহারকারীদের দুটি ব্লকচেইনের মধ্যে টোকেন বিনিময় করে সাইডচেইনে লেনদেন করার অনুমতি দেয়, যা Ethereum Mainnet-এর কনজেশন কমায় এবং স্কেলেবিলিটি উন্নত করে। +সাইডচেইনগুলি একটি পৃথক কনসেন্সাস মেকানিজম ব্যবহার করে এবং সাধারণত Ethereum Mainnet-এর থেকে অনেক ছোট হয়। ফলস্বরূপ, এই চেইনগুলিতে অ্যাসেট ব্রিজ করার ক্ষেত্রে ঝুঁকি বৃদ্ধি পায়; সাইডচেইন মডেলে Ethereum Mainnet থেকে উত্তরাধিকারসূত্রে প্রাপ্ত নিরাপত্তা গ্যারান্টির অভাবের কারণে, ব্যবহারকারীরা সাইডচেইনে আক্রমণের ফলে ফান্ড হারানোর ঝুঁকিতে থাকে। + +বিপরীতে, প্লাসমা চেইনগুলি Mainnet থেকে তাদের নিরাপত্তা অর্জন করে। এটি তাদের সাইডচেইনগুলির চেয়ে পরিমাপযোগ্যভাবে বেশি নিরাপদ করে তোলে। সাইডচেইন এবং প্লাসমা চেইন উভয়েরই আলাদা কনসেন্সাস প্রোটোকল থাকতে পারে, তবে পার্থক্য হল যে প্লাসমা চেইনগুলি Ethereum Mainnet-এ প্রতিটি ব্লকের জন্য Merkle রুট প্রকাশ করে। ব্লক রুট হলো তথ্যের ছোট অংশ যা আমরা প্লাসমা চেইনে ঘটে যাওয়া লেনদেন সম্পর্কে তথ্য যাচাই করতে ব্যবহার করতে পারি। যদি একটি প্লাসমা চেইনে কোনো আক্রমণ হয়, ব্যবহারকারীরা উপযুক্ত প্রুফ ব্যবহার করে নিরাপদে তাদের ফান্ড Mainnet-এ ফেরত উইথড্র করতে পারে। + +### প্লাসমা বনাম শার্ডিং {#plasma-vs-sharding} + +প্লাসমা চেইন এবং শার্ড চেইন উভয়ই পর্যায়ক্রমে Ethereum Mainnet-এ ক্রিপ্টোগ্রাফিক প্রুফ প্রকাশ করে। তবে, উভয়েরই আলাদা নিরাপত্তা বৈশিষ্ট্য রয়েছে। + +শার্ড চেইনগুলি প্রতিটি ডেটা শার্ড সম্পর্কে বিস্তারিত তথ্য সম্বলিত "কোলেশন হেডার" Mainnet-এ কমিট করে। Mainnet-এর নোডগুলি ডেটা শার্ডের বৈধতা যাচাই করে এবং প্রয়োগ করে, যা অবৈধ শার্ড ট্রানজিশনের সম্ভাবনা হ্রাস করে এবং নেটওয়ার্ককে দুರುದ್ದেশ্যপূর্ণ কার্যকলাপ থেকে রক্ষা করে। + +প্লাসমা আলাদা কারণ Mainnet শুধুমাত্র চাইল্ড চেইনের স্টেট সম্পর্কে ন্যূনতম তথ্য পায়। এর মানে হল Mainnet চাইল্ড চেইনগুলিতে পরিচালিত লেনদেন কার্যকরভাবে যাচাই করতে পারে না, যা তাদের কম নিরাপদ করে তোলে। + +**দ্রষ্টব্য** যে Ethereum ব্লকচেইনের শার্ডিং আর রোডম্যাপে নেই। এটি রোলআপ এবং [Danksharding](/roadmap/danksharding) এর মাধ্যমে স্কেলিং দ্বারা প্রতিস্থাপিত হয়েছে। + +### প্লাসমা ব্যবহার করুন {#use-plasma} + +একাধিক প্রকল্প প্লাসমার ইমপ্লিমেন্টেশন সরবরাহ করে যা আপনি আপনার ডিএ্যাপস-এ একীভূত করতে পারেন: + +- [Polygon](https://polygon.technology/) (পূর্বে Matic Network) + +## আরও পড়ুন {#further-reading} + +- [প্লাসমা শিখুন](https://www.learnplasma.org/en/) +- ["শেয়ারড সিকিউরিটি" কী এবং কেন এটি এত গুরুত্বপূর্ণ তার একটি দ্রুত অনুস্মারক](https://old.reddit.com/r/ethereum/comments/sgd3zt/a_quick_reminder_of_what_shared_security_means/) +- [সাইডচেইন বনাম প্লাসমা বনাম শার্ডিং](https://vitalik.eth.limo/general/2019/06/12/plasma_vs_sharding.html) +- [প্লাসমা বোঝা, পর্ব 1: মূল বিষয়গুলি](https://www.theblockcrypto.com/amp/post/10793/understanding-plasma-part-1-the-basics) +- [প্লাসমার জীবন ও মৃত্যু](https://medium.com/dragonfly-research/the-life-and-death-of-plasma-b72c6a59c5ad#) + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/scaling/sidechains/index.md b/public/content/translations/bn/developers/docs/scaling/sidechains/index.md new file mode 100644 index 00000000000..b229dbefb95 --- /dev/null +++ b/public/content/translations/bn/developers/docs/scaling/sidechains/index.md @@ -0,0 +1,73 @@ +--- +title: "সাইডচেইন্স" +description: "স্কেলিং সমাধান হিসাবে সাইডচেইনগুলির একটি ভূমিকা যা বর্তমানে ইথেরিয়াম কমিউনিটি ব্যবহার করছে।" +lang: bn +sidebarDepth: 3 +--- + +একটি সাইডচেইন হল একটি পৃথক ব্লকচেইন যা ইথেরিয়াম থেকে স্বাধীনভাবে চলে এবং একটি দ্বিমুখী ব্রিজের মাধ্যমে ইথেরিয়াম মেইননেটের সাথে সংযুক্ত থাকে। সাইডচেইনগুলির পৃথক ব্লক প্যারামিটার এবং [কনসেন্সাস অ্যালগরিদম](/developers/docs/consensus-mechanisms/) থাকতে পারে, যা প্রায়শই লেনদেনের কার্যকর প্রক্রিয়াকরণের জন্য ডিজাইন করা হয়। একটি সাইডচেইন ব্যবহার করার ক্ষেত্রে কিছু আপস জড়িত থাকে, কারণ তারা ইথেরিয়ামের নিরাপত্তা বৈশিষ্ট্যগুলি উত্তরাধিকার সূত্রে পায় না। [লেয়ার 2 স্কেলিং সমাধান](/layer-2/) -এর থেকে ভিন্ন, সাইডচেইনগুলি স্টেট পরিবর্তন এবং লেনদেনের ডেটা ইথেরিয়াম মেইননেটে আবার পোস্ট করে না। + +সাইডচেইনগুলি উচ্চ থ্রুপুট ([স্কেলেবিলিটি ট্রাইলেমা](https://vitalik.eth.limo/general/2021/05/23/scaling.html)) অর্জনের জন্য বিকেন্দ্রীকরণ বা নিরাপত্তার কিছু পরিমাণ ত্যাগ করে। তবে, ইথেরিয়াম বিকেন্দ্রীকরণ এবং নিরাপত্তার সাথে আপস না করে স্কেলিং করতে প্রতিশ্রুতিবদ্ধ। + +## সাইডচেইনগুলি কীভাবে কাজ করে? {#how-do-sidechains-work} + +সাইডচেইনগুলি হল স্বাধীন ব্লকচেইন, যার ভিন্ন ইতিহাস, ডেভেলপমেন্ট রোডম্যাপ এবং ডিজাইনের বিবেচ্য বিষয় রয়েছে। যদিও একটি সাইডচেইন ইথেরিয়ামের সাথে কিছু উপরিভাগের স্তরের মিল থাকতে পারে, তবে এর বেশ কয়েকটি স্বতন্ত্র বৈশিষ্ট্য রয়েছে। + +### কনসেন্সাস অ্যালগরিদম {#consensus-algorithms} + +সাইডচেইনগুলিকে অনন্য করে তোলে এমন একটি গুণ (অর্থাৎ, ইথেরিয়াম থেকে ভিন্ন) হল ব্যবহৃত কনসেন্সাস অ্যালগরিদম। সাইডচেইনগুলি কনসেন্সাসের জন্য ইথেরিয়ামের উপর নির্ভর করে না এবং তাদের প্রয়োজন অনুসারে বিকল্প কনসেন্সাস প্রোটোকল বেছে নিতে পারে। সাইডচেইনে ব্যবহৃত কনসেন্সাস অ্যালগরিদমের কিছু উদাহরণ হল: + +- [প্রুফ-অফ-অথোরিটি](/developers/docs/consensus-mechanisms/poa/) +- [ডেলিগেটেড প্রুফ-অফ-স্টেক](https://en.bitcoin.it/wiki/Delegated_proof_of_stake) +- [বাইজেন্টাইন ফল্ট টলারেন্স](https://decrypt.co/resources/byzantine-fault-tolerance-what-is-it-explained)। + +ইথেরিয়ামের মতো, সাইডচেইনগুলিতে ভ্যালিডেটিং নোড রয়েছে যা লেনদেন যাচাই এবং প্রক্রিয়া করে, ব্লক তৈরি করে এবং ব্লকচেইন স্টেট সংরক্ষণ করে। ভ্যালিডেটররা নেটওয়ার্ক জুড়ে কনসেন্সাস বজায় রাখার জন্য এবং এটিকে ক্ষতিকারক আক্রমণের বিরুদ্ধে সুরক্ষিত করার জন্যও দায়ী। + +#### ব্লক প্যারামিটার {#block-parameters} + +ইথেরিয়াম [ব্লক টাইম](/developers/docs/blocks/#block-time) (অর্থাৎ নতুন ব্লক তৈরি করতে যে সময় লাগে) এবং [ব্লক সাইজ](/developers/docs/blocks/#block-size) (অর্থাৎ প্রতি ব্লকে থাকা ডেটার পরিমাণ যা গ্যাসে পরিমাপ করা হয়) এর উপর সীমা রাখে। বিপরীতভাবে, সাইডচেইনগুলি প্রায়শই উচ্চ থ্রুপুট, দ্রুত লেনদেন এবং কম ফি অর্জনের জন্য ভিন্ন প্যারামিটার গ্রহণ করে, যেমন দ্রুত ব্লক টাইম এবং উচ্চ গ্যাস লিমিট। + +যদিও এর কিছু সুবিধা রয়েছে, নেটওয়ার্ক বিকেন্দ্রীকরণ এবং নিরাপত্তার জন্য এর গুরুতর প্রভাব রয়েছে। ব্লক প্যারামিটার, যেমন দ্রুত ব্লক টাইম এবং বড় ব্লক সাইজ, একটি সম্পূর্ণ নোড চালানোর অসুবিধা বাড়িয়ে দেয়—যার ফলে কয়েকটি "সুপারনোড" চেইন সুরক্ষিত করার জন্য দায়ী থাকে। এই ধরনের পরিস্থিতিতে, ভ্যালিডেটরদের যোগসাজশ বা চেইনের ক্ষতিকারক দখলের সম্ভাবনা বেড়ে যায়। + +বিকেন্দ্রীকরণের ক্ষতি না করে ব্লকচেইন স্কেল করার জন্য, একটি নোড চালানো সবার জন্য উন্মুক্ত থাকতে হবে—অগত্যা বিশেষ হার্ডওয়্যার সহ দলগুলির জন্য নয়। এই কারণেই ইথেরিয়াম নেটওয়ার্কে প্রত্যেকে যাতে [একটি ফুল নোড চালাতে পারে](/developers/docs/nodes-and-clients/#why-should-i-run-an-ethereum-node) তা নিশ্চিত করার জন্য প্রচেষ্টা চলছে। + +### EVM কম্প্যাটিবিলিটি {#evm-compatibility} + +কিছু সাইডচেইন EVM-কম্প্যাটিবল এবং [ইথেরিয়াম ভার্চুয়াল মেশিন (EVM)](/developers/docs/evm/) -এর জন্য তৈরি করা কন্ট্র্যাক্টগুলি এক্সিকিউট করতে সক্ষম। EVM-কম্প্যাটিবল সাইডচেইনগুলি [Solidity-তে লেখা](/developers/docs/smart-contracts/languages/) স্মার্ট কন্ট্র্যাক্টগুলিকে সমর্থন করে, সেইসাথে অন্যান্য EVM স্মার্ট কন্ট্র্যাক্ট ভাষাগুলিকেও, যার মানে হল ইথেরিয়াম মেইননেটের জন্য লেখা স্মার্ট কন্ট্র্যাক্টগুলি EVM-কম্প্যাটিবল সাইডচেইনেও কাজ করবে। + +এর মানে হল আপনি যদি আপনার [ডিএ্যাপ](/developers/docs/dapps/) একটি সাইডচেইনে ব্যবহার করতে চান, তবে এটি শুধুমাত্র আপনার [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) এই সাইডচেইনে ডিপ্লয় করার বিষয়। এটি দেখতে, অনুভব করতে এবং কাজ করতে ঠিক মেইননেটের মতোই—আপনি সলিডিটিতে কন্ট্র্যাক্ট লেখেন, এবং সাইডচেইন RPC-এর মাধ্যমে চেইনের সাথে ইন্টারঅ্যাক্ট করেন। + +যেহেতু সাইডচেইনগুলি EVM-কম্প্যাটিবল, তাই সেগুলিকে ইথেরিয়াম-নেটিভ ডিএ্যাপস-এর জন্য একটি দরকারী [স্কেলিং সমাধান](/developers/docs/scaling/) হিসাবে বিবেচনা করা হয়। একটি সাইডচেইনে আপনার ডিএ্যাপ থাকলে, ব্যবহারকারীরা কম গ্যাস ফি এবং দ্রুত লেনদেন উপভোগ করতে পারেন, বিশেষ করে যদি মেইননেট কনজেস্টেড থাকে। + +তবে, যেমন পূর্বে ব্যাখ্যা করা হয়েছে, একটি সাইডচেইন ব্যবহার করার মধ্যে উল্লেখযোগ্য আপস জড়িত। প্রতিটি সাইডচেইন তার নিরাপত্তার জন্য দায়ী এবং ইথেরিয়ামের নিরাপত্তা বৈশিষ্ট্য উত্তরাধিকার সূত্রে পায় না। এটি ক্ষতিকারক আচরণের সম্ভাবনা বাড়ায় যা আপনার ব্যবহারকারীদের প্রভাবিত করতে পারে বা তাদের তহবিলকে ঝুঁকির মধ্যে ফেলতে পারে। + +### সম্পদ চলাচল {#asset-movement} + +একটি পৃথক ব্লকচেইনকে ইথেরিয়াম মেইননেটের একটি সাইডচেইন হতে হলে, ইথেরিয়াম মেইননেট থেকে এবং এতে সম্পদের স্থানান্তর সহজতর করার ক্ষমতা প্রয়োজন। ইথেরিয়ামের সাথে এই আন্তঃকার্যক্ষমতা একটি ব্লকচেইন ব্রিজ ব্যবহার করে অর্জন করা হয়। [ব্রিজগুলি](/bridges/) ইথেরিয়াম মেইননেট এবং একটি সাইডচেইনে ডিপ্লয় করা স্মার্ট কন্ট্র্যাক্ট ব্যবহার করে তাদের মধ্যে তহবিলের ব্রিজিং নিয়ন্ত্রণ করে। + +যদিও ব্রিজগুলি ব্যবহারকারীদের ইথেরিয়াম এবং সাইডচেইনের মধ্যে তহবিল সরাতে সাহায্য করে, সম্পদগুলি শারীরিকভাবে দুটি চেইনের মধ্যে সরানো হয় না। পরিবর্তে, চেইন জুড়ে মান স্থানান্তরের জন্য সাধারণত মিন্টিং এবং বার্নিং জড়িত এমন প্রক্রিয়াগুলি ব্যবহৃত হয়। [ব্রিজগুলি কীভাবে কাজ করে](/developers/docs/bridges/#how-do-bridges-work) সে সম্পর্কে আরও জানুন। + +## সাইডচেইনের সুবিধা এবং অসুবিধা {#pros-and-cons-of-sidechains} + +| যেসব বিষয়ে এর সুফল পাওয়া যায় | কনস | +| ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | +| সাইডচেইনের অন্তর্নিহিত প্রযুক্তি সুপ্রতিষ্ঠিত এবং ব্যাপক গবেষণা ও ডিজাইনের উন্নতি থেকে উপকৃত হয়। | সাইডচেইনগুলি স্কেলেবিলিটির জন্য কিছুটা বিকেন্দ্রীকরণ এবং ট্রাস্টলেসনেসের সাথে আপস করে। | +| সাইডচেইনগুলি সাধারণ গণনা সমর্থন করে এবং EVM কম্প্যাটিবিলিটি অফার করে (তারা ইথেরিয়াম-নেটিভ ডিএ্যাপস চালাতে পারে)। | একটি সাইডচেইন একটি পৃথক কনসেন্সাস মেকানিজম ব্যবহার করে এবং ইথেরিয়ামের নিরাপত্তা গ্যারান্টি থেকে উপকৃত হয় না। | +| সাইডচেইনগুলি দক্ষতার সাথে লেনদেন প্রক্রিয়া করতে এবং ব্যবহারকারীদের জন্য লেনদেন ফি কমাতে ভিন্ন কনসেন্সাস মডেল ব্যবহার করে। | সাইডচেইনগুলির জন্য উচ্চতর বিশ্বাসের অনুমান প্রয়োজন (যেমন, ক্ষতিকারক সাইডচেইন ভ্যালিডেটরদের একটি কোরাম জালিয়াতি করতে পারে)। | +| EVM-কম্প্যাটিবল সাইডচেইনগুলি ডিএ্যাপস-কে তাদের ইকোসিস্টেম প্রসারিত করতে দেয়। | | + +### সাইডচেইন ব্যবহার করুন {#use-sidechains} + +একাধিক প্রকল্প সাইডচেইনের ইমপ্লিমেন্টেশন সরবরাহ করে যা আপনি আপনার ডিএ্যাপস-এ ইন্টিগ্রেট করতে পারেন: + +- [Polygon PoS](https://polygon.technology/solutions/polygon-pos) +- [Skale](https://skale.network/) +- [Gnosis Chain (পূর্বে xDai)](https://www.gnosischain.com/) +- [Loom Network](https://loomx.io/) +- [Metis Andromeda](https://www.metis.io/) + +## আরও পড়ুন {#further-reading} + +- [সাইডচেইনের মাধ্যমে ইথেরিয়াম ডিএ্যাপস স্কেলিং](https://medium.com/loom-network/dappchains-scaling-ethereum-dapps-through-sidechains-f99e51fff447) _৮ ফেব্রুয়ারি, ২০১৮ - Georgios Konstantopoulos_ + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/scaling/state-channels/index.md b/public/content/translations/bn/developers/docs/scaling/state-channels/index.md new file mode 100644 index 00000000000..32ac02371ba --- /dev/null +++ b/public/content/translations/bn/developers/docs/scaling/state-channels/index.md @@ -0,0 +1,261 @@ +--- +title: "স্টেট চ্যানেল" +description: "স্টেট চ্যানেল এবং পেমেন্ট চ্যানেলগুলির একটি পরিচিতি, যা বর্তমানে ইথেরিয়াম কমিউনিটি দ্বারা একটি স্কেলিং সমাধান হিসাবে ব্যবহৃত হয়।" +lang: bn +sidebarDepth: 3 +--- + +স্টেট চ্যানেলগুলি অংশগ্রহণকারীদের ইথেরিয়াম মেইননেটের সাথে ন্যূনতম মিথস্ক্রিয়া রেখে অফচেইনে নিরাপদে লেনদেন করার অনুমতি দেয়। চ্যানেলের পিয়াররা চ্যানেলটি খুলতে এবং বন্ধ করতে শুধুমাত্র দুটি অনচেইন লেনদেন জমা দেওয়ার সময় যেকোনো সংখ্যক অফচেইন লেনদেন পরিচালনা করতে পারে। এটি অত্যন্ত উচ্চ লেনদেন থ্রুপুট করার সুযোগ দেয় এবং ব্যবহারকারীদের জন্য কম খরচের কারণ হয়। + +## পূর্বশর্ত {#prerequisites} + +আপনার [ইথেরিয়াম স্কেলিং](/developers/docs/scaling/) এবং [লেয়ার 2](/layer-2/) সম্পর্কিত আমাদের পেজগুলি পড়া এবং বোঝা উচিত। + +## চ্যানেল কি? {#what-are-channels} + +পাবলিক ব্লকচেইন, যেমন ইথেরিয়াম, তাদের ডিস্ট্রিবিউটেড আর্কিটেকচারের কারণে স্কেলেবিলিটি চ্যালেঞ্জের সম্মুখীন হয়: অনচেইন লেনদেন অবশ্যই সমস্ত নোড দ্বারা কার্যকর করতে হবে। নোডগুলিকে সাধারণ হার্ডওয়্যার ব্যবহার করে একটি ব্লকের লেনদেনের পরিমাণ সামলাতে সক্ষম হতে হয়, যা নেটওয়ার্ককে ডিসেন্ট্রালাইজড রাখার জন্য লেনদেনের থ্রুপুটের উপর একটি সীমা আরোপ করে। ব্লকচেইন চ্যানেলগুলি ব্যবহারকারীদের অফচেইনে ইন্টারঅ্যাক্ট করার অনুমতি দিয়ে এই সমস্যার সমাধান করে এবং চূড়ান্ত নিষ্পত্তির জন্য মূল চেইনের নিরাপত্তার উপর নির্ভর করে। + +চ্যানেলগুলি হল সাধারণ পিয়ার-টু-পিয়ার প্রোটোকল যা দুটি পক্ষকে নিজেদের মধ্যে অনেক লেনদেন করতে দেয় এবং তারপর শুধুমাত্র চূড়ান্ত ফলাফল ব্লকচেইনে পোস্ট করতে হয়। চ্যানেলটি ক্রিপ্টোগ্রাফি ব্যবহার করে প্রমাণ করে যে তাদের দ্বারা তৈরি করা সারাংশ ডেটা সত্যিই মধ্যবর্তী লেনদেনের একটি বৈধ সেটের ফলাফল। একটি ["মাল্টিসিগ"](/developers/docs/smart-contracts/#multisig) স্মার্ট কন্ট্র্যাক্ট নিশ্চিত করে যে লেনদেনগুলি সঠিক পক্ষ দ্বারা স্বাক্ষরিত হয়। + +চ্যানেলগুলির সাহায্যে, আগ্রহী পক্ষগুলির দ্বারা স্টেট পরিবর্তনগুলি কার্যকর এবং বৈধ করা হয়, যা ইথেরিয়ামের এক্সিকিউশন লেয়ারে গণনা কমিয়ে দেয়। এটি ইথেরিয়ামের উপর কনজেশন হ্রাস করে এবং ব্যবহারকারীদের জন্য লেনদেন প্রক্রিয়াকরণের গতি বৃদ্ধি করে। + +প্রতিটি চ্যানেল ইথেরিয়ামে চালিত একটি [মাল্টিসিগ স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/#multisig) দ্বারা পরিচালিত হয়। একটি চ্যানেল খুলতে, অংশগ্রহণকারীরা চ্যানেল কন্ট্র্যাক্টটি অনচেইনে ডেপ্লয় করে এবং এতে অর্থ জমা করে। উভয় পক্ষ চ্যানেলের স্টেট শুরু করার জন্য সম্মিলিতভাবে একটি স্টেট আপডেটে স্বাক্ষর করে, যার পরে তারা দ্রুত এবং অবাধে অফচেইনে লেনদেন করতে পারে। + +চ্যানেলটি বন্ধ করার জন্য, অংশগ্রহণকারীরা চ্যানেলের সর্বশেষ সম্মত স্টেট অনচেইনে জমা দেয়। এরপরে, স্মার্ট কন্ট্র্যাক্টটি চ্যানেলের চূড়ান্ত স্টেটে প্রতিটি অংশগ্রহণকারীর ব্যালেন্স অনুযায়ী লক করা তহবিল বিতরণ করে। + +পিয়ার-টু-পিয়ার চ্যানেলগুলি এমন পরিস্থিতিতে বিশেষভাবে উপযোগী যেখানে কিছু পূর্বনির্ধারিত অংশগ্রহণকারী দৃশ্যমান ওভারহেড ছাড়াই উচ্চ ফ্রিকোয়েন্সিতে লেনদেন করতে চায়। ব্লকচেইন চ্যানেলগুলি দুটি বিভাগে বিভক্ত: **পেমেন্ট চ্যানেল** এবং **স্টেট চ্যানেল**। + +## পেমেন্ট চ্যানেল {#payment-channels} + +একটি পেমেন্ট চ্যানেলকে দুইজন ব্যবহারকারী দ্বারা সম্মিলিতভাবে রক্ষণাবেক্ষণ করা একটি "দ্বিমুখী লেজার" হিসাবে সবচেয়ে ভালোভাবে বর্ণনা করা হয়। লেজারের প্রাথমিক ব্যালেন্স হল চ্যানেল খোলার পর্যায়ে অনচেইন চুক্তিতে লক করা জমার যোগফল। পেমেন্ট চ্যানেল ট্রান্সফার তাৎক্ষণিকভাবে এবং প্রকৃত ব্লকচেইনের সম্পৃক্ততা ছাড়াই করা যেতে পারে, শুধুমাত্র একটি প্রাথমিক এককালীন অনচেইন তৈরি এবং চ্যানেলের চূড়ান্ত বন্ধ করা ছাড়া। + +লেজারের ব্যালেন্সের আপডেটগুলির (যেমন, পেমেন্ট চ্যানেলের স্টেট) জন্য চ্যানেলের সকল পক্ষের অনুমোদন প্রয়োজন। চ্যানেলের সকল অংশগ্রহণকারীর দ্বারা স্বাক্ষরিত একটি চ্যানেল আপডেটকে চূড়ান্ত বলে মনে করা হয়, অনেকটা ইথেরিয়ামের একটি লেনদেনের মতো। + +পেমেন্ট চ্যানেলগুলি ছিল প্রাচীনতম স্কেলিং সমাধানগুলির মধ্যে একটি যা সাধারণ ব্যবহারকারীর মিথস্ক্রিয়া (যেমন, ETH স্থানান্তর, অ্যাটমিক সোয়াপ, মাইক্রোপেমেন্ট) এর ব্যয়বহুল অনচেইন কার্যকলাপ কমানোর জন্য ডিজাইন করা হয়েছিল। চ্যানেলের অংশগ্রহণকারীরা নিজেদের মধ্যে সীমাহীন পরিমাণে তাত্ক্ষণিক, ফি-বিহীন লেনদেন পরিচালনা করতে পারে যতক্ষণ না তাদের স্থানান্তরের মোট যোগফল জমাকৃত টোকেনকে অতিক্রম করে। + +## স্টেট চ্যানেল {#state-channels} + +অফচেইন পেমেন্ট সমর্থন করা ছাড়া, পেমেন্ট চ্যানেলগুলি সাধারণ স্টেট ট্রানজিশন লজিক পরিচালনার জন্য উপযোগী প্রমাণিত হয়নি। স্টেট চ্যানেলগুলি এই সমস্যার সমাধান করতে এবং সাধারণ-উদ্দেশ্য গণনার স্কেলিংয়ের জন্য চ্যানেলগুলিকে উপযোগী করতে তৈরি করা হয়েছিল। + +স্টেট চ্যানেলগুলির সাথে এখনও পেমেন্ট চ্যানেলগুলির অনেক মিল রয়েছে। উদাহরণস্বরূপ, ব্যবহারকারীরা ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত বার্তা (লেনদেন) আদান-প্রদান করে ইন্টারঅ্যাক্ট করে, যা অন্য চ্যানেল অংশগ্রহণকারীদেরও স্বাক্ষর করতে হয়। যদি একটি প্রস্তাবিত স্টেট আপডেট সকল অংশগ্রহণকারীর দ্বারা স্বাক্ষরিত না হয়, তবে এটি অবৈধ বলে বিবেচিত হয়। + +যাইহোক, ব্যবহারকারীর ব্যালেন্স ধারণ করার পাশাপাশি, চ্যানেলটি চুক্তির স্টোরেজের বর্তমান স্টেটও ট্র্যাক করে (যেমন, চুক্তির ভেরিয়েবলের মান)। + +এটি দুইজন ব্যবহারকারীর মধ্যে অফচেইনে একটি স্মার্ট কন্ট্র্যাক্ট চালানো সম্ভব করে। এই পরিস্থিতিতে, স্মার্ট কন্ট্র্যাক্টের অভ্যন্তরীণ স্টেটের আপডেটগুলির জন্য শুধুমাত্র সেই পিয়ারদের অনুমোদন প্রয়োজন যারা চ্যানেলটি তৈরি করেছে। + +যদিও এটি পূর্বে বর্ণিত স্কেলেবিলিটি সমস্যার সমাধান করে, তবে এর নিরাপত্তার উপর প্রভাব রয়েছে। ইথেরিয়ামে, স্টেট ট্রানজিশনের বৈধতা নেটওয়ার্কের কনসেন্সাস প্রোটোকল দ্বারা প্রয়োগ করা হয়। এটি একটি স্মার্ট কন্ট্র্যাক্টের স্টেটে একটি অবৈধ আপডেট প্রস্তাব করা বা স্মার্ট কন্ট্র্যাক্ট এক্সিকিউশন পরিবর্তন করা অসম্ভব করে তোলে। + +স্টেট চ্যানেলগুলির একই নিরাপত্তা গ্যারান্টি নেই। কিছু পরিমাণে, একটি স্টেট চ্যানেল হল মেইননেটের একটি ক্ষুদ্র সংস্করণ। নিয়ম প্রয়োগকারী অংশগ্রহণকারীদের একটি সীমিত সেটের সাথে, দূষিত আচরণের (যেমন, অবৈধ স্টেট আপডেটের প্রস্তাব) সম্ভাবনা বৃদ্ধি পায়। স্টেট চ্যানেলগুলি [ফ্রড প্রুফ](/glossary/#fraud-proof) ভিত্তিক একটি বিরোধ সালিশি সিস্টেম থেকে তাদের নিরাপত্তা অর্জন করে। + +## স্টেট চ্যানেলগুলি কীভাবে কাজ করে {#how-state-channels-work} + +মূলত, একটি স্টেট চ্যানেলের কার্যকলাপ হল ব্যবহারকারী এবং একটি ব্লকচেইন সিস্টেমের সাথে জড়িত মিথস্ক্রিয়ার একটি সেশন। ব্যবহারকারীরা বেশিরভাগই একে অপরের সাথে অফচেইনে যোগাযোগ করে এবং শুধুমাত্র অন্তর্নিহিত ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করে চ্যানেল খুলতে, চ্যানেল বন্ধ করতে বা অংশগ্রহণকারীদের মধ্যে সম্ভাব্য বিরোধ নিষ্পত্তি করতে। + +নিম্নলিখিত বিভাগটি একটি স্টেট চ্যানেলের মৌলিক কর্মপ্রবাহের রূপরেখা দেয়: + +### চ্যানেল খোলা {#opening-the-channel} + +একটি চ্যানেল খোলার জন্য অংশগ্রহণকারীদের মেইননেটে একটি স্মার্ট কন্ট্র্যাক্টে তহবিল প্রতিশ্রুতিবদ্ধ করতে হবে। এই ডিপোজিট একটি ভার্চুয়াল ট্যাব হিসাবেও কাজ করে, তাই অংশগ্রহণকারী অভিনেতারা অবিলম্বে পেমেন্ট নিষ্পত্তি করার প্রয়োজন ছাড়াই অবাধে লেনদেন করতে পারে। শুধুমাত্র যখন চ্যানেলটি অনচেইনে চূড়ান্ত করা হয়, তখনই দলগুলি একে অপরের সাথে নিষ্পত্তি করে এবং তাদের ট্যাব থেকে যা অবশিষ্ট থাকে তা তুলে নেয়। + +এই ডিপোজিট প্রতিটি অংশগ্রহণকারীর কাছ থেকে সৎ আচরণের গ্যারান্টি দেওয়ার জন্য একটি বন্ড হিসাবেও কাজ করে। বিরোধ নিষ্পত্তি পর্যায়ে আমানতকারীরা দূষিত কাজের জন্য দোষী সাব্যস্ত হলে, চুক্তি তাদের আমানত স্ল্যাশ করে। + +চ্যানেল পিয়ারদের অবশ্যই একটি প্রাথমিক স্টেটে স্বাক্ষর করতে হবে, যার সাথে তারা সবাই একমত। এটি স্টেট চ্যানেলের জেনেসিস হিসাবে কাজ করে, যার পরে ব্যবহারকারীরা লেনদেন শুরু করতে পারে। + +### চ্যানেল ব্যবহার করা {#using-the-channel} + +চ্যানেলের স্টেট শুরু করার পরে, পিয়াররা লেনদেনে স্বাক্ষর করে এবং অনুমোদনের জন্য একে অপরের কাছে পাঠিয়ে ইন্টারঅ্যাক্ট করে। অংশগ্রহণকারীরা এই লেনদেনগুলির সাথে স্টেট আপডেট শুরু করে এবং অন্যদের থেকে স্টেট আপডেটগুলিতে স্বাক্ষর করে। প্রতিটি লেনদেন নিম্নলিখিতগুলি নিয়ে গঠিত: + +- একটি **নন্স**, যা লেনদেনের জন্য একটি অনন্য আইডি হিসাবে কাজ করে এবং রিপ্লে অ্যাটাক প্রতিরোধ করে। এটি স্টেট আপডেটগুলি কোন ক্রমে ঘটেছে তাও চিহ্নিত করে (যা বিরোধ নিষ্পত্তির জন্য গুরুত্বপূর্ণ) + +- চ্যানেলের পুরানো স্টেট + +- চ্যানেলের নতুন স্টেট + +- যে লেনদেনটি স্টেট ট্রানজিশন ট্রিগার করে (যেমন, এলিস ববকে 5 ETH পাঠায়) + +চ্যানেলের স্টেট আপডেটগুলি অনচেইনে সম্প্রচার করা হয় না যেমনটি সাধারণত ব্যবহারকারীরা মেইননেটে ইন্টারঅ্যাক্ট করার সময় হয়, যা অনচেইন ফুটপ্রিন্ট কমানোর জন্য স্টেট চ্যানেলগুলির লক্ষ্যের সাথে সামঞ্জস্যপূর্ণ। যতক্ষণ পর্যন্ত অংশগ্রহণকারীরা স্টেট আপডেটের বিষয়ে একমত হয়, ততক্ষণ সেগুলি একটি ইথেরিয়াম লেনদেনের মতোই চূড়ান্ত। অংশগ্রহণকারীদের শুধুমাত্র মেইননেটের কনসেন্সাসের উপর নির্ভর করতে হবে যদি কোনো বিরোধ দেখা দেয়। + +### চ্যানেল বন্ধ করা {#closing-the-channel} + +একটি স্টেট চ্যানেল বন্ধ করার জন্য চ্যানেলের চূড়ান্ত, সম্মত স্টেট অনচেইন স্মার্ট কন্ট্র্যাক্টে জমা দিতে হয়। স্টেট আপডেটে উল্লেখিত বিবরণগুলির মধ্যে প্রতিটি অংশগ্রহণকারীর চালের সংখ্যা এবং অনুমোদিত লেনদেনের একটি তালিকা অন্তর্ভুক্ত থাকে। + +স্টেট আপডেটটি বৈধ কিনা তা যাচাই করার পরে (অর্থাৎ, এটি সমস্ত পক্ষের দ্বারা স্বাক্ষরিত), স্মার্ট কন্ট্র্যাক্ট চ্যানেলটি চূড়ান্ত করে এবং চ্যানেলের ফলাফল অনুসারে লক করা তহবিল বিতরণ করে। অফচেইনে করা পেমেন্টগুলি ইথেরিয়ামের স্টেটে প্রয়োগ করা হয় এবং প্রতিটি অংশগ্রহণকারী লক করা তহবিলের তাদের অবশিষ্ট অংশ গ্রহণ করে। + +উপরে বর্ণিত দৃশ্যটি সুখী ক্ষেত্রে যা ঘটে তা উপস্থাপন করে। কখনও কখনও, ব্যবহারকারীরা একটি চুক্তিতে পৌঁছাতে এবং চ্যানেলটি চূড়ান্ত করতে অক্ষম হতে পারে (দুঃখজনক ঘটনা)। পরিস্থিতি সম্পর্কে নিম্নলিখিতগুলির যেকোনো একটি সত্য হতে পারে: + +- অংশগ্রহণকারীরা অফলাইনে চলে যায় এবং স্টেট ট্রানজিশনের প্রস্তাব দিতে ব্যর্থ হয় + +- অংশগ্রহণকারীরা বৈধ স্টেট আপডেটগুলিতে সহ-স্বাক্ষর করতে অস্বীকার করে + +- অংশগ্রহণকারীরা অনচেইন চুক্তিতে একটি পুরানো স্টেট আপডেট প্রস্তাব করে চ্যানেলটি চূড়ান্ত করার চেষ্টা করে + +- অংশগ্রহণকারীরা অন্যদের স্বাক্ষর করার জন্য অবৈধ স্টেট ট্রানজিশনের প্রস্তাব দেয় + +যখনই একটি চ্যানেলে অংশগ্রহণকারী অভিনেতাদের মধ্যে কনসেন্সাস ভেঙে যায়, তখন শেষ বিকল্পটি হল চ্যানেলের চূড়ান্ত, বৈধ স্টেট প্রয়োগ করার জন্য মেইননেটের কনসেন্সাসের উপর নির্ভর করা। এই ক্ষেত্রে, স্টেট চ্যানেল বন্ধ করার জন্য অনচেইনে বিরোধ নিষ্পত্তি করতে হবে। + +### বিরোধ নিষ্পত্তি করা {#settling-disputes} + +সাধারণত, একটি চ্যানেলের পক্ষগুলি আগে থেকেই চ্যানেলটি বন্ধ করার বিষয়ে একমত হয় এবং শেষ স্টেট ট্রানজিশনে সহ-স্বাক্ষর করে, যা তারা স্মার্ট কন্ট্র্যাক্টে জমা দেয়। একবার আপডেটটি অনচেইনে অনুমোদিত হলে, অফচেইন স্মার্ট কন্ট্র্যাক্টের সম্পাদন শেষ হয় এবং অংশগ্রহণকারীরা তাদের অর্থ নিয়ে চ্যানেল থেকে বেরিয়ে যায়। + +যাইহোক, একটি পক্ষ তাদের প্রতিপক্ষের অনুমোদনের জন্য অপেক্ষা না করেই স্মার্ট কন্ট্র্যাক্টের এক্সিকিউশন শেষ করতে এবং চ্যানেলটি চূড়ান্ত করার জন্য একটি অনচেইন অনুরোধ জমা দিতে পারে। যদি পূর্বে বর্ণিত কোনো কনসেন্সাস-ভঙ্গকারী পরিস্থিতি ঘটে, তবে যেকোনো পক্ষ চ্যানেলটি বন্ধ করতে এবং তহবিল বিতরণের জন্য অনচেইন চুক্তিটি ট্রিগার করতে পারে। এটি **ট্রাস্টলেসনেস** প্রদান করে, যা নিশ্চিত করে যে সৎ দলগুলি অন্য পক্ষের ক্রিয়াকলাপ নির্বিশেষে যেকোনো সময়ে তাদের আমানত থেকে বেরিয়ে যেতে পারে। + +চ্যানেল থেকে প্রস্থান প্রক্রিয়া করার জন্য, ব্যবহারকারীকে এপ্লিকেশনের সর্বশেষ বৈধ স্টেট আপডেটটি অনচেইন চুক্তিতে জমা দিতে হবে। যদি এটি যাচাই হয় (অর্থাৎ, এতে সমস্ত পক্ষের স্বাক্ষর থাকে), তাহলে তহবিল তাদের পক্ষে পুনরায় বিতরণ করা হয়। + +তবে, একক-ব্যবহারকারী প্রস্থান অনুরোধ কার্যকর করতে একটি বিলম্ব আছে। যদি চ্যানেলটি শেষ করার অনুরোধ সর্বসম্মতভাবে অনুমোদিত হয়, তাহলে অনচেইন প্রস্থান লেনদেনটি অবিলম্বে কার্যকর করা হয়। + +জালিয়াতির সম্ভাবনার কারণে একক-ব্যবহারকারী প্রস্থানের ক্ষেত্রে বিলম্বটি কার্যকর হয়। উদাহরণস্বরূপ, একজন চ্যানেল অংশগ্রহণকারী অনচেইনে একটি পুরানো স্টেট আপডেট জমা দিয়ে ইথেরিয়ামে চ্যানেলটি চূড়ান্ত করার চেষ্টা করতে পারে। + +একটি প্রতিরোধ ব্যবস্থা হিসাবে, স্টেট চ্যানেলগুলি সৎ ব্যবহারকারীদের চ্যানেলের সর্বশেষ বৈধ স্টেট অনচেইনে জমা দিয়ে অবৈধ স্টেট আপডেটগুলিকে চ্যালেঞ্জ করার অনুমতি দেয়। স্টেট চ্যানেলগুলি এমনভাবে ডিজাইন করা হয়েছে যাতে নতুন, সম্মত স্টেট আপডেটগুলি পুরানো স্টেট আপডেটগুলিকে ছাপিয়ে যায়। + +একবার একটি পিয়ার অনচেইন বিরোধ-নিষ্পত্তি সিস্টেমটি ট্রিগার করলে, অন্য পক্ষকে একটি সময়সীমার মধ্যে (যাকে চ্যালেঞ্জ উইন্ডো বলা হয়) সাড়া দিতে হবে। এটি ব্যবহারকারীদের প্রস্থান লেনদেনকে চ্যালেঞ্জ করার অনুমতি দেয়, বিশেষ করে যদি অন্য পক্ষ একটি বাসি আপডেট প্রয়োগ করে। + +যাই হোক না কেন, চ্যানেল ব্যবহারকারীদের সর্বদা শক্তিশালী ফাইনালিটি গ্যারান্টি থাকে: যদি তাদের দখলে থাকা স্টেট ট্রানজিশনটি সমস্ত সদস্য দ্বারা স্বাক্ষরিত হয় এবং এটি সবচেয়ে সাম্প্রতিক আপডেট হয়, তবে এটি একটি নিয়মিত অনচেইন লেনদেনের সমান ফাইনালিটি সহ। তাদের এখনও অন্য পক্ষকে অনচেইনে চ্যালেঞ্জ করতে হবে, কিন্তু একমাত্র সম্ভাব্য ফলাফল হল সর্বশেষ বৈধ স্টেট চূড়ান্ত করা, যা তারা ধরে রাখে। + +### স্টেট চ্যানেলগুলি ইথেরিয়ামের সাথে কীভাবে ইন্টারঅ্যাক্ট করে? {#how-do-state-channels-interact-with-ethereum} + +যদিও তারা অফচেইন প্রোটোকল হিসাবে বিদ্যমান, স্টেট চ্যানেলগুলির একটি অনচেইন উপাদান রয়েছে: চ্যানেল খোলার সময় ইথেরিয়ামে স্থাপন করা স্মার্ট কন্ট্র্যাক্ট। এই চুক্তিটি চ্যানেলে জমা করা সম্পদ নিয়ন্ত্রণ করে, স্টেট আপডেট যাচাই করে এবং অংশগ্রহণকারীদের মধ্যে বিরোধের সালিশি করে। + +[লেয়ার 2](/layer-2/) স্কেলিং সমাধানগুলির বিপরীতে, স্টেট চ্যানেলগুলি মেইননেটে লেনদেনের ডেটা বা স্টেট প্রতিশ্রুতি প্রকাশ করে না। তবে, তারা মেইননেটের সাথে আরও বেশি সংযুক্ত, যেমন [সাইডচেইন](/developers/docs/scaling/sidechains/) এর চেয়ে, যা তাদের কিছুটা নিরাপদ করে তোলে। + +স্টেট চ্যানেলগুলি নিম্নলিখিতগুলির জন্য মূল ইথেরিয়াম প্রোটোকলের উপর নির্ভর করে: + +#### ১. লাইভনেস {#liveness} + +চ্যানেল খোলার সময় স্থাপন করা অনচেইন চুক্তিটি চ্যানেলের কার্যকারিতার জন্য দায়ী। যদি চুক্তিটি ইথেরিয়ামে চলমান থাকে, তবে চ্যানেলটি সর্বদা ব্যবহারের জন্য উপলব্ধ। বিপরীতে, একটি সাইডচেইন সর্বদা ব্যর্থ হতে পারে, এমনকি যদি মেইননেট চালু থাকে, যা ব্যবহারকারীর তহবিলকে ঝুঁকির মধ্যে ফেলে। + +#### 2. নিরাপত্তা {#security} + +কিছু পরিমাণে, স্টেট চ্যানেলগুলি নিরাপত্তা প্রদান এবং ব্যবহারকারীদের দূষিত পিয়ারদের থেকে রক্ষা করার জন্য ইথেরিয়ামের উপর নির্ভর করে। পরবর্তী বিভাগগুলিতে আলোচনা করা হয়েছে, চ্যানেলগুলি একটি ফ্রড প্রুফ প্রক্রিয়া ব্যবহার করে যা ব্যবহারকারীদের একটি অবৈধ বা বাসি আপডেট দিয়ে চ্যানেল চূড়ান্ত করার প্রচেষ্টাকে চ্যালেঞ্জ করতে দেয়। + +এই ক্ষেত্রে, সৎ পক্ষ যাচাইয়ের জন্য অনচেইন চুক্তিতে ফ্রড প্রুফ হিসাবে চ্যানেলের সর্বশেষ বৈধ স্টেট সরবরাহ করে। ফ্রড প্রুফগুলি পারস্পরিক অবিশ্বাসী পক্ষগুলিকে প্রক্রিয়ায় তাদের তহবিল ঝুঁকি না নিয়ে অফচেইন লেনদেন পরিচালনা করতে সক্ষম করে। + +#### 3. ফাইনালিটি {#finality} + +চ্যানেল ব্যবহারকারীদের দ্বারা সম্মিলিতভাবে স্বাক্ষরিত স্টেট আপডেটগুলি অনচেইন লেনদেনের মতোই ভালো বলে বিবেচিত হয়। তবুও, সমস্ত ইন-চ্যানেল কার্যকলাপ শুধুমাত্র তখনই সত্যিকারের ফাইনালিটি অর্জন করে যখন চ্যানেলটি ইথেরিয়ামে বন্ধ করা হয়। + +আশাবাদী ক্ষেত্রে, উভয় পক্ষই সহযোগিতা করতে পারে এবং চূড়ান্ত স্টেট আপডেটে স্বাক্ষর করতে পারে এবং চ্যানেলটি বন্ধ করতে অনচেইনে জমা দিতে পারে, যার পরে তহবিলগুলি চ্যানেলের চূড়ান্ত স্টেট অনুসারে বিতরণ করা হয়। হতাশাবাদী ক্ষেত্রে, যেখানে কেউ অনচেইনে একটি ভুল স্টেট আপডেট পোস্ট করে প্রতারণা করার চেষ্টা করে, তাদের লেনদেনটি চ্যালেঞ্জ উইন্ডো শেষ না হওয়া পর্যন্ত চূড়ান্ত হয় না। + +## ভার্চুয়াল স্টেট চ্যানেল {#virtual-state-channels} + +একটি স্টেট চ্যানেলের একটি সরল বাস্তবায়ন হবে যখন দুইজন ব্যবহারকারী অফচেইনে একটি এপ্লিকেশন চালাতে চায় তখন একটি নতুন চুক্তি স্থাপন করা। এটি কেবল অসম্ভবই নয়, এটি স্টেট চ্যানেলগুলির ব্যয়-কার্যকারিতাও বাতিল করে দেয় (অনচেইন লেনদেনের খরচ দ্রুত বাড়তে পারে)। + +এই সমস্যার সমাধান করতে, "ভার্চুয়াল চ্যানেল" তৈরি করা হয়েছিল। নিয়মিত চ্যানেলগুলির বিপরীতে যেগুলির জন্য খোলা এবং বন্ধ করার জন্য অনচেইন লেনদেনের প্রয়োজন হয়, একটি ভার্চুয়াল চ্যানেল মূল চেইনের সাথে ইন্টারঅ্যাক্ট না করেই খোলা, কার্যকর করা এবং চূড়ান্ত করা যেতে পারে। এই পদ্ধতি ব্যবহার করে অফচেইনে বিরোধ নিষ্পত্তি করাও সম্ভব। + +এই সিস্টেমটি তথাকথিত "লেজার চ্যানেল" এর অস্তিত্বের উপর নির্ভর করে, যা অনচেইনে অর্থায়ন করা হয়েছে। দুই পক্ষের মধ্যে ভার্চুয়াল চ্যানেলগুলি একটি বিদ্যমান লেজার চ্যানেলের উপরে তৈরি করা যেতে পারে, লেজার চ্যানেলের মালিক(রা) একটি মধ্যস্থতাকারী হিসাবে কাজ করে। + +প্রতিটি ভার্চুয়াল চ্যানেলের ব্যবহারকারীরা একটি নতুন চুক্তির উদাহরণের মাধ্যমে ইন্টারঅ্যাক্ট করে, লেজার চ্যানেল একাধিক চুক্তির উদাহরণ সমর্থন করতে সক্ষম। লেজার চ্যানেলের স্টেটে একাধিক চুক্তি স্টোরেজ স্টেটও রয়েছে, যা বিভিন্ন ব্যবহারকারীর মধ্যে অফচেইনে অ্যাপ্লিকেশনগুলির সমান্তরাল সম্পাদনের অনুমতি দেয়। + +নিয়মিত চ্যানেলগুলির মতোই, ব্যবহারকারীরা স্টেট মেশিনের অগ্রগতির জন্য স্টেট আপডেট বিনিময় করে। বিরোধ দেখা না দিলে, মধ্যস্থতাকারীকে শুধুমাত্র চ্যানেল খোলার বা বন্ধ করার সময় যোগাযোগ করতে হবে। + +### ভার্চুয়াল পেমেন্ট চ্যানেল {#virtual-payment-channels} + +ভার্চুয়াল পেমেন্ট চ্যানেলগুলি ভার্চুয়াল স্টেট চ্যানেলগুলির মতো একই ধারণা নিয়ে কাজ করে: একই নেটওয়ার্কের সাথে সংযুক্ত অংশগ্রহণকারীরা অনচেইনে একটি নতুন চ্যানেল না খুলেই বার্তা পাঠাতে পারে। ভার্চুয়াল পেমেন্ট চ্যানেলগুলিতে, মান স্থানান্তর এক বা একাধিক মধ্যস্থতাকারীর মাধ্যমে পরিচালিত হয়, এই গ্যারান্টি সহ যে শুধুমাত্র উদ্দেশ্যপ্রণোদিত প্রাপকই স্থানান্তরিত তহবিল পেতে পারে। + +## স্টেট চ্যানেলের এপ্লিকেশন {#applications-of-state-channels} + +### পেমেন্টস {#payments} + +প্রাথমিক ব্লকচেইন চ্যানেলগুলি ছিল সাধারণ প্রোটোকল যা দুজন অংশগ্রহণকারীকে মেইননেটে উচ্চ লেনদেন ফি প্রদান না করেই অফচেইনে দ্রুত, কম-ফি স্থানান্তর পরিচালনা করতে দেয়। আজও, পেমেন্ট চ্যানেলগুলি ইথার এবং টোকেন বিনিময় এবং জমার জন্য ডিজাইন করা অ্যাপ্লিকেশনগুলির জন্য উপযোগী। + +চ্যানেল-ভিত্তিক পেমেন্টের নিম্নলিখিত সুবিধা রয়েছে: + +1. **থ্রুপুট**: প্রতি চ্যানেলে অফচেইন লেনদেনের পরিমাণ ইথেরিয়ামের থ্রুপুটের সাথে সম্পর্কহীন, যা বিভিন্ন কারণ দ্বারা প্রভাবিত হয়, বিশেষ করে ব্লক সাইজ এবং ব্লক সময়। অফচেইনে লেনদেন সম্পাদন করে, ব্লকচেইন চ্যানেলগুলি উচ্চতর থ্রুপুট অর্জন করতে পারে। + +2. **গোপনীয়তা**: যেহেতু চ্যানেলগুলি অফচেইনে বিদ্যমান, তাই অংশগ্রহণকারীদের মধ্যে মিথস্ক্রিয়ার বিবরণ ইথেরিয়ামের পাবলিক ব্লকচেইনে রেকর্ড করা হয় না। চ্যানেল ব্যবহারকারীদের শুধুমাত্র চ্যানেল ফান্ডিং এবং বন্ধ করার সময় বা বিরোধ নিষ্পত্তি করার সময় অনচেইনে ইন্টারঅ্যাক্ট করতে হয়। এইভাবে, চ্যানেলগুলি সেইসব ব্যক্তিদের জন্য উপযোগী যারা আরও ব্যক্তিগত লেনদেন চান। + +3. **লেটেন্সি**: চ্যানেল অংশগ্রহণকারীদের মধ্যে পরিচালিত অফচেইন লেনদেনগুলি তাত্ক্ষণিকভাবে নিষ্পত্তি করা যেতে পারে, যদি উভয় পক্ষই সহযোগিতা করে, যা বিলম্ব কমায়। বিপরীতে, মেইননেটে একটি লেনদেন পাঠানোর জন্য নোডগুলিকে লেনদেন প্রক্রিয়া করতে, লেনদেন সহ একটি নতুন ব্লক তৈরি করতে এবং কনসেন্সাসে পৌঁছানোর জন্য অপেক্ষা করতে হয়। ব্যবহারকারীদের একটি লেনদেন চূড়ান্ত হিসাবে বিবেচনা করার আগে আরও ব্লক নিশ্চিতকরণের জন্য অপেক্ষা করতে হতে পারে। + +4. **খরচ**: স্টেট চ্যানেলগুলি এমন পরিস্থিতিতে বিশেষভাবে উপযোগী যেখানে অংশগ্রহণকারীদের একটি সেট দীর্ঘ সময় ধরে অনেক স্টেট আপডেট বিনিময় করবে। একমাত্র খরচ হল স্টেট চ্যানেল স্মার্ট কন্ট্র্যাক্ট খোলা এবং বন্ধ করা; চ্যানেল খোলা এবং বন্ধ করার মধ্যে প্রতিটি স্টেট পরিবর্তন আগেরটির চেয়ে সস্তা হবে কারণ নিষ্পত্তির খরচ সেই অনুযায়ী বিতরণ করা হয়। + +[রোলআপস](/developers/docs/scaling/#rollups) এর মতো লেয়ার 2 সমাধানগুলিতে স্টেট চ্যানেলগুলি প্রয়োগ করা, পেমেন্টের জন্য সেগুলিকে আরও আকর্ষণীয় করে তুলতে পারে। যদিও চ্যানেলগুলি সস্তা পেমেন্টের অফার করে, খোলার পর্যায়ে মেইননেটে অনচেইন চুক্তি সেট আপ করার খরচ ব্যয়বহুল হতে পারে—বিশেষ করে যখন গ্যাসের ফি বেড়ে যায়। ইথেরিয়াম-ভিত্তিক রোলআপগুলি [কম লেনদেন ফি](https://l2fees.info/) অফার করে এবং সেটআপ ফি কমিয়ে চ্যানেল অংশগ্রহণকারীদের জন্য ওভারহেড কমাতে পারে। + +### মাইক্রোট্রানজ্যাকশন {#microtransactions} + +মাইক্রোট্রানজ্যাকশন হল কম-মূল্যের পেমেন্ট (যেমন, এক ডলারের ভগ্নাংশের চেয়ে কম) যা ব্যবসাগুলি লোকসান না করে প্রক্রিয়া করতে পারে না। এই সত্তাগুলিকে পেমেন্ট পরিষেবা প্রদানকারীদের অর্থ প্রদান করতে হয়, যা তারা করতে পারে না যদি গ্রাহকের পেমেন্টে মার্জিন লাভ করার জন্য খুব কম হয়। + +পেমেন্ট চ্যানেলগুলি মাইক্রোট্রানজ্যাকশনের সাথে যুক্ত ওভারহেড কমিয়ে এই সমস্যার সমাধান করে। উদাহরণস্বরূপ, একটি ইন্টারনেট পরিষেবা প্রদানকারী (ISP) একজন গ্রাহকের সাথে একটি পেমেন্ট চ্যানেল খুলতে পারে, যা তাদের পরিষেবা ব্যবহার করার সময় প্রতিবার ছোট পেমেন্ট স্ট্রিম করতে দেয়। + +চ্যানেল খোলা এবং বন্ধ করার খরচ ছাড়াও, অংশগ্রহণকারীদের মাইক্রোট্রানজ্যাকশনে আর কোনো খরচ হয় না (কোনো গ্যাস ফি নেই)। এটি একটি উইন-উইন পরিস্থিতি কারণ গ্রাহকরা পরিষেবাগুলির জন্য কত টাকা দেবেন সে বিষয়ে আরও নমনীয়তা পান এবং ব্যবসাগুলি লাভজনক মাইক্রোট্রানজ্যাকশন থেকে বঞ্চিত হয় না। + +### ডিসেন্ট্রালাইজড এপ্লিকেশন {#decentralized-applications} + +পেমেন্ট চ্যানেলগুলির মতো, স্টেট চ্যানেলগুলি স্টেট মেশিনের চূড়ান্ত স্টেট অনুসারে শর্তসাপেক্ষ পেমেন্ট করতে পারে। স্টেট চ্যানেলগুলি যেকোনো স্টেট ট্রানজিশন লজিককেও সমর্থন করতে পারে, যা তাদের অফচেইনে জেনেরিক অ্যাপস চালানোর জন্য উপযোগী করে তোলে। + +স্টেট চ্যানেলগুলি প্রায়শই সাধারণ টার্ন-ভিত্তিক অ্যাপ্লিকেশনগুলিতে সীমাবদ্ধ থাকে, কারণ এটি অনচেইন চুক্তিতে প্রতিশ্রুতিবদ্ধ তহবিল পরিচালনা করা সহজ করে তোলে। এছাড়াও, সীমিত সংখ্যক পক্ষ ব্যবধানে অফচেইন অ্যাপ্লিকেশনটির স্টেট আপডেট করার সাথে সাথে, অসৎ আচরণকে শাস্তি দেওয়া তুলনামূলকভাবে সহজ। + +একটি স্টেট চ্যানেল অ্যাপ্লিকেশনের কার্যকারিতাও এর ডিজাইনের উপর নির্ভর করে। উদাহরণস্বরূপ, একজন ডেভেলপার একবার অ্যাপ চ্যানেল চুক্তিটি অনচেইনে স্থাপন করতে পারে এবং অন্যান্য খেলোয়াড়দের অনচেইনে না গিয়েই অ্যাপটি পুনরায় ব্যবহার করার অনুমতি দিতে পারে। এই ক্ষেত্রে, প্রাথমিক অ্যাপ চ্যানেলটি একাধিক ভার্চুয়াল চ্যানেল সমর্থনকারী একটি লেজার চ্যানেল হিসাবে কাজ করে, প্রতিটি অফচেইনে অ্যাপের স্মার্ট কন্ট্র্যাক্টের একটি নতুন উদাহরণ চালাচ্ছে। + +স্টেট চ্যানেল অ্যাপ্লিকেশনগুলির জন্য একটি সম্ভাব্য ব্যবহারের ক্ষেত্র হল সাধারণ দুই-খেলোয়াড়ের গেম, যেখানে গেমের ফলাফলের উপর ভিত্তি করে তহবিল বিতরণ করা হয়। এখানে সুবিধা হল যে খেলোয়াড়দের একে অপরকে বিশ্বাস করতে হবে না (ট্রাস্টলেসনেস) এবং অনচেইন চুক্তি, খেলোয়াড়রা নয়, তহবিল বরাদ্দ এবং বিরোধ নিষ্পত্তি নিয়ন্ত্রণ করে (বিকেন্দ্রীকরণ)। + +স্টেট চ্যানেল অ্যাপগুলির অন্যান্য সম্ভাব্য ব্যবহারের ক্ষেত্রে ENS নামের মালিকানা, NFT লেজার এবং আরও অনেক কিছু অন্তর্ভুক্ত রয়েছে। + +### পারমাণবিক স্থানান্তর {#atomic-transfers} + +প্রাথমিক পেমেন্ট চ্যানেলগুলি দুই পক্ষের মধ্যে স্থানান্তরে সীমাবদ্ধ ছিল, যা তাদের ব্যবহারযোগ্যতা সীমিত করেছিল। যাইহোক, ভার্চুয়াল চ্যানেলগুলির প্রবর্তন ব্যক্তিদের মধ্যস্থতাকারীদের মাধ্যমে (অর্থাৎ, একাধিক p2p চ্যানেল) স্থানান্তর রুট করার অনুমতি দেয়, অনচেইনে একটি নতুন চ্যানেল না খুলেই। + +সাধারণত "মাল্টি-হপ ট্রান্সফার" হিসাবে বর্ণিত, রাউটেড পেমেন্টগুলি পারমাণবিক (অর্থাৎ, হয় লেনদেনের সমস্ত অংশ সফল হয় বা এটি সম্পূর্ণ ব্যর্থ হয়)। পারমাণবিক স্থানান্তরগুলি [Hashed Timelock Contracts (HTLCs)](https://en.bitcoin.it/wiki/Hash_Time_Locked_Contracts) ব্যবহার করে যাতে নিশ্চিত করা যায় যে পেমেন্ট শুধুমাত্র নির্দিষ্ট শর্ত পূরণ হলেই মুক্তি পায়, যার ফলে প্রতিপক্ষের ঝুঁকি কমে যায়। + +## স্টেট চ্যানেল ব্যবহারের অসুবিধা {#drawbacks-of-state-channels} + +### লাইভনেস অনুমান {#liveness-assumptions} + +দক্ষতা নিশ্চিত করতে, স্টেট চ্যানেলগুলি চ্যানেল অংশগ্রহণকারীদের বিরোধে সাড়া দেওয়ার ক্ষমতার উপর সময়সীমা রাখে। এই নিয়মটি অনুমান করে যে পিয়াররা সর্বদা অনলাইন থাকবে চ্যানেলের কার্যকলাপ নিরীক্ষণ করতে এবং প্রয়োজনে চ্যালেঞ্জের প্রতিদ্বন্দ্বিতা করতে। + +বাস্তবে, ব্যবহারকারীরা তাদের নিয়ন্ত্রণের বাইরের কারণে অফলাইনে যেতে পারে (যেমন, দুর্বল ইন্টারনেট সংযোগ, যান্ত্রিক ব্যর্থতা, ইত্যাদি)। যদি একজন সৎ ব্যবহারকারী অফলাইনে চলে যায়, তবে একটি দূষিত পিয়ার অ্যাডজুডিকেটর চুক্তিতে পুরানো মধ্যবর্তী স্টেটগুলি উপস্থাপন করে এবং প্রতিশ্রুতিবদ্ধ তহবিল চুরি করে পরিস্থিতির সুযোগ নিতে পারে। + +কিছু চ্যানেল "ওয়াচটাওয়ার" ব্যবহার করে—সত্তা যা অন্যদের পক্ষে অনচেইন বিরোধের ঘটনাগুলি দেখার এবং প্রয়োজনীয় পদক্ষেপ নেওয়ার জন্য দায়ী, যেমন সংশ্লিষ্ট পক্ষগুলিকে সতর্ক করা। তবে, এটি একটি স্টেট চ্যানেল ব্যবহারের খরচ বাড়াতে পারে। + +### ডেটা অনুপলব্ধতা {#data-unavailability} + +পূর্বে ব্যাখ্যা করা হয়েছে, একটি অবৈধ বিরোধকে চ্যালেঞ্জ করার জন্য স্টেট চ্যানেলের সর্বশেষ, বৈধ স্টেট উপস্থাপন করতে হবে। এটি একটি অনুমানের উপর ভিত্তি করে আরেকটি নিয়ম—যে ব্যবহারকারীদের চ্যানেলের সর্বশেষ স্টেটে অ্যাক্সেস রয়েছে। + +যদিও চ্যানেল ব্যবহারকারীদের অফচেইন অ্যাপ্লিকেশন স্টেটের কপি সংরক্ষণ করার আশা করা যুক্তিসঙ্গত, এই ডেটা ত্রুটি বা যান্ত্রিক ব্যর্থতার কারণে হারিয়ে যেতে পারে। যদি ব্যবহারকারীর কাছে ডেটা ব্যাক আপ না থাকে, তবে তারা কেবল আশা করতে পারে যে অন্য পক্ষ তাদের দখলে থাকা পুরানো স্টেট ট্রানজিশন ব্যবহার করে একটি অবৈধ প্রস্থান অনুরোধ চূড়ান্ত করবে না। + +ইথেরিয়াম ব্যবহারকারীদের এই সমস্যার সাথে মোকাবিলা করতে হবে না কারণ নেটওয়ার্ক ডেটা প্রাপ্যতার উপর নিয়ম প্রয়োগ করে। লেনদেনের ডেটা সমস্ত নোড দ্বারা সংরক্ষণ এবং প্রচারিত হয় এবং প্রয়োজনে ব্যবহারকারীদের ডাউনলোডের জন্য উপলব্ধ থাকে। + +### তারল্য সমস্যা {#liquidity-issues} + +একটি ব্লকচেইন চ্যানেল প্রতিষ্ঠা করতে, অংশগ্রহণকারীদের চ্যানেলের জীবনচক্রের জন্য একটি অনচেইন স্মার্ট কন্ট্র্যাক্টে তহবিল লক করতে হবে। এটি চ্যানেল ব্যবহারকারীদের তারল্য হ্রাস করে এবং যারা মেইননেটে তহবিল লক করে রাখতে পারে তাদের জন্য চ্যানেলগুলি সীমাবদ্ধ করে। + +তবে, একটি অফচেইন পরিষেবা প্রদানকারী (OSP) দ্বারা পরিচালিত লেজার চ্যানেলগুলি ব্যবহারকারীদের জন্য তারল্য সমস্যা কমাতে পারে। একটি লেজার চ্যানেলের সাথে সংযুক্ত দুটি পিয়ার একটি ভার্চুয়াল চ্যানেল তৈরি করতে পারে, যা তারা যখনই চায় তখন সম্পূর্ণ অফচেইনে খুলতে এবং চূড়ান্ত করতে পারে। + +অফচেইন পরিষেবা প্রদানকারীরা একাধিক পিয়ারের সাথে চ্যানেলও খুলতে পারে, যা তাদের পেমেন্ট রাউটিংয়ের জন্য উপযোগী করে তোলে। অবশ্যই, ব্যবহারকারীদের তাদের পরিষেবার জন্য OSP-কে ফি দিতে হবে, যা কারো কারো জন্য অনাকাঙ্ক্ষিত হতে পারে। + +### গ্রিফিং অ্যাটাক {#griefing-attacks} + +গ্রিফিং অ্যাটাক হল ফ্রড প্রুফ-ভিত্তিক সিস্টেমের একটি সাধারণ বৈশিষ্ট্য। একটি গ্রিফিং অ্যাটাক সরাসরি আক্রমণকারীর উপকার করে না তবে শিকারের জন্য দুঃখ (অর্থাৎ, ক্ষতি) ঘটায়, তাই এই নাম। + +ফ্রড প্রুফিং গ্রিফিং অ্যাটাকের জন্য সংবেদনশীল কারণ সৎ পক্ষকে প্রতিটি বিরোধের, এমনকি অবৈধগুলিরও, প্রতিক্রিয়া জানাতে হবে, নতুবা তাদের তহবিল হারানোর ঝুঁকি থাকে। একজন দূষিত অংশগ্রহণকারী বারবার অনচেইনে বাসি স্টেট ট্রানজিশন পোস্ট করার সিদ্ধান্ত নিতে পারে, যা সৎ পক্ষকে বৈধ স্টেট দিয়ে প্রতিক্রিয়া জানাতে বাধ্য করে। সেই অনচেইন লেনদেনগুলির খরচ দ্রুত বাড়তে পারে, যার ফলে সৎ দলগুলি প্রক্রিয়ায় হেরে যায়। + +### পূর্বনির্ধারিত অংশগ্রহণকারী সেট {#predefined-participant-sets} + +ডিজাইন অনুসারে, একটি স্টেট চ্যানেল গঠনকারী অংশগ্রহণকারীদের সংখ্যা তার জীবনকাল জুড়ে স্থির থাকে। এর কারণ হল অংশগ্রহণকারী সেট আপডেট করা চ্যানেলের ক্রিয়াকলাপকে জটিল করে তুলবে, বিশেষ করে চ্যানেল ফান্ডিং বা বিরোধ নিষ্পত্তি করার সময়। অংশগ্রহণকারী যোগ বা অপসারণের জন্য অতিরিক্ত অনচেইন কার্যকলাপের প্রয়োজন হবে, যা ব্যবহারকারীদের জন্য ওভারহেড বাড়ায়। + +যদিও এটি স্টেট চ্যানেলগুলিকে যুক্তিযুক্ত করা সহজ করে তোলে, এটি অ্যাপ্লিকেশন ডেভেলপারদের জন্য চ্যানেল ডিজাইনের উপযোগিতা সীমাবদ্ধ করে। এটি আংশিকভাবে ব্যাখ্যা করে কেন রোলআপগুলির মতো অন্যান্য স্কেলিং সমাধানগুলির পক্ষে স্টেট চ্যানেলগুলি বাদ দেওয়া হয়েছে। + +### সমান্তরাল লেনদেন প্রক্রিয়াকরণ {#parallel-transaction-processing} + +স্টেট চ্যানেলের অংশগ্রহণকারীরা পালাক্রমে স্টেট আপডেট পাঠায়, যে কারণে তারা "টার্ন-ভিত্তিক অ্যাপ্লিকেশন" (যেমন, একটি দুই-খেলোয়াড়ের দাবা খেলা) এর জন্য সবচেয়ে ভালো কাজ করে। এটি একযোগে স্টেট আপডেটগুলি পরিচালনা করার প্রয়োজনীয়তা দূর করে এবং বাসি আপডেট পোস্টারদের শাস্তি দেওয়ার জন্য অনচেইন চুক্তির কাজ কমিয়ে দেয়। যাইহোক, এই ডিজাইনের একটি পার্শ্ব-প্রতিক্রিয়া হল যে লেনদেনগুলি একে অপরের উপর নির্ভরশীল, যা লেটেন্সি বাড়ায় এবং সামগ্রিক ব্যবহারকারীর অভিজ্ঞতা হ্রাস করে। + +কিছু স্টেট চ্যানেল এই সমস্যার সমাধান করে একটি "ফুল-ডুপ্লেক্স" ডিজাইন ব্যবহার করে যা অফচেইন স্টেটকে দুটি একমুখী "সিমপ্লেক্স" স্টেটে বিভক্ত করে, যা একযোগে স্টেট আপডেটের অনুমতি দেয়। এই ধরনের ডিজাইনগুলি অফচেইন থ্রুপুট উন্নত করে এবং লেনদেনের বিলম্ব কমায়। + +## স্টেট চ্যানেল ব্যবহার করুন {#use-state-channels} + +একাধিক প্রকল্প স্টেট চ্যানেলগুলির বাস্তবায়ন সরবরাহ করে যা আপনি আপনার ডিএ্যাপস-এ একীভূত করতে পারেন: + +- [Connext](https://connext.network/) +- [Kchannels](https://www.kchannels.io/) +- [Perun](https://perun.network/) +- [Raiden](https://raiden.network/) +- [Statechannels.org](https://statechannels.org/) + +## আরও পড়ুন {#further-reading} + +**স্টেট চ্যানেল** + +- [Making Sense of Ethereum’s Layer 2 Scaling Solutions: State Channels, Plasma, and Truebit](https://medium.com/l4-media/making-sense-of-ethereums-layer-2-scaling-solutions-state-channels-plasma-and-truebit-22cb40dcc2f4) _– Josh Stark, Feb 12 2018_ +- [State Channels - an explanation](https://www.jeffcoleman.ca/state-channels/) _Nov 6, 2015 - Jeff Coleman_ +- [Basics of State Channels](https://education.district0x.io/general-topics/understanding-ethereum/basics-state-channels/) _District0x_ +- [Blockchain State Channels: A State of the Art](https://ieeexplore.ieee.org/document/9627997) + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/scaling/validium/index.md b/public/content/translations/bn/developers/docs/scaling/validium/index.md new file mode 100644 index 00000000000..cf05998b577 --- /dev/null +++ b/public/content/translations/bn/developers/docs/scaling/validium/index.md @@ -0,0 +1,166 @@ +--- +title: "ভ্যালিডিয়াম" +description: "বর্তমানে Ethereum কমিউনিটি দ্বারা ব্যবহৃত একটি স্কেলিং সমাধান হিসাবে ভ্যালিডিয়ামের একটি পরিচিতি।" +lang: bn +sidebarDepth: 3 +--- + +ভ্যালিডিয়াম একটি [স্কেলিং সমাধান](/developers/docs/scaling/) যা [ZK-রোলআপস](/developers/docs/scaling/zk-rollups/)-এর মতো বৈধতা প্রমাণ ব্যবহার করে লেনদেনের অখণ্ডতা প্রয়োগ করে, কিন্তু Ethereum মেইননেটে লেনদেনের ডেটা সংরক্ষণ করে না। যদিও অফচেইন ডেটা প্রাপ্যতা ট্রেড-অফ প্রবর্তন করে, এটি স্কেলেবিলিটিতে ব্যাপক উন্নতির কারণ হতে পারে (ভ্যালিডিয়াম প্রতি সেকেন্ডে [~9,000 লেনদেন, বা তার বেশি](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) প্রক্রিয়া করতে পারে)। + +## পূর্বশর্ত {#prerequisites} + +আপনার [Ethereum স্কেলিং](/developers/docs/scaling/) এবং [লেয়ার 2](/layer-2) সম্পর্কিত আমাদের পৃষ্ঠাটি পড়া এবং বোঝা উচিত। + +## ভ্যালিডিয়াম কি? {#what-is-validium} + +ভ্যালিডিয়াম হল স্কেলিং সমাধান যা Ethereum মেইননেটের বাইরে লেনদেন প্রক্রিয়া করে থ্রুপুট উন্নত করার জন্য ডিজাইন করা অফচেইন ডেটা প্রাপ্যতা এবং গণনা ব্যবহার করে। জিরো-নলেজ রোলআপ (ZK-রোলআপ) এর মতো, ভ্যালিডিয়াম Ethereum-এ অফচেইন লেনদেন যাচাই করতে [জিরো-নলেজ প্রমাণ](/glossary/#zk-proof) প্রকাশ করে। এটি অবৈধ স্টেট ট্রানজিশন প্রতিরোধ করে এবং একটি ভ্যালিডিয়াম চেইনের নিরাপত্তা গ্যারান্টি বাড়ায়। + +এই "বৈধতা প্রমাণ" গুলি ZK-SNARKs (জিরো-নলেজ সাক্সিন্ট নন-ইন্টারেক্টিভ আর্গুমেন্ট অফ নলেজ) বা ZK-STARKs (জিরো-নলেজ স্কেলেবল ট্রান্সপারেন্ট আর্গুমেন্ট অফ নলেজ) আকারে আসতে পারে। [জিরো-নলেজ প্রমাণ](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) সম্পর্কে আরও জানুন। + +ভ্যালিডিয়াম ব্যবহারকারীদের তহবিল Ethereum-এর একটি স্মার্ট কন্ট্র্যাক্ট দ্বারা নিয়ন্ত্রিত হয়। ভ্যালিডিয়ামগুলি প্রায়-তাত্ক্ষণিক উত্তোলন অফার করে, অনেকটা ZK-রোলআপগুলির মতোই; একবার মেইননেটে একটি উত্তোলনের অনুরোধের জন্য বৈধতা প্রমাণ যাচাই হয়ে গেলে, ব্যবহারকারীরা [মার্কেল প্রমাণ](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) প্রদান করে তহবিল উত্তোলন করতে পারেন। মার্কেল প্রমাণ একটি যাচাইকৃত লেনদেন ব্যাচে ব্যবহারকারীর উত্তোলন লেনদেনের অন্তর্ভুক্তিকে যাচাই করে, যা অনচেইন কন্ট্র্যাক্টকে উত্তোলন প্রক্রিয়া করার অনুমতি দেয়। + +যাইহোক, ভ্যালিডিয়াম ব্যবহারকারীদের তহবিল ফ্রিজ করা এবং উত্তোলন সীমাবদ্ধ করা যেতে পারে। এটি ঘটতে পারে যদি ভ্যালিডিয়াম চেইনের ডেটা প্রাপ্যতা পরিচালকরা ব্যবহারকারীদের থেকে অফচেইন স্টেট ডেটা আটকে রাখে। লেনদেনের ডেটাতে অ্যাক্সেস ছাড়া, ব্যবহারকারীরা তহবিলের মালিকানা প্রমাণ করতে এবং উত্তোলন কার্যকর করার জন্য প্রয়োজনীয় মার্কেল প্রমাণ গণনা করতে পারে না। + +এটি ভ্যালিডিয়াম এবং ZK-রোলআপগুলির মধ্যে প্রধান পার্থক্য—ডেটা প্রাপ্যতা স্পেকট্রামে তাদের অবস্থান। উভয় সমাধানই ডেটা স্টোরেজকে ভিন্নভাবে দেখে, যা নিরাপত্তা এবং বিশ্বাসহীনতার জন্য প্রভাব ফেলে। + +## ভ্যালিডিয়ামগুলি কীভাবে Ethereum-এর সাথে ইন্টারঅ্যাক্ট করে? {#how-do-validiums-interact-with-ethereum} + +ভ্যালিডিয়াম হল স্কেলিং প্রোটোকল যা বিদ্যমান Ethereum চেইনের উপরে তৈরি করা হয়েছে। যদিও এটি অফচেইন লেনদেন সম্পাদন করে, একটি ভ্যালিডিয়াম চেইন মেইননেটে স্থাপন করা স্মার্ট কন্ট্র্যাক্টের একটি সংগ্রহ দ্বারা পরিচালিত হয় যার মধ্যে রয়েছে: + +1. **যাচাইকারী চুক্তি**: যাচাইকারী চুক্তি স্টেট আপডেট করার সময় ভ্যালিডিয়াম অপারেটর দ্বারা জমা দেওয়া প্রুফের বৈধতা যাচাই করে। এর মধ্যে রয়েছে অফচেইন লেনদেনের সঠিকতার প্রত্যয়নকারী বৈধতা প্রমাণ এবং অফচেইন লেনদেন ডেটার অস্তিত্ব যাচাইকারী ডেটা প্রাপ্যতা প্রমাণ। + +2. **প্রধান চুক্তি**: প্রধান চুক্তি ব্লক প্রযোজকদের দ্বারা জমা দেওয়া স্টেট প্রতিশ্রুতি (মার্কেল রুট) সংরক্ষণ করে এবং একবার অনচেইনে একটি বৈধতা প্রমাণ যাচাই হয়ে গেলে ভ্যালিডিয়ামের স্টেট আপডেট করে। এই চুক্তিটি ভ্যালিডিয়াম চেইনে জমা এবং উত্তোলন প্রক্রিয়াও করে। + +ভ্যালিডিয়ামগুলি নিম্নলিখিতগুলির জন্য প্রধান Ethereum চেইনের উপরও নির্ভর করে: + +### নিষ্পত্তি {#settlement} + +একটি ভ্যালিডিয়ামে সম্পাদিত লেনদেনগুলি সম্পূর্ণরূপে নিশ্চিত করা যায় না যতক্ষণ না মূল চেইন তাদের বৈধতা যাচাই করে। একটি ভ্যালিডিয়ামে পরিচালিত সমস্ত কাজ অবশেষে মেইননেটে নিষ্পত্তি করতে হবে। Ethereum ব্লকচেইন ভ্যালিডিয়াম ব্যবহারকারীদের জন্য "নিষ্পত্তি গ্যারান্টি" প্রদান করে, যার অর্থ অফচেইন লেনদেনগুলি একবার অনচেইনে প্রতিশ্রুতিবদ্ধ হলে বিপরীত বা পরিবর্তন করা যায় না। + +### নিরাপত্তা {#security} + +Ethereum, একটি নিষ্পত্তি স্তর হিসাবে কাজ করে, ভ্যালিডিয়ামে স্টেট ট্রানজিশনের বৈধতার নিশ্চয়তা দেয়। ভ্যালিডিয়াম চেইনে সম্পাদিত অফচেইন লেনদেনগুলি বেস Ethereum লেয়ারের একটি স্মার্ট কন্ট্র্যাক্টের মাধ্যমে যাচাই করা হয়। + +যদি অনচেইন যাচাইকারী চুক্তি প্রমাণটিকে অবৈধ মনে করে, তবে লেনদেনগুলি প্রত্যাখ্যান করা হয়। এর মানে হল যে অপারেটরদের ভ্যালিডিয়ামের স্টেট আপডেট করার আগে Ethereum প্রোটোকল দ্বারা প্রয়োগ করা বৈধতার শর্তাবলী পূরণ করতে হবে। + +## ভ্যালিডিয়াম কিভাবে কাজ করে? {#how-does-validium-work} + +### লেনদেন {#transactions} + +ব্যবহারকারীরা অপারেটরের কাছে লেনদেন জমা দেয়, একটি নোড যা ভ্যালিডিয়াম চেইনে লেনদেন সম্পাদনের জন্য দায়ী। কিছু ভ্যালিডিয়াম চেইন চালানোর জন্য একজন একক অপারেটর ব্যবহার করতে পারে বা অপারেটরদের ঘোরানোর জন্য একটি [প্রুফ-অফ-স্টেক (PoS)](/developers/docs/consensus-mechanisms/pos/) ব্যবস্থার উপর নির্ভর করতে পারে। + +অপারেটর লেনদেনগুলিকে একটি ব্যাচে একত্রিত করে এবং প্রমাণের জন্য একটি প্রমাণ সার্কিটে পাঠায়। প্রমাণ সার্কিট লেনদেন ব্যাচ (এবং অন্যান্য প্রাসঙ্গিক ডেটা) ইনপুট হিসাবে গ্রহণ করে এবং অপারেশনগুলি সঠিকভাবে সঞ্চালিত হয়েছে তা যাচাই করে একটি বৈধতা প্রমাণ আউটপুট করে। + +### স্টেট কমিটমেন্ট {#state-commitments} + +ভ্যালিডিয়ামের স্টেটকে একটি মার্কেল ট্রি হিসাবে হ্যাশ করা হয় যার রুট Ethereum-এর প্রধান চুক্তিতে সংরক্ষণ করা হয়। মার্কেল রুট, যা স্টেট রুট নামেও পরিচিত, ভ্যালিডিয়ামের অ্যাকাউন্ট এবং ব্যালেন্সের বর্তমান স্টেটের প্রতি একটি ক্রিপ্টোগ্রাফিক প্রতিশ্রুতি হিসাবে কাজ করে। + +একটি স্টেট আপডেট করার জন্য, অপারেটরকে একটি নতুন স্টেট রুট গণনা করতে হবে (লেনদেন সম্পাদনের পরে) এবং এটি অনচেইন চুক্তিতে জমা দিতে হবে। যদি বৈধতা প্রমাণটি সঠিক হয়, প্রস্তাবিত স্টেটটি গৃহীত হয় এবং ভ্যালিডিয়াম নতুন স্টেট রুটে চলে যায়। + +### আমানত এবং উত্তোলন {#deposits-and-withdrawals} + +ব্যবহারকারীরা অনচেইন চুক্তিতে ETH (বা যেকোনো ERC-সামঞ্জস্যপূর্ণ টোকেন) জমা করে Ethereum থেকে একটি ভ্যালিডিয়ামে তহবিল স্থানান্তর করে। চুক্তিটি ভ্যালিডিয়াম অফচেইনে ডিপোজিট ইভেন্টটি রিলে করে, যেখানে ব্যবহারকারীর ঠিকানা তাদের জমার সমান পরিমাণ দিয়ে ক্রেডিট করা হয়। অপারেটর এই ডিপোজিট লেনদেনটিকে একটি নতুন ব্যাচেও অন্তর্ভুক্ত করে। + +মেইননেটে তহবিল ফেরত পাঠানোর জন্য, একজন ভ্যালিডিয়াম ব্যবহারকারী একটি উত্তোলন লেনদেন শুরু করে এবং এটি অপারেটরের কাছে জমা দেয় যিনি উত্তোলনের অনুরোধটি যাচাই করেন এবং এটিকে একটি ব্যাচে অন্তর্ভুক্ত করেন। সিস্টেম থেকে বের হওয়ার আগে ভ্যালিডিয়াম চেইনে ব্যবহারকারীর সম্পদও ধ্বংস হয়ে যায়। ব্যাচের সাথে যুক্ত বৈধতা প্রমাণ যাচাই হয়ে গেলে, ব্যবহারকারী তাদের প্রাথমিক জমার অবশিষ্টাংশ উত্তোলন করতে প্রধান চুক্তিকে কল করতে পারেন। + +একটি সেন্সরশিপ-বিরোধী ব্যবস্থা হিসাবে, ভ্যালিডিয়াম প্রোটোকল ব্যবহারকারীদের অপারেটরের মাধ্যমে না গিয়ে সরাসরি ভ্যালিডিয়াম চুক্তি থেকে উত্তোলন করার অনুমতি দেয়। এই ক্ষেত্রে, ব্যবহারকারীদের যাচাইকারী চুক্তিতে একটি মার্কেল প্রমাণ প্রদান করতে হবে যা স্টেট রুটে একটি অ্যাকাউন্টের অন্তর্ভুক্তি দেখায়। যদি প্রমাণটি গৃহীত হয়, ব্যবহারকারী ভ্যালিডিয়াম থেকে তাদের তহবিল বের করার জন্য প্রধান চুক্তির উত্তোলন ফাংশনকে কল করতে পারে। + +### ব্যাচ জমা {#batch-submission} + +এক ব্যাচ লেনদেন সম্পাদন করার পরে, অপারেটর সংশ্লিষ্ট বৈধতা প্রমাণটি যাচাইকারী চুক্তিতে জমা দেয় এবং প্রধান চুক্তিতে একটি নতুন স্টেট রুটের প্রস্তাব দেয়। যদি প্রমাণটি বৈধ হয়, প্রধান চুক্তিটি ভ্যালিডিয়ামের স্টেট আপডেট করে এবং ব্যাচের লেনদেনের ফলাফল চূড়ান্ত করে। + +একটি ZK-রোলআপের বিপরীতে, একটি ভ্যালিডিয়ামের ব্লক প্রযোজকদের লেনদেন ব্যাচের জন্য লেনদেন ডেটা প্রকাশ করার প্রয়োজন নেই (শুধুমাত্র ব্লক হেডার)। এটি ভ্যালিডিয়ামকে একটি সম্পূর্ণরূপে অফচেইন স্কেলিং প্রোটোকল করে তোলে, "হাইব্রিড" স্কেলিং প্রোটোকলের (অর্থাৎ, [লেয়ার 2](/layer-2/)) বিপরীতে যা ব্লব ডেটা, `calldata`, বা উভয়ের সংমিশ্রণ ব্যবহার করে প্রধান Ethereum চেইনে স্টেট ডেটা প্রকাশ করে। + +### ডেটা প্রাপ্যতা {#data-availability} + +উল্লিখিত হিসাবে, ভ্যালিডিয়ামগুলি একটি অফচেইন ডেটা প্রাপ্যতা মডেল ব্যবহার করে, যেখানে অপারেটররা Ethereum মেইননেটের বাইরে সমস্ত লেনদেন ডেটা সংরক্ষণ করে। ভ্যালিডিয়ামের কম অনচেইন ডেটা ফুটপ্রিন্ট স্কেলেবিলিটি উন্নত করে (থ্রুপুট Ethereum-এর ডেটা প্রক্রিয়াকরণ ক্ষমতা দ্বারা সীমাবদ্ধ নয়) এবং ব্যবহারকারীর ফি হ্রাস করে (অনচেইনে ডেটা প্রকাশের খরচ কম)। + +অফচেইন ডেটা প্রাপ্যতা, যাইহোক, একটি সমস্যা উপস্থাপন করে: মার্কেল প্রমাণ তৈরি বা যাচাই করার জন্য প্রয়োজনীয় ডেটা অনুপলব্ধ হতে পারে। এর মানে হল যে অপারেটররা দূষিতভাবে কাজ করলে ব্যবহারকারীরা অনচেইন চুক্তি থেকে তহবিল উত্তোলন করতে অক্ষম হতে পারে। + +বিভিন্ন ভ্যালিডিয়াম সমাধান স্টেট ডেটার স্টোরেজকে বিকেন্দ্রীকরণ করে এই সমস্যার সমাধান করার চেষ্টা করে। এর মধ্যে ব্লক প্রযোজকদের অন্তর্নিহিত ডেটা "ডেটা প্রাপ্যতা ব্যবস্থাপকদের" কাছে পাঠাতে বাধ্য করা জড়িত যারা অফচেইন ডেটা সংরক্ষণ এবং অনুরোধে ব্যবহারকারীদের জন্য উপলব্ধ করার জন্য দায়ী। + +ভ্যালিডিয়ামে ডেটা প্রাপ্যতা পরিচালকরা প্রতিটি ভ্যালিডিয়াম ব্যাচে স্বাক্ষর করে অফচেইন লেনদেনের জন্য ডেটার প্রাপ্যতা প্রত্যয়ন করে। এই স্বাক্ষরগুলি "প্রাপ্যতা প্রমাণ" এর একটি রূপ গঠন করে যা অনচেইন যাচাইকারী চুক্তি স্টেট আপডেট অনুমোদন করার আগে পরীক্ষা করে। + +ভ্যালিডিয়াম ডেটা প্রাপ্যতা ব্যবস্থাপনার ক্ষেত্রে তাদের দৃষ্টিভঙ্গিতে ভিন্ন। কেউ কেউ স্টেট ডেটা সংরক্ষণ করার জন্য বিশ্বস্ত পক্ষের উপর নির্ভর করে, অন্যরা এই কাজের জন্য এলোমেলোভাবে নির্ধারিত যাচাইকারীদের ব্যবহার করে। + +#### ডেটা প্রাপ্যতা কমিটি (DAC) {#data-availability-committee} + +অফচেইন ডেটার প্রাপ্যতা নিশ্চিত করতে, কিছু ভ্যালিডিয়াম সমাধান বিশ্বস্ত সত্তার একটি গ্রুপ নিয়োগ করে, যা সম্মিলিতভাবে ডেটা প্রাপ্যতা কমিটি (DAC) নামে পরিচিত, স্টেটের কপি সংরক্ষণ করতে এবং ডেটা প্রাপ্যতার প্রমাণ সরবরাহ করতে। DAC প্রয়োগ করা সহজ এবং কম সমন্বয়ের প্রয়োজন কারণ সদস্যপদ কম। + +যাইহোক, ব্যবহারকারীদের প্রয়োজন হলে ডেটা উপলব্ধ করার জন্য DAC-কে বিশ্বাস করতে হবে (যেমন, মার্কেল প্রমাণ তৈরি করার জন্য)। ডেটা প্রাপ্যতা কমিটির সদস্যদের [একজন দূষিত অভিনেতা দ্বারা আপোস করার](https://notes.ethereum.org/DD7GyItYQ02d0ax_X-UbWg?view) সম্ভাবনা রয়েছে যারা তখন অফচেইন ডেটা আটকে রাখতে পারে। + +[ভ্যালিডিয়ামে ডেটা প্রাপ্যতা কমিটি সম্পর্কে আরও জানুন](https://medium.com/starkware/data-availability-e5564c416424)। + +#### বন্ডেড ডেটা প্রাপ্যতা {#bonded-data-availability} + +অন্যান্য ভ্যালিডিয়ামগুলিতে অফলাইন ডেটা সংরক্ষণের দায়িত্বে থাকা অংশগ্রহণকারীদের তাদের ভূমিকা গ্রহণ করার আগে একটি স্মার্ট কন্ট্র্যাক্টে টোকেন স্টেক (অর্থাৎ, লক আপ) করতে হয়। এই স্টেক ডেটা প্রাপ্যতা পরিচালকদের মধ্যে সৎ আচরণের গ্যারান্টি দেওয়ার জন্য একটি "বন্ড" হিসাবে কাজ করে এবং বিশ্বাসের অনুমান হ্রাস করে। যদি এই অংশগ্রহণকারীরা ডেটার প্রাপ্যতা প্রমাণ করতে ব্যর্থ হয়, তাহলে বন্ডটি স্ল্যাশ করা হয়। + +একটি বন্ডেড ডেটা প্রাপ্যতা স্কিমে, যে কেউ প্রয়োজনীয় স্টেক প্রদান করার পরে অফচেইন ডেটা ধরে রাখার জন্য নির্ধারিত হতে পারে। এটি যোগ্য ডেটা প্রাপ্যতা পরিচালকদের পুলকে প্রসারিত করে, ডেটা প্রাপ্যতা কমিটি (DACs) কে প্রভাবিত করে এমন কেন্দ্রীকরণ হ্রাস করে। আরও গুরুত্বপূর্ণভাবে, এই পদ্ধতিটি দূষিত কার্যকলাপ প্রতিরোধ করার জন্য ক্রিপ্টোঅর্থনৈতিক প্রণোদনার উপর নির্ভর করে, যা ভ্যালিডিয়ামে অফলাইন ডেটা সুরক্ষিত করার জন্য বিশ্বস্ত পক্ষ নিয়োগের চেয়ে যথেষ্ট বেশি সুরক্ষিত। + +[ভ্যালিডিয়ামে বন্ডেড ডেটা প্রাপ্যতা সম্পর্কে আরও জানুন](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf)। + +## ভলিশন এবং ভ্যালিডিয়াম {#volitions-and-validium} + +ভ্যালিডিয়ামগুলি অনেক সুবিধা প্রদান করে তবে ট্রেড-অফের সাথে আসে (সবচেয়ে উল্লেখযোগ্যভাবে, ডেটা প্রাপ্যতা)। কিন্তু, অনেক স্কেলিং সমাধানের মতো, ভ্যালিডিয়ামগুলি নির্দিষ্ট ব্যবহারের ক্ষেত্রে উপযুক্ত—এই কারণেই ভলিশন তৈরি করা হয়েছিল। + +ভলিশন একটি ZK-রোলআপ এবং ভ্যালিডিয়াম চেইনকে একত্রিত করে এবং ব্যবহারকারীদের দুটি স্কেলিং সমাধানের মধ্যে স্যুইচ করার অনুমতি দেয়। ভলিশনগুলির সাথে, ব্যবহারকারীরা নির্দিষ্ট লেনদেনের জন্য ভ্যালিডিয়ামের অফচেইন ডেটা প্রাপ্যতার সুবিধা নিতে পারে, প্রয়োজনে একটি অনচেইন ডেটা প্রাপ্যতা সমাধানে (ZK-রোলআপ) স্যুইচ করার স্বাধীনতা বজায় রেখে। এটি মূলত ব্যবহারকারীদের তাদের অনন্য পরিস্থিতি দ্বারা নির্ধারিত ট্রেড-অফ বেছে নেওয়ার স্বাধীনতা দেয়। + +একটি বিকেন্দ্রীভূত এক্সচেঞ্জ (DEX) উচ্চ-মূল্যের ট্রেডের জন্য একটি ভ্যালিডিয়ামের স্কেলেবল এবং ব্যক্তিগত পরিকাঠামো ব্যবহার করতে পছন্দ করতে পারে। এটি এমন ব্যবহারকারীদের জন্য একটি ZK-রোলআপও ব্যবহার করতে পারে যারা একটি ZK-রোলআপের উচ্চতর নিরাপত্তা গ্যারান্টি এবং বিশ্বাসহীনতা চান। + +## ভ্যালিডিয়াম এবং EVM সামঞ্জস্যতা {#validiums-and-evm-compatibility} + +ZK-রোলআপের মতো, ভ্যালিডিয়ামগুলি বেশিরভাগই সাধারণ অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত, যেমন টোকেন সোয়াপ এবং অর্থপ্রদান। জিরো-নলেজ প্রমাণ সার্কিটে [EVM](/developers/docs/evm/) নির্দেশাবলী প্রমাণের যথেষ্ট ওভারহেডের কারণে ভ্যালিডিয়ামগুলির মধ্যে সাধারণ গণনা এবং স্মার্ট কন্ট্র্যাক্ট এক্সিকিউশন বাস্তবায়ন করা কঠিন। + +কিছু ভ্যালিডিয়াম প্রকল্প দক্ষ প্রমাণের জন্য অপ্টিমাইজ করা কাস্টম বাইটকোড তৈরি করে EVM-সামঞ্জস্যপূর্ণ ভাষা (যেমন, সলিডিটি, ভাইপার) কম্পাইল করে এই সমস্যাটিকে পাশ কাটিয়ে যাওয়ার চেষ্টা করে। এই পদ্ধতির একটি অসুবিধা হল যে নতুন জিরো-নলেজ প্রমাণ-বান্ধব VMগুলি গুরুত্বপূর্ণ EVM অপকোডগুলিকে সমর্থন নাও করতে পারে, এবং ডেভেলপারদের একটি সর্বোত্তম অভিজ্ঞতার জন্য সরাসরি উচ্চ-স্তরের ভাষায় লিখতে হবে। এটি আরও বেশি সমস্যা তৈরি করে: এটি ডেভেলপারদের একটি সম্পূর্ণ নতুন ডেভেলপমেন্ট স্ট্যাক দিয়ে ডিএ্যাপস তৈরি করতে বাধ্য করে এবং বর্তমান Ethereum পরিকাঠামোর সাথে সামঞ্জস্যতা ভঙ্গ করে। + +কিছু দল, যাইহোক, ZK-প্রমাণ সার্কিটের জন্য বিদ্যমান EVM অপকোডগুলিকে অপ্টিমাইজ করার চেষ্টা করছে। এর ফলে একটি জিরো-নলেজ Ethereum ভার্চুয়াল মেশিন (zkEVM) তৈরি হবে, যা একটি EVM-সামঞ্জস্যপূর্ণ VM যা প্রোগ্রামের সম্পাদনের সঠিকতা যাচাই করার জন্য প্রমাণ তৈরি করে। একটি zkEVM-এর সাথে, ভ্যালিডিয়াম চেইনগুলি অফচেইনে স্মার্ট কন্ট্র্যাক্ট সম্পাদন করতে পারে এবং Ethereum-এ একটি অফচেইন গণনা যাচাই করার জন্য বৈধতা প্রমাণ জমা দিতে পারে (এটি পুনরায় কার্যকর না করে)। + +[zkEVMs সম্পর্কে আরও জানুন](https://www.alchemy.com/overviews/zkevm)। + +## ভ্যালিডিয়ামগুলি কীভাবে Ethereum স্কেল করে? {#scaling-ethereum-with-validiums} + +### 1. অফচেইন ডেটা স্টোরেজ {#offchain-data-storage} + +লেয়ার 2 স্কেলিং প্রকল্প, যেমন অপ্টিমিস্টিক রোলআপ এবং ZK-রোলআপ, L1-এ কিছু লেনদেন ডেটা প্রকাশ করে নিরাপত্তার জন্য বিশুদ্ধ অফচেইন স্কেলিং প্রোটোকলের (যেমন, [প্লাজমা](/developers/docs/scaling/plasma/)) অসীম স্কেলেবিলিটি ট্রেড করে। কিন্তু এর মানে হল রোলআপের স্কেলেবিলিটি বৈশিষ্ট্যগুলি Ethereum মেইননেটে ডেটা ব্যান্ডউইথ দ্বারা সীমাবদ্ধ ([ডেটা শার্ডিং](/roadmap/danksharding/) এই কারণে Ethereum-এর ডেটা স্টোরেজ ক্ষমতা উন্নত করার প্রস্তাব করে)। + +ভ্যালিডিয়ামগুলি সমস্ত লেনদেন ডেটা অফচেইনে রেখে এবং প্রধান Ethereum চেইনে স্টেট আপডেট রিলে করার সময় শুধুমাত্র স্টেট প্রতিশ্রুতি (এবং বৈধতা প্রমাণ) পোস্ট করে স্কেলেবিলিটি অর্জন করে। বৈধতা প্রমাণের অস্তিত্ব, যাইহোক, প্লাজমা এবং [সাইডচেইন](/developers/docs/scaling/sidechains/) সহ অন্যান্য বিশুদ্ধ অফচেইন স্কেলিং সমাধানগুলির চেয়ে ভ্যালিডিয়ামকে উচ্চতর নিরাপত্তা গ্যারান্টি দেয়। অফচেইন লেনদেন যাচাই করার আগে Ethereum-কে যে পরিমাণ ডেটা প্রক্রিয়া করতে হয় তা হ্রাস করে, ভ্যালিডিয়াম ডিজাইনগুলি মেইননেটে থ্রুপুটকে ব্যাপকভাবে প্রসারিত করে। + +### 2. পুনরাবৃত্তিমূলক প্রমাণ {#recursive-proofs} + +একটি পুনরাবৃত্তিমূলক প্রমাণ হল একটি বৈধতা প্রমাণ যা অন্যান্য প্রমাণের বৈধতা যাচাই করে। এই "প্রুফের প্রমাণ" গুলি পুনরাবৃত্তিমূলকভাবে একাধিক প্রমাণ একত্রিত করে তৈরি করা হয় যতক্ষণ না সমস্ত পূর্ববর্তী প্রমাণ যাচাই করে একটি চূড়ান্ত প্রমাণ তৈরি হয়। পুনরাবৃত্তিমূলক প্রমাণগুলি প্রতি বৈধতা প্রমাণে যাচাই করা যায় এমন লেনদেনের সংখ্যা বাড়িয়ে ব্লকচেইন প্রক্রিয়াকরণের গতি স্কেল করে। + +সাধারণত, ভ্যালিডিয়াম অপারেটর যাচাইকরণের জন্য Ethereum-এ জমা দেওয়া প্রতিটি বৈধতা প্রমাণ একটি একক ব্লকের অখণ্ডতা যাচাই করে। যেখানে একটি একক পুনরাবৃত্তিমূলক প্রমাণ একই সময়ে বেশ কয়েকটি ভ্যালিডিয়াম ব্লকের বৈধতা নিশ্চিত করতে ব্যবহার করা যেতে পারে—এটি সম্ভব কারণ প্রমাণ সার্কিটটি পুনরাবৃত্তিমূলকভাবে বেশ কয়েকটি ব্লক প্রমাণকে একটি চূড়ান্ত প্রমাণে একত্রিত করতে পারে। যদি অনচেইন যাচাইকারী চুক্তি পুনরাবৃত্তিমূলক প্রমাণ গ্রহণ করে, তবে সমস্ত অন্তর্নিহিত ব্লক অবিলম্বে চূড়ান্ত করা হয়। + +## ভ্যালিডিয়ামের সুবিধা এবং অসুবিধা {#pros-and-cons-of-validium} + +| যেসব বিষয়ে এর সুফল পাওয়া যায় | কনস | +| --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| বৈধতা প্রমাণগুলি অফচেইন লেনদেনের অখণ্ডতা প্রয়োগ করে এবং অপারেটরদের অবৈধ স্টেট আপডেট চূড়ান্ত করা থেকে বিরত রাখে। | বৈধতা প্রমাণ তৈরির জন্য বিশেষ হার্ডওয়্যারের প্রয়োজন, যা একটি কেন্দ্রীকরণের ঝুঁকি তৈরি করে। | +| ব্যবহারকারীদের জন্য মূলধনের দক্ষতা বাড়ায় (Ethereum-এ তহবিল উত্তোলনে কোনো বিলম্ব নেই) | সাধারণ গণনা/স্মার্ট কন্ট্র্যাক্টের জন্য সীমিত সমর্থন; উন্নয়নের জন্য বিশেষ ভাষার প্রয়োজন। | +| উচ্চ-মূল্যের অ্যাপ্লিকেশনগুলিতে জালিয়াতি-প্রমাণ ভিত্তিক সিস্টেমগুলির দ্বারা সম্মুখীন হওয়া নির্দিষ্ট অর্থনৈতিক আক্রমণের জন্য ঝুঁকিপূর্ণ নয়। | ZK প্রমাণ তৈরি করতে উচ্চ কম্পিউটেশনাল শক্তি প্রয়োজন; কম থ্রুপুট অ্যাপ্লিকেশনের জন্য সাশ্রয়ী নয়। | +| Ethereum মেইননেটে কলডেটা পোস্ট না করে ব্যবহারকারীদের জন্য গ্যাস ফি কমায়। | ধীর বিষয়ভিত্তিক চূড়ান্ততার সময় (একটি ZK প্রমাণ তৈরি করতে 10-30 মিনিট) কিন্তু সম্পূর্ণ চূড়ান্ততায় দ্রুত কারণ কোনো বিরোধের সময় বিলম্ব নেই। | +| ট্রেডিং বা ব্লকচেইন গেমিংয়ের মতো নির্দিষ্ট ব্যবহারের ক্ষেত্রে উপযুক্ত, যা লেনদেনের গোপনীয়তা এবং স্কেলেবিলিটিকে অগ্রাধিকার দেয়। | ব্যবহারকারীদের তহবিল উত্তোলন থেকে বিরত রাখা যেতে পারে কারণ মালিকানার মার্কেল প্রমাণ তৈরির জন্য অফচেইন ডেটা সর্বদা উপলব্ধ থাকা প্রয়োজন। | +| অফচেইন ডেটা প্রাপ্যতা উচ্চ স্তরের থ্রুপুট প্রদান করে এবং স্কেলেবিলিটি বাড়ায়। | নিরাপত্তা মডেলটি বিশ্বাসের অনুমান এবং ক্রিপ্টোঅর্থনৈতিক প্রণোদনার উপর নির্ভর করে, ZK-রোলআপগুলির বিপরীতে, যা সম্পূর্ণরূপে ক্রিপ্টোগ্রাফিক নিরাপত্তা ব্যবস্থার উপর নির্ভর করে। | + +### ভ্যালিডিয়াম/ভলিশন ব্যবহার করুন {#use-validium-and-volitions} + +একাধিক প্রকল্প ভ্যালিডিয়াম এবং ভলিশনের বাস্তবায়ন প্রদান করে যা আপনি আপনার ডিএ্যাপসগুলিতে একীভূত করতে পারেন: + +**StarkWare StarkEx** - _StarkEx হল একটি Ethereum লেয়ার 2 (L2) স্কেলেবিলিটি সমাধান যা বৈধতা প্রমাণের উপর ভিত্তি করে। এটি ZK-রোলআপ বা ভ্যালিডিয়াম ডেটা-প্রাপ্যতা মোডে কাজ করতে পারে।_ + +- [নথিপত্র](https://docs.starkware.co/starkex-v4/starkex-deep-dive/data-availability-modes#validium) +- [ওয়েবসাইট](https://starkware.co/starkex/) + +**Matter Labs zkPorter**- _zkPorter একটি লেয়ার 2 স্কেলিং প্রোটোকল যা ডেটা প্রাপ্যতার সাথে মোকাবিলা করে একটি হাইব্রিড পদ্ধতির মাধ্যমে যা zkRollup এবং শার্ডিং-এর ধারণাগুলিকে একত্রিত করে। এটি নির্বিচারে অনেক শার্ড সমর্থন করতে পারে, প্রতিটির নিজস্ব ডেটা প্রাপ্যতা নীতি রয়েছে।_ + +- [ব্লগ](https://blog.matter-labs.io/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf) +- [নথিপত্র](https://docs.zksync.io/zksync-protocol/rollup/data-availability) +- [ওয়েবসাইট](https://zksync.io/) + +## আরও পড়ুন {#further-reading} + +- [ভ্যালিডিয়াম এবং লেয়ার 2 টু-বাই-টু — ইস্যু নং 99](https://www.buildblockchain.tech/newsletter/issues/no-99-validium-and-the-layer-2-two-by-two) +- [ZK-রোলআপ বনাম ভ্যালিডিয়াম](https://blog.matter-labs.io/zkrollup-vs-validium-starkex-5614e38bc263) +- [ভলিশন এবং উদীয়মান ডেটা প্রাপ্যতা স্পেকট্রাম](https://medium.com/starkware/volition-and-the-emerging-data-availability-spectrum-87e8bfa09bb) +- [রোলআপ, ভ্যালিডিয়াম এবং ভলিশন: হটেস্ট Ethereum স্কেলিং সলিউশন সম্পর্কে জানুন](https://www.defipulse.com/blog/rollups-validiums-and-volitions-learn-about-the-hottest-ethereum-scaling-solutions) +- [ইথেরিয়াম রোলআপের ব্যবহারিক নির্দেশিকা](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) diff --git a/public/content/translations/bn/developers/docs/scaling/zk-rollups/index.md b/public/content/translations/bn/developers/docs/scaling/zk-rollups/index.md new file mode 100644 index 00000000000..aa721cb336e --- /dev/null +++ b/public/content/translations/bn/developers/docs/scaling/zk-rollups/index.md @@ -0,0 +1,257 @@ +--- +title: "জিরো-নলেজ রোলআপস" +description: "জিরো-নলেজ রোলআপগুলির একটি ভূমিকা—ইথেরিয়াম কমিউনিটি দ্বারা ব্যবহৃত একটি স্কেলিং সমাধান।" +lang: bn +--- + +জিরো-নলেজ রোলআপস (ZK-rollups) হল লেয়ার 2 [স্কেলিং সলিউশন](/developers/docs/scaling/) যা ইথেরিয়াম মেইননেটে কম্পিউটেশন এবং স্টেট-স্টোরেজ অফচেইনে স্থানান্তরিত করার মাধ্যমে থ্রুপুট বৃদ্ধি করে। ZK-রোলআপস একটি ব্যাচে হাজার হাজার লেনদেন প্রক্রিয়া করতে পারে এবং তারপরে মেইননেটে শুধুমাত্র কিছু ন্যূনতম সারাংশ ডেটা পোস্ট করতে পারে। এই সারাংশ ডেটা ইথেরিয়াম স্টেটে যে পরিবর্তনগুলি করা উচিত তা সংজ্ঞায়িত করে এবং কিছু ক্রিপ্টোগ্রাফিক প্রমাণ যা নিশ্চিত করে যে সেই পরিবর্তনগুলি সঠিক। + +## পূর্বশর্ত {#prerequisites} + +আপনার [Ethereum স্কেলিং](/developers/docs/scaling/) এবং [লেয়ার 2](/layer-2) সম্পর্কিত আমাদের পৃষ্ঠাটি পড়া এবং বোঝা উচিত। + +## জিরো-নলেজ রোলআপস কি? {#what-are-zk-rollups} + +**জিরো-নলেজ রোলআপস (ZK-rollups)** লেনদেনগুলিকে ব্যাচে বান্ডিল (বা 'রোল আপ') করে যা অফচেইনে কার্যকর করা হয়। অফচেইন কম্পিউটেশন ব্লকচেইনে পোস্ট করা ডেটার পরিমাণ কমিয়ে দেয়। ZK-রোলআপ অপারেটররা প্রতিটি লেনদেন পৃথকভাবে পাঠানোর পরিবর্তে একটি ব্যাচের সমস্ত লেনদেন উপস্থাপন করার জন্য প্রয়োজনীয় পরিবর্তনগুলির একটি সারাংশ জমা দেয়। তারা তাদের পরিবর্তনের সঠিকতা প্রমাণ করার জন্য [ভ্যালিডিটি প্রুফ](/glossary/#validity-proof) তৈরি করে। + +ZK-রোলআপের স্টেট ইথেরিয়াম নেটওয়ার্কে ডিপ্লয় করা একটি স্মার্ট কন্ট্র্যাক্ট দ্বারা রক্ষণাবেক্ষণ করা হয়। এই স্টেট আপডেট করার জন্য, ZK-রোলআপ নোডগুলিকে যাচাইকরণের জন্য একটি ভ্যালিডিটি প্রুফ জমা দিতে হবে। উল্লিখিত হিসাবে, ভ্যালিডিটি প্রুফ হল একটি ক্রিপ্টোগ্রাফিক নিশ্চয়তা যে রোলআপ দ্বারা প্রস্তাবিত স্টেট-পরিবর্তনটি প্রদত্ত ব্যাচের লেনদেনগুলি কার্যকর করার প্রকৃত ফলাফল। এর মানে হল যে ZK-রোলআপসকে [অপ্টিমিস্টিক রোলআপস](/developers/docs/scaling/optimistic-rollups/) এর মতো সমস্ত লেনদেনের ডেটা অনচেইনে পোস্ট করার পরিবর্তে ইথেরিয়ামে লেনদেন চূড়ান্ত করার জন্য শুধুমাত্র ভ্যালিডিটি প্রুফ প্রদান করতে হবে। + +একটি ZK-রোলআপ থেকে ইথেরিয়ামে তহবিল স্থানান্তরের সময় কোন বিলম্ব হয় না কারণ ZK-রোলআপ কন্ট্র্যাক্ট ভ্যালিডিটি প্রুফ যাচাই করার পরেই এক্সিট লেনদেনগুলি কার্যকর করা হয়। বিপরীতে, অপ্টিমিস্টিক রোলআপগুলি থেকে তহবিল তোলার ক্ষেত্রে বিলম্ব হতে পারে যাতে যে কেউ একটি [ফ্রড প্রুফ](/glossary/#fraud-proof) দিয়ে এক্সিট লেনদেনকে চ্যালেঞ্জ করতে পারে। + +ZK-রোলআপস ইথেরিয়ামে `calldata` হিসাবে লেনদেন লেখে। স্মার্ট কন্ট্র্যাক্ট ফাংশনে এক্সটার্নাল কলে অন্তর্ভুক্ত ডেটা `calldata`-তে স্টোর করা হয়। `calldata`-তে থাকা তথ্য ব্লকচেইনে প্রকাশ করা হয়, যা যে কাউকে স্বাধীনভাবে রোলআপের স্টেট পুনর্গঠন করার অনুমতি দেয়। ZK-রোলআপস লেনদেনের ডেটা কমাতে কম্প্রেশন কৌশল ব্যবহার করে—উদাহরণস্বরূপ, অ্যাকাউন্টগুলিকে একটি অ্যাড্রেসের পরিবর্তে একটি ইনডেক্স দ্বারা উপস্থাপন করা হয়, যা 28 বাইট ডেটা সাশ্রয় করে। অনচেইন ডেটা প্রকাশনা রোলআপগুলির জন্য একটি উল্লেখযোগ্য ব্যয়, তাই ডেটা কম্প্রেশন ব্যবহারকারীদের জন্য ফি কমাতে পারে। + +## ZK-রোলআপস কীভাবে ইথেরিয়ামের সাথে ইন্টারঅ্যাক্ট করে? {#zk-rollups-and-ethereum} + +একটি ZK-রোলআপ চেইন একটি অফচেইন প্রোটোকল যা ইথেরিয়াম ব্লকচেইনের উপরে কাজ করে এবং অনচেইন ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট দ্বারা পরিচালিত হয়। ZK-রোলআপস মেইননেটের বাইরে লেনদেন কার্যকর করে, কিন্তু পর্যায়ক্রমে অফচেইন লেনদেনের ব্যাচগুলি একটি অনচেইন রোলআপ কন্ট্র্যাক্টে কমিট করে। এই লেনদেনের রেকর্ডটি ইথেরিয়াম ব্লকচেইনের মতোই অপরিবর্তনীয় এবং এটি ZK-রোলআপ চেইন গঠন করে। + +ZK-রোলআপের মূল আর্কিটেকচারটি নিম্নলিখিত উপাদানগুলি নিয়ে গঠিত: + +1. **অনচেইন কন্ট্র্যাক্ট**: যেমন উল্লেখ করা হয়েছে, ZK-রোলআপ প্রোটোকল ইথেরিয়ামে চলমান স্মার্ট কন্ট্র্যাক্ট দ্বারা নিয়ন্ত্রিত হয়। এর মধ্যে রয়েছে প্রধান কন্ট্র্যাক্ট যা রোলআপ ব্লক সঞ্চয় করে, ডিপোজিট ট্র্যাক করে এবং স্টেট আপডেটগুলি নিরীক্ষণ করে। অন্য একটি অনচেইন কন্ট্র্যাক্ট (ভেরিফায়ার কন্ট্র্যাক্ট) ব্লক প্রোডিউসারদের দ্বারা জমা দেওয়া জিরো-নলেজ প্রুফ যাচাই করে। এইভাবে, ইথেরিয়াম ZK-রোলআপের জন্য বেস লেয়ার বা "লেয়ার 1" হিসাবে কাজ করে। + +2. **অফচেইন ভার্চুয়াল মেশিন (VM)**: যদিও ZK-রোলআপ প্রোটোকল ইথেরিয়ামে থাকে, লেনদেন কার্যকর করা এবং স্টেট স্টোরেজ একটি পৃথক ভার্চুয়াল মেশিনে ঘটে যা [EVM](/developers/docs/evm/) থেকে স্বাধীন। এই অফচেইন VM টি ZK-রোলআপে লেনদেনের জন্য এক্সিকিউশন এনভায়রনমেন্ট এবং ZK-রোলআপ প্রোটোকলের জন্য সেকেন্ডারি লেয়ার বা "লেয়ার 2" হিসাবে কাজ করে। ইথেরিয়াম মেইননেটে যাচাইকৃত ভ্যালিডিটি প্রুফগুলি অফচেইন VM-এ স্টেট ট্রানজিশনের সঠিকতার গ্যারান্টি দেয়। + +ZK-রোলআপগুলি হল "হাইব্রিড স্কেলিং সমাধান"—অফচেইন প্রোটোকল যা স্বাধীনভাবে কাজ করে কিন্তু ইথেরিয়াম থেকে নিরাপত্তা অর্জন করে। বিশেষভাবে, ইথেরিয়াম নেটওয়ার্ক ZK-রোলআপে স্টেট আপডেটের বৈধতা প্রয়োগ করে এবং রোলআপের স্টেটের প্রতিটি আপডেটের পিছনে ডেটার প্রাপ্যতা নিশ্চিত করে। ফলস্বরূপ, ZK-রোলআপগুলি বিশুদ্ধ অফচেইন স্কেলিং সমাধানগুলির চেয়ে যথেষ্ট নিরাপদ, যেমন [সাইডচেইন](/developers/docs/scaling/sidechains/), যা তাদের নিরাপত্তা বৈশিষ্ট্যের জন্য দায়ী, বা [ভ্যালিডিয়াম](/developers/docs/scaling/validium/), যা ভ্যালিডিটি প্রুফ সহ ইথেরিয়ামে লেনদেন যাচাই করে, কিন্তু লেনদেনের ডেটা অন্য কোথাও সঞ্চয় করে। + +ZK-রোলআপস নিম্নলিখিতগুলির জন্য প্রধান ইথেরিয়াম প্রোটোকলের উপর নির্ভর করে: + +### ডেটা প্রাপ্যতা {#data-availability} + +ZK-রোলআপস অফচেইনে প্রক্রিয়া করা প্রতিটি লেনদেনের জন্য স্টেট ডেটা ইথেরিয়ামে প্রকাশ করে। এই ডেটা দিয়ে, ব্যক্তি বা ব্যবসার পক্ষে রোলআপের স্টেট পুনরুৎপাদন করা এবং নিজেরাই চেইনটি ভ্যালিডেট করা সম্ভব। ইথেরিয়াম এই ডেটা `calldata` হিসাবে নেটওয়ার্কের সমস্ত অংশগ্রহণকারীদের জন্য উপলব্ধ করে। + +ZK-রোলআপসকে অনচেইনে বেশি লেনদেনের ডেটা প্রকাশ করতে হয় না কারণ ভ্যালিডিটি প্রুফগুলি ইতিমধ্যেই স্টেট ট্রানজিশনের সত্যতা যাচাই করে। তবুও, অনচেইনে ডেটা সঞ্চয় করা এখনও গুরুত্বপূর্ণ কারণ এটি L2 চেইনের স্টেটের অনুমতিহীন, স্বাধীন যাচাইকরণের অনুমতি দেয় যা পরিবর্তে যে কাউকে লেনদেনের ব্যাচ জমা দেওয়ার অনুমতি দেয়, যা ক্ষতিকারক অপারেটরদের চেইন সেন্সর করা বা ফ্রিজ করা থেকে বাধা দেয়। + +রোলআপের সাথে ইন্টারঅ্যাক্ট করার জন্য ব্যবহারকারীদের জন্য অনচেইন প্রয়োজন। স্টেট ডেটাতে অ্যাক্সেস ছাড়া ব্যবহারকারীরা তাদের অ্যাকাউন্টের ব্যালেন্স জিজ্ঞাসা করতে বা স্টেট তথ্যের উপর নির্ভরশীল লেনদেন (যেমন, উইথড্রল) শুরু করতে পারে না। + +### লেনদেনের ফাইনালিটি {#transaction-finality} + +ইথেরিয়াম ZK-রোলআপগুলির জন্য একটি সেটেলমেন্ট লেয়ার হিসাবে কাজ করে: L2 লেনদেনগুলি তখনই চূড়ান্ত হয় যদি L1 কন্ট্র্যাক্ট ভ্যালিডিটি প্রুফ গ্রহণ করে। এটি ক্ষতিকারক অপারেটরদের চেইন নষ্ট করার ঝুঁকি (যেমন, রোলআপ তহবিল চুরি করা) দূর করে কারণ প্রতিটি লেনদেন অবশ্যই মেইননেটে অনুমোদিত হতে হবে। এছাড়াও, ইথেরিয়াম গ্যারান্টি দেয় যে ব্যবহারকারীর ক্রিয়াকলাপগুলি একবার L1-এ চূড়ান্ত হয়ে গেলে আর উল্টানো যাবে না। + +### সেন্সরশিপ প্রতিরোধ {#censorship-resistance} + +বেশিরভাগ ZK-রোলআপ লেনদেন কার্যকর করতে, ব্যাচ তৈরি করতে এবং L1-এ ব্লক জমা দিতে একটি "সুপারনোড" (অপারেটর) ব্যবহার করে। যদিও এটি দক্ষতা নিশ্চিত করে, এটি সেন্সরশিপের ঝুঁকি বাড়ায়: ক্ষতিকারক ZK-রোলআপ অপারেটররা ব্যবহারকারীদের লেনদেনগুলিকে ব্যাচে অন্তর্ভুক্ত করতে অস্বীকার করে তাদের সেন্সর করতে পারে। + +একটি নিরাপত্তা ব্যবস্থা হিসাবে, ZK-রোলআপগুলি ব্যবহারকারীদের সরাসরি মেইননেটে রোলআপ কন্ট্র্যাক্টে লেনদেন জমা দেওয়ার অনুমতি দেয় যদি তারা মনে করে যে তারা অপারেটর দ্বারা সেন্সর করা হচ্ছে। এটি ব্যবহারকারীদের অপারেটরের অনুমতির উপর নির্ভর না করে ZK-রোলআপ থেকে ইথেরিয়ামে একটি এক্সিট করতে বাধ্য করতে দেয়। + +## ZK-রোলআপস কীভাবে কাজ করে? {#how-do-zk-rollups-work} + +### লেনদেন {#transactions} + +ZK-রোলআপে ব্যবহারকারীরা লেনদেনে সাইন করে এবং প্রক্রিয়াকরণ এবং পরবর্তী ব্যাচে অন্তর্ভুক্তির জন্য L2 অপারেটরদের কাছে জমা দেয়। কিছু ক্ষেত্রে, অপারেটর একটি কেন্দ্রীভূত সত্তা, যাকে সিকোয়েন্সার বলা হয়, যে লেনদেন সম্পাদন করে, সেগুলোকে ব্যাচে একত্রিত করে এবং L1-এ জমা দেয়। এই সিস্টেমের সিকোয়েন্সারই একমাত্র সত্তা যা L2 ব্লক তৈরি করতে এবং ZK-রোলআপ কন্ট্র্যাক্টে রোলআপ লেনদেন যোগ করার অনুমতি পায়। + +অন্যান্য ZK-রোলআপগুলি একটি [প্রুফ-অফ-স্টেক](/developers/docs/consensus-mechanisms/pos/) ভ্যালিডেটর সেট ব্যবহার করে অপারেটরের ভূমিকা ঘোরাতে পারে। সম্ভাব্য অপারেটররা রোলআপ কন্ট্র্যাক্টে তহবিল জমা দেয়, প্রতিটি স্টেকের আকার স্টেকারের পরবর্তী রোলআপ ব্যাচ তৈরি করার জন্য নির্বাচিত হওয়ার সম্ভাবনাকে প্রভাবিত করে। অপারেটরের স্টেক স্ল্যাশ করা যেতে পারে যদি তারা দূষিতভাবে কাজ করে, যা তাদের বৈধ ব্লক পোস্ট করতে উৎসাহিত করে। + +#### কীভাবে ZK-রোলআপগুলি ইথেরিয়ামে লেনদেনের ডেটা প্রকাশ করে {#how-zk-rollups-publish-transaction-data-on-ethereum} + +যেমনটি ব্যাখ্যা করা হয়েছে, লেনদেনের ডেটা ইথেরিয়ামে `calldata` হিসাবে প্রকাশিত হয়। `calldata` হল একটি স্মার্ট কন্ট্র্যাক্টের একটি ডেটা ক্ষেত্র যা একটি ফাংশনে আর্গুমেন্ট পাস করতে ব্যবহৃত হয় এবং [মেমরি](/developers/docs/smart-contracts/anatomy/#memory)-এর মতো আচরণ করে। যদিও `calldata` ইথেরিয়ামের স্টেটের অংশ হিসেবে সংরক্ষিত হয় না, এটি ইথেরিয়াম চেইনের [হিস্ট্রি লগ](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html?highlight=memory#logs) এর অংশ হিসেবে অনচেইনে স্থায়ী থাকে। `calldata` ইথেরিয়ামের স্টেটকে প্রভাবিত করে না, যা এটিকে অনচেইনে ডেটা সংরক্ষণের একটি সস্তা উপায় করে তোলে। + +`calldata` কীওয়ার্ডটি প্রায়শই একটি লেনদেন দ্বারা কল করা স্মার্ট কন্ট্র্যাক্ট পদ্ধতিকে চিহ্নিত করে এবং পদ্ধতিটির ইনপুটগুলিকে একটি নির্বিচার বাইট সিকোয়েন্স আকারে ধারণ করে। ZK-রোলআপগুলি সংকুচিত লেনদেনের ডেটা অনচেইনে প্রকাশ করতে `calldata` ব্যবহার করে; রোলআপ অপারেটর কেবল রোলআপ কন্ট্র্যাক্টে প্রয়োজনীয় ফাংশন কল করে একটি নতুন ব্যাচ যোগ করে এবং সংকুচিত ডেটা ফাংশন আর্গুমেন্ট হিসাবে পাস করে। এটি ব্যবহারকারীদের জন্য খরচ কমাতে সাহায্য করে কারণ রোলআপ ফি-এর একটি বড় অংশ অনচেইনে লেনদেন ডেটা সংরক্ষণে যায়। + +### স্টেট কমিটমেন্ট {#state-commitments} + +ZK-রোলআপের স্টেট, যার মধ্যে L2 অ্যাকাউন্ট এবং ব্যালেন্স অন্তর্ভুক্ত, একটি [Merkle ট্রি](/whitepaper/#merkle-trees) হিসাবে উপস্থাপন করা হয়। Merkle ট্রির রুটের (Merkle রুট) একটি ক্রিপ্টোগ্রাফিক হ্যাশ অনচেইন কন্ট্র্যাক্টে সংরক্ষণ করা হয়, যা রোলআপ প্রোটোকলকে ZK-রোলআপের স্টেটের পরিবর্তনগুলি ট্র্যাক করার অনুমতি দেয়। + +রোলআপটি একটি নতুন সেট লেনদেন কার্যকর করার পরে একটি নতুন স্টেটে রূপান্তরিত হয়। যে অপারেটর স্টেট ট্রানজিশন শুরু করেছে তাকে একটি নতুন স্টেট রুট গণনা করতে হবে এবং অনচেইন কন্ট্র্যাক্টে জমা দিতে হবে। যদি ব্যাচের সাথে যুক্ত ভ্যালিডিটি প্রুফ ভেরিফায়ার কন্ট্র্যাক্ট দ্বারা প্রমাণীকৃত হয়, তবে নতুন Merkle রুটটি ZK-রোলআপের ক্যানোনিকাল স্টেট রুটে পরিণত হয়। + +স্টেট রুট গণনা করার পাশাপাশি, ZK-রোলআপ অপারেটর একটি ব্যাচ রুটও তৈরি করে—একটি Merkle ট্রির রুট যা একটি ব্যাচের সমস্ত লেনদেন নিয়ে গঠিত। যখন একটি নতুন ব্যাচ জমা দেওয়া হয়, তখন রোলআপ কন্ট্র্যাক্টটি ব্যাচ রুট সংরক্ষণ করে, যা ব্যবহারকারীদের একটি লেনদেন (যেমন, একটি উইথড্রয়াল অনুরোধ) ব্যাচে অন্তর্ভুক্ত ছিল তা প্রমাণ করতে দেয়। ব্যবহারকারীদের লেনদেনের বিবরণ, ব্যাচ রুট এবং অন্তর্ভুক্তি পথ দেখানো একটি [Merkle প্রুফ](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) প্রদান করতে হবে। + +### ভ্যালিডিটি প্রুফ {#validity-proofs} + +ZK-রোলআপ অপারেটর L1 কন্ট্র্যাক্টে যে নতুন স্টেট রুট জমা দেয় তা হল রোলআপের স্টেটের আপডেটের ফলাফল। ধরা যাক অ্যালিস ববকে 10টি টোকেন পাঠায়, অপারেটর কেবল অ্যালিসের ব্যালেন্স 10 কমিয়ে দেয় এবং ববের ব্যালেন্স 10 বাড়িয়ে দেয়। অপারেটর তারপর আপডেটেড অ্যাকাউন্টের ডেটা হ্যাশ করে, রোলআপের Merkle ট্রি পুনর্নির্মাণ করে, এবং নতুন Merkle রুটটি অনচেইন কন্ট্র্যাক্টে জমা দেয়। + +কিন্তু রোলআপ কন্ট্র্যাক্ট প্রস্তাবিত স্টেট কমিটমেন্টটি স্বয়ংক্রিয়ভাবে গ্রহণ করবে না যতক্ষণ না অপারেটর প্রমাণ করে যে নতুন Merkle রুটটি রোলআপের স্টেটে সঠিক আপডেটের ফলে হয়েছে। ZK-রোলআপ অপারেটর এটি একটি ভ্যালিডিটি প্রুফ তৈরি করে করে, যা একটি সংক্ষিপ্ত ক্রিপ্টোগ্রাফিক কমিটমেন্ট যা ব্যাচড লেনদেনের সঠিকতা যাচাই করে। + +ভ্যালিডিটি প্রুফগুলি পক্ষগুলিকে বিবৃতিটি প্রকাশ না করেই একটি বিবৃতির সঠিকতা প্রমাণ করার অনুমতি দেয়—তাই, এগুলিকে জিরো-নলেজ প্রুফও বলা হয়। ZK-রোলআপগুলি ইথেরিয়ামে লেনদেন পুনরায় কার্যকর না করেই অফচেইন স্টেট ট্রানজিশনের সঠিকতা নিশ্চিত করতে ভ্যালিডিটি প্রুফ ব্যবহার করে। এই প্রমাণগুলি একটি [ZK-SNARK](https://arxiv.org/abs/2202.06877) (জিরো-নলেজ সাক্সিন্ট নন-ইন্টারেক্টিভ আর্গুমেন্ট অফ নলেজ) বা [ZK-STARK](https://eprint.iacr.org/2018/046) (জিরো-নলেজ স্কেলেবল ট্রান্সপারেন্ট আর্গুমেন্ট অফ নলেজ) আকারে আসতে পারে। + +SNARKs এবং STARKs উভয়ই ZK-রোলআপগুলিতে অফচেইন গণনার অখণ্ডতা প্রমাণ করতে সাহায্য করে, যদিও প্রতিটি প্রুফের ধরনের স্বতন্ত্র বৈশিষ্ট্য রয়েছে। + +**ZK-SNARKs** + +ZK-SNARK প্রোটোকল কাজ করার জন্য, একটি কমন রেফারেন্স স্ট্রিং (CRS) তৈরি করা প্রয়োজন: CRS ভ্যালিডিটি প্রুফ প্রমাণ এবং যাচাই করার জন্য পাবলিক প্যারামিটার সরবরাহ করে। প্রুভিং সিস্টেমের নিরাপত্তা CRS সেটআপের উপর নির্ভর করে; যদি পাবলিক প্যারামিটার তৈরি করতে ব্যবহৃত তথ্য ক্ষতিকারক অভিনেতাদের দখলে চলে যায় তবে তারা মিথ্যা ভ্যালিডিটি প্রুফ তৈরি করতে সক্ষম হতে পারে। + +কিছু ZK-রোলআপ একটি [মাল্টি-পার্টি কম্পিউটেশন সেরেমনি (MPC)](https://zkproof.org/2021/06/30/setup-ceremonies/amp/) ব্যবহার করে এই সমস্যার সমাধান করার চেষ্টা করে, যেখানে বিশ্বস্ত ব্যক্তিরা ZK-SNARK সার্কিটের জন্য পাবলিক প্যারামিটার তৈরি করে। প্রতিটি পক্ষ CRS নির্মাণের জন্য কিছু র‍্যান্ডমনেস (যাকে "টক্সিক ওয়েস্ট" বলা হয়) অবদান রাখে, যা তাদের অবশ্যই অবিলম্বে ধ্বংস করতে হবে। + +ট্রাস্টেড সেটআপ ব্যবহার করা হয় কারণ তারা CRS সেটআপের নিরাপত্তা বাড়ায়। যতক্ষণ পর্যন্ত একজন সৎ অংশগ্রহণকারী তাদের ইনপুট ধ্বংস করে, ততক্ষণ ZK-SNARK সিস্টেমের নিরাপত্তা নিশ্চিত করা হয়। তবুও, এই পদ্ধতির জন্য জড়িতদের তাদের নমুনা র‍্যান্ডমনেস মুছে ফেলার উপর এবং সিস্টেমের নিরাপত্তা গ্যারান্টিকে দুর্বল না করার উপর বিশ্বাস রাখতে হয়। + +বিশ্বাসের অনুমান বাদ দিলে, ZK-SNARK গুলি তাদের ছোট প্রুফ সাইজ এবং কনস্ট্যান্ট-টাইম ভেরিফিকেশনের জন্য জনপ্রিয়। যেহেতু L1-এ প্রুফ ভেরিফিকেশন একটি ZK-রোলআপ পরিচালনার বৃহত্তর খরচ গঠন করে, L2 গুলি ZK-SNARK ব্যবহার করে এমন প্রুফ তৈরি করে যা মেইননেটে দ্রুত এবং সস্তায় যাচাই করা যায়। + +**ZK-STARKs** + +ZK-SNARKs-এর মতো, ZK-STARKs ইনপুট প্রকাশ না করেই অফচেইন গণনার বৈধতা প্রমাণ করে। যাইহোক, ZK-STARKs তাদের স্কেলেবিলিটি এবং স্বচ্ছতার কারণে ZK-SNARKs-এর উপর একটি উন্নতি হিসাবে বিবেচিত হয়। + +ZK-STARKs 'স্বচ্ছ', কারণ তারা কমন রেফারেন্স স্ট্রিং (CRS) এর বিশ্বস্ত সেটআপ ছাড়াই কাজ করতে পারে। এর পরিবর্তে, ZK-STARKs প্রমাণ তৈরি এবং যাচাই করার জন্য প্যারামিটার সেট আপ করতে সর্বজনীনভাবে যাচাইযোগ্য র‍্যান্ডমনেসের উপর নির্ভর করে। + +ZK-STARKs আরও বেশি স্কেলেবিলিটি প্রদান করে কারণ ভ্যালিডিটি প্রুফ প্রমাণ এবং যাচাই করার জন্য প্রয়োজনীয় সময় অন্তর্নিহিত গণনার জটিলতার সাথে _কোয়াসিলিনিয়ারলি_ বৃদ্ধি পায়। ZK-SNARKs-এর সাথে, প্রুভিং এবং ভেরিফিকেশন সময় অন্তর্নিহিত গণনার আকারের সাথে _লিনিয়ারলি_ স্কেল করে। এর মানে হল যখন বড় ডেটাসেট জড়িত থাকে তখন ZK-STARKs প্রুভিং এবং ভেরিফিকেশনের জন্য ZK-SNARKs-এর চেয়ে কম সময় নেয়, যা তাদের উচ্চ-ভলিউম অ্যাপ্লিকেশনের জন্য উপযোগী করে তোলে। + +ZK-STARKs কোয়ান্টাম কম্পিউটারের বিরুদ্ধেও সুরক্ষিত, যেখানে ZK-SNARKs-এ ব্যবহৃত এলিপটিক কার্ভ ক্রিপ্টোগ্রাফি (ECC) কোয়ান্টাম কম্পিউটিং আক্রমণের জন্য সংবেদনশীল বলে ব্যাপকভাবে বিশ্বাস করা হয়। ZK-STARKs-এর অসুবিধা হল যে তারা বড় প্রুফ সাইজ তৈরি করে, যা ইথেরিয়ামে যাচাই করা আরও ব্যয়বহুল। + +#### ZK-রোলআপগুলিতে ভ্যালিডিটি প্রুফগুলি কীভাবে কাজ করে? {#validity-proofs-in-zk-rollups} + +##### প্রুফ জেনারেশন + +লেনদেন গ্রহণ করার আগে, অপারেটর স্বাভাবিক চেকগুলি সম্পাদন করবে। এর মধ্যে রয়েছে নিশ্চিত করা: + +- প্রেরক এবং প্রাপকের অ্যাকাউন্টগুলি স্টেট ট্রি-এর অংশ। +- লেনদেন প্রক্রিয়া করার জন্য প্রেরকের কাছে পর্যাপ্ত তহবিল রয়েছে। +- লেনদেনটি সঠিক এবং রোলআপে প্রেরকের পাবলিক কী-এর সাথে মিলে যায়। +- প্রেরকের নন্স সঠিক, ইত্যাদি। + +একবার ZK-রোলআপ নোডে পর্যাপ্ত লেনদেন হয়ে গেলে, এটি সেগুলিকে একটি ব্যাচে একত্রিত করে এবং প্রুভিং সার্কিটের জন্য ইনপুট কম্পাইল করে একটি সংক্ষিপ্ত ZK-প্রুফে কম্পাইল করে। এর মধ্যে রয়েছে: + +- ব্যাচের সমস্ত লেনদেন নিয়ে গঠিত একটি Merkle ট্রি রুট। +- ব্যাচে অন্তর্ভুক্তি প্রমাণ করার জন্য লেনদেনের জন্য Merkle প্রুফ। +- লেনদেনের প্রতিটি প্রেরক-প্রাপক জোড়ার জন্য Merkle প্রুফ প্রমাণ করতে যে সেই অ্যাকাউন্টগুলি রোলআপের স্টেট ট্রি-এর অংশ। +- একটি সেট ইন্টারমিডিয়েট স্টেট রুট, প্রতিটি লেনদেনের জন্য স্টেট আপডেট প্রয়োগ করার পরে স্টেট রুট আপডেট করে প্রাপ্ত (যেমন, প্রেরকের অ্যাকাউন্ট কমানো এবং প্রাপকের অ্যাকাউন্ট বাড়ানো)। + +প্রুভিং সার্কিট প্রতিটি লেনদেনের উপর "লুপিং" করে ভ্যালিডিটি প্রুফ গণনা করে এবং লেনদেন প্রক্রিয়া করার আগে অপারেটরের করা একই চেক সম্পাদন করে। প্রথমে, এটি প্রদত্ত Merkle প্রুফ ব্যবহার করে যাচাই করে যে প্রেরকের অ্যাকাউন্টটি বিদ্যমান স্টেট রুটের অংশ। তারপর এটি প্রেরকের ব্যালেন্স কমায়, তাদের নন্স বাড়ায়, আপডেটেড অ্যাকাউন্টের ডেটা হ্যাশ করে এবং একটি নতুন Merkle রুট তৈরি করতে Merkle প্রুফের সাথে একত্রিত করে। + +এই Merkle রুটটি ZK-রোলআপের স্টেটের একমাত্র পরিবর্তনকে প্রতিফলিত করে: প্রেরকের ব্যালেন্স এবং নন্সের পরিবর্তন। এটি সম্ভব কারণ অ্যাকাউন্টের অস্তিত্ব প্রমাণ করতে ব্যবহৃত Merkle প্রুফটি নতুন স্টেট রুট বের করতে ব্যবহৃত হয়। + +প্রুভিং সার্কিট প্রাপকের অ্যাকাউন্টে একই প্রক্রিয়া সম্পাদন করে। এটি পরীক্ষা করে যে প্রাপকের অ্যাকাউন্টটি ইন্টারমিডিয়েট স্টেট রুটের অধীনে বিদ্যমান কিনা (Merkle প্রুফ ব্যবহার করে), তাদের ব্যালেন্স বাড়ায়, অ্যাকাউন্টের ডেটা পুনরায় হ্যাশ করে এবং একটি নতুন স্টেট রুট তৈরি করতে Merkle প্রুফের সাথে একত্রিত করে। + +প্রক্রিয়াটি প্রতিটি লেনদেনের জন্য পুনরাবৃত্তি হয়; প্রতিটি "লুপ" প্রেরকের অ্যাকাউন্ট আপডেট করে একটি নতুন স্টেট রুট তৈরি করে এবং প্রাপকের অ্যাকাউন্ট আপডেট করে একটি পরবর্তী নতুন রুট তৈরি করে। যেমন ব্যাখ্যা করা হয়েছে, স্টেট রুটের প্রতিটি আপডেট রোলআপের স্টেট ট্রি-এর একটি অংশের পরিবর্তনকে প্রতিনিধিত্ব করে। + +ZK-প্রুভিং সার্কিট পুরো লেনদেন ব্যাচের উপর পুনরাবৃত্তি করে, আপডেটের ক্রম যাচাই করে যা শেষ লেনদেন কার্যকর হওয়ার পরে একটি চূড়ান্ত স্টেট রুটের ফল দেয়। গণনাকৃত শেষ Merkle রুটটি ZK-রোলআপের নতুন ক্যানোনিকাল স্টেট রুটে পরিণত হয়। + +##### প্রুফ ভেরিফিকেশন + +প্রুভিং সার্কিট স্টেট আপডেটের সঠিকতা যাচাই করার পরে, L2 অপারেটর গণনাকৃত ভ্যালিডিটি প্রুফটি L1-এর ভেরিফায়ার কন্ট্র্যাক্টে জমা দেয়। কন্ট্র্যাক্টের ভেরিফিকেশন সার্কিট প্রুফের বৈধতা যাচাই করে এবং প্রুফের অংশ গঠনকারী পাবলিক ইনপুটগুলিও পরীক্ষা করে: + +- **প্রি-স্টেট রুট**: ZK-রোলআপের পুরানো স্টেট রুট (অর্থাৎ, ব্যাচড লেনদেন কার্যকর হওয়ার আগে), যা L2 চেইনের শেষ পরিচিত বৈধ স্টেটকে প্রতিফলিত করে। + +- **পোস্ট-স্টেট রুট**: ZK-রোলআপের নতুন স্টেট রুট (অর্থাৎ, ব্যাচড লেনদেন কার্যকর হওয়ার পরে), যা L2 চেইনের নতুন স্টেটকে প্রতিফলিত করে। পোস্ট-স্টেট রুট হল প্রুভিং সার্কিটে স্টেট আপডেট প্রয়োগ করার পরে প্রাপ্ত চূড়ান্ত রুট। + +- **ব্যাচ রুট**: ব্যাচের Merkle রুট, যা ব্যাচের লেনদেনগুলি _merklizing_ করে এবং ট্রি-এর রুট হ্যাশ করে প্রাপ্ত হয়। + +- **লেনদেন ইনপুট**: জমা দেওয়া ব্যাচের অংশ হিসাবে কার্যকর করা লেনদেনের সাথে যুক্ত ডেটা। + +যদি প্রুফটি সার্কিটকে সন্তুষ্ট করে (অর্থাৎ, এটি বৈধ), তবে এর মানে হল যে একটি বৈধ লেনদেনের ক্রম বিদ্যমান যা রোলআপটিকে পূর্ববর্তী স্টেট (প্রি-স্টেট রুট দ্বারা ক্রিপ্টোগ্রাফিকভাবে ফিঙ্গারপ্রিন্ট করা) থেকে একটি নতুন স্টেটে (পোস্ট-স্টেট রুট দ্বারা ক্রিপ্টোগ্রাফিকভাবে ফিঙ্গারপ্রিন্ট করা) রূপান্তরিত করে। যদি প্রি-স্টেট রুটটি রোলআপ কন্ট্র্যাক্টে সংরক্ষিত রুটের সাথে মিলে যায়, এবং প্রুফটি বৈধ হয়, তবে রোলআপ কন্ট্র্যাক্টটি প্রুফ থেকে পোস্ট-স্টেট রুট নেয় এবং রোলআপের পরিবর্তিত স্টেটকে প্রতিফলিত করতে তার স্টেট ট্রি আপডেট করে। + +### প্রবেশ এবং প্রস্থান {#entries-and-exits} + +ব্যবহারকারীরা L1 চেইনে ডিপ্লয় করা রোলআপের কন্ট্র্যাক্টে টোকেন জমা দিয়ে ZK-রোলআপে প্রবেশ করে। এই লেনদেনটি কিউতে থাকে কারণ শুধুমাত্র অপারেটররাই রোলআপ কন্ট্র্যাক্টে লেনদেন জমা দিতে পারে। + +যদি পেন্ডিং ডিপোজিট কিউ পূর্ণ হতে শুরু করে, ZK-রোলআপ অপারেটর ডিপোজিট লেনদেনগুলি নিয়ে রোলআপ কন্ট্র্যাক্টে জমা দেবে। একবার ব্যবহারকারীর তহবিল রোলআপে চলে গেলে, তারা প্রক্রিয়াকরণের জন্য অপারেটরের কাছে লেনদেন পাঠিয়ে লেনদেন শুরু করতে পারে। ব্যবহারকারীরা তাদের অ্যাকাউন্টের ডেটা হ্যাশ করে, হ্যাশটি রোলআপ কন্ট্র্যাক্টে পাঠিয়ে এবং বর্তমান স্টেট রুটের বিপরীতে যাচাই করার জন্য একটি Merkle প্রুফ প্রদান করে রোলআপে ব্যালেন্স যাচাই করতে পারে। + +একটি ZK-রোলআপ থেকে L1-এ উইথড্র করা সহজবোধ্য। ব্যবহারকারী রোলআপে তাদের সম্পদ বার্ন করার জন্য একটি নির্দিষ্ট অ্যাকাউন্টে পাঠিয়ে এক্সিট লেনদেন শুরু করে। যদি অপারেটর পরবর্তী ব্যাচে লেনদেনটি অন্তর্ভুক্ত করে, তবে ব্যবহারকারী অনচেইন কন্ট্র্যাক্টে একটি উইথড্রয়াল অনুরোধ জমা দিতে পারে। এই উইথড্রয়াল অনুরোধে নিম্নলিখিতগুলি অন্তর্ভুক্ত থাকবে: + +- Merkle প্রুফ যা একটি লেনদেন ব্যাচে বার্ন অ্যাকাউন্টে ব্যবহারকারীর লেনদেনের অন্তর্ভুক্তি প্রমাণ করে + +- লেনদেনের ডেটা + +- ব্যাচ রুট + +- ডিপোজিট করা তহবিল গ্রহণ করার জন্য L1 অ্যাড্রেস + +রোলআপ কন্ট্র্যাক্ট লেনদেনের ডেটা হ্যাশ করে, ব্যাচ রুট বিদ্যমান কিনা তা পরীক্ষা করে এবং লেনদেন হ্যাশটি ব্যাচ রুটের অংশ কিনা তা পরীক্ষা করতে Merkle প্রুফ ব্যবহার করে। এরপরে, কন্ট্র্যাক্টটি এক্সিট লেনদেন কার্যকর করে এবং ব্যবহারকারীর নির্বাচিত L1 অ্যাড্রেসে তহবিল পাঠায়। + +## ZK-রোলআপস এবং EVM সামঞ্জস্যতা {#zk-rollups-and-evm-compatibility} + +অপ্টিমিস্টিক রোলআপগুলির মতো নয়, ZK-রোলআপগুলি [ইথেরিয়াম ভার্চুয়াল মেশিন (EVM)](/developers/docs/evm/) এর সাথে সহজে সামঞ্জস্যপূর্ণ নয়। সার্কিটে সাধারণ-উদ্দেশ্যের EVM গণনা প্রমাণ করা সহজ গণনা (যেমন পূর্বে বর্ণিত টোকেন স্থানান্তর) প্রমাণ করার চেয়ে আরও কঠিন এবং সম্পদ-নিবিড়। + +যাইহোক, [জিরো-নলেজ প্রযুক্তিতে অগ্রগতি](https://hackmd.io/@yezhang/S1_KMMbGt#Why-possible-now) জিরো-নলেজ প্রুফে EVM গণনা মোড়ানোর বিষয়ে নতুন আগ্রহ জাগিয়ে তুলছে। এই প্রচেষ্টাগুলি একটি জিরো-নলেজ EVM (zkEVM) বাস্তবায়ন তৈরির দিকে পরিচালিত যা প্রোগ্রামের কার্যকরীকরণের সঠিকতা দক্ষতার সাথে যাচাই করতে পারে। একটি zkEVM সার্কিটে প্রমাণ/যাচাইকরণের জন্য বিদ্যমান EVM অপকোডগুলি পুনরায় তৈরি করে, যা স্মার্ট কন্ট্র্যাক্ট কার্যকর করার অনুমতি দেয়। + +EVM-এর মতো, কিছু ইনপুটে গণনা সম্পাদনের পরে একটি zkEVM স্টেটগুলির মধ্যে রূপান্তরিত হয়। পার্থক্য হল যে zkEVM প্রোগ্রামের কার্যকরীকরণের প্রতিটি পদক্ষেপের সঠিকতা যাচাই করতে জিরো-নলেজ প্রুফও তৈরি করে। ভ্যালিডিটি প্রুফগুলি VM-এর স্টেট (মেমরি, স্ট্যাক, স্টোরেজ) স্পর্শকারী ক্রিয়াকলাপের সঠিকতা এবং গণনা নিজেই যাচাই করতে পারে (অর্থাৎ, ক্রিয়াকলাপটি সঠিক অপকোড কল করেছে এবং সেগুলি সঠিকভাবে কার্যকর করেছে কিনা?)। + +EVM-সামঞ্জস্যপূর্ণ ZK-রোলআপগুলির প্রবর্তন ডেভেলপারদের জিরো-নলেজ প্রুফের স্কেলেবিলিটি এবং নিরাপত্তা গ্যারান্টিগুলির লিভারেজ নিতে সাহায্য করবে বলে আশা করা হচ্ছে। আরও গুরুত্বপূর্ণভাবে, নেটিভ ইথেরিয়াম পরিকাঠামোর সাথে সামঞ্জস্যতার মানে হল ডেভেলপাররা পরিচিত (এবং যুদ্ধ-পরীক্ষিত) টুলিং এবং ভাষা ব্যবহার করে ZK-বান্ধব ডিঅ্যাপস তৈরি করতে পারে। + +## ZK-রোলআপ ফি কীভাবে কাজ করে? {#how-do-zk-rollup-fees-work} + +ব্যবহারকারীরা ZK-রোলআপে লেনদেনের জন্য কত টাকা প্রদান করেন তা ইথেরিয়াম মেইননেটের মতোই গ্যাস ফি-এর উপর নির্ভরশীল। যাইহোক, গ্যাস ফি L2-তে ভিন্নভাবে কাজ করে এবং নিম্নলিখিত খরচ দ্বারা প্রভাবিত হয়: + +1. **স্টেট রাইট**: ইথেরিয়ামের স্টেটে লেখার জন্য একটি নির্দিষ্ট খরচ আছে (অর্থাৎ, ইথেরিয়াম ব্লকচেইনে একটি লেনদেন জমা দেওয়া)। ZK-রোলআপগুলি লেনদেন ব্যাচ করে এবং একাধিক ব্যবহারকারীর মধ্যে নির্দিষ্ট খরচ ছড়িয়ে দিয়ে এই খরচ কমায়। + +2. **ডেটা প্রকাশনা**: ZK-রোলআপগুলি প্রতিটি লেনদেনের জন্য স্টেট ডেটা `calldata` হিসাবে ইথেরিয়ামে প্রকাশ করে। `calldata` খরচ বর্তমানে [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) দ্বারা নিয়ন্ত্রিত হয়, যা `calldata`-এর নন-জিরো বাইটের জন্য 16 গ্যাস এবং জিরো বাইটের জন্য 4 গ্যাস খরচ নির্ধারণ করে। প্রতিটি লেনদেনের জন্য প্রদত্ত খরচটি প্রভাবিত হয় তার জন্য কতটা `calldata` অনচেইনে পোস্ট করতে হবে তার উপর। + +3. **L2 অপারেটর ফি**: এটি রোলআপ অপারেটরকে লেনদেন প্রক্রিয়াকরণে ব্যয়িত গণনামূলক খরচের ক্ষতিপূরণ হিসাবে প্রদত্ত পরিমাণ, অনেকটা ইথেরিয়াম মেইননেটে [লেনদেনের "অগ্রাধিকার ফি (টিপস)"](/developers/docs/gas/#how-are-gas-fees-calculated) এর মতো। + +4. **প্রুফ জেনারেশন এবং ভেরিফিকেশন**: ZK-রোলআপ অপারেটরদের লেনদেন ব্যাচের জন্য ভ্যালিডিটি প্রুফ তৈরি করতে হবে, যা সম্পদ-নিবিড়। মেইননেটে জিরো-নলেজ প্রুফ যাচাই করতেও গ্যাস খরচ হয় (~ 500,000 গ্যাস)। + +লেনদেন ব্যাচ করা ছাড়াও, ZK-রোলআপগুলি লেনদেনের ডেটা সংকুচিত করে ব্যবহারকারীদের জন্য ফি কমায়। আপনি ইথেরিয়াম ZK-রোলআপগুলি ব্যবহার করতে কত খরচ হয় তার একটি [রিয়েল-টাইম ওভারভিউ](https://l2fees.info/) দেখতে পারেন। + +## কীভাবে ZK-রোলআপগুলি ইথেরিয়াম স্কেল করে? {#scaling-ethereum-with-zk-rollups} + +### লেনদেন ডেটা কম্প্রেশন {#transaction-data-compression} + +ZK-রোলআপগুলি অফচেইনে গণনা নিয়ে ইথেরিয়ামের বেস লেয়ারে থ্রুপুট বাড়ায়, তবে স্কেলিংয়ের জন্য আসল বুস্টটি আসে লেনদেনের ডেটা সংকুচিত করা থেকে। ইথেরিয়ামের [ব্লক সাইজ](/developers/docs/blocks/#block-size) প্রতিটি ব্লকে থাকা ডেটার পরিমাণ এবং, ফলস্বরূপ, প্রতি ব্লকে প্রক্রিয়াকৃত লেনদেনের সংখ্যা সীমিত করে। লেনদেন-সম্পর্কিত ডেটা সংকুচিত করার মাধ্যমে, ZK-রোলআপগুলি প্রতি ব্লকে প্রক্রিয়াকৃত লেনদেনের সংখ্যা উল্লেখযোগ্যভাবে বাড়িয়ে দেয়। + +ZK-রোলআপগুলি অপ্টিমিস্টিক রোলআপগুলির চেয়ে ভালভাবে লেনদেনের ডেটা সংকুচিত করতে পারে কারণ তাদের প্রতিটি লেনদেন ভ্যালিডেট করার জন্য প্রয়োজনীয় সমস্ত ডেটা পোস্ট করতে হয় না। তাদের কেবল রোলআপে অ্যাকাউন্ট এবং ব্যালেন্সের সর্বশেষ স্টেট পুনর্নির্মাণের জন্য প্রয়োজনীয় ন্যূনতম ডেটা পোস্ট করতে হয়। + +### পুনরাবৃত্তিমূলক প্রমাণ {#recursive-proofs} + +জিরো-নলেজ প্রুফের একটি সুবিধা হল যে প্রুফগুলি অন্যান্য প্রুফ যাচাই করতে পারে। উদাহরণস্বরূপ, একটি একক ZK-SNARK অন্যান্য ZK-SNARK যাচাই করতে পারে। এই ধরনের "প্রুফ-অফ-প্রুফ" কে রিকারসিভ প্রুফ বলা হয় এবং এটি ZK-রোলআপে থ্রুপুট নাটকীয়ভাবে বাড়িয়ে দেয়। + +বর্তমানে, ভ্যালিডিটি প্রুফগুলি ব্লক-বাই-ব্লক ভিত্তিতে তৈরি করা হয় এবং যাচাইকরণের জন্য L1 কন্ট্র্যাক্টে জমা দেওয়া হয়। যাইহোক, একক ব্লক প্রুফ যাচাই করা ZK-রোলআপগুলির দ্বারা অর্জিত থ্রুপুটকে সীমিত করে কারণ অপারেটর একটি প্রুফ জমা দিলে কেবল একটি ব্লকই চূড়ান্ত করা যায়। + +তবে, রিকারসিভ প্রুফগুলি একটি ভ্যালিডিটি প্রুফ দিয়ে বেশ কয়েকটি ব্লক চূড়ান্ত করা সম্ভব করে। এর কারণ হল প্রুভিং সার্কিট রিকারসিভভাবে একাধিক ব্লক প্রুফ একত্রিত করে যতক্ষণ না একটি চূড়ান্ত প্রুফ তৈরি হয়। L2 অপারেটর এই রিকারসিভ প্রুফ জমা দেয়, এবং যদি কন্ট্র্যাক্টটি এটি গ্রহণ করে, তবে সমস্ত প্রাসঙ্গিক ব্লকগুলি অবিলম্বে চূড়ান্ত হয়ে যাবে। রিকারসিভ প্রুফের সাথে, ইথেরিয়ামে নির্দিষ্ট বিরতিতে চূড়ান্ত করা ZK-রোলআপ লেনদেনের সংখ্যা বৃদ্ধি পায়। + +### ZK-রোলআপের সুবিধা এবং অসুবিধা {#zk-rollups-pros-and-cons} + +| যেসব বিষয়ে এর সুফল পাওয়া যায় | কনস | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| ভ্যালিডিটি প্রুফগুলি অফচেইন লেনদেনের সঠিকতা নিশ্চিত করে এবং অপারেটরদের অবৈধ স্টেট ট্রানজিশন কার্যকর করা থেকে বিরত রাখে। | ভ্যালিডিটি প্রুফ গণনা এবং যাচাই করার সাথে যুক্ত খরচ যথেষ্ট এবং এটি রোলআপ ব্যবহারকারীদের জন্য ফি বাড়াতে পারে। | +| দ্রুত লেনদেনের ফাইনালিটি অফার করে কারণ L1-এ ভ্যালিডিটি প্রুফ যাচাই হয়ে গেলে স্টেট আপডেটগুলি অনুমোদিত হয়। | জিরো-নলেজ প্রযুক্তির জটিলতার কারণে EVM-সামঞ্জস্যপূর্ণ ZK-রোলআপ তৈরি করা কঠিন। | +| নিরাপত্তার জন্য বিশ্বাসহীন ক্রিপ্টোগ্রাফিক পদ্ধতির উপর নির্ভর করে, [অপ্টিমিস্টিক রোলআপ](/developers/docs/scaling/optimistic-rollups/#optimistic-pros-and-cons)-এর মতো উৎসাহিত অভিনেতাদের সততার উপর নয়। | ভ্যালিডিটি প্রুফ তৈরি করার জন্য বিশেষ হার্ডওয়্যার প্রয়োজন, যা কয়েকটি পক্ষের দ্বারা চেইনের কেন্দ্রীভূত নিয়ন্ত্রণকে উৎসাহিত করতে পারে। | +| অফচেইন স্টেট পুনরুদ্ধার করার জন্য প্রয়োজনীয় ডেটা L1-এ সঞ্চয় করে, যা নিরাপত্তা, সেন্সরশিপ-প্রতিরোধ এবং বিকেন্দ্রীকরণের গ্যারান্টি দেয়। | কেন্দ্রীভূত অপারেটররা (সিকোয়েন্সার) লেনদেনের ক্রমকে প্রভাবিত করতে পারে। | +| ব্যবহারকারীরা বৃহত্তর মূলধন দক্ষতা থেকে উপকৃত হন এবং বিলম্ব ছাড়াই L2 থেকে তহবিল তুলতে পারেন। | হার্ডওয়্যারের প্রয়োজনীয়তা অংশগ্রহণকারীদের সংখ্যা কমাতে পারে যারা চেইনকে অগ্রগতি করতে বাধ্য করতে পারে, যা ক্ষতিকারক অপারেটরদের রোলআপের স্টেট ফ্রিজ করা এবং ব্যবহারকারীদের সেন্সর করার ঝুঁকি বাড়ায়। | +| লাইভনেস অনুমানের উপর নির্ভর করে না এবং ব্যবহারকারীদের তাদের তহবিল রক্ষা করার জন্য চেইন ভ্যালিডেট করতে হয় না। | কিছু প্রুভিং সিস্টেমের (যেমন, ZK-SNARK) জন্য একটি বিশ্বস্ত সেটআপ প্রয়োজন যা, যদি ভুলভাবে পরিচালনা করা হয়, তবে একটি ZK-রোলআপের নিরাপত্তা মডেলকে সম্ভাব্যভাবে আপস করতে পারে। | +| উন্নত ডেটা কম্প্রেশন ইথেরিয়ামে `calldata` প্রকাশ করার খরচ কমাতে এবং ব্যবহারকারীদের জন্য রোলআপ ফি কমাতে সাহায্য করতে পারে। | | + +### ZK-রোলআপের একটি ভিজ্যুয়াল ব্যাখ্যা {#zk-video} + +Finematics কে ZK-রোলআপ ব্যাখ্যা করতে দেখুন: + + + +## কে একটি zkEVM-এ কাজ করছে? {#zkevm-projects} + +zkEVMs-এ কাজ করা প্রকল্পগুলির মধ্যে রয়েছে: + +- **[zkEVM](https://github.com/privacy-scaling-explorations/zkevm-specs)** - _zkEVM হল ইথেরিয়াম ফাউন্ডেশন দ্বারা অর্থায়ন করা একটি প্রকল্প যা একটি EVM-সামঞ্জস্যপূর্ণ ZK-রোলআপ এবং ইথেরিয়াম ব্লকের জন্য ভ্যালিডিটি প্রুফ তৈরির একটি প্রক্রিয়া তৈরি করার জন্য।_ + +- **[Polygon zkEVM](https://polygon.technology/solutions/polygon-zkevm)** - _একটি বিকেন্দ্রীভূত ZK রোলআপ ইথেরিয়াম মেইননেটে একটি জিরো-নলেজ ইথেরিয়াম ভার্চুয়াল মেশিন (zkEVM) নিয়ে কাজ করছে যা স্বচ্ছ উপায়ে ইথেরিয়াম লেনদেন সম্পাদন করে, যার মধ্যে রয়েছে জিরো-নলেজ-প্রুফ ভ্যালিডেশন সহ স্মার্ট কন্ট্র্যাক্ট।_ + +- **[Scroll](https://scroll.io/blog/zkEVM)** - _Scroll একটি প্রযুক্তি-চালিত কোম্পানি যা ইথেরিয়ামের জন্য একটি নেটিভ zkEVM লেয়ার 2 সমাধান তৈরির কাজ করছে।_ + +- **[Taiko](https://taiko.xyz)** - _Taiko একটি বিকেন্দ্রীভূত, ইথেরিয়াম-সমতুল্য ZK-রোলআপ (একটি [টাইপ 1 ZK-EVM](https://vitalik.eth.limo/general/2022/08/04/zkevm.html))।_ + +- **[ZKsync](https://docs.zksync.io/)** - _ZKsync Era হল Matter Labs দ্বারা নির্মিত একটি EVM-সামঞ্জস্যপূর্ণ ZK রোলআপ, যা নিজস্ব zkEVM দ্বারা চালিত।_ + +- **[Starknet](https://starkware.co/starknet/)** - _StarkNet হল StarkWare দ্বারা নির্মিত একটি EVM-সামঞ্জস্যপূর্ণ লেয়ার 2 স্কেলিং সমাধান।_ + +- **[Morph](https://www.morphl2.io/)** - _Morph হল একটি হাইব্রিড রোলআপ স্কেলিং সমাধান যা লেয়ার 2 স্টেট চ্যালেঞ্জ সমস্যার সমাধানের জন্য zk-প্রুফ ব্যবহার করে।_ + +- **[Linea](https://linea.build)** - _Linea হল Consensys দ্বারা নির্মিত একটি ইথেরিয়াম-সমতুল্য zkEVM লেয়ার 2, যা সম্পূর্ণরূপে ইথেরিয়াম ইকোসিস্টেমের সাথে সারিবদ্ধ।_ + +## ZK-রোলআপ পড়ার বিষয়ে আরও পড়ুন {#further-reading-on-zk-rollups} + +- [জিরো-নলেজ রোলআপস কি?](https://coinmarketcap.com/alexandria/glossary/zero-knowledge-rollups) +- [জিরো-নলেজ রোলআপস কি?](https://alchemy.com/blog/zero-knowledge-rollups) +- [Ethereum রোলআপগুলির জন্য ব্যবহারিক নির্দেশিকা](https://web.archive.org/web/20241108192208/https://research.2077.xyz/the-practical-guide-to-ethereum-rollups) +- [STARKs বনাম SNARKs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/) +- [zkEVM কি?](https://www.alchemy.com/overviews/zkevm) +- [ZK-EVM প্রকারগুলি: ইথেরিয়াম-সমতুল্য, EVM-সমতুল্য, টাইপ 1, টাইপ 4, এবং অন্যান্য ক্রিপ্টিক বাজওয়ার্ড](https://taiko.mirror.xyz/j6KgY8zbGTlTnHRFGW6ZLVPuT0IV0_KmgowgStpA0K4) +- [zkEVM-এর ভূমিকা](https://hackmd.io/@yezhang/S1_KMMbGt) +- [ZK-EVM L2 গুলি কী?](https://linea.mirror.xyz/qD18IaQ4BROn_Y40EBMTUTdJHYghUtdECscSWyMvm8M) +- [অসাধারণ-zkEVM রিসোর্স](https://github.com/LuozhuZhang/awesome-zkevm) +- [ZK-SNARKS আন্ডার দ্য হুড](https://vitalik.eth.limo/general/2017/02/01/zk_snarks.html) +- [SNARKs কীভাবে সম্ভব?](https://vitalik.eth.limo/general/2021/01/26/snarks.html) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/anatomy/index.md b/public/content/translations/bn/developers/docs/smart-contracts/anatomy/index.md new file mode 100644 index 00000000000..feed35981a0 --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/anatomy/index.md @@ -0,0 +1,657 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্টের অ্যানাটমি" +description: "একটি স্মার্ট কন্ট্রাক্টের অ্যানাটমির উপর একটি গভীর দৃষ্টিপাত – ফাংশন, ডেটা এবং ভেরিয়েবল।" +lang: bn +--- + +স্মার্ট কন্ট্র্যাক্ট হল এমন একটি প্রোগ্রাম যা Ethereum-এর একটি ঠিকানায় চলে। এগুলি ডেটা এবং ফাংশন দ্বারা গঠিত যা একটি লেনদেন পাওয়ার পরে এক্সিকিউট করতে পারে। এখানে একটি স্মার্ট কন্ট্র্যাক্ট কী দিয়ে তৈরি তার একটি ওভারভিউ দেওয়া হল। + +## পূর্বশর্ত {#prerequisites} + +প্রথমে আপনি [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) সম্পর্কে পড়েছেন তা নিশ্চিত করুন। এই ডকুমেন্টটি ধরে নিচ্ছে যে আপনি ইতিমধ্যে JavaScript বা Python-এর মতো প্রোগ্রামিং ভাষার সাথে পরিচিত। + +## ডেটা {#data} + +যেকোনো কন্ট্রাক্ট ডেটা অবশ্যই একটি অবস্থানে বরাদ্দ করতে হবে: হয় `storage`-এ বা `memory`-তে। একটি স্মার্ট কন্ট্র্যাক্টে সংগ্রহস্থল পরিবর্তন করা ব্যয়বহুল, তাই আপনার ডেটা কোথায় থাকবে তা আপনাকে বিবেচনা করতে হবে। + +### সংগ্রহস্থল {#storage} + +স্থায়ী ডেটাকে সংগ্রহস্থল হিসাবে উল্লেখ করা হয় এবং স্টেট ভেরিয়েবল দ্বারা উপস্থাপিত হয়। এই মানগুলি ব্লকচেইনে স্থায়ীভাবে সংরক্ষণ করা হয়। আপনাকে টাইপটি ডিক্লেয়ার করতে হবে যাতে কন্ট্রাক্টটি কম্পাইল করার সময় ব্লকচেইনে কতটা সংগ্রহস্থলের প্রয়োজন তা ট্র্যাক রাখতে পারে। + +```solidity +// সলিডিটি উদাহরণ +contract SimpleStorage { + uint storedData; // স্টেট ভেরিয়েবল + // ... +} +``` + +```python +# ভাইপার উদাহরণ +storedData: int128 +``` + +আপনি যদি আগে থেকেই অবজেক্ট-ওরিয়েন্টেড ভাষা প্রোগ্রাম করে থাকেন, তাহলে আপনি সম্ভবত বেশিরভাগ টাইপের সাথে পরিচিত হবেন। যাইহোক, আপনি যদি Ethereum ডেভেলপমেন্টে নতুন হন তবে `address` আপনার কাছে নতুন হওয়া উচিত। + +একটি `address` টাইপ একটি Ethereum ঠিকানা ধারণ করতে পারে যা 20 বাইট বা 160 বিটের সমান। এটি একটি অগ্রগামী 0x সহ হেক্সাডেসিমেল নোটেশনে রিটার্ন করে। + +অন্যান্য টাইপের মধ্যে রয়েছে: + +- বুলিয়ান +- পূর্ণসংখ্যা +- ফিক্সড পয়েন্ট সংখ্যা +- নির্দিষ্ট-আকারের বাইট অ্যারে +- ডাইনামিকভাবে আকারযুক্ত বাইট অ্যারে +- যৌক্তিক এবং পূর্ণসংখ্যা লিটারেল +- স্ট্রিং লিটারেল +- হেক্সাডেসিমেল লিটারেল +- এনুমস + +আরো ব্যাখ্যার জন্য, ডক্স দেখুন: + +- [Vyper টাইপ দেখুন](https://docs.vyperlang.org/en/v0.1.0-beta.6/types.html#value-types) +- [Solidity টাইপ দেখুন](https://docs.soliditylang.org/en/latest/types.html#value-types) + +### মেমরি {#memory} + +যে মানগুলি শুধুমাত্র একটি কন্ট্রাক্ট ফাংশনের এক্সিকিউশনের জীবনকালের জন্য সংরক্ষণ করা হয় তাকে মেমরি ভেরিয়েবল বলা হয়। যেহেতু এগুলি ব্লকচেইনে স্থায়ীভাবে সংরক্ষণ করা হয় না, তাই এগুলি ব্যবহার করা অনেক সস্তা। + +[Solidity ডক্স](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#storage-memory-and-the-stack)-এ EVM কীভাবে ডেটা (Storage, Memory, এবং Stack) স্টোর করে সে সম্পর্কে আরও জানুন। + +### এনভায়রনমেন্ট ভেরিয়েবল {#environment-variables} + +আপনার কন্ট্রাক্টে আপনি যে ভেরিয়েবলগুলি সংজ্ঞায়িত করেন সেগুলি ছাড়াও, কিছু বিশেষ গ্লোবাল ভেরিয়েবল রয়েছে। এগুলি প্রাথমিকভাবে ব্লকচেইন বা বর্তমান লেনদেন সম্পর্কে তথ্য প্রদানের জন্য ব্যবহৃত হয়। + +উদাহরণ: + +| **Prop** | **স্টেট ভেরিয়েবল** | **বিবরণ** | +| ----------------- | ------------------- | ---------------------------------------------- | +| `block.timestamp` | uint256 | বর্তমান ব্লক ইপক টাইমস্ট্যাম্প | +| `msg.sender` | address | বার্তার প্রেরক (বর্তমান কল) | + +## ফাংশন {#functions} + +সবচেয়ে সহজ ভাষায়, ফাংশনগুলি ইনকামিং লেনদেনের প্রতিক্রিয়া হিসাবে তথ্য পেতে বা সেট করতে পারে। + +দুই ধরনের ফাংশন কল আছে: + +- `internal` – এগুলি একটি EVM কল তৈরি করে না + - ইন্টারনাল ফাংশন এবং স্টেট ভেরিয়েবল শুধুমাত্র ইন্টারনালি অ্যাক্সেস করা যেতে পারে (যেমন, বর্তমান কন্ট্রাক্ট বা এটি থেকে প্রাপ্ত কন্ট্রাক্টের মধ্যে থেকে) +- `external` – এগুলি একটি EVM কল তৈরি করে + - এক্সটার্নাল ফাংশনগুলি কন্ট্রাক্ট ইন্টারফেসের অংশ, যার মানে হল সেগুলি অন্যান্য কন্ট্রাক্ট থেকে এবং লেনদেনের মাধ্যমে কল করা যেতে পারে। একটি এক্সটার্নাল ফাংশন `f` ইন্টারনালি কল করা যায় না (যেমন, `f()` কাজ করে না, কিন্তু `this.f()` কাজ করে)। + +এগুলি `public` বা `private`ও হতে পারে + +- `public` ফাংশনগুলি কন্ট্রাক্টের মধ্যে থেকে ইন্টারনালি বা মেসেজের মাধ্যমে এক্সটারনালি কল করা যেতে পারে +- `private` ফাংশনগুলি শুধুমাত্র সেই কন্ট্রাক্টের জন্য দৃশ্যমান যেখানে সেগুলি সংজ্ঞায়িত করা হয়েছে এবং প্রাপ্ত কন্ট্রাক্টে নয় + +ফাংশন এবং স্টেট ভেরিয়েবল উভয়ই পাবলিক বা প্রাইভেট করা যেতে পারে + +এখানে একটি কন্ট্রাক্টে একটি স্টেট ভেরিয়েবল আপডেট করার জন্য একটি ফাংশন দেওয়া হল: + +```solidity +// সলিডিটি উদাহরণ +function update_name(string value) public { + dapp_name = value; +} +``` + +- `string` টাইপের `value` প্যারামিটারটি `update_name` ফাংশনে পাস করা হয়েছে +- এটি `public` হিসাবে ডিক্লেয়ার করা হয়েছে, যার অর্থ যে কেউ এটি অ্যাক্সেস করতে পারে +- এটি `view` হিসাবে ডিক্লেয়ার করা হয়নি, তাই এটি কন্ট্রাক্টের স্টেট পরিবর্তন করতে পারে + +### ভিউ ফাংশন {#view-functions} + +এই ফাংশনগুলি কন্ট্রাক্টের ডেটার স্টেট পরিবর্তন না করার প্রতিশ্রুতি দেয়। সাধারণ উদাহরণ হল "গেটার" ফাংশন – উদাহরণস্বরূপ, আপনি এটি ব্যবহারকারীর ব্যালেন্স গ্রহণ করতে ব্যবহার করতে পারেন। + +```solidity +// সলিডিটি উদাহরণ +function balanceOf(address _owner) public view returns (uint256 _balance) { + return ownerPizzaCount[_owner]; +} +``` + +```python +dappName: public(string) + +@view +@public +def readName() -> string: + return dappName +``` + +স্টেট পরিবর্তন করা বলতে যা বোঝায়: + +1. স্টেট ভেরিয়েবলে লেখা। +2. [ইভেন্ট এমিট করা](https://docs.soliditylang.org/en/v0.7.0/contracts.html#events)। +3. [অন্যান্য কন্ট্রাক্ট তৈরি করা](https://docs.soliditylang.org/en/v0.7.0/control-structures.html#creating-contracts)। +4. `selfdestruct` ব্যবহার করা। +5. কলের মাধ্যমে ইথার পাঠানো। +6. `view` বা `pure` হিসাবে চিহ্নিত নয় এমন কোনো ফাংশন কল করা। +7. নিম্ন-স্তরের কল ব্যবহার করা। +8. ইনলাইন অ্যাসেম্বলি ব্যবহার করা যাতে নির্দিষ্ট অপকোড থাকে। + +### কনস্ট্রাক্টর ফাংশন {#constructor-functions} + +`constructor` ফাংশনগুলি শুধুমাত্র একবার এক্সিকিউট করা হয় যখন কন্ট্রাক্টটি প্রথমবার ডেপ্লয় করা হয়। অনেক ক্লাস-ভিত্তিক প্রোগ্রামিং ভাষার `constructor`-এর মতো, এই ফাংশনগুলি প্রায়শই স্টেট ভেরিয়েবলগুলিকে তাদের নির্দিষ্ট মানগুলিতে ইনিশিয়ালাইজ করে। + +```solidity +// সলিডিটি উদাহরণ +// কন্ট্রাক্টের ডেটা ইনিশিয়ালাইজ করে, `owner`-কে +// কন্ট্রাক্ট নির্মাতার ঠিকানায় সেট করে। +constructor() public { + // সমস্ত স্মার্ট কন্ট্র্যাক্ট তার ফাংশন ট্রিগার করতে এক্সটার্নাল লেনদেনের উপর নির্ভর করে। + // `msg` একটি গ্লোবাল ভেরিয়েবল যা প্রদত্ত লেনদেনের প্রাসঙ্গিক ডেটা অন্তর্ভুক্ত করে, + // যেমন প্রেরকের ঠিকানা এবং লেনদেনে অন্তর্ভুক্ত ETH মান। + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + owner = msg.sender; +} +``` + +```python +# ভাইপার উদাহরণ + +@external +def __init__(_beneficiary: address, _bidding_time: uint256): + self.beneficiary = _beneficiary + self.auctionStart = block.timestamp + self.auctionEnd = self.auctionStart + _bidding_time +``` + +### অন্তর্নির্মিত ফাংশন {#built-in-functions} + +আপনার কন্ট্রাক্টে আপনি যে ভেরিয়েবল এবং ফাংশনগুলি সংজ্ঞায়িত করেন সেগুলি ছাড়াও, কিছু বিশেষ অন্তর্নির্মিত ফাংশন রয়েছে। সবচেয়ে সুস্পষ্ট উদাহরণ হল: + +- `address.send()` – Solidity +- `send(address)` – Vyper + +এগুলি কন্ট্রাক্টগুলিকে অন্য অ্যাকাউন্টে ETH পাঠাতে দেয়। + +## ফাংশন লেখা {#writing-functions} + +আপনার ফাংশনের প্রয়োজন: + +- প্যারামিটার ভেরিয়েবল এবং টাইপ (যদি এটি প্যারামিটার গ্রহণ করে) +- ইন্টারনাল/এক্সটার্নাল ডিক্লেয়ারেশন +- pure/view/payable-এর ডিক্লেয়ারেশন +- রিটার্নস টাইপ (যদি এটি একটি মান রিটার্ন করে) + +```solidity +pragma solidity >=0.4.0 <=0.6.0; + +contract ExampleDapp { + string dapp_name; // স্টেট ভেরিয়েবল + + // কন্ট্রাক্টটি ডেপ্লয় করার সময় কল করা হয় এবং মানটি ইনিশিয়ালাইজ করে + constructor() public { + dapp_name = "My Example dapp"; + } + + // গেট ফাংশন + function read_name() public view returns(string) { + return dapp_name; + } + + // সেট ফাংশন + function update_name(string value) public { + dapp_name = value; + } +} +``` + +একটি সম্পূর্ণ কন্ট্রাক্ট দেখতে এরকম হতে পারে। এখানে `constructor` ফাংশন `dapp_name` ভেরিয়েবলের জন্য একটি প্রাথমিক মান প্রদান করে। + +## ইভেন্ট এবং লগ {#events-and-logs} + +ইভেন্টগুলি আপনার স্মার্ট কন্ট্র্যাক্টকে আপনার ফ্রন্টএন্ড বা অন্যান্য সাবস্ক্রাইবিং অ্যাপ্লিকেশনের সাথে যোগাযোগ করতে সক্ষম করে। একবার একটি লেনদেন যাচাই এবং একটি ব্লকে যোগ করা হলে, স্মার্ট কন্ট্র্যাক্টগুলি ইভেন্ট এবং লগ তথ্য এমিট করতে পারে, যা ফ্রন্টএন্ড তখন প্রক্রিয়া এবং ব্যবহার করতে পারে। + +## টিকাসহ উদাহরণ {#annotated-examples} + +এইগুলি হল Solidity-তে লেখা কিছু উদাহরণ। আপনি যদি কোডটি নিয়ে খেলতে চান, তাহলে আপনি [Remix](http://remix.ethereum.org)-এ তাদের সাথে ইন্টারঅ্যাক্ট করতে পারেন। + +### হ্যালো ওয়ার্ল্ড {#hello-world} + +```solidity +// সেমান্টিক ভার্শনিং ব্যবহার করে Solidity-এর সংস্করণ নির্দিষ্ট করে। +// আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.5.10; + +// `HelloWorld` নামের একটি কন্ট্রাক্ট সংজ্ঞায়িত করে। +// একটি কন্ট্রাক্ট হল ফাংশন এবং ডেটার (তার স্টেট) একটি সংগ্রহ। +// একবার ডেপ্লয় করা হলে, একটি কন্ট্রাক্ট Ethereum ব্লকচেইনের একটি নির্দিষ্ট ঠিকানায় থাকে। +// আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + // `string` টাইপের একটি স্টেট ভেরিয়েবল `message` ডিক্লেয়ার করে। + // স্টেট ভেরিয়েবল হল এমন ভেরিয়েবল যার মান স্থায়ীভাবে কন্ট্রাক্টের সংগ্রহস্থলে সংরক্ষণ করা হয়। + // `public` কীওয়ার্ডটি একটি কন্ট্রাক্টের বাইরে থেকে ভেরিয়েবলগুলিকে অ্যাক্সেসযোগ্য করে তোলে + // এবং একটি ফাংশন তৈরি করে যা অন্য কন্ট্রাক্ট বা ক্লায়েন্টরা মান অ্যাক্সেস করার জন্য কল করতে পারে। + string public message; + + // অনেক ক্লাস-ভিত্তিক অবজেক্ট-ওরিয়েন্টেড ভাষার মতো, একটি কনস্ট্রাক্টর হল + // একটি বিশেষ ফাংশন যা শুধুমাত্র কন্ট্রাক্ট তৈরির সময় এক্সিকিউট করা হয়। + // কনস্ট্রাক্টরগুলি কন্ট্রাক্টের ডেটা ইনিশিয়ালাইজ করতে ব্যবহৃত হয়। + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) public { + // একটি স্ট্রিং আর্গুমেন্ট `initMessage` গ্রহণ করে এবং মানটি সেট করে + // কন্ট্রাক্টের `message` সংগ্রহস্থল ভেরিয়েবলে)। + message = initMessage; + } + + // একটি পাবলিক ফাংশন যা একটি স্ট্রিং আর্গুমেন্ট গ্রহণ করে + // এবং `message` সংগ্রহস্থল ভেরিয়েবল আপডেট করে। + function update(string memory newMessage) public { + message = newMessage; + } +} +``` + +### টোকেন {#token} + +```solidity +pragma solidity ^0.5.10; + +contract Token { + // একটি `address` একটি ইমেল ঠিকানার সাথে তুলনীয় - এটি Ethereum-এ একটি অ্যাকাউন্ট শনাক্ত করতে ব্যবহৃত হয়। + // ঠিকানাগুলি একটি স্মার্ট কন্ট্র্যাক্ট বা একটি এক্সটার্নাল (ব্যবহারকারী) অ্যাকাউন্টকে প্রতিনিধিত্ব করতে পারে। + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/types.html#address + address public owner; + + // একটি `mapping` মূলত একটি হ্যাস টেবিল ডেটা স্ট্রাকচার। + // এই `mapping` একটি আনসাইন্ড ইন্টিজার (টোকেন ব্যালেন্স) একটি ঠিকানায় (টোকেন হোল্ডার) বরাদ্দ করে। + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/types.html#mapping-types + mapping (address => uint) public balances; + + // ইভেন্টগুলি ব্লকচেইনে কার্যকলাপ লগ করার অনুমতি দেয়। + // Ethereum ক্লায়েন্টরা কন্ট্রাক্ট স্টেট পরিবর্তনের প্রতিক্রিয়া জানাতে ইভেন্ট শুনতে পারে। + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#events + event Transfer(address from, address to, uint amount); + + // কন্ট্রাক্টের ডেটা ইনিশিয়ালাইজ করে, `owner`-কে + // কন্ট্রাক্ট নির্মাতার ঠিকানায় সেট করে। + constructor() public { + // সমস্ত স্মার্ট কন্ট্র্যাক্ট তার ফাংশন ট্রিগার করতে এক্সটার্নাল লেনদেনের উপর নির্ভর করে। + // `msg` একটি গ্লোবাল ভেরিয়েবল যা প্রদত্ত লেনদেনের প্রাসঙ্গিক ডেটা অন্তর্ভুক্ত করে, + // যেমন প্রেরকের ঠিকানা এবং লেনদেনে অন্তর্ভুক্ত ETH মান। + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/units-and-global-variables.html#block-and-transaction-properties + owner = msg.sender; + } + + // নতুন টোকেনের একটি পরিমাণ তৈরি করে এবং সেগুলিকে একটি ঠিকানায় পাঠায়। + function mint(address receiver, uint amount) public { + // `require` একটি নিয়ন্ত্রণ কাঠামো যা নির্দিষ্ট শর্ত প্রয়োগ করতে ব্যবহৃত হয়। + // যদি একটি `require` স্টেটমেন্ট `false` হিসাবে মূল্যায়ন করে, একটি ব্যতিক্রম ট্রিগার হয়, + // যা বর্তমান কলের সময় স্টেটে করা সমস্ত পরিবর্তন ফিরিয়ে দেয়। + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions + + // শুধুমাত্র কন্ট্রাক্টের মালিক এই ফাংশনটি কল করতে পারেন + require(msg.sender == owner, "আপনি মালিক নন।"); + + // টোকেনের সর্বোচ্চ পরিমাণ প্রয়োগ করে + require(amount < 1e60, "সর্বোচ্চ ইস্যুয়েন্স অতিক্রম করেছে"); + + // `receiver`-এর ব্যালেন্স `amount` দ্বারা বৃদ্ধি করে + balances[receiver] += amount; + } + + // যেকোনো কলার থেকে একটি ঠিকানায় বিদ্যমান টোকেনের একটি পরিমাণ পাঠায়। + function transfer(address receiver, uint amount) public { + // প্রেরকের পাঠানোর জন্য যথেষ্ট টোকেন থাকতে হবে + require(amount <= balances[msg.sender], "অপর্যাপ্ত ব্যালেন্স।"); + + // দুটি ঠিকানার টোকেন ব্যালেন্স সামঞ্জস্য করে + balances[msg.sender] -= amount; + balances[receiver] += amount; + + // পূর্বে সংজ্ঞায়িত ইভেন্ট এমিট করে + emit Transfer(msg.sender, receiver, amount); + } +} +``` + +### অনন্য ডিজিটাল সম্পদ {#unique-digital-asset} + +```solidity +pragma solidity ^0.5.10; + +// বর্তমান কন্ট্রাক্টে অন্যান্য ফাইল থেকে প্রতীক ইম্পোর্ট করে। +// এই ক্ষেত্রে, OpenZeppelin থেকে হেল্পার কন্ট্রাক্টের একটি সিরিজ। +// আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#importing-other-source-files + +import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import "../node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; +import "../node_modules/@openzeppelin/contracts/introspection/ERC165.sol"; +import "../node_modules/@openzeppelin/contracts/math/SafeMath.sol"; + +// `is` কীওয়ার্ডটি এক্সটার্নাল কন্ট্রাক্ট থেকে ফাংশন এবং কীওয়ার্ড উত্তরাধিকার সূত্রে পেতে ব্যবহৃত হয়। +// এই ক্ষেত্রে, `CryptoPizza` `IERC721` এবং `ERC165` কন্ট্রাক্ট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। +// আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#inheritance +contract CryptoPizza is IERC721, ERC165 { + // নিরাপদে গাণিতিক ক্রিয়াকলাপ সম্পাদনের জন্য OpenZeppelin-এর SafeMath লাইব্রেরি ব্যবহার করে। + // আরও জানুন: https://docs.openzeppelin.com/contracts/2.x/api/math#SafeMath + using SafeMath for uint256; + + // সলিডিটিতে ধ্রুবক স্টেট ভেরিয়েবলগুলি অন্যান্য ভাষার মতোই + // কিন্তু আপনাকে অবশ্যই একটি এক্সপ্রেশন থেকে বরাদ্দ করতে হবে যা কম্পাইলের সময় ধ্রুবক। + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constant-state-variables + uint256 constant dnaDigits = 10; + uint256 constant dnaModulus = 10 ** dnaDigits; + bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; + + // স্ট্রাক্ট টাইপ আপনাকে আপনার নিজের টাইপ সংজ্ঞায়িত করতে দেয় + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/types.html#structs + struct Pizza { + string name; + uint256 dna; + } + + // পিৎজা স্ট্রাক্টের একটি খালি অ্যারে তৈরি করে + Pizza[] public pizzas; + + // পিৎজা আইডি থেকে তার মালিকের ঠিকানায় ম্যাপিং + mapping(uint256 => address) public pizzaToOwner; + + // মালিকের ঠিকানা থেকে মালিকানাধীন টোকেনের সংখ্যায় ম্যাপিং + mapping(address => uint256) public ownerPizzaCount; + + // টোকেন আইডি থেকে অনুমোদিত ঠিকানায় ম্যাপিং + mapping(uint256 => address) pizzaApprovals; + + // আপনি ম্যাপিং নেস্ট করতে পারেন, এই উদাহরণটি অপারেটর অনুমোদনের জন্য মালিককে ম্যাপ করে + mapping(address => mapping(address => bool)) private operatorApprovals; + + // স্ট্রিং (নাম) এবং ডিএনএ থেকে একটি র‍্যান্ডম পিৎজা তৈরি করার জন্য ইন্টারনাল ফাংশন + function _createPizza(string memory _name, uint256 _dna) + // `internal` কীওয়ার্ডটির অর্থ হল এই ফাংশনটি শুধুমাত্র দৃশ্যমান + // এই কন্ট্রাক্ট এবং এই কন্ট্রাক্ট থেকে প্রাপ্ত কন্ট্রাক্টের মধ্যে + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#visibility-and-getters + internal + // `isUnique` একটি ফাংশন মডিফায়ার যা পিৎজা আগে থেকেই বিদ্যমান কিনা তা পরীক্ষা করে + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html#function-modifiers + isUnique(_name, _dna) + { + // পিৎজাকে পিৎজার অ্যারেতে যোগ করে এবং আইডি পায় + uint256 id = SafeMath.sub(pizzas.push(Pizza(_name, _dna)), 1); + + // পিৎজার মালিক বর্তমান ব্যবহারকারীর সমান কিনা তা পরীক্ষা করে + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/control-structures.html#error-handling-assert-require-revert-and-exceptions + + // মনে রাখবেন যে address(0) হল শূন্য ঠিকানা, + // যা নির্দেশ করে যে pizza[id] এখনও কোনো নির্দিষ্ট ব্যবহারকারীকে বরাদ্দ করা হয়নি। + + assert(pizzaToOwner[id] == address(0)); + + // পিৎজাকে মালিকের সাথে ম্যাপ করে + pizzaToOwner[id] = msg.sender; + ownerPizzaCount[msg.sender] = SafeMath.add( + ownerPizzaCount[msg.sender], + 1 + ); + } + + // স্ট্রিং (নাম) থেকে একটি র‍্যান্ডম পিৎজা তৈরি করে + function createRandomPizza(string memory _name) public { + uint256 randDna = generateRandomDna(_name, msg.sender); + _createPizza(_name, randDna); + } + + // স্ট্রিং (নাম) এবং মালিকের (নির্মাতা) ঠিকানা থেকে র‍্যান্ডম ডিএনএ তৈরি করে + function generateRandomDna(string memory _str, address _owner) + public + // `pure` হিসাবে চিহ্নিত ফাংশনগুলি স্টেট থেকে পড়া বা পরিবর্তন না করার প্রতিশ্রুতি দেয় + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#pure-functions + pure + returns (uint256) + { + // স্ট্রিং (নাম) + ঠিকানা (মালিক) থেকে র‍্যান্ডম ইউইন্ট তৈরি করে + uint256 rand = uint256(keccak256(abi.encodePacked(_str))) + + uint256(_owner); + rand = rand % dnaModulus; + return rand; + } + + // মালিক দ্বারা পাওয়া পিৎজার অ্যারে রিটার্ন করে + function getPizzasByOwner(address _owner) + public + // `view` হিসাবে চিহ্নিত ফাংশনগুলি স্টেট পরিবর্তন না করার প্রতিশ্রুতি দেয় + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/contracts.html#view-functions + view + returns (uint256[] memory) + { + // শুধুমাত্র এই ফাংশন কলের জীবনচক্রের জন্য মান সঞ্চয় করতে `memory` সংগ্রহস্থল অবস্থান ব্যবহার করে। + // আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/introduction-to-smart-contracts.html#storage-memory-and-the-stack + uint256[] memory result = new uint256[](ownerPizzaCount[_owner]); + uint256 counter = 0; + for (uint256 i = 0; i < pizzas.length; i++) { + if (pizzaToOwner[i] == _owner) { + result[counter] = i; + counter++; + } + } + return result; + } + + // পিৎজা এবং মালিকানা অন্য ঠিকানায় স্থানান্তর করে + function transferFrom(address _from, address _to, uint256 _pizzaId) public { + require(_from != address(0) && _to != address(0), "অবৈধ ঠিকানা।"); + require(_exists(_pizzaId), "পিৎজা বিদ্যমান নেই।"); + require(_from != _to, "একই ঠিকানায় স্থানান্তর করা যাবে না।"); + require(_isApprovedOrOwner(msg.sender, _pizzaId), "ঠিকানাটি অনুমোদিত নয়।"); + + ownerPizzaCount[_to] = SafeMath.add(ownerPizzaCount[_to], 1); + ownerPizzaCount[_from] = SafeMath.sub(ownerPizzaCount[_from], 1); + pizzaToOwner[_pizzaId] = _to; + + // ইম্পোর্ট করা IERC721 কন্ট্রাক্টে সংজ্ঞায়িত ইভেন্ট এমিট করে + emit Transfer(_from, _to, _pizzaId); + _clearApproval(_to, _pizzaId); + } + + /** + * একটি প্রদত্ত টোকেন আইডির মালিকানা নিরাপদে অন্য ঠিকানায় স্থানান্তর করে + * যদি টার্গেট ঠিকানা একটি কন্ট্রাক্ট হয়, তবে এটি অবশ্যই `onERC721Received` প্রয়োগ করবে, + * যা একটি নিরাপদ স্থানান্তরের উপর কল করা হয়, এবং ম্যাজিক মান রিটার্ন করে + * `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`; + * অন্যথায়, স্থানান্তরটি ফিরিয়ে দেওয়া হয়। + */ + function safeTransferFrom(address from, address to, uint256 pizzaId) + public + { + // solium-disable-next-line arg-overflow + this.safeTransferFrom(from, to, pizzaId, ""); + } + + /** + * একটি প্রদত্ত টোকেন আইডির মালিকানা নিরাপদে অন্য ঠিকানায় স্থানান্তর করে + * যদি টার্গেট ঠিকানা একটি কন্ট্রাক্ট হয়, তবে এটি অবশ্যই `onERC721Received` প্রয়োগ করবে, + * যা একটি নিরাপদ স্থানান্তরের উপর কল করা হয়, এবং ম্যাজিক মান রিটার্ন করে + * `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`; + * অন্যথায়, স্থানান্তরটি ফিরিয়ে দেওয়া হয়। + */ + function safeTransferFrom( + address from, + address to, + uint256 pizzaId, + bytes memory _data + ) public { + this.transferFrom(from, to, pizzaId); + require(_checkOnERC721Received(from, to, pizzaId, _data), "অবশ্যই onERC721Received প্রয়োগ করতে হবে।"); + } + + /** + * একটি টার্গেট ঠিকানায় `onERC721Received`-কে আহ্বান করার জন্য ইন্টারনাল ফাংশন + * যদি টার্গেট ঠিকানা একটি কন্ট্রাক্ট না হয় তবে কলটি এক্সিকিউট করা হয় না + */ + function _checkOnERC721Received( + address from, + address to, + uint256 pizzaId, + bytes memory _data + ) internal returns (bool) { + if (!isContract(to)) { + return true; + } + + bytes4 retval = IERC721Receiver(to).onERC721Received( + msg.sender, + from, + pizzaId, + _data + ); + return (retval == _ERC721_RECEIVED); + } + + // একটি পিৎজা বার্ন করে - টোকেন সম্পূর্ণরূপে ধ্বংস করে + // `external` ফাংশন মডিফায়ারের অর্থ হল এই ফাংশনটি + // কন্ট্রাক্ট ইন্টারফেসের অংশ এবং অন্যান্য কন্ট্রাক্ট এটিকে কল করতে পারে + function burn(uint256 _pizzaId) external { + require(msg.sender != address(0), "অবৈধ ঠিকানা।"); + require(_exists(_pizzaId), "পিৎজা বিদ্যমান নেই।"); + require(_isApprovedOrOwner(msg.sender, _pizzaId), "ঠিকানাটি অনুমোদিত নয়।"); + + ownerPizzaCount[msg.sender] = SafeMath.sub( + ownerPizzaCount[msg.sender], + 1 + ); + pizzaToOwner[_pizzaId] = address(0); + } + + // ঠিকানা দ্বারা পিৎজার সংখ্যা রিটার্ন করে + function balanceOf(address _owner) public view returns (uint256 _balance) { + return ownerPizzaCount[_owner]; + } + + // আইডি দ্বারা পাওয়া পিৎজার মালিককে রিটার্ন করে + function ownerOf(uint256 _pizzaId) public view returns (address _owner) { + address owner = pizzaToOwner[_pizzaId]; + require(owner != address(0), "অবৈধ পিৎজা আইডি।"); + return owner; + } + + // পিৎজার মালিকানা স্থানান্তরের জন্য অন্য ঠিকানাকে অনুমোদন দেয় + function approve(address _to, uint256 _pizzaId) public { + require(msg.sender == pizzaToOwner[_pizzaId], "অবশ্যই পিৎজার মালিক হতে হবে।"); + pizzaApprovals[_pizzaId] = _to; + emit Approval(msg.sender, _to, _pizzaId); + } + + // নির্দিষ্ট পিৎজার জন্য অনুমোদিত ঠিকানা রিটার্ন করে + function getApproved(uint256 _pizzaId) + public + view + returns (address operator) + { + require(_exists(_pizzaId), "পিৎজা বিদ্যমান নেই।"); + return pizzaApprovals[_pizzaId]; + } + + /** + * একটি প্রদত্ত টোকেন আইডির বর্তমান অনুমোদন পরিষ্কার করার জন্য প্রাইভেট ফাংশন + * যদি প্রদত্ত ঠিকানাটি টোকেনের মালিক না হয় তবে ফিরিয়ে দেয় + */ + function _clearApproval(address owner, uint256 _pizzaId) private { + require(pizzaToOwner[_pizzaId] == owner, "অবশ্যই পিৎজার মালিক হতে হবে।"); + require(_exists(_pizzaId), "পিৎজা বিদ্যমান নেই।"); + if (pizzaApprovals[_pizzaId] != address(0)) { + pizzaApprovals[_pizzaId] = address(0); + } + } + + /* + * একটি প্রদত্ত অপারেটরের অনুমোদন সেট বা আনসেট করে + * একজন অপারেটর প্রেরকের পক্ষ থেকে তার সমস্ত টোকেন স্থানান্তর করার অনুমতি পায় + */ + function setApprovalForAll(address to, bool approved) public { + require(to != msg.sender, "নিজের ঠিকানা অনুমোদন করা যাবে না"); + operatorApprovals[msg.sender][to] = approved; + emit ApprovalForAll(msg.sender, to, approved); + } + + // একটি প্রদত্ত মালিক দ্বারা একজন অপারেটর অনুমোদিত কিনা তা বলে + function isApprovedForAll(address owner, address operator) + public + view + returns (bool) + { + return operatorApprovals[owner][operator]; + } + + // পিৎজার মালিকানা নেয় - শুধুমাত্র অনুমোদিত ব্যবহারকারীদের জন্য + function takeOwnership(uint256 _pizzaId) public { + require(_isApprovedOrOwner(msg.sender, _pizzaId), "ঠিকানাটি অনুমোদিত নয়।"); + address owner = this.ownerOf(_pizzaId); + this.transferFrom(owner, msg.sender, _pizzaId); + } + + // পিৎজা বিদ্যমান কিনা তা পরীক্ষা করে + function _exists(uint256 pizzaId) internal view returns (bool) { + address owner = pizzaToOwner[pizzaId]; + return owner != address(0); + } + + // ঠিকানাটি মালিক বা পিৎজা স্থানান্তরের জন্য অনুমোদিত কিনা তা পরীক্ষা করে + function _isApprovedOrOwner(address spender, uint256 pizzaId) + internal + view + returns (bool) + { + address owner = pizzaToOwner[pizzaId]; + // solium চেক অক্ষম করুন কারণ + // https://github.com/duaraghav8/Solium/issues/175 + // solium-disable-next-line operator-whitespace + return (spender == owner || + this.getApproved(pizzaId) == spender || + this.isApprovedForAll(owner, spender)); + } + + // পিৎজা অনন্য এবং এখনও বিদ্যমান নেই কিনা তা পরীক্ষা করুন + modifier isUnique(string memory _name, uint256 _dna) { + bool result = true; + for (uint256 i = 0; i < pizzas.length; i++) { + if ( + keccak256(abi.encodePacked(pizzas[i].name)) == + keccak256(abi.encodePacked(_name)) && + pizzas[i].dna == _dna + ) { + result = false; + } + } + require(result, "এই নামের পিৎজা ইতিমধ্যে বিদ্যমান।"); + _; + } + + // টার্গেট ঠিকানাটি একটি কন্ট্রাক্ট কিনা তা রিটার্ন করে + function isContract(address account) internal view returns (bool) { + uint256 size; + // বর্তমানে একটি ঠিকানায় একটি কন্ট্রাক্ট আছে কিনা তা পরীক্ষা করার জন্য এর থেকে ভালো কোনো উপায় নেই + // সেই ঠিকানার কোডের আকার পরীক্ষা করা ছাড়া। + // এটি কীভাবে কাজ করে সে সম্পর্কে আরও জানতে দেখুন https://ethereum.stackexchange.com/a/14016/36603 + // । + // TODO Serenity রিলিজের আগে এটি আবার পরীক্ষা করুন, কারণ তখন সমস্ত ঠিকানা + // কন্ট্রাক্ট হবে। + // solium-disable-next-line security/no-inline-assembly + assembly { + size := extcodesize(account) + } + return size > 0; + } +} +``` + +## আরও পড়ুন {#further-reading} + +স্মার্ট কন্ট্র্যাক্টগুলির একটি আরো সম্পূর্ণ ওভারভিউর জন্য Solidity এবং Vyper-এর ডকুমেন্টেশন দেখুন: + +- [Solidity](https://docs.soliditylang.org/) +- [Vyper](https://docs.vyperlang.org/en/stable/) + +## সম্পর্কিত বিষয় {#related-topics} + +- [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) +- [ইথিরিয়াম ভার্চুয়াল মেশিন](/developers/docs/evm/) + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [কন্ট্রাক্টের আকারের সীমার সাথে লড়াই করার জন্য কন্ট্রাক্ট ছোট করা](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _– আপনার স্মার্ট কন্ট্র্যাক্টের আকার কমানোর জন্য কিছু ব্যবহারিক টিপস।_ +- [ইভেন্টের মাধ্যমে স্মার্ট কন্ট্র্যাক্ট থেকে ডেটা লগ করা](/developers/tutorials/logging-events-smart-contracts/) _– স্মার্ট কন্ট্র্যাক্ট ইভেন্টের একটি ভূমিকা এবং আপনি ডেটা লগ করতে কীভাবে সেগুলি ব্যবহার করতে পারেন।_ +- [Solidity থেকে অন্যান্য কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করুন](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– কীভাবে একটি বিদ্যমান কন্ট্রাক্ট থেকে একটি স্মার্ট কন্ট্র্যাক্ট ডেপ্লয় করবেন এবং এটির সাথে ইন্টারঅ্যাক্ট করবেন।_ diff --git a/public/content/translations/bn/developers/docs/smart-contracts/compiling/index.md b/public/content/translations/bn/developers/docs/smart-contracts/compiling/index.md new file mode 100644 index 00000000000..72f1f4b35cc --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/compiling/index.md @@ -0,0 +1,282 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট কম্পাইল করা" +description: "স্মার্ট কন্ট্র্যাক্ট কেন কম্পাইল করতে হবে এবং কম্পাইলেশন আসলে কী করে তার একটি ব্যাখ্যা।" +lang: bn +incomplete: true +--- + +আপনার কন্ট্র্যাক্টটি আপনাকে কম্পাইল করতে হবে যাতে আপনার ওয়েব অ্যাপ এবং ইথিরিয়াম ভার্চুয়াল মেশিন (EVM) এটি বুঝতে পারে। + +## পূর্বশর্ত {#prerequisites} + +কম্পাইলেশন সম্পর্কে পড়ার আগে আমাদের [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) এবং [ইথিরিয়াম ভার্চুয়াল মেশিন](/developers/docs/evm/) এর পরিচিতি পড়ে নেওয়াটা আপনার জন্য সহায়ক হতে পারে। + +## EVM {#the-evm} + +আপনার কন্ট্র্যাক্টটি চালানোর জন্য [EVM](/developers/docs/evm/)-এর কাছে এটি **বাইটকোডে** থাকা প্রয়োজন। কম্পাইলেশন এটিকে পরিবর্তন করে: + +```solidity +pragma solidity 0.4.24; + +contract Greeter { + + function greet() public view returns (string memory) { + return "Hello"; + } + +} +``` + +**এইরূপে** + +``` +PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV PUSH4 0xFFFFFFFF AND DUP1 PUSH4 0xCFAE3217 EQ PUSH2 0x46 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x52 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x5B PUSH2 0xD6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x9B JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x80 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xC8 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP3 POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x60 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x48656C6C6F000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP SWAP1 POP SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SLT 0xec 0xe 0xf5 0xf8 SLT 0xc7 0x2d STATICCALL ADDRESS SHR 0xdb COINBASE 0xb1 BALANCE 0xe8 0xf8 DUP14 0xda 0xad DUP13 LOG1 0x4c 0xb4 0x26 0xc2 DELEGATECALL PUSH7 0x8994D3E002900 +``` + +এগুলোকে **অপকোড** বলা হয়। EVM অপকোডগুলি হল নিম্ন-স্তরের নির্দেশাবলী যা ইথিরিয়াম ভার্চুয়াল মেশিন (EVM) এক্সিকিউট করতে পারে। প্রতিটি অপকোড একটি নির্দিষ্ট অপারেশনকে প্রতিনিধিত্ব করে, যেমন গাণিতিক অপারেশন, লজিক্যাল অপারেশন, ডেটা ম্যানিপুলেশন, কন্ট্রোল ফ্লো ইত্যাদি। + +[অপকোড সম্পর্কে আরও](/developers/docs/evm/opcodes/) + +## ওয়েব অ্যাপ্লিকেশন {#web-applications} + +কম্পাইলার **অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI)**-ও তৈরি করবে, যা আপনার অ্যাপ্লিকেশনের কন্ট্র্যাক্ট বুঝতে এবং কন্ট্র্যাক্টের ফাংশন কল করার জন্য প্রয়োজন। + +ABI হল একটি JSON ফাইল যা ডেপ্লয়েড কন্ট্র্যাক্ট এবং এর স্মার্ট কন্ট্র্যাক্টের ফাংশনগুলিকে বর্ণনা করে। এটি web2 এবং web3-এর মধ্যে সেতুবন্ধন করতে সাহায্য করে। + +আপনার ওয়েব অ্যাপের ইন্টারফেস থেকে আপনার স্মার্ট কন্ট্র্যাক্ট কল করার জন্য একটি [জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি](/developers/docs/apis/javascript/) **ABI** রিড করবে। + +নিচে ERC-20 টোকেন কন্ট্র্যাক্টের জন্য ABI দেওয়া হল। একটি ERC-20 হল একটি টোকেন যা আপনি ইথেরিয়াম-এ ট্রেড করতে পারেন। + +```json +[ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } +] +``` + +## আরও পড়ুন {#further-reading} + +- [ABI স্পেক](https://solidity.readthedocs.io/en/v0.7.0/abi-spec.html) _– Solidity_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি](/developers/docs/apis/javascript/) +- [ইথিরিয়াম ভার্চুয়াল মেশিন](/developers/docs/evm/) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/composability/index.md b/public/content/translations/bn/developers/docs/smart-contracts/composability/index.md new file mode 100644 index 00000000000..e82a5a39ff3 --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/composability/index.md @@ -0,0 +1,76 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট কম্পোজেবিলিটি" +description: "বিদ্যমান উপাদানগুলি পুনঃব্যবহার করে কীভাবে লেগো ব্লকের মতো স্মার্ট কন্ট্র্যাক্টগুলিকে একত্রিত করে জটিল ডিএ্যাপস তৈরি করা যায় তা জানুন।" +lang: bn +incomplete: true +--- + +## একটি সংক্ষিপ্ত ভূমিকা {#a-brief-introduction} + +স্মার্ট কন্ট্র্যাক্টগুলি Ethereum-এ পাবলিক এবং সেগুলিকে ওপেন API হিসাবে ভাবা যেতে পারে। একজন ডিএ্যাপ ডেভেলপার হওয়ার জন্য আপনাকে নিজের স্মার্ট কন্ট্র্যাক্ট লিখতে হবে না, আপনাকে শুধু জানতে হবে কিভাবে তাদের সাথে ইন্টারঅ্যাক্ট করতে হয়। উদাহরণস্বরূপ, আপনি আপনার অ্যাপে সমস্ত টোকেন সোয়াপ লজিক পরিচালনা করার জন্য একটি ডিসেন্ট্রালাইজড এক্সচেঞ্জ [Uniswap](https://uniswap.exchange/swap)-এর বিদ্যমান স্মার্ট কন্ট্র্যাক্টগুলি ব্যবহার করতে পারেন – আপনাকে প্রথম থেকে শুরু করতে হবে না। তাদের কিছু [v2](https://github.com/Uniswap/uniswap-v2-core/tree/master/contracts) এবং [v3](https://github.com/Uniswap/uniswap-v3-core/tree/main/contracts) কন্ট্র্যাক্ট দেখুন। + +## কম্পোজেবিলিটি কী? {#what-is-composability} + +কম্পোজেবিলিটি হলো নতুন সিস্টেম বা আউটপুট তৈরি করার জন্য স্বতন্ত্র উপাদানগুলিকে একত্রিত করা। সফ্টওয়্যার ডেভেলপমেন্টে, কম্পোজেবিলিটি মানে ডেভেলপাররা নতুন অ্যাপ্লিকেশন তৈরি করতে বিদ্যমান সফ্টওয়্যার উপাদানগুলি পুনরায় ব্যবহার করতে পারে। কম্পোজেবিলিটি বোঝার একটি ভালো উপায় হলো কম্পোজেবল উপাদানগুলিকে লেগো ব্লকের মতো মনে করা। প্রতিটি লেগো অন্যটির সাথে একত্রিত হতে পারে, যা আপনাকে বিভিন্ন লেগো একত্রিত করে জটিল কাঠামো তৈরি করার সুযোগ দেয়। + +ইথেরিয়ামে, প্রতিটি স্মার্ট কন্ট্র্যাক্ট এক ধরনের লেগো—আপনি আপনার প্রকল্পের জন্য বিল্ডিং ব্লক হিসাবে অন্যান্য প্রকল্পের স্মার্ট কন্ট্র্যাক্ট ব্যবহার করতে পারেন। এর মানে হল আপনাকে চাকা নতুন করে উদ্ভাবন করতে বা প্রথম থেকে তৈরি করতে সময় ব্যয় করতে হবে না। + +## কম্পোজেবিলিটি কীভাবে কাজ করে? {#how-does-composability-work} + +ইথেরিয়াম স্মার্ট কন্ট্র্যাক্টগুলি পাবলিক API-এর মতো, তাই যে কেউ কন্ট্র্যাক্টটির সাথে ইন্টারঅ্যাক্ট করতে পারে বা অতিরিক্ত কার্যকারিতার জন্য সেগুলিকে ডিএ্যাপসগুলিতে একীভূত করতে পারে। স্মার্ট কন্ট্র্যাক্ট কম্পোজেবিলিটি সাধারণত তিনটি নীতির উপর ভিত্তি করে কাজ করে: মডুলারিটি, স্বায়ত্তশাসন, এবং আবিষ্কারযোগ্যতা: + +**১. মডুলারিটি**: এটি একটি নির্দিষ্ট কাজ সম্পাদন করার জন্য স্বতন্ত্র উপাদানগুলির ক্ষমতা। ইথেরিয়ামে, প্রতিটি স্মার্ট কন্ট্র্যাক্টের একটি নির্দিষ্ট ব্যবহারের ক্ষেত্র রয়েছে (যেমনটি Uniswap-এর উদাহরণে দেখানো হয়েছে)। + +**২. স্বায়ত্তশাসন**: কম্পোজেবল উপাদানগুলিকে অবশ্যই স্বাধীনভাবে কাজ করতে সক্ষম হতে হবে। ইথেরিয়ামের প্রতিটি স্মার্ট কন্ট্র্যাক্ট স্ব-নির্বাহী এবং সিস্টেমের অন্যান্য অংশের উপর নির্ভর না করে কাজ করতে পারে। + +**৩. আবিষ্কারযোগ্যতা**: ডেভেলপাররা বাহ্যিক কন্ট্র্যাক্ট কল করতে বা অ্যাপ্লিকেশনগুলিতে সফ্টওয়্যার লাইব্রেরিগুলিকে একীভূত করতে পারে না যদি আগেরগুলি সর্বজনীনভাবে উপলব্ধ না হয়। ডিজাইন অনুসারে, স্মার্ট কন্ট্র্যাক্টগুলি ওপেন-সোর্স; যে কেউ একটি স্মার্ট কন্ট্র্যাক্ট কল করতে বা একটি কোডবেস ফর্ক করতে পারে। + +## কম্পোজেবিলিটির সুবিধা {#benefits-of-composability} + +### সংক্ষিপ্ত ডেভেলপমেন্ট চক্র {#shorter-development-cycle} + +কম্পোজেবিলিটি [ডিএ্যাপস](/apps/#what-are-dapps) তৈরি করার সময় ডেভেলপারদের যে কাজ করতে হয় তা কমিয়ে দেয়। [নাভাল রবিকান্ত যেমন বলেছেন:](https://twitter.com/naval/status/1444366754650656770) "ওপেন সোর্স মানে প্রতিটি সমস্যার সমাধান একবার করতে হবে।" + +যদি এমন একটি স্মার্ট কন্ট্র্যাক্ট থাকে যা একটি সমস্যার সমাধান করে, তবে অন্যান্য ডেভেলপাররা এটি পুনরায় ব্যবহার করতে পারে, তাই তাদের একই সমস্যার সমাধান করতে হবে না। এইভাবে, ডেভেলপাররা বিদ্যমান সফ্টওয়্যার লাইব্রেরিগুলি নিতে পারে এবং নতুন ডিএ্যাপস তৈরি করতে অতিরিক্ত কার্যকারিতা যোগ করতে পারে। + +### বৃহত্তর উদ্ভাবন {#greater-innovation} + +কম্পোজেবিলিটি উদ্ভাবন এবং পরীক্ষাকে উৎসাহিত করে কারণ ডেভেলপাররা পছন্দসই ফলাফল তৈরি করতে ওপেন-সোর্স কোড পুনরায় ব্যবহার, পরিবর্তন, নকল বা একীভূত করতে স্বাধীন। ফলস্বরূপ, ডেভেলপমেন্ট দলগুলি মৌলিক কার্যকারিতার উপর কম সময় ব্যয় করে এবং নতুন বৈশিষ্ট্যগুলির সাথে পরীক্ষা করার জন্য আরও বেশি সময় বরাদ্দ করতে পারে। + +### উন্নত ব্যবহারকারী অভিজ্ঞতা {#better-user-experience} + +ইথেরিয়াম ইকোসিস্টেমের উপাদানগুলির মধ্যে ইন্টারঅপারেবিলিটি ব্যবহারকারীর অভিজ্ঞতা উন্নত করে। ব্যবহারকারীরা যখন ডিএ্যাপসগুলি বাহ্যিক স্মার্ট কন্ট্র্যাক্টগুলিকে একীভূত করে তখন একটি খণ্ডিত ইকোসিস্টেমের তুলনায় বৃহত্তর কার্যকারিতা অ্যাক্সেস করতে পারে যেখানে অ্যাপ্লিকেশনগুলি যোগাযোগ করতে পারে না। + +আমরা ইন্টারঅপারেবিলিটির সুবিধাগুলি ব্যাখ্যা করার জন্য আরবিট্রেজ ট্রেডিং থেকে একটি উদাহরণ ব্যবহার করব: + +যদি `exchange A`-তে `exchange B`-এর চেয়ে বেশি দামে একটি টোকেন ট্রেড করা হয়, তাহলে আপনি মুনাফা অর্জনের জন্য দামের পার্থক্যের সুবিধা নিতে পারেন। যাইহোক, আপনি কেবল তখনই তা করতে পারবেন যদি আপনার লেনদেনের জন্য পর্যাপ্ত পুঁজি থাকে (অর্থাৎ, `exchange B` থেকে টোকেন কেনা এবং `exchange A`-তে বিক্রি করা)। + +এমন একটি পরিস্থিতিতে যেখানে ট্রেডটি কভার করার জন্য আপনার কাছে পর্যাপ্ত তহবিল নেই, একটি ফ্ল্যাশ লোন আদর্শ হতে পারে। [ফ্ল্যাশ লোন](/defi/#flash-loans) অত্যন্ত প্রযুক্তিগত, তবে মূল ধারণাটি হলো আপনি সম্পদ ধার করতে পারেন (জামানত ছাড়াই) এবং _একই_ লেনদেনের মধ্যে তা ফেরত দিতে পারেন। + +আমাদের প্রাথমিক উদাহরণে ফিরে গেলে, একজন আরবিট্রেজ ট্রেডার একটি বড় ফ্ল্যাশ লোন নিতে পারে, `exchange B` থেকে টোকেন কিনতে পারে, `exchange A`-তে সেগুলি বিক্রি করতে পারে, মূলধন + সুদ পরিশোধ করতে পারে এবং একই লেনদেনের মধ্যে লাভ রাখতে পারে। এই জটিল যুক্তির জন্য একাধিক কন্ট্র্যাক্টে কল একত্রিত করা প্রয়োজন, যা স্মার্ট কন্ট্র্যাক্টগুলিতে ইন্টারঅপারেবিলিটির অভাব থাকলে সম্ভব হতো না। + +## ইথেরিয়ামে কম্পোজেবিলিটির উদাহরণ {#composability-in-ethereum} + +### টোকেন সোয়াপ {#token-swaps} + +আপনি যদি এমন একটি ডিএ্যাপ তৈরি করেন যার জন্য ETH-এ লেনদেন পরিশোধ করতে হয়, তবে আপনি টোকেন সোয়াপ লজিক একীভূত করে ব্যবহারকারীদের অন্যান্য ERC-20 টোকেনে অর্থ প্রদান করার অনুমতি দিতে পারেন। কন্ট্র্যাক্টটি কল করা ফাংশনটি এক্সিকিউট করার আগে কোডটি স্বয়ংক্রিয়ভাবে ব্যবহারকারীর টোকেনকে ETH-তে রূপান্তর করবে। + +### গভর্নেন্স {#governance} + +একটি [DAO](/dao/)-এর জন্য বেসপোক গভর্নেন্স সিস্টেম তৈরি করা ব্যয়বহুল এবং সময়সাপেক্ষ হতে পারে। পরিবর্তে, আপনি আপনার DAO বুটস্ট্র্যাপ করতে একটি ওপেন-সোর্স গভর্নেন্স টুলকিট ব্যবহার করতে পারেন, যেমন [Aragon ক্লায়েন্ট](https://client.aragon.org/), দ্রুত একটি গভর্নেন্স কাঠামো তৈরি করার জন্য। + +### পরিচয় ব্যবস্থাপনা {#identity-management} + +একটি কাস্টম প্রমাণীকরণ সিস্টেম তৈরি করার বা কেন্দ্রীভূত প্রদানকারীদের উপর নির্ভর করার পরিবর্তে, আপনি ব্যবহারকারীদের জন্য প্রমাণীকরণ পরিচালনা করতে ডিসেন্ট্রালাইজড আইডেন্টিটি (DID) টুলস একীভূত করতে পারেন। একটি উদাহরণ হলো [SpruceID](https://www.spruceid.com/), একটি ওপেন-সোর্স টুলকিট যা "Sign in with Ethereum" কার্যকারিতা অফার করে যা ব্যবহারকারীদের একটি ইথেরিয়াম ওয়ালেট দিয়ে পরিচয় প্রমাণীকরণ করতে দেয়। + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [create-eth-app দিয়ে আপনার ডিএ্যাপ ফ্রন্টএন্ড ডেভেলপমেন্ট শুরু করুন](/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/) _– বাক্সের বাইরে জনপ্রিয় স্মার্ট কন্ট্র্যাক্ট সহ অ্যাপ তৈরি করতে create-eth-app কীভাবে ব্যবহার করবেন তার একটি সংক্ষিপ্ত বিবরণ।_ + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +- [কম্পোজেবিলিটিই উদ্ভাবন](https://a16zcrypto.com/posts/article/how-composability-unlocks-crypto-and-everything-else/) +- [Web3-এর জন্য কম্পোজেবিলিটি কেন গুরুত্বপূর্ণ](https://hackernoon.com/why-composability-matters-for-web3) +- [কম্পোজেবিলিটি কী?](https://blog.aragon.org/what-is-composability/#:~:text=Aragon,connect%20to%20every%20other%20piece.) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/deploying/index.md b/public/content/translations/bn/developers/docs/smart-contracts/deploying/index.md new file mode 100644 index 00000000000..6ce636a2adc --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/deploying/index.md @@ -0,0 +1,81 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করা" +description: "পূর্বশর্ত, টুলস এবং ডিপ্লয়মেন্টের ধাপসহ কীভাবে ইথেরিয়াম নেটওয়ার্কে স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করতে হয় তা শিখুন।" +lang: bn +--- + +একটি ইথেরিয়াম নেটওয়ার্কের ব্যবহারকারীদের কাছে উপলব্ধ করার জন্য আপনাকে আপনার স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করতে হবে। + +একটি স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করতে, আপনাকে শুধুমাত্র কোনো প্রাপক নির্দিষ্ট না করে স্মার্ট কন্ট্র্যাক্টের কম্পাইল করা কোডসহ একটি ইথেরিয়াম লেনদেন পাঠাতে হবে। + +## পূর্বশর্ত {#prerequisites} + +স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করার আগে আপনার [ইথেরিয়াম নেটওয়ার্ক](/developers/docs/networks/), [লেনদেন](/developers/docs/transactions/) এবং [স্মার্ট কন্ট্র্যাক্টের অ্যানাটমি](/developers/docs/smart-contracts/anatomy/) বোঝা উচিত। + +একটি কন্ট্র্যাক্ট ডিপ্লয় করতেও ইথার (ETH) খরচ হয় যেহেতু সেগুলি ব্লকচেইনে সংরক্ষিত থাকে, তাই আপনার ইথেরিয়ামের [গ্যাস এবং ফি](/developers/docs/gas/) এর সাথে পরিচিত হওয়া উচিত। + +অবশেষে, এটি ডিপ্লয় করার আগে আপনাকে আপনার কন্ট্র্যাক্ট কম্পাইল করতে হবে, তাই নিশ্চিত করুন যে আপনি [স্মার্ট কন্ট্র্যাক্ট কম্পাইল করা](/developers/docs/smart-contracts/compiling/) সম্পর্কে পড়েছেন। + +## কীভাবে একটি স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করবেন {#how-to-deploy-a-smart-contract} + +### আপনার যা প্রয়োজন হবে {#what-youll-need} + +- আপনার কন্ট্র্যাক্টের বাইটকোড – এটি [কম্পাইলেশন](/developers/docs/smart-contracts/compiling/) এর মাধ্যমে তৈরি হয় +- গ্যাসের জন্য ETH – আপনি অন্যান্য লেনদেনের মতো আপনার গ্যাস লিমিট সেট করবেন তাই সচেতন থাকুন যে একটি সাধারণ ETH ট্রান্সফারের চেয়ে কন্ট্র্যাক্ট ডিপ্লয়মেন্টের জন্য অনেক বেশি গ্যাস প্রয়োজন। +- একটি ডিপ্লয়মেন্ট স্ক্রিপ্ট বা প্লাগইন +- একটি [ইথেরিয়াম নোড](/developers/docs/nodes-and-clients/) এ অ্যাক্সেস, হয় আপনার নিজের নোড চালিয়ে, একটি পাবলিক নোডের সাথে সংযোগ করে, অথবা একটি [নোড সার্ভিস](/developers/docs/nodes-and-clients/nodes-as-a-service/) ব্যবহার করে একটি API কী এর মাধ্যমে। + +### একটি স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করার পদক্ষেপ {#steps-to-deploy} + +সংশ্লিষ্ট পদক্ষেপগুলি সংশ্লিষ্ট ডেভেলপমেন্ট ফ্রেমওয়ার্কের উপর নির্ভর করবে। উদাহরণস্বরূপ, আপনি [আপনার কন্ট্র্যাক্ট ডিপ্লয় করার উপর Hardhat-এর ডকুমেন্টেশন](https://hardhat.org/docs/tutorial/deploying) অথবা [একটি স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় এবং ভেরিফাই করার উপর Foundry-এর ডকুমেন্টেশন](https://book.getfoundry.sh/forge/deploying) দেখতে পারেন। একবার ডিপ্লয় করা হলে, আপনার কন্ট্র্যাক্টের অন্যান্য [অ্যাকাউন্ট](/developers/docs/accounts/) এর মতো একটি ইথেরিয়াম অ্যাড্রেস থাকবে এবং [সোর্স কোড ভেরিফিকেশন টুলস](/developers/docs/smart-contracts/verifying/#source-code-verification-tools) ব্যবহার করে এটি ভেরিফাই করা যেতে পারে। + +## সম্পর্কিত টুলস {#related-tools} + +**Remix - _Remix IDE ইথেরিয়ামের মতো ব্লকচেইনগুলির জন্য স্মার্ট কন্ট্র্যাক্ট ডেভেলপ, ডিপ্লয় এবং পরিচালনা করার অনুমতি দেয়_** + +- [Remix](https://remix.ethereum.org) + +**Tenderly - _Web3 ডেভেলপমেন্ট প্ল্যাটফর্ম যা স্মার্ট কন্ট্র্যাক্ট ডেভেলপ, পরীক্ষা, পর্যবেক্ষণ এবং পরিচালনা করার জন্য ডিবাগিং, অবজার্ভেবিলিটি এবং অবকাঠামো তৈরির ব্লক সরবরাহ করে_** + +- [tenderly.co](https://tenderly.co/) +- [Docs](https://docs.tenderly.co/) +- [GitHub](https://github.com/Tenderly) +- [Discord](https://discord.gg/eCWjuvt) + +**Hardhat - _আপনার ইথেরিয়াম সফটওয়্যার কম্পাইল, ডিপ্লয়, পরীক্ষা এবং ডিবাগ করার জন্য একটি ডেভেলপমেন্ট এনভায়রনমেন্ট_** + +- [hardhat.org](https://hardhat.org/getting-started/) +- [আপনার কন্ট্র্যাক্ট ডিপ্লয় করার ডকুমেন্টেশন](https://hardhat.org/docs/tutorial/deploying) +- [GitHub](https://github.com/nomiclabs/hardhat) +- [Discord](https://discord.com/invite/TETZs2KK4k) + +**thirdweb - _একটিমাত্র কমান্ড ব্যবহার করে সহজেই যেকোনো EVM সামঞ্জস্যপূর্ণ চেইনে যেকোনো কন্ট্র্যাক্ট ডিপ্লয় করুন_** + +- [নথিপত্র](https://portal.thirdweb.com/deploy/) + +**Crossmint - _স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করতে, ক্রেডিট-কার্ড এবং ক্রস চেইন পেমেন্ট সক্ষম করতে এবং NFT তৈরি, বিতরণ, বিক্রি, সংরক্ষণ এবং সম্পাদনা করতে API ব্যবহার করার জন্য এন্টারপ্রাইজ-গ্রেড web3 ডেভেলপমেন্ট প্ল্যাটফর্ম।_** + +- [crossmint.com](https://www.crossmint.com) +- [নথিপত্র](https://docs.crossmint.com) +- [Discord](https://discord.com/invite/crossmint) +- [Blog](https://blog.crossmint.com) + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [আপনার প্রথম স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করা](/developers/tutorials/deploying-your-first-smart-contract/) _– একটি ইথেরিয়াম টেস্ট নেটওয়ার্কে আপনার প্রথম স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করার একটি পরিচিতি।_ +- [হ্যালো ওয়ার্ল্ড | স্মার্ট কন্ট্র্যাক্ট টিউটোরিয়াল](/developers/tutorials/hello-world-smart-contract/) _– ইথেরিয়ামে একটি বেসিক স্মার্ট কন্ট্র্যাক্ট তৈরি এবং ডিপ্লয় করার জন্য একটি সহজবোধ্য টিউটোরিয়াল।_ +- [Solidity থেকে অন্যান্য কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করুন](/developers/tutorials/interact-with-other-contracts-from-solidity/) _– কীভাবে একটি বিদ্যমান কন্ট্রাক্ট থেকে একটি স্মার্ট কন্ট্র্যাক্ট ডেপ্লয় করবেন এবং এটির সাথে ইন্টারঅ্যাক্ট করবেন।_ +- [কীভাবে আপনার কন্ট্র্যাক্টের আকার কমাবেন](/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/) _- কীভাবে আপনার কন্ট্র্যাক্টের আকার কমিয়ে সীমার নিচে রাখবেন এবং গ্যাসে সাশ্রয় করবেন_ + +## আরও পড়ুন {#further-reading} + +- [https://docs.openzeppelin.com/learn/deploying-and-interacting](https://docs.openzeppelin.com/learn/deploying-and-interacting) - _OpenZeppelin_ +- [Hardhat দিয়ে আপনার কন্ট্র্যাক্ট ডিপ্লয় করা](https://hardhat.org/docs/tutorial/deploying) - _Nomic Labs_ + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [ডেভেলপমেন্ট ফ্রেমওয়ার্ক](/developers/docs/frameworks/) +- [একটি ইথেরিয়াম নোড চালান](/developers/docs/nodes-and-clients/run-a-node/) +- [নোড-অ্যাস-এ-সার্ভিস](/developers/docs/nodes-and-clients/nodes-as-a-service) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/formal-verification/index.md b/public/content/translations/bn/developers/docs/smart-contracts/formal-verification/index.md new file mode 100644 index 00000000000..5931e2a9166 --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/formal-verification/index.md @@ -0,0 +1,284 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্টের আনুষ্ঠানিক যাচাইকরণ" +description: "ইথেরিয়াম স্মার্ট কন্ট্র্যাক্টের জন্য আনুষ্ঠানিক যাচাইকরণের একটি সংক্ষিপ্ত বিবরণ" +lang: bn +--- + +[স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) বিকেন্দ্রীভূত, ট্রাস্টলেস এবং শক্তিশালী অ্যাপ্লিকেশন তৈরি করা সম্ভব করে তুলছে যা নতুন ব্যবহারের ক্ষেত্র তৈরি করে এবং ব্যবহারকারীদের জন্য ভ্যালু আনলক করে। যেহেতু স্মার্ট কন্ট্র্যাক্টগুলি প্রচুর পরিমাণে ভ্যালু পরিচালনা করে, তাই ডেভেলপারদের জন্য নিরাপত্তা একটি গুরুত্বপূর্ণ বিবেচ্য বিষয়। + +আনুষ্ঠানিক যাচাইকরণ হল [স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা](/developers/docs/smart-contracts/security/) উন্নত করার জন্য প্রস্তাবিত কৌশলগুলির মধ্যে একটি। আনুষ্ঠানিক যাচাইকরণ, যা প্রোগ্রামগুলির নির্দিষ্টকরণ, নকশা এবং যাচাই করার জন্য [আনুষ্ঠানিক পদ্ধতি](https://www.brookings.edu/techstream/formal-methods-as-a-path-toward-better-cybersecurity/) ব্যবহার করে, বছরের পর বছর ধরে গুরুত্বপূর্ণ হার্ডওয়্যার এবং সফ্টওয়্যার সিস্টেমগুলির সঠিকতা নিশ্চিত করতে ব্যবহৃত হয়ে আসছে। + +স্মার্ট কন্ট্র্যাক্টে প্রয়োগ করা হলে, আনুষ্ঠানিক যাচাইকরণ প্রমাণ করতে পারে যে একটি কন্ট্র্যাক্টের ব্যবসায়িক যুক্তি একটি পূর্বনির্ধারিত স্পেসিফিকেশন পূরণ করে। কন্ট্র্যাক্ট কোডের সঠিকতা মূল্যায়নের জন্য অন্যান্য পদ্ধতির তুলনায়, যেমন টেস্টিং, আনুষ্ঠানিক যাচাইকরণ একটি স্মার্ট কন্ট্র্যাক্ট কার্যকরীভাবে সঠিক হওয়ার শক্তিশালী গ্যারান্টি দেয়। + +## আনুষ্ঠানিক যাচাইকরণ কী? {#what-is-formal-verification} + +আনুষ্ঠানিক যাচাইকরণ একটি আনুষ্ঠানিক স্পেসিফিকেশনের সাপেক্ষে একটি সিস্টেমের সঠিকতা মূল্যায়নের প্রক্রিয়াকে বোঝায়। সহজ ভাষায়, আনুষ্ঠানিক যাচাইকরণ আমাদের পরীক্ষা করার সুযোগ দেয় যে একটি সিস্টেমের আচরণ কিছু প্রয়োজনীয়তা পূরণ করে কিনা (অর্থাৎ, আমরা যা চাই তা করে)। + +সিস্টেমের প্রত্যাশিত আচরণ (এই ক্ষেত্রে একটি স্মার্ট কন্ট্র্যাক্ট) আনুষ্ঠানিক মডেলিং ব্যবহার করে বর্ণনা করা হয়, যেখানে স্পেসিফিকেশন ভাষা আনুষ্ঠানিক বৈশিষ্ট্য তৈরি করতে সক্ষম করে। আনুষ্ঠানিক যাচাইকরণ কৌশলগুলি তখন যাচাই করতে পারে যে একটি কন্ট্র্যাক্টের বাস্তবায়ন তার স্পেসিফিকেশনের সাথে সঙ্গতিপূর্ণ এবং পূর্বের সঠিকতার গাণিতিক প্রমাণ বের করতে পারে। যখন একটি কন্ট্র্যাক্ট তার স্পেসিফিকেশন পূরণ করে, তখন এটিকে "কার্যকরীভাবে সঠিক", "ডিজাইনের দ্বারা সঠিক", বা "নির্মাণের দ্বারা সঠিক" হিসাবে বর্ণনা করা হয়। + +### একটি আনুষ্ঠানিক মডেল কী? {#what-is-a-formal-model} + +কম্পিউটার বিজ্ঞানে, একটি [আনুষ্ঠানিক মডেল](https://en.wikipedia.org/wiki/Model_of_computation) হল একটি গণনামূলক প্রক্রিয়ার গাণিতিক বিবরণ। প্রোগ্রামগুলিকে গাণিতিক ফাংশনে (সমীকরণ) বিমূর্ত করা হয়, মডেলটি বর্ণনা করে যে একটি ইনপুট দেওয়া হলে ফাংশনগুলির আউটপুটগুলি কীভাবে গণনা করা হয়। + +আনুষ্ঠানিক মডেলগুলি একটি বিমূর্ততার স্তর সরবরাহ করে যার উপর একটি প্রোগ্রামের আচরণের বিশ্লেষণ মূল্যায়ন করা যেতে পারে। আনুষ্ঠানিক মডেলের অস্তিত্ব একটি _আনুষ্ঠানিক স্পেসিফিকেশন_ তৈরির অনুমতি দেয়, যা প্রশ্নবিদ্ধ মডেলের পছন্দসই বৈশিষ্ট্যগুলি বর্ণনা করে। + +আনুষ্ঠানিক যাচাইকরণের জন্য স্মার্ট কন্ট্র্যাক্ট মডেলিংয়ের জন্য বিভিন্ন কৌশল ব্যবহার করা হয়। উদাহরণস্বরূপ, কিছু মডেল একটি স্মার্ট কন্ট্র্যাক্টের উচ্চ-স্তরের আচরণ সম্পর্কে যুক্তি দেওয়ার জন্য ব্যবহৃত হয়। এই মডেলিং কৌশলগুলি স্মার্ট কন্ট্র্যাক্টগুলিতে একটি ব্ল্যাক-বক্স ভিউ প্রয়োগ করে, সেগুলিকে এমন সিস্টেম হিসাবে দেখে যা ইনপুট গ্রহণ করে এবং সেই ইনপুটগুলির উপর ভিত্তি করে গণনা সম্পাদন করে। + +উচ্চ-স্তরের মডেলগুলি স্মার্ট কন্ট্র্যাক্ট এবং বাহ্যিক এজেন্ট, যেমন এক্সটারনালি ওনড অ্যাকাউন্ট (EOAs), কন্ট্র্যাক্ট অ্যাকাউন্ট এবং ব্লকচেইন পরিবেশের মধ্যে সম্পর্কের উপর ফোকাস করে। এই ধরনের মডেলগুলি সেই বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করার জন্য উপযোগী যা নির্দিষ্ট করে যে নির্দিষ্ট ব্যবহারকারীর ইন্টারঅ্যাকশনের প্রতিক্রিয়া হিসাবে একটি কন্ট্র্যাক্ট কীভাবে আচরণ করবে। + +বিপরীতভাবে, অন্যান্য আনুষ্ঠানিক মডেলগুলি একটি স্মার্ট কন্ট্র্যাক্টের নিম্ন-স্তরের আচরণের উপর ফোকাস করে। যদিও উচ্চ-স্তরের মডেলগুলি একটি কন্ট্র্যাক্টের কার্যকারিতা সম্পর্কে যুক্তি দেখাতে সাহায্য করতে পারে, তারা বাস্তবায়নের অভ্যন্তরীণ কাজ সম্পর্কে বিশদ বিবরণ ক্যাপচার করতে ব্যর্থ হতে পারে। নিম্ন-স্তরের মডেলগুলি প্রোগ্রাম বিশ্লেষণে একটি হোয়াইট-বক্স ভিউ প্রয়োগ করে এবং একটি কন্ট্র্যাক্টের সম্পাদনের সাথে প্রাসঙ্গিক বৈশিষ্ট্যগুলি সম্পর্কে যুক্তি দেওয়ার জন্য স্মার্ট কন্ট্র্যাক্ট অ্যাপ্লিকেশনগুলির নিম্ন-স্তরের উপস্থাপনার উপর নির্ভর করে, যেমন প্রোগ্রাম ট্রেস এবং [কন্ট্রোল ফ্লো গ্রাফ](https://en.wikipedia.org/wiki/Control-flow_graph)। + +নিম্ন-স্তরের মডেলগুলিকে আদর্শ হিসাবে বিবেচনা করা হয় কারণ তারা ইথেরিয়ামের এক্সিকিউশন পরিবেশে (অর্থাৎ, [EVM](/developers/docs/evm/)) একটি স্মার্ট কন্ট্র্যাক্টের প্রকৃত এক্সিকিউশনকে প্রতিনিধিত্ব করে। নিম্ন-স্তরের মডেলিং কৌশলগুলি স্মার্ট কন্ট্র্যাক্টে গুরুত্বপূর্ণ নিরাপত্তা বৈশিষ্ট্য স্থাপন এবং সম্ভাব্য দুর্বলতা সনাক্ত করার জন্য বিশেষভাবে কার্যকর। + +### একটি আনুষ্ঠানিক স্পেসিফিকেশন কী? {#what-is-a-formal-specification} + +একটি স্পেসিফিকেশন কেবল একটি প্রযুক্তিগত প্রয়োজনীয়তা যা একটি নির্দিষ্ট সিস্টেমকে অবশ্যই পূরণ করতে হবে। প্রোগ্রামিং-এ, স্পেসিফিকেশন একটি প্রোগ্রামের এক্সিকিউশন সম্পর্কে সাধারণ ধারণা উপস্থাপন করে (অর্থাৎ, প্রোগ্রামের কী করা উচিত)। + +স্মার্ট কন্ট্র্যাক্টের প্রসঙ্গে, আনুষ্ঠানিক স্পেসিফিকেশন বলতে বোঝায় _বৈশিষ্ট্য_—একটি কন্ট্র্যাক্টকে অবশ্যই যে প্রয়োজনীয়তাগুলি পূরণ করতে হবে তার আনুষ্ঠানিক বিবরণ। এই জাতীয় বৈশিষ্ট্যগুলিকে "ইনভ্যারিয়েন্টস" হিসাবে বর্ণনা করা হয় এবং একটি কন্ট্র্যাক্টের এক্সিকিউশন সম্পর্কে যৌক্তিক দাবি উপস্থাপন করে যা ব্যতিক্রম ছাড়াই প্রতিটি সম্ভাব্য পরিস্থিতিতে অবশ্যই সত্য থাকতে হবে। + +এইভাবে, আমরা একটি আনুষ্ঠানিক স্পেসিফিকেশনকে একটি আনুষ্ঠানিক ভাষায় লেখা বিবৃতির সংগ্রহ হিসাবে ভাবতে পারি যা একটি স্মার্ট কন্ট্র্যাক্টের উদ্দেশ্যমূলক এক্সিকিউশনকে বর্ণনা করে। স্পেসিফিকেশন একটি কন্ট্র্যাক্টের বৈশিষ্ট্যগুলি কভার করে এবং বিভিন্ন পরিস্থিতিতে কন্ট্র্যাক্টটি কীভাবে আচরণ করা উচিত তা সংজ্ঞায়িত করে। আনুষ্ঠানিক যাচাইকরণের উদ্দেশ্য হল এটি নির্ধারণ করা যে একটি স্মার্ট কন্ট্র্যাক্টের এই বৈশিষ্ট্যগুলি (ইনভ্যারিয়েন্টস) আছে কিনা এবং এক্সিকিউশনের সময় এই বৈশিষ্ট্যগুলি লঙ্ঘিত হয় না। + +স্মার্ট কন্ট্র্যাক্টের নিরাপদ বাস্তবায়নের বিকাশে আনুষ্ঠানিক স্পেসিফিকেশন অত্যন্ত গুরুত্বপূর্ণ। যে কন্ট্র্যাক্টগুলি ইনভ্যারিয়েন্টস বাস্তবায়ন করতে ব্যর্থ হয় বা এক্সিকিউশনের সময় তাদের বৈশিষ্ট্য লঙ্ঘিত হয় সেগুলি দুর্বলতার শিকার হয় যা কার্যকারিতার ক্ষতি করতে পারে বা দূষিত এক্সপ্লয়েটের কারণ হতে পারে। + +## স্মার্ট কন্ট্র্যাক্টের জন্য আনুষ্ঠানিক স্পেসিফিকেশনের প্রকারভেদ {#formal-specifications-for-smart-contracts} + +আনুষ্ঠানিক স্পেসিফিকেশন প্রোগ্রাম এক্সিকিউশনের সঠিকতা সম্পর্কে গাণিতিক যুক্তি প্রদান করে। আনুষ্ঠানিক মডেলের মতো, আনুষ্ঠানিক স্পেসিফিকেশনগুলি উচ্চ-স্তরের বৈশিষ্ট্য বা একটি কন্ট্র্যাক্ট বাস্তবায়নের নিম্ন-স্তরের আচরণ উভয়ই ক্যাপচার করতে পারে। + +আনুষ্ঠানিক স্পেসিফিকেশনগুলি [প্রোগ্রাম লজিক](https://en.wikipedia.org/wiki/Logic_programming)-এর উপাদানগুলি ব্যবহার করে প্রাপ্ত করা হয়, যা একটি প্রোগ্রামের বৈশিষ্ট্য সম্পর্কে আনুষ্ঠানিক যুক্তির সুযোগ দেয়। একটি প্রোগ্রাম লজিকের আনুষ্ঠানিক নিয়ম রয়েছে যা একটি প্রোগ্রামের প্রত্যাশিত আচরণকে (গাণিতিক ভাষায়) প্রকাশ করে। আনুষ্ঠানিক স্পেসিফিকেশন তৈরিতে বিভিন্ন প্রোগ্রাম লজিক ব্যবহার করা হয়, যার মধ্যে রয়েছে [রিচেবিলিটি লজিক](https://en.wikipedia.org/wiki/Reachability_problem), [টেম্পোরাল লজিক](https://en.wikipedia.org/wiki/Temporal_logic), এবং [হোয়ার লজিক](https://en.wikipedia.org/wiki/Hoare_logic)। + +স্মার্ট কন্ট্র্যাক্টের জন্য আনুষ্ঠানিক স্পেসিফিকেশনগুলিকে বিস্তৃতভাবে **উচ্চ-স্তরের** বা **নিম্ন-স্তরের** স্পেসিফিকেশন হিসাবে শ্রেণীবদ্ধ করা যেতে পারে। একটি স্পেসিফিকেশন যে বিভাগেরই হোক না কেন, এটি অবশ্যই বিশ্লেষণের অধীনে থাকা সিস্টেমের বৈশিষ্ট্যকে পর্যাপ্ত এবং দ্ব্যর্থহীনভাবে বর্ণনা করবে। + +### উচ্চ-স্তরের স্পেসিফিকেশন {#high-level-specifications} + +নাম থেকেই বোঝা যায়, একটি উচ্চ-স্তরের স্পেসিফিকেশন (যাকে "মডেল-ভিত্তিক স্পেসিফিকেশন"ও বলা হয়) একটি প্রোগ্রামের উচ্চ-স্তরের আচরণ বর্ণনা করে। উচ্চ-স্তরের স্পেসিফিকেশনগুলি একটি স্মার্ট কন্ট্র্যাক্টকে একটি [ফাইনাইট স্টেট মেশিন](https://en.wikipedia.org/wiki/Finite-state_machine) (FSM) হিসাবে মডেল করে, যা অপারেশন সম্পাদনের মাধ্যমে স্টেটগুলির মধ্যে পরিবর্তন করতে পারে, যেখানে টেম্পোরাল লজিক FSM মডেলের জন্য আনুষ্ঠানিক বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে ব্যবহৃত হয়। + +[টেম্পোরাল লজিক](https://en.wikipedia.org/wiki/Temporal_logic) হল "সময়ের পরিপ্রেক্ষিতে যোগ্য প্রস্তাবনা সম্পর্কে যুক্তি দেওয়ার নিয়ম (যেমন, \"আমি _সর্বদা_ ক্ষুধার্ত\" বা \"আমি _অবশেষে_ ক্ষুধার্ত হব\")।" আনুষ্ঠানিক যাচাইকরণে প্রয়োগ করা হলে, স্টেট-মেশিন হিসাবে মডেল করা সিস্টেমের সঠিক আচরণ সম্পর্কে দাবি করার জন্য টেম্পোরাল লজিক ব্যবহার করা হয়। নির্দিষ্টভাবে, একটি টেম্পোরাল লজিক বর্ণনা করে যে একটি স্মার্ট কন্ট্র্যাক্ট ভবিষ্যতে কোন স্টেটগুলিতে থাকতে পারে এবং এটি কীভাবে স্টেটগুলির মধ্যে ট্রানজিশন করে। + +উচ্চ-স্তরের স্পেসিফিকেশনগুলি সাধারণত স্মার্ট কন্ট্র্যাক্টের জন্য দুটি গুরুত্বপূর্ণ টেম্পোরাল বৈশিষ্ট্য ক্যাপচার করে: **নিরাপত্তা** এবং **লাইভনেস**। সুরক্ষা বৈশিষ্ট্যগুলি এই ধারণাটি উপস্থাপন করে যে "কখনো খারাপ কিছু ঘটে না" এবং সাধারণত ইনভ্যারিয়েন্স প্রকাশ করে। একটি সুরক্ষা বৈশিষ্ট্য সাধারণ সফ্টওয়্যারের প্রয়োজনীয়তাগুলিকে সংজ্ঞায়িত করতে পারে, যেমন [ডেডলক](https://www.techtarget.com/whatis/definition/deadlock) থেকে মুক্তি, বা কন্ট্র্যাক্টগুলির জন্য ডোমেন-নির্দিষ্ট বৈশিষ্ট্য প্রকাশ করতে পারে (যেমন, ফাংশনের জন্য অ্যাক্সেস কন্ট্রোলের উপর ইনভ্যারিয়েন্ট, স্টেট ভেরিয়েবলের গ্রহণযোগ্য মান, বা টোকেন ট্রান্সফারের শর্তাবলী)। + +উদাহরণস্বরূপ এই নিরাপত্তা প্রয়োজনীয়তাটি নিন যা ERC-20 টোকেন কন্ট্র্যাক্টে `transfer()` বা `transferFrom()` ব্যবহারের শর্তগুলিকে কভার করে: _"একজন প্রেরকের ব্যালেন্স পাঠানোর জন্য অনুরোধ করা টোকেনের পরিমাণের চেয়ে কখনো কম হয় না।"_। একটি কন্ট্র্যাক্ট ইনভ্যারিয়েন্টের এই স্বাভাবিক-ভাষার বিবরণ একটি আনুষ্ঠানিক (গাণিতিক) স্পেসিফিকেশনে অনুবাদ করা যেতে পারে, যা পরে বৈধতার জন্য কঠোরভাবে পরীক্ষা করা যেতে পারে। + +লাইভনেস বৈশিষ্ট্যগুলি দাবি করে যে "অবশেষে ভাল কিছু ঘটে" এবং একটি কন্ট্র্যাক্টের বিভিন্ন স্টেটের মাধ্যমে অগ্রগতির ক্ষমতা নিয়ে উদ্বিগ্ন। লাইভনেস বৈশিষ্ট্যের একটি উদাহরণ হল "তারল্য", যা অনুরোধের ভিত্তিতে ব্যবহারকারীদের কাছে তার ব্যালেন্স ট্রান্সফার করার জন্য একটি কন্ট্র্যাক্টের ক্ষমতাকে বোঝায়। যদি এই সম্পত্তিটি লঙ্ঘিত হয়, ব্যবহারকারীরা কন্ট্র্যাক্টে সংরক্ষিত সম্পদ উত্তোলন করতে পারবেন না, যেমনটি [প্যারিটি ওয়ালেট ঘটনা](https://www.cnbc.com/2017/11/08/accidental-bug-may-have-frozen-280-worth-of-ether-on-parity-wallet.html) এর সাথে ঘটেছিল। + +### নিম্ন-স্তরের স্পেসিফিকেশন {#low-level-specifications} + +উচ্চ-স্তরের স্পেসিফিকেশনগুলি একটি কন্ট্র্যাক্টের ফাইনাইট-স্টেট মডেলকে একটি প্রারম্ভিক বিন্দু হিসাবে গ্রহণ করে এবং এই মডেলের পছন্দসই বৈশিষ্ট্যগুলিকে সংজ্ঞায়িত করে। এর বিপরীতে, নিম্ন-স্তরের স্পেসিফিকেশনগুলি (যাকে "সম্পত্তি-ভিত্তিক স্পেসিফিকেশন"ও বলা হয়) প্রায়শই প্রোগ্রামগুলিকে (স্মার্ট কন্ট্র্যাক্ট) গাণিতিক ফাংশনের সংগ্রহ সম্বলিত সিস্টেম হিসাবে মডেল করে এবং এই ধরনের সিস্টেমের সঠিক আচরণ বর্ণনা করে। + +সহজ ভাষায়, নিম্ন-স্তরের স্পেসিফিকেশনগুলি _প্রোগ্রাম ট্রেস_ বিশ্লেষণ করে এবং এই ট্রেসগুলির উপর একটি স্মার্ট কন্ট্র্যাক্টের বৈশিষ্ট্যগুলি সংজ্ঞায়িত করার চেষ্টা করে। ট্রেস বলতে ফাংশন এক্সিকিউশনের ক্রম বোঝায় যা একটি স্মার্ট কন্ট্র্যাক্টের স্টেট পরিবর্তন করে; তাই, নিম্ন-স্তরের স্পেসিফিকেশনগুলি একটি কন্ট্র্যাক্টের অভ্যন্তরীণ এক্সিকিউশনের জন্য প্রয়োজনীয়তা নির্দিষ্ট করতে সাহায্য করে। + +নিম্ন-স্তরের আনুষ্ঠানিক স্পেসিফিকেশন হোয়ার-স্টাইল বৈশিষ্ট্য বা এক্সিকিউশন পাথের ইনভ্যারিয়েন্ট হিসাবে দেওয়া যেতে পারে। + +### হোয়ার-স্টাইল বৈশিষ্ট্য {#hoare-style-properties} + +[হোয়ার লজিক](https://en.wikipedia.org/wiki/Hoare_logic) স্মার্ট কন্ট্র্যাক্ট সহ প্রোগ্রামগুলির সঠিকতা সম্পর্কে যুক্তি দেওয়ার জন্য আনুষ্ঠানিক নিয়মের একটি সেট সরবরাহ করে। একটি হোয়ার-স্টাইল প্রপার্টি একটি হোয়ার ট্রিপল `{P}c{Q}` দ্বারা উপস্থাপিত হয়, যেখানে `c` একটি প্রোগ্রাম এবং `P` এবং `Q` হল `c`-এর (অর্থাৎ, প্রোগ্রাম) স্টেটের উপর প্রেডিকেট, যা আনুষ্ঠানিকভাবে যথাক্রমে _প্রিকন্ডিশন_ এবং _পোস্টকন্ডিশন_ হিসাবে বর্ণিত। + +একটি প্রিকন্ডিশন হল একটি প্রেডিকেট যা একটি ফাংশনের সঠিক এক্সিকিউশনের জন্য প্রয়োজনীয় শর্তাবলী বর্ণনা করে; কন্ট্র্যাক্টে কল করা ব্যবহারকারীদের অবশ্যই এই প্রয়োজনীয়তা পূরণ করতে হবে। একটি পোস্টকন্ডিশন হল একটি প্রেডিকেট যা একটি ফাংশন সঠিকভাবে এক্সিকিউট হলে যে শর্তটি প্রতিষ্ঠা করে তা বর্ণনা করে; ব্যবহারকারীরা ফাংশনে কল করার পরে এই শর্তটি সত্য হবে বলে আশা করতে পারেন। হোয়ার লজিকে একটি _ইনভ্যারিয়েন্ট_ হল একটি প্রেডিকেট যা একটি ফাংশনের এক্সিকিউশন দ্বারা সংরক্ষিত থাকে (অর্থাৎ, এটি পরিবর্তন হয় না)। + +হোয়ার-স্টাইল স্পেসিফিকেশনগুলি হয় _আংশিক সঠিকতা_ বা _সম্পূর্ণ সঠিকতা_ নিশ্চিত করতে পারে। একটি কন্ট্র্যাক্ট ফাংশনের বাস্তবায়ন "আংশিকভাবে সঠিক" হয় যদি ফাংশনটি এক্সিকিউট হওয়ার আগে প্রিকন্ডিশনটি সত্য হয় এবং যদি এক্সিকিউশনটি শেষ হয় তবে পোস্টকন্ডিশনটিও সত্য হয়। সম্পূর্ণ সঠিকতার প্রমাণ পাওয়া যায় যদি ফাংশন এক্সিকিউট করার আগে একটি প্রিকন্ডিশন সত্য হয়, এক্সিকিউশনটি শেষ হওয়ার নিশ্চয়তা থাকে এবং যখন এটি হয়, তখন পোস্টকন্ডিশনটি সত্য হয়। + +সম্পূর্ণ সঠিকতার প্রমাণ পাওয়া কঠিন কারণ কিছু এক্সিকিউশন শেষ হওয়ার আগে বিলম্বিত হতে পারে, বা একেবারেই শেষ নাও হতে পারে। তা সত্ত্বেও, এক্সিকিউশন শেষ হয় কিনা সেই প্রশ্নটি তর্কসাপেক্ষে একটি অমীমাংসিত বিষয় কারণ ইথেরিয়ামের গ্যাস মেকানিজম অসীম প্রোগ্রাম লুপ প্রতিরোধ করে (এক্সিকিউশন হয় সফলভাবে শেষ হয় অথবা 'আউট-অফ-গ্যাস' ত্রুটির কারণে শেষ হয়)। + +হোয়ার লজিক ব্যবহার করে তৈরি করা স্মার্ট কন্ট্র্যাক্ট স্পেসিফিকেশনগুলিতে একটি কন্ট্র্যাক্টে ফাংশন এবং লুপগুলির এক্সিকিউশনের জন্য প্রিকন্ডিশন, পোস্টকন্ডিশন এবং ইনভ্যারিয়েন্ট সংজ্ঞায়িত করা থাকবে। প্রিকন্ডিশনগুলিতে প্রায়শই একটি ফাংশনে ভুল ইনপুটের সম্ভাবনা অন্তর্ভুক্ত থাকে, পোস্টকন্ডিশনগুলি এই ধরনের ইনপুটগুলির প্রতি প্রত্যাশিত প্রতিক্রিয়া বর্ণনা করে (যেমন, একটি নির্দিষ্ট ব্যতিক্রম থ্রো করা)। এইভাবে হোয়ার-স্টাইল বৈশিষ্ট্যগুলি কন্ট্র্যাক্ট বাস্তবায়নের সঠিকতা নিশ্চিত করার জন্য কার্যকর। + +অনেক আনুষ্ঠানিক যাচাইকরণ ফ্রেমওয়ার্ক ফাংশনের সেমান্টিক সঠিকতা প্রমাণের জন্য হোয়ার-স্টাইল স্পেসিফিকেশন ব্যবহার করে। সলিডিটিতে `require` এবং `assert` স্টেটমেন্ট ব্যবহার করে সরাসরি কন্ট্র্যাক্ট কোডে হোয়ার-স্টাইল বৈশিষ্ট্য (অ্যাসারশন হিসাবে) যোগ করাও সম্ভব। + +`require` স্টেটমেন্টগুলি একটি প্রিকন্ডিশন বা ইনভ্যারিয়েন্ট প্রকাশ করে এবং প্রায়শই ব্যবহারকারীর ইনপুট যাচাই করতে ব্যবহৃত হয়, যখন `assert` নিরাপত্তার জন্য প্রয়োজনীয় একটি পোস্টকন্ডিশন ক্যাপচার করে। উদাহরণস্বরূপ, ফাংশনের জন্য সঠিক অ্যাক্সেস কন্ট্রোল (নিরাপত্তা বৈশিষ্ট্যের একটি উদাহরণ) কলিং অ্যাকাউন্টের পরিচয়ের উপর একটি প্রিকন্ডিশন চেক হিসাবে `require` ব্যবহার করে অর্জন করা যেতে পারে। একইভাবে, একটি কন্ট্র্যাক্টে স্টেট ভেরিয়েবলের অনুমোদিত মানের উপর একটি ইনভ্যারিয়েন্ট (যেমন, প্রচলনে থাকা মোট টোকেনের সংখ্যা) ফাংশন এক্সিকিউশনের পরে কন্ট্র্যাক্টের স্টেট নিশ্চিত করতে `assert` ব্যবহার করে লঙ্ঘন থেকে রক্ষা করা যেতে পারে। + +### ট্রেস-স্তরের বৈশিষ্ট্য {#trace-level-properties} + +ট্রেস-ভিত্তিক স্পেসিফিকেশনগুলি সেই অপারেশনগুলিকে বর্ণনা করে যা একটি কন্ট্র্যাক্টকে বিভিন্ন স্টেটের মধ্যে স্থানান্তর করে এবং এই অপারেশনগুলির মধ্যে সম্পর্ককে বর্ণনা করে। যেমনটি আগে ব্যাখ্যা করা হয়েছে, ট্রেস হল অপারেশনের ক্রম যা একটি কন্ট্র্যাক্টের স্টেটকে একটি নির্দিষ্ট উপায়ে পরিবর্তন করে। + +এই পদ্ধতিটি স্মার্ট কন্ট্র্যাক্টের মডেলের উপর নির্ভর করে যা স্টেট-ট্রানজিশন সিস্টেম হিসাবে কিছু পূর্বনির্ধারিত স্টেট (স্টেট ভেরিয়েবল দ্বারা বর্ণিত) সহ পূর্বনির্ধারিত ট্রানজিশনের একটি সেট (কন্ট্র্যাক্ট ফাংশন দ্বারা বর্ণিত) নিয়ে গঠিত। উপরন্তু, একটি [কন্ট্রোল ফ্লো গ্রাফ](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/) (CFG), যা একটি প্রোগ্রামের এক্সিকিউশন ফ্লো-এর একটি গ্রাফিকাল উপস্থাপনা, প্রায়শই একটি কন্ট্র্যাক্টের অপারেশনাল সেমান্টিকস বর্ণনা করার জন্য ব্যবহৃত হয়। এখানে, প্রতিটি ট্রেস কন্ট্রোল ফ্লো গ্রাফের একটি পথ হিসাবে উপস্থাপিত হয়। + +প্রাথমিকভাবে, ট্রেস-স্তরের স্পেসিফিকেশনগুলি স্মার্ট কন্ট্র্যাক্টগুলিতে অভ্যন্তরীণ এক্সিকিউশনের প্যাটার্ন সম্পর্কে যুক্তি দেওয়ার জন্য ব্যবহৃত হয়। ট্রেস-লেভেল স্পেসিফিকেশন তৈরি করে, আমরা একটি স্মার্ট কন্ট্র্যাক্টের জন্য গ্রহণযোগ্য এক্সিকিউশন পাথ (অর্থাৎ, স্টেট ট্রানজিশন) দাবি করি। সিম্বলিক এক্সিকিউশনের মতো কৌশল ব্যবহার করে, আমরা আনুষ্ঠানিকভাবে যাচাই করতে পারি যে এক্সিকিউশন কখনো আনুষ্ঠানিক মডেলে সংজ্ঞায়িত নয় এমন একটি পথ অনুসরণ করে না। + +আসুন ট্রেস-লেভেল বৈশিষ্ট্যগুলি বর্ণনা করার জন্য একটি [DAO](/dao/) কন্ট্র্যাক্টের একটি উদাহরণ ব্যবহার করি যার কিছু সর্বজনীনভাবে অ্যাক্সেসযোগ্য ফাংশন রয়েছে। এখানে, আমরা ধরে নিই যে DAO কন্ট্র্যাক্ট ব্যবহারকারীদের নিম্নলিখিত অপারেশনগুলি সম্পাদন করার অনুমতি দেয়: + +- তহবিল জমা দিন + +- তহবিল জমা দেওয়ার পরে একটি প্রস্তাবে ভোট দিন + +- যদি তারা কোনো প্রস্তাবে ভোট না দেয় তাহলে রিফান্ড দাবি করুন + +উদাহরণস্বরূপ ট্রেস-স্তরের বৈশিষ্ট্যগুলি হতে পারে _"যে ব্যবহারকারীরা তহবিল জমা দেন না তারা কোনো প্রস্তাবে ভোট দিতে পারবেন না"_ অথবা _"যে ব্যবহারকারীরা কোনো প্রস্তাবে ভোট দেন না তাদের সর্বদা রিফান্ড দাবি করতে সক্ষম হওয়া উচিত"_। উভয় বৈশিষ্ট্যই এক্সিকিউশনের পছন্দের ক্রম দাবি করে (ভোট তহবিল জমা দেওয়ার _আগে_ হতে পারে না এবং রিফান্ড দাবি করা একটি প্রস্তাবে ভোট দেওয়ার _পরে_ হতে পারে না)। + +## স্মার্ট কন্ট্র্যাক্টের আনুষ্ঠানিক যাচাইকরণের কৌশল {#formal-verification-techniques} + +### মডেল চেকিং {#model-checking} + +মডেল চেকিং একটি আনুষ্ঠানিক যাচাইকরণ কৌশল যেখানে একটি অ্যালগরিদম একটি স্মার্ট কন্ট্র্যাক্টের আনুষ্ঠানিক মডেলকে তার স্পেসিফিকেশনের বিপরীতে পরীক্ষা করে। মডেল চেকিং-এ স্মার্ট কন্ট্র্যাক্টগুলিকে প্রায়শই স্টেট-ট্রানজিশন সিস্টেম হিসাবে উপস্থাপন করা হয়, যখন অনুমোদিত কন্ট্র্যাক্ট স্টেটগুলির বৈশিষ্ট্যগুলি টেম্পোরাল লজিক ব্যবহার করে সংজ্ঞায়িত করা হয়। + +মডেল চেকিং-এর জন্য একটি সিস্টেমের (অর্থাৎ, একটি কন্ট্র্যাক্ট) একটি বিমূর্ত গাণিতিক উপস্থাপনা তৈরি করতে হয় এবং [প্রোপোজিশনাল লজিক](https://www.baeldung.com/cs/propositional-logic)-এর মূলে থাকা সূত্র ব্যবহার করে এই সিস্টেমের বৈশিষ্ট্যগুলি প্রকাশ করতে হয়। এটি মডেল-চেকিং অ্যালগরিদমের কাজকে সহজ করে, যথা, প্রমাণ করা যে একটি গাণিতিক মডেল একটি প্রদত্ত যৌক্তিক সূত্রকে সন্তুষ্ট করে। + +আনুষ্ঠানিক যাচাইকরণে মডেল চেকিং প্রাথমিকভাবে টেম্পোরাল বৈশিষ্ট্যগুলি মূল্যায়ন করতে ব্যবহৃত হয় যা সময়ের সাথে একটি কন্ট্র্যাক্টের আচরণ বর্ণনা করে। স্মার্ট কন্ট্র্যাক্টের জন্য টেম্পোরাল বৈশিষ্ট্যগুলির মধ্যে রয়েছে _নিরাপত্তা_ এবং _লাইভনেস_, যা আমরা আগে ব্যাখ্যা করেছি। + +উদাহরণস্বরূপ, অ্যাক্সেস কন্ট্রোল সম্পর্কিত একটি নিরাপত্তা বৈশিষ্ট্য (যেমন, _শুধুমাত্র কন্ট্র্যাক্টের মালিক `selfdestruct` কল করতে পারে_) আনুষ্ঠানিক যুক্তিতে লেখা যেতে পারে। তারপরে, মডেল-চেকিং অ্যালগরিদম যাচাই করতে পারে যে কন্ট্র্যাক্টটি এই আনুষ্ঠানিক স্পেসিফিকেশন পূরণ করে কিনা। + +মডেল চেকিং স্টেট স্পেস এক্সপ্লোরেশন ব্যবহার করে, যার মধ্যে একটি স্মার্ট কন্ট্র্যাক্টের সমস্ত সম্ভাব্য স্টেট তৈরি করা এবং এমন পৌঁছানোযোগ্য স্টেট খুঁজে বের করার চেষ্টা করা জড়িত যা সম্পত্তি লঙ্ঘনের কারণ হয়। যাইহোক, এটি অসীম সংখ্যক স্টেটের দিকে নিয়ে যেতে পারে (যা "স্টেট এক্সপ্লোশন সমস্যা" নামে পরিচিত), তাই মডেল চেকাররা স্মার্ট কন্ট্র্যাক্টের দক্ষ বিশ্লেষণ সম্ভব করার জন্য বিমূর্তকরণ কৌশলের উপর নির্ভর করে। + +### থিওরেম প্রুভিং {#theorem-proving} + +থিওরেম প্রুভিং হল স্মার্ট কন্ট্র্যাক্ট সহ প্রোগ্রামগুলির সঠিকতা সম্পর্কে গাণিতিকভাবে যুক্তি দেওয়ার একটি পদ্ধতি। এর মধ্যে একটি কন্ট্র্যাক্টের সিস্টেমের মডেল এবং তার স্পেসিফিকেশনগুলিকে গাণিতিক সূত্র (যুক্তি বিবৃতি) তে রূপান্তরিত করা জড়িত। + +থিওরেম প্রুভিং-এর উদ্দেশ্য হল এই বিবৃতিগুলির মধ্যে যৌক্তিক সমতা যাচাই করা। "যৌক্তিক সমতা" (যাকে "যৌক্তিক দ্বি-প্রভাব"ও বলা হয়) দুটি বিবৃতির মধ্যে এক ধরনের সম্পর্ক যেমন প্রথম বিবৃতিটি সত্য _যদি এবং কেবল যদি_ দ্বিতীয় বিবৃতিটি সত্য হয়। + +একটি কন্ট্র্যাক্টের মডেল এবং এর সম্পত্তি সম্পর্কে বিবৃতিগুলির মধ্যে প্রয়োজনীয় সম্পর্ক (যৌক্তিক সমতা) একটি প্রমাণযোগ্য বিবৃতি (থিওরেম বলা হয়) হিসাবে প্রণয়ন করা হয়। অনুমানের একটি আনুষ্ঠানিক সিস্টেম ব্যবহার করে, স্বয়ংক্রিয় থিওরেম প্রোভার থিওরেমের বৈধতা যাচাই করতে পারে। অন্য কথায়, একটি থিওরেম প্রোভার চূড়ান্তভাবে প্রমাণ করতে পারে যে একটি স্মার্ট কন্ট্র্যাক্টের মডেল তার স্পেসিফিকেশনগুলির সাথে অবিকল মেলে। + +যেখানে মডেল চেকিং কন্ট্র্যাক্টগুলিকে সসীম স্টেট সহ ট্রানজিশন সিস্টেম হিসাবে মডেল করে, থিওরেম প্রুভিং অসীম-স্টেট সিস্টেমের বিশ্লেষণ পরিচালনা করতে পারে। যাইহোক, এর মানে হল একটি স্বয়ংক্রিয় থিওরেম প্রোভার সর্বদা জানতে পারে না যে একটি লজিক সমস্যা "নির্ণয়যোগ্য" কি না। + +ফলস্বরূপ, সঠিকতার প্রমাণ পেতে থিওরেম প্রোভারকে গাইড করার জন্য প্রায়শই মানুষের সহায়তার প্রয়োজন হয়। থিওরেম প্রুভিং-এ মানুষের প্রচেষ্টার ব্যবহার এটিকে মডেল চেকিং-এর চেয়ে বেশি ব্যয়বহুল করে তোলে, যা সম্পূর্ণ স্বয়ংক্রিয়। + +### সিম্বলিক এক্সিকিউশন {#symbolic-execution} + +সিম্বলিক এক্সিকিউশন হল _কংক্রিট মান_ (যেমন, `x == 5`)-এর পরিবর্তে _সিম্বলিক মান_ (যেমন, `x > 5`) ব্যবহার করে ফাংশনগুলি এক্সিকিউট করে একটি স্মার্ট কন্ট্র্যাক্ট বিশ্লেষণ করার একটি পদ্ধতি। একটি আনুষ্ঠানিক যাচাইকরণ কৌশল হিসাবে, সিম্বলিক এক্সিকিউশন একটি কন্ট্র্যাক্টের কোডে ট্রেস-স্তরের বৈশিষ্ট্য সম্পর্কে আনুষ্ঠানিকভাবে যুক্তি দিতে ব্যবহৃত হয়। + +সিম্বলিক এক্সিকিউশন একটি এক্সিকিউশন ট্রেসকে সিম্বলিক ইনপুট মানগুলির উপর একটি গাণিতিক সূত্র হিসাবে উপস্থাপন করে, অন্যথায় এটি একটি _পাথ প্রেডিকেট_ বলা হয়। একটি [SMT সলভার](https://en.wikipedia.org/wiki/Satisfiability_modulo_theories) একটি পাথ প্রেডিকেট "স্যাটিসফায়েবল" কিনা তা পরীক্ষা করতে ব্যবহৃত হয় (অর্থাৎ, এমন একটি মান বিদ্যমান যা সূত্রটিকে সন্তুষ্ট করতে পারে)। যদি একটি দুর্বল পথ স্যাটিসফায়েবল হয়, SMT সলভার একটি কংক্রিট মান তৈরি করবে যা সেই পথের দিকে এক্সিকিউশনকে চালিত করে। + +ধরা যাক, একটি স্মার্ট কন্ট্র্যাক্টের ফাংশন ইনপুট হিসাবে একটি `uint` মান (`x`) নেয় এবং যখন `x` `5`-এর চেয়ে বড় এবং `10`-এর চেয়ে কম হয় তখন রিভার্ট করে। একটি সাধারণ টেস্টিং পদ্ধতি ব্যবহার করে `x`-এর জন্য এমন একটি মান খুঁজে বের করা যা ত্রুটিটিকে ট্রিগার করে, তার জন্য কয়েক ডজন (বা তার বেশি) টেস্ট কেস চালানোর প্রয়োজন হবে, আসলে একটি ত্রুটি-সৃষ্টিকারী ইনপুট খুঁজে পাওয়ার কোনো নিশ্চয়তা ছাড়াই। + +বিপরীতভাবে, একটি সিম্বলিক এক্সিকিউশন টুল ফাংশনটিকে সিম্বলিক মান দিয়ে এক্সিকিউট করবে: `X > 5 ∧ X < 10` (অর্থাৎ, `x` 5-এর চেয়ে বড় এবং `x` 10-এর চেয়ে কম)। সংশ্লিষ্ট পাথ প্রেডিকেট `x = X > 5 ∧ X < 10` তখন একটি SMT সলভারকে সমাধান করার জন্য দেওয়া হবে। যদি একটি নির্দিষ্ট মান `x = X > 5 ∧ X < 10` সূত্রটিকে সন্তুষ্ট করে, SMT সলভার এটি গণনা করবে—উদাহরণস্বরূপ, সলভার `x`-এর মান হিসাবে `7` তৈরি করতে পারে। + +কারণ সিম্বলিক এক্সিকিউশন একটি প্রোগ্রামের ইনপুটগুলির উপর নির্ভর করে, এবং সমস্ত পৌঁছানোযোগ্য স্টেট অন্বেষণ করার জন্য ইনপুটের সেট সম্ভাব্য অসীম, এটি এখনও এক ধরনের টেস্টিং। যাইহোক, উদাহরণে যেমন দেখানো হয়েছে, সিম্বলিক এক্সিকিউশন নিয়মিত টেস্টিংয়ের চেয়ে সম্পত্তি লঙ্ঘনকারী ইনপুট খুঁজে বের করার জন্য বেশি কার্যকর। + +উপরন্তু, সিম্বলিক এক্সিকিউশন অন্যান্য সম্পত্তি-ভিত্তিক কৌশল (যেমন, ফাজিং) এর চেয়ে কম ফলস পজিটিভ তৈরি করে যা এলোমেলোভাবে একটি ফাংশনে ইনপুট তৈরি করে। যদি সিম্বলিক এক্সিকিউশনের সময় একটি ত্রুটি স্টেট ট্রিগার হয়, তাহলে একটি কংক্রিট মান তৈরি করা সম্ভব যা ত্রুটিটি ট্রিগার করে এবং সমস্যাটি পুনরুত্পাদন করে। + +সিম্বলিক এক্সিকিউশন সঠিকতার গাণিতিক প্রমাণের কিছু মাত্রাও প্রদান করতে পারে। ওভারফ্লো সুরক্ষা সহ একটি কন্ট্র্যাক্ট ফাংশনের নিম্নলিখিত উদাহরণটি বিবেচনা করুন: + +``` +function safe_add(uint x, uint y) returns(uint z){ + + z = x + y; + require(z>=x); + require(z>=y); + + return z; +} +``` + +একটি ইন্টিজার ওভারফ্লো-এর ফলে সৃষ্ট এক্সিকিউশন ট্রেসকে সূত্রটি পূরণ করতে হবে: `z = x + y AND (z >= x) AND (z >= y) AND (z < x OR z < y)` এমন একটি সূত্রের সমাধান হওয়ার সম্ভাবনা কম, তাই এটি একটি গাণিতিক প্রমাণ হিসাবে কাজ করে যে `safe_add` ফাংশনটি কখনও ওভারফ্লো হয় না। + +### স্মার্ট কন্ট্র্যাক্টের জন্য আনুষ্ঠানিক যাচাইকরণ কেন ব্যবহার করবেন? {#benefits-of-formal-verification} + +#### নির্ভরযোগ্যতার প্রয়োজন {#need-for-reliability} + +আনুষ্ঠানিক যাচাইকরণ নিরাপত্তা-সংক্রান্ত সিস্টেমগুলির সঠিকতা মূল্যায়ন করতে ব্যবহৃত হয়, যার ব্যর্থতার ফলে মৃত্যু, আঘাত বা আর্থিক ধ্বংসের মতো বিধ্বংসী পরিণতি হতে পারে। স্মার্ট কন্ট্র্যাক্ট হল উচ্চ-মূল্যের অ্যাপ্লিকেশন যা বিপুল পরিমাণ মূল্য নিয়ন্ত্রণ করে, এবং ডিজাইনে সাধারণ ত্রুটি [ব্যবহারকারীদের জন্য অপূরণীয় ক্ষতির](https://www.freecodecamp.org/news/a-hacker-stole-31m-of-ether-how-it-happened-and-what-it-means-for-ethereum-9e5dc29e33ce/amp/) কারণ হতে পারে। যাইহোক, ডিপ্লয়মেন্টের আগে একটি কন্ট্র্যাক্টকে আনুষ্ঠানিকভাবে যাচাই করা এই গ্যারান্টি বাড়াতে পারে যে এটি ব্লকচেইনে চলার সময় প্রত্যাশিতভাবে কাজ করবে। + +নির্ভরযোগ্যতা যেকোনো স্মার্ট কন্ট্র্যাক্টে একটি অত্যন্ত আকাঙ্ক্ষিত গুণ, বিশেষ করে কারণ ইথেরিয়াম ভার্চুয়াল মেশিন (EVM)-এ ডিপ্লয় করা কোড সাধারণত অপরিবর্তনীয়। লঞ্চ-পরবর্তী আপগ্রেডগুলি সহজে অ্যাক্সেসযোগ্য না হওয়ায়, কন্ট্র্যাক্টের নির্ভরযোগ্যতা নিশ্চিত করার প্রয়োজন আনুষ্ঠানিক যাচাইকরণকে অপরিহার্য করে তোলে। আনুষ্ঠানিক যাচাইকরণ ইন্টিজার আন্ডারফ্লো এবং ওভারফ্লো, রি-এন্ট্রেন্সি, এবং দুর্বল গ্যাস অপ্টিমাইজেশনের মতো জটিল সমস্যাগুলি সনাক্ত করতে সক্ষম, যা অডিটর এবং টেস্টারদের চোখ এড়িয়ে যেতে পারে। + +#### কার্যকরী সঠিকতা প্রমাণ করুন {#prove-functional-correctness} + +প্রোগ্রাম টেস্টিং হল একটি স্মার্ট কন্ট্র্যাক্ট কিছু প্রয়োজনীয়তা পূরণ করে তা প্রমাণের সবচেয়ে সাধারণ পদ্ধতি। এর মধ্যে একটি কন্ট্র্যাক্টকে এটি যে ডেটা পরিচালনা করবে বলে আশা করা হয় তার একটি নমুনা দিয়ে এক্সিকিউট করা এবং এর আচরণ বিশ্লেষণ করা জড়িত। যদি কন্ট্র্যাক্টটি নমুনা ডেটার জন্য প্রত্যাশিত ফলাফল প্রদান করে, তবে ডেভেলপারদের কাছে এর সঠিকতার বস্তুনিষ্ঠ প্রমাণ থাকে। + +যাইহোক, এই পদ্ধতিটি এমন ইনপুট মানগুলির জন্য সঠিক এক্সিকিউশন প্রমাণ করতে পারে না যা নমুনার অংশ নয়। অতএব, একটি কন্ট্র্যাক্ট টেস্টিং বাগ সনাক্ত করতে সাহায্য করতে পারে (অর্থাৎ, যদি কিছু কোড পাথ এক্সিকিউশনের সময় কাঙ্ক্ষিত ফলাফল দিতে ব্যর্থ হয়), কিন্তু **এটি চূড়ান্তভাবে বাগের অনুপস্থিতি প্রমাণ করতে পারে না**। + +বিপরীতভাবে, আনুষ্ঠানিক যাচাইকরণ আনুষ্ঠানিকভাবে প্রমাণ করতে পারে যে একটি স্মার্ট কন্ট্র্যাক্ট কন্ট্র্যাক্টটি একেবারেই না চালিয়ে অসীম পরিসরের এক্সিকিউশনের জন্য প্রয়োজনীয়তা পূরণ করে। এর জন্য একটি আনুষ্ঠানিক স্পেসিফিকেশন তৈরি করতে হবে যা সঠিক কন্ট্র্যাক্ট আচরণগুলিকে অবিকলভাবে বর্ণনা করে এবং কন্ট্র্যাক্টের সিস্টেমের একটি আনুষ্ঠানিক (গাণিতিক) মডেল তৈরি করতে হবে। তারপর আমরা কন্ট্র্যাক্টের মডেল এবং এর স্পেসিফিকেশনের মধ্যে সঙ্গতি পরীক্ষা করার জন্য একটি আনুষ্ঠানিক প্রমাণ পদ্ধতি অনুসরণ করতে পারি। + +আনুষ্ঠানিক যাচাইকরণের মাধ্যমে, একটি কন্ট্র্যাক্টের ব্যবসায়িক যুক্তি প্রয়োজনীয়তা পূরণ করে কিনা তা যাচাই করার প্রশ্নটি একটি গাণিতিক প্রস্তাব যা প্রমাণ বা অপ্রমাণ করা যেতে পারে। একটি প্রস্তাবকে আনুষ্ঠানিকভাবে প্রমাণ করে, আমরা সসীম সংখ্যক ধাপে অসীম সংখ্যক টেস্ট কেস যাচাই করতে পারি। এই পদ্ধতিতে আনুষ্ঠানিক যাচাইকরণের একটি স্পেসিফিকেশনের সাপেক্ষে একটি কন্ট্র্যাক্ট কার্যকরীভাবে সঠিক প্রমাণ করার আরও ভাল সম্ভাবনা রয়েছে। + +#### আদর্শ যাচাইকরণ লক্ষ্য {#ideal-verification-targets} + +একটি যাচাইকরণ লক্ষ্য আনুষ্ঠানিকভাবে যাচাই করা হবে এমন সিস্টেমকে বর্ণনা করে। আনুষ্ঠানিক যাচাইকরণ "এম্বেডেড সিস্টেম" (সফ্টওয়্যারের ছোট, সহজ অংশ যা একটি বৃহত্তর সিস্টেমের অংশ গঠন করে) এ সবচেয়ে ভালভাবে ব্যবহৃত হয়। এগুলি বিশেষায়িত ডোমেনগুলির জন্যও আদর্শ যেগুলির নিয়ম কম, কারণ এটি ডোমেন-নির্দিষ্ট বৈশিষ্ট্য যাচাই করার জন্য টুলস পরিবর্তন করা সহজ করে তোলে। + +স্মার্ট কন্ট্র্যাক্ট—অন্তত, কিছু পরিমাণে—উভয় প্রয়োজনীয়তা পূরণ করে। উদাহরণস্বরূপ, ইথেরিয়াম কন্ট্র্যাক্টের ছোট আকার তাদের আনুষ্ঠানিক যাচাইকরণের জন্য উপযুক্ত করে তোলে। একইভাবে, EVM সহজ নিয়ম অনুসরণ করে, যা EVM-এ চলমান প্রোগ্রামগুলির জন্য সেমান্টিক বৈশিষ্ট্যগুলি নির্দিষ্ট করা এবং যাচাই করা সহজ করে তোলে। + +### দ্রুততর ডেভেলপমেন্ট চক্র {#faster-development-cycle} + +আনুষ্ঠানিক যাচাইকরণ কৌশল, যেমন মডেল চেকিং এবং সিম্বলিক এক্সিকিউশন, সাধারণত স্মার্ট কন্ট্র্যাক্ট কোডের নিয়মিত বিশ্লেষণের (টেস্টিং বা অডিটিংয়ের সময় সঞ্চালিত) চেয়ে বেশি কার্যকর। এর কারণ হল আনুষ্ঠানিক যাচাইকরণ দাবিগুলি পরীক্ষা করার জন্য সিম্বলিক মানের উপর নির্ভর করে ("যদি একজন ব্যবহারকারী _n_ ইথার উত্তোলন করার চেষ্টা করে?") টেস্টিং-এর বিপরীতে যা কংক্রিট মান ব্যবহার করে ("যদি একজন ব্যবহারকারী 5 ইথার উত্তোলন করার চেষ্টা করে?")। + +সিম্বলিক ইনপুট ভেরিয়েবলগুলি কংক্রিট মানগুলির একাধিক শ্রেণীকে কভার করতে পারে, তাই আনুষ্ঠানিক যাচাইকরণ পদ্ধতিগুলি একটি ছোট সময়সীমার মধ্যে আরও বেশি কোড কভারেজের প্রতিশ্রুতি দেয়। কার্যকরভাবে ব্যবহার করা হলে, আনুষ্ঠানিক যাচাইকরণ ডেভেলপারদের জন্য ডেভেলপমেন্ট চক্রকে ত্বরান্বিত করতে পারে। + +আনুষ্ঠানিক যাচাইকরণ ব্যয়বহুল ডিজাইন ত্রুটি হ্রাস করে ডিসেন্ট্রালাইজড এপ্লিকেশন (ডিএ্যাপস) তৈরির প্রক্রিয়াটিকেও উন্নত করে। দুর্বলতাগুলি ঠিক করার জন্য কন্ট্র্যাক্টগুলি আপগ্রেড করার (যেখানে সম্ভব) জন্য কোডবেসগুলির ব্যাপক पुनर्लेखन এবং ডেভেলপমেন্টে আরও বেশি প্রচেষ্টা ব্যয় করতে হয়। আনুষ্ঠানিক যাচাইকরণ কন্ট্র্যাক্ট বাস্তবায়নে অনেক ত্রুটি সনাক্ত করতে পারে যা টেস্টার এবং অডিটরদের চোখ এড়িয়ে যেতে পারে এবং একটি কন্ট্র্যাক্ট ডিপ্লয় করার আগে সেই সমস্যাগুলি সমাধান করার জন্য যথেষ্ট সুযোগ প্রদান করে। + +## আনুষ্ঠানিক যাচাইকরণের অসুবিধা {#drawbacks-of-formal-verification} + +### কায়িক শ্রমের খরচ {#cost-of-manual-labor} + +আনুষ্ঠানিক যাচাইকরণ, বিশেষত আধা-স্বয়ংক্রিয় যাচাইকরণ যেখানে একজন মানুষ সঠিকতার প্রমাণ পেতে প্রোভারকে গাইড করে, তার জন্য যথেষ্ট কায়িক শ্রম প্রয়োজন। উপরন্তু, আনুষ্ঠানিক স্পেসিফিকেশন তৈরি করা একটি জটিল কার্যকলাপ যা উচ্চ স্তরের দক্ষতার দাবি রাখে। + +এই কারণগুলি (প্রচেষ্টা এবং দক্ষতা) আনুষ্ঠানিক যাচাইকরণকে কন্ট্র্যাক্টে সঠিকতা মূল্যায়নের সাধারণ পদ্ধতি, যেমন টেস্টিং এবং অডিট, এর তুলনায় আরও বেশি দাবিদার এবং ব্যয়বহুল করে তোলে। তা সত্ত্বেও, স্মার্ট কন্ট্র্যাক্ট বাস্তবায়নে ত্রুটির খরচ বিবেচনা করে, একটি সম্পূর্ণ যাচাইকরণ অডিটের জন্য খরচ প্রদান করা বাস্তবসম্মত। + +### ফলস নেগেটিভ {#false-negatives} + +আনুষ্ঠানিক যাচাইকরণ কেবল এটিই পরীক্ষা করতে পারে যে স্মার্ট কন্ট্র্যাক্টের এক্সিকিউশন আনুষ্ঠানিক স্পেসিফিকেশনের সাথে মেলে কিনা। যেমন, এটি নিশ্চিত করা গুরুত্বপূর্ণ যে স্পেসিফিকেশনটি একটি স্মার্ট কন্ট্র্যাক্টের প্রত্যাশিত আচরণগুলি সঠিকভাবে বর্ণনা করে। + +যদি স্পেসিফিকেশনগুলি খারাপভাবে লেখা হয়, তবে সম্পত্তিগুলির লঙ্ঘন—যা দুর্বল এক্সিকিউশনের দিকে নির্দেশ করে—আনুষ্ঠানিক যাচাইকরণ অডিটের মাধ্যমে সনাক্ত করা যায় না। এই ক্ষেত্রে, একজন ডেভেলপার ভুলবশত ধরে নিতে পারেন যে কন্ট্র্যাক্টটি বাগ-মুক্ত। + +### পারফরম্যান্স সমস্যা {#performance-issues} + +আনুষ্ঠানিক যাচাইকরণ বেশ কিছু পারফরম্যান্স সমস্যার সম্মুখীন হয়। উদাহরণস্বরূপ, মডেল চেকিং এবং সিম্বলিক চেকিং-এর সময় যথাক্রমে সম্মুখীন হওয়া স্টেট এবং পাথ এক্সপ্লোশন সমস্যাগুলি যাচাইকরণ পদ্ধতিকে প্রভাবিত করতে পারে। এছাড়াও, আনুষ্ঠানিক যাচাইকরণ টুলগুলি প্রায়শই তাদের অন্তর্নিহিত লেয়ারে SMT সলভার এবং অন্যান্য কনস্ট্রেইন্ট সলভার ব্যবহার করে এবং এই সলভারগুলি গণনামূলকভাবে নিবিড় পদ্ধতির উপর নির্ভর করে। + +এছাড়াও, প্রোগ্রাম যাচাইকারীদের জন্য একটি সম্পত্তি (একটি যৌক্তিক সূত্র হিসাবে বর্ণিত) সন্তুষ্ট করা যেতে পারে কিনা তা নির্ধারণ করা সবসময় সম্ভব নয় (the "[decidability problem](https://en.wikipedia.org/wiki/Decision_problem)") কারণ একটি প্রোগ্রাম কখনও শেষ নাও হতে পারে। যেমন, একটি কন্ট্র্যাক্টের জন্য কিছু সম্পত্তি প্রমাণ করা অসম্ভব হতে পারে যদিও এটি ভালভাবে নির্দিষ্ট করা থাকে। + +## ইথেরিয়াম স্মার্ট কন্ট্র্যাক্টের জন্য আনুষ্ঠানিক যাচাইকরণ টুলস {#formal-verification-tools} + +### আনুষ্ঠানিক স্পেসিফিকেশন তৈরির জন্য স্পেসিফিকেশন ভাষা {#specification-languages} + +**Act**: __Act স্টোরেজ আপডেট, প্রি/পোস্ট কন্ডিশন এবং কন্ট্র্যাক্ট ইনভ্যারিয়েন্টের স্পেসিফিকেশনের অনুমতি দেয়।\*\* এর টুল স্যুটেও Coq, SMT সলভার, বা hevm-এর মাধ্যমে অনেক বৈশিষ্ট্য প্রমাণ করতে সক্ষম প্রুফ ব্যাকএন্ড রয়েছে।__ + +- [GitHub](https://github.com/ethereum/act) +- [নথিপত্র](https://github.com/argotorg/act) + +**Scribble** - __Scribble স্পেসিফিকেশন ভাষায় কোড টীকাগুলিকে কংক্রিট অ্যাসারশনে রূপান্তরিত করে যা স্পেসিফিকেশন পরীক্ষা করে।__ + +- [নথিপত্র](https://docs.scribble.codes/) + +**Dafny** - __Dafny একটি যাচাইকরণ-প্রস্তুত প্রোগ্রামিং ভাষা যা কোডের সঠিকতা সম্পর্কে যুক্তি ও প্রমাণ করার জন্য উচ্চ-স্তরের টীকাগুলির উপর নির্ভর করে।__ + +- [GitHub](https://github.com/dafny-lang/dafny) + +### সঠিকতা পরীক্ষা করার জন্য প্রোগ্রাম ভেরিফায়ার {#program-verifiers} + +**Certora Prover** - _Certora Prover স্মার্ট কন্ট্র্যাক্টে কোডের সঠিকতা পরীক্ষা করার জন্য একটি স্বয়ংক্রিয় আনুষ্ঠানিক যাচাইকরণ টুল। স্পেসিফিকেশনগুলি CVL (Certora Verification Language) এ লেখা হয়, যেখানে স্ট্যাটিক বিশ্লেষণ এবং কনস্ট্রেইন্ট-সলভিং এর সংমিশ্রণ ব্যবহার করে সম্পত্তি লঙ্ঘন সনাক্ত করা হয়।_ + +- [ওয়েবসাইট](https://www.certora.com/) +- [নথিপত্র](https://docs.certora.com/en/latest/index.html) + +**Solidity SMTChecker** - __সলিডিটির SMTChecker হল SMT (Satisfiability Modulo Theories) এবং Horn সলভিং-এর উপর ভিত্তি করে একটি অন্তর্নির্মিত মডেল চেকার।\*\* এটি নিশ্চিত করে যে একটি কন্ট্র্যাক্টের সোর্স কোড কম্পাইলেশনের সময় স্পেসিফিকেশনগুলির সাথে মেলে কিনা এবং নিরাপত্তা বৈশিষ্ট্যগুলির লঙ্ঘনের জন্য স্ট্যাটিকালি পরীক্ষা করে।__ + +- [GitHub](https://github.com/ethereum/solidity) + +**solc-verify** - __solc-verify হল সলিডিটি কম্পাইলারের একটি বর্ধিত সংস্করণ যা টীকা এবং মডুলার প্রোগ্রাম ভেরিফিকেশন ব্যবহার করে সলিডিটি কোডে স্বয়ংক্রিয় আনুষ্ঠানিক যাচাইকরণ সম্পাদন করতে পারে।__ + +- [GitHub](https://github.com/SRI-CSL/solidity) + +**KEVM** - __KEVM হল K ফ্রেমওয়ার্কে লেখা ইথেরিয়াম ভার্চুয়াল মেশিন (EVM)-এর একটি আনুষ্ঠানিক সেমান্টিকস।\*\* KEVM এক্সিকিউটেবল এবং রিচেবিলিটি লজিক ব্যবহার করে নির্দিষ্ট সম্পত্তি-সম্পর্কিত দাবি প্রমাণ করতে পারে।__ + +- [GitHub](https://github.com/runtimeverification/evm-semantics) +- [নথিপত্র](https://jellopaper.org/) + +### থিওরেম প্রুভিং-এর জন্য লজিক্যাল ফ্রেমওয়ার্ক {#theorem-provers} + +**Isabelle** - _Isabelle/HOL একটি প্রুফ অ্যাসিস্ট্যান্ট যা গাণিতিক সূত্রগুলিকে একটি আনুষ্ঠানিক ভাষায় প্রকাশ করতে দেয় এবং সেই সূত্রগুলি প্রমাণ করার জন্য টুলস সরবরাহ করে। প্রধান অ্যাপ্লিকেশন হল গাণিতিক প্রমাণের আনুষ্ঠানিকীকরণ এবং বিশেষ করে আনুষ্ঠানিক যাচাইকরণ, যার মধ্যে কম্পিউটার হার্ডওয়্যার বা সফ্টওয়্যারের সঠিকতা প্রমাণ করা এবং কম্পিউটার ভাষা এবং প্রোটোকলের বৈশিষ্ট্য প্রমাণ করা অন্তর্ভুক্ত।_ + +- [GitHub](https://github.com/isabelle-prover) +- [নথিপত্র](https://isabelle.in.tum.de/documentation.html) + +**Rocq** - _Rocq একটি ইন্টারেক্টিভ থিওরেম প্রোভার যা আপনাকে থিওরেম ব্যবহার করে প্রোগ্রাম সংজ্ঞায়িত করতে এবং ইন্টারেক্টিভভাবে সঠিকতার মেশিন-চেকড প্রমাণ তৈরি করতে দেয়।_ + +- [GitHub](https://github.com/rocq-prover/rocq) +- [নথিপত্র](https://rocq-prover.org/docs) + +### স্মার্ট কন্ট্র্যাক্টে দুর্বল প্যাটার্ন সনাক্ত করার জন্য সিম্বলিক এক্সিকিউশন-ভিত্তিক টুলস {#symbolic-execution-tools} + +**Manticore** - __সিম্বলিক এক্সিকিউশনের উপর ভিত্তি করে EVM বাইটকোড বিশ্লেষণ টুলের জন্য একটি টুল_।_ + +- [GitHub](https://github.com/trailofbits/manticore) +- [নথিপত্র](https://github.com/trailofbits/manticore/wiki) + +**hevm** - __hevm হল EVM বাইটকোডের জন্য একটি সিম্বলিক এক্সিকিউশন ইঞ্জিন এবং ইকুইভ্যালেন্স চেকার।__ + +- [GitHub](https://github.com/dapphub/dapptools/tree/master/src/hevm) + +**Mythril** - _ইথেরিয়াম স্মার্ট কন্ট্র্যাক্টে দুর্বলতা সনাক্ত করার জন্য একটি সিম্বলিক এক্সিকিউশন টুল_ + +- [GitHub](https://github.com/ConsenSys/mythril-classic) +- [নথিপত্র](https://mythril-classic.readthedocs.io/en/develop/) + +## আরও পড়ুন {#further-reading} + +- [স্মার্ট কন্ট্র্যাক্টের আনুষ্ঠানিক যাচাইকরণ কীভাবে কাজ করে](https://runtimeverification.com/blog/how-formal-verification-of-smart-contracts-works/) +- [কীভাবে আনুষ্ঠানিক যাচাইকরণ ত্রুটিহীন স্মার্ট কন্ট্র্যাক্ট নিশ্চিত করতে পারে](https://media.consensys.net/how-formal-verification-can-ensure-flawless-smart-contracts-cbda8ad99bd1) +- [ইথেরিয়াম ইকোসিস্টেমে আনুষ্ঠানিক যাচাইকরণ প্রকল্পগুলির একটি সংক্ষিপ্ত বিবরণ](https://github.com/leonardoalt/ethereum_formal_verification_overview) +- [ইথেরিয়াম 2.0 ডিপোজিট স্মার্ট কন্ট্র্যাক্টের এন্ড-টু-এন্ড আনুষ্ঠানিক যাচাইকরণ](https://runtimeverification.com/blog/end-to-end-formal-verification-of-ethereum-2-0-deposit-smart-contract/) +- [বিশ্বের সবচেয়ে জনপ্রিয় স্মার্ট কন্ট্র্যাক্টের আনুষ্ঠানিক যাচাইকরণ](https://www.zellic.io/blog/formal-verification-weth) +- [SMTChecker এবং আনুষ্ঠানিক যাচাইকরণ](https://docs.soliditylang.org/en/v0.8.15/smtchecker.html) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/index.md b/public/content/translations/bn/developers/docs/smart-contracts/index.md new file mode 100644 index 00000000000..1b7234b7e74 --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/index.md @@ -0,0 +1,112 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্টের ভূমিকা" +description: "স্মার্ট কন্ট্র্যাক্ট-এর একটি সংক্ষিপ্ত বিবরণ, তাদের অনন্য বৈশিষ্ট্য এবং সীমাবদ্ধতার উপর আলোকপাত করে।" +lang: bn +--- + +## স্মার্ট কন্ট্র্যাক্ট কি? {#what-is-a-smart-contract} + +"স্মার্ট কন্ট্র্যাক্ট" হলো একটি প্রোগ্রাম যা Ethereum ব্লকচেইনে চলে। এটি কোড (এর ফাংশন) এবং ডেটা (এর স্টেট)-এর একটি সংগ্রহ যা Ethereum ব্লকচেইনের একটি নির্দিষ্ট ঠিকানায় থাকে। + +স্মার্ট কন্ট্র্যাক্ট হলো এক ধরনের [Ethereum অ্যাকাউন্ট](/developers/docs/accounts/)। এর মানে হলো তাদের একটি ব্যালেন্স আছে এবং লেনদেনের লক্ষ্য হতে পারে। তবে এগুলো কোনো ব্যবহারকারী দ্বারা নিয়ন্ত্রিত হয় না, বরং এগুলো নেটওয়ার্কে স্থাপন করা হয় এবং প্রোগ্রাম অনুযায়ী চলে। ব্যবহারকারীর অ্যাকাউন্টগুলি তখন স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করতে পারে এমন লেনদেন জমা দিয়ে যা স্মার্ট কন্ট্র্যাক্টে সংজ্ঞায়িত একটি ফাংশন সম্পাদন করে। স্মার্ট কন্ট্র্যাক্টগুলি একটি নিয়মিত চুক্তির মতো নিয়ম সংজ্ঞায়িত করতে পারে এবং কোডের মাধ্যমে স্বয়ংক্রিয়ভাবে সেগুলি প্রয়োগ করতে পারে। স্মার্ট কন্ট্র্যাক্ট ডিফল্টরূপে মুছে ফেলা যায় না এবং তাদের সাথে ইন্টারঅ্যাকশন অপরিবর্তনীয়। + +## পূর্বশর্ত {#prerequisites} + +আপনি যদি সবে শুরু করেন বা একটি কম প্রযুক্তিগত ভূমিকা খুঁজছেন, আমরা আমাদের [স্মার্ট কন্ট্র্যাক্টের ভূমিকা](/smart-contracts/) পড়ার পরামর্শ দিই। + +স্মার্ট কন্ট্র্যাক্টের জগতে প্রবেশ করার আগে নিশ্চিত করুন যে আপনি [অ্যাকাউন্ট](/developers/docs/accounts/), [লেনদেন](/developers/docs/transactions/) এবং [ইথিরিয়াম ভার্চুয়াল মেশিন](/developers/docs/evm/) সম্পর্কে পড়েছেন। + +## একটি ডিজিটাল ভেন্ডিং মেশিন {#a-digital-vending-machine} + +[নিক জাবো](https://unenumerated.blogspot.com/) দ্বারা বর্ণিত একটি ভেন্ডিং মেশিন সম্ভবত স্মার্ট কন্ট্র্যাক্টের জন্য সেরা রূপক। সঠিক ইনপুট দিলে, একটি নির্দিষ্ট আউটপুট নিশ্চিত। + +একটি ভেন্ডিং মেশিন থেকে একটি স্ন্যাক পেতে: + +``` +টাকা + স্ন্যাক নির্বাচন = স্ন্যাক বিতরণ +``` + +এই যুক্তিটি ভেন্ডিং মেশিনে প্রোগ্রাম করা আছে। + +একটি স্মার্ট কন্ট্র্যাক্ট, একটি ভেন্ডিং মেশিনের মতো, এর মধ্যে যুক্তি প্রোগ্রাম করা থাকে। এখানে একটি সহজ উদাহরণ দেওয়া হল যে এই ভেন্ডিং মেশিনটি যদি Solidity-তে লেখা একটি স্মার্ট কন্ট্র্যাক্ট হতো তবে কেমন দেখাতো: + +```solidity +pragma solidity 0.8.7; + +contract VendingMachine { + + // কন্ট্র্যাক্টের স্টেট ভেরিয়েবল ঘোষণা করুন + address public owner; + mapping (address => uint) public cupcakeBalances; + + // যখন 'VendingMachine' কন্ট্র্যাক্ট স্থাপন করা হয়: + // 1. স্থাপনকারী ঠিকানাকে কন্ট্র্যাক্টের মালিক হিসেবে সেট করুন + // 2. স্থাপন করা স্মার্ট কন্ট্র্যাক্টের কাপকেক ব্যালেন্স 100 এ সেট করুন + constructor() { + owner = msg.sender; + cupcakeBalances[address(this)] = 100; + } + + // মালিককে স্মার্ট কন্ট্র্যাক্টের কাপকেক ব্যালেন্স বাড়ানোর অনুমতি দিন + function refill(uint amount) public { + require(msg.sender == owner, "শুধুমাত্র মালিক রিফিল করতে পারবেন।"); + cupcakeBalances[address(this)] += amount; + } + + // যে কাউকে কাপকেক কেনার অনুমতি দিন + function purchase(uint amount) public payable { + require(msg.value >= amount * 1 ether, "প্রতি কাপকেকের জন্য আপনাকে কমপক্ষে 1 ETH দিতে হবে"); + require(cupcakeBalances[address(this)] >= amount, "এই কেনাকাটা সম্পূর্ণ করার জন্য স্টকে যথেষ্ট কাপকেক নেই"); + cupcakeBalances[address(this)] -= amount; + cupcakeBalances[msg.sender] += amount; + } +} +``` + +যেভাবে একটি ভেন্ডিং মেশিন একজন বিক্রেতা কর্মচারীর প্রয়োজনীয়তা দূর করে, সেভাবেই স্মার্ট কন্ট্র্যাক্ট অনেক শিল্পে মধ্যস্থতাকারীদের প্রতিস্থাপন করতে পারে। + +## অনুমতিহীন {#permissionless} + +যে কেউ একটি স্মার্ট কন্ট্র্যাক্ট লিখতে এবং নেটওয়ার্কে এটি স্থাপন করতে পারে। আপনার শুধু একটি [স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ](/developers/docs/smart-contracts/languages/)-এ কোড করতে শেখা প্রয়োজন এবং আপনার কন্ট্র্যাক্ট স্থাপন করার জন্য যথেষ্ট ETH থাকতে হবে। একটি স্মার্ট কন্ট্র্যাক্ট স্থাপন করা প্রযুক্তিগতভাবে একটি লেনদেন, তাই আপনাকে [গ্যাস](/developers/docs/gas/) দিতে হবে ঠিক যেমন একটি সাধারণ ETH স্থানান্তরের জন্য গ্যাস দিতে হয়। তবে, কন্ট্র্যাক্ট স্থাপনের জন্য গ্যাসের খরচ অনেক বেশি। + +স্মার্ট কন্ট্র্যাক্ট লেখার জন্য Ethereum-এর ডেভেলপার-বান্ধব ভাষা রয়েছে: + +- Solidity +- Vyper + +[ভাষা সম্পর্কে আরও জানুন](/developers/docs/smart-contracts/languages/) + +তবে, এগুলি স্থাপন করার আগে কম্পাইল করতে হবে যাতে Ethereum-এর ভার্চুয়াল মেশিন কন্ট্র্যাক্টটিকে ব্যাখ্যা এবং সংরক্ষণ করতে পারে। [কম্পাইলেশন সম্পর্কে আরও জানুন](/developers/docs/smart-contracts/compiling/) + +## কম্পোজেবিলিটি {#composability} + +স্মার্ট কন্ট্র্যাক্টগুলি Ethereum-এ পাবলিক এবং সেগুলিকে ওপেন API হিসাবে ভাবা যেতে পারে। এর মানে হল আপনি আপনার নিজের স্মার্ট কন্ট্র্যাক্টে অন্যান্য স্মার্ট কন্ট্র্যাক্টকে কল করতে পারেন যা সম্ভব তার পরিধিকে ব্যাপকভাবে প্রসারিত করতে। কন্ট্র্যাক্টগুলি এমনকি অন্যান্য কন্ট্র্যাক্টও স্থাপন করতে পারে। + +[স্মার্ট কন্ট্র্যাক্ট কম্পোজেবিলিটি](/developers/docs/smart-contracts/composability/) সম্পর্কে আরও জানুন। + +## সীমাবদ্ধতা {#limitations} + +স্মার্ট কন্ট্র্যাক্টগুলি একা "বাস্তব-বিশ্বের" ঘটনা সম্পর্কে তথ্য পেতে পারে না কারণ তারা অফচেইন উৎস থেকে ডেটা পুনরুদ্ধার করতে পারে না। এর মানে হল তারা বাস্তব জগতের ঘটনাগুলিতে সাড়া দিতে পারে না। এটি ডিজাইন দ্বারাই করা হয়েছে। বাহ্যিক তথ্যের উপর নির্ভর করা কনসেন্সাসকে বিপন্ন করতে পারে, যা নিরাপত্তা এবং বিকেন্দ্রীকরণের জন্য গুরুত্বপূর্ণ। + +তবে, ব্লকচেইন অ্যাপ্লিকেশনগুলির জন্য অফচেইন ডেটা ব্যবহার করতে পারাটা গুরুত্বপূর্ণ। সমাধান হল [ ওরাকল](/developers/docs/oracles/) যা এমন টুলস যা অফচেইন ডেটা গ্রহণ করে এবং স্মার্ট কন্ট্র্যাক্ট-এর জন্য উপলব্ধ করে। + +স্মার্ট কন্ট্র্যাক্টের আরেকটি সীমাবদ্ধতা হল সর্বোচ্চ কন্ট্র্যাক্টের আকার। একটি স্মার্ট কন্ট্র্যাক্ট সর্বোচ্চ 24KB হতে পারে নতুবা এটি গ্যাসের অভাবে চলবে না। এটি [The Diamond Pattern](https://eips.ethereum.org/EIPS/eip-2535) ব্যবহার করে এড়ানো যেতে পারে। + +## মাল্টিসিগ কন্ট্র্যাক্ট {#multisig} + +মাল্টিসিগ (একাধিক-স্বাক্ষর) কন্ট্র্যাক্টগুলি হলো স্মার্ট কন্ট্র্যাক্ট অ্যাকাউন্ট যার একটি লেনদেন সম্পাদনের জন্য একাধিক বৈধ স্বাক্ষর প্রয়োজন। প্রচুর পরিমাণে ইথার বা অন্যান্য টোকেন ধারণকারী কন্ট্র্যাক্টের জন্য ব্যর্থতার একক পয়েন্ট এড়াতে এটি খুব দরকারী। মাল্টিসিগগুলি কন্ট্র্যাক্ট সম্পাদন এবং কী ম্যানেজমেন্টের দায়িত্ব একাধিক পক্ষের মধ্যে ভাগ করে দেয় এবং একটিমাত্র প্রাইভেট কী-এর ক্ষতি থেকে তহবিলের অপরিবর্তনীয় ক্ষতি প্রতিরোধ করে। এই কারণগুলির জন্য, মাল্টিসিগ কন্ট্র্যাক্টগুলি সাধারণ DAO গভর্নেন্সের জন্য ব্যবহার করা যেতে পারে। মাল্টিসিগগুলি কার্যকর করার জন্য M সম্ভাব্য গ্রহণযোগ্য স্বাক্ষরগুলির মধ্যে N টি স্বাক্ষর প্রয়োজন (যেখানে N ≤ M, এবং M > 1)। `N = 3, M = 5` এবং `N = 4, M = 7` সাধারণত ব্যবহৃত হয়। একটি 4/7 মাল্টিসিগ-এর জন্য সাতটি সম্ভাব্য বৈধ স্বাক্ষরের মধ্যে চারটি প্রয়োজন। এর মানে হল তিনটি স্বাক্ষর হারিয়ে গেলেও তহবিল এখনও পুনরুদ্ধারযোগ্য। এই ক্ষেত্রে, এর মানে হল যে কন্ট্র্যাক্ট কার্যকর করার জন্য বেশিরভাগ কী-হোল্ডারদের অবশ্যই সম্মত হতে হবে এবং স্বাক্ষর করতে হবে। + +## স্মার্ট কন্ট্র্যাক্ট রিসোর্স {#smart-contract-resources} + +**OpenZeppelin Contracts -** **_সুরক্ষিত স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্টের জন্য লাইব্রেরি।_** + +- [openzeppelin.com/contracts/](https://openzeppelin.com/contracts/) +- [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) +- [কমিউনিটি ফোরাম](https://forum.openzeppelin.com/c/general/16) + +## আরও পড়ুন {#further-reading} + +- [Coinbase: স্মার্ট কন্ট্র্যাক্ট কি?](https://www.coinbase.com/learn/crypto-basics/what-is-a-smart-contract) +- [Chainlink: স্মার্ট কন্ট্র্যাক্ট কি?](https://chain.link/education/smart-contracts) +- [ভিডিও: সহজ ভাষায় ব্যাখ্যা - স্মার্ট কন্ট্র্যাক্ট](https://youtu.be/ZE2HxTmxfrI) +- [Cyfrin Updraft: Web3 লার্নিং এবং অডিটিং প্ল্যাটফর্ম](https://updraft.cyfrin.io) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/languages/index.md b/public/content/translations/bn/developers/docs/smart-contracts/languages/index.md new file mode 100644 index 00000000000..7d4299c8a7e --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/languages/index.md @@ -0,0 +1,339 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ" +description: "দুটি প্রধান স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ – Solidity এবং Vyper-এর একটি সংক্ষিপ্ত বিবরণ এবং তুলনা।" +lang: bn +--- + +Ethereum-এর একটি চমৎকার দিক হলো, স্মার্ট কন্ট্র্যাক্টগুলোকে তুলনামূলকভাবে ডেভেলপার-বান্ধব ল্যাঙ্গুয়েজ ব্যবহার করে প্রোগ্রাম করা যায়। আপনি যদি Python বা যেকোনো [কার্লি-ব্র্যাকেট ল্যাঙ্গুয়েজ](https://wikipedia.org/wiki/List_of_programming_languages_by_type#Curly-bracket_languages)-এ অভিজ্ঞ হন, তাহলে আপনি পরিচিত সিনট্যাক্সসহ একটি ল্যাঙ্গুয়েজ খুঁজে পেতে পারেন। + +দুটি সর্বাধিক সক্রিয় এবং রক্ষণাবেক্ষণ করা ল্যাঙ্গুয়েজ হলো: + +- Solidity +- Vyper + +Remix IDE, Solidity এবং Vyper উভয় ক্ষেত্রেই কন্ট্র্যাক্ট তৈরি এবং পরীক্ষা করার জন্য একটি ব্যাপক ডেভেলপমেন্ট এনভায়রনমেন্ট সরবরাহ করে। কোডিং শুরু করতে [ইন-ব্রাউজার Remix IDE ব্যবহার করে দেখুন](https://remix.ethereum.org)। + +আরও অভিজ্ঞ ডেভেলপাররাও Yul, [ইথিরিয়াম ভার্চুয়াল মেশিন](/developers/docs/evm/)-এর জন্য একটি মধ্যবর্তী ল্যাঙ্গুয়েজ, অথবা Yul+, যা Yul-এর একটি এক্সটেনশন, ব্যবহার করতে চাইতে পারেন। + +আপনি যদি কৌতূহলী হন এবং এমন নতুন ল্যাঙ্গুয়েজ পরীক্ষা করতে সাহায্য করতে চান যা এখনও ব্যাপকভাবে ডেভলপ করা হচ্ছে, তাহলে আপনি Fe নিয়ে পরীক্ষা করতে পারেন, এটি একটি উদীয়মান স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ যা বর্তমানে এখনও শৈশবাবস্থায় রয়েছে। + +## পূর্বশর্ত {#prerequisites} + +প্রোগ্রামিং ল্যাঙ্গুয়েজের, বিশেষ করে JavaScript বা Python-এর পূর্ববর্তী জ্ঞান, আপনাকে স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজগুলোর পার্থক্য বুঝতে সাহায্য করতে পারে। ল্যাঙ্গুয়েজগুলোর তুলনার গভীরে যাওয়ার আগে আমরা আপনাকে একটি ধারণা হিসেবে স্মার্ট কন্ট্র্যাক্টগুলো বোঝারও পরামর্শ দিই। [স্মার্ট কন্ট্র্যাক্টের ভূমিকা](/developers/docs/smart-contracts/)। + +## Solidity {#solidity} + +- স্মার্ট কন্ট্র্যাক্ট বাস্তবায়নের জন্য অবজেক্ট-ওরিয়েন্টেড, হাই-লেভেল ল্যাঙ্গুয়েজ। +- কার্লি-ব্র্যাকেট ল্যাঙ্গুয়েজ যা C++ দ্বারা সবচেয়ে গভীরভাবে প্রভাবিত। +- স্ট্যাটিক্যালি টাইপড (কম্পাইল করার সময় একটি ভেরিয়েবলের টাইপ জানা যায়)। +- সাপোর্ট করে: + - ইনহেরিটেন্স (আপনি অন্যান্য কন্ট্র্যাক্টকে প্রসারিত করতে পারেন)। + - লাইব্রেরি (আপনি পুনঃব্যবহারযোগ্য কোড তৈরি করতে পারেন যা আপনি বিভিন্ন কন্ট্র্যাক্ট থেকে কল করতে পারেন – যেমন অন্যান্য অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে একটি স্ট্যাটিক ক্লাসের স্ট্যাটিক ফাংশন)। + - জটিল ব্যবহারকারী-সংজ্ঞায়িত টাইপ। + +### গুরুত্বপূর্ণ লিঙ্ক {#important-links} + +- [নথিপত্র](https://docs.soliditylang.org/en/latest/) +- [Solidity ল্যাঙ্গুয়েজ পোর্টাল](https://soliditylang.org/) +- [Solidity by Example](https://docs.soliditylang.org/en/latest/solidity-by-example.html) +- [GitHub](https://github.com/ethereum/solidity/) +- [Solidity Gitter চ্যাটরুম](https://gitter.im/ethereum/solidity) [Solidity Matrix চ্যাটরুম](https://matrix.to/#/#ethereum_solidity:gitter.im)-এর সাথে ব্রিজ করা +- [চিট শিট](https://reference.auditless.com/cheatsheet) +- [Solidity ব্লগ](https://blog.soliditylang.org/) +- [Solidity টুইটার](https://twitter.com/solidity_lang) + +### উদাহরণ কন্ট্র্যাক্ট {#example-contract} + +```solidity +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >= 0.7.0; + +contract Coin { + // "public" কীওয়ার্ডটি ভেরিয়েবলগুলোকে + // অন্যান্য কন্ট্র্যাক্ট থেকে অ্যাক্সেসযোগ্য করে তোলে + address public minter; + mapping (address => uint) public balances; + + // ইভেন্টগুলো ক্লায়েন্টদের আপনার ঘোষিত নির্দিষ্ট + // কন্ট্র্যাক্ট পরিবর্তনে প্রতিক্রিয়া জানাতে দেয় + event Sent(address from, address to, uint amount); + + // কন্সট্রাক্টর কোড শুধুমাত্র তখনই চলে যখন কন্ট্র্যাক্টটি + // তৈরি করা হয় + constructor() { + minter = msg.sender; + } + + // একটি ঠিকানায় নতুন তৈরি করা কয়েনের একটি পরিমাণ পাঠায় + // শুধুমাত্র কন্ট্র্যাক্ট সৃষ্টিকর্তা দ্বারা কল করা যেতে পারে + function mint(address receiver, uint amount) public { + require(msg.sender == minter); + require(amount < 1e60); + balances[receiver] += amount; + } + + // যেকোনো কলার থেকে একটি ঠিকানায় + // বিদ্যমান কয়েনের একটি পরিমাণ পাঠায় + function send(address receiver, uint amount) public { + require(amount <= balances[msg.sender], "অপর্যাপ্ত ব্যালেন্স।"); + balances[msg.sender] -= amount; + balances[receiver] += amount; + emit Sent(msg.sender, receiver, amount); + } +} +``` + +এই উদাহরণটি আপনাকে Solidity কন্ট্র্যাক্টের সিনট্যাক্স কেমন সে সম্পর্কে একটি ধারণা দেবে। ফাংশন এবং ভেরিয়েবলগুলোর আরও বিস্তারিত বিবরণের জন্য, [ডকুমেন্টেশন দেখুন](https://docs.soliditylang.org/en/latest/contracts.html)। + +## Vyper {#vyper} + +- পাইথনিক প্রোগ্রামিং ল্যাঙ্গুয়েজ +- স্ট্রং টাইপিং +- ছোট এবং বোধগম্য কম্পাইলার কোড +- দক্ষ বাইটকোড জেনারেশন +- কন্ট্র্যাক্টগুলোকে আরও সুরক্ষিত এবং অডিট করা সহজ করার লক্ষ্যে এতে ইচ্ছাকৃতভাবে Solidity-এর চেয়ে কম বৈশিষ্ট্য রয়েছে। Vyper সাপোর্ট করে না: + - মডিফায়ার + - ইনহেরিটেন্স + - ইনলাইন অ্যাসেম্বলি + - ফাংশন ওভারলোডিং + - অপারেটর ওভারলোডিং + - রিকার্সিভ কলিং + - অসীম দৈর্ঘ্যের লুপ + - বাইনারি ফিক্সড পয়েন্ট + +আরও তথ্যের জন্য, [Vyper-এর মূলনীতি পড়ুন](https://vyper.readthedocs.io/en/latest/index.html)। + +### গুরুত্বপূর্ণ লিঙ্ক {#important-links-1} + +- [নথিপত্র](https://vyper.readthedocs.io) +- [Vyper by Example](https://vyper.readthedocs.io/en/latest/vyper-by-example.html) +- [More Vyper by Example](https://vyper-by-example.org/) +- [GitHub](https://github.com/vyperlang/vyper) +- [Vyper কমিউনিটি ডিসকর্ড চ্যাট](https://discord.gg/SdvKC79cJk) +- [চিট শিট](https://reference.auditless.com/cheatsheet) +- [Vyper-এর জন্য স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্ট ফ্রেমওয়ার্ক এবং টুলস](/developers/docs/programming-languages/python/) +- [VyperPunk - Vyper স্মার্ট কন্ট্র্যাক্ট সুরক্ষিত করতে এবং হ্যাক করতে শিখুন](https://github.com/SupremacyTeam/VyperPunk) +- [ডেভেলপমেন্টের জন্য Vyper হাব](https://github.com/zcor/vyper-dev) +- [Vyper গ্রেটেস্ট হিটস স্মার্ট কন্ট্র্যাক্টের উদাহরণ](https://github.com/pynchmeister/vyper-greatest-hits/tree/main/contracts) +- [অসাধারণ Vyper কিউরেটেড রিসোর্স](https://github.com/spadebuilders/awesome-vyper) + +### উদাহরণ {#example} + +```python +# ওপেন অকশন + +# অকশনের প্যারামিটার + +# বেনিফিশিয়ারি সর্বোচ্চ দরদাতার কাছ থেকে টাকা পায় + +beneficiary: public(address) +auctionStart: public(uint256) +auctionEnd: public(uint256) + +# অকশনের বর্তমান অবস্থা + +highestBidder: public(address) +highestBid: public(uint256) + +# শেষে true তে সেট করা হয়, কোনো পরিবর্তন নিষিদ্ধ করে + +ended: public(bool) + +# রিফান্ড করা বিডগুলোর হিসাব রাখুন যাতে আমরা উইথড্র প্যাটার্ন অনুসরণ করতে পারি + +pendingReturns: public(HashMap[address, uint256]) + +# `_beneficiary` ঠিকানার পক্ষ থেকে `_bidding_time` + +# সেকেন্ড বিডিং সময় সহ একটি সাধারণ অকশন তৈরি করুন। + +@external +def __init__(_beneficiary: address, _bidding_time: uint256): + self.beneficiary = _beneficiary + self.auctionStart = block.timestamp + self.auctionEnd = self.auctionStart + _bidding_time + +# এই লেনদেনের সাথে পাঠানো ভ্যালু দিয়ে অকশনে বিড করুন। + +# অকশন না জিতলে শুধুমাত্র ভ্যালুটি + +# রিফান্ড করা হবে। + +@external +@payable +def bid(): + # বিডিংয়ের সময়সীমা শেষ হয়েছে কিনা তা পরীক্ষা করুন। + assert block.timestamp < self.auctionEnd + # বিড যথেষ্ট বেশি কিনা তা পরীক্ষা করুন + assert msg.value > self.highestBid + # আগের উচ্চ দরদাতার জন্য রিফান্ডের হিসাব রাখুন + self.pendingReturns[self.highestBidder] += self.highestBid + # নতুন উচ্চ বিডের হিসাব রাখুন + self.highestBidder = msg.sender + self.highestBid = msg.value + +# পূর্বে রিফান্ড করা একটি বিড উইথড্র করুন। উইথড্র প্যাটার্নটি + +# এখানে একটি নিরাপত্তা সমস্যা এড়াতে ব্যবহার করা হয়েছে। যদি রিফান্ডগুলো সরাসরি + +# bid() এর অংশ হিসাবে পাঠানো হতো, একটি ক্ষতিকারক বিডিং কন্ট্র্যাক্ট + +# সেই রিফান্ডগুলো ব্লক করতে পারত এবং এভাবে নতুন উচ্চতর বিড আসা ব্লক করে দিত। + +@external +def withdraw(): + pending_amount: uint256 = self.pendingReturns[msg.sender] + self.pendingReturns[msg.sender] = 0 + send(msg.sender, pending_amount) + +# অকশন শেষ করুন এবং সর্বোচ্চ বিড + +# বেনিফিশিয়ারির কাছে পাঠান। + +@external +def endAuction(): + # অন্যান্য কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করে এমন ফাংশনগুলোকে গঠন করার জন্য এটি একটি ভালো নির্দেশিকা + # (যেমন, তারা ফাংশন কল করে বা ইথার পাঠায়) + # তিনটি পর্যায়ে: + # ১. শর্তাবলী পরীক্ষা করা + # ২. কাজ সম্পাদন করা (সম্ভাব্য শর্তাবলী পরিবর্তন করা) + # ৩. অন্যান্য কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করা + # যদি এই পর্যায়গুলো মিশ্রিত হয়, তবে অন্য কন্ট্র্যাক্টটি + # বর্তমান কন্ট্র্যাক্টে আবার কল করতে পারে এবং স্টেট পরিবর্তন করতে পারে বা + # একাধিকবার এফেক্ট (ইথার পেআউট) সম্পাদন করতে পারে। + # যদি অভ্যন্তরীণভাবে কল করা ফাংশনগুলোতে এক্সটার্নাল + # কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাকশন অন্তর্ভুক্ত থাকে, তবে সেগুলোকে + # এক্সটার্নাল কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাকশন হিসেবেও বিবেচনা করতে হবে। + + # ১. শর্তাবলী + # অকশনের শেষ সময় পৌঁছেছে কিনা তা পরীক্ষা করুন + assert block.timestamp >= self.auctionEnd + # এই ফাংশনটি ইতিমধ্যে কল করা হয়েছে কিনা তা পরীক্ষা করুন + assert not self.ended + + # ২. এফেক্টস + self.ended = True + + # ৩. ইন্টারঅ্যাকশন + send(self.beneficiary, self.highestBid) +``` + +এই উদাহরণটি আপনাকে Vyper কন্ট্র্যাক্টের সিনট্যাক্স কেমন সে সম্পর্কে একটি ধারণা দেবে। ফাংশন এবং ভেরিয়েবলগুলোর আরও বিস্তারিত বিবরণের জন্য, [ডকুমেন্টেশন দেখুন](https://vyper.readthedocs.io/en/latest/vyper-by-example.html#simple-open-auction)। + +## Yul and Yul+ {#yul} + +আপনি যদি Ethereum-এ নতুন হন এবং এখনও স্মার্ট কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ দিয়ে কোনো কোডিং না করে থাকেন, তবে আমরা Solidity বা Vyper দিয়ে শুরু করার পরামর্শ দিই। আপনি স্মার্ট কন্ট্র্যাক্টের নিরাপত্তার সেরা অনুশীলন এবং EVM-এর সাথে কাজ করার নির্দিষ্ট বিষয়গুলোর সাথে পরিচিত হওয়ার পরেই কেবল Yul বা Yul+ নিয়ে দেখুন। + +**Yul** + +- Ethereum-এর জন্য মধ্যবর্তী ল্যাঙ্গুয়েজ। +- [EVM](/developers/docs/evm) এবং [Ewasm](https://github.com/ewasm), যা একটি Ethereum ফ্লেভারযুক্ত WebAssembly, সাপোর্ট করে এবং এটি উভয় প্ল্যাটফর্মের একটি ব্যবহারযোগ্য সাধারণ ডিনোমিনেটর হিসাবে ডিজাইন করা হয়েছে। +- উচ্চ-স্তরের অপ্টিমাইজেশন পর্যায়ের জন্য ভালো টার্গেট যা EVM এবং Ewasm উভয় প্ল্যাটফর্মকে সমানভাবে উপকৃত করতে পারে। + +**Yul+** + +- Yul-এর একটি নিম্ন-স্তরের, অত্যন্ত দক্ষ এক্সটেনশন। +- প্রাথমিকভাবে একটি [অপ্টিমেস্টিক রোলআপ](/developers/docs/scaling/optimistic-rollups/) কন্ট্র্যাক্টের জন্য ডিজাইন করা হয়েছে। +- Yul+-কে Yul-এর একটি পরীক্ষামূলক আপগ্রেড প্রস্তাব হিসাবে দেখা যেতে পারে, যা এতে নতুন বৈশিষ্ট্য যুক্ত করে। + +### গুরুত্বপূর্ণ লিঙ্ক {#important-links-2} + +- [Yul নথিপত্র](https://docs.soliditylang.org/en/latest/yul.html) +- [Yul+ নথিপত্র](https://github.com/fuellabs/yulp) +- [Yul+ পরিচিতি পোস্ট](https://medium.com/@fuellabs/introducing-yul-a-new-low-level-language-for-ethereum-aa64ce89512f) + +### উদাহরণ কন্ট্র্যাক্ট {#example-contract-2} + +নিম্নলিখিত সহজ উদাহরণটি একটি পাওয়ার ফাংশন বাস্তবায়ন করে। `solc --strict-assembly --bin input.yul` ব্যবহার করে এটি কম্পাইল করা যেতে পারে। উদাহরণটি +input.yul ফাইলে সংরক্ষণ করা উচিত। + +``` +{ + function power(base, exponent) -> result + { + switch exponent + case 0 { result := 1 } + case 1 { result := base } + default + { + result := power(mul(base, base), div(exponent, 2)) + if mod(exponent, 2) { result := mul(base, result) } + } + } + let res := power(calldataload(0), calldataload(32)) + mstore(0, res) + return(0, 32) +} +``` + +আপনি যদি ইতিমধ্যেই স্মার্ট কন্ট্র্যাক্টে বেশ অভিজ্ঞ হন, তাহলে Yul-এ একটি সম্পূর্ণ ERC20 ইমপ্লিমেন্টেশন [এখানে](https://solidity.readthedocs.io/en/latest/yul.html#complete-erc20-example) পাওয়া যাবে। + +## Fe {#fe} + +- ইথিরিয়াম ভার্চুয়াল মেশিন (EVM)-এর জন্য স্ট্যাটিক্যালি টাইপড ল্যাঙ্গুয়েজ। +- Python এবং Rust দ্বারা অনুপ্রাণিত। +- শেখা সহজ করার লক্ষ্য রাখে -- এমনকি Ethereum ইকোসিস্টেমে নতুন ডেভেলপারদের জন্যও। +- Fe-এর ডেভেলপমেন্ট এখনও প্রাথমিক পর্যায়ে রয়েছে, ল্যাঙ্গুয়েজটির আলফা রিলিজ হয়েছিল জানুয়ারী ২০২১-এ। + +### গুরুত্বপূর্ণ লিঙ্ক {#important-links-3} + +- [GitHub](https://github.com/ethereum/fe) +- [Fe ঘোষণা](https://snakecharmers.ethereum.org/fe-a-new-language-for-the-ethereum-ecosystem/) +- [Fe 2021 রোডম্যাপ](https://notes.ethereum.org/LVhaTF30SJOpkbG1iVw1jg) +- [Fe ডিসকর্ড চ্যাট](https://discord.com/invite/ywpkAXFjZH) +- [Fe টুইটার](https://twitter.com/official_fe) + +### উদাহরণ কন্ট্র্যাক্ট {#example-contract-3} + +নিম্নলিখিতটি Fe-তে বাস্তবায়িত একটি সাধারণ কন্ট্র্যাক্ট। + +``` +type BookMsg = bytes[100] + +contract GuestBook: + pub guest_book: map + + event Signed: + book_msg: BookMsg + + pub def sign(book_msg: BookMsg): + self.guest_book[msg.sender] = book_msg + + emit Signed(book_msg=book_msg) + + pub def get_msg(addr: address) -> BookMsg: + return self.guest_book[addr].to_mem() + +``` + +## কীভাবে বেছে নেবেন {#how-to-choose} + +অন্যান্য যেকোনো প্রোগ্রামিং ল্যাঙ্গুয়েজের মতোই, এটি মূলত সঠিক কাজের জন্য সঠিক টুল বেছে নেওয়ার এবং সেইসাথে ব্যক্তিগত পছন্দের বিষয়। + +আপনি যদি এখনও কোনো ল্যাঙ্গুয়েজ চেষ্টা না করে থাকেন, তবে এখানে কয়েকটি বিষয় বিবেচনা করার জন্য দেওয়া হল: + +### Solidity-র চমৎকার দিকগুলো কী? {#solidity-advantages} + +- আপনি যদি একজন শিক্ষানবিস হন, তাহলে অনেক টিউটোরিয়াল এবং শেখার টুলস রয়েছে। এ সম্পর্কে আরও দেখুন [কোডিং করে শিখুন](/developers/learning-tools/) বিভাগে। +- ভালো ডেভেলপার টুলিং উপলব্ধ। +- Solidity-র একটি বড় ডেভেলপার কমিউনিটি রয়েছে, যার মানে হল আপনি খুব সম্ভবত আপনার প্রশ্নের উত্তর বেশ দ্রুত খুঁজে পাবেন। + +### Vyper-এর চমৎকার দিকগুলো কী? {#vyper-advatages} + +- Python ডেভেলপারদের জন্য শুরু করার দারুণ উপায়, যারা স্মার্ট কন্ট্র্যাক্ট লিখতে চান। +- Vyper-এ কম সংখ্যক বৈশিষ্ট্য রয়েছে যা এটিকে দ্রুত আইডিয়া প্রোটোটাইপ করার জন্য চমৎকার করে তোলে। +- Vyper-এর লক্ষ্য হল অডিট করা সহজ এবং সর্বাধিক মানব-পাঠযোগ্য হওয়া। + +### Yul এবং Yul+-এর চমৎকার দিকগুলো কী? {#yul-advantages} + +- সরল এবং কার্যকরী নিম্ন-স্তরের ল্যাঙ্গুয়েজ। +- এটি র' EVM-এর অনেক কাছাকাছি যাওয়ার সুযোগ দেয়, যা আপনার কন্ট্র্যাক্টগুলোর গ্যাস ব্যবহার অপ্টিমাইজ করতে সাহায্য করতে পারে। + +## ল্যাঙ্গুয়েজগুলোর তুলনা {#language-comparisons} + +বেসিক সিনট্যাক্স, কন্ট্র্যাক্ট লাইফসাইকেল, ইন্টারফেস, অপারেটর, ডেটা স্ট্রাকচার, ফাংশন, কন্ট্রোল ফ্লো এবং আরও অনেক কিছুর তুলনার জন্য Auditless-এর এই [চিটশিটটি](https://reference.auditless.com/cheatsheet/) দেখুন + +## আরও পড়ুন {#further-reading} + +- [OpenZeppelin-এর Solidity কন্ট্র্যাক্টস লাইব্রেরি](https://docs.openzeppelin.com/contracts/5.x/) +- [Solidity by Example](https://solidity-by-example.org) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/libraries/index.md b/public/content/translations/bn/developers/docs/smart-contracts/libraries/index.md new file mode 100644 index 00000000000..7c34a01492a --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/libraries/index.md @@ -0,0 +1,117 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট লাইব্রেরিসমূহ" +description: "আপনার Ethereum ডেভেলপমেন্ট প্রজেক্টগুলোকে ত্বরান্বিত করতে পুনঃব্যবহারযোগ্য স্মার্ট কন্ট্র্যাক্ট লাইব্রেরি এবং বিল্ডিং ব্লক আবিষ্কার করুন।" +lang: bn +--- + +আপনার প্রজেক্টের প্রতিটি স্মার্ট কন্ট্র্যাক্ট স্ক্র্যাচ থেকে লেখার দরকার নেই। অনেক ওপেন সোর্স স্মার্ট কন্ট্র্যাক্ট লাইব্রেরি রয়েছে যা আপনার প্রজেক্টের জন্য পুনঃব্যবহারযোগ্য বিল্ডিং ব্লক সরবরাহ করে যা আপনাকে নতুন করে চাকা আবিষ্কার করা থেকে বাঁচাতে পারে। + +## পূর্বশর্ত {#prerequisites} + +স্মার্ট কন্ট্র্যাক্ট লাইব্রেরিতে ঝাঁপিয়ে পড়ার আগে, একটি স্মার্ট কন্ট্র্যাক্টের গঠন সম্পর্কে একটি ভালো ধারণা থাকা জরুরি। আপনি যদি এখনও এটি না করে থাকেন তাহলে [স্মার্ট কন্ট্র্যাক্টের অ্যানাটমি](/developers/docs/smart-contracts/anatomy/) তে যান। + +## একটি লাইব্রেরিতে কী আছে {#whats-in-a-library} + +আপনি সাধারণত স্মার্ট কন্ট্র্যাক্ট লাইব্রেরিতে দুই ধরণের বিল্ডিং ব্লক খুঁজে পেতে পারেন: পুনঃব্যবহারযোগ্য আচরণ যা আপনি আপনার কন্ট্র্যাক্টে যোগ করতে পারেন, এবং বিভিন্ন স্ট্যান্ডার্ডের বাস্তবায়ন। + +### আচরণ {#behaviors} + +স্মার্ট কন্ট্র্যাক্ট লেখার সময়, একটি ভালো সম্ভাবনা রয়েছে যে আপনি নিজেকে বারবার একই ধরনের প্যাটার্ন লিখতে দেখবেন, যেমন একটি কন্ট্র্যাক্টে সুরক্ষিত অপারেশন চালানোর জন্য একটি _admin_ অ্যাড্রেস বরাদ্দ করা, অথবা একটি অপ্রত্যাশিত সমস্যার ক্ষেত্রে একটি জরুরি _pause_ বোতাম যোগ করা। + +স্মার্ট কন্ট্র্যাক্ট লাইব্রেরি সাধারণত এই আচরণগুলির পুনঃব্যবহারযোগ্য বাস্তবায়ন Solidity-তে [লাইব্রেরি](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#libraries) হিসাবে বা [ইনহেরিটেন্স](https://solidity.readthedocs.io/en/v0.7.2/contracts.html#inheritance) এর মাধ্যমে সরবরাহ করে। + +উদাহরণস্বরূপ, নিচে [OpenZeppelin কন্ট্র্যাক্টস লাইব্রেরি](https://github.com/OpenZeppelin/openzeppelin-contracts) থেকে [`Ownable` কন্ট্র্যাক্টের](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.2.0/contracts/access/Ownable.sol) একটি সরলীকৃত সংস্করণ দেওয়া হলো, যা একটি কন্ট্র্যাক্টের মালিক হিসাবে একটি অ্যাড্রেসকে মনোনীত করে, এবং শুধুমাত্র সেই মালিকের কাছে একটি পদ্ধতির অ্যাক্সেস সীমাবদ্ধ করার জন্য একটি মডিফায়ার সরবরাহ করে। + +```solidity +contract Ownable { + address public owner; + + constructor() internal { + owner = msg.sender; + } + + modifier onlyOwner() { + require(owner == msg.sender, "Ownable: আহ্বানকারী মালিক নন"); + _; + } +} +``` + +আপনার কন্ট্র্যাক্টে এই ধরনের একটি বিল্ডিং ব্লক ব্যবহার করার জন্য, আপনাকে প্রথমে এটি ইমপোর্ট করতে হবে এবং তারপরে আপনার নিজের কন্ট্র্যাক্টে এটি থেকে এক্সটেন্ড করতে হবে। এটি আপনাকে আপনার নিজের ফাংশন সুরক্ষিত করতে বেস `Ownable` কন্ট্র্যাক্ট দ্বারা প্রদত্ত মডিফায়ার ব্যবহার করার অনুমতি দেবে। + +```solidity +import ".../Ownable.sol"; // ইমপোর্ট করা লাইব্রেরির পাথ + +contract MyContract is Ownable { + // নিম্নলিখিত ফাংশনটি শুধুমাত্র মালিক দ্বারা কল করা যেতে পারে + function secured() onlyOwner public { + msg.sender.transfer(1 ether); + } +} +``` + +আরেকটি জনপ্রিয় উদাহরণ হল [SafeMath](https://docs.openzeppelin.com/contracts/3.x/utilities#math) বা [DsMath](https://dappsys.readthedocs.io/en/latest/ds_math.html)। এগুলি হল লাইব্রেরি (বেস কন্ট্র্যাক্টের বিপরীতে) যা ওভারফ্লো চেক সহ গাণিতিক ফাংশন সরবরাহ করে, যা ভাষা দ্বারা সরবরাহ করা হয় না। আপনার কন্ট্র্যাক্টকে ওভারফ্লো থেকে রক্ষা করার জন্য নেটিভ গাণিতিক ক্রিয়াকলাপের পরিবর্তে এই লাইব্রেরিগুলির যেকোনো একটি ব্যবহার করা একটি ভালো অভ্যাস, যার বিপর্যয়কর পরিণতি হতে পারে! + +### স্ট্যান্ডার্ড {#standards} + +[কম্পোজেবিলিটি এবং ইন্টারঅপারেবিলিটি](/developers/docs/smart-contracts/composability/) সহজতর করার জন্য, Ethereum কমিউনিটি **ERC** আকারে বেশ কয়েকটি স্ট্যান্ডার্ড সংজ্ঞায়িত করেছে। আপনি [স্ট্যান্ডার্ড](/developers/docs/standards/) বিভাগে তাদের সম্পর্কে আরও পড়তে পারেন। + +আপনার কন্ট্র্যাক্টের অংশ হিসাবে একটি ERC অন্তর্ভুক্ত করার সময়, নিজের তৈরি করার চেষ্টা না করে স্ট্যান্ডার্ড বাস্তবায়ন খোঁজা একটি ভালো ধারণা। অনেক স্মার্ট কন্ট্র্যাক্ট লাইব্রেরিতে সবচেয়ে জনপ্রিয় ERC-গুলির জন্য বাস্তবায়ন অন্তর্ভুক্ত রয়েছে। উদাহরণস্বরূপ, সর্বত্র বিদ্যমান [ERC20 ফাঞ্জিবল টোকেন স্ট্যান্ডার্ড](/developers/tutorials/understand-the-erc-20-token-smart-contract/) [HQ20](https://github.com/HQ20/contracts/blob/master/contracts/token/README.md), [DappSys](https://github.com/dapphub/ds-token/) এবং [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc20)-এ পাওয়া যাবে। এছাড়াও, কিছু ERC নিজেই ERC-এর অংশ হিসাবে ক্যানোনিকাল বাস্তবায়ন প্রদান করে। + +এটি উল্লেখ করার মতো যে কিছু ERC স্বতন্ত্র নয়, তবে অন্যান্য ERC-এর সংযোজন। উদাহরণস্বরূপ, [ERC2612](https://eips.ethereum.org/EIPS/eip-2612) এর ব্যবহারযোগ্যতা উন্নত করার জন্য ERC20-তে একটি এক্সটেনশন যোগ করে। + +## কীভাবে একটি লাইব্রেরি যোগ করবেন {#how-to} + +আপনার প্রজেক্টে কীভাবে অন্তর্ভুক্ত করবেন তার নির্দিষ্ট নির্দেশাবলীর জন্য আপনি যে লাইব্রেরিটি অন্তর্ভুক্ত করছেন তার নথিপত্র দেখুন। বেশ কয়েকটি Solidity কন্ট্র্যাক্ট লাইব্রেরি `npm` ব্যবহার করে প্যাকেজ করা হয়, তাই আপনি শুধু `npm install` করে সেগুলিকে ইনস্টল করতে পারেন। কন্ট্র্যাক্ট [কম্পাইল](/developers/docs/smart-contracts/compiling/) করার জন্য বেশিরভাগ টুল আপনার `node_modules`-এ স্মার্ট কন্ট্র্যাক্ট লাইব্রেরি খুঁজবে, তাই আপনি নিম্নলিখিতটি করতে পারেন: + +```solidity +// এটি আপনার node_modules থেকে @openzeppelin/contracts লাইব্রেরি লোড করবে +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; + +contract MyNFT is ERC721 { + constructor() ERC721("MyNFT", "MNFT") public { } +} +``` + +আপনি যে পদ্ধতিই ব্যবহার করুন না কেন, একটি লাইব্রেরি অন্তর্ভুক্ত করার সময়, সর্বদা [ভাষা](/developers/docs/smart-contracts/languages/) সংস্করণের দিকে নজর রাখুন। উদাহরণস্বরূপ, আপনি যদি Solidity 0.5-এ আপনার কন্ট্র্যাক্টগুলি লেখেন তবে আপনি Solidity 0.6-এর জন্য একটি লাইব্রেরি ব্যবহার করতে পারবেন না। + +## কখন ব্যবহার করবেন {#when-to-use} + +আপনার প্রজেক্টের জন্য একটি স্মার্ট কন্ট্র্যাক্ট লাইব্রেরি ব্যবহার করার বেশ কিছু সুবিধা আছে। প্রথম এবং সর্বাগ্রে, এটি আপনাকে ব্যবহারের জন্য প্রস্তুত বিল্ডিং ব্লক সরবরাহ করে আপনার সময় বাঁচায় যা আপনি আপনার সিস্টেমে অন্তর্ভুক্ত করতে পারেন, বরং সেগুলিকে নিজে কোড করার পরিবর্তে। + +নিরাপত্তাও একটি বড় প্লাস। ওপেন সোর্স স্মার্ট কন্ট্র্যাক্ট লাইব্রেরিগুলিও প্রায়শই ব্যাপকভাবে যাচাই করা হয়। যেহেতু অনেক প্রজেক্ট তাদের উপর নির্ভর করে, সেহেতু কমিউনিটির পক্ষ থেকে সেগুলিকে অবিরাম পর্যালোচনার অধীনে রাখার জন্য একটি শক্তিশালী প্রেরণা রয়েছে। পুনঃব্যবহারযোগ্য কন্ট্র্যাক্ট লাইব্রেরির চেয়ে অ্যাপ্লিকেশন কোডে ত্রুটি খুঁজে পাওয়া অনেক বেশি সাধারণ। কিছু লাইব্রেরি অতিরিক্ত নিরাপত্তার জন্য [বাহ্যিক অডিট](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/audits) এর মধ্য দিয়েও যায়। + +তবে, স্মার্ট কন্ট্র্যাক্ট লাইব্রেরি ব্যবহার করলে আপনার প্রজেক্টে এমন কোড অন্তর্ভুক্ত করার ঝুঁকি থাকে যার সাথে আপনি পরিচিত নন। একটি কন্ট্র্যাক্ট ইমপোর্ট করে সরাসরি আপনার প্রজেক্টে অন্তর্ভুক্ত করা লোভনীয়, কিন্তু সেই কন্ট্র্যাক্টটি কী করে সে সম্পর্কে ভালো ধারণা ছাড়া, আপনি একটি অপ্রত্যাশিত আচরণের কারণে অনিচ্ছাকৃতভাবে আপনার সিস্টেমে একটি সমস্যা তৈরি করতে পারেন। আপনি যে কোডটি ইমপোর্ট করছেন তার নথিপত্র পড়তে সর্বদা নিশ্চিত হন, এবং তারপর এটিকে আপনার প্রজেক্টের অংশ করার আগে কোডটি নিজেই পর্যালোচনা করুন! + +সবশেষে, একটি লাইব্রেরি অন্তর্ভুক্ত করার সিদ্ধান্ত নেওয়ার সময়, এর সামগ্রিক ব্যবহার বিবেচনা করুন। একটি ব্যাপকভাবে গৃহীত লাইব্রেরির সুবিধা হলো একটি বৃহত্তর কমিউনিটি থাকা এবং সমস্যাগুলির জন্য আরও বেশি চোখ এটির দিকে নজর রাখা। স্মার্ট কন্ট্র্যাক্ট দিয়ে তৈরি করার সময় নিরাপত্তাই আপনার প্রধান ফোকাস হওয়া উচিত! + +## সম্পর্কিত টুলস {#related-tools} + +**OpenZeppelin Contracts -** **_সুরক্ষিত স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্টের জন্য সবচেয়ে জনপ্রিয় লাইব্রেরি।_** + +- [নথিপত্র](https://docs.openzeppelin.com/contracts/) +- [GitHub](https://github.com/OpenZeppelin/openzeppelin-contracts) +- [কমিউনিটি ফোরাম](https://forum.openzeppelin.com/c/general/16) + +**DappSys -** **_স্মার্ট-কন্ট্র্যাক্টের জন্য নিরাপদ, সহজ, নমনীয় বিল্ডিং-ব্লক।_** + +- [নথিপত্র](https://dappsys.readthedocs.io/) +- [GitHub](https://github.com/dapphub/dappsys) + +**HQ20 -** **_কন্ট্র্যাক্ট, লাইব্রেরি এবং উদাহরণ সহ একটি Solidity প্রজেক্ট যা আপনাকে বাস্তব বিশ্বের জন্য সম্পূর্ণ বৈশিষ্ট্যযুক্ত ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন তৈরি করতে সাহায্য করে।_** + +- [GitHub](https://github.com/HQ20/contracts) + +**thirdweb Solidity SDK -** **_দক্ষভাবে কাস্টম স্মার্ট কন্ট্র্যাক্ট তৈরি করার জন্য প্রয়োজনীয় টুলস সরবরাহ করে_** + +- [নথিপত্র](https://portal.thirdweb.com/contracts/build/overview) +- [GitHub](https://github.com/thirdweb-dev/contracts) + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [Ethereum ডেভেলপারদের জন্য নিরাপত্তা বিবেচনা](/developers/docs/smart-contracts/security/) _– লাইব্রেরি ব্যবহার সহ স্মার্ট কন্ট্র্যাক্ট তৈরি করার সময় নিরাপত্তা বিবেচনার উপর একটি টিউটোরিয়াল।_ +- [ERC-20 টোকেন স্মার্ট কন্ট্র্যাক্ট বুঝুন](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _-একাধিক লাইব্রেরি দ্বারা প্রদত্ত ERC20 স্ট্যান্ডার্ডের উপর টিউটোরিয়াল।_ + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/smart-contracts/naming/index.md b/public/content/translations/bn/developers/docs/smart-contracts/naming/index.md new file mode 100644 index 00000000000..b03d4a49f48 --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/naming/index.md @@ -0,0 +1,101 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট-এর নামকরণ" +description: "ENS-এর মাধ্যমে Ethereum স্মার্ট কন্ট্র্যাক্ট-এর নামকরণের জন্য সেরা অনুশীলন" +lang: bn +--- + +স্মার্ট কন্ট্র্যাক্টগুলি Ethereum-এর বিকেন্দ্রীভূত পরিকাঠামোর একটি ভিত্তি, যা স্বায়ত্তশাসিত অ্যাপ্লিকেশন এবং প্রোটোকল সক্ষম করে। কিন্তু চুক্তির ক্ষমতা বিকশিত হওয়ার সাথে সাথেও, ব্যবহারকারী এবং ডেভেলপাররা এখনও এই চুক্তিগুলি সনাক্ত করতে এবং রেফারেন্স করতে কাঁচা হেক্সাডেসিমেল ঠিকানার উপর নির্ভর করে। + +[Ethereum Name Service (ENS)](https://ens.domains/)-এর মাধ্যমে স্মার্ট কন্ট্র্যাক্ট-এর নামকরণ হেক্সাডেসিমেল কন্ট্র্যাক্টের ঠিকানা দূর করে ব্যবহারকারীর অভিজ্ঞতা উন্নত করে এবং ঠিকানা বিষক্রিয়া এবং স্পুফিং আক্রমণের মতো আক্রমণ থেকে ঝুঁকি কমায়। এই নির্দেশিকা ব্যাখ্যা করে কেন স্মার্ট কন্ট্র্যাক্ট-এর নামকরণ গুরুত্বপূর্ণ, এটি কীভাবে প্রয়োগ করা যেতে পারে, এবং [Enscribe](https://www.enscribe.xyz) এর মতো উপলব্ধ টুলস যা প্রক্রিয়াটিকে সহজ করতে এবং ডেভেলপারদের এই অনুশীলনটি গ্রহণ করতে সাহায্য করে। + +## কেন স্মার্ট কন্ট্র্যাক্ট-এর নামকরণ করবেন? {#why-name-contracts} + +### মানুষের পাঠযোগ্য শনাক্তকারী {#human-readable-identifiers} + +`0x8f8e...f9e3`-এর মতো অস্বচ্ছ কন্ট্র্যাক্টের ঠিকানার সাথে ইন্টারঅ্যাক্ট করার পরিবর্তে, ডেভেলপার এবং ব্যবহারকারীরা `v2.myapp.eth`-এর মতো মানুষের পাঠযোগ্য নাম ব্যবহার করতে পারেন। এটি স্মার্ট কন্ট্র্যাক্ট ইন্টারঅ্যাকশনকে সহজ করে। + +এটি [Ethereum Name Service](https://ens.domains/)-এর মাধ্যমে সম্ভব হয়েছে যা Ethereum ঠিকানার জন্য একটি বিকেন্দ্রীভূত নামকরণের পরিষেবা প্রদান করে। এটি ডোমেন নেম সার্ভিস (DNS) এর অনুরূপ যা ইন্টারনেটের ব্যবহারকারীদের `104.18.176.152` এর মতো আইপি ঠিকানার পরিবর্তে ethereum.org এর মতো একটি নাম ব্যবহার করে নেটওয়ার্ক ঠিকানা অ্যাক্সেস করতে সক্ষম করে। + +### উন্নত নিরাপত্তা এবং বিশ্বাস {#improved-security-and-trust} + +নামযুক্ত চুক্তিগুলি ভুল ঠিকানায় দুর্ঘটনাজনিত লেনদেন কমাতে সাহায্য করে। এগুলি ব্যবহারকারীদের নির্দিষ্ট অ্যাপ বা ব্র্যান্ডের সাথে যুক্ত চুক্তিগুলি সনাক্ত করতেও সাহায্য করে। এটি খ্যাতির বিশ্বাসের একটি স্তর যোগ করে, বিশেষ করে যখন নামগুলি `uniswap.eth`-এর মতো সুপরিচিত মূল ডোমেনের সাথে সংযুক্ত থাকে। + +Ethereum ঠিকানার 42-অক্ষরের দৈর্ঘ্যের কারণে, ব্যবহারকারীদের পক্ষে ঠিকানায় ছোট পরিবর্তনগুলি সনাক্ত করা খুব কঠিন, যেখানে কয়েকটি অক্ষর পরিবর্তন করা হয়েছে। উদাহরণস্বরূপ, `0x58068646C148E313CB414E85d2Fe89dDc3426870`-এর মতো একটি ঠিকানা সাধারণত ওয়ালেটের মতো ব্যবহারকারী-মুখী অ্যাপ্লিকেশন দ্বারা `0x580...870`-তে ছোট করা হয়। একজন ব্যবহারকারীর এমন একটি দূষিত ঠিকানা লক্ষ্য করার সম্ভাবনা কম যেখানে কয়েকটি অক্ষর পরিবর্তন করা হয়েছে। + +এই ধরনের কৌশল ঠিকানা স্পুফিং এবং বিষপ্রয়োগের আক্রমণে ব্যবহৃত হয় যেখানে ব্যবহারকারীদের বিশ্বাস করানো হয় যে তারা সঠিক ঠিকানায় ইন্টারঅ্যাক্ট করছে বা তহবিল পাঠাচ্ছে, যখন বাস্তবে ঠিকানাটি কেবল সঠিক ঠিকানার অনুরূপ, কিন্তু একই নয়। + +ওয়ালেট এবং কন্ট্র্যাক্টের জন্য ENS নামগুলি এই ধরণের আক্রমণ থেকে রক্ষা করে। DNS স্পুফিং অ্যাটাকের মতো, ENS স্পুফিং অ্যাটাকও হতে পারে, তবে, একজন ব্যবহারকারী হেক্সাডেসিমেল ঠিকানায় একটি ছোট পরিবর্তনের চেয়ে ENS নামে একটি ভুল বানান লক্ষ্য করার সম্ভাবনা বেশি। + +### ওয়ালেট এবং এক্সপ্লোরারদের জন্য আরও ভালো UX {#better-ux} + +যখন একটি স্মার্ট কন্ট্র্যাক্ট একটি ENS নামের সাথে কনফিগার করা হয়, তখন ওয়ালেট এবং ব্লকচেইন এক্সপ্লোরারের মতো অ্যাপগুলির জন্য হেক্সাডেসিমেল ঠিকানার পরিবর্তে স্মার্ট কন্ট্র্যাক্টের জন্য ENS নাম প্রদর্শন করা সম্ভব। এটি ব্যবহারকারীদের জন্য একটি উল্লেখযোগ্য ব্যবহারকারী অভিজ্ঞতা (UX) উন্নতি প্রদান করে। + +উদাহরণস্বরূপ, Uniswap-এর মতো একটি অ্যাপের সাথে ইন্টারঅ্যাক্ট করার সময়, ব্যবহারকারীরা সাধারণত দেখতে পাবেন যে তারা যে অ্যাপটির সাথে ইন্টারঅ্যাক্ট করছেন সেটি `uniswap.org` ওয়েবসাইটে হোস্ট করা হয়েছে, কিন্তু যদি Uniswap তাদের স্মার্ট কন্ট্র্যাক্টগুলির নাম ENS-এর সাথে না রাখে তবে তাদের একটি হেক্সাডেসিমেল কন্ট্র্যাক্ট ঠিকানা দেখানো হবে। যদি কন্ট্র্যাক্টটির নাম দেওয়া হয়, তাহলে তারা `v4.contracts.uniswap.eth` দেখতে পাবে যা অনেক বেশি কার্যকর। + +## ডিপ্লয়মেন্টের সময় নামকরণ বনাম পোস্ট-ডিপ্লয়মেন্ট নামকরণ {#when-to-name} + +দুটি পয়েন্ট আছে যেখানে স্মার্ট কন্ট্র্যাক্টের নামকরণ করা যেতে পারে: + +- **ডিপ্লয়মেন্টের সময়**: কন্ট্র্যাক্টটি ডিপ্লয় করার সময় একটি ENS নাম বরাদ্দ করা। +- **ডিপ্লয়মেন্টের পরে**: একটি বিদ্যমান কন্ট্র্যাক্ট ঠিকানাকে একটি নতুন ENS নামে ম্যাপ করা। + +উভয় পদ্ধতির জন্য একটি ENS ডোমেনে মালিক বা পরিচালকের অ্যাক্সেসের প্রয়োজন হয় যাতে তারা ENS রেকর্ড তৈরি এবং সেট করতে পারে। + +## কন্ট্র্যাক্টের জন্য ENS নামকরণ কীভাবে কাজ করে {#how-ens-naming-works} + +ENS নামগুলি অনচেইনে সংরক্ষণ করা হয় এবং ENS সমাধানকারীদের মাধ্যমে Ethereum ঠিকানায় সমাধান করা হয়। একটি স্মার্ট কন্ট্র্যাক্টের নামকরণ করতে: + +1. একটি মূল ENS ডোমেইন নিবন্ধন বা নিয়ন্ত্রণ করুন (যেমন `myapp.eth`) +2. একটি সাবডোমেন তৈরি করুন (যেমন `v1.myapp.eth`) +3. সাবডোমেনের `address` রেকর্ডটি কন্ট্র্যাক্টের ঠিকানায় সেট করুন +4. ENS-এ কন্ট্র্যাক্টের রিভার্স রেকর্ড সেট করুন যাতে এর ঠিকানার মাধ্যমে নামটি খুঁজে পাওয়া যায় + +ENS নামগুলি শ্রেণিবদ্ধ এবং সীমাহীন উপ-নাম সমর্থন করে। এই রেকর্ডগুলি সেট করার জন্য সাধারণত ENS রেজিস্ট্রি এবং পাবলিক সমাধানকারী কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করা জড়িত। + +## কন্ট্র্যাক্টের নামকরণের জন্য টুলস {#tools} + +স্মার্ট কন্ট্র্যাক্টের নামকরণের দুটি পদ্ধতি আছে। হয় কিছু ম্যানুয়াল পদক্ষেপ সহ [ENS অ্যাপ](https://app.ens.domains) ব্যবহার করে, অথবা [Enscribe](https://www.enscribe.xyz) ব্যবহার করে। এগুলি নীচে বর্ণিত হয়েছে। + +### ম্যানুয়াল ENS সেটআপ {#manual-ens-setup} + +[ENS অ্যাপ](https://app.ens.domains/) ব্যবহার করে, ডেভেলপাররা ম্যানুয়ালি উপ-নাম তৈরি করতে পারে এবং ফরওয়ার্ড ঠিকানা রেকর্ড সেট করতে পারে। যাইহোক, তারা ENS অ্যাপের মাধ্যমে নামের জন্য রিভার্স রেকর্ড সেট করে একটি স্মার্ট কন্ট্র্যাক্টের জন্য একটি প্রাথমিক নাম সেট করতে পারে না। ম্যানুয়াল পদক্ষেপ নিতে হবে যা [ENS ডক্স](https://docs.ens.domains/web/naming-contracts/)-এ কভার করা হয়েছে। + +### Enscribe {#enscribe} + +[Enscribe](https://www.enscribe.xyz) ENS-এর মাধ্যমে স্মার্ট কন্ট্র্যাক্টের নামকরণ সহজ করে, এবং স্মার্ট কন্ট্র্যাক্টে ব্যবহারকারীর বিশ্বাস বাড়ায়। এটি প্রদান করে: + +- **অ্যাটমিক ডিপ্লয়মেন্ট এবং নামকরণ**: একটি নতুন কন্ট্র্যাক্ট ডিপ্লয় করার সময় একটি ENS নাম বরাদ্দ করুন +- **পোস্ট-ডিপ্লয়মেন্ট নামকরণ**: ইতিমধ্যে-ডিপ্লয় করা কন্ট্র্যাক্টের সাথে নাম সংযুক্ত করুন +- **মাল্টি-চেইন সমর্থন**: Ethereum এবং L2 নেটওয়ার্ক জুড়ে কাজ করে যেখানে ENS সমর্থিত +- **কন্ট্র্যাক্ট যাচাইকরণ ডেটা**: ব্যবহারকারীদের জন্য বিশ্বাস বাড়াতে একাধিক উৎস থেকে প্রাপ্ত কন্ট্র্যাক্ট যাচাইকরণ ডেটা অন্তর্ভুক্ত করে + +Enscribe ব্যবহারকারীদের দ্বারা প্রদত্ত ENS নাম সমর্থন করে, অথবা যদি ব্যবহারকারীর কোনো ENS নাম না থাকে তবে তার নিজস্ব ডোমেন। + +আপনি স্মার্ট কন্ট্র্যাক্টের নামকরণ এবং দেখার জন্য [Enscribe অ্যাপ](https://app.enscribe.xyz) অ্যাক্সেস করতে পারেন। + +## সেরা অনুশীলন {#best-practices} + +- **পরিষ্কার, সংস্করণযুক্ত নাম ব্যবহার করুন** যেমন `v1.myapp.eth` কন্ট্র্যাক্ট আপগ্রেডগুলিকে স্বচ্ছ করতে +- **রিভার্স রেকর্ড সেট করুন** ওয়ালেট এবং ব্লকচেইন এক্সপ্লোরারের মতো অ্যাপে দৃশ্যমানতার জন্য কন্ট্র্যাক্টগুলিকে ENS নামের সাথে লিঙ্ক করতে। +- **মেয়াদ শেষ হওয়ার তারিখগুলি ঘনিষ্ঠভাবে পর্যবেক্ষণ করুন** যদি আপনি মালিকানায় দুর্ঘটনাজনিত পরিবর্তন রোধ করতে চান +- **কন্ট্র্যাক্টের উৎস যাচাই করুন** যাতে ব্যবহারকারীরা বিশ্বাস করতে পারে যে নামযুক্ত কন্ট্র্যাক্টটি প্রত্যাশিতভাবে আচরণ করে + +## ঝুঁকি {#risks} + +স্মার্ট কন্ট্র্যাক্টের নামকরণ Ethereum-এর ব্যবহারকারীদের জন্য উল্লেখযোগ্য সুবিধা প্রদান করে, তবে, ENS ডোমেনের মালিকদের তাদের ব্যবস্থাপনার ক্ষেত্রে সতর্ক থাকতে হবে। উল্লেখযোগ্য ঝুঁকির মধ্যে রয়েছে: + +- **মেয়াদ শেষ হওয়া**: DNS নামের মতোই, ENS নামের নিবন্ধনগুলি সীমিত সময়ের জন্য হয়। তাই মালিকদের তাদের ডোমেনের মেয়াদ শেষ হওয়ার তারিখগুলি পর্যবেক্ষণ করা এবং মেয়াদ শেষ হওয়ার অনেক আগেই সেগুলি নবায়ন করা অত্যাবশ্যক। ENS অ্যাপ এবং Enscribe উভয়ই ডোমেনের মালিকদের জন্য মেয়াদ শেষ হওয়ার সময় ভিজ্যুয়াল ইন্ডিকেটর সরবরাহ করে। +- **মালিকানায় পরিবর্তন**: ENS রেকর্ডগুলি Ethereum-এ NFT হিসাবে উপস্থাপিত হয়, যেখানে একটি নির্দিষ্ট `.eth` ডোমেনের মালিকের দখলে সংশ্লিষ্ট NFT থাকে। সুতরাং যদি কোনো ভিন্ন অ্যাকাউন্ট এই NFT-এর মালিকানা নেয়, নতুন মালিক তাদের ইচ্ছামতো যেকোনো ENS রেকর্ড পরিবর্তন করতে পারে। + +এই ধরনের ঝুঁকি কমাতে, `.eth` ২য় স্তরের ডোমেনের (2LD) মালিকের অ্যাকাউন্ট একটি মাল্টি-সিগ ওয়ালেটের মাধ্যমে সুরক্ষিত করা উচিত এবং কন্ট্র্যাক্টের নামকরণ পরিচালনার জন্য সাবডোমেন তৈরি করা উচিত। এইভাবে সাবডোমেন স্তরে মালিকানায় কোনো দুর্ঘটনাজনিত বা দূষিত পরিবর্তনের ক্ষেত্রে, সেগুলি 2LD মালিক দ্বারা ওভাররাইড করা যেতে পারে। + +## কন্ট্র্যাক্ট নামকরণের ভবিষ্যৎ {#future} + +কন্ট্র্যাক্টের নামকরণ ড্যাপ ডেভেলপমেন্টের জন্য একটি সেরা অনুশীলন হয়ে উঠছে, যেমনভাবে ডোমেন নামগুলি ওয়েবে আইপি ঠিকানা প্রতিস্থাপন করেছে। ওয়ালেট, এক্সপ্লোরার এবং ড্যাশবোর্ডের মতো আরও পরিকাঠামো কন্ট্র্যাক্টের জন্য ENS রেজোলিউশনকে একীভূত করার সাথে সাথে, নামযুক্ত কন্ট্র্যাক্টগুলি নিরাপত্তা উন্নত করবে এবং ইকোসিস্টেম জুড়ে ত্রুটিগুলি হ্রাস করবে। + +স্মার্ট কন্ট্র্যাক্টগুলিকে সহজে চেনা এবং সে সম্পর্কে যুক্তি তৈরি করার মাধ্যমে, নামকরণ Ethereum-এর ব্যবহারকারী এবং অ্যাপগুলির মধ্যে ব্যবধান পূরণ করতে সাহায্য করে, ব্যবহারকারীদের জন্য নিরাপত্তা এবং UX উভয়ই উন্নত করে। + +## আরও পড়ুন {#further-reading} + +- [ENS-এর মাধ্যমে স্মার্ট কন্ট্র্যাক্ট-এর নামকরণ](https://docs.ens.domains/web/naming-contracts/) +- [Enscribe-এর মাধ্যমে স্মার্ট কন্ট্র্যাক্ট-এর নামকরণ](https://www.enscribe.xyz/docs)। diff --git a/public/content/translations/bn/developers/docs/smart-contracts/security/index.md b/public/content/translations/bn/developers/docs/smart-contracts/security/index.md new file mode 100644 index 00000000000..86b4e6b01ef --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/security/index.md @@ -0,0 +1,575 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট সুরক্ষা" +description: "সুরক্ষিত ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট তৈরির জন্য নির্দেশাবলীর একটি সংক্ষিপ্ত বিবরণ" +lang: bn +--- + +স্মার্ট কন্ট্র্যাক্টগুলো অত্যন্ত ফ্লেক্সিবল, এবং বিপুল পরিমাণ ভ্যালু ও ডেটা নিয়ন্ত্রণ করতে সক্ষম, যখন ব্লকচেইনে ডিপ্লয় করা কোডের উপর ভিত্তি করে অপরিবর্তনীয় লজিক চালায়। এটি ট্রাস্টলেস এবং ডিসেন্ট্রালাইজড এপ্লিকেশনগুলোর একটি প্রাণবন্ত ইকোসিস্টেম তৈরি করেছে যা লিগ্যাসি সিস্টেমের তুলনায় অনেক সুবিধা প্রদান করে। তারা স্মার্ট কন্ট্র্যাক্টে থাকা দুর্বলতাগুলোকে কাজে লাগিয়ে মুনাফা অর্জন করতে চাওয়া অ্যাটাকারদের জন্য সুযোগও তৈরি করে। + +পাবলিক ব্লকচেইন, যেমন ইথেরিয়াম, স্মার্ট কন্ট্র্যাক্ট সুরক্ষিত করার বিষয়টিকে আরও জটিল করে তোলে। ডিপ্লয় করা কন্ট্র্যাক্ট কোড _সাধারণত_ নিরাপত্তা ত্রুটি প্যাচ করার জন্য পরিবর্তন করা যায় না, যেখানে স্মার্ট কন্ট্র্যাক্ট থেকে চুরি করা সম্পদগুলো ট্র্যাক করা অত্যন্ত কঠিন এবং অপরিবর্তনীয়তার কারণে বেশিরভাগই পুনরুদ্ধার করা যায় না। + +যদিও পরিসংখ্যান ভিন্ন হতে পারে, তবে অনুমান করা হয় যে স্মার্ট কন্ট্র্যাক্টগুলোতে নিরাপত্তা ত্রুটির কারণে চুরি বা হারিয়ে যাওয়া মোট মূল্যের পরিমাণ সহজেই $1 বিলিয়নের বেশি। এর মধ্যে উচ্চ-প্রোফাইল ঘটনাগুলো অন্তর্ভুক্ত, যেমন [DAO হ্যাক](https://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit/) (3.6M ETH চুরি হয়েছে, যার আজকের মূল্যে $1B-এর বেশি), [প্যারিটি মাল্টি-সিগ ওয়ালেট হ্যাক](https://www.coindesk.com/markets/2017/07/19/30-million-ether-reported-stolen-due-to-parity-wallet-breach) (হ্যাকারদের কাছে $30M হারিয়েছে), এবং [প্যারিটি ফ্রোজেন ওয়ালেট সমস্যা](https://www.theguardian.com/technology/2017/nov/08/cryptocurrency-300m-dollars-stolen-bug-ether) (ETH-এ $300M-এর বেশি চিরতরে লক হয়ে গেছে)। + +উপরে উল্লিখিত সমস্যাগুলো ডেভেলপারদের জন্য সুরক্ষিত, মজবুত এবং স্থিতিস্থাপক স্মার্ট কন্ট্র্যাক্ট তৈরিতে প্রচেষ্টা বিনিয়োগ করা অপরিহার্য করে তোলে। স্মার্ট কন্ট্র্যাক্ট সুরক্ষা একটি গুরুতর ব্যবসা, এবং এটি এমন একটি বিষয় যা প্রত্যেক ডেভেলপারের ভালোভাবে শেখা উচিত। এই গাইডটি ইথেরিয়াম ডেভেলপারদের জন্য নিরাপত্তা বিবেচনার বিষয়গুলো কভার করবে এবং স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা উন্নত করার জন্য রিসোর্সগুলো অন্বেষণ করবে। + +## পূর্বশর্ত {#prerequisites} + +নিরাপত্তার বিষয়টি মোকাবেলা করার আগে নিশ্চিত করুন যে আপনি [স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্টের মূল বিষয়গুলো](/developers/docs/smart-contracts/) সম্পর্কে পরিচিত। + +## সুরক্ষিত ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট তৈরির জন্য নির্দেশিকা {#smart-contract-security-guidelines} + +### ১. সঠিক অ্যাক্সেস কন্ট্রোল ডিজাইন করুন {#design-proper-access-controls} + +স্মার্ট কন্ট্র্যাক্টে, `public` বা `external` হিসেবে চিহ্নিত ফাংশনগুলো যেকোনো এক্সটার্নালি ওনড অ্যাকাউন্ট (EOAs) বা কন্ট্র্যাক্ট অ্যাকাউন্ট দ্বারা কল করা যেতে পারে। ফাংশনগুলোর জন্য পাবলিক ভিজিবিলিটি নির্দিষ্ট করা প্রয়োজন যদি আপনি চান অন্যরা আপনার কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করুক। তবে, `private` হিসেবে চিহ্নিত ফাংশনগুলো শুধুমাত্র স্মার্ট কন্ট্র্যাক্টের মধ্যে থাকা ফাংশন দ্বারা কল করা যেতে পারে, এক্সটার্নাল অ্যাকাউন্ট দ্বারা নয়। প্রতিটি নেটওয়ার্ক অংশগ্রহণকারীকে কন্ট্র্যাক্ট ফাংশনে অ্যাক্সেস দেওয়া সমস্যা তৈরি করতে পারে, বিশেষ করে যদি এর মানে হয় যে কেউ সংবেদনশীল অপারেশন (যেমন, নতুন টোকেন মিন্ট করা) সম্পাদন করতে পারে। + +স্মার্ট কন্ট্র্যাক্ট ফাংশনের অননুমোদিত ব্যবহার রোধ করতে, সুরক্ষিত অ্যাক্সেস কন্ট্রোল বাস্তবায়ন করা প্রয়োজন। অ্যাক্সেস কন্ট্রোল মেকানিজম একটি স্মার্ট কন্ট্র্যাক্টে নির্দিষ্ট ফাংশন ব্যবহার করার ক্ষমতাকে অনুমোদিত সত্তার মধ্যে সীমাবদ্ধ করে, যেমন কন্ট্র্যাক্ট পরিচালনার জন্য দায়ী অ্যাকাউন্টগুলো। স্মার্ট কন্ট্র্যাক্টে অ্যাক্সেস কন্ট্রোল বাস্তবায়নের জন্য **ওনেবল প্যাটার্ন** এবং **রোল-বেসড কন্ট্রোল** দুটি দরকারী প্যাটার্ন: + +#### ওনেবল প্যাটার্ন {#ownable-pattern} + +ওনেবল প্যাটার্নে, কন্ট্র্যাক্ট-তৈরির প্রক্রিয়া চলাকালীন একটি অ্যাড্রেসকে কন্ট্র্যাক্টের “মালিক” হিসাবে সেট করা হয়। সুরক্ষিত ফাংশনগুলোতে একটি `OnlyOwner` মডিফায়ার বরাদ্দ করা হয়, যা নিশ্চিত করে যে কন্ট্র্যাক্টটি ফাংশনটি কার্যকর করার আগে কলিং অ্যাড্রেসের পরিচয় প্রমাণ করে। কন্ট্র্যাক্টের মালিক ছাড়া অন্য অ্যাড্রেস থেকে সুরক্ষিত ফাংশনে করা কলগুলো সর্বদা রিভার্ট হয়, যা অবাঞ্ছিত অ্যাক্সেস প্রতিরোধ করে। + +#### ভূমিকা-ভিত্তিক অ্যাক্সেস কন্ট্রোল {#role-based-access-control} + +একটি স্মার্ট কন্ট্র্যাক্টে একটি একক অ্যাড্রেসকে `Owner` হিসাবে নিবন্ধন করা সেন্ট্রালাইজেশনের ঝুঁকি তৈরি করে এবং একটি সিঙ্গেল পয়েন্ট-অফ-ফেলিওর উপস্থাপন করে। যদি মালিকের অ্যাকাউন্টের কী গুলো আপোস করা হয়, তাহলে অ্যাটাকাররা মালিকানাধীন কন্ট্র্যাক্টে আক্রমণ করতে পারে। এ কারণেই একাধিক প্রশাসনিক অ্যাকাউন্ট সহ একটি ভূমিকা-ভিত্তিক অ্যাক্সেস কন্ট্রোল প্যাটার্ন ব্যবহার করা একটি ভাল বিকল্প হতে পারে। + +ভূমিকা-ভিত্তিক অ্যাক্সেস কন্ট্রোলে, সংবেদনশীল ফাংশনগুলোতে অ্যাক্সেস বিশ্বস্ত অংশগ্রহণকারীদের একটি সেটের মধ্যে বিতরণ করা হয়। উদাহরণস্বরূপ, একটি অ্যাকাউন্ট টোকেন মিন্ট করার জন্য দায়ী হতে পারে, যখন অন্য একটি অ্যাকাউন্ট আপগ্রেড সম্পাদন করে বা কন্ট্র্যাক্টটি পজ করে। এইভাবে অ্যাক্সেস কন্ট্রোল ডিসেন্ট্রালাইজ করা সিঙ্গেল পয়েন্ট অফ ফেলিওর দূর করে এবং ব্যবহারকারীদের জন্য বিশ্বাসের অনুমান কমায়। + +##### মাল্টি-সিগনেচার ওয়ালেট ব্যবহার করা + +সুরক্ষিত অ্যাক্সেস কন্ট্রোল বাস্তবায়নের আরেকটি পদ্ধতি হল একটি কন্ট্র্যাক্ট পরিচালনা করার জন্য একটি [মাল্টি-সিগনেচার অ্যাকাউন্ট](/developers/docs/smart-contracts/#multisig) ব্যবহার করা। একটি সাধারণ EOA-এর মতো নয়, মাল্টি-সিগনেচার অ্যাকাউন্টগুলো একাধিক সত্তার মালিকানাধীন এবং লেনদেন সম্পাদন করার জন্য ন্যূনতম সংখ্যক অ্যাকাউন্ট থেকে স্বাক্ষরের প্রয়োজন হয়—ধরুন 5টির মধ্যে 3টি। + +অ্যাক্সেস কন্ট্রোলের জন্য একটি মাল্টিসিগ ব্যবহার করা সুরক্ষার একটি অতিরিক্ত লেয়ার যোগ করে কারণ টার্গেট কন্ট্র্যাক্টের উপর অ্যাকশনগুলোর জন্য একাধিক পক্ষের সম্মতি প্রয়োজন। এটি বিশেষভাবে উপযোগী যদি ওনেবল প্যাটার্ন ব্যবহার করা প্রয়োজন হয়, কারণ এটি একজন অ্যাটাকার বা দুর্বৃত্ত অভ্যন্তরীণ ব্যক্তির পক্ষে ক্ষতিকারক উদ্দেশ্যে সংবেদনশীল কন্ট্র্যাক্ট ফাংশনগুলোকে ম্যানিপুলেট করা আরও কঠিন করে তোলে। + +### 2. কন্ট্র্যাক্ট অপারেশন রক্ষা করতে require(), assert(), এবং revert() স্টেটমেন্ট ব্যবহার করুন {#use-require-assert-revert} + +যেমন উল্লেখ করা হয়েছে, একবার আপনার স্মার্ট কন্ট্র্যাক্ট ব্লকচেইনে ডিপ্লয় করা হলে যে কেউ পাবলিক ফাংশন কল করতে পারে। যেহেতু আপনি আগে থেকে জানতে পারবেন না যে এক্সটার্নাল অ্যাকাউন্টগুলো কীভাবে একটি কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করবে, তাই ডিপ্লয় করার আগে সমস্যাযুক্ত অপারেশনের বিরুদ্ধে অভ্যন্তরীণ সুরক্ষা প্রয়োগ করা আদর্শ। আপনি `require()`, `assert()`, এবং `revert()` স্টেটমেন্ট ব্যবহার করে স্মার্ট কন্ট্র্যাক্টে সঠিক আচরণ প্রয়োগ করতে পারেন যাতে এক্সিকিউশন নির্দিষ্ট প্রয়োজনীয়তা পূরণ করতে ব্যর্থ হলে ব্যতিক্রম ট্রিগার করে এবং স্টেট পরিবর্তনগুলো রিভার্ট করে। + +**`require()`**: `require` ফাংশনের শুরুতে সংজ্ঞায়িত করা হয় এবং এটি নিশ্চিত করে যে কল করা ফাংশনটি কার্যকর করার আগে পূর্বনির্ধারিত শর্তগুলো পূরণ করা হয়েছে। একটি ফাংশনের সাথে অগ্রসর হওয়ার আগে ব্যবহারকারীর ইনপুট ভ্যালিডেট করতে, স্টেট ভ্যারিয়েবল চেক করতে বা কলিং অ্যাকাউন্টের পরিচয় প্রমাণ করতে একটি `require` স্টেটমেন্ট ব্যবহার করা যেতে পারে। + +**`assert()`**: `assert()` অভ্যন্তরীণ ত্রুটি সনাক্ত করতে এবং আপনার কোডে “ইনভ্যারিয়েন্ট” এর লঙ্ঘন পরীক্ষা করতে ব্যবহৃত হয়। একটি ইনভ্যারিয়েন্ট হলো একটি কন্ট্র্যাক্টের স্টেট সম্পর্কে একটি যৌক্তিক দাবি যা সমস্ত ফাংশন এক্সিকিউশনের জন্য সত্য থাকা উচিত। একটি উদাহরণ ইনভ্যারিয়েন্ট হলো একটি টোকেন কন্ট্র্যাক্টের সর্বোচ্চ মোট সরবরাহ বা ব্যালেন্স। `assert()` ব্যবহার করা নিশ্চিত করে যে আপনার কন্ট্র্যাক্ট কখনও একটি দুর্বল স্টেটে পৌঁছায় না, এবং যদি পৌঁছায়, তবে স্টেট ভ্যারিয়েবলের সমস্ত পরিবর্তন রোল ব্যাক করা হয়। + +**`revert()`**: `revert()` একটি if-else স্টেটমেন্টে ব্যবহার করা যেতে পারে যা প্রয়োজনীয় শর্ত পূরণ না হলে একটি ব্যতিক্রম ট্রিগার করে। নিচের স্যাম্পল কন্ট্র্যাক্টটি ফাংশনের এক্সিকিউশন রক্ষা করতে `revert()` ব্যবহার করে: + +``` +pragma solidity ^0.8.4; + +contract VendingMachine { + address owner; + error Unauthorized(); + function buy(uint amount) public payable { + if (amount > msg.value / 2 ether) + revert("যথেষ্ট ইথার প্রদান করা হয়নি।"); + // ক্রয় সম্পাদন করুন। + } + function withdraw() public { + if (msg.sender != owner) + revert Unauthorized(); + + payable(msg.sender).transfer(address(this).balance); + } +} +``` + +### 3. স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করুন এবং কোডের সঠিকতা যাচাই করুন {#test-smart-contracts-and-verify-code-correctness} + +[ইথেরিয়াম ভার্চুয়াল মেশিন](/developers/docs/evm/) এ চালিত কোডের অপরিবর্তনীয়তার অর্থ হলো স্মার্ট কন্ট্র্যাক্টগুলোর ডেভেলপমেন্ট পর্যায়ে উচ্চ স্তরের গুণমান মূল্যায়নের প্রয়োজন হয়। আপনার কন্ট্র্যাক্ট ব্যাপকভাবে পরীক্ষা করা এবং যেকোনো অপ্রত্যাশিত ফলাফলের জন্য এটি পর্যবেক্ষণ করা নিরাপত্তা অনেক উন্নত করবে এবং দীর্ঘমেয়াদে আপনার ব্যবহারকারীদের রক্ষা করবে। + +সাধারণ পদ্ধতি হলো ব্যবহারকারীদের কাছ থেকে কন্ট্র্যাক্ট যে মক ডেটা পাওয়ার আশা করে তা ব্যবহার করে ছোট ইউনিট টেস্ট লেখা। [ইউনিট টেস্টিং](/developers/docs/smart-contracts/testing/#unit-testing) নির্দিষ্ট ফাংশনের ফাংশনালিটি পরীক্ষা করার জন্য এবং একটি স্মার্ট কন্ট্র্যাক্ট প্রত্যাশিতভাবে কাজ করে তা নিশ্চিত করার জন্য ভালো। + +দুর্ভাগ্যবশত, বিচ্ছিন্নভাবে ব্যবহার করা হলে স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা উন্নত করার জন্য ইউনিট টেস্টিং ন্যূনতম কার্যকর। একটি ইউনিট টেস্ট প্রমাণ করতে পারে যে একটি ফাংশন মক ডেটার জন্য সঠিকভাবে এক্সিকিউট হয়, কিন্তু ইউনিট টেস্টগুলো ততটাই কার্যকর যতটা টেস্ট লেখা হয়। এটি মিস করা এজ কেস এবং দুর্বলতাগুলো সনাক্ত করা কঠিন করে তোলে যা আপনার স্মার্ট কন্ট্র্যাক্টের নিরাপত্তাকে ভেঙে দিতে পারে। + +একটি ভালো পদ্ধতি হল [স্ট্যাটিক এবং ডাইনামিক বিশ্লেষণ](/developers/docs/smart-contracts/testing/#static-dynamic-analysis) ব্যবহার করে সম্পাদিত প্রপার্টি-বেসড টেস্টিংয়ের সাথে ইউনিট টেস্টিং একত্রিত করা। স্ট্যাটিক বিশ্লেষণ পৌঁছানোযোগ্য প্রোগ্রাম স্টেট এবং এক্সিকিউশন পাথ বিশ্লেষণ করতে নিম্ন-স্তরের উপস্থাপনার উপর নির্ভর করে, যেমন [কন্ট্রোল ফ্লো গ্রাফ](https://en.wikipedia.org/wiki/Control-flow_graph) এবং [অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি](https://deepsource.io/glossary/ast/)। এদিকে, ডাইনামিক বিশ্লেষণ কৌশল, যেমন [স্মার্ট কন্ট্র্যাক্ট ফাজিং](https://www.cyfrin.io/blog/smart-contract-fuzzing-and-invariants-testing-foundry), নিরাপত্তা বৈশিষ্ট্য লঙ্ঘন করে এমন অপারেশন সনাক্ত করতে র‍্যান্ডম ইনপুট মান সহ কন্ট্র্যাক্ট কোড এক্সিকিউট করে। + +[ফর্মাল ভেরিফিকেশন](/developers/docs/smart-contracts/formal-verification) স্মার্ট কন্ট্র্যাক্টে নিরাপত্তা বৈশিষ্ট্য যাচাই করার আরেকটি কৌশল। নিয়মিত পরীক্ষার মতো নয়, ফর্মাল ভেরিফিকেশন একটি স্মার্ট কন্ট্র্যাক্টে ত্রুটির অনুপস্থিতি নিশ্চিতভাবে প্রমাণ করতে পারে। এটি একটি ফর্মাল স্পেসিফিকেশন তৈরি করে অর্জন করা হয় যা পছন্দসই নিরাপত্তা বৈশিষ্ট্যগুলো ক্যাপচার করে এবং প্রমাণ করে যে কন্ট্র্যাক্টগুলোর একটি ফর্মাল মডেল এই স্পেসিফিকেশন মেনে চলে। + +### ৪. আপনার কোডের একটি স্বাধীন পর্যালোচনার জন্য অনুরোধ করুন {#get-independent-code-reviews} + +আপনার কন্ট্র্যাক্ট পরীক্ষা করার পরে, অন্যদের কোনো নিরাপত্তা সমস্যার জন্য সোর্স কোড চেক করতে বলা ভালো। টেস্টিং একটি স্মার্ট কন্ট্র্যাক্টের প্রতিটি ত্রুটি উন্মোচন করবে না, তবে একটি স্বাধীন পর্যালোচনা পাওয়া দুর্বলতা চিহ্নিত করার সম্ভাবনা বাড়িয়ে দেয়। + +#### অডিট {#audits} + +একটি স্মার্ট কন্ট্র্যাক্ট অডিট কমিশন করা একটি স্বাধীন কোড রিভিউ পরিচালনা করার একটি উপায়। অডিটররা স্মার্ট কন্ট্র্যাক্টগুলো সুরক্ষিত এবং গুণমান ত্রুটি ও ডিজাইনের ভুল থেকে মুক্ত তা নিশ্চিত করতে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে। + +তবুও, আপনার অডিটকে একটি অব্যর্থ সমাধান হিসেবে বিবেচনা করা উচিত নয়। স্মার্ট কন্ট্র্যাক্ট অডিট প্রতিটি বাগ ধরতে পারে না এবং বেশিরভাগই পর্যালোচনার একটি অতিরিক্ত রাউন্ড প্রদানের জন্য ডিজাইন করা হয়, যা প্রাথমিক ডেভেলপমেন্ট এবং পরীক্ষার সময় ডেভেলপারদের দ্বারা মিস করা সমস্যাগুলো সনাক্ত করতে সাহায্য করতে পারে। একটি স্মার্ট কন্ট্র্যাক্ট অডিটের সুবিধা সর্বাধিক করার জন্য আপনার অডিটরদের সাথে কাজ করার জন্য সেরা অনুশীলনগুলোও অনুসরণ করা উচিত, যেমন কোড সঠিকভাবে ডকুমেন্ট করা এবং ইনলাইন মন্তব্য যোগ করা। + +- [স্মার্ট কন্ট্র্যাক্ট অডিটিং টিপস ও ট্রিকস](https://twitter.com/tinchoabbate/status/1400170232904400897) - _@tinchoabbate_ +- [আপনার অডিট থেকে সর্বাধিক সুবিধা নিন](https://inference.ag/blog/2023-08-14-tips/) - _ইনফারেন্স_ + +#### বাগ বাউন্টি {#bug-bounties} + +একটি বাগ বাউন্টি প্রোগ্রাম সেট আপ করা এক্সটার্নাল কোড রিভিউ বাস্তবায়নের আরেকটি পদ্ধতি। একটি বাগ বাউন্টি হল এমন ব্যক্তিদের (সাধারণত হোয়াইটহ্যাট হ্যাকার) দেওয়া একটি আর্থিক পুরস্কার যারা একটি অ্যাপ্লিকেশনে দুর্বলতা আবিষ্কার করে। + +সঠিকভাবে ব্যবহার করা হলে, বাগ বাউন্টি হ্যাকার সম্প্রদায়ের সদস্যদের আপনার কোডকে গুরুতর ত্রুটির জন্য পরিদর্শন করার জন্য উৎসাহ দেয়। একটি বাস্তব-জীবনের উদাহরণ হল “ইনফিনিট মানি বাগ” যা একজন অ্যাটাকারকে [Optimism](https://www.optimism.io/)-এ সীমাহীন পরিমাণে ইথার তৈরি করতে দিত, যা Ethereum-এ চলমান একটি [লেয়ার 2](/layer-2/) প্রোটোকল। সৌভাগ্যবশত, একজন হোয়াইটহ্যাট হ্যাকার [ত্রুটিটি আবিষ্কার করেন](https://www.saurik.com/optimism.html) এবং টিমকে অবহিত করেন, [প্রক্রিয়াটিতে একটি বড় পেআউট অর্জন করেন](https://cryptoslate.com/critical-bug-in-ethereum-l2-optimism-2m-bounty-paid/)। + +একটি দরকারী কৌশল হল একটি বাগ বাউন্টি প্রোগ্রামের পেআউটকে স্টেক করা ফান্ডের পরিমাণের অনুপাতে সেট করা। “[স্কেলিং বাগ বাউন্টি](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7)” হিসাবে বর্ণিত, এই পদ্ধতিটি ব্যক্তিদের দুর্বলতাগুলো কাজে লাগানোর পরিবর্তে দায়িত্বশীলভাবে প্রকাশ করার জন্য আর্থিক উৎসাহ প্রদান করে। + +### ৫। স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্টের সময় সেরা অনুশীলনগুলো অনুসরণ করুন {#follow-smart-contract-development-best-practices} + +অডিট এবং বাগ বাউন্টির অস্তিত্ব উচ্চ-মানের কোড লেখার আপনার দায়িত্ব থেকে আপনাকে অব্যাহতি দেয় না। ভালো স্মার্ট কন্ট্র্যাক্ট সুরক্ষা সঠিক ডিজাইন এবং ডেভেলপমেন্ট প্রক্রিয়া অনুসরণ করার মাধ্যমে শুরু হয়: + +- সমস্ত কোড একটি ভার্সন কন্ট্রোল সিস্টেমে সংরক্ষণ করুন, যেমন git + +- সমস্ত কোড পরিবর্তন পুল রিকোয়েস্টের মাধ্যমে করুন + +- নিশ্চিত করুন যে পুল রিকোয়েস্টগুলোতে অন্তত একজন স্বাধীন পর্যালোচক আছে—যদি আপনি কোনো প্রকল্পে একা কাজ করেন, তবে অন্য ডেভেলপার খুঁজে বের করার এবং কোড রিভিউ ট্রেড করার কথা বিবেচনা করুন + +- স্মার্ট কন্ট্র্যাক্ট পরীক্ষা, কম্পাইল এবং ডিপ্লয় করার জন্য একটি [ডেভেলপমেন্ট এনভায়রনমেন্ট](/developers/docs/frameworks/) ব্যবহার করুন + +- আপনার কোডটি বেসিক কোড অ্যানালাইসিস টুলস, যেমন [Cyfrin Aderyn](https://github.com/Cyfrin/aderyn), Mythril এবং Slither-এর মাধ্যমে চালান। আদর্শগতভাবে, প্রতিটি পুল রিকোয়েস্ট মার্জ করার আগে আপনার এটি করা উচিত এবং আউটপুটের পার্থক্য তুলনা করা উচিত + +- নিশ্চিত করুন যে আপনার কোড কোনো ত্রুটি ছাড়াই কম্পাইল হয়, এবং Solidity কম্পাইলার কোনো সতর্কতা জারি করে না + +- আপনার কোড সঠিকভাবে ডকুমেন্ট করুন ([NatSpec](https://solidity.readthedocs.io/en/develop/natspec-format.html) ব্যবহার করে) এবং কন্ট্র্যাক্ট আর্কিটেকচার সম্পর্কে বিস্তারিত সহজ-বোধ্য ভাষায় বর্ণনা করুন। এটি অন্যদের জন্য আপনার কোড অডিট এবং পর্যালোচনা করা সহজ করে তুলবে। + +### ৬. মজবুত ডিজাস্টার রিকভারি প্ল্যান বাস্তবায়ন করুন {#implement-disaster-recovery-plans} + +সুরক্ষিত অ্যাক্সেস কন্ট্রোল ডিজাইন করা, ফাংশন মডিফায়ার বাস্তবায়ন করা, এবং অন্যান্য পরামর্শগুলো স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা উন্নত করতে পারে, কিন্তু তারা ক্ষতিকারক এক্সপ্লয়েটের সম্ভাবনাকে বাতিল করতে পারে না। সুরক্ষিত স্মার্ট কন্ট্র্যাক্ট তৈরির জন্য “ব্যর্থতার জন্য প্রস্তুতি” এবং আক্রমণের বিরুদ্ধে কার্যকরভাবে প্রতিক্রিয়া জানানোর জন্য একটি ফলব্যাক প্ল্যান থাকা প্রয়োজন। একটি সঠিক ডিজাস্টার রিকভারি প্ল্যানে নিম্নলিখিত উপাদানগুলোর কিছু বা সবগুলো অন্তর্ভুক্ত থাকবে: + +#### কন্ট্র্যাক্ট আপগ্রেড {#contract-upgrades} + +যদিও Ethereum স্মার্ট কন্ট্র্যাক্টগুলো ডিফল্টভাবে অপরিবর্তনীয়, আপগ্রেড প্যাটার্ন ব্যবহার করে কিছু মাত্রার মিউটেবিলিটি অর্জন করা সম্ভব। কন্ট্র্যাক্ট আপগ্রেড করা সেইসব ক্ষেত্রে প্রয়োজন যেখানে একটি গুরুতর ত্রুটি আপনার পুরানো কন্ট্র্যাক্টকে অব্যবহারযোগ্য করে তোলে এবং নতুন লজিক ডিপ্লয় করা সবচেয়ে কার্যকর বিকল্প। + +কন্ট্র্যাক্ট আপগ্রেড মেকানিজমগুলো ভিন্নভাবে কাজ করে, কিন্তু “প্রক্সি প্যাটার্ন” স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করার জন্য আরও জনপ্রিয় পদ্ধতিগুলোর মধ্যে একটি। [প্রক্সি প্যাটার্ন](https://www.cyfrin.io/blog/upgradeable-proxy-smart-contract-pattern) একটি অ্যাপ্লিকেশনের স্টেট এবং লজিককে _দুইটি_ কন্ট্র্যাক্টের মধ্যে বিভক্ত করে। প্রথম কন্ট্র্যাক্টটি (যাকে ‘প্রক্সি কন্ট্র্যাক্ট’ বলা হয়) স্টেট ভ্যারিয়েবল (যেমন, ব্যবহারকারীর ব্যালেন্স) স্টোর করে, যখন দ্বিতীয় কন্ট্র্যাক্টটি (যাকে ‘লজিক কন্ট্র্যাক্ট’ বলা হয়) কন্ট্র্যাক্ট ফাংশন এক্সিকিউট করার জন্য কোড ধারণ করে। + +অ্যাকাউন্টগুলো প্রক্সি কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করে, যা [`delegatecall()`](https://docs.soliditylang.org/en/v0.8.16/introduction-to-smart-contracts.html?highlight=delegatecall#delegatecall-callcode-and-libraries) লো-লেভেল কল ব্যবহার করে সমস্ত ফাংশন কল লজিক কন্ট্র্যাক্টে প্রেরণ করে। একটি নিয়মিত মেসেজ কলের মতো নয়, `delegatecall()` নিশ্চিত করে যে লজিক কন্ট্র্যাক্টের অ্যাড্রেসে চলমান কোডটি কলিং কন্ট্র্যাক্টের প্রেক্ষাপটে এক্সিকিউট হয়। এর মানে হল লজিক কন্ট্র্যাক্টটি সর্বদা প্রক্সির স্টোরেজে লিখবে (এর নিজস্ব স্টোরেজের পরিবর্তে) এবং `msg.sender` ও `msg.value`-এর মূল মানগুলো সংরক্ষিত থাকবে। + +লজিক কন্ট্র্যাক্টে কল ডেলিগেট করার জন্য প্রক্সি কন্ট্র্যাক্টের স্টোরেজে এর অ্যাড্রেস সংরক্ষণ করা প্রয়োজন। সুতরাং, কন্ট্র্যাক্টের লজিক আপগ্রেড করা শুধুমাত্র অন্য একটি লজিক কন্ট্র্যাক্ট ডিপ্লয় করা এবং প্রক্সি কন্ট্র্যাক্টে নতুন অ্যাড্রেস সংরক্ষণ করার বিষয়। যেহেতু প্রক্সি কন্ট্র্যাক্টে পরবর্তী কলগুলো স্বয়ংক্রিয়ভাবে নতুন লজিক কন্ট্র্যাক্টে রাউট করা হয়, আপনি আসলে কোড পরিবর্তন না করেই কন্ট্র্যাক্টটি “আপগ্রেড” করেছেন। + +[কন্ট্র্যাক্ট আপগ্রেড করার বিষয়ে আরও জানুন](/developers/docs/smart-contracts/upgrading/)। + +#### জরুরী স্টপ {#emergency-stops} + +যেমন উল্লেখ করা হয়েছে, ব্যাপক অডিটিং এবং টেস্টিং সম্ভবত একটি স্মার্ট কন্ট্র্যাক্টের সমস্ত বাগ আবিষ্কার করতে পারে না। ডিপ্লয়মেন্টের পরে যদি আপনার কোডে কোনো দুর্বলতা দেখা দেয়, তবে এটি প্যাচ করা অসম্ভব কারণ আপনি কন্ট্র্যাক্ট অ্যাড্রেসে চলমান কোড পরিবর্তন করতে পারবেন না। এছাড়াও, আপগ্রেড মেকানিজম (যেমন, প্রক্সি প্যাটার্ন) বাস্তবায়ন করতে সময় লাগতে পারে (এগুলোর জন্য প্রায়শই বিভিন্ন পক্ষের অনুমোদন প্রয়োজন হয়), যা শুধুমাত্র অ্যাটাকারদের আরও বেশি ক্ষতি করার জন্য আরও সময় দেয়। + +চূড়ান্ত বিকল্প হলো একটি “জরুরী স্টপ” ফাংশন বাস্তবায়ন করা যা একটি কন্ট্র্যাক্টে দুর্বল ফাংশনে কল ব্লক করে। জরুরী স্টপগুলোতে সাধারণত নিম্নলিখিত উপাদানগুলো থাকে: + +1. একটি গ্লোবাল বুলিয়ান ভ্যারিয়েবল যা নির্দেশ করে স্মার্ট কন্ট্র্যাক্টটি বন্ধ স্টেটে আছে কি না। কন্ট্র্যাক্ট সেট আপ করার সময় এই ভ্যারিয়েবলটি `false` তে সেট করা হয়, কিন্তু কন্ট্র্যাক্টটি বন্ধ হয়ে গেলে এটি `true` তে রিভার্ট হবে। + +2. ফাংশনগুলো যা তাদের এক্সিকিউশনে বুলিয়ান ভ্যারিয়েবলকে রেফারেন্স করে। এই ধরনের ফাংশনগুলো তখন অ্যাক্সেসযোগ্য হয় যখন স্মার্ট কন্ট্র্যাক্টটি বন্ধ থাকে না, এবং যখন জরুরী স্টপ বৈশিষ্ট্যটি ট্রিগার করা হয় তখন অ্যাক্সেসযোগ্য থাকে না। + +3. একটি সত্তা যার জরুরী স্টপ ফাংশনে অ্যাক্সেস আছে, যা বুলিয়ান ভ্যারিয়েবলকে `true` তে সেট করে। ক্ষতিকারক অ্যাকশন প্রতিরোধ করার জন্য, এই ফাংশনে কল একটি বিশ্বস্ত অ্যাড্রেসে (যেমন, কন্ট্র্যাক্টের মালিক) সীমাবদ্ধ করা যেতে পারে। + +একবার কন্ট্র্যাক্ট জরুরী স্টপ সক্রিয় করলে, নির্দিষ্ট ফাংশনগুলো কলযোগ্য হবে না। এটি গ্লোবাল ভ্যারিয়েবলকে রেফারেন্স করে এমন একটি মডিফায়ারে নির্বাচিত ফাংশনগুলো র‍্যাপ করে অর্জন করা হয়। নীচে [একটি উদাহরণ](https://github.com/fravoll/solidity-patterns/blob/master/EmergencyStop/EmergencyStop.sol) দেওয়া হল যা কন্ট্র্যাক্টে এই প্যাটার্নের একটি বাস্তবায়ন বর্ণনা করে: + +```solidity +// এই কোডটি পেশাগতভাবে অডিট করা হয়নি এবং নিরাপত্তা বা সঠিকতা সম্পর্কে কোনো প্রতিশ্রুতি দেয় না। আপনার নিজের ঝুঁকিতে ব্যবহার করুন। + +contract EmergencyStop { + + bool isStopped = false; + + modifier stoppedInEmergency { + require(!isStopped); + _; + } + + modifier onlyWhenStopped { + require(isStopped); + _; + } + + modifier onlyAuthorized { + // এখানে msg.sender-এর অনুমোদনের জন্য চেক করুন + _; + } + + function stopContract() public onlyAuthorized { + isStopped = true; + } + + function resumeContract() public onlyAuthorized { + isStopped = false; + } + + function deposit() public payable stoppedInEmergency { + // এখানে ডিপোজিট লজিক ঘটছে + } + + function emergencyWithdraw() public onlyWhenStopped { + // এখানে জরুরী উইথড্র ঘটছে + } +} +``` + +এই উদাহরণটি জরুরী স্টপের মৌলিক বৈশিষ্ট্যগুলো দেখায়: + +- `isStopped` একটি বুলিয়ান যা শুরুতে `false` এবং কন্ট্র্যাক্ট জরুরী মোডে প্রবেশ করলে `true` তে মূল্যায়ন করে। + +- ফাংশন মডিফায়ার `onlyWhenStopped` এবং `stoppedInEmergency` `isStopped` ভ্যারিয়েবলটি চেক করে। `stoppedInEmergency` সেই ফাংশনগুলো নিয়ন্ত্রণ করতে ব্যবহৃত হয় যা কন্ট্র্যাক্ট দুর্বল হলে অ্যাক্সেসযোগ্য হওয়া উচিত নয় (যেমন, `deposit()`)। এই ফাংশনগুলোতে কলগুলো কেবল রিভার্ট হবে। + +`onlyWhenStopped` সেই ফাংশনগুলোর জন্য ব্যবহৃত হয় যা জরুরী অবস্থায় কলযোগ্য হওয়া উচিত (যেমন, `emergencyWithdraw()`)। এই ধরনের ফাংশনগুলো পরিস্থিতি সমাধানে সাহায্য করতে পারে, তাই “সীমাবদ্ধ ফাংশন” তালিকা থেকে তাদের বাদ দেওয়া হয়েছে। + +একটি জরুরী স্টপ ফাংশনালিটি ব্যবহার করা আপনার স্মার্ট কন্ট্র্যাক্টে গুরুতর দুর্বলতাগুলোর সাথে মোকাবিলা করার জন্য একটি কার্যকর স্টপগ্যাপ প্রদান করে। যাইহোক, এটি ব্যবহারকারীদের ডেভেলপারদের উপর বিশ্বাস করার প্রয়োজন বাড়িয়ে দেয় যে তারা স্বার্থপর কারণে এটি সক্রিয় করবে না। এই লক্ষ্যে, একটি অনচেন ভোটিং মেকানিজম, টাইমলক, বা একটি মাল্টিসিগ ওয়ালেট থেকে অনুমোদনের মাধ্যমে জরুরী স্টপের নিয়ন্ত্রণ ডিসেন্ট্রালাইজ করা সম্ভাব্য সমাধান। + +#### ইভেন্ট মনিটরিং {#event-monitoring} + +[ইভেন্টস](https://docs.soliditylang.org/en/v0.8.15/contracts.html#events) আপনাকে স্মার্ট কন্ট্র্যাক্ট ফাংশনে কল ট্র্যাক করতে এবং স্টেট ভ্যারিয়েবলের পরিবর্তনগুলো নিরীক্ষণ করতে দেয়। আপনার স্মার্ট কন্ট্র্যাক্টকে এমনভাবে প্রোগ্রাম করা আদর্শ যে যখনই কোনো পক্ষ একটি নিরাপত্তা-গুরুত্বপূর্ণ অ্যাকশন নেয় (যেমন, ফান্ড উইথড্র করা) তখন এটি একটি ইভেন্ট নির্গত করে। + +ইভেন্টগুলো লগ করা এবং অফচেইনে সেগুলোকে মনিটর করা কন্ট্র্যাক্ট অপারেশনের উপর অন্তর্দৃষ্টি প্রদান করে এবং ক্ষতিকারক অ্যাকশনগুলোর দ্রুত আবিষ্কারে সহায়তা করে। এর মানে হল আপনার দল হ্যাকের বিরুদ্ধে দ্রুত প্রতিক্রিয়া জানাতে পারে এবং ব্যবহারকারীদের উপর প্রভাব কমাতে পদক্ষেপ নিতে পারে, যেমন ফাংশন পজ করা বা একটি আপগ্রেড সম্পাদন করা। + +আপনি একটি অফ-দ্য-শেল্ফ মনিটরিং টুলের জন্যও বেছে নিতে পারেন যা যখনই কেউ আপনার কন্ট্র্যাক্টগুলোর সাথে ইন্টারঅ্যাক্ট করে তখন স্বয়ংক্রিয়ভাবে অ্যালার্ট ফরওয়ার্ড করে। এই টুলসগুলো আপনাকে বিভিন্ন ট্রিগারের উপর ভিত্তি করে কাস্টম অ্যালার্ট তৈরি করতে দেবে, যেমন লেনদেনের পরিমাণ, ফাংশন কলের ফ্রিকোয়েন্সি, বা জড়িত নির্দিষ্ট ফাংশন। উদাহরণস্বরূপ, আপনি একটি অ্যালার্ট প্রোগ্রাম করতে পারেন যা একটি একক লেনদেনে উইথড্র করা পরিমাণ একটি নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করলে আসে। + +### ৭. সুরক্ষিত গভর্নেন্স সিস্টেম ডিজাইন করুন {#design-secure-governance-systems} + +আপনি আপনার অ্যাপ্লিকেশনকে ডিসেন্ট্রালাইজড করতে চাইতে পারেন কমিউনিটির সদস্যদের কাছে কোর স্মার্ট কন্ট্র্যাক্টগুলোর নিয়ন্ত্রণ হস্তান্তর করে। এই ক্ষেত্রে, স্মার্ট কন্ট্র্যাক্ট সিস্টেমে একটি গভর্নেন্স মডিউল অন্তর্ভুক্ত থাকবে—একটি মেকানিজম যা কমিউনিটির সদস্যদের একটি অনচেন গভর্নেন্স সিস্টেমের মাধ্যমে প্রশাসনিক অ্যাকশন অনুমোদন করতে দেয়। উদাহরণস্বরূপ, একটি প্রক্সি কন্ট্র্যাক্টকে একটি নতুন ইমপ্লিমেন্টেশনে আপগ্রেড করার একটি প্রস্তাব টোকেন-হোল্ডারদের দ্বারা ভোট দেওয়া হতে পারে। + +ডিসেন্ট্রালাইজড গভর্নেন্স উপকারী হতে পারে, বিশেষ করে কারণ এটি ডেভেলপার এবং শেষ-ব্যবহারকারীদের স্বার্থকে একত্রিত করে। তা সত্ত্বেও, স্মার্ট কন্ট্র্যাক্ট গভর্নেন্স মেকানিজম ভুলভাবে বাস্তবায়িত হলে নতুন ঝুঁকি তৈরি করতে পারে। একটি সম্ভাব্য দৃশ্য হল যদি একজন অ্যাটাকার একটি [ফ্ল্যাশ লোন](/defi/#flash-loans) নিয়ে বিপুল পরিমাণ ভোটিং পাওয়ার (ধরে রাখা টোকেনের সংখ্যায় পরিমাপ করা) অর্জন করে এবং একটি ক্ষতিকারক প্রস্তাব পাস করিয়ে নেয়। + +অনচেন গভর্নেন্স সম্পর্কিত সমস্যা প্রতিরোধের একটি উপায় হল [একটি টাইমলক ব্যবহার করা](https://blog.openzeppelin.com/protect-your-users-with-smart-contract-timelocks/)। একটি টাইমলক একটি স্মার্ট কন্ট্র্যাক্টকে একটি নির্দিষ্ট পরিমাণ সময় অতিবাহিত না হওয়া পর্যন্ত নির্দিষ্ট অ্যাকশন এক্সিকিউট করা থেকে বিরত রাখে। অন্যান্য কৌশলগুলোর মধ্যে রয়েছে প্রতিটি টোকেনের জন্য একটি “ভোটিং ওয়েট” বরাদ্দ করা যা এটি কতক্ষণ ধরে লক করা হয়েছে তার উপর ভিত্তি করে, বা বর্তমান ব্লকের পরিবর্তে একটি ঐতিহাসিক সময়ে (উদাহরণস্বরূপ, অতীতে 2-3 ব্লক) একটি অ্যাড্রেসের ভোটিং পাওয়ার পরিমাপ করা। উভয় পদ্ধতিই অনচেন ভোট প্রভাবিত করার জন্য দ্রুত ভোটিং পাওয়ার জমা করার সম্ভাবনা কমিয়ে দেয়। + +শেয়ার করা লিঙ্কগুলোতে [সুরক্ষিত গভর্নেন্স সিস্টেম ডিজাইন করা](https://blog.openzeppelin.com/smart-contract-security-guidelines-4-strategies-for-safer-governance-systems/), [DAO-তে বিভিন্ন ভোটিং মেকানিজম](https://hackernoon.com/governance-is-the-holy-grail-for-daos), এবং [DeFi লিভারেজ করে সাধারণ DAO আক্রমণ ভেক্টর](https://dacian.me/dao-governance-defi-attacks) সম্পর্কে আরও জানুন। + +### ৮. কোডের জটিলতা ন্যূনতম পর্যায়ে কমান {#reduce-code-complexity} + +ঐতিহ্যবাহী সফটওয়্যার ডেভেলপাররা KISS (“keep it simple, stupid”) নীতির সাথে পরিচিত, যা সফটওয়্যার ডিজাইনে অপ্রয়োজনীয় জটিলতা আনা থেকে বিরত থাকার পরামর্শ দেয়। এটি দীর্ঘদিনের চিন্তাভাবনা অনুসরণ করে যে “জটিল সিস্টেমগুলো জটিল উপায়ে ব্যর্থ হয়” এবং ব্যয়বহুল ত্রুটির জন্য বেশি সংবেদনশীল। + +স্মার্ট কন্ট্র্যাক্ট লেখার সময় জিনিসগুলো সহজ রাখা বিশেষভাবে গুরুত্বপূর্ণ, কারণ স্মার্ট কন্ট্র্যাক্টগুলো সম্ভাব্যভাবে বিপুল পরিমাণ মূল্য নিয়ন্ত্রণ করে। স্মার্ট কন্ট্র্যাক্ট লেখার সময় সরলতা অর্জনের জন্য একটি টিপস হল বিদ্যমান লাইব্রেরি, যেমন [OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/), যেখানে সম্ভব সেখানে পুনরায় ব্যবহার করা। যেহেতু এই লাইব্রেরিগুলো ডেভেলপারদের দ্বারা ব্যাপকভাবে অডিট এবং পরীক্ষা করা হয়েছে, তাই এগুলো ব্যবহার করলে স্ক্র্যাচ থেকে নতুন ফাংশনালিটি লিখে বাগ আনার সম্ভাবনা কমে যায়। + +আরেকটি সাধারণ পরামর্শ হল ছোট ফাংশন লেখা এবং একাধিক কন্ট্র্যাক্টে ব্যবসায়িক লজিক বিভক্ত করে কন্ট্র্যাক্টগুলোকে মডুলার রাখা। সহজ কোড লেখা কেবল একটি স্মার্ট কন্ট্র্যাক্টে আক্রমণের পৃষ্ঠকে কমায় না, এটি সামগ্রিক সিস্টেমের সঠিকতা সম্পর্কে যুক্তি দেওয়া এবং সম্ভাব্য ডিজাইনের ত্রুটিগুলো তাড়াতাড়ি সনাক্ত করা সহজ করে তোলে। + +### ৯. সাধারণ স্মার্ট কন্ট্র্যাক্ট দুর্বলতার বিরুদ্ধে প্রতিরক্ষা করুন {#mitigate-common-smart-contract-vulnerabilities} + +#### রিএন্ট্রেন্সি {#reentrancy} + +EVM কনকারেন্সি অনুমতি দেয় না, যার মানে একটি মেসেজ কলে জড়িত দুটি কন্ট্র্যাক্ট একযোগে চলতে পারে না। একটি এক্সটার্নাল কল কলিং কন্ট্র্যাক্টের এক্সিকিউশন এবং মেমরিকে কলটি ফিরে না আসা পর্যন্ত পজ করে, যার পরে এক্সিকিউশন স্বাভাবিকভাবে চলতে থাকে। এই প্রক্রিয়াটিকে আনুষ্ঠানিকভাবে অন্য কন্ট্র্যাক্টে [কন্ট্রোল ফ্লো](https://www.computerhope.com/jargon/c/contflow.htm) স্থানান্তর হিসাবে বর্ণনা করা যেতে পারে। + +যদিও বেশিরভাগ ক্ষেত্রে এটি ক্ষতিকারক নয়, অবিশ্বস্ত কন্ট্র্যাক্টে কন্ট্রোল ফ্লো স্থানান্তর করা সমস্যা তৈরি করতে পারে, যেমন রিএন্ট্রেন্সি। একটি রিএন্ট্রেন্সি অ্যাটাক ঘটে যখন একটি ক্ষতিকারক কন্ট্র্যাক্ট মূল ফাংশন ইনভোকেশন সম্পূর্ণ হওয়ার আগে একটি দুর্বল কন্ট্র্যাক্টে আবার কল করে। এই ধরনের অ্যাটাক একটি উদাহরণের মাধ্যমে সবচেয়ে ভালো ব্যাখ্যা করা যায়। + +একটি সাধারণ স্মার্ট কন্ট্র্যাক্ট (‘ভিকটিম’) বিবেচনা করুন যা যে কাউকে ইথার জমা এবং উইথড্র করতে দেয়: + +```solidity +// এই কন্ট্র্যাক্টটি দুর্বল। প্রোডাকশনে ব্যবহার করবেন না + +contract Victim { + mapping (address => uint256) public balances; + + function deposit() external payable { + balances[msg.sender] += msg.value; + } + + function withdraw() external { + uint256 amount = balances[msg.sender]; + (bool success, ) = msg.sender.call.value(amount)(""); + require(success); + balances[msg.sender] = 0; + } +} +``` + +এই কন্ট্র্যাক্টটি ব্যবহারকারীদের কন্ট্র্যাক্টে পূর্বে জমা করা ETH উইথড্র করার জন্য একটি `withdraw()` ফাংশন প্রকাশ করে। উইথড্রয়াল প্রসেস করার সময়, কন্ট্র্যাক্টটি নিম্নলিখিত অপারেশনগুলো সম্পাদন করে: + +1. ব্যবহারকারীর ETH ব্যালেন্স চেক করে +2. কলিং অ্যাড্রেসে ফান্ড পাঠায় +3. তাদের ব্যালেন্স 0 এ রিসেট করে, ব্যবহারকারীর কাছ থেকে অতিরিক্ত উইথড্রয়াল প্রতিরোধ করে + +`Victim` কন্ট্র্যাক্টে `withdraw()` ফাংশনটি একটি “চেক-ইন্টারঅ্যাকশন-ইফেক্টস” প্যাটার্ন অনুসরণ করে। এটি _চেক_ করে যে এক্সিকিউশনের জন্য প্রয়োজনীয় শর্তগুলো পূরণ হয়েছে কিনা (যেমন, ব্যবহারকারীর একটি পজিটিভ ETH ব্যালেন্স আছে) এবং লেনদেনের _ইফেক্টস_ প্রয়োগ করার আগে (যেমন, ব্যবহারকারীর ব্যালেন্স কমানো) কলারের অ্যাড্রেসে ETH পাঠিয়ে _ইন্টারঅ্যাকশন_ সম্পাদন করে। + +যদি `withdraw()` একটি এক্সটার্নালি ওনড অ্যাকাউন্ট (EOA) থেকে কল করা হয়, তবে ফাংশনটি প্রত্যাশিতভাবে এক্সিকিউট হয়: `msg.sender.call.value()` কলারকে ETH পাঠায়। যাইহোক, যদি `msg.sender` একটি স্মার্ট কন্ট্র্যাক্ট অ্যাকাউন্ট হয় যা `withdraw()` কল করে, তবে `msg.sender.call.value()` ব্যবহার করে ফান্ড পাঠানো সেই অ্যাড্রেসে সংরক্ষিত কোডকেও ট্রিগার করবে। + +কল্পনা করুন এটি কন্ট্র্যাক্ট অ্যাড্রেসে ডিপ্লয় করা কোড: + +```solidity + contract Attacker { + function beginAttack() external payable { + Victim(victim_address).deposit.value(1 ether)(); + Victim(victim_address).withdraw(); + } + + function() external payable { + if (gasleft() > 40000) { + Victim(victim_address).withdraw(); + } + } +} +``` + +এই কন্ট্র্যাক্টটি তিনটি জিনিস করার জন্য ডিজাইন করা হয়েছে: + +1. অন্য একটি অ্যাকাউন্ট থেকে একটি ডিপোজিট গ্রহণ করা (সম্ভবত অ্যাটাকারের EOA) +2. ভিকটিম কন্ট্র্যাক্টে 1 ETH জমা করা +3. স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত 1 ETH উইথড্র করা + +এখানে কোনো ভুল নেই, শুধুমাত্র `Attacker`-এর আরেকটি ফাংশন আছে যা `Victim`-এ আবার `withdraw()` কল করে যদি ইনকামিং `msg.sender.call.value` থেকে অবশিষ্ট গ্যাস 40,000 এর বেশি হয়। এটি `Attacker` কে `Victim`-এ পুনরায় প্রবেশ করার এবং `withdraw`-এর প্রথম ইনভোকেশন সম্পূর্ণ হওয়ার _আগে_ আরও ফান্ড উইথড্র করার ক্ষমতা দেয়। চক্রটি দেখতে এইরকম: + +```solidity +- অ্যাটাকারের EOA 1 ETH দিয়ে `Attacker.beginAttack()` কল করে +- `Attacker.beginAttack()` `Victim`-এ 1 ETH জমা করে +- `Attacker` `Victim`-এ `withdraw()` কল করে +- `Victim` `Attacker`-এর ব্যালেন্স চেক করে (1 ETH) +- `Victim` `Attacker`-কে 1 ETH পাঠায় (যা ডিফল্ট ফাংশন ট্রিগার করে) +- `Attacker` আবার `Victim.withdraw()` কল করে (নোট করুন যে `Victim` প্রথম উইথড্রয়াল থেকে `Attacker`-এর ব্যালেন্স কমায়নি) +- `Victim` `Attacker`-এর ব্যালেন্স চেক করে (যা এখনও 1 ETH কারণ এটি প্রথম কলের ইফেক্ট প্রয়োগ করেনি) +- `Victim` `Attacker`-কে 1 ETH পাঠায় (যা ডিফল্ট ফাংশন ট্রিগার করে এবং `Attacker`-কে `withdraw` ফাংশনে পুনরায় প্রবেশ করতে দেয়) +- প্রক্রিয়াটি চলতে থাকে যতক্ষণ না `Attacker`-এর গ্যাস শেষ হয়ে যায়, সেই সময়ে `msg.sender.call.value` অতিরিক্ত উইথড্রয়াল ট্রিগার না করে ফিরে আসে +- `Victim` অবশেষে প্রথম লেনদেনের (এবং পরবর্তীগুলোর) ফলাফল তার স্টেটে প্রয়োগ করে, তাই `Attacker`-এর ব্যালেন্স 0 এ সেট করা হয় +``` + +সারাংশ হল যে যেহেতু ফাংশন এক্সিকিউশন সম্পূর্ণ না হওয়া পর্যন্ত কলারের ব্যালেন্স 0 এ সেট করা হয় না, তাই পরবর্তী ইনভোকেশনগুলো সফল হবে এবং কলারকে তাদের ব্যালেন্স একাধিকবার উইথড্র করতে দেবে। এই ধরনের অ্যাটাক একটি স্মার্ট কন্ট্র্যাক্টকে তার ফান্ড থেকে খালি করার জন্য ব্যবহার করা যেতে পারে, যেমনটি [2016 সালের DAO হ্যাক](https://www.coindesk.com/learn/understanding-the-dao-attack)-এ হয়েছিল। রিএন্ট্রেন্সি অ্যাটাক এখনও স্মার্ট কন্ট্র্যাক্টগুলোর জন্য একটি গুরুতর সমস্যা যেমন [রিএন্ট্রেন্সি এক্সপ্লয়েটের পাবলিক তালিকা](https://github.com/pcaversaccio/reentrancy-attacks) দেখায়। + +##### কিভাবে রিএন্ট্রেন্সি অ্যাটাক প্রতিরোধ করা যায় + +রিএন্ট্রেন্সির সাথে মোকাবিলা করার একটি পদ্ধতি হল [চেক-ইফেক্টস-ইন্টারঅ্যাকশন প্যাটার্ন](https://docs.soliditylang.org/en/develop/security-considerations.html#use-the-checks-effects-interactions-pattern) অনুসরণ করা। এই প্যাটার্নটি ফাংশনগুলোর এক্সিকিউশনকে এমনভাবে অর্ডার করে যে এক্সিকিউশন এগিয়ে যাওয়ার আগে প্রয়োজনীয় চেক সম্পাদনকারী কোডটি প্রথমে আসে, তারপরে কন্ট্র্যাক্ট স্টেট ম্যানিপুলেটকারী কোড, এবং শেষে অন্য কন্ট্র্যাক্ট বা EOA-এর সাথে ইন্টারঅ্যাক্টকারী কোড আসে। + +চেক-ইফেক্ট-ইন্টারঅ্যাকশন প্যাটার্নটি `Victim` কন্ট্র্যাক্টের একটি সংশোধিত সংস্করণে ব্যবহার করা হয়েছে যা নীচে দেখানো হয়েছে: + +```solidity +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` তে ফিরে আসে। নীচের উদাহরণে যেমন দেখা যায়, একটি মিউটেক্স ব্যবহার করা একটি ফাংশনকে রিকার্সিভ কল থেকে রক্ষা করে যখন মূল ইনভোকেশন এখনও প্রসেস হচ্ছে, কার্যকরভাবে রিএন্ট্রেন্সি বন্ধ করে। + +```solidity +pragma solidity ^0.7.0; + +contract MutexPattern { + bool locked = false; + mapping(address => uint256) public balances; + + modifier noReentrancy() { + require(!locked, "রিএন্ট্রেন্সি থেকে ব্লক করা হয়েছে।"); + locked = true; + _; + locked = false; + } + // এই ফাংশনটি একটি মিউটেক্স দ্বারা সুরক্ষিত, তাই `msg.sender.call` এর মধ্যে থেকে রিএন্ট্রেন্ট কলগুলো আবার `withdraw` কল করতে পারে না। + // `return` স্টেটমেন্ট `true` মূল্যায়ন করে কিন্তু এখনও মডিফায়ারে `locked = false` স্টেটমেন্ট মূল্যায়ন করে + function withdraw(uint _amount) public payable noReentrancy returns(bool) { + require(balances[msg.sender] >= _amount, "উইথড্র করার জন্য কোনো ব্যালেন্স নেই।"); + + balances[msg.sender] -= _amount; + (bool success, ) = msg.sender.call{value: _amount}(""); + require(success); + + return true; + } +} +``` + +আপনি একটি [পুল পেমেন্টস](https://docs.openzeppelin.com/contracts/5.x/api/security#PullPayment) সিস্টেমও ব্যবহার করতে পারেন যা ব্যবহারকারীদের স্মার্ট কন্ট্র্যাক্ট থেকে ফান্ড উইথড্র করতে বলে, "পুশ পেমেন্টস" সিস্টেমের পরিবর্তে যা অ্যাকাউন্টগুলোতে ফান্ড পাঠায়। এটি অজানা অ্যাড্রেসে অনিচ্ছাকৃতভাবে কোড ট্রিগার করার সম্ভাবনা দূর করে (এবং নির্দিষ্ট ডিনায়াল-অফ-সার্ভিস অ্যাটাকও প্রতিরোধ করতে পারে)। + +#### পূর্ণসংখ্যা আন্ডারফ্লো এবং ওভারফ্লো {#integer-underflows-and-overflows} + +একটি পূর্ণসংখ্যা ওভারফ্লো ঘটে যখন একটি গাণিতিক অপারেশনের ফলাফল মানের গ্রহণযোগ্য পরিসরের বাইরে চলে যায়, যার ফলে এটি সর্বনিম্ন প্রতিনিধিত্বযোগ্য মানে "রোল ওভার" করে। উদাহরণস্বরূপ, একটি `uint8` শুধুমাত্র 2^8-1=255 পর্যন্ত মান সংরক্ষণ করতে পারে। `255` এর চেয়ে বেশি মানের গাণিতিক অপারেশনগুলো ওভারফ্লো হবে এবং `uint`-কে `0` এ রিসেট করবে, যেমন একটি গাড়ির ওডোমিটার সর্বোচ্চ মাইলেজ (999999) পৌঁছানোর পরে 0 এ রিসেট হয়। + +পূর্ণসংখ্যা আন্ডারফ্লো অনুরূপ কারণে ঘটে: একটি গাণিতিক অপারেশনের ফলাফল গ্রহণযোগ্য পরিসরের নীচে চলে যায়। ধরুন আপনি একটি `uint8`-এ `0` ডিক্রিমেন্ট করার চেষ্টা করেছেন, ফলাফলটি কেবল সর্বোচ্চ প্রতিনিধিত্বযোগ্য মানে (`255`) রোল ওভার করবে। + +পূর্ণসংখ্যা ওভারফ্লো এবং আন্ডারফ্লো উভয়ই একটি কন্ট্র্যাক্টের স্টেট ভ্যারিয়েবলে অপ্রত্যাশিত পরিবর্তন ঘটাতে পারে এবং অপরিকল্পিত এক্সিকিউশনের কারণ হতে পারে। নীচে একটি উদাহরণ দেখানো হয়েছে যা দেখায় কিভাবে একজন অ্যাটাকার একটি স্মার্ট কন্ট্র্যাক্টে গাণিতিক ওভারফ্লো ব্যবহার করে একটি অবৈধ অপারেশন সম্পাদন করতে পারে: + +``` +pragma solidity ^0.7.6; + +// এই কন্ট্র্যাক্টটি একটি টাইম ভল্ট হিসেবে কাজ করার জন্য ডিজাইন করা হয়েছে। +// ব্যবহারকারী এই কন্ট্র্যাক্টে জমা করতে পারে কিন্তু অন্তত এক সপ্তাহের জন্য উইথড্র করতে পারে না। +// ব্যবহারকারী 1 সপ্তাহের অপেক্ষার সময়কাল পরেও অপেক্ষার সময় বাড়াতে পারে। + +/* +1. TimeLock ডিপ্লয় করুন +2. TimeLock এর অ্যাড্রেস দিয়ে Attack ডিপ্লয় করুন +3. 1 ইথার পাঠিয়ে Attack.attack কল করুন। আপনি অবিলম্বে আপনার ইথার + উইথড্র করতে পারবেন। + +কি হলো? +Attack TimeLock.lockTime ওভারফ্লো ঘটিয়েছে এবং 1 সপ্তাহের অপেক্ষার সময়কালের আগে উইথড্র করতে পেরেছে। +*/ + +contract TimeLock { + mapping(address => uint) public balances; + mapping(address => uint) public lockTime; + + function deposit() external payable { + balances[msg.sender] += msg.value; + lockTime[msg.sender] = block.timestamp + 1 weeks; + } + + function increaseLockTime(uint _secondsToIncrease) public { + lockTime[msg.sender] += _secondsToIncrease; + } + + function withdraw() public { + require(balances[msg.sender] > 0, "অপর্যাপ্ত ফান্ড"); + require(block.timestamp > lockTime[msg.sender], "লক টাইম মেয়াদোত্তীর্ণ হয়নি"); + + uint amount = balances[msg.sender]; + balances[msg.sender] = 0; + + (bool sent, ) = msg.sender.call{value: amount}(""); + require(sent, "ইথার পাঠাতে ব্যর্থ"); + } +} + +contract Attack { + TimeLock timeLock; + + constructor(TimeLock _timeLock) { + timeLock = TimeLock(_timeLock); + } + + fallback() external payable {} + + function attack() public payable { + timeLock.deposit{value: msg.value}(); + /* + যদি t = বর্তমান লক টাইম হয় তবে আমাদের এমন x খুঁজে বের করতে হবে যাতে + x + t = 2**256 = 0 + তাই x = -t + 2**256 = type(uint).max + 1 + তাই x = type(uint).max + 1 - t + */ + timeLock.increaseLockTime( + type(uint).max + 1 - timeLock.lockTime(address(this)) + ); + timeLock.withdraw(); + } +} +``` + +##### কিভাবে পূর্ণসংখ্যা আন্ডারফ্লো এবং ওভারফ্লো প্রতিরোধ করা যায় + +ভার্সন 0.8.0 থেকে, Solidity কম্পাইলার সেই কোড প্রত্যাখ্যান করে যা পূর্ণসংখ্যা আন্ডারফ্লো এবং ওভারফ্লো ঘটায়। যাইহোক, একটি নিম্ন কম্পাইলার সংস্করণ দিয়ে কম্পাইল করা কন্ট্র্যাক্টগুলোতে হয় গাণিতিক অপারেশন জড়িত ফাংশনগুলোতে চেক সম্পাদন করা উচিত অথবা একটি লাইব্রেরি (যেমন, [SafeMath](https://docs.openzeppelin.com/contracts/2.x/api/math)) ব্যবহার করা উচিত যা আন্ডারফ্লো/ওভারফ্লো জন্য চেক করে। + +#### ওরাকল ম্যানিপুলেশন {#oracle-manipulation} + +[ওরাকলস](/developers/docs/oracles/) অফচেন তথ্য উৎস করে এবং স্মার্ট কন্ট্র্যাক্ট ব্যবহারের জন্য অনচেইনে পাঠায়। ওরাকলের সাহায্যে, আপনি এমন স্মার্ট কন্ট্র্যাক্ট ডিজাইন করতে পারেন যা অফচেন সিস্টেমের সাথে ইন্টারঅপারেট করে, যেমন মূলধনের বাজার, যা তাদের অ্যাপ্লিকেশনকে ব্যাপকভাবে প্রসারিত করে। + +কিন্তু যদি ওরাকলটি দুর্নীতিগ্রস্ত হয় এবং অনচেইনে ভুল তথ্য পাঠায়, স্মার্ট কন্ট্র্যাক্টগুলো ভুল ইনপুটের উপর ভিত্তি করে এক্সিকিউট হবে, যা সমস্যা সৃষ্টি করতে পারে। এটি “ওরাকল সমস্যা”র ভিত্তি, যা একটি ব্লকচেইন ওরাকল থেকে তথ্য সঠিক, আপ-টু-ডেট এবং সময়মত কিনা তা নিশ্চিত করার কাজ নিয়ে উদ্বিগ্ন। + +একটি সম্পর্কিত নিরাপত্তা উদ্বেগ হল একটি অনচেন ওরাকল, যেমন একটি ডিসেন্ট্রালাইজড এক্সচেঞ্জ, ব্যবহার করে একটি সম্পদের স্পট মূল্য পাওয়া। [ডিসেন্ট্রালাইজড ফাইন্যান্স (DeFi)](/defi/) শিল্পের লেন্ডিং প্ল্যাটফর্মগুলো প্রায়শই এটি করে ব্যবহারকারীর কোল্যাটেরালের মূল্য নির্ধারণ করতে, যাতে তারা কতটুকু ধার নিতে পারবে তা নির্ধারণ করা যায়। + +DEX মূল্য প্রায়শই সঠিক হয়, মূলত আরবিট্রেজররা বাজারে প্যারিটি পুনরুদ্ধার করার কারণে। যাইহোক, তারা ম্যানিপুলেশনের জন্য উন্মুক্ত, বিশেষ করে যদি অনচেন ওরাকল ঐতিহাসিক ট্রেডিং প্যাটার্নের উপর ভিত্তি করে সম্পদের মূল্য গণনা করে (যেমনটি সাধারণত হয়)। + +উদাহরণস্বরূপ, একজন অ্যাটাকার আপনার লেন্ডিং কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার ঠিক আগে একটি ফ্ল্যাশ লোন নিয়ে একটি সম্পদের স্পট মূল্য কৃত্রিমভাবে পাম্প করতে পারে। সম্পদের মূল্যের জন্য DEX-কে কোয়েরি করলে একটি স্বাভাবিকের চেয়ে বেশি মান ফেরত আসবে (অ্যাটাকারের বড় “ক্রয় অর্ডার” সম্পদের চাহিদা বিকৃত করার কারণে), যা তাদের প্রয়োজনের চেয়ে বেশি ধার নিতে দেয়। এই ধরনের "ফ্ল্যাশ লোন অ্যাটাক" DeFi অ্যাপ্লিকেশনগুলোর মধ্যে মূল্য ওরাকলের উপর নির্ভরতা কাজে লাগাতে ব্যবহার করা হয়েছে, যা প্রোটোকলগুলোকে লক্ষ লক্ষ ডলারের ফান্ড হারিয়েছে। + +##### কিভাবে ওরাকল ম্যানিপুলেশন প্রতিরোধ করা যায় + +[ওরাকল ম্যানিপুলেশন এড়ানোর](https://www.cyfrin.io/blog/price-oracle-manipultion-attacks-with-examples) জন্য ন্যূনতম প্রয়োজনীয়তা হল একটি ডিসেন্ট্রালাইজড ওরাকল নেটওয়ার্ক ব্যবহার করা যা একাধিক উৎস থেকে তথ্য কোয়েরি করে যাতে সিঙ্গেল পয়েন্ট অফ ফেলিওর এড়ানো যায়। বেশিরভাগ ক্ষেত্রে, ডিসেন্ট্রালাইজড ওরাকলগুলোতে বিল্ট-ইন ক্রিপ্টোইকোনমিক ইনসেনটিভ থাকে যা ওরাকল নোডগুলোকে সঠিক তথ্য রিপোর্ট করতে উৎসাহিত করে, যা তাদের সেন্ট্রালাইজড ওরাকলের চেয়ে বেশি সুরক্ষিত করে তোলে। + +যদি আপনি সম্পদের মূল্যের জন্য একটি অনচেন ওরাকল কোয়েরি করার পরিকল্পনা করেন, তবে এমন একটি ব্যবহার করার কথা বিবেচনা করুন যা একটি টাইম-ওয়েটেড অ্যাভারেজ প্রাইস (TWAP) মেকানিজম বাস্তবায়ন করে। একটি [TWAP ওরাকল](https://docs.uniswap.org/contracts/v2/concepts/core-concepts/oracles) দুটি ভিন্ন সময়ে (যা আপনি পরিবর্তন করতে পারেন) একটি সম্পদের মূল্য কোয়েরি করে এবং প্রাপ্ত গড়ের উপর ভিত্তি করে স্পট মূল্য গণনা করে। দীর্ঘ সময়কাল বেছে নেওয়া আপনার প্রোটোকলকে মূল্য ম্যানিপুলেশন থেকে রক্ষা করে কারণ সম্প্রতি এক্সিকিউট করা বড় অর্ডারগুলো সম্পদের মূল্যকে প্রভাবিত করতে পারে না। + +## ডেভেলপারদের জন্য স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা রিসোর্স {#smart-contract-security-resources-for-developers} + +### স্মার্ট কন্ট্র্যাক্ট বিশ্লেষণ এবং কোডের সঠিকতা যাচাই করার জন্য টুলস {#code-analysis-tools} + +- **[টেস্টিং টুলস এবং লাইব্রেরি](/developers/docs/smart-contracts/testing/#testing-tools-and-libraries)** - _স্মার্ট কন্ট্র্যাক্টে ইউনিট টেস্ট, স্ট্যাটিক বিশ্লেষণ এবং ডাইনামিক বিশ্লেষণ সম্পাদনের জন্য ইন্ডাস্ট্রি-স্ট্যান্ডার্ড টুলস এবং লাইব্রেরির সংগ্রহ।_ + +- **[ফর্মাল ভেরিফিকেশন টুলস](/developers/docs/smart-contracts/formal-verification/#formal-verification-tools)** - _স্মার্ট কন্ট্র্যাক্টে ফাংশনাল সঠিকতা যাচাই এবং ইনভ্যারিয়েন্ট চেক করার জন্য টুলস।_ + +- **[স্মার্ট কন্ট্র্যাক্ট অডিটিং পরিষেবা](/developers/docs/smart-contracts/testing/#smart-contract-auditing-services)** - _ইথেরিয়াম ডেভেলপমেন্ট প্রজেক্টের জন্য স্মার্ট কন্ট্র্যাক্ট অডিটিং পরিষেবা প্রদানকারী সংস্থাগুলোর তালিকা।_ + +- **[বাগ বাউন্টি প্ল্যাটফর্ম](/developers/docs/smart-contracts/testing/#bug-bounty-platforms)** - _বাগ বাউন্টি সমন্বয় এবং স্মার্ট কন্ট্র্যাক্টে গুরুতর দুর্বলতার দায়িত্বশীল প্রকাশের জন্য পুরস্কৃত করার প্ল্যাটফর্ম।_ + +- **[Fork Checker](https://forkchecker.hashex.org/)** - _একটি ফর্ক করা কন্ট্র্যাক্ট সম্পর্কিত সমস্ত উপলব্ধ তথ্য পরীক্ষা করার জন্য একটি বিনামূল্যের অনলাইন টুল।_ + +- **[ABI Encoder](https://abi.hashex.org/)** - _আপনার Solidity কন্ট্র্যাক্ট ফাংশন এবং কনস্ট্রাক্টর আর্গুমেন্ট এনকোড করার জন্য একটি বিনামূল্যের অনলাইন পরিষেবা।_ + +- **[Aderyn](https://github.com/Cyfrin/aderyn)** - _Solidity স্ট্যাটিক অ্যানালাইজার, অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (AST) ট্র্যাভার্স করে সন্দেহজনক দুর্বলতা চিহ্নিত করে এবং সহজে ব্যবহারযোগ্য মার্কডাউন ফরম্যাটে সমস্যাগুলো প্রিন্ট করে।_ + +### স্মার্ট কন্ট্র্যাক্ট মনিটরিংয়ের জন্য টুলস {#smart-contract-monitoring-tools} + +- **[Tenderly রিয়েল-টাইম অ্যালার্টিং](https://tenderly.co/monitoring)** - _আপনার স্মার্ট কন্ট্র্যাক্ট বা ওয়ালেটে অস্বাভাবিক বা অপ্রত্যাশিত ইভেন্ট ঘটলে রিয়েল-টাইম নোটিফিকেশন পাওয়ার জন্য একটি টুল।_ + +### স্মার্ট কন্ট্র্যাক্টের সুরক্ষিত প্রশাসনের জন্য টুলস {#smart-contract-administration-tools} + +- **[Safe](https://safe.global/)** - _ইথেরিয়ামে চলমান স্মার্ট কন্ট্র্যাক্ট ওয়ালেট যার জন্য একটি লেনদেন ঘটার আগে ন্যূনতম সংখ্যক লোকের অনুমোদন প্রয়োজন (M-of-N)।_ + +- **[OpenZeppelin Contracts](https://docs.openzeppelin.com/contracts/5.x/)** - _কন্ট্র্যাক্ট মালিকানা, আপগ্রেড, অ্যাক্সেস কন্ট্রোল, গভর্নেন্স, পজেবিলিটি এবং আরও অনেক কিছু সহ প্রশাসনিক বৈশিষ্ট্য বাস্তবায়নের জন্য কন্ট্র্যাক্ট লাইব্রেরি।_ + +### স্মার্ট কন্ট্র্যাক্ট অডিটিং পরিষেবা {#smart-contract-auditing-services} + +- **[ConsenSys Diligence](https://diligence.consensys.io/)** - _স্মার্ট কন্ট্র্যাক্ট অডিটিং পরিষেবা যা ব্লকচেইন ইকোসিস্টেম জুড়ে প্রকল্পগুলোকে তাদের প্রোটোকলগুলো লঞ্চের জন্য প্রস্তুত এবং ব্যবহারকারীদের সুরক্ষার জন্য নির্মিত তা নিশ্চিত করতে সাহায্য করে।_ + +- **[CertiK](https://www.certik.com/)** - _ব্লকচেইন নিরাপত্তা সংস্থা যা স্মার্ট কন্ট্র্যাক্ট এবং ব্লকচেইন নেটওয়ার্কে অত্যাধুনিক ফর্মাল ভেরিফিকেশন প্রযুক্তির ব্যবহারে অগ্রণী ভূমিকা পালন করছে।_ + +- **[Trail of Bits](https://www.trailofbits.com/)** - _সাইবারসিকিউরিটি কোম্পানি যা ঝুঁকি কমাতে এবং কোডকে শক্তিশালী করতে নিরাপত্তা গবেষণার সাথে একজন অ্যাটাকারের মানসিকতাকে একত্রিত করে।_ + +- **[PeckShield](https://peckshield.com/)** - _ব্লকচেইন নিরাপত্তা সংস্থা যা সমগ্র ব্লকচেইন ইকোসিস্টেমের নিরাপত্তা, গোপনীয়তা এবং ব্যবহারযোগ্যতার জন্য পণ্য এবং পরিষেবা সরবরাহ করে।_ + +- **[QuantStamp](https://quantstamp.com/)** - _নিরাপত্তা এবং ঝুঁকি মূল্যায়ন পরিষেবার মাধ্যমে ব্লকচেইন প্রযুক্তির মূলধারার গ্রহণকে সহজতরকারী অডিটিং পরিষেবা।_ + +- **[OpenZeppelin](https://www.openzeppelin.com/security-audits)** - _স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা সংস্থা যা ডিস্ট্রিবিউটেড সিস্টেমের জন্য নিরাপত্তা অডিট প্রদান করে।_ + +- **[Runtime Verification](https://runtimeverification.com/)** - _নিরাপত্তা সংস্থা যা স্মার্ট কন্ট্র্যাক্টের ফর্মাল মডেলিং এবং ভেরিফিকেশনে বিশেষজ্ঞ।_ + +- **[Hacken](https://hacken.io)** - _ওয়েব3 সাইবারসিকিউরিটি অডিটর যা ব্লকচেইন নিরাপত্তায় ৩৬০-ডিগ্রি পদ্ধতি নিয়ে আসে।_ + +- **[Nethermind](https://www.nethermind.io/smart-contract-audits)** - _Solidity এবং Cairo অডিটিং পরিষেবা, যা Ethereum এবং Starknet জুড়ে স্মার্ট কন্ট্র্যাক্টের অখণ্ডতা এবং ব্যবহারকারীদের নিরাপত্তা নিশ্চিত করে।_ + +- **[HashEx](https://hashex.org/)** - _HashEx ব্লকচেইন এবং স্মার্ট কন্ট্র্যাক্ট অডিটিংয়ে ফোকাস করে ক্রিপ্টোকারেন্সির নিরাপত্তা নিশ্চিত করতে, যেমন স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্ট, পেনিট্রেশন টেস্টিং, ব্লকচেইন কনসাল্টিং পরিষেবা প্রদান করে।_ + +- **[Code4rena](https://code4rena.com/)** - _প্রতিযোগিতামূলক অডিট প্ল্যাটফর্ম যা স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা বিশেষজ্ঞদের দুর্বলতা খুঁজে বের করতে এবং ওয়েব3 কে আরও সুরক্ষিত করতে সাহায্য করার জন্য উৎসাহিত করে।_ + +- **[CodeHawks](https://codehawks.com/)** - _প্রতিযোগিতামূলক অডিট প্ল্যাটফর্ম যা নিরাপত্তা গবেষকদের জন্য স্মার্ট কন্ট্র্যাক্ট অডিটিং প্রতিযোগিতার আয়োজন করে।_ + +- **[Cyfrin](https://cyfrin.io)** - _ওয়েব3 নিরাপত্তা পাওয়ারহাউস, যা পণ্য এবং স্মার্ট কন্ট্র্যাক্ট অডিটিং পরিষেবার মাধ্যমে ক্রিপ্টো নিরাপত্তাকে ইনকিউবেট করে।_ + +- **[ImmuneBytes](https://immunebytes.com/smart-contract-audit/)** - _ওয়েব3 নিরাপত্তা সংস্থা যা অভিজ্ঞ অডিটর এবং সেরা-শ্রেণীর টুলসের একটি দলের মাধ্যমে ব্লকচেইন সিস্টেমের জন্য নিরাপত্তা অডিট সরবরাহ করে।_ + +- **[Oxorio](https://oxor.io/)** - _স্মার্ট কন্ট্র্যাক্ট অডিট এবং ব্লকচেইন নিরাপত্তা পরিষেবা যা EVM, Solidity, ZK, ক্রিপ্টো ফার্ম এবং DeFi প্রকল্পের জন্য ক্রস-চেইন প্রযুক্তিতে বিশেষজ্ঞ।_ + +- **[Inference](https://inference.ag/)** - _নিরাপত্তা অডিটিং কোম্পানি, যা EVM-ভিত্তিক ব্লকচেইনের জন্য স্মার্ট কন্ট্র্যাক্ট অডিটিংয়ে বিশেষজ্ঞ। এর বিশেষজ্ঞ অডিটরদের ধন্যবাদ, তারা সম্ভাব্য সমস্যাগুলো চিহ্নিত করে এবং ডিপ্লয়মেন্টের আগে সেগুলো সমাধানের জন্য কার্যকর সমাধান প্রস্তাব করে।_ + +### বাগ বাউন্টি প্ল্যাটফর্ম {#bug-bounty-platforms} + +- **[Immunefi](https://immunefi.com/)** - _স্মার্ট কন্ট্র্যাক্ট এবং DeFi প্রকল্পগুলোর জন্য বাগ বাউন্টি প্ল্যাটফর্ম, যেখানে নিরাপত্তা গবেষকরা কোড পর্যালোচনা করে, দুর্বলতা প্রকাশ করে, অর্থ প্রদান পায় এবং ক্রিপ্টোকে আরও নিরাপদ করে তোলে।_ + +- **[HackerOne](https://www.hackerone.com/)** - _দুর্বলতা সমন্বয় এবং বাগ বাউন্টি প্ল্যাটফর্ম যা ব্যবসাগুলোকে পেনিট্রেশন টেস্টার এবং সাইবারসিকিউরিটি গবেষকদের সাথে সংযুক্ত করে।_ + +- **[HackenProof](https://hackenproof.com/)** - _ক্রিপ্টো প্রকল্পগুলোর (DeFi, স্মার্ট কন্ট্র্যাক্ট, ওয়ালেট, CEX এবং আরও অনেক কিছু) জন্য বিশেষজ্ঞ বাগ বাউন্টি প্ল্যাটফর্ম, যেখানে নিরাপত্তা পেশাদাররা ট্রায়াজ পরিষেবা প্রদান করে এবং গবেষকরা প্রাসঙ্গিক, যাচাইকৃত বাগ রিপোর্টের জন্য অর্থ প্রদান পায়।_ + +- **[Sherlock](https://www.sherlock.xyz/)** - _স্মার্ট কন্ট্র্যাক্ট নিরাপত্তার জন্য ওয়েব3-এর আন্ডাররাইটার, যেখানে অডিটরদের জন্য পেআউট স্মার্ট কন্ট্র্যাক্টের মাধ্যমে পরিচালিত হয় যাতে প্রাসঙ্গিক বাগগুলো ন্যায্যভাবে পরিশোধ করা হয় তা নিশ্চিত করা যায়।_ + +- **[CodeHawks](https://www.codehawks.com/)** - _প্রতিযোগিতামূলক বাগ বাউন্টি প্ল্যাটফর্ম যেখানে অডিটররা নিরাপত্তা প্রতিযোগিতা এবং চ্যালেঞ্জে অংশ নেয় এবং (শীঘ্রই) তাদের নিজস্ব ব্যক্তিগত অডিটে অংশ নেবে।_ + +### পরিচিত স্মার্ট কন্ট্র্যাক্ট দুর্বলতা এবং এক্সপ্লয়েটের প্রকাশনা {#common-smart-contract-vulnerabilities-and-exploits} + +- **[ConsenSys: স্মার্ট কন্ট্র্যাক্টের পরিচিত অ্যাটাক](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/)** - _সবচেয়ে গুরুত্বপূর্ণ কন্ট্র্যাক্ট দুর্বলতার শিক্ষানবিস-বান্ধব ব্যাখ্যা, বেশিরভাগ ক্ষেত্রে স্যাম্পল কোড সহ।_ + +- **[SWC রেজিস্ট্রি](https://swcregistry.io/)** - _কমন উইকনেস এনুমারেশন (CWE) আইটেমগুলোর একটি কিউরেটেড তালিকা যা ইথেরিয়াম স্মার্ট কন্ট্র্যাক্টে প্রযোজ্য।_ + +- **[Rekt](https://rekt.news/)** - _নিয়মিতভাবে আপডেট হওয়া উচ্চ-প্রোফাইল ক্রিপ্টো হ্যাক এবং এক্সপ্লয়েটের প্রকাশনা, সাথে বিস্তারিত পোস্ট-মর্টেম রিপোর্ট।_ + +### স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা শেখার জন্য চ্যালেঞ্জ {#challenges-for-learning-smart-contract-security} + +- **[Awesome BlockSec CTF](https://github.com/blockthreat/blocksec-ctfs)** - _ব্লকচেইন নিরাপত্তা ওয়ারগেম, চ্যালেঞ্জ, এবং [ক্যাপচার দ্য ফ্ল্যাগ](https://www.webopedia.com/definitions/ctf-event/amp/) প্রতিযোগিতা এবং সমাধান রাইটআপের একটি কিউরেটেড তালিকা।_ + +- **[Damn Vulnerable DeFi](https://www.damnvulnerabledefi.xyz/)** - _DeFi স্মার্ট কন্ট্র্যাক্টের আক্রমণাত্মক নিরাপত্তা শেখার এবং বাগ-হান্টিং ও নিরাপত্তা অডিটিংয়ে দক্ষতা তৈরির জন্য ওয়ারগেম।_ + +- **[Ethernaut](https://ethernaut.openzeppelin.com/)** - _ওয়েব3/Solidity-ভিত্তিক ওয়ারগেম যেখানে প্রতিটি লেভেল একটি স্মার্ট কন্ট্র্যাক্ট যা 'হ্যাক' করতে হবে।_ + +- **[HackenProof x HackTheBox](https://app.hackthebox.com/tracks/HackenProof-Track)** - _একটি ফ্যান্টাসি অ্যাডভেঞ্চারে সেট করা স্মার্ট কন্ট্র্যাক্ট হ্যাকিং চ্যালেঞ্জ। চ্যালেঞ্জটি সফলভাবে সম্পন্ন করলে একটি ব্যক্তিগত বাগ বাউন্টি প্রোগ্রামে অ্যাক্সেসও পাওয়া যায়।_ + +### স্মার্ট কন্ট্র্যাক্ট সুরক্ষিত করার জন্য সেরা অনুশীলন {#smart-contract-security-best-practices} + +- **[ConsenSys: ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা সেরা অনুশীলন](https://consensys.github.io/smart-contract-best-practices/)** - _ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট সুরক্ষিত করার জন্য নির্দেশাবলীর একটি বিস্তৃত তালিকা।_ + +- **[Nascent: সিম্পল সিকিউরিটি টুলকিট](https://github.com/nascentxyz/simple-security-toolkit)** - _স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্টের জন্য ব্যবহারিক নিরাপত্তা-কেন্দ্রিক গাইড এবং চেকলিস্টের সংগ্রহ।_ + +- **[Solidity প্যাটার্নস](https://fravoll.github.io/solidity-patterns/)** - _স্মার্ট কন্ট্র্যাক্ট প্রোগ্রামিং ভাষা Solidity-এর জন্য সুরক্ষিত প্যাটার্ন এবং সেরা অনুশীলনের একটি দরকারী সংকলন।_ + +- **[Solidity ডক্স: নিরাপত্তা বিবেচনা](https://docs.soliditylang.org/en/v0.8.16/security-considerations.html)** - _Solidity দিয়ে সুরক্ষিত স্মার্ট কন্ট্র্যাক্ট লেখার জন্য নির্দেশিকা।_ + +- **[স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা যাচাইকরণ স্ট্যান্ডার্ড](https://github.com/securing/SCSVS)** - _ডেভেলপার, আর্কিটেক্ট, নিরাপত্তা পর্যালোচক এবং বিক্রেতাদের জন্য স্মার্ট কন্ট্র্যাক্টের নিরাপত্তা মানক করার জন্য তৈরি করা চৌদ্দ-অংশের চেকলিস্ট।_ + +- **[স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা এবং অডিটিং শিখুন](https://updraft.cyfrin.io/courses/security)** - _চূড়ান্ত স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা এবং অডিটিং কোর্স, যা স্মার্ট কন্ট্র্যাক্ট ডেভেলপারদের জন্য তৈরি করা হয়েছে যারা তাদের নিরাপত্তা সেরা অনুশীলনগুলো উন্নত করতে এবং নিরাপত্তা গবেষক হতে চান।_ + +### স্মার্ট কন্ট্র্যাক্ট নিরাপত্তার উপর টিউটোরিয়াল {#tutorials-on-smart-contract-security} + +- [কিভাবে সুরক্ষিত স্মার্ট কন্ট্র্যাক্ট লিখবেন](/developers/tutorials/secure-development-workflow/) + +- [স্মার্ট কন্ট্র্যাক্ট বাগ খুঁজে পেতে কিভাবে Slither ব্যবহার করবেন](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) + +- [স্মার্ট কন্ট্র্যাক্ট বাগ খুঁজে পেতে কিভাবে Manticore ব্যবহার করবেন](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) + +- [স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা নির্দেশিকা](/developers/tutorials/smart-contract-security-guidelines/) + +- [কিভাবে আপনার টোকেন কন্ট্র্যাক্টকে নির্বিচারে টোকেনগুলোর সাথে নিরাপদে একীভূত করবেন](/developers/tutorials/token-integration-checklist/) + +- [সাইফ্রিন আপড্রাফট - স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা এবং অডিটিং সম্পূর্ণ কোর্স](https://updraft.cyfrin.io/courses/security) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/testing/index.md b/public/content/translations/bn/developers/docs/smart-contracts/testing/index.md new file mode 100644 index 00000000000..137986ef331 --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/testing/index.md @@ -0,0 +1,310 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট টেস্টিং" +description: "ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করার জন্য কৌশল এবং বিবেচ্য বিষয়গুলির একটি সংক্ষিপ্ত বিবরণ।" +lang: bn +--- + +ইথেরিয়াম-এর মতো পাবলিক ব্লকচেইন অপরিবর্তনীয়, যা ডেপ্লয়মেন্টের পরে একটি স্মার্ট কন্ট্র্যাক্ট-এর কোড পরিবর্তন করা কঠিন করে তোলে। "ভার্চুয়াল আপগ্রেড" সম্পাদনের জন্য [কন্ট্র্যাক্ট আপগ্রেড প্যাটার্ন](/developers/docs/smart-contracts/upgrading/) বিদ্যমান, কিন্তু এগুলি বাস্তবায়ন করা কঠিন এবং এর জন্য সামাজিক কনসেন্সাস প্রয়োজন। অধিকন্তু, একটি আপগ্রেড শুধুমাত্র একটি ত্রুটি আবিষ্কৃত হওয়ার _পরেই_ তা ঠিক করতে পারে—যদি একজন আক্রমণকারী প্রথমে দুর্বলতাটি আবিষ্কার করে, তবে আপনার স্মার্ট কন্ট্র্যাক্ট একটি এক্সপ্লয়েটের ঝুঁকিতে থাকবে। + +এই কারণগুলির জন্য, Mainnet-এ [ডেপ্লয়](/developers/docs/smart-contracts/deploying/) করার আগে স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করা [নিরাপত্তার](/developers/docs/smart-contracts/security/) জন্য একটি ন্যূনতম প্রয়োজনীয়তা। কন্ট্র্যাক্ট পরীক্ষা করা এবং কোডের সঠিকতা মূল্যায়নের জন্য অনেক কৌশল রয়েছে; আপনি কোনটি বেছে নেবেন তা আপনার প্রয়োজনের উপর নির্ভর করে। তা সত্ত্বেও, কন্ট্র্যাক্ট কোডে ছোট এবং বড় উভয় নিরাপত্তা ত্রুটি ধরার জন্য বিভিন্ন টুলস এবং পদ্ধতির সমন্বয়ে তৈরি একটি টেস্ট স্যুট আদর্শ। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি ইথেরিয়াম নেটওয়ার্কে ডেপ্লয় করার আগে কীভাবে স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করতে হয় তা ব্যাখ্যা করে। এটি ধরে নেওয়া হয়েছে যে আপনি [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) সম্পর্কে পরিচিত। + +## স্মার্ট কন্ট্র্যাক্ট টেস্টিং কী? {#what-is-smart-contract-testing} + +স্মার্ট কন্ট্র্যাক্ট টেস্টিং হল একটি স্মার্ট কন্ট্র্যাক্টের কোড প্রত্যাশা অনুযায়ী কাজ করছে কিনা তা যাচাই করার প্রক্রিয়া। একটি নির্দিষ্ট স্মার্ট কন্ট্র্যাক্ট নির্ভরযোগ্যতা, ব্যবহারযোগ্যতা এবং নিরাপত্তার জন্য প্রয়োজনীয়তা পূরণ করে কিনা তা পরীক্ষা করার জন্য টেস্টিং উপযোগী। + +যদিও পদ্ধতিগুলো ভিন্ন হয়, তবে বেশিরভাগ টেস্টিং পদ্ধতির জন্য একটি স্মার্ট কন্ট্র্যাক্টকে ডেটার একটি ছোট নমুনা দিয়ে এক্সিকিউট করতে হয় যা এটি পরিচালনা করবে বলে আশা করা হয়। যদি কন্ট্র্যাক্টটি নমুনা ডেটার জন্য সঠিক ফলাফল দেয়, তবে ধরে নেওয়া হয় যে এটি সঠিকভাবে কাজ করছে। বেশিরভাগ টেস্টিং টুলস একটি কন্ট্র্যাক্টের এক্সিকিউশন প্রত্যাশিত ফলাফলের সাথে মেলে কিনা তা পরীক্ষা করার জন্য [টেস্ট কেস](https://en.m.wikipedia.org/wiki/Test_case) লেখা এবং এক্সিকিউট করার জন্য রিসোর্স সরবরাহ করে। + +### স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করা কেন গুরুত্বপূর্ণ? {#importance-of-testing-smart-contracts} + +যেহেতু স্মার্ট কন্ট্র্যাক্ট প্রায়ই উচ্চ-মূল্যের আর্থিক সম্পদ পরিচালনা করে, তাই ছোটখাটো প্রোগ্রামিং ত্রুটি [ব্যবহারকারীদের জন্য বিশাল ক্ষতির](https://rekt.news/leaderboard/) কারণ হতে পারে এবং প্রায়শই হয়। তবে, কঠোর টেস্টিং একটি স্মার্ট কন্ট্র্যাক্টের কোডে থাকা ত্রুটি এবং সমস্যাগুলি আগে থেকে আবিষ্কার করতে এবং Mainnet-এ চালু করার আগে সেগুলি ঠিক করতে আপনাকে সাহায্য করতে পারে। + +যদিও একটি বাগ আবিষ্কৃত হলে কন্ট্র্যাক্ট আপগ্রেড করা সম্ভব, তবে আপগ্রেডগুলি জটিল এবং ভুলভাবে পরিচালনা করা হলে [ত্রুটির কারণ হতে পারে](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/)। একটি কন্ট্র্যাক্ট আপগ্রেড করা অপরিবর্তনীয়তার নীতিকে আরও অস্বীকার করে এবং ব্যবহারকারীদের উপর অতিরিক্ত বিশ্বাসের অনুমানের বোঝা চাপায়। বিপরীতভাবে, আপনার কন্ট্র্যাক্ট পরীক্ষা করার জন্য একটি ব্যাপক পরিকল্পনা স্মার্ট কন্ট্র্যাক্টের নিরাপত্তা ঝুঁকি কমায় এবং ডেপ্লয় করার পরে জটিল লজিক আপগ্রেড করার প্রয়োজন কমিয়ে দেয়। + +## স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করার পদ্ধতি {#methods-for-testing-smart-contracts} + +ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করার পদ্ধতি দুটি প্রধান বিভাগে পড়ে: **স্বয়ংক্রিয় টেস্টিং** এবং **ম্যানুয়াল টেস্টিং**। স্বয়ংক্রিয় টেস্টিং এবং ম্যানুয়াল টেস্টিং অনন্য সুবিধা এবং ট্রেডঅফ অফার করে, কিন্তু আপনি আপনার কন্ট্র্যাক্ট বিশ্লেষণ করার জন্য একটি শক্তিশালী পরিকল্পনা তৈরি করতে উভয়কে একত্রিত করতে পারেন। + +### স্বয়ংক্রিয় টেস্টিং {#automated-testing} + +স্বয়ংক্রিয় টেস্টিং এমন টুলস ব্যবহার করে যা এক্সিকিউশনের ত্রুটির জন্য একটি স্মার্ট কন্ট্র্যাক্টের কোড স্বয়ংক্রিয়ভাবে পরীক্ষা করে। স্বয়ংক্রিয় টেস্টিংয়ের সুবিধাটি কন্ট্র্যাক্টের কার্যকারিতার মূল্যায়নকে গাইড করার জন্য [স্ক্রিপ্ট](https://www.techtarget.com/whatis/definition/script?amp=1) ব্যবহার করা থেকে আসে। স্ক্রিপ্টেড টেস্টগুলি ন্যূনতম মানুষের হস্তক্ষেপের সাথে বারবার চালানোর জন্য সময়সূচী করা যেতে পারে, যা স্বয়ংক্রিয় টেস্টিংকে টেস্টিংয়ের ম্যানুয়াল পদ্ধতির চেয়ে আরও দক্ষ করে তোলে। + +স্বয়ংক্রিয় টেস্টিং বিশেষভাবে উপযোগী যখন টেস্টগুলি পুনরাবৃত্তিমূলক এবং সময়সাপেক্ষ হয়; ম্যানুয়ালি সম্পাদন করা কঠিন; মানুষের ভুলের প্রবণ; অথবা জটিল কন্ট্র্যাক্ট ফাংশন মূল্যায়ন জড়িত থাকে। কিন্তু স্বয়ংক্রিয় টেস্টিং টুলসের কিছু অসুবিধা থাকতে পারে—এগুলো কিছু বাগ মিস করতে পারে এবং অনেক [ফলস পজিটিভ](https://www.contrastsecurity.com/glossary/false-positive) তৈরি করতে পারে। তাই, স্মার্ট কন্ট্র্যাক্টের জন্য স্বয়ংক্রিয় টেস্টিংয়ের সাথে ম্যানুয়াল টেস্টিং যুক্ত করা আদর্শ। + +### ম্যানুয়াল টেস্টিং {#manual-testing} + +ম্যানুয়াল টেস্টিং মানুষ-সহায়তায় করা হয় এবং এতে একটি স্মার্ট কন্ট্র্যাক্টের সঠিকতা বিশ্লেষণ করার সময় আপনার টেস্ট স্যুটের প্রতিটি টেস্ট কেস একের পর এক এক্সিকিউট করা জড়িত থাকে। এটি স্বয়ংক্রিয় টেস্টিংয়ের মতো নয়, যেখানে আপনি একই সাথে একটি কন্ট্র্যাক্টে একাধিক বিচ্ছিন্ন টেস্ট চালাতে পারেন এবং সমস্ত ব্যর্থ এবং পাস করা টেস্ট দেখানো একটি রিপোর্ট পেতে পারেন। + +ম্যানুয়াল টেস্টিং একজন একক ব্যক্তি দ্বারা একটি লিখিত টেস্ট প্ল্যান অনুসরণ করে করা যেতে পারে যা বিভিন্ন টেস্ট সিনারিও কভার করে। ম্যানুয়াল টেস্টিংয়ের অংশ হিসাবে আপনি একাধিক ব্যক্তি বা গোষ্ঠীকে একটি নির্দিষ্ট সময়ের জন্য একটি স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করাতেও পারেন। টেস্টাররা কন্ট্র্যাক্টের প্রকৃত আচরণকে প্রত্যাশিত আচরণের সাথে তুলনা করবে এবং যেকোনো পার্থক্যকে একটি বাগ হিসেবে ফ্ল্যাগ করবে। + +কার্যকর ম্যানুয়াল টেস্টিংয়ের জন্য যথেষ্ট রিসোর্স (দক্ষতা, সময়, অর্থ এবং প্রচেষ্টা) প্রয়োজন, এবং টেস্ট এক্সিকিউট করার সময় মানুষের ভুলের কারণে কিছু ত্রুটি মিস করা সম্ভব। কিন্তু ম্যানুয়াল টেস্টিং উপকারীও হতে পারে—উদাহরণস্বরূপ, একজন মানুষ টেস্টার (যেমন, একজন অডিটর) এমন এজ কেস শনাক্ত করতে অন্তর্দৃষ্টি ব্যবহার করতে পারে যা একটি স্বয়ংক্রিয় টেস্টিং টুল মিস করবে। + +## স্মার্ট কন্ট্র্যাক্টের জন্য স্বয়ংক্রিয় টেস্টিং {#automated-testing-for-smart-contracts} + +### ইউনিট টেস্টিং {#unit-testing-for-smart-contracts} + +ইউনিট টেস্টিং কন্ট্র্যাক্ট ফাংশনগুলিকে আলাদাভাবে মূল্যায়ন করে এবং প্রতিটি কম্পোনেন্ট সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করে। ভালো ইউনিট টেস্ট সহজ, দ্রুত চালানোর মতো হওয়া উচিত এবং টেস্ট ব্যর্থ হলে কী ভুল হয়েছে তার একটি স্পষ্ট ধারণা প্রদান করা উচিত। + +ফাংশনগুলি প্রত্যাশিত মান ফেরত দেয় কিনা এবং ফাংশন এক্সিকিউশনের পরে কন্ট্র্যাক্ট সংগ্রহস্থল সঠিকভাবে আপডেট হয় কিনা তা পরীক্ষা করার জন্য ইউনিট টেস্ট উপযোগী। অধিকন্তু, একটি কন্ট্র্যাক্টের কোডবেসে পরিবর্তন আনার পর ইউনিট টেস্ট চালালে এটি নিশ্চিত করা যায় যে নতুন লজিক যোগ করার ফলে কোনো ত্রুটি তৈরি হচ্ছে না। কার্যকরী ইউনিট টেস্ট চালানোর জন্য নিচে কিছু নির্দেশিকা দেওয়া হল: + +#### স্মার্ট কন্ট্র্যাক্টের ইউনিট টেস্টিংয়ের জন্য নির্দেশিকা {#unit-testing-guidelines} + +##### ১. আপনার কন্ট্র্যাক্টের ব্যবসায়িক যুক্তি এবং কর্মপ্রবাহ বুঝুন + +ইউনিট টেস্ট লেখার আগে, একটি স্মার্ট কন্ট্র্যাক্ট কী কী কার্যকারিতা অফার করে এবং ব্যবহারকারীরা কীভাবে সেই ফাংশনগুলি অ্যাক্সেস এবং ব্যবহার করবে তা জানা সাহায্য করে। এটি বিশেষত [হ্যাপি পাথ টেস্ট](https://en.m.wikipedia.org/wiki/Happy_path) চালানোর জন্য উপযোগী যা নির্ধারণ করে যে একটি কন্ট্র্যাক্টের ফাংশনগুলি বৈধ ব্যবহারকারী ইনপুটের জন্য সঠিক আউটপুট ফেরত দেয় কিনা। আমরা [একটি নিলাম কন্ট্র্যাক্ট](https://docs.soliditylang.org/en/v0.8.17/solidity-by-example.html?highlight=Auction%20contract#simple-open-auction)-এর এই (সংক্ষিপ্ত) উদাহরণ ব্যবহার করে এই ধারণাটি ব্যাখ্যা করব। + +```solidity +constructor( + uint biddingTime, + address payable beneficiaryAddress + ) { + beneficiary = beneficiaryAddress; + auctionEndTime = block.timestamp + biddingTime; + } + +function bid() external payable { + + if (block.timestamp > auctionEndTime) + revert AuctionAlreadyEnded(); + + if (msg.value <= highestBid) + revert BidNotHighEnough(highestBid); + + if (highestBid != 0) { + pendingReturns[highestBidder] += highestBid; + } + highestBidder = msg.sender; + highestBid = msg.value; + emit HighestBidIncreased(msg.sender, msg.value); + } + + function withdraw() external returns (bool) { + uint amount = pendingReturns[msg.sender]; + if (amount > 0) { + pendingReturns[msg.sender] = 0; + + if (!payable(msg.sender).send(amount)) { + pendingReturns[msg.sender] = amount; + return false; + } + } + return true; + } + +function auctionEnd() external { + if (block.timestamp < auctionEndTime) + revert AuctionNotYetEnded(); + if (ended) + revert AuctionEndAlreadyCalled(); + + ended = true; + emit AuctionEnded(highestBidder, highestBid); + + beneficiary.transfer(highestBid); + } +} +``` + +এটি একটি সাধারণ নিলাম কন্ট্র্যাক্ট যা বিডিং সময়কালে বিড গ্রহণ করার জন্য ডিজাইন করা হয়েছে। যদি `highestBid` বৃদ্ধি পায়, তাহলে পূর্ববর্তী সর্বোচ্চ দরদাতা তার টাকা ফেরত পায়; বিডিং সময়কাল শেষ হয়ে গেলে, `beneficiary` তার টাকা পেতে কন্ট্র্যাক্টটি কল করে। + +এই ধরনের একটি কন্ট্র্যাক্টের জন্য ইউনিট টেস্টগুলি বিভিন্ন ফাংশন কভার করবে যা একজন ব্যবহারকারী কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার সময় কল করতে পারে। একটি উদাহরণ হতে পারে একটি ইউনিট টেস্ট যা পরীক্ষা করে যে একজন ব্যবহারকারী নিলাম চলাকালীন বিড করতে পারে কিনা (অর্থাৎ, `bid()`-এ কল সফল হয়) অথবা একটি যা পরীক্ষা করে যে একজন ব্যবহারকারী বর্তমান `highestBid`-এর চেয়ে বেশি বিড করতে পারে কিনা। + +একটি কন্ট্র্যাক্টের অপারেশনাল কর্মপ্রবাহ বোঝা ইউনিট টেস্ট লিখতে সাহায্য করে যা এক্সিকিউশন প্রয়োজনীয়তা পূরণ করে কিনা তা পরীক্ষা করে। উদাহরণস্বরূপ, নিলাম কন্ট্র্যাক্টটি নির্দিষ্ট করে যে নিলাম শেষ হয়ে গেলে ব্যবহারকারীরা বিড করতে পারবে না (অর্থাৎ, যখন `auctionEndTime`, `block.timestamp`-এর থেকে কম হয়)। সুতরাং, একজন ডেভেলপার একটি ইউনিট টেস্ট চালাতে পারেন যা পরীক্ষা করে যে নিলাম শেষ হয়ে গেলে `bid()` ফাংশনে কল সফল হয় না ব্যর্থ হয় (অর্থাৎ, যখন `auctionEndTime` > `block.timestamp`)। + +##### 2. কন্ট্র্যাক্ট এক্সিকিউশন সম্পর্কিত সমস্ত অনুমান মূল্যায়ন করুন + +একটি কন্ট্র্যাক্টের এক্সিকিউশন সম্পর্কে যেকোনো অনুমান নথিভুক্ত করা এবং সেই অনুমানগুলির বৈধতা যাচাই করার জন্য ইউনিট টেস্ট লেখা গুরুত্বপূর্ণ। অপ্রত্যাশিত এক্সিকিউশনের বিরুদ্ধে সুরক্ষা অফার করার পাশাপাশি, টেস্টিং অ্যাসারশন আপনাকে এমন অপারেশন সম্পর্কে ভাবতে বাধ্য করে যা একটি স্মার্ট কন্ট্র্যাক্টের নিরাপত্তা মডেলকে ভেঙে দিতে পারে। একটি দরকারী টিপ হল "হ্যাপি ইউজার টেস্ট" এর বাইরে গিয়ে নেগেটিভ টেস্ট লেখা যা পরীক্ষা করে যে একটি ফাংশন ভুল ইনপুটের জন্য ব্যর্থ হয় কিনা। + +অনেক ইউনিট টেস্টিং ফ্রেমওয়ার্ক আপনাকে অ্যাসারশন তৈরি করতে দেয়—সাধারণ বিবৃতি যা বলে একটি কন্ট্র্যাক্ট কী করতে পারে এবং কী করতে পারে না—এবং সেই অ্যাসারশনগুলি এক্সিকিউশনের অধীনে টিকে থাকে কিনা তা দেখার জন্য টেস্ট চালাতে দেয়। পূর্বে বর্ণিত নিলাম কন্ট্র্যাক্টে কাজ করা একজন ডেভেলপার নেগেটিভ টেস্ট চালানোর আগে এর আচরণ সম্পর্কে নিম্নলিখিত অ্যাসারশনগুলি করতে পারেন: + +- নিলাম শেষ হয়ে গেলে বা শুরু না হলে ব্যবহারকারীরা বিড করতে পারবে না। + +- গ্রহণযোগ্য থ্রেশহোল্ডের নিচে বিড হলে নিলাম কন্ট্র্যাক্টটি রিভার্ট হয়ে যায়। + +- যে ব্যবহারকারীরা বিড জিততে ব্যর্থ হয় তাদের ফান্ড তাদের অ্যাকাউন্টে জমা করে দেওয়া হয়। + +**দ্রষ্টব্য**: অনুমান পরীক্ষা করার আরেকটি উপায় হল এমন টেস্ট লেখা যা একটি কন্ট্র্যাক্টে [ফাংশন মডিফায়ার](https://docs.soliditylang.org/en/v0.8.16/contracts.html#function-modifiers) ট্রিগার করে, বিশেষ করে `require`, `assert`, এবং `if…else` স্টেটমেন্ট। + +##### 3. কোড কভারেজ পরিমাপ করুন + +[কোড কভারেজ](https://en.m.wikipedia.org/wiki/Code_coverage) একটি টেস্টিং মেট্রিক যা টেস্ট চলাকালীন আপনার কোডে এক্সিকিউট করা ব্রাঞ্চ, লাইন এবং স্টেটমেন্টের সংখ্যা ট্র্যাক করে। পরীক্ষা না করা দুর্বলতার ঝুঁকি কমাতে টেস্টগুলির ভালো কোড কভারেজ থাকা উচিত। পর্যাপ্ত কভারেজ ছাড়া, আপনি ভুলভাবে ধরে নিতে পারেন যে আপনার কন্ট্র্যাক্টটি সুরক্ষিত কারণ সমস্ত টেস্ট পাস হয়েছে, যদিও পরীক্ষা না করা কোড পাথে দুর্বলতা এখনও বিদ্যমান থাকতে পারে। তবে, উচ্চ কোড কভারেজ রেকর্ড করা এই নিশ্চয়তা দেয় যে একটি স্মার্ট কন্ট্র্যাক্টের সমস্ত স্টেটমেন্ট/ফাংশন সঠিকতার জন্য পর্যাপ্তভাবে পরীক্ষা করা হয়েছে। + +##### ৪. সু-বিকশিত টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করুন + +আপনার স্মার্ট কন্ট্র্যাক্টের জন্য ইউনিট টেস্ট চালানোর জন্য ব্যবহৃত টুলগুলির গুণমান অত্যন্ত গুরুত্বপূর্ণ। একটি আদর্শ টেস্টিং ফ্রেমওয়ার্ক হল এমন একটি যা নিয়মিত রক্ষণাবেক্ষণ করা হয়; দরকারী বৈশিষ্ট্য (যেমন, লগিং এবং রিপোর্টিং ক্ষমতা) প্রদান করে; এবং অবশ্যই অন্য ডেভেলপারদের দ্বারা ব্যাপকভাবে ব্যবহৃত এবং পরীক্ষিত হতে হবে। + +Solidity স্মার্ট কন্ট্র্যাক্টের জন্য ইউনিট টেস্টিং ফ্রেমওয়ার্ক বিভিন্ন ভাষায় (বেশিরভাগ JavaScript, Python, এবং Rust) আসে। বিভিন্ন টেস্টিং ফ্রেমওয়ার্কের সাথে ইউনিট টেস্ট চালানো শুরু করার তথ্যের জন্য নীচের কিছু গাইড দেখুন: + +- **[Brownie দিয়ে ইউনিট টেস্ট চালানো](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** +- **[Foundry দিয়ে ইউনিট টেস্ট চালানো](https://book.getfoundry.sh/forge/writing-tests)** +- **[Waffle দিয়ে ইউনিট টেস্ট চালানো](https://ethereum-waffle.readthedocs.io/en/latest/getting-started.html#writing-tests)** +- **[Remix দিয়ে ইউনিট টেস্ট চালানো](https://remix-ide.readthedocs.io/en/latest/unittesting.html#write-tests)** +- **[Ape দিয়ে ইউনিট টেস্ট চালানো](https://docs.apeworx.io/ape/stable/userguides/testing.html)** +- **[Hardhat দিয়ে ইউনিট টেস্ট চালানো](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** +- **[Wake দিয়ে ইউনিট টেস্ট চালানো](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** + +### ইন্টিগ্রেশন টেস্টিং {#integration-testing-for-smart-contracts} + +যেখানে ইউনিট টেস্টিং বিচ্ছিন্নভাবে কন্ট্র্যাক্ট ফাংশন ডিবাগ করে, সেখানে ইন্টিগ্রেশন টেস্টগুলি একটি স্মার্ট কন্ট্র্যাক্টের উপাদানগুলিকে সামগ্রিকভাবে মূল্যায়ন করে। ইন্টিগ্রেশন টেস্টিং ক্রস-কন্ট্র্যাক্ট কল বা একই স্মার্ট কন্ট্র্যাক্টে বিভিন্ন ফাংশনের মধ্যে মিথস্ক্রিয়া থেকে উদ্ভূত সমস্যাগুলি সনাক্ত করতে পারে। উদাহরণস্বরূপ, ইন্টিগ্রেশন টেস্ট [ইনহেরিটেন্স](https://docs.soliditylang.org/en/v0.8.12/contracts.html#inheritance) এবং ডিপেন্ডেন্সি ইনজেকশনের মতো জিনিসগুলি সঠিকভাবে কাজ করে কিনা তা পরীক্ষা করতে সাহায্য করতে পারে। + +আপনার কন্ট্র্যাক্টটি যদি একটি মডুলার আর্কিটেকচার গ্রহণ করে বা এক্সিকিউশনের সময় অন্য অনচেইন কন্ট্র্যাক্টের সাথে ইন্টারফেস করে তবে ইন্টিগ্রেশন টেস্টিং কার্যকর। ইন্টিগ্রেশন টেস্ট চালানোর একটি উপায় হল একটি নির্দিষ্ট উচ্চতায় [ব্লকচেইন ফর্ক](/glossary/#fork) করা ([Forge](https://book.getfoundry.sh/forge/fork-testing) বা [Hardhat](https://hardhat.org/hardhat-network/docs/guides/forking-other-networks) এর মতো একটি টুল ব্যবহার করে) এবং আপনার কন্ট্র্যাক্ট এবং ডেপ্লয় করা কন্ট্র্যাক্টগুলির মধ্যে মিথস্ক্রিয়া অনুকরণ করা। + +ফর্ক করা ব্লকচেইনটি Mainnet-এর মতোই আচরণ করবে এবং সংশ্লিষ্ট স্টেট এবং ব্যালেন্সসহ অ্যাকাউন্ট থাকবে। কিন্তু এটি শুধুমাত্র একটি স্যান্ডবক্সড লোকাল ডেভেলপমেন্ট এনভায়রনমেন্ট হিসেবে কাজ করে, যার মানে হল আপনার লেনদেনের জন্য প্রকৃত ETH-এর প্রয়োজন হবে না, উদাহরণস্বরূপ, বা আপনার পরিবর্তনগুলি প্রকৃত ইথেরিয়াম প্রোটোকলকে প্রভাবিত করবে না। + +### প্রপার্টি-ভিত্তিক টেস্টিং {#property-based-testing-for-smart-contracts} + +প্রপার্টি-ভিত্তিক টেস্টিং হল একটি স্মার্ট কন্ট্র্যাক্ট কোনো নির্দিষ্ট প্রপার্টি পূরণ করে কিনা তা পরীক্ষা করার প্রক্রিয়া। প্রপার্টিগুলি একটি কন্ট্র্যাক্টের আচরণ সম্পর্কে এমন তথ্য দাবি করে যা বিভিন্ন পরিস্থিতিতে সত্য থাকবে বলে আশা করা হয়—একটি স্মার্ট কন্ট্র্যাক্ট প্রপার্টির উদাহরণ হতে পারে "কন্ট্র্যাক্টে গাণিতিক ক্রিয়াকলাপগুলি কখনও ওভারফ্লো বা আন্ডারফ্লো হয় না।" + +**স্ট্যাটিক বিশ্লেষণ** এবং **ডাইনামিক বিশ্লেষণ** হল প্রপার্টি-ভিত্তিক টেস্টিং সম্পাদনের দুটি সাধারণ কৌশল, এবং উভয়ই যাচাই করতে পারে যে একটি প্রোগ্রামের কোড (এই ক্ষেত্রে একটি স্মার্ট কন্ট্র্যাক্ট) কিছু পূর্বনির্ধারিত প্রপার্টি পূরণ করে। কিছু প্রপার্টি-ভিত্তিক টেস্টিং টুলস প্রত্যাশিত কন্ট্র্যাক্ট প্রপার্টি সম্পর্কে পূর্বনির্ধারিত নিয়ম নিয়ে আসে এবং সেই নিয়মগুলির বিরুদ্ধে কোডটি পরীক্ষা করে, অন্যগুলি আপনাকে একটি স্মার্ট কন্ট্র্যাক্টের জন্য কাস্টম প্রপার্টি তৈরি করতে দেয়। + +#### স্ট্যাটিক বিশ্লেষণ {#static-analysis} + +একটি স্ট্যাটিক অ্যানালাইজার একটি স্মার্ট কন্ট্র্যাক্টের সোর্স কোড ইনপুট হিসাবে নেয় এবং একটি কন্ট্র্যাক্ট একটি প্রপার্টি পূরণ করে কিনা তা ঘোষণা করে ফলাফল আউটপুট দেয়। ডাইনামিক বিশ্লেষণের বিপরীতে, স্ট্যাটিক বিশ্লেষণে সঠিকতার জন্য একটি কন্ট্র্যাক্ট এক্সিকিউট করা জড়িত থাকে না। স্ট্যাটিক বিশ্লেষণ বরং একটি স্মার্ট কন্ট্র্যাক্ট এক্সিকিউশনের সময় যে সমস্ত সম্ভাব্য পথ নিতে পারে সে সম্পর্কে যুক্তি দেয় (অর্থাৎ, রানটাইমে কন্ট্র্যাক্টের অপারেশনের জন্য এর অর্থ কী হবে তা নির্ধারণ করতে সোর্স কোডের কাঠামো পরীক্ষা করে)। + +[লিন্টিং](https://www.perforce.com/blog/qac/what-is-linting) এবং [স্ট্যাটিক টেস্টিং](https://www.techtarget.com/whatis/definition/static-analysis-static-code-analysis) হল কন্ট্র্যাক্টে স্ট্যাটিক বিশ্লেষণ চালানোর সাধারণ পদ্ধতি। উভয়ের জন্যই কন্ট্র্যাক্টের এক্সিকিউশনের নিম্ন-স্তরের উপস্থাপনা যেমন কম্পাইলার দ্বারা আউটপুট করা [অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি](https://en.m.wikipedia.org/wiki/Abstract_syntax_tree) এবং [কন্ট্রোল ফ্লো গ্রাফ](https://www.geeksforgeeks.org/software-engineering-control-flow-graph-cfg/amp/) বিশ্লেষণ করা প্রয়োজন। + +বেশিরভাগ ক্ষেত্রে, স্ট্যাটিক বিশ্লেষণ একটি কন্ট্র্যাক্টের কোডে অনিরাপদ কনস্ট্রাক্টের ব্যবহার, সিনট্যাক্স ত্রুটি, বা কোডিং স্ট্যান্ডার্ড লঙ্ঘনের মতো নিরাপত্তা সমস্যা সনাক্ত করার জন্য উপযোগী। তবে, স্ট্যাটিক অ্যানালাইজারগুলি গভীরতর দুর্বলতা সনাক্ত করতে সাধারণত অসম্পূর্ণ বলে পরিচিত, এবং অতিরিক্ত ফলস পজিটিভ তৈরি করতে পারে। + +#### ডাইনামিক বিশ্লেষণ {#dynamic-analysis} + +ডাইনামিক বিশ্লেষণ একটি স্মার্ট কন্ট্র্যাক্টের ফাংশনগুলিতে সিম্বলিক ইনপুট (যেমন, [সিম্বলিক এক্সিকিউশনে](https://en.m.wikipedia.org/wiki/Symbolic_execution)) বা কংক্রিট ইনপুট (যেমন, [ফাজিং-এ](https://owasp.org/www-community/Fuzzing)) তৈরি করে তা দেখতে যে কোনো এক্সিকিউশন ট্রেস নির্দিষ্ট বৈশিষ্ট্য লঙ্ঘন করে কিনা। এই ধরনের প্রপার্টি-ভিত্তিক টেস্টিং ইউনিট টেস্ট থেকে ভিন্ন কারণ টেস্ট কেসগুলি একাধিক পরিস্থিতি কভার করে এবং একটি প্রোগ্রাম টেস্ট কেস তৈরির কাজ পরিচালনা করে। + +[ফাজিং](https://www.halborn.com/blog/post/what-is-fuzz-testing-fuzzing) স্মার্ট কন্ট্র্যাক্টে নির্বিচারে প্রপার্টি যাচাই করার জন্য একটি ডাইনামিক বিশ্লেষণ কৌশলের উদাহরণ। একটি ফাজার একটি টার্গেট কন্ট্র্যাক্টে একটি সংজ্ঞায়িত ইনপুট মানের র‍্যান্ডম বা ত্রুটিপূর্ণ ভিন্নতা দিয়ে ফাংশনগুলিকে কল করে। যদি স্মার্ট কন্ট্র্যাক্টটি একটি ত্রুটিপূর্ণ স্টেটে প্রবেশ করে (যেমন, যেখানে একটি অ্যাসারশন ব্যর্থ হয়), সমস্যাটি ফ্ল্যাগ করা হয় এবং দুর্বল পাথের দিকে এক্সিকিউশন চালনাকারী ইনপুটগুলি একটি রিপোর্টে তৈরি করা হয়। + +ফাজিং একটি স্মার্ট কন্ট্র্যাক্টের ইনপুট বৈধকরণ প্রক্রিয়া মূল্যায়নের জন্য উপযোগী কারণ অপ্রত্যাশিত ইনপুটগুলির অনুপযুক্ত হ্যান্ডলিংয়ের ফলে অনিচ্ছাকৃত এক্সিকিউশন হতে পারে এবং বিপজ্জনক প্রভাব তৈরি করতে পারে। এই ধরনের প্রপার্টি-ভিত্তিক টেস্টিং অনেক কারণে আদর্শ হতে পারে: + +1. **অনেক পরিস্থিতি কভার করার জন্য টেস্ট কেস লেখা কঠিন।** একটি প্রপার্টি টেস্টে শুধুমাত্র একটি আচরণ এবং আচরণের সাথে পরীক্ষা করার জন্য ডেটার একটি পরিসীমা সংজ্ঞায়িত করতে হয়—প্রোগ্রামটি সংজ্ঞায়িত প্রপার্টির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে টেস্ট কেস তৈরি করে। + +2. **আপনার টেস্ট স্যুট প্রোগ্রামের মধ্যে সমস্ত সম্ভাব্য পথ পর্যাপ্তভাবে কভার নাও করতে পারে।** এমনকি 100% কভারেজ সহ, এজ কেসগুলি মিস করা সম্ভব। + +3. **ইউনিট টেস্ট প্রমাণ করে যে একটি কন্ট্র্যাক্ট নমুনা ডেটার জন্য সঠিকভাবে এক্সিকিউট হয়, কিন্তু কন্ট্র্যাক্টটি নমুনার বাইরের ইনপুটগুলির জন্য সঠিকভাবে এক্সিকিউট হয় কিনা তা অজানা থেকে যায়।** প্রপার্টি টেস্টগুলি একটি প্রদত্ত ইনপুট মানের একাধিক ভিন্নতা দিয়ে একটি টার্গেট কন্ট্র্যাক্ট এক্সিকিউট করে যা অ্যাসারশন ব্যর্থতার কারণ হয় এমন এক্সিকিউশন ট্রেস খুঁজে বের করতে। সুতরাং, একটি প্রপার্টি টেস্ট আরও বেশি গ্যারান্টি প্রদান করে যে একটি কন্ট্র্যাক্ট ইনপুট ডেটার একটি বিস্তৃত শ্রেণীর জন্য সঠিকভাবে এক্সিকিউট হয়। + +### স্মার্ট কন্ট্র্যাক্টের জন্য প্রপার্টি-ভিত্তিক টেস্টিং চালানোর নির্দেশিকা {#running-property-based-tests} + +প্রপার্টি-ভিত্তিক টেস্টিং সাধারণত একটি প্রপার্টি (যেমন, [পূর্ণসংখ্যা ওভারফ্লোর](https://github.com/ConsenSys/mythril/wiki/Integer-Overflow) অনুপস্থিতি) বা প্রপার্টিগুলির একটি সংগ্রহ সংজ্ঞায়িত করার মাধ্যমে শুরু হয় যা আপনি একটি স্মার্ট কন্ট্র্যাক্টে যাচাই করতে চান। প্রপার্টি টেস্ট লেখার সময় আপনাকে একটি মানের পরিসীমাও সংজ্ঞায়িত করতে হতে পারে যার মধ্যে প্রোগ্রামটি লেনদেন ইনপুটের জন্য ডেটা তৈরি করতে পারে। + +সঠিকভাবে কনফিগার করার পরে, প্রপার্টি টেস্টিং টুল আপনার স্মার্ট কন্ট্র্যাক্টের ফাংশনগুলিকে র‍্যান্ডমভাবে তৈরি করা ইনপুট দিয়ে এক্সিকিউট করবে। যদি কোনো অ্যাসারশন লঙ্ঘন হয়, তাহলে আপনার মূল্যায়নের অধীনে থাকা প্রপার্টি লঙ্ঘনকারী কংক্রিট ইনপুট ডেটা সহ একটি রিপোর্ট পাওয়া উচিত। বিভিন্ন টুলস দিয়ে প্রপার্টি-ভিত্তিক টেস্টিং চালানো শুরু করতে নীচের কিছু গাইড দেখুন: + +- **[Slither দিয়ে স্মার্ট কন্ট্র্যাক্টের স্ট্যাটিক বিশ্লেষণ](https://github.com/crytic/slither)** +- **[Wake দিয়ে স্মার্ট কন্ট্র্যাক্টের স্ট্যাটিক বিশ্লেষণ](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** +- **[Brownie দিয়ে প্রপার্টি-ভিত্তিক টেস্টিং](https://eth-brownie.readthedocs.io/en/stable/tests-hypothesis-property.html)** +- **[Foundry দিয়ে কন্ট্র্যাক্ট ফাজিং](https://book.getfoundry.sh/forge/fuzz-testing)** +- **[Echidna দিয়ে কন্ট্র্যাক্ট ফাজিং](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna#echidna-tutorial)** +- **[Wake দিয়ে কন্ট্র্যাক্ট ফাজিং](https://ackeeblockchain.com/wake/docs/latest/testing-framework/fuzzing/)** +- **[Manticore দিয়ে স্মার্ট কন্ট্র্যাক্টের সিম্বলিক এক্সিকিউশন](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore#manticore-tutorial)** +- **[Mythril দিয়ে স্মার্ট কন্ট্র্যাক্টের সিম্বলিক এক্সিকিউশন](https://mythril-classic.readthedocs.io/en/master/tutorial.html)** + +## স্মার্ট কন্ট্র্যাক্টের জন্য ম্যানুয়াল টেস্টিং {#manual-testing-for-smart-contracts} + +স্মার্ট কন্ট্র্যাক্টের ম্যানুয়াল টেস্টিং প্রায়শই স্বয়ংক্রিয় টেস্ট চালানোর পরে ডেভেলপমেন্ট সাইকেলের পরবর্তী পর্যায়ে আসে। এই ধরনের টেস্টিং স্মার্ট কন্ট্র্যাক্টকে একটি সম্পূর্ণ সমন্বিত পণ্য হিসাবে মূল্যায়ন করে তা দেখতে যে এটি প্রযুক্তিগত প্রয়োজনীয়তাগুলিতে নির্দিষ্ট হিসাবে কাজ করে কিনা। + +### একটি স্থানীয় ব্লকচেইনে কন্ট্র্যাক্ট টেস্টিং {#testing-on-local-blockchain} + +যদিও একটি স্থানীয় ডেভেলপমেন্ট পরিবেশে সঞ্চালিত স্বয়ংক্রিয় টেস্টিং দরকারী ডিবাগিং তথ্য সরবরাহ করতে পারে, আপনি জানতে চাইবেন আপনার স্মার্ট কন্ট্র্যাক্ট একটি প্রোডাকশন পরিবেশে কীভাবে আচরণ করে। তবে, মূল ইথেরিয়াম চেইনে ডেপ্লয় করতে গ্যাস ফি লাগে—এছাড়াও, আপনার স্মার্ট কন্ট্র্যাক্টে যদি এখনও বাগ থাকে তবে আপনি বা আপনার ব্যবহারকারীরা প্রকৃত অর্থ হারাতে পারেন। + +Mainnet-এ টেস্টিং করার একটি প্রস্তাবিত বিকল্প হল আপনার কন্ট্র্যাক্টটিকে একটি স্থানীয় ব্লকচেইনে ([ডেভেলপমেন্ট নেটওয়ার্ক](/developers/docs/development-networks/) হিসাবেও পরিচিত) পরীক্ষা করা। একটি স্থানীয় ব্লকচেইন হল ইথেরিয়াম ব্লকচেইনের একটি অনুলিপি যা আপনার কম্পিউটারে স্থানীয়ভাবে চলে এবং যা ইথেরিয়ামের এক্সিকিউশন লেয়ারের আচরণকে অনুকরণ করে। যেমন, আপনি উল্লেখযোগ্য ওভারহেড ছাড়াই একটি কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার জন্য লেনদেন প্রোগ্রাম করতে পারেন। + +একটি স্থানীয় ব্লকচেইনে কন্ট্র্যাক্ট চালানো ম্যানুয়াল ইন্টিগ্রেশন টেস্টিংয়ের একটি রূপ হিসাবে কার্যকর হতে পারে। [স্মার্ট কন্ট্র্যাক্টগুলি অত্যন্ত কম্পোজেবল](/developers/docs/smart-contracts/composability/), যা আপনাকে বিদ্যমান প্রোটোকলগুলির সাথে একীভূত করার অনুমতি দেয়—কিন্তু আপনাকে এখনও নিশ্চিত করতে হবে যে এই ধরনের জটিল অনচেইন ইন্টারঅ্যাকশনগুলি সঠিক ফলাফল তৈরি করে। + +[ডেভেলপমেন্ট নেটওয়ার্ক সম্পর্কে আরও।](/developers/docs/development-networks/) + +### টেস্টনেটে কন্ট্র্যাক্ট টেস্টিং {#testing-contracts-on-testnets} + +একটি টেস্ট নেটওয়ার্ক বা টেস্টনেট ঠিক ইথেরিয়াম Mainnet-এর মতো কাজ করে, তবে এটি এমন ইথার (ETH) ব্যবহার করে যার কোনো বাস্তব-বিশ্বের মূল্য নেই। একটি [টেস্টনেটে](/developers/docs/networks/#ethereum-testnets) আপনার কন্ট্র্যাক্ট ডেপ্লয় করার মানে হল যে কেউ এটির সাথে (যেমন, ডিএ্যাপ-এর ফ্রন্টএন্ডের মাধ্যমে) তহবিল ঝুঁকিতে না ফেলে ইন্টারঅ্যাক্ট করতে পারে। + +এই ধরনের ম্যানুয়াল টেস্টিং একজন ব্যবহারকারীর দৃষ্টিকোণ থেকে আপনার অ্যাপ্লিকেশনের এন্ড-টু-এন্ড ফ্লো মূল্যায়নের জন্য উপযোগী। এখানে, বিটা টেস্টাররা ট্রায়াল রান করতে পারে এবং কন্ট্র্যাক্টের ব্যবসায়িক যুক্তি এবং সামগ্রিক কার্যকারিতার সাথে সম্পর্কিত যেকোনো সমস্যা রিপোর্ট করতে পারে। + +একটি স্থানীয় ব্লকচেইনে পরীক্ষা করার পরে একটি টেস্টনেটে ডেপ্লয় করা আদর্শ কারণ পরেরটি ইথিরিয়াম ভার্চুয়াল মেশিনের আচরণের কাছাকাছি। অতএব, অনেক ইথেরিয়াম-নেটিভ প্রকল্পের জন্য বাস্তব-বিশ্বের পরিস্থিতিতে একটি স্মার্ট কন্ট্র্যাক্টের অপারেশন মূল্যায়ন করতে টেস্টনেটে ডিএ্যাপস ডেপ্লয় করা সাধারণ। + +[ইথেরিয়াম টেস্টনেট সম্পর্কে আরও।](/developers/docs/development-networks/#public-beacon-testchains) + +## টেস্টিং বনাম ফর্মাল ভেরিফিকেশন {#testing-vs-formal-verification} + +যদিও টেস্টিং নিশ্চিত করতে সাহায্য করে যে একটি কন্ট্র্যাক্ট কিছু ডেটা ইনপুটের জন্য প্রত্যাশিত ফলাফল দেয়, এটি পরীক্ষার সময় ব্যবহৃত হয়নি এমন ইনপুটগুলির জন্য একই প্রমাণ চূড়ান্তভাবে করতে পারে না। অতএব, একটি স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করা "ফাংশনাল সঠিকতা"-র গ্যারান্টি দিতে পারে না (অর্থাৎ, এটি দেখাতে পারে না যে একটি প্রোগ্রাম _সমস্ত_ ইনপুট মানের সেটের জন্য প্রয়োজন অনুযায়ী আচরণ করে)। + +ফর্মাল ভেরিফিকেশন হল একটি প্রোগ্রামের ফর্মাল মডেল একটি ফর্মাল স্পেসিফিকেশনের সাথে মেলে কিনা তা পরীক্ষা করে সফ্টওয়্যারের সঠিকতা মূল্যায়ন করার একটি পদ্ধতি। একটি ফর্মাল মডেল হল একটি প্রোগ্রামের একটি বিমূর্ত গাণিতিক উপস্থাপনা, যেখানে একটি ফর্মাল স্পেসিফিকেশন একটি প্রোগ্রামের বৈশিষ্ট্যগুলি (অর্থাৎ, প্রোগ্রামের এক্সিকিউশন সম্পর্কে যৌক্তিক দাবি) সংজ্ঞায়িত করে। + +যেহেতু প্রপার্টিগুলি গাণিতিক পরিভাষায় লেখা হয়, তাই সিস্টেমের একটি ফর্মাল (গাণিতিক) মডেল যৌক্তিক অনুমানের নিয়ম ব্যবহার করে একটি স্পেসিফিকেশন পূরণ করে কিনা তা যাচাই করা সম্ভব হয়। এইভাবে, বলা হয় যে ফর্মাল ভেরিফিকেশন টুলস একটি সিস্টেমের সঠিকতার ‘গাণিতিক প্রমাণ’ তৈরি করে। + +টেস্টিংয়ের বিপরীতে, ফর্মাল ভেরিফিকেশন একটি স্মার্ট কন্ট্র্যাক্টের এক্সিকিউশন _সমস্ত_ এক্সিকিউশনের জন্য একটি ফর্মাল স্পেসিফিকেশন পূরণ করে কিনা তা যাচাই করতে ব্যবহার করা যেতে পারে (অর্থাৎ, এতে কোনো বাগ নেই) নমুনা ডেটা দিয়ে এক্সিকিউট করার প্রয়োজন ছাড়াই। এটি কেবল কয়েক ডজন ইউনিট টেস্ট চালানোর সময় ব্যয় কমায় না, বরং এটি লুকানো দুর্বলতা ধরতে আরও কার্যকর। বলা বাহুল্য, ফর্মাল ভেরিফিকেশন কৌশলগুলি তাদের বাস্তবায়নের অসুবিধা এবং উপযোগিতার উপর নির্ভর করে একটি স্পেকট্রামে অবস্থান করে। + +[স্মার্ট কন্ট্র্যাক্টের জন্য ফর্মাল ভেরিফিকেশন সম্পর্কে আরও।](/developers/docs/smart-contracts/formal-verification) + +## টেস্টিং বনাম অডিট এবং বাগ বাউন্টি {#testing-vs-audits-bug-bounties} + +যেমন উল্লেখ করা হয়েছে, কঠোর টেস্টিং খুব কমই একটি কন্ট্র্যাক্টে বাগের অনুপস্থিতির গ্যারান্টি দিতে পারে; ফর্মাল ভেরিফিকেশন পদ্ধতিগুলি সঠিকতার শক্তিশালী আশ্বাস দিতে পারে তবে বর্তমানে ব্যবহার করা কঠিন এবং যথেষ্ট ব্যয়সাপেক্ষ। + +তবুও, আপনি একটি স্বাধীন কোড রিভিউ পেয়ে কন্ট্র্যাক্টের দুর্বলতা ধরার সম্ভাবনা আরও বাড়াতে পারেন। [স্মার্ট কন্ট্র্যাক্ট অডিট](https://www.immunebytes.com/blog/what-is-a-smart-contract-audit/) এবং [বাগ বাউন্টি](https://medium.com/immunefi/a-defi-security-standard-the-scaling-bug-bounty-9b83dfdc1ba7) হল আপনার কন্ট্র্যাক্টগুলি অন্যদের দ্বারা বিশ্লেষণ করানোর দুটি উপায়। + +স্মার্ট কন্ট্র্যাক্টে নিরাপত্তা ত্রুটি এবং দুর্বল ডেভেলপমেন্ট অনুশীলনের ঘটনা খুঁজে বের করতে অভিজ্ঞ অডিটরদের দ্বারা অডিট করা হয়। একটি অডিটে সাধারণত টেস্টিং (এবং সম্ভবত ফর্মাল ভেরিফিকেশন) এবং সম্পূর্ণ কোডবেসের একটি ম্যানুয়াল রিভিউ অন্তর্ভুক্ত থাকে। + +বিপরীতভাবে, একটি বাগ বাউন্টি প্রোগ্রামে সাধারণত একজন ব্যক্তিকে (সাধারণত [হোয়াইটহ্যাট হ্যাকার](https://en.wikipedia.org/wiki/White_hat_\(computer_security\)) হিসাবে বর্ণিত) আর্থিক পুরস্কার অফার করা হয় যিনি একটি স্মার্ট কন্ট্র্যাক্টে একটি দুর্বলতা আবিষ্কার করেন এবং ডেভেলপারদের কাছে তা প্রকাশ করেন। বাগ বাউন্টি অডিটের মতোই, কারণ এতে অন্যদের স্মার্ট কন্ট্র্যাক্টে ত্রুটি খুঁজে পেতে সাহায্য করার জন্য বলা হয়। + +প্রধান পার্থক্য হল বাগ বাউন্টি প্রোগ্রামগুলি বৃহত্তর ডেভেলপার/হ্যাকার সম্প্রদায়ের জন্য উন্মুক্ত এবং অনন্য দক্ষতা এবং অভিজ্ঞতা সহ বিস্তৃত শ্রেণীর নৈতিক হ্যাকার এবং স্বাধীন নিরাপত্তা পেশাদারদের আকর্ষণ করে। এটি স্মার্ট কন্ট্র্যাক্ট অডিটের চেয়ে একটি সুবিধা হতে পারে যা মূলত এমন দলগুলির উপর নির্ভর করে যাদের সীমিত বা সংকীর্ণ দক্ষতা থাকতে পারে। + +## টেস্টিং টুলস এবং লাইব্রেরি {#testing-tools-and-libraries} + +### ইউনিট টেস্টিং টুলস {#unit-testing-tools} + +- **[solidity-coverage](https://github.com/sc-forks/solidity-coverage)** - _Solidity-তে লেখা স্মার্ট কন্ট্র্যাক্টের জন্য কোড কভারেজ টুল।_ + +- **[Waffle](https://ethereum-waffle.readthedocs.io/en/latest/)** - _উন্নত স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্ট এবং টেস্টিংয়ের জন্য ফ্রেমওয়ার্ক (ethers.js-এর উপর ভিত্তি করে)।_ + +- **[Remix Tests](https://github.com/ethereum/remix-project/tree/master/libs/remix-tests)** - _Solidity স্মার্ট কন্ট্র্যাক্ট টেস্টিং করার জন্য টুল। Remix IDE "Solidity Unit Testing" প্লাগইনের অধীনে কাজ করে যা একটি কন্ট্র্যাক্টের জন্য টেস্ট কেস লিখতে এবং চালাতে ব্যবহৃত হয়।_ + +- **[OpenZeppelin Test Helpers](https://github.com/OpenZeppelin/openzeppelin-test-helpers)** - _ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট টেস্টিংয়ের জন্য অ্যাসারশন লাইব্রেরি। নিশ্চিত করুন আপনার কন্ট্র্যাক্টগুলো প্রত্যাশা অনুযায়ী আচরণ করে!_ + +- **[Brownie unit testing framework](https://eth-brownie.readthedocs.io/en/v1.0.0_a/tests.html)** - _ব্রাউনি পাইটেস্ট ব্যবহার করে, যা একটি বৈশিষ্ট্য-সমৃদ্ধ টেস্ট ফ্রেমওয়ার্ক যা আপনাকে ন্যূনতম কোড সহ ছোট টেস্ট লিখতে দেয়, বড় প্রকল্পগুলির জন্য ভালভাবে স্কেল করে এবং অত্যন্ত প্রসারণযোগ্য।_ + +- **[Foundry Tests](https://github.com/foundry-rs/foundry/tree/master/crates/forge)** - _ফাউন্ড্রি ফোর্জ অফার করে, একটি দ্রুত এবং নমনীয় ইথেরিয়াম টেস্টিং ফ্রেমওয়ার্ক যা সাধারণ ইউনিট টেস্ট, গ্যাস অপ্টিমাইজেশন চেক এবং কন্ট্র্যাক্ট ফাজিং করতে সক্ষম।_ + +- **[Hardhat Tests](https://hardhat.org/hardhat-runner/docs/guides/test-contracts)** - _ethers.js, Mocha, এবং Chai-এর উপর ভিত্তি করে স্মার্ট কন্ট্র্যাক্ট টেস্টিংয়ের জন্য ফ্রেমওয়ার্ক।_ + +- **[ApeWorx](https://docs.apeworx.io/ape/stable/userguides/testing.html)** - _ইথিরিয়াম ভার্চুয়াল মেশিনকে টার্গেট করে স্মার্ট কন্ট্র্যাক্টের জন্য পাইথন-ভিত্তিক ডেভেলপমেন্ট এবং টেস্টিং ফ্রেমওয়ার্ক।_ + +- **[Wake](https://ackeeblockchain.com/wake/docs/latest/testing-framework/overview/)** - _ইউনিট টেস্টিং এবং ফাজিংয়ের জন্য পাইথন-ভিত্তিক ফ্রেমওয়ার্ক, যা শক্তিশালী ডিবাগিং ক্ষমতা এবং ক্রস-চেইন টেস্টিং সমর্থন করে, সেরা ব্যবহারকারী অভিজ্ঞতা এবং পারফরম্যান্সের জন্য পাইটেস্ট এবং আনভিল ব্যবহার করে।_ + +### প্রপার্টি-ভিত্তিক টেস্টিং টুলস {#property-based-testing-tools} + +#### স্ট্যাটিক বিশ্লেষণ টুলস {#static-analysis-tools} + +- **[Slither](https://github.com/crytic/slither)** - _দুর্বলতা খুঁজে বের করা, কোড বোঝা বাড়ানো এবং স্মার্ট কন্ট্র্যাক্টের জন্য কাস্টম বিশ্লেষণ লেখার জন্য পাইথন-ভিত্তিক সলিডিটি স্ট্যাটিক বিশ্লেষণ ফ্রেমওয়ার্ক।_ + +- **[Ethlint](https://ethlint.readthedocs.io/en/latest/)** - _Solidity স্মার্ট কন্ট্র্যাক্ট প্রোগ্রামিং ভাষার জন্য স্টাইল এবং নিরাপত্তা সেরা অনুশীলন প্রয়োগের জন্য লিন্টার।_ + +- **[Cyfrin Aderyn](https://cyfrin.io/tools/aderyn)** - _Rust-ভিত্তিক স্ট্যাটিক অ্যানালাইজার যা বিশেষভাবে Web3 স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা এবং ডেভেলপমেন্টের জন্য ডিজাইন করা হয়েছে।_ + +- **[Wake](https://ackeeblockchain.com/wake/docs/latest/static-analysis/using-detectors/)** - _দুর্বলতা এবং কোডের গুণমান ডিটেক্টর, কোড থেকে দরকারী তথ্য বের করার জন্য প্রিন্টার এবং কাস্টম সাবমডিউল লেখার সমর্থন সহ পাইথন-ভিত্তিক স্ট্যাটিক বিশ্লেষণ ফ্রেমওয়ার্ক।_ + +- **[Slippy](https://github.com/fvictorio/slippy)** - _Solidity-র জন্য একটি সহজ এবং শক্তিশালী লিন্টার।_ + +#### ডাইনামিক বিশ্লেষণ টুলস {#dynamic-analysis-tools} + +- **[Echidna](https://github.com/crytic/echidna/)** - _প্রপার্টি-ভিত্তিক টেস্টিংয়ের মাধ্যমে স্মার্ট কন্ট্র্যাক্টে দুর্বলতা সনাক্ত করার জন্য দ্রুত কন্ট্র্যাক্ট ফাজার।_ + +- **[Diligence Fuzzing](https://consensys.net/diligence/fuzzing/)** - _স্মার্ট কন্ট্র্যাক্ট কোডে প্রপার্টি লঙ্ঘন সনাক্ত করার জন্য স্বয়ংক্রিয় ফাজিং টুল।_ + +- **[Manticore](https://manticore.readthedocs.io/en/latest/index.html)** - _EVM বাইটকোড বিশ্লেষণের জন্য ডাইনামিক সিম্বলিক এক্সিকিউশন ফ্রেমওয়ার্ক।_ + +- **[Mythril](https://github.com/ConsenSys/mythril-classic)** - _টেইন্ট বিশ্লেষণ, কনকোলিক বিশ্লেষণ এবং কন্ট্রোল ফ্লো চেকিং ব্যবহার করে কন্ট্র্যাক্টের দুর্বলতা সনাক্ত করার জন্য EVM বাইটকোড মূল্যায়ন টুল।_ + +- **[Diligence Scribble](https://consensys.net/diligence/scribble/)** - _স্ক্রিবল একটি স্পেসিফিকেশন ভাষা এবং রানটাইম ভেরিফিকেশন টুল যা আপনাকে স্মার্ট কন্ট্র্যাক্টগুলিকে এমন বৈশিষ্ট্যগুলির সাথে টীকা করতে দেয় যা আপনাকে ডিলিজেন্স ফাজিং বা মিথএক্স-এর মতো টুলস দিয়ে স্বয়ংক্রিয়ভাবে কন্ট্র্যাক্টগুলি পরীক্ষা করতে দেয়।_ + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [বিভিন্ন টেস্টিং পণ্যের একটি সংক্ষিপ্ত বিবরণ এবং তুলনা](/developers/tutorials/guide-to-smart-contract-security-tools/) \_ +- [স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করার জন্য কীভাবে একিডনা ব্যবহার করবেন](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) +- [স্মার্ট কন্ট্র্যাক্ট বাগ খুঁজে পেতে কিভাবে Manticore ব্যবহার করবেন](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) +- [স্মার্ট কন্ট্র্যাক্ট বাগ খুঁজে পেতে কিভাবে Slither ব্যবহার করবেন](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) +- [টেস্টিংয়ের জন্য কীভাবে সলিডিটি কন্ট্র্যাক্ট মক করবেন](/developers/tutorials/how-to-mock-solidity-contracts-for-testing/) +- [ফাউন্ড্রি ব্যবহার করে সলিডিটিতে কীভাবে ইউনিট টেস্ট চালাবেন](https://www.rareskills.io/post/foundry-testing-solidity) + +## আরও পড়ুন {#further-reading} + +- [ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট টেস্টিংয়ের একটি গভীর নির্দেশিকা](https://iamdefinitelyahuman.medium.com/an-in-depth-guide-to-testing-ethereum-smart-contracts-2e41b2770297) +- [কীভাবে ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করবেন](https://betterprogramming.pub/how-to-test-ethereum-smart-contracts-35abc8fa199d) +- [ডেভেলপারদের জন্য MolochDAO-এর ইউনিট টেস্টিং নির্দেশিকা](https://github.com/MolochVentures/moloch/tree/4e786db8a4aa3158287e0935dcbc7b1e43416e38/test#moloch-testing-guide) +- [কীভাবে একজন রকস্টারের মতো স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করবেন](https://forum.openzeppelin.com/t/test-smart-contracts-like-a-rockstar/1001) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/upgrading/index.md b/public/content/translations/bn/developers/docs/smart-contracts/upgrading/index.md new file mode 100644 index 00000000000..1d10da24821 --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/upgrading/index.md @@ -0,0 +1,165 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করা" +description: "ইথেরিয়াম স্মার্ট কন্ট্র্যাক্টের জন্য আপগ্রেড প্যাটার্নের একটি সংক্ষিপ্ত বিবরণ" +lang: bn +--- + +ইথেরিয়ামের স্মার্ট কন্ট্র্যাক্ট হলো স্ব-নির্বাহী প্রোগ্রাম যা Ethereum Virtual Machine (EVM)-এ চলে। এই প্রোগ্রামগুলো ডিজাইনের দ্বারা অপরিবর্তনীয়, যা কন্ট্র্যাক্ট স্থাপন করার পরে ব্যবসায়িক যুক্তিতে কোনো আপডেট করা থেকে বিরত রাখে। + +যদিও স্মার্ট কন্ট্র্যাক্টের বিশ্বাসহীনতা, বিকেন্দ্রীকরণ এবং নিরাপত্তার জন্য অপরিবর্তনীয়তা প্রয়োজন, এটি কিছু ক্ষেত্রে একটি অসুবিধাও হতে পারে। উদাহরণস্বরূপ, অপরিবর্তনীয় কোড ডেভেলপারদের জন্য দুর্বল কন্ট্র্যাক্ট ঠিক করা অসম্ভব করে তুলতে পারে। + +যাইহোক, স্মার্ট কন্ট্র্যাক্ট উন্নত করার জন্য বর্ধিত গবেষণা বেশ কয়েকটি আপগ্রেড প্যাটার্নের প্রচলন ঘটিয়েছে। এই আপগ্রেড প্যাটার্নগুলো ডেভেলপারদের বিভিন্ন কন্ট্র্যাক্টে ব্যবসায়িক যুক্তি স্থাপন করে স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করতে সক্ষম করে (অপরিবর্তনীয়তা সংরক্ষণ করার সাথে সাথে)। + +## পূর্বশর্ত {#prerequisites} + +আপনার [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/), [স্মার্ট কন্ট্র্যাক্টের অ্যানাটমি](/developers/docs/smart-contracts/anatomy/), এবং [Ethereum Virtual Machine (EVM)](/developers/docs/evm/) সম্পর্কে একটি ভালো ধারণা থাকা উচিত। এই গাইডটি আরও ধরে নেয় যে পাঠকদের স্মার্ট কন্ট্র্যাক্ট প্রোগ্রামিং সম্পর্কে ধারণা আছে। + +## স্মার্ট কন্ট্র্যাক্ট আপগ্রেড কী? {#what-is-a-smart-contract-upgrade} + +একটি স্মার্ট কন্ট্র্যাক্ট আপগ্রেড হলো কন্ট্র্যাক্টের স্টেট সংরক্ষণ করে একটি স্মার্ট কন্ট্র্যাক্টের ব্যবসায়িক যুক্তির পরিবর্তন করা। এটা স্পষ্ট করা গুরুত্বপূর্ণ যে, বিশেষ করে স্মার্ট কন্ট্র্যাক্টের প্রসঙ্গে, আপগ্রেডযোগ্যতা এবং পরিবর্তনীয়তা একই জিনিস নয়। + +আপনি ইথেরিয়াম নেটওয়ার্কের কোনো ঠিকানায় স্থাপন করা প্রোগ্রাম এখনও পরিবর্তন করতে পারবেন না। কিন্তু যখন ব্যবহারকারীরা একটি স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করে তখন যে কোডটি নির্বাহ করা হয়, আপনি সেটি পরিবর্তন করতে পারেন। + +এটি নিম্নলিখিত পদ্ধতির মাধ্যমে করা যেতে পারে: + +1. একটি স্মার্ট কন্ট্র্যাক্টের একাধিক সংস্করণ তৈরি করা এবং পুরনো কন্ট্র্যাক্ট থেকে কন্ট্র্যাক্টের একটি নতুন ইনস্ট্যান্সে স্টেট (অর্থাৎ, ডেটা) স্থানান্তর করা। + +2. ব্যবসায়িক যুক্তি এবং স্টেট সংরক্ষণের জন্য পৃথক কন্ট্র্যাক্ট তৈরি করা। + +3. একটি অপরিবর্তনীয় প্রক্সি কন্ট্র্যাক্ট থেকে একটি পরিবর্তনযোগ্য লজিক কন্ট্র্যাক্টে ফাংশন কল অর্পণ করতে প্রক্সি প্যাটার্ন ব্যবহার করা। + +4. একটি অপরিবর্তনীয় প্রধান কন্ট্র্যাক্ট তৈরি করা যা নির্দিষ্ট ফাংশন নির্বাহ করার জন্য ফ্লেক্সিবল স্যাটেলাইট কন্ট্র্যাক্টের সাথে ইন্টারফেস করে এবং তার উপর নির্ভর করে। + +5. একটি প্রক্সি কন্ট্র্যাক্ট থেকে লজিক কন্ট্র্যাক্টে ফাংশন কল অর্পণ করার জন্য ডায়মন্ড প্যাটার্ন ব্যবহার করা। + +### আপগ্রেড প্রক্রিয়া #1: কন্ট্র্যাক্ট মাইগ্রেশন {#contract-migration} + +কন্ট্র্যাক্ট মাইগ্রেশন ভার্সনিং-এর উপর ভিত্তি করে তৈরি—একই সফ্টওয়্যারের অনন্য স্টেট তৈরি এবং পরিচালনা করার ধারণা। কন্ট্র্যাক্ট মাইগ্রেশনের মধ্যে একটি বিদ্যমান স্মার্ট কন্ট্র্যাক্টের একটি নতুন ইনস্ট্যান্স স্থাপন করা এবং নতুন কন্ট্র্যাক্টে সংগ্রহস্থল এবং ব্যালেন্স স্থানান্তর করা অন্তর্ভুক্ত। + +নতুন স্থাপিত কন্ট্র্যাক্টের একটি খালি সংগ্রহস্থল থাকবে, যা আপনাকে পুরনো কন্ট্র্যাক্ট থেকে ডেটা পুনরুদ্ধার করতে এবং এটি নতুন বাস্তবায়নে লিখতে দেবে। এরপরে, আপনাকে পুরনো কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করা সমস্ত কন্ট্র্যাক্ট আপডেট করতে হবে যাতে নতুন ঠিকানাটি প্রতিফলিত হয়। + +কন্ট্র্যাক্ট মাইগ্রেশনের শেষ ধাপ হলো ব্যবহারকারীদের নতুন কন্ট্র্যাক্ট ব্যবহার শুরু করতে রাজি করানো। নতুন কন্ট্র্যাক্টের সংস্করণটি ব্যবহারকারীর ব্যালেন্স এবং ঠিকানাগুলো ধরে রাখবে, যা অপরিবর্তনীয়তা সংরক্ষণ করে। যদি এটি একটি টোকেন-ভিত্তিক কন্ট্র্যাক্ট হয়, তাহলে আপনাকে পুরনো কন্ট্র্যাক্টটি বাতিল করতে এবং নতুন কন্ট্র্যাক্টটি ব্যবহার করতে এক্সচেঞ্জগুলোর সাথেও যোগাযোগ করতে হবে। + +ব্যবহারকারীর ইন্টারঅ্যাকশনে বাধা না দিয়ে স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করার জন্য কন্ট্র্যাক্ট মাইগ্রেশন একটি তুলনামূলকভাবে সহজ এবং নিরাপদ ব্যবস্থা। তবে, নতুন কন্ট্র্যাক্টে ব্যবহারকারীর সংগ্রহস্থল এবং ব্যালেন্স ম্যানুয়ালি স্থানান্তর করা সময়সাপেক্ষ এবং এতে উচ্চ গ্যাস খরচ হতে পারে। + +[কন্ট্র্যাক্ট মাইগ্রেশন সম্পর্কে আরও জানুন।](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) + +### আপগ্রেড প্রক্রিয়া #2: ডেটা পৃথকীকরণ {#data-separation} + +স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করার আরেকটি পদ্ধতি হলো ব্যবসায়িক যুক্তি এবং ডেটা সংগ্রহস্থলকে পৃথক কন্ট্র্যাক্টে আলাদা করা। এর মানে হলো ব্যবহারকারীরা লজিক কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করে, যখন ডেটা সংগ্রহস্থল কন্ট্র্যাক্টে সংরক্ষণ করা হয়। + +লজিক কন্ট্র্যাক্টে সেই কোড থাকে যা ব্যবহারকারীরা অ্যাপ্লিকেশনের সাথে ইন্টারঅ্যাক্ট করার সময় নির্বাহ করা হয়। এটি সংগ্রহস্থল কন্ট্র্যাক্টের ঠিকানাও ধরে রাখে এবং ডেটা পেতে ও সেট করতে এর সাথে ইন্টারঅ্যাক্ট করে। + +এদিকে, সংগ্রহস্থল কন্ট্র্যাক্টটি স্মার্ট কন্ট্র্যাক্টের সাথে সম্পর্কিত স্টেট, যেমন ব্যবহারকারীর ব্যালেন্স এবং ঠিকানা, ধরে রাখে। মনে রাখবেন যে সংগ্রহস্থল কন্ট্র্যাক্টটি লজিক কন্ট্র্যাক্টের মালিকানাধীন এবং স্থাপনের সময় এটি লজিক কন্ট্র্যাক্টের ঠিকানা দিয়ে কনফিগার করা হয়। এটি অননুমোদিত কন্ট্র্যাক্টকে সংগ্রহস্থল কন্ট্র্যাক্টে কল করা বা এর ডেটা আপডেট করা থেকে বিরত রাখে। + +ডিফল্টরূপে, সংগ্রহস্থল কন্ট্র্যাক্টটি অপরিবর্তনীয়—কিন্তু আপনি এটি যে লজিক কন্ট্র্যাক্টকে নির্দেশ করে তা একটি নতুন বাস্তবায়ন দিয়ে প্রতিস্থাপন করতে পারেন। এটি EVM-এ চালিত কোড পরিবর্তন করবে এবং সংগ্রহস্থল ও ব্যালেন্স অক্ষত রাখবে। + +এই আপগ্রেড পদ্ধতি ব্যবহার করার জন্য সংগ্রহস্থল কন্ট্র্যাক্টে লজিক কন্ট্র্যাক্টের ঠিকানা আপডেট করতে হবে। পূর্বে ব্যাখ্যা করা কারণগুলোর জন্য আপনাকে অবশ্যই সংগ্রহস্থল কন্ট্র্যাক্টের ঠিকানা দিয়ে নতুন লজিক কন্ট্র্যাক্টটি কনফিগার করতে হবে। + +ডেটা পৃথকীকরণ প্যাটার্নটি কন্ট্র্যাক্ট মাইগ্রেশনের তুলনায় প্রয়োগ করা তর্কযোগ্যভাবে সহজ। তবে, ক্ষতিকারক আপগ্রেড থেকে স্মার্ট কন্ট্র্যাক্টকে রক্ষা করার জন্য আপনাকে একাধিক কন্ট্র্যাক্ট পরিচালনা করতে হবে এবং জটিল অনুমোদন স্কিম প্রয়োগ করতে হবে। + +### আপগ্রেড প্রক্রিয়া #3: প্রক্সি প্যাটার্ন {#proxy-patterns} + +প্রক্সি প্যাটার্নও ব্যবসায়িক যুক্তি এবং ডেটাকে পৃথক কন্ট্র্যাক্টে রাখার জন্য ডেটা পৃথকীকরণ ব্যবহার করে। তবে, একটি প্রক্সি প্যাটার্নে, কোড নির্বাহের সময় সংগ্রহস্থল কন্ট্র্যাক্ট (যাকে প্রক্সি বলা হয়) লজিক কন্ট্র্যাক্টকে কল করে। এটি ডেটা পৃথকীকরণ পদ্ধতির বিপরীত, যেখানে লজিক কন্ট্র্যাক্ট সংগ্রহস্থল কন্ট্র্যাক্টকে কল করে। + +একটি প্রক্সি প্যাটার্নে যা ঘটে তা হলো: + +1. ব্যবহারকারীরা প্রক্সি কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করে, যা ডেটা সংরক্ষণ করে, কিন্তু ব্যবসায়িক যুক্তি ধারণ করে না। + +2. প্রক্সি কন্ট্র্যাক্ট লজিক কন্ট্র্যাক্টের ঠিকানা সংরক্ষণ করে এবং `delegatecall` ফাংশন ব্যবহার করে সমস্ত ফাংশন কল লজিক কন্ট্র্যাক্টে (যা ব্যবসায়িক যুক্তি ধারণ করে) অর্পণ করে। + +3. কলটি লজিক কন্ট্র্যাক্টে ফরওয়ার্ড করার পরে, লজিক কন্ট্র্যাক্ট থেকে ফেরত আসা ডেটা পুনরুদ্ধার করা হয় এবং ব্যবহারকারীকে ফেরত দেওয়া হয়। + +প্রক্সি প্যাটার্ন ব্যবহার করার জন্য **delegatecall** ফাংশন সম্পর্কে বোঝার প্রয়োজন। মূলত, `delegatecall` হলো একটি অপকোড যা একটি কন্ট্র্যাক্টকে অন্য একটি কন্ট্র্যাক্ট কল করতে দেয়, যখন প্রকৃত কোড নির্বাহ কলিং কন্ট্র্যাক্টের প্রেক্ষাপটে ঘটে। প্রক্সি প্যাটার্নে `delegatecall` ব্যবহার করার একটি প্রভাব হলো যে প্রক্সি কন্ট্র্যাক্ট তার সংগ্রহস্থল থেকে পড়ে এবং লেখে এবং লজিক কন্ট্র্যাক্টে সংরক্ষিত যুক্তি নির্বাহ করে, যেন এটি একটি অভ্যন্তরীণ ফাংশন কল করছে। + +[Solidity ডকুমেন্টেশন](https://docs.soliditylang.org/en/latest/introduction-to-smart-contracts.html#delegatecall-callcode-and-libraries) থেকে: + +> _মেসেজ কলের একটি বিশেষ ভ্যারিয়েন্ট রয়েছে, যার নাম **delegatecall**, যা একটি মেসেজ কলের মতোই, শুধুমাত্র এই तथ्यটি ছাড়া যে টার্গেট ঠিকানার কোডটি কলিং কন্ট্র্যাক্টের প্রেক্ষাপটে (অর্থাৎ, ঠিকানায়) নির্বাহ করা হয় এবং `msg.sender` ও `msg.value`-এর মান পরিবর্তন হয় না।_ _এর মানে হলো একটি কন্ট্র্যাক্ট রানটাইমে একটি ভিন্ন ঠিকানা থেকে ডাইনামিকভাবে কোড লোড করতে পারে।_ সংগ্রহস্থল, বর্তমান ঠিকানা এবং ব্যালেন্স এখনও কলিং কন্ট্র্যাক্টকে নির্দেশ করে, শুধুমাত্র কোডটি কল করা ঠিকানা থেকে নেওয়া হয়।_ + +প্রক্সি কন্ট্র্যাক্টটি জানে যে যখনই কোনো ব্যবহারকারী কোনো ফাংশন কল করে তখন `delegatecall` ইনভোক করতে হবে, কারণ এর মধ্যে একটি `fallback` ফাংশন বিল্ট-ইন রয়েছে। Solidity প্রোগ্রামিং-এ [ফলব্যাক ফাংশন](https://docs.soliditylang.org/en/latest/contracts.html#fallback-function) তখনই নির্বাহ করা হয় যখন একটি ফাংশন কল কোনো কন্ট্র্যাক্টে নির্দিষ্ট করা ফাংশনগুলোর সাথে মেলে না। + +প্রক্সি প্যাটার্ন কার্যকর করার জন্য একটি কাস্টম ফলব্যাক ফাংশন লেখা প্রয়োজন যা নির্দিষ্ট করে যে প্রক্সি কন্ট্র্যাক্টটি সমর্থন করে না এমন ফাংশন কলগুলো কীভাবে পরিচালনা করবে। এই ক্ষেত্রে প্রক্সির ফলব্যাক ফাংশনটি একটি delegatecall শুরু করার জন্য এবং ব্যবহারকারীর অনুরোধটি বর্তমান লজিক কন্ট্র্যাক্ট বাস্তবায়নে পুনরায় রুট করার জন্য প্রোগ্রাম করা হয়। + +প্রক্সি কন্ট্র্যাক্টটি ডিফল্টরূপে অপরিবর্তনীয়, কিন্তু আপডেট করা ব্যবসায়িক যুক্তি সহ নতুন লজিক কন্ট্র্যাক্ট তৈরি করা যেতে পারে। আপগ্রেড করাটা তখন প্রক্সি কন্ট্র্যাক্টে উল্লেখিত লজিক কন্ট্র্যাক্টের ঠিকানা পরিবর্তন করার একটি ব্যাপার মাত্র। + +প্রক্সি কন্ট্র্যাক্টকে একটি নতুন লজিক কন্ট্র্যাক্টে নির্দেশ করার মাধ্যমে, ব্যবহারকারীরা যখন প্রক্সি কন্ট্র্যাক্ট ফাংশন কল করে তখন নির্বাহিত কোডটি পরিবর্তিত হয়। এটি আমাদেরকে ব্যবহারকারীদের একটি নতুন কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করতে না বলেই একটি কন্ট্র্যাক্টের যুক্তি আপগ্রেড করতে দেয়। + +প্রক্সি প্যাটার্ন স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করার জন্য একটি জনপ্রিয় পদ্ধতি কারণ এটি কন্ট্র্যাক্ট মাইগ্রেশনের সাথে সম্পর্কিত অসুবিধাগুলো দূর করে। তবে, প্রক্সি প্যাটার্ন ব্যবহার করা আরও জটিল এবং ভুলভাবে ব্যবহার করা হলে [ফাংশন সিলেক্টর ক্ল্যাশ](https://medium.com/nomic-foundation-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357)-এর মতো গুরুতর ত্রুটি সৃষ্টি করতে পারে। + +[প্রক্সি প্যাটার্ন সম্পর্কে আরও জানুন।](https://blog.openzeppelin.com/proxy-patterns/) + +### আপগ্রেড প্রক্রিয়া #4: স্ট্র্যাটেজি প্যাটার্ন {#strategy-pattern} + +এই কৌশলটি [স্ট্র্যাটেজি প্যাটার্ন](https://en.wikipedia.org/wiki/Strategy_pattern) দ্বারা প্রভাবিত, যা নির্দিষ্ট বৈশিষ্ট্য প্রয়োগ করার জন্য অন্যান্য প্রোগ্রামের সাথে ইন্টারফেস করে এমন সফ্টওয়্যার প্রোগ্রাম তৈরি করতে উৎসাহিত করে। ইথেরিয়াম ডেভেলপমেন্টে স্ট্র্যাটেজি প্যাটার্ন প্রয়োগ করার অর্থ হলো এমন একটি স্মার্ট কন্ট্র্যাক্ট তৈরি করা যা অন্যান্য কন্ট্র্যাক্ট থেকে ফাংশন কল করে। + +এই ক্ষেত্রে প্রধান কন্ট্র্যাক্টটিতে মূল ব্যবসায়িক যুক্তি থাকে, কিন্তু এটি নির্দিষ্ট ফাংশন সম্পাদন করার জন্য অন্যান্য স্মার্ট কন্ট্র্যাক্টের ("স্যাটেলাইট কন্ট্র্যাক্ট") সাথে ইন্টারফেস করে। এই প্রধান কন্ট্র্যাক্টটি প্রতিটি স্যাটেলাইট কন্ট্র্যাক্টের ঠিকানা সংরক্ষণ করে এবং স্যাটেলাইট কন্ট্র্যাক্টের বিভিন্ন বাস্তবায়নের মধ্যে পরিবর্তন করতে পারে। + +আপনি একটি নতুন স্যাটেলাইট কন্ট্র্যাক্ট তৈরি করতে পারেন এবং নতুন ঠিকানা দিয়ে প্রধান কন্ট্র্যাক্টটি কনফিগার করতে পারেন। এটি আপনাকে একটি স্মার্ট কন্ট্র্যাক্টের জন্য _স্ট্র্যাটেজি_ পরিবর্তন করতে (অর্থাৎ নতুন যুক্তি প্রয়োগ করতে) দেয়। + +যদিও এটি পূর্বে আলোচিত প্রক্সি প্যাটার্নের মতো, তবে স্ট্র্যাটেজি প্যাটার্নটি ভিন্ন কারণ প্রধান কন্ট্র্যাক্ট, যার সাথে ব্যবহারকারীরা ইন্টারঅ্যাক্ট করে, সেটি ব্যবসায়িক যুক্তি ধারণ করে। এই প্যাটার্নটি ব্যবহার করে আপনি মূল পরিকাঠামোকে প্রভাবিত না করে একটি স্মার্ট কন্ট্র্যাক্টে সীমিত পরিবর্তন আনার সুযোগ পান। + +এর প্রধান অসুবিধা হলো এই প্যাটার্নটি বেশিরভাগ ক্ষেত্রে ছোটখাটো আপগ্রেড করার জন্য উপযোগী। এছাড়াও, যদি প্রধান কন্ট্র্যাক্টটি ক্ষতিগ্রস্ত হয় (যেমন, একটি হ্যাকের মাধ্যমে), আপনি এই আপগ্রেড পদ্ধতি ব্যবহার করতে পারবেন না। + +### আপগ্রেড প্রক্রিয়া #5: ডায়মন্ড প্যাটার্ন {#diamond-pattern} + +ডায়মন্ড প্যাটার্নকে প্রক্সি প্যাটার্নের একটি উন্নত সংস্করণ হিসেবে বিবেচনা করা যেতে পারে। ডায়মন্ড প্যাটার্নগুলো প্রক্সি প্যাটার্ন থেকে ভিন্ন কারণ ডায়মন্ড প্রক্সি কন্ট্র্যাক্ট একাধিক লজিক কন্ট্র্যাক্টে ফাংশন কল অর্পণ করতে পারে। + +ডায়মন্ড প্যাটার্নে লজিক কন্ট্র্যাক্টগুলো _ফেসেট_ নামে পরিচিত। ডায়মন্ড প্যাটার্নটি কাজ করানোর জন্য, আপনাকে প্রক্সি কন্ট্র্যাক্টে একটি ম্যাপিং তৈরি করতে হবে যা বিভিন্ন ফেসেট ঠিকানায় [ফাংশন সিলেক্টর](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector) ম্যাপ করে। + +যখন একজন ব্যবহারকারী একটি ফাংশন কল করে, প্রক্সি কন্ট্র্যাক্ট সেই ফাংশনটি সম্পাদনের জন্য দায়ী ফেসেট খুঁজে বের করার জন্য ম্যাপিং পরীক্ষা করে। তারপর এটি `delegatecall` (ফলব্যাক ফাংশন ব্যবহার করে) ইনভোক করে এবং কলটি উপযুক্ত লজিক কন্ট্র্যাক্টে পুনঃনির্দেশিত করে। + +প্রচলিত প্রক্সি আপগ্রেড প্যাটার্নের তুলনায় ডায়মন্ড আপগ্রেড প্যাটার্নের কিছু সুবিধা রয়েছে: + +1. এটি আপনাকে সমস্ত কোড পরিবর্তন না করে কন্ট্র্যাক্টের একটি ছোট অংশ আপগ্রেড করতে দেয়। আপগ্রেডের জন্য প্রক্সি প্যাটার্ন ব্যবহার করার জন্য একটি সম্পূর্ণ নতুন লজিক কন্ট্র্যাক্ট তৈরি করতে হয়, এমনকি ছোট আপগ্রেডের জন্যও। + +2. সমস্ত স্মার্ট কন্ট্র্যাক্টের (প্রক্সি প্যাটার্নে ব্যবহৃত লজিক কন্ট্র্যাক্ট সহ) একটি 24KB আকারের সীমা রয়েছে, যা একটি সীমাবদ্ধতা হতে পারে—বিশেষ করে জটিল কন্ট্র্যাক্টের জন্য যার জন্য আরও ফাংশন প্রয়োজন। ডায়মন্ড প্যাটার্ন একাধিক লজিক কন্ট্র্যাক্টে ফাংশন বিভক্ত করে এই সমস্যার সমাধান করা সহজ করে তোলে। + +3. প্রক্সি প্যাটার্নগুলো অ্যাক্সেস নিয়ন্ত্রণের জন্য একটি ক্যাচ-অল পদ্ধতি গ্রহণ করে। আপগ্রেড ফাংশনে অ্যাক্সেস থাকা একটি সত্তা _সম্পূর্ণ_ কন্ট্র্যাক্ট পরিবর্তন করতে পারে। কিন্তু ডায়মন্ড প্যাটার্ন একটি মডুলার অনুমতি পদ্ধতি সক্ষম করে, যেখানে আপনি সত্তাগুলোকে একটি স্মার্ট কন্ট্র্যাক্টের মধ্যে নির্দিষ্ট ফাংশন আপগ্রেড করতে সীমাবদ্ধ করতে পারেন। + +[ডায়মন্ড প্যাটার্ন সম্পর্কে আরও জানুন](https://eip2535diamonds.substack.com/p/introduction-to-the-diamond-standard?s=w)। + +## স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করার সুবিধা এবং অসুবিধা {#pros-and-cons-of-upgrading-smart-contracts} + +| যেসব বিষয়ে এর সুফল পাওয়া যায় | কনস | +| ----------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| একটি স্মার্ট কন্ট্র্যাক্ট আপগ্রেড স্থাপনার পরবর্তী পর্যায়ে আবিষ্কৃত দুর্বলতাগুলো ঠিক করা সহজ করে তুলতে পারে। | স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করা কোডের অপরিবর্তনীয়তার ধারণাকে অস্বীকার করে, যা বিকেন্দ্রীকরণ এবং নিরাপত্তার উপর প্রভাব ফেলে। | +| ডেভেলপাররা ডিসেন্ট্রালাইজড এপ্লিকেশনগুলোতে নতুন বৈশিষ্ট্য যোগ করতে লজিক আপগ্রেড ব্যবহার করতে পারেন। | ব্যবহারকারীদের অবশ্যই ডেভেলপারদের উপর বিশ্বাস রাখতে হবে যেন তারা ইচ্ছামত স্মার্ট কন্ট্র্যাক্ট পরিবর্তন না করে। | +| স্মার্ট কন্ট্র্যাক্ট আপগ্রেডগুলো শেষ-ব্যবহারকারীদের জন্য নিরাপত্তা উন্নত করতে পারে কারণ বাগগুলো দ্রুত ঠিক করা যায়। | স্মার্ট কন্ট্র্যাক্টে আপগ্রেড কার্যকারিতা প্রোগ্রামিং করা জটিলতার আরও একটি স্তর যোগ করে এবং গুরুতর ত্রুটির সম্ভাবনা বাড়িয়ে তোলে। | +| কন্ট্র্যাক্ট আপগ্রেড ডেভেলপারদের বিভিন্ন বৈশিষ্ট্য নিয়ে পরীক্ষা করার এবং সময়ের সাথে সাথে ডিএ্যাপস উন্নত করার জন্য আরও সুযোগ দেয়। | স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করার সুযোগ ডেভেলপারদেরকে ডেভেলপমেন্ট পর্যায়ে যথাযথ সতর্কতা অবলম্বন না করেই দ্রুত প্রকল্প চালু করতে উৎসাহিত করতে পারে। | +| | স্মার্ট কন্ট্র্যাক্টে নিরাপত্তাহীন অ্যাক্সেস কন্ট্রোল বা কেন্দ্রীকরণ ক্ষতিকারক অভিনেতাদের জন্য অননুমোদিত আপগ্রেড করা সহজ করে তুলতে পারে। | + +## স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করার জন্য বিবেচনা {#considerations-for-upgrading-smart-contracts} + +1. অননুমোদিত স্মার্ট কন্ট্র্যাক্ট আপগ্রেড প্রতিরোধ করতে নিরাপদ অ্যাক্সেস নিয়ন্ত্রণ/অনুমোদন প্রক্রিয়া ব্যবহার করুন, বিশেষ করে যদি প্রক্সি প্যাটার্ন, স্ট্র্যাটেজি প্যাটার্ন, বা ডেটা সেপারেশন ব্যবহার করেন। একটি উদাহরণ হলো আপগ্রেড ফাংশনে অ্যাক্সেস সীমাবদ্ধ করা, যাতে শুধুমাত্র কন্ট্র্যাক্টের মালিকই এটি কল করতে পারে। + +2. স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করা একটি জটিল কার্যকলাপ এবং দুর্বলতা সৃষ্টি রোধ করার জন্য উচ্চ স্তরের সতর্কতা প্রয়োজন। + +3. আপগ্রেড বাস্তবায়নের প্রক্রিয়াকে বিকেন্দ্রীকরণ করে বিশ্বাসের অনুমান হ্রাস করুন। সম্ভাব্য কৌশলগুলোর মধ্যে রয়েছে আপগ্রেড নিয়ন্ত্রণের জন্য একটি [মাল্টি-সিগ ওয়ালেট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/#multisig) ব্যবহার করা, অথবা আপগ্রেড অনুমোদনের জন্য একটি [DAO-এর সদস্যদের](/dao/) ভোট দেওয়ার প্রয়োজন। + +4. কন্ট্র্যাক্ট আপগ্রেড করার সাথে জড়িত খরচ সম্পর্কে সচেতন থাকুন। উদাহরণস্বরূপ, কন্ট্র্যাক্ট মাইগ্রেশনের সময় একটি পুরানো কন্ট্র্যাক্ট থেকে একটি নতুন কন্ট্র্যাক্টে স্টেট (যেমন ব্যবহারকারীর ব্যালেন্স) অনুলিপি করতে একাধিক লেনদেনের প্রয়োজন হতে পারে, যার অর্থ আরও বেশি গ্যাস ফি। + +5. ব্যবহারকারীদের সুরক্ষার জন্য **টাইমলক** বাস্তবায়নের কথা বিবেচনা করুন। টাইমলক বলতে একটি সিস্টেমে পরিবর্তনের উপর প্রয়োগ করা একটি বিলম্বকে বোঝায়। আপগ্রেড নিয়ন্ত্রণের জন্য টাইমলক একটি মাল্টি-সিগ গভর্নেন্স সিস্টেমের সাথে মিলিত হতে পারে: যদি একটি প্রস্তাবিত পদক্ষেপ প্রয়োজনীয় অনুমোদনের থ্রেশহোল্ডে পৌঁছায়, তবে পূর্বনির্ধারিত বিলম্বের সময় শেষ না হওয়া পর্যন্ত এটি কার্যকর হয় না। + +টাইমলক ব্যবহারকারীদের সিস্টেম থেকে বেরিয়ে যাওয়ার জন্য কিছু সময় দেয় যদি তারা প্রস্তাবিত পরিবর্তনের সাথে একমত না হয় (যেমন, লজিক আপগ্রেড বা নতুন ফি স্কিম)। টাইমলক ছাড়া, ব্যবহারকারীদের ডেভেলপারদের উপর বিশ্বাস করতে হবে যে তারা পূর্ব নোটিশ ছাড়াই একটি স্মার্ট কন্ট্র্যাক্টে ইচ্ছামত পরিবর্তন করবে না। এর অসুবিধা হলো টাইমলক দ্রুত দুর্বলতা প্যাচ করার ক্ষমতাকে সীমাবদ্ধ করে। + +## রিসোর্স {#resources} + +**OpenZeppelin আপগ্রেড প্লাগইন - _আপগ্রেডযোগ্য স্মার্ট কন্ট্র্যাক্ট স্থাপন এবং সুরক্ষিত করার জন্য একটি টুলস স্যুট।_** + +- [GitHub](https://github.com/OpenZeppelin/openzeppelin-upgrades) +- [নথিপত্র](https://docs.openzeppelin.com/upgrades) + +## টিউটোরিয়াল {#tutorials} + +- প্যাট্রিক কলিন্সের [আপনার স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করা | ইউটিউব টিউটোরিয়াল](https://www.youtube.com/watch?v=bdXJmWajZRY) +- অস্টিন গ্রিফিথের [ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট মাইগ্রেশন টিউটোরিয়াল](https://medium.com/coinmonks/ethereum-smart-contract-migration-13f6f12539bd) +- [স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করার জন্য UUPS প্রক্সি প্যাটার্ন ব্যবহার করা](https://blog.logrocket.com/author/praneshas/) - লেখক প্রনেশ এ.এস +- [Web3 টিউটোরিয়াল: OpenZeppelin ব্যবহার করে আপগ্রেডযোগ্য স্মার্ট কন্ট্র্যাক্ট (প্রক্সি) লিখুন](https://dev.to/yakult/tutorial-write-upgradeable-smart-contract-proxy-contract-with-openzeppelin-1916) - লেখক fangjun.eth + +## আরও পড়ুন {#further-reading} + +- সান্তিয়াগো প্যালাডিনোর [দ্য স্টেট অফ স্মার্ট কন্ট্র্যাক্ট আপগ্রেডস](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/) +- [একটি সলিডিটি স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করার একাধিক উপায়](https://cryptomarketpool.com/multiple-ways-to-upgrade-a-solidity-smart-contract/) - ক্রিপ্টো মার্কেট পুল ব্লগ +- [শিখুন: স্মার্ট কন্ট্র্যাক্ট আপগ্রেড করা](https://docs.openzeppelin.com/learn/upgrading-smart-contracts) - OpenZeppelin ডক্স +- [সলিডিটি কন্ট্র্যাক্টসের আপগ্রেডযোগ্যতার জন্য প্রক্সি প্যাটার্নস: ট্রান্সপারেন্ট বনাম UUPS প্রক্সি](https://mirror.xyz/0xB38709B8198d147cc9Ff9C133838a044d78B064B/M7oTptQkBGXxox-tk9VJjL66E1V8BUF0GF79MMK4YG0) - লেখক নবীন সাহু +- নিক মুজের [ডায়মন্ড আপগ্রেড কীভাবে কাজ করে](https://dev.to/mudgen/how-diamond-upgrades-work-417j) diff --git a/public/content/translations/bn/developers/docs/smart-contracts/verifying/index.md b/public/content/translations/bn/developers/docs/smart-contracts/verifying/index.md new file mode 100644 index 00000000000..709fea47c2e --- /dev/null +++ b/public/content/translations/bn/developers/docs/smart-contracts/verifying/index.md @@ -0,0 +1,113 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট যাচাই করা" +description: "ইথেরিয়াম স্মার্ট কন্ট্র্যাক্টের জন্য সোর্স কোড যাচাইকরণের একটি সংক্ষিপ্ত বিবরণ" +lang: bn +--- + +[স্মার্ট কন্ট্র্যাক্টগুলি](/developers/docs/smart-contracts/) “ট্রাস্টলেস” হওয়ার জন্য ডিজাইন করা হয়েছে, যার অর্থ ব্যবহারকারীদের একটি কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার আগে তৃতীয় পক্ষের (যেমন, ডেভেলপার এবং কোম্পানি) উপর বিশ্বাস করার প্রয়োজন নেই। ট্রাস্টলেসনেসের জন্য একটি পূর্বশর্ত হিসাবে, ব্যবহারকারী এবং অন্যান্য ডেভেলপারদের অবশ্যই একটি স্মার্ট কন্ট্র্যাক্টের সোর্স কোড যাচাই করতে সক্ষম হতে হবে। সোর্স কোড যাচাইকরণ ব্যবহারকারী এবং ডেভেলপারদের নিশ্চিত করে যে প্রকাশিত কন্ট্র্যাক্ট কোডটি ইথেরিয়াম ব্লকচেইনে কন্ট্র্যাক্ট অ্যাড্রেসে চলমান একই কোড। + +"সোর্স কোড যাচাইকরণ" এবং "[প্রথাগত যাচাইকরণ](/developers/docs/smart-contracts/formal-verification/)"-এর মধ্যে পার্থক্য করা গুরুত্বপূর্ণ। সোর্স কোড যাচাইকরণ, যা নীচে বিস্তারিতভাবে ব্যাখ্যা করা হবে, এটি একটি উচ্চ-স্তরের ভাষায় (যেমন, সলিডিটি) একটি স্মার্ট কন্ট্র্যাক্টের প্রদত্ত সোর্স কোডটি কন্ট্র্যাক্ট অ্যাড্রেসে কার্যকর করার জন্য একই বাইটকোডে কম্পাইল করা হয়েছে কিনা তা যাচাই করাকে বোঝায়। তবে, প্রথাগত যাচাইকরণ একটি স্মার্ট কন্ট্র্যাক্টের সঠিকতা যাচাই করার বর্ণনা দেয়, যার অর্থ কন্ট্র্যাক্টটি প্রত্যাশা অনুযায়ী আচরণ করে। যদিও প্রসঙ্গ-নির্ভর, কন্ট্র্যাক্ট যাচাইকরণ সাধারণত সোর্স কোড যাচাইকরণকে বোঝায়। + +## সোর্স কোড যাচাইকরণ কী? {#what-is-source-code-verification} + +[Ethereum Virtual Machine (EVM)](/developers/docs/evm/)-এ একটি স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করার আগে, ডেভেলপাররা কন্ট্র্যাক্টের সোর্স কোড—[Solidity-তে লেখা](/developers/docs/smart-contracts/languages/) নির্দেশাবলী বা অন্য কোনো উচ্চ-স্তরের প্রোগ্রামিং ভাষা—[কম্পাইল করে](/developers/docs/smart-contracts/compiling/) বাইটকোডে রূপান্তর করে। যেহেতু EVM উচ্চ-স্তরের নির্দেশাবলী বুঝতে পারে না, তাই EVM-এ কন্ট্র্যাক্টের যুক্তি কার্যকর করার জন্য সোর্স কোডকে বাইটকোডে (অর্থাৎ, নিম্ন-স্তরের, মেশিনের নির্দেশাবলী) কম্পাইল করা প্রয়োজন। + +সোর্স কোড যাচাইকরণ হলো একটি স্মার্ট কন্ট্র্যাক্টের সোর্স কোড এবং কন্ট্র্যাক্ট তৈরির সময় ব্যবহৃত কম্পাইল করা বাইটকোডের তুলনা করে কোনো পার্থক্য শনাক্ত করা। স্মার্ট কন্ট্র্যাক্ট যাচাই করা গুরুত্বপূর্ণ কারণ বিজ্ঞাপিত কন্ট্র্যাক্ট কোডটি ব্লকচেইনে যা চলে তার থেকে ভিন্ন হতে পারে। + +স্মার্ট কন্ট্র্যাক্ট যাচাইকরণ মেশিন কোড না পড়েই, এটি যে উচ্চ-স্তরের ভাষায় লেখা হয়েছে তার মাধ্যমে একটি কন্ট্র্যাক্ট কী করে তা তদন্ত করতে সক্ষম করে। ফাংশন, মান, এবং সাধারণত ভেরিয়েবলের নাম এবং মন্তব্যগুলি মূল সোর্স কোডের সাথে একই থাকে যা কম্পাইল এবং ডিপ্লয় করা হয়। এটি কোড পড়া অনেক সহজ করে তোলে। সোর্স যাচাইকরণ কোড ডকুমেন্টেশনের জন্যও বিধান করে, যাতে শেষ-ব্যবহারকারীরা জানতে পারে যে একটি স্মার্ট কন্ট্র্যাক্ট কী করার জন্য ডিজাইন করা হয়েছে। + +### সম্পূর্ণ যাচাইকরণ কী? {#full-verification} + +সোর্স কোডের কিছু অংশ রয়েছে যা কম্পাইল করা বাইটকোডকে প্রভাবিত করে না যেমন মন্তব্য বা ভেরিয়েবলের নাম। তার মানে ভিন্ন ভেরিয়েবলের নাম এবং ভিন্ন মন্তব্য সহ দুটি সোর্স কোড উভয়ই একই কন্ট্র্যাক্ট যাচাই করতে সক্ষম হবে। এর ফলে, একজন দূষিত অভিনেতা সোর্স কোডের ভিতরে প্রতারণামূলক মন্তব্য যোগ করতে পারে বা বিভ্রান্তিকর ভেরিয়েবলের নাম দিতে পারে এবং মূল সোর্স কোড থেকে ভিন্ন একটি সোর্স কোড দিয়ে কন্ট্র্যাক্টটি যাচাই করাতে পারে। + +সোর্স কোডের নির্ভুলতার জন্য একটি _ক্রিপ্টোগ্রাফিক গ্যারান্টি_ এবং কম্পাইলেশন তথ্যের একটি _ফিঙ্গারপ্রিন্ট_ হিসাবে কাজ করার জন্য বাইটকোডে অতিরিক্ত ডেটা যুক্ত করে এটি এড়ানো সম্ভব। প্রয়োজনীয় তথ্য [Solidity-র কন্ট্র্যাক্ট মেটাডেটা]-তে (https://docs.soliditylang.org/en/v0.8.15/metadata.html) পাওয়া যায় এবং এই ফাইলের হ্যাস একটি কন্ট্র্যাক্টের বাইটকোডের সাথে যুক্ত করা হয়। আপনি এটি [মেটাডেটা প্লেগ্রাউন্ডে](https://playground.sourcify.dev) কার্যকর অবস্থায় দেখতে পারেন + +মেটাডেটা ফাইলে সোর্স ফাইল এবং তাদের হ্যাস সহ কন্ট্র্যাক্টের কম্পাইলেশন সম্পর্কে তথ্য থাকে। মানে, যদি কোনো কম্পাইলেশন সেটিংস বা এমনকি সোর্স ফাইলগুলির মধ্যে একটিতে একটি বাইটও পরিবর্তন হয়, তবে মেটাডেটা ফাইলটি পরিবর্তিত হয়। ফলস্বরূপ মেটাডেটা ফাইলের হ্যাস, যা বাইটকোডের সাথে যুক্ত করা হয়, তাও পরিবর্তিত হয়। এর মানে হল যদি একটি কন্ট্র্যাক্টের বাইটকোড + সংযুক্ত মেটাডেটা হ্যাস প্রদত্ত সোর্স কোড এবং কম্পাইলেশন সেটিংসের সাথে মিলে যায়, আমরা নিশ্চিত হতে পারি যে এটি মূল কম্পাইলেশনে ব্যবহৃত ঠিক একই সোর্স কোড, এমনকি একটি বাইটও ভিন্ন নয়। + +এই ধরনের যাচাইকরণ যা মেটাডেটা হ্যাসকে লিভারেজ করে তাকে **"[সম্পূর্ণ যাচাইকরণ](https://docs.sourcify.dev/docs/full-vs-partial-match/)"** (এছাড়াও "নিখুঁত যাচাইকরণ") হিসাবে উল্লেখ করা হয়। যদি মেটাডেটা হ্যাসগুলি মেলে না বা যাচাইকরণে বিবেচনা করা না হয় তবে এটি একটি "আংশিক মিল" হবে, যা বর্তমানে কন্ট্র্যাক্ট যাচাই করার আরও সাধারণ উপায়। সম্পূর্ণ যাচাইকরণ ছাড়া যাচাইকৃত সোর্স কোডে প্রতিফলিত হবে না এমন [দূষিত কোড প্রবেশ করানো](https://samczsun.com/hiding-in-plain-sight/) সম্ভব। বেশিরভাগ ডেভেলপার সম্পূর্ণ যাচাইকরণ সম্পর্কে সচেতন নন এবং তাদের কম্পাইলেশনের মেটাডেটা ফাইল রাখেন না, তাই আংশিক যাচাইকরণ এখন পর্যন্ত কন্ট্র্যাক্ট যাচাই করার ডি ফ্যাক্টো পদ্ধতি হয়ে দাঁড়িয়েছে। + +## সোর্স কোড যাচাইকরণ কেন গুরুত্বপূর্ণ? {#importance-of-source-code-verification} + +### ট্রাস্টলেসনেস {#trustlessness} + +ট্রাস্টলেসনেস তর্কযোগ্যভাবে স্মার্ট কন্ট্র্যাক্ট এবং [ডিসেন্ট্রালাইজড এপ্লিকেশন (ডিএ্যাপস)](/developers/docs/dapps/)-এর জন্য সবচেয়ে বড় ভিত্তি। স্মার্ট কন্ট্র্যাক্টগুলি “অপরিবর্তনীয়” এবং পরিবর্তন করা যায় না; একটি কন্ট্র্যাক্ট শুধুমাত্র ডিপ্লয়মেন্টের সময় কোডে সংজ্ঞায়িত ব্যবসায়িক যুক্তি কার্যকর করবে। এর মানে হল ডেভেলপার এবং এন্টারপ্রাইজগুলি Ethereum-এ ডিপ্লয় করার পরে একটি কন্ট্র্যাক্টের কোড পরিবর্তন করতে পারে না। + +একটি স্মার্ট কন্ট্র্যাক্টকে ট্রাস্টলেস হতে হলে, কন্ট্র্যাক্ট কোডটি স্বাধীন যাচাইকরণের জন্য উপলব্ধ থাকা উচিত। যদিও প্রতিটি স্মার্ট কন্ট্র্যাক্টের জন্য কম্পাইল করা বাইটকোড ব্লকচেইনে সর্বজনীনভাবে উপলব্ধ, নিম্ন-স্তরের ভাষা বোঝা কঠিন—ডেভেলপার এবং ব্যবহারকারী উভয়ের জন্যই। + +প্রকল্পগুলি তাদের কন্ট্র্যাক্টের সোর্স কোড প্রকাশ করে বিশ্বাসের অনুমান হ্রাস করে। কিন্তু এটি আরেকটি সমস্যার দিকে নিয়ে যায়: প্রকাশিত সোর্স কোডটি কন্ট্র্যাক্ট বাইটকোডের সাথে মেলে কিনা তা যাচাই করা কঠিন। এই পরিস্থিতিতে, ট্রাস্টলেসনেসের মূল্য হারিয়ে যায় কারণ ব্যবহারকারীদের ব্লকচেইনে এটি ডিপ্লয় করার আগে ডেভেলপারদের উপর বিশ্বাস করতে হয় যে তারা কন্ট্র্যাক্টের ব্যবসায়িক যুক্তি পরিবর্তন করবে না (অর্থাৎ, বাইটকোড পরিবর্তন করে)। + +সোর্স কোড যাচাইকরণ টুলগুলি গ্যারান্টি দেয় যে একটি স্মার্ট কন্ট্র্যাক্টের সোর্স কোড ফাইলগুলি অ্যাসেম্বলি কোডের সাথে মেলে। ফলাফল হল একটি ট্রাস্টলেস ইকোসিস্টেম, যেখানে ব্যবহারকারীরা তৃতীয় পক্ষকে অন্ধভাবে বিশ্বাস করে না এবং পরিবর্তে একটি কন্ট্র্যাক্টে অর্থ জমা করার আগে কোড যাচাই করে। + +### ব্যবহারকারীর নিরাপত্তা {#user-safety} + +স্মার্ট কন্ট্র্যাক্টের সাথে, সাধারণত অনেক টাকা ঝুঁকির মধ্যে থাকে। এটি ব্যবহার করার আগে উচ্চতর নিরাপত্তা গ্যারান্টি এবং একটি স্মার্ট কন্ট্র্যাক্টের যুক্তি যাচাই করার আহ্বান জানায়। সমস্যা হল যে অসাধু ডেভেলপাররা একটি স্মার্ট কন্ট্র্যাক্টে দূষিত কোড প্রবেশ করিয়ে ব্যবহারকারীদের প্রতারিত করতে পারে। যাচাইকরণ ছাড়া, দূষিত স্মার্ট কন্ট্র্যাক্টগুলিতে [ব্যাকডোর](https://www.trustnodes.com/2018/11/10/concerns-rise-over-backdoored-smart-contracts), বিতর্কিত অ্যাক্সেস কন্ট্রোল মেকানিজম, শোষণযোগ্য দুর্বলতা এবং অন্যান্য জিনিস থাকতে পারে যা ব্যবহারকারীর নিরাপত্তাকে বিপন্ন করে এবং যা অলক্ষিত থেকে যাবে। + +একটি স্মার্ট কন্ট্র্যাক্টের সোর্স কোড ফাইল প্রকাশ করা আগ্রহী পক্ষগুলির জন্য, যেমন অডিটরদের, সম্ভাব্য অ্যাটাক ভেক্টরের জন্য কন্ট্র্যাক্টটি মূল্যায়ন করা সহজ করে তোলে। একাধিক পক্ষ স্বাধীনভাবে একটি স্মার্ট কন্ট্র্যাক্ট যাচাই করার ফলে, ব্যবহারকারীরা এর নিরাপত্তার শক্তিশালী গ্যারান্টি পায়। + +## ইথেরিয়াম স্মার্ট কন্ট্র্যাক্টের জন্য সোর্স কোড কীভাবে যাচাই করবেন {#source-code-verification-for-ethereum-smart-contracts} + +[Ethereum-এ একটি স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করার জন্য](/developers/docs/smart-contracts/deploying/) একটি ডেটা পেলোড (কম্পাইল করা বাইটকোড) সহ একটি বিশেষ অ্যাড্রেসে একটি ট্রানজ্যাকশন পাঠাতে হয়। ডেটা পেলোডটি সোর্স কোড কম্পাইল করে তৈরি করা হয়, এর সাথে ট্রানজ্যাকশনের ডেটা পেলোডে কন্ট্র্যাক্ট ইনস্ট্যান্সের [কনস্ট্রাক্টর আর্গুমেন্টস](https://docs.soliditylang.org/en/v0.8.14/contracts.html#constructor) যুক্ত করা হয়। কম্পাইলেশন ডিটারমিনিস্টিক, যার অর্থ এটি সর্বদা একই আউটপুট (অর্থাৎ, কন্ট্র্যাক্ট বাইটকোড) তৈরি করে যদি একই সোর্স ফাইল এবং কম্পাইলেশন সেটিংস (যেমন, কম্পাইলার সংস্করণ, অপটিমাইজার) ব্যবহার করা হয়। + +![একটি ডায়াগ্রাম যা স্মার্ট কন্ট্র্যাক্ট সোর্স কোড যাচাইকরণ দেখাচ্ছে](./source-code-verification.png) + +একটি স্মার্ট কন্ট্র্যাক্ট যাচাই করার ক্ষেত্রে মূলত নিম্নলিখিত পদক্ষেপগুলি জড়িত: + +1. একটি কম্পাইলারে সোর্স ফাইল এবং কম্পাইলেশন সেটিংস ইনপুট করুন। + +2. কম্পাইলার কন্ট্র্যাক্টের বাইটকোড আউটপুট করে + +3. একটি নির্দিষ্ট অ্যাড্রেসে ডিপ্লয় করা কন্ট্র্যাক্টের বাইটকোড পান + +4. ডিপ্লয় করা বাইটকোডের সাথে পুনরায় কম্পাইল করা বাইটকোডের তুলনা করুন। যদি কোডগুলি মিলে যায়, তাহলে কন্ট্র্যাক্টটি প্রদত্ত সোর্স কোড এবং কম্পাইলেশন সেটিংস দিয়ে যাচাই করা হয়। + +5. অতিরিক্তভাবে, যদি বাইটকোডের শেষে থাকা মেটাডেটা হ্যাসগুলি মিলে যায়, তবে এটি একটি সম্পূর্ণ মিল হবে। + +মনে রাখবেন যে এটি যাচাইকরণের একটি সরল বর্ণনা এবং অনেক ব্যতিক্রম রয়েছে যা এর সাথে কাজ করবে না, যেমন [অপরিবর্তনীয় ভেরিয়েবল](https://docs.sourcify.dev/docs/immutables/) থাকা। + +## সোর্স কোড যাচাইকরণ টুল {#source-code-verification-tools} + +কন্ট্র্যাক্ট যাচাই করার প্রথাগত প্রক্রিয়াটি জটিল হতে পারে। এই কারণেই আমাদের কাছে Ethereum-এ ডিপ্লয় করা স্মার্ট কন্ট্র্যাক্টের জন্য সোর্স কোড যাচাই করার টুল রয়েছে। এই টুলগুলি সোর্স কোড যাচাইকরণের বড় অংশ স্বয়ংক্রিয় করে এবং ব্যবহারকারীদের সুবিধার জন্য যাচাইকৃত কন্ট্র্যাক্টগুলি কিউরেটও করে। + +### Etherscan {#etherscan} + +যদিও বেশিরভাগ ক্ষেত্রে একটি [Ethereum ব্লকচেইন এক্সপ্লোরার](/developers/docs/data-and-analytics/block-explorers/) হিসাবে পরিচিত, Etherscan স্মার্ট কন্ট্র্যাক্ট ডেভেলপার এবং ব্যবহারকারীদের জন্য একটি [সোর্স কোড যাচাইকরণ পরিষেবা](https://etherscan.io/verifyContract)ও অফার করে। + +Etherscan আপনাকে মূল ডেটা পেলোড (সোর্স কোড, লাইব্রেরি অ্যাড্রেস, কম্পাইলার সেটিংস, কন্ট্র্যাক্ট অ্যাড্রেস, ইত্যাদি) থেকে কন্ট্র্যাক্ট বাইটকোড পুনরায় কম্পাইল করার অনুমতি দেয়। যদি পুনরায় কম্পাইল করা বাইটকোড অনচেইন কন্ট্র্যাক্টের বাইটকোডের (এবং কনস্ট্রাক্টর প্যারামিটারের) সাথে যুক্ত হয়, তবে [কন্ট্র্যাক্টটি যাচাই করা হয়](https://info.etherscan.com/types-of-contract-verification/)। + +একবার যাচাই করা হয়ে গেলে, আপনার কন্ট্র্যাক্টের সোর্স কোড একটি "যাচাইকৃত" লেবেল পায় এবং অন্যদের অডিট করার জন্য Etherscan-এ প্রকাশিত হয়। এটি [যাচাইকৃত কন্ট্র্যাক্ট](https://etherscan.io/contractsVerified/) বিভাগেও যুক্ত হয়—যা যাচাইকৃত সোর্স কোড সহ স্মার্ট কন্ট্র্যাক্টের একটি রিপোজিটরি। + +Etherscan কন্ট্র্যাক্ট যাচাই করার জন্য সবচেয়ে বেশি ব্যবহৃত টুল। তবে, Etherscan-এর কন্ট্র্যাক্ট যাচাইকরণের একটি অসুবিধা রয়েছে: এটি অনচেইন বাইটকোড এবং পুনরায় কম্পাইল করা বাইটকোডের **মেটাডেটা হ্যাস** তুলনা করতে ব্যর্থ হয়। তাই Etherscan-এ মিলগুলি আংশিক মিল। + +[Etherscan-এ কন্ট্র্যাক্ট যাচাই করার বিষয়ে আরও জানুন](https://medium.com/etherscan-blog/verifying-contracts-on-etherscan-f995ab772327)। + +### Blockscout {#blockscout} + +[Blockscout](https://blockscout.com/) একটি ওপেন-সোর্স ব্লকচেইন এক্সপ্লোরার যা স্মার্ট কন্ট্র্যাক্ট ডেভেলপার এবং ব্যবহারকারীদের জন্য একটি [কন্ট্র্যাক্ট যাচাইকরণ পরিষেবা](https://eth.blockscout.com/contract-verification)ও প্রদান করে। একটি ওপেন-সোর্স বিকল্প হিসাবে, Blockscout যাচাইকরণ কীভাবে সঞ্চালিত হয় তাতে স্বচ্ছতা অফার করে এবং যাচাইকরণ প্রক্রিয়া উন্নত করতে কমিউনিটির অবদানকে সক্ষম করে। + +অন্যান্য যাচাইকরণ পরিষেবার মতো, Blockscout আপনাকে বাইটকোড পুনরায় কম্পাইল করে এবং ডিপ্লয় করা কন্ট্র্যাক্টের সাথে তুলনা করে আপনার কন্ট্র্যাক্টের সোর্স কোড যাচাই করার অনুমতি দেয়। একবার যাচাই করা হয়ে গেলে, আপনার কন্ট্র্যাক্ট যাচাইকরণ স্ট্যাটাস পায় এবং সোর্স কোডটি অডিটিং এবং ইন্টারঅ্যাকশনের জন্য সর্বজনীনভাবে উপলব্ধ হয়। সহজ ব্রাউজিং এবং আবিষ্কারের জন্য যাচাইকৃত কন্ট্র্যাক্টগুলিও Blockscout-এর [যাচাইকৃত কন্ট্র্যাক্ট রিপোজিটরিতে](https://eth.blockscout.com/verified-contracts) তালিকাভুক্ত করা হয়। + +### Sourcify {#sourcify} + +[Sourcify](https://sourcify.dev/#/verifier) হল কন্ট্র্যাক্ট যাচাই করার জন্য আরেকটি টুল যা ওপেন-সোর্স এবং ডিসেন্ট্রালাইজড। এটি একটি ব্লক এক্সপ্লোরার নয় এবং শুধুমাত্র [বিভিন্ন EVM ভিত্তিক নেটওয়ার্কে](https://docs.sourcify.dev/docs/chains) কন্ট্র্যাক্ট যাচাই করে। এটি অন্যান্য টুলের জন্য একটি পাবলিক পরিকাঠামো হিসাবে কাজ করে যার উপর তারা নির্মাণ করতে পারে, এবং মেটাডেটা ফাইলে পাওয়া [ABI](/developers/docs/smart-contracts/compiling/#web-applications) এবং [NatSpec](https://docs.soliditylang.org/en/v0.8.15/natspec-format.html) মন্তব্য ব্যবহার করে আরও বেশি মানব-বান্ধব কন্ট্র্যাক্ট ইন্টারঅ্যাকশন সক্ষম করার লক্ষ্য রাখে। + +Etherscan-এর মতো নয়, Sourcify মেটাডেটা হ্যাসের সাথে সম্পূর্ণ মিল সমর্থন করে। যাচাইকৃত কন্ট্র্যাক্টগুলি তার [পাবলিক রিপোজিটরিতে](https://docs.sourcify.dev/docs/repository/) HTTP এবং [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/#what-is-ipfs)-এ পরিবেশন করা হয়, যা একটি ডিসেন্ট্রালাইজড, [কন্টেন্ট-অ্যাড্রেসড](https://docs.storacha.network/concepts/content-addressing/) স্টোরেজ। এটি IPFS-এর মাধ্যমে একটি কন্ট্র্যাক্টের মেটাডেটা ফাইল আনয়ন করার অনুমতি দেয় কারণ সংযুক্ত মেটাডেটা হ্যাসটি একটি IPFS হ্যাস। + +অতিরিক্তভাবে, কেউ IPFS-এর মাধ্যমে সোর্স কোড ফাইলগুলিও পুনরুদ্ধার করতে পারে, কারণ এই ফাইলগুলির IPFS হ্যাসগুলিও মেটাডেটাতে পাওয়া যায়। একটি কন্ট্র্যাক্ট তার API বা [UI](https://sourcify.dev/#/verifier)-এর মাধ্যমে মেটাডেটা ফাইল এবং সোর্স ফাইল সরবরাহ করে, অথবা প্লাগইন ব্যবহার করে যাচাই করা যেতে পারে। Sourcify মনিটরিং টুল নতুন ব্লকে কন্ট্র্যাক্ট তৈরি হওয়ার বিষয় শোনে এবং যদি তাদের মেটাডেটা এবং সোর্স ফাইলগুলি IPFS-এ প্রকাশিত হয় তবে কন্ট্র্যাক্টগুলি যাচাই করার চেষ্টা করে। + +[Sourcify-তে কন্ট্র্যাক্ট যাচাই করার বিষয়ে আরও জানুন](https://soliditylang.org/blog/2020/06/25/sourcify-faq/)। + +### Tenderly {#tenderly} + +[Tenderly প্ল্যাটফর্ম](https://tenderly.co/) Web3 ডেভেলপারদের স্মার্ট কন্ট্র্যাক্ট তৈরি, পরীক্ষা, নিরীক্ষণ এবং পরিচালনা করতে সক্ষম করে। অবজারভেবিলিটি এবং ইনফ্রাস্ট্রাকচার বিল্ডিং ব্লকের সাথে ডিবাগিং টুল একত্রিত করে, Tenderly ডেভেলপারদের স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্ট ত্বরান্বিত করতে সাহায্য করে। Tenderly ফিচারগুলি সম্পূর্ণরূপে সক্ষম করতে, ডেভেলপারদের বিভিন্ন পদ্ধতি ব্যবহার করে [সোর্স কোড যাচাইকরণ করতে হবে](https://docs.tenderly.co/monitoring/contract-verification)। + +একটি কন্ট্র্যাক্ট ব্যক্তিগতভাবে বা সর্বজনীনভাবে যাচাই করা সম্ভব। যদি ব্যক্তিগতভাবে যাচাই করা হয়, স্মার্ট কন্ট্র্যাক্টটি শুধুমাত্র আপনার (এবং আপনার প্রকল্পের অন্যান্য সদস্যদের) কাছে দৃশ্যমান হয়। একটি কন্ট্র্যাক্ট সর্বজনীনভাবে যাচাই করা হলে এটি Tenderly প্ল্যাটফর্ম ব্যবহারকারী প্রত্যেকের কাছে দৃশ্যমান হয়। + +আপনি [ড্যাশবোর্ড](https://docs.tenderly.co/contract-verification), [Tenderly Hardhat প্লাগইন](https://docs.tenderly.co/contract-verification/hardhat), অথবা [CLI](https://docs.tenderly.co/monitoring/smart-contract-verification/verifying-contracts-using-cli) ব্যবহার করে আপনার কন্ট্র্যাক্ট যাচাই করতে পারেন। + +ড্যাশবোর্ডের মাধ্যমে কন্ট্র্যাক্ট যাচাই করার সময়, আপনাকে Solidity কম্পাইলার দ্বারা তৈরি করা সোর্স ফাইল বা মেটাডেটা ফাইল, অ্যাড্রেস/নেটওয়ার্ক এবং কম্পাইলার সেটিংস আমদানি করতে হবে। + +Tenderly Hardhat প্লাগইন ব্যবহার করলে কম পরিশ্রমে যাচাইকরণ প্রক্রিয়ার উপর আরও বেশি নিয়ন্ত্রণ পাওয়া যায়, যা আপনাকে স্বয়ংক্রিয় (নো-কোড) এবং ম্যানুয়াল (কোড-ভিত্তিক) যাচাইকরণের মধ্যে বেছে নিতে সক্ষম করে। + +## আরও পড়ুন {#further-reading} + +- [কন্ট্র্যাক্ট সোর্স কোড যাচাই করা](https://programtheblockchain.com/posts/2018/01/16/verifying-contract-source-code/) diff --git a/public/content/translations/bn/developers/docs/standards/index.md b/public/content/translations/bn/developers/docs/standards/index.md new file mode 100644 index 00000000000..59ea47cfc5a --- /dev/null +++ b/public/content/translations/bn/developers/docs/standards/index.md @@ -0,0 +1,59 @@ +--- +title: "ইথেরিয়াম ডেভেলপমেন্ট স্ট্যান্ডার্ড" +description: "EIP, ERC-20 এবং ERC-721-এর মতো টোকেন স্ট্যান্ডার্ড এবং ডেভেলপমেন্ট কনভেনশন সহ ইথেরিয়াম স্ট্যান্ডার্ড সম্পর্কে জানুন।" +lang: bn +incomplete: true +--- + +## স্ট্যান্ডার্ডের ওভারভিউ {#standards-overview} + +ইথেরিয়াম কমিউনিটি অনেক স্ট্যান্ডার্ড গ্রহণ করেছে যা বিভিন্ন ইমপ্লিমেন্টেশন জুড়ে প্রোজেক্টগুলিকে (যেমন [ইথেরিয়াম ক্লায়েন্ট](/developers/docs/nodes-and-clients/) এবং ওয়ালেটগুলি) ইন্টারঅপারেবল রাখতে সাহায্য করে এবং স্মার্ট কন্ট্র্যাক্ট ও ডিএ্যাপসগুলি যাতে কম্পোজেবল থাকে তা নিশ্চিত করে। + +সাধারণত স্ট্যান্ডার্ডগুলি [ইথেরিয়াম উন্নয়নের প্রস্তাব](/eips/) (EIPs) হিসাবে প্রবর্তিত হয়, যা কমিউনিটির সদস্যরা একটি [স্ট্যান্ডার্ড প্রক্রিয়ার](https://eips.ethereum.org/EIPS/eip-1) মাধ্যমে আলোচনা করেন। + +- [EIP-এর ভূমিকা](/eips/) +- [EIP-গুলির তালিকা](https://eips.ethereum.org/) +- [EIP GitHub রেপো](https://github.com/ethereum/EIPs) +- [EIP ডিসকাশন বোর্ড](https://ethereum-magicians.org/c/eips) +- [ইথেরিয়াম গভর্নেন্সের ভূমিকা](/governance/) +- [ইথেরিয়াম গভর্নেন্স ওভারভিউ](https://web.archive.org/web/20201107234050/https://blog.bmannconsulting.com/ethereum-governance/) _মার্চ 31, 2019 - Boris Mann_ +- [ইথেরিয়াম প্রোটোকল ডেভেলপমেন্ট গভর্নেন্স এবং নেটওয়ার্ক আপগ্রেড কোঅর্ডিনেশন](https://hudsonjameson.com/posts/2020-03-23-ethereum-protocol-development-governance-and-network-upgrade-coordination/) _মার্চ 23, 2020 - Hudson Jameson_ +- [সমস্ত ইথেরিয়াম কোর ডেভ মিটিংয়ের প্লেলিস্ট](https://www.youtube.com/@EthereumProtocol) _(YouTube প্লেলিস্ট)_ + +## স্ট্যান্ডার্ডের প্রকারভেদ {#types-of-standards} + +3 ধরনের EIP আছে: + +- স্ট্যান্ডার্ড ট্র্যাক: এমন যেকোনো পরিবর্তন বর্ণনা করে যা বেশিরভাগ বা সমস্ত ইথেরিয়াম ইমপ্লিমেন্টেশনকে প্রভাবিত করে +- [মেটা ট্র্যাক](https://eips.ethereum.org/meta): ইথেরিয়ামের চারপাশের একটি প্রক্রিয়া বর্ণনা করে বা একটি প্রক্রিয়ায় পরিবর্তনের প্রস্তাব দেয় +- [ইনফরমেশনাল ট্র্যাক](https://eips.ethereum.org/informational): একটি ইথেরিয়াম ডিজাইন সমস্যা বর্ণনা করে বা ইথেরিয়াম কমিউনিটিকে সাধারণ নির্দেশিকা বা তথ্য প্রদান করে + +উপরন্তু, স্ট্যান্ডার্ড ট্র্যাকটি 4টি বিভাগে বিভক্ত: + +- [কোর](https://eips.ethereum.org/core): এমন উন্নতি যার জন্য কনসেন্সাস ফর্ক প্রয়োজন +- [নেটওয়ার্কিং](https://eips.ethereum.org/networking): devp2p এবং লাইট ইথেরিয়াম সাবপ্রোটোকলের উন্নতি, সেইসাথে whisper এবং swarm-এর নেটওয়ার্ক প্রোটোকল স্পেসিফিকেশনের প্রস্তাবিত উন্নতি। +- [ইন্টারফেস](https://eips.ethereum.org/interface): ক্লায়েন্ট API/RPC স্পেসিফিকেশন এবং স্ট্যান্ডার্ডগুলির উন্নতি, এবং মেথডের নাম এবং কন্ট্র্যাক্ট ABI-এর মতো নির্দিষ্ট ল্যাঙ্গুয়েজ-লেভেল স্ট্যান্ডার্ড। +- [ERC](https://eips.ethereum.org/erc): অ্যাপ্লিকেশন-লেভেল স্ট্যান্ডার্ড এবং কনভেনশন + +এই বিভিন্ন প্রকার এবং বিভাগগুলির বিষয়ে আরও বিস্তারিত তথ্য [EIP-1](https://eips.ethereum.org/EIPS/eip-1#eip-types)-এ পাওয়া যাবে + +### টোকেন স্ট্যান্ডার্ড {#token-standards} + +- [ERC-20](/developers/docs/standards/tokens/erc-20/) - ফাঞ্জিবল (বিনিময়যোগ্য) টোকেনের জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস, যেমন ভোটিং টোকেন, স্টেকিং টোকেন বা ভার্চুয়াল কারেন্সি। + - [ERC-223](/developers/docs/standards/tokens/erc-223/) - একটি ফাঞ্জিবল টোকেন স্ট্যান্ডার্ড যা টোকেনগুলিকে ইথারের মতো আচরণ করতে সাহায্য করে এবং প্রাপকের দিকে টোকেন ট্রান্সফার হ্যান্ডলিং সমর্থন করে। + - [ERC-1363](/developers/docs/standards/tokens/erc-1363/) - ERC-20 টোকেনের জন্য একটি এক্সটেনশন ইন্টারফেস যা একটি একক ট্রানজ্যাকশনে প্রাপক কন্ট্র্যাক্টে কলব্যাক এক্সিকিউট করা সমর্থন করে। +- [ERC-721](/developers/docs/standards/tokens/erc-721/) - নন-ফাঞ্জিবল টোকেনের জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস, যেমন কোনো শিল্পকর্ম বা গানের দলিল। + - [ERC-2309](https://eips.ethereum.org/EIPS/eip-2309) - ধারাবাহিক টোকেন শনাক্তকারী ব্যবহার করে এক বা একাধিক নন-ফাঞ্জিবল টোকেন তৈরি/ট্রান্সফার করার সময় একটি স্ট্যান্ডার্ডাইজড ইভেন্ট নির্গত হয়। + - [ERC-4400](https://eips.ethereum.org/EIPS/eip-4400) - EIP-721 কনজিউমার রোলের জন্য ইন্টারফেস এক্সটেনশন। + - [ERC-4907](https://eips.ethereum.org/EIPS/eip-4907) - ERC-721 টোকেনে সীমাবদ্ধ অনুমতিসহ একটি সময়-সীমিত রোল যোগ করুন। +- [ERC-777](/developers/docs/standards/tokens/erc-777/) - **(সুপারিশ করা হয় না)** একটি টোকেন স্ট্যান্ডার্ড যা ERC-20-এর চেয়ে উন্নত। +- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - একটি টোকেন স্ট্যান্ডার্ড যাতে ফাঞ্জিবল এবং নন-ফাঞ্জিবল উভয় অ্যাসেট থাকতে পারে। +- [ERC-4626](/developers/docs/standards/tokens/erc-4626/) - একটি টোকেনাইজড ভল্ট স্ট্যান্ডার্ড যা ইল্ড-বিয়ারিং ভল্টের প্রযুক্তিগত প্যারামিটারগুলিকে অপটিমাইজ এবং ইউনিফাই করার জন্য ডিজাইন করা হয়েছে। + +[টোকেন স্ট্যান্ডার্ড](/developers/docs/standards/tokens/) সম্পর্কে আরও জানুন। + +## আরও পড়ুন {#further-reading} + +- [ইথেরিয়াম উন্নয়নের প্রস্তাব (EIPs)](/eips/) + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ diff --git a/public/content/translations/bn/developers/docs/standards/tokens/erc-1155/index.md b/public/content/translations/bn/developers/docs/standards/tokens/erc-1155/index.md new file mode 100644 index 00000000000..db02b8c9ea2 --- /dev/null +++ b/public/content/translations/bn/developers/docs/standards/tokens/erc-1155/index.md @@ -0,0 +1,146 @@ +--- +title: "ERC-1155 মাল্টি-টোকেন স্ট্যান্ডার্ড" +description: "ERC-1155 সম্পর্কে জানুন, একটি মাল্টি-টোকেন স্ট্যান্ডার্ড যা একটি একক কন্ট্র্যাক্টে ফাঞ্জিবল এবং নন-ফাঞ্জিবল টোকেনকে একত্রিত করে।" +lang: bn +--- + +## ভূমিকা {#introduction} + +একাধিক টোকেন প্রকার পরিচালনাকারী কন্ট্র্যাক্টগুলির জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস। একটি একক ডেপ্লয়েড কন্ট্র্যাক্টে ফাঞ্জিবল টোকেন, নন-ফাঞ্জিবল টোকেন বা অন্যান্য কনফিগারেশনের (যেমন, সেমি-ফাঞ্জিবল টোকেন) যেকোনো সংমিশ্রণ অন্তর্ভুক্ত থাকতে পারে। + +**মাল্টি-টোকেন স্ট্যান্ডার্ড বলতে কী বোঝায়?** + +এর ধারণাটি সহজ এবং এটি এমন একটি স্মার্ট কন্ট্র্যাক্ট ইন্টারফেস তৈরি করতে চায় যা যেকোনো সংখ্যক ফাঞ্জিবল এবং নন-ফাঞ্জিবল টোকেন প্রকারকে উপস্থাপন এবং নিয়ন্ত্রণ করতে পারে। এইভাবে, ERC-1155 টোকেন একটি [ERC-20](/developers/docs/standards/tokens/erc-20/) এবং [ERC-721](/developers/docs/standards/tokens/erc-721/) টোকেনের মতো একই কাজ করতে পারে, এবং এমনকি একই সময়ে উভয়ই করতে পারে। এটি ERC-20 এবং ERC-721 উভয় স্ট্যান্ডার্ডের কার্যকারিতা উন্নত করে, এটিকে আরও কার্যকর করে তোলে এবং সুস্পষ্ট ইমপ্লিমেন্টেশন ত্রুটি সংশোধন করে। + +ERC-1155 টোকেনটি [EIP-1155](https://eips.ethereum.org/EIPS/eip-1155)-এ সম্পূর্ণরূপে বর্ণনা করা হয়েছে। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে [টোকেন স্ট্যান্ডার্ড](/developers/docs/standards/tokens/), [ERC-20](/developers/docs/standards/tokens/erc-20/) এবং [ERC-721](/developers/docs/standards/tokens/erc-721/) সম্পর্কে পড়ার পরামর্শ দিই। + +## ERC-1155 ফাংশন এবং বৈশিষ্ট্য: {#body} + +- [ব্যাচ ট্রান্সফার](#batch_transfers): একটি কলে একাধিক অ্যাসেট ট্রান্সফার করুন। +- [ব্যাচ ব্যালেন্স](#batch_balance): একটি কলে একাধিক অ্যাসেটের ব্যালেন্স পান। +- [ব্যাচ অ্যাপ্রুভাল](#batch_approval): একটি অ্যাড্রেসে সমস্ত টোকেন অ্যাপ্রুভ করুন। +- [হুক](#receive_hook): টোকেন হুক গ্রহণ করুন। +- [NFT সাপোর্ট](#nft_support): সাপ্লাই মাত্র 1 হলে, এটিকে NFT হিসাবে গণ্য করুন। +- [নিরাপদ ট্রান্সফার নিয়ম](#safe_transfer_rule): নিরাপদ ট্রান্সফারের জন্য নিয়মের সেট। + +### ব্যাচ ট্রান্সফার {#batch-transfers} + +ব্যাচ ট্রান্সফারটি সাধারণ ERC-20 ট্রান্সফারের মতোই কাজ করে। আসুন সাধারণ ERC-20 `transferFrom` ফাংশনটি দেখি: + +```solidity +// ERC-20 +function transferFrom(address from, address to, uint256 value) external returns (bool); + +// ERC-1155 +function safeBatchTransferFrom( + address _from, + address _to, + uint256[] calldata _ids, + uint256[] calldata _values, + bytes calldata _data +) external; +``` + +ERC-1155-এর একমাত্র পার্থক্য হলো আমরা মানগুলিকে একটি অ্যারে হিসাবে এবং আইডিগুলির একটি অ্যারেও পাস করি। উদাহরণস্বরূপ, `ids=[3, 6, 13]` এবং `values=[100, 200, 5]` দেওয়া থাকলে, ফলাফলস্বরূপ ট্রান্সফারগুলি হবে + +1. `_from` থেকে `_to`-তে id 3 সহ 100টি টোকেন ট্রান্সফার করুন। +2. `_from` থেকে `_to`-তে id 6 সহ 200টি টোকেন ট্রান্সফার করুন। +3. `_from` থেকে `_to`-তে id 13 সহ 5টি টোকেন ট্রান্সফার করুন। + +ERC-1155-এ আমাদের কেবল `transferFrom` আছে, `transfer` নেই। এটিকে একটি সাধারণ `transfer`-এর মতো ব্যবহার করতে, শুধুমাত্র from অ্যাড্রেসটিকে ফাংশন কল করা অ্যাড্রেসে সেট করুন। + +### ব্যাচ ব্যালেন্স {#batch-balance} + +সংশ্লিষ্ট ERC-20 `balanceOf` কলেরও ব্যাচ সাপোর্টসহ তার পার্টনার ফাংশন রয়েছে। মনে করিয়ে দেওয়া যাক, এটি হলো ERC-20 সংস্করণ: + +```solidity +// ERC-20 +function balanceOf(address owner) external view returns (uint256); + +// ERC-1155 +function balanceOfBatch( + address[] calldata _owners, + uint256[] calldata _ids +) external view returns (uint256[] memory); +``` + +ব্যালেন্স কলের জন্য আরও সহজ হলো, আমরা একটি কলে একাধিক ব্যালেন্স পুনরুদ্ধার করতে পারি। আমরা মালিকদের অ্যারে পাস করি, তারপরে টোকেন আইডিগুলির অ্যারে। + +উদাহরণস্বরূপ `_ids=[3, 6, 13]` এবং `_owners=[0xbeef..., 0x1337..., 0x1111...]` দেওয়া থাকলে, রিটার্ন ভ্যালু হবে + +```solidity +[ + balanceOf(0xbeef...), + balanceOf(0x1337...), + balanceOf(0x1111...) +] +``` + +### ব্যাচ অ্যাপ্রুভাল {#batch-approval} + +```solidity +// ERC-1155 +function setApprovalForAll( + address _operator, + bool _approved +) external; + +function isApprovedForAll( + address _owner, + address _operator +) external view returns (bool); +``` + +অ্যাপ্রুভালগুলি ERC-20 থেকে কিছুটা আলাদা। নির্দিষ্ট পরিমাণ অ্যাপ্রুভ করার পরিবর্তে, আপনি `setApprovalForAll`-এর মাধ্যমে একজন অপারেটরকে অ্যাপ্রুভড বা নট অ্যাপ্রুভড হিসাবে সেট করেন। + +`isApprovedForAll`-এর মাধ্যমে বর্তমান স্ট্যাটাস পড়া যেতে পারে। আপনি যেমন দেখতে পাচ্ছেন, এটি একটি অল-অর-নাথিং অপারেশন। আপনি কতগুলি টোকেন অ্যাপ্রুভ করবেন বা এমনকি কোন টোকেন ক্লাস তাও নির্ধারণ করতে পারবেন না। + +এটি ইচ্ছাকৃতভাবে সরলতাকে মাথায় রেখে ডিজাইন করা হয়েছে। আপনি শুধুমাত্র একটি অ্যাড্রেসের জন্য সবকিছু অ্যাপ্রুভ করতে পারেন। + +### রিসিভ হুক {#receive-hook} + +```solidity +function onERC1155BatchReceived( + address _operator, + address _from, + uint256[] calldata _ids, + uint256[] calldata _values, + bytes calldata _data +) external returns(bytes4); +``` + +[EIP-165](https://eips.ethereum.org/EIPS/eip-165) সাপোর্ট দেওয়া থাকায়, ERC-1155 শুধুমাত্র স্মার্ট কন্ট্র্যাক্টের জন্য রিসিভ হুক সাপোর্ট করে। হুক ফাংশনটিকে অবশ্যই একটি ম্যাজিক পূর্বনির্ধারিত bytes4 ভ্যালু রিটার্ন করতে হবে যা এইরকম: + +```solidity +bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) +``` + +যখন রিসিভিং কন্ট্র্যাক্ট এই মানটি রিটার্ন করে, তখন ধরে নেওয়া হয় যে কন্ট্র্যাক্টটি ট্রান্সফার গ্রহণ করে এবং ERC-1155 টোকেনগুলি কীভাবে হ্যান্ডেল করতে হয় তা জানে। দারুণ, কোনো কন্ট্র্যাক্টে আর টোকেন আটকে থাকবে না! + +### NFT সাপোর্ট {#nft-support} + +যখন সাপ্লাই মাত্র একটি হয়, তখন টোকেনটি মূলত একটি নন-ফাঞ্জিবল টোকেন (NFT)। এবং ERC-721-এর জন্য স্ট্যান্ডার্ড হিসাবে, আপনি একটি মেটাডেটা URL সংজ্ঞায়িত করতে পারেন। URL-টি ক্লায়েন্টদের দ্বারা পড়া এবং পরিবর্তন করা যেতে পারে, [এখানে](https://eips.ethereum.org/EIPS/eip-1155#metadata) দেখুন। + +### নিরাপদ ট্রান্সফার নিয়ম {#safe-transfer-rule} + +আমরা আগের ব্যাখ্যাগুলিতে ইতিমধ্যে কয়েকটি নিরাপদ ট্রান্সফার নিয়ম আলোচনা করেছি। তবে আসুন সবচেয়ে গুরুত্বপূর্ণ নিয়মগুলি দেখি: + +1. কলারকে `_from` অ্যাড্রেসের জন্য টোকেন খরচ করার জন্য অ্যাপ্রুভড হতে হবে অথবা কলারকে `_from`-এর সমান হতে হবে। +2. ট্রান্সফার কলটি অবশ্যই রিভার্ট হবে যদি + 1. `_to` অ্যাড্রেস 0 হয়। + 2. `_ids`-এর দৈর্ঘ্য `_values`-এর দৈর্ঘ্যের সমান না হয়। + 3. `_ids`-এর মধ্যে থাকা টোকেন(গুলি)-র জন্য হোল্ডার(দের)-র ব্যালেন্স(গুলি)-র মধ্যে কোনোটি প্রাপকের কাছে পাঠানো `_values`-এর সংশ্লিষ্ট পরিমাণ(গুলি)-র থেকে কম হয়। + 4. অন্য কোনো ত্রুটি ঘটে। + +_দ্রষ্টব্য_: হুকসহ সমস্ত ব্যাচ ফাংশন ব্যাচ ছাড়া সংস্করণ হিসাবেও বিদ্যমান। এটি গ্যাস দক্ষতার জন্য করা হয়েছে, কারণ শুধুমাত্র একটি অ্যাসেট ট্রান্সফার করাই সম্ভবত সবচেয়ে বেশি ব্যবহৃত উপায় হিসেবে থাকবে। নিরাপদ ট্রান্সফার নিয়মসহ ব্যাখ্যার সরলতার জন্য আমরা সেগুলোকে বাদ দিয়েছি। নামগুলি অভিন্ন, শুধু 'ব্যাচ' সরিয়ে দিন। + +## আরও পড়ুন {#further-reading} + +- [EIP-1155: মাল্টি টোকেন স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-1155) +- [ERC-1155: Openzeppelin ডক্স](https://docs.openzeppelin.com/contracts/5.x/erc1155) +- [ERC-1155: GitHub রেপো](https://github.com/enjin/erc-1155) +- [Alchemy NFT API](https://www.alchemy.com/docs/reference/nft-api-quickstart) diff --git a/public/content/translations/bn/developers/docs/standards/tokens/erc-1363/index.md b/public/content/translations/bn/developers/docs/standards/tokens/erc-1363/index.md new file mode 100644 index 00000000000..f1261784826 --- /dev/null +++ b/public/content/translations/bn/developers/docs/standards/tokens/erc-1363/index.md @@ -0,0 +1,204 @@ +--- +title: "ERC-1363 প্রদেয় টোকেন স্ট্যান্ডার্ড" +description: "ERC-1363 হল ERC-20 টোকেনগুলির জন্য একটি এক্সটেনশন ইন্টারফেস যা একটি একক লেনদেনের মধ্যে ট্রান্সফারের পরে প্রাপক কন্ট্র্যাক্টে বা অনুমোদনের পরে স্পেন্ডার কন্ট্র্যাক্টে কাস্টম লজিক এক্সিকিউট করা সমর্থন করে।" +lang: bn +--- + +## ভূমিকা {#introduction} + +### ERC-1363 কি? {#what-is-erc1363} + +ERC-1363 হল ERC-20 টোকেনগুলির জন্য একটি এক্সটেনশন ইন্টারফেস যা একটি একক লেনদেনের মধ্যে ট্রান্সফারের পরে প্রাপক কন্ট্র্যাক্টে বা অনুমোদনের পরে স্পেন্ডার কন্ট্র্যাক্টে কাস্টম লজিক এক্সিকিউট করা সমর্থন করে। + +### ERC-20 থেকে পার্থক্য {#erc20-differences} + +`transfer`, `transferFrom` এবং `approve`-এর মতো স্ট্যান্ডার্ড ERC-20 অপারেশনগুলি একটি পৃথক লেনদেন ছাড়া প্রাপক বা স্পেন্ডার কন্ট্র্যাক্টে কোড এক্সিকিউশনের অনুমতি দেয় না। +এটি UI ডেভেলপমেন্টে জটিলতা নিয়ে আসে এবং গ্রহণে ঘর্ষণ সৃষ্টি করে কারণ ব্যবহারকারীদের প্রথম লেনদেনটি এক্সিকিউট হওয়ার জন্য অপেক্ষা করতে হয় এবং তারপর দ্বিতীয়টি জমা দিতে হয়। +তাদেরকে দুবার GAS প্রদান করতে হয়। + +ERC-1363 ফাঞ্জিবল টোকেনকে আরও সহজে কাজ সম্পাদন করতে এবং কোনো অফ-চেইন লিসেনার ব্যবহার না করেই কাজ করতে সক্ষম করে তোলে। +এটি একটি একক লেনদেনে, একটি ট্রান্সফার বা অনুমোদনের পরে, একটি রিসিভার বা স্পেন্ডার কন্ট্র্যাক্টে একটি কলব্যাক করার অনুমতি দেয়। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালোভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে নিম্নলিখিত বিষয়গুলি সম্পর্কে পড়ার পরামর্শ দিই: + +- [টোকেন স্ট্যান্ডার্ড](/developers/docs/standards/tokens/) +- [ERC-20](/developers/docs/standards/tokens/erc-20/) + +## বডি {#body} + +ERC-1363 `transfer`, `transferFrom` বা `approve`-এর পরে স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার জন্য ERC-20 টোকেনগুলির জন্য একটি স্ট্যান্ডার্ড API চালু করে। + +এই স্ট্যান্ডার্ডটি টোকেন ট্রান্সফার করার জন্য প্রাথমিক কার্যকারিতা প্রদান করে, পাশাপাশি টোকেনগুলিকে অনুমোদিত হতে দেয় যাতে সেগুলি অন্য একটি অন-চেইন থার্ড পার্টি দ্বারা ব্যয় করা যায়, এবং তারপর রিসিভার বা স্পেন্ডার কন্ট্র্যাক্টে একটি কলব্যাক করে। + +স্মার্ট কন্ট্র্যাক্টের অনেক প্রস্তাবিত ব্যবহার রয়েছে যা ERC-20 কলব্যাক গ্রহণ করতে পারে। + +উদাহরণস্বরূপ: + +- **ক্রাউডসেল**: পাঠানো টোকেনগুলি তাৎক্ষণিক পুরস্কার বরাদ্দকে ট্রিগার করে। +- **পরিষেবা**: পেমেন্ট এক ধাপে পরিষেবা অ্যাক্সেস সক্রিয় করে। +- **চালান**: টোকেনগুলি স্বয়ংক্রিয়ভাবে চালান নিষ্পত্তি করে। +- **সাবস্ক্রিপশন**: বার্ষিক হার অনুমোদন করা প্রথম মাসের পেমেন্টের মধ্যে সাবস্ক্রিপশন সক্রিয় করে। + +এই কারণগুলির জন্য এটিকে মূলত **"প্রদেয় টোকেন"** নামকরণ করা হয়েছিল। + +কলব্যাক আচরণটি এর উপযোগিতাকে আরও প্রসারিত করে, যার ফলে নিম্নলিখিতগুলির মতো নির্বিঘ্ন ইন্টারঅ্যাকশন সক্ষম হয়: + +- **স্টেকিং**: ট্রান্সফার করা টোকেন একটি স্টেকিং কন্ট্র্যাক্টে স্বয়ংক্রিয় লকিং ট্রিগার করে। +- **ভোটিং**: প্রাপ্ত টোকেনগুলি একটি গভর্নেন্স সিস্টেমে ভোট রেজিস্টার করে। +- **সোয়াপিং**: টোকেন অনুমোদনগুলি এক ধাপে সোয়াপ লজিক সক্রিয় করে। + +ERC-1363 টোকেনগুলি সেই সমস্ত ক্ষেত্রে নির্দিষ্ট ইউটিলিটির জন্য ব্যবহার করা যেতে পারে যেখানে একটি ট্রান্সফার বা অনুমোদন প্রাপ্তির পরে একটি কলব্যাক এক্সিকিউট করার প্রয়োজন হয়। +ERC-1363 প্রাপকের টোকেন পরিচালনা করার ক্ষমতা যাচাই করে স্মার্ট কন্ট্র্যাক্টে টোকেন হারানো বা টোকেন লক হওয়া এড়াতেও উপযোগী। + +অন্যান্য ERC-20 এক্সটেনশন প্রস্তাবগুলির থেকে ভিন্ন, ERC-1363 ERC-20 `transfer` এবং `transferFrom` মেথডগুলিকে ওভাররাইড করে না এবং ERC-20 এর সাথে ব্যাকওয়ার্ড কম্প্যাটিবিলিটি বজায় রেখে ইমপ্লিমেন্ট করার জন্য ইন্টারফেস আইডিগুলিকে সংজ্ঞায়িত করে। + +[EIP-1363](https://eips.ethereum.org/EIPS/eip-1363) থেকে: + +### মেথড {#methods} + +ERC-1363 স্ট্যান্ডার্ড ইমপ্লিমেন্ট করা স্মার্ট কন্ট্র্যাক্টগুলিকে `ERC1363` ইন্টারফেসের সমস্ত ফাংশন, পাশাপাশি `ERC20` এবং `ERC165` ইন্টারফেসগুলিও **অবশ্যই** ইমপ্লিমেন্ট করতে হবে। + +```solidity +pragma solidity ^0.8.0; + +/** + * @শিরোনাম ERC1363 + * @dev ERC-20 টোকেনের জন্য একটি এক্সটেনশন ইন্টারফেস যা একটি একক লেনদেনে `transfer` বা `transferFrom` এর পরে একটি প্রাপক কন্ট্র্যাক্টে কোড এক্সিকিউট করা, অথবা `approve` এর পরে একটি স্পেন্ডার কন্ট্র্যাক্টে কোড এক্সিকিউট করা সমর্থন করে। + */ +interface ERC1363 is ERC20, ERC165 { + /* + * দ্রষ্টব্য: এই ইন্টারফেসের জন্য ERC-165 শনাক্তকারী হল 0xb0202a11। + * 0xb0202a11 === + * bytes4(keccak256('transferAndCall(address,uint256)')) ^ + * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ + * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ + * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ + * bytes4(keccak256('approveAndCall(address,uint256)')) ^ + * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) + */ + + /** + * @dev কলারের অ্যাকাউন্ট থেকে `to`-তে একটি `value` পরিমাণ টোকেন সরিয়ে নিয়ে যায় এবং তারপর `to`-তে `ERC1363Receiver::onTransferReceived` কল করে। + * @প্যারাম to যে ঠিকানায় টোকেনগুলি ট্রান্সফার করা হচ্ছে। + * @প্যারাম value যে পরিমাণ টোকেন ট্রান্সফার করা হবে। + * @রিটার্ন একটি বুলিয়ান মান যা নির্দেশ করে যে অপারেশনটি সফল হয়েছে, যদি না কোনো থ্রো হয়। + */ + function transferAndCall(address to, uint256 value) external returns (bool); + + /** + * @dev কলারের অ্যাকাউন্ট থেকে `to`-তে একটি `value` পরিমাণ টোকেন সরিয়ে নিয়ে যায় এবং তারপর `to`-তে `ERC1363Receiver::onTransferReceived` কল করে। + * @প্যারাম to যে ঠিকানায় টোকেনগুলি ট্রান্সফার করা হচ্ছে। + * @প্যারাম value যে পরিমাণ টোকেন ট্রান্সফার করা হবে। + * @প্যারাম data কোনো নির্দিষ্ট বিন্যাস ছাড়াই অতিরিক্ত ডেটা, যা `to`-তে কলে পাঠানো হয়। + * @রিটার্ন একটি বুলিয়ান মান যা নির্দেশ করে যে অপারেশনটি সফল হয়েছে, যদি না কোনো থ্রো হয়। + */ + function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); + + /** + * @dev অ্যালাউন্স মেকানিজম ব্যবহার করে `from` থেকে `to`-তে একটি `value` পরিমাণ টোকেন সরিয়ে নিয়ে যায় এবং তারপর `to`-তে `ERC1363Receiver::onTransferReceived` কল করে। + * @প্যারাম from যে ঠিকানা থেকে টোকেন পাঠাতে হবে। + * @প্যারাম to যে ঠিকানায় টোকেনগুলি ট্রান্সফার করা হচ্ছে। + * @প্যারাম value যে পরিমাণ টোকেন ট্রান্সফার করা হবে। + * @রিটার্ন একটি বুলিয়ান মান যা নির্দেশ করে যে অপারেশনটি সফল হয়েছে, যদি না কোনো থ্রো হয়। + */ + function transferFromAndCall(address from, address to, uint256 value) external returns (bool); + + /** + * @dev অ্যালাউন্স মেকানিজম ব্যবহার করে `from` থেকে `to`-তে একটি `value` পরিমাণ টোকেন সরিয়ে নিয়ে যায় এবং তারপর `to`-তে `ERC1363Receiver::onTransferReceived` কল করে। + * @প্যারাম from যে ঠিকানা থেকে টোকেন পাঠাতে হবে। + * @প্যারাম to যে ঠিকানায় টোকেনগুলি ট্রান্সফার করা হচ্ছে। + * @প্যারাম value যে পরিমাণ টোকেন ট্রান্সফার করা হবে। + * @প্যারাম data কোনো নির্দিষ্ট বিন্যাস ছাড়াই অতিরিক্ত ডেটা, যা `to`-তে কলে পাঠানো হয়। + * @রিটার্ন একটি বুলিয়ান মান যা নির্দেশ করে যে অপারেশনটি সফল হয়েছে, যদি না কোনো থ্রো হয়। + */ + function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); + + /** + * @dev কলারের টোকেনের উপর `spender`-এর অ্যালাউন্স হিসাবে একটি `value` পরিমাণ টোকেন সেট করে এবং তারপর `spender`-এর উপর `ERC1363Spender::onApprovalReceived` কল করে। + * @প্যারাম spender যে ঠিকানা তহবিল ব্যয় করবে। + * @প্যারাম value যে পরিমাণ টোকেন ব্যয় করা হবে। + * @রিটার্ন একটি বুলিয়ান মান যা নির্দেশ করে যে অপারেশনটি সফল হয়েছে, যদি না কোনো থ্রো হয়। + */ + function approveAndCall(address spender, uint256 value) external returns (bool); + + /** + * @dev কলারের টোকেনের উপর `spender`-এর অ্যালাউন্স হিসাবে একটি `value` পরিমাণ টোকেন সেট করে এবং তারপর `spender`-এর উপর `ERC1363Spender::onApprovalReceived` কল করে। + * @প্যারাম spender যে ঠিকানা তহবিল ব্যয় করবে। + * @প্যারাম value যে পরিমাণ টোকেন ব্যয় করা হবে। + * @প্যারাম data কোনো নির্দিষ্ট বিন্যাস ছাড়াই অতিরিক্ত ডেটা, যা `spender`-এর কাছে কলে পাঠানো হয়। + * @রিটার্ন একটি বুলিয়ান মান যা নির্দেশ করে যে অপারেশনটি সফল হয়েছে, যদি না কোনো থ্রো হয়। + */ + function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); +} + +interface ERC20 { + event Transfer(address indexed from, address indexed to, uint256 value); + event Approval(address indexed owner, address indexed spender, uint256 value); + function transfer(address to, uint256 value) external returns (bool); + function transferFrom(address from, address to, uint256 value) external returns (bool); + function approve(address spender, uint256 value) external returns (bool); + function totalSupply() external view returns (uint256); + function balanceOf(address account) external view returns (uint256); + function allowance(address owner, address spender) external view returns (uint256); +} + +interface ERC165 { + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} +``` + +যে স্মার্ট কন্ট্র্যাক্ট `transferAndCall` বা `transferFromAndCall` এর মাধ্যমে ERC-1363 টোকেন গ্রহণ করতে চায়, তাকে **অবশ্যই** `ERC1363Receiver` ইন্টারফেসটি ইমপ্লিমেন্ট করতে হবে: + +```solidity +/** + * @শিরোনাম ERC1363Receiver + * @dev ERC-1363 টোকেন কন্ট্র্যাক্ট থেকে `transferAndCall` বা `transferFromAndCall` সমর্থন করতে চায় এমন যেকোনো কন্ট্র্যাক্টের জন্য ইন্টারফেস। + */ +interface ERC1363Receiver { + /** + * @dev যখনই `operator` দ্বারা `from` থেকে `ERC1363::transferAndCall` বা `ERC1363::transferFromAndCall` এর মাধ্যমে এই কন্ট্র্যাক্টে ERC-1363 টোকেনগুলি ট্রান্সফার করা হয়, তখন এই ফাংশনটি কল করা হয়। + * + * দ্রষ্টব্য: ট্রান্সফার গ্রহণ করতে, এটিকে অবশ্যই + * `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` + * (অর্থাৎ 0x88a7ca5c, বা এর নিজস্ব ফাংশন সিলেক্টর) রিটার্ন করতে হবে। + * + * @প্যারাম operator যে ঠিকানাটি `transferAndCall` বা `transferFromAndCall` ফাংশন কল করেছে। + * @প্যারাম from যে ঠিকানা থেকে টোকেন ট্রান্সফার করা হয়েছে। + * @প্যারাম value ট্রান্সফার করা টোকেনের পরিমাণ। + * @প্যারাম data কোনো নির্দিষ্ট বিন্যাস ছাড়াই অতিরিক্ত ডেটা। + * @রিটার্ন `bytes4(keccak256("onTransferReceived(address,address,uint256,bytes)"))` যদি ট্রান্সফার অনুমোদিত হয়, যদি না থ্রোয়িং হয়। + */ + function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4); +} +``` + +যে স্মার্ট কন্ট্র্যাক্ট `approveAndCall` এর মাধ্যমে ERC-1363 টোকেন গ্রহণ করতে চায়, তাকে **অবশ্যই** `ERC1363Spender` ইন্টারফেসটি ইমপ্লিমেন্ট করতে হবে: + +```solidity +/** + * @শিরোনাম ERC1363Spender + * @dev ERC-1363 টোকেন কন্ট্র্যাক্ট থেকে `approveAndCall` সমর্থন করতে চায় এমন যেকোনো কন্ট্র্যাক্টের জন্য ইন্টারফেস। + */ +interface ERC1363Spender { + /** + * @dev যখনই কোনো ERC-1363 টোকেনের `owner` এই কন্ট্র্যাক্টকে `ERC1363::approveAndCall` এর মাধ্যমে তাদের টোকেন ব্যয় করার জন্য অনুমোদন দেয়, তখন এই ফাংশনটি কল করা হয়। + * + * দ্রষ্টব্য: অনুমোদন গ্রহণ করতে, এটিকে অবশ্যই + * `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` + * (অর্থাৎ 0x7b04a2d0, বা এর নিজস্ব ফাংশন সিলেক্টর) রিটার্ন করতে হবে। + * + * @প্যারাম owner যে ঠিকানাটি `approveAndCall` ফাংশন কল করেছে এবং পূর্বে টোকেনের মালিক ছিল। + * @প্যারাম value যে পরিমাণ টোকেন ব্যয় করা হবে। + * @প্যারাম data কোনো নির্দিষ্ট বিন্যাস ছাড়াই অতিরিক্ত ডেটা। + * @রিটার্ন `bytes4(keccak256("onApprovalReceived(address,uint256,bytes)"))` যদি অনুমোদন অনুমোদিত হয়, যদি না থ্রোয়িং হয়। + */ + function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4); +} +``` + +## আরও পড়ুন {#further-reading} + +- [ERC-1363: প্রদেয় টোকেন স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-1363) +- [ERC-1363: GitHub রেপো](https://github.com/vittominacori/erc1363-payable-token) diff --git a/public/content/translations/bn/developers/docs/standards/tokens/erc-20/index.md b/public/content/translations/bn/developers/docs/standards/tokens/erc-20/index.md new file mode 100644 index 00000000000..df000448eb0 --- /dev/null +++ b/public/content/translations/bn/developers/docs/standards/tokens/erc-20/index.md @@ -0,0 +1,192 @@ +--- +title: "ERC-20 টোকেন স্ট্যান্ডার্ড" +description: "ERC-20 সম্পর্কে জানুন, এটি Ethereum-এর ফানজিবল টোকেনগুলির জন্য একটি স্ট্যান্ডার্ড যা ইন্টারঅপারেবল টোকেন অ্যাপ্লিকেশনগুলিকে সক্ষম করে।" +lang: bn +--- + +## ভূমিকা {#introduction} + +**টোকেন কি?** + +Ethereum-এ টোকেনগুলি কার্যত যেকোনো কিছুর প্রতিনিধিত্ব করতে পারে: + +- একটি অনলাইন প্ল্যাটফর্মে খ্যাতি পয়েন্ট +- একটি গেমের কোনো চরিত্রের দক্ষতা +- আর্থিক সম্পদ যেমন একটি কোম্পানির একটি শেয়ার +- USD-এর মতো একটি ফিয়াট মুদ্রা +- এক আউন্স সোনা +- এবং আরও... + +Ethereum-এর এমন একটি শক্তিশালী বৈশিষ্ট্য অবশ্যই একটি শক্তিশালী মান দ্বারা পরিচালিত হতে হবে, তাই না? ঠিক এখানেই +ERC-20 তার ভূমিকা পালন করে! এই স্ট্যান্ডার্ডটি ডেভেলপারদের এমন টোকেন অ্যাপ্লিকেশন তৈরি করতে দেয় যা অন্যান্য পণ্য এবং পরিষেবাগুলির সাথে আন্তঃকার্যক্ষম। ERC-20 স্ট্যান্ডার্ডটি [ইথার](/glossary/#ether)-কে অতিরিক্ত কার্যকারিতা প্রদান করতেও ব্যবহৃত হয়। + +**ERC-20 কি?** + +ERC-20 ফানজিবল টোকেনগুলির জন্য একটি স্ট্যান্ডার্ড চালু করেছে, অন্য কথায়, তাদের একটি বৈশিষ্ট্য রয়েছে যা প্রতিটি টোকেনকে অন্য টোকেনের সাথে হুবহু +একই (ধরন এবং মূল্যে) করে তোলে। উদাহরণস্বরূপ, একটি ERC-20 টোকেন ঠিক ETH-এর মতো কাজ করে, যার অর্থ হল 1 টোকেন +অন্যান্য সমস্ত টোকেনের সমান এবং সর্বদা সমান থাকবে। + +## পূর্বশর্ত {#prerequisites} + +- [অ্যাকাউন্টগুলি](/developers/docs/accounts) +- [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) +- [টোকেন স্ট্যান্ডার্ড](/developers/docs/standards/tokens/) + +## বডি {#body} + +ERC-20 (Ethereum রিক্যুয়েস্ট ফর কমেন্টস 20), যা নভেম্বর 2015-এ ফ্যাবিয়ান ভোগেলস্টেলার দ্বারা প্রস্তাবিত, একটি টোকেন স্ট্যান্ডার্ড যা +স্মার্ট কন্ট্র্যাক্টের মধ্যে টোকেনের জন্য একটি API প্রয়োগ করে। + +ERC-20 যে উদাহরণমূলক কার্যকারিতাগুলি প্রদান করে: + +- এক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে টোকেন স্থানান্তর করা +- একটি অ্যাকাউন্টের বর্তমান টোকেন ব্যালেন্স পান +- নেটওয়ার্কে উপলব্ধ টোকেনের মোট সরবরাহ পান +- একটি অ্যাকাউন্ট থেকে একটি পরিমাণ টোকেন কোনো তৃতীয় পক্ষের অ্যাকাউন্ট দ্বারা ব্যয় করা যাবে কিনা তা অনুমোদন করুন + +যদি একটি স্মার্ট কন্ট্র্যাক্ট নিম্নলিখিত পদ্ধতি এবং ইভেন্টগুলি প্রয়োগ করে তবে এটিকে একটি ERC-20 টোকেন কন্ট্র্যাক্ট বলা যেতে পারে এবং, একবার ডিপ্লয় করা হলে, এটি +Ethereum-এ তৈরি টোকেনগুলির ট্র্যাক রাখার জন্য দায়ী থাকবে। + +[EIP-20](https://eips.ethereum.org/EIPS/eip-20) থেকে: + +### মেথড {#methods} + +```solidity +function name() public view returns (string) +function symbol() public view returns (string) +function decimals() public view returns (uint8) +function totalSupply() public view returns (uint256) +function balanceOf(address _owner) public view returns (uint256 balance) +function transfer(address _to, uint256 _value) public returns (bool success) +function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) +function approve(address _spender, uint256 _value) public returns (bool success) +function allowance(address _owner, address _spender) public view returns (uint256 remaining) +``` + +### ইভেন্ট {#events} + +```solidity +event Transfer(address indexed _from, address indexed _to, uint256 _value) +event Approval(address indexed _owner, address indexed _spender, uint256 _value) +``` + +### উদাহরণ {#web3py-example} + +আসুন দেখি Ethereum-এর যেকোনো ERC-20 টোকেন চুক্তি পরিদর্শন করার জন্য আমাদের কাজকে সহজ করতে একটি স্ট্যান্ডার্ড কতটা গুরুত্বপূর্ণ। +যেকোনো ERC-20 টোকেনের জন্য একটি ইন্টারফেস তৈরি করতে আমাদের শুধু কন্ট্র্যাক্ট অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) প্রয়োজন। যেমন আপনি নিচে +দেখতে পাচ্ছেন, এটিকে একটি ঝামেলাহীন উদাহরণ তৈরি করতে আমরা একটি সরলীকৃত ABI ব্যবহার করব। + +#### Web3.py উদাহরণ {#web3py-example} + +প্রথমে, নিশ্চিত করুন যে আপনি [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation) পাইথন লাইব্রেরিটি ইনস্টল করেছেন: + +``` +pip install web3 +``` + +```python +from web3 import Web3 + + +w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com")) + +dai_token_addr = "0x6B175474E89094C44Da98b954EedeAC495271d0F" # DAI +weth_token_addr = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" # র‍্যাপড ইথার (WETH) + +acc_address = "0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11" # Uniswap V2: DAI 2 + +# এটি একটি ERC-20 টোকেন কন্ট্রাক্টের একটি সরলীকৃত কন্ট্রাক্ট অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI)। +# এটি শুধুমাত্র এই পদ্ধতিগুলিকে প্রকাশ করবে: balanceOf(address), decimals(), symbol() এবং totalSupply() +simplified_abi = [ + { + 'inputs': [{'internalType': 'address', 'name': 'account', 'type': 'address'}], + 'name': 'balanceOf', + 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}], + 'stateMutability': 'view', 'type': 'function', 'constant': True + }, + { + 'inputs': [], + 'name': 'decimals', + 'outputs': [{'internalType': 'uint8', 'name': '', 'type': 'uint8'}], + 'stateMutability': 'view', 'type': 'function', 'constant': True + }, + { + 'inputs': [], + 'name': 'symbol', + 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}], + 'stateMutability': 'view', 'type': 'function', 'constant': True + }, + { + 'inputs': [], + 'name': 'totalSupply', + 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}], + 'stateMutability': 'view', 'type': 'function', 'constant': True + } +] + +dai_contract = w3.eth.contract(address=w3.to_checksum_address(dai_token_addr), abi=simplified_abi) +symbol = dai_contract.functions.symbol().call() +decimals = dai_contract.functions.decimals().call() +totalSupply = dai_contract.functions.totalSupply().call() / 10**decimals +addr_balance = dai_contract.functions.balanceOf(acc_address).call() / 10**decimals + +# DAI +print("===== %s =====" % symbol) +print("মোট সাপ্লাই:", totalSupply) +print("ঠিকানার ব্যালেন্স:", addr_balance) + +weth_contract = w3.eth.contract(address=w3.to_checksum_address(weth_token_addr), abi=simplified_abi) +symbol = weth_contract.functions.symbol().call() +decimals = weth_contract.functions.decimals().call() +totalSupply = weth_contract.functions.totalSupply().call() / 10**decimals +addr_balance = weth_contract.functions.balanceOf(acc_address).call() / 10**decimals + +# WETH +print("===== %s =====" % symbol) +print("মোট সাপ্লাই:", totalSupply) +print("ঠিকানার ব্যালেন্স:", addr_balance) +``` + +## জ্ঞাত সমস্যা {#erc20-issues} + +### ERC-20 টোকেন গ্রহণ সমস্যা {#reception-issue} + +**06/20/2024 অনুযায়ী এই সমস্যার কারণে কমপক্ষে $83,656,418 মূল্যের ERC-20 টোকেন হারিয়ে গেছে। মনে রাখবেন যে একটি বিশুদ্ধ ERC-20 ইমপ্লিমেন্টেশন এই সমস্যার জন্য ঝুঁকিপূর্ণ, যদি না আপনি নীচে তালিকাভুক্ত স্ট্যান্ডার্ডের উপরে অতিরিক্ত বিধিনিষেধের একটি সেট প্রয়োগ করেন।** + +যখন ERC-20 টোকেন এমন একটি স্মার্ট কন্ট্রাক্টে পাঠানো হয় যা ERC-20 টোকেন পরিচালনা করার জন্য ডিজাইন করা হয়নি, তখন সেই টোকেনগুলি স্থায়ীভাবে হারিয়ে যেতে পারে। এটি ঘটে কারণ গ্রহণকারী কন্ট্র্যাক্টের আগত টোকেনগুলিকে চিনতে বা তার প্রতিক্রিয়া জানানোর কার্যকারিতা নেই এবং ERC-20 স্ট্যান্ডার্ডে গ্রহণকারী কন্ট্র্যাক্টকে আগত টোকেন সম্পর্কে অবহিত করার কোনো ব্যবস্থা নেই। এই সমস্যাটি যে প্রধান উপায়ে রূপ নেয় তা হল: + +1. টোকেন স্থানান্তর পদ্ধতি + +- ERC-20 টোকেনগুলি `transfer` বা `transferFrom` ফাংশন ব্যবহার করে স্থানান্তরিত হয় + - যখন একজন ব্যবহারকারী এই ফাংশনগুলি ব্যবহার করে একটি কন্ট্র্যাক্ট ঠিকানায় টোকেন পাঠায়, তখন গ্রহণকারী কন্ট্র্যাক্টটি সেগুলি পরিচালনা করার জন্য ডিজাইন করা হয়েছে কিনা তা নির্বিশেষে টোকেনগুলি স্থানান্তরিত হয় + +2. বিজ্ঞপ্তির অভাব + - গ্রহণকারী কন্ট্র্যাক্ট কোনো বিজ্ঞপ্তি বা কলব্যাক পায় না যে টোকেনগুলি এতে পাঠানো হয়েছে। + - যদি গ্রহণকারী কন্ট্র্যাক্টে টোকেন পরিচালনা করার কোনো ব্যবস্থার অভাব থাকে (যেমন, একটি ফলব্যাক ফাংশন বা টোকেন গ্রহণ পরিচালনা করার জন্য একটি নিবেদিত ফাংশন), তাহলে টোকেনগুলি কার্যকরভাবে কন্ট্র্যাক্টের ঠিকানায় আটকে যায়। +3. কোনো বিল্ট-ইন হ্যান্ডলিং নেই + - ERC-20 স্ট্যান্ডার্ডে গ্রহণকারী কন্ট্র্যাক্টগুলি প্রয়োগ করার জন্য কোনো বাধ্যতামূলক ফাংশন অন্তর্ভুক্ত নেই, যার ফলে এমন একটি পরিস্থিতি তৈরি হয় যেখানে অনেক কন্ট্র্যাক্ট আগত টোকেনগুলি সঠিকভাবে পরিচালনা করতে অক্ষম। + +**সম্ভাব্য সমাধান** + +যদিও ERC-20 এর সাথে এই সমস্যাটি সম্পূর্ণরূপে প্রতিরোধ করা সম্ভব নয়, তবে এমন কিছু পদ্ধতি রয়েছে যা শেষ ব্যবহারকারীর জন্য টোকেন হারানোর সম্ভাবনা উল্লেখযোগ্যভাবে হ্রাস করতে পারে: + +- সবচেয়ে সাধারণ সমস্যা হলো যখন একজন ব্যবহারকারী টোকেন কন্ট্র্যাক্টের ঠিকানাতেই টোকেন পাঠায় (যেমন, USDT টোকেন কন্ট্র্যাক্টের ঠিকানায় USDT জমা দেওয়া)। `transfer(..)` ফাংশনটিকে এই ধরনের স্থানান্তর প্রচেষ্টাগুলি প্রত্যাবর্তন করার জন্য সীমাবদ্ধ করার সুপারিশ করা হয়। `transfer(..)` ফাংশনের প্রয়োগের মধ্যে `require(_to != address(this));` চেক যোগ করার কথা বিবেচনা করুন। +- `transfer(..)` ফাংশনটি সাধারণত কন্ট্র্যাক্টে টোকেন জমা করার জন্য ডিজাইন করা হয়নি। `approve(..) এবং `transferFrom(..)`প্যাটার্ন এর পরিবর্তে কন্ট্র্যাক্টে ERC-20 টোকেন জমা করতে ব্যবহৃত হয়। ট্রান্সফার ফাংশনটিকে সীমাবদ্ধ করে যেকোনো কন্ট্রাক্টে টোকেন জমা দেওয়া নিষিদ্ধ করা সম্ভব, তবে এটি এমন কন্ট্রাক্টগুলোর সাথে সামঞ্জস্যতা ভঙ্গ করতে পারে যেগুলো ধরে নেয় যে`trasnfer(..)` ফাংশন ব্যবহার করে কন্ট্রাক্টে টোকেন জমা করা যায় (যেমন, Uniswap লিকুইডিটি পুল)। +- সর্বদা ধরে নিন যে ERC-20 টোকেনগুলি আপনার কন্ট্রাক্টে এসে জমা হতে পারে, এমনকি যদি আপনার কন্ট্রাক্টের কোনো টোকেন গ্রহণ করার কথা না থাকে। প্রাপকের পক্ষ থেকে দুর্ঘটনাজনিত জমা প্রতিরোধ বা প্রত্যাখ্যান করার কোনো উপায় নেই। এমন একটি ফাংশন প্রয়োগ করার পরামর্শ দেওয়া হয় যা দুর্ঘটনাক্রমে জমা হওয়া ERC-20 টোকেনগুলি বের করার অনুমতি দেবে। +- বিকল্প টোকেন স্ট্যান্ডার্ড ব্যবহার করার কথা বিবেচনা করুন। + +এই সমস্যা থেকে কিছু বিকল্প স্ট্যান্ডার্ড বেরিয়ে এসেছে যেমন [ERC-223](/developers/docs/standards/tokens/erc-223) বা [ERC-1363](/developers/docs/standards/tokens/erc-1363)। + +## আরও পড়ুন {#further-reading} + +- [EIP-20: ERC-20 টোকেন স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-20) +- [OpenZeppelin - টোকেন](https://docs.openzeppelin.com/contracts/3.x/tokens#ERC20) +- [OpenZeppelin - ERC-20 ইমপ্লিমেন্টেশন](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol) +- [Alchemy - সলিডিটি ERC20 টোকেনের জন্য গাইড](https://www.alchemy.com/overviews/erc20-solidity) + +## অন্যান্য ফানজিবল টোকেন স্ট্যান্ডার্ড {#fungible-token-standards} + +- [ERC-223](/developers/docs/standards/tokens/erc-223) +- [ERC-1363](/developers/docs/standards/tokens/erc-1363) +- [ERC-777](/developers/docs/standards/tokens/erc-777) +- [ERC-4626 - টোকেনাইজড ভল্ট](/developers/docs/standards/tokens/erc-4626) diff --git a/public/content/translations/bn/developers/docs/standards/tokens/erc-223/index.md b/public/content/translations/bn/developers/docs/standards/tokens/erc-223/index.md new file mode 100644 index 00000000000..af85dd7e670 --- /dev/null +++ b/public/content/translations/bn/developers/docs/standards/tokens/erc-223/index.md @@ -0,0 +1,198 @@ +--- +title: "ERC-223 টোকেন স্ট্যান্ডার্ড" +description: "ERC-223 ফাঞ্জিবল টোকেন স্ট্যান্ডার্ডের একটি সংক্ষিপ্ত বিবরণ, এটি কীভাবে কাজ করে, এবং ERC-20 এর সাথে একটি তুলনা।" +lang: bn +--- + +## ভূমিকা {#introduction} + +### ERC-223 কী? {#what-is-erc223} + +ERC-223 হল ফাঞ্জিবল টোকেনের জন্য একটি স্ট্যান্ডার্ড, যা ERC-20 স্ট্যান্ডার্ডের অনুরূপ। মূল পার্থক্য হল ERC-223 শুধুমাত্র টোকেন API সংজ্ঞায়িত করে না, বরং প্রেরক থেকে প্রাপকের কাছে টোকেন স্থানান্তরের জন্য লজিকও সংজ্ঞায়িত করে। এটি একটি যোগাযোগ মডেল চালু করে যা প্রাপকের দিকে টোকেন স্থানান্তর পরিচালনা করার অনুমতি দেয়। + +### ERC-20 থেকে পার্থক্য {#erc20-differences} + +ERC-223, ERC-20 এর কিছু সীমাবদ্ধতা মোকাবেলা করে এবং টোকেন কন্ট্র্যাক্ট এবং টোকেন গ্রহণ করতে পারে এমন একটি কন্ট্র্যাক্টের মধ্যে পারস্পরিক যোগাযোগের একটি নতুন পদ্ধতি চালু করে। এমন কিছু জিনিস আছে যা ERC-223 দিয়ে সম্ভব কিন্তু ERC-20 দিয়ে নয়: + +- প্রাপকের দিকে টোকেন স্থানান্তর পরিচালনা: প্রাপকরা শনাক্ত করতে পারেন যে একটি ERC-223 টোকেন জমা দেওয়া হচ্ছে। +- ভুলভাবে পাঠানো টোকেন প্রত্যাখ্যান: যদি একজন ব্যবহারকারী এমন কোনো কন্ট্র্যাক্টে ERC-223 টোকেন পাঠায় যা টোকেন গ্রহণ করার জন্য নয়, তাহলে কন্ট্র্যাক্টটি লেনদেন প্রত্যাখ্যান করতে পারে, যার ফলে টোকেনের ক্ষতি রোধ করা যায়। +- স্থানান্তরে মেটাডেটা: ERC-223 টোকেনগুলিতে মেটাডেটা অন্তর্ভুক্ত থাকতে পারে, যা টোকেন লেনদেনের সাথে ইচ্ছামত তথ্য সংযুক্ত করার অনুমতি দেয়। + +## পূর্বশর্ত {#prerequisites} + +- [অ্যাকাউন্টগুলি](/developers/docs/accounts) +- [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) +- [টোকেন স্ট্যান্ডার্ড](/developers/docs/standards/tokens/) +- [ERC-20](/developers/docs/standards/tokens/erc-20/) + +## বডি {#body} + +ERC-223 হল একটি টোকেন স্ট্যান্ডার্ড যা স্মার্ট কন্ট্র্যাক্টের মধ্যে টোকেনের জন্য একটি API প্রয়োগ করে। এটি সেইসব কন্ট্র্যাক্টের জন্যও একটি API ঘোষণা করে যেগুলি ERC-223 টোকেন গ্রহণ করার কথা। যে কন্ট্র্যাক্টগুলো ERC-223 রিসিভার API সমর্থন করে না, তারা ERC-223 টোকেন গ্রহণ করতে পারে না, যা ব্যবহারকারীর ত্রুটি প্রতিরোধ করে। + +যদি একটি স্মার্ট কন্ট্র্যাক্ট নিম্নলিখিত পদ্ধতি এবং ইভেন্টগুলি প্রয়োগ করে, তবে এটিকে একটি ERC-223 সামঞ্জস্যপূর্ণ টোকেন কন্ট্র্যাক্ট বলা যেতে পারে। একবার স্থাপন করা হলে, এটি +Ethereum-এ তৈরি করা টোকেনগুলির ট্র্যাক রাখার জন্য দায়ী থাকবে। + +কন্ট্র্যাক্টটি শুধুমাত্র এই ফাংশনগুলি রাখতে বাধ্য নয় এবং একজন ডেভেলপার এই কন্ট্র্যাক্টে বিভিন্ন টোকেন স্ট্যান্ডার্ড থেকে অন্য কোনো বৈশিষ্ট্য যোগ করতে পারেন। উদাহরণস্বরূপ, `approve` এবং `transferFrom` ফাংশনগুলি ERC-223 স্ট্যান্ডার্ডের অংশ নয় তবে প্রয়োজনে এই ফাংশনগুলি প্রয়োগ করা যেতে পারে। + +[EIP-223](https://eips.ethereum.org/EIPS/eip-223) থেকে: + +### মেথড {#methods} + +ERC-223 টোকেনকে অবশ্যই নিম্নলিখিত পদ্ধতিগুলি প্রয়োগ করতে হবে: + +```solidity +function name() public view returns (string) +function symbol() public view returns (string) +function decimals() public view returns (uint8) +function totalSupply() public view returns (uint256) +function balanceOf(address _owner) public view returns (uint256 balance) +function transfer(address _to, uint256 _value) public returns (bool success) +function transfer(address _to, uint256 _value, bytes calldata _data) public returns (bool success) +``` + +একটি কন্ট্র্যাক্ট যা ERC-223 টোকেন গ্রহণ করার কথা, তাকে অবশ্যই নিম্নলিখিত পদ্ধতিটি প্রয়োগ করতে হবে: + +```solidity +function tokenReceived(address _from, uint _value, bytes calldata _data) +``` + +যদি ERC-223 টোকেন এমন একটি কন্ট্র্যাক্টে পাঠানো হয় যা `tokenReceived(..)` ফাংশনটি প্রয়োগ করে না, তাহলে স্থানান্তরটি অবশ্যই ব্যর্থ হবে এবং টোকেনগুলি প্রেরকের ব্যালেন্স থেকে সরানো যাবে না। + +### ইভেন্ট {#events} + +```solidity +event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes calldata _data) +``` + +### উদাহরণ {#examples} + +ERC-223 টোকেনের API, ERC-20-এর মতোই, তাই UI ডেভেলপমেন্টের দৃষ্টিকোণ থেকে কোনো পার্থক্য নেই। এখানে একমাত্র ব্যতিক্রম হল যে ERC-223 টোকেনগুলিতে `approve` + `transferFrom` ফাংশন নাও থাকতে পারে কারণ এই স্ট্যান্ডার্ডের জন্য এগুলি ঐচ্ছিক। + +#### Solidity উদাহরণ {#solidity-example} + +নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি বেসিক ERC-223 টোকেন কন্ট্র্যাক্ট কাজ করে: + +```solidity +pragma solidity ^0.8.19; +abstract contract IERC223Recipient { + function tokenReceived(address _from, uint _value, bytes memory _data) public virtual; +} +contract VeryBasicERC223Token { + event Transfer(address indexed from, address indexed to, uint value, bytes data); + string private _name; + string private _symbol; + uint8 private _decimals; + uint256 private _totalSupply; + mapping(address => uint256) private balances; + function name() public view returns (string memory) { return _name; } + function symbol() public view returns (string memory) {return _symbol; } + function decimals() public view returns (uint8) { return _decimals; } + function totalSupply() public view returns (uint256) { return _totalSupply; } + function balanceOf(address _owner) public view returns (uint256) { return balances[_owner]; } + function isContract(address account) internal view returns (bool) { + uint256 size; + assembly { size := extcodesize(account) } + return size > 0; + } + function transfer(address _to, uint _value, bytes calldata _data) public returns (bool success){ + balances[msg.sender] = balances[msg.sender] - _value; + balances[_to] = balances[_to] + _value; + if(isContract(_to)) { + IERC223Recipient(_to).tokenReceived(msg.sender, _value, _data); + } + emit Transfer(msg.sender, _to, _value, _data); + return true; + } + function transfer(address _to, uint _value) public returns (bool success){ + bytes memory _empty = hex"00000000"; + balances[msg.sender] = balances[msg.sender] - _value; + balances[_to] = balances[_to] + _value; + if(isContract(_to)) { + IERC223Recipient(_to).tokenReceived(msg.sender, _value, _empty); + } + emit Transfer(msg.sender, _to, _value, _empty); + return true; + } +} +``` + +এখন আমরা চাই যে অন্য একটি কন্ট্র্যাক্ট `tokenA`-এর ডিপোজিট গ্রহণ করুক, এই ভেবে যে tokenA একটি ERC-223 টোকেন। কন্ট্র্যাক্টটিকে অবশ্যই শুধু tokenA গ্রহণ করতে হবে এবং অন্য যেকোনো টোকেন প্রত্যাখ্যান করতে হবে। যখন কন্ট্র্যাক্টটি tokenA গ্রহণ করবে, তখন এটিকে অবশ্যই একটি `Deposit()` ইভেন্ট নির্গত করতে হবে এবং অভ্যন্তরীণ `deposits` ভ্যারিয়েবলের মান বাড়াতে হবে। + +এখানে কোডটি দেওয়া হল: + +```solidity +contract RecipientContract is IERC223Recipient { + event Deposit(address whoSentTheTokens); + uint256 deposits = 0; + address tokenA; // একমাত্র টোকেন যা আমরা গ্রহণ করতে চাই। + function tokenReceived(address _from, uint _value, bytes memory _data) public override + { + // এটা বোঝা গুরুত্বপূর্ণ যে এই ফাংশনের মধ্যে + // msg.sender হল প্রাপ্ত টোকেনের ঠিকানা, + // msg.value সর্বদা 0 কারণ বেশিরভাগ ক্ষেত্রে টোকেন কন্ট্র্যাক্টটি ইথারের মালিক নয় বা পাঠায় না, + // _from হল টোকেন স্থানান্তরের প্রেরক, + // _value হল জমাকৃত টোকেনের পরিমাণ। + require(msg.sender == tokenA); + deposits += _value; + emit Deposit(_from); + } +} +``` + +## সাধারণত জিজ্ঞাসিত প্রশ্নসমূহ {#faq} + +### আমরা যদি কন্ট্র্যাক্টে কিছু tokenB পাঠাই তাহলে কী হবে? {#sending-tokens} + +লেনদেনটি ব্যর্থ হবে, এবং টোকেনের স্থানান্তর ঘটবে না। টোকেনগুলি প্রেরকের ঠিকানায় ফেরত দেওয়া হবে। + +### আমরা কীভাবে এই কন্ট্র্যাক্টে ডিপোজিট করতে পারি? {#contract-deposits} + +ERC-223 টোকেনের `transfer(address,uint256)` বা `transfer(address,uint256,bytes)` ফাংশন কল করুন, `RecipientContract`-এর ঠিকানা নির্দিষ্ট করে। + +### আমরা যদি এই কন্ট্র্যাক্টে একটি ERC-20 টোকেন স্থানান্তর করি তাহলে কী হবে? {#erc-20-transfers} + +যদি `RecipientContract`-এ একটি ERC-20 টোকেন পাঠানো হয়, টোকেনগুলি স্থানান্তরিত হবে, কিন্তু স্থানান্তরটি স্বীকৃত হবে না (কোনও `Deposit()` ইভেন্ট ফায়ার করা হবে না, এবং ডিপোজিটের মান পরিবর্তন হবে না)। অবাঞ্ছিত ERC-20 ডিপোজিট ফিল্টার বা প্রতিরোধ করা যায় না। + +### যদি আমরা টোকেন ডিপোজিট সম্পূর্ণ হওয়ার পরে কিছু ফাংশন এক্সিকিউট করতে চাই? {#function-execution} + +এর একাধিক উপায় আছে। এই উদাহরণে আমরা সেই পদ্ধতিটি অনুসরণ করব যা ERC-223 স্থানান্তরকে ইথার স্থানান্তরের অনুরূপ করে তোলে: + +```solidity +contract RecipientContract is IERC223Recipient { + event Foo(); + event Bar(uint256 someNumber); + address tokenA; // একমাত্র টোকেন যা আমরা গ্রহণ করতে চাই। + function tokenReceived(address _from, uint _value, bytes memory _data) public override + { + require(msg.sender == tokenA); + address(this).call(_data); // ইনকামিং লেনদেন পরিচালনা করুন এবং একটি পরবর্তী ফাংশন কল সঞ্চালন করুন। + } + function foo() public + { + emit Foo(); + } + function bar(uint256 _someNumber) public + { + emit Bar(_someNumber); + } +} +``` + +যখন `RecipientContract` একটি ERC-223 টোকেন গ্রহণ করবে, তখন কন্ট্র্যাক্টটি টোকেন লেনদেনের `_data` প্যারামিটার হিসেবে এনকোড করা একটি ফাংশন এক্সিকিউট করবে, যা ইথার লেনদেনগুলি লেনদেনের `data` হিসেবে ফাংশন কল এনকোড করার পদ্ধতির অনুরূপ। আরও তথ্যের জন্য [ডেটা ফিল্ড](/developers/docs/transactions/#the-data-field) পড়ুন। + +উপরের উদাহরণে, `RecipientContract`-এর ঠিকানায় `transfer(address,uin256,bytes calldata _data)` ফাংশন দিয়ে একটি ERC-223 টোকেন স্থানান্তর করতে হবে। যদি ডেটা প্যারামিটার `0xc2985578` (`foo()` ফাংশনের সিগনেচার) হয়, তাহলে টোকেন ডিপোজিট পাওয়ার পরে foo() ফাংশনটি চালু হবে এবং Foo() ইভেন্টটি ফায়ার করা হবে। + +`_someNumber`-এর জন্য 12345 মান সহ টোকেন স্থানান্তরের `data`-তেও প্যারামিটার এনকোড করা যেতে পারে, উদাহরণস্বরূপ আমরা bar() ফাংশনটিকে কল করতে পারি। এই ক্ষেত্রে, `data` অবশ্যই `0x0423a13200000000000000000000000000000000000000000000000000000000000004d2` হতে হবে যেখানে `0x0423a132` হল `bar(uint256)` ফাংশনের সিগনেচার এবং `00000000000000000000000000000000000000000000000000000000000004d2` হল 12345 যা uint256 হিসেবে লেখা। + +## সীমাবদ্ধতা {#limitations} + +যদিও ERC-223 ERC-20 স্ট্যান্ডার্ডে পাওয়া বেশ কিছু সমস্যার সমাধান করে, এটি তার নিজস্ব সীমাবদ্ধতা ছাড়া নয়: + +- গ্রহণযোগ্যতা এবং সামঞ্জস্যতা: ERC-223 এখনও ব্যাপকভাবে গৃহীত হয়নি, যা বিদ্যমান টুল এবং প্ল্যাটফর্মগুলির সাথে এর সামঞ্জস্যতা সীমিত করতে পারে। +- পশ্চাৎগামী সামঞ্জস্যতা: ERC-223, ERC-20-এর সাথে পশ্চাৎগামী সামঞ্জস্যপূর্ণ নয়, যার অর্থ হল বিদ্যমান ERC-20 কন্ট্র্যাক্ট এবং টুলগুলি পরিবর্তন ছাড়া ERC-223 টোকেনগুলির সাথে কাজ করবে না। +- গ্যাস খরচ: ERC-223 স্থানান্তরের অতিরিক্ত চেক এবং কার্যকারিতার ফলে ERC-20 লেনদেনের তুলনায় গ্যাসের খরচ বেশি হতে পারে। + +## আরও পড়ুন {#further-reading} + +- [EIP-223: ERC-223 টোকেন স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-223) +- [প্রাথমিক ERC-223 প্রস্তাব](https://github.com/ethereum/eips/issues/223) diff --git a/public/content/translations/bn/developers/docs/standards/tokens/erc-4626/index.md b/public/content/translations/bn/developers/docs/standards/tokens/erc-4626/index.md new file mode 100644 index 00000000000..bcf842491ab --- /dev/null +++ b/public/content/translations/bn/developers/docs/standards/tokens/erc-4626/index.md @@ -0,0 +1,227 @@ +--- +title: "ERC-4626 টোকেনাইজড ভল্ট স্ট্যান্ডার্ড" +description: "ইল্ড বেয়ারিং ভল্টের জন্য একটি স্ট্যান্ডার্ড।" +lang: bn +--- + +## ভূমিকা {#introduction} + +ERC-4626 হলো ইল্ড-বেয়ারিং ভল্টের প্রযুক্তিগত প্যারামিটারগুলিকে অপ্টিমাইজ এবং একত্রিত করার জন্য একটি স্ট্যান্ডার্ড। এটি টোকেনাইজড ইল্ড-বেয়ারিং ভল্টের জন্য একটি স্ট্যান্ডার্ড API প্রদান করে যা একটি একক অন্তর্নিহিত ERC-20 টোকেনের শেয়ারের প্রতিনিধিত্ব করে। ERC-4626, ERC-20 ব্যবহারকারী টোকেনাইজড ভল্টের জন্য একটি ঐচ্ছিক এক্সটেনশনের রূপরেখাও দেয়, যা টোকেন জমা, উত্তোলন এবং ব্যালেন্স পড়ার জন্য প্রাথমিক কার্যকারিতা প্রদান করে। + +**ইল্ড-বেয়ারিং ভল্টে ERC-4626-এর ভূমিকা** + +লেন্ডিং বাজার, অ্যাগ্রিগেটর এবং সহজাতভাবে সুদ-বাহী টোকেন বিভিন্ন কৌশল কার্যকর করার মাধ্যমে ব্যবহারকারীদের তাদের ক্রিপ্টো টোকেনে সেরা ইল্ড খুঁজে পেতে সাহায্য করে। এই কৌশলগুলি সামান্য ভিন্নতার সাথে করা হয়, যা ত্রুটি-প্রবণ হতে পারে বা ডেভেলপমেন্ট রিসোর্স নষ্ট করতে পারে। + +ইল্ড-বেয়ারিং ভল্টে ERC-4626 আরও সামঞ্জস্যপূর্ণ এবং শক্তিশালী বাস্তবায়ন প্যাটার্ন তৈরি করার মাধ্যমে ইন্টিগ্রেশন প্রচেষ্টা কমাবে এবং ডেভেলপারদের থেকে সামান্য বিশেষায়িত প্রচেষ্টার সাথে বিভিন্ন অ্যাপ্লিকেশনে ইল্ডে অ্যাক্সেস আনলক করবে। + +ERC-4626 টোকেনটি [EIP-4626](https://eips.ethereum.org/EIPS/eip-4626)-তে সম্পূর্ণরূপে বর্ণনা করা হয়েছে। + +**অ্যাসিঙ্ক্রোনাস ভল্ট এক্সটেনশন (ERC-7540)** + +ERC-4626 একটি সীমা পর্যন্ত অ্যাটমিক ডিপোজিট এবং রিডেম্পশনের জন্য অপ্টিমাইজ করা হয়েছে। সীমা পৌঁছে গেলে, কোনো নতুন ডিপোজিট বা রিডেম্পশন জমা দেওয়া যাবে না। এই সীমাবদ্ধতাটি ভল্টের সাথে ইন্টারফেস করার পূর্বশর্ত হিসেবে অ্যাসিঙ্ক্রোনাস অ্যাকশন বা বিলম্ব সহ কোনো স্মার্ট কন্ট্র্যাক্ট সিস্টেমের জন্য ভালোভাবে কাজ করে না (যেমন, রিয়েল-ওয়ার্ল্ড অ্যাসেট প্রোটোকল, আন্ডারকোল্যাটারাইজড লেন্ডিং প্রোটোকল, ক্রস-চেইন লেন্ডিং প্রোটোকল, লিকুইড স্টেকিং টোকেন বা বিমা সুরক্ষা মডিউল)। + +ERC-7540 অ্যাসিঙ্ক্রোনাস ব্যবহারের ক্ষেত্রে ERC-4626 ভল্টের উপযোগিতা প্রসারিত করে। বিদ্যমান ভল্ট ইন্টারফেস (`deposit`/`withdraw`/`mint`/`redeem`) অ্যাসিঙ্ক্রোনাস অনুরোধ দাবি করতে সম্পূর্ণরূপে ব্যবহৃত হয়। + +ERC-7540 এক্সটেনশনটি [ERC-7540](https://eips.ethereum.org/EIPS/eip-7540)-তে সম্পূর্ণরূপে বর্ণনা করা হয়েছে। + +**মাল্টি-অ্যাসেট ভল্ট এক্সটেনশন (ERC-7575)** + +ERC-4626 দ্বারা সমর্থিত নয় এমন একটি অনুপস্থিত ব্যবহারের ক্ষেত্র হলো এমন ভল্ট যার একাধিক সম্পদ বা এন্ট্রি পয়েন্ট রয়েছে যেমন লিকুইডিটি প্রোভাইডার (LP) টোকেন। ERC-4626-কে নিজেই একটি ERC-20 হতে হয় বলে, এইগুলি সাধারণত অসুবিধাজনক বা অ-সম্মত হয়। + +ERC-7575 একাধিক সম্পদ সহ ভল্টের জন্য সমর্থন যোগ করে এবং ERC-4626 বাস্তবায়ন থেকে ERC-20 টোকেন বাস্তবায়নকে বাহ্যিক করে। + +ERC-7575 এক্সটেনশনটি [ERC-7575](https://eips.ethereum.org/EIPS/eip-7575)-তে সম্পূর্ণরূপে বর্ণনা করা হয়েছে। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আরও ভালভাবে বুঝতে, আমরা আপনাকে প্রথমে [টোকেন স্ট্যান্ডার্ড](/developers/docs/standards/tokens/) এবং [ERC-20](/developers/docs/standards/tokens/erc-20/) সম্পর্কে পড়ার পরামর্শ দিই। + +## ERC-4626 ফাংশন এবং বৈশিষ্ট্য: {#body} + +### মেথড {#methods} + +#### সম্পদ {#asset} + +```solidity +function asset() public view returns (address assetTokenAddress) +``` + +এই ফাংশনটি অ্যাকাউন্টিং, জমা দেওয়া, এবং উত্তোলনের জন্য ভল্টে ব্যবহৃত অন্তর্নিহিত টোকেনের ঠিকানাটি ফেরত দেয়। + +#### মোট সম্পদ {#totalassets} + +```solidity +function totalAssets() public view returns (uint256) +``` + +এই ফাংশনটি ভল্টে রাখা অন্তর্নিহিত সম্পদের মোট পরিমাণ প্রদান করে। + +#### শেয়ারে রূপান্তর {#convertoshares} + +```solidity +function convertToShares(uint256 assets) public view returns (uint256 shares) +``` + +এই ফাংশনটি প্রদত্ত `assets`-এর পরিমাণের জন্য ভল্ট দ্বারা বিনিময় করা হবে এমন `shares`-এর পরিমাণ প্রদান করে। + +#### সম্পদে রূপান্তর {#convertoassets} + +```solidity +function convertToAssets(uint256 shares) public view returns (uint256 assets) +``` + +এই ফাংশনটি প্রদত্ত `shares`-এর পরিমাণের জন্য ভল্ট দ্বারা বিনিময় করা হবে এমন `assets`-এর পরিমাণ প্রদান করে। + +#### সর্বোচ্চ জমা {#maxdeposit} + +```solidity +function maxDeposit(address receiver) public view returns (uint256 maxAssets) +``` + +এই ফাংশনটি অন্তর্নিহিত সম্পদের সর্বোচ্চ পরিমাণ প্রদান করে যা একটি একক [`deposit`](#deposit) কলে জমা করা যেতে পারে, এবং `receiver`-এর জন্য শেয়ারগুলি মিন্ট করা হয়। + +#### ডিপোজিটের প্রিভিউ {#previewdeposit} + +```solidity +function previewDeposit(uint256 assets) public view returns (uint256 shares) +``` + +এই ফাংশনটি ব্যবহারকারীদের বর্তমান ব্লকে তাদের জমার প্রভাব সিমুলেট করতে দেয়। + +#### জমা {#deposit} + +```solidity +function deposit(uint256 assets, address receiver) public returns (uint256 shares) +``` + +এই ফাংশনটি ভল্টে অন্তর্নিহিত টোকেনের `assets` জমা করে এবং `receiver`-কে `shares`-এর মালিকানা প্রদান করে। + +#### সর্বোচ্চ মিন্ট {#maxmint} + +```solidity +function maxMint(address receiver) public view returns (uint256 maxShares) +``` + +এই ফাংশনটি একটি একক [`mint`](#mint) কলে মিন্ট করা যেতে পারে এমন শেয়ারের সর্বোচ্চ পরিমাণ প্রদান করে, যেখানে শেয়ারগুলো `receiver`-এর জন্য মিন্ট করা হয়। + +#### মিন্টের প্রিভিউ {#previewmint} + +```solidity +function previewMint(uint256 shares) public view returns (uint256 assets) +``` + +এই ফাংশনটি ব্যবহারকারীদের বর্তমান ব্লকে তাদের মিন্টের প্রভাব সিমুলেট করতে দেয়। + +#### মিন্ট {#mint} + +```solidity +function mint(uint256 shares, address receiver) public returns (uint256 assets) +``` + +এই ফাংশনটি অন্তর্নিহিত টোকেনের `assets` জমা করার মাধ্যমে `receiver`-কে ঠিক `shares` পরিমাণ ভল্ট শেয়ার মিন্ট করে। + +#### সর্বোচ্চ উত্তোলন {#maxwithdraw} + +```solidity +function maxWithdraw(address owner) public view returns (uint256 maxAssets) +``` + +এই ফাংশনটি অন্তর্নিহিত সম্পদের সর্বোচ্চ পরিমাণ প্রদান করে যা একটি একক [`withdraw`](#withdraw) কলের মাধ্যমে `owner`-এর ব্যালেন্স থেকে উত্তোলন করা যেতে পারে। + +#### উত্তোলনের প্রিভিউ {#previewwithdraw} + +```solidity +function previewWithdraw(uint256 assets) public view returns (uint256 shares) +``` + +এই ফাংশনটি ব্যবহারকারীদের বর্তমান ব্লকে তাদের উত্তোলনের প্রভাব সিমুলেট করতে দেয়। + +#### উত্তোলন {#withdraw} + +```solidity +function withdraw(uint256 assets, address receiver, address owner) public returns (uint256 shares) +``` + +এই ফাংশনটি `owner`-এর থেকে `shares` বার্ন করে এবং ভল্ট থেকে `receiver`-কে ঠিক `assets` টোকেন পাঠায়। + +#### সর্বোচ্চ রিডিম {#maxredeem} + +```solidity +function maxRedeem(address owner) public view returns (uint256 maxShares) +``` + +এই ফাংশনটি একটি [`redeem`](#redeem) কলের মাধ্যমে `owner`-এর ব্যালেন্স থেকে রিডিম করা যেতে পারে এমন শেয়ারের সর্বোচ্চ পরিমাণ প্রদান করে। + +#### রিডিমের প্রিভিউ {#previewredeem} + +```solidity +function previewRedeem(uint256 shares) public view returns (uint256 assets) +``` + +এই ফাংশনটি ব্যবহারকারীদের বর্তমান ব্লকে তাদের রিডেম্পশনের প্রভাব সিমুলেট করতে দেয়। + +#### রিডিম {#redeem} + +```solidity +function redeem(uint256 shares, address receiver, address owner) public returns (uint256 assets) +``` + +এই ফাংশনটি `owner`-এর থেকে নির্দিষ্ট সংখ্যক `shares` রিডিম করে এবং ভল্ট থেকে `receiver`-কে অন্তর্নিহিত টোকেনের `assets` পাঠায়। + +#### মোট সরবরাহ {#totalsupply} + +```solidity +function totalSupply() public view returns (uint256) +``` + +প্রচলিত আনরিডিমড ভল্ট শেয়ারের মোট সংখ্যা প্রদান করে। + +#### ব্যালেন্স {#balanceof} + +```solidity +function balanceOf(address owner) public view returns (uint256) +``` + +`owner`-এর কাছে বর্তমানে থাকা ভল্ট শেয়ারের মোট পরিমাণ প্রদান করে। + +### ইন্টারফেসের ম্যাপ {#mapOfTheInterface} + +![ERC-4626 ইন্টারফেসের ম্যাপ](./map-of-erc-4626.png) + +### ইভেন্ট {#events} + +#### ডিপোজিট ইভেন্ট + +[`mint`](#mint) এবং [`deposit`](#deposit) মেথডের মাধ্যমে যখন টোকেন ভল্টে জমা করা হয় তখন **অবশ্যই** এমিট করতে হবে। + +```solidity +event Deposit( + address indexed sender, + address indexed owner, + uint256 assets, + uint256 shares +) +``` + +যেখানে `sender` হলো সেই ব্যবহারকারী যিনি `shares`-এর জন্য `assets` বিনিময় করেছেন, এবং সেই `shares` `owner`-এর কাছে স্থানান্তর করেছেন। + +#### উত্তোলন ইভেন্ট + +[`redeem`](#redeem) বা [`withdraw`](#withdraw) মেথডে যখন একজন আমানতকারী ভল্ট থেকে শেয়ার উত্তোলন করেন তখন **অবশ্যই** এমিট করতে হবে। + +```solidity +event Withdraw( + address indexed sender, + address indexed receiver, + address indexed owner, + uint256 assets, + uint256 shares +) +``` + +যেখানে `sender` হলো সেই ব্যবহারকারী যিনি উত্তোলনটি ট্রিগার করেছেন এবং `owner`-এর মালিকানাধীন `shares`-কে `assets`-এর জন্য বিনিময় করেছেন। `receiver` হলো সেই ব্যবহারকারী যিনি উত্তোলিত `assets` পেয়েছেন। + +## আরও পড়ুন {#further-reading} + +- [EIP-4626: টোকেনাইজড ভল্ট স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-4626) +- [ERC-4626: GitHub রিপো](https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC4626.sol) diff --git a/public/content/translations/bn/developers/docs/standards/tokens/erc-721/index.md b/public/content/translations/bn/developers/docs/standards/tokens/erc-721/index.md new file mode 100644 index 00000000000..3d92d99cbaf --- /dev/null +++ b/public/content/translations/bn/developers/docs/standards/tokens/erc-721/index.md @@ -0,0 +1,263 @@ +--- +title: "ERC-721 নন-ফাঞ্জিবল টোকেন স্ট্যান্ডার্ড" +description: "ERC-721 সম্পর্কে জানুন, ইথেরিয়ামে অনন্য ডিজিটাল সম্পদের প্রতিনিধিত্বকারী নন-ফাঞ্জিবল টোকেন (NFTs)-এর জন্য একটি স্ট্যান্ডার্ড।" +lang: bn +--- + +## ভূমিকা {#introduction} + +**নন-ফাঞ্জিবল টোকেন কী?** + +একটি নন-ফাঞ্জিবল টোকেন (NFT) কোনো কিছু বা কাউকে একটি অনন্য উপায়ে শনাক্ত করতে ব্যবহৃত হয়। এই ধরনের টোকেন এমন প্ল্যাটফর্মে ব্যবহারের জন্য উপযুক্ত যা সংগ্রহযোগ্য আইটেম, অ্যাক্সেস কী, লটারির টিকিট, কনসার্ট এবং +খেলার ম্যাচের জন্য সংখ্যাযুক্ত আসন ইত্যাদি অফার করে। এই বিশেষ ধরনের টোকেনের অসাধারণ সম্ভাবনা রয়েছে তাই এর জন্য একটি সঠিক স্ট্যান্ডার্ড প্রয়োজন, ERC-721 +সেই সমাধান নিয়ে এসেছে! + +**ERC-721 কী?** + +ERC-721, NFT-এর জন্য একটি স্ট্যান্ডার্ড চালু করে, অন্য কথায়, এই ধরনের টোকেন অনন্য এবং একই স্মার্ট কন্ট্র্যাক্ট থেকে অন্য টোকেনের চেয়ে ভিন্ন মান +থাকতে পারে, সম্ভবত এর বয়স, বিরলতা বা এমনকি এর ভিজ্যুয়ালের মতো অন্য কিছুর কারণে। +অপেক্ষা করুন, ভিজ্যুয়াল? + +হ্যাঁ! সমস্ত NFT-এর `tokenId` নামক একটি `uint256` ভেরিয়েবল আছে, তাই যেকোনো ERC-721 কন্ট্র্যাক্টের জন্য, `contract address, uint256 tokenId` জোড়াটি +বিশ্বব্যাপী অনন্য হতে হবে। বলা বাহুল্য, একটি dapp-এর একটি "কনভার্টার" থাকতে পারে যা +ইনপুট হিসাবে `tokenId` ব্যবহার করে এবং জম্বি, অস্ত্র, দক্ষতা বা আশ্চর্যজনক কিটিদের মতো দুর্দান্ত কিছুর একটি চিত্র আউটপুট করে! + +## পূর্বশর্ত {#prerequisites} + +- [অ্যাকাউন্ট](/developers/docs/accounts/) +- [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) +- [টোকেন স্ট্যান্ডার্ড](/developers/docs/standards/tokens/) + +## বডি {#body} + +ERC-721 (Ethereum Request for Comments 721), যা উইলিয়াম এন্টিকেন, ডিটার শার্লি, জ্যাকব ইভান্স, +নাস্টাসিয়া শ্যাক্স দ্বারা জানুয়ারী 2018-এ প্রস্তাবিত, এটি একটি নন-ফাঞ্জিবল টোকেন স্ট্যান্ডার্ড যা স্মার্ট কন্ট্র্যাক্টের মধ্যে টোকেনগুলির জন্য একটি API প্রয়োগ করে। + +এটি একটি অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে টোকেন স্থানান্তর করা, একটি অ্যাকাউন্টের বর্তমান টোকেন ব্যালেন্স +পাওয়া, একটি নির্দিষ্ট টোকেনের মালিক কে তা জানা এবং নেটওয়ার্কে উপলব্ধ টোকেনের মোট সরবরাহ জানার মতো কার্যকারিতা প্রদান করে। +এগুলি ছাড়াও, এটিতে আরও কিছু কার্যকারিতা রয়েছে, যেমন কোনও অ্যাকাউন্ট থেকে একটি নির্দিষ্ট পরিমাণ টোকেন একটি তৃতীয় পক্ষের অ্যাকাউন্টের দ্বারা +স্থানান্তর করার অনুমোদন দেওয়া। + +যদি একটি স্মার্ট কন্ট্র্যাক্ট নিম্নলিখিত পদ্ধতি এবং ইভেন্টগুলি প্রয়োগ করে তবে এটিকে একটি ERC-721 নন-ফাঞ্জিবল টোকেন কন্ট্র্যাক্ট বলা যেতে পারে +এবং, একবার ডিপ্লয় করা হলে, এটি ইথেরিয়ামে তৈরি টোকেনগুলির ট্র্যাক রাখার জন্য দায়ী থাকবে। + +[EIP-721](https://eips.ethereum.org/EIPS/eip-721) থেকে: + +### মেথড {#methods} + +```solidity + function balanceOf(address _owner) external view returns (uint256); + function ownerOf(uint256 _tokenId) external view returns (address); + function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable; + function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable; + function transferFrom(address _from, address _to, uint256 _tokenId) external payable; + function approve(address _approved, uint256 _tokenId) external payable; + function setApprovalForAll(address _operator, bool _approved) external; + function getApproved(uint256 _tokenId) external view returns (address); + function isApprovedForAll(address _owner, address _operator) external view returns (bool); +``` + +### ইভেন্ট {#events} + +```solidity + event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId); + event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId); + event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); +``` + +### উদাহরণ {#web3py-example} + +আসুন দেখি কীভাবে একটি স্ট্যান্ডার্ড ইথেরিয়ামের যেকোনো ERC-721 টোকেন কন্ট্র্যাক্ট পরীক্ষা করার জন্য আমাদের জন্য জিনিসগুলিকে সহজ করে তোলে। +যেকোনো ERC-721 টোকেনের একটি ইন্টারফেস তৈরি করতে আমাদের শুধুমাত্র কন্ট্র্যাক্ট অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI) প্রয়োজন। যেমন আপনি নিচে +দেখতে পাচ্ছেন, এটিকে একটি ঝামেলাহীন উদাহরণ তৈরি করতে আমরা একটি সরলীকৃত ABI ব্যবহার করব। + +#### Web3.py উদাহরণ {#web3py-example} + +প্রথমে, নিশ্চিত করুন যে আপনি [Web3.py](https://web3py.readthedocs.io/en/stable/quickstart.html#installation) পাইথন লাইব্রেরিটি ইনস্টল করেছেন: + +``` +pip install web3 +``` + +```python +from web3 import Web3 +from web3._utils.events import get_event_data + + +w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com")) + +ck_token_addr = "0x06012c8cf97BEaD5deAe237070F9587f8E7A266d" # CryptoKitties কন্ট্র্যাক্ট + +acc_address = "0xb1690C08E213a35Ed9bAb7B318DE14420FB57d8C" # CryptoKitties সেলস অকশন + +# এটি একটি ERC-721 NFT কন্ট্র্যাক্টের একটি সরলীকৃত কন্ট্র্যাক্ট অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI)। +# এটি শুধুমাত্র এই পদ্ধতিগুলিকে প্রকাশ করবে: balanceOf(address), name(), ownerOf(tokenId), symbol(), totalSupply() +simplified_abi = [ + { + 'inputs': [{'internalType': 'address', 'name': 'owner', 'type': 'address'}], + 'name': 'balanceOf', + 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}], + 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True + }, + { + 'inputs': [], + 'name': 'name', + 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}], + 'stateMutability': 'view', 'type': 'function', 'constant': True + }, + { + 'inputs': [{'internalType': 'uint256', 'name': 'tokenId', 'type': 'uint256'}], + 'name': 'ownerOf', + 'outputs': [{'internalType': 'address', 'name': '', 'type': 'address'}], + 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True + }, + { + 'inputs': [], + 'name': 'symbol', + 'outputs': [{'internalType': 'string', 'name': '', 'type': 'string'}], + 'stateMutability': 'view', 'type': 'function', 'constant': True + }, + { + 'inputs': [], + 'name': 'totalSupply', + 'outputs': [{'internalType': 'uint256', 'name': '', 'type': 'uint256'}], + 'stateMutability': 'view', 'type': 'function', 'constant': True + }, +] + +ck_extra_abi = [ + { + 'inputs': [], + 'name': 'pregnantKitties', + 'outputs': [{'name': '', 'type': 'uint256'}], + 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True + }, + { + 'inputs': [{'name': '_kittyId', 'type': 'uint256'}], + 'name': 'isPregnant', + 'outputs': [{'name': '', 'type': 'bool'}], + 'payable': False, 'stateMutability': 'view', 'type': 'function', 'constant': True + } +] + +ck_contract = w3.eth.contract(address=w3.to_checksum_address(ck_token_addr), abi=simplified_abi+ck_extra_abi) +name = ck_contract.functions.name().call() +symbol = ck_contract.functions.symbol().call() +kitties_auctions = ck_contract.functions.balanceOf(acc_address).call() +print(f"{name} [{symbol}] অকশনে থাকা NFTs: {kitties_auctions}") + +pregnant_kitties = ck_contract.functions.pregnantKitties().call() +print(f"{name} [{symbol}] গর্ভবতী NFTs: {pregnant_kitties}") + +# স্থানান্তরিত কিটিদের সম্পর্কে তথ্য পেতে ট্রান্সফার ইভেন্ট ABI ব্যবহার করে। +tx_event_abi = { + 'anonymous': False, + 'inputs': [ + {'indexed': False, 'name': 'from', 'type': 'address'}, + {'indexed': False, 'name': 'to', 'type': 'address'}, + {'indexed': False, 'name': 'tokenId', 'type': 'uint256'}], + 'name': 'Transfer', + 'type': 'event' +} + +# লগগুলি ফিল্টার করার জন্য আমাদের ইভেন্টের স্বাক্ষর প্রয়োজন +event_signature = w3.keccak(text="Transfer(address,address,uint256)").hex() + +logs = w3.eth.get_logs({ + "fromBlock": w3.eth.block_number - 120, + "address": w3.to_checksum_address(ck_token_addr), + "topics": [event_signature] +}) + +# নোট: +# - যদি কোনো ট্রান্সফার ইভেন্ট ফেরত না আসে তাহলে ব্লকের সংখ্যা 120 থেকে বাড়ান। +# - আপনি যদি কোনো ট্রান্সফার ইভেন্ট খুঁজে না পান তাহলে আপনি এখানে একটি টোকেনআইডি পাওয়ার চেষ্টাও করতে পারেন: +# https://etherscan.io/address/0x06012c8cf97BEaD5deAe237070F9587f8E7A266d#events +# ইভেন্টের লগগুলি প্রসারিত করতে ক্লিক করুন এবং এর "tokenId" আর্গুমেন্টটি কপি করুন +recent_tx = [get_event_data(w3.codec, tx_event_abi, log)["args"] for log in logs] + +if recent_tx: + kitty_id = recent_tx[0]['tokenId'] # উপরের লিঙ্ক থেকে "tokenId" এখানে পেস্ট করুন + is_pregnant = ck_contract.functions.isPregnant(kitty_id).call() + print(f"{name} [{symbol}] NFTs {kitty_id} গর্ভবতী: {is_pregnant}") +``` + +CryptoKitties কন্ট্র্যাক্টে স্ট্যান্ডার্ড ইভেন্টগুলি ছাড়াও কিছু আকর্ষণীয় ইভেন্ট রয়েছে। + +আসুন তাদের মধ্যে দুটি পরীক্ষা করি, `Pregnant` এবং `Birth`। + +```python +# নতুন কিটিদের সম্পর্কে তথ্য পেতে Pregnant এবং Birth ইভেন্টের ABI ব্যবহার করে। +ck_extra_events_abi = [ + { + 'anonymous': False, + 'inputs': [ + {'indexed': False, 'name': 'owner', 'type': 'address'}, + {'indexed': False, 'name': 'matronId', 'type': 'uint256'}, + {'indexed': False, 'name': 'sireId', 'type': 'uint256'}, + {'indexed': False, 'name': 'cooldownEndBlock', 'type': 'uint256'}], + 'name': 'Pregnant', + 'type': 'event' + }, + { + 'anonymous': False, + 'inputs': [ + {'indexed': False, 'name': 'owner', 'type': 'address'}, + {'indexed': False, 'name': 'kittyId', 'type': 'uint256'}, + {'indexed': False, 'name': 'matronId', 'type': 'uint256'}, + {'indexed': False, 'name': 'sireId', 'type': 'uint256'}, + {'indexed': False, 'name': 'genes', 'type': 'uint256'}], + 'name': 'Birth', + 'type': 'event' + }] + +# লগগুলি ফিল্টার করার জন্য আমাদের ইভেন্টের স্বাক্ষর প্রয়োজন +ck_event_signatures = [ + w3.keccak(text="Pregnant(address,uint256,uint256,uint256)").hex(), + w3.keccak(text="Birth(address,uint256,uint256,uint256,uint256)").hex(), +] + +# এখানে একটি Pregnant ইভেন্ট রয়েছে: +# - https://etherscan.io/tx/0xc97eb514a41004acc447ac9d0d6a27ea6da305ac8b877dff37e49db42e1f8cef#eventlog +pregnant_logs = w3.eth.get_logs({ + "fromBlock": w3.eth.block_number - 120, + "address": w3.to_checksum_address(ck_token_addr), + "topics": [ck_event_signatures[0]] +}) + +recent_pregnants = [get_event_data(w3.codec, ck_extra_events_abi[0], log)["args"] for log in pregnant_logs] + +# এখানে একটি Birth ইভেন্ট রয়েছে: +# - https://etherscan.io/tx/0x3978028e08a25bb4c44f7877eb3573b9644309c044bf087e335397f16356340a +birth_logs = w3.eth.get_logs({ + "fromBlock": w3.eth.block_number - 120, + "address": w3.to_checksum_address(ck_token_addr), + "topics": [ck_event_signatures[1]] +}) + +recent_births = [get_event_data(w3.codec, ck_extra_events_abi[1], log)["args"] for log in birth_logs] +``` + +## জনপ্রিয় NFT {#popular-nfts} + +- [Etherscan NFT Tracker](https://etherscan.io/nft-top-contracts) স্থানান্তরের ভলিউম অনুসারে ইথেরিয়ামের শীর্ষস্থানীয় NFT-এর তালিকা করে। +- [CryptoKitties](https://www.cryptokitties.co/) হল প্রজননযোগ্য, সংগ্রহযোগ্য এবং অত্যন্ত আরাধ্য প্রাণীদের কেন্দ্র করে একটি গেম, + যাদের আমরা CryptoKitties বলি। +- [Sorare](https://sorare.com/) একটি বিশ্বব্যাপী ফ্যান্টাসি ফুটবল খেলা যেখানে আপনি সীমিত সংস্করণের সংগ্রহযোগ্য জিনিস সংগ্রহ করতে পারেন, + আপনার দল পরিচালনা করতে পারেন এবং পুরস্কার অর্জনের জন্য প্রতিযোগিতা করতে পারেন। +- [The Ethereum Name Service (ENS)](https://ens.domains/) সহজ, মানুষের পাঠযোগ্য নাম ব্যবহার করে ব্লকচেইনের + ভিতরে এবং বাইরে উভয় রিসোর্স অ্যাড্রেস করার জন্য একটি নিরাপদ ও বিকেন্দ্রীভূত উপায় অফার করে। +- [POAP](https://poap.xyz) যারা ইভেন্টে যোগ দেয় বা নির্দিষ্ট কাজ সম্পন্ন করে তাদের বিনামূল্যে NFT সরবরাহ করে। POAP তৈরি এবং বিতরণ করা বিনামূল্যে। +- [Unstoppable Domains](https://unstoppabledomains.com/) হল একটি সান ফ্রান্সিসকো-ভিত্তিক কোম্পানি যা + ব্লকচেইনে ডোমেইন তৈরি করে। ব্লকচেইন ডোমেইনগুলি ক্রিপ্টোকারেন্সি অ্যাড্রেসগুলিকে মানুষের পাঠযোগ্য নাম দিয়ে প্রতিস্থাপন করে এবং সেন্সরশিপ-প্রতিরোধী ওয়েবসাইটগুলিকে + সক্ষম করতে ব্যবহার করা যেতে পারে। +- [Gods Unchained Cards](https://godsunchained.com/) হল Ethereum ব্লকচেইনের একটি TCG যা ইন-গেম অ্যাসেটগুলিতে প্রকৃত মালিকানা আনতে + NFT ব্যবহার করে। +- [Bored Ape Yacht Club](https://boredapeyachtclub.com) হলো ১০,০০০টি অনন্য NFT-এর একটি সংগ্রহ, যা একটি প্রমাণযোগ্য-বিরল শিল্পকর্ম হওয়ার পাশাপাশি ক্লাবের সদস্যপদ টোকেন হিসেবে কাজ করে, যা সদস্যদের জন্য বিভিন্ন সুযোগ-সুবিধা প্রদান করে এবং সম্প্রদায়ের প্রচেষ্টার ফলে সময়ের সাথে সাথে এর সুবিধা বাড়তে থাকে। + +## আরও পড়ুন {#further-reading} + +- [EIP-721: ERC-721 নন-ফাঞ্জিবল টোকেন স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-721) +- [OpenZeppelin - ERC-721 ডকস](https://docs.openzeppelin.com/contracts/3.x/erc721) +- [OpenZeppelin - ERC-721 ইমপ্লিমেন্টেশন](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) +- [Alchemy NFT API](https://www.alchemy.com/docs/reference/nft-api-quickstart) diff --git a/public/content/translations/bn/developers/docs/standards/tokens/erc-777/index.md b/public/content/translations/bn/developers/docs/standards/tokens/erc-777/index.md new file mode 100644 index 00000000000..fff9952c48e --- /dev/null +++ b/public/content/translations/bn/developers/docs/standards/tokens/erc-777/index.md @@ -0,0 +1,45 @@ +--- +title: "ERC-777 টোকেন স্ট্যান্ডার্ড" +description: "ERC-777 সম্পর্কে জানুন, হুকসহ একটি উন্নত ফাঞ্জিবল টোকেন স্ট্যান্ডার্ড, যদিও নিরাপত্তার জন্য ERC-20 সুপারিশ করা হয়।" +lang: bn +--- + +## সতর্কবার্তা {#warning} + +**ERC-777 সঠিকভাবে প্রয়োগ করা কঠিন, কারণ এটি [বিভিন্ন ধরনের আক্রমণের জন্য ঝুঁকিপূর্ণ](https://github.com/OpenZeppelin/openzeppelin-contracts/issues/2620)। এর পরিবর্তে [ERC-20](/developers/docs/standards/tokens/erc-20/) ব্যবহার করার পরামর্শ দেওয়া হচ্ছে।** এই পেজটি একটি ঐতিহাসিক আর্কাইভ হিসেবে রয়ে গেছে। + +## ভূমিকা? {#introduction} + +ERC-777 একটি ফাঞ্জিবল টোকেন স্ট্যান্ডার্ড যা বিদ্যমান [ERC-20](/developers/docs/standards/tokens/erc-20/) স্ট্যান্ডার্ডকে উন্নত করে। + +## পূর্বশর্ত {#prerequisites} + +এই পেজটি আরও ভালোভাবে বোঝার জন্য, আমরা আপনাকে প্রথমে [ERC-20](/developers/docs/standards/tokens/erc-20/) সম্পর্কে পড়ার পরামর্শ দিচ্ছি। + +## ERC-20-এর উপর ERC-777 কী কী উন্নতি প্রস্তাব করে? {#-erc-777-vs-erc-20} + +ERC-777, ERC-20-এর উপর নিম্নলিখিত উন্নতিগুলো প্রদান করে। + +### হুকস {#hooks} + +হুকস হলো একটি ফাংশন যা একটি স্মার্ট কন্ট্র্যাক্টের কোডে বর্ণনা করা থাকে। কন্ট্র্যাক্টের মাধ্যমে টোকেন পাঠানো বা গ্রহণ করা হলে হুকস কল করা হয়। এটি একটি স্মার্ট কন্ট্র্যাক্টকে আগত বা বহির্গামী টোকেনের প্রতি প্রতিক্রিয়া জানাতে অনুমতি দেয়। + +[ERC-1820](https://eips.ethereum.org/EIPS/eip-1820) স্ট্যান্ডার্ড ব্যবহার করে হুকসগুলো রেজিস্টার এবং আবিষ্কার করা হয়। + +#### হুকস কেন দারুণ? {#why-are-hooks-great} + +1. হুকস একটি একক লেনদেনে একটি কন্ট্র্যাক্টে টোকেন পাঠানো এবং কন্ট্র্যাক্টটিকে অবহিত করার অনুমতি দেয়, যা [ERC-20](https://eips.ethereum.org/EIPS/eip-20)-এর মতো নয়, যেখানে এটি অর্জন করার জন্য একটি ডাবল কল (`approve`/`transferFrom`) প্রয়োজন। +2. যেসব কন্ট্র্যাক্ট হুকস রেজিস্টার করেনি সেগুলো ERC-777-এর সাথে বেমানান। গ্রহণকারী কন্ট্র্যাক্টটি একটি হুক রেজিস্টার না করলে প্রেরণকারী কন্ট্র্যাক্ট লেনদেনটি বাতিল করে দেবে। এটি নন-ERC-777 স্মার্ট কন্ট্র্যাক্টে দুর্ঘটনাজনিত ট্রান্সফার প্রতিরোধ করে। +3. হুকস লেনদেন প্রত্যাখ্যান করতে পারে। + +### ডেসিমেল {#decimals} + +এই স্ট্যান্ডার্ডটি ERC-20-তে `decimals`-কে ঘিরে তৈরি হওয়া বিভ্রান্তিরও সমাধান করে। এই স্বচ্ছতা ডেভেলপার অভিজ্ঞতাকে উন্নত করে। + +### ERC-20-এর সাথে পশ্চাৎমুখী সামঞ্জস্য {#backwards-compatibility-with-erc-20} + +ERC-777 কন্ট্র্যাক্টগুলোর সাথে এমনভাবে ইন্টারঅ্যাক্ট করা যেতে পারে যেন তারা ERC-20 কন্ট্র্যাক্ট। + +## আরও পড়ুন {#further-reading} + +[EIP-777: টোকেন স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-777) diff --git a/public/content/translations/bn/developers/docs/standards/tokens/index.md b/public/content/translations/bn/developers/docs/standards/tokens/index.md new file mode 100644 index 00000000000..07874cfbb41 --- /dev/null +++ b/public/content/translations/bn/developers/docs/standards/tokens/index.md @@ -0,0 +1,41 @@ +--- +title: "টোকেন স্ট্যান্ডার্ড" +description: "ফাঞ্জিবল এবং নন-ফাঞ্জিবল টোকেনগুলির জন্য ERC-20, ERC-721, এবং ERC-1155 সহ Ethereum টোকেন স্ট্যান্ডার্ডগুলি এক্সপ্লোর করুন।" +lang: bn +incomplete: true +--- + +## ভূমিকা {#introduction} + +অনেক Ethereum ডেভেলপমেন্ট স্ট্যান্ডার্ড টোকেন ইন্টারফেসের উপর ফোকাস করে। এই স্ট্যান্ডার্ডগুলি স্মার্ট কন্ট্র্যাক্টগুলি যাতে কম্পোজেবল থাকে তা নিশ্চিত করতে সাহায্য করে, তাই যখন কোনো নতুন প্রজেক্ট একটি টোকেন ইস্যু করে, তখন তা বিদ্যমান ডিসেন্ট্রালাইজড এক্সচেঞ্জ এবং অ্যাপ্লিকেশনের সাথে সামঞ্জস্যপূর্ণ থাকে। + +টোকেন স্ট্যান্ডার্ডগুলি নির্ধারণ করে যে টোকেনগুলি কীভাবে Ethereum ইকোসিস্টেম জুড়ে আচরণ করে এবং ইন্টারঅ্যাক্ট করে। এগুলি ডেভেলপারদের জন্য নতুন করে চাকা আবিষ্কার না করেই নির্মাণ করা সহজ করে তোলে, নিশ্চিত করে যে টোকেনগুলি ওয়ালেট, এক্সচেঞ্জ এবং DeFi প্ল্যাটফর্মগুলির সাথে নির্বিঘ্নে কাজ করে। গেমিং, গভর্নেন্স বা অন্যান্য ব্যবহারের ক্ষেত্রে যাই হোক না কেন, এই স্ট্যান্ডার্ডগুলি সামঞ্জস্যতা প্রদান করে এবং Ethereum-কে আরও আন্তঃসংযুক্ত করে তোলে। + +## পূর্বশর্ত {#prerequisites} + +- [Ethereum ডেভেলপমেন্ট স্ট্যান্ডার্ড](/developers/docs/standards/) +- [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) + +## টোকেন স্ট্যান্ডার্ড {#token-standards} + +এখানে Ethereum-এর সবচেয়ে জনপ্রিয় কিছু টোকেন স্ট্যান্ডার্ড রয়েছে: + +- [ERC-20](/developers/docs/standards/tokens/erc-20/) - ফাঞ্জিবল (বিনিময়যোগ্য) টোকেনের জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস, যেমন ভোটিং টোকেন, স্টেকিং টোকেন বা ভার্চুয়াল কারেন্সি। + +### NFT স্ট্যান্ডার্ড {#nft-standards} + +- [ERC-721](/developers/docs/standards/tokens/erc-721/) - নন-ফাঞ্জিবল টোকেনের জন্য একটি স্ট্যান্ডার্ড ইন্টারফেস, যেমন কোনো শিল্পকর্ম বা গানের দলিল। +- [ERC-1155](/developers/docs/standards/tokens/erc-1155/) - ERC-1155 আরও দক্ষ ট্রেড এবং লেনদেনের বান্ডলিংয়ের অনুমতি দেয় – এইভাবে খরচ সাশ্রয় হয়। এই টোকেন স্ট্যান্ডার্ডটি ইউটিলিটি টোকেন (যেমন $BNB বা $BAT) এবং ক্রিপ্টোপাঙ্কসের মতো নন-ফাঞ্জিবল টোকেন উভয়ই তৈরি করার অনুমতি দেয়। + +[ERC](https://eips.ethereum.org/erc) প্রস্তাবগুলির সম্পূর্ণ তালিকা। + +## আরও পড়ুন {#further-reading} + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত টিউটোরিয়াল {#related-tutorials} + +- [টোকেন ইন্টিগ্রেশন চেকলিস্ট](/developers/tutorials/token-integration-checklist/) _– টোকেনগুলির সাথে ইন্টারঅ্যাক্ট করার সময় বিবেচনা করার মতো বিষয়গুলির একটি চেকলিস্ট।_ +- [ERC20 টোকেন স্মার্ট কন্ট্র্যাক্ট বুঝুন](/developers/tutorials/understand-the-erc-20-token-smart-contract/) _– একটি Ethereum টেস্ট নেটওয়ার্কে আপনার প্রথম স্মার্ট কন্ট্র্যাক্ট স্থাপন করার একটি ভূমিকা।_ +- [একটি সলিডিটি স্মার্ট কন্ট্র্যাক্ট থেকে ERC20 টোকেনগুলির স্থানান্তর এবং অনুমোদন](/developers/tutorials/transfers-and-approval-of-erc-20-tokens-from-a-solidity-smart-contract/) _– সলিডিটি ভাষা ব্যবহার করে একটি টোকেনের সাথে ইন্টারঅ্যাক্ট করার জন্য কীভাবে একটি স্মার্ট কন্ট্র্যাক্ট ব্যবহার করবেন।_ +- [একটি ERC721 মার্কেট বাস্তবায়ন করা [একটি কীভাবে-করবেন গাইড]](/developers/tutorials/how-to-implement-an-erc721-market/) _– কীভাবে একটি ডিসেন্ট্রালাইজড ক্লাসিফাইড বোর্ডে বিক্রয়ের জন্য টোকেনাইজড আইটেম রাখতে হয়।_ diff --git a/public/content/translations/bn/developers/docs/storage/index.md b/public/content/translations/bn/developers/docs/storage/index.md new file mode 100644 index 00000000000..6e1902f018b --- /dev/null +++ b/public/content/translations/bn/developers/docs/storage/index.md @@ -0,0 +1,216 @@ +--- +title: "বিকেন্দ্রীভূত স্টোরেজ" +description: "বিকেন্দ্রীভূত স্টোরেজ কী এবং একটি ডিএ্যাপ-এ এটিকে সংযুক্ত করার জন্য উপলব্ধ টুলসের সংক্ষিপ্ত বিবরণ।" +lang: bn +--- + +একটি একক কোম্পানি বা সংস্থা দ্বারা পরিচালিত একটি কেন্দ্রীভূত সার্ভারের বিপরীতে, বিকেন্দ্রীভূত স্টোরেজ সিস্টেমগুলি ব্যবহারকারী-অপারেটরদের একটি পিয়ার-টু-পিয়ার নেটওয়ার্ক নিয়ে গঠিত যারা সামগ্রিক ডেটার একটি অংশ ধরে রাখে, একটি স্থিতিস্থাপক ফাইল স্টোরেজ শেয়ারিং সিস্টেম তৈরি করে। এগুলি একটি ব্লকচেইন-ভিত্তিক অ্যাপ্লিকেশন বা যেকোনো পিয়ার-টু-পিয়ার-ভিত্তিক নেটওয়ার্কে থাকতে পারে। + +Ethereum নিজেই একটি বিকেন্দ্রীভূত স্টোরেজ সিস্টেম হিসেবে ব্যবহার করা যেতে পারে, এবং সমস্ত স্মার্ট কন্ট্র্যাক্টে কোড স্টোরেজের ক্ষেত্রে এটি তাই। তবে, যখন বিপুল পরিমাণ ডেটার কথা আসে, Ethereum সেটির জন্য ডিজাইন করা হয়নি। চেইনটি ক্রমাগত বৃদ্ধি পাচ্ছে, কিন্তু লেখার সময়, Ethereum চেইনটি প্রায় 500GB - 1TB ([ক্লায়েন্টের উপর নির্ভর করে](https://etherscan.io/chartsync/chaindefault)), এবং নেটওয়ার্কের প্রতিটি নোডকে সমস্ত ডেটা স্টোর করতে সক্ষম হতে হবে। যদি চেইনটি বিপুল পরিমাণ ডেটা (ধরা যাক 5TB) পর্যন্ত প্রসারিত হয়, তবে সমস্ত নোডের জন্য তা চালানো সম্ভব হবে না। এছাড়াও, মেইননেটে এত ডেটা স্থাপন করার খরচ [গ্যাস](/developers/docs/gas) ফি-এর কারণে অত্যধিক ব্যয়বহুল হবে। + +এই সীমাবদ্ধতার কারণে, বিকেন্দ্রীভূত উপায়ে বিপুল পরিমাণ ডেটা স্টোর করার জন্য আমাদের একটি ভিন্ন চেইন বা পদ্ধতির প্রয়োজন। + +বিকেন্দ্রীভূত স্টোরেজ (dStorage) বিকল্পগুলি দেখার সময়, একজন ব্যবহারকারীকে কয়েকটি বিষয় মনে রাখতে হবে। + +- স্থায়িত্ব ব্যবস্থা / প্রণোদনা কাঠামো +- ডেটা ধারণ প্রয়োগ +- বিকেন্দ্রীকরণ +- কনসেন্সাস + +## স্থায়িত্ব ব্যবস্থা / প্রণোদনা কাঠামো {#persistence-mechanism} + +### ব্লকচেইন-ভিত্তিক {#blockchain-based} + +ডেটার একটি অংশকে চিরকাল স্থায়ী করার জন্য, আমাদের একটি স্থায়িত্ব ব্যবস্থা ব্যবহার করতে হবে। উদাহরণস্বরূপ, Ethereum-এ, স্থায়িত্ব ব্যবস্থাটি হল যে একটি নোড চালানোর সময় পুরো চেইনটিকে বিবেচনায় নিতে হবে। ডেটার নতুন অংশগুলি চেইনের শেষে যুক্ত হয়, এবং এটি বাড়তে থাকে - যার জন্য প্রতিটি নোডকে সমস্ত এমবেডেড ডেটা প্রতিলিপি করতে হয়। + +এটি **ব্লকচেইন-ভিত্তিক** স্থায়িত্ব হিসাবে পরিচিত। + +ব্লকচেইন-ভিত্তিক স্থায়িত্বের সমস্যা হল যে চেইনটি রক্ষণাবেক্ষণ এবং সমস্ত ডেটা সম্ভাব্যভাবে স্টোর করার জন্য অনেক বড় হয়ে যেতে পারে (যেমন, [অনেক সূত্র](https://healthit.com.au/how-big-is-the-internet-and-how-do-we-measure-it/) অনুমান করে যে ইন্টারনেটের জন্য 40 জেটা বাইটের বেশি স্টোরেজ ক্ষমতা প্রয়োজন)। + +ব্লকচেইনে অবশ্যই কোনো ধরনের প্রণোদনা কাঠামো থাকতে হবে। ব্লকচেইন-ভিত্তিক স্থায়িত্বের জন্য, ভ্যালিডেটরকে একটি অর্থ প্রদান করা হয়। যখন ডেটা চেইনে যোগ করা হয়, ভ্যালিডেটরদের ডেটা যোগ করার জন্য অর্থ প্রদান করা হয়। + +ব্লকচেইন-ভিত্তিক স্থায়িত্ব সহ প্ল্যাটফর্ম: + +- ইথেরিয়াম +- [Arweave](https://www.arweave.org/) + +### চুক্তি-ভিত্তিক {#contract-based} + +**চুক্তি-ভিত্তিক** স্থায়িত্বের অন্তর্নিহিত ধারণাটি হলো যে ডেটা প্রতিটি নোড দ্বারা প্রতিলিপি করা যায় না এবং চিরতরে স্টোর করা যায় না, এবং এর পরিবর্তে অবশ্যই চুক্তিভিত্তিক চুক্তির মাধ্যমে রক্ষণাবেক্ষণ করতে হবে। এগুলি একাধিক নোডের সাথে করা চুক্তি, যারা একটি নির্দিষ্ট সময়ের জন্য ডেটার একটি অংশ ধরে রাখার প্রতিশ্রুতি দিয়েছে। ডেটা স্থায়ী রাখার জন্য যখনই এগুলির মেয়াদ শেষ হয়ে যায়, তখন অবশ্যই ফেরত বা নবায়ন করতে হবে। + +বেশিরভাগ ক্ষেত্রে, সমস্ত ডেটা অনচেইনে স্টোর করার পরিবর্তে, চেইনে ডেটা কোথায় অবস্থিত তার হ্যাস স্টোর করা হয়। এইভাবে, পুরো চেইনকে সমস্ত ডেটা রাখার জন্য স্কেল করার প্রয়োজন হয় না। + +চুক্তি-ভিত্তিক স্থায়িত্ব সহ প্ল্যাটফর্ম: + +- [Filecoin](https://docs.filecoin.io/basics/what-is-filecoin) +- [Skynet](https://sia.tech/) +- [Storj](https://storj.io/) +- [Züs](https://zus.network/) +- [Crust Network](https://crust.network) +- [Swarm](https://www.ethswarm.org/) +- [4EVERLAND](https://www.4everland.org/) + +### অতিরিক্ত বিবেচনা {#additional-consideration} + +IPFS হল ফাইল, ওয়েবসাইট, অ্যাপ্লিকেশন এবং ডেটা স্টোর এবং অ্যাক্সেস করার জন্য একটি বিতরণকৃত সিস্টেম। এটির কোনো অন্তর্নির্মিত প্রণোদনা প্রকল্প নেই, কিন্তু এর পরিবর্তে দীর্ঘমেয়াদী স্থায়িত্বের জন্য উপরের যেকোনো চুক্তি-ভিত্তিক প্রণোদনা সমাধানের সাথে ব্যবহার করা যেতে পারে। IPFS-এ ডেটা স্থায়ী করার আরেকটি উপায় হল একটি পিনিং পরিষেবার সাথে কাজ করা, যা আপনার জন্য আপনার ডেটা "পিন" করবে। আপনি এমনকি নিজের IPFS নোড চালাতে পারেন এবং বিনামূল্যে আপনার এবং/অথবা অন্যদের ডেটা স্থায়ী করতে নেটওয়ার্কে অবদান রাখতে পারেন! + +- [IPFS](https://docs.ipfs.io/concepts/what-is-ipfs/) +- [Pinata](https://www.pinata.cloud/) _(IPFS পিনিং পরিষেবা)_ +- [web3.storage](https://web3.storage/) _(IPFS/Filecoin পিনিং পরিষেবা)_ +- [Infura](https://infura.io/product/ipfs) _(IPFS পিনিং পরিষেবা)_ +- [IPFS Scan](https://ipfs-scan.io) _(IPFS পিনিং এক্সপ্লোরার)_ +- [4EVERLAND](https://www.4everland.org/)_(IPFS পিনিং পরিষেবা)_ +- [Filebase](https://filebase.com) _(IPFS পিনিং পরিষেবা)_ +- [Spheron Network](https://spheron.network/) _(IPFS/Filecoin পিনিং পরিষেবা)_ + +SWARM হল একটি বিকেন্দ্রীভূত ডেটা স্টোরেজ এবং বিতরণ প্রযুক্তি, একটি স্টোরেজ প্রণোদনা সিস্টেম এবং একটি স্টোরেজ ভাড়া মূল্য ওরাকল সহ। + +## ডেটা ধারণ {#data-retention} + +ডেটা ধরে রাখার জন্য, সিস্টেমগুলিতে অবশ্যই ডেটা ধরে রাখা নিশ্চিত করার জন্য কোনো ধরনের ব্যবস্থা থাকতে হবে। + +### চ্যালেঞ্জ ব্যবস্থা {#challenge-mechanism} + +ডেটা ধরে রাখা নিশ্চিত করার অন্যতম জনপ্রিয় উপায় হল কোনো ধরনের ক্রিপ্টোগ্রাফিক চ্যালেঞ্জ ব্যবহার করা, যা নোডগুলিকে জারি করা হয় তা নিশ্চিত করার জন্য যে তাদের কাছে এখনও ডেটা রয়েছে। একটি সহজ উদাহরণ হল Arweave-এর প্রুফ-অফ-অ্যাক্সেস। তারা নোডগুলিকে একটি চ্যালেঞ্জ জারি করে দেখার জন্য যে তাদের কাছে সবচেয়ে সাম্প্রতিক ব্লক এবং অতীতের একটি র‍্যান্ডম ব্লকের ডেটা আছে কিনা। যদি নোডটি উত্তর দিতে না পারে, তবে তাদেরকে জরিমানা করা হয়। + +একটি চ্যালেঞ্জ ব্যবস্থা সহ dStorage-এর প্রকারভেদ: + +- Züs +- Skynet +- Arweave +- Filecoin +- Crust Network +- 4EVERLAND + +### বিকেন্দ্রীকরণ {#decentrality} + +প্ল্যাটফর্মগুলির বিকেন্দ্রীকরণের স্তর পরিমাপ করার জন্য দুর্দান্ত কোনো টুল নেই, কিন্তু সাধারণভাবে, আপনি এমন টুলস ব্যবহার করতে চাইবেন যেগুলিতে কোনো ধরনের KYC নেই, প্রমাণ দেওয়ার জন্য যে সেগুলি কেন্দ্রীভূত নয়। + +KYC ছাড়া বিকেন্দ্রীভূত টুলস: + +- Skynet +- Arweave +- Filecoin +- IPFS +- ইথেরিয়াম +- Crust Network +- 4EVERLAND + +### কনসেন্সাস {#consensus} + +এই টুলগুলির বেশিরভাগেরই নিজস্ব [কনসেন্সাস মেকানিজম](/developers/docs/consensus-mechanisms/) রয়েছে, কিন্তু সাধারণত সেগুলি [**প্রুফ-অফ-ওয়ার্ক (PoW)**](/developers/docs/consensus-mechanisms/pow/) বা [**প্রুফ-অফ-স্টেক (PoS)**](/developers/docs/consensus-mechanisms/pos/)-এর উপর ভিত্তি করে তৈরি। + +প্রুফ-অফ-ওয়ার্ক ভিত্তিক: + +- Skynet +- Arweave + +প্রুফ-অফ-স্টেক ভিত্তিক: + +- ইথেরিয়াম +- Filecoin +- Züs +- Crust Network + +## সম্পর্কিত টুলস {#related-tools} + +**IPFS - _ইন্টারপ্ল্যানেটারি ফাইল সিস্টেম হল Ethereum-এর জন্য একটি বিকেন্দ্রীভূত স্টোরেজ ও ফাইল রেফারেন্সিং সিস্টেম।_** + +- [Ipfs.io](https://ipfs.io/) +- [নথিপত্র](https://docs.ipfs.io/) +- [GitHub](https://github.com/ipfs/ipfs) + +**Storj DCS - _ডেভেলপারদের জন্য নিরাপদ, ব্যক্তিগত এবং S3-সামঞ্জস্যপূর্ণ বিকেন্দ্রীভূত ক্লাউড অবজেক্ট স্টোরেজ।_** + +- [Storj.io](https://storj.io/) +- [নথিপত্র](https://docs.storj.io/) +- [GitHub](https://github.com/storj/storj) + +**Sia - _একটি বিশ্বাসহীন ক্লাউড স্টোরেজ মার্কেটপ্লেস তৈরি করতে ক্রিপ্টোগ্রাফি ব্যবহার করে, ক্রেতা এবং বিক্রেতাদের সরাসরি লেনদেন করার অনুমতি দেয়।_** + +- [Skynet.net](https://sia.tech/) +- [নথিপত্র](https://docs.sia.tech/) +- [GitHub](https://github.com/SiaFoundation/) + +**Filecoin - _Filecoin তৈরি করেছে IPFS-এর পেছনের একই দল। এটি IPFS আদর্শের উপরে একটি প্রণোদনা লেয়ার।_** + +- [Filecoin.io](https://filecoin.io/) +- [নথিপত্র](https://docs.filecoin.io/) +- [GitHub](https://github.com/filecoin-project/) + +**Arweave - _Arweave ডেটা স্টোর করার জন্য একটি dStorage প্ল্যাটফর্ম।_** + +- [Arweave.org](https://www.arweave.org/) +- [নথিপত্র](https://docs.arweave.org/info/) +- [Arweave](https://github.com/ArweaveTeam/arweave/) + +**Züs - _Züs হল শার্ডিং এবং ব্লবার সহ একটি প্রুফ-অফ-স্টেক dStorage প্ল্যাটফর্ম।_** + +- [zus.network](https://zus.network/) +- [নথিপত্র](https://docs.zus.network/zus-docs/) +- [GitHub](https://github.com/0chain/) + +**Crust Network - _Crust হল IPFS-এর উপরে একটি dStorage প্ল্যাটফর্ম।_** + +- [Crust.network](https://crust.network) +- [নথিপত্র](https://wiki.crust.network) +- [GitHub](https://github.com/crustio) + +**Swarm - _Ethereum web3 স্ট্যাকের জন্য একটি বন্টিত স্টোরেজ প্ল্যাটফর্ম ও বিষয়বস্তু বণ্টন পরিষেবা।_** + +- [EthSwarm.org](https://www.ethswarm.org/) +- [নথিপত্র](https://docs.ethswarm.org/) +- [GitHub](https://github.com/ethersphere/) + +**OrbitDB - _IPFS-এর উপর একটি বিকেন্দ্রীভূত পিয়ার টু পিয়ার ডেটাবেস।_** + +- [OrbitDB.org](https://orbitdb.org/) +- [নথিপত্র](https://github.com/orbitdb/field-manual/) +- [GitHub](https://github.com/orbitdb/orbit-db/) + +**Aleph.im - _বিকেন্দ্রীভূত ক্লাউড প্রকল্প (ডাটাবেস, ফাইল স্টোরেজ, কম্পিউটিং এবং DID)। অফচেইন এবং অনচেইন পিয়ার-টু-পিয়ার প্রযুক্তির একটি অনন্য মিশ্রণ। IPFS এবং মাল্টি-চেইন সামঞ্জস্য।_** + +- [Aleph.im](https://aleph.cloud/) +- [নথিপত্র](https://docs.aleph.cloud/) +- [GitHub](https://github.com/aleph-im/) + +**Ceramic - _ডেটা-সমৃদ্ধ এবং আকর্ষক অ্যাপ্লিকেশনের জন্য ব্যবহারকারী-নিয়ন্ত্রিত IPFS ডাটাবেস স্টোরেজ।_** + +- [Ceramic.network](https://ceramic.network/) +- [নথিপত্র](https://developers.ceramic.network/) +- [GitHub](https://github.com/ceramicnetwork/js-ceramic/) + +**Filebase - _S3-সামঞ্জস্যপূর্ণ বিকেন্দ্রীভূত স্টোরেজ এবং জিও-রিডান্ড্যান্ট IPFS পিনিং পরিষেবা। Filebase-এর মাধ্যমে IPFS-এ আপলোড করা সমস্ত ফাইল বিশ্বজুড়ে 3x প্রতিলিপিসহ Filebase পরিকাঠামোতে স্বয়ংক্রিয়ভাবে পিন করা হয়।_** + +- [Filebase.com](https://filebase.com/) +- [নথিপত্র](https://docs.filebase.com/) +- [GitHub](https://github.com/filebase) + +**4EVERLAND - _একটি Web 3.0 ক্লাউড কম্পিউটিং প্ল্যাটফর্ম যা স্টোরেজ, কম্পিউট এবং নেটওয়ার্কিং মূল ক্ষমতাগুলিকে একীভূত করে, S3 সামঞ্জস্যপূর্ণ এবং IPFS ও Arweave-এর মতো বিকেন্দ্রীভূত স্টোরেজ নেটওয়ার্কগুলিতে সিঙ্ক্রোনাস ডেটা স্টোরেজ সরবরাহ করে।_** + +- [4everland.org](https://www.4everland.org/) +- [নথিপত্র](https://docs.4everland.org/) +- [GitHub](https://github.com/4everland) + +**Kaleido - _ক্লিক-বাটন IPFS নোড সহ একটি ব্লকচেইন-অ্যাজ-এ-সার্ভিস প্ল্যাটফর্ম_** + +- [Kaleido](https://kaleido.io/) +- [নথিপত্র](https://docs.kaleido.io/kaleido-services/ipfs/) +- [GitHub](https://github.com/kaleido-io) + +**Spheron Network - _Spheron হল একটি প্ল্যাটফর্ম-অ্যাজ-এ-সার্ভিস (PaaS) যা ডিএ্যাপস-এর জন্য ডিজাইন করা হয়েছে যা তাদের অ্যাপ্লিকেশনগুলিকে সেরা পারফরম্যান্স সহ বিকেন্দ্রীভূত ইনফ্রাতে লঞ্চ করতে চায়। এটি কম্পিউট, বিকেন্দ্রীভূত স্টোরেজ, CDN এবং ওয়েব হোস্টিং আউট অফ দ্য বক্স সরবরাহ করে।_** + +- [spheron.network](https://spheron.network/) +- [নথিপত্র](https://docs.spheron.network/) +- [GitHub](https://github.com/spheronFdn) + +## আরও পড়ুন {#further-reading} + +- [বিকেন্দ্রীভূত স্টোরেজ কী?](https://coinmarketcap.com/academy/article/what-is-decentralized-storage-a-deep-dive-by-filecoin) - _CoinMarketCap_ +- [বিকেন্দ্রীভূত স্টোরেজ সম্পর্কে পাঁচটি সাধারণ মিথের অবসান](https://www.storj.io/blog/busting-five-common-myths-about-decentralized-storage) - _Storj_ + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [ডেভেলপমেন্ট ফ্রেমওয়ার্ক](/developers/docs/frameworks/) diff --git a/public/content/translations/bn/developers/docs/transactions/index.md b/public/content/translations/bn/developers/docs/transactions/index.md new file mode 100644 index 00000000000..c04ca9eb1d0 --- /dev/null +++ b/public/content/translations/bn/developers/docs/transactions/index.md @@ -0,0 +1,233 @@ +--- +title: "লেনদেনসমূহ" +description: "ইথেরিয়াম লেনদেনের একটি সংক্ষিপ্ত বিবরণ – এটি কীভাবে কাজ করে, তাদের ডেটা কাঠামো, এবং কীভাবে একটি অ্যাপ্লিকেশনের মাধ্যমে সেগুলি পাঠাতে হয়।" +lang: bn +--- + +লেনদেন হল অ্যাকাউন্ট থেকে ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত নির্দেশাবলী। একটি অ্যাকাউন্ট ইথেরিয়াম নেটওয়ার্কের স্টেট আপডেট করার জন্য একটি লেনদেন শুরু করবে। সবচেয়ে সহজ লেনদেন হল এক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে ETH স্থানান্তর করা। + +## পূর্বশর্ত {#prerequisites} + +এই পৃষ্ঠাটি আপনাকে আরও ভালোভাবে বুঝতে সাহায্য করার জন্য, আমরা সুপারিশ করি যে আপনি প্রথমে [অ্যাকাউন্ট](/developers/docs/accounts/) এবং আমাদের [ইথেরিয়ামের পরিচিতি](/developers/docs/intro-to-ethereum/) পড়ুন। + +## লেনদেন কী? {#whats-a-transaction} + +একটি ইথেরিয়াম লেনদেন বলতে একটি বাহ্যিকভাবে-মালিকানাধীন অ্যাকাউন্ট দ্বারা শুরু করা একটি ক্রিয়াকে বোঝায়, অন্য কথায় একটি মানুষের দ্বারা পরিচালিত অ্যাকাউন্ট, কোনো চুক্তি নয়। উদাহরণস্বরূপ, যদি বব অ্যালিসকে 1 ETH পাঠায়, ববের অ্যাকাউন্ট থেকে ডেবিট করতে হবে এবং অ্যালিসের অ্যাকাউন্টে ক্রেডিট করতে হবে। এই স্টেট-পরিবর্তনকারী ক্রিয়াটি একটি লেনদেনের মধ্যে সঞ্চালিত হয়। + +![লেনদেনের কারণ স্টেট পরিবর্তনের চিত্র](./tx.png) +_[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf) থেকে অভিযোজিত চিত্র_ + +লেনদেন, যা EVM-এর স্টেট পরিবর্তন করে, সেগুলিকে পুরো নেটওয়ার্কে সম্প্রচার করা প্রয়োজন। যেকোনো নোড EVM-এ একটি লেনদেন কার্যকর করার জন্য একটি অনুরোধ সম্প্রচার করতে পারে; এটি ঘটার পরে, একজন ভ্যালিডেটর লেনদেনটি কার্যকর করবে এবং ফলস্বরূপ স্টেট পরিবর্তনটি নেটওয়ার্কের বাকি অংশে প্রচার করবে। + +লেনদেনের জন্য একটি ফি প্রয়োজন এবং একটি বৈধ ব্লকে অন্তর্ভুক্ত থাকতে হবে। এই সংক্ষিপ্ত বিবরণটিকে সহজ করার জন্য আমরা অন্য কোথাও গ্যাস ফি এবং যাচাইকরণ কভার করব। + +একটি জমা দেওয়া লেনদেনে নিম্নলিখিত তথ্য অন্তর্ভুক্ত থাকে: + +- `from` – প্রেরকের ঠিকানা, যিনি লেনদেনে স্বাক্ষর করবেন। এটি একটি বাহ্যিকভাবে-মালিকানাধীন অ্যাকাউন্ট হবে কারণ চুক্তি অ্যাকাউন্টগুলি লেনদেন পাঠাতে পারে না +- `to` – গ্রহণকারীর ঠিকানা (যদি একটি বাহ্যিকভাবে-মালিকানাধীন অ্যাকাউন্ট হয়, লেনদেনটি মান স্থানান্তর করবে। যদি একটি চুক্তি অ্যাকাউন্ট হয়, লেনদেনটি চুক্তির কোড কার্যকর করবে) +- `signature` – প্রেরকের শনাক্তকারী। এটি তৈরি হয় যখন প্রেরকের ব্যক্তিগত কী লেনদেনে স্বাক্ষর করে এবং নিশ্চিত করে যে প্রেরক এই লেনদেনের অনুমোদন দিয়েছেন +- `nonce` - একটি ক্রমানুসারে ক্রমবর্ধমান কাউন্টার যা অ্যাকাউন্ট থেকে লেনদেন নম্বর নির্দেশ করে +- `value` – প্রেরক থেকে প্রাপকের কাছে স্থানান্তরের জন্য ETH-এর পরিমাণ (WEI-তে চিহ্নিত, যেখানে 1ETH সমান 1e+18wei) +- `input data` – ঐচ্ছিক ডেটা অন্তর্ভুক্ত করার জন্য ঐচ্ছিক ফিল্ড +- `gasLimit` – লেনদেনের দ্বারা ব্যবহার করা যেতে পারে এমন গ্যাস ইউনিটের সর্বোচ্চ পরিমাণ। [EVM](/developers/docs/evm/opcodes) প্রতিটি গণনামূলক ধাপের জন্য প্রয়োজনীয় গ্যাস ইউনিট নির্দিষ্ট করে +- `maxPriorityFeePerGas` - ভ্যালিডেটরের জন্য একটি টিপ হিসাবে অন্তর্ভুক্ত করার জন্য ব্যবহৃত গ্যাসের সর্বোচ্চ মূল্য +- `maxFeePerGas` - লেনদেনের জন্য প্রতি ইউনিট গ্যাসের সর্বোচ্চ ফি দিতে ইচ্ছুক (`baseFeePerGas` এবং `maxPriorityFeePerGas` সহ) + +গ্যাস হল একটি ভ্যালিডেটর দ্বারা লেনদেন প্রক্রিয়া করার জন্য প্রয়োজনীয় গণনার একটি রেফারেন্স। ব্যবহারকারীদের এই গণনার জন্য একটি ফি দিতে হবে। `gasLimit` এবং `maxPriorityFeePerGas` ভ্যালিডেটরকে দেওয়া সর্বোচ্চ লেনদেন ফি নির্ধারণ করে। [গ্যাস সম্পর্কে আরও জানুন](/developers/docs/gas/)। + +লেনদেন অবজেক্টটি দেখতে কিছুটা এরকম হবে: + +```js +{ + from: "0xEA674fdDe714fd979de3EdF0F56AA9716B898ec8", + to: "0xac03bb73b6a9e108530aff4df5077c2b3d481e5a", + gasLimit: "21000", + maxFeePerGas: "300", + maxPriorityFeePerGas: "10", + nonce: "0", + value: "10000000000" +} +``` + +কিন্তু একটি লেনদেন অবজেক্টকে প্রেরকের ব্যক্তিগত কী ব্যবহার করে স্বাক্ষর করতে হবে। এটি প্রমাণ করে যে লেনদেনটি শুধুমাত্র প্রেরকের কাছ থেকে আসতে পারে এবং প্রতারণামূলকভাবে পাঠানো হয়নি। + +Geth-এর মতো একটি ইথেরিয়াম ক্লায়েন্ট এই স্বাক্ষর প্রক্রিয়াটি পরিচালনা করবে। + +উদাহরণ [JSON-RPC](/developers/docs/apis/json-rpc) কল: + +```json +{ + "id": 2, + "jsonrpc": "2.0", + "method": "account_signTransaction", + "params": [ + { + "from": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db", + "gas": "0x55555", + "maxFeePerGas": "0x1234", + "maxPriorityFeePerGas": "0x1234", + "input": "0xabcd", + "nonce": "0x0", + "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0", + "value": "0x1234" + } + ] +} +``` + +উদাহরণ প্রতিক্রিয়া: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "result": { + "raw": "0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663", + "tx": { + "nonce": "0x0", + "maxFeePerGas": "0x1234", + "maxPriorityFeePerGas": "0x1234", + "gas": "0x55555", + "to": "0x07a565b7ed7d7a678680a4c162885bedbb695fe0", + "value": "0x1234", + "input": "0xabcd", + "v": "0x26", + "r": "0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e", + "s": "0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663", + "hash": "0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e" + } + } +} +``` + +- `raw` হল [রিকার্সিভ লেংথ প্রিফিক্স (RLP)](/developers/docs/data-structures-and-encoding/rlp) এনকোডেড ফর্মের স্বাক্ষরিত লেনদেন +- `tx` হল JSON ফর্মের স্বাক্ষরিত লেনদেন + +স্বাক্ষর হ্যাসের মাধ্যমে, লেনদেনটি ক্রিপ্টোগ্রাফিকভাবে প্রমাণ করা যেতে পারে যে এটি প্রেরকের কাছ থেকে এসেছে এবং নেটওয়ার্কে জমা দেওয়া হয়েছে। + +### ডেটা ফিল্ড {#the-data-field} + +বেশিরভাগ লেনদেন একটি বাহ্যিকভাবে-মালিকানাধীন অ্যাকাউন্ট থেকে একটি চুক্তিতে অ্যাক্সেস করে। +বেশিরভাগ চুক্তি Solidity-তে লেখা হয় এবং [অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI)](/glossary/#abi) অনুসারে তাদের ডেটা ফিল্ড ব্যাখ্যা করে। + +প্রথম চারটি বাইট নির্দিষ্ট করে যে কোন ফাংশনটি কল করতে হবে, ফাংশনের নাম এবং আর্গুমেন্টের হ্যাস ব্যবহার করে। +আপনি মাঝে মাঝে [এই ডাটাবেসটি](https://www.4byte.directory/signatures/) ব্যবহার করে নির্বাচক থেকে ফাংশনটি সনাক্ত করতে পারেন। + +বাকি কলডেটা হল আর্গুমেন্ট, [ABI স্পেসিফিকেশনে নির্দিষ্ট করা হিসাবে এনকোড করা হয়েছে](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding)। + +উদাহরণস্বরূপ, আসুন [এই লেনদেনটি](https://etherscan.io/tx/0xd0dcbe007569fcfa1902dae0ab8b4e078efe42e231786312289b1eee5590f6a1) দেখি। +কলডেটা দেখতে **আরো দেখতে ক্লিক করুন** ব্যবহার করুন। + +ফাংশন নির্বাচকটি হল `0xa9059cbb`। এই স্বাক্ষর সহ বেশ কয়েকটি [পরিচিত ফাংশন](https://www.4byte.directory/signatures/?bytes4_signature=0xa9059cbb) রয়েছে। +এই ক্ষেত্রে [চুক্তির উৎস কোড](https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#code) Etherscan-এ আপলোড করা হয়েছে, তাই আমরা জানি ফাংশনটি হল `transfer(address,uint256)`। + +বাকি ডেটা হল: + +``` +0000000000000000000000004f6742badb049791cd9a37ea913f2bac38d01279 +000000000000000000000000000000000000000000000000000000003b0559f4 +``` + +ABI স্পেসিফিকেশন অনুযায়ী, পূর্ণসংখ্যার মান (যেমন ঠিকানা, যা 20-বাইট পূর্ণসংখ্যা) ABI-তে 32-বাইট শব্দ হিসাবে প্রদর্শিত হয়, সামনে শূন্য দিয়ে প্যাড করা হয়। +সুতরাং আমরা জানি যে `to` ঠিকানাটি হল [`4f6742badb049791cd9a37ea913f2bac38d01279`](https://etherscan.io/address/0x4f6742badb049791cd9a37ea913f2bac38d01279)। +`value` হল 0x3b0559f4 = 990206452। + +## লেনদেনের প্রকার {#types-of-transactions} + +ইথেরিয়ামে কয়েক ধরনের লেনদেন রয়েছে: + +- নিয়মিত লেনদেন: এক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে একটি লেনদেন। +- চুক্তি স্থাপনার লেনদেন: একটি 'to' ঠিকানা ছাড়া একটি লেনদেন, যেখানে ডেটা ফিল্ড চুক্তির কোডের জন্য ব্যবহৃত হয়। +- একটি চুক্তির সম্পাদন: একটি লেনদেন যা একটি স্থাপন করা স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করে। এই ক্ষেত্রে, 'to' ঠিকানাটি হল স্মার্ট কন্ট্র্যাক্টের ঠিকানা। + +### গ্যাসের উপর {#on-gas} + +উল্লিখিত হিসাবে, লেনদেন সম্পাদনের জন্য [গ্যাস](/developers/docs/gas/) খরচ হয়। সাধারণ স্থানান্তর লেনদেনের জন্য 21000 ইউনিট গ্যাস প্রয়োজন। + +সুতরাং ববকে অ্যালিসকে 1 ETH পাঠাতে 190 gwei-এর একটি `baseFeePerGas` এবং 10 gwei-এর একটি `maxPriorityFeePerGas`-এ, ববকে নিম্নলিখিত ফি দিতে হবে: + +``` +(190 + 10) * 21000 = 4,200,000 gwei +--অথবা-- +0.0042 ETH +``` + +ববের অ্যাকাউন্ট ডেবিট হবে **-1.0042 ETH** (অ্যালিসের জন্য 1 ETH + গ্যাস ফিতে 0.0042 ETH) + +অ্যালিসের অ্যাকাউন্ট ক্রেডিট হবে **+1.0 ETH** + +বেস ফি পুড়িয়ে ফেলা হবে **-0.00399 ETH** + +ভ্যালিডেটর টিপ রাখে **+0.000210 ETH** + +![অব্যবহৃত গ্যাস কীভাবে ফেরত দেওয়া হয় তা দেখানো ডায়াগ্রাম](./gas-tx.png) +_[Ethereum EVM illustrated](https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf) থেকে অভিযোজিত ডায়াগ্রাম_ + +একটি লেনদেনে ব্যবহৃত না হওয়া যেকোনো গ্যাস ব্যবহারকারীর অ্যাকাউন্টে ফেরত দেওয়া হয়। + +### স্মার্ট কন্ট্র্যাক্ট মিথস্ক্রিয়া {#smart-contract-interactions} + +একটি স্মার্ট কন্ট্র্যাক্ট জড়িত যেকোনো লেনদেনের জন্য গ্যাস প্রয়োজন। + +স্মার্ট কন্ট্র্যাক্টগুলোতে [`view`](https://docs.soliditylang.org/en/latest/contracts.html#view-functions) বা [`pure`](https://docs.soliditylang.org/en/latest/contracts.html#pure-functions) ফাংশন হিসেবে পরিচিত ফাংশনও থাকতে পারে, যা চুক্তির স্টেট পরিবর্তন করে না। এইভাবে, একটি EOA থেকে এই ফাংশনগুলিকে কল করার জন্য কোনও গ্যাসের প্রয়োজন হবে না। এই পরিস্থিতির জন্য অন্তর্নিহিত RPC কল হল [`eth_call`](/developers/docs/apis/json-rpc#eth_call)। + +`eth_call` ব্যবহার করে অ্যাক্সেস করার থেকে ভিন্ন, এই `view` বা `pure` ফাংশনগুলো সাধারণত অভ্যন্তরীণভাবেও কল করা হয় (অর্থাৎ, চুক্তি থেকে বা অন্য চুক্তি থেকে) যার জন্য গ্যাস খরচ হয়। + +## লেনদেন জীবনচক্র {#transaction-lifecycle} + +একবার লেনদেন জমা দেওয়া হলে নিম্নলিখিতগুলি ঘটে: + +1. একটি লেনদেন হ্যাস ক্রিপ্টোগ্রাফিকভাবে তৈরি হয়: + `0x97d99bc7729211111a21b12c933c949d4f31684f1d6954ff477d0477538ff017` +2. লেনদেনটি তারপর নেটওয়ার্কে সম্প্রচার করা হয় এবং একটি লেনদেন পুলে যোগ করা হয় যা অন্যান্য সমস্ত মুলতুবি থাকা নেটওয়ার্ক লেনদেন নিয়ে গঠিত। +3. একজন ভ্যালিডেটরকে অবশ্যই আপনার লেনদেন বাছাই করতে হবে এবং লেনদেনটি যাচাই করার জন্য এবং এটিকে "সফল" হিসাবে বিবেচনা করার জন্য এটিকে একটি ব্লকে অন্তর্ভুক্ত করতে হবে। +4. সময়ের সাথে সাথে আপনার লেনদেন ধারণকারী ব্লকটি "যৌক্তিক" এবং তারপর "চূড়ান্ত" এ আপগ্রেড করা হবে। এই আপগ্রেডগুলি এটিকে আরও + অনেক বেশি নিশ্চিত করে যে আপনার লেনদেন সফল হয়েছে এবং কখনও পরিবর্তন করা হবে না। একবার একটি ব্লক "চূড়ান্ত" হয়ে গেলে এটি শুধুমাত্র একটি নেটওয়ার্ক স্তরের আক্রমণের + দ্বারা পরিবর্তন করা যেতে পারে যার জন্য বহু বিলিয়ন ডলার খরচ হবে। + +## একটি ভিজ্যুয়াল ডেমো {#a-visual-demo} + +অস্টিনকে দেখুন আপনাকে লেনদেন, গ্যাস এবং মাইনিং এর মাধ্যমে নিয়ে যেতে। + + + +## টাইপড ট্রানজেকশন এনভেলপ {#typed-transaction-envelope} + +ইথেরিয়ামের মূলত লেনদেনের জন্য একটি ফর্ম্যাট ছিল। প্রতিটি লেনদেনে একটি ননস, গ্যাস প্রাইস, গ্যাস লিমিট, টু এড্রেস, ভ্যালু, ডেটা, v, r, এবং s ছিল। এই ক্ষেত্রগুলি [RLP-এনকোডেড](/developers/docs/data-structures-and-encoding/rlp/), দেখতে কিছুটা এইরকম: + +`RLP([nonce, gasPrice, gasLimit, to, value, data, v, r, s])` + +ইথেরিয়াম একাধিক ধরনের লেনদেন সমর্থন করার জন্য বিকশিত হয়েছে যাতে অ্যাক্সেস লিস্ট এবং [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) এর মতো নতুন বৈশিষ্ট্যগুলিকে লিগ্যাসি লেনদেন ফর্ম্যাটকে প্রভাবিত না করেই প্রয়োগ করা যায়। + +[EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) এই আচরণের জন্য অনুমতি দেয়। লেনদেনগুলিকে ব্যাখ্যা করা হয়: + +`TransactionType || TransactionPayload` + +যেখানে ক্ষেত্রগুলি সংজ্ঞায়িত করা হয়েছে: + +- `TransactionType` - 0 এবং 0x7f-এর মধ্যে একটি সংখ্যা, মোট 128টি সম্ভাব্য লেনদেনের ধরনের জন্য। +- `TransactionPayload` - লেনদেনের ধরন দ্বারা সংজ্ঞায়িত একটি নির্বিচারে বাইট অ্যারে। + +`TransactionType` মানের উপর ভিত্তি করে, একটি লেনদেনকে শ্রেণীবদ্ধ করা যেতে পারে: + +1. **টাইপ 0 (লিগ্যাসি) লেনদেন:** ইথেরিয়ামের লঞ্চের পর থেকে ব্যবহৃত মূল লেনদেন ফর্ম্যাট। তারা [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) থেকে ডাইনামিক গ্যাস ফি গণনা বা স্মার্ট কন্ট্র্যাক্টের জন্য অ্যাক্সেস তালিকার মতো বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করে না। [রিকার্সিভ লেংথ প্রিফিক্স (RLP)](/developers/docs/data-structures-and-encoding/rlp) এনকোডিং ব্যবহার করার সময় লিগ্যাসি লেনদেনগুলিতে তাদের সিরিয়ালাইজড আকারে তাদের ধরন নির্দেশ করে একটি নির্দিষ্ট উপসর্গ নেই, যা বাইট `0xf8` দিয়ে শুরু হয়। এই লেনদেনগুলির জন্য TransactionType মান হল `0x0`। + +2. **টাইপ 1 লেনদেন:** ইথেরিয়ামের [বার্লিন আপগ্রেড](/ethereum-forks/#berlin) এর অংশ হিসাবে [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) এ প্রবর্তিত, এই লেনদেনগুলিতে একটি `accessList` প্যারামিটার অন্তর্ভুক্ত রয়েছে। এই তালিকাটি ঠিকানা এবং স্টোরেজ কীগুলি নির্দিষ্ট করে যা লেনদেন অ্যাক্সেস করার আশা করে, যা স্মার্ট কন্ট্র্যাক্ট জড়িত জটিল লেনদেনের জন্য সম্ভাব্য [গ্যাস](/developers/docs/gas/) খরচ কমাতে সাহায্য করে। EIP-1559 ফি বাজারের পরিবর্তন টাইপ 1 লেনদেনে অন্তর্ভুক্ত নয়। টাইপ 1 লেনদেনে একটি `yParity` প্যারামিটারও অন্তর্ভুক্ত থাকে, যা `0x0` বা `0x1` হতে পারে, যা secp256k1 স্বাক্ষরের y-মানের প্যারিটি নির্দেশ করে। এগুলিকে বাইট `0x01` দিয়ে শুরু করে চিহ্নিত করা হয় এবং তাদের TransactionType মান হল `0x1`। + +3. **টাইপ 2 লেনদেন**, যা সাধারণত EIP-1559 লেনদেন হিসাবে পরিচিত, হল ইথেরিয়ামের [লন্ডন আপগ্রেড](/ethereum-forks/#london) এর [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) এ প্রবর্তিত লেনদেন। তারা ইথেরিয়াম নেটওয়ার্কে স্ট্যান্ডার্ড লেনদেনের ধরন হয়ে উঠেছে। এই লেনদেনগুলি একটি নতুন ফি বাজার ব্যবস্থা প্রবর্তন করে যা লেনদেন ফি একটি বেস ফি এবং একটি অগ্রাধিকার ফিতে বিভক্ত করে পূর্বাভাসের উন্নতি করে। এগুলি বাইট `0x02` দিয়ে শুরু হয় এবং `maxPriorityFeePerGas` এবং `maxFeePerGas` এর মতো ক্ষেত্রগুলি অন্তর্ভুক্ত করে। টাইপ 2 লেনদেন এখন তাদের নমনীয়তা এবং দক্ষতার কারণে ডিফল্ট, বিশেষ করে উচ্চ নেটওয়ার্ক কনজেশনের সময় ব্যবহারকারীদের লেনদেন ফি আরও অনুমানযোগ্যভাবে পরিচালনা করতে সাহায্য করার ক্ষমতার জন্য অনুকূল। এই লেনদেনগুলির জন্য TransactionType মান হল `0x2`। + +4. **টাইপ 3 (ব্লব) লেনদেন** ইথেরিয়ামের [ডেনকুন আপগ্রেড](/ethereum-forks/#dencun) এর অংশ হিসাবে [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) তে প্রবর্তিত হয়েছিল। এই লেনদেনগুলি "ব্লব" ডেটা (বাইনারি লার্জ অবজেক্ট) আরও দক্ষতার সাথে পরিচালনা করার জন্য ডিজাইন করা হয়েছে, বিশেষ করে লেয়ার 2 রোলআপগুলিকে কম খরচে ইথেরিয়াম নেটওয়ার্কে ডেটা পোস্ট করার একটি উপায় প্রদান করে উপকৃত করে। ব্লব লেনদেনগুলিতে `blobVersionedHashes`, `maxFeePerBlobGas` এবং `blobGasPrice` এর মতো অতিরিক্ত ক্ষেত্র অন্তর্ভুক্ত রয়েছে। তারা বাইট `0x03` দিয়ে শুরু করে, এবং তাদের TransactionType মান হল `0x3`। ব্লব লেনদেন ইথেরিয়ামের ডেটা প্রাপ্যতা এবং স্কেলিং ক্ষমতার একটি উল্লেখযোগ্য উন্নতির প্রতিনিধিত্ব করে। + +5. **টাইপ 4 লেনদেন** ইথেরিয়ামের [Pectra আপগ্রেড](/roadmap/pectra/) এর অংশ হিসেবে [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) তে চালু করা হয়েছিল। এই লেনদেনগুলি অ্যাকাউন্ট অ্যাবস্ট্রাকশনের সাথে ফরোয়ার্ড-সামঞ্জস্যপূর্ণ হওয়ার জন্য ডিজাইন করা হয়েছে। এগুলি EOA-কে তাদের মূল কার্যকারিতা আপস না করে অস্থায়ীভাবে স্মার্ট কন্ট্র্যাক্ট অ্যাকাউন্টের মতো আচরণ করতে দেয়। এগুলিতে একটি `authorization_list` প্যারামিটার অন্তর্ভুক্ত থাকে, যা নির্দিষ্ট করে যে স্মার্ট কন্ট্র্যাক্টে EOA তার কর্তৃত্ব অর্পণ করে। লেনদেনের পরে, EOA-এর কোড ফিল্ডে অর্পিত স্মার্ট কন্ট্র্যাক্টের ঠিকানা থাকবে। + +## আরও পড়ুন {#further-reading} + +- [EIP-2718: টাইপড ট্রানজেকশন এনভেলপ](https://eips.ethereum.org/EIPS/eip-2718) + +_এমন কোনো কমিউনিটি রিসোর্স সম্পর্কে জানেন যা আপনাকে সাহায্য করেছে? এই পৃষ্ঠাটি সম্পাদনা করুন এবং এটি যোগ করুন!_ + +## সম্পর্কিত বিষয় {#related-topics} + +- [অ্যাকাউন্ট](/developers/docs/accounts/) +- [ইথেরিয়াম ভার্চুয়াল মেশিন (EVM)](/developers/docs/evm/) +- [গ্যাস](/developers/docs/gas/) diff --git a/public/content/translations/bn/developers/docs/web2-vs-web3/index.md b/public/content/translations/bn/developers/docs/web2-vs-web3/index.md new file mode 100644 index 00000000000..54f7042b4a8 --- /dev/null +++ b/public/content/translations/bn/developers/docs/web2-vs-web3/index.md @@ -0,0 +1,62 @@ +--- +title: "Web2 বনাম Web3" +description: "কেন্দ্রীভূত Web2 পরিষেবাগুলির সাথে ইথেরিয়াম ব্লকচেইন প্রযুক্তির উপর নির্মিত বিকেন্দ্রীভূত Web3 অ্যাপ্লিকেশনগুলির তুলনা করুন।" +lang: bn +--- + +Web2 বলতে ইন্টারনেটের সেই সংস্করণকে বোঝায় যা আমরা বেশিরভাগই আজ জানি। এমন একটি ইন্টারনেট যা আপনার ব্যক্তিগত তথ্যের বিনিময়ে পরিষেবা প্রদানকারী সংস্থাগুলির দ্বারা প্রভাবিত। Web3, ইথেরিয়ামের প্রেক্ষাপটে, ব্লকচেইনে চালিত বিকেন্দ্রীভূত অ্যাপগুলিকে বোঝায়। এগুলি এমন অ্যাপ যা তাদের ব্যক্তিগত ডেটাকে নগদীকরণ না করেই যে কাউকে অংশগ্রহণের অনুমতি দেয়। + +আরও নতুনদের জন্য উপযুক্ত রিসোর্স খুঁজছেন? আমাদের [web3 পরিচিতি](/web3/) দেখুন। + +## Web3-এর সুবিধা {#web3-benefits} + +অনেক Web3 ডেভেলপার ইথেরিয়ামের অন্তর্নিহিত বিকেন্দ্রীকরণের কারণে ডিএ্যাপস তৈরি করতে বেছে নিয়েছেন: + +- নেটওয়ার্কে থাকা যে কেউ পরিষেবাটি ব্যবহার করার অনুমতি পাবে – বা অন্য কথায়, অনুমতির প্রয়োজন নেই। +- কেউ আপনাকে ব্লক করতে বা পরিষেবাটিতে আপনার অ্যাক্সেস অস্বীকার করতে পারবে না। +- নেটিভ টোকেন, ইথার (ETH)-এর মাধ্যমে পেমেন্টগুলি বিল্ট-ইন থাকে। +- ইথেরিয়াম হল টিউরিং-সম্পূর্ণ, যার অর্থ আপনি প্রায় সবকিছুই প্রোগ্রাম করতে পারেন। + +## বাস্তবসম্মত তুলনা {#practical-comparisons} + +| Web2 | Web3 | +| ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| টুইটার যেকোনো অ্যাকাউন্ট বা টুইট সেন্সর করতে পারে | Web3 টুইটগুলি সেন্সর করা যাবে না কারণ নিয়ন্ত্রণ বিকেন্দ্রীভূত | +| পেমেন্ট পরিষেবা নির্দিষ্ট ধরণের কাজের জন্য পেমেন্টের অনুমতি না দেওয়ার সিদ্ধান্ত নিতে পারে | Web3 পেমেন্ট অ্যাপগুলির জন্য কোনো ব্যক্তিগত ডেটার প্রয়োজন হয় না এবং পেমেন্ট আটকাতে পারে না | +| গিগ-ইকোনমি অ্যাপের সার্ভার ডাউন হয়ে যেতে পারে এবং কর্মীদের আয়কে প্রভাবিত করতে পারে | Web3 সার্ভারগুলি ডাউন হতে পারে না – তারা তাদের ব্যাকএন্ড হিসাবে ইথেরিয়াম ব্যবহার করে, যা হাজার হাজার কম্পিউটারের একটি বিকেন্দ্রীভূত নেটওয়ার্ক | + +এর মানে এই নয় যে সমস্ত পরিষেবাকে একটি ডিঅ্যাপ-এ পরিণত করতে হবে। এই উদাহরণগুলি web2 এবং web3 পরিষেবাগুলির মধ্যে প্রধান পার্থক্যগুলির দৃষ্টান্তমূলক। + +## Web3-এর সীমাবদ্ধতা {#web3-limitations} + +Web3-এর বর্তমানে কিছু সীমাবদ্ধতা রয়েছে: + +- স্কেলেবিলিটি – web3-এ লেনদেন ধীর হয় কারণ সেগুলি বিকেন্দ্রীভূত। স্টেট-এর পরিবর্তন, যেমন একটি পেমেন্ট, একটি নোড দ্বারা প্রক্রিয়া করা এবং পুরো নেটওয়ার্কে প্রচারিত হওয়া প্রয়োজন। +- UX – web3 অ্যাপ্লিকেশনগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য অতিরিক্ত পদক্ষেপ, সফ্টওয়্যার এবং শিক্ষার প্রয়োজন হতে পারে। এটি গ্রহণের ক্ষেত্রে একটি বাধা হতে পারে। +- অ্যাক্সেসযোগ্যতা – আধুনিক ওয়েব ব্রাউজারগুলিতে ইন্টিগ্রেশনের অভাব বেশিরভাগ ব্যবহারকারীর জন্য web3-কে কম অ্যাক্সেসযোগ্য করে তোলে। +- খরচ – সবচেয়ে সফল ডিএ্যাপস তাদের কোডের খুব ছোট অংশ ব্লকচেইনে রাখে কারণ এটি ব্যয়বহুল। + +## কেন্দ্রীকরণ বনাম বিকেন্দ্রীকরণ {#centralization-vs-decentralization} + +নীচের সারণীতে, আমরা কেন্দ্রীভূত এবং বিকেন্দ্রীভূত ডিজিটাল নেটওয়ার্কগুলির কিছু ব্যাপক সুবিধা এবং অসুবিধা তালিকাভুক্ত করেছি। + +| কেন্দ্রীভূত সিস্টেম | বিকেন্দ্রীভূত সিস্টেম | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| কম নেটওয়ার্ক ব্যাস (সমস্ত অংশগ্রহণকারী একটি কেন্দ্রীয় কর্তৃপক্ষের সাথে সংযুক্ত); তথ্য দ্রুত প্রচারিত হয়, কারণ প্রচার একটি কেন্দ্রীয় কর্তৃপক্ষ দ্বারা প্রচুর কম্পিউটেশনাল রিসোর্স সহ পরিচালিত হয়। | নেটওয়ার্কের সবচেয়ে দূরের অংশগ্রহণকারীরা একে অপরের থেকে সম্ভাব্যভাবে অনেক দূরে থাকতে পারে। নেটওয়ার্কের এক প্রান্ত থেকে সম্প্রচারিত তথ্য অন্য প্রান্তে পৌঁছতে অনেক সময় লাগতে পারে। | +| সাধারণত উচ্চতর পারফরম্যান্স (উচ্চতর থ্রুপুট, কম মোট কম্পিউটেশনাল রিসোর্স ব্যয় করা হয়) এবং বাস্তবায়ন করা সহজ। | সাধারণত কম পারফরম্যান্স (নিম্ন থ্রুপুট, বেশি মোট কম্পিউটেশনাল রিসোর্স ব্যয় করা হয়) এবং বাস্তবায়ন করা আরও জটিল। | +| পরস্পরবিরোধী ডেটার ক্ষেত্রে, সমাধান স্পষ্ট এবং সহজ: সত্যের চূড়ান্ত উৎস হল কেন্দ্রীয় কর্তৃপক্ষ। | বিরোধ নিষ্পত্তির জন্য একটি প্রোটোকল (প্রায়শই জটিল) প্রয়োজন, যদি সহকর্মীরা ডেটার স্টেট সম্পর্কে পরস্পরবিরোধী দাবি করে যার উপর অংশগ্রহণকারীদের সিঙ্ক্রোনাইজ করার কথা। | +| ব্যর্থতার একক বিন্দু: ক্ষতিকারক অভিনেতারা কেন্দ্রীয় কর্তৃপক্ষকে লক্ষ্য করে নেটওয়ার্কটি ডাউন করতে সক্ষম হতে পারে। | ব্যর্থতার কোনো একক বিন্দু নেই: নেটওয়ার্ক এখনও কাজ করতে পারে এমনকি যদি অংশগ্রহণকারীদের একটি বড় অংশ আক্রমণ/সরিয়ে দেওয়া হয়। | +| নেটওয়ার্ক অংশগ্রহণকারীদের মধ্যে সমন্বয় অনেক সহজ, এবং একটি কেন্দ্রীয় কর্তৃপক্ষ দ্বারা পরিচালিত হয়। কেন্দ্রীয় কর্তৃপক্ষ খুব কম ঘর্ষণে নেটওয়ার্ক অংশগ্রহণকারীদের আপগ্রেড, প্রোটোকল আপডেট ইত্যাদি গ্রহণ করতে বাধ্য করতে পারে। | সমন্বয় প্রায়শই কঠিন, কারণ নেটওয়ার্ক-স্তরের সিদ্ধান্ত, প্রোটোকল আপগ্রেড ইত্যাদিতে কোনো একক এজেন্টের চূড়ান্ত বক্তব্য নেই। সবচেয়ে খারাপ ক্ষেত্রে, প্রোটোকল পরিবর্তন সম্পর্কে মতবিরোধ থাকলে নেটওয়ার্ক বিভক্ত হওয়ার প্রবণতা থাকে। | +| কেন্দ্রীয় কর্তৃপক্ষ ডেটা সেন্সর করতে পারে, যা নেটওয়ার্কের কিছু অংশকে বাকি নেটওয়ার্কের সাথে ইন্টারঅ্যাক্ট করা থেকে সম্ভাব্যভাবে বিচ্ছিন্ন করে দেয়। | সেন্সরশিপ অনেক কঠিন, কারণ নেটওয়ার্ক জুড়ে তথ্য প্রচারের অনেক উপায় রয়েছে। | +| নেটওয়ার্কে অংশগ্রহণ কেন্দ্রীয় কর্তৃপক্ষ দ্বারা নিয়ন্ত্রিত হয়। | যে কেউ নেটওয়ার্কে অংশগ্রহণ করতে পারে; কোনো “গেটকিপার” নেই। আদর্শগতভাবে, অংশগ্রহণের খরচ খুব কম। | + +মনে রাখবেন যে এগুলি সাধারণ প্যাটার্ন যা প্রতিটি নেটওয়ার্কে সত্য নাও হতে পারে। তাছাড়া, বাস্তবে একটি নেটওয়ার্ক কতটা কেন্দ্রীভূত/বিকেন্দ্রীভূত তা একটি স্পেকট্রামের উপর নির্ভর করে; কোনো নেটওয়ার্কই সম্পূর্ণ কেন্দ্রীভূত বা সম্পূর্ণ বিকেন্দ্রীভূত নয়। + +## আরও পড়ুন {#further-reading} + +- [Web3 কী?](/web3/) - _ethereum.org_ +- [একটি ওয়েব 3.0 অ্যাপ্লিকেশনের আর্কিটেকচার](https://www.preethikasireddy.com/post/the-architecture-of-a-web-3-0-application) - _প্রীতি কাসিরেড্ডি_ +- [বিকেন্দ্রীকরণের অর্থ](https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274) _৬ ফেব্রুয়ারী, ২০১৭ - Vitalik Buterin_ +- [কেন বিকেন্দ্রীকরণ গুরুত্বপূর্ণ](https://onezero.medium.com/why-decentralization-matters-5e3f79f7638e) _১৮ ফেব্রুয়ারী, ২০১৮ - Chris Dixon_ +- [Web 3.0 কী এবং কেন এটি গুরুত্বপূর্ণ](https://medium.com/fabric-ventures/what-is-web-3-0-why-it-matters-934eb07f3d2b) _৩১ ডিসেম্বর, ২০১৯ - Max Mersch and Richard Muirhead_ +- [কেন আমাদের Web 3.0 প্রয়োজন](https://gavofyork.medium.com/why-we-need-web-3-0-5da4f2bf95ab) _১২ সেপ্টেম্বর, ২০১৮ - Gavin Wood_ diff --git a/public/content/translations/bn/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md b/public/content/translations/bn/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md new file mode 100644 index 00000000000..ceed418309b --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/a-developers-guide-to-ethereum-part-one/index.md @@ -0,0 +1,300 @@ +--- +title: "একজন পাইথন ডেভেলপারের জন্য ইথেরিয়ামের ভূমিকা, পার্ট ১" +description: "ইথেরিয়াম ডেভেলপমেন্টের একটি ভূমিকা, বিশেষ করে তাদের জন্য উপযোগী যাদের পাইথন প্রোগ্রামিং ভাষা সম্পর্কে জ্ঞান আছে" +author: Marc Garreau +lang: bn +tags: [ "python", "web3.py" ] +skill: beginner +published: 2020-09-08 +source: Snake charmers +sourceUrl: https://snakecharmers.ethereum.org/a-developers-guide-to-ethereum-pt-1/ +--- + +তাহলে, আপনি এই ইথেরিয়াম জিনিসটা সম্পর্কে শুনেছেন এবং এই রহস্যময় জগতে প্রবেশ করতে প্রস্তুত? এই পোস্টে দ্রুত কিছু ব্লকচেইন বেসিক কভার করা হবে, তারপর আপনাকে একটি সিমুলেটেড ইথেরিয়াম নোডের সাথে ইন্টারঅ্যাক্ট করানো হবে – ব্লক ডেটা পড়া, অ্যাকাউন্টের ব্যালেন্স চেক করা, এবং ট্রানজ্যাকশন পাঠানো। এর পাশাপাশি, আমরা অ্যাপ তৈরির প্রচলিত উপায় এবং এই নতুন ডিসেন্ট্রালাইজড দৃষ্টান্তের মধ্যে পার্থক্য তুলে ধরব। + +## (নমনীয়) পূর্বশর্ত {#soft-prerequisites} + +এই পোস্টটি বিস্তৃত পরিসরের ডেভেলপারদের কাছে সহজলভ্য হওয়ার আশা রাখে। [পাইথন টুলস](/developers/docs/programming-languages/python/) জড়িত থাকবে, কিন্তু সেগুলি ধারণাগুলির জন্য কেবল একটি বাহন – আপনি যদি পাইথন ডেভেলপার না হন তবে কোনো সমস্যা নেই। তবে, আপনি ইতিমধ্যে যা জানেন সে সম্পর্কে আমি কয়েকটি অনুমান করব, যাতে আমরা দ্রুত ইথেরিয়াম-নির্দিষ্ট অংশে যেতে পারি। + +অনুমান: + +- আপনি টার্মিনালে কাজ করতে পারেন, +- আপনি পাইথনের কয়েকটি লাইন কোড লিখেছেন, +- আপনার মেশিনে পাইথন সংস্করণ 3.6 বা তার বেশি ইনস্টল করা আছে (একটি [ভার্চুয়াল পরিবেশ](https://realpython.com/effective-python-environment/#virtual-environments) ব্যবহার করার জন্য দৃঢ়ভাবে উৎসাহিত করা হচ্ছে), এবং +- আপনি `pip`, পাইথনের প্যাকেজ ইনস্টলার ব্যবহার করেছেন। + আবারও, যদি এগুলোর কোনোটি অসত্য হয়, অথবা আপনি যদি এই নিবন্ধের কোডটি পুনরুৎপাদন করার পরিকল্পনা না করেন, তাহলে আপনি সম্ভবত ঠিকঠাকভাবেই অনুসরণ করতে পারবেন। + +## ব্লকচেইন, সংক্ষেপে {#blockchains-briefly} + +ইথেরিয়ামকে বর্ণনা করার অনেক উপায় আছে, কিন্তু এর হৃদয়ে রয়েছে একটি ব্লকচেইন। ব্লকচেইনগুলো ব্লকের একটি সিরিজ দিয়ে তৈরি, তাই চলুন সেখান থেকেই শুরু করা যাক। সবচেয়ে সহজ ভাষায়, ইথেরিয়াম ব্লকচেইনের প্রতিটি ব্লক হল কিছু মেটাডেটা এবং ট্রানজ্যাকশনের একটি তালিকা। JSON ফরম্যাটে, এটি দেখতে অনেকটা এইরকম: + +```json +{ + "number": 1234567, + "hash": "0xabc123...", + "parentHash": "0xdef456...", + ..., + "transactions": [...] +} +``` + +প্রতিটি [ব্লকের](/developers/docs/blocks/) তার আগের ব্লকের একটি রেফারেন্স থাকে; `parentHash` হল কেবল আগের ব্লকের হ্যাস। + +দ্রষ্টব্য: ইথেরিয়াম নিয়মিতভাবে হ্যাস ফাংশন ব্যবহার করে নির্দিষ্ট আকারের মান (“হ্যাস”) তৈরি করতে। ইথেরিয়ামে হ্যাস একটি গুরুত্বপূর্ণ ভূমিকা পালন করে, কিন্তু আপাতত আপনি সেগুলোকে নিরাপদে অনন্য আইডি হিসেবে ভাবতে পারেন। + +![প্রতিটি ব্লকের ভিতরের ডেটা সহ একটি ব্লকচেইন চিত্রিত একটি ডায়াগ্রাম](./blockchain-diagram.png) + +_একটি ব্লকচেইন মূলত একটি লিঙ্কড তালিকা; প্রতিটি ব্লকের আগের ব্লকের একটি রেফারেন্স থাকে।_ + +এই ডেটা স্ট্রাকচারটি নতুন কিছু নয়, কিন্তু নেটওয়ার্ক পরিচালনাকারী নিয়মগুলি (যেমন, পিয়ার-টু-পিয়ার প্রোটোকল) নতুন। কোনো কেন্দ্রীয় কর্তৃপক্ষ নেই; নেটওয়ার্ক টিকিয়ে রাখতে পিয়ারদের নেটওয়ার্ককে সহযোগিতা করতে হবে, এবং পরবর্তী ব্লকে কোন ট্রানজ্যাকশনগুলো অন্তর্ভুক্ত করা হবে তা নির্ধারণ করতে প্রতিযোগিতা করতে হবে। সুতরাং, যখন আপনি কোনো বন্ধুকে কিছু টাকা পাঠাতে চান, আপনাকে সেই ট্রানজ্যাকশনটি নেটওয়ার্কে ব্রডকাস্ট করতে হবে, তারপর এটি একটি আসন্ন ব্লকে অন্তর্ভুক্ত হওয়ার জন্য অপেক্ষা করতে হবে। + +এক ব্যবহারকারী থেকে অন্য ব্যবহারকারীর কাছে টাকা সত্যিই পাঠানো হয়েছে কিনা তা যাচাই করার জন্য ব্লকচেইনের একমাত্র উপায় হলো সেই ব্লকচেইনের একটি স্থানীয় মুদ্রা (অর্থাৎ, সেই ব্লকচেইন দ্বারা তৈরি এবং পরিচালিত) ব্যবহার করা। ইথেরিয়ামে, এই মুদ্রাকে বলা হয় ইথার, এবং ইথেরিয়াম ব্লকচেইনে অ্যাকাউন্টের ব্যালেন্সের একমাত্র অফিসিয়াল রেকর্ড থাকে। + +## একটি নতুন দৃষ্টান্ত {#a-new-paradigm} + +এই নতুন ডিসেন্ট্রালাইজড টেক স্ট্যাক নতুন ডেভেলপার টুলস তৈরি করেছে। এই ধরনের টুলস অনেক প্রোগ্রামিং ভাষায় বিদ্যমান, কিন্তু আমরা পাইথনের দৃষ্টিকোণ থেকে দেখব। পুনরায় বলতে গেলে: যদিও পাইথন আপনার পছন্দের ভাষা না হয়, তবুও এটি অনুসরণ করতে খুব বেশি অসুবিধা হওয়া উচিত নয়। + +যে পাইথন ডেভেলপাররা ইথেরিয়ামের সাথে ইন্টারঅ্যাক্ট করতে চান তারা সম্ভবত [Web3.py](https://web3py.readthedocs.io/) ব্যবহার করবেন। Web3.py হল একটি লাইব্রেরি যা একটি ইথেরিয়াম নোডের সাথে সংযোগ স্থাপন এবং তারপর সেখান থেকে ডেটা পাঠানো এবং গ্রহণ করার উপায়কে ব্যাপকভাবে সরল করে। + +দ্রষ্টব্য: “ইথেরিয়াম নোড” এবং “ইথেরিয়াম ক্লায়েন্ট” একে অপরের পরিবর্তে ব্যবহৃত হয়। উভয় ক্ষেত্রেই, এটি সেই সফটওয়্যারকে বোঝায় যা ইথেরিয়াম নেটওয়ার্কের একজন অংশগ্রহণকারী চালায়। এই সফটওয়্যারটি ব্লক ডেটা পড়তে পারে, চেইনে নতুন ব্লক যুক্ত হলে আপডেট পেতে পারে, নতুন ট্রানজ্যাকশন ব্রডকাস্ট করতে পারে এবং আরও অনেক কিছু করতে পারে। টেকনিক্যালি, ক্লায়েন্ট হল সফটওয়্যার, নোড হল সেই কম্পিউটার যা সফটওয়্যারটি চালায়। + +[ইথেরিয়াম ক্লায়েন্টগুলো](/developers/docs/nodes-and-clients/) [IPC](https://wikipedia.org/wiki/Inter-process_communication), HTTP, বা Websockets দ্বারা পৌঁছানোর জন্য কনফিগার করা যেতে পারে, তাই Web3.py-কে এই কনফিগারেশনটি প্রতিফলিত করতে হবে। Web3.py এই সংযোগ বিকল্পগুলিকে **প্রোভাইডার** হিসাবে উল্লেখ করে। আপনার নোডের সাথে Web3.py ইনস্ট্যান্স লিঙ্ক করার জন্য আপনাকে তিনটি প্রোভাইডারের মধ্যে একটি বেছে নিতে হবে। + +![একটি ডায়াগ্রাম যা দেখাচ্ছে কিভাবে web3.py আপনার এপ্লিকেশনকে একটি ইথেরিয়াম নোডের সাথে সংযোগ করতে IPC ব্যবহার করে](./web3py-and-nodes.png) + +_ইথেরিয়াম নোড এবং Web3.py-কে একই প্রোটোকলের মাধ্যমে যোগাযোগ করার জন্য কনফিগার করুন, যেমন, এই ডায়াগ্রামে IPC।_ + +একবার Web3.py সঠিকভাবে কনফিগার হয়ে গেলে, আপনি ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করা শুরু করতে পারেন। এখানে Web3.py ব্যবহারের কয়েকটি উদাহরণ দেওয়া হল যা ভবিষ্যতে যা আসবে তার একটি প্রিভিউ হিসাবে: + +```python +# ব্লক ডেটা পড়ুন: +w3.eth.get_block('latest') + +# একটি ট্রানজ্যাকশন পাঠান: +w3.eth.send_transaction({'from': ..., 'to': ..., 'value': ...}) +``` + +## ইনস্টলেশন {#installation} + +এই ওয়াকথ্রুতে, আমরা শুধু একটি পাইথন ইন্টারপ্রেটারের মধ্যে কাজ করব। আমরা কোনো ডিরেক্টরি, ফাইল, ক্লাস বা ফাংশন তৈরি করব না। + +দ্রষ্টব্য: নীচের উদাহরণগুলিতে, `$` দিয়ে শুরু হওয়া কমান্ডগুলি টার্মিনালে চালানোর জন্য উদ্দিষ্ট। ( `$` টাইপ করবেন না, এটি কেবল লাইনের শুরু নির্দেশ করে।) + +প্রথমে, অন্বেষণের জন্য একটি ব্যবহারকারী-বান্ধব পরিবেশের জন্য [IPython](https://ipython.org/) ইনস্টল করুন। IPython অন্যান্য বৈশিষ্ট্যের মধ্যে ট্যাব কমপ্লিশন অফার করে, যা Web3.py-এর মধ্যে কী সম্ভব তা দেখতে অনেক সহজ করে তোলে। + +```bash +pip install ipython +``` + +Web3.py `web3` নামে প্রকাশিত হয়েছে। এটি এভাবে ইনস্টল করুন: + +```bash +pip install web3 +``` + +আরও একটি জিনিস – আমরা পরে একটি ব্লকচেইন সিমুলেট করতে যাচ্ছি, যার জন্য আরও কয়েকটি নির্ভরতা প্রয়োজন। আপনি সেগুলি এর মাধ্যমে ইনস্টল করতে পারেন: + +```bash +pip install 'web3[tester]' +``` + +আপনি যাওয়ার জন্য পুরোপুরি প্রস্তুত! + +দ্রষ্টব্য: `web3[tester]` প্যাকেজটি পাইথন 3.10.xx পর্যন্ত কাজ করে + +## একটি স্যান্ডবক্স চালু করুন {#spin-up-a-sandbox} + +আপনার টার্মিনালে `ipython` চালিয়ে একটি নতুন পাইথন পরিবেশ খুলুন। এটি `python` চালানোর সমতুল্য, কিন্তু আরও অনেক ফিচার সহ আসে। + +```bash +ipython +``` + +এটি আপনার চালানো পাইথন এবং IPython এর সংস্করণ সম্পর্কে কিছু তথ্য প্রিন্ট করবে, তারপর আপনি ইনপুটের জন্য অপেক্ষারত একটি প্রম্পট দেখতে পাবেন: + +```python +In [1]: +``` + +আপনি এখন একটি ইন্টারেক্টিভ পাইথন শেল দেখছেন। মূলত, এটি খেলার জন্য একটি স্যান্ডবক্স। আপনি যদি এতদূর এসে থাকেন, তাহলে Web3.py ইম্পোর্ট করার সময় হয়েছে: + +```python +In [1]: from web3 import Web3 +``` + +## Web3 মডিউলের পরিচিতি {#introducing-the-web3-module} + +ইথেরিয়ামের একটি গেটওয়ে হওয়ার পাশাপাশি, [Web3](https://web3py.readthedocs.io/en/stable/overview.html#base-api) মডিউলটি কয়েকটি সুবিধাজনক ফাংশন অফার করে। চলুন কয়েকটি অন্বেষণ করা যাক। + +একটি ইথেরিয়াম এপ্লিকেশনে, আপনাকে সাধারণত মুদ্রার ডিনোমিনেশন রূপান্তর করতে হবে। Web3 মডিউলটি শুধুমাত্র এর জন্য কয়েকটি হেল্পার মেথড প্রদান করে: [from_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.from_wei) এবং [to_wei](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.to_wei)। + + +দ্রষ্টব্য: কম্পিউটার দশমিক গণিত পরিচালনায় কুখ্যাতভাবে খারাপ। এটি এড়াতে, ডেভেলপাররা প্রায়শই ডলারের পরিমাণ সেন্টে সংরক্ষণ করেন। উদাহরণস্বরূপ, $5.99 মূল্যের একটি আইটেম ডেটাবেসে 599 হিসাবে সংরক্ষণ করা হতে পারে। + +ইথার-এ ট্রানজ্যাকশন পরিচালনার সময় একটি অনুরূপ প্যাটার্ন ব্যবহার করা হয়। তবে, দুটি দশমিক বিন্দুর পরিবর্তে, ইথারের 18টি আছে! ইথারের সবচেয়ে ছোট ডিনোমিনেশনকে বলা হয় wei, তাই ট্রানজ্যাকশন পাঠানোর সময় সেই মানটি নির্দিষ্ট করা হয়। + +১ ইথার = ১000000000000000000 wei + +১ wei = 0.000000000000000001 ইথার + + + +কিছু মান wei-তে এবং wei থেকে রূপান্তর করার চেষ্টা করুন। মনে রাখবেন যে ইথার এবং wei-এর মধ্যে [অনেক ডিনোমিনেশনের নাম রয়েছে](https://web3py.readthedocs.io/en/stable/troubleshooting.html#how-do-i-convert-currency-denominations)। তাদের মধ্যে সবচেয়ে পরিচিত একটি হল **gwei**, কারণ প্রায়শই ট্রানজ্যাকশন ফি এভাবেই দেখানো হয়। + +```python +In [2]: Web3.to_wei(1, 'ether') +Out[2]: 1000000000000000000 + +In [3]: Web3.from_wei(500000000, 'gwei') +Out[3]: Decimal('0.5') +``` + +Web3 মডিউলের অন্যান্য ইউটিলিটি পদ্ধতির মধ্যে রয়েছে ডেটা ফর্ম্যাট কনভার্টার (যেমন, [`toHex`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.toHex)), অ্যাড্রেস হেল্পার (যেমন, [`isAddress`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.isAddress)), এবং হ্যাস ফাংশন (যেমন, [`keccak`](https://web3py.readthedocs.io/en/stable/web3.main.html#web3.Web3.keccak))। এই সিরিজের পরবর্তী অংশে এর মধ্যে অনেকগুলি কভার করা হবে। সমস্ত উপলব্ধ মেথড এবং প্রোপার্টি দেখতে, `Web3` টাইপ করে IPython-এর অটো-কমপ্লিট ব্যবহার করুন। এবং পিরিয়ডের পরে দুবার ট্যাব কী টিপুন। + +## চেইনের সাথে কথা বলুন {#talk-to-the-chain} + +সুবিধাজনক মেথডগুলো চমৎকার, কিন্তু চলুন ব্লকচেইনের দিকে এগিয়ে যাওয়া যাক। পরবর্তী ধাপ হল একটি ইথেরিয়াম নোডের সাথে যোগাযোগের জন্য Web3.py কনফিগার করা। এখানে আমাদের কাছে IPC, HTTP, বা Websocket প্রোভাইডার ব্যবহার করার বিকল্প আছে। + +আমরা এই পথে যাব না, কিন্তু HTTP প্রোভাইডার ব্যবহার করে একটি সম্পূর্ণ ওয়ার্কফ্লোর একটি উদাহরণ এইরকম দেখতে হতে পারে: + +- একটি ইথেরিয়াম নোড ডাউনলোড করুন, যেমন, [Geth](https://geth.ethereum.org/)। +- একটি টার্মিনাল উইন্ডোতে Geth শুরু করুন এবং এটি নেটওয়ার্ক সিঙ্ক করার জন্য অপেক্ষা করুন। ডিফল্ট HTTP পোর্ট হল `8545`, কিন্তু এটি কনফিগারযোগ্য। +- Web3.py-কে HTTP এর মাধ্যমে, `localhost:8545`-এ নোডের সাথে সংযোগ করতে বলুন। + `w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))` +- `w3` ইনস্ট্যান্সটি নোডের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহার করুন। + +যদিও এটি করার একটি “বাস্তব” উপায়, সিঙ্কিং প্রক্রিয়াটি কয়েক ঘন্টা সময় নেয় এবং আপনি যদি কেবল একটি ডেভেলপমেন্ট পরিবেশ চান তবে এটি অপ্রয়োজনীয়। Web3.py এই উদ্দেশ্যে একটি চতুর্থ প্রোভাইডার প্রকাশ করে, **EthereumTesterProvider**। এই টেস্টার প্রোভাইডারটি একটি সিমুলেটেড ইথেরিয়াম নোডের সাথে লিঙ্ক করে যেখানে খেলার জন্য শিথিল অনুমতি এবং জাল মুদ্রা রয়েছে। + +![একটি ডায়াগ্রাম যা EthereumTesterProvider-কে আপনার web3.py এপ্লিকেশনটিকে একটি সিমুলেটেড ইথেরিয়াম নোডের সাথে লিঙ্ক করতে দেখাচ্ছে](./ethereumtesterprovider.png) + +_EthereumTesterProvider একটি সিমুলেটেড নোডের সাথে সংযোগ স্থাপন করে এবং দ্রুত ডেভেলপমেন্ট পরিবেশের জন্য সুবিধাজনক।_ + +সেই সিমুলেটেড নোডটিকে [eth-tester](https://github.com/ethereum/eth-tester) বলা হয় এবং আমরা এটিকে `pip install web3[tester]` কমান্ডের অংশ হিসাবে ইনস্টল করেছি। এই টেস্টার প্রোভাইডারটি ব্যবহার করার জন্য Web3.py কনফিগার করা ঠিক ততটাই সহজ: + +```python +In [4]: w3 = Web3(Web3.EthereumTesterProvider()) +``` + +এখন আপনি চেইন সার্ফ করার জন্য প্রস্তুত! এটা এমন কিছু নয় যা মানুষ বলে। আমি এটা এইমাত্র বানালাম। চলুন একটি দ্রুত ট্যুর করা যাক। + +## দ্রুত ট্যুর {#the-quick-tour} + +প্রথমেই, একটি স্যানিটি চেক: + +```python +In [5]: w3.is_connected() +Out[5]: True +``` + +যেহেতু আমরা টেস্টার প্রোভাইডার ব্যবহার করছি, এটি খুব মূল্যবান পরীক্ষা নয়, কিন্তু যদি এটি ব্যর্থ হয়, তবে সম্ভবত আপনি `w3` ভ্যারিয়েবলটি ইনস্ট্যানশিয়েট করার সময় কিছু ভুল টাইপ করেছেন। ডাবল-চেক করুন যে আপনি ভিতরের বন্ধনী অন্তর্ভুক্ত করেছেন, অর্থাৎ, `Web3.EthereumTesterProvider()`। + +## ট্যুর স্টপ #১: [অ্যাকাউন্ট](/developers/docs/accounts/) {#tour-stop-1-accounts} + +সুবিধার জন্য, টেস্টার প্রোভাইডার কিছু অ্যাকাউন্ট তৈরি করেছে এবং সেগুলিকে টেস্ট ইথার দিয়ে প্রি-লোড করেছে। + +প্রথমে, আসুন সেই অ্যাকাউন্টগুলির একটি তালিকা দেখি: + +```python +In [6]: w3.eth.accounts +Out[6]: ['0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', + '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF', + '0x6813Eb9362372EEF6200f3b1dbC3f819671cBA69', ...] +``` + +আপনি যদি এই কমান্ডটি চালান, আপনার `0x` দিয়ে শুরু হওয়া দশটি স্ট্রিংয়ের একটি তালিকা দেখতে হবে। প্রতিটি একটি **পাবলিক অ্যাড্রেস** এবং কিছু দিক থেকে, একটি চেকিং অ্যাকাউন্টের অ্যাকাউন্ট নম্বরের অনুরূপ। আপনাকে যে ইথার পাঠাতে চায় তাকে আপনি এই অ্যাড্রেসটি প্রদান করবেন। + +যেমন উল্লেখ করা হয়েছে, টেস্টার প্রোভাইডার এই প্রতিটি অ্যাকাউন্টে কিছু টেস্ট ইথার প্রি-লোড করেছে। চলুন জেনে নেওয়া যাক প্রথম অ্যাকাউন্টে কত আছে: + +```python +In [7]: w3.eth.get_balance(w3.eth.accounts[0]) +Out[7]: 1000000000000000000000000 +``` + +অনেকগুলো শূন্য! জাল ব্যাঙ্কের দিকে হাসতে হাসতে যাওয়ার আগে, আগের মুদ্রা ডিনোমিনেশন সম্পর্কিত সেই পাঠটি মনে করুন। ইথার মানগুলি সবচেয়ে ছোট ডিনোমিনেশন, wei-তে উপস্থাপিত হয়। সেটিকে ইথারে রূপান্তর করুন: + +```python +In [8]: w3.from_wei(1000000000000000000000000, 'ether') +Out[8]: Decimal('1000000') +``` + +এক মিলিয়ন টেস্ট ইথার - এখনও খুব খারাপ নয়। + +## ট্যুর স্টপ #২: ব্লক ডেটা {#tour-stop-2-block-data} + +চলুন এই সিমুলেটেড ব্লকচেইনের অবস্থা এক নজরে দেখে নেওয়া যাক: + +```python +In [9]: w3.eth.get_block('latest') +Out[9]: AttributeDict({ + 'number': 0, + 'hash': HexBytes('0x9469878...'), + 'parentHash': HexBytes('0x0000000...'), + ... + 'transactions': [] +}) +``` + +একটি ব্লক সম্পর্কে অনেক তথ্য ফেরত আসে, কিন্তু এখানে কয়েকটি বিষয় উল্লেখ করার আছে: + +- ব্লক নম্বর শূন্য - আপনি যত আগেই টেস্টার প্রোভাইডার কনফিগার করুন না কেন। বাস্তব ইথেরিয়াম নেটওয়ার্কের মতো নয়, যা প্রতি 12 সেকেন্ডে একটি নতুন ব্লক যোগ করে, এই সিমুলেশনটি আপনি এটিকে কিছু কাজ না দেওয়া পর্যন্ত অপেক্ষা করবে। +- `transactions` একটি খালি তালিকা, একই কারণে: আমরা এখনও কিছু করিনি। এই প্রথম ব্লকটি একটি **খালি ব্লক**, কেবল চেইন শুরু করার জন্য। +- লক্ষ্য করুন যে `parentHash` কেবল কয়েকটি খালি বাইট। এটি নির্দেশ করে যে এটি চেইনের প্রথম ব্লক, যা **জেনেসিস ব্লক** নামেও পরিচিত। + +## ট্যুর স্টপ #৩: [ট্রানজ্যাকশন](/developers/docs/transactions/) {#tour-stop-3-transactions} + +একটি পেন্ডিং ট্রানজ্যাকশন না হওয়া পর্যন্ত আমরা শূন্য ব্লকে আটকে আছি, তাই আসুন একটি দেওয়া যাক। এক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে কয়েকটি টেস্ট ইথার পাঠান: + +```python +In [10]: tx_hash = w3.eth.send_transaction({ + 'from': w3.eth.accounts[0], + 'to': w3.eth.accounts[1], + 'value': w3.to_wei(3, 'ether'), + 'gas': 21000 +}) +``` + +এটি সাধারণত সেই পয়েন্ট যেখানে আপনি আপনার ট্রানজ্যাকশনটি একটি নতুন ব্লকে অন্তর্ভুক্ত হওয়ার জন্য কয়েক সেকেন্ড অপেক্ষা করবেন। সম্পূর্ণ প্রক্রিয়াটি অনেকটা এইরকম: + +1. একটি ট্রানজ্যাকশন জমা দিন এবং ট্রানজ্যাকশন হ্যাসটি ধরে রাখুন। ট্রানজ্যাকশন ধারণকারী ব্লক তৈরি এবং ব্রডকাস্ট না হওয়া পর্যন্ত, ট্রানজ্যাকশনটি “পেন্ডিং” থাকে। + `tx_hash = w3.eth.send_transaction({ … })` +2. ট্রানজ্যাকশনটি একটি ব্লকে অন্তর্ভুক্ত হওয়ার জন্য অপেক্ষা করুন: + `w3.eth.wait_for_transaction_receipt(tx_hash)` +3. এপ্লিকেশন লজিক চালিয়ে যান। সফল ট্রানজ্যাকশন দেখতে: + `w3.eth.get_transaction(tx_hash)` + +আমাদের সিমুলেটেড পরিবেশটি সঙ্গে সঙ্গে একটি নতুন ব্লকে ট্রানজ্যাকশনটি যোগ করবে, তাই আমরা অবিলম্বে ট্রানজ্যাকশনটি দেখতে পারি: + +```python +In [11]: w3.eth.get_transaction(tx_hash) +Out[11]: AttributeDict({ + 'hash': HexBytes('0x15e9fb95dc39...'), + 'blockNumber': 1, + 'transactionIndex': 0, + 'from': '0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf', + 'to': '0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF', + 'value': 3000000000000000000, + ... +}) +``` + +আপনি এখানে কিছু পরিচিত বিবরণ দেখতে পাবেন: `from`, `to`, এবং `value` ফিল্ডগুলি আমাদের `send_transaction` কলের ইনপুটগুলির সাথে মিলতে হবে। অন্য আশ্বস্তকারী বিষয় হল যে এই ট্রানজ্যাকশনটি ব্লক নম্বর ১-এর মধ্যে প্রথম ট্রানজ্যাকশন (`'transactionIndex': 0`) হিসাবে অন্তর্ভুক্ত করা হয়েছিল। + +আমরা জড়িত দুটি অ্যাকাউন্টের ব্যালেন্স চেক করে এই ট্রানজ্যাকশনের সাফল্য সহজেই যাচাই করতে পারি। তিনটি ইথার একটি থেকে অন্যটিতে চলে যাওয়া উচিত। + +```python +In [12]: w3.eth.get_balance(w3.eth.accounts[0]) +Out[12]: 999996999979000000000000 + +In [13]: w3.eth.get_balance(w3.eth.accounts[1]) +Out[13]: 1000003000000000000000000 +``` + +পরেরটি ভালো দেখাচ্ছে! ব্যালেন্স ১,০০০,০০০ থেকে ১,০০০,০০৩ ইথারে চলে গেছে। কিন্তু প্রথম অ্যাকাউন্টের কী হল? মনে হচ্ছে এটি তিন ইথারের চেয়ে সামান্য বেশি হারিয়েছে। হায়, জীবনে কিছুই বিনামূল্যে নয়, এবং ইথেরিয়াম পাবলিক নেটওয়ার্ক ব্যবহার করার জন্য আপনাকে আপনার পিয়ারদের তাদের সহায়ক ভূমিকার জন্য ক্ষতিপূরণ দিতে হবে। ট্রানজ্যাকশন জমা দেওয়া অ্যাকাউন্ট থেকে একটি ছোট ট্রানজ্যাকশন ফি কেটে নেওয়া হয়েছিল - এই ফি হল পোড়ানো গ্যাসের পরিমাণ (একটি ETH ট্রান্সফারের জন্য ২১০০০ ইউনিট গ্যাস) যা নেটওয়ার্ক কার্যকলাপ অনুযায়ী পরিবর্তিত একটি বেস ফি দ্বারা গুণিত হয় এবং একটি টিপ যা সেই ভ্যালিডেটরের কাছে যায় যে ট্রানজ্যাকশনটি একটি ব্লকে অন্তর্ভুক্ত করে। + +[গ্যাস](/developers/docs/gas/#post-london) সম্পর্কে আরও + +দ্রষ্টব্য: পাবলিক নেটওয়ার্কে, ট্রানজ্যাকশন ফি নেটওয়ার্কের চাহিদা এবং আপনি কত দ্রুত একটি ট্রানজ্যাকশন প্রসেস করতে চান তার উপর ভিত্তি করে পরিবর্তনশীল। ফি কীভাবে গণনা করা হয় তার একটি ব্রেকডাউনে যদি আপনি আগ্রহী হন, তাহলে কীভাবে ট্রানজ্যাকশনগুলি একটি ব্লকে অন্তর্ভুক্ত করা হয়-এর উপর আমার আগের পোস্টটি দেখুন। + +## এবং শ্বাস নিন {#and-breathe} + +আমরা বেশ কিছুক্ষণ ধরে এটি করছি, তাই বিরতি নেওয়ার জন্য এটি যেকোনো জায়গার মতোই একটি ভালো জায়গা বলে মনে হচ্ছে। রহস্যময় জগতটি চলতে থাকে, এবং আমরা এই সিরিজের দ্বিতীয় অংশে অন্বেষণ চালিয়ে যাব। আসন্ন কিছু ধারণা: একটি বাস্তব নোডের সাথে সংযোগ, স্মার্ট কন্ট্র্যাক্ট এবং টোকেন। কোনো ফলো-আপ প্রশ্ন আছে? আমাকে জানান! আপনার প্রতিক্রিয়া প্রভাবিত করবে আমরা এখান থেকে কোথায় যাব। [টুইটার](https://twitter.com/wolovim)-এর মাধ্যমে অনুরোধ স্বাগত। diff --git a/public/content/translations/bn/developers/tutorials/all-you-can-cache/index.md b/public/content/translations/bn/developers/tutorials/all-you-can-cache/index.md new file mode 100644 index 00000000000..6b13e314a2b --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/all-you-can-cache/index.md @@ -0,0 +1,867 @@ +--- +title: "আপনি যা কিছু ক্যাশ করতে পারেন" +description: "সস্তা রোলআপ লেনদেনের জন্য কীভাবে একটি ক্যাশিং চুক্তি তৈরি এবং ব্যবহার করতে হয় তা শিখুন" +author: Ori Pomerantz +tags: [ "লেয়ার 2", "ক্যাশিং", "সংগ্রহস্থল" ] +skill: intermediate +published: 2022-09-15 +lang: bn +--- + +রোলআপ ব্যবহার করার সময়, ট্রানজ্যাকশনের একটি বাইটের খরচ একটি স্টোরেজ স্লটের খরচের চেয়ে অনেক বেশি ব্যয়বহুল। অতএব, অনচেইনে যতটা সম্ভব তথ্য ক্যাশ করা যুক্তিযুক্ত। + +এই আর্টিকেলে আপনি শিখবেন কীভাবে এমনভাবে একটি ক্যাশিং কন্ট্রাক্ট তৈরি এবং ব্যবহার করতে হয়, যাতে যে কোনো প্যারামিটার ভ্যালু যা একাধিকবার ব্যবহৃত হওয়ার সম্ভাবনা থাকে, তা ক্যাশ করা হবে এবং (প্রথমবার ব্যবহারের পরে) অনেক কম সংখ্যক বাইট দিয়ে ব্যবহারের জন্য উপলব্ধ থাকবে, এবং এই ক্যাশ ব্যবহারকারী অফচেইন কোড কীভাবে লিখতে হয়। + +আপনি যদি আর্টিকেলটি এড়িয়ে যেতে চান এবং শুধু সোর্স কোড দেখতে চান, [এটি এখানে](https://github.com/qbzzt/20220915-all-you-can-cache)। ডেভেলপমেন্ট স্ট্যাকটি হলো [Foundry](https://getfoundry.sh/introduction/installation/)। + +## সামগ্রিক ডিজাইন {#overall-design} + +সরলতার জন্য আমরা ধরে নেব যে সমস্ত ট্রানজ্যাকশন প্যারামিটার `uint256` এবং 32 বাইট দীর্ঘ। যখন আমরা একটি ট্রানজ্যাকশন পাব, আমরা প্রতিটি প্যারামিটার এইভাবে পার্স করব: + +1. যদি প্রথম বাইট `0xFF` হয়, তাহলে পরবর্তী 32 বাইটকে একটি প্যারামিটার ভ্যালু হিসাবে নিন এবং এটি ক্যাশে লিখুন। + +2. যদি প্রথম বাইট `0xFE` হয়, তাহলে পরবর্তী 32 বাইটকে একটি প্যারামিটার ভ্যালু হিসাবে নিন কিন্তু ক্যাশে লিখবেন _না_। + +3. অন্য যেকোনো ভ্যালুর জন্য, উপরের চারটি বিটকে অতিরিক্ত বাইটের সংখ্যা হিসাবে এবং নীচের চারটি বিটকে ক্যাশ কী-এর সবচেয়ে তাৎপর্যপূর্ণ বিট হিসাবে নিন। এখানে কয়েকটি উদাহরণ দেওয়া হল: + + | কলডেটায় বাইট | ক্যাশ কী | + | :-------------- | -------: | + | 0x0F | 0x0F | + | 0x10,0x10 | 0x10 | + | 0x12,0xAC | 0x02AC | + | 0x2D,0xEA, 0xD6 | 0x0DEAD6 | + +## ক্যাশ ম্যানিপুলেশন {#cache-manipulation} + +ক্যাশটি [`Cache.sol`](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol)-এ প্রয়োগ করা হয়েছে। আসুন এটি লাইন বাই লাইন পর্যালোচনা করা যাক। + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + + +contract Cache { + + bytes1 public constant INTO_CACHE = 0xFF; + bytes1 public constant DONT_CACHE = 0xFE; +``` + +এই কনস্ট্যান্টগুলো সেই বিশেষ ক্ষেত্রগুলো ব্যাখ্যা করার জন্য ব্যবহৃত হয় যেখানে আমরা সমস্ত তথ্য প্রদান করি এবং চাই যে এটি ক্যাশে লেখা হোক বা না হোক। ক্যাশে লেখার জন্য, পূর্বে অব্যবহৃত স্টোরেজ স্লটে দুটি [`SSTORE`](https://www.evm.codes/#55) অপারেশন প্রয়োজন হয়, যার প্রতিটির খরচ ২২,১০০ গ্যাস। তাই আমরা এটিকে ঐচ্ছিক করে দিয়েছি। + +```solidity + + mapping(uint => uint) public val2key; +``` + +ভ্যালু এবং তাদের কী-এর মধ্যে একটি [ম্যাপিং](https://www.geeksforgeeks.org/solidity/solidity-mappings/)। ট্রানজ্যাকশন পাঠানোর আগে ভ্যালু এনকোড করার জন্য এই তথ্যটি প্রয়োজন। + +```solidity + // অবস্থান n-এ কী n+1 এর ভ্যালু থাকে, কারণ আমাদের শূন্যকে "ক্যাশে নেই" হিসাবে + // সংরক্ষণ করতে হবে। + uint[] public key2val; +``` + +আমরা কী থেকে ভ্যালু ম্যাপিংয়ের জন্য একটি অ্যারে ব্যবহার করতে পারি, কারণ আমরা কীগুলো বরাদ্দ করি এবং সরলতার জন্য আমরা এটি ক্রমানুসারে করি। + +```solidity + function cacheRead(uint _key) public view returns (uint) { + require(_key <= key2val.length, "প্রাথমিকীকরণ না করা ক্যাশ এন্ট্রি পড়া হচ্ছে"); + return key2val[_key-1]; + } // ক্যাশরিড +``` + +ক্যাশ থেকে একটি ভ্যালু পড়ুন। + +```solidity + // যদি ক্যাশে কোনো ভ্যালু আগে থেকে না থাকে তবে সেটি লিখুন + // শুধুমাত্র টেস্ট কাজ করার জন্য পাবলিক করা হয়েছে + function cacheWrite(uint _value) public returns (uint) { + // যদি ভ্যালুটি ইতিমধ্যে ক্যাশে থাকে, তাহলে বর্তমান কী রিটার্ন করুন + if (val2key[_value] != 0) { + return val2key[_value]; + } +``` + +একই ভ্যালু একাধিকবার ক্যাশে রাখার কোনো মানে হয় না। যদি ভ্যালুটি ইতিমধ্যে সেখানে থাকে, তবে বিদ্যমান কী-টি রিটার্ন করুন। + +```solidity + // যেহেতু 0xFE একটি বিশেষ ক্ষেত্র, ক্যাশ যে সবচেয়ে বড় কী ধারণ করতে + // পারে তা হলো 0x0D এবং এর পরে ১৫টি 0xFF। যদি ক্যাশের দৈর্ঘ্য ইতিমধ্যে ততটা + // বড় হয়, তাহলে ব্যর্থ হবে। + // 1 2 3 4 5 6 7 8 9 A B C D E F + require(key2val.length+1 < 0x0DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, + "ক্যাশ ওভারফ্লো"); +``` + +আমার মনে হয় না আমরা কখনও এত বড় একটি ক্যাশ পাব (প্রায় 1.8\*1037টি এন্ট্রি, যা সঞ্চয় করতে প্রায় 1027 টিবি প্রয়োজন হবে)। তবে, ["640kB সবসময় যথেষ্ট হবে"](https://quoteinvestigator.com/2011/09/08/640k-enough/) এই কথাটা মনে করার মতো যথেষ্ট বয়স আমার হয়েছে। এই টেস্টটির খরচ খুব কম। + +```solidity + // পরবর্তী কী ব্যবহার করে ভ্যালুটি লিখুন + val2key[_value] = key2val.length+1; +``` + +রিভার্স লুকআপ যোগ করুন (ভ্যালু থেকে কী-তে)। + +```solidity + key2val.push(_value); +``` + +ফরওয়ার্ড লুকআপ যোগ করুন (কী থেকে ভ্যালু-তে)। যেহেতু আমরা ক্রমানুসারে ভ্যালু বরাদ্দ করি, তাই আমরা এটিকে শেষ অ্যারে ভ্যালুর পরে যোগ করতে পারি। + +```solidity + return key2val.length; + } // ক্যাশরাইট +``` + +`key2val`-এর নতুন দৈর্ঘ্য রিটার্ন করুন, যা হলো সেই সেল যেখানে নতুন ভ্যালুটি সংরক্ষণ করা হয়েছে। + +```solidity + function _calldataVal(uint startByte, uint length) + private pure returns (uint) +``` + +এই ফাংশনটি কলডেটা থেকে যেকোনো দৈর্ঘ্যের (৩২ বাইট পর্যন্ত, যা একটি ওয়ার্ড সাইজ) একটি ভ্যালু পড়ে। + +```solidity + { + uint _retVal; + + require(length < 0x21, + "_calldataVal দৈর্ঘ্যের সীমা 32 বাইট"); + require(length + startByte <= msg.data.length, + "_calldataVal কলডেটাসাইজের বাইরে পড়ার চেষ্টা করছে"); +``` + +এই ফাংশনটি ইন্টারনাল, তাই যদি বাকি কোড সঠিকভাবে লেখা হয় তবে এই টেস্টগুলো প্রয়োজন নেই। তবে, এগুলোর খরচ বেশি নয় তাই আমরা এগুলো রাখতেই পারি। + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +এই কোডটি [Yul](https://docs.soliditylang.org/en/v0.8.16/yul.html)-এ লেখা। এটি কলডেটা থেকে একটি 32 বাইটের ভ্যালু পড়ে। `startByte+32`-এর আগে কলডেটা শেষ হয়ে গেলেও এটি কাজ করে, কারণ EVM-এ ইনিশিয়ালাইজ না করা স্পেসকে শূন্য হিসাবে বিবেচনা করা হয়। + +```solidity + _retVal = _retVal >> (256-length*8); +``` + +আমাদের যে সবসময় একটি 32 বাইটের ভ্যালু প্রয়োজন, তা নয়। এটি অতিরিক্ত বাইটগুলো সরিয়ে দেয়। + +```solidity + return _retVal; + } // _কলডেটাভ্যাল + + + // _fromByte থেকে শুরু করে কলডেটা থেকে একটি একক প্যারামিটার পড়ুন + function _readParam(uint _fromByte) internal + returns (uint _nextByte, uint _parameterValue) + { +``` + +কলডেটা থেকে একটি একক প্যারামিটার পড়ুন। লক্ষ্য করুন যে আমাদের শুধুমাত্র পড়া ভ্যালুটিই নয়, পরবর্তী বাইটের অবস্থানও রিটার্ন করতে হবে, কারণ প্যারামিটারগুলো 1 বাইট থেকে 33 বাইট দীর্ঘ হতে পারে। + +```solidity + // প্রথম বাইটটি আমাদের বলে দেয় বাকি অংশ কীভাবে ব্যাখ্যা করতে হবে + uint8 _firstByte; + + _firstByte = uint8(_calldataVal(_fromByte, 1)); +``` + +Solidity সম্ভাব্য বিপজ্জনক [অন্তর্নিহিত টাইপ রূপান্তর](https://docs.soliditylang.org/en/v0.8.16/types.html#implicit-conversions) নিষিদ্ধ করে বাগের সংখ্যা কমানোর চেষ্টা করে। একটি ডাউনগ্রেড, উদাহরণস্বরূপ 256 বিট থেকে 8 বিটে, সুস্পষ্ট হতে হবে। + +```solidity + + // Read the value, but do not write it to the cache + if (_firstByte == uint8(DONT_CACHE)) + return(_fromByte+33, _calldataVal(_fromByte+1, 32)); + + // Read the value, and write it to the cache + if (_firstByte == uint8(INTO_CACHE)) { + uint _param = _calldataVal(_fromByte+1, 32); + cacheWrite(_param); + return(_fromByte+33, _param); + } + + // If we got here it means that we need to read from the cache + + // Number of extra bytes to read + uint8 _extraBytes = _firstByte / 16; +``` + +নিচের [নিবল](https://en.wikipedia.org/wiki/Nibble)টি নিন এবং ক্যাশ থেকে ভ্যালুটি পড়ার জন্য এটিকে অন্য বাইটগুলির সাথে একত্রিত করুন। + +```solidity + uint _key = (uint256(_firstByte & 0x0F) << (8*_extraBytes)) + + _calldataVal(_fromByte+1, _extraBytes); + + return (_fromByte+_extraBytes+1, cacheRead(_key)); + + } // _readParam + + + // Read n parameters (functions know how many parameters they expect) + function _readParams(uint _paramNum) internal returns (uint[] memory) { +``` + +আমরা কলডেটা থেকেই আমাদের প্যারামিটারের সংখ্যা জানতে পারতাম, কিন্তু যে ফাংশনগুলো আমাদের কল করে তারা জানে যে তারা কতগুলো প্যারামিটার আশা করে। তাদের কাছ থেকে জেনে নেওয়া সহজ। + +```solidity + // The parameters we read + uint[] memory params = new uint[](_paramNum); + + // Parameters start at byte 4, before that it's the function signature + uint _atByte = 4; + + for(uint i=0; i<_paramNum; i++) { + (_atByte, params[i]) = _readParam(_atByte); + } +``` + +আপনার প্রয়োজনীয় সংখ্যক প্যারামিটার না পাওয়া পর্যন্ত সেগুলো পড়তে থাকুন। আমরা যদি কলডেটার শেষ অতিক্রম করি, তাহলে `_readParams` কলটি বাতিল করে দেবে। + +```solidity + + return(params); + } // readParams + + // For testing _readParams, test reading four parameters + function fourParam() public + returns (uint256,uint256,uint256,uint256) + { + uint[] memory params; + params = _readParams(4); + return (params[0], params[1], params[2], params[3]); + } // fourParam +``` + +Foundry-এর একটি বড় সুবিধা হলো এটি আপনাকে Solidity-তে টেস্ট লিখতে দেয় ([নিচে ক্যাশের টেস্টিং দেখুন](#testing-the-cache))। এটি ইউনিট টেস্টকে অনেক সহজ করে তোলে। এটি একটি ফাংশন যা চারটি প্যারামিটার পড়ে এবং সেগুলোকে রিটার্ন করে যাতে টেস্টটি যাচাই করতে পারে যে সেগুলো সঠিক ছিল। + +```solidity + // Get a value, return bytes that will encode it (using the cache if possible) + function encodeVal(uint _val) public view returns(bytes memory) { +``` + +`encodeVal` একটি ফাংশন যা অফচেইন কোডকে কল করে ক্যাশ ব্যবহার করে এমন কলডেটা তৈরি করতে সাহায্য করে। এটি একটি একক ভ্যালু গ্রহণ করে এবং এটিকে এনকোড করা বাইটগুলো রিটার্ন করে। এই ফাংশনটি একটি `view`, তাই এটির জন্য কোনো ট্রানজ্যাকশনের প্রয়োজন হয় না এবং বাইরে থেকে কল করা হলে কোনো গ্যাস খরচ হয় না। + +```solidity + uint _key = val2key[_val]; + + // The value isn't in the cache yet, add it + if (_key == 0) + return bytes.concat(INTO_CACHE, bytes32(_val)); +``` + +[EVM](/developers/docs/evm/)-এ সমস্ত ইনিশিয়ালাইজ না করা স্টোরেজকে শূন্য বলে ধরে নেওয়া হয়। তাই যদি আমরা এমন একটি ভ্যালুর কী খুঁজি যা সেখানে নেই, আমরা একটি শূন্য পাই। সেই ক্ষেত্রে, এটিকে এনকোড করা বাইটগুলো হলো `INTO_CACHE` (যাতে এটি পরেরবার ক্যাশ করা হবে), যার পরে আসল ভ্যালুটি থাকে। + +```solidity + // If the key is <0x10, return it as a single byte + if (_key < 0x10) + return bytes.concat(bytes1(uint8(_key))); +``` + +একক বাইট সবচেয়ে সহজ। আমরা কেবল [`bytes.concat`](https://docs.soliditylang.org/en/v0.8.16/types.html#the-functions-bytes-concat-and-string-concat) ব্যবহার করে একটি `bytes` টাইপকে একটি বাইট অ্যারেতে পরিণত করি যা যেকোনো দৈর্ঘ্যের হতে পারে। নাম সত্ত্বেও, এটি শুধুমাত্র একটি আর্গুমেন্ট প্রদান করা হলেও ঠিকঠাক কাজ করে। + +```solidity + // Two byte value, encoded as 0x1vvv + if (_key < 0x1000) + return bytes.concat(bytes2(uint16(_key) | 0x1000)); +``` + +যখন আমাদের কাছে 163 এর চেয়ে কম একটি কী থাকে, তখন আমরা এটিকে দুটি বাইটে প্রকাশ করতে পারি। আমরা প্রথমে `_key`, যা একটি 256 বিটের ভ্যালু, কে একটি 16 বিটের ভ্যালুতে রূপান্তর করি এবং প্রথম বাইটে অতিরিক্ত বাইটের সংখ্যা যোগ করার জন্য লজিক্যাল or ব্যবহার করি। তারপর আমরা এটিকে একটি `bytes2` ভ্যালুতে পরিণত করি, যা `bytes`-এ রূপান্তরিত হতে পারে। + +```solidity + // There is probably a clever way to do the following lines as a loop, + // but it's a view function so I'm optimizing for programmer time and + // simplicity. + + if (_key < 16*256**2) + return bytes.concat(bytes3(uint24(_key) | (0x2 * 16 * 256**2))); + if (_key < 16*256**3) + return bytes.concat(bytes4(uint32(_key) | (0x3 * 16 * 256**3))); + . + . + . + if (_key < 16*256**14) + return bytes.concat(bytes15(uint120(_key) | (0xE * 16 * 256**14))); + if (_key < 16*256**15) + return bytes.concat(bytes16(uint128(_key) | (0xF * 16 * 256**15))); +``` + +অন্যান্য ভ্যালুগুলো (3 বাইট, 4 বাইট, ইত্যাদি) একইভাবে পরিচালনা করা হয়, শুধুমাত্র বিভিন্ন ফিল্ড আকারের সাথে। + +```solidity + // If we get here, something is wrong. + revert("Error in encodeVal, should not happen"); +``` + +যদি আমরা এখানে আসি তার মানে আমরা একটি কী পেয়েছি যা 16\*25615 এর চেয়ে কম নয়। কিন্তু `cacheWrite` কীগুলোকে সীমিত করে যাতে আমরা 14\*25616 পর্যন্তও পৌঁছাতে পারি না (যার প্রথম বাইট হবে 0xFE, তাই এটি `DONT_CACHE` এর মতো দেখাবে)। তবে ভবিষ্যতের কোনো প্রোগ্রামার যদি কোনো বাগ তৈরি করে তবে তার জন্য একটি পরীক্ষা যোগ করতে আমাদের বেশি খরচ হবে না। + +```solidity + } // encodeVal + +} // Cache +``` + +### ক্যাশের টেস্টিং {#testing-the-cache} + +Foundry-এর একটি সুবিধা হলো [এটি আপনাকে Solidity-তে টেস্ট লিখতে দেয়](https://getfoundry.sh/forge/tests/overview/), যা ইউনিট টেস্ট লেখা সহজ করে তোলে। `Cache` ক্লাসের জন্য টেস্টগুলো [এখানে](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/Cache.t.sol) আছে। যেহেতু টেস্টিং কোডটি পুনরাবৃত্তিমূলক, যেমনটা টেস্টে হয়ে থাকে, তাই এই নিবন্ধে শুধুমাত্র আকর্ষণীয় অংশগুলো ব্যাখ্যা করা হয়েছে। + +```solidity +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/Test.sol"; + + +// Need to run `forge test -vv` for the console. +import "forge-std/console.sol"; +``` + +এটি শুধুমাত্র একটি বয়লারপ্লেট যা টেস্ট প্যাকেজ এবং `console.log` ব্যবহারের জন্য প্রয়োজন। + +```solidity +import "src/Cache.sol"; +``` + +আমরা যে কন্ট্রাক্টটি পরীক্ষা করছি তা আমাদের জানতে হবে। + +```solidity +contract CacheTest is Test { + Cache cache; + + function setUp() public { + cache = new Cache(); + } +``` + +`setUp` ফাংশনটি প্রতিটি পরীক্ষার আগে কল করা হয়। এই ক্ষেত্রে আমরা কেবল একটি নতুন ক্যাশ তৈরি করি, যাতে আমাদের পরীক্ষাগুলো একে অপরকে প্রভাবিত না করে। + +```solidity + function testCaching() public { +``` + +টেস্টগুলো হলো সেই ফাংশন যাদের নাম `test` দিয়ে শুরু হয়। এই ফাংশনটি মৌলিক ক্যাশ কার্যকারিতা পরীক্ষা করে, ভ্যালু লিখে এবং সেগুলো আবার পড়ে। + +```solidity + for(uint i=1; i<5000; i++) { + cache.cacheWrite(i*i); + } + + for(uint i=1; i<5000; i++) { + assertEq(cache.cacheRead(i), i*i); +``` + +এইভাবে আপনি [`assert...` ফাংশন](https://getfoundry.sh/reference/forge-std/std-assertions/) ব্যবহার করে আসল পরীক্ষাটি করেন। এই ক্ষেত্রে, আমরা পরীক্ষা করি যে আমরা যে মানটি লিখেছি সেটিই আমরা পড়েছি। আমরা `cache.cacheWrite`-এর ফলাফল বাতিল করতে পারি কারণ আমরা জানি যে ক্যাশ কীগুলি রৈখিকভাবে নির্ধারিত হয়। + +```solidity + } + } // testCaching + + + // Cache the same value multiple times, ensure that the key stays + // the same + function testRepeatCaching() public { + for(uint i=1; i<100; i++) { + uint _key1 = cache.cacheWrite(i); + uint _key2 = cache.cacheWrite(i); + assertEq(_key1, _key2); + } +``` + +প্রথমে আমরা প্রতিটি মান ক্যাশে দুইবার লিখি এবং নিশ্চিত করি যে কীগুলি একই আছে (অর্থাৎ দ্বিতীয় লেখাটি আসলে ঘটেনি)। + +```solidity + for(uint i=1; i<100; i+=3) { + uint _key = cache.cacheWrite(i); + assertEq(_key, i); + } + } // testRepeatCaching +``` + +তাত্ত্বিকভাবে এমন একটি বাগ থাকতে পারে যা পরপর ক্যাশ লেখাকে প্রভাবিত করে না। সুতরাং এখানে আমরা কিছু লেখা করি যা পরপর নয় এবং দেখি যে মানগুলি এখনও পুনরায় লেখা হয়নি। + +```solidity + // Read a uint from a memory buffer (to make sure we get back the parameters + // we sent out) + function toUint256(bytes memory _bytes, uint256 _start) internal pure + returns (uint256) +``` + +একটি `bytes memory` বাফার থেকে একটি 256 বিটের শব্দ পড়ুন। এই ইউটিলিটি ফাংশনটি আমাদের যাচাই করতে দেয় যে আমরা যখন ক্যাশ ব্যবহার করে একটি ফাংশন কল চালাই তখন আমরা সঠিক ফলাফল পাই। + +```solidity + { + require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); + uint256 tempUint; + + assembly { + tempUint := mload(add(add(_bytes, 0x20), _start)) + } +``` + +Yul `uint256` এর বাইরে ডেটা কাঠামো সমর্থন করে না, তাই যখন আপনি একটি আরও পরিশীলিত ডেটা কাঠামো উল্লেখ করেন, যেমন মেমরি বাফার `_bytes`, আপনি সেই কাঠামোর অ্যাড্রেস পান। Solidity `bytes memory` মানগুলিকে একটি 32 বাইটের শব্দ হিসাবে সংরক্ষণ করে যার মধ্যে দৈর্ঘ্য থাকে, যার পরে আসল বাইটগুলি থাকে, তাই `_start` নম্বর বাইট পেতে আমাদের `_bytes+32+_start` গণনা করতে হবে। + +```solidity + + return tempUint; + } // toUint256 + + // Function signature for fourParams(), courtesy of + // https://www.4byte.directory/signatures/?bytes4_signature=0x3edc1e6d + bytes4 constant FOUR_PARAMS = 0x3edc1e6d; + + // Just some constant values to see we're getting the correct values back + uint256 constant VAL_A = 0xDEAD60A7; + uint256 constant VAL_B = 0xBEEF; + uint256 constant VAL_C = 0x600D; + uint256 constant VAL_D = 0x600D60A7; +``` + +পরীক্ষার জন্য আমাদের কিছু ধ্রুবক প্রয়োজন। + +```solidity + function testReadParam() public { +``` + +`readParams` ব্যবহার করে এমন একটি ফাংশন `fourParams()` কল করুন, যাতে আমরা প্যারামিটারগুলি সঠিকভাবে পড়তে পারি কিনা তা পরীক্ষা করা যায়। + +```solidity + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; +``` + +আমরা ক্যাশ ব্যবহার করে একটি ফাংশন কল করার জন্য সাধারণ ABI মেকানিজম ব্যবহার করতে পারি না, তাই আমাদের নিম্ন স্তরের [`
.call()`](https://docs.soliditylang.org/en/v0.8.16/types.html#members-of-addresses) মেকানিজম ব্যবহার করতে হবে। সেই মেকানিজম ইনপুট হিসাবে একটি `bytes memory` নেয়, এবং আউটপুট হিসাবে সেটি (পাশাপাশি একটি বুলিয়ান মান) ফেরত দেয়। + +```solidity + // First call, the cache is empty + _callInput = bytes.concat( + FOUR_PARAMS, +``` + +একই চুক্তির জন্য ক্যাশ করা ফাংশন (লেনদেন থেকে সরাসরি কলের জন্য) এবং নন-ক্যাশ করা ফাংশন (অন্যান্য স্মার্ট চুক্তি থেকে কলের জন্য) উভয়ই সমর্থন করা দরকারী। এটি করার জন্য আমাদের সঠিক ফাংশন কল করার জন্য Solidity মেকানিজমের উপর নির্ভর করা চালিয়ে যেতে হবে, সবকিছু একটি [ফলব্যাক ফাংশনে](https://docs.soliditylang.org/en/v0.8.16/contracts.html#fallback-function) রাখার পরিবর্তে। এটি করা কম্পোজেবিলিটিকে অনেক সহজ করে তোলে। একটি একক বাইট বেশিরভাগ ক্ষেত্রে ফাংশন সনাক্ত করার জন্য যথেষ্ট হবে, তাই আমরা তিনটি বাইট (16\*3=48 গ্যাস) অপচয় করছি। তবে, আমি যখন এটি লিখছি তখন সেই 48 গ্যাসের দাম 0.07 সেন্ট, যা সহজ, কম বাগ প্রবণ কোডের জন্য একটি যুক্তিসঙ্গত খরচ। + +```solidity + // First value, add it to the cache + cache.INTO_CACHE(), + bytes32(VAL_A), +``` + +প্রথম মান: একটি ফ্ল্যাগ যা বলে যে এটি একটি সম্পূর্ণ মান যা ক্যাশে লিখতে হবে, যার পরে মানের 32 বাইট থাকে। অন্য তিনটি মান একই রকম, তবে `VAL_B` ক্যাশে লেখা হয় না এবং `VAL_C` তৃতীয় এবং চতুর্থ উভয় প্যারামিটার। + +```solidity + . + . + . + ); + (_success, _callOutput) = _cacheAddr.call(_callInput); +``` + +এখানে আমরা আসলে `Cache` চুক্তি কল করি। + +```solidity + assertEq(_success, true); +``` + +আমরা আশা করি কলটি সফল হবে। + +```solidity + assertEq(cache.cacheRead(1), VAL_A); + assertEq(cache.cacheRead(2), VAL_C); +``` + +আমরা একটি খালি ক্যাশ দিয়ে শুরু করি এবং তারপর `VAL_A` এবং তারপর `VAL_C` যোগ করি। আমরা আশা করব প্রথমটির কী 1 হবে, এবং দ্বিতীয়টির 2 হবে। + +``` + assertEq(toUint256(_callOutput,0), VAL_A); + assertEq(toUint256(_callOutput,32), VAL_B); + assertEq(toUint256(_callOutput,64), VAL_C); + assertEq(toUint256(_callOutput,96), VAL_C); +``` + +আউটপুট হল চারটি প্যারামিটার। এখানে আমরা যাচাই করি যে এটি সঠিক। + +```solidity + // Second call, we can use the cache + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value in the Cache + bytes1(0x01), +``` + +১৬ এর নিচে ক্যাশ কীগুলি মাত্র এক বাইটের হয়। + +```solidity + // Second value, don't add it to the cache + cache.DONT_CACHE(), + bytes32(VAL_B), + + // Third and fourth values, same value + bytes1(0x02), + bytes1(0x02) + ); + . + . + . + } // testReadParam +``` + +কল করার পরের পরীক্ষাগুলি প্রথম কলের পরের পরীক্ষাগুলির মতোই। + +```solidity + function testEncodeVal() public { +``` + +এই ফাংশনটি `testReadParam` এর মতোই, তবে এখানে প্যারামিটারগুলি স্পষ্টভাবে লেখার পরিবর্তে আমরা `encodeVal()` ব্যবহার করি। + +```solidity + . + . + . + _callInput = bytes.concat( + FOUR_PARAMS, + cache.encodeVal(VAL_A), + cache.encodeVal(VAL_B), + cache.encodeVal(VAL_C), + cache.encodeVal(VAL_D) + ); + . + . + . + assertEq(_callInput.length, 4+1*4); + } // testEncodeVal +``` + +`testEncodeVal()`-এ একমাত্র অতিরিক্ত পরীক্ষা হলো `_callInput`-এর দৈর্ঘ্য সঠিক কিনা তা যাচাই করা। প্রথম কলের জন্য এটি 4+33_4। দ্বিতীয়টির জন্য, যেখানে প্রতিটি মান ইতিমধ্যে ক্যাশে রয়েছে, এটি 4+1_4। + +```solidity + // Test encodeVal when the key is more than a single byte + // Maximum three bytes because filling the cache to four bytes takes + // too long. + function testEncodeValBig() public { + // Put a number of values in the cache. + // To keep things simple, use key n for value n. + for(uint i=1; i<0x1FFF; i++) { + cache.cacheWrite(i); + } +``` + +উপরের `testEncodeVal` ফাংশনটি ক্যাশে কেবল চারটি মান লেখে, তাই [ফাংশনের যে অংশটি মাল্টি-বাইট মানগুলির সাথে কাজ করে](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/Cache.sol#L144-L171) তা পরীক্ষা করা হয় না। কিন্তু সেই কোডটি জটিল এবং ভুল-প্রবণ। + +এই ফাংশনের প্রথম অংশটি একটি লুপ যা 1 থেকে 0x1FFF পর্যন্ত সমস্ত মান ক্যাশে ক্রমানুসারে লেখে, যাতে আমরা সেই মানগুলিকে এনকোড করতে পারি এবং জানতে পারি যে সেগুলি কোথায় যাচ্ছে। + +```solidity + . + . + . + + _callInput = bytes.concat( + FOUR_PARAMS, + cache.encodeVal(0x000F), // One byte 0x0F + cache.encodeVal(0x0010), // Two bytes 0x1010 + cache.encodeVal(0x0100), // Two bytes 0x1100 + cache.encodeVal(0x1000) // Three bytes 0x201000 + ); +``` + +এক বাইট, দুই বাইট, এবং তিন বাইটের মান পরীক্ষা করুন। আমরা এর বাইরে পরীক্ষা করি না কারণ পর্যাপ্ত স্ট্যাক এন্ট্রি (অন্তত 0x10000000, প্রায় এক চতুর্থাংশ বিলিয়ন) লিখতে অনেক সময় লাগবে। + +```solidity + . + . + . + . + } // testEncodeValBig + + + // Test what with an excessively small buffer we get a revert + function testShortCalldata() public { +``` + +যখন পর্যাপ্ত প্যারামিটার না থাকে তখন অস্বাভাবিক ক্ষেত্রে কী ঘটে তা পরীক্ষা করুন। + +```solidity + . + . + . + (_success, _callOutput) = _cacheAddr.call(_callInput); + assertEq(_success, false); + } // testShortCalldata +``` + +যেহেতু এটি রিভার্ট হয়, তাই আমাদের যে ফলাফল পাওয়া উচিত তা হলো `false`। + +``` + // Call with cache keys that aren't there + function testNoCacheKey() public { + . + . + . + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value, add it to the cache + cache.INTO_CACHE(), + bytes32(VAL_A), + + // Second value + bytes1(0x0F), + bytes2(0x1234), + bytes11(0xA10102030405060708090A) + ); +``` + +এই ফাংশনটি চারটি সম্পূর্ণ বৈধ প্যারামিটার পায়, তবে ক্যাশটি খালি হওয়ায় সেখানে পড়ার জন্য কোনো মান নেই। + +```solidity + . + . + . + // Test what with an excessively long buffer everything works file + function testLongCalldata() public { + address _cacheAddr = address(cache); + bool _success; + bytes memory _callInput; + bytes memory _callOutput; + + // First call, the cache is empty + _callInput = bytes.concat( + FOUR_PARAMS, + + // First value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_A), + + // Second value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_B), + + // Third value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_C), + + // Fourth value, add it to the cache + cache.INTO_CACHE(), bytes32(VAL_D), + + // And another value for "good luck" + bytes4(0x31112233) + ); +``` + +এই ফাংশনটি পাঁচটি মান পাঠায়। আমরা জানি যে পঞ্চম মানটি উপেক্ষা করা হয় কারণ এটি একটি বৈধ ক্যাশ এন্ট্রি নয়, যা অন্তর্ভুক্ত না হলে একটি রিভার্ট ঘটাত। + +```solidity + (_success, _callOutput) = _cacheAddr.call(_callInput); + assertEq(_success, true); + . + . + . + } // testLongCalldata + +} // CacheTest + +``` + +## একটি নমুনা অ্যাপ্লিকেশন {#a-sample-app} + +Solidity-তে টেস্ট লেখা খুবই ভালো, কিন্তু দিনের শেষে একটি dapp-কে চেইনের বাইরে থেকে অনুরোধ প্রক্রিয়া করতে সক্ষম হতে হবে যাতে এটি কার্যকর হয়। এই নিবন্ধটি `WORM` দিয়ে একটি dapp-এ ক্যাশিং কীভাবে ব্যবহার করতে হয় তা প্রদর্শন করে, যার অর্থ "Write Once, Read Many"। যদি একটি কী এখনও লেখা না থাকে, আপনি তাতে একটি মান লিখতে পারেন। যদি কীটি ইতিমধ্যে লেখা থাকে, আপনি একটি রিভার্ট পাবেন। + +### চুক্তিটি {#the-contract} + +[এটি হলো চুক্তি](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/src/WORM.sol)। এটি মূলত `Cache` এবং `CacheTest` দিয়ে আমরা যা করেছি তার পুনরাবৃত্তি করে, তাই আমরা কেবল আকর্ষণীয় অংশগুলি কভার করব। + +```solidity +import "./Cache.sol"; + +contract WORM is Cache { +``` + +`Cache` ব্যবহার করার সবচেয়ে সহজ উপায় হল আমাদের নিজস্ব চুক্তিতে এটি ইনহেরিট করা। + +```solidity + function writeEntryCached() external { + uint[] memory params = _readParams(2); + writeEntry(params[0], params[1]); + } // writeEntryCached +``` + +এই ফাংশনটি উপরের `CacheTest`-এর `fourParam`-এর মতোই। যেহেতু আমরা ABI স্পেসিফিকেশন অনুসরণ করি না, তাই ফাংশনে কোনো প্যারামিটার ঘোষণা না করাই ভালো। + +```solidity + // Make it easier to call us + // Function signature for writeEntryCached(), courtesy of + // https://www.4byte.directory/signatures/?bytes4_signature=0xe4e4f2d3 + bytes4 constant public WRITE_ENTRY_CACHED = 0xe4e4f2d3; +``` + +`writeEntryCached` কল করা বাহ্যিক কোডকে ম্যানুয়ালি কলডেটা তৈরি করতে হবে, `worm.writeEntryCached` ব্যবহার করার পরিবর্তে, কারণ আমরা ABI স্পেসিফিকেশন অনুসরণ করি না। এই ধ্রুবক মানটি কেবল এটি লেখা সহজ করে তোলে। + +মনে রাখবেন যে যদিও আমরা `WRITE_ENTRY_CACHED`-কে একটি স্টেট ভেরিয়েবল হিসাবে সংজ্ঞায়িত করি, তবে এটি বাহ্যিকভাবে পড়ার জন্য এটির জন্য গেটার ফাংশন ব্যবহার করা প্রয়োজন, `worm.WRITE_ENTRY_CACHED()`। + +```solidity + function readEntry(uint key) public view + returns (uint _value, address _writtenBy, uint _writtenAtBlock) +``` + +পড়ার ফাংশনটি একটি `view`, তাই এটির জন্য কোনো লেনদেনের প্রয়োজন হয় না এবং কোনো গ্যাস খরচ হয় না। ফলস্বরূপ, প্যারামিটারের জন্য ক্যাশ ব্যবহার করার কোনো সুবিধা নেই। ভিউ ফাংশনগুলির সাথে স্ট্যান্ডার্ড মেকানিজম ব্যবহার করা ভালো যা সহজতর। + +### টেস্টিং কোড {#the-testing-code} + +[এটি হলো চুক্তির জন্য টেস্টিং কোড](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/test/WORM.t.sol)। আবার, চলুন কেবল যা আকর্ষণীয় তা দেখি। + +```solidity + function testWReadWrite() public { + worm.writeEntry(0xDEAD, 0x60A7); + + vm.expectRevert(bytes("entry already written")); + worm.writeEntry(0xDEAD, 0xBEEF); +``` + +[এটি (`vm.expectRevert`)](https://book.getfoundry.sh/cheatcodes/expect-revert#expectrevert) হলো যেভাবে আমরা একটি Foundry টেস্টে নির্দিষ্ট করি যে পরবর্তী কলটি ব্যর্থ হওয়া উচিত, এবং ব্যর্থতার জন্য রিপোর্ট করা কারণ। এটি প্রযোজ্য যখন আমরা `.` সিনট্যাক্স ব্যবহার করি।()` কলডেটা তৈরি করে এবং নিম্ন স্তরের ইন্টারফেস (`.call()`, ইত্যাদি) ব্যবহার করে চুক্তি কল করার পরিবর্তে। + +```solidity + function testReadWriteCached() public { + uint cacheGoat = worm.cacheWrite(0x60A7); +``` + +এখানে আমরা এই সত্যটি ব্যবহার করি যে `cacheWrite` ক্যাশ কী ফেরত দেয়। এটি এমন কিছু নয় যা আমরা উৎপাদনে ব্যবহার করার আশা করব, কারণ `cacheWrite` স্টেট পরিবর্তন করে, এবং তাই কেবল একটি লেনদেনের সময় কল করা যেতে পারে। লেনদেনের কোনো রিটার্ন মান থাকে না, যদি তাদের ফলাফল থাকে তবে সেই ফলাফলগুলি ইভেন্ট হিসাবে নির্গত হওয়ার কথা। তাই `cacheWrite` রিটার্ন মান কেবল অনচেইন কোড থেকে অ্যাক্সেসযোগ্য, এবং অনচেইন কোডের জন্য প্যারামিটার ক্যাশিংয়ের প্রয়োজন নেই। + +```solidity + (_success,) = address(worm).call(_callInput); +``` + +এইভাবে আমরা Solidity-কে বলি যে যদিও `.call()`-এর দুটি রিটার্ন মান রয়েছে, আমরা কেবল প্রথমটির প্রতি যত্নশীল। + +```solidity + (_success,) = address(worm).call(_callInput); + assertEq(_success, false); +``` + +যেহেতু আমরা নিম্ন স্তরের `
.call()` ফাংশন ব্যবহার করি, আমরা `vm.expectRevert()` ব্যবহার করতে পারি না এবং কল থেকে পাওয়া বুলিয়ান সাফল্য মানের দিকে তাকাতে হবে। + +```solidity + event EntryWritten(uint indexed key, uint indexed value); + + . + . + . + + _callInput = bytes.concat( + worm.WRITE_ENTRY_CACHED(), worm.encodeVal(a), worm.encodeVal(b)); + vm.expectEmit(true, true, false, false); + emit EntryWritten(a, b); + (_success,) = address(worm).call(_callInput); +``` + +এটি সেই উপায় যা আমরা যাচাই করি যে কোডটি Foundry-তে [সঠিকভাবে একটি ইভেন্ট নির্গত করে](https://getfoundry.sh/reference/cheatcodes/expect-emit/)। + +### ক্লায়েন্ট {#the-client} + +একটি জিনিস যা আপনি Solidity পরীক্ষার সাথে পান না তা হল JavaScript কোড যা আপনি আপনার নিজের অ্যাপ্লিকেশনে কাট এবং পেস্ট করতে পারেন। সেই কোডটি লেখার জন্য আমি WORM-কে [Optimism Goerli](https://community.optimism.io/docs/useful-tools/networks/#optimism-goerli)-তে ডিপ্লয় করেছি, যা [Optimism](https://www.optimism.io/)-এর নতুন টেস্টনেট। এটি ঠিকানা [`0xd34335b1d818cee54e3323d3246bd31d94e6a78a`](https://goerli-optimism.etherscan.io/address/0xd34335b1d818cee54e3323d3246bd31d94e6a78a)-এ রয়েছে। + +[আপনি ক্লায়েন্টের জন্য JavaScript কোড এখানে দেখতে পারেন](https://github.com/qbzzt/20220915-all-you-can-cache/blob/main/javascript/index.js)। এটি ব্যবহার করতে: + +1. গিট রিপোজিটরি ক্লোন করুন: + + ```sh + git clone https://github.com/qbzzt/20220915-all-you-can-cache.git + ``` + +2. প্রয়োজনীয় প্যাকেজ ইনস্টল করুন: + + ```sh + cd javascript + yarn + ``` + +3. কনফিগারেশন ফাইলটি অনুলিপি করুন: + + ```sh + cp .env.example .env + ``` + +4. আপনার কনফিগারেশনের জন্য `.env` সম্পাদনা করুন: + + | প্যারামিটার | মান | + | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + | স্মৃতিচিহ্ন | একটি অ্যাকাউন্টের জন্য নেমোনিক যার একটি লেনদেনের জন্য অর্থ প্রদানের জন্য পর্যাপ্ত ETH আছে। [আপনি এখানে Optimism Goerli নেটওয়ার্কের জন্য বিনামূল্যে ETH পেতে পারেন](https://optimismfaucet.xyz/)। | + | OPTIMISM_GOERLI_URL | Optimism Goerli-এর URL। পাবলিক এন্ডপয়েন্ট, `https://goerli.optimism.io`, রেট সীমিত কিন্তু আমাদের এখানে যা প্রয়োজন তার জন্য যথেষ্ট | + +5. `index.js` চালান। + + ```sh + node index.js + ``` + + এই নমুনা অ্যাপ্লিকেশনটি প্রথমে WORM-এ একটি এন্ট্রি লেখে, কলডেটা এবং Etherscan-এ লেনদেনের একটি লিঙ্ক প্রদর্শন করে। তারপরে এটি সেই এন্ট্রিটি আবার পড়ে, এবং এটি যে কী ব্যবহার করে এবং এন্ট্রিতে থাকা মানগুলি (মান, ব্লক নম্বর এবং লেখক) প্রদর্শন করে। + +ক্লায়েন্টের বেশিরভাগই সাধারণ Dapp জাভাস্ক্রিপ্ট। তাই আবার আমরা কেবল আকর্ষণীয় অংশগুলি নিয়ে আলোচনা করব। + +```javascript +. +. +. +const main = async () => { + const func = await worm.WRITE_ENTRY_CACHED() + + // Need a new key every time + const key = await worm.encodeVal(Number(new Date())) +``` + +একটি প্রদত্ত স্লটে কেবল একবারই লেখা যায়, তাই আমরা স্লটগুলি পুনরায় ব্যবহার না করার জন্য টাইমস্ট্যাম্প ব্যবহার করি। + +```javascript +const val = await worm.encodeVal("0x600D") + +// Write an entry +const calldata = func + key.slice(2) + val.slice(2) +``` + +Ethers আশা করে যে কল ডেটা একটি হেক্স স্ট্রিং হবে, `0x` যার পরে একটি জোড় সংখ্যক হেক্সাডেসিমেল ডিজিট থাকবে। যেহেতু `key` এবং `val` উভয়ই `0x` দিয়ে শুরু হয়, তাই আমাদের সেই হেডারগুলি সরাতে হবে। + +```javascript +const tx = await worm.populateTransaction.writeEntryCached() +tx.data = calldata + +sentTx = await wallet.sendTransaction(tx) +``` + +Solidity টেস্টিং কোডের মতোই, আমরা সাধারণত একটি ক্যাশ করা ফাংশন কল করতে পারি না। পরিবর্তে, আমাদের একটি নিম্ন স্তরের প্রক্রিয়া ব্যবহার করতে হবে। + +```javascript + . + . + . + // Read the entry just written + const realKey = '0x' + key.slice(4) // remove the FF flag + const entryRead = await worm.readEntry(realKey) + . + . + . +``` + +এন্ট্রি পড়ার জন্য আমরা সাধারণ প্রক্রিয়া ব্যবহার করতে পারি। `view` ফাংশনগুলির সাথে প্যারামিটার ক্যাশিং ব্যবহার করার কোনো প্রয়োজন নেই। + +## উপসংহার {#conclusion} + +এই নিবন্ধের কোডটি একটি ধারণার প্রমাণ, উদ্দেশ্য হলো ধারণাটি বোঝা সহজ করা। একটি উৎপাদন-প্রস্তুত সিস্টেমের জন্য আপনি কিছু অতিরিক্ত কার্যকারিতা প্রয়োগ করতে চাইতে পারেন: + +- `uint256` নয় এমন মানগুলি হ্যান্ডেল করুন। উদাহরণস্বরূপ, স্ট্রিং। +- একটি গ্লোবাল ক্যাশের পরিবর্তে, ব্যবহারকারী এবং ক্যাশের মধ্যে একটি ম্যাপিং থাকতে পারে। বিভিন্ন ব্যবহারকারী বিভিন্ন মান ব্যবহার করেন। +- ঠিকানার জন্য ব্যবহৃত মানগুলি অন্যান্য উদ্দেশ্যে ব্যবহৃত মানগুলি থেকে পৃথক। শুধুমাত্র ঠিকানাগুলির জন্য একটি পৃথক ক্যাশ থাকা বুদ্ধিমানের কাজ হতে পারে। +- বর্তমানে, ক্যাশ কীগুলি একটি "প্রথম আসা, সবচেয়ে ছোট কী" অ্যালগরিদমে রয়েছে। প্রথম ষোলটি মান একটি একক বাইট হিসাবে পাঠানো যেতে পারে। পরবর্তী 4080টি মান দুটি বাইট হিসাবে পাঠানো যেতে পারে। পরবর্তী প্রায় মিলিয়ন মান তিন বাইটের, ইত্যাদি। একটি প্রোডাকশন সিস্টেমের ক্যাশ এন্ট্রিগুলিতে ব্যবহারের কাউন্টার রাখা উচিত এবং সেগুলিকে পুনর্গঠন করা উচিত যাতে ষোলটি _সবচেয়ে সাধারণ_ মান এক বাইট, পরবর্তী 4080টি সবচেয়ে সাধারণ মান দুই বাইট ইত্যাদি হয়। + + তবে, এটি একটি সম্ভাব্য বিপজ্জনক অপারেশন। নিম্নলিখিত ঘটনাগুলির ক্রম কল্পনা করুন: + + 1. নোয়াম নাইভ `encodeVal` কল করে যে ঠিকানায় সে টোকেন পাঠাতে চায় তা এনকোড করার জন্য। সেই ঠিকানাটি অ্যাপ্লিকেশনে ব্যবহৃত প্রথমগুলির মধ্যে একটি, তাই এনকোড করা মানটি হলো 0x06। এটি একটি `view` ফাংশন, কোনো লেনদেন নয়, তাই এটি নোয়াম এবং সে যে নোড ব্যবহার করে তার মধ্যে, এবং অন্য কেউ এ সম্পর্কে জানে না + + 2. ওয়েন ওনার ক্যাশ পুনর্বিন্যাস অপারেশন চালায়। খুব কম লোকই আসলে সেই ঠিকানাটি ব্যবহার করে, তাই এটি এখন 0x201122 হিসাবে এনকোড করা হয়েছে। একটি ভিন্ন মান, 1018, 0x06 বরাদ্দ করা হয়েছে। + + 3. নোয়াম নাইভ তার টোকেনগুলি 0x06-এ পাঠায়। সেগুলো `0x0000000000000000000000000de0b6b3a7640000` অ্যাড্রেসে চলে যায়, এবং যেহেতু সেই অ্যাড্রেসের প্রাইভেট কী কেউ জানে না, তাই সেগুলো সেখানেই আটকে থাকে। নোয়াম _খুশি নয়_। + + এই সমস্যা এবং এর সাথে সম্পর্কিত ক্যাশ রিঅর্ডারের সময় মেমপুলে থাকা ট্রানজ্যাকশনের সমস্যা সমাধানের উপায় আছে, কিন্তু আপনাকে এ বিষয়ে সচেতন থাকতে হবে। + +আমি এখানে Optimism-এর সাথে ক্যাশিং প্রদর্শন করেছি, কারণ আমি একজন Optimism কর্মচারী এবং এটিই আমার সবচেয়ে পরিচিত রোলআপ। কিন্তু এটি যেকোনো রোলআপের সাথে কাজ করা উচিত যা অভ্যন্তরীণ প্রক্রিয়াকরণের জন্য একটি ন্যূনতম খরচ নেয়, যাতে তুলনায় লেনদেন ডেটা L1-এ লেখা প্রধান ব্যয় হয়। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। + diff --git a/public/content/translations/bn/developers/tutorials/app-plasma/index.md b/public/content/translations/bn/developers/tutorials/app-plasma/index.md new file mode 100644 index 00000000000..8793f4fde3c --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/app-plasma/index.md @@ -0,0 +1,1255 @@ +--- +title: "একটি অ্যাপ-নির্দিষ্ট প্লাসমা লিখুন যা গোপনীয়তা রক্ষা করে" +description: "এই টিউটোরিয়ালে, আমরা ডিপোজিটের জন্য একটি আধা-গোপন ব্যাংক তৈরি করি। ব্যাংকটি একটি কেন্দ্রীভূত উপাদান; এটি প্রতিটি ব্যবহারকারীর ব্যালেন্স জানে। তবে, এই তথ্য অনচেইনে সংরক্ষণ করা হয় না। পরিবর্তে, ব্যাংক স্টেটের একটি হ্যাস পোস্ট করে। যখনই কোনো লেনদেন ঘটে, ব্যাংকটি নতুন হ্যাস পোস্ট করে, সঙ্গে একটি জিরো-নলেজ প্রুফ দিয়ে থাকে যে এটিতে একটি স্বাক্ষরিত লেনদেন রয়েছে যা হ্যাস স্টেটকে নতুনটিতে পরিবর্তন করে। এই টিউটোরিয়ালটি পড়ার পরে, আপনি কেবল কীভাবে জিরো-নলেজ প্রুফ ব্যবহার করবেন তা-ই বুঝবেন না, বরং কেন আপনি সেগুলি ব্যবহার করবেন এবং কীভাবে নিরাপদে তা করবেন তাও বুঝবেন।" +author: Ori Pomerantz +tags: [ "জিরো-নলেজ", "সার্ভার", "অফচেইন", "গোপনীয়তা" ] +skill: advanced +lang: bn +published: 2025-10-15 +--- + +## ভূমিকা {#introduction} + +[রোলআপ](/developers/docs/scaling/zk-rollups/) এর বিপরীতে, [প্লাসমা](/developers/docs/scaling/plasma) ইন্টিগ্রিটির জন্য ইথেরিয়াম মেইননেট ব্যবহার করে, কিন্তু অ্যাভেইলেবিলিটির জন্য নয়। এই নিবন্ধে, আমরা এমন একটি অ্যাপ্লিকেশন লিখি যা প্লাজমার মতো আচরণ করে, যেখানে ইথেরিয়াম ইন্টিগ্রিটির (কোনো অননুমোদিত পরিবর্তন নয়) নিশ্চয়তা দেয় কিন্তু অ্যাভেইলেবিলিটির নয় (একটি কেন্দ্রীভূত উপাদান ডাউন হয়ে পুরো সিস্টেমটিকে নিষ্ক্রিয় করতে পারে)। + +এখানে আমরা যে অ্যাপ্লিকেশনটি লিখি তা হল একটি গোপনীয়তা-সংরক্ষণকারী ব্যাংক। বিভিন্ন অ্যাড্রেসের ব্যালেন্সসহ অ্যাকাউন্ট থাকে এবং তারা অন্য অ্যাকাউন্টে টাকা (ETH) পাঠাতে পারে। ব্যাংক স্টেটের (অ্যাকাউন্ট এবং তাদের ব্যালেন্স) এবং লেনদেনের হ্যাস পোস্ট করে, কিন্তু প্রকৃত ব্যালেন্স অফচেইনে রাখে যেখানে সেগুলি ব্যক্তিগত থাকতে পারে। + +## ডিজাইন {#design} + +এটি কোনো প্রোডাকশন-রেডি সিস্টেম নয়, বরং একটি শিক্ষামূলক টুল। যেমন, এটি বেশ কয়েকটি সরলীকরণমূলক ধারণার উপর ভিত্তি করে লেখা হয়েছে। + +- নির্দিষ্ট অ্যাকাউন্ট পুল। এখানে একটি নির্দিষ্ট সংখ্যক অ্যাকাউন্ট রয়েছে এবং প্রতিটি অ্যাকাউন্ট একটি পূর্বনির্ধারিত অ্যাড্রেসের অন্তর্গত। এটি একটি অনেক সহজ সিস্টেম তৈরি করে কারণ জিরো-নলেজ প্রুফে পরিবর্তনশীল-আকারের ডেটা স্ট্রাকচার পরিচালনা করা কঠিন। একটি প্রোডাকশন-রেডি সিস্টেমের জন্য, আমরা স্টেট হ্যাস হিসাবে [মার্কল রুট](/developers/tutorials/merkle-proofs-for-offline-data-integrity/) ব্যবহার করতে পারি এবং প্রয়োজনীয় ব্যালেন্সের জন্য মার্কল প্রুফ প্রদান করতে পারি। + +- মেমরি স্টোরেজ। একটি প্রোডাকশন সিস্টেমে, রিস্টার্টের ক্ষেত্রে সেগুলি সংরক্ষণের জন্য আমাদের সমস্ত অ্যাকাউন্ট ব্যালেন্স ডিস্কে লিখতে হবে। এখানে, তথ্য যদি সহজভাবে হারিয়ে যায় তবে ঠিক আছে। + +- শুধুমাত্র ট্রান্সফার। একটি প্রোডাকশন সিস্টেমে ব্যাংকে সম্পদ জমা করার এবং সেগুলি উত্তোলন করার একটি উপায় প্রয়োজন হবে। কিন্তু এখানে উদ্দেশ্য শুধু ধারণাটি চিত্রিত করা, তাই এই ব্যাংক শুধুমাত্র ট্রান্সফারে সীমাবদ্ধ। + +### জিরো-নলেজ প্রুফ {#zero-knowledge-proofs} + +একটি মৌলিক স্তরে, একটি জিরো-নলেজ প্রুফ দেখায় যে প্রোভার কিছু ডেটা, _Dataprivate_ জানে, যেমন কিছু পাবলিক ডেটা, _Datapublic_, এবং _Dataprivate_ এর মধ্যে একটি সম্পর্ক _Relationship_ রয়েছে। ভেরিফায়ার _Relationship_ এবং _Datapublic_ জানে। + +গোপনীয়তা রক্ষা করতে, আমাদের স্টেট এবং লেনদেনগুলি ব্যক্তিগত হতে হবে। কিন্তু ইন্টিগ্রিটি নিশ্চিত করতে, আমাদের স্টেটের [ক্রিপ্টোগ্রাফিক হ্যাস](https://en.wikipedia.org/wiki/Cryptographic_hash_function) পাবলিক হতে হবে। যারা লেনদেন জমা দেয় তাদের কাছে প্রমাণ করার জন্য যে সেই লেনদেনগুলি সত্যিই ঘটেছে, আমাদের লেনদেন হ্যাস পোস্ট করতে হবে। + +বেশিরভাগ ক্ষেত্রে, _Dataprivate_ হল জিরো-নলেজ প্রুফ প্রোগ্রামের ইনপুট এবং _Datapublic_ হল আউটপুট। + +_Dataprivate_-এর এই ফিল্ডগুলি: + +- _Staten_, পুরনো স্টেট +- _Staten+1_, নতুন স্টেট +- _Transaction_, একটি লেনদেন যা পুরনো স্টেট থেকে নতুনটিতে পরিবর্তিত হয়। এই লেনদেনে এই ফিল্ডগুলি অন্তর্ভুক্ত করা প্রয়োজন: + - _Destination address_ যা ট্রান্সফার গ্রহণ করে + - _Amount_ যা ট্রান্সফার করা হচ্ছে + - _Nonce_ প্রতিটি লেনদেন শুধুমাত্র একবার প্রক্রিয়াজাত করা যাবে তা নিশ্চিত করার জন্য। + উৎস অ্যাড্রেস লেনদেনে থাকার প্রয়োজন নেই, কারণ এটি সিগনেচার থেকে পুনরুদ্ধার করা যায়। +- _Signature_, একটি সিগনেচার যা লেনদেন সম্পাদনের জন্য অনুমোদিত। আমাদের ক্ষেত্রে, একটি লেনদেন সম্পাদনের জন্য অনুমোদিত একমাত্র অ্যাড্রেস হল উৎস অ্যাড্রেস। যেহেতু আমাদের জিরো-নলেজ সিস্টেম যেভাবে কাজ করে, সেহেতু ইথেরিয়াম সিগনেচার ছাড়াও আমাদের অ্যাকাউন্টের পাবলিক কী প্রয়োজন। + +_Datapublic_-এর ফিল্ডগুলি হল: + +- _Hash(Staten)_ পুরনো স্টেটের হ্যাস +- _Hash(Staten+1)_ নতুন স্টেটের হ্যাস +- _Hash(Transaction)_ হল সেই লেনদেনের হ্যাস যা স্টেটকে _Staten_ থেকে _Staten+1_-এ পরিবর্তন করে। + +সম্পর্কটি বেশ কয়েকটি শর্ত পরীক্ষা করে: + +- পাবলিক হ্যাসগুলো প্রকৃতপক্ষে ব্যক্তিগত ফিল্ডগুলোর জন্য সঠিক হ্যাস। +- লেনদেনটি, যখন পুরনো স্টেটের উপর প্রয়োগ করা হয়, তখন নতুন স্টেট তৈরি হয়। +- সিগনেচারটি লেনদেনের উৎস অ্যাড্রেস থেকে আসে। + +ক্রিপ্টোগ্রাফিক হ্যাস ফাংশনের বৈশিষ্ট্যের কারণে, এই শর্তগুলি প্রমাণ করাই ইন্টিগ্রিটি নিশ্চিত করার জন্য যথেষ্ট। + +### ডেটা স্ট্রাকচার {#data-structures} + +প্রাথমিক ডেটা স্ট্রাকচার হল সার্ভার দ্বারা ধারণকৃত স্টেট। প্রতিটি অ্যাকাউন্টের জন্য, সার্ভার অ্যাকাউন্ট ব্যালেন্স এবং একটি [ননস](https://en.wikipedia.org/wiki/Cryptographic_nonce) ট্র্যাক করে, যা [রিপ্লে অ্যাটাক](https://en.wikipedia.org/wiki/Replay_attack) প্রতিরোধ করতে ব্যবহৃত হয়। + +### উপাদান {#components} + +এই সিস্টেমের জন্য দুটি উপাদান প্রয়োজন: + +- _সার্ভার_ যা লেনদেন গ্রহণ করে, সেগুলি প্রক্রিয়া করে, এবং জিরো-নলেজ প্রুফের সাথে চেইনে হ্যাস পোস্ট করে। +- একটি _স্মার্ট কন্ট্র্যাক্ট_ যা হ্যাস সংরক্ষণ করে এবং স্টেট ট্রানজিশনগুলি বৈধ তা নিশ্চিত করার জন্য জিরো-নলেজ প্রুফ যাচাই করে। + +### ডেটা এবং কন্ট্রোল ফ্লো {#flows} + +এগুলি হল সেই উপায়গুলি যার মাধ্যমে বিভিন্ন উপাদান একটি অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে ট্রান্সফারের জন্য যোগাযোগ করে। + +1. একটি ওয়েব ব্রাউজার স্বাক্ষরকারীর অ্যাকাউন্ট থেকে একটি ভিন্ন অ্যাকাউন্টে ট্রান্সফারের জন্য একটি স্বাক্ষরিত লেনদেন জমা দেয়। + +2. সার্ভার যাচাই করে যে লেনদেনটি বৈধ: + + - স্বাক্ষরকারীর ব্যাংকে একটি অ্যাকাউন্ট আছে যার পর্যাপ্ত ব্যালেন্স রয়েছে। + - প্রাপকের ব্যাংকে একটি অ্যাকাউন্ট আছে। + +3. সার্ভার স্বাক্ষরকারীর ব্যালেন্স থেকে ট্রান্সফার করা পরিমাণ বিয়োগ করে এবং প্রাপকের ব্যালেন্সে যোগ করে নতুন স্টেট গণনা করে। + +4. সার্ভার একটি জিরো-নলেজ প্রুফ গণনা করে যে স্টেট পরিবর্তনটি একটি বৈধ পরিবর্তন। + +5. সার্ভার ইথেরিয়ামে একটি লেনদেন জমা দেয় যার মধ্যে রয়েছে: + + - নতুন স্টেট হ্যাস + - লেনদেন হ্যাস (যাতে লেনদেন প্রেরক জানতে পারে যে এটি প্রক্রিয়াজাত হয়েছে) + - জিরো-নলেজ প্রুফ যা প্রমাণ করে যে নতুন স্টেটে ট্রানজিশনটি বৈধ + +6. স্মার্ট কন্ট্র্যাক্ট জিরো-নলেজ প্রুফ যাচাই করে। + +7. যদি জিরো-নলেজ প্রুফ ঠিক থাকে, স্মার্ট কন্ট্র্যাক্ট এই কাজগুলি সম্পাদন করে: + - বর্তমান স্টেট হ্যাসকে নতুন স্টেট হ্যাসে আপডেট করুন + - নতুন স্টেট হ্যাস এবং লেনদেন হ্যাস সহ একটি লগ এন্ট্রি নির্গত করুন + +### টুলস {#tools} + +ক্লায়েন্ট-সাইড কোডের জন্য, আমরা [Vite](https://vite.dev/), [React](https://react.dev/), [Viem](https://viem.sh/), এবং [Wagmi](https://wagmi.sh/) ব্যবহার করতে যাচ্ছি। এগুলি ইন্ডাস্ট্রি-স্ট্যান্ডার্ড টুলস; আপনি যদি এগুলির সাথে পরিচিত না হন, তবে আপনি [এই টিউটোরিয়ালটি](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) ব্যবহার করতে পারেন। + +সার্ভারের বেশিরভাগ অংশ JavaScript ব্যবহার করে [Node](https://nodejs.org/en)-এ লেখা হয়েছে। জিরো-নলেজ অংশটি [Noir](https://noir-lang.org/)-এ লেখা হয়েছে। আমাদের সংস্করণ `1.0.0-beta.10` প্রয়োজন, তাই আপনি [নির্দেশনা অনুযায়ী Noir ইনস্টল](https://noir-lang.org/docs/getting_started/quick_start) করার পরে, চালান: + +``` +noirup -v 1.0.0-beta.10 +``` + +আমরা যে ব্লকচেইনটি ব্যবহার করি তা হল `anvil`, একটি স্থানীয় টেস্টিং ব্লকচেইন যা [Foundry](https://getfoundry.sh/introduction/installation)-এর একটি অংশ। + +## বাস্তবায়ন {#implementation} + +যেহেতু এটি একটি জটিল সিস্টেম, আমরা এটি ধাপে ধাপে বাস্তবায়ন করব। + +### স্টেজ ১ - ম্যানুয়াল জিরো নলেজ {#stage-1} + +প্রথম স্টেজের জন্য, আমরা ব্রাউজারে একটি লেনদেনে স্বাক্ষর করব এবং তারপর ম্যানুয়ালি জিরো-নলেজ প্রুফে তথ্য প্রদান করব। জিরো-নলেজ কোড `server/noir/Prover.toml`-এ সেই তথ্য পাওয়ার আশা করে (যা [এখানে](https://noir-lang.org/docs/getting_started/project_breakdown#provertoml-1) নথিভুক্ত আছে)। + +এটি বাস্তবে কাজ করতে দেখতে: + +1. নিশ্চিত করুন যে আপনার [Node](https://nodejs.org/en/download) এবং [Noir](https://noir-lang.org/install) ইনস্টল করা আছে। বিশেষত, এগুলি একটি UNIX সিস্টেমে যেমন macOS, Linux, বা [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)-এ ইনস্টল করুন। + +2. স্টেজ ১-এর কোড ডাউনলোড করুন এবং ক্লায়েন্ট কোড পরিবেশন করতে ওয়েব সার্ভার শুরু করুন। + + ```sh + git clone https://github.com/qbzzt/250911-zk-bank.git -b 01-manual-zk + cd 250911-zk-bank + cd client + npm install + npm run dev + ``` + + এখানে আপনার একটি ওয়েব সার্ভার প্রয়োজন হওয়ার কারণ হল, কিছু ধরণের জালিয়াতি প্রতিরোধ করতে, অনেক ওয়ালেট (যেমন MetaMask) ডিস্ক থেকে সরাসরি পরিবেশন করা ফাইল গ্রহণ করে না + +3. ওয়ালেট সহ একটি ব্রাউজার খুলুন। + +4. ওয়ালেটে, একটি নতুন পাসফ্রেজ লিখুন। মনে রাখবেন যে এটি আপনার বিদ্যমান পাসফ্রেজ মুছে ফেলবে, তাই _নিশ্চিত করুন যে আপনার একটি ব্যাকআপ আছে_। + + পাসফ্রেজটি হল `test test test test test test test test test test test junk`, যা anvil-এর জন্য ডিফল্ট টেস্টিং পাসফ্রেজ। + +5. [ক্লায়েন্ট-সাইড কোডে](http://localhost:5173/) ব্রাউজ করুন। + +6. ওয়ালেটের সাথে সংযোগ করুন এবং আপনার গন্তব্য অ্যাকাউন্ট ও পরিমাণ নির্বাচন করুন। + +7. **Sign**-এ ক্লিক করুন এবং লেনদেনটিতে স্বাক্ষর করুন। + +8. **Prover.toml** শিরোনামের অধীনে, আপনি একটি টেক্সট পাবেন। `server/noir/Prover.toml` কে সেই টেক্সট দিয়ে প্রতিস্থাপন করুন। + +9. জিরো-নলেজ প্রুফ এক্সিকিউট করুন। + + ```sh + cd ../server/noir + nargo execute + ``` + + আউটপুটটি এর অনুরূপ হওয়া উচিত + + ``` + ori@CryptoDocGuy:~/noir/250911-zk-bank/server/noir$ nargo execute + + [zkBank] Circuit witness successfully solved + [zkBank] Witness saved to target/zkBank.gz + [zkBank] Circuit output: (0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b, 0x0cfc0a67cb7308e4e9b254026b54204e34f6c8b041be207e64c5db77d95dd82d, 0x450cf9da6e180d6159290554ae3d8787, 0x6d8bc5a15b9037e52fb59b6b98722a85) + ``` + +10. মেসেজটি সঠিকভাবে হ্যাস করা হয়েছে কিনা তা দেখতে ওয়েব ব্রাউজারে দেখা হ্যাসের সাথে শেষ দুটি মান তুলনা করুন। + +#### `server/noir/Prover.toml` {#server-noir-prover-toml} + +[এই ফাইলটি](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml) Noir দ্বারা প্রত্যাশিত তথ্য ফরম্যাট দেখায়। + +```toml +message="send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 500 finney (milliEth) 0 " +``` + +মেসেজটি টেক্সট ফরম্যাটে থাকে, যা ব্যবহারকারীর জন্য বোঝা সহজ করে তোলে (যা স্বাক্ষর করার সময় প্রয়োজন) এবং Noir কোডের জন্য পার্স করা সহজ করে। একদিকে ভগ্নাংশমূলক ট্রান্সফার সক্ষম করতে এবং অন্যদিকে সহজে পঠনযোগ্য করতে পরিমাণটি ফিনিতে উদ্ধৃত করা হয়েছে। শেষ সংখ্যাটি হল [ননস](https://en.wikipedia.org/wiki/Cryptographic_nonce)। + +স্ট্রিংটি 100 অক্ষর দীর্ঘ। জিরো-নলেজ প্রুফ পরিবর্তনশীল-আকারের ডেটা ভালোভাবে হ্যান্ডেল করতে পারে না, তাই প্রায়ই ডেটা প্যাড করার প্রয়োজন হয়। + +```toml +pubKeyX=["0x83",...,"0x75"] +pubKeyY=["0x35",...,"0xa5"] +signature=["0xb1",...,"0x0d"] +``` + +এই তিনটি প্যারামিটার হল নির্দিষ্ট-আকারের বাইট অ্যারে। + +```toml +[[accounts]] +address="0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" +balance=100_000 +nonce=0 + +[[accounts]] +address="0x70997970C51812dc3A010C7d01b50e0d17dc79C8" +balance=100_000 +nonce=0 +``` + +এটি স্ট্রাকচারের একটি অ্যারে নির্দিষ্ট করার উপায়। প্রতিটি এন্ট্রির জন্য, আমরা অ্যাড্রেস, ব্যালেন্স (মিলিইথ এ.কে.এ. তে) নির্দিষ্ট করি। [ফিনি](https://cryptovalleyjournal.com/glossary/finney/)), এবং পরবর্তী ননস মান। + +#### `client/src/Transfer.tsx` {#client-src-transfer-tsx} + +[এই ফাইলটি](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/client/src/Transfer.tsx) ক্লায়েন্ট-সাইড প্রসেসিং বাস্তবায়ন করে এবং `server/noir/Prover.toml` ফাইল (যা জিরো-নলেজ প্যারামিটার অন্তর্ভুক্ত করে) তৈরি করে। + +এখানে আরও আকর্ষণীয় অংশগুলির ব্যাখ্যা দেওয়া হল। + +```tsx +export default attrs => { +``` + +এই ফাংশনটি `Transfer` React কম্পোনেন্ট তৈরি করে, যা অন্য ফাইলগুলো ইম্পোর্ট করতে পারে। + +```tsx + const accounts = [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + ] +``` + +এগুলো হল অ্যাকাউন্ট অ্যাড্রেস, `test ...` দ্বারা তৈরি অ্যাড্রেস। test junk` পাসফ্রেজ। আপনি যদি নিজের অ্যাড্রেস ব্যবহার করতে চান, তাহলে শুধু এই সংজ্ঞাটি পরিবর্তন করুন। + +```tsx + const account = useAccount() + const wallet = createWalletClient({ + transport: custom(window.ethereum!) + }) +``` + +এই [Wagmi হুকগুলি](https://wagmi.sh/react/api/hooks) আমাদের [viem](https://viem.sh/) লাইব্রেরি এবং ওয়ালেটে অ্যাক্সেস করতে দেয়। + +```tsx + const message = `send ${toAccount} ${ethAmount*1000} finney (milliEth) ${nonce}`.padEnd(100, " ") +``` + +এটি স্পেস দিয়ে প্যাড করা মেসেজ। যখনই [`useState`](https://react.dev/reference/react/useState) ভেরিয়েবলগুলোর মধ্যে একটি পরিবর্তন হয়, তখন কম্পোনেন্টটি আবার আঁকা হয় এবং `message` আপডেট করা হয়। + +```tsx + const sign = async () => { +``` + +এই ফাংশনটি ব্যবহারকারী যখন **Sign** বোতামে ক্লিক করে তখন কল করা হয়। মেসেজটি স্বয়ংক্রিয়ভাবে আপডেট করা হয়, কিন্তু সিগনেচারের জন্য ওয়ালেটে ব্যবহারকারীর অনুমোদন প্রয়োজন, এবং প্রয়োজন না হলে আমরা এর জন্য জিজ্ঞাসা করতে চাই না। + +```tsx + const signature = await wallet.signMessage({ + account: fromAccount, + message, + }) +``` + +ওয়ালেটকে [মেসেজে স্বাক্ষর করতে](https://viem.sh/docs/accounts/local/signMessage) বলুন। + +```tsx + const hash = hashMessage(message) +``` + +মেসেজ হ্যাস পান। এটি ব্যবহারকারীকে ডিবাগিং (Noir কোডের) করার জন্য প্রদান করা সহায়ক। + +```tsx + const pubKey = await recoverPublicKey({ + hash, + signature + }) +``` + +[পাবলিক কী পান](https://viem.sh/docs/utilities/recoverPublicKey)। এটি [Noir `ecrecover`](https://github.com/colinnielsen/ecrecover-noir) ফাংশনের জন্য প্রয়োজন। + +```tsx + setSignature(signature) + setHash(hash) + setPubKey(pubKey) +``` + +স্টেট ভেরিয়েবল সেট করুন। এটি করার মাধ্যমে কম্পোনেন্টটি আবার আঁকা হয় (`sign` ফাংশন থেকে বের হওয়ার পরে) এবং ব্যবহারকারীকে আপডেট করা মানগুলি দেখায়। + +```tsx + let proverToml = ` +``` + +`Prover.toml`-এর জন্য টেক্সট। + +```tsx +message="${message}" + +pubKeyX=${hexToArray(pubKey.slice(4,4+2*32))} +pubKeyY=${hexToArray(pubKey.slice(4+2*32))} +``` + +Viem আমাদের একটি 65-বাইট হেক্সাডেসিমেল স্ট্রিং হিসাবে পাবলিক কী প্রদান করে। প্রথম বাইটটি হল `0x04`, একটি সংস্করণ মার্কার। এর পরে পাবলিক কী-র `x` এর জন্য 32 বাইট এবং তারপর পাবলিক কী-র `y` এর জন্য 32 বাইট থাকে। + +তবে, Noir এই তথ্য দুটি বাইট অ্যারে হিসাবে পেতে চায়, একটি `x`-এর জন্য এবং একটি `y`-এর জন্য। জিরো-নলেজ প্রুফের অংশ হিসাবে পার্স করার পরিবর্তে এখানে ক্লায়েন্টে পার্স করা সহজ। + +মনে রাখবেন যে এটি সাধারণত জিরো-নলেজে একটি ভালো অভ্যাস। জিরো-নলেজ প্রুফের ভিতরের কোড ব্যয়বহুল, তাই যে কোনো প্রসেসিং যা জিরো-নলেজ প্রুফের বাইরে করা যায়, তা জিরো-নলেজ প্রুফের বাইরেই _করা উচিত_। + +```tsx +signature=${hexToArray(signature.slice(2,-2))} +``` + +সিগনেচারটিও একটি 65-বাইট হেক্সাডেসিমেল স্ট্রিং হিসাবে প্রদান করা হয়। তবে, শেষ বাইটটি শুধুমাত্র পাবলিক কী পুনরুদ্ধার করার জন্য প্রয়োজন। যেহেতু পাবলিক কী ইতিমধ্যেই Noir কোডে প্রদান করা হবে, তাই সিগনেচার যাচাই করার জন্য আমাদের এটির প্রয়োজন নেই, এবং Noir কোডেরও এটির প্রয়োজন নেই। + +```tsx +${accounts.map(accountInProverToml).reduce((a,b) => a+b, "")} +` +``` + +অ্যাকাউন্টগুলো প্রদান করুন। + +```tsx + setProverToml(proverToml) + } + + return ( + <> +

Transfer

+``` + +এটি কম্পোনেন্টের HTML (আরও সঠিকভাবে, [JSX](https://react.dev/learn/writing-markup-with-jsx)) ফরম্যাট। + +#### `server/noir/src/main.nr` {#server-noir-src-main-nr} + +[এই ফাইলটি](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/src/main.nr) হল আসল জিরো-নলেজ কোড। + +``` +use std::hash::pedersen_hash; +``` + +[পেডারসেন হ্যাস](https://rya-sge.github.io/access-denied/2024/05/07/pedersen-hash-function/) [Noir স্ট্যান্ডার্ড লাইব্রেরি](https://noir-lang.org/docs/noir/standard_library/cryptographic_primitives/hashes#pedersen_hash)-র সাথে প্রদান করা হয়। জিরো-নলেজ প্রুফ সাধারণত এই হ্যাস ফাংশনটি ব্যবহার করে। স্ট্যান্ডার্ড হ্যাস ফাংশনগুলির তুলনায় এটি [অ্যারিথমেটিক সার্কিট](https://rareskills.io/post/arithmetic-circuit)-এর ভিতরে গণনা করা অনেক সহজ। + +``` +use keccak256::keccak256; +use dep::ecrecover; +``` + +এই দুটি ফাংশন হল এক্সটার্নাল লাইব্রেরি, যা [`Nargo.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Nargo.toml)-এ সংজ্ঞায়িত। এগুলি ঠিক তাদের নামের মতোই, একটি ফাংশন যা [keccak256 হ্যাস](https://emn178.github.io/online-tools/keccak_256.html) গণনা করে এবং একটি ফাংশন যা ইথেরিয়াম সিগনেচার যাচাই করে এবং স্বাক্ষরকারীর ইথেরিয়াম অ্যাড্রেস পুনরুদ্ধার করে। + +``` +global ACCOUNT_NUMBER : u32 = 5; +``` + +Noir [Rust](https://www.rust-lang.org/) দ্বারা অনুপ্রাণিত। ভেরিয়েবলগুলো, ডিফল্টরূপে, ধ্রুবক। আমরা এইভাবে গ্লোবাল কনফিগারেশন ধ্রুবক সংজ্ঞায়িত করি। বিশেষত, `ACCOUNT_NUMBER` হল আমাদের সংরক্ষিত অ্যাকাউন্টের সংখ্যা। + +`u` নামের ডেটা টাইপগুলি হল সেই সংখ্যক বিট, আনসাইন্ড। একমাত্র সমর্থিত টাইপগুলি হল `u8`, `u16`, `u32`, `u64`, এবং `u128`। + +``` +global FLAT_ACCOUNT_FIELDS : u32 = 2; +``` + +এই ভেরিয়েবলটি অ্যাকাউন্টের পেডারসেন হ্যাসের জন্য ব্যবহৃত হয়, যা নীচে ব্যাখ্যা করা হয়েছে। + +``` +global MESSAGE_LENGTH : u32 = 100; +``` + +উপরে যেমন ব্যাখ্যা করা হয়েছে, মেসেজের দৈর্ঘ্য নির্দিষ্ট। এটি এখানে নির্দিষ্ট করা হয়েছে। + +``` +global ASCII_MESSAGE_LENGTH : [u8; 3] = [0x31, 0x30, 0x30]; +global HASH_BUFFER_SIZE : u32 = 26+3+MESSAGE_LENGTH; +``` + +[EIP-191 সিগনেচার](https://eips.ethereum.org/EIPS/eip-191)-এর জন্য একটি 26-বাইট প্রিফিক্স সহ একটি বাফার প্রয়োজন, তারপরে ASCII-তে মেসেজের দৈর্ঘ্য, এবং অবশেষে মেসেজটি নিজেই। + +``` +struct Account { + balance: u128, + address: Field, + nonce: u32, +} +``` + +একটি অ্যাকাউন্ট সম্পর্কে আমরা যে তথ্য সংরক্ষণ করি। [`Field`](https://noir-lang.org/docs/noir/concepts/data_types/fields) হল একটি সংখ্যা, সাধারণত 253 বিট পর্যন্ত, যা জিরো-নলেজ প্রুফ বাস্তবায়নকারী [অ্যারিথমেটিক সার্কিট](https://rareskills.io/post/arithmetic-circuit)-এ সরাসরি ব্যবহার করা যেতে পারে। এখানে আমরা একটি 160-বিট ইথেরিয়াম অ্যাড্রেস সংরক্ষণ করতে `Field` ব্যবহার করি। + +``` +struct TransferTxn { + from: Field, + to: Field, + amount: u128, + nonce: u32 +} +``` + +একটি ট্রান্সফার লেনদেনের জন্য আমরা যে তথ্য সংরক্ষণ করি। + +``` +fn flatten_account(account: Account) -> [Field; FLAT_ACCOUNT_FIELDS] { +``` + +একটি ফাংশন সংজ্ঞা। প্যারামিটারটি হল `Account` তথ্য। ফলাফল হল `Field` ভেরিয়েবলের একটি অ্যারে, যার দৈর্ঘ্য `FLAT_ACCOUNT_FIELDS` + +``` + let flat = [ + account.address, + ((account.balance << 32) + account.nonce.into()).into(), + ]; +``` + +অ্যারের প্রথম মান হল অ্যাকাউন্ট অ্যাড্রেস। দ্বিতীয়টিতে ব্যালেন্স এবং ননস উভয়ই অন্তর্ভুক্ত। `.into()` কলগুলো একটি সংখ্যাকে তার প্রয়োজনীয় ডেটা টাইপে পরিবর্তন করে। `account.nonce` একটি `u32` মান, কিন্তু এটিকে `account.balance « 32`, একটি `u128` মানের সাথে যোগ করতে হলে, এটিকে একটি `u128` হতে হবে। সেটি হল প্রথম `.into()`। দ্বিতীয়টি `u128` ফলাফলকে একটি `Field`-এ রূপান্তরিত করে যাতে এটি অ্যারেতে ফিট হয়। + +``` + flat +} +``` + +Noir-এ, ফাংশনগুলি শুধুমাত্র শেষে একটি মান ফেরত দিতে পারে (কোনো আর্লি রিটার্ন নেই)। রিটার্ন মান নির্দিষ্ট করার জন্য, আপনি ফাংশনের শেষ বন্ধনীর ঠিক আগে এটি মূল্যায়ন করেন। + +``` +fn flatten_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] { +``` + +এই ফাংশনটি অ্যাকাউন্ট অ্যারেটিকে একটি `Field` অ্যারেতে পরিণত করে, যা একটি পেটারসেন হ্যাসের ইনপুট হিসাবে ব্যবহার করা যেতে পারে। + +``` + let mut flat: [Field; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER] = [0; FLAT_ACCOUNT_FIELDS*ACCOUNT_NUMBER]; +``` + +এটি একটি পরিবর্তনযোগ্য ভেরিয়েবল নির্দিষ্ট করার উপায়, অর্থাৎ, ধ্রুবক _নয়_। Noir-এর ভেরিয়েবলগুলোর সবসময় একটি মান থাকতে হবে, তাই আমরা এই ভেরিয়েবলটিকে সব শূন্য দিয়ে শুরু করি। + +``` + for i in 0..ACCOUNT_NUMBER { +``` + +এটি একটি `for` লুপ। মনে রাখবেন যে সীমানাগুলো ধ্রুবক। Noir লুপগুলোর সীমানা কম্পাইল করার সময় জানা থাকতে হবে। এর কারণ হল অ্যারিথমেটিক সার্কিট ফ্লো কন্ট্রোল সমর্থন করে না। একটি `for` লুপ প্রসেস করার সময়, কম্পাইলার সহজভাবে এর ভিতরের কোডটি একাধিকবার রাখে, প্রতিটি পুনরাবৃত্তির জন্য একবার। + +``` + let fields = flatten_account(accounts[i]); + for j in 0..FLAT_ACCOUNT_FIELDS { + flat[i*FLAT_ACCOUNT_FIELDS + j] = fields[j]; + } + } + + flat +} + +fn hash_accounts(accounts: [Account; ACCOUNT_NUMBER]) -> Field { + pedersen_hash(flatten_accounts(accounts)) +} +``` + +অবশেষে, আমরা সেই ফাংশনে পৌঁছলাম যা অ্যাকাউন্ট অ্যারে হ্যাস করে। + +``` +fn find_account(accounts: [Account; ACCOUNT_NUMBER], address: Field) -> u32 { + let mut account : u32 = ACCOUNT_NUMBER; + + for i in 0..ACCOUNT_NUMBER { + if accounts[i].address == address { + account = i; + } + } +``` + +এই ফাংশনটি একটি নির্দিষ্ট অ্যাড্রেস সহ অ্যাকাউন্ট খুঁজে বের করে। এই ফাংশনটি স্ট্যান্ডার্ড কোডে ভয়ানকভাবে অদক্ষ হবে কারণ এটি অ্যাড্রেস খুঁজে পাওয়ার পরেও সমস্ত অ্যাকাউন্টের উপর পুনরাবৃত্তি করে। + +তবে, জিরো-নলেজ প্রুফে কোনো ফ্লো কন্ট্রোল নেই। যদি আমাদের কখনো কোনো শর্ত পরীক্ষা করার প্রয়োজন হয়, তবে আমাদের প্রতিবারই তা পরীক্ষা করতে হবে। + +`if` স্টেটমেন্টের ক্ষেত্রেও একই রকম ঘটনা ঘটে। উপরের লুপের `if` স্টেটমেন্টটি এই গাণিতিক স্টেটমেন্টগুলিতে অনুবাদ করা হয়েছে। + +_conditionresult = accounts[i].address == address_ // সমান হলে এক, অন্যথায় শূন্য + +_accountnew = conditionresult\*i + (1-conditionresult)\*accountold_ + +```rust + assert (account < ACCOUNT_NUMBER, f"{address} does not have an account"); + + account +} +``` + +[`assert`](https://noir-lang.org/docs/dev/noir/concepts/assert) ফাংশনটি যদি অ্যাসারশনটি মিথ্যা হয় তবে জিরো-নলেজ প্রুফ ক্র্যাশ করে দেয়। এই ক্ষেত্রে, যদি আমরা প্রাসঙ্গিক অ্যাড্রেস সহ কোনো অ্যাকাউন্ট খুঁজে না পাই। অ্যাড্রেস রিপোর্ট করার জন্য, আমরা একটি [ফরম্যাট স্ট্রিং](https://noir-lang.org/docs/noir/concepts/data_types/strings#format-strings) ব্যবহার করি। + +```rust +fn apply_transfer_txn(accounts: [Account; ACCOUNT_NUMBER], txn: TransferTxn) -> [Account; ACCOUNT_NUMBER] { +``` + +এই ফাংশনটি একটি ট্রান্সফার লেনদেন প্রয়োগ করে এবং নতুন অ্যাকাউন্ট অ্যারে ফেরত দেয়। + +```rust + let from = find_account(accounts, txn.from); + let to = find_account(accounts, txn.to); + + let (txnFrom, txnAmount, txnNonce, accountNonce) = + (txn.from, txn.amount, txn.nonce, accounts[from].nonce); +``` + +আমরা Noir-এর ফরম্যাট স্ট্রিং-এর ভিতরে স্ট্রাকচার উপাদান অ্যাক্সেস করতে পারি না, তাই আমরা একটি ব্যবহারযোগ্য কপি তৈরি করি। + +```rust + assert (accounts[from].balance >= txn.amount, + f"{txnFrom} does not have {txnAmount} finney"); + + assert (accounts[from].nonce == txn.nonce, + f"Transaction has nonce {txnNonce}, but the account is expected to use {accountNonce}"); +``` + +এগুলো দুটি শর্ত যা একটি লেনদেনকে অবৈধ করে তুলতে পারে। + +```rust + let mut newAccounts = accounts; + + newAccounts[from].balance -= txn.amount; + newAccounts[from].nonce += 1; + newAccounts[to].balance += txn.amount; + + newAccounts +} +``` + +নতুন অ্যাকাউন্ট অ্যারে তৈরি করুন এবং তারপর এটি ফেরত দিন। + +```rust +fn readAddress(messageBytes: [u8; MESSAGE_LENGTH]) -> Field +``` + +এই ফাংশনটি মেসেজ থেকে অ্যাড্রেস পড়ে। + +```rust +{ + let mut result : Field = 0; + + for i in 7..47 { +``` + +অ্যাড্রেস সবসময় 20 বাইট (এ.কে.এ. 40 হেক্সাডেসিমেল অঙ্ক) লম্বা হয় এবং ৭ নম্বর অক্ষর থেকে শুরু হয়। 40 হেক্সাডেসিমেল অঙ্ক) দীর্ঘ, এবং অক্ষর #7 থেকে শুরু হয়। + +```rust + result *= 0x10; + if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9 + result += (messageBytes[i]-48).into(); + } + if messageBytes[i] >= 65 & messageBytes[i] <= 70 { // A-F + result += (messageBytes[i]-65+10).into() + } + if messageBytes[i] >= 97 & messageBytes[i] <= 102 { // a-f + result += (messageBytes[i]-97+10).into() + } + } + + result +} + +fn readAmountAndNonce(messageBytes: [u8; MESSAGE_LENGTH]) -> (u128, u32) +``` + +মেসেজ থেকে পরিমাণ এবং ননস পড়ুন। + +```rust +{ + let mut amount : u128 = 0; + let mut nonce: u32 = 0; + let mut stillReadingAmount: bool = true; + let mut lookingForNonce: bool = false; + let mut stillReadingNonce: bool = false; +``` + +মেসেজে, অ্যাড্রেসের পরের প্রথম সংখ্যাটি হল ট্রান্সফারের জন্য ফিনির পরিমাণ (এ.কে.এ. হাজার ভাগের এক ETH)। হাজার ভাগের এক ETH) ট্রান্সফার করার জন্য। দ্বিতীয় সংখ্যাটি হল ননস। তাদের মধ্যে যেকোনো টেক্সট উপেক্ষা করা হয়। + +```rust + for i in 48..MESSAGE_LENGTH { + if messageBytes[i] >= 48 & messageBytes[i] <= 57 { // 0-9 + let digit = (messageBytes[i]-48); + + if stillReadingAmount { + amount = amount*10 + digit.into(); + } + + if lookingForNonce { // We just found it + stillReadingNonce = true; + lookingForNonce = false; + } + + if stillReadingNonce { + nonce = nonce*10 + digit.into(); + } + } else { + if stillReadingAmount { + stillReadingAmount = false; + lookingForNonce = true; + } + if stillReadingNonce { + stillReadingNonce = false; + } + } + } + + (amount, nonce) +} +``` + +একটি [টাপল](https://noir-lang.org/docs/noir/concepts/data_types/tuples) ফেরত দেওয়া হল Noir-এ একটি ফাংশন থেকে একাধিক মান ফেরত দেওয়ার উপায়। + +```rust +fn readTransferTxn(message: str) -> TransferTxn +{ + let mut txn: TransferTxn = TransferTxn { from: 0, to: 0, amount:0, nonce:0 }; + let messageBytes = message.as_bytes(); + + txn.to = readAddress(messageBytes); + let (amount, nonce) = readAmountAndNonce(messageBytes); + txn.amount = amount; + txn.nonce = nonce; + + txn +} +``` + +এই ফাংশনটি মেসেজকে বাইটে রূপান্তর করে, তারপর পরিমাণগুলোকে একটি `TransferTxn`-এ রূপান্তর করে। + +```rust +// Viem-এর hashMessage-এর সমতুল্য +// https://viem.sh/docs/utilities/hashMessage#hashmessage +fn hashMessage(message: str) -> [u8;32] { +``` + +আমরা অ্যাকাউন্টগুলির জন্য পেডারসেন হ্যাস ব্যবহার করতে পেরেছি কারণ সেগুলি শুধুমাত্র জিরো-নলেজ প্রুফের ভিতরে হ্যাস করা হয়। তবে, এই কোডে আমাদের মেসেজের সিগনেচার পরীক্ষা করতে হবে, যা ব্রাউজার দ্বারা তৈরি হয়। এর জন্য, আমাদের [EIP 191](https://eips.ethereum.org/EIPS/eip-191)-এ ইথেরিয়াম সাইনিং ফরম্যাট অনুসরণ করতে হবে। এর মানে হল আমাদের একটি স্ট্যান্ডার্ড প্রিফিক্স, ASCII-তে মেসেজের দৈর্ঘ্য এবং মেসেজটি নিজেই সহ একটি সম্মিলিত বাফার তৈরি করতে হবে, এবং এটিকে হ্যাস করার জন্য ইথেরিয়ামের স্ট্যান্ডার্ড keccak256 ব্যবহার করতে হবে। + +```rust + // ASCII prefix + let prefix_bytes = [ + 0x19, // \x19 + 0x45, // 'E' + 0x74, // 't' + 0x68, // 'h' + 0x65, // 'e' + 0x72, // 'r' + 0x65, // 'e' + 0x75, // 'u' + 0x6D, // 'm' + 0x20, // ' ' + 0x53, // 'S' + 0x69, // 'i' + 0x67, // 'g' + 0x6E, // 'n' + 0x65, // 'e' + 0x64, // 'd' + 0x20, // ' ' + 0x4D, // 'M' + 0x65, // 'e' + 0x73, // 's' + 0x73, // 's' + 0x61, // 'a' + 0x67, // 'g' + 0x65, // 'e' + 0x3A, // ':' + 0x0A // '\n' + ]; +``` + +এমন পরিস্থিতি এড়াতে যেখানে একটি অ্যাপ্লিকেশন ব্যবহারকারীকে এমন একটি মেসেজে স্বাক্ষর করতে বলে যা একটি লেনদেন হিসাবে বা অন্য কোনো উদ্দেশ্যে ব্যবহার করা যেতে পারে, EIP 191 নির্দিষ্ট করে যে সমস্ত স্বাক্ষরিত মেসেজ 0x19 অক্ষর (একটি বৈধ ASCII অক্ষর নয়) দিয়ে শুরু হবে, তারপরে `Ethereum Signed Message:` এবং একটি নিউলাইন থাকবে। + +```rust + let mut buffer: [u8; HASH_BUFFER_SIZE] = [0u8; HASH_BUFFER_SIZE]; + for i in 0..26 { + buffer[i] = prefix_bytes[i]; + } + + let messageBytes : [u8; MESSAGE_LENGTH] = message.as_bytes(); + + if MESSAGE_LENGTH <= 9 { + for i in 0..1 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+1] = messageBytes[i]; + } + } + + if MESSAGE_LENGTH >= 10 & MESSAGE_LENGTH <= 99 { + for i in 0..2 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+2] = messageBytes[i]; + } + } + + if MESSAGE_LENGTH >= 100 { + for i in 0..3 { + buffer[i+26] = ASCII_MESSAGE_LENGTH[i]; + } + + for i in 0..MESSAGE_LENGTH { + buffer[i+26+3] = messageBytes[i]; + } + } + + assert(MESSAGE_LENGTH < 1000, "Messages whose length is over three digits are not supported"); +``` + +999 পর্যন্ত মেসেজের দৈর্ঘ্য হ্যান্ডেল করুন এবং এর চেয়ে বেশি হলে ব্যর্থ হন। আমি এই কোডটি যুক্ত করেছি, যদিও মেসেজের দৈর্ঘ্য একটি ধ্রুবক, কারণ এটি পরিবর্তন করা সহজ করে তোলে। একটি প্রোডাকশন সিস্টেমে, আপনি সম্ভবত ধরে নেবেন যে ভাল পারফরম্যান্সের জন্য `MESSAGE_LENGTH` পরিবর্তন হয় না। + +```rust + keccak256::keccak256(buffer, HASH_BUFFER_SIZE) +} +``` + +ইথেরিয়াম স্ট্যান্ডার্ড `keccak256` ফাংশন ব্যবহার করুন। + +```rust +fn signatureToAddressAndHash( + message: str, + pubKeyX: [u8; 32], + pubKeyY: [u8; 32], + signature: [u8; 64] + ) -> (Field, Field, Field) // address, first 16 bytes of hash, last 16 bytes of hash +{ +``` + +এই ফাংশনটি সিগনেচার যাচাই করে, যার জন্য মেসেজ হ্যাস প্রয়োজন। এটি তখন আমাদের স্বাক্ষরকারী অ্যাড্রেস এবং মেসেজ হ্যাস প্রদান করে। মেসেজ হ্যাস দুটি `Field` মান হিসাবে সরবরাহ করা হয় কারণ সেগুলি একটি বাইট অ্যারের চেয়ে প্রোগ্রামের বাকি অংশে ব্যবহার করা সহজ। + +আমাদের দুটি `Field` মান ব্যবহার করতে হবে কারণ ফিল্ড গণনাগুলি একটি বড় সংখ্যার [মডিউলো](https://en.wikipedia.org/wiki/Modulo) করা হয়, কিন্তু সেই সংখ্যাটি সাধারণত 256 বিটের কম (অন্যথায় EVM-এ সেই গণনাগুলি করা কঠিন হবে)। + +```rust + let hash = hashMessage(message); + + let mut (hash1, hash2) = (0,0); + + for i in 0..16 { + hash1 = hash1*256 + hash[31-i].into(); + hash2 = hash2*256 + hash[15-i].into(); + } +``` + +`hash1` এবং `hash2` কে পরিবর্তনযোগ্য ভেরিয়েবল হিসাবে নির্দিষ্ট করুন, এবং হ্যাসটি বাইট বাই বাইট তাতে লিখুন। + +```rust + ( + ecrecover::ecrecover(pubKeyX, pubKeyY, signature, hash), +``` + +এটি [Solidity-র `ecrecover`](https://docs.soliditylang.org/en/v0.8.30/cheatsheet.html#mathematical-and-cryptographic-functions) এর মতো, তবে দুটি গুরুত্বপূর্ণ পার্থক্য রয়েছে: + +- যদি সিগনেচারটি বৈধ না হয়, তাহলে কলটি একটি `assert` ব্যর্থ করে এবং প্রোগ্রামটি বন্ধ হয়ে যায়। +- যদিও পাবলিক কী সিগনেচার এবং হ্যাস থেকে পুনরুদ্ধার করা যায়, এটি এমন একটি প্রসেসিং যা বাইরে করা যেতে পারে এবং তাই, জিরো-নলেজ প্রুফের ভিতরে করা মূল্যবান নয়। যদি কেউ এখানে আমাদের সাথে প্রতারণা করার চেষ্টা করে, তাহলে সিগনেচার যাচাইকরণ ব্যর্থ হবে। + +```rust + hash1, + hash2 + ) +} + +fn main( + accounts: [Account; ACCOUNT_NUMBER], + message: str, + pubKeyX: [u8; 32], + pubKeyY: [u8; 32], + signature: [u8; 64], + ) -> pub ( + Field, // Hash of old accounts array + Field, // Hash of new accounts array + Field, // First 16 bytes of message hash + Field, // Last 16 bytes of message hash + ) +``` + +অবশেষে, আমরা `main` ফাংশনে পৌঁছেছি। আমাদের প্রমাণ করতে হবে যে আমাদের কাছে একটি লেনদেন রয়েছে যা অ্যাকাউন্টগুলির হ্যাসকে পুরনো মান থেকে নতুনটিতে বৈধভাবে পরিবর্তন করে। আমাদের এটাও প্রমাণ করতে হবে যে এর এই নির্দিষ্ট লেনদেন হ্যাস রয়েছে যাতে যে ব্যক্তি এটি পাঠিয়েছে সে জানতে পারে যে তার লেনদেন প্রক্রিয়া করা হয়েছে। + +```rust +{ + let mut txn = readTransferTxn(message); +``` + +আমাদের `txn` কে পরিবর্তনযোগ্য হতে হবে কারণ আমরা মেসেজ থেকে থেকে অ্যাড্রেস পড়ি না, আমরা এটি সিগনেচার থেকে পড়ি। + +```rust + let (fromAddress, txnHash1, txnHash2) = signatureToAddressAndHash( + message, + pubKeyX, + pubKeyY, + signature); + + txn.from = fromAddress; + + let newAccounts = apply_transfer_txn(accounts, txn); + + ( + hash_accounts(accounts), + hash_accounts(newAccounts), + txnHash1, + txnHash2 + ) +} +``` + +### স্টেজ ২ - একটি সার্ভার যুক্ত করা {#stage-2} + +দ্বিতীয় পর্যায়ে, আমরা একটি সার্ভার যুক্ত করি যা ব্রাউজার থেকে ট্রান্সফার লেনদেন গ্রহণ করে এবং বাস্তবায়ন করে। + +এটি বাস্তবে কাজ করতে দেখতে: + +1. যদি Vite চলমান থাকে তবে এটি বন্ধ করুন। + +2. সার্ভার সহ ব্রাঞ্চটি ডাউনলোড করুন এবং নিশ্চিত করুন যে আপনার সমস্ত প্রয়োজনীয় মডিউল রয়েছে। + + ```sh + git checkout 02-add-server + cd client + npm install + cd ../server + npm install + ``` + + Noir কোড কম্পাইল করার প্রয়োজন নেই, এটি স্টেজ ১-এর জন্য ব্যবহৃত কোডের মতোই। + +3. সার্ভার শুরু করুন। + + ```sh + npm run start + ``` + +4. একটি পৃথক কমান্ড-লাইন উইন্ডোতে, ব্রাউজার কোড পরিবেশন করতে Vite চালান। + + ```sh + cd client + npm run dev + ``` + +5. [http://localhost:5173](http://localhost:5173) এ ক্লায়েন্ট কোডে ব্রাউজ করুন + +6. একটি লেনদেন জারি করার আগে, আপনাকে ননস এবং আপনি যে পরিমাণ পাঠাতে পারেন তা জানতে হবে। এই তথ্য পেতে, **Update account data** এ ক্লিক করুন এবং মেসেজে স্বাক্ষর করুন। + + এখানে আমাদের একটি দ্বিধা রয়েছে। একদিকে, আমরা এমন একটি মেসেজে স্বাক্ষর করতে চাই না যা পুনরায় ব্যবহার করা যেতে পারে (একটি [রিপ্লে অ্যাটাক](https://en.wikipedia.org/wiki/Replay_attack)), যার কারণেই আমরা প্রথম স্থানে একটি ননস চাই। তবে, আমাদের এখনো কোনো ননস নেই। সমাধান হল এমন একটি ননস বেছে নেওয়া যা শুধুমাত্র একবার ব্যবহার করা যাবে এবং যা আমাদের উভয় দিকেই ইতিমধ্যে রয়েছে, যেমন বর্তমান সময়। + + এই সমাধানের সমস্যা হল যে সময় পুরোপুরি সিঙ্ক্রোনাইজড নাও হতে পারে। তাই এর পরিবর্তে, আমরা এমন একটি মানের উপর স্বাক্ষর করি যা প্রতি মিনিটে পরিবর্তন হয়। এর মানে হল যে রিপ্লে অ্যাটাকের জন্য আমাদের দুর্বলতার সময়সীমা সর্বোচ্চ এক মিনিট। বিবেচনা করে যে প্রোডাকশনে স্বাক্ষরিত অনুরোধটি TLS দ্বারা সুরক্ষিত থাকবে, এবং টানেলের অন্য প্রান্ত—সার্ভার—ইতিমধ্যেই ব্যালেন্স এবং ননস প্রকাশ করতে পারে (কাজ করার জন্য তাদের এটি জানতে হবে), এটি একটি গ্রহণযোগ্য ঝুঁকি। + +7. ব্রাউজার ব্যালেন্স এবং ননস ফেরত পাওয়ার পরে, এটি ট্রান্সফার ফর্ম দেখায়। গন্তব্য অ্যাড্রেস এবং পরিমাণ নির্বাচন করুন এবং **Transfer** এ ক্লিক করুন। এই অনুরোধে স্বাক্ষর করুন। + +8. ট্রান্সফার দেখতে, হয় **Update account data** করুন অথবা যে উইন্ডোতে আপনি সার্ভার চালাচ্ছেন সেখানে দেখুন। সার্ভার প্রতিবার পরিবর্তনের সময় স্টেট লগ করে। + + ``` + ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start + + > server@1.0.0 start + > node --experimental-json-modules index.mjs + + Listening on port 3000 + Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 36000 finney (milliEth) 0 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 64000 (1) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 100000 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + Txn send 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 7200 finney (milliEth) 1 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 56800 (2) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 136000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + Txn send 0x90F79bf6EB2c4f870365E785982E1f101E93b906 3000 finney (milliEth) 2 processed + New state: + 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 has 53800 (3) + 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 has 107200 (0) + 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC has 100000 (0) + 0x90F79bf6EB2c4f870365E785982E1f101E93b906 has 139000 (0) + 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 has 100000 (0) + ``` + +#### `server/index.mjs` {#server-index-mjs-1} + +[এই ফাইলটি](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/index.mjs) সার্ভার প্রসেস ধারণ করে এবং [`main.nr`](https://github.com/qbzzt/250911-zk-bank/blob/02-add-server/server/noir/src/main.nr) এ থাকা Noir কোডের সাথে মিথস্ক্রিয়া করে। এখানে আকর্ষণীয় অংশগুলির একটি ব্যাখ্যা দেওয়া হল। + +```js +import { Noir } from '@noir-lang/noir_js' +``` + +[noir.js](https://www.npmjs.com/package/@noir-lang/noir_js) লাইব্রেরি JavaScript কোড এবং Noir কোডের মধ্যে ইন্টারফেস করে। + +```js +const circuit = JSON.parse(await fs.readFile("./noir/target/zkBank.json")) +const noir = new Noir(circuit) +``` + +অ্যারিথমেটিক সার্কিট—পূর্ববর্তী পর্যায়ে তৈরি করা কম্পাইল করা Noir প্রোগ্রাম—লোড করুন এবং এটি কার্যকর করার জন্য প্রস্তুত করুন। + +```js +// আমরা শুধুমাত্র একটি স্বাক্ষরিত অনুরোধের জবাবে অ্যাকাউন্ট তথ্য প্রদান করি +const accountInformation = async signature => { + const fromAddress = await recoverAddress({ + hash: hashMessage("Get account data " + Math.floor((new Date().getTime())/60000)), + signature + }) +``` + +অ্যাকাউন্ট তথ্য প্রদান করতে, আমাদের শুধুমাত্র সিগনেচার প্রয়োজন। কারণ হল আমরা ইতিমধ্যেই জানি মেসেজটি কী হবে, এবং তাই মেসেজ হ্যাস। + +```js +const processMessage = async (message, signature) => { +``` + +একটি মেসেজ প্রসেস করুন এবং এটি যে লেনদেন এনকোড করে তা কার্যকর করুন। + +```js + // Get the public key + const pubKey = await recoverPublicKey({ + hash, + signature + }) +``` + +এখন যেহেতু আমরা সার্ভারে জাভাস্ক্রিপ্ট চালাচ্ছি, আমরা ক্লায়েন্টের পরিবর্তে সেখানে পাবলিক কী পুনরুদ্ধার করতে পারি। + +```js + let noirResult + try { + noirResult = await noir.execute({ + message, + signature: signature.slice(2,-2).match(/.{2}/g).map(x => `0x${x}`), + pubKeyX, + pubKeyY, + accounts: Accounts + }) +``` + +`noir.execute` Noir প্রোগ্রামটি চালায়। প্যারামিটারগুলি [`Prover.toml`](https://github.com/qbzzt/250911-zk-bank/blob/01-manual-zk/server/noir/Prover.toml) এ প্রদত্ত প্যারামিটারগুলির সমতুল্য। মনে রাখবেন যে দীর্ঘ মানগুলি হেক্সাডেসিমেল স্ট্রিংগুলির একটি অ্যারে হিসাবে প্রদান করা হয় (`["0x60", "0xA7"]`), একক হেক্সাডেসিমেল মান হিসাবে নয় (`0x60A7`), যেভাবে Viem এটি করে। + +```js + } catch (err) { + console.log(`Noir error: ${err}`) + throw Error("Invalid transaction, not processed") + } +``` + +যদি কোনো ত্রুটি থাকে, তবে এটি ধরুন এবং তারপর একটি সরলীকৃত সংস্করণ ক্লায়েন্টে রিলে করুন। + +```js + Accounts[fromAccountNumber].nonce++ + Accounts[fromAccountNumber].balance -= amount + Accounts[toAccountNumber].balance += amount +``` + +লেনদেনটি প্রয়োগ করুন। আমরা এটি ইতিমধ্যেই Noir কোডে করেছি, কিন্তু সেখান থেকে ফলাফল বের করার চেয়ে এখানে এটি আবার করা সহজ। + +```js +let Accounts = [ + { + address: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + balance: 5000, + nonce: 0, + }, +``` + +প্রাথমিক `Accounts` স্ট্রাকচার। + +### স্টেজ ৩ - ইথেরিয়াম স্মার্ট কন্ট্র্যাক্ট {#stage-3} + +1. সার্ভার এবং ক্লায়েন্ট প্রসেস বন্ধ করুন। + +2. স্মার্ট কন্ট্র্যাক্ট সহ ব্রাঞ্চটি ডাউনলোড করুন এবং নিশ্চিত করুন যে আপনার সমস্ত প্রয়োজনীয় মডিউল রয়েছে। + + ```sh + git checkout 03-smart-contracts + cd client + npm install + cd ../server + npm install + ``` + +3. একটি পৃথক কমান্ড-লাইন উইন্ডোতে `anvil` চালান। + +4. ভেরিফিকেশন কী এবং সলিডিটি ভেরিফায়ার জেনারেট করুন, তারপর ভেরিফায়ার কোডটি সলিডিটি প্রজেক্টে কপি করুন। + + ```sh + cd noir + bb write_vk -b ./target/zkBank.json -o ./target --oracle_hash keccak + bb write_solidity_verifier -k ./target/vk -o ./target/Verifier.sol + cp target/Verifier.sol ../../smart-contracts/src + ``` + +5. স্মার্ট কন্ট্র্যাক্টে যান এবং `anvil` ব্লকচেইন ব্যবহার করার জন্য পরিবেশ ভেরিয়েবল সেট করুন। + + ```sh + cd ../../smart-contracts + export ETH_RPC_URL=http://localhost:8545 + ETH_PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + ``` + +6. `Verifier.sol` ডিপ্লয় করুন এবং অ্যাড্রেসটি একটি এনভায়রনমেন্ট ভেরিয়েবলে সংরক্ষণ করুন। + + ```sh + VERIFIER_ADDRESS=`forge create src/Verifier.sol:HonkVerifier --private-key $ETH_PRIVATE_KEY --optimize --broadcast | awk '/Deployed to:/ {print $3}'` + echo $VERIFIER_ADDRESS + ``` + +7. `ZkBank` কন্ট্রাক্ট ডিপ্লয় করুন। + + ```sh + ZKBANK_ADDRESS=`forge create ZkBank --private-key $ETH_PRIVATE_KEY --broadcast --constructor-args $VERIFIER_ADDRESS 0x199aa62af8c1d562a6ec96e66347bf3240ab2afb5d022c895e6bf6a5e617167b | awk '/Deployed to:/ {print $3}'` + echo $ZKBANK_ADDRESS + ``` + + `0x199..67b` মানটি হল `Accounts`-এর প্রাথমিক স্টেটের পেডারসেন হ্যাস। যদি আপনি `server/index.mjs`-এ এই প্রাথমিক স্টেট পরিবর্তন করেন, তবে আপনি জিরো-নলেজ প্রুফ দ্বারা রিপোর্ট করা প্রাথমিক হ্যাস দেখতে একটি লেনদেন চালাতে পারেন। + +8. সার্ভারটি চালান। + + ```sh + cd ../server + npm run start + ``` + +9. একটি ভিন্ন কমান্ড-লাইন উইন্ডোতে ক্লায়েন্ট চালান। + + ```sh + cd client + npm run dev + ``` + +10. কিছু লেনদেন চালান। + +11. স্টেটটি অনচেইনে পরিবর্তিত হয়েছে কিনা তা যাচাই করতে, সার্ভার প্রসেসটি রিস্টার্ট করুন। দেখুন `ZkBank` আর লেনদেন গ্রহণ করছে না, কারণ লেনদেনগুলিতে আসল হ্যাস মান অনচেইনে সংরক্ষিত হ্যাস মান থেকে ভিন্ন। + + এটি প্রত্যাশিত ধরনের ত্রুটি। + + ``` + ori@CryptoDocGuy:~/x/250911-zk-bank/server$ npm run start + + > server@1.0.0 start + > node --experimental-json-modules index.mjs + + Listening on port 3000 + Verification error: ContractFunctionExecutionError: The contract function "processTransaction" reverted with the following reason: + Wrong old state hash + + Contract Call: + address: 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 + function: processTransaction(bytes _proof, bytes32[] _publicInputs) + args: (0x0000000000000000000000000000000000000000000000042ab5d6d1986846cf00000000000000000000000000000000000000000000000b75c020998797da7800000000000000000000000000000000000000000000000 + ``` + +#### `server/index.mjs` {#server-index-mjs-2} + +এই ফাইলের পরিবর্তনগুলি বেশিরভাগই আসল প্রুফ তৈরি করা এবং এটি অনচেইনে জমা দেওয়ার সাথে সম্পর্কিত। + +```js +import { exec } from 'child_process' +import util from 'util' + +const execPromise = util.promisify(exec) +``` + +আমাদের অনচেইনে পাঠানোর জন্য আসল প্রুফ তৈরি করতে [Barretenberg প্যাকেজ](https://github.com/AztecProtocol/aztec-packages/tree/next/barretenberg) ব্যবহার করতে হবে। আমরা এই প্যাকেজটি হয় কমান্ড-লাইন ইন্টারফেস (`bb`) চালিয়ে অথবা [JavaScript লাইব্রেরি, `bb.js`](https://www.npmjs.com/package/@aztec/bb.js) ব্যবহার করে ব্যবহার করতে পারি। JavaScript লাইব্রেরিটি নেটিভভাবে কোড চালানোর চেয়ে অনেক ধীর, তাই আমরা কমান্ড-লাইন ব্যবহার করার জন্য এখানে [`exec`](https://nodejs.org/api/child_process.html#child_processexeccommand-options-callback) ব্যবহার করি। + +মনে রাখবেন যে আপনি যদি `bb.js` ব্যবহার করার সিদ্ধান্ত নেন, তবে আপনাকে এমন একটি সংস্করণ ব্যবহার করতে হবে যা আপনার ব্যবহৃত Noir-এর সংস্করণের সাথে সামঞ্জস্যপূর্ণ। লেখার সময়, বর্তমান Noir সংস্করণ (1.0.0-beta.11) `bb.js` সংস্করণ 0.87 ব্যবহার করে। + +```js +const zkBankAddress = process.env.ZKBANK_ADDRESS || "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" +``` + +এখানে অ্যাড্রেসটি হল সেইটি যা আপনি একটি পরিষ্কার `anvil` দিয়ে শুরু করে এবং উপরের নির্দেশাবলী অনুসরণ করে পান। + +```js +const walletClient = createWalletClient({ + chain: anvil, + transport: http(), + account: privateKeyToAccount("0x2a871d0798f97d79848a013d4936a73bf4cc922c825d33c1cf7073dff6d409c6") +}) +``` + +এই প্রাইভেট কীটি `anvil`-এর ডিফল্ট প্রি-ফান্ডেড অ্যাকাউন্টগুলির মধ্যে একটি। + +```js +const generateProof = async (witness, fileID) => { +``` + +`bb` এক্সিকিউটেবল ব্যবহার করে একটি প্রুফ জেনারেট করুন। + +```js + const fname = `witness-${fileID}.gz` + await fs.writeFile(fname, witness) +``` + +উইটনেস একটি ফাইলে লিখুন। + +```js + await execPromise(`bb prove -b ./noir/target/zkBank.json -w ${fname} -o ${fileID} --oracle_hash keccak --output_format fields`) +``` + +প্রকৃতপক্ষে প্রুফটি তৈরি করুন। এই ধাপটি পাবলিক ভেরিয়েবল সহ একটি ফাইলও তৈরি করে, কিন্তু আমাদের সেটির প্রয়োজন নেই। আমরা `noir.execute` থেকে সেই ভেরিয়েবলগুলো ইতিমধ্যেই পেয়েছি। + +```js + const proof = "0x" + JSON.parse(await fs.readFile(`./${fileID}/proof_fields.json`)).reduce((a,b) => a+b, "").replace(/0x/g, "") +``` + +প্রুফটি হল `Field` মানগুলির একটি JSON অ্যারে, যার প্রতিটি একটি হেক্সাডেসিমেল মান হিসাবে উপস্থাপিত। তবে, আমাদের এটি লেনদেনে একটি একক `bytes` মান হিসাবে পাঠাতে হবে, যা Viem একটি বড় হেক্সাডেসিমেল স্ট্রিং দ্বারা উপস্থাপন করে। এখানে আমরা সমস্ত মানগুলিকে একত্রিত করে, সমস্ত `0x` সরিয়ে এবং শেষে একটি যোগ করে বিন্যাস পরিবর্তন করি। + +```js + await execPromise(`rm -r ${fname} ${fileID}`) + + return proof +} +``` + +পরিষ্কার করুন এবং প্রুফটি ফেরত দিন। + +```js +const processMessage = async (message, signature) => { + . + . + . + + const publicFields = noirResult.returnValue.map(x=>'0x' + x.slice(2).padStart(64, "0")) +``` + +পাবলিক ফিল্ডগুলিকে 32-বাইট মানের একটি অ্যারে হতে হবে। তবে, যেহেতু আমাদের লেনদেন হ্যাস দুটি `Field` মানের মধ্যে ভাগ করতে হয়েছিল, তাই এটি একটি 16-বাইট মান হিসাবে প্রদর্শিত হয়। এখানে আমরা শূন্য যোগ করি যাতে Viem বুঝতে পারে এটি আসলে 32 বাইট। + +```js + const proof = await generateProof(noirResult.witness, `${fromAddress}-${nonce}`) +``` + +প্রতিটি অ্যাড্রেস প্রতিটি ননস শুধুমাত্র একবার ব্যবহার করে যাতে আমরা উইটনেস ফাইল এবং আউটপুট ডিরেক্টরির জন্য একটি অনন্য শনাক্তকারী হিসাবে `fromAddress` এবং `nonce`-এর একটি সমন্বয় ব্যবহার করতে পারি। + +```js + try { + await zkBank.write.processTransaction([ + proof, publicFields]) + } catch (err) { + console.log(`Verification error: ${err}`) + throw Error("Can't verify the transaction onchain") + } + . + . + . +} +``` + +লেনদেনটি চেইনে পাঠান। + +#### `smart-contracts/src/ZkBank.sol` {#smart-contracts-src-zkbank-sol} + +এটি অনচেইন কোড যা লেনদেন গ্রহণ করে। + +```solidity +// SPDX-License-Identifier: MIT + +pragma solidity >=0.8.21; + +import {HonkVerifier} from "./Verifier.sol"; + +contract ZkBank { + HonkVerifier immutable myVerifier; + bytes32 currentStateHash; + + constructor(address _verifierAddress, bytes32 _initialStateHash) { + currentStateHash = _initialStateHash; + myVerifier = HonkVerifier(_verifierAddress); + } +``` + +অনচেইন কোডকে দুটি ভেরিয়েবলের ট্র্যাক রাখতে হবে: ভেরিফায়ার (একটি পৃথক কন্ট্রাক্ট যা `nargo` দ্বারা তৈরি) এবং বর্তমান স্টেট হ্যাস। + +```solidity + event TransactionProcessed( + bytes32 indexed transactionHash, + bytes32 oldStateHash, + bytes32 newStateHash + ); +``` + +যখনই স্টেট পরিবর্তন হয়, আমরা একটি `TransactionProcessed` ইভেন্ট নির্গত করি। + +```solidity + function processTransaction( + bytes calldata _proof, + bytes32[] calldata _publicFields + ) public { +``` + +এই ফাংশনটি লেনদেন প্রক্রিয়া করে। এটি প্রুফ (`bytes` হিসাবে) এবং পাবলিক ইনপুট (`bytes32` অ্যারে হিসাবে) গ্রহণ করে, যে ফরম্যাটে ভেরিফায়ারের প্রয়োজন (অনচেইন প্রসেসিং এবং তাই গ্যাস খরচ কমাতে)। + +```solidity + require(_publicInputs[0] == currentStateHash, + "Wrong old state hash"); +``` + +জিরো-নলেজ প্রুফটি হতে হবে যে লেনদেনটি আমাদের বর্তমান হ্যাস থেকে একটি নতুনটিতে পরিবর্তিত হয়। + +```solidity + myVerifier.verify(_proof, _publicFields); +``` + +জিরো-নলেজ প্রুফ যাচাই করার জন্য ভেরিফায়ার কন্ট্রাক্টে কল করুন। জিরো-নলেজ প্রুফ ভুল হলে এই ধাপটি লেনদেনটিকে বাতিল করে দেয়। + +```solidity + currentStateHash = _publicFields[1]; + + emit TransactionProcessed( + _publicFields[2]<<128 | _publicFields[3], + _publicFields[0], + _publicFields[1] + ); + } +} +``` + +যদি সবকিছু ঠিক থাকে, তাহলে স্টেট হ্যাসটি নতুন মানে আপডেট করুন এবং একটি `TransactionProcessed` ইভেন্ট নির্গত করুন। + +## কেন্দ্রীভূত উপাদান দ্বারা অপব্যবহার {#abuses} + +তথ্য নিরাপত্তা তিনটি বৈশিষ্ট্য নিয়ে গঠিত: + +- _গোপনীয়তা_, ব্যবহারকারীরা যে তথ্য পড়ার জন্য অনুমোদিত নন তা পড়তে পারে না। +- _অখণ্ডতা_, অনুমোদিত ব্যবহারকারী ছাড়া এবং অনুমোদিত পদ্ধতিতে তথ্য পরিবর্তন করা যায় না। +- _প্রাপ্যতা_, অনুমোদিত ব্যবহারকারীরা সিস্টেমটি ব্যবহার করতে পারেন। + +এই সিস্টেমে, জিরো-নলেজ প্রুফের মাধ্যমে অখণ্ডতা প্রদান করা হয়। প্রাপ্যতা নিশ্চিত করা অনেক কঠিন, এবং গোপনীয়তা অসম্ভব, কারণ ব্যাংককে প্রতিটি অ্যাকাউন্টের ব্যালেন্স এবং সমস্ত লেনদেন জানতে হয়। একটি সত্তার কাছে থাকা তথ্য শেয়ার করা থেকে বিরত রাখার কোনো উপায় নেই। + +[স্টেলথ অ্যাড্রেস](https://vitalik.eth.limo/general/2023/01/20/stealth.html) ব্যবহার করে একটি সত্যিকারের গোপনীয় ব্যাংক তৈরি করা সম্ভব হতে পারে, কিন্তু তা এই নিবন্ধের সুযোগের বাইরে। + +### মিথ্যা তথ্য {#false-info} + +সার্ভার যেভাবে অখণ্ডতা লঙ্ঘন করতে পারে তার একটি উপায় হল [ডেটা অনুরোধ করা হলে](https://github.com/qbzzt/250911-zk-bank/blob/03-smart-contracts/server/index.mjs#L278-L291) মিথ্যা তথ্য প্রদান করা। + +এটি সমাধান করতে, আমরা একটি দ্বিতীয় Noir প্রোগ্রাম লিখতে পারি যা অ্যাকাউন্টগুলিকে ব্যক্তিগত ইনপুট হিসাবে এবং যে অ্যাড্রেসের জন্য তথ্য অনুরোধ করা হয়েছে তা পাবলিক ইনপুট হিসাবে গ্রহণ করে। আউটপুট হল সেই অ্যাড্রেসের ব্যালেন্স এবং ননস, এবং অ্যাকাউন্টগুলির হ্যাস। + +অবশ্যই, এই প্রুফটি অনচেইনে যাচাই করা যাবে না, কারণ আমরা অনচেইনে ননস এবং ব্যালেন্স পোস্ট করতে চাই না। তবে, এটি ব্রাউজারে চলমান ক্লায়েন্ট কোড দ্বারা যাচাই করা যেতে পারে। + +### বাধ্যতামূলক লেনদেন {#forced-txns} + +L2s-এ অ্যাভেইলেবিলিটি নিশ্চিত করা এবং সেন্সরশিপ প্রতিরোধের জন্য সাধারণ মেকানিজম হল [ফোর্সড ট্রানজাকশন](https://docs.optimism.io/stack/transactions/forced-transaction)। কিন্তু বাধ্যতামূলক লেনদেন জিরো-নলেজ প্রুফের সাথে একত্রিত হয় না। সার্ভার হল একমাত্র সত্তা যা লেনদেন যাচাই করতে পারে। + +আমরা `smart-contracts/src/ZkBank.sol` পরিবর্তন করে বাধ্যতামূলক লেনদেন গ্রহণ করতে পারি এবং সার্ভারকে সেগুলি প্রক্রিয়া না করা পর্যন্ত স্টেট পরিবর্তন করা থেকে বিরত রাখতে পারি। তবে, এটি আমাদের একটি সহজ ডিনাইয়াল-অব-সার্ভিস অ্যাটাকের জন্য উন্মুক্ত করে। যদি একটি বাধ্যতামূলক লেনদেন অবৈধ হয় এবং তাই প্রক্রিয়া করা অসম্ভব হয়? + +সমাধান হল একটি জিরো-নলেজ প্রুফ থাকা যে একটি বাধ্যতামূলক লেনদেন অবৈধ। এটি সার্ভারকে তিনটি বিকল্প দেয়: + +- বাধ্যতামূলক লেনদেনটি প্রক্রিয়া করুন, এটি প্রক্রিয়া করা হয়েছে এবং নতুন স্টেট হ্যাস রয়েছে তার একটি জিরো-নলেজ প্রুফ প্রদান করুন। +- বাধ্যতামূলক লেনদেনটি প্রত্যাখ্যান করুন, এবং কন্ট্রাক্টকে একটি জিরো-নলেজ প্রুফ প্রদান করুন যে লেনদেনটি অবৈধ (অজানা অ্যাড্রেস, খারাপ ননস, বা অপর্যাপ্ত ব্যালেন্স)। +- বাধ্যতামূলক লেনদেন উপেক্ষা করুন। সার্ভারকে প্রকৃতপক্ষে লেনদেনটি প্রক্রিয়া করতে বাধ্য করার কোনো উপায় নেই, তবে এর মানে হল পুরো সিস্টেমটি अनुपলব্ধ। + +#### উপস্থিতি বন্ড {#avail-bonds} + +বাস্তব-জীবনের বাস্তবায়নে, সার্ভারটি চালু রাখার জন্য সম্ভবত কোনো ধরনের লাভের উদ্দেশ্য থাকবে। আমরা এই প্রণোদনাটিকে আরও শক্তিশালী করতে পারি সার্ভারকে একটি অ্যাভেইলেবিলিটি বন্ড পোস্ট করতে বলে যা যে কেউ বার্ন করতে পারবে যদি একটি ফোর্সড ট্রানজাকশন একটি নির্দিষ্ট সময়ের মধ্যে প্রক্রিয়াজাত না হয়। + +### খারাপ Noir কোড {#bad-noir-code} + +সাধারণত, একটি স্মার্ট কন্ট্র্যাক্টের উপর মানুষের বিশ্বাস অর্জনের জন্য আমরা সোর্স কোডটি একটি [ব্লক এক্সপ্লোরারে](https://eth.blockscout.com/address/0x7D16d2c4e96BCFC8f815E15b771aC847EcbDB48b?tab=contract) আপলোড করি। তবে, জিরো-নলেজ প্রুফের ক্ষেত্রে, এটি অপর্যাপ্ত। + +`Verifier.sol` ভেরিফিকেশন কী ধারণ করে, যা Noir প্রোগ্রামের একটি ফাংশন। তবে, সেই কী আমাদের বলে না যে Noir প্রোগ্রামটি কী ছিল। প্রকৃতপক্ষে একটি বিশ্বস্ত সমাধান পেতে, আপনাকে Noir প্রোগ্রাম (এবং এটি তৈরি করা সংস্করণ) আপলোড করতে হবে। অন্যথায়, জিরো-নলেজ প্রুফগুলি একটি ভিন্ন প্রোগ্রামকে প্রতিফলিত করতে পারে, যার একটি ব্যাক ডোর রয়েছে। + +ব্লক এক্সপ্লোরাররা আমাদের Noir প্রোগ্রাম আপলোড এবং যাচাই করার অনুমতি না দেওয়া পর্যন্ত, আপনার এটি নিজেই করা উচিত (বিশেষত [IPFS](/developers/tutorials/ipfs-decentralized-ui/)-এ)। তাহলে অভিজ্ঞ ব্যবহারকারীরা সোর্স কোড ডাউনলোড করতে, নিজেরা কম্পাইল করতে, `Verifier.sol` তৈরি করতে এবং এটি অনচেইনে থাকা কোডের সাথে অভিন্ন কিনা তা যাচাই করতে সক্ষম হবেন। + +## উপসংহার {#conclusion} + +প্লাজমা-টাইপ অ্যাপ্লিকেশনগুলির জন্য তথ্য সংরক্ষণের জন্য একটি কেন্দ্রীভূত উপাদান প্রয়োজন। এটি সম্ভাব্য দুর্বলতা উন্মুক্ত করে কিন্তু, বিনিময়ে, আমাদের ব্লকচেইনে উপলব্ধ নয় এমন উপায়ে গোপনীয়তা রক্ষা করতে দেয়। জিরো-নলেজ প্রুফের মাধ্যমে আমরা অখণ্ডতা নিশ্চিত করতে পারি এবং সম্ভবত কেন্দ্রীভূত উপাদানটি চালানো যার জন্য অর্থনৈতিকভাবে সুবিধাজনক হবে তার জন্য প্রাপ্যতা বজায় রাখতে পারি। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। + +## স্বীকৃতি {#acknowledgements} + +- Josh Crites এই নিবন্ধের একটি খসড়া পড়েছিলেন এবং একটি কাঁটাযুক্ত Noir সমস্যায় আমাকে সাহায্য করেছিলেন। + +যেকোনো অবশিষ্ট ত্রুটির জন্য আমি দায়ী। diff --git a/public/content/translations/bn/developers/tutorials/calling-a-smart-contract-from-javascript/index.md b/public/content/translations/bn/developers/tutorials/calling-a-smart-contract-from-javascript/index.md new file mode 100644 index 00000000000..b5905f1d5e8 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/calling-a-smart-contract-from-javascript/index.md @@ -0,0 +1,131 @@ +--- +title: "JavaScript থেকে একটি স্মার্ট কন্ট্র্যাক্ট কল করা" +description: "একটি Dai টোকেনের উদাহরণ ব্যবহার করে JavaScript থেকে কীভাবে একটি স্মার্ট কন্ট্র্যাক্ট ফাংশন কল করতে হয়" +author: jdourlens +tags: [ "লেনদেনসমূহ", "ফ্রন্টএন্ড", "JavaScript", "web3.js" ] +skill: beginner +lang: bn +published: 2020-04-19 +source: EthereumDev +sourceUrl: https://ethereumdev.io/calling-a-smart-contract-from-javascript/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +এই টিউটোরিয়ালে আমরা দেখব কিভাবে জাভাস্ক্রিপ্ট থেকে একটি [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) ফাংশন কল করতে হয়। প্রথমটি হলো একটি স্মার্ট কন্ট্র্যাক্টের স্টেট পড়া (যেমন, একটি ERC20 হোল্ডারের ব্যালেন্স), তারপর আমরা একটি টোকেন ট্রান্সফার করে ব্লকচেইনের স্টেট পরিবর্তন করব। ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করার জন্য আপনার ইতিমধ্যেই [একটি JS এনভায়রনমেন্ট সেট আপ করার](/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/) সাথে পরিচিত হওয়া উচিত। + +এই উদাহরণের জন্য আমরা DAI টোকেন নিয়ে খেলব, পরীক্ষার উদ্দেশ্যে আমরা ganache-cli ব্যবহার করে ব্লকচেইন ফর্ক করব এবং এমন একটি অ্যাড্রেস আনলক করব যাতে ইতিমধ্যে প্রচুর DAI রয়েছে: + +```bash +ganache-cli -f https://mainnet.infura.io/v3/[আপনার INFURA কী] -d -i 66 1 --unlock 0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81 +``` + +একটি স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার জন্য আমাদের এটির অ্যাড্রেস এবং ABI প্রয়োজন হবে: + +```js +const ERC20TransferABI = [ + { + constant: false, + inputs: [ + { + name: "_to", + type: "address", + }, + { + name: "_value", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + name: "", + type: "bool", + }, + ], + payable: false, + stateMutability: "nonpayable", + type: "function", + }, + { + constant: true, + inputs: [ + { + name: "_owner", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + name: "balance", + type: "uint256", + }, + ], + payable: false, + stateMutability: "view", + type: "function", + }, +] + +const DAI_ADDRESS = "0x6b175474e89094c44da98b954eedeac495271d0f" +``` + +এই প্রজেক্টের জন্য আমরা শুধুমাত্র `balanceOf` এবং `transfer` ফাংশন রাখার জন্য সম্পূর্ণ ERC20 ABI ছেঁটে ফেলেছি কিন্তু আপনি [সম্পূর্ণ ERC20 ABI এখানে](https://ethereumdev.io/abi-for-erc20-contract-on-ethereum/) খুঁজে পেতে পারেন। + +এরপর আমাদের স্মার্ট কন্ট্র্যাক্টটিকে ইনস্ট্যানশিয়েট করতে হবে: + +```js +const web3 = new Web3("http://localhost:8545") + +const daiToken = new web3.eth.Contract(ERC20TransferABI, DAI_ADDRESS) +``` + +আমরা দুটি অ্যাড্রেসও সেট আপ করব: + +- যে ট্রান্সফারটি পাবে এবং +- যেটি আমরা ইতিমধ্যে আনলক করেছি সেটি এটি পাঠাবে: + +```js +const senderAddress = "0x4d10ae710Bd8D1C31bd7465c8CBC3add6F279E81" +const receiverAddress = "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +``` + +পরবর্তী অংশে আমরা `balanceOf` ফাংশনটি কল করব উভয় অ্যাড্রেসে বর্তমানে কী পরিমাণ টোকেন রয়েছে তা জানতে। + +## কল: একটি স্মার্ট কন্ট্র্যাক্ট থেকে ভ্যালু পড়া {#call-reading-value-from-a-smart-contract} + +প্রথম উদাহরণটি একটি “কনস্ট্যান্ট” মেথড কল করবে এবং কোনো লেনদেন না পাঠিয়ে EVM-এ এর স্মার্ট কন্ট্র্যাক্ট মেথডটি কার্যকর করবে। এর জন্য আমরা একটি অ্যাড্রেসের ERC20 ব্যালেন্স পড়ব। [ERC20 টোকেন সম্পর্কে আমাদের আর্টিকেলটি পড়ুন](/developers/tutorials/understand-the-erc-20-token-smart-contract/)। + +আপনি যেটির জন্য ABI প্রদান করেছেন সেই ইনস্ট্যানশিয়েটেড স্মার্ট কন্ট্র্যাক্ট মেথডগুলো নিম্নলিখিত উপায়ে অ্যাক্সেস করতে পারেন: `yourContract.methods.methodname`। `call` ফাংশন ব্যবহার করে আপনি ফাংশনটি কার্যকর করার ফলাফল পাবেন। + +```js +daiToken.methods.balanceOf(senderAddress).call(function (err, res) { + if (err) { + console.log("একটি ত্রুটি ঘটেছে", err) + return + } + console.log("ব্যালেন্স হলো: ", res) +}) +``` + +মনে রাখবেন যে DAI ERC20-এর 18টি ডেসিমেল আছে যার অর্থ সঠিক পরিমাণ পেতে আপনাকে 18টি শূন্য সরাতে হবে। uint256 স্ট্রিং হিসাবে ফেরত দেওয়া হয় কারণ জাভাস্ক্রিপ্ট বড় সংখ্যাসূচক মান হ্যান্ডেল করে না। আপনি যদি নিশ্চিত না হন [JS-এ বড় সংখ্যা নিয়ে কীভাবে কাজ করতে হয়, bignumber.js সম্পর্কে আমাদের টিউটোরিয়ালটি দেখুন](https://ethereumdev.io/how-to-deal-with-big-numbers-in-javascript/)। + +## পাঠানো: একটি স্মার্ট কন্ট্র্যাক্ট ফাংশনে একটি লেনদেন পাঠানো {#send-sending-a-transaction-to-a-smart-contract-function} + +দ্বিতীয় উদাহরণের জন্য আমরা আমাদের দ্বিতীয় অ্যাড্রেসে 10 DAI পাঠাতে DAI স্মার্ট কন্ট্র্যাক্টের transfer ফাংশনটিকে কল করব। transfer ফাংশন দুটি প্যারামিটার গ্রহণ করে: প্রাপকের অ্যাড্রেস এবং ট্রান্সফারের জন্য টোকেনের পরিমাণ: + +```js +daiToken.methods + .transfer(receiverAddress, "100000000000000000000") + .send({ from: senderAddress }, function (err, res) { + if (err) { + console.log("একটি ত্রুটি ঘটেছে", err) + return + } + console.log("লেনদেনের হ্যাস: " + res) + }) +``` + +কল ফাংশনটি লেনদেনের হ্যাস রিটার্ন করে যা ব্লকচেইনে মাইন করা হবে। ইথেরিয়ামে, লেনদেনের হ্যাসগুলো অনুমানযোগ্য - এভাবেই আমরা একটি লেনদেন কার্যকর হওয়ার আগে তার হ্যাস পেতে পারি ([হ্যাসগুলো কীভাবে গণনা করা হয় তা এখানে জানুন](https://ethereum.stackexchange.com/questions/45648/how-to-calculate-the-assigned-txhash-of-a-transaction))। + +যেহেতু ফাংশনটি শুধুমাত্র ব্লকচেইনে লেনদেন জমা দেয়, তাই এটি কখন মাইন করা হয়েছে এবং ব্লকচেইনে অন্তর্ভুক্ত হয়েছে তা না জানা পর্যন্ত আমরা ফলাফল দেখতে পারি না। পরবর্তী টিউটোরিয়ালে আমরা শিখব [কীভাবে একটি লেনদেনের হ্যাস জেনে ব্লকচেইনে সেটি কার্যকর হওয়ার জন্য অপেক্ষা করতে হয়](https://ethereumdev.io/waiting-for-a-transaction-to-be-mined-on-ethereum-with-js/)। diff --git a/public/content/translations/bn/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md b/public/content/translations/bn/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md new file mode 100644 index 00000000000..e7b06c7d21f --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/creating-a-wagmi-ui-for-your-contract/index.md @@ -0,0 +1,585 @@ +--- +title: "আপনার কন্ট্র্যাক্টের জন্য একটি ইউজার ইন্টারফেস তৈরি করা" +description: "TypeScript, React, Vite এবং Wagmi-এর মতো আধুনিক উপাদান ব্যবহার করে, আমরা একটি আধুনিক, কিন্তু সংক্ষিপ্ত, ইউজার ইন্টারফেস দেখব এবং শিখব কীভাবে ইউজার ইন্টারফেসের সাথে একটি ওয়ালেট সংযোগ করতে হয়, তথ্য পড়ার জন্য একটি স্মার্ট কন্ট্র্যাক্ট কল করা, একটি স্মার্ট কন্ট্র্যাক্টে লেনদেন পাঠানো, এবং পরিবর্তন শনাক্ত করতে একটি স্মার্ট কন্ট্র্যাক্ট থেকে ইভেন্টগুলি নিরীক্ষণ করা।" +author: Ori Pomerantz +tags: [ "typescript", "react", "vite", "wagmi", "ফ্রন্টএন্ড" ] +skill: beginner +published: 2023-11-01 +lang: bn +sidebarDepth: 3 +--- + +আপনি একটি ফিচার খুঁজে পেয়েছেন যা ইথেরিয়াম ইকোসিস্টেমে আমাদের প্রয়োজন। আপনি এটি বাস্তবায়নের জন্য স্মার্ট কন্ট্র্যাক্ট লিখেছেন, এবং সম্ভবত কিছু সম্পর্কিত কোড যা অফচেইন চলে। এটা দারুণ! দুর্ভাগ্যবশত, একটি ইউজার ইন্টারফেস ছাড়া আপনার কোনো ব্যবহারকারী থাকবে না, এবং শেষবার যখন আপনি একটি ওয়েব সাইট লিখেছিলেন তখন মানুষ ডায়াল-আপ মডেম ব্যবহার করত এবং জাভাস্ক্রিপ্ট নতুন ছিল। + +এই নিবন্ধটি আপনার জন্য। আমি ধরে নিচ্ছি আপনি প্রোগ্রামিং জানেন, এবং হয়তো কিছুটা জাভাস্ক্রিপ্ট এবং HTML জানেন, কিন্তু আপনার ইউজার ইন্টারফেসের দক্ষতা মরিচা ধরা এবং পুরানো। একসাথে আমরা একটি সহজ আধুনিক অ্যাপ্লিকেশন দেখব যাতে আপনি দেখতে পারেন আজকাল এটি কীভাবে করা হয়। + +## এটি কেন গুরুত্বপূর্ণ {#why-important} + +তত্ত্বগতভাবে, আপনি আপনার কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার জন্য লোকেদের [Etherscan](https://holesky.etherscan.io/address/0x432d810484add7454ddb3b5311f0ac2e95cecea8#writeContract) বা [Blockscout](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=write_contract) ব্যবহার করতে দিতে পারেন। অভিজ্ঞ ইথেরিয়ানদের জন্য এটি দারুণ হবে। কিন্তু আমরা [আরও এক বিলিয়ন মানুষকে](https://blog.ethereum.org/2021/05/07/ethereum-for-the-next-billion) পরিষেবা দেওয়ার চেষ্টা করছি। একটি দুর্দান্ত ব্যবহারকারী অভিজ্ঞতা ছাড়া এটি ঘটবে না, এবং একটি বন্ধুত্বপূর্ণ ইউজার ইন্টারফেস এর একটি বড় অংশ। + +## গ্রিটার অ্যাপ্লিকেশন {#greeter-app} + +একটি আধুনিক UI কীভাবে কাজ করে তার পিছনে অনেক তত্ত্ব রয়েছে, এবং [অনেক ভাল সাইট](https://react.dev/learn/thinking-in-react) [যা এটি ব্যাখ্যা করে](https://wagmi.sh/core/getting-started) তা রয়েছে। সেই সাইটগুলির দ্বারা করা চমৎকার কাজ পুনরাবৃত্তি করার পরিবর্তে, আমি ধরে নেব যে আপনি করে শেখা পছন্দ করেন এবং এমন একটি অ্যাপ্লিকেশন দিয়ে শুরু করতে চান যা নিয়ে আপনি খেলতে পারেন। কাজগুলি সম্পন্ন করার জন্য আপনার এখনও তত্ত্বের প্রয়োজন, এবং আমরা এটিতে আসব - আমরা কেবল সোর্স ফাইল ধরে ধরে যাব, এবং যখন আমরা সেগুলিতে আসব তখন বিষয়গুলি নিয়ে আলোচনা করব। + +### ইনস্টলেশন {#installation} + +1. প্রয়োজনে, আপনার ওয়ালেটে [Holesky ব্লকচেইন](https://chainlist.org/?search=holesky&testnets=true) যোগ করুন এবং [টেস্ট ETH পান](https://www.holeskyfaucet.io/)। + +2. গিটহাব রিপোজিটরিটি ক্লোন করুন। + + ```sh + git clone https://github.com/qbzzt/20230801-modern-ui.git + ``` + +3. প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করুন। + + ```sh + cd 20230801-modern-ui + pnpm install + ``` + +4. অ্যাপ্লিকেশনটি শুরু করুন। + + ```sh + pnpm dev + ``` + +5. অ্যাপ্লিকেশন দ্বারা দেখানো URL-এ ব্রাউজ করুন। বেশিরভাগ ক্ষেত্রে, এটি হল [http://localhost:5173/](http://localhost:5173/)। + +6. আপনি কন্ট্র্যাক্টের সোর্স কোড দেখতে পারেন, যা হার্ডহ্যাটের গ্রিটারের একটি সামান্য পরিবর্তিত সংস্করণ, [একটি ব্লকচেইন এক্সপ্লোরারে](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=contract)। + +### ফাইল ওয়াক থ্রু {#file-walk-through} + +#### `index.html` {#index-html} + +এই ফাইলটি স্ট্যান্ডার্ড HTML বয়লারপ্লেট, এই লাইনটি ছাড়া, যা স্ক্রিপ্ট ফাইলটি আমদানি করে। + +```html + +``` + +#### `src/main.tsx` {#main-tsx} + +ফাইলের এক্সটেনশনটি আমাদের বলে যে এই ফাইলটি একটি [রিয়্যাক্ট কম্পোনেন্ট](https://www.w3schools.com/react/react_components.asp) যা [টাইপস্ক্রিপ্টে](https://www.typescriptlang.org/) লেখা, জাভাস্ক্রিপ্টের একটি এক্সটেনশন যা [টাইপ চেকিং](https://en.wikipedia.org/wiki/Type_system#Type_checking) সমর্থন করে। টাইপস্ক্রিপ্ট জাভাস্ক্রিপ্টে কম্পাইল করা হয়, তাই আমরা এটি ক্লায়েন্ট-সাইড এক্সিকিউশনের জন্য ব্যবহার করতে পারি। + +```tsx +import '@rainbow-me/rainbowkit/styles.css' +import { RainbowKitProvider } from '@rainbow-me/rainbowkit' +import * as React from 'react' +import * as ReactDOM from 'react-dom/client' +import { WagmiConfig } from 'wagmi' +import { chains, config } from './wagmi' +``` + +আমাদের প্রয়োজনীয় লাইব্রেরি কোডটি ইম্পোর্ট করুন। + +```tsx +import { App } from './App' +``` + +অ্যাপ্লিকেশনটি বাস্তবায়নকারী রিয়্যাক্ট কম্পোনেন্টটি ইম্পোর্ট করুন (নিচে দেখুন)। + +```tsx +ReactDOM.createRoot(document.getElementById('root')!).render( +``` + +রুট রিয়্যাক্ট কম্পোনেন্টটি তৈরি করুন। `render`-এর প্যারামিটারটি হল [JSX](https://www.w3schools.com/react/react_jsx.asp), একটি এক্সটেনশন ভাষা যা HTML এবং জাভাস্ক্রিপ্ট/টাইপস্ক্রিপ্ট উভয়ই ব্যবহার করে। এখানকার বিস্ময়সূচক চিহ্নটি টাইপস্ক্রিপ্ট কম্পোনেন্টকে বলে: "আপনি জানেন না যে `document.getElementById('root')` `ReactDOM.createRoot`-এর জন্য একটি বৈধ প্যারামিটার হবে, কিন্তু চিন্তা করবেন না - আমি ডেভেলপার এবং আমি আপনাকে বলছি যে এটি থাকবে"। + +```tsx + +``` + +অ্যাপ্লিকেশনটি [একটি `React.StrictMode` কম্পোনেন্টের](https://react.dev/reference/react/StrictMode) ভিতরে যাচ্ছে। এই কম্পোনেন্টটি রিয়্যাক্ট লাইব্রেরিকে অতিরিক্ত ডিবাগিং চেক যোগ করতে বলে, যা ডেভেলপমেন্টের সময় দরকারী। + +```tsx + +``` + +অ্যাপ্লিকেশনটি [একটি `WagmiConfig` কম্পোনেন্টের](https://wagmi.sh/react/api/WagmiProvider) ভিতরেও রয়েছে। wagmi (উই আর গোয়িং টু মেক ইট) লাইব্রেরি একটি ইথেরিয়াম ডিসেন্ট্রালাইজড এপ্লিকেশন লেখার জন্য রিয়্যাক্ট UI সংজ্ঞাগুলিকে viem লাইব্রেরির সাথে সংযুক্ত করে। + +```tsx + +``` + +এবং পরিশেষে, [একটি `RainbowKitProvider` কম্পোনেন্ট](https://www.rainbowkit.com/)। এই কম্পোনেন্টটি লগ ইন করা এবং ওয়ালেট এবং অ্যাপ্লিকেশনের মধ্যে যোগাযোগ পরিচালনা করে। + +```tsx + +``` + +এখন আমরা অ্যাপ্লিকেশনের জন্য কম্পোনেন্টটি পেতে পারি, যা আসলে UI বাস্তবায়ন করে। কম্পোনেন্টের শেষে `/>` রিয়্যাক্টকে বলে যে XML স্ট্যান্ডার্ড অনুযায়ী এই কম্পোনেন্টের ভিতরে কোনো সংজ্ঞা নেই। + +```tsx + + + , +) +``` + +অবশ্যই, আমাদের অন্যান্য কম্পোনেন্টগুলি বন্ধ করতে হবে। + +#### `src/App.tsx` {#app-tsx} + +```tsx +import { ConnectButton } from '@rainbow-me/rainbowkit' +import { useAccount } from 'wagmi' +import { Greeter } from './components/Greeter' + +export function App() { +``` + +এটি একটি রিয়্যাক্ট কম্পোনেন্ট তৈরি করার স্ট্যান্ডার্ড উপায় - একটি ফাংশন সংজ্ঞায়িত করুন যা প্রতিবার রেন্ডার করার প্রয়োজন হলে কল করা হয়। এই ফাংশনটিতে সাধারণত উপরে কিছু টাইপস্ক্রিপ্ট বা জাভাস্ক্রিপ্ট কোড থাকে, তারপর একটি `return` স্টেটমেন্ট থাকে যা JSX কোড ফেরত দেয়। + +```tsx + const { isConnected } = useAccount() +``` + +এখানে আমরা [`useAccount`](https://wagmi.sh/react/api/hooks/useAccount) ব্যবহার করি এটি পরীক্ষা করতে যে আমরা একটি ওয়ালেটের মাধ্যমে একটি ব্লকচেইনের সাথে সংযুক্ত আছি কি না। + +প্রচলিতভাবে, রিয়্যাক্টে `use...` নামক ফাংশনগুলি হল [হুক](https://www.w3schools.com/react/react_hooks.asp) যা কিছু ধরণের ডেটা ফেরত দেয়। আপনি যখন এই ধরনের হুক ব্যবহার করেন, তখন আপনার কম্পোনেন্ট শুধুমাত্র ডেটা পায় না, বরং যখন সেই ডেটা পরিবর্তন হয় তখন কম্পোনেন্টটি আপডেট করা তথ্য দিয়ে পুনরায় রেন্ডার করা হয়। + +```tsx + return ( + <> +``` + +একটি রিয়্যাক্ট কম্পোনেন্টের JSX _অবশ্যই_ একটি কম্পোনেন্ট ফেরত দেবে। যখন আমাদের একাধিক কম্পোনেন্ট থাকে এবং আমাদের এমন কিছু থাকে না যা "স্বাভাবিকভাবে" মোড়ানো হয় তখন আমরা একটি খালি কম্পোনেন্ট ব্যবহার করি (`<> ...` `) সেগুলিকে একটি একক কম্পোনেন্টে পরিণত করতে। + +```tsx +

Greeter

+ +``` + +আমরা RainbowKit থেকে [`ConnectButton` কম্পোনেন্টটি](https://www.rainbowkit.com/docs/connect-button) পাই। যখন আমরা সংযুক্ত থাকি না, তখন এটি আমাদের একটি `Connect Wallet` বোতাম দেয় যা একটি মোডাল খোলে যা ওয়ালেটগুলি ব্যাখ্যা করে এবং আপনাকে বেছে নিতে দেয় যে আপনি কোনটি ব্যবহার করবেন। যখন আমরা সংযুক্ত থাকি, তখন এটি আমাদের ব্যবহৃত ব্লকচেইন, আমাদের অ্যাকাউন্টের ঠিকানা এবং আমাদের ETH ব্যালেন্স প্রদর্শন করে। আমরা এই ডিসপ্লেগুলি ব্যবহার করে নেটওয়ার্ক পরিবর্তন করতে বা সংযোগ বিচ্ছিন্ন করতে পারি। + +```tsx + {isConnected && ( +``` + +যখন আমাদের একটি JSX-এ আসল জাভাস্ক্রিপ্ট (বা টাইপস্ক্রিপ্ট যা জাভাস্ক্রিপ্টে কম্পাইল করা হবে) প্রবেশ করাতে হয়, আমরা বন্ধনী (`{}`) ব্যবহার করি। + +`a && b` সিনট্যাক্সটি [`a ?`-এর সংক্ষিপ্ত রূপ b : a`](https://www.w3schools.com/react/react_es6_ternary.asp)-এর জন্য। অর্থাৎ, যদি `a`সত্য হয় তবে এটি`b`তে মূল্যায়ন করে এবং অন্যথায় এটি`a`তে মূল্যায়ন করে (যা`false`, `0` ইত্যাদি হতে পারে)। রিয়্যাক্টকে বলার এটি একটি সহজ উপায় যে একটি কম্পোনেন্ট শুধুমাত্র একটি নির্দিষ্ট শর্ত পূরণ হলে প্রদর্শিত হবে। + +এই ক্ষেত্রে, আমরা ব্যবহারকারীকে `Greeter` শুধুমাত্র তখনই দেখাতে চাই যদি ব্যবহারকারী একটি ব্লকচেইনের সাথে সংযুক্ত থাকে। + +```tsx + + )} + + ) +} +``` + +#### `src/components/Greeter.tsx` {#greeter-tsx} + +এই ফাইলটিতে বেশিরভাগ UI কার্যকারিতা রয়েছে। এটিতে এমন সংজ্ঞা রয়েছে যা সাধারণত একাধিক ফাইলে থাকত, কিন্তু যেহেতু এটি একটি টিউটোরিয়াল তাই প্রোগ্রামটি প্রথমবার বোঝার জন্য সহজ করার জন্য অপ্টিমাইজ করা হয়েছে, পারফরম্যান্স বা রক্ষণাবেক্ষণের সহজতার পরিবর্তে। + +```tsx +import { useState, ChangeEventHandler } from 'react' +import { useNetwork, + useReadContract, + usePrepareContractWrite, + useContractWrite, + useContractEvent + } from 'wagmi' +``` + +আমরা এই লাইব্রেরি ফাংশনগুলি ব্যবহার করি। আবারও, সেগুলি যেখানে ব্যবহার করা হয় সেখানে নিচে ব্যাখ্যা করা হয়েছে। + +```tsx +import { AddressType } from 'abitype' +``` + +[`abitype` লাইব্রেরি](https://abitype.dev/) আমাদের বিভিন্ন ইথেরিয়াম ডেটা প্রকারের জন্য টাইপস্ক্রিপ্ট সংজ্ঞা প্রদান করে, যেমন [`AddressType`](https://abitype.dev/config#addresstype)। + +```tsx +let greeterABI = [ + . + . + . +] as const // greeterABI +``` + +`Greeter` কন্ট্র্যাক্টের জন্য ABI। +আপনি যদি একই সময়ে কন্ট্র্যাক্ট এবং UI ডেভেলপ করেন তবে আপনি সাধারণত সেগুলিকে একই রিপোজিটরিতে রাখবেন এবং আপনার অ্যাপ্লিকেশনে একটি ফাইল হিসাবে সলিডিটি কম্পাইলার দ্বারা উত্পন্ন ABI ব্যবহার করবেন। তবে, এখানে এটি প্রয়োজনীয় নয় কারণ কন্ট্র্যাক্টটি ইতিমধ্যে তৈরি করা হয়েছে এবং এটি পরিবর্তন হবে না। + +```tsx +type AddressPerBlockchainType = { + [key: number]: AddressType +} +``` + +টাইপস্ক্রিপ্ট দৃঢ়ভাবে টাইপ করা হয়। আমরা এই সংজ্ঞাটি ব্যবহার করি সেই ঠিকানাটি নির্দিষ্ট করতে যেখানে `Greeter` কন্ট্র্যাক্টটি বিভিন্ন চেইনে ডিপ্লয় করা হয়েছে। কী একটি সংখ্যা (chainId), এবং মানটি হল একটি `AddressType` (একটি ঠিকানা)। + +```tsx +const contractAddrs: AddressPerBlockchainType = { + // Holesky + 17000: '0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8', + + // Sepolia + 11155111: '0x7143d5c190F048C8d19fe325b748b081903E3BF0' +} +``` + +দুটি সমর্থিত নেটওয়ার্কে কন্ট্র্যাক্টের ঠিকানা: [Holesky](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=contact_code) এবং [Sepolia](https://eth-sepolia.blockscout.com/address/0x7143d5c190F048C8d19fe325b748b081903E3BF0?tab=contact_code)। + +দ্রষ্টব্য: আসলে একটি তৃতীয় সংজ্ঞা রয়েছে, রেডস্টোন হোলস্কির জন্য, এটি নীচে ব্যাখ্যা করা হবে। + +```tsx +type ShowObjectAttrsType = { + name: string, + object: any +} +``` + +এই প্রকারটি `ShowObject` কম্পোনেন্টের একটি প্যারামিটার হিসাবে ব্যবহৃত হয় (পরে ব্যাখ্যা করা হয়েছে)। এটিতে অবজেক্টের নাম এবং তার মান অন্তর্ভুক্ত রয়েছে, যা ডিবাগিংয়ের উদ্দেশ্যে প্রদর্শিত হয়। + +```tsx +type ShowGreetingAttrsType = { + greeting: string | undefined +} +``` + +যেকোন মুহূর্তে আমরা হয় জানতে পারি অভিবাদনটি কী (কারণ আমরা এটি ব্লকচেইন থেকে পড়েছি) অথবা নাও জানতে পারি (কারণ আমরা এখনও এটি পাইনি)। তাই এমন একটি প্রকার থাকা দরকারী যা একটি স্ট্রিং বা কিছুই হতে পারে। + +##### `Greeter` কম্পোনেন্ট {#greeter-component} + +```tsx +const Greeter = () => { +``` + +অবশেষে, আমরা কম্পোনেন্টটি সংজ্ঞায়িত করতে পারি। + +```tsx + const { chain } = useNetwork() +``` + +আমরা যে চেইনটি ব্যবহার করছি সে সম্পর্কে তথ্য, সৌজন্যে [wagmi](https://wagmi.sh/react/hooks/useNetwork)। +যেহেতু এটি একটি হুক (`use...`), তাই প্রতিবার এই তথ্য পরিবর্তন হলে কম্পোনেন্টটি পুনরায় আঁকা হয়। + +```tsx + const greeterAddr = chain && contractAddrs[chain.id] +``` + +Greeter কন্ট্র্যাক্টের ঠিকানা, যা চেইন অনুযায়ী পরিবর্তিত হয় (এবং যা `undefined` হয় যদি আমাদের কাছে চেইন তথ্য না থাকে বা আমরা এমন একটি চেইনে থাকি যেখানে সেই কন্ট্র্যাক্টটি নেই)। + +```tsx + const readResults = useReadContract({ + address: greeterAddr, + abi: greeterABI, + functionName: "greet" , // No arguments + watch: true + }) +``` + +[`useReadContract` হুক](https://wagmi.sh/react/api/hooks/useReadContract) একটি কন্ট্র্যাক্ট থেকে তথ্য পড়ে। UI-তে `readResults` প্রসারিত করে আপনি দেখতে পারেন এটি ঠিক কী তথ্য ফেরত দেয়। এই ক্ষেত্রে আমরা চাই এটি দেখতে থাকুক যাতে অভিবাদন পরিবর্তন হলে আমরা অবহিত হই। + +**দ্রষ্টব্য:** আমরা [`setGreeting` ইভেন্টগুলি](https://eth-holesky.blockscout.com/address/0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8?tab=logs) শুনতে পারি জানতে যে কখন অভিবাদন পরিবর্তন হয় এবং সেইভাবে আপডেট করতে। তবে, যদিও এটি আরও কার্যকর হতে পারে, এটি সব ক্ষেত্রে প্রযোজ্য হবে না। যখন ব্যবহারকারী একটি ভিন্ন চেইনে পরিবর্তন করে তখন অভিবাদনও পরিবর্তন হয়, কিন্তু সেই পরিবর্তনের সাথে কোনো ইভেন্ট থাকে না। আমরা কোডের একটি অংশ ইভেন্টগুলির জন্য শুনতে পারতাম এবং অন্যটি চেইন পরিবর্তনগুলি সনাক্ত করতে পারতাম, কিন্তু এটি কেবল [`watch` প্যারামিটার](https://wagmi.sh/react/api/hooks/useReadContract#watch-optional) সেট করার চেয়ে আরও জটিল হবে। + +```tsx + const [ newGreeting, setNewGreeting ] = useState("") +``` + +রিয়্যাক্টের [`useState` হুক](https://www.w3schools.com/react/react_usestate.asp) আমাদের একটি স্টেট ভেরিয়েবল নির্দিষ্ট করতে দেয়, যার মান কম্পোনেন্টের এক রেন্ডারিং থেকে অন্যটিতে স্থায়ী হয়। প্রাথমিক মান হল প্যারামিটার, এই ক্ষেত্রে খালি স্ট্রিং। + +`useState` হুক দুটি মান সহ একটি তালিকা ফেরত দেয়: + +1. স্টেট ভেরিয়েবলের বর্তমান মান। +2. প্রয়োজন হলে স্টেট ভেরিয়েবল পরিবর্তন করার জন্য একটি ফাংশন। যেহেতু এটি একটি হুক, তাই প্রতিবার এটি কল করা হলে কম্পোনেন্টটি আবার রেন্ডার করা হয়। + +এই ক্ষেত্রে, আমরা একটি স্টেট ভেরিয়েবল ব্যবহার করছি নতুন অভিবাদনের জন্য যা ব্যবহারকারী সেট করতে চায়। + +```tsx + const greetingChange : ChangeEventHandler = (evt) => + setNewGreeting(evt.target.value) +``` + +এটি নতুন অভিবাদন ইনপুট ফিল্ড পরিবর্তন হলে তার জন্য ইভেন্ট হ্যান্ডলার। প্রকারটি, [`ChangeEventHandler`](https://react-typescript-cheatsheet.netlify.app/docs/basic/getting-started/forms_and_events/), নির্দিষ্ট করে যে এটি একটি HTML ইনপুট উপাদানের মান পরিবর্তনের জন্য একটি হ্যান্ডলার। `` অংশটি ব্যবহৃত হয় কারণ এটি একটি [জেনেরিক টাইপ](https://www.w3schools.com/typescript/typescript_basic_generics.php)। + +```tsx + const preparedTx = usePrepareContractWrite({ + address: greeterAddr, + abi: greeterABI, + functionName: 'setGreeting', + args: [ newGreeting ] + }) + const workingTx = useContractWrite(preparedTx.config) +``` + +এটি ক্লায়েন্টের দৃষ্টিকোণ থেকে একটি ব্লকচেইন লেনদেন জমা দেওয়ার প্রক্রিয়া: + +1. ব্লকচেইনের একটি নোডে [`eth_estimateGas`](https://docs.alchemy.com/reference/eth-estimategas) ব্যবহার করে লেনদেনটি পাঠান। +2. নোড থেকে একটি প্রতিক্রিয়ার জন্য অপেক্ষা করুন। +3. প্রতিক্রিয়াটি পাওয়ার পর, ব্যবহারকারীকে ওয়ালেটের মাধ্যমে লেনদেনটি সাইন করতে বলুন। এই ধাপটি _অবশ্যই_ নোডের প্রতিক্রিয়া পাওয়ার পরে ঘটতে হবে কারণ ব্যবহারকারীকে লেনদেন সাইন করার আগে লেনদেনের গ্যাস খরচ দেখানো হয়। +4. ব্যবহারকারীর অনুমোদনের জন্য অপেক্ষা করুন। +5. লেনদেনটি আবার পাঠান, এবার [`eth_sendRawTransaction`](https://docs.alchemy.com/reference/eth-sendrawtransaction) ব্যবহার করে। + +ধাপ ২ সম্ভবত একটি লক্ষণীয় পরিমাণ সময় নিতে পারে, যে সময়ে ব্যবহারকারীরা ভাববেন যে তাদের কমান্ডটি সত্যিই ইউজার ইন্টারফেস দ্বারা গৃহীত হয়েছে কিনা এবং কেন তাদের ইতিমধ্যে লেনদেন সাইন করতে বলা হচ্ছে না। এটি একটি খারাপ ব্যবহারকারী অভিজ্ঞতা (UX) তৈরি করে। + +সমাধান হল [প্রিপেয়ার হুক](https://wagmi.sh/react/prepare-hooks) ব্যবহার করা। প্রতিবার যখন একটি প্যারামিটার পরিবর্তন হয়, অবিলম্বে নোডকে `eth_estimateGas` অনুরোধ পাঠান। তারপর, যখন ব্যবহারকারী আসলে লেনদেনটি পাঠাতে চায় (এই ক্ষেত্রে **আপডেট গ্রিটিং** টিপে), গ্যাসের খরচ জানা থাকে এবং ব্যবহারকারী অবিলম্বে ওয়ালেট পৃষ্ঠাটি দেখতে পারে। + +```tsx + return ( +``` + +এখন আমরা অবশেষে ফেরত দেওয়ার জন্য আসল HTML তৈরি করতে পারি। + +```tsx + <> +

Greeter

+ { + !readResults.isError && !readResults.isLoading && + + } +
+``` + +একটি `ShowGreeting` কম্পোনেন্ট তৈরি করুন (নিচে ব্যাখ্যা করা হয়েছে), কিন্তু শুধুমাত্র যদি ব্লকচেইন থেকে অভিবাদনটি সফলভাবে পড়া হয়। + +```tsx + +``` + +এটি ইনপুট টেক্সট ফিল্ড যেখানে ব্যবহারকারী একটি নতুন অভিবাদন সেট করতে পারে। প্রতিবার ব্যবহারকারী একটি কী চাপলে, আমরা `greetingChange` কল করি যা `setNewGreeting` কল করে। `setNewGreeting` `useState` হুক থেকে আসার কারণে, এটি `Greeter` কম্পোনেন্টকে আবার রেন্ডার করায়। এর মানে হল: + +- আমাদের নতুন অভিবাদনের মান রাখতে `value` নির্দিষ্ট করতে হবে, কারণ অন্যথায় এটি ডিফল্ট, খালি স্ট্রিং-এ ফিরে যাবে। +- `usePrepareContractWrite` প্রতিবার `newGreeting` পরিবর্তনের সময় কল করা হয়, যার মানে এটি সর্বদা প্রস্তুত লেনদেনে সর্বশেষ `newGreeting` থাকবে। + +```tsx + +``` + +যদি `workingTx.write` না থাকে তবে আমরা এখনও অভিবাদন আপডেট পাঠানোর জন্য প্রয়োজনীয় তথ্যের জন্য অপেক্ষা করছি, তাই বোতামটি নিষ্ক্রিয় থাকে। যদি একটি `workingTx.write` মান থাকে তবে সেটি হল লেনদেন পাঠানোর জন্য কল করার ফাংশন। + +```tsx +
+ + + + + ) +} +``` + +অবশেষে, আমরা কী করছি তা দেখতে আপনাকে সাহায্য করার জন্য, আমরা যে তিনটি বস্তু ব্যবহার করি তা দেখান: + +- `readResults` +- `preparedTx` +- `workingTx` + +##### `ShowGreeting` কম্পোনেন্ট {#showgreeting-component} + +এই কম্পোনেন্টটি দেখায় + +```tsx +const ShowGreeting = (attrs : ShowGreetingAttrsType) => { +``` + +একটি কম্পোনেন্ট ফাংশন কম্পোনেন্টের সমস্ত অ্যাট্রিবিউট সহ একটি প্যারামিটার গ্রহণ করে। + +```tsx + return {attrs.greeting} +} +``` + +##### `ShowObject` কম্পোনেন্ট {#showobject-component} + +তথ্যের উদ্দেশ্যে, আমরা `ShowObject` কম্পোনেন্ট ব্যবহার করি গুরুত্বপূর্ণ বস্তুগুলি দেখানোর জন্য (`readResults` অভিবাদন পড়ার জন্য এবং `preparedTx` এবং `workingTx` আমাদের তৈরি করা লেনদেনের জন্য)। + +```tsx +const ShowObject = (attrs: ShowObjectAttrsType ) => { + const keys = Object.keys(attrs.object) + const funs = keys.filter(k => typeof attrs.object[k] == "function") + return <> +
+``` + +আমরা UI-কে সমস্ত তথ্য দিয়ে বিশৃঙ্খল করতে চাই না, তাই সেগুলি দেখতে বা বন্ধ করা সম্ভব করার জন্য, আমরা একটি [`details`](https://www.w3schools.com/tags/tag_details.asp) ট্যাগ ব্যবহার করি। + +```tsx + {attrs.name} +
+        {JSON.stringify(attrs.object, null, 2)}
+```
+
+বেশিরভাগ ফিল্ড [`JSON.stringify`](https://www.w3schools.com/js/js_json_stringify.asp) ব্যবহার করে প্রদর্শিত হয়।
+
+```tsx
+      
+ { funs.length > 0 && + <> + ফাংশন: +
    +``` + +ব্যতিক্রম হল ফাংশন, যা [JSON স্ট্যান্ডার্ডের](https://www.json.org/json-en.html) অংশ নয়, তাই সেগুলিকে আলাদাভাবে প্রদর্শন করতে হবে। + +```tsx + {funs.map((f, i) => +``` + +JSX-এর মধ্যে, `{` কার্লি ব্র্যাকেট `}` এর ভিতরের কোড জাভাস্ক্রিপ্ট হিসাবে ব্যাখ্যা করা হয়। তারপর, `(` রেগুলার ব্র্যাকেট `)` এর ভিতরের কোডটি আবার JSX হিসাবে ব্যাখ্যা করা হয়। + +```tsx + (
  • {f}
  • ) + )} +``` + +রিয়্যাক্টের [DOM ট্রি](https://www.w3schools.com/js/js_htmldom.asp)-তে ট্যাগগুলির জন্য স্বতন্ত্র শনাক্তকারী প্রয়োজন। এর মানে হল একই ট্যাগের শিশুদের (এই ক্ষেত্রে, [আনঅর্ডারড তালিকা](https://www.w3schools.com/tags/tag_ul.asp)) জন্য ভিন্ন `key` অ্যাট্রিবিউট প্রয়োজন। + +```tsx +
+ + } +
+ +} +``` + +বিভিন্ন HTML ট্যাগ শেষ করুন। + +##### চূড়ান্ত `export` {#the-final-export} + +```tsx +export { Greeter } +``` + +`Greeter` কম্পোনেন্টটি হল সেইটি যা আমাদের অ্যাপ্লিকেশনের জন্য এক্সপোর্ট করতে হবে। + +#### `src/wagmi.ts` {#wagmi-ts} + +অবশেষে, WAGMI সম্পর্কিত বিভিন্ন সংজ্ঞা `src/wagmi.ts`-এ রয়েছে। আমি এখানে সবকিছু ব্যাখ্যা করতে যাচ্ছি না, কারণ এর বেশিরভাগই বয়লারপ্লেট যা আপনার পরিবর্তন করার প্রয়োজন হওয়ার সম্ভাবনা কম। + +এখানকার কোডটি [গিটহাবে](https://github.com/qbzzt/20230801-modern-ui/blob/main/src/wagmi.ts) থাকা কোডের মতো ঠিক একই নয় কারণ পরে নিবন্ধে আমরা আরেকটি চেইন ([Redstone Holesky](https://redstone.xyz/docs/network-info)) যোগ করি। + +```ts +import { getDefaultWallets } from '@rainbow-me/rainbowkit' +import { configureChains, createConfig } from 'wagmi' +import { holesky, sepolia } from 'wagmi/chains' +``` + +অ্যাপ্লিকেশনটি সমর্থন করে এমন ব্লকচেইনগুলি ইম্পোর্ট করুন। আপনি সমর্থিত চেইনের তালিকা [viem গিটহাবে](https://github.com/wagmi-dev/viem/tree/main/src/chains/definitions) দেখতে পারেন। + +```ts +import { publicProvider } from 'wagmi/providers/public' + +const walletConnectProjectId = 'c96e690bb92b6311e8e9b2a6a22df575' +``` + +[WalletConnect](https://walletconnect.com/) ব্যবহার করতে সক্ষম হতে আপনার অ্যাপ্লিকেশনের জন্য একটি প্রজেক্ট আইডি প্রয়োজন। আপনি এটি [cloud.walletconnect.com](https://cloud.walletconnect.com/sign-in) থেকে পেতে পারেন। + +```ts +const { chains, publicClient, webSocketPublicClient } = configureChains( + [ holesky, sepolia ], + [ + publicProvider(), + ], +) + +const { connectors } = getDefaultWallets({ + appName: 'My wagmi + RainbowKit App', + chains, + projectId: walletConnectProjectId, +}) + +export const config = createConfig({ + autoConnect: true, + connectors, + publicClient, + webSocketPublicClient, +}) + +export { chains } +``` + +### আরেকটি ব্লকচেইন যোগ করা {#add-blockchain} + +আজকাল অনেক [L2 স্কেলিং সমাধান](/layer-2/) রয়েছে, এবং আপনি হয়তো এমন কিছু সমর্থন করতে চাইতে পারেন যা viem এখনও সমর্থন করে না। এটি করার জন্য, আপনি `src/wagmi.ts` পরিবর্তন করুন। এই নির্দেশাবলী ব্যাখ্যা করে কিভাবে [Redstone Holesky](https://redstone.xyz/docs/network-info) যোগ করতে হয়। + +1. viem থেকে `defineChain` টাইপ ইম্পোর্ট করুন। + + ```ts + import { defineChain } from 'viem' + ``` + +2. নেটওয়ার্ক সংজ্ঞা যোগ করুন। + + ```ts + const redstoneHolesky = defineChain({ + id: 17_001, + name: 'Redstone Holesky', + network: 'redstone-holesky', + nativeCurrency: { + decimals: 18, + name: 'Ether', + symbol: 'ETH', + }, + rpcUrls: { + default: { + http: ['https://rpc.holesky.redstone.xyz'], + webSocket: ['wss://rpc.holesky.redstone.xyz/ws'], + }, + public: { + http: ['https://rpc.holesky.redstone.xyz'], + webSocket: ['wss://rpc.holesky.redstone.xyz/ws'], + }, + }, + blockExplorers: { + default: { name: 'Explorer', url: 'https://explorer.holesky.redstone.xyz' }, + }, + }) + ``` + +3. `configureChains` কলে নতুন চেইন যোগ করুন। + + ```ts + const { chains, publicClient, webSocketPublicClient } = configureChains( + [ holesky, sepolia, redstoneHolesky ], + [ publicProvider(), ], + ) + ``` + +4. নিশ্চিত করুন যে অ্যাপ্লিকেশনটি নতুন নেটওয়ার্কে আপনার কন্ট্র্যাক্টের জন্য ঠিকানাটি জানে। এই ক্ষেত্রে, আমরা `src/components/Greeter.tsx` পরিবর্তন করি: + + ```ts + const contractAddrs : AddressPerBlockchainType = { + // Holesky + 17000: '0x432d810484AdD7454ddb3b5311f0Ac2E95CeceA8', + + // Redstone Holesky + 17001: '0x4919517f82a1B89a32392E1BF72ec827ba9986D3', + + // Sepolia + 11155111: '0x7143d5c190F048C8d19fe325b748b081903E3BF0' + } + ``` + +## উপসংহার {#conclusion} + +অবশ্যই, আপনি `Greeter`-এর জন্য একটি ইউজার ইন্টারফেস সরবরাহ করার বিষয়ে সত্যিই চিন্তা করেন না। আপনি আপনার নিজের কন্ট্র্যাক্টের জন্য একটি ইউজার ইন্টারফেস তৈরি করতে চান। আপনার নিজের অ্যাপ্লিকেশন তৈরি করতে, এই ধাপগুলি চালান: + +1. একটি wagmi অ্যাপ্লিকেশন তৈরি করতে নির্দিষ্ট করুন। + + ```sh copy + pnpm create wagmi + ``` + +2. অ্যাপ্লিকেশনটির নাম দিন। + +3. **React** ফ্রেমওয়ার্ক নির্বাচন করুন। + +4. **Vite** ভেরিয়েন্ট নির্বাচন করুন। + +5. আপনি [Rainbow kit যোগ করতে পারেন](https://www.rainbowkit.com/docs/installation#manual-setup)। + +এখন যান এবং আপনার কন্ট্র্যাক্টগুলি বৃহত্তর বিশ্বের জন্য ব্যবহারযোগ্য করে তুলুন। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। + diff --git a/public/content/translations/bn/developers/tutorials/deploying-your-first-smart-contract/index.md b/public/content/translations/bn/developers/tutorials/deploying-your-first-smart-contract/index.md new file mode 100644 index 00000000000..626899db906 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/deploying-your-first-smart-contract/index.md @@ -0,0 +1,101 @@ +--- +title: "আপনার প্রথম স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করা" +description: "একটি ইথেরিয়াম টেস্ট নেটওয়ার্কে আপনার প্রথম স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করার একটি ভূমিকা" +author: "jdourlens" +tags: + [ + "স্মার্ট কন্ট্র্যাক্ট", + "remix", + "সলিডিটি", + "ডেপ্লয়িং" + ] +skill: beginner +lang: bn +published: 2020-04-03 +source: EthereumDev +sourceUrl: https://ethereumdev.io/deploying-your-first-smart-contract/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +আমি অনুমান করছি যে আপনিও আমাদের মতোই ইথেরিয়াম ব্লকচেইনে আপনার প্রথম [স্মার্ট কন্ট্র্যাক্ট](/developers/docs/smart-contracts/) [ডিপ্লয়](/developers/docs/smart-contracts/deploying/) করতে এবং তার সাথে ইন্টারঅ্যাক্ট করতে উত্তেজিত। + +চিন্তা করবেন না, যেহেতু এটি আমাদের প্রথম স্মার্ট কন্ট্র্যাক্ট, আমরা এটিকে একটি [লোকাল টেস্ট নেটওয়ার্কে](/developers/docs/networks/) ডিপ্লয় করব যাতে এটি ডিপ্লয় করতে এবং আপনার ইচ্ছামত এটি নিয়ে খেলা করতে আপনার কোনো খরচ না হয়। + +## আমাদের কন্ট্র্যাক্ট লেখা {#writing-our-contract} + +প্রথম ধাপ হল [Remix ভিজিট করা](https://remix.ethereum.org/) এবং একটি নতুন ফাইল তৈরি করা। Remix ইন্টারফেসের উপরের বাম অংশে একটি নতুন ফাইল যোগ করুন এবং আপনার পছন্দের ফাইলের নাম লিখুন। + +![Remix ইন্টারফেসে একটি নতুন ফাইল যোগ করা হচ্ছে](./remix.png) + +নতুন ফাইলে, আমরা নিম্নলিখিত কোডটি পেস্ট করব। + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.5.17; + +contract Counter { + + // গণনার সংখ্যা রাখার জন্য আনসাইন্ড int টাইপের পাবলিক ভেরিয়েবল + uint256 public count = 0; + + // ফাংশন যা আমাদের কাউন্টারকে বৃদ্ধি করে + function increment() public { + count += 1; + } + + // কাউন্টের মান পাওয়ার জন্য অপ্রয়োজনীয় গেটার + function getCount() public view returns (uint256) { + return count; + } + +} +``` + +আপনি যদি প্রোগ্রামিংয়ে অভ্যস্ত হন তবে আপনি সহজেই অনুমান করতে পারবেন এই প্রোগ্রামটি কী করে। এখানে লাইন বাই লাইন একটি ব্যাখ্যা দেওয়া হল: + +- লাইন 4: আমরা `Counter` নামে একটি কন্ট্র্যাক্ট সংজ্ঞায়িত করি। +- লাইন 7: আমাদের কন্ট্র্যাক্ট 0 থেকে শুরু করে `count` নামের একটি আনসাইন্ড ইন্টিজার সংরক্ষণ করে। +- লাইন 10: প্রথম ফাংশনটি কন্ট্র্যাক্টের স্টেট পরিবর্তন করবে এবং আমাদের `count` ভেরিয়েবলকে `increment()` করবে। +- লাইন 15: দ্বিতীয় ফাংশনটি শুধুমাত্র একটি গেটার যা স্মার্ট কন্ট্র্যাক্টের বাইরে থেকে `count` ভেরিয়েবলের মান পড়তে সক্ষম। মনে রাখবেন, যেহেতু আমরা আমাদের `count` ভেরিয়েবলকে পাবলিক হিসেবে সংজ্ঞায়িত করেছি, এটি প্রয়োজনীয় নয় কিন্তু একটি উদাহরণ হিসেবে দেখানো হয়েছে। + +আমাদের প্রথম সহজ স্মার্ট কন্ট্র্যাক্টের জন্য এইটুকুই। আপনি হয়তো জানেন, এটি জাভা বা C++ এর মতো OOP (অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং) ভাষাগুলির একটি ক্লাসের মতো দেখায়। এখন আমাদের কন্ট্র্যাক্ট নিয়ে খেলার সময়। + +## আমাদের কন্ট্র্যাক্ট ডিপ্লয় করা {#deploying-our-contract} + +যেহেতু আমরা আমাদের প্রথম স্মার্ট কন্ট্র্যাক্ট লিখেছি, এখন আমরা এটিকে ব্লকচেইনে ডিপ্লয় করব যাতে আমরা এটি নিয়ে খেলতে পারি। + +[ব্লকচেইনে স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করা](/developers/docs/smart-contracts/deploying/) আসলে কোনো প্রাপক নির্দিষ্ট না করে কম্পাইল করা স্মার্ট কন্ট্র্যাক্টের কোড ধারণকারী একটি লেনদেন পাঠানো মাত্র। + +আমরা প্রথমে বাম দিকের কম্পাইল আইকনে ক্লিক করে [কন্ট্র্যাক্টটি কম্পাইল করব](/developers/docs/smart-contracts/compiling/): + +![Remix টুলবারে কম্পাইল আইকন](./remix-compile-button.png) + +তারপর কম্পাইল বোতামে ক্লিক করুন: + +![Remix সলিডিটি কম্পাইলারে কম্পাইল বোতাম](./remix-compile.png) + +আপনি "Auto compile" বিকল্পটি নির্বাচন করতে পারেন যাতে আপনি যখন টেক্সট এডিটরে কন্টেন্ট সংরক্ষণ করবেন তখন কন্ট্র্যাক্টটি সর্বদা কম্পাইল করা হবে। + +তারপর "deploy and run transactions" স্ক্রিনে নেভিগেট করুন: + +![Remix টুলবারে ডিপ্লয় আইকন](./remix-deploy.png) + +একবার আপনি "deploy and run transactions" স্ক্রিনে এলে, আপনার কন্ট্র্যাক্টের নাম দেখা যাচ্ছে কিনা তা দুবার পরীক্ষা করুন এবং Deploy-এ ক্লিক করুন। যেমনটি আপনি পৃষ্ঠার শীর্ষে দেখতে পাচ্ছেন, বর্তমান এনভায়রনমেন্ট হল "JavaScript VM" যার মানে হল আমরা আমাদের স্মার্ট কন্ট্র্যাক্টটিকে একটি লোকাল টেস্ট ব্লকচেইনে ডিপ্লয় করব এবং তার সাথে ইন্টারঅ্যাক্ট করব যাতে দ্রুত এবং কোনো ফি ছাড়াই পরীক্ষা করা যায়। + +![Remix সলিডিটি কম্পাইলারে ডিপ্লয় বোতাম](./remix-deploy-button.png) + +একবার আপনি "Deploy" বোতামে ক্লিক করলে, আপনি দেখতে পাবেন আপনার কন্ট্র্যাক্টটি নীচে উপস্থিত হয়েছে। বাম দিকের তীরটিতে ক্লিক করে এটিকে প্রসারিত করুন যাতে আমরা আমাদের কন্ট্র্যাক্টের কন্টেন্ট দেখতে পারি। এটি হল আমাদের ভেরিয়েবল `counter`, আমাদের `increment()` ফাংশন এবং গেটার `getCounter()`। + +আপনি যদি `count` বা `getCount` বোতামে ক্লিক করেন, তবে এটি আসলে কন্ট্র্যাক্টের `count` ভেরিয়েবলের কন্টেন্ট পুনরুদ্ধার করবে এবং এটি প্রদর্শন করবে। যেহেতু আমরা এখনো `increment` ফাংশনটি কল করিনি, এটি 0 প্রদর্শন করবে। + +![Remix সলিডিটি কম্পাইলারে ফাংশন বোতাম](./remix-function-button.png) + +চলুন এখন বোতামে ক্লিক করে `increment` ফাংশনটিকে কল করি। আপনি দেখতে পাবেন যে লেনদেনগুলির লগ উইন্ডোর নীচে উপস্থিত হচ্ছে। আপনি দেখতে পাবেন যে `increment` বোতামের পরিবর্তে ডেটা পুনরুদ্ধারের জন্য বোতাম টিপলে লগগুলি আলাদা হয়। এর কারণ হল ব্লকচেইনে ডেটা পড়ার জন্য কোনো লেনদেন (লেখা) বা ফি প্রয়োজন হয় না। কারণ শুধুমাত্র ব্লকচেইনের স্টেট পরিবর্তন করার জন্য একটি লেনদেন করতে হয়: + +![লেনদেনের একটি লগ](./transaction-log.png) + +ইনক্রিমেন্ট বোতামটি চাপার পরে যা আমাদের `increment()` ফাংশনকে কল করার জন্য একটি লেনদেন তৈরি করবে, আমরা যদি কাউন্ট বা getCount বোতামগুলিতে আবার ক্লিক করি তাহলে আমরা আমাদের স্মার্ট কন্ট্র্যাক্টের নতুন আপডেট করা স্টেটটি পড়ব যেখানে কাউন্ট ভেরিয়েবলটি 0-এর চেয়ে বড় হবে। + +![স্মার্ট কন্ট্র্যাক্টের নতুন আপডেট করা স্টেট](./updated-state.png) + +পরবর্তী টিউটোরিয়ালে, আমরা কভার করব [কিভাবে আপনি আপনার স্মার্ট কন্ট্র্যাক্টে ইভেন্ট যোগ করতে পারেন](/developers/tutorials/logging-events-smart-contracts/)। লগিং ইভেন্টগুলি হল আপনার স্মার্ট কন্ট্র্যাক্ট ডিবাগ করার এবং একটি ফাংশন কল করার সময় কী ঘটছে তা বোঝার একটি সুবিধাজনক উপায়। diff --git a/public/content/translations/bn/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md b/public/content/translations/bn/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md new file mode 100644 index 00000000000..8f5e9e82f56 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/develop-and-test-dapps-with-a-multi-client-local-eth-testnet/index.md @@ -0,0 +1,372 @@ +--- +title: "একটি স্থানীয়, মাল্টি-ক্লায়েন্ট টেস্টনেটে কীভাবে একটি dApp ডেভেলপ এবং পরীক্ষা করা যায়" +description: "এই গাইডটি আপনাকে প্রথমে একটি মাল্টি-ক্লায়েন্ট স্থানীয় Ethereum টেস্টনেটকে কীভাবে ইনস্ট্যানশিয়েট এবং কনফিগার করতে হয় তা দেখাবে এবং তারপরে dApp স্থাপন এবং পরীক্ষা করার জন্য টেস্টনেট ব্যবহার করবে।" +author: "Tedi Mitiku" +tags: + [ + "ক্লায়েন্ট", + "নোড", + "স্মার্ট কন্ট্র্যাক্ট", + "কম্পোজেবিলিটি", + "কনসেন্সাস লেয়ার", + "এক্সিকিউশন লেয়ার", + "পরীক্ষা" + ] +skill: intermediate +lang: bn +published: 2023-04-11 +--- + +## ভূমিকা {#introduction} + +এই গাইডটি আপনাকে একটি কনফিগারযোগ্য স্থানীয় Ethereum টেস্টনেট ইনস্ট্যানশিয়েট করার, এতে একটি স্মার্ট কন্ট্র্যাক্ট স্থাপন করার এবং আপনার dApp-এর বিরুদ্ধে পরীক্ষা চালানোর জন্য টেস্টনেট ব্যবহার করার প্রক্রিয়াটি দেখায়। এই গাইডটি dApp ডেভেলপারদের জন্য ডিজাইন করা হয়েছে যারা একটি লাইভ টেস্টনেট বা মেইননেটে স্থাপন করার আগে বিভিন্ন নেটওয়ার্ক কনফিগারেশনের বিরুদ্ধে স্থানীয়ভাবে তাদের dApps ডেভেলপ এবং পরীক্ষা করতে চান। + +এই গাইডে, আপনি যা যা করবেন: + +- [Kurtosis](https://www.kurtosis.com/) ব্যবহার করে [`eth-network-package`](https://github.com/kurtosis-tech/eth-network-package)-এর সাথে একটি স্থানীয় Ethereum টেস্টনেট ইনস্ট্যানশিয়েট করুন, +- একটি dApp কম্পাইল, স্থাপন এবং পরীক্ষা করার জন্য আপনার Hardhat dApp ডেভেলপমেন্ট পরিবেশকে স্থানীয় টেস্টনেটের সাথে সংযুক্ত করুন, এবং +- বিভিন্ন নেটওয়ার্ক কনফিগারেশনের বিরুদ্ধে ডেভেলপমেন্ট এবং পরীক্ষার কর্মপ্রবাহ সক্রিয় করতে, স্থানীয় টেস্টনেট কনফিগার করুন, যার মধ্যে নোডের সংখ্যা এবং নির্দিষ্ট EL/CL ক্লায়েন্ট পেয়ারিং-এর মতো প্যারামিটার অন্তর্ভুক্ত রয়েছে। + +### Kurtosis কী? {#what-is-kurtosis} + +[Kurtosis](https://www.kurtosis.com/) একটি কম্পোজেবল বিল্ড সিস্টেম যা মাল্টি-কন্টেইনার পরীক্ষার পরিবেশ কনফিগার করার জন্য ডিজাইন করা হয়েছে। এটি বিশেষভাবে ডেভেলপারদের পুনরুৎপাদনযোগ্য পরিবেশ তৈরি করতে সক্ষম করে যার জন্য ডাইনামিক সেটআপ লজিক প্রয়োজন, যেমন ব্লকচেইন টেস্টনেট। + +এই গাইডে, Kurtosis eth-network-package [`geth`](https://geth.ethereum.org/) এক্সিকিউশন লেয়ার (EL) ক্লায়েন্ট, সেইসাথে [`teku`](https://consensys.io/teku), [`lighthouse`](https://lighthouse.sigmaprime.io/), এবং [`lodestar`](https://lodestar.chainsafe.io/) কনসেন্সাস লেয়ার (CL) ক্লায়েন্টগুলির জন্য সমর্থন সহ একটি স্থানীয় Ethereum টেস্টনেট চালু করে। এই প্যাকেজটি Hardhat Network, Ganache, এবং Anvil-এর মতো ফ্রেমওয়ার্কের নেটওয়ার্কগুলির জন্য একটি কনফিগারযোগ্য এবং কম্পোজেবল বিকল্প হিসেবে কাজ করে। Kurtosis ডেভেলপারদের ব্যবহৃত টেস্টনেটের উপর অধিক নিয়ন্ত্রণ এবং নমনীয়তা প্রদান করে, যা [Ethereum Foundation-এর the Merge পরীক্ষা করার জন্য Kurtosis ব্যবহার করার](https://www.kurtosis.com/blog/testing-the-ethereum-merge) একটি প্রধান কারণ এবং নেটওয়ার্ক আপগ্রেড পরীক্ষার জন্য এটি ব্যবহার করা অব্যাহত রয়েছে। + +## Kurtosis সেট আপ করা {#setting-up-kurtosis} + +এগিয়ে যাওয়ার আগে, নিশ্চিত করুন আপনার কাছে আছে: + +- আপনার স্থানীয় মেশিনে [Docker ইঞ্জিন ইনস্টল এবং শুরু করেছেন](https://docs.kurtosis.com/install/#i-install--start-docker) +- [Kurtosis CLI ইনস্টল করেছেন](https://docs.kurtosis.com/install#ii-install-the-cli) (অথবা যদি আপনার কাছে CLI আগে থেকেই ইনস্টল করা থাকে তবে এটিকে সর্বশেষ রিলিজে আপগ্রেড করেছেন) +- [Node.js](https://nodejs.org/en), [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable), এবং [npx](https://www.npmjs.com/package/npx) ইনস্টল করেছেন (আপনার dApp পরিবেশের জন্য) + +## একটি স্থানীয় Ethereum টেস্টনেট ইনস্ট্যানশিয়েট করা {#instantiate-testnet} + +একটি স্থানীয় Ethereum টেস্টনেট চালু করতে, রান করুন: + +```python +kurtosis --enclave local-eth-testnet run github.com/kurtosis-tech/eth-network-package +``` + +দ্রষ্টব্য: এই কমান্ডটি `--enclave` ফ্ল্যাগ ব্যবহার করে আপনার নেটওয়ার্কের নাম দেয়: "local-eth-testnet"। + +Kurtosis নির্দেশাবলী ব্যাখ্যা, যাচাই এবং তারপর কার্যকর করার জন্য কাজ করার সময় যে পদক্ষেপগুলি নিচ্ছে তা প্রিন্ট করবে। শেষে, আপনার নিম্নলিখিতটির মতো একটি আউটপুট দেখা উচিত: + +```python +INFO[2023-04-04T18:09:44-04:00] ====================================================== +INFO[2023-04-04T18:09:44-04:00] || Created enclave: local-eth-testnet || +INFO[2023-04-04T18:09:44-04:00] ====================================================== +Name: local-eth-testnet +UUID: 39372d756ae8 +Status: RUNNING +Creation Time: Tue, 04 Apr 2023 18:09:03 EDT + +========================================= Files Artifacts ========================================= +UUID Name +d4085a064230 cl-genesis-data +1c62cb792e4c el-genesis-data +bd60489b73a7 genesis-generation-config-cl +b2e593fe5228 genesis-generation-config-el +d552a54acf78 geth-prefunded-keys +5f7e661eb838 prysm-password +054e7338bb59 validator-keystore-0 + +========================================== User Services ========================================== +UUID Name Ports Status +e20f129ee0c5 cl-client-0-beacon http: 4000/tcp -> RUNNING + metrics: 5054/tcp -> + tcp-discovery: 9000/tcp -> 127.0.0.1:54263 + udp-discovery: 9000/udp -> 127.0.0.1:60470 +a8b6c926cdb4 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:54267 RUNNING + metrics: 5064/tcp -> +d7b802f623e8 el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:54253 RUNNING + rpc: 8545/tcp -> 127.0.0.1:54251 + tcp-discovery: 30303/tcp -> 127.0.0.1:54254 + udp-discovery: 30303/udp -> 127.0.0.1:53834 + ws: 8546/tcp -> 127.0.0.1:54252 +514a829c0a84 prelaunch-data-generator-1680646157905431468 STOPPED +62bd62d0aa7a prelaunch-data-generator-1680646157915424301 STOPPED +05e9619e0e90 prelaunch-data-generator-1680646157922872635 STOPPED + +``` + +অভিনন্দন! আপনি Docker-এর উপর একটি CL (`lighthouse`) এবং EL ক্লায়েন্ট (`geth`) সহ একটি স্থানীয় Ethereum টেস্টনেট ইনস্ট্যানশিয়েট করতে Kurtosis ব্যবহার করেছেন। + +### পর্যালোচনা {#review-instantiate-testnet} + +এই বিভাগে, আপনি একটি কমান্ড কার্যকর করেছেন যা Kurtosis-কে একটি Kurtosis [Enclave](https://docs.kurtosis.com/advanced-concepts/enclaves/)-এর মধ্যে একটি স্থানীয় Ethereum টেস্টনেট চালু করতে GitHub-এ দূরবর্তীভাবে হোস্ট করা [`eth-network-package`](https://github.com/kurtosis-tech/eth-network-package) ব্যবহার করতে নির্দেশ দিয়েছে। আপনার এনক্লেভের ভিতরে, আপনি "ফাইল আর্টিফ্যাক্ট" এবং "ব্যবহারকারী পরিষেবা" উভয়ই পাবেন। + +আপনার এনক্লেভে থাকা [ফাইল আর্টিফ্যাক্ট](https://docs.kurtosis.com/advanced-concepts/files-artifacts/) EL এবং CL ক্লায়েন্টদের বুটস্ট্র্যাপ করার জন্য তৈরি এবং ব্যবহৃত সমস্ত ডেটা অন্তর্ভুক্ত করে। এই [ডকার ইমেজ](https://github.com/ethpandaops/ethereum-genesis-generator) থেকে তৈরি `prelaunch-data-generator` পরিষেবা ব্যবহার করে ডেটা তৈরি করা হয়েছিল + +ব্যবহারকারী পরিষেবাগুলি আপনার এনক্লেভে পরিচালিত সমস্ত কন্টেইনারাইজড পরিষেবা প্রদর্শন করে। আপনি লক্ষ্য করবেন যে একটি একক নোড, যেখানে একটি EL ক্লায়েন্ট এবং একটি CL ক্লায়েন্ট উভয়ই রয়েছে, তৈরি করা হয়েছে। + +## আপনার dApp ডেভেলপমেন্ট পরিবেশকে স্থানীয় Ethereum টেস্টনেটের সাথে সংযুক্ত করুন {#connect-your-dapp} + +### dApp ডেভেলপমেন্ট পরিবেশ সেটআপ করুন {#set-up-dapp-env} + +এখন যেহেতু আপনার একটি চলমান স্থানীয় টেস্টনেট আছে, আপনি আপনার dApp ডেভেলপমেন্ট পরিবেশকে আপনার স্থানীয় টেস্টনেট ব্যবহার করার জন্য সংযুক্ত করতে পারেন। এই গাইডে আপনার স্থানীয় টেস্টনেটে একটি ব্ল্যাকজ্যাক dApp স্থাপন করতে Hardhat ফ্রেমওয়ার্ক ব্যবহার করা হবে। + +আপনার dApp ডেভেলপমেন্ট পরিবেশ সেট আপ করতে, আমাদের স্যাম্পল dApp ধারণকারী রিপোজিটরিটি ক্লোন করুন এবং এর নির্ভরতাগুলি ইনস্টল করুন, রান করুন: + +```python +git clone https://github.com/kurtosis-tech/awesome-kurtosis.git && cd awesome-kurtosis/smart-contract-example && yarn +``` + +এখানে ব্যবহৃত [smart-contract-example](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example) ফোল্ডারে [Hardhat](https://hardhat.org/) ফ্রেমওয়ার্ক ব্যবহারকারী একজন dApp ডেভেলপারের জন্য সাধারণ সেটআপ রয়েছে: + +- [`contracts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/contracts)-এ একটি Blackjack dApp-এর জন্য কয়েকটি সহজ স্মার্ট কন্ট্র্যাক্ট রয়েছে +- [`scripts/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/scripts)-এ আপনার স্থানীয় Ethereum নেটওয়ার্কে একটি টোকেন কন্ট্র্যাক্ট স্থাপন করার জন্য একটি স্ক্রিপ্ট রয়েছে +- [`test/`](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/smart-contract-example/test)-এ আপনার টোকেন কন্ট্র্যাক্টের জন্য একটি সহজ .js পরীক্ষা রয়েছে যা নিশ্চিত করে যে আমাদের Blackjack dApp-এর প্রতিটি খেলোয়াড়ের জন্য 1000 মিন্ট করা হয়েছে +- [`hardhat.config.ts`](https://github.com/kurtosis-tech/awesome-kurtosis/blob/main/smart-contract-example/hardhat.config.ts) আপনার Hardhat সেটআপ কনফিগার করে + +### স্থানীয় টেস্টনেট ব্যবহার করার জন্য Hardhat কনফিগার করুন {#configure-hardhat} + +আপনার dApp ডেভেলপমেন্ট পরিবেশ সেট আপ করার সাথে, আপনি এখন Kurtosis ব্যবহার করে তৈরি স্থানীয় Ethereum টেস্টনেট ব্যবহার করতে Hardhat-কে সংযুক্ত করবেন। এটি সম্পন্ন করতে, আপনার `hardhat.config.ts` কনফিগারেশন ফাইলের `localnet` স্ট্রাক্টে `<$YOUR_PORT>` কে যেকোনো `el-client-` পরিষেবা থেকে rpc uri আউটপুটের পোর্ট দিয়ে প্রতিস্থাপন করুন। এই স্যাম্পল ক্ষেত্রে, পোর্ট হবে `64248`। আপনার পোর্ট ভিন্ন হবে। + +`hardhat.config.ts`-এ উদাহরণ: + +```js +localnet: { +url: 'http://127.0.0.1:<$YOUR_PORT>',// TODO: $YOUR_PORT-কে ETH নেটওয়ার্ক কার্টোসিস প্যাকেজ দ্বারা উৎপাদিত একটি নোড URI-এর পোর্ট দিয়ে প্রতিস্থাপন করুন + +// এগুলি হল eth-নেটওয়ার্ক-প্যাকেজ দ্বারা তৈরি প্রিফান্ডেড টেস্ট অ্যাকাউন্টের সাথে যুক্ত প্রাইভেট কী +// +accounts: [ + "ef5177cd0b6b21c87db5a0bf35d4084a8a57a9d6a064f86d51ac85f2b873a4e2", + "48fcc39ae27a0e8bf0274021ae6ebd8fe4a0e12623d61464c498900b28feb567", + "7988b3a148716ff800414935b305436493e1f25237a2a03e5eebc343735e2f31", + "b3c409b6b0b3aa5e65ab2dc1930534608239a478106acf6f3d9178e9f9b00b35", + "df9bb6de5d3dc59595bcaa676397d837ff49441d211878c024eabda2cd067c9f", + "7da08f856b5956d40a72968f93396f6acff17193f013e8053f6fbb6c08c194d6", + ], +}, +``` + +একবার আপনি আপনার ফাইলটি সংরক্ষণ করলে, আপনার Hardhat dApp ডেভেলপমেন্ট পরিবেশ এখন আপনার স্থানীয় Ethereum টেস্টনেটের সাথে সংযুক্ত! আপনি রান করে যাচাই করতে পারেন যে আপনার টেস্টনেট কাজ করছে: + +```python +npx hardhat balances --network localnet +``` + +আউটপুটটি এইরকম দেখতে হবে: + +```python +0x878705ba3f8Bc32FCf7F4CAa1A35E72AF65CF766 has balance 10000000000000000000000000 +0x4E9A3d9D1cd2A2b2371b8b3F489aE72259886f1A has balance 10000000000000000000000000 +0xdF8466f277964Bb7a0FFD819403302C34DCD530A has balance 10000000000000000000000000 +0x5c613e39Fc0Ad91AfDA24587e6f52192d75FBA50 has balance 10000000000000000000000000 +0x375ae6107f8cC4cF34842B71C6F746a362Ad8EAc has balance 10000000000000000000000000 +0x1F6298457C5d76270325B724Da5d1953923a6B88 has balance 10000000000000000000000000 +``` + +এটি নিশ্চিত করে যে Hardhat আপনার স্থানীয় টেস্টনেট ব্যবহার করছে এবং `eth-network-package` দ্বারা তৈরি প্রি-ফান্ডেড অ্যাকাউন্টগুলি সনাক্ত করছে। + +### স্থানীয়ভাবে আপনার dApp স্থাপন এবং পরীক্ষা করুন {#deploy-and-test-dapp} + +dApp ডেভেলপমেন্ট পরিবেশটি স্থানীয় Ethereum টেস্টনেটের সাথে সম্পূর্ণরূপে সংযুক্ত থাকায়, আপনি এখন স্থানীয় টেস্টনেট ব্যবহার করে আপনার dApp-এর বিরুদ্ধে ডেভেলপমেন্ট এবং পরীক্ষার কর্মপ্রবাহ চালাতে পারেন। + +স্থানীয় প্রোটোটাইপিং এবং ডেভেলপমেন্টের জন্য `ChipToken.sol` স্মার্ট কন্ট্র্যাক্ট কম্পাইল এবং স্থাপন করতে, রান করুন: + +```python +npx hardhat compile +npx hardhat run scripts/deploy.ts --network localnet +``` + +আউটপুটটি এইরকম দেখতে হবে: + +```python +ChipToken এখানে স্থাপন করা হয়েছে: 0xAb2A01BC351770D09611Ac80f1DE076D56E0487d +``` + +এখন আপনার স্থানীয় dApp-এর বিরুদ্ধে `simple.js` পরীক্ষাটি চালিয়ে চেষ্টা করুন এটি নিশ্চিত করতে যে আমাদের Blackjack dApp-এর প্রতিটি খেলোয়াড়ের জন্য 1000 মিন্ট করা হয়েছে: + +আউটপুটটি এইরকম দেখতে হবে: + +```python +npx hardhat test --network localnet +``` + +আউটপুটটি এইরকম দেখতে হবে: + +```python +ChipToken + mint + ✔ প্লেয়ার ওয়ানের জন্য 1000 চিপ মিন্ট করা উচিত + + 1 পাসিং (654ms) +``` + +### পর্যালোচনা {#review-dapp-workflows} + +এই মুহূর্তে, আপনি একটি dApp ডেভেলপমেন্ট পরিবেশ সেট আপ করেছেন, এটিকে Kurtosis দ্বারা তৈরি একটি স্থানীয় Ethereum নেটওয়ার্কের সাথে সংযুক্ত করেছেন, এবং আপনার dApp-এর বিরুদ্ধে একটি সহজ পরীক্ষা কম্পাইল, স্থাপন এবং চালিয়েছেন। + +এখন আসুন অন্বেষণ করা যাক কীভাবে আপনি বিভিন্ন নেটওয়ার্ক কনফিগারেশনের অধীনে আমাদের ডিএ্যাপস পরীক্ষা করার জন্য অন্তর্নিহিত নেটওয়ার্ক কনফিগার করতে পারেন। + +## স্থানীয় Ethereum টেস্টনেট কনফিগার করা {#configure-testnet} + +### ক্লায়েন্ট কনফিগারেশন এবং নোডের সংখ্যা পরিবর্তন করা {#configure-client-config-and-num-nodes} + +আপনার স্থানীয় Ethereum টেস্টনেটটি বিভিন্ন EL এবং CL ক্লায়েন্ট পেয়ার, সেইসাথে বিভিন্ন সংখ্যক নোড ব্যবহার করার জন্য কনফিগার করা যেতে পারে, যা আপনি যে পরিস্থিতি এবং নির্দিষ্ট নেটওয়ার্ক কনফিগারেশন ডেভেলপ বা পরীক্ষা করতে চান তার উপর নির্ভর করে। এর মানে হল যে, একবার সেট আপ হয়ে গেলে, আপনি একটি কাস্টমাইজড স্থানীয় টেস্টনেট চালু করতে পারেন এবং একই কর্মপ্রবাহ (স্থাপন, পরীক্ষা, ইত্যাদি) চালানোর জন্য এটি ব্যবহার করতে পারেন। সবকিছু প্রত্যাশিতভাবে কাজ করে তা নিশ্চিত করার জন্য বিভিন্ন নেটওয়ার্ক কনফিগারেশনের অধীনে। আপনি যে অন্যান্য প্যারামিটারগুলি পরিবর্তন করতে পারেন সে সম্পর্কে আরও জানতে, এই লিঙ্কটি দেখুন। + +একবার চেষ্টা করে দেখুন! আপনি একটি JSON ফাইলের মাধ্যমে `eth-network-package`-এ বিভিন্ন কনফিগারেশন বিকল্প পাস করতে পারেন। এই নেটওয়ার্ক প্যারামস JSON ফাইলটি নির্দিষ্ট কনফিগারেশন সরবরাহ করে যা Kurtosis স্থানীয় Ethereum নেটওয়ার্ক সেট আপ করতে ব্যবহার করবে। + +ডিফল্ট কনফিগারেশন ফাইলটি নিন এবং বিভিন্ন EL/CL পেয়ার সহ দুটি নোড চালু করতে এটি সম্পাদনা করুন: + +- নোড 1 `geth`/`lighthouse` সহ +- নোড 2 `geth`/`lodestar` সহ +- নোড 3 `geth`/`teku` সহ + +এই কনফিগারেশনটি আপনার dApp পরীক্ষা করার জন্য Ethereum নোড বাস্তবায়নের একটি ভিন্নধর্মী নেটওয়ার্ক তৈরি করে। আপনার কনফিগারেশন ফাইলটি এখন এইরকম দেখতে হবে: + +```yaml +{ + "participants": + [ + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "lighthouse", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null, + }, + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "lodestar", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null, + }, + { + "el_client_type": "geth", + "el_client_image": "", + "el_client_log_level": "", + "cl_client_type": "teku", + "cl_client_image": "", + "cl_client_log_level": "", + "beacon_extra_params": [], + "el_extra_params": [], + "validator_extra_params": [], + "builder_network_params": null, + }, + ], + "network_params": + { + "preregistered_validator_keys_mnemonic": "giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete", + "num_validator_keys_per_node": 64, + "network_id": "3151908", + "deposit_contract_address": "0x4242424242424242424242424242424242424242", + "seconds_per_slot": 12, + "genesis_delay": 120, + "capella_fork_epoch": 5, + }, +} +``` + +প্রতিটি `participants` স্ট্রাক্ট নেটওয়ার্কের একটি নোডের সাথে ম্যাপ করে, তাই 3টি `participants` স্ট্রাক্ট Kurtosis-কে আপনার নেটওয়ার্কে 3টি নোড চালু করতে বলবে। প্রতিটি `participants` স্ট্রাক্ট আপনাকে সেই নির্দিষ্ট নোডের জন্য ব্যবহৃত EL এবং CL পেয়ার নির্দিষ্ট করার অনুমতি দেবে। + +`network_params` স্ট্রাক্টটি নেটওয়ার্ক সেটিংস কনফিগার করে যা প্রতিটি নোডের জন্য জেনেসিস ফাইল তৈরি করতে ব্যবহৃত হয় এবং সেইসাথে নেটওয়ার্কের প্রতি স্লটে সেকেন্ডের মতো অন্যান্য সেটিংস। + +আপনার সম্পাদিত প্যারামস ফাইলটি আপনার ইচ্ছামত যেকোনো ডিরেক্টরিতে সংরক্ষণ করুন (নীচের উদাহরণে, এটি ডেস্কটপে সংরক্ষণ করা হয়েছে) এবং তারপর রান করে আপনার Kurtosis প্যাকেজ চালানোর জন্য এটি ব্যবহার করুন: + +```python +kurtosis clean -a && kurtosis run --enclave local-eth-testnet github.com/kurtosis-tech/eth-network-package "$(cat ~/eth-network-params.json)" +``` + +দ্রষ্টব্য: `kurtosis clean -a` কমান্ডটি এখানে Kurtosis-কে নতুন একটি শুরু করার আগে পুরানো টেস্টনেট এবং এর বিষয়বস্তু ধ্বংস করার নির্দেশ দেওয়ার জন্য ব্যবহৃত হয়। + +আবার, Kurtosis কিছুক্ষণ কাজ করবে এবং যে পৃথক পদক্ষেপগুলি ঘটছে তা প্রিন্ট করবে। অবশেষে, আউটপুটটি এইরকম দেখতে হবে: + +```python +Starlark code successfully run. No output was returned. +INFO[2023-04-07T11:43:16-04:00] ========================================================== +INFO[2023-04-07T11:43:16-04:00] || Created enclave: local-eth-testnet || +INFO[2023-04-07T11:43:16-04:00] ========================================================== +Name: local-eth-testnet +UUID: bef8c192008e +Status: RUNNING +Creation Time: Fri, 07 Apr 2023 11:41:58 EDT + +========================================= Files Artifacts ========================================= +UUID Name +cc495a8e364a cl-genesis-data +7033fcdb5471 el-genesis-data +a3aef43fc738 genesis-generation-config-cl +8e968005fc9d genesis-generation-config-el +3182cca9d3cd geth-prefunded-keys +8421166e234f prysm-password +d9e6e8d44d99 validator-keystore-0 +23f5ba517394 validator-keystore-1 +4d28dea40b5c validator-keystore-2 + +========================================== User Services ========================================== +UUID Name Ports Status +485e6fde55ae cl-client-0-beacon http: 4000/tcp -> http://127.0.0.1:65010 RUNNING + metrics: 5054/tcp -> http://127.0.0.1:65011 + tcp-discovery: 9000/tcp -> 127.0.0.1:65012 + udp-discovery: 9000/udp -> 127.0.0.1:54455 +73739bd158b2 cl-client-0-validator http: 5042/tcp -> 127.0.0.1:65016 RUNNING + metrics: 5064/tcp -> http://127.0.0.1:65017 +1b0a233cd011 cl-client-1-beacon http: 4000/tcp -> 127.0.0.1:65021 RUNNING + metrics: 8008/tcp -> 127.0.0.1:65023 + tcp-discovery: 9000/tcp -> 127.0.0.1:65024 + udp-discovery: 9000/udp -> 127.0.0.1:56031 + validator-metrics: 5064/tcp -> 127.0.0.1:65022 +949b8220cd53 cl-client-1-validator http: 4000/tcp -> 127.0.0.1:65028 RUNNING + metrics: 8008/tcp -> 127.0.0.1:65030 + tcp-discovery: 9000/tcp -> 127.0.0.1:65031 + udp-discovery: 9000/udp -> 127.0.0.1:60784 + validator-metrics: 5064/tcp -> 127.0.0.1:65029 +c34417bea5fa cl-client-2 http: 4000/tcp -> 127.0.0.1:65037 RUNNING + metrics: 8008/tcp -> 127.0.0.1:65035 + tcp-discovery: 9000/tcp -> 127.0.0.1:65036 + udp-discovery: 9000/udp -> 127.0.0.1:63581 +e19738e6329d el-client-0 engine-rpc: 8551/tcp -> 127.0.0.1:64986 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64988 + tcp-discovery: 30303/tcp -> 127.0.0.1:64987 + udp-discovery: 30303/udp -> 127.0.0.1:55706 + ws: 8546/tcp -> 127.0.0.1:64989 +e904687449d9 el-client-1 engine-rpc: 8551/tcp -> 127.0.0.1:64993 RUNNING + rpc: 8545/tcp -> 127.0.0.1:64995 + tcp-discovery: 30303/tcp -> 127.0.0.1:64994 + udp-discovery: 30303/udp -> 127.0.0.1:58096 + ws: 8546/tcp -> 127.0.0.1:64996 +ad6f401126fa el-client-2 engine-rpc: 8551/tcp -> 127.0.0.1:65003 RUNNING + rpc: 8545/tcp -> 127.0.0.1:65001 + tcp-discovery: 30303/tcp -> 127.0.0.1:65000 + udp-discovery: 30303/udp -> 127.0.0.1:57269 + ws: 8546/tcp -> 127.0.0.1:65002 +12d04a9dbb69 prelaunch-data-generator-1680882122181135513 STOPPED +5b45f9c0504b prelaunch-data-generator-1680882122192182847 STOPPED +3d4aaa75e218 prelaunch-data-generator-1680882122201668972 STOPPED +``` + +অভিনন্দন! আপনি সফলভাবে আপনার স্থানীয় টেস্টনেটকে 1টির পরিবর্তে 3টি নোড থাকার জন্য কনফিগার করেছেন। আপনার dApp-এর বিরুদ্ধে (স্থাপন ও পরীক্ষা) আপনি আগে যে কর্মপ্রবাহগুলি করেছিলেন তা চালাতে, আপনার `hardhat.config.ts` কনফিগারেশন ফাইলের `localnet` স্ট্রাক্টে `<$YOUR_PORT>`-কে আপনার নতুন, 3-নোড স্থানীয় টেস্টনেটের যেকোনো `el-client-` পরিষেবা থেকে rpc uri আউটপুটের পোর্ট দিয়ে প্রতিস্থাপন করে আমরা আগে যে একই অপারেশনগুলি করেছিলাম তা সম্পাদন করুন। + +## উপসংহার {#conclusion} + +এবং এটাই সব! এই সংক্ষিপ্ত গাইডটি সংক্ষেপে বলতে গেলে, আপনি: + +- Kurtosis ব্যবহার করে Docker-এর উপর একটি স্থানীয় Ethereum টেস্টনেট তৈরি করেছেন +- আপনার স্থানীয় dApp ডেভেলপমেন্ট পরিবেশকে স্থানীয় Ethereum নেটওয়ার্কের সাথে সংযুক্ত করেছেন +- স্থানীয় Ethereum নেটওয়ার্কে একটি dApp স্থাপন করেছেন এবং এর বিরুদ্ধে একটি সহজ পরীক্ষা চালিয়েছেন +- অন্তর্নিহিত Ethereum নেটওয়ার্ককে 3টি নোড থাকার জন্য কনফিগার করেছেন + +আপনার জন্য কী ভালো হয়েছে, কী উন্নত করা যেতে পারে, বা আপনার যেকোনো প্রশ্নের উত্তর দিতে আমরা আপনার কাছ থেকে শুনতে আগ্রহী। [GitHub](https://github.com/kurtosis-tech/kurtosis/issues/new/choose)-এর মাধ্যমে যোগাযোগ করতে বা [আমাদের ইমেল করতে](mailto:feedback@kurtosistech.com) দ্বিধা করবেন না! + +### অন্যান্য উদাহরণ এবং গাইড {#other-examples-guides} + +আমরা আপনাকে আমাদের [কুইকস্টার্ট](https://docs.kurtosis.com/quickstart) (যেখানে আপনি একটি Postgres ডাটাবেস এবং এর উপরে API তৈরি করবেন) এবং আমাদের [awesome-kurtosis রিপোজিটরি](https://github.com/kurtosis-tech/awesome-kurtosis)-তে আমাদের অন্যান্য উদাহরণগুলি দেখতে উৎসাহিত করি যেখানে আপনি প্যাকেজ সহ কিছু দুর্দান্ত উদাহরণ পাবেন: + +- [একই স্থানীয় Ethereum টেস্টনেট চালু করা](https://github.com/kurtosis-tech/eth2-package), কিন্তু অতিরিক্ত পরিষেবা সংযুক্ত সহ যেমন একটি লেনদেন স্প্যামার (লেনদেন সিমুলেট করতে), একটি ফর্ক মনিটর, এবং একটি সংযুক্ত Grafana এবং Prometheus ইনস্ট্যান্স +- একই স্থানীয় Ethereum নেটওয়ার্কের বিরুদ্ধে একটি [সাব-নেটওয়ার্কিং পরীক্ষা](https://github.com/kurtosis-tech/awesome-kurtosis/tree/main/ethereum-network-partition-test) সম্পাদন করা diff --git a/public/content/translations/bn/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md b/public/content/translations/bn/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md new file mode 100644 index 00000000000..69e0a5c7c00 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/downsizing-contracts-to-fight-the-contract-size-limit/index.md @@ -0,0 +1,144 @@ +--- +title: "কন্ট্র্যাক্টের আকারের সীমাবদ্ধতার বিরুদ্ধে লড়তে কন্ট্র্যাক্টের আকার কমানো" +description: "আপনার স্মার্ট কন্ট্র্যাক্টগুলোকে খুব বড় হয়ে যাওয়া থেকে আটকাতে আপনি কি করতে পারেন?" +author: Markus Waas +lang: bn +tags: [ "সলিডিটি", "স্মার্ট কন্ট্র্যাক্ট", "সংগ্রহস্থল" ] +skill: intermediate +published: 2020-06-26 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/max-contract-size +--- + +## একটি সীমা কেন আছে? {#why-is-there-a-limit} + +[নভেম্বর 22, 2016](https://blog.ethereum.org/2016/11/18/hard-fork-no-4-spurious-dragon/) তারিখে Spurious Dragon হার্ড-ফর্ক [EIP-170](https://eips.ethereum.org/EIPS/eip-170) চালু করে, যা 24.576 kb এর একটি স্মার্ট কন্ট্র্যাক্ট আকারের সীমা যোগ করে। একজন Solidity ডেভেলপার হিসেবে আপনার জন্য এর মানে হল যে যখন আপনি আপনার কন্ট্র্যাক্টে আরও বেশি করে ফাংশনালিটি যোগ করবেন, কোনো এক সময়ে আপনি সীমাতে পৌঁছে যাবেন এবং ডিপ্লয় করার সময় এই ত্রুটিটি দেখতে পাবেন: + +`সতর্কতা: কন্ট্র্যাক্টের কোডের আকার 24576 বাইট অতিক্রম করেছে (Spurious Dragon-এ একটি সীমা চালু করা হয়েছে)। এই কন্ট্র্যাক্টটি মেইননেটে ডিপ্লয়যোগ্য নাও হতে পারে। অপ্টিমাইজার সক্রিয় করার কথা বিবেচনা করুন (কম "রান" মান সহ!), রিভার্ট স্ট্রিংগুলি বন্ধ করুন, বা লাইব্রেরি ব্যবহার করুন।` + +এই সীমাটি ডিনায়াল-অফ-সার্ভিস (DOS) আক্রমণ প্রতিরোধ করার জন্য চালু করা হয়েছিল। একটি কন্ট্র্যাক্টে যেকোনো কল গ্যাসের দিক থেকে তুলনামূলকভাবে সস্তা। তবে, Ethereum নোডগুলোর জন্য একটি কন্ট্র্যাক্ট কলের প্রভাব কল করা কন্ট্র্যাক্টের কোডের আকারের উপর নির্ভর করে অসামঞ্জস্যপূর্ণভাবে বৃদ্ধি পায় (ডিস্ক থেকে কোড পড়া, কোড প্রি-প্রসেস করা, Merkle প্রুফে ডেটা যোগ করা)। যখনই আপনার এমন পরিস্থিতি থাকে যেখানে আক্রমণকারীকে অন্যদের জন্য অনেক কাজ তৈরি করার জন্য অল্প রিসোর্স প্রয়োজন হয়, তখন DOS আক্রমণের সম্ভাবনা তৈরি হয়। + +মূলত এটি তেমন কোনো সমস্যা ছিল না কারণ একটি স্বাভাবিক কন্ট্র্যাক্টের আকারের সীমা হলো ব্লক গ্যাস লিমিট। স্বাভাবিকভাবেই, একটি কন্ট্র্যাক্টকে এমন একটি ট্রানজ্যাকশনের মধ্যে ডিপ্লয় করতে হবে যা কন্ট্র্যাক্টের সমস্ত বাইটকোড ধারণ করে। আপনি যদি একটি ব্লকে শুধুমাত্র সেই একটি ট্রানজ্যাকশন অন্তর্ভুক্ত করেন, তবে আপনি সেই সমস্ত গ্যাস ব্যবহার করতে পারবেন, কিন্তু এটি অসীম নয়। [লন্ডন আপগ্রেডের](/ethereum-forks/#london) পর থেকে, ব্লক গ্যাস লিমিট নেটওয়ার্কের চাহিদার উপর নির্ভর করে 15M থেকে 30M ইউনিটের মধ্যে পরিবর্তিত হতে সক্ষম হয়েছে। + +এর পরে আমরা তাদের সম্ভাব্য প্রভাব অনুসারে সাজানো কিছু পদ্ধতি দেখব। এটিকে ওজন কমানোর দিক থেকে ভাবুন। কারো জন্য তাদের লক্ষ্য ওজন (আমাদের ক্ষেত্রে 24kb) অর্জনের সেরা কৌশল হল প্রথমে বড় প্রভাবযুক্ত পদ্ধতিগুলিতে মনোযোগ দেওয়া। বেশিরভাগ ক্ষেত্রে শুধুমাত্র আপনার খাদ্যাভ্যাস ঠিক করলেই আপনি সেখানে পৌঁছে যাবেন, কিন্তু কখনও কখনও আপনার আরও কিছু প্রয়োজন হয়। তারপরে আপনি কিছু ব্যায়াম (মাঝারি প্রভাব) বা এমনকি পরিপূরক (ছোট প্রভাব) যোগ করতে পারেন। + +## বড় প্রভাব {#big-impact} + +### আপনার কন্ট্র্যাক্টগুলো আলাদা করুন {#separate-your-contracts} + +এটি সর্বদা আপনার প্রথম পদক্ষেপ হওয়া উচিত। আপনি কীভাবে কন্ট্র্যাক্টটিকে একাধিক ছোট কন্ট্র্যাক্টে বিভক্ত করতে পারেন? এটি সাধারণত আপনাকে আপনার কন্ট্র্যাক্টগুলোর জন্য একটি ভাল আর্কিটেকচার তৈরি করতে বাধ্য করে। কোড পাঠযোগ্যতার দৃষ্টিকোণ থেকে ছোট কন্ট্র্যাক্টগুলো সর্বদা পছন্দনীয়। কন্ট্র্যাক্ট বিভক্ত করার জন্য, নিজেকে জিজ্ঞাসা করুন: + +- কোন ফাংশনগুলো একসাথে সম্পর্কিত? প্রতিটি ফাংশন সেট তার নিজস্ব কন্ট্র্যাক্টে সবচেয়ে ভালো হতে পারে। +- কোন ফাংশনগুলোর জন্য কন্ট্র্যাক্টের স্টেট বা স্টেটের একটি নির্দিষ্ট সাবসেট পড়ার প্রয়োজন নেই? +- আপনি কি সংগ্রহস্থল এবং ফাংশনালিটি বিভক্ত করতে পারেন? + +### লাইব্রেরি {#libraries} + +সংগ্রহস্থল থেকে ফাংশনালিটি কোড সরানোর একটি সহজ উপায় হল একটি [লাইব্রেরি](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#libraries) ব্যবহার করা। লাইব্রেরি ফাংশনগুলিকে ইন্টারনাল হিসাবে ঘোষণা করবেন না কারণ সেগুলি কম্পাইলেশনের সময় সরাসরি [কন্ট্র্যাক্টে যোগ করা হবে](https://ethereum.stackexchange.com/questions/12975/are-internal-functions-in-libraries-not-covered-by-linking)। কিন্তু আপনি যদি পাবলিক ফাংশন ব্যবহার করেন, তবে সেগুলি আসলে একটি পৃথক লাইব্রেরি কন্ট্র্যাক্টে থাকবে। লাইব্রেরির ব্যবহার আরও সুবিধাজনক করতে [using for](https://solidity.readthedocs.io/en/v0.6.10/contracts.html#using-for) ব্যবহার করার কথা বিবেচনা করুন। + +### প্রক্সি {#proxies} + +একটি আরও উন্নত কৌশল হবে একটি প্রক্সি সিস্টেম। লাইব্রেরিগুলো ব্যাকগ্রাউন্ডে `DELEGATECALL` ব্যবহার করে যা কেবল কলিং কন্ট্র্যাক্টের স্টেট দিয়ে অন্য একটি কন্ট্র্যাক্টের ফাংশন কার্যকর করে। প্রক্সি সিস্টেম সম্পর্কে আরও জানতে [এই ব্লগ পোস্টটি](https://hackernoon.com/how-to-make-smart-contracts-upgradable-2612e771d5a2) দেখুন। তারা আপনাকে আরও ফাংশনালিটি দেয়, যেমন, তারা আপগ্রেডযোগ্যতা সক্ষম করে, কিন্তু তারা অনেক জটিলতাও যোগ করে। আমি কেবল কন্ট্র্যাক্টের আকার কমানোর জন্য এগুলি যোগ করব না যদি না এটি যেকোনো কারণেই আপনার একমাত্র বিকল্প হয়। + +## মাঝারি প্রভাব {#medium-impact} + +### ফাংশনগুলি সরান {#remove-functions} + +এটি স্পষ্ট হওয়া উচিত। ফাংশন একটি কন্ট্র্যাক্টের আকার বেশ কিছুটা বাড়িয়ে দেয়। + +- **এক্সটার্নাল**: প্রায়শই আমরা সুবিধার জন্য অনেক ভিউ ফাংশন যোগ করি। যতক্ষণ না আপনি আকারের সীমাতে পৌঁছান ততক্ষণ এটি ঠিক আছে। তখন আপনি একেবারে অপরিহার্য ফাংশনগুলো ছাড়া বাকি সবগুলি সরানোর কথা ভাবতে পারেন। +- **ইন্টারনাল**: আপনি ইন্টারনাল/প্রাইভেট ফাংশনগুলিও সরাতে পারেন এবং যতক্ষণ ফাংশনটি কেবল একবার কল করা হয় ততক্ষণ কোডটি কেবল ইনলাইন করতে পারেন। + +### অতিরিক্ত ভেরিয়েবল এড়িয়ে চলুন {#avoid-additional-variables} + +```solidity +function get(uint id) returns (address,address) { + MyStruct memory myStruct = myStructs[id]; + return (myStruct.addr1, myStruct.addr2); +} +``` + +```solidity +function get(uint id) returns (address,address) { + return (myStructs[id].addr1, myStructs[id].addr2); +} +``` + +এইরকম একটি সাধারণ পরিবর্তনে **0.28kb** এর পার্থক্য তৈরি হয়। সম্ভবত আপনি আপনার কন্ট্র্যাক্টগুলোতে অনেক একই রকম পরিস্থিতি খুঁজে পেতে পারেন এবং সেগুলি সত্যিই একটি উল্লেখযোগ্য পরিমাণে যোগ হতে পারে। + +### ত্রুটির মেসেজ ছোট করুন {#shorten-error-message} + +দীর্ঘ রিভার্ট মেসেজ এবং বিশেষ করে অনেক ভিন্ন রিভার্ট মেসেজ কন্ট্র্যাক্টকে ফুলিয়ে তুলতে পারে। এর পরিবর্তে সংক্ষিপ্ত ত্রুটির কোড ব্যবহার করুন এবং আপনার কন্ট্র্যাক্টে সেগুলি ডিকোড করুন। একটি দীর্ঘ মেসেজ অনেক ছোট হতে পারে: + +```solidity +require(msg.sender == owner, "শুধুমাত্র এই কন্ট্র্যাক্টের মালিকই এই ফাংশনটি কল করতে পারবেন"); +``` + +```solidity +require(msg.sender == owner, "OW1"); +``` + +### ত্রুটির মেসেজের পরিবর্তে কাস্টম ত্রুটি ব্যবহার করুন + +কাস্টম ত্রুটি [Solidity 0.8.4](https://blog.soliditylang.org/2021/04/21/custom-errors/)-এ চালু করা হয়েছে। এগুলি আপনার কন্ট্র্যাক্টের আকার কমানোর একটি দুর্দান্ত উপায়, কারণ এগুলি সিলেক্টর হিসাবে ABI-এনকোডেড (ঠিক যেমন ফাংশনগুলো হয়)। + +```solidity +error Unauthorized(); + +if (msg.sender != owner) { + revert Unauthorized(); +} +``` + +### অপ্টিমাইজারে একটি কম রান ভ্যালু বিবেচনা করুন {#consider-a-low-run-value-in-the-optimizer} + +আপনি অপ্টিমাইজার সেটিংসও পরিবর্তন করতে পারেন। 200 এর ডিফল্ট মানটির অর্থ হল এটি বাইটকোডকে এমনভাবে অপ্টিমাইজ করার চেষ্টা করছে যেন একটি ফাংশন 200 বার কল করা হয়েছে। আপনি যদি এটিকে 1-এ পরিবর্তন করেন, তবে আপনি মূলত অপ্টিমাইজারকে প্রতিটি ফাংশন শুধুমাত্র একবার চালানোর জন্য অপ্টিমাইজ করতে বলছেন। শুধুমাত্র একবার চালানোর জন্য একটি অপ্টিমাইজ করা ফাংশনের অর্থ হল এটি ডিপ্লয়মেন্টের জন্যই অপ্টিমাইজ করা হয়েছে। সচেতন থাকুন যে **এটি ফাংশনগুলি চালানোর জন্য [গ্যাসের খরচ](/developers/docs/gas/) বাড়িয়ে দেয়**, তাই আপনি এটি করতে নাও চাইতে পারেন। + +## ছোট প্রভাব {#small-impact} + +### ফাংশনে স্ট্রাকট পাস করা এড়িয়ে চলুন {#avoid-passing-structs-to-functions} + +আপনি যদি [ABIEncoderV2](https://solidity.readthedocs.io/en/v0.6.10/layout-of-source-files.html#abiencoderv2) ব্যবহার করেন, তাহলে এটি একটি ফাংশনে স্ট্রাকট পাস না করতে সাহায্য করতে পারে। প্যারামিটারটিকে স্ট্রাকট হিসাবে পাস করার পরিবর্তে, প্রয়োজনীয় প্যারামিটারগুলি সরাসরি পাস করুন। এই উদাহরণে আমরা আরও **0.1kb** সাশ্রয় করেছি। + +```solidity +function get(uint id) returns (address,address) { + return _get(myStruct); +} + +function _get(MyStruct memory myStruct) private view returns(address,address) { + return (myStruct.addr1, myStruct.addr2); +} +``` + +```solidity +function get(uint id) returns(address,address) { + return _get(myStructs[id].addr1, myStructs[id].addr2); +} + +function _get(address addr1, address addr2) private view returns(address,address) { + return (addr1, addr2); +} +``` + +### ফাংশন এবং ভেরিয়েবলের জন্য সঠিক ভিজিবিলিটি ঘোষণা করুন {#declare-correct-visibility-for-functions-and-variables} + +- ফাংশন বা ভেরিয়েবল যা শুধুমাত্র বাইরে থেকে কল করা হয়? `public` এর পরিবর্তে সেগুলোকে `external` হিসাবে ঘোষণা করুন। +- ফাংশন বা ভেরিয়েবল যা শুধুমাত্র কন্ট্র্যাক্টের মধ্যে থেকে কল করা হয়? `public` এর পরিবর্তে সেগুলোকে `private` বা `internal` হিসাবে ঘোষণা করুন। + +### মডিফায়ারগুলি সরান {#remove-modifiers} + +মডিফায়ার, বিশেষ করে যখন নিবিড়ভাবে ব্যবহার করা হয়, তখন কন্ট্র্যাক্টের আকারে একটি উল্লেখযোগ্য প্রভাব ফেলতে পারে। সেগুলি সরানোর কথা বিবেচনা করুন এবং পরিবর্তে ফাংশন ব্যবহার করুন। + +```solidity +modifier checkStuff() {} + +function doSomething() checkStuff {} +``` + +```solidity +function checkStuff() private {} + +function doSomething() { checkStuff(); } +``` + +এই টিপসগুলো আপনাকে কন্ট্র্যাক্টের আকার উল্লেখযোগ্যভাবে কমাতে সাহায্য করবে। আবারও, আমি যথেষ্ট জোর দিয়ে বলতে পারি না, সবচেয়ে বড় প্রভাবের জন্য সম্ভব হলে সর্বদা কন্ট্র্যাক্ট বিভক্ত করার দিকে মনোনিবেশ করুন। diff --git a/public/content/translations/bn/developers/tutorials/eip-1271-smart-contract-signatures/index.md b/public/content/translations/bn/developers/tutorials/eip-1271-smart-contract-signatures/index.md new file mode 100644 index 00000000000..1a9da42f184 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/eip-1271-smart-contract-signatures/index.md @@ -0,0 +1,107 @@ +--- +title: "EIP-1271: স্মার্ট কন্ট্র্যাক্ট স্বাক্ষর করা এবং যাচাই করা" +description: "EIP-1271 সহ স্মার্ট কন্ট্র্যাক্ট স্বাক্ষর তৈরি এবং যাচাইকরণের একটি সংক্ষিপ্ত বিবরণ। আমরা Safe (পূর্বে Gnosis Safe) এ ব্যবহৃত EIP-1271 ইমপ্লিমেন্টেশন নিয়েও আলোচনা করব যাতে স্মার্ট কন্ট্র্যাক্ট ডেভেলপারদের জন্য একটি সুনির্দিষ্ট উদাহরণ দেওয়া যায়।" +author: Nathan H. Leung +lang: bn +tags: + [ + "eip-1271", + "স্মার্ট কন্ট্র্যাক্ট", + "যাচাইকরণ", + "স্বাক্ষর করা" + ] +skill: intermediate +published: 2023-01-12 +--- + +[EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) স্ট্যান্ডার্ড স্মার্ট কন্ট্র্যাক্টকে স্বাক্ষর যাচাই করার অনুমতি দেয়। + +এই টিউটোরিয়ালে, আমরা ডিজিটাল স্বাক্ষর, EIP-1271-এর প্রেক্ষাপট এবং [Safe](https://safe.global/) (পূর্বে Gnosis Safe) দ্বারা ব্যবহৃত EIP-1271-এর নির্দিষ্ট ইমপ্লিমেন্টেশন সম্পর্কে একটি সংক্ষিপ্ত বিবরণ দেব। সব মিলিয়ে, এটি আপনার নিজের কন্ট্র্যাক্টে EIP-1271 প্রয়োগ করার জন্য একটি সূচনা বিন্দু হিসাবে কাজ করতে পারে। + +## স্বাক্ষর কী? + +এই প্রসঙ্গে, একটি স্বাক্ষর (আরও স্পষ্টভাবে, একটি “ডিজিটাল স্বাক্ষর”) হল একটি বার্তা এবং তার সাথে এক ধরনের প্রমাণ যে বার্তাটি একটি নির্দিষ্ট ব্যক্তি/প্রেরক/অ্যাড্রেস থেকে এসেছে। + +উদাহরণস্বরূপ, একটি ডিজিটাল স্বাক্ষর এইরকম দেখতে হতে পারে: + +1. বার্তা: “আমি আমার ইথেরিয়াম ওয়ালেট দিয়ে এই ওয়েবসাইটে লগ ইন করতে চাই।” +2. স্বাক্ষরকারী: আমার অ্যাড্রেস হল `0x000…` +3. প্রমাণ: এখানে কিছু প্রমাণ দেওয়া হল যে আমি, `0x000…`, আসলে এই সম্পূর্ণ বার্তাটি তৈরি করেছি (এটি সাধারণত ক্রিপ্টোগ্রাফিক কিছু)। + +এটা মনে রাখা জরুরি যে একটি ডিজিটাল স্বাক্ষরের মধ্যে একটি “বার্তা” এবং একটি “স্বাক্ষর” দুটোই থাকে। + +কেন? উদাহরণস্বরূপ, যদি আপনি আমাকে স্বাক্ষর করার জন্য একটি চুক্তি দেন, এবং তারপর আমি স্বাক্ষরের পৃষ্ঠাটি কেটে ফেলি এবং চুক্তির বাকি অংশ ছাড়া শুধুমাত্র আমার স্বাক্ষরগুলি আপনাকে ফিরিয়ে দিই, তবে চুক্তিটি বৈধ হবে না। + +একইভাবে, একটি সংশ্লিষ্ট বার্তা ছাড়া একটি ডিজিটাল স্বাক্ষরের কোনো অর্থ হয় না! + +## EIP-1271 কেন বিদ্যমান? + +Ethereum-ভিত্তিক ব্লকচেইনে ব্যবহারের জন্য একটি ডিজিটাল স্বাক্ষর তৈরি করতে, আপনার সাধারণত একটি গোপন প্রাইভেট কী প্রয়োজন যা অন্য কেউ জানে না। এটাই আপনার স্বাক্ষরকে, আপনার করে তোলে (গোপন কী না জেনে অন্য কেউ একই স্বাক্ষর তৈরি করতে পারে না)। + +আপনার ইথেরিয়াম অ্যাকাউন্টের (অর্থাৎ, আপনার এক্সটারনালি-ওনড অ্যাকাউন্ট/EOA) সাথে একটি প্রাইভেট কী যুক্ত আছে এবং এই প্রাইভেট কী সাধারণত তখনই ব্যবহৃত হয় যখন কোনো ওয়েবসাইট বা ডিএ্যাপ আপনাকে স্বাক্ষরের জন্য জিজ্ঞাসা করে (যেমন, “ইথেরিয়াম দিয়ে লগইন করুন”)। + +একটি অ্যাপ ethers.js-এর মতো একটি থার্ড-পার্টি লাইব্রেরি ব্যবহার করে আপনার তৈরি করা [একটি স্বাক্ষর যাচাই করতে পারে](https://www.alchemy.com/docs/how-to-verify-a-message-signature-on-ethereum) [আপনার প্রাইভেট কী না জেনেই](https://en.wikipedia.org/wiki/Public-key_cryptography) এবং নিশ্চিত হতে পারে যে _আপনিই_ সেই স্বাক্ষরটি তৈরি করেছেন। + +> আসলে, যেহেতু EOA ডিজিটাল স্বাক্ষর পাবলিক-কী ক্রিপ্টোগ্রাফি ব্যবহার করে, তাই সেগুলি **অফচেইন** তৈরি এবং যাচাই করা যেতে পারে! এইভাবেই গ্যাস-বিহীন DAO ভোটিং কাজ করে — অনচেইনে ভোট জমা দেওয়ার পরিবর্তে, ক্রিপ্টোগ্রাফিক লাইব্রেরি ব্যবহার করে ডিজিটাল স্বাক্ষর অফচেইনে তৈরি এবং যাচাই করা যেতে পারে। + +যেখানে EOA অ্যাকাউন্টে একটি প্রাইভেট কী থাকে, সেখানে স্মার্ট কন্ট্র্যাক্ট অ্যাকাউন্টে কোনো ধরনের প্রাইভেট বা গোপন কী থাকে না (তাই "ইথেরিয়াম দিয়ে লগইন করুন", ইত্যাদি স্মার্ট কন্ট্র্যাক্ট অ্যাকাউন্টের সাথে স্বাভাবিকভাবে কাজ করতে পারে না)। + +EIP-1271 যে সমস্যার সমাধান করার লক্ষ্য রাখে: আমরা কীভাবে বলতে পারি যে একটি স্মার্ট কন্ট্র্যাক্ট স্বাক্ষর বৈধ যদি স্মার্ট কন্ট্র্যাক্টের এমন কোনো “গোপন” তথ্য না থাকে যা এটি স্বাক্ষরে অন্তর্ভুক্ত করতে পারে? + +## EIP-1271 কীভাবে কাজ করে? + +স্মার্ট কন্ট্র্যাক্টে এমন কোনো প্রাইভেট কী নেই যা বার্তা স্বাক্ষর করতে ব্যবহার করা যেতে পারে। তাহলে আমরা কীভাবে বলতে পারি যে একটি স্বাক্ষর আসল কিনা? + +আচ্ছা, একটি ধারণা হল যে আমরা শুধু স্মার্ট কন্ট্র্যাক্টকেই _জিজ্ঞাসা_ করতে পারি যে একটি স্বাক্ষর আসল কিনা! + +EIP-1271 যা করে তা হল, একটি প্রদত্ত স্বাক্ষর বৈধ কিনা তা একটি স্মার্ট কন্ট্র্যাক্টকে “জিজ্ঞাসা” করার এই ধারণাটিকে এটি মানসম্মত করে। + +EIP-1271 প্রয়োগকারী একটি কন্ট্র্যাক্টে `isValidSignature` নামে একটি ফাংশন থাকতে হবে যা একটি বার্তা এবং একটি স্বাক্ষর ইনপুট হিসেবে নেয়। কন্ট্র্যাক্টটি তখন কিছু যাচাইকরণ লজিক চালাতে পারে (স্পেক এখানে নির্দিষ্ট কিছু প্রয়োগ করে না) এবং তারপর স্বাক্ষরটি বৈধ কিনা তা নির্দেশ করে একটি মান ফিরিয়ে দিতে পারে। + +যদি `isValidSignature` একটি বৈধ ফলাফল প্রদান করে, তবে সেটা অনেকটা কন্ট্র্যাক্টের বলার মতোই, “হ্যাঁ, আমি এই স্বাক্ষর + বার্তা অনুমোদন করছি!” + +### ইন্টারফেস + +EIP-1271 স্পেকে সঠিক ইন্টারফেসটি এখানে দেওয়া হলো (আমরা নীচে `_hash` প্যারামিটার সম্পর্কে কথা বলব, কিন্তু আপাতত, এটিকে সেই বার্তা হিসাবে ভাবুন যা যাচাই করা হচ্ছে): + +```jsx +pragma solidity ^0.5.0;\n\ncontract ERC1271 {\n\n // বাইট4(keccak256(\"isValidSignature(bytes32,bytes)\"))\n bytes4 constant internal MAGICVALUE = 0x1626ba7e;\n\n /**\n * @dev প্রদত্ত হ্যাশের জন্য প্রদত্ত স্বাক্ষরটি বৈধ কিনা তা ফেরানো উচিত\n * @param _hash স্বাক্ষর করার ডেটার হ্যাস\n * @param _signature _hash-এর সাথে যুক্ত স্বাক্ষর বাইট অ্যারে\n *\n * ফাংশন পাস হলে অবশ্যই বাইট4 ম্যাজিক ভ্যালু 0x1626ba7e ফেরাতে হবে।\n * অবশ্যই স্টেট পরিবর্তন করা যাবে না (solc < 0.5 এর জন্য STATICCALL ব্যবহার করে, solc > 0.5 এর জন্য view মডিফায়ার ব্যবহার করে)\n * এক্সটারনাল কলের অনুমতি দিতে হবে\n */\n function isValidSignature(\n bytes32 _hash,\n bytes memory _signature)\n public\n view\n returns (bytes4 magicValue);\n} +``` + +## উদাহরণ EIP-1271 ইমপ্লিমেন্টেশন: Safe + +কন্ট্র্যাক্টগুলি অনেক উপায়ে `isValidSignature` প্রয়োগ করতে পারে — স্পেকটি সঠিক ইমপ্লিমেন্টেশন সম্পর্কে খুব বেশি কিছু বলে না। + +EIP-1271 প্রয়োগকারী একটি উল্লেখযোগ্য কন্ট্র্যাক্ট হল Safe (পূর্বে Gnosis Safe)। + +Safe-এর কোডে, `isValidSignature` [বাস্তবায়ন করা হয়েছে](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol) যাতে [দুটি উপায়ে](https://ethereum.stackexchange.com/questions/122635/signing-messages-as-a-gnosis-safe-eip1271-support) স্বাক্ষর তৈরি এবং যাচাই করা যায়: + +1. অনচেইন বার্তা + 1. তৈরি: একজন সেফ মালিক একটি বার্তাকে “স্বাক্ষর” করার জন্য একটি নতুন সেফ লেনদেন তৈরি করেন, এবং লেনদেনে ডেটা হিসাবে বার্তাটি পাস করেন। মাল্টিসিগ থ্রেশহোল্ডে পৌঁছানোর জন্য পর্যাপ্ত মালিকরা লেনদেনটিতে স্বাক্ষর করার পরে, লেনদেনটি ব্রডকাস্ট এবং রান করা হয়। লেনদেনটিতে, (`signMessage(bytes calldata _data)`) নামে একটি সেফ ফাংশন রয়েছে যা বার্তাটিকে “অনুমোদিত” বার্তার তালিকায় যুক্ত করে। + 2. যাচাইকরণ: Safe কন্ট্র্যাক্টে `isValidSignature` কল করুন, এবং বার্তা প্যারামিটার হিসেবে যাচাই করার জন্য বার্তাটি পাস করুন এবং [স্বাক্ষর প্যারামিটারের জন্য একটি খালি মান](https://github.com/safe-global/safe-contracts/blob/main/contracts/handler/CompatibilityFallbackHandler.sol#L32) (অর্থাৎ, `0x`) পাস করুন। Safe দেখবে যে স্বাক্ষর প্যারামিটারটি খালি এবং স্বাক্ষরটি ক্রিপ্টোগ্রাফিকভাবে যাচাই করার পরিবর্তে, এটি কেবল এগিয়ে গিয়ে পরীক্ষা করবে যে বার্তাটি “অনুমোদিত” বার্তার তালিকায় আছে কিনা। +2. অফচেইন বার্তা: + 1. তৈরি: একজন সেফ মালিক অফচেইনে একটি বার্তা তৈরি করে, তারপর অন্য সেফ মালিকদের দিয়ে বার্তাটি পৃথকভাবে স্বাক্ষর করায় যতক্ষণ না মাল্টিসিগ অনুমোদনের থ্রেশহোল্ড অতিক্রম করার জন্য পর্যাপ্ত স্বাক্ষর হয়। + 2. যাচাইকরণ: `isValidSignature` কল করুন। বার্তা প্যারামিটারে, যাচাই করার জন্য বার্তাটি পাস করুন। স্বাক্ষর প্যারামিটারে, প্রতিটি সেফ মালিকের স্বতন্ত্র স্বাক্ষরগুলি পরপর একসাথে সংযুক্ত করে পাস করুন। Safe পরীক্ষা করবে যে থ্রেশহোল্ড পূরণ করার জন্য পর্যাপ্ত স্বাক্ষর আছে কিনা **এবং** প্রতিটি স্বাক্ষর বৈধ কিনা। যদি তাই হয়, এটি সফল স্বাক্ষর যাচাইকরণ নির্দেশ করে একটি মান ফিরিয়ে দেবে। + +## `_hash` প্যারামিটারটি আসলে কী? পুরো বার্তাটি কেন পাস করা হয় না? + +আপনি হয়তো লক্ষ্য করেছেন যে [EIP-1271 ইন্টারফেস](https://eips.ethereum.org/EIPS/eip-1271)-এর `isValidSignature` ফাংশনটি সরাসরি বার্তাটি নেয় না, বরং একটি `_hash` প্যারামিটার নেয়। এর মানে হল `isValidSignature`-এ সম্পূর্ণ ইচ্ছামতো দৈর্ঘ্যের বার্তা পাস করার পরিবর্তে, আমরা বার্তার একটি 32-বাইট হ্যাস (সাধারণত keccak256) পাস করি। + +কলডেটার প্রতিটি বাইট — অর্থাৎ, একটি স্মার্ট কন্ট্র্যাক্ট ফাংশনে পাস করা ফাংশন প্যারামিটার ডেটা — [খরচ 16 গ্যাস (শূন্য বাইট হলে 4 গ্যাস)](https://eips.ethereum.org/EIPS/eip-2028), তাই বার্তাটি দীর্ঘ হলে এটি অনেক গ্যাস সাশ্রয় করতে পারে। + +### পূর্ববর্তী EIP-1271 স্পেসিফিকেশন + +এমন কিছু EIP-1271 স্পেসিফিকেশন প্রচলিত আছে যেগুলিতে `isValidSignature` ফাংশনের প্রথম প্যারামিটারের ধরন `bytes` (নির্দিষ্ট দৈর্ঘ্যের `bytes32` এর পরিবর্তে ইচ্ছামতো দৈর্ঘ্য) এবং প্যারামিটারের নাম `message`। এটি EIP-1271 স্ট্যান্ডার্ডের একটি [পুরানো সংস্করণ](https://github.com/safe-global/safe-contracts/issues/391#issuecomment-1075427206)। + +## আমার নিজের কন্ট্র্যাক্টে EIP-1271 কীভাবে প্রয়োগ করা উচিত? + +এই বিষয়ে স্পেকটি খুবই উন্মুক্ত। Safe ইমপ্লিমেন্টেশনে কিছু ভাল ধারণা রয়েছে: + +- আপনি কন্ট্র্যাক্টের "মালিক"-এর কাছ থেকে আসা EOA স্বাক্ষরগুলিকে বৈধ বলে বিবেচনা করতে পারেন। +- আপনি অনুমোদিত বার্তার একটি তালিকা সংরক্ষণ করতে পারেন এবং শুধুমাত্র সেগুলিকে বৈধ বলে বিবেচনা করতে পারেন। + +শেষ পর্যন্ত, কন্ট্র্যাক্ট ডেভেলপার হিসেবে এটি আপনার উপরই নির্ভর করে! + +## উপসংহার + +[EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) একটি বহুমুখী স্ট্যান্ডার্ড যা স্মার্ট কন্ট্র্যাক্টকে স্বাক্ষর যাচাই করার অনুমতি দেয়। এটি স্মার্ট কন্ট্র্যাক্টগুলিকে EOA-এর মতো আরও বেশি কাজ করার সুযোগ করে দেয় — উদাহরণস্বরূপ "ইথেরিয়াম দিয়ে লগইন করুন" পদ্ধতিটিকে স্মার্ট কন্ট্র্যাক্টের সাথে কাজ করার একটি উপায় প্রদান করে — এবং এটি অনেক উপায়ে প্রয়োগ করা যেতে পারে (Safe-এর একটি গুরুত্বপূর্ণ, আকর্ষণীয় ইমপ্লিমেন্টেশন রয়েছে যা বিবেচনা করার মতো)। diff --git a/public/content/translations/bn/developers/tutorials/erc-721-vyper-annotated-code/index.md b/public/content/translations/bn/developers/tutorials/erc-721-vyper-annotated-code/index.md new file mode 100644 index 00000000000..9dcb629aa7f --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/erc-721-vyper-annotated-code/index.md @@ -0,0 +1,640 @@ +--- +title: "Vyper ERC-721 কন্ট্র্যাক্ট ওয়াকথ্রু" +description: "Ryuya Nakamura-এর ERC-721 কন্ট্র্যাক্ট এবং এটি কীভাবে কাজ করে" +author: Ori Pomerantz +lang: bn +tags: [ "vyper", "erc-721", "python" ] +skill: beginner +published: 2021-04-01 +--- + +## ভূমিকা {#introduction} + +[ERC-721](/developers/docs/standards/tokens/erc-721/) স্ট্যান্ডার্ডটি নন-ফাঞ্জিবল টোকেনের (NFT) মালিকানা ধরে রাখতে ব্যবহৃত হয়। +[ERC-20](/developers/docs/standards/tokens/erc-20/) টোকেনগুলি একটি পণ্যের মতো আচরণ করে, কারণ পৃথক টোকেনগুলির মধ্যে কোনও পার্থক্য নেই। +এর বিপরীতে, ERC-721 টোকেনগুলি এমন অ্যাসেটের জন্য ডিজাইন করা হয়েছে যা একই রকম কিন্তু অভিন্ন নয়, যেমন বিভিন্ন বিড়ালের +কার্টুন বা বিভিন্ন রিয়েল এস্টেটের মালিকানা। + +এই আর্টিকেলে আমরা [Ryuya Nakamura-এর ERC-721 কন্ট্র্যাক্ট](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy) বিশ্লেষণ করব। +এই কন্ট্র্যাক্টটি [Vyper](https://vyper.readthedocs.io/en/latest/index.html) ভাষায় লেখা, এটি Python-এর মতো একটি কন্ট্র্যাক্ট ল্যাঙ্গুয়েজ যা Solidity-র চেয়ে নিরাপত্তাহীন কোড লেখাকে আরও কঠিন করে তোলার জন্য ডিজাইন করা হয়েছে। + +## কন্ট্র্যাক্টটি {#contract} + +```python +# @dev ERC-721 নন-ফাঞ্জিবল টোকেন স্ট্যান্ডার্ডের ইমপ্লিমেন্টেশন। +# @author Ryuya Nakamura (@nrryuya) +# থেকে সংশোধিত: https://github.com/vyperlang/vyper/blob/de74722bf2d8718cca46902be165f9fe0e3641dd/examples/tokens/ERC721.vy +``` + +Vyper-এ, Python-এর মতোই, কমেন্টগুলি একটি হ্যাশ (`#`) দিয়ে শুরু হয় এবং লাইনের শেষ পর্যন্ত চলতে থাকে। যে কমেন্টগুলিতে +`@` থাকে সেগুলি [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) দ্বারা মানুষের পাঠযোগ্য ডকুমেন্টেশন তৈরি করতে ব্যবহৃত হয়। + +```python +from vyper.interfaces import ERC721 + +implements: ERC721 +``` + +ERC-721 ইন্টারফেসটি Vyper ল্যাঙ্গুয়েজের মধ্যে অন্তর্নির্মিত। +[আপনি এখানে কোডের সংজ্ঞা দেখতে পারেন](https://github.com/vyperlang/vyper/blob/master/vyper/builtin_interfaces/ERC721.py)। +ইন্টারফেসের সংজ্ঞা Vyper-এর পরিবর্তে Python-এ লেখা হয়েছে, কারণ ইন্টারফেসগুলি শুধুমাত্র ব্লকচেইনের মধ্যেই ব্যবহৃত হয় না, বরং একটি বহিরাগত ক্লায়েন্ট থেকে ব্লকচেইনে লেনদেন পাঠানোর সময়ও ব্যবহৃত হয়, যা Python-এ লেখা হতে পারে। + +প্রথম লাইনটি ইন্টারফেস ইম্পোর্ট করে, এবং দ্বিতীয়টি নির্দিষ্ট করে যে আমরা এখানে এটি ইমপ্লিমেন্ট করছি। + +### ERC721Receiver ইন্টারফেস {#receiver-interface} + +```python +# safeTransferFrom() দ্বারা কল করা কন্ট্র্যাক্টের জন্য ইন্টারফেস +interface ERC721Receiver: + def onERC721Received( +``` + +ERC-721 দুই ধরনের ট্রান্সফার সমর্থন করে: + +- `transferFrom`, যা সেন্ডারকে যেকোনো গন্তব্যের অ্যাড্রেস নির্দিষ্ট করতে দেয় এবং ট্রান্সফারের দায়িত্ব সেন্ডারের উপর রাখে। এর মানে হল আপনি একটি অবৈধ অ্যাড্রেসে ট্রান্সফার করতে পারেন, সেক্ষেত্রে NFT চিরতরে হারিয়ে যাবে। +- `safeTransferFrom`, যা গন্তব্যের অ্যাড্রেসটি একটি কন্ট্র্যাক্ট কিনা তা পরীক্ষা করে। যদি তাই হয়, ERC-721 কন্ট্র্যাক্টটি গ্রহণকারী কন্ট্র্যাক্টকে জিজ্ঞাসা করে যে এটি NFT গ্রহণ করতে চায় কিনা। + +`safeTransferFrom` অনুরোধের উত্তর দিতে একটি গ্রহণকারী কন্ট্র্যাক্টকে `ERC721Receiver` ইমপ্লিমেন্ট করতে হবে। + +```python + _operator: address, + _from: address, +``` + +`_from` অ্যাড্রেসটি টোকেনের বর্তমান মালিক। `_operator` অ্যাড্রেসটি হল সেই ব্যক্তি যে ট্রান্সফারের জন্য অনুরোধ করেছে (allowances-এর কারণে এই দুটি এক নাও হতে পারে)। + +```python + _tokenId: uint256, +``` + +ERC-721 টোকেন ID গুলি 256 বিটের হয়। সাধারণত টোকেনটি যা উপস্থাপন করে তার একটি বিবরণের হ্যাশিং করে এগুলি তৈরি করা হয়। + +```python + _data: Bytes[1024] +``` + +অনুরোধে 1024 বাইট পর্যন্ত ব্যবহারকারীর ডেটা থাকতে পারে। + +```python + ) -> bytes32: view +``` + +একটি কন্ট্র্যাক্ট যাতে ভুলবশত কোনো ট্রান্সফার গ্রহণ না করে, তা প্রতিরোধ করার জন্য রিটার্ন ভ্যালুটি বুলিয়ান নয়, বরং একটি নির্দিষ্ট মান সহ 256 বিটের হয়। + +এই ফাংশনটি একটি `view`, যার মানে এটি ব্লকচেইনের স্টেট পড়তে পারে, কিন্তু এটি পরিবর্তন করতে পারে না। + +### ইভেন্ট {#events} + +[ইভেন্টগুলি](https://media.consensys.net/technical-introduction-to-events-and-logs-in-ethereum-a074d65dd61e) ব্লকচেইনের বাইরের ব্যবহারকারী এবং সার্ভারদের ইভেন্ট সম্পর্কে জানাতে নির্গত হয়। মনে রাখবেন যে ইভেন্টের বিষয়বস্তু ব্লকচেইনের কন্ট্র্যাক্টগুলির জন্য উপলব্ধ নয়। + +```python +# @dev যেকোনো মেকানিজমের মাধ্যমে কোনো NFT-এর মালিকানা পরিবর্তন হলে এটি নির্গত হয়। এই ইভেন্টটি তখন নির্গত হয় যখন NFT +# তৈরি হয় (`from` == 0) এবং ধ্বংস হয় (`to` == 0)। ব্যতিক্রম: কন্ট্র্যাক্ট তৈরির সময়, যেকোনো +# সংখ্যক NFT ট্রান্সফার নির্গত না করে তৈরি এবং অ্যাসাইন করা যেতে পারে। যেকোনো +# ট্রান্সফারের সময়, সেই NFT-এর জন্য অনুমোদিত অ্যাড্রেস (যদি থাকে) রিসেট করে কিছুই থাকে না। +# @param _from NFT-এর সেন্ডার (যদি অ্যাড্রেসটি জিরো অ্যাড্রেস হয় তবে এটি টোকেন তৈরি নির্দেশ করে)। +# @param _to NFT-এর প্রাপক (যদি অ্যাড্রেসটি জিরো অ্যাড্রেস হয় তবে এটি টোকেন ধ্বংস নির্দেশ করে)। +# @param _tokenId যে NFTটি ট্রান্সফার করা হয়েছে। +event Transfer: + sender: indexed(address) + receiver: indexed(address) + tokenId: indexed(uint256) +``` + +এটি ERC-20 ট্রান্সফার ইভেন্টের মতো, তবে এখানে আমরা একটি পরিমাণের পরিবর্তে একটি `tokenId` রিপোর্ট করি। +জিরো অ্যাড্রেসের মালিক কেউ নয়, তাই প্রথা অনুযায়ী আমরা এটি টোকেন তৈরি এবং ধ্বংস রিপোর্ট করতে ব্যবহার করি। + +```python +# @dev এটি নির্গত হয় যখন একটি NFT-এর জন্য অনুমোদিত অ্যাড্রেস পরিবর্তন বা পুনরায় নিশ্চিত করা হয়। জিরো +# অ্যাড্রেস নির্দেশ করে যে কোনো অনুমোদিত অ্যাড্রেস নেই। যখন একটি ট্রান্সফার ইভেন্ট নির্গত হয়, এটিও +# নির্দেশ করে যে সেই NFT-এর জন্য অনুমোদিত অ্যাড্রেস (যদি থাকে) রিসেট করে কিছুই থাকে না। +# @param _owner NFT-এর মালিক। +# @param _approved যে অ্যাড্রেসটি আমরা অনুমোদন করছি। +# @param _tokenId যে NFT-টি আমরা অনুমোদন করছি। +event Approval: + owner: indexed(address) + approved: indexed(address) + tokenId: indexed(uint256) +``` + +একটি ERC-721 অনুমোদন একটি ERC-20 অ্যালাওয়েন্সের মতো। একটি নির্দিষ্ট অ্যাড্রেস একটি নির্দিষ্ট টোকেন ট্রান্সফার করার অনুমতিপ্রাপ্ত। এটি কন্ট্র্যাক্টগুলিকে একটি টোকেন গ্রহণ করার সময় প্রতিক্রিয়া জানানোর জন্য একটি মেকানিজম দেয়। কন্ট্র্যাক্টগুলি ইভেন্টের জন্য অপেক্ষা করতে পারে না, তাই যদি আপনি কেবল তাদের কাছে টোকেন ট্রান্সফার করেন তবে তারা এটি সম্পর্কে "জানতে" পারে না। এইভাবে মালিক প্রথমে একটি অনুমোদন জমা দেয় এবং তারপরে কন্ট্র্যাক্টে একটি অনুরোধ পাঠায়: "আমি আপনাকে টোকেন +X ট্রান্সফার করার জন্য অনুমোদন দিয়েছি, অনুগ্রহ করে করুন..."। + +এটি ERC-721 স্ট্যান্ডার্ডকে ERC-20 স্ট্যান্ডার্ডের মতো করার জন্য একটি ডিজাইনের সিদ্ধান্ত। যেহেতু ERC-721 টোকেনগুলি নন-ফাঞ্জিবল, তাই একটি কন্ট্র্যাক্ট টোকেনের মালিকানা দেখেও শনাক্ত করতে পারে যে এটি একটি নির্দিষ্ট টোকেন পেয়েছে। + +```python +# @dev এটি তখন নির্গত হয় যখন একজন মালিকের জন্য একজন অপারেটর সক্রিয় বা নিষ্ক্রিয় করা হয়। অপারেটর পরিচালনা করতে পারে +# মালিকের সমস্ত NFT। +# @param _owner NFT-এর মালিক। +# @param _operator যে অ্যাড্রেসে আমরা অপারেটরের অধিকার সেট করছি। +# @param _approved অপারেটরের অধিকারের স্থিতি (সত্য যদি অপারেটরের অধিকার দেওয়া হয় এবং মিথ্যা যদি +# প্রত্যাহার করা হয়)। +event ApprovalForAll: + owner: indexed(address) + operator: indexed(address) + approved: bool +``` + +কখনো কখনো একজন _অপারেটর_ থাকা দরকারী, যে একটি নির্দিষ্ট ধরনের একটি অ্যাকাউন্টের সমস্ত টোকেন পরিচালনা করতে পারে (যেগুলো একটি নির্দিষ্ট কন্ট্র্যাক্ট দ্বারা পরিচালিত হয়), যা পাওয়ার অফ অ্যাটর্নির মতো। উদাহরণস্বরূপ, আমি এমন একটি কন্ট্র্যাক্টকে এই ক্ষমতা দিতে চাইতে পারি যা পরীক্ষা করে দেখবে যে আমি ছয় মাস ধরে এর সাথে যোগাযোগ করেছি কিনা, এবং যদি না করে থাকি, তাহলে আমার সম্পদ আমার উত্তরাধিকারীদের মধ্যে বিতরণ করবে (যদি তাদের মধ্যে কেউ এর জন্য জিজ্ঞাসা করে, কন্ট্র্যাক্টগুলো কোনো লেনদেন দ্বারা কল না করা পর্যন্ত কিছুই করতে পারে না)। ERC-20-তে আমরা উত্তরাধিকার কন্ট্র্যাক্টকে একটি উচ্চ অ্যালাওয়েন্স দিতে পারি, কিন্তু এটি ERC-721-এর জন্য কাজ করে না কারণ টোকেনগুলি নন-ফাঞ্জিবল। এটি তার সমতুল্য। + +`approved` মানটি আমাদের বলে যে ইভেন্টটি একটি অনুমোদনের জন্য, নাকি একটি অনুমোদন প্রত্যাহারের জন্য। + +### স্টেট ভ্যারিয়েবল {#state-vars} + +এই ভ্যারিয়েবলগুলিতে টোকেনগুলির বর্তমান স্টেট থাকে: কোনটি উপলব্ধ এবং কে তাদের মালিক। এগুলির বেশিরভাগই `HashMap` অবজেক্ট, [দুটি টাইপের মধ্যে বিদ্যমান একমুখী ম্যাপিং](https://vyper.readthedocs.io/en/latest/types.html#mappings)। + +```python +# @dev NFT ID থেকে সেটির মালিকের অ্যাড্রেসের ম্যাপিং। +idToOwner: HashMap[uint256, address] + +# @dev NFT ID থেকে অনুমোদিত অ্যাড্রেসের ম্যাপিং। +idToApprovals: HashMap[uint256, address] +``` + +Ethereum-এ ব্যবহারকারী এবং কন্ট্র্যাক্টের পরিচয় 160-বিটের অ্যাড্রেস দ্বারা উপস্থাপিত হয়। এই দুটি ভ্যারিয়েবল টোকেন ID থেকে তাদের মালিক এবং যারা তাদের ট্রান্সফার করার জন্য অনুমোদিত (প্রতিটির জন্য সর্বাধিক একজন) তাদের ম্যাপ করে। Ethereum-এ, ইনিশিয়ালাইজ না করা ডেটা সবসময় শূন্য থাকে, তাই যদি কোনো মালিক বা অনুমোদিত ট্রান্সফারকারী না থাকে তবে সেই টোকেনের মান শূন্য হয়। + +```python +# @dev মালিকের অ্যাড্রেস থেকে তার টোকেন সংখ্যার ম্যাপিং। +ownerToNFTokenCount: HashMap[address, uint256] +``` + +এই ভ্যারিয়েবলটি প্রতিটি মালিকের টোকেনের সংখ্যা ধরে রাখে। মালিকদের থেকে টোকেনের কোনো ম্যাপিং নেই, তাই কোনো নির্দিষ্ট মালিকের মালিকানাধীন টোকেনগুলি শনাক্ত করার একমাত্র উপায় হলো ব্লকচেইনের ইভেন্ট ইতিহাসে ফিরে দেখা এবং উপযুক্ত `Transfer` ইভেন্টগুলি দেখা। আমরা এই ভ্যারিয়েবলটি ব্যবহার করে জানতে পারি যে কখন আমাদের কাছে সমস্ত NFT আছে এবং সময়ের আরও পিছনে দেখার প্রয়োজন নেই। + +মনে রাখবেন যে এই অ্যালগরিদমটি শুধুমাত্র ব্যবহারকারী ইন্টারফেস এবং বহিরাগত সার্ভারের জন্য কাজ করে। ব্লকচেইনে চলমান কোড নিজে অতীতের ইভেন্টগুলি পড়তে পারে না। + +```python +# @dev মালিকের অ্যাড্রেস থেকে অপারেটর অ্যাড্রেসের ম্যাপিং-এর ম্যাপিং। +ownerToOperators: HashMap[address, HashMap[address, bool]] +``` + +একটি অ্যাকাউন্টে একাধিক অপারেটর থাকতে পারে। একটি সাধারণ `HashMap` তাদের ট্র্যাক রাখার জন্য অপর্যাপ্ত, কারণ প্রতিটি কী একটি একক মানের দিকে নিয়ে যায়। এর পরিবর্তে, আপনি মান হিসাবে `HashMap[address, bool]` ব্যবহার করতে পারেন। ডিফল্টরূপে প্রতিটি অ্যাড্রেসের জন্য মান `False` থাকে, যার মানে এটি একজন অপারেটর নয়। প্রয়োজন অনুযায়ী আপনি মানগুলিকে `True` তে সেট করতে পারেন। + +```python +# @dev মিন্টারের অ্যাড্রেস, যে একটি টোকেন মিন্ট করতে পারে +minter: address +``` + +নতুন টোকেন কোনো না কোনোভাবে তৈরি করতে হবে। এই কন্ট্র্যাক্টে একটি একক সত্তা রয়েছে যা এটি করার অনুমতিপ্রাপ্ত, সেটি হলো `minter`। উদাহরণস্বরূপ, একটি গেমের জন্য এটি যথেষ্ট হতে পারে। অন্যান্য উদ্দেশ্যে, একটি আরও জটিল ব্যবসায়িক যুক্তি তৈরি করা প্রয়োজন হতে পারে। + +```python +# @dev ইন্টারফেস আইডি থেকে বুলিয়ানের ম্যাপিং, এটি সমর্থিত কিনা। +supportedInterfaces: HashMap[bytes32, bool] + +# @dev ERC165 এর ERC165 ইন্টারফেস আইডি +ERC165_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000001ffc9a7 + +# @dev ERC721 এর ERC165 ইন্টারফেস আইডি +ERC721_INTERFACE_ID: constant(bytes32) = 0x0000000000000000000000000000000000000000000000000000000080ac58cd +``` + +[ERC-165](https://eips.ethereum.org/EIPS/eip-165) একটি কন্ট্র্যাক্টের জন্য একটি মেকানিজম নির্দিষ্ট করে যা প্রকাশ করে যে অ্যাপ্লিকেশনগুলি কীভাবে এর সাথে যোগাযোগ করতে পারে, এবং এটি কোন ERC গুলি মেনে চলে। এই ক্ষেত্রে, কন্ট্র্যাক্টটি ERC-165 এবং ERC-721 মেনে চলে। + +### ফাংশন {#functions} + +এগুলি হলো সেই ফাংশন যা আসলে ERC-721 ইমপ্লিমেন্ট করে। + +#### কনস্ট্রাক্টর {#constructor} + +```python +@external +def __init__(): +``` + +Vyper-এ, Python-এর মতোই, কনস্ট্রাক্টর ফাংশনকে `__init__` বলা হয়। + +```python + """ + @dev কন্ট্র্যাক্ট কনস্ট্রাক্টর। + """ +``` + +Python এবং Vyper-এ, আপনি একটি মাল্টি-লাইন স্ট্রিং (যা `\"\"\"` দিয়ে শুরু এবং শেষ হয়) নির্দিষ্ট করে এবং এটিকে কোনোভাবে ব্যবহার না করেও একটি মন্তব্য তৈরি করতে পারেন। এই কমেন্টগুলিতে [NatSpec](https://vyper.readthedocs.io/en/latest/natspec.html) অন্তর্ভুক্ত থাকতে পারে। + +```python + self.supportedInterfaces[ERC165_INTERFACE_ID] = True + self.supportedInterfaces[ERC721_INTERFACE_ID] = True + self.minter = msg.sender +``` + +স্টেট ভ্যারিয়েবল অ্যাক্সেস করতে আপনি `self.` ব্যবহার করেন` (আবার, Python-এর মতোই)। + +#### ভিউ ফাংশন {#views} + +এগুলি এমন ফাংশন যা ব্লকচেইনের স্টেট পরিবর্তন করে না, এবং তাই যদি বাইরে থেকে কল করা হয় তবে বিনামূল্যে কার্যকর করা যেতে পারে। যদি ভিউ ফাংশনগুলি একটি কন্ট্র্যাক্ট দ্বারা কল করা হয় তবে সেগুলি এখনও প্রতিটি নোডে কার্যকর করতে হবে এবং তাই গ্যাসের খরচ হয়। + +```python +@view +@external +``` + +একটি ফাংশন সংজ্ঞার আগে এই কীওয়ার্ডগুলি যা একটি অ্যাট সাইন (`@`) দিয়ে শুরু হয়, তাদের _ডেকোরেশন_ বলা হয়। তারা নির্দিষ্ট করে যে কোন পরিস্থিতিতে একটি ফাংশন কল করা যেতে পারে। + +- `@view` নির্দিষ্ট করে যে এই ফাংশনটি একটি ভিউ। +- `@external` নির্দিষ্ট করে যে এই নির্দিষ্ট ফাংশনটি লেনদেন এবং অন্যান্য কন্ট্র্যাক্ট দ্বারা কল করা যেতে পারে। + +```python +def supportsInterface(_interfaceID: bytes32) -> bool: +``` + +Python-এর বিপরীতে, Vyper একটি [স্ট্যাটিক টাইপড ল্যাঙ্গুয়েজ](https://wikipedia.org/wiki/Type_system#Static_type_checking)। +[ডেটা টাইপ](https://vyper.readthedocs.io/en/latest/types.html) শনাক্ত না করে আপনি কোনো ভ্যারিয়েবল বা ফাংশন প্যারামিটার ঘোষণা করতে পারবেন না। এই ক্ষেত্রে ইনপুট প্যারামিটার হল `bytes32`, একটি 256-বিটের মান (256 বিট হল [Ethereum Virtual Machine](/developers/docs/evm/)-এর নেটিভ ওয়ার্ড সাইজ)। আউটপুটটি একটি বুলিয়ান মান। প্রথা অনুযায়ী, ফাংশন প্যারামিটারের নাম একটি আন্ডারস্কোর (`_`) দিয়ে শুরু হয়। + +```python + """ + @dev ইন্টারফেস শনাক্তকরণ ERC-165-এ নির্দিষ্ট করা আছে। + @param _interfaceID ইন্টারফেসের আইডি + """ + return self.supportedInterfaces[_interfaceID] +``` + +`self.supportedInterfaces` HashMap থেকে মানটি রিটার্ন করুন, যা কনস্ট্রাক্টরে (`__init__`) সেট করা হয়েছে। + +```python +### VIEW FUNCTIONS ### + +``` + +এগুলি এমন ভিউ ফাংশন যা ব্যবহারকারী এবং অন্যান্য কন্ট্র্যাক্টের জন্য টোকেন সম্পর্কে তথ্য উপলব্ধ করে। + +```python +@view +@external +def balanceOf(_owner: address) -> uint256: + """ + @dev `_owner`-এর মালিকানাধীন NFT-এর সংখ্যা ফেরত দেয়। + `_owner` যদি শূন্য অ্যাড্রেস হয় তবে থ্রো করে। শূন্য অ্যাড্রেসে অ্যাসাইন করা NFT গুলিকে অবৈধ বলে মনে করা হয়। + @param _owner যে অ্যাড্রেসের জন্য ব্যালেন্স জিজ্ঞাসা করতে হবে। + """ + assert _owner != ZERO_ADDRESS +``` + +এই লাইনটি [অ্যাসার্ট করে](https://vyper.readthedocs.io/en/latest/statements.html#assert) যে `_owner` শূন্য নয়। যদি এটি হয়, তাহলে একটি ত্রুটি হয় এবং অপারেশনটি প্রত্যাবর্তন করা হয়। + +```python + return self.ownerToNFTokenCount[_owner] + +@view +@external +def ownerOf(_tokenId: uint256) -> address: + """ + @dev NFT-এর মালিকের অ্যাড্রেস ফেরত দেয়। + `_tokenId` যদি একটি বৈধ NFT না হয় তবে থ্রো করে। + @param _tokenId একটি NFT-এর জন্য আইডেন্টিফায়ার। + """ + owner: address = self.idToOwner[_tokenId] + # `_tokenId` যদি একটি বৈধ NFT না হয় তবে থ্রো করে + assert owner != ZERO_ADDRESS + return owner +``` + +Ethereum Virtual Machine (evm)-এ যে কোনও স্টোরেজ যেখানে কোনও মান সংরক্ষণ করা হয়নি তা শূন্য থাকে। +যদি `_tokenId`-তে কোনো টোকেন না থাকে তাহলে `self.idToOwner[_tokenId]`-এর মান শূন্য। সেক্ষেত্রে ফাংশনটি রিভার্ট করে। + +```python +@view +@external +def getApproved(_tokenId: uint256) -> address: + """ + @dev একটি একক NFT-এর জন্য অনুমোদিত অ্যাড্রেস পান। + `_tokenId` যদি একটি বৈধ NFT না হয় তবে থ্রো করে। + @param _tokenId যে NFT-এর অনুমোদন জিজ্ঞাসা করতে হবে তার আইডি। + """ + # `_tokenId` যদি একটি বৈধ NFT না হয় তবে থ্রো করে + assert self.idToOwner[_tokenId] != ZERO_ADDRESS + return self.idToApprovals[_tokenId] +``` + +মনে রাখবেন যে `getApproved` শূন্য ফেরত দিতে _পারে_। যদি টোকেনটি বৈধ হয় তবে এটি `self.idToApprovals[_tokenId]` ফেরত দেয়। +যদি কোনো অনুমোদনকারী না থাকে তবে সেই মান শূন্য। + +```python +@view +@external +def isApprovedForAll(_owner: address, _operator: address) -> bool: + """ + @dev পরীক্ষা করে যে `_operator` `_owner`-এর জন্য একজন অনুমোদিত অপারেটর কিনা। + @param _owner যে অ্যাড্রেসটি NFT-এর মালিক। + @param _operator যে অ্যাড্রেসটি মালিকের পক্ষে কাজ করে। + """ + return (self.ownerToOperators[_owner])[_operator] +``` + +এই ফাংশনটি পরীক্ষা করে যে `_operator`-কে এই কন্ট্র্যাক্টে `_owner`-এর সমস্ত টোকেন পরিচালনা করার অনুমতি আছে কিনা। +যেহেতু একাধিক অপারেটর থাকতে পারে, এটি একটি দুই-স্তরের HashMap। + +#### ট্রান্সফার হেল্পার ফাংশন {#transfer-helpers} + +এই ফাংশনগুলি টোকেন ট্রান্সফার বা পরিচালনার অংশ এমন অপারেশনগুলি ইমপ্লিমেন্ট করে। + +```python + +### TRANSFER FUNCTION HELPERS ### + +@view +@internal +``` + +এই ডেকোরেশন, `@internal` এর মানে হল যে ফাংশনটি শুধুমাত্র একই কন্ট্র্যাক্টের মধ্যে অন্যান্য ফাংশন থেকে অ্যাক্সেসযোগ্য। প্রথা অনুযায়ী, এই ফাংশনের নামগুলিও একটি আন্ডারস্কোর (`_`) দিয়ে শুরু হয়। + +```python +def _isApprovedOrOwner(_spender: address, _tokenId: uint256) -> bool: + """ + @dev প্রদত্ত স্পেন্ডার একটি প্রদত্ত টোকেন আইডি ট্রান্সফার করতে পারে কিনা তা ফেরত দেয় + @param spender যে স্পেন্ডারের অ্যাড্রেসটি জিজ্ঞাসা করা হবে + @param tokenId uint256 ট্রান্সফার করা হবে এমন টোকেনের আইডি + @return bool msg.sender প্রদত্ত টোকেন আইডির জন্য অনুমোদিত কিনা, + মালিকের একজন অপারেটর, বা টোকেনের মালিক কিনা + """ + owner: address = self.idToOwner[_tokenId] + spenderIsOwner: bool = owner == _spender + spenderIsApproved: bool = _spender == self.idToApprovals[_tokenId] + spenderIsApprovedForAll: bool = (self.ownerToOperators[owner])[_spender] + return (spenderIsOwner or spenderIsApproved) or spenderIsApprovedForAll +``` + +একটি অ্যাড্রেসকে টোকেন ট্রান্সফার করার অনুমতি দেওয়ার তিনটি উপায় আছে: + +1. অ্যাড্রেসটি টোকেনের মালিক +2. অ্যাড্রেসটি সেই টোকেনটি খরচ করার জন্য অনুমোদিত +3. অ্যাড্রেসটি টোকেনের মালিকের জন্য একজন অপারেটর + +উপরের ফাংশনটি একটি ভিউ হতে পারে কারণ এটি স্টেট পরিবর্তন করে না। অপারেটিং খরচ কমাতে, যেকোনো ফাংশন যা ভিউ হতে পারে তা ভিউ _হওয়া উচিত_। + +```python +@internal +def _addTokenTo(_to: address, _tokenId: uint256): + """ + @dev একটি প্রদত্ত অ্যাড্রেসে একটি NFT যোগ করুন + যদি `_tokenId` কারও মালিকানাধীন থাকে তবে থ্রো করে। + """ + # যদি `_tokenId` কারও মালিকানাধীন থাকে তবে থ্রো করে + assert self.idToOwner[_tokenId] == ZERO_ADDRESS + # মালিক পরিবর্তন করুন + self.idToOwner[_tokenId] = _to + # গণনা ট্র্যাকিং পরিবর্তন করুন + self.ownerToNFTokenCount[_to] += 1 + + +@internal +def _removeTokenFrom(_from: address, _tokenId: uint256): + """ + @dev একটি প্রদত্ত অ্যাড্রেস থেকে একটি NFT সরান + যদি `_from` বর্তমান মালিক না হয় তবে থ্রো করে। + """ + # যদি `_from` বর্তমান মালিক না হয় তবে থ্রো করে + assert self.idToOwner[_tokenId] == _from + # মালিক পরিবর্তন করুন + self.idToOwner[_tokenId] = ZERO_ADDRESS + # গণনা ট্র্যাকিং পরিবর্তন করুন + self.ownerToNFTokenCount[_from] -= 1 +``` + +ট্রান্সফারে সমস্যা হলে আমরা কলটি রিভার্ট করি। + +```python +@internal +def _clearApproval(_owner: address, _tokenId: uint256): + """ + @dev একটি প্রদত্ত অ্যাড্রেসের একটি অনুমোদন পরিষ্কার করুন + যদি `_owner` বর্তমান মালিক না হয় তবে থ্রো করে। + """ + # যদি `_owner` বর্তমান মালিক না হয় তবে থ্রো করে + assert self.idToOwner[_tokenId] == _owner + if self.idToApprovals[_tokenId] != ZERO_ADDRESS: + # অনুমোদন রিসেট করুন + self.idToApprovals[_tokenId] = ZERO_ADDRESS +``` + +প্রয়োজন হলেই কেবল মান পরিবর্তন করুন। স্টেট ভ্যারিয়েবলগুলি স্টোরেজে থাকে। স্টোরেজে লেখা EVM (Ethereum Virtual Machine) এর অন্যতম ব্যয়বহুল অপারেশন ([গ্যাস](/developers/docs/gas/) এর পরিপ্রেক্ষিতে)। সুতরাং, এটি কমানো একটি ভাল ধারণা, এমনকি বিদ্যমান মান লেখারও একটি উচ্চ খরচ আছে। + +```python +@internal +def _transferFrom(_from: address, _to: address, _tokenId: uint256, _sender: address): + """ + @dev একটি NFT-এর ট্রান্সফার কার্যকর করুন। + `msg.sender` যদি বর্তমান মালিক, একজন অনুমোদিত অপারেটর, বা এই NFT-এর জন্য অনুমোদিত + অ্যাড্রেস না হয় তবে থ্রো করে। (দ্রষ্টব্য: `msg.sender` ব্যক্তিগত ফাংশনে অনুমোদিত নয় তাই `_sender` পাস করুন।) + যদি `_to` শূন্য অ্যাড্রেস হয় তবে থ্রো করে। + যদি `_from` বর্তমান মালিক না হয় তবে থ্রো করে। + যদি `_tokenId` একটি বৈধ NFT না হয় তবে থ্রো করে। + """ +``` + +আমাদের এই অভ্যন্তরীণ ফাংশনটি আছে কারণ টোকেন ট্রান্সফার করার দুটি উপায় আছে (নিয়মিত এবং নিরাপদ), কিন্তু অডিটিং সহজ করার জন্য আমরা কোডের শুধুমাত্র একটি স্থানে এটি করতে চাই। + +```python + # প্রয়োজনীয়তা পরীক্ষা করুন + assert self._isApprovedOrOwner(_sender, _tokenId) + # `_to` যদি শূন্য ঠিকানা হয় তবে থ্রো করে + assert _to != ZERO_ADDRESS + # অনুমোদন সাফ করুন। `_from` যদি বর্তমান মালিক না হয় তবে থ্রো করে + self._clearApproval(_from, _tokenId) + # NFT সরান। `_tokenId` যদি একটি বৈধ NFT না হয় তবে থ্রো করে + self._removeTokenFrom(_from, _tokenId) + # NFT যোগ করুন + self._addTokenTo(_to, _tokenId) + # স্থানান্তরটি লগ করুন + log Transfer(_from, _to, _tokenId) +``` + +Vyper-এ একটি ইভেন্ট নির্গত করতে আপনি একটি `log` স্টেটমেন্ট ব্যবহার করেন ([আরো বিস্তারিত জানার জন্য এখানে দেখুন](https://vyper.readthedocs.io/en/latest/event-logging.html#event-logging))। + +#### ট্রান্সফার ফাংশন {#transfer-funs} + +```python + +### TRANSFER FUNCTIONS ### + +@external +def transferFrom(_from: address, _to: address, _tokenId: uint256): + """ + @dev `msg.sender` যদি বর্তমান মালিক, একজন অনুমোদিত অপারেটর বা এই NFT-এর জন্য অনুমোদিত ঠিকানা না হয় তবে থ্রো করে। + যদি `_from` বর্তমান মালিক না হয় তবে থ্রো করে। + যদি `_to` শূন্য ঠিকানা হয় তবে থ্রো করে। + যদি `_tokenId` একটি বৈধ NFT না হয় তবে থ্রো করে। + @notice `_to` NFT গ্রহণ করতে সক্ষম কিনা তা নিশ্চিত করার জন্য কলার দায়ী, অন্যথায় সেগুলি স্থায়ীভাবে হারিয়ে যেতে পারে। + @param _from NFT-এর বর্তমান মালিক। + @param _to নতুন মালিক। + @param _tokenId যে NFTটি স্থানান্তর করতে হবে। + """ + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +এই ফাংশনটি আপনাকে একটি নির্বিচারী ঠিকানায় স্থানান্তর করতে দেয়। যদি না ঠিকানাটি একজন ব্যবহারকারী, বা একটি চুক্তি যা টোকেন স্থানান্তর করতে জানে, তবে আপনি যে কোনও টোকেন স্থানান্তর করবেন তা সেই ঠিকানায় আটকে যাবে এবং অকেজো হয়ে যাবে। + +```python +@external +def safeTransferFrom( + _from: address, + _to: address, + _tokenId: uint256, + _data: Bytes[1024]=b"" + ): + """ + @dev একটি NFT-এর মালিকানা এক ঠিকানা থেকে অন্য ঠিকানায় স্থানান্তর করে। + `msg.sender` যদি বর্তমান মালিক, একজন অনুমোদিত অপারেটর, বা এই NFT-এর জন্য অনুমোদিত ঠিকানা না হয় তবে থ্রো করে। + যদি `_from` বর্তমান মালিক না হয় তবে থ্রো করে। + যদি `_to` শূন্য ঠিকানা হয় তবে থ্রো করে। + যদি `_tokenId` একটি বৈধ NFT না হয় তবে থ্রো করে। + যদি `_to` একটি স্মার্ট চুক্তি হয়, তবে এটি `_to`-তে `onERC721Received` কল করে এবং রিটার্ন মান `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` না হলে থ্রো করে। + দ্রষ্টব্য: bytes4 প্যাডিং সহ bytes32 দ্বারা প্রতিনিধিত্ব করা হয় + @param _from NFT-এর বর্তমান মালিক। + @param _to নতুন মালিক। + @param _tokenId যে NFTটি স্থানান্তর করতে হবে। + @param _data কোনও নির্দিষ্ট বিন্যাস ছাড়াই অতিরিক্ত ডেটা, যা `_to`-তে কলে পাঠানো হয়। + """ + self._transferFrom(_from, _to, _tokenId, msg.sender) +``` + +প্রথমে স্থানান্তর করা ঠিক আছে কারণ যদি কোনও সমস্যা হয় তবে আমরা যাইহোক রিভার্ট করব, তাই কলে করা সবকিছু বাতিল হয়ে যাবে। + +```python + if _to.is_contract: # `_to` একটি চুক্তি ঠিকানা কিনা তা পরীক্ষা করুন +``` + +প্রথমে ঠিকানাটি একটি চুক্তি কিনা তা পরীক্ষা করুন (যদি এতে কোড থাকে)। যদি না হয়, তবে ধরে নিন এটি একটি ব্যবহারকারীর ঠিকানা এবং ব্যবহারকারী টোকেনটি ব্যবহার করতে বা স্থানান্তর করতে পারবে। কিন্তু এটি আপনাকে একটি মিথ্যা নিরাপত্তার অনুভূতিতে ঘুম পাড়িয়ে দেবেন না। আপনি `safeTransferFrom` দিয়েও টোকেন হারাতে পারেন, যদি আপনি সেগুলি এমন একটি ঠিকানায় স্থানান্তর করেন যার ব্যক্তিগত কী কেউ জানে না। + +```python + returnValue: bytes32 = ERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) +``` + +লক্ষ্য চুক্তিটি ERC-721 টোকেন গ্রহণ করতে পারে কিনা তা দেখতে কল করুন। + +```python + # যদি স্থানান্তর গন্তব্য এমন একটি চুক্তি হয় যা 'onERC721Received' প্রয়োগ করে না তবে থ্রো করে + assert returnValue == method_id("onERC721Received(address,address,uint256,bytes)", output_type=bytes32) +``` + +যদি গন্তব্য একটি চুক্তি হয়, কিন্তু এমন একটি যা ERC-721 টোকেন গ্রহণ করে না (বা যা এই বিশেষ স্থানান্তরটি গ্রহণ না করার সিদ্ধান্ত নিয়েছে), তবে রিভার্ট করুন। + +```python +@external +def approve(_approved: address, _tokenId: uint256): + """ + @dev একটি NFT-এর জন্য অনুমোদিত ঠিকানা সেট করুন বা পুনরায় নিশ্চিত করুন। শূন্য ঠিকানা নির্দেশ করে যে কোনও অনুমোদিত ঠিকানা নেই। + `msg.sender` যদি বর্তমান NFT মালিক বা বর্তমান মালিকের একজন অনুমোদিত অপারেটর না হয় তবে থ্রো করে। + যদি `_tokenId` একটি বৈধ NFT না হয় তবে থ্রো করে। (দ্রষ্টব্য: এটি EIP-তে লেখা নেই) + যদি `_approved` বর্তমান মালিক হয় তবে থ্রো করে। (দ্রষ্টব্য: এটি EIP-তে লেখা নেই) + @param _approved প্রদত্ত NFT আইডির জন্য অনুমোদিত হতে যাওয়া ঠিকানা। + @param _tokenId অনুমোদিত হতে যাওয়া টোকেনের আইডি। + """ + owner: address = self.idToOwner[_tokenId] + # `_tokenId` যদি একটি বৈধ NFT না হয় তবে থ্রো করে + assert owner != ZERO_ADDRESS + # `_approved` যদি বর্তমান মালিক হয় তবে থ্রো করে + assert _approved != owner +``` + +প্রথা অনুযায়ী যদি আপনি কোনও অনুমোদনকারী না রাখতে চান তবে আপনি শূন্য ঠিকানা নিয়োগ করেন, নিজেকে নয়। + +```python + # প্রয়োজনীয়তা পরীক্ষা করুন + senderIsOwner: bool = self.idToOwner[_tokenId] == msg.sender + senderIsApprovedForAll: bool = (self.ownerToOperators[owner])[msg.sender] + assert (senderIsOwner or senderIsApprovedForAll) +``` + +একটি অনুমোদন সেট করতে আপনি হয় মালিক হতে পারেন, অথবা মালিক দ্বারা অনুমোদিত একজন অপারেটর হতে পারেন। + +```python + # অনুমোদন সেট করুন + self.idToApprovals[_tokenId] = _approved + log Approval(owner, _approved, _tokenId) + + +@external +def setApprovalForAll(_operator: address, _approved: bool): + """ + @dev `msg.sender`-এর সমস্ত সম্পদ পরিচালনার জন্য একটি তৃতীয় পক্ষের ("অপারেটর") জন্য অনুমোদন সক্ষম বা অক্ষম করে। এটি ApprovalForAll ইভেন্টও নির্গত করে। + যদি `_operator` `msg.sender` হয় তবে থ্রো করে। (দ্রষ্টব্য: এটি EIP-তে লেখা নেই) + @notice এটি কাজ করে এমনকি যদি প্রেরক সেই সময়ে কোনও টোকেনের মালিক নাও হন। + @param _operator অনুমোদিত অপারেটরদের সেটে যোগ করার জন্য ঠিকানা। + @param _approved অপারেটর অনুমোদিত হলে সত্য, অনুমোদন প্রত্যাহার করতে মিথ্যা। + """ + # `_operator` যদি `msg.sender` হয় তবে থ্রো করে + assert _operator != msg.sender + self.ownerToOperators[msg.sender][_operator] = _approved + log ApprovalForAll(msg.sender, _operator, _approved) +``` + +#### নতুন টোকেন মিন্ট করুন এবং বিদ্যমানগুলি ধ্বংস করুন {#mint-burn} + +যে অ্যাকাউন্টটি চুক্তিটি তৈরি করেছে সেটি হল `মিন্টার`, সুপার ব্যবহারকারী যা নতুন এনএফটি মিন্ট করার জন্য অনুমোদিত। তবে, এমনকি এটিও বিদ্যমান টোকেনগুলি পোড়াতে অনুমোদিত নয়। কেবল মালিক, বা মালিক দ্বারা অনুমোদিত একটি সত্তা এটি করতে পারে। + +```python +### MINT & BURN FUNCTIONS ### + +@external +def mint(_to: address, _tokenId: uint256) -> bool: +``` + +এই ফাংশনটি সর্বদা `সত্য` প্রদান করে, কারণ অপারেশন ব্যর্থ হলে এটি প্রত্যাবর্তন করা হয়। + +```python + """ + @dev টোকেন মিন্ট করার ফাংশন + `msg.sender` যদি মিন্টার না হয় তবে থ্রো করে। + যদি `_to` শূন্য ঠিকানা হয় তবে থ্রো করে। + যদি `_tokenId` কারও মালিকানাধীন থাকে তবে থ্রো করে। + @param _to যে ঠিকানাটি মিন্ট করা টোকেনগুলি গ্রহণ করবে। + @param _tokenId মিন্ট করার জন্য টোকেন আইডি। + @return একটি বুলিয়ান যা নির্দেশ করে যে অপারেশনটি সফল হয়েছে কিনা। + """ + # `msg.sender` যদি মিন্টার না হয় তবে থ্রো করে + assert msg.sender == self.minter +``` + +শুধুমাত্র মিন্টার (যে অ্যাকাউন্টটি ERC-721 চুক্তিটি তৈরি করেছে) নতুন টোকেন মিন্ট করতে পারে। ভবিষ্যতে যদি আমরা মিন্টারের পরিচয় পরিবর্তন করতে চাই তবে এটি একটি সমস্যা হতে পারে। একটি প্রোডাকশন চুক্তিতে আপনি সম্ভবত এমন একটি ফাংশন চাইবেন যা মিন্টারকে মিন্টার সুবিধা অন্য কাউকে স্থানান্তর করতে দেয়। + +```python + # `_to` যদি শূন্য ঠিকানা হয় তবে থ্রো করে + assert _to != ZERO_ADDRESS + # NFT যোগ করুন। `_tokenId` যদি কারও মালিকানাধীন থাকে তবে থ্রো করে + self._addTokenTo(_to, _tokenId) + log Transfer(ZERO_ADDRESS, _to, _tokenId) + return True +``` + +প্রথা অনুযায়ী, নতুন টোকেন মিন্ট করা শূন্য ঠিকানা থেকে একটি স্থানান্তর হিসাবে গণ্য হয়। + +```python + +@external +def burn(_tokenId: uint256): + """ + @dev একটি নির্দিষ্ট ERC721 টোকেন পোড়ায়। + `msg.sender` যদি বর্তমান মালিক, একজন অনুমোদিত অপারেটর, বা এই NFT-এর জন্য অনুমোদিত ঠিকানা না হয় তবে থ্রো করে। + যদি `_tokenId` একটি বৈধ NFT না হয় তবে থ্রো করে। + @param _tokenId পোড়ানোর জন্য ERC721 টোকেনের uint256 আইডি। + """ + # প্রয়োজনীয়তা পরীক্ষা করুন + assert self._isApprovedOrOwner(msg.sender, _tokenId) + owner: address = self.idToOwner[_tokenId] + # `_tokenId` যদি একটি বৈধ NFT না হয় তবে থ্রো করে + assert owner != ZERO_ADDRESS + self._clearApproval(owner, _tokenId) + self._removeTokenFrom(owner, _tokenId) + log Transfer(owner, ZERO_ADDRESS, _tokenId) +``` + +যেকেউ যে একটি টোকেন স্থানান্তর করতে অনুমোদিত, সে এটি পোড়াতেও অনুমোদিত। যদিও একটি পোড়ানো শূন্য ঠিকানায় স্থানান্তরের সমতুল্য বলে মনে হয়, শূন্য ঠিকানা আসলে টোকেনটি গ্রহণ করে না। এটি আমাদের টোকেনের জন্য ব্যবহৃত সমস্ত স্টোরেজ মুক্ত করতে দেয়, যা লেনদেনের গ্যাস খরচ কমাতে পারে। + +## এই চুক্তিটি ব্যবহার করা {#using-contract} + +Solidity-এর বিপরীতে, Vyper-এর ইনহেরিটেন্স নেই। এটি একটি ইচ্ছাকৃত ডিজাইনের সিদ্ধান্ত যা কোডকে আরও স্পষ্ট এবং সুরক্ষিত করা সহজ করে তোলে। তাই আপনার নিজের Vyper ERC-721 চুক্তি তৈরি করতে আপনি [এই চুক্তিটি](https://github.com/vyperlang/vyper/blob/master/examples/tokens/ERC721.vy) নিন এবং আপনার কাঙ্খিত ব্যবসায়িক যুক্তি প্রয়োগ করতে এটি পরিবর্তন করুন। + +## উপসংহার {#conclusion} + +পর্যালোচনার জন্য, এই চুক্তির কয়েকটি সবচেয়ে গুরুত্বপূর্ণ ধারণা এখানে দেওয়া হল: + +- নিরাপদ ট্রান্সফারের মাধ্যমে ERC-721 টোকেন পেতে, কন্ট্র্যাক্টগুলিকে `ERC721Receiver` ইন্টারফেসটি ইমপ্লিমেন্ট করতে হবে। +- এমনকি যদি আপনি নিরাপদ ট্রান্সফার ব্যবহার করেন, তবুও টোকেনগুলি আটকে যেতে পারে যদি আপনি সেগুলিকে এমন একটি অ্যাড্রেসে পাঠান যার প্রাইভেট কি অজানা। +- যখন কোনও অপারেশনে সমস্যা হয় তখন কেবল একটি ব্যর্থতার মান ফেরত দেওয়ার পরিবর্তে কলটি `রিভার্ট` করা একটি ভাল ধারণা। +- ERC-721 টোকেনগুলির অস্তিত্ব থাকে যখন তাদের একজন মালিক থাকে। +- একটি NFT স্থানান্তর করার জন্য অনুমোদিত হওয়ার তিনটি উপায় আছে। আপনি মালিক হতে পারেন, একটি নির্দিষ্ট টোকেনের জন্য অনুমোদিত হতে পারেন, অথবা মালিকের সমস্ত টোকেনের জন্য একজন অপারেটর হতে পারেন। +- অতীতের ইভেন্টগুলি কেবল ব্লকচেইনের বাইরে দৃশ্যমান। ব্লকচেইনের ভিতরে চলমান কোড সেগুলি দেখতে পারে না। + +এখন যান এবং সুরক্ষিত Vyper চুক্তিগুলি প্রয়োগ করুন। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। + diff --git a/public/content/translations/bn/developers/tutorials/erc20-annotated-code/index.md b/public/content/translations/bn/developers/tutorials/erc20-annotated-code/index.md new file mode 100644 index 00000000000..b68cf3f471c --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/erc20-annotated-code/index.md @@ -0,0 +1,814 @@ +--- +title: "ERC-20 কন্ট্র্যাক্ট ওয়াক-থ্রু" +description: "OpenZeppelin ERC-20 কন্ট্র্যাক্টের ভিতরে কী আছে এবং কেন এটি সেখানে আছে?" +author: Ori Pomerantz +lang: bn +tags: [ "সলিডিটি", "erc-20" ] +skill: beginner +published: 2021-03-09 +--- + +## ভূমিকা {#introduction} + +Ethereum-এর অন্যতম সাধারণ ব্যবহার হল একটি গোষ্ঠীর জন্য একটি ট্রেডযোগ্য টোকেন তৈরি করা, এক অর্থে তাদের নিজস্ব মুদ্রা। এই টোকেনগুলি সাধারণত একটি স্ট্যান্ডার্ড অনুসরণ করে, +[ERC-20](/developers/docs/standards/tokens/erc-20/)। এই স্ট্যান্ডার্ডটি লিকুইডিটি পুল এবং ওয়ালেটের মতো টুলস লেখা সম্ভব করে, যা সমস্ত ERC-20 টোকেনের সাথে কাজ করে। এই নিবন্ধে আমরা +[OpenZeppelin সলিডিটি ERC20 ইমপ্লিমেন্টেশন](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol), এবং +[ইন্টারফেস সংজ্ঞা](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) বিশ্লেষণ করব। + +এটি একটি টীকাযুক্ত সোর্স কোড। আপনি যদি ERC-20 ইমপ্লিমেন্ট করতে চান, +[এই টিউটোরিয়ালটি পড়ুন](https://docs.openzeppelin.com/contracts/2.x/erc20-supply)। + +## ইন্টারফেস {#the-interface} + +ERC-20-এর মতো একটি স্ট্যান্ডার্ডের উদ্দেশ্য হল অনেক টোকেন ইমপ্লিমেন্টেশনকে অনুমতি দেওয়া যা ওয়ালেট এবং ডিসেন্ট্রালাইজড এক্সচেঞ্জের মতো অ্যাপ্লিকেশন জুড়ে ইন্টারঅপারেবল। এটি অর্জন করার জন্য, আমরা একটি +[ইন্টারফেস](https://www.geeksforgeeks.org/solidity/solidity-basics-of-interface/) তৈরি করি। যেকোনো কোড যা টোকেন কন্ট্র্যাক্ট ব্যবহার করতে চায়, তা ইন্টারফেসের একই সংজ্ঞা ব্যবহার করতে পারে এবং এটি ব্যবহার করে এমন সমস্ত টোকেন কন্ট্র্যাক্টের সাথে সামঞ্জস্যপূর্ণ হতে পারে, তা MetaMask-এর মতো একটি ওয়ালেট হোক, etherscan.io-এর মতো একটি ডিএ্যাপ হোক বা লিকুইডিটি পুলের মতো ভিন্ন কোনো কন্ট্র্যাক্ট হোক। + +![ERC-20 ইন্টারফেসের চিত্রণ](erc20_interface.png) + +আপনি যদি একজন অভিজ্ঞ প্রোগ্রামার হন, আপনার সম্ভবত [Java](https://www.w3schools.com/java/java_interface.asp) বা এমনকি [C হেডার ফাইলগুলিতে](https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html)-ও একই ধরনের গঠন দেখতে পাওয়ার কথা মনে আছে। + +এটি OpenZeppelin থেকে প্রাপ্ত [ERC-20 ইন্টারফেস](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol)-এর একটি সংজ্ঞা। এটি [মানুষের পাঠযোগ্য স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-20)-কে সলিডিটি কোডে অনুবাদ। অবশ্যই, +ইন্টারফেসটি নিজে থেকে কিছু _কীভাবে_ করতে হয় তা নির্ধারণ করে না। সেটি নিচের কন্ট্র্যাক্ট সোর্স কোডে ব্যাখ্যা করা হয়েছে। + +  + +```solidity +// SPDX-License-Identifier: MIT +``` + +সলিডিটি ফাইলগুলিতে একটি লাইসেন্স আইডেন্টিফায়ার অন্তর্ভুক্ত থাকার কথা। [আপনি এখানে লাইসেন্সের তালিকা দেখতে পারেন](https://spdx.org/licenses/)। আপনার যদি একটি ভিন্ন +লাইসেন্সের প্রয়োজন হয়, তবে কেবল কমেন্টে তা ব্যাখ্যা করুন। + +  + +```solidity +pragma solidity >=0.6.0 <0.8.0; +``` + +সলিডিটি ভাষা এখনও দ্রুত বিকশিত হচ্ছে এবং নতুন সংস্করণগুলি পুরানো কোডের সাথে সামঞ্জস্যপূর্ণ নাও হতে পারে +([এখানে দেখুন](https://docs.soliditylang.org/en/v0.7.0/070-breaking-changes.html))। অতএব, শুধুমাত্র ভাষার একটি ন্যূনতম সংস্করণই নয়, বরং একটি সর্বোচ্চ সংস্করণও উল্লেখ করা একটি ভাল ধারণা, যেটির সাথে আপনি কোডটি পরীক্ষা করেছেন। + +  + +```solidity +/** + * @dev EIP-তে সংজ্ঞায়িত ERC20 স্ট্যান্ডার্ডের ইন্টারফেস। + */ +``` + +কমেন্টের মধ্যে `@dev` হল [NatSpec ফরম্যাটের](https://docs.soliditylang.org/en/develop/natspec-format.html) অংশ, যা সোর্স কোড থেকে +ডকুমেন্টেশন তৈরি করতে ব্যবহৃত হয়। + +  + +```solidity +interface IERC20 { +``` + +প্রচলিত নিয়ম অনুযায়ী, ইন্টারফেসের নাম `I` দিয়ে শুরু হয়। + +  + +```solidity + /** + * @dev অস্তিত্বে থাকা টোকেনের পরিমাণ ফেরত দেয়। + */ + function totalSupply() external view returns (uint256); +``` + +এই ফাংশনটি `external`, যার অর্থ [এটি শুধুমাত্র কন্ট্র্যাক্টের বাইরে থেকে কল করা যেতে পারে](https://docs.soliditylang.org/en/v0.7.0/cheatsheet.html#index-2)। +এটি কন্ট্র্যাক্টে টোকেনের মোট সরবরাহ ফেরত দেয়। এই মানটি ইথেরিয়ামের সবচেয়ে সাধারণ টাইপ, আনসাইন্ড 256 বিট ব্যবহার করে ফেরত দেওয়া হয় (256 বিট হল EVM-এর +নেটিভ ওয়ার্ড সাইজ)। এই ফাংশনটি একটি `view`ও, যার অর্থ এটি স্টেট পরিবর্তন করে না, তাই এটি ব্লকচেইনের প্রতিটি নোডে চালানোর পরিবর্তে একটি একক নোডে এক্সিকিউট করা যেতে পারে। এই ধরনের ফাংশন কোনো লেনদেন তৈরি করে না এবং কোনো [গ্যাস](/developers/docs/gas/) খরচ করে না। + +**দ্রষ্টব্য:** তত্ত্বগতভাবে এমনটা মনে হতে পারে যে কোনও কন্ট্র্যাক্টের নির্মাতা প্রকৃত মানের চেয়ে কম মোট সরবরাহ ফেরত দিয়ে প্রতারণা করতে পারে, যার ফলে প্রতিটি টোকেন তার প্রকৃত মূল্যের চেয়ে বেশি মূল্যবান বলে মনে হবে। যাইহোক, এই ভয় ব্লকচেইনের আসল প্রকৃতিকে উপেক্ষা করে। ব্লকচেইনে যা কিছু ঘটে তা প্রতিটি নোড দ্বারা যাচাই করা যেতে পারে। এটি অর্জন করার জন্য, প্রতিটি কন্ট্র্যাক্টের মেশিন ল্যাঙ্গুয়েজ কোড এবং স্টোরেজ প্রতিটি নোডে উপলব্ধ। যদিও আপনার কন্ট্র্যাক্টের জন্য সলিডিটি +কোড প্রকাশ করা আপনার জন্য আবশ্যক নয়, আপনি যদি সোর্স কোড এবং যে সলিডিটি সংস্করণ দিয়ে এটি কম্পাইল করা হয়েছিল তা প্রকাশ না করেন তবে কেউ আপনাকে গুরুত্ব সহকারে নেবে না, যাতে এটি আপনার দেওয়া মেশিন ল্যাঙ্গুয়েজ কোডের সাথে যাচাই করা যায়। +উদাহরণস্বরূপ, [এই কন্ট্র্যাক্টটি দেখুন](https://eth.blockscout.com/address/0xa530F85085C6FE2f866E7FdB716849714a89f4CD?tab=contract)। + +  + +```solidity + /** + * @dev `account`-এর মালিকানাধীন টোকেনের পরিমাণ ফেরত দেয়। + */ + function balanceOf(address account) external view returns (uint256); +``` + +নাম শুনেই বোঝা যাচ্ছে, `balanceOf` একটি অ্যাকাউন্টের ব্যালেন্স ফেরত দেয়। ইথেরিয়াম অ্যাকাউন্টগুলি সলিডিটিতে `address` টাইপ ব্যবহার করে চিহ্নিত করা হয়, যা 160 বিট ধারণ করে। +এটি `external` এবং `view`ও বটে। + +  + +```solidity + /** + * @dev কলারের অ্যাকাউন্ট থেকে `recipient`-কে `amount` পরিমাণ টোকেন পাঠায়। + * + * অপারেশনটি সফল হয়েছে কিনা তা নির্দেশ করে একটি বুলিয়ান মান ফেরত দেয়। + * + * একটি {Transfer} ইভেন্ট নির্গত করে। + */ + function transfer(address recipient, uint256 amount) external returns (bool); +``` + +`transfer` ফাংশন কলার থেকে একটি ভিন্ন অ্যাড্রেসে টোকেন স্থানান্তর করে। এতে স্টেটের পরিবর্তন জড়িত, তাই এটি একটি `view` নয়। +যখন একজন ব্যবহারকারী এই ফাংশনটি কল করেন, তখন এটি একটি লেনদেন তৈরি করে এবং গ্যাস খরচ হয়। এটি একটি ইভেন্ট, `Transfer`ও নির্গত করে, যাতে ব্লকচেইনের সবাইকে এই ইভেন্ট সম্পর্কে জানানো যায়। + +ফাংশনটির দুটি ভিন্ন ধরনের কলারদের জন্য দুই ধরনের আউটপুট রয়েছে: + +- যে ব্যবহারকারীরা সরাসরি একটি ইউজার ইন্টারফেস থেকে ফাংশনটি কল করে। সাধারণত ব্যবহারকারী একটি লেনদেন জমা দেয় + এবং প্রতিক্রিয়ার জন্য অপেক্ষা করে না, যা একটি অনির্দিষ্ট পরিমাণ সময় নিতে পারে। ব্যবহারকারী লেনদেনের রসিদ (যা লেনদেনের হ্যাস দ্বারা চিহ্নিত করা হয়) বা + `Transfer` ইভেন্টটি খুঁজে দেখতে পারে যে কী ঘটেছে। +- অন্যান্য কন্ট্র্যাক্ট, যা একটি সামগ্রিক লেনদেনের অংশ হিসাবে ফাংশনটি কল করে। সেই কন্ট্র্যাক্টগুলো অবিলম্বে ফলাফল পায়, + কারণ তারা একই লেনদেনে চলে, তাই তারা ফাংশনের রিটার্ন মান ব্যবহার করতে পারে। + +একই ধরনের আউটপুট অন্যান্য ফাংশন দ্বারা তৈরি করা হয় যা কন্ট্র্যাক্টের স্টেট পরিবর্তন করে। + +  + +অ্যালাওয়েন্স একটি অ্যাকাউন্টকে ভিন্ন মালিকের কিছু টোকেন খরচ করার অনুমতি দেয়। +এটি দরকারী, উদাহরণস্বরূপ, বিক্রেতা হিসাবে কাজ করে এমন কন্ট্র্যাক্টের জন্য। কন্ট্র্যাক্টগুলো ইভেন্টের জন্য +পর্যবেক্ষণ করতে পারে না, তাই যদি কোনো ক্রেতা সরাসরি বিক্রেতা কন্ট্র্যাক্টে টোকেন স্থানান্তর করে তবে সেই কন্ট্র্যাক্ট জানবে না যে তাকে অর্থ প্রদান করা হয়েছে। পরিবর্তে, ক্রেতা বিক্রেতার +কন্ট্র্যাক্টকে একটি নির্দিষ্ট পরিমাণ খরচ করার অনুমতি দেয় এবং বিক্রেতা সেই পরিমাণ স্থানান্তর করে। +এটি বিক্রেতা কন্ট্র্যাক্টের কল করা একটি ফাংশনের মাধ্যমে করা হয়, যাতে বিক্রেতা কন্ট্র্যাক্ট জানতে পারে যে এটি সফল হয়েছে কিনা। + +```solidity + /** + * @dev {transferFrom}-এর মাধ্যমে `spender` `owner`-এর পক্ষ থেকে যে পরিমাণ টোকেন খরচ করার অনুমতি পাবে তা ফেরত দেয়। এটি ডিফল্টরূপে শূন্য থাকে। + * + * এই মানটি {approve} বা {transferFrom} কল করা হলে পরিবর্তিত হয়। + */ + function allowance(address owner, address spender) external view returns (uint256); +``` + +`allowance` ফাংশনটি যে কাউকে একটি +অ্যাড্রেস (`owner`) অন্য অ্যাড্রেসকে (`spender`) কতটা খরচ করতে দেয় তা দেখার জন্য কোয়েরি করার অনুমতি দেয়। + +  + +```solidity + /** + * @dev কলারের টোকেনের উপর `spender`-এর জন্য `amount`-কে অ্যালাওয়েন্স হিসাবে সেট করে। + * + * অপারেশনটি সফল হয়েছে কিনা তা নির্দেশ করে একটি বুলিয়ান মান ফেরত দেয়। + * + * গুরুত্বপূর্ণ: সতর্ক থাকুন যে এই পদ্ধতি ব্যবহার করে একটি অ্যালাওয়েন্স পরিবর্তন করার ফলে একটি ঝুঁকি থাকে যে কেউ দুর্ভাগ্যজনক + * লেনদেনের ক্রম অনুসারে পুরানো এবং নতুন উভয় অ্যালাওয়েন্স ব্যবহার করতে পারে। এই রেস কন্ডিশনটি + * কমানোর একটি সম্ভাব্য সমাধান হল প্রথমে স্পেন্ডারের অ্যালাওয়েন্স 0-তে নামিয়ে আনা এবং তারপরে + * কাঙ্খিত মান সেট করা: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * একটি {Approval} ইভেন্ট নির্গত করে। + */ + function approve(address spender, uint256 amount) external returns (bool); +``` + +`approve` ফাংশনটি একটি অ্যালাওয়েন্স তৈরি করে। কীভাবে এটির অপব্যবহার করা যেতে পারে সে সম্পর্কে বার্তাটি পড়তে ভুলবেন না। ইথেরিয়ামে আপনি আপনার নিজের লেনদেনের ক্রম নিয়ন্ত্রণ করেন, +কিন্তু আপনি অন্য লোকেদের লেনদেন কোন ক্রমে কার্যকর হবে তা নিয়ন্ত্রণ করতে পারবেন না, +যদি না আপনি অন্য পক্ষের লেনদেন সম্পন্ন হয়েছে না দেখা পর্যন্ত আপনার নিজের লেনদেন জমা না দেন। + +  + +```solidity + /** + * @dev অ্যালাওয়েন্স মেকানিজম ব্যবহার করে `sender` থেকে `recipient`-এর কাছে `amount` পরিমাণ টোকেন পাঠায়। + * এরপর কলারের অ্যালাওয়েন্স থেকে `amount` কেটে নেওয়া হয়। + * + * অপারেশনটি সফল হয়েছে কিনা তা নির্দেশ করে একটি বুলিয়ান মান ফেরত দেয়। + * + * একটি {Transfer} ইভেন্ট নির্গত করে। + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); +``` + +অবশেষে, `transferFrom` স্পেন্ডার দ্বারা অ্যালাওয়েন্সটি খরচ করার জন্য ব্যবহৃত হয়। + +  + +```solidity + + /** + * @dev যখন `value` টোকেন এক অ্যাকাউন্ট (`from`) থেকে + * অন্য অ্যাকাউন্টে (`to`) সরানো হয়, তখন নির্গত হয়। + * + * মনে রাখবেন `value` শূন্য হতে পারে। + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev যখন {approve}-এ একটি কলের মাধ্যমে `owner`-এর জন্য একটি `spender`-এর অ্যালাওয়েন্স সেট করা হয় তখন নির্গত হয়। `value` হল নতুন অ্যালাওয়েন্স। + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} +``` + +ERC-20 কন্ট্র্যাক্টের স্টেট পরিবর্তন হলে এই ইভেন্টগুলি নির্গত হয়। + +## আসল কন্ট্র্যাক্ট {#the-actual-contract} + +এটি হল আসল কন্ট্র্যাক্ট যা ERC-20 স্ট্যান্ডার্ড ইমপ্লিমেন্ট করে, +[এখান থেকে নেওয়া হয়েছে](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)। +এটি যেমন আছে তেমন ব্যবহারের জন্য নয়, তবে আপনি এটিকে ব্যবহারযোগ্য কিছুতে প্রসারিত করতে এটির থেকে +[ইনহেরিট](https://www.tutorialspoint.com/solidity/solidity_inheritance.htm) করতে পারেন। + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >=0.6.0 <0.8.0; +``` + +  + +### ইম্পোর্ট স্টেটমেন্ট {#import-statements} + +উপরের ইন্টারফেস সংজ্ঞা ছাড়াও, কন্ট্র্যাক্ট সংজ্ঞাটি অন্য দুটি ফাইল ইম্পোর্ট করে: + +```solidity + +import "../../GSN/Context.sol"; +import "./IERC20.sol"; +import "../../math/SafeMath.sol"; +``` + +- `GSN/Context.sol` হল [OpenGSN](https://www.opengsn.org/) ব্যবহার করার জন্য প্রয়োজনীয় সংজ্ঞা, এটি এমন একটি সিস্টেম যা ইথার ছাড়া ব্যবহারকারীদের ব্লকচেইন ব্যবহার করার অনুমতি দেয়। মনে রাখবেন এটি একটি পুরানো সংস্করণ, আপনি যদি OpenGSN-এর সাথে ইন্টিগ্রেট করতে চান তবে [এই টিউটোরিয়ালটি ব্যবহার করুন](https://docs.opengsn.org/javascript-client/tutorial.html)। +- [SafeMath লাইব্রেরি](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/), যা সলিডিটি সংস্করণ **<0.8.0**-এর জন্য অ্যারিথমেটিক ওভারফ্লো/আন্ডারফ্লো প্রতিরোধ করে। সলিডিটি ≥0.8.0-তে, অ্যারিথমেটিক অপারেশনগুলি ওভারফ্লো/আন্ডারফ্লোতে স্বয়ংক্রিয়ভাবে রিভার্ট হয়, যা SafeMath-কে অপ্রয়োজনীয় করে তোলে। এই কন্ট্র্যাক্টটি পুরানো কম্পাইলার সংস্করণগুলির সাথে ব্যাকওয়ার্ড সামঞ্জস্যের জন্য SafeMath ব্যবহার করে। + +  + +এই মন্তব্যটি কন্ট্র্যাক্টের উদ্দেশ্য ব্যাখ্যা করে। + +```solidity +/** + * @dev {IERC20} ইন্টারফেসের ইমপ্লিমেন্টেশন। + * + * এই ইমপ্লিমেন্টেশনটি টোকেনগুলি কীভাবে তৈরি হয় সে সম্পর্কে অ্যাগনস্টিক। এর মানে হল + * যে একটি সাপ্লাই মেকানিজম একটি ডিরাইভড কন্ট্র্যাক্টে {_mint} ব্যবহার করে যোগ করতে হবে। + * একটি জেনেরিক মেকানিজমের জন্য {ERC20PresetMinterPauser} দেখুন। + * + * টিপ: একটি বিস্তারিত লেখার জন্য আমাদের গাইড দেখুন + * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[কীভাবে + * সাপ্লাই মেকানিজম ইমপ্লিমেন্ট করবেন]। + * + * আমরা সাধারণ OpenZeppelin নির্দেশিকা অনুসরণ করেছি: ফাংশনগুলি ব্যর্থ হলে `false` ফেরত দেওয়ার পরিবর্তে রিভার্ট করে। + * এই আচরণটি প্রচলিত এবং ERC20 অ্যাপ্লিকেশনগুলির প্রত্যাশার সাথে বিরোধ করে না। + * + * এছাড়াও, {transferFrom}-এ কল করার সময় একটি {Approval} ইভেন্ট নির্গত হয়। + * এটি অ্যাপ্লিকেশনগুলিকে শুধুমাত্র উক্ত ইভেন্টগুলি শুনে সমস্ত অ্যাকাউন্টের জন্য অ্যালাওয়েন্স পুনর্গঠন করার অনুমতি দেয়। + * EIP-এর অন্যান্য ইমপ্লিমেন্টেশন এই ইভেন্টগুলি নির্গত নাও করতে পারে, কারণ এটি স্পেসিফিকেশন দ্বারা প্রয়োজন হয় না। + * + * অবশেষে, অ্যালাওয়েন্স সেট করার আশেপাশে সুপরিচিত সমস্যাগুলি প্রশমিত করার জন্য নন-স্ট্যান্ডার্ড {decreaseAllowance} এবং {increaseAllowance} ফাংশনগুলি যোগ করা হয়েছে। + * {IERC20-approve} দেখুন। + */ + +``` + +### কন্ট্র্যাক্ট সংজ্ঞা {#contract-definition} + +```solidity +contract ERC20 is Context, IERC20 { +``` + +এই লাইনটি ইনহেরিট্যান্স নির্দিষ্ট করে, এই ক্ষেত্রে উপরের `IERC20` থেকে এবং OpenGSN-এর জন্য `Context` থেকে। + +  + +```solidity + + using SafeMath for uint256; + +``` + +এই লাইনটি `uint256` টাইপের সাথে `SafeMath` লাইব্রেরি সংযুক্ত করে। আপনি এই লাইব্রেরিটি +[এখানে](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol) খুঁজে পেতে পারেন। + +### ভেরিয়েবল সংজ্ঞা {#variable-definitions} + +এই সংজ্ঞাগুলি কন্ট্র্যাক্টের স্টেট ভেরিয়েবলগুলি নির্দিষ্ট করে। এই ভেরিয়েবলগুলিকে `private` হিসাবে ঘোষণা করা হয়েছে, তবে এর মানে হল যে ব্লকচেইনের অন্যান্য কন্ট্র্যাক্টগুলি সেগুলি পড়তে পারে না। _ব্লকচেইনে কোনো গোপনীয়তা নেই_, প্রতিটি নোডের সফটওয়্যার প্রতিটি ব্লকে প্রতিটি কন্ট্র্যাক্টের স্টেট ধারণ করে। প্রচলিত নিয়ম অনুযায়ী, স্টেট ভেরিয়েবলগুলির নামকরণ করা হয় `_`। + +প্রথম দুটি ভেরিয়েবল হল [ম্যাপিং](https://www.tutorialspoint.com/solidity/solidity_mappings.htm), যার অর্থ তারা প্রায় [অ্যাসোসিয়েটিভ অ্যারে](https://wikipedia.org/wiki/Associative_array)-এর মতো আচরণ করে, তবে এখানে কীগুলো নিউমেরিক ভ্যালু। স্টোরেজ শুধুমাত্র সেই এন্ট্রিগুলির জন্য বরাদ্দ করা হয় যেগুলির মান ডিফল্ট (শূন্য) থেকে ভিন্ন। + +```solidity + mapping (address => uint256) private _balances; +``` + +প্রথম ম্যাপিং, `_balances`, হল অ্যাড্রেস এবং এই টোকেনে তাদের নিজ নিজ ব্যালেন্স। ব্যালেন্স অ্যাক্সেস করতে, এই সিনট্যাক্সটি ব্যবহার করুন: `_balances[
]`। + +  + +```solidity + mapping (address => mapping (address => uint256)) private _allowances; +``` + +এই ভেরিয়েবল, `_allowances`, আগে ব্যাখ্যা করা অ্যালাওয়েন্সগুলো সংরক্ষণ করে। প্রথম ইন্ডেক্স হল টোকেনের মালিক, এবং দ্বিতীয়টি হল অ্যালাওয়েন্স সহ কন্ট্র্যাক্ট। অ্যাড্রেস B-এর অ্যাকাউন্ট থেকে অ্যাড্রেস A কত খরচ করতে পারে তা অ্যাক্সেস করতে, `_allowances[B][A]` ব্যবহার করুন। + +  + +```solidity + uint256 private _totalSupply; +``` + +নাম থেকেই বোঝা যাচ্ছে, এই ভেরিয়েবলটি টোকেনের মোট সরবরাহের হিসাব রাখে। + +  + +```solidity + string private _name; + string private _symbol; + uint8 private _decimals; +``` + +এই তিনটি ভেরিয়েবল পঠনযোগ্যতা উন্নত করতে ব্যবহৃত হয়। প্রথম দুটি স্ব-ব্যাখ্যামূলক, কিন্তু `_decimals` নয়। + +একদিকে, ইথেরিয়ামের কোনো ফ্লোটিং পয়েন্ট বা ভগ্নাংশ ভেরিয়েবল নেই। অন্যদিকে, মানুষ টোকেন ভাগ করতে পছন্দ করে। লোকেরা মুদ্রার জন্য সোনা বেছে নেওয়ার একটি কারণ হল, যখন কেউ একটি গরুর মূল্যের সমপরিমাণ হাঁস কিনতে চায়, তখন পরিবর্তন করা কঠিন ছিল। + +সমাধান হল পূর্ণসংখ্যার হিসাব রাখা, কিন্তু আসল টোকেনের পরিবর্তে এমন একটি ভগ্নাংশ টোকেন গণনা করা যা প্রায় মূল্যহীন। ইথারের ক্ষেত্রে, ভগ্নাংশ টোকেনটিকে wei বলা হয়, এবং 10^18 wei এক ETH-এর সমান। লেখার সময়, 10,000,000,000,000 wei প্রায় এক মার্কিন বা ইউরো সেন্টের সমান। + +অ্যাপ্লিকেশনগুলিকে জানতে হবে কীভাবে টোকেন ব্যালেন্স প্রদর্শন করতে হয়। যদি একজন ব্যবহারকারীর কাছে 3,141,000,000,000,000,000 wei থাকে, তাহলে সেটা কি 3.14 ETH? 31.41 ETH? 3,141 ETH? ইথারের ক্ষেত্রে এটি 10^18 wei প্রতি ETH হিসাবে সংজ্ঞায়িত, কিন্তু আপনার টোকেনের জন্য আপনি একটি ভিন্ন মান নির্বাচন করতে পারেন। যদি টোকেন ভাগ করার কোনো মানে না হয়, আপনি শূন্যের একটি `_decimals` মান ব্যবহার করতে পারেন। আপনি যদি ETH-এর মতো একই স্ট্যান্ডার্ড ব্যবহার করতে চান, তাহলে **18** মানটি ব্যবহার করুন। + +### কনস্ট্রাক্টর {#the-constructor} + +```solidity + /** + * @dev {name} এবং {symbol}-এর জন্য মান সেট করে, {decimals}-কে 18-এর একটি ডিফল্ট মান দিয়ে ইনিশিয়ালাইজ করে। + * + * {decimals}-এর জন্য একটি ভিন্ন মান নির্বাচন করতে, {_setupDecimals} ব্যবহার করুন। + * + * এই তিনটি মানই অপরিবর্তনীয়: এগুলি শুধুমাত্র নির্মাণের সময় একবার সেট করা যেতে পারে। + */ + constructor (string memory name_, string memory symbol_) public { + // সলিডিটি ≥0.7.0-তে, 'public' অন্তর্নিহিত এবং বাদ দেওয়া যেতে পারে। + + _name = name_; + _symbol = symbol_; + _decimals = 18; + } +``` + +কনস্ট্রাক্টরটি প্রথমবার কন্ট্র্যাক্ট তৈরি করার সময় কল করা হয়। প্রচলিত নিয়ম অনুযায়ী, ফাংশন প্যারামিটারগুলির নামকরণ করা হয় `_`। + +### ইউজার ইন্টারফেস ফাংশন {#user-interface-functions} + +```solidity + /** + * @dev টোকেনের নাম ফেরত দেয়। + */ + function name() public view returns (string memory) { + return _name; + } + + /** + * @dev টোকেনের প্রতীক ফেরত দেয়, সাধারণত নামের একটি সংক্ষিপ্ত সংস্করণ। + */ + function symbol() public view returns (string memory) { + return _symbol; + } + + /** + * @dev ব্যবহারকারীর কাছে এর উপস্থাপনা পেতে ব্যবহৃত দশমিকের সংখ্যা ফেরত দেয়। + * উদাহরণস্বরূপ, যদি `decimals` `2` এর সমান হয়, তাহলে `505` টোকেনের একটি ব্যালেন্স + * একজন ব্যবহারকারীকে `5,05` (`505 / 10 ** 2`) হিসাবে প্রদর্শন করা উচিত। + * + * টোকেনগুলি সাধারণত 18-এর একটি মান বেছে নেয়, যা ইথার এবং wei-এর মধ্যেকার সম্পর্কের অনুকরণ করে। + * এটিই সেই মান যা {ERC20} ব্যবহার করে, যদি না {_setupDecimals} কল করা হয়। + * + * দ্রষ্টব্য: এই তথ্যটি শুধুমাত্র _প্রদর্শনের_ উদ্দেশ্যে ব্যবহৃত হয়: এটি কোনোভাবেই + * কন্ট্র্যাক্টের কোনো গাণিতিক ক্রিয়াকলাপকে প্রভাবিত করে না, যার মধ্যে + * {IERC20-balanceOf} এবং {IERC20-transfer} অন্তর্ভুক্ত। + */ + function decimals() public view returns (uint8) { + return _decimals; + } +``` + +এই ফাংশনগুলি, `name`, `symbol`, এবং `decimals` ইউজার ইন্টারফেসগুলিকে আপনার কন্ট্র্যাক্ট সম্পর্কে জানতে সাহায্য করে যাতে তারা এটি সঠিকভাবে প্রদর্শন করতে পারে। + +রিটার্ন টাইপ হল `string memory`, যার অর্থ মেমরিতে সংরক্ষিত একটি স্ট্রিং ফেরত দেওয়া। ভেরিয়েবল, যেমন স্ট্রিং, তিনটি স্থানে সংরক্ষণ করা যেতে পারে: + +| | জীবনকাল | কন্ট্র্যাক্ট অ্যাক্সেস | গ্যাস খরচ | +| ---------- | ------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------ | +| মেমরি | ফাংশন কল | পড়া/লেখা | দশ বা শত (উচ্চতর অবস্থানের জন্য উচ্চতর) | +| Calldata | ফাংশন কল | শুধুমাত্র পঠনযোগ্য | রিটার্ন টাইপ হিসাবে ব্যবহার করা যাবে না, শুধুমাত্র একটি ফাংশন প্যারামিটার টাইপ হিসাবে ব্যবহার করা যাবে | +| সংগ্রহস্থল | পরিবর্তন না হওয়া পর্যন্ত | পড়া/লেখা | উচ্চ (পড়ার জন্য 800, লেখার জন্য 20k) | + +এই ক্ষেত্রে, `memory` হল সেরা পছন্দ। + +### টোকেন তথ্য পড়ুন {#read-token-information} + +এগুলি হল এমন ফাংশন যা টোকেন সম্পর্কে তথ্য প্রদান করে, হয় মোট সরবরাহ বা একটি অ্যাকাউন্টের ব্যালেন্স। + +```solidity + /** + * @dev {IERC20-totalSupply} দেখুন। + */ + function totalSupply() public view override returns (uint256) { + return _totalSupply; + } +``` + +`totalSupply` ফাংশনটি টোকেনের মোট সরবরাহ ফেরত দেয়। + +  + +```solidity + /** + * @dev {IERC20-balanceOf} দেখুন। + */ + function balanceOf(address account) public view override returns (uint256) { + return _balances[account]; + } +``` + +একটি অ্যাকাউন্টের ব্যালেন্স পড়ুন। মনে রাখবেন যে যে কেউ অন্য কারো অ্যাকাউন্টের ব্যালেন্স পেতে পারে। এই তথ্যটি লুকানোর চেষ্টা করার কোনো মানে নেই, কারণ এটি যাইহোক প্রতিটি নোডে উপলব্ধ। _ব্লকচেইনে কোনো গোপনীয়তা নেই।_ + +### টোকেন স্থানান্তর করুন {#transfer-tokens} + +```solidity + /** + * @dev {IERC20-transfer} দেখুন। + * + * প্রয়োজনীয়তা: + * + * - `recipient` শূন্য অ্যাড্রেস হতে পারবে না। + * - কলারের কাছে কমপক্ষে `amount` পরিমাণ ব্যালেন্স থাকতে হবে। + */ + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { +``` + +`transfer` ফাংশনটি প্রেরকের অ্যাকাউন্ট থেকে একটি ভিন্ন অ্যাকাউন্টে টোকেন স্থানান্তর করার জন্য কল করা হয়। মনে রাখবেন যে যদিও এটি একটি বুলিয়ান মান ফেরত দেয়, সেই মানটি সবসময় **সত্য**। যদি স্থানান্তর ব্যর্থ হয় তবে কন্ট্র্যাক্ট কলটি রিভার্ট করে। + +  + +```solidity + _transfer(_msgSender(), recipient, amount); + return true; + } +``` + +`_transfer` ফাংশনটি আসল কাজটি করে। এটি একটি প্রাইভেট ফাংশন যা শুধুমাত্র অন্যান্য কন্ট্র্যাক্ট ফাংশন দ্বারা কল করা যেতে পারে। প্রচলিত নিয়ম অনুযায়ী প্রাইভেট ফাংশনগুলির নামকরণ করা হয় `_`, স্টেট ভেরিয়েবলগুলির মতোই। + +সাধারণত সলিডিটিতে আমরা মেসেজ প্রেরকের জন্য `msg.sender` ব্যবহার করি। যাইহোক, এটি [OpenGSN](http://opengsn.org/)-কে ব্রেক করে। যদি আমরা আমাদের টোকেন দিয়ে ইথারবিহীন লেনদেনের অনুমতি দিতে চাই, তাহলে আমাদের `_msgSender()` ব্যবহার করতে হবে। এটি সাধারণ লেনদেনের জন্য `msg.sender` ফেরত দেয়, কিন্তু ইথারবিহীন লেনদেনের জন্য আসল সাইনারকে ফেরত দেয় এবং মেসেজ রিলে করা কন্ট্র্যাক্টকে নয়। + +### অ্যালাওয়েন্স ফাংশন {#allowance-functions} + +এগুলি হল সেই ফাংশন যা অ্যালাওয়েন্স কার্যকারিতা ইমপ্লিমেন্ট করে: `allowance`, `approve`, `transferFrom`, এবং `_approve`। এছাড়াও, OpenZeppelin ইমপ্লিমেন্টেশন মৌলিক স্ট্যান্ডার্ডের বাইরে গিয়ে কিছু বৈশিষ্ট্য অন্তর্ভুক্ত করে যা নিরাপত্তা উন্নত করে: `increaseAllowance`, এবং `decreaseAllowance`। + +#### অ্যালাওয়েন্স ফাংশন {#allowance} + +```solidity + /** + * @dev {IERC20-allowance} দেখুন। + */ + function allowance(address owner, address spender) public view virtual override returns (uint256) { + return _allowances[owner][spender]; + } +``` + +`allowance` ফাংশনটি প্রত্যেককে যেকোনো অ্যালাওয়েন্স পরীক্ষা করার অনুমতি দেয়। + +#### অ্যাপ্রুভ ফাংশন {#approve} + +```solidity + /** + * @dev {IERC20-approve} দেখুন। + * + * প্রয়োজনীয়তা: + * + * - `spender` শূন্য অ্যাড্রেস হতে পারবে না। + */ + function approve(address spender, uint256 amount) public virtual override returns (bool) { +``` + +এই ফাংশনটি একটি অ্যালাওয়েন্স তৈরি করার জন্য কল করা হয়। এটি উপরের `transfer` ফাংশনের অনুরূপ: + +- ফাংশনটি শুধু একটি অভ্যন্তরীণ ফাংশন কল করে (এই ক্ষেত্রে, `_approve`) যা আসল কাজটি করে। +- ফাংশনটি হয় `true` ফেরত দেয় (যদি সফল হয়) অথবা রিভার্ট করে (যদি না হয়)। + +  + +```solidity + _approve(_msgSender(), spender, amount); + return true; + } +``` + +আমরা অভ্যন্তরীণ ফাংশন ব্যবহার করি যাতে স্টেট পরিবর্তনের স্থানগুলির সংখ্যা কমানো যায়। _যেকোনো_ ফাংশন যা স্টেট পরিবর্তন করে তা একটি সম্ভাব্য নিরাপত্তা ঝুঁকি যা নিরাপত্তার জন্য অডিট করা প্রয়োজন। এইভাবে আমাদের ভুল করার সম্ভাবনা কম থাকে। + +#### transferFrom ফাংশন {#transferFrom} + +এটি হল সেই ফাংশন যা একজন স্পেন্ডার একটি অ্যালাওয়েন্স খরচ করার জন্য কল করে। এর জন্য দুটি অপারেশন প্রয়োজন: খরচ করা পরিমাণ স্থানান্তর করা এবং সেই পরিমাণ দ্বারা অ্যালাওয়েন্স কমানো। + +```solidity + /** + * @dev {IERC20-transferFrom} দেখুন। + * + * আপডেট করা অ্যালাওয়েন্স নির্দেশ করে একটি {Approval} ইভেন্ট নির্গত করে। এটি + * EIP দ্বারা প্রয়োজন হয় না। {ERC20}-এর শুরুতে নোটটি দেখুন। + * + * প্রয়োজনীয়তা: + * + * - `sender` এবং `recipient` শূন্য অ্যাড্রেস হতে পারবে না। + * - `sender`-এর কাছে কমপক্ষে `amount` পরিমাণ ব্যালেন্স থাকতে হবে। + * - কলারের কাছে ``sender``-এর টোকেনের জন্য কমপক্ষে `amount` পরিমাণ + * অ্যালাওয়েন্স থাকতে হবে। + */ + function transferFrom(address sender, address recipient, uint256 amount) public virtual + override returns (bool) { + _transfer(sender, recipient, amount); +``` + +  + +`a.sub(b, "message")` ফাংশন কল দুটি কাজ করে। প্রথমত, এটি `a-b` গণনা করে, যা নতুন অ্যালাওয়েন্স। +দ্বিতীয়ত, এটি পরীক্ষা করে যে এই ফলাফলটি নেতিবাচক নয়। যদি এটি নেতিবাচক হয় তবে কলটি প্রদত্ত বার্তা সহ রিভার্ট করে। মনে রাখবেন যে যখন একটি কল রিভার্ট করে তখন সেই কলের সময় আগে করা যেকোনো প্রক্রিয়াকরণ উপেক্ষা করা হয় তাই আমাদের `_transfer` আনডু করার প্রয়োজন নেই। + +```solidity + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, + "ERC20: transfer amount exceeds allowance")); + return true; + } +``` + +#### OpenZeppelin নিরাপত্তা সংযোজন {#openzeppelin-safety-additions} + +একটি নন-জিরো অ্যালাওয়েন্সকে অন্য একটি নন-জিরো মানে সেট করা বিপজ্জনক, কারণ আপনি শুধুমাত্র আপনার নিজের লেনদেনের ক্রম নিয়ন্ত্রণ করেন, অন্য কারো নয়। কল্পনা করুন আপনার দুজন ব্যবহারকারী আছে, এলিস যে সাদাসিধে এবং বিল যে অসৎ। এলিস বিলের কাছ থেকে কিছু পরিষেবা চায়, যা তার মতে পাঁচ টোকেন মূল্যের - তাই সে বিলকে পাঁচ টোকেনের অ্যালাওয়েন্স দেয়। + +তারপর কিছু পরিবর্তন হয় এবং বিলের দাম দশ টোকেনে বেড়ে যায়। এলিস, যে এখনও পরিষেবাটি চায়, একটি লেনদেন পাঠায় যা বিলের অ্যালাওয়েন্স দশ-এ সেট করে। বিল লেনদেন পুলে এই নতুন লেনদেনটি দেখার সাথে সাথে একটি লেনদেন পাঠায় যা এলিসের পাঁচ টোকেন খরচ করে এবং যার গ্যাস মূল্য অনেক বেশি যাতে এটি দ্রুত মাইনিং করা হয়। এইভাবে বিল প্রথমে পাঁচ টোকেন খরচ করতে পারে এবং তারপর, এলিসের নতুন অ্যালাওয়েন্স মাইনিং হয়ে গেলে, আরও দশ টোকেন খরচ করতে পারে, মোট পনেরো টোকেনের জন্য, যা এলিস অনুমোদন করতে চেয়েছিল তার চেয়ে বেশি। এই কৌশলটিকে +[ফ্রন্ট-রানিং](https://consensysdiligence.github.io/smart-contract-best-practices/attacks/#front-running) বলা হয়। + +| এলিস লেনদেন | এলিস নন্স | বিল লেনদেন | বিল নন্স | বিলের অ্যালাওয়েন্স | এলিসের কাছ থেকে বিলের মোট আয় | +| ------------------------------------ | --------- | ------------------------------------------------ | -------- | ------------------ | ----------------------------- | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | +| approve(Bill, 10) | 11 | | | 10 | 5 | +| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 15 | + +এই সমস্যাটি এড়াতে, এই দুটি ফাংশন (`increaseAllowance` এবং `decreaseAllowance`) আপনাকে একটি নির্দিষ্ট পরিমাণ দ্বারা অ্যালাওয়েন্স পরিবর্তন করার অনুমতি দেয়। সুতরাং যদি বিল ইতিমধ্যে পাঁচ টোকেন খরচ করে ফেলে, সে কেবল আরও পাঁচ টোকেন খরচ করতে পারবে। সময়ের উপর নির্ভর করে, এটি দুটি উপায়ে কাজ করতে পারে, যার উভয়টিতেই বিল শুধুমাত্র দশটি টোকেন পায়: + +A: + +| এলিস লেনদেন | এলিস নন্স | বিল লেনদেন | বিল নন্স | বিলের অ্যালাওয়েন্স | এলিসের কাছ থেকে বিলের মোট আয় | +| --------------------------------------------- | --------: | ----------------------------------------------- | -------: | -----------------: | ----------------------------- | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| | | transferFrom(Alice, Bill, 5) | 10,123 | 0 | 5 | +| increaseAllowance(Bill, 5) | 11 | | | 0+5 = 5 | 5 | +| | | transferFrom(Alice, Bill, 5) | 10,124 | 0 | 10 | + +B: + +| এলিস লেনদেন | এলিস নন্স | বিল লেনদেন | বিল নন্স | বিলের অ্যালাওয়েন্স | এলিসের কাছ থেকে বিলের মোট আয় | +| --------------------------------------------- | --------: | ------------------------------------------------ | -------: | -----------------: | ----------------------------: | +| approve(Bill, 5) | 10 | | | 5 | 0 | +| increaseAllowance(Bill, 5) | 11 | | | 5+5 = 10 | 0 | +| | | transferFrom(Alice, Bill, 10) | 10,124 | 0 | 10 | + +```solidity + /** + * @dev কলার দ্বারা স্পেন্ডারকে প্রদত্ত অ্যালাওয়েন্স অ্যাটমিকভাবে বৃদ্ধি করে। + * + * এটি {approve}-এর একটি বিকল্প যা {IERC20-approve}-এ বর্ণিত সমস্যাগুলির জন্য একটি প্রশমন হিসাবে ব্যবহার করা যেতে পারে। + * + * আপডেট করা অ্যালাওয়েন্স নির্দেশ করে একটি {Approval} ইভেন্ট নির্গত করে। + * + * প্রয়োজনীয়তা: + * + * - `spender` শূন্য অ্যাড্রেস হতে পারবে না। + */ + function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); + return true; + } +``` + +`a.add(b)` ফাংশনটি একটি নিরাপদ যোগ। অসম্ভাব্য ক্ষেত্রে যে `a`+`b`>=`2^256` হয়, এটি সাধারণ যোগের মতো মোড়ানো হয় না। + +```solidity + + /** + * @dev কলার দ্বারা স্পেন্ডারকে প্রদত্ত অ্যালাওয়েন্স অ্যাটমিকভাবে হ্রাস করে। + * + * এটি {approve}-এর একটি বিকল্প যা {IERC20-approve}-এ বর্ণিত সমস্যাগুলির জন্য একটি প্রশমন হিসাবে ব্যবহার করা যেতে পারে। + * + * আপডেট করা অ্যালাওয়েন্স নির্দেশ করে একটি {Approval} ইভেন্ট নির্গত করে। + * + * প্রয়োজনীয়তা: + * + * - `spender` শূন্য অ্যাড্রেস হতে পারবে না। + * - `spender`-এর কাছে কলারের জন্য কমপক্ষে + * `subtractedValue` পরিমাণ অ্যালাওয়েন্স থাকতে হবে। + */ + function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { + _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, + "ERC20: decreased allowance below zero")); + return true; + } +``` + +### টোকেন তথ্য পরিবর্তনকারী ফাংশন {#functions-that-modify-token-information} + +এগুলি হল সেই চারটি ফাংশন যা আসল কাজটি করে: `_transfer`, `_mint`, `_burn`, এবং `_approve`। + +#### _transfer ফাংশন {#_transfer} + +```solidity + /** + * @dev `sender` থেকে `recipient`-এর কাছে `amount` পরিমাণ টোকেন পাঠায়। + * + * এই ইন্টারনাল ফাংশনটি {transfer}-এর সমতুল্য, এবং এটি ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ, + * স্বয়ংক্রিয় টোকেন ফি, স্ল্যাশিং মেকানিজম ইত্যাদি ইমপ্লিমেন্ট করার জন্য। + * + * একটি {Transfer} ইভেন্ট নির্গত করে। + * + * প্রয়োজনীয়তা: + * + * - `sender` শূন্য অ্যাড্রেস হতে পারবে না। + * - `recipient` শূন্য অ্যাড্রেস হতে পারবে না। + * - `sender`-এর কাছে কমপক্ষে `amount` পরিমাণ ব্যালেন্স থাকতে হবে। + */ + function _transfer(address sender, address recipient, uint256 amount) internal virtual { +``` + +এই ফাংশন, `_transfer`, এক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে টোকেন স্থানান্তর করে। এটি `transfer` (প্রেরকের নিজের অ্যাকাউন্ট থেকে স্থানান্তরের জন্য) এবং `transferFrom` (অন্য কারো অ্যাকাউন্ট থেকে স্থানান্তর করতে অ্যালাওয়েন্স ব্যবহার করার জন্য) উভয় দ্বারাই কল করা হয়। + +  + +```solidity + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); +``` + +ইথেরিয়ামে আসলে কেউ শূন্য অ্যাড্রেসের মালিক নয় (অর্থাৎ, কেউ এমন একটি ব্যক্তিগত কী জানে না যার ম্যাচিং পাবলিক কী শূন্য অ্যাড্রেসে রূপান্তরিত হয়)। লোকেরা যখন সেই অ্যাড্রেস ব্যবহার করে, তখন এটি সাধারণত একটি সফটওয়্যার বাগ - তাই প্রেরক বা প্রাপক হিসাবে শূন্য অ্যাড্রেস ব্যবহার করা হলে আমরা ব্যর্থ হই। + +  + +```solidity + _beforeTokenTransfer(sender, recipient, amount); + +``` + +এই কন্ট্র্যাক্টটি ব্যবহার করার দুটি উপায় আছে: + +1. আপনার নিজের কোডের জন্য এটি একটি টেমপ্লেট হিসাবে ব্যবহার করুন +2. [এটির থেকে ইনহেরিট করুন](https://www.bitdegree.org/learn/solidity-inheritance), এবং শুধুমাত্র সেই ফাংশনগুলি ওভাররাইড করুন যা আপনাকে পরিবর্তন করতে হবে + +দ্বিতীয় পদ্ধতিটি অনেক ভালো কারণ OpenZeppelin ERC-20 কোডটি ইতিমধ্যে অডিট করা হয়েছে এবং নিরাপদ হিসাবে দেখানো হয়েছে। আপনি যখন ইনহেরিট্যান্স ব্যবহার করেন তখন এটি স্পষ্ট হয় যে আপনি কোন ফাংশনগুলি পরিবর্তন করছেন, এবং আপনার কন্ট্র্যাক্টকে বিশ্বাস করতে লোকেদের শুধুমাত্র সেই নির্দিষ্ট ফাংশনগুলি অডিট করতে হবে। + +প্রতিবার টোকেন হাত বদলানোর সময় একটি ফাংশন সম্পাদন করা প্রায়শই দরকারী। যাইহোক, `_transfer` একটি অত্যন্ত গুরুত্বপূর্ণ ফাংশন এবং এটিকে অনিরাপদভাবে লেখা সম্ভব (নীচে দেখুন), তাই এটি ওভাররাইড না করাই ভাল। সমাধান হল `_beforeTokenTransfer`, একটি [হুক ফাংশন](https://wikipedia.org/wiki/Hooking)। আপনি এই ফাংশনটি ওভাররাইড করতে পারেন, এবং এটি প্রতিটি স্থানান্তরে কল করা হবে। + +  + +```solidity + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); +``` + +এগুলি হল সেই লাইন যা আসলে স্থানান্তর করে। মনে রাখবেন যে তাদের মধ্যে **কিছুই** নেই, এবং আমরা প্রাপকের কাছে যোগ করার আগে প্রেরকের কাছ থেকে স্থানান্তরিত পরিমাণ বিয়োগ করি। এটি গুরুত্বপূর্ণ কারণ যদি মাঝখানে একটি ভিন্ন কন্ট্র্যাক্টে একটি কল থাকত, তবে এটি এই কন্ট্র্যাক্টকে প্রতারণা করতে ব্যবহার করা যেতে পারত। এইভাবে স্থানান্তরটি অ্যাটমিক, এর মাঝখানে কিছুই ঘটতে পারে না। + +  + +```solidity + emit Transfer(sender, recipient, amount); + } +``` + +অবশেষে, একটি `Transfer` ইভেন্ট নির্গত করুন। ইভেন্টগুলি স্মার্ট কন্ট্র্যাক্টগুলিতে অ্যাক্সেসযোগ্য নয়, কিন্তু ব্লকচেইনের বাইরে চলমান কোড ইভেন্টগুলি শুনতে পারে এবং সেগুলিতে প্রতিক্রিয়া জানাতে পারে। উদাহরণস্বরূপ, একটি ওয়ালেট যখন মালিক আরও টোকেন পায় তখন তার হিসাব রাখতে পারে। + +#### _mint এবং _burn ফাংশন {#_mint-and-_burn} + +এই দুটি ফাংশন (`_mint` এবং `_burn`) টোকেনের মোট সরবরাহ পরিবর্তন করে। +এগুলি অভ্যন্তরীণ এবং এই কন্ট্র্যাক্টে তাদের কল করার জন্য কোনো ফাংশন নেই, তাই এগুলি শুধুমাত্র তখনই কার্যকর যখন আপনি কন্ট্র্যাক্ট থেকে ইনহেরিট করেন এবং নতুন টোকেন মিন্ট করার বা বিদ্যমান টোকেনগুলি বার্ন করার শর্তগুলি নির্ধারণের জন্য আপনার নিজস্ব লজিক যুক্ত করেন। + +**দ্রষ্টব্য:** প্রতিটি ERC-20 টোকেনের নিজস্ব ব্যবসায়িক যুক্তি রয়েছে যা টোকেন ব্যবস্থাপনাকে নির্দেশ করে। +উদাহরণস্বরূপ, একটি নির্দিষ্ট সরবরাহ কন্ট্র্যাক্ট শুধুমাত্র কনস্ট্রাক্টরে `_mint` কল করতে পারে এবং `_burn` কল নাও করতে পারে। একটি কন্ট্র্যাক্ট যা টোকেন বিক্রি করে, তা `_mint` কল করবে যখন এটি অর্থ প্রদান করা হয়, এবং সম্ভবত `_burn` কল করবে কিছু সময়ে অনিয়ন্ত্রিত মুদ্রাস্ফীতি এড়াতে। + +```solidity + /** @dev `amount` পরিমাণ টোকেন তৈরি করে এবং সেগুলোকে `account`-কে অ্যাসাইন করে, যা মোট সরবরাহ বাড়ায়। + * + * `from`-কে শূন্য অ্যাড্রেসে সেট করে একটি {Transfer} ইভেন্ট নির্গত করে। + * + * প্রয়োজনীয়তা: + * + * - `to` শূন্য অ্যাড্রেস হতে পারবে না। + */ + function _mint(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: mint to the zero address"); + _beforeTokenTransfer(address(0), account, amount); + _totalSupply = _totalSupply.add(amount); + _balances[account] = _balances[account].add(amount); + emit Transfer(address(0), account, amount); + } +``` + +টোকেনের মোট সংখ্যা পরিবর্তন হলে `_totalSupply` আপডেট করতে ভুলবেন না। + +  + +```solidity + /** + * @dev `account` থেকে `amount` পরিমাণ টোকেন নষ্ট করে, যা মোট সরবরাহ কমায়। + * + * `to`-কে শূন্য অ্যাড্রেসে সেট করে একটি {Transfer} ইভেন্ট নির্গত করে। + * + * প্রয়োজনীয়তা: + * + * - `account` শূন্য অ্যাড্রেস হতে পারবে না। + * - `account`-এর কাছে কমপক্ষে `amount` পরিমাণ টোকেন থাকতে হবে। + */ + function _burn(address account, uint256 amount) internal virtual { + require(account != address(0), "ERC20: burn from the zero address"); + + _beforeTokenTransfer(account, address(0), amount); + + _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); + _totalSupply = _totalSupply.sub(amount); + emit Transfer(account, address(0), amount); + } +``` + +`_burn` ফাংশনটি প্রায় `_mint`-এর মতোই, তবে এটি বিপরীত দিকে যায়। + +#### _approve ফাংশন {#_approve} + +এটি হল সেই ফাংশন যা আসলে অ্যালাওয়েন্স নির্দিষ্ট করে। মনে রাখবেন যে এটি একজন মালিককে এমন একটি অ্যালাওয়েন্স নির্দিষ্ট করার অনুমতি দেয় যা মালিকের বর্তমান ব্যালেন্সের চেয়ে বেশি। এটি ঠিক আছে কারণ ব্যালেন্সটি স্থানান্তরের সময় পরীক্ষা করা হয়, যখন এটি অ্যালাওয়েন্স তৈরি করার সময়কার ব্যালেন্স থেকে ভিন্ন হতে পারে। + +```solidity + /** + * @dev `spender`-এর `owner` টোকেনের উপর `amount`-কে অ্যালাওয়েন্স হিসাবে সেট করে। + * + * এই অভ্যন্তরীণ ফাংশনটি `approve`-এর সমতুল্য, এবং এটি ব্যবহার করা যেতে পারে, + * যেমন, নির্দিষ্ট সাবসিস্টেমের জন্য স্বয়ংক্রিয় অ্যালাওয়েন্স সেট করতে ইত্যাদি। + * + * একটি {Approval} ইভেন্ট নির্গত করে। + * + * প্রয়োজনীয়তা: + * + * - `owner` শূন্য অ্যাড্রেস হতে পারবে না। + * - `spender` শূন্য অ্যাড্রেস হতে পারবে না। + */ + function _approve(address owner, address spender, uint256 amount) internal virtual { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + + _allowances[owner][spender] = amount; +``` + +  + +একটি `Approval` ইভেন্ট নির্গত করুন। অ্যাপ্লিকেশনটি কীভাবে লেখা হয়েছে তার উপর নির্ভর করে, স্পেন্ডার কন্ট্র্যাক্টকে মালিক দ্বারা বা এই ইভেন্টগুলি শুনে এমন একটি সার্ভার দ্বারা অনুমোদনের বিষয়ে জানানো যেতে পারে। + +```solidity + emit Approval(owner, spender, amount); + } + +``` + +### ডেসিমাল ভেরিয়েবল পরিবর্তন করুন {#modify-the-decimals-variable} + +```solidity + + + /** + * @dev {decimals}-কে 18-এর ডিফল্ট মানের চেয়ে অন্য একটি মানে সেট করে। + * + * সতর্কতা: এই ফাংশনটি শুধুমাত্র কনস্ট্রাক্টর থেকে কল করা উচিত। টোকেন কন্ট্র্যাক্টগুলির সাথে ইন্টারঅ্যাক্ট করা বেশিরভাগ + * অ্যাপ্লিকেশন আশা করবে না যে {decimals} কখনো পরিবর্তন হবে, এবং যদি তা হয় তবে ভুলভাবে কাজ করতে পারে। + */ + function _setupDecimals(uint8 decimals_) internal { + _decimals = decimals_; + } +``` + +এই ফাংশনটি `_decimals` ভেরিয়েবলটি পরিবর্তন করে যা ইউজার ইন্টারফেসগুলিকে পরিমাণটি কীভাবে ব্যাখ্যা করতে হবে তা জানাতে ব্যবহৃত হয়। +আপনার এটি কনস্ট্রাক্টর থেকে কল করা উচিত। পরবর্তী কোনো সময়ে এটি কল করা অসততা হবে এবং অ্যাপ্লিকেশনগুলি এটি পরিচালনা করার জন্য ডিজাইন করা হয়নি। + +### হুকস {#hooks} + +```solidity + + /** + * @dev টোকেনের যেকোনো স্থানান্তরের আগে যে হুক কল করা হয়। এর মধ্যে মিন্টিং এবং বার্নিং অন্তর্ভুক্ত রয়েছে। + * + * কল করার শর্ত: + * + * - যখন `from` এবং `to` উভয়ই নন-জিরো হয়, তখন `from`-এর টোকেনের `amount` পরিমাণ `to`-কে স্থানান্তর করা হবে। + * - যখন `from` শূন্য হয়, তখন `to`-এর জন্য `amount` পরিমাণ টোকেন মিন্ট করা হবে। + * - যখন `to` শূন্য হয়, তখন `from`-এর টোকেনের `amount` পরিমাণ বার্ন করা হবে। + * - `from` এবং `to` কখনোই উভয়ই শূন্য হয় না। + * + * হুক সম্পর্কে আরও জানতে, xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]-এ যান। + */ + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } +``` + +এটি স্থানান্তরের সময় কল করার জন্য হুক ফাংশন। এটি এখানে খালি, কিন্তু যদি আপনার এটি কিছু করার প্রয়োজন হয় তবে আপনি শুধু এটি ওভাররাইড করুন। + +## উপসংহার {#conclusion} + +পর্যালোচনা করার জন্য, এখানে এই কন্ট্র্যাক্টের কিছু সবচেয়ে গুরুত্বপূর্ণ ধারণা দেওয়া হল (আমার মতে, আপনার মতামত ভিন্ন হতে পারে): + +- _ব্লকচেইনে কোনো গোপনীয়তা নেই_। যেকোনো তথ্য যা একটি স্মার্ট কন্ট্র্যাক্ট অ্যাক্সেস করতে পারে তা সমগ্র বিশ্বের জন্য উপলব্ধ। +- আপনি আপনার নিজের লেনদেনের ক্রম নিয়ন্ত্রণ করতে পারেন, কিন্তু অন্য লোকের লেনদেন কখন ঘটবে তা নয়। এই কারণেই একটি অ্যালাওয়েন্স পরিবর্তন করা বিপজ্জনক হতে পারে, কারণ এটি স্পেন্ডারকে উভয় অ্যালাওয়েন্সের যোগফল খরচ করার অনুমতি দেয়। +- `uint256` টাইপের মানগুলি মোড়ানো হয়। অন্য কথায়, _0-1=2^256-1_। যদি এটি কাঙ্ক্ষিত আচরণ না হয়, তাহলে আপনাকে এটি পরীক্ষা করতে হবে (অথবা SafeMath লাইব্রেরি ব্যবহার করতে হবে যা আপনার জন্য এটি করে)। মনে রাখবেন যে এটি [সলিডিটি 0.8.0](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html)-তে পরিবর্তিত হয়েছে। +- একটি নির্দিষ্ট ধরণের সমস্ত স্টেট পরিবর্তন একটি নির্দিষ্ট স্থানে করুন, কারণ এটি অডিটিং সহজ করে। + এই কারণেই আমাদের কাছে, উদাহরণস্বরূপ, `_approve` রয়েছে, যা `approve`, `transferFrom`, `increaseAllowance`, এবং `decreaseAllowance` দ্বারা কল করা হয়। +- স্টেট পরিবর্তনগুলি অ্যাটমিক হওয়া উচিত, তাদের মাঝখানে অন্য কোনো অ্যাকশন ছাড়াই (যেমন আপনি `_transfer`-এ দেখতে পারেন)। এর কারণ হল স্টেট পরিবর্তনের সময় আপনার একটি অসামঞ্জস্যপূর্ণ স্টেট থাকে। উদাহরণস্বরূপ, প্রেরকের ব্যালেন্স থেকে কর্তন করার সময় এবং প্রাপকের ব্যালেন্সে যোগ করার সময়ের মধ্যে যত টোকেন থাকা উচিত তার চেয়ে কম টোকেন存在 করে। যদি তাদের মধ্যে অপারেশন থাকে, বিশেষ করে একটি ভিন্ন কন্ট্র্যাক্টে কল, তবে এর সম্ভাব্য অপব্যবহার করা যেতে পারে। + +এখন যেহেতু আপনি দেখেছেন OpenZeppelin ERC-20 কন্ট্র্যাক্টটি কীভাবে লেখা হয়েছে, এবং বিশেষ করে কীভাবে এটি আরও নিরাপদ করা হয়েছে, যান এবং আপনার নিজের নিরাপদ কন্ট্র্যাক্ট এবং অ্যাপ্লিকেশনগুলি লিখুন। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। diff --git a/public/content/translations/bn/developers/tutorials/erc20-with-safety-rails/index.md b/public/content/translations/bn/developers/tutorials/erc20-with-safety-rails/index.md new file mode 100644 index 00000000000..590afab0898 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/erc20-with-safety-rails/index.md @@ -0,0 +1,217 @@ +--- +title: "সেফটি রেলস সহ ERC-20" +description: "লোকেদের বোকার মতো ভুল এড়াতে কীভাবে সাহায্য করবেন" +author: Ori Pomerantz +lang: bn +tags: [ "erc-20" ] +skill: beginner +published: 2022-08-15 +--- + +## ভূমিকা {#introduction} + +ইথেরিয়াম সম্পর্কে একটি দুর্দান্ত জিনিস হলো যে কোনও কেন্দ্রীয় কর্তৃপক্ষ নেই যা আপনার লেনদেন পরিবর্তন বা বাতিল করতে পারে। ইথেরিয়ামের একটি বড় সমস্যা হলো যে কোনও কেন্দ্রীয় কর্তৃপক্ষ নেই যার ব্যবহারকারীর ভুল বা অবৈধ লেনদেন বাতিল করার ক্ষমতা রয়েছে। এই নিবন্ধে আপনি [ERC-20](/developers/docs/standards/tokens/erc-20/) টোকেনগুলির সাথে ব্যবহারকারীরা যে সাধারণ ভুলগুলি করে সে সম্পর্কে জানতে পারবেন, সেইসাথে কীভাবে ERC-20 কন্ট্র্যাক্ট তৈরি করতে হয় যা ব্যবহারকারীদের সেই ভুলগুলি এড়াতে সাহায্য করে, বা যা একটি কেন্দ্রীয় কর্তৃপক্ষকে কিছু ক্ষমতা দেয় (উদাহরণস্বরূপ অ্যাকাউন্ট ফ্রিজ করার জন্য)। + +মনে রাখবেন যে আমরা [OpenZeppelin ERC-20 টোকেন কন্ট্র্যাক্ট](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20) ব্যবহার করব, এই নিবন্ধটি এটিকে খুব বিশদভাবে ব্যাখ্যা করে না। আপনি এই তথ্যটি [এখানে](/developers/tutorials/erc20-annotated-code) খুঁজে পেতে পারেন। + +আপনি যদি সম্পূর্ণ সোর্স কোড দেখতে চান: + +1. [Remix IDE](https://remix.ethereum.org/) খুলুন। +2. ক্লোন গিটহাব আইকনে ক্লিক করুন (![clone github icon](icon-clone.png))। +3. গিটহাব রিপোজিটরিটি `https://github.com/qbzzt/20220815-erc20-safety-rails` ক্লোন করুন। +4. **contracts > erc20-safety-rails.sol** খুলুন। + +## একটি ERC-20 কন্ট্র্যাক্ট তৈরি করা {#creating-an-erc-20-contract} + +সেফটি রেল ফাংশনালিটি যোগ করার আগে আমাদের একটি ERC-20 কন্ট্র্যাক্ট প্রয়োজন। এই নিবন্ধে আমরা [OpenZeppelin Contracts Wizard](https://docs.openzeppelin.com/contracts/5.x/wizard) ব্যবহার করব। এটি অন্য ব্রাউজারে খুলুন এবং এই নির্দেশাবলী অনুসরণ করুন: + +1. **ERC20** নির্বাচন করুন। + +2. এই সেটিংসগুলি লিখুন: + + | প্যারামিটার | মান | + | ------------------ | -------------------------------------------------------------- | + | নাম | SafetyRailsToken | + | প্রতীক | SAFE | + | Premint | আমরা প্রতি জোড়া টোকেনের জন্য একটির বেশি লিকুইডিটি পুল চাই না। | + | বৈশিষ্ট্য | কোনটি না | + | অ্যাক্সেস কন্ট্রোল | Ownable | + | আপগ্রেডিবিলিটি | কোনটি না | + +3. উপরে স্ক্রোল করুন এবং **Remix-এ খুলুন** (Remix-এর জন্য) অথবা একটি ভিন্ন এনভায়রনমেন্ট ব্যবহার করার জন্য **ডাউনলোড করুন**-এ ক্লিক করুন। আমি ধরে নিচ্ছি আপনি Remix ব্যবহার করছেন, যদি আপনি অন্য কিছু ব্যবহার করেন তবে শুধু উপযুক্ত পরিবর্তনগুলি করুন। + +4. এখন আমাদের একটি সম্পূর্ণরূপে কার্যকরী ERC-20 কন্ট্র্যাক্ট আছে। আপনি ইম্পোর্ট করা কোড দেখতে `.deps` > `npm` விரிৃত করতে পারেন। + +5. কন্ট্র্যাক্টটি একটি ERC-20 কন্ট্র্যাক্ট হিসাবে কাজ করে কিনা তা দেখার জন্য কম্পাইল করুন, ডিপ্লয় করুন এবং এর সাথে প্লে করুন। যদি আপনার Remix কীভাবে ব্যবহার করতে হয় তা শেখার প্রয়োজন হয়, [এই টিউটোরিয়ালটি ব্যবহার করুন](https://remix.ethereum.org/?#activate=udapp,solidity,LearnEth)। + +## সাধারণ ভুল {#common-mistakes} + +### ভুলগুলি {#the-mistakes} + +ব্যবহারকারীরা কখনও কখনও ভুল ঠিকানায় টোকেন পাঠান। যদিও আমরা তাদের মন পড়ে জানতে পারি না যে তারা কী করতে চেয়েছিল, তবে দুই ধরণের ভুল রয়েছে যা অনেক ঘটে এবং সহজে সনাক্ত করা যায়: + +1. কন্ট্র্যাক্টের নিজের ঠিকানায় টোকেন পাঠানো। উদাহরণস্বরূপ, [Optimism-এর OP টোকেন](https://optimism.mirror.xyz/qvd0WfuLKnePm1Gxb9dpGchPf5uDz5NSMEFdgirDS4c) দুই মাসেরও কম সময়ে [120,000 এর বেশি](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000042) OP টোকেন জমা করতে সক্ষম হয়েছে। এটি একটি উল্লেখযোগ্য পরিমাণ সম্পদকে প্রতিনিধিত্ব করে যা সম্ভবত মানুষ হারিয়েছে। + +2. টোকেনগুলিকে একটি খালি ঠিকানায় পাঠানো, যা একটি [এক্সটার্নালি ওনড অ্যাকাউন্ট](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs) বা একটি [স্মার্ট কন্ট্র্যাক্টের](/developers/docs/smart-contracts) সাথে সঙ্গতিপূর্ণ নয়। যদিও আমার কাছে এটি কত ঘন ঘন ঘটে তার পরিসংখ্যান নেই, [একটি ঘটনায় 20,000,000 টোকেনের ক্ষতি হতে পারত](https://gov.optimism.io/t/message-to-optimism-community-from-wintermute/2595)। + +### ট্রান্সফার প্রতিরোধ করা {#preventing-transfers} + +OpenZeppelin ERC-20 কন্ট্র্যাক্টে [একটি হুক, `_beforeTokenTransfer`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol#L364-L368) অন্তর্ভুক্ত রয়েছে, যা একটি টোকেন ট্রান্সফার করার আগে কল করা হয়। ডিফল্টরূপে এই হুকটি কিছুই করে না, কিন্তু আমরা এতে আমাদের নিজস্ব ফাংশনালিটি যোগ করতে পারি, যেমন চেক যা সমস্যা হলে রিভার্ট করে। + +হুকটি ব্যবহার করতে, কনস্ট্রাক্টরের পরে এই ফাংশনটি যোগ করুন: + +```solidity + function _beforeTokenTransfer(address from, address to, uint256 amount) + internal virtual + override(ERC20) + { + super._beforeTokenTransfer(from, to, amount); + } +``` + +আপনি যদি Solidity-এর সাথে খুব পরিচিত না হন তবে এই ফাংশনের কিছু অংশ নতুন হতে পারে: + +```solidity + internal virtual +``` + +`virtual` কীওয়ার্ডটির অর্থ হলো যে আমরা যেমন `ERC20` থেকে ফাংশনালিটি ইনহেরিট করেছি এবং এই ফাংশনটিকে ওভাররাইড করেছি, তেমনি অন্যান্য কন্ট্র্যাক্ট আমাদের কাছ থেকে ইনহেরিট করতে এবং এই ফাংশনটিকে ওভাররাইড করতে পারে। + +```solidity + override(ERC20) +``` + +আমাদেরকে স্পষ্টভাবে নির্দিষ্ট করতে হবে যে আমরা `_beforeTokenTransfer`-এর ERC20 টোকেন সংজ্ঞাটি [ওভাররাইড](https://docs.soliditylang.org/en/v0.8.15/contracts.html#function-overriding) করছি। সাধারণভাবে, নিরাপত্তার দৃষ্টিকোণ থেকে, স্পষ্ট সংজ্ঞাগুলি অন্তর্নিহিতগুলির চেয়ে অনেক ভালো - আপনি যদি কিছু করে থাকেন তবে তা আপনার সামনে থাকলে আপনি তা ভুলতে পারবেন না। এই কারণেই আমাদের নির্দিষ্ট করতে হবে যে আমরা কোন সুপারক্লাসের `_beforeTokenTransfer` ওভাররাইড করছি। + +```solidity + super._beforeTokenTransfer(from, to, amount); +``` + +এই লাইনটি সেই কন্ট্র্যাক্ট বা কন্ট্র্যাক্টগুলির `_beforeTokenTransfer` ফাংশনটিকে কল করে যা থেকে আমরা ইনহেরিট করেছি এবং যার মধ্যে এটি রয়েছে। এই ক্ষেত্রে, এটি শুধুমাত্র `ERC20`, `Ownable`-এর এই হুকটি নেই। যদিও বর্তমানে `ERC20._beforeTokenTransfer` কিছুই করে না, আমরা এটিকে কল করি যদি ভবিষ্যতে ফাংশনালিটি যোগ করা হয় (এবং আমরা তখন কন্ট্র্যাক্টটি পুনরায় ডিপ্লয় করার সিদ্ধান্ত নিই, কারণ ডিপ্লয়মেন্টের পরে কন্ট্র্যাক্ট পরিবর্তন হয় না)। + +### রিকোয়ারমেন্টগুলি কোডিং করা {#coding-the-requirements} + +আমরা ফাংশনে এই রিকোয়ারমেন্টগুলি যোগ করতে চাই: + +- `to` ঠিকানাটি `address(this)`-এর সমান হতে পারে না, যা হলো ERC-20 কন্ট্র্যাক্টের নিজের ঠিকানা। +- `to` ঠিকানাটি খালি হতে পারে না, এটি অবশ্যই হবে: + - একটি এক্সটার্নালি ওনড অ্যাকাউন্ট (EOA)। আমরা সরাসরি একটি ঠিকানা EOA কিনা তা পরীক্ষা করতে পারি না, তবে আমরা একটি ঠিকানার ETH ব্যালেন্স পরীক্ষা করতে পারি। EOA-গুলির প্রায় সবসময়ই একটি ব্যালেন্স থাকে, এমনকি যদি সেগুলি আর ব্যবহার না করা হয় - শেষ wei পর্যন্ত সেগুলি পরিষ্কার করা কঠিন। + - একটি স্মার্ট কন্ট্র্যাক্ট। একটি ঠিকানা স্মার্ট কন্ট্র্যাক্ট কিনা তা পরীক্ষা করা একটু কঠিন। একটি অপকোড আছে যা এক্সটার্নাল কোডের দৈর্ঘ্য পরীক্ষা করে, যাকে [`EXTCODESIZE`](https://www.evm.codes/#3b) বলা হয়, কিন্তু এটি সরাসরি Solidity-তে উপলব্ধ নয়। এর জন্য আমাদের [Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html) ব্যবহার করতে হবে, যা হলো EVM অ্যাসেম্বলি। Solidity থেকে আমরা ব্যবহার করতে পারতাম এমন অন্যান্য মানও আছে ([`
.code` এবং `
.codehash`](https://docs.soliditylang.org/en/v0.8.15/units-and-global-variables.html#members-of-address-types)), কিন্তু সেগুলোর খরচ বেশি। + +আসুন নতুন কোডটি লাইন বাই লাইন দেখি: + +```solidity + require(to != address(this), "কন্ট্র্যাক্ট ঠিকানায় টোকেন পাঠানো যাবে না"); +``` + +এটি হলো প্রথম রিকোয়ারমেন্ট, `to` এবং `this(address)` একই জিনিস নয় তা পরীক্ষা করুন। + +```solidity + bool isToContract; + assembly { + isToContract := gt(extcodesize(to), 0) + } +``` + +এভাবে আমরা একটি ঠিকানা কন্ট্র্যাক্ট কিনা তা পরীক্ষা করি। আমরা সরাসরি Yul থেকে আউটপুট পেতে পারি না, তাই পরিবর্তে আমরা ফলাফল ধরে রাখার জন্য একটি ভেরিয়েবল সংজ্ঞায়িত করি (`isToContract` এই ক্ষেত্রে)। Yul যেভাবে কাজ করে তা হলো, প্রতিটি অপকোডকে একটি ফাংশন হিসাবে বিবেচনা করা হয়। তাই প্রথমে আমরা কন্ট্র্যাক্টের আকার পেতে [`EXTCODESIZE`](https://www.evm.codes/#3b) কল করি, এবং তারপর এটি শূন্য নয় তা পরীক্ষা করতে [`GT`](https://www.evm.codes/#11) ব্যবহার করি (আমরা আনসাইন্ড পূর্ণসংখ্যার সাথে কাজ করছি, তাই অবশ্যই এটি ঋণাত্মক হতে পারে না)। এরপর আমরা ফলাফলটি `isToContract`-এ লিখি। + +```solidity + require(to.balance != 0 || isToContract, "একটি খালি ঠিকানায় টোকেন পাঠানো যাবে না"); +``` + +এবং অবশেষে, আমাদের কাছে খালি ঠিকানাগুলির জন্য আসল চেকটি রয়েছে। + +## প্রশাসনিক অ্যাক্সেস {#admin-access} + +কখনও কখনও একজন প্রশাসক থাকা দরকারি যিনি ভুল সংশোধন করতে পারেন। অপব্যবহারের সম্ভাবনা কমাতে, এই প্রশাসক একটি [মাল্টিসিগ](https://blog.logrocket.com/security-choices-multi-signature-wallets/) হতে পারে যাতে একাধিক ব্যক্তিকে একটি কাজের জন্য একমত হতে হয়। এই নিবন্ধে আমাদের দুটি প্রশাসনিক বৈশিষ্ট্য থাকবে: + +1. অ্যাকাউন্ট ফ্রিজ এবং আনফ্রিজ করা। উদাহরণস্বরূপ, যখন একটি অ্যাকাউন্টের নিরাপত্তা বিঘ্নিত হতে পারে তখন এটি কার্যকর হতে পারে। +2. অ্যাসেট ক্লিনআপ। + + কখনও কখনও প্রতারকরা বৈধতা অর্জনের জন্য আসল টোকেনের কন্ট্র্যাক্টে জাল টোকেন পাঠায়। উদাহরণস্বরূপ, [এখানে দেখুন](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe?tab=holders)। বৈধ ERC-20 কন্ট্র্যাক্টটি হলো [0x4200....0042](https://optimism.blockscout.com/token/0x4200000000000000000000000000000000000042)। যে স্ক্যামটি এটি হওয়ার ভান করে তা হলো [0x234....bbe](https://optimism.blockscout.com/token/0x2348B1a1228DDCd2dB668c3d30207c3E1852fBbe)। + + এটাও সম্ভব যে লোকেরা ভুল করে আমাদের কন্ট্র্যাক্টে বৈধ ERC-20 টোকেন পাঠাতে পারে, যা সেগুলিকে বের করার একটি উপায় থাকার আরেকটি কারণ। + +OpenZeppelin প্রশাসনিক অ্যাক্সেস সক্ষম করার জন্য দুটি প্রক্রিয়া প্রদান করে: + +- [`Ownable`](https://docs.openzeppelin.com/contracts/5.x/access-control#ownership-and-ownable) কন্ট্র্যাক্টগুলির একজন একক মালিক থাকে। যেসব ফাংশনে `onlyOwner` [মডিফায়ার](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) থাকে, সেগুলি শুধুমাত্র সেই মালিক দ্বারা কল করা যেতে পারে। মালিকরা অন্য কাউকে মালিকানা হস্তান্তর করতে বা এটি সম্পূর্ণরূপে ত্যাগ করতে পারে। অন্যান্য সমস্ত অ্যাকাউন্টের অধিকার সাধারণত অভিন্ন। +- [`AccessControl`](https://docs.openzeppelin.com/contracts/5.x/access-control#role-based-access-control) কন্ট্র্যাক্টগুলিতে [রোল বেসড অ্যাক্সেস কন্ট্রোল (RBAC)](https://en.wikipedia.org/wiki/Role-based_access_control) থাকে। + +সরলতার জন্য, এই নিবন্ধে আমরা `Ownable` ব্যবহার করি। + +### কন্ট্র্যাক্ট ফ্রিজ এবং আনফ্রিজ করা {#freezing-and-thawing-contracts} + +কন্ট্র্যাক্ট ফ্রিজ এবং আনফ্রিজ করার জন্য কয়েকটি পরিবর্তন প্রয়োজন: + +- কোন ঠিকানাগুলি ফ্রিজ করা হয়েছে তার হিসাব রাখার জন্য ঠিকানা থেকে [বুলিয়ানে](https://en.wikipedia.org/wiki/Boolean_data_type) একটি [ম্যাপিং](https://www.tutorialspoint.com/solidity/solidity_mappings.htm)। সমস্ত মান প্রাথমিকভাবে শূন্য থাকে, যা বুলিয়ান মানের জন্য মিথ্যা হিসাবে ব্যাখ্যা করা হয়। এটাই আমরা চাই কারণ ডিফল্টরূপে অ্যাকাউন্টগুলি ফ্রিজ করা হয় না। + + ```solidity + mapping(address => bool) public frozenAccounts; + ``` + +- যখন একটি অ্যাকাউন্ট ফ্রিজ বা আনফ্রিজ করা হয় তখন আগ্রহী যে কাউকে জানানোর জন্য [ইভেন্ট](https://www.tutorialspoint.com/solidity/solidity_events.htm)। টেকনিক্যালি বলতে গেলে, এই কাজগুলির জন্য ইভেন্টগুলির প্রয়োজন নেই, তবে এটি অফচেইন কোডকে এই ইভেন্টগুলি শুনতে এবং কী ঘটছে তা জানতে সাহায্য করে। যখন অন্য কারও জন্য প্রাসঙ্গিক কিছু ঘটে তখন একটি স্মার্ট কন্ট্র্যাক্টের জন্য সেগুলি নির্গত করাকে ভালো আচরণ বলে মনে করা হয়। + + ইভেন্টগুলি ইনডেক্স করা হয় তাই একটি অ্যাকাউন্ট কতবার ফ্রিজ বা আনফ্রিজ করা হয়েছে তা অনুসন্ধান করা সম্ভব হবে। + + ```solidity + // যখন অ্যাকাউন্টগুলি ফ্রিজ বা আনফ্রিজ করা হয় + event AccountFrozen(address indexed _addr); + event AccountThawed(address indexed _addr); + ``` + +- অ্যাকাউন্ট ফ্রিজ এবং আনফ্রিজ করার জন্য ফাংশন। এই দুটি ফাংশন প্রায় অভিন্ন, তাই আমরা শুধুমাত্র ফ্রিজ ফাংশনটি দেখব। + + ```solidity + function freezeAccount(address addr) + public + onlyOwner + ``` + + [`public`](https://www.tutorialspoint.com/solidity/solidity_contracts.htm) হিসাবে চিহ্নিত ফাংশনগুলি অন্যান্য স্মার্ট কন্ট্র্যাক্ট থেকে বা সরাসরি একটি লেনদেনের মাধ্যমে কল করা যেতে পারে। + + ```solidity + { + require(!frozenAccounts[addr], "অ্যাকাউন্ট ইতিমধ্যে ফ্রিজ করা আছে"); + frozenAccounts[addr] = true; + emit AccountFrozen(addr); + } // freezeAccount + ``` + + যদি অ্যাকাউন্টটি ইতিমধ্যে ফ্রিজ করা থাকে, তবে রিভার্ট করুন। অন্যথায়, এটি ফ্রিজ করুন এবং একটি ইভেন্ট `emit` করুন। + +- একটি ফ্রিজ করা অ্যাকাউন্ট থেকে অর্থ সরানো প্রতিরোধ করতে `_beforeTokenTransfer` পরিবর্তন করুন। মনে রাখবেন যে ফ্রিজ করা অ্যাকাউন্টে এখনও অর্থ ট্রান্সফার করা যেতে পারে। + + ```solidity + require(!frozenAccounts[from], "অ্যাকাউন্টটি ফ্রিজ করা আছে"); + ``` + +### অ্যাসেট ক্লিনআপ {#asset-cleanup} + +এই কন্ট্র্যাক্ট দ্বারা ধারণ করা ERC-20 টোকেন রিলিজ করার জন্য আমাদের সেই টোকেন কন্ট্র্যাক্টে একটি ফাংশন কল করতে হবে, হয় [`transfer`](https://eips.ethereum.org/EIPS/eip-20#transfer) অথবা [`approve`](https://eips.ethereum.org/EIPS/eip-20#approve)। এই ক্ষেত্রে অ্যালাওয়েন্সের ওপর গ্যাস নষ্ট করার কোনো মানে নেই, আমরা সরাসরি ট্রান্সফার করতে পারি। + +```solidity + function cleanupERC20( + address erc20, + address dest + ) + public + onlyOwner + { + IERC20 token = IERC20(erc20); +``` + +যখন আমরা ঠিকানাটি পাই তখন একটি কন্ট্র্যাক্টের জন্য একটি অবজেক্ট তৈরি করার সিনট্যাক্স এটি। আমরা এটি করতে পারি কারণ আমাদের সোর্স কোডের অংশ হিসাবে ERC20 টোকেনের জন্য সংজ্ঞা রয়েছে (লাইন 4 দেখুন), এবং সেই ফাইলে [IERC20-এর জন্য সংজ্ঞা](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) অন্তর্ভুক্ত রয়েছে, যা একটি OpenZeppelin ERC-20 কন্ট্র্যাক্টের ইন্টারফেস। + +```solidity + uint balance = token.balanceOf(address(this)); + token.transfer(dest, balance); + } +``` + +এটি একটি ক্লিনআপ ফাংশন, তাই সম্ভবত আমরা কোনো টোকেন রেখে যেতে চাই না। ব্যবহারকারীর কাছ থেকে ম্যানুয়ালি ব্যালেন্স পাওয়ার পরিবর্তে, আমরা প্রক্রিয়াটি স্বয়ংক্রিয় করতে পারি। + +## উপসংহার {#conclusion} + +এটি একটি নিখুঁত সমাধান নয় - "ব্যবহারকারী ভুল করেছে" সমস্যার কোনো নিখুঁত সমাধান নেই। তবে, এই ধরনের চেক ব্যবহার করে অন্তত কিছু ভুল প্রতিরোধ করা যেতে পারে। অ্যাকাউন্ট ফ্রিজ করার ক্ষমতা, যদিও বিপজ্জনক, হ্যাকারকে চুরি করা তহবিল থেকে বঞ্চিত করে নির্দিষ্ট হ্যাকের ক্ষতি সীমিত করতে ব্যবহার করা যেতে পারে। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। diff --git a/public/content/translations/bn/developers/tutorials/ethereum-for-web2-auth/index.md b/public/content/translations/bn/developers/tutorials/ethereum-for-web2-auth/index.md new file mode 100644 index 00000000000..0361234926a --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/ethereum-for-web2-auth/index.md @@ -0,0 +1,886 @@ +--- +title: "web2 প্রমাণীকরণের জন্য ইথেরিয়াম ব্যবহার করা" +description: "এই টিউটোরিয়ালটি পড়ার পরে, একজন ডেভেলপার SAML লগইনের সাথে ইথেরিয়াম লগইন (web3) একীভূত করতে সক্ষম হবেন, যা web2-তে একক সাইন-অন এবং অন্যান্য সম্পর্কিত পরিষেবা প্রদানের জন্য ব্যবহৃত একটি স্ট্যান্ডার্ড। এটি ইথেরিয়াম স্বাক্ষরগুলির মাধ্যমে web2 রিসোর্সগুলিকে প্রমাণীকৃত করার অনুমতি দেয়, যার ব্যবহারকারী বৈশিষ্ট্যগুলি অ্যাটেস্টেশনগুলি থেকে আসে।" +author: Ori Pomerantz +tags: [ "web2", "প্রমাণীকরণ", "eas" ] +skill: beginner +lang: bn +published: 2025-04-30 +--- + +## ভূমিকা + +[SAML](https://www.onelogin.com/learn/saml) হল web2-এ ব্যবহৃত একটি স্ট্যান্ডার্ড যা একজন [পরিচয় প্রদানকারী (IdP)](https://en.wikipedia.org/wiki/Identity_provider#SAML_identity_provider)-কে [পরিষেবা প্রদানকারী (SP)](https://en.wikipedia.org/wiki/Service_provider_\(SAML\))-দের জন্য ব্যবহারকারীর তথ্য প্রদান করার অনুমতি দেয়। + +এই টিউটোরিয়ালে আপনি শিখবেন কিভাবে ইথেরিয়াম স্বাক্ষরকে SAML-এর সাথে একীভূত করতে হয়, যাতে ব্যবহারকারীরা তাদের ইথেরিয়াম ওয়ালেট ব্যবহার করে সেইসব web2 পরিষেবাগুলিতে নিজেদের প্রমাণীকরণ করতে পারে যা এখনও স্থানীয়ভাবে ইথেরিয়াম সমর্থন করে না। + +মনে রাখবেন যে এই টিউটোরিয়ালটি দুটি পৃথক দর্শকের জন্য লেখা হয়েছে: + +- ইথেরিয়াম ব্যবহারকারী যারা ইথেরিয়াম বোঝেন এবং তাদের SAML শিখতে হবে +- Web2 ব্যবহারকারী যারা SAML এবং web2 প্রমাণীকরণ বোঝেন এবং তাদের ইথেরিয়াম শিখতে হবে + +ফলস্বরূপ, এতে এমন অনেক প্রাথমিক উপাদান থাকবে যা আপনি ইতিমধ্যেই জানেন। আপনি নির্দ্বিধায় এটি এড়িয়ে যেতে পারেন। + +### ইথেরিয়াম ব্যবহারকারীদের জন্য SAML + +SAML একটি কেন্দ্রীভূত প্রোটোকল। একজন পরিষেবা প্রদানকারী (SP) একজন পরিচয় প্রদানকারী (IdP) থেকে শুধুমাত্র তখনই দাবি (যেমন, "এটি আমার ব্যবহারকারী জন, তার A, B, এবং C করার অনুমতি থাকা উচিত") গ্রহণ করে, যদি তার সাথে এটির একটি পূর্ব-বিদ্যমান বিশ্বাস সম্পর্ক থাকে, অথবা সেই [সার্টিফিকেট কর্তৃপক্ষ](https://www.ssl.com/article/what-is-a-certificate-authority-ca/)-এর সাথে যা সেই IdP-র সার্টিফিকেট স্বাক্ষর করেছে। + +উদাহরণস্বরূপ, SP হতে পারে একটি ট্রাভেল এজেন্সি যা কোম্পানিগুলিকে ভ্রমণ পরিষেবা প্রদান করে, এবং IdP হতে পারে একটি কোম্পানির অভ্যন্তরীণ ওয়েব সাইট। যখন কর্মচারীদের ব্যবসায়িক ভ্রমণের জন্য বুকিং করতে হয়, তখন ট্রাভেল এজেন্সি তাদের আসল ভ্রমণের বুকিং করার আগে কোম্পানির দ্বারা প্রমাণীকরণের জন্য পাঠায়। + +![ধাপে ধাপে SAML প্রক্রিয়া](./fig-01-saml.png) + +এইভাবেই তিনটি সত্তা, ব্রাউজার, SP, এবং IdP, অ্যাক্সেসের জন্য আলোচনা করে। SP-কে আগে থেকে ব্রাউজার ব্যবহারকারী সম্পর্কে কিছু জানার প্রয়োজন নেই, শুধু IdP-কে বিশ্বাস করলেই চলে। + +### SAML ব্যবহারকারীদের জন্য ইথেরিয়াম + +ইথেরিয়াম একটি বিকেন্দ্রীভূত সিস্টেম। + +![ইথেরিয়াম লগঅন](./fig-02-eth-logon.png) + +ব্যবহারকারীদের একটি প্রাইভেট কী থাকে (সাধারণত একটি ব্রাউজার এক্সটেনশনে রাখা হয়)। প্রাইভেট কী থেকে আপনি একটি পাবলিক কী এবং তা থেকে একটি 20-বাইটের অ্যাড্রেস তৈরি করতে পারেন। যখন ব্যবহারকারীদের একটি সিস্টেমে লগ ইন করতে হয়, তখন তাদের একটি নন্স (একবার ব্যবহারযোগ্য মান) সহ একটি বার্তায় স্বাক্ষর করতে বলা হয়। সার্ভার যাচাই করতে পারে যে স্বাক্ষরটি সেই অ্যাড্রেস দ্বারা তৈরি করা হয়েছে। + +![অ্যাটেস্টেশন থেকে অতিরিক্ত ডেটা পাওয়া](./fig-03-eas-data.png) + +স্বাক্ষরটি শুধুমাত্র ইথেরিয়াম অ্যাড্রেস যাচাই করে। অন্যান্য ব্যবহারকারীর বৈশিষ্ট্যগুলি পেতে, আপনি সাধারণত [অ্যাটেস্টেশন](https://attest.org/) ব্যবহার করেন। একটি অ্যাটেস্টেশনে সাধারণত এই ফিল্ডগুলি থাকে: + +- **অ্যাটেস্টর**, যে অ্যাড্রেসটি অ্যাটেস্টেশনটি তৈরি করেছে +- **প্রাপক**, যে অ্যাড্রেসের জন্য অ্যাটেস্টেশনটি প্রযোজ্য +- **ডেটা**, যে ডেটা প্রত্যয়িত করা হচ্ছে, যেমন নাম, অনুমতি, ইত্যাদি। +- **স্কিমা**, ডেটা ব্যাখ্যা করার জন্য ব্যবহৃত স্কিমার ID। + +ইথেরিয়ামের বিকেন্দ্রীভূত প্রকৃতির কারণে, যেকোনো ব্যবহারকারী অ্যাটেস্টেশন তৈরি করতে পারেন। আমরা কোন অ্যাটেস্টেশনগুলিকে নির্ভরযোগ্য বলে মনে করি তা শনাক্ত করার জন্য অ্যাটেস্টরের পরিচয় গুরুত্বপূর্ণ। + +## সেটআপ + +প্রথম ধাপ হল একটি SAML SP এবং একটি SAML IdP-র মধ্যে যোগাযোগ স্থাপন করা। + +1. সফ্টওয়্যারটি ডাউনলোড করুন। এই নিবন্ধটির জন্য নমুনা সফ্টওয়্যারটি [গিটহাবে](https://github.com/qbzzt/250420-saml-ethereum) রয়েছে। বিভিন্ন পর্যায়গুলি বিভিন্ন ব্রাঞ্চে সংরক্ষণ করা হয়, এই পর্যায়ের জন্য আপনার `saml-only` প্রয়োজন + + ```sh + git clone https://github.com/qbzzt/250420-saml-ethereum -b saml-only + cd 250420-saml-ethereum + pnpm install + ``` + +2. স্ব-স্বাক্ষরিত সার্টিফিকেটসহ কী তৈরি করুন। এর মানে হল যে কী নিজেই তার সার্টিফিকেট কর্তৃপক্ষ, এবং এটি পরিষেবা প্রদানকারীর কাছে ম্যানুয়ালি আমদানি করতে হবে। আরও তথ্যের জন্য [OpenSSL ডক্স](https://docs.openssl.org/master/man1/openssl-req/) দেখুন। + + ```sh + mkdir keys + cd keys + openssl req -new -x509 -days 365 -nodes -sha256 -out saml-sp.crt -keyout saml-sp.pem -subj /CN=sp/ + openssl req -new -x509 -days 365 -nodes -sha256 -out saml-idp.crt -keyout saml-idp.pem -subj /CN=idp/ + cd .. + ``` + +3. সার্ভারগুলি শুরু করুন (SP এবং IdP উভয়ই) + + ```sh + pnpm start + ``` + +4. URL [http://localhost:3000/](http://localhost:3000/) এ SP ব্রাউজ করুন এবং IdP-তে (পোর্ট 3001) পুনঃনির্দেশিত হতে বোতামে ক্লিক করুন। + +5. IdP-কে আপনার ইমেল অ্যাড্রেস দিন এবং **পরিষেবা প্রদানকারীতে লগইন করুন**-এ ক্লিক করুন। দেখুন যে আপনাকে পরিষেবা প্রদানকারীতে (পোর্ট 3000) আবার পুনঃনির্দেশিত করা হয়েছে এবং এটি আপনাকে আপনার ইমেল অ্যাড্রেস দ্বারা চেনে। + +### বিস্তারিত ব্যাখ্যা + +ধাপে ধাপে যা ঘটে তা এখানে দেওয়া হল: + +![ইথেরিয়াম ছাড়া সাধারণ SAML লগঅন](./fig-04-saml-no-eth.png) + +#### src/config.mts + +এই ফাইলটিতে আইডেন্টিটি প্রোভাইডার এবং সার্ভিস প্রোভাইডার উভয়ের কনফিগারেশন রয়েছে। সাধারণত এই দুটি ভিন্ন সত্তা হবে, কিন্তু এখানে আমরা সরলতার জন্য কোড শেয়ার করতে পারি। + +```typescript +const fs = await import("fs") + +const protocol="http" +``` + +আপাতত আমরা শুধু পরীক্ষা করছি, তাই HTTP ব্যবহার করা ঠিক আছে। + +```typescript +export const spCert = fs.readFileSync("keys/saml-sp.crt").toString() +export const idpCert = fs.readFileSync("keys/saml-idp.crt").toString() +``` + +পাবলিক কীগুলি পড়ুন, যা সাধারণত উভয় উপাদানের জন্য উপলব্ধ থাকে (এবং হয় সরাসরি বিশ্বস্ত, অথবা একটি বিশ্বস্ত সার্টিফিকেট কর্তৃপক্ষ দ্বারা স্বাক্ষরিত)। + +```typescript +export const spPort = 3000 +export const spHostname = "localhost" +export const spDir = "sp" + +export const idpPort = 3001 +export const idpHostname = "localhost" +export const idpDir = "idp" + +export const spUrl = `${protocol}://${spHostname}:${spPort}/${spDir}` +export const idpUrl = `${protocol}://${idpHostname}:${idpPort}/${idpDir}` +``` + +উভয় উপাদানের জন্য URL। + +```typescript +export const spPublicData = { +``` + +পরিষেবা প্রদানকারীর জন্য পাবলিক ডেটা। + +```typescript + entityID: `${spUrl}/metadata`, +``` + +প্রচলিত নিয়ম অনুযায়ী, SAML-এ `entityID` হল সেই URL যেখানে সত্তার মেটাডেটা পাওয়া যায়। এই মেটাডেটা এখানকার পাবলিক ডেটার সাথে সামঞ্জস্যপূর্ণ, তবে এটি XML ফর্ম্যাটে থাকে। + +```typescript + wantAssertionsSigned: true, + authnRequestsSigned: false, + signingCert: spCert, + allowCreate: true, + assertionConsumerService: [{ + Binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', + Location: `${spUrl}/assertion`, + }] + } +``` + +আমাদের উদ্দেশ্যের জন্য সবচেয়ে গুরুত্বপূর্ণ সংজ্ঞা হল `assertionConsumerServer`। এর মানে হল যে পরিষেবা প্রদানকারীর কাছে কিছু দাবি করতে (উদাহরণস্বরূপ, "যে ব্যবহারকারী আপনাকে এই তথ্য পাঠাচ্ছে সে হল somebody@example.com") আমাদের [HTTP POST](https://www.w3schools.com/tags/ref_httpmethods.asp) ব্যবহার করে `http://localhost:3000/sp/assertion` URL-এ যেতে হবে। + +```typescript +export const idpPublicData = { + entityID: `${idpUrl}/metadata`, + signingCert: idpCert, + wantAuthnRequestsSigned: false, + singleSignOnService: [{ + Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + Location: `${idpUrl}/login` + }], + singleLogoutService: [{ + Binding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", + Location: `${idpUrl}/logout` + }], + } +``` + +পরিচয় প্রদানকারীর জন্য পাবলিক ডেটা একই রকম। এটি নির্দিষ্ট করে যে একজন ব্যবহারকারীকে লগ ইন করতে আপনাকে `http://localhost:3001/idp/login`-এ POST করতে হবে এবং একজন ব্যবহারকারীকে লগ আউট করতে আপনাকে `http://localhost:3001/idp/logout`-এ POST করতে হবে। + +#### src/sp.mts + +এটি সেই কোড যা একটি পরিষেবা প্রদানকারীকে বাস্তবায়ন করে। + +```typescript +import * as config from "./config.mts" +const fs = await import("fs") +const saml = await import("samlify") +``` + +আমরা SAML বাস্তবায়নের জন্য [`samlify`](https://www.npmjs.com/package/samlify) লাইব্রেরি ব্যবহার করি। + +```typescript +import * as validator from "@authenio/samlify-node-xmllint" +saml.setSchemaValidator(validator) +``` + +`samlify` লাইব্রেরি আশা করে যে একটি প্যাকেজ XML সঠিক কিনা, প্রত্যাশিত পাবলিক কী দিয়ে স্বাক্ষরিত কিনা, ইত্যাদি যাচাই করবে। আমরা এই উদ্দেশ্যে [`@authenio/samlify-node-xmllint`](https://www.npmjs.com/package/@authenio/samlify-node-xmllint) ব্যবহার করি। + +```typescript +const express = (await import("express")).default +const spRouter = express.Router() +const app = express() +``` + +একটি [`express`](https://expressjs.com/) [`Router`](https://expressjs.com/en/5x/api.html#router) হল একটি "মিনি ওয়েব সাইট" যা একটি ওয়েব সাইটের ভিতরে মাউন্ট করা যেতে পারে। এই ক্ষেত্রে, আমরা এটি সমস্ত পরিষেবা প্রদানকারীর সংজ্ঞাগুলিকে একত্রিত করার জন্য ব্যবহার করি। + +```typescript +const spPrivateKey = fs.readFileSync("keys/saml-sp.pem").toString() + +const sp = saml.ServiceProvider({ + privateKey: spPrivateKey, + ...config.spPublicData +}) +``` + +পরিষেবা প্রদানকারীর নিজস্ব উপস্থাপনা হল সমস্ত পাবলিক ডেটা এবং তথ্য স্বাক্ষর করার জন্য এটি যে প্রাইভেট কী ব্যবহার করে। + +```typescript +const idp = saml.IdentityProvider(config.idpPublicData); +``` + +পাবলিক ডেটাতে পরিচয় প্রদানকারী সম্পর্কে পরিষেবা প্রদানকারীর যা কিছু জানা দরকার তা রয়েছে। + +```typescript +spRouter.get(`/metadata`, + (req, res) => res.header("Content-Type", "text/xml").send(sp.getMetadata()) +) +``` + +অন্যান্য SAML উপাদানগুলির সাথে আন্তঃকার্যক্ষমতা সক্ষম করার জন্য, পরিষেবা এবং পরিচয় প্রদানকারীদের তাদের পাবলিক ডেটা (যাকে মেটাডেটা বলা হয়) `/metadata`-তে XML ফর্ম্যাটে উপলব্ধ থাকা উচিত। + +```typescript +spRouter.post(`/assertion`, +``` + +এটি সেই পৃষ্ঠা যা ব্রাউজার দ্বারা নিজের পরিচয় প্রদানের জন্য অ্যাক্সেস করা হয়। এই দাবিতে ব্যবহারকারীর শনাক্তকারী (এখানে আমরা ইমেল অ্যাড্রেস ব্যবহার করি) অন্তর্ভুক্ত থাকে এবং এতে অতিরিক্ত বৈশিষ্ট্যও অন্তর্ভুক্ত থাকতে পারে। এটি উপরের সিকোয়েন্স ডায়াগ্রামের ৭ নং ধাপের জন্য হ্যান্ডলার। + +```typescript + async (req, res) => { + // console.log(`SAML response:\n${Buffer.from(req.body.SAMLResponse, 'base64').toString('utf-8')}`) +``` + +আপনি দাবিতে প্রদত্ত XML ডেটা দেখতে কমেন্ট করা কমান্ডটি ব্যবহার করতে পারেন। এটি [বেস64 এনকোডেড](https://en.wikipedia.org/wiki/Base64)। + +```typescript + try { + const loginResponse = await sp.parseLoginResponse(idp, 'post', req); +``` + +পরিচয় সার্ভার থেকে লগইন অনুরোধটি পার্স করুন। + +```typescript + res.send(` + + +

Hello ${loginResponse.extract.nameID}

+ + + `) + res.send(); +``` + +একটি HTML প্রতিক্রিয়া পাঠান, শুধু ব্যবহারকারীকে দেখানোর জন্য যে আমরা লগইন পেয়েছি। + +```typescript + } catch (err) { + console.error('Error processing SAML response:', err); + res.status(400).send('SAML authentication failed'); + } + } +) +``` + +ব্যর্থতার ক্ষেত্রে ব্যবহারকারীকে জানান। + +```typescript +spRouter.get('/login', +``` + +ব্রাউজার যখন এই পৃষ্ঠাটি পাওয়ার চেষ্টা করে তখন একটি লগইন অনুরোধ তৈরি করুন। এটি উপরের সিকোয়েন্স ডায়াগ্রামের ১ নং ধাপের জন্য হ্যান্ডলার। + +```typescript + async (req, res) => { + const loginRequest = await sp.createLoginRequest(idp, "post") +``` + +একটি লগইন অনুরোধ পোস্ট করার জন্য তথ্য পান। + +```typescript + res.send(` + + + +``` + +এই পৃষ্ঠাটি ফর্মটি (নীচে দেখুন) স্বয়ংক্রিয়ভাবে জমা দেয়। এইভাবে ব্যবহারকারীকে পুনঃনির্দেশিত হওয়ার জন্য কিছু করতে হবে না। এটি উপরের সিকোয়েন্স ডায়াগ্রামের ২ নং ধাপ। + +```typescript +
+``` + +`loginRequest.entityEndpoint`-এ পোস্ট করুন (পরিচয় প্রদানকারী এন্ডপয়েন্টের URL)। + +```typescript + +``` + +ইনপুটের নাম হল `loginRequest.type` (`SAMLRequest`)। সেই ফিল্ডের বিষয়বস্তু হল `loginRequest.context`, যা আবার XML এবং বেস64 এনকোডেড। + +```typescript +
+ + + `) + } +) + +app.use(express.urlencoded({extended: true})) +``` + +[এই মিডলওয়্যারটি](https://expressjs.com/en/5x/api.html#express.urlencoded) [HTTP অনুরোধের](https://www.tutorialspoint.com/http/http_requests.htm) বডি পড়ে। ডিফল্টভাবে express এটিকে উপেক্ষা করে, কারণ বেশিরভাগ অনুরোধের জন্য এটির প্রয়োজন হয় না। আমাদের এটির প্রয়োজন কারণ POST বডি ব্যবহার করে। + +```typescript +app.use(`/${config.spDir}`, spRouter) +``` + +পরিষেবা প্রদানকারী ডিরেক্টরিতে (`/sp`) রাউটারটি মাউন্ট করুন। + +```typescript +app.get("/", (req, res) => { + res.send(` + + + + + + `) +}) +``` + +যদি কোনো ব্রাউজার রুট ডিরেক্টরি পাওয়ার চেষ্টা করে, তবে তাকে লগইন পৃষ্ঠার একটি লিঙ্ক দিন। + +```typescript +app.listen(config.spPort, () => { + console.log(`service provider is running on http://${config.spHostname}:${config.spPort}`) +}) +``` + +এই express অ্যাপ্লিকেশনটির সাথে `spPort`-এ শুনুন। + +#### src/idp.mts + +এটি হল পরিচয় প্রদানকারী। এটি পরিষেবা প্রদানকারীর মতোই, নীচের ব্যাখ্যাগুলি সেই অংশগুলির জন্য যা ভিন্ন। + +```typescript +const xmlParser = new (await import("fast-xml-parser")).XMLParser( + { + ignoreAttributes: false, // Preserve attributes + attributeNamePrefix: "@_", // Prefix for attributes + } +) +``` + +পরিষেবা প্রদানকারীর কাছ থেকে আমরা যে XML অনুরোধটি পাই তা আমাদের পড়তে এবং বুঝতে হবে। + +```typescript +const getLoginPage = requestId => ` +``` + +এই ফাংশনটি স্বয়ংক্রিয়-জমা দেওয়া ফর্ম সহ পৃষ্ঠাটি তৈরি করে যা উপরের সিকোয়েন্স ডায়াগ্রামের ৪ নং ধাপে ফেরত দেওয়া হয়। + +```typescript + + + লগইন পৃষ্ঠা + + +

লগইন পৃষ্ঠা

+
+ + ইমেল অ্যাড্রেস: +
+ +``` + +আমরা পরিষেবা প্রদানকারীকে দুটি ফিল্ড পাঠাই: + +1. যে `requestId`-তে আমরা প্রতিক্রিয়া জানাচ্ছি। +2. ব্যবহারকারীর শনাক্তকারী (আপাতত আমরা ব্যবহারকারীর দেওয়া ইমেল অ্যাড্রেস ব্যবহার করি)। + +```typescript +
+ + + +const idpRouter = express.Router() + +idpRouter.post("/loginSubmitted", async (req, res) => { + const loginResponse = await idp.createLoginResponse( +``` + +এটি উপরের সিকোয়েন্স ডায়াগ্রামের ৫ নং ধাপের জন্য হ্যান্ডলার। [`idp.createLoginResponse`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L73-L125) লগইন প্রতিক্রিয়া তৈরি করে। + +```typescript + sp, + { + authnContextClassRef: 'urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport', + audience: sp.entityID, +``` + +অডিয়েন্স হল পরিষেবা প্রদানকারী। + +```typescript + extract: { + request: { + id: req.body.requestId + } + }, +``` + +অনুরোধ থেকে নিষ্কাশিত তথ্য। অনুরোধে আমাদের যে একটি প্যারামিটার নিয়ে চিন্তা করতে হয় তা হল requestId, যা পরিষেবা প্রদানকারীকে অনুরোধ এবং তাদের প্রতিক্রিয়াগুলির সাথে মেলাতে দেয়। + +```typescript + signingKey: { privateKey: idpPrivateKey, publicKey: config.idpCert } // Ensure signing +``` + +প্রতিক্রিয়া স্বাক্ষর করার জন্য ডেটা পেতে আমাদের `signingKey` প্রয়োজন। পরিষেবা প্রদানকারী স্বাক্ষরবিহীন অনুরোধ বিশ্বাস করে না। + +```typescript + }, + "post", + { + email: req.body.email +``` + +এটি হল সেই ফিল্ড যেখানে ব্যবহারকারীর তথ্য থাকে যা আমরা পরিষেবা প্রদানকারীকে ফেরত পাঠাই। + +```typescript + } + ); + + res.send(` + + + + +
+ +
+ + + `) +}) +``` + +আবার, একটি স্বয়ংক্রিয়ভাবে জমা দেওয়া ফর্ম ব্যবহার করুন। এটি উপরের সিকোয়েন্স ডায়াগ্রামের ৬ নং ধাপ। + +```typescript + +// IdP endpoint for login requests +idpRouter.post(`/login`, +``` + +এটি সেই এন্ডপয়েন্ট যা পরিষেবা প্রদানকারীর কাছ থেকে একটি লগইন অনুরোধ গ্রহণ করে। এটি উপরের সিকোয়েন্স ডায়াগ্রামের ৩ নং ধাপের হ্যান্ডলার। + +```typescript + async (req, res) => { + try { + // Workaround because I couldn't get parseLoginRequest to work. + // const loginRequest = await idp.parseLoginRequest(sp, 'post', req) + const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8')) + res.send(getLoginPage(samlRequest["samlp:AuthnRequest"]["@_ID"])) +``` + +প্রমাণীকরণ অনুরোধের আইডি পড়ার জন্য আমাদের [`idp.parseLoginRequest`](https://github.com/tngan/samlify/blob/master/src/entity-idp.ts#L127-L144) ব্যবহার করতে পারা উচিত। তবে, আমি এটি কাজ করাতে পারিনি এবং এর উপর অনেক সময় ব্যয় করা সার্থক ছিল না তাই আমি শুধু একটি [সাধারণ-উদ্দেশ্যের XML পার্সার](https://www.npmjs.com/package/fast-xml-parser) ব্যবহার করেছি। আমাদের যে তথ্য প্রয়োজন তা হল `` ট্যাগের ভিতরের `ID` অ্যাট্রিবিউট, যা XML-এর শীর্ষ স্তরে রয়েছে। + +## ইথেরিয়াম স্বাক্ষর ব্যবহার করা + +এখন যেহেতু আমরা পরিষেবা প্রদানকারীর কাছে একজন ব্যবহারকারীর পরিচয় পাঠাতে পারি, পরবর্তী পদক্ষেপ হল বিশ্বস্ত উপায়ে ব্যবহারকারীর পরিচয় সংগ্রহ করা। Viem আমাদের শুধু ওয়ালেট থেকে ব্যবহারকারীর অ্যাড্রেস জিজ্ঞাসা করার অনুমতি দেয়, কিন্তু এর মানে হল ব্রাউজার থেকে তথ্য চাওয়া। আমরা ব্রাউজার নিয়ন্ত্রণ করি না, তাই আমরা এর থেকে প্রাপ্ত প্রতিক্রিয়াকে স্বয়ংক্রিয়ভাবে বিশ্বাস করতে পারি না। + +এর পরিবর্তে, IdP ব্রাউজারকে স্বাক্ষর করার জন্য একটি স্ট্রিং পাঠাবে। যদি ব্রাউজারের ওয়ালেটটি এই স্ট্রিংটি স্বাক্ষর করে, তার মানে হল এটি সত্যিই সেই অ্যাড্রেস (অর্থাৎ, এটি সেই প্রাইভেট কী জানে যা অ্যাড্রেসের সাথে সম্পর্কিত)। + +এটি কার্যকর দেখতে, বিদ্যমান IdP এবং SP বন্ধ করুন এবং এই কমান্ডগুলি চালান: + +```sh +git checkout eth-signatures +pnpm install +pnpm start +``` + +তারপর [SP-তে](http://localhost:3000) ব্রাউজ করুন এবং নির্দেশাবলী অনুসরণ করুন। + +মনে রাখবেন যে এই মুহূর্তে আমরা জানি না কিভাবে ইথেরিয়াম অ্যাড্রেস থেকে ইমেল অ্যাড্রেস পেতে হয়, তাই এর পরিবর্তে আমরা SP-কে `@bad.email.address` রিপোর্ট করি। + +### বিস্তারিত ব্যাখ্যা + +পরিবর্তনগুলি আগের ডায়াগ্রামের ৪-৫ নং ধাপে রয়েছে। + +![একটি ইথেরিয়াম স্বাক্ষরসহ SAML](./fig-05-saml-w-signature.png) + +আমরা শুধুমাত্র `idp.mts` ফাইলটি পরিবর্তন করেছি। এখানে পরিবর্তিত অংশগুলি দেওয়া হল। + +```typescript +import { v4 as uuidv4 } from 'uuid' +import { verifyMessage } from 'viem' +``` + +আমাদের এই দুটি অতিরিক্ত লাইব্রেরি প্রয়োজন। আমরা [নন্স](https://en.wikipedia.org/wiki/Cryptographic_nonce) মান তৈরি করতে [`uuid`](https://www.npmjs.com/package/uuid) ব্যবহার করি। মানটি নিজেই গুরুত্বপূর্ণ নয়, শুধু এটি একবারই ব্যবহৃত হয়। + +[`viem`](https://viem.sh/) লাইব্রেরি আমাদের ইথেরিয়াম সংজ্ঞা ব্যবহার করতে দেয়। এখানে আমাদের এটি প্রয়োজন স্বাক্ষরটি সত্যিই বৈধ কিনা তা যাচাই করার জন্য। + +```typescript +const loginPrompt = "পরিষেবা প্রদানকারীতে অ্যাক্সেস করতে, এই ননসে স্বাক্ষর করুন: " +``` + +ওয়ালেটটি বার্তাটিতে স্বাক্ষর করার জন্য ব্যবহারকারীর কাছে অনুমতি চায়। একটি বার্তা যা শুধুমাত্র একটি নন্স, তা ব্যবহারকারীদের বিভ্রান্ত করতে পারে, তাই আমরা এই প্রম্পটটি অন্তর্ভুক্ত করি। + +```typescript +// Keep requestIDs here +let nonces = {} +``` + +এটিতে প্রতিক্রিয়া জানাতে আমাদের অনুরোধের তথ্য প্রয়োজন। আমরা এটি অনুরোধের সাথে পাঠাতে পারি (ধাপ 4), এবং এটি ফেরত পেতে পারি (ধাপ 5)। তবে, আমরা ব্রাউজার থেকে প্রাপ্ত তথ্য বিশ্বাস করতে পারি না, যা একজন সম্ভাব্য প্রতিকূল ব্যবহারকারীর নিয়ন্ত্রণে থাকে। তাই এটি এখানে সংরক্ষণ করা ভাল, নন্সকে কী হিসাবে ব্যবহার করে। + +মনে রাখবেন যে আমরা সরলতার জন্য এটি এখানে একটি ভেরিয়েবল হিসাবে করছি। তবে, এর বেশ কিছু অসুবিধা রয়েছে: + +- আমরা পরিষেবা অস্বীকার (denial of service) আক্রমণের জন্য ঝুঁকিপূর্ণ। একজন ক্ষতিকারক ব্যবহারকারী একাধিকবার লগ অন করার চেষ্টা করতে পারে, যা আমাদের মেমরি পূর্ণ করে দেবে। +- যদি IdP প্রক্রিয়াটি পুনরায় চালু করার প্রয়োজন হয়, আমরা বিদ্যমান মানগুলি হারিয়ে ফেলি। +- আমরা একাধিক প্রক্রিয়ার মধ্যে লোড ব্যালেন্স করতে পারি না, কারণ প্রতিটির নিজস্ব ভেরিয়েবল থাকবে। + +একটি প্রোডাকশন সিস্টেমে আমরা একটি ডেটাবেস ব্যবহার করব এবং কোনো ধরনের মেয়াদোত্তীর্ণের ব্যবস্থা প্রয়োগ করব। + +```typescript +const getSignaturePage = requestId => { + const nonce = uuidv4() + nonces[nonce] = requestId +``` + +একটি নন্স তৈরি করুন, এবং ভবিষ্যতের ব্যবহারের জন্য `requestId` সংরক্ষণ করুন। + +```typescript + return ` + + + + + +

অনুগ্রহ করে স্বাক্ষর করুন

+ +
+ + + +` +} +``` + +বাকিটা শুধু স্ট্যান্ডার্ড HTML। + +```typescript +idpRouter.get("/signature/:nonce/:account/:signature", async (req, res) => { +``` + +এটি সিকোয়েন্স ডায়াগ্রামের ৫ নং ধাপের জন্য হ্যান্ডলার। + +```typescript + const requestId = nonces[req.params.nonce] + if (requestId === undefined) { + res.send("Bad nonce") + return ; + } + + nonces[req.params.nonce] = undefined +``` + +অনুরোধ আইডি পান, এবং `nonces` থেকে নন্সটি মুছে ফেলুন যাতে এটি পুনরায় ব্যবহার করা না যায়। + +```typescript + try { +``` + +যেহেতু স্বাক্ষরটি অনেক উপায়ে অবৈধ হতে পারে, তাই আমরা এটিকে একটি `try ...`-তে মোড়ানো। `catch` ব্লকে কোনো থ্রো করা ত্রুটি ধরতে। + +```typescript + const validSignature = await verifyMessage({ + address: req.params.account, + message: `${loginPrompt}${req.params.nonce}`, + signature: req.params.signature + }) +``` + +সিকোয়েন্স ডায়াগ্রামে ৫.৫ নং ধাপ বাস্তবায়ন করতে [`verifyMessage`](https://viem.sh/docs/actions/public/verifyMessage#verifymessage) ব্যবহার করুন। + +```typescript + if (!validSignature) + throw("Bad signature") + } catch (err) { + res.send("Error:" + err) + return ; + } +``` + +হ্যান্ডলারের বাকি অংশটি পূর্বে `/loginSubmitted` হ্যান্ডলারে আমরা যা করেছি তার সমতুল্য, শুধুমাত্র একটি ছোট পরিবর্তন ছাড়া। + +```typescript + const loginResponse = await idp.createLoginResponse( + . + . + . + { + email: req.params.account + "@bad.email.address" + } + ); +``` + +আমাদের কাছে আসল ইমেল অ্যাড্রেস নেই (আমরা এটি পরবর্তী বিভাগে পাব), তাই আপাতত আমরা ইথেরিয়াম অ্যাড্রেসটি ফেরত দিই এবং এটিকে স্পষ্টভাবে একটি ইমেল অ্যাড্রেস নয় বলে চিহ্নিত করি। + +```typescript +// IdP endpoint for login requests +idpRouter.post(`/login`, + async (req, res) => { + try { + // Workaround because I couldn't get parseLoginRequest to work. + // const loginRequest = await idp.parseLoginRequest(sp, 'post', req) + const samlRequest = xmlParser.parse(Buffer.from(req.body.SAMLRequest, 'base64').toString('utf-8')) + res.send(getSignaturePage(samlRequest["samlp:AuthnRequest"]["@_ID"])) + } catch (err) { + console.error('Error processing SAML response:', err); + res.status(400).send('SAML authentication failed'); + } + } +) +``` + +`getLoginPage`-এর পরিবর্তে, এখন ৩ নং ধাপের হ্যান্ডলারে `getSignaturePage` ব্যবহার করুন। + +## ইমেল অ্যাড্রেস পাওয়া + +পরবর্তী পদক্ষেপ হল ইমেল অ্যাড্রেস পাওয়া, যা পরিষেবা প্রদানকারীর দ্বারা অনুরোধ করা শনাক্তকারী। এটি করার জন্য, আমরা [ইথেরিয়াম অ্যাটেস্টেশন সার্ভিস (EAS)](https://attest.org/) ব্যবহার করি। + +অ্যাটেস্টেশন পাওয়ার সবচেয়ে সহজ উপায় হল [GraphQL API](https://docs.attest.org/docs/developer-tools/api) ব্যবহার করা। আমরা এই কোয়েরিটি ব্যবহার করি: + +``` +query GetAttestationsByRecipient { + attestations( + where: { + recipient: { equals: "${getAddress(ethAddr)}" } + schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" } + } + take: 1 + ) { + data + id + attester + } +} +``` + +এই [`schemaId`](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977)-এ শুধু একটি ই-মেইল অ্যাড্রেস অন্তর্ভুক্ত থাকে। এই কোয়েরিটি এই স্কিমার অ্যাটেস্টেশনের জন্য জিজ্ঞাসা করে। অ্যাটেস্টেশনের বিষয়টিকে `recipient` বা প্রাপক বলা হয়। এটি সবসময় একটি ইথেরিয়াম অ্যাড্রেস। + +সতর্কতা: আমরা এখানে যেভাবে অ্যাটেস্টেশন পাচ্ছি তাতে দুটি নিরাপত্তা সমস্যা রয়েছে। + +- আমরা API এন্ডপয়েন্ট, `https://optimism.easscan.org/graphql`-এ যাচ্ছি, যা একটি কেন্দ্রীভূত উপাদান। আমরা `id` অ্যাট্রিবিউট পেতে পারি এবং তারপর একটি অ্যাটেস্টেশন আসল কিনা তা যাচাই করার জন্য একটি অনচেইন লুকআপ করতে পারি, কিন্তু API এন্ডপয়েন্টটি আমাদের তাদের সম্পর্কে না বলে এখনও অ্যাটেস্টেশন সেন্সর করতে পারে। + + এই সমস্যাটি সমাধান করা অসম্ভব নয়, আমরা আমাদের নিজস্ব GraphQL এন্ডপয়েন্ট চালাতে পারি এবং চেইন লগ থেকে অ্যাটেস্টেশন পেতে পারি, কিন্তু তা আমাদের উদ্দেশ্যের জন্য অতিরিক্ত। + +- আমরা অ্যাটেস্টরের পরিচয় দেখি না। যেকেউ আমাদের মিথ্যা তথ্য খাওয়াতে পারে। একটি বাস্তব-বিশ্বের বাস্তবায়নে আমাদের বিশ্বস্ত অ্যাটেস্টরদের একটি সেট থাকত এবং শুধুমাত্র তাদের অ্যাটেস্টেশনগুলি দেখতাম। + +এটি কার্যকর দেখতে, বিদ্যমান IdP এবং SP বন্ধ করুন এবং এই কমান্ডগুলি চালান: + +```sh +git checkout email-address +pnpm install +pnpm start +``` + +তারপর আপনার ই-মেইল অ্যাড্রেস দিন। আপনার কাছে এটি করার দুটি উপায় আছে: + +- একটি প্রাইভেট কী ব্যবহার করে একটি ওয়ালেট আমদানি করুন, এবং টেস্টিং প্রাইভেট কী `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80` ব্যবহার করুন। + +- আপনার নিজের ই-মেইল অ্যাড্রেসের জন্য একটি অ্যাটেস্টেশন যোগ করুন: + + 1. অ্যাটেস্টেশন এক্সপ্লোরারে [স্কিমাতে](https://optimism.easscan.org/schema/view/0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977) ব্রাউজ করুন। + + 2. **স্কিমা দিয়ে অ্যাটেস্ট করুন**-এ ক্লিক করুন। + + 3. প্রাপক হিসাবে আপনার ইথেরিয়াম অ্যাড্রেস, ইমেল অ্যাড্রেস হিসাবে আপনার ই-মেইল অ্যাড্রেস লিখুন এবং **অনচেইন** নির্বাচন করুন। তারপর **অ্যাটেস্টেশন তৈরি করুন**-এ ক্লিক করুন। + + 4. আপনার ওয়ালেটে লেনদেনটি অনুমোদন করুন। গ্যাসের জন্য অর্থ প্রদান করতে আপনার [অপটিমিজম ব্লকচেইনে](https://app.optimism.io/bridge/deposit) কিছু ETH লাগবে। + +যাই হোক, এটি করার পর [http://localhost:3000](http://localhost:3000) তে ব্রাউজ করুন এবং নির্দেশাবলী অনুসরণ করুন। আপনি যদি টেস্টিং প্রাইভেট কী আমদানি করে থাকেন, তাহলে আপনি যে ই-মেইলটি পাবেন তা হল `test_addr_0@example.com`। আপনি যদি নিজের অ্যাড্রেস ব্যবহার করে থাকেন, তাহলে এটি তাই হবে যা আপনি প্রত্যয়িত করেছেন। + +### বিস্তারিত ব্যাখ্যা + +![ইথেরিয়াম অ্যাড্রেস থেকে ই-মেইলে যাওয়া](./fig-06-saml-sig-n-email.png) + +নতুন ধাপগুলি হল GraphQL কমিউনিকেশন, ধাপ ৫.৬ এবং ৫.৭। + +আবার, এখানে `idp.mts`-এর পরিবর্তিত অংশগুলি দেওয়া হল। + +```typescript +import { GraphQLClient } from 'graphql-request' +import { SchemaEncoder } from '@ethereum-attestation-service/eas-sdk' +``` + +আমাদের প্রয়োজনীয় লাইব্রেরিগুলি আমদানি করুন। + +```typescript +const graphqlEndpointUrl = "https://optimism.easscan.org/graphql" +``` + +[প্রতিটি ব্লকচেইনের জন্য একটি পৃথক এন্ডপয়েন্ট](https://docs.attest.org/docs/developer-tools/api) রয়েছে। + +```typescript +const graphqlClient = new GraphQLClient(graphqlEndpointUrl, { fetch }) +``` + +একটি নতুন `GraphQLClient` ক্লায়েন্ট তৈরি করুন যা আমরা এন্ডপয়েন্ট কোয়েরি করার জন্য ব্যবহার করতে পারি। + +```typescript +const graphqlSchema = 'string emailAddress' +const graphqlEncoder = new SchemaEncoder(graphqlSchema) +``` + +GraphQL আমাদের শুধু বাইট সহ একটি অস্বচ্ছ ডেটা অবজেক্ট দেয়। এটি বুঝতে আমাদের স্কিমা প্রয়োজন। + +```typescript +const ethereumAddressToEmail = async ethAddr => { +``` + +একটি ইথেরিয়াম অ্যাড্রেস থেকে একটি ই-মেইল অ্যাড্রেসে যাওয়ার জন্য একটি ফাংশন। + +```typescript + const query = ` + query GetAttestationsByRecipient { +``` + +এটি একটি GraphQL কোয়েরি। + +```typescript + attestations( +``` + +আমরা অ্যাটেস্টেশন খুঁজছি। + +```typescript + where: { + recipient: { equals: "${getAddress(ethAddr)}" } + schemaId: { equals: "0xfa2eff59a916e3cc3246f9aec5e0ca00874ae9d09e4678e5016006f07622f977" } + } +``` + +আমরা যে অ্যাটেস্টেশনগুলি চাই তা হল আমাদের স্কিমার মধ্যে থাকা অ্যাটেস্টেশন, যেখানে প্রাপক হল `getAddress(ethAddr)`। [`getAddress`](https://viem.sh/docs/utilities/getAddress#getaddress) ফাংশনটি নিশ্চিত করে যে আমাদের অ্যাড্রেসে সঠিক [চেকসাম](https://github.com/ethereum/ercs/blob/master/ERCS/erc-55.md) আছে। GraphQL কেস-সিগনিফিকেন্ট হওয়ায় এটি প্রয়োজনীয়। `0xBAD060A7`, `0xBad060A7`, এবং `0xbad060a7` ভিন্ন মান। + +```typescript + take: 1 +``` + +আমরা যতগুলিই অ্যাটেস্টেশন পাই না কেন, আমরা শুধুমাত্র প্রথমটি চাই। + +```typescript + ) { + data + id + attester + } + }` +``` + +আমরা যে ফিল্ডগুলি পেতে চাই। + +- `attester`: যে অ্যাড্রেসটি অ্যাটেস্টেশন জমা দিয়েছে। সাধারণত এটি অ্যাটেস্টেশনটি বিশ্বাস করা হবে কি না তা সিদ্ধান্ত নিতে ব্যবহৃত হয়। +- `id`: অ্যাটেস্টেশন আইডি। GraphQL কোয়েরি থেকে প্রাপ্ত তথ্য সঠিক কিনা তা যাচাই করতে আপনি এই মানটি ব্যবহার করে [অনচেইনে অ্যাটেস্টেশনটি পড়তে](https://optimism.blockscout.com/address/0x4200000000000000000000000000000000000021?tab=read_proxy&source_address=0x4E0275Ea5a89e7a3c1B58411379D1a0eDdc5b088#0xa3112a64) পারেন। +- `data`: স্কিমা ডেটা (এই ক্ষেত্রে, ই-মেইল অ্যাড্রেস)। + +```typescript + const queryResult = await graphqlClient.request(query) + + if (queryResult.attestations.length == 0) + return "no_address@available.is" +``` + +যদি কোনো অ্যাটেস্টেশন না থাকে, তাহলে এমন একটি মান ফেরত দিন যা স্পষ্টতই ভুল, কিন্তু যা পরিষেবা প্রদানকারীর কাছে বৈধ বলে মনে হবে। + +```typescript + const attestationDataFields = graphqlEncoder.decodeData(queryResult.attestations[0].data) + return attestationDataFields[0].value.value +} +``` + +যদি কোনো মান থাকে, তাহলে ডেটা ডিকোড করতে `decodeData` ব্যবহার করুন। আমাদের এর প্রদত্ত মেটাডেটার প্রয়োজন নেই, শুধু মানটিই প্রয়োজন। + +```typescript + const loginResponse = await idp.createLoginResponse( + sp, + { + . + . + . + }, + "post", + { + email: await ethereumAddressToEmail(req.params.account) + } + ); +``` + +ই-মেইল অ্যাড্রেস পেতে নতুন ফাংশনটি ব্যবহার করুন। + +## বিকেন্দ্রীকরণ সম্পর্কে কী? + +এই কনফিগারেশনে ব্যবহারকারীরা এমন কেউ হওয়ার ভান করতে পারে না যা তারা নয়, যতক্ষণ না আমরা ইথেরিয়াম থেকে ই-মেইল অ্যাড্রেস ম্যাপিংয়ের জন্য বিশ্বস্ত অ্যাটেস্টরদের উপর নির্ভর করি। তবে, আমাদের পরিচয় প্রদানকারী এখনও একটি কেন্দ্রীভূত উপাদান। পরিচয় প্রদানকারীর প্রাইভেট কী যার কাছে আছে, সে পরিষেবা প্রদানকারীর কাছে মিথ্যা তথ্য পাঠাতে পারে। + +[মাল্টি-পার্টি কম্পিউটেশন (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) ব্যবহার করে একটি সমাধান থাকতে পারে। আমি আশা করি ভবিষ্যতে একটি টিউটোরিয়ালে এটি নিয়ে লিখব। + +## উপসংহার + +ইথেরিয়াম স্বাক্ষরের মতো একটি লগ অন স্ট্যান্ডার্ড গ্রহণ করা একটি মুরগি ও ডিমের সমস্যার সম্মুখীন হয়। পরিষেবা প্রদানকারীরা সম্ভাব্য বিস্তৃত বাজারে আবেদন করতে চায়। ব্যবহারকারীরা তাদের লগ অন স্ট্যান্ডার্ড সমর্থন করার বিষয়ে চিন্তা না করে পরিষেবাগুলি অ্যাক্সেস করতে সক্ষম হতে চায়। +ইথেরিয়াম IdP-এর মতো অ্যাডাপ্টার তৈরি করা আমাদের এই বাধা অতিক্রম করতে সাহায্য করতে পারে। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। diff --git a/public/content/translations/bn/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md b/public/content/translations/bn/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md new file mode 100644 index 00000000000..51fb7e28b30 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/getting-started-with-ethereum-development-using-alchemy/index.md @@ -0,0 +1,156 @@ +--- +title: "Ethereum ডেভেলপমেন্ট শুরু করা" +description: "এটি Ethereum ডেভেলপমেন্ট শুরু করার জন্য নতুনদের একটি গাইড। আমরা আপনাকে একটি API এন্ডপয়েন্ট স্পিন আপ করা থেকে শুরু করে, একটি কমান্ড লাইন রিকোয়েস্ট করা, এবং আপনার প্রথম web3 স্ক্রিপ্ট লেখা পর্যন্ত নিয়ে যাব! ব্লকচেইন ডেভেলপমেন্টের কোনো অভিজ্ঞতা আবশ্যক নয়!" +author: "Elan Halpern" +tags: + [ + "javascript", + "ethers.js", + "নোড", + "querying", + "alchemy" + ] +skill: beginner +lang: bn +published: 2020-10-30 +source: Medium +sourceUrl: https://medium.com/alchemy-api/getting-started-with-ethereum-development-using-alchemy-c3d6a45c567f +--- + +![Ethereum এবং Alchemy-র লোগো](./ethereum-alchemy.png) + +এটি Ethereum ডেভেলপমেন্ট শুরু করার জন্য নতুনদের একটি গাইড। এই টিউটোরিয়ালের জন্য আমরা [Alchemy](https://alchemyapi.io/) ব্যবহার করব, যা শীর্ষস্থানীয় ব্লকচেইন ডেভেলপার প্ল্যাটফর্ম এবং যা Maker, 0x, MyEtherWallet, Dharma এবং Kyber সহ শীর্ষস্থানীয় ব্লকচেইন অ্যাপগুলোর 70% থেকে লক্ষ লক্ষ ব্যবহারকারীকে শক্তি যোগাচ্ছে। Alchemy আমাদেরকে Ethereum চেইনের একটি API এন্ডপয়েন্টে অ্যাক্সেস দেবে যাতে আমরা ট্রানজ্যাকশন পড়তে এবং লিখতে পারি। + +আমরা আপনাকে Alchemy-তে সাইন আপ করা থেকে শুরু করে আপনার প্রথম web3 স্ক্রিপ্ট লেখা পর্যন্ত নিয়ে যাব! ব্লকচেইন ডেভেলপমেন্টের কোনো অভিজ্ঞতা আবশ্যক নয়! + +## ১. একটি বিনামূল্যে Alchemy অ্যাকাউন্টের জন্য সাইন আপ করুন {#sign-up-for-a-free-alchemy-account} + +Alchemy-তে একটি অ্যাকাউন্ট তৈরি করা সহজ, [এখানে বিনামূল্যে সাইন আপ করুন](https://auth.alchemy.com/)। + +## 2. একটি Alchemy অ্যাপ তৈরি করুন {#create-an-alchemy-app} + +Ethereum চেইনের সাথে যোগাযোগ করতে এবং Alchemy-র প্রোডাক্টগুলো ব্যবহার করতে, আপনার রিকোয়েস্টগুলো প্রমাণীকরণ করার জন্য একটি API কী প্রয়োজন। + +আপনি [ড্যাশবোর্ড থেকে API কী তৈরি করতে পারেন](https://dashboard.alchemy.com/)। একটি নতুন কী তৈরি করতে, নিচে দেখানো হিসাবে “Create App”-এ নেভিগেট করুন: + +[_ShapeShift_](https://shapeshift.com/)-কে বিশেষ ধন্যবাদ _আমাদেরকে তাদের ড্যাশবোর্ড দেখানোর সুযোগ দেওয়ার জন্য!_ + +![Alchemy ড্যাশবোর্ড](./alchemy-dashboard.png) + +আপনার নতুন কী পেতে “Create App”-এর অধীনে বিবরণ পূরণ করুন। আপনি এখানে আপনার পূর্বে তৈরি করা অ্যাপ এবং আপনার দলের তৈরি করা অ্যাপগুলোও দেখতে পারেন। যেকোনো অ্যাপের জন্য “View Key”-তে ক্লিক করে বিদ্যমান কীগুলো পান। + +![Alchemy দিয়ে অ্যাপ তৈরির স্ক্রিনশট](./create-app.png) + +আপনি “Apps”-এর উপর হোভার করে এবং একটি নির্বাচন করে বিদ্যমান API কীগুলোও পেতে পারেন। আপনি এখানে “View Key” করতে পারেন, পাশাপাশি নির্দিষ্ট ডোমেন হোয়াইটলিস্ট করতে, বিভিন্ন ডেভেলপার টুলস দেখতে এবং অ্যানালিটিক্স দেখতে “Edit App” করতে পারেন। + +![একজন ব্যবহারকারী কীভাবে API কীগুলো পেতে পারে তা দেখানো একটি জিআইএফ](./pull-api-keys.gif) + +## 3. কমান্ড লাইন থেকে একটি রিকোয়েস্ট করুন {#make-a-request-from-the-command-line} + +JSON-RPC এবং curl ব্যবহার করে Alchemy-র মাধ্যমে Ethereum ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করুন। + +ম্যানুয়াল রিকোয়েস্টগুলোর জন্য, আমরা `POST` রিকোয়েস্টের মাধ্যমে `JSON-RPC`-এর সাথে ইন্টারঅ্যাক্ট করার সুপারিশ করি। কেবলমাত্র `Content-Type: application/json` হেডার এবং আপনার কোয়েরিটি নিম্নলিখিত ফিল্ডগুলো সহ `POST` বডি হিসাবে পাস করুন: + +- `jsonrpc`: JSON-RPC সংস্করণ—বর্তমানে, শুধুমাত্র `2.0` সমর্থিত। +- `method`: ETH API মেথড। [API রেফারেন্স দেখুন।](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc) +- `params`: মেথডে পাস করার জন্য প্যারামিটারগুলোর একটি তালিকা। +- `id`: আপনার রিকোয়েস্টের আইডি। রেসপন্সের মাধ্যমে এটি ফেরত দেওয়া হবে যাতে আপনি ট্র্যাক রাখতে পারেন কোন রিকোয়েস্টের জন্য কোন রেসপন্সটি এসেছে। + +এখানে একটি উদাহরণ রয়েছে যা আপনি বর্তমান গ্যাসের মূল্য পুনরুদ্ধার করতে কমান্ড লাইন থেকে চালাতে পারেন: + +```bash +curl https://eth-mainnet.alchemyapi.io/v2/demo \ +-X POST \ +-H "Content-Type: application/json" \ +-d '{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":73}' +``` + +_**দ্রষ্টব্য:** [https://eth-mainnet.alchemyapi.io/v2/demo](https://eth-mainnet.alchemyapi.io/jsonrpc/demo)-কে আপনার নিজের API কী `https://eth-mainnet.alchemyapi.io/v2/**your-api-key` দিয়ে প্রতিস্থাপন করুন।_ + +**ফলাফল:** + +```json +{ "id": 73,"jsonrpc": "2.0","result": "0x09184e72a000" // 10000000000000 } +``` + +## ৪. আপনার Web3 ক্লায়েন্ট সেট আপ করুন {#set-up-your-web3-client} + +**যদি আপনার একটি বিদ্যমান ক্লায়েন্ট থাকে,** আপনার বর্তমান নোড প্রোভাইডার URL-কে আপনার API কীসহ একটি Alchemy URL-এ পরিবর্তন করুন: `“https://eth-mainnet.alchemyapi.io/v2/your-api-key"` + +**_দ্রষ্টব্য:_** নিচের স্ক্রিপ্টগুলো একটি **নোড কনটেক্সটে** চালাতে হবে অথবা **একটি ফাইলে সেভ করতে হবে**, কমান্ড লাইন থেকে চালানো যাবে না। যদি আপনার আগে থেকেই Node বা npm ইনস্টল করা না থাকে, তাহলে ম্যাকের জন্য এই দ্রুত [সেট-আপ গাইডটি](https://app.gitbook.com/@alchemyapi/s/alchemy/guides/alchemy-for-macs) দেখুন। + +অনেক [Web3 লাইব্রেরি](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) আছে যা আপনি Alchemy-র সাথে ইন্টিগ্রেট করতে পারেন, তবে আমরা [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) ব্যবহার করার সুপারিশ করি, যা web3.js-এর একটি ড্রপ-ইন প্রতিস্থাপন এবং যা Alchemy-র সাথে নির্বিঘ্নে কাজ করার জন্য তৈরি এবং কনফিগার করা হয়েছে। এটি স্বয়ংক্রিয় পুনঃপ্রচেষ্টা এবং শক্তিশালী WebSocket সাপোর্টের মতো একাধিক সুবিধা প্রদান করে। + +AlchemyWeb3.js ইনস্টল করতে, **আপনার প্রজেক্ট ডিরেক্টরিতে নেভিগেট করুন** এবং চালান: + +**Yarn দিয়ে:** + +``` +yarn add @alch/alchemy-web3 +``` + +**NPM দিয়ে:** + +``` +npm install @alch/alchemy-web3 +``` + +Alchemy-র নোড ইনফ্রাস্ট্রাকচারের সাথে ইন্টারঅ্যাক্ট করতে, NodeJS-এ চালান অথবা এটি একটি JavaScript ফাইলে যোগ করুন: + +```js +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3( + "https://eth-mainnet.alchemyapi.io/v2/your-api-key" +) +``` + +## ৫। আপনার প্রথম Web3 স্ক্রিপ্ট লিখুন! {#write-your-first-web3-script} + +এখন কিছু web3 প্রোগ্রামিংয়ে হাত পাকানোর জন্য আমরা একটি সাধারণ স্ক্রিপ্ট লিখব যা Ethereum মেইননেট থেকে সর্বশেষ ব্লক নম্বরটি প্রিন্ট করবে। + +**১. যদি আপনি এখনও না করে থাকেন, তাহলে আপনার টার্মিনালে একটি নতুন প্রজেক্ট ডিরেক্টরি তৈরি করুন এবং তার মধ্যে প্রবেশ করুন:** + +``` +mkdir web3-example +cd web3-example +``` + +**২. যদি আপনি আগে থেকে না করে থাকেন, তাহলে আপনার প্রজেক্টে Alchemy web3 (বা যেকোনো web3) ডিপেনডেন্সি ইনস্টল করুন:** + +``` +npm install @alch/alchemy-web3 +``` + +**৩. `index.js` নামে একটি ফাইল তৈরি করুন এবং নিম্নলিখিত কন্টেন্টগুলো যোগ করুন:** + +> আপনার শেষ পর্যন্ত `demo`-কে আপনার Alchemy HTTP API কী দিয়ে প্রতিস্থাপন করা উচিত। + +```js +async function main() { + const { createAlchemyWeb3 } = require("@alch/alchemy-web3") + const web3 = createAlchemyWeb3("https://eth-mainnet.alchemyapi.io/v2/demo") + const blockNumber = await web3.eth.getBlockNumber() + console.log("সর্বশেষ ব্লক নম্বরটি হল " + blockNumber) +} +main() +``` + +অ্যাসিঙ্ক বিষয়গুলোর সাথে অপরিচিত? এই [মিডিয়াম পোস্টটি](https://medium.com/better-programming/understanding-async-await-in-javascript-1d81bb079b2c) দেখুন। + +**4.** নোড ব্যবহার করে এটি আপনার টার্মিনালে চালান\*\* + +``` +node index.js +``` + +**5.** আপনি এখন আপনার কনসোলে সর্বশেষ ব্লক নম্বরের আউটপুট দেখতে পাবেন!\*\* + +``` +সর্বশেষ ব্লক নম্বর হল 11043912 +``` + +**বাহ! অভিনন্দন! আপনি এইমাত্র Alchemy ব্যবহার করে আপনার প্রথম web3 স্ক্রিপ্ট লিখেছেন 🎉** + +এরপরে কী করবেন তা নিয়ে নিশ্চিত নন? আমাদের [হ্যালো ওয়ার্ল্ড স্মার্ট কন্ট্র্যাক্ট গাইডে](https://www.alchemy.com/docs/hello-world-smart-contract) আপনার প্রথম স্মার্ট কন্ট্র্যাক্ট ডিপ্লয় করার চেষ্টা করুন এবং কিছু সলিডিটি প্রোগ্রামিংয়ের সাথে হাত পাকান, অথবা [ড্যাশবোর্ড ডেমো অ্যাপ](https://docs.alchemyapi.io/tutorials/demo-app) দিয়ে আপনার ড্যাশবোর্ডের জ্ঞান পরীক্ষা করুন! + +_[বিনামূল্যে Alchemy-তে সাইন আপ করুন](https://auth.alchemy.com/), আমাদের [নথিপত্র](https://www.alchemy.com/docs/) দেখুন এবং সর্বশেষ খবরের জন্য, আমাদের [টুইটারে](https://twitter.com/AlchemyPlatform) অনুসরণ করুন_। diff --git a/public/content/translations/bn/developers/tutorials/guide-to-smart-contract-security-tools/index.md b/public/content/translations/bn/developers/tutorials/guide-to-smart-contract-security-tools/index.md new file mode 100644 index 00000000000..9cb0d88f3c6 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/guide-to-smart-contract-security-tools/index.md @@ -0,0 +1,102 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা টুলের জন্য একটি গাইড" +description: "তিনটি ভিন্ন পরীক্ষা এবং প্রোগ্রাম বিশ্লেষণ কৌশলের একটি সংক্ষিপ্ত বিবরণ" +author: "Trailofbits" +lang: bn +tags: [ "সলিডিটি", "স্মার্ট কন্ট্র্যাক্ট", "নিরাপত্তা" ] +skill: intermediate +published: 2020-09-07 +source: Building secure contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis +--- + +আমরা তিনটি স্বতন্ত্র পরীক্ষা এবং প্রোগ্রাম বিশ্লেষণ কৌশল ব্যবহার করতে যাচ্ছি: + +- **[Slither](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) সহ স্ট্যাটিক বিশ্লেষণ।** প্রোগ্রামের সমস্ত পাথ একই সময়ে অনুমান করা হয় এবং বিশ্লেষণ করা হয়, বিভিন্ন প্রোগ্রাম উপস্থাপনার মাধ্যমে (যেমন, কন্ট্রোল-ফ্লো-গ্রাফ) +- **[Echidna](/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/) দিয়ে ফাজিং।** একটি সিউডো-র‍্যান্ডম লেনদেন জেনারেশনের মাধ্যমে কোডটি এক্সিকিউট করা হয়। ফাজার একটি প্রদত্ত প্রপার্টি লঙ্ঘন করার জন্য লেনদেনের একটি ক্রম খুঁজে বের করার চেষ্টা করবে। +- **[Manticore](/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/) দিয়ে সিম্বলিক এক্সিকিউশন।** একটি ফর্মাল ভেরিফিকেশন কৌশল, যা প্রতিটি এক্সিকিউশন পাথকে একটি গাণিতিক সূত্রে অনুবাদ করে, যার উপর সীমাবদ্ধতা পরীক্ষা করা যেতে পারে। + +প্রতিটি কৌশলের সুবিধা এবং অসুবিধা রয়েছে, এবং [নির্দিষ্ট ক্ষেত্রে](#determining-security-properties) কার্যকর হবে: + +| কৌশল | টুল | ব্যবহার | গতি | মিস করা বাগ | ভুল অ্যালার্ম | +| ------------------- | --------- | -------------------------------- | ------- | ------------ | ------------- | +| স্ট্যাটিক বিশ্লেষণ | Slither | CLI এবং স্ক্রিপ্ট | সেকেন্ড | মাঝারি | নিম্ন | +| ফাজিং | Echidna | Solidity প্রপার্টি | মিনিট | নিম্ন | কোনোটিই নয় | +| সিম্বলিক এক্সিকিউশন | Manticore | Solidity প্রপার্টি এবং স্ক্রিপ্ট | ঘন্টা | কোনোটিই নয়\* | কোনোটিই নয় | + +\* যদি সমস্ত পথ টাইমআউট ছাড়াই অন্বেষণ করা হয় + +**Slither** কয়েক সেকেন্ডের মধ্যে কন্ট্র্যাক্ট বিশ্লেষণ করে, তবে, স্ট্যাটিক বিশ্লেষণের ফলে ভুল অ্যালার্ম হতে পারে এবং জটিল পরীক্ষার জন্য (যেমন, গাণিতিক পরীক্ষা) এটি কম উপযুক্ত হবে। বিল্ট-ইন ডিটেক্টরে পুশ-বাটন অ্যাক্সেসের জন্য API-এর মাধ্যমে বা ব্যবহারকারী-সংজ্ঞায়িত পরীক্ষার জন্য API-এর মাধ্যমে Slither চালান। + +**Echidna** কে কয়েক মিনিটের জন্য চালাতে হবে এবং এটি কেবল ট্রু পজিটিভ ফলাফল তৈরি করবে। Echidna ব্যবহারকারী-প্রদত্ত নিরাপত্তা প্রপার্টি পরীক্ষা করে, যা Solidity-তে লেখা। এটি র‍্যান্ডম অন্বেষণের উপর ভিত্তি করে হওয়ায় কিছু বাগ মিস করতে পারে। + +**Manticore** "সবচেয়ে ভারী" বিশ্লেষণ সম্পাদন করে। Echidna-র মতো, Manticore ব্যবহারকারী-প্রদত্ত প্রপার্টি যাচাই করে। এটি চালাতে আরও বেশি সময় লাগবে, তবে এটি একটি প্রপার্টির বৈধতা প্রমাণ করতে পারে এবং ভুল অ্যালার্ম রিপোর্ট করবে না। + +## প্রস্তাবিত ওয়ার্কফ্লো {#suggested-workflow} + +এখন কোনো সাধারণ বাগ উপস্থিত নেই বা পরে যোগ করা হবে না তা নিশ্চিত করতে Slither-এর বিল্ট-ইন ডিটেক্টর দিয়ে শুরু করুন। ইনহেরিটেন্স, ভ্যারিয়েবল নির্ভরতা এবং কাঠামোগত সমস্যা সম্পর্কিত প্রপার্টি পরীক্ষা করতে Slither ব্যবহার করুন। কোডবেস বড় হওয়ার সাথে সাথে স্টেট মেশিনের আরও জটিল প্রপার্টি পরীক্ষা করতে Echidna ব্যবহার করুন। Solidity থেকে পাওয়া যায় না এমন সুরক্ষার জন্য কাস্টম চেক তৈরি করতে Slither-কে আবার ব্যবহার করুন, যেমন একটি ফাংশনকে ওভাররাইড করার বিরুদ্ধে সুরক্ষা। সবশেষে, জটিল নিরাপত্তা প্রপার্টি, যেমন, গাণিতিক ক্রিয়াকলাপের লক্ষ্যযুক্ত যাচাইকরণের জন্য Manticore ব্যবহার করুন। + +- সাধারণ সমস্যাগুলি ধরতে Slither-এর CLI ব্যবহার করুন +- আপনার কন্ট্র্যাক্টের উচ্চ-স্তরের নিরাপত্তা প্রপার্টি পরীক্ষা করতে Echidna ব্যবহার করুন +- কাস্টম স্ট্যাটিক চেক লিখতে Slither ব্যবহার করুন +- আপনি যখন জটিল নিরাপত্তা প্রপার্টির গভীরতর নিশ্চয়তা চান তখন Manticore ব্যবহার করুন + +**ইউনিট পরীক্ষার উপর একটি নোট**। উচ্চ-মানের সফ্টওয়্যার তৈরি করতে ইউনিট পরীক্ষা প্রয়োজন। তবে, এই কৌশলগুলি নিরাপত্তা ত্রুটি খুঁজে বের করার জন্য সবচেয়ে উপযুক্ত নয়। এগুলি সাধারণত কোডের পজিটিভ আচরণ পরীক্ষা করার জন্য ব্যবহৃত হয় (অর্থাৎ, কোডটি স্বাভাবিক প্রসঙ্গে প্রত্যাশিতভাবে কাজ করে), যেখানে নিরাপত্তা ত্রুটিগুলি এজ কেসে থাকে যা ডেভেলপাররা বিবেচনা করেননি। কয়েক ডজন স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা পর্যালোচনার উপর আমাদের গবেষণায়, আমরা আমাদের ক্লায়েন্টের কোডে যে পরিমাণ বা তীব্রতার নিরাপত্তা ত্রুটি পেয়েছি, তার উপর [ইউনিট পরীক্ষা কভারেজের কোনো প্রভাব ছিল না](https://blog.trailofbits.com/2019/08/08/246-findings-from-our-smart-contract-audits-an-executive-summary/)। + +## নিরাপত্তা প্রপার্টি নির্ধারণ {#determining-security-properties} + +আপনার কোড কার্যকরভাবে পরীক্ষা এবং যাচাই করার জন্য, আপনাকে মনোযোগের প্রয়োজন এমন ক্ষেত্রগুলি চিহ্নিত করতে হবে। যেহেতু নিরাপত্তার জন্য আপনার রিসোর্স সীমিত, তাই আপনার প্রচেষ্টাকে অপ্টিমাইজ করার জন্য আপনার কোডবেসের দুর্বল বা উচ্চ-মূল্যের অংশগুলির পরিধি নির্ধারণ করা গুরুত্বপূর্ণ। থ্রেট মডেলিং সাহায্য করতে পারে। পর্যালোচনা করার কথা বিবেচনা করুন: + +- [র‍্যাপিড রিস্ক অ্যাসেসমেন্ট](https://infosec.mozilla.org/guidelines/risk/rapid_risk_assessment.html) (সময় কম থাকলে আমাদের পছন্দের পদ্ধতি) +- [ডেটা-সেন্ট্রিক সিস্টেম থ্রেট মডেলিংয়ের জন্য নির্দেশিকা](https://csrc.nist.gov/pubs/sp/800/154/ipd) (ওরফে NIST 800-154) +- [Shostack থ্রেট মডেলিং](https://www.amazon.com/Threat-Modeling-Designing-Adam-Shostack/dp/1118809998) +- [STRIDE](https://wikipedia.org/wiki/STRIDE_\(security\)) / [DREAD](https://wikipedia.org/wiki/DREAD_\(risk_assessment_model\)) +- [PASTA](https://wikipedia.org/wiki/Threat_model#P.A.S.T.A.) +- [অ্যাসার্শনের ব্যবহার](https://blog.regehr.org/archives/1091) + +### উপাদান {#components} + +আপনি কী পরীক্ষা করতে চান তা জানলে সঠিক টুল বেছে নিতেও সাহায্য করবে। + +স্মার্ট কন্ট্র্যাক্টের জন্য প্রায়শই প্রাসঙ্গিক বিস্তৃত ক্ষেত্রগুলির মধ্যে রয়েছে: + +- **স্টেট মেশিন।** বেশিরভাগ কন্ট্র্যাক্টকে একটি স্টেট মেশিন হিসাবে উপস্থাপন করা যেতে পারে। বিবেচনা করুন যে (1) কোনো অবৈধ স্টেটে পৌঁছানো যাবে না, (2) যদি একটি স্টেট বৈধ হয় তবে সেখানে পৌঁছানো যাবে, এবং (3) কোনো স্টেট কন্ট্র্যাক্টকে ফাঁদে ফেলবে না। + + - স্টেট-মেশিন স্পেসিফিকেশন পরীক্ষা করার জন্য Echidna এবং Manticore হল পছন্দের টুল। + +- **অ্যাক্সেস কন্ট্রোল।** যদি আপনার সিস্টেমে বিশেষ সুবিধাপ্রাপ্ত ব্যবহারকারী থাকে (যেমন, একজন মালিক, কন্ট্রোলার, ...) আপনাকে নিশ্চিত করতে হবে যে (1) প্রত্যেক ব্যবহারকারী শুধুমাত্র অনুমোদিত কাজ সম্পাদন করতে পারে এবং (2) কোনো ব্যবহারকারী আরও সুবিধাপ্রাপ্ত ব্যবহারকারীর কাজ ব্লক করতে পারে না। + + - Slither, Echidna এবং Manticore সঠিক অ্যাক্সেস কন্ট্রোল পরীক্ষা করতে পারে। উদাহরণস্বরূপ, Slither পরীক্ষা করতে পারে যে শুধুমাত্র হোয়াইটলিস্ট করা ফাংশনগুলিতে onlyOwner মডিফায়ার নেই। Echidna এবং Manticore আরও জটিল অ্যাক্সেস কন্ট্রোলের জন্য উপযোগী, যেমন একটি কন্ট্র্যাক্ট একটি নির্দিষ্ট স্টেটে পৌঁছালে তবেই অনুমতি দেওয়া হয়। + +- **গাণিতিক অপারেশন।** গাণিতিক অপারেশনের সুস্থতা পরীক্ষা করা গুরুত্বপূর্ণ। ওভারফ্লো/আন্ডারফ্লো প্রতিরোধ করতে সর্বত্র `SafeMath` ব্যবহার করা একটি ভাল পদক্ষেপ, তবে, আপনাকে এখনও অন্যান্য গাণিতিক ত্রুটিগুলি বিবেচনা করতে হবে, যার মধ্যে রাউন্ডিং সমস্যা এবং কন্ট্র্যাক্টকে ফাঁদে ফেলার মতো ত্রুটি রয়েছে। + + - Manticore এখানে সেরা পছন্দ। যদি গাণিতিক হিসাব SMT সলভারের সুযোগের বাইরে থাকে তবে Echidna ব্যবহার করা যেতে পারে। + +- **ইনহেরিটেন্সের সঠিকতা।** Solidity কন্ট্র্যাক্টগুলি মাল্টিপল ইনহেরিটেন্সের উপর ব্যাপকভাবে নির্ভর করে। `super` কল মিস করা শ্যাডোইং ফাংশন এবং ভুল ব্যাখ্যা করা c3 লিনিয়ারাইজেশন অর্ডারের মতো ভুলগুলি সহজেই চালু করা যেতে পারে। + + - Slither এই সমস্যাগুলি সনাক্তকরণ নিশ্চিত করার টুল। + +- **বাহ্যিক ইন্টারঅ্যাকশন।** কন্ট্র্যাক্টগুলি একে অপরের সাথে ইন্টারঅ্যাক্ট করে, এবং কিছু বাহ্যিক কন্ট্র্যাক্টকে বিশ্বাস করা উচিত নয়। উদাহরণস্বরূপ, যদি আপনার কন্ট্র্যাক্ট বাহ্যিক ওরাকলের উপর নির্ভর করে, তাহলে উপলব্ধ ওরাকলের অর্ধেক আপোস করা হলে এটি কি সুরক্ষিত থাকবে? + + - আপনার কন্ট্র্যাক্টের সাথে বাহ্যিক ইন্টারঅ্যাকশন পরীক্ষা করার জন্য Manticore এবং Echidna সেরা পছন্দ। Manticore-এর বাহ্যিক কন্ট্র্যাক্ট স্টাব করার জন্য একটি বিল্ট-ইন মেকানিজম রয়েছে। + +- **স্ট্যান্ডার্ড কনফরমেন্স।** Ethereum স্ট্যান্ডার্ডগুলির (যেমন, ERC20) ডিজাইনে ত্রুটির ইতিহাস রয়েছে। আপনি যে স্ট্যান্ডার্ডের উপর ভিত্তি করে তৈরি করছেন তার সীমাবদ্ধতা সম্পর্কে সচেতন থাকুন। + - Slither, Echidna, এবং Manticore আপনাকে একটি প্রদত্ত স্ট্যান্ডার্ড থেকে বিচ্যুতি সনাক্ত করতে সাহায্য করবে। + +### টুল নির্বাচনের চিটশিট {#tool-selection-cheatsheet} + +| উপাদান | টুলস | উদাহরণ | +| ----------------------- | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| স্টেট মেশিন | Echidna, Manticore | | +| অ্যাক্সেস কন্ট্রোল | Slither, Echidna, Manticore | [Slither এক্সারসাইজ 2](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise2.md), [Echidna এক্সারসাইজ 2](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-2.md) | +| গাণিতিক অপারেশন | Manticore, Echidna | [Echidna এক্সারসাইজ 1](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/exercises/Exercise-1.md), [Manticore এক্সারসাইজ 1 - 3](https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore/exercises) | +| ইনহেরিটেন্সের সঠিকতা | Slither | [Slither এক্সারসাইজ 1](https://github.com/crytic/slither/blob/7f54c8b948c34fb35e1d61adaa1bd568ca733253/docs/src/tutorials/exercise1.md) | +| বাহ্যিক ইন্টারঅ্যাকশন | Manticore, Echidna | | +| স্ট্যান্ডার্ড কনফরমেন্স | Slither, Echidna, Manticore | [`slither-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) | + +আপনার লক্ষ্যের উপর নির্ভর করে অন্যান্য ক্ষেত্রগুলি পরীক্ষা করার প্রয়োজন হবে, তবে এই স্থূল-দানাযুক্ত ক্ষেত্রগুলি যেকোনো স্মার্ট কন্ট্র্যাক্ট সিস্টেমের জন্য একটি ভাল শুরু। + +আমাদের পাবলিক অডিটগুলিতে যাচাইকৃত বা পরীক্ষিত প্রপার্টির উদাহরণ রয়েছে। বাস্তব-বিশ্বের নিরাপত্তা প্রপার্টি পর্যালোচনা করতে নিম্নলিখিত রিপোর্টগুলির `স্বয়ংক্রিয় পরীক্ষা এবং যাচাইকরণ` বিভাগগুলি পড়ার কথা বিবেচনা করুন: + +- [0x](https://github.com/trailofbits/publications/blob/master/reviews/0x-protocol.pdf) +- [Balancer](https://github.com/trailofbits/publications/blob/master/reviews/BalancerCore.pdf) diff --git a/public/content/translations/bn/developers/tutorials/hello-world-smart-contract-fullstack/index.md b/public/content/translations/bn/developers/tutorials/hello-world-smart-contract-fullstack/index.md new file mode 100644 index 00000000000..8b1939fa53f --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/hello-world-smart-contract-fullstack/index.md @@ -0,0 +1,1542 @@ +--- +title: "নতুনদের জন্য Hello World স্মার্ট কন্ট্র্যাক্ট - ফুলস্ট্যাক" +description: "Ethereum-এ একটি সহজ স্মার্ট কন্ট্র্যাক্ট লেখা এবং স্থাপন করার উপর একটি পরিচিতি টিউটোরিয়াল।" +author: "nstrike2" +tags: + [ + "সলিডিটি", + "hardhat", + "alchemy", + "স্মার্ট কন্ট্র্যাক্ট", + "ডেপ্লয়িং", + "ব্লক এক্সপ্লোরার", + "ফ্রন্টএন্ড", + "লেনদেনসমূহ" + ] +skill: beginner +lang: bn +published: 2021-10-25 +--- + +আপনি যদি ব্লকচেইন ডেভেলপমেন্টে নতুন হন এবং কোথা থেকে শুরু করবেন বা কীভাবে স্মার্ট কন্ট্র্যাক্ট স্থাপন এবং তার সঙ্গে যোগাযোগ করবেন তা না জানেন, তবে এই গাইডটি আপনার জন্য। আমরা [MetaMask](https://metamask.io), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org), এবং [Alchemy](https://alchemy.com/eth) ব্যবহার করে Goerli টেস্ট নেটওয়ার্কে একটি সহজ, স্মার্ট কন্ট্র্যাক্ট তৈরি এবং স্থাপন করার পদ্ধতি ধাপে ধাপে দেখাব। + +এই টিউটোরিয়ালটি সম্পূর্ণ করতে আপনার একটি Alchemy অ্যাকাউন্ট লাগবে। [একটি বিনামূল্যে অ্যাকাউন্টের জন্য সাইন আপ করুন](https://www.alchemy.com/)। + +যেকোনো পর্যায়ে আপনার কোনো প্রশ্ন থাকলে, নির্দ্বিধায় [Alchemy Discord](https://discord.gg/gWuC7zB)-এ যোগাযোগ করুন! + +## পর্ব ১ - Hardhat ব্যবহার করে আপনার স্মার্ট কন্ট্র্যাক্ট তৈরি ও স্থাপন করুন {#part-1} + +### ইথেরিয়াম নেটওয়ার্কের সাথে সংযোগ করুন {#connect-to-the-ethereum-network} + +Ethereum চেইনে রিকুয়েস্ট করার অনেক উপায় আছে। সহজ করার জন্য, আমরা Alchemy-তে একটি বিনামূল্যের অ্যাকাউন্ট ব্যবহার করব, যা একটি ব্লকচেইন ডেভেলপার প্ল্যাটফর্ম এবং API, যা আমাদের নিজেদের নোড না চালিয়ে ইথেরিয়াম চেইনের সাথে যোগাযোগ করতে দেয়। Alchemy-তে নিরীক্ষণ এবং বিশ্লেষণের জন্য ডেভেলপার টুলও রয়েছে; আমাদের স্মার্ট কন্ট্র্যাক্ট স্থাপনার নেপথ্যে কী ঘটছে তা বোঝার জন্য আমরা এই টিউটোরিয়ালে এগুলির সুবিধা নেব। + +### আপনার অ্যাপ এবং API কী তৈরি করুন {#create-your-app-and-api-key} + +একবার আপনি একটি Alchemy অ্যাকাউন্ট তৈরি করলে, আপনি একটি অ্যাপ তৈরি করে একটি API কী তৈরি করতে পারেন। এটি আপনাকে Goerli টেস্টনেটে অনুরোধ করার অনুমতি দেবে। আপনি যদি টেস্টনেটগুলির সাথে পরিচিত না হন তবে আপনি [একটি নেটওয়ার্ক বেছে নেওয়ার জন্য Alchemy-র গাইডটি পড়তে পারেন](https://www.alchemy.com/docs/choosing-a-web3-network)। + +Alchemy ড্যাশবোর্ডে, নেভিগেশন বারে **অ্যাপস** ড্রপডাউনটি খুঁজুন এবং **অ্যাপ তৈরি করুন**-এ ক্লিক করুন। + +![হ্যালো ওয়ার্ল্ড অ্যাপ তৈরি করুন](./hello-world-create-app.png) + +আপনার অ্যাপটিকে '_Hello World_' নাম দিন এবং একটি সংক্ষিপ্ত বিবরণ লিখুন। আপনার এনভায়রনমেন্ট হিসেবে **Staging** এবং আপনার নেটওয়ার্ক হিসেবে **Goerli** নির্বাচন করুন। + +![অ্যাপ ভিউ হ্যালো ওয়ার্ল্ড তৈরি করুন](./create-app-view-hello-world.png) + +_দ্রষ্টব্য: অবশ্যই **Goerli** নির্বাচন করুন, নতুবা এই টিউটোরিয়ালটি কাজ করবে না।_ + +**অ্যাপ তৈরি করুন**-এ ক্লিক করুন। আপনার অ্যাপটি নীচের টেবিলে প্রদর্শিত হবে। + +### একটি ইথেরিয়াম অ্যাকাউন্ট তৈরি করুন {#create-an-ethereum-account} + +লেনদেন পাঠানো এবং গ্রহণ করার জন্য আপনার একটি ইথেরিয়াম অ্যাকাউন্ট প্রয়োজন। আমরা MetaMask ব্যবহার করব, যা ব্রাউজারের একটি ভার্চুয়াল ওয়ালেট এবং এটি ব্যবহারকারীদের তাদের ইথেরিয়াম অ্যাকাউন্টের ঠিকানা পরিচালনা করতে দেয়। + +আপনি [এখানে](https://metamask.io/download) বিনামূল্যে একটি MetaMask অ্যাকাউন্ট ডাউনলোড এবং তৈরি করতে পারেন। যখন আপনি একটি অ্যাকাউন্ট তৈরি করছেন, বা যদি আপনার আগে থেকেই একটি অ্যাকাউন্ট থাকে, তবে উপরের ডানদিকে থাকা "Goerli Test Network"-এ স্যুইচ করতে ভুলবেন না (যাতে আমরা আসল টাকা নিয়ে কাজ না করি)। + +### ধাপ ৪: একটি ফসেট থেকে ইথার যোগ করুন {#step-4-add-ether-from-a-faucet} + +টেস্ট নেটওয়ার্কে আপনার স্মার্ট কন্ট্র্যাক্ট স্থাপন করতে, আপনার কিছু নকল ETH লাগবে। Goerli নেটওয়ার্কে ETH পেতে, একটি Goerli ফসেটে যান এবং আপনার Goerli অ্যাকাউন্টের ঠিকানা লিখুন। উল্লেখ্য যে Goerli ফসেটগুলি সম্প্রতি কিছুটা অবিশ্বাস্য হতে পারে - চেষ্টা করার জন্য বিকল্পগুলির একটি তালিকার জন্য [টেস্ট নেটওয়ার্ক পৃষ্ঠাটি](/developers/docs/networks/#goerli) দেখুন: + +_দ্রষ্টব্য: নেটওয়ার্ক কনজেশনের কারণে, এতে কিছুটা সময় লাগতে পারে।_ +`` + +### ধাপ ৫: আপনার ব্যালেন্স পরীক্ষা করুন {#step-5-check-your-balance} + +আপনার ওয়ালেটে ETH আছে কিনা তা পুনরায় পরীক্ষা করতে, আসুন আমরা [Alchemy-র কম্পোজার টুল](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D) ব্যবহার করে একটি [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) অনুরোধ করি। এটি আমাদের ওয়ালেটে থাকা ETH-এর পরিমাণ ফেরত দেবে। আরও জানতে [কম্পোজার টুলটি কীভাবে ব্যবহার করবেন সে সম্পর্কে Alchemy-র সংক্ষিপ্ত টিউটোরিয়ালটি](https://youtu.be/r6sjRxBZJuU) দেখুন। + +আপনার MetaMask অ্যাকাউন্টের ঠিকানা ইনপুট করুন এবং **অনুরোধ পাঠান**-এ ক্লিক করুন। আপনি নীচের কোড স্নিপেটের মতো একটি প্রতিক্রিয়া দেখতে পাবেন। + +```json +{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } +``` + +> _দ্রষ্টব্য: এই ফলাফলটি wei-তে, ETH-এ নয়।_ Wei ইথারের ক্ষুদ্রতম একক হিসাবে ব্যবহৃত হয়।_ + +যাক বাবা! আমাদের নকল টাকা সব আছে। + +### ধাপ ৬: আমাদের প্রজেক্ট শুরু করুন {#step-6-initialize-our-project} + +প্রথমে, আমাদের প্রজেক্টের জন্য একটি ফোল্ডার তৈরি করতে হবে। আপনার কমান্ড লাইনে নেভিগেট করুন এবং নিম্নলিখিতটি ইনপুট করুন। + +``` +mkdir hello-world +cd hello-world +``` + +এখন যেহেতু আমরা আমাদের প্রজেক্ট ফোল্ডারের ভিতরে আছি, আমরা প্রজেক্টটি শুরু করতে `npm init` ব্যবহার করব। + +> যদি আপনার এখনও npm ইনস্টল করা না থাকে, তাহলে [Node.js এবং npm ইনস্টল করার জন্য এই নির্দেশাবলী](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) অনুসরণ করুন। + +এই টিউটোরিয়ালের উদ্দেশ্যে, আপনি ইনিশিয়ালাইজেশন প্রশ্নগুলির কীভাবে উত্তর দেন তা বিবেচ্য নয়। এখানে আমরা রেফারেন্সের জন্য কীভাবে এটি করেছি তা দেওয়া হলো: + +``` +প্যাকেজের নাম: (hello-world) +সংস্করণ: (1.0.0) +বর্ণনা: hello world স্মার্ট কন্ট্র্যাক্ট +এন্ট্রি পয়েন্ট: (index.js) +টেস্ট কমান্ড: +git রিপোজিটরি: +কীওয়ার্ড: +লেখক: +লাইসেন্স: (ISC) + +/Users/.../.../.../hello-world/package.json এ লিখতে চলেছে: + +{ + "name": "hello-world", + "version": "1.0.0", + "description": "hello world স্মার্ট কন্ট্র্যাক্ট", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +package.json অনুমোদন করুন এবং আমরা এগিয়ে যাওয়ার জন্য প্রস্তুত! + +### ধাপ ৭: Hardhat ডাউনলোড করুন {#step-7-download-hardhat} + +Hardhat হল আপনার Ethereum সফ্টওয়্যার কম্পাইল, স্থাপন, পরীক্ষা এবং ডিবাগ করার জন্য একটি ডেভেলপমেন্ট পরিবেশ। এটি ডেভেলপারদের লাইভ চেইনে স্থাপন করার আগে স্থানীয়ভাবে স্মার্ট কন্ট্র্যাক্ট এবং ডিএ্যাপস তৈরি করতে সাহায্য করে। + +আমাদের `hello-world` প্রজেক্টের ভিতরে চালান: + +``` +npm install --save-dev hardhat +``` + +[ইনস্টলেশন নির্দেশাবলী](https://hardhat.org/getting-started/#overview) সম্পর্কে আরও বিস্তারিত জানতে এই পৃষ্ঠাটি দেখুন। + +### ধাপ ৮: Hardhat প্রজেক্ট তৈরি করুন {#step-8-create-hardhat-project} + +আমাদের `hello-world` প্রজেক্ট ফোল্ডারের ভিতরে, চালান: + +``` +npx hardhat +``` + +তারপরে আপনার একটি স্বাগত বার্তা এবং আপনি কী করতে চান তা নির্বাচন করার একটি বিকল্প দেখতে পাওয়া উচিত। “একটি খালি hardhat.config.js তৈরি করুন” নির্বাচন করুন: + +``` +888 888 888 888 888 +888 888 888 888 888 +888 888 888 888 888 +8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 +888 888 "88b 888P" d88" 888 888 "88b "88b 888 +888 888 .d888888 888 888 888 888 888 .d888888 888 +888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. +888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 + +👷 Hardhat v2.0.11-এ আপনাকে স্বাগত 👷‍ + +আপনি কী করতে চান? … +একটি নমুনা প্রজেক্ট তৈরি করুন +❯ একটি খালি hardhat.config.js তৈরি করুন +প্রস্থান করুন +``` + +এটি প্রজেক্টে একটি `hardhat.config.js` ফাইল তৈরি করবে। আমরা আমাদের প্রজেক্টের সেটআপ নির্দিষ্ট করার জন্য টিউটোরিয়ালের পরে এটি ব্যবহার করব। + +### ধাপ ৯: প্রজেক্ট ফোল্ডার যোগ করুন {#step-9-add-project-folders} + +প্রজেক্টটি সংগঠিত রাখতে, আসুন দুটি নতুন ফোল্ডার তৈরি করি। কমান্ড লাইনে, আপনার `hello-world` প্রজেক্টের রুট ডিরেক্টরিতে নেভিগেট করুন এবং টাইপ করুন: + +``` +mkdir contracts +mkdir scripts +``` + +- `contracts/` হল যেখানে আমরা আমাদের হ্যালো ওয়ার্ল্ড স্মার্ট কন্ট্র্যাক্ট কোড ফাইল রাখব +- `scripts/` হল যেখানে আমরা আমাদের কন্ট্র্যাক্ট স্থাপন এবং ইন্টারঅ্যাক্ট করার জন্য স্ক্রিপ্ট রাখব + +### ধাপ ১০: আমাদের কন্ট্র্যাক্ট লিখুন {#step-10-write-our-contract} + +আপনি নিজেকে জিজ্ঞাসা করতে পারেন, আমরা কখন কোড লিখতে যাচ্ছি? এখন সেই সময়! + +আপনার প্রিয় এডিটরে hello-world প্রজেক্টটি খুলুন। স্মার্ট কন্ট্র্যাক্টগুলি সাধারণত সলিডিটিতে লেখা হয়, যা আমরা আমাদের স্মার্ট কন্ট্র্যাক্ট লেখার জন্য ব্যবহার করব।‌ + +1. `contracts` ফোল্ডারে নেভিগেট করুন এবং `HelloWorld.sol` নামে একটি নতুন ফাইল তৈরি করুন +2. নীচে একটি নমুনা Hello World স্মার্ট কন্ট্র্যাক্ট রয়েছে যা আমরা এই টিউটোরিয়ালের জন্য ব্যবহার করব। নীচের বিষয়বস্তুগুলি `HelloWorld.sol` ফাইলে কপি করুন। + +_দ্রষ্টব্য: এই কন্ট্র্যাক্টটি কী করে তা বোঝার জন্য মন্তব্যগুলি পড়তে ভুলবেন না।_ + +``` +// সিমেন্টিক ভার্সনিং ব্যবহার করে সলিডিটির সংস্করণ নির্দিষ্ট করে। +// আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity >=0.7.3; + +// `HelloWorld` নামের একটি কন্ট্র্যাক্ট সংজ্ঞায়িত করে। +// একটি কন্ট্র্যাক্ট হল ফাংশন এবং ডেটার একটি সংগ্রহ (তার স্টেট)। একবার স্থাপন করা হলে, একটি কন্ট্র্যাক্ট ইথেরিয়াম ব্লকচেইনে একটি নির্দিষ্ট ঠিকানায় থাকে। আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //আপডেট ফাংশন কল করা হলে নির্গত হয় + //স্মার্ট কন্ট্র্যাক্ট ইভেন্টগুলি হল আপনার কন্ট্র্যাক্টের জন্য আপনার অ্যাপ ফ্রন্ট-এন্ডে ব্লকচেইনে কিছু ঘটেছে তা জানানোর একটি উপায়, যা নির্দিষ্ট ইভেন্টের জন্য 'শুনতে' পারে এবং সেগুলি ঘটলে ব্যবস্থা নিতে পারে। + event UpdatedMessages(string oldStr, string newStr); + + // `string` টাইপের একটি স্টেট ভেরিয়েবল `message` ঘোষণা করে। + // স্টেট ভেরিয়েবলগুলি হল এমন ভেরিয়েবল যার মানগুলি স্থায়ীভাবে কন্ট্র্যাক্ট স্টোরেজে সংরক্ষণ করা হয়। `public` কীওয়ার্ডটি কন্ট্র্যাক্টের বাইরে থেকে ভেরিয়েবলগুলিকে অ্যাক্সেসযোগ্য করে তোলে এবং একটি ফাংশন তৈরি করে যা অন্য কন্ট্র্যাক্ট বা ক্লায়েন্টরা মান অ্যাক্সেস করার জন্য কল করতে পারে। + string public message; + + // অনেক ক্লাস-ভিত্তিক অবজেক্ট-ওরিয়েন্টেড ভাষার মতো, একটি কনস্ট্রাক্টর হল একটি বিশেষ ফাংশন যা শুধুমাত্র কন্ট্র্যাক্ট তৈরির সময় কার্যকর করা হয়। + // কনস্ট্রাক্টরগুলি কন্ট্র্যাক্টের ডেটা ইনিশিয়ালাইজ করতে ব্যবহৃত হয়। আরও জানুন:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // একটি স্ট্রিং আর্গুমেন্ট `initMessage` গ্রহণ করে এবং কন্ট্র্যাক্টের `message` স্টোরেজ ভেরিয়েবলে মান সেট করে)। + message = initMessage; + } + + // একটি পাবলিক ফাংশন যা একটি স্ট্রিং আর্গুমেন্ট গ্রহণ করে এবং `message` স্টোরেজ ভেরিয়েবল আপডেট করে। + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + +এটি একটি বেসিক স্মার্ট কন্ট্র্যাক্ট যা তৈরি হওয়ার পরে একটি বার্তা সংরক্ষণ করে। এটি `update` ফাংশন কল করে আপডেট করা যেতে পারে। + +### ধাপ ১১: আপনার প্রজেক্টের সাথে MetaMask এবং Alchemy সংযোগ করুন {#step-11-connect-metamask-alchemy-to-your-project} + +আমরা একটি MetaMask ওয়ালেট, Alchemy অ্যাকাউন্ট তৈরি করেছি এবং আমাদের স্মার্ট কন্ট্র্যাক্ট লিখেছি, এখন এই তিনটি সংযোগ করার সময়। + +আপনার ওয়ালেট থেকে পাঠানো প্রতিটি লেনদেনের জন্য আপনার অনন্য ব্যক্তিগত কী ব্যবহার করে একটি স্বাক্ষরের প্রয়োজন। আমাদের প্রোগ্রামকে এই অনুমতি দেওয়ার জন্য, আমরা আমাদের ব্যক্তিগত কী একটি এনভায়রনমেন্ট ফাইলে নিরাপদে সংরক্ষণ করতে পারি। আমরা এখানে Alchemy-র জন্য একটি API কীও সংরক্ষণ করব। + +> লেনদেন পাঠানোর বিষয়ে আরও জানতে, ওয়েব3 ব্যবহার করে লেনদেন পাঠানোর উপর [এই টিউটোরিয়ালটি](https://www.alchemy.com/docs/hello-world-smart-contract#step-11-connect-metamask--alchemy-to-your-project) দেখুন। + +প্রথমে, আপনার প্রজেক্ট ডিরেক্টরিতে ডটএনভ প্যাকেজটি ইনস্টল করুন: + +``` +npm install dotenv --save +``` + +তারপর, প্রজেক্টের রুট ডিরেক্টরিতে একটি `.env` ফাইল তৈরি করুন। এতে আপনার MetaMask ব্যক্তিগত কী এবং HTTP Alchemy API URL যোগ করুন। + +আপনার এনভায়রনমেন্ট ফাইলের নাম অবশ্যই `.env` হতে হবে, নতুবা এটি এনভায়রনমেন্ট ফাইল হিসেবে স্বীকৃত হবে না। + +এটির নাম `process.env` বা `.env-custom` বা অন্য কিছু দেবেন না। + +- আপনার ব্যক্তিগত কী এক্সপোর্ট করতে [এই নির্দেশাবলী](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) অনুসরণ করুন +- HTTP Alchemy API URL পেতে নিচে দেখুন + +![](./get-alchemy-api-key.gif) + +আপনার `.env` ফাইলটি এইরকম দেখতে হবে: + +``` +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +PRIVATE_KEY = "your-metamask-private-key" +``` + +এগুলিকে আমাদের কোডের সাথে সংযোগ করতে, আমরা ধাপ 13-এ আমাদের `hardhat.config.js` ফাইলে এই ভেরিয়েবলগুলিকে রেফারেন্স করব। + +### ধাপ 12: Ethers.js ইনস্টল করুন {#step-12-install-ethersjs} + +Ethers.js হল একটি লাইব্রেরি যা আরও ব্যবহারকারী-বান্ধব পদ্ধতির সাথে [স্ট্যান্ডার্ড JSON-RPC পদ্ধতি](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc) মোড়ক দিয়ে ইথেরিয়ামের সাথে ইন্টারঅ্যাক্ট করা এবং অনুরোধ করা সহজ করে তোলে। + +Hardhat আমাদের অতিরিক্ত টুলিং এবং বর্ধিত কার্যকারিতার জন্য [প্লাগইন](https://hardhat.org/plugins/) একীভূত করার অনুমতি দেয়। আমরা কন্ট্র্যাক্ট স্থাপনার জন্য [Ethers প্লাগইন](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) এর সুবিধা নেব। + +আপনার প্রজেক্ট ডিরেক্টরিতে টাইপ করুন: + +```bash +npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0" +``` + +### ধাপ ১৩: hardhat.config.js আপডেট করুন {#step-13-update-hardhat-configjs} + +আমরা এখন পর্যন্ত বেশ কিছু নির্ভরতা এবং প্লাগইন যোগ করেছি, এখন আমাদের `hardhat.config.js` আপডেট করতে হবে যাতে আমাদের প্রজেক্ট তাদের সকলের সম্পর্কে জানতে পারে। + +আপনার `hardhat.config.js` আপডেট করে এইরকম করুন: + +```javascript +/** + * @type import('hardhat/config').HardhatUserConfig + */ + +require("dotenv").config() +require("@nomiclabs/hardhat-ethers") + +const { API_URL, PRIVATE_KEY } = process.env + +module.exports = { + solidity: "0.7.3", + defaultNetwork: "goerli", + networks: { + hardhat: {}, + goerli: { + url: API_URL, + accounts: [`0x${PRIVATE_KEY}`], + }, + }, +} +``` + +### ধাপ ১৪: আমাদের কন্ট্র্যাক্ট কম্পাইল করুন {#step-14-compile-our-contract} + +সবকিছু ঠিকঠাক কাজ করছে কিনা তা নিশ্চিত করতে, আসুন আমাদের কন্ট্র্যাক্ট কম্পাইল করি। `compile` টাস্কটি অন্তর্নির্মিত হার্ডহ্যাট টাস্কগুলির মধ্যে একটি। + +কমান্ড লাইন থেকে রান করুন: + +```bash +npx hardhat compile +``` + +আপনি `SPDX লাইসেন্স আইডেন্টিফায়ার সোর্স ফাইলে সরবরাহ করা হয়নি` সম্পর্কে একটি সতর্কতা পেতে পারেন, কিন্তু সে সম্পর্কে চিন্তা করার দরকার নেই — আশা করি বাকি সব ঠিকঠাক দেখাবে! যদি না হয়, আপনি সবসময় [Alchemy ডিসকর্ড](https://discord.gg/u72VCg3)-এ বার্তা দিতে পারেন। + +### ধাপ ১৫: আমাদের ডেপ্লয় স্ক্রিপ্ট লিখুন {#step-15-write-our-deploy-script} + +এখন যেহেতু আমাদের কন্ট্র্যাক্ট লেখা হয়ে গেছে এবং আমাদের কনফিগারেশন ফাইল প্রস্তুত, এখন আমাদের কন্ট্র্যাক্ট ডেপ্লয় স্ক্রিপ্ট লেখার সময়। + +`scripts/` ফোল্ডারে যান এবং `deploy.js` নামে একটি নতুন ফাইল তৈরি করুন, এতে নিম্নলিখিত বিষয়বস্তু যোগ করুন: + +```javascript +async function main() { + const HelloWorld = await ethers.getContractFactory("HelloWorld") + + // ডেপ্লয়মেন্ট শুরু করুন, যা একটি কন্ট্র্যাক্ট অবজেক্টের সমাধান করে এমন একটি প্রতিশ্রুতি প্রদান করে + const hello_world = await HelloWorld.deploy("Hello World!") + console.log("Contract deployed to address:", hello_world.address) +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) +``` + +Hardhat তাদের [কন্ট্র্যাক্টস টিউটোরিয়াল](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)-এ এই কোডের প্রতিটি লাইন কী করে তা চমৎকারভাবে ব্যাখ্যা করেছে, আমরা এখানে তাদের ব্যাখ্যাগুলি গ্রহণ করেছি। + +```javascript +const HelloWorld = await ethers.getContractFactory("HelloWorld") +``` + +ethers.js-এ একটি `ContractFactory` হল নতুন স্মার্ট কন্ট্র্যাক্ট ডেপ্লয় করার জন্য ব্যবহৃত একটি বিমূর্তকরণ, তাই এখানে `HelloWorld` হল আমাদের hello world কন্ট্র্যাক্টের উদাহরণগুলির জন্য একটি [ফ্যাক্টরি](https://en.wikipedia.org/wiki/Factory_\(object-oriented_programming\))। `hardhat-ethers` প্লাগইন `ContractFactory` এবং `Contract` ব্যবহার করার সময়, ইনস্ট্যান্সগুলি ডিফল্টরূপে প্রথম স্বাক্ষরকারী (মালিক) এর সাথে সংযুক্ত থাকে। + +```javascript +const hello_world = await HelloWorld.deploy() +``` + +একটি `ContractFactory`-এ `deploy()` কল করলে ডেপ্লয়মেন্ট শুরু হবে, এবং একটি `Promise` প্রদান করবে যা একটি `Contract` অবজেক্টে সমাধান করে। এটি সেই অবজেক্ট যার আমাদের প্রতিটি স্মার্ট কন্ট্র্যাক্ট ফাংশনের জন্য একটি পদ্ধতি রয়েছে। + +### ধাপ 16: আমাদের কন্ট্র্যাক্ট স্থাপন করুন {#step-16-deploy-our-contract} + +আমরা অবশেষে আমাদের স্মার্ট কন্ট্র্যাক্ট স্থাপন করার জন্য প্রস্তুত! কমান্ড লাইনে যান এবং চালান: + +```bash +npx hardhat run scripts/deploy.js --network goerli +``` + +তারপরে আপনার এইরকম কিছু দেখা উচিত: + +```bash +কন্ট্র্যাক্টটি এই ঠিকানায় স্থাপন করা হয়েছে: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 +``` + +**অনুগ্রহ করে এই ঠিকানাটি সংরক্ষণ করুন**। আমরা এটি টিউটোরিয়ালের পরে ব্যবহার করব। + +আমরা যদি [Goerli etherscan](https://goerli.etherscan.io)-এ যাই এবং আমাদের কন্ট্র্যাক্টের ঠিকানা অনুসন্ধান করি, তাহলে আমরা দেখতে পাব যে এটি সফলভাবে স্থাপন করা হয়েছে। লেনদেনটি এইরকম কিছু দেখাবে: + +![](./etherscan-contract.png) + +`From` ঠিকানাটি আপনার MetaMask অ্যাকাউন্টের ঠিকানার সাথে মিলবে এবং `To` ঠিকানায় বলা হবে **কন্ট্র্যাক্ট তৈরি**। যদি আমরা লেনদেনের মধ্যে ক্লিক করি, তাহলে আমরা `To` ফিল্ডে আমাদের কন্ট্র্যাক্টের ঠিকানা দেখতে পাব। + +![](./etherscan-transaction.png) + +অভিনন্দন! আপনি সবেমাত্র একটি ইথেরিয়াম টেস্টনেটে একটি স্মার্ট কন্ট্র্যাক্ট স্থাপন করেছেন। + +নেপথ্যে কী ঘটছে তা বোঝার জন্য, আসুন আমাদের [Alchemy ড্যাশবোর্ড](https://dashboard.alchemy.com/explorer)-এর এক্সপ্লোরার ট্যাবে নেভিগেট করি। আপনার যদি একাধিক Alchemy অ্যাপ থাকে তবে অ্যাপ অনুসারে ফিল্টার করে **Hello World** নির্বাচন করতে ভুলবেন না। + +![](./hello-world-explorer.png) + +এখানে আপনি কিছু JSON-RPC পদ্ধতি দেখতে পাবেন যা Hardhat/Ethers আমাদের জন্য নেপথ্যে তৈরি করেছে যখন আমরা `.deploy()` ফাংশন কল করেছিলাম। এখানকার দুটি গুরুত্বপূর্ণ পদ্ধতি হল [`eth_sendRawTransaction`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction), যা Goerli চেইনে আমাদের কন্ট্র্যাক্ট লেখার অনুরোধ, এবং [`eth_getTransactionByHash`](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_gettransactionbyhash), যা হ্যাস দেওয়া হলে আমাদের transaction সম্পর্কে তথ্য পড়ার জন্য একটি অনুরোধ। লেনদেন পাঠানোর বিষয়ে আরও জানতে, [Web3 ব্যবহার করে লেনদেন পাঠানোর উপর আমাদের টিউটোরিয়ালটি দেখুন](/developers/tutorials/sending-transactions-using-web3-and-alchemy/)। + +## পর্ব ২: আপনার স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করুন {#part-2-interact-with-your-smart-contract} + +যেহেতু আমরা সফলভাবে Goerli নেটওয়ার্কে একটি স্মার্ট কন্ট্র্যাক্ট স্থাপন করেছি, আসুন এবার শিখি কীভাবে এর সাথে ইন্টারঅ্যাক্ট করতে হয়। + +### একটি interact.js ফাইল তৈরি করুন {#create-a-interactjs-file} + +এটি সেই ফাইল যেখানে আমরা আমাদের ইন্টারঅ্যাকশন স্ক্রিপ্ট লিখব। আমরা Ethers.js লাইব্রেরি ব্যবহার করব যা আপনি পূর্বে পর্ব ১-এ ইনস্টল করেছিলেন। + +`scripts/` ফোল্ডারের ভিতরে, `interact.js` নামে একটি নতুন ফাইল তৈরি করুন এবং নিম্নলিখিত কোডটি যোগ করুন: + +```javascript +// interact.js + +const API_KEY = process.env.API_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY +const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS +``` + +### আপনার .env ফাইল আপডেট করুন {#update-your-env-file} + +আমরা নতুন এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করব, তাই আমাদের `.env` ফাইলে সেগুলিকে সংজ্ঞায়িত করতে হবে যা [আমরা আগে তৈরি করেছি](#step-11-connect-metamask-&-alchemy-to-your-project)। + +আমাদের Alchemy `API_KEY` এবং `CONTRACT_ADDRESS`-এর জন্য একটি সংজ্ঞা যোগ করতে হবে যেখানে আপনার স্মার্ট কন্ট্র্যাক্টটি স্থাপন করা হয়েছিল। + +আপনার `.env` ফাইলটি এইরকম কিছু দেখতে হবে: + +```bash +# .env + +API_URL = "https://eth-goerli.alchemyapi.io/v2/" +API_KEY = "" +PRIVATE_KEY = "" +CONTRACT_ADDRESS = "0x" +``` + +### আপনার কন্ট্র্যাক্ট ABI নিন {#grab-your-contract-ABI} + +আমাদের কন্ট্র্যাক্ট [ABI (অ্যাপ্লিকেশন বাইনারি ইন্টারফেস)](/glossary/#abi) হল আমাদের স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার ইন্টারফেস। Hardhat স্বয়ংক্রিয়ভাবে একটি ABI তৈরি করে এবং এটি `HelloWorld.json`-এ সংরক্ষণ করে। ABI ব্যবহার করতে, আমাদের `interact.js` ফাইলে নিম্নলিখিত কোডের লাইনগুলি যোগ করে বিষয়বস্তুগুলি পার্স করতে হবে: + +```javascript +// interact.js +const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json") +``` + +আপনি যদি ABI দেখতে চান তবে আপনি এটি আপনার কনসোলে প্রিন্ট করতে পারেন: + +```javascript +console.log(JSON.stringify(contract.abi)) +``` + +আপনার ABI কনসোলে প্রিন্ট করা দেখতে, আপনার টার্মিনালে নেভিগেট করুন এবং চালান: + +```bash +npx hardhat run scripts/interact.js +``` + +### আপনার কন্ট্র্যাক্টের একটি উদাহরণ তৈরি করুন {#create-an-instance-of-your-contract} + +আমাদের কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করতে, আমাদের কোডে একটি কন্ট্র্যাক্ট ইনস্ট্যান্স তৈরি করতে হবে। Ethers.js দিয়ে এটি করতে, আমাদের তিনটি ধারণা নিয়ে কাজ করতে হবে: + +1. প্রোভাইডার - একটি নোড প্রোভাইডার যা আপনাকে ব্লকচেইনে পঠন ও লেখার অ্যাক্সেস দেয় +2. স্বাক্ষরকারী - একটি ইথেরিয়াম অ্যাকাউন্ট যা লেনদেন স্বাক্ষর করতে পারে +3. কন্ট্র্যাক্ট - একটি Ethers.js অবজেক্ট যা অনচেইনে স্থাপন করা একটি নির্দিষ্ট কন্ট্র্যাক্টকে প্রতিনিধিত্ব করে + +আমরা আগের ধাপ থেকে কন্ট্র্যাক্ট ABI ব্যবহার করে কন্ট্র্যাক্টের উদাহরণ তৈরি করব: + +```javascript +// interact.js + +// Provider +const alchemyProvider = new ethers.providers.AlchemyProvider( + (network = "goerli"), + API_KEY +) + +// Signer +const signer = new ethers.Wallet(PRIVATE_KEY, alchemyProvider) + +// Contract +const helloWorldContract = new ethers.Contract( + CONTRACT_ADDRESS, + contract.abi, + signer +) +``` + +[ethers.js ডকুমেন্টেশনে](https://docs.ethers.io/v5/) প্রোভাইডার, স্বাক্ষরকারী এবং কন্ট্র্যাক্ট সম্পর্কে আরও জানুন। + +### প্রারম্ভিক বার্তা পড়ুন {#read-the-init-message} + +মনে আছে যখন আমরা `initMessage = "Hello world!"` দিয়ে আমাদের কন্ট্র্যাক্ট স্থাপন করেছিলাম? আমরা এখন আমাদের স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত সেই বার্তাটি পড়ব এবং কনসোলে প্রিন্ট করব। + +জাভাস্ক্রিপ্টে, নেটওয়ার্কের সাথে ইন্টারঅ্যাক্ট করার সময় অ্যাসিঙ্ক্রোনাস ফাংশন ব্যবহার করা হয়। অ্যাসিঙ্ক্রোনাস ফাংশন সম্পর্কে আরও জানতে, [এই মিডিয়াম নিবন্ধটি পড়ুন](https://blog.bitsrc.io/understanding-asynchronous-javascript-the-event-loop-74cd408419ff)। + +আমাদের স্মার্ট কন্ট্র্যাক্টে `message` ফাংশন কল করতে এবং প্রারম্ভিক বার্তা পড়তে নীচের কোডটি ব্যবহার করুন: + +```javascript +// interact.js + +// ... + +asyn'c function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) +} +main() +``` + +টার্মিনালে `npx hardhat run scripts/interact.js` ব্যবহার করে ফাইলটি চালানোর পর আমরা এই প্রতিক্রিয়া দেখতে পাব: + +``` +বার্তাটি হল: Hello world! +``` + +অভিনন্দন! আপনি সবেমাত্র ইথেরিয়াম ব্লকচেইন থেকে সফলভাবে স্মার্ট কন্ট্র্যাক্ট ডেটা পড়েছেন, সাবাশ! + +### বার্তা আপডেট করুন {#update-the-message} + +শুধু বার্তা পড়ার পরিবর্তে, আমরা `update` ফাংশন ব্যবহার করে আমাদের স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বার্তাও আপডেট করতে পারি! বেশ দারুণ, তাই না? + +বার্তা আপডেট করতে, আমরা সরাসরি আমাদের ইনস্ট্যানশিয়েটেড কন্ট্র্যাক্ট অবজেক্টে `update` ফাংশন কল করতে পারি: + +```javascript +// interact.js + +// ... + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) + + console.log("Updating the message...") + const tx = await helloWorldContract.update("This is the new message.") + await tx.wait() +} +main() +``` + +লক্ষ্য করুন যে ১১ নং লাইনে, আমরা ফেরত দেওয়া লেনদেন অবজেক্টে `.wait()` কল করি। এটি নিশ্চিত করে যে আমাদের স্ক্রিপ্ট ফাংশন থেকে বের হওয়ার আগে ব্লকচেইনে লেনদেন মাইন হওয়ার জন্য অপেক্ষা করে। যদি `.wait()` কলটি অন্তর্ভুক্ত না করা হয়, তবে স্ক্রিপ্টটি কন্ট্র্যাক্টে আপডেট করা `message` মান দেখতে নাও পারে। + +### নতুন বার্তা পড়ুন {#read-the-new-message} + +আপডেট করা `message` মান পড়ার জন্য আপনি [আগের ধাপটি](#read-the-init-message) পুনরাবৃত্তি করতে সক্ষম হবেন। একটু সময় নিন এবং দেখুন আপনি সেই নতুন মানটি প্রিন্ট করার জন্য প্রয়োজনীয় পরিবর্তনগুলি করতে পারেন কিনা! + +আপনার যদি একটি ইঙ্গিত প্রয়োজন হয়, তাহলে এখানে আপনার `interact.js` ফাইলটি এই মুহূর্তে কেমন দেখতে হবে: + +```javascript +// interact.js + +const API_KEY = process.env.API_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY +const CONTRACT_ADDRESS = process.env.CONTRACT_ADDRESS + +const contract = require("../artifacts/contracts/HelloWorld.sol/HelloWorld.json") + +// প্রোভাইডার - Alchemy +const alchemyProvider = new ethers.providers.AlchemyProvider( + (network = "goerli"), + API_KEY +) + +// স্বাক্ষরকারী - আপনি +const signer = new ethers.Wallet(PRIVATE_KEY, alchemyProvider) + +// কন্ট্র্যাক্ট ইনস্ট্যান্স +const helloWorldContract = new ethers.Contract( + CONTRACT_ADDRESS, + contract.abi, + signer +) + +async function main() { + const message = await helloWorldContract.message() + console.log("The message is: " + message) + + console.log("Updating the message...") + const tx = await helloWorldContract.update("this is the new message") + await tx.wait() + + const newMessage = await helloWorldContract.message() + console.log("The new message is: " + newMessage) +} + +main() +``` + +এখন শুধু স্ক্রিপ্টটি চালান এবং আপনি আপনার টার্মিনালে পুরানো বার্তা, আপডেটিং স্থিতি এবং নতুন বার্তা প্রিন্ট করা দেখতে সক্ষম হবেন! + +`npx hardhat run scripts/interact.js --network goerli` + +``` +বার্তাটি হল: Hello World! +বার্তা আপডেট হচ্ছে... +নতুন বার্তাটি হল: এটি নতুন বার্তা। +``` + +সেই স্ক্রিপ্টটি চালানোর সময়, আপনি লক্ষ্য করতে পারেন যে নতুন বার্তা লোড হওয়ার আগে `বার্তা আপডেট হচ্ছে...` ধাপটি লোড হতে কিছুটা সময় নেয়। এটি মাইনিং প্রক্রিয়ার কারণে হয়; যদি আপনি মাইনিং করার সময় লেনদেন ট্র্যাক করতে আগ্রহী হন, তবে একটি লেনদেনের স্থিতি দেখতে [Alchemy mempool](https://dashboard.alchemyapi.io/mempool) পরিদর্শন করুন। যদি লেনদেনটি ড্রপ হয়ে যায়, তবে [Goerli Etherscan](https://goerli.etherscan.io) পরীক্ষা করা এবং আপনার লেনদেন হ্যাস অনুসন্ধান করাও সহায়ক। + +## পর্ব ৩: আপনার স্মার্ট কন্ট্র্যাক্ট Etherscan-এ প্রকাশ করুন {#part-3-publish-your-smart-contract-to-etherscan} + +আপনি আপনার স্মার্ট কন্ট্র্যাক্টকে জীবন্ত করার সমস্ত কঠিন কাজ করেছেন; এখন সময় এসেছে এটি বিশ্বের সাথে ভাগ করে নেওয়ার! + +Etherscan-এ আপনার স্মার্ট কন্ট্র্যাক্ট যাচাই করার মাধ্যমে, যে কেউ আপনার সোর্স কোড দেখতে এবং আপনার স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করতে পারে। চলুন শুরু করা যাক! + +### ধাপ ১: আপনার Etherscan অ্যাকাউন্টে একটি API কী তৈরি করুন {#step-1-generate-an-api-key-on-your-etherscan-account} + +আপনি যে স্মার্ট কন্ট্র্যাক্টটি প্রকাশ করার চেষ্টা করছেন তার মালিকানা যাচাই করার জন্য একটি Etherscan API কী প্রয়োজন। + +আপনার যদি আগে থেকেই একটি Etherscan অ্যাকাউন্ট না থাকে, তাহলে [একটি অ্যাকাউন্টের জন্য সাইন আপ করুন](https://etherscan.io/register)। + +লগ ইন করার পর, নেভিগেশন বারে আপনার ব্যবহারকারীর নাম খুঁজুন, তার উপর হোভার করুন এবং **আমার প্রোফাইল** বোতামটি নির্বাচন করুন। + +আপনার প্রোফাইল পৃষ্ঠায়, আপনি একটি সাইড নেভিগেশন বার দেখতে পাবেন। সাইড নেভিগেশন বার থেকে, **API কী** নির্বাচন করুন। এরপরে, একটি নতুন API কী তৈরি করতে "যোগ করুন" বোতামটি টিপুন, আপনার অ্যাপের নাম দিন **hello-world** এবং **নতুন API কী তৈরি করুন** বোতামটি টিপুন। + +আপনার নতুন API কী API কী টেবিলে প্রদর্শিত হবে। API কীটি আপনার ক্লিপবোর্ডে কপি করুন। + +এরপরে, আমাদের `.env` ফাইলে Etherscan API কী যোগ করতে হবে। + +এটি যোগ করার পর, আপনার `.env` ফাইলটি এইরকম দেখতে হবে: + +```javascript +API_URL = "https://eth-goerli.alchemyapi.io/v2/your-api-key" +PUBLIC_KEY = "your-public-account-address" +PRIVATE_KEY = "your-private-account-address" +CONTRACT_ADDRESS = "your-contract-address" +ETHERSCAN_API_KEY = "your-etherscan-key" +``` + +### Hardhat-ডেপ্লয়ড স্মার্ট কন্ট্র্যাক্ট {#hardhat-deployed-smart-contracts} + +#### hardhat-etherscan ইনস্টল করুন {#install-hardhat-etherscan} + +Hardhat ব্যবহার করে Etherscan-এ আপনার কন্ট্র্যাক্ট প্রকাশ করা খুবই সহজ। শুরু করার জন্য আপনাকে প্রথমে `hardhat-etherscan` প্লাগইন ইনস্টল করতে হবে। `hardhat-etherscan` স্বয়ংক্রিয়ভাবে স্মার্ট কন্ট্র্যাক্টের সোর্স কোড এবং ABI Etherscan-এ যাচাই করবে। এটি যোগ করতে, `hello-world` ডিরেক্টরিতে চালান: + +```text +npm install --save-dev @nomiclabs/hardhat-etherscan +``` + +ইনস্টল হয়ে গেলে, আপনার `hardhat.config.js`-এর শীর্ষে নিম্নলিখিত স্টেটমেন্টটি অন্তর্ভুক্ত করুন এবং Etherscan কনফিগারেশন বিকল্পগুলি যোগ করুন: + +```javascript +// hardhat.config.js + +require("dotenv").config() +require("@nomiclabs/hardhat-ethers") +require("@nomiclabs/hardhat-etherscan") + +const { API_URL, PRIVATE_KEY, ETHERSCAN_API_KEY } = process.env + +module.exports = { + solidity: "0.7.3", + defaultNetwork: "goerli", + networks: { + hardhat: {}, + goerli: { + url: API_URL, + accounts: [`0x${PRIVATE_KEY}`], + }, + }, + etherscan: { + // Etherscan-এর জন্য আপনার API কী + // https://etherscan.io/ থেকে একটি পান + apiKey: ETHERSCAN_API_KEY, + }, +} +``` + +#### Etherscan-এ আপনার স্মার্ট কন্ট্র্যাক্ট যাচাই করুন {#verify-your-smart-contract-on-etherscan} + +নিশ্চিত করুন যে সমস্ত ফাইল সংরক্ষিত হয়েছে এবং সমস্ত `.env` ভেরিয়েবল সঠিকভাবে কনফিগার করা হয়েছে। + +`verify` টাস্কটি চালান, কন্ট্র্যাক্টের ঠিকানা এবং যেখানে এটি স্থাপন করা হয়েছে সেই নেটওয়ার্কটি পাস করে: + +```text +npx hardhat verify --network goerli DEPLOYED_CONTRACT_ADDRESS 'Hello World!' +``` + +নিশ্চিত করুন যে `DEPLOYED_CONTRACT_ADDRESS` হল Goerli টেস্ট নেটওয়ার্কে আপনার স্থাপন করা স্মার্ট কন্ট্র্যাক্টের ঠিকানা। এছাড়াও, চূড়ান্ত আর্গুমেন্ট (`'Hello World!'`) অবশ্যই [পর্ব ১-এর ডেপ্লয় ধাপের](#write-our-deploy-script) সময় ব্যবহৃত একই স্ট্রিং মান হতে হবে। + +যদি সবকিছু ঠিকঠাক থাকে, আপনি আপনার টার্মিনালে নিম্নলিখিত বার্তাটি দেখতে পাবেন: + +```text +কন্ট্র্যাক্টের জন্য সোর্স কোড সফলভাবে জমা দেওয়া হয়েছে +contracts/HelloWorld.sol:HelloWorld at 0xdeployed-contract-address +Etherscan-এ যাচাইকরণের জন্য। যাচাইকরণের ফলাফলের জন্য অপেক্ষা করা হচ্ছে... + + +সফলভাবে Etherscan-এ HelloWorld কন্ট্র্যাক্ট যাচাই করা হয়েছে। +https://goerli.etherscan.io/address/#contracts +``` + +অভিনন্দন! আপনার স্মার্ট কন্ট্র্যাক্ট কোড Etherscan-এ আছে! + +### Etherscan-এ আপনার স্মার্ট কন্ট্র্যাক্ট দেখুন! {#check-out-your-smart-contract-on-etherscan} + +যখন আপনি আপনার টার্মিনালে দেওয়া লিঙ্কে নেভিগেট করবেন, তখন আপনি আপনার স্মার্ট কন্ট্র্যাক্ট কোড এবং ABI Etherscan-এ প্রকাশিত দেখতে পাবেন! + +**ইয়াহু - তুমি করে ফেলেছ চ্যাম্পিয়ন! এখন যে কেউ আপনার স্মার্ট কন্ট্র্যাক্টে কল বা লিখতে পারে! আমরা দেখার জন্য অপেক্ষা করছি আপনি এরপরে কী তৈরি করেন!** + +## পর্ব ৪ - আপনার স্মার্ট কন্ট্র্যাক্টকে ফ্রন্টএন্ডের সাথে একীভূত করা {#part-4-integrating-your-smart-contract-with-the-frontend} + +এই টিউটোরিয়ালের শেষে, আপনি জানতে পারবেন কীভাবে: + +- আপনার ডিএ্যাপস-এর সাথে একটি MetaMask ওয়ালেট সংযোগ করা +- [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) API ব্যবহার করে আপনার স্মার্ট কন্ট্র্যাক্ট থেকে ডেটা পড়া +- MetaMask ব্যবহার করে ইথেরিয়াম লেনদেন স্বাক্ষর করা + +এই ডিএ্যাপ-এর জন্য, আমরা আমাদের ফ্রন্টএন্ড ফ্রেমওয়ার্ক হিসেবে [React](https://react.dev/) ব্যবহার করব; তবে, এটি মনে রাখা গুরুত্বপূর্ণ যে আমরা এর মূল বিষয়গুলি ভেঙে দেখতে বেশি সময় ব্যয় করব না, কারণ আমরা মূলত আমাদের প্রজেক্টে Web3 কার্যকারিতা আনার উপর মনোযোগ দেব। + +পূর্বশর্ত হিসেবে, আপনার React সম্পর্কে প্রাথমিক স্তরের ধারণা থাকা উচিত। যদি না থাকে, আমরা অফিসিয়াল [Intro to React টিউটোরিয়াল](https://react.dev/learn) সম্পূর্ণ করার সুপারিশ করি। + +### স্টার্টার ফাইলগুলো ক্লোন করুন {#clone-the-starter-files} + +প্রথমে, [hello-world-part-four GitHub রিপোজিটরি](https://github.com/alchemyplatform/hello-world-part-four-tutorial)-তে যান এই প্রজেক্টের জন্য স্টার্টার ফাইলগুলি পেতে এবং এই রিপোজিটরিটি আপনার স্থানীয় মেশিনে ক্লোন করুন। + +ক্লোন করা রিপোজিটরিটি স্থানীয়ভাবে খুলুন। লক্ষ্য করুন যে এতে দুটি ফোল্ডার রয়েছে: `starter-files` এবং `completed`। + +- `starter-files`- **আমরা এই ডিরেক্টরিতে কাজ করব**, আমরা UI-কে আপনার ইথেরিয়াম ওয়ালেট এবং [পর্ব ৩](#part-3)-এ Etherscan-এ প্রকাশিত স্মার্ট কন্ট্র্যাক্টের সাথে সংযোগ করব। +- `completed` সম্পূর্ণ টিউটোরিয়াল ধারণ করে এবং শুধুমাত্র যদি আপনি আটকে যান তবে একটি রেফারেন্স হিসাবে ব্যবহার করা উচিত। + +এরপর, আপনার `starter-files`-এর কপিটি আপনার প্রিয় কোড এডিটরে খুলুন, এবং তারপর `src` ফোল্ডারে নেভিগেট করুন। + +আমরা যে সমস্ত কোড লিখব তা `src` ফোল্ডারের অধীনে থাকবে। আমরা আমাদের প্রজেক্টে Web3 কার্যকারিতা দেওয়ার জন্য `HelloWorld.js` কম্পোনেন্ট এবং `util/interact.js` জাভাস্ক্রিপ্ট ফাইলগুলি সম্পাদনা করব। + +### স্টার্টার ফাইলগুলি দেখুন {#check-out-the-starter-files} + +আমরা কোডিং শুরু করার আগে, আসুন দেখে নেওয়া যাক স্টার্টার ফাইলগুলিতে আমাদের কী সরবরাহ করা হয়েছে। + +#### আপনার React প্রজেক্টটি চালু করুন {#get-your-react-project-running} + +চলুন আমাদের ব্রাউজারে React প্রজেক্টটি চালিয়ে শুরু করি। React-এর সৌন্দর্য হলো যে একবার আমাদের প্রজেক্ট ব্রাউজারে চালু হয়ে গেলে, আমরা যে কোনো পরিবর্তন সেভ করব তা আমাদের ব্রাউজারে লাইভ আপডেট হবে। + +প্রজেক্টটি চালানোর জন্য, `starter-files` ফোল্ডারের রুট ডিরেক্টরিতে নেভিগেট করুন, এবং প্রজেক্টের নির্ভরতা ইনস্টল করার জন্য আপনার টার্মিনালে `npm install` চালান: + +```bash +cd starter-files +npm install +``` + +সেগুলো ইনস্টল করা শেষ হলে, আপনার টার্মিনালে `npm start` রান করুন: + +```bash +npm start +``` + +এটি করলে আপনার ব্রাউজারে [http://localhost:3000/](http://localhost:3000/) খোলা উচিত, যেখানে আপনি আমাদের প্রজেক্টের ফ্রন্টএন্ড দেখতে পাবেন। এতে একটি ফিল্ড (আপনার স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বার্তা আপডেট করার জন্য একটি স্থান), একটি "ওয়ালেট সংযোগ করুন" বোতাম, এবং একটি "আপডেট" বোতাম থাকা উচিত। + +আপনি যদি কোনো বোতামে ক্লিক করার চেষ্টা করেন, আপনি লক্ষ্য করবেন যে সেগুলি কাজ করে না—এর কারণ হল আমাদের এখনও তাদের কার্যকারিতা প্রোগ্রাম করতে হবে। + +#### `HelloWorld.js` কম্পোনেন্ট {#the-helloworld-js-component} + +চলুন আমাদের এডিটরে `src` ফোল্ডারে ফিরে যাই এবং `HelloWorld.js` ফাইলটি খুলি। এই ফাইলের সবকিছু বোঝা অত্যন্ত গুরুত্বপূর্ণ, কারণ এটিই মূল React কম্পোনেন্ট যা নিয়ে আমরা কাজ করব। + +এই ফাইলের শীর্ষে, আপনি লক্ষ্য করবেন যে আমাদের প্রজেক্ট চালানোর জন্য প্রয়োজনীয় বেশ কয়েকটি আমদানি বিবৃতি রয়েছে, যার মধ্যে রয়েছে React লাইব্রেরি, useEffect এবং useState হুক, `./util/interact.js` থেকে কিছু আইটেম (আমরা শীঘ্রই সেগুলিকে আরও বিশদে বর্ণনা করব!), এবং Alchemy লোগো। + +```javascript +// HelloWorld.js + +import React from "react" +import { useEffect, useState } from "react" +import { + helloWorldContract, + connectWallet, + updateMessage, + loadCurrentMessage, + getCurrentWalletConnected, +} from "./util/interact.js" + +import alchemylogo from "./alchemylogo.svg" +``` + +এরপর, আমাদের স্টেট ভেরিয়েবলগুলি রয়েছে যা আমরা নির্দিষ্ট ইভেন্টের পরে আপডেট করব। + +```javascript +// HelloWorld.js + +//স্টেট ভেরিয়েবল +const [walletAddress, setWallet] = useState("") +const [status, setStatus] = useState("") +const [message, setMessage] = useState("নেটওয়ার্কের সাথে কোনো সংযোগ নেই।") +const [newMessage, setNewMessage] = useState("") +``` + +এখানে প্রতিটি ভেরিয়েবল কী প্রতিনিধিত্ব করে: + +- `walletAddress` - একটি স্ট্রিং যা ব্যবহারকারীর ওয়ালেট অ্যাড্রেস সংরক্ষণ করে +- `status`- একটি স্ট্রিং যা ব্যবহারকারীকে ডিএ্যাপস-এর সাথে কীভাবে ইন্টারঅ্যাক্ট করতে হবে সে সম্পর্কে একটি সহায়ক বার্তা সংরক্ষণ করে +- `message` - একটি স্ট্রিং যা স্মার্ট কন্ট্র্যাক্টে বর্তমান বার্তা সংরক্ষণ করে +- `newMessage` - একটি স্ট্রিং যা নতুন বার্তা সংরক্ষণ করে যা স্মার্ট কন্ট্র্যাক্টে লেখা হবে + +স্টেট ভেরিয়েবলের পর, আপনি পাঁচটি বাস্তবায়ন-না-করা ফাংশন দেখতে পাবেন: `useEffect` ,`addSmartContractListener`, `addWalletListener` , `connectWalletPressed`, এবং `onUpdatePressed`। আমরা নীচে ব্যাখ্যা করব তারা কী করে: + +```javascript +// HelloWorld.js + +//একবারই বলা হয় +useEffect(async () => { + //TODO: বাস্তবায়ন করুন +}, []) + +function addSmartContractListener() { + //TODO: বাস্তবায়ন করুন +} + +function addWalletListener() { + //TODO: বাস্তবায়ন করুন +} + +const connectWalletPressed = async () => { + //TODO: বাস্তবায়ন করুন +} + +const onUpdatePressed = async () => { + //TODO: বাস্তবায়ন করুন +} +``` + +- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html)- এটি একটি React হুক যা আপনার কম্পোনেন্ট রেন্ডার হওয়ার পরে কল করা হয়। কারণ এতে একটি খালি অ্যারে `[]` প্রপ পাস করা হয়েছে (লাইন ৪ দেখুন), এটি শুধুমাত্র কম্পোনেন্টের _প্রথম_ রেন্ডারে কল করা হবে। এখানে আমরা আমাদের স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বর্তমান বার্তা লোড করব, আমাদের স্মার্ট কন্ট্র্যাক্ট এবং ওয়ালেট লিসেনারদের কল করব, এবং আমাদের UI আপডেট করব যাতে একটি ওয়ালেট ইতিমধ্যে সংযুক্ত কিনা তা প্রতিফলিত হয়। +- `addSmartContractListener`- এই ফাংশনটি একটি লিসেনার সেট আপ করে যা আমাদের HelloWorld কন্ট্র্যাক্টের `UpdatedMessages` ইভেন্টের জন্য নজর রাখবে এবং আমাদের স্মার্ট কন্ট্র্যাক্টে বার্তা পরিবর্তন হলে আমাদের UI আপডেট করবে। +- `addWalletListener`- এই ফাংশনটি একটি লিসেনার সেট আপ করে যা ব্যবহারকারীর MetaMask ওয়ালেটের অবস্থার পরিবর্তন সনাক্ত করে, যেমন ব্যবহারকারী যখন তাদের ওয়ালেট সংযোগ বিচ্ছিন্ন করে বা ঠিকানা পরিবর্তন করে। +- `connectWalletPressed`- এই ফাংশনটি ব্যবহারকারীর MetaMask ওয়ালেটকে আমাদের ডিএ্যাপস-এর সাথে সংযোগ করতে কল করা হবে। +- `onUpdatePressed` - এই ফাংশনটি কল করা হবে যখন ব্যবহারকারী স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বার্তা আপডেট করতে চায়। + +এই ফাইলের শেষের দিকে, আমাদের কম্পোনেন্টের UI রয়েছে। + +```javascript +// HelloWorld.js + +//আমাদের কম্পোনেন্টের UI +return ( +
+ + + +

বর্তমান বার্তা:

+

{message}

+ +

নতুন বার্তা:

+ +
+ setNewMessage(e.target.value)} + value={newMessage} + /> +

{status}

+ + +
+ +
+) +``` + +আপনি যদি এই কোডটি সাবধানে স্ক্যান করেন, আপনি লক্ষ্য করবেন যে আমরা আমাদের UI-তে আমাদের বিভিন্ন স্টেট ভেরিয়েবল কোথায় ব্যবহার করি: + +- ৬-১২ লাইনে, যদি ব্যবহারকারীর ওয়ালেট সংযুক্ত থাকে (অর্থাৎ `walletAddress.length > 0`), আমরা "walletButton" আইডি সহ বোতামে ব্যবহারকারীর `walletAddress`-এর একটি সংক্ষিপ্ত সংস্করণ প্রদর্শন করি; অন্যথায় এটি কেবল "ওয়ালেট সংযোগ করুন" বলে। +- ১৭ লাইনে, আমরা স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বর্তমান বার্তা প্রদর্শন করি, যা `message` স্ট্রিং-এ ধরা হয়। +- ২৩-২৬ লাইনে, আমরা টেক্সট ফিল্ডে ইনপুট পরিবর্তন হলে আমাদের `newMessage` স্টেট ভেরিয়েবল আপডেট করার জন্য একটি [নিয়ন্ত্রিত কম্পোনেন্ট](https://legacy.reactjs.org/docs/forms.html#controlled-components) ব্যবহার করি। + +আমাদের স্টেট ভেরিয়েবল ছাড়াও, আপনি আরও দেখতে পাবেন যে `publishButton` এবং `walletButton` আইডি সহ বোতামগুলি ক্লিক করা হলে যথাক্রমে `connectWalletPressed` এবং `onUpdatePressed` ফাংশনগুলি কল করা হয়। + +অবশেষে, আসুন দেখা যাক এই `HelloWorld.js` কম্পোনেন্টটি কোথায় যুক্ত করা হয়েছে। + +আপনি যদি `App.js` ফাইলে যান, যা React-এর প্রধান কম্পোনেন্ট এবং অন্যান্য সমস্ত কম্পোনেন্টের জন্য একটি ধারক হিসেবে কাজ করে, আপনি দেখতে পাবেন যে আমাদের `HelloWorld.js` কম্পোনেন্টটি ৭ নং লাইনে ইনজেক্ট করা হয়েছে। + +সবশেষে, আসুন আপনার জন্য সরবরাহ করা আরও একটি ফাইল, `interact.js` ফাইলটি দেখে নেওয়া যাক। + +#### `interact.js` ফাইল {#the-interact-js-file} + +যেহেতু আমরা [M-V-C](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) প্যারাডাইম অনুসরণ করতে চাই, আমরা একটি পৃথক ফাইল চাইব যা আমাদের ডিএ্যাপস-এর যুক্তি, ডেটা এবং নিয়মগুলি পরিচালনা করার জন্য আমাদের সমস্ত ফাংশন ধারণ করে এবং তারপরে সেই ফাংশনগুলিকে আমাদের ফ্রন্টএন্ডে (আমাদের `HelloWorld.js` কম্পোনেন্ট) এক্সপোর্ট করতে সক্ষম হব। + +👆🏽এইটিই আমাদের `interact.js` ফাইলের সঠিক উদ্দেশ্য! + +আপনার `src` ডিরেক্টরিতে `util` ফোল্ডারে নেভিগেট করুন, এবং আপনি লক্ষ্য করবেন যে আমরা `interact.js` নামে একটি ফাইল অন্তর্ভুক্ত করেছি যা আমাদের সমস্ত স্মার্ট কন্ট্র্যাক্ট ইন্টারঅ্যাকশন এবং ওয়ালেট ফাংশন ও ভেরিয়েবল ধারণ করবে। + +```javascript +// interact.js + +//export const helloWorldContract; + +export const loadCurrentMessage = async () => {} + +export const connectWallet = async () => {} + +const getCurrentWalletConnected = async () => {} + +export const updateMessage = async (message) => {} +``` + +আপনি ফাইলের শীর্ষে লক্ষ্য করবেন যে আমরা `helloWorldContract` অবজেক্টটি কমেন্ট আউট করেছি। এই টিউটোরিয়ালের পরে, আমরা এই অবজেক্টটি আনকমেন্ট করব এবং এই ভেরিয়েবলে আমাদের স্মার্ট কন্ট্র্যাক্টটি ইনস্ট্যানশিয়েট করব, যা আমরা তারপরে আমাদের `HelloWorld.js` কম্পোনেন্টে এক্সপোর্ট করব। + +আমাদের `helloWorldContract` অবজেক্টের পরে চারটি অবাস্তবায়িত ফাংশন নিম্নলিখিত কাজগুলি করে: + +- `loadCurrentMessage` - এই ফাংশনটি স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বর্তমান বার্তা লোড করার যুক্তি পরিচালনা করে। এটি [Alchemy Web3 API](https://github.com/alchemyplatform/alchemy-web3) ব্যবহার করে Hello World স্মার্ট কন্ট্র্যাক্টে একটি _পড়ার_ কল করবে। +- `connectWallet` - এই ফাংশনটি ব্যবহারকারীর MetaMask কে আমাদের ডিএ্যাপস-এর সাথে সংযোগ করবে। +- `getCurrentWalletConnected` - এই ফাংশনটি পৃষ্ঠা লোড হওয়ার সময় আমাদের ডিএ্যাপস-এর সাথে একটি ইথেরিয়াম অ্যাকাউন্ট ইতিমধ্যে সংযুক্ত আছে কিনা তা পরীক্ষা করবে এবং সেই অনুযায়ী আমাদের UI আপডেট করবে। +- `updateMessage` - এই ফাংশনটি স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বার্তা আপডেট করবে। এটি Hello World স্মার্ট কন্ট্র্যাক্টে একটি _লেখার_ কল করবে, তাই বার্তা আপডেট করার জন্য ব্যবহারকারীর MetaMask ওয়ালেটকে একটি ইথেরিয়াম লেনদেন স্বাক্ষর করতে হবে। + +এখন যেহেতু আমরা বুঝতে পারছি আমরা কী নিয়ে কাজ করছি, আসুন দেখি কীভাবে আমাদের স্মার্ট কন্ট্র্যাক্ট থেকে পড়তে হয়! + +### ধাপ ৩: আপনার স্মার্ট কন্ট্র্যাক্ট থেকে পড়ুন {#step-3-read-from-your-smart-contract} + +আপনার স্মার্ট কন্ট্র্যাক্ট থেকে পড়তে, আপনাকে সফলভাবে সেট আপ করতে হবে: + +- ইথেরিয়াম চেইনের সাথে একটি API সংযোগ +- আপনার স্মার্ট কন্ট্র্যাক্টের একটি লোড করা উদাহরণ +- আপনার স্মার্ট কন্ট্র্যাক্ট ফাংশনে কল করার জন্য একটি ফাংশন +- স্মার্ট কন্ট্র্যাক্ট থেকে আপনি যে ডেটা পড়ছেন তা পরিবর্তন হলে আপডেটগুলির জন্য নজর রাখার জন্য একটি লিসেনার + +এটি অনেক ধাপের মতো শোনাতে পারে, কিন্তু চিন্তা করবেন না! আমরা আপনাকে ধাপে ধাপে প্রতিটি কিভাবে করতে হয় তা দেখাব! :\) + +#### ইথেরিয়াম চেইনের সাথে একটি API সংযোগ স্থাপন করুন {#establish-an-api-connection-to-the-ethereum-chain} + +তাহলে মনে আছে এই টিউটোরিয়ালের পর্ব ২-এ, আমরা আমাদের স্মার্ট কন্ট্র্যাক্ট থেকে পড়ার জন্য আমাদের [Alchemy Web3 কী ব্যবহার করেছিলাম](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract/interacting-with-a-smart-contract#step-1-install-web3-library)? চেইন থেকে পড়ার জন্য আপনার ডিএ্যাপস-এ একটি Alchemy Web3 কীও প্রয়োজন হবে। + +আপনার যদি এটি ইতিমধ্যে না থাকে, তাহলে প্রথমে [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) ইনস্টল করুন আপনার `starter-files`-এর রুট ডিরেক্টরিতে নেভিগেট করে এবং আপনার টার্মিনালে নিম্নলিখিতটি চালান: + +```text +npm install @alch/alchemy-web3 +``` + +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) হল [Web3.js](https://docs.web3js.org/)-এর একটি র‍্যাপার, যা উন্নত API পদ্ধতি এবং অন্যান্য গুরুত্বপূর্ণ সুবিধা প্রদান করে যাতে আপনার জীবন একজন ওয়েব3 ডেভেলপার হিসাবে সহজ হয়। এটি এমনভাবে ডিজাইন করা হয়েছে যাতে ন্যূনতম কনফিগারেশনের প্রয়োজন হয় যাতে আপনি এখনই আপনার অ্যাপে এটি ব্যবহার করা শুরু করতে পারেন! + +তারপর, আপনার প্রজেক্ট ডিরেক্টরিতে [dotenv](https://www.npmjs.com/package/dotenv) প্যাকেজটি ইনস্টল করুন, যাতে আমরা আমাদের API কী আনার পরে এটি সংরক্ষণের জন্য একটি নিরাপদ জায়গা পাই। + +```text +npm install dotenv --save +``` + +আমাদের ডিএ্যাপস-এর জন্য, **আমরা আমাদের HTTP API কী-এর পরিবর্তে আমাদের Websockets API কী ব্যবহার করব**, কারণ এটি আমাদের একটি লিসেনার সেট আপ করতে দেবে যা স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বার্তা পরিবর্তন হলে সনাক্ত করে। + +আপনার API কী পাওয়ার পর, আপনার রুট ডিরেক্টরিতে একটি `.env` ফাইল তৈরি করুন এবং এতে আপনার Alchemy Websockets url যোগ করুন। এরপরে, আপনার `.env` ফাইলটি এরকম দেখতে হবে: + +```javascript +REACT_APP_ALCHEMY_KEY = wss://eth-goerli.ws.alchemyapi.io/v2/ +``` + +এখন, আমরা আমাদের ডিএ্যাপস-এ আমাদের Alchemy Web3 এন্ডপয়েন্ট সেট আপ করতে প্রস্তুত! চলুন আমাদের `util` ফোল্ডারের মধ্যে থাকা `interact.js` ফাইলে ফিরে যাই এবং ফাইলের শীর্ষে নিম্নলিখিত কোডটি যোগ করি: + +```javascript +// interact.js + +require("dotenv").config() +const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(alchemyKey) + +//export const helloWorldContract; +``` + +উপরে, আমরা প্রথমে আমাদের `.env` ফাইল থেকে Alchemy কী ইম্পোর্ট করেছি এবং তারপর আমাদের Alchemy Web3 এন্ডপয়েন্ট স্থাপন করার জন্য `createAlchemyWeb3`-এ আমাদের `alchemyKey` পাস করেছি। + +এই এন্ডপয়েন্ট প্রস্তুত হলে, এখন আমাদের স্মার্ট কন্ট্র্যাক্ট লোড করার সময়! + +#### আপনার Hello World স্মার্ট কন্ট্র্যাক্ট লোড করা হচ্ছে {#loading-your-hello-world-smart-contract} + +আপনার Hello World স্মার্ট কন্ট্র্যাক্ট লোড করার জন্য, আপনার এর কন্ট্র্যাক্ট ঠিকানা এবং ABI প্রয়োজন হবে, উভয়ই Etherscan-এ পাওয়া যাবে যদি আপনি [এই টিউটোরিয়ালের পর্ব ৩ সম্পূর্ণ করে থাকেন।](/developers/tutorials/hello-world-smart-contract-fullstack/#part-3-publish-your-smart-contract-to-etherscan-part-3-publish-your-smart-contract-to-etherscan) + +#### Etherscan থেকে আপনার কন্ট্র্যাক্ট ABI কীভাবে পাবেন {#how-to-get-your-contract-abi-from-etherscan} + +আপনি যদি এই টিউটোরিয়ালের পর্ব ৩ এড়িয়ে যান, আপনি ঠিকানা [0x6f3f635A9762B47954229Ea479b4541eAF402A6A](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code) সহ HelloWorld কন্ট্র্যাক্ট ব্যবহার করতে পারেন। এর ABI [এখানে](https://goerli.etherscan.io/address/0x6f3f635a9762b47954229ea479b4541eaf402a6a#code) পাওয়া যাবে। + +একটি কন্ট্র্যাক্ট ABI একটি কন্ট্র্যাক্ট কোন ফাংশনটি চালু করবে তা নির্দিষ্ট করার জন্য এবং ফাংশনটি আপনার প্রত্যাশিত ফর্ম্যাটে ডেটা ফেরত দেবে তা নিশ্চিত করার জন্য প্রয়োজনীয়। আমাদের কন্ট্র্যাক্ট ABI কপি করার পর, আসুন এটিকে আপনার `src` ডিরেক্টরিতে `contract-abi.json` নামে একটি JSON ফাইল হিসেবে সংরক্ষণ করি। + +আপনার contract-abi.json আপনার src ফোল্ডারে সংরক্ষণ করা উচিত। + +আমাদের কন্ট্র্যাক্ট ঠিকানা, ABI, এবং Alchemy Web3 এন্ডপয়েন্ট নিয়ে, আমরা আমাদের স্মার্ট কন্ট্র্যাক্টের একটি উদাহরণ লোড করতে [কন্ট্র্যাক্ট পদ্ধতি](https://docs.web3js.org/api/web3-eth-contract/class/Contract) ব্যবহার করতে পারি। `interact.js` ফাইলে আপনার কন্ট্র্যাক্ট ABI ইম্পোর্ট করুন এবং আপনার কন্ট্র্যাক্ট ঠিকানা যোগ করুন। + +```javascript +// interact.js + +const contractABI = require("../contract-abi.json") +const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A" +``` + +আমরা এখন অবশেষে আমাদের `helloWorldContract` ভেরিয়েবলটি আনকমেন্ট করতে পারি, এবং আমাদের AlchemyWeb3 এন্ডপয়েন্ট ব্যবহার করে স্মার্ট কন্ট্র্যাক্ট লোড করতে পারি: + +```javascript +// interact.js +export const helloWorldContract = new web3.eth.Contract( + contractABI, + contractAddress +) +``` + +সংক্ষেপে, আপনার `interact.js`-এর প্রথম ১২টি লাইন এখন এরকম দেখতে হবে: + +```javascript +// interact.js + +require("dotenv").config() +const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(alchemyKey) + +const contractABI = require("../contract-abi.json") +const contractAddress = "0x6f3f635A9762B47954229Ea479b4541eAF402A6A" + +export const helloWorldContract = new web3.eth.Contract( + contractABI, + contractAddress +) +``` + +এখন যে আমাদের কন্ট্র্যাক্ট লোড হয়েছে, আমরা আমাদের `loadCurrentMessage` ফাংশনটি বাস্তবায়ন করতে পারি! + +#### আপনার `interact.js` ফাইলে `loadCurrentMessage` বাস্তবায়ন করা {#implementing-loadCurrentMessage-in-your-interact-js-file} + +এই ফাংশনটি খুবই সহজ। আমরা আমাদের কন্ট্র্যাক্ট থেকে পড়ার জন্য একটি সহজ অ্যাসিঙ্ক web3 কল করব। আমাদের ফাংশনটি স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বার্তা ফেরত দেবে: + +আপনার `interact.js` ফাইলে `loadCurrentMessage` আপডেট করে নিম্নলিখিতটি করুন: + +```javascript +// interact.js + +export const loadCurrentMessage = async () => { + const message = await helloWorldContract.methods.message().call() + return message +} +``` + +যেহেতু আমরা এই স্মার্ট কন্ট্র্যাক্টটি আমাদের UI-তে প্রদর্শন করতে চাই, আসুন আমাদের `HelloWorld.js` কম্পোনেন্টে `useEffect` ফাংশনটি নিম্নলিখিতভাবে আপডেট করি: + +```javascript +// HelloWorld.js + +//একবারই বলা হয় +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) +}, []) +``` + +লক্ষ্য করুন, আমরা চাই যে আমাদের `loadCurrentMessage` শুধুমাত্র কম্পোনেন্টের প্রথম রেন্ডারের সময় একবার কল করা হোক। আমরা শীঘ্রই `addSmartContractListener` বাস্তবায়ন করব যাতে স্মার্ট কন্ট্র্যাক্টে বার্তা পরিবর্তন হওয়ার পরে UI স্বয়ংক্রিয়ভাবে আপডেট হয়। + +আমাদের লিসেনারে ডুব দেওয়ার আগে, আসুন দেখি আমরা এখন পর্যন্ত কী করেছি! আপনার `HelloWorld.js` এবং `interact.js` ফাইলগুলি সংরক্ষণ করুন, এবং তারপরে [http://localhost:3000/](http://localhost:3000/)-এ যান + +আপনি লক্ষ্য করবেন যে বর্তমান বার্তায় আর "নেটওয়ার্কের সাথে কোনো সংযোগ নেই" লেখা নেই। পরিবর্তে এটি স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বার্তা প্রতিফলিত করে। দারুণ! + +#### আপনার UI এখন স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বার্তা প্রতিফলিত করবে {#your-UI-should-now-reflect-the-message-stored-in-the-smart-contract} + +এখন সেই লিসেনারের কথা বলি... + +#### `addSmartContractListener` বাস্তবায়ন করুন {#implement-addsmartcontractlistener} + +আপনি যদি এই টিউটোরিয়াল সিরিজের [পর্ব ১-এ](https://docs.alchemy.com/alchemy/tutorials/hello-world-smart-contract#step-10-write-our-contract) লেখা `HelloWorld.sol` ফাইলটি মনে করেন, আপনি মনে করতে পারবেন যে `UpdatedMessages` নামে একটি স্মার্ট কন্ট্র্যাক্ট ইভেন্ট আছে যা আমাদের স্মার্ট কন্ট্র্যাক্টের `update` ফাংশন চালু করার পরে নির্গত হয় (লাইন ৯ এবং ২৭ দেখুন): + +```javascript +// HelloWorld.sol + +// সিমেন্টিক ভার্সনিং ব্যবহার করে সলিডিটির সংস্করণ নির্দিষ্ট করে। +// আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.7.3; + +// `HelloWorld` নামের একটি কন্ট্র্যাক্ট সংজ্ঞায়িত করে। +// একটি কন্ট্র্যাক্ট হল ফাংশন এবং ডেটার একটি সংগ্রহ (তার স্টেট)। একবার স্থাপন করা হলে, একটি কন্ট্র্যাক্ট ইথেরিয়াম ব্লকচেইনে একটি নির্দিষ্ট ঠিকানায় থাকে। আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + //আপডেট ফাংশন কল করা হলে নির্গত হয় + //স্মার্ট কন্ট্র্যাক্ট ইভেন্টগুলি হল আপনার কন্ট্র্যাক্টের জন্য আপনার অ্যাপ ফ্রন্ট-এন্ডে ব্লকচেইনে কিছু ঘটেছে তা জানানোর একটি উপায়, যা নির্দিষ্ট ইভেন্টের জন্য 'শুনতে' পারে এবং সেগুলি ঘটলে ব্যবস্থা নিতে পারে। + event UpdatedMessages(string oldStr, string newStr); + + // `string` টাইপের একটি স্টেট ভেরিয়েবল `message` ঘোষণা করে। + // স্টেট ভেরিয়েবলগুলি হল এমন ভেরিয়েবল যার মানগুলি স্থায়ীভাবে কন্ট্র্যাক্ট স্টোরেজে সংরক্ষণ করা হয়। `public` কীওয়ার্ডটি কন্ট্র্যাক্টের বাইরে থেকে ভেরিয়েবলগুলিকে অ্যাক্সেসযোগ্য করে তোলে এবং একটি ফাংশন তৈরি করে যা অন্য কন্ট্র্যাক্ট বা ক্লায়েন্টরা মান অ্যাক্সেস করার জন্য কল করতে পারে। + string public message; + + // অনেক ক্লাস-ভিত্তিক অবজেক্ট-ওরিয়েন্টেড ভাষার মতো, একটি কনস্ট্রাক্টর হল একটি বিশেষ ফাংশন যা শুধুমাত্র কন্ট্র্যাক্ট তৈরির সময় কার্যকর করা হয়। + // কনস্ট্রাক্টরগুলি কন্ট্র্যাক্টের ডেটা ইনিশিয়ালাইজ করতে ব্যবহৃত হয়। আরও জানুন:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // একটি স্ট্রিং আর্গুমেন্ট `initMessage` গ্রহণ করে এবং কন্ট্র্যাক্টের `message` স্টোরেজ ভেরিয়েবলে মান সেট করে)। + message = initMessage; + } + + // একটি পাবলিক ফাংশন যা একটি স্ট্রিং আর্গুমেন্ট গ্রহণ করে এবং `message` স্টোরেজ ভেরিয়েবল আপডেট করে। + function update(string memory newMessage) public { + string memory oldMsg = message; + message = newMessage; + emit UpdatedMessages(oldMsg, newMessage); + } +} +``` + +স্মার্ট কন্ট্র্যাক্ট ইভেন্টগুলি আপনার কন্ট্র্যাক্টের জন্য ব্লকচেইনে কিছু ঘটেছে (অর্থাৎ, একটি _ইভেন্ট_ হয়েছে) তা আপনার ফ্রন্ট-এন্ড অ্যাপ্লিকেশনে জানানোর একটি উপায়, যা নির্দিষ্ট ইভেন্টগুলির জন্য 'শুনতে' পারে এবং সেগুলি ঘটলে ব্যবস্থা নিতে পারে। + +`addSmartContractListener` ফাংশনটি বিশেষভাবে আমাদের Hello World স্মার্ট কন্ট্র্যাক্টের `UpdatedMessages` ইভেন্টের জন্য শুনবে এবং নতুন বার্তা প্রদর্শন করার জন্য আমাদের UI আপডেট করবে। + +`addSmartContractListener`-কে নিম্নলিখিতভাবে পরিবর্তন করুন: + +```javascript +// HelloWorld.js + +function addSmartContractListener() { + helloWorldContract.events.UpdatedMessages({}, (error, data) => { + if (error) { + setStatus("😥 " + error.message) + } else { + setMessage(data.returnValues[1]) + setNewMessage("") + setStatus("🎉 আপনার বার্তা আপডেট করা হয়েছে!") + } + }) +} +``` + +আসুন দেখা যাক লিসেনার যখন একটি ইভেন্ট সনাক্ত করে তখন কী হয়: + +- যদি ইভেন্ট নির্গত হওয়ার সময় একটি ত্রুটি ঘটে, তবে এটি আমাদের `status` স্টেট ভেরিয়েবলের মাধ্যমে UI-তে প্রতিফলিত হবে। +- অন্যথায়, আমরা ফেরত দেওয়া `data` অবজেক্ট ব্যবহার করব। `data.returnValues` একটি শূন্য-সূচীকৃত অ্যারে যেখানে প্রথম উপাদানটি আগের বার্তা এবং দ্বিতীয় উপাদানটি আপডেট করা বার্তা সংরক্ষণ করে। সব মিলিয়ে, একটি সফল ইভেন্টে আমরা আমাদের `message` স্ট্রিংটিকে আপডেট করা বার্তায় সেট করব, `newMessage` স্ট্রিংটি পরিষ্কার করব এবং আমাদের `status` স্টেট ভেরিয়েবলটি আপডেট করব যাতে প্রতিফলিত হয় যে আমাদের স্মার্ট কন্ট্র্যাক্টে একটি নতুন বার্তা প্রকাশিত হয়েছে। + +অবশেষে, আসুন আমাদের লিসেনারকে আমাদের `useEffect` ফাংশনে কল করি যাতে এটি `HelloWorld.js` কম্পোনেন্টের প্রথম রেন্ডারে শুরু হয়। সব মিলিয়ে, আপনার `useEffect` ফাংশনটি এইরকম দেখতে হবে: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() +}, []) +``` + +এখন যেহেতু আমরা আমাদের স্মার্ট কন্ট্র্যাক্ট থেকে পড়তে সক্ষম, এটিতে কীভাবে লিখতেও হয় তা বের করা দুর্দান্ত হবে! তবে, আমাদের ডিএ্যাপস-এ লিখতে হলে, আমাদের প্রথমে একটি ইথেরিয়াম ওয়ালেট এর সাথে সংযুক্ত থাকতে হবে। + +সুতরাং, এরপর আমরা আমাদের ইথেরিয়াম ওয়ালেট (MetaMask) সেট আপ করব এবং তারপরে এটি আমাদের ডিএ্যাপস-এর সাথে সংযোগ করব! + +### ধাপ ৪: আপনার ইথেরিয়াম ওয়ালেট সেট আপ করুন {#step-4-set-up-your-ethereum-wallet} + +ইথেরিয়াম চেইনে কিছু লিখতে, ব্যবহারকারীদের তাদের ভার্চুয়াল ওয়ালেটের ব্যক্তিগত কী ব্যবহার করে লেনদেন স্বাক্ষর করতে হবে। এই টিউটোরিয়ালের জন্য, আমরা [MetaMask](https://metamask.io/) ব্যবহার করব, যা ব্রাউজারে একটি ভার্চুয়াল ওয়ালেট এবং আপনার ইথেরিয়াম অ্যাকাউন্টের ঠিকানা পরিচালনা করতে ব্যবহৃত হয়, কারণ এটি শেষ-ব্যবহারকারীর জন্য এই লেনদেন স্বাক্ষর করা খুব সহজ করে তোলে। + +আপনি যদি Ethereum-এ লেনদেন কিভাবে কাজ করে সে সম্পর্কে আরও বুঝতে চান, তাহলে ইথেরিয়াম ফাইন্ডেশনের [এই পৃষ্ঠাটি](/developers/docs/transactions/) দেখুন। + +#### MetaMask ডাউনলোড করুন {#download-metamask} + +আপনি [এখানে](https://metamask.io/download) বিনামূল্যে একটি MetaMask অ্যাকাউন্ট ডাউনলোড এবং তৈরি করতে পারেন। যখন আপনি একটি অ্যাকাউন্ট তৈরি করছেন, বা যদি আপনার আগে থেকেই একটি অ্যাকাউন্ট থাকে, তবে উপরের ডানদিকে থাকা "Goerli Test Network"-এ স্যুইচ করতে ভুলবেন না (যাতে আমরা আসল টাকা নিয়ে কাজ না করি)। + +#### একটি ফসেট থেকে ইথার যোগ করুন {#add-ether-from-a-faucet} + +ইথেরিয়াম ব্লকচেইনে একটি লেনদেন স্বাক্ষর করার জন্য, আমাদের কিছু নকল Eth লাগবে। Eth পেতে আপনি [FaucETH](https://fauceth.komputing.org)-এ যেতে পারেন এবং আপনার Goerli অ্যাকাউন্টের ঠিকানা লিখতে পারেন, "ফান্ড অনুরোধ করুন"-এ ক্লিক করুন, তারপরে ড্রপডাউনে "Ethereum Testnet Goerli" নির্বাচন করুন এবং অবশেষে আবার "ফান্ড অনুরোধ করুন" বোতামটি ক্লিক করুন। এর কিছুক্ষণ পরেই আপনার MetaMask অ্যাকাউন্টে Eth দেখতে পাবেন! + +#### আপনার ব্যালেন্স পরীক্ষা করুন {#check-your-balance} + +আমাদের ব্যালেন্স সেখানে আছে কিনা তা দুবার চেক করতে, চলুন [Alchemy’s composer tool](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D) ব্যবহার করে একটি [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) রিকোয়েস্ট করি। এটি আমাদের ওয়ালেটে থাকা Eth-এর পরিমাণ ফেরত দেবে। আপনার MetaMask অ্যাকাউন্ট অ্যাড্রেস ইনপুট করার পরে এবং “অনুরোধ পাঠান”-এ ক্লিক করার পরে, আপনার এইরকম একটি প্রতিক্রিয়া দেখা উচিত: + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + +**দ্রষ্টব্য:** এই ফলাফলটি wei-তে, eth-এ নয়। Wei ইথারের ক্ষুদ্রতম একক হিসাবে ব্যবহৃত হয়। wei থেকে eth-এ রূপান্তর হলো: 1 eth = 10¹⁸ wei। সুতরাং যদি আমরা 0xde0b6b3a7640000 কে দশমিকে রূপান্তর করি, আমরা 1\*10¹⁸ পাই যা 1 eth-এর সমান। + +যাক বাবা! আমাদের নকল টাকা সব আছে! 🤑 + +### ধাপ ৫: MetaMask-কে আপনার UI-এর সাথে সংযোগ করুন {#step-5-connect-metamask-to-your-UI} + +এখন যেহেতু আমাদের MetaMask ওয়ালেট সেট আপ করা হয়েছে, চলুন আমাদের dApp-কে এর সাথে সংযুক্ত করি! + +#### `connectWallet` ফাংশন {#the-connectWallet-function} + +আমাদের `interact.js` ফাইলে, আসুন `connectWallet` ফাংশনটি বাস্তবায়ন করি, যা আমরা তারপরে আমাদের `HelloWorld.js` কম্পোনেন্টে কল করতে পারি। + +আসুন `connectWallet`-কে নিম্নলিখিতভাবে পরিবর্তন করি: + +```javascript +// interact.js + +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 উপরের টেক্সট-ফিল্ডে একটি বার্তা লিখুন।", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + আপনাকে অবশ্যই আপনার ব্রাউজারে MetaMask ইনস্টল করতে হবে, যা একটি ভার্চুয়াল ইথেরিয়াম ওয়ালেট। + +

+
+ ), + } + } +} +``` + +তাহলে এই বিশাল কোড ব্লকটি ঠিক কী করে? + +ওয়েল, প্রথমে, এটি পরীক্ষা করে যে আপনার ব্রাউজারে `window.ethereum` সক্ষম আছে কিনা। + +`window.ethereum` হল একটি গ্লোবাল API যা MetaMask এবং অন্যান্য ওয়ালেট প্রদানকারীরা ইনজেক্ট করে, যা ওয়েবসাইটগুলিকে ব্যবহারকারীদের ইথেরিয়াম অ্যাকাউন্টগুলির জন্য অনুরোধ করার অনুমতি দেয়। অনুমোদিত হলে, এটি ব্যবহারকারী যে ব্লকচেইনগুলির সাথে সংযুক্ত রয়েছে সেখান থেকে ডেটা পড়তে পারে এবং ব্যবহারকারীকে বার্তা এবং লেনদেন স্বাক্ষর করার পরামর্শ দিতে পারে। আরও তথ্যের জন্য [MetaMask ডক্স](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) দেখুন! + +যদি `window.ethereum` উপস্থিত _না থাকে_, তার মানে MetaMask ইনস্টল করা নেই। এর ফলে একটি JSON অবজেক্ট রিটার্ন করা হয়, যেখানে রিটার্ন করা `address` একটি খালি স্ট্রিং এবং `status` JSX অবজেক্টটি ব্যবহারকারীকে MetaMask ইনস্টল করার বার্তা দেয়। + +এখন যদি `window.ethereum` উপস্থিত _থাকে_, তখনই বিষয়গুলো আকর্ষণীয় হয়ে ওঠে। + +একটি try/catch লুপ ব্যবহার করে, আমরা [`window.ethereum.request({ method: \"eth_requestAccounts\" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts) কল করে MetaMask-এর সাথে সংযোগ করার চেষ্টা করব। এই ফাংশনটি কল করলে ব্রাউজারে MetaMask খুলবে, যেখানে ব্যবহারকারীকে তাদের ওয়ালেট আপনার dApp-এর সাথে সংযোগ করার জন্য অনুরোধ করা হবে। + +- ব্যবহারকারী যদি সংযোগ করতে চান, তবে `method: "eth_requestAccounts"` একটি অ্যারে প্রদান করবে যাতে ব্যবহারকারীর সমস্ত অ্যাকাউন্ট ঠিকানা থাকবে যা ডিএ্যাপস-এর সাথে সংযুক্ত হয়েছে। সবমিলিয়ে, আমাদের `connectWallet` ফাংশনটি একটি JSON অবজেক্ট রিটার্ন করবে যা এই অ্যারের _প্রথম_ `address` (লাইন ৯ দেখুন) এবং একটি `status` বার্তা ধারণ করবে যা ব্যবহারকারীকে স্মার্ট কন্ট্র্যাক্টে একটি বার্তা লিখতে অনুরোধ করে। +- যদি ব্যবহারকারী সংযোগ প্রত্যাখ্যান করে, তাহলে JSON অবজেক্টটি রিটার্ন করা `address`-এর জন্য একটি খালি স্ট্রিং এবং একটি `status` বার্তা ধারণ করবে যা ব্যবহারকারীর সংযোগ প্রত্যাখ্যান করার বিষয়টি প্রতিফলিত করে। + +এখন যেহেতু আমরা এই `connectWallet` ফাংশনটি লিখেছি, পরবর্তী ধাপ হল এটিকে আমাদের `HelloWorld.js` কম্পোনেন্টে কল করা। + +#### `connectWallet` ফাংশনটি আপনার `HelloWorld.js` UI কম্পোনেন্টে যোগ করুন {#add-the-connectWallet-function-to-your-HelloWorld-js-ui-component} + +`HelloWorld.js`-এর `connectWalletPressed` ফাংশনে নেভিগেট করুন এবং এটিকে নিম্নলিখিতভাবে আপডেট করুন: + +```javascript +// HelloWorld.js + +const connectWalletPressed = async () => { + const walletResponse = await connectWallet() + setStatus(walletResponse.status) + setWallet(walletResponse.address) +} +``` + +লক্ষ্য করুন কীভাবে আমাদের বেশিরভাগ কার্যকারিতা `interact.js` ফাইল থেকে আমাদের `HelloWorld.js` কম্পোনেন্ট থেকে বিমূর্ত করা হয়েছে? এটি যাতে আমরা M-V-C প্যারাডাইম মেনে চলি! + +`connectWalletPressed`-এ, আমরা কেবল আমাদের ইম্পোর্ট করা `connectWallet` ফাংশনে একটি await কল করি, এবং এর প্রতিক্রিয়ার সাহায্যে, আমরা তাদের স্টেট হুকগুলির মাধ্যমে আমাদের `status` এবং `walletAddress` ভেরিয়েবলগুলি আপডেট করি। + +এখন, আসুন উভয় ফাইল (`HelloWorld.js` এবং `interact.js`) সংরক্ষণ করি এবং আমাদের UI পরীক্ষা করি। + +আপনার ব্রাউজারে [http://localhost:3000/](http://localhost:3000/) পৃষ্ঠাটি খুলুন এবং পৃষ্ঠার উপরের ডানদিকে "ওয়ালেট সংযোগ করুন" বোতামটি টিপুন। + +আপনার যদি MetaMask ইনস্টল করা থাকে, তাহলে আপনাকে আপনার ওয়ালেটটি আপনার dApp-এর সাথে সংযোগ করার জন্য অনুরোধ করা হবে। সংযোগ করার জন্য আমন্ত্রণ গ্রহণ করুন। + +আপনি দেখতে পাবেন যে ওয়ালেট বোতামটি এখন প্রতিফলিত করছে যে আপনার ঠিকানা সংযুক্ত! ইয়াসসসস 🔥 + +এরপর, পৃষ্ঠাটি রিফ্রেশ করার চেষ্টা করুন... এটা অদ্ভুত। আমাদের ওয়ালেট বোতামটি আমাদের MetaMask সংযোগ করার জন্য অনুরোধ করছে, যদিও এটি ইতিমধ্যে সংযুক্ত রয়েছে... + +তবে, ভয় পাবেন না! আমরা সহজেই এটি সমাধান করতে পারি (বুঝতে পারছেন?) `getCurrentWalletConnected` বাস্তবায়ন করে, যা পরীক্ষা করবে যে কোনও ঠিকানা ইতিমধ্যে আমাদের ডিএ্যাপস-এর সাথে সংযুক্ত আছে কিনা এবং সেই অনুযায়ী আমাদের UI আপডেট করবে! + +#### `getCurrentWalletConnected` ফাংশন {#the-getcurrentwalletconnected-function} + +`interact.js` ফাইলে আপনার `getCurrentWalletConnected` ফাংশনটি নিম্নলিখিতভাবে আপডেট করুন: + +```javascript +// interact.js + +export const getCurrentWalletConnected = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_accounts", + }) + if (addressArray.length > 0) { + return { + address: addressArray[0], + status: "👆🏽 উপরের টেক্সট-ফিল্ডে একটি বার্তা লিখুন।", + } + } else { + return { + address: "", + status: "🦊 উপরের ডানদিকের বোতাম ব্যবহার করে MetaMask-এর সাথে সংযোগ করুন।", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + আপনাকে অবশ্যই আপনার ব্রাউজারে MetaMask ইনস্টল করতে হবে, যা একটি ভার্চুয়াল ইথেরিয়াম ওয়ালেট। + +

+
+ ), + } + } +} +``` + +এই কোডটি _খুবই_ অনুরূপ `connectWallet` ফাংশনটির মতো যা আমরা আগের ধাপে লিখেছি। + +প্রধান পার্থক্য হল `eth_requestAccounts` মেথড কল করার পরিবর্তে, যা ব্যবহারকারীর ওয়ালেট সংযোগ করার জন্য MetaMask খোলে, এখানে আমরা `eth_accounts` মেথড কল করি, যা সহজভাবে আমাদের dApp-এর সাথে বর্তমানে সংযুক্ত MetaMask অ্যাড্রেসগুলো ধারণকারী একটি অ্যারে রিটার্ন করে। + +এই ফাংশনটি কার্যকর দেখতে, আসুন এটিকে আমাদের `HelloWorld.js` কম্পোনেন্টের `useEffect` ফাংশনে কল করি: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + +লক্ষ্য করুন, আমরা `getCurrentWalletConnected`-এ আমাদের কলের প্রতিক্রিয়া ব্যবহার করে আমাদের `walletAddress` এবং `status` স্টেট ভেরিয়েবলগুলিকে আপডেট করি। + +এখন যে আপনি এই কোডটি যোগ করেছেন, আসুন আমাদের ব্রাউজার উইন্ডোটি রিফ্রেশ করার চেষ্টা করি। + +দারুণ! বোতামটি বলা উচিত যে আপনি সংযুক্ত, এবং আপনার সংযুক্ত ওয়ালেটের অ্যাড্রেসের একটি প্রিভিউ দেখানো উচিত - এমনকি আপনি রিফ্রেশ করার পরেও! + +#### `addWalletListener` বাস্তবায়ন করুন {#implement-addwalletlistener} + +আমাদের dApp ওয়ালেট সেটআপের চূড়ান্ত ধাপ হল ওয়ালেট লিসেনার ইমপ্লিমেন্ট করা যাতে আমাদের UI আপডেট হয় যখন আমাদের ওয়ালেটের স্টেট পরিবর্তন হয়, যেমন যখন ব্যবহারকারী সংযোগ বিচ্ছিন্ন করে বা অ্যাকাউন্ট পরিবর্তন করে। + +আপনার `HelloWorld.js` ফাইলে, আপনার `addWalletListener` ফাংশনটি নিম্নলিখিতভাবে পরিবর্তন করুন: + +```javascript +// HelloWorld.js + +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 উপরের টেক্সট-ফিল্ডে একটি বার্তা লিখুন।") + } else { + setWallet("") + setStatus("🦊 উপরের ডানদিকের বোতাম ব্যবহার করে MetaMask-এর সাথে সংযোগ করুন।") + } + }) + } else { + setStatus( +

+ {" "} + 🦊 + আপনাকে অবশ্যই আপনার ব্রাউজারে MetaMask ইনস্টল করতে হবে, যা একটি ভার্চুয়াল ইথেরিয়াম ওয়ালেট। + +

+ ) + } +} +``` + +আমি বাজি ধরতে পারি যে এই মুহূর্তে এখানে কী ঘটছে তা বোঝার জন্য আপনার আর আমাদের সাহায্যের প্রয়োজন নেই, তবে সম্পূর্ণতার জন্য, আসুন দ্রুত এটি ভেঙে দেখা যাক: + +- প্রথমে, আমাদের ফাংশন পরীক্ষা করে যে `window.ethereum` সক্রিয় আছে কিনা (অর্থাৎ MetaMask ইনস্টল করা আছে)। + - যদি না থাকে, আমরা কেবল আমাদের `status` স্টেট ভেরিয়েবলটিকে একটি JSX স্ট্রিং-এ সেট করি যা ব্যবহারকারীকে MetaMask ইনস্টল করার জন্য অনুরোধ করে। + - যদি এটি সক্রিয় থাকে, আমরা লাইন ৩-এ `window.ethereum.on(\"accountsChanged\")` লিসেনার সেট আপ করি যা MetaMask ওয়ালেটের স্টেট পরিবর্তন শোনে, যার মধ্যে রয়েছে যখন ব্যবহারকারী dApp-এ একটি অতিরিক্ত অ্যাকাউন্ট সংযোগ করে, অ্যাকাউন্ট পরিবর্তন করে বা একটি অ্যাকাউন্ট সংযোগ বিচ্ছিন্ন করে। যদি অন্তত একটি অ্যাকাউন্ট সংযুক্ত থাকে, তাহলে `walletAddress` স্টেট ভেরিয়েবলটি লিসেনারের দ্বারা রিটার্ন করা `accounts` অ্যারের প্রথম অ্যাকাউন্ট হিসেবে আপডেট হয়। অন্যথায়, `walletAddress` একটি খালি স্ট্রিং হিসাবে সেট করা হয়। + +সবশেষে, আমাদের এটিকে আমাদের `useEffect` ফাংশনে কল করতে হবে: + +```javascript +// HelloWorld.js + +useEffect(async () => { + const message = await loadCurrentMessage() + setMessage(message) + addSmartContractListener() + + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) + + addWalletListener() +}, []) +``` + +এবং এটাই সব! আমরা সফলভাবে আমাদের সমস্ত ওয়ালেট কার্যকারিতা প্রোগ্রামিং সম্পন্ন করেছি! এখন আমাদের শেষ কাজ: আমাদের স্মার্ট কন্ট্র্যাক্টে সংরক্ষিত বার্তা আপডেট করা! + +### ধাপ ৬: `updateMessage` ফাংশনটি বাস্তবায়ন করুন {#step-6-implement-the-updateMessage-function} + +ঠিক আছে বন্ধুরা, আমরা শেষ পর্যায়ে পৌঁছেছি! আপনার `interact.js` ফাইলের `updateMessage`-এ, আমরা নিম্নলিখিতগুলি করতে যাচ্ছি: + +1. নিশ্চিত করুন যে আমরা আমাদের স্মার্ট কন্টাক্টে যে বার্তাটি প্রকাশ করতে চাই তা বৈধ +2. MetaMask ব্যবহার করে আমাদের লেনদেন স্বাক্ষর করুন +3. আমাদের `HelloWorld.js` ফ্রন্টএন্ড কম্পোনেন্ট থেকে এই ফাংশনটি কল করুন + +এতে খুব বেশি সময় লাগবে না; চলুন এই ডিএ্যাপসটি শেষ করি! + +#### ইনপুট ত্রুটি হ্যান্ডলিং {#input-error-handling} + +স্বাভাবিকভাবেই, ফাংশনের শুরুতে কিছু ধরণের ইনপুট ত্রুটি হ্যান্ডলিং থাকা যুক্তিযুক্ত। + +আমরা চাইব যে যদি কোনো MetaMask এক্সটেনশন ইনস্টল করা না থাকে, কোনো ওয়ালেট সংযুক্ত না থাকে (অর্থাৎ, পাস করা `address` একটি খালি স্ট্রিং হয়), বা `message` একটি খালি স্ট্রিং হয়, তাহলে আমাদের ফাংশনটি তাড়াতাড়ি ফিরে আসবে। `updateMessage`-এ নিম্নলিখিত ত্রুটি হ্যান্ডলিং যোগ করুন: + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + if (!window.ethereum || address === null) { + return { + status: + "💡 ব্লকচেইনে বার্তা আপডেট করতে আপনার MetaMask ওয়ালেট সংযোগ করুন।", + } + } + + if (message.trim() === "") { + return { + status: "❌ আপনার বার্তা একটি খালি স্ট্রিং হতে পারে না।", + } + } +} +``` + +এখন যে এটিতে সঠিক ইনপুট ত্রুটি হ্যান্ডলিং রয়েছে, এখন MetaMask এর মাধ্যমে লেনদেন স্বাক্ষর করার সময়! + +#### আমাদের লেনদেন স্বাক্ষর করা {#signing-our-transaction} + +আপনি যদি ঐতিহ্যবাহী ওয়েব3 ইথেরিয়াম লেনদেনের সাথে ইতিমধ্যে স্বাচ্ছন্দ্য বোধ করেন, তবে আমরা পরবর্তীতে যে কোডটি লিখব তা খুব পরিচিত হবে। আপনার ইনপুট ত্রুটি হ্যান্ডলিং কোডের নীচে, `updateMessage`-এ নিম্নলিখিতগুলি যোগ করুন: + +```javascript +// interact.js + +//লেনদেন প্যারামিটার সেট আপ করুন +const transactionParameters = { + to: contractAddress, // কন্ট্র্যাক্ট প্রকাশনার সময় ছাড়া প্রয়োজনীয়। + from: address, // ব্যবহারকারীর সক্রিয় ঠিকানার সাথে মিলতে হবে। + data: helloWorldContract.methods.update(message).encodeABI(), +} + +//লেনদেন স্বাক্ষর করুন +try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + Etherscan-এ আপনার লেনদেনের স্থিতি দেখুন! + +
+ ℹ️ নেটওয়ার্ক দ্বারা লেনদেন যাচাই হয়ে গেলে, বার্তাটি + স্বয়ংক্রিয়ভাবে আপডেট হয়ে যাবে। +
+ ), + } +} catch (error) { + return { + status: "😥 " + error.message, + } +} +``` + +আসুন দেখা যাক কী ঘটছে। প্রথমে, আমরা আমাদের লেনদেনের প্যারামিটার সেট আপ করি, যেখানে: + +- `to` প্রাপকের ঠিকানা (আমাদের স্মার্ট কন্ট্র্যাক্ট) নির্দিষ্ট করে +- `from` লেনদেনের স্বাক্ষরকারীকে নির্দিষ্ট করে, যা আমাদের ফাংশনে পাস করা `address` ভেরিয়েবল +- `data` আমাদের Hello World স্মার্ট কন্ট্র্যাক্টের `update` পদ্ধতিতে কল ধারণ করে, যা ইনপুট হিসাবে আমাদের `message` স্ট্রিং ভেরিয়েবল গ্রহণ করে + +তারপর, আমরা একটি অ্যাওয়েট কল করি, `window.ethereum.request`, যেখানে আমরা MetaMask-কে লেনদেন স্বাক্ষর করতে বলি। লক্ষ্য করুন, ১১ এবং ১২ লাইনে, আমরা আমাদের eth পদ্ধতি, `eth_sendTransaction` নির্দিষ্ট করছি এবং আমাদের `transactionParameters` পাস করছি। + +এই সময়ে, MetaMask ব্রাউজারে খুলবে, এবং ব্যবহারকারীকে ট্রানজ্যাকশন সাইন বা প্রত্যাখ্যান করতে অনুরোধ করবে। + +- যদি লেনদেন সফল হয়, ফাংশনটি একটি JSON অবজেক্ট প্রদান করবে যেখানে `status` JSX স্ট্রিং ব্যবহারকারীকে তাদের লেনদেন সম্পর্কে আরও তথ্যের জন্য Etherscan দেখতে অনুরোধ করে। +- যদি লেনদেন ব্যর্থ হয়, ফাংশনটি একটি JSON অবজেক্ট প্রদান করবে যেখানে `status` স্ট্রিং ত্রুটির বার্তা রিলে করে। + +সব মিলিয়ে, আমাদের `updateMessage` ফাংশনটি এইরকম দেখতে হবে: + +```javascript +// interact.js + +export const updateMessage = async (address, message) => { + //ইনপুট ত্রুটি হ্যান্ডলিং + if (!window.ethereum || address === null) { + return { + status: + "💡 ব্লকচেইনে বার্তা আপডেট করতে আপনার MetaMask ওয়ালেট সংযোগ করুন।", + } + } + + if (message.trim() === "") { + return { + status: "❌ আপনার বার্তা একটি খালি স্ট্রিং হতে পারে না।", + } + } + + //লেনদেন প্যারামিটার সেট আপ করুন + const transactionParameters = { + to: contractAddress, // কন্ট্র্যাক্ট প্রকাশনার সময় ছাড়া প্রয়োজনীয়। + from: address, // ব্যবহারকারীর সক্রিয় ঠিকানার সাথে মিলতে হবে। + data: helloWorldContract.methods.update(message).encodeABI(), + } + + //লেনদেন স্বাক্ষর করুন + try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + status: ( + + ✅{" "} + + Etherscan-এ আপনার লেনদেনের স্থিতি দেখুন! + +
+ ℹ️ নেটওয়ার্ক দ্বারা লেনদেন যাচাই হয়ে গেলে, বার্তাটি + স্বয়ংক্রিয়ভাবে আপডেট হয়ে যাবে। +
+ ), + } + } catch (error) { + return { + status: "😥 " + error.message, + } + } +} +``` + +সবশেষে, আমাদের `updateMessage` ফাংশনটিকে আমাদের `HelloWorld.js` কম্পোনেন্টের সাথে সংযোগ করতে হবে। + +#### `updateMessage`-কে `HelloWorld.js` ফ্রন্টএন্ডের সাথে সংযোগ করুন {#connect-updatemessage-to-the-helloworld-js-frontend} + +আমাদের `onUpdatePressed` ফাংশনটি ইম্পোর্ট করা `updateMessage` ফাংশনে একটি অ্যাওয়েট কল করবে এবং `status` স্টেট ভেরিয়েবলটি পরিবর্তন করবে যাতে আমাদের লেনদেন সফল হয়েছে নাকি ব্যর্থ হয়েছে তা প্রতিফলিত হয়: + +```javascript +// HelloWorld.js + +const onUpdatePressed = async () => { + const { status } = await updateMessage(walletAddress, newMessage) + setStatus(status) +} +``` + +এটি খুবই পরিচ্ছন্ন এবং সহজ। আর জানেন কী... আপনার ডিএ্যাপস সম্পূর্ণ!!! + +এগিয়ে যান এবং **আপডেট** বোতামটি পরীক্ষা করুন! + +### আপনার নিজের কাস্টম ডিএ্যাপস তৈরি করুন {#make-your-own-custom-dapp} + +ওয়াও, আপনি টিউটোরিয়ালের শেষ পর্যন্ত পৌঁছেছেন! সংক্ষেপে, আপনি শিখেছেন কীভাবে: + +- আপনার ডিএ্যাপস প্রজেক্টের সাথে একটি MetaMask ওয়ালেট সংযোগ করা +- [Alchemy Web3](https://docs.alchemy.com/alchemy/documentation/alchemy-web3) API ব্যবহার করে আপনার স্মার্ট কন্ট্র্যাক্ট থেকে ডেটা পড়া +- MetaMask ব্যবহার করে ইথেরিয়াম লেনদেন স্বাক্ষর করা + +এখন আপনি এই টিউটোরিয়ালের দক্ষতা প্রয়োগ করে আপনার নিজের কাস্টম ডিএ্যাপস প্রজেক্ট তৈরি করার জন্য সম্পূর্ণরূপে সজ্জিত! বরাবরের মতো, আপনার যদি কোনো প্রশ্ন থাকে, তাহলে [Alchemy Discord](https://discord.gg/gWuC7zB)-এ আমাদের কাছে সাহায্যের জন্য পৌঁছাতে দ্বিধা করবেন না। 🧙‍♂️ + +এই টিউটোরিয়ালটি সম্পূর্ণ করার পর, টুইটারে [@alchemyplatform](https://twitter.com/AlchemyPlatform)-এ আমাদের ট্যাগ করে আপনার অভিজ্ঞতা কেমন ছিল বা আপনার কোনো মতামত থাকলে আমাদের জানান! diff --git a/public/content/translations/bn/developers/tutorials/hello-world-smart-contract/index.md b/public/content/translations/bn/developers/tutorials/hello-world-smart-contract/index.md new file mode 100644 index 00000000000..bf5ea083d3a --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/hello-world-smart-contract/index.md @@ -0,0 +1,366 @@ +--- +title: "শিক্ষানবিশদের জন্য হ্যালো ওয়ার্ল্ড স্মার্ট কন্ট্র্যাক্ট" +description: "Ethereum-এ একটি সহজ স্মার্ট কন্ট্র্যাক্ট লেখা এবং স্থাপন করার উপর একটি পরিচিতি টিউটোরিয়াল।" +author: "elanh" +tags: + [ + "সলিডিটি", + "hardhat", + "alchemy", + "স্মার্ট কন্ট্র্যাক্ট", + "ডেপ্লয়িং" + ] +skill: beginner +lang: bn +published: 2021-03-31 +--- + +আপনি যদি ব্লকচেইন ডেভেলপমেন্টে নতুন হন এবং কোথা থেকে শুরু করবেন তা না জানেন, অথবা আপনি যদি শুধুমাত্র স্মার্ট কন্ট্র্যাক্টগুলি কীভাবে স্থাপন এবং তার সাথে ইন্টারঅ্যাক্ট করতে হয় তা বুঝতে চান, তাহলে এই নির্দেশিকাটি আপনার জন্য। আমরা একটি ভার্চুয়াল ওয়ালেট [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), এবং [Alchemy](https://www.alchemy.com/eth) ব্যবহার করে Sepolia টেস্ট নেটওয়ার্কে একটি সহজ স্মার্ট কন্ট্র্যাক্ট তৈরি এবং স্থাপন করার মাধ্যমে দেখাব (যদি আপনি এখনও এর কোনটির অর্থ না বোঝেন তবে চিন্তা করবেন না, আমরা এটি ব্যাখ্যা করব)। + +এই টিউটোরিয়ালের [পার্ট 2](https://docs.alchemy.com/docs/interacting-with-a-smart-contract)-তে আমরা দেখব কিভাবে আমাদের স্মার্ট কন্ট্র্যাক্টটি এখানে স্থাপন করার পরে তার সাথে ইন্টারঅ্যাক্ট করা যায়, এবং [পার্ট 3](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan)-তে আমরা দেখব কিভাবে এটি Etherscan-এ প্রকাশ করা যায়। + +যেকোনো সময়ে আপনার কোনো প্রশ্ন থাকলে [Alchemy Discord](https://discord.gg/gWuC7zB)-এ যোগাযোগ করতে পারেন! + +## ধাপ 1: Ethereum নেটওয়ার্কের সাথে সংযোগ করুন {#step-1} + +Ethereum চেইনে রিকুয়েস্ট করার অনেক উপায় আছে। সহজ করার জন্য, আমরা Alchemy-তে একটি বিনামূল্যের অ্যাকাউন্ট ব্যবহার করব, এটি একটি ব্লকচেইন ডেভেলপার প্ল্যাটফর্ম এবং API যা আমাদের নিজস্ব নোড চালানোর প্রয়োজন ছাড়াই Ethereum চেইনের সাথে যোগাযোগ করতে দেয়। প্ল্যাটফর্মটিতে পর্যবেক্ষণ এবং বিশ্লেষণের জন্য ডেভেলপার টুলসও রয়েছে যা আমরা এই টিউটোরিয়ালে আমাদের স্মার্ট কন্ট্র্যাক্ট স্থাপনার আড়ালে কী ঘটছে তা বোঝার জন্য ব্যবহার করব। আপনার যদি আগে থেকেই একটি Alchemy অ্যাকাউন্ট না থাকে, [আপনি এখানে বিনামূল্যে সাইন আপ করতে পারেন](https://dashboard.alchemy.com/signup)। + +## ধাপ 2: আপনার অ্যাপ (এবং API কী) তৈরি করুন {#step-2} + +একবার আপনি একটি Alchemy অ্যাকাউন্ট তৈরি করে ফেললে, আপনি একটি অ্যাপ তৈরি করে একটি API কী জেনারেট করতে পারেন। এটি আমাদের Sepolia টেস্ট নেটওয়ার্কে অনুরোধ করার অনুমতি দেবে। আপনি যদি টেস্টনেটের সাথে পরিচিত না হন, তাহলে [এই পেজটি](/developers/docs/networks/) দেখুন। + +1. ন্যাভ বারে "Select an app" নির্বাচন করে এবং "Create new app" ক্লিক করে আপনার Alchemy ড্যাশবোর্ডের "Create new app" পেজে যান + +![হ্যালো ওয়ার্ল্ড অ্যাপ তৈরি করুন](./hello-world-create-app.png) + +2. আপনার অ্যাপের নাম দিন “Hello World”, একটি সংক্ষিপ্ত বিবরণ দিন, এবং একটি ব্যবহারের ক্ষেত্র বেছে নিন, যেমন, "Infra & Tooling."। এরপরে, "Ethereum" অনুসন্ধান করুন এবং নেটওয়ার্কটি নির্বাচন করুন। + +![অ্যাপ ভিউ হ্যালো ওয়ার্ল্ড তৈরি করুন](./create-app-view-hello-world.png) + +3. এগিয়ে যেতে "Next" এ ক্লিক করুন, তারপর "Create app" এ এবং এটিই! আপনার অ্যাপটি একটি API কী কপির জন্য উপলব্ধ সহ ন্যাভ বার ড্রপডাউন মেনুতে উপস্থিত হওয়া উচিত। + +## ধাপ 3: একটি Ethereum অ্যাকাউন্ট (অ্যাড্রেস) তৈরি করুন {#step-3} + +লেনদেন পাঠানো এবং গ্রহণ করার জন্য আমাদের একটি Ethereum অ্যাকাউন্ট প্রয়োজন। এই টিউটোরিয়ালের জন্য, আমরা MetaMask ব্যবহার করব, যা ব্রাউজারের একটি ভার্চুয়াল ওয়ালেট এবং আপনার Ethereum অ্যাকাউন্ট অ্যাড্রেস পরিচালনা করতে ব্যবহৃত হয়। [লেনদেন](/developers/docs/transactions/) সম্পর্কে আরও। + +আপনি [এখানে](https://metamask.io/download) বিনামূল্যে MetaMask ডাউনলোড করতে এবং একটি Ethereum অ্যাকাউন্ট তৈরি করতে পারেন। আপনি যখন একটি অ্যাকাউন্ট তৈরি করছেন, অথবা যদি আপনার আগে থেকেই একটি অ্যাকাউন্ট থাকে, তাহলে নেটওয়ার্ক ড্রপডাউন মেনু ব্যবহার করে "Sepolia" টেস্ট নেটওয়ার্কে স্যুইচ করতে ভুলবেন না (যাতে আমরা আসল টাকা নিয়ে কাজ না করি)। + +আপনি যদি Sepolia তালিকাভুক্ত না দেখেন, তাহলে মেনুতে যান, তারপর Advanced-এ যান এবং "Show test networks" চালু করতে নিচে স্ক্রোল করুন। নেটওয়ার্ক নির্বাচন মেনুতে, টেস্টনেটগুলির একটি তালিকা খুঁজে পেতে "Custom" ট্যাবটি বেছে নিন এবং "Sepolia" নির্বাচন করুন। + +![মেটামাস্ক সেপোলিয়া উদাহরণ](./metamask-sepolia-example.png) + +## ধাপ 4: একটি ফসেট থেকে ইথার যোগ করুন {#step-4} + +টেস্ট নেটওয়ার্কে আমাদের স্মার্ট কন্ট্র্যাক্ট স্থাপন করার জন্য, আমাদের কিছু নকল Eth লাগবে। Sepolia ETH পেতে আপনি বিভিন্ন ফসেটের একটি তালিকা দেখতে [Sepolia নেটওয়ার্কের বিবরণ](/developers/docs/networks/#sepolia)-এ যেতে পারেন। যদি একটি কাজ না করে, তবে অন্যটি চেষ্টা করুন কারণ সেগুলি মাঝে মাঝে খালি হয়ে যেতে পারে। নেটওয়ার্ক ট্রাফিকের কারণে আপনার নকল ETH পেতে কিছু সময় লাগতে পারে। কিছুক্ষণ পরেই আপনার Metamask অ্যাকাউন্টে ETH দেখতে পাবেন! + +## ধাপ 5: আপনার ব্যালেন্স পরীক্ষা করুন {#step-5} + +আমাদের ব্যালেন্স আছে কিনা তা দুবার পরীক্ষা করার জন্য, আসুন [Alchemy’s composer tool](https://sandbox.alchemy.com/?network=ETH_SEPOLIA&method=eth_getBalance&body.id=1&body.jsonrpc=2.0&body.method=eth_getBalance&body.params%5B0%5D=&body.params%5B1%5D=latest) ব্যবহার করে একটি [eth_getBalance](/developers/docs/apis/json-rpc/#eth_getbalance) অনুরোধ করি। এটি আমাদের ওয়ালেটে থাকা ETH-এর পরিমাণ ফেরত দেবে। আপনার MetaMask অ্যাকাউন্ট অ্যাড্রেস ইনপুট করার পরে এবং “অনুরোধ পাঠান”-এ ক্লিক করার পরে, আপনার এইরকম একটি প্রতিক্রিয়া দেখা উচিত: + +```json +{ "jsonrpc": "2.0", "id": 0, "result": "0x2B5E3AF16B1880000" } +``` + +> **দ্রষ্টব্য:** এই ফলাফলটি ETH-এ নয়, wei-তে। Wei ইথারের ক্ষুদ্রতম একক হিসাবে ব্যবহৃত হয়। wei থেকে ETH-তে রূপান্তর হল: 1 eth = 1018 wei। সুতরাং যদি আমরা 0x2B5E3AF16B1880000 কে দশমিকে রূপান্তর করি তাহলে আমরা 5\*10¹⁸ পাই যা 5 ETH এর সমান। +> +> যাক বাবা! আমাদের নকল টাকা সব আছে । + +## ধাপ 6: আমাদের প্রজেক্ট শুরু করুন {#step-6} + +প্রথমে, আমাদের প্রজেক্টের জন্য একটি ফোল্ডার তৈরি করতে হবে। আপনার কমান্ড লাইনে যান এবং টাইপ করুন: + +``` +mkdir hello-world +cd hello-world +``` + +এখন যেহেতু আমরা আমাদের প্রজেক্ট ফোল্ডারের ভিতরে আছি, আমরা প্রজেক্টটি শুরু করতে `npm init` ব্যবহার করব। আপনার যদি আগে থেকেই npm ইনস্টল করা না থাকে, তাহলে [এই নির্দেশাবলী](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) অনুসরণ করুন (আমাদের Node.js-ও লাগবে তাই সেটিও ডাউনলোড করুন!)। + +``` +npm init +``` + +ইনস্টলেশন প্রশ্নগুলির উত্তর আপনি কীভাবে দেন তা সত্যিই গুরুত্বপূর্ণ নয়, রেফারেন্সের জন্য আমরা কীভাবে এটি করেছি তা এখানে রয়েছে: + +``` +প্যাকেজের নাম: (hello-world) +ভার্সন: (1.0.0) +বিবরণ: হ্যালো ওয়ার্ল্ড স্মার্ট কন্ট্র্যাক্ট +এন্ট্রি পয়েন্ট: (index.js) +টেস্ট কমান্ড: +গিট রিপোজিটরি: +কীওয়ার্ড: +লেখক: +লাইসেন্স: (ISC) +/Users/.../.../.../hello-world/package.json এ লিখতে চলেছি: + +{ + "name": "hello-world", + "version": "1.0.0", + "description": "হ্যালো ওয়ার্ল্ড স্মার্ট কন্ট্র্যাক্ট", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} +``` + +package.json অনুমোদন করুন এবং আমরা এগিয়ে যাওয়ার জন্য প্রস্তুত! + +## ধাপ 7: [Hardhat](https://hardhat.org/getting-started/#overview) ডাউনলোড করুন {#step-7} + +Hardhat হল আপনার Ethereum সফ্টওয়্যার কম্পাইল, স্থাপন, পরীক্ষা এবং ডিবাগ করার জন্য একটি ডেভেলপমেন্ট পরিবেশ। এটি ডেভেলপারদের লাইভ চেইনে স্থাপন করার আগে স্থানীয়ভাবে স্মার্ট কন্ট্র্যাক্ট এবং ডিএ্যাপস তৈরি করতে সাহায্য করে। + +আমাদের `hello-world` প্রজেক্টের ভিতরে চালান: + +``` +npm install --save-dev hardhat +``` + +[ইনস্টলেশন নির্দেশাবলী](https://hardhat.org/getting-started/#overview) সম্পর্কে আরও বিস্তারিত জানতে এই পৃষ্ঠাটি দেখুন। + +## ধাপ 8: Hardhat প্রজেক্ট তৈরি করুন {#step-8} + +আমাদের প্রজেক্ট ফোল্ডারের ভিতরে চালান: + +``` +npx hardhat +``` + +তারপরে আপনার একটি স্বাগত বার্তা এবং আপনি কী করতে চান তা নির্বাচন করার একটি বিকল্প দেখতে পাওয়া উচিত। “একটি খালি hardhat.config.js তৈরি করুন” নির্বাচন করুন: + +``` +888 888 888 888 888 +888 888 888 888 888 +888 888 888 888 888 +8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 +888 888 "88b 888P" d88" 888 888 "88b "88b 888 +888 888 .d888888 888 888 888 888 888 .d888888 888 +888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. +888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 + +👷 Hardhat v2.0.11-এ আপনাকে স্বাগতম 👷‍? + +আপনি কি করতে চান? … +একটি নমুনা প্রজেক্ট তৈরি করুন +❯ একটি খালি hardhat.config.js তৈরি করুন +প্রস্থান করুন +``` + +এটি আমাদের জন্য একটি `hardhat.config.js` ফাইল তৈরি করবে যেখানে আমরা আমাদের প্রজেক্টের জন্য সমস্ত সেট আপ নির্দিষ্ট করব (ধাপ 13-এ)। + +## ধাপ 9: প্রজেক্ট ফোল্ডার যোগ করুন {#step-9} + +আমাদের প্রজেক্টকে সংগঠিত রাখতে আমরা দুটি নতুন ফোল্ডার তৈরি করব। আপনার কমান্ড লাইনে আপনার প্রজেক্টের রুট ডিরেক্টরিতে নেভিগেট করুন এবং টাইপ করুন: + +``` +mkdir contracts +mkdir scripts +``` + +- `contracts/` হল যেখানে আমরা আমাদের হ্যালো ওয়ার্ল্ড স্মার্ট কন্ট্র্যাক্ট কোড ফাইল রাখব +- `scripts/` হল যেখানে আমরা আমাদের কন্ট্র্যাক্ট স্থাপন এবং ইন্টারঅ্যাক্ট করার জন্য স্ক্রিপ্ট রাখব + +## ধাপ 10: আমাদের কন্ট্র্যাক্ট লিখুন {#step-10} + +আপনি হয়তো নিজেকে জিজ্ঞাসা করছেন, আমরা কখন কোড লিখতে যাচ্ছি?? আচ্ছা, আমরা এখানে, ধাপ 10-এ। + +আপনার প্রিয় এডিটরে হ্যালো-ওয়ার্ল্ড প্রজেক্টটি খুলুন (আমরা [VSCode](https://code.visualstudio.com/) পছন্দ করি)। স্মার্ট কন্ট্র্যাক্টগুলি সলিডিটি নামক একটি ভাষায় লেখা হয় যা আমরা আমাদের HelloWorld.sol স্মার্ট কন্ট্র্যাক্ট লিখতে ব্যবহার করব।‌ + +1. "contracts" ফোল্ডারে যান এবং HelloWorld.sol নামে একটি নতুন ফাইল তৈরি করুন +2. নিচে Ethereum ফাউন্ডেশন থেকে একটি নমুনা Hello World স্মার্ট কন্ট্র্যাক্ট দেওয়া হলো যা আমরা এই টিউটোরিয়ালের জন্য ব্যবহার করব। নিচের বিষয়বস্তুগুলি আপনার HelloWorld.sol ফাইলে কপি এবং পেস্ট করুন, এবং এই কন্ট্র্যাক্টটি কী করে তা বোঝার জন্য মন্তব্যগুলি পড়তে ভুলবেন না: + +```solidity +// সলিডিটির ভার্সন নির্দিষ্ট করে, সেমান্টিক ভার্সনিং ব্যবহার করে। +// আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/layout-of-source-files.html#pragma +pragma solidity ^0.7.0; + +// `HelloWorld` নামে একটি কন্ট্র্যাক্ট সংজ্ঞায়িত করে। +// একটি কন্ট্র্যাক্ট হল ফাংশন এবং ডেটার (তার স্টেট) একটি সংগ্রহ। একবার স্থাপন করা হলে, একটি কন্ট্র্যাক্ট Ethereum ব্লকচেইনের একটি নির্দিষ্ট অ্যাড্রেসে থাকে। আরও জানুন: https://solidity.readthedocs.io/en/v0.5.10/structure-of-a-contract.html +contract HelloWorld { + + // `string` টাইপের একটি স্টেট ভেরিয়েবল `message` ঘোষণা করে। + // স্টেট ভেরিয়েবল হল এমন ভেরিয়েবল যার মানগুলি স্থায়ীভাবে কন্ট্র্যাক্ট স্টোরেজে সংরক্ষিত থাকে। `public` কীওয়ার্ডটি ভেরিয়েবলগুলিকে কন্ট্র্যাক্টের বাইরে থেকে অ্যাক্সেসযোগ্য করে তোলে এবং একটি ফাংশন তৈরি করে যা অন্য কন্ট্র্যাক্ট বা ক্লায়েন্টরা মান অ্যাক্সেস করার জন্য কল করতে পারে। + string public message; + + // অনেক ক্লাস-ভিত্তিক অবজেক্ট-ওরিয়েন্টেড ভাষার মতো, একটি কনস্ট্রাক্টর হল একটি বিশেষ ফাংশন যা শুধুমাত্র কন্ট্র্যাক্ট তৈরির সময় কার্যকর করা হয়। + // কনস্ট্রাক্টরগুলি কন্ট্র্যাক্টের ডেটা শুরু করতে ব্যবহৃত হয়। আরও জানুন:https://solidity.readthedocs.io/en/v0.5.10/contracts.html#constructors + constructor(string memory initMessage) { + + // একটি স্ট্রিং আর্গুমেন্ট `initMessage` গ্রহণ করে এবং মানটি কন্ট্র্যাক্টের `message` স্টোরেজ ভেরিয়েবলে সেট করে)। + message = initMessage; + } + + // একটি পাবলিক ফাংশন যা একটি স্ট্রিং আর্গুমেন্ট গ্রহণ করে এবং `message` স্টোরেজ ভেরিয়েবল আপডেট করে। + function update(string memory newMessage) public { + message = newMessage; + } +} +``` + +এটি একটি অত্যন্ত সহজ স্মার্ট কন্ট্র্যাক্ট যা তৈরির সময় একটি বার্তা সংরক্ষণ করে এবং `update` ফাংশন কল করে আপডেট করা যায়। + +## ধাপ 11: আপনার প্রজেক্টে MetaMask এবং Alchemy সংযোগ করুন {#step-11} + +আমরা একটি MetaMask ওয়ালেট, Alchemy অ্যাকাউন্ট তৈরি করেছি এবং আমাদের স্মার্ট কন্ট্র্যাক্ট লিখেছি, এখন এই তিনটি সংযোগ করার সময়। + +আপনার ভার্চুয়াল ওয়ালেট থেকে পাঠানো প্রতিটি লেনদেনের জন্য আপনার অনন্য ব্যক্তিগত কী ব্যবহার করে একটি স্বাক্ষরের প্রয়োজন। আমাদের প্রোগ্রামকে এই অনুমতি দেওয়ার জন্য, আমরা আমাদের ব্যক্তিগত কী (এবং Alchemy API কী) একটি এনভায়রনমেন্ট ফাইলে নিরাপদে সংরক্ষণ করতে পারি। + +> লেনদেন পাঠানো সম্পর্কে আরও জানতে, ওয়েব3 ব্যবহার করে লেনদেন পাঠানোর উপর [এই টিউটোরিয়ালটি](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) দেখুন। + +প্রথমে, আপনার প্রজেক্ট ডিরেক্টরিতে ডটএনভ প্যাকেজটি ইনস্টল করুন: + +``` +npm install dotenv --save +``` + +তারপর, আমাদের প্রজেক্টের রুট ডিরেক্টরিতে একটি `.env` ফাইল তৈরি করুন, এবং এতে আপনার MetaMask ব্যক্তিগত কী এবং HTTP Alchemy API URL যোগ করুন। + +- আপনার প্রাইভেট কী এক্সপোর্ট করতে [এই নির্দেশাবলী](https://support.metamask.io/configure/accounts/how-to-export-an-accounts-private-key/) অনুসরণ করুন +- HTTP Alchemy API URL পেতে নিচে দেখুন + +![alchemy এপিআই কি পান](./get-alchemy-api-key.png) + +Alchemy API URL কপি করুন + +আপনার `.env` ফাইলটি এইরকম দেখতে হবে: + +``` +API_URL = "https://eth-sepolia.g.alchemy.com/v2/আপনার-এপিআই-কি" +PRIVATE_KEY = "আপনার-মেটামাস্ক-প্রাইভেট-কি" +``` + +এগুলিকে আমাদের কোডের সাথে সংযোগ করতে, আমরা ধাপ 13-এ আমাদের `hardhat.config.js` ফাইলে এই ভেরিয়েবলগুলিকে রেফারেন্স করব। + + + + +.env কমিট করবেন না! অনুগ্রহ করে নিশ্চিত করুন যে আপনার .env ফাইলটি কারো সাথে শেয়ার বা প্রকাশ করবেন না, কারণ এটি করার মাধ্যমে আপনি আপনার গোপনীয়তাগুলির সাথে আপস করছেন। আপনি যদি সংস্করণ নিয়ন্ত্রণ ব্যবহার করেন, তাহলে আপনার .env একটি gitignore ফাইলে যোগ করুন। + + + + +## ধাপ 12: Ethers.js ইনস্টল করুন {#step-12-install-ethersjs} + +Ethers.js একটি লাইব্রেরি যা [স্ট্যান্ডার্ড JSON-RPC পদ্ধতিগুলিকে](/developers/docs/apis/json-rpc/) আরও ব্যবহারকারী-বান্ধব পদ্ধতির সাথে র‍্যাপ করে Ethereum-এর সাথে ইন্টারঅ্যাক্ট করা এবং অনুরোধ করা সহজ করে তোলে। + +Hardhat অতিরিক্ত টুলিং এবং বর্ধিত কার্যকারিতার জন্য [প্লাগইন](https://hardhat.org/plugins/) একীভূত করা খুব সহজ করে তোলে। আমরা কন্ট্র্যাক্ট স্থাপনার জন্য [Ethers প্লাগইন](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) এর সুবিধা নেব ([Ethers.js](https://github.com/ethers-io/ethers.js/)-এর কিছু খুব পরিষ্কার কন্ট্র্যাক্ট স্থাপন পদ্ধতি রয়েছে)। + +আপনার প্রজেক্ট ডিরেক্টরিতে টাইপ করুন: + +``` +npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0" +``` + +আমরা পরবর্তী ধাপে আমাদের `hardhat.config.js`-এ ethers এর প্রয়োজনীয়তাও যোগ করব। + +## ধাপ 13: hardhat.config.js আপডেট করুন {#step-13-update-hardhatconfigjs} + +আমরা এখন পর্যন্ত বেশ কিছু নির্ভরতা এবং প্লাগইন যোগ করেছি, এখন আমাদের `hardhat.config.js` আপডেট করতে হবে যাতে আমাদের প্রজেক্ট তাদের সকলের সম্পর্কে জানতে পারে। + +আপনার `hardhat.config.js` আপডেট করে এইরকম করুন: + +``` +require('dotenv').config(); + +require("@nomiclabs/hardhat-ethers"); +const { API_URL, PRIVATE_KEY } = process.env; + +/** +* @type import('hardhat/config').HardhatUserConfig +*/ +module.exports = { + solidity: "0.7.3", + defaultNetwork: "sepolia", + networks: { + hardhat: {}, + sepolia: { + url: API_URL, + accounts: [`0x${PRIVATE_KEY}`] + } + }, +} +``` + +## ধাপ 14: আমাদের কন্ট্র্যাক্ট কম্পাইল করুন {#step-14-compile-our-contracts} + +সবকিছু ঠিকঠাক কাজ করছে কিনা তা নিশ্চিত করতে, আসুন আমাদের কন্ট্র্যাক্ট কম্পাইল করি। `compile` টাস্কটি অন্তর্নির্মিত হার্ডহ্যাট টাস্কগুলির মধ্যে একটি। + +কমান্ড লাইন থেকে রান করুন: + +``` +npx hardhat compile +``` + +আপনি `SPDX license identifier not provided in source file` সম্পর্কে একটি সতর্কবার্তা পেতে পারেন, কিন্তু সে সম্পর্কে চিন্তা করার দরকার নেই — আশা করি বাকি সব ঠিক আছে! যদি না হয়, আপনি সবসময় [Alchemy ডিসকর্ড](https://discord.gg/u72VCg3)-এ বার্তা দিতে পারেন। + +## ধাপ 15: আমাদের ডিপ্লয় স্ক্রিপ্ট লিখুন {#step-15-write-our-deploy-scripts} + +এখন যেহেতু আমাদের কন্ট্র্যাক্ট লেখা হয়ে গেছে এবং আমাদের কনফিগারেশন ফাইল প্রস্তুত, এখন আমাদের কন্ট্র্যাক্ট ডেপ্লয় স্ক্রিপ্ট লেখার সময়। + +`scripts/` ফোল্ডারে যান এবং `deploy.js` নামে একটি নতুন ফাইল তৈরি করুন, এতে নিম্নলিখিত বিষয়বস্তু যোগ করুন: + +``` +async function main() { + const HelloWorld = await ethers.getContractFactory("HelloWorld"); + + // ডিপ্লয়মেন্ট শুরু করুন, একটি প্রতিশ্রুতি প্রদান করে যা একটি কন্ট্র্যাক্ট অবজেক্টে সমাধান করে + const hello_world = await HelloWorld.deploy("Hello World!"); + console.log("কন্ট্র্যাক্টটি এই ঠিকানায় স্থাপন করা হয়েছে:", hello_world.address);} + +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); +``` + +Hardhat তাদের [কন্ট্র্যাক্টস টিউটোরিয়াল](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)-এ এই কোডের প্রতিটি লাইন কী করে তা চমৎকারভাবে ব্যাখ্যা করেছে, আমরা এখানে তাদের ব্যাখ্যাগুলি গ্রহণ করেছি। + +``` +const HelloWorld = await ethers.getContractFactory("HelloWorld"); +``` + +ethers.js-এ একটি `ContractFactory` হল একটি অ্যাবস্ট্রাকশন যা নতুন স্মার্ট কন্ট্র্যাক্ট স্থাপন করতে ব্যবহৃত হয়, তাই এখানে `HelloWorld` হল আমাদের হ্যালো ওয়ার্ল্ড কন্ট্র্যাক্টের ইনস্ট্যান্সের জন্য একটি ফ্যাক্টরি। `hardhat-ethers` প্লাগইন ব্যবহার করার সময় `ContractFactory` এবং `Contract` ইনস্ট্যান্সগুলি ডিফল্টরূপে প্রথম সাইনারের সাথে সংযুক্ত থাকে। + +``` +const hello_world = await HelloWorld.deploy(); +``` + +একটি `ContractFactory`-এ `deploy()` কল করা ডিপ্লয়মেন্ট শুরু করবে, এবং একটি `Promise` প্রদান করবে যা একটি `Contract`-এ সমাধান করে। এটি সেই অবজেক্ট যার আমাদের প্রতিটি স্মার্ট কন্ট্র্যাক্ট ফাংশনের জন্য একটি পদ্ধতি রয়েছে। + +## ধাপ 16: আমাদের কন্ট্র্যাক্ট স্থাপন করুন {#step-16-deploy-our-contract} + +আমরা অবশেষে আমাদের স্মার্ট কন্ট্র্যাক্ট স্থাপন করার জন্য প্রস্তুত! কমান্ড লাইনে যান এবং চালান: + +``` +npx hardhat run scripts/deploy.js --network sepolia +``` + +তারপরে আপনার এইরকম কিছু দেখা উচিত: + +``` +কন্ট্র্যাক্টটি এই ঠিকানায় স্থাপন করা হয়েছে: 0x6cd7d44516a20882cEa2DE9f205bF401c0d23570 +``` + +যদি আমরা [Sepolia etherscan](https://sepolia.etherscan.io/) এ যাই এবং আমাদের কন্ট্র্যাক্টের ঠিকানা অনুসন্ধান করি তবে আমরা দেখতে পাব যে এটি সফলভাবে স্থাপন করা হয়েছে। লেনদেনটি এইরকম কিছু দেখাবে: + +![ইথারস্ক্যান কন্ট্র্যাক্ট](./etherscan-contract.png) + +`From` ঠিকানাটি আপনার MetaMask অ্যাকাউন্টের ঠিকানার সাথে মিলবে এবং To ঠিকানায় “Contract Creation” লেখা থাকবে কিন্তু যদি আমরা লেনদেনে ক্লিক করি তবে আমরা `To` ক্ষেত্রে আমাদের কন্ট্র্যাক্টের ঠিকানা দেখতে পাব: + +![ইথারস্ক্যান লেনদেন](./etherscan-transaction.png) + +অভিনন্দন! আপনি এইমাত্র Ethereum চেইনে একটি স্মার্ট কন্ট্র্যাক্ট স্থাপন করেছেন 🎉 + +নেপথ্যে কী ঘটছে তা বোঝার জন্য, আসুন আমাদের [Alchemy ড্যাশবোর্ড](https://dashboard.alchemyapi.io/explorer)-এর এক্সপ্লোরার ট্যাবে নেভিগেট করি। আপনার যদি একাধিক Alchemy অ্যাপ থাকে তবে অ্যাপ দ্বারা ফিল্টার করতে এবং “Hello World” নির্বাচন করতে ভুলবেন না। +![হ্যালো ওয়ার্ল্ড এক্সপ্লোরার](./hello-world-explorer.png) + +এখানে আপনি কয়েকটি JSON-RPC কল দেখতে পাবেন যা Hardhat/Ethers আমাদের জন্য হুডের নিচে তৈরি করেছে যখন আমরা `.deploy()` ফাংশনটি কল করেছি। এখানে দুটি গুরুত্বপূর্ণ বিষয় হল [`eth_sendRawTransaction`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-send-raw-transaction), যা আমাদের কন্ট্র্যাক্টকে Sepolia চেইনে লেখার অনুরোধ, এবং [`eth_getTransactionByHash`](https://www.alchemy.com/docs/node/abstract/abstract-api-endpoints/eth-get-transaction-by-hash) যা হ্যাস দেওয়া হলে আমাদের লেনদেন সম্পর্কে তথ্য পড়ার অনুরোধ (লেনদেনের সময় একটি সাধারণ প্যাটার্ন)। লেনদেন পাঠানো সম্পর্কে আরও জানতে, [Web3 ব্যবহার করে লেনদেন পাঠানো](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) এই টিউটোরিয়ালটি দেখুন। + +এই টিউটোরিয়ালের পার্ট 1 এর জন্য এটুকুই, পার্ট 2-এ আমরা আমাদের প্রাথমিক বার্তা আপডেট করে আমাদের [স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করব](https://www.alchemy.com/docs/interacting-with-a-smart-contract), এবং পার্ট 3-এ আমরা [আমাদের স্মার্ট কন্ট্র্যাক্ট Etherscan-এ প্রকাশ করব](https://www.alchemy.com/docs/submitting-your-smart-contract-to-etherscan) যাতে সবাই জানতে পারে কিভাবে এর সাথে ইন্টারঅ্যাক্ট করতে হয়। + +**Alchemy সম্পর্কে আরও জানতে চান? আমাদের [ওয়েবসাইট](https://www.alchemy.com/eth) দেখুন। কখনো কোনো আপডেট মিস করতে চান না? [এখানে](https://www.alchemy.com/newsletter) আমাদের নিউজলেটারে সাবস্ক্রাইব করুন! আমাদের [Discord](https://discord.gg/u72VCg3)-এও যোগ দিতে ভুলবেন না।**. diff --git a/public/content/translations/bn/developers/tutorials/how-to-implement-an-erc721-market/index.md b/public/content/translations/bn/developers/tutorials/how-to-implement-an-erc721-market/index.md new file mode 100644 index 00000000000..4afbaf5d6b6 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/how-to-implement-an-erc721-market/index.md @@ -0,0 +1,145 @@ +--- +title: "কিভাবে একটি ERC-721 বাজার প্রয়োগ করবেন" +description: "কিভাবে একটি বিকেন্দ্রীভূত ক্লাসিফায়েড বোর্ডে টোকেনাইজড আইটেম বিক্রির জন্য রাখবেন" +author: "Alberto Cuesta Cañada" +tags: [ "স্মার্ট কন্ট্র্যাক্ট", "erc-721", "সলিডিটি", "টোকেন" ] +skill: intermediate +lang: bn +published: 2020-03-19 +source: Hackernoon +sourceUrl: https://hackernoon.com/how-to-implement-an-erc721-market-1e1a32j9 +--- + +এই আর্টিকেলে, আমি আপনাকে দেখাতে যাচ্ছি কিভাবে Ethereum ব্লকচেইনের জন্য Craigslist কোড করতে হয়। + +Gumtree, Ebay এবং Craigslist-এর আগে, ক্লাসিফায়েড বোর্ডগুলি বেশিরভাগই কর্ক বা কাগজ দিয়ে তৈরি ছিল। স্কুলের করিডোরে, সংবাদপত্রে, রাস্তার আলোতে, দোকানের সামনে ক্লাসিফায়েড বোর্ড ছিল। + +ইন্টারনেটের সাথে সাথে এই সবকিছু বদলে গেছে। একটি নির্দিষ্ট ক্লাসিফায়েড বোর্ড দেখতে পারা মানুষের সংখ্যা বহুগুণে বেড়ে গেছে। এর সাথে, তারা যে বাজারগুলির প্রতিনিধিত্ব করে তা অনেক বেশি দক্ষ হয়ে ওঠে এবং বিশ্বব্যাপী আকারে স্কেল করা হয়েছিল। Ebay একটি বিশাল ব্যবসা যার উৎপত্তি এই শারীরিক ক্লাসিফায়েড বোর্ডগুলি থেকে হয়েছে। + +ব্লকচেইনের সাথে এই বাজারগুলি আরও একবার পরিবর্তনের জন্য প্রস্তুত, আমি আপনাকে দেখাই কিভাবে। + +## নগদীকরণ {#monetization} + +একটি পাবলিক ব্লকচেইন ক্লাসিফায়েড বোর্ডের ব্যবসায়িক মডেল Ebay এবং কোম্পানির থেকে ভিন্ন হতে হবে। + +প্রথমত, এখানে [বিকেন্দ্রীকরণের দৃষ্টিকোণ](/developers/docs/web2-vs-web3/) রয়েছে। বিদ্যমান প্ল্যাটফর্মগুলিকে তাদের নিজস্ব সার্ভার বজায় রাখতে হবে। একটি বিকেন্দ্রীভূত প্ল্যাটফর্ম তার ব্যবহারকারীদের দ্বারা রক্ষণাবেক্ষণ করা হয়, তাই প্ল্যাটফর্মের মালিকের জন্য মূল প্ল্যাটফর্মটি চালানোর খরচ শূন্যে নেমে আসে। + +তারপর রয়েছে ফ্রন্ট এন্ড, ওয়েবসাইট বা ইন্টারফেস যা প্ল্যাটফর্মে অ্যাক্সেস দেয়। এখানে অনেক বিকল্প আছে। প্ল্যাটফর্মের মালিকরা অ্যাক্সেস সীমাবদ্ধ করতে পারে এবং প্রত্যেককে তাদের ইন্টারফেস ব্যবহার করতে বাধ্য করতে পারে, একটি ফি চার্জ করে। প্ল্যাটফর্মের মালিকরা অ্যাক্সেস খোলার সিদ্ধান্তও নিতে পারে (জনগণের হাতে ক্ষমতা!) এবং যে কাউকে প্ল্যাটফর্মে ইন্টারফেস তৈরি করতে দিন। অথবা মালিকরা সেই চরম পর্যায়গুলোর মাঝখানে যেকোনো পদ্ধতির সিদ্ধান্ত নিতে পারেন। + +_আমার চেয়ে বেশি দূরদৃষ্টিসম্পন্ন ব্যবসায়িক নেতারা জানবেন কিভাবে এটিকে নগদীকরণ করা যায়। আমি শুধু দেখছি যে এটি স্থিতাবস্থা থেকে আলাদা এবং সম্ভবত লাভজনক।_ + +উপরন্তু, এখানে অটোমেশন এবং পেমেন্টের দৃষ্টিকোণ রয়েছে। কিছু জিনিস খুব [কার্যকরভাবে টোকেনাইজড](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com) করা যেতে পারে এবং একটি ক্লাসিফায়েড বোর্ডে ট্রেড করা যেতে পারে। টোকেনাইজড অ্যাসেটগুলি একটি ব্লকচেইনে সহজেই স্থানান্তর করা যায়। অত্যন্ত জটিল পেমেন্ট পদ্ধতি একটি ব্লকচেইনে সহজেই প্রয়োগ করা যেতে পারে। + +আমি এখানে শুধু একটি ব্যবসায়িক সুযোগের গন্ধ পাচ্ছি। কোনো চলমান খরচ ছাড়াই একটি ক্লাসিফায়েড বোর্ড সহজেই প্রয়োগ করা যেতে পারে, প্রতিটি লেনদেনে অন্তর্ভুক্ত জটিল পেমেন্ট পাথ সহ। আমি নিশ্চিত যে কেউ এটি কিসের জন্য ব্যবহার করতে হবে সে সম্পর্কে একটি ধারণা নিয়ে আসবে। + +আমি শুধু এটি তৈরি করে খুশি। চলুন কোডটি একবার দেখে নেওয়া যাক। + +## বাস্তবায়ন {#implementation} + +কিছু সময় আগে আমরা ব্যবসায়িক ক্ষেত্রের উদাহরণ বাস্তবায়ন এবং অন্যান্য ভাল জিনিস সহ একটি [ওপেন সোর্স রিপোজিটরি](https://github.com/HQ20/contracts?ref=hackernoon.com) শুরু করেছি, অনুগ্রহ করে একবার দেখুন। + +এই [Ethereum ক্লাসিফায়েড বোর্ড](https://github.com/HQ20/contracts/tree/master/contracts/classifieds?ref=hackernoon.com) এর কোডটি সেখানে আছে, দয়া করে এটি ব্যবহার করুন এবং যথেচ্ছভাবে ব্যবহার করুন। শুধু সচেতন থাকুন যে কোডটি অডিট করা হয়নি এবং এতে টাকা লাগানোর আগে আপনাকে নিজের যথাযথ সতর্কতা অবলম্বন করতে হবে। + +বোর্ডের মূল বিষয়গুলি জটিল নয়। বোর্ডের সমস্ত বিজ্ঞাপনগুলি কয়েকটি ফিল্ড সহ একটি স্ট্রাকট হবে: + +```solidity +struct Trade { + address poster; + uint256 item; + uint256 price; + bytes32 status; // খোলা, কার্যকর, বাতিল +} +``` + +সুতরাং বিজ্ঞাপন পোস্ট করার জন্য কেউ একজন আছেন। বিক্রির জন্য একটি আইটেম। আইটেমটির জন্য একটি মূল্য। ট্রেডের স্ট্যাটাস যা খোলা, কার্যকর বা বাতিল হতে পারে। + +এই সমস্ত ট্রেড একটি ম্যাপিংয়ে রাখা হবে। কারণ Solidity-তে সবকিছুই একটি ম্যাপিং বলে মনে হয়। এছাড়াও কারণ এটি সুবিধাজনক। + +```solidity +mapping(uint256 => Trade) public trades; +``` + +একটি ম্যাপিং ব্যবহার করার অর্থ হল, এটি পোস্ট করার আগে আমাদের প্রতিটি বিজ্ঞাপনের জন্য একটি আইডি তৈরি করতে হবে এবং এটিতে কাজ করার আগে আমাদের একটি বিজ্ঞাপনের আইডি জানতে হবে। স্মার্ট কন্ট্র্যাক্ট বা ফ্রন্ট-এন্ডে এর সাথে মোকাবিলা করার একাধিক উপায় রয়েছে। আপনার যদি কিছু দিকনির্দেশনার প্রয়োজন হয় তবে জিজ্ঞাসা করুন। + +এরপরে প্রশ্ন আসে যে আমরা যে আইটেমগুলি নিয়ে কাজ করি সেগুলি কী, এবং লেনদেনের জন্য অর্থ প্রদানের জন্য ব্যবহৃত এই মুদ্রাটি কী। + +আইটেমগুলির জন্য, আমরা কেবল জিজ্ঞাসা করতে যাচ্ছি যে তারা [ERC-721](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol?ref=hackernoon.com) ইন্টারফেসটি প্রয়োগ করে, যা প্রকৃতপক্ষে ব্লকচেইনে বাস্তব বিশ্বের আইটেমগুলিকে উপস্থাপন করার একটি উপায়, যদিও এটি [ডিজিটাল অ্যাসেটগুলির সাথে সবচেয়ে ভাল কাজ করে](https://hackernoon.com/tokenization-of-digital-assets-g0ffk3v8s?ref=hackernoon.com)। আমরা কনস্ট্রাক্টরে আমাদের নিজস্ব ERC721 কন্ট্র্যাক্ট নির্দিষ্ট করতে যাচ্ছি, যার অর্থ আমাদের ক্লাসিফায়েড বোর্ডের যেকোনো অ্যাসেটকে আগে থেকে টোকেনাইজড করতে হবে। + +পেমেন্টের জন্য, আমরা একই ধরনের কিছু করতে যাচ্ছি। বেশিরভাগ ব্লকচেইন প্রকল্প তাদের নিজস্ব [ERC-20](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol?ref=hackernoon.com) ক্রিপটোকারেন্সি সংজ্ঞায়িত করে। অন্য কেউ কেউ DAI-এর মতো একটি মূলধারার মুদ্রা ব্যবহার করতে পছন্দ করেন। এই ক্লাসিফায়েড বোর্ডে, আপনার মুদ্রা কী হবে তা নির্মাণের সময় আপনাকে সিদ্ধান্ত নিতে হবে। সহজ। + +```solidity +constructor ( + address _currencyTokenAddress, address _itemTokenAddress +) public { + currencyToken = IERC20(_currencyTokenAddress); + itemToken = IERC721(_itemTokenAddress); + tradeCounter = 0; +} +``` + +আমরা প্রায় সেখানে পৌঁছে গেছি। আমরা বিজ্ঞাপন, ট্রেডের জন্য আইটেম এবং পেমেন্টের জন্য একটি মুদ্রা পেয়েছি। একটি বিজ্ঞাপন তৈরি করার অর্থ হল একটি আইটেম এসক্রোতে রাখা, এটি দেখানোর জন্য যে এটি আপনার কাছে আছে এবং আপনি এটি দুবার পোস্ট করেননি, সম্ভবত একটি ভিন্ন বোর্ডে। + +নীচের কোডটি ঠিক তাই করে। আইটেমটি এসক্রোতে রাখে, বিজ্ঞাপন তৈরি করে, কিছু হাউসকিপিং করে। + +```solidity +function openTrade(uint256 _item, uint256 _price) + public +{ + itemToken.transferFrom(msg.sender, address(this), _item); + trades[tradeCounter] = Trade({ + poster: msg.sender, + item: _item, + price: _price, + status: "Open" + }); + tradeCounter += 1; + emit TradeStatusChange(tradeCounter - 1, "Open"); +} +``` + +ট্রেডটি গ্রহণ করার অর্থ হল একটি বিজ্ঞাপন (ট্রেড) বেছে নেওয়া, মূল্য পরিশোধ করা, আইটেমটি গ্রহণ করা। নীচের কোডটি একটি ট্রেড পুনরুদ্ধার করে। এটি উপলব্ধ কিনা তা পরীক্ষা করে। আইটেমটির জন্য অর্থ প্রদান করে। আইটেমটি পুনরুদ্ধার করে। বিজ্ঞাপন আপডেট করে। + +```solidity +function executeTrade(uint256 _trade) + public +{ + Trade memory trade = trades[_trade]; + require(trade.status == "Open", "ট্রেডটি খোলা নেই।"); + currencyToken.transferFrom(msg.sender, trade.poster, trade.price); + itemToken.transferFrom(address(this), msg.sender, trade.item); + trades[_trade].status = "Executed"; + emit TradeStatusChange(_trade, "Executed"); +} +``` + +অবশেষে, আমাদের কাছে বিক্রেতাদের জন্য একটি বিকল্প রয়েছে ক্রেতা গ্রহণ করার আগে একটি ট্রেড থেকে সরে আসার। কিছু মডেলে, বিজ্ঞাপনগুলি মেয়াদ শেষ হওয়ার আগে কিছু সময়ের জন্য লাইভ থাকে। আপনার বাজারের ডিজাইনের উপর নির্ভর করে এটি আপনার পছন্দ। + +কোডটি একটি ট্রেড কার্যকর করার জন্য ব্যবহৃত কোডের সাথে খুব সাদৃশ্যপূর্ণ, শুধুমাত্র এখানে কোনো মুদ্রা হাতবদল হয় না এবং আইটেমটি বিজ্ঞাপন পোস্টারের কাছে ফিরে যায়। + +```solidity +function cancelTrade(uint256 _trade) + public +{ + Trade memory trade = trades[_trade]; + require( + msg.sender == trade.poster, + "ট্রেড শুধুমাত্র পোস্টার দ্বারা বাতিল করা যেতে পারে।" + ); + require(trade.status == "Open", "ট্রেডটি খোলা নেই।"); + itemToken.transferFrom(address(this), trade.poster, trade.item); + trades[_trade].status = "Cancelled"; + emit TradeStatusChange(_trade, "Cancelled"); +} +``` + +এই পর্যন্তই। আপনি বাস্তবায়নের শেষ পর্যন্ত পৌঁছেছেন। কোডে প্রকাশ করা হলে কিছু ব্যবসায়িক ধারণা কতটা সংক্ষিপ্ত হয় তা বেশ আশ্চর্যজনক, এবং এটি সেইসব ক্ষেত্রের মধ্যে একটি। সম্পূর্ণ কন্ট্র্যাক্টটি [আমাদের রেপোতে](https://github.com/HQ20/contracts/blob/master/contracts/classifieds/Classifieds.sol) দেখুন। + +## উপসংহার {#conclusion} + +ক্লাসিফায়েড বোর্ডগুলি একটি সাধারণ বাজার কনফিগারেশন যা ইন্টারনেটের সাথে ব্যাপকভাবে প্রসারিত হয়েছে, এবং কিছু একচেটিয়া বিজয়ীর সাথে এটি একটি অত্যন্ত জনপ্রিয় ব্যবসায়িক মডেল হয়ে উঠেছে। + +ক্লাসিফায়েড বোর্ডগুলি ব্লকচেইন পরিবেশে নকল করার জন্য একটি সহজ টুল, যার কিছু নির্দিষ্ট বৈশিষ্ট্য রয়েছে যা বিদ্যমান জায়ান্টদের জন্য একটি চ্যালেঞ্জ তৈরি করা সম্ভব করবে। + +এই আর্টিকেলে, আমি একটি ক্লাসিফায়েড বোর্ড ব্যবসার ব্যবসায়িক বাস্তবতা এবং প্রযুক্তিগত বাস্তবায়নের মধ্যে একটি সেতুবন্ধন করার চেষ্টা করেছি। আপনার যদি সঠিক দক্ষতা থাকে তবে এই জ্ঞান আপনাকে বাস্তবায়নের জন্য একটি দৃষ্টিভঙ্গি এবং একটি রোডম্যাপ তৈরি করতে সাহায্য করবে। + +বরাবরের মতো, আপনি যদি মজাদার কিছু তৈরি করতে চান এবং কিছু পরামর্শ চান, তাহলে অনুগ্রহ করে [আমার সাথে যোগাযোগ করুন](https://albertocuesta.es/)! আমি সাহায্য করতে সবসময় খুশি। diff --git a/public/content/translations/bn/developers/tutorials/how-to-mint-an-nft/index.md b/public/content/translations/bn/developers/tutorials/how-to-mint-an-nft/index.md new file mode 100644 index 00000000000..ddf3326fa85 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/how-to-mint-an-nft/index.md @@ -0,0 +1,335 @@ +--- +title: "কীভাবে একটি NFT মিন্ট করবেন (NFT টিউটোরিয়াল সিরিজের পার্ট 2/3)" +description: "এই টিউটোরিয়ালে আমাদের স্মার্ট কন্ট্র্যাক্ট এবং Web3 ব্যবহার করে Ethereum ব্লকচেইনে কীভাবে একটি NFT মিন্ট করতে হয় তা বর্ণনা করা হয়েছে।" +author: "Sumi Mudgil" +tags: + [ + "ERC-721", + "alchemy", + "সলিডিটি", + "স্মার্ট কন্ট্র্যাক্ট" + ] +skill: beginner +lang: bn +published: 2021-04-22 +--- + +[Beeple](https://www.nytimes.com/2021/03/11/arts/design/nft-auction-christies-beeple.html): $69 মিলিয়ন +[3LAU](https://www.forbes.com/sites/abrambrown/2021/03/03/3lau-nft-nonfungible-tokens-justin-blau/?sh=5f72ef64643b): $11 মিলিয়ন +[Grimes](https://www.theguardian.com/music/2021/mar/02/grimes-sells-digital-art-collection-non-fungible-tokens): $6 মিলিয়ন + +তারা সবাই Alchemy-এর শক্তিশালী API ব্যবহার করে তাদের NFT মিন্ট করেছে। এই টিউটোরিয়ালে, আমরা আপনাকে \<10 মিনিটের মধ্যে একই কাজটি কীভাবে করতে হয় তা শেখাব। + +“একটি NFT মিন্ট করা” হল ব্লকচেইনে আপনার ERC-721 টোকেনের একটি অনন্য ইনস্ট্যান্স প্রকাশ করার কাজ। [এই NFT টিউটোরিয়াল সিরিজের পার্ট 1](/developers/tutorials/how-to-write-and-deploy-an-nft/) থেকে আমাদের স্মার্ট কন্ট্র্যাক্ট ব্যবহার করে, আসুন আমাদের Web3 দক্ষতা দিয়ে একটি NFT মিন্ট করি। এই টিউটোরিয়াল শেষে, আপনি আপনার মন (এবং ওয়ালেট) যতগুলো চায় ততগুলো NFT মিন্ট করতে পারবেন! + +চলুন শুরু করা যাক! + +## ধাপ 1: Web3 ইনস্টল করুন {#install-web3} + +আপনি যদি আপনার NFT স্মার্ট কন্ট্র্যাক্ট তৈরির প্রথম টিউটোরিয়ালটি অনুসরণ করে থাকেন, তাহলে আপনার ইতিমধ্যেই Ethers.js ব্যবহারের অভিজ্ঞতা আছে। Web3 হল Ethers-এর মতোই, কারণ এটি একটি লাইব্রেরি যা Ethereum ব্লকচেইনে রিকোয়েস্ট তৈরি করা সহজ করতে ব্যবহৃত হয়। এই টিউটোরিয়ালে আমরা [Alchemy Web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3) ব্যবহার করব, যা একটি উন্নত Web3 লাইব্রেরি যা অটোম্যাটিক পুনরায় চেষ্টা এবং শক্তিশালী WebSocket সাপোর্ট প্রদান করে। + +আপনার প্রজেক্টের হোম ডিরেক্টরিতে রান করুন: + +``` +npm install @alch/alchemy-web3 +``` + +## ধাপ 2: একটি `mint-nft.js` ফাইল তৈরি করুন {#create-mintnftjs} + +আপনার স্ক্রিপ্ট ডিরেক্টরির ভিতরে, একটি `mint-nft.js` ফাইল তৈরি করুন এবং কোডের নিম্নলিখিত লাইনগুলি যোগ করুন: + +```js +require("dotenv").config() +const API_URL = process.env.API_URL +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(API_URL) +``` + +## ধাপ 3: আপনার কন্ট্র্যাক্টের ABI নিন {#contract-abi} + +আমাদের কন্ট্র্যাক্টের ABI (অ্যাপ্লিকেশন বাইনারি ইন্টারফেস) হল আমাদের স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার ইন্টারফেস। আপনি [এখানে](https://docs.alchemyapi.io/alchemy/guides/eth_getlogs#what-are-ab-is) কন্ট্র্যাক্ট ABI সম্পর্কে আরও জানতে পারেন। Hardhat স্বয়ংক্রিয়ভাবে আমাদের জন্য একটি ABI তৈরি করে এবং `MyNFT.json` ফাইলে সেভ করে। এটি ব্যবহার করার জন্য আমাদের `mint-nft.js` ফাইলে নিম্নলিখিত কোডের লাইনগুলি যোগ করে বিষয়বস্তু পার্স করতে হবে: + +```js +const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") +``` + +আপনি যদি ABI দেখতে চান তবে আপনি এটি আপনার কনসোলে প্রিন্ট করতে পারেন: + +```js +console.log(JSON.stringify(contract.abi)) +``` + +`mint-nft.js` রান করতে এবং আপনার ABI কনসোলে প্রিন্ট করা দেখতে, আপনার টার্মিনালে নেভিগেট করুন এবং রান করুন: + +```js +node scripts/mint-nft.js +``` + +## ধাপ 4: IPFS ব্যবহার করে আপনার NFT-এর জন্য মেটাডেটা কনফিগার করুন {#config-meta} + +আপনার যদি পার্ট 1-এ আমাদের টিউটোরিয়াল থেকে মনে থাকে, আমাদের `mintNFT` স্মার্ট কন্ট্র্যাক্ট ফাংশন একটি tokenURI প্যারামিটার নেয় যা NFT-এর মেটাডেটা বর্ণনাকারী একটি JSON ডকুমেন্টে রিসলভ হওয়া উচিত — যা সত্যিই NFT-কে জীবন্ত করে তোলে, এটিকে কনফিগারযোগ্য বৈশিষ্ট্য, যেমন নাম, বর্ণনা, ছবি এবং অন্যান্য অ্যাট্রিবিউট পেতে দেয়। + +> _ইন্টারপ্ল্যানেটারি ফাইল সিস্টেম (IPFS) হল একটি ডিস্ট্রিবিউটেড ফাইল সিস্টেমে ডেটা সংরক্ষণ এবং শেয়ার করার জন্য একটি ডিসেন্ট্রালাইজড প্রোটোকল এবং পিয়ার-টু-পিয়ার নেটওয়ার্ক।_ + +আমরা Pinata ব্যবহার করব, একটি সুবিধাজনক IPFS API এবং টুলকিট, আমাদের NFT অ্যাসেট এবং মেটাডেটা সংরক্ষণ করার জন্য যাতে আমাদের NFT সত্যিই ডিসেন্ট্রালাইজড হয়। আপনার যদি Pinata অ্যাকাউন্ট না থাকে, তাহলে [এখানে](https://app.pinata.cloud) একটি বিনামূল্যের অ্যাকাউন্টের জন্য সাইন আপ করুন এবং আপনার ইমেল যাচাই করার পদক্ষেপগুলি সম্পূর্ণ করুন। + +আপনি একটি অ্যাকাউন্ট তৈরি করার পরে: + +- “Files” পেজে নেভিগেট করুন এবং পেজের উপরের বাম দিকে নীল "Upload" বোতামে ক্লিক করুন। + +- Pinata-তে একটি ছবি আপলোড করুন — এটি আপনার NFT-এর জন্য ছবির অ্যাসেট হবে। আপনার ইচ্ছামত অ্যাসেটের নাম দিন + +- আপলোড করার পরে, আপনি "Files" পেজের টেবিলে ফাইলের তথ্য দেখতে পাবেন। আপনি একটি CID কলামও দেখতে পাবেন। আপনি এটির পাশের কপি বোতামে ক্লিক করে CID কপি করতে পারেন। আপনি আপনার আপলোড দেখতে পারেন এখানে: `https://gateway.pinata.cloud/ipfs/`। উদাহরণস্বরূপ, আমরা IPFS-এ যে ছবিটি ব্যবহার করেছি তা [এখানে](https://gateway.pinata.cloud/ipfs/QmZdd5KYdCFApWn7eTZJ1qgJu18urJrP9Yh1TZcZrZxxB5) পেতে পারেন। + +যারা দেখে শিখতে বেশি পছন্দ করে, তাদের জন্য উপরের পদক্ষেপগুলি এখানে সংক্ষিপ্ত করা হয়েছে: + +![কীভাবে Pinata-তে আপনার ছবি আপলোড করবেন](./instructionsPinata.gif) + +এখন, আমরা Pinata-তে আরও একটি ডকুমেন্ট আপলোড করতে চাই। কিন্তু তা করার আগে, আমাদের এটি তৈরি করতে হবে! + +আপনার রুট ডিরেক্টরিতে, `nft-metadata.json` নামে একটি নতুন ফাইল তৈরি করুন এবং নিম্নলিখিত json কোড যোগ করুন: + +```json +{ + "attributes": [ + { + "trait_type": "Breed", + "value": "Maltipoo" + }, + { + "trait_type": "Eye color", + "value": "Mocha" + } + ], + "description": "বিশ্বের সবচেয়ে আদুরে এবং সংবেদনশীল কুকুরছানা।", + "image": "ipfs://QmWmvTJmJU3pozR9ZHFmQC2DNDwi2XJtf3QGyYiiagFSWb", + "name": "Ramses" +} +``` + +json-এর ডেটা পরিবর্তন করতে দ্বিধা করবেন না। আপনি অ্যাট্রিবিউট বিভাগ থেকে সরাতে বা যোগ করতে পারেন। সবচেয়ে গুরুত্বপূর্ণ, নিশ্চিত করুন যে ইমেজ ফিল্ডটি আপনার IPFS ছবির লোকেশনে পয়েন্ট করে — অন্যথায়, আপনার NFT-তে একটি (খুব সুন্দর!) কুকুরের ছবি থাকবে। + +JSON ফাইলটি এডিট করা হয়ে গেলে, এটি সেভ করুন এবং ছবিটি আপলোড করার জন্য আমরা যে পদক্ষেপগুলি অনুসরণ করেছিলাম সেগুলি অনুসরণ করে Pinata-তে আপলোড করুন। + +![কীভাবে আপনার nft-metadata.json Pinata-তে আপলোড করবেন](./uploadPinata.gif) + +## ধাপ 5: আপনার কন্ট্র্যাক্টের একটি ইনস্ট্যান্স তৈরি করুন {#instance-contract} + +এখন, আমাদের কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করার জন্য, আমাদের কোডে এটির একটি ইনস্ট্যান্স তৈরি করতে হবে। এটি করার জন্য আমাদের কন্ট্র্যাক্ট অ্যাড্রেসের প্রয়োজন হবে যা আমরা ডিপ্লয়মেন্ট থেকে অথবা [Blockscout](https://eth-sepolia.blockscout.com/) থেকে কন্ট্র্যাক্ট ডিপ্লয় করতে ব্যবহৃত অ্যাড্রেসটি খুঁজে পেতে পারি। + +![Etherscan-এ আপনার কন্ট্র্যাক্ট অ্যাড্রেস দেখুন](./view-contract-etherscan.png) + +উপরের উদাহরণে, আমাদের কন্ট্র্যাক্ট অ্যাড্রেস হল 0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778। + +এরপরে আমরা ABI এবং অ্যাড্রেস ব্যবহার করে আমাদের কন্ট্র্যাক্ট তৈরি করতে Web3 [কন্ট্র্যাক্ট মেথড](https://docs.web3js.org/api/web3-eth-contract/class/Contract) ব্যবহার করব। আপনার `mint-nft.js` ফাইলে, নিম্নলিখিতগুলি যোগ করুন: + +```js +const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" + +const nftContract = new web3.eth.Contract(contract.abi, contractAddress) +``` + +## ধাপ 6: `.env` ফাইলটি আপডেট করুন {#update-env} + +এখন, Ethereum চেইনে ট্রানজ্যাকশন তৈরি এবং পাঠানোর জন্য, আমরা অ্যাকাউন্ট নন্স (নিচে ব্যাখ্যা করা হবে) পেতে আপনার পাবলিক Ethereum অ্যাকাউন্ট অ্যাড্রেস ব্যবহার করব। + +আপনার পাবলিক কী আপনার `.env` ফাইলে যোগ করুন — আপনি যদি টিউটোরিয়ালের পার্ট 1 সম্পন্ন করে থাকেন, তাহলে আমাদের `.env` ফাইলটি এখন এইরকম দেখতে হবে: + +```js +API_URL = "https://eth-sepolia.g.alchemy.com/v2/আপনার-এপিআই-কী" +PRIVATE_KEY = "আপনার-প্রাইভেট-অ্যাকাউন্ট-অ্যাড্রেস" +PUBLIC_KEY = "আপনার-পাবলিক-অ্যাকাউন্ট-অ্যাড্রেস" +``` + +## ধাপ 7: আপনার ট্রানজ্যাকশন তৈরি করুন {#create-txn} + +প্রথমে, আসুন `mintNFT(tokenData)` নামে একটি ফাংশন সংজ্ঞায়িত করি এবং নিম্নলিখিতগুলি করে আমাদের ট্রানজ্যাকশন তৈরি করি: + +1. `.env` ফাইল থেকে আপনার _PRIVATE_KEY_ এবং _PUBLIC_KEY_ নিন। + +2. এরপরে, আমাদের অ্যাকাউন্ট নন্স বের করতে হবে। নন্স স্পেসিফিকেশনটি আপনার অ্যাড্রেস থেকে পাঠানো ট্রানজ্যাকশনের সংখ্যা ট্র্যাক করতে ব্যবহৃত হয় — যা আমাদের নিরাপত্তার উদ্দেশ্যে এবং [রিপ্লে অ্যাটাক](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce) প্রতিরোধ করার জন্য প্রয়োজন। আপনার অ্যাড্রেস থেকে পাঠানো ট্রানজ্যাকশনের সংখ্যা পেতে, আমরা [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount) ব্যবহার করি। + +3. অবশেষে আমরা নিম্নলিখিত তথ্য দিয়ে আমাদের ট্রানজ্যাকশন সেট আপ করব: + +- `'from': PUBLIC_KEY` — আমাদের ট্রানজ্যাকশনের উৎস হল আমাদের পাবলিক অ্যাড্রেস + +- `'to': contractAddress` — যে কন্ট্র্যাক্টের সাথে আমরা ইন্টারঅ্যাক্ট করতে এবং ট্রানজ্যাকশন পাঠাতে চাই + +- `'nonce': nonce` — আমাদের অ্যাড্রেস থেকে পাঠানো ট্রানজ্যাকশনের সংখ্যা সহ অ্যাকাউন্ট নন্স + +- `'gas': estimatedGas` — ট্রানজ্যাকশনটি সম্পূর্ণ করার জন্য প্রয়োজনীয় আনুমানিক গ্যাস + +- `'data': nftContract.methods.mintNFT(PUBLIC_KEY, md).encodeABI()` — এই ট্রানজ্যাকশনে আমরা যে গণনাটি করতে চাই — যা এই ক্ষেত্রে একটি NFT মিন্ট করা + +আপনার `mint-nft.js` ফাইলটি এখন এইরকম দেখতে হবে: + +```js + require('dotenv').config(); + const API_URL = process.env.API_URL; + const PUBLIC_KEY = process.env.PUBLIC_KEY; + const PRIVATE_KEY = process.env.PRIVATE_KEY; + + const { createAlchemyWeb3 } = require("@alch/alchemy-web3"); + const web3 = createAlchemyWeb3(API_URL); + + const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json"); + const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778"; + const nftContract = new web3.eth.Contract(contract.abi, contractAddress); + + async function mintNFT(tokenURI) { + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, 'latest'); //সর্বশেষ নন্স পান + + //ট্রানজ্যাকশন + const tx = { + 'from': PUBLIC_KEY, + 'to': contractAddress, + 'nonce': nonce, + 'gas': 500000, + 'data': nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI() + }; + }​ +``` + +## ধাপ 8: ট্রানজ্যাকশন সাইন করুন {#sign-txn} + +এখন যেহেতু আমরা আমাদের ট্রানজ্যাকশন তৈরি করেছি, আমাদের এটি পাঠানোর জন্য সাইন করতে হবে। এখানে আমরা আমাদের প্রাইভেট কী ব্যবহার করব। + +`web3.eth.sendSignedTransaction` আমাদের ট্রানজ্যাকশন হ্যাস দেবে, যা আমরা আমাদের ট্রানজ্যাকশনটি মাইনিং হয়েছে এবং নেটওয়ার্ক দ্বারা ড্রপ করা হয়নি তা নিশ্চিত করতে ব্যবহার করতে পারি। আপনি লক্ষ্য করবেন ট্রানজ্যাকশন সাইনিং বিভাগে, আমরা কিছু এরর চেকিং যোগ করেছি যাতে আমরা জানতে পারি আমাদের ট্রানজ্যাকশনটি সফলভাবে হয়েছে কিনা। + +```js +require("dotenv").config() +const API_URL = process.env.API_URL +const PUBLIC_KEY = process.env.PUBLIC_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY + +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(API_URL) + +const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") +const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" +const nftContract = new web3.eth.Contract(contract.abi, contractAddress) + +async function mintNFT(tokenURI) { + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //সর্বশেষ নন্স পান + + //ট্রানজ্যাকশন + const tx = { + from: PUBLIC_KEY, + to: contractAddress, + nonce: nonce, + gas: 500000, + data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(), + } + + const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY) + signPromise + .then((signedTx) => { + web3.eth.sendSignedTransaction( + signedTx.rawTransaction, + function (err, hash) { + if (!err) { + console.log( + "আপনার ট্রানজ্যাকশনের হ্যাস হল: ", + hash, + "\nআপনার ট্রানজ্যাকশনের স্ট্যাটাস দেখতে Alchemy-র মেমপুল দেখুন!" + ) + } else { + console.log( + "আপনার ট্রানজ্যাকশন জমা দেওয়ার সময় কিছু ভুল হয়েছে:", + err + ) + } + } + ) + }) + .catch((err) => { + console.log(" Promise ব্যর্থ হয়েছে:", err) + }) +} +``` + +## ধাপ 9: `mintNFT` কল করুন এবং node `mint-nft.js` রান করুন {#call-mintnft-fn} + +Pinata-তে আপলোড করা `metadata.json`-এর কথা মনে আছে? Pinata থেকে এর হ্যাসকোড নিন এবং `mintNFT` ফাংশনে নিম্নলিখিতটি প্যারামিটার হিসাবে পাস করুন `https://gateway.pinata.cloud/ipfs/` + +হ্যাসকোড কীভাবে পাবেন তা এখানে দেওয়া হল: + +![Pinata-তে আপনার এনএফটি মেটাডেটা হ্যাসকোড কীভাবে পাবেন](./metadataPinata.gif)_Pinata-তে আপনার এনএফটি মেটাডেটা হ্যাসকোড কীভাবে পাবেন_ + +> আলাদা উইন্ডোতে `https://gateway.pinata.cloud/ipfs/` লোড করে ডাবল-চেক করুন যে আপনার কপি করা হ্যাসকোডটি আপনার **metadata.json**-এর সাথে লিঙ্ক করে। পেজটি নিচের স্ক্রিনশটের মতো দেখতে হবে: + +![আপনার পেজে json মেটাডেটা প্রদর্শন করা উচিত](./metadataJSON.png)_আপনার পেজে json মেটাডেটা প্রদর্শন করা উচিত_ + +সব মিলিয়ে, আপনার কোডটি এইরকম দেখতে হবে: + +```js +require("dotenv").config() +const API_URL = process.env.API_URL +const PUBLIC_KEY = process.env.PUBLIC_KEY +const PRIVATE_KEY = process.env.PRIVATE_KEY + +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(API_URL) + +const contract = require("../artifacts/contracts/MyNFT.sol/MyNFT.json") +const contractAddress = "0x5a738a5c5fe46a1fd5ee7dd7e38f722e2aef7778" +const nftContract = new web3.eth.Contract(contract.abi, contractAddress) + +async function mintNFT(tokenURI) { + const nonce = await web3.eth.getTransactionCount(PUBLIC_KEY, "latest") //সর্বশেষ নন্স পান + + //ট্রানজ্যাকশন + const tx = { + from: PUBLIC_KEY, + to: contractAddress, + nonce: nonce, + gas: 500000, + data: nftContract.methods.mintNFT(PUBLIC_KEY, tokenURI).encodeABI(), + } + + const signPromise = web3.eth.accounts.signTransaction(tx, PRIVATE_KEY) + signPromise + .then((signedTx) => { + web3.eth.sendSignedTransaction( + signedTx.rawTransaction, + function (err, hash) { + if (!err) { + console.log( + "আপনার ট্রানজ্যাকশনের হ্যাস হল: ", + hash, + "\nআপনার ট্রানজ্যাকশনের স্ট্যাটাস দেখতে Alchemy-র মেমপুল দেখুন!" + ) + } else { + console.log( + "আপনার ট্রানজ্যাকশন জমা দেওয়ার সময় কিছু ভুল হয়েছে:", + err + ) + } + } + ) + }) + .catch((err) => { + console.log("Promise ব্যর্থ হয়েছে:", err) + }) +} + +mintNFT("ipfs://QmYueiuRNmL4MiA2GwtVMm6ZagknXnSpQnB3z2gWbz36hP") +``` + +এখন, আপনার NFT ডিপ্লয় করতে `node scripts/mint-nft.js` রান করুন। কয়েক সেকেন্ড পরে, আপনার টার্মিনালে এইরকম একটি প্রতিক্রিয়া দেখতে পাওয়া উচিত: + + ``` + আপনার ট্রানজ্যাকশনের হ্যাস হল: 0x301791fdf492001fcd9d5e5b12f3aa1bbbea9a88ed24993a8ab2cdae2d06e1e8 + + আপনার ট্রানজ্যাকশনের স্থিতি দেখতে Alchemy-র মেমপুল দেখুন! + ``` + +এরপরে, আপনার ট্রানজ্যাকশনের স্থিতি দেখতে (এটি পেন্ডিং, মাইনিং করা বা নেটওয়ার্ক দ্বারা ড্রপ করা হয়েছে কিনা) আপনার [Alchemy mempool](https://dashboard.alchemyapi.io/mempool) ভিজিট করুন। যদি আপনার ট্রানজ্যাকশনটি ড্রপ হয়ে যায়, তবে [Blockscout](https://eth-sepolia.blockscout.com/) চেক করা এবং আপনার ট্রানজ্যাকশন হ্যাস অনুসন্ধান করাও সহায়ক। + +![Etherscan-এ আপনার NFT ট্রানজ্যাকশন হ্যাস দেখুন](./view-nft-etherscan.png)_Etherscan-এ আপনার NFT ট্রানজ্যাকশন হ্যাস দেখুন_ + +এবং এটাই সব! আপনি এখন Ethereum ব্লকচেইনে একটি NFT ডিপ্লয় এবং মিন্ট করেছেন + +`mint-nft.js` ব্যবহার করে আপনি আপনার মন (এবং ওয়ালেট) যতগুলো চায় ততগুলো NFT মিন্ট করতে পারবেন! শুধু NFT-এর মেটাডেটা বর্ণনাকারী একটি নতুন tokenURI পাস করতে ভুলবেন না (অন্যথায়, আপনি কেবল বিভিন্ন ID সহ একগুচ্ছ অভিন্ন NFT তৈরি করবেন)। + +সম্ভবত, আপনি আপনার ওয়ালেটে আপনার NFT দেখাতে সক্ষম হতে চাইবেন — তাই [পার্ট 3: আপনার ওয়ালেটে আপনার NFT কীভাবে দেখবেন](/developers/tutorials/how-to-view-nft-in-metamask/) দেখতে ভুলবেন না! diff --git a/public/content/translations/bn/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md b/public/content/translations/bn/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md new file mode 100644 index 00000000000..dd7053184b0 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/how-to-mock-solidity-contracts-for-testing/index.md @@ -0,0 +1,102 @@ +--- +title: "পরীক্ষার জন্য সলিডিটি স্মার্ট কন্ট্র্যাক্টগুলিকে কীভাবে মক করা যায়" +description: "পরীক্ষার সময় আপনার কন্ট্র্যাক্টগুলো নিয়ে কেন মজা করা উচিত" +author: Markus Waas +lang: bn +tags: [ "সলিডিটি", "স্মার্ট কন্ট্র্যাক্ট", "পরীক্ষা", "মকিং" ] +skill: intermediate +published: 2020-05-02 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/mocking-contracts +--- + +[মক অবজেক্ট](https://wikipedia.org/wiki/Mock_object) অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং-এর একটি সাধারণ ডিজাইন প্যাটার্ন। পুরাতন ফরাসি শব্দ 'mocquer' থেকে এসেছে যার অর্থ 'মজা করা', এটি 'বাস্তব কিছু অনুকরণ করা'-তে বিকশিত হয়েছে যা আমরা আসলে প্রোগ্রামিংয়ে করে থাকি। অনুগ্রহ করে শুধুমাত্র আপনার স্মার্ট কন্ট্র্যাক্টগুলো নিয়ে মজা করুন যদি আপনি চান, কিন্তু যখনই পারেন সেগুলোকে মক করুন। এটি আপনার জীবনকে সহজ করে তোলে। + +## মকস দিয়ে কন্ট্র্যাক্টের ইউনিট-টেস্টিং {#unit-testing-contracts-with-mocks} + +একটি কন্ট্র্যাক্ট মক করার অর্থ হল সেই কন্ট্র্যাক্টের একটি দ্বিতীয় সংস্করণ তৈরি করা যা মূলটির মতোই আচরণ করে, কিন্তু এমনভাবে যা ডেভেলপার দ্বারা সহজেই নিয়ন্ত্রণ করা যায়। আপনি প্রায়শই জটিল কন্ট্র্যাক্টের সম্মুখীন হন যেখানে আপনি কেবল [কন্ট্র্যাক্টের ছোট অংশ ইউনিট-টেস্ট](/developers/docs/smart-contracts/testing/) করতে চান। সমস্যা হল, যদি এই ছোট অংশটি পরীক্ষা করার জন্য একটি খুব নির্দিষ্ট কন্ট্র্যাক্ট স্টেটের প্রয়োজন হয় যেখানে পৌঁছানো কঠিন? + +আপনি প্রতিবার জটিল টেস্ট সেটআপ লজিক লিখতে পারেন যা কন্ট্র্যাক্টটিকে প্রয়োজনীয় স্টেটে নিয়ে আসে অথবা আপনি একটি মক লিখুন। ইনহেরিটেন্সের মাধ্যমে একটি কন্ট্র্যাক্ট মক করা সহজ। কেবলমাত্র একটি দ্বিতীয় মক কন্ট্র্যাক্ট তৈরি করুন যা মূলটি থেকে ইনহেরিট করে। এখন আপনি আপনার মকের ফাংশনগুলি ওভাররাইড করতে পারেন। আসুন একটি উদাহরণ দিয়ে এটি দেখি। + +## উদাহরণ: প্রাইভেট ERC20 {#example-private-erc20} + +আমরা একটি উদাহরণ ERC-20 কন্ট্র্যাক্ট ব্যবহার করি যার একটি প্রাথমিক প্রাইভেট সময় রয়েছে। মালিক ব্যক্তিগত ব্যবহারকারীদের পরিচালনা করতে পারেন এবং শুধুমাত্র তাদেরকেই শুরুতে টোকেন গ্রহণ করার অনুমতি দেওয়া হবে। একটি নির্দিষ্ট সময় অতিবাহিত হয়ে গেলে, প্রত্যেককে টোকেন ব্যবহার করার অনুমতি দেওয়া হবে। আপনি যদি কৌতূহলী হন, আমরা নতুন OpenZeppelin contracts v3 থেকে [`_beforeTokenTransfer`](https://docs.openzeppelin.com/contracts/5.x/extending-contracts#using-hooks) হুক ব্যবহার করছি। + +```solidity +pragma solidity ^0.6.0; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract PrivateERC20 is ERC20, Ownable { + mapping (address => bool) public isPrivateUser; + uint256 private publicAfterTime; + + constructor(uint256 privateERC20timeInSec) ERC20("PrivateERC20", "PRIV") public { + publicAfterTime = now + privateERC20timeInSec; + } + + function addUser(address user) external onlyOwner { + isPrivateUser[user] = true; + } + + function isPublic() public view returns (bool) { + return now >= publicAfterTime; + } + + function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { + super._beforeTokenTransfer(from, to, amount); + + require(_validRecipient(to), "PrivateERC20: অবৈধ প্রাপক"); + } + + function _validRecipient(address to) private view returns (bool) { + if (isPublic()) { + return true; + } + + return isPrivateUser[to]; + } +} +``` + +এবং এখন আসুন এটি মক করি। + +```solidity +pragma solidity ^0.6.0; +import "../PrivateERC20.sol"; + +contract PrivateERC20Mock is PrivateERC20 { + bool isPublicConfig; + + constructor() public PrivateERC20(0) {} + + function setIsPublic(bool isPublic) external { + isPublicConfig = isPublic; + } + + function isPublic() public view returns (bool) { + return isPublicConfig; + } +} +``` + +আপনি নিম্নলিখিত ত্রুটি বার্তাগুলির মধ্যে একটি পাবেন: + +- `PrivateERC20Mock.sol: TypeError: Overriding function is missing "override" specifier.` +- `PrivateERC20.sol: TypeError: Trying to override non-virtual function. Did you forget to add "virtual"?.` + +যেহেতু আমরা নতুন 0.6 সলিডিটি সংস্করণ ব্যবহার করছি, তাই যে ফাংশনগুলি ওভাররাইড করা যেতে পারে তার জন্য আমাদের `virtual` কীওয়ার্ড এবং ওভাররাইডিং ফাংশনের জন্য override যোগ করতে হবে। সুতরাং আসুন আমরা উভয় `isPublic` ফাংশনে সেগুলি যোগ করি। + +এখন আপনার ইউনিট টেস্টে, আপনি পরিবর্তে `PrivateERC20Mock` ব্যবহার করতে পারেন। আপনি যখন প্রাইভেট ব্যবহারের সময় আচরণ পরীক্ষা করতে চান, তখন `setIsPublic(false)` ব্যবহার করুন এবং একইভাবে পাবলিক ব্যবহারের সময় পরীক্ষা করার জন্য `setIsPublic(true)` ব্যবহার করুন। অবশ্যই আমাদের উদাহরণে, আমরা সময় অনুযায়ী পরিবর্তন করার জন্য [টাইম হেল্পার](https://docs.openzeppelin.com/test-helpers/0.5/api#increase) ব্যবহার করতে পারতাম। কিন্তু মকিং-এর ধারণা এখন স্পষ্ট হওয়া উচিত এবং আপনি এমন পরিস্থিতি কল্পনা করতে পারেন যেখানে সময় এগিয়ে দেওয়াটা এত সহজ নয়। + +## অনেক কন্ট্র্যাক্ট মক করা {#mocking-many-contracts} + +প্রতিটি মকের জন্য যদি আপনাকে আরেকটি কন্ট্র্যাক্ট তৈরি করতে হয় তবে এটি অগোছালো হয়ে যেতে পারে। যদি এটি আপনাকে বিরক্ত করে, আপনি [MockContract](https://github.com/gnosis/mock-contract) লাইব্রেরিটি দেখতে পারেন। এটি আপনাকে তৎক্ষণাৎ কন্ট্র্যাক্টগুলির আচরণ ওভাররাইড এবং পরিবর্তন করতে দেয়। তবে, এটি কেবল অন্য একটি কন্ট্র্যাক্টে কল মক করার জন্য কাজ করে, তাই এটি আমাদের উদাহরণের জন্য কাজ করবে না। + +## মকিং আরও শক্তিশালী হতে পারে {#mocking-can-be-even-more-powerful} + +মকিংয়ের ক্ষমতা এখানেই শেষ নয়। + +- ফাংশন যোগ করা: কেবল একটি নির্দিষ্ট ফাংশন ওভাররাইড করাই কার্যকর নয়, অতিরিক্ত ফাংশন যোগ করাও কার্যকর। টোকেনের জন্য একটি ভাল উদাহরণ হল একটি অতিরিক্ত `mint` ফাংশন থাকা যা যেকোনো ব্যবহারকারীকে বিনামূল্যে নতুন টোকেন পেতে দেয়। +- টেস্টনেটে ব্যবহার: যখন আপনি আপনার ডিএ্যাপ-এর সাথে টেস্টনেটে আপনার কন্ট্র্যাক্টগুলি স্থাপন এবং পরীক্ষা করেন, তখন একটি মকড সংস্করণ ব্যবহার করার কথা বিবেচনা করুন। ফাংশন ওভাররাইড করা এড়িয়ে চলুন যদি না আপনার সত্যিই প্রয়োজন হয়। আপনি সর্বোপরি আসল লজিক পরীক্ষা করতে চান। কিন্তু উদাহরণস্বরূপ একটি রিসেট ফাংশন যোগ করা কার্যকর হতে পারে যা কেবল কন্ট্র্যাক্টের স্টেটকে শুরুতে রিসেট করে, কোনো নতুন স্থাপনার প্রয়োজন নেই। স্পষ্টতই আপনি এটি একটি মেইননেট কন্ট্র্যাক্টে রাখতে চাইবেন না। diff --git a/public/content/translations/bn/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md b/public/content/translations/bn/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md new file mode 100644 index 00000000000..911b0c274aa --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/how-to-use-echidna-to-test-smart-contracts/index.md @@ -0,0 +1,708 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করার জন্য Echidna কীভাবে ব্যবহার করবেন" +description: "স্বয়ংক্রিয়ভাবে স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করার জন্য Echidna কীভাবে ব্যবহার করবেন" +author: "Trailofbits" +lang: bn +tags: + [ + "সলিডিটি", + "স্মার্ট কন্ট্র্যাক্ট", + "নিরাপত্তা", + "পরীক্ষা", + "ফাজিং" + ] +skill: advanced +published: 2020-04-10 +source: Building secure contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/echidna +--- + +## ইনস্টলেশন {#installation} + +ডকারের মাধ্যমে অথবা প্রি-কম্পাইলড বাইনারি ব্যবহার করে Echidna ইনস্টল করা যেতে পারে। + +### ডকারের মাধ্যমে Echidna {#echidna-through-docker} + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox +``` + +_শেষ কমান্ডটি একটি docker-এ eth-security-toolbox চালায় যেটির আপনার বর্তমান ডিরেক্টরিতে অ্যাক্সেস আছে। আপনি আপনার হোস্ট থেকে ফাইলগুলো পরিবর্তন করতে পারেন, এবং docker থেকে ফাইলগুলোতে টুলস চালাতে পারেন_ + +ডকারের ভিতরে, চালান: + +```bash +solc-select 0.5.11 +cd /home/training +``` + +### বাইনারি {#binary} + +[https://github.com/crytic/echidna/releases/tag/v1.4.0.0](https://github.com/crytic/echidna/releases/tag/v1.4.0.0) + +## প্রপার্টি-ভিত্তিক ফাজিং এর ভূমিকা {#introduction-to-property-based-fuzzing} + +Echidna হলো একটি প্রপার্টি-ভিত্তিক ফাজার, যা আমরা আমাদের আগের ব্লগপোস্টগুলোতে বর্ণনা করেছি ([1](https://blog.trailofbits.com/2018/03/09/echidna-a-smart-fuzzer-for-ethereum/), [2](https://blog.trailofbits.com/2018/05/03/state-machine-testing-with-echidna/), [3](https://blog.trailofbits.com/2020/03/30/an-echidna-for-all-seasons/)). + +### ফাজিং {#fuzzing} + +[ফাজিং](https://wikipedia.org/wiki/Fuzzing) নিরাপত্তা কমিউনিটিতে একটি সুপরিচিত কৌশল। এটিতে প্রোগ্রামের মধ্যে বাগ খুঁজে বের করার জন্য কম-বেশি র‍্যান্ডম ইনপুট তৈরি করা হয়। প্রচলিত সফটওয়্যারের জন্য ফাজার (যেমন [AFL](http://lcamtuf.coredump.cx/afl/) বা [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)) বাগ খুঁজে বের করার জন্য দক্ষ টুলস হিসেবে পরিচিত। + +শুধুমাত্র র‍্যান্ডম ইনপুট তৈরি করার বাইরেও, ভালো ইনপুট তৈরি করার জন্য অনেক কৌশল এবং স্ট্র্যাটেজি রয়েছে, যার মধ্যে রয়েছে: + +- প্রতিটি এক্সিকিউশন থেকে ফিডব্যাক পাওয়া এবং তা ব্যবহার করে জেনারেশনকে গাইড করা। উদাহরণস্বরূপ, যদি একটি নতুন জেনারেটেড ইনপুট একটি নতুন পথ আবিষ্কার করে, তবে তার কাছাকাছি নতুন ইনপুট জেনারেট করা অর্থপূর্ণ হতে পারে। +- একটি কাঠামোগত সীমাবদ্ধতাকে সম্মান করে ইনপুট তৈরি করা। উদাহরণস্বরূপ, যদি আপনার ইনপুটে একটি চেক্সামসহ একটি হেডার থাকে, তাহলে ফাজারকে চেক্সাম ভ্যালিডেট করে এমন ইনপুট তৈরি করতে দেওয়াটা যুক্তিযুক্ত হবে। +- নতুন ইনপুট তৈরি করার জন্য পরিচিত ইনপুট ব্যবহার করা: যদি আপনার কাছে বৈধ ইনপুটের একটি বড় ডেটাসেটের অ্যাক্সেস থাকে, তাহলে আপনার ফাজার স্ক্র্যাচ থেকে জেনারেশন শুরু করার পরিবর্তে সেগুলো থেকে নতুন ইনপুট তৈরি করতে পারে। এগুলোকে সাধারণত _সিড_ বলা হয়। + +### প্রপার্টি-ভিত্তিক ফাজিং {#property-based-fuzzing} + +Echidna একটি নির্দিষ্ট ফাজার পরিবারের অন্তর্গত: এটি প্রপার্টি-ভিত্তিক ফাজিং যা [QuickCheck](https://wikipedia.org/wiki/QuickCheck) দ্বারা ব্যাপকভাবে অনুপ্রাণিত। ক্লাসিক ফাজারের বিপরীতে, যা ক্র্যাশ খুঁজে বের করার চেষ্টা করে, Echidna ব্যবহারকারী-সংজ্ঞায়িত ইনভেরিয়েন্টগুলো ভাঙার চেষ্টা করবে। + +স্মার্ট কন্ট্র্যাক্টে, ইনভেরিয়েন্টগুলো হলো সলিডিটি ফাংশন, যা কন্ট্র্যাক্ট পৌঁছাতে পারে এমন যেকোনো ভুল বা অবৈধ স্টেটকে উপস্থাপন করতে পারে, যার মধ্যে রয়েছে: + +- ভুল অ্যাক্সেস কন্ট্রোল: আক্রমণকারী কন্ট্র্যাক্টের মালিক হয়ে গিয়েছে। +- ভুল স্টেট মেশিন: কন্ট্র্যাক্ট পজ করা অবস্থায় টোকেনগুলো ট্রান্সফার করা যেতে পারে। +- ভুল অ্যারিথমেটিক: ব্যবহারকারী তার ব্যালেন্স আন্ডারফ্লো করতে পারে এবং সীমাহীন ফ্রি টোকেন পেতে পারে। + +### Echidna দিয়ে একটি প্রপার্টি পরীক্ষা করা {#testing-a-property-with-echidna} + +আমরা দেখব কীভাবে Echidna দিয়ে একটি স্মার্ট কন্ট্র্যাক্ট পরীক্ষা করা যায়। টার্গেট হলো নিম্নলিখিত স্মার্ট কন্ট্র্যাক্ট [`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol): + +```solidity +contract Token{ + mapping(address => uint) public balances; + function airdrop() public{ + balances[msg.sender] = 1000; + } + function consume() public{ + require(balances[msg.sender]>0); + balances[msg.sender] -= 1; + } + function backdoor() public{ + balances[msg.sender] += 1; + } +} +``` + +আমরা এই অনুমানটি করব যে এই টোকেনের নিম্নলিখিত বৈশিষ্ট্যগুলো অবশ্যই থাকতে হবে: + +- যেকোনো ব্যক্তির কাছে সর্বোচ্চ 1000টি টোকেন থাকতে পারে +- টোকেনটি ট্রান্সফার করা যাবে না (এটি কোনো ERC20 টোকেন নয়) + +### একটি প্রপার্টি লিখুন {#write-a-property} + +Echidna প্রপার্টিগুলো হলো সলিডিটি ফাংশন। একটি প্রপার্টিতে অবশ্যই থাকতে হবে: + +- কোনো আর্গুমেন্ট থাকবে না +- সফল হলে `true` রিটার্ন করবে +- এর নাম `echidna` দিয়ে শুরু হতে হবে + +Echidna করবে: + +- প্রপার্টি পরীক্ষা করার জন্য স্বয়ংক্রিয়ভাবে আর্বিট্রারি ট্রানজ্যাকশন জেনারেট করবে। +- কোনো প্রপার্টি `false` রিটার্ন করলে বা কোনো এরর থ্রো করলে সেই ট্রানজ্যাকশনগুলো রিপোর্ট করবে। +- একটি প্রপার্টি কল করার সময় সাইড-ইফেক্ট বাতিল করবে (অর্থাৎ, যদি প্রপার্টি কোনো স্টেট ভ্যারিয়েবল পরিবর্তন করে, পরীক্ষার পরে তা বাতিল করা হয়) + +নিম্নলিখিত প্রপার্টিটি পরীক্ষা করে যে কলারের কাছে 1000টির বেশি টোকেন নেই: + +```solidity +function echidna_balance_under_1000() public view returns(bool){ + return balances[msg.sender] <= 1000; +} +``` + +আপনার কন্ট্র্যাক্টকে আপনার প্রপার্টি থেকে আলাদা করতে ইনহেরিটেন্স ব্যবহার করুন: + +```solidity +contract TestToken is Token{ + function echidna_balance_under_1000() public view returns(bool){ + return balances[msg.sender] <= 1000; + } + } +``` + +[`token.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/token.sol) প্রপার্টিটি প্রয়োগ করে এবং টোকেন থেকে ইনহেরিট করে। + +### একটি কন্ট্র্যাক্ট শুরু করুন {#initiate-a-contract} + +Echidna-এর জন্য আর্গুমেন্ট ছাড়া একটি [কন্সট্রাক্টর](/developers/docs/smart-contracts/anatomy/#constructor-functions) প্রয়োজন। যদি আপনার কন্ট্র্যাক্টের জন্য একটি নির্দিষ্ট ইনিশিয়ালাইজেশন প্রয়োজন হয়, তবে আপনাকে তা কন্সট্রাক্টরের মধ্যে করতে হবে। + +Echidna-তে কিছু নির্দিষ্ট অ্যাড্রেস রয়েছে: + +- `0x00a329c0648769A73afAc7F9381E08FB43dBEA72` যা কন্সট্রাক্টরকে কল করে। +- `0x10000`, `0x20000`, এবং `0x00a329C0648769a73afAC7F9381e08fb43DBEA70` যা র‍্যান্ডমভাবে অন্য ফাংশনগুলোকে কল করে। + +আমাদের বর্তমান উদাহরণে কোনো বিশেষ ইনিশিয়ালাইজেশনের প্রয়োজন নেই, ফলস্বরূপ আমাদের কন্সট্রাক্টরটি খালি। + +### Echidna চালান {#run-echidna} + +Echidna চালু করা হয় এভাবে: + +```bash +echidna-test contract.sol +``` + +যদি contract.sol-এ একাধিক কন্ট্র্যাক্ট থাকে, আপনি টার্গেট নির্দিষ্ট করতে পারেন: + +```bash +echidna-test contract.sol --contract MyContract +``` + +### সারসংক্ষেপ: একটি প্রপার্টি পরীক্ষা করা {#summary-testing-a-property} + +নিম্নলিখিতটি আমাদের উদাহরণের উপর echidna চালানোর সারসংক্ষেপ: + +```solidity +contract TestToken is Token{ + constructor() public {} + function echidna_balance_under_1000() public view returns(bool){ + return balances[msg.sender] <= 1000; + } + } +``` + +```bash +echidna-test testtoken.sol --contract TestToken +... + +echidna_balance_under_1000: failed!💥 + Call sequence, shrinking (1205/5000): + airdrop() + backdoor() + +... +``` + +Echidna খুঁজে পেয়েছে যে `backdoor` কল করা হলে প্রপার্টিটি লঙ্ঘিত হয়। + +## ফাজিং ক্যাম্পেইনের সময় কল করার জন্য ফাংশন ফিল্টার করা {#filtering-functions-to-call-during-a-fuzzing-campaign} + +আমরা দেখব ফাজ করা হবে এমন ফাংশনগুলো কীভাবে ফিল্টার করতে হয়। +টার্গেট হলো নিম্নলিখিত স্মার্ট কন্ট্র্যাক্ট: + +```solidity +contract C { + bool state1 = false; + bool state2 = false; + bool state3 = false; + bool state4 = false; + + function f(uint x) public { + require(x == 12); + state1 = true; + } + + function g(uint x) public { + require(state1); + require(x == 8); + state2 = true; + } + + function h(uint x) public { + require(state2); + require(x == 42); + state3 = true; + } + + function i() public { + require(state3); + state4 = true; + } + + function reset1() public { + state1 = false; + state2 = false; + state3 = false; + return; + } + + function reset2() public { + state1 = false; + state2 = false; + state3 = false; + return; + } + + function echidna_state4() public returns (bool) { + return (!state4); + } +} +``` + +এই ছোট উদাহরণটি Echidna-কে একটি স্টেট ভ্যারিয়েবল পরিবর্তন করার জন্য একটি নির্দিষ্ট ট্রানজ্যাকশন সিকোয়েন্স খুঁজে বের করতে বাধ্য করে। +এটি একটি ফাজারের জন্য কঠিন (এর জন্য [Manticore](https://github.com/trailofbits/manticore)-এর মতো একটি সিম্বলিক এক্সিকিউশন টুল ব্যবহার করার পরামর্শ দেওয়া হয়)। +এটি যাচাই করার জন্য আমরা Echidna চালাতে পারি: + +```bash +echidna-test multi.sol +... +echidna_state4: passed! 🎉 +Seed: -3684648582249875403 +``` + +### ফাংশন ফিল্টার করা {#filtering-functions} + +এই কন্ট্র্যাক্টটি পরীক্ষা করার জন্য সঠিক সিকোয়েন্স খুঁজে পেতে Echidna-এর সমস্যা হচ্ছে কারণ দুটি রিসেট ফাংশন (`reset1` এবং `reset2`) সমস্ত স্টেট ভ্যারিয়েবলকে `false`-এ সেট করে দেবে। +তবে, আমরা রিসেট ফাংশনকে ব্ল্যাকলিস্ট করতে বা শুধুমাত্র `f`, `g`, +`h` এবং `i` ফাংশনগুলোকে হোয়াইটলিস্ট করতে একটি বিশেষ Echidna ফিচার ব্যবহার করতে পারি। + +ফাংশন ব্ল্যাকলিস্ট করতে, আমরা এই কনফিগারেশন ফাইলটি ব্যবহার করতে পারি: + +```yaml +filterBlacklist: true +filterFunctions: ["reset1", "reset2"] +``` + +ফাংশন ফিল্টার করার আরেকটি উপায় হলো হোয়াইটলিস্টেড ফাংশনগুলোকে তালিকাভুক্ত করা। এটি করার জন্য, আমরা এই কনফিগারেশন ফাইলটি ব্যবহার করতে পারি: + +```yaml +filterBlacklist: false +filterFunctions: ["f", "g", "h", "i"] +``` + +- `filterBlacklist` ডিফল্টভাবে `true` থাকে। +- ফিল্টারিং শুধুমাত্র নামের উপর ভিত্তি করে করা হবে (প্যারামিটার ছাড়া)। আপনার যদি `f()` এবং `f(uint256)` থাকে, তাহলে `"f"` ফিল্টারটি উভয় ফাংশনের সাথেই মিলবে। + +### Echidna চালান {#run-echidna-1} + +`blacklist.yaml` কনফিগারেশন ফাইল দিয়ে Echidna চালাতে: + +```bash +echidna-test multi.sol --config blacklist.yaml +... +echidna_state4: failed!💥 + Call sequence: + f(12) + g(8) + h(42) + i() +``` + +Echidna প্রায় সঙ্গে সঙ্গেই প্রপার্টিটি ভুল প্রমাণ করার জন্য ট্রানজ্যাকশনের সিকোয়েন্স খুঁজে বের করবে। + +### সারসংক্ষেপ: ফাংশন ফিল্টার করা {#summary-filtering-functions} + +Echidna একটি ফাজিং ক্যাম্পেইনের সময় কল করার জন্য ফাংশনগুলোকে ব্ল্যাকলিস্ট বা হোয়াইটলিস্ট করতে পারে, এটি ব্যবহার করে: + +```yaml +filterBlacklist: true +filterFunctions: ["f1", "f2", "f3"] +``` + +```bash +echidna-test contract.sol --config config.yaml +... +``` + +`filterBlacklist` বুলিয়ানের মানের উপর ভিত্তি করে Echidna `f1`, `f2` এবং `f3` কে ব্ল্যাকলিস্ট করে বা শুধুমাত্র এগুলোকে কল করে একটি ফাজিং ক্যাম্পেইন শুরু করে। + +## Echidna দিয়ে Solidity-এর অ্যাসার্ট কীভাবে পরীক্ষা করবেন {#how-to-test-soliditys-assert-with-echidna} + +এই সংক্ষিপ্ত টিউটোরিয়ালে, আমরা দেখাব কীভাবে কন্ট্র্যাক্টে অ্যাসারশন চেকিং পরীক্ষা করতে Echidna ব্যবহার করা যায়। ধরা যাক আমাদের কাছে এইরকম একটি কন্ট্র্যাক্ট আছে: + +```solidity +contract Incrementor { + uint private counter = 2**200; + + function inc(uint val) public returns (uint){ + uint tmp = counter; + counter += val; + // tmp <= counter + return (counter - tmp); + } +} +``` + +### একটি অ্যাসারশন লিখুন {#write-an-assertion} + +আমরা নিশ্চিত করতে চাই যে `tmp` এর পার্থক্য রিটার্ন করার পরে `counter`-এর চেয়ে কম বা সমান। আমরা একটি +Echidna প্রপার্টি লিখতে পারতাম, কিন্তু আমাদের `tmp` মানটি কোথাও সংরক্ষণ করতে হবে। পরিবর্তে, আমরা এইরকম একটি অ্যাসারশন ব্যবহার করতে পারি: + +```solidity +contract Incrementor { + uint private counter = 2**200; + + function inc(uint val) public returns (uint){ + uint tmp = counter; + counter += val; + assert (tmp <= counter); + return (counter - tmp); + } +} +``` + +### Echidna চালান {#run-echidna-2} + +অ্যাসারশন ফেইলিওর টেস্টিং সক্ষম করতে, একটি [Echidna কনফিগারেশন ফাইল](https://github.com/crytic/echidna/wiki/Config) `config.yaml` তৈরি করুন: + +```yaml +checkAsserts: true +``` + +যখন আমরা Echidna-তে এই কন্ট্র্যাক্টটি চালাই, আমরা প্রত্যাশিত ফলাফল পাই: + +```bash +echidna-test assert.sol --config config.yaml +Analyzing contract: assert.sol:Incrementor +assertion in inc: failed!💥 + Call sequence, shrinking (2596/5000): + inc(21711016731996786641919559689128982722488122124807605757398297001483711807488) + inc(7237005577332262213973186563042994240829374041602535252466099000494570602496) + inc(86844066927987146567678238756515930889952488499230423029593188005934847229952) + +Seed: 1806480648350826486 +``` + +আপনি দেখতে পাচ্ছেন, Echidna `inc` ফাংশনে কিছু অ্যাসারশন ফেইলিওর রিপোর্ট করছে। প্রতিটি ফাংশনে একাধিক অ্যাসারশন যোগ করা সম্ভব, কিন্তু Echidna বলতে পারে না কোন অ্যাসারশনটি ব্যর্থ হয়েছে। + +### কখন এবং কীভাবে অ্যাসারশন ব্যবহার করবেন {#when-and-how-use-assertions} + +অ্যাসারশনগুলো সুস্পষ্ট প্রপার্টির বিকল্প হিসেবে ব্যবহার করা যেতে পারে, বিশেষ করে যদি পরীক্ষা করার শর্তগুলো কোনো `f` অপারেশনের সঠিক ব্যবহারের সাথে সরাসরি সম্পর্কিত হয়। কিছু কোডের পরে অ্যাসারশন যোগ করলে তা নিশ্চিত করবে যে এটি এক্সিকিউট হওয়ার ঠিক পরেই চেকটি ঘটবে: + +```solidity +function f(..) public { + // কিছু জটিল কোড + ... + assert (condition); + ... +} + +``` + +বিপরীতে, একটি সুস্পষ্ট echidna প্রপার্টি ব্যবহার করলে র‍্যান্ডমভাবে ট্রানজ্যাকশন এক্সিকিউট হবে এবং এটি ঠিক কখন পরীক্ষা করা হবে তা নিশ্চিত করার কোনো সহজ উপায় নেই। এই ওয়ার্কঅ্যারাউন্ডটি করা এখনও সম্ভব: + +```solidity +function echidna_assert_after_f() public returns (bool) { + f(..); + return(condition); +} +``` + +তবে, কিছু সমস্যা আছে: + +- যদি `f`-কে `internal` বা `external` হিসেবে ডিক্লেয়ার করা হয় তবে এটি ব্যর্থ হয়। +- `f`-কে কল করার জন্য কোন আর্গুমেন্ট ব্যবহার করা উচিত তা স্পষ্ট নয়। +- যদি `f` রিভার্ট করে, প্রপার্টিটি ব্যর্থ হবে। + +সাধারণভাবে, আমরা অ্যাসারশন কীভাবে ব্যবহার করতে হয় সে সম্পর্কে [জন রেগেরের সুপারিশ](https://blog.regehr.org/archives/1091) অনুসরণ করার পরামর্শ দিই: + +- অ্যাসারশন চেকিংয়ের সময় কোনো সাইড এফেক্ট জোর করে প্রয়োগ করবেন না। উদাহরণস্বরূপ: `assert(ChangeStateAndReturn() == 1)` +- স্পষ্ট স্টেটমেন্ট অ্যাসার্ট করবেন না। উদাহরণস্বরূপ, `assert(var >= 0)` যেখানে `var`-কে `uint` হিসেবে ডিক্লেয়ার করা হয়েছে। + +অবশেষে, অনুগ্রহ করে `assert`-এর পরিবর্তে `require` **ব্যবহার করবেন না**, কারণ Echidna এটি সনাক্ত করতে পারবে না (কিন্তু কন্ট্র্যাক্টটি যাইহোক রিভার্ট করবে)। + +### সারসংক্ষেপ: অ্যাসারশন চেকিং {#summary-assertion-checking} + +নিম্নলিখিতটি আমাদের উদাহরণের উপর echidna চালানোর সারসংক্ষেপ: + +```solidity +contract Incrementor { + uint private counter = 2**200; + + function inc(uint val) public returns (uint){ + uint tmp = counter; + counter += val; + assert (tmp <= counter); + return (counter - tmp); + } +} +``` + +```bash +echidna-test assert.sol --config config.yaml +Analyzing contract: assert.sol:Incrementor +assertion in inc: failed!💥 + Call sequence, shrinking (2596/5000): + inc(21711016731996786641919559689128982722488122124807605757398297001483711807488) + inc(7237005577332262213973186563042994240829374041602535252466099000494570602496) + inc(86844066927987146567678238756515930889952488499230423029593188005934847229952) + +Seed: 1806480648350826486 +``` + +Echidna খুঁজে পেয়েছে যে `inc`-এর মধ্যে অ্যাসারশনটি ব্যর্থ হতে পারে যদি এই ফাংশনটিকে বড় আর্গুমেন্ট সহ একাধিকবার কল করা হয়। + +## একটি Echidna কর্পাস সংগ্রহ এবং পরিবর্তন করা {#collecting-and-modifying-an-echidna-corpus} + +আমরা দেখব Echidna-এর সাথে একটি ট্রানজ্যাকশন কর্পাস কীভাবে সংগ্রহ এবং ব্যবহার করতে হয়। টার্গেট হলো নিম্নলিখিত স্মার্ট কন্ট্র্যাক্ট [`magic.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/echidna/example/magic.sol): + +```solidity +contract C { + bool value_found = false; + function magic(uint magic_1, uint magic_2, uint magic_3, uint magic_4) public { + require(magic_1 == 42); + require(magic_2 == 129); + require(magic_3 == magic_4+333); + value_found = true; + return; + } + + function echidna_magic_values() public returns (bool) { + return !value_found; + } + +} +``` + +এই ছোট উদাহরণটি Echidna-কে একটি স্টেট ভ্যারিয়েবল পরিবর্তন করার জন্য নির্দিষ্ট মান খুঁজে বের করতে বাধ্য করে। এটি একটি ফাজারের জন্য কঠিন +(এর জন্য [Manticore](https://github.com/trailofbits/manticore)-এর মতো একটি সিম্বলিক এক্সিকিউশন টুল ব্যবহার করার পরামর্শ দেওয়া হয়)। +এটি যাচাই করার জন্য আমরা Echidna চালাতে পারি: + +```bash +echidna-test magic.sol +... + +echidna_magic_values: passed! 🎉 + +Seed: 2221503356319272685 +``` + +তবে, আমরা এই ফাজিং ক্যাম্পেইন চালানোর সময় কর্পাস সংগ্রহ করতে Echidna ব্যবহার করতে পারি। + +### একটি কর্পাস সংগ্রহ করা {#collecting-a-corpus} + +কর্পাস সংগ্রহ সক্ষম করতে, একটি কর্পাস ডিরেক্টরি তৈরি করুন: + +```bash +mkdir corpus-magic +``` + +এবং একটি [Echidna কনফিগারেশন ফাইল](https://github.com/crytic/echidna/wiki/Config) `config.yaml`: + +```yaml +coverage: true +corpusDir: "corpus-magic" +``` + +এখন আমরা আমাদের টুলটি চালাতে পারি এবং সংগৃহীত কর্পাস পরীক্ষা করতে পারি: + +```bash +echidna-test magic.sol --config config.yaml +``` + +Echidna এখনও সঠিক ম্যাজিক ভ্যালু খুঁজে পাচ্ছে না, তবে আমরা এর সংগৃহীত কর্পাসটি দেখতে পারি। +উদাহরণস্বরূপ, এই ফাইলগুলোর মধ্যে একটি ছিল: + +```json +[ + { + "_gas'": "0xffffffff", + "_delay": ["0x13647", "0xccf6"], + "_src": "00a329c0648769a73afac7f9381e08fb43dbea70", + "_dst": "00a329c0648769a73afac7f9381e08fb43dbea72", + "_value": "0x0", + "_call": { + "tag": "SolCall", + "contents": [ + "magic", + [ + { + "contents": [ + 256, + "93723985220345906694500679277863898678726808528711107336895287282192244575836" + ], + "tag": "AbiUInt" + }, + { + "contents": [256, "334"], + "tag": "AbiUInt" + }, + { + "contents": [ + 256, + "68093943901352437066264791224433559271778087297543421781073458233697135179558" + ], + "tag": "AbiUInt" + }, + { + "tag": "AbiUInt", + "contents": [256, "332"] + } + ] + ] + }, + "_gasprice'": "0xa904461f1" + } +] +``` + +স্পষ্টতই, এই ইনপুটটি আমাদের প্রপার্টিতে ফেইলিওর ট্রিগার করবে না। তবে, পরবর্তী ধাপে, আমরা দেখব এর জন্য কীভাবে এটি পরিবর্তন করতে হয়। + +### একটি কর্পাস সিডিং করা {#seeding-a-corpus} + +`magic` ফাংশনটির সাথে মোকাবিলা করার জন্য Echidna-এর কিছু সাহায্য প্রয়োজন। আমরা এর জন্য উপযুক্ত +প্যারামিটার ব্যবহার করার জন্য ইনপুটটি কপি এবং মডিফাই করতে যাচ্ছি: + +```bash +cp corpus/2712688662897926208.txt corpus/new.txt +``` + +আমরা `magic(42,129,333,0)` কল করার জন্য `new.txt` মডিফাই করব। এখন, আমরা Echidna পুনরায় চালাতে পারি: + +```bash +echidna-test magic.sol --config config.yaml +... +echidna_magic_values: failed!💥 + Call sequence: + magic(42,129,333,0) + + +Unique instructions: 142 +Unique codehashes: 1 +Seed: -7293830866560616537 + +``` + +এবার, এটি খুঁজে পেয়েছে যে প্রপার্টিটি সঙ্গে সঙ্গে লঙ্ঘিত হয়েছে। + +## উচ্চ গ্যাস খরচের ট্রানজ্যাকশন খোঁজা {#finding-transactions-with-high-gas-consumption} + +আমরা দেখব Echidna দিয়ে কীভাবে উচ্চ গ্যাস খরচের ট্রানজ্যাকশন খুঁজে বের করা যায়। টার্গেট হলো নিম্নলিখিত স্মার্ট কন্ট্র্যাক্ট: + +```solidity +contract C { + uint state; + + function expensive(uint8 times) internal { + for(uint8 i=0; i < times; i++) + state = state + i; + } + + function f(uint x, uint y, uint8 times) public { + if (x == 42 && y == 123) + expensive(times); + else + state = 0; + } + + function echidna_test() public returns (bool) { + return true; + } + +} +``` + +এখানে `expensive`-এর একটি বড় গ্যাস খরচ থাকতে পারে। + +বর্তমানে, Echidna-এর পরীক্ষা করার জন্য সবসময় একটি প্রপার্টি প্রয়োজন: এখানে `echidna_test` সবসময় `true` রিটার্ন করে। +এটি যাচাই করার জন্য আমরা Echidna চালাতে পারি: + +``` +echidna-test gas.sol +... +echidna_test: passed! 🎉 + +Seed: 2320549945714142710 +``` + +### গ্যাস খরচ পরিমাপ করা {#measuring-gas-consumption} + +Echidna-এর সাথে গ্যাস খরচ সক্ষম করতে, একটি কনফিগারেশন ফাইল `config.yaml` তৈরি করুন: + +```yaml +estimateGas: true +``` + +এই উদাহরণে, ফলাফলগুলো সহজে বোঝার জন্য আমরা ট্রানজ্যাকশন সিকোয়েন্সের আকারও কমিয়ে দেব: + +```yaml +seqLen: 2 +estimateGas: true +``` + +### Echidna চালান {#run-echidna-3} + +কনফিগারেশন ফাইল তৈরি হয়ে গেলে, আমরা এইভাবে Echidna চালাতে পারি: + +```bash +echidna-test gas.sol --config config.yaml +... +echidna_test: passed! 🎉 + +f used a maximum of 1333608 gas + Call sequence: + f(42,123,249) Gas price: 0x10d5733f0a Time delay: 0x495e5 Block delay: 0x88b2 + +Unique instructions: 157 +Unique codehashes: 1 +Seed: -325611019680165325 + +``` + +- [HEVM](https://github.com/dapphub/dapptools/tree/master/src/hevm#hevm-) দ্বারা প্রদত্ত একটি অনুমান হলো দেখানো গ্যাস। + +### গ্যাস-কমানো কলগুলো ফিল্টার করা {#filtering-out-gas-reducing-calls} + +উপরে **ফাজিং ক্যাম্পেইনের সময় কল করার জন্য ফাংশন ফিল্টার করা** বিষয়ক টিউটোরিয়ালটি দেখায় কীভাবে আপনার টেস্টিং থেকে কিছু ফাংশন সরানো যায়। +একটি সঠিক গ্যাস অনুমান পাওয়ার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ হতে পারে। +নিম্নলিখিত উদাহরণটি বিবেচনা করুন: + +```solidity +contract C { + address [] addrs; + function push(address a) public { + addrs.push(a); + } + function pop() public { + addrs.pop(); + } + function clear() public{ + addrs.length = 0; + } + function check() public{ + for(uint256 i = 0; i < addrs.length; i++) + for(uint256 j = i+1; j < addrs.length; j++) + if (addrs[i] == addrs[j]) + addrs[j] = address(0x0); + } + function echidna_test() public returns (bool) { + return true; + } +} +``` + +যদি Echidna সমস্ত ফাংশন কল করতে পারে, তবে এটি সহজে উচ্চ গ্যাস খরচের ট্রানজ্যাকশন খুঁজে পাবে না: + +``` +echidna-test pushpop.sol --config config.yaml +... +pop used a maximum of 10746 gas +... +check used a maximum of 23730 gas +... +clear used a maximum of 35916 gas +... +push used a maximum of 40839 gas +``` + +এর কারণ হলো খরচ `addrs`-এর আকারের উপর নির্ভর করে এবং র‍্যান্ডম কলগুলো অ্যারেটিকে প্রায় খালি রেখে দেয়। +তবে, `pop` এবং `clear`-কে ব্ল্যাকলিস্ট করা আমাদের অনেক ভালো ফলাফল দেয়: + +```yaml +filterBlacklist: true +filterFunctions: ["pop", "clear"] +``` + +``` +echidna-test pushpop.sol --config config.yaml +... +push used a maximum of 40839 gas +... +check used a maximum of 1484472 gas +``` + +### সারসংক্ষেপ: উচ্চ গ্যাস খরচের ট্রানজ্যাকশন খোঁজা {#summary-finding-transactions-with-high-gas-consumption} + +`estimateGas` কনফিগারেশন অপশন ব্যবহার করে Echidna উচ্চ গ্যাস খরচের ট্রানজ্যাকশন খুঁজে বের করতে পারে: + +```yaml +estimateGas: true +``` + +```bash +echidna-test contract.sol --config config.yaml +... +``` + +ফাজিং ক্যাম্পেইন শেষ হয়ে গেলে Echidna প্রতিটি ফাংশনের জন্য সর্বোচ্চ গ্যাস খরচের একটি সিকোয়েন্স রিপোর্ট করবে। diff --git a/public/content/translations/bn/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md b/public/content/translations/bn/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md new file mode 100644 index 00000000000..8c506dc8609 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/how-to-use-manticore-to-find-smart-contract-bugs/index.md @@ -0,0 +1,526 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্টে বাগ খুঁজে বের করতে Manticore কিভাবে ব্যবহার করবেন" +description: "স্মার্ট কন্ট্র্যাক্টে স্বয়ংক্রিয়ভাবে বাগ খুঁজে বের করতে Manticore কিভাবে ব্যবহার করবেন" +author: Trailofbits +lang: bn +tags: + [ + "সলিডিটি", + "স্মার্ট কন্ট্র্যাক্ট", + "নিরাপত্তা", + "পরীক্ষা", + "প্রথাগত যাচাইকরণ" + ] +skill: advanced +published: 2020-01-13 +source: Building secure contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/manticore +--- + +এই টিউটোরিয়ালের লক্ষ্য হল কিভাবে Manticore ব্যবহার করে স্মার্ট কন্ট্র্যাক্টে স্বয়ংক্রিয়ভাবে বাগ খুঁজে বের করা যায় তা দেখানো। + +## ইনস্টলেশন {#installation} + +Manticore-এর জন্য >= python 3.6 প্রয়োজন। এটি pip-এর মাধ্যমে বা docker ব্যবহার করে ইনস্টল করা যেতে পারে। + +### docker-এর মাধ্যমে Manticore {#manticore-through-docker} + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/training trailofbits/eth-security-toolbox +``` + +_শেষ কমান্ডটি একটি docker-এ eth-security-toolbox চালায় যেটির আপনার বর্তমান ডিরেক্টরিতে অ্যাক্সেস আছে। আপনি আপনার হোস্ট থেকে ফাইলগুলো পরিবর্তন করতে পারেন, এবং docker থেকে ফাইলগুলোতে টুলস চালাতে পারেন_ + +docker-এর ভিতরে, চালান: + +```bash +solc-select 0.5.11 +cd /home/trufflecon/ +``` + +### pip-এর মাধ্যমে Manticore {#manticore-through-pip} + +```bash +pip3 install --user manticore +``` + +solc 0.5.11 সুপারিশ করা হয়। + +### একটি স্ক্রিপ্ট চালানো {#running-a-script} + +python 3 দিয়ে একটি python স্ক্রিপ্ট চালাতে: + +```bash +python3 script.py +``` + +## ডাইনামিক সিম্বলিক এক্সিকিউশন-এর ভূমিকা {#introduction-to-dynamic-symbolic-execution} + +### সংক্ষেপে ডাইনামিক সিম্বলিক এক্সিকিউশন {#dynamic-symbolic-execution-in-a-nutshell} + +ডাইনামিক সিম্বলিক এক্সিকিউশন (DSE) হল একটি প্রোগ্রাম অ্যানালিসিস কৌশল যা উচ্চ মাত্রার সিমেন্টিক সচেতনতার সাথে একটি স্টেট স্পেস এক্সপ্লোর করে। এই কৌশলটি "প্রোগ্রাম পাথ" আবিষ্কারের উপর ভিত্তি করে তৈরি, যা `path predicates` নামক গাণিতিক সূত্র হিসাবে উপস্থাপিত হয়। ধারণাগতভাবে, এই কৌশলটি দুটি ধাপে পাথ প্রেডিকেটগুলির উপর কাজ করে: + +1. এগুলি প্রোগ্রামের ইনপুটের উপর সীমাবদ্ধতা ব্যবহার করে তৈরি করা হয়। +2. এগুলি এমন প্রোগ্রাম ইনপুট তৈরি করতে ব্যবহৃত হয় যা সংশ্লিষ্ট পাথগুলিকে এক্সিকিউট করাবে। + +এই পদ্ধতিটি কোনো ফলস পজিটিভ তৈরি করে না, এই অর্থে যে সমস্ত চিহ্নিত প্রোগ্রাম স্টেট কংক্রিট এক্সিকিউশনের সময় ট্রিগার করা যেতে পারে। উদাহরণস্বরূপ, যদি অ্যানালিসিস একটি ইন্টিজার ওভারফ্লো খুঁজে পায়, তবে এটি পুনরুৎপাদনযোগ্য হওয়ার নিশ্চয়তা দেওয়া হয়। + +### পাথ প্রেডিকেটের উদাহরণ {#path-predicate-example} + +DSE কীভাবে কাজ করে তার একটি ধারণা পেতে, নিম্নলিখিত উদাহরণটি বিবেচনা করুন: + +```solidity +function f(uint a){ + + if (a == 65) { + // একটি বাগ উপস্থিত + } + +} +``` + +যেহেতু `f()`-এ দুটি পাথ রয়েছে, একটি DSE দুটি ভিন্ন পাথ প্রেডিকেট তৈরি করবে: + +- পাথ 1: `a == 65` +- পাথ 2: `Not (a == 65)` + +প্রতিটি পাথ প্রেডিকেট একটি গাণিতিক সূত্র যা একটি তথাকথিত [SMT solver](https://wikipedia.org/wiki/Satisfiability_modulo_theories)-কে দেওয়া যেতে পারে, যা সমীকরণটি সমাধান করার চেষ্টা করবে। `পাথ 1`-এর জন্য, সলভার বলবে যে `a = 65` দিয়ে পাথটি এক্সপ্লোর করা যাবে। `পাথ 2`-এর জন্য, সলভার `a`-কে 65 ছাড়া অন্য যেকোনো মান দিতে পারে, উদাহরণস্বরূপ `a = 0`। + +### প্রপার্টি যাচাই করা {#verifying-properties} + +Manticore প্রতিটি পাথের সমস্ত এক্সিকিউশনের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়। ফলস্বরূপ, এটি আপনাকে প্রায় যেকোনো কিছুতে যথেচ্ছ সীমাবদ্ধতা যোগ করতে দেয়। এই নিয়ন্ত্রণটি কন্ট্র্যাক্টে প্রপার্টি তৈরি করার অনুমতি দেয়। + +নিম্নলিখিত উদাহরণটি বিবেচনা করুন: + +```solidity +function unsafe_add(uint a, uint b) returns(uint c){ + c = a + b; // কোনো ওভারফ্লো সুরক্ষা নেই + return c; +} +``` + +এখানে ফাংশনটিতে এক্সপ্লোর করার জন্য কেবল একটি পাথ রয়েছে: + +- পাথ 1: `c = a + b` + +Manticore ব্যবহার করে, আপনি ওভারফ্লো পরীক্ষা করতে পারেন এবং পাথ প্রেডিকেটে সীমাবদ্ধতা যোগ করতে পারেন: + +- `c = a + b AND (c < a OR c < b)` + +যদি `a` এবং `b`-এর এমন একটি মূল্যায়ন খুঁজে পাওয়া সম্ভব হয় যার জন্য উপরের পাথ প্রেডিকেটটি সম্ভব, এর মানে হল আপনি একটি ওভারফ্লো খুঁজে পেয়েছেন। উদাহরণস্বরূপ সলভার `a = 10 , b = MAXUINT256` ইনপুটটি তৈরি করতে পারে। + +আপনি যদি একটি ফিক্সড সংস্করণ বিবেচনা করেন: + +```solidity +function safe_add(uint a, uint b) returns(uint c){ + c = a + b; + require(c>=a); + require(c>=b); + return c; +} +``` + +ওভারফ্লো পরীক্ষাসহ সংশ্লিষ্ট সূত্রটি হবে: + +- `c = a + b AND (c >= a) AND (c=>b) AND (c < a OR c < b)` + +এই সূত্রটি সমাধান করা যায় না; অন্য কথায় এটি একটি **প্রমাণ** যে `safe_add`-এ `c` সর্বদা বৃদ্ধি পাবে। + +সুতরাং DSE একটি শক্তিশালী টুল, যা আপনার কোডে যথেচ্ছ সীমাবদ্ধতা যাচাই করতে পারে। + +## Manticore-এর অধীনে চালানো {#running-under-manticore} + +আমরা দেখব কিভাবে Manticore API দিয়ে একটি স্মার্ট কন্ট্র্যাক্ট এক্সপ্লোর করতে হয়। লক্ষ্য হল নিম্নলিখিত স্মার্ট কন্ট্র্যাক্ট [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): + +```solidity +pragma solidity >=0.4.24 <0.6.0; + +contract Simple { + function f(uint a) payable public{ + if (a == 65) { + revert(); + } + } +} +``` + +### একটি স্বতন্ত্র এক্সপ্লোরেশন চালান {#run-a-standalone-exploration} + +আপনি নিম্নলিখিত কমান্ড দ্বারা সরাসরি স্মার্ট কন্ট্র্যাক্টে Manticore চালাতে পারেন (`প্রজেক্ট` একটি সলিডিটি ফাইল, বা একটি প্রজেক্ট ডিরেক্টরি হতে পারে): + +```bash +$ manticore project +``` + +আপনি এইরকম টেস্টকেসগুলির আউটপুট পাবেন (ক্রম পরিবর্তন হতে পারে): + +``` +... +... m.c.manticore:INFO: Generated testcase No. 0 - STOP +... m.c.manticore:INFO: Generated testcase No. 1 - REVERT +... m.c.manticore:INFO: Generated testcase No. 2 - RETURN +... m.c.manticore:INFO: Generated testcase No. 3 - REVERT +... m.c.manticore:INFO: Generated testcase No. 4 - STOP +... m.c.manticore:INFO: Generated testcase No. 5 - REVERT +... m.c.manticore:INFO: Generated testcase No. 6 - REVERT +... m.c.manticore:INFO: Results in /home/ethsec/workshops/Automated Smart Contracts Audit - TruffleCon 2018/manticore/examples/mcore_t6vi6ij3 +... +``` + +অতিরিক্ত তথ্য ছাড়া, Manticore নতুন সিম্বলিক +লেনদেনের মাধ্যমে কন্ট্র্যাক্টটি অন্বেষণ করবে যতক্ষণ না এটি কন্ট্র্যাক্টে নতুন পথ অন্বেষণ করা বন্ধ করে। Manticore একটি ব্যর্থ লেনদেনের পরে নতুন লেনদেন চালায় না (যেমন: একটি রিভার্টের পরে)। + +Manticore একটি `mcore_*` ডিরেক্টরিতে তথ্য আউটপুট করবে। অন্যান্য জিনিসের মধ্যে, আপনি এই ডিরেক্টরিতে পাবেন: + +- `global.summary`: কভারেজ এবং কম্পাইলার সতর্কতা +- `test_XXXXX.summary`: কভারেজ, শেষ নির্দেশনা, প্রতি টেস্ট কেস অনুযায়ী অ্যাকাউন্ট ব্যালেন্স +- `test_XXXXX.tx`: প্রতি টেস্ট কেস অনুযায়ী লেনদেনের বিস্তারিত তালিকা + +এখানে Manticore ৭টি টেস্ট কেস খুঁজে পেয়েছে, যা নিম্নরূপ (ফাইলের নামের ক্রম পরিবর্তন হতে পারে): + +| | লেনদেন 0 | লেনদেন 1 | লেনদেন 2 | ফলাফল | +| :-------------------------------------------------------: | :---------------: | :------------------------: | -------------------------- | :----: | +| **test_00000000.tx** | কন্ট্র্যাক্ট তৈরি | f(!=65) | f(!=65) | STOP | +| **test_00000001.tx** | কন্ট্র্যাক্ট তৈরি | ফলব্যাক ফাংশন | | REVERT | +| **test_00000002.tx** | কন্ট্র্যাক্ট তৈরি | | | RETURN | +| **test_00000003.tx** | কন্ট্র্যাক্ট তৈরি | f(65) | | REVERT | +| **test_00000004.tx** | কন্ট্র্যাক্ট তৈরি | f(!=65) | | STOP | +| **test_00000005.tx** | কন্ট্র্যাক্ট তৈরি | f(!=65) | f(65) | REVERT | +| **test_00000006.tx** | কন্ট্র্যাক্ট তৈরি | f(!=65) | ফলব্যাক ফাংশন | REVERT | + +_এক্সপ্লোরেশন সারাংশ f(!=65) বোঝায় যে f-কে 65 থেকে ভিন্ন যেকোনো মান দিয়ে কল করা হয়েছে।_ + +আপনি যেমন লক্ষ্য করতে পারেন, Manticore প্রতিটি সফল বা রিভার্ট হওয়া লেনদেনের জন্য একটি অনন্য টেস্ট কেস তৈরি করে। + +আপনি যদি দ্রুত কোড এক্সপ্লোরেশন চান তবে `--quick-mode` ফ্ল্যাগটি ব্যবহার করুন (এটি বাগ ডিটেক্টর, গ্যাস গণনা ইত্যাদি নিষ্ক্রিয় করে) + +### API-এর মাধ্যমে একটি স্মার্ট কন্ট্র্যাক্ট ম্যানিপুলেট করা {#manipulate-a-smart-contract-through-the-api} + +এই বিভাগে Manticore Python API-এর মাধ্যমে কীভাবে একটি স্মার্ট কন্ট্র্যাক্ট ম্যানিপুলেট করতে হয় তা বিস্তারিতভাবে বর্ণনা করা হয়েছে। আপনি `*.py` এক্সটেনশন সহ নতুন ফাইল তৈরি করতে পারেন এবং এই ফাইলে API কমান্ডগুলি (যার মূল বিষয়গুলি নীচে বর্ণনা করা হবে) যোগ করে প্রয়োজনীয় কোড লিখতে পারেন এবং তারপরে `$ python3 *.py` কমান্ড দিয়ে এটি চালাতে পারেন। এছাড়াও আপনি নীচের কমান্ডগুলি সরাসরি পাইথন কনসোলে এক্সিকিউট করতে পারেন, কনসোলটি চালানোর জন্য `$ python3` কমান্ডটি ব্যবহার করুন। + +### অ্যাকাউন্ট তৈরি করা {#creating-accounts} + +আপনার প্রথম যা করা উচিত তা হল নিম্নলিখিত কমান্ডগুলি দিয়ে একটি নতুন ব্লকচেইন শুরু করা: + +```python +from manticore.ethereum import ManticoreEVM + +m = ManticoreEVM() +``` + +একটি নন-কন্ট্র্যাক্ট অ্যাকাউন্ট [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) ব্যবহার করে তৈরি করা হয়: + +```python +user_account = m.create_account(balance=1000) +``` + +একটি সলিডিটি কন্ট্র্যাক্ট [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract) ব্যবহার করে ডিপ্লয় করা যেতে পারে: + +```solidity +source_code = ''' +pragma solidity >=0.4.24 <0.6.0; +contract Simple { + function f(uint a) payable public{ + if (a == 65) { + revert(); + } + } +} +''' +# কন্ট্র্যাক্টটি শুরু করুন +contract_account = m.solidity_create_contract(source_code, owner=user_account) +``` + +#### সারসংক্ষেপ {#summary} + +- আপনি [m.create_account](https://manticore.readthedocs.io/en/latest/evm.html?highlight=create_account#manticore.ethereum.ManticoreEVM.create_account) এবং [m.solidity_create_contract](https://manticore.readthedocs.io/en/latest/evm.html?highlight=solidity_create#manticore.ethereum.ManticoreEVM.create_contract) দিয়ে ব্যবহারকারী এবং কন্ট্র্যাক্ট অ্যাকাউন্ট তৈরি করতে পারেন। + +### লেনদেন এক্সিকিউট করা {#executing-transactions} + +Manticore দুই ধরনের লেনদেন সমর্থন করে: + +- র' লেনদেন: সমস্ত ফাংশন এক্সপ্লোর করা হয় +- নামযুক্ত লেনদেন: শুধুমাত্র একটি ফাংশন এক্সপ্লোর করা হয় + +#### র' লেনদেন {#raw-transaction} + +একটি র' লেনদেন [m.transaction](https://manticore.readthedocs.io/en/latest/evm.html?highlight=transaction#manticore.ethereum.ManticoreEVM.transaction) ব্যবহার করে এক্সিকিউট করা হয়: + +```python +m.transaction(caller=user_account, + address=contract_account, + data=data, + value=value) +``` + +লেনদেনের কলার, ঠিকানা, ডেটা, বা মান কংক্রিট বা সিম্বলিক উভয়ই হতে পারে: + +- [m.make_symbolic_value](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_value#manticore.ethereum.ManticoreEVM.make_symbolic_value) একটি সিম্বলিক মান তৈরি করে। +- [m.make_symbolic_buffer(size)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=make_symbolic_buffer#manticore.ethereum.ManticoreEVM.make_symbolic_buffer) একটি সিম্বলিক বাইট অ্যারে তৈরি করে। + +উদাহরণস্বরূপ: + +```python +symbolic_value = m.make_symbolic_value() +symbolic_data = m.make_symbolic_buffer(320) +m.transaction(caller=user_account, + address=contract_address, + data=symbolic_data, + value=symbolic_value) +``` + +যদি ডেটা সিম্বলিক হয়, Manticore লেনদেন এক্সিকিউশনের সময় কন্ট্র্যাক্টের সমস্ত ফাংশন এক্সপ্লোর করবে। ফাংশন সিলেকশন কীভাবে কাজ করে তা বোঝার জন্য [Hands on the Ethernaut CTF](https://blog.trailofbits.com/2017/11/06/hands-on-the-ethernaut-ctf/) নিবন্ধে ফলব্যাক ফাংশনের ব্যাখ্যা দেখা সহায়ক হবে। + +#### নামযুক্ত লেনদেন {#named-transaction} + +ফাংশনগুলি তাদের নামের মাধ্যমে এক্সিকিউট করা যেতে পারে। +`f(uint var)`-কে একটি সিম্বলিক মান দিয়ে, user_account থেকে, এবং 0 ইথার সহ এক্সিকিউট করতে, ব্যবহার করুন: + +```python +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var, caller=user_account, value=0) +``` + +যদি লেনদেনের `value` নির্দিষ্ট করা না থাকে, তবে এটি ডিফল্টরূপে 0 হয়। + +#### সারাংশ {#summary-1} + +- একটি লেনদেনের আর্গুমেন্ট কংক্রিট বা সিম্বলিক হতে পারে +- একটি র' লেনদেন সমস্ত ফাংশন এক্সপ্লোর করবে +- ফাংশনকে তাদের নাম দিয়ে কল করা যেতে পারে + +### ওয়ার্কস্পেস {#workspace} + +`m.workspace` হল জেনারেট করা সমস্ত ফাইলের জন্য আউটপুট ডিরেক্টরি হিসাবে ব্যবহৃত ডিরেক্টরি: + +```python +print("Results are in {}".format(m.workspace)) +``` + +### এক্সপ্লোরেশন বন্ধ করুন {#terminate-the-exploration} + +এক্সপ্লোরেশন থামাতে [m.finalize()](https://manticore.readthedocs.io/en/latest/evm.html?highlight=finalize#manticore.ethereum.ManticoreEVM.finalize) ব্যবহার করুন। এই পদ্ধতিটি কল করার পরে আর কোনো লেনদেন পাঠানো উচিত নয় এবং Manticore প্রতিটি এক্সপ্লোর করা পাথের জন্য টেস্ট কেস তৈরি করে। + +### সারাংশ: Manticore-এর অধীনে চালানো {#summary-running-under-manticore} + +পূর্ববর্তী সমস্ত ধাপ একসাথে রাখলে, আমরা পাই: + +```python +from manticore.ethereum import ManticoreEVM + +m = ManticoreEVM() + +with open('example.sol') as f: + source_code = f.read() + +user_account = m.create_account(balance=1000) +contract_account = m.solidity_create_contract(source_code, owner=user_account) + +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var) + +print("Results are in {}".format(m.workspace)) +m.finalize() # এক্সপ্লোরেশন বন্ধ করুন +``` + +উপরের সমস্ত কোড আপনি [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) এর মধ্যে খুঁজে পেতে পারেন + +## থ্রোয়িং পাথ পাওয়া {#getting-throwing-paths} + +আমরা এখন `f()`-এ একটি এক্সেপশন উত্থাপনকারী পাথগুলির জন্য নির্দিষ্ট ইনপুট তৈরি করব। লক্ষ্য এখনও নিম্নলিখিত স্মার্ট কন্ট্র্যাক্ট [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): + +```solidity +pragma solidity >=0.4.24 <0.6.0; +contract Simple { + function f(uint a) payable public{ + if (a == 65) { + revert(); + } + } +} +``` + +### স্টেটের তথ্য ব্যবহার করা {#using-state-information} + +প্রতিটি এক্সিকিউট করা পাথের নিজস্ব ব্লকচেইনের স্টেট রয়েছে। একটি স্টেট হয় রেডি থাকে অথবা কিল হয়ে যায়, যার অর্থ এটি একটি THROW বা REVERT নির্দেশনায় পৌঁছেছে: + +- [m.ready_states](https://manticore.readthedocs.io/en/latest/states.html#accessing): রেডি থাকা স্টেটগুলির তালিকা (তারা একটি REVERT/INVALID এক্সিকিউট করেনি) +- [m.killed_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): কিল হয়ে যাওয়া স্টেটগুলির তালিকা +- [m.all_states](https://manticore.readthedocs.io/en/latest/states.html#accessings): সমস্ত স্টেট + +```python +for state in m.all_states: + # স্টেট নিয়ে কিছু করুন +``` + +আপনি স্টেটের তথ্য অ্যাক্সেস করতে পারেন। উদাহরণস্বরূপ: + +- `state.platform.get_balance(account.address)`: অ্যাকাউন্টের ব্যালেন্স +- `state.platform.transactions`: লেনদেনের তালিকা +- `state.platform.transactions[-1].return_data`: শেষ লেনদেন দ্বারা ফেরত দেওয়া ডেটা + +শেষ লেনদেন দ্বারা ফেরত দেওয়া ডেটা একটি অ্যারে, যা ABI.deserialize দিয়ে একটি মানে রূপান্তরিত করা যেতে পারে, উদাহরণস্বরূপ: + +```python +data = state.platform.transactions[0].return_data +data = ABI.deserialize("uint", data) +``` + +### কীভাবে টেস্টকেস জেনারেট করবেন {#how-to-generate-testcase} + +টেস্টকেস জেনারেট করতে [m.generate_testcase(state, name)](https://manticore.readthedocs.io/en/latest/evm.html?highlight=generate_testcase#manticore.ethereum.ManticoreEVM.generate_testcase) ব্যবহার করুন: + +```python +m.generate_testcase(state, 'BugFound') +``` + +### সারাংশ {#summary-2} + +- আপনি m.all_states দিয়ে স্টেটের উপর ইটারেট করতে পারেন +- `state.platform.get_balance(account.address)` অ্যাকাউন্টের ব্যালেন্স ফেরত দেয় +- `state.platform.transactions` লেনদেনের তালিকা ফেরত দেয় +- `transaction.return_data` হল ফেরত দেওয়া ডেটা +- `m.generate_testcase(state, name)` স্টেটের জন্য ইনপুট জেনারেট করে + +### সারাংশ: থ্রোয়িং পাথ পাওয়া {#summary-getting-throwing-path} + +```python +from manticore.ethereum import ManticoreEVM + +m = ManticoreEVM() + +with open('example.sol') as f: + source_code = f.read() + +user_account = m.create_account(balance=1000) +contract_account = m.solidity_create_contract(source_code, owner=user_account) + +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var) + +## একটি এক্সিকিউশন REVERT বা INVALID দিয়ে শেষ হয় কিনা তা পরীক্ষা করুন + +for state in m.terminated_states: + last_tx = state.platform.transactions[-1] + if last_tx.result in ['REVERT', 'INVALID']: + print('Throw found {}'.format(m.workspace)) + m.generate_testcase(state, 'ThrowFound') +``` + +উপরের সমস্ত কোড আপনি [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) এর মধ্যে খুঁজে পেতে পারেন + +_দ্রষ্টব্য আমরা একটি অনেক সহজ স্ক্রিপ্ট তৈরি করতে পারতাম, কারণ terminated_state দ্বারা ফেরত দেওয়া সমস্ত স্টেটের ফলাফলে REVERT বা INVALID থাকে: এই উদাহরণটি শুধুমাত্র API কীভাবে ম্যানিপুলেট করতে হয় তা প্রদর্শনের জন্য ছিল।_ + +## সীমাবদ্ধতা যোগ করা {#adding-constraints} + +আমরা দেখব কীভাবে এক্সপ্লোরেশনকে সীমাবদ্ধ করা যায়। আমরা এই ধারণাটি ধরে নেব যে `f()`-এর +ডকুমেন্টেশন অনুযায়ী ফাংশনটি কখনও `a == 65` দিয়ে কল করা হয় না, তাই `a == 65` সহ যেকোনো বাগ একটি আসল বাগ নয়। লক্ষ্য এখনও নিম্নলিখিত স্মার্ট কন্ট্র্যাক্ট [`example.sol`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example.sol): + +```solidity +pragma solidity >=0.4.24 <0.6.0; +contract Simple { + function f(uint a) payable public{ + if (a == 65) { + revert(); + } + } +} +``` + +### অপারেটর {#operators} + +[অপারেটর](https://github.com/trailofbits/manticore/blob/master/manticore/core/smtlib/operators.py) মডিউলটি সীমাবদ্ধতার ম্যানিপুলেশনকে সহজ করে, অন্যান্য জিনিসের মধ্যে এটি প্রদান করে: + +- Operators.AND, +- Operators.OR, +- Operators.UGT (আনসাইন্ড গ্রেটার দ্যান), +- Operators.UGE (আনসাইন্ড গ্রেটার দ্যান অর ইকুয়াল টু), +- Operators.ULT (আনসাইন্ড লোয়ার দ্যান), +- Operators.ULE (আনসাইন্ড লোয়ার দ্যান অর ইকুয়াল টু)। + +মডিউলটি ইম্পোর্ট করতে নিম্নলিখিতটি ব্যবহার করুন: + +```python +from manticore.core.smtlib import Operators +``` + +`Operators.CONCAT` একটি অ্যারের সাথে একটি মান কনক্যাটেনেট করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, একটি লেনদেনের return_data-কে অন্য একটি মানের সাথে পরীক্ষা করার জন্য একটি মানে পরিবর্তন করতে হবে: + +```python +last_return = Operators.CONCAT(256, *last_return) +``` + +### সীমাবদ্ধতা {#state-constraint} + +আপনি বিশ্বব্যাপী বা একটি নির্দিষ্ট স্টেটের জন্য সীমাবদ্ধতা ব্যবহার করতে পারেন। + +#### গ্লোবাল সীমাবদ্ধতা {#state-constraint} + +একটি গ্লোবাল সীমাবদ্ধতা যোগ করতে `m.constrain(constraint)` ব্যবহার করুন। +উদাহরণস্বরূপ, আপনি একটি সিম্বলিক ঠিকানা থেকে একটি কন্ট্র্যাক্ট কল করতে পারেন, এবং এই ঠিকানাটিকে নির্দিষ্ট মানে সীমাবদ্ধ করতে পারেন: + +```python +symbolic_address = m.make_symbolic_value() +m.constraint(Operators.OR(symbolic == 0x41, symbolic_address == 0x42)) +m.transaction(caller=user_account, + address=contract_account, + data=m.make_symbolic_buffer(320), + value=0) +``` + +#### স্টেট সীমাবদ্ধতা {#state-constraint} + +একটি নির্দিষ্ট স্টেটে সীমাবদ্ধতা যোগ করতে [state.constrain(constraint)](https://manticore.readthedocs.io/en/latest/states.html?highlight=StateBase#manticore.core.state.StateBase.constrain) ব্যবহার করুন। +এটি এক্সপ্লোরেশনের পরে স্টেটের উপর কিছু প্রপার্টি পরীক্ষা করার জন্য স্টেটকে সীমাবদ্ধ করতে ব্যবহার করা যেতে পারে। + +### সীমাবদ্ধতা পরীক্ষা করা {#checking-constraint} + +একটি সীমাবদ্ধতা এখনও সম্ভব কিনা তা জানতে `solver.check(state.constraints)` ব্যবহার করুন। +উদাহরণস্বরূপ, নিম্নলিখিতটি symbolic_value-কে 65 থেকে ভিন্ন হতে সীমাবদ্ধ করবে এবং স্টেটটি এখনও সম্ভব কিনা তা পরীক্ষা করবে: + +```python +state.constrain(symbolic_var != 65) +if solver.check(state.constraints): + # স্টেটটি সম্ভব +``` + +### সারাংশ: সীমাবদ্ধতা যোগ করা {#summary-adding-constraints} + +পূর্ববর্তী কোডে সীমাবদ্ধতা যোগ করে, আমরা পাই: + +```python +from manticore.ethereum import ManticoreEVM +from manticore.core.smtlib.solver import Z3Solver + +solver = Z3Solver.instance() + +m = ManticoreEVM() + +with open("example.sol") as f: + source_code = f.read() + +user_account = m.create_account(balance=1000) +contract_account = m.solidity_create_contract(source_code, owner=user_account) + +symbolic_var = m.make_symbolic_value() +contract_account.f(symbolic_var) + +no_bug_found = True + +## একটি এক্সিকিউশন REVERT বা INVALID দিয়ে শেষ হয় কিনা তা পরীক্ষা করুন + +for state in m.terminated_states: + last_tx = state.platform.transactions[-1] + if last_tx.result in ['REVERT', 'INVALID']: + # আমরা সেই পাথ বিবেচনা করি না যেখানে a == 65 + condition = symbolic_var != 65 + if m.generate_testcase(state, name="BugFound", only_if=condition): + print(f'বাগ পাওয়া গেছে, ফলাফলগুলো {m.workspace}-এ আছে') + no_bug_found = False + +if no_bug_found: + print(f'কোনো বাগ পাওয়া যায়নি') +``` + +উপরের সমস্ত কোড আপনি [`example_run.py`](https://github.com/crytic/building-secure-contracts/blob/master/program-analysis/manticore/examples/example_run.py) এর মধ্যে খুঁজে পেতে পারেন diff --git a/public/content/translations/bn/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md b/public/content/translations/bn/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md new file mode 100644 index 00000000000..b65980a88d9 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/index.md @@ -0,0 +1,239 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট বাগ খুঁজে বের করতে কীভাবে স্লিদার ব্যবহার করবেন" +description: "স্মার্ট কন্ট্র্যাক্টে স্বয়ংক্রিয়ভাবে বাগ খুঁজে পেতে কীভাবে স্লিদার ব্যবহার করবেন" +author: Trailofbits +lang: bn +tags: + [ + "সলিডিটি", + "স্মার্ট কন্ট্র্যাক্ট", + "নিরাপত্তা", + "পরীক্ষা" + ] +skill: advanced +published: 2020-06-09 +source: Building secure contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/tree/master/program-analysis/slither +--- + +## কীভাবে স্লিদার ব্যবহার করবেন {#how-to-use-slither} + +এই টিউটোরিয়ালের উদ্দেশ্য হলো স্মার্ট কন্ট্র্যাক্টে স্বয়ংক্রিয়ভাবে বাগ খুঁজে বের করতে কীভাবে স্লিদার ব্যবহার করা যায় তা দেখানো। + +- [ইনস্টলেশন](#installation) +- [কমান্ড লাইন ব্যবহার](#command-line) +- [স্ট্যাটিক অ্যানালাইসিসের ভূমিকা](#static-analysis): স্ট্যাটিক অ্যানালাইসিসের সংক্ষিপ্ত ভূমিকা +- [API](#api-basics): পাইথন API-এর বর্ণনা + +## ইনস্টলেশন {#installation} + +স্লিদারের জন্য পাইথন >= 3.6 প্রয়োজন। এটি pip-এর মাধ্যমে বা docker ব্যবহার করে ইনস্টল করা যেতে পারে। + +pip-এর মাধ্যমে স্লিদার: + +```bash +pip3 install --user slither-analyzer +``` + +ডকারের মাধ্যমে স্লিদার: + +```bash +docker pull trailofbits/eth-security-toolbox +docker run -it -v "$PWD":/home/trufflecon trailofbits/eth-security-toolbox +``` + +_শেষ কমান্ডটি একটি docker-এ eth-security-toolbox চালায় যেটির আপনার বর্তমান ডিরেক্টরিতে অ্যাক্সেস আছে। আপনি আপনার হোস্ট থেকে ফাইলগুলো পরিবর্তন করতে পারেন, এবং docker থেকে ফাইলগুলোতে টুলস চালাতে পারেন_ + +docker-এর ভিতরে, চালান: + +```bash +solc-select 0.5.11 +cd /home/trufflecon/ +``` + +### একটি স্ক্রিপ্ট চালানো {#running-a-script} + +python 3 দিয়ে একটি python স্ক্রিপ্ট চালাতে: + +```bash +python3 script.py +``` + +### কমান্ড লাইন {#command-line} + +**কমান্ড লাইন বনাম ব্যবহারকারী-সংজ্ঞায়িত স্ক্রিপ্ট।** স্লিদার পূর্ব-নির্ধারিত ডিটেক্টরের একটি সেট নিয়ে আসে যা অনেক সাধারণ বাগ খুঁজে পায়। কমান্ড লাইন থেকে স্লিদার কল করলে সমস্ত ডিটেক্টর চলবে, স্ট্যাটিক অ্যানালাইসিস সম্পর্কে বিস্তারিত জ্ঞানের প্রয়োজন নেই: + +```bash +slither project_paths +``` + +ডিটেক্টর ছাড়াও, স্লিদারের [প্রিন্টার](https://github.com/crytic/slither#printers) এবং [টুলস](https://github.com/crytic/slither#tools)-এর মাধ্যমে কোড পর্যালোচনার ক্ষমতা রয়েছে। + +প্রাইভেট ডিটেক্টর এবং GitHub ইন্টিগ্রেশনে অ্যাক্সেস পেতে [crytic.io](https://github.com/crytic) ব্যবহার করুন। + +## স্ট্যাটিক বিশ্লেষণ {#static-analysis} + +স্লিদার স্ট্যাটিক অ্যানালাইসিস ফ্রেমওয়ার্কের ক্ষমতা এবং ডিজাইন ব্লগ পোস্টে ([1](https://blog.trailofbits.com/2018/10/19/slither-a-solidity-static-analysis-framework/), [2](https://blog.trailofbits.com/2019/05/27/slither-the-leading-static-analyzer-for-smart-contracts/)) এবং একটি [একাডেমিক পেপারে](https://github.com/trailofbits/publications/blob/master/papers/wetseb19.pdf) বর্ণনা করা হয়েছে। + +স্ট্যাটিক অ্যানালাইসিস বিভিন্ন ধরনের হয়ে থাকে। আপনি সম্ভবত বুঝতে পারছেন যে [clang](https://clang-analyzer.llvm.org/) এবং [gcc](https://lwn.net/Articles/806099/)-এর মতো কম্পাইলারগুলি এই গবেষণা কৌশলগুলির উপর নির্ভর করে, কিন্তু এটি ([Infer](https://fbinfer.com/), [CodeClimate](https://codeclimate.com/), [FindBugs](http://findbugs.sourceforge.net/) এবং ফর্মাল পদ্ধতির উপর ভিত্তি করে [Frama-C](https://frama-c.com/) এবং [Polyspace](https://www.mathworks.com/products/polyspace.html) -এর মতো টুলসগুলিকেও ভিত্তি করে। + +আমরা এখানে স্ট্যাটিক অ্যানালাইসিস কৌশল এবং গবেষকদের পুঙ্খানুপুঙ্খভাবে পর্যালোচনা করব না। পরিবর্তে, আমরা স্লিদার কীভাবে কাজ করে তা বোঝার জন্য যা প্রয়োজন তার উপর ফোকাস করব যাতে আপনি বাগ খুঁজে পেতে এবং কোড বুঝতে এটি আরও কার্যকরভাবে ব্যবহার করতে পারেন। + +- [কোড রিপ্রেজেন্টেশন](#code-representation) +- [কোড অ্যানালাইসিস](#analysis) +- [ইন্টারমিডিয়েট রিপ্রেজেন্টেশন](#intermediate-representation) + +### কোড রিপ্রেজেন্টেশন {#code-representation} + +ডাইনামিক অ্যানালাইসিসের বিপরীতে, যা একটি একক এক্সিকিউশন পথ সম্পর্কে যুক্তি দেয়, স্ট্যাটিক অ্যানালাইসিস একবারে সমস্ত পথ সম্পর্কে যুক্তি দেয়। এটি করার জন্য, এটি একটি ভিন্ন কোড রিপ্রেজেন্টেশনের উপর নির্ভর করে। দুটি সবচেয়ে সাধারণ হলো অ্যাবস্ট্র্যাক্ট সিনট্যাক্স ট্রি (AST) এবং কন্ট্রোল ফ্লো গ্রাফ (CFG)। + +### অ্যাবস্ট্র্যাক্ট সিনট্যাক্স ট্রি (AST) {#abstract-syntax-trees-ast} + +কম্পাইলার যখনই কোড পার্স করে তখনই AST ব্যবহার করা হয়। এটি সম্ভবত সবচেয়ে মৌলিক কাঠামো যার উপর স্ট্যাটিক অ্যানালাইসিস করা যেতে পারে। + +সংক্ষেপে, একটি AST হলো একটি স্ট্রাকচার্ড ট্রি যেখানে, সাধারণত, প্রতিটি লিফ একটি ভেরিয়েবল বা একটি কনস্ট্যান্ট ধারণ করে এবং ইন্টারনাল নোডগুলি হলো অপারেন্ড বা কন্ট্রোল ফ্লো অপারেশন। নিম্নলিখিত কোডটি বিবেচনা করুন: + +```solidity +function safeAdd(uint a, uint b) pure internal returns(uint){ + if(a + b <= a){ + revert(); + } + return a + b; +} +``` + +সংশ্লিষ্ট AST দেখানো হলো: + +![AST](./ast.png) + +স্লিদার solc দ্বারা এক্সপোর্ট করা AST ব্যবহার করে। + +তৈরি করা সহজ হলেও, AST একটি নেস্টেড কাঠামো। কখনও কখনও, এটি বিশ্লেষণ করার জন্য সবচেয়ে সহজবোধ্য নয়। উদাহরণস্বরূপ, `a + b <= a` এক্সপ্রেশন দ্বারা ব্যবহৃত অপারেশনগুলি সনাক্ত করতে, আপনাকে প্রথমে `<=` এবং তারপর `+` বিশ্লেষণ করতে হবে। একটি সাধারণ পদ্ধতি হলো তথাকথিত ভিজিটর প্যাটার্ন ব্যবহার করা, যা রিকার্সিভলি ট্রি-এর মাধ্যমে নেভিগেট করে। স্লিদার-এ [`ExpressionVisitor`](https://github.com/crytic/slither/blob/master/slither/visitors/expression/expression.py) -তে একটি জেনেরিক ভিজিটর রয়েছে। + +নিম্নলিখিত কোডটি এক্সপ্রেশনে একটি অ্যাডিশন আছে কিনা তা সনাক্ত করতে `ExpressionVisitor` ব্যবহার করে: + +```python +from slither.visitors.expression.expression import ExpressionVisitor +from slither.core.expressions.binary_operation import BinaryOperationType + +class HasAddition(ExpressionVisitor): + + def result(self): + return self._result + + def _post_binary_operation(self, expression): + if expression.type == BinaryOperationType.ADDITION: + self._result = True + +visitor = HasAddition(expression) # expression হলো সেই এক্সপ্রেশন যা পরীক্ষা করা হবে +print(f'এক্সপ্রেশন {expression}-এ একটি অ্যাডিশন আছে: {visitor.result()}') +``` + +### কন্ট্রোল ফ্লো গ্রাফ (CFG) {#control-flow-graph-cfg} + +দ্বিতীয় সবচেয়ে সাধারণ কোড রিপ্রেজেন্টেশন হলো কন্ট্রোল ফ্লো গ্রাফ (CFG)। এর নাম অনুসারে, এটি একটি গ্রাফ-ভিত্তিক রিপ্রেজেন্টেশন যা সমস্ত এক্সিকিউশন পথ প্রকাশ করে। প্রতিটি নোডে এক বা একাধিক ইন্সট্রাকশন থাকে। গ্রাফের এজগুলি কন্ট্রোল ফ্লো অপারেশন (if/then/else, loop, ইত্যাদি) উপস্থাপন করে। আমাদের আগের উদাহরণের CFG হলো: + +![CFG](./cfg.png) + +CFG হলো সেই রিপ্রেজেন্টেশন যার উপর ভিত্তি করে বেশিরভাগ অ্যানালাইসিস তৈরি করা হয়। + +আরও অনেক কোড রিপ্রেজেন্টেশন বিদ্যমান। আপনি যে অ্যানালাইসিস করতে চান সেই অনুযায়ী প্রতিটি রিপ্রেজেন্টেশনের সুবিধা এবং অসুবিধা রয়েছে। + +### অ্যানালাইসিস {#analysis} + +স্লিদার দিয়ে আপনি যে সবচেয়ে সহজ ধরনের অ্যানালাইসিস করতে পারেন তা হলো সিনট্যাকটিক অ্যানালাইসিস। + +### সিনট্যাক্স অ্যানালাইসিস {#syntax-analysis} + +স্লিদার কোডের বিভিন্ন উপাদান এবং তাদের রিপ্রেজেন্টেশনের মাধ্যমে নেভিগেট করে প্যাটার্ন ম্যাচিং-এর মতো একটি পদ্ধতি ব্যবহার করে অসামঞ্জস্যতা এবং ত্রুটি খুঁজে বের করতে পারে। + +উদাহরণস্বরূপ, নিম্নলিখিত ডিটেক্টরগুলি সিনট্যাক্স-সম্পর্কিত সমস্যাগুলি খুঁজে বের করে: + +- [স্টেট ভেরিয়েবল শ্যাডোইং](https://github.com/crytic/slither/wiki/Detector-Documentation#state-variable-shadowing): সমস্ত স্টেট ভেরিয়েবলের উপর ইটারেট করে এবং ইনহেরিট করা কন্ট্র্যাক্টের কোনো ভেরিয়েবলকে শ্যাডো করছে কিনা তা পরীক্ষা করে ([state.py#L51-L62](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/shadowing/state.py#L51-L62)) + +- [ভুল ERC20 ইন্টারফেস](https://github.com/crytic/slither/wiki/Detector-Documentation#incorrect-erc20-interface): ভুল ERC20 ফাংশন সিগনেচার খুঁজে বের করে ([incorrect_erc20_interface.py#L34-L55](https://github.com/crytic/slither/blob/0441338e055ab7151b30ca69258561a5a793f8ba/slither/detectors/erc/incorrect_erc20_interface.py#L34-L55)) + +### সেমান্টিক অ্যানালাইসিস {#semantic-analysis} + +সিনট্যাক্স অ্যানালাইসিসের বিপরীতে, একটি সেমান্টিক অ্যানালাইসিস আরও গভীরে গিয়ে কোডের “অর্থ” বিশ্লেষণ করে। এই পরিবারে কিছু বিস্তৃত ধরনের অ্যানালাইসিস অন্তর্ভুক্ত রয়েছে। এগুলো আরও শক্তিশালী এবং দরকারী ফলাফলের দিকে নিয়ে যায়, কিন্তু এগুলো লেখা আরও জটিল। + +সবচেয়ে উন্নত দুর্বলতা সনাক্তকরণের জন্য সেমান্টিক অ্যানালাইসিস ব্যবহার করা হয়। + +#### ডেটা ডিপেন্ডেন্সি অ্যানালাইসিস {#fixed-point-computation} + +একটি ভেরিয়েবল `variable_a`-কে `variable_b`-এর উপর ডেটা-ডিপেন্ডেন্ট বলা হয় যদি এমন একটি পথ থাকে যার জন্য `variable_a`-এর মান `variable_b` দ্বারা প্রভাবিত হয়। + +নিম্নলিখিত কোডে, `variable_a` `variable_b`-এর উপর নির্ভরশীল: + +```solidity +// ... +variable_a = variable_b + 1; +``` + +স্লিদার-এর বিল্ট-ইন [ডেটা ডিপেন্ডেন্সি](https://github.com/crytic/slither/wiki/data-dependency) ক্ষমতা রয়েছে, এর ইন্টারমিডিয়েট রিপ্রেজেন্টেশনের জন্য ধন্যবাদ (যা পরবর্তী বিভাগে আলোচনা করা হয়েছে)। + +ডেটা ডিপেন্ডেন্সি ব্যবহারের একটি উদাহরণ [বিপজ্জনক স্ট্রিক্ট ইকুয়ালিটি ডিটেক্টর](https://github.com/crytic/slither/wiki/Detector-Documentation#dangerous-strict-equalities)-এ পাওয়া যাবে। এখানে স্লিদার একটি বিপজ্জনক মানের সাথে স্ট্রিক্ট ইকুয়ালিটি তুলনা খুঁজবে ([incorrect_strict_equality.py#L86-L87](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L86-L87)), এবং ব্যবহারকারীকে জানাবে যে `==`-এর পরিবর্তে `>=` বা `<=` ব্যবহার করা উচিত, যাতে একজন আক্রমণকারী কন্ট্র্যাক্টকে ফাঁদে ফেলতে না পারে। অন্যান্য বিষয়গুলির মধ্যে, ডিটেক্টর `balanceOf(address)`-এ একটি কলের রিটার্ন মানকে বিপজ্জনক হিসাবে বিবেচনা করবে ([incorrect_strict_equality.py#L63-L64](https://github.com/crytic/slither/blob/6d86220a53603476f9567c3358524ea4db07fb25/slither/detectors/statements/incorrect_strict_equality.py#L63-L64)), এবং এর ব্যবহার ট্র্যাক করতে ডেটা ডিপেন্ডেন্সি ইঞ্জিন ব্যবহার করবে। + +#### ফিক্সড-পয়েন্ট কম্পিউটেশন {#fixed-point-computation} + +যদি আপনার অ্যানালাইসিস CFG-এর মাধ্যমে নেভিগেট করে এবং এজগুলি অনুসরণ করে, তাহলে আপনি সম্ভবত ইতিমধ্যে ভিজিট করা নোডগুলি দেখতে পাবেন। উদাহরণস্বরূপ, যদি একটি লুপ নীচে দেখানো হিসাবে উপস্থাপন করা হয়: + +```solidity +for(uint i; i < range; ++){ + variable_a += 1 +} +``` + +আপনার অ্যানালাইসিসকে জানতে হবে কখন থামতে হবে। এখানে দুটি প্রধান কৌশল রয়েছে: (1) প্রতিটি নোডে একটি সসীম সংখ্যক বার ইটারেট করা, (2) একটি তথাকথিত _ফিক্সপয়েন্ট_ গণনা করা। একটি ফিক্সপয়েন্ট মূলত বোঝায় যে এই নোডটি বিশ্লেষণ করা কোনো অর্থপূর্ণ তথ্য প্রদান করে না। + +ফিক্সপয়েন্ট ব্যবহারের একটি উদাহরণ রিএন্ট্রেন্সি ডিটেক্টরে পাওয়া যায়: স্লিদার নোডগুলি এক্সপ্লোর করে, এবং এক্সটার্নাল কল, সংগ্রহস্থলে লেখা এবং পড়া খুঁজে বের করে। একবার এটি একটি ফিক্সপয়েন্টে পৌঁছালে ([reentrancy.py#L125-L131](https://github.com/crytic/slither/blob/master/slither/detectors/reentrancy/reentrancy.py#L125-L131)), এটি এক্সপ্লোরেশন বন্ধ করে দেয়, এবং বিভিন্ন রিএন্ট্রেন্সি প্যাটার্নের মাধ্যমে ([reentrancy_benign.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_benign.py), [reentrancy_read_before_write.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_read_before_write.py), [reentrancy_eth.py](https://github.com/crytic/slither/blob/b275bcc824b1b932310cf03b6bfb1a1fef0ebae1/slither/detectors/reentrancy/reentrancy_eth.py)) একটি রিএন্ট্রেন্সি আছে কিনা তা দেখতে ফলাফল বিশ্লেষণ করে। + +কার্যকর ফিক্সড পয়েন্ট কম্পিউটেশন ব্যবহার করে অ্যানালাইসিস লেখার জন্য অ্যানালাইসিসটি কীভাবে তার তথ্য প্রচার করে সে সম্পর্কে একটি ভাল বোঝার প্রয়োজন। + +### ইন্টারমিডিয়েট রিপ্রেজেন্টেশন {#intermediate-representation} + +একটি ইন্টারমিডিয়েট রিপ্রেজেন্টেশন (IR) হলো এমন একটি ভাষা যা মূল ভাষার চেয়ে স্ট্যাটিক অ্যানালাইসিসের জন্য বেশি উপযোগী। স্লিদার Solidity-কে তার নিজস্ব IR: [SlithIR](https://github.com/crytic/slither/wiki/SlithIR)-এ অনুবাদ করে। + +আপনি যদি শুধুমাত্র বেসিক চেক লিখতে চান তবে SlithIR বোঝা প্রয়োজন নয়। তবে, আপনি যদি উন্নত সেমান্টিক অ্যানালাইসিস লেখার পরিকল্পনা করেন তবে এটি কাজে আসবে। [SlithIR](https://github.com/crytic/slither/wiki/Printer-documentation#slithir) এবং [SSA](https://github.com/crytic/slither/wiki/Printer-documentation#slithir-ssa) প্রিন্টারগুলি আপনাকে কোডটি কীভাবে অনুবাদ করা হয় তা বুঝতে সাহায্য করবে। + +## API বেসিকস {#api-basics} + +স্লিদারের একটি API আছে যা আপনাকে কন্ট্র্যাক্ট এবং তার ফাংশনগুলির মৌলিক বৈশিষ্ট্যগুলি এক্সপ্লোর করতে দেয়। + +একটি কোডবেস লোড করতে: + +```python +from slither import Slither +slither = Slither('/path/to/project') + +``` + +### কন্ট্র্যাক্ট এবং ফাংশন এক্সপ্লোর করা {#exploring-contracts-and-functions} + +একটি `Slither` অবজেক্টের আছে: + +- `contracts (list(Contract)`: কন্ট্র্যাক্টের তালিকা +- `contracts_derived (list(Contract)`: এমন কন্ট্র্যাক্টের তালিকা যা অন্য কোনো কন্ট্র্যাক্ট দ্বারা ইনহেরিট করা হয়নি (কন্ট্র্যাক্টের উপসেট) +- `get_contract_from_name (str)`: তার নাম থেকে একটি কন্ট্র্যাক্ট রিটার্ন করুন + +একটি `Contract` অবজেক্টের আছে: + +- `name (str)`: কন্ট্র্যাক্টের নাম +- `functions (list(Function))`: ফাংশনের তালিকা +- `modifiers (list(Modifier))`: মডিফায়ারের তালিকা +- `all_functions_called (list(Function/Modifier))`: কন্ট্র্যাক্ট দ্বারা পৌঁছানো যায় এমন সমস্ত ইন্টারনাল ফাংশনের তালিকা +- `inheritance (list(Contract))`: ইনহেরিটেড কন্ট্র্যাক্টের তালিকা +- `get_function_from_signature (str)`: তার সিগনেচার থেকে একটি ফাংশন রিটার্ন করুন +- `get_modifier_from_signature (str)`: তার সিগনেচার থেকে একটি মডিফায়ার রিটার্ন করুন +- `get_state_variable_from_name (str)`: তার নাম থেকে একটি StateVariable রিটার্ন করুন + +একটি `Function` বা একটি `Modifier` অবজেক্টের আছে: + +- `name (str)`: ফাংশনের নাম +- `contract (contract)`: যে কন্ট্র্যাক্টে ফাংশনটি ডিক্লেয়ার করা হয়েছে +- `nodes (list(Node))`: ফাংশন/মডিফায়ারের CFG গঠনকারী নোডগুলির তালিকা +- `entry_point (Node)`: CFG-এর এন্ট্রি পয়েন্ট +- `variables_read (list(Variable))`: পড়া ভেরিয়েবলের তালিকা +- `variables_written (list(Variable))`: লেখা ভেরিয়েবলের তালিকা +- `state_variables_read (list(StateVariable))`: পড়া স্টেট ভেরিয়েবলের তালিকা (variables`read-এর উপসেট) +- `state_variables_written (list(StateVariable))`: লেখা স্টেট ভেরিয়েবলের তালিকা (variables`written-এর উপসেট) diff --git a/public/content/translations/bn/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md b/public/content/translations/bn/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md new file mode 100644 index 00000000000..4c14b01d5fe --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/how-to-use-tellor-as-your-oracle/index.md @@ -0,0 +1,81 @@ +--- +title: "আপনার Oracle হিসাবে Tellor কীভাবে সেট আপ করবেন" +description: "আপনার প্রোটোকলে Tellor ওরাকলকে সংহত করার জন্য শুরু করার একটি নির্দেশিকা" +author: "Tellor" +lang: bn +tags: [ "সলিডিটি", "স্মার্ট কন্ট্র্যাক্ট", "ওরাকলস" ] +skill: beginner +published: 2021-06-29 +source: Tellor Docs +sourceUrl: https://docs.tellor.io/tellor/ +--- + +পপ কুইজ: আপনার প্রোটোকল প্রায় শেষ, কিন্তু অফচেইন ডেটা অ্যাক্সেস করার জন্য এটির একটি ওরাকল প্রয়োজন...আপনি কী করবেন? + +## (নরম) পূর্বশর্ত {#soft-prerequisites} + +এই পোস্টটির লক্ষ্য হল একটি ওরাকল ফিড অ্যাক্সেস করাকে যতটা সম্ভব সহজ এবং সরল করা। বলা বাহুল্য, ওরাকলের দিকটিতে ফোকাস করার জন্য আমরা আপনার কোডিং দক্ষতার স্তর সম্পর্কে নিম্নলিখিতগুলি ধরে নিচ্ছি। + +অনুমান: + +- আপনি একটি টার্মিনাল নেভিগেট করতে পারেন +- আপনার npm ইনস্টল করা আছে +- আপনি নির্ভরতা পরিচালনা করতে npm কীভাবে ব্যবহার করতে হয় তা জানেন + +Tellor হল একটি লাইভ এবং ওপেন-সোর্স ওরাকল যা বাস্তবায়নের জন্য প্রস্তুত। এই শিক্ষানবিসদের নির্দেশিকাটি এখানে Tellor-এর সাথে সহজে শুরু করা এবং চালানোর বিষয়টি প্রদর্শনের জন্য, যা আপনার প্রকল্পকে একটি সম্পূর্ণ বিকেন্দ্রীভূত এবং সেন্সরশিপ-প্রতিরোধী ওরাকল প্রদান করে। + +## একনজরে {#overview} + +Tellor হল একটি ওরাকল সিস্টেম যেখানে পক্ষগুলো একটি অফচেইন ডেটা পয়েন্টের (যেমন, BTC/USD) মান অনুরোধ করতে পারে এবং রিপোর্টাররা এই মানটি একটি অনচেইন ডেটা-ব্যাঙ্কে যোগ করার জন্য প্রতিযোগিতা করে, যা সমস্ত Ethereum স্মার্ট কন্ট্র্যাক্ট দ্বারা অ্যাক্সেসযোগ্য। এই ডেটা-ব্যাঙ্কের ইনপুটগুলি স্টেক করা রিপোর্টারদের একটি নেটওয়ার্ক দ্বারা সুরক্ষিত। Tellor ক্রিপ্টো-অর্থনৈতিক ইনসেনটিভ মেকানিজম ব্যবহার করে, রিপোর্টারদের দ্বারা সৎ ডেটা জমা দেওয়ার জন্য পুরস্কৃত করে এবং Tellor-এর টোকেন, Tributes (TRB) এবং একটি বিরোধ পদ্ধতির ইস্যুয়েন্সের মাধ্যমে খারাপ অভিনেতাদের শাস্তি দেয়। + +এই টিউটোরিয়ালে আমরা আলোচনা করব: + +- আপনার শুরু করার এবং চালানোর জন্য প্রয়োজনীয় প্রাথমিক টুলকিট সেট আপ করা। +- একটি সহজ উদাহরণের মাধ্যমে চলুন। +- আপনি বর্তমানে Tellor পরীক্ষা করতে পারেন এমন নেটওয়ার্কগুলির টেস্টনেট ঠিকানা তালিকাভুক্ত করুন। + +## UsingTellor {#usingtellor} + +প্রথম যে জিনিসটি আপনি করতে চাইবেন তা হল আপনার ওরাকল হিসাবে Tellor ব্যবহার করার জন্য প্রয়োজনীয় মৌলিক টুলস ইনস্টল করা। Tellor ব্যবহারকারী চুক্তিগুলি ইনস্টল করতে [এই প্যাকেজটি](https://github.com/tellor-io/usingtellor) ব্যবহার করুন: + +`npm install usingtellor` + +ইনস্টল হয়ে গেলে এটি আপনার চুক্তিগুলিকে 'UsingTellor' চুক্তি থেকে ফাংশনগুলি উত্তরাধিকার সূত্রে পেতে অনুমতি দেবে। + +দারুণ! এখন যেহেতু আপনার কাছে টুলস প্রস্তুত আছে, আসুন একটি সহজ অনুশীলনের মাধ্যমে যাই যেখানে আমরা বিটকয়েনের মূল্য পুনরুদ্ধার করি: + +### BTC/USD উদাহরণ {#btcusd-example} + +UsingTellor চুক্তিটি উত্তরাধিকার সূত্রে প্রাপ্ত করুন, কনস্ট্রাক্টর আর্গুমেন্ট হিসাবে Tellor ঠিকানাটি পাস করুন: + +এখানে একটি উদাহরণ: + +```solidity +import "usingtellor/contracts/UsingTellor.sol"; + +contract PriceContract is UsingTellor { + uint256 public btcPrice; + + //এই চুক্তিটির এখন UsingTellor-এর সমস্ত ফাংশনে অ্যাক্সেস রয়েছে + +constructor(address payable _tellorAddress) UsingTellor(_tellorAddress) public {} + +function setBtcPrice() public { + bytes memory _b = abi.encode("SpotPrice",abi.encode("btc","usd")); + bytes32 _queryId = keccak256(_b); + + uint256 _timestamp; + bytes _value; + + (_value, _timestamp) = getDataBefore(_queryId, block.timestamp - 15 minutes); + + btcPrice = abi.decode(_value,(uint256)); + } +} +``` + +চুক্তির ঠিকানাগুলির একটি সম্পূর্ণ তালিকার জন্য [এখানে](https://docs.tellor.io/tellor/the-basics/contracts-reference) দেখুন। + +ব্যবহারের সুবিধার জন্য, UsingTellor রেপো সহজে ইন্টিগ্রেশনের জন্য [Tellor Playground](https://github.com/tellor-io/TellorPlayground) চুক্তির একটি সংস্করণ সহ আসে। সহায়ক ফাংশনের তালিকার জন্য [এখানে](https://github.com/tellor-io/sampleUsingTellor#tellor-playground) দেখুন। + +Tellor ওরাকলের আরও শক্তিশালী বাস্তবায়নের জন্য, উপলব্ধ ফাংশনগুলির সম্পূর্ণ তালিকা [এখানে](https://github.com/tellor-io/usingtellor/blob/master/README.md) দেখুন। diff --git a/public/content/translations/bn/developers/tutorials/how-to-view-nft-in-metamask/index.md b/public/content/translations/bn/developers/tutorials/how-to-view-nft-in-metamask/index.md new file mode 100644 index 00000000000..05707f5f46c --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/how-to-view-nft-in-metamask/index.md @@ -0,0 +1,33 @@ +--- +title: "কীভাবে আপনার ওয়ালেটে আপনার NFT দেখবেন (NFT টিউটোরিয়াল সিরিজের পার্ট 3/3)" +description: "এই টিউটোরিয়ালটি বর্ণনা করে যে কিভাবে MetaMask-এ একটি বিদ্যমান NFT দেখতে হয়!" +author: "Sumi Mudgil" +tags: [ "ERC-721", "Alchemy", "Solidity" ] +skill: beginner +lang: bn +published: 2021-04-22 +--- + +এই টিউটোরিয়ালটি NFT টিউটোরিয়াল সিরিজের পার্ট 3/3, যেখানে আমরা আমাদের নতুন মিন্ট করা NFT দেখব। যাইহোক, আপনি Mainnet বা যেকোনো টেস্টনেট সহ MetaMask ব্যবহার করে যেকোনো ERC-721 টোকেনের জন্য সাধারণ টিউটোরিয়ালটি ব্যবহার করতে পারেন। আপনি যদি ইথেরিয়ামে আপনার নিজের NFT কীভাবে মিন্ট করবেন তা শিখতে চান, তাহলে আপনার [কীভাবে একটি NFT স্মার্ট কন্ট্র্যাক্ট লিখবেন এবং ডিপ্লয় করবেন তার পার্ট 1](/developers/tutorials/how-to-write-and-deploy-an-nft) দেখে নেওয়া উচিত! + +অভিনন্দন! আপনি আমাদের NFT টিউটোরিয়াল সিরিজের সবচেয়ে সংক্ষিপ্ত এবং সহজ অংশে পৌঁছেছেন — কীভাবে একটি ভার্চুয়াল ওয়ালেটে আপনার সদ্য মিন্ট করা NFT দেখবেন। আমরা এই উদাহরণের জন্য MetaMask ব্যবহার করব কারণ আমরা আগের দুটি অংশেও এটি ব্যবহার করেছি। + +একটি পূর্বশর্ত হিসাবে, আপনার মোবাইলে ইতিমধ্যেই MetaMask ইনস্টল করা উচিত, এবং এতে সেই অ্যাকাউন্টটি অন্তর্ভুক্ত থাকা উচিত যেখানে আপনি আপনার NFT মিন্ট করেছেন — আপনি [iOS](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) বা [Android](https://play.google.com/store/apps/details?id=io.metamask&hl=en_US&gl=US)-এ বিনামূল্যে অ্যাপটি পেতে পারেন। + +## ধাপ 1: আপনার নেটওয়ার্ক Sepolia-তে সেট করুন {#set-network-to-sepolia} + +অ্যাপের শীর্ষে, “Wallet” বোতাম টিপুন, যার পরে আপনাকে একটি নেটওয়ার্ক নির্বাচন করতে বলা হবে। যেহেতু আমাদের NFT Sepolia নেটওয়ার্কে মিন্ট করা হয়েছিল, তাই আপনি আপনার নেটওয়ার্ক হিসাবে Sepolia নির্বাচন করতে চাইবেন। + +![কীভাবে MetaMask মোবাইলে আপনার নেটওয়ার্ক হিসাবে Sepolia সেট করবেন](./goerliMetamask.gif) + +## ধাপ 2: আপনার সংগ্রহযোগ্য জিনিসটি MetaMask-এ যোগ করুন {#add-nft-to-metamask} + +আপনি Sepolia নেটওয়ার্কে গেলে, ডানদিকের “Collectibles” ট্যাবটি নির্বাচন করুন এবং NFT স্মার্ট কন্ট্র্যাক্ট ঠিকানা এবং আপনার NFT-এর ERC-721 টোকেন আইডি যোগ করুন — যা আপনি আমাদের টিউটোরিয়ালের পার্ট II-তে ডিপ্লয় করা আপনার NFT থেকে পাওয়া ট্রানজ্যাকশন হ্যাস-এর উপর ভিত্তি করে Etherscan-এ খুঁজে পেতে সক্ষম হবেন। + +![কীভাবে আপনার ট্রানজ্যাকশন হ্যাস এবং ERC-721 টোকেন আইডি খুঁজে বের করবেন](./findNFTEtherscan.png) + +আপনার NFT দেখতে আপনাকে কয়েকবার রিফ্রেশ করতে হতে পারে — তবে এটি সেখানে থাকবে ! + +![কীভাবে আপনার NFT MetaMask-এ আপলোড করবেন](./findNFTMetamask.gif) + +অভিনন্দন! আপনি সফলভাবে একটি NFT মিন্ট করেছেন, এবং আপনি এখন এটি দেখতে পারেন! আপনি কীভাবে NFT জগতে ঝড় তুলবেন তা দেখার জন্য আমরা অপেক্ষা করতে পারছি না! diff --git a/public/content/translations/bn/developers/tutorials/how-to-write-and-deploy-an-nft/index.md b/public/content/translations/bn/developers/tutorials/how-to-write-and-deploy-an-nft/index.md new file mode 100644 index 00000000000..4a3206c0949 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/how-to-write-and-deploy-an-nft/index.md @@ -0,0 +1,386 @@ +--- +title: "কিভাবে একটি NFT লিখবেন এবং স্থাপন করবেন (NFT টিউটোরিয়াল সিরিজের পর্ব ১/৩)" +description: "এই টিউটোরিয়ালটি হল NFT-এর উপর একটি সিরিজের পর্ব ১ যা আপনাকে ধাপে ধাপে শেখাবে কিভাবে Ethereum এবং ইন্টার প্ল্যানেটারি ফাইল সিস্টেম (IPFS) ব্যবহার করে একটি নন-ফাঞ্জিবল টোকেন (ERC-721 টোকেন) স্মার্ট কন্ট্র্যাক্ট লিখতে এবং স্থাপন করতে হয়।" +author: "Sumi Mudgil" +tags: + [ + "ERC-721", + "Alchemy", + "Solidity", + "স্মার্ট কন্ট্র্যাক্ট" + ] +skill: beginner +lang: bn +published: 2021-04-22 +--- + +NFT ব্লকচেইনকে জনসাধারণের দৃষ্টিতে নিয়ে আসার সাথে সাথে, Ethereum ব্লকচেইনে আপনার নিজের NFT কন্ট্র্যাক্ট (ERC-721 টোকেন) প্রকাশ করে এই হাইপটি নিজে বোঝার জন্য এটি একটি চমৎকার সুযোগ! + +Alchemy এনএফটি স্পেসের সবচেয়ে বড় নামগুলোকে শক্তি জোগাতে পেরে অত্যন্ত গর্বিত, যার মধ্যে রয়েছে Makersplace (সম্প্রতি ক্রিস্টি'স-এ $69 মিলিয়নের রেকর্ড ডিজিটাল আর্টওয়ার্ক বিক্রি করেছে), Dapper Labs (NBA টপ শট এবং ক্রিপ্টো কিটিসের নির্মাতা), OpenSea (বিশ্বের বৃহত্তম NFT মার্কেটপ্লেস), Zora, Super Rare, NFTfi, Foundation, Enjin, Origin Protocol, Immutable, এবং আরও অনেক কিছু। + +এই টিউটোরিয়ালে, আমরা [MetaMask](https://metamask.io/), [Solidity](https://docs.soliditylang.org/en/v0.8.0/), [Hardhat](https://hardhat.org/), [Pinata](https://pinata.cloud/) এবং [Alchemy](https://alchemy.com/signup/eth) ব্যবহার করে Sepolia টেস্ট নেটওয়ার্কে একটি ERC-721 স্মার্ট কন্ট্র্যাক্ট তৈরি এবং স্থাপন করার পদ্ধতি ধাপে ধাপে দেখাব (এর কোনোটির অর্থ যদি আপনি এখনও না বোঝেন তবে চিন্তা করবেন না — আমরা এটি ব্যাখ্যা করব!)। + +এই টিউটোরিয়ালের ২য় পর্বে আমরা দেখব কিভাবে আমরা আমাদের স্মার্ট কন্ট্র্যাক্ট ব্যবহার করে একটি NFT মিন্ট করতে পারি, এবং ৩য় পর্বে আমরা ব্যাখ্যা করব কিভাবে MetaMask-এ আপনার NFT দেখতে হয়। + +এবং অবশ্যই, কোনো সময়ে আপনার কোনো প্রশ্ন থাকলে, [Alchemy Discord](https://discord.gg/gWuC7zB)-এ যোগাযোগ করতে বা [Alchemy's NFT API ডক্স](https://docs.alchemy.com/alchemy/enhanced-apis/nft-api)-এ যেতে দ্বিধা করবেন না! + +## ধাপ ১: Ethereum নেটওয়ার্কের সাথে সংযুক্ত হন {#connect-to-ethereum} + +Ethereum ব্লকচেইনে অনুরোধ করার অনেক উপায় আছে, কিন্তু কাজ সহজ করার জন্য, আমরা [Alchemy](https://alchemy.com/signup/eth)-তে একটি বিনামূল্যের অ্যাকাউন্ট ব্যবহার করব, যা একটি ব্লকচেইন ডেভেলপার প্ল্যাটফর্ম এবং API, যা আমাদের নিজস্ব নোড না চালিয়েই Ethereum চেইনের সাথে যোগাযোগ করতে দেয়। + +এই টিউটোরিয়ালে, আমরা পর্যবেক্ষণ এবং বিশ্লেষণের জন্য Alchemy-এর ডেভেলপার টুলগুলোর সুবিধাও নেব, যাতে আমাদের স্মার্ট কন্ট্র্যাক্ট স্থাপনার নেপথ্যে কী ঘটছে তা বোঝা যায়। যদি আপনার আগে থেকেই কোনো Alchemy অ্যাকাউন্ট না থাকে, তাহলে আপনি বিনামূল্যে [এখানে](https://alchemy.com/signup/eth) সাইন আপ করতে পারেন। + +## ধাপ ২: আপনার অ্যাপ তৈরি করুন (এবং API কী) {#make-api-key} + +একবার আপনি একটি Alchemy অ্যাকাউন্ট তৈরি করে ফেললে, আপনি একটি অ্যাপ তৈরি করে একটি API কী জেনারেট করতে পারেন। এটি আমাদের Sepolia টেস্ট নেটওয়ার্কে অনুরোধ করার অনুমতি দেবে। টেস্ট নেটওয়ার্ক সম্পর্কে আরও জানতে আগ্রহী হলে [এই নির্দেশিকা](https://docs.alchemyapi.io/guides/choosing-a-network) দেখুন। + +1. আপনার Alchemy ড্যাশবোর্ডে "অ্যাপ তৈরি করুন" পৃষ্ঠাতে নেভিগেট করতে নেভ বারে "অ্যাপস"-এর উপর হোভার করে "অ্যাপ তৈরি করুন"-এ ক্লিক করুন + +![আপনার অ্যাপ তৈরি করুন](./create-your-app.png) + +2. আপনার অ্যাপের একটি নাম দিন (আমরা “আমার প্রথম NFT!” বেছে নিয়েছি), একটি সংক্ষিপ্ত বিবরণ দিন, চেইনের জন্য “Ethereum” নির্বাচন করুন, এবং আপনার নেটওয়ার্কের জন্য “Sepolia” বেছে নিন। দ্য মার্জ-এর পর থেকে অন্যান্য টেস্টনেটগুলো বাতিল করা হয়েছে। + +![আপনার অ্যাপ কনফিগার করুন এবং প্রকাশ করুন](./alchemy-explorer-sepolia.png) + +3. “অ্যাপ তৈরি করুন”-এ ক্লিক করুন এবং ব্যস! আপনার অ্যাপটি নীচের টেবিলে প্রদর্শিত হওয়া উচিত। + +## ধাপ ৩: একটি Ethereum অ্যাকাউন্ট (অ্যাড্রেস) তৈরি করুন {#create-eth-address} + +লেনদেন পাঠানো এবং গ্রহণ করার জন্য আমাদের একটি Ethereum অ্যাকাউন্ট প্রয়োজন। এই টিউটোরিয়ালের জন্য, আমরা MetaMask ব্যবহার করব, যা ব্রাউজারের একটি ভার্চুয়াল ওয়ালেট এবং আপনার Ethereum অ্যাকাউন্ট অ্যাড্রেস পরিচালনা করতে ব্যবহৃত হয়। আপনি যদি Ethereum-এ লেনদেন কিভাবে কাজ করে সে সম্পর্কে আরও বুঝতে চান, তাহলে ইথেরিয়াম ফাইন্ডেশনের [এই পৃষ্ঠাটি](/developers/docs/transactions/) দেখুন। + +আপনি [এখানে](https://metamask.io/download) বিনামূল্যে একটি MetaMask অ্যাকাউন্ট ডাউনলোড এবং তৈরি করতে পারেন। আপনি যখন একটি অ্যাকাউন্ট তৈরি করছেন, বা যদি আপনার ইতিমধ্যে একটি অ্যাকাউন্ট থাকে, তখন উপরের ডানদিকে থাকা “Sepolia Test Network”-এ স্যুইচ করতে ভুলবেন না (যাতে আমরা আসল টাকা নিয়ে কাজ না করি)। + +![আপনার নেটওয়ার্ক হিসাবে Sepolia সেট করুন](./metamask-goerli.png) + +## ধাপ ৪: একটি ফসেট থেকে ইথার যোগ করুন {#step-4-add-ether-from-a-faucet} + +আমাদের স্মার্ট কন্ট্র্যাক্টটি টেস্ট নেটওয়ার্কে স্থাপন করার জন্য আমাদের কিছু নকল ETH লাগবে। ETH পেতে আপনি Alchemy দ্বারা হোস্ট করা [Sepolia Faucet](https://sepoliafaucet.com/)-এ যেতে পারেন, লগ ইন করে আপনার অ্যাকাউন্ট অ্যাড্রেস লিখুন, এবং “আমাকে ETH পাঠান”-এ ক্লিক করুন। এর কিছুক্ষণ পরেই আপনার MetaMask অ্যাকাউন্টে ETH দেখতে পাওয়ার কথা! + +## ধাপ ৫: আপনার ব্যালেন্স পরীক্ষা করুন {#check-balance} + +আমাদের ব্যালেন্স আছে কিনা তা দুবার পরীক্ষা করতে, আসুন [Alchemy’s composer tool](https://composer.alchemyapi.io?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D) ব্যবহার করে একটি [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) অনুরোধ করি। এটি আমাদের ওয়ালেটে থাকা ETH-এর পরিমাণ ফেরত দেবে। আপনার MetaMask অ্যাকাউন্ট অ্যাড্রেস ইনপুট করার পরে এবং “অনুরোধ পাঠান”-এ ক্লিক করার পরে, আপনার এইরকম একটি প্রতিক্রিয়া দেখা উচিত: + + ``` + `{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"}` + ``` + +> **দ্রষ্টব্য** এই ফলাফলটি wei-তে, ETH-এ নয়। Wei ইথারের ক্ষুদ্রতম একক হিসাবে ব্যবহৃত হয়। wei থেকে ETH-এ রূপান্তর হল 1 eth = 1018 wei। সুতরাং যদি আমরা 0xde0b6b3a7640000-কে দশমিকে রূপান্তর করি তাহলে আমরা 1\*1018 wei পাই, যা 1 ETH-এর সমান। + +যাক বাবা! আমাদের নকল টাকা সব আছে। + +## ধাপ ৬: আমাদের প্রজেক্ট শুরু করুন {#initialize-project} + +প্রথমে, আমাদের প্রজেক্টের জন্য একটি ফোল্ডার তৈরি করতে হবে। আপনার কমান্ড লাইনে যান এবং টাইপ করুন: + + ``` + mkdir my-nft + cd my-nft + ``` + +এখন যেহেতু আমরা আমাদের প্রজেক্ট ফোল্ডারের ভিতরে আছি, আমরা প্রজেক্টটি শুরু করতে npm init ব্যবহার করব। আপনার যদি ইতিমধ্যে npm ইনস্টল করা না থাকে, তাহলে [এই নির্দেশাবলী](https://docs.alchemyapi.io/alchemy/guides/alchemy-for-macs#1-install-nodejs-and-npm) অনুসরণ করুন (আমাদের [Node.js](https://nodejs.org/en/download/)-ও লাগবে, তাই সেটিও ডাউনলোড করুন!)। + + ``` + npm init + ``` + +ইনস্টলেশনের প্রশ্নগুলোর উত্তর আপনি কীভাবে দেন তা সত্যিই গুরুত্বপূর্ণ নয়; রেফারেন্সের জন্য আমরা এটি কীভাবে করেছি তা এখানে দেওয়া হল: + +```json + প্যাকেজের নাম: (my-nft) + সংস্করণ: (1.0.0) + বিবরণ: আমার প্রথম NFT! + এন্ট্রি পয়েন্ট: (index.js) + টেস্ট কমান্ড: + গিট রিপোজিটরি: + কীওয়ার্ড: + লেখক: + লাইসেন্স: (ISC) + /Users/thesuperb1/Desktop/my-nft/package.json-এ লেখা হচ্ছে: + + { + "name": "my-nft", + "version": "1.0.0", + "description": "আমার প্রথম NFT!", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" + } +``` + +package.json অনুমোদন করুন, এবং আমরা এগিয়ে যাওয়ার জন্য প্রস্তুত! + +## ধাপ ৭: [Hardhat](https://hardhat.org/getting-started/#overview) ইনস্টল করুন {#install-hardhat} + +Hardhat হল আপনার Ethereum সফ্টওয়্যার কম্পাইল, স্থাপন, পরীক্ষা এবং ডিবাগ করার জন্য একটি ডেভেলপমেন্ট পরিবেশ। এটি ডেভেলপারদের লাইভ চেইনে স্থাপন করার আগে স্থানীয়ভাবে স্মার্ট কন্ট্র্যাক্ট এবং ডিএ্যাপস তৈরি করতে সাহায্য করে। + +আমাদের my-nft প্রজেক্টের ভিতরে চালান: + + ``` + npm install --save-dev hardhat + ``` + +[ইনস্টলেশন নির্দেশাবলী](https://hardhat.org/getting-started/#overview) সম্পর্কে আরও বিস্তারিত জানতে এই পৃষ্ঠাটি দেখুন। + +## ধাপ ৮: Hardhat প্রজেক্ট তৈরি করুন {#create-hardhat-project} + +আমাদের প্রজেক্ট ফোল্ডারের ভিতরে চালান: + + ``` + npx hardhat + ``` + +তারপরে আপনার একটি স্বাগত বার্তা এবং আপনি কী করতে চান তা নির্বাচন করার একটি বিকল্প দেখতে পাওয়া উচিত। “একটি খালি hardhat.config.js তৈরি করুন” নির্বাচন করুন: + + ``` + 888 888 888 888 888 + 888 888 888 888 888 + 888 888 888 888 888 + 8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 + 888 888 "88b 888P" d88" 888 888 "88b "88b 888 + 888 888 .d888888 888 888 888 888 888 .d888888 888 + 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. + 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 + 👷 Hardhat v2.0.11-এ স্বাগতম 👷‍ + ? আপনি কি করতে চান? ... + একটি নমুনা প্রজেক্ট তৈরি করুন + ❯ একটি খালি hardhat.config.js তৈরি করুন + প্রস্থান + ``` + +এটি আমাদের জন্য একটি hardhat.config.js ফাইল তৈরি করবে যেখানে আমরা আমাদের প্রজেক্টের সমস্ত সেট আপ নির্দিষ্ট করব (ধাপ ১৩-তে)। + +## ধাপ ৯: প্রজেক্ট ফোল্ডার যোগ করুন {#add-project-folders} + +আমাদের প্রজেক্টকে সংগঠিত রাখতে, আমরা দুটি নতুন ফোল্ডার তৈরি করব। আপনার কমান্ড লাইনে আপনার প্রজেক্টের রুট ডিরেক্টরিতে নেভিগেট করুন এবং টাইপ করুন: + + ``` + mkdir contracts + mkdir scripts + ``` + +- contracts/ এখানেই আমরা আমাদের NFT স্মার্ট কন্ট্র্যাক্ট কোড রাখব + +- scripts/ এখানেই আমরা আমাদের স্মার্ট কন্ট্র্যাক্ট স্থাপন এবং তার সাথে ইন্টারঅ্যাক্ট করার জন্য স্ক্রিপ্ট রাখব + +## ধাপ ১০: আমাদের কন্ট্র্যাক্ট লিখুন {#write-contract} + +এখন যেহেতু আমাদের পরিবেশ সেট আপ করা হয়েছে, আসুন আরও উত্তেজনাপূর্ণ জিনিসগুলিতে যাই: _আমাদের স্মার্ট কন্ট্র্যাক্ট কোড লেখা!_ + +আপনার প্রিয় এডিটরে my-nft প্রজেক্টটি খুলুন (আমরা [VSCode](https://code.visualstudio.com/) পছন্দ করি)। স্মার্ট কন্ট্র্যাক্টগুলো সলিডিটি নামক একটি ভাষায় লেখা হয় যা আমরা আমাদের MyNFT.sol স্মার্ট কন্ট্র্যাক্ট লিখতে ব্যবহার করব। + +1. `contracts` ফোল্ডারে নেভিগেট করুন এবং MyNFT.sol নামে একটি নতুন ফাইল তৈরি করুন + +2. নীচে আমাদের NFT স্মার্ট কন্ট্র্যাক্ট কোড দেওয়া হল, যা আমরা [OpenZeppelin](https://docs.openzeppelin.com/contracts/3.x/erc721) লাইব্রেরির ERC-721 বাস্তবায়নের উপর ভিত্তি করে তৈরি করেছি। নীচের বিষয়বস্তুগুলি আপনার MyNFT.sol ফাইলে কপি এবং পেস্ট করুন। + + ```solidity + //কন্ট্র্যাক্টটি [https://docs.openzeppelin.com/contracts/3.x/erc721](https://docs.openzeppelin.com/contracts/3.x/erc721)-এর উপর ভিত্তি করে তৈরি + // SPDX-License-Identifier: MIT + pragma solidity ^0.8.0; + + import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; + import "@openzeppelin/contracts/utils/Counters.sol"; + import "@openzeppelin/contracts/access/Ownable.sol"; + import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; + + contract MyNFT is ERC721URIStorage, Ownable { + using Counters for Counters.Counter; + Counters.Counter private _tokenIds; + + constructor() ERC721("MyNFT", "NFT") {} + + function mintNFT(address recipient, string memory tokenURI) + public onlyOwner + returns (uint256) + { + _tokenIds.increment(); + + uint256 newItemId = _tokenIds.current(); + _mint(recipient, newItemId); + _setTokenURI(newItemId, tokenURI); + + return newItemId; + } + } + ``` + +3. যেহেতু আমরা OpenZeppelin কন্ট্র্যাক্ট লাইব্রেরি থেকে ক্লাস ইনহেরিট করছি, আপনার কমান্ড লাইনে `npm install @openzeppelin/contracts^4.0.0` রান করে আমাদের ফোল্ডারে লাইব্রেরিটি ইনস্টল করুন। + +তো, এই কোডটি আসলে _কী_ করে? আসুন এটি লাইন-বাই-লাইন ভেঙে দেখি। + +আমাদের স্মার্ট কন্ট্র্যাক্টের শীর্ষে, আমরা তিনটি [OpenZeppelin](https://openzeppelin.com/) স্মার্ট কন্ট্র্যাক্ট ক্লাস ইম্পোর্ট করি: + +- @openzeppelin/contracts/token/ERC721/ERC721.sol-এ ERC-721 স্ট্যান্ডার্ডের বাস্তবায়ন রয়েছে, যা আমাদের NFT স্মার্ট কন্ট্র্যাক্ট ইনহেরিট করবে। (একটি বৈধ NFT হতে হলে, আপনার স্মার্ট কন্ট্র্যাক্টকে অবশ্যই ERC-721 স্ট্যান্ডার্ডের সমস্ত পদ্ধতি বাস্তবায়ন করতে হবে।) ইনহেরিট করা ERC-721 ফাংশন সম্পর্কে আরও জানতে, [এখানে](https://eips.ethereum.org/EIPS/eip-721) ইন্টারফেস সংজ্ঞাটি দেখুন। + +- @openzeppelin/contracts/utils/Counters.sol এমন কাউন্টার সরবরাহ করে যা শুধুমাত্র এক করে বাড়ানো বা কমানো যায়। আমাদের স্মার্ট কন্ট্র্যাক্ট মোট মিন্ট করা NFT-এর সংখ্যা ট্র্যাক করতে এবং আমাদের নতুন NFT-তে অনন্য আইডি সেট করতে একটি কাউন্টার ব্যবহার করে। (একটি স্মার্ট কন্ট্র্যাক্ট ব্যবহার করে মিন্ট করা প্রতিটি NFT-কে একটি অনন্য আইডি বরাদ্দ করতে হবে — এখানে আমাদের অনন্য আইডিটি কেবল অস্তিত্বে থাকা মোট NFT-এর সংখ্যা দ্বারা নির্ধারিত হয়। উদাহরণস্বরূপ, আমাদের স্মার্ট কন্ট্র্যাক্ট দিয়ে মিন্ট করা প্রথম NFT-এর আইডি হল "1", আমাদের দ্বিতীয় NFT-এর আইডি হল "2", ইত্যাদি।) + +- @openzeppelin/contracts/access/Ownable.sol আমাদের স্মার্ট কন্ট্র্যাক্টে [অ্যাক্সেস কন্ট্রোল](https://docs.openzeppelin.com/contracts/3.x/access-control) সেট আপ করে, যাতে শুধুমাত্র স্মার্ট কন্ট্র্যাক্টের মালিক (আপনি) NFT মিন্ট করতে পারেন। (দ্রষ্টব্য, অ্যাক্সেস কন্ট্রোল অন্তর্ভুক্ত করা সম্পূর্ণরূপে একটি পছন্দের বিষয়। আপনি যদি চান যে কেউ আপনার স্মার্ট কন্ট্র্যাক্ট ব্যবহার করে একটি NFT মিন্ট করতে পারুক, তাহলে ১০ নম্বর লাইনের Ownable শব্দটি এবং ১৭ নম্বর লাইনের onlyOwner শব্দটি সরিয়ে দিন।) + +আমাদের ইম্পোর্ট স্টেটমেন্টের পরে, আমাদের কাস্টম NFT স্মার্ট কন্ট্র্যাক্ট রয়েছে, যা আশ্চর্যজনকভাবে ছোট — এতে শুধুমাত্র একটি কাউন্টার, একটি কনস্ট্রাক্টর এবং একটি একক ফাংশন রয়েছে! এটি আমাদের ইনহেরিট করা OpenZeppelin কন্ট্র্যাক্টগুলোর জন্য ধন্যবাদ, যা একটি NFT তৈরি করার জন্য প্রয়োজনীয় বেশিরভাগ পদ্ধতি বাস্তবায়ন করে, যেমন `ownerOf` যা NFT-এর মালিককে ফেরত দেয়, এবং `transferFrom`, যা NFT-এর মালিকানা এক অ্যাকাউন্ট থেকে অন্য অ্যাকাউন্টে স্থানান্তর করে। + +আমাদের ERC-721 কনস্ট্রাক্টরে, আপনি লক্ষ্য করবেন আমরা দুটি স্ট্রিং, “MyNFT” এবং “NFT” পাস করি। প্রথম ভ্যারিয়েবলটি হল স্মার্ট কন্ট্র্যাক্টের নাম এবং দ্বিতীয়টি হল এর প্রতীক। আপনি এই ভ্যারিয়েবলগুলোর প্রত্যেকটির নাম যা ইচ্ছা তাই রাখতে পারেন! + +অবশেষে, আমাদের `mintNFT(address recipient, string memory tokenURI)` ফাংশন রয়েছে যা আমাদের একটি NFT মিন্ট করতে দেয়! আপনি লক্ষ্য করবেন এই ফাংশনটি দুটি ভ্যারিয়েবল গ্রহণ করে: + +- `address recipient` সেই অ্যাড্রেসটি নির্দিষ্ট করে যা আপনার সদ্য মিন্ট করা NFT পাবে + +- `string memory tokenURI` হল একটি স্ট্রিং যা একটি JSON ডকুমেন্টে সমাধান করা উচিত যা NFT-এর মেটাডেটা বর্ণনা করে। একটি NFT-এর মেটাডেটা সত্যিই এটিকে জীবন্ত করে তোলে, এটিকে কনফিগারযোগ্য বৈশিষ্ট্য যেমন একটি নাম, বিবরণ, ছবি এবং অন্যান্য অ্যাট্রিবিউট থাকার অনুমতি দেয়। এই টিউটোরিয়ালের ২য় পর্বে, আমরা এই মেটাডেটা কীভাবে কনফিগার করতে হয় তা বর্ণনা করব। + +`mintNFT` ইনহেরিট করা ERC-721 লাইব্রেরি থেকে কিছু পদ্ধতি কল করে, এবং অবশেষে একটি সংখ্যা ফেরত দেয় যা সদ্য মিন্ট করা NFT-এর আইডি প্রতিনিধিত্ব করে। + +## ধাপ ১১: MetaMask ও Alchemy-কে আপনার প্রজেক্টের সাথে সংযুক্ত করুন {#connect-metamask-and-alchemy} + +এখন যেহেতু আমরা একটি MetaMask ওয়ালেট, Alchemy অ্যাকাউন্ট তৈরি করেছি এবং আমাদের স্মার্ট কন্ট্র্যাক্ট লিখেছি, এখন এই তিনটিকে সংযুক্ত করার সময়। + +আপনার ভার্চুয়াল ওয়ালেট থেকে পাঠানো প্রতিটি লেনদেনের জন্য আপনার অনন্য ব্যক্তিগত কী ব্যবহার করে একটি স্বাক্ষরের প্রয়োজন। আমাদের প্রোগ্রামকে এই অনুমতি দেওয়ার জন্য, আমরা আমাদের ব্যক্তিগত কী (এবং Alchemy API কী) একটি এনভায়রনমেন্ট ফাইলে নিরাপদে সংরক্ষণ করতে পারি। + +লেনদেন পাঠানো সম্পর্কে আরও জানতে, ওয়েব3 ব্যবহার করে লেনদেন পাঠানোর উপর [এই টিউটোরিয়ালটি](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) দেখুন। + +প্রথমে, আপনার প্রজেক্ট ডিরেক্টরিতে ডটএনভ প্যাকেজটি ইনস্টল করুন: + + ``` + npm install dotenv --save + ``` + +তারপর, আমাদের প্রজেক্টের রুট ডিরেক্টরিতে একটি `.env` ফাইল তৈরি করুন, এবং এতে আপনার MetaMask ব্যক্তিগত কী এবং HTTP Alchemy API URL যোগ করুন। + +- MetaMask থেকে আপনার ব্যক্তিগত কী এক্সপোর্ট করতে [এই নির্দেশাবলী](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) অনুসরণ করুন + +- HTTP Alchemy API URL পেতে নীচে দেখুন এবং এটি আপনার ক্লিপবোর্ডে কপি করুন + +![আপনার Alchemy API URL কপি করুন](./copy-alchemy-api-url.gif) + +আপনার `.env` এখন এইরকম দেখতে হবে: + + ``` + API_URL="https://eth-sepolia.g.alchemy.com/v2/your-api-key" + PRIVATE_KEY="your-metamask-private-key" + ``` + +এগুলিকে আমাদের কোডের সাথে আসলে সংযুক্ত করতে, আমরা ধাপ ১৩-তে আমাদের hardhat.config.js ফাইলে এই ভ্যারিয়েবলগুলিকে রেফারেন্স করব। + + + +## ধাপ ১২: Ethers.js ইনস্টল করুন {#install-ethers} + +Ethers.js একটি লাইব্রেরি যা [স্ট্যান্ডার্ড JSON-RPC পদ্ধতিগুলিকে](/developers/docs/apis/json-rpc/) আরও ব্যবহারকারী-বান্ধব পদ্ধতির সাথে র‍্যাপ করে Ethereum-এর সাথে ইন্টারঅ্যাক্ট করা এবং অনুরোধ করা সহজ করে তোলে। + +Hardhat অতিরিক্ত টুলিং এবং বর্ধিত কার্যকারিতার জন্য [প্লাগইন](https://hardhat.org/plugins/) একীভূত করা খুব সহজ করে তোলে। আমরা কন্ট্র্যাক্ট স্থাপনার জন্য [Ethers প্লাগইন](https://hardhat.org/docs/plugins/official-plugins#hardhat-ethers) এর সুবিধা নেব ([Ethers.js](https://github.com/ethers-io/ethers.js/)-এর কিছু খুব পরিষ্কার কন্ট্র্যাক্ট স্থাপন পদ্ধতি রয়েছে)। + +আপনার প্রজেক্ট ডিরেক্টরিতে টাইপ করুন: + + ``` + npm install --save-dev @nomiclabs/hardhat-ethers ethers@^5.0.0 + ``` + +আমরা পরবর্তী ধাপে আমাদের hardhat.config.js-এ ethers-এর প্রয়োজনও উল্লেখ করব। + +## ধাপ ১৩: hardhat.config.js আপডেট করুন {#update-hardhat-config} + +আমরা এখন পর্যন্ত বেশ কিছু ডিপেন্ডেন্সি এবং প্লাগইন যোগ করেছি, এখন আমাদের hardhat.config.js আপডেট করতে হবে যাতে আমাদের প্রজেক্ট সেগুলির সব সম্পর্কে জানতে পারে। + +আপনার hardhat.config.js আপডেট করে এটিকে এইরকম করুন: + +```js + /** + * @type import('hardhat/config').HardhatUserConfig + */ + require('dotenv').config(); + require("@nomiclabs/hardhat-ethers"); + const { API_URL, PRIVATE_KEY } = process.env; + module.exports = { + solidity: "0.8.1", + defaultNetwork: "sepolia", + networks: { + hardhat: {}, + sepolia: { + url: API_URL, + accounts: [`0x${PRIVATE_KEY}`] + } + }, + } +``` + +## ধাপ ১৪: আমাদের কন্ট্র্যাক্ট কম্পাইল করুন {#compile-contract} + +সবকিছু ঠিকঠাক কাজ করছে কিনা তা নিশ্চিত করতে, আসুন আমাদের কন্ট্র্যাক্ট কম্পাইল করি। কম্পাইল টাস্কটি হার্ডহ্যাটের বিল্ট-ইন টাস্কগুলির মধ্যে একটি। + +কমান্ড লাইন থেকে রান করুন: + + ``` + npx hardhat compile + ``` + +আপনি সোর্স ফাইলে SPDX লাইসেন্স আইডেন্টিফায়ার সরবরাহ করা হয়নি বলে একটি সতর্কবার্তা পেতে পারেন, কিন্তু সে বিষয়ে চিন্তা করার দরকার নেই — আশা করি বাকি সব ঠিকঠাক দেখাবে! যদি না হয়, আপনি সবসময় [Alchemy ডিসকর্ড](https://discord.gg/u72VCg3)-এ বার্তা দিতে পারেন। + +## ধাপ ১৫: আমাদের ডেপ্লয় স্ক্রিপ্ট লিখুন {#write-deploy} + +এখন যেহেতু আমাদের কন্ট্র্যাক্ট লেখা হয়ে গেছে এবং আমাদের কনফিগারেশন ফাইল প্রস্তুত, এখন আমাদের কন্ট্র্যাক্ট ডেপ্লয় স্ক্রিপ্ট লেখার সময়। + +`scripts/` ফোল্ডারে নেভিগেট করুন এবং `deploy.js` নামে একটি নতুন ফাইল তৈরি করুন, এতে নিম্নলিখিত বিষয়বস্তু যোগ করুন: + +```js +async function main() { + const MyNFT = await ethers.getContractFactory("MyNFT") + + // ডেপ্লয়মেন্ট শুরু করুন, একটি প্রমিস রিটার্ন করে যা একটি কন্ট্র্যাক্ট অবজেক্টে সমাধান করে + const myNFT = await MyNFT.deploy() + await myNFT.deployed() + console.log("কন্ট্র্যাক্টটি এই অ্যাড্রেসে ডেপ্লয় করা হয়েছে:", myNFT.address) +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) +``` + +Hardhat তাদের [কন্ট্র্যাক্টস টিউটোরিয়াল](https://hardhat.org/tutorial/testing-contracts.html#writing-tests)-এ এই কোডের প্রতিটি লাইন কী করে তা চমৎকারভাবে ব্যাখ্যা করেছে, আমরা এখানে তাদের ব্যাখ্যাগুলি গ্রহণ করেছি। + + ``` + const MyNFT = await ethers.getContractFactory("MyNFT"); + ``` + +ethers.js-এ একটি ContractFactory হল নতুন স্মার্ট কন্ট্র্যাক্ট স্থাপন করতে ব্যবহৃত একটি অ্যাবস্ট্র্যাকশন, তাই MyNFT এখানে আমাদের NFT কন্ট্র্যাক্টের উদাহরণগুলির জন্য একটি ফ্যাক্টরি। hardhat-ethers প্লাগইন ব্যবহার করার সময় ContractFactory এবং Contract উদাহরণগুলি ডিফল্টরূপে প্রথম সাইনারের সাথে সংযুক্ত থাকে। + + ``` + const myNFT = await MyNFT.deploy(); + ``` + +একটি ContractFactory-তে deploy() কল করলে ডেপ্লয়মেন্ট শুরু হবে, এবং একটি প্রমিস রিটার্ন করবে যা একটি Contract-এ সমাধান করে। এটি সেই অবজেক্ট যার আমাদের প্রতিটি স্মার্ট কন্ট্র্যাক্ট ফাংশনের জন্য একটি পদ্ধতি রয়েছে। + +## ধাপ ১৬: আমাদের কন্ট্র্যাক্ট স্থাপন করুন {#deploy-contract} + +আমরা অবশেষে আমাদের স্মার্ট কন্ট্র্যাক্ট স্থাপন করার জন্য প্রস্তুত! আপনার প্রজেক্ট ডিরেক্টরির রুটে ফিরে যান, এবং কমান্ড লাইনে রান করুন: + + ``` + npx hardhat --network sepolia run scripts/deploy.js + ``` + +তারপরে আপনার এইরকম কিছু দেখা উচিত: + + ``` + কন্ট্র্যাক্টটি এই অ্যাড্রেসে স্থাপন করা হয়েছে: 0x4C5266cCc4b3F426965d2f51b6D910325a0E7650 + ``` + +যদি আমরা [Sepolia etherscan](https://sepolia.etherscan.io/)-এ যাই এবং আমাদের কন্ট্র্যাক্ট অ্যাড্রেস অনুসন্ধান করি, আমরা দেখতে পাব যে এটি সফলভাবে স্থাপন করা হয়েছে। আপনি যদি এটি অবিলম্বে দেখতে না পান, অনুগ্রহ করে কিছুক্ষণ অপেক্ষা করুন কারণ এতে কিছুটা সময় লাগতে পারে। লেনদেনটি এইরকম কিছু দেখাবে: + +![Etherscan-এ আপনার লেনদেনের ঠিকানা দেখুন](./etherscan-sepoila-contract-creation.png) + +From অ্যাড্রেসটি আপনার MetaMask অ্যাকাউন্টের অ্যাড্রেসের সাথে মিলতে হবে এবং To অ্যাড্রেসে “কন্ট্র্যাক্ট ক্রিয়েশন” লেখা থাকবে। যদি আমরা লেনদেনটিতে ক্লিক করি, আমরা To ফিল্ডে আমাদের কন্ট্র্যাক্ট অ্যাড্রেস দেখতে পাব: + +![Etherscan-এ আপনার কন্ট্র্যাক্টের ঠিকানা দেখুন](./etherscan-sepolia-tx-details.png) + +দারুণ! আপনি এইমাত্র আপনার NFT স্মার্ট কন্ট্র্যাক্টটি Ethereum (টেস্টনেট) চেইনে স্থাপন করেছেন! + +নেপথ্যে কী ঘটছে তা বোঝার জন্য, আসুন আমাদের [Alchemy ড্যাশবোর্ড](https://dashboard.alchemyapi.io/explorer)-এর এক্সপ্লোরার ট্যাবে নেভিগেট করি। আপনার যদি একাধিক Alchemy অ্যাপ থাকে তবে অ্যাপ দ্বারা ফিল্টার করে “MyNFT” নির্বাচন করতে ভুলবেন না। + +![Alchemy-এর এক্সপ্লোরার ড্যাশবোর্ড দিয়ে “নেপথ্যে” করা কলগুলি দেখুন](./alchemy-explorer-goerli.png) + +এখানে আপনি কিছু JSON-RPC কল দেখতে পাবেন যা Hardhat/Ethers আমাদের জন্য নেপথ্যে করেছে যখন আমরা .deploy() ফাংশনটি কল করেছি। এখানে দুটি গুরুত্বপূর্ণ কল হল [eth_sendRawTransaction](/developers/docs/apis/json-rpc/#eth_sendrawtransaction), যা আসলে Sepolia চেইনে আমাদের স্মার্ট কন্ট্র্যাক্ট লেখার অনুরোধ, এবং [eth_getTransactionByHash](/developers/docs/apis/json-rpc/#eth_gettransactionbyhash) যা হ্যাশ দেওয়া হলে আমাদের লেনদেন সম্পর্কে তথ্য পড়ার অনুরোধ (লেনদেন পাঠানোর সময় একটি সাধারণ প্যাটার্ন)। লেনদেন পাঠানো সম্পর্কে আরও জানতে, [Web3 ব্যবহার করে লেনদেন পাঠানোর](/developers/tutorials/sending-transactions-using-web3-and-alchemy/) এই টিউটোরিয়ালটি দেখুন। + +এই টিউটোরিয়ালের পর্ব ১ এর জন্য এটুকুই। [পর্ব ২-এ, আমরা একটি NFT মিন্ট করে আমাদের স্মার্ট কন্ট্র্যাক্টের সাথে আসলে ইন্টারঅ্যাক্ট করব](/developers/tutorials/how-to-mint-an-nft/), এবং [পর্ব ৩-এ আমরা দেখাব কিভাবে আপনার Ethereum ওয়ালেটে আপনার NFT দেখতে হয়](/developers/tutorials/how-to-view-nft-in-metamask/)! diff --git a/public/content/translations/bn/developers/tutorials/interact-with-other-contracts-from-solidity/index.md b/public/content/translations/bn/developers/tutorials/interact-with-other-contracts-from-solidity/index.md new file mode 100644 index 00000000000..fd832c47307 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/interact-with-other-contracts-from-solidity/index.md @@ -0,0 +1,179 @@ +--- +title: "সলিডিটি থেকে অন্যান্য কন্ট্র্যাক্টগুলির সাথে ইন্টারঅ্যাক্ট করুন" +description: "কীভাবে একটি বিদ্যমান কন্ট্র্যাক্ট থেকে একটি স্মার্ট কন্ট্র্যাক্ট ডেপ্লয় করবেন এবং এর সাথে ইন্টারঅ্যাক্ট করবেন" +author: "jdourlens" +tags: + [ + "স্মার্ট কন্ট্র্যাক্ট", + "সলিডিটি", + "remix", + "ডেপ্লয়িং", + "কম্পোজেবিলিটি" + ] +skill: advanced +lang: bn +published: 2020-04-05 +source: EthereumDev +sourceUrl: https://ethereumdev.io/interact-with-other-contracts-from-solidity/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +আগের টিউটোরিয়ালগুলিতে আমরা অনেক কিছু শিখেছি [কীভাবে আপনার প্রথম স্মার্ট কন্ট্র্যাক্ট ডেপ্লয় করবেন](/developers/tutorials/deploying-your-first-smart-contract/) এবং এতে কিছু বৈশিষ্ট্য যোগ করা যেমন [মডিফায়ারের মাধ্যমে অ্যাক্সেস নিয়ন্ত্রণ](https://ethereumdev.io/organize-your-code-and-control-access-to-your-smart-contract-with-modifiers/) অথবা [সলিডিটিতে এরর হ্যান্ডলিং](https://ethereumdev.io/handle-errors-in-solidity-with-require-and-revert/)। এই টিউটোরিয়ালে আমরা শিখব কীভাবে একটি বিদ্যমান কন্ট্র্যাক্ট থেকে একটি স্মার্ট কন্ট্র্যাক্ট ডেপ্লয় করতে হয় এবং এটির সাথে ইন্টারঅ্যাক্ট করতে হয়। + +আমরা এমন একটি কন্ট্র্যাক্ট তৈরি করব যা যে কাউকে তার নিজস্ব `Counter` স্মার্ট কন্ট্র্যাক্ট রাখতে সক্ষম করবে এটির জন্য একটি ফ্যাক্টরি তৈরি করার মাধ্যমে, এর নাম হবে `CounterFactory`। প্রথমে এখানে আমাদের প্রাথমিক `Counter` স্মার্ট কন্ট্র্যাক্টের কোড দেওয়া হলো: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + uint256 private _count; + address private _owner; + address private _factory; + + + modifier onlyOwner(address caller) { + require(caller == _owner, "আপনি কন্ট্র্যাক্টের মালিক নন"); + _; + } + + modifier onlyFactory() { + require(msg.sender == _factory, "আপনাকে ফ্যাক্টরি ব্যবহার করতে হবে"); + _; + } + + constructor(address owner) public { + _owner = owner; + _factory = msg.sender; + } + + function getCount() public view returns (uint256) { + return _count; + } + + function increment(address caller) public onlyFactory onlyOwner(caller) { + _count++; + } + +} +``` + +লক্ষ্য করুন যে আমরা ফ্যাক্টরির অ্যাড্রেস এবং কন্ট্র্যাক্টের মালিকের অ্যাড্রেসের ট্র্যাক রাখার জন্য কন্ট্র্যাক্টের কোডটি সামান্য পরিবর্তন করেছি। যখন আপনি অন্য একটি কন্ট্র্যাক্ট থেকে একটি কন্ট্র্যাক্ট কোড কল করেন, তখন msg.sender আমাদের কন্ট্র্যাক্ট ফ্যাক্টরির অ্যাড্রেসকে রেফার করবে। এটি **বোঝার জন্য একটি সত্যিই গুরুত্বপূর্ণ বিষয়** কারণ অন্যান্য কন্ট্র্যাক্টগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য একটি কন্ট্র্যাক্ট ব্যবহার করা একটি সাধারণ অভ্যাস। তাই জটিল ক্ষেত্রে সেন্ডার কে, সে বিষয়ে আপনার খেয়াল রাখা উচিত। + +এর জন্য আমরা একটি `onlyFactory` মডিফায়ারও যুক্ত করেছি যা নিশ্চিত করে যে স্টেট পরিবর্তনকারী ফাংশনটি কেবল ফ্যাক্টরি দ্বারা কল করা যেতে পারে, যা আসল কলারকে প্যারামিটার হিসাবে পাস করবে। + +আমাদের নতুন `CounterFactory`-এর ভিতরে, যা অন্য সমস্ত কাউন্টার পরিচালনা করবে, আমরা একটি ম্যাপিং যোগ করব যা একজন মালিককে তার কাউন্টার কন্ট্র্যাক্টের অ্যাড্রেসের সাথে যুক্ত করবে: + +```solidity +mapping(address => Counter) _counters; +``` + +ইথেরিয়ামে, ম্যাপিং জাভাস্ক্রিপ্টে অবজেক্টের সমতুল্য, এগুলি A টাইপের একটি কী-কে B টাইপের একটি মানের সাথে ম্যাপ করতে সক্ষম করে। এক্ষেত্রে আমরা একজন মালিকের অ্যাড্রেসকে তার কাউন্টারের ইনস্ট্যান্সের সাথে ম্যাপ করি। + +কারও জন্য একটি নতুন কাউন্টার ইনস্ট্যানশিয়েট করা এরকম দেখাবে: + +```solidity + function createCounter() public { + require (_counters[msg.sender] == Counter(0)); + _counters[msg.sender] = new Counter(msg.sender); + } +``` + +আমরা প্রথমে পরীক্ষা করি যে ব্যক্তিটির ইতিমধ্যে একটি কাউন্টার আছে কিনা। যদি তার কোনো কাউন্টার না থাকে, আমরা তার অ্যাড্রেসটি `Counter` কন্সট্রাক্টরের কাছে পাস করে একটি নতুন কাউন্টার ইনস্ট্যানশিয়েট করি এবং নতুন তৈরি করা ইনস্ট্যান্সটি ম্যাপিং-এ অ্যাসাইন করি। + +একটি নির্দিষ্ট কাউন্টারের গণনা পেতে এটি এরকম দেখাবে: + +```solidity +function getCount(address account) public view returns (uint256) { + require (_counters[account] != Counter(0)); + return (_counters[account].getCount()); +} + +function getMyCount() public view returns (uint256) { + return (getCount(msg.sender)); +} +``` + +প্রথম ফাংশনটি পরীক্ষা করে যে একটি প্রদত্ত অ্যাড্রেসের জন্য কাউন্টার কন্ট্র্যাক্টটি বিদ্যমান কিনা এবং তারপর ইনস্ট্যান্স থেকে `getCount` মেথডটি কল করে। দ্বিতীয় ফাংশন: `getMyCount` এটি msg.sender-কে সরাসরি `getCount` ফাংশনে পাস করার একটি সংক্ষিপ্ত উপায় মাত্র। + +`increment` ফাংশনটিও বেশ একইরকম, কিন্তু এটি মূল ট্রানজ্যাকশন সেন্ডারকে `Counter` কন্ট্র্যাক্টে পাস করে দেয়: + +```solidity +function increment() public { + require (_counters[msg.sender] != Counter(0)); + Counter(_counters[msg.sender]).increment(msg.sender); + } +``` + +লক্ষ্য করুন যে যদি অনেকবার কল করা হয়, আমাদের কাউন্টার একটি ওভারফ্লোর শিকার হতে পারে। এই সম্ভাব্য পরিস্থিতি থেকে রক্ষা পাওয়ার জন্য আপনার যতটা সম্ভব [সেফম্যাথ লাইব্রেরি](https://ethereumdev.io/using-safe-math-library-to-prevent-from-overflows/) ব্যবহার করা উচিত। + +আমাদের কন্ট্র্যাক্ট ডেপ্লয় করার জন্য, আপনাকে `CounterFactory` এবং `Counter` উভয়ের কোড সরবরাহ করতে হবে। উদাহরণস্বরূপ রিমিক্সে ডেপ্লয় করার সময় আপনাকে CounterFactory নির্বাচন করতে হবে। + +এখানে সম্পূর্ণ কোডটি দেওয়া হলো: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + uint256 private _count; + address private _owner; + address private _factory; + + + modifier onlyOwner(address caller) { + require(caller == _owner, "আপনি কন্ট্র্যাক্টের মালিক নন"); + _; + } + + modifier onlyFactory() { + require(msg.sender == _factory, "আপনাকে ফ্যাক্টরি ব্যবহার করতে হবে"); + _; + } + + constructor(address owner) public { + _owner = owner; + _factory = msg.sender; + } + + function getCount() public view returns (uint256) { + return _count; + } + + function increment(address caller) public onlyFactory onlyOwner(caller) { + _count++; + } + +} + +contract CounterFactory { + + mapping(address => Counter) _counters; + + function createCounter() public { + require (_counters[msg.sender] == Counter(0)); + _counters[msg.sender] = new Counter(msg.sender); + } + + function increment() public { + require (_counters[msg.sender] != Counter(0)); + Counter(_counters[msg.sender]).increment(msg.sender); + } + + function getCount(address account) public view returns (uint256) { + require (_counters[account] != Counter(0)); + return (_counters[account].getCount()); + } + + function getMyCount() public view returns (uint256) { + return (getCount(msg.sender)); + } + +} +``` + +কম্পাইল করার পরে, রিমিক্সের ডেপ্লয় বিভাগে আপনি ডেপ্লয় করার জন্য ফ্যাক্টরিটি নির্বাচন করবেন: + +![রিমিক্সে ডেপ্লয় করার জন্য ফ্যাক্টরি নির্বাচন করা হচ্ছে](./counterfactory-deploy.png) + +তারপর আপনি আপনার কন্ট্র্যাক্ট ফ্যাক্টরি নিয়ে খেলতে পারেন এবং মানের পরিবর্তন পরীক্ষা করতে পারেন। আপনি যদি একটি ভিন্ন অ্যাড্রেস থেকে স্মার্ট কন্ট্র্যাক্টটি কল করতে চান, তবে আপনাকে রিমিক্সের অ্যাকাউন্ট সিলেক্টে অ্যাড্রেসটি পরিবর্তন করতে হবে। diff --git a/public/content/translations/bn/developers/tutorials/ipfs-decentralized-ui/index.md b/public/content/translations/bn/developers/tutorials/ipfs-decentralized-ui/index.md new file mode 100644 index 00000000000..093e315f0ec --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/ipfs-decentralized-ui/index.md @@ -0,0 +1,73 @@ +--- +title: "বিকেন্দ্রীভূত ইউজার ইন্টারফেসের জন্য IPFS" +description: "এই টিউটোরিয়ালটি পাঠককে শেখায় কিভাবে একটি ডিএ্যাপ-এর জন্য ইউজার ইন্টারফেস সংরক্ষণ করতে IPFS ব্যবহার করতে হয়। যদিও অ্যাপ্লিকেশনটির ডেটা এবং ব্যবসায়িক যুক্তি বিকেন্দ্রীভূত, একটি সেন্সরশিপ প্রতিরোধী ইউজার ইন্টারফেস ছাড়া ব্যবহারকারীরা যাইহোক এতে অ্যাক্সেস হারাতে পারে।" +author: Ori Pomerantz +tags: [ "ipfs" ] +skill: beginner +lang: bn +published: 2024-06-29 +--- + +আপনি একটি অবিশ্বাস্য নতুন ডিএ্যাপ লিখেছেন। আপনি এমনকি এর জন্য একটি [ইউজার ইন্টারফেস](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) লিখেছেন। কিন্তু এখন আপনি ভয় পাচ্ছেন যে কেউ আপনার ইউজার ইন্টারফেস ডাউন করে এটিকে সেন্সর করার চেষ্টা করবে, যা ক্লাউডে থাকা শুধুমাত্র একটি সার্ভার। এই টিউটোরিয়ালে আপনি শিখবেন কিভাবে আপনার ইউজার ইন্টারফেসকে **[ইন্টারপ্ল্যানেটারি ফাইল সিস্টেম (IPFS)](https://ipfs.tech/developers/)**-এ রেখে সেন্সরশিপ এড়ানো যায়, যাতে আগ্রহী যে কেউ ভবিষ্যতের অ্যাক্সেসের জন্য এটিকে একটি সার্ভারে পিন করতে সক্ষম হবে। + +সমস্ত কাজ করার জন্য আপনি [Fleek](https://resources.fleek.xyz/docs/) এর মতো একটি তৃতীয় পক্ষের পরিষেবা ব্যবহার করতে পারেন। এই টিউটোরিয়ালটি সেই সব লোকেদের জন্য যারা তারা কী করছে তা বোঝার জন্য যথেষ্ট কাজ করতে চায়, যদিও এতে বেশি কাজ করতে হয়। + +## স্থানীয়ভাবে শুরু করা {#getting-started-locally} + +একাধিক [তৃতীয় পক্ষের IPFS প্রদানকারী](https://docs.ipfs.tech/how-to/work-with-pinning-services/#use-a-third-party-pinning-service) রয়েছে, তবে পরীক্ষার জন্য স্থানীয়ভাবে IPFS চালানো দিয়ে শুরু করা ভাল। + +1. [IPFS ইউজার ইন্টারফেস](https://docs.ipfs.tech/install/ipfs-desktop/#install-instructions) ইনস্টল করুন। + +2. আপনার ওয়েব সাইট সহ একটি ডিরেক্টরি তৈরি করুন। আপনি যদি [Vite](https://vite.dev/) ব্যবহার করেন, তবে এই কমান্ডটি ব্যবহার করুন: + + ```sh + pnpm vite build + ``` + +3. IPFS ডেস্কটপে, **Import > Folder**-এ ক্লিক করুন এবং আগের ধাপে তৈরি করা ডিরেক্টরিটি নির্বাচন করুন। + +4. আপনি এইমাত্র আপলোড করা ফোল্ডারটি নির্বাচন করুন এবং **Rename**-এ ক্লিক করুন। এটিকে আরও অর্থপূর্ণ একটি নাম দিন। + +5. এটিকে আবার নির্বাচন করুন এবং **Share link**-এ ক্লিক করুন। URLটি ক্লিপবোর্ডে অনুলিপি করুন। লিঙ্কটি `https://ipfs.io/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`-এর অনুরূপ হবে। + +6. **Status**-এ ক্লিক করুন। গেটওয়ে অ্যাড্রেসটি দেখতে **Advanced** ট্যাবটি প্রসারিত করুন। উদাহরণস্বরূপ, আমার সিস্টেমে অ্যাড্রেসটি হল `http://127.0.0.1:8080`। + +7. আপনার অ্যাড্রেস খুঁজে পেতে লিঙ্ক ধাপ থেকে প্রাপ্ত পাথটিকে গেটওয়ে অ্যাড্রেসের সাথে একত্রিত করুন। উদাহরণস্বরূপ, উপরের উদাহরণের জন্য, URLটি হল `http://127.0.0.1:8080/ipfs/QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`। আপনার সাইটটি দেখতে একটি ব্রাউজারে সেই URLটি খুলুন। + +## আপলোড করা {#uploading} + +সুতরাং এখন আপনি স্থানীয়ভাবে ফাইল পরিবেশন করতে IPFS ব্যবহার করতে পারেন, যা খুব উত্তেজনাপূর্ণ নয়। পরবর্তী পদক্ষেপ হল যখন আপনি অফলাইনে থাকবেন তখন সেগুলিকে বিশ্বের জন্য উপলব্ধ করা। + +বেশ কিছু সুপরিচিত [পিন করার পরিষেবা](https://docs.ipfs.tech/concepts/persistence/#pinning-services) রয়েছে। তাদের মধ্যে একটি বেছে নিন। আপনি যে পরিষেবাই ব্যবহার করুন না কেন, আপনাকে একটি অ্যাকাউন্ট তৈরি করতে হবে এবং আপনার IPFS ডেস্কটপে থাকা **কন্টেন্ট আইডেন্টিফায়ার (CID)** দিয়ে এটি প্রদান করতে হবে। + +ব্যক্তিগতভাবে, আমি [4EVERLAND](https://docs.4everland.org/storage/4ever-pin/guides) কে ব্যবহারের জন্য সবচেয়ে সহজ বলে মনে করেছি। এর জন্য নির্দেশাবলী এখানে দেওয়া হল: + +1. [ড্যাশবোর্ডে](https://dashboard.4everland.org/overview) ব্রাউজ করুন এবং আপনার ওয়ালেট দিয়ে লগইন করুন। + +2. বাম সাইডবারে **Storage > 4EVER Pin**-এ ক্লিক করুন। + +3. **Upload > Selected CID**-এ ক্লিক করুন। আপনার কন্টেন্টকে একটি নাম দিন এবং IPFS ডেস্কটপ থেকে CID প্রদান করুন। বর্তমানে একটি CID হল `Qm` দিয়ে শুরু হওয়া একটি স্ট্রিং, যার পরে 44টি অক্ষর এবং অঙ্ক থাকে যা একটি [বেস-58 এনকোডেড](https://medium.com/bootdotdev/base64-vs-base58-encoding-c25553ff4524) হ্যাস উপস্থাপন করে, যেমন `QmaCuQ7yN6iyBjLmLGe8YiFuCwnePoKfVu6ue8vLBsLJQJ`, কিন্তু [তার পরিবর্তনের সম্ভাবনা রয়েছে](https://docs.ipfs.tech/concepts/content-addressing/#version-1-v1)। + +4. প্রাথমিক স্থিতি হল **Queued**। যতক্ষণ না এটি **Pinned**-এ পরিবর্তিত হয় ততক্ষণ রিলোড করুন। + +5. লিঙ্কটি পেতে আপনার CID-তে ক্লিক করুন। আপনি আমার অ্যাপ্লিকেশনটি [এখানে](https://bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im.ipfs.dweb.link/) দেখতে পারেন। + +6. এক মাসের বেশি সময় ধরে এটিকে পিন করে রাখার জন্য আপনার অ্যাকাউন্টটি সক্রিয় করার প্রয়োজন হতে পারে। অ্যাকাউন্ট সক্রিয়করণের খরচ প্রায় $1। আপনি যদি এটি বন্ধ করে দেন, তবে পুনরায় সক্রিয় করার জন্য জিজ্ঞাসা করা হবে তাই লগ আউট করে আবার লগ ইন করুন। + +## IPFS থেকে ব্যবহার {#using-from-ipfs} + +এই মুহূর্তে আপনার কাছে একটি কেন্দ্রীভূত গেটওয়ের একটি লিঙ্ক আছে যা আপনার IPFS কন্টেন্ট পরিবেশন করে। সংক্ষেপে, আপনার ইউজার ইন্টারফেস কিছুটা নিরাপদ হতে পারে কিন্তু এটি এখনও সেন্সরশিপ প্রতিরোধী নয়। আসল সেন্সরশিপ প্রতিরোধের জন্য, ব্যবহারকারীদের [সরাসরি একটি ব্রাউজার থেকে](https://docs.ipfs.tech/install/ipfs-companion/#prerequisites) IPFS ব্যবহার করতে হবে। + +একবার আপনি এটি ইনস্টল করলে (এবং ডেস্কটপ IPFS কাজ করলে), আপনি যেকোনো সাইটে [/ipfs/``](https://any.site/ipfs/bafybeifqka2odrne5b6l5guthqvbxu4pujko2i6rx2zslvr3qxs6u5o7im) যেতে পারেন এবং আপনি সেই কন্টেন্ট পাবেন, যা একটি বিকেন্দ্রীভূত পদ্ধতিতে পরিবেশন করা হয়। + +## অসুবিধা {#drawbacks} + +আপনি নির্ভরযোগ্যভাবে IPFS ফাইল মুছে ফেলতে পারবেন না, তাই যতক্ষণ আপনি আপনার ইউজার ইন্টারফেস পরিবর্তন করছেন, এটিকে হয় কেন্দ্রীভূত রাখা বা [ইন্টারপ্ল্যানেটারি নেম সিস্টেম (IPNS)](https://docs.ipfs.tech/concepts/ipns/#mutability-in-ipfs) ব্যবহার করা সম্ভবত সবচেয়ে ভালো, যা IPFS-এর উপরে মিউটেবিলিটি প্রদান করে এমন একটি সিস্টেম। অবশ্যই, পরিবর্তনযোগ্য যেকোনো কিছু সেন্সর করা যেতে পারে, IPNS-এর ক্ষেত্রে সেই ব্যক্তির উপর চাপ সৃষ্টি করে যার কাছে এর সাথে সম্পর্কিত প্রাইভেট কী রয়েছে। + +অতিরিক্তভাবে, কিছু প্যাকেজের IPFS-এর সাথে সমস্যা আছে, তাই আপনার ওয়েব সাইট যদি খুব জটিল হয় তবে এটি একটি ভাল সমাধান নাও হতে পারে। এবং অবশ্যই, সার্ভার ইন্টিগ্রেশনের উপর নির্ভরশীল যেকোনো কিছু শুধু ক্লায়েন্ট সাইড IPFS-এ রেখে বিকেন্দ্রীভূত করা যায় না। + +## উপসংহার {#conclusion} + +ঠিক যেমন ইথেরিয়াম আপনাকে আপনার ডিএ্যাপ-এর ডেটাবেস এবং ব্যবসায়িক যুক্তির দিকগুলি বিকেন্দ্রীভূত করতে দেয়, তেমনি IPFS আপনাকে ইউজার ইন্টারফেস বিকেন্দ্রীভূত করতে দেয়। এটি আপনাকে আপনার ডিএ্যাপ-এর বিরুদ্ধে আরও একটি আক্রমণ ভেক্টর বন্ধ করতে দেয়। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। diff --git a/public/content/translations/bn/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md b/public/content/translations/bn/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md new file mode 100644 index 00000000000..da2e48f3a54 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/kickstart-your-dapp-frontend-development-with-create-eth-app/index.md @@ -0,0 +1,111 @@ +--- +title: "create-eth-app-এর মাধ্যমে আপনার dApp ফ্রন্টএন্ড ডেভেলপমেন্ট শুরু করুন" +description: "create-eth-app এবং এর বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করবেন তার একটি সংক্ষিপ্ত বিবরণ" +author: "Markus Waas" +tags: + [ + "ফ্রন্টএন্ড", + "javascript", + "ethers.js", + "দ্য গ্রাফ", + "defi" + ] +skill: beginner +lang: bn +published: 2020-04-27 +source: soliditydeveloper.com +sourceUrl: https://soliditydeveloper.com/create-eth-app +--- + +শেষবার আমরা [Solidity-র সামগ্রিক চিত্র](https://soliditydeveloper.com/solidity-overview-2020) দেখেছিলাম এবং ইতিমধ্যেই [create-eth-app](https://github.com/PaulRBerg/create-eth-app)-এর কথা উল্লেখ করেছি। এখন আপনি জানতে পারবেন কিভাবে এটি ব্যবহার করতে হয়, কোন বৈশিষ্ট্যগুলি একত্রিত করা হয়েছে এবং এটিতে কীভাবে প্রসারিত করা যায় সে সম্পর্কে অতিরিক্ত ধারণা। [Sablier](http://sablier.com/)-এর প্রতিষ্ঠাতা Paul Razvan Berg-এর দ্বারা শুরু করা, এই অ্যাপটি আপনার ফ্রন্টএন্ড ডেভেলপমেন্ট শুরু করবে এবং বেছে নেওয়ার জন্য বেশ কয়েকটি ঐচ্ছিক ইন্টিগ্রেশন সহ আসে। + +## ইনস্টলেশন {#installation} + +ইনস্টলেশনের জন্য Yarn 0.25 বা উচ্চতর প্রয়োজন (`npm install yarn --global`)। এটি চালানো মতোই সহজ: + +```bash +yarn create eth-app my-eth-app +cd my-eth-app +yarn react-app:start +``` + +এটি পর্দার আড়ালে [create-react-app](https://github.com/facebook/create-react-app) ব্যবহার করছে। আপনার অ্যাপ দেখতে, `http://localhost:3000/` খুলুন। আপনি যখন প্রোডাকশনে ডিপ্লয় করার জন্য প্রস্তুত হবেন, তখন yarn build দিয়ে একটি মিনিফাইড বান্ডেল তৈরি করুন। এটি হোস্ট করার একটি সহজ উপায় হল [Netlify](https://www.netlify.com/)। আপনি একটি GitHub রেপো তৈরি করতে পারেন, এটিকে Netlify-তে যোগ করতে পারেন, বিল্ড কমান্ড সেটআপ করতে পারেন এবং আপনার কাজ শেষ! আপনার অ্যাপটি হোস্ট করা হবে এবং সকলের জন্য ব্যবহারযোগ্য হবে। এবং এর সবই বিনামূল্যে। + +## বৈশিষ্ট্য {#features} + +### React & create-react-app {#react--create-react-app} + +প্রথমত অ্যাপটির মূল বিষয়: React এবং _create-react-app_-এর সাথে আসা সমস্ত অতিরিক্ত বৈশিষ্ট্য। আপনি যদি Ethereum সংহত করতে না চান তবে শুধুমাত্র এটি ব্যবহার করা একটি দুর্দান্ত বিকল্প। [React](https://react.dev/) নিজেই ইন্টারেক্টিভ UI তৈরি করা সত্যিই সহজ করে তোলে। এটি [Vue](https://vuejs.org/)-এর মতো শিক্ষানবিস-বান্ধব নাও হতে পারে, তবে এটি এখনও বেশিরভাগ ক্ষেত্রে ব্যবহৃত হয়, এর আরও বৈশিষ্ট্য রয়েছে এবং সবচেয়ে গুরুত্বপূর্ণভাবে বেছে নেওয়ার জন্য হাজার হাজার অতিরিক্ত লাইব্রেরি রয়েছে। _create-react-app_ এটির সাথে শুরু করা সত্যিই সহজ করে তোলে এবং এতে রয়েছে: + +- React, JSX, ES6, TypeScript, ফ্লো সিনট্যাক্স সমর্থন। +- ES6-এর বাইরে ভাষার অতিরিক্ত যেমন অবজেক্ট স্প্রেড অপারেটর। +- অটোপ্রিফিক্সড CSS, তাই আপনার -webkit- বা অন্য প্রিফিক্সের প্রয়োজন নেই। +- কভারেজ রিপোর্টিংয়ের জন্য অন্তর্নির্মিত সমর্থন সহ একটি দ্রুত ইন্টারেক্টিভ ইউনিট পরীক্ষা চালনাকারী। +- একটি লাইভ ডেভেলপমেন্ট সার্ভার যা সাধারণ ভুল সম্পর্কে সতর্ক করে। +- প্রোডাকশনের জন্য JS, CSS এবং ছবি বান্ডিল করার জন্য একটি বিল্ড স্ক্রিপ্ট, হ্যাস এবং সোর্সম্যাপ সহ। + +বিশেষ করে _create-eth-app_ নতুন [hooks effects](https://legacy.reactjs.org/docs/hooks-effect.html) ব্যবহার করছে। শক্তিশালী, অথচ খুব ছোট তথাকথিত কার্যকরী উপাদান লেখার একটি পদ্ধতি। কীভাবে সেগুলি _create-eth-app_-এ ব্যবহার করা হয় তার জন্য অ্যাপোলো সম্পর্কে নীচের বিভাগটি দেখুন। + +### Yarn Workspaces {#yarn-workspaces} + +[Yarn Workspaces](https://classic.yarnpkg.com/en/docs/workspaces/) আপনাকে একাধিক প্যাকেজ রাখার অনুমতি দেয়, কিন্তু রুট ফোল্ডার থেকে সেগুলিকে পরিচালনা করতে এবং `yarn install` ব্যবহার করে একবারে সকলের জন্য নির্ভরতা ইনস্টল করতে সক্ষম করে। এটি বিশেষত স্মার্ট কন্ট্র্যাক্ট অ্যাড্রেস/ABI পরিচালনার মতো ছোট অতিরিক্ত প্যাকেজগুলির জন্য অর্থবহ (আপনি কোন স্মার্ট কন্ট্র্যাক্ট কোথায় ডিপ্লয় করেছেন এবং তাদের সাথে কীভাবে যোগাযোগ করবেন সে সম্পর্কিত তথ্য) অথবা গ্রাফ ইন্টিগ্রেশন, উভয়ই `create-eth-app`-এর অংশ। + +### ethers.js {#ethersjs} + +যদিও [Web3](https://docs.web3js.org/) এখনও বেশিরভাগ ক্ষেত্রে ব্যবহৃত হয়, [ethers.js](https://docs.ethers.io/) গত বছরে একটি বিকল্প হিসেবে অনেক বেশি আকর্ষণ অর্জন করেছে এবং এটি _create-eth-app_-এ একত্রিত করা হয়েছে। আপনি এটি নিয়ে কাজ করতে পারেন, এটিকে Web3-তে পরিবর্তন করতে পারেন বা [ethers.js v5](https://docs.ethers.org/v5/)-এ আপগ্রেড করার কথা বিবেচনা করতে পারেন যা প্রায় বিটা থেকে বেরিয়ে এসেছে। + +### গ্রাফ {#the-graph} + +[GraphQL](https://graphql.org/) একটি [Restful API](https://restfulapi.net/)-এর তুলনায় ডেটা পরিচালনা করার একটি বিকল্প উপায়। Restful Apis-এর তুলনায় তাদের বেশ কিছু সুবিধা রয়েছে, বিশেষ করে বিকেন্দ্রীভূত ব্লকচেইন ডেটার জন্য। আপনি যদি এর পেছনের কারণ জানতে আগ্রহী হন, তাহলে [GraphQL Will Power the Decentralized Web](https://medium.com/graphprotocol/graphql-will-power-the-decentralized-web-d7443a69c69a) দেখুন। + +সাধারণত আপনি সরাসরি আপনার স্মার্ট কন্ট্র্যাক্ট থেকে ডেটা আনতেন। সর্বশেষ ট্রেড-এর সময় পড়তে চান? শুধু `MyContract.methods.latestTradeTime().call()` কল করুন যা একটি Ethereum নোড থেকে আপনার dApp-এ ডেটা নিয়ে আসে। কিন্তু আপনার যদি শত শত ভিন্ন ডেটা পয়েন্টের প্রয়োজন হয়? এর ফলে নোডে শত শত ডেটা ফেচ হবে, প্রতিবার একটি [RTT](https://wikipedia.org/wiki/Round-trip_delay_time) প্রয়োজন হবে যা আপনার dApp-কে ধীর এবং অদক্ষ করে তুলবে। একটি সমাধান হতে পারে আপনার চুক্তির ভিতরে একটি ফেচার কল ফাংশন যা একবারে একাধিক ডেটা ফেরত দেয়। যদিও এটি সবসময় আদর্শ নয়। + +এবং তারপরে আপনি ঐতিহাসিক ডেটাতেও আগ্রহী হতে পারেন। আপনি শুধু শেষ ট্রেডের সময়ই নয়, আপনি নিজে থেকে করা সমস্ত ট্রেডের সময়ও জানতে চান। _create-eth-app_ সাবগ্রাফ প্যাকেজ ব্যবহার করুন, [ডকুমেন্টেশন](https://thegraph.com/docs/en/subgraphs/developing/creating/starting-your-subgraph) পড়ুন এবং এটিকে আপনার নিজের চুক্তির সাথে মানিয়ে নিন। আপনি যদি জনপ্রিয় স্মার্ট কন্ট্র্যাক্ট খুঁজছেন, তবে ইতিমধ্যে একটি সাবগ্রাফও থাকতে পারে। [সাবগ্রাফ এক্সপ্লোরার](https://thegraph.com/explorer/) দেখুন। + +আপনার একবার একটি সাবগ্রাফ হয়ে গেলে, এটি আপনাকে আপনার dApp-এ একটি সাধারণ ক্যোয়ারী লিখতে দেয় যা আপনার প্রয়োজনীয় ঐতিহাসিক তথ্য সহ সমস্ত গুরুত্বপূর্ণ ব্লকচেইন ডেটা পুনরুদ্ধার করে, শুধুমাত্র একটি ফেচ প্রয়োজন। + +### Apollo {#apollo} + +[Apollo Boost](https://www.apollographql.com/docs/react/get-started/) ইন্টিগ্রেশনের জন্য ধন্যবাদ আপনি সহজেই আপনার React dApp-এ গ্রাফটি সংহত করতে পারেন। বিশেষ করে [React hooks এবং Apollo](https://www.apollographql.com/blog/apollo-client-now-with-react-hooks) ব্যবহার করার সময়, ডেটা আনা আপনার কম্পোনেন্টে একটি একক GraphQl ক্যোয়ারী লেখার মতোই সহজ: + +```js +const { loading, error, data } = useQuery(myGraphQlQuery) + +React.useEffect(() => { + if (!loading && !error && data) { + console.log({ data }) + } +}, [loading, error, data]) +``` + +## টেমপ্লেট {#templates} + +উপরে আপনি বিভিন্ন টেমপ্লেট থেকে বেছে নিতে পারেন। এখন পর্যন্ত আপনি একটি Aave, Compound, UniSwap বা sablier ইন্টিগ্রেশন ব্যবহার করতে পারেন। তারা সকলেই প্রাক-তৈরি সাবগ্রাফ ইন্টিগ্রেশন সহ গুরুত্বপূর্ণ পরিষেবা স্মার্ট কন্ট্র্যাক্ট অ্যাড্রেস যোগ করে। শুধু `yarn create eth-app my-eth-app --with-template aave`-এর মতো তৈরি কমান্ডে টেমপ্লেটটি যোগ করুন। + +### Aave {#aave} + +[Aave](https://aave.com/) একটি বিকেন্দ্রীভূত অর্থ ঋণদানকারী বাজার। আমানতকারীরা একটি প্যাসিভ আয় উপার্জন করার জন্য বাজারে তারল্য সরবরাহ করে, যখন ঋণগ্রহীতারা জামানত ব্যবহার করে ধার করতে সক্ষম হয়। Aave-এর একটি অনন্য বৈশিষ্ট্য হল সেই [flash loans](https://aave.com/docs/developers/flash-loans) যা আপনাকে কোনো জামানত ছাড়াই টাকা ধার করতে দেয়, যতক্ষণ না আপনি একটি লেনদেনের মধ্যে ঋণ ফেরত দেন। এটি উদাহরণস্বরূপ আরবিট্রেজ ট্রেডিংয়ে আপনাকে অতিরিক্ত নগদ দেওয়ার জন্য দরকারী হতে পারে। + +ট্রেড করা টোকেন যা আপনাকে সুদ উপার্জন করে তাকে _aTokens_ বলা হয়। + +আপনি যখন _create-eth-app_-এর সাথে Aave সংহত করতে বেছে নেবেন, তখন আপনি একটি [সাবগ্রাফ ইন্টিগ্রেশন](https://docs.aave.com/developers/getting-started/using-graphql) পাবেন। Aave, The Graph ব্যবহার করে এবং ইতিমধ্যেই আপনাকে [Ropsten](https://thegraph.com/explorer/subgraph/aave/protocol-ropsten) এবং [Mainnet](https://thegraph.com/explorer/subgraph/aave/protocol)-এ [raw](https://thegraph.com/explorer/subgraph/aave/protocol-raw) অথবা [formatted](https://thegraph.com/explorer/subgraph/aave/protocol) আকারে বেশ কয়েকটি ব্যবহারের-জন্য-প্রস্তুত সাবগ্রাফ সরবরাহ করে। + +![Aave ফ্ল্যাশ লোন মিম – "হ্যাঁ, যদি আমি আমার ফ্ল্যাশ লোন 1টি লেনদেনের চেয়ে বেশি সময় ধরে রাখতে পারতাম, তাহলে দারুণ হতো"](./flashloan-meme.png) + +### Compound {#compound} + +[Compound](https://compound.finance/) Aave-এর মতোই। ইন্টিগ্রেশনে ইতিমধ্যেই নতুন [Compound v2 Subgraph](https://medium.com/graphprotocol/https-medium-com-graphprotocol-compound-v2-subgraph-highlight-a5f38f094195) অন্তর্ভুক্ত রয়েছে। এখানে সুদ উপার্জনকারী টোকেনগুলিকে আশ্চর্যজনকভাবে _cTokens_ বলা হয়। + +### Uniswap {#uniswap} + +[Uniswap](https://uniswap.exchange/) একটি বিকেন্দ্রীভূত এক্সচেঞ্জ (DEX)। তারল্য প্রদানকারীরা একটি ট্রেডের উভয় পক্ষের জন্য প্রয়োজনীয় টোকেন বা ইথার সরবরাহ করে ফি উপার্জন করতে পারে। এটি ব্যাপকভাবে ব্যবহৃত হয় এবং তাই এটির টোকেনের একটি খুব বিস্তৃত পরিসরের জন্য সর্বোচ্চ তারল্য রয়েছে। আপনি এটিকে সহজেই আপনার dApp-এ সংহত করতে পারেন, উদাহরণস্বরূপ, ব্যবহারকারীদের তাদের ETH-কে DAI-এর জন্য অদলবদল করার অনুমতি দিতে। + +দুর্ভাগ্যবশত, এই লেখার সময় ইন্টিগ্রেশনটি শুধুমাত্র Uniswap v1-এর জন্য এবং [এইমাত্র প্রকাশিত v2](https://uniswap.org/blog/uniswap-v2/)-এর জন্য নয়। + +### Sablier {#sablier} + +[Sablier](https://sablier.com/) ব্যবহারকারীদের স্ট্রিমিং মানি পেমেন্টের অনুমতি দেয়। একটি একক পে-ডে-র পরিবর্তে, আপনি প্রাথমিক সেটআপের পরে আরও প্রশাসন ছাড়াই ক্রমাগত আপনার অর্থ পান। ইন্টিগ্রেশনে এর [নিজস্ব সাবগ্রাফ](https://thegraph.com/explorer/subgraph/sablierhq/sablier) অন্তর্ভুক্ত রয়েছে। + +## এর পরে কী? {#whats-next} + +যদি আপনার _create-eth-app_ সম্পর্কে প্রশ্ন থাকে, তাহলে [Sablier কমিউনিটি সার্ভারে](https://discord.gg/bsS8T47) যান, যেখানে আপনি _create-eth-app_-এর লেখকদের সাথে যোগাযোগ করতে পারেন। কিছু প্রথম পরবর্তী পদক্ষেপ হিসাবে আপনি [Material UI](https://mui.com/material-ui/)-এর মতো একটি UI ফ্রেমওয়ার্ক সংহত করতে চাইতে পারেন, আপনার প্রকৃতপক্ষে প্রয়োজনীয় ডেটার জন্য GraphQL ক্যোয়ারী লিখতে এবং ডিপ্লয়মেন্ট সেটআপ করতে পারেন। diff --git a/public/content/translations/bn/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md b/public/content/translations/bn/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md new file mode 100644 index 00000000000..2b8baab5af7 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/learn-foundational-ethereum-topics-with-sql/index.md @@ -0,0 +1,269 @@ +--- +title: "SQL-এর সাহায্যে ইথেরিয়ামের ভিত্তিগত বিষয়গুলি শিখুন" +description: "এই টিউটোরিয়ালটি স্ট্রাকচার্ড কোয়েরি ল্যাঙ্গুয়েজ (SQL) দিয়ে অনচেইন ডেটা কোয়েরি করার মাধ্যমে পাঠকদের ট্রানজ্যাকশন, ব্লক এবং গ্যাসের মতো ইথেরিয়ামের মৌলিক ধারণাগুলি বুঝতে সাহায্য করে।" +author: "Paul Apivat" +tags: [ "SQL", "কোয়েরি করা", "লেনদেনসমূহ" ] +skill: beginner +lang: bn +published: 2021-05-11 +source: paulapivat.com +sourceUrl: https://paulapivat.com/post/query_ethereum/ +--- + +অনেক ইথেরিয়াম টিউটোরিয়াল ডেভেলপারদের লক্ষ্য করে তৈরি, কিন্তু ডেটা অ্যানালিস্ট বা এমন লোকেদের জন্য শিক্ষামূলক রিসোর্সের অভাব রয়েছে যারা কোনো ক্লায়েন্ট বা নোড না চালিয়ে অনচেইন ডেটা দেখতে চান। + +এই টিউটোরিয়ালটি [Dune Analytics](https://dune.com/) দ্বারা প্রদত্ত একটি ইন্টারফেসের মাধ্যমে স্ট্রাকচার্ড কোয়েরি ল্যাঙ্গুয়েজ (SQL) দিয়ে অনচেইন ডেটা কোয়েরি করে পাঠকদেরকে ট্রানজ্যাকশন, ব্লক এবং গ্যাসের মতো ইথেরিয়ামের মৌলিক ধারণাগুলি বুঝতে সাহায্য করে। + +অনচেইন ডেটা আমাদের ইথেরিয়াম, নেটওয়ার্ক এবং কম্পিউটিং পাওয়ারের জন্য একটি অর্থনীতি হিসাবে বুঝতে সাহায্য করতে পারে এবং বর্তমানে ইথেরিয়ামের মুখোমুখি হওয়া চ্যালেঞ্জগুলি (যেমন, ক্রমবর্ধমান গ্যাসের দাম) এবং, আরও গুরুত্বপূর্ণভাবে, স্কেলিং সমাধান নিয়ে আলোচনার জন্য একটি ভিত্তি হিসাবে কাজ করা উচিত। + +### লেনদেন {#transactions} + +ইথেরিয়ামে একজন ব্যবহারকারীর যাত্রা শুরু হয় একটি ব্যবহারকারী-নিয়ন্ত্রিত অ্যাকাউন্ট অথবা একটি ETH ব্যালেন্স সহ একটি এন্টিটি ইনিশিয়ালাইজ করার মাধ্যমে। দুই ধরনের অ্যাকাউন্ট আছে - ব্যবহারকারী-নিয়ন্ত্রিত বা একটি স্মার্ট কন্ট্র্যাক্ট ([ethereum.org](/developers/docs/accounts/) দেখুন)। + +যেকোনো অ্যাকাউন্ট [Etherscan](https://etherscan.io/) বা [Blockscout](https://eth.blockscout.com/)-এর মতো একটি ব্লক এক্সপ্লোরারে দেখা যেতে পারে। ব্লক এক্সপ্লোরার হলো ইথেরিয়ামের ডেটার জন্য একটি পোর্টাল। তারা রিয়েল-টাইমে ব্লক, ট্রানজ্যাকশন, মাইনার, অ্যাকাউন্ট এবং অন্যান্য অনচেইন কার্যকলাপের ডেটা প্রদর্শন করে ([এখানে](/developers/docs/data-and-analytics/block-explorers/) দেখুন)। + +তবে, একজন ব্যবহারকারী বাহ্যিক ব্লক এক্সপ্লোরার দ্বারা প্রদত্ত তথ্যের সাথে মেলানোর জন্য সরাসরি ডেটা কোয়েরি করতে চাইতে পারেন। [Dune Analytics](https://dune.com/) SQL সম্পর্কে কিছু জ্ঞান আছে এমন যেকোনো ব্যক্তিকে এই ক্ষমতা প্রদান করে। + +রেফারেন্সের জন্য, Ethereum Foundation (EF)-এর স্মার্ট কন্ট্র্যাক্ট অ্যাকাউন্টটি [Blockscout](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe)-এ দেখা যাবে। + +একটি বিষয় লক্ষণীয় যে EF-এর অ্যাকাউন্টসহ সমস্ত অ্যাকাউন্টের একটি পাবলিক ঠিকানা আছে যা ট্রানজ্যাকশন পাঠানো এবং গ্রহণ করার জন্য ব্যবহার করা যেতে পারে। + +Etherscan-এ অ্যাকাউন্ট ব্যালেন্স নিয়মিত ট্রানজ্যাকশন এবং অভ্যন্তরীণ ট্রানজ্যাকশন নিয়ে গঠিত। অভ্যন্তরীণ ট্রানজ্যাকশন, নাম সত্ত্বেও, _প্রকৃত_ ট্রানজ্যাকশন নয় যা চেইনের স্টেট পরিবর্তন করে। সেগুলি হলো ভ্যালু ট্রান্সফার যা একটি কন্ট্র্যাক্ট এক্সিকিউট করার মাধ্যমে শুরু হয় ([উৎস](https://ethereum.stackexchange.com/questions/3417/how-to-get-contract-internal-transactions))। যেহেতু অভ্যন্তরীণ ট্রানজ্যাকশনের কোনো স্বাক্ষর নেই, সেগুলি ব্লকচেইনে **অন্তর্ভুক্ত নয়** এবং Dune Analytics দিয়ে কোয়েরি করা যায় না। + +অতএব, এই টিউটোরিয়ালটি নিয়মিত ট্রানজ্যাকশনের উপর ফোকাস করবে। এটি এইভাবে কোয়েরি করা যেতে পারে: + +```sql +WITH temp_table AS ( +SELECT + hash, + block_number, + block_time, + "from", + "to", + value / 1e18 AS ether, + gas_used, + gas_price / 1e9 AS gas_price_gwei +FROM ethereum."transactions" +WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' +ORDER BY block_time DESC +) +SELECT + hash, + block_number, + block_time, + "from", + "to", + ether, + (gas_used * gas_price_gwei) / 1e9 AS txn_fee +FROM temp_table +``` + +এটি Etherscan-এর ট্রানজ্যাকশন পেজে প্রদান করা তথ্যের মতোই তথ্য দেবে। তুলনার জন্য, এখানে দুটি উৎস রয়েছে: + +#### Etherscan {#etherscan} + +![](./etherscan_view.png) + +[Blockscout-এ EF-এর কন্ট্র্যাক্ট পেজ।](https://eth.blockscout.com/address/0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe) + +#### Dune অ্যানালিটিক্স {#dune-analytics} + +![](./dune_view.png) + +আপনি ড্যাশবোর্ডটি [এখানে](https://dune.com/paulapivat/Learn-Ethereum) খুঁজে পেতে পারেন। কোয়েরিটি দেখতে টেবিলটিতে ক্লিক করুন (উপরেও দেখুন)। + +### ট্রানজ্যাকশন ভেঙে দেখা {#breaking_down_transactions} + +একটি জমা দেওয়া ট্রানজ্যাকশনে বিভিন্ন তথ্য অন্তর্ভুক্ত থাকে, যার মধ্যে রয়েছে ([উৎস](/developers/docs/transactions/)): + +- **প্রাপক**: গ্রহণকারী ঠিকানা ("to" হিসাবে কোয়েরি করা হয়) +- **স্বাক্ষর**: যদিও একজন প্রেরকের প্রাইভেট কী একটি ট্রানজ্যাকশনে স্বাক্ষর করে, আমরা SQL দিয়ে যা কোয়েরি করতে পারি তা হলো প্রেরকের পাবলিক ঠিকানা ("from")। +- **ভ্যালু**: এটি ট্রান্সফার করা ETH-এর পরিমাণ (`ether` কলাম দেখুন)। +- **ডেটা**: এটি হলো ইচ্ছামত ডেটা যা হ্যাস করা হয়েছে (`data` কলাম দেখুন) +- **gasLimit** – গ্যাস ইউনিটের সর্বোচ্চ পরিমাণ যা ট্রানজ্যাকশন দ্বারা ব্যবহৃত হতে পারে। গ্যাসের ইউনিট গণনামূলক ধাপগুলিকে প্রতিনিধিত্ব করে +- **maxPriorityFeePerGas** - গ্যাসের সর্বোচ্চ পরিমাণ যা মাইনারকে টিপ হিসাবে অন্তর্ভুক্ত করা হবে +- **maxFeePerGas** - ট্রানজ্যাকশনের জন্য দিতে ইচ্ছুক গ্যাসের সর্বোচ্চ পরিমাণ (baseFeePerGas এবং maxPriorityFeePerGas সহ) + +আমরা Ethereum Foundation-এর পাবলিক ঠিকানায় করা ট্রানজ্যাকশনের জন্য এই নির্দিষ্ট তথ্যগুলি কোয়েরি করতে পারি: + +```sql +SELECT + "to", + "from", + value / 1e18 AS ether, + data, + gas_limit, + gas_price / 1e9 AS gas_price_gwei, + gas_used, + ROUND(((gas_used / gas_limit) * 100),2) AS gas_used_pct +FROM ethereum."transactions" +WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' +ORDER BY block_time DESC +``` + +### ব্লক {#blocks} + +প্রতিটি ট্রানজ্যাকশন ইথিরিয়াম ভার্চুয়াল মেশিন ([EVM](/developers/docs/evm/))-এর স্টেট পরিবর্তন করবে ([উৎস](/developers/docs/transactions/))। ট্রানজ্যাকশনগুলি যাচাই করার জন্য এবং একটি ব্লকে অন্তর্ভুক্ত করার জন্য নেটওয়ার্কে সম্প্রচার করা হয়। প্রতিটি ট্রানজ্যাকশন একটি ব্লক নম্বরের সাথে যুক্ত। ডেটা দেখতে, আমরা একটি নির্দিষ্ট ব্লক নম্বর কোয়েরি করতে পারি: 12396854 (এই লেখা পর্যন্ত, 11/5/21, Ethereum Foundation-এর ট্রানজ্যাকশনগুলির মধ্যে সাম্প্রতিকতম ব্লক)। + +উপরন্তু, যখন আমরা পরবর্তী দুটি ব্লক কোয়েরি করি, আমরা দেখতে পাই যে প্রতিটি ব্লকে পূর্ববর্তী ব্লকের হ্যাস (অর্থাৎ, প্যারেন্ট হ্যাস) রয়েছে, যা ব্লকচেইন কীভাবে গঠিত হয় তা চিত্রিত করে। + +প্রতিটি ব্লকে তার প্যারেন্ট ব্লকের একটি রেফারেন্স থাকে। এটি `hash` এবং `parent_hash` কলামগুলির মধ্যে নীচে দেখানো হয়েছে ([উৎস](/developers/docs/blocks/)): + +![parent_hash](./parent_hash.png) + +Dune Analytics-এ [কোয়েরিটি](https://dune.com/queries/44856/88292) এখানে দেওয়া হলো: + +```sql +SELECT + time, + number, + hash, + parent_hash, + nonce +FROM ethereum."blocks" +WHERE "number" = 12396854 OR "number" = 12396855 OR "number" = 12396856 +LIMIT 10 +``` + +আমরা সময়, ব্লক নম্বর, ডিফিকাল্টি, হ্যাস, প্যারেন্ট হ্যাস এবং নন্স কোয়েরি করে একটি ব্লক পরীক্ষা করতে পারি। + +এই কোয়েরিটি একমাত্র যা কভার করে না তা হলো _ট্রানজ্যাকশনের তালিকা_ যার জন্য নীচে একটি পৃথক কোয়েরি প্রয়োজন, এবং _স্টেট রুট_। একটি সম্পূর্ণ বা আর্কাইভাল নোড সমস্ত ট্রানজ্যাকশন এবং স্টেট ট্রানজিশন স্টোর করবে, যা ক্লায়েন্টদের যেকোনো সময়ে চেইনের স্টেট কোয়েরি করার অনুমতি দেয়। কারণ এর জন্য বড় স্টোরেজ স্পেস প্রয়োজন, আমরা চেইন ডেটাকে স্টেট ডেটা থেকে আলাদা করতে পারি: + +- চেইন ডেটা (ব্লক, ট্রানজ্যাকশনের তালিকা) +- স্টেট ডেটা (প্রতিটি ট্রানজ্যাকশনের স্টেট ট্রানজিশনের ফলাফল) + +স্টেট রুট পরেরটির অধীনে পড়ে এবং এটি _অন্তর্নিহিত_ ডেটা (অনচেইনে স্টোর করা হয় না), যেখানে চেইন ডেটা সুস্পষ্ট এবং চেইনেই স্টোর করা হয় ([উৎস](https://ethereum.stackexchange.com/questions/359/where-is-the-state-data-stored))। + +এই টিউটোরিয়ালের জন্য, আমরা সেই অনচেইন ডেটার উপর ফোকাস করব যা Dune Analytics-এর মাধ্যমে SQL দিয়ে কোয়েরি _করা যায়_। + +উপরে যেমন বলা হয়েছে, প্রতিটি ব্লকে ট্রানজ্যাকশনের একটি তালিকা থাকে, আমরা একটি নির্দিষ্ট ব্লকের জন্য ফিল্টার করে এটি কোয়েরি করতে পারি। আমরা সাম্প্রতিকতম ব্লক, 12396854 চেষ্টা করব: + +```sql +SELECT * FROM ethereum."transactions" +WHERE block_number = 12396854 +ORDER BY block_time DESC` +``` + +Dune-এ SQL আউটপুট এখানে দেওয়া হলো: + +![](./list_of_txn.png) + +চেইনে এই একক ব্লকটি যুক্ত হলে ইথিরিয়াম ভার্চুয়াল মেশিন ([EVM](/developers/docs/evm/))-এর স্টেট পরিবর্তিত হয়। কখনও কখনও ডজন ডজন, শত শত ট্রানজ্যাকশন একবারে যাচাই করা হয়। এই নির্দিষ্ট ক্ষেত্রে, 222টি ট্রানজ্যাকশন অন্তর্ভুক্ত ছিল। + +কতগুলি প্রকৃতপক্ষে সফল হয়েছিল তা দেখতে, আমরা সফল ট্রানজ্যাকশন গণনা করার জন্য আরেকটি ফিল্টার যোগ করব: + +```sql +WITH temp_table AS ( + SELECT * FROM ethereum."transactions" + WHERE block_number = 12396854 AND success = true + ORDER BY block_time DESC +) +SELECT + COUNT(success) AS num_successful_txn +FROM temp_table +``` + +ব্লক 12396854-এর জন্য, মোট 222টি ট্রানজ্যাকশনের মধ্যে, 204টি সফলভাবে যাচাই করা হয়েছে: + +![](./successful_txn.png) + +ট্রানজ্যাকশনের অনুরোধ প্রতি সেকেন্ডে কয়েক ডজন বার ঘটে, কিন্তু ব্লকগুলি প্রায় প্রতি 15 সেকেন্ডে একবার কমিট করা হয় ([উৎস](/developers/docs/blocks/))। + +প্রায় প্রতি 15 সেকেন্ডে একটি ব্লক তৈরি হয় তা দেখতে, আমরা প্রতিদিনের ব্লকের আনুমানিক গড় সংখ্যা (~ 5760) পেতে একদিনের সেকেন্ড সংখ্যাকে (86400) 15 দিয়ে ভাগ করতে পারি। + +প্রতিদিন উৎপাদিত ইথেরিয়াম ব্লকের চার্ট (2016 - বর্তমান) হলো: + +![](./daily_blocks.png) + +এই সময়কালে প্রতিদিন উৎপাদিত ব্লকের গড় সংখ্যা হলো ~5,874: + +![](./avg_daily_blocks.png) + +কোয়েরিগুলি হলো: + +```sql +# 2016 সাল থেকে প্রতিদিন উৎপাদিত ব্লকের সংখ্যা ভিজ্যুয়ালাইজ করার জন্য কোয়েরি + +SELECT + DATE_TRUNC('day', time) AS dt, + COUNT(*) AS block_count +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 + +# প্রতিদিন উৎপাদিত ব্লকের গড় সংখ্যা + +WITH temp_table AS ( +SELECT + DATE_TRUNC('day', time) AS dt, + COUNT(*) AS block_count +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 +) +SELECT + AVG(block_count) AS avg_block_count +FROM temp_table +``` + +2016 সাল থেকে প্রতিদিন উৎপাদিত ব্লকের গড় সংখ্যা সেই সংখ্যার থেকে সামান্য বেশি, 5,874। বিকল্পভাবে, 86400 সেকেন্ডকে 5874 গড় ব্লক দিয়ে ভাগ করলে ফল হয় 14.7 সেকেন্ড বা প্রায় প্রতি 15 সেকেন্ডে একটি ব্লক। + +### গ্যাস {#gas} + +ব্লকগুলি আকারে সীমাবদ্ধ। সর্বোচ্চ ব্লক সাইজ ডায়নামিক এবং নেটওয়ার্কের চাহিদা অনুযায়ী 12,500,000 এবং 25,000,000 ইউনিটের মধ্যে পরিবর্তিত হয়। ডিস্ক স্পেস এবং গতির প্রয়োজনের ক্ষেত্রে সম্পূর্ণ নোডগুলির উপর চাপ সৃষ্টি করে এমন ইচ্ছামত বড় ব্লক সাইজ প্রতিরোধ করার জন্য সীমার প্রয়োজন ([উৎস](/developers/docs/blocks/))। + +ব্লক গ্যাস লিমিটকে ধারণা করার একটি উপায় হলো এটিকে উপলব্ধ ব্লক স্পেসের **সরবরাহ** হিসাবে ভাবা যেখানে ট্রানজ্যাকশনগুলি ব্যাচ করা হয়। ব্লক গ্যাস লিমিট 2016 থেকে বর্তমান দিন পর্যন্ত কোয়েরি এবং ভিজ্যুয়ালাইজ করা যেতে পারে: + +![](./avg_gas_limit.png) + +```sql +SELECT + DATE_TRUNC('day', time) AS dt, + AVG(gas_limit) AS avg_block_gas_limit +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 +``` + +তারপরে রয়েছে প্রতিদিন ব্যবহৃত প্রকৃত গ্যাস যা ইথেরিয়াম চেইনে করা কম্পিউটিংয়ের জন্য অর্থ প্রদান করে (যেমন, ট্রানজ্যাকশন পাঠানো, একটি স্মার্ট কন্ট্র্যাক্ট কল করা, একটি NFT মিন্ট করা)। এটি উপলব্ধ ইথেরিয়াম ব্লক স্পেসের **চাহিদা**: + +![](./daily_gas_used.png) + +```sql +SELECT + DATE_TRUNC('day', time) AS dt, + AVG(gas_used) AS avg_block_gas_used +FROM ethereum."blocks" +GROUP BY dt +OFFSET 1 +``` + +আমরা **চাহিদা এবং সরবরাহ** কীভাবে সামঞ্জস্যপূর্ণ তা দেখতে এই দুটি চার্টকে একসাথে পাশাপাশি রাখতে পারি: + +![gas_demand_supply](./gas_demand_supply.png) + +অতএব আমরা উপলব্ধ সরবরাহের প্রেক্ষিতে ইথেরিয়াম ব্লক স্পেসের চাহিদার একটি ফাংশন হিসাবে গ্যাসের দাম বুঝতে পারি। + +অবশেষে, আমরা ইথেরিয়াম চেইনের জন্য গড় দৈনিক গ্যাসের দাম কোয়েরি করতে চাইতে পারি, তবে, এটি করলে একটি বিশেষ দীর্ঘ কোয়েরি সময় লাগবে, তাই আমরা আমাদের কোয়েরিকে Ethereum Foundation দ্বারা প্রতি ট্রানজ্যাকশনে প্রদত্ত গড় গ্যাসের পরিমাণে ফিল্টার করব। + +![](./ef_daily_gas.png) + +আমরা বছরের পর বছর ধরে Ethereum Foundation ঠিকানায় করা সমস্ত ট্রানজ্যাকশনের জন্য প্রদত্ত গ্যাসের দাম দেখতে পারি। কোয়েরিটি এখানে দেওয়া হলো: + +```sql +SELECT + block_time, + gas_price / 1e9 AS gas_price_gwei, + value / 1e18 AS eth_sent +FROM ethereum."transactions" +WHERE "to" = '\xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe' +ORDER BY block_time DESC +``` + +### সারসংক্ষেপ {#summary} + +এই টিউটোরিয়ালের মাধ্যমে, আমরা অনচেইন ডেটা কোয়েরি করে এবং তার একটি অনুভূতি পেয়ে ইথেরিয়ামের ভিত্তিগত ধারণাগুলি এবং ইথেরিয়াম ব্লকচেইন কীভাবে কাজ করে তা বুঝতে পারি। + +এই টিউটোরিয়ালে ব্যবহৃত সমস্ত কোড ধারণকারী ড্যাশবোর্ডটি [এখানে](https://dune.com/paulapivat/Learn-Ethereum) পাওয়া যাবে। + +web3 অন্বেষণ করতে ডেটার আরও ব্যবহারের জন্য [আমাকে টুইটারে খুঁজুন](https://twitter.com/paulapivat)। diff --git a/public/content/translations/bn/developers/tutorials/logging-events-smart-contracts/index.md b/public/content/translations/bn/developers/tutorials/logging-events-smart-contracts/index.md new file mode 100644 index 00000000000..450c9768df2 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/logging-events-smart-contracts/index.md @@ -0,0 +1,62 @@ +--- +title: "ইভেন্টস সহ স্মার্ট কন্ট্র্যাক্ট থেকে ডেটা লগ করা" +description: "স্মার্ট কন্ট্র্যাক্ট ইভেন্টস-এর একটি ভূমিকা এবং ডেটা লগ করতে আপনি কীভাবে সেগুলি ব্যবহার করতে পারেন" +author: "jdourlens" +tags: [ "স্মার্ট কন্ট্র্যাক্ট", "remix", "সলিডিটি", "ইভেন্টস" ] +skill: intermediate +lang: bn +published: 2020-04-03 +source: EthereumDev +sourceUrl: https://ethereumdev.io/logging-data-with-events/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +Solidity-তে, [events](/developers/docs/smart-contracts/anatomy/#events-and-logs) হলো প্রেরিত সংকেত যা স্মার্ট কন্ট্র্যাক্ট ফায়ার করতে পারে। ডিএ্যাপস, বা Ethereum JSON-RPC API-এর সাথে সংযুক্ত যেকোনো কিছু, এই ইভেন্টসগুলো শুনতে পারে এবং সেই অনুযায়ী কাজ করতে পারে। একটি ইভেন্টকেও ইন্ডেক্স করা যেতে পারে যাতে ইভেন্টের ইতিহাস পরে সার্চ করা যায়। + +## ইভেন্ট {#events} + +এই নিবন্ধটি লেখার সময় Ethereum ব্লকচেইনের সবচেয়ে সাধারণ ইভেন্ট হলো ট্রান্সফার ইভেন্ট যা ERC20 টোকেন দ্বারা নির্গত হয় যখন কেউ টোকেন ট্রান্সফার করে। + +```solidity +event Transfer(address indexed from, address indexed to, uint256 value); +``` + +ইভেন্টের সিগনেচারটি কন্ট্র্যাক্ট কোডের ভিতরে ঘোষণা করা হয় এবং এমিট কীওয়ার্ড দিয়ে নির্গত করা যেতে পারে। উদাহরণস্বরূপ, ট্রান্সফার ইভেন্ট লগ করে কে ট্রান্সফার পাঠিয়েছে (_from_), কাকে (_to_) এবং কত টোকেন ট্রান্সফার করা হয়েছে (_value_)। + +যদি আমরা আমাদের কাউন্টার স্মার্ট কন্ট্র্যাক্টে ফিরে যাই এবং প্রতিবার মান পরিবর্তন হলে লগ করার সিদ্ধান্ত নিই। যেহেতু এই কন্ট্র্যাক্টটি ডিপ্লয় করার জন্য নয় বরং এটিকে প্রসারিত করে অন্য একটি কন্ট্র্যাক্ট তৈরির ভিত্তি হিসাবে কাজ করার জন্য: এটিকে একটি অ্যাবস্ট্রাক্ট কন্ট্র্যাক্ট বলা হয়। আমাদের কাউন্টার উদাহরণের ক্ষেত্রে, এটি দেখতে এইরকম হবে: + +```solidity +pragma solidity 0.5.17; + +contract Counter { + + event ValueChanged(uint oldValue, uint256 newValue); + + // সংখ্যার গণনা রাখার জন্য আনসাইন্ড ইন্ট টাইপের প্রাইভেট ভেরিয়েবল + uint256 private count = 0; + + // ফাংশন যা আমাদের কাউন্টার বৃদ্ধি করে + function increment() public { + count += 1; + emit ValueChanged(count - 1, count); + } + + // গণনার মান পাওয়ার জন্য গেটার + function getCount() public view returns (uint256) { + return count; + } + +} +``` + +লক্ষ্য করুন যে: + +- **লাইন 5**: আমরা আমাদের ইভেন্ট এবং এতে কী রয়েছে, পুরানো মান এবং নতুন মান ঘোষণা করি। + +- **লাইন 13**: যখন আমরা আমাদের কাউন্ট ভেরিয়েবল বৃদ্ধি করি, তখন আমরা ইভেন্টটি নির্গত করি। + +যদি আমরা এখন কন্ট্র্যাক্টটি ডিপ্লয় করি এবং ইনক্রিমেন্ট ফাংশনটি কল করি, আমরা দেখতে পাব যে আপনি যদি লগস নামের একটি অ্যারের ভিতরে নতুন ট্রানজ্যাকশনে ক্লিক করেন তবে Remix স্বয়ংক্রিয়ভাবে এটি প্রদর্শন করবে। + +![Remix স্ক্রিনশট](./remix-screenshot.png) + +লগগুলি আপনার স্মার্ট কন্ট্র্যাক্ট ডিবাগ করার জন্য সত্যিই দরকারী কিন্তু আপনি যদি বিভিন্ন লোকের দ্বারা ব্যবহৃত অ্যাপ্লিকেশন তৈরি করেন এবং আপনার স্মার্ট কন্ট্র্যাক্ট কীভাবে ব্যবহার করা হয় তা ট্র্যাক এবং বোঝার জন্য বিশ্লেষণ করা সহজ করে তোলে তবে সেগুলিও গুরুত্বপূর্ণ। ট্রানজ্যাকশনের মাধ্যমে তৈরি করা লগগুলি জনপ্রিয় ব্লক এক্সপ্লোরারে প্রদর্শিত হয় এবং আপনি উদাহরণস্বরূপ, নির্দিষ্ট ইভেন্ট শোনার জন্য এবং সেগুলি ঘটলে পদক্ষেপ নেওয়ার জন্য অফচেইন স্ক্রিপ্ট তৈরি করতেও সেগুলি ব্যবহার করতে পারেন। diff --git a/public/content/translations/bn/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md b/public/content/translations/bn/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md new file mode 100644 index 00000000000..1de9f65240e --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/merkle-proofs-for-offline-data-integrity/index.md @@ -0,0 +1,247 @@ +--- +title: "অফলাইন ডেটা ইন্টিগ্রিটির জন্য মেরকেল প্রুফস" +description: "যে ডেটা বেশিরভাগই অফচেইনে স্টোর করা থাকে, সেই ডেটার ইন্টিগ্রিটি অনচেইনে নিশ্চিত করা" +author: Ori Pomerantz +tags: [ "সংগ্রহস্থল" ] +skill: advanced +lang: bn +published: 2021-12-30 +--- + +## ভূমিকা {#introduction} + +আদর্শগতভাবে আমরা ইথেরিয়াম সংগ্রহস্থলে সবকিছু স্টোর করতে চাই, যা হাজার হাজার কম্পিউটার জুড়ে স্টোর করা থাকে এবং এর +অত্যন্ত উচ্চ প্রাপ্যতা (ডেটা সেন্সর করা যায় না) এবং ইন্টিগ্রিটি (ডেটা অননুমোদিত উপায়ে পরিবর্তন করা যায় না) রয়েছে, তবে একটি 32-বাইট শব্দ স্টোর করতে সাধারণত 20,000 গ্যাস খরচ হয়। আমি যখন এটি লিখছি, তখন সেই খরচ +$6.60 এর সমতুল্য। প্রতি বাইটে 21 সেন্টে এটি অনেক ব্যবহারের জন্য খুবই ব্যয়বহুল। + +এই সমস্যার সমাধান করার জন্য ইথেরিয়াম ইকোসিস্টেম বিকেন্দ্রীভূত উপায়ে ডেটা স্টোর করার জন্য [অনেক বিকল্প উপায় তৈরি করেছে](/developers/docs/storage/)। সাধারণত এগুলিতে প্রাপ্যতা +এবং মূল্যের মধ্যে একটি ট্রেডঅফ জড়িত থাকে। তবে, ইন্টিগ্রিটি সাধারণত নিশ্চিত করা হয়। + +এই নিবন্ধে আপনি শিখবেন **কিভাবে** ব্লকচেইনে ডেটা স্টোর না করে ডেটা ইন্টিগ্রিটি নিশ্চিত করতে হয়, [Merkle proofs](https://computersciencewiki.org/index.php/Merkle_proof) ব্যবহার করে। + +## এটি কিভাবে কাজ করে? {#how-does-it-work} + +তাত্ত্বিকভাবে আমরা ডেটার হ্যাস অনচেইনে স্টোর করতে পারি, এবং লেনদেনে প্রয়োজনীয় সমস্ত ডেটা পাঠাতে পারি। তবে, এটি এখনও খুব ব্যয়বহুল। একটি লেনদেনে এক বাইট ডেটার জন্য প্রায় 16 গ্যাস খরচ হয়, বর্তমানে প্রায় অর্ধেক সেন্ট, বা প্রতি কিলোবাইটে প্রায় $5। প্রতি মেগাবাইটে $5000 হলে, এটি অনেক ব্যবহারের জন্য এখনও খুব ব্যয়বহুল, এমনকি ডেটা হ্যাস করার অতিরিক্ত খরচ ছাড়াই। + +এর সমাধান হল ডেটার বিভিন্ন উপসেটকে বারবার হ্যাস করা, যাতে আপনার যে ডেটা পাঠাতে হবে না তার জন্য আপনি কেবল একটি হ্যাস পাঠাতে পারেন। আপনি এটি একটি Merkle tree ব্যবহার করে করেন, এটি একটি ট্রি ডেটা স্ট্রাকচার যেখানে প্রতিটি নোড তার নীচের নোডগুলির একটি হ্যাস: + +![মেরকেল ট্রি](tree.png) + +রুট হ্যাস হল একমাত্র অংশ যা অনচেইনে স্টোর করা প্রয়োজন। একটি নির্দিষ্ট মান প্রমাণ করতে, আপনি সমস্ত হ্যাস সরবরাহ করেন যা রুটে পৌঁছানোর জন্য এর সাথে একত্রিত করা প্রয়োজন। উদাহরণস্বরূপ, `C` প্রমাণ করতে আপনি `D`, `H(A-B)`, এবং `H(E-H)` সরবরাহ করেন। + +![C-এর মানের প্রমাণ](proof-c.png) + +## বাস্তবায়ন {#implementation} + +[নমুনা কোডটি এখানে সরবরাহ করা হয়েছে](https://github.com/qbzzt/merkle-proofs-for-offline-data-integrity)। + +### অফচেইন কোড {#offchain-code} + +এই নিবন্ধে আমরা অফচেইন গণনার জন্য JavaScript ব্যবহার করি। বেশিরভাগ ডিসেন্ট্রালাইজড এপ্লিকেশনগুলির অফচেইন কম্পোনেন্ট JavaScript-এ থাকে। + +#### Merkle রুট তৈরি করা {#creating-the-merkle-root} + +প্রথমে আমাদের চেইনে Merkle রুট সরবরাহ করতে হবে। + +```javascript +const ethers = require("ethers") +``` + +[আমরা ethers প্যাকেজ থেকে হ্যাস ফাংশনটি ব্যবহার করি](https://docs.ethers.io/v5/api/utils/hashing/#utils-keccak256)। + +```javascript +// কাঁচা ডেটা যার ইন্টিগ্রিটি আমাদের যাচাই করতে হবে। প্রথম দুটি বাইট একটি +// ব্যবহারকারী শনাক্তকারী, এবং শেষ দুটি বাইট ব্যবহারকারীর বর্তমানে মালিকানাধীন টোকেনের পরিমাণ। +const dataArray = [ + 0x0bad0010, 0x60a70020, 0xbeef0030, 0xdead0040, 0xca110050, 0x0e660060, + 0xface0070, 0xbad00080, 0x060d0091, +] +``` + +প্রতিটি এন্ট্রিকে একটি একক 256-বিট পূর্ণসংখ্যাতে এনকোড করার ফলে, উদাহরণস্বরূপ, JSON ব্যবহারের চেয়ে কম পঠনযোগ্য কোড তৈরি হয়। তবে, এর অর্থ হল চুক্তিতে ডেটা পুনরুদ্ধারের জন্য উল্লেখযোগ্যভাবে কম প্রক্রিয়াকরণ, তাই অনেক কম গ্যাস খরচ হয়। [আপনি অনচেইনে JSON পড়তে পারেন](https://github.com/chrisdotn/jsmnSol), এটি যদি এড়ানো যায় তবে এটি একটি খারাপ ধারণা। + +```javascript +// হ্যাস মানের অ্যারে, BigInts হিসাবে +const hashArray = dataArray +``` + +এই ক্ষেত্রে আমাদের ডেটা শুরু করার জন্য 256-বিট মান, তাই কোনও প্রক্রিয়াকরণের প্রয়োজন নেই। আমরা যদি স্ট্রিংয়ের মতো আরও জটিল ডেটা স্ট্রাকচার ব্যবহার করি, তবে আমাদের নিশ্চিত করতে হবে যে আমরা প্রথমে ডেটা হ্যাস করে হ্যাসের একটি অ্যারে পেয়েছি। মনে রাখবেন যে এটিও কারণ ব্যবহারকারীরা অন্যান্য ব্যবহারকারীদের তথ্য জানলে আমাদের কিছু যায় আসে না। অন্যথায় আমাদের হ্যাস করতে হতো যাতে ব্যবহারকারী 1 ব্যবহারকারী 0-এর মান জানতে না পারে, ব্যবহারকারী 2 ব্যবহারকারী 3-এর মান জানতে না পারে ইত্যাদি। + +```javascript +// হ্যাস ফাংশন যে স্ট্রিং আশা করে এবং আমরা অন্য সব জায়গায় যে BigInt ব্যবহার করি তার মধ্যে রূপান্তর করুন। +const hash = (x) => + BigInt(ethers.utils.keccak256("0x" + x.toString(16).padStart(64, 0))) +``` + +ethers হ্যাস ফাংশনটি একটি হেক্সাডেসিমেল সংখ্যা সহ একটি জাভাস্ক্রিপ্ট স্ট্রিং পাওয়ার আশা করে, যেমন `0x60A7`, এবং একই কাঠামো সহ অন্য একটি স্ট্রিং দিয়ে প্রতিক্রিয়া জানায়। তবে, বাকি কোডের জন্য `BigInt` ব্যবহার করা সহজ, তাই আমরা একটি হেক্সাডেসিমেল স্ট্রিংয়ে রূপান্তর করি এবং আবার ফিরে আসি। + +```javascript +// একটি জোড়ার প্রতিসম হ্যাস যাতে ক্রমটি বিপরীত হলে আমাদের কিছু যায় আসে না। +const pairHash = (a, b) => hash(hash(a) ^ hash(b)) +``` + +এই ফাংশনটি প্রতিসম (a [xor](https://en.wikipedia.org/wiki/Exclusive_or) b-এর হ্যাস)। এর মানে হল যে যখন আমরা Merkle প্রমাণটি পরীক্ষা করি তখন আমাদের প্রমাণের মানটি গণনাকৃত মানের আগে বা পরে রাখতে হবে কিনা তা নিয়ে চিন্তা করার দরকার নেই। Merkle প্রুফ চেকিং অনচেইনে করা হয়, তাই সেখানে আমাদের যত কম কাজ করতে হবে ততই ভালো। + +সতর্কতা: +ক্রিপ্টোগ্রাফি দেখতে যতটা সহজ মনে হয় তার চেয়ে কঠিন। +এই নিবন্ধটির প্রাথমিক সংস্করণে `hash(a^b)` হ্যাস ফাংশন ছিল। +এটি একটি **খারাপ** ধারণা ছিল কারণ এর মানে হল যে আপনি যদি `a` এবং `b`-এর বৈধ মানগুলি জানতেন তবে আপনি যে কোনও পছন্দসই `a'` মান প্রমাণ করতে `b' = a^b^a'` ব্যবহার করতে পারতেন। +এই ফাংশনটির সাথে আপনাকে `b'` গণনা করতে হবে যাতে `hash(a') ^ hash(b')` একটি পরিচিত মানের সমান হয় (রুটে যাওয়ার পথে পরবর্তী শাখা), যা অনেক কঠিন। + +```javascript +// একটি নির্দিষ্ট শাখা খালি, এর কোনো মান নেই বোঝানোর জন্য মান +// এর কোনো মান নেই +const empty = 0n +``` + +যখন মানের সংখ্যা দুইয়ের পূর্ণসংখ্যার ঘাত নয় তখন আমাদের খালি শাখাগুলি পরিচালনা করতে হবে। এই প্রোগ্রামটি যেভাবে এটি করে তা হল একটি স্থানধারক হিসাবে শূন্য রাখা। + +![শাখা ছাড়া Merkle ট্রি](merkle-empty-hash.png) + +```javascript +// ক্রমানুসারে প্রতিটি জোড়ার হ্যাস নিয়ে হ্যাস অ্যারের ট্রির এক স্তর উপরে গণনা করুন +// প্রতিটি জোড়ার পর্যায়ক্রমে +const oneLevelUp = (inputArray) => { + var result = [] + var inp = [...inputArray] // ইনপুট ওভাররাইট করা এড়াতে // প্রয়োজনে একটি খালি মান যোগ করুন (আমাদের সব লিফকে // জোড়া করতে হবে) + + if (inp.length % 2 === 1) inp.push(empty) + + for (var i = 0; i < inp.length; i += 2) + result.push(pairHash(inp[i], inp[i + 1])) + + return result +} // oneLevelUp +``` + +এই ফাংশনটি বর্তমান স্তরের মানগুলির জোড়া হ্যাস করে Merkle ট্রিতে এক স্তর "উপরে ওঠে"। মনে রাখবেন যে এটি সবচেয়ে কার্যকর বাস্তবায়ন নয়, আমরা ইনপুট অনুলিপি করা এড়াতে পারতাম এবং লুপে উপযুক্ত সময়ে `hashEmpty` যোগ করতে পারতাম, কিন্তু এই কোডটি পঠনযোগ্যতার জন্য অপ্টিমাইজ করা হয়েছে। + +```javascript +const getMerkleRoot = (inputArray) => { + var result + + result = [...inputArray] // ট্রি-এর উপরে উঠুন যতক্ষণ না কেবল একটি মান থাকে, যা // রুট। // // যদি একটি স্তরে বিজোড় সংখ্যক এন্ট্রি থাকে তবে // oneLevelUp-এর কোড একটি খালি মান যোগ করে, তাই যদি আমাদের কাছে থাকে, উদাহরণস্বরূপ, // ১০টি লিফ তাহলে দ্বিতীয় স্তরে আমাদের ৫টি শাখা থাকবে, তৃতীয় স্তরে ৩টি // শাখা, চতুর্থটিতে ২টি এবং রুটটি পঞ্চম + + while (result.length > 1) result = oneLevelUp(result) + + return result[0] +} +``` + +রুট পেতে, একটি মাত্র মান অবশিষ্ট থাকা পর্যন্ত উপরে উঠুন। + +#### একটি Merkle প্রুফ তৈরি করা {#creating-a-merkle-proof} + +একটি Merkle প্রুফ হল Merkle রুটে ফিরে যাওয়ার জন্য প্রমাণিত মানের সাথে একসাথে হ্যাস করার মান। প্রমাণ করার মানটি প্রায়শই অন্যান্য ডেটা থেকে পাওয়া যায়, তাই আমি এটিকে কোডের অংশ হিসাবে না দিয়ে আলাদাভাবে প্রদান করতে পছন্দ করি। + +```javascript +// একটি মেরকেল প্রুফ এন্ট্রিগুলির তালিকার মান নিয়ে গঠিত যার সাথে +// হ্যাস করা হবে। কারণ আমরা একটি প্রতিসম হ্যাস ফাংশন ব্যবহার করি, আমাদের +// প্রুফ যাচাই করার জন্য আইটেমটির অবস্থানের প্রয়োজন নেই, শুধুমাত্র এটি তৈরি করার জন্য প্রয়োজন +const getMerkleProof = (inputArray, n) => { +    var result = [], currentLayer = [...inputArray], currentN = n + +    // আমরা শীর্ষে না পৌঁছানো পর্যন্ত +    while (currentLayer.length > 1) { +        // বিজোড় দৈর্ঘ্যের স্তর নেই +        if (currentLayer.length % 2) +            currentLayer.push(empty) + +        result.push(currentN % 2 +               // যদি currentN বিজোড় হয়, তবে প্রুফের আগের মানটির সাথে যোগ করুন +            ? currentLayer[currentN-1] +               // যদি এটি জোড় হয়, তবে এর পরের মানটি যোগ করুন +            : currentLayer[currentN+1]) + +``` + +আমরা `(v[0],v[1])`, `(v[2],v[3])` ইত্যাদি হ্যাস করি। সুতরাং জোড় মানের জন্য আমাদের পরেরটি প্রয়োজন, বিজোড় মানের জন্য আগেরটি। + +```javascript +        // পরবর্তী স্তরে যান +        currentN = Math.floor(currentN/2) +        currentLayer = oneLevelUp(currentLayer) +    }   // while currentLayer.length > 1 + +    return result +}   // getMerkleProof +``` + +### অনচেইন কোড {#onchain-code} + +অবশেষে আমাদের কাছে কোড আছে যা প্রুফ পরীক্ষা করে। অনচেইন কোডটি [Solidity](https://docs.soliditylang.org/en/v0.8.11/) তে লেখা হয়েছে। এখানে অপ্টিমাইজেশন অনেক বেশি গুরুত্বপূর্ণ কারণ গ্যাস তুলনামূলকভাবে ব্যয়বহুল। + +```solidity +//SPDX-License-Identifier: Public Domain +pragma solidity ^0.8.0; + +import "hardhat/console.sol"; +``` + +আমি এটি [Hardhat ডেভেলপমেন্ট এনভায়রনমেন্ট](https://hardhat.org/) ব্যবহার করে লিখেছি, যা আমাদের ডেভেলপ করার সময় [Solidity থেকে কনসোল আউটপুট](https://hardhat.org/docs/cookbook/debug-logs) পেতে দেয়। + +```solidity + +contract MerkleProof { +    uint merkleRoot; + +    function getRoot() public view returns (uint) { +      return merkleRoot; +    } + +    // অত্যন্ত নিরাপত্তাহীন, প্রোডাকশন কোডে অ্যাক্সেস +    // এই ফাংশনটি অবশ্যই কঠোরভাবে সীমিত হতে হবে, সম্ভবত একজন +    // মালিকের জন্য +    function setRoot(uint _merkleRoot) external { +      merkleRoot = _merkleRoot; +    }   // setRoot +``` + +Merkle রুটের জন্য সেট এবং গেট ফাংশন। সবাইকে Merkle রুট আপডেট করতে দেওয়া একটি প্রোডাকশন সিস্টেমে একটি _অত্যন্ত খারাপ ধারণা_। নমুনা কোডের জন্য সরলতার খাতিরে আমি এখানে এটি করি। **এমন সিস্টেমে এটি করবেন না যেখানে ডেটা ইন্টিগ্রিটি সত্যিই গুরুত্বপূর্ণ**। + +```solidity +    function hash(uint _a) internal pure returns(uint) { +      return uint(keccak256(abi.encode(_a))); +    } + +    function pairHash(uint _a, uint _b) internal pure returns(uint) { +      return hash(hash(_a) ^ hash(_b)); +    } +``` + +এই ফাংশনটি একটি জোড়া হ্যাস তৈরি করে। এটি `hash` এবং `pairHash`-এর জন্য জাভাস্ক্রিপ্ট কোডের সলিডিটি অনুবাদ। + +**দ্রষ্টব্য:** এটি পঠনযোগ্যতার জন্য অপ্টিমাইজেশনের আরেকটি ক্ষেত্র। [ফাংশন সংজ্ঞা](https://www.tutorialspoint.com/solidity/solidity_cryptographic_functions.htm)-এর উপর ভিত্তি করে, ডেটা একটি [`bytes32`](https://docs.soliditylang.org/en/v0.5.3/types.html#fixed-size-byte-arrays) মান হিসাবে স্টোর করা এবং রূপান্তরগুলি এড়ানো সম্ভব হতে পারে। + +```solidity +    // একটি Merkle প্রুফ যাচাই করুন +    function verifyProof(uint _value, uint[] calldata _proof) +        public view returns (bool) { +      uint temp = _value; +      uint i; + +      for(i=0; i<_proof.length; i++) { +        temp = pairHash(temp, _proof[i]); +      } + +      return temp == merkleRoot; +    } + +}  // MarkleProof +``` + +গাণিতিক স্বরলিপিতে Merkle প্রুফ যাচাইকরণ দেখতে এইরকম: `H(proof_n, H(proof_n-1, H(proof_n-2, ...` H(proof_1, H(proof_0, value))...)))`। এই কোডটি এটি বাস্তবায়ন করে। + +## Merkle প্রুফ এবং রোলআপগুলি মেশে না {#merkle-proofs-and-rollups} + +Merkle প্রুফ [রোলআপ](/developers/docs/scaling/#rollups)-এর সাথে ভালো কাজ করে না। এর কারণ হল রোলআপগুলি L1-এ সমস্ত লেনদেনের ডেটা লেখে, কিন্তু L2-তে প্রক্রিয়া করে। একটি লেনদেনের সাথে একটি Merkle প্রুফ পাঠানোর খরচ প্রতি স্তরে গড়ে 638 গ্যাস (বর্তমানে কল ডেটাতে একটি বাইটের খরচ 16 গ্যাস যদি এটি শূন্য না হয়, এবং 4 যদি এটি শূন্য হয়)। যদি আমাদের কাছে 1024 শব্দের ডেটা থাকে, একটি Merkle প্রুফের জন্য দশটি স্তর বা মোট 6380 গ্যাস প্রয়োজন। + +উদাহরণস্বরূপ [Optimism](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m)-এ, L1 গ্যাস লেখার খরচ প্রায় 100 gwei এবং L2 গ্যাস খরচ 0.001 gwei (এটি স্বাভাবিক মূল্য, এটি কনজেশনের সাথে বাড়তে পারে)। সুতরাং একটি L1 গ্যাসের খরচে আমরা L2 প্রক্রিয়াকরণে এক লক্ষ গ্যাস ব্যয় করতে পারি। ধরে নিচ্ছি আমরা সংগ্রহস্থল ওভাররাইট করি না, এর মানে হল যে আমরা একটি L1 গ্যাসের দামে L2-তে সংগ্রহস্থলে প্রায় পাঁচটি শব্দ লিখতে পারি। একটি একক Merkle প্রুফের জন্য আমরা সম্পূর্ণ 1024 শব্দ সংগ্রহস্থলে লিখতে পারি (ধরে নিচ্ছি সেগুলি লেনদেনে সরবরাহ করার পরিবর্তে অনচেইনে গণনা করা যেতে পারে) এবং তারপরেও বেশিরভাগ গ্যাস অবশিষ্ট থাকে। + +## উপসংহার {#conclusion} + +বাস্তব জীবনে আপনি নিজে থেকে Merkle ট্রি বাস্তবায়ন নাও করতে পারেন। সুপরিচিত এবং নিরীক্ষিত লাইব্রেরি রয়েছে যা আপনি ব্যবহার করতে পারেন এবং সাধারণভাবে বলতে গেলে, নিজের থেকে ক্রিপ্টোগ্রাফিক প্রিমিটিভগুলি বাস্তবায়ন না করাই ভাল। কিন্তু আমি আশা করি যে এখন আপনি Merkle প্রুফগুলি আরও ভালভাবে বুঝতে পারবেন এবং সিদ্ধান্ত নিতে পারবেন যে কখন সেগুলি ব্যবহার করা মূল্যবান। + +মনে রাখবেন যে Merkle প্রুফগুলি _ইন্টিগ্রিটি_ সংরক্ষণ করে, তারা _প্রাপ্যতা_ সংরক্ষণ করে না। অন্য কেউ আপনার সম্পদ নিতে পারবে না এটা জেনে সামান্য সান্ত্বনা হয় যদি ডেটা সংগ্রহস্থল অ্যাক্সেস নিষিদ্ধ করার সিদ্ধান্ত নেয় এবং আপনি সেগুলি অ্যাক্সেস করার জন্য একটি Merkle ট্রি তৈরি করতে না পারেন। সুতরাং Merkle ট্রি বিকেন্দ্রীভূত সংগ্রহস্থলের সাথে সবচেয়ে ভাল ব্যবহার করা হয়, যেমন IPFS। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। diff --git a/public/content/translations/bn/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md b/public/content/translations/bn/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md new file mode 100644 index 00000000000..4b38e395203 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/monitoring-geth-with-influxdb-and-grafana/index.md @@ -0,0 +1,151 @@ +--- +title: "InfluxDB এবং Grafana দিয়ে Geth পর্যবেক্ষণ" +description: "আপনার Geth নোডের কার্যকারিতা ট্র্যাক করতে এবং সমস্যা শনাক্ত করতে InfluxDB ও Grafana ব্যবহার করে পর্যবেক্ষণ ব্যবস্থা সেট আপ করুন।" +author: "Mario Havel" +tags: [ "ক্লায়েন্ট", "নোড" ] +skill: intermediate +lang: bn +published: 2021-01-13 +--- + +এই টিউটোরিয়ালটি আপনাকে আপনার Geth নোডের জন্য পর্যবেক্ষণ ব্যবস্থা সেট আপ করতে সাহায্য করবে, যাতে আপনি এর কার্যকারিতা আরও ভালোভাবে বুঝতে পারেন এবং সম্ভাব্য সমস্যাগুলি শনাক্ত করতে পারেন। + +## পূর্বশর্ত {#prerequisites} + +- আপনার Geth-এর একটি ইনস্ট্যান্স আগে থেকেই চালু থাকা উচিত। +- বেশিরভাগ ধাপ এবং উদাহরণ linux পরিবেশের জন্য, তাই টার্মিনাল সম্পর্কে প্রাথমিক জ্ঞান থাকা সহায়ক হবে। +- Geth-এর মেট্রিক্স স্যুটের এই ভিডিও ওভারভিউটি দেখুন: [Péter Szilágyi-র ইথেরিয়াম পরিকাঠামো পর্যবেক্ষণ](https://www.youtube.com/watch?v=cOBab8IJMYI)। + +## পর্যবেক্ষণ স্ট্যাক {#monitoring-stack} + +একটি ইথেরিয়াম ক্লায়েন্ট প্রচুর ডেটা সংগ্রহ করে যা একটি ক্রনোলজিক্যাল ডেটাবেসের আকারে পড়া যায়। পর্যবেক্ষণ সহজ করার জন্য, আপনি এটি ডেটা ভিজ্যুয়ালাইজেশন সফ্টওয়্যারে ফিড করতে পারেন। একাধিক বিকল্প উপলব্ধ রয়েছে: + +- [Prometheus](https://prometheus.io/) (পুল মডেল) +- [InfluxDB](https://www.influxdata.com/get-influxdb/) (পুশ মডেল) +- [Telegraf](https://www.influxdata.com/get-influxdb/) +- [Grafana](https://www.grafana.com/) +- [Datadog](https://www.datadoghq.com/) +- [Chronograf](https://www.influxdata.com/time-series-platform/chronograf/) + +এছাড়াও [Geth Prometheus Exporter](https://github.com/hunterlong/gethexporter) রয়েছে, যা InfluxDB এবং Grafana-এর সাথে আগে থেকে কনফিগার করা একটি বিকল্প। + +এই টিউটোরিয়ালে, আমরা আপনার Geth ক্লায়েন্টকে একটি ডেটাবেস তৈরি করতে InfluxDB-তে ডেটা পুশ করার জন্য এবং ডেটার গ্রাফ ভিজ্যুয়ালাইজেশন তৈরি করতে Grafana সেট আপ করব। এটি ম্যানুয়ালি করলে আপনাকে প্রক্রিয়াটি আরও ভালভাবে বুঝতে, এটি পরিবর্তন করতে এবং বিভিন্ন পরিবেশে ডেপ্লয় করতে সাহায্য করবে। + +## InfluxDB সেট আপ করা {#setting-up-influxdb} + +প্রথমে, আসুন InfluxDB ডাউনলোড এবং ইনস্টল করি। বিভিন্ন ডাউনলোডের বিকল্প [Influxdata রিলিজ পেজ](https://portal.influxdata.com/downloads/)-এ পাওয়া যাবে। আপনার পরিবেশের জন্য উপযুক্ত বিকল্পটি বেছে নিন। +আপনি এটি একটি [রিপোজিটরি](https://repos.influxdata.com/) থেকেও ইনস্টল করতে পারেন। উদাহরণস্বরূপ, ডেবিয়ান-ভিত্তিক ডিস্ট্রিবিউশনে: + +``` +curl -tlsv1.3 --proto =https -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add +source /etc/lsb-release +echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list +sudo apt update +sudo apt install influxdb -y +sudo systemctl enable influxdb +sudo systemctl start influxdb +sudo apt install influxdb-client +``` + +InfluxDB সফলভাবে ইনস্টল করার পরে, নিশ্চিত করুন যে এটি ব্যাকগ্রাউন্ডে চলছে। ডিফল্টরূপে, এটি `localhost:8086`-এ অ্যাক্সেসযোগ্য। +`influx` ক্লায়েন্ট ব্যবহার করার আগে, আপনাকে অ্যাডমিন সুবিধা সহ একজন নতুন ব্যবহারকারী তৈরি করতে হবে। এই ব্যবহারকারীকে উচ্চ-স্তরের ব্যবস্থাপনা, ডেটাবেস ও ব্যবহারকারী তৈরির কাজে ব্যবহার করা হবে। + +``` +curl -XPOST "http://localhost:8086/query" --data-urlencode "q=CREATE USER username WITH PASSWORD 'password' WITH ALL PRIVILEGES" +``` + +এখন আপনি এই ব্যবহারকারীর মাধ্যমে [InfluxDB shell](https://docs.influxdata.com/influxdb/v1.8/tools/shell/)-এ প্রবেশ করতে influx ক্লায়েন্ট ব্যবহার করতে পারেন। + +``` +influx -username 'username' -password 'password' +``` + +এর শেল থেকে সরাসরি InfluxDB-এর সাথে যোগাযোগ করে, আপনি geth মেট্রিক্সের জন্য ডেটাবেস এবং ব্যবহারকারী তৈরি করতে পারেন। + +``` +create database geth +create user geth with password choosepassword +``` + +তৈরি করা এন্ট্রিগুলো যাচাই করুন: + +``` +show databases +show users +``` + +InfluxDB শেল থেকে বেরিয়ে আসুন। + +``` +exit +``` + +InfluxDB এখন Geth থেকে মেট্রিক্স সংরক্ষণ করার জন্য চলছে এবং কনফিগার করা হয়েছে। + +## Geth প্রস্তুত করা {#preparing-geth} + +ডেটাবেস সেট আপ করার পরে, আমাদের Geth-এ মেট্রিক্স সংগ্রহ চালু করতে হবে। `geth --help`-এর মধ্যে `METRICS AND STATS OPTIONS`-এর দিকে মনোযোগ দিন। সেখানে একাধিক বিকল্প পাওয়া যাবে, এই ক্ষেত্রে আমরা চাই Geth যেন InfluxDB-তে ডেটা পুশ করে। +বেসিক সেটআপে এন্ডপয়েন্ট (যেখানে InfluxDB উপলব্ধ) এবং ডেটাবেসের জন্য প্রমাণীকরণ নির্দিষ্ট করা থাকে। + +``` +geth --metrics --metrics.influxdb --metrics.influxdb.endpoint "http://0.0.0.0:8086" --metrics.influxdb.username "geth" --metrics.influxdb.password "chosenpassword" +``` + +এই ফ্ল্যাগগুলি ক্লায়েন্ট চালু করার কমান্ডের সাথে যুক্ত করা যেতে পারে অথবা কনফিগারেশন ফাইলে সেভ করা যেতে পারে। + +আপনি যাচাই করতে পারেন যে Geth সফলভাবে ডেটা পুশ করছে, উদাহরণস্বরূপ, ডেটাবেসে মেট্রিক্স তালিকাভুক্ত করে। InfluxDB শেলে: + +``` +use geth +show measurements +``` + +## Grafana সেট আপ করা {#setting-up-grafana} + +পরবর্তী ধাপ হল Grafana ইনস্টল করা, যা ডেটাকে গ্রাফিকভাবে ব্যাখ্যা করবে। Grafana নথিপত্রে আপনার পরিবেশের জন্য ইনস্টলেশন প্রক্রিয়া অনুসরণ করুন। যদি অন্য কোনো সংস্করণ ব্যবহার করতে না চান, তবে OSS সংস্করণটিই ইনস্টল করুন। +রিপোজিটরি ব্যবহার করে ডেবিয়ান ডিস্ট্রিবিউশনের জন্য ইনস্টলেশনের উদাহরণ: + +``` +curl -tlsv1.3 --proto =https -sL https://packages.grafana.com/gpg.key | sudo apt-key add - +echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list +sudo apt update +sudo apt install grafana +sudo systemctl enable grafana-server +sudo systemctl start grafana-server +``` + +Grafana চালু হয়ে গেলে, এটি `localhost:3000`-এ অ্যাক্সেসযোগ্য হওয়া উচিত। +এই পাথে অ্যাক্সেস করতে আপনার পছন্দের ব্রাউজার ব্যবহার করুন, তারপর ডিফল্ট শংসাপত্র (ব্যবহারকারী: `admin` এবং পাসওয়ার্ড: `admin`) দিয়ে লগইন করুন। প্রম্পট করা হলে, ডিফল্ট পাসওয়ার্ড পরিবর্তন করে সেভ করুন। + +![](./grafana1.png) + +আপনাকে Grafana হোম পেজে রিডাইরেক্ট করা হবে। প্রথমে, আপনার সোর্স ডেটা সেট আপ করুন। বাম বারের কনফিগারেশন আইকনে ক্লিক করুন এবং "Data sources" নির্বাচন করুন। + +![](./grafana2.png) + +এখনও কোনো ডেটা সোর্স তৈরি করা হয়নি, একটি যোগ করতে "Add data source"-এ ক্লিক করুন। + +![](./grafana3.png) + +এই সেটআপের জন্য, "InfluxDB" নির্বাচন করুন এবং এগিয়ে যান। + +![](./grafana4.png) + +আপনি যদি একই মেশিনে টুলসগুলো চালান, তাহলে ডেটা সোর্স কনফিগারেশন বেশ সহজ। আপনাকে InfluxDB ঠিকানা এবং ডেটাবেস অ্যাক্সেস করার জন্য বিস্তারিত তথ্য সেট করতে হবে। নীচের ছবিটি দেখুন। + +![](./grafana5.png) + +যদি সবকিছু সম্পূর্ণ হয় এবং InfluxDB অ্যাক্সেসযোগ্য থাকে, তাহলে "Save and test"-এ ক্লিক করুন এবং কনফার্মেশন পপ আপ হওয়ার জন্য অপেক্ষা করুন। + +![](./grafana6.png) + +Grafana এখন InfluxDB থেকে ডেটা পড়ার জন্য সেট আপ করা হয়েছে। এখন আপনাকে একটি ড্যাশবোর্ড তৈরি করতে হবে যা এই ডেটা ব্যাখ্যা করবে এবং প্রদর্শন করবে। ড্যাশবোর্ডের বৈশিষ্ট্যগুলি JSON ফাইলে এনকোড করা থাকে, যা যে কেউ তৈরি করতে পারে এবং সহজেই ইমপোর্ট করা যায়। বাম বারে, "Create and Import"-এ ক্লিক করুন। + +![](./grafana7.png) + +একটি Geth পর্যবেক্ষণ ড্যাশবোর্ডের জন্য, [এই ড্যাশবোর্ড](https://grafana.com/grafana/dashboards/13877/)-এর আইডি কপি করুন এবং Grafana-র "Import page"-এ পেস্ট করুন। ড্যাশবোর্ডটি সেভ করার পর, এটি এইরকম দেখাবে: + +![](./grafana8.png) + +আপনি আপনার ড্যাশবোর্ড পরিবর্তন করতে পারেন। প্রতিটি প্যানেল এডিট করা, সরানো, মুছে ফেলা বা যোগ করা যেতে পারে। আপনি আপনার কনফিগারেশন পরিবর্তন করতে পারেন। এটা আপনার উপর নির্ভর করছে! ড্যাশবোর্ড কীভাবে কাজ করে সে সম্পর্কে আরও জানতে, [Grafana-র নথিপত্র](https://grafana.com/docs/grafana/latest/dashboards/) দেখুন। +আপনি [অ্যালার্টিং](https://grafana.com/docs/grafana/latest/alerting/)-এও আগ্রহী হতে পারেন। এটি আপনাকে মেট্রিক্স নির্দিষ্ট মানে পৌঁছালে অ্যালার্ট নোটিফিকেশন সেট আপ করার সুবিধা দেয়। বিভিন্ন কমিউনিকেশন চ্যানেল সমর্থিত। diff --git a/public/content/translations/bn/developers/tutorials/nft-minter/index.md b/public/content/translations/bn/developers/tutorials/nft-minter/index.md new file mode 100644 index 00000000000..7bb9f1b0de6 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/nft-minter/index.md @@ -0,0 +1,874 @@ +--- +title: "NFT মিন্টার টিউটোরিয়াল" +description: "এই টিউটোরিয়ালে, আপনি একটি NFT মিন্টার তৈরি করবেন এবং MetaMask ও Web3 টুল ব্যবহার করে আপনার স্মার্ট কন্ট্র্যাক্টকে একটি React ফ্রন্টএন্ডের সাথে সংযুক্ত করে কীভাবে একটি ফুল স্ট্যাক dApp তৈরি করতে হয় তা শিখবেন।" +author: "smudgil" +tags: + [ + "সলিডিটি", + "NFT", + "alchemy", + "স্মার্ট কন্ট্র্যাক্ট", + "ফ্রন্টএন্ড", + "Pinata" + ] +skill: intermediate +lang: bn +published: 2021-10-06 +--- + +Web2 ব্যাকগ্রাউন্ড থেকে আসা ডেভেলপারদের জন্য সবচেয়ে বড় চ্যালেঞ্জগুলির মধ্যে একটি হলো কীভাবে আপনার স্মার্ট কন্ট্র্যাক্টকে একটি ফ্রন্টএন্ড প্রজেক্টের সাথে সংযুক্ত করতে হয় এবং এর সাথে ইন্টারঅ্যাক্ট করতে হয় তা খুঁজে বের করা। + +একটি NFT মিন্টার তৈরি করার মাধ্যমে — একটি সাধারণ UI যেখানে আপনি আপনার ডিজিটাল অ্যাসেটের একটি লিঙ্ক, একটি শিরোনাম এবং একটি বিবরণ ইনপুট করতে পারেন — আপনি শিখবেন কীভাবে: + +- আপনার ফ্রন্টএন্ড প্রজেক্টের মাধ্যমে MetaMask-এর সাথে সংযোগ করুন +- আপনার ফ্রন্টএন্ড থেকে স্মার্ট কন্ট্র্যাক্ট পদ্ধতিগুলিকে কল করুন +- MetaMask ব্যবহার করে ট্রানজ্যাকশন সাইন করুন + +এই টিউটোরিয়ালে, আমরা আমাদের ফ্রন্টএন্ড ফ্রেমওয়ার্ক হিসেবে [React](https://react.dev/) ব্যবহার করব। যেহেতু এই টিউটোরিয়ালটি মূলত Web3 ডেভেলপমেন্টের উপর দৃষ্টি নিবদ্ধ করে, তাই আমরা React-এর মৌলিক বিষয়গুলো বিস্তারিত আলোচনায় খুব বেশি সময় ব্যয় করব না। এর পরিবর্তে, আমরা আমাদের প্রজেক্টে ফাংশনালিটি আনার উপর মনোযোগ দেব। + +পূর্বশর্ত হিসেবে, আপনার React সম্পর্কে প্রাথমিক স্তরের ধারণা থাকা উচিত—কম্পোনেন্ট, প্রপস, useState/useEffect এবং বেসিক ফাংশন কলিং কীভাবে কাজ করে তা জানতে হবে। আপনি যদি আগে এই শব্দগুলোর কোনোটি না শুনে থাকেন, তাহলে আপনি এই [Intro to React tutorial](https://react.dev/learn/tutorial-tic-tac-toe) টি দেখে নিতে পারেন। যারা দেখে শিখতে পছন্দ করেন, তাদের জন্য আমরা Net Ninja-এর এই চমৎকার [Full Modern React Tutorial](https://www.youtube.com/playlist?list=PL4cUxeGkcC9gZD-Tvwfod2gaISzfRiP9d) ভিডিও সিরিজটি অত্যন্ত সুপারিশ করি। + +এবং যদি আপনার এখনও না থাকে, তাহলে এই টিউটোরিয়ালটি সম্পূর্ণ করার পাশাপাশি ব্লকচেইনে কিছু তৈরি করার জন্য আপনার অবশ্যই একটি Alchemy অ্যাকাউন্ট প্রয়োজন হবে। একটি বিনামূল্যের অ্যাকাউন্টের জন্য [এখানে](https://alchemy.com/) সাইন আপ করুন। + +আর দেরি না করে, চলুন শুরু করা যাক! + +## NFT তৈরি 101 {#making-nfts-101} + +কোনও কোড দেখার আগে, NFT কীভাবে তৈরি করা হয় তা বোঝা গুরুত্বপূর্ণ। এর মধ্যে দুটি ধাপ জড়িত: + +### ইথেরিয়াম ব্লকচেইনে একটি NFT স্মার্ট কন্ট্র্যাক্ট প্রকাশ করুন {#publish-nft} + +দুটি NFT স্মার্ট কন্ট্র্যাক্ট স্ট্যান্ডার্ডের মধ্যে সবচেয়ে বড় পার্থক্য হল ERC-1155 একটি মাল্টি-টোকেন স্ট্যান্ডার্ড এবং এতে ব্যাচ কার্যকারিতা অন্তর্ভুক্ত, যেখানে ERC-721 একটি সিঙ্গেল-টোকেন স্ট্যান্ডার্ড এবং তাই এটি একবারে শুধুমাত্র একটি টোকেন স্থানান্তর সমর্থন করে। + +### মিন্টিং ফাংশন কল করুন {#minting-function} + +সাধারণত, এই মিন্টিং ফাংশনে আপনাকে দুটি ভেরিয়েবল প্যারামিটার হিসেবে পাস করতে হয়, প্রথমটি হলো `recipient`, যা সেই অ্যাড্রেস নির্দিষ্ট করে যে আপনার নতুন মিন্ট করা NFT পাবে, এবং দ্বিতীয়টি হলো NFT-এর `tokenURI`, যা একটি স্ট্রিং যা NFT-এর মেটাডেটা বর্ণনাকারী একটি JSON ডকুমেন্টে রূপান্তরিত হয়। + +একটি NFT-এর মেটাডেটাই মূলত এটিকে প্রাণবন্ত করে তোলে, যার ফলে এটির নাম, বিবরণ, ছবি (বা ভিন্ন ডিজিটাল অ্যাসেট) এবং অন্যান্য অ্যাট্রিবিউটের মতো বৈশিষ্ট্য থাকতে পারে। এখানে [একটি tokenURI-এর উদাহরণ](https://gateway.pinata.cloud/ipfs/QmSvBcb4tjdFpajGJhbFAWeK3JAxCdNQLQtr6ZdiSi42V2) দেওয়া হলো, যা একটি NFT-এর মেটাডেটা ধারণ করে। + +এই টিউটোরিয়ালে, আমরা পার্ট 2-এর উপর ফোকাস করব, আমাদের React UI ব্যবহার করে একটি বিদ্যমান NFT-এর স্মার্ট কন্ট্র্যাক্ট মিন্টিং ফাংশন কল করা। + +[এখানে একটি লিঙ্ক](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) দেওয়া হলো সেই ERC-721 NFT স্মার্ট কন্ট্র্যাক্টের জন্য যা আমরা এই টিউটোরিয়ালে কল করব। আপনি যদি জানতে চান আমরা এটি কীভাবে তৈরি করেছি, তবে আমরা আপনাকে আমাদের অন্য টিউটোরিয়াল, [\"How to Create an NFT\"](https://www.alchemy.com/docs/how-to-create-an-nft) দেখার জন্য অত্যন্ত সুপারিশ করি। + +দারুণ, এখন যেহেতু আমরা বুঝতে পেরেছি কীভাবে একটি NFT তৈরি করতে হয়, চলুন আমাদের স্টার্টার ফাইলগুলো ক্লোন করি! + +## স্টার্টার ফাইলগুলো ক্লোন করুন {#clone-the-starter-files} + +প্রথমে, এই প্রজেক্টের স্টার্টার ফাইলগুলো পেতে [nft-minter-tutorial GitHub repository](https://github.com/alchemyplatform/nft-minter-tutorial)-এ যান। আপনার লোকাল এনভায়রনমেন্টে এই রিপোজিটরিটি ক্লোন করুন। + +যখন আপনি এই ক্লোন করা `nft-minter-tutorial` রিপোজিটরি খুলবেন, আপনি লক্ষ্য করবেন যে এতে দুটি ফোল্ডার রয়েছে: `minter-starter-files` এবং `nft-minter`। + +- `minter-starter-files` এই প্রজেক্টের জন্য স্টার্টার ফাইল (মূলত React UI) ধারণ করে। এই টিউটোরিয়ালে, **আমরা এই ডিরেক্টরিতে কাজ করব**, কারণ আপনি আপনার ইথেরিয়াম ওয়ালেট এবং একটি NFT স্মার্ট কন্ট্র্যাক্টের সাথে এটি সংযুক্ত করে এই UI-কে কীভাবে প্রাণবন্ত করতে হয় তা শিখবেন। +- `nft-minter` সম্পূর্ণ টিউটোরিয়ালটি ধারণ করে এবং আপনি যদি আটকে যান তবে এটি আপনার জন্য একটি **রেফারেন্স** হিসেবে রয়েছে। + +পরবর্তীতে, আপনার কোড এডিটরে `minter-starter-files`-এর আপনার কপিটি খুলুন এবং তারপর আপনার `src` ফোল্ডারে নেভিগেট করুন। + +আমরা যে সমস্ত কোড লিখব তা `src` ফোল্ডারের অধীনে থাকবে। আমরা `Minter.js` কম্পোনেন্ট সম্পাদনা করব এবং আমাদের প্রজেক্টকে Web3 ফাংশনালিটি দেওয়ার জন্য অতিরিক্ত জাভাস্ক্রিপ্ট ফাইল লিখব। + +## ধাপ ২: আমাদের স্টার্টার ফাইলগুলো দেখুন {#step-2-check-out-our-starter-files} + +কোডিং শুরু করার আগে, স্টার্টার ফাইলগুলোতে আমাদের জন্য ইতিমধ্যে কী সরবরাহ করা হয়েছে তা দেখে নেওয়া গুরুত্বপূর্ণ। + +### আপনার React প্রজেক্টটি চালু করুন {#get-your-react-project-running} + +চলুন আমাদের ব্রাউজারে React প্রজেক্টটি চালিয়ে শুরু করি। React-এর সৌন্দর্য হলো যে একবার আমাদের প্রজেক্ট ব্রাউজারে চালু হয়ে গেলে, আমরা যে কোনো পরিবর্তন সেভ করব তা আমাদের ব্রাউজারে লাইভ আপডেট হবে। + +প্রজেক্টটি চালু করতে, `minter-starter-files` ফোল্ডারের রুট ডিরেক্টরিতে নেভিগেট করুন এবং প্রজেক্টের ডিপেন্ডেন্সি ইনস্টল করার জন্য আপনার টার্মিনালে `npm install` রান করুন: + +```bash +cd minter-starter-files +npm install +``` + +সেগুলো ইনস্টল করা শেষ হলে, আপনার টার্মিনালে `npm start` রান করুন: + +```bash +npm start +``` + +এটি করলে আপনার ব্রাউজারে http://localhost:3000/ খুলবে, যেখানে আপনি আমাদের প্রজেক্টের ফ্রন্টএন্ড দেখতে পাবেন। এটিতে ৩টি ফিল্ড থাকা উচিত: আপনার NFT-এর অ্যাসেটের লিঙ্ক ইনপুট করার জায়গা, আপনার NFT-এর নাম প্রবেশ করানো এবং একটি বিবরণ প্রদান করা। + +আপনি যদি "Connect Wallet" বা "Mint NFT" বোতামে ক্লিক করার চেষ্টা করেন, আপনি লক্ষ্য করবেন যে সেগুলি কাজ করছে না—এর কারণ হলো আমাদের এখনও তাদের ফাংশনালিটি প্রোগ্রাম করতে হবে! :\) + +### Minter.js কম্পোনেন্ট {#minter-js} + +**দ্রষ্টব্য:** নিশ্চিত করুন যে আপনি `minter-starter-files` ফোল্ডারে আছেন এবং `nft-minter` ফোল্ডারে নন! + +চলুন আমাদের এডিটরে `src` ফোল্ডারে ফিরে যাই এবং `Minter.js` ফাইলটি খুলি। এই ফাইলের সবকিছু বোঝা অত্যন্ত গুরুত্বপূর্ণ, কারণ এটিই মূল React কম্পোনেন্ট যা নিয়ে আমরা কাজ করব। + +এই ফাইলের শীর্ষে, আমাদের স্টেট ভেরিয়েবল রয়েছে যা আমরা নির্দিষ্ট ইভেন্টের পরে আপডেট করব। + +```javascript +//স্টেট ভেরিয়েবল +const [walletAddress, setWallet] = useState("") +const [status, setStatus] = useState("") +const [name, setName] = useState("") +const [description, setDescription] = useState("") +const [url, setURL] = useState("") +``` + +কখনও React স্টেট ভেরিয়েবল বা স্টেট হুক সম্পর্কে শোনেননি? [এই](https://legacy.reactjs.org/docs/hooks-state.html) ডক্স দেখুন। + +এখানে প্রতিটি ভেরিয়েবল কী প্রতিনিধিত্ব করে তা দেওয়া হলো: + +- `walletAddress` - একটি স্ট্রিং যা ব্যবহারকারীর ওয়ালেট অ্যাড্রেস সংরক্ষণ করে +- `status` - একটি স্ট্রিং যা UI-এর নীচে প্রদর্শনের জন্য একটি বার্তা ধারণ করে +- `name` - একটি স্ট্রিং যা NFT-এর নাম সংরক্ষণ করে +- `description` - একটি স্ট্রিং যা NFT-এর বিবরণ সংরক্ষণ করে +- `url` - একটি স্ট্রিং যা NFT-এর ডিজিটাল অ্যাসেটের একটি লিঙ্ক + +স্টেট ভেরিয়েবলগুলির পরে, আপনি তিনটি অ-বাস্তবায়িত ফাংশন দেখতে পাবেন: `useEffect`, `connectWalletPressed` এবং `onMintPressed`। আপনি লক্ষ্য করবেন যে এই সমস্ত ফাংশন `async`, কারণ আমরা সেগুলির মধ্যে অ্যাসিঙ্ক্রোনাস API কল করব! তাদের নামগুলি তাদের কার্যকারিতার সমনাম: + +```javascript +useEffect(async () => { + //TODO: ইমপ্লিমেন্ট করুন +}, []) + +const connectWalletPressed = async () => { + //TODO: ইমপ্লিমেন্ট করুন +} + +const onMintPressed = async () => { + //TODO: ইমপ্লিমেন্ট করুন +} +``` + +- [`useEffect`](https://legacy.reactjs.org/docs/hooks-effect.html) - এটি একটি React হুক যা আপনার কম্পোনেন্ট রেন্ডার হওয়ার পরে কল করা হয়। যেহেতু এটিতে একটি খালি অ্যারে `[]` প্রপ পাস করা হয়েছে (লাইন ৩ দেখুন), এটি শুধুমাত্র কম্পোনেন্টের _প্রথম_ রেন্ডারে কল করা হবে। এখানে আমরা আমাদের ওয়ালেট লিসেনার এবং আরেকটি ওয়ালেট ফাংশন কল করব যাতে আমাদের UI আপডেট হয় এবং একটি ওয়ালেট ইতিমধ্যে সংযুক্ত আছে কিনা তা প্রতিফলিত করে। +- `connectWalletPressed` - এই ফাংশনটি ব্যবহারকারীর MetaMask ওয়ালেটকে আমাদের dApp-এর সাথে সংযোগ করার জন্য কল করা হবে। +- `onMintPressed` - এই ফাংশনটি ব্যবহারকারীর NFT মিন্ট করার জন্য কল করা হবে। + +এই ফাইলের শেষের দিকে, আমাদের কম্পোনেন্টের UI রয়েছে। আপনি যদি এই কোডটি সাবধানে স্ক্যান করেন, আপনি লক্ষ্য করবেন যে আমরা আমাদের `url`, `name` এবং `description` স্টেট ভেরিয়েবলগুলিকে আপডেট করি যখন তাদের সংশ্লিষ্ট টেক্সট ফিল্ডের ইনপুট পরিবর্তন হয়। + +আপনি আরও দেখতে পাবেন যে `mintButton` এবং `walletButton` আইডি সহ বোতামগুলিতে ক্লিক করা হলে যথাক্রমে `connectWalletPressed` এবং `onMintPressed` কল করা হয়। + +```javascript +//আমাদের কম্পোনেন্টের UI +return ( +
+ + +

+

🧙‍♂️ Alchemy NFT Minter

+

+ কেবল আপনার অ্যাসেটের লিঙ্ক, নাম এবং বিবরণ যোগ করুন, তারপর "মিন্ট" টিপুন। +

+
+

🖼 অ্যাসেটের লিঙ্ক:

+ setURL(event.target.value)} + /> +

🤔 নাম:

+ setName(event.target.value)} + /> +

✍️ বিবরণ:

+ setDescription(event.target.value)} + /> +
+ +

{status}

+
+) +``` + +সবশেষে, এই Minter কম্পোনেন্টটি কোথায় যুক্ত করা হয়েছে তা দেখা যাক। + +আপনি যদি `App.js` ফাইলে যান, যা React-এর প্রধান কম্পোনেন্ট এবং অন্যান্য সমস্ত কম্পোনেন্টের জন্য একটি কন্টেইনার হিসেবে কাজ করে, আপনি দেখতে পাবেন যে আমাদের Minter কম্পোনেন্টটি লাইন ৭-এ ইনজেক্ট করা হয়েছে। + +**এই টিউটোরিয়ালে, আমরা শুধুমাত্র `Minter.js` ফাইল সম্পাদনা করব এবং আমাদের `src` ফোল্ডারে ফাইল যোগ করব।** + +এখন যেহেতু আমরা বুঝতে পেরেছি আমরা কী নিয়ে কাজ করছি, চলুন আমাদের ইথেরিয়াম ওয়ালেট সেট আপ করি! + +## আপনার ইথেরিয়াম ওয়ালেট সেট আপ করুন {#set-up-your-ethereum-wallet} + +ব্যবহারকারীদের আপনার স্মার্ট কন্ট্র্যাক্টের সাথে ইন্টারঅ্যাক্ট করতে সক্ষম হওয়ার জন্য, তাদের ইথেরিয়াম ওয়ালেটকে আপনার dApp-এর সাথে সংযুক্ত করতে হবে। + +### MetaMask ডাউনলোড করুন {#download-metamask} + +এই টিউটোরিয়ালের জন্য, আমরা MetaMask ব্যবহার করব, যা ব্রাউজারের একটি ভার্চুয়াল ওয়ালেট এবং আপনার Ethereum অ্যাকাউন্ট অ্যাড্রেস পরিচালনা করতে ব্যবহৃত হয়। আপনি যদি ইথেরিয়ামে ট্রানজ্যাকশন কীভাবে কাজ করে সে সম্পর্কে আরও বুঝতে চান, তাহলে [এই পৃষ্ঠাটি](/developers/docs/transactions/) দেখুন। + +আপনি [এখানে](https://metamask.io/download) বিনামূল্যে একটি MetaMask অ্যাকাউন্ট ডাউনলোড এবং তৈরি করতে পারেন। যখন আপনি একটি অ্যাকাউন্ট তৈরি করছেন, বা যদি আপনার ইতিমধ্যে একটি অ্যাকাউন্ট থাকে, তবে উপরের ডানদিকে “Ropsten Test Network”-এ স্যুইচ করতে ভুলবেন না (যাতে আমরা আসল টাকা নিয়ে কাজ না করি)। + +### একটি ফসেট থেকে ইথার যোগ করুন {#add-ether-from-faucet} + +আমাদের NFT মিন্ট করার জন্য (বা ইথেরিয়াম ব্লকচেইনে কোনো ট্রানজ্যাকশন সাইন করার জন্য), আমাদের কিছু নকল Eth প্রয়োজন হবে। Eth পেতে আপনি [Ropsten ফসেট](https://faucet.ropsten.be/)-এ যেতে পারেন এবং আপনার Ropsten অ্যাকাউন্টের অ্যাড্রেস লিখতে পারেন, তারপর “Send Ropsten Eth”-এ ক্লিক করুন। এর কিছুক্ষণ পরেই আপনার MetaMask অ্যাকাউন্টে Eth দেখতে পাবেন! + +### আপনার ব্যালেন্স চেক করুন {#check-your-balance} + +আমাদের ব্যালেন্স সেখানে আছে কিনা তা দুবার চেক করতে, চলুন [Alchemy’s composer tool](https://composer.alchemyapi.io/?composer_state=%7B%22network%22%3A0%2C%22methodName%22%3A%22eth_getBalance%22%2C%22paramValues%22%3A%5B%22%22%2C%22latest%22%5D%7D) ব্যবহার করে একটি [eth_getBalance](https://docs.alchemyapi.io/alchemy/documentation/alchemy-api-reference/json-rpc#eth_getbalance) রিকোয়েস্ট করি। এটি আমাদের ওয়ালেটে থাকা Eth-এর পরিমাণ ফেরত দেবে। আপনার MetaMask অ্যাকাউন্ট অ্যাড্রেস ইনপুট করার পরে এবং “অনুরোধ পাঠান”-এ ক্লিক করার পরে, আপনার এইরকম একটি প্রতিক্রিয়া দেখা উচিত: + +```text +{"jsonrpc": "2.0", "id": 0, "result": "0xde0b6b3a7640000"} +``` + +**দ্রষ্টব্য:** এই ফলাফলটি wei-তে, eth-এ নয়। Wei ইথারের ক্ষুদ্রতম একক হিসাবে ব্যবহৃত হয়। wei থেকে eth-এ রূপান্তর হলো: 1 eth = 10¹⁸ wei। সুতরাং যদি আমরা 0xde0b6b3a7640000 কে দশমিকে রূপান্তর করি, আমরা 1\*10¹⁸ পাই যা 1 eth-এর সমান। + +যাক বাবা! আমাদের নকল টাকা সব আছে! + +## আপনার UI-এর সাথে MetaMask সংযোগ করুন {#connect-metamask-to-your-UI} + +এখন যেহেতু আমাদের MetaMask ওয়ালেট সেট আপ করা হয়েছে, চলুন আমাদের dApp-কে এর সাথে সংযুক্ত করি! + +যেহেতু আমরা [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) প্যারাডাইম অনুসরণ করতে চাই, আমরা একটি পৃথক ফাইল তৈরি করতে যাচ্ছি যা আমাদের dApp-এর লজিক, ডেটা এবং নিয়ম পরিচালনা করার জন্য আমাদের ফাংশনগুলি ধারণ করবে এবং তারপর সেই ফাংশনগুলি আমাদের ফ্রন্টএন্ডে (আমাদের Minter.js কম্পোনেন্ট) পাস করব। + +### `connectWallet` ফাংশন {#connect-wallet-function} + +এটি করার জন্য, চলুন আপনার `src` ডিরেক্টরিতে `utils` নামে একটি নতুন ফোল্ডার তৈরি করি এবং এর ভিতরে `interact.js` নামে একটি ফাইল যোগ করি, যা আমাদের সমস্ত ওয়ালেট এবং স্মার্ট কন্ট্র্যাক্ট ইন্টারঅ্যাকশন ফাংশন ধারণ করবে। + +আমাদের `interact.js` ফাইলে, আমরা একটি `connectWallet` ফাংশন লিখব, যা আমরা পরে আমাদের `Minter.js` কম্পোনেন্টে ইম্পোর্ট এবং কল করব। + +আপনার `interact.js` ফাইলে, নিম্নলিখিতটি যোগ করুন + +```javascript +export const connectWallet = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_requestAccounts", + }) + const obj = { + status: "👆🏽 উপরের টেক্সট-ফিল্ডে একটি বার্তা লিখুন।", + address: addressArray[0], + } + return obj + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + আপনার ব্রাউজারে আপনাকে অবশ্যই MetaMask, একটি ভার্চুয়াল ইথেরিয়াম ওয়ালেট, ইনস্টল করতে হবে। + +

+
+ ), + } + } +} +``` + +চলুন এই কোডটি কী করে তা ভেঙে দেখি: + +প্রথমে, আমাদের ফাংশনটি পরীক্ষা করে যে আপনার ব্রাউজারে `window.ethereum` সক্রিয় আছে কিনা। + +`window.ethereum` হল একটি গ্লোবাল API যা MetaMask এবং অন্যান্য ওয়ালেট প্রদানকারীরা ইনজেক্ট করে, যা ওয়েবসাইটগুলিকে ব্যবহারকারীদের ইথেরিয়াম অ্যাকাউন্টগুলির জন্য অনুরোধ করার অনুমতি দেয়। অনুমোদিত হলে, এটি ব্যবহারকারী যে ব্লকচেইনগুলির সাথে সংযুক্ত রয়েছে সেখান থেকে ডেটা পড়তে পারে এবং ব্যবহারকারীকে বার্তা এবং ট্রানজ্যাকশন সাইন করার পরামর্শ দিতে পারে। আরও তথ্যের জন্য [MetaMask ডক্স](https://docs.metamask.io/guide/ethereum-provider.html#table-of-contents) দেখুন! + +যদি `window.ethereum` উপস্থিত _না থাকে_, তার মানে MetaMask ইনস্টল করা নেই। এর ফলে একটি JSON অবজেক্ট রিটার্ন করা হয়, যেখানে রিটার্ন করা `address` একটি খালি স্ট্রিং এবং `status` JSX অবজেক্টটি ব্যবহারকারীকে MetaMask ইনস্টল করার বার্তা দেয়। + +**আমরা যে ফাংশনগুলো লিখি তার বেশিরভাগই JSON অবজেক্ট রিটার্ন করবে যা আমরা আমাদের স্টেট ভেরিয়েবল এবং UI আপডেট করতে ব্যবহার করতে পারি।** + +এখন যদি `window.ethereum` উপস্থিত _থাকে_, তখনই বিষয়গুলো আকর্ষণীয় হয়ে ওঠে। + +একটি try/catch লুপ ব্যবহার করে, আমরা [`window.ethereum.request({ method: \"eth_requestAccounts\" });`](https://docs.metamask.io/guide/rpc-api.html#eth-requestaccounts) কল করে MetaMask-এর সাথে সংযোগ করার চেষ্টা করব। এই ফাংশনটি কল করলে ব্রাউজারে MetaMask খুলবে, যেখানে ব্যবহারকারীকে তাদের ওয়ালেট আপনার dApp-এর সাথে সংযোগ করার জন্য অনুরোধ করা হবে। + +- যদি ব্যবহারকারী সংযোগ করতে পছন্দ করে, তাহলে `method: \"eth_requestAccounts\"` একটি অ্যারে রিটার্ন করবে যা dApp-এর সাথে সংযুক্ত ব্যবহারকারীর সমস্ত অ্যাকাউন্টের অ্যাড্রেস ধারণ করে। সবমিলিয়ে, আমাদের `connectWallet` ফাংশনটি একটি JSON অবজেক্ট রিটার্ন করবে যা এই অ্যারের _প্রথম_ `address` (লাইন ৯ দেখুন) এবং একটি `status` বার্তা ধারণ করবে যা ব্যবহারকারীকে স্মার্ট কন্ট্র্যাক্টে একটি বার্তা লিখতে অনুরোধ করে। +- যদি ব্যবহারকারী সংযোগ প্রত্যাখ্যান করে, তাহলে JSON অবজেক্টটি রিটার্ন করা `address`-এর জন্য একটি খালি স্ট্রিং এবং একটি `status` বার্তা ধারণ করবে যা ব্যবহারকারীর সংযোগ প্রত্যাখ্যান করার বিষয়টি প্রতিফলিত করে। + +### আপনার Minter.js UI কম্পোনেন্টে connectWallet ফাংশন যোগ করুন {#add-connect-wallet} + +এখন যেহেতু আমরা এই `connectWallet` ফাংশনটি লিখেছি, চলুন এটিকে আমাদের `Minter.js.` কম্পোনেন্টের সাথে সংযুক্ত করি। + +প্রথমে, আমাদের `Minter.js` ফাইলের শীর্ষে `import { connectWallet } from \"./utils/interact.js\";` যোগ করে আমাদের ফাংশনটি `Minter.js` ফাইলে ইম্পোর্ট করতে হবে। `Minter.js`-এর আপনার প্রথম ১১টি লাইন এখন এইরকম দেখতে হবে: + +```javascript +import { useEffect, useState } from "react"; +import { connectWallet } from "./utils/interact.js"; + +const Minter = (props) => { + + //স্টেট ভেরিয়েবল + const [walletAddress, setWallet] = useState(""); + const [status, setStatus] = useState(""); + const [name, setName] = useState(""); + const [description, setDescription] = useState(""); + const [url, setURL] = useState(""); +``` + +তারপর, আমাদের `connectWalletPressed` ফাংশনের ভিতরে, আমরা আমাদের ইম্পোর্ট করা `connectWallet` ফাংশনটিকে এভাবে কল করব: + +```javascript +const connectWalletPressed = async () => { + const walletResponse = await connectWallet() + setStatus(walletResponse.status) + setWallet(walletResponse.address) +} +``` + +লক্ষ্য করুন কীভাবে আমাদের বেশিরভাগ কার্যকারিতা `interact.js` ফাইল থেকে আমাদের `Minter.js` কম্পোনেন্ট থেকে অ্যাবস্ট্রাক্ট করা হয়েছে? এটি যাতে আমরা M-V-C প্যারাডাইম মেনে চলি! + +`connectWalletPressed`-এ, আমরা কেবল আমাদের ইম্পোর্ট করা `connectWallet` ফাংশনে একটি await কল করি, এবং এর প্রতিক্রিয়ার সাহায্যে, আমরা তাদের স্টেট হুকগুলির মাধ্যমে আমাদের `status` এবং `walletAddress` ভেরিয়েবলগুলি আপডেট করি। + +এখন, চলুন `Minter.js` এবং `interact.js` উভয় ফাইলই সেভ করি এবং এ পর্যন্ত আমাদের UI পরীক্ষা করি। + +localhost:3000-এ আপনার ব্রাউজার খুলুন, এবং পৃষ্ঠার উপরের ডানদিকে "Connect Wallet" বোতামটি টিপুন। + +আপনার যদি MetaMask ইনস্টল করা থাকে, তাহলে আপনাকে আপনার ওয়ালেটটি আপনার dApp-এর সাথে সংযোগ করার জন্য অনুরোধ করা হবে। সংযোগ করার জন্য আমন্ত্রণ গ্রহণ করুন। + +আপনি দেখতে পাবেন যে ওয়ালেট বোতামটি এখন প্রতিফলিত করছে যে আপনার অ্যাড্রেস সংযুক্ত রয়েছে। + +এরপর, পৃষ্ঠাটি রিফ্রেশ করার চেষ্টা করুন... এটা অদ্ভুত। আমাদের ওয়ালেট বোতামটি আমাদের MetaMask সংযোগ করার জন্য অনুরোধ করছে, যদিও এটি ইতিমধ্যে সংযুক্ত রয়েছে... + +তবে চিন্তা করবেন না! আমরা `getCurrentWalletConnected` নামক একটি ফাংশন প্রয়োগ করে সহজেই এটি ঠিক করতে পারি, যা পরীক্ষা করবে যে কোনও অ্যাড্রেস ইতিমধ্যে আমাদের dApp-এর সাথে সংযুক্ত আছে কিনা এবং সেই অনুযায়ী আমাদের UI আপডেট করবে! + +### getCurrentWalletConnected ফাংশন {#get-current-wallet} + +আপনার `interact.js` ফাইলে, নিম্নলিখিত `getCurrentWalletConnected` ফাংশনটি যোগ করুন: + +```javascript +export const getCurrentWalletConnected = async () => { + if (window.ethereum) { + try { + const addressArray = await window.ethereum.request({ + method: "eth_accounts", + }) + if (addressArray.length > 0) { + return { + address: addressArray[0], + status: "👆🏽 উপরের টেক্সট-ফিল্ডে একটি বার্তা লিখুন।", + } + } else { + return { + address: "", + status: "🦊 উপরের ডানদিকের বোতামটি ব্যবহার করে MetaMask-এর সাথে সংযোগ করুন।", + } + } + } catch (err) { + return { + address: "", + status: "😥 " + err.message, + } + } + } else { + return { + address: "", + status: ( + +

+ {" "} + 🦊 + আপনার ব্রাউজারে আপনাকে অবশ্যই MetaMask, একটি ভার্চুয়াল ইথেরিয়াম ওয়ালেট, ইনস্টল করতে হবে। + +

+
+ ), + } + } +} +``` + +এই কোডটি আমরা একটু আগে লেখা `connectWallet` ফাংশনের সাথে _খুবই_ সাদৃশ্যপূর্ণ। + +প্রধান পার্থক্য হল `eth_requestAccounts` মেথড কল করার পরিবর্তে, যা ব্যবহারকারীর ওয়ালেট সংযোগ করার জন্য MetaMask খোলে, এখানে আমরা `eth_accounts` মেথড কল করি, যা সহজভাবে আমাদের dApp-এর সাথে বর্তমানে সংযুক্ত MetaMask অ্যাড্রেসগুলো ধারণকারী একটি অ্যারে রিটার্ন করে। + +এই ফাংশনটিকে কার্যকর দেখতে, চলুন এটিকে আমাদের `Minter.js` কম্পোনেন্টের `useEffect` ফাংশনে কল করি। + +`connectWallet`-এর জন্য আমরা যেমন করেছিলাম, আমাদের অবশ্যই এই ফাংশনটি আমাদের `interact.js` ফাইল থেকে `Minter.js` ফাইলে এভাবে ইম্পোর্ট করতে হবে: + +```javascript +import { useEffect, useState } from "react" +import { + connectWallet, + getCurrentWalletConnected, //এখানে ইম্পোর্ট করুন +} from "./utils/interact.js" +``` + +এখন, আমরা এটিকে কেবল আমাদের `useEffect` ফাংশনে কল করব: + +```javascript +useEffect(async () => { + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) +}, []) +``` + +লক্ষ্য করুন, আমরা `getCurrentWalletConnected`-এ আমাদের কলের প্রতিক্রিয়া ব্যবহার করে আমাদের `walletAddress` এবং `status` স্টেট ভেরিয়েবলগুলিকে আপডেট করি। + +একবার আপনি এই কোডটি যোগ করলে, আমাদের ব্রাউজার উইন্ডোটি রিফ্রেশ করার চেষ্টা করুন। বোতামটি বলা উচিত যে আপনি সংযুক্ত, এবং আপনার সংযুক্ত ওয়ালেটের অ্যাড্রেসের একটি প্রিভিউ দেখানো উচিত - এমনকি আপনি রিফ্রেশ করার পরেও! + +### addWalletListener ইমপ্লিমেন্ট করুন {#implement-add-wallet-listener} + +আমাদের dApp ওয়ালেট সেটআপের চূড়ান্ত ধাপ হল ওয়ালেট লিসেনার ইমপ্লিমেন্ট করা যাতে আমাদের UI আপডেট হয় যখন আমাদের ওয়ালেটের স্টেট পরিবর্তন হয়, যেমন যখন ব্যবহারকারী সংযোগ বিচ্ছিন্ন করে বা অ্যাকাউন্ট পরিবর্তন করে। + +আপনার `Minter.js` ফাইলে, `addWalletListener` নামে একটি ফাংশন যোগ করুন যা দেখতে নিম্নলিখিতের মতো: + +```javascript +function addWalletListener() { + if (window.ethereum) { + window.ethereum.on("accountsChanged", (accounts) => { + if (accounts.length > 0) { + setWallet(accounts[0]) + setStatus("👆🏽 উপরের টেক্সট-ফিল্ডে একটি বার্তা লিখুন।") + } else { + setWallet("") + setStatus("🦊 উপরের ডানদিকের বোতামটি ব্যবহার করে MetaMask-এর সাথে সংযোগ করুন।") + } + }) + } else { + setStatus( +

+ {" "} + 🦊 + আপনার ব্রাউজারে আপনাকে অবশ্যই MetaMask, একটি ভার্চুয়াল ইথেরিয়াম ওয়ালেট, ইনস্টল করতে হবে। + +

+ ) + } +} +``` + +চলুন দ্রুত দেখি এখানে কী ঘটছে: + +- প্রথমে, আমাদের ফাংশন পরীক্ষা করে যে `window.ethereum` সক্রিয় আছে কিনা (অর্থাৎ MetaMask ইনস্টল করা আছে)। + - যদি না থাকে, আমরা কেবল আমাদের `status` স্টেট ভেরিয়েবলটিকে একটি JSX স্ট্রিং-এ সেট করি যা ব্যবহারকারীকে MetaMask ইনস্টল করার জন্য অনুরোধ করে। + - যদি এটি সক্রিয় থাকে, আমরা লাইন ৩-এ `window.ethereum.on(\"accountsChanged\")` লিসেনার সেট আপ করি যা MetaMask ওয়ালেটের স্টেট পরিবর্তন শোনে, যার মধ্যে রয়েছে যখন ব্যবহারকারী dApp-এ একটি অতিরিক্ত অ্যাকাউন্ট সংযোগ করে, অ্যাকাউন্ট পরিবর্তন করে বা একটি অ্যাকাউন্ট সংযোগ বিচ্ছিন্ন করে। যদি অন্তত একটি অ্যাকাউন্ট সংযুক্ত থাকে, তাহলে `walletAddress` স্টেট ভেরিয়েবলটি লিসেনারের দ্বারা রিটার্ন করা `accounts` অ্যারের প্রথম অ্যাকাউন্ট হিসেবে আপডেট হয়। অন্যথায়, `walletAddress` একটি খালি স্ট্রিং হিসাবে সেট করা হয়। + +অবশেষে, আমাদের এটিকে `useEffect` ফাংশনে কল করতে হবে: + +```javascript +useEffect(async () => { + const { address, status } = await getCurrentWalletConnected() + setWallet(address) + setStatus(status) + + addWalletListener() +}, []) +``` + +এবং Voilà! আমরা আমাদের সমস্ত ওয়ালেট কার্যকারিতা প্রোগ্রামিং সম্পন্ন করেছি! এখন যেহেতু আমাদের ওয়ালেট সেট আপ করা হয়েছে, চলুন দেখি কিভাবে আমাদের NFT মিন্ট করা যায়! + +## NFT মেটাডেটা 101 {#nft-metadata-101} + +সুতরাং এই টিউটোরিয়ালের ধাপ ০-তে আমরা যে NFT মেটাডেটা নিয়ে কথা বলেছিলাম তা মনে আছে—এটি একটি NFT-কে প্রাণবন্ত করে তোলে, যার ফলে এটির ডিজিটাল অ্যাসেট, নাম, বিবরণ এবং অন্যান্য অ্যাট্রিবিউটের মতো বৈশিষ্ট্য থাকতে পারে। + +আমাদের এই মেটাডেটাটিকে একটি JSON অবজেক্ট হিসেবে কনফিগার করতে হবে এবং এটি সংরক্ষণ করতে হবে, যাতে আমরা আমাদের স্মার্ট কন্ট্র্যাক্টের `mintNFT` ফাংশন কল করার সময় এটিকে `tokenURI` প্যারামিটার হিসেবে পাস করতে পারি। + +"লিঙ্ক টু অ্যাসেট", "নাম", "বিবরণ" ফিল্ডের টেক্সট আমাদের NFT-এর মেটাডেটার বিভিন্ন বৈশিষ্ট্য নিয়ে গঠিত হবে। আমরা এই মেটাডেটাটিকে একটি JSON অবজেক্ট হিসেবে ফরম্যাট করব, কিন্তু এই JSON অবজেক্টটি কোথায় সংরক্ষণ করব তার জন্য কয়েকটি বিকল্প রয়েছে: + +- আমরা এটিকে ইথেরিয়াম ব্লকচেইনে সংরক্ষণ করতে পারতাম; তবে, এটি করা খুব ব্যয়বহুল হবে। +- আমরা এটিকে একটি সেন্ট্রালাইজড সার্ভারে সংরক্ষণ করতে পারতাম, যেমন AWS বা Firebase। কিন্তু এটি আমাদের ডিসেন্ট্রালাইজেশন নীতিকে পরাজিত করবে। +- আমরা IPFS ব্যবহার করতে পারি, যা একটি ডিস্ট্রিবিউটেড ফাইল সিস্টেমে ডেটা সংরক্ষণ এবং শেয়ার করার জন্য একটি ডিসেন্ট্রালাইজড প্রোটোকল এবং পিয়ার-টু-পিয়ার নেটওয়ার্ক। যেহেতু এই প্রোটোকলটি ডিসেন্ট্রালাইজড এবং বিনামূল্যে, এটি আমাদের সেরা বিকল্প! + +IPFS-এ আমাদের মেটাডেটা সংরক্ষণ করতে, আমরা [Pinata](https://pinata.cloud/) ব্যবহার করব, যা একটি সুবিধাজনক IPFS API এবং টুলকিট। পরবর্তী ধাপে, আমরা এটি ঠিক কীভাবে করতে হবে তা ব্যাখ্যা করব! + +## IPFS-এ আপনার মেটাডেটা পিন করতে Pinata ব্যবহার করুন {#use-pinata-to-pin-your-metadata-to-IPFS} + +আপনার যদি [Pinata](https://pinata.cloud/) অ্যাকাউন্ট না থাকে, তাহলে [এখানে](https://app.pinata.cloud/auth/signup) একটি বিনামূল্যের অ্যাকাউন্টের জন্য সাইন আপ করুন এবং আপনার ইমেল ও অ্যাকাউন্ট যাচাই করার পদক্ষেপগুলি সম্পূর্ণ করুন। + +### আপনার Pinata API কী তৈরি করুন {#create-pinata-api-key} + +[https://pinata.cloud/keys](https://pinata.cloud/keys) পৃষ্ঠায় নেভিগেট করুন, তারপর উপরে "New Key" বোতামটি নির্বাচন করুন, অ্যাডমিন উইজেটটি সক্রিয় হিসাবে সেট করুন এবং আপনার কী-এর নাম দিন। + +তারপরে আপনাকে আপনার API তথ্য সহ একটি পপআপ দেখানো হবে। এটি একটি নিরাপদ জায়গায় রাখতে ভুলবেন না। + +এখন আমাদের কী সেট আপ করা হয়েছে, চলুন এটিকে আমাদের প্রজেক্টে যোগ করি যাতে আমরা এটি ব্যবহার করতে পারি। + +### একটি .env ফাইল তৈরি করুন {#create-a-env} + +আমরা আমাদের Pinata কী এবং সিক্রেট একটি এনভায়রনমেন্ট ফাইলে নিরাপদে সংরক্ষণ করতে পারি। চলুন আপনার প্রজেক্ট ডিরেক্টরিতে [dotenv package](https://www.npmjs.com/package/dotenv) ইনস্টল করি। + +আপনার টার্মিনালে একটি নতুন ট্যাব খুলুন (লোকাল হোস্ট চালানো ট্যাব থেকে আলাদা) এবং নিশ্চিত করুন যে আপনি `minter-starter-files` ফোল্ডারে আছেন, তারপর আপনার টার্মিনালে নিম্নলিখিত কমান্ডটি চালান: + +```text +npm install dotenv --save +``` + +এরপরে, আপনার কমান্ড লাইনে নিম্নলিখিতটি প্রবেশ করে আপনার `minter-starter-files` এর রুট ডিরেক্টরিতে একটি `.env` ফাইল তৈরি করুন: + +```javascript +vim.env +``` + +এটি আপনার `.env` ফাইলটি vim (একটি টেক্সট এডিটর) এ খুলবে। এটি সংরক্ষণ করতে আপনার কীবোর্ডে "esc" + ":" + "q" টিপুন। + +এরপরে, VSCode-এ, আপনার `.env` ফাইলে নেভিগেট করুন এবং আপনার Pinata API কী এবং API সিক্রেট এতে যোগ করুন, এইভাবে: + +```text +REACT_APP_PINATA_KEY = +REACT_APP_PINATA_SECRET = +``` + +ফাইলটি সংরক্ষণ করুন, এবং তারপরে আপনি IPFS-এ আপনার JSON মেটাডেটা আপলোড করার জন্য ফাংশন লেখা শুরু করতে প্রস্তুত! + +### pinJSONToIPFS ইমপ্লিমেন্ট করুন {#pin-json-to-ipfs} + +সৌভাগ্যবশত, Pinata-এর [IPFS-এ JSON ডেটা আপলোড করার জন্য একটি নির্দিষ্ট API](https://docs.pinata.cloud/api-reference/endpoint/ipfs/pin-json-to-ipfs#pin-json) এবং axios সহ একটি সুবিধাজনক জাভাস্ক্রিপ্ট উদাহরণ রয়েছে যা আমরা কিছু সামান্য পরিবর্তন সহ ব্যবহার করতে পারি। + +আপনার `utils` ফোল্ডারে, আসুন `pinata.js` নামে আরেকটি ফাইল তৈরি করি এবং তারপরে .env ফাইল থেকে আমাদের Pinata সিক্রেট এবং কী ইম্পোর্ট করি এইভাবে: + +```javascript +require("dotenv").config() +const key = process.env.REACT_APP_PINATA_KEY +const secret = process.env.REACT_APP_PINATA_SECRET +``` + +এরপরে, নিচের অতিরিক্ত কোডটি আপনার `pinata.js` ফাইলে পেস্ট করুন। চিন্তা করবেন না, আমরা সবকিছুর মানে ভেঙে দেখাব! + +```javascript +require("dotenv").config() +const key = process.env.REACT_APP_PINATA_KEY +const secret = process.env.REACT_APP_PINATA_SECRET + +const axios = require("axios") + +export const pinJSONToIPFS = async (JSONBody) => { + const url = `https://api.pinata.cloud/pinning/pinJSONToIPFS` + //Pinata-তে axios POST অনুরোধ করা হচ্ছে ⬇️ + return axios + .post(url, JSONBody, { + headers: { + pinata_api_key: key, + pinata_secret_api_key: secret, + }, + }) + .then(function (response) { + return { + success: true, + pinataUrl: + "https://gateway.pinata.cloud/ipfs/" + response.data.IpfsHash, + } + }) + .catch(function (error) { + console.log(error) + return { + success: false, + message: error.message, + } + }) +} +``` + +তাহলে এই কোডটি ঠিক কী করে? + +প্রথমে, এটি [axios](https://www.npmjs.com/package/axios) ইম্পোর্ট করে, যা ব্রাউজার এবং node.js-এর জন্য একটি প্রমিস-ভিত্তিক HTTP ক্লায়েন্ট, যা আমরা Pinata-তে একটি অনুরোধ করতে ব্যবহার করব। + +তারপরে আমাদের অ্যাসিঙ্ক্রোনাস ফাংশন `pinJSONToIPFS` রয়েছে, যা একটি `JSONBody` ইনপুট হিসেবে নেয় এবং এর হেডারে Pinata api কী এবং সিক্রেট নেয়, সবই তাদের `pinJSONToIPFS` API-তে একটি POST অনুরোধ করার জন্য। + +- যদি এই POST অনুরোধটি সফল হয়, তাহলে আমাদের ফাংশনটি একটি JSON অবজেক্ট রিটার্ন করে যেখানে `success` বুলিয়ানটি সত্য এবং `pinataUrl` যেখানে আমাদের মেটাডেটা পিন করা হয়েছে। আমরা এই `pinataUrl` রিটার্ন করাটিকে আমাদের স্মার্ট কন্ট্র্যাক্টের মিন্ট ফাংশনের `tokenURI` ইনপুট হিসেবে ব্যবহার করব। +- যদি এই পোস্ট অনুরোধটি ব্যর্থ হয়, তাহলে আমাদের ফাংশনটি একটি JSON অবজেক্ট রিটার্ন করে যেখানে `success` বুলিয়ানটি মিথ্যা এবং একটি `message` স্ট্রিং যা আমাদের ত্রুটি প্রকাশ করে। + +আমাদের `connectWallet` ফাংশনের রিটার্ন টাইপের মতো, আমরা JSON অবজেক্ট রিটার্ন করছি যাতে আমরা তাদের প্যারামিটারগুলি আমাদের স্টেট ভেরিয়েবল এবং UI আপডেট করতে ব্যবহার করতে পারি। + +## আপনার স্মার্ট কন্ট্র্যাক্ট লোড করুন {#load-your-smart-contract} + +এখন যেহেতু আমাদের NFT মেটাডেটা IPFS-এ `pinJSONToIPFS` ফাংশনের মাধ্যমে আপলোড করার একটি উপায় আছে, আমাদের স্মার্ট কন্ট্র্যাক্টের একটি ইনস্ট্যান্স লোড করার একটি উপায় প্রয়োজন হবে যাতে আমরা এর `mintNFT` ফাংশন কল করতে পারি। + +যেমন আমরা আগে উল্লেখ করেছি, এই টিউটোরিয়ালে আমরা [এই বিদ্যমান NFT স্মার্ট কন্ট্র্যাক্ট](https://ropsten.etherscan.io/address/0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE) ব্যবহার করব; তবে, আপনি যদি জানতে চান আমরা এটি কীভাবে তৈরি করেছি, বা নিজে একটি তৈরি করতে চান, আমরা আপনাকে আমাদের অন্য টিউটোরিয়াল, [\"How to Create an NFT.\"](https://www.alchemy.com/docs/how-to-create-an-nft) দেখার জন্য অত্যন্ত সুপারিশ করি। + +### কন্ট্র্যাক্ট ABI {#contract-abi} + +আপনি যদি আমাদের ফাইলগুলো মনোযোগ দিয়ে দেখে থাকেন, তাহলে আপনি লক্ষ্য করেছেন যে আমাদের `src` ডিরেক্টরিতে একটি `contract-abi.json` ফাইল আছে। কোন ফাংশন একটি কন্ট্র্যাক্ট কল করবে তা নির্দিষ্ট করার জন্য এবং ফাংশনটি আপনার প্রত্যাশিত ফর্ম্যাটে ডেটা রিটার্ন করবে তা নিশ্চিত করার জন্য একটি ABI প্রয়োজন। + +আমাদের ইথেরিয়াম ব্লকচেইনের সাথে সংযোগ স্থাপন এবং আমাদের স্মার্ট কন্ট্র্যাক্ট লোড করার জন্য একটি Alchemy API কী এবং Alchemy Web3 API প্রয়োজন হবে। + +### আপনার Alchemy API কী তৈরি করুন {#create-alchemy-api} + +আপনার যদি ইতিমধ্যে একটি Alchemy অ্যাকাউন্ট না থাকে, [এখানে বিনামূল্যে সাইন আপ করুন।](https://alchemy.com/?a=eth-org-nft-minter) + +একবার আপনি একটি Alchemy অ্যাকাউন্ট তৈরি করে ফেললে, আপনি একটি অ্যাপ তৈরি করে একটি API কী জেনারেট করতে পারেন। এটি আমাদের Ropsten টেস্টনেটওয়ার্কে অনুরোধ করার অনুমতি দেবে। + +আপনার Alchemy ড্যাশবোর্ডে “Create App” পৃষ্ঠায় নেভিগেট করুন, নেভ বারে “Apps” এর উপর হোভার করে এবং “Create App” এ ক্লিক করে। + +আপনার অ্যাপের নাম দিন, আমরা "My First NFT!" বেছে নিয়েছি, একটি সংক্ষিপ্ত বিবরণ দিন, আপনার অ্যাপের বুককিপিংয়ের জন্য ব্যবহৃত পরিবেশের জন্য “Staging” নির্বাচন করুন এবং আপনার নেটওয়ার্কের জন্য “Ropsten” বেছে নিন। + +“অ্যাপ তৈরি করুন”-এ ক্লিক করুন এবং ব্যস! আপনার অ্যাপটি নীচের টেবিলে প্রদর্শিত হওয়া উচিত। + +অসাধারণ, এখন যেহেতু আমরা আমাদের HTTP Alchemy API URL তৈরি করেছি, এটি আপনার ক্লিপবোর্ডে কপি করুন... + +... এবং তারপর এটিকে আমাদের `.env` ফাইলে যোগ করা যাক। সবমিলিয়ে, আপনার .env ফাইলটি এমন দেখতে হবে: + +```text +REACT_APP_PINATA_KEY = +REACT_APP_PINATA_SECRET = +REACT_APP_ALCHEMY_KEY = https://eth-ropsten.alchemyapi.io/v2/ +``` + +এখন যেহেতু আমাদের কন্ট্র্যাক্ট ABI এবং আমাদের Alchemy API কী আছে, আমরা [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) ব্যবহার করে আমাদের স্মার্ট কন্ট্র্যাক্ট লোড করতে প্রস্তুত। + +### আপনার Alchemy Web3 এন্ডপয়েন্ট এবং কন্ট্র্যাক্ট সেট আপ করুন {#setup-alchemy-endpoint} + +প্রথমে, যদি আপনার কাছে এটি ইতিমধ্যে না থাকে, তাহলে আপনাকে টার্মিনালে হোম ডিরেক্টরি: `nft-minter-tutorial`-এ নেভিগেট করে [Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) ইনস্টল করতে হবে: + +```text +cd .. +npm install @alch/alchemy-web3 +``` + +এরপরে, আসুন আমাদের `interact.js` ফাইলে ফিরে যাই। ফাইলের শীর্ষে, আপনার .env ফাইল থেকে আপনার Alchemy কী ইম্পোর্ট করতে এবং আপনার Alchemy Web3 এন্ডপয়েন্ট সেট আপ করতে নিম্নলিখিত কোডটি যোগ করুন: + +```javascript +require("dotenv").config() +const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(alchemyKey) +``` + +[Alchemy Web3](https://github.com/alchemyplatform/alchemy-web3) হল [Web3.js](https://docs.web3js.org/)-এর একটি র‍্যাপার, যা উন্নত API পদ্ধতি এবং অন্যান্য গুরুত্বপূর্ণ সুবিধা প্রদান করে যাতে আপনার জীবন একজন ওয়েব3 ডেভেলপার হিসাবে সহজ হয়। এটি এমনভাবে ডিজাইন করা হয়েছে যাতে ন্যূনতম কনফিগারেশনের প্রয়োজন হয় যাতে আপনি এখনই আপনার অ্যাপে এটি ব্যবহার করা শুরু করতে পারেন! + +এরপরে, আসুন আমাদের কন্ট্র্যাক্ট ABI এবং কন্ট্র্যাক্ট অ্যাড্রেস আমাদের ফাইলে যোগ করি। + +```javascript +require("dotenv").config() +const alchemyKey = process.env.REACT_APP_ALCHEMY_KEY +const { createAlchemyWeb3 } = require("@alch/alchemy-web3") +const web3 = createAlchemyWeb3(alchemyKey) + +const contractABI = require("../contract-abi.json") +const contractAddress = "0x4C4a07F737Bf57F6632B6CAB089B78f62385aCaE" +``` + +একবার আমাদের দুটিই হয়ে গেলে, আমরা আমাদের মিন্ট ফাংশন কোডিং শুরু করতে প্রস্তুত! + +## mintNFT ফাংশনটি ইমপ্লিমেন্ট করুন {#implement-the-mintnft-function} + +আপনার `interact.js` ফাইলের ভিতরে, আসুন আমাদের `mintNFT` ফাংশনটি সংজ্ঞায়িত করি, যা আমাদের NFT মিন্ট করবে। + +যেহেতু আমরা অসংখ্য অ্যাসিঙ্ক্রোনাস কল করব (Pinata-তে আমাদের মেটাডেটা IPFS-এ পিন করতে, Alchemy Web3 আমাদের স্মার্ট কন্ট্র্যাক্ট লোড করতে, এবং MetaMask আমাদের ট্রানজ্যাকশন সাইন করতে), আমাদের ফাংশনটিও অ্যাসিঙ্ক্রোনাস হবে। + +আমাদের ফাংশনের তিনটি ইনপুট হবে আমাদের ডিজিটাল অ্যাসেটের `url`, `name` এবং `description`। `connectWallet` ফাংশনের নিচে নিম্নলিখিত ফাংশন সিগনেচার যোগ করুন: + +```javascript +export const mintNFT = async (url, name, description) => {} +``` + +### ইনপুট ত্রুটি হ্যান্ডলিং {#input-error-handling} + +স্বাভাবিকভাবেই, ফাংশনের শুরুতে কিছু ইনপুট ত্রুটি হ্যান্ডলিং থাকা যুক্তিসঙ্গত, যাতে আমাদের ইনপুট প্যারামিটারগুলি সঠিক না হলে আমরা এই ফাংশন থেকে বেরিয়ে যাই। আমাদের ফাংশনের ভিতরে, আসুন নিম্নলিখিত কোডটি যোগ করি: + +```javascript +export const mintNFT = async (url, name, description) => { + //ত্রুটি হ্যান্ডলিং + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗মিন্ট করার আগে অনুগ্রহ করে নিশ্চিত করুন যে সমস্ত ফিল্ড সম্পূর্ণ হয়েছে।", + } + } +} +``` + +মূলত, যদি কোনো ইনপুট প্যারামিটার একটি খালি স্ট্রিং হয়, তাহলে আমরা একটি JSON অবজেক্ট রিটার্ন করি যেখানে `success` বুলিয়ানটি মিথ্যা, এবং `status` স্ট্রিংটি জানায় যে আমাদের UI-এর সমস্ত ফিল্ড সম্পূর্ণ করতে হবে। + +### IPFS-এ মেটাডেটা আপলোড করুন {#upload-metadata-to-ipfs} + +একবার আমরা জানি যে আমাদের মেটাডেটা সঠিকভাবে ফরম্যাট করা হয়েছে, পরবর্তী ধাপ হল এটিকে একটি JSON অবজেক্টে র‍্যাপ করা এবং আমরা যে `pinJSONToIPFS` লিখেছি তার মাধ্যমে এটিকে IPFS-এ আপলোড করা! + +এটি করার জন্য, প্রথমে আমাদের `pinJSONToIPFS` ফাংশনটি আমাদের `interact.js` ফাইলে ইম্পোর্ট করতে হবে। `interact.js` এর একেবারে উপরে, আসুন যোগ করি: + +```javascript +import { pinJSONToIPFS } from "./pinata.js" +``` + +`pinJSONToIPFS` একটি JSON বডি নেয় তা মনে করুন। সুতরাং এটিতে একটি কল করার আগে, আমাদের আমাদের `url`, `name`, এবং `description` প্যারামিটারগুলিকে একটি JSON অবজেক্টে ফরম্যাট করতে হবে। + +আসুন `metadata` নামক একটি JSON অবজেক্ট তৈরি করতে আমাদের কোড আপডেট করি এবং তারপরে এই `metadata` প্যারামিটার দিয়ে `pinJSONToIPFS` এ একটি কল করি: + +```javascript +export const mintNFT = async (url, name, description) => { + //ত্রুটি হ্যান্ডলিং + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗মিন্ট করার আগে অনুগ্রহ করে নিশ্চিত করুন যে সমস্ত ফিল্ড সম্পূর্ণ হয়েছে।", + } + } + + //মেটাডেটা তৈরি করুন + const metadata = new Object() + metadata.name = name + metadata.image = url + metadata.description = description + + //পিনাতা কল করুন + const pinataResponse = await pinJSONToIPFS(metadata) + if (!pinataResponse.success) { + return { + success: false, + status: "😢 আপনার tokenURI আপলোড করার সময় কিছু ভুল হয়েছে।", + } + } + const tokenURI = pinataResponse.pinataUrl +} +``` + +লক্ষ্য করুন, আমরা `pinJSONToIPFS(metadata)`-এ আমাদের কলের প্রতিক্রিয়া `pinataResponse` অবজেক্টে সংরক্ষণ করি। তারপরে, আমরা কোনো ত্রুটির জন্য এই অবজেক্টটি পার্স করি। + +যদি কোনো ত্রুটি থাকে, আমরা একটি JSON অবজেক্ট রিটার্ন করি যেখানে `success` বুলিয়ানটি মিথ্যা এবং আমাদের `status` স্ট্রিংটি জানায় যে আমাদের কল ব্যর্থ হয়েছে। অন্যথায়, আমরা `pinataResponse` থেকে `pinataURL` বের করি এবং এটিকে আমাদের `tokenURI` ভেরিয়েবল হিসাবে সংরক্ষণ করি। + +এখন সময় এসেছে আমাদের ফাইলের শীর্ষে আমরা যে Alchemy Web3 API ইনিশিয়ালাইজড করেছিলাম তা ব্যবহার করে আমাদের স্মার্ট কন্ট্র্যাক্ট লোড করার। কন্ট্র্যাক্টটিকে `window.contract` গ্লোবাল ভেরিয়েবলে সেট করতে `mintNFT` ফাংশনের নিচে নিম্নলিখিত কোড লাইনটি যোগ করুন: + +```javascript +window.contract = await new web3.eth.Contract(contractABI, contractAddress) +``` + +আমাদের `mintNFT` ফাংশনে শেষ যে জিনিসটি যোগ করতে হবে তা হল আমাদের ইথেরিয়াম ট্রানজ্যাকশন: + +```javascript +//আপনার ইথেরিয়াম ট্রানজ্যাকশন সেট আপ করুন +const transactionParameters = { + to: contractAddress, // কন্ট্র্যাক্ট প্রকাশের সময় ছাড়া আবশ্যক। + from: window.ethereum.selectedAddress, // ব্যবহারকারীর সক্রিয় অ্যাড্রেসের সাথে মিলতে হবে। + data: window.contract.methods + .mintNFT(window.ethereum.selectedAddress, tokenURI) + .encodeABI(), //NFT স্মার্ট কন্ট্র্যাক্টে কল করুন +} + +//MetaMask এর মাধ্যমে ট্রানজ্যাকশন সাইন করুন +try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + success: true, + status: + "✅ Etherscan-এ আপনার ট্রানজ্যাকশন দেখুন: https://ropsten.etherscan.io/tx/" + + txHash, + } +} catch (error) { + return { + success: false, + status: "😥 কিছু ভুল হয়েছে: " + error.message, + } +} +``` + +আপনি যদি ইথেরিয়াম ট্রানজ্যাকশনের সাথে ইতিমধ্যে পরিচিত হন, আপনি লক্ষ্য করবেন যে কাঠামোটি আপনার দেখা কাঠামোর সাথে বেশ সাদৃশ্যপূর্ণ। + +- প্রথমে, আমরা আমাদের ট্রানজ্যাকশন প্যারামিটার সেট আপ করি। + - `to` প্রাপকের ঠিকানা (আমাদের স্মার্ট কন্ট্র্যাক্ট) নির্দিষ্ট করে + - `from` ট্রানজ্যাকশনের স্বাক্ষরকারীকে নির্দিষ্ট করে (ব্যবহারকারীর MetaMask-এর সাথে সংযুক্ত ঠিকানা: `window.ethereum.selectedAddress`) + - `data` আমাদের স্মার্ট কন্ট্র্যাক্টের `mintNFT` পদ্ধতিতে কল ধারণ করে, যা আমাদের `tokenURI` এবং ব্যবহারকারীর ওয়ালেট ঠিকানা, `window.ethereum.selectedAddress` ইনপুট হিসাবে গ্রহণ করে +- তারপরে, আমরা একটি await কল, `window.ethereum.request,` করি, যেখানে আমরা MetaMask-কে ট্রানজ্যাকশন সাইন করতে বলি। লক্ষ্য করুন, এই অনুরোধে, আমরা আমাদের eth পদ্ধতি (eth_SentTransaction) নির্দিষ্ট করছি এবং আমাদের `transactionParameters` পাস করছি। এই সময়ে, MetaMask ব্রাউজারে খুলবে, এবং ব্যবহারকারীকে ট্রানজ্যাকশন সাইন বা প্রত্যাখ্যান করতে অনুরোধ করবে। + - যদি ট্রানজ্যাকশন সফল হয়, ফাংশনটি একটি JSON অবজেক্ট রিটার্ন করবে যেখানে `success` বুলিয়ানটি সত্য সেট করা হয়েছে এবং `status` স্ট্রিং ব্যবহারকারীকে তাদের ট্রানজ্যাকশন সম্পর্কে আরও তথ্যের জন্য Etherscan দেখতে অনুরোধ করবে। + - যদি ট্রানজ্যাকশন ব্যর্থ হয়, ফাংশনটি একটি JSON অবজেক্ট রিটার্ন করবে যেখানে `success` বুলিয়ানটি মিথ্যা সেট করা হয়েছে, এবং `status` স্ট্রিংটি ত্রুটির বার্তা জানায়। + +সবমিলিয়ে, আমাদের `mintNFT` ফাংশনটি এমন দেখতে হবে: + +```javascript +export const mintNFT = async (url, name, description) => { + //ত্রুটি হ্যান্ডলিং + if (url.trim() == "" || name.trim() == "" || description.trim() == "") { + return { + success: false, + status: "❗মিন্ট করার আগে অনুগ্রহ করে নিশ্চিত করুন যে সমস্ত ফিল্ড সম্পূর্ণ হয়েছে।", + } + } + + //মেটাডেটা তৈরি করুন + const metadata = new Object() + metadata.name = name + metadata.image = url + metadata.description = description + + //পিনাতা পিন অনুরোধ + const pinataResponse = await pinJSONToIPFS(metadata) + if (!pinataResponse.success) { + return { + success: false, + status: "😢 আপনার tokenURI আপলোড করার সময় কিছু ভুল হয়েছে।", + } + } + const tokenURI = pinataResponse.pinataUrl + + //স্মার্ট কন্ট্র্যাক্ট লোড করুন + window.contract = await new web3.eth.Contract(contractABI, contractAddress) //loadContract(); + + //আপনার ইথেরিয়াম ট্রানজ্যাকশন সেট আপ করুন + const transactionParameters = { + to: contractAddress, // কন্ট্র্যাক্ট প্রকাশের সময় ছাড়া আবশ্যক। + from: window.ethereum.selectedAddress, // ব্যবহারকারীর সক্রিয় অ্যাড্রেসের সাথে মিলতে হবে। + data: window.contract.methods + .mintNFT(window.ethereum.selectedAddress, tokenURI) + .encodeABI(), //NFT স্মার্ট কন্ট্র্যাক্টে কল করুন + } + + //MetaMask এর মাধ্যমে ট্রানজ্যাকশন সাইন করুন + try { + const txHash = await window.ethereum.request({ + method: "eth_sendTransaction", + params: [transactionParameters], + }) + return { + success: true, + status: + "✅ Etherscan-এ আপনার ট্রানজ্যাকশন দেখুন: https://ropsten.etherscan.io/tx/" + + txHash, + } + } catch (error) { + return { + success: false, + status: "😥 কিছু ভুল হয়েছে: " + error.message, + } + } +} +``` + +এটি একটি বিশাল ফাংশন! এখন, আমাদের শুধু আমাদের `mintNFT` ফাংশনটিকে আমাদের `Minter.js` কম্পোনেন্টের সাথে সংযুক্ত করতে হবে... + +## আমাদের Minter.js ফ্রন্টএন্ডে mintNFT সংযোগ করুন {#connect-our-frontend} + +`Minter.js` ফাইলটি খুলুন এবং `import { connectWallet, getCurrentWalletConnected } from "./utils/interact.js";` লাইনটি আপডেট করে এমন করুন: + +```javascript +import { + connectWallet, + getCurrentWalletConnected, + mintNFT, +} from "./utils/interact.js" +``` + +অবশেষে, আপনার ইম্পোর্ট করা `mintNFT` ফাংশনে একটি await কল করার জন্য `onMintPressed` ফাংশনটি ইমপ্লিমেন্ট করুন এবং আমাদের ট্রানজ্যাকশন সফল হয়েছে নাকি ব্যর্থ হয়েছে তা প্রতিফলিত করার জন্য `status` স্টেট ভেরিয়েবলটি আপডেট করুন: + +```javascript +const onMintPressed = async () => { + const { status } = await mintNFT(url, name, description) + setStatus(status) +} +``` + +## আপনার NFT একটি লাইভ ওয়েবসাইটে ডিপ্লয় করুন {#deploy-your-NFT} + +ব্যবহারকারীদের সাথে ইন্টারঅ্যাক্ট করার জন্য আপনার প্রজেক্ট লাইভ করতে প্রস্তুত? আপনার Minter একটি লাইভ ওয়েবসাইটে ডিপ্লয় করার জন্য [এই টিউটোরিয়ালটি](https://docs.alchemy.com/alchemy/tutorials/nft-minter/how-do-i-deploy-nfts-online) দেখুন। + +আর একটি শেষ ধাপ... + +## ব্লকচেইন বিশ্বকে নাড়িয়ে দিন {#take-the-blockchain-world-by-storm} + +মজা করছি, আপনি টিউটোরিয়ালের শেষে পৌঁছে গেছেন! + +সংক্ষেপে, একটি NFT মিন্টার তৈরি করে, আপনি সফলভাবে শিখেছেন কীভাবে: + +- আপনার ফ্রন্টএন্ড প্রজেক্টের মাধ্যমে MetaMask-এর সাথে সংযোগ করুন +- আপনার ফ্রন্টএন্ড থেকে স্মার্ট কন্ট্র্যাক্ট পদ্ধতিগুলিকে কল করুন +- MetaMask ব্যবহার করে ট্রানজ্যাকশন সাইন করুন + +সম্ভবত, আপনি আপনার dApp এর মাধ্যমে মিন্ট করা NFT গুলি আপনার ওয়ালেটে দেখাতে চাইবেন — তাই আমাদের দ্রুত টিউটোরিয়াল [How to View Your NFT in Your Wallet](https://www.alchemy.com/docs/how-to-view-your-nft-in-your-mobile-wallet) দেখতে ভুলবেন না! + +এবং, বরাবরের মতো, আপনার যদি কোনো প্রশ্ন থাকে, আমরা [Alchemy Discord](https://discord.gg/gWuC7zB) এ সাহায্য করার জন্য আছি। আপনি এই টিউটোরিয়ালের ধারণাগুলি আপনার ভবিষ্যতের প্রজেক্টে কীভাবে প্রয়োগ করেন তা দেখার জন্য আমরা অপেক্ষা করতে পারছি না! diff --git a/public/content/translations/bn/developers/tutorials/optimism-std-bridge-annotated-code/index.md b/public/content/translations/bn/developers/tutorials/optimism-std-bridge-annotated-code/index.md new file mode 100644 index 00000000000..9b07bb8eb05 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/optimism-std-bridge-annotated-code/index.md @@ -0,0 +1,1320 @@ +--- +title: "অপটিমিজম স্ট্যান্ডার্ড ব্রিজ কন্ট্রাক্ট ওয়াকথ্রু" +description: "Optimism-এর জন্য স্ট্যান্ডার্ড ব্রিজ কীভাবে কাজ করে? এটি কেন এইভাবে কাজ করে?" +author: Ori Pomerantz +tags: [ "সলিডিটি", "ব্রিজ", "লেয়ার 2" ] +skill: intermediate +published: 2022-03-30 +lang: bn +--- + +[Optimism](https://www.optimism.io/) একটি [অপ্টিমিস্টিক রোলআপ](/developers/docs/scaling/optimistic-rollups/)। +Ethereum মেইননেট (যা লেয়ার 1 বা L1 নামেও পরিচিত)-এর তুলনায় অপ্টিমিস্টিক রোলআপগুলি অনেক কম দামে লেনদেন প্রক্রিয়া করতে পারে কারণ লেনদেনগুলি নেটওয়ার্কের প্রতিটি নোডের পরিবর্তে শুধুমাত্র কয়েকটি নোড দ্বারা প্রক্রিয়া করা হয়। +একই সময়ে, সমস্ত ডেটা L1-এ লেখা হয় যাতে মেইননেটের সমস্ত অখণ্ডতা এবং প্রাপ্যতা গ্যারান্টি সহ সবকিছু প্রমাণ এবং পুনর্গঠন করা যায়। + +Optimism (বা অন্য কোনো L2)-এ L1 সম্পদ ব্যবহার করার জন্য, সম্পদগুলিকে [ব্রিজ](/bridges/#prerequisites) করা প্রয়োজন। +এটি অর্জনের একটি উপায় হলো ব্যবহারকারীদের L1-এ সম্পদ (ETH এবং [ERC-20 টোকেন](/developers/docs/standards/tokens/erc-20/) সবচেয়ে সাধারণ) লক করা, এবং L2-এ ব্যবহারের জন্য সমতুল্য সম্পদ গ্রহণ করা। +অবশেষে, যে কেউ সেগুলি পেয়ে যাক না কেন, তারা সেগুলিকে L1-এ ব্রিজ করে ফিরিয়ে আনতে চাইতে পারে। +এটি করার সময়, সম্পদগুলি L2-তে বার্ন করা হয় এবং তারপর L1-এ ব্যবহারকারীকে ফিরিয়ে দেওয়া হয়। + +[Optimism স্ট্যান্ডার্ড ব্রিজ](https://docs.optimism.io/app-developers/bridging/standard-bridge) এভাবেই কাজ করে। +এই নিবন্ধে আমরা সেই ব্রিজের সোর্স কোডটি দেখব যে এটি কীভাবে কাজ করে এবং এটি একটি ভালভাবে লেখা Solidity কোডের উদাহরণ হিসাবে অধ্যয়ন করব। + +## কন্ট্রোল ফ্লো {#control-flows} + +ব্রিজটির দুটি প্রধান ফ্লো আছে: + +- ডিপোজিট (L1 থেকে L2) +- উইথড্রয়াল (L2 থেকে L1) + +### ডিপোজিট ফ্লো {#deposit-flow} + +#### লেয়ার 1 {#deposit-flow-layer-1} + +1. যদি একটি ERC-20 ডিপোজিট করা হয়, তাহলে ডিপোজিটর ব্রিজটিকে ডিপোজিট করা পরিমাণ ব্যয় করার জন্য একটি অ্যালাওয়েন্স দেয় +2. ডিপোজিটর L1 ব্রিজকে কল করে (`depositERC20`, `depositERC20To`, `depositETH`, বা `depositETHTo`) +3. L1 ব্রিজটি ব্রিজ করা সম্পদের দখল নেয় + - ETH: সম্পদটি ডিপোজিটর কলের অংশ হিসাবে স্থানান্তর করে + - ERC-20: সম্পদটি ডিপোজিটর দ্বারা প্রদত্ত অ্যালাওয়েন্স ব্যবহার করে ব্রিজ দ্বারা নিজের কাছে স্থানান্তরিত হয় +4. L1 ব্রিজটি L2 ব্রিজে `finalizeDeposit` কল করতে ক্রস-ডোমেন মেসেজ মেকানিজম ব্যবহার করে + +#### লেয়ার 2 {#deposit-flow-layer-2} + +5. L2 ব্রিজটি `finalizeDeposit`-এ কলটি বৈধ কিনা তা যাচাই করে: + - ক্রস ডোমেন মেসেজ কন্ট্রাক্ট থেকে এসেছে + - মূলত L1-এর ব্রিজ থেকে এসেছিল +6. L2 ব্রিজ পরীক্ষা করে দেখে যে L2-তে ERC-20 টোকেন কন্ট্রাক্ট সঠিক কিনা: + - L2 কন্ট্রাক্ট রিপোর্ট করে যে এর L1 কাউন্টারপার্টটি L1-এ টোকেনগুলি যেখান থেকে এসেছিল তার মতোই + - L2 কন্ট্রাক্ট রিপোর্ট করে যে এটি সঠিক ইন্টারফেস সমর্থন করে ([ERC-165 ব্যবহার করে](https://eips.ethereum.org/EIPS/eip-165))। +7. যদি L2 কন্ট্রাক্টটি সঠিক হয়, তবে উপযুক্ত ঠিকানায় উপযুক্ত সংখ্যক টোকেন মিন্ট করতে এটিকে কল করুন। যদি না হয়, ব্যবহারকারীকে L1-এ টোকেন দাবি করার অনুমতি দেওয়ার জন্য একটি উইথড্রয়াল প্রক্রিয়া শুরু করুন। + +### উইথড্রয়াল ফ্লো {#withdrawal-flow} + +#### লেয়ার 2 {#withdrawal-flow-layer-2} + +1. উইথড্রয়ার L2 ব্রিজকে কল করে (`withdraw` বা `withdrawTo`) +2. L2 ব্রিজটি `msg.sender`-এর অন্তর্গত উপযুক্ত সংখ্যক টোকেন বার্ন করে +3. L2 ব্রিজটি L1 ব্রিজে `finalizeETHWithdrawal` বা `finalizeERC20Withdrawal` কল করার জন্য ক্রস-ডোমেন মেসেজ মেকানিজম ব্যবহার করে + +#### লেয়ার 1 {#withdrawal-flow-layer-1} + +4. L1 ব্রিজটি `finalizeETHWithdrawal` বা `finalizeERC20Withdrawal`-এর কলটি বৈধ কিনা তা যাচাই করে: + - ক্রস ডোমেন মেসেজ মেকানিজম থেকে এসেছে + - মূলত L2-এর ব্রিজ থেকে এসেছিল +5. L1 ব্রিজটি উপযুক্ত সম্পদ (ETH বা ERC-20) উপযুক্ত ঠিকানায় স্থানান্তর করে + +## লেয়ার 1 কোড {#layer-1-code} + +এটি সেই কোড যা L1, Ethereum মেইননেটে চলে। + +### IL1ERC20Bridge {#IL1ERC20Bridge} + +[এই ইন্টারফেসটি এখানে সংজ্ঞায়িত করা হয়েছে](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1ERC20Bridge.sol)। +এতে ERC-20 টোকেন ব্রিজ করার জন্য প্রয়োজনীয় ফাংশন এবং সংজ্ঞা অন্তর্ভুক্ত রয়েছে। + +```solidity +// SPDX-License-Identifier: MIT +``` + +[Optimism-এর বেশিরভাগ কোড MIT লাইসেন্সের অধীনে প্রকাশিত হয়েছে](https://help.optimism.io/hc/en-us/articles/4411908707995-What-software-license-does-Optimism-use-)। + +```solidity +pragma solidity >0.5.0 <0.9.0; +``` + +লেখার সময় Solidity-র সর্বশেষ সংস্করণ হলো 0.8.12। +যতক্ষণ না 0.9.0 সংস্করণ প্রকাশিত হয়, আমরা জানি না এই কোডটি এর সাথে সামঞ্জস্যপূর্ণ কিনা। + +```solidity +/** + * @title IL1ERC20Bridge + */ +interface IL1ERC20Bridge { + /********** + * ইভেন্টস * + **********/ + + event ERC20DepositInitiated( +``` + +Optimism ব্রিজ পরিভাষায় _deposit_-এর অর্থ L1 থেকে L2-তে স্থানান্তর, এবং _withdrawal_-এর অর্থ L2 থেকে L1-তে স্থানান্তর। + +```solidity + address indexed _l1Token, + address indexed _l2Token, +``` + +বেশিরভাগ ক্ষেত্রে L1-এ একটি ERC-20-এর ঠিকানা L2-তে সমতুল্য ERC-20-এর ঠিকানার সমান নয়। +[আপনি এখানে টোকেনের ঠিকানার তালিকা দেখতে পারেন](https://static.optimism.io/optimism.tokenlist.json)। +`chainId` 1 সহ ঠিকানাটি L1-এ (মেইননেট) এবং `chainId` 10 সহ ঠিকানাটি L2-এ (Optimism) রয়েছে। +অন্য দুটি `chainId` মান হলো কোভান টেস্ট নেটওয়ার্ক (42) এবং অপ্টিমিস্টিক কোভান টেস্ট নেটওয়ার্ক (69)-এর জন্য। + +```solidity + address indexed _from, + address _to, + uint256 _amount, + bytes _data + ); +``` + +স্থানান্তরের সাথে নোট যোগ করা সম্ভব, সেক্ষেত্রে সেগুলি রিপোর্ট করা ইভেন্টগুলিতে যোগ করা হয়। + +```solidity + event ERC20WithdrawalFinalized( + address indexed _l1Token, + address indexed _l2Token, + address indexed _from, + address _to, + uint256 _amount, + bytes _data + ); +``` + +একই ব্রিজ কন্ট্রাক্ট উভয় দিকে স্থানান্তর পরিচালনা করে। +L1 ব্রিজের ক্ষেত্রে, এর অর্থ হলো ডিপোজিটের সূচনা এবং উইথড্রয়ালের চূড়ান্তকরণ। + +```solidity + + /******************** + * পাবলিক ফাংশন * + ********************/ + + /** + * @dev সংশ্লিষ্ট L2 ব্রিজ কন্ট্রাক্টের ঠিকানা পান। + * @return সংশ্লিষ্ট L2 ব্রিজ কন্ট্রাক্টের ঠিকানা। + */ + function l2TokenBridge() external returns (address); +``` + +এই ফাংশনটি সত্যিই প্রয়োজন নেই, কারণ L2-তে এটি একটি প্রি-ডিপ্লয়েড কন্ট্রাক্ট, তাই এটি সর্বদা `0x4200000000000000000000000000000000000010` ঠিকানায় থাকে। +এটি L2 ব্রিজের সাথে প্রতিসাম্যের জন্য এখানে রয়েছে, কারণ L1 ব্রিজের ঠিকানা জানা তুচ্ছ _নয়_। + +```solidity + /** + * @dev L2-তে কলারের ব্যালেন্সে ERC20-এর একটি পরিমাণ ডিপোজিট করুন। + * @param _l1Token আমরা যে L1 ERC20 ডিপোজিট করছি তার ঠিকানা + * @param _l2Token L1 সংশ্লিষ্ট L2 ERC20-এর ঠিকানা + * @param _amount ডিপোজিট করার জন্য ERC20-এর পরিমাণ + * @param _l2Gas L2-তে ডিপোজিট সম্পূর্ণ করার জন্য প্রয়োজনীয় গ্যাস সীমা। + * @param _data L2-তে ফরোয়ার্ড করার জন্য ঐচ্ছিক ডেটা। এই ডেটা শুধুমাত্র বাহ্যিক কন্ট্রাক্টগুলির সুবিধার জন্য সরবরাহ করা হয়। সর্বোচ্চ দৈর্ঘ্য প্রয়োগ করা ছাড়া, এই চুক্তিগুলি এর বিষয়বস্তু সম্পর্কে কোনো গ্যারান্টি দেয় না। + */ + function depositERC20( + address _l1Token, + address _l2Token, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) external; +``` + +`_l2Gas` প্যারামিটার হলো L2 গ্যাসের পরিমাণ যা লেনদেন ব্যয় করার অনুমতিপ্রাপ্ত। +[একটি নির্দিষ্ট (উচ্চ) সীমা পর্যন্ত, এটি বিনামূল্যে](https://community.optimism.io/docs/developers/bridge/messaging/#for-l1-%E2%87%92-l2-transactions-2), তাই যদি না ERC-20 চুক্তি মিন্টিংয়ের সময় সত্যিই অদ্ভুত কিছু করে, তবে এটি একটি সমস্যা হওয়া উচিত নয়। +এই ফাংশনটি সাধারণ পরিস্থিতির যত্ন নেয়, যেখানে একজন ব্যবহারকারী একটি ভিন্ন ব্লকচেইনে একই ঠিকানায় সম্পদ ব্রিজ করে। + +```solidity + /** + * @dev L2-তে একজন প্রাপকের ব্যালেন্সে ERC20-এর একটি পরিমাণ ডিপোজিট করুন। + * @param _l1Token আমরা যে L1 ERC20 ডিপোজিট করছি তার ঠিকানা + * @param _l2Token L1 সংশ্লিষ্ট L2 ERC20-এর ঠিকানা + * @param _to L2 ঠিকানা যেখানে উইথড্রয়াল ক্রেডিট করা হবে। + * @param _amount ডিপোজিট করার জন্য ERC20-এর পরিমাণ। + * @param _l2Gas L2-তে ডিপোজিট সম্পূর্ণ করার জন্য প্রয়োজনীয় গ্যাস সীমা। + * @param _data L2-তে ফরোয়ার্ড করার জন্য ঐচ্ছিক ডেটা। এই ডেটা শুধুমাত্র বাহ্যিক কন্ট্রাক্টগুলির সুবিধার জন্য সরবরাহ করা হয়। সর্বোচ্চ দৈর্ঘ্য প্রয়োগ করা ছাড়া, এই চুক্তিগুলি এর বিষয়বস্তু সম্পর্কে কোনো গ্যারান্টি দেয় না। + */ + function depositERC20To( + address _l1Token, + address _l2Token, + address _to, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) external; +``` + +এই ফাংশনটি `depositERC20`-এর প্রায় অনুরূপ, কিন্তু এটি আপনাকে ERC-20 একটি ভিন্ন ঠিকানায় পাঠাতে দেয়। + +```solidity + /************************* + * ক্রস-চেইন ফাংশন * + *************************/ + + /** + * @dev L2 থেকে L1-এ একটি উইথড্রয়াল সম্পূর্ণ করুন, এবং L1 ERC20 টোকেনের প্রাপকের ব্যালেন্সে তহবিল ক্রেডিট করুন। + * L2 থেকে শুরু করা উইথড্রয়াল চূড়ান্ত না হলে এই কলটি ব্যর্থ হবে। + * + * @param _l1Token L1 টোকেনের ঠিকানা যার জন্য finalizeWithdrawal করতে হবে। + * @param _l2Token L2 টোকেনের ঠিকানা যেখানে উইথড্রয়াল শুরু হয়েছিল। + * @param _from L2 ঠিকানা যা স্থানান্তর শুরু করছে। + * @param _to L1 ঠিকানা যেখানে উইথড্রয়াল ক্রেডিট করা হবে। + * @param _amount ডিপোজিট করার জন্য ERC20-এর পরিমাণ। + * @param _data L2-তে প্রেরকের দ্বারা প্রদত্ত ডেটা। এই ডেটা শুধুমাত্র বাহ্যিক কন্ট্রাক্টগুলির সুবিধার জন্য সরবরাহ করা হয়। সর্বোচ্চ দৈর্ঘ্য প্রয়োগ করা ছাড়া, এই চুক্তিগুলি এর বিষয়বস্তু সম্পর্কে কোনো গ্যারান্টি দেয় না। + */ + function finalizeERC20Withdrawal( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external; +} +``` + +Optimism-এ উইথড্রয়াল (এবং L2 থেকে L1-এ অন্যান্য মেসেজ) একটি দ্বি-ধাপ প্রক্রিয়া: + +1. L2-তে একটি সূচনাকারী লেনদেন। +2. L1-এ একটি চূড়ান্ত বা দাবি করার লেনদেন। + L2 লেনদেনের জন্য [ফল্ট চ্যালেঞ্জ পিরিয়ড](https://community.optimism.io/docs/how-optimism-works/#fault-proofs) শেষ হওয়ার পরে এই লেনদেনটি হওয়া প্রয়োজন। + +### IL1StandardBridge {#il1standardbridge} + +[এই ইন্টারফেসটি এখানে সংজ্ঞায়িত করা হয়েছে](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/IL1StandardBridge.sol)। +এই ফাইলে ETH-এর জন্য ইভেন্ট এবং ফাংশনের সংজ্ঞা রয়েছে। +এই সংজ্ঞাগুলি ERC-20-এর জন্য উপরে `IL1ERC20Bridge`-এ সংজ্ঞায়িতগুলির সাথে খুব মিল। + +ব্রিজ ইন্টারফেসটি দুটি ফাইলের মধ্যে বিভক্ত কারণ কিছু ERC-20 টোকেনের জন্য কাস্টম প্রক্রিয়াকরণ প্রয়োজন এবং স্ট্যান্ডার্ড ব্রিজ দ্বারা পরিচালিত করা যায় না। +এইভাবে এই ধরনের টোকেন হ্যান্ডেল করে এমন কাস্টম ব্রিজ `IL1ERC20Bridge` প্রয়োগ করতে পারে এবং ETH ব্রিজ করার প্রয়োজন হয় না। + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.9.0; + +import "./IL1ERC20Bridge.sol"; + +/** + * @title IL1StandardBridge + */ +interface IL1StandardBridge is IL1ERC20Bridge { + /********** + * ইভেন্টস * + **********/ + event ETHDepositInitiated( + address indexed _from, + address indexed _to, + uint256 _amount, + bytes _data + ); +``` + +এই ইভেন্টটি ERC-20 সংস্করণ (`ERC20DepositInitiated`)-এর প্রায় অনুরূপ, শুধুমাত্র L1 এবং L2 টোকেন ঠিকানা ছাড়া। +অন্যান্য ইভেন্ট এবং ফাংশনগুলির জন্যও একই কথা সত্য। + +```solidity + event ETHWithdrawalFinalized( + . + . + . + ); + + /******************** + * পাবলিক ফাংশন * + ********************/ + + /** + * @dev L2-তে কলারের ব্যালেন্সে ETH-এর একটি পরিমাণ ডিপোজিট করুন। + . + . + . + */ + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable; + + /** + * @dev L2-তে একজন প্রাপকের ব্যালেন্সে ETH-এর একটি পরিমাণ ডিপোজিট করুন। + . + . + . + */ + function depositETHTo( + address _to, + uint32 _l2Gas, + bytes calldata _data + ) external payable; + + /************************* + * ক্রস-চেইন ফাংশন * + *************************/ + + /** + * @dev L2 থেকে L1-এ একটি উইথড্রয়াল সম্পূর্ণ করুন এবং L1 ETH টোকেনের প্রাপকের ব্যালেন্সে তহবিল ক্রেডিট করুন। যেহেতু শুধুমাত্র xDomainMessenger এই ফাংশনটি কল করতে পারে, তাই উইথড্রয়াল চূড়ান্ত হওয়ার আগে এটি কখনই কল করা হবে না। + . + . + . + */ + function finalizeETHWithdrawal( + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external; +} +``` + +### CrossDomainEnabled {#crossdomainenabled} + +[এই কন্ট্রাক্টটি](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/CrossDomainEnabled.sol) উভয় ব্রিজ ([L1](#the-l1-bridge-contract) এবং [L2](#the-l2-bridge-contract)) দ্বারা অন্য লেয়ারে মেসেজ পাঠানোর জন্য ইনহেরিট করা হয়েছে। + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity >0.5.0 <0.9.0; + +/* ইন্টারফেস ইমপোর্টস */ +import { ICrossDomainMessenger } from "./ICrossDomainMessenger.sol"; +``` + +[এই ইন্টারফেসটি](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/bridge/ICrossDomainMessenger.sol) কন্ট্রাক্টকে বলে যে কীভাবে ক্রস ডোমেন মেসেঞ্জার ব্যবহার করে অন্য লেয়ারে মেসেজ পাঠাতে হয়। +এই ক্রস ডোমেন মেসেঞ্জার একটি সম্পূর্ণ ভিন্ন সিস্টেম, এবং এর জন্য একটি নিজস্ব নিবন্ধ প্রয়োজন, যা আমি ভবিষ্যতে লেখার আশা করি। + +```solidity +/** + * @title CrossDomainEnabled + * @dev ক্রস-ডোমেন কমিউনিকেশন করা কন্ট্রাক্টগুলোর জন্য সহায়ক কন্ট্রাক্ট + * + * ব্যবহৃত কম্পাইলার: ইনহেরিট করা কন্ট্রাক্ট দ্বারা সংজ্ঞায়িত + */ +contract CrossDomainEnabled { + /************* + * ভেরিয়েবল * + *************/ + + // অন্য ডোমেন থেকে মেসেজ পাঠাতে এবং গ্রহণ করতে ব্যবহৃত মেসেঞ্জার কন্ট্রাক্ট। + address public messenger; + + /*************** + * কনস্ট্রাক্টর * + ***************/ + + /** + * @param _messenger বর্তমান লেয়ারে CrossDomainMessenger-এর ঠিকানা। + */ + constructor(address _messenger) { + messenger = _messenger; + } +``` + +একটি প্যারামিটার যা কন্ট্রাক্টকে জানতে হবে, তা হলো এই লেয়ারে ক্রস ডোমেন মেসেঞ্জারের ঠিকানা। +এই প্যারামিটারটি কনস্ট্রাক্টরে একবার সেট করা হয় এবং আর কখনও পরিবর্তন হয় না। + +```solidity + + /********************** + * ফাংশন মডিফায়ার * + **********************/ + + /** + * বাধ্য করে যে পরিবর্তিত ফাংশনটি শুধুমাত্র একটি নির্দিষ্ট ক্রস-ডোমেন অ্যাকাউন্ট দ্বারা কলযোগ্য। + * @param _sourceDomainAccount উৎস ডোমেনের একমাত্র অ্যাকাউন্ট যা এই ফাংশনটি কল করার জন্য প্রমাণীকৃত। + */ + modifier onlyFromCrossDomainAccount(address _sourceDomainAccount) { +``` + +ক্রস ডোমেন মেসেজিং যে ব্লকচেইনে চলছে (Ethereum মেইননেট বা Optimism) তার যেকোনো কন্ট্রাক্ট দ্বারা অ্যাক্সেসযোগ্য। +কিন্তু আমাদের প্রতিটি দিকে ব্রিজটিকে _শুধুমাত্র_ নির্দিষ্ট মেসেজ বিশ্বাস করতে হবে যদি সেগুলি অন্য দিকের ব্রিজ থেকে আসে। + +```solidity + require( + msg.sender == address(getCrossDomainMessenger()), + "OVM_XCHAIN: messenger contract unauthenticated" + ); +``` + +শুধুমাত্র উপযুক্ত ক্রস ডোমেন মেসেঞ্জার (`messenger`, যেমন আপনি নীচে দেখছেন) থেকে আসা মেসেজ বিশ্বাস করা যেতে পারে। + +```solidity + + require( + getCrossDomainMessenger().xDomainMessageSender() == _sourceDomainAccount, + "OVM_XCHAIN: wrong sender of cross-domain message" + ); +``` + +অন্য লেয়ারের সাথে মেসেজ পাঠানো ঠিকানাটি ক্রস ডোমেন মেসেঞ্জার যেভাবে সরবরাহ করে তা হলো [`.xDomainMessageSender()` ফাংশন](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1CrossDomainMessenger.sol#L122-L128)। +যতক্ষণ এটি মেসেজ দ্বারা শুরু করা লেনদেনে কল করা হয়, ততক্ষণ এটি এই তথ্য সরবরাহ করতে পারে। + +আমাদের নিশ্চিত করতে হবে যে আমরা যে মেসেজটি পেয়েছি তা অন্য ব্রিজ থেকে এসেছে। + +```solidity + + _; + } + + /********************** + * ইন্টারনাল ফাংশন * + **********************/ + + /** + * মেসেঞ্জার পায়, সাধারণত স্টোরেজ থেকে। চাইল্ড কন্ট্রাক্টকে ওভাররাইড করার প্রয়োজন হলে এই ফাংশনটি এক্সপোজ করা হয়। + * @return ক্রস-ডোমেন মেসেঞ্জার কন্ট্রাক্টের ঠিকানা যা ব্যবহার করা উচিত। + */ + function getCrossDomainMessenger() internal virtual returns (ICrossDomainMessenger) { + return ICrossDomainMessenger(messenger); + } +``` + +এই ফাংশনটি ক্রস ডোমেন মেসেঞ্জার রিটার্ন করে। +আমরা `messenger` ভেরিয়েবলের পরিবর্তে একটি ফাংশন ব্যবহার করি যাতে এই কন্ট্রাক্ট থেকে ইনহেরিট করা কন্ট্রাক্টগুলো কোন ক্রস ডোমেন মেসেঞ্জার ব্যবহার করতে হবে তা নির্দিষ্ট করার জন্য একটি অ্যালগরিদম ব্যবহার করতে পারে। + +```solidity + + /** + * অন্য ডোমেনের একটি অ্যাকাউন্টে একটি মেসেজ পাঠায় + * @param _crossDomainTarget গন্তব্য ডোমেনের উদ্দিষ্ট প্রাপক + * @param _message টার্গেটে পাঠানোর জন্য ডেটা (সাধারণত onlyFromCrossDomainAccount() সহ একটি ফাংশনের জন্য ক্যালডাটা) + * @param _gasLimit টার্গেট ডোমেনে মেসেজ প্রাপ্তির জন্য গ্যাসলিমিট। + */ + function sendCrossDomainMessage( + address _crossDomainTarget, + uint32 _gasLimit, + bytes memory _message +``` + +অবশেষে, যে ফাংশনটি অন্য লেয়ারে একটি মেসেজ পাঠায়। + +```solidity + ) internal { + // slither-disable-next-line reentrancy-events, reentrancy-benign +``` + +[Slither](https://github.com/crytic/slither) একটি স্ট্যাটিক অ্যানালাইজার যা Optimism প্রতিটি কন্ট্রাক্টে দুর্বলতা এবং অন্যান্য সম্ভাব্য সমস্যা খোঁজার জন্য চালায়। +এই ক্ষেত্রে, নিম্নলিখিত লাইনটি দুটি দুর্বলতা ট্রিগার করে: + +1. [রিএন্ট্রেন্সি ইভেন্ট](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-3) +2. [বেনাইন রিএন্ট্রেন্সি](https://github.com/crytic/slither/wiki/Detector-Documentation#reentrancy-vulnerabilities-2) + +```solidity + getCrossDomainMessenger().sendMessage(_crossDomainTarget, _message, _gasLimit); + } +} +``` + +এই ক্ষেত্রে আমরা রিএন্ট্রেন্সি নিয়ে চিন্তিত নই, আমরা জানি `getCrossDomainMessenger()` একটি বিশ্বাসযোগ্য ঠিকানা রিটার্ন করে, যদিও Slither-এর এটি জানার কোনো উপায় নেই। + +### L1 ব্রিজ কন্ট্রাক্ট {#the-l1-bridge-contract} + +[এই কন্ট্রাক্টের জন্য সোর্স কোড এখানে আছে](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L1/messaging/L1StandardBridge.sol)। + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; +``` + +ইন্টারফেসগুলি অন্যান্য কন্ট্রাক্টের অংশ হতে পারে, তাই তাদের বিভিন্ন Solidity সংস্করণ সমর্থন করতে হয়। +কিন্তু ব্রিজটি নিজেই আমাদের কন্ট্রাক্ট, এবং আমরা এটি কোন Solidity সংস্করণ ব্যবহার করবে সে বিষয়ে কঠোর হতে পারি। + +```solidity +/* ইন্টারফেস ইমপোর্টস */ +import { IL1StandardBridge } from "./IL1StandardBridge.sol"; +import { IL1ERC20Bridge } from "./IL1ERC20Bridge.sol"; +``` + +[IL1ERC20Bridge](#IL1ERC20Bridge) এবং [IL1StandardBridge](#IL1StandardBridge) উপরে ব্যাখ্যা করা হয়েছে। + +```solidity +import { IL2ERC20Bridge } from "../../L2/messaging/IL2ERC20Bridge.sol"; +``` + +[এই ইন্টারফেসটি](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) আমাদের L2-তে স্ট্যান্ডার্ড ব্রিজ নিয়ন্ত্রণ করার জন্য মেসেজ তৈরি করতে দেয়। + +```solidity +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +``` + +[এই ইন্টারফেসটি](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) আমাদের ERC-20 কন্ট্রাক্ট নিয়ন্ত্রণ করতে দেয়। +[আপনি এখানে এর সম্পর্কে আরও পড়তে পারেন](/developers/tutorials/erc20-annotated-code/#the-interface)। + +```solidity +/* লাইব্রেরি ইমপোর্ট */ +import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; +``` + +[উপরে যেমন ব্যাখ্যা করা হয়েছে](#crossdomainenabled), এই কন্ট্রাক্টটি ইন্টারলেয়ার মেসেজিংয়ের জন্য ব্যবহৃত হয়। + +```solidity +import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; +``` + +[`Lib_PredeployAddresses`](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/libraries/constants/Lib_PredeployAddresses.sol)-এ L2 কন্ট্রাক্টগুলির ঠিকানা রয়েছে যেগুলোর সর্বদা একই ঠিকানা থাকে। এর মধ্যে L2-তে স্ট্যান্ডার্ড ব্রিজও অন্তর্ভুক্ত। + +```solidity +import { Address } from "@openzeppelin/contracts/utils/Address.sol"; +``` + +[OpenZeppelin-এর Address ইউটিলিটি](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol)। এটি কন্ট্রাক্টের ঠিকানা এবং এক্সটার্নালি ওন্ড অ্যাকাউন্ট (EOA)-এর অন্তর্গত ঠিকানাগুলির মধ্যে পার্থক্য করতে ব্যবহৃত হয়। + +উল্লেখ্য যে এটি একটি নিখুঁত সমাধান নয়, কারণ সরাসরি কল এবং একটি কন্ট্রাক্টের কনস্ট্রাক্টর থেকে করা কলের মধ্যে পার্থক্য করার কোনো উপায় নেই, তবে অন্তত এটি আমাদের কিছু সাধারণ ব্যবহারকারী ত্রুটি সনাক্ত এবং প্রতিরোধ করতে দেয়। + +```solidity +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +``` + +[ERC-20 স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-20) ব্যর্থতা রিপোর্ট করার জন্য একটি কন্ট্রাক্টের জন্য দুটি উপায় সমর্থন করে: + +1. রিভার্ট করুন +2. `false` রিটার্ন করুন + +উভয় ক্ষেত্রেই হ্যান্ডেল করা আমাদের কোডকে আরও জটিল করে তুলবে, তাই এর পরিবর্তে আমরা [OpenZeppelin-এর `SafeERC20`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol) ব্যবহার করি, যা নিশ্চিত করে [সব ব্যর্থতা রিভার্টে পরিণত হয়](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol#L96)। + +```solidity +/** + * @title L1StandardBridge + * @dev L1 ETH এবং ERC20 ব্রিজ হল এমন একটি কন্ট্রাক্ট যা ডিপোজিট করা L1 ফান্ড এবং স্ট্যান্ডার্ড টোকেন সংরক্ষণ করে যা L2-তে ব্যবহৃত হচ্ছে। এটি একটি সংশ্লিষ্ট L2 ব্রিজকে সিঙ্ক্রোনাইজ করে, এটিকে ডিপোজিট সম্পর্কে জানায় এবং নতুন চূড়ান্ত হওয়া উইথড্রয়ালের জন্য এটি শোনে। + * + */ +contract L1StandardBridge is IL1StandardBridge, CrossDomainEnabled { + using SafeERC20 for IERC20; +``` + +এই লাইনটি হল যেভাবে আমরা `IERC20` ইন্টারফেস ব্যবহার করার সময় `SafeERC20` র‍্যাপার ব্যবহার করতে নির্দিষ্ট করি। + +```solidity + + /******************************** + * এক্সটার্নাল কন্ট্রাক্ট রেফারেন্স * + ********************************/ + + address public l2TokenBridge; +``` + +[L2StandardBridge](#the-l2-bridge-contract)-এর ঠিকানা। + +```solidity + + // ডিপোজিট করা L1 টোকেনের ব্যালেন্সে L1 টোকেন থেকে L2 টোকেন ম্যাপ করে + mapping(address => mapping(address => uint256)) public deposits; +``` + +এই ধরনের একটি ডাবল [ম্যাপিং](https://www.tutorialspoint.com/solidity/solidity_mappings.htm) হল একটি [দ্বি-মাত্রিক স্পার্স অ্যারে](https://en.wikipedia.org/wiki/Sparse_matrix) সংজ্ঞায়িত করার উপায়। +এই ডেটা স্ট্রাকচারের মানগুলিকে `deposit[L1 token addr][L2 token addr]` হিসাবে চিহ্নিত করা হয়। +ডিফল্ট মান শূন্য। +শুধুমাত্র যে সেলগুলি একটি ভিন্ন মানে সেট করা হয়েছে সেগুলি স্টোরেজে লেখা হয়। + +```solidity + + /*************** + * কনস্ট্রাক্টর * + ***************/ + + // এই কন্ট্রাক্টটি একটি প্রক্সির পিছনে থাকে, তাই কনস্ট্রাক্টর প্যারামিটারগুলি অব্যবহৃত থাকবে। + constructor() CrossDomainEnabled(address(0)) {} +``` + +স্টোরেজের সমস্ত ভেরিয়েবল কপি না করেই এই কন্ট্রাক্ট আপগ্রেড করতে চাই। +এটি করার জন্য আমরা একটি [`Proxy`](https://docs.openzeppelin.com/contracts/3.x/api/proxy) ব্যবহার করি, একটি কন্ট্রাক্ট যা একটি পৃথক কন্ট্রাক্টে কল স্থানান্তর করার জন্য [`delegatecall`](https://solidity-by-example.org/delegatecall/) ব্যবহার করে যার ঠিকানা প্রক্সি কন্ট্রাক্ট দ্বারা সংরক্ষণ করা হয় (আপনি আপগ্রেড করার সময় প্রক্সিটিকে সেই ঠিকানা পরিবর্তন করতে বলেন)। +আপনি যখন `delegatecall` ব্যবহার করেন তখন স্টোরেজ _কলিং_ কন্ট্রাক্টের স্টোরেজ হিসাবে থাকে, তাই সমস্ত কন্ট্রাক্ট স্টেট ভেরিয়েবলের মান প্রভাবিত হয় না। + +এই প্যাটার্নের একটি প্রভাব হলো যে `delegatecall`-এর _কল করা_ কন্ট্রাক্টের স্টোরেজ ব্যবহার করা হয় না এবং তাই এটিতে পাস করা কনস্ট্রাক্টর মানগুলি কোনো গুরুত্ব রাখে না। +এই কারণেই আমরা `CrossDomainEnabled` কনস্ট্রাক্টরে একটি অর্থহীন মান সরবরাহ করতে পারি। +এটিই কারণ যে নীচের ইনিশিয়ালাইজেশন কনস্ট্রাক্টর থেকে আলাদা। + +```solidity + /****************** + * ইনিশিয়ালাইজেশন * + ******************/ + + /** + * @param _l1messenger ক্রস-চেইন যোগাযোগের জন্য ব্যবহৃত L1 মেসেঞ্জারের ঠিকানা। + * @param _l2TokenBridge L2 স্ট্যান্ডার্ড ব্রিজের ঠিকানা। + */ + // slither-disable-next-line external-function +``` + +এই [Slither পরীক্ষাটি](https://github.com/crytic/slither/wiki/Detector-Documentation#public-function-that-could-be-declared-external) এমন ফাংশনগুলি সনাক্ত করে যা কন্ট্রাক্টের কোড থেকে কল করা হয় না এবং তাই `public`-এর পরিবর্তে `external` ঘোষণা করা যেতে পারে। +`external` ফাংশনের গ্যাস খরচ কম হতে পারে, কারণ সেগুলিকে ক্যালডাটাতে প্যারামিটার সরবরাহ করা যেতে পারে। +`public` হিসাবে ঘোষিত ফাংশনগুলিকে কন্ট্রাক্টের মধ্যে থেকে অ্যাক্সেসযোগ্য হতে হবে। +কন্ট্রাক্টগুলি তাদের নিজস্ব ক্যালডাটা পরিবর্তন করতে পারে না, তাই প্যারামিটারগুলিকে মেমরিতে থাকতে হবে। +যখন এই ধরনের একটি ফাংশন বাইরে থেকে কল করা হয়, তখন ক্যালডাটা মেমরিতে কপি করা প্রয়োজন, যা গ্যাস খরচ করে। +এই ক্ষেত্রে ফাংশনটি শুধুমাত্র একবার কল করা হয়, তাই অদক্ষতা আমাদের কাছে গুরুত্বপূর্ণ নয়। + +```solidity + function initialize(address _l1messenger, address _l2TokenBridge) public { + require(messenger == address(0), "Contract has already been initialized."); +``` + +`initialize` ফাংশনটি কেবল একবারই কল করা উচিত। +যদি L1 ক্রস ডোমেন মেসেঞ্জার বা L2 টোকেন ব্রিজের ঠিকানা পরিবর্তন হয়, তাহলে আমরা একটি নতুন প্রক্সি এবং একটি নতুন ব্রিজ তৈরি করি যা এটিকে কল করে। +পুরো সিস্টেম আপগ্রেড করার সময় ছাড়া এটি ঘটার সম্ভাবনা কম, যা একটি খুব বিরল ঘটনা। + +উল্লেখ্য যে এই ফাংশনে এমন কোনো মেকানিজম নেই যা সীমাবদ্ধ করে যে _কে_ এটি কল করতে পারে। +এর মানে হল, তাত্ত্বিকভাবে একজন আক্রমণকারী আমাদের প্রক্সি এবং ব্রিজের প্রথম সংস্করণ ডিপ্লয় না করা পর্যন্ত অপেক্ষা করতে পারে এবং তারপর বৈধ ব্যবহারকারীর আগে `initialize` ফাংশনে পৌঁছানোর জন্য [ফ্রন্ট-রান](https://solidity-by-example.org/hacks/front-running/) করতে পারে। কিন্তু এটি প্রতিরোধের দুটি পদ্ধতি আছে: + +1. যদি কন্ট্রাক্টগুলি সরাসরি একটি EOA দ্বারা ডিপ্লয় না করে [একটি লেনদেনে ডিপ্লয় করা হয় যেখানে অন্য একটি কন্ট্রাক্ট সেগুলি তৈরি করে](https://medium.com/upstate-interactive/creating-a-contract-with-a-smart-contract-bdb67c5c8595) তাহলে পুরো প্রক্রিয়াটি অ্যাটমিক হতে পারে এবং অন্য কোনো লেনদেন কার্যকর হওয়ার আগে শেষ হতে পারে। +2. যদি `initialize`-এর বৈধ কল ব্যর্থ হয়, তাহলে নতুন তৈরি করা প্রক্সি এবং ব্রিজকে উপেক্ষা করে নতুন করে তৈরি করা সবসময়ই সম্ভব। + +```solidity + messenger = _l1messenger; + l2TokenBridge = _l2TokenBridge; + } +``` + +এই দুটি প্যারামিটারই ব্রিজের জানা প্রয়োজন। + +```solidity + + /************** + * ডিপোজিট করা * + **************/ + + /** @dev প্রেরককে EOA হতে হবে এমন মডিফায়ার। এই পরীক্ষাটি একটি ক্ষতিকারক + * কন্ট্রাক্ট ইনিটকোডের মাধ্যমে বাইপাস করতে পারে, তবে এটি ব্যবহারকারীর যে ত্রুটি আমরা এড়াতে চাই তার যত্ন নেয়। + */ + modifier onlyEOA() { + // কন্ট্রাক্ট থেকে ডিপোজিট বন্ধ করতে ব্যবহৃত (দুর্ঘটনাক্রমে হারিয়ে যাওয়া টোকেন এড়াতে) + require(!Address.isContract(msg.sender), "Account not EOA"); + _; + } +``` + +এই কারণেই আমাদের OpenZeppelin-এর `Address` ইউটিলিটির প্রয়োজন ছিল। + +```solidity + /** + * @dev এই ফাংশনটি কোনো ডেটা ছাড়াই কল করা যেতে পারে + * L2-তে কলারের ব্যালেন্সে ETH-এর একটি পরিমাণ ডিপোজিট করতে। + * যেহেতু রিসিভ ফাংশন ডেটা নেয় না, একটি রক্ষণশীল + * ডিফল্ট পরিমাণ L2-তে ফরোয়ার্ড করা হয়। + */ + receive() external payable onlyEOA { + _initiateETHDeposit(msg.sender, msg.sender, 200_000, bytes("")); + } +``` + +এই ফাংশনটি পরীক্ষার উদ্দেশ্যে বিদ্যমান। +লক্ষ্য করুন যে এটি ইন্টারফেস সংজ্ঞায় উপস্থিত হয় না - এটি সাধারণ ব্যবহারের জন্য নয়। + +```solidity + /** + * @inheritdoc IL1StandardBridge + */ + function depositETH(uint32 _l2Gas, bytes calldata _data) external payable onlyEOA { + _initiateETHDeposit(msg.sender, msg.sender, _l2Gas, _data); + } + + /** + * @inheritdoc IL1StandardBridge + */ + function depositETHTo( + address _to, + uint32 _l2Gas, + bytes calldata _data + ) external payable { + _initiateETHDeposit(msg.sender, _to, _l2Gas, _data); + } +``` + +এই দুটি ফাংশন `_initiateETHDeposit`-এর চারপাশে র‍্যাপার, যা প্রকৃত ETH ডিপোজিট পরিচালনা করে। + +```solidity + /** + * @dev ETH সংরক্ষণ করে এবং L2 ETH গেটওয়েকে ডিপোজিট সম্পর্কে জানিয়ে ডিপোজিটের জন্য যুক্তি সম্পাদন করে। + * @param _from L1-এ যে অ্যাকাউন্ট থেকে ডিপোজিট টানা হবে। + * @param _to L2-তে যে অ্যাকাউন্টে ডিপোজিট দেওয়া হবে। + * @param _l2Gas L2-তে ডিপোজিট সম্পূর্ণ করার জন্য প্রয়োজনীয় গ্যাস সীমা। + * @param _data L2-তে ফরোয়ার্ড করার জন্য ঐচ্ছিক ডেটা। এই ডেটা শুধুমাত্র বাহ্যিক কন্ট্রাক্টগুলির সুবিধার জন্য সরবরাহ করা হয়। সর্বোচ্চ দৈর্ঘ্য প্রয়োগ করা ছাড়া, এই চুক্তিগুলি এর বিষয়বস্তু সম্পর্কে কোনো গ্যারান্টি দেয় না। + */ + function _initiateETHDeposit( + address _from, + address _to, + uint32 _l2Gas, + bytes memory _data + ) internal { + // finalizeDeposit কলের জন্য ক্যালডাটা তৈরি করুন + bytes memory message = abi.encodeWithSelector( +``` + +ক্রস ডোমেন মেসেজ যেভাবে কাজ করে তা হলো, গন্তব্য কন্ট্রাক্টটিকে মেসেজটি তার ক্যালডাটা হিসেবে দিয়ে কল করা হয়। +Solidity কন্ট্রাক্টগুলো সবসময় তাদের ক্যালডাটা [ABI স্পেসিফিকেশন](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html) অনুযায়ী ব্যাখ্যা করে। +Solidity ফাংশন [`abi.encodeWithSelector`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#abi-encoding-and-decoding-functions) সেই ক্যালডাটা তৈরি করে। + +```solidity + IL2ERC20Bridge.finalizeDeposit.selector, + address(0), + Lib_PredeployAddresses.OVM_ETH, + _from, + _to, + msg.value, + _data + ); +``` + +এখানে মেসেজটি হলো এই প্যারামিটারগুলির সাথে [`finalizeDeposit` ফাংশন](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol#L141-L148) কল করা: + +| প্যারামিটার | মান | অর্থ | +| ------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| \_l1Token | address(0) | L1-এ ETH-এর (যা একটি ERC-20 টোকেন নয়) জন্য বিশেষ মান | +| \_l2Token | Lib_PredeployAddresses.OVM_ETH | Optimism-এ ETH পরিচালনাকারী L2 কন্ট্রাক্ট, `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` (এই কন্ট্রাক্টটি শুধুমাত্র অভ্যন্তরীণ Optimism ব্যবহারের জন্য) | +| \_from | \_from | L1-এর ঠিকানা যা ETH পাঠায় | +| \_to | \_to | L2-এর ঠিকানা যা ETH গ্রহণ করে | +| পরিমাণ | msg.value | প্রেরিত wei-এর পরিমাণ (যা ইতিমধ্যে ব্রিজে পাঠানো হয়েছে) | +| \_data | \_data | ডিপোজিটের সাথে সংযুক্ত করার জন্য অতিরিক্ত ডেটা | + +```solidity + // ক্যালডাটা L2-তে পাঠান + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); +``` + +ক্রস ডোমেন মেসেঞ্জারের মাধ্যমে মেসেজটি পাঠান। + +```solidity + // slither-disable-next-line reentrancy-events + emit ETHDepositInitiated(_from, _to, msg.value, _data); + } +``` + +এই স্থানান্তরের বিষয়ে যেকোনো বিকেন্দ্রীভূত অ্যাপ্লিকেশনকে জানানোর জন্য একটি ইভেন্ট প্রকাশ করুন। + +```solidity + /** + * @inheritdoc IL1ERC20Bridge + */ + function depositERC20( + . + . + . + ) external virtual onlyEOA { + _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, msg.sender, _amount, _l2Gas, _data); + } + + /** + * @inheritdoc IL1ERC20Bridge + */ + function depositERC20To( + . + . + . + ) external virtual { + _initiateERC20Deposit(_l1Token, _l2Token, msg.sender, _to, _amount, _l2Gas, _data); + } +``` + +এই দুটি ফাংশন `_initiateERC20Deposit`-এর চারপাশে র‍্যাপার, যা প্রকৃত ERC-20 ডিপোজিট পরিচালনা করে। + +```solidity + /** + * @dev L2 ডিপোজিটেড টোকেন কন্ট্রাক্টকে ডিপোজিট সম্পর্কে জানিয়ে এবং L1 ফান্ড লক করার জন্য একটি হ্যান্ডলার কল করে ডিপোজিটের জন্য যুক্তি সম্পাদন করে। (যেমন, transferFrom) + * + * @param _l1Token আমরা ডিপোজিট করছি এমন L1 ERC20-এর ঠিকানা + * @param _l2Token L1 সংশ্লিষ্ট L2 ERC20-এর ঠিকানা + * @param _from L1-এ যে অ্যাকাউন্ট থেকে ডিপোজিট টানা হবে + * @param _to L2-তে যে অ্যাকাউন্টে ডিপোজিট দেওয়া হবে + * @param _amount ডিপোজিট করার জন্য ERC20-এর পরিমাণ। + * @param _l2Gas L2-তে ডিপোজিট সম্পূর্ণ করার জন্য প্রয়োজনীয় গ্যাস সীমা। + * @param _data L2-তে ফরোয়ার্ড করার জন্য ঐচ্ছিক ডেটা। এই ডেটা শুধুমাত্র বাহ্যিক কন্ট্রাক্টগুলির সুবিধার জন্য সরবরাহ করা হয়। সর্বোচ্চ দৈর্ঘ্য প্রয়োগ করা ছাড়া, এই চুক্তিগুলি এর বিষয়বস্তু সম্পর্কে কোনো গ্যারান্টি দেয় না। + */ + function _initiateERC20Deposit( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + uint32 _l2Gas, + bytes calldata _data + ) internal { +``` + +এই ফাংশনটি উপরের `_initiateETHDeposit`-এর মতোই, তবে কয়েকটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। +প্রথম পার্থক্য হল এই ফাংশনটি টোকেনের ঠিকানা এবং স্থানান্তরের পরিমাণ প্যারামিটার হিসাবে গ্রহণ করে। +ETH-এর ক্ষেত্রে ব্রিজের কলে ইতিমধ্যেই ব্রিজ অ্যাকাউন্টে সম্পদ স্থানান্তর অন্তর্ভুক্ত থাকে (`msg.value`)। + +```solidity + // যখন L1-এ একটি ডিপোজিট শুরু হয়, তখন L1 ব্রিজ ভবিষ্যতের উইথড্রয়ালের জন্য ফান্ডগুলি নিজের কাছে স্থানান্তর করে। safeTransferFrom এটিও পরীক্ষা করে যে কন্ট্রাক্টে কোড আছে কিনা, তাই যদি _from একটি EOA বা address(0) হয় তবে এটি ব্যর্থ হবে। + // slither-disable-next-line reentrancy-events, reentrancy-benign + IERC20(_l1Token).safeTransferFrom(_from, address(this), _amount); +``` + +ERC-20 টোকেন স্থানান্তর ETH থেকে একটি ভিন্ন প্রক্রিয়া অনুসরণ করে: + +1. ব্যবহারকারী (`_from`) উপযুক্ত টোকেন স্থানান্তর করার জন্য ব্রিজকে একটি অ্যালাওয়েন্স দেয়। +2. ব্যবহারকারী টোকেন কন্ট্রাক্টের ঠিকানা, পরিমাণ ইত্যাদি সহ ব্রিজকে কল করে। +3. ব্রিজটি ডিপোজিট প্রক্রিয়ার অংশ হিসাবে টোকেনগুলি (নিজের কাছে) স্থানান্তর করে। + +প্রথম ধাপটি শেষ দুটি থেকে একটি পৃথক লেনদেনে হতে পারে। +তবে, ফ্রন্ট-রানিং একটি সমস্যা নয় কারণ যে দুটি ফাংশন `_initiateERC20Deposit` কল করে (`depositERC20` এবং `depositERC20To`) শুধুমাত্র `msg.sender`-কে `_from` প্যারামিটার হিসাবে দিয়ে এই ফাংশনটি কল করে। + +```solidity + // _l2Token.finalizeDeposit(_to, _amount)-এর জন্য ক্যালডাটা তৈরি করুন + bytes memory message = abi.encodeWithSelector( + IL2ERC20Bridge.finalizeDeposit.selector, + _l1Token, + _l2Token, + _from, + _to, + _amount, + _data + ); + + // ক্যালডাটা L2-তে পাঠান + // slither-disable-next-line reentrancy-events, reentrancy-benign + sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); + + // slither-disable-next-line reentrancy-benign + deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] + _amount; +``` + +`deposits` ডেটা স্ট্রাকচারে ডিপোজিট করা টোকেনের পরিমাণ যোগ করুন। +L2-তে একাধিক ঠিকানা থাকতে পারে যা একই L1 ERC-20 টোকেনের সাথে সঙ্গতিপূর্ণ, তাই ডিপোজিট ট্র্যাক করার জন্য ব্রিজের L1 ERC-20 টোকেনের ব্যালেন্স ব্যবহার করা যথেষ্ট নয়। + +```solidity + + // slither-disable-next-line reentrancy-events + emit ERC20DepositInitiated(_l1Token, _l2Token, _from, _to, _amount, _data); + } + + /************************* + * ক্রস-চেইন ফাংশন * + *************************/ + + /** + * @inheritdoc IL1StandardBridge + */ + function finalizeETHWithdrawal( + address _from, + address _to, + uint256 _amount, + bytes calldata _data +``` + +L2 ব্রিজটি L2 ক্রস ডোমেন মেসেঞ্জারে একটি মেসেজ পাঠায় যা L1 ক্রস ডোমেন মেসেঞ্জারকে এই ফাংশনটি কল করতে বাধ্য করে (অবশ্যই L1-এ মেসেজটি চূড়ান্ত করার [লেনদেন](https://community.optimism.io/docs/developers/bridge/messaging/#fees-for-l2-%E2%87%92-l1-transactions) জমা দেওয়ার পরে)। + +```solidity + ) external onlyFromCrossDomainAccount(l2TokenBridge) { +``` + +নিশ্চিত করুন যে এটি একটি _বৈধ_ মেসেজ, যা ক্রস ডোমেন মেসেঞ্জার থেকে আসছে এবং L2 টোকেন ব্রিজ থেকে উদ্ভূত। +এই ফাংশনটি ব্রিজ থেকে ETH উইথড্র করার জন্য ব্যবহৃত হয়, তাই আমাদের নিশ্চিত করতে হবে যে এটি শুধুমাত্র অনুমোদিত কলার দ্বারা কল করা হয়। + +```solidity + // slither-disable-next-line reentrancy-events + (bool success, ) = _to.call{ value: _amount }(new bytes(0)); +``` + +ETH স্থানান্তর করার উপায় হল `msg.value`-এ wei-এর পরিমাণ সহ প্রাপককে কল করা। + +```solidity + require(success, "TransferHelper::safeTransferETH: ETH transfer failed"); + + // slither-disable-next-line reentrancy-events + emit ETHWithdrawalFinalized(_from, _to, _amount, _data); +``` + +উইথড্রয়াল সম্পর্কে একটি ইভেন্ট প্রকাশ করুন। + +```solidity + } + + /** + * @inheritdoc IL1ERC20Bridge + */ + function finalizeERC20Withdrawal( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data + ) external onlyFromCrossDomainAccount(l2TokenBridge) { +``` + +এই ফাংশনটি উপরের `finalizeETHWithdrawal`-এর মতোই, ERC-20 টোকেনের জন্য প্রয়োজনীয় পরিবর্তনসহ। + +```solidity + deposits[_l1Token][_l2Token] = deposits[_l1Token][_l2Token] - _amount; +``` + +`deposits` ডেটা স্ট্রাকচার আপডেট করুন। + +```solidity + + // যখন L1-এ একটি উইথড্রয়াল চূড়ান্ত হয়, তখন L1 ব্রিজটি ফান্ডগুলি উইথড্রয়ারকে স্থানান্তর করে + // slither-disable-next-line reentrancy-events + IERC20(_l1Token).safeTransfer(_to, _amount); + + // slither-disable-next-line reentrancy-events + emit ERC20WithdrawalFinalized(_l1Token, _l2Token, _from, _to, _amount, _data); + } + + + /***************************** + * অস্থায়ী - ETH মাইগ্রেট করা * + *****************************/ + + /** + * @dev অ্যাকাউন্টে ETH ব্যালেন্স যোগ করে। এটি একটি পুরানো গেটওয়ে থেকে একটি নতুন গেটওয়েতে ETH মাইগ্রেট করার অনুমতি দেওয়ার জন্য তৈরি। + * দ্রষ্টব্য: এটি শুধুমাত্র একটি আপগ্রেডের জন্য রাখা হয়েছে যাতে আমরা পুরানো কন্ট্রাক্ট থেকে মাইগ্রেট করা ETH পেতে পারি। + */ + function donateETH() external payable {} +} +``` + +ব্রিজের একটি পূর্ববর্তী বাস্তবায়ন ছিল। +যখন আমরা সেই বাস্তবায়ন থেকে এটিতে স্থানান্তরিত হয়েছিলাম, তখন আমাদের সমস্ত সম্পদ সরাতে হয়েছিল। +ERC-20 টোকেনগুলি শুধু সরানো যেতে পারে। +তবে, একটি কন্ট্রাক্টে ETH স্থানান্তর করতে হলে সেই কন্ট্রাক্টের অনুমোদন প্রয়োজন, যা `donateETH` আমাদের সরবরাহ করে। + +## L2-তে ERC-20 টোকেন {#erc-20-tokens-on-l2} + +একটি ERC-20 টোকেনকে স্ট্যান্ডার্ড ব্রিজে ফিট করার জন্য, এটিকে স্ট্যান্ডার্ড ব্রিজকে, এবং _শুধুমাত্র_ স্ট্যান্ডার্ড ব্রিজকে, টোকেন মিন্ট করার অনুমতি দিতে হবে। +এটি প্রয়োজন কারণ ব্রিজগুলিকে নিশ্চিত করতে হবে যে Optimism-এ প্রচলিত টোকেনের সংখ্যা L1 ব্রিজ কন্ট্রাক্টের ভিতরে লক করা টোকেনের সংখ্যার সমান। +যদি L2-তে খুব বেশি টোকেন থাকে তবে কিছু ব্যবহারকারী তাদের সম্পদ L1-এ ফিরিয়ে আনতে পারবে না। +একটি বিশ্বস্ত ব্রিজের পরিবর্তে, আমরা মূলত [ফ্র্যাকশনাল রিজার্ভ ব্যাংকিং](https://www.investopedia.com/terms/f/fractionalreservebanking.asp) পুনরায় তৈরি করব। +যদি L1-এ খুব বেশি টোকেন থাকে, তবে সেই টোকেনগুলির কিছু ব্রিজ কন্ট্রাক্টের ভিতরে চিরতরে লক হয়ে থাকবে কারণ L2 টোকেন বার্ন না করে সেগুলি প্রকাশ করার কোনো উপায় নেই। + +### IL2StandardERC20 {#il2standarderc20} + +L2-তে প্রতিটি ERC-20 টোকেন যা স্ট্যান্ডার্ড ব্রিজ ব্যবহার করে, তাদের [এই ইন্টারফেসটি](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/IL2StandardERC20.sol) সরবরাহ করতে হবে, যেখানে স্ট্যান্ডার্ড ব্রিজের জন্য প্রয়োজনীয় ফাংশন এবং ইভেন্ট রয়েছে। + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +``` + +[স্ট্যান্ডার্ড ERC-20 ইন্টারফেসে](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol) `mint` এবং `burn` ফাংশন অন্তর্ভুক্ত নেই। +সেই পদ্ধতিগুলি [ERC-20 স্ট্যান্ডার্ড](https://eips.ethereum.org/EIPS/eip-20) দ্বারা প্রয়োজন হয় না, যা টোকেন তৈরি এবং ধ্বংস করার পদ্ধতিগুলি অনির্দিষ্ট রাখে। + +```solidity +import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; +``` + +[ERC-165 ইন্টারফেসটি](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol) একটি কন্ট্রাক্ট কোন ফাংশন সরবরাহ করে তা নির্দিষ্ট করতে ব্যবহৃত হয়। +[আপনি এখানে স্ট্যান্ডার্ডটি পড়তে পারেন](https://eips.ethereum.org/EIPS/eip-165)। + +```solidity +interface IL2StandardERC20 is IERC20, IERC165 { + function l1Token() external returns (address); +``` + +এই ফাংশনটি L1 টোকেনের ঠিকানা সরবরাহ করে যা এই কন্ট্রাক্টে ব্রিজ করা হয়েছে। +উল্লেখ্য যে আমাদের বিপরীত দিকে অনুরূপ কোনো ফাংশন নেই। +আমাদের যেকোনো L1 টোকেন ব্রিজ করতে সক্ষম হতে হবে, তা বাস্তবায়নের সময় L2 সমর্থন পরিকল্পিত ছিল কি না তা নির্বিশেষে। + +```solidity + + function mint(address _to, uint256 _amount) external; + + function burn(address _from, uint256 _amount) external; + + event Mint(address indexed _account, uint256 _amount); + event Burn(address indexed _account, uint256 _amount); +} +``` + +টোকেন মিন্ট (তৈরি) এবং বার্ন (ধ্বংস) করার জন্য ফাংশন এবং ইভেন্ট। +ব্রিজটি একমাত্র সত্তা হওয়া উচিত যা এই ফাংশনগুলি চালাতে পারে যাতে টোকেনের সংখ্যা সঠিক হয় (L1-এ লক করা টোকেনের সংখ্যার সমান)। + +### L2StandardERC20 {#L2StandardERC20} + +[এটি `IL2StandardERC20` ইন্টারফেসের আমাদের বাস্তবায়ন](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/standards/L2StandardERC20.sol)। +যদি না আপনার কোনো ধরনের কাস্টম লজিকের প্রয়োজন হয়, আপনার এটিই ব্যবহার করা উচিত। + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +``` + +[The OpenZeppelin ERC-20 contract](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol)। +Optimism চাকা নতুন করে আবিষ্কারে বিশ্বাস করে না, বিশেষ করে যখন চাকাটি ভালভাবে নিরীক্ষিত এবং সম্পদ রাখার জন্য যথেষ্ট বিশ্বাসযোগ্য হওয়া প্রয়োজন। + +```solidity +import "./IL2StandardERC20.sol"; + +contract L2StandardERC20 is IL2StandardERC20, ERC20 { + address public l1Token; + address public l2Bridge; +``` + +এই দুটি অতিরিক্ত কনফিগারেশন প্যারামিটার যা আমাদের প্রয়োজন এবং যা সাধারণত ERC-20-এ থাকে না। + +```solidity + + /** + * @param _l2Bridge L2 স্ট্যান্ডার্ড ব্রিজের ঠিকানা। + * @param _l1Token সংশ্লিষ্ট L1 টোকেনের ঠিকানা। + * @param _name ERC20 নাম। + * @param _symbol ERC20 প্রতীক। + */ + constructor( + address _l2Bridge, + address _l1Token, + string memory _name, + string memory _symbol + ) ERC20(_name, _symbol) { + l1Token = _l1Token; + l2Bridge = _l2Bridge; + } +``` + +প্রথমে যে কন্ট্রাক্ট থেকে আমরা ইনহেরিট করছি তার কনস্ট্রাক্টর কল করুন (`ERC20(_name, _symbol)`) এবং তারপর আমাদের নিজস্ব ভেরিয়েবল সেট করুন। + +```solidity + + modifier onlyL2Bridge() { + require(msg.sender == l2Bridge, "Only L2 Bridge can mint and burn"); + _; + } + + + // slither-disable-next-line external-function + function supportsInterface(bytes4 _interfaceId) public pure returns (bool) { + bytes4 firstSupportedInterface = bytes4(keccak256("supportsInterface(bytes4)")); // ERC165 + bytes4 secondSupportedInterface = IL2StandardERC20.l1Token.selector ^ + IL2StandardERC20.mint.selector ^ + IL2StandardERC20.burn.selector; + return _interfaceId == firstSupportedInterface || _interfaceId == secondSupportedInterface; + } +``` + +[ERC-165](https://eips.ethereum.org/EIPS/eip-165) এভাবেই কাজ করে। +প্রতিটি ইন্টারফেস হল সমর্থিত ফাংশনের একটি সংখ্যা, এবং এটি সেই ফাংশনগুলির [ABI ফাংশন সিলেক্টরগুলির](https://docs.soliditylang.org/en/v0.8.12/abi-spec.html#function-selector) [এক্সক্লুসিভ অর](https://en.wikipedia.org/wiki/Exclusive_or) হিসাবে চিহ্নিত করা হয়। + +L2 ব্রিজ ERC-165 কে একটি স্যানিটি চেক হিসাবে ব্যবহার করে যাতে নিশ্চিত করা যায় যে যে ERC-20 কন্ট্রাক্টে সম্পদ পাঠাচ্ছে তা একটি `IL2StandardERC20`। + +**দ্রষ্টব্য:** দুর্বৃত্ত কন্ট্রাক্টদের `supportsInterface`-এর মিথ্যা উত্তর দেওয়া থেকে বিরত রাখার জন্য কিছুই নেই, তাই এটি একটি স্যানিটি চেক মেকানিজম, একটি নিরাপত্তা মেকানিজম _নয়_। + +```solidity + // slither-disable-next-line external-function + function mint(address _to, uint256 _amount) public virtual onlyL2Bridge { + _mint(_to, _amount); + + emit Mint(_to, _amount); + } + + // slither-disable-next-line external-function + function burn(address _from, uint256 _amount) public virtual onlyL2Bridge { + _burn(_from, _amount); + + emit Burn(_from, _amount); + } +} +``` + +শুধুমাত্র L2 ব্রিজ সম্পদ মিন্ট এবং বার্ন করার অনুমতিপ্রাপ্ত। + +`_mint` এবং `_burn` আসলে [OpenZeppelin ERC-20 কন্ট্রাক্টে](/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn) সংজ্ঞায়িত। +সেই কন্ট্রাক্ট শুধু সেগুলিকে বাইরে প্রকাশ করে না, কারণ টোকেন মিন্ট এবং বার্ন করার শর্তগুলি ERC-20 ব্যবহারের পদ্ধতির মতোই বৈচিত্র্যময়। + +## L2 ব্রিজ কোড {#l2-bridge-code} + +এটি সেই কোড যা Optimism-এ ব্রিজ চালায়। +[এই কন্ট্রাক্টের সোর্স এখানে রয়েছে](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/L2StandardBridge.sol)। + +```solidity +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +/* ইন্টারফেস ইমপোর্টস */ +import { IL1StandardBridge } from "../../L1/messaging/IL1StandardBridge.sol"; +import { IL1ERC20Bridge } from "../../L1/messaging/IL1ERC20Bridge.sol"; +import { IL2ERC20Bridge } from "./IL2ERC20Bridge.sol"; +``` + +[IL2ERC20Bridge](https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts/contracts/L2/messaging/IL2ERC20Bridge.sol) ইন্টারফেসটি আমরা উপরে দেখা [L1 সমতুল্য](#IL1ERC20Bridge)-এর মতোই। +দুটি উল্লেখযোগ্য পার্থক্য আছে: + +1. L1-এ আপনি ডিপোজিট শুরু করেন এবং উইথড্রয়াল চূড়ান্ত করেন। + এখানে আপনি উইথড্রয়াল শুরু করেন এবং ডিপোজিট চূড়ান্ত করেন। +2. L1-এ ETH এবং ERC-20 টোকেনের মধ্যে পার্থক্য করা প্রয়োজন। + L2-তে আমরা উভয়ের জন্য একই ফাংশন ব্যবহার করতে পারি কারণ অভ্যন্তরীণভাবে Optimism-এ ETH ব্যালেন্সগুলি [0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000](https://explorer.optimism.io/address/0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000) ঠিকানা সহ একটি ERC-20 টোকেন হিসাবে পরিচালিত হয়। + +```solidity +/* লাইব্রেরি ইমপোর্টস */ +import { ERC165Checker } from "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; +import { CrossDomainEnabled } from "../../libraries/bridge/CrossDomainEnabled.sol"; +import { Lib_PredeployAddresses } from "../../libraries/constants/Lib_PredeployAddresses.sol"; + +/* কন্ট্রাক্ট ইমপোর্টস */ +import { IL2StandardERC20 } from "../../standards/IL2StandardERC20.sol"; + +/** + * @title L2StandardBridge + * @dev L2 স্ট্যান্ডার্ড ব্রিজ এমন একটি কন্ট্রাক্ট যা L1 এবং L2-এর মধ্যে ETH এবং ERC20 স্থানান্তর সক্ষম করতে L1 স্ট্যান্ডার্ড ব্রিজের সাথে একসাথে কাজ করে। + * এই কন্ট্রাক্টটি L1 স্ট্যান্ডার্ড ব্রিজে ডিপোজিট সম্পর্কে শোনার সময় নতুন টোকেনের জন্য একটি মিন্টার হিসাবে কাজ করে। + * এই কন্ট্রাক্টটি উইথড্রয়ালের উদ্দেশ্যে থাকা টোকেনগুলির জন্য একটি বার্নার হিসাবেও কাজ করে, যা L1 ব্রিজকে L1 ফান্ড প্রকাশ করার জন্য জানায়। + */ +contract L2StandardBridge is IL2ERC20Bridge, CrossDomainEnabled { + /******************************** + * এক্সটার্নাল কন্ট্রাক্ট রেফারেন্স * + ********************************/ + + address public l1TokenBridge; +``` + +L1 ব্রিজের ঠিকানা ট্র্যাক রাখুন। +উল্লেখ্য যে L1 সমতুল্যের বিপরীতে, এখানে আমাদের _প্রয়োজন_ এই ভেরিয়েবলটি। +L1 ব্রিজের ঠিকানা আগে থেকে জানা যায় না। + +```solidity + + /*************** + * কনস্ট্রাক্টর * + ***************/ + + /** + * @param _l2CrossDomainMessenger এই কন্ট্রাক্ট দ্বারা ব্যবহৃত ক্রস-ডোমেন মেসেঞ্জার। + * @param _l1TokenBridge মূল চেইনে ডিপ্লয় করা L1 ব্রিজের ঠিকানা। + */ + constructor(address _l2CrossDomainMessenger, address _l1TokenBridge) + CrossDomainEnabled(_l2CrossDomainMessenger) + { + l1TokenBridge = _l1TokenBridge; + } + + /*************** + * উইথড্র করা * + ***************/ + + /** + * @inheritdoc IL2ERC20Bridge + */ + function withdraw( + address _l2Token, + uint256 _amount, + uint32 _l1Gas, + bytes calldata _data + ) external virtual { + _initiateWithdrawal(_l2Token, msg.sender, msg.sender, _amount, _l1Gas, _data); + } + + /** + * @inheritdoc IL2ERC20Bridge + */ + function withdrawTo( + address _l2Token, + address _to, + uint256 _amount, + uint32 _l1Gas, + bytes calldata _data + ) external virtual { + _initiateWithdrawal(_l2Token, msg.sender, _to, _amount, _l1Gas, _data); + } +``` + +এই দুটি ফাংশন উইথড্রয়াল শুরু করে। +উল্লেখ্য যে L1 টোকেন ঠিকানা নির্দিষ্ট করার প্রয়োজন নেই। +L2 টোকেনগুলি আমাদের L1 সমতুল্যের ঠিকানা জানাবে বলে আশা করা হয়। + +```solidity + + /** + * @dev টোকেন বার্ন করে এবং উইথড্রয়ালের বিষয়ে L1 টোকেন গেটওয়েকে জানিয়ে উইথড্রয়ালের জন্য যুক্তি সম্পাদন করে। + * @param _l2Token L2 টোকেনের ঠিকানা যেখানে উইথড্রয়াল শুরু হয়েছে। + * @param _from L2-তে যে অ্যাকাউন্ট থেকে উইথড্রয়াল টানা হবে। + * @param _to L1-তে যে অ্যাকাউন্টে উইথড্রয়াল দেওয়া হবে। + * @param _amount উইথড্র করার জন্য টোকেনের পরিমাণ। + * @param _l1Gas অব্যবহৃত, তবে ভবিষ্যতের সামঞ্জস্যতার বিবেচনার জন্য অন্তর্ভুক্ত। + * @param _data L1-এ ফরোয়ার্ড করার জন্য ঐচ্ছিক ডেটা। এই ডেটা শুধুমাত্র বাহ্যিক কন্ট্রাক্টগুলির সুবিধার জন্য সরবরাহ করা হয়। সর্বোচ্চ দৈর্ঘ্য প্রয়োগ করা ছাড়া, এই চুক্তিগুলি এর বিষয়বস্তু সম্পর্কে কোনো গ্যারান্টি দেয় না। + */ + function _initiateWithdrawal( + address _l2Token, + address _from, + address _to, + uint256 _amount, + uint32 _l1Gas, + bytes calldata _data + ) internal { + // যখন একটি উইথড্রয়াল শুরু হয়, তখন আমরা পরবর্তী L2 ব্যবহার রোধ করতে উইথড্রয়ারের ফান্ড বার্ন করি। + // slither-disable-next-line reentrancy-events + IL2StandardERC20(_l2Token).burn(msg.sender, _amount); +``` + +লক্ষ্য করুন যে আমরা `_from` প্যারামিটারের উপর নির্ভর করছি না, বরং `msg.sender`-এর উপর নির্ভর করছি যা জাল করা অনেক কঠিন (যতদূর আমি জানি, অসম্ভব)। + +```solidity + + // l1TokenBridge.finalizeERC20Withdrawal(_to, _amount)-এর জন্য ক্যালডাটা তৈরি করুন + // slither-disable-next-line reentrancy-events + address l1Token = IL2StandardERC20(_l2Token).l1Token(); + bytes memory message; + + if (_l2Token == Lib_PredeployAddresses.OVM_ETH) { +``` + +L1-এ ETH এবং ERC-20-এর মধ্যে পার্থক্য করা প্রয়োজন। + +```solidity + message = abi.encodeWithSelector( + IL1StandardBridge.finalizeETHWithdrawal.selector, + _from, + _to, + _amount, + _data + ); + } else { + message = abi.encodeWithSelector( + IL1ERC20Bridge.finalizeERC20Withdrawal.selector, + l1Token, + _l2Token, + _from, + _to, + _amount, + _data + ); + } + + // L1 ব্রিজে মেসেজ পাঠান + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l1TokenBridge, _l1Gas, message); + + // slither-disable-next-line reentrancy-events + emit WithdrawalInitiated(l1Token, _l2Token, msg.sender, _to, _amount, _data); + } + + /************************************ + * ক্রস-চেইন ফাংশন: ডিপোজিট করা * + ************************************/ + + /** + * @inheritdoc IL2ERC20Bridge + */ + function finalizeDeposit( + address _l1Token, + address _l2Token, + address _from, + address _to, + uint256 _amount, + bytes calldata _data +``` + +এই ফাংশনটি `L1StandardBridge` দ্বারা কল করা হয়। + +```solidity + ) external virtual onlyFromCrossDomainAccount(l1TokenBridge) { +``` + +মেসেজের উৎসটি বৈধ কিনা তা নিশ্চিত করুন। +এটি গুরুত্বপূর্ণ কারণ এই ফাংশনটি `_mint` কল করে এবং ব্রিজের L1-এ থাকা টোকেন দ্বারা আবৃত নয় এমন টোকেন দেওয়ার জন্য ব্যবহার করা যেতে পারে। + +```solidity + // লক্ষ্য টোকেনটি অনুবর্তী কিনা তা পরীক্ষা করুন এবং + // এখানে L1-এ ডিপোজিট করা টোকেন L2 ডিপোজিটেড টোকেন প্রতিনিধিত্বের সাথে মিলে কিনা তা যাচাই করুন + if ( + // slither-disable-next-line reentrancy-events + ERC165Checker.supportsInterface(_l2Token, 0x1d1d8b63) && + _l1Token == IL2StandardERC20(_l2Token).l1Token() +``` + +স্যানিটি চেক: + +1. সঠিক ইন্টারফেস সমর্থিত +2. L2 ERC-20 কন্ট্রাক্টের L1 ঠিকানা টোকেনগুলির L1 উৎসের সাথে মিলে যায় + +```solidity + ) { + // যখন একটি ডিপোজিট চূড়ান্ত হয়, তখন আমরা L2-তে অ্যাকাউন্টটিকে একই পরিমাণ টোকেন দিয়ে ক্রেডিট করি। + // slither-disable-next-line reentrancy-events + IL2StandardERC20(_l2Token).mint(_to, _amount); + // slither-disable-next-line reentrancy-events + emit DepositFinalized(_l1Token, _l2Token, _from, _to, _amount, _data); +``` + +যদি স্যানিটি চেক পাস হয়, তাহলে ডিপোজিট চূড়ান্ত করুন: + +1. টোকেন মিন্ট করুন +2. উপযুক্ত ইভেন্ট প্রকাশ করুন + +```solidity + } else { + // হয় যে L2 টোকেনটি ডিপোজিট করা হচ্ছে তা তার L1 টোকেনের সঠিক ঠিকানা সম্পর্কে দ্বিমত পোষণ করে, অথবা সঠিক ইন্টারফেস সমর্থন করে না। + // এটি শুধুমাত্র তখনই ঘটা উচিত যদি একটি ক্ষতিকারক L2 টোকেন থাকে, বা যদি কোনো ব্যবহারকারী কোনোভাবে ডিপোজিট করার জন্য ভুল L2 টোকেন ঠিকানা নির্দিষ্ট করে। + // উভয় ক্ষেত্রেই, আমরা এখানে প্রক্রিয়াটি বন্ধ করি এবং একটি উইথড্রয়াল মেসেজ তৈরি করি যাতে ব্যবহারকারীরা কিছু ক্ষেত্রে তাদের ফান্ড বের করতে পারে। + // ক্ষতিকারক টোকেন কন্ট্রাক্টগুলি পুরোপুরি প্রতিরোধ করার কোনো উপায় নেই, তবে এটি ব্যবহারকারীর ত্রুটি সীমাবদ্ধ করে এবং কিছু ধরনের ক্ষতিকারক কন্ট্রাক্ট আচরণ প্রশমিত করে। +``` + +যদি কোনো ব্যবহারকারী ভুল L2 টোকেন ঠিকানা ব্যবহার করে একটি সনাক্তযোগ্য ত্রুটি করে, তাহলে আমরা ডিপোজিট বাতিল করতে এবং L1-এ টোকেনগুলি ফিরিয়ে দিতে চাই। +L2 থেকে এটি করার একমাত্র উপায় হল একটি মেসেজ পাঠানো যা ফল্ট চ্যালেঞ্জ পিরিয়ডের জন্য অপেক্ষা করতে হবে, তবে এটি ব্যবহারকারীর জন্য টোকেন স্থায়ীভাবে হারানোর চেয়ে অনেক ভালো। + +```solidity + bytes memory message = abi.encodeWithSelector( + IL1ERC20Bridge.finalizeERC20Withdrawal.selector, + _l1Token, + _l2Token, + _to, // এখানে ডিপোজিটটি প্রেরকের কাছে ফেরত পাঠানোর জন্য _to এবং _from পরিবর্তন করা হয়েছে + _from, + _amount, + _data + ); + + // L1 ব্রিজে মেসেজ পাঠান + // slither-disable-next-line reentrancy-events + sendCrossDomainMessage(l1TokenBridge, 0, message); + // slither-disable-next-line reentrancy-events + emit DepositFailed(_l1Token, _l2Token, _from, _to, _amount, _data); + } + } +} +``` + +## উপসংহার {#conclusion} + +স্ট্যান্ডার্ড ব্রিজ সম্পদ স্থানান্তরের জন্য সবচেয়ে নমনীয় প্রক্রিয়া। +তবে, এটি এত জেনেরিক হওয়ায় এটি সবসময় ব্যবহারের জন্য সবচেয়ে সহজ প্রক্রিয়া নয়। +বিশেষ করে উইথড্রয়ালের জন্য, বেশিরভাগ ব্যবহারকারী [তৃতীয় পক্ষের ব্রিজ](https://optimism.io/apps#bridge) ব্যবহার করতে পছন্দ করেন যা চ্যালেঞ্জ পিরিয়ডের জন্য অপেক্ষা করে না এবং উইথড্রয়াল চূড়ান্ত করার জন্য একটি মার্কল প্রুফের প্রয়োজন হয় না। + +এই ব্রিজগুলি সাধারণত L1-এ সম্পদ রাখার মাধ্যমে কাজ করে, যা তারা একটি ছোট ফি-এর বিনিময়ে অবিলম্বে সরবরাহ করে (প্রায়শই একটি স্ট্যান্ডার্ড ব্রিজ উইথড্রয়ালের জন্য গ্যাস খরচের চেয়ে কম)। +যখন ব্রিজ (বা এটি পরিচালনাকারী ব্যক্তিরা) L1 সম্পদে ঘাটতির আশঙ্কা করে তখন তারা L2 থেকে পর্যাপ্ত সম্পদ স্থানান্তর করে। যেহেতু এগুলি খুব বড় উইথড্রয়াল, তাই উইথড্রয়াল খরচ একটি বড় পরিমাণের উপর ভাগ হয়ে যায় এবং এটি একটি অনেক ছোট শতাংশ। + +আশা করি এই নিবন্ধটি আপনাকে লেয়ার 2 কীভাবে কাজ করে এবং কীভাবে পরিষ্কার এবং সুরক্ষিত Solidity কোড লিখতে হয় সে সম্পর্কে আরও বুঝতে সাহায্য করেছে। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। diff --git a/public/content/translations/bn/developers/tutorials/reverse-engineering-a-contract/index.md b/public/content/translations/bn/developers/tutorials/reverse-engineering-a-contract/index.md new file mode 100644 index 00000000000..d0d4ca12c81 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/reverse-engineering-a-contract/index.md @@ -0,0 +1,744 @@ +--- +title: "একটি চুক্তির রিভার্স ইঞ্জিনিয়ারিং" +description: "আপনার কাছে সোর্স কোড না থাকলে কীভাবে একটি চুক্তি বুঝবেন" +author: Ori Pomerantz +lang: bn +tags: [ "evm", "অপকোডস" ] +skill: advanced +published: 2021-12-30 +--- + +## ভূমিকা {#introduction} + +_ব্লকচেইনে কোনো গোপনীয়তা নেই_, যা কিছু ঘটে তা সামঞ্জস্যপূর্ণ, যাচাইযোগ্য এবং সর্বজনীনভাবে উপলব্ধ। বিশেষত, [চুক্তিগুলির সোর্স কোড Etherscan-এ প্রকাশিত এবং যাচাই করা উচিত](https://etherscan.io/address/0xb8901acb165ed027e32754e0ffe830802919727f#code)। তবে, [সব সময় এমনটা হয় না](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#code)। এই নিবন্ধে আপনি সোর্স কোড ছাড়াই একটি চুক্তির দিকে তাকিয়ে কীভাবে চুক্তিগুলি বিপরীত প্রকৌশলী করতে হয় তা শিখবেন, [`0x2510c039cc3b061d79e564b38836da87e31b342f`](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f)। + +রিভার্স কম্পাইলার আছে, কিন্তু তারা সবসময় [ব্যবহারযোগ্য ফলাফল](https://etherscan.io/bytecode-decompiler?a=0x2510c039cc3b061d79e564b38836da87e31b342f) তৈরি করে না। এই নিবন্ধে আপনি কীভাবে ম্যানুয়ালি রিভার্স ইঞ্জিনিয়ারিং করতে হয় এবং [অপকোড](https://github.com/wolflo/evm-opcodes) থেকে একটি চুক্তি বুঝতে হয়, সেইসাথে একটি ডিকম্পাইলারের ফলাফল কীভাবে ব্যাখ্যা করতে হয় তা শিখবেন। + +এই নিবন্ধটি বোঝার জন্য আপনার আগে থেকেই EVM-এর মূল বিষয়গুলি জানা উচিত এবং EVM অ্যাসেম্বলারের সাথে কিছুটা পরিচিত হওয়া উচিত। [আপনি এখানে এই বিষয়গুলি সম্পর্কে পড়তে পারেন](https://medium.com/mycrypto/the-ethereum-virtual-machine-how-does-it-work-9abac2b7c9e)। + +## এক্সিকিউটেবল কোড প্রস্তুত করুন {#prepare-the-executable-code} + +আপনি চুক্তির জন্য Etherscan-এ গিয়ে, **চুক্তি** ট্যাবে ক্লিক করে এবং তারপর **অপকোড ভিউতে স্যুইচ করুন** ক্লিক করে অপকোডগুলি পেতে পারেন। আপনি একটি ভিউ পাবেন যা প্রতি লাইনে একটি অপকোড। + +![Etherscan থেকে অপকোড ভিউ](opcode-view.png) + +জাম্প বুঝতে সক্ষম হওয়ার জন্য, তবে, আপনাকে জানতে হবে কোডের মধ্যে প্রতিটি অপকোড কোথায় অবস্থিত। এটি করার জন্য, একটি উপায় হল একটি Google স্প্রেডশীট খোলা এবং কলাম C-তে অপকোডগুলি পেস্ট করা। [আপনি এই ইতিমধ্যে প্রস্তুত করা স্প্রেডশীটের একটি অনুলিপি তৈরি করে নিম্নলিখিত ধাপগুলি এড়িয়ে যেতে পারেন](https://docs.google.com/spreadsheets/d/1tKmTJiNjUwHbW64wCKOSJxHjmh0bAUapt6btUYE7kDA/edit?usp=sharing)। + +পরবর্তী ধাপ হল সঠিক কোড অবস্থানগুলি পাওয়া যাতে আমরা জাম্প বুঝতে সক্ষম হব। আমরা কলাম B-তে অপকোডের আকার এবং কলাম A-তে অবস্থান (হেক্সাডেসিমেলে) রাখব। সেল `B1`-এ এই ফাংশনটি টাইপ করুন এবং তারপরে কোডের শেষ পর্যন্ত কলাম B-এর বাকি অংশের জন্য এটি কপি এবং পেস্ট করুন। আপনি এটি করার পরে আপনি কলাম B লুকাতে পারেন। + +``` +=1+IF(REGEXMATCH(C1,"PUSH"),REGEXEXTRACT(C1,"PUSH(\d+)"),0) +``` + +প্রথমে এই ফাংশনটি অপকোডের জন্য এক বাইট যোগ করে, এবং তারপর `PUSH`-এর জন্য সন্ধান করে। পুশ অপকোডগুলি বিশেষ কারণ তাদের পুশ করা মানের জন্য অতিরিক্ত বাইটের প্রয়োজন। যদি অপকোডটি একটি `PUSH` হয়, আমরা বাইটের সংখ্যা বের করে এবং তা যোগ করি। + +`A1`-এ প্রথম অফসেট, শূন্য রাখুন। তারপর, `A2`-এ, এই ফাংশনটি রাখুন এবং আবার কলাম A-এর বাকি অংশের জন্য এটি কপি এবং পেস্ট করুন: + +``` +=dec2hex(hex2dec(A1)+B1) +``` + +আমাদের এই ফাংশনটি হেক্সাডেসিমেল মান দেওয়ার জন্য প্রয়োজন কারণ জাম্প (`JUMP` এবং `JUMPI`) এর আগে যে মানগুলি পুশ করা হয় তা আমাদের হেক্সাডেসিমেলে দেওয়া হয়। + +## এন্ট্রি পয়েন্ট (0x00) {#the-entry-point-0x00} + +চুক্তি সবসময় প্রথম বাইট থেকে কার্যকর করা হয়। এটি কোডের প্রাথমিক অংশ: + +| অফসেট | অপকোড | স্ট্যাক (অপকোডের পরে) | +| ----: | ------------ | -------------------------------------------- | +| 0 | PUSH1 0x80 | 0x80 | +| 2 | PUSH1 0x40 | 0x40, 0x80 | +| 4 | MSTORE | খালি | +| 5 | PUSH1 0x04 | 0x04 | +| 7 | CALLDATASIZE | CALLDATASIZE 0x04 | +| 8 | LT | CALLDATASIZE<4 | +| 9 | PUSH2 0x005e | 0x5E CALLDATASIZE<4 | +| C | JUMPI | খালি | + +এই কোডটি দুটি কাজ করে: + +1. মেমরি অবস্থান 0x40-0x5F-এ 32 বাইট মান হিসাবে 0x80 লিখুন (0x80 0x5F-এ সংরক্ষিত হয়, এবং 0x40-0x5E সবই শূন্য)। +2. কলডেটা আকার পড়ুন। সাধারণত একটি Ethereum চুক্তির জন্য কল ডেটা [ABI (অ্যাপ্লিকেশন বাইনারি ইন্টারফেস)](https://docs.soliditylang.org/en/v0.8.10/abi-spec.html) অনুসরণ করে, যার জন্য ফাংশন নির্বাচকের জন্য ন্যূনতম চার বাইটের প্রয়োজন হয়। কল ডেটার আকার চারের কম হলে, 0x5E-এ যান। + +![এই অংশের জন্য ফ্লোচার্ট](flowchart-entry.png) + +### 0x5E-তে হ্যান্ডলার (নন-ABI কল ডেটার জন্য) {#the-handler-at-0x5e-for-non-abi-call-data} + +| অফসেট | অপকোড | +| ----: | ------------ | +| 5E | JUMPDEST | +| 5F | CALLDATASIZE | +| 60 | PUSH2 0x007c | +| 63 | JUMPI | + +এই স্নিপেটটি একটি `JUMPDEST` দিয়ে শুরু হয়। EVM (ইথিরিয়াম ভার্চুয়াল মেশিন) প্রোগ্রাম একটি ব্যতিক্রম ছুড়ে দেয় যদি আপনি এমন একটি অপকোডে লাফ দেন যা `JUMPDEST` নয়। তারপর এটি CALLDATASIZE-এর দিকে তাকায়, এবং যদি এটি "সত্য" হয় (অর্থাৎ, শূন্য নয়) 0x7C-তে চলে যায়। আমরা নিচে সেই ব্যাপারে আসব। + +| অফসেট | অপকোড | স্ট্যাক (অপকোডের পরে) | +| ----: | ---------- | ----------------------------------------------------------------------------------------- | +| 64 | CALLVALUE | কল দ্বারা প্রদত্ত [Wei](/glossary/#wei)। Solidity-তে `msg.value` বলা হয়। | +| 65 | PUSH1 0x06 | 6 CALLVALUE | +| 67 | PUSH1 0x00 | 0 6 CALLVALUE | +| 69 | DUP3 | CALLVALUE 0 6 CALLVALUE | +| 6A | DUP3 | 6 CALLVALUE 0 6 CALLVALUE | +| 6B | SLOAD | সংগ্রহস্থল[6] CALLVALUE 0 6 CALLVALUE | + +সুতরাং যখন কোন কল ডেটা থাকে না তখন আমরা Storage[6] এর মান পড়ি। আমরা এখনও জানি না এই মানটি কী, কিন্তু আমরা এমন লেনদেনগুলি দেখতে পারি যা চুক্তিটি কোনও কল ডেটা ছাড়াই পেয়েছে। যে লেনদেনগুলি শুধুমাত্র কোনও কল ডেটা ছাড়াই ETH স্থানান্তর করে (এবং তাই কোনও পদ্ধতি নেই) Etherscan-এ `Transfer` পদ্ধতি রয়েছে। প্রকৃতপক্ষে, [চুক্তিটি প্রাপ্ত প্রথম লেনদেন](https://etherscan.io/tx/0xeec75287a583c36bcc7ca87685ab41603494516a0f5986d18de96c8e630762e7) একটি স্থানান্তর। + +আমরা যদি সেই লেনদেনটি দেখি এবং **আরও দেখতে ক্লিক করুন** ক্লিক করি, আমরা দেখতে পাই যে কল ডেটা, যাকে ইনপুট ডেটা বলা হয়, তা সত্যিই খালি (`0x`)। এও লক্ষ্য করুন যে মানটি 1.559 ETH, যা পরে প্রাসঙ্গিক হবে। + +![কল ডেটা খালি](calldata-empty.png) + +এরপরে, **অবস্থা** ট্যাবে ক্লিক করুন এবং আমরা যে চুক্তিটি বিপরীত প্রকৌশলী করছি তা প্রসারিত করুন (0x2510...)। আপনি দেখতে পারেন যে লেনদেনের সময় `Storage[6]` পরিবর্তিত হয়েছে, এবং আপনি যদি হেক্সকে **সংখ্যা**-তে পরিবর্তন করেন, আপনি দেখতে পাবেন এটি 1,559,000,000,000,000,000 হয়ে গেছে, wei-তে স্থানান্তরিত মান (আমি স্পষ্টতার জন্য কমা যোগ করেছি), যা পরবর্তী চুক্তির মানের সাথে সঙ্গতিপূর্ণ। + +![Storage[6]-এর পরিবর্তন](storage6.png) + +যদি আমরা [একই সময়কালের অন্যান্য `Transfer` লেনদেনের](https://etherscan.io/tx/0xf708d306de39c422472f43cb975d97b66fd5d6a6863db627067167cbf93d84d1#statechange) দ্বারা সৃষ্ট অবস্থার পরিবর্তনগুলি দেখি, আমরা দেখতে পাই যে `Storage[6]` কিছু সময়ের জন্য চুক্তির মান ট্র্যাক করেছে। আপাতত আমরা এটিকে `Value*` বলব। তারকাচিহ্ন (`*`) আমাদের মনে করিয়ে দেয় যে আমরা এখনও _জানি_ না এই ভেরিয়েবলটি কী করে, কিন্তু এটি শুধুমাত্র চুক্তির মান ট্র্যাক করার জন্য হতে পারে না কারণ স্টোরেজ ব্যবহার করার কোন প্রয়োজন নেই, যা খুব ব্যয়বহুল, যখন আপনি `ADDRESS BALANCE` ব্যবহার করে আপনার অ্যাকাউন্টের ব্যালেন্স পেতে পারেন। প্রথম অপকোডটি চুক্তির নিজস্ব ঠিকানা পুশ করে। দ্বিতীয়টি স্ট্যাকের শীর্ষে থাকা ঠিকানাটি পড়ে এবং সেই ঠিকানার ব্যালেন্স দিয়ে এটি প্রতিস্থাপন করে। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | ------------------------------------------- | +| 6C | PUSH2 0x0075 | 0x75 Value\* CALLVALUE 0 6 CALLVALUE | +| 6F | SWAP2 | CALLVALUE Value\* 0x75 0 6 CALLVALUE | +| 70 | SWAP1 | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 71 | PUSH2 0x01a7 | 0x01A7 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 74 | JUMP | | + +আমরা জাম্প ডেস্টিনেশনে এই কোডটি ট্রেস করতে থাকব। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------- | ----------------------------------------------------------- | +| 1A7 | JUMPDEST | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1A8 | PUSH1 0x00 | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AA | DUP3 | CALLVALUE 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AB | NOT | 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | + +`NOT` বিটওয়াইজ, তাই এটি কল মানের প্রতিটি বিটের মান বিপরীত করে। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | ---------------------------------------------------------------------------------------------------- | +| 1AC | DUP3 | Value\* 2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AD | GT | Value\*>2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AE | ISZERO | Value\*<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1AF | PUSH2 0x01df | 0x01DF Value\*<=2^256-CALLVALUE-1 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1B2 | JUMPI | | + +আমরা লাফ দিই যদি `Value*` 2^256-CALLVALUE-1 এর থেকে ছোট বা এর সমান হয়। এটি ওভারফ্লো প্রতিরোধের জন্য যুক্তি বলে মনে হচ্ছে। এবং প্রকৃতপক্ষে, আমরা দেখতে পাই যে কয়েকটি অর্থহীন ক্রিয়াকলাপের পরে (উদাহরণস্বরূপ, মেমরিতে লেখা মুছে ফেলা হবে) অফসেট 0x01DE-তে চুক্তিটি বিপরীত হয় যদি ওভারফ্লো সনাক্ত করা হয়, যা স্বাভাবিক আচরণ। + +লক্ষ্য করুন যে এই ধরনের একটি ওভারফ্লো অত্যন্ত অসম্ভাব্য, কারণ এটির জন্য কল মান এবং `Value*` এর যোগফল 2^256 wei-এর সাথে তুলনীয় হতে হবে, যা প্রায় 10^59 ETH। [লেখার সময়, মোট ETH সরবরাহ দুইশ মিলিয়নেরও কম](https://etherscan.io/stat/supply)। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | -------- | ----------------------------------------- | +| 1DF | JUMPDEST | 0x00 Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E0 | POP | Value\* CALLVALUE 0x75 0 6 CALLVALUE | +| 1E1 | ADD | Value\*+CALLVALUE 0x75 0 6 CALLVALUE | +| 1E2 | SWAP1 | 0x75 Value\*+CALLVALUE 0 6 CALLVALUE | +| 1E3 | JUMP | | + +আমরা যদি এখানে আসি, তাহলে `Value* + CALLVALUE` নিন এবং অফসেট 0x75-এ যান। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | -------- | ------------------------------- | +| 75 | JUMPDEST | Value\*+CALLVALUE 0 6 CALLVALUE | +| 76 | SWAP1 | 0 Value\*+CALLVALUE 6 CALLVALUE | +| 77 | SWAP2 | 6 Value\*+CALLVALUE 0 CALLVALUE | +| 78 | SSTORE | 0 CALLVALUE | + +যদি আমরা এখানে আসি (যার জন্য কল ডেটা খালি হতে হবে) আমরা `Value*`-এর সাথে কল মান যোগ করি। এটি `Transfer` লেনদেনগুলি যা করে তার সাথে সামঞ্জস্যপূর্ণ। + +| অফসেট | অপকোড | +| ----: | ----- | +| 79 | POP | +| 7A | POP | +| 7B | STOP | + +অবশেষে, স্ট্যাকটি পরিষ্কার করুন (যা প্রয়োজনীয় নয়) এবং লেনদেনের সফল সমাপ্তির সংকেত দিন। + +সবকিছু সংক্ষেপে বলতে গেলে, এখানে প্রাথমিক কোডের জন্য একটি ফ্লোচার্ট রয়েছে। + +![এন্ট্রি পয়েন্ট ফ্লোচার্ট](flowchart-entry.png) + +## 0x7C-তে হ্যান্ডলার {#the-handler-at-0x7c} + +আমি ইচ্ছাকৃতভাবে শিরোনামে রাখিনি যে এই হ্যান্ডলারটি কী করে। মূল বিষয় হল আপনাকে এই নির্দিষ্ট চুক্তিটি কীভাবে কাজ করে তা শেখানো নয়, বরং কীভাবে চুক্তিগুলির রিভার্স ইঞ্জিনিয়ারিং করতে হয় তা শেখানো। আপনি কোড অনুসরণ করে শিখবেন এটি কী করে, ঠিক যেমন আমি শিখেছি। + +আমরা এখানে বেশ কয়েকটি জায়গা থেকে আসি: + +- যদি 1, 2, বা 3 বাইটের কল ডেটা থাকে (অফসেট 0x63 থেকে) +- যদি পদ্ধতির স্বাক্ষর অজানা থাকে (অফসেট 0x42 এবং 0x5D থেকে) + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | --------------------------------------------------------------------------- | +| 7C | JUMPDEST | | +| 7D | PUSH1 0x00 | 0x00 | +| 7F | PUSH2 0x009d | 0x9D 0x00 | +| 82 | PUSH1 0x03 | 0x03 0x9D 0x00 | +| 84 | SLOAD | সংগ্রহস্থল[3] 0x9D 0x00 | + +এটি আরেকটি স্টোরেজ সেল, যা আমি কোনও লেনদেনে খুঁজে পাইনি তাই এর অর্থ কী তা জানা কঠিন। নীচের কোডটি এটিকে আরও স্পষ্ট করবে। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 85 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xff....ff সংগ্রহস্থল[3] 0x9D 0x00 | +| 9A | AND | সংগ্রহস্থল[3]-ঠিকানা-হিসাবে 0x9D 0x00 | + +এই অপকোডগুলি আমরা Storage[3] থেকে পড়া মানটিকে 160 বিটে ছোট করে দেয়, যা একটি Ethereum ঠিকানার দৈর্ঘ্য। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ----- | ----------------------------------------------------------------------------------------- | +| 9B | SWAP1 | 0x9D সংগ্রহস্থল[3]-ঠিকানা-হিসাবে 0x00 | +| 9C | JUMP | সংগ্রহস্থল[3]-ঠিকানা-হিসাবে 0x00 | + +এই জাম্পটি অপ্রয়োজনীয়, কারণ আমরা পরবর্তী অপকোডে যাচ্ছি। এই কোডটি যতটা গ্যাস-দক্ষ হতে পারত ততটা নয়। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------- | +| 9D | JUMPDEST | সংগ্রহস্থল[3]-ঠিকানা-হিসাবে 0x00 | +| 9E | SWAP1 | 0x00 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| 9F | POP | সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| A0 | PUSH1 0x40 | 0x40 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| A2 | MLOAD | Mem[0x40] সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | + +কোডের একেবারে শুরুতে আমরা Mem[0x40] কে 0x80 তে সেট করি। যদি আমরা পরে 0x40 খুঁজি, আমরা দেখতে পাই যে আমরা এটি পরিবর্তন করি না - তাই আমরা ধরে নিতে পারি এটি 0x80। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | ----------------------------------------------------------------------------------------------------------- | +| A3 | CALLDATASIZE | CALLDATASIZE 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| A4 | PUSH1 0x00 | 0x00 CALLDATASIZE 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| A6 | DUP3 | 0x80 0x00 CALLDATASIZE 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| A7 | CALLDATACOPY | 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | + +সমস্ত কল ডেটা মেমরিতে অনুলিপি করুন, 0x80 থেকে শুরু করে। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| A8 | PUSH1 0x00 | 0x00 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| AA | DUP1 | 0x00 0x00 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| AB | CALLDATASIZE | CALLDATASIZE 0x00 0x00 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| AC | DUP4 | 0x80 CALLDATASIZE 0x00 0x00 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| AD | DUP6 | সংগ্রহস্থল[3]-ঠিকানা-হিসাবে 0x80 CALLDATASIZE 0x00 0x00 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| AE | GAS | GAS সংগ্রহস্থল[3]-ঠিকানা-হিসাবে 0x80 CALLDATASIZE 0x00 0x00 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| AF | DELEGATE_CALL | | + +এখন জিনিসগুলি অনেক পরিষ্কার। এই চুক্তিটি একটি [প্রক্সি](https://blog.openzeppelin.com/proxy-patterns/) হিসাবে কাজ করতে পারে, আসল কাজটি করার জন্য Storage[3]-এর ঠিকানায় কল করে। `DELEGATE_CALL` একটি পৃথক চুক্তিকে কল করে, কিন্তু একই স্টোরেজে থাকে। এর মানে হল যে অর্পিত চুক্তি, যার জন্য আমরা একটি প্রক্সি, একই স্টোরেজ স্পেস অ্যাক্সেস করে। কলের জন্য প্যারামিটারগুলি হল: + +- _গ্যাস_: বাকি সব গ্যাস +- _কল করা ঠিকানা_: সংগ্রহস্থল[3]-ঠিকানা-হিসাবে +- _কল ডেটা_: CALLDATASIZE বাইট 0x80 থেকে শুরু, যেখানে আমরা আসল কল ডেটা রাখি। +- _রিটার্ন ডেটা_: কোনোটিই নয় (0x00 - 0x00) আমরা অন্য উপায়ে রিটার্ন ডেটা পাব (নীচে দেখুন) + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| B0 | RETURNDATASIZE | RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| B1 | DUP1 | RETURNDATASIZE RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| B2 | PUSH1 0x00 | 0x00 RETURNDATASIZE RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| B4 | DUP5 | 0x80 0x00 RETURNDATASIZE RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| B5 | RETURNDATACOPY | RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | + +এখানে আমরা 0x80 থেকে শুরু করে মেমরি বাফারে সমস্ত রিটার্ন ডেটা কপি করি। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| B6 | DUP2 | (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| B7 | DUP1 | (((কল সফলতা/ব্যর্থতা))) (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| B8 | ISZERO | (((কলটি কি ব্যর্থ হয়েছিল))) (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| B9 | PUSH2 0x00c0 | 0xC0 (((কলটি কি ব্যর্থ হয়েছিল))) (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| BC | JUMPI | (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| BD | DUP2 | RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| BE | DUP5 | 0x80 RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| BF | RETURN | | + +সুতরাং কলের পরে আমরা রিটার্ন ডেটা বাফার 0x80 - 0x80+RETURNDATASIZE-এ অনুলিপি করি, এবং যদি কল সফল হয় তবে আমরা ঠিক সেই বাফার দিয়ে `RETURN` করি। + +### DELEGATECALL ব্যর্থ হয়েছে {#delegatecall-failed} + +আমরা যদি এখানে 0xC0-তে পৌঁছাই, তার মানে আমরা যে চুক্তিটি কল করেছি তা উল্টে গেছে। যেহেতু আমরা সেই চুক্তির জন্য শুধুমাত্র একটি প্রক্সি, তাই আমরা একই ডেটা ফেরত দিতে এবং রিভার্ট করতে চাই। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| C0 | JUMPDEST | (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| C1 | DUP2 | RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| C2 | DUP5 | 0x80 RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) RETURNDATASIZE (((কল সফলতা/ব্যর্থতা))) 0x80 সংগ্রহস্থল[3]-ঠিকানা-হিসাবে | +| C3 | REVERT | | + +সুতরাং আমরা আগে `RETURN`-এর জন্য যে বাফার ব্যবহার করেছি তার সাথে `REVERT` করি: 0x80 - 0x80+RETURNDATASIZE + +![প্রক্সিতে কল ফ্লোচার্ট](flowchart-proxy.png) + +## ABI কল {#abi-calls} + +কল ডেটার আকার চার বাইট বা তার বেশি হলে এটি একটি বৈধ ABI কল হতে পারে। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | -------------------------------------------------------------------------------------------------------------------- | +| D | PUSH1 0x00 | 0x00 | +| F | CALLDATALOAD | (((কল ডেটার প্রথম শব্দ (256 বিট)))) | +| 10 | PUSH1 0xe0 | 0xE0 (((কল ডেটার প্রথম শব্দ (256 বিট)))) | +| 12 | SHR | (((কল ডেটার প্রথম 32 বিট (4 বাইট)))) | + +Etherscan আমাদের জানায় যে `1C` একটি অজানা অপকোড, কারণ [Etherscan এই ফিচারটি লেখার পরে এটি যোগ করা হয়েছিল](https://eips.ethereum.org/EIPS/eip-145) এবং তারা এটি আপডেট করেনি। একটি [আপ-টু-ডেট অপকোড টেবিল](https://github.com/wolflo/evm-opcodes) আমাদের দেখায় যে এটি শিফট রাইট। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 13 | DUP1 | (((কল ডেটার প্রথম 32 বিট (4 বাইট)))) (((কল ডেটার প্রথম 32 বিট (4 বাইট)))) | +| 14 | PUSH4 0x3cd8045e | 0x3CD8045E (((কল ডেটার প্রথম 32 বিট (4 বাইট)))) (((কল ডেটার প্রথম 32 বিট (4 বাইট)))) | +| 19 | GT | 0x3CD8045E>কল-ডেটার-প্রথম-32-বিট (((কল ডেটার প্রথম 32 বিট (4 বাইট)))) | +| 1A | PUSH2 0x0043 | 0x43 0x3CD8045E>কল-ডেটার-প্রথম-32-বিট (((কল ডেটার প্রথম 32 বিট (4 বাইট)))) | +| 1D | JUMPI | (((কল ডেটার প্রথম 32 বিট (4 বাইট)))) | + +মেথড সিগনেচার ম্যাচিং টেস্টকে এভাবে দুই ভাগে ভাগ করলে গড়ে অর্ধেক টেস্ট সাশ্রয় হয়। এর ঠিক পরের কোড এবং 0x43-এর কোড একই প্যাটার্ন অনুসরণ করে: কল ডেটার প্রথম 32 বিট `DUP1` করুন, `PUSH4 (((মেথড সিগনেচার))`, সমতার জন্য পরীক্ষা করতে `EQ` চালান, এবং তারপর `JUMPI` যদি মেথড সিগনেচার মিলে যায়। এখানে মেথড সিগনেচার, তাদের ঠিকানা এবং যদি জানা থাকে [সংশ্লিষ্ট মেথড সংজ্ঞা](https://www.4byte.directory/): + +| পদ্ধতি | মেথড সিগনেচার | ভিতরে ঝাঁপ দেওয়ার জন্য অফসেট | +| --------------------------------------------------------------------------------------------------------- | ------------- | ----------------------------- | +| [splitter()](https://www.4byte.directory/signatures/?bytes4_signature=0x3cd8045e) | 0x3cd8045e | 0x0103 | +| ??? | 0x81e580d3 | 0x0138 | +| [currentWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0xba0bafb4) | 0xba0bafb4 | 0x0158 | +| ??? | 0x1f135823 | 0x00C4 | +| [merkleRoot()](https://www.4byte.directory/signatures/?bytes4_signature=0x2eb4a7ab) | 0x2eb4a7ab | 0x00ED | + +যদি কোনও মিল খুঁজে না পাওয়া যায়, কোডটি [0x7C-এ প্রক্সি হ্যান্ডলারে](#the-handler-at-0x7c) ঝাঁপিয়ে পড়ে, এই আশায় যে আমরা যে চুক্তির জন্য প্রক্সি, তার একটি মিল রয়েছে। + +![ABI কল ফ্লোচার্ট](flowchart-abi.png) + +## splitter() {#splitter} + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | ----------------------------- | +| 103 | JUMPDEST | | +| 104 | CALLVALUE | CALLVALUE | +| 105 | DUP1 | CALLVALUE CALLVALUE | +| 106 | ISZERO | CALLVALUE==0 CALLVALUE | +| 107 | PUSH2 0x010f | 0x010F CALLVALUE==0 CALLVALUE | +| 10A | JUMPI | CALLVALUE | +| 10B | PUSH1 0x00 | 0x00 CALLVALUE | +| 10D | DUP1 | 0x00 0x00 CALLVALUE | +| 10E | REVERT | | + +এই ফাংশনটির প্রথম কাজ হল পরীক্ষা করা যে কলটি কোনো ETH পাঠিয়েছে কিনা। এই ফাংশনটি [`payable`](https://solidity-by-example.org/payable/) নয়। যদি কেউ আমাদের ETH পাঠায় তবে এটি অবশ্যই একটি ভুল এবং আমরা `REVERT` করতে চাই যাতে সেই ETH তারা ফেরত পেতে না পারে এমন জায়গায় না থাকে। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 10F | JUMPDEST | | +| 110 | POP | | +| 111 | PUSH1 0x03 | 0x03 | +| 113 | SLOAD | (((সংগ্রহস্থল[3] এ.কে.এ. যে চুক্তির জন্য আমরা একটি প্রক্সি))) | +| 114 | PUSH1 0x40 | 0x40 (((সংগ্রহস্থল[3] এ.কে.এ. যে চুক্তির জন্য আমরা একটি প্রক্সি))) | +| 116 | MLOAD | 0x80 (((সংগ্রহস্থল[3] এ.কে.এ. যে চুক্তির জন্য আমরা একটি প্রক্সি))) | +| 117 | PUSH20 0xffffffffffffffffffffffffffffffffffffffff | 0xFF...FF 0x80 (((সংগ্রহস্থল[3] এ.কে.এ. যে চুক্তির জন্য আমরা একটি প্রক্সি))) | +| 12C | SWAP1 | 0x80 0xFF...FF (((সংগ্রহস্থল[3] এ.কে.এ. যে চুক্তির জন্য আমরা একটি প্রক্সি))) | +| 12D | SWAP2 | (((সংগ্রহস্থল[3] এ.কে.এ. যে চুক্তির জন্য আমরা একটি প্রক্সি))) 0xFF...FF 0x80 | +| 12E | AND | প্রক্সি ঠিকানা 0x80 | +| 12F | DUP2 | 0x80 প্রক্সি ঠিকানা 0x80 | +| 130 | MSTORE | 0x80 | + +এবং 0x80 এখন প্রক্সি ঠিকানা ধারণ করে + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | --------- | +| 131 | PUSH1 0x20 | 0x20 0x80 | +| 133 | ADD | 0xA0 | +| 134 | PUSH2 0x00e4 | 0xE4 0xA0 | +| 137 | JUMP | 0xA0 | + +### E4 কোড {#the-e4-code} + +এই লাইনগুলি আমরা প্রথমবার দেখছি, তবে সেগুলি অন্যান্য পদ্ধতির সাথে ভাগ করা হয়েছে (নীচে দেখুন)। তাই আমরা স্ট্যাকের মানটিকে X বলব, এবং শুধু মনে রাখব যে `splitter()` এ এই X-এর মান হল 0xA0। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------- | ----------- | +| E4 | JUMPDEST | X | +| E5 | PUSH1 0x40 | 0x40 X | +| E7 | MLOAD | 0x80 X | +| E8 | DUP1 | 0x80 0x80 X | +| E9 | SWAP2 | X 0x80 0x80 | +| EA | SUB | X-0x80 0x80 | +| EB | SWAP1 | 0x80 X-0x80 | +| EC | RETURN | | + +সুতরাং এই কোডটি স্ট্যাকে একটি মেমরি পয়েন্টার (X) গ্রহণ করে এবং চুক্তিটিকে 0x80 - X বাফার দিয়ে `RETURN` করতে বাধ্য করে। + +`splitter()`-এর ক্ষেত্রে, এটি সেই ঠিকানাটি ফেরত দেয় যার জন্য আমরা একটি প্রক্সি। `RETURN` বাফারটি 0x80-0x9F এ ফেরত দেয়, যেখানে আমরা এই ডেটাটি লিখেছি (উপরে অফসেট 0x130)। + +## currentWindow() {#currentwindow} + +অফসেট 0x158-0x163 এর কোডটি `splitter()`-এ 0x103-0x10E-এ যা দেখেছিলাম তার অনুরূপ (`JUMPI` গন্তব্য ছাড়া), তাই আমরা জানি `currentWindow()`ও `payable` নয়। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | --------------------------------------------------------------------------- | +| 164 | JUMPDEST | | +| 165 | POP | | +| 166 | PUSH2 0x00da | 0xDA | +| 169 | PUSH1 0x01 | 0x01 0xDA | +| 16B | SLOAD | সংগ্রহস্থল[1] 0xDA | +| 16C | DUP2 | 0xDA সংগ্রহস্থল[1] 0xDA | +| 16D | JUMP | সংগ্রহস্থল[1] 0xDA | + +### DA কোড {#the-da-code} + +এই কোডটি অন্যান্য পদ্ধতির সাথেও ভাগ করা হয়েছে। সুতরাং আমরা স্ট্যাকের মানটিকে Y বলব, এবং শুধু মনে রাখব যে `currentWindow()`-এ এই Y-এর মান হল সংগ্রহস্থল[1]। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------- | ---------------- | +| DA | JUMPDEST | Y 0xDA | +| DB | PUSH1 0x40 | 0x40 Y 0xDA | +| DD | MLOAD | 0x80 Y 0xDA | +| DE | SWAP1 | Y 0x80 0xDA | +| DF | DUP2 | 0x80 Y 0x80 0xDA | +| E0 | MSTORE | 0x80 0xDA | + +Y কে 0x80-0x9F এ লিখুন। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------- | -------------- | +| E1 | PUSH1 0x20 | 0x20 0x80 0xDA | +| E3 | ADD | 0xA0 0xDA | + +এবং বাকিটা ইতিমধ্যে [উপরে](#the-e4-code) ব্যাখ্যা করা হয়েছে। সুতরাং 0xDA-তে জাম্প করলে স্ট্যাকের শীর্ষ (Y) 0x80-0x9F-এ লেখা হয়, এবং সেই মানটি ফেরত দেওয়া হয়। `currentWindow()`-এর ক্ষেত্রে, এটি Storage[1] ফেরত দেয়। + +## merkleRoot() {#merkleroot} + +অফসেট 0xED-0xF8 এর কোডটি `splitter()`-এ 0x103-0x10E-এ যা দেখেছিলাম তার অনুরূপ (`JUMPI` গন্তব্য ছাড়া), তাই আমরা জানি `merkleRoot()`ও `payable` নয়। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | --------------------------------------------------------------------------- | +| F9 | JUMPDEST | | +| FA | POP | | +| FB | PUSH2 0x00da | 0xDA | +| FE | PUSH1 0x00 | 0x00 0xDA | +| 100 | SLOAD | সংগ্রহস্থল[0] 0xDA | +| 101 | DUP2 | 0xDA সংগ্রহস্থল[0] 0xDA | +| 102 | JUMP | সংগ্রহস্থল[0] 0xDA | + +জাম্পের পরে যা ঘটে তা [আমরা ইতিমধ্যে বের করেছি](#the-da-code)। সুতরাং `merkleRoot()` সংগ্রহস্থল[0] প্রদান করে। + +## 0x81e580d3 {#0x81e580d3} + +অফসেট 0x138-0x143 এর কোডটি `splitter()`-এ 0x103-0x10E-এ যা দেখেছিলাম তার অনুরূপ (`JUMPI` গন্তব্য ছাড়া), তাই আমরা জানি এই ফাংশনটিও `payable` নয়। + +| অফসেট | অপকোড | স্ট্যাক | +| -------------------------------------------------------------------------: | ------------ | ----------------------------------------------------------------------------- | +| 99.63+40\*1.1018 = 143.702 | JUMPDEST | | +| 145 | POP | | +| 146 | PUSH2 0x00da | 0xDA | +| 149 | PUSH2 0x0153 | 0x0153 0xDA | +| 14C | CALLDATASIZE | CALLDATASIZE 0x0153 0xDA | +| 14D | PUSH1 0x04 | 0x04 CALLDATASIZE 0x0153 0xDA | +| 14F | PUSH2 0x018f | 0x018F 0x04 CALLDATASIZE 0x0153 0xDA | +| 152 | JUMP | 0x04 CALLDATASIZE 0x0153 0xDA | +| 18F | JUMPDEST | 0x04 CALLDATASIZE 0x0153 0xDA | +| 190 | PUSH1 0x00 | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 192 | PUSH1 0x20 | 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 194 | DUP3 | 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 195 | DUP5 | CALLDATASIZE 0x04 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| \_mintFee | SUB | CALLDATASIZE-4 0x20 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 197 | SLT | CALLDATASIZE-4<32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 198 | ISZERO | CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 199 | PUSH2 0x01a0 | 0x01A0 CALLDATASIZE-4>=32 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19C | JUMPI | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | + +মনে হচ্ছে এই ফাংশনটি কমপক্ষে 32 বাইট (এক শব্দ) কল ডেটা নেয়। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------ | -------------------------------------------- | +| 19D | DUP1 | 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19E | DUP2 | 0x00 0x00 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 19F | REVERT | | + +যদি এটি কল ডেটা না পায় তবে লেনদেনটি কোনো রিটার্ন ডেটা ছাড়াই বাতিল হয়ে যায়। + +আসুন দেখি ফাংশনটি যদি প্রয়োজনীয় কল ডেটা পায় তবে কী ঘটে। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | ----------------------------------------------------------- | +| 1A0 | JUMPDEST | 0x00 0x04 CALLDATASIZE 0x0153 0xDA | +| 1A1 | POP | 0x04 CALLDATASIZE 0x0153 0xDA | +| 1A2 | CALLDATALOAD | calldataload(4) CALLDATASIZE 0x0153 0xDA | + +`calldataload(4)` হল কল ডেটার প্রথম শব্দ মেথড সিগনেচারের _পরে_ + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 1A3 | SWAP2 | 0x0153 CALLDATASIZE calldataload(4) 0xDA | +| 1A4 | SWAP1 | CALLDATASIZE 0x0153 calldataload(4) 0xDA | +| 1A5 | POP | 0x0153 calldataload(4) 0xDA | +| 1A6 | JUMP | calldataload(4) 0xDA | +| 153 | JUMPDEST | calldataload(4) 0xDA | +| 154 | PUSH2 0x016e | 0x016E calldataload(4) 0xDA | +| 157 | JUMP | calldataload(4) 0xDA | +| 16E | JUMPDEST | calldataload(4) 0xDA | +| 16F | PUSH1 0x04 | 0x04 calldataload(4) 0xDA | +| 171 | DUP2 | calldataload(4) 0x04 calldataload(4) 0xDA | +| 172 | DUP2 | 0x04 calldataload(4) 0x04 calldataload(4) 0xDA | +| 173 | SLOAD | সংগ্রহস্থল[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 174 | DUP2 | calldataload(4) সংগ্রহস্থল[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 175 | LT | calldataload(4)<সংগ্রহস্থল[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 176 | PUSH2 0x017e | 0x017EC calldataload(4)<সংগ্রহস্থল[4] calldataload(4) 0x04 calldataload(4) 0xDA | +| 179 | JUMPI | calldataload(4) 0x04 calldataload(4) 0xDA | + +যদি প্রথম শব্দটি সংগ্রহস্থল[4] এর থেকে কম না হয়, তাহলে ফাংশনটি ব্যর্থ হয়। এটি কোনো রিটার্ন মান ছাড়াই বাতিল হয়ে যায়: + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------- | ------------------------------------------------------------- | +| 17A | PUSH1 0x00 | 0x00 ... | +| 17C | DUP1 | 0x00 0x00 ... | +| 17D | REVERT | | + +যদি calldataload(4) Storage[4]-এর থেকে কম হয়, তাহলে আমরা এই কোডটি পাই: + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------- | ----------------------------------------------------------------------------------------- | +| 17E | JUMPDEST | calldataload(4) 0x04 calldataload(4) 0xDA | +| 17F | PUSH1 0x00 | 0x00 calldataload(4) 0x04 calldataload(4) 0xDA | +| 181 | SWAP2 | 0x04 calldataload(4) 0x00 calldataload(4) 0xDA | +| 182 | DUP3 | 0x00 0x04 calldataload(4) 0x00 calldataload(4) 0xDA | +| 183 | MSTORE | calldataload(4) 0x00 calldataload(4) 0xDA | + +এবং মেমরি অবস্থান 0x00-0x1F এখন ডেটা 0x04 ধারণ করে (0x00-0x1E সবই শূন্য, 0x1F হল চার) + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 184 | PUSH1 0x20 | 0x20 calldataload(4) 0x00 calldataload(4) 0xDA | +| 186 | SWAP1 | calldataload(4) 0x20 0x00 calldataload(4) 0xDA | +| 187 | SWAP2 | 0x00 0x20 calldataload(4) calldataload(4) 0xDA | +| 188 | SHA3 | (((0x00-0x1F এর SHA3))) calldataload(4) calldataload(4) 0xDA | +| 189 | ADD | (((0x00-0x1F এর SHA3)))+calldataload(4) calldataload(4) 0xDA | +| 18A | SLOAD | সংগ্রহস্থল[(((0x00-0x1F এর SHA3))) + calldataload(4)] calldataload(4) 0xDA | + +সুতরাং স্টোরেজে একটি লুকআপ টেবিল রয়েছে, যা 0x000...0004-এর SHA3 থেকে শুরু হয় এবং প্রতিটি বৈধ কল ডেটা মানের জন্য একটি এন্ট্রি রয়েছে (সংগ্রহস্থল[4] এর নীচের মান)। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 18B | SWAP1 | calldataload(4) সংগ্রহস্থল[(((0x00-0x1F এর SHA3))) + calldataload(4)] 0xDA | +| 18C | POP | সংগ্রহস্থল[(((0x00-0x1F এর SHA3))) + calldataload(4)] 0xDA | +| 18D | DUP2 | 0xDA সংগ্রহস্থল[(((0x00-0x1F এর SHA3))) + calldataload(4)] 0xDA | +| 18E | JUMP | সংগ্রহস্থল[(((0x00-0x1F এর SHA3))) + calldataload(4)] 0xDA | + +আমরা ইতিমধ্যে জানি [অফসেট 0xDA-এর কোডটি](#the-da-code) কী করে, এটি স্ট্যাক টপ ভ্যালু কলারকে ফেরত দেয়। সুতরাং এই ফাংশনটি লুকআপ টেবিল থেকে মানটি কলারকে ফেরত দেয়। + +## 0x1f135823 {#0x1f135823} + +অফসেট 0xC4-0xCF এর কোডটি `splitter()`-এ 0x103-0x10E-এ যা দেখেছিলাম তার অনুরূপ (`JUMPI` গন্তব্য ছাড়া), তাই আমরা জানি এই ফাংশনটিও `payable` নয়। + +| অফসেট | অপকোড | স্ট্যাক | +| ----: | ------------ | ----------------- | +| D0 | JUMPDEST | | +| D1 | POP | | +| D2 | PUSH2 0x00da | 0xDA | +| D5 | PUSH1 0x06 | 0x06 0xDA | +| D7 | SLOAD | Value\* 0xDA | +| D8 | DUP2 | 0xDA Value\* 0xDA | +| D9 | JUMP | Value\* 0xDA | + +আমরা ইতিমধ্যে জানি [অফসেট 0xDA-এর কোডটি](#the-da-code) কী করে, এটি স্ট্যাক টপ ভ্যালু কলারকে ফেরত দেয়। সুতরাং এই ফাংশনটি `Value*` ফেরত দেয়। + +### পদ্ধতির সারাংশ {#method-summary} + +আপনি কি মনে করেন এই মুহূর্তে চুক্তিটি বুঝতে পারছেন? আমি না। এখন পর্যন্ত আমাদের এই পদ্ধতিগুলি রয়েছে: + +| পদ্ধতি | অর্থ | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| স্থানান্তর | কল দ্বারা প্রদত্ত মান গ্রহণ করুন এবং `Value*` কে সেই পরিমাণ দ্বারা বৃদ্ধি করুন | +| [splitter()](#splitter) | সংগ্রহস্থল[3] ফেরত দিন, প্রক্সি ঠিকানা | +| [currentWindow()](#currentwindow) | সংগ্রহস্থল[1] ফেরত দিন | +| [merkleRoot()](#merkeroot) | সংগ্রহস্থল[0] ফেরত দিন | +| [0x81e580d3](#0x81e580d3) | একটি লুকআপ টেবিল থেকে মান ফেরত দিন, যদি প্যারামিটারটি সংগ্রহস্থল[4] থেকে কম হয় | +| [0x1f135823](#0x1f135823) | সংগ্রহস্থল[6] ফেরত দিন, এ.কে.এ. Value\* | + +কিন্তু আমরা জানি যে অন্য কোনো কার্যকারিতা Storage[3]-এর চুক্তি দ্বারা প্রদান করা হয়। হয়তো যদি আমরা জানতাম যে সেই চুক্তিটি কী তবে এটি আমাদের একটি সূত্র দেবে। সৌভাগ্যবশত, এটি ব্লকচেইন এবং সবকিছুই জানা, অন্তত তত্ত্বগতভাবে। আমরা এমন কোনো পদ্ধতি দেখিনি যা সংগ্রহস্থল[3] সেট করে, তাই এটি অবশ্যই কন্সট্রাক্টর দ্বারা সেট করা হয়েছে। + +## কনস্ট্রাক্টর {#the-constructor} + +যখন আমরা [একটি চুক্তি দেখি](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f) আমরা এটি তৈরির লেনদেনও দেখতে পারি। + +![তৈরির লেনদেন ক্লিক করুন](create-tx.png) + +আমরা যদি সেই লেনদেনে ক্লিক করি এবং তারপরে **অবস্থা** ট্যাবে ক্লিক করি, তাহলে আমরা প্যারামিটারগুলির প্রাথমিক মান দেখতে পারি। বিশেষ করে, আমরা দেখতে পারি যে সংগ্রহস্থল[3]-এ [0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761](https://etherscan.io/address/0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761) রয়েছে। সেই চুক্তিতে অবশ্যই অনুপস্থিত কার্যকারিতা রয়েছে। আমরা যে চুক্তিটি তদন্ত করছি তার জন্য আমরা যে টুলস ব্যবহার করেছি, সেগুলি ব্যবহার করে আমরা এটি বুঝতে পারি। + +## প্রক্সি চুক্তি {#the-proxy-contract} + +উপরে মূল চুক্তির জন্য আমরা যে কৌশলগুলি ব্যবহার করেছি, সেগুলি ব্যবহার করে আমরা দেখতে পারি যে চুক্তিটি উল্টে যায় যদি: + +- কলের সাথে কোনো ETH সংযুক্ত থাকে (0x05-0x0F) +- কল ডেটার আকার চারের কম (0x10-0x19 এবং 0xBE-0xC2) + +এবং এটি যে পদ্ধতিগুলিকে সমর্থন করে সেগুলি হল: + +| পদ্ধতি | মেথড সিগনেচার | ভিতরে ঝাঁপ দেওয়ার জন্য অফসেট | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ----------------------------- | +| [scaleAmountByPercentage(uint256,uint256)](https://www.4byte.directory/signatures/?bytes4_signature=0x8ffb5c97) | 0x8ffb5c97 | 0x0135 | +| [isClaimed(uint256,address)](https://www.4byte.directory/signatures/?bytes4_signature=0xd2ef0795) | 0xd2ef0795 | 0x0151 | +| [claim(uint256,address,uint256,bytes32[])](https://www.4byte.directory/signatures/?bytes4_signature=0x2e7ba6ef) | 0x2e7ba6ef | 0x00F4 | +| [incrementWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0x338b1d31) | 0x338b1d31 | 0x0110 | +| ??? | 0x3f26479e | 0x0118 | +| ??? | 0x1e7df9d3 | 0x00C3 | +| [currentWindow()](https://www.4byte.directory/signatures/?bytes4_signature=0xba0bafb4) | [0xba0bafb4](#currentwindow) | 0x0148 | +| [merkleRoot()](https://www.4byte.directory/signatures/?bytes4_signature=0x2eb4a7ab) | [0x2eb4a7ab](#merkleroot) | 0x0107 | +| ??? | [0x81e580d3](#0x81e580d3) | 0x0122 | +| ??? | [0x1f135823](#0x1f135823) | 0x00D8 | + +আমরা নীচের চারটি পদ্ধতি উপেক্ষা করতে পারি কারণ আমরা কখনই তাদের কাছে পৌঁছাব না। তাদের সিগনেচার এমন যে আমাদের মূল চুক্তি নিজেই তাদের যত্ন নেয় (আপনি উপরের বিবরণ দেখতে সিগনেচারগুলিতে ক্লিক করতে পারেন), তাই সেগুলি অবশ্যই [ওভাররাইড করা পদ্ধতি](https://medium.com/upstate-interactive/solidity-override-vs-virtual-functions-c0a5dfb83aaf) হতে হবে। + +অবশিষ্ট পদ্ধতিগুলির মধ্যে একটি হল `claim()`, এবং অন্যটি হল `isClaimed()`, তাই এটি একটি এয়ারড্রপ চুক্তির মতো দেখাচ্ছে। বাকিটা অপকোড ধরে ধরে না দেখে, আমরা [ডিকম্পাইলার চেষ্টা করতে পারি](https://etherscan.io/bytecode-decompiler?a=0x2f81e57ff4f4d83b40a9f719fd892d8e806e0761), যা এই চুক্তি থেকে তিনটি ফাংশনের জন্য ব্যবহারযোগ্য ফলাফল তৈরি করে। অন্যদের রিভার্স ইঞ্জিনিয়ারিং পাঠকের জন্য একটি অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে। + +### scaleAmountByPercentage {#scaleamountbypercentage} + +এই ফাংশনের জন্য ডিকম্পাইলার আমাদের যা দেয় তা হল: + +```python +def unknown8ffb5c97(uint256 _param1, uint256 _param2) payable: + require calldata.size - 4 >=′ 64 + if _param1 and _param2 > -1 / _param1: + revert with 0, 17 + return (_param1 * _param2 / 100 * 10^6) +``` + +প্রথম `require` পরীক্ষা করে যে কল ডেটাতে, ফাংশন সিগনেচারের চার বাইট ছাড়াও, কমপক্ষে 64 বাইট রয়েছে, যা দুটি প্যারামিটারের জন্য যথেষ্ট। যদি না হয় তবে অবশ্যই কিছু ভুল আছে। + +`if` স্টেটমেন্টটি দেখে মনে হচ্ছে এটি পরীক্ষা করে যে `_param1` শূন্য নয়, এবং `_param1 * _param2` ঋণাত্মক নয়। এটি সম্ভবত র‍্যাপ অ্যারাউন্ডের ঘটনাগুলি প্রতিরোধ করার জন্য। + +অবশেষে, ফাংশনটি একটি স্কেল করা মান প্রদান করে। + +### দাবি {#claim} + +ডিকম্পাইলার যে কোড তৈরি করে তা জটিল, এবং এর সবটাই আমাদের জন্য প্রাসঙ্গিক নয়। আমি এর কিছু অংশ এড়িয়ে যাচ্ছি সেই লাইনগুলিতে ফোকাস করার জন্য যা আমার মতে দরকারী তথ্য সরবরাহ করে। + +```python +def unknown2e7ba6ef(uint256 _param1, uint256 _param2, uint256 _param3, array _param4) payable: + ... + require _param2 == addr(_param2) + ... + if currentWindow <= _param1: + revert with 0, 'cannot claim for a future window' +``` + +আমরা এখানে দুটি গুরুত্বপূর্ণ জিনিস দেখতে পাই: + +- `_param2`, যদিও এটিকে `uint256` হিসাবে ঘোষণা করা হয়েছে, এটি আসলে একটি ঠিকানা। +- `_param1` হল দাবি করা উইন্ডো, যা `currentWindow` বা তার আগের হতে হবে। + +```python + ... + if stor5[_claimWindow][addr(_claimFor)]: + revert with 0, 'Account already claimed the given window' +``` + +সুতরাং এখন আমরা জানি যে Storage[5] হল উইন্ডো এবং ঠিকানার একটি অ্যারে, এবং ঠিকানাটি সেই উইন্ডোর জন্য পুরস্কার দাবি করেছে কিনা। + +```python + ... + idx = 0 + s = 0 + while idx < _param4.length: + ... + if s + sha3(mem[(32 * _param4.length) + 328 len mem[(32 * _param4.length) + 296]]) > mem[(32 * idx) + 296]: + mem[mem[64] + 32] = mem[(32 * idx) + 296] + ... + s = sha3(mem[_62 + 32 len mem[_62]]) + continue + ... + s = sha3(mem[_66 + 32 len mem[_66]]) + continue + if unknown2eb4a7ab != s: + revert with 0, 'Invalid proof' +``` + +আমরা জানি যে `unknown2eb4a7ab` আসলে `merkleRoot()` ফাংশন, তাই এই কোডটি দেখে মনে হচ্ছে এটি একটি [মার্কল প্রমাণ](https://medium.com/crypto-0-nite/merkle-proofs-explained-6dd429623dc5) যাচাই করছে। এর মানে হল `_param4` একটি মার্কল প্রমাণ। + +```python + call addr(_param2) with: + value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei + gas 30000 wei +``` + +এভাবেই একটি চুক্তি তার নিজস্ব ETH অন্য ঠিকানায় (চুক্তি বা বাহ্যিকভাবে মালিকানাধীন) স্থানান্তর করে। এটি একটি মান দিয়ে কল করে যা স্থানান্তরিত হওয়ার পরিমাণ। সুতরাং দেখে মনে হচ্ছে এটি ETH-এর একটি এয়ারড্রপ। + +```python + if not return_data.size: + if not ext_call.success: + require ext_code.size(stor2) + call stor2.deposit() with: + value unknown81e580d3[_param1] * _param3 / 100 * 10^6 wei +``` + +নীচের দুটি লাইন আমাদের জানায় যে সংগ্রহস্থল[2]ও একটি চুক্তি যা আমরা কল করি। যদি আমরা [কন্সট্রাক্টর লেনদেন দেখি](https://etherscan.io/tx/0xa1ea0549fb349eb7d3aff90e1d6ce7469fdfdcd59a2fd9b8d1f5e420c0d05b58#statechange) আমরা দেখতে পাই যে এই চুক্তিটি [0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2), একটি র‍্যাপড ইথার চুক্তি [যার সোর্স কোড Etherscan-এ আপলোড করা হয়েছে](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code)। + +সুতরাং দেখে মনে হচ্ছে চুক্তিগুলি `_param2`-এ ETH পাঠানোর চেষ্টা করে। যদি এটি করতে পারে, দারুণ। যদি না পারে, তবে এটি [WETH](https://weth.tkn.eth.limo/) পাঠানোর চেষ্টা করে। যদি `_param2` একটি এক্সটার্নালি ওনড অ্যাকাউন্ট (EOA) হয় তবে এটি সর্বদা ETH গ্রহণ করতে পারে, কিন্তু চুক্তিগুলি ETH গ্রহণ করতে অস্বীকার করতে পারে। তবে, WETH হল ERC-20 এবং চুক্তিগুলি তা গ্রহণ করতে অস্বীকার করতে পারে না। + +```python + ... + log 0xdbd5389f: addr(_param2), unknown81e580d3[_param1] * _param3 / 100 * 10^6, bool(ext_call.success) +``` + +ফাংশনের শেষে আমরা একটি লগ এন্ট্রি তৈরি হতে দেখি। [তৈরি করা লগ এন্ট্রিগুলি দেখুন](https://etherscan.io/address/0x2510c039cc3b061d79e564b38836da87e31b342f#events) এবং `0xdbd5...` দিয়ে শুরু হওয়া টপিকে ফিল্টার করুন। যদি আমরা [এমন একটি লেনদেনে ক্লিক করি যা এই ধরনের একটি এন্ট্রি তৈরি করেছে](https://etherscan.io/tx/0xe7d3b7e00f645af17dfbbd010478ef4af235896c65b6548def1fe95b3b7d2274) আমরা দেখতে পাই যে এটি সত্যিই একটি দাবির মতো দেখাচ্ছে - অ্যাকাউন্টটি আমরা যে চুক্তিটি বিপরীত প্রকৌশলী করছি তাতে একটি বার্তা পাঠিয়েছে, এবং বিনিময়ে ETH পেয়েছে। + +![একটি দাবি লেনদেন](claim-tx.png) + +### 1e7df9d3 {#1e7df9d3} + +এই ফাংশনটি উপরের [`claim`](#claim)-এর সাথে খুব অনুরূপ। এটি একটি মার্কল প্রমাণও পরীক্ষা করে, প্রথমে ETH স্থানান্তর করার চেষ্টা করে এবং একই ধরনের লগ এন্ট্রি তৈরি করে। + +```python +def unknown1e7df9d3(uint256 _param1, uint256 _param2, array _param3) payable: + ... + idx = 0 + s = 0 + while idx < _param3.length: + if idx >= mem[96]: + revert with 0, 50 + _55 = mem[(32 * idx) + 128] + if s + sha3(mem[(32 * _param3.length) + 160 len mem[(32 * _param3.length) + 128]]) > mem[(32 * idx) + 128]: + ... + s = sha3(mem[_58 + 32 len mem[_58]]) + continue + mem[mem[64] + 32] = s + sha3(mem[(32 * _param3.length) + 160 len mem[(32 * _param3.length) + 128]]) + ... + if unknown2eb4a7ab != s: + revert with 0, 'Invalid proof' + ... + call addr(_param1) with: + value s wei + gas 30000 wei + if not return_data.size: + if not ext_call.success: + require ext_code.size(stor2) + call stor2.deposit() with: + value s wei + gas gas_remaining wei + ... + log 0xdbd5389f: addr(_param1), s, bool(ext_call.success) +``` + +প্রধান পার্থক্য হল যে প্রথম প্যারামিটার, যে উইন্ডোটি উত্তোলন করা হবে, তা সেখানে নেই। পরিবর্তে, দাবি করা যেতে পারে এমন সমস্ত উইন্ডোর উপর একটি লুপ রয়েছে। + +```python + idx = 0 + s = 0 + while idx < currentWindow: + ... + if stor5[mem[0]]: + if idx == -1: + revert with 0, 17 + idx = idx + 1 + s = s + continue + ... + stor5[idx][addr(_param1)] = 1 + if idx >= unknown81e580d3.length: + revert with 0, 50 + mem[0] = 4 + if unknown81e580d3[idx] and _param2 > -1 / unknown81e580d3[idx]: + revert with 0, 17 + if s > !(unknown81e580d3[idx] * _param2 / 100 * 10^6): + revert with 0, 17 + if idx == -1: + revert with 0, 17 + idx = idx + 1 + s = s + (unknown81e580d3[idx] * _param2 / 100 * 10^6) + continue +``` + +সুতরাং এটি `claim`-এর একটি ভ্যারিয়েন্টের মতো দেখাচ্ছে যা সমস্ত উইন্ডো দাবি করে। + +## উপসংহার {#conclusion} + +এখন পর্যন্ত আপনার জানা উচিত কিভাবে সেইসব চুক্তি বুঝতে হয় যাদের সোর্স কোড উপলব্ধ নেই, হয় অপকোড ব্যবহার করে অথবা (যখন এটি কাজ করে) ডিকম্পাইলার ব্যবহার করে। এই নিবন্ধের দৈর্ঘ্য থেকে স্পষ্ট যে, একটি চুক্তির রিভার্স ইঞ্জিনিয়ারিং তুচ্ছ নয়, তবে এমন একটি সিস্টেমে যেখানে নিরাপত্তা অপরিহার্য, সেখানে চুক্তিগুলি প্রতিশ্রুত হিসাবে কাজ করে কিনা তা যাচাই করতে সক্ষম হওয়া একটি গুরুত্বপূর্ণ দক্ষতা। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। diff --git a/public/content/translations/bn/developers/tutorials/run-node-raspberry-pi/index.md b/public/content/translations/bn/developers/tutorials/run-node-raspberry-pi/index.md new file mode 100644 index 00000000000..601ec6b033b --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/run-node-raspberry-pi/index.md @@ -0,0 +1,190 @@ +--- +title: "রাস্পবেরি পাই 4-এ একটি ইথেরিয়াম নোড চালান" +description: "আপনার রাস্পবেরি পাই 4 ফ্ল্যাশ করুন, একটি ইথারনেট কেবল প্লাগ ইন করুন, এসএসডি ডিস্কটি সংযুক্ত করুন এবং ডিভাইসটি পাওয়ার আপ করুন যাতে রাস্পবেরি পাই 4 একটি সম্পূর্ণ ইথেরিয়াম নোড + ভ্যালিডেটরে পরিণত হয়" +author: "EthereumOnArm" +tags: + [ + "ক্লায়েন্ট", + "এক্সিকিউশন লেয়ার", + "কনসেন্সাস লেয়ার", + "নোড" + ] +lang: bn +skill: intermediate +published: 2022-06-10 +source: Ethereum on ARM +sourceUrl: https://ethereum-on-arm-documentation.readthedocs.io/en/latest/ +--- + +**ARM-এর উপর ইথেরিয়াম হল একটি কাস্টম লিনাক্স ইমেজ যা রাস্পবেরি পাই-কে ইথেরিয়াম নোডে পরিণত করতে পারে।** + +ARM-এর উপর ইথেরিয়াম ব্যবহার করে রাস্পবেরি পাই-কে ইথেরিয়াম নোডে পরিণত করতে, নিম্নলিখিত হার্ডওয়্যারগুলি সুপারিশ করা হচ্ছে: + +- রাস্পবেরি 4 (মডেল B 8GB), ওড্রয়েড M1 বা রক 5B (8GB/16GB RAM) বোর্ড +- মাইক্রোএসডি কার্ড (ন্যূনতম 16 GB ক্লাস 10) +- ন্যূনতম 2 TB SSD ইউএসবি 3.0 ডিস্ক বা ইউএসবি থেকে সাটা কেস সহ একটি এসএসডি। +- পাওয়ার সাপ্লাই +- ইথারনেট কেবল +- পোর্ট ফরওয়ার্ডিং (আরো তথ্যের জন্য ক্লায়েন্ট দেখুন) +- হিটসিঙ্ক এবং ফ্যান সহ একটি কেস +- USB কীবোর্ড, মনিটর এবং HDMI কেবল (মাইক্রো-HDMI) (ঐচ্ছিক) + +## ARM-এ ইথেরিয়াম কেন চালাবেন? {#why-run-ethereum-on-arm} + +ARM বোর্ডগুলো খুব সাশ্রয়ী, নমনীয়, ছোট কম্পিউটার। ইথেরিয়াম নোড চালানোর জন্য এগুলি ভাল পছন্দ কারণ সেগুলি সস্তায় কেনা যায়, এমনভাবে কনফিগার করা যায় যাতে তাদের সমস্ত রিসোর্স শুধুমাত্র নোডের উপর ফোকাস করে, তাদের দক্ষ করে তোলে, তারা কম পরিমাণে শক্তি খরচ করে এবং শারীরিকভাবে ছোট হয় যাতে তারা যে কোনও হোমে বিচক্ষণতার সাথে ফিট করতে পারে। নোডগুলোকে স্পিন আপ করাও খুব সহজ কারণ রাস্পবেরি পাই-এর মাইক্রোএসডি-কে একটি পূর্বনির্মিত ইমেজ দিয়ে ফ্ল্যাশ করা যেতে পারে, যার জন্য কোনো সফ্টওয়্যার ডাউনলোড বা তৈরি করার প্রয়োজন নেই। + +## এটি কিভাবে কাজ করে? {#how-does-it-work} + +রাস্পবেরি পাই-এর মেমরি কার্ডটি একটি পূর্বনির্মিত ইমেজ দিয়ে ফ্ল্যাশ করা হয়। এই ইমেজে একটি ইথেরিয়াম নোড চালানোর জন্য প্রয়োজনীয় সবকিছু রয়েছে। একটি ফ্ল্যাশ করা কার্ড দিয়ে, ব্যবহারকারীকে শুধুমাত্র রাস্পবেরি পাই-কে পাওয়ার-অন করতে হবে। নোড চালানোর জন্য প্রয়োজনীয় সমস্ত প্রসেস স্বয়ংক্রিয়ভাবে শুরু হয়ে যায়। এটি কাজ করে কারণ মেমরি কার্ডে একটি লিনাক্স-ভিত্তিক অপারেটিং সিস্টেম (OS) থাকে যার উপরে সিস্টেম-স্তরের প্রসেস স্বয়ংক্রিয়ভাবে চলে যা ইউনিটটিকে একটি ইথেরিয়াম নোডে পরিণত করে। + +জনপ্রিয় রাস্পবেরি পাই লিনাক্স ওএস "রাস্পবিয়ান" ব্যবহার করে ইথেরিয়াম চালানো যায় না কারণ রাস্পবিয়ান এখনও একটি 32-বিট আর্কিটেকচার ব্যবহার করে যা ইথেরিয়াম ব্যবহারকারীদের মেমরি সমস্যায় ফেলে এবং কনসেন্সাস ক্লায়েন্ট 32-বিট বাইনারি সমর্থন করে না। এই সমস্যাটি কাটিয়ে উঠতে, Arm টিমের উপর ইথেরিয়াম "Armbian" নামক একটি নেটিভ 64-বিট OS-এ স্থানান্তরিত হয়েছে। + +**ইমেজগুলি সমস্ত প্রয়োজনীয় পদক্ষেপের যত্ন নেয়**, পরিবেশ সেট আপ করা এবং SSD ডিস্ক ফর্ম্যাট করা থেকে শুরু করে ইথেরিয়াম সফ্টওয়্যার ইনস্টল করা এবং চালানো এবং সেইসাথে ব্লকচেইন সিঙ্ক্রোনাইজেশন শুরু করা পর্যন্ত। + +## এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্টের উপর নোট {#note-on-execution-and-consensus-clients} + +Arm-এর উপর ইথেরিয়াম ইমেজে পরিষেবা হিসাবে পূর্বনির্মিত এক্সিকিউশন এবং কনসেন্সাস ক্লায়েন্ট অন্তর্ভুক্ত রয়েছে। একটি ইথেরিয়াম নোডের জন্য উভয় ক্লায়েন্টকে সিঙ্ক এবং চলমান থাকতে হবে। আপনাকে শুধুমাত্র ইমেজটি ডাউনলোড এবং ফ্ল্যাশ করতে হবে এবং তারপর পরিষেবাগুলি শুরু করতে হবে। ইমেজটি নিম্নলিখিত এক্সিকিউশন ক্লায়েন্টগুলির সাথে প্রি-লোড করা আছে: + +- Geth +- Nethermind +- Besu + +এবং নিম্নলিখিত কনসেন্সাস ক্লায়েন্টগুলি: + +- Lighthouse +- Nimbus +- Prysm +- Teku + +আপনার চালানোর জন্য প্রত্যেকটি থেকে একটি বেছে নেওয়া উচিত - সমস্ত এক্সিকিউশন ক্লায়েন্ট সমস্ত কনসেন্সাস ক্লায়েন্টের সাথে সামঞ্জস্যপূর্ণ। আপনি যদি স্পষ্টভাবে একটি ক্লায়েন্ট নির্বাচন না করেন, নোডটি তার ডিফল্টে ফিরে যাবে - Geth এবং Lighthouse - এবং বোর্ডটি পাওয়ার আপ হলে সেগুলি স্বয়ংক্রিয়ভাবে চালাবে। আপনাকে অবশ্যই আপনার রাউটারে 30303 পোর্টটি খুলতে হবে যাতে Geth পিয়ারদের খুঁজে পেতে এবং সংযোগ করতে পারে। + +## ইমেজ ডাউনলোড করা হচ্ছে {#downloading-the-image} + +রাস্পবেরি পাই 4 ইথেরিয়াম ইমেজটি একটি "প্লাগ অ্যান্ড প্লে" ইমেজ যা স্বয়ংক্রিয়ভাবে এক্সিকিউশন এবং কনসেন্সাস উভয় ক্লায়েন্টকে ইনস্টল এবং সেট আপ করে, একে অপরের সাথে কথা বলার জন্য এবং ইথেরিয়াম নেটওয়ার্কের সাথে সংযোগ করার জন্য কনফিগার করে। ব্যবহারকারীকে শুধুমাত্র একটি সহজ কমান্ড ব্যবহার করে তাদের প্রসেস শুরু করতে হবে। + +[Arm-এর উপর ইথেরিয়াম](https://ethereumonarm-my.sharepoint.com/:u:/p/dlosada/Ec_VmUvr80VFjf3RYSU-NzkBmj2JOteDECj8Bibde929Gw?download=1) থেকে রাস্পবেরি পাই ইমেজটি ডাউনলোড করুন এবং SHA256 হ্যাস যাচাই করুন: + +```sh +# ডাউনলোড করা ইমেজ ধারণকারী ডিরেক্টরি থেকে +shasum -a 256 ethonarm_22.04.00.img.zip +# হ্যাস আউটপুট হওয়া উচিত: fb497e8f8a7388b62d6e1efbc406b9558bee7ef46ec7e53083630029c117444f +``` + +মনে রাখবেন যে রক 5B এবং ওড্রয়েড M1 বোর্ডের জন্য ইমেজগুলি Ethereum-on-Arm [ডাউনলোড পেজে](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/quick-guide/download-and-install.html) উপলব্ধ। + +## মাইক্রোএসডি ফ্ল্যাশ করা {#flashing-the-microsd} + +রাস্পবেরি পাই-এর জন্য ব্যবহৃত মাইক্রোএসডি কার্ডটি প্রথমে একটি ডেস্কটপ বা ল্যাপটপে প্রবেশ করানো উচিত যাতে এটি ফ্ল্যাশ করা যায়। তারপরে, নিম্নলিখিত টার্মিনাল কমান্ডগুলি ডাউনলোড করা ইমেজটিকে এসডি কার্ডে ফ্ল্যাশ করবে: + +```shell +# মাইক্রোএসডি কার্ডের নাম চেক করুন +sudo fdisk -l + +>> sdxxx +``` + +সঠিক নামটি পাওয়া সত্যিই গুরুত্বপূর্ণ কারণ পরবর্তী কমান্ডে `dd` অন্তর্ভুক্ত রয়েছে যা ইমেজটি কার্ডে পুশ করার আগে কার্ডের বিদ্যমান বিষয়বস্তু সম্পূর্ণরূপে মুছে ফেলে। চালিয়ে যেতে, জিপ করা ইমেজ ধারণকারী ডিরেক্টরিতে নেভিগেট করুন: + +```shell +# আনজিপ এবং ফ্ল্যাশ ইমেজ +unzip ethonarm_22.04.00.img.zip +sudo dd bs=1M if=ethonarm_22.04.00.img of=/dev/ conv=fdatasync status=progress +``` + +কার্ডটি এখন ফ্ল্যাশ করা হয়েছে, তাই এটি রাস্পবেরি পাই-তে প্রবেশ করানো যেতে পারে। + +## নোড শুরু করুন {#start-the-node} + +এসডি কার্ডটি রাস্পবেরি পাই-তে প্রবেশ করানোর পরে, ইথারনেট কেবল এবং এসএসডি সংযোগ করুন এবং তারপরে পাওয়ার চালু করুন। OS বুট আপ হবে এবং ক্লায়েন্ট সফ্টওয়্যার ইনস্টল এবং তৈরি সহ স্বয়ংক্রিয়ভাবে প্রি-কনফিগার করা কাজগুলি সম্পাদন করা শুরু করবে যা রাস্পবেরি পাই-কে একটি ইথেরিয়াম নোডে পরিণত করে। এতে সম্ভবত 10-15 মিনিট সময় লাগবে। + +একবার সবকিছু ইনস্টল এবং কনফিগার করা হয়ে গেলে, একটি ssh সংযোগের মাধ্যমে ডিভাইসে লগ ইন করুন বা বোর্ডে একটি মনিটর এবং কীবোর্ড সংযুক্ত থাকলে সরাসরি টার্মিনাল ব্যবহার করুন। লগ ইন করতে `ethereum` অ্যাকাউন্টটি ব্যবহার করুন, কারণ নোড শুরু করার জন্য প্রয়োজনীয় অনুমতি রয়েছে। + +```shell +ব্যবহারকারী: ethereum +পাসওয়ার্ড: ethereum +``` + +ডিফল্ট এক্সিকিউশন ক্লায়েন্ট, Geth, স্বয়ংক্রিয়ভাবে শুরু হবে। আপনি নিম্নলিখিত টার্মিনাল কমান্ড ব্যবহার করে লগগুলি পরীক্ষা করে এটি নিশ্চিত করতে পারেন: + +```sh +sudo journalctl -u geth -f +``` + +কনসেন্সাস ক্লায়েন্টকে স্পষ্টভাবে শুরু করতে হবে। এটি করার জন্য, প্রথমে আপনার রাউটারে পোর্ট 9000 খুলুন যাতে Lighthouse পিয়ারদের খুঁজে পেতে এবং সংযোগ করতে পারে। তারপর লাইটহাউস পরিষেবাটি সক্ষম করুন এবং শুরু করুন: + +```sh +sudo systemctl enable lighthouse-beacon +sudo systemctl start lighthouse-beacon +``` + +লগ ব্যবহার করে ক্লায়েন্ট পরীক্ষা করুন: + +```sh +sudo journalctl -u lighthouse-beacon +``` + +মনে রাখবেন যে কনসেন্সাস ক্লায়েন্ট কয়েক মিনিটের মধ্যে সিঙ্ক হবে কারণ এটি চেকপয়েন্ট সিঙ্ক ব্যবহার করে। এক্সিকিউশন ক্লায়েন্টের বেশি সময় লাগবে - সম্ভাব্য কয়েক ঘন্টা, এবং এটি কনসেন্সাস ক্লায়েন্টের সিঙ্ক করা শেষ না হওয়া পর্যন্ত শুরু হবে না (কারণ এক্সিকিউশন ক্লায়েন্টের সিঙ্ক করার জন্য একটি টার্গেট প্রয়োজন, যা সিঙ্ক করা কনসেন্সাস ক্লায়েন্ট সরবরাহ করে)। + +Geth এবং Lighthouse পরিষেবাগুলি চলমান এবং সিঙ্ক করা অবস্থায়, আপনার রাস্পবেরি পাই এখন একটি ইথেরিয়াম নোড! Geth-এর জাভাস্ক্রিপ্ট কনসোল ব্যবহার করে ইথেরিয়াম নেটওয়ার্কের সাথে ইন্টারঅ্যাক্ট করা সবচেয়ে সাধারণ, যা পোর্ট 8545-এ Geth ক্লায়েন্টের সাথে সংযুক্ত করা যেতে পারে। Curl-এর মতো একটি রিকোয়েস্ট টুল ব্যবহার করে JSON অবজেক্ট হিসাবে ফর্ম্যাট করা কমান্ড জমা দেওয়াও সম্ভব। [Geth ডকুমেন্টেশনে](https://geth.ethereum.org/) আরও দেখুন। + +Geth একটি Grafana ড্যাশবোর্ডে মেট্রিক্স রিপোর্ট করার জন্য প্রি-কনফিগার করা আছে যা ব্রাউজারে দেখা যায়। আরও উন্নত ব্যবহারকারীরা তাদের নোডের স্বাস্থ্য নিরীক্ষণের জন্য `ipaddress:3000`-এ নেভিগেট করে, `user: admin` এবং `passwd: ethereum` পাস করে এই বৈশিষ্ট্যটি ব্যবহার করতে চাইতে পারেন। + +## ভ্যালিডেটর {#validators} + +একটি ভ্যালিডেটর ঐচ্ছিকভাবে কনসেন্সাস ক্লায়েন্টে যোগ করা যেতে পারে। ভ্যালিডেটর সফ্টওয়্যারটি আপনার নোডকে সক্রিয়ভাবে কনসেন্সাসে অংশগ্রহণ করতে দেয় এবং নেটওয়ার্ককে ক্রিপ্টো-ইকোনমিক নিরাপত্তা প্রদান করে। এই কাজের জন্য আপনাকে ETH-এ পুরস্কৃত করা হয়। একটি ভ্যালিডেটর চালানোর জন্য, আপনার কাছে প্রথমে 32 ETH থাকতে হবে, যা ডিপোজিট চুক্তিতে জমা করতে হবে। [লঞ্চপ্যাডে](https://launchpad.ethereum.org/) ধাপে ধাপে নির্দেশিকা অনুসরণ করে ডিপোজিট করা যেতে পারে। এটি একটি ডেস্কটপ/ল্যাপটপে করুন, তবে কী তৈরি করবেন না — এটি সরাসরি রাস্পবেরি পাই-তে করা যেতে পারে। + +রাস্পবেরি পাই-তে একটি টার্মিনাল খুলুন এবং ডিপোজিট কী তৈরি করতে নিম্নলিখিত কমান্ডটি চালান: + +``` +sudo apt-get update +sudo apt-get install staking-deposit-cli +cd && deposit new-mnemonic --num_validators 1 +``` + +(অথবা একটি এয়ারগ্যাপড মেশিনে চালানোর জন্য [staking-deposit-cli](https://github.com/ethereum/staking-deposit-cli) ডাউনলোড করুন, এবং `deposit new-mnemnonic` কমান্ডটি চালান) + +নেমোনিক ফ্রেজটি নিরাপদে রাখুন! উপরের কমান্ডটি নোডের কীস্টোরে দুটি ফাইল তৈরি করেছে: ভ্যালিডেটর কী এবং একটি ডিপোজিট ডেটা ফাইল। ডিপোজিট ডেটা লঞ্চপ্যাডে আপলোড করতে হবে, তাই এটি রাস্পবেরি পাই থেকে ডেস্কটপ/ল্যাপটপে কপি করতে হবে। এটি একটি ssh সংযোগ বা অন্য কোনো কপি/পেস্ট পদ্ধতি ব্যবহার করে করা যেতে পারে। + +একবার ডিপোজিট ডেটা ফাইলটি লঞ্চপ্যাড চালিত কম্পিউটারে উপলব্ধ হলে, এটি লঞ্চপ্যাড স্ক্রিনের `+` চিহ্নের উপর টেনে এনে ছেড়ে দেওয়া যেতে পারে। ডিপোজিট চুক্তিতে একটি লেনদেন পাঠাতে স্ক্রিনের নির্দেশাবলী অনুসরণ করুন। + +রাস্পবেরি পাই-তে ফিরে, একটি ভ্যালিডেটর শুরু করা যেতে পারে। এর জন্য ভ্যালিডেটর কীগুলি ইম্পোর্ট করা, পুরস্কার সংগ্রহ করার জন্য ঠিকানা সেট করা এবং তারপরে প্রি-কনফিগার করা ভ্যালিডেটর প্রক্রিয়া শুরু করা প্রয়োজন। নীচের উদাহরণটি লাইটহাউসের জন্য—অন্যান্য কনসেন্সাস ক্লায়েন্টের জন্য নির্দেশাবলী [Arm ডক্স-এর উপর ইথেরিয়াম](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/)-এ উপলব্ধ: + +```shell +# ভ্যালিডেটর কীগুলি ইম্পোর্ট করুন +lighthouse account validator import --directory=/home/ethereum/validator_keys + +# পুরস্কারের ঠিকানা সেট করুন +sudo sed -i 's/' /etc/ethereum/lighthouse-validator.conf + +# ভ্যালিডেটর শুরু করুন +sudo systemctl start lighthouse-validator +``` + +অভিনন্দন, আপনার কাছে এখন একটি রাস্পবেরি পাই-তে একটি সম্পূর্ণ ইথেরিয়াম নোড এবং ভ্যালিডেটর চলছে! + +## আরও বিশদ বিবরণ {#more-details} + +এই পৃষ্ঠাটি রাস্পবেরি পাই ব্যবহার করে কীভাবে একটি Geth-Lighthouse নোড এবং ভ্যালিডেটর সেট আপ করতে হয় তার একটি ওভারভিউ দিয়েছে। [Ethereum-on-Arm ওয়েবসাইটে](https://ethereum-on-arm-documentation.readthedocs.io/en/latest/index.html)-এ আরও বিস্তারিত নির্দেশাবলী উপলব্ধ। + +## মতামত প্রশংসিত {#feedback-appreciated} + +আমরা জানি যে রাস্পবেরি পাই-এর একটি বিশাল ব্যবহারকারী বেস রয়েছে যা ইথেরিয়াম নেটওয়ার্কের স্বাস্থ্যের উপর খুব ইতিবাচক প্রভাব ফেলতে পারে। +অনুগ্রহ করে এই টিউটোরিয়ালের বিশদ বিবরণগুলি দেখুন, টেস্টনেটে চালানোর চেষ্টা করুন, Arm GitHub-এ ইথেরিয়াম দেখুন, প্রতিক্রিয়া জানান, সমস্যা উত্থাপন করুন এবং পুল রিকোয়েস্ট করুন এবং প্রযুক্তি এবং নথিপত্রকে এগিয়ে নিতে সাহায্য করুন! + +## রেফারেন্স {#references} + +1. https://ubuntu.com/download/raspberry-pi +2. https://wikipedia.org/wiki/Port_forwarding +3. https://prometheus.io +4. https://grafana.com +5. https://forum.armbian.com/topic/5565-zram-vs-swap/ +6. https://geth.ethereum.org +7. https://nethermind.io +8. https://www.hyperledger.org/projects/besu +9. https://github.com/prysmaticlabs/prysm +10. https://lighthouse.sigmaprime.io +11. https://ethersphere.github.io/swarm-home +12. https://raiden.network +13. https://ipfs.io +14. https://status.im +15. https://vipnode.org diff --git a/public/content/translations/bn/developers/tutorials/scam-token-tricks/index.md b/public/content/translations/bn/developers/tutorials/scam-token-tricks/index.md new file mode 100644 index 00000000000..16385015257 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/scam-token-tricks/index.md @@ -0,0 +1,470 @@ +--- +title: "স্ক্যাম টোকেন দ্বারা ব্যবহৃত কিছু কৌশল এবং সেগুলি কীভাবে সনাক্ত করা যায়" +description: "এই টিউটোরিয়ালে আমরা একটি স্ক্যাম টোকেনকে ব্যবচ্ছেদ করে দেখব যে স্ক্যামাররা কী কী কৌশল খেলে, তারা কীভাবে সেগুলি প্রয়োগ করে এবং আমরা কীভাবে সেগুলি সনাক্ত করতে পারি।" +author: Ori Pomerantz +tags: + [ + "স্ক্যাম", + "সলিডিটি", + "erc-20", + "javascript", + "typescript" + ] +skill: intermediate +published: 2023-09-15 +lang: bn +--- + +এই টিউটোরিয়ালে আমরা স্ক্যামাররা কী কী কৌশল ব্যবহার করে এবং কীভাবে তারা সেগুলি প্রয়োগ করে তা দেখতে [একটি স্ক্যাম টোকেন](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code) ব্যবচ্ছেদ করব। টিউটোরিয়ালের শেষে আপনি ERC-20 টোকেন চুক্তি, তাদের ক্ষমতা এবং কেন সন্দেহবাদিতা প্রয়োজন সে সম্পর্কে আরও বিস্তৃত ধারণা পাবেন। তারপর আমরা সেই স্ক্যাম টোকেন দ্বারা নির্গত ইভেন্টগুলি দেখব এবং দেখব যে এটি স্বয়ংক্রিয়ভাবে বৈধ নয় তা আমরা কীভাবে সনাক্ত করতে পারি। + +## স্ক্যাম টোকেন - সেগুলি কী, কেন মানুষ সেগুলি তৈরি করে এবং কীভাবে সেগুলি এড়ানো যায় {#scam-tokens} + +Ethereum-এর অন্যতম সাধারণ ব্যবহার হল একটি গোষ্ঠীর জন্য একটি ট্রেডযোগ্য টোকেন তৈরি করা, এক অর্থে তাদের নিজস্ব মুদ্রা। যাইহোক, যেখানেই মূল্য নিয়ে আসে এমন বৈধ ব্যবহারের ক্ষেত্র রয়েছে, সেখানে অপরাধীরাও রয়েছে যারা নিজেদের জন্য সেই মূল্য চুরি করার চেষ্টা করে। + +আপনি ব্যবহারকারীর দৃষ্টিকোণ থেকে [ethereum.org-এর অন্যত্র](/guides/how-to-id-scam-tokens/) এই বিষয় সম্পর্কে আরও পড়তে পারেন। এই টিউটোরিয়ালটি একটি স্ক্যাম টোকেন ব্যবচ্ছেদ করার উপর দৃষ্টি নিবদ্ধ করে এটি কীভাবে করা হয় এবং কীভাবে এটি সনাক্ত করা যায় তা দেখার জন্য। + +### আমি কীভাবে জানব যে wARB একটি স্ক্যাম? {#warb-scam} + +আমরা যে টোকেনটি ব্যবচ্ছেদ করছি তা হল [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code), যা বৈধ [ARB টোকেন](https://etherscan.io/token/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1)-এর সমতুল্য হওয়ার ভান করে। + +কোনটি বৈধ টোকেন তা জানার সবচেয়ে সহজ উপায় হল উৎপত্তিস্থল সংস্থা, [Arbitrum](https://arbitrum.foundation/)-এর দিকে নজর দেওয়া। বৈধ ঠিকানাগুলি [তাদের নথিপত্রে](https://docs.arbitrum.foundation/deployment-addresses#token) নির্দিষ্ট করা আছে। + +### সোর্স কোড কেন পাওয়া যায়? {#why-source} + +সাধারণত আমরা আশা করি যে যারা অন্যদের স্ক্যাম করার চেষ্টা করে তারা গোপনীয় হবে এবং প্রকৃতপক্ষে অনেক স্ক্যাম টোকেনের কোড উপলব্ধ থাকে না (উদাহরণস্বরূপ, [এইটি](https://optimistic.etherscan.io/token/0x15992f382d8c46d667b10dc8456dc36651af1452#code) এবং [এইটি](https://optimistic.etherscan.io/token/0x026b623eb4aada7de37ef25256854f9235207178#code))। + +যাইহোক, বৈধ টোকেনগুলি সাধারণত তাদের সোর্স কোড প্রকাশ করে, তাই বৈধ বলে মনে হওয়ার জন্য স্ক্যাম টোকেনগুলির লেখকরাও কখনও কখনও একই কাজ করে। [wARB](https://etherscan.io/token/0xb047c8032b99841713b8e3872f06cf32beb27b82#code) সেইসব টোকেনগুলির মধ্যে একটি যার সোর্স কোড উপলব্ধ রয়েছে, যা এটিকে বোঝা সহজ করে তোলে। + +যদিও চুক্তি স্থাপনকারীরা সোর্স কোড প্রকাশ করবেন কিনা তা বেছে নিতে পারেন, তারা ভুল সোর্স কোড প্রকাশ করতে _পারেন না_। ব্লক এক্সপ্লোরার স্বাধীনভাবে প্রদত্ত সোর্স কোড কম্পাইল করে, এবং যদি এটি একই বাইটকোড না পায়, তবে এটি সেই সোর্স কোড প্রত্যাখ্যান করে। [আপনি Etherscan সাইটে এই সম্পর্কে আরও পড়তে পারেন](https://etherscan.io/verifyContract)। + +## বৈধ ERC-20 টোকেনের সাথে তুলনা {#compare-legit-erc20} + +আমরা এই টোকেনটিকে বৈধ ERC-20 টোকেনগুলির সাথে তুলনা করতে যাচ্ছি। বৈধ ERC-20 টোকেনগুলি সাধারণত কীভাবে লেখা হয় তার সাথে যদি আপনি পরিচিত না হন, [এই টিউটোরিয়ালটি দেখুন](/developers/tutorials/erc20-annotated-code/)। + +### বিশেষ সুবিধাপ্রাপ্ত ঠিকানার জন্য কনস্ট্যান্ট {#constants-for-privileged-addresses} + +চুক্তিতে কখনও কখনও বিশেষ সুবিধাপ্রাপ্ত ঠিকানার প্রয়োজন হয়। দীর্ঘমেয়াদী ব্যবহারের জন্য ডিজাইন করা চুক্তিগুলি কিছু বিশেষ সুবিধাপ্রাপ্ত ঠিকানাকে সেই ঠিকানাগুলি পরিবর্তন করার অনুমতি দেয়, উদাহরণস্বরূপ একটি নতুন মাল্টিসিগ চুক্তির ব্যবহার সক্ষম করতে। এটি করার বিভিন্ন উপায় আছে। + +[`HOP` টোকেন চুক্তি](https://etherscan.io/address/0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc#code) [`Ownable`](https://docs.openzeppelin.com/contracts/2.x/access-control#ownership-and-ownable) প্যাটার্ন ব্যবহার করে। বিশেষ সুবিধাপ্রাপ্ত ঠিকানাটি স্টোরেজে রাখা হয়, `_owner` নামক একটি ফিল্ডে (তৃতীয় ফাইলটি দেখুন, `Ownable.sol`)। + +```solidity +abstract contract Ownable is Context { + address private _owner; + . + . + . +} +``` + +[`ARB` টোকেন চুক্তিতে](https://etherscan.io/address/0xad0c361ef902a7d9851ca7dcc85535da2d3c6fc7#code) সরাসরি কোনো বিশেষ সুবিধাপ্রাপ্ত ঠিকানা নেই। যাইহোক, এর একটির প্রয়োজন নেই। এটি [`0xb50721bcf8d664c30412cfbc6cf7a15145234ad1` ঠিকানায়](https://etherscan.io/address/0xb50721bcf8d664c30412cfbc6cf7a15145234ad1#code) একটি [`proxy`](https://docs.openzeppelin.com/contracts/5.x/api/proxy)-এর পিছনে বসে। সেই চুক্তিতে একটি বিশেষ সুবিধাপ্রাপ্ত ঠিকানা রয়েছে (চতুর্থ ফাইলটি দেখুন, `ERC1967Upgrade.sol`) যা আপগ্রেডের জন্য ব্যবহার করা যেতে পারে। + +```solidity + /** + * @dev EIP1967 অ্যাডমিন স্লটে একটি নতুন ঠিকানা স্টোর করে। + */ + function _setAdmin(address newAdmin) private { + require(newAdmin != address(0), "ERC1967: new admin is the zero address"); + StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin; + } +``` + +বিপরীতে, `wARB` চুক্তিতে একটি হার্ড কোডেড `contract_owner` আছে। + +```solidity +contract WrappedArbitrum is Context, IERC20 { + . + . + . + address deployer = 0xB50721BCf8d664c30412Cfbc6cf7a15145234ad1; + address public contract_owner = 0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33; + . + . + . +} +``` + +[এই চুক্তির মালিক](https://etherscan.io/address/0xb40dE7b1beE84Ff2dc22B70a049A07A13a411A33) এমন কোনো চুক্তি নয় যা বিভিন্ন সময়ে বিভিন্ন অ্যাকাউন্ট দ্বারা নিয়ন্ত্রিত হতে পারে, বরং একটি [বাহ্যিকভাবে মালিকানাধীন অ্যাকাউন্ট](/developers/docs/accounts/#externally-owned-accounts-and-key-pairs)। এর মানে হল যে এটি সম্ভবত একজন ব্যক্তির দ্বারা স্বল্পমেয়াদী ব্যবহারের জন্য ডিজাইন করা হয়েছে, মূল্যবান থাকবে এমন একটি ERC-20 নিয়ন্ত্রণ করার জন্য দীর্ঘমেয়াদী সমাধান হিসাবে নয়। + +এবং প্রকৃতপক্ষে, যদি আমরা Etherscan-এ দেখি, আমরা দেখতে পাই যে স্ক্যামারটি 19 মে, 2023-এর সময় মাত্র 12 ঘণ্টার জন্য এই চুক্তিটি ব্যবহার করেছে ([প্রথম লেনদেন](https://etherscan.io/tx/0xf49136198c3f925fcb401870a669d43cecb537bde36eb8b41df77f06d5f6fbc2) থেকে [শেষ লেনদেন](https://etherscan.io/tx/0xdfd6e717157354e64bbd5d6adf16761e5a5b3f914b1948d3545d39633244d47b))। + +### নকল `_transfer` ফাংশন {#the-fake-transfer-function} + +[একটি অভ্যন্তরীণ `_transfer` ফাংশন](/developers/tutorials/erc20-annotated-code/#the-_transfer-function-_transfer) ব্যবহার করে প্রকৃত স্থানান্তর হওয়াটা স্ট্যান্ডার্ড। + +`wARB`-এ এই ফাংশনটি প্রায় বৈধ দেখায়: + +```solidity + function _transfer(address sender, address recipient, uint256 amount) internal virtual{ + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _beforeTokenTransfer(sender, recipient, amount); + + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); + if (sender == contract_owner){ + sender = deployer; + } + emit Transfer(sender, recipient, amount); + } +``` + +সন্দেহজনক অংশটি হল: + +```solidity + if (sender == contract_owner){ + sender = deployer; + } + emit Transfer(sender, recipient, amount); +``` + +যদি চুক্তির মালিক টোকেন পাঠান, তাহলে `Transfer` ইভেন্টটি কেন দেখায় যে সেগুলি `deployer` থেকে এসেছে? + +যাইহোক, একটি আরো গুরুত্বপূর্ণ সমস্যা আছে। এই `_transfer` ফাংশন কে কল করে? এটিকে বাইরে থেকে কল করা যায় না, এটি `internal` হিসাবে চিহ্নিত করা হয়েছে। এবং আমাদের কাছে থাকা কোডে `_transfer`-এ কোনো কল অন্তর্ভুক্ত নেই। স্পষ্টতই, এটি এখানে একটি ফাঁদ হিসাবে রয়েছে। + +```solidity + function transfer(address recipient, uint256 amount) public virtual override returns (bool) { + _f_(_msgSender(), recipient, amount); + return true; + } + + function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { + _f_(sender, recipient, amount); + _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); + return true; + } +``` + +যখন আমরা টোকেন স্থানান্তর করার জন্য কল করা ফাংশনগুলি দেখি, `transfer` এবং `transferFrom`, আমরা দেখি যে তারা একটি সম্পূর্ণ ভিন্ন ফাংশন, `_f_` কল করে। + +### আসল `_f_` ফাংশন {#the-real-f-function} + +```solidity + function _f_(address sender, address recipient, uint256 amount) internal _mod_(sender,recipient,amount) virtual { + require(sender != address(0), "ERC20: transfer from the zero address"); + require(recipient != address(0), "ERC20: transfer to the zero address"); + + _beforeTokenTransfer(sender, recipient, amount); + + _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); + _balances[recipient] = _balances[recipient].add(amount); + if (sender == contract_owner){ + + sender = deployer; + } + emit Transfer(sender, recipient, amount); + } +``` + +এই ফাংশনে দুটি সম্ভাব্য লাল পতাকা রয়েছে। + +- [ফাংশন মডিফায়ার](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm) `_mod_`-এর ব্যবহার। যাইহোক, যখন আমরা সোর্স কোডটি দেখি তখন আমরা দেখতে পাই যে `_mod_` আসলে নিরীহ। + + ```solidity + modifier _mod_(address sender, address recipient, uint256 amount){ + _; + } + ``` + +- একই সমস্যা আমরা `_transfer`-এ দেখেছি, যা হল যখন `contract_owner` টোকেন পাঠায় তখন সেগুলি `deployer` থেকে এসেছে বলে মনে হয়। + +### নকল ইভেন্ট ফাংশন `dropNewTokens` {#the-fake-events-function-dropNewTokens} + +এখন আমরা এমন কিছুতে এসেছি যা একটি আসল স্ক্যামের মতো দেখাচ্ছে। আমি পঠনযোগ্যতার জন্য ফাংশনটি কিছুটা সম্পাদনা করেছি, কিন্তু এটি কার্যকরীভাবে সমতুল্য। + +```solidity +function dropNewTokens(address uPool, + address[] memory eReceiver, + uint256[] memory eAmounts) public auth() +``` + +এই ফাংশনে `auth()` মডিফায়ার রয়েছে, যার মানে এটি শুধুমাত্র চুক্তির মালিক দ্বারা কল করা যেতে পারে। + +```solidity +modifier auth() { + require(msg.sender == contract_owner, "Not allowed to interact"); + _; +} +``` + +এই সীমাবদ্ধতাটি নিখুঁত অর্থবহ, কারণ আমরা চাই না যে এলোমেলো অ্যাকাউন্টগুলি টোকেন বিতরণ করুক। যাইহোক, ফাংশনের বাকি অংশ সন্দেহজনক। + +```solidity +{ + for (uint256 i = 0; i < eReceiver.length; i++) { + emit Transfer(uPool, eReceiver[i], eAmounts[i]); + } +} +``` + +একটি পুল অ্যাকাউন্ট থেকে রিসিভারদের একটি অ্যারেতে একটি পরিমাণের অ্যারে স্থানান্তর করার জন্য একটি ফাংশন নিখুঁত অর্থবহ। অনেক ব্যবহারের ক্ষেত্রে আপনি একটি একক উৎস থেকে একাধিক গন্তব্যে টোকেন বিতরণ করতে চাইবেন, যেমন পে-রোল, এয়ারড্রপ ইত্যাদি। একাধিক লেনদেন ইস্যু করার পরিবর্তে একটি একক লেনদেনে এটি করা (গ্যাস-এর দিক থেকে) সস্তা, অথবা এমনকি একই লেনদেনের অংশ হিসাবে একটি ভিন্ন চুক্তি থেকে একাধিকবার ERC-20 কল করা। + +যাইহোক, `dropNewTokens` তা করে না। এটি [`Transfer` ইভেন্ট](https://eips.ethereum.org/EIPS/eip-20#transfer-1) নির্গত করে, কিন্তু আসলে কোনো টোকেন স্থানান্তর করে না। অফচেইন অ্যাপ্লিকেশনগুলিকে এমন একটি স্থানান্তরের কথা বলে বিভ্রান্ত করার কোনো বৈধ কারণ নেই যা আসলে ঘটেনি। + +### বার্নিং `Approve` ফাংশন {#the-burning-approve-function} + +ERC-20 চুক্তিগুলিতে ভাতাগুলির জন্য [একটি `approve` ফাংশন](/developers/tutorials/erc20-annotated-code/#approve) থাকার কথা, এবং প্রকৃতপক্ষে আমাদের স্ক্যাম টোকেনের এমন একটি ফাংশন রয়েছে এবং এটি এমনকি সঠিক। যাইহোক, যেহেতু Solidity C থেকে এসেছে, তাই এটি কেস সংবেদনশীল। "Approve" এবং "approve" ভিন্ন স্ট্রিং। + +এছাড়াও, কার্যকারিতা `approve`-এর সাথে সম্পর্কিত নয়। + +```solidity + function Approve( + address[] memory holders) +``` + +এই ফাংশনটি টোকেনের হোল্ডারদের জন্য ঠিকানার একটি অ্যারে দিয়ে কল করা হয়। + +```solidity + public approver() { +``` + +`approver()` মডিফায়ার নিশ্চিত করে যে শুধুমাত্র `contract_owner`-কে এই ফাংশনটি কল করার অনুমতি দেওয়া হয়েছে (নীচে দেখুন)। + +```solidity + for (uint256 i = 0; i < holders.length; i++) { + uint256 amount = _balances[holders[i]]; + _beforeTokenTransfer(holders[i], 0x0000000000000000000000000000000000000001, amount); + _balances[holders[i]] = _balances[holders[i]].sub(amount, + "ERC20: burn amount exceeds balance"); + _balances[0x0000000000000000000000000000000000000001] = + _balances[0x0000000000000000000000000000000000000001].add(amount); + } + } + +``` + +প্রতিটি হোল্ডার ঠিকানার জন্য ফাংশনটি হোল্ডারের সম্পূর্ণ ব্যালেন্স `0x00...01` ঠিকানায় স্থানান্তরিত করে, কার্যকরভাবে এটিকে বার্ন করে (স্ট্যান্ডার্ডে প্রকৃত `burn` মোট সরবরাহও পরিবর্তন করে, এবং টোকেনগুলিকে `0x00...00`-এ স্থানান্তর করে)। এর মানে হল যে `contract_owner` যেকোনো ব্যবহারকারীর সম্পদ সরিয়ে ফেলতে পারে। এটি একটি গভর্নেন্স টোকেনে আপনি চাইবেন এমন একটি বৈশিষ্ট্য বলে মনে হয় না। + +### কোড মানের সমস্যা {#code-quality-issues} + +এই কোড মানের সমস্যাগুলি _প্রমাণ_ করে না যে এই কোডটি একটি স্ক্যাম, তবে তারা এটিকে সন্দেহজনক করে তোলে। Arbitrum-এর মতো সংগঠিত কোম্পানিগুলো সাধারণত এত খারাপ কোড প্রকাশ করে না। + +#### `mount` ফাংশন {#the-mount-function} + +যদিও এটি [স্ট্যান্ডার্ডে](https://eips.ethereum.org/EIPS/eip-20) নির্দিষ্ট করা নেই, সাধারণভাবে বলতে গেলে নতুন টোকেন তৈরি করার ফাংশনকে [`mint`](https://ethereum.org/el/developers/tutorials/erc20-annotated-code/#the-_mint-and-_burn-functions-_mint-and-_burn) বলা হয়। + +যদি আমরা `wARB` কনস্ট্রাক্টরের দিকে তাকাই, আমরা দেখতে পাই যে মিন্ট ফাংশনটির নাম কোনো কারণে `mount` করা হয়েছে, এবং দক্ষতার জন্য সম্পূর্ণ পরিমাণের জন্য একবারের পরিবর্তে প্রাথমিক সরবরাহের এক পঞ্চমাংশ দিয়ে পাঁচবার কল করা হয়েছে। + +```solidity + constructor () public { + + _name = "Wrapped Arbitrum"; + _symbol = "wARB"; + _decimals = 18; + uint256 initialSupply = 1000000000000; + + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + mount(deployer, initialSupply*(10**18)/5); + } +``` + +`mount` ফাংশনটিও সন্দেহজনক। + +```solidity + function mount(address account, uint256 amount) public { + require(msg.sender == contract_owner, "ERC20: mint to the zero address"); +``` + +`require`-এর দিকে তাকালে আমরা দেখি যে শুধুমাত্র চুক্তির মালিককেই মিন্ট করার অনুমতি দেওয়া হয়েছে। এটা বৈধ। কিন্তু ত্রুটির বার্তাটি হওয়া উচিত _শুধুমাত্র মালিককে মিন্ট করার অনুমতি দেওয়া হয়েছে_ বা এই জাতীয় কিছু। পরিবর্তে, এটি অপ্রাসঙ্গিক _ERC20: mint to the zero address_। শূন্য ঠিকানায় মিন্ট করার জন্য সঠিক পরীক্ষা হল `require(account != address(0), "")`, যা চুক্তিটি কখনও পরীক্ষা করার প্রয়োজন বোধ করে না। + +```solidity + _totalSupply = _totalSupply.add(amount); + _balances[contract_owner] = _balances[contract_owner].add(amount); + emit Transfer(address(0), account, amount); + } +``` + +মিন্টিংয়ের সাথে সরাসরি সম্পর্কিত আরও দুটি সন্দেহজনক তথ্য রয়েছে: + +- একটি `account` প্যারামিটার রয়েছে, যা সম্ভবত সেই অ্যাকাউন্ট যা মিন্ট করা পরিমাণ গ্রহণ করবে। কিন্তু যে ব্যালেন্সটি বৃদ্ধি পায় তা আসলে `contract_owner`-এর। + +- যদিও বর্ধিত ব্যালেন্স `contract_owner`-এর অন্তর্গত, নির্গত ইভেন্টটি `account`-এ একটি স্থানান্তর দেখায়। + +### কেন `auth` এবং `approver` দুটোই? কেন `mod` যা কিছুই করে না? {#why-both-autho-and-approver-why-the-mod-that-does-nothing} + +এই চুক্তিতে তিনটি মডিফায়ার রয়েছে: `_mod_`, `auth`, এবং `approver`। + +```solidity + modifier _mod_(address sender, address recipient, uint256 amount){ + _; + } +``` + +`_mod_` তিনটি প্যারামিটার নেয় এবং তাদের সাথে কিছুই করে না। এটি কেন আছে? + +```solidity + modifier auth() { + require(msg.sender == contract_owner, "Not allowed to interact"); + _; + } + + modifier approver() { + require(msg.sender == contract_owner, "Not allowed to interact"); + _; + } +``` + +`auth` এবং `approver` আরও অর্থবহ, কারণ তারা পরীক্ষা করে যে চুক্তিটি `contract_owner` দ্বারা কল করা হয়েছিল। আমরা আশা করব যে মিন্টিংয়ের মতো নির্দিষ্ট কিছু সুবিধাপ্রাপ্ত ক্রিয়া সেই অ্যাকাউন্টে সীমাবদ্ধ থাকবে। যাইহোক, দুটি পৃথক ফাংশন থাকার মানে কী যা _ঠিক একই কাজ_ করে? + +## আমরা স্বয়ংক্রিয়ভাবে কী সনাক্ত করতে পারি? {#what-can-we-detect-automatically} + +আমরা Etherscan দেখে বুঝতে পারি যে `wARB` একটি স্ক্যাম টোকেন। যাইহোক, এটি একটি কেন্দ্রীভূত সমাধান। তাত্ত্বিকভাবে, Etherscan-কে বিপর্যস্ত বা হ্যাক করা যেতে পারে। একটি টোকেন বৈধ কি না তা স্বাধীনভাবে বের করতে পারা ভালো। + +একটি ERC-20 টোকেন সন্দেহজনক কিনা (হয় একটি স্ক্যাম বা খুব খারাপভাবে লেখা) তা সনাক্ত করতে আমরা কিছু কৌশল ব্যবহার করতে পারি, তারা যে ইভেন্টগুলি নির্গত করে তা দেখে। + +## সন্দেহজনক `Approval` ইভেন্ট {#suspicious-approval-events} + +[`Approval` ইভেন্টগুলি](https://eips.ethereum.org/EIPS/eip-20#approval) শুধুমাত্র একটি সরাসরি অনুরোধের সাথে ঘটা উচিত ([`Transfer` ইভেন্টগুলির](https://eips.ethereum.org/EIPS/eip-20#transfer-1) বিপরীতে যা একটি ভাতার ফলস্বরূপ ঘটতে পারে)। এই সমস্যার বিস্তারিত ব্যাখ্যা এবং কেন অনুরোধগুলি সরাসরি হতে হবে, একটি চুক্তির মাধ্যমে মধ্যস্থতা না করে, তার জন্য [Solidity ডক্স দেখুন](https://docs.soliditylang.org/en/v0.8.20/security-considerations.html#tx-origin)। + +এর মানে হল যে `Approval` ইভেন্টগুলি যা একটি [বাহ্যিকভাবে মালিকানাধীন অ্যাকাউন্ট](/developers/docs/accounts/#types-of-account) থেকে ব্যয় অনুমোদন করে সেগুলিকে সেই অ্যাকাউন্টে উদ্ভূত লেনদেন থেকে আসতে হবে, এবং যার গন্তব্য হল ERC-20 চুক্তি। একটি বাহ্যিকভাবে মালিকানাধীন অ্যাকাউন্ট থেকে অন্য যেকোনো ধরনের অনুমোদন সন্দেহজনক। + +এখানে [viem](https://viem.sh/) এবং [TypeScript](https://www.typescriptlang.org/docs/), টাইপ সুরক্ষাসহ একটি JavaScript ভেরিয়েন্ট ব্যবহার করে [এই ধরনের ইভেন্ট শনাক্তকারী একটি প্রোগ্রাম](https://github.com/qbzzt/20230915-scam-token-detection) দেওয়া হলো। এটি চালানোর জন্য: + +1. `.env.example`-কে `.env`-এ কপি করুন। +2. একটি Ethereum mainnet নোডের URL সরবরাহ করতে `.env` সম্পাদনা করুন। +3. প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করতে `pnpm install` চালান। +4. সন্দেহজনক অনুমোদনগুলি খুঁজতে `pnpm susApproval` চালান। + +এখানে একটি লাইন-বাই-লাইন ব্যাখ্যা দেওয়া হল: + +```typescript +import { + Address, + TransactionReceipt, + createPublicClient, + http, + parseAbiItem, +} from "viem" +import { mainnet } from "viem/chains" +``` + +`viem` থেকে টাইপ সংজ্ঞা, ফাংশন এবং চেইন সংজ্ঞা ইম্পোর্ট করুন। + +```typescript +import { config } from "dotenv" +config() +``` + +URL পেতে `.env` পড়ুন। + +```typescript +const client = createPublicClient({ + chain: mainnet, + transport: http(process.env.URL), +}) +``` + +একটি Viem ক্লায়েন্ট তৈরি করুন। আমাদের কেবল ব্লকচেইন থেকে পড়তে হবে, তাই এই ক্লায়েন্টের একটি প্রাইভেট কী-এর প্রয়োজন নেই। + +```typescript +const testedAddress = "0xb047c8032b99841713b8e3872f06cf32beb27b82" +const fromBlock = 16859812n +const toBlock = 16873372n +``` + +সন্দেহজনক ERC-20 চুক্তির ঠিকানা, এবং যে ব্লকগুলির মধ্যে আমরা ইভেন্টগুলি খুঁজব। নোড প্রদানকারীরা সাধারণত ইভেন্টগুলি পড়ার আমাদের ক্ষমতা সীমাবদ্ধ করে কারণ ব্যান্ডউইথ ব্যয়বহুল হতে পারে। সৌভাগ্যবশত `wARB` আঠারো ঘণ্টার জন্য ব্যবহারে ছিল না, তাই আমরা সমস্ত ইভেন্টগুলি সন্ধান করতে পারি (মোট মাত্র 13টি ছিল)। + +```typescript +const approvalEvents = await client.getLogs({ + address: testedAddress, + fromBlock, + toBlock, + event: parseAbiItem( + "event Approval(address indexed _owner, address indexed _spender, uint256 _value)" + ), +}) +``` + +Viem-কে ইভেন্টের তথ্য জিজ্ঞাসা করার এটিই উপায়। যখন আমরা এটিকে ফিল্ডের নামসহ সঠিক ইভেন্ট স্বাক্ষর সরবরাহ করি, তখন এটি আমাদের জন্য ইভেন্টটিকে পার্স করে। + +```typescript +const isContract = async (addr: Address): boolean => + await client.getBytecode({ address: addr }) +``` + +আমাদের অ্যালগরিদম শুধুমাত্র বাহ্যিকভাবে মালিকানাধীন অ্যাকাউন্টের জন্য প্রযোজ্য। যদি `client.getBytecode` দ্বারা কোনো বাইটকোড ফেরত দেওয়া হয় তবে এর মানে হল এটি একটি চুক্তি এবং আমাদের এটি এড়িয়ে যাওয়া উচিত। + +আপনি যদি আগে TypeScript ব্যবহার না করে থাকেন, তবে ফাংশন সংজ্ঞাটি কিছুটা অদ্ভুত লাগতে পারে। আমরা কেবল এটি বলি না যে প্রথম (এবং একমাত্র) প্যারামিটারটিকে `addr` বলা হয়, বরং এটি `Address` টাইপের। একইভাবে, `: boolean` অংশটি TypeScript-কে বলে যে ফাংশনের রিটার্ন মান একটি বুলিয়ান। + +```typescript +const getEventTxn = async (ev: Event): TransactionReceipt => + await client.getTransactionReceipt({ hash: ev.transactionHash }) +``` + +এই ফাংশনটি একটি ইভেন্ট থেকে লেনদেনের রসিদ পায়। লেনদেনের গন্তব্য কী ছিল তা নিশ্চিত করার জন্য আমাদের রসিদ প্রয়োজন। + +```typescript +const suspiciousApprovalEvent = async (ev : Event) : (Event | null) => { +``` + +এটি সবচেয়ে গুরুত্বপূর্ণ ফাংশন, যা আসলে সিদ্ধান্ত নেয় যে একটি ইভেন্ট সন্দেহজনক কিনা। রিটার্ন টাইপ, `(Event | null)`, TypeScript-কে বলে যে এই ফাংশনটি হয় একটি `Event` বা `null` রিটার্ন করতে পারে। ইভেন্টটি সন্দেহজনক না হলে আমরা `null` রিটার্ন করি। + +```typescript +const owner = ev.args._owner +``` + +Viem-এর কাছে ফিল্ডের নাম আছে, তাই এটি আমাদের জন্য ইভেন্টটি পার্স করেছে। `_owner` হল ব্যয় করা টোকেনের মালিক। + +```typescript +// চুক্তি দ্বারা অনুমোদনগুলি সন্দেহজনক নয় +if (await isContract(owner)) return null +``` + +মালিক যদি একটি চুক্তি হয়, ধরে নিন এই অনুমোদনটি সন্দেহজনক নয়। একটি চুক্তির অনুমোদন সন্দেহজনক কিনা তা পরীক্ষা করার জন্য আমাদের লেনদেনের সম্পূর্ণ এক্সিকিউশন ট্রেস করতে হবে তা দেখতে এটি কখনও মালিক চুক্তিতে পৌঁছেছে কিনা, এবং যদি সেই চুক্তিটি সরাসরি ERC-20 চুক্তিটিকে কল করে থাকে। এটি আমরা যা করতে চাই তার চেয়ে অনেক বেশি রিসোর্স ব্যয়বহুল। + +```typescript +const txn = await getEventTxn(ev) +``` + +যদি অনুমোদনটি একটি বাহ্যিকভাবে মালিকানাধীন অ্যাকাউন্ট থেকে আসে, তবে যে লেনদেনটি এটি ঘটিয়েছে তা পান। + +```typescript +// অনুমোদনটি সন্দেহজনক যদি এটি একটি EOA মালিকের কাছ থেকে আসে যা লেনদেনের `from` নয় +if (owner.toLowerCase() != txn.from.toLowerCase()) return ev +``` + +আমরা শুধু স্ট্রিং সমতার জন্য পরীক্ষা করতে পারি না কারণ ঠিকানাগুলি হেক্সাডেসিমেল, তাই সেগুলিতে অক্ষর থাকে। কখনও কখনও, উদাহরণস্বরূপ `txn.from`-এ, সেই অক্ষরগুলি সবই ছোট হাতের। অন্যান্য ক্ষেত্রে, যেমন `ev.args._owner`, ঠিকানাটি [ত্রুটি শনাক্তকরণের জন্য মিশ্র-কেসে](https://eips.ethereum.org/EIPS/eip-55) থাকে। + +কিন্তু যদি লেনদেনটি মালিকের কাছ থেকে না হয়, এবং সেই মালিক বাহ্যিকভাবে মালিকানাধীন হয়, তাহলে আমাদের কাছে একটি সন্দেহজনক লেনদেন রয়েছে। + +```typescript +// এটিও সন্দেহজনক যদি লেনদেনের গন্তব্যটি আমরা তদন্ত করছি এমন ERC-20 চুক্তি না হয় +// +if (txn.to.toLowerCase() != testedAddress) return ev +``` + +একইভাবে, যদি লেনদেনের `to` ঠিকানা, প্রথম কল করা চুক্তিটি, তদন্তাধীন ERC-20 চুক্তি না হয় তবে এটি সন্দেহজনক। + +```typescript + // যদি সন্দেহ করার কোনো কারণ না থাকে, তাহলে null রিটার্ন করুন। + return null +} +``` + +যদি কোনো শর্তই সত্য না হয়, তাহলে `Approval` ইভেন্টটি সন্দেহজনক নয়। + +```typescript +const testPromises = approvalEvents.map((ev) => suspiciousApprovalEvent(ev)) +const testResults = (await Promise.all(testPromises)).filter((x) => x != null) + +console.log(testResults) +``` + +[একটি `async` ফাংশন](https://www.w3schools.com/js/js_async.asp) একটি `Promise` অবজেক্ট রিটার্ন করে। সাধারণ সিনট্যাক্স, `await x()` দিয়ে, আমরা প্রসেসিং চালিয়ে যাওয়ার আগে সেই `Promise`-এর পূরণ হওয়ার জন্য অপেক্ষা করি। এটি প্রোগ্রাম করা এবং অনুসরণ করা সহজ, তবে এটি অদক্ষও। যখন আমরা একটি নির্দিষ্ট ইভেন্টের জন্য `Promise`-এর পূরণ হওয়ার জন্য অপেক্ষা করছি, আমরা ইতিমধ্যেই পরবর্তী ইভেন্টে কাজ শুরু করতে পারি। + +এখানে আমরা `Promise` অবজেক্টের একটি অ্যারে তৈরি করতে [`map`](https://www.w3schools.com/jsref/jsref_map.asp) ব্যবহার করি। তারপর আমরা সেই সমস্ত প্রতিশ্রুতির সমাধান হওয়ার জন্য অপেক্ষা করতে [`Promise.all`](https://www.javascripttutorial.net/es6/javascript-promise-all/) ব্যবহার করি। তারপর আমরা সেই ফলাফলগুলিকে [`filter`](https://www.w3schools.com/jsref/jsref_filter.asp) করে অ-সন্দেহজনক ইভেন্টগুলি সরিয়ে দিই। + +### সন্দেহজনক `Transfer` ইভেন্ট {#suspicious-transfer-events} + +স্ক্যাম টোকেন শনাক্ত করার আরেকটি সম্ভাব্য উপায় হল তাদের কোনো সন্দেহজনক স্থানান্তর আছে কিনা তা দেখা। উদাহরণস্বরূপ, যে অ্যাকাউন্টগুলিতে এত টোকেন নেই সেখান থেকে স্থানান্তর। আপনি [এই পরীক্ষাটি কীভাবে বাস্তবায়ন করবেন তা দেখতে পারেন](https://github.com/qbzzt/20230915-scam-token-detection/blob/main/susTransfer.ts), কিন্তু `wARB`-এর এই সমস্যা নেই। + +## উপসংহার {#conclusion} + +ERC-20 স্ক্যামের স্বয়ংক্রিয় সনাক্তকরণ [ফলস নেগেটিভ](https://en.wikipedia.org/wiki/False_positives_and_false_negatives#False_negative_error) সমস্যায় ভোগে, কারণ একটি স্ক্যাম একটি সম্পূর্ণ স্বাভাবিক ERC-20 টোকেন চুক্তি ব্যবহার করতে পারে যা কেবল কোনো বাস্তব কিছু উপস্থাপন করে না। সুতরাং আপনার সর্বদা _একটি বিশ্বস্ত উৎস থেকে টোকেন ঠিকানা পাওয়ার_ চেষ্টা করা উচিত। + +স্বয়ংক্রিয় সনাক্তকরণ কিছু ক্ষেত্রে সাহায্য করতে পারে, যেমন DeFi অংশগুলিতে, যেখানে অনেক টোকেন রয়েছে এবং সেগুলি স্বয়ংক্রিয়ভাবে পরিচালনা করা প্রয়োজন। কিন্তু বরাবরের মতোই [caveat emptor](https://www.investopedia.com/terms/c/caveatemptor.asp), আপনার নিজের গবেষণা করুন, এবং আপনার ব্যবহারকারীদেরও একই কাজ করতে উৎসাহিত করুন। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। diff --git a/public/content/translations/bn/developers/tutorials/secret-state/index.md b/public/content/translations/bn/developers/tutorials/secret-state/index.md new file mode 100644 index 00000000000..d68ec14ce98 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/secret-state/index.md @@ -0,0 +1,741 @@ +--- +title: "গোপন স্টেটের জন্য জিরো-নলেজ ব্যবহার করা" +description: "অনচেইন গেমগুলি সীমিত কারণ তারা কোনও লুকানো তথ্য রাখতে পারে না। এই টিউটোরিয়ালটি পড়ার পরে, একজন পাঠক জিরো-নলেজ প্রুফ এবং সার্ভার কম্পোনেন্টগুলিকে একত্রিত করে একটি গোপন স্টেট, অফচেইন, কম্পোনেন্ট সহ যাচাইযোগ্য গেম তৈরি করতে সক্ষম হবেন। এই কৌশলটি একটি মাইনসুইপার গেম তৈরি করে দেখানো হবে।" +author: Ori Pomerantz +tags: + [ + "সার্ভার", + "অফচেইন", + "কেন্দ্রীভূত", + "জিরো-নলেজ", + "zokrates", + "mud" + ] +skill: advanced +lang: bn +published: 2025-03-15 +--- + +_ব্লকচেইনে কোনো গোপনীয়তা নেই_। ব্লকচেইনে যা কিছু পোস্ট করা হয় তা সবার পড়ার জন্য উন্মুক্ত। এটি প্রয়োজনীয়, কারণ ব্লকচেইনটি যে কেউ এটি যাচাই করতে সক্ষম হওয়ার উপর ভিত্তি করে তৈরি। যাইহোক, গেমগুলি প্রায়শই গোপন স্টেটের উপর নির্ভর করে। উদাহরণস্বরূপ, [মাইনসুইপার](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\)) গেমটির কোনো মানেই হয় না যদি আপনি শুধু একটি ব্লকচেইন এক্সপ্লোরারে গিয়ে ম্যাপটি দেখতে পান। + +সবচেয়ে সহজ সমাধান হলো গোপন স্টেট ধরে রাখার জন্য একটি [সার্ভার কম্পোনেন্ট](/developers/tutorials/server-components/) ব্যবহার করা। যাইহোক, আমরা ব্লকচেইন ব্যবহার করার কারণ হল গেম ডেভেলপারের দ্বারা প্রতারণা প্রতিরোধ করা। আমাদের সার্ভার কম্পোনেন্টের সততা নিশ্চিত করতে হবে। সার্ভার স্টেটের একটি হ্যাস প্রদান করতে পারে, এবং [জিরো-নলেজ প্রুফ](/zero-knowledge-proofs/#why-zero-knowledge-proofs-are-important) ব্যবহার করে প্রমাণ করতে পারে যে একটি পদক্ষেপের ফলাফল গণনা করার জন্য ব্যবহৃত স্টেটটি সঠিক। + +এই নিবন্ধটি পড়ার পরে আপনি জানতে পারবেন কিভাবে এই ধরনের গোপন স্টেট হোল্ডিং সার্ভার, স্টেট দেখানোর জন্য একটি ক্লায়েন্ট এবং উভয়ের মধ্যে যোগাযোগের জন্য একটি অনচেইন কম্পোনেন্ট তৈরি করতে হয়। আমরা যে প্রধান টুলসগুলো ব্যবহার করব সেগুলো হলো: + +| টুল | উদ্দেশ্য | সংস্করণে যাচাই করা হয়েছে | +| --------------------------------------------- | --------------------------------------------------- | --------------------------------------: | +| [Zokrates](https://zokrates.github.io/) | জিরো-নলেজ প্রুফ এবং তাদের যাচাইকরণ | 1.1.9 | +| [Typescript](https://www.typescriptlang.org/) | সার্ভার এবং ক্লায়েন্ট উভয়ের জন্য প্রোগ্রামিং ভাষা | 5.4.2 | +| [Node](https://nodejs.org/en) | সার্ভার চালানো | 20.18.2 | +| [Viem](https://viem.sh/) | ব্লকচেইনের সাথে যোগাযোগ | 2.9.20 | +| [MUD](https://mud.dev/) | অনচেইন ডেটা ম্যানেজমেন্ট | 2.0.12 | +| [React](https://react.dev/) | ক্লায়েন্ট ব্যবহারকারী ইন্টারফেস | 18.2.0 | +| [Vite](https://vitejs.dev/) | ক্লায়েন্ট কোড পরিবেশন করা | 4.2.1 | + +## মাইনসুইপার উদাহরণ {#minesweeper} + +[মাইনসুইপার](https://en.wikipedia.org/wiki/Minesweeper_\(video_game\)) একটি গেম যেখানে একটি মাইনফিল্ড সহ একটি গোপন ম্যাপ অন্তর্ভুক্ত থাকে। খেলোয়াড় একটি নির্দিষ্ট স্থানে খনন করতে বেছে নেয়। যদি সেই স্থানে একটি মাইন থাকে, তাহলে খেলা শেষ। অন্যথায়, খেলোয়াড় সেই স্থানের আশেপাশের আটটি স্কোয়ারে মাইনের সংখ্যা পায়। + +এই অ্যাপ্লিকেশনটি [MUD](https://mud.dev/) ব্যবহার করে লেখা হয়েছে, এটি এমন একটি ফ্রেমওয়ার্ক যা আমাদের একটি [কী-ভ্যালু ডেটাবেস](https://aws.amazon.com/nosql/key-value/) ব্যবহার করে অনচেইন ডেটা সংরক্ষণ করতে এবং সেই ডেটা স্বয়ংক্রিয়ভাবে অফচেইন কম্পোনেন্টগুলির সাথে সিঙ্ক্রোনাইজ করতে দেয়। সিঙ্ক্রোনাইজেশন ছাড়াও, MUD অ্যাক্সেস কন্ট্রোল প্রদান করা সহজ করে তোলে এবং অন্যান্য ব্যবহারকারীদের জন্য আমাদের অ্যাপ্লিকেশনটি অনুমতি ছাড়াই [প্রসারিত](https://mud.dev/guides/extending-a-world) করার সুযোগ করে দেয়। + +### মাইনসুইপার উদাহরণ চালানো {#running-minesweeper-example} + +মাইনসুইপার উদাহরণটি চালাতে: + +1. নিশ্চিত করুন যে আপনি [প্রয়োজনীয় পূর্বশর্তগুলি ইনস্টল করেছেন](https://mud.dev/quickstart#prerequisites): [নোড](https://mud.dev/quickstart#prerequisites), [Foundry](https://book.getfoundry.sh/getting-started/installation), [`git`](https://git-scm.com/downloads), [`pnpm`](https://git-scm.com/downloads), এবং [`mprocs`](https://github.com/pvolok/mprocs)। + +2. রিপোজিটরি ক্লোন করুন। + + ```sh copy + git clone https://github.com/qbzzt/20240901-secret-state.git + ``` + +3. প্যাকেজগুলি ইনস্টল করুন। + + ```sh copy + cd 20240901-secret-state/ + pnpm install + npm install -g mprocs + ``` + + যদি `pnpm install`-এর অংশ হিসেবে Foundry ইনস্টল করা হয়ে থাকে, তাহলে আপনাকে কমান্ড-লাইন শেলটি পুনরায় চালু করতে হবে। + +4. কন্ট্র্যাক্টগুলো কম্পাইল করুন + + ```sh copy + cd packages/contracts + forge build + cd ../.. + ``` + +5. প্রোগ্রামটি শুরু করুন (একটি [anvil](https://book.getfoundry.sh/anvil/) ব্লকচেইন সহ) এবং অপেক্ষা করুন। + + ```sh copy + mprocs + ``` + + মনে রাখবেন যে স্টার্টআপে দীর্ঘ সময় লাগে। অগ্রগতি দেখতে, প্রথমে MUD কন্ট্র্যাক্টগুলি ডেপ্লয় হতে দেখার জন্য ডাউন অ্যারো ব্যবহার করে _কন্ট্র্যাক্ট_ ট্যাবে স্ক্রোল করুন। যখন আপনি _Waiting for file changes…_ মেসেজটি পাবেন, তখন কন্ট্র্যাক্টগুলি ডেপ্লয় হয়ে যাবে এবং পরবর্তী অগ্রগতি _সার্ভার_ ট্যাবে ঘটবে। সেখানে, আপনি _Verifier address: 0x...._ মেসেজটি না পাওয়া পর্যন্ত অপেক্ষা করুন। + + যদি এই ধাপটি সফল হয়, আপনি `mprocs` স্ক্রিনটি দেখতে পাবেন, যেখানে বামদিকে বিভিন্ন প্রসেস এবং ডানদিকে বর্তমানে নির্বাচিত প্রসেসের জন্য কনসোল আউটপুট থাকবে। + + ![mprocs স্ক্রিন](./mprocs.png) + + যদি `mprocs`-এ কোনো সমস্যা হয়, আপনি চারটি প্রসেস ম্যানুয়ালি চালাতে পারেন, প্রত্যেকটি তার নিজস্ব কমান্ড লাইন উইন্ডোতে: + + - **Anvil** + + ```sh + cd packages/contracts + anvil --base-fee 0 --block-time 2 + ``` + + - **কন্ট্র্যাক্ট** + + ```sh + cd packages/contracts + pnpm mud dev-contracts --rpc http://127.0.0.1:8545 + ``` + + - **সার্ভার** + + ```sh + cd packages/server + pnpm start + ``` + + - **ক্লায়েন্ট** + + ```sh + cd packages/client + pnpm run dev + ``` + +6. এখন আপনি [ক্লায়েন্টে](http://localhost:3000) ব্রাউজ করতে পারেন, **নতুন গেম**-এ ক্লিক করুন এবং খেলা শুরু করুন। + +### টেবিল {#tables} + +আমাদের অনচেইনে [কয়েকটি টেবিল](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts) প্রয়োজন। + +- `Configuration`: এই টেবিলটি একটি সিঙ্গেলটন, এর কোনো কী এবং একটিমাত্র রেকর্ড নেই। এটি গেম কনফিগারেশন তথ্য ধরে রাখতে ব্যবহৃত হয়: + - `height`: একটি মাইনফিল্ডের উচ্চতা + - `width`: একটি মাইনফিল্ডের প্রস্থ + - `numberOfBombs`: প্রতিটি মাইনফিল্ডে বোমার সংখ্যা + +- `VerifierAddress`: এই টেবিলটিও একটি সিঙ্গেলটন। এটি কনফিগারেশনের একটি অংশ, ভেরিফায়ার কন্ট্র্যাক্টের (`verifier`) অ্যাড্রেস ধরে রাখতে ব্যবহৃত হয়। আমরা এই তথ্যটি `Configuration` টেবিলে রাখতে পারতাম, কিন্তু এটি একটি ভিন্ন কম্পোনেন্ট, সার্ভার দ্বারা সেট করা হয়, তাই এটি একটি পৃথক টেবিলে রাখা সহজ। + +- `PlayerGame`: কী হল প্লেয়ারের অ্যাড্রেস। ডেটা হল: + + - `gameId`: ৩২-বাইট মান যা প্লেয়ার যে ম্যাপে খেলছে তার হ্যাস (গেম আইডেন্টিফায়ার)। + - `win`: একটি বুলিয়ান যা নির্দেশ করে খেলোয়াড় গেমটি জিতেছে কিনা। + - `lose`: একটি বুলিয়ান যা নির্দেশ করে খেলোয়াড় গেমটি হেরেছে কিনা। + - `digNumber`: গেমে সফল খননের সংখ্যা। + +- `GamePlayer`: এই টেবিলটি `gameId` থেকে প্লেয়ার অ্যাড্রেসে বিপরীত ম্যাপিং ধরে রাখে। + +- `Map`: কী হল তিনটি মানের একটি টাপল: + + - `gameId`: ৩২-বাইট মান যা প্লেয়ার যে ম্যাপে খেলছে তার হ্যাস (গেম আইডেন্টিফায়ার)। + - `x` স্থানাঙ্ক + - `y` স্থানাঙ্ক + + মানটি একটি একক সংখ্যা। যদি একটি বোমা শনাক্ত করা হয় তবে এটি 255। অন্যথায়, এটি সেই অবস্থানের চারপাশে বোমার সংখ্যা এবং এক যোগ। আমরা শুধু বোমার সংখ্যা ব্যবহার করতে পারি না, কারণ ডিফল্টরূপে EVM-এর সমস্ত স্টোরেজ এবং MUD-এর সমস্ত সারি মান শূন্য। আমাদের "খেলোয়াড় এখনও এখানে খনন করেনি" এবং "খেলোয়াড় এখানে খনন করেছে, এবং দেখেছে চারপাশে শূন্য বোমা আছে" এর মধ্যে পার্থক্য করতে হবে। + +এছাড়াও, ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ অনচেইন কম্পোনেন্টের মাধ্যমে ঘটে। এটিও টেবিল ব্যবহার করে প্রয়োগ করা হয়। + +- `PendingGame`: নতুন গেম শুরু করার জন্য পরিষেবা না দেওয়া অনুরোধ। +- `PendingDig`: একটি নির্দিষ্ট গেমে একটি নির্দিষ্ট জায়গায় খনন করার জন্য পরিষেবা না দেওয়া অনুরোধ। এটি একটি [অফচেইন টেবিল](https://mud.dev/store/tables#types-of-tables), যার মানে এটি EVM স্টোরেজে লেখা হয় না, এটি শুধুমাত্র ইভেন্ট ব্যবহার করে অফচেইনে পড়া যায়। + +### এক্সিকিউশন এবং ডেটা ফ্লো {#execution-data-flows} + +এই ফ্লো গুলো ক্লায়েন্ট, অনচেইন কম্পোনেন্ট এবং সার্ভারের মধ্যে এক্সিকিউশন সমন্বয় করে। + +#### ইনিশিয়ালাইজেশন {#initialization-flow} + +যখন আপনি `mprocs` চালান, এই ধাপগুলি ঘটে: + +1. [`mprocs`](https://github.com/pvolok/mprocs) চারটি কম্পোনেন্ট চালায়: + + - [Anvil](https://book.getfoundry.sh/anvil/), যা একটি স্থানীয় ব্লকচেইন চালায় + - [Contracts](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/contracts), যা MUD-এর জন্য কন্ট্র্যাক্টগুলি কম্পাইল করে (যদি প্রয়োজন হয়) এবং ডেপ্লয় করে + - [Client](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/client), যা ওয়েব ব্রাউজারে UI এবং ক্লায়েন্ট কোড পরিবেশন করতে [Vite](https://vitejs.dev/) চালায়। + - [Server](https://github.com/qbzzt/20240901-secret-state/tree/main/packages/server), যা সার্ভারের কাজগুলো সম্পাদন করে + +2. `কন্ট্র্যাক্টস` প্যাকেজটি MUD কন্ট্র্যাক্টগুলি ডেপ্লয় করে এবং তারপর [`PostDeploy.s.sol` স্ক্রিপ্টটি](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol) চালায়। এই স্ক্রিপ্টটি কনফিগারেশন সেট করে। github থেকে পাওয়া কোডটি [একটি 10x5 মাইনফিল্ড নির্দিষ্ট করে যার মধ্যে আটটি মাইন আছে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/script/PostDeploy.s.sol#L23)। + +3. [সার্ভারটি](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts) [MUD সেট আপ করে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L6) শুরু হয়। অন্যান্য জিনিসের মধ্যে, এটি ডেটা সিঙ্ক্রোনাইজেশন সক্রিয় করে, যাতে সার্ভারের মেমরিতে প্রাসঙ্গিক টেবিলগুলির একটি অনুলিপি বিদ্যমান থাকে। + +4. [`Configuration` টেবিল পরিবর্তিত হলে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L23) সার্ভারটি একটি ফাংশন কার্যকর করার জন্য সাবস্ক্রাইব করে। `PostDeploy.s.sol` কার্যকর হওয়ার পরে এবং টেবিলটি পরিবর্তন করার পরে [এই ফাংশনটি](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L24-L168) কল করা হয়। + +5. যখন সার্ভার ইনিশিয়ালাইজেশন ফাংশনটিতে কনফিগারেশন থাকে, তখন এটি সার্ভারের [জিরো-নলেজ অংশটি](#using-zokrates-from-typescript) ইনিশিয়ালাইজ করতে [`zkFunctions`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L34-L35) কল করে। এটি ঘটতে পারে না যতক্ষণ না আমরা কনফিগারেশনটি পাই কারণ জিরো-নলেজ ফাংশনগুলিতে মাইনফিল্ডের প্রস্থ এবং উচ্চতা ধ্রুবক হিসাবে থাকতে হয়। + +6. সার্ভারের জিরো-নলেজ অংশ ইনিশিয়ালাইজ করার পরে, পরবর্তী ধাপ হল [জিরো-নলেজ ভেরিফিকেশন কন্ট্র্যাক্টটি ব্লকচেইনে ডেপ্লয় করা](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L42-L53) এবং MUD-এ ভেরিফায়ির অ্যাড্রেস সেট করা। + +7. অবশেষে, আমরা আপডেটের জন্য সাবস্ক্রাইব করি যাতে আমরা দেখতে পাই কখন একজন খেলোয়াড় [একটি নতুন গেম শুরু করতে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71) বা [একটি বিদ্যমান গেমে খনন করতে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73-L108) অনুরোধ করে। + +#### নতুন গেম {#new-game-flow} + +খেলোয়াড় যখন নতুন গেমের জন্য অনুরোধ করে তখন এটি ঘটে। + +1. যদি এই প্লেয়ারের জন্য কোনো গেম চালু না থাকে, অথবা যদি থাকে কিন্তু তার gameId শূন্য হয়, তাহলে ক্লায়েন্ট একটি [নতুন গেম বোতাম](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175) দেখায়। যখন ব্যবহারকারী এই বোতামটি চাপেন, [React `newGame` ফাংশনটি চালায়](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L96)। + +2. [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L43-L46) একটি `সিস্টেম` কল। MUD-তে সমস্ত কল `World` কন্ট্র্যাক্টের মাধ্যমে রাউট করা হয় এবং বেশিরভাগ ক্ষেত্রে আপনি `__` কল করেন। এই ক্ষেত্রে, কলটি `app__newGame`-এ করা হয়, যা MUD তারপর [`GameSystem`-এ `newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L16-L22)-এ রাউট করে। + +3. অনচেইন ফাংশনটি পরীক্ষা করে যে প্লেয়ারের কোনো গেম চালু আছে কিনা, এবং যদি না থাকে তাহলে [`PendingGame` টেবিলে অনুরোধটি যোগ করে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L21)। + +4. সার্ভার `PendingGame`-এ পরিবর্তন সনাক্ত করে এবং [সাবস্ক্রাইব করা ফাংশনটি চালায়](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L55-L71)। এই ফাংশনটি [`newGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L110-L114) কল করে, যা ফলস্বরূপ [`createGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L116-L144) কল করে। + +5. `createGame` যা প্রথম কাজ করে তা হলো [যথাযথ সংখ্যক মাইনসহ একটি র‍্যান্ডম ম্যাপ তৈরি করা](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L120-L135)। তারপর, এটি খালি বর্ডার সহ একটি ম্যাপ তৈরি করতে [`makeMapBorders`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L147-L166) কল করে, যা Zokrates-এর জন্য প্রয়োজনীয়। অবশেষে, `createGame` ম্যাপের হ্যাস পেতে [`calculateMapHash`](#calculateMapHash) কল করে, যা গেম আইডি হিসাবে ব্যবহৃত হয়। + +6. `newGame` ফাংশন `gamesInProgress`-এ নতুন গেম যোগ করে। + +7. সার্ভার শেষ পর্যন্ত অনচেইনে থাকা [`app__newGameResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L38-L43)-কে কল করে। এই ফাংশনটি একটি ভিন্ন `সিস্টেম`-এ, [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol)-এ রয়েছে, যা অ্যাক্সেস কন্ট্রোল সক্ষম করে। অ্যাক্সেস কন্ট্রোল [MUD কনফিগারেশন ফাইল](https://mud.dev/config), [`mud.config.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/mud.config.ts#L67-L72)-এ সংজ্ঞায়িত করা আছে। + + অ্যাক্সেস লিস্ট `সিস্টেম` কল করার জন্য শুধুমাত্র একটি একক অ্যাড্রেসকে অনুমতি দেয়। এটি সার্ভার ফাংশনে অ্যাক্সেস একটি একক অ্যাড্রেসে সীমাবদ্ধ করে, যাতে কেউ সার্ভারের ছদ্মবেশ ধারণ করতে না পারে। + +8. অনচেইন কম্পোনেন্ট প্রাসঙ্গিক টেবিলগুলি আপডেট করে: + + - `PlayerGame`-এ গেমটি তৈরি করুন। + - `GamePlayer`-এ বিপরীত ম্যাপিং সেট করুন। + - `PendingGame` থেকে অনুরোধটি সরান। + +9. সার্ভার `PendingGame`-এর পরিবর্তন চিহ্নিত করে, কিন্তু কিছু করে না কারণ [`wantsGame`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L58-L60) মিথ্যা। + +10. ক্লায়েন্টে [`gameRecord`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L143-L148) প্লেয়ারের অ্যাড্রেসের জন্য `PlayerGame` এন্ট্রিতে সেট করা হয়। যখন `PlayerGame` পরিবর্তিত হয়, তখন `gameRecord`-ও পরিবর্তিত হয়। + +11. যদি `gameRecord`-এ একটি মান থাকে এবং গেমটি জেতা বা হারা না হয়ে থাকে, তাহলে ক্লায়েন্ট [ম্যাপটি প্রদর্শন করে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190)। + +#### খনন করুন {#dig-flow} + +1. প্লেয়ার [ম্যাপ সেলের বোতামে ক্লিক করে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L188), যা [`dig` ফাংশনটিকে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/mud/createSystemCalls.ts#L33-L36) কল করে। এই ফাংশনটি [অনচেইনে `dig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L24-L32) কল করে। + +2. অনচেইন কম্পোনেন্ট [অনেকগুলো স্যানিটি চেক করে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L25-L30), এবং সফল হলে ডিগ অনুরোধটি [`PendingDig`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/GameSystem.sol#L31)-এ যোগ করে। + +3. সার্ভার [`PendingDig`-এ পরিবর্তন সনাক্ত করে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L73)। [যদি এটি বৈধ হয়](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L75-L84), এটি ফলাফল এবং এটি বৈধ হওয়ার একটি প্রমাণ উভয়ই তৈরি করতে [জিরো-নলেজ কোডটিকে কল করে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L86-L95) (নীচে ব্যাখ্যা করা হয়েছে)। + +4. [সার্ভার](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L97-L107) অনচেইনে [`digResponse`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L45-L64) কল করে। + +5. `digResponse` দুটি কাজ করে। প্রথমত, এটি [জিরো-নলেজ প্রুফ](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L47-L61) পরীক্ষা করে। তারপর, যদি প্রমাণটি সঠিক হয়, তবে এটি আসলে ফলাফল প্রক্রিয়া করার জন্য [`processDigResult`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L67-L86) কল করে। + +6. `processDigResult` পরীক্ষা করে যে গেমটি [হেরে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L76-L78) গেছে নাকি [জিতে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L83-L86) গেছে, এবং [অনচেইন ম্যাপ `Map` আপডেট করে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol#L80)। + +7. ক্লায়েন্ট স্বয়ংক্রিয়ভাবে আপডেটগুলি তুলে নেয় এবং [প্লেয়ারকে দেখানো ম্যাপ আপডেট করে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/client/src/App.tsx#L175-L190), এবং প্রযোজ্য হলে প্লেয়ারকে জানায় যে এটি একটি জয় নাকি হার। + +## Zokrates ব্যবহার {#using-zokrates} + +উপরে ব্যাখ্যা করা ফ্লোগুলিতে আমরা জিরো-নলেজ অংশগুলি এড়িয়ে গেছি, সেগুলিকে একটি ব্ল্যাক বক্স হিসাবে বিবেচনা করেছি। এখন আসুন এটি খুলে দেখি এবং দেখি কিভাবে সেই কোডটি লেখা হয়েছে। + +### ম্যাপ হ্যাশিং {#hashing-map} + +আমরা [এই জাভাস্ক্রিপ্ট কোডটি](https://github.com/ZK-Plus/ICBC24_Tutorial_Compute-Offchain-Verify-onchain/tree/solutions/exercise) ব্যবহার করে [পসেইডন](https://www.poseidon-hash.info) ইমপ্লিমেন্ট করতে পারি, যা আমরা Zokrates হ্যাস ফাংশন হিসাবে ব্যবহার করি। তবে, যদিও এটি দ্রুততর হবে, এটি Zokrates হ্যাস ফাংশন ব্যবহার করার চেয়ে আরও জটিল হবে। এটি একটি টিউটোরিয়াল, তাই কোডটি পারফরম্যান্সের জন্য নয়, সরলতার জন্য অপ্টিমাইজ করা হয়েছে। অতএব, আমাদের দুটি ভিন্ন Zokrates প্রোগ্রামের প্রয়োজন, একটি ম্যাপের হ্যাস (`হ্যাস`) গণনা করার জন্য এবং অন্যটি ম্যাপের একটি অবস্থানে খননের ফলাফলের জিরো-নলেজ প্রুফ (`ডিগ`) তৈরি করার জন্য। + +### হ্যাস ফাংশন {#hash-function} + +এটি সেই ফাংশন যা একটি ম্যাপের হ্যাস গণনা করে। আমরা এই কোডটি লাইন বাই লাইন আলোচনা করব। + +``` +import "hashes/poseidon/poseidon.zok" as poseidon; +import "utils/pack/bool/pack128.zok" as pack128; +``` + +এই দুটি লাইন [Zokrates স্ট্যান্ডার্ড লাইব্রেরি](https://zokrates.github.io/toolbox/stdlib.html) থেকে দুটি ফাংশন ইম্পোর্ট করে। [প্রথম ফাংশনটি](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/hashes/poseidon/poseidon.zok) একটি [পসেইডন হ্যাস](https://www.poseidon-hash.info/)। এটি একটি [`field` এলিমেন্ট](https://zokrates.github.io/language/types.html#field)-এর একটি অ্যারে নেয় এবং একটি `field` রিটার্ন করে। + +Zokrates-এর ফিল্ড এলিমেন্ট সাধারণত 256 বিটের চেয়ে কম দীর্ঘ হয়, তবে খুব বেশি কম নয়। কোডটিকে সহজ করার জন্য, আমরা ম্যাপটিকে 512 বিট পর্যন্ত সীমাবদ্ধ রাখি এবং চারটি ফিল্ডের একটি অ্যারে হ্যাস করি, এবং প্রতিটি ফিল্ডে আমরা কেবল 128 বিট ব্যবহার করি। এই উদ্দেশ্যে [ `pack128` ফাংশনটি](https://github.com/Zokrates/ZoKrates/blob/latest/zokrates_stdlib/stdlib/utils/pack/bool/pack128.zok) 128 বিটের একটি অ্যারে একটি `field`-এ পরিবর্তন করে। + +``` + def hashMap(bool[${width+2}][${height+2}] map) -> field { +``` + +এই লাইনটি একটি ফাংশন সংজ্ঞা শুরু করে। `hashMap` `map` নামে একটি একক প্যারামিটার পায়, যা একটি দ্বি-মাত্রিক `bool`(ean) অ্যারে। ম্যাপের আকার `width+2` বাই `height+2`, যার কারণ [নীচে ব্যাখ্যা করা হয়েছে](#why-map-border)। + +আমরা `${width+2}` এবং `${height+2}` ব্যবহার করতে পারি কারণ Zokrates প্রোগ্রামগুলি এই অ্যাপ্লিকেশনে [টেমপ্লেট স্ট্রিং](https://www.w3schools.com/js/js_string_templates.asp) হিসাবে সংরক্ষণ করা হয়। `${` এবং `}` এর মধ্যে কোড জাভাস্ক্রিপ্ট দ্বারা মূল্যায়ন করা হয়, এবং এইভাবে প্রোগ্রামটি বিভিন্ন ম্যাপ আকারের জন্য ব্যবহার করা যেতে পারে। ম্যাপ প্যারামিটারটির চারপাশে এক অবস্থান প্রশস্ত বর্ডার রয়েছে যেখানে কোনো বোমা নেই, যা আমাদের প্রস্থ এবং উচ্চতায় দুই যোগ করার কারণ। + +রিটার্ন ভ্যালু হলো একটি `field` যা হ্যাস ধারণ করে। + +``` + bool[512] mut map1d = [false; 512]; +``` + +ম্যাপটি দ্বি-মাত্রিক। তবে, `pack128` ফাংশনটি দ্বি-মাত্রিক অ্যারের সাথে কাজ করে না। তাই আমরা প্রথমে ম্যাপটিকে একটি 512-বাইট অ্যারে, `map1d` ব্যবহার করে ফ্ল্যাটেন করি। ডিফল্টরূপে Zokrates ভেরিয়েবলগুলি ধ্রুবক, কিন্তু আমাদের একটি লুপে এই অ্যারেতে মান নির্ধারণ করতে হবে, তাই আমরা এটিকে [`mut`](https://zokrates.github.io/language/variables.html#mutability) হিসাবে সংজ্ঞায়িত করি। + +আমাদের অ্যারেটি ইনিশিয়ালাইজ করতে হবে কারণ Zokrates-এ `undefined` নেই। `[false; 512]` এক্সপ্রেশনটির অর্থ [512 `false` মানের একটি অ্যারে](https://zokrates.github.io/language/types.html#declaration-and-initialization)। + +``` + u32 mut counter = 0; +``` + +আমাদের একটি কাউন্টারও প্রয়োজন `map1d`-এ যে বিটগুলি আমরা ইতিমধ্যেই পূরণ করেছি এবং যেগুলি এখনও করিনি তার মধ্যে পার্থক্য করার জন্য। + +``` + for u32 x in 0..${width+2} { +``` + +এটি Zokrates-এ একটি [`for` লুপ](https://zokrates.github.io/language/control_flow.html#for-loops) ঘোষণা করার উপায়। একটি Zokrates `for` লুপের অবশ্যই নির্দিষ্ট সীমা থাকতে হবে, কারণ যদিও এটি একটি লুপের মতো দেখায়, কম্পাইলার আসলে এটিকে "unrolls" করে। `${width+2}` এক্সপ্রেশনটি একটি কম্পাইল টাইম ধ্রুবক কারণ `width` টাইপস্ক্রিপ্ট কোড দ্বারা কম্পাইলার কল করার আগে সেট করা হয়। + +``` + for u32 y in 0..${height+2} { + map1d[counter] = map[x][y]; + counter = counter+1; + } + } +``` + +ম্যাপের প্রতিটি অবস্থানের জন্য, সেই মানটি `map1d` অ্যারেতে রাখুন এবং কাউন্টার বাড়ান। + +``` + field[4] hashMe = [ + pack128(map1d[0..128]), + pack128(map1d[128..256]), + pack128(map1d[256..384]), + pack128(map1d[384..512]) + ]; +``` + +`pack128` `map1d` থেকে চারটি `field` মানের একটি অ্যারে তৈরি করতে ব্যবহৃত হয়। Zokrates-এ `array[a..b]` মানে অ্যারের সেই স্লাইস যা `a` তে শুরু হয় এবং `b-1` এ শেষ হয়। + +``` + return poseidon(hashMe); +} +``` + +এই অ্যারেটিকে একটি হ্যাসে রূপান্তর করতে `poseidon` ব্যবহার করুন। + +### হ্যাস প্রোগ্রাম {#hash-program} + +সার্ভারকে গেম আইডেন্টিফায়ার তৈরি করার জন্য সরাসরি `hashMap` কল করতে হবে। তবে, Zokrates শুরু করার জন্য একটি প্রোগ্রামে শুধুমাত্র `main` ফাংশন কল করতে পারে, তাই আমরা একটি প্রোগ্রাম তৈরি করি যার `main` হ্যাস ফাংশন কল করে। + +``` +${hashFragment} + +def main(bool[${width+2}][${height+2}] map) -> field { + return hashMap(map); +} +``` + +### খনন প্রোগ্রাম {#dig-program} + +এটি অ্যাপ্লিকেশনের জিরো-নলেজ অংশের মূল, যেখানে আমরা খনন ফলাফলের যাচাইয়ের জন্য ব্যবহৃত প্রমাণগুলি তৈরি করি। + +``` +${hashFragment} + +// অবস্থান (x,y) তে মাইনের সংখ্যা +def map2mineCount(bool[${width+2}][${height+2}] map, u32 x, u32 y) -> u8 { + return if map[x+1][y+1] { 1 } else { 0 }; +} +``` + +#### ম্যাপ বর্ডার কেন {#why-map-border} + +জিরো-নলেজ প্রুফ [অ্যারিথমেটিক সার্কিট](https://medium.com/web3studio/simple-explanations-of-arithmetic-circuits-and-zero-knowledge-proofs-806e59a79785) ব্যবহার করে, যার `if` স্টেটমেন্টের সহজ সমতুল্য নেই। পরিবর্তে, তারা [কন্ডিশনাল অপারেটরের](https://en.wikipedia.org/wiki/Ternary_conditional_operator) সমতুল্য ব্যবহার করে। যদি `a` শূন্য বা এক হতে পারে, তাহলে আপনি `if a { b } else { c }`-কে `ab+(1-a)c` হিসাবে গণনা করতে পারেন। + +এই কারণে, একটি Zokrates `if` স্টেটমেন্ট সর্বদা উভয় শাখা মূল্যায়ন করে। উদাহরণস্বরূপ, যদি আপনার কাছে এই কোডটি থাকে: + +``` +bool[5] arr = [false; 5]; +u32 index=10; +return if index>4 { 0 } else { arr[index] } +``` + +এটি ত্রুটি দেখাবে, কারণ এটিকে `arr[10]` গণনা করতে হবে, যদিও সেই মানটি পরে শূন্য দ্বারা গুণ করা হবে। + +এই কারণেই আমাদের ম্যাপের চারপাশে এক অবস্থান প্রশস্ত বর্ডার প্রয়োজন। আমাদের একটি অবস্থানের চারপাশে মোট মাইনের সংখ্যা গণনা করতে হবে, এবং এর অর্থ হল আমাদের সেই অবস্থানের উপরের এবং নীচের সারি, বাম এবং ডান দিকের অবস্থানটি দেখতে হবে, যেখানে আমরা খনন করছি। যার অর্থ হল Zokrates কে দেওয়া ম্যাপ অ্যারেতে সেই অবস্থানগুলি থাকতে হবে। + +``` +def main(private bool[${width+2}][${height+2}] map, u32 x, u32 y) -> (field, u8) { +``` + +ডিফল্টরূপে Zokrates প্রমাণগুলি তাদের ইনপুটগুলি অন্তর্ভুক্ত করে। একটি স্পটের চারপাশে পাঁচটি মাইন আছে তা জানার কোনো লাভ নেই যদি না আপনি আসলে জানেন যে এটি কোন স্পট (এবং আপনি এটিকে আপনার অনুরোধের সাথে মেলাতে পারবেন না, কারণ তাহলে প্রুভার বিভিন্ন মান ব্যবহার করতে পারে এবং আপনাকে সে সম্পর্কে না জানাতে পারে)। যাইহোক, আমাদের ম্যাপটি গোপন রাখতে হবে, যখন এটি Zokrates কে সরবরাহ করা হচ্ছে। সমাধান হল একটি `private` প্যারামিটার ব্যবহার করা, যা প্রমাণ দ্বারা প্রকাশ করা _হয় না_। + +এটি অপব্যবহারের আরেকটি পথ খুলে দেয়। প্রুভার সঠিক স্থানাঙ্ক ব্যবহার করতে পারে, কিন্তু অবস্থানের চারপাশে যেকোনো সংখ্যক মাইন সহ একটি ম্যাপ তৈরি করতে পারে, এবং সম্ভবত সেই অবস্থানেই। এই অপব্যবহার রোধ করতে, আমরা জিরো-নলেজ প্রুফকে ম্যাপের হ্যাস অন্তর্ভুক্ত করতে বাধ্য করি, যা গেম আইডেন্টিফায়ার। + +``` + return (hashMap(map), +``` + +এখানে রিটার্ন ভ্যালু হল একটি টাপল যা ম্যাপ হ্যাস অ্যারের পাশাপাশি খননের ফলাফল অন্তর্ভুক্ত করে। + +``` + if map2mineCount(map, x, y) > 0 { 0xFF } else { +``` + +যদি অবস্থানে বোমা থাকে তাহলে আমরা ২৫৫ একটি বিশেষ মান হিসাবে ব্যবহার করি। + +``` + map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) + + map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) + + map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1) + } + ); +} +``` + +যদি প্লেয়ার কোনো মাইনে আঘাত না করে, তাহলে অবস্থানের চারপাশের এলাকার মাইন সংখ্যা যোগ করুন এবং সেটি রিটার্ন করুন। + +### টাইপস্ক্রিপ্ট থেকে Zokrates ব্যবহার {#using-zokrates-from-typescript} + +Zokrates-এর একটি কমান্ড লাইন ইন্টারফেস রয়েছে, কিন্তু এই প্রোগ্রামে আমরা এটি [টাইপস্ক্রিপ্ট কোড](https://zokrates.github.io/toolbox/zokrates_js.html)-এ ব্যবহার করি। + +Zokrates সংজ্ঞা ধারণকারী লাইব্রেরিটিকে [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts) বলা হয়। + +```typescript +import { initialize as zokratesInitialize } from "zokrates-js" +``` + +[Zokrates জাভাস্ক্রিপ্ট বাইন্ডিং](https://zokrates.github.io/toolbox/zokrates_js.html) ইম্পোর্ট করুন। আমাদের শুধুমাত্র [`initialize`](https://zokrates.github.io/toolbox/zokrates_js.html#initialize) ফাংশনটি প্রয়োজন কারণ এটি একটি প্রমিজ রিটার্ন করে যা সমস্ত Zokrates সংজ্ঞাতে সমাধান হয়। + +```typescript +export const zkFunctions = async (width: number, height: number) : Promise => { +``` + +Zokrates-এর মতোই, আমরাও শুধুমাত্র একটি ফাংশন এক্সপোর্ট করি, যা [অ্যাসিঙ্ক্রোনাস](https://www.w3schools.com/js/js_async.asp)-ও। যখন এটি অবশেষে রিটার্ন করে, তখন এটি বেশ কয়েকটি ফাংশন প্রদান করে যা আমরা নীচে দেখব। + +```typescript +const zokrates = await zokratesInitialize() +``` + +Zokrates ইনিশিয়ালাইজ করুন, লাইব্রেরি থেকে আমাদের প্রয়োজনীয় সবকিছু পান। + +```typescript +const hashFragment = ` + import "utils/pack/bool/pack128.zok" as pack128; + import "hashes/poseidon/poseidon.zok" as poseidon; + . + . + . + } + ` + +const hashProgram = ` + ${hashFragment} + . + . + . + ` + +const digProgram = ` + ${hashFragment} + . + . + . + ` +``` + +এরপর আমাদের কাছে হ্যাস ফাংশন এবং উপরে দেখা দুটি Zokrates প্রোগ্রাম রয়েছে। + +```typescript +const digCompiled = zokrates.compile(digProgram) +const hashCompiled = zokrates.compile(hashProgram) +``` + +এখানে আমরা সেই প্রোগ্রামগুলি কম্পাইল করি। + +```typescript +// জিরো-নলেজ ভেরিফিকেশনের জন্য কী তৈরি করুন। +// একটি প্রোডাকশন সিস্টেমে আপনি একটি সেটআপ সেরিমনি ব্যবহার করতে চাইবেন। +// (https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony). +const keySetupResults = zokrates.setup(digCompiled.program, "") +const verifierKey = keySetupResults.vk +const proverKey = keySetupResults.pk +``` + +একটি প্রোডাকশন সিস্টেমে আমরা আরও জটিল [সেটআপ অনুষ্ঠান](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) ব্যবহার করতে পারি, কিন্তু একটি প্রদর্শনের জন্য এটি যথেষ্ট ভালো। ব্যবহারকারীরা প্রোভার কী জানতে পারলেও এটি কোনো সমস্যা নয় - তারা এখনও এটি ব্যবহার করে জিনিস প্রমাণ করতে পারবে না যদি না সেগুলি সত্য হয়। যেহেতু আমরা এন্ট্রপি (দ্বিতীয় প্যারামিটার, `""`) নির্দিষ্ট করি, তাই ফলাফল সর্বদা একই হবে। + +**দ্রষ্টব্য:** Zokrates প্রোগ্রাম কম্পাইল করা এবং কী তৈরি করা ধীর প্রক্রিয়া। প্রতিবার এটি পুনরাবৃত্তি করার প্রয়োজন নেই, শুধুমাত্র যখন ম্যাপের আকার পরিবর্তন হয়। একটি প্রোডাকশন সিস্টেমে আপনি এগুলি একবার করবেন এবং তারপর আউটপুট সংরক্ষণ করবেন। এখানে আমি এটি না করার একমাত্র কারণ হল সরলতার খাতিরে। + +#### `calculateMapHash` {#calculateMapHash} + +```typescript +const calculateMapHash = function (hashMe: boolean[][]): string { + return ( + "0x" + + BigInt(zokrates.computeWitness(hashCompiled, [hashMe]).output.slice(1, -1)) + .toString(16) + .padStart(64, "0") + ) +} +``` + +[`computeWitness`](https://zokrates.github.io/toolbox/zokrates_js.html#computewitnessartifacts-args-options) ফাংশনটি আসলে Zokrates প্রোগ্রাম চালায়। এটি দুটি ফিল্ড সহ একটি কাঠামো রিটার্ন করে: `output`, যা JSON স্ট্রিং হিসাবে প্রোগ্রামের আউটপুট, এবং `witness`, যা ফলাফলের জিরো-নলেজ প্রুফ তৈরির জন্য প্রয়োজনীয় তথ্য। এখানে আমাদের শুধু আউটপুট দরকার। + +আউটপুটটি `"31337"` ফর্মের একটি স্ট্রিং, উদ্ধৃতি চিহ্নের মধ্যে একটি দশমিক সংখ্যা। কিন্তু `viem`-এর জন্য আমাদের যে আউটপুট প্রয়োজন তা হল `0x60A7` ফর্মের একটি হেক্সাডেসিমাল সংখ্যা। সুতরাং আমরা উদ্ধৃতি চিহ্নগুলি সরাতে `.slice(1,-1)` ব্যবহার করি এবং তারপরে বাকি স্ট্রিংটি, যা একটি দশমিক সংখ্যা, একটি [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt)-এ পরিণত করতে `BigInt` ব্যবহার করি। `.toString(16)` এই `BigInt` কে একটি হেক্সাডেসিমাল স্ট্রিং-এ রূপান্তরিত করে, এবং `"0x"+` হেক্সাডেসিমাল সংখ্যার জন্য মার্কার যোগ করে। + +```typescript +// খনন করুন এবং ফলাফলের জিরো-নলেজ প্রুফ রিটার্ন করুন +// (সার্ভার-সাইড কোড) +``` + +জিরো-নলেজ প্রুফের মধ্যে পাবলিক ইনপুট (`x` এবং `y`) এবং ফলাফল (ম্যাপের হ্যাস এবং বোমার সংখ্যা) অন্তর্ভুক্ত থাকে। + +```typescript + const zkDig = function(map: boolean[][], x: number, y: number) : any { + if (x<0 || x>=width || y<0 || y>=height) + throw new Error("Trying to dig outside the map") +``` + +Zokrates-এ কোনো ইনডেক্স সীমার বাইরে আছে কিনা তা পরীক্ষা করা একটি সমস্যা, তাই আমরা এটি এখানে করি। + +```typescript +const runResults = zokrates.computeWitness(digCompiled, [map, `${x}`, `${y}`]) +``` + +ডিগ প্রোগ্রামটি চালান। + +```typescript + const proof = zokrates.generateProof( + digCompiled.program, + runResults.witness, + proverKey) + + return proof + } +``` + +[`generateProof`](https://zokrates.github.io/toolbox/zokrates_js.html#generateproofprogram-witness-provingkey-entropy) ব্যবহার করুন এবং প্রমাণটি রিটার্ন করুন। + +```typescript +const solidityVerifier = ` + // Map size: ${width} x ${height} + \n${zokrates.exportSolidityVerifier(verifierKey)} + ` +``` + +একটি সলিডিটি ভেরিফায়ার, একটি স্মার্ট কন্ট্র্যাক্ট যা আমরা ব্লকচেইনে ডেপ্লয় করতে পারি এবং `digCompiled.program` দ্বারা উৎপাদিত প্রমাণগুলি যাচাই করতে ব্যবহার করতে পারি। + +```typescript + return { + zkDig, + calculateMapHash, + solidityVerifier, + } +} +``` + +অবশেষে, অন্য কোডের যা কিছু প্রয়োজন হতে পারে তা রিটার্ন করুন। + +## নিরাপত্তা পরীক্ষা {#security-tests} + +নিরাপত্তা পরীক্ষা গুরুত্বপূর্ণ কারণ একটি কার্যকারিতা বাগ অবশেষে নিজেকে প্রকাশ করবে। কিন্তু যদি অ্যাপ্লিকেশনটি অনিরাপদ হয়, তবে এটি সম্ভবত দীর্ঘ সময়ের জন্য লুকিয়ে থাকবে এবং তখনই প্রকাশ পাবে যখন কেউ প্রতারণা করে অন্যদের রিসোর্স নিয়ে পালিয়ে যাবে। + +### অনুমতি {#permissions} + +এই গেমে একটি সুবিধাপ্রাপ্ত সত্তা আছে, সেটি হলো সার্ভার। এটিই একমাত্র ব্যবহারকারী যে [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol)-এর ফাংশনগুলি কল করতে পারে। আমরা [`cast`](https://book.getfoundry.sh/cast/) ব্যবহার করে যাচাই করতে পারি যে অনুমতিপ্রাপ্ত ফাংশনগুলিতে কলগুলি শুধুমাত্র সার্ভার অ্যাকাউন্ট হিসাবেই অনুমোদিত। + +[সার্ভারের প্রাইভেট কী `setupNetwork.ts`-এ রয়েছে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/mud/setupNetwork.ts#L52)। + +1. `anvil` (ব্লকচেইন) চালানো কম্পিউটারে, এই এনভায়রনমেন্ট ভেরিয়েবলগুলি সেট করুন। + + ```sh copy + WORLD_ADDRESS=0x8d8b6b8414e1e3dcfd4168561b9be6bd3bf6ec4b + UNAUTHORIZED_KEY=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a + AUTHORIZED_KEY=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d + ``` + +2. একটি অননুমোদিত অ্যাড্রেস হিসাবে ভেরিফায়ার অ্যাড্রেস সেট করার চেষ্টা করতে `cast` ব্যবহার করুন। + + ```sh copy + cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $UNAUTHORIZED_KEY + ``` + + `cast` শুধুমাত্র একটি ব্যর্থতা রিপোর্ট করে না, বরং আপনি ব্রাউজারে গেমের **MUD Dev Tools** খুলতে পারেন, **Tables** ক্লিক করুন, এবং **app\_\_VerifierAddress** নির্বাচন করুন। দেখুন যে অ্যাড্রেসটি শূন্য নয়। + +3. সার্ভারের অ্যাড্রেস হিসাবে ভেরিফায়ার অ্যাড্রেস সেট করুন। + + ```sh copy + cast send $WORLD_ADDRESS 'app__setVerifier(address)' `cast address-zero` --private-key $AUTHORIZED_KEY + ``` + + **app\_\_VerifiedAddress**-এর অ্যাড্রেস এখন শূন্য হওয়া উচিত। + +একই `সিস্টেম`-এর সমস্ত MUD ফাংশন একই অ্যাক্সেস কন্ট্রোলের মধ্য দিয়ে যায়, তাই আমি এই পরীক্ষাটিকে যথেষ্ট মনে করি। যদি আপনি না করেন, আপনি [`ServerSystem`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/contracts/src/systems/ServerSystem.sol)-এর অন্যান্য ফাংশনগুলি পরীক্ষা করতে পারেন। + +### জিরো-নলেজ অপব্যবহার {#zero-knowledge-abuses} + +Zokrates যাচাই করার জন্য গণিত এই টিউটোরিয়ালের আওতার বাইরে (এবং আমার ক্ষমতার বাইরে)। তবে, আমরা জিরো-নলেজ কোডের উপর বিভিন্ন পরীক্ষা চালাতে পারি যাতে এটি সঠিকভাবে না করা হলে এটি ব্যর্থ হয় তা যাচাই করা যায়। এই সমস্ত পরীক্ষার জন্য আমাদের [`zero-knowledge.ts`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts) পরিবর্তন করতে হবে এবং পুরো অ্যাপ্লিকেশনটি পুনরায় চালু করতে হবে। সার্ভার প্রক্রিয়া পুনরায় চালু করা যথেষ্ট নয়, কারণ এটি অ্যাপ্লিকেশনটিকে একটি অসম্ভব স্টেটে ফেলে দেয় (খেলোয়াড়ের একটি গেম চলছে, কিন্তু গেমটি আর সার্ভারের কাছে উপলব্ধ নয়)। + +#### ভুল উত্তর {#wrong-answer} + +সবচেয়ে সহজ সম্ভাবনা হল জিরো-নলেজ প্রুফে ভুল উত্তর প্রদান করা। এটি করার জন্য, আমরা `zkDig`-এর ভিতরে যাই এবং [লাইন 91 পরিবর্তন করি](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L91): + +```ts +proof.inputs[3] = "0x" + "1".padStart(64, "0") +``` + +এর মানে হল আমরা সবসময় দাবি করব যে একটি বোমা আছে, সঠিক উত্তর নির্বিশেষে। এই সংস্করণটি নিয়ে খেলার চেষ্টা করুন, এবং আপনি `pnpm dev` স্ক্রিনের **সার্ভার** ট্যাবে এই ত্রুটিটি দেখতে পাবেন: + +``` + cause: { + code: 3, + message: 'execution reverted: revert: Zero knowledge verification fail', + data: '0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000 +000000000000000000000000000000000000000000000000205a65726f206b6e6f776c6564676520766572696669636174696f6 +e206661696c' + }, +``` + +তাই এই ধরনের প্রতারণা ব্যর্থ হয়। + +#### ভুল প্রমাণ {#wrong-proof} + +যদি আমরা সঠিক তথ্য প্রদান করি, কিন্তু ভুল প্রমাণের ডেটা রাখি তাহলে কী হবে? এখন, লাইন 91 প্রতিস্থাপন করুন: + +```ts +proof.proof = { + a: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], + b: [ + ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], + ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], + ], + c: ["0x" + "1".padStart(64, "0"), "0x" + "2".padStart(64, "0")], +} +``` + +এটি এখনও ব্যর্থ হয়, কিন্তু এখন এটি কারণ ছাড়াই ব্যর্থ হয় কারণ এটি ভেরিফায়ার কলের সময় ঘটে। + +### একজন ব্যবহারকারী কিভাবে জিরো ট্রাস্ট কোড যাচাই করতে পারে? {#user-verify-zero-trust} + +স্মার্ট কন্ট্র্যাক্ট যাচাই করা তুলনামূলকভাবে সহজ। সাধারণত, ডেভেলপার সোর্স কোডটি একটি ব্লক এক্সপ্লোরারে প্রকাশ করে, এবং ব্লক এক্সপ্লোরার যাচাই করে যে সোর্স কোডটি [কন্ট্র্যাক্ট ডেপ্লয়মেন্ট ট্রানজ্যাকশনে](/developers/docs/smart-contracts/deploying/) থাকা কোডে কম্পাইল হয় কিনা। MUD `সিস্টেম`-এর ক্ষেত্রে এটি [সামান্য জটিল](https://mud.dev/cli/verify), কিন্তু খুব বেশি নয়। + +জিরো-নলেজের ক্ষেত্রে এটি আরও কঠিন। ভেরিফায়ার কিছু ধ্রুবক অন্তর্ভুক্ত করে এবং সেগুলির উপর কিছু গণনা চালায়। এটি আপনাকে বলে না যে কী প্রমাণ করা হচ্ছে। + +```solidity + function verifyingKey() pure internal returns (VerifyingKey memory vk) { + vk.alpha = Pairing.G1Point(uint256(0x0f43f4fe7b5c2326fed4ac6ed2f4003ab9ab4ea6f667c2bdd77afb068617ee16), uint256(0x25a77832283f9726935219b5f4678842cda465631e72dbb24708a97ba5d0ce6f)); + vk.beta = Pairing.G2Point([uint256(0x2cebd0fbd21aca01910581537b21ae4fed46bc0e524c055059aa164ba0a6b62b), uint256(0x18fd4a7bc386cf03a95af7163d5359165acc4e7961cb46519e6d9ee4a1e2b7e9)], [uint256(0x11449dee0199ef6d8eebfe43b548e875c69e7ce37705ee9a00c81fe52f11a009), uint256(0x066d0c83b32800d3f335bb9e8ed5e2924cf00e77e6ec28178592eac9898e1a00)]); +``` + +সমাধান, অন্ততপক্ষে ব্লক এক্সপ্লোরাররা তাদের ব্যবহারকারী ইন্টারফেসে জোকরেটস যাচাইকরণ যোগ না করা পর্যন্ত, অ্যাপ্লিকেশন ডেভেলপারদের জন্য জোকরেটস প্রোগ্রামগুলি উপলব্ধ করা, এবং অন্তত কিছু ব্যবহারকারীর জন্য সেগুলিকে যথাযথ যাচাইকরণ কী দিয়ে নিজেদের কম্পাইল করা। + +এটি করতে হলে: + +1. [Zokrates ইনস্টল করুন](https://zokrates.github.io/gettingstarted.html)। + +2. Zokrates প্রোগ্রাম দিয়ে একটি ফাইল তৈরি করুন, `dig.zok`। নীচের কোডটি ধরে নেয় যে আপনি আসল ম্যাপের আকার, 10x5, রেখেছেন। + + ```zokrates + import "utils/pack/bool/pack128.zok" as pack128; + import "hashes/poseidon/poseidon.zok" as poseidon; + + def hashMap(bool[12][7] map) -> field { + bool[512] mut map1d = [false; 512]; + u32 mut counter = 0; + + for u32 x in 0..12 { + for u32 y in 0..7 { + map1d[counter] = map[x][y]; + counter = counter+1; + } + } + + field[4] hashMe = [ + pack128(map1d[0..128]), + pack128(map1d[128..256]), + pack128(map1d[256..384]), + pack128(map1d[384..512]) + ]; + + return poseidon(hashMe); + } + + + // The number of mines in location (x,y) + def map2mineCount(bool[12][7] map, u32 x, u32 y) -> u8 { + return if map[x+1][y+1] { 1 } else { 0 }; + } + + def main(private bool[12][7] map, u32 x, u32 y) -> (field, u8) { + return (hashMap(map) , + if map2mineCount(map, x, y) > 0 { 0xFF } else { + map2mineCount(map, x-1, y-1) + map2mineCount(map, x, y-1) + map2mineCount(map, x+1, y-1) + + map2mineCount(map, x-1, y) + map2mineCount(map, x+1, y) + + map2mineCount(map, x-1, y+1) + map2mineCount(map, x, y+1) + map2mineCount(map, x+1, y+1) + } + ); + } + ``` + +3. Zokrates কোড কম্পাইল করুন এবং যাচাইকরণ কী তৈরি করুন। যাচাইকরণ কীটি অবশ্যই আসল সার্ভারে ব্যবহৃত একই এন্ট্রপি দিয়ে তৈরি করতে হবে, [এক্ষেত্রে একটি খালি স্ট্রিং](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L67)। + + ```sh copy + zokrates compile --input dig.zok + zokrates setup -e "" + ``` + +4. আপনার নিজের সলিডিটি ভেরিফায়ার তৈরি করুন এবং যাচাই করুন যে এটি ব্লকচেইনের ভেরিফায়ারের সাথে কার্যকরীভাবে অভিন্ন (সার্ভার একটি মন্তব্য যোগ করে, তবে এটি গুরুত্বপূর্ণ নয়)। + + ```sh copy + zokrates export-verifier + diff verifier.sol ~/20240901-secret-state/packages/contracts/src/verifier.sol + ``` + +## ডিজাইন সিদ্ধান্ত {#design} + +যেকোনো যথেষ্ট জটিল অ্যাপ্লিকেশনে প্রতিযোগী ডিজাইন লক্ষ্য থাকে যা ট্রেড-অফের প্রয়োজন হয়। আসুন কিছু ট্রেডঅফ এবং কেন বর্তমান সমাধানটি অন্যান্য বিকল্পের চেয়ে শ্রেয় তা দেখি। + +### কেন জিরো-নলেজ {#why-zero-knowledge} + +মাইনসুইপারের জন্য আপনার সত্যিই জিরো-নলেজ প্রয়োজন নেই। সার্ভার সবসময় ম্যাপ ধরে রাখতে পারে এবং গেম শেষ হলে সবকিছু প্রকাশ করতে পারে। তারপর, গেমের শেষে, স্মার্ট কন্ট্র্যাক্টটি ম্যাপ হ্যাস গণনা করতে পারে, যাচাই করতে পারে যে এটি মেলে কিনা এবং যদি না মেলে তবে সার্ভারকে শাস্তি দিতে পারে বা গেমটি পুরোপুরি উপেক্ষা করতে পারে। + +আমি এই সহজ সমাধানটি ব্যবহার করিনি কারণ এটি শুধুমাত্র একটি নির্দিষ্ট শেষ স্টেট সহ ছোট গেমগুলির জন্য কাজ করে। যখন একটি গেম সম্ভাব্যভাবে অসীম হয় (যেমন [অটোনোমাস ওয়ার্ল্ডস](https://0xparc.org/blog/autonomous-worlds)-এর ক্ষেত্রে), তখন আপনার এমন একটি সমাধান প্রয়োজন যা স্টেটটি _প্রকাশ না করেই_ প্রমাণ করে। + +একটি টিউটোরিয়াল হিসাবে এই নিবন্ধটির জন্য একটি ছোট এবং সহজে বোঝা যায় এমন একটি গেম প্রয়োজন ছিল, কিন্তু এই কৌশলটি দীর্ঘ গেমগুলির জন্য সবচেয়ে উপযোগী। + +### কেন Zokrates? {#why-zokrates} + +[Zokrates](https://zokrates.github.io/) একমাত্র জিরো-নলেজ লাইব্রেরি নয়, কিন্তু এটি একটি সাধারণ, [ইম্পারেটিভ](https://en.wikipedia.org/wiki/Imperative_programming) প্রোগ্রামিং ভাষার মতো এবং বুলিয়ান ভেরিয়েবল সমর্থন করে। + +আপনার অ্যাপ্লিকেশনের জন্য, বিভিন্ন প্রয়োজনীয়তার সাথে, আপনি [Circum](https://docs.circom.io/getting-started/installation/) বা [Cairo](https://www.cairo-lang.org/tutorials/getting-started-with-cairo/) ব্যবহার করতে পছন্দ করতে পারেন। + +### কখন Zokrates কম্পাইল করবেন {#when-compile-zokrates} + +এই প্রোগ্রামে আমরা Zokrates প্রোগ্রামগুলি [প্রতিবার সার্ভার শুরু হওয়ার সময়](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L60-L61) কম্পাইল করি। এটি স্পষ্টতই রিসোর্সের অপচয়, কিন্তু এটি একটি টিউটোরিয়াল, যা সরলতার জন্য অপ্টিমাইজ করা হয়েছে। + +যদি আমি একটি প্রোডাকশন-লেভেল অ্যাপ্লিকেশন লিখতাম, আমি পরীক্ষা করে দেখতাম যে আমার কাছে এই মাইনফিল্ড আকারে কম্পাইল করা জোকরেটস প্রোগ্রামগুলির একটি ফাইল আছে কিনা, এবং যদি থাকে তবে সেটি ব্যবহার করতাম। অনচেইনে একটি ভেরিফায়ার কন্ট্র্যাক্ট ডেপ্লয় করার ক্ষেত্রেও একই কথা প্রযোজ্য। + +### ভেরিফায়ার এবং প্রোভার কী তৈরি করা {#key-creation} + +[কী তৈরি করা](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L63-L69) আরেকটি বিশুদ্ধ গণনা যা একটি নির্দিষ্ট মাইনফিল্ড আকারের জন্য একাধিকবার করার প্রয়োজন নেই। আবার, এটি শুধুমাত্র সরলতার খাতিরে একবার করা হয়। + +এছাড়াও, আমরা [একটি সেটআপ অনুষ্ঠান](https://zokrates.github.io/toolbox/trusted_setup.html#initializing-a-phase-2-ceremony) ব্যবহার করতে পারতাম। একটি সেটআপ অনুষ্ঠানের সুবিধা হল যে জিরো-নলেজ প্রুফে প্রতারণা করার জন্য আপনার হয় এন্ট্রপি অথবা প্রতিটি অংশগ্রহণকারীর থেকে কিছু মধ্যবর্তী ফলাফলের প্রয়োজন। যদি অন্তত একজন অনুষ্ঠান অংশগ্রহণকারী সৎ হয় এবং সেই তথ্য মুছে ফেলে, তাহলে জিরো-নলেজ প্রমাণগুলি নির্দিষ্ট আক্রমণ থেকে নিরাপদ থাকে। তবে, তথ্য সর্বত্র থেকে মুছে ফেলা হয়েছে কিনা তা যাচাই করার জন্য _কোনো প্রক্রিয়া_ নেই। যদি জিরো-নলেজ প্রমাণগুলি অত্যন্ত গুরুত্বপূর্ণ হয়, তাহলে আপনি সেটআপ অনুষ্ঠানে অংশ নিতে চাইবেন। + +এখানে আমরা [টাউ-এর পারপেচুয়াল পাওয়ার](https://github.com/privacy-scaling-explorations/perpetualpowersoftau)-এর উপর নির্ভর করি, যেখানে কয়েক ডজন অংশগ্রহণকারী ছিল। এটি সম্ভবত যথেষ্ট নিরাপদ এবং অনেক সহজ। আমরা কী তৈরির সময় এন্ট্রপি যোগ করি না, যা ব্যবহারকারীদের জন্য [জিরো-নলেজ কনফিগারেশন যাচাই করা](#user-verify-zero-trust) সহজ করে তোলে। + +### কোথায় যাচাই করবেন {#where-verification} + +আমরা জিরো-নলেজ প্রমাণগুলি হয় অনচেইনে (যা গ্যাস খরচ করে) অথবা ক্লায়েন্টে ([`verify`](https://zokrates.github.io/toolbox/zokrates_js.html#verifyverificationkey-proof) ব্যবহার করে) যাচাই করতে পারি। আমি প্রথমটি বেছে নিয়েছি, কারণ এটি আপনাকে একবার [ভেরিফায়ার যাচাই করতে](#user-verify-zero-trust) দেয় এবং তারপর বিশ্বাস করতে দেয় যে যতক্ষণ পর্যন্ত এর জন্য কন্ট্র্যাক্ট অ্যাড্রেস একই থাকে ততক্ষণ এটি পরিবর্তন হবে না। যদি ক্লায়েন্টে যাচাই করা হতো, তাহলে প্রতিবার ক্লায়েন্ট ডাউনলোড করার সময় আপনাকে পাওয়া কোডটি যাচাই করতে হতো। + +এছাড়াও, যদিও এই গেমটি একক খেলোয়াড়ের, অনেক ব্লকচেইন গেম বহু-খেলোয়াড়ের হয়। অনচেইন যাচাইকরণ মানে আপনি শুধুমাত্র একবার জিরো-নলেজ প্রুফ যাচাই করবেন। এটি ক্লায়েন্টে করলে প্রতিটি ক্লায়েন্টকে স্বাধীনভাবে যাচাই করতে হবে। + +### টাইপস্ক্রিপ্ট নাকি জোকরেটসে ম্যাপ ফ্ল্যাটেন করবেন? {#where-flatten} + +সাধারণভাবে, যখন প্রসেসিং টাইপস্ক্রিপ্ট বা জোকরেটসে করা যেতে পারে, তখন টাইপস্ক্রিপ্টে করা ভালো, যা অনেক দ্রুত এবং জিরো-নলেজ প্রুফের প্রয়োজন হয় না। এই কারণেই, উদাহরণস্বরূপ, আমরা জোকরেটসকে হ্যাস সরবরাহ করি না এবং এটিকে এটি সঠিক কিনা তা যাচাই করতে বলি না। হ্যাশিং জোকরেটসের ভিতরে করতে হবে, কিন্তু রিটার্ন করা হ্যাস এবং অনচেইনের হ্যাসের মধ্যে মিল এর বাইরে হতে পারে। + +তবে, আমরা এখনও [জোকরেটসে ম্যাপটিকে ফ্ল্যাটেন করি](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L15-L20), যেখানে আমরা এটি টাইপস্ক্রিপ্টে করতে পারতাম। কারণ হল যে অন্যান্য বিকল্পগুলি, আমার মতে, আরও খারাপ। + +- জোকরেটস কোডে একটি বুলিয়ানের এক-মাত্রিক অ্যারে সরবরাহ করুন এবং দ্বি-মাত্রিক ম্যাপ পেতে `x*(height+2) + +y`-এর মতো একটি এক্সপ্রেশন ব্যবহার করুন। এটি [কোডটিকে](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/zero-knowledge.ts#L44-L47) কিছুটা জটিল করে তুলবে, তাই আমি সিদ্ধান্ত নিয়েছি যে একটি টিউটোরিয়ালের জন্য পারফরম্যান্স লাভ মূল্যবান নয়। + +- Zokrates-এ এক-মাত্রিক এবং দ্বি-মাত্রিক উভয় অ্যারে পাঠান। তবে, এই সমাধানে আমাদের কোনো লাভ নেই। জোকরেটস কোডটিকে যাচাই করতে হবে যে এটিকে দেওয়া এক-মাত্রিক অ্যারেটি সত্যিই দ্বি-মাত্রিক অ্যারের সঠিক উপস্থাপনা। তাই কোনো কর্মক্ষমতা লাভ হবে না। + +- জোকরেটসে দ্বি-মাত্রিক অ্যারে ফ্ল্যাটেন করুন। এটি সবচেয়ে সহজ বিকল্প, তাই আমি এটি বেছে নিয়েছি। + +### ম্যাপ কোথায় সংরক্ষণ করবেন {#where-store-maps} + +এই অ্যাপ্লিকেশনে [`gamesInProgress`](https://github.com/qbzzt/20240901-secret-state/blob/main/packages/server/src/app.ts#L20) কেবল মেমরিতে একটি ভেরিয়েবল। এর মানে হল যে যদি আপনার সার্ভার মারা যায় এবং পুনরায় চালু করার প্রয়োজন হয়, তবে এটিতে সংরক্ষিত সমস্ত তথ্য হারিয়ে যাবে। খেলোয়াড়রা কেবল তাদের গেম চালিয়ে যেতে অক্ষম হয় না, তারা এমনকি একটি নতুন গেম শুরু করতেও পারে না কারণ অনচেইন কম্পোনেন্ট মনে করে যে তাদের এখনও একটি গেম চলছে। + +এটি একটি প্রোডাকশন সিস্টেমের জন্য স্পষ্টতই একটি খারাপ ডিজাইন, যেখানে আপনি এই তথ্য একটি ডেটাবেসে সংরক্ষণ করবেন। আমি এখানে একটি ভেরিয়েবল ব্যবহার করার একমাত্র কারণ হল এটি একটি টিউটোরিয়াল এবং সরলতাই প্রধান বিবেচনা। + +## উপসংহার: কোন পরিস্থিতিতে এই কৌশলটি উপযুক্ত? {#conclusion} + +সুতরাং, এখন আপনি জানেন কিভাবে এমন একটি সার্ভার দিয়ে একটি গেম লিখতে হয় যা গোপন স্টেট সংরক্ষণ করে যা অনচেইনে থাকার কথা নয়। কিন্তু কোন ক্ষেত্রে আপনার এটি করা উচিত? দুটি প্রধান বিবেচনা রয়েছে। + +- _দীর্ঘ সময় ধরে চলা গেম_: [উপরে যেমন উল্লেখ করা হয়েছে](#why-zero-knowledge), একটি ছোট গেমে আপনি গেম শেষ হওয়ার পরে স্টেট প্রকাশ করতে পারেন এবং সবকিছু তখন যাচাই করতে পারেন। কিন্তু যখন গেমটি দীর্ঘ বা অনির্দিষ্ট সময় নেয় এবং স্টেটটি গোপন রাখতে হয় তখন এটি একটি বিকল্প নয়। + +- _কিছু কেন্দ্রীকরণ গ্রহণযোগ্য_: জিরো-নলেজ প্রমাণগুলি সততা যাচাই করতে পারে, যে একটি সত্তা ফলাফল জাল করছে না। তারা যা করতে পারে না তা হল নিশ্চিত করা যে সত্তাটি এখনও উপলব্ধ থাকবে এবং মেসেজের উত্তর দেবে। যেসব পরিস্থিতিতে উপলব্ধতাও বিকেন্দ্রীভূত হতে হবে, সেখানে জিরো-নলেজ প্রমাণ একটি যথেষ্ট সমাধান নয় এবং আপনার [মাল্টি-পার্টি কম্পিউটেশন](https://en.wikipedia.org/wiki/Secure_multi-party_computation) প্রয়োজন। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। + +### স্বীকৃতি {#acknowledgements} + +- আলভারো আলোনসো এই নিবন্ধের একটি খসড়া পড়েছেন এবং জোকরেটস সম্পর্কে আমার কিছু ভুল বোঝাবুঝি দূর করেছেন। + +যেকোনো অবশিষ্ট ত্রুটির জন্য আমি দায়ী। diff --git a/public/content/translations/bn/developers/tutorials/secure-development-workflow/index.md b/public/content/translations/bn/developers/tutorials/secure-development-workflow/index.md new file mode 100644 index 00000000000..6d455b4ef09 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/secure-development-workflow/index.md @@ -0,0 +1,52 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট সুরক্ষা চেকলিস্ট" +description: "সুরক্ষিত স্মার্ট কন্ট্র্যাক্ট লেখার জন্য একটি প্রস্তাবিত ওয়ার্কফ্লো" +author: "Trailofbits" +tags: [ "স্মার্ট কন্ট্র্যাক্ট", "নিরাপত্তা", "সলিডিটি" ] +skill: intermediate +lang: bn +published: 2020-09-07 +source: Building secure contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/workflow.md +--- + +## স্মার্ট কন্ট্র্যাক্ট ডেভেলপমেন্ট চেকলিস্ট {#smart-contract-development-checklist} + +আপনার স্মার্ট কন্ট্র্যাক্ট লেখার সময় আমরা যে উচ্চ-স্তরের প্রক্রিয়া অনুসরণ করার পরামর্শ দিই তা এখানে দেওয়া হল। + +জ্ঞাত সুরক্ষা সমস্যাগুলির জন্য পরীক্ষা করুন: + +- [Slither](https://github.com/crytic/slither) দিয়ে আপনার কন্ট্র্যাক্টগুলি পর্যালোচনা করুন। সাধারণ দুর্বলতার জন্য এটিতে 40টিরও বেশি অন্তর্নির্মিত ডিটেক্টর রয়েছে। নতুন কোড সহ প্রতিটি চেক-ইনে এটি চালান এবং নিশ্চিত করুন যে এটি একটি ক্লিন রিপোর্ট পায় (অথবা নির্দিষ্ট সমস্যাগুলিকে নীরব করতে ট্রায়াজ মোড ব্যবহার করুন)। +- [Crytic](https://crytic.io/) দিয়ে আপনার কন্ট্র্যাক্টগুলি পর্যালোচনা করুন। এটি এমন 50টি সমস্যা পরীক্ষা করে যা Slither করে না। GitHub-এর পুল রিকোয়েস্টে সুরক্ষা সংক্রান্ত সমস্যাগুলি সহজেই তুলে ধরে Crytic আপনার টিমকে একে অপরের কাজের উপর নজর রাখতে সাহায্য করতে পারে। + +আপনার কন্ট্র্যাক্টের বিশেষ বৈশিষ্ট্যগুলি বিবেচনা করুন: + +- আপনার কন্ট্র্যাক্টগুলি কি আপগ্রেডযোগ্য? [`slither-check-upgradeability`](https://github.com/crytic/slither/wiki/Upgradeability-Checks) বা [Crytic](https://blog.trailofbits.com/2020/06/12/upgradeable-contracts-made-safer-with-crytic/) দিয়ে ত্রুটির জন্য আপনার আপগ্রেডিবিলিটি কোড পর্যালোচনা করুন। আমরা 17টি উপায় নথিভুক্ত করেছি যেখানে আপগ্রেডগুলি ভুল পথে যেতে পারে। +- আপনার কন্ট্র্যাক্টগুলি কি ERC-গুলির সাথে সঙ্গতিপূর্ণ হওয়ার দাবি করে? [`slither-check-erc`](https://github.com/crytic/slither/wiki/ERC-Conformance) দিয়ে সেগুলি পরীক্ষা করুন। এই টুলটি ছয়টি সাধারণ স্পেক থেকে তৎক্ষণাৎ বিচ্যুতি শনাক্ত করে। +- আপনি কি থার্ড পার্টি টোকেনের সাথে একীভূত করেন? বাহ্যিক কন্ট্র্যাক্টের উপর নির্ভর করার আগে আমাদের [টোকেন ইন্টিগ্রেশন চেকলিস্ট](/developers/tutorials/token-integration-checklist/) পর্যালোচনা করুন। + +আপনার কোডের গুরুত্বপূর্ণ সুরক্ষা বৈশিষ্ট্যগুলি দৃশ্যত পরিদর্শন করুন: + +- Slither-এর [inheritance-graph](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) প্রিন্টার পর্যালোচনা করুন। অনিচ্ছাকৃত শ্যাডোয়িং এবং C3 লিনিয়ারাইজেশন সমস্যা এড়িয়ে চলুন। +- Slither-এর [function-summary](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) প্রিন্টার পর্যালোচনা করুন। এটি ফাংশন ভিজিবিলিটি এবং অ্যাক্সেস কন্ট্রোল রিপোর্ট করে। +- Slither-এর [vars-and-auth](https://github.com/trailofbits/slither/wiki/Printer-documentation#variables-written-and-authorization) প্রিন্টার পর্যালোচনা করুন। এটি স্টেট ভেরিয়েবলের উপর অ্যাক্সেস কন্ট্রোল রিপোর্ট করে। + +গুরুত্বপূর্ণ সুরক্ষা বৈশিষ্ট্যগুলি নথিভুক্ত করুন এবং সেগুলিকে মূল্যায়ন করার জন্য স্বয়ংক্রিয় পরীক্ষা জেনারেটর ব্যবহার করুন: + +- [আপনার কোডের জন্য সুরক্ষা বৈশিষ্ট্যগুলি নথিভুক্ত করতে](/developers/tutorials/guide-to-smart-contract-security-tools/) শিখুন। শুরুতে এটি কঠিন, কিন্তু একটি ভাল ফলাফল অর্জনের জন্য এটি একমাত্র সবচেয়ে গুরুত্বপূর্ণ কার্যকলাপ। এই টিউটোরিয়ালের যেকোনো উন্নত কৌশল ব্যবহার করার জন্য এটি একটি পূর্বশর্তও। +- [Echidna](https://github.com/crytic/echidna) এবং [Manticore](https://manticore.readthedocs.io/en/latest/verifier.html)-এর সাথে ব্যবহারের জন্য Solidity-তে সুরক্ষা বৈশিষ্ট্যগুলি সংজ্ঞায়িত করুন। আপনার স্টেট মেশিন, অ্যাক্সেস কন্ট্রোল, গাণিতিক ক্রিয়াকলাপ, বাহ্যিক মিথস্ক্রিয়া এবং স্ট্যান্ডার্ড কনফরম্যান্সের উপর মনোযোগ দিন। +- [Slither's Python API](/developers/tutorials/how-to-use-slither-to-find-smart-contract-bugs/) দিয়ে সুরক্ষা বৈশিষ্ট্যগুলি সংজ্ঞায়িত করুন। ইনহেরিটেন্স, ভেরিয়েবল নির্ভরতা, অ্যাক্সেস কন্ট্রোল এবং অন্যান্য কাঠামোগত সমস্যাগুলির উপর মনোযোগ দিন। +- [Crytic](https://crytic.io) দিয়ে প্রতিটি কমিটে আপনার প্রপার্টি টেস্টগুলি চালান। Crytic সুরক্ষা প্রপার্টি টেস্টগুলি গ্রহণ এবং মূল্যায়ন করতে পারে যাতে আপনার দলের প্রত্যেকে সহজেই দেখতে পারে যে তারা GitHub-এ পাস করেছে। ব্যর্থ পরীক্ষা কমিট ব্লক করতে পারে। + +অবশেষে, সেইসব সমস্যাগুলির বিষয়ে সচেতন থাকুন যা স্বয়ংক্রিয় টুলগুলি সহজে খুঁজে পায় না: + +- গোপনীয়তার অভাব: যখন আপনার লেনদেনগুলি পুলে সারিবদ্ধ থাকে, তখন অন্য সবাই সেগুলি দেখতে পারে +- ফ্রন্ট রানিং লেনদেন +- ক্রিপ্টোগ্রাফিক অপারেশন +- বাহ্যিক DeFi উপাদানগুলির সাথে ঝুঁকিপূর্ণ মিথস্ক্রিয়া + +## সাহায্যের জন্য জিজ্ঞাসা করুন {#ask-for-help} + +[ইথেরিয়াম অফিস আওয়ারস](https://calendly.com/dan-trailofbits/office-hours) প্রতি মঙ্গলবার বিকেলে চলে। এই 1-ঘণ্টার, 1-অন-1 সেশনগুলি হল সুরক্ষা সম্পর্কে আপনার যেকোনো প্রশ্ন আমাদের জিজ্ঞাসা করার, আমাদের টুলস ব্যবহার করে সমস্যা সমাধান করার এবং আপনার বর্তমান পদ্ধতি সম্পর্কে বিশেষজ্ঞদের কাছ থেকে মতামত পাওয়ার একটি সুযোগ। আমরা আপনাকে এই নির্দেশিকাটি বুঝতে সাহায্য করব। + +আমাদের Slack-এ যোগ দিন: [Empire Hacking](https://join.slack.com/t/empirehacking/shared_invite/zt-h97bbrj8-1jwuiU33nnzg67JcvIciUw)। আপনার কোনো প্রশ্ন থাকলে আমরা #crytic এবং #ethereum চ্যানেলগুলিতে সবসময় উপলব্ধ থাকি। diff --git a/public/content/translations/bn/developers/tutorials/send-token-ethersjs/index.md b/public/content/translations/bn/developers/tutorials/send-token-ethersjs/index.md new file mode 100644 index 00000000000..c4e5dfcd939 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/send-token-ethersjs/index.md @@ -0,0 +1,210 @@ +--- +title: "ethers.js ব্যবহার করে টোকেন পাঠানো" +description: "ethers.js ব্যবহার করে টোকেন পাঠানোর জন্য একটি শিক্ষানবিস-বান্ধব নির্দেশিকা।" +author: Kim YongJun +tags: [ "ETHERS.JS", "ERC-20", "টোকেন" ] +skill: beginner +lang: bn +published: 2021-04-06 +--- + +## ethers.js(5.0) ব্যবহার করে টোকেন পাঠান {#send-token} + +### এই টিউটোরিয়ালে আপনি যেভাবে শিখবেন {#you-learn-about} + +- ethers.js ইমপোর্ট করুন +- টোকেন ট্রান্সফার করুন +- নেটওয়ার্ক ট্র্যাফিকের অবস্থা অনুযায়ী গ্যাসের মূল্য নির্ধারণ করুন + +### শুরু করতে {#to-get-started} + +শুরু করার জন্য, আমাদের প্রথমে আমাদের জাভাস্ক্রিপ্টে ethers.js লাইব্রেরিটি ইমপোর্ট করতে হবে +ethers.js(5.0) অন্তর্ভুক্ত করুন + +### ইনস্টল করা হচ্ছে {#install-ethersjs} + +```shell +/home/ricmoo> npm install --save ethers +``` + +ব্রাউজারে ES6 + +```html + +``` + +ব্রাউজারে ES3(UMD) + +```html + +``` + +### প্যারামিটার {#param} + +1. **`contract_address`**: টোকেন চুক্তির ঠিকানা (চুক্তির ঠিকানা প্রয়োজন যখন আপনি যে টোকেনটি ট্রান্সফার করতে চান তা ইথার নয়) +2. **`send_token_amount`**: আপনি প্রাপকের কাছে যে পরিমাণ পাঠাতে চান +3. **`to_address`**: প্রাপকের ঠিকানা +4. **`send_account`**: প্রেরকের ঠিকানা +5. **`private_key`**: লেনদেনে স্বাক্ষর করতে এবং প্রকৃতপক্ষে টোকেন ট্রান্সফার করতে প্রেরকের প্রাইভেট কী + +## বিজ্ঞপ্তি {#notice} + +`signTransaction(tx)` সরানো হয়েছে কারণ `sendTransaction()` এটি অভ্যন্তরীণভাবে করে। + +## পাঠানোর পদ্ধতি {#procedure} + +### ১. নেটওয়ার্কের সাথে সংযোগ করুন (টেস্টনেট) {#connect-to-network} + +#### প্রোভাইডার সেট করুন (Infura) {#set-provider} + +Ropsten টেস্টনেটের সাথে সংযোগ করুন + +```javascript +window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") +``` + +### 2. ওয়ালেট তৈরি করুন {#create-wallet} + +```javascript +let wallet = new ethers.Wallet(private_key) +``` + +### 3. ওয়ালেটকে নেটের সাথে সংযোগ করুন {#connect-wallet-to-net} + +```javascript +let walletSigner = wallet.connect(window.ethersProvider) +``` + +### ৪. বর্তমান গ্যাসের মূল্য জানুন {#get-gas} + +```javascript +window.ethersProvider.getGasPrice() // gasPrice +``` + +### ৫। লেনদেন সংজ্ঞায়িত করুন {#define-transaction} + +নীচে সংজ্ঞায়িত এই ভেরিয়েবলগুলো `send_token()` এর উপর নির্ভরশীল + +### লেনদেনের প্যারামিটার {#transaction-params} + +1. **`send_account`**: টোকেন প্রেরকের ঠিকানা +2. **`to_address`**: টোকেন প্রাপকের ঠিকানা +3. **`send_token_amount`**: পাঠানোর জন্য টোকেনের পরিমাণ +4. **`gas_limit`**: গ্যাস লিমিট +5. **`gas_price`**: গ্যাসের মূল্য + +[কীভাবে ব্যবহার করতে হয় তার জন্য নীচে দেখুন](#how-to-use) + +```javascript +const tx = { + from: send_account, + to: to_address, + value: ethers.utils.parseEther(send_token_amount), + nonce: window.ethersProvider.getTransactionCount(send_account, "latest"), + gasLimit: ethers.utils.hexlify(gas_limit), // 100000 + gasPrice: gas_price, +} +``` + +### ৬. ট্রান্সফার {#transfer} + +```javascript +walletSigner.sendTransaction(tx).then((transaction) => { + console.dir(transaction) + alert("পাঠানো সম্পন্ন হয়েছে!") +}) +``` + +## কীভাবে এটি ব্যবহার করবেন {#how-to-use} + +```javascript +let private_key = + "41559d28e936dc92104ff30691519693fc753ffbee6251a611b9aa1878f12a4d" +let send_token_amount = "1" +let to_address = "0x4c10D2734Fb76D3236E522509181CC3Ba8DE0e80" +let send_address = "0xda27a282B5B6c5229699891CfA6b900A716539E6" +let gas_limit = "0x100000" +let wallet = new ethers.Wallet(private_key) +let walletSigner = wallet.connect(window.ethersProvider) +let contract_address = "" +window.ethersProvider = new ethers.providers.InfuraProvider("ropsten") + +send_token( + contract_address, + send_token_amount, + to_address, + send_address, + private_key +) +``` + +### সাফল্য! {#success} + +![সফলভাবে সম্পন্ন লেনদেনের ছবি](./successful-transaction.png) + +## send_token() {#send-token-method} + +```javascript +function send_token( + contract_address, + send_token_amount, + to_address, + send_account, + private_key +) { + let wallet = new ethers.Wallet(private_key) + let walletSigner = wallet.connect(window.ethersProvider) + + window.ethersProvider.getGasPrice().then((currentGasPrice) => { + let gas_price = ethers.utils.hexlify(parseInt(currentGasPrice)) + console.log(`gas_price: ${gas_price}`) + + if (contract_address) { + // সাধারণ টোকেন পাঠান + let contract = new ethers.Contract( + contract_address, + send_abi, + walletSigner + ) + + // কতগুলো টোকেন? + let numberOfTokens = ethers.utils.parseUnits(send_token_amount, 18) + console.log(`numberOfTokens: ${numberOfTokens}`) + + // টোকেন পাঠান + contract.transfer(to_address, numberOfTokens).then((transferResult) => { + console.dir(transferResult) + alert("টোকেন পাঠানো হয়েছে") + }) + } // ইথার পাঠান + else { + const tx = { + from: send_account, + to: to_address, + value: ethers.utils.parseEther(send_token_amount), + nonce: window.ethersProvider.getTransactionCount( + send_account, + "latest" + ), + gasLimit: ethers.utils.hexlify(gas_limit), // 100000 + gasPrice: gas_price, + } + console.dir(tx) + try { + walletSigner.sendTransaction(tx).then((transaction) => { + console.dir(transaction) + alert("পাঠানো সম্পন্ন হয়েছে!") + }) + } catch (error) { + alert("পাঠাতে ব্যর্থ!!") + } + } + }) +} +``` diff --git a/public/content/translations/bn/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md b/public/content/translations/bn/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md new file mode 100644 index 00000000000..58fd7812144 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/sending-transactions-using-web3-and-alchemy/index.md @@ -0,0 +1,208 @@ +--- +title: "Web3 ব্যবহার করে লেনদেন পাঠানো" +description: "Web3 ব্যবহার করে Ethereum লেনদেন পাঠানোর জন্য এটি একটি শিক্ষানবিস-বান্ধব নির্দেশিকা। Ethereum ব্লকচেইনে একটি লেনদেন পাঠানোর জন্য তিনটি প্রধান ধাপ রয়েছে: তৈরি করা, স্বাক্ষর করা এবং সম্প্রচার করা। আমরা তিনটিই দেখব।" +author: "Elan Halpern" +tags: [ "লেনদেনসমূহ", "web3.js", "alchemy" ] +skill: beginner +lang: bn +published: 2020-11-04 +source: Alchemy docs +sourceUrl: https://www.alchemy.com/docs/how-to-send-transactions-on-ethereum +--- + +Web3 ব্যবহার করে Ethereum লেনদেন পাঠানোর জন্য এটি একটি শিক্ষানবিস-বান্ধব নির্দেশিকা। Ethereum ব্লকচেইনে একটি লেনদেন পাঠানোর জন্য তিনটি প্রধান ধাপ রয়েছে: তৈরি করা, স্বাক্ষর করা এবং সম্প্রচার করা। আমরা তিনটিই দেখব, আশা করি আপনার মনে থাকা যেকোনো প্রশ্নের উত্তর দিতে পারব! এই টিউটোরিয়ালে, আমরা আমাদের লেনদেনগুলি Ethereum চেইনে পাঠাতে [Alchemy](https://www.alchemy.com/) ব্যবহার করব। আপনি [এখানে একটি বিনামূল্যে Alchemy অ্যাকাউন্ট তৈরি করতে পারেন](https://auth.alchemyapi.io/signup)। + +**দ্রষ্টব্য:** এই নির্দেশিকাটি আপনার অ্যাপের জন্য _ব্যাকএন্ডে_ আপনার লেনদেনে স্বাক্ষর করার জন্য। আপনি যদি ফ্রন্টএন্ডে আপনার লেনদেনে স্বাক্ষর করাকে একীভূত করতে চান, তাহলে [একটি ব্রাউজার প্রদানকারীর সাথে Web3](https://docs.alchemy.com/reference/api-overview#with-a-browser-provider) একীভূত করা দেখুন। + +## মৌলিক বিষয়াবলী {#the-basics} + +বেশিরভাগ ব্লকচেইন ডেভেলপারদের মতো যখন তারা প্রথম শুরু করে, আপনি হয়তো একটি লেনদেন কীভাবে পাঠাতে হয় (যা বেশ সহজ হওয়া উচিত) সে সম্পর্কে কিছু গবেষণা করেছেন এবং প্রচুর নির্দেশিকা পেয়েছেন, যার প্রতিটি বিভিন্ন কথা বলছে এবং আপনাকে কিছুটা অভিভূত ও বিভ্রান্ত করে ফেলেছে। আপনি যদি সেই পরিস্থিতিতে থাকেন, চিন্তা করবেন না; আমরা সবাই এক পর্যায়ে ছিলাম! সুতরাং, শুরু করার আগে, আসুন কয়েকটি বিষয় পরিষ্কার করে নেওয়া যাক: + +### ১। Alchemy আপনার প্রাইভেট কী সংরক্ষণ করে না {#alchemy-does-not-store-your-private-keys} + +- এর মানে হল যে Alchemy আপনার পক্ষে লেনদেনে স্বাক্ষর এবং পাঠাতে পারে না। এর কারণ হল নিরাপত্তা। Alchemy আপনাকে কখনই আপনার প্রাইভেট কী শেয়ার করতে বলবে না এবং আপনার কখনই আপনার প্রাইভেট কী কোনো হোস্ট করা নোড (বা অন্য কারো) সাথে শেয়ার করা উচিত নয়। +- আপনি Alchemy-এর কোর API ব্যবহার করে ব্লকচেইন থেকে পড়তে পারেন, কিন্তু এতে লেখার জন্য আপনাকে Alchemy-এর মাধ্যমে পাঠানোর আগে আপনার লেনদেনগুলিতে স্বাক্ষর করার জন্য অন্য কিছু ব্যবহার করতে হবে (এটি অন্য যেকোনো [নোড পরিষেবা](/developers/docs/nodes-and-clients/nodes-as-a-service/)-এর জন্যও একই)। + +### ২। “সাইনার” কী? {#what-is-a-signer} + +- সাইনাররা আপনার প্রাইভেট কী ব্যবহার করে আপনার জন্য লেনদেনে স্বাক্ষর করবে। এই টিউটোরিয়ালে আমরা আমাদের লেনদেনে স্বাক্ষর করার জন্য [Alchemy web3](https://docs.alchemyapi.io/alchemy/documentation/alchemy-web3) ব্যবহার করব, কিন্তু আপনি অন্য যেকোনো web3 লাইব্রেরিও ব্যবহার করতে পারেন। +- ফ্রন্টএন্ডে, একজন সাইনারের একটি ভাল উদাহরণ হল [MetaMask](https://metamask.io/), যা আপনার পক্ষে লেনদেনে স্বাক্ষর করবে এবং পাঠাবে। + +### ৩। আমার লেনদেনগুলিতে স্বাক্ষর করার প্রয়োজন কেন? {#why-do-i-need-to-sign-my-transactions} + +- Ethereum নেটওয়ার্কে লেনদেন পাঠাতে চায় এমন প্রত্যেক ব্যবহারকারীকে লেনদেনটি স্বাক্ষর করতে হবে (তাদের প্রাইভেট কী ব্যবহার করে), যাতে লেনদেনের উৎসটি যা দাবি করা হচ্ছে তা যাচাই করা যায়। +- এই প্রাইভেট কী রক্ষা করা অত্যন্ত গুরুত্বপূর্ণ, কারণ এটির অ্যাক্সেস আপনার Ethereum অ্যাকাউন্টের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়, যা আপনাকে (বা অ্যাক্সেস থাকা যে কাউকে) আপনার পক্ষে লেনদেন করার অনুমতি দেয়। + +### ৪। আমি কীভাবে আমার প্রাইভেট কী রক্ষা করব? {#how-do-i-protect-my-private-key} + +- আপনার প্রাইভেট কী রক্ষা করার এবং লেনদেন পাঠানোর জন্য এটি ব্যবহার করার অনেক উপায় রয়েছে। এই টিউটোরিয়ালে আমরা একটি `.env` ফাইল ব্যবহার করব। তবে, আপনি প্রাইভেট কী সংরক্ষণ করে এমন একটি পৃথক প্রদানকারী, একটি কীস্টোর ফাইল বা অন্যান্য বিকল্পও ব্যবহার করতে পারেন। + +### ৫। `eth_sendTransaction` এবং `eth_sendRawTransaction`-এর মধ্যে পার্থক্য কী? {#difference-between-send-and-send-raw} + +`eth_sendTransaction` এবং `eth_sendRawTransaction` উভয়ই Ethereum API ফাংশন যা Ethereum নেটওয়ার্কে একটি লেনদেন সম্প্রচার করে যাতে এটি ভবিষ্যতের একটি ব্লকে যোগ করা হয়। লেনদেনের স্বাক্ষর তারা কীভাবে পরিচালনা করে তার উপর তাদের মধ্যে পার্থক্য। + +- [`eth_sendTransaction`](https://docs.web3js.org/api/web3-eth/function/sendTransaction) _স্বাক্ষরবিহীন_ লেনদেন পাঠানোর জন্য ব্যবহৃত হয়, যার মানে আপনি যে নোডে পাঠাচ্ছেন তাকে অবশ্যই আপনার প্রাইভেট কী পরিচালনা করতে হবে যাতে এটি চেইনে সম্প্রচার করার আগে লেনদেনে স্বাক্ষর করতে পারে। যেহেতু Alchemy ব্যবহারকারীর প্রাইভেট কী রাখে না, তারা এই পদ্ধতি সমর্থন করে না। +- [`eth_sendRawTransaction`](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_sendrawtransaction) ইতিমধ্যে স্বাক্ষরিত লেনদেন সম্প্রচার করতে ব্যবহৃত হয়। এর মানে হল আপনাকে প্রথমে [`signTransaction(tx, private_key)`](https://docs.web3js.org/api/web3-eth-accounts/function/signTransaction) ব্যবহার করতে হবে, তারপর ফলাফলটি `eth_sendRawTransaction`-এ পাস করতে হবে। + +web3 ব্যবহার করার সময়, `eth_sendRawTransaction` ফাংশনটি [web3.eth.sendSignedTransaction](https://docs.web3js.org/api/web3-eth/function/sendSignedTransaction) কল করে অ্যাক্সেস করা হয়। + +এই টিউটোরিয়ালে আমরা এটিই ব্যবহার করব। + +### ৬। web3 লাইব্রেরি কী? {#what-is-the-web3-library} + +- Web3.js হল স্ট্যান্ডার্ড JSON-RPC কলের চারপাশে একটি র‍্যাপার লাইব্রেরি যা Ethereum ডেভেলপমেন্টে ব্যবহার করা বেশ সাধারণ। +- বিভিন্ন ভাষার জন্য অনেক web3 লাইব্রেরি আছে। এই টিউটোরিয়ালে আমরা [Alchemy Web3](https://docs.alchemy.com/reference/api-overview) ব্যবহার করব যা জাভাস্ক্রিপ্টে লেখা। আপনি [এখানে](https://docs.alchemyapi.io/guides/getting-started#other-web3-libraries) অন্যান্য বিকল্প যেমন [ethers.js](https://docs.ethers.org/v5/) দেখতে পারেন। + +ঠিক আছে, এখন যেহেতু আমরা এই প্রশ্নগুলির কয়েকটি সমাধান করেছি, আসুন টিউটোরিয়ালে যাওয়া যাক। Alchemy [ডিসকর্ড](https://discord.gg/gWuC7zB)-এ যেকোনো সময় প্রশ্ন করতে দ্বিধা করবেন না! + +### ৭। নিরাপদ, গ্যাস-অপ্টিমাইজড, এবং ব্যক্তিগত লেনদেন কীভাবে পাঠাবেন? {#how-to-send-secure-gas-optimized-and-private-transactions} + +- [Alchemy-এর একটি Transact API-এর স্যুট রয়েছে](https://docs.alchemy.com/reference/transact-api-quickstart)। আপনি এগুলি শক্তিশালী লেনদেন পাঠাতে, লেনদেন ঘটার আগে সেগুলোর অনুকরণ করতে, ব্যক্তিগত লেনদেন পাঠাতে এবং গ্যাস-অপ্টিমাইজড লেনদেন পাঠাতে ব্যবহার করতে পারেন +- আপনার লেনদেন মেমপুল থেকে টেনে নিয়ে চেইনে যোগ করা হলে সতর্ক করার জন্য আপনি [Notify API](https://docs.alchemy.com/docs/alchemy-notify) ব্যবহার করতে পারেন + +**দ্রষ্টব্য:** এই নির্দেশিকাটির জন্য একটি Alchemy অ্যাকাউন্ট, একটি Ethereum ঠিকানা বা MetaMask ওয়ালেট, NodeJs এবং npm ইনস্টল করা প্রয়োজন। যদি না থাকে, তাহলে এই পদক্ষেপগুলি অনুসরণ করুন: + +1. [একটি বিনামূল্যে Alchemy অ্যাকাউন্ট তৈরি করুন](https://auth.alchemyapi.io/signup) +2. [MetaMask অ্যাকাউন্ট তৈরি করুন](https://metamask.io/) (অথবা একটি Ethereum ঠিকানা পান) +3. [NodeJs এবং NPM ইনস্টল করার জন্য এই পদক্ষেপগুলি অনুসরণ করুন](https://docs.alchemy.com/alchemy/guides/alchemy-for-macs) + +## আপনার লেনদেন পাঠানোর পদক্ষেপ {#steps-to-sending-your-transaction} + +### ১। Sepolia টেস্টনেটে একটি Alchemy অ্যাপ তৈরি করুন {#create-an-alchemy-app-on-the-sepolia-testnet} + +আপনার [Alchemy ড্যাশবোর্ড](https://dashboard.alchemyapi.io/)-এ নেভিগেট করুন এবং আপনার নেটওয়ার্কের জন্য Sepolia (বা অন্য কোনো টেস্টনেট) বেছে নিয়ে একটি নতুন অ্যাপ তৈরি করুন। + +### ২। Sepolia ফসেট থেকে ETH অনুরোধ করুন {#request-eth-from-sepolia-faucet} + +ETH গ্রহণ করতে [Alchemy Sepolia ফসেট](https://www.sepoliafaucet.com/)-এর নির্দেশাবলী অনুসরণ করুন। আপনার **Sepolia** Ethereum ঠিকানা (MetaMask থেকে) অন্তর্ভুক্ত করা নিশ্চিত করুন এবং অন্য কোনো নেটওয়ার্ক নয়। নির্দেশাবলী অনুসরণ করার পর, আপনার ওয়ালেটে ETH পেয়েছেন কিনা তা দুবার পরীক্ষা করে দেখুন। + +### ৩। একটি নতুন প্রজেক্ট ডিরেক্টরি তৈরি করুন এবং এতে `cd` করুন {#create-a-new-project-direction} + +কমান্ড লাইন (ম্যাকের জন্য টার্মিনাল) থেকে একটি নতুন প্রজেক্ট ডিরেক্টরি তৈরি করুন এবং এতে নেভিগেট করুন: + +``` +mkdir sendtx-example +cd sendtx-example +``` + +### ৪। Alchemy Web3 (বা যেকোনো web3 লাইব্রেরি) ইনস্টল করুন {#install-alchemy-web3} + +[Alchemy Web3](https://docs.alchemy.com/reference/api-overview) ইনস্টল করার জন্য আপনার প্রজেক্ট ডিরেক্টরিতে নিম্নলিখিত কমান্ডটি চালান: + +দ্রষ্টব্য, আপনি যদি ethers.js লাইব্রেরি ব্যবহার করতে চান, [তাহলে এখানে নির্দেশাবলী অনুসরণ করুন](https://docs.alchemy.com/docs/how-to-send-transactions-on-ethereum)। + +``` +npm install @alch/alchemy-web3 +``` + +### ৫। dotenv ইনস্টল করুন {#install-dotenv} + +আমরা আমাদের API কী এবং প্রাইভেট কী নিরাপদে সংরক্ষণ করতে একটি `.env` ফাইল ব্যবহার করব। + +``` +npm install dotenv --save +``` + +### ৬। `.env` ফাইল তৈরি করুন {#create-the-dotenv-file} + +আপনার প্রজেক্ট ডিরেক্টরিতে একটি `.env` ফাইল তৈরি করুন এবং নিম্নলিখিতগুলি যোগ করুন (“`your-api-url`” এবং “`your-private-key`” প্রতিস্থাপন করে) + +- আপনার Alchemy API URL খুঁজে পেতে, আপনার ড্যাশবোর্ডে সদ্য তৈরি করা অ্যাপের বিবরণ পৃষ্ঠায় নেভিগেট করুন, উপরের ডানদিকের কোণায় “View Key” ক্লিক করুন, এবং HTTP URLটি নিন। +- MetaMask ব্যবহার করে আপনার প্রাইভেট কী খুঁজে পেতে, এই [নির্দেশিকাটি](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key) দেখুন। + +``` +API_URL = "your-api-url" +PRIVATE_KEY = "your-private-key" +``` + + + + +.env কমিট করবেন না! অনুগ্রহ করে নিশ্চিত করুন যে আপনার .env ফাইলটি কারো সাথে শেয়ার বা প্রকাশ করবেন না, কারণ এটি করার মাধ্যমে আপনি আপনার গোপনীয়তাগুলির সাথে আপস করছেন। আপনি যদি সংস্করণ নিয়ন্ত্রণ ব্যবহার করেন, তাহলে আপনার .env একটি gitignore ফাইলে যোগ করুন। + + + + +### ৭। `sendTx.js` ফাইল তৈরি করুন {#create-sendtx-js} + +দারুণ, এখন যেহেতু আমাদের সংবেদনশীল ডেটা একটি `.env` ফাইলে সুরক্ষিত আছে, চলুন কোডিং শুরু করি। আমাদের লেনদেন পাঠানোর উদাহরণের জন্য, আমরা ETH Sepolia ফসেটে ফেরত পাঠাব। + +একটি `sendTx.js` ফাইল তৈরি করুন, যেখানে আমরা আমাদের উদাহরণ লেনদেনটি কনফিগার করব এবং পাঠাব, এবং এতে নিম্নলিখিত কোডের লাইনগুলি যোগ করুন: + +``` +async function main() { + require('dotenv').config(); + const { API_URL, PRIVATE_KEY } = process.env; + const { createAlchemyWeb3 } = require("@alch/alchemy-web3"); + const web3 = createAlchemyWeb3(API_URL); + const myAddress = '0x610Ae88399fc1687FA7530Aac28eC2539c7d6d63' //TODO: এই ঠিকানাটি আপনার নিজের পাবলিক ঠিকানা দিয়ে প্রতিস্থাপন করুন + + const nonce = await web3.eth.getTransactionCount(myAddress, 'latest'); // ননস 0 থেকে গণনা শুরু করে + + const transaction = { + 'to': '0x31B98D14007bDEe637298086988A0bBd31184523', // eth ফেরত দেওয়ার জন্য ফসেটের ঠিকানা + 'value': 1000000000000000000, // 1 ETH + 'gas': 30000, + 'nonce': nonce, + // বার্তা পাঠাতে বা স্মার্ট কন্ট্র্যাক্ট কার্যকর করার জন্য ঐচ্ছিক ডেটা ফিল্ড + }; + + const signedTx = await web3.eth.accounts.signTransaction(transaction, PRIVATE_KEY); + + web3.eth.sendSignedTransaction(signedTx.rawTransaction, function(error, hash) { + if (!error) { + console.log("🎉 আপনার লেনদেনের হ্যাস হল: ", hash, "\n আপনার লেনদেনের স্থিতি দেখতে Alchemy-র মেমপুল পরীক্ষা করুন!"); + } else { + console.log("❗আপনার লেনদেন জমা দেওয়ার সময় কিছু ভুল হয়েছে:", error) + } + }); +} + +main(); +``` + +**লাইন 6**-এর ঠিকানাটি আপনার নিজের পাবলিক ঠিকানা দিয়ে প্রতিস্থাপন করতে ভুলবেন না। + +এখন, এই কোডটি চালানোর আগে, আসুন এখানকার কিছু উপাদান নিয়ে কথা বলি। + +- `ননস`: ননস স্পেসিফিকেশন আপনার ঠিকানা থেকে পাঠানো লেনদেনের সংখ্যা ট্র্যাক করতে ব্যবহৃত হয়। নিরাপত্তার উদ্দেশ্যে এবং [রিপ্লে অ্যাটাক](https://docs.alchemyapi.io/resources/blockchain-glossary#account-nonce) প্রতিরোধ করার জন্য আমাদের এটি প্রয়োজন। আপনার ঠিকানা থেকে পাঠানো লেনদেনের সংখ্যা পেতে আমরা [getTransactionCount](https://docs.alchemyapi.io/documentation/alchemy-api-reference/json-rpc#eth_gettransactioncount) ব্যবহার করি। +- `লেনদেন`: লেনদেন অবজেক্টের কয়েকটি দিক রয়েছে যা আমাদের নির্দিষ্ট করতে হবে + - `to`: এটি হল সেই ঠিকানা যেখানে আমরা ETH পাঠাতে চাই। এই ক্ষেত্রে, আমরা যে [Sepolia ফসেট](https://sepoliafaucet.com/) থেকে প্রথমে অনুরোধ করেছিলাম সেখানে ETH ফেরত পাঠাচ্ছি। + - `value`: এটি হল সেই পরিমাণ যা আমরা পাঠাতে চাই, Wei-তে নির্দিষ্ট করা হয়েছে যেখানে 10^18 Wei = 1 ETH + - `গ্যাস`: আপনার লেনদেনের সাথে অন্তর্ভুক্ত করার জন্য সঠিক পরিমাণ গ্যাস নির্ধারণ করার অনেক উপায় আছে। Alchemy-এর একটি [গ্যাস প্রাইস ওয়েবহুক](https://docs.alchemyapi.io/guides/alchemy-notify#address-activity-1) ও আছে যা আপনাকে গ্যাসের দাম একটি নির্দিষ্ট সীমার মধ্যে নেমে এলে सूचित করে। মেইননেট লেনদেনের জন্য, অন্তর্ভুক্ত করার জন্য সঠিক পরিমাণ গ্যাস নির্ধারণ করতে [ETH গ্যাস স্টেশন](https://ethgasstation.info/)-এর মতো একটি গ্যাস অনুমানকারী পরীক্ষা করা একটি ভাল অভ্যাস। 21000 হল Ethereum-এ একটি অপারেশনের জন্য সর্বনিম্ন পরিমাণ গ্যাস, তাই আমাদের লেনদেনটি কার্যকর হবে তা নিশ্চিত করতে আমরা এখানে 30000 রেখেছি। + - `ননস`: উপরের ননসের সংজ্ঞা দেখুন। ননস শূন্য থেকে গণনা শুরু করে। + - [ঐচ্ছিক] ডেটা: আপনার স্থানান্তরের সাথে অতিরিক্ত তথ্য পাঠাতে বা একটি স্মার্ট কন্ট্র্যাক্ট কল করার জন্য ব্যবহৃত হয়, ব্যালেন্স স্থানান্তরের জন্য প্রয়োজন হয় না, নীচের নোটটি দেখুন। +- `signedTx`: আমাদের লেনদেন অবজেক্টে স্বাক্ষর করার জন্য আমরা `signTransaction` পদ্ধতিটি আমাদের `PRIVATE_KEY`-এর সাথে ব্যবহার করব +- `sendSignedTransaction`: একবার আমাদের একটি স্বাক্ষরিত লেনদেন হয়ে গেলে, আমরা `sendSignedTransaction` ব্যবহার করে এটিকে পরবর্তী ব্লকে অন্তর্ভুক্ত করার জন্য পাঠাতে পারি + +**ডেটার উপর একটি নোট** +Ethereum-এ দুই ধরনের প্রধান লেনদেন পাঠানো যেতে পারে। + +- ব্যালেন্স স্থানান্তর: এক ঠিকানা থেকে অন্য ঠিকানায় ETH পাঠান। কোনো ডেটা ফিল্ডের প্রয়োজন নেই, তবে, আপনি যদি আপনার লেনদেনের পাশাপাশি অতিরিক্ত তথ্য পাঠাতে চান, তাহলে আপনি সেই তথ্য এই ফিল্ডে HEX ফরম্যাটে অন্তর্ভুক্ত করতে পারেন। + - উদাহরণস্বরূপ, ধরা যাক আমরা একটি IPFS ডকুমেন্টের হ্যাস Ethereum চেইনে লিখতে চেয়েছিলাম যাতে এটিকে একটি অপরিবর্তনীয় টাইমস্ট্যাম্প দেওয়া যায়। আমাদের ডেটা ফিল্ডটি তখন দেখতে হবে: `web3.utils.toHex(‘IPFS হ্যাস‘)`। এবং এখন যে কেউ চেইনটি জিজ্ঞাসা করতে পারে এবং দেখতে পারে কখন সেই ডকুমেন্টটি যোগ করা হয়েছিল। +- স্মার্ট কন্ট্র্যাক্ট লেনদেন: চেইনে কিছু স্মার্ট কন্ট্র্যাক্ট কোড কার্যকর করুন। এই ক্ষেত্রে, ডেটা ফিল্ডে আপনি যে স্মার্ট ফাংশনটি কার্যকর করতে চান তা থাকা উচিত, সাথে যেকোনো প্যারামিটার। + - একটি ব্যবহারিক উদাহরণের জন্য, এই [Hello World টিউটোরিয়াল](https://docs.alchemyapi.io/alchemy/tutorials/hello-world-smart-contract#step-8-create-the-transaction)-এর ধাপ 8 দেখুন। + +### ৮। `node sendTx.js` ব্যবহার করে কোডটি চালান {#run-the-code-using-node-sendtx-js} + +আপনার টার্মিনাল বা কমান্ড লাইনে ফিরে যান এবং চালান: + +``` +node sendTx.js +``` + +### ৯। মেমপুলে আপনার লেনদেন দেখুন {#see-your-transaction-in-the-mempool} + +আপনার Alchemy ড্যাশবোর্ডে [মেমপুল পৃষ্ঠা](https://dashboard.alchemyapi.io/mempool) খুলুন এবং আপনার লেনদেন খুঁজে পেতে আপনার তৈরি করা অ্যাপ দ্বারা ফিল্টার করুন। এখানেই আমরা আমাদের লেনদেনকে পেন্ডিং স্থিতি থেকে মাইনড স্থিতি (সফল হলে) বা ড্রপড স্থিতি (অসফল হলে) তে স্থানান্তর দেখতে পারি। “All”-এ রাখা নিশ্চিত করুন যাতে আপনি “মাইনড”, “পেন্ডিং”, এবং “ড্রপড” লেনদেনগুলি ক্যাপচার করতে পারেন। আপনি `0x31b98d14007bdee637298086988a0bbd31184523` ঠিকানায় পাঠানো লেনদেন খুঁজে আপনার লেনদেন অনুসন্ধান করতে পারেন। + +একবার আপনি এটি খুঁজে পেলে আপনার লেনদেনের বিশদ দেখতে, tx হ্যাস নির্বাচন করুন, যা আপনাকে এমন একটি ভিউতে নিয়ে যাবে যা দেখতে এইরকম: + +![মেমপুল ওয়াচার স্ক্রিনশট](./mempool.png) + +সেখান থেকে আপনি লাল বৃত্তে চিহ্নিত আইকনে ক্লিক করে Etherscan-এ আপনার লেনদেন দেখতে পারেন! + +**ইয়াহু! আপনি এইমাত্র Alchemy ব্যবহার করে আপনার প্রথম Ethereum লেনদেন পাঠিয়েছেন 🎉** + +_এই নির্দেশিকা সম্পর্কে প্রতিক্রিয়া এবং পরামর্শের জন্য, অনুগ্রহ করে Alchemy-র [ডিসকর্ড](https://discord.gg/A39JVCM)-এ এলানকে মেসেজ করুন!_ + +_মূলত [https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy](https://docs.alchemyapi.io/tutorials/sending-transactions-using-web3-and-alchemy)-এ প্রকাশিত_ diff --git a/public/content/translations/bn/developers/tutorials/server-components/index.md b/public/content/translations/bn/developers/tutorials/server-components/index.md new file mode 100644 index 00000000000..e0542991828 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/server-components/index.md @@ -0,0 +1,295 @@ +--- +title: "web3 অ্যাপের জন্য সার্ভার উপাদান এবং এজেন্ট" +description: "এই টিউটোরিয়ালটি পড়ার পরে, আপনি TypeScript সার্ভার লিখতে পারবেন যা একটি ব্লকচেইনে ইভেন্ট শোনে এবং সেই অনুযায়ী তাদের নিজস্ব লেনদেন দিয়ে প্রতিক্রিয়া জানায়। এটি আপনাকে কেন্দ্রীভূত অ্যাপ্লিকেশন লিখতে সক্ষম করবে (কারণ সার্ভারটি ব্যর্থতার একটি বিন্দু), কিন্তু web3 সত্তার সাথে ইন্টারঅ্যাক্ট করতে পারে। একই কৌশল একটি এজেন্ট লিখতেও ব্যবহার করা যেতে পারে যা মানুষের হস্তক্ষেপ ছাড়াই অনচেইন ইভেন্টে সাড়া দেয়।" + +author: Ori Pomerantz +lang: bn +tags: [ "এজেন্ট", "সার্ভার", "অফচেইন" ] +skill: beginner +published: 2024-07-15 +--- + +## ভূমিকা {#introduction} + +বেশিরভাগ ক্ষেত্রে, একটি বিকেন্দ্রীভূত অ্যাপ সফ্টওয়্যার বিতরণের জন্য একটি সার্ভার ব্যবহার করে, কিন্তু সমস্ত প্রকৃত মিথস্ক্রিয়া ক্লায়েন্ট (সাধারণত, ওয়েব ব্রাউজার) এবং ব্লকচেইনের মধ্যে ঘটে। + +![ওয়েব সার্ভার, ক্লায়েন্ট এবং ব্লকচেইনের মধ্যে স্বাভাবিক মিথস্ক্রিয়া](./fig-1.svg) + +তবে, কিছু ক্ষেত্রে আছে যেখানে একটি অ্যাপ্লিকেশন স্বাধীনভাবে চালিত একটি সার্ভার উপাদান থাকা থেকে উপকৃত হবে। এই ধরনের একটি সার্ভার ইভেন্টে এবং অন্যান্য উৎস, যেমন একটি API থেকে আসা অনুরোধে লেনদেন ইস্যু করার মাধ্যমে সাড়া দিতে সক্ষম হবে। + +![একটি সার্ভার যোগ করার সাথে মিথস্ক্রিয়া](./fig-2.svg) + +এমন বেশ কিছু সম্ভাব্য কাজ রয়েছে যা এই ধরনের একটি সার্ভার পূরণ করতে পারে। + +- গোপন অবস্থার ধারক। গেমিংয়ে খেলোয়াড়দের কাছে গেমের জানা সমস্ত তথ্য উপলব্ধ না করা প্রায়শই দরকারী। তবে, _ব্লকচেইনে কোনো গোপনীয়তা নেই_, ব্লকচেইনে থাকা যেকোনো তথ্য যে কারো পক্ষে বের করা সহজ। অতএব, যদি খেলার অবস্থার একটি অংশ গোপন রাখতে হয়, তবে এটি অন্য কোথাও সংরক্ষণ করতে হবে (এবং সম্ভবত সেই অবস্থার প্রভাব [জিরো-নলেজ প্রুফ](/zero-knowledge-proofs) ব্যবহার করে যাচাই করা হবে)। + +- কেন্দ্রীভূত ওরাকল। যদি স্টেক যথেষ্ট কম হয়, একটি বহিরাগত সার্ভার যা অনলাইনে কিছু তথ্য পড়ে এবং তারপরে এটি চেইনে পোস্ট করে তা একটি [ওরাকল](/developers/docs/oracles/) হিসাবে ব্যবহার করার জন্য যথেষ্ট ভাল হতে পারে। + +- এজেন্ট। এটি সক্রিয় করার জন্য একটি লেনদেন ছাড়া ব্লকচেইনে কিছুই ঘটে না। সুযোগ পেলে একটি সার্ভার ব্যবহারকারীর পক্ষ থেকে কাজ করতে পারে যেমন [আর্বিট্রেজ](/developers/docs/mev/#mev-examples-dex-arbitrage) সম্পাদন করা। + +## নমুনা প্রোগ্রাম {#sample-program} + +আপনি [github-এ](https://github.com/qbzzt/20240715-server-component) একটি নমুনা সার্ভার দেখতে পারেন। এই সার্ভারটি [এই চুক্তি](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=contract_code) থেকে আসা ইভেন্টগুলি শোনে, যা Hardhat-এর গ্রিটারের একটি পরিবর্তিত সংস্করণ। যখন অভিবাদন পরিবর্তন করা হয়, এটি এটিকে আবার পরিবর্তন করে। + +এটি চালানোর জন্য: + +1. রিপোজিটরি ক্লোন করুন। + + ```sh copy + git clone https://github.com/qbzzt/20240715-server-component.git + cd 20240715-server-component + ``` + +2. প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করুন। আপনার কাছে যদি এটি আগে থেকেই না থাকে, [প্রথমে নোড ইনস্টল করুন](https://nodejs.org/en/download/package-manager)। + + ```sh copy + npm install + ``` + +3. Holesky টেস্টনেটে ETH আছে এমন একটি অ্যাকাউন্টের প্রাইভেট কী নির্দিষ্ট করতে `.env` সম্পাদনা করুন। আপনার যদি Holesky-তে ETH না থাকে, আপনি [এই ফসেটটি ব্যবহার করতে পারেন](https://holesky-faucet.pk910.de/)। + + ```sh filename=".env" copy + PRIVATE_KEY=0x <প্রাইভেট কী এখানে দিন> + ``` + +4. সার্ভার শুরু করুন। + + ```sh copy + npm start + ``` + +5. [একটি ব্লক এক্সপ্লোরারে](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract) যান, এবং প্রাইভেট কী আছে এমন ঠিকানার চেয়ে ভিন্ন একটি ঠিকানা ব্যবহার করে অভিবাদন পরিবর্তন করুন। দেখুন যে অভিবাদনটি স্বয়ংক্রিয়ভাবে আবার পরিবর্তন করা হয়েছে। + +### এটি কিভাবে কাজ করে? {#how-it-works} + +একটি সার্ভার উপাদান কিভাবে লিখতে হয় তা বোঝার সবচেয়ে সহজ উপায় হল নমুনাটি লাইন বাই লাইন পর্যালোচনা করা। + +#### `src/app.ts` {#src-app-ts} + +প্রোগ্রামের সিংহভাগই [`src/app.ts`](https://github.com/qbzzt/20240715-server-component/blob/main/src/app.ts)-এ রয়েছে। + +##### পূর্বশর্ত বস্তু তৈরি করা + +```typescript +import { + createPublicClient, + createWalletClient, + getContract, + http, + Address, +} from "viem" +``` + +এগুলি হল [Viem](https://viem.sh/) সত্তা যা আমাদের প্রয়োজন, ফাংশন এবং [`ঠিকানা` টাইপ](https://viem.sh/docs/glossary/types#address)। এই সার্ভারটি [TypeScript](https://www.typescriptlang.org/)-এ লেখা, যা JavaScript-এর একটি এক্সটেনশন যা এটিকে [strongly typed](https://en.wikipedia.org/wiki/Strong_and_weak_typing) করে তোলে। + +```typescript +import { privateKeyToAccount } from "viem/accounts" +``` + +[এই ফাংশনটি](https://viem.sh/docs/accounts/privateKey) আমাদের একটি প্রাইভেট কী-এর সাথে সঙ্গতিপূর্ণ ওয়ালেট তথ্য, যার মধ্যে ঠিকানা অন্তর্ভুক্ত, তৈরি করতে দেয়। + +```typescript +import { holesky } from "viem/chains" +``` + +Viem-এ একটি ব্লকচেইন ব্যবহার করতে আপনাকে এর সংজ্ঞা আমদানি করতে হবে। এই ক্ষেত্রে, আমরা [Holesky](https://github.com/eth-clients/holesky) টেস্ট ব্লকচেইনের সাথে সংযোগ করতে চাই। + +```typescript +// এইভাবেই আমরা .env-এর সংজ্ঞাগুলিকে process.env-এ যোগ করি। +import * as dotenv from "dotenv" +dotenv.config() +``` + +এইভাবে আমরা `.env` কে এনভায়রনমেন্টে পড়ি। প্রাইভেট কী-এর জন্য আমাদের এটি প্রয়োজন (পরে দেখুন)। + +```typescript +const greeterAddress : Address = "0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6" +const greeterABI = [ + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + . + . + . + { + "inputs": [ + { + "internalType": "string", + "name": "_greeting", + "type": "string" + } + ], + "name": "setGreeting", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] as const +``` + +একটি চুক্তি ব্যবহার করার জন্য আমাদের এর ঠিকানা এবং এর জন্য [ABI](/glossary/#abi) প্রয়োজন। আমরা এখানে উভয়ই সরবরাহ করি। + +JavaScript-এ (এবং তাই TypeScript-এ) আপনি একটি ধ্রুবককে একটি নতুন মান নির্ধারণ করতে পারবেন না, কিন্তু আপনি এতে সংরক্ষিত বস্তুটি পরিবর্তন _করতে পারেন_। `as const` প্রত্যয় ব্যবহার করে আমরা TypeScript-কে বলছি যে তালিকাটি নিজেই ধ্রুবক এবং পরিবর্তন করা যাবে না। + +```typescript +const publicClient = createPublicClient({ + chain: holesky, + transport: http(), +}) +``` + +একটি Viem [পাবলিক ক্লায়েন্ট](https://viem.sh/docs/clients/public.html) তৈরি করুন। পাবলিক ক্লায়েন্টদের কোনো সংযুক্ত প্রাইভেট কী থাকে না, এবং তাই লেনদেন পাঠাতে পারে না। তারা [`view` ফাংশন](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm) কল করতে পারে, অ্যাকাউন্ট ব্যালেন্স পড়তে পারে, ইত্যাদি। + +```typescript +const account = privateKeyToAccount(process.env.PRIVATE_KEY as `0x${string}`) +``` + +এনভায়রনমেন্ট ভেরিয়েবলগুলি [`process.env`](https://www.totaltypescript.com/how-to-strongly-type-process-env)-এ উপলব্ধ। তবে, TypeScript হল strongly typed। একটি এনভায়রনমেন্ট ভেরিয়েবল যেকোনো স্ট্রিং হতে পারে, বা খালি হতে পারে, তাই একটি এনভায়রনমেন্ট ভেরিয়েবলের জন্য টাইপ হল `string | undefined`। তবে, Viem-এ একটি কী `0x${string}` (`0x` এর পরে একটি স্ট্রিং) হিসাবে সংজ্ঞায়িত করা হয়েছে। এখানে আমরা TypeScript-কে বলি যে `PRIVATE_KEY` এনভায়রনমেন্ট ভেরিয়েবলটি সেই টাইপের হবে। যদি তা না হয়, আমরা একটি রানটাইম ত্রুটি পাব। + +[`privateKeyToAccount`](https://viem.sh/docs/accounts/privateKey) ফাংশনটি তারপর এই প্রাইভেট কী ব্যবহার করে একটি সম্পূর্ণ অ্যাকাউন্ট অবজেক্ট তৈরি করে। + +```typescript +const walletClient = createWalletClient({ + account, + chain: holesky, + transport: http(), +}) +``` + +এরপরে, আমরা একটি [ওয়ালেট ক্লায়েন্ট](https://viem.sh/docs/clients/wallet) তৈরি করতে অ্যাকাউন্ট অবজেক্টটি ব্যবহার করি। এই ক্লায়েন্টের একটি প্রাইভেট কী এবং একটি ঠিকানা আছে, তাই এটি লেনদেন পাঠাতে ব্যবহার করা যেতে পারে। + +```typescript +const greeter = getContract({ + address: greeterAddress, + abi: greeterABI, + client: { public: publicClient, wallet: walletClient }, +}) +``` + +এখন যেহেতু আমাদের সমস্ত পূর্বশর্ত রয়েছে, আমরা অবশেষে একটি [কন্ট্রাক্ট ইনস্ট্যান্স](https://viem.sh/docs/contract/getContract) তৈরি করতে পারি। আমরা অনচেইন কন্ট্রাক্টের সাথে যোগাযোগ করতে এই কন্ট্রাক্ট ইনস্ট্যান্সটি ব্যবহার করব। + +##### ব্লকচেইন থেকে পড়া + +```typescript +console.log(`Current greeting:`, await greeter.read.greet()) +``` + +যে কন্ট্রাক্ট ফাংশনগুলি শুধুমাত্র পঠনযোগ্য ([`view`](https://www.tutorialspoint.com/solidity/solidity_view_functions.htm) এবং [`pure`](https://www.tutorialspoint.com/solidity/solidity_pure_functions.htm)) সেগুলি `read`-এর অধীনে উপলব্ধ। এই ক্ষেত্রে, আমরা এটি [`greet`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=read_contract#cfae3217) ফাংশনটি অ্যাক্সেস করতে ব্যবহার করি, যা অভিবাদন ফেরত দেয়। + +JavaScript হল সিঙ্গেল-থ্রেডেড, তাই যখন আমরা একটি দীর্ঘ চলমান প্রক্রিয়া শুরু করি তখন আমাদের [নির্দিষ্ট করতে হবে যে আমরা এটি অ্যাসিঙ্ক্রোনাসভাবে করছি](https://eloquentjavascript.net/11_async.html#h-XvLsfAhtsE)। ব্লকচেইনে কল করা, এমনকি একটি শুধুমাত্র পঠনযোগ্য অপারেশনের জন্যও, কম্পিউটার এবং একটি ব্লকচেইন নোডের মধ্যে একটি রাউন্ড-ট্রিপ প্রয়োজন। এই কারণেই আমরা এখানে নির্দিষ্ট করি যে কোডটিকে ফলাফলের জন্য `await` করতে হবে। + +আপনি যদি আগ্রহী হন যে এটি কীভাবে কাজ করে তবে আপনি [এখানে এটি সম্পর্কে পড়তে পারেন](https://www.w3schools.com/js/js_promise.asp), কিন্তু ব্যবহারিক দিক থেকে আপনাকে কেবল জানতে হবে যে আপনি যদি দীর্ঘ সময় নেয় এমন একটি অপারেশন শুরু করেন তবে আপনি ফলাফলের জন্য `await` করবেন, এবং যে কোনো ফাংশন যা এটি করে তাকে `async` হিসাবে ঘোষণা করতে হবে। + +##### লেনদেন ইস্যু করা + +```typescript +const setGreeting = async (greeting: string): Promise => { +``` + +এটি সেই ফাংশন যা আপনি অভিবাদন পরিবর্তন করে এমন একটি লেনদেন ইস্যু করতে কল করেন। যেহেতু এটি একটি দীর্ঘ অপারেশন, ফাংশনটি `async` হিসাবে ঘোষণা করা হয়েছে। অভ্যন্তরীণ বাস্তবায়নের কারণে, যেকোনো `async` ফাংশনকে একটি `Promise` অবজেক্ট ফেরত দিতে হবে। এই ক্ষেত্রে, `Promise` মানে হল আমরা নির্দিষ্ট করি না যে `Promise`-এ ঠিক কী ফেরত দেওয়া হবে। + +```typescript +const txHash = await greeter.write.setGreeting([greeting]) +``` + +কন্ট্রাক্ট ইনস্ট্যান্সের `write` ফিল্ডে ব্লকচেইন স্টেটে লেখে এমন সমস্ত ফাংশন রয়েছে (যেগুলির জন্য একটি লেনদেন পাঠানোর প্রয়োজন), যেমন [`setGreeting`](https://eth-holesky.blockscout.com/address/0xB8f6460Dc30c44401Be26B0d6eD250873d8a50A6?tab=write_contract#a4136862)। প্যারামিটারগুলি, যদি থাকে, একটি তালিকা হিসাবে সরবরাহ করা হয়, এবং ফাংশনটি লেনদেনের হ্যাস ফেরত দেয়। + +```typescript + console.log(`Working on a fix, see https://eth-holesky.blockscout.com/tx/${txHash}`) + + return txHash +} +``` + +লেনদেনের হ্যাস রিপোর্ট করুন (এটি দেখার জন্য ব্লক এক্সপ্লোরারের একটি URL-এর অংশ হিসাবে) এবং এটি ফেরত দিন। + +##### ইভেন্টে সাড়া দেওয়া + +```typescript +greeter.watchEvent.SetGreeting({ +``` + +[`watchEvent` ফাংশনটি](https://viem.sh/docs/actions/public/watchEvent) আপনাকে নির্দিষ্ট করতে দেয় যে একটি ইভেন্ট নির্গত হলে একটি ফাংশন চালানো হবে। আপনি যদি শুধুমাত্র এক ধরনের ইভেন্ট নিয়ে চিন্তা করেন (এই ক্ষেত্রে, `SetGreeting`), তাহলে আপনি এই সিনট্যাক্সটি ব্যবহার করে নিজেকে সেই ইভেন্টের ধরনে সীমাবদ্ধ করতে পারেন। + +```typescript + onLogs: logs => { +``` + +লগ এন্ট্রি থাকলে `onLogs` ফাংশনটি কল করা হয়। ইথেরিয়ামে "লগ" এবং "ইভেন্ট" সাধারণত বিনিময়যোগ্য। + +```typescript +console.log( + `Address ${logs[0].args.sender} changed the greeting to ${logs[0].args.greeting}` +) +``` + +একাধিক ইভেন্ট থাকতে পারে, কিন্তু সরলতার জন্য আমরা কেবল প্রথমটি নিয়েই চিন্তা করি। `logs[0].args` হল ইভেন্টের আর্গুমেন্ট, এই ক্ষেত্রে `sender` এবং `greeting`। + +```typescript + if (logs[0].args.sender != account.address) + setGreeting(`${account.address} insists on it being Hello!`) + } +}) +``` + +যদি প্রেরক এই সার্ভার _না_ হয়, তাহলে অভিবাদন পরিবর্তন করতে `setGreeting` ব্যবহার করুন। + +#### `package.json` {#package-json} + +[এই ফাইলটি](https://github.com/qbzzt/20240715-server-component/blob/main/package.json) [Node.js](https://nodejs.org/en) কনফিগারেশন নিয়ন্ত্রণ করে। এই নিবন্ধটি শুধুমাত্র গুরুত্বপূর্ণ সংজ্ঞাগুলি ব্যাখ্যা করে। + +```json +{ + "main": "dist/index.js", +``` + +এই সংজ্ঞাটি নির্দিষ্ট করে যে কোন JavaScript ফাইলটি চালাতে হবে। + +```json + "scripts": { + "start": "tsc && node dist/app.js", + }, +``` + +স্ক্রিপ্টগুলি বিভিন্ন অ্যাপ্লিকেশন অ্যাকশন। এই ক্ষেত্রে, আমাদের কাছে একমাত্রটি হল `start`, যা কম্পাইল করে এবং তারপর সার্ভার চালায়। `tsc` কমান্ডটি `typescript` প্যাকেজের অংশ এবং TypeScript-কে JavaScript-এ কম্পাইল করে। আপনি যদি এটি ম্যানুয়ালি চালাতে চান, এটি `node_modules/.bin`-এ অবস্থিত। দ্বিতীয় কমান্ডটি সার্ভার চালায়। + +```json + "type": "module", +``` + +একাধিক ধরনের JavaScript নোড অ্যাপ্লিকেশন আছে। `module` টাইপ আমাদের টপ-লেভেল কোডে `await` ব্যবহার করতে দেয়, যা ধীর (এবং তাই অ্যাসিঙ্ক্রোনাস) অপারেশন করার সময় গুরুত্বপূর্ণ। + +```json + "devDependencies": { + "@types/node": "^20.14.2", + "typescript": "^5.4.5" + }, +``` + +এগুলো এমন প্যাকেজ যা শুধুমাত্র ডেভেলপমেন্টের জন্য প্রয়োজন। এখানে আমাদের `typescript` প্রয়োজন এবং যেহেতু আমরা এটি Node.js-এর সাথে ব্যবহার করছি, আমরা নোড ভেরিয়েবল এবং অবজেক্ট, যেমন `process`-এর জন্য টাইপগুলিও পাচ্ছি। [`^` নোটেশন](https://github.com/npm/node-semver?tab=readme-ov-file#caret-ranges-123-025-004)-এর অর্থ হল সেই সংস্করণ বা একটি উচ্চতর সংস্করণ যাতে ব্রেকিং পরিবর্তন নেই। সংস্করণ সংখ্যার অর্থ সম্পর্কে আরও তথ্যের জন্য [এখানে](https://semver.org) দেখুন। + +```json + "dependencies": { + "dotenv": "^16.4.5", + "viem": "2.14.1" + } +} +``` + +এগুলি এমন প্যাকেজ যা `dist/app.js` চালানোর সময় রানটাইমে প্রয়োজন। + +## উপসংহার {#conclusion} + +আমরা এখানে যে কেন্দ্রীভূত সার্ভার তৈরি করেছি তা তার কাজ করে, যা একজন ব্যবহারকারীর জন্য এজেন্ট হিসাবে কাজ করা। অন্য যে কেউ ডিএ্যাপটি চালু রাখতে চায় এবং গ্যাস খরচ করতে ইচ্ছুক, তারা তাদের নিজস্ব ঠিকানা দিয়ে সার্ভারের একটি নতুন ইনস্ট্যান্স চালাতে পারে। + +তবে, এটি কেবল তখনই কাজ করে যখন কেন্দ্রীভূত সার্ভারের ক্রিয়াগুলি সহজে যাচাই করা যায়। যদি কেন্দ্রীভূত সার্ভারের কোনো গোপন অবস্থার তথ্য থাকে, বা কঠিন গণনা চালায়, তবে এটি একটি কেন্দ্রীভূত সত্তা যা অ্যাপ্লিকেশনটি ব্যবহার করার জন্য আপনার বিশ্বাস প্রয়োজন, যা ব্লকচেইনগুলি এড়াতে চেষ্টা করে। ভবিষ্যতের একটি নিবন্ধে আমি দেখানোর পরিকল্পনা করছি যে এই সমস্যাটি কাটিয়ে উঠতে কীভাবে [জিরো-নলেজ প্রুফ](/zero-knowledge-proofs) ব্যবহার করতে হয়। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। diff --git a/public/content/translations/bn/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md b/public/content/translations/bn/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md new file mode 100644 index 00000000000..809eba00111 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/set-up-web3js-to-use-ethereum-in-javascript/index.md @@ -0,0 +1,92 @@ +--- +title: "জাভাস্ক্রিপ্টে ইথেরিয়াম ব্লকচেইন ব্যবহার করার জন্য web3.js সেট আপ করুন" +description: "জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন থেকে ইথেরিয়াম ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করার জন্য web3.js লাইব্রেরি কিভাবে সেট আপ এবং কনফিগার করতে হয় তা জানুন।" +author: "jdourlens" +tags: [ "web3.js", "javascript" ] +skill: beginner +lang: bn +published: 2020-04-11 +source: EthereumDev +sourceUrl: https://ethereumdev.io/setup-web3js-to-use-the-ethereum-blockchain-in-javascript/ +address: "0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE" +--- + +এই টিউটোরিয়ালে, আমরা দেখব ইথেরিয়াম ব্লকচেইনের সাথে ইন্টারঅ্যাক্ট করার জন্য কিভাবে [web3.js](https://web3js.readthedocs.io/) দিয়ে শুরু করতে হয়। ব্লকচেইন থেকে ডেটা পড়া বা লেনদেন করা এবং এমনকি স্মার্ট কন্ট্র্যাক্ট স্থাপন করার জন্য Web3.js ফ্রন্টএন্ড এবং ব্যাকএন্ড উভয় ক্ষেত্রেই ব্যবহার করা যেতে পারে। + +প্রথম ধাপ হল আপনার প্রকল্পে web3.js অন্তর্ভুক্ত করা। একটি ওয়েব পেজে এটি ব্যবহার করতে, আপনি JSDeliver এর মতো একটি CDN ব্যবহার করে সরাসরি লাইব্রেরিটি ইম্পোর্ট করতে পারেন। + +```html + +``` + +আপনি যদি আপনার ব্যাকএন্ডে বা বিল্ড ব্যবহার করে এমন একটি ফ্রন্টএন্ড প্রকল্পে ব্যবহার করার জন্য লাইব্রেরিটি ইনস্টল করতে পছন্দ করেন তবে আপনি npm ব্যবহার করে এটি ইনস্টল করতে পারেন: + +```bash +npm install web3 --save +``` + +তারপর একটি Node.js স্ক্রিপ্ট বা Browserify ফ্রন্টএন্ড প্রকল্পে Web3.js ইম্পোর্ট করতে, আপনি জাভাস্ক্রিপ্টের নিম্নলিখিত লাইনটি ব্যবহার করতে পারেন: + +```js +const Web3 = require("web3") +``` + +এখন যেহেতু আমরা প্রকল্পে লাইব্রেরিটি অন্তর্ভুক্ত করেছি, আমাদের এটি ইনিশিয়ালাইজ করতে হবে। আপনার প্রকল্পের ব্লকচেইনের সাথে যোগাযোগ করতে সক্ষম হওয়া প্রয়োজন। বেশিরভাগ ইথেরিয়াম লাইব্রেরি RPC কলের মাধ্যমে একটি [নোড](/developers/docs/nodes-and-clients/) এর সাথে যোগাযোগ করে। আমাদের Web3 প্রদানকারী শুরু করার জন্য, আমরা প্রদানকারীর URL কনস্ট্রাক্টর হিসাবে পাস করে একটি Web3 ইনস্ট্যান্স ইনস্ট্যানশিয়েট করব। যদি আপনার একটি নোড বা [আপনার কম্পিউটারে চলমান একটি ganache ইনস্ট্যান্স](https://ethereumdev.io/testing-your-smart-contract-with-existing-protocols-ganache-fork/) থাকে তবে এটি এইরকম দেখাবে: + +```js +const web3 = new Web3("http://localhost:8545") +``` + +আপনি যদি সরাসরি কোনো হোস্ট করা নোড অ্যাক্সেস করতে চান তাহলে আপনি [পরিষেবা হিসেবে নোড](/developers/docs/nodes-and-clients/nodes-as-a-service)-এর বিকল্পগুলি খুঁজে পেতে পারেন। + +```js +const web3 = new Web3("https://cloudflare-eth.com") +``` + +আমরা আমাদের Web3 ইনস্ট্যান্সটি সঠিকভাবে কনফিগার করেছি কিনা তা পরীক্ষা করার জন্য, আমরা `getBlockNumber` ফাংশন ব্যবহার করে সর্বশেষ ব্লক নম্বরটি পুনরুদ্ধার করার চেষ্টা করব। এই ফাংশনটি একটি প্যারামিটার হিসাবে একটি কলব্যাক গ্রহণ করে এবং ব্লক নম্বরটি একটি পূর্ণসংখ্যা হিসাবে ফেরত দেয়। + +```js +var Web3 = require("web3") +const web3 = new Web3("https://cloudflare-eth.com") + +web3.eth.getBlockNumber(function (error, result) { + console.log(result) +}) +``` + +আপনি যদি এই প্রোগ্রামটি চালান, তবে এটি কেবল সর্বশেষ ব্লক নম্বরটি প্রিন্ট করবে: ব্লকচেইনের শীর্ষ। আপনার কোডে নেস্টিং কলব্যাক এড়ানোর জন্য আপনি `await/async` ফাংশন কলও ব্যবহার করতে পারেন: + +```js +async function getBlockNumber() { + const latestBlockNumber = await web3.eth.getBlockNumber() + console.log(latestBlockNumber) + return latestBlockNumber +} + +getBlockNumber() +``` + +আপনি Web3 ইনস্ট্যান্সে উপলব্ধ সমস্ত ফাংশন [অফিসিয়াল web3.js ডকুমেন্টেশন](https://docs.web3js.org/) এ দেখতে পারেন। + +বেশিরভাগ Web3 লাইব্রেরি অ্যাসিঙ্ক্রোনাস কারণ ব্যাকগ্রাউন্ডে লাইব্রেরিটি নোডে JSON-RPC কল করে যা ফলাফল ফেরত পাঠায়। + + + +আপনি যদি ব্রাউজারে কাজ করেন, কিছু ওয়ালেট সরাসরি একটি Web3 ইনস্ট্যান্স ইনজেক্ট করে এবং যখনই সম্ভব আপনার এটি ব্যবহার করার চেষ্টা করা উচিত, বিশেষ করে যদি আপনি লেনদেন করার জন্য ব্যবহারকারীর ইথেরিয়াম ঠিকানার সাথে ইন্টারঅ্যাক্ট করার পরিকল্পনা করেন। + +একটি MetaMask ওয়ালেট উপলব্ধ কিনা তা সনাক্ত করতে এবং যদি থাকে তবে এটি সক্ষম করার চেষ্টা করার জন্য এখানে একটি স্নিপেট দেওয়া হলো। এটি আপনাকে পরে ব্যবহারকারীর ব্যালেন্স পড়তে দেবে এবং ইথেরিয়াম ব্লকচেইনে আপনি তাদের দিয়ে যে লেনদেনগুলি করাতে চান সেগুলিকে যাচাই করতে সক্ষম করবে: + +```js +if (window.ethereum != null) { + state.web3 = new Web3(window.ethereum) + try { + // প্রয়োজন হলে অ্যাকাউন্টের অ্যাক্সেসের জন্য অনুরোধ করুন + await window.ethereum.enable() + // অ্যাকাউন্টগুলি এখন উন্মুক্ত + } catch (error) { + // ব্যবহারকারী অ্যাকাউন্টের অ্যাক্সেস অস্বীকার করেছেন... + } +} +``` + +[Ethers.js](https://docs.ethers.io/) এর মতো web3.js এর বিকল্প বিদ্যমান এবং সাধারণত ব্যবহৃত হয়। পরবর্তী টিউটোরিয়ালে আমরা দেখব [কিভাবে সহজেই ব্লকচেইনে নতুন ইনকামিং ব্লক শুনতে হয় এবং দেখতে হয় যে সেগুলিতে কী আছে](https://ethereumdev.io/listening-to-new-transactions-happening-on-the-blockchain/)। diff --git a/public/content/translations/bn/developers/tutorials/short-abi/index.md b/public/content/translations/bn/developers/tutorials/short-abi/index.md new file mode 100644 index 00000000000..48e412adbae --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/short-abi/index.md @@ -0,0 +1,585 @@ +--- +title: "ক্যালডাটা অপটিমাইজেশনের জন্য সংক্ষিপ্ত ABI" +description: "অপ্টিমিস্টিক রোলআপগুলির জন্য স্মার্ট কন্ট্র্যাক্ট অপ্টিমাইজ করা" +author: Ori Pomerantz +lang: bn +tags: [ "লেয়ার 2" ] +skill: intermediate +published: 2022-04-01 +--- + +## ভূমিকা {#introduction} + +এই নিবন্ধে, আপনি [অপ্টিমিস্টিক রোলআপ](/developers/docs/scaling/optimistic-rollups), সেগুলিতে লেনদেনের খরচ, এবং কীভাবে সেই বিভিন্ন খরচ কাঠামো আমাদের Ethereum Mainnet-এর থেকে ভিন্ন জিনিসগুলির জন্য অপ্টিমাইজ করতে বাধ্য করে, সে সম্পর্কে জানবেন। +আপনি এই অপটিমাইজেশনটি কীভাবে প্রয়োগ করবেন তাও শিখবেন। + +### সম্পূর্ণ প্রকাশ {#full-disclosure} + +আমি একজন পূর্ণ-সময়ের [Optimism](https://www.optimism.io/) কর্মচারী, তাই এই নিবন্ধের উদাহরণগুলি Optimism-এ চলবে। +তবে, এখানে ব্যাখ্যা করা কৌশলটি অন্যান্য রোলআপগুলির জন্যও একইভাবে কাজ করবে। + +### পরিভাষা {#terminology} + +রোলআপগুলি নিয়ে আলোচনা করার সময়, 'লেয়ার 1' (L1) শব্দটি Mainnet, অর্থাৎ প্রোডাকশন Ethereum নেটওয়ার্কের জন্য ব্যবহৃত হয়। +'লেয়ার 2' (L2) শব্দটি রোলআপ বা অন্য কোনো সিস্টেমের জন্য ব্যবহৃত হয় যা নিরাপত্তার জন্য L1-এর উপর নির্ভর করে কিন্তু এর বেশিরভাগ প্রক্রিয়াকরণ অফচেইন করে। + +## আমরা কীভাবে L2 লেনদেনের খরচ আরও কমাতে পারি? {#how-can-we-further-reduce-the-cost-of-L2-transactions} + +[অপ্টিমিস্টিক রোলআপগুলি](/developers/docs/scaling/optimistic-rollups)-কে প্রতিটি ঐতিহাসিক লেনদেনের একটি রেকর্ড সংরক্ষণ করতে হয় যাতে যে কেউ সেগুলি পরীক্ষা করতে এবং বর্তমান অবস্থা সঠিক কিনা তা যাচাই করতে পারে। +Ethereum Mainnet-এ ডেটা প্রবেশ করানোর সবচেয়ে সস্তা উপায় হল এটিকে ক্যালডাটা হিসাবে লেখা। +এই সমাধানটি [Optimism](https://help.optimism.io/hc/en-us/articles/4413163242779-What-is-a-rollup-) এবং [Arbitrum](https://developer.offchainlabs.com/docs/rollup_basics#intro-to-rollups) উভয়ই বেছে নিয়েছে। + +### L2 লেনদেনের খরচ {#cost-of-l2-transactions} + +L2 লেনদেনের খরচ দুটি উপাদান নিয়ে গঠিত: + +1. L2 প্রক্রিয়াকরণ, যা সাধারণত অত্যন্ত সস্তা +2. L1 স্টোরেজ, যা Mainnet গ্যাস খরচের সাথে যুক্ত + +আমি যখন এটি লিখছি, Optimism-এ L2 গ্যাসের খরচ 0.001 [Gwei](/developers/docs/gas/#pre-london)। +অন্যদিকে, L1 গ্যাসের খরচ প্রায় 40 gwei। +[আপনি এখানে বর্তমান দাম দেখতে পারেন](https://public-grafana.optimism.io/d/9hkhMxn7z/public-dashboard?orgId=1&refresh=5m)। + +ক্যালডাটার এক বাইটের খরচ হয় 4 গ্যাস (যদি এটি শূন্য হয়) অথবা 16 গ্যাস (যদি এটি অন্য কোনো মান হয়)। +EVM-এর সবচেয়ে ব্যয়বহুল অপারেশনগুলির মধ্যে একটি হল স্টোরেজে লেখা। +L2-তে স্টোরেজে একটি 32-বাইট শব্দ লেখার সর্বোচ্চ খরচ হল 22100 গ্যাস। বর্তমানে, এটি 22.1 gwei। +সুতরাং যদি আমরা ক্যালডাটার একটি মাত্র শূন্য বাইট সংরক্ষণ করতে পারি, তাহলে আমরা প্রায় 200 বাইট স্টোরেজে লিখতে পারব এবং তারপরেও এগিয়ে থাকব। + +### ABI {#the-abi} + +বেশিরভাগ লেনদেন একটি বাহ্যিকভাবে-মালিকানাধীন অ্যাকাউন্ট থেকে একটি চুক্তিতে অ্যাক্সেস করে। +বেশিরভাগ কন্ট্র্যাক্ট Solidity-তে লেখা হয় এবং [অ্যাপ্লিকেশন বাইনারি ইন্টারফেস (ABI)](https://docs.soliditylang.org/en/latest/abi-spec.html#formal-specification-of-the-encoding) অনুযায়ী তাদের ডেটা ফিল্ড ব্যাখ্যা করে। + +যাইহোক, ABI L1-এর জন্য ডিজাইন করা হয়েছিল, যেখানে ক্যালডাটার এক বাইটের খরচ প্রায় চারটি গাণিতিক অপারেশনের সমান, L2-এর মতো নয় যেখানে ক্যালডাটার এক বাইটের খরচ এক হাজারেরও বেশি গাণিতিক অপারেশনের সমান। +ক্যালডাটা এইভাবে বিভক্ত: + +| বিভাগ | দৈর্ঘ্য | বাইট | নষ্ট বাইট | নষ্ট গ্যাস | প্রয়োজনীয় বাইট | প্রয়োজনীয় গ্যাস | +| -------------- | ------: | ----: | --------: | ---------: | ---------------: | ----------------: | +| ফাংশন সিলেক্টর | 4 | 0-3 | 3 | 48 | 1 | 16 | +| শূন্য | 12 | 4-15 | 12 | 48 | 0 | 0 | +| গন্তব্য ঠিকানা | 20 | 16-35 | 0 | 0 | 20 | 320 | +| পরিমাণ | 32 | 36-67 | 17 | 64 | 15 | 240 | +| মোট | 68 | | | 160 | | 576 | + +ব্যাখ্যা: + +- **ফাংশন সিলেক্টর**: কন্ট্র্যাক্টটিতে 256টিরও কম ফাংশন আছে, তাই আমরা সেগুলিকে একটি একক বাইট দিয়ে আলাদা করতে পারি। + এই বাইটগুলি সাধারণত নন-জিরো হয় এবং তাই [ষোল গ্যাস খরচ হয়](https://eips.ethereum.org/EIPS/eip-2028)। +- **শূন্য**: এই বাইটগুলি সর্বদা শূন্য থাকে কারণ একটি বিশ-বাইট ঠিকানার জন্য এটি ধরে রাখার জন্য একটি বত্রিশ-বাইট শব্দের প্রয়োজন হয় না। + শূন্য ধারণকারী বাইটের জন্য চার গ্যাস খরচ হয় ([ইয়েলো পেপার দেখুন](https://ethereum.github.io/yellowpaper/paper.pdf), পরিশিষ্ট G, + পৃ. 27, `G``txdatazero`-এর মান)। +- **পরিমাণ**: যদি আমরা ধরে নিই যে এই কন্ট্র্যাক্টে `decimals` আঠারো (সাধারণ মান) এবং আমরা যে সর্বোচ্চ পরিমাণ টোকেন স্থানান্তর করব তা হল 1018, তাহলে আমরা সর্বোচ্চ পরিমাণ 1036 পাই। + 25615 > 1036, তাই পনেরো বাইটই যথেষ্ট। + +L1-এ 160 গ্যাস নষ্ট হওয়া সাধারণত নগণ্য। একটি লেনদেনের খরচ কমপক্ষে [21,000 গ্যাস](https://yakkomajuri.medium.com/blockchain-definition-of-the-week-ethereum-gas-2f976af774ed), তাই অতিরিক্ত 0.8% কোনো ব্যাপার না। +তবে, L2-তে, পরিস্থিতি ভিন্ন। লেনদেনের প্রায় সম্পূর্ণ খরচই হল এটিকে L1-এ লেখা। +লেনদেনের ক্যালডাটা ছাড়াও, 109 বাইটের লেনদেন হেডার (গন্তব্য ঠিকানা, স্বাক্ষর ইত্যাদি) রয়েছে। +সুতরাং মোট খরচ হল `109*16+576+160=2480`, এবং আমরা এর প্রায় 6.5% নষ্ট করছি। + +## যখন আপনি গন্তব্য নিয়ন্ত্রণ করেন না তখন খরচ কমানো {#reducing-costs-when-you-dont-control-the-destination} + +ধরে নিচ্ছি যে আপনার গন্তব্য কন্ট্র্যাক্টের উপর কোনো নিয়ন্ত্রণ নেই, আপনি এখনও [এটির](https://github.com/qbzzt/ethereum.org-20220330-shortABI) মতো একটি সমাধান ব্যবহার করতে পারেন। +চলুন প্রাসঙ্গিক ফাইলগুলি দেখে নেওয়া যাক। + +### Token.sol {#token-sol} + +[এটি হল গন্তব্য কন্ট্র্যাক্ট](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/Token.sol)। +এটি একটি স্ট্যান্ডার্ড ERC-20 কন্ট্র্যাক্ট, একটি অতিরিক্ত বৈশিষ্ট্য সহ। +এই `faucet` ফাংশনটি যেকোনো ব্যবহারকারীকে ব্যবহার করার জন্য কিছু টোকেন পেতে দেয়। +এটি একটি প্রোডাকশন ERC-20 কন্ট্র্যাক্টকে অকেজো করে দেবে, কিন্তু যখন একটি ERC-20 শুধুমাত্র পরীক্ষার সুবিধার্থে বিদ্যমান থাকে তখন এটি জীবনকে সহজ করে তোলে। + +```solidity + /** + * @dev কলারকে খেলার জন্য 1000 টোকেন দেয় + */ + function faucet() external { + _mint(msg.sender, 1000); + } // function faucet +``` + +### CalldataInterpreter.sol {#calldatainterpreter-sol} + +[এইটি সেই কন্ট্র্যাক্ট যাকে লেনদেনগুলি সংক্ষিপ্ত ক্যালডাটা দিয়ে কল করার কথা](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/contracts/CalldataInterpreter.sol)। +আসুন এটি লাইন বাই লাইন পর্যালোচনা করা যাক। + +```solidity +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.0; + + +import { OrisUselessToken } from "./Token.sol"; +``` + +টোকেন ফাংশনটিকে কীভাবে কল করতে হয় তা জানতে আমাদের এটি প্রয়োজন। + +```solidity +contract CalldataInterpreter { + + OrisUselessToken public immutable token; +``` + +টোকেনের ঠিকানা যার জন্য আমরা একটি প্রক্সি। + +```solidity + + /** + * @dev টোকেনের ঠিকানা উল্লেখ করুন + * @param tokenAddr_ ERC-20 চুক্তির ঠিকানা + */ + constructor( + address tokenAddr_ + ) { + token = OrisUselessToken(tokenAddr_); + } // constructor +``` + +টোকেনের ঠিকানা হল একমাত্র প্যারামিটার যা আমাদের উল্লেখ করতে হবে। + +```solidity + function calldataVal(uint startByte, uint length) + private pure returns (uint) { +``` + +ক্যালডাটা থেকে একটি মান পড়ুন। + +```solidity + uint _retVal; + + require(length < 0x21, + "calldataVal length limit is 32 bytes"); + + require(length + startByte <= msg.data.length, + "calldataVal trying to read beyond calldatasize"); +``` + +আমরা মেমরিতে একটি একক 32-বাইট (256-বিট) শব্দ লোড করতে যাচ্ছি এবং যে বাইটগুলি আমরা চাই সেই ফিল্ডের অংশ নয় তা সরিয়ে ফেলতে যাচ্ছি। +এই অ্যালগরিদম 32 বাইটের চেয়ে দীর্ঘ মানের জন্য কাজ করে না এবং অবশ্যই আমরা ক্যালডাটার শেষ পর্যন্ত পড়তে পারি না। +L1-এ গ্যাস বাঁচানোর জন্য এই পরীক্ষাগুলি এড়িয়ে যাওয়ার প্রয়োজন হতে পারে, কিন্তু L2-এ গ্যাস অত্যন্ত সস্তা, যা আমরা ভাবতে পারি এমন যেকোনো স্যানিটি চেক করতে সক্ষম করে। + +```solidity + assembly { + _retVal := calldataload(startByte) + } +``` + +আমরা `fallback()`-এ করা কল থেকে ডেটা কপি করতে পারতাম (নিচে দেখুন), কিন্তু [Yul](https://docs.soliditylang.org/en/v0.8.12/yul.html) ব্যবহার করা সহজ, যা EVM-এর অ্যাসেম্বলি ল্যাঙ্গুয়েজ। + +এখানে আমরা স্ট্যাকের মধ্যে `startByte` থেকে `startByte+31` বাইটগুলি পড়ার জন্য [CALLDATALOAD অপকোড](https://www.evm.codes/#35) ব্যবহার করি। +সাধারণভাবে, Yul-এ একটি অপকোডের সিনট্যাক্স হল `(,...)`। + +```solidity + + _retVal = _retVal >> (256-length*8); +``` + +কেবলমাত্র সবচেয়ে গুরুত্বপূর্ণ `length` বাইটগুলি ফিল্ডের অংশ, তাই আমরা অন্যান্য মানগুলি থেকে মুক্তি পেতে [রাইট-শিফ্ট](https://en.wikipedia.org/wiki/Logical_shift) করি। +এর একটি অতিরিক্ত সুবিধা হল এটি মানটিকে ফিল্ডের ডানদিকে নিয়ে যায়, তাই এটি মানটি নিজেই হয়, মানটিকে 256কিছু দিয়ে গুণ করার পরিবর্তে। + +```solidity + + return _retVal; + } + + + fallback() external { +``` + +যখন একটি Solidity কন্ট্র্যাক্টে করা কল কোনো ফাংশন সিগনেচারের সাথে মেলে না, তখন এটি [the `fallback()` function](https://docs.soliditylang.org/en/v0.8.12/contracts.html#fallback-function)-কে কল করে (ধরে নেওয়া হয় যে একটি আছে)। +`CalldataInterpreter`-এর ক্ষেত্রে, _যেকোনো_ কল এখানে আসে কারণ অন্য কোনো `external` বা `public` ফাংশন নেই। + +```solidity + uint _func; + + _func = calldataVal(0, 1); +``` + +ক্যালডাটার প্রথম বাইটটি পড়ুন, যা আমাদের ফাংশনটি জানায়। +দুটি কারণে একটি ফাংশন এখানে উপলব্ধ নাও হতে পারে: + +1. `pure` বা `view` ফাংশনগুলি স্টেট পরিবর্তন করে না এবং গ্যাস খরচ করে না (যখন অফচেইন কল করা হয়)। + তাদের গ্যাস খরচ কমানোর চেষ্টা করার কোন মানে হয় না। +2. যে ফাংশনগুলি [`msg.sender`](https://docs.soliditylang.org/en/v0.8.12/units-and-global-variables.html#block-and-transaction-properties)-এর উপর নির্ভর করে। + `msg.sender`-এর মান কলার নয়, `CalldataInterpreter`-এর ঠিকানা হতে চলেছে। + +দুর্ভাগ্যবশত, [ERC-20 স্পেসিফিকেশন দেখলে](https://eips.ethereum.org/EIPS/eip-20), এটি শুধুমাত্র একটি ফাংশন ছেড়ে দেয়, `transfer`। +এটি আমাদের জন্য মাত্র দুটি ফাংশন রেখে যায়: `transfer` (কারণ আমরা `transferFrom` কল করতে পারি) এবং `faucet` (কারণ আমরা যে কেউ আমাদের কল করেছে তাকে টোকেনগুলি ফেরত পাঠাতে পারি)। + +```solidity + + // ক্যালডাটা থেকে তথ্য ব্যবহার করে + // টোকেনের অবস্থা পরিবর্তনকারী পদ্ধতিগুলিকে কল করুন + + // faucet + if (_func == 1) { +``` + +`faucet()`-এ একটি কল, যার কোনো প্যারামিটার নেই। + +```solidity + token.faucet(); + token.transfer(msg.sender, + token.balanceOf(address(this))); + } +``` + +আমরা `token.faucet()` কল করার পরে আমরা টোকেন পাই। তবে, প্রক্সি চুক্তি হিসাবে, আমাদের টোকেনের **প্রয়োজন নেই**। +যে EOA (externally owned account) বা কন্ট্র্যাক্ট আমাদের কল করেছে, তার প্রয়োজন। +তাই আমরা আমাদের সমস্ত টোকেন যে কেউ আমাদের ডেকেছে তাকে স্থানান্তর করি। + +```solidity + // স্থানান্তর (ধরে নিন আমাদের এর জন্য একটি ভাতা আছে) + if (_func == 2) { +``` + +টোকেন স্থানান্তরের জন্য দুটি প্যারামিটার প্রয়োজন: গন্তব্য ঠিকানা এবং পরিমাণ। + +```solidity + token.transferFrom( + msg.sender, +``` + +আমরা কেবল কলারদের তাদের মালিকানাধীন টোকেনগুলি স্থানান্তর করার অনুমতি দিই + +```solidity + address(uint160(calldataVal(1, 20))), +``` + +গন্তব্যের ঠিকানাটি বাইট #1 থেকে শুরু হয় (বাইট #0 হল ফাংশন)। +একটি ঠিকানা হিসাবে, এটি 20-বাইট দীর্ঘ। + +```solidity + calldataVal(21, 2) +``` + +এই নির্দিষ্ট চুক্তির জন্য আমরা ধরে নিই যে সর্বোচ্চ সংখ্যক টোকেন যা কেউ স্থানান্তর করতে চায় তা দুটি বাইটে (65536-এর কম) ফিট করে। + +```solidity + ); + } +``` + +সামগ্রিকভাবে, একটি স্থানান্তরে 35 বাইট ক্যালডাটা লাগে: + +| বিভাগ | দৈর্ঘ্য | বাইট | +| -------------- | ------: | ----: | +| ফাংশন সিলেক্টর | 1 | 0 | +| গন্তব্য ঠিকানা | 32 | 1-32 | +| পরিমাণ | 2 | 33-34 | + +```solidity + } // fallback + +} // contract CalldataInterpreter +``` + +### test.js {#test-js} + +[এই জাভাস্ক্রিপ্ট ইউনিট পরীক্ষাটি](https://github.com/qbzzt/ethereum.org-20220330-shortABI/blob/master/test/test.js) আমাদের দেখায় কিভাবে এই প্রক্রিয়াটি ব্যবহার করতে হয় (এবং কিভাবে এটি সঠিকভাবে কাজ করে তা যাচাই করতে হয়)। +আমি ধরে নিচ্ছি আপনি [chai](https://www.chaijs.com/) এবং [ethers](https://docs.ethers.io/v5/) বোঝেন এবং শুধুমাত্র সেই অংশগুলি ব্যাখ্যা করব যা নির্দিষ্টভাবে কন্ট্র্যাক্টে প্রযোজ্য। + +```js +const { expect } = require("chai"); + +describe("CalldataInterpreter", function () { + it("Should let us use tokens", async function () { + const Token = await ethers.getContractFactory("OrisUselessToken") + const token = await Token.deploy() + await token.deployed() + console.log("Token addr:", token.address) + + const Cdi = await ethers.getContractFactory("CalldataInterpreter") + const cdi = await Cdi.deploy(token.address) + await cdi.deployed() + console.log("CalldataInterpreter addr:", cdi.address) + + const signer = await ethers.getSigner() +``` + +আমরা উভয় কন্ট্র্যাক্ট ডিপ্লয় করে শুরু করি। + +```javascript + // খেলার জন্য টোকেন নিন + const faucetTx = { +``` + +আমরা লেনদেন তৈরি করতে সাধারণত যে উচ্চ-স্তরের ফাংশনগুলি ব্যবহার করি (যেমন `token.faucet()`) সেগুলি ব্যবহার করতে পারি না, কারণ আমরা ABI অনুসরণ করি না। +পরিবর্তে, আমাদের নিজেদের লেনদেন তৈরি করতে হবে এবং তারপর তা পাঠাতে হবে। + +```javascript + to: cdi.address, + data: "0x01" +``` + +লেনদেনের জন্য আমাদের দুটি প্যারামিটার সরবরাহ করতে হবে: + +1. `to`, গন্তব্য ঠিকানা। + এটি ক্যালডাটা ইন্টারপ্রেটার কন্ট্র্যাক্ট। +2. `data`, পাঠানোর জন্য ক্যালডাটা। + একটি ফসেট কলের ক্ষেত্রে, ডেটা একটি একক বাইট, `0x01`। + +```javascript + + } + await (await signer.sendTransaction(faucetTx)).wait() +``` + +আমরা [সাইনারের `sendTransaction` পদ্ধতি](https://docs.ethers.io/v5/api/signer/#Signer-sendTransaction) কল করি কারণ আমরা ইতিমধ্যে গন্তব্য (`faucetTx.to`) নির্দিষ্ট করেছি এবং আমাদের লেনদেনটি স্বাক্ষর করা প্রয়োজন। + +```javascript +// ফসেট সঠিকভাবে টোকেন সরবরাহ করে কিনা তা পরীক্ষা করুন +expect(await token.balanceOf(signer.address)).to.equal(1000) +``` + +এখানে আমরা ব্যালেন্স যাচাই করি। +`view` ফাংশনগুলিতে গ্যাস বাঁচানোর কোনো প্রয়োজন নেই, তাই আমরা কেবল সেগুলিকে স্বাভাবিকভাবে চালাই। + +```javascript +// CDI-কে একটি ভাতা দিন (অনুমোদনগুলি প্রক্সি করা যায় না) +const approveTX = await token.approve(cdi.address, 10000) +await approveTX.wait() +expect(await token.allowance(signer.address, cdi.address)).to.equal(10000) +``` + +স্থানান্তর করতে সক্ষম হওয়ার জন্য ক্যালডাটা ইন্টারপ্রেটারকে একটি ভাতা দিন। + +```javascript +// টোকেন স্থানান্তর করুন +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +``` + +একটি স্থানান্তর লেনদেন তৈরি করুন। প্রথম বাইট হল "0x02", তারপরে গন্তব্য ঠিকানা এবং সবশেষে পরিমাণ (0x0100, যা দশমিকে 256)। + +```javascript + await (await signer.sendTransaction(transferTx)).wait() + + // পরীক্ষা করুন যে আমাদের কাছে 256টি টোকেন কম আছে + expect (await token.balanceOf(signer.address)).to.equal(1000-256) + + // এবং যে আমাদের গন্তব্য সেগুলি পেয়েছে + expect (await token.balanceOf(destAddr)).to.equal(256) + }) // it +}) // describe +``` + +## যখন আপনি গন্তব্য কন্ট্র্যাক্ট নিয়ন্ত্রণ করেন তখন খরচ কমানো {#reducing-the-cost-when-you-do-control-the-destination-contract} + +যদি আপনার গন্তব্য কন্ট্র্যাক্টের উপর নিয়ন্ত্রণ থাকে তবে আপনি এমন ফাংশন তৈরি করতে পারেন যা `msg.sender` চেকগুলিকে বাইপাস করে কারণ তারা ক্যালডাটা ইন্টারপ্রেটারের উপর বিশ্বাস করে। +[আপনি `কন্ট্রোল-কন্ট্র্যাক্ট` শাখায়, এখানে এটি কীভাবে কাজ করে তার একটি উদাহরণ দেখতে পারেন](https://github.com/qbzzt/ethereum.org-20220330-shortABI/tree/control-contract)। + +যদি চুক্তিটি শুধুমাত্র বাহ্যিক লেনদেনের প্রতিক্রিয়া জানায়, আমরা কেবল একটি চুক্তি থাকার মাধ্যমে পেতে পারি। +যাইহোক, এটি [কম্পোজিবিলিটি](/developers/docs/smart-contracts/composability/) ভঙ্গ করবে। +একটি কন্ট্র্যাক্ট থাকা অনেক ভালো যা সাধারণ ERC-20 কলের প্রতিক্রিয়া জানায়, এবং অন্য একটি কন্ট্র্যাক্ট যা সংক্ষিপ্ত কল ডেটা সহ লেনদেনের প্রতিক্রিয়া জানায়। + +### Token.sol {#token-sol-2} + +এই উদাহরণে আমরা `Token.sol` পরিবর্তন করতে পারি। +এটি আমাদের বেশ কয়েকটি ফাংশন রাখতে দেয় যা কেবল প্রক্সি কল করতে পারে। +এখানে নতুন অংশগুলি হল: + +```solidity + // CalldataInterpreter ঠিকানা নির্দিষ্ট করার জন্য একমাত্র অনুমোদিত ঠিকানা + address owner; + + // CalldataInterpreter ঠিকানা + address proxy = address(0); +``` + +ERC-20 কন্ট্র্যাক্টকে অনুমোদিত প্রক্সির পরিচয় জানতে হবে। +তবে, আমরা কনস্ট্রাক্টরে এই ভেরিয়েবলটি সেট করতে পারি না, কারণ আমরা এখনও মানটি জানি না। +এই কন্ট্র্যাক্টটি প্রথমে ইনস্ট্যানশিয়েট করা হয় কারণ প্রক্সি তার কনস্ট্রাক্টরে টোকেনের ঠিকানা আশা করে। + +```solidity + /** + * @dev ERC20 কনস্ট্রাক্টরকে কল করে। + */ + constructor( + ) ERC20("Oris useless token-2", "OUT-2") { + owner = msg.sender; + } +``` + +নির্মাতার ঠিকানা (যাকে `owner` বলা হয়) এখানে সংরক্ষণ করা হয় কারণ এটিই একমাত্র ঠিকানা যা প্রক্সি সেট করার অনুমতিপ্রাপ্ত। + +```solidity + /** + * @dev প্রক্সির জন্য ঠিকানা সেট করুন (the CalldataInterpreter)। + * মালিক দ্বারা কেবল একবার কল করা যেতে পারে + */ + function setProxy(address _proxy) external { + require(msg.sender == owner, "Can only be called by owner"); + require(proxy == address(0), "Proxy is already set"); + + proxy = _proxy; + } // function setProxy +``` + +প্রক্সির বিশেষাধিকারপ্রাপ্ত অ্যাক্সেস রয়েছে, কারণ এটি সুরক্ষা পরীক্ষাগুলি বাইপাস করতে পারে। +আমরা প্রক্সিকে বিশ্বাস করতে পারি তা নিশ্চিত করার জন্য, আমরা কেবল `owner`-কে এই ফাংশনটি কল করার অনুমতি দিই, এবং কেবল একবার। +একবার `proxy`-র একটি আসল মান (শূন্য নয়) হয়ে গেলে, সেই মানটি পরিবর্তন করা যায় না, তাই এমনকি যদি মালিক দুর্বৃত্ত হয়ে যাওয়ার সিদ্ধান্ত নেয়, বা এর জন্য স্মারকটি প্রকাশ করা হয়, আমরা এখনও নিরাপদ। + +```solidity + /** + * @dev কিছু ফাংশন শুধুমাত্র প্রক্সি দ্বারা কল করা যেতে পারে। + */ + modifier onlyProxy { +``` + +এটি একটি [`modifier` ফাংশন](https://www.tutorialspoint.com/solidity/solidity_function_modifiers.htm), এটি অন্যান্য ফাংশনগুলির কাজ করার পদ্ধতি পরিবর্তন করে। + +```solidity + require(msg.sender == proxy); +``` + +প্রথমে, যাচাই করুন যে আমরা প্রক্সি দ্বারা কল হয়েছি এবং অন্য কেউ নয়। +যদি না হয়, `revert`। + +```solidity + _; + } +``` + +যদি তাই হয়, তাহলে আমরা যে ফাংশনটি পরিবর্তন করি সেটি চালান। + +```solidity + /* যে ফাংশনগুলি প্রক্সিকে প্রকৃতপক্ষে অ্যাকাউন্টগুলির জন্য প্রক্সি করার অনুমতি দেয় */ + + function transferProxy(address from, address to, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _transfer(from, to, amount); + return true; + } + + function approveProxy(address from, address spender, uint256 amount) + public virtual onlyProxy() returns (bool) + { + _approve(from, spender, amount); + return true; + } + + function transferFromProxy( + address spender, + address from, + address to, + uint256 amount + ) public virtual onlyProxy() returns (bool) + { + _spendAllowance(from, spender, amount); + _transfer(from, to, amount); + return true; + } +``` + +এই তিনটি অপারেশন যার জন্য সাধারণত বার্তাটি টোকেন স্থানান্তরকারী বা একটি ভাতা অনুমোদনকারী সত্তা থেকে সরাসরি আসতে হয়। +এখানে আমাদের কাছে এই অপারেশনগুলির একটি প্রক্সি সংস্করণ রয়েছে যা: + +1. `onlyProxy()` দ্বারা পরিবর্তিত হয় যাতে অন্য কেউ তাদের নিয়ন্ত্রণ করতে না পারে। +2. যে ঠিকানাটি সাধারণত `msg.sender` হবে তা একটি অতিরিক্ত প্যারামিটার হিসাবে পায়। + +### CalldataInterpreter.sol {#calldatainterpreter-sol-2} + +ক্যালডাটা ইন্টারপ্রেটারটি উপরেরটির মতোই, তবে প্রক্সিড ফাংশনগুলি একটি `msg.sender` প্যারামিটার গ্রহণ করে এবং `transfer`-এর জন্য কোনও ভাতার প্রয়োজন হয় না। + +```solidity + // স্থানান্তর (ভাতার কোন প্রয়োজন নেই) + if (_func == 2) { + token.transferProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // অনুমোদন + if (_func == 3) { + token.approveProxy( + msg.sender, + address(uint160(calldataVal(1, 20))), + calldataVal(21, 2) + ); + } + + // transferFrom + if (_func == 4) { + token.transferFromProxy( + msg.sender, + address(uint160(calldataVal( 1, 20))), + address(uint160(calldataVal(21, 20))), + calldataVal(41, 2) + ); + } +``` + +### Test.js {#test-js-2} + +আগের টেস্টিং কোড এবং এটির মধ্যে কিছু পরিবর্তন রয়েছে। + +```js +const Cdi = await ethers.getContractFactory("CalldataInterpreter") +const cdi = await Cdi.deploy(token.address) +await cdi.deployed() +await token.setProxy(cdi.address) +``` + +কোন প্রক্সিকে বিশ্বাস করতে হবে তা আমাদের ERC-20 চুক্তিকে জানাতে হবে + +```js +console.log("CalldataInterpreter addr:", cdi.address) + +// ভাতার যাচাইয়ের জন্য দুটি সাইনার প্রয়োজন +const signers = await ethers.getSigners() +const signer = signers[0] +const poorSigner = signers[1] +``` + +`approve()` এবং `transferFrom()` পরীক্ষা করার জন্য আমাদের একটি দ্বিতীয় সাইনার প্রয়োজন। +আমরা এটিকে `poorSigner` বলি কারণ এটি আমাদের কোনো টোকেন পায় না (অবশ্যই এর কাছে ETH থাকতে হবে)। + +```js +// টোকেন স্থানান্তর করুন +const destAddr = "0xf5a6ead936fb47f342bb63e676479bddf26ebe1d" +const transferTx = { + to: cdi.address, + data: "0x02" + destAddr.slice(2, 42) + "0100", +} +await (await signer.sendTransaction(transferTx)).wait() +``` + +যেহেতু ERC-20 কন্ট্র্যাক্ট প্রক্সি (`cdi`)-কে বিশ্বাস করে, তাই আমাদের স্থানান্তর রিলে করার জন্য কোনো ভাতার প্রয়োজন নেই। + +```js +// অনুমোদন এবং transferFrom +const approveTx = { + to: cdi.address, + data: "0x03" + poorSigner.address.slice(2, 42) + "00FF", +} +await (await signer.sendTransaction(approveTx)).wait() + +const destAddr2 = "0xE1165C689C0c3e9642cA7606F5287e708d846206" + +const transferFromTx = { + to: cdi.address, + data: "0x04" + signer.address.slice(2, 42) + destAddr2.slice(2, 42) + "00FF", +} +await (await poorSigner.sendTransaction(transferFromTx)).wait() + +// approve / transferFrom কম্বো সঠিকভাবে করা হয়েছে কিনা তা পরীক্ষা করুন +expect(await token.balanceOf(destAddr2)).to.equal(255) +``` + +দুটি নতুন ফাংশন পরীক্ষা করুন। +লক্ষ্য করুন যে `transferFromTx`-এর জন্য দুটি ঠিকানা প্যারামিটার প্রয়োজন: ভাতার দাতা এবং প্রাপক। + +## উপসংহার {#conclusion} + +[Optimism](https://medium.com/ethereum-optimism/the-road-to-sub-dollar-transactions-part-2-compression-edition-6bb2890e3e92) এবং [Arbitrum](https://developer.offchainlabs.com/docs/special_features) উভয়ই L1-এ লেখা ক্যালডাটার আকার এবং তার ফলে লেনদেনের খরচ কমানোর উপায় খুঁজছে। +যাইহোক, জেনেরিক সমাধান খোঁজার জন্য অবকাঠামো প্রদানকারী হিসাবে, আমাদের ক্ষমতা সীমিত। +ড্যাপ ডেভেলপার হিসাবে, আপনার কাছে অ্যাপ্লিকেশন-নির্দিষ্ট জ্ঞান রয়েছে, যা আপনাকে একটি জেনেরিক সমাধানে আমাদের চেয়ে অনেক ভালোভাবে আপনার ক্যালডাটা অপটিমাইজ করতে দেয়। +আশা করি, এই নিবন্ধটি আপনাকে আপনার প্রয়োজনের জন্য আদর্শ সমাধান খুঁজে পেতে সহায়তা করবে। + +[আমার আরও কাজের জন্য এখানে দেখুন](https://cryptodocguy.pro/)। + diff --git a/public/content/translations/bn/developers/tutorials/smart-contract-security-guidelines/index.md b/public/content/translations/bn/developers/tutorials/smart-contract-security-guidelines/index.md new file mode 100644 index 00000000000..831304c4347 --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/smart-contract-security-guidelines/index.md @@ -0,0 +1,91 @@ +--- +title: "স্মার্ট কন্ট্র্যাক্ট নিরাপত্তা নির্দেশিকা" +description: "আপনার ডিএ্যাপ তৈরি করার সময় বিবেচনা করার জন্য নিরাপত্তা নির্দেশিকাগুলির একটি চেকলিস্ট" +author: "Trailofbits" +tags: [ "সলিডিটি", "স্মার্ট কন্ট্র্যাক্ট", "নিরাপত্তা" ] +skill: intermediate +lang: bn +published: 2020-09-06 +source: Building secure contracts +sourceUrl: https://github.com/crytic/building-secure-contracts/blob/master/development-guidelines/guidelines.md +--- + +আরও সুরক্ষিত স্মার্ট কন্ট্র্যাক্ট তৈরি করতে এই উচ্চ-স্তরের সুপারিশগুলি অনুসরণ করুন। + +## ডিজাইন নির্দেশিকা {#design-guidelines} + +কোডের কোনো লাইন লেখার আগে, কন্ট্র্যাক্টটির ডিজাইন আগে থেকেই আলোচনা করা উচিত। + +### নথিপত্র এবং স্পেসিফিকেশন {#documentation-and-specifications} + +নথিপত্র বিভিন্ন স্তরে লেখা যেতে পারে এবং কন্ট্র্যাক্টগুলি বাস্তবায়ন করার সময় আপডেট করা উচিত: + +- **সিস্টেমটির একটি সহজবোধ্য ইংরেজি বর্ণনা**, যেখানে কন্ট্র্যাক্টগুলি কী করে এবং কোডবেসের ওপর যেকোনো অনুমান তার বর্ণনা থাকবে। +- **স্কিমা এবং আর্কিটেকচারাল ডায়াগ্রাম**, কন্ট্র্যাক্টের ইন্টার‍্যাকশন এবং সিস্টেমের স্টেট মেশিন সহ। [Slither প্রিন্টার](https://github.com/crytic/slither/wiki/Printer-documentation) এই স্কিমাগুলি তৈরি করতে সাহায্য করতে পারে। +- **পুঙ্খানুপুঙ্খ কোড নথিপত্র**, Solidity-র জন্য [Natspec ফর্ম্যাট](https://docs.soliditylang.org/en/develop/natspec-format.html) ব্যবহার করা যেতে পারে। + +### অনচেইন বনাম অফচেইন গণনা {#onchain-vs-offchain-computation} + +- **যতটা সম্ভব কোড অফচেইন রাখুন।** অনচেইন লেয়ার ছোট রাখুন। অফচেইন কোড দিয়ে এমনভাবে ডেটা প্রি-প্রসেস করুন যাতে অনচেইনে যাচাইকরণ সহজ হয়। আপনার কি একটি অর্ডার করা তালিকা প্রয়োজন? তালিকাটি অফচেইনে সাজান, তারপর শুধু অনচেইনে তার ক্রম পরীক্ষা করুন। + +### আপগ্রেডযোগ্যতা {#upgradeability} + +আমরা [আমাদের ব্লগপোস্টে](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/) বিভিন্ন আপগ্রেডযোগ্যতার সমাধান নিয়ে আলোচনা করেছি। কোনো কোড লেখার আগে আপগ্রেডযোগ্যতা সমর্থন করবেন কি না সে বিষয়ে সজ্ঞানে একটি সিদ্ধান্ত নিন। এই সিদ্ধান্তটি আপনি কীভাবে আপনার কোড গঠন করেন তাকে প্রভাবিত করবে। সাধারণত, আমরা সুপারিশ করি: + +- **আপগ্রেডযোগ্যতার চেয়ে [কন্ট্র্যাক্ট মাইগ্রেশনকে](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) বেশি গুরুত্ব দিন।** মাইগ্রেশন সিস্টেমে আপগ্রেডযোগ্য সিস্টেমের মতো অনেক সুবিধা রয়েছে, তাদের অসুবিধাগুলো ছাড়াই। +- **delegatecallproxy প্যাটার্নের চেয়ে ডেটা সেপারেশন প্যাটার্ন ব্যবহার করুন।** যদি আপনার প্রোজেক্টে একটি স্পষ্ট অ্যাবস্ট্রাকশন সেপারেশন থাকে, তাহলে ডেটা সেপারেশন ব্যবহার করে আপগ্রেডযোগ্যতার জন্য শুধুমাত্র কয়েকটি সামঞ্জস্যের প্রয়োজন হবে। delegatecallproxy-এর জন্য EVM দক্ষতার প্রয়োজন এবং এটিতে ভুল হওয়ার সম্ভাবনা অনেক বেশি। +- **ডিপ্লয়মেন্টের আগে মাইগ্রেশন/আপগ্রেড পদ্ধতি নথিভুক্ত করুন।** যদি আপনাকে কোনো নির্দেশিকা ছাড়াই চাপের মধ্যে প্রতিক্রিয়া দেখাতে হয়, তাহলে আপনি ভুল করবেন। অনুসরণ করার পদ্ধতি আগে থেকেই লিখে রাখুন। এতে অন্তর্ভুক্ত করা উচিত: + - যে কলগুলি নতুন কন্ট্র্যাক্ট শুরু করে + - কি-গুলি কোথায় সংরক্ষণ করা হয়েছে এবং কীভাবে সেগুলি অ্যাক্সেস করতে হয় + - কীভাবে ডিপ্লয়মেন্ট পরীক্ষা করবেন! একটি পোস্ট-ডিপ্লয়মেন্ট স্ক্রিপ্ট তৈরি করুন এবং পরীক্ষা করুন। + +## বাস্তবায়ন নির্দেশিকা {#implementation-guidelines} + +**সরলতার জন্য চেষ্টা করুন।** সর্বদা আপনার উদ্দেশ্যের সাথে মানানসই সহজতম সমাধানটি ব্যবহার করুন। আপনার দলের যেকোনো সদস্যের আপনার সমাধানটি বুঝতে পারা উচিত। + +### ফাংশন কম্পোজিশন {#function-composition} + +আপনার কোডবেসের আর্কিটেকচার আপনার কোডকে পর্যালোচনা করা সহজ করে তুলবে। এমন আর্কিটেকচারাল পছন্দগুলি এড়িয়ে চলুন যা এর সঠিকতা সম্পর্কে যুক্তি দেওয়ার ক্ষমতা হ্রাস করে। + +- **আপনার সিস্টেমের লজিককে বিভক্ত করুন**, একাধিক কন্ট্র্যাক্টের মাধ্যমে অথবা একই ধরনের ফাংশনগুলিকে একসাথে গ্রুপ করে (উদাহরণস্বরূপ, অথেন্টিকেশন, অ্যারিথমেটিক, ...)। +- **ছোট ছোট ফাংশন লিখুন, একটি স্পষ্ট উদ্দেশ্য সহ।** এটি পর্যালোচনা সহজতর করবে এবং স্বতন্ত্র উপাদানগুলির পরীক্ষা করার অনুমতি দেবে। + +### ইনহেরিটেন্স {#inheritance} + +- **ইনহেরিটেন্স পরিচালনাযোগ্য রাখুন।** লজিক বিভক্ত করার জন্য ইনহেরিটেন্স ব্যবহার করা উচিত, তবে, আপনার প্রোজেক্টের লক্ষ্য হওয়া উচিত ইনহেরিটেন্স ট্রি-এর গভীরতা এবং প্রস্থ কমানো। +- **কন্ট্র্যাক্টগুলির হায়ারার্কি পরীক্ষা করতে Slither-এর [ইনহেরিটেন্স প্রিন্টার](https://github.com/crytic/slither/wiki/Printer-documentation#inheritance-graph) ব্যবহার করুন।** ইনহেরিটেন্স প্রিন্টার আপনাকে হায়ারার্কির আকার পর্যালোচনা করতে সাহায্য করবে। + +### ইভেন্ট {#events} + +- **সমস্ত গুরুত্বপূর্ণ অপারেশন লগ করুন।** ডেভেলপমেন্টের সময় কন্ট্র্যাক্ট ডিবাগ করতে এবং ডিপ্লয়মেন্টের পরে এটি নিরীক্ষণ করতে ইভেন্টগুলি সাহায্য করবে। + +### পরিচিত ফাঁদগুলি এড়িয়ে চলুন {#avoid-known-pitfalls} + +- **সবচেয়ে সাধারণ নিরাপত্তা সমস্যা সম্পর্কে সচেতন থাকুন।** সাধারণ সমস্যাগুলি সম্পর্কে জানার জন্য অনেক অনলাইন রিসোর্স রয়েছে, যেমন [Ethernaut CTF](https://ethernaut.openzeppelin.com/), [Capture the Ether](https://capturetheether.com/), অথবা [Not so smart contracts](https://github.com/crytic/not-so-smart-contracts/)। +- **[Solidity নথিপত্রের](https://docs.soliditylang.org/en/latest/) সতর্কতা বিভাগগুলি সম্পর্কে সচেতন থাকুন।** সতর্কতা বিভাগগুলি আপনাকে ভাষার অ-স্পষ্ট আচরণ সম্পর্কে অবহিত করবে। + +### ডিপেন্ডেন্সি {#dependencies} + +- **সু-পরীক্ষিত লাইব্রেরি ব্যবহার করুন।** সু-পরীক্ষিত লাইব্রেরি থেকে কোড ইম্পোর্ট করলে আপনার ত্রুটিপূর্ণ কোড লেখার সম্ভাবনা কমে যাবে। আপনি যদি একটি ERC20 কন্ট্র্যাক্ট লিখতে চান, তাহলে [OpenZeppelin](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC20) ব্যবহার করুন। +- **একটি ডিপেন্ডেন্সি ম্যানেজার ব্যবহার করুন; কোড কপি-পেস্ট করা এড়িয়ে চলুন।** আপনি যদি কোনো বাহ্যিক উৎসের ওপর নির্ভর করেন, তবে আপনাকে অবশ্যই এটিকে মূল উৎসের সাথে আপ-টু-ডেট রাখতে হবে। + +### পরীক্ষা এবং যাচাইকরণ {#testing-and-verification} + +- **পুঙ্খানুপুঙ্খ ইউনিট-টেস্ট লিখুন।** উচ্চ-মানের সফ্টওয়্যার তৈরি করতে একটি বিস্তৃত টেস্ট স্যুট অত্যন্ত গুরুত্বপূর্ণ। +- **[Slither](https://github.com/crytic/slither), [Echidna](https://github.com/crytic/echidna) এবং [Manticore](https://github.com/trailofbits/manticore)-এর কাস্টম চেক এবং প্রপার্টি লিখুন।** স্বয়ংক্রিয় টুলস আপনার কন্ট্র্যাক্ট সুরক্ষিত কিনা তা নিশ্চিত করতে সাহায্য করবে। দক্ষ চেক এবং প্রপার্টি কীভাবে লিখতে হয় তা শিখতে এই গাইডের বাকি অংশ পর্যালোচনা করুন। +- **[crytic.io](https://crytic.io/) ব্যবহার করুন।** Crytic GitHub-এর সাথে ইন্টিগ্রেট করে, প্রাইভেট Slither ডিটেক্টরে অ্যাক্সেস দেয়, এবং Echidna থেকে কাস্টম প্রপার্টি চেক চালায়। + +### Solidity {#solidity} + +- **0.4 এবং 0.6-এর চেয়ে Solidity 0.5-কে প্রাধান্য দিন।** আমাদের মতে, Solidity 0.5 আরও সুরক্ষিত এবং 0.4-এর তুলনায় এতে আরও ভালো বিল্ট-ইন প্র্যাকটিস রয়েছে। Solidity 0.6 প্রোডাকশনের জন্য অত্যন্ত অস্থিতিশীল প্রমাণিত হয়েছে এবং পরিপক্ক হওয়ার জন্য সময়ের প্রয়োজন। +- **কম্পাইল করার জন্য একটি স্থিতিশীল রিলিজ ব্যবহার করুন; সতর্কবার্তা পরীক্ষা করার জন্য সর্বশেষ রিলিজ ব্যবহার করুন।** সর্বশেষ কম্পাইলার সংস্করণে আপনার কোডে কোনো রিপোর্ট করা সমস্যা নেই তা পরীক্ষা করুন। তবে, Solidity-র একটি দ্রুত রিলিজ চক্র রয়েছে এবং কম্পাইলার বাগের একটি ইতিহাস রয়েছে, তাই আমরা ডিপ্লয়মেন্টের জন্য সর্বশেষ সংস্করণ সুপারিশ করি না (Slither-এর [solc সংস্করণ সুপারিশ](https://github.com/crytic/slither/wiki/Detector-Documentation#recommendation-33) দেখুন)। +- **ইনলাইন অ্যাসেম্বলি ব্যবহার করবেন না।** অ্যাসেম্বলির জন্য EVM দক্ষতার প্রয়োজন। যদি আপনি ইয়েলো পেপার _দক্ষতার সাথে আয়ত্ত_ না করে থাকেন তবে EVM কোড লিখবেন না। + +## ডিপ্লয়মেন্ট নির্দেশিকা {#deployment-guidelines} + +একবার কন্ট্র্যাক্টটি তৈরি এবং ডিপ্লয় করা হয়ে গেলে: + +- **আপনার কন্ট্র্যাক্টগুলি নিরীক্ষণ করুন।** লগগুলি দেখুন, এবং কন্ট্র্যাক্ট বা ওয়ালেট কম্প্রোমাইজ হলে প্রতিক্রিয়া জানাতে প্রস্তুত থাকুন। +- **[blockchain-security-contacts](https://github.com/crytic/blockchain-security-contacts)-এ আপনার যোগাযোগের তথ্য যোগ করুন।** এই তালিকাটি তৃতীয় পক্ষকে আপনার সাথে যোগাযোগ করতে সাহায্য করে যদি কোনো নিরাপত্তা ত্রুটি আবিষ্কৃত হয়। +- **বিশেষ সুবিধাপ্রাপ্ত ব্যবহারকারীদের ওয়ালেট সুরক্ষিত করুন।** আপনি যদি হার্ডওয়্যার ওয়ালেটে কি সংরক্ষণ করেন তবে আমাদের [সেরা অভ্যাসগুলি](https://blog.trailofbits.com/2018/11/27/10-rules-for-the-secure-use-of-cryptocurrency-hardware-wallets/) অনুসরণ করুন। +- **ঘটনার প্রতিক্রিয়ার জন্য একটি পরিকল্পনা রাখুন।** বিবেচনা করুন যে আপনার স্মার্ট কন্ট্র্যাক্টগুলি কম্প্রোমাইজ হতে পারে। এমনকি যদি আপনার কন্ট্র্যাক্টগুলি বাগ-মুক্ত হয়, একজন আক্রমণকারী কন্ট্র্যাক্টের মালিকের কি-এর নিয়ন্ত্রণ নিতে পারে। diff --git a/public/content/translations/bn/developers/tutorials/stealth-addr/index.md b/public/content/translations/bn/developers/tutorials/stealth-addr/index.md new file mode 100644 index 00000000000..6b5b613b6ae --- /dev/null +++ b/public/content/translations/bn/developers/tutorials/stealth-addr/index.md @@ -0,0 +1,443 @@ +--- +title: "স্টেলথ অ্যাড্রেস ব্যবহার করা" +description: "স্টেলথ অ্যাড্রেস ব্যবহারকারীদের বেনামে অ্যাসেট ট্রান্সফার করতে দেয়। এই আর্টিকেলটি পড়ার পর, আপনি সক্ষম হবেন: স্টেলথ অ্যাড্রেস কী এবং কীভাবে এটি কাজ করে তা ব্যাখ্যা করতে, কীভাবে এমনভাবে স্টেলথ অ্যাড্রেস ব্যবহার করতে হয় যা গোপনীয়তা রক্ষা করে তা বুঝতে এবং স্টেলথ অ্যাড্রেস ব্যবহার করে এমন একটি ওয়েব-ভিত্তিক অ্যাপ্লিকেশন লিখতে।" +author: Ori Pomerantz +tags: + [ + "স্টেলথ অ্যাড্রেস", + "গোপনীয়তা", + "ক্রিপ্টোগ্রাফি", + "rust", + "wasm" + ] +skill: intermediate +published: 2025-11-30 +lang: bn +sidebarDepth: 3 +--- + +আপনি বিল। আমরা যে কারণগুলিতে যাব না, সেগুলির জন্য আপনি "বিশ্বের রানীর জন্য অ্যালিস" প্রচারাভিযানে অনুদান দিতে চান এবং অ্যালিসকে জানাতে চান যে আপনি অনুদান দিয়েছেন যাতে সে জিতলে আপনাকে পুরস্কৃত করবে। দুর্ভাগ্যবশত, তার জয় নিশ্চিত নয়। একটি প্রতিযোগী প্রচারাভিযান আছে, "সৌরজগতের সম্রাজ্ঞীর জন্য ক্যারল"। যদি ক্যারল জিতে যায়, এবং সে জানতে পারে যে আপনি অ্যালিসকে অনুদান দিয়েছেন, তাহলে আপনি সমস্যায় পড়বেন। সুতরাং আপনি শুধু আপনার অ্যাকাউন্ট থেকে অ্যালিসের অ্যাকাউন্টে 200 ETH ট্রান্সফার করতে পারবেন না। + +[ERC-5564](https://eips.ethereum.org/EIPS/eip-5564) এর কাছে সমাধান আছে। এই ERC বেনামী ট্রান্সফারের জন্য কীভাবে [স্টেলথ অ্যাড্রেস](https://nerolation.github.io/stealth-utils) ব্যবহার করতে হয় তা ব্যাখ্যা করে। + +**সতর্কতা**: স্টেলথ অ্যাড্রেসের পিছনের ক্রিপ্টোগ্রাফি, যতদূর আমরা জানি, নির্ভরযোগ্য। যাইহোক, সম্ভাব্য সাইড-চ্যানেল অ্যাটাকের ঝুঁকি আছে। [নিচে](#go-wrong), আপনি এই ঝুঁকি কমাতে কী করতে পারেন তা দেখতে পাবেন। + +## স্টেলথ অ্যাড্রেস কীভাবে কাজ করে {#how} + +এই আর্টিকেলটি দুটি উপায়ে স্টেলথ অ্যাড্রেস ব্যাখ্যা করার চেষ্টা করবে। প্রথমটি হলো [কীভাবে সেগুলি ব্যবহার করতে হয়](#how-use)। আর্টিকেলের বাকি অংশ বোঝার জন্য এই অংশটিই যথেষ্ট। তারপরে, [এর পেছনের গণিতের একটি ব্যাখ্যা](#how-math) রয়েছে। আপনি যদি ক্রিপ্টোগ্রাফিতে আগ্রহী হন, তাহলে এই অংশটিও পড়ুন। + +### সরল সংস্করণ (কীভাবে স্টেলথ অ্যাড্রেস ব্যবহার করবেন) {#how-use} + +অ্যালিস দুটি প্রাইভেট কী তৈরি করে এবং সংশ্লিষ্ট পাবলিক কীগুলি প্রকাশ করে (যা একটি একক ডাবল-লেংথ মেটা-অ্যাড্রেসে একত্রিত করা যেতে পারে)। বিলও একটি প্রাইভেট কী তৈরি করে এবং সংশ্লিষ্ট পাবলিক কী প্রকাশ করে। + +এক পক্ষের পাবলিক কী এবং অন্য পক্ষের প্রাইভেট কী ব্যবহার করে, আপনি একটি শেয়ার্ড সিক্রেট পেতে পারেন যা শুধুমাত্র অ্যালিস এবং বিল জানে (এটি শুধুমাত্র পাবলিক কী থেকে পাওয়া যায় না)। এই শেয়ার্ড সিক্রেট ব্যবহার করে, বিল স্টেলথ অ্যাড্রেসটি পায় এবং এতে অ্যাসেট পাঠাতে পারে। + +অ্যালিসও শেয়ার্ড সিক্রেট থেকে অ্যাড্রেসটি পায়, কিন্তু যেহেতু সে তার প্রকাশিত পাবলিক কী-এর প্রাইভেট কীগুলি জানে, তাই সে সেই প্রাইভেট কীও পেতে পারে যা তাকে সেই অ্যাড্রেস থেকে উইথড্র করতে দেয়। + +### গণিত (কেন স্টেলথ অ্যাড্রেস এইভাবে কাজ করে) {#how-math} + +স্ট্যান্ডার্ড স্টেলথ অ্যাড্রেসগুলি [ইলিপটিক-কার্ভ ক্রিপ্টোগ্রাফি (ECC)](https://blog.cloudflare.com/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/#elliptic-curves-building-blocks-of-a-better-trapdoor) ব্যবহার করে কম কী বিট দিয়ে উন্নত পারফরম্যান্স পেতে, এবং একই স্তরের নিরাপত্তা বজায় রাখে। কিন্তু বেশিরভাগ ক্ষেত্রে আমরা এটিকে উপেক্ষা করতে পারি এবং ভান করতে পারি যে আমরা সাধারণ পাটিগণিত ব্যবহার করছি। + +একটি সংখ্যা আছে যা সবাই জানে, _G_। আপনি _G_ দিয়ে গুণ করতে পারেন। কিন্তু ECC-এর প্রকৃতির কারণে, _G_ দ্বারা ভাগ করা কার্যত অসম্ভব। ইথেরিয়ামে সাধারণত যেভাবে পাবলিক কী ক্রিপ্টোগ্রাফি কাজ করে তা হল, আপনি একটি প্রাইভেট কী, _Ppriv_, ব্যবহার করে ট্রানজ্যাকশন সাইন করতে পারেন যা পরে একটি পাবলিক কী, _Ppub = GPpriv_ দ্বারা ভেরিফাই করা হয়। + +অ্যালিস দুটি প্রাইভেট কী তৈরি করে, _Kpriv_ এবং _Vpriv_। _Kpriv_ স্টেলথ অ্যাড্রেস থেকে অর্থ ব্যয় করতে ব্যবহৃত হবে এবং _Vpriv_ অ্যালিসের মালিকানাধীন অ্যাড্রেসগুলি দেখতে ব্যবহৃত হবে। অ্যালিস তারপর পাবলিক কীগুলি প্রকাশ করে: _Kpub = GKpriv_ এবং _Vpub = GVpriv_ + +বিল একটি তৃতীয় প্রাইভেট কী, _Rpriv_ তৈরি করে এবং _Rpub = GRpriv_ একটি কেন্দ্রীয় রেজিস্ট্রিতে প্রকাশ করে (বিল এটি অ্যালিসকেও পাঠাতে পারত, কিন্তু আমরা ধরে নিচ্ছি ক্যারল শুনছে)। + +বিল _RprivVpub = GRprivVpriv_ গণনা করে, যা সে আশা করে অ্যালিসও জানবে (নিচে ব্যাখ্যা করা হয়েছে)। এই মানটিকে বলা হয় _S_, শেয়ার্ড সিক্রেট। এটি বিলকে একটি পাবলিক কী দেয়, _Ppub = Kpub+G\*হ্যাস(S)_। এই পাবলিক কী থেকে, সে একটি অ্যাড্রেস গণনা করতে পারে এবং সে যা রিসোর্স চায় তা এতে পাঠাতে পারে। ভবিষ্যতে, যদি অ্যালিস জিতে, বিল তাকে _Rpriv_ বলতে পারে প্রমাণ করার জন্য যে রিসোর্সগুলি তার কাছ থেকে এসেছে। + +অ্যালিস _RpubVpriv = GRprivVpriv_ গণনা করে। এটি তাকে একই শেয়ার্ড সিক্রেট, _S_ দেয়। যেহেতু সে প্রাইভেট কী, _Kpriv_ জানে, সে _Ppriv = Kpriv+হ্যাস(S)_ গণনা করতে পারে। এই কী তাকে _Ppub = GPpriv = GKpriv+G\*হ্যাস(S) = Kpub+G\*হ্যাস(S)_ থেকে প্রাপ্ত অ্যাড্রেসে থাকা অ্যাসেট অ্যাক্সেস করতে দেয়। + +আমাদের একটি পৃথক ভিউয়িং কী আছে যা অ্যালিসকে ডেভের ওয়ার্ল্ড ডমিনেশন ক্যাম্পেইন সার্ভিসেস-কে সাবকন্ট্রাক্ট দেওয়ার অনুমতি দেয়। অ্যালিস ডেভকে পাবলিক অ্যাড্রেস জানাতে এবং আরও টাকা পাওয়া গেলে তাকে জানাতে ইচ্ছুক, কিন্তু সে চায় না যে ডেভ তার প্রচারণার টাকা খরচ করুক। + +যেহেতু দেখা এবং খরচ করার জন্য আলাদা কী ব্যবহার করা হয়, অ্যালিস ডেভকে _Vpriv_ দিতে পারে। তারপর ডেভ _S = RpubVpriv = GRprivVpriv_ গণনা করতে পারে এবং সেই উপায়ে পাবলিক কীগুলি পেতে পারে (_Ppub = Kpub+G\*হ্যাস(S)_)। কিন্তু _Kpriv_ ছাড়া ডেভ প্রাইভেট কী পেতে পারে না। + +সংক্ষেপে, এগুলি হলো বিভিন্ন অংশগ্রহণকারীদের দ্বারা জানা মানগুলি। + +| অ্যালিস | প্রকাশিত | বিল | ডেভ | | +| ------------------------------------------------------------------------- | ----------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------- | +| G | G | G | G | | +| _Kpriv_ | - | - | - | | +| _Vpriv_ | - | - | _Vpriv_ | | +| _Kpub = GKpriv_ | _Kpub_ | _Kpub_ | _Kpub_ | | +| _Vpub = GVpriv_ | _Vpub_ | _Vpub_ | _Vpub_ | | +| - | - | _Rpriv_ | - | | +| _Rpub_ | _Rpub_ | _Rpub = GRpriv_ | _Rpub_ | | +| _S = RpubVpriv = GRprivVpriv_ | - | _S = RprivVpub = GRprivVpriv_ | _S = _RpubVpriv_ = GRprivVpriv_ | | +| _Ppub = Kpub+G\*হ্যাস(S)_ | - | _Ppub = Kpub+G\*হ্যাস(S)_ | _Ppub = Kpub+G\*হ্যাস(S)_ | | +| _অ্যাড্রেস=f(Ppub)_ | - | _অ্যাড্রেস=f(Ppub)_ | _অ্যাড্রেস=f(Ppub)_ | _অ্যাড্রেস=f(Ppub)_ | +| _Ppriv = Kpriv+হ্যাস(S)_ | - | - | - | | + +## যখন স্টেলথ অ্যাড্রেস ভুল হয় {#go-wrong} + +_ব্লকচেইনে কোনো গোপনীয়তা নেই_। যদিও স্টেলথ অ্যাড্রেস আপনাকে গোপনীয়তা দিতে পারে, তবে সেই গোপনীয়তা ট্রাফিক বিশ্লেষণের জন্য ঝুঁকিপূর্ণ। একটি তুচ্ছ উদাহরণ হিসেবে, কল্পনা করুন যে বিল একটি অ্যাড্রেসে ফান্ড করে এবং অবিলম্বে একটি _Rpub_ মান প্রকাশ করার জন্য একটি ট্রানজ্যাকশন পাঠায়। অ্যালিসের _Vpriv_ ছাড়া, আমরা নিশ্চিত হতে পারি না যে এটি একটি স্টেলথ অ্যাড্রেস, কিন্তু এটিই বাজি ধরার উপায়। তারপরে, আমরা আরেকটি ট্রানজ্যাকশন দেখি যা সেই অ্যাড্রেস থেকে সমস্ত ETH অ্যালিসের প্রচারণার ফান্ড অ্যাড্রেসে ট্রান্সফার করে। আমরা হয়তো এটি প্রমাণ করতে পারব না, তবে সম্ভবত বিল সবেমাত্র অ্যালিসের প্রচারণার জন্য অনুদান দিয়েছে। ক্যারল অবশ্যই তাই মনে করবে। + +বিলের জন্য _Rpub_ এর প্রকাশনাটি স্টেলথ অ্যাড্রেসের ফান্ডিং থেকে আলাদা করা সহজ (সেগুলি বিভিন্ন সময়ে, বিভিন্ন অ্যাড্রেস থেকে করা)। তবে, তা যথেষ্ট নয়। ক্যারল যে প্যাটার্নটি খোঁজে তা হল বিল একটি অ্যাড্রেসে ফান্ড করে, এবং তারপর অ্যালিসের প্রচারণার ফান্ড তা থেকে উইথড্র করে। + +একটি সমাধান হল অ্যালিসের প্রচারণার জন্য সরাসরি টাকা উইথড্র না করে, বরং এটি কোনো তৃতীয় পক্ষকে অর্থ প্রদানের জন্য ব্যবহার করা। যদি অ্যালিসের প্রচারণা ডেভের ওয়ার্ল্ড ডমিনেশন ক্যাম্পেইন সার্ভিসেস-কে 10 ETH পাঠায়, ক্যারল কেবল জানবে যে বিল ডেভের গ্রাহকদের মধ্যে একজনকে অনুদান দিয়েছে। যদি ডেভের যথেষ্ট গ্রাহক থাকে, ক্যারল জানতে পারবে না যে বিল অ্যালিসকে অনুদান দিয়েছে যে তার সাথে প্রতিযোগিতা করে, নাকি অ্যাডাম, অ্যালবার্ট, বা অ্যাবিগেলকে দিয়েছে যাদের নিয়ে ক্যারল মাথা ঘামায় না। অ্যালিস পেমেন্টের সাথে একটি হ্যাস করা মান অন্তর্ভুক্ত করতে পারে, এবং তারপর ডেভকে প্রিইমেজ সরবরাহ করতে পারে, এটি প্রমাণ করার জন্য যে এটি তার অনুদান ছিল। বিকল্পভাবে, উপরে উল্লিখিত হিসাবে, যদি অ্যালিস ডেভকে তার _Vpriv_ দেয়, সে ইতিমধ্যেই জানে পেমেন্টটি কার কাছ থেকে এসেছে। + +এই সমাধানের প্রধান সমস্যা হল যে এটি অ্যালিসকে গোপনীয়তা সম্পর্কে যত্নবান হতে বাধ্য করে যখন সেই গোপনীয়তা বিলের উপকারে আসে। অ্যালিস তার খ্যাতি বজায় রাখতে চাইতে পারে যাতে বিলের বন্ধু ববও তাকে অনুদান দেয়। কিন্তু এটাও সম্ভব যে সে বিলকে প্রকাশ করতে আপত্তি করবে না, কারণ তাহলে সে ভয় পাবে যে ক্যারল জিতলে কী হবে। বিল হয়তো শেষ পর্যন্ত অ্যালিসকে আরও বেশি সমর্থন দেবে। + +### একাধিক স্টেলথ লেয়ার ব্যবহার করা {#multi-layer} + +বিলের গোপনীয়তা রক্ষার জন্য অ্যালিসের উপর নির্ভর না করে, বিল নিজেই এটি করতে পারে। সে কাল্পনিক ব্যক্তি, বব এবং বেলার জন্য একাধিক মেটা-অ্যাড্রেস তৈরি করতে পারে। বিল তারপর ববকে ETH পাঠায়, এবং "বব" (যে আসলে বিল) তা বেলাকে পাঠায়। "বেলা" (সেও বিল) তা অ্যালিসকে পাঠায়। + +ক্যারল এখনও ট্র্যাফিক বিশ্লেষণ করতে পারে এবং বিল-থেকে-বব-থেকে-বেলা-থেকে-অ্যালিস পাইপলাইন দেখতে পারে। যাইহোক, যদি "বব" এবং "বেলা" অন্যান্য উদ্দেশ্যেও ETH ব্যবহার করে, তাহলে এটা মনে হবে না যে বিল অ্যালিসকে কিছু ট্রান্সফার করেছে, এমনকি যদি অ্যালিস অবিলম্বে স্টেলথ অ্যাড্রেস থেকে তার পরিচিত ক্যাম্পেইন অ্যাড্রেসে উইথড্র করে। + +## একটি স্টেলথ-অ্যাড্রেস অ্যাপ্লিকেশন লেখা {#write-app} + +এই আর্টিকেলটি একটি স্টেলথ-অ্যাড্রেস অ্যাপ্লিকেশন ব্যাখ্যা করে যা [GitHub-এ উপলব্ধ](https://github.com/qbzzt/251022-stealth-addresses.git)। + +### টুলস {#tools} + +এখানে [একটি টাইপস্ক্রিপ্ট স্টেলথ অ্যাড্রেস লাইব্রেরি](https://github.com/ScopeLift/stealth-address-sdk) রয়েছে যা আমরা ব্যবহার করতে পারি। যাইহোক, ক্রিপ্টোগ্রাফিক অপারেশনগুলি CPU-ইনটেনসিভ হতে পারে। আমি সেগুলিকে [Rust](https://rust-lang.org/)-এর মতো একটি কম্পাইল করা ভাষায় ইমপ্লিমেন্ট করতে পছন্দ করি এবং ব্রাউজারে কোড চালানোর জন্য [WASM](https://webassembly.org/) ব্যবহার করি। + +আমরা [Vite](https://vite.dev/) এবং [React](https://react.dev/) ব্যবহার করতে যাচ্ছি। এগুলি ইন্ডাস্ট্রি-স্ট্যান্ডার্ড টুলস; আপনি যদি এগুলির সাথে পরিচিত না হন, তবে আপনি [এই টিউটোরিয়ালটি](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) ব্যবহার করতে পারেন। Vite ব্যবহার করতে, আমাদের নোড প্রয়োজন। + +### স্টেলথ অ্যাড্রেস বাস্তবে দেখুন {#in-action} + +1. প্রয়োজনীয় টুলস ইনস্টল করুন: [Rust](https://rust-lang.org/tools/install/) এবং [নোড](https://nodejs.org/en/download)। + +2. GitHub রিপোজিটরিটি ক্লোন করুন। + + ```sh + git clone https://github.com/qbzzt/251022-stealth-addresses.git + cd 251022-stealth-addresses + ``` + +3. পূর্বশর্তগুলি ইনস্টল করুন এবং Rust কোড কম্পাইল করুন। + + ```sh + cd src/rust-wasm + rustup target add wasm32-unknown-unknown + cargo install wasm-pack + wasm-pack build --target web + ``` + +4. ওয়েব সার্ভার শুরু করুন। + + ```sh + cd ../.. + npm install + npm run dev + ``` + +5. [অ্যাপ্লিকেশনটিতে](http://localhost:5173/) ব্রাউজ করুন। এই অ্যাপ্লিকেশন পেজটিতে দুটি ফ্রেম রয়েছে: একটি অ্যালিসের ইউজার ইন্টারফেসের জন্য এবং অন্যটি বিলের জন্য। দুটি ফ্রেম যোগাযোগ করে না; তারা শুধুমাত্র সুবিধার জন্য একই পেজে রয়েছে। + +6. অ্যালিস হিসাবে, **Generate a Stealth Meta-Address** এ ক্লিক করুন। এটি নতুন স্টেলথ অ্যাড্রেস এবং সংশ্লিষ্ট প্রাইভেট কীগুলি প্রদর্শন করবে। স্টেলথ মেটা-অ্যাড্রেসটি ক্লিপবোর্ডে কপি করুন। + +7. বিল হিসাবে, নতুন স্টেলথ মেটা-অ্যাড্রেসটি পেস্ট করুন এবং **Generate an address** এ ক্লিক করুন। এটি আপনাকে অ্যালিসের জন্য ফান্ড করার অ্যাড্রেস দেয়। + +8. অ্যাড্রেস এবং বিলের পাবলিক কী কপি করুন এবং সেগুলিকে অ্যালিসের ইউজার ইন্টারফেসের "Private key for address generated by Bill" অংশে পেস্ট করুন। একবার সেই ফিল্ডগুলি পূরণ হয়ে গেলে, আপনি সেই অ্যাড্রেসে অ্যাসেট অ্যাক্সেস করার জন্য প্রাইভেট কী দেখতে পাবেন। + +9. প্রাইভেট কী অ্যাড্রেসের সাথে সঙ্গতিপূর্ণ কিনা তা নিশ্চিত করতে আপনি [একটি অনলাইন ক্যালকুলেটর](https://iancoleman.net/ethereum-private-key-to-address/) ব্যবহার করতে পারেন। + +### প্রোগ্রামটি কীভাবে কাজ করে {#how-the-program-works} + +#### WASM কম্পোনেন্ট {#wasm} + +WASM-এ কম্পাইল হওয়া সোর্স কোড [Rust](https://rust-lang.org/) এ লেখা। আপনি এটি [`src/rust_wasm/src/lib.rs`](https://github.com/qbzzt/251022-stealth-addresses/blob/main/src/rust-wasm/src/lib.rs) এ দেখতে পারেন। এই কোডটি মূলত জাভাস্ক্রিপ্ট কোড এবং [`eth-stealth-addresses` লাইব্রেরি](https://github.com/kassandraoftroy/eth-stealth-addresses) এর মধ্যে একটি ইন্টারফেস। + +**`Cargo.toml`** + +Rust-এ [`Cargo.toml`](https://doc.rust-lang.org/cargo/reference/manifest.html) জাভাস্ক্রিপ্টে [`package.json`](https://docs.npmjs.com/cli/v9/configuring-npm/package-json) এর অনুরূপ। এতে প্যাকেজ তথ্য, ডিপেন্ডেন্সি ঘোষণা ইত্যাদি থাকে। + +```toml +[package] +name = "rust-wasm" +version = "0.1.0" +edition = "2024" + +[dependencies] +eth-stealth-addresses = "0.1.0" +hex = "0.4.3" +wasm-bindgen = "0.2.104" +getrandom = { version = "0.2", features = ["js"] } +``` + +[`getrandom`](https://docs.rs/getrandom/latest/getrandom/) প্যাকেজটিকে র‍্যান্ডম মান তৈরি করতে হবে। এটি শুধুমাত্র অ্যালগরিদমিক উপায়ে করা যায় না; এর জন্য এনট্রপির উৎস হিসাবে একটি শারীরিক প্রক্রিয়ায় অ্যাক্সেস প্রয়োজন। এই সংজ্ঞাটি নির্দিষ্ট করে যে আমরা যে ব্রাউজারে চালাচ্ছি তাকে জিজ্ঞাসা করে সেই এনট্রপি পাব। + +```toml +console_error_panic_hook = "0.1.7" +``` + +[এই লাইব্রেরিটি](https://docs.rs/console_error_panic_hook/latest/console_error_panic_hook/) আমাদের আরও অর্থপূর্ণ ত্রুটির বার্তা দেয় যখন WASM কোড প্যানিক করে এবং চলতে পারে না। + +```toml +[lib] +crate-type = ["cdylib", "rlib"] +``` + +WASM কোড তৈরি করার জন্য প্রয়োজনীয় আউটপুট টাইপ। + +**`lib.rs`** + +এটি আসল Rust কোড। + +```rust +use wasm_bindgen::prelude::*; +``` + +Rust থেকে একটি WASM প্যাকেজ তৈরি করার জন্য সংজ্ঞা। এগুলি [এখানে](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/index.html) ডকুমেন্ট করা আছে। + +```rust +use eth_stealth_addresses::{ + generate_stealth_meta_address, + generate_stealth_address, + compute_stealth_key +}; +``` + +[`eth-stealth-addresses` লাইব্রেরি](https://github.com/kassandraoftroy/eth-stealth-addresses) থেকে আমাদের প্রয়োজনীয় ফাংশন। + +```rust +use hex::{decode,encode}; +``` + +Rust সাধারণত মানগুলির জন্য বাইট [অ্যারে](https://doc.rust-lang.org/std/primitive.array.html) (`[u8; ]`) ব্যবহার করে। কিন্তু জাভাস্ক্রিপ্টে, আমরা সাধারণত হেক্সাডেসিমেল স্ট্রিং ব্যবহার করি। [`hex` লাইব্রেরি](https://docs.rs/hex/latest/hex/) আমাদের জন্য একটি রিপ্রেজেন্টেশন থেকে অন্যটিতে অনুবাদ করে। + +```rust +#[wasm_bindgen] +``` + +জাভাস্ক্রিপ্ট থেকে এই ফাংশনটি কল করতে সক্ষম হওয়ার জন্য WASM বাইন্ডিং তৈরি করুন। + +```rust +pub fn wasm_generate_stealth_meta_address() -> String { +``` + +একাধিক ফিল্ড সহ একটি অবজেক্ট ফেরত দেওয়ার সবচেয়ে সহজ উপায় হল একটি JSON স্ট্রিং ফেরত দেওয়া। + +```rust + let (address, spend_private_key, view_private_key) = + generate_stealth_meta_address(); +``` + +[`generate_stealth_meta_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_meta_address.html) তিনটি ফিল্ড প্রদান করে: + +- মেটা-অ্যাড্রেস (_Kpub_ এবং _Vpub_) +- ভিউয়িং প্রাইভেট কী (_Vpriv_) +- স্পেন্ডিং প্রাইভেট কী (_Kpriv_) + +[টাপল](https://doc.rust-lang.org/std/primitive.tuple.html) সিনট্যাক্স আমাদের সেই মানগুলিকে আবার আলাদা করতে দেয়। + +```rust + format!("{\"address\":\"{}\",\"view_private_key\":\"{}\",\"spend_private_key\":\"{}\"}", + encode(address), + encode(view_private_key), + encode(spend_private_key) + ) +} +``` + +JSON-এনকোডেড স্ট্রিং তৈরি করতে [`format!`](https://doc.rust-lang.org/std/fmt/index.html) ম্যাক্রো ব্যবহার করুন। অ্যারেগুলিকে হেক্স স্ট্রিং-এ পরিবর্তন করতে [`hex::encode`](https://docs.rs/hex/latest/hex/fn.encode.html) ব্যবহার করুন। + +```rust +fn str_to_array(s: &str) -> Option<[u8; N]> { +``` + +এই ফাংশনটি একটি হেক্স স্ট্রিংকে (জাভাস্ক্রিপ্ট দ্বারা সরবরাহ করা) একটি বাইট অ্যারেতে পরিণত করে। আমরা এটি জাভাস্ক্রিপ্ট কোড দ্বারা সরবরাহ করা মানগুলি পার্স করতে ব্যবহার করি। ফাংশনটি জটিল কারণ Rust যেভাবে অ্যারে এবং ভেক্টর পরিচালনা করে। + +`` এক্সপ্রেশনটিকে [জেনেরিক](https://doc.rust-lang.org/book/ch10-01-syntax.html) বলা হয়। `N` একটি প্যারামিটার যা প্রত্যাবর্তিত অ্যারের দৈর্ঘ্য নিয়ন্ত্রণ করে। ফাংশনটি আসলে `str_to_array::` নামে পরিচিত, যেখানে `n` হল অ্যারের দৈর্ঘ্য। + +রিটার্ন ভ্যালু হল `Option<[u8; N]>`, যার মানে হল রিটার্ন করা অ্যারেটি [অপশনাল](https://doc.rust-lang.org/std/option/)। এটি Rust-এ এমন ফাংশনগুলির জন্য একটি সাধারণ প্যাটার্ন যা ব্যর্থ হতে পারে। + +উদাহরণস্বরূপ, যদি আমরা `str_to_array::10("bad060a7")` কল করি, ফাংশনটি একটি দশ-মানের অ্যারে রিটার্ন করার কথা, কিন্তু ইনপুটটি মাত্র চার বাইট। ফাংশনটি ব্যর্থ হতে হবে, এবং এটি `None` রিটার্ন করে তা করে। `str_to_array::4("bad060a7")`-এর জন্য রিটার্ন মান হবে `Some<[0xba, 0xd0, 0x60, 0xa7]>`। + +```rust + // ডিকোড Result, _> রিটার্ন করে + let vec = decode(s).ok()?; +``` + +[`hex::decode`](https://docs.rs/hex/latest/hex/fn.decode.html) ফাংশনটি একটি `Result, FromHexError>` রিটার্ন করে। [`Result`](https://doc.rust-lang.org/std/result/) টাইপে হয় একটি সফল ফলাফল (`Ok(value)`) বা একটি ত্রুটি (`Err(error)`) থাকতে পারে। + +`.ok()` মেথডটি `Result`-কে একটি `Option`-এ পরিণত করে, যার মান সফল হলে `Ok()` মান অথবা ব্যর্থ হলে `None` হয়। অবশেষে, [প্রশ্নবোধক চিহ্ন অপারেটর](https://doc.rust-lang.org/std/option/#the-question-mark-operator-) বর্তমান ফাংশনগুলি বাতিল করে এবং `Option` খালি থাকলে `None` রিটার্ন করে। অন্যথায়, এটি মানটি আনর্যাপ করে এবং সেটি রিটার্ন করে (এই ক্ষেত্রে, `vec`-কে একটি মান নির্ধারণ করতে)। + +এটি ত্রুটিগুলি পরিচালনা করার জন্য একটি অদ্ভুতভাবে জটিল পদ্ধতি বলে মনে হতে পারে, কিন্তু `Result` এবং `Option` নিশ্চিত করে যে সমস্ত ত্রুটি কোনো না কোনোভাবে হ্যান্ডেল করা হয়। + +```rust + if vec.len() != N { return None; } +``` + +যদি বাইট সংখ্যা ভুল হয়, তবে এটি একটি ব্যর্থতা, এবং আমরা `None` রিটার্ন করি। + +```rust + // try_into vec কনজিউম করে এবং [u8; N] তৈরি করার চেষ্টা করে + let array: [u8; N] = vec.try_into().ok()?; +``` + +Rust-এ দুটি অ্যারে টাইপ রয়েছে। [অ্যারেগুলির](https://doc.rust-lang.org/std/primitive.array.html) একটি নির্দিষ্ট আকার থাকে। [ভেক্টরগুলি](https://doc.rust-lang.org/std/vec/index.html) বাড়তে এবং সঙ্কুচিত হতে পারে। `hex::decode` একটি ভেক্টর রিটার্ন করে, কিন্তু `eth_stealth_addresses` লাইব্রেরি অ্যারে গ্রহণ করতে চায়। [`.try_into()`](https://doc.rust-lang.org/std/convert/trait.TryInto.html#required-methods) একটি মানকে অন্য একটি টাইপে রূপান্তর করে, উদাহরণস্বরূপ, একটি ভেক্টরকে একটি অ্যারেতে। + +```rust + Some(array) +} +``` + +Rust-এ ফাংশনের শেষে একটি মান রিটার্ন করার সময় [`return`](https://doc.rust-lang.org/std/keyword.return.html) কীওয়ার্ড ব্যবহার করার প্রয়োজন হয় না। + +```rust +#[wasm_bindgen] +pub fn wasm_generate_stealth_address(stealth_address: &str) -> Option { +``` + +এই ফাংশনটি একটি পাবলিক মেটা-অ্যাড্রেস গ্রহণ করে, যার মধ্যে _Vpub_ এবং _Kpub_ উভয়ই রয়েছে। এটি স্টেলথ অ্যাড্রেস, প্রকাশ করার জন্য পাবলিক কী (_Rpub_), এবং একটি এক-বাইট স্ক্যান মান রিটার্ন করে যা কোন প্রকাশিত অ্যাড্রেসগুলি অ্যালিসের হতে পারে তা সনাক্তকরণকে দ্রুত করে। + +স্ক্যান মানটি শেয়ার্ড সিক্রেটের অংশ (_S = GRprivVpriv_) এই মানটি অ্যালিসের জন্য উপলব্ধ, এবং এটি পরীক্ষা করা _f(Kpub+G\*হ্যাস(S))_ প্রকাশিত অ্যাড্রেসের সমান কিনা তা পরীক্ষা করার চেয়ে অনেক দ্রুত। + +```rust + let (address, r_pub, scan) = + generate_stealth_address(&str_to_array::<66>(stealth_address)?); +``` + +আমরা লাইব্রেরির [`generate_stealth_address`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.generate_stealth_address.html) ব্যবহার করি। + +```rust + format!("{\"address\":\"{}\",\"rPub\":\"{}\",\"scan\":\"{}\"}", + encode(address), + encode(r_pub), + encode(&[scan]) + ).into() +} +``` + +JSON-এনকোডেড আউটপুট স্ট্রিং প্রস্তুত করুন। + +```rust +#[wasm_bindgen] +pub fn wasm_compute_stealth_key( + address: &str, + bill_pub_key: &str, + view_private_key: &str, + spend_private_key: &str +) -> Option { + . + . + . +} +``` + +এই ফাংশনটি লাইব্রেরির [`compute_stealth_key`](https://docs.rs/eth-stealth-addresses/latest/eth_stealth_addresses/fn.compute_stealth_key.html) ব্যবহার করে অ্যাড্রেস থেকে উইথড্র করার জন্য প্রাইভেট কী (_Rpriv_) গণনা করে। এই গণনার জন্য এই মানগুলি প্রয়োজন: + +- অ্যাড্রেস (_অ্যাড্রেস=f(Ppub)_) +- বিল দ্বারা তৈরি করা পাবলিক কী (_Rpub_) +- ভিউ প্রাইভেট কী (_Vpriv_) +- স্পেন্ড প্রাইভেট কী (_Kpriv_) + +```rust +#[wasm_bindgen(start)] +``` + +[`#[wasm_bindgen(start)]`](https://wasm-bindgen.github.io/wasm-bindgen/reference/attributes/on-rust-exports/start.html) নির্দিষ্ট করে যে ফাংশনটি WASM কোড ইনিশিয়ালাইজ করা হলে এক্সিকিউট করা হয়। + +```rust +pub fn main() { + console_error_panic_hook::set_once(); +} +``` + +এই কোডটি নির্দিষ্ট করে যে প্যানিক আউটপুট জাভাস্ক্রিপ্ট কনসোলে পাঠানো হবে। এটি বাস্তবে দেখতে, অ্যাপ্লিকেশনটি ব্যবহার করুন এবং বিলকে একটি অবৈধ মেটা-অ্যাড্রেস দিন (শুধু একটি হেক্সাডেসিমেল ডিজিট পরিবর্তন করুন)। আপনি জাভাস্ক্রিপ্ট কনসোলে এই ত্রুটিটি দেখতে পাবেন: + +``` +rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/subtle-2.6.1/src/lib.rs:701:9: +assertion `left == right` failed + left: 0 + right: 1 +``` + +এরপরে একটি স্ট্যাক ট্রেস থাকে। তারপর বিলকে বৈধ মেটা-অ্যাড্রেস দিন, এবং অ্যালিসকে একটি অবৈধ অ্যাড্রেস বা একটি অবৈধ পাবলিক কী দিন। আপনি এই ত্রুটি দেখতে পাবেন: + +``` +rust_wasm.js:236 panicked at /home/ori/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/eth-stealth-addresses-0.1.0/src/lib.rs:78:9: +keys do not generate stealth address +``` + +আবার, এরপরে একটি স্ট্যাক ট্রেস থাকে। + +#### ইউজার ইন্টারফেস {#ui} + +ইউজার ইন্টারফেসটি [React](https://react.dev/) ব্যবহার করে লেখা এবং [Vite](https://vite.dev/) দ্বারা পরিবেশন করা হয়। আপনি [এই টিউটোরিয়ালটি](/developers/tutorials/creating-a-wagmi-ui-for-your-contract/) ব্যবহার করে সেগুলি সম্পর্কে জানতে পারেন। এখানে [WAGMI](https://wagmi.sh/) এর কোনো প্রয়োজন নেই কারণ আমরা সরাসরি ব্লকচেইন বা ওয়ালেটের সাথে ইন্টারঅ্যাক্ট করি না। + +ইউজার ইন্টারফেসের একমাত্র অ-স্বাভাবিক অংশ হল WASM কানেক্টিভিটি। এটি কীভাবে কাজ করে তা এখানে দেওয়া হলো। + +**`vite.config.js`** + +এই ফাইলটিতে [Vite কনফিগারেশন](https://vite.dev/config/) রয়েছে। + +```js +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import wasm from "vite-plugin-wasm"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react(), wasm()], +}) +``` + +আমাদের দুটি Vite প্লাগইন প্রয়োজন: [react](https://www.npmjs.com/package/@vitejs/plugin-react) এবং [wasm](https://github.com/Menci/vite-plugin-wasm#readme)। + +**`App.jsx`** + +এই ফাইলটি অ্যাপ্লিকেশনের প্রধান কম্পোনেন্ট। এটি একটি কন্টেইনার যা দুটি কম্পোনেন্ট অন্তর্ভুক্ত করে: `Alice` এবং `Bill`, যা ঐ ব্যবহারকারীদের জন্য ইউজার ইন্টারফেস। WASM-এর জন্য প্রাসঙ্গিক অংশটি হলো ইনিশিয়ালাইজেশন কোড। + +```jsx +import init from './rust-wasm/pkg/rust_wasm.js' +``` + +যখন আমরা [`wasm-pack`](https://rustwasm.github.io/docs/wasm-pack/) ব্যবহার করি, তখন এটি দুটি ফাইল তৈরি করে যা আমরা এখানে ব্যবহার করি: আসল কোড সহ একটি wasm ফাইল (এখানে, `src/rust-wasm/pkg/rust_wasm_bg.wasm`) এবং এটি ব্যবহার করার জন্য সংজ্ঞা সহ একটি জাভাস্ক্রিপ্ট ফাইল (এখানে, `src/rust-wasm/pkg/rust_wasm.js`)। সেই জাভাস্ক্রিপ্ট ফাইলের ডিফল্ট এক্সপোর্ট হল কোড যা WASM শুরু করার জন্য চালাতে হবে। + +```jsx +function App() { + . + . + . + useEffect(() => { + const loadWasm = async () => { + try { + await init(); + setWasmReady(true) + } catch (err) { + console.error('wasm লোড করতে ত্রুটি:', err) + alert("Wasm error: " + err) + } + } + + loadWasm() + }, [] + ) +``` + +[`useEffect` হুক](https://react.dev/reference/react/useEffect) আপনাকে একটি ফাংশন নির্দিষ্ট করতে দেয় যা স্টেট ভ্যারিয়েবল পরিবর্তন হলে এক্সিকিউট হয়। এখানে, স্টেট ভ্যারিয়েবলের তালিকা খালি (`[]`), তাই এই ফাংশনটি পেজ লোড হওয়ার সময় শুধুমাত্র একবার এক্সিকিউট হয়। + +ইফেক্ট ফাংশনটিকে অবিলম্বে রিটার্ন করতে হবে। অ্যাসিঙ্ক্রোনাস কোড ব্যবহার করার জন্য, যেমন WASM `init` (যা `.wasm` ফাইল লোড করতে হয় এবং তাই সময় নেয়), আমরা একটি অভ্যন্তরীণ [`async`](https://en.wikipedia.org/wiki/Async/await) ফাংশন সংজ্ঞায়িত করি এবং `await` ছাড়াই এটি চালাই। + +**`Bill.jsx`** + +এটি বিলের জন্য ইউজার ইন্টারফেস। এর একটিমাত্র অ্যাকশন আছে, যা হল অ্যালিসের দেওয়া স্টেলথ মেটা-অ্যাড্রেসের উপর ভিত্তি করে একটি অ্যাড্রেস তৈরি করা। + +```jsx +import { wasm_generate_stealth_address } from './rust-wasm/pkg/rust_wasm.js' +``` + +`wasm-pack` দ্বারা তৈরি জাভাস্ক্রিপ্ট কোডটি ডিফল্ট এক্সপোর্ট ছাড়াও, WASM কোডের প্রতিটি ফাংশনের জন্য একটি ফাংশন এক্সপোর্ট করে। + +```jsx +