MSTR Cat

블록체인/레벨 III · 네트워크/3.1 노드/수업 6

비트코인 코어와 기타 구현체

하나의 프로토콜, 여러 엔진: 비트코인 소프트웨어의 계보

준비물실행 중인 비트코인 코어 노드터미널 또는 명령줄 인터페이스 접근

호기심

  1. 두 코드가 서로 다른 판단을 내릴 때, 무엇이 블록인지는 누가 결정하나요?
  2. 왜 사소한 데이터베이스 오류가 전체 체인을 둘로 나누는 힘을 가질 수 있을까요?
  3. 가장 인기 있는 구현체의 유지보수가 중단되면 네트워크에는 어떤 일이 일어나나요?

탐구

  1. 비트코인은 사토시 나카모토가 작성한 단일 C++ 클라이언트로 시작되었습니다. 2011년에는 Qt 라이브러리로 인터페이스가 다시 작성되면서 이 소프트웨어는 Bitcoin-Qt라는 이름으로 알려졌습니다. 2014년 버전 0.9에서는 접미사를 완전히 떼고 비트코인 코어(Bitcoin Core)가 되었습니다. 이름의 변화는 정체성의 변화를 반영했습니다. 이것은 더 이상 사토시의 도구에 그치지 않고, 네트워크 규칙의 정식 참조 구현체가 된 것입니다.
  2. 코드베이스의 리더십은 2010년부터 2014년 물러날 때까지 이를 이끈 개빈 안드레센에게서 블라디미르 반 데어 란에게로 넘어갔습니다. 현재는 소수의 메인테이너가 엄격한 피어 리뷰를 거친 뒤 변경 사항을 병합합니다. 2021년에는 버전 체계가 0.21에서 22.0으로 건너뛰며 성숙 단계에 들어섰음을 알렸습니다. 주요 릴리스는 대략 1년에 두 번 이루어지며, 각 릴리스는 배포 전에 광범위한 테스트를 거칩니다.
  3. 합의는 논리만의 문제가 아니라, 수만 개의 노드에서 바이트 단위까지 동일하게 동작하는 것의 문제입니다. 2013년 3월, 버전 0.8은 저장 엔진으로 LevelDB를 도입했습니다. 새 소프트웨어가 받아들인 블록을 Berkeley DB로 동작하는 이전 버전들이 잠금 한도 버그 때문에 거부했습니다. 채굴자들이 다운그레이드할 때까지 체인은 분할되었으며, 이는 합의 코드 자체에 있는 것도 아닌 숨겨진 동작 차이가 네트워크를 분할할 수 있음을 보여주었습니다.
  4. 어느 하나의 코드베이스가 단일 장애 지점이 되거나 장악되는 것을 막기 위해 대안 구현체들이 존재합니다. btcd는 Go로, bcoin은 JavaScript로, libbitcoin은 C++로 작성되었습니다. Luke Dashjr가 관리하는 Bitcoin Knots는 비트코인 코어 위에 얹은 패치 세트로, 기본 설정이 다르며 특히 데이터를 담은 트랜잭션을 더 엄격하게 필터링합니다. Floresta는 효율적인 검증을 위해 Utreexo 데이터 구조를 활용합니다. 이러한 프로젝트들은 비트코인 코어 개발 과정을 견제하는 역할을 합니다.
  5. 유효하지 않은 블록을 받아들이는 버그는 금전적 손실이나 체인 분할로 이어질 수 있기 때문에, 합의 규칙을 재구현하는 일은 위험이 큽니다. 이를 줄이기 위해 libbitcoinkernel은 핵심 합의 로직을 재사용 가능한 라이브러리로 분리하는 것을 목표로 합니다. 이를 통해 다른 소프트웨어가 노드 코드베이스 전체를 복제하지 않고도 트랜잭션을 검증할 수 있으며, 주변 인프라가 바뀌더라도 규칙의 일관성이 유지됩니다.
  6. 노드에서 'bitcoin-cli getnetworkinfo'를 실행하면 해당 노드의 버전을, 'getpeerinfo'를 실행하면 각 피어가 보고하는 소프트웨어('subver' 문자열)를 확인할 수 있습니다. 네트워크는 서로 다른 소프트웨어 스택을 사용하면서도 상호 운용성을 유지하지만, 비트코인 코어의 지배적 위치 때문에 사실상 비트코인 코어가 프로토콜 업그레이드의 속도를 정합니다. 업그레이드하지 않은 노드도 소프트 포크 이후 체인을 계속 따라가지만, 합의 동작이 어긋나는 노드는 분리될 수 있습니다.

핵심 사실

  • Bitcoin-Qt는 2014년 버전 0.9와 함께 비트코인 코어(Bitcoin Core)로 이름이 바뀌었습니다.
  • 블라디미르 반 데어 란은 2014년에 개빈 안드레센의 뒤를 이어 수석 메인테이너가 되었습니다.
  • 2013년 3월의 체인 분할은 이전 버전에 있던 Berkeley DB 잠금 제한 버그로 인해 발생했습니다.
  • btcd, bcoin, libbitcoin은 각각 Go, JavaScript, C++로 작성된 대체 구현체입니다.
  • Bitcoin Knots는 Luke Dashjr가 관리하는, 더 엄격한 릴레이 정책을 갖춘 비트코인 코어의 파생 버전입니다.
  • 아직 개발 중인 libbitcoinkernel은 다른 소프트웨어가 재사용할 수 있도록 합의 코드를 분리하는 것을 목표로 합니다.

연습 아홉, 여섯, 셋, 하나

9모으기비트코인 노드 구현체나 코어 클라이언트의 주요 포크 중 9가지를 나열하십시오. 각각의 주요 프로그래밍 언어와 현재의 유지보수 상태도 기재해 주십시오.
6묶기참조 구현과의 관계에 따라 이 9개를 직접 포크, 독립적인 재작성, 합의 라이브러리, 아카이브된 프로젝트, 활발히 사용되는 대안, 실험적인 것 등 6개 카테고리로 분류하십시오.
3추리기6개 그룹을 여러 구현체의 존재가 비트코인을 더 안전하게 만드는지, 더 위험하게 만드는지에 관한 3가지 논거로 압축하십시오.
1결정화한 구현체의 데이터베이스 버그가 합의 동작의 차이를 낳을 경우 어떻게 전 세계적인 체인 분할을 강제할 수 있는지 한 문장으로 설명하십시오.

팩트 체크

날짜, 수치 및 주장은 아래에 명시된 출처들을 통해 확인되었습니다.

인터랙티브 아카데미에서 열기 →

EN PT ES ZH JA RU DE FR MS