brunch

You can make anything
by writing

C.S.Lewis

by David Apr 23. 2018

블럭체인 어플리케이션 개발방법#4

Bitcoin Platform with Javascript

이번 글 에서는 여러가지 플렛폼(비트코인, 이더리움) 중 Bitcon blockain을 다운로드 하여 빌드한 버젼을 가지고 설명을 해드리도록 하겠습니다.


제가 설명해드리는건 bitcoin core developer guide 를 참고로 하였으니 해당 링크를 통해서 더 자세한 정보를 확인하시면 좋을것 같습니다..


우선 아주 아주 간단하게 시작을 해보고 추후에는 점차적으로 Bitcoin 블록 체인의 복잡한 부분까지 다루어 보도록 하겠습니다..


일단 시작하기에 앞서 가장 대중들에게 널리 알려진 Bitcoin blockchain 를 선택했구요

node version은 8.9.3 그리고 npm version은 5.5.1을 사용했습니다.


이전 글에서 여러번 언급을 한 부분 있지만  block chain 은 public 장부에 transaction 및 timestamp에 기록을 제공합니다. 이 시스템은 이전 거래 기록의 double spending을 방지 하기 위함입니다.


자, 본격적으로 터미널에서 명령어를 실행해볼까요?


mkdir BitcoinBlockchain

cd BitcoinBlockchain

npm install --save crypto-js

touch block.js


자, 저희는 방금 BitcoinBlockchain 디렉토리를 생성을 하고 crypto-js library  가 포함된 node_modules 디렉토리를 생성했습니다.

그럼 block.js 라는 화일을 이용해서 블럭을 생성해볼까요?


Bitcoin 은  SHA-256 암호 알고리즘을 사용하여 어떤 데이터에서든 서명이라고하는 문자열을 만듭니다. 각 블록은 고유하기 때문에 각 블록은 calculateHash () 함수를 사용하여 고유 한 해시를 생성합니다. calculateHash () 함수는 새 블록의 각 속성을 가져 와서 하나의 문자열로 함께 모아서 해당 문자열의 SHA-256 해시를 반환합니다. 각 블록은 이전 블록의 해시 (헤더)를 참조해야합니다. 이렇게하면 트랜잭션 및 다음 블록을 모두 기록하는 블록을 수정하지 않고 트랜잭션을 수정할 수 있습니다


자, 그럼 터미널로 돌아가서 테스트를 해보도록 할까요?



node

const Block = require(‘./block’)

new Block(0, “previous block’s header”, {coinAmount : 10}, Date())


자, 이러면 다음과 같은 output을 얻게 됩니다.


Block {
  index: 0,
  header: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855undefined',
  previousBlockHeader: 'previous block\'s header',
  transactions: { coinAmount: 10 },
  timestamp: 'Fri Dec 29 2017 11:37:33 GMT-0700 (MST)'
}


이제는 블록 당 하나의 간단한 트랜잭션을 포함 시키려고합니다.{coinAmount : 10}. 

앞으로 우리는 각 블록에 트랜잭션 collection (배열)을 갖게 될 것입니다. blockchain.js 파일을 만들고 blockchain 클래스를 작성해 볼까요?



자, 이러면 매번 새로운 블록 체인을 만들 때마다 제네시스(이전 글 참조) 블록이 완성 될 것입니다.


그럼 터미널로 돌아서 아래 명령어를 실행해 볼까요?


const Blockchain = require(“./blockchain”);

const Block = require(‘./block’);

let newBlockchain = new Blockchain();

newBlockchain.addBlock(new Block(1, “previous block header data”, {coinAmount : 5}, Date()));

newBlockchain.addBlock(new Block(2, “previous block header data”, {coinAmount : 3.55}, Date()));


각 블록의 previousBlockHeader 해시가 이전 블록의 'previousBlockHeader'해시와 동일한 지 확인해보세요..


Blockchain {
  chain:
   [ Block {
       index: 0,
       header: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855undefined',
       previousBlockHeader: 'This Is The Genesis Block',
       transactions: [Object],
       timestamp: 'Fri Dec 29 2017 12:02:33 GMT-0700 (MST)' },
     Block {
       index: 1,
       header: '35f87048396bd3386a35dc4ddf5fdb2c07c628ae510d00afda3714002a34b8a7Fri Dec 29 2017 12:13:46 GMT-0700 (MST)',
       previousBlockHeader: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855undefined',
       transactions: [Object],
       timestamp: 'Fri Dec 29 2017 12:13:46 GMT-0700 (MST)' },
     Block {
       index: 2,
       header: 'c2bd3f90136364832f43f87499888c6284f53deb9573c47fddd60c3d7e2313f5Fri Dec 29 2017 12:28:00 GMT-0700 (MST)',
       previousBlockHeader: '35f87048396bd3386a35dc4ddf5fdb2c07c628ae510d00afda3714002a34b8a7Fri Dec 29 2017 12:13:46 GMT-0700 (MST)',
       transactions: [Object],
       timestamp: 'Fri Dec 29 2017 12:28:00 GMT-0700 (MST)' }
    ]
}


자... 끝입니다 -.-;;

다음 시간에는 metaverse library를 이용한 transaction을 구현하는걸 다루어 보도록 하겠습니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari