geth 계정생성, 트랜잭션 및 채굴

Hong·2022년 12월 4일
0
post-thumbnail








🤨 What is Geth?

From. 이더리움 공식 홈페이지
Ethereuim is a decentralized platform that runs smart contracts: applications that run exactly as programmed without any possibility of downtime, censorship, fraud or third party interference.

이더리움이란 스마트 계약을 실행할 수 있는 플랫폼입니다. go, c++, python 등 다양한 언어로 이더리움을 구동할 수 있는 클라이언트가 개발되고 있으며 현재 가장 많이 사용되는 클라이언트가 go 언어로 개발된 go-ethereum (geth)입니다.

쉽게 생각하면 내 컴퓨터에서 이더리움 네트워크와 소통하기 위한 도구라고 생각하면 되겠다.
(소통 언어는 go언어다)



geth를 통해 로컬서버에서 테스트넷 위에서 node를 만들고 블록을 채굴하여 ethereum을 송수신 하는 작업을 해보겠다

먼저 로컬 테스트넷에서 Geth를 실행하기 위해
아래의 두 파일을 생성해야 한다.

데이터 디렉터리 생성 : 송수신한 블록 데이터와 계정 정보 저장
genesis.json : 제네시스 블록 정보가 저장된 json 형태의 텍스트 파일
을 생성한다.

$ cd ~/go-ethereum
$ mkdir test_data # 데이터 디렉터리 생성
$ vim genesis.json # genesis.json 생성




1. Geth Console을 사용하여 계정 생성

$ geth --datadir test_data account new

  • 이때 생성된 Public address of the key는 위에서 만들었던 genesis.json에 사용됨으로 기억해둔다.

계정이 잘 생성되었는지 확인한다

$ geth --datadir test_data account list

위와 같이 Account가 확인 가능하면 잘 생성 된 것이다





2. Genesis Block생성

vim으로 genesis.json을 열어서 파일을 편집한다

  • config : 이더리움 관련 설정이 들어간다
  • config.chainId : 현재 chain을 구별하는 값이며, Chainlist.org에 들어가면 확인 가능하다. 또한, 유효한 데이터 전송을 악의적으로 반복시키거나 지연시키는 replay attack으로부터 보호해주는 역할을 한다.
  • config.homesteadBlock : homestead는 이더리움의 프론티어, 홈스테드, 메트로폴리스, 세레니티 중 두 번째 단계로, 0일 경우 true를 뜻한다.
  • config.eip155Block : EIP155는 chainId와 마찬가지로 replay attack을 막기 위한 설정이다.
    EIP155
  • config.eip150Block: IO가 많은 작업에 대한 가스 변경 비용을 위한 설정이다.
    EIP150
  • config.eip158Block : EIP158은 계정의 상태가 변경되고, 변경된 결과값으로 인해 계정의 nonce와 balance 값이 0이 되고 code와 storage가 빈 값이 되는 경우 해당 계정을 삭제한다.
    EIP158
  • difficulty : 채굴 난이도로, 값이 클수록 난이도가 상승하며, 낮을수록 난이도가 낮아진다.
  • gasLimit : 블록당 담을 수 있는 가스의 한도를 설정한다. 하나의 블록 안에 담을 트랜잭션 개수를 결정하는데 사용하는 옵션이다. 따라서 값이 클수록 트랜잭션을 많이 보낼 수 있다.
  • alloc : 제네시스 블록이 생성됨과 동시에, alloc에 등록된 주소로 이더를 할당한다.


그 외 속성값

  • parentHash : 부모 블록의 해시값을 넣는다. 제네시스 블록은 부모 블록이 없기 때문에 사용하지 않는다.
  • coinbase : 제네시스 블록 채굴 시 주어지는 보상과 보상을 받을 어카운트 주소이다. 마이너가 coinbase값을 설정하기 때문에 제네시스 블록에서는 상관없다.
  • nonce, mixhash : 블록체인 작업 증명을 위한 값이다.
    이더리움 작업증명
  • timestamp : 해당 블록이 취득된 시점을 의미하는 값으로, 제네시스 블록은 0으로 설정해도 된다. - timestamp 값은 블록 간의 순서와 난이도를 조절하는 데 사용된다. 예를 들어 두 블록의 생성 시간이 짧다면 난이도가 쉬운 것이고,간격이 길다면 어려운 것이다.
  • extraData : 옵션 항목으로 최대 32바이트 공간이다.




3. Genesis Block을 생성 및 초기화

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

위의 빨간색 박스 문구가 뜨면 성공적으로 초기화 된 것이다.



tree를 설치해서 트리형태로 test_data 디렉터리 구조를 확인해보자

$ apt-get install tree -y
$ tree test_data


이더리움에서는 chaindata, lightchaindata, keystore등을 공통적으로 확인 할 수 있는데 각 폴더의 역할은 아래와 같다.

  • chaindata : 블록체인 데이터가 저장된다. 별도의 옵션 없이 콘솔 모드 작동 시 이더리움 메인 네트워크에 풀노드 동기화 모드로 연결하기 때문에 저장된다.
  • lightchaindata : 블록체인 데이터가 저장된다. geth syncmode를 light로 지정하면 라이트 노드로 블록 헤더에서 중요한 데이터만 저장한다.
  • keystore : 어카운트의 개인 키를 저장한다.
  • build/bin : Geth 실행 파일이 저장된다.
  • ethash : DAG 파일이 저장된다. 마이너를 구동시키면 작업 증명을 위한 해시 문제를 해결하기 위해 최대 2GB 사이즈의 DAG 파일을 만들어 메모리를 할당한다.
  • nodes : 노드에 관한 정보가 저장된다.
  • triecache : 트리의 캐시를 저장한다.




4. 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

정상적으로 실행되면 위와 같이 console이 실행되며 프롬트 표시 '>'가 나타난다





5. Etherbase 설정하기

이더리움에는 두가지 종류의 계정이 있다
1. EOA(Externally Owned Account)
2. CA(Contract Account)

EOA는 일반 지갑이라고 보면된다. CA는 스마트 컨트랙스 배포를 위해 사용된다.


새로운 계정을 생성한다.

> personal.newAccount('패스워드')

계정이 잘 등록되었는지 확인한다.

> eth.accounts

채굴 시 보상을 받을 계정을 선택한다.

이더리움을 채굴하고 보상받는 계정을 Etherbase라고 한다.
Etherbase는 eth.coinbase 변수에 저장한다. 기본적으로 eth.accounts[0]으로 설정되어 있다.

> miner.setEtherbase(personal.listAccounts[0])

채굴 계정이 잘 설정되었는지 확인한다.

> eth.coinbase

생성된 블록 수를 확인하는 명령어

> eth.blockNumber


특정 블록의 정보를 확인하는 명령어

> eth.getBlock(blockNumber)


이제 Etherbase의 계정을 가지고 채굴을 해보자
채굴을 하기 위해서는 기본적으로 계정에 걸려있는 Lock을 풀어줘야한다.

계정 Lock상태를 확인하고

> personal.listWallets[0].status

해당 계정의 잠금을 풀어준다

> personal.unlockAccount(eth.coinbase)




6. Ethereum Mining

채굴을 시작한다

> miner.start(1) # 여기서 ()안은 스레드 개수이다.

위와 같이 null이 뜨면 정상이다.


채굴여부를 체크하고 생성된 블록 숫자도 확인할 수 있다.

> eth.mining # 채굴을 진행하고 있는지 확인
> eth.blockNumber # 가장 최근에 추가된 블록의 숫자

채굴을 종료하고 채굴한 계정의 잔액을 확인할 수 있다(채굴했으니 계정에 돈이 들어와 있을 것이다).

> miner.stop() # 채굴 종료
> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')




7. Ethereum Transaction and Sending

0의 계정에서 1의 계정으로 이더를 보낸다.

> eth.sendTransaction({
    	from:eth.accounts[0],
    	to:eth.accounts[1],
    	value:web3.toWei(2,’ether’), 
    	data:web3.toHex(”send message”)
    })
  • from : 발신자의 계정주소
  • to : 수신자의 계정주소
  • value : 전송할 금액
  • data : 전송할 메세지
  • web3.toHex : 인자로 주어진 값을 16진수로 변환한다.

정상적으로 만들어지면 트랜잭션 해시가 생성됨


Transaction Pending 확인

트랜잭션은 아직 채굴되지 않았기 때문에 pending상태일 것이다.

> eth.pendingTransactions

hash부분을 보면 위에서 만들었던 트랜잭션의 해시가 들어가 있다.


Pending상태의 트랜잭션을 처리해주기 위해 채굴을 해보자

채굴 후에 Pending상태를 확인하니 아무런 트랜잭션이 발견되지 않았다(트랜잭션 처리 완료).
0에서 1의 계정으로 돈을 보냈음으로 이제 1의 계정에서 Balance확인이 가능하다.


처리된 Transaction 정보를 확인해보자

> eth.getTransaction("TxHash")









요즘 James Scholz 동영상 틀어놓고 같이 공부하는데
성장형 마인드셋
동기부여는 필요없다 그냥 습관으로 하는 것이다
기억합시다

profile
Notorious

0개의 댓글