일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- postgres
- appium server
- PYTHON
- nohup
- centos
- insert
- nGrinder
- STF
- Jupyter Notebook
- create table
- ubuntu
- port forwarding
- Jupyter
- STF_PortForwarding
- 28015
- perfect
- rethinkdb
- mysql
- SWIFT
- nmap
- 실행권한
- openpyxl
- sshpass
- ftp
- ssh
- kitura
- Materials
- postgresql
- GoCD
- appium
- Today
- Total
don't stop believing
Geth 설치 (on Mac), 채굴, 송금, 수수료 확인 진행하기 본문
Mac에서도 Geth를 설치해 봅시다.
설치는 간단하며 아래 url을 참고하시면 됩니다.
https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Mac
먼저 brew로 go를 설치해 줍니다.
$ brew install go
go 버전도 확인해 줍니다.
$ go version go version go1.10.3 darwin/amd64
이제 go-ethereum을 git에서 다운받아 설치하겠습니다.
저는 Documents 하위에 Test_Ethereum이라고 폴더를 만들었습니다. 이곳에 다운받아 실행하겠습니다.
Test_Ethereum 폴더에서 go-ethereum을 다운받습니다.
go-ethereum 폴더에서 make 해줍니다.
$ cd ~/Documents/Test_Ethereum/ $ git clone https://github.com/ethereum/go-ethereum $ cd go-ethereum $ make geth
정상적으로 설치가 되었다면 geth 버전도 확인해 줍니다.
$ geth version Geth Version: 1.8.14-stable Architecture: amd64 Protocol Versions: [63 62] Network Id: 1 Go Version: go1.10.3 Operating System: darwin GOPATH= GOROOT=/usr/local/Cellar/go/1.10.3/libexec
로컬 테스트넷에서 Geth를 실행하기 위해 데이터 디렉터리와 genesis.json 파일을 만들어 줍니다.
$ cd .. $ mkdir data_testnet $ cd data_testnet
데이터 디렉터리안에 아래와 같이 genesis.json파일을 만들어 줍니다.
{ "config": { "chainId": 45, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc" : {}, "coinbase" : "0x0000000000000000000000000000000000000000", "difficulty" : "0x20000", "extraData" : "", "gasLimit" : "0x2fefd8", "nonce" : "0x0000000000000042", "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp" : "0x00" }
데이터 디렉터리 경로와 jenesis.json 파일 경로로 geth를 초기화 해줍니다.
geth --datadir /Users/tongchunkim/Documents/Test_Ethereum/data_testnet init /Users/tongchunkim/Documents/Test_Ethereum/data_testnet/genesis.json
$ geth --datadir /Users/tongchunkim/Documents/Test_Ethereum/data_testnet init /Users/tongchunkim/Documents/Test_Ethereum/data_testnet/genesis.json INFO [08-24|18:53:41.710] Maximum peer count ETH=25 LES=0 total=25 INFO [08-24|18:53:41.719] Allocated cache and file handles database=/Users/tongchunkim/Documents/Test_Ethereum/data_testnet/geth/chaindata cache=16 handles=16 INFO [08-24|18:53:41.727] Writing custom genesis block INFO [08-24|18:53:41.727] Persisted trie from memory database nodes=0 size=0.00B time=11.708µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B INFO [08-24|18:53:41.727] Successfully wrote genesis state database=chaindata hash=a0dbf0…35ae76 INFO [08-24|18:53:41.727] Allocated cache and file handles database=/Users/tongchunkim/Documents/Test_Ethereum/data_testnet/geth/lightchaindata cache=16 handles=16 INFO [08-24|18:53:41.730] Writing custom genesis block INFO [08-24|18:53:41.730] Persisted trie from memory database nodes=0 size=0.00B time=2.873µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B INFO [08-24|18:53:41.730] Successfully wrote genesis state database=lightchaindata hash=a0dbf0…35ae76
Geth를 초기화 했다면 실행할 차례입니다.
아래 명령으로 실행해 줍니다.
geth --networkid 45 --nodiscover --maxpeers 0 --datadir /Users/tongchunkim/Documents/Test_Ethereum/data_testnet console 2>> /Users/tongchunkim/Documents/Test_Ethereum/data_testnet/geth.log
$ geth --networkid 45 --nodiscover --maxpeers 0 --datadir /Users/tongchunkim/Documents/Test_Ethereum/data_testnet console 2>> /Users/tongchunkim/Documents/Test_Ethereum/data_testnet/geth.log Welcome to the Geth JavaScript console! instance: Geth/v1.8.14-stable/darwin-amd64/go1.10.3 modules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
계정도 만들어 줍니다.
> personal.newAccount("ngle1234") "0x75d9c459db85fde374142e9b13423b761a5e5417" > personal.newAccount("tongchun1234") "0xb06a1d4e155e8110787023ddb1fe588fea1097df" > personal.newAccount("tongchun1234") "0x679d14762edcbd32da4a8fd302ec9a187a50c188" > eth.accounts ["0x75d9c459db85fde374142e9b13423b761a5e5417", "0xb06a1d4e155e8110787023ddb1fe588fea1097df", "0x679d14762edcbd32da4a8fd302ec9a187a50c188"]
계정을 만들다가 비번이 같은 계정이 만들어 졌습니다.
계정의 주소는 다르게 나왔으며 계정의 배열 순서로 인식하기 때문에 문제 없는것 같습니다.
eth.coinbase를 확인하고 채굴도 해보겠습니다.
> miner.setEtherbase(eth.accounts[0]) true > eth.coinbase "0x78ce083531ff41d26c7002efcf4eec1fd11deaa0" > miner.start(1) null
여기서 이슈가 하나 있습니다.
miner.start() 명령을 사용하면 true나 false가 아닌 null이 리턴되고 있습니다.
> eth.mining true > eth.hashrate 0 > eth.blockNumber 195 > eth.blockNumber 196 > eth.blockNumber 197
mining 상태는 true로 나오지만 hashrate은 0으로 리턴됩니다.
blockNumer는 증가하며 mining은 진행되고 있는 것 같습니다.
terminal을 하나 더 열고 tail 명령으로 geth.log를 확인해 보면 block이 생성되고 있는 것은 확인할 수 있습니다.
$ tail -100f ~/Documents/Test_Ethereum/data_testnet/geth.log INFO [08-24|22:06:36.703] Commit new mining work number=302 uncles=0 txs=0 gas=0 fees=0 elapsed=197.208µs INFO [08-24|22:06:42.724] Successfully sealed new block number=302 hash=3d98e9…ca3d29 elapsed=6.020s INFO [08-24|22:06:42.724] 🔗 block reached canonical chain number=297 hash=9f19ee…5e396a INFO [08-24|22:06:42.725] 🔨 mined potential block number=302 hash=3d98e9…ca3d29 INFO [08-24|22:06:42.725] Commit new mining work number=303 uncles=0 txs=0 gas=0 fees=0 elapsed=142.87µs INFO [08-24|22:06:43.217] Successfully sealed new block number=303 hash=f06ff7…39a068 elapsed=492.019ms INFO [08-24|22:06:43.217] 🔗 block reached canonical chain number=298 hash=4d84ef…7eeabe INFO [08-24|22:06:43.217] 🔨 mined potential block number=303 hash=f06ff7…39a068 INFO [08-24|22:06:43.217] Commit new mining work number=304 uncles=0 txs=0 gas=0 fees=0 elapsed=116.42µs INFO [08-24|22:06:43.525] Successfully sealed new block number=304 hash=2a4fc1…b6abb4 elapsed=308.044ms INFO [08-24|22:06:43.526] 🔗 block reached canonical chain number=299 hash=d12c1d…a6b7a2 INFO [08-24|22:06:43.526] 🔨 mined potential block number=304 hash=2a4fc1…b6abb4 INFO [08-24|22:06:43.526] Commit new mining work number=305 uncles=0 txs=0 gas=0 fees=0 elapsed=142.872µs INFO [08-24|22:06:44.851] Successfully sealed new block number=305 hash=619ab1…2dc9e3 elapsed=1.325s INFO [08-24|22:06:44.852] 🔗 block reached canonical chain number=300 hash=fc6589…a334c1 INFO [08-24|22:06:44.852] 🔨 mined potential block number=305 hash=619ab1…2dc9e3 INFO [08-24|22:06:44.852] Commit new mining work number=306 uncles=0 txs=0 gas=0 fees=0 elapsed=130.602µs
mining을 중지하고 eth.coinbase 계정에 Ether가 있는지 확인해 보겠습니다.
> miner.stop() true > eth.blockNumber 305 > eth.getBalance(eth.coinbase) 1.515e+21 > web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") 1515
block 길이가 305이고 coinbase인 accounts[0]에 1515 ether가 있는걸 확인할 수 있습니다.
이제 sendTransaction으로 ether를 송금하겠습니다.
먼저 unlock을 해줍니다.
> personal.unlockAccount(eth.accounts[0], "ngle1234", 0) true > eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value:web3.toWei(10, "ether")}) "0x348d809bce6f673f8be0efe68dfa835d8f4db3434f23ece6dbc2bdc17d1ab8a2"
Transaction ID를 확인해 봅니다.
> eth.getTransaction("0x348d809bce6f673f8be0efe68dfa835d8f4db3434f23ece6dbc2bdc17d1ab8a2") { blockHash: "0x0000000000000000000000000000000000000000000000000000000000000000", blockNumber: null, from: "0x78ce083531ff41d26c7002efcf4eec1fd11deaa0", gas: 90000, gasPrice: 18000000000, hash: "0x348d809bce6f673f8be0efe68dfa835d8f4db3434f23ece6dbc2bdc17d1ab8a2", input: "0x", nonce: 1, r: "0x5015f3194398cfa7f7906ead26dfadde89e7017c139aa5ec71c0f384a6ce1d02", s: "0x77e6a5cc357121870bde5f84d3868daf87a4f8d5cc91d6bc3714c2f5152762cc", to: "0xb5a162be96f52f7d68f1dcb2c0c9a097ed4b6142", transactionIndex: 0, v: "0x7d", value: 10000000000000000000 }
blockNumber 가 null인 걸 확인할 수 있습니다. 아직 블록에 포함되지 않았습니다.
pendingTransaction 명령으로 계중 중인 트랜잭션을 확인해 보겠습니다.
> eth.pendingTransactions [{ blockHash: null, blockNumber: null, from: "0x78ce083531ff41d26c7002efcf4eec1fd11deaa0", gas: 90000, gasPrice: 18000000000, hash: "0x348d809bce6f673f8be0efe68dfa835d8f4db3434f23ece6dbc2bdc17d1ab8a2", input: "0x", nonce: 1, r: "0x5015f3194398cfa7f7906ead26dfadde89e7017c139aa5ec71c0f384a6ce1d02", s: "0x77e6a5cc357121870bde5f84d3868daf87a4f8d5cc91d6bc3714c2f5152762cc", to: "0xb5a162be96f52f7d68f1dcb2c0c9a097ed4b6142", transactionIndex: 0, v: "0x7d", value: 10000000000000000000 }]
sendTransaction으로 보낸 송금이 아직 처리되지 않은 상태(pending)인 것을 확인할 수 있습니다.
이제 채굴을 통해 블록을 생성하겠습니다.
> miner.start(1) null > miner.stop() true > eth.blockNumber 317 > eth.pendingTransactions []
역시나 miner.start() 명령은 null이 리턴되고 있습니다.
조금 기다린 후 mining을 멈추고 pending 상태인 Transaction을 확인해 보면 비어 있는 것을 확인할 수 있습니다.
getTransaction 명령으로 Transaction이 처리 되었는지 확인해 보겠습니다.
> eth.getTransaction("0x348d809bce6f673f8be0efe68dfa835d8f4db3434f23ece6dbc2bdc17d1ab8a2") { blockHash: "0x08f19657a298819b47b6ed58d30447c42fe027320bee1d6dc6477d6c961274ef", blockNumber: 306, from: "0x78ce083531ff41d26c7002efcf4eec1fd11deaa0", gas: 90000, gasPrice: 18000000000, hash: "0x348d809bce6f673f8be0efe68dfa835d8f4db3434f23ece6dbc2bdc17d1ab8a2", input: "0x", nonce: 1, r: "0x5015f3194398cfa7f7906ead26dfadde89e7017c139aa5ec71c0f384a6ce1d02", s: "0x77e6a5cc357121870bde5f84d3868daf87a4f8d5cc91d6bc3714c2f5152762cc", to: "0xb5a162be96f52f7d68f1dcb2c0c9a097ed4b6142", transactionIndex: 0, v: "0x7d", value: 10000000000000000000 }
null이었던 blockNumber에 306 블록이 할당된 걸 확인할 수 있습니다.
getBlock 명령으로 블럭을 확인해 봅시다.
> eth.getBlock(306) { difficulty: 135574, extraData: "0xd98301080e846765746888676f312e31302e338664617277696e", gasLimit: 4234592, gasUsed: 21000, hash: "0x08f19657a298819b47b6ed58d30447c42fe027320bee1d6dc6477d6c961274ef", logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", miner: "0x78ce083531ff41d26c7002efcf4eec1fd11deaa0", mixHash: "0xe66ff2a3ba6ce05392d8aa745260d3bbc6e134070bade8e841fd6768e4d09fd5", nonce: "0x2703369b5206ed06", number: 306, parentHash: "0x619ab1e712d4997d0cf61bd0da4904b0a6bdda2eb1f8821c55f68aa10f2dc9e3", receiptsRoot: "0x142b67a33c0fd61491023ccf9abdfb9bb1e5267a80f39bec6dee5c4645df411c", sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", size: 653, stateRoot: "0x428449152b8e48cbddc6005964a9913c2dbe2b4cce59c23b06fe0e3db81fe0ac", timestamp: 1535117326, totalDifficulty: 42114861, transactions: ["0x348d809bce6f673f8be0efe68dfa835d8f4db3434f23ece6dbc2bdc17d1ab8a2"], transactionsRoot: "0x5825262831b3acfe07ae598a1b8139af20b7e5b48a7c9ed59ae1987486723d17", uncles: [] }
블록 정보의 transactions 배열에 앞서 진행한 Transaction ID가 포함된 걸 확인할 수 있습니다.
이제 무사히 송금이 되었으니 잔고를 확인해 봅시다.
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") 1565 > web3.fromWei(eth.getBalance(eth.accounts[1]), "ether") 10
accounts[1]에 10 Ether가 들어가 있습니다.
accounts[0]은 채굴을 통해 Ether가 더 늘었네요.
이번엔 수수료 확인을 해보겠습니다. 먼저 세 계정의 현재 잔고를 확인해 줍니다.
> web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") 1565 > web3.fromWei(eth.getBalance(eth.accounts[1]), "ether") 20 > web3.fromWei(eth.getBalance(eth.accounts[2]), "ether") 0
현재 모든 block은 account[0]이 만들었습니다.
이제 accounts[1]이 account[2]에게 송금하면서 수수료 변화에 대해 확인해 보겠습니다.
accounts[1]를 unlock 하고
accounts[1]에서 accounts[2]로 10 Ether를 송금합니다.
block 생성을 위해 mining을 시작하고
pending 상태의 Transactions 가 없어졌다면 mining을 중지합니다.
> personal.unlockAccount(eth.accounts[1], "tongchun1234", 0) true > eth.sendTransaction({from:eth.accounts[1], to:eth.accounts[2], value:web3.toWei(10, "ether")}) "0x5611fa6fd89e22b4c8e58fff83a8b005b8ba9db2a6b79b509363916a297cf126" > miner.start(1) null > eth.pendingTransactions [] > miner.stop() true
이제 세 계정의 잔고를 다시 확인합니다.
> eth.getBalance(eth.accounts[0]) 1.600000378e+21 > web3.fromWei(eth.getBalance(eth.accounts[0]), "ether") 1600.000378 > eth.getBalance(eth.accounts[1]) 9999622000000000000 > web3.fromWei(eth.getBalance(eth.accounts[1]), "ether") 9.999622 > eth.getBalance(eth.accounts[2]) 10000000000000000000 > web3.fromWei(eth.getBalance(eth.accounts[2]), "ether") 10
accounts[0]은 자신이 생성한 block에 Transaction을 처리해 수수료로 0.000378 Ether를 받았습니다.
accounts[1]은 Transaction 처리 비용으로 0.000378 Ether의 수수료를 냈습니다.
(10 - 9.999622 = 0.000378)
accounts[2]는 송금받았기 때문에 아무런 수수료가 없습니다.
Transaction 정보를 확인해 보겠습니다.
> eth.getTransaction("0x5611fa6fd89e22b4c8e58fff83a8b005b8ba9db2a6b79b509363916a297cf126") { blockHash: "0xc780feea8585f13b21fbb821cd3fc90447f5f78ff7821605555c0e75f27164fa", blockNumber: 318, from: "0xb5a162be96f52f7d68f1dcb2c0c9a097ed4b6142", gas: 90000, gasPrice: 18000000000, hash: "0x5611fa6fd89e22b4c8e58fff83a8b005b8ba9db2a6b79b509363916a297cf126", input: "0x", nonce: 0, r: "0x36871652ba5bd6c1bcdeb563fd278a1471e01632459a4b51248cedb4163571fc", s: "0x38034c46262c0fda1121b92d5dbe33a0eeed401fcb4e5d9f3faa83179bf683c7", to: "0xa6e12c605be72b4e201a94e56346d5d6463b366e", transactionIndex: 0, v: "0x7d", value: 10000000000000000000 }
지불 가능한 최대 gas는 90000이네요.
gasPrice는 1 gas에 해당하는 wei 입니다.
0.000378 Ether는 378000000000000 wei 입니다. 이걸 gasPrice로 나누면 수수료로 사용된 gas를 알수 있습니다.
> web3.toWei(0.000378) "378000000000000" > eth.gasPrice 18000000000 > web3.toWei(0.000378)/eth.gasPrice 21000
수수료로 사용된 gas는 21000 입니다.
Geth 설치부터 채굴, 송금, 수수료 확인까지 한방에 알아봤습니다.
geth 종료는 exit 입니다.
'Ethereum' 카테고리의 다른 글
Geth 백그라운드 실행과 JSON-RPC 서버 실행 (0) | 2018.08.25 |
---|---|
genesis 파일을 알아봅시다. (0) | 2018.08.25 |
Ether 송금 과 수수료 확인 (on Local TestNet) (0) | 2018.08.24 |
채굴하기 (on Local TestNet) (2) | 2018.08.24 |
Geth (Go-ethereum) 설치 (on Ubuntu) (0) | 2018.08.23 |