이번 포스팅에서는 Geth를 이용해 private 네트워크를 구축해보고자 한다.
< 목차 >
- geth 실행하기
- IPC
- private 네트워크 구축하기
1. geth 실행하기
Geth는 Go-ethereum의 약자로 Go 언어로 개발된 이더리움 클라이언트 소프트웨어이다. 이전 포스팅에서 git clone을 통해 go-ethereum을 다운 받았으며 make geth 명령어를 통해 빌드까지 완료해주었다.
이전 글 참고)
2022.06.28 - [Ethereum] - Ethereum/이더리움 - 개발 환경 세팅
이제 터미널에서 geth를 실행시키면 우리는 이더리움 네트워크에 참여할 수 있게 된다. 즉, 우리의 컴퓨터가 이더리움 네트워크 상에서 또 하나의 노드가 되어 네트워크에 참여할 수 있게 되는 것이다.
터미널에서 geth를 실행시키게 되면 아래와 같은 화면이 나오게 된다.
이후 터미널에 Looking for peers라는 문구가 나오는 것을 확인 할 수 있는데 이는 이더리움 네트워크 상의 다른 노드와 peer를 맺기 위함이다. 다른 노드와 peer를 맺은 다음에는 이더리움 네트워크 상에 있는 데이터들을 로컬에 다운받게 되는데 ~/.ethereum 디렉토리 안에 어떤 파일들이 다운받아지는 것을 확인할 수 있다. ( Mac의 경우 ~/Library/Ethereum )
$ # MacOS
$ cd ~/Library/Ethereum
$ # Linux
$ cd ~/.ethereum
대표적으로 chaindata 디렉토리와 keystore 디렉토리를 살펴보면 다음과 같은 내용의 파일들이 다운 받아지게 된다.
- geth 디렉토리 안의 chaindata 디렉토리 : 블록 헤더 내용, 블록 바디의 트랜잭션 내용들이 저장된다.
- keystore 디렉토리 : geth에서 관리하는 계정들의 정보가 파일로 저장된다.
쉽게 말해, 이더리움 네트워크 상의 블록 정보들이 파일 형태로 저장되는 것이라고 생각하면 된다.
이렇게 geth를 실행시켜 이더리움 메인넷의 데이터를 다운받는 것을 "동기화"라고 한다. 블록 동기화에는 3가지 모드가 존재하는데 각각의 동기화 방식은 다음과 같다.
- full sync : 제네시스 블록부터 현재 블록까지 모든 블록 정보를 동기화.
- fast sync : 블록 헤더 정보 동기화, 블록 바디는 latest tx 기준 -1024개의 트랜잭션 데이터만 동기화.
- light sync : 블록 헤더 정보와 latest snapshot 동기화.
아무런 옵션 없이 geth를 실행시킬 경우 디폴트 값은 fast sync가 되며 light sync를 하고 싶다면 다음과 같이 옵션 값을 입력해주면 된다. 그리고 light sync 모드로 동기화 할 시 블록 정보들은 lightchaindata 디렉토리 안에 저장된다.
$ geth --syncmode light
참고로 geth 실행시 다운 받게되는 데이터들을 삭제하는 명령어는 다음과 같다.
$ geth removedb
2. IPC
프라이빗 네트워크를 구축하기에 앞서 IPC에 대해 간략하게 짚고 넘어가고자 한다. IPC는 Inter-Process Communication의 약자로 컴퓨터 프로세스 간 통신을 일컫는다. 즉, 운영체제 상에서 실행 중인 프로세스 간에 서로 데이터를 주고 받는 것을 IPC라고 한다. 프로세스는 자신에게 할당된 메모리 내의 정보에만 접근할 수 있고 이를 벗어나서 접근할 경우 Segmentation Fault 등의 오류가 발생하게 된다. 이는 안정성을 위해 운영체제에서 자기 프로세스의 메모리에만 접근하도록 강제하고 있기 때문이다. 따라서 서로 다른 프로세스 간에 데이터를 주고 받기 위해서는 IPC 라는 것을 사용해야 한다.
Geth를 실행하게 되면 "IPC endpoint opened" 라는 문구가 터미널에 나타나게 되는데 이 때 ~/.ethereum 디렉토리 안에 geth.ipc 파일이 생기게 된다. ( Mac의 경우 ~/Library/Ethereum/geth 디렉토리 안에 geth.ipc 파일이 생성된다. ) geth를 실행시킬 때 생성되는 geth.ipc 파일을 이용해서 geth 와 IPC 통신을 할 수 있게 되는데 이를 실행하는 명령어는 다음과 같다.
$ geth attach ~/.ethereum/geth.ipc
geth attach ~/.ethereum/geth.ipc 명령어를 입력하면 다음과 같은 화면이 나오면서 Geth JavaScript console 창으로 들어가지게 된다.
해당 콘솔 창의 modules 부분을 살펴보면 admin: 1.0 , eth: 1.0 , personal: 1.0 등의 내용이 적혀있는 것을 확인할 수 있다. 그리고 적혀있는 모듈들을 사용해 콘솔 창 안에서 우리가 실행시킨 geth와 IPC 통신을 할 수 있다. 가령 modules 중 하나인 personal 을 콘솔 창에 입력하면 다음과 같은 내용이 나오게 된다.
이는 Go 언어로 만들어 놓은 모듈을 JavaScript로 호출할 수 있게끔 만들어 놓은 것이라고 보면 된다. 아래는 모듈별로 자주쓰이는 속성 및 메소드를 간단하게 정리해 본 것이다.
- admin
- admin.nodeInfo : 노드 정보 조회
- admin.nodeInfo.enode : enode 값을 이용해 peer를 맺을 수 있음.
- admin.datadir : admin 관련 데이터 디렉토리 경로
- personal
- personal.newAccount( ) : 계정 생성하기
- eth
- eth.syncing : 동기화 완료 여부 확인 ( false 값이 나온다면 동기화가 완료된 것 )
- eth.chainId( ) : 체인 ID 조회
- eth.accounts : 노드에 존재하는 계정 목록 조회
- eth.coinbase : 코인베이스 계정 (마이너 계정)
- miner
- miner.setEtherbase( eth.accounts[1] ) : 코인베이스 계정 바꾸기 (인자값: 계정)
- miner.start( ) : 마이닝 시작하기 (인자값: 사용할 thread 개수)
- miner.stop( ) : 마이닝 중지하기
- web3
- web3.fromWei( eth.getBalance( account ) , 'ether' ) : wei → ether 로 단위 변환하기
3. private 네트워크 구축하기
이제 앞서 공부한 내용들을 토대로 geth를 사용해 프라이빗 네트워크를 생성해보도록 하자. 기존에 geth --syncmode light 명령어를 통해 geth를 실행시켰을 때 터미널 창에 나오는 내용을 살펴보면 Chain ID: 1 (mainnet) 과 같이 나와있는 것을 확인할 수 있다.
이는 실행되고 있는 geth가 이더리움 메인넷(Chain ID: 1)에 연결된 노드로써 동기화를 진행하고 있다는 것을 의미한다. 하지만 우리가 만들고자 하는 것은 자체적인 프라이빗 블록체인 네트워크이다. geth의 기능은 사용하되 genesis 블록을 교체하여 우리만의 블록체인 네트워크를 구축할 수 있다.
다음과 같이 genesis.json 파일을 만들어서 제네시스 블록에 넣어줄 속성값을 간단하게 지정해줄 수 있다. JSON 형식으로 제네시스 블록 정보를 만들어서 geth를 실행할 때 해당 내용을 토대로 제네시스 블록을 생성하고 프라이빗 블록체인 네트워크를 만들어줄 수 있다.
{
"difficulty": "200000",
"gasLimit": "3100000",
"alloc": {
"0xe7Cfd36ACfB1109Ac1080c30Ee7a2FAC263cAAe2": {
"balance": "100100000000000000000"
}
},
"config": {
"chainId": 7722,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
}
}
각각의 속성값들은 다음과 같은 의미를 갖는다.
- config
- chainId : 블록체인 네트워크를 식별하는 체인 ID.
- homesteadBlock : 이더리움의 Release 버전.
- eip는 Ethereum Improvement Proposal을 의미하며 적용할지 여부를 결정할 수 있다. 기본값은 0.
- alloc : 제네시스 블록 생성시 지정한 지갑에 할당된 양을 채워주게 된다.
- gasLimit : 체인 전체에 대한 블록 당 가스 지출 제한량 설정.
- difficulty : nonce값을 발견하는 난이도 설정.
이 외에도 nonce , mixhash , parentHash , timestamp 등의 속성들이 존재하지만 여기에서는 간단하게 제네시스 블록 정보를 만들어주었다.
genesis.json 파일 안에 생성하고자 하는 제네시스 블록의 정보를 작성 완료하였다면 이제 다음의 명령어를 입력해주자.
$ geth --datadir node init genesis.json
geth에서는 genesis.json 파일의 내용을 토대로 블록체인 데이터가 저장될 node라는 디렉토리를 만들어준다. 이제 node 디렉토리를 이용해 geth를 실행시켜주기만 하면 된다.
$ geth --datadir node
위와같이 Chain ID: 7722 인 프라이빗 블록체인 네트워크가 만들어진 것을 확인할 수 있다.
'Ethereum' 카테고리의 다른 글
Ethereum/이더리움 - 스마트 컨트랙트 배포 및 실행 (3) | 2022.07.11 |
---|---|
Ethereum/이더리움 - private 네트워크 RPC 설정하기 (1) | 2022.07.01 |
Ethereum/이더리움 - 메타마스크 연결하기 (5) | 2022.06.29 |
Ethereum/이더리움 - Web3 (0) | 2022.06.29 |
Ethereum/이더리움 - 비트코인 vs 이더리움 (0) | 2022.06.28 |