용어집 / 프로토콜과 업그레이드
컴팩트 블록 릴레이
별칭은 BIP152입니다.
- 컴팩트 블록 릴레이란 무엇입니까?
- 컴팩트 블록 릴레이는 네트워크로 전송되는 새 블록을 6바이트 식별자 목록으로 대체하며, 수신 노드는 이 식별자를 이미 보유한 트랜잭션과 대조해 블록을 로컬에서 재구성합니다.
BIP-152에 명시되어 있습니다.
멤풀을 함께 관찰하는 두 피어는 다음 블록에 들어갈 거의 모든 트랜잭션을 이미 공유하고 있으므로, 이를 다시 보내는 것은 낭비입니다. Matt Corallo가 이 해결책을 BIP152로 규정했고, Bitcoin Core가 0.13.0 버전에서 이를 활성화했으며, 이 버전은 2016년 8월 23일에 출시되었습니다. 집에서 노드를 운영하는 사람에게 이는 감당할 수 있는 대역폭 비용과 감당할 수 없는 비용의 차이입니다.
작동 방식
컴팩트 블록 릴레이는 프로토콜에 네 가지 메시지를 추가하며, 흥미로운 것은 블록을 포함하지 않고서 블록을 설명하는 cmpctblock입니다.
cmpctblock은 80바이트 헤더, 발신자가 고른 8바이트 논스, 그리고 블록의 각 트랜잭션에 대한 6바이트 단축 식별자를 하나씩 담습니다. 이 식별자는 SipHash-2-4에서 나오며, 헤더를 해당 논스와 연결한 값의 SHA-256으로 키를 정합니다. 논스가 이 방식을 안전하게 만듭니다. 식별자는 블록마다, 발신자마다 달라지므로, 누구도 식별자가 충돌하는 두 트랜잭션을 미리 준비해 네트워크 전체의 재구성을 한꺼번에 막을 수 없습니다.
일부 트랜잭션은 식별자 대신 전체로 전송됩니다. 코인베이스는 어떤 피어도 미리 볼 수 없으므로 항상 전체로 전송되며, 발신자는 수신자가 보유하지 않았으리라 짐작하는 다른 트랜잭션도 미리 채워 넣을 수 있습니다.
재구성은 수신 측에서 이루어집니다. 노드는 자신의 멤풀에 있는 모든 트랜잭션을 같은 키로 해시하고, 각 단축 식별자를 조회해 블록을 채웁니다. 또한 최근에 축출되거나 대체된 트랜잭션을 담은 작은 추가 풀을 유지해, 조금 전에 멤풀에서 빠진 트랜잭션도 잡아냅니다. 그래도 여전히 빠진 것은 getblocktxn으로 위치를 지정해 요청하며, 발신자는 blocktxn 메시지로 그 트랜잭션만 돌려줍니다.
두 가지 경우에는 전체 블록을 가져오는 방식으로 되돌아갑니다. 왕복 한 번의 가치가 없을 만큼 빠진 트랜잭션이 많거나, 서로 다른 두 트랜잭션이 같은 6바이트 식별자를 만들어 내는 경우입니다. 6바이트는 281조개의 값을 허용하므로 우연한 충돌은 극히 드물며, 의도적인 충돌은 논스가 배제합니다.
블록 공지는 두 가지 방식이 있습니다. 저대역폭 모드에서는 피어가 새 블록을 공지하고 요청을 기다립니다. 노드가 최대 3개의 피어에 대해 활성화하는 고대역폭 모드에서는 블록이 도착하는 즉시 cmpctblock을 밀어 보내, 전파 속도가 가장 중요한 경로에서 왕복 한 번을 절약합니다.
확인할 수 있는 곳
컴팩트 블록 릴레이는 자신의 노드 로그에서 블록마다 한 줄씩 보이며, 이를 읽는 것이 노드가 정상인지 판단하는 가장 빠른 방법입니다.
Bitcoin Core는 미리 채워진 트랜잭션이 몇 개였는지, 멤풀에서 온 것이 몇 개였는지, 추가 풀에서 온 것이 몇 개였는지, 요청해야 한 것이 몇 개였는지를 명시한 재구성 요약을 출력합니다. 몇 시간째 실행 중인 기기에서는 요청한 개수가 보통 영이거나 영에 가깝습니다. 10분 전에 시작한 기기에서는 멤풀이 거의 비어 있어 대부분을 가져와야 하며, 처음 몇 블록은 느리게 도착합니다.
이로부터 웹사이트를 신뢰하는 대신 자신의 잔액을 확인하려고 노드를 운영하는 사람을 위한 실용적인 규칙이 나옵니다. 노드를 계속 실행해 두십시오. 필요하기 직전에 재시작한 노드는 전체 블록을 내려받는 노드이며, 멤풀이 다시 채워질 때까지 최신 블록에 대한 그 노드의 시각은 공개 탐색기보다 뒤처집니다.