Cute Bow Tie Hearts Blinking Pink Pointer

블록체인

[Typescript] 타입스크립트로 블록체인 블록 구현하기

청포도 에이드 2022. 6. 9. 17:29
728x90

 

루트 디렉토리에서 @types 라는 이름의 디렉토리를 하나 생성한다.

 

그 안에 Block.d.ts 라는 이름으로 파일을 하나 만들어주겠다.

 

이 파일에서 interface를 정의해줄 것이다!! (interface:타입을 전역적으로 선언하는 것이라고 보면 됨)

 

 

 

**blockchain/Block.d.ts (typescript)

declare interface IBlock {
    merkleRoot: string
    hash: string
    data: string[]
    height: number
}

declare interface IBlockHeader {
    version: string
    height: number
    timestamp: number
    previousHash: string
}

 

 

 

**blockchain/blockHeader.ts (typescript)

export class BlockHeader implements IBlockHeader {
    public version: string
    public height: number
    public timestamp: number
    public previousHash: string

    constructor(_previousBlock: IBlock) {
        this.version = BlockHeader.getVersion()
        this.timestamp = BlockHeader.getTimeStamp()
        this.height = _previousBlock.height + 1
        this.previousHash = _previousBlock.hash
    }
    public static getVersion() {
        return '1.0.0'
    }
    public static getTimeStamp() {
        return new Date().getTime()
    }
}

implements

implements 키워드는 class의 interface에 만족하는지 여부를 체크할 때 사용된다. implements한 interface의 타입이 없다면 에러를 반환한다.

 

여기서 주의할 점은, implements는 오직 타입 체크를 위해 사용되는 것이지, 안의 값을 자동으로 바꾸어주지 않는다.

 

 

**blockchain/block.ts (typescript)

import { SHA256 } from 'crypto-js'
import merkle from 'merkle'
import { BlockHeader } from './blockHeader'

export class Block extends BlockHeader {
    public hash: string
    public merkleRoot: string
    public data: string[]

    constructor(_previousBlock: Block) {
        super(_previousBlock) //BlockHeader 뜻하는거임
        this.hash = ''
        this.merkleRoot = ''
        this.data = []
    }
}

 

 

 

**block.test.ts (typescript)

import { Block } from '@core/blockchain/block' //따로 별칭 정한 것이므로, 각자 디렉토리에 맞는 경로 설정해야함!!

describe('Block 검증', () => {
    let genesisBlock: Block = {
        version: '1.0.0',
        height: 0,
        hash: '0'.repeat(64),
        timestamp: 123523132,
        previousHash: '0'.repeat(64),
        merkleRoot: '0'.repeat(64),
        data: ['hello block'],
    }
    it('블록생성', () => {
        const data = ['Block #2']
        const newBlock = new Block(genesisBlock)
        console.log(newBlock)
    })
})
728x90