본문 바로가기

내일배움캠프_개발일지/TypeScript 연습

TypeScript 연습 <1> -18-

________________________________________________________________________

 

TypeScript 블록체인 <3> - 블록체인 만들기 시작

 

 

< 타입스크립트로 블록체인 만들어보기 -  블록체인 기능을 빌드해보자. >

 

 

폴더 : kimminsoo -> NomadCoders -> typechain_2

 

 

< Blocks >

=> 블록 체인의 기초에 대해 배울 수 있을거야.

 

 

 

 

1.

________________________________

< 타입스크립트 - 블록체인 프로젝트 셋팅 및 최적화 > 

 

 

 

우선, 지금의 프로젝트 방식은 그리 효율적이지 않아.

npm run build 로 타입스크립트를 자바스크립트로 트랜스파일해서 사용하고 있는데, 그 다음에

nodeJS 로 그 코드를 실행하고 있어. 

따라서 package.json 에 scripts - start 키워드를 추가하자.

 

——

// package.json

 

 "scripts": {

    "build": "tsc",

    "start": "node build/index.js"

  },

——

 

헌데 이러면 항상 npm run build 를 한 다음 npm start 를 해야 하잖아? 여전히 효율적이지 못하지.

그래서 ts-node 라는 걸 설치해 줄 거야.

 

——

npm i -D ts-node

——

=> 이 패키지가 있으면 빌드없이 타입스크립트를 실행할 수 있게 돼.

프로덕션에서 사용하는 패키지는 아니고, 개발 환경에서만 사용하는 거야.

빌드없이 빠르게 새로고침해서 검사하고 싶을 때 사용하는 거지.

ts-node 가 트랜스파일 없이 타입스크립트 코드를 나 대신 실행시켜 주는 거거든.

 

 

ts-node 를 추가했으니, Package.json 의 scripts 에 키워드를 하나 더 추가해주자.

 

——

// package.json

 

 "scripts": {

    "build": "tsc",

    "dev": "nodemon --exec ts-node src/index.ts”,

    "start": "node build/index.js"

  },

——

=> 이러면… num run dev 를 실행하면, src/index.js 를 트랜스파일 함과 동시에 node 를 실행시킨다는 거.

참고로 기존에는 “ts-node src/index.js” 만 있던 걸 앞에 Nodemon —exec 을 붙인 거임.

 

——

  --exec : 실행할 명령어를 지정할 수 있음.

——

 

 

이제 실제로 루트 폴더 위치에서 

——

npm run dev

——

라고 명령어를 입력하면, ts-node 가 index.ts 를 트랜스파일 함과 동시에 바로 실행시켜 버려. 마치 Index.ts 를 루트 파일처럼 취급하는거야.

참고로, 이 때 tsc 를 통한 트랜스파일은 거치지 않기 때문에 build 폴더에는 트랜스파일된 파일이 생성되지는 않아.

 

 

 

 

 

2.

________________________________

< 타입스크립트 - 블록체인 기본 개념 잡기 > 

 

 

블록 체인을 디자인해 보자.

블록 체인은 말 그대로 여러 개의 블록이 사슬처럼 묶인 것. 그리고 각 블록 안에는 데이터가 들어 있어.

블록 체인으로 보호하고 싶은 데이터가 들어있단 말이지.

 

그리고 그 블록은 다른 블록에 묶여 있어. 그레서 블록 체인.

사슬처럼 블록들이 연결되어 있는데, 그 사슬, 즉 연결 고리는 해쉬값이야.

 

따라서 각각의 블록은 총 4개의 데이터를 가지고 있어야 해.

hash, prevhash, height, data.

 

 

——

// index.ts

 

import * as cryptio from "crypto"

 

interface BlockShape {

    hash: string;       // 해당 블록이 가지게 될 해쉬값. 해당 블록만의 고유한 서명과도 같아. 결정론적 값.

    prevHash: string;   // 이전 해쉬값

    height:number;      // 1, 2, 3, 4, 5 같이 블록의 위치를 표시해주는 숫자.

    data: string;       // 해당 블록이 가지고 있을 데이터

}

 

class Block implements BlockShape {

    public hash: string;

    constructor (

        public prevHash: string,

        public height: number,

        public data: string

    ) {

        this.hash = Block.calculateHash(prevHash, height, data);

    }

 

    static calculateHash (prevHash:string, height:number, data:string) {

        const toHash = `${prevHash}${height}${data}`;

        return "1";

    }

}

——

=> hash 는 이전 블록의 해쉬, 블록의 위치인 Height, 해당 블록이 가지는 data 이렇게 총 3개의 데이터를 합쳐서

결정론적 아웃풋 데이터인 문자열을 등록하게 될거야.

그럼 어케 아웃풋을 할 건데? crypto 를 사용해서.

 

맨 위에 crypto 를 Import 하고 있지? 근데 뭔가 좀 이상해.

——

import * as cryptio from "crypto"

——

여태까지 본 적 없는 방법이야…

만약에 그냥 import cryptio from "crypto" 라고 했다면?

“ 모듈 '"crypto"'에는 기본 내보내기가 없습니다. “

라면서 오류 발생.

 

 

만약에 crypto import 를 < import cryptio from "crypto" > 라고 쓰고 싶다면?

tsconfig.json 에 가서 옵션 하나를 추가해야 해.

 

——

// tsconfig.json

 

"compilerOptions": {

        ….,

        "esModuleInterop": true

 }

——

=> < "esModuleInterop": true > 라는 옵션을 추가.

왜 그냥 < import cryptio from "crypto" >  를 명시했을 때에는 기본 내보내기가 없다면서 오류가 나는가?

자바스크립트에는 여러 시스템과 모듈이 존재해. Common js, UMD, ESModule 등등.

그 중 import export 방식은 우리 가장 많이 사용하는 방식의 모듈.

 

하지만 import export 가 기본적인 동작은 아니야.

그렇기 때문에 "esModuleInterop": true 라는 옵션이 필요해.

 

추가로, tsconfig.json dptj < "allowJs": true > 옵션은 삭제하자.

다음 챕터에서 뭘 할 건데, 이 옵션이 있으면 안 돼.

=> "allowJs": true 는 타입스크립트와 자바스크립트를 같이 사용할 수 있게 해주는 옵션이었지.

자바스크립트 파일을 타입스크립트 파일로 import 해 올 때 필요했던 옵션이였어.

 

최종은 아래와 같아.

——

{

    "include": [

        "src"

    ],

    "compilerOptions": {

        "outDir": "build",

        "target": "ES6",

        "lib": ["ES6"],

        "strict": true,

        "esModuleInterop": true,

        "module": "CommonJS"    // 브라우저 앱이라면 umd

    }

}

——

=>"module": "CommonJS" 키워드가 추가 되었지?

commonJs 방식으로 모듈을 Import export 하겠다고 선언한 거야.

 

 

위 대로 설정을 하면, Index.ts 에서 오류가 날 수 있어.

——

import cryptio from "crypto"; // 오류 발생

——

=> crypto 의 타입 정의, 그니까 정의 파일을 찾지 못한다고 오류가 뜰 수 있어.

이걸 어케 해결해야 할까?

'내일배움캠프_개발일지 > TypeScript 연습' 카테고리의 다른 글

TypeScript 연습 <1> -20-  (0) 2023.02.13
TypeScript 연습 <1> -19-  (0) 2023.02.13
TypeScript 연습 <1> -17-  (0) 2023.02.09
TypeScript 연습 <1> -16-  (0) 2023.02.08
TypeScript 연습 <1> -15-  (0) 2023.02.07