npm install
npm install typescript ts-node @types/node
- Typescript 및 node 타입 정의 파일 설치
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"]
}
}
-- 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
를 만들때 사용할interface
와Block
을 만들때 사용할interface
를 미리 전역으로 설정해 두었습니다.
declare
: d.ts 파일에서declare
로 타입지정을 한 변수, 함수들을 전역으로 사용할 수 있게 합니다.
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>;
후에 블록을 생성할때 블록이 올바르게 생성되었는지 확인할 타입들을 미리 전역으로 설정해 두었습니다.
위에 타입들은Typescript
의Generic
을 통해 선언 시점이 아니라 생성 시점에 타입을 명시하여 하나의 타입만이 아닌 다양한 타입을 사용할 수 있도록 하였습니다.
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()
와 같이 사용할 수 있습니다.
미리 전역을 지정해둔@type
의block.d.ts
파일의IBlockHeader
의 타입을implements
하여type
을 지정할 때 실수할 확률을 줄여줍니다.
Type
지정을implements
하여 참조한type
지정과 다를경우 위와 같이Error
를 발생합니다.