내멋대로 블록체인 #5 - 나만의 최초 블록(Genesis Block)

    블록체인이 가장 첫번째 수행하는 작업은 무엇일까? 바로 제네시스 블록(Genesis Block)을 생성하는 것이다. 일반적으로 제네시스 블록에는 블록체인의 설정들이 담겨져 있고 블록체인을 생성한 개발자를 위해서 일부분을 보상으로 제공하기도 한다.


    즉 제네시스 블록에는 설정 및 개발자, 재단 등에게 보상을 해주는 부분이 담겨져 있어야 한다는 것이다. 개발자에게 아무런 보상을 주기 싫을 경우 쓰지 않아도 된다. 




    제네시스 블록에 담겨질 내용


    일반적으로 블록체인의 설정은 아래와 같은 것을 선언할 수 있을 것이다


    1. 블록의 목표 개수, 즉 유통량
    2. 재단 및 개발자에게 제공하는 보상 정보 (옵션)
    3. 최초 전송 (옵션)
    4. 시작 해시 값


    참고로 아래는 이더리움(Ethereum) 개발을 위한 제네시스 블록의 예시이다.


    {

        "config": {

            "chainId": 15,

            "homesteadBlock": 0,

            "eip155Block": 0,

            "eip158Block": 0

        },


        "nonce": "0x0000000000000042",

        "timestamp": "0x00",

        "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",

        "extraData": "0x00",

        "gasLimit": "0x800000",

        "difficulty": "0x400",

        "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",

        "coinbase": "0x3333333333333333333333333333333333333333",

        "alloc": {}

    }


    위의 제네시스 블록을 보면 ParentHash(이전 해시값)과 블록개수, 블록 배정 등 정보가 담겨져 있는 것을 볼 수 있다. 클라이언트 프로그램은 최초의 블록 정보를 기반으로 첫 구동 블록체인이 작동이 되는 것이다.



    내멋대로 블록체인의 제네시스 블록


    참고로 현재 설정한 제네시스 블록은 추후 언제든지 변경 될 수 있다.


    {

    "header":{

    "hashed":"steelj",

    "reward":"1000000",

    "difficulty":"500",

    "miner":"0000000000000000000000000000000000000000"

    },

    "transfer":{

    "from":"void",

    "to":"0000000000000000000000000000000000000000",

    "stlj":"1000000",

    "memo":"자바로 만든 내멋대로 블록체인"

    }

    }


    일단, 제네시스 블록에 나는 크게 2가지의 분류값을 만들었고, 분류 안에 여러가지 속성값들이 이루어진 모양으로 구성을 하였다. 각각의 의미를 살펴보면 아래와 같다




    Header


    header는 블록마다 무조건 하나씩 존재하며, 다음 블록을 위한 필수 값들이 담겨져 있으며, 채굴자의 정보도 포함되어 있다.



    hashed 

    parent hash와 동일한 의미이다 즉, 이전 해시값을 뜻한다. 이 해시값에 다양한 문자열을 조합하여 자바에서 기본으로 제공하는 sha-256 알고리즘을 호출하여, 채굴을 수행한다.


    reward

    채굴로 얻게 된(보상) 코인 개수를 뜻한다.


    difficulty

    채굴 난이도를 뜻한다. 설정에는 나와 있지 않지만 내멋대로 블록체인은 5초당 한개의 블록을 생성할 수 있게 만들어져 있으며, 프로그램에서 강제로 10ms의 Sleep을 주기 때문에 아무리 빨라도 최대 1초당 100번의 해시값 연산밖에 수행할 수 없다. 


    즉 500이라는 값은 일반적인 컴퓨터 한대가 해시연산을 했을 때 5초마다 한번 정도 채굴할 수 있는 난이도를 뜻한다. difficulty는 일정량의 채굴 된 블록의 개수를 연산하고, 컴퓨터가 늘어나거나 혹은 컴퓨터의 연산속도가 느릴 경우, 줄어들거나 늘어날 수 있게 탄력적으로 조정이 된다.


    miner

    해당 블록을 채굴한 주소를 뜻한다. 제네시스 블록은 "0000000000000000000000000000000000000000" 라는 주소가 최초 블록 수량을 획득한다. 참고로 "0000000000000000000000000000000000000000" 주소는 이 프로그램을 만든 사람의 주소인 필자의 주소(admin)이다.



    Transfer


    코인을 교환한 내용들이 담겨져 있다. 현재 제네시스 블록에는 리스트로 되어 있지 않으나, genesis가 아닌 다른 블록들은 리스트 형태로 구성되어 있다.


    from

    코인을 전달한 송신자를 뜻한다. 채굴일 경우, void이다.


    to

    코인을 받은 수신자를 뜻한다.


    stlj

    현재 내멋대로 만들어낼 코인명칭(stlj)의 전송 수량을 기록한다. 현재 stlj는 소수값을 사용하지 않는다.


    memo

    말 그대로 메모를 뜻한다. 전송때 기록의 내용이 있을 경우 작성한다.



    다음 시간은...


    다음 포스팅은 Genesis 블록(즉 설정 블록)을 기반으로 실제 0번째 블록을 만들어내는 것을 소스와 함께 보여줄 것이다. 코인이 변하는 대로 Genesis 블록은 유연하게 설정이 추가하거나 변경되어야 하며 꼭 이 설정에 맞춰서 블록체인의 설계를 할 이유는 없을 것이다.


    포스팅 내용과 동일합니다


    내멋대로 블록체인 강좌


    댓글

    Designed by JB FACTORY