저자: bitcoindevphilosophy

이 장에서는 "신뢰 불가능성(trustlessness)"이라는 개념을 분석하고, 컴퓨터 과학적 관점에서 그 의미를 설명하며, 비트코인이 본질적인 가치를 유지하기 위해 왜 신뢰할 수 없는 방식으로 설계되어야 하는지를 명확히 합니다. 이어서 "신뢰 불가능한 방식으로 비트코인을 사용하는 것"의 의미와 "풀 노드"가 제공할 수 있는 보장과 제공할 수 없는 보장에 대해 논의합니다. 마지막 부분에서는 실제 소프트웨어 및 사용자와 비트코인의 실제 상호 작용을 살펴보고, 의미 있는 결과를 얻기 위해 편의성과 신뢰성 사이에서 어떤 절충이 필요한지 분석합니다.
사람들은 흔히 "비트코인은 신뢰할 필요가 없어서 좋다"라고 말합니다. 하지만 "신뢰할 필요가 없다"는 것은 정확히 무엇을 의미할까요? 피터 윌레(Pieter Wuille)는 스택 익스체인지(Stack Exchange) Q&A 포럼 에서 이 널리 사용되는 용어를 설명했습니다.
"트러스트리스(trustless)"에서 "트러스트"는 추상적인 기술 용어입니다. 분산 시스템이 어떤 신뢰 그룹과도 연관되지 않고 정상적으로 작동할 수 있을 때, 우리는 그것을 "트러스트리스"라고 부릅니다.
—— 피터 윌레, 비트코인 스택 거래소 (2016)
간단히 말해, 이 용어는 비트코인 프로토콜의 속성을 나타냅니다. 즉, "신뢰할 수 있는 주체" 없이도 논리적으로 작동할 수 있다는 것입니다. 이는 사용자가 사용하는 소프트웨어나 하드웨어에 필연적으로 부여하는 신뢰와는 다릅니다. 후자의 신뢰에 대해서는 이 장에서 더 자세히 논의할 것입니다.
중앙 집중식 시스템에서는 중앙 참여자의 평판에 의존하여 보안을 우선시할지, 문제가 발생할 경우 시스템 상태를 되돌릴지, 그리고 사법 시스템을 통해 신뢰 위반에 대해 처벌할지를 판단합니다. 이러한 신뢰 요건은 익명의 탈중앙화 시스템에서는 문제가 됩니다. 추적 가능성이 거의 없기 때문에 누구도 신뢰하기가 사실상 불가능하기 때문입니다. 사토시 나카모토 비트코인 백서 에서 이 문제를 다음과 같이 설명합니다.
온라인 상거래는 전자 결제 처리를 위해 신뢰할 수 있는 제3자인 금융기관에 거의 전적으로 의존하게 되었습니다. 이러한 시스템은 대부분의 거래를 충분히 잘 처리하지만, 신뢰 기반 모델로 인해 본질적인 약점을 가지고 있습니다. 첫째, 금융기관은 분쟁과 중재를 피할 수 없기 때문에 완전히 취소 불가능한 거래는 불가능합니다. 둘째, 중개 수수료는 거래 수수료를 증가시키고, 최소 거래 규모를 제한하며, 소액의 일회성 거래를 불가능하게 만듭니다. 취소 불가능한 서비스에 대해 취소 불가능한 결제를 생성할 수 없다는 점은 더욱 큰 비용 부담입니다. 취소 가능성 때문에 신뢰에 대한 요구는 더욱 커집니다. 판매자는 고객을 경계하고 평소에는 알 필요가 없는 정보까지 요구해야 합니다. 일정 비율의 사기는 불가피한 것으로 여겨집니다. 이러한 비용과 결제 불확실성은 개인이 현금을 사용할 경우 피할 수 있지만, 현재로서는 신뢰할 수 있는 제3자 없이 통신 채널을 통해 결제를 시작할 수 있는 메커니즘은 없습니다.
— 사토시 나카모토, *비트코인: P2P 전자 결제 시스템* (2008)
신뢰 기반의 탈중앙화 시스템은 불가능한 것 같으며, 이것이 바로 비트코인에서 무신뢰성이 매우 중요한 이유입니다.
신뢰할 수 없는 방식으로 비트코인을 사용하려면, 완전히 검증된 비트코인 노드(즉, "풀 노드")를 운영해야 합니다. 그래야만 다른 노드로부터 수신한 비트코인 블록(확인된 거래 데이터)이 비트코인 합의 규칙을 준수하는지, 예를 들어 비트코인 통화 발행 규칙을 준수하고 이중 지출을 하지 않는지 검증할 수 있습니다. 풀 노드를 운영하지 않으면 비트코인 블록 검증 작업을 다른 사람에게 맡기고 그들이 진실을 말해줄 것이라고 믿는 것이므로, 신뢰할 수 없는 방식으로 비트코인을 사용하는 것이 아닙니다.
데이비드 하딩은 비트코인 공식 웹사이트(bitcoin.org)에 풀 노드를 실행하는 방법, 또는 더 정확히 말하면 신뢰할 수 없는 방식으로 비트코인을 사용하는 방법을 설명하는 글을 썼는데 , 그 글이 분명 도움이 될 것입니다.
비트코인은 사람들이 다른 가치 있는 것들과 교환하기 위해 기꺼이 사용할 때에만 화폐로서의 역할을 할 수 있습니다. 즉, 비트코인을 받아들이는 사람들이 비트코인에 가치를 부여하고 비트코인이 어떻게 작동해야 할지를 결정한다는 뜻입니다.
비트코인을 결제 수단으로 허용하면, 개인 키가 노출되지 않고는 누구의 비트코인도 압수할 수 없도록 하는 등 비트코인 관련 규칙을 시행할 수 있는 권한을 갖게 됩니다.
안타깝게도 많은 사용자가 블록 검증 권한을 외부 기관에 위임하고 있습니다 . 이는 비트코인의 탈중앙화 약화시켜 소수의 채굴자들이 몇몇 은행 및 무료 서비스와 결탁하여 블록 검증 권한을 위임한 사용자들을 위해 비트코인 규칙을 변경할 수 있도록 허용합니다.
다른 지갑 소프트웨어와 달리 비트코인 코어 소프트웨어는 비트코인 합의 규칙을 시행합니다 . 따라서 채굴자와 은행이 검증되지 않은 사용자에 대한 규칙을 변경하면 해당 사용자는 완전히 검증된 비트코인 코어 사용자(예: 귀하)에게 결제할 수 없게 됩니다.
——데이비드 하딩, bitcoin.org의 전체 검증(2015)
그는 풀 노드를 운영하면 다른 누구도 신뢰할 필요 없이 비트코인 블록체인의 모든 측면을 검증할 수 있으므로, 받는 비트코인이 진짜인지 확신할 수 있다고 말했습니다. 이는 훌륭한 기능이지만, 풀 노드가 해결할 수 없는 중요한 문제가 하나 있습니다. 바로 체인 재작성을 통한 이중 지불을 막을 수 없다는 것입니다.
모든 프로세스(비트코인 코어 포함)는 체인 재구성의 영향을 받지만, 비트코인 프로토콜은 자체적인 방어 메커니즘을 제공합니다. 즉, 거래가 받는 블록 확인 횟수가 많을수록 더 안전해집니다. 이는 가장 잘 알려진 탈중앙화 방어 메커니즘입니다.
——데이비드 하딩, bitcoin.org의 전체 검증(2015)
(역자 주: "블록"이란 주기적으로 일련의 거래를 확인하고 P2P 네트워크 전체에 동기화하는 방법을 말합니다. 블록들이 연결되어 체인을 형성하며, 각 블록은 유효한 블록이 되기 위해 작업증명(경제적 비용 지불)을 요구하기 때문에 체인 앞쪽에 있는 블록일수록 되돌려질 가능성이 적고, 해당 블록으로 확인된 거래는 더 안전합니다. "블록체인 재구성"이란 새로운 블록이 이미 존재하는 위치(높이)를 차지하려고 시도하는 것을 말합니다. 이는 의도적일 수도 있고 비의도적일 수도 있지만, 그 가능성을 완전히 배제할 수는 없습니다.)
아무리 첨단 소프트웨어를 사용하더라도, 거래를 확정한 블록이 덮어쓰기되지 않을 것이라는 확신을 항상 가져야 합니다. 하지만 하딩이 지적했듯이, 블록체인 재구성으로 인해 거래에 영향을 미칠 확률이 허용 가능한 수준보다 낮아질 때까지 일정 횟수의 확정 블록(거래를 확정한 블록 이후에 생성되는 새로운 블록)이 생성될 때까지 기다릴 수 있습니다.
비트코인을 신뢰할 필요 없는 방식으로 사용하는 동기는 시스템의 " 완전 노드 탈중앙화 " 요구와 일맥상통합니다. 더 많은 사람들이 자체 완전 노드를 사용할수록 완전 노드 시스템은 더욱 완벽하게 탈중앙화 되고, 악의적인 프로토콜 변경에 대한 비트코인의 저항력도 강해집니다. 그러나 완전 노드 탈 탈중앙화 부분에서 설명했듯이, 신뢰할 필요 없는 방식과 편리성 사이에는 필연적으로 갈등이 발생하기 때문에 사용자들은 종종 신뢰를 요구하는 서비스를 선택하게 됩니다.
시스템적 관점에서 볼 때, 비트코인의 무신뢰성은 절대적으로 필수적입니다. 2018년 리가에서 열린 발틱 허니배저 컨퍼런스에서 맷 코랄로는 무신뢰성에 대해 설명했습니다 . 그의 발표의 핵심은 신뢰를 필요로 하는 시스템 위에 무신뢰 시스템을 구축할 수는 없지만, 그 반대는 가능하다는 것이었습니다. 예를 들어, 무신뢰 시스템 위에 수탁형 지갑을 개발할 수 있습니다.

그림 2. 신뢰할 수 없는 기본 계층은 상위 계층에서 절충안을 허용합니다.
이 보안 모델을 통해 시스템 설계자는 타인에게 그러한 절충안을 강요하지 않고도 자신에게 의미 있는 절충안을 마련할 수 있습니다.
2.1 맹목적으로 신뢰하지 말고 검증하라.
비트코인은 신뢰할 필요가 없는 방식으로 작동하지만, 사용하는 소프트웨어와 하드웨어를 어느 정도 신뢰해야 합니다. 이는 소프트웨어와 하드웨어가 포장에 적힌 것과 정확히 일치하지 않을 수 있기 때문입니다. 예를 들어:
- CPU가 악의적으로 설계될 수 있으며, 개인 키를 감지하는 암호화 작업으로 인해 개인 키가 유출될 수 있습니다.
- 운영체제의 난수 생성기는 주장하는 만큼 무작위적이지 않을 수 있습니다.
- 비트코인 코어 코드에는 악의적인 공격자에게 개인 키를 전송할 수 있는 백도어가 포함되어 있을 수 있습니다.
따라서 전체 노드를 실행하는 것 외에도 실행하려는 소프트웨어를 정확히 실행하고 있는지 확인해야 합니다. 레딧 사용자 "brianddk"는 사용 중인 소프트웨어를 검증할 때 선택할 수 있는 여러 신뢰 수준에 대해 논의했습니다 . "개발자 신뢰" 섹션에서 그는 " 재현 가능한 빌드 "에 대해 설명했습니다.
"재현 가능한 컴파일"은 여러 커뮤니티 개발자가 소프트웨어를 독립적으로 컴파일할 수 있도록 하는 소프트웨어 설계 방법론으로, 각 개발자가 컴파일한 최종 설치 파일이 다른 개발자가 컴파일한 파일과 동일하도록 보장합니다.
bitcoin과 같이 공개적이고 재현성이 높은 프로젝트에서는 사용자가 특정 개발자 한 명을 완전히 신뢰할 필요가 없습니다. 여러 개발자가 컴파일을 실행하고 원본 컴파일러가 디지털 서명한 파일과 동일한 파일을 얻는 것을 직접 확인할 수 있습니다.—— brianddk, Bitcoin v22.0 및 Guix(2022)
이 글에서는 신뢰의 수준을 다섯 가지로 정의합니다. 웹사이트에 대한 신뢰, 개발자에 대한 신뢰, 컴파일러에 대한 신뢰, 운영체제 커널에 대한 신뢰, 그리고 하드웨어에 대한 신뢰입니다.
재현 가능한 컴파일이라는 주제를 더 자세히 살펴보기 위해 칼 동(Carl Dong)은 Guix에 대한 강연을 진행하며 운영 체제, 코드베이스 및 컴파일러를 신뢰하는 것이 왜 문제가 될 수 있는지, 그리고 비트코인 코어 프로젝트에서 현재 사용하고 있는 "Guix"라는 시스템을 사용하여 이러한 문제를 어떻게 해결할 수 있는지 설명했습니다.
그러므로, 우리의 툴체인에 악의적으로 복제될 수 있는 수많은 신뢰할 수 있는 바이너리가 포함되어 있다는 사실을 고려할 때, 우리는 무엇을 할 수 있을까요? 단순히 재현성만으로는 부족합니다. 자립심이 필요합니다. 다른 조직이 관리하는 서버에서 이러한 바이너리를 다운로드하고 그 외부 서버를 신뢰해서는 안 됩니다. 우리는 이러한 도구가 어떻게 개발되었는지, 어떻게 재컴파일할 수 있는지 알아야 하며, 이상적으로는 훨씬 더 적은 수의 신뢰할 수 있는 바이너리로 시작해야 합니다. 신뢰할 수 있는 바이너리의 수를 최대한 줄이고, 이러한 툴체인에서 실제로 비트코인을 개발하는 데 사용하는 전체 프로세스를 감사 할 수 있는 간단한 경로를 마련해야 합니다. 이를 통해 검증을 극대화하고 신뢰를 최소화할 수 있습니다.
—— 칼 동, 브레이킹 비트코인 컨퍼런스(2019)에서 Guix에 대해 언급
칼은 Guix를 사용하면 검증 가능하고 명령어를 해석하는 방법을 알면 완전히 이해할 수 있는 357바이트 바이너리만 신뢰하면 된다고 설명했습니다. 이는 놀라운 점입니다. 357바이트 바이너리가 의도한 대로 작동하는지 검증하기만 하면 소스 코드에서 완전한 빌드 시스템을 컴파일할 수 있고, 궁극적으로 다른 사람이 컴파일한 것과 완전히 동일한 비트코인 코어 바이너리를 생성할 수 있습니다.
많은 비트코인 애호가들은 위 내용을 완벽하게 요약하는 하나의 원칙을 따릅니다.
맹목적으로 믿지 말고, 검증하라.
— 전 세계의 비트코인 사용자들
이 인용구는 로널드 레이건 전 미국 대통령이 핵 군축과 관련하여 한 " 신뢰하되 검증하라 "는 말에서 유래했습니다. 비트코인 사용자들은 이를 차용하여 신뢰 요소를 배제하고 풀 노드를 실행하는 것의 중요성을 강조합니다 .
사용자가 사용하는 소프트웨어와 수신하는 블록체인 데이터를 어느 정도까지 검증할지는 전적으로 사용자에게 달려 있습니다. 비트코인 세계의 많은 것들과 마찬가지로 편의성과 신뢰성 확보의 어려움 사이에는 상충 관계가 존재합니다. 관리형 지갑을 사용하는 것이 자체 하드웨어에서 비트코인 코어를 실행하는 것보다 거의 항상 더 편리합니다. 하지만 비트코인 소프트웨어가 성숙해지고 사용자 인터페이스가 개선됨에 따라, 신뢰성 확보를 중시하는 사용자들에게 더욱 나은 서비스를 제공할 것이 분명합니다. 또한, 사용자들이 더 많은 지식을 습득할수록 신뢰에 대한 의존도는 점차 낮아질 것입니다.
일부 사용자는 보다 진지한 접근 방식을 취합니다(자세한 내용은 이 책의 6장을 참조하십시오). 즉, 자신이 실행하는 대부분의 소프트웨어를 검증하는 것입니다. 그 결과, 신뢰 요소를 최소화할 수 있습니다. 자신의 컴퓨터 하드웨어와 운영 체제만 신뢰하면 되기 때문입니다. 이렇게 함으로써 하드웨어를 철저히 검증하지 않는 사용자에게도 도움을 줄 수 있습니다. 문제가 발견되면 공개적으로 알릴 수 있기 때문입니다. 2018년에는 채굴자들이 거래의 출력값을 반복적으로 사용할 수 있도록 하는 버그가 발견된 사례가 있습니다 .
CVE-2018-17144 취약점이 9월 18일에 출시된 비트코인 코어 버전 0.16.3 및 0.17.0rc4에서 패치되었습니다. 이 취약점에는 서비스 거부 공격 인터페이스와 심각한 인플레이션 취약점이 포함되어 있었습니다. 당초 9월 17일, 이 취약점은 여러 비트코인 코어 개발자와 ABC 및 Unlimited를 포함한 다른 암호화폐를 지원하는 프로젝트에 서비스 거부 공격으로 보고되었지만, 곧바로 동일한 원인과 수정 사항을 가진 인플레이션 취약점임이 확인되었습니다.
—— CVE-2018-17144(2018)의 전체 공개
이번 사건에서는 익명의 사용자가 문제를 신고했고, 그 문제는 처음 생각했던 것보다 훨씬 심각한 것으로 밝혀졌습니다. 이는 코드 검증자들이 일반적으로 보안 취약점을 악용하기보다는 신고한다는 사실을 보여줍니다. 이러한 신고는 모든 것을 직접 검증할 수 없는 사람들에게도 도움이 됩니다. 그러나 사용자들은 자신의 보안을 다른 사람에게 맡겨서는 안 되며, (자신이 할 수 있는 범위 내에서, 그리고 문제가 발생했을 때) 스스로 검증해야 합니다. 이것이 최대한의 독립성을 유지하는 방법이며, 비트코인이 번성할 수 있었던 원동력이기도 합니다. 소프트웨어를 감시하는 사람이 많을수록 악성 코드와 보안 취약점이 침투할 가능성이 줄어듭니다.
2.2 결론
비트코인 프로토콜은 사용자가 제3자를 신뢰할 필요가 없기 때문에 무신뢰(trustless) 프로토콜입니다. 그러나 실제로 대부분의 사용자는 비트코인 프로토콜을 구동하는 모든 하드웨어와 소프트웨어를 검증할 수는 없습니다. 숙련된 사용자는 소프트웨어 또는 하드웨어를 검증하고 악성 코드나 취약점을 발견했을 때 다른 (기술적으로 미숙한) 사용자에게 알릴 수 있습니다.
신뢰할 수 없는 시스템이 없다면 탈중앙화 불가능합니다. 왜냐하면 신뢰는 필연적으로 중앙 기관을 수반하기 때문입니다. 신뢰에 의존하는 시스템을 신뢰할 수 없는 시스템 위에 구축할 수는 있지만, 그 반대는 불가능합니다. 즉, 신뢰에 의존하는 시스템 위에 신뢰할 수 없는 시스템을 구축하는 것은 불가능합니다.


