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







