본문 바로가기

개발/BlockChain

BlockChain 만들기 - Block 생성

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


Calendar
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Visits
Today
Yesterday