이번엔 설치한 두대의 서버에 각각 geth 설정을 해보고 서로 어떻게 동기화하고 연동하는지 확인해보자...
우선 둘중에 메인이 되는 서버를 고르자. 그리고 genesis.json 파일을 만든다.
/root/go-ethereum/build/bin
위 경로에서 하고 있다.
{
"config": {
"chainId": 88,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "200",
"gasLimit": "2100000",
"alloc": {
}
}
위 내용으로 genesis.json 파일을 만들고 저장한다.
그리고 데이타 디렉토리로 사용할 디렉토리를 만든다.
# mkdir data
이제 genesis 파일을 이용해 초기화 한다.
# ./geth init genesis.json --datadir ./data
이렇게 해주면 초기화된다. 만약 data 디렉토리안에 기존에 연습했던 내용이 있으면 오류가 난다. 그러니 genesis.json파일을 실행할땐 data 디렉토리안을 모두 비우고 실행해야한다.
자 이제 geth를 실행해서 블록체인을 돌려보자
# ./geth --datadir ./data --networkid 88 console
네트워크 아이디를 잘 보자. 이놈이 없으면 메인넷에 붙는다...
INFO [02-27|16:00:09] Starting peer-to-peer node instance=Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9.2
INFO [02-27|16:00:09] Allocated cache and file handles database=/root/go-ethereum/build/bin/data/geth/chaindata cache=128 handles=1024
INFO [02-27|16:00:09] Initialised chain configuration config="{ChainID: 88 Homestead: 0 DAO: <nil> DAOSupport: false EIP150: <nil> EIP155: 0 EIP158: 0 Byzantium: <nil> Engine: unknown}"
INFO [02-27|16:00:09] Disk storage enabled for ethash caches dir=/root/go-ethereum/build/bin/data/geth/ethash count=3
INFO [02-27|16:00:09] Disk storage enabled for ethash DAGs dir=/root/.ethash count=2
INFO [02-27|16:00:09] Initialising Ethereum protocol versions="[63 62]" network=88
INFO [02-27|16:00:09] Loaded most recent local header number=818 hash=709ccd…598ad0 td=124571937
INFO [02-27|16:00:09] Loaded most recent local full block number=818 hash=709ccd…598ad0 td=124571937
INFO [02-27|16:00:09] Loaded most recent local fast block number=818 hash=709ccd…598ad0 td=124571937
INFO [02-27|16:00:09] Loaded local transaction journal transactions=2 dropped=2
INFO [02-27|16:00:09] Regenerated local transaction journal transactions=0 accounts=0
WARN [02-27|16:00:09] Blockchain not empty, fast sync disabled
INFO [02-27|16:00:09] Starting P2P networking
INFO [02-27|16:00:11] UDP listener up self=enode://af71c14c5387f88c3bc5b0301a9aa6c872aea38393fb41093883d319124233e9c6fa3136f0455dab66d515d22d68a25667abc1045df72f109112502e0c09bf6f@[::]:30303
INFO [02-27|16:00:11] RLPx listener up self=enode://af71c14c5387f88c3bc5b0301a9aa6c872aea38393fb41093883d319124233e9c6fa3136f0455dab66d515d22d68a25667abc1045df72f109112502e0c09bf6f@[::]:30303
INFO [02-27|16:00:11] IPC endpoint opened: /root/go-ethereum/build/bin/data/geth.ipc
Welcome to the Geth JavaScript console!
이런 내용이 나온다.
다른건 볼필요없고 config에 chainid가 88인지 확인한다.
그리고 enode값도 확인한다. enode값은 이따가 설명한다.
주소를 하나 만들어보자..
> personal.newAccount("1234567890")
숫자는 암호다. 이더리움의 주소체계는 주소별로 암호가 존재한다. 키파일이 있어도 이 암호를 모르면 소용없으니 암호를 꼭 기억하자.
이제 채굴을 해보자. 채굴을 안하면 네트워크가 돌아가지 않는다. 꼭 채굴을 하자.
우선 마이닝 후 받게되는 보상을 저장한 주소를 지정한다.
> miner.setEtherbase(personal.listAccounts[0])
맨 처음 만든 주소에 저장한다는 뜻이다. 이제 채굴을 해보자.
> miner.start()
이렇게 해주면 뭔가 막 올라가면서 채굴을 시작한다.
>================== 두번째 서버 세팅 ===================<
채굴을 돌려놓고 두번째 준비해놓은 서버에서 메인서버와 동기화 하는 것을 해보자.
첫번째 서버와 경로는 같다.
똑같이 data 디렉토리도 만들어준다.
genesis.json 파일도 똑같은 놈을 쓴다. 초기화하는 명령어도 똑같다.
# ./geth init genesis.json --datadir ./data
이렇게 해준다.
그리고 geth를 실행해야하는데 이때 아까 위에서 봤던 enode 값이 필요하다.
# ./geth --datadir ./data --networkid 88 --rpc --rpcaddr "127.0.0.1" --rpccorsdomain "*" --rpcapi "admin,db,eth,net,web3,miner,personal" --bootnodes
"enode://af71c14c5387f88c3bc5b0301a9aa6c872aea38393fb41093883d319124233e9c6fa3136f0455dab66d515d22d68a25667abc1045df72f109112502e0c09bf6f@127.0.0.1:30303" console
화면이 좁아서 두줄로 넣었지만 명령어 입력할땐 위에 값을 모두 한줄에 넣어야한다.
enode라는 부분을 잘 보자. 메인서버에서 geth를 실행했을때 나오는 enode값을 가져와서 [::] 라고 돼 있는 부분에 메인서버 ip를 넣어준것이다.
이렇게 실행하면 메인서버와 동기화하게 된다. rpc는 그냥 넣어줬다. 없어도 된다.
위와같이 실행하면 메인서버에서 geth를 실행했을때와 똑같은 화면이 나온다. 똑같이 주소를 하나 만들어준다.
그리고 조금 기다려보면 아래와 같은 화면이 나오면서 메인서버와 동기화 한다.
INFO [02-27|15:03:33] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=7.226ms mgasps=0.000 number=781 hash=ca5c74…cee969
INFO [02-27|15:03:33] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=6.101ms mgasps=0.000 number=782 hash=a24b74…ebf84b
INFO [02-27|15:03:33] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=5.667ms mgasps=0.000 number=783 hash=3d944b…194805
INFO [02-27|15:03:38] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=7.544ms mgasps=0.000 number=784 hash=957b53…e545b3
INFO [02-27|15:03:38] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=6.777ms mgasps=0.000 number=785 hash=0f0ea8…0ac2b3
INFO [02-27|15:03:38] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=6.338ms mgasps=0.000 number=786 hash=a790f3…5f5c59
number는 다를 수 있다...
이제 작업이 끝났다.
다시 메인서버에 돌아와서 miner.stop() 한뒤 아까 두번째 서버에서 만든 주소로 송금을 해본다...
먼저 암호를 풀어주고
> web3.personal.unlockAccount(eth.coinbase, "1234567890")
그 다음 송금한다.
> eth.sendTransaction({from: eth.coinbase, to: "0xe4759cc75f01ca5faeec5a9380e60a11111111", value: web3.toWei(10, "ether")})
송금한뒤 다시 마이닝한다. 마이닝을 안하면 블록이 생성되지 않기때문에 송금을 해도 송금한걸 확인할 수 없다. 반드시 마이닝하고 확인한다.
> miner.start()
이제 두번째 서버로 와서 해당 주소에 입금이 됐는지 확인해보자...
> web3.fromWei(eth.getBalance(eth.coinbase), "ether")
이렇게 쳐보면 잔액이 나올것이다. 안나오면 동기화가 아직 안된걸수도 있으니 조금 기다려보자...
아무리 기다려도 안나온다면 잘못한거니 처음부터 다시 해보자.