don't stop believing

Geth 설치 (on Mac), 채굴, 송금, 수수료 확인 진행하기 본문

Ethereum

Geth 설치 (on Mac), 채굴, 송금, 수수료 확인 진행하기

Tongchun 2018. 8. 24. 19:31

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 입니다.


Comments