Blockchain - 이더리움 geth 실습

김도영·2022년 7월 5일

이번 실습에서는 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개의 댓글