블록체인 Block-Chain - 블록체인 구현 ( 1 )

dev_swan·2022년 6월 13일
0

블록체인

목록 보기
2/36
post-thumbnail

Typescript 설치 및 Tsconfig.json

  • npm install

npm install typescript ts-node @types/node - Typescriptnode 타입 정의 파일 설치
npm install -D tsconfig-paths - paths를 사용하여 절대경로를 지정할 수 있도록 패키지 설치
npm install crypto-js - 해시값을 생성할 때 사용할 모듈 설치
npm install merkle - merkleRoot 값을 생성할 때 사용할 모듈 설치

  • tsconfig.json
{
    "compilerOptions": {
        "outDir": "./dist/",
        "esModuleInterop": true, 
        "strict": true,
        "moduleResolution": "node",
        "resolveJsonModule": true,
        "baseUrl": ".",
        "typeRoots": ["./node_modules/@types", "./@types"],
        "paths": {
            "@src/*": ["src/*"],
            "*": ["@types/*"]
        }
    },
    "ts-node": {
        "files": true, // @types 파일 에러 안나게 설정해줍니다.
        "require": ["tsconfig-paths/register"]
    }
}

@Types 디렉토리에 전역으로 사용할 타입 설정

Block.d.ts

-- Block.d.ts --

declare interface IBlock extends IBlockHeader {
    hash: string;
    merkleRoot: string;
    nonce: number;
    difficulty: number;
    data: string[];
}

declare interface IBlockHeader {
    version: string;
    height: number;
    timestamp: number;
    previousHash: string;
}

BlockHeader를 만들때 사용할 interfaceBlock을 만들때 사용할 interface를 미리 전역으로 설정해 두었습니다.
declare : d.ts 파일에서 declare로 타입지정을 한 변수, 함수들을 전역으로 사용할 수 있게 합니다.

Failable.d.ts

declare type Result<R> = { isError: false; value: R };
declare type Failure<E> = { isError: true; error: E };
declare type Failable<R, E> = Result<R> | Failure<E>;

후에 블록을 생성할때 블록이 올바르게 생성되었는지 확인할 타입들을 미리 전역으로 설정해 두었습니다.
위에 타입들은 TypescriptGeneric을 통해 선언 시점이 아니라 생성 시점에 타입을 명시하여 하나의 타입만이 아닌 다양한 타입을 사용할 수 있도록 하였습니다.

Block Header 생성하기

BlockHeader.ts

export class BlockHeader implements IBlockHeader {
    public version: string; // 블록 버전
    public height: number; // 블록 높이
    public timestamp: number; // 블록 생성 시간
    public previousHash: string; // 이전 해시값

    constructor(_previousBlock: IBlock) {
        this.version = BlockHeader.getVersion();
        this.timestamp = BlockHeader.getTimeStamp();
        this.height = _previousBlock.height + 1;
        this.previousHash = _previousBlock.hash;
    }

    public static getVersion() {
        return '1.0.0';
    }

    public static getTimeStamp() {
        return new Date().getTime();
    }
}

Static 메서드는 해당 class에서만 헤딩 메서드를 사용할 수 있게하기 때문에 인스턴스를 생성할 때 필요없는 메서드가 같이 생성되는 비효율성을 방지할 수 있습니다, 해당 class에서만 해당 메서드를 사용할 수 있기에 BlockHeader.getVersion(), BlockHeader.getTimestamp()와 같이 사용할 수 있습니다.
미리 전역을 지정해둔 @typeblock.d.ts 파일의 IBlockHeader의 타입을 implements하여 type을 지정할 때 실수할 확률을 줄여줍니다.

Type 지정을 implements하여 참조한 type 지정과 다를경우 위와 같이 Error를 발생합니다.

0개의 댓글