Geth를 사용하여 임의의 테스트넷을 만들어 본다.
도커로 새로운 ubuntu 환경을 만들어 사용해줬다. Geth를 돌리기 위한 환경설정은 다음과 같다. 이는 우선 도커로 실행되고 있는 ubuntu 가상환경의 터미널을 이용하고 있다는 가정에서 시작된다.
[geth 설치]
// 필요한 라이브러리 설치
> app update -y && apt install -y software-properties-common
// 타임존 설정
// 6 asia, 69 seoul 을 입력할 것
> app install tzdata
// 이더리움 저장소 추가
> add-apt-repository ppa:ethereum/ethereum
// geth 설치
> apt update -y && apt install geth
// vim 과 git 설치
> apt-get install vim -y
> apt-get install git -y
// geth 프로그램 clone
> cd ~
> git clone https://github.com/ethereum/go-ethereum
// 빌드 툴과 고 언어 설치
> apt-get install -y build-essential golang
// 설치 확인
> geth version
우선 git으로 clone 해온 go-ethereum 으로 디렉터리를 옮긴다.
테스트넷을 만들 것이기 때문에 새로운 테스트넷에 필요한 제네시스 블록 정보를 저장하는 파일을 만들어준다.
[genesis.json 파일 생성하기]
> mkdir test_data
> touch test_data/genesis.json
[genesis 정보에 들어갈 계정 생성하기]
> geth -datadir test_data account new
// 이 결과로 나오는 public address 를 기억해두자!
> geth -datadir test_data account list
// 사실 다시 확인은 가능하다.
[genesis 파일 접근하기]
vim test_data/genesis.json
[genesis 정보 입력하기]
{
"config":{
"chainId" : 8484,
"homesteadBlock": 0,
"eip150Blcok": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "20",
"gasLimit": "2100000",
"alloc": {
"[위에서 만든 계정 주소값]":{"balance":"300000"}
}
}
// esc + ":wq"를 입력하면 파일을 저장하고 vim에서 빠져나온다.
- config.chainId : 현재 chain을 구별하는 값.
- config.homesteadBlock : 이더리움 로드맵 중 두 번 째 메이저 단계. 값이 0일 경우에 true를 의미.
- config.eip150Block : IO가 많은 작업에 대한 가스 변경 비용을 위한 설정.
- config.eip155Block : chainId 값과 동일하게 replay attack를 막기 위한 설정.
- config.eip158Block : 계정의 변경된 상태값 중 nonce와 balance 값이 0이 되고, code와 storage 가 빈 값일 경우 해당 계정을 삭제하는 설정.
homesteadBlock
,eip150Block
,eip155Block
,eip158Block
은 사설 블록체인을 만들 때 기본적으로 설정을 해준다.
[Genesis Block 생성 및 초기화]
> geth --datadir test_data init test_data/genesis.json
[테스트넷 실행 : 장문 주의!]
> geth --networkid 8484 --nodiscover -datadir test_data -allow-insecure-unlock -http.addr 0.0.0.0 --http -http.port 8545 --http.corsdomain "*" --http.api="db,eth,net,web3,personal,miner,admin" --miner.threads 1 console 2>> test_data/geth.log
-datadir test_data
: 데이터 디렉터리 지정--networkid 8484
: 네트워크 식별자--http
: rpc 통신에서 http 통신으로 변경--http.addr [ip 주소]
: 테스트넷에서 사용할 ip 주소 지정--http.port [port 번호]
: 테스트넷에서 사용할 포트 번호 지정--http.corsdomain "*"
: 접속가능한 클라이언트 URL을 지정한다. 와일드카드 경우 전체 허용--nodiscover
: 생성자 노드를 다른 노드에서 검색할 수 없게 하는 옵션. 제네시스 블록과 네트워크 ID에 있는 블록들이 연결되느 것을 방지--http.api="db,eth,net,web3,personal,miner,admin
: rpc 로 접근할 수 있는 api 지정- console : Javascript 기반 대화형 Geth 콘솔에 접속
// 등록된 계정 확인
> eth.accounts
// 계정 상세 정보 확인
> personal.listWallets
> personal.listWallets[[계정 번호 지정]]
// 계정 잔고 확인
> eth.getBalance([계정 주소 해시값])
//새로운 계정 생성
> eth.newAccount("[해당 계정에 접근할 비밀번호 지정]")
// 채굴 시 보상받는 계정 확인
> eth.coinbase
// 채굴 시 보상받을 계정 등록 (default는 네트워크 생성 계정)
> miner.setEtherbase("[원하는 계정 공개키]")
// 계정 잠금 해제
> personal.unlockAccount("[주소 해시값]")
> personal.unlockAccount("[주소 해시값]", "[계정명]")
> personal.unlockAccount("[주소 해시값]", "[패스워드]", [유효기간])
// 생성된 블록 수 조회
> eth.blockNumber
// 지정한 블록 데이터 조회
> eth.getBlock([생성된 블록 번호 or 해쉬값])
// 채굴
> miner.start([사용 스레드 번호])
// 채굴 진행 여부 확인
> eth.mining
// 채굴 종료
> miner.stop([사용 스레드 번호, 값 없으면 모두 종료])
// 트랜잭션 정보 확인
eth.getTransaction("[트랜잭션 해시값]")
// 트랜잭션 제출
> eth.sendTranscation({
from:"[계정주소]",
to:"[계정주소]",
value:[임의 숫자],
})
// 처리해야할 트랜잭션 목록
> eth.pendingTransactions
// 단위 변경
web3.fromWei([임의의 숫자], '[원하는 단위]')