Programming/블록체인

[블록체인] Bitcoin P2P Network 구성하기

cbw1030 2022. 2. 2. 18:04
반응형

이전 글에 이어 하나의 로컬 컴퓨터에서 3개의 regtest 네트워크를 실행한 이후 각각의 네트워크를 P2P 방식으로 연결해보겠습니다.

 

노드를 띄우기 위해서는 여러 설정값들이 필요한데 주로 쓰이는 설정값에 대해 먼저 알아보겠습니다.

 

노드 설정값

풀 인덱스 노드를 위한 설정값

alternotify

스크립트나 명령어를 실행시켜 이메일 등을 통해 긴급 정보를 보내는 명령어이다.

 

datadir

설정값 없이 bitcoind -regtest를 실행하였을 때 기본적으로 이 위치는 .bitcoin이 된다.

이 경로에 regtest 폴더가 생성되게 되며 각 노드가 모든 블록체인 데이터를 저장하는 공간이 이곳이다.

이번 실습에서는 datadir에 각각 node1, 2, 3의 경로를 담아서 각 노드마다 블록체인 데이터를 저장하는 공간을 개별적으로 만들어 주도록 한다.

 

txindex

txindex를 1로 두면 모든 거래의 인덱스를 유지하면서 블록체인 네트워크 상의 모든 장부를 온전히 내려받아 사용하게 된다.

 

port

연결을 위한 포트를 열어준다. 설정을 따로 안할 시 기본 포트 번호는 아래와 같다.

(default: 8333, testnet: 18333, regtest: 18444)

 

addnode

다른 노드를 추가하는 명령어로 하나 또는 여러 개의 노드를 추가할 수 있다.

3개의 노드를 만들 때는 2, 3 번째 노드부터 addnode 명령어를 사용하여 다른 노드를 추가할 수 있다.

 

지갑 관련 설정값

disablewallet

지갑 기능을 사용하지 않겠다는 의미이다.

 

fallbackfee

기본적으로 비트코인 네트워크에서 지불하는 수수료이다. 수수료는 채굴자에게 채굴보상과 함께 지급된다.

원래 테스트넷에서는 0.0002 만큼의 수수료를 지불하게 되어 있었으나 0.20 버전 이후부터는 올라가면서 메인넷과 동일하게 기본값이 0이 되었으며 이 값을 0으로 설정해 둔다면 수수료를 지불하지 못해 송금 실습 시에 에러가 나기 때문에 실습에서는 0.0002로 fallbackfee를 설정해준다.

 

keypool

keypool의 사이즈를 조정해주는 명령어이다.

keypool은 HD 지갑에서 address를 최대 만들 수 있는 개수이다. address를 하나씩 만들수록 keypool이 1씩 감소한다.

 

walletbroadcast

지갑 프로그램의 기능중 p2p 네트워크로 전파하는 기능을 하도록 설정해주는 값이다.

기본값이 1로 설정되기 때문에 그대로 두면 된다.

 

RPC 통신 관련 설정값

rpcuser=<user>

JSON-RPC 연결을 하기 위해 설정하는 유저이름 정보이다.

 

rpcpassword=<pw>

JSON-RPC 연결을 하기 위해 설정하는 비밀번호이다.

 

rpcport=<port>

JSON-RPC 연결을 입력한 <port>번호에 따라서 수신하게 된다. 따로 설정하지 않을 시의 포트번호는 아래와 같다.

(default: 8332, testnet: 18332, regtest: 18443)

 

-chain=<chain>

체인 자리에 main, test, regtest 중 하나를 선택하여 지정해준다.

 

자원 제한을 위한 설정값

prune 

이전의 오래된 블록을 삭제하여 디스크 공간 요구치를 줄이는 옵션이다.

 

maxconnections

연결을 수락하기 위한 최대의 노드수를 설정하여 대역폭의 소비를 줄일 수 있다. 기본값은 125이다.

 

maxmempool

입력된 값 만큼 거래 메모리 풀을 제한하여 노드의 메모리 사용량을 줄인다.(메가바이트 단위)

 

maxreceivebuffer/maxsendbuffer

연결된 메모리 버퍼를 제한한다. 입력된 값을 n으로 두면 n * 1000 bytes 만큼 제한된다.

기본값은 각각 5000/1000이다.

 

 

노드를 regtest 네트워크에 띄우기

총 3개의 regtest 네트워크를 하나의 로컬 컴퓨터에서 실행하고자 한다.

regtest 네트워크를 실행하는 명령어는 아래와 같다.

bitcoind -conf=<conf location> -rpcport=<rpc port> -port=<port> -wallet=<wallet name> -daemon

 

노드를 실행하기 전에 conf 파일을 설정해야 한다.

각각의 conf 파일이 위치하는 경로는 /home/bitcoin/bitcoin/node1, /home/bitcoin/bitcoin/node2, /home/bitcoin/bitcoin/node3 이다.

 

/home/bitcoin/bitcoin/node1/bitcoin.conf 

chain=regtest
rpcuser=luna
rpcpassword=luna
rpcport=1111
txindex=1
port=8881
fallbackfee=0.0002
server=1
datadir=/home/bitcoin/bitcoin/node1

 

 

/home/bitcoin/bitcoin/node2/bitcoin.conf 

chain=regtest
rpcuser=pine
rpcpassword=pine
rpcport=2222
txindex=1
port=8882
fallbackfee=0.0002
server=1
datadir=/home/bitcoin/bitcoin/node2

 

 

/home/bitcoin/bitcoin/node3/bitcoin.conf 

chain=regtest
rpcuser=kim
rpcpassword=kim
rpcport=3333
txindex=1
port=8883
fallbackfee=0.0002
server=1
datadir=/home/bitcoin/bitcoin/node3

 

 

각각의 conf 파일을 생성했으니 3개의 regtest 네트워크를 백그라운드로 실행해보자.

bitcoind -conf="../bitcoin/node1/bitcoin.conf" -rpcport=1111 -port=8881 -wallet="luna" -daemon
bitcoind -conf="../bitcoin/node2/bitcoin.conf" -rpcport=2222 -port=8882 -wallet="pine" -daemon
bitcoind -conf="../bitcoin/node3/bitcoin.conf" -rpcport=3333 -port=8883 -wallet="kim" -daemon

 

백그라운드에서 모두 잘 실행되고 있다(pid 1163은 무시해주세요)

 

첫 번째 네트워크(노드)가 잘 연결되어 있는지 확인해보자.

잘 연결되어 있다. 나머지 pine, kim 노드도 연결되어 있음을 예상할 수 있다.

 

첫 번째 노드에서 채굴을 해보자.

 

블록을 하나 생성했으니 getblockcount를 통해 카운트를 확인해보자.

첫 번째 노드에서 블록을 생성했으니 카운트가 1로 출력되는 것이 맞고 나머지 2, 3번째 노드는 아직 블록을 생성하지 않았기 때문에 0으로 출력되는 것이 맞다.

 

 

현재는 아래 사진처럼 같이 regtest 네트워크에서 3개의 노드들이 실행되고 있는 상태이다.

pine, kim 노드를 luna 노드에 연결시켜 보자.

 

 

연결을 시켰으니 잘 연결되었는지 확인을 해보자.

잘 연결 되었다

port 8881에 둘 다 모두 잘 연결되었다.

 

블록 카운트를 확인하면 luna 노드의 블록 카운트가 출력이 되는지 확인해보자.

pine, kim은 luna 노드에 연결시키 전에 블록 카운트가 0이었는데 연결을 한 이후에는 카운트가 1인 것을 확인할 수 있다.

 

 

 

 

각 노드별로 몇 개가 연결되어있는지도 확인할 수 있다.

 

 

 

참고

https://www.youtube.com/watch?v=_5bjloFz7l8&list=PLZwFtgKc35I_ROUsSev0xcy5poVH486CV&index=8 

반응형