본문 바로가기
블록체인/이더리움

[이더리움]Genesis json이 무엇인가

by dev_mac-_- 2018. 12. 1.

Ethereum - Genesis.json


실제 이더리움 기반 DApp을 배포하려면 실제 이더를 소비하여 컴파일된 코드를 블록으로 저장을 해야한다. 

운이좋게 오류 없이 실행이 된다면 단 한번의 배포비용만 지불하면 되겠지만, 이미 배포된 DApp에 오류가 발견된다면 수정 후 다시 배포를 해야 하기 때문에 추가로 이더를 소비해야 한다. 따라서, 개발자들은 실제 배포단계 이전에 Private Network를 통해 테스트 한다면 손실되는 비용을 줄일 수가 있을 것이다.

Geth를 이용해 Ethereum private Network를 구성하기 위해서는 처음 제네시스 블록을 생성해주어야 한다.

이때, Genesis.json에 제네시스 블록에 대한 설정을 해주는데, 이 파일의 구조를 알면 대략적인 이더리움 블록의 구조를 알 수 있다.

그렇게 복잡한 것은 아니므로 천천히 본다면 쉬운 파일 구조다.

{"config": {"chainId": 910513,"homesteadBlock": 0,"eip155Block": 0,"eip158Block": 0},"difficulty": "0x20000","gasLimit": "0x2fefd8","alloc": {},"extraData": "","nonce": "0x0000000000000000","mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000","timestamp": "0x00"

}

JSON형식의 Genesis블록의 정보


"config": {"chainId": 910513,"homesteadBlock": 0,"eip155Block": 0,"eip158Block": 0},

첫번째로 config영역은 구성하고자 하는 이더리움 Network의 설정을 하는 부분이다.

- chainId : 현재 Chain을 식별하는 값이다. (DAO사건 이후 하드포트 하여 추가된 항목이다. - Replay Attack을 막기위해 사용된다.)

(현재 Main Network와 Test Network의 리스트는 이 사이트를 참조하면 된다.)

- homesteadBlock : 블록체인의 Release버전을 나타낸다.

- eip155Block, eip158Block : Ethereum improved proposal(EIP) 각각 개선된 문제해결 방안을 추가할경우 하드포크를 하게되는데, 기본값은 0이다.
(하드포크 하지않는 옵션값)


Genesis.json 값 들이 전달되는 Go 세부 코드 : https://github.com/ethereum/go-ethereum/blob/eaff89291ce998ba4bf9b9816ca8a15c8b85f440/params/config.go#L104


"difficulty": "0x20000",

"gasLimit": "0x2fefd8",

"alloc": {},

두번째로 살펴볼 영역은 위의 내용과 같다.

- difficulty : 이 블록의 nonce값을 발견하는 난이도 레벨을 설정한다. difficulty가 높을수록 블록 생성 속도가 느려진다.

(테스트넷에서는 difficulty값을 낮게 하는 것을 권장한다.)

- gasLimit : 체인 전체에 대한 블록 당 가스지출의 제한량을 설정한다.

- alloc : Genesis 블록 생성 시 지정한 지갑에 할당된 양을 미리 채운다.

(주로 ICO pre-sale때 설정한다. 지정된 지갑주소에 특정량의 이더를 배분한다.)


"nonce": "0x0000000000000000","mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000","timestamp": "0x00"

마지막으로 살펴본 영역은 위의 내용과 같다.

- nonce : PoW 알고리즘에 사용되는 nonce값 

- mixhash : nonce값과 결합하여 이 블록에 충분한 양의 계산이 수행되었음을 증명하는 256bit의 해시값이다.

mixHash는 해당 이더리움 체인 내에서의 난이도를 결정한다. mixhash의 값이 작다면 암호학적으로 그 값을 계산할 확률이 작다는 뜻인데 난이도가 높아진다. 이전에 보았던 difficulty는 채굴자 당 평균 채굴 속도에 따라서 변하지만 mixhash의 값은 전체 채굴자들의 채굴 속도에 영향을 미친다.

- parentHash : 이전 block header의 Keccak 256bit 해시값이다. (nonce와 mixhash값을 포함한다.)
Genesis단계에서는 기본값 0으로 설정한다.

- timestamp : block을 생성할 때 Unix time함수의 결과값을 나타낸다.


Genesis.json의 파일을 대략적으로 살펴보았는데, 이 다음단계로 Geth를 이용해 자신만의 Local Private Network을 만들어볼 수 있다. 

그 내용도 그리 어렵지 않은 내용이니 한번 시도해보는 것을 추천한다.

이더리움 Multi Node Network 구성하기 : https://developer-mac.tistory.com/44

댓글