#1. ethereum 기초 - geth / 기초 작업 /genesis block/Dapp
노션에 이것 저것 쓰다보니 종류가 너무 다양해져서 티스토리를 시작했다!
나중에 노션링크 걸어서 정리해놓은 내용도 올려놔야지 기대해 주세용
나의 모든 글은 리눅스로 이루어지고, 해당 카테고리 글은 Dapp 개발 위주이다.
geth 설치
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum
자동으로 환경변수 설정이 돼서 따로 수정할 필요 없다. 추천!
계정 생성
geth --datadir . account new
--datadir : 내용을 저장할 위치 / . 이므로 해당 디렉토리에 형성
해당 경로에 keystore 폴더가 생긴다.
keystore : 앞으로 만들 계정들을 저장하는 공간
해당 명령어를 반복해서 원하는 개수의 계정을 만들어 준다. -> keystore 폴더에 개수만큼 파일이 생김
제네시스 블록 생성
제네시스 블록은 처음 블록을 지칭하는 말이다.
<제네시스 블록 생성 방법>
방법 1. puppeth 이용 (puppeth 는 go-etherem(geth) 모듈로 genesis 파일을 생성을 도와준다)
방법 2. vim 으로 직접 만들기
블록이라고 하지만 json 파일을 만드는 것이다.
1. 제네시스 블록을 만들것이므로 2번
2. 이미 파일이 존재한다면 2번을 눌러도 된다.
3. pow 를 선택한다.
1, 2 모두 있다면 입력하고 없다면 엔터로 스킵 ㄱㄱ
1. 네트워크 id 를 설정해준다! 나중에 컨트랙트 배포시 필요하므로 기억해 두길 바란다.
2. 제네시스 블록 파일을 추출해야하므로 2번을 선택한다.
3. 2는 오타고 그냥 엔터누르면 default 가 되어 파일 추출이 진행된다. -> 폴더에 넣고싶으면 저기에 폴더 이름을 치면 된다.
생성된 json 파일 중 mynet.json , 이게 주된 제네시스 블록 파일이 된다. -> 각자 설정한 network 이름으로 추출됨
mynet.json
"config": {
"chainId": 1234,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"ethash": {}
},
config 필드
- config 안 필드들은 체인의 파라미터들을 정의하는데 쓰임
- chainID : puppeth에서 정했던 네트워크 아이디
- ethash : 합의 알고리즘이 작업증명임
"nonce": "0x0",
"timestamp": "0x610aef41",
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x47b760",
"difficulty": "0x80000",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": { .... }
timestamp
- 이더리움 가상머신에서 블록생성의 난이도 조절에 쓰임
- 연속되는 두 개의 블록의 timestamp 차이가 작으면 난이도 올라가고, 크면 내려감
- 블록들이 올바른 순서로 진행되고 있는지 확인
gasLimit
- 블록 내 트랜잭션이 소비할수 있는 최대 가스 값
- 각 블록마다 트랜잭션을 몇개나 처리할 것인가를 제한 → 블록 사이즈 조절
difficulty
- 블록의 유효성을 검사할때 사용되는 난이도
- 채굴자가 블록을 채굴하기위해 퍼즐을 풀면서 연산을 해야하는 횟수가 이 값과 연관
- 이 값이 높으면 블록 채굴시간 길어짐
alloc
- 지갑 주소의 자금을 미리 할당하는 내용임
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"baseFeePerGas": null
number
- 제네시스 블록이기 때문에 number 가 0
gasUsed
- 블록내에서 여러 트랜잭션을 처리하면서 사용한 모든 gas의 합
- 제네시스 블록은 처리한 트랜잭션이 없어서 0
parentHash
- 부모블록의 hash 의 정보 담고 있음
- 제네시스는 시작이기때문에 부모 블록이 없어 0 값임
방법 2의 기본적인 genesis.jon 파일 형식은 다음과 같다. (구글링)
{
"config": {
"chainId": 1234,
"homesteadBlock": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"eip150Block" : 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "0x20000",
"gasLimit": "0x2fefd8",
"alloc": {},
"extraData": "",
"nonce": "0x0000000000000000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x00"
}
alloc 까지는 필수고 아래는 안쓰는 파일도 있다.
geth init
geth --datadir . init ./mynet.json
--datadir : 파일 저장할 위치
init : init 할 파일
geth 폴더가 새로 생성된 것을 볼 수있다. -> genesis block 을 이용해 체인을 형성한 것
이제 console 에 접속하여 명령어를 내릴 수 있다.