티스토리 뷰
반응형
직접 만드는 나만의 블록체인 (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)과 마이닝 알고리즘 구현
- 마이닝이 뭔지, 왜 필요한지
- 실제 난이도 기반 해시 퍼즐 구현
- 블록을 “채굴”하는 코드 직접 만들어 보기
'study > 블록체인' 카테고리의 다른 글
직접 만드는 나만의 블록체인 (4) – 트랜잭션과 지갑 시스템 구현하기 (0) | 2025.03.24 |
---|---|
직접 만드는 나만의 블록체인 (3) – 작업 증명(PoW)과 마이닝 알고리즘 구현 (0) | 2025.03.23 |
직접 만드는 나만의 블록체인 (1) – 블록체인의 구조와 작동 원리 이해하기 (1) | 2025.03.23 |
Web3.0의 한계와 극복 기술 – ZK-Rollups, State Channels, DAG 완전 정복 (0) | 2025.03.22 |
Web3.0과 분산형 클라우드 – IPFS와 Arweave로 진화하는 파일 저장의 미래 (0) | 2025.03.22 |
※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- SEO최적화
- SEO 최적화
- 프론트엔드면접
- llm
- 웹개발
- nodejs
- LangChain
- fastapi
- Webpack
- 개발블로그
- kotlin
- Python
- App Router
- 프론트엔드
- REACT
- nextJS
- github
- rag
- AI챗봇
- Ktor
- 백엔드개발
- Next.js
- seo 최적화 10개
- 관리자
- PostgreSQL
- Docker
- Prisma
- CI/CD
- NestJS
- gatsbyjs
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형