๋ธ๋ก์ฒด์ธ ์ค์ต์ ๋ค์ด๊ฐ๊ธฐ ์ , geth ์ค์น
geth = go-Ethereum์ ์ฝ์
Ethereum์ด ์ ๊ณตํ๋ ๊ณต์ ํด๋ผ์ด์ธํธ ์ํํธ์จ์ด
Ethereum ๊ฐ๋ฐํ๊ฒฝ์ ๊ตฌ์ถํ๊ธฐ ์ํด ํ์
go์ธ์ด๋ก ๊ฐ๋ฐ๋จ
๊ฐ์ธ ๊ณ์ ๋ง๋ค๊ธฐ
# geth --datadir . account new
์ค์ต์ ์ํ ์ง๊ฐ ์์ฑ
- ์ํธํํ ์ง๊ฐ์ ์ํธํํ ์์ฐ์ ๋ณด๊ดํ๊ธฐ ์ํ ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ
- ๊ฐ์ธ ํค์ ๊ณต๊ฐ ํค๋ฅผ ๋ณด๊ด
Genesis Block ์์ฑ
# geth --datadir . init ./genesis.json
๋ธ๋ก ํค๋ ํญ๋ชฉ | ์ค๋ช |
nonce | mixHash์ ํจ๊ป ํด๋น ๋ธ๋ก์ ์ถฉ๋ถํ ์์ ์์ ์ฆ๋ช ์ฐ์ฐ์ ์คํํ์์ ์ฆ๋ช ํ๋ ๊ฐ |
mishash | nonce์ ํจ๊ป ํด๋น ๋ธ๋ก์ ์ถฉ๋ถํ ์์ ์์ ์ฆ๋ช ์ฐ์ฐ์ ์คํํ์์ ์ฆ๋ช |
difficulty | ๋ธ๋ก ์์ฑ ๋์ด๋ |
alloc | ์ ๋ค์์ค ๋ธ๋ก์ ์์ฑํ ๋ ํน์ ๊ณ์ ์ ๋ฏธ๋ฆฌ ์ ํด์ง ์ก์์ ์ด๋๋ฅผ ์ง๊ธํด ๋ธ๋ก์ ์์ฑ |
coinbase | ๋ธ๋ก์ ์์ฑํ๋ ค๊ณ ์ฑ๊ตดํ์ ๋ ๋ณด์์ ๋ฐ๋ ๊ณ์ ์ฃผ์ |
timestamp | ๋ธ๋ก์ฒด์ธ์ ์ ์ฅํ ์๊ฐ |
parentHash | ์ด์ ๋ธ๋ก ํค๋์ ํด์ ๊ฐ |
gasaLimit | ํด๋น ๋ธ๋ก์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ค์ ์ต๋ ํฌ๊ธฐ |
config | ์ ๋ค์์ค ๋ธ๋ก์ ์ค์ ๊ฐ์ ์ ์ |
chainId |
๋ธ๋ก์ฒด์ธ์ ์๋ณํ๋ ์ ์ซ๊ฐ |
homesteadBlock |
ํ์คํ ๋๋ฅผ ์ ์ฉํ๋ ํ๋ ํฌํฌ ๋ธ๋ก ๋ฒํธ |
eip 155Block |
์ด๋๋ฆฌ์ ๊ฐ์ ์ ์์ 155๋ฒ ๋ ผ์๋ฅผ ์ ์ฉํ ํ๋ ํฌํฌ ๋ธ๋ก ๋ฒํธ |
eip 158Block |
์ด๋๋ฆฌ์ ๊ฐ์ ์ ์์ 158๋ฒ ๋ ผ์๋ฅผ ์ ์ฉํ ํ๋ ํฌํฌ ๋ธ๋ก ๋ฒํธ |
๋ธ๋ก ์ฑ๊ตดํ๊ธฐ
Geth๋ ์ด๋๋ฆฌ์ ํ๋กํ ์ฝ์ ๊ตฌํํ ํด๋ผ์ด์ธํธ๋ก, ๋ช ๋ น์ค ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ค์ํ ์ด๋๋ฆฌ์ ๋คํธ์ํฌ ์์ ์ ์ํํ ์ ์๋ค. ์ฌ๊ธฐ์๋ Geth ์ฝ์์ ์ฌ์ฉํ์ฌ ๊ณ์ ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ค.
# geth –datadir . console
> eth.accounts[0]
> eth.coinbase
โ geth --datadir . console : geth ์ฝ์ ์์
๋จผ์ Geth ์ฝ์์ ์์ํด์ผ ํ๋ค. --datadir ์ต์ ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํ ์ ์๋ค. ์ด ๋ช ๋ น์ด๋ ํ์ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ ๋๋ ํ ๋ฆฌ๋ก ์ฌ์ฉํ์ฌ Geth ์ฝ์์ ์คํํ๋ค.
โ eth.accounts[0] : Geth ์ฝ์์์ ๊ณ์ ํ์ธ
์ด ๋ช ๋ น์ด๋ Geth์ ์ฐ๊ฒฐ๋ ์ฒซ ๋ฒ์งธ ๊ณ์ ์ ์ฃผ์๋ฅผ ๋ฐํํ๋ค. eth.accounts ๋ฐฐ์ด์ Geth ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ณ์ ์ ํฌํจํ๋ค.
โ eth.coinbase : ์ฝ์ธ๋ฒ ์ด์ค ๊ณ์ ํ์ธ
์ด ๋ช ๋ น์ด๋ ์ฝ์ธ๋ฒ ์ด์ค ๊ณ์ ์ ์ฃผ์๋ฅผ ๋ฐํํ๋ค. ์ฝ์ธ๋ฒ ์ด์ค ๊ณ์ ์ ๋ง์ด๋ ๋ณด์์ ๋ฐ๋ ๊ธฐ๋ณธ ๊ณ์ ์ด๋ค.
์ฑ๊ตด ์์
# miner.start()
์ฑ๊ตด ์ค์ง
# miner.stop()
์ํ ํ์ธ
์ด๋๋ฆฌ์ ๋ง์ด๋์ ์ด๋๋ฆฌ์ ๋ธ๋ก์ฒด์ธ์์ ์๋ก์ด ๋ธ๋ก์ ์์ฑํ๊ณ ๋ธ๋ก์ฒด์ธ์ ์ถ๊ฐํ๊ธฐ ์ํ ๊ณผ์ ์ด๋ค. ๋ง์ด๋์ ๋ธ๋ก์ ํฌํจ๋ ๊ฑฐ๋๋ฅผ ํ์ธํ๊ณ ์ํธํ ํผ์ฆ์ ํด๊ฒฐํ๋ ์์ ์ ํฌํจํ๋ค. ์ด๋๋ฆฌ์ ๋ง์ด๋์ ์ฃผ์ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ๋ค:
- ํธ๋์ญ์ ๊ฒ์ฆ: ๋คํธ์ํฌ ์์ ๋ชจ๋ ํธ๋์ญ์ ์ ํ์ธํ๊ณ ๊ฒ์ฆํ๋ค.
- ๋ธ๋ก ์์ฑ: ๊ฒ์ฆ๋ ํธ๋์ญ์ ์ ๋ชจ์ ์๋ก์ด ๋ธ๋ก์ ์์ฑํ๋ค.
- ๋ธ๋ก์ฒด์ธ์ ์ถ๊ฐ: ์์ฑ๋ ๋ธ๋ก์ ๋ธ๋ก์ฒด์ธ์ ์ถ๊ฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ์ ์ผ๋ก ๊ธฐ๋กํ๋ค.
- ๋ณด์: ๋ง์ด๋๋ ์๋ก์ด ๋ธ๋ก์ ์์ฑํ ๋ ์ด๋๋ฆฌ์(ETH)์ผ๋ก ๋ณด์๋ฐ๋๋ค
> eth.mining
> eth.hashrate
> eth.blocknumber
โ ์ด๋๋ฆฌ์ ํด์๋ ์ดํธ (eth.hashrate)
ํด์๋ ์ดํธ๋ ์ด๋๋ฆฌ์ ๋คํธ์ํฌ์์ ๋ง์ด๋๋ค์ด ์ํธํ ํผ์ฆ์ ํด๊ฒฐํ๋ ์๋๋ฅผ ๋ํ๋ธ๋ค. ํด์๋ ์ดํธ๋ ๋ณดํต ์ด๋น ๊ณ์ฐ๋ ํด์์ ์๋ก ์ธก์ ๋๋ฉฐ, ๋จ์๋ H/s (ํด์/์ด) ๋๋ ๊ทธ ๋ฐฐ์(GH/s, TH/s ๋ฑ)๋ก ํํ๋๋ค. ํด์๋ ์ดํธ๋ ๋คํธ์ํฌ์ ๋ณด์์ฑ๊ณผ ๊ด๋ จ์ด ๊น๋ค:
- ๋์ ํด์๋ ์ดํธ: ๋ง์ ๋ง์ด๋๋ค์ด ๋คํธ์ํฌ์ ์ฐธ์ฌํ๊ณ ์์์ ๋ํ๋ด๋ฉฐ, ์ด๋ ๋คํธ์ํฌ์ ๋ณด์์ฑ์ ๋์ธ๋ค.
- ๋ฎ์ ํด์๋ ์ดํธ: ๋ง์ด๋๊ฐ ์ ๊ฑฐ๋ ๋ง์ด๋ ๋์ด๋๊ฐ ๋ฎ์์ ์๋ฏธํ๋ค. ์ด๋ ๋คํธ์ํฌ๊ฐ ์๋์ ์ผ๋ก ๋ ์์ ํ ์ ์์์ ๋ํ๋ธ๋ค.
โ ์ด๋๋ฆฌ์ ๋ธ๋ก ๋ฒํธ (eth.blocknumber)
์ด๋๋ฆฌ์ ๋ธ๋ก ๋ฒํธ๋ ๋ธ๋ก์ฒด์ธ ๋ด์์ ๊ฐ ๋ธ๋ก์ ์์๋ฅผ ๋ํ๋ด๋ ๊ณ ์ ํ ์ซ์์ด๋ค. ๋ธ๋ก ๋ฒํธ๋ ์ ๋ค์์ค ๋ธ๋ก(์ฒซ ๋ฒ์งธ ๋ธ๋ก)๋ถํฐ ์์ํ์ฌ ๊ฐ ์๋ก์ด ๋ธ๋ก์ด ์์ฑ๋ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐํ๋ค. ๋ธ๋ก ๋ฒํธ๋ ์ฌ๋ฌ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค:
- ๋ธ๋ก ํ์: ํน์ ๋ธ๋ก์ ์ฐพ๊ธฐ ์ํด ๋ธ๋ก ๋ฒํธ๋ฅผ ์ฌ์ฉํ๋ค.
- ํธ๋์ญ์ ์ถ์ : ํน์ ํธ๋์ญ์ ์ด ํฌํจ๋ ๋ธ๋ก์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ๋คํธ์ํฌ ์ํ ํ์ : ํ์ฌ ๋ธ๋ก ๋ฒํธ๋ฅผ ํตํด ๋คํธ์ํฌ๊ฐ ์ผ๋ง๋ ๋ฐ์ ํ๋์ง, ์ผ๋ง๋ ๋ง์ ๋ธ๋ก์ด ์์ฑ๋์๋์ง ํ์ธํ ์ ์๋ค.
> eth.getBalance(eth.coinbase)
> eth.getBalance(eth.accounts[0]
> eth.getBalance(eth.accounts[1]
> eth.getBalance(eth.accounts[2]
โ ์ด๋๋ฆฌ์ ์ฝ์ธ๋ฒ ์ด์ค ์์ก ํ์ธ
์ฝ์ธ๋ฒ ์ด์ค ๊ณ์ ์ ์ด๋๋ฆฌ์ ๋ ธ๋๋ฅผ ์คํํ๋ ์ปดํจํฐ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋ ๊ณ์ ์ ์๋ฏธํ๋ค. ์ด ๊ณ์ ์ ๋ณดํต ๋ง์ด๋ ๋ณด์์ ๋ฐ๋ ๊ณ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
โ ํน์ ๊ณ์ ์ ์์ก ํ์ธ
์ด๋๋ฆฌ์ ๊ณ์ ์ ์์ก์ ํ์ธํ๊ธฐ ์ํด eth.accounts ๋ฐฐ์ด์ ์ ์ฅ๋ ๊ณ์ ๋ค์ ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ฐฐ์ด์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๊ณ์ ์ ํฌํจํ๋ค. ์๋ฅผ ๋ค์ด, eth.accounts[0], eth.accounts[1], eth.accounts[2]๋ ์ฒซ ๋ฒ์งธ, ๋ ๋ฒ์งธ, ์ธ ๋ฒ์งธ ๊ณ์ ์ ๋ํ๋ธ๋ค.
ํธ๋์ญ์ ์ฒ๋ฆฌ
ํธ๋์ญ์ ์ด๋
๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๋ ๊ฐ์น(์ด๋, ํ ํฐ ๋ฑ)์ ํ ์ฃผ์์์ ๋ค๋ฅธ ์ฃผ์๋ก ์ด๋์ํค๋ ๋์งํธ ํ๋์ด๋ค. ํธ๋์ญ์ ์ ๋ธ๋ก์ฒด์ธ ๋คํธ์ํฌ์ ํต์ฌ ์์ ์ค ํ๋๋ก, ๋ชจ๋ ํธ๋์ญ์ ์ ๊ฒ์ฆ๋๊ณ ๋ธ๋ก์ฒด์ธ์ ๊ธฐ๋ก๋๋ค.
ํธ๋์ญ์ ์ '์ฒ๋ฆฌ ์์ฒญ'๊ณผ '์ฒ๋ฆฌ' 2๋จ๊ณ์ ๊ฑธ์ณ ์ฒ๋ฆฌ๋๋ค.
์์๋ฃ ํ์ธ
> eth.estimateGas({
from:eth.accounts[0],
to:eth.accounts[1],
value:web3.toWei(1, "ether")
})
์ด ๋ช ๋ น์ด๋ Geth ์ฝ์์์ ํน์ ํธ๋์ญ์ ์ด ์ผ๋ง๋ ๋ง์ ๊ฐ์ค๋ฅผ ์๋นํ ๊ฒ์ธ์ง ์์ธกํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
๊ฐ ํ๋ ์ค๋ช
- from: ํธ๋์ญ์ ์ ๋ณด๋ด๋ ๊ณ์ ์ ์ฃผ์์ด๋ค. ์ฌ๊ธฐ์๋ eth.accounts[0]์ผ๋ก ์ค์ ๋์ด ์๋ค.
- to: ํธ๋์ญ์ ์ ๋ฐ๋ ๊ณ์ ์ ์ฃผ์์ด๋ค. ์ฌ๊ธฐ์๋ eth.accounts[1]์ผ๋ก ์ค์ ๋์ด ์๋ค.
- value: ์ ์กํ ์ด๋์ ์์ด๋ค. ์ฌ๊ธฐ์๋ web3.toWei(1, "ether")์ ์ฌ์ฉํ์ฌ 1 ์ด๋๋ฅผ Wei ๋จ์๋ก ๋ณํํ ๊ฐ์ ์ค์ ํ๋ค.
์ eth.estimateGas๋ฅผ ์ฌ์ฉํ๋๊ฐ?
eth.estimateGas๋ ํธ๋์ญ์ ์ด ์คํ๋๊ธฐ ์ ์ ํ์ํ ๊ฐ์ค ์์ ์์ธกํ์ฌ, ์ฌ์ฉ์๊ฐ ์ถฉ๋ถํ ๊ฐ์ค๋ฅผ ์ ๊ณตํ ์ ์๋๋ก ๋์์ค๋ค. ์ด๋ ํธ๋์ญ์ ์ด ๊ฐ์ค ๋ถ์กฑ์ผ๋ก ์คํจํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ์ ์ฉํ๋ค.
์ก๊ธ ์์ฒญ
Geth ์ฝ์์์ eth.sendTransaction ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋๋ฆฌ์ ํธ๋์ญ์ ์ ๋ณด๋ผ ์ ์๋ค. ์๋์ ๋ช ๋ น์ด๋ ๊ณ์ eth.accounts[0]์์ eth.accounts[1]๋ก 1 ์ด๋๋ฅผ ๋ณด๋ด๋ ํธ๋์ญ์ ์ ์์ฑํ๋ ์์ ๋ค.
> eth.sendTransaction({
from:eth.accounts[0],
to:eth.accounts[1],
value:web3.toWei(1, "ether"),
gas:30000,
gasPrice:4
})
๊ฐ ํ๋ ์ค๋ช
- from: ํธ๋์ญ์ ์ ๋ณด๋ด๋ ๊ณ์ ์ ์ฃผ์ (eth.accounts[0]).
- to: ํธ๋์ญ์ ์ ๋ฐ๋ ๊ณ์ ์ ์ฃผ์ (eth.accounts[1]).
- value: ์ ์กํ ์ด๋์ ์ (1 ์ด๋๋ฅผ Wei ๋จ์๋ก ๋ณํํ ๊ฐ web3.toWei(1, "ether")).
- gas: ํธ๋์ญ์ ์ ์ฌ์ฉํ ์ต๋ ๊ฐ์ค ์ (30000).
- gasPrice: ๊ฐ์ค ๊ฐ๊ฒฉ (4 Wei).
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด, ์ด๋๋ฆฌ์ ๋คํธ์ํฌ์ ํธ๋์ญ์ ์ด ์ ์ก๋๊ณ , ํธ๋์ญ์ ํด์๊ฐ ๋ฐํ๋๋ค. ํธ๋์ญ์ ํด์๋ ํธ๋์ญ์ ์ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ ๊ฐ์ด๋ค.
ํธ๋์ญ์ ์ ๋ณด ํ์ธ
Geth ์ฝ์์์ eth.pendingTransactions ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ๋ ธ๋์ ๋๊ธฐ ์ค์ธ ํธ๋์ญ์ ์ ํ์ธํ ์ ์๋ค. ์ด ๋ช ๋ น์ด๋ ์์ง ๋ธ๋ก์ ํฌํจ๋์ง ์์ ํธ๋์ญ์ ๋ชฉ๋ก์ ๋ฐํํ๋ค.
> eth.pendingTransactions
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ํ์ฌ ๋๊ธฐ ์ค์ธ ํธ๋์ญ์ ์ ๋ฐฐ์ด์ด ๋ฐํ๋ฉ๋๋ค. ๊ฐ ํธ๋์ญ์ ๊ฐ์ฒด๋ ๋ค์ํ ํ๋๋ฅผ ํฌํจํ๋ค.
๊ฐ ํ๋ ์ค๋ช
- hash: ํธ๋์ญ์ ์ ํด์ ๊ฐ.
- from: ํธ๋์ญ์ ์ ๋ณด๋ธ ๊ณ์ ์ฃผ์.
- to: ํธ๋์ญ์ ์ ๋ฐ๋ ๊ณ์ ์ฃผ์.
- value: ์ ์ก๋ ์ด๋์ ์ (Wei ๋จ์).
- gas: ํธ๋์ญ์ ์ ํ ๋น๋ ๊ฐ์ค ์.
- gasPrice: ํธ๋์ญ์ ์ ์ค์ ๋ ๊ฐ์ค ๊ฐ๊ฒฉ.
- nonce: ๊ณ์ ์์ ๋ณด๋ธ ํธ๋์ญ์ ์ ์์ ๋ฒํธ.
eth.pendingTransactions ๋ช ๋ น์ด๋ ํ์ฌ ๋ธ๋ก์ ํฌํจ๋์ง ์์ ๋ชจ๋ ๋๊ธฐ ์ค์ธ ํธ๋์ญ์ ์ ํ์ธํ๋ ๋ฐ ์ ์ฉํ๋ค. ์ด๋ฅผ ํตํด ๋คํธ์ํฌ์ ํธ๋์ญ์ ๋๊ธฐ์ด์ ๋ชจ๋ํฐ๋งํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ๋๊ธฐ ์ค์ธ ํธ๋์ญ์ ์ ๋ถ์ํ ์ ์๋ค.
ํธ๋์ญ์ ์ฒ๋ฆฌ
Geth ์ฝ์์์ web3.fromWei์ eth.getBalance ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๊ณ์ ์ ์ด๋๋ฆฌ์ ์์ก์ ์ด๋ ๋จ์๋ก ํ์ธํ ์ ์๋ค. ์๋ ๋ช ๋ น์ด๋ ๊ฐ ๊ณ์ ์ ์์ก์ ๊ฐ์ ธ์์ Wei ๋จ์์์ ์ด๋ ๋จ์๋ก ๋ณํํ๋ ์์ ๋ค.
> web3.fromWei(eth.getBalance(eth.accounts[0], "ether")
> web3.fromWei(eth.getBalance(eth.accounts[1], "ether")
account[0]์์ account[1]๋ก 1 ์ด๋ ์ก๊ธ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.