কীভাবে ইথেরিয়ামের জন্য বিতরণ টোকেন-ভিত্তিক ভোটিং অ্যাপ্লিকেশন তৈরি করবেন

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

সমস্ত বিতরণ টোকেন-ভিত্তিক পুনর্মিলন অ্যাপ্লিকেশন এক নয়, তবে বেশিরভাগ একই ধরণের সম্মেলনগুলি অনুসরণ করে। কার্যপ্রবাহটি সাধারণত এটির মতো দেখায়:

  • একজন ভোটার একটি প্রস্তাব দেয়
  • তারপরে অন্যান্য উপাদানগুলি প্রস্তাবটির পক্ষে বা বিপক্ষে ভোট দিতে পারে
  • প্রস্তাবটি পূর্বনির্ধারিত দ্বারপ্রান্তে পৌঁছানোর সাথে সাথেই ভোটটি পাস বা ব্যর্থ হয়ে যায় এবং যথাযথ ব্যবস্থা নেওয়া হয়

সহজ মনে হচ্ছে, তাই না?

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

এটি মাথায় রেখে, আসুন আমরা কীভাবে ইথেরিয়ামের জন্য বিতরণ টোকেন-ভিত্তিক ভোটিং অ্যাপ তৈরি করতে পারি তা দেখুন at ধরা যাক আপনি দুটি চুক্তি তৈরি করার পরিকল্পনা করেছেন যা একে অপরের সাথে যোগাযোগ করে:

  • একটি টোকেন চুক্তি যাতে অ্যাকাউন্টের ঠিকানা এবং তাদের ব্যালেন্সগুলির একটি এসাইনমেন্ট থাকে
  • প্রশাসনের চুক্তি যা ভোটদান ব্যবস্থা পরিচালনা করে

এই উদাহরণে, উপাদানগুলি পরামর্শ দিয়ে তাদের ক্রেডিটে ভোট দেয়। আপনার টোকেন ভারসাম্য আপনাকে প্রদত্ত প্রস্তাবের জন্য কত ভোট দিতে পারে তা নির্দেশ করে।

একজন ভোটার একটি প্রস্তাব দেয়

আমাদের প্রথমে যে কাজটি করা দরকার তা হ'ল এমন একটি ফাংশন বিকাশ করা যা কোনও উপাদান গ্রুপকে আমাদের প্রশাসনের চুক্তির জন্য একটি প্রস্তাব জমা দিতে সক্ষম করে।

// মানচিত্রের নির্দিষ্ট প্রস্তাবকে অফার আইডি বরাদ্দ করুন (uint => প্রস্তাব) পাবলিক প্রস্তাবগুলি;
// পাবলিকভাবে নির্বাচিত অ্যাসাইনমেন্টের জন্য ঠিকানা এবং একটি ভোটারের কণ্ঠস্বর (uint => অ্যাসাইনমেন্ট (ঠিকানা => বুল)) সরবরাহ করুন;
// ব্যবহারকারী ভোটদান ম্যাপিং থেকে আটকে আছে কিনা তা নির্ধারণ করুন (ঠিকানা => uint) প্রকাশ্যে অবরুদ্ধ;
কাঠামোর প্রস্তাব int uint ভোট প্রাপ্ত; উত্তীর্ণ বাল; ঠিকানা প্রেরক; uint Voting ডেডলাইন; }
/// @dev একটি টোকেনধারকে ভোট দেওয়ার জন্য একটি প্রস্তাব জমা দেওয়ার অনুমতি দেয় ফাংশন জমা দিনপ্রসারণ () সর্বজনীন কেবলমাত্র যোগ্য ভোটার (msg.seেন্ডার) যখন নটব্লকড (msg.sender) ফেরত (uint প্রস্তাব ID) {ভোট প্রাপ্ত = টোকেন.সামগ্রী) (msg.sender) ; প্রস্তাব আইডি = অ্যাডপ্রোসাল (ভোটপ্রাপ্ত); প্রপোজালসবমিটেড (প্রপোজালআইডি) সহ; রিটার্ন প্রোপোজআইডি; }

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

কেবলমাত্র পরিবর্তনযোগ্য যোগ্য (ঠিকানা _ভোটার) {ভারসাম্য = টোকেন.বিল্যান্সফ (_ভোটার); প্রয়োজনীয় (ভারসাম্য> 0); : _; }

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

/// @dev অফার অ্যাসাইনমেন্টে একটি নতুন অফার যুক্ত করেছে /// @param _votes অফার জমা দেওয়া ব্যবহারকারীদের কাছ থেকে প্রাপ্ত
ফাংশন অ্যাডপ্রোপসাল (uint _votes प्राप्त) অভ্যন্তরীণভাবে রিটার্ন দেয় (uint প্রস্তাব ID) {ভোট = _ভোটস প্রাপ্ত; যদি (ভোট) = votesNeded); এন্ডভোট (প্রস্তাবআইডি); রিটার্ন প্রোপোজআইডি; }}

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

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

অন্যান্য উপাদানগুলি প্রস্তাবটির পক্ষে বা বিপক্ষে ভোট দিতে পারে

এর পরে, আমাদের কোনও নির্দিষ্ট প্রস্তাবের জন্য ভোট দিতে চায় এমন ভোটারদের ভোট প্রক্রিয়া করার জন্য একটি ফাংশন বিকাশ করা উচিত।

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

/// @dev টোকেনধারীদের একটি নির্দিষ্ট প্রস্তাব / পক্ষে মতামত দেওয়ার জন্য অনুমতি দেয় /// @param _proposalID অফার আইডি যা টোকেন ধারক ভোট দেয়; ফাংশন সাবমিটভিট (uint _proposalID) কেবলমাত্র যোগ্যতাযুক্ত (msg.sender) যখন নটব্লকড (msg .সেন্ডার) পাবলিক রিটার্ন (বুল) storage অফার স্টোরেজ পি = পরামর্শ [_প্ররোসালআইডি];
if (অবরুদ্ধ [msg.sender] == 0) {অবরুদ্ধ [msg.sender] = _ জনসম্পাদন; } অন্যথায় যদি (p.votingDeadline> পরামর্শ [অবরুদ্ধ [URL.sender]]। ভোটিংডেডলাইন) {
// এই প্রস্তাবের ভোটদানের সময়টি ভবিষ্যতে // এর চেয়ে আরও বেশি প্রস্তাব যে প্রেরককে অবরুদ্ধ করে। তাকে একজন ব্লকার করুন
অবরুদ্ধ [URL.sender] = _ জনসম্পর্কিত আইডি; } ভোট প্রাপ্ত = টোকেন.বালেন্সফ (msg.seender); প্রস্তাবনাগুলি [_প্রোসালআইডি] .ভোটগুলি প্রাপ্ত + = ভোট প্রাপ্ত; ভোট দিয়েছেন [_proposalID] [msg.sender] = সত্য; if (পরামর্শ [_proposalID] .votesRemitted> = votesNeded) {পরামর্শ [_proposalID] .প্যাসড = সত্য; ভোট কাস্ট (_প্রপোসালআইডি, প্রাপ্ত ভোট, পরামর্শ, [_প্ররোসালআইডি]। পাস); এন্ডভোট (_প্রপোসালিড); cast ভোট দেওয়া (_ জনসম্পাদনা, প্রাপ্ত ভোট, পরামর্শ, [_প্ররোসালআইডি]। পাস); সত্য প্রত্যাবর্তন; }

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

ভোট শেষ হয়েছে এবং যথাযথ ব্যবস্থা নেওয়া হচ্ছে

এটি নয় যে আমরা এমন একটি বৈশিষ্ট্য তৈরি করেছি যা উপাদানগুলি পরামর্শ এবং ভোট দেওয়ার জন্য ব্যবহার করতে পারে। আসুন দেখে নেওয়া যাক যে কোনও প্রস্তাব গ্রহণের জন্য পর্যাপ্ত ভোট পেলে কি হয়।

আমাদের "সাবমোটভোট" ফাংশনে, আপনি যদি বিবৃতিটি ফিরিয়ে দেন তবে আপনি এটি কল করেছেন, যা প্রস্তাবের জন্য পর্যাপ্ত ভোট পেয়েছে কিনা তা পরীক্ষা করে:

if (পরামর্শ [_proposalID] .votesRemitted> = votesNeded) {পরামর্শ [_proposalID] .প্যাসড = সত্য; ভোট কাস্ট (_প্রপোসালআইডি, প্রাপ্ত ভোট, পরামর্শ, [_প্ররোসালআইডি]। পাস); এন্ডভোট (_প্রপোসালিড); }

যখন এটি পর্যাপ্ত ভোট পেয়েছে, শেষে ভোটের ফাংশনটি ডাকা হয়, যা দেখতে এটির মতো দেখায়:

/// @ দেব কোনও নির্দিষ্ট ভোট শেষ হলে নির্ধারণ করে /// @param _proposalID নির্দিষ্ট অফারের আইডি
ফাংশন এন্ড ভোট (uint _proposalID) অভ্যন্তরীণ {প্রয়োজন (VotSuccessOrFail (_proposalID)); আপডেটপ্রোসটোপোসেসড (_প্রপোসালআইডি); }

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

/// @dev নির্ধারণ করে যে কোনও নির্দিষ্ট ভোট পাস হয়েছে কি না /// @param _proposalID অফার আইডি যাচাই করা হবে /// @ পুনরায় ফিরে আসে কোনও নির্দিষ্ট ভোট পাস হয়েছে কিনা
ফাংশন ভোটসুসসঅরফেইল (uint _proposalID) সর্বজনীন প্রত্যাশা রিটার্ন (বুল) {প্রস্তাবনাগুলি ফেরত দিন [_প্রপোসিডআইডি] .প্যাস; }

যদি ভোটটি সফল হয়, আমরা এমন একটি ফাংশন বলি যা প্রস্তাবটির পাস হওয়া ভেরিয়েবলটিকে সত্য করে তোলে।

কীভাবে নির্বাচনের জালিয়াতি রোধ করা যায়

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

যদি আপনি আগে মনে রাখেন, "লকড" নামে একটি অ্যাসাইনমেন্ট ঘটেছে।

// ব্যবহারকারী ভোটদান ম্যাপিং থেকে আটকে আছে কিনা তা নির্ধারণ করুন (ঠিকানা => uint) প্রকাশ্যে অবরুদ্ধ;

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

আমাদের টোকেন চুক্তিতে এটি বাস্তবায়নের জন্য, নোটব্লকড সংশোধক যখন আমরা নিম্নলিখিতটি ব্যবহার করি:

/// @ দেবদেব পরিবর্তনকারী কোনও ব্যবহারকারী অ্যাকাউন্ট স্থানান্তর সম্পাদন থেকে অবরুদ্ধ কিনা তা পরীক্ষা করতে
সংশোধক যখন নটব্লকড (ঠিকানা _ অ্যাকাউন্ট) {প্রয়োজন (! গভর্নেন্স.আইসব্লকড (_ অ্যাকাউন্ট)); : _; }

তারপরে আমরা আমাদের স্থানান্তর এবং স্থানান্তরকরণের পরিবর্তক থেকে টোকেন চুক্তি ব্যবহার করব যা ওপেনজেপেলিনের ইআরসি -20 টোকেন চুক্তি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।

ফাংশন ট্রান্সফার (ঠিকানা, uint256 মান) সর্বজনীন যখন নটব্লকড (msg.sender) ফেরত (বুল) super সুপার সুপার ট্রান্সফার (থেকে, মান); }
ফাংশন ট্রান্সফারফর্ম থেকে (ঠিকানা থেকে, uint256 মান থেকে ঠিকানা) সর্বজনীন যখন নটব্লকড (থেকে) রিটার্ন (বুল) super সুপার.টান্সফারফর্ম থেকে (থেকে, মান); }

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

টেকওযে়

  • টোকেন-ভিত্তিক পুনর্মিলন অ্যাপ্লিকেশন তৈরির জন্য কোনও একক "সঠিক" উপায় নেই। এটি আবেদনের উপর নির্ভর করে।
  • বেশিরভাগ টোকেন-ভিত্তিক ভোটিং অ্যাপ্লিকেশনগুলি নীচের মতো একটি প্যাটার্ন অনুসরণ করে: একজন ভোটার একটি প্রস্তাব জমা দেয় → অন্য ভোটাররা তখন প্রস্তাবটির পক্ষে বা বিপক্ষে ভোট দিতে পারেন the প্রস্তাবটি পূর্বনির্ধারিত প্রান্তরে পৌঁছানোর সাথে সাথেই ভোটটি পাস বা ব্যর্থ হয় এবং যথাযথ ব্যবস্থা নেওয়া হয়।
  • বিতরণ টোকেন-ভিত্তিক ভোটদান অ্যাপ্লিকেশনগুলি প্রয়োগ করার সময় নির্বাচনের জালিয়াতি একটি বড় চ্যালেঞ্জ। ERC-20 টোকেনগুলির ছদ্মবেশ এটিকে প্রতিরোধ করা কঠিন করে তোলে।
  • রাষ্ট্র পরিচালনার সাথে জড়িত চ্যালেঞ্জগুলিও রয়েছে। এটি হ'ল নির্দিষ্ট টোকেনের সাথে যুক্ত অনন্য বৈশিষ্ট্যগুলি কীভাবে উপযুক্ত প্রশাসন ব্যবস্থা নিয়ে কাজ করবে
  • শেষ পর্যন্ত, টোকেন-ভিত্তিক ভোটদান ব্যাহত অ্যাপ্লিকেশনগুলির জন্য একটি শক্তিশালী শাসন ব্যবস্থা, তবে এতে ঝুঁকি রয়েছে যা হ্রাস করা দরকার involve

আপনি কি ইথেরিয়ামের উন্নয়ন সম্পর্কে আরও জানতে চান?