지갑 없고 분산 저장 없이 블록을 체인으로 만드는 과정을 구현했다.

줄거리

  1. yarn add crypto-js 로 SHA256을 써먹을 수 있다.

  2. Block 클래스를 정의 하자

    필요한 변수 : index, previousHash, hash, timestamp, data

    블록의 해시값 구하기 CryptoJS.SHA256(index + previousHash + timestamp + data).toString();

  3. 블록의 유효성 검증 함수 구현

    1. 블록의 구조(변수 타입)가 유효한지
    2. index 값이 연속적인지
    3. 이전 블록의 hash과 지금 블록의 previousHash이 일치하는지
    4. 지금 블록의 hash가 맞는지
  4. 제네시스 블록을 생성하고 const genesisBlock: Block = new Block(...);

    블록체인을 만든다 let blockchain: Block[] = [genesisBlock];

    블록체인에 새로운 블록을 추가할 수 있는 함수 addBlock 를 구현한다.

전체 코드

 

const genesisBlock: Block = new Block(0, "2020202020202", "", "Hello", 123456);

let blockchain: Block[] = [genesisBlock];

const getBlockchain = (): Block[] => blockchain;

const getLatestBlock = (): Block => blockchain[blockchain.length - 1];

const getNewTimeStamp = (): number => Math.round(new Date().getTime() / 1000);

const createNewBlock = (data: string): Block => {
  const previousBlock: Block = getLatestBlock();
  const newIndex: number = previousBlock.index + 1;
  const newTimestamp: number = getNewTimeStamp();
  const newHash: string = Block.calculateBlockHash(
    newIndex,
    previousBlock.hash,
    newTimestamp,
    data
  );
  const newBlock: Block = new Block(
    newIndex,
    newHash,
    previousBlock.hash,
    data,
    newTimestamp
  );
  addBlock(newBlock);
  return newBlock;
};

const getHashforBlock = (aBlock: Block): string =>
  Block.calculateBlockHash(
    aBlock.index,
    aBlock.previousHash,
    aBlock.timestamp,
    aBlock.data
  );

const isBlockValid = (candidateBlock: Block, previousBlock: Block): boolean => {
  if (!Block.validateStructure(candidateBlock)) {
    return false;
  } else if (previousBlock.index + 1 !== candidateBlock.index) {
    return false;
  } else if (previousBlock.hash !== candidateBlock.previousHash) {
    return false;
  } else if (getHashforBlock(candidateBlock) !== candidateBlock.hash) {
    return false;
  } else {
    return true;
  }
};

const addBlock = (candidateBlock: Block): void => {
  if (isBlockValid(candidateBlock, getLatestBlock())) {
    blockchain.push(candidateBlock);
  }
};

createNewBlock("second block");
createNewBlock("third block");
createNewBlock("fourth block");

console.log(blockchain);

export {};