Blockchain

#6 chain

Sila 2022. 6. 12. 21:16

이제 블럭에 대한 기본적인 사항들은 공부를 했으니 체인, 블럭을 체인으로 이은 블럭체인이 무엇인지 알아보자.

 

체인은 이미 공부한 것이나 다름없다. 한 블럭이 다른 블럭의 다음에 온다는 것을 알려주는 것이 바로

 

hash값과 previousHash 값이다.

 

n번째 block의 hash 값이 n+1 번째 block의 previousHash와 동일하다면 이 두 블럭이 연속된 순서로

 

온다는 것을 쉽게 알 수 있다.

 

이 해시의 동일성 자체가 그 블럭을 이어주는 chain이라고 볼 수 있다.

 

blockchain은 순서를 알고 있는 (chain으로 이어진 관계를 가진) 일련의 블럭들을 배열에 담은 것을 의미한다.

 

본격적으로 chain, blockchain을 코드로 구현하기 전에 약간 데이터의 재배치를 진행하도록 하자.

 

1. intro - 데이터 재배치

genesis block은 다른 블럭들과는 달리 우리가 직접 초기값을 입력해주어야 한다.

 

바꿔말하면, genesis block의 모든 데이터는 상수가 된다. 

 

이런 변하지 않는 상수들을 모아둘 파일을 따로 만들어주려고 한다.

 

/*  src/core/config.ts  */

export const GENESIS : IBlock = {
    version : '1.0.0',
    height: 0,
    hash : '0'.repeat(64),
    timestamp: 1231006506,
    previousHash : '0'.repeat(64),
    merkleRoot: '0'.repeat(64),
    data : ['genesis block']
}

 

지금은 genesis block 하나 뿐이지만 앞으로 채굴 등의 기능을 구현하면서 여러 가지 값이 추가될 것이다.

 

이제 block.ts로 가 genesis block을 가져오는 함수와 블럭을 생성하는 함수를 추가해주자.

 

/*  src/core/blockchain/block.ts  */

import { GENESIS } from '@core/config'

//...중략

public static getGenesis() : Block {
    return GENESIS
}
// GENESIS를 바로 가져오는 함수

public static generateBlock(_previousBlock : Block, _data : string[] ) : Block {
    const generateBlock = new Block (_previousBlock, _data)
    return generateBlock
}
// 이 함수로 새로운 블럭을 생성하면 검증을 거쳐 블럭체인에 추가해줄 것이다.

 

2. chain

chain.ts 파일을 생성해 검증에 필요한 함수 몇가지를 넣어주자.

 

/*  src/core/blockchain/chain.ts  */

import { Block } from './block'

export class Chain {
    public blockchain : Block[]
    // Chain class는 Block들을 요소로 가지는 배열 blockchain을 특성으로 가진다.
    
    constructor() {
        this.blockchain = [ Block.getGenesis() ]
    }
    
    public getChain() : Block[] {
        return this.blockchain
    }
    // block의 현재 상태 return
    
    public getLength() : number {
        return this.blockchain.length
    }
    // blockchain 배열의 현재 length값 return
    
    public getLatestBlock() : Block {
        return this.blockchain [ this.blockchain.length - 1 ]
    }
    // 블럭체인의 가장 최근 블럭을 가져온다.
}

 

이 간단한 일련의 함수들을 이용해 블럭을 체인에 넣어주는 함수를 작성할 수 있다.

 

/*  src/core/blockchain/chain.ts  */

public addBlock ( data : string[] ) : Failable <block, string> {
    const previousBlock = this.getLatestBlock()
    // 생성, 검증에 필요한 직전 블럭을 호출
    
    const newBlock = Block.generateBlock( previousBlock, data )
    // 직전 블럭과 data를 이용해 새로운 블럭 형성
    
    const isValid = Block.isValidNewBlock( newBlock, previousBlock )
    // 생성된 새 블럭이 유효한지 검증
    
    if( isValid.isError === true ) {
        return { isError : true, error : isValid.error }
    }
    // 검증 과정에서 에러가 있다면 에러 내용을 리턴
    
    this.blockchain.push(newBlock)
    // 검증 과정을 통과했다면 새 블럭은 blockchain에 추가
    
    return { isError : false, value : newBlock }
    // 새 블럭을 리턴
}

 

마지막으로 작성된 코드를 테스트 해보자.

 

/*  src/core/blockchain/chain.test.ts  */

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

describe('Chain 코드 검증'), () => {
    let node : Chain = new Chain()
    
    it('addBlock 함수 체크', () => {
        for( let i = 0; i <= 10; i++ ) {
            node.addBlock([`Block #${i}`])
        }
        console.log(node.getChain())
    })
})

 

'Blockchain' 카테고리의 다른 글

#8 mining ch.2 - 활용  (0) 2022.06.17
#7 mining ch.1 - 개념  (0) 2022.06.17
#5 block 검증  (0) 2022.06.12
#4 block 생성  (0) 2022.06.12
#3 typescript - 2  (0) 2022.06.11