[BlockChain] JS로 블록체인 구조 짜보기

김동욱·2021년 12월 27일

Block Chain

목록 보기
2/2
post-thumbnail

블록체인 구조 짜보기


사전 준비

$ cd ~/  // home 폴더 이동
$ mkdir block  // 폴더 생성
$ cd block // block 폴더 이동
$ sudo touch block.js // js파일 생성

$ npm init //package.json 생성
$ npm i fs merkle crypto-js 모듈 설치

초기 블록 만들어보기

1. 블록 클래스 생성

// #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
     }
}

2. 초기블록 생성 함수 만들기

// #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)
}

3. 결과확인

const block = createGenesisBlock()
console.log(block)

연결된 블록 만들기

(위 코드 이어서 사용)

1. 마지막 블록 찾기

// #chainedBlock.js

~~~(상위 코드 생략)


let Blocks = [createGenesisBlock()]

function getLastBlock(){
	return Blocks[Blocks.length - 1]
 }

2. 이전 블록 해시값 생성

// #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)

3. 다음 블록 생성 함수

# 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)
}

4. 블록 추가하는 함수

# chainedBlock.js
	
function addBlock(bodyData){
	const newBlock = nextBlock(bodyData)
	Blocks.push(newBlock)
}

5. 결과 확인하기

# chainedBlock.js

addBlock(['transaction1'])
addBlock(['transaction2'])
addBlock(['transaction3'])
console.log(Blocks)

profile
웹 개발 관련 공부한 내용 기록하는 블로그입니다.

0개의 댓글