노마드코더 - Typescript로 블록체인 만들기

nudge411·2020년 1월 8일
0

블록체인에 대해 간단히 이해하고 또한 가볍게 타입스크립트의 매력을 느껴볼수 있는 프로젝트 였다.

기본셋팅

파일구조

스크린샷 2020-01-08 오후 2.39.28.png
위와 같은 기본적인 파일구조를 만들어준다.
src 폴더 안에있는 .ts 파일들을 .js로 번역하여 dist 폴더에 생성하는 구조이다.
$ tsc src/index.ts 를 수행하면 dist 안의 .js 는 자동으로 생성된다.
위와같은 명령을 수행하려면 tsconfig의 추가적인 설정이 필요하다.

tsconfig

스크린샷 2020-01-08 오후 2.38.27.png
tsconfig를 위와같이 작성해준다.
src 하위에 있는 모든 .ts 를 dist 폴더에 .js 로 번역하여 넣어준다.
나머지는 기본적인 옵션으로, ES2015 문법을 사용한다.

package.json

스크린샷 2020-01-08 오후 2.37.54.png
그리고 start 스크립트를 사진과 같이 작성한다
tsc-watch 라이브러리는 타입스트립트의 코드변화를 감지하여 자동으로 tsc 명령을
실행해준다. (현재 코드에서는 src/index.ts 의 수정사항을 감지하고 dist/index.js 와 index.js.map 를 새로 생성) 그 다음 dist/index.js 를 node 명령어로 실행한다.
이제 yarn start 로 해당 내용을 한번에 실행할수 있게 된다.

라이브러리

우선 3가지 라이브러리를 필요로 한다
1. typescript : 타입스크립트를 작성하기 위함
2. tsc-watch : 타입스트립트의 코드변화를 감지하여 자동으로 tsc 실행
3. crypto-js : Hash 값을 암호화 하기위함

정도로만 우선 이해했다.

이제 index.ts 의 내용을 살펴보자. 들어가기전에 블록체인에 대한
가벼운 이해가 있어야하는데, SBS스페셜에서 블록체인을 다룬 다큐를 추천한다.
개인 학습기록용 블로그 이긴하지만.. 혹시나 누가볼까 하는 마음에 추천해본다.

내가 이해한 타입스크립트

타입스크립트는 자바스크립트에서 빈번하게 발생하는 사용자의 의한 실수를
최소한으로 줄이기위한 많은 장치들이 사용된 기술 정도로 이해하고있다.
대표적으로는 클래스, 인터페이스 등이 있다.
이번 코드에서는 인자의 타입과 길이 그리고 리턴되는 데이터의 타입을
명시해주는 정도로만 사용한다.

  1. Block 클래스 만들기

스크린샷 2020-01-08 오후 3.12.12.png

길다 위에부터 천천히 살펴보자.
2개의 static 메소드와 5개의 public 변수가 있다.
calculateBlockHash 메소드는 새로운 Block이 생성될때 자신의 Hash 값을 생성한다.
validateStructure 메소드는 생성된 Block이 유효한 데이터 구조인지 체크한다.
public 변수뒤에 number, string 와같은 타입을 명시해주면 명시된 이외의 타입으로
인자를 받을때 자체적으로 에러를 발생시켜준다.

이제는 흐름에따라 정리해보자.
createNewBlock("test1") 를 실행 시켰을때 내부로직을 검토해보자.

스크린샷 2020-01-08 오후 3.32.36.png
createNewBlock 의 (data: string) 구문은 인자의 타입이 string 아니면
내부적으로 에러를 발생시킨다. "test1" 이라는 값을 체크하는 것이다.
newHash 를 생성하기위해 필요한 인자들을 받아온다.

스크린샷 2020-01-08 오후 3.36.39.png
getBlockchain : 현재 블록체인 구조를 get
getLatesBlock : 가장 최근에 push된 Block 을 get
getNewTimeStamp : 현재의 타임스탬프를 get. 1000 으로 나누고 라운드 하는 것은 맨 뒤의 3자리를 자르기 위함이라고 생각한다.

그리고 newBlock 이 만들어지면 addBlock 으로 현재의 블록체인 구조에 newBlock을
추가해준다.
근데 블록체인 특성과 타입스크립트의 장점을 합치면
가독성이 좋은 값 체크 로직을 만들수 있는데 addBlock 하기전에 한번 값체크를 해보자.

스크린샷 2020-01-08 오후 3.41.57.pngy
candidateBlock 과 가장 최근에 만들어져 push된 Block을 비교하여
true 를 리턴한다면 그때서야 생성된 Block 을 push 한다.

스크린샷 2020-01-08 오후 3.43.55.png
validateStructure 메소드는 위에서 생성했던 메소드로 구조자체를 검증하는 로직이다.
그리고 새로 만들어지는 Block의 index는 이전 Block의 index + 1 값을 가지는데
이 또한 검증한다.
다음으로 이전 Block의 Hash와 만들어지는 Block의 이전 Hash는 같아야한다.
좀 말장난 같은데 당연히 같아야 하는 값을들 검증하는 로직이다.
마지막으로 getHashforBlock 를 실행시켜 Hash값 자체를 다시한번 체크하고
이 모든 검증 로직을 통과해야만 push 될 수 있다.

스크린샷 2020-01-08 오후 3.48.31.png

스크린샷 2020-01-08 오후 3.50.29.png

하여 위같은 결과값을 볼수있다.. 이전의 해시 값을 활용하여 자신의 해시값을 만들고..
이렇게 블록 하나하나 연결되어 체이닝을 이루고 이를 블록체인 이라 명명한다.
이를 한마디로 와닿게 말하면 "위변조 불가능한 신뢰의 기술" 이라 정리할수 있다.
이건 어원의 의미이고 블록체인 기술의 아주 일부분만 설명한 것이다.

아무튼 이렇게 정말 간단하게 구현해봤고 꽤나 재밌었던 경험이었다.
블로그로 했던것을 기록하는 것은 솔직히 아직까지 너무너무 귀찮다..
마크다운도 잘 모르겠고 그냥 기억하고 다른걸 하자 라는 마음을 억누르고
하다보니 뭔가 굉장히 귀찮음이 묻어 나오는 기록이 돼버렸는데..

다음 기록이 이번 기록보다는 좀더 나아지는 것을 목표로 하나하나 써봐야겠다..

profile
잊기 위한 기록을 합니다.

0개의 댓글