블록체인 -1 제네시스 블록 (23/04/25)

nazzzo·2023년 5월 9일
0

1. 제네시스 블록



제네시스 블록은 비트코인 네트워크에서 최초로 생성된 블록입니다

  • 제네시스: 창세기, 기원 등의 의미
  • 블록: 코인의 생성, 전송이 기록된 장부

최초의 블록인 제네시스 블록은 한국시간으로 2009년 1월 4일에 처음 생성되었습니다
제네시스 블록의 바디 데이터에는 나카모토 사토시가 작성한 메시지가 포함되어 있습니다

"The Times 03/Jan/2009 Chancellor on brink of second bailout for banks"

이 메시지는 영국의 일간지인 '더 타임즈'의 2009년 1월 3일자 헤드라인에서 가져온 것입니다
해당 시기에 발생한 세계 금융 위기와 중앙 은행의 역할을 비판하는 내용을 담고 있으며,
나카모토 사토시가 지닌 비트코인의 철학을 대변하는 메시지로 여겨지고 있습니다

제네시스 블록의 구조 예제

  {
    version: '1.0.0',
    height: 0,
    timestamp: 1231006506,
    previousHash: '0000000000000000000000000000000000000000000000000000000000000000',
    merkleRoot: 'DC24B19FB7508611ACD8AD17F401753670CFD8DD1BEBEF9C875125E98D82E3D8',
    nonce: 0,
    difficulty: 0,
    hash: '84ffab55c48e36cc480e2fd4c4bb0dc5ee1bb2d41a4f2a78a1533a8bb7df8370',
    data: '2009년 1월 3일 더 타임스, 은행들의 두번째 구제금융을 앞두고 있는 U.K 재무장관'
  }
  • height: '높이'로 표현하지만 순서를 나타내며 새로운 블록이 생성될 때마다 1씩 증가합니다
    제네시스 블록은 최초의 블록이므로 이 값은 0입니다 (2023년 5월 기준 최신 블록의 높이는 약 78만)
  • previousHash: 이전 블록의 해시 값입니다
    제네시스 블록은 이전 블록이 없기에 모든 비트가 0인 64자리 16진수 값으로 설정했습니다

블록의 세부 구조(머클루트, 논스, 난이도 등)에 대해서는 차차 다루기로 하겠습니다



2. 해시화(단방향 암호화)


단방향 암호화, 해시, SHA-256


블록체인의 원리와 구조에 대해 파악하려면 먼저 블록체인 네트워크에서 사용중인
암호화 방식에 대해 파악할 필요가 있습니다

블록체인에서 사용되는 암호화 방식 중 가장 중요한 것은 해시화(Hashing)로,
해시화는 단방향 암호화의 일종으로 임의의 데이터를 고정된 길이의 문자열로 변환하는 과정을 말합니다

*단방향 암호화란 입력값(평문)을 함수에 넣어 암호화된 코드를 얻을 수는 있지만
암호문을 역추적해서 평문을 얻는 것이 극히 어려운 암호화 방식입니다

또한 블록체인에서 해시 알고리즘으로는 SHA-256이 주로 사용되는데,
SHA256 함수는 해시값의 길이를 256비트(32바이트)로 고정시킵니다
이 출력값을 16진수(64자리의 문자열)나 2진수로 변환하여 표현할 수 있습니다

이러한 단방향 해시 함수는 데이터 무결성을 검증하는 용도로 사용됩니다
(원본 데이터와 암호화된 결과를 비교하여 같은지 다른지를 확인하는 용도)


짧막 복습

  • bit: binary digit에서 파생된 단어로 0 또는 1의 값을 가지는 이진수 데이터입니다
    컴퓨터에서 비트는 정보의 최소 단위를 뜻합니다

  • byte: 컴퓨터가 조작하는 정보의 최소 처리 단위입니다. 1바이트는 8개의 비트로 이루어져 있습니다

  • nibble: 1byte의 절반. 즉 4bit입니다

  • Hex(16진수): 0123456789ABCDEF, 이렇게 총 16개의 기호로 표현되는데
    0x(or 0X) 접두사를 사용하여 나타내기도 합니다
    예를 들어, 0x1A는 10진수로 나타내면 26을 의미합니다 (10은 10진수 16, A는 10)



SHA256 함수를 사용하는 클래스 예제

class CryptoModule {
    // SHA-256

    createBlockHash(data: BlockData) {
        // object > sort > string > SHA256 호출
        // 해시화를 진행할 때는 객체 속성의 순서도 중요합니다
        const { version, height, timestamp, merkleRoot, previousHash, difficulty, nonce} = data
        const value = `${version}${height}${timestamp}${merkleRoot}${previousHash}${difficulty}${nonce}`
        return this.SHA256(value)
    }

    SHA256 (data: string): Hash {
        const hash = cryptojs.SHA256(data).toString()
        return hash
    }

    // hex(16진수) -> binary(2진수)
    // 1) `parseInt(hexByte, 16)`를 사용하여 16진수(hexadecimal) 문자열(hexByte)을 10진수(decimal)로 변환합니다
    // 2) `decimal.toString(2)`를 사용해서 10진수(decimal)을 2진수(binary) 문자열로 변환합니다
	// 그리고 변환된 2진수 문자열의 자릿수는 8자리로 고정되도록 하기 위해 `padStart(8, "0")`를 사용합니다
    // 3) 위 두 줄의 코드를 합쳐서 16진수(decimal)를 2진수(binary)로 변환하고, 8자리로 채워진 2진수 문자열(binaryByte)을 얻습니다
    hashToBinary(hash: Hash): string {
        let binary = ''
        for (let i = 0; i < hash.length; i += 2) {
            const hexByte = hash.substr(i, 2)
            const decimal = parseInt(hexByte, 16)
            const binaryByte = decimal.toString(2).padStart(8, "0") // padStart ~ 8자리수 고정, 빈자리는 0
            binary += binaryByte
        }
        return binary
    }

    merkleRoot(data: TransactionData) {
        let merlkeData = []
        if (data instanceof TransactionRow) {
            // data => transactionRow

        } else {
            // data => string
            // npm install merkle
            return merkle('sha256').sync([data]).root()
        }
    }

    isValidHash(hash: Hash): void {
        const hexRegExp = /^[0-9a-fA-F]{64}$/
        if (!hexRegExp.test(hash)) throw new Error (`해시값이 올바르지 않습니다 ${hash}`)
    }
}


export default CryptoModule

0개의 댓글