Docker

도커에 비트코인 서버 설치 + 블록 생성 + 계좌 간 이체

GTC 2021. 5. 7. 11:16

비트코인 도커이미지 가져오기 

# docker pull pjt3591oo/bitcoin:0.17.01

컨테이너(bitcoin.test.com) 실행

# docker run -it --name bitcoin.test.com pjt3591oo/bitcoin:0.17.01  

 

 

비트코인 노드 실행을 위한 설정

시작 쉘 스크립트 수정($HOME에 start.sh가 들어있음)

root@<비트코인 컨테이너ID>:~# cd $HOME

 

root@<비트코인 컨테이너ID>:~# vi start.sh

3번째줄 문장 마지막에 파란색 밑줄 부분을 추가한다

 

 

블록이 저장되는 위치 확인

시작 쉘 스크립트로 노드를 실행하면  생성된 블록이 .bitcoin 디렉터리 안에 있는 "blocks" 디렉터리에 보관된다

root@<비트코인 컨테이너ID>:~# ls .bitcoin

 

 

블록이 저장되는 위치 변경

블록이 저장되는 위치를 변경하려면 시작 쉘 스크립트의 "--datadir=$PWD/.bitcoin" 부분에서 .bitcoin을 블록을 저장할 새 디렉터리 위치로 수정해준다

 

블록 데이터를 저장할 디렉터리 생성

root@<비트코인 컨테이너ID>:~# mkdir test1 test2
root@<비트코인 컨테이너ID>:~# cd test1

 

 

비트코인 노드 실행

노드를 실행하는 방법에는 시작 쉘 스크립트를 실행하는 방법과 시작 쉘 스크립트 안에 있는 명령어로 실행시키는 방법이 있다

만약 시작 쉘 스크립트를 수정했다면 노드를 실행시킬 때 시작 쉘 스크립트 안에 있는 명령어로 실행시켜야 수정된 부분이 적용된다

root@<비트코인 컨테이너ID>:~# ./start.sh
root@<비트코인 컨테이너ID>:~# bitcoind -regtest -rpcuser=test -rpcpassword=test -server -rpcport=12345 \
> --datadir="$PWD/.bitoin" -deprecatedrpc=accounts

노드를 실행시키면 아래와 같이 로그를 출력하는 상태가 될 것이다

 

 

터미널을 하나 더 실행하고 새 터미널에서 실습을 진행한다

 

 

계좌번호 생성

새 터미널에서도 비트코인 컨테이너에 접속한다

# docker exec -it <비트코인 컨테이너ID> bin/bash

 

다음의 명령어를 입력하면 계좌번호가 출력된다

root@<비트코인 컨테이너ID>:~# bitcoin-cli  -regtest  -rpcuser=test  -rpcpassword=test  -rpcport=12345 \
-rpcconnect="127.0.0.1" -datadir="$PWD/test1" getnewaddress <계좌 주소>

 

 

블록 생성

[ ] 안에 총 101개의 암호화된 문장이 있는데 1개 당 1개의 블록이다

블록을 생성할 때 100개까지는 보상이 없고 101개째 블록부터 1개로 인정한다. 따라서 계좌를 조회해보면 50개의 비트코인(블록1개당 50비트코인)이 있을 것이다

root@<비트코인 컨테이너ID>:~# bitcoin-cli  -regtest  -rpcuser=test  -rpcpassword=test  -rpcport=12345  \
-datadir=/bitcoin/<블록데이터 저장을 위해 생성한 디렉터리>  generate  <생성할 블록 개수>

 

 

계좌 조회

50개의 코인이 생성된 것을 확인할 수 있다

root@<비트코인 컨테이너ID>:~# bitcoin-cli  -regtest  -rpcuser=test -rpcpassword=test -rpcport=12345  \
 -rpcconnect=127.0.0.1  -datadir=/bitcoin/<블록데이터 저장을 위해 생성한 디렉터리>  listaccounts

 

 

비트코인 이체를 위한 새 계좌 생성

비트코인을 다른 계좌로 이체하기 위해 새로운 계좌번호를 생성한다

새로운 터미널을 실행하고 비트코인 노드에 접속하여 진행한다(총 3개의 터미널이 열려있어야 한다)

# docker exec -it bitcoin.test.com  /bin/bash
root@<비트코인 컨테이너ID>:~# bitcoin-cli -regtest -rpcuser=test -rpcpassword=test -rpcport=12345 \
 -rpcconnect=127.0.0.1 -datadir=/bitcoin/<블록데이터 저장을 위해 생성한 디렉터리> getnewaddress <계좌 주소>

 

 

비트코인 이체(600개 이체)

2번째 터미널로 와서 3번째 터미널에서 만든 새로운 계좌로 비트코인을 이체한다(보내기 전 5600개의 비트코인 보유)

root@<비트코인 컨테이너ID>:~# bitcoin-cli -regtest -rpcuser=test  -rpcpassword=test -rpcport=12345 -rpcconnect=127.0.0.1 \
> -datadir=/bitcoin/<블록데이터 저장을 위해 생성한 디렉터리> sendtoaddress <비트코인을 받을 계좌 주소> <보낼 비트코인 수>

 

 

계좌 조회

다시 3번째 터미널로 돌아와서 계좌를 조회해보니 2가지의 이상한 점이 있을 것이다

1. 5600 코인에서 600을 보냈는데 5000보다 적어진 이유?(이체 수수료 발생)

2. 돈을 받지 못한 이유?(방금 이루어진 이체가 공식 거래였음을 블록생성으로 증명하는 과정이 필요)

 

 

거래 증명을 위한 블록 생성 및 계좌 조회

root@<비트코인 컨테이너ID>:~# bitcoin-cli  -regtest  -rpcuser=test  -rpcpassword=test  -rpcport=12345  \
-datadir=/bitcoin/<블록데이터 저장을 위해 생성한 디렉터리>  generate  <생성할 블록 개수>
root@<비트코인 컨테이너ID>:~# bitcoin-cli  -regtest  -rpcuser=test -rpcpassword=test -rpcport=12345  \
 -rpcconnect=127.0.0.1  -datadir=/bitcoin/<블록데이터 저장을 위해 생성한 디렉터리>  listaccounts

블록을 하나 생성(4999개에서 5049개가 된 이유)하고 난 다음 정상적으로 이체된 것을 확인할 수 있다

 

 

send가 아닌 move를 사용하여 수수료없이 비트코인 이체(1000개 이체)

수수료도 없고 거래를 증명하는 블록도 생성할 필요가 없다

root@<비트코인 컨테이너ID>:~# bitcoin-cli -regtest -rpcuser=test  -rpcpassword=test -rpcport=12345 -rpcconnect=127.0.0.1 \
> -datadir=/bitcoin/<블록데이터 저장을 위해 생성한 디렉터리> move [보낼주소] [받는주소] <보낼 비트코인 수>