오늘, 2019년 11월 24일, 비트코인 코어 0.19.0의 공식 출시를 기념합니다. 이는 사토시 나카모토가 거의 11년 전에 출시한 비트코인의 원래 소프트웨어 클라이언트의 19번째 주요 릴리스이며, 오늘날에도 여전히 네트워크에서 지배적인 비트코인 구현입니다. (비트코인 코어 0.19.0 릴리스 과정의 후반부에서 드러난 문제로 인해 다운로드 가능한 버전은 실제로 0.19.0.1입니다.) 비트코인 코어의 주요 유지 관리자인 블라디미르 반 더 라안이 감독한 이번 최신 주요 릴리스는 약 6개월 동안 100명 이상의 기여자에 의해 개발되었습니다.
550개의 병합된 풀 요청의 결과로, 비트코인 코어 0.19.0은 다양한 성능 개선, 현대화 및 버그 수정과 기타 변경 사항을 포함하고 있습니다.
이러한 변경 사항 중 일부에 대한 개요는 다음과 같습니다.
기본 GUI에서 Bech32 주소 사용
“bech32” 주소 형식(BIP 173)은 2018년 초에 출시된 비트코인 코어 0.16.0에서 이미 도입되었지만, 이제 비트코인 코어 지갑의 그래픽 사용자 인터페이스(GUI)에서 기본 옵션으로 설정되었습니다.
Bech32 주소는 “bc1”로 시작하는 주소입니다(1이나 3으로 시작하는 주소와는 반대). 이러한 주소는 약간 더 길지만, 현재 주소 형식보다 적은 다양한 문자를 사용합니다. 더 이상 소문자와 대문자 간의 구분이 없기 때문입니다. (이것은 주소를 소리 내어 읽을 때와 같은 인간의 실수 가능성을 줄입니다.) Bech32 주소는 또한 오타로 인한 실수를 제한하도록 설계되었습니다.
또한, bech32는 SegWit의 맥락에서 이점을 제공합니다. SegWit을 제공하는 일부 지갑 — 지금까지 기본적으로 비트코인 코어 지갑을 포함하여 — P2SH 출력(“3”으로 시작하는 주소)으로 “포장”하여 제공합니다. 이러한 주소에서 비트코인을 사용하려면 사용자가 비트코인이 실제로 SegWit 출력에 잠겨 있었음을 보여주기 위해 코드 조각인 “redeem script”를 공개해야 합니다. 새로운 bech32 주소를 사용하면 이 단계를 건너뛸 수 있으므로 SegWit 출력에서의 지출은 비트코인 네트워크를 통해 전송되고 블록체인에 포함되는 데이터가 조금 덜 필요합니다. 이는 bech32 출력에서의 거래가 P2SH 출력에서의 SegWit 거래보다 훨씬 저렴하게 만듭니다.
모든 비트코인 지갑이 아직 bech32 주소로 전송하는 것을 지원하지 않기 때문에, 비트코인 코어 0.19.0 사용자는 여전히 GUI에서 토글을 통해 PS2H 수신 주소를 선택적으로 생성할 수 있습니다.
기본적으로 두 개의 블록 전용 아웃바운드 연결 추가
비트코인 노드는 여러 다른 비트코인 노드에 연결되어 피어 투 피어 네트워크를 형성합니다. 이 네트워크를 통해 노드는 블록, 거래 및 일부 추가 거래 데이터를 공유합니다.
하지만 피어 투 피어 네트워크는 “분할 공격”과 같은 공격의 대상이 될 수 있습니다. 공격자가 충분히 많은 비트코인 노드를 제어하면 특정 비트코인 네트워크의 일부(또는 특정 노드)를 “차단”할 수 있습니다. 분할된 네트워크의 일부는 예를 들어, 최소 체인을 유효한 것으로 받아들이도록 속을 수 있으며, 이는 차례로 이중 지출 공격의 문을 열 수 있습니다.
분할 공격은 네트워크의 분할된 부분에 있는 노드가 메인 네트워크의 정직한 노드와 단 하나의 연결만 있더라도 반격할 수 있습니다. 그러면 모든 거래와 블록을 수신하고 중계하며, 다수 체인을 선호하여 최소 체인을 거부합니다.
이를 실현하고 분할 공격을 수행하기 어렵게 만드는 한 가지 방법은 노드 간의 연결을 더 많이 설정하는 것입니다. 그러나 더 많은 연결은 더 많은 메모리 및 대역폭 요구 사항을 수반합니다; 이는 거래입니다.
비트코인 코어 0.19.0은 아웃바운드 연결의 기본값을 두 개 늘리지만, 이 두 개의 추가 연결은 오직 블록을 중계하는 데만 사용됩니다 — 거래나 추가 거래 데이터를 중계하지 않습니다. 이는 추가 대역폭 요구 사항을 최소화하면서도 분할 공격을 성공적으로 수행하기 어렵게 만듭니다.
블룸 필터 사용 중단
비트코인 코어는 전체 노드 구현으로, 모든 비트코인 블록을 다운로드하고 검증합니다. 이는 최적의 보안을 제공하지만, 모바일폰과 같은 저자원 컴퓨팅 장치에는 잘 맞지 않습니다. 따라서 모바일 지갑(일부 데스크탑 지갑 포함)은 일반적으로 “라이트 클라이언트”입니다: 이들은 특정 거래와 (일부) 블록만 다운로드합니다.
이를 수행하는 한 가지 방법은 현재 몇몇 지갑에서 사용되는 블룸 필터입니다. 간단히 말해, 블룸 필터는 라이트 클라이언트가 네트워크의 무작위 전체 노드에서 관련 데이터를 요청하는 데 사용되는 암호학적 트릭입니다. 그러나 수년 동안 블룸 필터가 개인 정보 보호에 좋지 않다는 것이 분명해졌습니다: 이들은 본질적으로 모든 주소를 전체 노드에 공개합니다. 게다가 블룸 필터 요청을 지원하는 것은 전체 노드에 CPU 및 디스크 공간에서 비용을 수반하며, 전체 노드 자체에 직접적인 이점이 없습니다.
특히 이러한 이유로 비트코인 코어 0.19.0은 기본적으로 블룸 필터 요청을 더 이상 지원하지 않습니다. 사용자는 원할 경우 기본값을 블룸 필터를 지원하도록 전환할 수 있습니다.
비트코인 네트워크 전체가 앞으로 몇 년 동안 블룸 필터를 계속 지원할 것이라는 점도 주목할 가치가 있습니다. 아무도 기본값을 전환하지 않더라도, 구형 비트코인 코어 노드는 일반적으로 새로운 버전이 출시된 후에도 수년간 계속 사용됩니다.
컴팩트 클라이언트 측 블록 필터링에 대한 더 많은 지원
블룸 필터의 대안은 “컴팩트 클라이언트 측 블록 필터링”(BIP 158)이라는 새로운 솔루션입니다. 컴팩트 클라이언트 측 블록 필터링은 본질적으로 블룸 필터 트릭을 뒤집습니다. 라이트 지갑이 전체 노드에 보낼 필터를 생성하는 대신, 전체 노드는 각 블록에 대한 필터를 생성합니다. 라이트 클라이언트는 이러한 필터를 사용하여 블록에서 자신과 관련된 거래가 발생했는지 확인할 수 있습니다. 그렇다면 라이트 지갑은 전체 블록을 가져와 그 안에서 관련 거래 데이터를 선택합니다.
비트코인 코어 0.19.0은 컴팩트 클라이언트 측 블록 필터링을 지원하는 방향으로 계속 나아가고 있습니다. 비트코인 코어 노드는 이미 로컬에서 필터를 생성할 수 있었지만, 비트코인 코어 0.19.0 사용자는 이제 원격 프로시저 호출(RPC)을 통해 노드 위에서 실행되는 애플리케이션(예: 지갑)을 위해 필터를 사용할 수 있습니다.
그러나 필터는 아직 피어 투 피어 네트워크를 통해 제공되지 않습니다. 이는 비트코인 코어 0.19.0 노드가 다른 비트코인 사용자의 지갑에 필터를 자동으로 전송하지 않음을 의미합니다. 이 기능은 향후 비트코인 코어 릴리스에 추가될 수 있으며, 비트코인 코어 0.19.0 사용자는 자신의 비트코인 코어 노드 위에서 실행되는 사용자 정의 애플리케이션을 통해 이 기능을 제공할 수 있습니다.
GUI에서 결제 프로토콜 지원 비활성화
결제 프로토콜(BIP 70)은 비트코인의 결제 경험을 개선하기 위해 몇 년 전에 설계되었습니다. 비트코인 네트워크에 방송된 일반 결제 외에도, 사용자와 상인은 결제에 대한 추가 세부정보를 통신합니다. 예를 들어, 상인의 이름과 구매에 문제가 발생했을 경우 환불 주소와 같은 사람이 읽을 수 있는 목적지 주소입니다.
비트코인 코어는 GUI에서 결제 프로토콜을 통합했지만, 이 표준은 널리 채택되지 않았습니다. 대신 대부분의 지갑은 여전히 더 기본적인 URI 스킴(BIP 21)을 사용하여 결제를 수신합니다: 결제 주소와 금액을 전달하는 클릭 가능한 링크 또는 스캔 가능한 QR 코드 형식입니다. (오늘날 유일한 주목할 만한 예외는 URI 스킴을 지원하지 않고 BIP 70의 수정된 버전을 사용하는 결제 프로세서 BitPay입니다.)
채택 부족보다 더 중요하게, BIP 70 결제 프로토콜은 수년 동안 여러 보안 및 개인 정보 보호 취약점에 시달려 왔습니다. 따라서 일부 지갑은 프로토콜 구현을 적극적으로 거부했습니다. 비트코인 코어도 BIP 70을 더 이상 지원할 계획이었으며, 유지 관리가 그 노력을 가치 있게 여기지 않았기 때문입니다 — 하지만 BitPay의 채택이 이 과정을 지연시켰습니다.
비트코인 코어 0.19.0에서는 기본적으로 GUI에서 BIP 70이 제거되었습니다. 비트코인 코어 0.19.0 사용자는 여전히 이 기능을 사용하려면 특별한 구성으로 노드를 컴파일해야 합니다.
기타…
위에서 언급한 변경 사항 외에도 비트코인 코어 0.19.0은 더 많은 작은 개선 사항과 현대화를 포함하고 있습니다.
예를 들어, 이제 설정에서 즉시 가지치기된 노드를 시작할 수 있어, 디스크 공간이 부족한 사용자가 쉽게 새로운 비트코인 노드를 시작할 수 있습니다. 비트코인 코어 0.19.0은 또한 다중 서명 및 CoinJoin 거래에 유용한 부분 서명 비트코인 거래(PSBT) 프로토콜에 대한 새로운 기능을 포함하고 있습니다. 마찬가지로, 비트코인 애플리케이션 작업을 하는 프로그래머에게 특히 유용한 지갑 설명자 분야에서도 여러 개선 사항이 있습니다. 비트코인 코어 0.19.0 노드는 또한 향후 SegWit 버전을 사용하는 거래를 수락하고 중계하여 향후 업그레이드가 원활하게 진행될 수 있도록 합니다.
업그레이드에 대한 더 포괄적인 목록은 비트코인 코어 0.19.0.1 릴리스 노트를 참조하십시오.
이 기사에 대한 피드백을 제공한 Sjors Provoost에게 감사드립니다.