티스토리 뷰
개요
채굴 난이도에 대해서 다시 한 번, 정리해보고
실제 비트코인 블록의 값들에서 다음 채굴 난이도를 계산해보자.
* 계산값과 정답이 일치하진 않았다. 실제 구현코드 또는 큰 숫자들의 연산을 처리한 웹페이지의 정확도 등의 문제가 아닐까 싶음
채굴 난이도에 대한 요약정리
비트코인 블록 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 블록 |
2018-09-07 02:51:00 |
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 |
'blockchain' 카테고리의 다른 글
bitcoin 채굴 난이도는 어떻게 결정되는가 (0) | 2018.09.11 |
---|---|
bitcoin 에서 채굴할 다음 블록은 어떻게 결정하는가 (0) | 2018.09.07 |
bitcoin block의 timestamp (0) | 2018.09.07 |
SHA-256 Bitcoin (0) | 2018.09.01 |
SHA-256 By Hand - Round Function (0) | 2018.08.31 |
- Total
- Today
- Yesterday
- 티스토리챌린지
- notion
- bun
- 클린 애자일
- ChatGPT
- 2023
- strange
- 잡학툰
- 오블완
- 인텔리제이
- 제이펍
- Gin
- 노션
- 독서
- 영화
- websocket
- github
- go
- 독서후기
- API
- agile
- 체호프
- clean agile
- 엉클 밥
- intellij
- solid
- folklore
- Bug
- OpenAI
- golang
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |