geth란?
이러한 이더리움의 스마트 컨트랙트를 구동할 수 있는 go언어로 개발된 클라이언트입니다. go-ethereum을 의미하며 줄여서 geth라고 합니다. 또한 geth는 블록체인의 복사본을 최신상태로 유지하기 위하여 끊임없이 다른 노드와 통신을 합니다. geth를 이용하여 채굴도 가능하며 트랜잭션을 추가할 수도 있습니다. 이더리움은 단순히 화폐거래만 하는 것이 아닌 스마트 컨트랙트를 작성하여 Dapp을 생성하여 실행할 수 있으므로 geth를 통하여 블록의 트랜잭션을 검증하여 트랜잭션을 실행할 수도 있습니다.
설치 및 기본 명령어
설치
https://geth.ethereum.org/downloads/ 에 접속하여 os에 맞는 설치파일을 이용하여 설치하면 됩니다.
기본 명령어
기본적인 명령어를 소개하겠습니다. 사용법은 아래의 프라이빗 네트워크를 다룰 때 작성하겠습니다.
- attach : 실행 중인 geth 프로세스에 대화식 JavaScript환경을 시작합니다.
- account new : 새로운 계정을 만듭니다.
- 위의 명령어를 치게 되면 비밀번호를 2번 입력하게 합니다. 두 번 입력하게 되면 새로운 계정을 만듦
- account list : 생성한 계정을 확인합니다.
- account update : 이전에 생성한 계정을 업데이트합니다.
- --syncmode : 동기화하는 방법을 설정합니다. (light, fast, full 등)
- --datadir ./폴더/ init 파일명.json : 프라이빗 네트워크 파일명에 설정된 내용에 의하여 제네시스블록을 폴더에 생성합니다.
- --dev console : 개발자 네트워크에서 콘솔을 이용합니다.
- --networkid : 특정 이더리움 네트워크를 식별합니다.
- --identitiy : 프라이빗 네트워크의 특정 노드를 식별하는 데 사용합니다.
- --rpc : 노드에서 JSON-RPC 인터페이스를 활성화합니다.
- --rpcapi : RPC로 API를 사용하도록 설정합니다. (기본값은 web3)
- --datadir : 블록체인 데이터 폴더를 설정합니다.
- --port : 같은 네트워크에 있는 다른 피어가 이 노드와 연결하는 데 사용하는 네트워크 수신 포트를 설정합니다.
- --nodiscover : 같은 networkid와 연결되어 같은 제네시스 블록을 참조하는 클라이언트가 노드를 찾지 못하게 설정합니다.
- --ipcdisable : 이 서버가 고유하므로 ipc를 비활성화(ipc: 프로세스 간 통신)
- --maxpeers : 이 노드에서 허용하는 최대 피어 수를 설정합니다.
geth에서 사용하는 데이터 디렉터리 구조
- Ethereum
- geth
- chaindata : 블록체인 데이터가 저장되는 공간
- ethash : 채굴에 필요한 데이트 구조 파일을 저장하는 공간, 채굴을 시작하면 DAG파일을 만듭니다.
- nodes : 감지된 네트워크 노드 데이터가 저장되는 공간
- keystore : 어카운트의 개인 키를 저장하는 공간
- geth
제네시스 블록 초기 설정
초기의 제네시스 블록은 설정 기본적인 설정을 하여 네트워크를 시작합니다. 몇몇 정보는 초기 설정 없이 네트워크 내에서 설정이 가능합니다. coinbase의 경우 채굴에 대한 보상을 받을 설정을 하는 곳이므로 어카운트 주소를 알고 있다면 아래의 값에 본인의 어카운트를 입력하면 됩니다. alloc의 경우 어카운트가 가지고 있을 이더의 양을 정할 수 있습니다. 단위는 Wei단위이므로 생각보다 큰 수를 주게 됩니다.
{
"config": {
"chainId": 33,
"homesteadBlock": 0,
"eip150Block" : 0,
"eip155Block": 0,
"eip158Block":0
},
"nonce": "0x0000000000000013",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "0x8000000",
"difficulty": "0x100",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": {
"0x0b220b02cbac64506f105a4bccb11cb63c1cd2e0": {
"balance": "1000000000000000000000000000000000000000000000000000000000000000000000000"
}
}
}
설정에 대한 설명
키
|
설명
|
config
|
특정 이더리움 프로토콜 버전을 생성하기 위한 설정을 합니다.
|
chainId
|
네트워크를 구별하는 Id값을 설정합니다.
이더리움(ETH)는 chainId가 1이고 이더리움 클래식(ETC)는 chainId가 61입니다. 프라이빗 네트워크로 설정하고 싶다면 정해진 chainId를 제외하고 설정을 하면 됩니다. 또는 같은 chainId여도 제네시스블록이 다르면 다른 네트워크로 인식한다고 합니다. |
homesteadBlock
|
0으로 설정되면 이더리움의 홈스테드 릴리즈 버전을 사용합니다.
메인넷에서도 0으로 설정되어있습니다. |
eip155Block
|
재생 공격을 방지하기 위한 EIP155를 사용합니다.
|
nonce, mixhash, parentHash
|
제네시스 블록에서는 의미가 없습니다.
체인으로 만들어지는 블록을 위한 부분입니다. - nonce, mixhash: mixhash와 nonce를 함께 사용하여 블록이 제대로 채굴되었는지 확인합니다. 굳이 두 정보를 갖고 있는 이유는 계산 비용을 줄이기 위함입니다.
- parentHash: 이전 블록 헤더의 Keccak 256 비트 해시입니다.
|
gasLimit
|
최대 가스의 양으로 한계가 낮을수록 트랜잭션이 실패할 가능성이 높습니다.
|
difficulty
|
채굴자가 유효한 논스를 찾는 것이 얼마나 쉬운가를 나타냅니다.
낮을수록 쉬워집니다. |
alloc
|
이더를 특정주소로 사전 할당할 수 있습니다.
|
coinbase
|
채굴을 하여 얻은 보상을 받을 주소를 저장합니다.
|
timestamp
|
블록이 생성되었을 때의 시간 정보를 담게 됩니다.
|
프라이빗 네트워스 시작
genesis블록 생성하기
geth --datadir ./RainbowbearChain/ init genesis.json
cmd 창에서 genesis.json파일이 있는 폴더로 이동하여 위의 명령어를 작성하게 되면 예시의 경우 RainbowbearChain이라는 폴더에 genesis.json의 내용을 기반으로 프라이빗 네트워크가 설정됩니다. --datadir 뒤에 오는 경로 설정에 따라 프라이빗 네트워크에 대한 정보가 담긴 폴더가 정해집니다.
ex) ./생성할 폴더 이름(RainbowbearChain) init 미리 설정한 제네시스블록 파일 명(genesis.json)
새로운 account 생성
geth --datadir ./RainbowbearChain account new
생성한 RainbowbearChain에 account를 만드는 명령입니다. cmd창에서 경로에 따라 --datadir 뒤에 오는 내용이 달라집니다. 위의 예시는 genesis.json이 있던 위치에서 진행하여 RainbowbearChain 폴더 안에 account가 생성됩니다. 만약 엉뚱한 위치에 생성을 하게 된다면 Keystore이라는 이름을 가진 폴더가 생성되고 그 안에 account 파일이 생성됩니다.
네트워크 가동
geth --networkid {네트워크 ID} --datadir . --http --http.port {포트 주소} --http.api "admin,eth,miner,net,txpool,personal,web3" --allow-insecure-unlock --nodiscover --snapshot=false console
--networkid의 옵션으로 제네시스블록에서 설정해 둔 networkid값을 입력합니다.
--datadir의 옵션으로 제네시스블록으로 생성한 프라이빗 네트워크 폴더를 지정합니다.
--http를 통하여 http-rpc 서버를 활성화합니다.
--http.port의 옵션으로 사용할 포트를 입력합니다.
--http.api의 옵션으로 http-rpc 인터페이스를 통해 제공되는 API를 설정합니다.
--allow-insecure-unlock을 통하여 계정 관련 RPC가 http에 의해 노출될 때 안전하지 않은 계정 잠금 해제를 허용합니다.
--nodiscover을 통하여 다른 클라이언트가 네트워크를 찾지 못하도록 설정하였습니다.
--snapshot=false를 통하여 스냅샷 데이터베이스 모드를 비활성화하였습니다. 아무것도 적지 않는다면 기본값은 활성화입니다.
geth --networkid 33 --datadir . --http --http.port 8808 --http.api "admin,eth,miner,net,txpool,personal,web3" --allow-insecure-unlock --nodiscover --snapshot=false console
저의 경우 networkid는 33으로 설정하였고 cmd창의 경로를 RainbowbearChain으로 맞춰두었기 때문에 현재 폴더를 가리키는 '.'을 입력하였습니다. 사용할 포트의 번호는 8808을 선택하였습니다.
이렇게 실행을 하게 되면 프라이빗 네트워크를 열게 됩니다. 프라이빗 네트워크에서 계정을 만들어 채굴도 하고 송금 및 잔액확인은 다음에 글에서 다루도록 하겠습니다.