Cara Membuat Decentralized Voting System Menggunakan Coinex Smart Chain


Teknologi blockchain telah manjadi solusi untuk beberapa masalah yang belum terselesaikan, keunggulan yang dimiliki blockchain akan merubah kebiasaan atau mengganti technologi usang yang selama ini kita pakai. Blockchain yang mempunyai sifat “decentralized” akan menjadi terobosan baru dan sebagai revolusi dalam komputasi atau distribusi informasi. Dengan menggunakan blockchain kita bisa membuat aplikasi terdesentralisasi yang sangat aman, seperti gamefi, defi, dns, proxy, nft, token crypto, e-voting, dan masih banyak lagi.

Saat ini voting atau pemilihan kanditat masih menggunakan metode lama, mengandalkan pemrosesan terpusat atau menggunakan kertas. ini sangat beresiko terjadi kecurangan atau doble data pada saat pemilihan kandidat. tahukan anda, bahwa blockchain akan menjadi solusi untuk masalah tersebut, saat ini anda bisa membuat e-voting berbasis blockchain yang sangat aman dari kecurangan dan doble data.

E-Voting berbasis blockchain akan membawa proses pemilihan kandidat secara adil dan transparant, tidak akan terjadi kecurangan dan doble data didalam e-voting blockchain. Dikesempatan ini kami akan memberikan edukasi cara untuk membuat voting system berbasis blockchain, kami akan membuat dapps tersebut di blockchain coinex smart chain.

Mengapa menggunakan Coinex Smart Chain (CSC) ?

Coinex smart chain adalah blockchain public yang mempunyai performa tinggi, di dukung oleh protocol PoS, membuat coinex smart chain menjadi blockchain yang mampu memproses ribuan transaksi dalam waktu 1 detik serta mempunyai troughput tinggi. PoS pada csc memungkinkan blockchain tersebut untuk mengirim data atau melakukan transaksi dengan fee yang sangat murah, bahkan lebih murah dari beberapa blockchain lain.

 

Apa Saja yang Perlu di Siapkan ?

# Siapkan Wallet

Untuk menggunakan blockchain coinex smart chain, anda bisa menggunakan atau download wallet metamask, viawallet atau trustwallet. Untuk menggunakan jaringan CSC (coinex smart chain) anda harus setting rpc wallet ke rpc csc mainnet atau testnet, berikut adalah detail rpc csc :

RPC URL : https://rpc.coinex.net
Network Name : Coinex Smart Chain Mainnet
ChainID : 52
Symbol : CET
Block Explorer : https://www.coinex.net

RPC URL : https://testnet-rpc.coinex.net/
Network Name : Coinex Smart Chain Testnet
ChainID : 53
Symbol : tCET
Block Explorer : https://testnet.coinex.net/

#Coin CET (Coin Native Coinex Smart Chain)

Anda membutuhkan coin native coinex smart chain (CET) untuk membayar semua jenis transaksi di jaringan tersebut, untuk mendapatkan coin cet, anda bisa membelinya di Coinex Exchange. CSC adalah blcokchain yang mempunyai fee transaksi sangat murah, anda hanya membutuhkan sedikit coin cet untuk membuat decentralized voting systems.

# Smart Contract Voting

Berikut ini adalah sample smart contract yang bisa anda gunakan untuk membuat decentralized voting sistem, atau voting berbasis blockchain, jika anda mahir dalam bahasa (code) solidity, anda bisa memodifikasinya sesuai dengan kebutuhan.

Ini adalah code smart contract yang ditulis menggunakan bahasa solidity, yang memungkinkan untuk menerapkan kontract pemungutan suara didalam blockchain, ini akan menjadi solusi pemungutan suara elektronik yang mencegah suara ganda atau duplikasi ganda.

Link Download Code Smart Contract Voting : Download

pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;

contract Voting  {
mapping(uint=>Candidate) public candidateIndex;
mapping(address=>bool) public aCandidate;
mapping(address=>bool) private hasVoted;

uint public candidateCount;
struct Candidate{
    string name;
    uint id;
    uint voteCount;
    address _add;
}


modifier isNotCandidate(address _target){
    require(aCandidate[_target]==false,'You are already registered as a candidate');
    _;
}

modifier isCandidate(address _target){
    
    require(aCandidate[_target]==true,'Not a valid candidate');
    _;
}

modifier onlyOwner{
    require (msg.sender==owner);
    _;
}


//requires that the deadline hasn't passed
modifier voteStillValid(){
    require (now<=deadlineInDays,"this election has expired"); _; } string public electionName; string public electionDescription; uint deadlineInDays; address public owner; event voted(uint _candidate); event newDeadlineSet(uint _newDeadline); constructor (string memory _name,string memory _description,uint _days) public { electionName=_name; electionDescription=_description; deadlineInDays=now+_days*1 days; owner=msg.sender; } //anyone who wants to become a candidate provided you are not a candidate before function becomeCandidate(string memory name) public voteStillValid() isNotCandidate(msg.sender){ candidateIndex[candidateCount]= Candidate(name,candidateCount,0,msg.sender); aCandidate[msg.sender]=true; candidateCount++; } //main vote function to vote for any candidateCount //makes sure you haven't voted before and you are not a candidate function vote(uint index) public voteStillValid() returns(bool){ require (aCandidate[msg.sender]==false,"you are a candidate"); require (hasVoted[msg.sender]==false,"you have already voted"); require (index>=0 && index <= candidateCount+1);
 candidateIndex[index].voteCount++;
 hasVoted[msg.sender]=true;
  emit voted(index);
 return (true);
}

//Returns all the candidates and their corresponding number of votes
function getCandidates() external view returns (string[] memory,uint[] memory){
    string[] memory names = new string[](candidateCount);
    uint[] memory voteCounts = new uint[](candidateCount);
    for (uint i = 0; i < candidateCount; i++) {
        names[i] = candidateIndex[i].name;
        voteCounts[i] = candidateIndex[i].voteCount;
    }
    return (names, voteCounts);
}

//This function returns the candidate with the highest number of votes at that point in time
function getWinner()public view returns(string memory,uint){
    uint winningVote=0;
    for(uint p=0;p<candidateCount;p++){ if (candidateIndex[p].voteCount>winningVote){
            winningVote=candidateIndex[p].voteCount;
            string memory winner= candidateIndex[p].name;
            return (winner,winningVote);
        }
    }
}

    //allows the election creator to set a new election deadline
    function setNewDeadline(uint _newDays) public onlyOwner voteStillValid returns(uint){
        deadlineInDays=now+_newDays*1 days;
        emit newDeadlineSet(deadlineInDays);
        return deadlineInDays;
    }
    
    //returns when the election will end
    function getDeadline() public view returns(uint){
        return deadlineInDays;
    }

} 

 

Membuat Decentralized Voting System di Blockchain Coinex Smart Chain

# Compile Smart Contract

  • Buka situs remixEthereumIDE https://remix.ethereum.org/ , buat file baru di sana.
  • Paste smart contract “decentralized voting system”
  • Pilih compiler versi 5.17
  • Pilih “Enable Optimazation” masukan value 200
  • Tunggu proses compile,  5-10 menit

# Deploy Smart Contract

  • Environment : Pilih “injected provider metamask”
  • Pilih wallet yang anda gunakan
  • Pilih smart contract “voting”
  • Isi Nama untuk voting tersebut “_NAME”
  • Isi deskripsi untuk voting tersebut “_DESCRIPTION”
  • Isi jumlah hari (berapa hari voting itu tersedia) “_DAYS”
  • Klik “deploy”
  • Lakukan konfirmasi diwallet anda
  • Tunggu 3-5 detik , proses pembuatan smart contract voting akan selesai

# Test Voting

Berikut ini adalah informasi atau fitur dari smart contract :

  • becomeCandidate : ini adalah fitur yang memungkinkan wallet address untuk menjadi kandidat
  • setNewDeadline : ini adalah opsi untuk mengganti tanggal kedaluarsa, atau waktu berakhirnya pemilihan-voting
  • vote : ini adalah fitur untuk melakukan pemilihan atau voting
  • aCandidate : untuk menampilkan semua kandidat yang sudah terdaftar
  • candidateCount : untuk menampilkan jumlah kandidat
  • candidateIndex : untuk menampilkan semua informasi tentang kandidat
  • electionName : nama pemilihan/voting
  • getCandidates : untuk mengetahui apakah wallet yang anda cek adalah candidat
  • getDeadline : untuk mengetahui kapan waktu pemilihan berakhir
  • getWinner : untuk mengetahui pemenang pemilihan-voting
  • owner : untuk mengetahui pemilik smart contract

1# Menjadi kandidat : Calon kandidat harus mendafarkan wallet address ke smart contract tersebut, interaksi di  “becomeCandidate” masukan nama dan lakukan konfirmasi di wallet

2# Voting : Setelah kandidat mendaftarkan diri, sekarang anda bisa test voting, Untuk kandidat yang mendaftarkan untuk pertama kali akan mempunyai ID = 0 , dan kandidat selanjutnya mempunyai ID = 1 . Voting sesuai id tersebut, contoh “alita” mempunyai id 0, maka untuk voting alita anda harus memasukan value 0. Untuk melihat pemenang anda bisa klik di bagian “getWinner”

Anda juga bisa melihat pemenang sementara di “getWinner”, atau anda ingin mengganti durasi atau deadline pemilihan (gunakan fitur “setNewDeadline”

Selamat Mencoba


Alif Fahmi

hi , I'm Alif, I'm a blockchain & cryptocurrency lover, I love writing & learning, my job is web developer & crypto trader