기본 콘텐츠로 건너뛰기

비트코인 블록에서 머클 루트 계산

블록을 구성하는 트랜잭션들의 해시 값들로부터 계산하는 머클 루트는 블록 헤더에 포함됩니다. 이 문서에서는 머클 루트를 계산하는 과정을 소개하고 이를 구현하는 파이썬 소스 코드를 제시합니다.

배경 지식

엔디언



비트코인 블록 정보

다음은 2개의 트랜잭션으로 이루어진 비트코인 블록 99,997의 머클 루트 값과 두 트랜잭션의 해시 값입니다.


이 블록의 머클 루트 값은 다음과 같습니다.

5140e5972f672bf8e81bc189894c55a410723b095716eaeec845490aed785f0e



두 트랜잭션의 해시 값은 다음과 같습니다.

0: b86f5ef1da8ddbdb29ec269b535810ee61289eeac7bf2b2523b494551f03897c
1: 80c6f121c3e9fe0a59177e49874d8c703cbadee0700a782e4002e87d862373c6

머클 루트 계산 과정

아래의 1번과 4번 과정은 비트코인 도구가 해시 값을 빅 엔디안으로 표현하고 있기 때문에 필요한 처리 과정입니다. 해시 문자열에서 연속하는 2개의 문자가 한 바이트에 대한 16진 표현에 해당합니다.

1. 트랜잭션의 해시 값을 리틀 엔디안으로 변환하기 (바이트 배열로 표현했을 때 역순으로 재배열)

0: 7c89031f5594b423252bbfc7ea9e2861ee1058539b26ec29dbdb8ddaf15e6fb8
1: c67323867de802402e780a70e0deba3c708c4d87497e17590afee9c321f1c680

2. 두 해시 이어 붙이기

7c89031f5594b423252bbfc7ea9e2861ee1058539b26ec29dbdb8ddaf15e6fb8c67323867de802402e780a70e0deba3c708c4d87497e17590afee9c321f1c680

3. 이어 붙인 해시에 대하여 두 번 연속 SHA256 해시 계산하기

0e5f78ed0a4945c8eeea1657093b7210a4554c8989c11be8f82b672f97e54051

4. 해시 값을 빅 엔디안으로 변환하기 (바이트 배열로 표현했을 때 역순으로 재배열)

5140e5972f672bf8e81bc189894c55a410723b095716eaeec845490aed785f0e

위의 4번 과정의 결과가 머클 루트입니다.

완전한 파이썬 코드

################################################################################
# Calculate Merkle Root                                                        #
################################################################################

import os, sys, traceback
import binascii
import hashlib

################################################################################
# Functions                                                                    #
################################################################################

def double_hash(hex):
   bin = binascii.unhexlify(hex)
   hash = hashlib.sha256(bin).digest()
   hash2 = hashlib.sha256(hash).digest()
   return binascii.hexlify(hash2)

def calculate_merkle_root(left, right):
    # Convert them in little-endian hex notation
    left  = binascii.hexlify(binascii.unhexlify(left)[::-1])
    right = binascii.hexlify(binascii.unhexlify(right)[::-1])

    # Concatenate the pair
    hex = left + right
   
    # Take double SHA256 hash
    hash = double_hash(hex)
   
    # Convert result to big-endian hex notation
    root = binascii.hexlify(binascii.unhexlify(hash)[::-1])
    root = str(root, "ascii")
   
    return root

def main():
    # Transaction hashes of BTC block # 99997
    h1 = 'b86f5ef1da8ddbdb29ec269b535810ee61289eeac7bf2b2523b494551f03897c'
    h2 = '80c6f121c3e9fe0a59177e49874d8c703cbadee0700a782e4002e87d862373c6'

    merkle_root = calculate_merkle_root(h1, h2)
    print(merkle_root)

################################################################################
# Main                                                                         #
################################################################################

if __name__ == '__main__':
    try:
        main()
    except:
        traceback.print_exc(file=sys.stdout)

댓글

이 블로그의 인기 게시물

Windows에 AMP와 MediaWiki 설치하기

1. 들어가기     AMP는 Apache + MySQL +  Perl/PHP/Python에 대한 줄임말이다. LAMP (Linux + AMP)라고 하여 Linux에 설치하는 것으로 많이 소개하고 있지만 Windows에서도 간편하게 설치하여 사용할 수 있다.       이 글은 Windows 7에 Apache + MySQL + PHP를 설치하고 그 기반에서 MediaWiki를 설치하여 실행하는 과정을 간략히 정리한 것이다. 2. MySQL     * 버전 5.6.12     1) 다운로드         http://dev.mysql.com/downloads/installer/         MySQL Installer 5.6.12         Windows (x86, 32-bit), MSI Installer         (mysql-installer-web-community-5.6.12.0.msi)     2) 다운로드한 MSI 파일을 더블클릭하여 설치를 진행한다.           설치 위치:                   C:\Program Files\MySQL               선택 사항:                       Install MySQL Products             Choosing a Se...

MATLAB Rutime 설치하기

MATLAB Rutime 설치하기 미설치시 에러 MATLAB Runtime 을 설치하지 않은 환경에서 MATLAB 응용프로그램이나 공유 라이브러리를 사용하려고 하면 아래와 같은 에러 메시지가 표시될 것입니다. 처리되지 않은 예외: System.TypeInitializationException: 'MathWorks.MATLAB.NET.Utility.MWMCR'의 형식 이니셜라이저에서 예 외를 Throw했습니다. ---> System.TypeInitializationException: 'MathWorks.MATLAB.NET.Arrays.MWArray'의 형식 이니셜라이저에서 예외를 Throw했습니다. ---> System.DllNotFoundException: DLL 'mclmcrrt9_3.dll'을(를) 로드할 수 없습니다. 지정된 모듈을 찾을 수 없습니다. (예외가 발생한 HRESULT: 0x8007007E) 위치: MathWorks.MATLAB.NET.Arrays.MWArray.mclmcrInitialize2(Int32 primaryMode) 위치: MathWorks.MATLAB.NET.Arrays.MWArray..cctor() --- 내부 예외 스택 추적의 끝 --- 위치: MathWorks.MATLAB.NET.Utility.MWMCR..cctor() --- 내부 예외 스택 추적의 끝 --- 위치: MathWorks.MATLAB.NET.Utility.MWMCR.processExiting(Exception exception) 해결 방법 이 문제를 해결하기 위해서는 MATLAB Runtime 을 설치해야 합니다. 여러 가지 방법으로 MATLAB Runtime 을 설치할 수 있습니다. MATLAB 이 설치되어 있는 경우에는 MATLAB 설치 폴더 아래에 있는 MATLAB Runtime 설치 프로그램을 실행하여 설치합니다. ...

Wi-Fi 카드 2.4GHz로만 동작시키기

Wi-Fi 카드 2.4GHz로만 동작시키기 별도의 Wi-Fi AP 장치를 두지 않고 아래와 같은 기기들로만 Wi-Fi 네트워크를 구성하고자 할 때 주변 기기들이 2.4GHz만 지원하기 때문에 PC에서 실행하는 AP가 항상 2.4GHz를 사용하도록 Wi-Fi 카드를 설정해 주어야 합니다. 기기 Wi-Fi 카드 주파수 대역 Wi-Fi Direct 지원 PC (Windows 10) 2.4GHz, 5GHz O 주변 기기들 2.4GHz X Wi-Fi 카드별 주파수 대역 선택 방법 Windows 시작 메뉴에서 설정 을 클릭합니다. Windows 설정 화면에서 네트워크 및 인터넷 을 클릭합니다. 설정 화면의 왼쪽 메뉴바에서 Wi-Fi 를 클릭합니다. 화면 오른쪽 관련 설정 구역에 있는 어댑터 옵션 변경 을 클릭합니다. 설정을 바꾸고자 하는 Wi-Fi 카드 항목을 선택하고 마우스 오른쪽을 누른 다음 속성 메뉴를 클릭합니다. 대화상자의 네트워킹 탭 화면에 있는 구성 버튼을 클릭합니다. 장치 속성 대화상자의 고급 탭 화면으로 이동합니다. 제시되는 속성 항목들은 제품별로 다르며 자세한 사항은 아래의 제품별 설명을 참고하여 값을 설정하시기 바랍니다. Intel Dual Band Wireless-AC 7265 기술 사양 주파수 대역: 2.4GHz, 5GHz 무선 표준: 802.11ac 주파수 대역 선택 장치 속성 대화상자에서 아래와 같이 선택합니다. Wireless Mode 1. 802.11a => 5GHz 4. 802.11b/g => 2.4GHz (이 항목 선택) 6. 802.11a/b/g => 2.4GHz, 5GHz Intel Dual Band Wireless-AC 8265 기술 사양 주파수 대역: 2.4GHz, 5GHz 무선 표준: 802.11ac 주파수 대역 선택 장치 속성 대화상자에서 아래와 같이 ...