Sistem voting berbasis blockchain yang dibangun dengan Hardhat dan Solidity. Proyek ini mengimplementasikan sistem pemilihan menggunakan pengenalan wajah untuk autentikasi pemilih pada smart contract Ethereum.
Backend ini menyediakan fungsionalitas smart contract untuk sistem voting terdesentralisasi yang menggunakan pengenalan wajah untuk autentikasi pemilih. Sistem ini mencegah voting ganda dan memastikan transparansi melalui teknologi blockchain.
git clone https://github.com/dipaadipati/web3-pemilu-backend.git
cd web3-pemilu-backendMenggunakan npm:
npm installAtau menggunakan Bun:
bun installnpm run node
# atau
bun run nodeIni akan memulai jaringan Ethereum lokal di http://localhost:8545 dengan 20 akun testing.
Di terminal baru:
npm run deploy
# atau
bun run deployPeriksa akun admin:
npm run check-deployed-admin
# atau
bun run check-deployed-adminKontrak utama contracts/Voting.sol mencakup:
- Autentikasi Pengenalan Wajah: Menggunakan hash wajah untuk identifikasi pemilih
- Manajemen Proposal: Admin dapat menambahkan proposal voting
- Pelacakan Vote: Mencegah voting ganda dan melacak jumlah suara
- Kontrol Admin: Hanya admin yang dapat menambahkan proposal
addProposal(string memory _description): Menambah proposal voting baru (khusus admin)vote(string memory _faceHash, uint256 _proposalId): Memberikan suara menggunakan hash wajahgetAllProposals(): Mendapatkan semua proposal yang tersediavoters(string faceHash): Memeriksa status pemilih
| Script | Deskripsi |
|---|---|
npm run node |
Menjalankan jaringan Hardhat lokal |
npm run deploy |
Deploy kontrak ke localhost |
npm run check-admin |
Memeriksa konfigurasi admin |
npm run check-deployed-admin |
Memverifikasi admin kontrak yang telah di-deploy |
npm run init |
Inisialisasi proyek Hardhat baru |
web3-pemilu-backend/
βββ contracts/ # Smart contract Solidity
β βββ Lock.sol # Contoh kontrak
β βββ Voting.sol # Kontrak voting utama
βββ scripts/ # Script deployment dan utilitas
β βββ deploy.js # Deployment kontrak
β βββ check-admin.js # Verifikasi admin
β βββ check-deployed-admin.js
βββ test/ # Test kontrak
βββ artifacts/ # Kontrak yang telah dikompilasi
βββ cache/ # Cache Hardhat
βββ ignition/ # Modul deployment
Setelah deployment, Anda dapat menambahkan proposal melalui akun admin:
// Contoh: Menambahkan proposal secara programatis
const contract = await ethers.getContractAt("FaceVoting", contractAddress);
await contract.addProposal("Kandidat A");
await contract.addProposal("Kandidat B");Jalankan test kontrak:
npx hardhat test- Repository: web3-pemilu
- Teknologi: React.js / Next.js dengan integrasi Web3
- Fitur:
- Interface pengenalan wajah
- Interface voting
- Hasil real-time
- Autentikasi Hash Wajah: Menggunakan hash kriptografi dari encoding wajah
- Penegakan Suara Tunggal: Blockchain mencegah voting ganda
- Kontrol Admin: Hanya admin yang berwenang dapat mengelola proposal
- Hasil Transparan: Semua suara dicatat di blockchain
- Rekaman Tidak Dapat Diubah: Riwayat voting tidak dapat dimodifikasi
- Network: Hardhat Local Network
- RPC URL: http://localhost:8545
- Chain ID: 31337
Untuk deploy di testnet, update hardhat.config.cjs:
module.exports = {
solidity: "0.8.28",
networks: {
sepolia: {
url: "https://sepolia.infura.io/v3/YOUR_INFURA_KEY",
accounts: ["YOUR_PRIVATE_KEY"]
}
}
};-
Install Library Web3:
npm install ethers web3
-
Koneksi ke Kontrak:
import { ethers } from 'ethers'; const provider = new ethers.providers.JsonRpcProvider('http://localhost:8545'); const contract = new ethers.Contract(contractAddress, abi, provider);
-
ABI Kontrak: Gunakan ABI yang dihasilkan dari
artifacts/contracts/Voting.sol/FaceVoting.json
Smart contract berfungsi sebagai API melalui panggilan Web3:
- GET Proposals:
contract.getAllProposals() - POST Vote:
contract.vote(faceHash, proposalId) - GET Status Voter:
contract.voters(faceHash)
- Blockchain Explorer: Gunakan block explorer lokal atau Etherscan untuk mainnet
- Event Logs: Monitor event kontrak untuk update real-time
- Penggunaan Gas: Lacak biaya transaksi dan optimisasi
-
"Artifact for contract 'Voting' not found"
- Nama kontrak adalah
FaceVoting, bukanVoting - Update script deploy untuk menggunakan nama yang benar
- Nama kontrak adalah
-
Masalah Koneksi Network
- Pastikan Hardhat node sedang berjalan
- Periksa RPC URL di konfigurasi frontend
-
Transaksi Gagal
- Periksa apakah pemilih sudah voting
- Verifikasi ID proposal ada
- Pastikan gas cukup
Untuk memeriksa dan mendapatkan informasi admin account:
# Periksa admin yang telah di-deploy
npm run check-deployed-admin
# Output akan menampilkan:
# - Alamat admin kontrak
# - Semua akun Hardhat yang tersedia
# - Private key admin accountContoh Output Admin Check:
=== CHECKING DEPLOYED CONTRACT ADMIN ===
Contract admin address: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
Your current address: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
Match? true
=== ALL HARDHAT ACCOUNTS ===
Account 0: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 π ADMIN π CURRENT
Account 1: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8
...
=== ADMIN ACCOUNT INFO ===
Admin is Account 0
Admin private key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
Proyek ini dilisensikan di bawah Lisensi MIT. Lihat file LICENSE untuk detail.
- Fork repository
- Buat branch fitur
- Commit perubahan Anda
- Push ke branch
- Buka Pull Request
Untuk dukungan dan pertanyaan:
- Buat issue di repository ini
- Hubungi tim development
Untuk optimisasi gas di production:
// Di hardhat.config.cjs
module.exports = {
solidity: {
version: "0.8.28",
settings: {
optimizer: {
enabled: true,
runs: 200
}
}
}
};- Developer: M. Adipati Rezkya
- Blockchain: Hardhat + Solidity
- Frontend: Next.js + TypeScript
Catatan: Ini adalah proyek demo untuk tujuan edukasi. Pastikan audit keamanan yang tepat sebelum penggunaan produksi.