geth 시작하기

in blockchain •  4 years ago  (edited)

1. Geth 시작하기

터미널을 열고 geth를 입력하면 mainnet에 접속할 수 있습니다. 실제 이더리움이 동작하고 있는 환경이죠. 하지만 개발을 위해서는 자신만의 network를 구성하여 테스트하는 환경이 필요합니다. 이를 위해서는 가장 먼저 geth를 초기화를 해야합니다.

geth의 초기화를 위해서는 초기블록(genesis block)의 정보를 먼저 구성해야 합니다.

> vim genesis.json

{
  "config": {
    "chainId": 4693,
    "homesteadBlock": 0,
    "eip155Block": 0,
    "eip158Block": 0,
    "eip150Block":0,
    "byzantiumBlock":0,
    "constantinopleBlock":0,
    "petersburgBlock":0
  },
  "alloc": {},
  "coinbase": "0x0000000000000000000000000000000000000000",
  "difficulty": "0x20000",
  "extraData": "",
  "gasLimit": "0x2fefd8",
  "nonce": "0x0000000000000042",
  "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000
  "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000
  "timestamp": "0x00"
}

위와 같이 genesis block의 정보를 알려주는 genesis.json 파일을 하나 생성합니다.
이후 init 명령어를 통해 초기화를 진행합니다.

❯ geth --datadir myGeth init genesis.json

--datadir 옵션은 geth가 구동되는 directory를 지정하는 명령어입니다.
위와 같이 입력하면 현재 폴더에 myGeth라는 폴더가 생성되고 이 안에 앞으로 생성할 계정이나 log가 저장됩니다.

초기화를 했으니 이제 geth를 직접 구동해봅시다.

❯ geth --datadir myGeth console

--datadir 옵셥을 통해 초기화할때 사용한 directory를 설정하고 geth 내부에서 작업을 수행하기 위해 console로 접근합니다.
console 내부에서는 명령어를 사용하여 계정을 생성하거나 트랜잭션을 전송하는 등의 작업을 수행할 수 있습니다.

2. 계정 생성 및 채굴

가장 먼저 해야할 것은 계정을 생성하는 것입니다.

❯ personal.newAccount("pass00")
"0x95d02ef6f14f7b8a4c162dbc0aa64043cad86a75"

personal 객체에서 newAccount 함수를 통해 계정을 생성할 수 있습니다. 함수의 인자는 계정을 lock/unlock할때 사용하는 password로 기억할 수 있는 것으로 설정하셔야 합니다.

함수가 실행되고 나면 어떤 값을 반환하는데 이것이 바로 이 계정의 주소값이 됩니다.

첫번째 계정이 생성되었으면 이제 채굴(mining)을 할 수 있습니다. mining을 하게되면 블록을 생성한 댓가로 이더를 보상으로 받게 되는데 이때 이더를 받는 주소가 coinbase입니다. 위에서 첫번째 계정을 생성하였으면 coinbase가 첫번째 계정으로 자동으로 연결됩니다.

다음의 명령어를 통해 coinbase를 직접 확인할 수 있습니다.

❯ eth.coinbase
"0x95d02ef6f14f7b8a4c162dbc0aa64043cad86a75"

실제로 마이닝을 하기전 이더의 잔액을 확인해봅시다.

❯ eth.getBalance("0x95d02ef6f14f7b8a4c162dbc0aa64043cad86a75")
0

생성된 계정의 주소를 인자로 주면 계정이 가지고 있는 이더의 양을 보여줍니다. (Wei단위)

❯ miner.start(1)

마이닝을 시작하는 명령어입니다. 인자로 마이닝을 수행할 스레드의 갯수를 인자로 받는데 테스트용도이므로 1로 설정해줍니다.

❯ miner.stop()

마이닝을 정지하는 명령어입니다.(계속 마이닝되면서 입력중에 log가 계속 나오는데 무시하고 그냥 입력하면 됩니다.)

이제 다시 계정의 잔고를 확인해봅시다.

❯ eth.getBalance(eth.accounts[0])
215000000000000000000

아까와는 달리 함수의 인자로 다른 값을 넣어주었습니다. eth.accounts를 하면 현재 계정의 주소값들을 배열로 반환해줍니다. 그중에서 첫번째 배열의 값이 바로 첫번째로 생성한 계정의 주소값입니다.
잔고를 확인해본 결과 아까와는 달리 이더가 늘어나 있는 것을 볼 수 있습니다.

3. 트랜잭션 전송

이제 계정을 하나 더 생성하고 이 계정에 이더를 전송해봅시다.

❯ personal.newAccount("pass01")

"0xffd4c14bbe43af76ab1b09cf101f93f58192321c"

❯ eth.sendTransaction( {<br>
...... from : eth.accounts[0],<br>
...... to : eth.accounts[1],<br>
...... value : web3.toWei(100,'ether') }<br>
... )

eth.sendTransaction 함수를 통해 이더를 전송할 수 있습니다. from에는 첫번째 계정의 주소를 to에는 보내고자 하는 주소, 즉 두번째 계정의 주소를 입력하고 value에 전송하고자 하는 이더의 양을 입력합니다. 이더의 기본 단위는 wei로 되어 있으므로 web3.toWei(100, 'ether')을 통해 100ether를 설정할 수 있습니다.

Error: authentication needed: password or unlock
    at web3.js:3143:20
    at web3.js:6347:15
    at web3.js:5081:36
    at <anonymous>:1:1

위의 명령어를 입력하면 다음과 같은 에러가 발생합니다. 그 이유는 처음 계정을 생성할때 lock/unlock을 위한 password를 인자로 주게된다고 했는데요. 여기서 트랜잭션을 전송하기 위해서는 from측의 계정을 먼저 unlock해야 합니다.

❯ personal.unlockAccount(eth.accounts[0])
Unlock account 0x95d02ef6f14f7b8a4c162dbc0aa64043cad86a75
Passphrase:
true

첫번째 계정의 주소를 인자로 주면 비밀번호를 입력하라는 메시지가 나옵니다. 비밀번호를 맞게 입력하였으면 true가 표시됩니다. 이제 계정이 unlock되었으니 다시 위의 트랜잭션을 전송하는 명령어를 입력해봅시다.

❯ eth.sendTransaction( {
from : eth.accounts[0],
to : eth.accounts[1],
value : web3.toWei(100,'ether') }
)

INFO [11-20|15:35:24.892] Setting new local account address=0x95D02eF6f14f7b8a4c162dBC0aa64043CaD86A75
INFO [11-20|15:35:24.893] Submitted transaction fullhash=0x6e8c2e8bbec8a4aa26c4d435ac8fd5b2c4bac4c09e8bbd635d5731de7efd3185 recipient=0xffd4c14bBE43Af76AB1b09Cf101f93f58192321C
"0x6e8c2e8bbec8a4aa26c4d435ac8fd5b2c4bac4c09e8bbd635d5731de7efd3185"

아까와는 달리 에러가 없이 메시지가 나오네요. eth.sendTransaction은 트랜잭션의 해시값을 반환합니다. 이 정보를 가지고 나중에 트랜잭션이 어느 블록에 포함되어 있는지, 내용은 어떤건지를 확인할 수 있습니다.

이제 첫번째 계정의 잔고를 확인해볼까요?

❯ eth.getBalance(eth.accounts[1])
0

100이더를 전송했지만 아직 0이 나옵니다. 그 이유는 트랜잭션을 발행했지만 아직 블록에 포함되지 않았기 때문인데요. 트랜잭션을 처음 생성하게되면 트랜잭션 풀에 들어가고, 마이너가 트랜잭션 풀에서 트랜잭션을 가져와서 블록에 넣고 블록체인에 연결합니다. 이 과정이 채굴이고 채굴이 완료되어야 트랜잭션이 실행된다고 할 수 있습니다. 따라서 다시 마이닝을 시작합니다.

❯ miner.start(1)

INFO [11-20|15:40:58.105] Commit new mining work number=44 sealhash=b78d35…d4368a uncles=0 txs=0 gas=0 fees=0 elapsed=99.828µs

INFO [11-20|15:40:58.105] Commit new mining work number=44 sealhash=82d63b…893ac0 uncles=0 txs=1 gas=21000 fees=2.1e-05 elapsed=330.75µs

INFO [11-20|15:41:02.238] Successfully sealed new block number=44 sealhash=82d63b…893ac0 hash=91f114…8ef3b2 elapsed=4.132s

INFO [11-20|15:41:02.238] 🔗 block reached canonical chain number=37 hash=ecd49d…d088fe

INFO [11-20|15:41:02.238] 🔨 mined potential block number=44 hash=91f114…8ef3b2

마이닝의 로그를 보면 txs=0에서 txs=1이 되는 것을 확인할 수 있습니다. number는 블록의 number를 가리키는 것이구요. 해석을 해보자면 44번 블록에 트랜잭션이 1개 포함되었다 라는것을 알 수 있습니다. 이제 마이닝을 멈추고 다시 두번째 계정의 잔고를 확인해봅시다.

❯ miner.stop()

❯ eth.getBalance(eth.accounts[1])
100000000000000000000

이제 0이 아닌 다른 값이 있네요. 단위가 사용하는 단위와 달라서 보기 불편한 점이 있습니다. wei를 ether로 표시하기 위해 다음의 명령어를 입력합니다.

❯ web3.fromWei(eth.getBalance(eth.accounts[1]), 'ether')
100

toWei는 함수의 첫번째 인자의 값을 뒤의 단위로 바꾸는 것입니다. fromWei는 wei단위의 어떤 값을 원하는 단위로 바꾸어주는 함수 입니다. 결과를 확인해보면 100 ether가 들어와 있는것을 알 수 있습니다.

아까 로그를 통해 44번 블록에 트랜잭션이 포함되었다는것을 확인했습니다. 실제로 블록에 포함된 트랜잭션의 내용을 확인해보겠습니다.

❯ eth.getTransactionFromBlock(44)

{
blockHash: "0x91f11405ab34ec317bbcdc011534750567e4dbeda6d7eab9757500593b8ef3b2",
blockNumber: 44,
from: "0x95d02ef6f14f7b8a4c162dbc0aa64043cad86a75",
gas: 90000,
gasPrice: 1000000000,
hash: "0x6e8c2e8bbec8a4aa26c4d435ac8fd5b2c4bac4c09e8bbd635d5731de7efd3185",
input: "0x",
nonce: 0,
r: "0x415898a4eadd373f9d4bce80e443ce6b3b5134b4a2dabaec97b9d4ea22d81958",
s: "0x693b097738fcf1ff1d9b5d694fea8bfb9e0a7a4e874cd3b6746906b0017821fd",
to: "0xffd4c14bbe43af76ab1b09cf101f93f58192321c",
transactionIndex: 0,
v: "0x24cd",
value: 100000000000000000000
}

44를 인자로 준 결과 위와 같은 결과를 얻었습니다. from, to, value값이 모두 트랜잭션을 전송할때 주었던 값과 동일하고 트랜잭션의 해시값이 hash에 있는것을 알 수 있습니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!