이제 블럭에 대한 기본적인 사항들은 공부를 했으니 체인, 블럭을 체인으로 이은 블럭체인이 무엇인지 알아보자.
체인은 이미 공부한 것이나 다름없다. 한 블럭이 다른 블럭의 다음에 온다는 것을 알려주는 것이 바로
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 |