chainedBlock.js 이라 이름지음요
이전 글에서 블록하나를 생성했으니 여러 블록을 이어서 블록체인 만들어보기
코드는 수업때 했지만 이번에도 설명을 보면서 고대로 정리했음 https://berrypjh.tistory.com/50
설명은 똑같고 내가 헤맨거 좀좀따리 추가됨
(리눅스 우분투에서 작업중)
블록해시 값 구하기
....이전과 같음
class BlockHeader{
constructor(version,index, previousHash, timestamp, merkleRoot, bit, nonce){
this.version = version
//index 값 넣기
this.index = index
this.previousHash = previousHash
this.timetamp = timestamp
this.merkleRoot = merkleRoot
this.bit = bit
this.nonce = nonce
}
}
//버전계산하는 함수
function getVersion(){
...
}
function createGenesisBlock(){
const version = getVersion()
//index 값 넣기
const index = 0
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
...
//헤더에 대입
const header = new BlockHeader(version, index, previousHash, timestamp, merkleRoot, bit,nonce)
return new Block(header, body)
}
//값넣어서 블록생성
const block = createGenesisBlock()
console.log(block)
1) index 값 넣어서 이후에 만들 블록체인 순서를 확인할 수 있게 한다.
(아까 index를 선언만 하고 BlockHeader constructor 구조에 안넣고 헤더에 대입에도 안넣어서 안됐었음
게다가 뒤에 선언하는거랑 넣어준 순서다르면 안되더라...)
2) 블록체인 불러오기
//여러개 들어갈 수 있는 배열로 Blocks를 만들어줌
let Blocks = [createGenesisBlock()]
//현재 있는 블록들을 다 리턴해주는 함수
function getBlocks(){
return Blocks
}
function getLastBlock(){
//길이 1이니까 1-1 =0 즉 첫번째배열 불러와
return Blocks[Blocks.length - 1]
}
블록체인의 블록들을 넣어줄 Blocks배열을 만들고 첫번째 블록을 생성하는 함수인 createGenesisBlock함수를 해당 배열에 미리 넣어둔다.
3)블록해시값 구하기
//블록해시 값 구하기
//data에는 블록이 들어오는거임, 이블록을 가지고 해시값을 만들어내는 것임
function createHash (data){
const {version,previousHash,timestamp, merkleRoot, bit, nonce}= data.header
const blockString = version +previousHash +timestamp+ merkleRoot+ bit+ nonce
const hash = crypto.js.SHA256(blockString).toString()
return hash
}
블록헤더 안에 든 정보들 (version 등)의 합산 정보를 구한후 SHA256으로 변환하면 블록의 블록해시값을 구할 수 있다.
crypto.js 쓰려면
const cryptojs =require('crypto-js')
이거 추가해야될거야
node 스크립트이름
다음블록 생성하기
//다음블록 생성하기
function nextBlock(bodyData) {
const prevBlock = getLastBlock()
}
이전 블록의 정보(가장 최신 블록 정보)를 getLastBlock함수를 이용해서 가져오고 prevBlock에 넣어둔다.
//다음블록 생성하기
function nextBlock(bodyData) {
const prevBlock = getLastBlock()
const version = getVersion()
//다음순서니까 하나 추가됨
const index = prevBlock.header.index +1
//createHash함수에 이전블록 정보를 넣어 블록해시값을 구해넣는다.
const previousHash = createHash(prevBlock)
const timestamp = parseInt(Date.now()/1000)
//블록body부분에 저장될 트랜잭션(거래정보)인 bodyData를
//merkle몯ㄹ을 사용하여 트랜잭션들의 해시트리를 만들어 tree에 넣어
const tree = merkle('sha256').sync(bodyData)
//여기서 최종적으로 구해진 해시값인 머클루트 해시값을 merkleRoot변수에 넣어
const merkleRoot = tree.root() || '0'.repeat(64)
const bit = 0
const nonce = 0
const header = new BlockHeader(index,version,previousHash,timestamp, merkleRoot, bit, nonce)
return new Block(header,bodyData)
}
머클루트 값을 통해 단일 블록내에 존재하는 트랜잭션의 무결성을 검증할 수 있고,
머클루트 값을 이용해 블록의 해시값을 생성했기 때문에 블록의 해시의 무결성도 함께 검증할 수 있다.
두번째 블록 생성하고 출력해보기
//다음블록 생성하기
function nextBlock(bodyData) {
const prevBlock = getLastBlock()
const version = getVersion()
//다음순서니까 하나 추가됨
const index = prevBlock.header.index +1
//createHash함수에 이전블록 정보를 넣어 블록해시값을 구해넣는다.
const previousHash = createHash(prevBlock)
const timestamp = parseInt(Date.now()/1000)
//블록body부분에 저장될 트랜잭션(거래정보)인 bodyData를
//merkle몯ㄹ을 사용하여 트랜잭션들의 해시트리를 만들어 tree에 넣어
const tree = merkle('sha256').sync(bodyData)
//여기서 최종적으로 구해진 해시값인 머클루트 해시값을 merkleRoot변수에 넣어
const merkleRoot = tree.root() || '0'.repeat(64)
const bit = 0
const nonce = 0
const header = new BlockHeader(version,index,previousHash,timestamp, merkleRoot, bit, nonce)
return new Block(header,bodyData)
}
//다음블록생성 출력하기
const block1 = nextBlock(["tranjaction1"])
console.log(block1)
인덱스1 이면 배열은 0부터 시작하니까 두번째 맞겠지..?
트랜잭션 값이 'tranjaction1'인 두번째 블록 생성됨 확인
블록체인에 넣기
function addBlock(bodyData) {
const newBlock = nextBlock(bodyData)
Blocks.push(newBlock)
}
addBlock(['transaction1'])
addBlock(['transaction2'])
addBlock(['transaction3'])
addBlock(['transaction4'])
addBlock(['transaction5'])
위처럼 여러 트랜잭션을 순차적으로 addBlock함수를 통해 트랜잭션 값을 전달하여 블록을 생성하고 Blocks배열에 넣어보기
최종결과 출력하기
console.log(Blocks);
결과
전체 코드
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,index, previousHash, timestamp, merkleRoot, bit, nonce){
this.version = version
//index 값 넣기
this.index = index
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()
//index 값 넣기
const index = 0
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, index, previousHash, timestamp, merkleRoot, bit,nonce)
return new Block(header, body)
}
//값넣어서 블록생성
let Blocks = [createGenesisBlock()]
function getBlocks(){
return Blocks
}
function getLastBlock(){
return Blocks[Blocks.length -1]
}
//블록해시 값 구하기
function 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
}
// const block = createGenesisBlock()
// const testHash = createHash(block)
// console.log(testHash)
//다음블록 생성하기
function nextBlock(bodyData) {
const prevBlock = getLastBlock()
const version = getVersion()
//다음순서니까 하나 추가됨
const index = prevBlock.header.index +1
//createHash함수에 이전블록 정보를 넣어 블록해시값을 구해넣는다.
const previousHash = createHash(prevBlock)
const timestamp = parseInt(Date.now()/1000)
//블록body부분에 저장될 트랜잭션(거래정보)인 bodyData를
//merkle몯ㄹ을 사용하여 트랜잭션들의 해시트리를 만들어 tree에 넣어
const tree = merkle('sha256').sync(bodyData)
//여기서 최종적으로 구해진 해시값인 머클루트 해시값을 merkleRoot변수에 넣어
const merkleRoot = tree.root() || '0'.repeat(64)
const bit = 0
const nonce = 0
const header = new BlockHeader(version,index,previousHash,timestamp, merkleRoot, bit, nonce)
return new Block(header,bodyData)
}
//다음블록생성 출력하기
const block1 = nextBlock(["tranjaction1"])
// console.log(block1)
//addblock함수를 통해 순차적으로 트랜잭션값전달해 블록생성하고
function addBlock(bodyData) {
const newBlock = nextBlock(bodyData)
Blocks.push(newBlock)
}
addBlock(['transaction1'])
addBlock(['transaction2'])
addBlock(['transaction3'])
addBlock(['transaction4'])
addBlock(['transaction5'])
console.log(Blocks);
'블록체인' 카테고리의 다른 글
블록 구조체 검증 조건, 코드(블록체인 실습 기록) (0) | 2021.12.31 |
---|---|
리눅스 우분투 깃허브 연결 깃커밋, 푸시 / 해결 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 |