비트코인/비트코인 구조

[비트코인 구조] 작업증명(Proof-of-Work)과 난이도

라이튼 2022. 12. 30. 17:08

미리 알아야 할 내용들


 

[비트코인 기본 구조] 3. 작업증명(Proof-of-Work)

[비트코인 기본 구조] 2. 타임스탬프(Timestamp) [비트코인 기본 구조] 1. 이중 지불 문제 익명의 비트코인 개발자 사토시 나카모토는 2008년 논문과 함께 비트코인 코어를 처음 공개했습니다. 이렇게

kwjdnjs.tistory.com

 

[비트코인 구조] 비트코인 블록 기본 규칙

미리 알아야 할 내용들 [비트코인 구조] 비트코인 블록(Block) 기초 미리 알아야 할 내용들 [비트코인 기본 구조] 2. 타임스탬프(Timestamp) [비트코인 기본 구조] 1. 이중 지불 문제 익명의 비트코인 개

kwjdnjs.tistory.com

 

[비트코인 구조] 비트코인 해시 함수(sha-256, hash256, hash160)

비트코인 해시 함수(sha-256, hash256, hash160) 해시 함수는 입력 데이터를 고정된 길이의 해시값으로 변환하는 함수를 말합니다. 비트코인에서는 기본적인 해시 함수인 sha-256과 이를 응용한 hash256, has

kwjdnjs.tistory.com

 

[비트코인 구조] 빅 엔디안(Big endian)과 리틀 엔디안(Little endian)

빅 엔디안(Big endian)과 리틀 엔디안(Little endian) 엔디안(Endian)은 바이트가 저장되는 순서입니다. 빅 엔디안은 일반적으로 사람이 읽는 순서로, 리틀 엔디안 빅 엔디안의 역순으로 저장합니다. 예를

kwjdnjs.tistory.com


작업증명(Proof-of-Work)

 

 비트코인 블록체인에서 새로운 블록을 기존 블록에 연결하기 위해서는 작업증명을 진행해야 합니다. 작업증명에 성공할 경우 해당 블록은 기존 블록과 연결되어 블록체인에 포함되며, 성공한 노드는 보상으로 일정량의 비트코인을 받습니다. 이 과정 전체를 채굴이라고도 부릅니다.

 

 작업증명을 위해서는 두 값이 필요합니다. 하나는 비트코인 채굴 난이도를 조정하는 비트값이며, 다른 하나는 작업증명을 진행하기 위해 변경할 값인 논스값입니다. 두 값은 모두 4바이트의 리틀 엔디안 값이며, 블록 헤더 가장 뒤에 연속해서 위치해 있습니다.

 

 실제 작업증명이 어떻게 진행되는지 알아보기 위해 블록을 하나 가져오겠습니다. 다음은 비트코인에서 최초로 채굴된 제니시스 블록의 헤더입니다. 작업 증명은 블록 헤더만을 가지고 진행하기 때문에 블록 헤더만 불러오겠습니다.

 

 블록 헤더: 0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c

 

 비트와 논스 값은 가장 뒤에 위치한 각각 4바이트 리틀 엔디안 값입니다.

 

 비트: ffff001d

 논스: 1dac2b7c

 

  이제 위 값과 작업증명에 대해 본격적으로 알아보겠습니다.

 

목푯값과 난이도

 작업증명의 첫 단계는 목푯값을 확인하는 것입니다. 목푯값은 비트값을 이용하여 계산할 수 있습니다. 계산식은 다음과 같습니다.

 

 

 이때의 a와 b 값은 다음과 같습니다.

 

 a: 빅 엔디안 비트값의  2~4번째 바이트

 b: 빅 엔디안 비트값의 첫 1바이트

 

 즉 여기에서의 a값과 b 값은 다음과 같습니다.

 

 비트(리틀 엔디안): ffff001d

 비트(빅 엔디안): 1d00ffff

 a: 00ffff

 b: 1d

 

 이를 이용해 계산한 목푯값은 다음과 같습니다.

 

 목푯값: 00000000ffff0000000000000000000000000000000000000000000000000000

 

 목푯값을 구한 뒤 작업증명을 하는 과정은 매우 단순합니다. 논스값을 계속 변경하면서 목표값 보다 작은 블록 헤더 해시값을 찾으면 됩니다. 참고로 실제 비트코인 블록체인에서는 논스값 변경만으로는 부족하기 때문에 추가로 코인베이스 트랜잭션과 블록 헤더의 버전을 변경합니다.

 

 예를 들어 제네시스 블록의 논스값 1dac2b7c에 해당하는 블록 헤더의 리틀 엔디안 hash256 해시값은 다음과 같습니다.

 

 블록 헤더 해시값(리틀 엔디안): 0000000000916d86c980a51e5638e139f47f36ea642a6a1c273b1f6ba0c82ef6

 

 이 값을 목푯값과 비교해보면 블록 헤더의 해시값이 더 작다는 것을 알 수 있습니다. 즉, 작업증명에 성공했다는 사실을 알 수 있습니다.

 

 참고로 목푯값을 사람이 알아볼 수 있는 형태의 난이도로 변환할 수 있는 공식이 있습니다. 해당 공식은 다음과 같습니다.

 

 위 공식에서 t에 목푯값을 넣으면 난이도를 구할 수 있습니다. 제네시스 블록의 난이도는 다음과 같습니다.

 

 난이도: 1

 

 제네시스 블록의 난이도를 기준으로 하여 난이도를 계산하기 때문에 제네시스 블록의 난이도는 1 임을 알 수 있습니다.

 

 글 작성 기준 가장 최근의 난이도를 계산해 보겠습니다. 최근 블록의 비트값과 난이도는 다음과 같습니다.

 

 비트(빅 엔디안): 1707f590

 a: 07f590

 b: 17

 목푯값: 00000000000000000007f5900000000000000000000000000000000000000000

 난이도: 35364065900457.12

 

 과거에 비해 어마어마하게 난이도가 높아진 것을 알 수 있습니다.

 

난이도 조정

 비트코인 블록체인은 일정 기간을 두고 난이도를 조정합니다. 그 이유는 블록 생성 시간을 평균 10분으로 유지해야 하기 때문입니다. 채굴자가 증가할수록, 하드웨어 성능이 좋아질수록 작업증명에 성공할 가능성은 높아집니다. 반대로 채굴자가 감소할 경우 작업증명에 성공할 가능성은 낮아집니다. 즉, 블록 생성 시간을 평균 10분으로 유지하기 위해서는 계속해서 난이도를 조정해야 합니다.

 

 난이도 조정은 다음과 같은 공식으로 진행됩니다. 여기에서 사용하는 블록 생성 시간은 블록 헤더에 들어있는 유닉스 시간 타임스탬프를 활용합니다.

 

새로운 목푯값 = 현재 목푯값 * (실제 2016 블록 동안의 생성 시간 / 목표 2016 블록 동안의 생성 시간)

 

 조금 더 정확히는 다음과 같습니다.

 

새로운 목푯값 = 현재 목푯값 * {(기준 블록 대비 2016 이후 블록의 생성 시간 - 기준 블록의 생성 시간) / 평균 10분일 경우의 2016 블록 생성 시간)}

 

지금까지 작업증명과 난이도에 대해 알아봤습니다. 감사합니다.

 

 

이어지는 글들


 

[비트코인 구조] P2P 네트워크 연결

P2P 네트워크 연결 비트코인 노드들이 서로 데이터를 주고받기 위해서는 노드들간의 P2P 네트워크 형성이 필요합니다. 이를 위해서 각 노드들은 각자 몇 개의 노드와의 연결을 형성해야 합니다.

kwjdnjs.tistory.com