켄타 avatar

이더리움 Dapp만들기 2.[geth 실행과 private network 구동]

pangol

Published: 29 May 2018 › Updated: 29 May 2018이더리움 Dapp만들기 2.[geth 실행과 private network 구동]

이더리움 Dapp만들기 2.[geth 실행과 private network 구동]

private network를 구동시키기 전에 준비해야 할 것이 두 가지가 있습니다. 첫 번째는 private network에서 사용할 계좌이고 두 번째는 제네시스 블록 정보입니다. geth를 사용해서 새로운 계좌를 생성해보도록 하겠습니다

1. 계좌 생성하기

geth --datadir “./data” account new

--datadir 옵션은 network가 구동될 때 블록정보, 계좌정보를 저장할 폴더를 지정하는 옵션입니다. (사용하려는 폴더 생성해서 지정하면 됩니다. 지정하지 않을 때에는 default로 $HOME/.ethereum 폴더에 저장됩니다.)

--datadir “./data” 의미는 data폴더에 network에서 구동하는 정보를 저장해라라는 의미입니다.

account new 는 새로운 계좌를 생성하라는 의미입니다.

geth 명령어의 구조는 아래와 같이 구성되어 있으며 geth help로 확인할 수 있고
https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options 해당 위키에 가면 확인할 수 있습니다.

geth [options] command [command options] [arguments...]

계좌 생성명령어를 치면 계좌의 비밀번호를 설정을 묻는 문구가 나오고 비밀번호를 입력하면 생성된 계좌주소를 보여줍니다. --datadir 옵션에 설정한 폴더를 들여다보면 생성된 계좌주소를 확인할 수 있습니다.

01.png

그냥 넘어가면 심심하니까 생성된 계좌주소 리스트로 출력하는 거 해보고 넘어가겠습니다. ㅋㅋㅋㅋㅋ

geth --datadir ./data  account list  

생성된 계좌의 리스트가 출력됩니다.

02.png

account 관련 옵션은 아래 링크에서 확인할 수 있습니다.
https://github.com/ethereum/go-ethereum/wiki/Managing-your-accounts

2. 제네시스(Genesis) 블록 생성하기

private network를 구동하기 위해서는 첫 번째 블록을 생성해야 합니다. 이더리움에서는 json 파일 형태로 작성해서 geth를 이용해서 생성할 수 있습니다.

제네시스 블록을 만들 때 필요한 json파일의 구성은 아래와 같습니다.

{
    "config": {
        "chainId": 15,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
    },
    "difficulty": "200000000",
    "gasLimit": "2100000",
    coinbase: "0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82",
    "alloc": {
        "0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82": { "balance": "1000000000000000000000000" },
     }
}
  1. config 는 생성할 private network의 버전을 정하는 설정입니다. chainId, homestreadBlock, eip155Block, eip518Block 속성 모두 이더리움 속성과 관련된 설정이며 chainId는 replay protection을 사용하는 설정입니다. homestead는 이더리움의 두 번째 메인 릴리즈를 사용하기 위해 설정하는 속성이고 0으로 설정하면 해당 릴리즈를 사용합니다. eip155은 gas 비용에 관련된 하드포커 설정이며 eip158은 state cleanig과 관련된 설정입니다. 관련 설정에 대해서 더 알고 싶으신 분은 아래 링크에서 확인해보세요~ (저도 아직 다..못 읽었다는 ^^;;)
    eip155 - https://github.com/ethereum/EIPs/issues/150
    eip158 - https://github.com/ethereum/EIPs/issues/158

  2. difiiculty 는 이더리움에서 채굴의 난이도를 설정하는 옵션입니다. 난이도가 낮을 수록 채굴속도가 빨라집니다.

  3. gas limit은 한 블록이 담을 수 있는 gas의 수치를 말합니다. gas 수치가 높을 수록 한 블록이 담을 수 있는 거래가 많아집니다. 그러면 거래가 빨라지겠죵?

  4. coinbase는 network를 구동할 때 기본으로 사용할 계좌를 설정하는 옵션입니다. 채굴을 할 때 코인을 받을 계좌입니다.

  5. alloc는 private network를 구동할 때, 미리 계좌에 이더를 입금시킬지를 설정하는 옵션입니다. 설정하기 원하는 계좌와 이더 값을 명시합니다. 여기에 적는 이더금액은 wei 단위입니다. 10의 18승 wei는 1 ether입니다. (1 ether = 10^18 wei)

자, private network genesis block을 생성해보겠습니다.

geth --datadir “./data” init “./genesis.json”
init 명령어와 genesis.json파일의 위치를 명시해주면 됩니다.
성공적으로 genesis block이 생성되면 아래와 같은 문구가 출력됩니다.

03.png

3. Private network 구동하기

첫 번째 블록을 만들었으니 이제 네트워크를 실행시켜 보겠습니다. private network를 구동할 때 유의해야할 옵션은 --networkid 입니다. networkid 를 1로 지정시 메인 이더리움에 연결이 됩니다. 2는 테스트 네트워크로 사용중입니다. 1과 2를 제외한 수를 지정해야 합니다.

또한 --identity 옵션을 사용해서 네트워크에 이름을 지정할 수 있습니다. networkid와 identity는 node들간에 연결할 때 사용되는 옵션입니다. networkid와 identity가 같은 노드는 서로 연결할 수 있습니다.

아래는 현재 사용되고 있는 network id 정보들입니다.

0: Olympic, Ethereum public pre-release testnet
1: Frontier, Homestead, Metropolis, the Ethereum public main network
1: Classic, the (un)forked public Ethereum Classic main network, chain ID 61
1: Expanse, an alternative Ethereum implementation, chain ID 2
2: Morden, the public Ethereum testnet, now Ethereum Classic testnet
3: Ropsten, the public cross-client Ethereum testnet
4: Rinkeby, the public Geth PoA testnet
8: Ubiq, the public Gubiq main network with flux difficulty chain ID 8
42: Kovan, the public Parity PoA testnet
77: Sokol, the public POA Network testnet
99: Core, the public POA Network main network
7762959: Musicoin, the music blockchain
[Other]: Could indicate that your connected to a local development test network.

위의 networkid를 피해서 1988로 설정하고 identity는 “Mynetwork”를 사용하겠습니다.

그리고 --mine 옵션을 설정해서 geth를 구동했을 때 채굴을 할 수 있게 합니다. --nodiscover 옵션을 사용해서 다른 노드를 찾는 설정을 끕니다. console 커맨드를 설정해서 geth 콘솔 환경에 접속하겠습니다. 실행할 명령어는 아래와 같습니다.

geth --networkid 1988 --identity “Mynetwork” --datadir “./data” --nodiscover console

아래와 같이 geth 콘솔창이 나오면 성공입니다 :)

04.png

geth 콘솔에서 계좌 조회를 해보겠습니다.
eth.accounts 를 입력합니다. 현재 생성되어 있는 계좌들이 출력됩니다. eth.accounts[0]과 같이 입력하면 해당 계좌 중 첫 번째로 생성된 계좌를 출력할 수 있습니다. 그리고 해당 계좌가 가지고 있는 이더 잔고 조회도 해보겠습니다. 잔고조회를 할 때는 eth.getBalance()함수를 사용하고 인자로 계좌주소를 적어줍니다. eth.getBalance("0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82") 이런 식으로 사용할 수도 있고 eth.getBalance(eth.accounts[0]) 와 같이 사용할 수도 있습니다.

05.png

3.1 geth 안에서 계좌 생성과 이더 전송하기

자 그럼 geth 콘솔안에서 계좌를 하나더 생성해보겠습니다. personal.newAccount()를 입력합니다. 그러면 비밀번호를 물어봅니다. 비밀번호를 설정하면 새로운 계좌가 짠~
eth.accounts를 입력해보면 새롭게 생성된 계좌가 추가된 걸 확인할 수 있습니다.

06.png

계좌가 두 개가 생겼으니 이더를 한 번 전송해보겠습니다. 첫 번째 계좌에서 두 번째 계좌로 100wei를 보내겠습니다. 이더를 전송하기 전에 반드시 해야하는 작업이 하나 있습니다. 이더를 전송하려는 계좌의 락을 풀어줘야 합니다!!!!!!!!!!!!!!!! 명심명심!!!!!!!!!!!

personal.unlockAccount(eth.accounts[0])를 입력하고 비밀번호를 입력해서 락을 풀어줍니다.
eth.sendTransaction({from: eth.accounts[0], to:eth.accounts[1], value:100}) 을 입력합니다.

07.png

전송을 하고 나서 잔고를 조회해보면 잔고에 변화가 없다는 걸 볼 수가 있습니다. 블록체인이니까 채굴이 되어야 위에서 발생된 거래가 적용됩니다. 채굴을 시작하겠습니다.

miner.start()를 입력하면 채굴이 시작됩니다. 처음 채굴을 시작하면 DAG라고 하는 파일을 이더리움이 만들기 시작하는 데 이 과정이 조금 걸립니다. (아니 꽤 걸립니다)

08.png

채굴이 시작되고 조금 시간이 지난 후에 minet.stop() 명령어를 사용해서 채굴을 멈추고 계좌조회를 해보면 위에서 입력한 거래가 성공적으로 반영된 것을 확인할 수 있습니다.

eth.getBalance(eth.accounts[1])

09.png

geth 콘솔에서 나올 때는 exit를 입력하면 됩니다.

이 번편에서는 private network를 구동할 때 설정해야할 genesis 파일 설정 방법, network 구동에 관련된 geth 옵션과 geth 콘솔에서 이더 전송 법 등을 알아봤습니다.

다음 편에서는 private network와 이더리움 클라이언트 앱들(mist, remix 등) 연결 방법과 사용법을 알아보겠습니다~~~

Leave 이더리움 Dapp만들기 2.[geth 실행과 private network 구동] to:

Written by

프로그래머 활동가

Read more #kr posts


Best Posts From 켄타

We have not curated any of pangol's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From 켄타