Geth를 이용한 private Ethereum chain(private network) 구축
본 글은 Ethereum 기반의 private network를 구축하기 위한 기본적인 내용을 담고 있습니다.
들어가기 전에
node와 peer의 차이
- node는 Ethereum network에 참여하기 위한 connection point를 말한다. 쉽게 설명하면 node는 일종의 network가 가능한 기기로 보면 된다.
- peer는 통신하는 상대방 node를 일컫는다.
node가 Ethereum network에 참여하기 위해서는 Ethereum client를 실행해야 한다.
public blockchain과 private blockchain의 차이
- public blockchain은 전세계 사람 어느 누구든 blockchain에 접근하여 data를 읽을 수도 있고 transaction을 날릴 수도 있다. 또한 채굴(consensus process)에 참여할 수도 있다.
- private blockchain은 개인 또는 하나의 조직이 blockchain에 대한 접근을 관리하는 것을 말한다. 이로 인해 private network에 참여하기 위해서는 해당 관리자의 허락이 필요하다.
private Ethereum chain(private network) 구축
geth를 사용해 Ethereum main network와 분리된 test network를 독자적으로 구성할 수 있다. test network에서 dApp을 테스팅하거나 실제 Ether를 사용하지 않고 여러 실험을 해볼 수 있다.
geth는 go language로 작성된 Ethereum protocol을 구현한 Ethereum client 프로그램이다.
private network를 구성하기 위해서는 아래와 같은 과정이 필요하다.
- Custom Genesis File을 생성
: private network의 configuration을 지정한다. - Custom Data Directory을 생성
- Custom Network ID를 생성
: network id는 network의 privacy를 보장해준다. network id는 ethereum에서 사용하고 있는 숫자 이외의 숫자 아무거나 입력하면 된다.
Genesis File
genesis file은 private network의 “환경설정”과 같다. 예를 들어, 채굴 난이도에 대한 정보나, 체인의 환경설정 같은 부분이 있다. genesis file에는 4가지 필드(config, difficulty, gasLimit, alloc)가 반드시 들어있어야 한다.
Example genesis.json :
{
"config": {
"chainId": 2757,
"homesteadBlock": 0,
"eip155Block": 0
},
"difficulty": "20",
"gasLimit": "2100000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82":
{ "balance": "300000" }
}
}
params explain:
- “config”: The blockchain configuration.
- “chainId”: 현재 chain을 식별하는 값으로 replay attack을 막기 위해서 사용된다.
- “homesteadBlock”: Homestead는 두 번째 Ethereum release 버전이다. 이값을 0으로 set하면 Homestead 버전을 사용하는 것을 의미한다.
- “eip155Block”: eip는 Ethereum Improvement Proposal을 의미한다.
2. “difficulty”: mining difficulty // 이 값을 낮게 줄수록 block이 mining하는데 걸리는 시간이 짧아진다.
3. “gasLimit”: the limit of gas cost per block // 이 값을 높일수록 block 하나에 포함할 수 있는 gasLimit양이 늘어난다. 그만큼 많은 transaction을 block에 포함시킬 수 있게 된다.
4. “alloc”: pre-funded address를 입력하는 곳이다. 하지만 해당 address의 account는 만들지 않는다.
Geth를 이용한 private Ethereum chain(private network) 구축
실습 환경
OS: mac 10.13.4
geth version: 1.8.10-stable
- Custom Data Directory를 생성한다.
> mkdir testnet
> cd testnet
2. genesis 파일을 생성한다.
> touch genesis
> vi genesis
3. genesis 파일에 아래와 같이 입력한다.
{
"config": {
"chainId": 2757,
"homesteadBlock": 0,
"eip155Block": 0
},
"difficulty": "400",
"gasLimit": "2100000",
"alloc": {
"7b684d27167d208c66584ece7f09d8bc8f86ffff": {
"balance": "100000000000000000000000"
}
}
}
이 때 alloc에 지정된 address의 account는 생성되지 않는다. alloc에 지정된 address가 만약 미리 생성된 account에 address라면 해당 account에 지정한 balance만큼 prefund된다.
3–1. account를 미리 생성한다. (prefund된 account를 사용하고 싶은 경우 다음과 같은 과정을 거친다.)
> geth account new --datadir .
Address: {e39526968a2e8f50722f686b5e63aafc8dfba2f4}
genesis 파일에 새로 생생된 account의 address를 추가한다.
{
"config": {
"chainId": 2757,
"homesteadBlock": 0,
"eip155Block": 0
},
"difficulty": "400",
"gasLimit": "2100000",
"alloc": {
"7b684d27167d208c66584ece7f09d8bc8f86ffff": {
"balance": "100000000000000000000000"
},
"e39526968a2e8f50722f686b5e63aafc8dfba2f4": {
"balance": "120000000000000000000000"
}
}
}
4. private network 생성
geth --datadir . init genesis
genesis 파일에서 설정한 configuration의 private network가 생성된다.
5. private network 구동
> geth --datadir . --networkid 2757 --rpc --rpcport 8545 --rpccorsdomain "*" --rpcapi "db,eth,net,web3,personal" --nodiscover console
private network를 구동할 때 사용한 geth command option은 여기서 확인할 수 있다.
console 옵션으로 구동된 network에 명령어를 입력할 수 있도록 쉘이 활성화된다. 이 곳에서 web3.eth.accounts 커맨드를 입력하면 3–1에서 생성한 account의 address를 확인할 수 있다.
> web3.eth.accounts
["0xe39526968a2e8f50722f686b5e63aafc8dfba2f4"]