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

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

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

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

이번 포스팅에서는 블록을 채굴할때, 즉 컴퓨팅 파워로 마이닝 할때 실행되는 app.get(/mine) 함수 부분을 작성해보도록 한다. 


순서

1.먼저 마지막 블록을 가져온다.

2.마지막 블럭의 타입은 객체 이기 때문에 key:value 형태다. 'hash' 키 값으로 해당 value(이전블럭해쉬)를 가져온다.

3.현재 블럭데이터는 이전의 발생한 거래내역을 저장해야 하기 때문에 bitcoin객체의 pendingTransaction 배열에 담긴 값을 가져와서 넣어주고, index는 마지막 블럭 index + 1을 해준다.

4. 이제 nonce, blockHash를 구할 수 있는 값들을 다 구했다. 

5. 그리고 위의 값들을 이용해서 createNewBlock()을 만든다.


// 웹브라우저에 get 방식으로 /mine 주소를 입력했을 때 실행
app.get('/mine', function (req, res) {
//마지막 블럭을 가져온다.
const lastBlock = bitcoin.getLastBlock();

//마지막 블럭의 해쉬 값, 즉 이전 블럭의 해쉬값
const previousBlockHash = lastBlock['hash'];

//현재 블락의 데이터 : 미완료된 거래내역 + 블락의 index 값
const currentBlockData = {
transactions:bitcoin.pendingTransaction,
index:lastBlock['index'] + 1
};

//이전블락해쉬, 현재블럭 데이터를 proofOfWork에 넣고 맞는 hash값(0000sfaff...)을 찾고 해당 nonce 값을 리턴.
const nonce = bitcoin.proofOfWork(previousBlockHash,currentBlockData);
//이전블락해쉬, 현재블럭 데이터, nonce 값을 넣고 현재 블락의 해쉬 값 리턴
const blockHash = bitcoin.hashBlock(previousBlockHash,currentBlockData,nonce);

//새로운 블락을 생성하려면 nonce,previousBlockHash,blockHash 값이 필요하다.
const newBlock = bitcoin.createNewBlock(nonce,previousBlockHash,blockHash);

res.json({
note: "새로운 블락이 성공적으로 만들어졌습니다.",
newBlock : newBlock
})

})


채굴자에게 보상 제공

블락을 채굴한 사람에게 보상을 해줘야 한다. 그러기 위해서는 채굴한 사람의 주소를 알아야 한다. 여기서는 npm 을 이용해서 네트워크 아이디를 임의로 지정해줘서 보상을 해주도록 하겠다.

터미널을 열고 -> 개발폴더에 위치하고 -> 명령어 입력 -> npm i uuid --save 


설치가 완료되었으면 api.js 윗부분에 아래 코드 입력

//나의 네트워크 고유 아이디 생성
var uuid = require('uuid/v1');
var nodeAddress = uuid().split('-').join('');


그리고 채굴에 대한 보상을 위한 코드 작성 - 주석으로 //채굴에 대한 보상

보상을 위해 지금 해당 비트코인 객체에 새로운 거래가 발생을 시키고, 보상으로 10비트코인을 bosang 이 nodeAddress 즉 나의 네트워크(내가 채굴했으니깐) 키에 지급한다.

// 웹브라우저에 get 방식으로 /mine 주소를 입력했을 때 실행
app.get('/mine', function (req, res) {
//마지막 블럭을 가져온다.
const lastBlock = bitcoin.getLastBlock();

//마지막 블럭의 해쉬 값, 즉 이전 블럭의 해쉬값
const previousBlockHash = lastBlock['hash'];

//현재 블락의 데이터 : 미완료된 거래내역 + 블락의 index 값
const currentBlockData = {
transactions:bitcoin.pendingTransaction,
index:lastBlock['index'] + 1
};

//이전블락해쉬, 현재블럭 데이터를 proofOfWork에 넣고 맞는 hash값(0000sfaff...)을 찾고 해당 nonce 값을 리턴.
const nonce = bitcoin.proofOfWork(previousBlockHash,currentBlockData);
//이전블락해쉬, 현재블럭 데이터, nonce 값을 넣고 현재 블락의 해쉬 값 리턴
const blockHash = bitcoin.hashBlock(previousBlockHash,currentBlockData,nonce);

//채굴에 대한 보상
bitcoin.createNewTransaction(10,"bosang0000",nodeAddress)

//새로운 블락을 생성하려면 nonce,previousBlockHash,blockHash 값이 필요하다.
const newBlock = bitcoin.createNewBlock(nonce,previousBlockHash,blockHash);

res.json({
note: "새로운 블락이 성공적으로 만들어졌습니다.",
newBlock : newBlock
})
})


테스트하기

먼저 터미널을 열고 개발 폴더에 위치하고 npm start로 서버를 실행한다. 그리고 웹브라우저에 차례대로 아래 주소를 적어본다. (꼭 차례대로 하나씩 따라해보세요)


http://localhost:3000/blockchain  - 제네시스 블럭 생성


http://localhost:3000/mine - 2번째 블록채굴 + 보상(transactoins 배열에 객체형태로 들어가 있음)


http://localhost:3000/blockchain - 2번째 블록 연결


http://localhost:3000/mine -  3번째 블록채굴 + 보상


http://localhost:3000/blockchain - 3번째 블록 연결


http://localhost:3000/transaction - 거래내역 발생


http://localhost:3000/blockchain - 거래내역은 pendingTransaction 배열에 존재



http://localhost:3000/mine - 4번째 블록 채굴 + 위의 거래내역 + 보상


http://localhost:3000/blockchain - pendingTransaction 배열 비움 + 거래내역과 보상이 담긴 4번째 블록 연결


마무리


일단 여기까지 따라오느라 정말 고생이 많으셨습니다. 여기까지 따라치면서 위와 같은 출력이 나왔다면 블록체인 기술에 대한 이해가 조금 더 생겼으리리라 생각이 됩니다. 여기서 한템포 쉬었다가 다음 포스팅 부터 또 이어서 진행하도록 하겠습니다.아래에 소스코드를 첨부했으니 참고하시면 될 것 같습니다.


소스코드

blockchain.zip


반응형

댓글