dukDukz
[블록체인] 제네시스 블록 생성하기 본문
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' ]
}
-> 제네시스 블럭을 생성하는것까지 완성이 되었다.
'웹 개발 > 블록체인' 카테고리의 다른 글
[블록체인] 블록 추가 | 블록 검증 (0) | 2021.09.02 |
---|---|
[블록체인] 블록 추가로 생성하기 (0) | 2021.09.01 |
[블록체인] 블록체인..? (네트워크 / 분산원장) (0) | 2021.09.01 |
[블록체인] 기본 개념 (0) | 2021.08.31 |
0824 블록체인 (0) | 2021.08.24 |