티스토리 뷰

반응형

직접 만드는 나만의 블록체인 (3) – 작업 증명(PoW)과 마이닝 알고리즘 구현


⛏ 마이닝, 블록체인의 진짜 시작

앞에서 우리는 Python으로 블록과 체인을 만들었습니다.
이제부터 진짜 블록체인다운 기능인 **“마이닝(채굴)”과 “작업 증명(PoW)”**을 구현해보겠습니다.

작업 증명은 블록체인에서 블록 생성의 정당성을 증명하는 핵심 알고리즘입니다.
이를 구현하면 블록 생성 과정에 **"노력"**이라는 개념이 추가되고,
체인을 공격하거나 조작하는 데 어마어마한 연산 비용이 필요하게 됩니다.


✅ 작업 증명(PoW)이란?

목표: 특정 조건을 만족하는 해시를 찾기까지 수많은 계산을 수행하는 것.

즉, 아무나 막 블록을 추가하지 못하게 하고,
CPU 연산을 소모하게 하여 “노력”을 증명해야 블록이 유효하게 되는 구조입니다.

예시 – PoW 조건:

"SHA-256 해시값이 앞에서부터 4개의 0으로 시작해야 한다"

이런 조건을 만족하는 값을 찾기 위해 블록 안의 nonce 값을 계속 바꾸며 해시를 계산하는 과정을 반복합니다.


🔹 Block 클래스에 PoW 기능 추가

반응형
class Block:
    def __init__(self, index, data, previous_hash, difficulty=4):
        self.index = index
        self.timestamp = time.time()
        self.data = data
        self.previous_hash = previous_hash
        self.nonce = 0
        self.hash = self.calculate_hash()
        self.difficulty = difficulty

    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()

    def mine_block(self):
        print(f"🔨 Mining block {self.index}...")
        prefix = "0" * self.difficulty
        while not self.hash.startswith(prefix):
            self.nonce += 1
            self.hash = self.calculate_hash()
        print(f"✅ Block {self.index} mined: {self.hash}")

✅ 핵심 포인트

  • nonce: 해시 조건을 맞추기 위해 반복적으로 바꾸는 숫자
  • difficulty: 조건의 난이도 (숫자가 높을수록 채굴 어려움)
  • mine_block(): 조건을 만족할 때까지 해시를 계속 계산

🔹 Blockchain 클래스에서 블록 마이닝 적용

class Blockchain:
    def __init__(self):
        self.difficulty = 4  # 난이도 설정
        self.chain = [self.create_genesis_block()]

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

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

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

🧪 실행해보자!

if __name__ == "__main__":
    chain = Blockchain()
    chain.add_block("👾 블록 #1")
    chain.add_block("🧠 블록 #2")
    chain.add_block("🚀 블록 #3")

    for block in chain.chain:
        print(f"Index: {block.index}")
        print(f"Hash: {block.hash}")
        print(f"Nonce: {block.nonce}")
        print("=" * 30)

✅ 실행하면 각 블록을 마이닝하는 데 시간이 조금 걸리고,
해시값이 0000으로 시작하는 값으로 출력됩니다.


📈 난이도 조절과 보안성

난이도가 높아질수록:

  • nonce 계산 횟수 증가 → CPU 사용량 상승
  • 블록 생성 시간 길어짐
  • 공격자는 체인을 위조하려면 모든 블록을 다시 마이닝해야 함

✅ 이 구조 덕분에 블록체인은 변조가 극도로 어려운 시스템이 됩니다.


🔐 보너스: 블록 유효성 검증 로직 추가

def is_valid_proof(block, difficulty):
    prefix = "0" * difficulty
    return block.hash.startswith(prefix)

→ 앞으로 네트워크 노드에서 다른 노드가 보낸 블록을 검증할 때 이 함수를 사용할 수 있어요.


🧠 정리

개념 설명

작업 증명 (PoW) 조건을 만족하는 해시값을 찾는 연산 작업
마이닝 블록의 해시값이 조건을 만족할 때까지 nonce 값을 증가시키는 과정
난이도 앞에 필요한 0의 개수 (보안성과 연산량을 조절)
방어 메커니즘 블록을 조작하면 이전 블록까지 모두 다시 마이닝해야 하므로 공격이 사실상 불가능

📌 다음 글 예고

👉 (4) 트랜잭션과 지갑 – 공개키 기반 서명과 전송 구조 구현하기

  • 트랜잭션 객체 설계
  • 공개키/개인키를 이용한 지갑 생성
  • 서명/검증 기능 구현

 

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