Pelajaran 3

تنفيذ فرز الأصوات وإعلان النتائج

في هذا الدرس، سننفذ الأجزاء الأخيرة من نظام التصويت اللامركزي الخاص بنا: فرز الأصوات وإعلان النتيجة. سيشمل ذلك توسيع عقد الناخب الخاص بنا مرة أخيرة وإنشاء وظائف لحساب الاقتراح الفائز.

توسيع عقد الناخب

لنبدأ بإضافة وظيفة 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;
    }
}

فهم الكود

دعونا نشرح الإضافات الجديدة:

  1. وظيفة الاقتراح الفائز: تتكرر هذه الوظيفة على جميع المقترحات وتجد الاقتراح الذي حصل على أعلى عدد من الأصوات. تقوم بإرجاع فهرس هذا الاقتراح في مصفوفة المقترحات. إنها وظيفة عرض ، مما يعني أنها لا تعدل حالة العقد وتقرأ البيانات فقط.

  2. وظيفة اسم الفائز: تستدعي هذه الوظيفة وظيفة WinningProposal للحصول على فهرس الاقتراح الفائز ثم تقوم بإرجاع اسم هذا الاقتراح.

التجميع والاختبار

قم بتجميع العقد الخاص بك عن طريق النقر على أيقونة مترجم Solidity على الشريط الجانبي الأيسر ثم النقر فوق الزر «Compile».

انشر عقدك في علامة تبويب «نشر معاملات & التشغيل» وتفاعل معه. سجل بعض الناخبين، وأضف بعض المقترحات، وأدلي بأصواتك، وأخيرًا، تحقق من الفائز.

كيفية القيام بذلك:

  1. النشر: أولاً، انقر فوق علامة التبويب «نشر معاملات & التشغيل» في Remix IDE. إنه الرمز الموجود أسفل رمز مترجم Solidity. تأكد من أنك في بيئة «JavaScript VM». ثم انقر فوق الزر «نشر».
  2. تسجيل الناخبين: بمجرد نشر العقد، ستراه ضمن قسم «العقود المنشورة». انقر فوق السهم لتوسيعه. ستجد جميع وظائف عقدنا مدرجة هناك.
  3. لتسجيل الناخبين، ابحث عن وظيفة RegisterVoter. نظرًا لأننا قمنا ببرمجة عقدنا لتسجيل الحساب الذي يستدعي هذه الوظيفة كناخب، يمكنك تبديل الحسابات في القائمة المنسدلة «الحساب» في علامة التبويب «نشر معاملات & التشغيل». بمجرد تحديد حساب، انقر فوق وظيفة RegisterVoter. كرر هذه الخطوة لكل حساب تريد تسجيله كناخب.
  4. إضافة مقترحات: لإضافة مقترحات، ابحث عن وظيفة addProposal. أدخل اسم الاقتراح في مربع الإدخال بجوار الوظيفة وانقر فوق الوظيفة. كرر هذه الخطوة لكل اقتراح تريد إضافته.
  5. التصويت: للتصويت، قم بالتبديل إلى حساب الناخب وابحث عن وظيفة التصويت. أدخل فهرس الاقتراح (الترتيب الذي أضفته به، بدءًا من 0) الذي تريد التصويت له في مربع الإدخال بجوار الوظيفة وانقر فوق الوظيفة. كرر هذه الخطوة لكل ناخب.
  6. التحقق من الفائز: بعد أن يدلي جميع الناخبين بأصواتهم، يمكنك التحقق من الفائز. ابحث عن وظيفة WinnerName وانقر عليها. سيتم عرض اسم الاقتراح الفائز في وحدة التحكم أسفل الشاشة.
  7. تذكر أن جميع الإجراءات في blockchain (بما في ذلك الإجراءات التجريبية في Remix) هي معاملات. يمكنك توسيع تفاصيل المعاملة في وحدة التحكم لرؤية المزيد من المعلومات، مثل تكلفة المعاملة والبيانات. ومن الممارسات الجيدة التحقق من هذه المعلومات لفهم كيفية تفاعل عقدك مع بلوكتشين بشكل أفضل.

في الدرس التالي، سنناقش تفاعلات العقد وتسجيل الأحداث. سنتعلم كيف يمكن للعقود التفاعل مع بعضها البعض وكيفية تسجيل ومراقبة الأنشطة على بلوكتشين. تهانينا على بناء أول نظام تصويت لامركزي على Ethereum!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.
Katalog
Pelajaran 3

تنفيذ فرز الأصوات وإعلان النتائج

في هذا الدرس، سننفذ الأجزاء الأخيرة من نظام التصويت اللامركزي الخاص بنا: فرز الأصوات وإعلان النتيجة. سيشمل ذلك توسيع عقد الناخب الخاص بنا مرة أخيرة وإنشاء وظائف لحساب الاقتراح الفائز.

توسيع عقد الناخب

لنبدأ بإضافة وظيفة 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;
    }
}

فهم الكود

دعونا نشرح الإضافات الجديدة:

  1. وظيفة الاقتراح الفائز: تتكرر هذه الوظيفة على جميع المقترحات وتجد الاقتراح الذي حصل على أعلى عدد من الأصوات. تقوم بإرجاع فهرس هذا الاقتراح في مصفوفة المقترحات. إنها وظيفة عرض ، مما يعني أنها لا تعدل حالة العقد وتقرأ البيانات فقط.

  2. وظيفة اسم الفائز: تستدعي هذه الوظيفة وظيفة WinningProposal للحصول على فهرس الاقتراح الفائز ثم تقوم بإرجاع اسم هذا الاقتراح.

التجميع والاختبار

قم بتجميع العقد الخاص بك عن طريق النقر على أيقونة مترجم Solidity على الشريط الجانبي الأيسر ثم النقر فوق الزر «Compile».

انشر عقدك في علامة تبويب «نشر معاملات & التشغيل» وتفاعل معه. سجل بعض الناخبين، وأضف بعض المقترحات، وأدلي بأصواتك، وأخيرًا، تحقق من الفائز.

كيفية القيام بذلك:

  1. النشر: أولاً، انقر فوق علامة التبويب «نشر معاملات & التشغيل» في Remix IDE. إنه الرمز الموجود أسفل رمز مترجم Solidity. تأكد من أنك في بيئة «JavaScript VM». ثم انقر فوق الزر «نشر».
  2. تسجيل الناخبين: بمجرد نشر العقد، ستراه ضمن قسم «العقود المنشورة». انقر فوق السهم لتوسيعه. ستجد جميع وظائف عقدنا مدرجة هناك.
  3. لتسجيل الناخبين، ابحث عن وظيفة RegisterVoter. نظرًا لأننا قمنا ببرمجة عقدنا لتسجيل الحساب الذي يستدعي هذه الوظيفة كناخب، يمكنك تبديل الحسابات في القائمة المنسدلة «الحساب» في علامة التبويب «نشر معاملات & التشغيل». بمجرد تحديد حساب، انقر فوق وظيفة RegisterVoter. كرر هذه الخطوة لكل حساب تريد تسجيله كناخب.
  4. إضافة مقترحات: لإضافة مقترحات، ابحث عن وظيفة addProposal. أدخل اسم الاقتراح في مربع الإدخال بجوار الوظيفة وانقر فوق الوظيفة. كرر هذه الخطوة لكل اقتراح تريد إضافته.
  5. التصويت: للتصويت، قم بالتبديل إلى حساب الناخب وابحث عن وظيفة التصويت. أدخل فهرس الاقتراح (الترتيب الذي أضفته به، بدءًا من 0) الذي تريد التصويت له في مربع الإدخال بجوار الوظيفة وانقر فوق الوظيفة. كرر هذه الخطوة لكل ناخب.
  6. التحقق من الفائز: بعد أن يدلي جميع الناخبين بأصواتهم، يمكنك التحقق من الفائز. ابحث عن وظيفة WinnerName وانقر عليها. سيتم عرض اسم الاقتراح الفائز في وحدة التحكم أسفل الشاشة.
  7. تذكر أن جميع الإجراءات في blockchain (بما في ذلك الإجراءات التجريبية في Remix) هي معاملات. يمكنك توسيع تفاصيل المعاملة في وحدة التحكم لرؤية المزيد من المعلومات، مثل تكلفة المعاملة والبيانات. ومن الممارسات الجيدة التحقق من هذه المعلومات لفهم كيفية تفاعل عقدك مع بلوكتشين بشكل أفضل.

في الدرس التالي، سنناقش تفاعلات العقد وتسجيل الأحداث. سنتعلم كيف يمكن للعقود التفاعل مع بعضها البعض وكيفية تسجيل ومراقبة الأنشطة على بلوكتشين. تهانينا على بناء أول نظام تصويت لامركزي على Ethereum!

Pernyataan Formal
* Investasi Kripto melibatkan risiko besar. Lanjutkan dengan hati-hati. Kursus ini tidak dimaksudkan sebagai nasihat investasi.
* Kursus ini dibuat oleh penulis yang telah bergabung dengan Gate Learn. Setiap opini yang dibagikan oleh penulis tidak mewakili Gate Learn.