[블록체인] Bitcoin Core 실행과 Genesis Block
비트코인 네트워크는 메인넷, 테스트넷, 로컬 테스트넷(regtest)으로 나뉜다.
메인넷은 실제 비트코인을 주고 받는 네트워크이다.
테스트넷은 주로 개발자들이 블록체인 관련 개발을 하고 테스트를 할 때 사용하는 네트워크이다. 비트코인에 가치가 없으며 채굴의 난이도가 낮다는 특징이 있다.
로컬 테스트넷(regtest)은 개인 로컬 컴퓨터에서 노드를 생성하여 여러가지 테스트를 해볼 수 있는 네트워크이다.
이번 포스팅에서는 레그테스트(regtest) 모드를 이용하여 제네시스 블록을 생성하는 과정부터 새로운 참여자가 추가되는 것까지 테스트하고자 한다.
regtest 네트워크 생성
레그테스트 모드를 사용하는 방법은 아래와 같다.
# 먼저 bitcoin 디렉토리로 이동해야 한다.
bitcoind -regtest
위 명령어를 실행하면 진행과정이 출력되는데 중간에 Config file: ~~~.. 부분을 볼 수 있다.
이 부분은 configuration 파일을 따로 지정하지 않았기 때문에 기본적인 설정으로 진행됐다는 의미이다.
regtest 네트워크를 생성하면 default wallet을 하나 만들어준다.
bitcoind -regtest 명령어를 사용하면 백그라운드가 아닌 앞단에서 노드를 실행시키는 것이라 다른 동작을 진행할 수가 없다. 아래에서 멈출 것이다.
따라서 백그라운드로 재 시작을 해줘야 한다.
regtest 네트워크를 생성하면 설정값이 들어있는 ~/.bitcoin 이라는 경로가 생긴다.
여기서 regtest라는 폴더 안에 지갑과 블록체인의 상태정보(chainstate)가 저장된다.
만약 초기화를 하고 싶다면 regtest 디렉토리를 지우고 다시 실행하면 된다.
regtest 디렉토리를 지운다는 것은 분산장부를 지운다는 의미로 하나의 네트워크가 소멸된다고 볼 수 있다.
bitcoin-cli 명령어로 함수 호출하기
regtest 네트워크를 생성했으니 bitcoin-cli 명령어로 사용가능한 함수를 호출한다.
bitcoin-cli -regtest getblockchaininfo
출력된 몇 가지 Key에 대해 설명을 하자면 아래와 같다.
blocks: 서버에서 처리된 블록 수 (첫 번째로 생성한 제네시스 블록이므로 0으로 표시된다)
headers: 확인된 현재 헤더 수
bestblockhash: 현재 최고 블록의 해시 값
difficulty: 채굴 난이도
bitcoin-cli에서는 채굴 명령의 실행이 한 번에 바로 이루어지기 때문에 메인넷처럼 기다리는 대기 시간이 없다.
원하는 block number의 해시값을 가져올 수도 있다.
block hash 값으로 block에 대한 정보를 가져올 수도 있다.
위에 출력된 key들 중에서 confirmations를 확인할 수 있다.
블록체인에서 거래가 확정이 되기 위해서는 confirm이 6개 이상되어야 하는데 confirmations의 값이 해당하는 숫자이다.
현재 출력된 block 정보는 제네시스 블록이므로 confirmations는 1로 나오게 된다.
이후 1개의 블록이 연결될 때마다 confirmations는 1씩 증가하게 된다.
block hash 값으로 block에 대한 정보를 가져 오는 것에서 추가적인 옵션 '2'를 주게 되면 transaction까지 출력하게 된다.
transaction의 key인 coinbase는 채굴자들에게 보상을 주는 트랜잭션을 의미한다.
트랜잭션의 종류는 송금할 때 나오는 트랜잭션과 채굴자들에게 보상을 주는 코인베이스 트랜잭션인 2가지가 존재한다.
제네시스 블록은 코인베이스 트랜잭션일 수 밖에 없다.
코인베이스 트랜잭션의 UTXO는 블록체인 분기(fork)가 일어나게 되면 버려지는 블록이 있을 수 있기 때문에 보상을 받은 뒤 100 블록이 경과하지 않으면 이용할 수가 없다.
또한 제네시스 블록의 채굴 보상은 수신자가 없으므로 제네시스 블록의 다음 순서인 1번 블록의 보상이 들어오는 101번째 블록부터 잔고를 확인할 수가 있다.
참고
해당 포스팅은 위데이터랩 조현기 팀장의 강의를 정리한 내용입니다.
https://www.youtube.com/watch?v=Sh8v9jm9cK0&list=PLZwFtgKc35I_ROUsSev0xcy5poVH486CV&index=4