728x90
반응형
블록체인의 기반은 블록들이 자신의 전 블록으로의 링크가 있다는 것이다.
블록들에 값이 제대로 들어있는지 확인해보자.
index.ts
import * as CryptoJS from "crypto-js"
class Block {
public index: number;
public hash: string;
public previousHash: string;
public data: string;
public timestamp: number;
static calculateBlockHash = (
index: number,
previousHash: string,
timestamp: number,
data: string
): string => CryptoJS.SHA256(index + previousHash + timestamp + data).toString;
static validateStructure = (aBlock: Block): boolean =>
typeof aBlock.index === "number" &&
typeof aBlock.hash === "string" &&
typeof aBlock.previousHash === "string" &&
typeof aBlock.timestamp === "number" &&
typeof aBlock.data === "string"
constructor(
index: number,
hash: string,
previousHash: string,
data: string,
timestamp: number
) {
this.index = index;
this.hash = hash;
this.previousHash = previousHash;
this.data = data;
this.timestamp = timestamp;
}
}
const TeepoBlock: Block = new Block(0, "20202020202", "", "Hello", 123456);
let blockchain: Block[] = [TeepoBlock];
const getBlockchain = (): Block[] => blockchain;
const getLatestBlock = (): Block => blockchain[blockchain.length - 1];
const getNewTimeStamp = (): number => Math.round(new Date().getTime() / 1000);
const createNewblock = (data: string): Block => {
const previousBlock: Block = getLatestBlock();
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);
return newBlock
}
const getHashforBlock = (aBlock: Block): string =>
Block.calculateBlockHash(
aBlock.index,
aBlock.previousHash,
aBlock.timestamp,
aBlock.data
)
const isBlockValid = (
candidateBlock: Block,
previousBlock: Block
): boolean => {
if (!Block.validateStructure(candidateBlock)) {
return false;
} 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
}
}
const addBlock = (candidateBlock: Block): void => {
if (isBlockValid(candidateBlock, getLatestBlock())) {
blockchain.push(candidateBlock)
}
}
export { };
분석해보자.
1. static으로 타입이 제대로 선언되었는지 확인하는 validateStructure 함수를 만들었다
static validateStructure = (aBlock: Block): boolean =>
typeof aBlock.index === "number" &&
typeof aBlock.hash === "string" &&
typeof aBlock.previousHash === "string" &&
typeof aBlock.timestamp === "number" &&
typeof aBlock.data === "string"
2. static으로 선언했었던 calculateBlockHash의 결과값을 반환하는 함수를 만든다.( 나중에 createNewblock에서 만든 newHash를 검증단계에서 검증하기 위해 )
const getHashforBlock = (aBlock: Block): string =>
Block.calculateBlockHash(
aBlock.index,
aBlock.previousHash,
aBlock.timestamp,
aBlock.data
)
3. 새로만들 블록과 제일 나중에 만들어진 블록을 인자로 가지고, 새로 만들어질 블록을 검증하는 함수를 만든다.
const isBlockValid = (
candidateBlock: Block,
previousBlock: Block
): boolean => {
if (!Block.validateStructure(candidateBlock)) {
return false;
} 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
}
}
- 먼저 타입을 검사한다 (validateStructure)
- 최근의 index + 1과 새로만들 index가 다르면 false를 반환한다.
- 새로 만들어질 블록의 이전 hash와 그 전에 만들어진 블록의 hash가 다르면 false를 반환한다
- 만들어두었던 함수로 hash를 검증한다. ( calculateBlockHash 함수검증 )
4. 검증이 완료되면 blockchain에 push해주는 함수를 만든다.
const addBlock = (candidateBlock: Block): void => {
if (isBlockValid(candidateBlock, getLatestBlock())) {
blockchain.push(candidateBlock)
}
}
이젠 전에 만들어두었던 createNewblock( 블록을 만드는 함수 )에 검증하는 부분을 추가하면 된다.
728x90
반응형
'Typescript > 블록체인' 카테고리의 다른 글
TypeScript | 블록체인 | 결과 (0) | 2021.10.05 |
---|---|
TypeScript | 블록체인 | 블록 만들기(3) (0) | 2021.10.05 |
TypeScript | 블록체인 | 블록 만들기(2) (0) | 2021.10.05 |
TypeScript | 블록체인 | 블록 만들기(1) (0) | 2021.10.05 |