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을 구현하는걸 다루어 보도록 하겠습니다.