
$ cd ~/ // home 폴더 이동
$ mkdir block // 폴더 생성
$ cd block // block 폴더 이동
$ sudo touch block.js // js파일 생성
$ npm init //package.json 생성
$ npm i fs merkle crypto-js 모듈 설치
// #chainedBlock.js
const fs = require('fs')
const merkle = require('merkle')
const cryptojs = require('crypto-js')
class Block{
constructor(header, body){
this.header = header
this.body = body
}
}
class BlockHeader{
constructor(version,previousHash, timestamp, merkleRoot,bit,nonce){
this.version = version
this.previousHash = previousHash
this.timestamp = timestamp
this.merkleRoot = merkleRoot
this.bit = bit
this.nonce = nonce
}
}
// #chainedBlock.js
~~~(상위 코드 생략)
function getVersion(){ // 블록의 버전
const package = fs.readFileSync("package.json");
//console.log(JSON.parse(package).version);
return JSON.parse(package).version;
}
function createGenesisBlock(){ //초기 블록 생성하는 함수
const version = getVersion()
const index = 0
const previousHash = '0'.repeat(64) //#최초는 이전해쉬 없기 때문에 0으로 64자리 채워넣음
const timestamp = parseInt(Date.now()/1000)
const body = ['hello block']
const tree = merkle('sha256').sync(body)
const merkleRoot = tree.root() || '0'.repeat(64)
const bit = 0
const nonce = 0
//console.log("version : %s, timestamp : %d, body : %s", version,timestamp,body);
//console.log("previousHash : %d", previousHash);
//console.log("tree : %d",tree)
//console.log("merkleRoot : $d", merkleRoot);
const header = new BlockHeader(version,index, previousHash, timestamp, merkleRoot,bit,nonce)
return new Block(header, body)
}
const block = createGenesisBlock()
console.log(block)

(위 코드 이어서 사용)
// #chainedBlock.js
~~~(상위 코드 생략)
let Blocks = [createGenesisBlock()]
function getLastBlock(){
return Blocks[Blocks.length - 1]
}
// #chainedBlock.js
fucntion createHash(data){
const {version,previousHash, timestamp, merkleRoot,bit,nonce} = data.header
const blockString = version + previousHash + timestamp + merkleRoot + bit + nonce
const hash = cryptojs.SHA256(blockString).toString()
return hash
}
cosnt block = createGenesisBlock()
const testHash = createHash(block)
console.log(testHash)
# chainedBlock.js
function nextBlock(bodyData){
const prevBlock = getLastBlock()
const version = getVersion()
const index = prevBlock.header.index + 1
const previousHash = createHash(prevBlock)
const timestamp = parseInt(Date.now() / 1000)
const tree = merkle('sha256').sync(bodyData)
const merkleRoot = tree.root() || '0'.repreat(64)
const bit = 0
const nonce = 0
const header = new BlockHeader(version , index , previousHash , timestamp , merkleRoot , bit , nonce)
return new Block(header, bodyData)
}
# chainedBlock.js
function addBlock(bodyData){
const newBlock = nextBlock(bodyData)
Blocks.push(newBlock)
}
# chainedBlock.js
addBlock(['transaction1'])
addBlock(['transaction2'])
addBlock(['transaction3'])
console.log(Blocks)
