728x90
반응형
<언어> JavaScript
<module> crypto-js, merkle
<목표> 블록생성 구조의 이해
1. class BlockHeader 생성 (처음 생성되는 블록은 Genesis Block 이라고 하는데, 속성은 0으로 초기화)
class BlockHeader {
version;
merkleRoot;
timestamp;
height;
difficulty;
nonce;
constructor() {
this.version= "버전정보"
this.merkleRoot = (머클루트 logic)
this.timestamp = Date.now();
this.height=0;
this.difficulty= 0;
this.nonce=0;
}
}
2. merkleRoot 생성 (merkle 라이브러리 설치 필요)
머클루트는 비어있지 않은 data를 입력받아 해시화하여 머클트리 logic 끝에 남은 하나의 노드를 반환하는 것이므로,
const merkle = require("merkle");
createMerkleRoot(_data) {
if (!Array.isArray(_data) || !_data.length) {
return { isError: true, msg: "data가 배열이 아니거나 빈 배열" };
}
return { isError: false, value: merkle("sha256").sync(_data).root() };
}
Array.isArray(매개변수) 는 매개변수가 배열인지 확인하고 참이면 true를 리턴하는 Method.
3. 블록 생성 (앞서 만들어둔 BlockHeader를 참조시킨다)
- hash는 블록의 속성들(hash, data 제외)을 합쳐 SHA256을 통해 변환한 해시함수라고 했기에, 빈 string을 만들어 정보들을 취합한다.
// tempStr="" , tempStr += _block.version , tempStr += _block.merkleRoot , ... 나머지
- 취합된 tempStr를 SHA256 라이브러리를 통하여 해시함수화 ( npm i crypto-js )
// SHA256(tempStr).toString().toUpperCase();
const SHA256 = require("crypto-js").SHA256;
class Block extends BlockHeader {
previousHash;
hash;
data;
constructor(_data, _previousBlock) {
super(_data, _previousBlock);
this.previousHash = _previousBlock ? _previousBlock.hash : "0".repeat(64);
this.hash = this.createHash(_previousBlock);
this.data=_data;
}
static createHash(_block) {
let tempStr = "";
const keys = Object.keys(_block);
for (let i = 0; i < keys.length; i++) {
if (keys[i] === "hash" || keys[i] === "data") {
continue;
}
tempStr += _block[keys[i]]; // string 형식
}
return SHA256(tempStr).toString().toUpperCase();
}
}
728x90
반응형
'개발 > BlockChain' 카테고리의 다른 글
BlockChain이란? (0) | 2023.01.13 |
---|