티스토리 뷰
개요
비트코인의 채굴 난이도는 이전 채굴 시간을 참고하여
10분보다 빠르면 난이도를 높이고, 10분보다 늦으면 난이도를 올린다고 알고 있다.
우선 난이도의 개념을 이해해보고,
정확한 난이도 결정 알고리즘을 알아보자.
참고링크
- https://en.bitcoin.it/wiki/Difficulty
결론부터 간단히
채굴을 하는 각각의 노드가 (네트워크로 연결된 다른 노드와는 상관없이)
자신이 가지고 있는 블록체인의 기존 블록들에서 얻은 정보를 바탕으로
다음에 채굴할 블록의 난이도를 계산해낸다.
조금만 더 긴 결론
- 결론은 아래 내용을 다 따라 읽은다음, 다시 정리하듯 읽으면 도움이 될듯 하다.
1) 비트코인은 난이도 (difficulty)인 실수값 (float)를 자신만의 방식으로 블록에 명시한다. 2) 얼마나 어려운지는 결국 조건에 만족하는 해시 개수 / 전체 생성 가능한 해시개수 이다. - 해시는 256 비트이므로 2^256 개의 다른 해시를 생성할 수 있다.
3) 가장 쉬운 난이도일때의 조건에 만족하는 해시개수는 0xffff * 2^208 개 이다. - 이때의 만족하는 해시개수의 비율은 0xffff * 2^208 / 2^256 = 0xffff / 2^48 이 된다. - 이걸 뒤집으면 2^48 / 0xffff 만큼 해시를 계산하면 한 번 조건에 만족하는 해시가 나온다는 것이다. 4) difficulty 값에 2^48 / 0xffff (= 가장 쉬운 난이도일때에 해시계산 예상회수)를 곱해주면 - 해당 difficulty 값에서의 해시계산 예상회수가 된다. 5) 사토시 나카모토는 대략 10분마다 조건에 맞는 해시를 계산해내기를 원하였으므로 600 을 나눠주면 초당 해시계산회수가 나온다. - D * 2^48 / 0xffff / 600 = (대략) D * 2^32 / 600
6) 우리는 흔히 0의 개수로 난이도를 표현한다. - 하지만 정확히는 target 이다. target 을 만족하는 hash 개수이다. |
---------------- 절 삭 면 ----------------
하나씩 따라가보자
difficulty - 난이도란 무엇인가
target 이 있고, 그 target 보다 작은 hash 를 찾아야 하는데 그것이 얼마나 어려운지를 측정하는 것이다.
1) 현재 블록에서 80바이트를 추출하여, SHA-256 으로 해싱한 값이 특정 조건 (target 보다 작은 값)을 만족하면 채굴 성공
2) 80 바이트 중에서 (대표적으로)nonce 등을 brute force 로 계속 바꿔가며 조건을 만족하는 해시를 찾아내는게 채굴이다.
3) 확률적으로 찾기가 얼마나 어려운지 조절하게 되는데 그것이 난이도이다.
difficulty formula - 난이도 계산 공식
difficulty = difficulty_1_target / current_target
- target 들은 256 비트의 숫자이다.
- difficulty_1_target 은 난이도 측정방법에 따라 다를 수 있다.
1) difficulty_1_target - pool difficulty (pdiff)
- 앞의 32 비트가 0이고 나머지는 1이다
0x 0000 0000 FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF |
2) bitcoin 의 경우
- custom 한 실수 (float)이다. (precision 제한은 있다)
- bitcoin client 는 이를 근거로 난이도 근사치를 잡는다 (=bdiff)
- 좀더 자세한 것은 아래에 다룬다.
난이도는 블록에 저장된다.
- 난이도는 아래와 같이 블록에 저장된다. (=비트코인만의 custom floating point type)
- 난이도 실수 (float) 를 아래와 같이 표현하겠다는 것이다.
0x1b0404cb
이것을 풀어서 진짜 타겟을 계산하는 방법은 아래와 같다.
- 온라인 계산기: https://defuse.ca/big-number-calculator.htm
- 2192 는 HEX 로는 192/4 = 48 개의 0x0
0x0404cb * 2(8*(0x1b -3)) = 0x0404cb * 2(8*(27-3)) = 0x0404cb * 2(192) |
0x 0000 0000 0004 04CB 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
0x0404cb 에 해당하는 값은 0x008000 <= x <= 0x7fffff 의 범위를 가진다.
난이도 계산법 - bidff, pdiff
difficulty 1 (=가장 높은 난이도) 은 비트코인의 custom floating point type로 표현하자면 0x1d00ffff 이다.
위 공식대로 계산해보면
0x00ffff * 2 ** (8*(0x1d -3))
= 0x00ffff * 2 ** (8*26))
= 0x00ffff * 2 ** (208)), 즉 뒤로 이진수 0이 208개 (= HEX 52개) 나오고, 앞에 ffff 가 붙는다.
0x 0000 0000 ffff 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 |
그러면 예를 들어서 난이도를 계산해보자.
공식은 이렇다 difficulty = difficulty_1_target / current_target
따라서 difficulty = 0x00000000ffff0000000000000000000000000000000000000000000000000000 / 0x00000000000404CB000000000000000000000000000000000000000000000000
= (십진수: 변환은 여기서: https://defuse.ca/big-number-calculator.htm) 26959535291011309493156476344723991336010898738574164086137773096960 / 1653206561150525499452195696179626311675293455763937233695932416
= (링크: https://goo.gl/PdE9Xn) = 16307.4209385 (bdiff) |
||||
만약 pdiff 라면
difficulty = 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
/
= 26959946667150639794667015087019630673637144422540572481103610249215 / 1653206561150525499452195696179626311675293455763937233695932416
= (링크: https://goo.gl/cCbZYp) = 16307.6697738 (pdiff)
|
파이썬에서 구한다면, 아래와 같이 구현할 수 있다. (테일러 공식을 쓰면 더 빠르다)
import decimal,
math print 0x00ffff * 2**(8*(0x1d - 3)) / float(0x0404cb * 2**(8*(0x1b - 3))) |
현 시점의 난이도
링크: https://blockexplorer.com/api/status?q=getDifficulty
지금 클릭해보니 아래와 같이 난이도가 나온다.
{"difficulty":7019199231177.173} |
가장 빡센 난이도는?
1) current_target 이 0일 수는 없다. = 0으로 나눌 수는 없다.
2) 난이도 공식은 difficulty = difficulty_1_target / current_target 이므로
3) current_target 을 1로 잡았을때가 가장 빡센 난이도이다. (= maximum difficulty)
즉, difficulty = difficulty_1_target 이 된다.
= 26959535291011309493156476344723991336010898738574164086137773096960
= 대략 2^224 = 2E67
가장 쉬운 난이도는?
current_target = difficult_1_target 일 때이다 .
따라서, difficulty = difficult_1_target / difficult_1_target = 1
(중요) 계산한 난이도로 해시찾기가 얼마나 어려운지 알아보자.
(참고) 난이도를 변경하는 프로세스는 다음과 같다.
1) 매 2016 번째의 블록마다 (= 2016 의 배수가 되는 블록마다)
2) 지난 2015개의 블록들의 timestamp 를 확인한 다음
3) 다음 2016개의 블록 생성시의 난이도를 결정한다.
10분 * 2016 은 14일, 2주이다.
즉, 비트코인은 2016 블록이 약 2주마다 생성되도록
2주마다 2016 블록의 생성시간을 체크하여 난이도를 조정하는 것이다.
Network hash rate
- 몇번 해시값을 계산해야 정답이 나올지 확률을 알아보는 것이다.
- 우리가 확인한 난이도는 아래와 같다.
1) 가장 빡센 난이도: 대략 2^224 2) 가장 쉬운 난이도: 1 3) 예제 난이도 0x1b0404cb: 16307.4209385 |
- 256비트의 해시값이 생성된다고 하면, 생성될 수 있는 총 해시의 개수는 2^256
난이도가 1일때 target 을 만족하는 해시 개수는
- (= 가장 쉬울때에) target 은 difficult_1_target 은 0xffff * 2**208 이다. - 따라서, 만족하는 해시의 개수 = diffcult_1_target 보다 작은 값이므로
0xffff * 2**208 개가 있다. |
난이도가 D라면 target 을 만족하는 해시 개수는
난이도가 1일때의 개수를 / D로 나눈 개수가 된다. (0xffff * 2**208) / D
|
만족하는 해시를 찾을 수 있는 확률은
만족하는 해시 개수 / 전체 해시 개수 = ((0xffff * 2**208) / D) / 2**256 = (0xffff * 2**208) / (D * 2 ** 256) = 0xffff / (D * 2 ** 48)
|
따라서, 정답 해시 하나를 찾으려면 몇 번 해시를 계산해야 할까?
위 값을 뒤집으면 된다.
(D * 2 ** 48) / 0xffff
|
초당 몇번이나 해시를 계산해야 할까?
1) 난이도 D 일때에 총 해시계산 회수는 (D * 2 ** 48) / 0xffff
2) 사토시 나카모토는 10분마다 찾기를 원했다. 10분 = 600 초
3) 따라서 초당 해시계산 회수는 (D * 2 ** 48) / 0xffff / 600
- 수식을 근사해서 좀더 줄여주면 (D * 2 ** 32) / 600
difficulty 가 가장 쉬운 1이라면
2^32 / 600 = 7.1583E6 = 7,158,300 정도가 된다.
대략 초당 700만번 정도는 계산해줘야 한다.
difficulty 가 현시점에서는 7019199231177.173 이다.
- 링크 클릭해서 확인: https://blockexplorer.com/api/status?q=getDifficulty
- 따라서 7019199231177.173 * 7,158,300 = 5.024E19 = 50,240,000,000,000,000,000 번 계산해줘야 한다.
- 대략 초당 5000경번 계산해줘야 한다.
'blockchain' 카테고리의 다른 글
bitcoin 다음 채굴 난이도를 계산해보자 (1) | 2018.09.13 |
---|---|
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
- github
- 체호프
- 독서
- solid
- agile
- 2023
- websocket
- folklore
- 오블완
- strange
- clean agile
- API
- 엉클 밥
- intellij
- OpenAI
- 클린 애자일
- go
- 독서후기
- Bug
- 잡학툰
- golang
- 인텔리제이
- Gin
- 제이펍
- 영화
- 티스토리챌린지
- 노션
- notion
- bun
- ChatGPT
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |