자바스크립트로 블록체인 구현 강좌7 - 나만의 비트코인 발행하기(소스코드 포함)
자바스크립트로 블록체인 구현 강좌7 - 나만의 비트코인 발행하기
이번 포스팅에서는 블록체인 기술에서 핵심이라고 할 수 있는 작업증명 POW 개념을 알아보고 코드로 구현해 보자. 간단한 용어정리를 하고 넘어가자.
#용어정리
해쉬: 해쉬는 의미없는 데이터다. 컴퓨터에서 블럭의 길이를 맞추기 위해서 메모리에 작성된 의미없는 데이터다.
예)0000asdkflqwjkeljakldjflaj;
블럭: 해쉬를 가지고 있는 사람이 코인을 획득할 수 있는 블록을 의미
난이도: 블럭이 생성되는 시간을 일정하게 조정하기 위해 사용되는 개념
(전체 해쉬의 양 증가 -> 난이도 증가-> 블럭찾는데 더 많은 해쉬 필요 _> 블럭 생성시간 유지됨)
51% 공격: 전체 해쉬의 51% 이상 가진 집단이 존재할때 전체 코인의 이동정보, 즉 블록체인에 잘못된 정보가 전달 될 수 있다는 개념
pow: 컴퓨터간에 정보를 교환할때 통신방법에 대한 규칙이다. 많은 해쉬를 가진 사람이 코인을 획득할 수 있는 블럭을 더 많이 발견할 수 있는 시스템이다.
이전 포스팅에 이어서 blockchain.js에 작업증명을 담당하는 코드를 작성해보자.
#작업 순서도
1. bitcoin.hashBlock(previousBlockHash,currentBlockData,nonce) - test.js에서 호출 할 것이다.
2. 맞는 해쉬값(0000asldjflak)을 찾을 때 까지 반복적으로 1.번 작업을 실행한다.
3. 맞는 해쉬 값을 찾기 위해서 nonce를 변경해 가면서 찾는다.
4. 마지막으로 정확한 hash 값을 찾고 정확한 hash 값을 찾은 nonce 값을 리턴 한다.
이제 test.js에서 위에 blockchain.js에서 작성한 함수를 호출 해보자.
실행을 하면
이 값이 나온다.!!
함수가 총 141237번 실행 한뒤 맞는 해쉬 값을 찾았다. 그러면 이 nonce 값을 이용해서 그 맞는 해쉬 값이 무엇인지 한번 살펴보자.
test.js에서 해쉬블락 함수에 위에서 찾은 값 141237값을 넣었다. 어떤 해쉬 함수가 나올까?
결과
제네시스블록 생성
제네시스 블록을 생성해보자. 간단하다. blockchain.js 페이지에서 아래 소스 코드를 작성해준다. creatNewBlock 함수의 인자값은 임의로 넣어줘도 ok.
test.js 페이지로 와서 제네시스 블럭을 한번 찍어보자. 위에서 작성했던 noce 100 , hash 0 , previousBlockHash 0 값이 들어가있는 제네시스 블럭이 생성되었다.
마무리
이제 pow 방식으로 채굴하는 방식이 조금 이해가 될것이다. 맞는 해쉬값을 찾을때까지 pow함수를 반복하고 그 과정에서 수많은 nonce 값들이 변경된다는 사실. 그리고 이 방식이 왜 더 좋은 컴퓨팅 파워가 필요한지도 좀더 이해가 됐으리라 생각한다.
소스코드