본문 바로가기

TypeScript

TypeScript 타입스크립트를 사용해 블록체인 개발하기 #1

* 아래의 글은 JavaScript 프롤로그 및 목차를 먼저 읽으신 후 읽으시기를 권장합니다.

* 타입스크립트를 사용해 블록체인 개발하기는 타입스크립트 기본 세팅 방법을 따라 하신 후 사용하기를 권장합니다.

* 타입스크립트 기본 문법은 타입스크립트 핸드북 을 통해 학습하시는 것을 추천드립니다.


본 글에서 다룰 내용

  • TypeScript를 사용하기 위한 세팅
  • 블록 구조를 잡을 class 선언
  • 블록체인을 형성하기 위한 간단한 함수 구현

TypeScript를 사용하기 위해 세팅을 해주어야 합니다.

 

프로젝트 폴더

저의 이전 글인 타입스크립트 세팅 방법 및 tsc-watch 사용하기 글을 따라하시면 위와 같은 폴더 구조를 가지게 됩니다.

이전 글을 따라하시면서 위와 같은 폴더 구조를 완성한 뒤 아래의 글을 따라 진행해주세요.


제일 먼저 블록을 구조를 잡을 class를 생성합니다.

import * as CryptoJS from 'crypto-js';

class Block{
    //Hash키를 생성하기 위한 메소드 (static으로 선언함으로서 class를 선언하지 않아도 사용 가능)
    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;
    }
}

class 안에 있는 코드의 순서는 메소드 -> 변수 혹은 나머지 데이터 -> constructor 순을 추천드립니다.

 

위의 코드에서 중요하게 볼 부분은 static 메소드입니다.

 

static 메소드를 사용하는 이유는 다음과 같습니다.

  • 클래스가 생성되지 않아도 호출하기 위해

이해를 돕기 위해 간단한 코드를 보여드리겠습니다.

 

static으로 선언하지 않았을 때

class Greeting{
  sayHello = () : void => console.log("Hello");
}

const Greet: Greeting = new Greeting();

//아래의 코드는 작동이 되지 않습니다.
Greeting.sayHello();

//아래의 코드는 작동이 됩니다.
Greet.sayHello();

 

static으로 선언하였을 때

class Greeting{
  static sayHello = () : void => console.log("Hello");
}

const Greet: Greeting = new Greeting();

// 두 개의 코드 모두 작동
Greeting.sayHello();

Greet.sayHello();

코드로 보니 확실히 알겠죠? 위와 같은 이유로 두 개의 메소드를 static으로 선언하였습니다.

 

HashKey를 발급받기위해 crypto-js를 사용하였습니다.

 

calculateBlockHash 메소드에서 string형으로 CryptoJS를 사용하여 HashKey를 리턴하였습니다.

 

validateStructure는 각 블록안에 있는 값들이 알맞은 Type으로 들어왔는지 확인하는 메소드입니다.

각 인자의 type들을 확인해 true or false로 boolean값을 리턴합니다.


복잡한 코드를 작성하기 전에 간단한 함수부터 구현합시다.

 

일단 제일 먼저 첫번째 블록과, 블록이 들어갈 배열부터 선업합니다.

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

let blockChain:Block[] = [firstBlock];

 

블록체인 배열안에 있는 최신 블록을 가져오는 함수입니다.

//블록체인 배열안에 있는 최신 블록을 가져오는 함수
const getLatesBlock = () : Block => blockChain[blockChain.length - 1];

 

새로운 timestamp를 만드는 함수입니다.

//새로운 timestamp를 받아오는 함수
const getNewTimeStamp = () : number => Math.round(new Date().getTime() / 1000);

 

 

각 블록의 해당 HashKey를 발급 받는 함수입니다.

// 각 블록의 해쉬키를 발급 받는 함수
const getHashforBlock = (aBlock : Block) :string => 
  Block.calculateBlockHash(
    aBlock.index,
    aBlock.previousHash,
    aBlock.timestamp,
    aBlock.data
);

참고 문헌 및 사이트

 

노마드코더 TypeScript로 블록체인 만들기 - https://www.youtube.com/watch?v=7wAhwv2Rbxw

crypto-js npm 공식 문서 - https://www.npmjs.com/package/crypto-js

Typescript handbook - https://typescript-kr.github.io/pages/tsconfig.json.html

 

전체 코드는 제 깃헙 링크에서 확인하실 수 있습니다.

TS-typechain - https://github.com/Bigstar1108/Do_Your_Best/tree/master/TS-typechain

 

긴 글 읽어주셔서 감사합니다😀