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

طراحی قرارداد

این قرارداد دارای ویژگی‌هایی از جمله ثبت رأی‌دهندگان، ایجاد موضوعات رأی‌گیری، و ثبت رأی‌ها خواهد بود. در کد زیر، این ویژگی‌ها پیاده‌سازی شده است.

1. نوشتن قرارداد رأی‌ گیری

یک فایل جدید در پوشه contracts با نام Voting.sol ایجاد کنید و کد زیر را به آن اضافه کنید:

// SPDX-License-Identifier: MIT
pragma solidity ^.8.;

contract Voting {
    struct Candidate {
        uint id;
        string name;
        uint voteCount;
    }

    mapping(uint => Candidate) public candidates;
    mapping(address => bool) public voters;
    uint public candidatesCount;
    string public electionName;

    event votedEvent(uint indexed _candidateId);

    constructor(string memory _electionName) {
        electionName = _electionName;
    }

    function addCandidate(string memory _name) public {
        candidatesCount++;
        candidates[candidatesCount] = Candidate(candidatesCount, _name, );
    }

    function vote(uint _candidateId) public {
        // Check if the voter has already voted
        require(!voters[msg.sender], "You have already voted.");
        // Check if the candidate is valid
        require(_candidateId >  && _candidateId <= candidatesCount, "Invalid candidate ID.");
        
        // Record the vote
        voters[msg.sender] = true;
        candidates[_candidateId].voteCount++;

        // Emit an event
        emit votedEvent(_candidateId);
    }

    function getCandidate(uint _candidateId) public view returns (string memory name, uint voteCount) {
        Candidate memory candidate = candidates[_candidateId];
        return (candidate.name, candidate.voteCount);
    }
}

آموزش سالیدیتی

2. توضیحات کد

  • ساختار Candidate: هر کاندیدا دارای یک شناسه، نام و تعداد رأی‌ها است.
  • ثبت رأی‌دهندگان: از یک mapping برای ثبت اینکه آیا هر آدرس رأی داده است یا خیر استفاده شده است.
  • تابع اضافه کردن کاندیدا: این تابع امکان اضافه کردن کاندیداهای جدید را فراهم می‌کند.
  • تابع رأی‌گیری: این تابع به کاربران اجازه می‌دهد که رأی دهند و رأی‌های آن‌ها را ثبت می‌کند.
  • تابع بازیابی اطلاعات کاندیدا: این تابع اطلاعات مربوط به یک کاندیدا خاص را برمی‌گرداند.

3. تنظیمات و تست قرارداد

برای تست قرارداد، می‌توانید از ابزار Truffle یا Hardhat استفاده کنید. فایل migrations/1_deploy_voting.js را ایجاد کرده و کد زیر را به آن اضافه کنید:

const Voting = artifacts.require("Voting");

module.exports = function (deployer) {
    deployer.deploy(Voting, "Election 2023");
};

4. ایجاد محیط آزمایشی

برای راه‌اندازی شبکه محلی، از Truffle استفاده کنید:

truffle develop

سپس در کنسول Truffle، قرارداد رأی‌گیری را دیپلوی کنید:

migrate --reset

5. تست عملکرد قرارداد

می‌توانید یک فایل تست در پوشه test با نام Voting.test.js ایجاد کرده و تست‌های زیر را نوشته و اجرا کنید:

const Voting = artifacts.require("Voting");

contract("Voting", (accounts) => {
    let votingInstance;

    it("should put the first candidate in the candidates array", async () => {
        votingInstance = await Voting.new("Election 2023");
        await votingInstance.addCandidate("Alice");
        const candidate = await votingInstance.getCandidate(1);
        
        assert.equal(candidate[], "Alice", "Candidate name should be Alice");
        assert.equal(candidate[1], , "Candidate should have  votes");
    });

    it("should vote for a candidate", async () => {
        await votingInstance.addCandidate("Bob");
        
        await votingInstance.vote(1, { from: accounts[] });
        const candidate = await votingInstance.getCandidate(1);
        
        assert.equal(candidate[1], 1, "Candidate Alice should have 1 vote");
        const hasVoted = await votingInstance.voters(accounts[]);
        assert.equal(hasVoted, true, "Voter should not be able to vote twice");
    });
});

6. اجرای تست‌ها

برای اجرای تست‌ها، از دستور زیر استفاده کنید:

truffle test

نتیجه‌ گیری

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