본격적으로 이더리움 테스트넷을 구동해 작업을 시도하기 전에
저번에 간략하게 소개한 geth의 몇 가지 기능들을 사용하는 법을 알아보자.
1. 블록 동기화
테스트용 네트워크를 구동하는 기능과 더불어 실제 이더리움의 메인 네트워크와 동기화하는 기능도
geth는 가지고 있다.
동기화에는 3가지 유형이 있는데
i) full sync : 모든 블록과 tx 데이터를 가져온다.
ii) fast sync : 최근 1024개 블록의 블록 헤드만을 가져온다.
iii) light sync : 현재의 상태만을 가져온다. 검증하기 위해서는 다른 full sync 노드들의 도움이 필요하다.
(채굴 기능을 사용할 수 없다.)
light sync 기능을 사용해 이더리움 네트워크와 동기화해보자.
geth --syncmode light
이런 저런 정보가 출력이 된 후, 동기화를 시작할텐데, 이 중 IPC endpoint에 대한 값은 기억해두자.
IPC는 inter process communication ( process간 상호작용) 으로 내 컴퓨터에서 돌아가는 프로세스 간의 통신을 의미한다.
잠시 기다림녀 동기화가 다 끝나고 새로 생성되는 블록도 받아오는 것을 확인할 수 있다.
받아오는 블록헤더가 정말 이더리움 네트워크의 블록이 맞는지 확인하기 위해서는 etherscan.io 에 들어가
블록의 해시값을 비교해보면 된다.
네트워크에 새 블록이 추가된 후 웹 사이트가 업데이트 되기 까지는 약간의 딜레이가 존재하므로 그걸 감안해
etherscan의 최근 블록 해시와 내 터미널에서 최근 업데이트된 몇개의 해시를 비교해보면 된다.
이제 이 블록체인에 대해 뭔가 작업을 하고 싶다면 다른 터미널을 열어 이 geth와 상호작용을 해야한다.
아까 기억해둔 IPC endpoint url을 이때 사용한다.
geth가 잘 실행되었다면 이제 동기화된 체인에 대해 몇 가지 작업을 수행할 수 있다.
> web3.eth.syncing
false
// 현재 동기화 진행중인가?
// 동기화가 다 되었거나 하지 않았다면 false,
> web3.eth.accounts
[]
// 현재 생성한 account들 (아직 지갑을 생성하지 않았다면 빈 배열을 준다)
> personal.newAccount()
Passphrase: (비밀 번호 - 알아서 정하면 된다)
// 입력하면 새로운 지갑과 개인키를 만들어준다
2. 테스트용 네트워크 구동
우선 제네시스 블록을 만들고, 새로 구동할 네트워크가 이 제네시스 블록을 사용하도록 지정해줘야 한다.
/* genesis.json */
{
"difficulty": "200000",
"gasLimit": "3100000",
"alloc": {},
"config": {
"chainId": 7722,
"homesteadBlock": 0,
"eip150Block" : 0,
"eip155Block" : 0,
"eip158Block" : 0
}
}
이 제네시스 블록의 데이터를 기반으로 블록체인 네트워크를 만들어 준다.
geth --datadir node init genesis.json
node라는 폴더를 생성하고, 그 안에 genesis.json을 이용해 네트워크에 필요한 요소들을 만들겠다는 것을 의미한다.
geth --datadir node --ipcpath "~/.Ethereum/geth.ipc"
위와 같이 ipcpath를 지정한 후 네트워크를 구동한다.
geth attach /home/sila/.Ethereum/geth.ipc
다른 터미널에서 ipc 루트 (절대경로)와 함께 입력해 geth attach를 실행할 수 있다.
(네트워크 구동시에도 IPC endpoint URL을 주므로 이를 입력하면 된다)
> admin.nodeInfo.ports.discovery
62985
// 현재 내가 사용하는 포트를 확인한다.
// 다른 사람들이 이 포트를 이용해 나와 연결 할 수 있다.
혹시 체인 id, 제네시스 블록이 모두 동일할 경우에도 enode가 이 port를 통해 식별을 할 수 있다.
다른 사람과 연결을 막고 싶다면 네트워크를 껏다가 다시 실행을 할 때 --nodiscover 플래그를 붙어주면 된다.
geth --datadir node --nodiscover --ipcpath "~/.Ethereum/geth.ipc"
> web3.eth.chainId()
"0x1e2a"
// 현재 네트워크의 chainId를 16진수로 알려준다
3. 계정 생성, 채굴
> personal.newAccount()
// 아까 정한 비밀번호를 입력하면 지갑을 하나 생성해준다. 이를 두 번 반복한다.
// 0x91b640e72aa978a42bfd5d5070d22caad80b45eb
// 0x93c47456a73cc76172875e6327b714bc54f7d8db"
다시 한 번 전체 지갑 목록을 불러오면 두 개 원소를 가진 배열을 돌려준다.
> eth.accounts
["0x91b640e72aa978a42bfd5d5070d22caad80b45eb", "0x93c47456a73cc76172875e6327b714bc54f7d8db"]
코인 베이스 계정을 확인하고 ( 처음 생성한 계정이 코인 베이스 계정이 된다. )
이를 다른 계정으로 교체해보자.
eth.coinbase
// 0x91b640e72aa978a42bfd5d5070d22caad80b45eb
miner.setEtherbase(eth.accounts[1])
// true
eth.coinbase
// 0x93c47456a73cc76172875e6327b714bc54f7d8db
채굴을 시작하면 이 코인베이스 계정으로 보상이 들어올 것이다.
miner.start(1)
// null (채굴 시작)
그럼 geth 네트워크가 구동되는 터미널에서 곡괭이 모양이 나오는데, 채굴이 진행되고 있다는 의미이다.
시간이 좀 지난 후 채굴을 멈추고 잔액을 확인해보자.
miner.stop()
// null
eth.getBalance(eth.coinbase)
// 180000000000000000000
web3.fromWei(eth.getBalance(eth.coinbase), 'ether')
// 180 - 단위를 ether로 변경해주는 web3의 기능을 사용한다.
'Blockchain' 카테고리의 다른 글
#21 smart contract (0) | 2022.07.11 |
---|---|
#20 개인 네트워크 만들기 (geth) (0) | 2022.07.03 |
#18 metamask 활용 (0) | 2022.06.29 |
#17 ethereum (0) | 2022.06.29 |
#16 transaction ch.6 - tx pool (0) | 2022.06.27 |