________________________________________________________________________
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 |