쿼럼 설치 후 내부 구성 및 기본 설정에 대해서 알아보자. 참고로 설치 시점 실행 클라이언트는 GoQuorum
으로 설정했음을 밝힌다.( 선택 옵션으로 Hyperledger Besu와 GoQuorum 두 개가 있다.)
쿼럼 설치가 정상적으로 잘 되었다면, 서버에 아래 이미지와 같은 파일들이 구성이 되어있을 것이다. 실행 스크립트들(.sh)과 도커 파일(.yml), 실행 프로세스 관련 디렉토리들이 세팅된다. 이번 포스트에서는 전체 패키지 구성 중 블록체인 노드
, 블록 익스플로러 실행 및 운영
에 관련된 내용을 중점적으로 다루고자 한다.
기본 구성
쿼럼의 구성은 크게 아래와 같이 나눌 수 있다.
- 도커(Docker)
- 실행 스크립트(.sh)
- 노드(Node)
- 로그(Log)
도커(Docker)
쿼럼은 도커에 저장된 이미지를 불러와 블록체인 네트워크를 구축한다. 별도의 설정을 잡아주지 않으면 노드, 익스플로러, 모니터링 툴, 통합 키 관리 프로그램 등이 한 번에 실행된다. 쿼럼에서 블록체인 네트워크를 구축할 때 실행되는 프로세스 목록을 수정하고자 한다면 도커(Docker)에 대한 설정을 따로 잡아주어야 한다.
해당 설정은 docker-compose.yml
에서 수정할 수 있으며, 설정 범위는 프로세스 리스트, 프로세스 실행 주소, 참조 설정 파일 경로, 로그 등이 있다.
version: '3.6'
...
services:
rpcnode:
<< : *quorum-def
container_name: rpcnode
ports:
- 8545:8545/tcp
- 8546:8546/tcp
- 30303
- 9545
environment:
- GOQUORUM_CONS_ALGO=${GOQUORUM_CONS_ALGO}
- GOQUORUM_GENESIS_MODE=standard
volumes:
- ./config/nodes/rpcnode:/config/keys
- ./logs/quorum:/var/log/quorum/
networks:
quorum-dev-quickstart:
ipv4_address: 172.16.239.15
explorer:
build: block-explorer-light
image: quorum-dev-quickstart/block-explorer-light:develop
depends_on:
- rpcnode
ports:
- 25000:80/tcp
networks:
quorum-dev-quickstart:
ipv4_address: 172.16.239.31
...
networks:
quorum-dev-quickstart:
name: quorum-dev-quickstart
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.239.0/24
volumes:
ethlogger:
blockscoutpostgres:
실행 스크립트(.sh)
쿼럼에서 네트워크 구축은 패키지 안에 생성되어 있는 스크립트만 실행시키면 된다.
- run.sh : 환경 변수 참조 및 도커 컨테이너 빌드 진행
- stop.sh : 네트워크 구동 중지 -> 단순 정지
- resume.sh : 네트워크 재시작
- remove.sh : 네트워크 중지 및 초기화(도커 이미지 제거) -> 서버에 저장된 블록 데이터 전체 삭제
이 실행 스크립트는 모두 도커와 관련된 명령어를 수행한다. 도커에 바인드 되어 있는 프로세스들이 해당 스크립트에 따라 빌드되거나 중지, 삭제된다.
run.sh 스크립트는 도커에 저장된 프로세스를 설정에 맞춰 빌드하고 동작시킨다. stop.sh 는 프로세스의 단순 정지. resume.sh 는 정지된 프로세스의 재시작. remove.sh 스크립트는 네트워크 정지 및 프로세스 초기화를 실행한다. remove.sh 는 지금까지 저장된 모든 블록 데이터를 삭제하니 연결된 다른 노드가 없다면 조심해야 한다.
참고를 위해 아래에 run.sh 스크립트의 내부 소스코드를 첨부해두었다.
#!/bin/bash -u
# Copyright 2018 ConsenSys AG.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
# specific language governing permissions and limitations under the License.
NO_LOCK_REQUIRED=true
. ./.env
. ./.common.sh
# create log folders with the user permissions so it won't conflict with container permissions
mkdir -p logs/besu logs/quorum logs/tessera
# Build and run containers and network
echo "docker-compose.yml" > ${LOCK_FILE}
echo "${bold}*************************************"
echo "Quorum Dev Quickstart"
echo "*************************************${normal}"
echo "Start network"
echo "--------------------"
if [ -f "docker-compose-deps.yml" ]; then
echo "Starting dependencies..."
docker-compose -f docker-compose-deps.yml up --detach
sleep 60
fi
echo "Starting network..."
docker-compose build --pull
docker-compose up --detach
#list services and endpoints
./list.sh
노드(Node)
프라이빗 블록체인에 운영되는 노드에 대한 설정 파일은 다음과 같다.
- .env : 노드 실행 환경
- genesis.json : QBFT 합의 메커니즘 genesis 블록
- permissioned-nodes.json : 접근 노드 주소 관리
- static-nodes.json : 부트 노드 주소 관리
각 파일들은 노드 실행에 관련된 기초 설정값들을 담고 있다. 만약, 단일 쿼럼으로 네트워크를 구성하지 않고 다른 PC와 함께 네트워크를 연동하고자 한다면 이 설정은 매우 중요하다.
.env 파일은 노드 실행 환경 변수(Environment Variable) 정보
를 담고 있다. 정확히는 블록체인 네트워크의 합의 메커니즘(Consensus Mechanism)
을 무엇으로 할지에 대한 정보를 담고 있다. 쿼럼에서는 이 변수 정보를 바탕으로 최초 블록(genesis.json)을 달리한다.
# This file defines environment variables defaults for Docker-compose
# but we also use it for shell scripts as a sourced file
BESU_VERSION=21.10.2
QUORUM_VERSION=21.10.0
TESSERA_VERSION=21.10.0
ETHSIGNER_VERSION=21.3.2
LOCK_FILE=.quorumDevQuickstart.lock
# GoQuorum consensus algorithm
# istanbul, qbft, raft
# !!! lower case ONLY here
GOQUORUM_CONS_ALGO=qbft
# Besu consensus algorithm
# IBFT, QBFT, CLIQUE
# PLEASE NOTE: IBFT used here refers to IBFT2.0 and not IBFT1.0 More information can be found https://besu.hyperledger.org/en/latest/HowTo/Configure/Consensus-Protocols/IBFT/
# We use IBFT here to keep the API names consistent
# !!! upper case ONLY here
BESU_CONS_ALGO=QBFT
GoQuorum와 Hyperledger Besu 클라이언트 모두 디폴트 값으로 QBFT 합의 알고리즘을 사용해 네트워크 구축한다. 쿼럼에서 제공하는 합의 알고리즘은 QBFT, IBFT, RAFT, CLIQUE 등 총 4가지가 있다. GoQuorum은 CLIQUE를 제외한 나머지 3개의 합의 알고리즘을 사용할 수 있으며, Hyperledger Besu의 경우 QBFT를 제외한 나머지 알고리즘을 선택할 수 있다.
이 설정 파일에서 GoQuorum은 무조건 소문자. Hyperledger Besu는 대문자 표기가 필수이며 표기법이 다르다. 자세한 내용은 코드 내부 주석에 적혀있다.
genesis.json 파일은 최초 블록에 대한 설정값을 담고 있다. 블록 사이즈, 채굴 난이도, 가스 등에 대한 설정을 지정할 수 있다. 쿼럼에서는 앞서 언급한 합의 메커니즘에 맞는 genesis.json 파일을 제공해준다. ~/config/goquorum/data 경로로 이동하면 QBFT, IBFT, RAFT, CLIQUE 등 합의 메커니즘에 따라 각각의 genesis.json 파일이 세팅되어 있다.
{
"config": {
"chainId": 1337,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"istanbul": {
"epoch": 30000,
"policy": 0,
"testQBFTBlock": 0,
"ceil2Nby3Block": 0
},
"txnSizeLimit": 64,
"maxCodeSize": 0,
"isQuorum": true
},
"nonce": "0x0",
"timestamp": "0x5f1663fc",
"extraData": "0xf87aa00000000000000000000000000000000000000000000000000000000000000000f8549493917cadbace5dfce132b991732c6cda9bcc5b8a9427a97c9aaf04f18f3014c32e036dd0ac76da5f1894ce412f988377e31f4d0ff12d74df73b51c42d0ca9498c1334496614aed49d2e81526d089f7264fed9cc080c0",
"gasLimit" : "0xf7b760",
"difficulty": "0x1",
"mixHash": "0x63746963616c2062797a616e74696e65206661756c7420746f6c6572616e6365",
"coinbase": "0x0000000000000000000000000000000000000000",
"alloc": {
...
},
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
permissioned-nodes.json 파일은 노드 간의 연결 권한을 관리한다. 문자열 배열 형태로 작성되어 있으며, 해당 배열 내에 노드의 주소를 입력해주어야 노드가 블록체인 네트워크에 연결될 수 있다.
static-nodes.json 은 클라이언트를 통해 노드를 실행할 때, 어떤 노드를 실행할지에 대한 설정을 관리한다. 역시 문자열 배열 형태로 작성되어 있으며, 해당 배열 내에 포함된 노드의 주소는 같은 피어로 묶여 함께 실행된다.
# permissioned-nodes.json & static-nodes.json 형식
[
"enode://0d88c9de521775a6ca557c996d0a5b0be4d84aa4e804d82efe534120515bf59a888e9d025cb78e0fb979a81da1463bdabdd2b14a1fd03eb7c81fba52f183d169@[프로세스 실행 IP]:[실행 Port]?discport=0",
"enode://86fcc16f4730fbfd238dc17ea552854c0943923bb1d5e886e5601b8d884fb0519060e0023f495dd24ffe60a65660fb7fdcdebfceedd2b3673dfa63658825924b@[프로세스 실행 IP]:[실행 Port]?discport=0"
]
로그(Log)
이더리움 네트워크를 운영해본 개발자라면 geth 등의 클라이언트로 네트워크 콘솔을 열어본 적이 있을 것이다. 콘솔로 접근했을 때, 실시간 네트워크 블록을 확인할 수 있는데 쿼럼에서는 이 정보가 로그 파일로 업데이트된다.
패키지 루트 경로에 있는 logs
디렉토리를 확인하면 geth-\[노드 실행 IP\].log
파일 형식으로 네트워크 블록 업데이트 현황을 확인할 수 있다.
INFO [03-22|05:52:30.520] QBFT: start new round address=0xcD068e4782973512474E345448140A8C35B0C6F4 old.round=0 old.sequence=2511 old.state="Accept request" old.proposer=0xcE412f988377e31F4d0fF12d74df73B51C42d0cA next.round=0 next.seq=2512 next.proposer=0x27A97C9AaF04f18f3014c32e036dD0Ac76Da5f18 next.valSet="[0x27A97C9AaF04f18f3014c32e036dD0Ac76Da5f18 0x93917cADBace5dFCE132B991732c6Cda9bcC5B8a 0x98C1334496614aED49d2E81526D089f7264fED9C 0xcE412f988377e31F4d0fF12d74df73B51C42d0cA]" next.size=4 next.IsProposer=false
INFO [03-22|05:52:30.519] Commit new mining work number=2512 sealhash="395634…bd6eb9" uncles=0 txs=0 gas=0 fees=0 elapsed="247.852µs"
INFO [03-22|05:53:00.012] QBFT: handle final committed address=0xcD068e4782973512474E345448140A8C35B0C6F4 current.round=0 current.sequence=2512 state="Accept request"
INFO [03-22|05:53:00.012] QBFT: initialize new round address=0xcD068e4782973512474E345448140A8C35B0C6F4 current.round=0 current.sequence=2512 target.round=0 lastProposal.number=2512 lastProposal.hash="dc1914…8ff8a6"
INFO [03-22|05:53:00.013] QBFT: start new round address=0xcD068e4782973512474E345448140A8C35B0C6F4 old.round=0 old.sequence=2512 old.state="Accept request" old.proposer=0x27A97C9AaF04f18f3014c32e036dD0Ac76Da5f18 next.round=0 next.seq=2513 next.proposer=0x93917cADBace5dFCE132B991732c6Cda9bcC5B8a next.valSet="[0x27A97C9AaF04f18f3014c32e036dD0Ac76Da5f18 0x93917cADBace5dFCE132B991732c6Cda9bcC5B8a 0x98C1334496614aED49d2E81526D089f7264fED9C 0xcE412f988377e31F4d0fF12d74df73B51C42d0cA]" next.size=4 next.IsProposer=false
INFO [03-22|05:53:00.013] Commit new mining work number=2513 sealhash="05d19d…0d49b4" uncles=0 txs=0 gas=0 fees=0 elapsed="351.173µs"
INFO [03-22|05:53:30.519] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed="816.509µs" mgasps=0.000 number=2513 hash="2f80ca…681a4b" dirty=891.00B
INFO [03-22|05:53:30.519] Commit new mining work number=2514 sealhash="eada79…37a487" uncles=0 txs=0 gas=0 fees=0 elapsed="228.916µs"
INFO [03-22|05:54:00.012] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed="653.336µs" mgasps=0.000 number=2514 hash="35f4df…d7df01" dirty=891.00B
INFO [03-22|05:54:30.511] Commit new mining work number=2516 sealhash="13c833…88a117" uncles=0 txs=0 gas=0 fees=0 elapsed="457.442µs"
INFO [03-22|05:54:30.511] QBFT: start new round address=0xcD068e4782973512474E345448140A8C35B0C6F4 old.round=0 old.sequence=2515 old.state="Accept request" old.proposer=0xcE412f988377e31F4d0fF12d74df73B51C42d0cA next.round=0 next.seq=2516 next.proposer=0x27A97C9AaF04f18f3014c32e036dD0Ac76Da5f18 next.valSet="[0x27A97C9AaF04f18f3014c32e036dD0Ac76Da5f18 0x93917cADBace5dFCE132B991732c6Cda9bcC5B8a 0x98C1334496614aED49d2E81526D089f7264fED9C 0xcE412f988377e31F4d0fF12d74df73B51C42d0cA]" next.size=4 next.IsProposer=false
'Blockchain > Quorum' 카테고리의 다른 글
[Quorum] 쿼럼(Quorum)으로 프라이빗 블록체인 구축하기 (0) | 2022.03.07 |
---|
댓글