도커를 사용하여 자신의 MAC에 여러 비트 코인 테스트 노드를 설정하는 방법은 무엇입니까? (2 단계 — btcd)

이전 게시물에서 우리는 도커 컨테이너로 비트 코인 테스트 환경을 설정하는 방법에 대해 이야기했습니다. 각 도커 컨테이너는 C ++에있는 bitcoind 프로세스를 실행합니다. 빌드를 위해 make 명령을 실행하고 오랜 시간 동안 고통을 겪었습니다 (또는 좋은 점심을 먹기 위해 시간을 할애했습니다). 대부분의 현대 웹 개발자처럼 하루에 20 번 이상 프로덕션으로 푸시하는 것은 드문 일이 아닙니다. 작은 변화가있을 때마다 25 분을 기다리는 것은 옳지 않습니다. 이제이 게시물 (Phase II)에서 모든 문제를 해결할 것입니다.

농담 측면에서 빌드 시간은 개발자 의 일상 생활에서 큰 문제이며 golang이 해결하려고하는 주요 고충 중 하나입니다. 사용자 관점에서 다른 언어로 비트 코인을 다르게 구현해야하는 이유에 대해 이야기 해 보겠습니다.

2009 년 Satoshi가 백서 (https://bitcoin.org/bitcoin.pdf)를 발표했을 때 이중 지출 문제를 해결하기위한“Bitcoin : A Peer-to-Peer Electronic Cash System”을 만드는 프로토콜입니다. 분산 된 환경. 그는 나중에 참조 코드를 공개했습니다.

분권화를 핵심 속성으로 사용하는 오픈 소스 프로젝트에서는 서로 다른 프로그래밍 언어를 사용하여 서로 다른 당사자가 프로토콜을 여러 번 구현해야합니다. 여러 계층에서 단일 실패 지점을 방지합니다. 예를 들어, 가장 최근의 취약점 CVE-2018–17144가 bitcoind 코드베이스와 최근 해당 코드베이스에서 분기 된 거의 모든 프로젝트에서 발견되었습니다 (일부 프로젝트는 분기 되었기 때문에 운이 좋았습니다. 회귀 버그가 도입되기 전). btcd (https://github.com/btcsuite/btcd)의 golang 구현에는 동일한 버그가 존재하지 않습니다. 더 자세히 알아보기 위해, 해당 버그에 대한 수정 사항이 없더라도 공격자가이를 악용하려고 시도했으며, bitcoind (버그 포함)를 실행하는 모든 노드가 블록을 가져 가서 이중 지출을 체인 및 이동, 하나의 트랜잭션은 두 개의 중복 된 입력을 참조하며, 귀하의 비트 코인은 지금부터 두 배의 가치가 있습니다. btcd (비트 코인의 golang 버전)를 실행하는 모든 노드는 유효하지 않은 트랜잭션이있는 블록을 거부합니다. 이상적인 경우, 만약 비트 코인 프로토콜의 5 가지 다른 구현이 있었다면 하나의 코드베이스에있는 버그가 네트워크의 훨씬 작은 부분에 영향을 미칠 것입니다.

그렇다면 btcd bitcoind 의 차이점은 무엇입니까? btcd는 비트 코인 구현의 Go 버전이고, bitcoind는 C ++ 비트 코인 구현입니다. 현재 프로덕션 네트워크 (메인 넷)에서 대부분의 노드는 bitcoind 를 실행하고, 아주 작은 부분은 btcd 를 실행합니다 (전체 노드의 작은 부분조차도 python 또는 자바 구현). 솔직히 이것은 비트 코인이 * 분권화 *되어 있다고 가정하기 때문에 매우 슬픈 상황입니다.

btcd 의 대규모 개발은 2013 년과 2015 년 사이에 이루어졌으며 대부분의 개발자는 POW + POS 체인 인 Decred로 이동합니다. 현재 btcd 는 여전히 적극적으로 유지됩니다. 사용자의 관점에서 볼 때 가장 큰 차이점은 지갑 앱입니다. bitcoind 는 지갑과 함께 제공되며, btcd 는 https://github.com/btcsuite/에 별도의 지갑이 있습니다. btcwallet.

시스템 관리자의 관점에서 볼 수있는 또 다른 주요 차이점은 성능입니다. bitcoind btcd 보다 2 배 이상 빠르며 부트 스트랩 프로세스 동안 리소스를 훨씬 적게 사용합니다 (230GB 다운로드 데이터, 처리, 디스크에 쓰기 등) 여기에 약간의 참고 사항이 있습니다. btcd 부트 스트랩이 느린 이유 중 하나는 네트워킹 지연 때문입니다. 노드가 미국 (예 : 내)에있는 경우 chaincfg / params.go 아래의 btcd DNSSeed의 기본 노드에 대한 연결 속도가 느려집니다. 미국에서 몇 개의 노드를 수동으로 추가하면 부트 스트랩 속도가 훨씬 빨라집니다. 예를 들어 시작 btcd 명령에 다음을 추가합니다. -connection = 157.131.198.183 : 8333 --connection == 209.108.206.229 : 8333 . IP는 계속 변경되며 리더 보드를 사용하여 해당 국가에 가까운 최신 IP를 찾을 수 있습니다.

btcd 부트 스트랩에 대한 또 다른 좋지 않은 소식은 8 개 노드에서 비트 코인 다운로드가 아닌 한 노드에서만 다운로드한다는 것입니다. btcd 코드가 변경 될 때까지 할 수있는 일은 많지 않습니다. leaderboad에서 찾은 노드는 전체 다운로드주기에 충분하지 않을 수 있습니다. 다운로드 속도를 계속 모니터링하고 다른 노드로 변경하는 것은 매우 고통 스럽습니다.

또한 top 또는 htop 을 사용하여 CPU / 메모리 사용량을 모니터링하여 CPU 또는 메모리에 제한이 없는지 확인합니다. 대부분의 경우 bitcoind로 정상적으로 실행되는 시스템은 btcd와 잘 작동하지 않습니다. 제한된 테스트에서 구성을 2 배 올렸습니다.

btcd 용 Docker 컨테이너는 어떻게 만듭니 까? 다음 콘텐츠로 Dockerfile 을 만듭니다.

다음 GitHub 재현을 확인하세요.

docker-compose.yml 파일을 만들고 빌드합니다.

docker-compose build 명령을 실행하여 빌드 한 다음 docker-compose up 명령을 실행하여 4 개의 다른 컨테이너를 불러옵니다.

도커 ps 명령을 실행하여 컨테이너 이름이 무엇인지 확인한 다음 docker exec -it test-for-blog-post-ii_node1_1 bash를 실행하여 컨테이너 중 하나에 연결합니다. 다음 명령을 사용하여 200 개의 블록을 생성합니다.

btcctl -u USER -P PASS --rpcserver = 127.0.0.1 : 18556 200 생성

이제 체인에 200 개의 블록이 채굴되었으므로 사용하려면 지갑이 있어야합니다. 채굴 자에 사용한 주소는 SSwfPFMdZMGvQ5VyBQsHPdy69sPxevhxe5 이며 다음 시드에 의해 생성됩니다. , 다른 주소를 원하시면 시드를 변경하십시오.

시드가있는 지갑 생성 : 연결된 컨테이너에서 다음 명령을 수행합니다. btcwallet -u USER -P PASS --simnet --create

이제 btcwallet -u USER -P PASS --simnet 로 btcwallet을 시작합니다. 일단 시작되면 ctrol + c 프로세스가 종료되므로 ctrol + c 를 사용하지 마십시오.

다른 터미널을 시작하고 동일한 컨테이너에 연결합니다. 다음 명령을 실행하여 지갑 잔액을 확인합니다. btcctl — simnet -u USER -P PASS — wallet getbalance

이제 여러 주소를 생성하고 서로 코인을 보낼 수 있습니다. 다음 예를 참조하세요.

첫 번째 listaccounts 는 acc1과 acc2의 잔액이 0임을 보여주고, 한 블록이 채굴 된 후 두 번째 listaccounts 에 정확한 금액을 보여줍니다.

결론 : 이제 코인을 채굴하고 보낼 수있는 4 노드 simnet 클러스터가 있습니다.