Dandelion++ 해설: 줄기와 확산 트랜잭션 전파

· 읽는 데 7분

Dandelion++는 P2P 네트워크에서 새 트랜잭션을 전파하는 방식으로, 네트워크를 지켜보는 사람이 어느 컴퓨터가 트랜잭션을 보냈는지 쉽게 알아내지 못하게 합니다. 이 가이드에서는 Dandelion++가 해결하는 문제, 줄기와 확산 단계가 작동하는 방식, 2018년 논문이 원래 설계에 더한 것, Blocknet이 모든 결제에 이를 사용하는 방식을 설명합니다.

Dandelion++란 무엇입니까?

짧은 답변

Dandelion++는 어느 노드가 트랜잭션을 만들었는지 숨기는 트랜잭션 전파 프로토콜입니다. 새 트랜잭션은 먼저 줄기(stem)를 따라 한 노드에서 다음 노드 하나로 몇 홉에 걸쳐 전달됩니다. 그다음 확산(fluff) 단계로 넘어가 네트워크 전체로 퍼지며, 실제 보낸 사람과 멀리 떨어진 노드에서 시작된 것처럼 보입니다.

이름은 경로의 모양에서 왔습니다. 가느다란 줄기 끝에서 씨앗이 사방으로 흩날리는 민들레처럼 생겼습니다. Dandelion++는 2018년 Giulia Fanti, Shaileshh Bojja Venkatakrishnan, Surya Bakshi, Bradley Denby, Shruti Bhargava, Andrew Miller, Pramod Viswanath가 Proceedings of the ACM on Measurement and Analysis of Computing Systems에 발표했으며(arXiv 프리프린트), ACM SIGMETRICS 2018에서 소개되었습니다. 같은 그룹이 2017년에 제안한 Dandelion을 개선한 것입니다.

트랜잭션을 브로드캐스트하면 왜 출처가 드러납니까?

트랜잭션 메시지에는 IP 주소가 들어 있지 않습니다. 드러나는 것은 퍼지는 방식입니다. 일반적인 암호화폐 네트워크에서는 트랜잭션을 만든 노드가 모든 피어에게 보내고, 피어들이 다시 자신의 피어에게 보내면서 출처에서 동심원처럼 퍼져 나갑니다.

연구자들은 이 파동을 측정할 수 있다는 것을 보여 주었습니다. 2014년 Biryukov, Khovratovich, Pustogarov가, 그리고 이와 별도로 Koshy, Koshy, McDaniel이 접근 가능한 거의 모든 Bitcoin 노드에 연결하는 “슈퍼노드”를 운영하며 각 피어에서 트랜잭션이 도착한 시각을 기록했습니다. 트랜잭션을 가장 먼저 전달한 노드가 그 트랜잭션을 만든 노드인 경우가 많았습니다. Dandelion++ 논문은 이를 첫 번째 스파이 추정법(first-spy estimator)이라고 부릅니다. 트랜잭션을 처음 전달한 정직한 노드를 출처로 추정하는 방식입니다. 단순하면서도 플러딩 방식에는 잘 통합니다.

Bitcoin Core가 디퓨전(diffusion)이라는 방식으로 하듯 각 노드가 트랜잭션을 넘기기 전에 무작위 지연을 더하면 타이밍에 잡음이 늘어납니다. Dandelion 연구는 다른 길을 택해 경로의 모양 자체를 바꾸었습니다.

줄기와 확산 단계는 어떻게 작동합니까?

짧은 답변

줄기 단계에서는 각 노드가 트랜잭션을 정확히 피어 하나에게만 넘깁니다. 노드는 홉마다 가중치를 둔 동전을 던져, 대개는 줄기를 이어 가고 가끔은 확산으로 전환합니다. 확산 단계에서는 트랜잭션이 평소처럼 모든 피어에게 브로드캐스트되므로, 관찰자에게는 확산을 시작한 노드에서 퍼지는 것으로 보입니다.

단계별로 보면 다음과 같습니다.

  1. 내 노드가 줄기를 시작합니다. 새 트랜잭션을 피어 하나에게만 보냅니다.
  2. 각 릴레이가 결정합니다. 피어는 트랜잭션을 다른 피어 하나에게 넘기거나(줄기), 브로드캐스트합니다(확산).
  3. 확산으로 사방에 퍼집니다. 확산을 시작한 노드에서 트랜잭션이 평소 방식대로 네트워크 전체로 퍼져 채굴자에게 도달합니다.

이제 많은 노드를 지켜보는 스파이에게는 파동이 확산을 시작한 노드에서 출발하는 것으로 보이며, 그 노드는 나로부터 여러 홉 떨어져 있을 수 있습니다. 줄기 길이는 무작위이므로 스파이가 정해진 홉 수만큼 거슬러 올라가 셀 수도 없습니다. 논문은 예상 줄기 길이를 1/q로 제시하며, 여기서 q는 홉마다 확산으로 넘어갈 확률입니다. q = 0.1이면 줄기는 평균 약 10홉입니다.

Dandelion++는 Dandelion에서 무엇을 바꾸었습니까?

2017년 Dandelion 설계는 릴레이를 한 줄로 이어 줄기를 보냈고, 세 가지 가정 아래에서 강력한 결과를 증명했습니다. 모든 노드가 규칙을 따르고, 각 노드가 트랜잭션을 하나씩 보내며, 모든 노드가 Dandelion을 실행한다는 가정입니다. 2018년 논문은 이 가정을 깨는 스파이가 더 많은 정보를 얻을 수 있는 방법을 보인 뒤, 그런 스파이에 대해서도 보장이 유지되도록 설계를 바꾸었습니다. Dandelion++는 에포크 단위로 진행되며 각 노드는 “10분 정도마다” 새 에포크로 넘어가고, 에포크 안에서는 네 가지 메커니즘을 사용합니다.

메커니즘 역할
대략 4-정규인 릴레이 그래프 각 노드가 나가는 연결 중 최대 두 개를 릴레이로 골라, 한 줄 대신 서로 얽힌 경로의 그물을 만듭니다.
내 트랜잭션용 경로 하나 노드는 자신이 만든 모든 트랜잭션을 같은 나가는 경로로 보내므로, 트랜잭션을 여러 개 보내도 더 많이 드러나지 않습니다.
의사 난수 릴레이 에포크마다 노드는 줄기로 받는 모든 트랜잭션에 대해 릴레이 또는 디퓨저 중 하나가 되며, 들어오는 경로마다 나가는 경로 하나를 대응시킵니다.
안전장치 타이머 줄기 트랜잭션을 보내거나 전달한 노드는 무작위 시간 동안 확산되는지 기다리고, 확산되지 않으면 직접 브로드캐스트합니다.

q를 정하기 위한 논문의 시뮬레이션에서는 q를 0.2 이하로 유지하면 릴레이 그래프를 조작해 스파이가 얻을 수 있는 이득이 제한되었습니다. 저자들은 실제 Bitcoin 네트워크에서 구현을 실행했고, 전파 시간을 목표인 4.5초 안에 두기 위해 q = 0.1 또는 q = 0.2를 골랐습니다.

Dandelion은 Bitcoin용 BIP 156으로 제안되었습니다. Monero는 2020년 5월에 출시한 버전 0.16에서 Dandelion++를 추가했습니다.

Blocknet은 Dandelion++를 어떻게 사용합니까?

모든 Blocknet 노드는 Dandelion++로 트랜잭션을 전파하며, 켜야 할 것은 없습니다. BNT를 보내면 내 노드는 먼저 트랜잭션을 검사해 자신의 메모리 풀에 추가한 뒤 Dandelion++ 라우터에 넘깁니다. 데몬의 설정은 다음과 같습니다.

설정 값 의미
줄기 확률 0.9 각 릴레이가 90% 확률로 줄기를 이어 가고 10% 확률로 확산합니다(q = 0.1). 논문에서 테스트한 것과 같은 q입니다.
에포크 10분 줄기 경로가 10분마다 다시 섞입니다.
엠바고 타이머 45초 그때까지 내 트랜잭션이 확산 단계로 내 노드에 돌아오지 않으면 내 노드가 직접 브로드캐스트합니다.

Blocknet 결제가 전달되는 과정은 다음과 같습니다.

Dandelion++는 Blocknet의 다른 프라이버시와 어떻게 맞물립니까?

Dandelion++는 네트워크 계층에서 작동하며, 트랜잭션과 그것을 보낸 컴퓨터 사이의 연결을 보호합니다. Blocknet을 프라이버시 코인으로 만드는 온체인 프라이버시는 트랜잭션의 내용을 보호합니다. 입력마다 붙는 링 크기 16의 CLSAG 링이 보낸 사람을, 일회용 스텔스 주소가 받는 사람을, Bulletproofs 범위 증명을 갖춘 페더슨 커밋먼트가 금액을 숨깁니다. 이 보호 장치는 필수이므로, Dandelion++가 전달하기 전부터 모든 트랜잭션이 똑같아 보입니다.

두 계층은 서로를 보완합니다. 링 서명은 어느 출력이 결제했는지 숨기고, Dandelion++는 어느 노드가 결제를 브로드캐스트했는지 숨깁니다. Blocknet이 결제를 프라이빗하게 지키는 방법에서 온체인 계층을 하나씩 살펴보며, Blocknet이란 무엇입니까?에서 Blocknet ID로 이름으로 결제하는 기능을 포함한 개요를 볼 수 있습니다.

보낼 BNT를 직접 얻으려면 집에서 채굴할 수 있습니다. Blocknet 채굴 가이드를 따라 seine를 다운로드하고 bntpool.com에 연결하면, 지급이 지갑 주소나 @name으로 들어옵니다.

자주 묻는 질문

Dandelion++는 내 IP 주소를 숨겨 줍니까?

네트워크 곳곳에 퍼져 있는 관찰자로부터 어느 노드가 트랜잭션을 시작했는지 숨깁니다. 트랜잭션은 나로부터 몇 홉 떨어진 곳에서 확산 단계에 들어간 뒤에야 넓게 퍼집니다. 첫 번째 줄기 피어는 트랜잭션이 내 노드에서 왔다는 것을 보지만, 줄기 메시지는 노드가 트랜잭션을 만들었든 전달만 하든 똑같아 보이므로 어느 쪽인지 알 수 없습니다.

Dandelion과 Dandelion++는 무엇이 다릅니까?

Dandelion(2017)은 릴레이를 한 줄로 잇는 방식으로 줄기와 확산 단계를 도입했습니다. Dandelion++(2018)는 두 단계를 유지하면서 규칙을 어기는 스파이에 대비해 이를 강화합니다. 각 노드가 릴레이 두 개를 고르는 그래프를 쓰고, 자신의 트랜잭션은 고정된 경로 하나로 보내며, 에포크마다 새 릴레이를 고르고, 안전장치 타이머를 더합니다.

Dandelion++를 사용하는 암호화폐는 무엇입니까?

Monero는 2020년 5월에 출시한 버전 0.16에서 Dandelion++를 추가했고, Blocknet은 모든 트랜잭션을 Dandelion++로 전파합니다. Dandelion은 같은 연구 그룹이 Bitcoin용 BIP 156으로 처음 제안했습니다. 노드끼리 새 트랜잭션을 전달하는 방식만 바꾸므로, P2P 네트워크 위에 만든 코인이라면 어떤 코인이든 도입할 수 있습니다.

Blocknet은 어떤 Dandelion++ 설정을 사용합니까?

Blocknet 노드는 홉마다 0.9 확률로 줄기를 이어 가므로, 트랜잭션은 릴레이마다 10% 확률로 확산 단계에 들어갑니다. 줄기 경로는 10분마다 바뀝니다. 내 트랜잭션이 45초 안에 확산 단계로 내 노드에 돌아오지 않으면 내 노드가 직접 브로드캐스트하므로, 트랜잭션은 항상 네트워크에 도달합니다.