티스토리 뷰

반응형

직접 만드는 나만의 블록체인 (9) – 블록체인 네트워크 분산 실행 (Docker 배포 및 노드 간 연결)


🌍 블록체인, 이제 "진짜 네트워크"에서 동작해야 한다

이전 글에서는 브라우저에서 DApp을 통해 블록체인과 상호작용하는 방식을 구현했습니다.
하지만 여전히 단일 노드에서만 실행되고 있었습니다.

이번 글에서는 여러 개의 노드를 실행하고 서로 연결하는 방법을 다룹니다.
이를 통해 **블록체인의 가장 중요한 특징인 분산 네트워크(P2P)**를 직접 구현하고 배포할 것입니다.


✅ 목표

  • 여러 개의 블록체인 노드를 실행
  • Docker & Docker Compose를 사용해 손쉽게 네트워크 구축
  • 노드 간 자동 연결 및 블록 데이터 동기화

🏗 프로젝트 구조

my_blockchain/
├── blockchain.py         # 블록체인 로직
├── node.py               # 개별 노드 실행 코드
├── docker-compose.yml     # 여러 노드를 실행하는 설정 파일
└── Dockerfile             # 컨테이너 빌드 설정 파일

🔧 Step 1. 개별 노드 실행 코드 (node.py)

반응형
from flask import Flask, request, jsonify
import requests
import json
import sys

from blockchain import Blockchain, Transaction

app = Flask(__name__)
blockchain = Blockchain()
peers = set()  # 연결된 다른 노드들의 주소 저장

@app.route('/chain', methods=['GET'])
def get_chain():
    return jsonify([block.__dict__ for block in blockchain.chain])

@app.route('/transactions/new', methods=['POST'])
def new_transaction():
    data = request.get_json()
    tx = Transaction(**data)
    blockchain.add_transaction(tx)
    return jsonify({"success": True, "message": "트랜잭션이 추가되었습니다."}), 201

@app.route('/mine', methods=['GET'])
def mine():
    blockchain.mine_pending_transactions("miner-node")
    sync_chain()
    return jsonify({"success": True, "message": "블록이 마이닝되었습니다."})

@app.route('/peers', methods=['POST'])
def register_peer():
    data = request.get_json()
    peers.add(data['peer'])
    return jsonify({"success": True, "peers": list(peers)})

def sync_chain():
    longest_chain = blockchain.chain
    for peer in peers:
        try:
            response = requests.get(f"{peer}/chain")
            peer_chain = response.json()
            if len(peer_chain) > len(longest_chain):
                longest_chain = peer_chain
        except:
            continue
    blockchain.chain = longest_chain

기능 정리

  • /chain → 현재 체인 반환
  • /transactions/new → 새로운 트랜잭션 추가
  • /mine → 마이닝 수행 후 다른 노드와 데이터 동기화
  • /peers → 새로운 노드를 등록

🐳 Step 2. Docker 설정 (Dockerfile)

FROM python:3.12
WORKDIR /app
COPY . /app
RUN pip install flask requests
CMD ["python", "node.py"]

Docker를 사용하면 블록체인 노드를 컨테이너화하여 실행할 수 있음
→ 여러 개의 노드를 동시에 실행할 때 매우 편리


⚙️ Step 3. 여러 노드 실행 설정 (docker-compose.yml)

version: '3'

services:
  node1:
    build: .
    ports:
      - "5001:5000"
    environment:
      - PEERS=http://node2:5000
  node2:
    build: .
    ports:
      - "5002:5000"
    environment:
      - PEERS=http://node1:5000

Docker Compose를 사용하면 여러 개의 노드를 동시에 실행 가능
✅ 각 노드는 서로의 주소를 환경 변수로 전달받아 자동 연결됨


🚀 실행 방법

1️⃣ Docker 컨테이너 빌드

docker-compose build

2️⃣ 네트워크에서 여러 노드 실행

docker-compose up

3️⃣ 트랜잭션 전송 및 블록 생성 테스트

curl -X POST http://localhost:5001/transactions/new -H "Content-Type: application/json" -d '{"sender": "Alice", "recipient": "Bob", "amount": 10}'
curl -X GET http://localhost:5001/mine

🔁 네트워크 동기화 테스트

curl http://localhost:5002/chain

노드1에서 채굴한 블록이 노드2에도 자동 반영되는지 확인!


🧠 정리

개념 설명

Flask 블록체인 노드를 HTTP API로 관리
Docker 노드를 컨테이너로 실행하여 손쉽게 확장
Docker Compose 여러 노드를 동시에 실행하고 자동 연결
P2P 블록체인 네트워크 노드 간 체인 데이터 동기화

📌 다음 글 예고

👉 (10) 블록체인 API 최적화 및 보안 강화 – Rate Limiting, 인증, 서명 방식 개선

  • API 인증 및 서명 방식 추가
  • Rate Limiting 적용 (DoS 공격 방지)
  • 체인 데이터 검증 강화

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함
반응형