سیستمهای رأیگیری غیرمتمرکز استفاده از بلاکچین را برای ایجاد شفافیت، امنیت و عدم جعل در فرایند رأیگیری امکانپذیر میسازند. در این مقاله، یک سیستم رأیگیری با سالیدیتی پیادهسازی میشود.
سرفصل های مقاله
طراحی قرارداد
این قرارداد دارای ویژگیهایی از جمله ثبت رأیدهندگان، ایجاد موضوعات رأیگیری، و ثبت رأیها خواهد بود. در کد زیر، این ویژگیها پیادهسازی شده است.
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
نتیجه گیری
با پیروی از مراحل بالا، شما میتوانید یک سیستم رأیگیری با سالیدیتی ایجاد کنید. این قرارداد میتواند به عنوان پایهای برای گسترش ویژگیها و قابلیتهای پیچیدهتر در سیستمهای رأیگیری استفاده شود. مهم است که سیستمهای رأیگیری را با توجه به مباحث امنیتی و قانونی در نظر بگیرید تا از اعتبار و محافظت از اطلاعات رأیدهندگان اطمینان حاصل شود.