티스토리 뷰

반응형

직접 만드는 나만의 블록체인 (2) – Python으로 Block과 Blockchain 클래스 구현하기


🧱 실전 구현을 시작해보자

지난 글에서는 블록체인의 구조와 작동 원리를 이론적으로 정리했습니다.
이번 글에서는 직접 Python 코드로 Block과 Blockchain 클래스를 구현하며
블록체인의 핵심인 “블록 연결 구조”를 만들어보겠습니다.

이 코드를 기반으로 앞으로 트랜잭션 처리, 마이닝, 네트워크 통신 기능도 확장해나갈 수 있어요.


✅ 개발 환경 세팅 (간단히)

  • Python 3.12 권장 ✅
  • 별도 외부 패키지 없이 진행 (기초 구현이 목적)
  • 파일명: blockchain.py

🔹 Step 1. Block 클래스 만들기

반응형

각 블록은 아래와 같은 정보를 담습니다:

  • index: 블록 번호
  • timestamp: 생성 시간
  • data: 트랜잭션 또는 임의 데이터
  • previous_hash: 이전 블록의 해시
  • nonce: 작업 증명을 위한 숫자 (다음 글에서 사용)
  • hash: 이 블록의 고유 해시
import hashlib
import time

class Block:
    def __init__(self, index, data, previous_hash):
        self.index = index
        self.timestamp = time.time()
        self.data = data
        self.previous_hash = previous_hash
        self.nonce = 0  # 나중에 마이닝에 사용
        self.hash = self.calculate_hash()

    def calculate_hash(self):
        block_string = f"{self.index}{self.timestamp}{self.data}{self.previous_hash}{self.nonce}"
        return hashlib.sha256(block_string.encode()).hexdigest()

✅ calculate_hash()는 블록 내용을 문자열로 변환하고, 이를 SHA-256으로 해시합니다.
이제 하나의 블록 객체를 생성하면, 자동으로 해시가 계산됩니다.


🔹 Step 2. Blockchain 클래스 만들기

이제 Block들을 이어주는 Blockchain 클래스를 만들어 보겠습니다.

class Blockchain:
    def __init__(self):
        self.chain = [self.create_genesis_block()]

    def create_genesis_block(self):
        return Block(0, "Genesis Block", "0")

    def get_latest_block(self):
        return self.chain[-1]

    def add_block(self, new_data):
        previous_block = self.get_latest_block()
        new_block = Block(
            index=previous_block.index + 1,
            data=new_data,
            previous_hash=previous_block.hash
        )
        self.chain.append(new_block)

Genesis Block은 블록체인의 첫 번째 블록으로, 하드코딩된 기본값입니다.
✅ 새로운 블록을 추가할 때는 항상 이전 블록의 해시를 참조해서 연결합니다.


🔍 테스트해보자!

이제 간단히 블록체인을 만들어보고, 출력해볼까요?

if __name__ == "__main__":
    my_chain = Blockchain()
    my_chain.add_block("First block after genesis")
    my_chain.add_block("Second block")
    my_chain.add_block("Third block")

    for block in my_chain.chain:
        print(f"Index: {block.index}")
        print(f"Timestamp: {block.timestamp}")
        print(f"Data: {block.data}")
        print(f"Prev Hash: {block.previous_hash}")
        print(f"Hash: {block.hash}")
        print("=" * 40)

✅ 실행 결과:

Index: 0
Data: Genesis Block
Prev Hash: 0
Hash: 79a1d8...

Index: 1
Data: First block after genesis
Prev Hash: 79a1d8...
Hash: c39f3a...

...

🔗 각 블록이 이전 블록의 해시를 정확히 참조하고 있는 걸 확인할 수 있어요.
이 구조야말로 블록체인의 변조 방지 메커니즘의 핵심입니다.


🚨 실전 꿀팁: 블록 무결성 검증 함수 만들기

나중에 블록체인이 조작되지 않았는지 확인하려면?
아래 함수를 사용하세요:

def is_chain_valid(self):
    for i in range(1, len(self.chain)):
        current = self.chain[i]
        previous = self.chain[i - 1]

        if current.hash != current.calculate_hash():
            return False
        if current.previous_hash != previous.hash:
            return False
    return True

✅ 이 함수는 체인을 순회하며 모든 블록의 해시와 이전 해시가 일치하는지 확인합니다.
데이터 위조 방지의 핵심 로직입니다.


🧠 정리

오늘 배운 핵심 설명

Block 클래스 블록의 데이터, 해시 계산 기능 포함
Blockchain 클래스 블록체인 연결 구조 구현
체인 무결성 검증 해시값 비교로 위조 여부 확인 가능
Genesis Block 체인의 출발점 역할을 하는 특별한 블록

📌 다음 글 예고

👉 (3) 작업 증명(PoW)과 마이닝 알고리즘 구현

  • 마이닝이 뭔지, 왜 필요한지
  • 실제 난이도 기반 해시 퍼즐 구현
  • 블록을 “채굴”하는 코드 직접 만들어 보기

 

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함
반응형