티스토리 뷰
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: { |
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 >
'blockchain' 카테고리의 다른 글
bitcoin 에서 채굴할 다음 블록은 어떻게 결정하는가 (0) | 2018.09.07 |
---|---|
bitcoin block의 timestamp (0) | 2018.09.07 |
SHA-256 By Hand - Round Function (0) | 2018.08.31 |
SHA-256 By Hand - Message Expansion Function (0) | 2018.08.29 |
SHA-256 프로세스 정리 (0) | 2018.08.28 |
- Total
- Today
- Yesterday
- 티스토리챌린지
- OpenAI
- 제이펍
- Gin
- github
- 엉클 밥
- agile
- folklore
- 영화
- 인텔리제이
- Bug
- go
- strange
- intellij
- 2023
- golang
- clean agile
- 체호프
- 오블완
- notion
- 잡학툰
- 노션
- websocket
- ChatGPT
- API
- solid
- 독서
- 독서후기
- bun
- 클린 애자일
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |