티스토리 뷰

blockchain

SHA-256 Bitcoin

fistful 2018. 9. 1. 13:36
반응형

SHA-256 씨리이즈

 

 

- 참고링크: http://www.righto.com/2014/09/mining-bitcoin-with-pencil-and-paper.html

- 채굴과정 상세설명 링크: http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html

 

결론부터 (TL;DR)

 

- 비트코인의 블록에서 80 바이트 만큼의 정보를 추출해내서, double SHA-256 먹인 값이 블록의 해시값이다.

- 추출해내는 정보는 6개이며, Little Endian 이다.

 

version

블록을 만든 비트코인 프로그램 버전

previous block hash

이전 해시값

merkle root

블록의 거래정보에서 계산해내는 해시

time

UNIX epoch time

difficulty bits

채굴 난이도

nonce

채굴 조건에 맞는 해시가 나올때까지 값을 변경하며 해싱한다.

 

채굴과정 요약

 

1) 채굴자들은 비트코인 거래들을 묶어서 블록으로 만든다.

2) 거래내용, 이전 해시, 시간 정보등의 고정된 + nonce 라는 바꿀 있는 double SHA-256 하여

3) 규칙을 만족하는 ( 개이상의 0으로 시작하는 해시) 해시값을 찾는다.

 

 

해시함수

 

1) 블록체인은 해시함수로 입력 메시지를 고정크기의 예측불가능한 값으로 만들어주는데

2) 비트코인은 SHA-256 먹이는 double SHA-256 쓴다.

double SHA-256  "length-extension" attack 에 대응할 수 있다고 한다https://goo.gl/2dTS9D

 

 

비트코인의 블럭 (=입력 메시지)

 

왼쪽의 블럭의 노란색이 입력값 (80 바이트) 이고 해시하면 오른쪽의 블록에 대한 해시가 나오게 된다.

 


 

< 출처:  http://www.righto.com/2014/09/mining-bitcoin-with-pencil-and-paper.html >

블럭 입력

 

0200000017975b97c18ed1f7e255adf297599b55330edab87803c81701000000000000008a97295a2747b4f1a0b3948df3990344c0e19fa6b2b92b3a19c8e6badc141787358b0553535f011948750833

 

 

 

실제 비트코인 블럭에서 입력값을 만들어보자.

 

참고링크 (exmachinalibertas 댓글): https://www.reddit.com/r/Bitcoin/comments/6gl8ol/how_to_manually_verify_a_hash_from_a_block/

 

1) 블럭의 정보를 얻어낸다. (방법은 생략)

 

# bitcoin-cli 있는 환경에서 아래 명령을 사용하면 3번째 블럭의 정보를 가져올 있다.

$ bitcoin-cli getblockheader $(bitcoin-cli getblockhash 3)

# (That command gets the header info for block number 3.)

# You get:

{
  "hash": "
0000000082b5015589a3fdf2d4baff403e6f0be035a5d9742c1cae6295464449",
  "confirmations": 470914,
  "height": 3,
  "version":
1,
  "merkleroot": "
999e1c837c76a1b7fbb7e57baf87b309960f5ffefbf2a9b95dd890602272f644",
  "time":
1231470173,
  "mediantime": 1231469744,
  "nonce":
1844305925,
  "bits": "
1d00ffff",
  "difficulty": 1,
  "chainwork": "0000000000000000000000000000000000000000000000000000000400040004",
  "previousblockhash": "
000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd",
  "nextblockhash": "000000004ebadb55ee9096c9a2f8880e09da59c0d68b1c228da88e48844a1485"
}

 

2) 블록정보에서 입력값을 추출해보자.

 

- 실제로 블록의 헤더 정보는 6 파트로 구성된다.

- 버전, 이전블록의 해시, 머클루트, 시간, 난이도 비트, 논스

 

파트

() 블록에서의

Little Endian 으로 만들기

바이트 순서 반대로

version

0x00000001

0x01000000

previous block hash

0x000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd

0xbddd99ccfda39da1b108ce1a5d70038d0a967bacb68b6b63065f626a00000000

merkle root

0x999e1c837c76a1b7fbb7e57baf87b309960f5ffefbf2a9b95dd890602272f644

0x44f672226090d85db9a9f2fbfe5f0f9609b387af7be5b7fbb7a1767c831c9e99

time

1231470173

 

# UNIX epoch time

- https://www.unixtimestamp.com/

 


 

1)  int to hex

0x4966be5d

 

2) Big Endian to Little Endian

0x5dbe6649

 

difficulty bits

0x1d00ffff

0xffff001d

nonce

1844305925

1) int to hex

0x6dede005

 

2) Big Endian to Little Endian

0x05e0ed6d

 

3) 최종 결과만 추려보면

 

파트

Little Endian 으로 만들기

바이트 순서 반대로

version

0x01000000

previous block hash

0xbddd99ccfda39da1b108ce1a5d70038d0a967bacb68b6b63065f626a00000000

merkle root

0x44f672226090d85db9a9f2fbfe5f0f9609b387af7be5b7fbb7a1767c831c9e99

time

0x5dbe6649

 

difficulty bits

0xffff001d

nonce

0x05e0ed6d

값들로 계산될 해시값

0000000082b5015589a3fdf2d4baff403e6f0be035a5d9742c1cae6295464449

 

줄로 만들면 80 바이트, 16진수 160 자리가 만들어진다.

 

0x01000000bddd99ccfda39da1b108ce1a5d70038d0a967bacb68b6b63065f626a0000000044f672226090d85db9a9f2fbfe5f0f9609b387af7be5b7fbb7a1767c831c9e995dbe6649ffff001d05e0ed6d

 

 

double SHA-256 구현

 

위에서 만든 입력값을 파이썬으로 구현된 double SHA-256 넣어보자

해시값이 정확하게 계산되었다. 0x0000000082b5015589a3fdf2d4baff403e6f0be035a5d9742c1cae6295464449

- 실습 링크: https://goo.gl/wAH43n

 


 

복습. 비트코인의 블록 하나의 정보를 가져와서, 해시값 계산을 해보자.

 

- 위의 내용을 반복하는 것이니 패스하셔도 됩니다.

 

1) 블록정보 가져오기 (bitcoin-cli 쓰지 않는 다른 방법)

 

- 링크를 가면 블록들 리스트가 보인다. https://www.blockchain.com/ko/btc/blocks

 


 

 

- "블록 높이" 항목의 아무 번호나 눌러보자. (여기서는 539428)

 


 

- 블록의 해시를 아래 API 끝에 추가해주면 된다.

 

- API: https://blockchain.info/rawblock/

- API+해시: https://blockchain.info/rawblock/00000000000000000026dd17fa01e2bcf96bb5aa5e47d59b1fcb4a96e65e7a30

 


 

 

2) 값들로 입력값 만들어보기

 

hash ="00000000000000000026dd17fa01e2bcf96bb5aa5e47d59b1fcb4a96e65e7a30"

ver = 536870912

prev_block = "00000000000000000005263e6cd11321a794e3005026fd055d6f14a8eaf640c5",

mrkl_root ="853a1274cfd0d72ee8f2420e6a5207fab189384fcb825ad3bae2316cb2081ca3"

time = 1535769045

bits = 388618029

nonce = 1940955547

hash ="00000000000000000026dd17fa01e2bcf96bb5aa5e47d59b1fcb4a96e65e7a30"

 

ver = 536870912 (to hex) 0x20000000 (to little endian) 0x00000020

 

prev_block = "00000000000000000005263e6cd11321a794e3005026fd055d6f14a8eaf640c5",

- (to little endian) 0xc540f6eaa8146f5d05fd265000e394a72113d16c3e2605000000000000000000

 

mrkl_root ="853a1274cfd0d72ee8f2420e6a5207fab189384fcb825ad3bae2316cb2081ca3"

- (to little endian) 0xa31c08b26c31e2bad35a82cb4f3889b1fa07526a0e42f2e82ed7d0cf74123a85

 

time = 1535769045 (to hex) 5B89F9D5 (to little endian) 0xd5f9895b

bits = 388618029 (to hex) 1729D72D (to little endian) 0x2dd72917

nonce = 1940955547 (to hex) 73B0A19B (to little endian) 0x9ba1b073

* 참고: 파이썬에서 Big endian (hex string) Little endian 으로 만들기

"".join(reversed([mrkl_root[i:i+2] for i in range(0, len(mrkl_root), 2)]))

"".join(reversed([prev_block[i:i+2] for i in range(0, len(prev_block), 2)]))

 

최종 입력값은 아래 순서로 이어붙여주면 된다.

version + previous block hash + merkle root + time + difficulty bits + nonce

00000020c540f6eaa8146f5d05fd265000e394a72113d16c3e2605000000000000000000a31c08b26c31e2bad35a82cb4f3889b1fa07526a0e42f2e82ed7d0cf74123a85d5f9895b2dd729179ba1b073

 

3) 최종 해시 계산

 

블록의 해시값이 계산되어 나왔다.

hash ="00000000000000000026dd17fa01e2bcf96bb5aa5e47d59b1fcb4a96e65e7a30"

 


 

 

SHA-256 하드웨어로 구현하기

 

1) 지금까지 살펴본 SHA-256 전부 비트연산이다.

2) 비트연산은 쉽게 디지털회로로 만들 있다.

3) 그렇게 수백개의 round function 병렬로 구성하여 칩으로 만든게 ASIC 이다.

- Application Specific Integrated Circuit - (블록체인에서 쓰는 SHA-256이라는) Application 특화된 (Specific) IC 라는 것이다.

- 초당 20억에서 30억번의 해시를 계산할 있다.

 

* 이렇게 하드웨어적으로 만들기 어려운 해시 알고리즘도 있다. scypt: https://www.wikiwand.com/en/Scrypt

 


 

< 출처: http://www.righto.com/2014/09/mining-bitcoin-with-pencil-and-paper.html >


반응형
댓글
댓글쓰기 폼