....이전과 같음
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)