본문 바로가기
Blockchain

[블록체인 만들기 #4] Chain 만들기

by 개발자 염상진 2022. 10. 10.

이전  포스팅에서는 Block과 BlockHeader를 통해 블록체인을 구성하는 개별 블록을 생성했습니다. 이번 포스팅에서는 블록들을 연결하는 Chain을 생성합니다. 생성된 블록들을 배열에 담아 연결만 하면 됩니다. 앞서 생성한 블록들은 이미 Hash 값으로 체인을 구성하고 있으므로, 블록의 hash값이 변경되면 자연스레 chain이 끊어지게 됩니다.

 

 

이미 연결되어 있는 블록들을 담는 Chain 클래스를 구성하는 가장 큰 이유는 난이도 계산을 위해서입니다. 블록이 생성될 수록 nonce 값을 찾을 확률은 줄어들게 되고 difficulty는 올라가야 정상적인 크립토 이코노미를 구성할 수 있기 때문입니다.

 

체인 클래스

 

src/core/blockchain/chain.ts 파일을 생성합니다.

import { Block } from "@core/blockchain/block";
 
export class Chain {
  private blockchain: Block[];
 
  constructor() {
    this.blockchain = [Block.getGENESIS()];
  }
 
  public getChain(): Block[] {
    return this.blockchain;
  }
 
  public getLength(): number {
    return this.blockchain.length;
  }
 
  public getLatestBlock(): Block {
    return this.blockchain[this.blockchain.length - 1];
  }
 
  public addBlock(data: string[]): Failable<Block, string> {
    const previousBlock = this.getLatestBlock();
    const newBlock = Block.generateBlock(previousBlock, data);
    const isValid = Block.isValidNewBlock(newBlock, previousBlock);
 
    if (isValid.isError) return { isError: true, error: isValid.error };
 
    this.blockchain.push(newBlock);
 
    return { isError: false, value: newBlock };
  }
}

 

  • private blockchain 속성에 배열값으로 블록을 담습니다.
  • 생성자 함수에서는 GENESIS 블록을 초기값으로 지정합니다.
  • 메소드는 getChain, getLength, getlastestBlock, addBlock 4개로 구성합니다.
    • getChain() : 블록체인을 반환합니다.
    • getLength() : 블록체이의 길이를 반환합니다.
    • getLatestBlock() : 가장 최근의 블록을 반환합니다.
    • addBlock() : 유효성 검사를 한 후 올바른 블록을 체인에 추가합니다. 

 

Chain 테스트 코드

 

src/core/blockchain/chain.test.ts 파일을 생성합니다.

import {Chain} from "@core/blockchain/chain"

describe("🔨 Chain 테스트", ()=>{
    // Genesis Block 생성
    let node:Chain = new Chain()

    it("1) getChain() 테스트", ()=>{
        console.log(node.getChain());
    })

    it("2) getLength() 테스트", ()=>{
        console.log(node.getLength());
    })

    it("3) getLatestBlock() 테스트", ()=>{
        console.log(node.getLatestBlock());
    })

    it("4) addBlock() 테스트", ()=>{
        for(let i=1; i<=10; i++){
            node.addBlock([`Block #${i}`])
        }

        console.table(node.getChain());
    })
})

 

 

addBlock 테스트는 10개의 임시데이터를 생성한 후 Genesis 블록에 연결해 체인을 반환하는 형식으로 진행했습니다. 

테스트 결과를 보면 아래 처럼 Genesis 블록 이후로 10개의 블록이 생성되어 체인으로 연결된 모습을 확인할 수 있습니다. 

 

 

테스트 결과

 

블록체인 만들기 정리

 

현재 까지 Block, BlockHeader, Chain을 구성했고, Hash로 연결되어 있는 블록체인을 구성했습니다. 아직 블록체인을 사용할 수 없는 이유는 블록체인 네트워크가 일단 없고, 네트워크에 참여한 노드들이 모두 같은 내용을 가지고 있도록 합의 알고리즘이 빠져있습니다.

비트코인에서는 PoW(작업증명) 합의알고리즘을 사용하게 되고, Nonce값을 찾은 채굴노드에게 코인베이스 단계에서 보상이 지급됩니다. Nonc값을 찾는 Difficulty는 계속해서 올라가야 합니다. 다음 포스팅에서는 PoW를 구현하여 블록체인에 살을 보태보도록 하겠습니다.

 

 


 

🚀️ 도움이 되셨다면 구독좋아요 부탁드립니다 👍️

댓글