Blockchain - 이더리움 geth 실습

김도영·2022년 7월 5일
0

이번 실습에서는 geth를 사용하여 프라이빗 블록체인을 만들고, 해당 블록체인에서 트랜잭션을 만들고 채굴을 해보려고 한다.

사전 준비

실습 환경은 도커 우분투 컨테이너 안에서 실습을 진행한다.

우분투 이미지 받아오기

$ docker search ubuntu
$ docker pull ubuntu

con_ubuntu라는 컨테이너 생성

$ docker create -it --name con_ubuntu ubuntu

con_ubuntu 컨테이너 확인 및 실행, 연결

$ docker start con_ubuntu
$ docker ps
$ docker attach con_ubuntu

컨테이너 세팅

$ apt update -y && apt install -y software-properties-common
$ add-apt-repository ppa:ethereum/ethereum
$ apt-get install vim -y
$ apt update -y && apt install geth
$ apt-get install git -y
$ cd ~
$ git clone https://github.com/ethereum/go-ethereum
$ apt-get install -y build-essentail golang

geth 설치 확인

geth을 이용한 계정 생성 및 채굴

test_data 디렉토리 생성

$ mkdir test_data

계정 생성 및 비밀번호 입력

$ geth --datadir test_data account new

genesis.json 파일 생성 및 코드 입력

$ vim genesis.json

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

genesis.json 속성값

  • config: 이더리움 관련 설정이 들어 있다.
  • config.chainId: chain id는 현재 chain을 구별하는 값이고, replay attack으로부터 보호해주는 역할을 한다. 여기서 replay attack이란, 네트워크 공격의 한 종류로, 유효한 데이터 전송을 악의적으로 반복시키거나 지연시키는 공격의 일종이다.
  • config.homesteadBlock: homestead는 이더리움의 4단계 로드맵 중 두 번째 메이저 단계이다. 속성값이 0인 경우, true를 의미한다.
  • config.eip155Block: EIP는 Ethereum Imporvement Proposal의 약자로, 개발자들이 이더리움을 업그레이드하기 위해 제안된 아이디어를 의미한다. 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

  • Genesis 블록 생성 및 초기화

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

    생성된 파일 확인

    $ 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

    새로운 계정 추가 및 확인

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

    새로운 계정에 보상 설정 명령어

    > miner.setEtherbase(personal.listAccounts[1]);

    계정의 상태 확인 및 잠금해제

    > personal.listWallets[0].status
    > personal.unlockAccount(eth.coinbase)
            
            > personal.unlockAccount(eth.coinbase, "계정명")
            
            > personal.unlockAccount("주소", "패스워드", 유효기간) 
            // 유효기간을 0을 입력하면 geth 프로세스가 종료될 때까지 unlock 상태를 유지한다.

    이더리움 채굴 시작

    miner.start(n) // 채굴 시작
    eth.mining // 채굴 진행 확인
    eth.blockNumber // 가장 최근에 추가된 블록 숫자 확인
    miner.stop() // 채굴 종료

    이더리움 송금과 트랜잭션 및 블록확인

    eth.pendingTransactions // 처리해야 할 트랜잭션 목록 확인 초기에는 빈 배열

    트랜잭션 전송

    eth.sendTransactions({
    	from:eth.accounts[0], // 트랜잭션을 보내는 계정 주소
        to:eth.accounts[1], // 수신자 계정의 주소
        value:web3.toWei(2,'ether'), // 전송할 금액
        data:web3.toHex("send message") // 전송할 메시지
    })

    진행중인 트랜잭션 확인

    트랜잭션 정보 확인

    profile
    Blockchain Developer

    0개의 댓글