티스토리 뷰

개요

 

비트코인의 채굴 난이도는 이전 채굴 시간을 참고하여

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_1_target 0x1d00ffff

위에서 예로 0x1b0404cb

0x

0000 0000 ffff 0000

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

0x

0000 0000 0004 04CB

0000 0000 0000 0000

0000 0000 0000 0000

0000 0000 0000 0000

 

따라서 difficulty = 

0x00000000ffff0000000000000000000000000000000000000000000000000000 /  0x00000000000404CB000000000000000000000000000000000000000000000000

 

= (십진수: 변환은 여기서: https://defuse.ca/big-number-calculator.htm)

26959535291011309493156476344723991336010898738574164086137773096960 / 1653206561150525499452195696179626311675293455763937233695932416

 

= (링크: https://goo.gl/PdE9Xn) = 16307.4209385 (bdiff)

만약 pdiff 라면

 

difficulty =

0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF /
0x00000000000404CB000000000000000000000000000000000000000000000000

 

=

26959946667150639794667015087019630673637144422540572481103610249215 / 1653206561150525499452195696179626311675293455763937233695932416

 

= (링크: https://goo.gl/cCbZYp) = 16307.6697738 (pdiff)

 

 

파이썬에서 구한다면, 아래와 같이 구현할 있다. (테일러 공식을 쓰면 빠르다)

 

import decimal, math
l = math.log
e = math.e

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경번 계산해줘야 한다.


반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
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
글 보관함