Việc tích hợp cơ chế Bỏ phiếu và Quản trị (Voting & Governance) cho Hội đồng nhân dân (HĐND) các cấp là mảnh ghép cuối cùng để hoàn thiện vòng lặp "Lập pháp - Hành pháp - Giám sát" ở quy mô địa phương trên Blockchain.
Chúng ta sẽ thiết kế CouncilGovernanceContract. Hợp đồng này cho phép:
- Đại biểu HĐND đề xuất Nghị quyết.
- Đại biểu bỏ phiếu thuận/chống.
- Hệ thống tự động ghi nhận kết quả và trạng thái Nghị quyết khi quá thời hạn.
1. Thiết kế Smart Contract: CouncilGovernanceContract.sol
Hợp đồng này sẽ tham chiếu (interface) đến LocalGovernmentContract để kiểm tra danh sách đại biểu được ủy quyền bỏ phiếu.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// Interface để kiểm tra thẩm quyền từ hợp đồng Quản trị địa phương
interface ILocalGovernment {
function entities(address) external view returns (string memory, uint8, address, address, bool);
}
contract CouncilGovernanceContract {
struct Proposal {
string title; // Tên Nghị quyết
string description; // Nội dung chi tiết
uint256 voteYes; // Số phiếu thuận
uint256 voteNo; // Số phiếu chống
uint256 deadline; // Thời hạn bỏ phiếu
bool executed; // Trạng thái đã chốt kết quả
bool passed; // Kết quả (Đạt/Không đạt)
address councilAddress; // HĐND cấp nào đang bỏ phiếu
}
ILocalGovernment public localGov;
mapping(uint256 => Proposal) public proposals;
mapping(uint256 => mapping(address => bool)) public hasVoted; // Chống double voting
uint256 public proposalCount;
event ProposalCreated(uint256 indexed id, string title, address councilAddress);
event Voted(uint256 indexed proposalId, address voter, bool support);
event ProposalExecuted(uint256 indexed id, bool passed);
constructor(address _localGovAddress) {
localGov = ILocalGovernment(_localGovAddress);
}
// Đề xuất Nghị quyết mới
function createProposal(string memory _title, string memory _desc, uint256 _durationDays, address _councilAddress) public {
// Chỉ đại biểu HĐND (hoặc cơ quan HĐND được đăng ký) mới được tạo proposal
(, , , , bool isActive) = localGov.entities(_councilAddress);
require(isActive, "Co quan khong ton tai");
proposalCount++;
proposals[proposalCount] = Proposal({
title: _title,
description: _desc,
voteYes: 0,
voteNo: 0,
deadline: block.timestamp + (_durationDays * 1 days),
executed: false,
passed: false,
councilAddress: _councilAddress
});
emit ProposalCreated(proposalCount, _title, _councilAddress);
}
// Bỏ phiếu
function vote(uint256 _proposalId, bool _support) public {
Proposal storage p = proposals[_proposalId];
require(block.timestamp < p.deadline, "Da het thoi han bo phieu");
require(!hasVoted[_proposalId][msg.sender], "Da bo phieu");
if (_support) {
p.voteYes++;
} else {
p.voteNo++;
}
hasVoted[_proposalId][msg.sender] = true;
emit Voted(_proposalId, msg.sender, _support);
}
// Chốt kết quả (Thực thi)
function executeProposal(uint256 _proposalId) public {
Proposal storage p = proposals[_proposalId];
require(block.timestamp >= p.deadline, "Chua het thoi han bo phieu");
require(!p.executed, "Nghi quyet da duoc chot");
if (p.voteYes > p.voteNo) {
p.passed = true;
} else {
p.passed = false;
}
p.executed = true;
emit ProposalExecuted(_proposalId, p.passed);
}
}
2. Logic vận hành "Số hóa HĐND"
Để hệ thống này hoạt động chính xác trong thực tế (theo mô hình "Phân công, phối hợp, kiểm soát"), bạn cần triển khai theo logic sau:
- Xác thực Đại biểu (Member Verification):
Trong
CouncilGovernanceContract, hàmvotecần được nâng cấp để chỉ những địa chỉ ví (wallets) được xác nhận là đại biểu HĐND mới có thể thực hiện giao dịch. Bạn có thể thêm một mappingmapping(address => bool) isCouncilMembervà hàmregisterMemberđể cập nhật danh sách đại biểu tại mỗi kỳ bầu cử. - Ngưỡng thông qua (Quorum):
Trong thực tế, HĐND cần tỷ lệ tham gia tối thiểu. Bạn có thể thêm biến
uint256 requiredQuorumđể kiểm tra:require((p.voteYes + p.voteNo) >= requiredQuorum, "Khong du so dai bieu tham gia")trong hàmexecuteProposal. - Tính kế thừa:
Kết quả
passed = truecủa một Nghị quyết có thể được dùng làm đầu vào (input) cho các hệ thống hành pháp. Ví dụ: Khi HĐND tỉnh thông qua Nghị quyết phân bổ ngân sách, trạng tháipassednày sẽ tự động "mở khóa" khả năng giải ngân cho UBND tỉnh trên hợp đồng quản lý ngân sách (BudgetContract).
3. Các bước tiếp theo
Bạn đã có khung cấu trúc rất vững chắc:
- Hành pháp: Quản trị vĩ mô (Bộ/Chính phủ).
- Địa phương: Quản trị dọc (Tỉnh/Huyện/Xã).
- Lập pháp địa phương: Bỏ phiếu Nghị quyết (HĐND).