اليوم، نتخذ خطوة مهمة نحو اللامركزية الديمقراطية من خلال إنشاء عقد تصويت ذكي على سلسلة بت تورنت (BTTC).
سيسمح لنا هذا العقد بتسجيل المرشحين والإدلاء بأصواتهم وتحديد الفائز بطريقة شفافة لا يمكن التلاعب بها. دعنا نتعمق في تفاصيل عقد التصويت الخاص بنا!
عقد التصويت: مخطط للديمقراطية الرقمية
تم تصميم عقد التصويت الخاص بنا للتعامل مع عملية التصويت بأكملها، من تسجيل المرشحين إلى فرز الأصوات. إليك نظرة خاطفة على المكونات الأساسية لعقدنا:
الهياكل ومتغيرات الحالة
أولاً، دعنا نحدد الهياكل ومتغيرات الحالة التي ستحمل بيانات التصويت الخاصة بنا:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Voting {
// saves voter info i.e., id and candidate id whom the voter voted
struct Voter {
string uid;
uint candidateIDVote;
}
// has candidate information like name, party, etc.
struct Candidate {
string name;
string party;
bool doesExist;
}
uint numCandidates; // declares a state variable - number of candidates
uint numVoters; // number of voters who voted
uint256 voteDeadline; // state variable for saving deadline
// These mappings will hold all the candidates and voters respectively
mapping(uint => Candidate) candidates;
mapping(uint => Voter) voters;
النشاطات
بعد ذلك، نقوم بتحديد الأحداث/النشاطات التي سيتم بثها في لحظات مهمة أثناء عملية التصويت:
// event for candidate registration logging
event candidateRegistered(uint candidateID);
// event for vote logging
event voteRegistered(uint voterID, uint candidateID);
الوظائف
الآن، دعنا نتعمق في الوظائف التي تجعل عقدنا عمليًا:
تحديد الموعد النهائي للتصويت والحصول عليه
// @param _voteDeadline Timestamp value of the deadline
function setVoteDeadline(uint256 _voteDeadline) public {
voteDeadline = _voteDeadline;
}
function getVoteDeadline() public view returns (uint256) {
return voteDeadline;
}
إضافة المرشحين
// @param name string name of candidate
// @param party string name of party
function addCandidate(string calldata name, string calldata party) public {
numCandidates++;
candidates[numCandidates] = Candidate(name, party, true);
emit candidateRegistered(numCandidates);
}
إرسال التصويت
// @param uid string uid of user
// @param candidateID uint id of candidate
function vote(string calldata uid, uint candidateID) public {
require(block.timestamp <= voteDeadline, "Voting period has ended.");
require(candidates[candidateID].doesExist, "Candidate does not exist.");
numVoters++;
voters[numVoters] = Voter(uid, candidateID);
emit voteRegistered(numVoters, candidateID);
}
الحصول على الفائز
function getWinner() public view returns (string memory winnerName) {
uint[] memory voteCounts = new uint[](numCandidates + 1);
for (uint i = 1; i <= numVoters; i++) {
voteCounts[voters[i].candidateIDVote]++;
}
uint winningVoteCount = 0;
uint winningCandidateID = 0;
for (uint i = 1; i <= numCandidates; i++) {
if (voteCounts[i] > winningVoteCount) {
winningVoteCount = voteCounts[i];
winningCandidateID = i;
}
}
return candidates[winningCandidateID].name;
}
الحصول على مجموع الأصوات للمرشح
// @param candidateID uint id of candidate
function totalVotes(uint candidateID) public view returns (uint) {
uint voteCount = 0;
for (uint i = 1; i <= numVoters; i++) {
if (voters[i].candidateIDVote == candidateID) {
voteCount++;
}
}
return voteCount;
}
}
قوة التصويت اللامركزي
يوضح عقد التصويت هذا كيف يمكن لتقنية blockchain إحداث ثورة في أنظمة التصويت التقليدية. من خلال ضمان الشفافية والثبات والأمان، يمكننا بناء الثقة في العملية الانتخابية.
ما وراء الأساسيات: تحسين عقد التصويت الخاص بك
الآن بعد أن أصبح لديك عقد تصويت أساسي فكر في إضافة المزيد من الميزات:
تنفيذ تسجيل الناخبين لمنع التصويت المكرر.
إضافة آليات التحقق من المرشحين.
إنشاء واجهة أمامية سهلة الاستخدام للناخبين للتفاعل مع العقد.
الخلاصة: تشكيل مستقبل الديمقراطية
لقد اتخذت للتو خطوة كبيرة نحو اللامركزية الديمقراطية. إن عقد التصويت هذا أكثر من مجرد رمز؛ إنه رؤية لمستقبل حيث كل صوت مهم، وكل انتخابات شفافة ونزيهة.
إذن، ما الذي ستبنيه بعد ذلك؟ عالم blockchain مليء بالاحتمالات، ومستقبل الديمقراطية بين يديك!
رابط Github:
https://github.com/adeelch9/bttc-examples/tree/master/projects/voting
لمزيد من التفاصيل قم بالرجوع الى المقال هنا