벨로그에서
코인베이스
라는 말이 들어가면 무조건비공개
로 돌리는 이슈가 있어
해당 철자를 사용할 때는coinxbase
와 같이
coin
과base
사이에x
를 삽입했으므로 참고 바람
로컬 테스트넷에서 Geth를 실행하기 위해서는 데이터 디렉토리
와 genesis.json
파일 필요
데이터 디렉토리: 송수신한 블록 데이터와 계정 정보 저장
gensis.json: 블록체인의 Genesis 블록 정보 저장
구조는 아래와 같다
go-ethereum
ᄂ test_data
ᄂ genesis.json
geth Command-line Opitions docs
https://geth.ethereum.org/docs/interface/command-line-options
USAGE:
geth [options][command] [command options][arguments...]
$ geth --datadir test_data account new
[options] datadir: Data directory for the databases and keystore (default: "~/.ethereum")
데이터 디렉토리 지정
명령어 입력하고 비밀번호 설정하면 public address(계정 주소)
를 확인할 수 있다
$ geth --datadir test_data account list
계정이 잘 생성되었는지 확인해 보자(아래와 같다면 성공!)
제네시스 할 때마다 메이플 헤네시스 생각
$ vi genesis.blcok
파일을 열어서 아래 내용 입력
(설마 "계정의 주소값"
도 그대로 복붙하는 거 아니시죠?)
{
"config": {
"chainId": 8484,
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "20",
"gasLimit": "2100000",
"alloc": {
"계정의 주소값": { "balance": "300000" }
}
}
config
: 이더리움 관련 설정
config.chainId
: 현재 chain을 구별하는 값. replay attak
으로부터 보호해주는 역할
replay attack
: repeat attack 또는 playback attack이라고도 함
: 유효한 데이터 전송이 악의적으로 또는 부정하게 반복되거나 지연되는 네트워크 공격(spoofing attack의 일부)
congfig.homesteadBlock
config.eip155Blcok
config.eip150Block
config.eip158Block
이 4가지는 사설 블록체인을 만들 때 기본적으로 동일한 설정
EIP: Ethereum Improvement Proposal
개발자들이 이더리움을 업그레이드 하기 위해 제안된 아이디어
config.homesteadBlock
: 이더리움의 4단계 로드맵 중 2번 째 메이저 단계. true일 경우 0
config.eip150Blcok
: EIP155는 chainId와 마찬가지로 replay attack을 막기 위한 설정
config.eip150Block
: IO가 많은 작업에 대한 가스 변경 비용 설정
config.eip158Block
: EIP158은 계정의 상태가 변경되고, 변경된 경과값으로 인해 계정의 nonce와 balance 값이 0이 되고 code와 storage가 빈 값이 된 경우 해당 계정 삭제
difficulty
: 채굴 난이도. 값이 클 수록 채굴 난이도 상승
gasLimit
: 블록 당 담을 수 있는 가스의 한도 설정. 하나의 블록 안에 담을 트랜잭션 개수를 결정하는 데 사용. 값이 클 수록 트랜잭션을 많이 보냄
alloc
: 제네시스 블록이 생성됨과 동시에 alloc
에 등록된 주소로 이더 전송
alloc 금액의 단위는 wei
1 wei * 10^18 = 1 ether
[그 외 속성값]
parentHash
: 부모 블록의 해시값
(제네시스는 부모 블록이 없으므로 pass)
coinxbase
: 블록 채굴시 주어지는 보상
nonce, mixhash
: 블록이 올바르게 채굴되었는지 증명
블록에인 작업증명을 위해서는 가장 최근에 추가된 블록의
해시값
과블록 헤더의 값
,임의의값 nonce
의 조합으로 특정 범위에 있는 수를 찾는다.
mixhash
: nonce를 찾기 위한 중간 계산 값
mixhash
로 공격자가 잘못된 nonce로 블록을 만들면, 위조 여부를 빠르게 파악 가능
제네시스 블록은 채굴이 아닌 json파일로 직접 만들기 때문에 채굴에 사용되는
mixhash, nonce
값이 필요하지 않음
timestamp
: 해당 블록이 취득된 시점. 블록 간의 순서와 난이도 조절에 사용. 인접한 두 블록의 생성 시간이 짧다면 난이도가 쉬운 것
$ geth --datadir test_data init test_data/genesis.json
Successfully wrote genesis state가 뜬다면 성공
tree 모듈로 /test_data
를 확인하면 아래와 같다
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,web3,miner,admin" --miner.threads 1 console 2>> test_data/geth.log
길다 길어
datadir test_data
: 데이터 디렉토리 지정
networkid 8484
: 네트워크 식별자
http.addr "ip"
: 현재 사용 중인 ip 입력
http
: 이전에는 rpc, 현재는 http로 변경됨
http.port "port
: 포트 설정
http.corsdomain "*"
: 접속 가능한 RPC 클라이언트 URL 지정. *
은 전체 허용
nodiscover
: 생성자의 노드를 다른 노드에서 검색할 수 없게 하는 옵션. 같은 제네시스 블록과 네트워크 ID에 있는 블록들이 연결되는 것을 방지
http.api "db,eth,net,web3,personal"
: rpc에 의해 접근 가능한 api(geth 내에서 사용 가능한 명령어)
maxpeers 0
: 생성자의 노드에 연결할 수 있는 노드의 수
console
: 대화형 자바스크립트 콘솔 기동
2>> /home/ngle/data_testnet/geth.log
: 로그 파일을 만들 때, 에러를 해당 경로의 파일에 저장
이더리움의 계정에는 두 가지 종류가 있다
EOA: Externally Owned Account
CA: Contract Account
EOA
는 일반 사용자가 사용하는 계정으로 비밀키 관리하며 Ether를 송금하거나 계약 실행
CA
는 컨트랙트를 블록체인에 배포할 때 만들어지는 계정으로 블록체인에 존재
personal.newAccount
명령어로 EOA
를 만들 수 있음
아까 만든 계정 확인 (난 중간에 다시 해서 계정이 다름)
personal.newAccount('패스워드')
: 새로운 계정 추가
eth.accounts
를 다시 하면 계정이 늘어난 것을 확인할 수 있다
Etherbase
: 이더리움 채굴하고 보상 받는 계정을 말한다
eth.coinxbase
변수에 저장되며 디폴드로 eth.accounts[0]
이 etherbase
가 된다
miner.setEtherbase()
: Etherbase 설정
설정 후, eth.coinxbase
를 확인하면 Etherbase
가 바뀌는 것을 확인할 수 있다
eth.accounts[0]
은 제네시스 블록 생성 시, 30,000wei가 할당되었으므로 잔액 존재
ether
단위로 변환하고 싶다면
> web3.fromWei(eth.getBalance(eth.coinxbase), 'ether')
eth.blockNumber
eth.getBlock(n)
: n번째 블록 정보 출력
personal.listWallets[0].status
방탈출게임마냥 꽉 잠겨 있음
personal.unlockAccount(eth.coinxbase)
: lock 해제
personal.unlockAccount("주소", "비밀번호", "유효기간")
유효기간을0
으로 입력하면 geth 프로세스가 종료될 때까지 unlock 유지
miner.start(n)
: 채굴 시작 (n은 스레드 개수)
eth.mining
: 채굴 진행 상황 확인
eth.blockNumber
: 가장 최근에 추가된 블록의 숫자 확인
miner.stop()
: 채굴 종료
채굴 중에
eth.blockNumber
명령어를 시간을 두고 입력
-> 점점 블록이 쌓이는 것을 확인
채굴 종료 후 잔액을 확인해 보면 잔액이 늘어나 있다
-> 채굴에 대한 보상
계정 생성 및 채굴은 여기까지
다음 포스팅에서는 트랜잭션을 생성하고 채굴하기!