티스토리 뷰

반응형

Author: 주니용

 

앞의 글에서 블록들을 연결시켜주는 로직을 작성해보았습니다.

하지만, 이 상태로는 빈 데이터가 들어오는 경우에도 체인이 되는 형태이고, 또 같은 데이터가 동시에 들어와 해시값이 같더라도 문제가 발생하죠.

그렇기 때문에 검증하는 단계를 추가하여야 합니다.

 

마지막으로 추가하는 검증 소스는 아래와 같습니다.

먼저 Block 클래스 내부에 타입을 검증할 수 있는 로직을 추가해보려 합니다.

static checkStruct = (block: Block): boolean => 
    typeof block.index === "number" &&
    typeof block.hash === "string" &&
    typeof block.data === "string";

 

자, 이제 typeof 함수를 이용하여 각 블록이 가지고 있는 타입이 유효한지에 대한 검증 소스를 추가하였습니다.

이번에는 이것을 응용하여 블록이 유효한지에 대해 플래그를 뱉어주는 소스를 만들어보려 합니다.

const getHashdata = (block: Block): string => 
    Block.calcBlock(block.getIndex(), block.getPrevHash(), block.getData(), block.getTimestamp());

const isValidBlock = (candidate: Block, prev: Block): boolean => {
    if(!Block.checkStruct(candidate)) return false;
    else if(prev.getIndex() !== candidate.getIndex() - 1) return false;
    else if(prev.getHash() === candidate.getHash()) return false;
    else if(getHashdata(candidate) === candidate.getData()) return false;
    else return true;
}

 

이렇게해서 blockchain.push(newBlock); 위에 isValidBlock을 넣어주면 완벽해지겠죠?

const makeBlock = (data: string): Block => {
    // ...
    if(isValidBlock(newBlock, getLatestBlock()))
        addBlock(newBlock);
    return newBlock;
}
const addBlock = (candidate: Block): void => {
    blockchain.push(candidate);
}

처음에 init 블록을 제외하고 싶으면 아래와 같이 하면 됩니다.

blockchain.shift();

 

이렇게 블록체인을 검증하는 로직을 개발하는 시간을 가져봤습니다 :)

소스 링크

 

반응형
댓글
공지사항