لنبدأ بإضافة وظيفة WinningProposal
إلى عقدنا. ستقوم هذه الوظيفة بتكرار جميع المقترحات وإرجاع الاقتراح الذي حصل على أكبر عدد من الأصوات. بالإضافة إلى ذلك، سنقوم بإنشاء وظيفة WinnerName
لإرجاع اسم الاقتراح الفائز. هذه هي النسخة النهائية من عقدنا:
صلابة
/معرف ترخيص SPDX: GPL-3.0
صلابة البراغما > = < 0.7.0 0.9.0؛
ناخب متعاقد {
الشخص البنيوي {
bool voted;
uint vote;
}
اقتراح هيكلي {
string name;
uint voteCount;
}
اقتراح [] مقترحات عامة؛
رسم خرائط (العنوان = > الشخص) للناخبين العامين؛
وظيفة تسجيل الناخبين () للجمهور {
voters[msg.sender].voted = false;
}
وظيفة addProposal (ذاكرة السلسلة _name) عامة {
proposals.push(Proposal(_name, 0));
}
التصويت على الوظيفة (اقتراح الوحدة) للجمهور {
require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check
Person storage sender = voters[msg.sender];
require(!sender.voted, "Already voted.");
sender.voted = true;
sender.vote = _proposal;
proposals[_proposal].voteCount += 1;
}
دالة winningProposal () ترجع طريقة العرض العام (uint winningProposal_) {
الوحدة الفائزة بعدد الأصوات = 0؛
النموذج (الوحدة p = 0)؛ < المقترحات. الطول؛ p ++) {
if (المقترحات [p]. فرز الأصوات، عدد الأصوات الفائزة) > {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
دالة WinnerName () ترجع طريقة العرض العام (ذاكرة السلسلة WinnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
دعونا نشرح الإضافات الجديدة:
وظيفة الاقتراح الفائز: تتكرر هذه الوظيفة على جميع المقترحات وتجد الاقتراح الذي حصل على أعلى عدد من الأصوات. تقوم بإرجاع فهرس هذا الاقتراح في مصفوفة المقترحات
. إنها وظيفة عرض
، مما يعني أنها لا تعدل حالة العقد وتقرأ البيانات فقط.
وظيفة اسم الفائز: تستدعي هذه الوظيفة وظيفة WinningProposal
للحصول على فهرس الاقتراح الفائز ثم تقوم بإرجاع اسم هذا الاقتراح.
قم بتجميع العقد الخاص بك عن طريق النقر على أيقونة مترجم Solidity على الشريط الجانبي الأيسر ثم النقر فوق الزر «Compile».
انشر عقدك في علامة تبويب «نشر معاملات & التشغيل» وتفاعل معه. سجل بعض الناخبين، وأضف بعض المقترحات، وأدلي بأصواتك، وأخيرًا، تحقق من الفائز.
في الدرس التالي، سنناقش تفاعلات العقد وتسجيل الأحداث. سنتعلم كيف يمكن للعقود التفاعل مع بعضها البعض وكيفية تسجيل ومراقبة الأنشطة على بلوكتشين. تهانينا على بناء أول نظام تصويت لامركزي على Ethereum!
لنبدأ بإضافة وظيفة WinningProposal
إلى عقدنا. ستقوم هذه الوظيفة بتكرار جميع المقترحات وإرجاع الاقتراح الذي حصل على أكبر عدد من الأصوات. بالإضافة إلى ذلك، سنقوم بإنشاء وظيفة WinnerName
لإرجاع اسم الاقتراح الفائز. هذه هي النسخة النهائية من عقدنا:
صلابة
/معرف ترخيص SPDX: GPL-3.0
صلابة البراغما > = < 0.7.0 0.9.0؛
ناخب متعاقد {
الشخص البنيوي {
bool voted;
uint vote;
}
اقتراح هيكلي {
string name;
uint voteCount;
}
اقتراح [] مقترحات عامة؛
رسم خرائط (العنوان = > الشخص) للناخبين العامين؛
وظيفة تسجيل الناخبين () للجمهور {
voters[msg.sender].voted = false;
}
وظيفة addProposal (ذاكرة السلسلة _name) عامة {
proposals.push(Proposal(_name, 0));
}
التصويت على الوظيفة (اقتراح الوحدة) للجمهور {
require(_proposal < proposals.length, "Invalid proposal index."); // This is the added check
Person storage sender = voters[msg.sender];
require(!sender.voted, "Already voted.");
sender.voted = true;
sender.vote = _proposal;
proposals[_proposal].voteCount += 1;
}
دالة winningProposal () ترجع طريقة العرض العام (uint winningProposal_) {
الوحدة الفائزة بعدد الأصوات = 0؛
النموذج (الوحدة p = 0)؛ < المقترحات. الطول؛ p ++) {
if (المقترحات [p]. فرز الأصوات، عدد الأصوات الفائزة) > {
winningVoteCount = proposals[p].voteCount;
winningProposal_ = p;
}
}
}
دالة WinnerName () ترجع طريقة العرض العام (ذاكرة السلسلة WinnerName_) {
winnerName_ = proposals[winningProposal()].name;
}
}
دعونا نشرح الإضافات الجديدة:
وظيفة الاقتراح الفائز: تتكرر هذه الوظيفة على جميع المقترحات وتجد الاقتراح الذي حصل على أعلى عدد من الأصوات. تقوم بإرجاع فهرس هذا الاقتراح في مصفوفة المقترحات
. إنها وظيفة عرض
، مما يعني أنها لا تعدل حالة العقد وتقرأ البيانات فقط.
وظيفة اسم الفائز: تستدعي هذه الوظيفة وظيفة WinningProposal
للحصول على فهرس الاقتراح الفائز ثم تقوم بإرجاع اسم هذا الاقتراح.
قم بتجميع العقد الخاص بك عن طريق النقر على أيقونة مترجم Solidity على الشريط الجانبي الأيسر ثم النقر فوق الزر «Compile».
انشر عقدك في علامة تبويب «نشر معاملات & التشغيل» وتفاعل معه. سجل بعض الناخبين، وأضف بعض المقترحات، وأدلي بأصواتك، وأخيرًا، تحقق من الفائز.
في الدرس التالي، سنناقش تفاعلات العقد وتسجيل الأحداث. سنتعلم كيف يمكن للعقود التفاعل مع بعضها البعض وكيفية تسجيل ومراقبة الأنشطة على بلوكتشين. تهانينا على بناء أول نظام تصويت لامركزي على Ethereum!