티스토리 뷰

반응형

개요

 

채굴 난이도에 대해서 다시 , 정리해보고

실제 비트코인 블록의 값들에서 다음 채굴 난이도를 계산해보자.

 

* 계산값과 정답이 일치하진 않았다. 실제 구현코드 또는 숫자들의 연산을 처리한 웹페이지의 정확도 등의 문제가 아닐까 싶음

 

 

채굴 난이도에 대한 요약정리

 

비트코인 블록 540277 있는 난이도 정보를 보자.

 

- 링크: https://www.blockchain.com/en/btc/block-height/540277

- Difficulty 6,727,225,469,722.53

- Bits 388618029 = 0x1729D72D

 


 

 

- Difficulty 가장 쉬운 난이도 (=Genesis 블록의 난이도) 배나 어려운가를 의미한다. 6,727,225,469,722.53 배나 어렵다는 것이다.

- Bits 비트코인만의 target 표현방식이라고 보면 된다.

- 0x1729D72D 라는

- 0x29D72D * 2 ** (8 * (0x17-3)) 이라는 거다.

- 수식을 좀더 전개하면 0x29D72D * 2 ** (160) = HEX 표현시 0x29D72D 뒤에 HEX 0 40 붙는다.

- 이걸 HEX 표현하면 0x 0000 0000 0000 0000 0029 D72D 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

 

 

채굴이란 결국 다음과 같다.

생성될 있는 해시 2 ** 256

0x 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 부터

0x FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF 까지 중에서

0x 0000 0000 0000 0000 0029 D72D 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 같거나 작은 값이 나올때까지

해시를 계속 생성하는 것이다. 

참고로, 제네시스 블록의 Bits == 가장 낮은 난이도 일때의 타겟값은 아래와 같다.

- 링크: https://www.blockchain.com/en/btc/block-height/0

- Bits:  486604799 = 0x1D00FF

0x 0000 0000 ffff 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

 

* 여기까지의 요약

- 채굴은 블록헤더의 Bits 의미하는 Target 값과 같거나 작은 값을 찾는 것이다.

- Difficulty 제네시스 블록의 Bits 일때의 난이도를 1이라 했을때에 현재의 난이도 비율을 표현한 것이다.

 

 

비트코인 블록 540277 해시가 Bits 만족하는지 보자.

 

- 링크: https://www.blockchain.com/en/btc/block-height/540277

 


 

블록 540277 해시

0x 0000 0000 0000 0000 000c 34c1 851b 84f2 0f30 0cea 21e5 6e32 ff2c bc80 f5c2 bca3

블록 540277 Bits (위에서 계산한 )

0x 0000 0000 0000 0000 0029 D72D 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

Bits (=target) 보다 해시가 작은 값이어야 한다.

작은 값인 것을 있다.

 

난이도 계산을 확인해보자.

 

난이도 공식은 difficulty = difficulty_1_target / current_target

 

블록 540277 에서

- Difficulty 6,727,225,469,722.53

- Current target 0x 0000 0000 0000 0000 0029 D72D 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

- Difficulty_1_target 0x 0000 0000 ffff 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 

 

값을 전부 십진수로 계산해보면 ( https://defuse.ca/big-number-calculator.htm )

- Difficulty 6,727,225,469,722.53

- Current target 0x00000000000000000029D72D0000000000000000000000000000000000000000

= 4007526641161212986792514236082843733160766044725313536

- Difficulty_1_target 0x00000000ffff0000000000000000000000000000000000000000000000000000

= 26959535291011309493156476344723991336010898738574164086137773096960

 

검산. Difficulty 계산해보자.

 

- Difficulty = 26959535291011309493156476344723991336010898738574164086137773096960 / 4007526641161212986792514236082843733160766044725313536 = 6.7272E12

 

 

다음 채굴 난이도 계산해보기

 

애초에 깔끔하게 정리하려 했는데

간결하게 줄이려는 욕심과 상세히 설명하려는 탐욕의 절충이 어렵다.

 

이제 실제 비트코인의 최근 블록에서 난이도를 계산해보자

 

계산 프로세스

 

- 참고링크: https://medium.facilelogin.com/the-mystery-behind-block-time-63351e35603a

 

1) 최신 블록중에서 가장 최근에 변경된 블록을 찾는다.

- 최근에 변경된 블록 = 최신블록번호 - (최신 블록번호 % 2016)

- 블록이 0부터 시작했기 때문에 위와 같이 계산할 있다.

2) 가장 최근에 변경된 블록의 Difficulty, Bits 확보해두자

- new_difficulty, new_target 확인

3) 바로 전의 블록의 시간과, 2015 블록 전의 시간을 알아두자

- 2016 블록전의 시간을 알아둬야는데 비트코인 코드의 오류라 한다. (수정하려면 하드포크 필요)

- 시간의 분단위 시간차이를 계산해두자.

4) 새로이 적용될 난이도 = new_difficulty 계산법은 다음과 같다.

new_difficulty = old_difficulty X (2016 blocks X 10 minutes) / (the time took in minutes to mine the last 2016 blocks)

 

- 사토시 나카모토가 설계한 이상적인 시간소요 = 2016 blocks X 10 minutes

- 실제 시간소요 = the time took in minutes to mine the last 2016 blocks

5) 이때 새로운 난이도가 이전 난이도의 4 이상이거나 1/4 이하이면,

- 각각 4, 1/4배로 잘라내어 급격한 난이도 변화를 예방한다.

6) 마지막으로 new_difficulty 에서 new_target 계산해낸다.

new_target =  difficulty_1_target / new_difficulty 

* difficulty_1_target

=   0x 0000 0000 ffff 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 

= 26959535291011309493156476344723991336010898738574164086137773096960

 

이렇게 계산된 new_difficulty, new_bits 실제 값과 비교해보자

 

실제 계산 예제

 

1) 최근 변경 블록 찾기

 

- 링크: https://www.blockchain.com/en/btc/block-height/

- 작성 시점 최신 블록번호는 541052

- 가장 최근에 난이도가 변경된 블록 = 541052 - (541052 % 2016) = 540288 https://www.blockchain.com/en/btc/block-height/540288

 

따라서,

- 하나 이전 블록은 540287 https://www.blockchain.com/en/btc/block-height/540287

- 2015 이전 블록은 540288 - 2015 = 538273 (비트코인 소스 버그로 2016 아닌 2015) https://www.blockchain.com/en/btc/block-height/538273

 

2) 최근 변경 블록의 Difficulty, Bits 기억해두자

 

- 나중에 실제 계산한 값과 비교

 

540288 https://www.blockchain.com/en/btc/block-height/540288

Difficulty: 7,019,199,231,177.17

Bits: 388503969 = 0x172819A1 = 0x 0000 0000 0000 0000 0028 19A1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

 

 


 

 

3) 바로 블록과 2015 이전 블록의 분단위 시간차이를 계산

 

540287 블록

- https://www.blockchain.com/en/btc/block-height/540287

2018-09-07 02:51:00

538273 블록

- https://www.blockchain.com/en/btc/block-height/538273

2018-08-24 17:07:00

 

시간차이를 계산

- 계산링크: http://www.grun1.com/utils/dateTimeDiff.cfm
- 19304



 

4) 새로이 적용될 난이도 계산

 

* 수들의 연산이라 오류가 있는 것인지, 혹은 실제 비트코인 소스에서 약간의 근사를 사용하는지 정확히 맞지는 않음

** 실제 비트코인 소스에서의 연산과 비교해볼 필요는 있으나 여기서는 생략

 

new_difficulty = old_difficulty X (2016 blocks X 10 minutes) / (the time took in minutes to mine the last 2016 blocks)

old_difficulty = 블록 538272 - 540287 에서 사용한 difficulty = 6,727,225,469,722.53

이상적인 소요시간 () = 2016 * 10 = 20160

실제 소요시간 ()  = 19304

new_difficulty = 6,727,225,469,722.53 * 20160 / 19304 = 7025531779403.554

- 계산사이트 링크: https://defuse.ca/big-number-calculator.htm

 


 

 

5) 이전 난이도의 4 이상, 1/4 이하가 아니므로 패스

 

6) new_difficulty 에서 new_target 계산해낸다.

 

new_target =  difficulty_1_target / new_difficulty 

difficulty_1_target

=   0x 0000 0000 ffff 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 

= 26959535291011309493156476344723991336010898738574164086137773096960

new_difficulty = 7025531779403.554

new_target = 26959535291011309493156476344723991336010898738574164086137773096960 / 7025531779403.554

=  대략 2.69 * 10^67 / 7025531779403.554

= 3,837,365,787,746,830,314,358,769,052,269,808,635,348,741,817,219,902,996.16

= 대략 0x 0000 0000 0000 0000 0028 1060 382D 82DE 8A0D A540 2A44 350D 97BC D654 30C3 6E14

 

 

최종 비교

 

- 약간 틀린데, 아무래도 코드 상에서 근사값을 사용한게 아닐까 싶음, 혹은 계산에 이용한 큰 숫자 연산 사이트의 정확도 오류.

* 이 오류에 대해 답을 알고 계신분은 알려주세요!!


Difficulty 정답: 7,019,199,231,177.17

Difficulty 계산: 7,025,531,779,403.554

Bits 정답: 0x 0000 0000 0000 0000 0028 19A1 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

Bits 계산: 0x 0000 0000 0000 0000 0028 1060 382D 82DE 8A0D A540 2A44 350D 97BC D654 30C3 6E14


반응형
댓글
댓글쓰기 폼