Geth - 계정 생성 및 채굴

이민정·2022년 2월 25일
1

blockChain

목록 보기
8/10
post-thumbnail

벨로그에서 코인베이스라는 말이 들어가면 무조건 비공개로 돌리는 이슈가 있어
해당 철자를 사용할 때는 coinxbase와 같이
coinbase 사이에x를 삽입했으므로 참고 바람

로컬 테스트넷에서 Geth를 실행하기 위해서는 데이터 디렉토리genesis.json파일 필요

데이터 디렉토리: 송수신한 블록 데이터와 계정 정보 저장
gensis.json: 블록체인의 Genesis 블록 정보 저장

구조는 아래와 같다

  go-ethereum
          ᄂ test_data
          ᄂ genesis.json

Geth console

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

계정이 잘 생성되었는지 확인해 보자(아래와 같다면 성공!)


GenesisBlock 만들기

제네시스 할 때마다 메이플 헤네시스 생각

$ vi genesis.blcok 파일을 열어서 아래 내용 입력
(설마 "계정의 주소값"도 그대로 복붙하는 거 아니시죠?)

{
          "config": {
            "chainId": 8484,
            "homesteadBlock": 0,
        	  "eip150Block": 0,
            "eip155Block": 0,
            "eip158Block": 0
          },
          "difficulty": "20",
          "gasLimit": "2100000",
          "alloc": {
            "계정의 주소값": { "balance": "300000" }
          }
        }


genesis.json의 속성값

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: 해당 블록이 취득된 시점. 블록 간의 순서와 난이도 조절에 사용. 인접한 두 블록의 생성 시간이 짧다면 난이도가 쉬운 것


Genesis Block 생성 및 초기화

$ geth --datadir test_data init test_data/genesis.json

Successfully wrote genesis state가 뜬다면 성공

tree 모듈로 /test_data를 확인하면 아래와 같다


Geth 실행

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: 로그 파일을 만들 때, 에러를 해당 경로의 파일에 저장


Etherbase 설정

이더리움의 계정에는 두 가지 종류가 있다

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 명령어를 시간을 두고 입력
-> 점점 블록이 쌓이는 것을 확인

채굴 종료 후 잔액을 확인해 보면 잔액이 늘어나 있다
-> 채굴에 대한 보상

계정 생성 및 채굴은 여기까지
다음 포스팅에서는 트랜잭션을 생성하고 채굴하기!

profile
안뇽

0개의 댓글