이더리움 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 옵션에 설정한 폴더를 들여다보면 생성된 계좌주소를 확인할 수 있습니다.
그냥 넘어가면 심심하니까 생성된 계좌주소 리스트로 출력하는 거 해보고 넘어가겠습니다. ㅋㅋㅋㅋㅋ
geth --datadir “./data” account list
생성된 계좌의 리스트가 출력됩니다.
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" },
}
}
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/158difiiculty 는 이더리움에서 채굴의 난이도를 설정하는 옵션입니다. 난이도가 낮을 수록 채굴속도가 빨라집니다.
gas limit은 한 블록이 담을 수 있는 gas의 수치를 말합니다. gas 수치가 높을 수록 한 블록이 담을 수 있는 거래가 많아집니다. 그러면 거래가 빨라지겠죵?
coinbase는 network를 구동할 때 기본으로 사용할 계좌를 설정하는 옵션입니다. 채굴을 할 때 코인을 받을 계좌입니다.
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이 생성되면 아래와 같은 문구가 출력됩니다.
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 콘솔창이 나오면 성공입니다 :)
geth 콘솔에서 계좌 조회를 해보겠습니다.
eth.accounts 를 입력합니다. 현재 생성되어 있는 계좌들이 출력됩니다. eth.accounts[0]과 같이 입력하면 해당 계좌 중 첫 번째로 생성된 계좌를 출력할 수 있습니다. 그리고 해당 계좌가 가지고 있는 이더 잔고 조회도 해보겠습니다. 잔고조회를 할 때는 eth.getBalance()함수를 사용하고 인자로 계좌주소를 적어줍니다. eth.getBalance("0x7df9a875a174b3bc565e6424a0050ebc1b2d1d82") 이런 식으로 사용할 수도 있고 eth.getBalance(eth.accounts[0]) 와 같이 사용할 수도 있습니다.
3.1 geth 안에서 계좌 생성과 이더 전송하기
자 그럼 geth 콘솔안에서 계좌를 하나더 생성해보겠습니다. personal.newAccount()를 입력합니다. 그러면 비밀번호를 물어봅니다. 비밀번호를 설정하면 새로운 계좌가 짠~
eth.accounts를 입력해보면 새롭게 생성된 계좌가 추가된 걸 확인할 수 있습니다.
계좌가 두 개가 생겼으니 이더를 한 번 전송해보겠습니다. 첫 번째 계좌에서 두 번째 계좌로 100wei를 보내겠습니다. 이더를 전송하기 전에 반드시 해야하는 작업이 하나 있습니다. 이더를 전송하려는 계좌의 락을 풀어줘야 합니다!!!!!!!!!!!!!!!! 명심명심!!!!!!!!!!!
personal.unlockAccount(eth.accounts[0])를 입력하고 비밀번호를 입력해서 락을 풀어줍니다.
eth.sendTransaction({from: eth.accounts[0], to:eth.accounts[1], value:100}) 을 입력합니다.
전송을 하고 나서 잔고를 조회해보면 잔고에 변화가 없다는 걸 볼 수가 있습니다. 블록체인이니까 채굴이 되어야 위에서 발생된 거래가 적용됩니다. 채굴을 시작하겠습니다.
miner.start()를 입력하면 채굴이 시작됩니다. 처음 채굴을 시작하면 DAG라고 하는 파일을 이더리움이 만들기 시작하는 데 이 과정이 조금 걸립니다. (아니 꽤 걸립니다)
채굴이 시작되고 조금 시간이 지난 후에 minet.stop() 명령어를 사용해서 채굴을 멈추고 계좌조회를 해보면 위에서 입력한 거래가 성공적으로 반영된 것을 확인할 수 있습니다.
eth.getBalance(eth.accounts[1])
geth 콘솔에서 나올 때는 exit를 입력하면 됩니다.
이 번편에서는 private network를 구동할 때 설정해야할 genesis 파일 설정 방법, network 구동에 관련된 geth 옵션과 geth 콘솔에서 이더 전송 법 등을 알아봤습니다.
다음 편에서는 private network와 이더리움 클라이언트 앱들(mist, remix 등) 연결 방법과 사용법을 알아보겠습니다~~~
이벤트 참여 감사합니다ㅎㅎ
보팅 꾹 누르구 가용~^^
감사합니다 :)