본문 바로가기
매일코딩/블록체인-자바스크립트

자바스크립트로 블록체인 구현 강좌7 - 나만의 비트코인 발행하기(소스코드 포함)

by 인생여희 2018. 5. 29.
반응형

자바스크립트로 블록체인 구현 강좌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 값을 리턴 한다.


//pow 작업 함수 - 이전블록의 해쉬, 현재 블록 데이터와 nonce 값을 사용한다.
Blockchain.prototype.proofOfWork = function(previousBlockHash,currentBlockData){

let nonce = 0;
let hash = this.hashBlock(previousBlockHash,currentBlockData,nonce);
while(hash.substring(0,4) != '0000'){
nonce++;
hash = this.hashBlock(previousBlockHash,currentBlockData,nonce)
}
return nonce;
}


이제 test.js에서 위에 blockchain.js에서 작성한 함수를 호출 해보자.


//blockchain.js 모듈을 이곳에서 가져다 쓰겠다.
const Blockchain = require('./blockchain');


//위에서 가져온 모듈의 객체를 만든다.
const bitcoin = new Blockchain();

const previousBlockHash = "abcdedferefa"
const currentBlockData = [
{
amount: 10,
sender: 'BACKadffaaf',
recipient: 'HONGllalflks'

},
{
amount: 20,
sender: 'PACKadffaaf',
recipient: 'HONGllalflks'

},
{
amount: 30,
sender: 'PACKadffaaf',
recipient: 'HONGllalflks'

}
]

//pow 작업
console.log(bitcoin.proofOfWork(previousBlockHash,currentBlockData));


실행을 하면 

이 값이 나온다.!!

함수가 총 141237번 실행 한뒤 맞는 해쉬 값을 찾았다. 그러면 이 nonce 값을 이용해서 그 맞는 해쉬 값이 무엇인지 한번 살펴보자.


test.js에서 해쉬블락 함수에 위에서 찾은 값 141237값을 넣었다. 어떤 해쉬 함수가 나올까?

console.log(bitcoin.hashBlock(previousBlockHash,currentBlockData,141237))


결과


제네시스블록 생성

제네시스 블록을 생성해보자. 간단하다. blockchain.js 페이지에서 아래 소스 코드를 작성해준다. creatNewBlock 함수의 인자값은 임의로 넣어줘도 ok.

//블록체인 데이터 구조
function Blockchain(){
this.chain = [];
this.pendingTransaction = [];
//제네시스 블락 - 임의의 인자값 넣어준다.
this.createNewBlock(100,'0','0')
}


test.js 페이지로 와서 제네시스 블럭을 한번 찍어보자. 위에서 작성했던 noce 100 , hash 0 ,  previousBlockHash 0 값이 들어가있는 제네시스 블럭이 생성되었다.

//blockchain.js 모듈을 이곳에서 가져다 쓰겠다.
const Blockchain = require('./blockchain');


//위에서 가져온 모듈의 객체를 만든다.
const bitcoin = new Blockchain();

//제네시스 블락
console.log(bitcoin)


//제네시스 블락 !
// Blockchain {
// chain:
// [ { index: 1,
// timestamp: 1527475657742,
// transactions: [],
// nonce: 100,
// hash: '0',
// previousBlockHash: '0' } ],
// pendingTransaction: [] }


마무리

이제 pow 방식으로 채굴하는 방식이 조금 이해가 될것이다. 맞는 해쉬값을 찾을때까지 pow함수를 반복하고 그 과정에서 수많은 nonce 값들이 변경된다는 사실. 그리고 이 방식이 왜 더 좋은 컴퓨팅 파워가 필요한지도 좀더 이해가 됐으리라 생각한다.


소스코드

blockchain.zip

반응형

댓글