이론 출처: https://steemit.com/kr/@yahweh87/3
코드설명:https://berrypjh.tistory.com/50
블록체인에서 사용되는 '블록'은 일정 시간마다(비트코인의 기준으로 10분에 한 번씩 생성됩니다.)
즉 여러 건의 거래내역을 하나의 블록으로 묶어 기존에 생성된 블록에 체인처럼 계속적으로 연결하는 데이터 구조를 의미합니다.
블록은 블록체인의 원소 개념으로, 다수의 거래 정보의 묶음을 의미합니다.
블록에는 블록의 이름이 있는데 Height(높이)라는 용어로 표현되고 있습니다.
한 칸 한 칸 쌓아나가 탑의 형태로 구성된다고 생각하여 Height(높이)라는 말을 쓴다고 합니다.(깊이라고 이해해도 될듯)
하지만 이 높이는 정확한 블록의 이름이 아닙니다.
블록의 정확한 이름은 TXID라 불리는 블록의 해시값입니다. 이 블록의 해시값은 블록의 헤더 정보(블록의 버전, 이전블록해시,머클루트,타임,bits,논스 정보)를 모두 합산한 후 SHA256으로 변환된 값입니다.
bits : 난이도 해시 목표값을 의미하는 지표
nonce: 블록을 만드는 과정에서 해시값을 구할 때 필요한 재료 역할을 수행한다.
블록의 구성요소
여러 요소들이 있지만
크게 블록 헤더와 블록 바디로 나눌 수 있다.
블록 하나 만들기
(리눅스 우분투에서 코드 작성중)
<block.js>
lass 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.timetamp = timestamp
this.merkleRoot = merkleRoot
this.bit = bit
this.nonce = nonce
}
}
header와 body가 들어간 block클래스를 만들고 블록의 header class도 만들어준다.
npm init
버전과 모듈설치확인 위해서 package.json 파일 만들고 fs불러서 버전표시해보자
const fs = require('fs')
//버전계산하는 함수
function getVersion(){
const package = fs.readFileSync("package.json")
console.log(JSON.parse(package).version)
return JSON.parse(package).version
}
# node block.js
첫번째 block값 대입한다
function createGenesisBlock(){
const version = getVersion()
const previousHash = '0'.repeat(64)
const timestamp = parseInt(Date.now()/1000)
}
version은 getVersion에서 나온 값을 대입한다.
previousHash는 이전 블록이 없는 첫번째 블록이므로 64비트 '0'을 대입
timestamp는 Date써서 현재 시간 넣어두기
머클리루트 값을 넣기 위해 설치
npm i merkle
function createGenesisBlock(){
const version = getVersion()
const previousHash = '0'.repeat(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 :")
// console.log(tree)
console.log("merkleRoot : %s", merkleRoot);
console.log("merkleRoot : %s", merkleRoot.toString('hex'));
// const header = new BlockHeader(version, previousHash, timestamp, merkleRoot, bit,nonce)
// return new Block(header, body)
}
해당 모듈 설치 후 body에 들어갈 트랜잭션(거래내역)인 첫 번째 데이터로 hello block을 넣음
나머지는 0대입하고 만들어보고 실행해보기
node block.js
하면
(아까는 merkleRoot 안나왔는데 %d 여서 그랬음 %s 이게 string값 불러오는건가보다 둘이 똑같이 뜨네)
첫번째 블록 생성하기
function createGenesisBlock(){
const version = getVersion()
const previousHash = '0'.repeat(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 :")
// console.log(tree)
console.log("merkleRoot : %s", merkleRoot);
console.log("merkleRoot : %s", merkleRoot.toString('hex'));
//헤더에 대입
const header = new BlockHeader(version, previousHash, timestamp, merkleRoot, bit,nonce)
return new Block(header, body)
}
//값넣어서 블록생성
const block = createGenesisBlock()
console.log(block)
위에 대입한 결과를 BlockHeader class로 정보를 전달하고
블록헤더와 바디를 Block class에 전달하여 첫번째 블록을 생성하였다.
node block.js 로 실행결과보기
block.js 전체코드는 이와같다.
const fs = require('fs')
const merkle = require('merkle')
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.timetamp = timestamp
this.merkleRoot = merkleRoot
this.bit = bit
this.nonce = nonce
}
}
//버전계산하는 함수
function getVersion(){
const package = fs.readFileSync("package.json")
console.log(JSON.parse(package).version)
return JSON.parse(package).version
}
//getVersion()
function createGenesisBlock(){
const version = getVersion()
const previousHash = '0'.repeat(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 :")
// console.log(tree)
console.log("merkleRoot : %s", merkleRoot);
console.log("merkleRoot : %s", merkleRoot.toString('hex'));
//헤더에 대입
const header = new BlockHeader(version, previousHash, timestamp, merkleRoot, bit,nonce)
return new Block(header, body)
}
//값넣어서 블록생성
const block = createGenesisBlock()
console.log(block)
'블록체인' 카테고리의 다른 글
리눅스 우분투 깃허브 연결 깃커밋, 푸시 / 해결 Please use a personal access token instead. (0) | 2021.12.31 |
---|---|
블록체인 만들기 (블록 연결하기) (0) | 2021.12.31 |
해시,머클트리 Merkle tree 개념 (0) | 2021.12.30 |
우분투 vscode에서 수정안되는 이유 (0) | 2021.12.27 |
블록체인(BLOCKCHAIN)이란? (0) | 2021.12.24 |