Geth
는 이더리움 클라이언트 소프트웨어로, 이더리움 블록체인 네트워크의 풀노드를 구축하기 위해 사용됩니다.Go
언어를 기반으로 이더리움 풀노드를 구현하고 작동시키기 위한 명령어 라인 인터페이스를 제공한다.- 클라이언트 소프트웨어 중에서 가장 유명하고 많이 쓰이는게
Geth
입니다.
☝️ 채굴자나 어플리케이션 개발자들의 프로그램 인터페이스 역할
geth
를 통해 이더리움 블록체인의 노드로써 참여할 수 있습니다.- 채굴, 암호화폐 전송, 스마트 컨트랙트의 작성, 트랜젝션 브로드캐스팅이 가능합니다.
☝️ 풀 블록 데이터 베이스를 다운
- 블록 전체의 거래 내역 탐색이 가능합니다. (
full sync
)
☝️ 풀 노드로서 블록 검증
- 이더리움 블록체인에 기여가 가능합니다.
노드(실행중인 클라이언트)는 크게 3가지 타입으로 구분됩니다.
Full node
: 전체 블록체인 데이터를 저장하고, 블록 검증에 참여하고 모든 블록과 상태를 확인합니다.Archive node
:Full Node
가 저장 중인 것을 전부 저장하고, 과거State
의 아카이브 저장합니다.Light node
: 블록 헤더를 저장하고 다른 모든것을 요청합니다.
- 전체 동기화(Full sync) - 제네시스 블록부터 현재블록까지 모든블록을 동기화
- 빠른 동기화(Fast sync) - 최근의 1024개 블록의 상태, 트랜잭션, 리시트 등을 포함하는 블록헤더만을 동기화. 이전 히스토리를 알수없기 떄문에 트랜잭션의 유효성 검증을 할수가 없음.
- 경량 동기화(Light sync) - 현재 상태정보만 동기화
- 블록동기화를 할때는 모드를 지정하지 않으면
Fast
모드를default
로 동기화 합니다.
geth --syncmode light
geth removedb
- 블록체인 네트워크와 통신하는
RPC
와는 다른 통신으로 프로세스간에 통신을 할 때 사용하는 통신으로 컴퓨터 내부적으로 서로 다른 프로세스에게 데이터를 주고 받는것입니다.Geth
에서 실행하고 있는 노드와IPC
통신을 이용해서 통신을 할 것입니다.
vi ~/.bash_profile
export PATH=$PATH:/home/ash991213/workspace/ethereum/go-ethereum/build/bin
source ~/.bash_profile
geth --syncmode light
geth attach /home/ash991213/.ethereum/geth.ipc
admin.nodeInfo.enode
=Peer
를 연결하고 싶다면 이 노드값을 가지고 연결할 수 있습니다. 해당 노드의 고유한IP
주소라고 보면 됩니다.
admin.datadir
= 앞으로 생성할 계정이나log
가 저장될datadir
경로입니다.
personal.newAccount()
= 새로운 지갑을 생성합니다.datadir
안에ketstroe
안에 파일이 하나 생성됩니다. 지갑을 생성할 때 해당 지갑의 비밀번호도 같이 생성합니다.
json
파일로 지갑 생성해보기 -json
파일 넣고 비밀번호 입력해서 MetaMask에 신규 지갑 생성합니다.
MetaMask
-> 계정 가져오기 -> json
파일 선택지갑 주소 :
0x4a31853CDF22F7b7ec30c2e55D8CF413344FAc64
eth.accounts
= 현재 노드에 연결된 지갑들을 가져옵니다.
eth.coinbase
= 코인베이스 내용을 가져옵니다.light sync
는 coinbase 기능은 사용할 수 없습니다.
miner.start()
= 채굴을 실행하는 메서드인데 인자값으로 몇개의 쓰레드로 채굴을 할것인지 넣어줍니다.miner.stop()
= 채굴을 중지하는 메서드입니다.light sync
는miner
기능은 사용할 수 없습니다.
☝️ Genesis Block
만들기
{
"difficulty": "200000", // 난이도
"gasLimit": "3100000", // 한블록당 가스 한도
"alloc": { // 제네시스 블록을 생성할때 해당 계정에다가 balance를 넣고 시작합니다.
"0xe7Cfd36ACfB1109Ac1080c30Ee7a2FAC263cAAe2": {
"balance": "100100000000000000000"
}
},
"config": {
"chainId": 7722, // 체인 아이디
"homesteadBlock": 0, // 이더리움의 버전이 4가지가 있는데 그중 2번째 버전입니다.
"eip150Block": 0, // Ethereum improvement proposal의 약자로 개선제안으로 이 제안을 넣어서 Geth를 실행하겠다라는 뜻입니다.
"eip155Block": 0,
"eip158Block": 0
}
}
☝️ 제네시스 블록을 바탕으로 새로운 Private network
만들기.
geth --datadir node init genesis.json
Private network
가 정상적으로 만들어졌으면 위에서 설정한node
라는 이름의 디렉토리가 생성됩니다.
☝️ geth
실행 ( 새로 만들 Private network
를 실핻합니다. )
geth --datadir node
Private network
에 연결되며ChainId
는genesis.json
에서 설정한 7722로network
가 생성된것을 확인할 수 있습니다.
☝️ geth IPC
연결 ( 새로 만든 Private network
와 IPC
통신 연결합니다)
geth attach /home/ash991213/workspace/220630/node/geth.ipc
- 만들어둔
Private network
에 동기화를 할때 모드를 설정하지 않아Fast sync
가 되었고 현재module miner
기능도 포함되어 있는것을 확인할 수 있습니다.
☝️ 자동으로 다른 노드와 addPeer
가 되지 않도록 discover
속성을 끄고 테스트합니다.
geth --datadir node --nodiscover
☝️ Miner
를 하기위해서는 coinbase
가 필요합니다. 또한 coinbase
를 만들기 위해서는 계정이 필요하니 새로운 계정을 만들어주도록 하겠습니다.
personal.newAccount() // "0x3d0b85514424664dfb7c50050e2bde64e29e9d9f"
☝️ eth.accounts
로 지갑이 생성된것을 확인합니다.
eth.accounts // ["0x3d0b85514424664dfb7c50050e2bde64e29e9d9f"]
☝️ eth.coinbase
로 coinbase
를 확인합니다.
eth.coinbase // "0x3d0b85514424664dfb7c50050e2bde64e29e9d9f"
☝️ 값을 바꾸고 싶다라면 personal.newAccount()
로 다른 지갑을 하나 생성합니다.
personal.newAccount() // "0x35da8d49366f4b77bdd7d4aded70ca71fba98eee"
☝️ miner.setEtherbase(eth.accounts[1])
로 방금 생성한 지갑으로 coinbase
내용을 수정합니다.
miner.setEtherbase(eth.accounts[1]) // true
☝️ eth.coinbase
로 다시 coinbase
를 확인해보면 coinbase
가 2번째 생성한 지갑주소로 바뀐것을 확인할 수 있습니다.
eth.coinbase // "0x35da8d49366f4b77bdd7d4aded70ca71fba98eee"
☝️ miner.start(1)
로 마이닝을 시작합니다. 인자값에는 마이닝할때 사용할 쓰레드 값입니다.
miner.start(1) // null
- 중간중간 블록 채굴에 성공하는 것을 확인할 수 있습니다.
☝️ miner.stop()
으로 마이닝을 멈춥니다.
miner.stop() // null
☝️ eth.getBalance(eth.coinbase)
로 채굴한 wei를 확인합니다.
eth.getBalance(eth.coinbase) // 140000000000000000000
☝️ wei
값으로 나오니 web3.fromWei(eth.getBalance(eth.coinbase),'ether')
로 ether
단위로 확인합니다.
web3.fromWei(eth.getBalance(eth.coinbase),'ether')
☝️ admin.nodeInfo.enode
로 본인의 enode
를 확인합니다.
admin.nodeInfo.enode
☝️ 다른 노드의 enode 값을 가지고
admin.addPeer()`로 인자값에 enode를 넣어줍니다.
admin.addPeer("다른 노드의 enode값") // true
☝️ admin.peers
로 연결된 노드를 확인합니다.
admin.peers // [연결된 노드들]