dukDukz

[블록체인] 제네시스 블록 생성하기 본문

웹 개발/블록체인

[블록체인] 제네시스 블록 생성하기

헤일리_HJ 2021. 9. 1. 15:00

src 폴더 밖에 npm init


[block.js]


1. version

header에 넣을 version.
package.json의 version을 갖고오고 싶다.
fs 를 활용하자!

const fs = require('fs')

function getVersion(){
    const package = fs.readFileSync("../package.json")
    console.log(package);
}
getVersion()

 

이렇게 작성하고

$ cd src
$ node block

 

그러면 처음에는 버퍼로 나온다.

console.log(package.toString("utf8"));

 

이렇게 바꿔주면
package.json 의 내용 전체를 확인 할 수 있다.

 

 

# 객체로 가져오는 방법!

JSON.parse 를 사용하여 객체로 만들어준다.

console.log(JSON.parse(package));
{
    name: '0831blockchain',
    version: '1.0.0',
    description: '',
    main: 'index.js',
    scripts: { test: 'echo "Error: no test specified" && exit 1' },
    author: '',
    license: 'ISC'
}

 

이러한 객체가 나온다.

우리는 이중에 version 만 필요하니까

console.log(JSON.parse(package).version);

 

1.0.0
이렇게 나온다.



[version 가져오는 방법]


1) 방법 1

const package = fs.readFileSync("../package.json")
return JSON.parse(package).version



// console.log(package.toString("utf8"));
// console.log(JSON.parse(package).version);

일단 가져와서 JSON.parse 하기


2) 방법 2

const {version} = JSON.parse(fs.readFileSync("../package.json"))
return version

처음 가져올때부터 JSON.parse 로 가져옴

 

 

최종 함수

function getVersion() {
    const { version } = JSON.parse(fs.readFileSync("../package.json"))
    return version
}

 

 


2. timestampe

유닉스 기준일로 날짜 형식을 넣는다.
1970년 1월 1일 자정부터 0초 부터 현재 오늘날까지 총 몇초인가.
js 구하는 방법에 대해 알아보자

1) 날짜

console.log(new Date());        //2021-09-01T02:16:23.830Z

 

 

2) 현재 날짜를 시간으로 바꿔주는 메서드가 있다.

new Date().getTime()

 

1630462649285 [ms] 
이렇게..?

3) 1000을 나눠줘야 정확하게 얻을 수 있어서 나누면.

new Date().getTime()/1000

 

1630462699.911
이렇게 소수점으로 나오는데

 


4) 이걸 반올림 혹은 올림을 한다.

Math.ceil(new Date().getTime()/1000)

 

ceil : 올림



5) 최종 return

function getCurrentTime() {
    return Math.ceil(new Date().getTime() / 1000)
}

 

이렇게 시간을 구해왔다.

 

 


3. merkle

$ npm install merkle

실질적으로는 merkle tree 가 아니라 그냥 merkle 사용할거임

[block.js]

 

const merkle = require('merkle')
const CryptoJs = require('crypto-js')

 

 

# merkle 사용법 

const tree = merkle("sha256").sync(['aaaa'])
tree.root()

 

sync 안에는 배열만 (배열안에 객체는 가능)
return이 tree구조로 나온다.
const tree 로 담고 이거를 tree.root() 하면 root 애를 가지고 온다.


# 제네시스 블럭 만들기

 

이제 header body 내용 만들어야하고
1차 목표는 제네시스 블럭을 만드는 것

실습에서는 bits 는 빼겠다..!

최소기능 / 개념을 이해할 수 있을 정도만 해봅시다
Nonce 는 index로 대체 해서 해보겠다.
그래서 header 에는 5개를 넣어보자

[block.js]
class 생성

# 헤더 만들기

class BlockHeader {
    constructor(version, index, previousHash, time, merkleRoot) {
        this.version = version      //  1 new 생성자를 통해서 this.version 은 {version:1} 이렇게 된다
        this.index = index          // 2 {version:1, index : 2}
        this.previousHash = previousHash
        this.time = time
        this.merkleRoot = merkleRoot
    }
}

const header = new BlockHeader(1,2,3,4,5)   // new 를 사용해서 객체로. 가라데이터
const header2 = new BlockHeader(1,2,3,4,5)  // 2개를 만들고 싶다면
console.log(header, header2);


이런식으로 나온다

/* header 
{
    version : 1,
    index : 2,
    previousHash : 3,
    time : 4,
    merkleRoot : 5
}
이렇게 될것이다.

*/

붕어빵 틀이다...

func : fucn()
함수도 넣을 수 있다.

 

class Block {
    constructor(header,body){
        this.header = header,       //BlockHeader 에서 만든값을 넣겠다. 객체 안에 객체가 들어가게 된다.
        this.body = body
    }
}



여기에 올바른 객체를 넣으면 그게 바로 제네시스 블럭이다.


하나의 노드 / 블럭을 생성한것이라고 보면 된다.

최초의 생성은 제네시스 블럭이라고 봐야함

 

 

# 제네시스 블럭을 만드는 함수를 만들어보자


1. header 만들기 - 5개의 인자값을 만들어야 한다.

function createGenesisBlock(){
    // 1. header 만들기 - 5개의 인자값을 만들어야 한다.
    const version = getVersion()    // 1.0.0
    const index = 0                 // 제네시스는 0 으로
    const time = getCurrentTime()   // 함수로 만들어 놓은것 가져옴
    const previousHash = '0'.repeat(64)    // 이전 해쉬값 근데 제네시스는 이전이 없다 sha256으로 넣어줘야하는데 만들 데이터가 없다.. -0을 64번 넣어줘야 한다
    
    const body = ['hello block']
    const tree = merkle('sha256').sync(body)              // merleRoot 는 body 에 있는 내용이 필요하다. - 그래서 body 먼저 선언해줌
    const root = tree.root()|| '0'.repeat(64)            // 만약 body 내용이 없다면 0 을 64 번
    
    const header = new BlockHeader(version,index,previousHash,time,root)
    return new Block(header,body)
}
const block = createGenesisBlock()
console.log(block);



[결과]

Block {
  header: BlockHeader {
    version: '1.0.0',
    index: 0,
    previousHash: '0000000000000000000000000000000000000000000000000000000000000000',
    time: 1630467088,
    merkleRoot: '725C20214587B0DCD5FBF0DCA637904A97A142E89F4A06F55F6B191E333F6B1C'
  },
  body: [ 'hello block' ]
}

 

-> 제네시스 블럭을 생성하는것까지 완성이 되었다.