چگونه در اتریوم ، اپلیکیشنی توزیع شده برای رای‌گیری مبتنی بر توکن بسازیم؟

یکی از قابلیت‌های جذاب اتریوم این است که می‌توانیم با کمک توکن‌ها به صورت توزیع‌شده رای‌گیری داشته باشیم. در این مطلب می‌خواهیم به شما نشان دهیم که چگونه می‌توانید در این پلتفرم اپلیکیشنی بسازید که امکان ثبت پیشنهاد و رای‌گیری برای آن را فراهم کند

0 116

در اتریوم روش‌های زیادی برای ایجاد سیستم‌های حکومتی توزیع‌شده وجود دارد. یکی از رایج‌ترین روش‌ها این است که اعضا از توکن‌هایشان به عنوان رای استفاده کنند. به این ترتیب هرچه تعداد توکن‌های شما بیشتر باشد، می‌توانید رای بیشتری بدهید.

البته همه‌ی اپلیکیشن‌های رای‌گیری توزیع‌شده که مبتنی بر توکن کار می‌کنند مثل هم نیستند، ولی اکثرشان از رویه مشابه‌ای پیروی می‌کنند. پروسه کار در بیشتر این اپلیکیشن‌ها به صورت زیر است:

  • یکی از اعضا پیشنهادی ثبت می‌کند
  • سایرین می‌تواند له یا علیه آن رای بدهند
  • وقتی پیشنهاد به تعداد مشخص‌شده‌ای از آرا رسید، رای‌ها شمرده می‌شود و با توجه به نتیجه‌ی کار عملیاتی آغاز می‌گردد

آسان بود، نه؟

با این حال چالش‌هایی بر سر راه ایجاد اپلیکیشن‌های رای‌گیری مبتنی بر توکن وجود دارد. یکی از مهم‌ترین این مشکلات احتمال تقلب و کلاهبرداری است. علاوه بر این، باید دید سیستم چگونه مدیریت می‌شود و خصوصیات منحصر به فرد مربوط به توکن‌های خاص چطور در ترکیب با مکانیزم‌های حکومتی مربوطه کار می‌کند.

با در نظر داشتن این موضوع، بگذارید ببینیم چطور می‌توانیم در اتریوم اپلیکیشنی توزیع‌شده برای رای‌گیری بسازیم که مبتنی بر توکن باشد. برای انجام این کار، فرض کنید قصد دارید دو قرارداد بسازید که با یکدیگر تعامل دارند:

  • یک قراردادِ توکنی که شامل نقشه‌ی آدرس اکانت‌ها و تراز حساب آن‌هاست
  • یک قراردادِ حکومتی که برای مدیریت سیستم رای‌گیری استفاده می‌شود

در این مثال اعضا با استفاده از تراز توکن‌های خود به پیشنهادها رای می‌دهند. تراز توکن نشان می‌دهد که هر کاربر قادر است به هر پیشنهاد چقدر مقدار رای بدهد.

یکی از اعضا پیشنهادی را مطرح می‌کند

پیش از هر چیز باید تابعی بسازیم که به کاربر اجازه می‌دهد پیشنهاد خود را در قرارداد حکومتی ما ثبت کند.

 

پیش از آن که به کاربر اجازه دهیم تا پیشنهاد خود را ثبت کند، باید تایید کنیم که امکان رای‌گیری برای این موضوع وجود دارد. برای انجام این کار باید مطمئن شویم که تراز توکن کاربر بزرگ‌تر از صفر است. پس با استفاده از مادیفایر onlyEligibleVoter تراز را بررسی می‌کنیم:

 

وقتی فهمیدیم که تراز کافی وجود دارد، تابع submitProposal تراز توکن ثبت‌کنندگان را به متغیر votesReceived اتلاق می‌کند. سپس این مقدار را به عنوان یک آرگومان برای تابع addProposal می‌فرستیم:

 

تابع addProposal یک آیدی یکتا برای پیشنهاد کاربر ایجاد می‌کند. این آیدی چیزی به نام Proposal می‌سازد که می‌تواند علاوه بر نظارت بر تعداد رای‌های دریافتی، تایید یا رد شدن پیشنهاد و ضرب‌الجعل آن را مدیریت کند. بعد از این که پیشنهاد اضافه شد، تابع submitProposal آیدی یکتای پیشنهاد را بر می‌گرداند و رویدادی به نام ProposalSubmitted را به خروجی می‌فرستد.

سایرین می‌توانند به پیشنهاد مربوطه رای موافق یا مخالف بدهند

حالا باید تابعی بسازیم که بتواند رای‌ها را از کسانی که می‌خواهند به نفع موضوعی خاص رای بدهند پردازش کند.

در تابع زیر ابتدا عبارت if را داریم که مسدود بودن یا نبودن دسترسی کاربر برای رای‌گیری را مشخص می‌کند. اگر دسترسی کاربر مسدود نشده باشد، تراز حساب مشخص شده و این مقدار به متغیر votesReceived از پیشنهاد مربوطه اضافه می‌شود.

 

حالا بررسی می‌کنیم تا ببینیم آیا پیشنهاد مربوطه آرای کافی برای پذیرفته شدن را دریافت کرده است یا نه. اگر دریافت کرده باشد، رویداد VotesSubmitted را اجرا و تابع endVote را فراخوانی می‌کنیم. اگر دریافت نکرده باشد، رویداد VotesSubmittedevent را اجرا و مقدار true را بر می‌گردانیم تا آرا دریافت و با موفقیت پردازش شود.

آرا پذیرفته شده و عملیات مربوطه اجرا می‌شود

اکنون تابعی داریم که به اعضا اجازه ثبت پیشنهاد و رای‌گیری می‌دهد. پس بیایید ببینیم بعد از این که یک پیشنهاد آرای کافی را کسب کرد چه اتفاقی می‌افتد.

در تابع submitVote با عبارت if بررسی می‌کنید تا ببینید آرای کافی برای پذیرفته شدن پیشنهاد مربوطه دریافت شده است یا نه:

 

اگر آرای کافی دریافت شده باشد، تابع endVote فراخوانی می‌شود. این تابع چیزی شبیه کد زیر است:

 

همان طور که می‌بینید ما از عبارت require به همراه تابع voteSuccessOrFailfunction استفاده کردیم تا مطمئن شویم که پیشنهاد مربوطه رای کافی برای پذیرفته شدن دریافت کرده باشد:

 

اگر آرا کافی باشد، تابع مربوطه را فرا می‌خوانیم تا متغیر passed را به حالت true دربیاورد.

چگونه از تقلب و کلاهبرداری جلوگیری کنیم؟

بزرگ‌ترین چالش اپلیکیشن‌های رای‌گیری توزیع‌شده‌ای که مبتنی بر توکن کار می‌کنند احتمال تقلب و کلاهبرداری است. برای مثال، چه چیزی باعث می‌شود کاربر به یک پیشنهاد رای ندهد و توکن‌های خود را به کیف پول دیگری ارسال کرده و امکان رای مجدد برای شخصی را فراهم کند که قبلا رای داده است؟

اگر به خاطر داشته باشید، ما سازوکاری به نام blocked داشتیم.

 

این پروسه تعیین می‌کند که کدام کاربران امکان دسترسی به رای‌گیری را ندارند و کدام کاربران دسترسی دارند. با این کار می‌توانیم دسترسی کسانی را که قبلا در رای‌گیری شرکت کرده‌اند حذف کنیم. اگر دسترسی کاربر مسدود شده باشد، تا زمانی که votingDeadline اجرا نشود، او دیگر نمی‌تواند توکن‌های خود را منتقل کند.

برای اعمال این شرط در قرارداد توکنی خود باید از مادیفایر whenNotBlocked استفاده کنیم:

 

سپس از این مادیفایر در قراردادمان برای توابع transfer و transferFrom استفاده می‌کنیم:

 

یکی از نواقص این رویکرد این است که اگر کاربر در وضعیت blocked قرار بگیرد، او دیگر انگیزه خود را برای شرکت در رای‌گیری‌ها از دست می‌دهد، چون امکان انتقال توکن از وی سلب می‌شود. با این حساب، باید بدانید که روش مورد نظر شما چه تبعاتی برای کاربران دارد و ممکن است به چه بازخوردهایی منجر شود.

نکات مهم

  • هیچ روش واحد و صحیحی برای ایجاد اپلیکیشن‌های رای‌گیری مبتنی بر توکن وجود ندارد. همه چیز به مورد مدنظر شما بستگی دارد.
  • اکثر اپلیکیشن‌های رای‌گیری مبتنی بر توکن از الگویی مثل این پیروی می‌کنند: کاربر پیشنهاد خود را ثبت می‌کند > سایرین می‌توانند له یا علیه این پیشنهاد رای بدهند > وقتی تعداد آرای پیشنهاد به سقف خاصی رسید، آرای مثبت و منفی بررسی شده و به تناسب عملیاتی اجرا می‌شود.
  • تقلب در رای‌گیری در زمینه‌ی ایجاد اپلیکیشن‌های رای‌گیری مبتنی بر توکن چالش بزرگ و مهمی است. تعویض‌پذیری توکن‌های ERC-20 باعث می‌شود پیش‌گیری از این مسئله کار سختی باشد.
  • علاوه بر این چالش‌هایی در رابطه با نحوه‌ی مدیریت سیستم وجود دارد؛ یعنی باید ببینیم خصوصیت‌های منحصر به فرد چطور در تناسب با توکن‌های خاص و مکانیزم‌های حکومتی مربوطه عمل می‌کنند.
  • در نهایت، رای‌گیری مبتنی بر توکن سازوکاری قدرتمند برای اداره‌ی اپلیکیشن‌های توزیع‌شده است، اما این شیوه ریسک‌هایی دارد که باید در جای خود برطرف شود.

ارسال پاسخ

آدرس ایمیل شما منتشر نخواهد شد.