파이썬 웹훅을 활용한 블록체인 기반 투표 시스템 구축하기

블록체인 기술은 분산된 데이터베이스와 암호화 기술을 활용하여 신뢰성과 안정성이 높은 시스템을 구축할 수 있습니다. 이번 포스트에서는 파이썬 웹훅(Webhooks)을 사용하여 블록체인 기반의 투표 시스템을 구축하는 방법에 대해 알아보겠습니다.

웹훅(Webhooks)이란?

웹훅은 웹 서비스 간의 실시간 이벤트 통신을 위한 메커니즘입니다. 한 서비스에서 발생하는 이벤트를 다른 서비스로 푸시하는 방식으로 동작합니다. 이를 통해 실시간으로 데이터를 전달하고 처리할 수 있습니다.

투표 시스템 구축하기

1. 필요한 패키지 설치하기

pip install Flask
pip install requests
pip install web3

2. 스마트 컨트랙트 작성하기

블록체인에서 투표 시스템을 구축하기 위해 스마트 컨트랙트를 작성해야 합니다. 스마트 컨트랙트는 Solidity 언어로 작성되며, 투표의 유효성을 검증하고 결과를 저장하는 역할을 합니다.

pragma solidity ^0.8.0;

contract Voting {
    mapping(address => bool) public hasVoted;
    mapping(bytes32 => uint) public voteCount;

    event Vote(address indexed voter, bytes32 candidate);

    function vote(bytes32 candidate) public {
        require(!hasVoted[msg.sender], "Already voted!");
        
        hasVoted[msg.sender] = true;
        voteCount[candidate]++;

        emit Vote(msg.sender, candidate);
    }
}

3. Flask 웹 서버 구축하기

from flask import Flask, request
from web3 import Web3

app = Flask(__name__)
w3 = Web3(Web3.HTTPProvider("https://ropsten.infura.io/v3/YOUR_INFURA_PROJECT_ID"))
contract_address = "YOUR_SMART_CONTRACT_ADDRESS"
contract_abi = [
    {
        "constant": False,
        "inputs": [{"name": "candidate", "type": "bytes32"}],
        "name": "vote",
        "outputs": [],
        "payable": False,
        "stateMutability": "nonpayable",
        "type": "function"
    }
]
contract = w3.eth.contract(address=contract_address, abi=contract_abi)

@app.route('/vote', methods=['POST'])
def vote():
    data = request.json
    
    candidate = data['candidate']
    private_key = data['private_key']
    
    account = w3.eth.account.privateKeyToAccount(private_key)
    nonce = w3.eth.getTransactionCount(account.address)
    gas_price = w3.eth.gasPrice
    
    # 트랜잭션 생성
    tx = contract.functions.vote(candidate).buildTransaction({
        'gas': 100000,
        'gasPrice': gas_price,
        'nonce': nonce,
    })
    
    # 트랜잭션 서명
    signed_tx = account.signTransaction(tx)
    
    # 트랜잭션 전송
    tx_hash = w3.eth.sendRawTransaction(signed_tx.rawTransaction)
    
    return tx_hash.hex()

if __name__ == '__main__':
    app.run()

4. 투표 결과 확인하기

투표 결과를 확인하기 위해 블록체인 탐색기를 사용할 수 있습니다. 예를 들어, Etherscan에서 트랜잭션 해시를 검색하고 해당 트랜잭션의 입력 데이터를 확인할 수 있습니다. 이를 통해 어떤 후보자에 대해 얼마나 많은 투표가 이루어졌는지 확인할 수 있습니다.

마무리

이번에는 파이썬 웹훅을 활용하여 블록체인 기반의 투표 시스템을 구축하는 방법에 대해 살펴보았습니다. 블록체인 기술을 활용하면 신뢰성과 안정성이 높은 시스템을 구축할 수 있으며, 투표 시스템 외에도 다양한 분야에 적용할 수 있습니다.