Ethereum mainnet 구축 (parity-ethereum)

YU YU·2021년 11월 10일
0
post-thumbnail

1.parity-ethereum이란 무엇인가요?

마이너, 서비스 제공자, 빠른 시간내에 환전을 목표로 하는 사람들을 위해 만들어졌다. 안정적이고 빠른 스피드의 코어 기반을 제공한다.

쉽게 커스텀마이징을 할 수 있는 코드 베이스와 CLI 기반의 클라이언트 환경을 가지고 있다. 그리고 적은 메모리를 사용한다.

Rust언어를 사용하며 컴파일이 필요하다. Parity Ethereum은 JSON-RPC HTTP서버를 8545 PORT로 사용하고 Web-Socket 서버로는 8546 포트를 쓴다. 이는 몇몇개의 API를 지원하며 구현 가능하다.

Dapp을 만들어도 테스트하기가 쉽지 않다. 그래서 parity-ethereum을 사용해서 이더리움 메인넷을 구축해보기로 하였다. https://github.com/openethereum/parity-ethereum 을 실행시키기로 하였다.
우리는 테스트넷 이더를 얻기가 너무 힘들어서 메인넷을 구축하기로 하였다. 그러면 우리 마음껏 많은 이더를 가지고 테스트를 할 수 있기 때문이다.

2. docker

2-1. 도커 만들기

우선 도커 이미지를 다운받는다. 여기에 docker를 사용하는 이유는 이 parity-ethereum 자체가 리눅스 환경에서 바로 들어올려졌기 때문이다. 그리고 팀원들끼리 같은 환경에서 작업을 하기 위해 도커를 사용하였다.

$ docker pull ubuntu:20.04
우분투 이미지를 다운받는다.
$ docker run -it --name parity ubuntu /bin/bash

다운 받은 이미지를 기반으로 컨테이너를 실행시키고 -it를 씀으로써 컨테이너 안으로 들어간다.

2-2. 프로그램 깔기

리눅스에서는 apt-get을 많이 쓴다. 그렇기에 upadate를 해준다.

# apt-get update -y

그리고 필요한 프로그램들을 설치한다.
# apt-get install -y gcc g++ pkg-config file make cmake git clang libssl-dev curl

parity-ethereum을 클론한다.
# git clone https://github.com/openethereum/parity-ethereum.git

rust를 설치한다.
# curl https://sh.rustup.rs -sSf | sh

yasm 을 깐다.

# apt-get install -y yasm

rust의 버전을 버전을 확인한다.
# rustrc --version

안 나올것이다. 그러면 다음과 같이 환경변수를 세팅해준다.
# source $HOME/.cargo/env

이제 환경세팅이 다 되었다.

2-3. 빌드하기

# cd parity-ethereum

parity-ethereum 안으로 들어간다.

# rustup override set 1.51.0

버전을 낮춘다.
버전을 낮추지 않으면 다음과 같은 문제가 발생한다.

# cargo build --release --features final

2-4. 환경변수 설정

echo $PATH를 입력한다.

export PATH=/parity-ethereum/target/release:$PATH
을 입력하여 path를 환경세팅해준다.
😱반드시 parity-ethereum폴더 내에서 설정해준다.
이를 하는 이유는 parity-ethereum 사이트에 보면 다음과 같이 실행하라고 나와잇는데 형광펜으로 칠한 부분을 줄이기 위해서이다.

대문자는 오류가 나니 소문자로만 사용하자.

영구적인 방법
# apt-get install vim
위의 명령어를 통해 vim편집기를 깐다.
# vi ~/.bashrc
export PATH=/parity-ethereum/target/release:$PATH

그리고 :wq!를 통해 저장을 해준다.
하고나서 # source ~/.bashrc를 통해서 .bashrc파일의 변경사항을 적용을 해준다.

3. docker 이미지 올리기

도커 컨테이너를 이미지화해서 올리기

$ docker commit CONTAINER IMAGE_NAME

의 형식으로 올린다. 즉 이렇게 올리면 된다.

컨테이너 밖에서 쓴다.

$ docker commit parity parity

$ docker login

로그인을 한다.


username으로는 Dockerhub의 아이디를 입력해준다.
$ export DOCKER_ID_USER="nara7875"
도커에 태그를 달아준다.
$ docker tag parity $DOCKER_ID_USER/parity
도커 이미지를 올린다.

$ docker push $DOCKER_ID_USER/parity

https://gptjs409.github.io/infra/2019/11/02/docker-container-command.html

4. Docker-compose 사용하기

목적

  1. 컨테이너 생성하기
  2. volume 쉽게 생성하기 위해서

실행구문

parity --config /parity-ethereum/config.json

필요한 파일
1.docker-comopse.yaml
컨테이너 생성하고 볼륨 생성
2. config.toml
메인넷에 들어갈 환경들을 설정하는 파일
데몬의 기본 설정을 바꿀 수 있는 설정 파일
3. genesis.json
블록에 대한 내용이 담겨져 있다.
흔히들 chain.json으로 많이 씀
4. password
모름...
5. nodes
peer 관련 내용


위와 같이 디렉토리를 만들어준다.
디렉토리를 만들고 이제 파일 하나하나씩 생성을 할 것이다.

4-1.genesis.json

account를 만들어야함. parity에서 만들어야 한다.

컨테이너의 이름은 # docker ps 를 하면 나온다.
그러면 도커 컨테이너를 시작한다.
$ docker start elegant_tharp
컨테이너를 시작했으니 그 안으로 들어가자.
$ docker attach elegant_tharp

계정을 하나 생성하자.
# parity account new

나는 12345678로 비밀번호로 했다.

그랬더니 아래와 같은 결과물이 나왔다.

0x2a4f860304d9ad566d521efbe4141153da5d273e
이것이 account address이다.

{
    "name": "ethereum",
    "engine": {
      "authorityRound": {
        "params": {
          "blockReward": "0x4563918244F40000",
          "stepDuration": "1",
          "validators": {
            "list": [
              "0x9E4Bd927441F2E7d0E13a263e6e25488557d6671"
            ]
          }
        }
      }
    },
    "params": {
      "gasLimitBoundDivisor": "0x400",
      "maximumExtraDataSize": "0x20",
      "minGasLimit": "0x1388",
      "networkID": "0x396",
      "eip155Transition": 0,
      "validateChainIdTransition": 0,
      "eip140Transition": 0,
      "eip211Transition": 0,
      "eip214Transition": 0,
      "eip658Transition": 0
    },
    "genesis": {
      "seal": {
        "authorityRound": {
          "step": "0x0",
          "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
        }
      },
      "difficulty": "0x10",
      "gasLimit": "0x2625A00"
    },
    "accounts": {
      "0x9E4Bd927441F2E7d0E13a263e6e25488557d6671": {
        "balance": "10000000000000000000000000"
      }
    }
  }
  

여기에서 accounts부분하고 validator의 list에 결과물을 값을 넣어준다.

networkID도 chainlist.org에서 포트번호가 다른 걸로 아무거나 설정해서 16진수로 변환해서 넣어준다.(단, 3자리)

나는 내 생일인 0918을 16진수로 변환하였다.

4-2. password

디렉토리에 password라는 파일을 만들고 아까 만든 비밀번호를 입력해준다.
나는 12345678이 되겠다.

4-3. nodes

nodes라는 파일을 만든다.

빈 파일이다.

4-4. config.toml

author에는 메타마스크 계정 하나의 공개키값을 넣어준다.

# 데몬 설정
# 패러티 작동에 관한 기본 매개변수
[parity]
chain = "/parity-ethereum/genesis.json" 
base_path = "/parity-ethereum/" 


# 네트워크 및 피어 관련 설정
# 패러티가 오프라인 모드인 경우 네트워크 사용 불가
[network]
port = 30305
reserved_peers=  "/parity-ethereum//nodes" 
allow_ips = "all"
# Override the bootnodes from selected chain file.
#bootnodes = ["enode://XXX@localhost:30300", "enode://XXXX@localhost:30301"]
# Enable or disable new peers discovery.
#discovery = false[rpc]

#HTTP를 통해 JSON_RPC API노출
# JSON_RPC는 모든 로컬에서 연결을 수신 대기합니다.
[rpc]
port = 8547
apis = ["web3", "eth", "net", "personal", "parity", "parity_set", "traces" ,"rpc", "parity_accounts"]
interface = "all"
cors = ["all"]



[account]
password = ["/parity-ethereum/password"] 

# 값이 있으면 채굴 노드... 풀노드... 보상 받을 주소를 넣어주는 것임
# 가스 목표
[mining]
author = "0x9E4Bd927441F2E7d0E13a263e6e25488557d6671"  
gas_floor_target = "40000000"

# 로그같은 부분!
# 컬러 쓴다. 기본값이 트루임
[misc]
logging = "own_tx=trace"
log_file = "/parity-ethereum/log.log"
color = true

4-7.docker-compose.yaml

version: "3"

services:
  pos5:
    image: "nara7875/ehtnetwork:1"
    tty: true
    ports:
      - 8547:8547
      - 30305:30305
    environment:
      ENV: ETHERNODE1
      RPCPORT: 8547
      PORT: 30305
    volumes:
      - ./config1.toml:/parity-ethereum/config.toml
      - ./genesis.json:/parity-ethereum/genesis.json
      - ./password:/parity-ethereum/password
      - ./nodes:/parity-ethereum/nodes
      - ./keys1:/parity-ethereum/keys
    container_name: pos5
    command: >
      sh -c "cd ~/
            /parity-ethereum/target/release/parity --config /parity-ethereum/config.toml --geth"
    working_dir: /parity-ethereum/

여기서 포트번호 8547은 rpc 요청 주고 받을 때 쓰는 포트이고 30305는 블록체인 노드끼리 서로 연결할 때 사용한다.

밑의 환경부분도 포트번호를 똑같이 맞춰준다.

볼륨에 대해서 설명ㅎ마자면 :을 기점으로 나뉘는 것이다.
앞부분은 현재 docker-compose 파일이 위치한 디렉토리 내에서의 주소를 뜻하는 것이고 :뒤는 컨테이너 내의 주소를 말하는 것이다. 그리고 컨테이너가 시작될 때 볼륨이 마운트가 되는데, 로컬의 부분을 컨테이너가 참조하는 것이다.

docker-compose.yaml이 있는 파일 디렉토리 내에서 다음과 같은 명령어를 입력하여 docker-compose 파일을 실행시킨다.
$ docker-compose up
그럼 다음과 같이 실행이 된다.

그러면 터미널에 다음과 같이 입력하여서 rpc 통신이 잘 되는지 한 번 확인해보자.

$ curl --data '{"method":"personal_listAccounts","params":[],"id":1,"jsonrpc":"2.0"}' -H "Content-Type: application/json" -X POST http://localhost:8547


잘 나옴을 확인할 수 있다.

profile
코딩 재밌어요!

1개의 댓글

comment-user-thumbnail
2021년 11월 11일

모든 사용자에게 환경변수를 바꾼 것을 적용하고 싶으면 /etc/.bashrc

답글 달기