끄적이는 개발노트

Typescript 기본 프로젝트 - 블록체인 만들기 본문

JavaScript/Typescript

Typescript 기본 프로젝트 - 블록체인 만들기

크런키스틱 2021. 10. 14. 15:57
728x90

이번 포스트에서는 이전에 배운 타입스크립트 개념으로 블록체인을 만드는 실습을 해본다.

다만, 지금은 블록체인이 무엇인지 구성요소에 대해서 알지 못하는 상태이다.

따라서, 강의를 학습하며, 타입스크립트가 프로젝트에 어떻게 사용되는지에 대해 초점을 맞춘다.

이번에 만들 간단한 블록체인 프로젝트 역시 노마드코더의 강의영상을 참고하여 학습하며 만들었다.

노마드코더의 'Typescript로 블록체인 만들기' 강의영상

 

1. watch 모드 설정

tsc-watch npm을 개발모드로 설치한다.

$> npm i tsc-watch --dev

 

tsconfig.json 파일을 다음과 같이 수정한다.

// tsconfig.json

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "ES2015",
        "sourceMap": true,
        "outDir": "dist"
    },
    "include": [
        "src/**/*"
    ],
    "exclude": [
        "node_modules"
    ]
}

package.json 파일의 scripts 부분을 다음과 같이 수정한다.

// package.json

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "tsc-watch --onSuccess \" node dist/index.js\" "
 },

dist 폴더와 src 폴더를 생성하고 기존의 index.ts 파일을 src 폴더로 옮겨준다.

 

src내 파일이 컴파일되면 dist 폴더 안에 생기게끔 설정한 것이다.

npm start 명령어를 통해 watch모드가 실행되고 src 폴더 내 내용이 변경될 때마다 dist 폴더의 내용이 바뀐다.

 

2. crypto-js 설치

$> npm i crypto-js

 

3. index.ts 수정

// index.ts

import * as CryptoJS from "crypto-js";

class Block {
  static calculateBlockHash = (
    index: number,
    previousHash: string,
    timestamp: number,
    data: string
  ): string =>
    CryptoJS.SHA256(index + previousHash + timestamp + data).toString();

  static validateStructure = (aBlock: Block): boolean =>
    typeof aBlock.index === "number" &&
    typeof aBlock.hash === "string" &&
    typeof aBlock.previousHash === "string" &&
    typeof aBlock.timestamp === "number" &&
    typeof aBlock.data === "string";

  public index: number;
  public hash: string;
  public previousHash: string;
  public data: string;
  public timestamp: number;

  constructor(
    index: number,
    hash: string,
    previousHash: string,
    data: string,
    timestamp: number
  ) {
    this.index = index;
    this.hash = hash;
    this.previousHash = previousHash;
    this.data = data;
    this.timestamp = timestamp;
  }
}

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 {};

  • 설치한 crypto-js를 import 해준다.
  • Block class를 생성하여 블록체인에 필요한 값들을 설정해준다.
  • static으로 해쉬값을 만드는 함수와 블록체인을 검증하는 함수를 만든다.
  • 새로운 블록을 만드는 함수 등을 만든다.

타입스크립트는 함수의 값들과 인자의 값들에 대한 타입을 지정하여 그 외의 값들은 에러를 뱉어낸다.

이번 프로젝트에서는 새로운 블록을 추가할 때 블록 클래스에 맞지 않는 값들이 들어오는 것을 막아주는데, 이러한 점이 타입스크립트의 굉장한 장점이 아닐까 생각한다.


이번 프로젝트는 타입스크립트의 사용 방법에 대해 알아보기 위해 진행한 것으로 함수들에 대한 자세한 설명은 생략했다.(블록체인에 대한 내용이 더 궁금하다면 노마드코더의 강의영상을 찾아보기를 바란다.)

다만, 이번 프로젝트에서는 타입스크립트의 기본 사용법이 실제로 어떻게 사용되었는지를 알고 넘어가면 된다.

 

728x90