본문 바로가기

TypeScript

TypeScript 타입스크립트를 사용해 블록체인 개발하기 #2

* 아래의 글은 JavaScript 프롤로그 및 목차를 먼저 읽으신 후 읽으시기를 권장합니다.

* 타입스크립트를 사용해 블록체인 개발하기는 타입스크립트 기본 세팅 방법을 따라 하신 후 사용하기를 권장합니다.

* 타입스크립트 기본 문법은 타입스크립트 핸드북을 통해 학습하시는 것을 추천드립니다.


본 글에서 다룰 내용

  • 새로운 블록을 만들기 위한 함수 구현
  • 블록이 유효한지 체크하는 함수 구현
  • 블록을 추가하는 함수 구현
  • TS-typechain을 개발하면서 발생한 오류 및 해결방법

본 글을 시작하기 전 TypeScript 타입스크립트를 사용해 블록체인 개발하기 #1을 읽으신 후 아래의 글을 읽어주세요.


새로운 블록을 만들기 위한 함수

//새로운 블록을 만드는 함수
const createNewBlock = (data:string) : Block => {
    const previousBlock : Block = getLatesBlock();
    const newIndex : number = previousBlock.index + 1;
    const newTimestamp : number = getNewTimeStamp();
    const newHash : string = Block.calculateBlockHash(
        newIndex,
        previousBlock.hash, 
        newTimestamp,
        data
    );
    const newBlock : Block = new Block(
        newIndex,
        newHash,
        previousBlock.hash,
        data,
        newTimestamp
    );
    addBlock(newBlock);
    return newBlock;
};
  • 새로운 블록을 만들기 위해 string형 data를 받습니다.
  • const previousBlock은 getLatesBlock()함수를 통해 가장 최근의 블록을 받습니다.
  • const newIndex는 가장 최근의 블록의 index 값의 1을 더합니다.
  • const newTimestamp는 getNewTimeStamp()함수를 통해 새로운 timestamp를 받습니다.
  • const newHash는 calculateBlockHash 메소드를 통해 새로운 HashKey를 발급받습니다.
  • const newBlock은 앞에 있는 데이터를 종합해 새로운 블록을 만듭니다.
  • 이후 구현할 addBlock을 통해 블록체인 배열에 값을 추가하고, 새로 생성된 블록을 반환하고 함수가 끝납니다.

블록이 유효한지 체크하는 함수 구현

// 블록이 유효한지 체크하는 함수
const isBlockValid = (candidateBlock : Block, previousBlock : Block) : boolean => {
    //블록이 유효한지 체크
    if(!Block.validateStructure(candidateBlock)){
        return false;
    } //이전 블록의 인덱스 + 1과 현재 블록의 인덱스가 같은지 체크
    else if(previousBlock.index + 1 !== candidateBlock.index){
        return false;
    } //이전 블록의 해쉬와 현재 블록의 이전해쉬가 같은지 체크
    else if(previousBlock.hash !== candidateBlock.previousHash){
        return false;
    } //현재 블록의 해쉬키와 현재블록이 가지고 있는 해쉬키가 같은지 체크
    else if(getHashforBlock(candidateBlock) !== candidateBlock.hash){
        return false;
    }else{
        return true;
    }
};
  • 현재 블록인 candidateBlock과 이 전 블록인 previousBlock을 인자로 받습니다.
  • 제일 처음 validateStructure 메서드를 통해 현재 블록의 유효성을 체크합니다.
  • 이후 이 전 블록의 인덱스 + 1 값이 현재의 블록의 인덱스 값과 같은지 체크합니다.
  • 이 전 블록의 해쉬키와 현재 블록이 가진 이전 블록의 해쉬키가 같은지 체크합니다.
  • 현재 블록의 해쉬키와 getHashforBlock 함수를 사용해 발급받은 해쉬키가 같은지 체크합니다.
  • 이 과정을 모두 통과하면 블록체인 배열에 들어갑니다.

블록을 추가하는 함수

// 블록을 추가하는 함수
const addBlock = (candidateBlock: Block): void => {
    if(isBlockValid(candidateBlock, getLatesBlock())){
        blockChain.push(candidateBlock);
    }
}
  • 현재 블록인 candidateBlock을 인자로 받습니다.
  • 블록이 유효한지 체크하는 함수에 현재 블록과, 가장 최근의 블록을 인자로 줍니다.
  • 만약 그 값이 true라면 블록체인 배열에 push로 넣습니다.

TS-typechain을 개발하면서 생긴 오류와 해결 방법

 

첫 번째 오류

TypeScript tsc-watch 사용하기 글에서 발생한 오류와 똑같은 오류가 발생했다.

 

해결 방법

해결 방법은 이전 글과 똑같은 방법으로  yarn add typescript 를 통해 TypeScript를 설치해주었다.

 

알고 보니 TypeScript의 최신 버전이 릴리즈 되어 다시 오류가 발생한 것 같다.

 

두 번째 오류

블록이 유효한지 체크하는 함수에서 올바른 값들을 넣어도 블록체인 배열에 들어가지 않았다.

 

해결 방법

제일 처음 validateStructure 메서드를 통해 현재 블록의 유효성을 체크할 때  표시를 붙여주지 않아 배열에 들어가지 않았다.

 

다음부터 코드를 작성할 때 조금 더 집중해서 작성해야 할 것 같다.


참고 문헌 및 사이트

 

노마드코더 TypeScript로 블록체인 만들기 - https://www.youtube.com/watch?v=7wAhwv2Rbxw

crypto-js npm 공식 문서 - https://www.npmjs.com/package/crypto-js

Typescript handbook - https://typescript-kr.github.io/pages/tsconfig.json.html

 

전체 코드는 제 깃헙 링크에서 확인하실 수 있습니다.

TS-typechain - https://github.com/Bigstar1108/Do_Your_Best/tree/master/TS-typechain

 

긴 글 읽어주셔서 감사합니다😀