본문 바로가기
Coding(코딩)/Blockchain 이론 정리

[Blockchain 개념 정리] - 블록생성, 채굴 어떻게 되는걸까?

by DevKev 2022. 9. 16.

먼저 실습에 참고되었던 사이트를 공유하면서 시작하겠습니다.

https://en.bitcoin.it/wiki/Difficulty

 

Difficulty - Bitcoin Wiki

See also: target What is "difficulty"? Difficulty is a measure of how difficult it is to find a hash below a given target. The Bitcoin network has a global block difficulty. Valid blocks must have a hash below this target. Mining pools also have a pool-spe

en.bitcoin.it

 

[실습] 

1) target으로 difficulty, diffiiculty로 target 구해보기

2) current_difficulty로 current_target값 구하기

3) current_target값과 블록 해시 비교해보기

 

이 과정을 하는 이유는 블록해시 값이 target값 보다 작아져야 블록이 생성되는 조건이 되기 때문에, 어떻게 블록이 생성되는지에 대한 이해를 하기 위해서 계산하는 과정입니다.

 

다음의 블록에 대한 해시(hash) 값과  난이도(difficulty) 값을 통해 target을 유추합니다.

 

Block 754,283 hash (X)

0x 0000 0000 0000 0000 0007 fcca 7a8c 980f 8493 8ca7 cc05 1f7b 2831 2567 f96a 2aab

 

difficulty = difficulty_1_target / current_target

 

e.g. difficulty_1 = 0x1d00ffff (제네시스 블록,. 블록 난이도 초기값)

target = index_1 * 2 ^ (8 * (index_2 - 3))

여기서, index_1 = 뒤의 6자리(00ffff), index_2 = 앞의 2자리(1d) 입니다.

16진수를 10진수로 변환다면 index들의 값은 다음과 같습니다.

index_1 = 65534

index_2 = 29

 

따라서, difficulty를 계산하면 다음과 같은 16진수가 나옵니다.

0x00ffff * 2**(8*(0x1d - 3)) = 0x00000000FFFF0000000000000000000000000000000000000000000000000000

10진수로는 2.6959123914871979191645937602428e+67의 값이 나옵니다.

이 숫자를 변환했을 때 위의 16진수와는 완전 똑같이 안나오는데 이는 표현된 자리수 때문에 그렇습니다.

 

Current_target (Y)

= difficulty_1_target / difficulty

= 2.6959123914871979191645937602428e+67 / 32,045,359,565,303

= 0x  0000 0000 0000 0000 0008 c88b 3763 376e 8000 0000 0000 0000 0000 0000 0000 0000

 

자 그럼 두개의 값을 비교해 보겠습니다.

Block hash(X) < Current_target(Y)의 조건을 만족해야 블록이 생성됩니다.

(X) 0x 0000 0000 0000 0000 0007 fcca 7a8c 980f 8493 8ca7 cc05 1f7b 2831 2567 f96a 2aab

(Y) 0x 0000 0000 0000 0000 0008 c88b 3763 376e 8000 0000 0000 0000 0000 0000 0000 0000

 

진한 글씨를 주목해보면 X<Y의 조건을 만족합니다. 따라서 블록이 생성되었습니다.

 

정리하면,

타겟값은 난이도에 따라 설정되는 값이며,

그 타겟값보다 적은 해시값을 가장 먼저 구한 노드가 블록을 생성한다.

라고 생각하면 됩니다.