블록체인

머클 트리(Merkle Tree)

머클 트리(Merkle Tree)는 블록체인 및 분산 시스템에서 데이터 무결성을 검증하는 데 사용되는 해시 트리(Hash Tree)의 한 종류입니다.

1. 머클 트리 개념

머클 트리는 리프(leaf) 노드에 원본 데이터의 해시 값을 저장하고, 상위 노드(parent node)는 하위 두 개 노드의 해시 값을 다시 해시한 값을 저장하는 방식으로 구성됩니다. 최상위 루트 노드(Merkle Root)는 전체 데이터 세트의 해시를 대표합니다.

2. 머클 트리 구조

        Merkle Root
/ \
HashAB HashCD
/ \ / \
HashA HashB HashC HashD
  • 리프 노드: 개별 데이터 블록의 해시 값
  • 중간 노드: 하위 두 노드의 해시 값을 결합한 해시 값
  • 루트 노드(Merkle Root): 전체 데이터 무결성을 대표하는 최상위 해시 값

3. 머클 트리의 특징

  • 효율적인 검증: 루트 해시 값만 검증하면 전체 데이터의 무결성을 확인할 수 있습니다.
  • 빠른 검색 및 검증: 특정 데이터 블록의 무결성을 확인할 때 전체 데이터를 다운로드하지 않고도 검증할 수 있습니다.
  • 분산 시스템에서 활용: 비트코인, 이더리움 등 블록체인에서 트랜잭션 검증에 사용됩니다.

4. 머클 트리 사용 사례

  1. 블록체인: 트랜잭션 무결성 확인 및 블록 검증
  2. P2P 네트워크: 비트토렌트 같은 파일 공유 시스템에서 데이터 검증
  3. 데이터 무결성 검증: 분산 저장 시스템에서 데이터 변경 감지

5. 머클 트리 구현 코드

다음은 머클 트리(Merkle Tree)의 간단한 Python 구현 코드입니다. 이 코드에서는 SHA-256 해시 함수를 사용하여 머클 트리를 생성하고, 루트 해시 값을 계산하는 과정을 보여줍니다. 또한 특정 데이터가 트리에 포함되어 있는지 검증하는 기능도 포함합니다.

🔹 코드 설명:

  1. hash_data: 데이터를 SHA-256 해시로 변환합니다.
  2. build_tree: 리프 노드에서 시작해 재귀적으로 머클 트리를 생성하고, 최종적으로 루트 해시를 반환합니다.
  3. get_root: 머클 루트 해시 값을 반환합니다.
  4. verify_proof: 특정 데이터가 머클 트리에 존재하는지 확인합니다.
import hashlib

class MerkleTree:
    def __init__(self, data_list):
        """
        머클 트리를 초기화하고 루트 해시를 생성합니다.
        :param data_list: 원본 데이터 리스트 (리프 노드)
        """
        self.leaves = [self.hash_data(data) for data in data_list]
        self.root = self.build_tree(self.leaves)
    
    def hash_data(self, data):
        """SHA-256 해시 생성"""
        return hashlib.sha256(data.encode()).hexdigest()
    
    def build_tree(self, nodes):
        """머클 트리를 구축하고 루트 해시 값을 반환합니다."""
        if len(nodes) == 1:
            return nodes[0]  # 루트 노드
        
        if len(nodes) % 2 == 1:
            nodes.append(nodes[-1])  # 노드 개수가 홀수이면 마지막 노드를 복제
        
        parent_nodes = []
        for i in range(0, len(nodes), 2):
            combined_hash = self.hash_data(nodes[i] + nodes[i+1])
            parent_nodes.append(combined_hash)
        
        return self.build_tree(parent_nodes)
    
    def get_root(self):
        """머클 루트 반환"""
        return self.root
    
    def verify_proof(self, target_data):
        """
        특정 데이터가 머클 트리에 존재하는지 검증
        :param target_data: 검증할 데이터
        :return: 존재 여부 (True/False)
        """
        target_hash = self.hash_data(target_data)
        return target_hash in self.leaves

# 테스트용 데이터 리스트
data_list = ["apple", "banana", "cherry", "date"]

# 머클 트리 생성
merkle_tree = MerkleTree(data_list)

# 머클 루트 출력
print("Merkle Root:", merkle_tree.get_root())

# 특정 데이터 검증
print("Is 'apple' in Merkle Tree?", merkle_tree.verify_proof("apple"))
print("Is 'grape' in Merkle Tree?", merkle_tree.verify_proof("grape"))

🔹 실행 결과 예시:

Merkle Root: a3c8f8f7b5d9c2d8b7b9b5c1b6f9a3c...
Is 'apple' in Merkle Tree? True
Is 'grape' in Merkle Tree? False

zerg96

Recent Posts

노트북(윈도우)에서 아이폰 유선 테더링 하기

윈도우 운영체제의 노트북에서는 iPhone 유선 테더링이 잘 안되는 경우가 많습니다. 보통 iPhone의 드라이버가 설치가 안되있어서인…

3일 ago

오라클 래치(Latch)

오라클 데이터베이스의 성능을 논할 때, 내부적으로 발생하는 경합(Contention)은 피할 수 없는 주제다. 특히 다수의 프로세스가…

7일 ago

사장님도 3표, 나도 3표? ‘3%룰’ 완전 정복!

안녕하세요, 혹시 이런 생각해 본 적 없으신가요? "내가 투자한 회사는 누가 감시하고, 어떻게 운영될까?" 오늘은…

3주 ago

Vector Store(벡터 스토어)

'벡터 스토어' 완벽 가이드: AI 시대, 데이터의 새로운 심장을 만나다 IT 업계는 인공지능(AI)이라는 거대한 패러다임의…

3주 ago

Gemini CLI (재미나이 CLI)

1. Gemini CLI란 무엇인가요? Gemini CLI는 터미널 환경에서 직접 Gemini 모델과 상호작용할 수 있도록 만들어진…

3주 ago

과적합 (overfitting)

과적합은 머신러닝에서 학습용데이터를 과하게 학습하여, 실제데이터를 예측하지 못하는 현상을 말합니다. 인공지능(AI)의 학습 방법은 우리가 시험공부를…

1개월 ago