Block Chain - 비트 코인 - 채굴

2023. 1. 12. 17:31기타

블록체인?

- 비즈니스 네트워크 내에서 정보를 투명하게 공유할 수 있도록 하는 고급 데이터베이스 메커니즘

- 블록체인 데이터베이스는 연쇄적으로 연결된 블록에 데이터를 저장

- 네트워크의 합의 없이 체인을 삭제하거나 수정할 수 없음

- 그 결과 블록체인 기술을 사용하여 주문, 결제, 계정, 기타 트랜잭션을 추적하기 위해 불변하거나 변경 불가능한 원장(기록 되는 장부 또는 계정 모음)을 생성할 수 있음

 

블록?

- 블록체인의 원소 개념

- 다수의 거래 정보의 묶음

- 블록의 이름 Height(높이)라는 용어로 표현

- 블록체인을 길게 이어진 수평선으로 보는 것이 아니라 한 칸 한 칸 쌓아나가 탑의 형태로 구성된다고 생각하여 Height(높이) 사용

 

블록체인 구조

식별자

Hash : 현재 블록의 해시값 = 다음 해시의 Previous Block Hash

Height : 블록의 헤더 정보를 모두 합산한 후 SHA256으로 변환된 값

 

헤더

Version : 해당 블록의 버전

Previous Block Hash : 이전 블록의 해시값

이 첫번째 블록을 genesis block이라 한다.

 

 

 

Merkle Root : 블록의 바디 부분에 저장된 트랜잭션(거래 정보) 들의 해시 트리

                    : 머클루트 값을 통해 단일 블록 내에 존재하는 트랜잭션의 무결성을 검증

                    : 머클루트 값을 이용하여 블록의 해시 값을 생성하였기 때문에 블록의 해시의 무결성도 함께 검증

 

Timestamp  :  대략적인 생성 시간,  1970년 1월 1일 자정부터 경과한 시간을 초 단위로 계산한 값

Difficulty Target : 해시 목표 값을 의미하는 지표

Nonce : 블록을 만드는 과정에서 해시 값을 구할 때 필요한 재료 역할

 

바디

Transaction 1 

Transaction 2  

Transaction 3  

Transaction 4  

...

Transaction n

트랜잭션 : A-B 거래 내용, B-C 거래내용...... 400G 정도의 거래내역 - 다른

 

 

기타정보

기타정보

 

블록 식별자

블록 식별자의 해시 값은 블록헤더를 모두 합한 뒤 SHA256  해시 함수에 2번 넣은 결과 값이다.

 

각 블록의 버전, 이전해시, 시간, 난이도, 난수 값을 구하기 위해

샘플 블록 https://blockchain.info/block-height/100000?format=json 을 활용하여 실습 진행

위 얻은 데이터는 Big-Endian으로 표기되어 있다.

이를 Little-Endian으로 수정하여 필요한 데이터 출력

 

// big endian, little endian 차이

https://jhnyang.tistory.com/172

 

[Byte Order 바이트 오더] 빅엔디안(Big Endian)과 리틀엔디안(little endian) - 1편

안녕하세요~~!! 오늘도 시작되는 말랑이몰랑이 블로그 포스팅입니다~ ㅎㅎ 오늘은 네트워크나 통신쪽을 공부한다면 알고 있어야 할 Byte Order 의 빅엔디안과 리틀엔디안에 대한 개념을 완전하게

jhnyang.tistory.com

import requests
import hashlib
import binascii

url         = f"https://blockchain.info/block-height/100000?format=json"
response    = requests.get(url=url)
block       = response.json()["blocks"][0]

header_version      = binascii.hexlify(int(block["ver"]).to_bytes(4, byteorder="little")).decode()
header_previoushash = binascii.hexlify(binascii.unhexlify(block["prev_block"])[::-1]).decode()
header_merklehash   = binascii.hexlify(binascii.unhexlify(block["mrkl_root"])[::-1]).decode()
header_time         = binascii.hexlify(int(block["time"]).to_bytes(4, byteorder="little")).decode()
header_bits         = binascii.hexlify(int(block["bits"]).to_bytes(4, byteorder="little")).decode()
header_nonce        = binascii.hexlify(int(block["nonce"]).to_bytes(4, byteorder="little")).decode()
print("header_version:", header_version)
print("header_previoushash:", header_previoushash)
print("header_merklehash:",header_merklehash)
print("header_time:",header_time)
print("header_bits:",header_bits)
print("header_nonce:",header_nonce)
_                   = header_version + header_previoushash + header_merklehash + header_time + header_bits + header_nonce
le_block_hash       = hashlib.sha256(hashlib.sha256(binascii.unhexlify(_)).digest()).digest()
be_block_hash       = binascii.hexlify(le_block_hash[::-1]).decode()
print(f"calc        : {be_block_hash}") 
print(f"validation  : {be_block_hash == block['hash']}")

=====================================================================================================================================
header_version: 01000000
header_previoushash: 50120119172a610421a6c3011dd330d9df07b63616c2cc1f1cd0020000000000
header_merklehash: 6657a9252aacd5c0b2940996ecff952228c3067cc38d4885efb5a4ac4247e9f3
header_time: 37221b4d
header_bits: 4c86041b
header_nonce: 0f2b5710
calc        : 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
validation  : True

 

header_version header_previoushash header_merklehash header_time header_bits header_nonce 

출력한 모든 데이터를 이어붙인 후 SHA256 2번 돌리면

000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e5061

값을 얻는다. 위 값이 이 블록이 해시값이다.

 

채굴?

채굴이란, 블록 식별자의 해시 값을 구하는 일

구해지는 해시의 기준이 Difficulty Target에서 정한 목표 값보다 낮아야 함

샘플 블록 https://blockchain.info/block-height/100000?format=json 을 활용하여 실습 진행

 

 

bits : 4c86041b (big-endian)

첫 바이트는 1b = 27

나머지 3바이트는 04 86 4c

난이도: 0x04864c000000000000000000000000000000000000000000000000 (27byte)

 

 

난이도: 0x000000000004864c000000000000000000000000000000000000000000000000

해시값: 0x000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e5061

난이도 > 해시값 확인 

nonce 값 지정가능

 

보상

Nonce를 변경하며 목표 값보다 낮은 블록 식별자 해시를 찾았다면

해당 내용을 전파하고, 검증이 완료되었다면

블록을 생성한 계정에게 보상(비트코인)이 주어진다.

 

2017년 10월 현재 채굴 보상은 블록당 12.5 BTC로 정해져 있으며 이 액수는 21만 블록이 지날 때마다 절반으로 줄어들게 되어 있다. 전체적인 비트코인 발행 수는 한정되어 있고 따라서 더 많은 코인이 채굴될수록 그 가치는 더욱 높아질 수밖에 없다. 따라서 블록당 비트코인의 수는 불가피하게 줄어들 수밖에 없지만 채굴자에게 주어지는 보상 가치는 전과 동일하거나 더 높아지게 된다.

 

참고:

https://2jinu.github.io/programing/blockchain/%EA%B0%9C%EB%85%90/%EA%B0%9C%EB%85%90-1.html

https://www.youtube.com/watch?v=Ca7Meu4z-F4 

 

 

'기타' 카테고리의 다른 글

AD서버 개념  (0) 2024.03.05
ad서버를 안전하게 운영하는 방안  (0) 2024.02.29