비트코인은 한 사람과 다른 사람 간의 가치 전송 측면에서 디지털 시대의 가장 중요한 혁신 중 하나입니다. 중개인이 필요하지 않습니다. 이는 분산된 채굴자 집단에 의해 안전하게 보호되며, 개별 결제의 유효성을 보장하기 위해 네트워크의 모든 참여자가 선택적으로 검증합니다. 시스템의 구조는 지구상의 누구나 어디서든 다른 사람으로부터 돈을 받을 수 있도록 설계되었습니다. 크라우드펀딩, 자선, 원하는 모든 것에 대한 자금 조달이 즉시 가능해지며, 누구의 허가도 필요하지 않고, 어떤 게이트키퍼와도 거래할 필요가 없으며, 복잡한 절차도 없습니다. 이론적으로는 훌륭한 아이디어지만, 현실에서는 한 가지 큰 단점이 있습니다: 프라이버시입니다.
푸시 기반 결제 시스템으로서(누구도 당신에게서 “끌어” 결제를 할 수 없으며, 당신이 명시적으로 승인하고 다른 사람에게 “푸시”해야 합니다), 비트코인은 송신자가 보낼 돈의 목적지를 정의하는 데 필요한 정보를 갖고 있어야 합니다. 이는 수신자가 송신자에게 자신의 비트코인 주소를 어떤 식으로든 전달해야 함을 의미합니다. 일반 대중으로부터 자금을 모으려고 할 경우, 이는 프라이버시 측면에서 큰 결과를 초래하거나 온라인에서 지속적으로 상호작용해야 할 필요가 있습니다. 누구나 온라인 어딘가에 단일 비트코인 주소를 게시할 수 있으며, 그 시점부터 그 사람에게 돈을 보내고자 하는 누구나 그렇게 할 수 있지만, 이런 방식으로 자금을 모으는 데는 프라이버시가 없습니다. 그 주소를 가져가서 블록체인에서 조회하면, 그 사람이 얼마나 많은 돈을 받았는지 볼 수 있을 뿐만 아니라, 그들에게 돈을 보낸 모든 사람의 블록체인 상의 흔적도 볼 수 있습니다. 자금을 모으려는 사람과 그들에게 기부한 모든 사람은 전혀 프라이버시가 없습니다; 모든 것이 완전히 공개되어 전 세계가 볼 수 있습니다.
단일 정적 주소를 공개적으로 게시하는 주소 재사용의 유일한 대안은 사람들이 새로 기부하고자 할 때마다 사용되지 않은 새 주소를 요청할 수 있도록 항상 온라인 상태를 유지하는 서버를 운영해야 합니다. 디지털 시대에 항상 온라인 상태를 유지하는 것이 문제처럼 보이지 않을 수 있지만, 이는 비용과 복잡성을 수반하며, 특히 누군가가 자신의 하드웨어에서 직접 운영하려고 할 경우 더욱 그렇습니다. 모바일 장치만 있는 사람들은 어떻게 될까요? 현재 운영 체제 기능으로 인해, 하루 종일 백그라운드에서 무언가를 실행하기 위해 배터리 사용을 최적화하는 것은 거의 불가능하며, 설령 가능하더라도 배터리를 소모하게 됩니다.
BIP47
저스투스 란비에르의 BIP47이 등장합니다. 이 제안의 목적은 누군가가 자금을 받을 수 있도록 충분한 정보를 공개적으로 게시할 수 있는 방법을 제공하는 것입니다. 이 공개 정보는 (1) 게시한 사람이 얼마나 많은 돈을 받았는지 추적할 수 없고 (2) 자금을 요청하는 사람에게 자금을 보낸 사람에 대한 정보를 공개하지 않도록 합니다. 핵심 아이디어는 공개적으로 게시된 정보(또는 결제 코드)를 사용하여 수신자가 개인 키를 구성할 수 있는 새로운 주소 세트를 생성하는 것입니다. 이 새로운 주소 세트는 단일 송신자와 수신자 간의 관계에 특정하며, 새로운 송신자가 이 프로토콜을 사용하여 수신자에게 돈을 보낼 때마다 두 사람에게 고유한 새로운 주소 세트를 생성합니다.
높은 수준에서 일반적인 흐름은 다음과 같습니다: 돈을 받고자 하는 사람은 HD 지갑에서 새로운 파생 경로로 새로운 확장 공개 키를 생성하고 이를 공개적으로 게시합니다. 이 새로운 공개 키는 그들의 “결제 코드”로 기능합니다. 여기서 돈을 보내고자 하는 사람은 이 새로운 결제 코드를 사용하여 돈을 보낼 새로운 주소를 생성하는 데 필요한 모든 정보를 갖게 됩니다. 문제는 송신자가 수신자에게 자신의 결제 코드 정보를 전달해야 한다는 것입니다. 그렇지 않으면 그들은 실제로 그들에게 보내진 자금을 사용하기 위해 필요한 개인 키를 생성할 수 없습니다. 이를 위해 특별한 “알림 거래”가 필요합니다.
앨리스가 결제 코드를 사용하여 밥과 거래하고 싶다고 가정해 보겠습니다. 앨리스는 밥의 알림 주소로 보낼 UTXO를 선택하고, 여기서 그녀는 이 UTXO와 밥의 알림 주소에 연결된 공개 키와 관련된 개인 키를 가져옵니다. 그녀는 이를 곱하여 비밀 블라인딩 키를 생성합니다. 이를 통해 그녀는 자신의 결제 코드를 암호화하고 OP_RETURN 출력에 인코딩할 수 있습니다. 이는 밥이 자신의 알림 주소에 대한 개인 키와 앨리스의 사용된 입력의 공개 키를 가져가면 이 정보를 해독하고 읽을 수 있는 유일한 사람이 됩니다. 이는 앨리스의 개인 키와 밥의 공개 키를 곱하면 밥의 개인 키와 앨리스의 공개 키를 곱한 것과 동일한 값을 생성하기 때문에 가능합니다.
이제 앨리스와 밥은 오직 두 사람만 알고 있는 새로운 주소 세트를 유도할 수 있으며, 앨리스는 매번 새로운 주소를 사용하여 밥에게 어떤 양의 거래를 보낼 수 있습니다. 외부 관찰자는 그들 간의 연결을 알지 못합니다. 두 번째 변형에서는 앨리스가 밥의 알림 거래에 출력을 보내는 대신, 자신의 변경 출력을 생성하여 1-of-2 멀티시그를 사용합니다. 여기서 하나의 키는 그녀의 변경 주소이고, 두 번째는 밥의 결제 코드 식별자입니다. 세 번째 변형은 OP_RETURN 대신 필요한 정보를 인코딩하기 위해 1-of-3 멀티시그 출력을 사용합니다. 그 외에는 모든 것이 동일하게 작동합니다.
BIP47의 한 가지 단점은 수신자가 자금을 받을 것이라는 알림을 하기 위해 특별한 거래를 보내기 위해 블록 공간을 사용해야 한다는 것입니다. 이는 누군가가 단일 결제를 보내려고 할 때 매우 비효율적입니다. 또한 알림 거래에 사용된 UTXO가 누군가의 BIP47 주소로 결제를 위해 사용된 UTXO와 연결될 경우 프라이버시를 적극적으로 손상시킬 위험이 있습니다. 이러한 두 가지 사이의 격리를 보장하기 위해 주의가 필요합니다. 그렇지 않으면 서로 다른 결제로 인해 발생한 UTXO의 소유권을 추적할 수 있는 상관관계를 생성할 수 있습니다.
침묵 결제
침묵 결제는 루벤 솜센의 최신 아이디어입니다. 이는 알림 거래가 필요 없이 BIP47과 동일한 문제를 효과적으로 해결합니다. 아이디어는 본질적으로 거의 동일합니다: 공개 정보를 게시하고, 그로부터 송신자가 수신자만 재구성할 수 있는 새로운 주소를 구성할 수 있습니다. 차이점은 구현 세부사항에 있습니다.
수신자는 접근 가능한 위치에 “침묵” 공개 키를 게시하고, 송신자는 이를 가져와 결제를 위해 사용할 입력의 개인 키를 사용하여 이 공개 키를 조정합니다. 이는 송신자의 개인 키를 수신자의 침묵 공개 키와 곱한 다음, 그 침묵 공개 키를 다시 더하는 방식으로 수행됩니다. 이로 인해 수신자가 자신의 개인 키를 송신자 입력의 공개 키와 곱하고, 자신의 침묵 공개 키를 추가하여 복구할 수 있는 새로운 주소가 생성됩니다. 매우 간단합니다.
여기서 큰 단점은 라이트 클라이언트에 대한 지원이 매우 어렵다는 것입니다. 수신자는 각 블록의 모든 거래를 스캔하고 입력을 조정하여 해당 키와 일치하는 출력이 있는지 확인해야 합니다. 전체 노드 사용자의 경우, 이는 검증 비용의 감당할 수 없는 증가가 아니지만, 자신의 전체 노드가 없는 라이트 지갑의 경우 매우 비쌉니다. 이는 UTXO 세트를 단순히 스캔하여 더욱 최적화할 수 있습니다. 블록스트림의 요나스 닉은 인텔 i7에서 벤치마크 테스트를 수행했으며, 전체 세트를 스캔하고 주소를 확인하기 위한 계산을 실행하는 데 약 3시간 반이 걸렸습니다. 여기에는 각 UTXO를 생성한 거래를 조회하여 해당 계산을 실행하는 데 필요한 입력 공개 키를 찾는 데 걸리는 시간은 포함되지 않았습니다. 이는 아직 벤치마크나 테스트가 이루어지지 않았으므로, 비용과 시간은 여전히 불확실한 질문으로 남아 있습니다.
추가 최적화로는 송신 거래의 모든 입력의 공개 키를 조정의 일부로 사용하는 것이 있습니다. 이는 각 거래의 개별 입력을 스캔하고 계산을 개별적으로 실행할 필요 없이 자금을 받았는지 확인하는 비용을 줄일 수 있습니다. 그러나 이는 CoinJoin 거래로 수행할 경우 복잡성을 증가시킬 수 있으며, 모든 다른 참가자가 키 조정에 적극적으로 참여해야 합니다. 또한, 이는 순진한 구현에서 지불하는 출력에 대한 정보를 그들에게 유출할 수 있습니다. 그러나 이는 수신자가 자신에게 지불하는 데 사용된 입력이 무엇인지 알지 못하게 하며, CoinJoin의 다른 참가자와 공유된 정보를 암호적으로 블라인딩함으로써 침묵 결제가 무엇인지 알지 못하게 하여 모든 프라이버시 문제를 완화할 수 있습니다.
또한, 스캔 및 지출 키를 파생 과정에 추가하여 수신자가 수신 결제를 감지하는 데 필요한 모든 것이 포함된 키를 온라인으로 가질 수 있도록 하고, 수신한 동전을 지출하는 데 필요한 키는 오프라인 및 콜드 스토리지에 보관할 수 있습니다. 이는 송신자의 입력 개인 키를 스캔 키와 곱한 다음, 지출에 필요한 키를 추가하는 방식으로 파생을 변경합니다. 이는 결제를 수신하는 데 더 많은 보안을 제공하며, 수신자의 장치가 손상된 경우에만 프라이버시가 위험에 처하게 됩니다.
마지막으로 고려해야 할 중요한 사항은 송신자 측의 주소 재사용 가능성입니다. 기본 구현에서 송신자가 동일한 공개 키를 가진 여러 UTXO를 보유하고 있다면, 침묵 결제로 동일한 사람에게 보내는 경우 동일한 침묵 주소가 생성되어 주소 재사용이 발생합니다. 이는 스킴에 사용된 거래 입력의 TXID와 입력 인덱스를 포함하여 방지할 수 있으며, 이는 라이트 클라이언트에 추가적인 계산 부담을 주지 않도록 미리 계산될 수 있습니다.
전반적으로 이 아이디어는 모든 면에서 BIP47에 대한 상당한 개선을 이루며, 수신자가 자금을 스캔하는 데 드는 높은 검증 비용을 제외하고는 그렇습니다. 이는 결정론적 복구 속성을 유지하고, 수신자에게 전송된 서로 다른 결제 간의 연결성을 달성하며, 결제가 이루어지기 전에 알림 거래가 필요하지 않도록 합니다. 다시 한 번, 솜센은 비트코인의 유용성을 개선하기 위해 구현될 수 있는 매우 견고한 프로토콜 아이디어를 제시했습니다.
이 글은 신오비의 게스트 포스트입니다. 표현된 의견은 전적으로 그들의 것이며 BTC Inc 또는 비트코인 매거진의 의견을 반드시 반영하지는 않습니다.