* 아래의 글은 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
긴 글 읽어주셔서 감사합니다😀
'TypeScript' 카테고리의 다른 글
TypeScript 타입스크립트 + 리액트를 활용해 TodoList 만들기 #2 (0) | 2020.07.22 |
---|---|
TypeScript 타입스크립트 + 리액트를 활용해 TodoList 만들기 #1 (0) | 2020.07.22 |
TypeScript 타입스크립트를 사용해 블록체인 개발하기 #1 (0) | 2020.07.20 |
TypeScript tsc-watch 사용하기 (2) | 2020.07.16 |
TypeScript 타입스크립트 세팅 방법 (0) | 2020.07.16 |