용어집 / 프로토콜과 업그레이드
버전 비트
- 버전 비트란 무엇입니까?
- 버전 비트는 블록 헤더의 32비트 버전 필드를 서로 독립적인 스위치의 행으로 취급하므로, 채굴업자는 여러 소프트 포크에 대한 지지를 동시에 알릴 수 있습니다.
BIP-9에 명시되어 있습니다.
버전 비트 1개는 대기 중인 소프트 포크 1개를 나타내며, 정해진 블록 구간에 걸쳐 집계됩니다. BIP-9는 0번부터 28번까지의 비트를 제공하며, 2,016블록 주기 안에서 1,916개 블록이 해당 비트를 설정하면 배포가 확정되고, 1년으로 제안된 타임아웃에 도달하면 실패합니다. 이러한 신호를 읽으면 지갑이 원하는 기능이 네트워크 규칙이 되는지를 몇 달 앞서 알 수 있습니다.
작동 방식
버전 비트는 모든 노드가 자신이 아는 각 배포에 대해 난이도 조정 주기마다 한 번씩 스스로 계산하는 5가지 상태의 상태 기계로 작동합니다.
상태는 DEFINED, STARTED, LOCKED_IN, ACTIVE, FAILED입니다. 2,016블록 난이도 조정 주기 안의 모든 블록은 하나의 상태를 공유하므로, 상태 전환은 2,016의 배수인 높이에서만 일어날 수 있습니다. 이전 블록의 중앙값 시간(median time past)이 설정된 시작 시간을 지나면 배포는 DEFINED에서 STARTED로 넘어가며, 중앙값 시간은 블록과 그 이전 10개 블록의 타임스탬프 중앙값입니다.
STARTED가 되면 노드는 정확히 2,016개의 조상 블록을 거슬러 올라가며, 상위 3개 버전 비트가 001이고 배포 비트가 설정된 블록을 셉니다. 그 밖의 것은 0으로 계산되므로, 다른 버전 체계를 사용하는 채굴업자는 실수로 신호를 보낼 수 없습니다. 메인넷은 그중 1,916개가 필요하고 테스트넷은 1,512개가 필요합니다. 중앙값 시간이 타임아웃을 지날 때까지 기준을 충족하지 못하면 배포는 영구적으로 FAILED가 됩니다. BIP-9는 그 타임아웃을 시작 시간으로부터 31,536,000초, 즉 1년 뒤에 두도록 제안하여, 멈춘 제안이 대기열을 영원히 막는 대신 자신의 비트를 반납하게 합니다.
사람들이 흔히 놓치는 세부 사항이 하나 있습니다. 블록의 상태는 자신의 버전 필드가 아니라 조상 블록의 버전 필드에만 의존하므로, 채굴업자는 규칙에 투표하면서 그 투표가 투표를 행사하는 블록 자체를 구속하게 할 수 없습니다. 상위 3개 비트를 001로 고정하면 신호를 보내는 블록의 버전도 0x20000000부터 0x3FFFFFFF까지의 범위 안으로 고정되어, 010과 011 패턴은 결국 버전 비트를 대체할 어떤 메커니즘을 위해 비어 있게 됩니다.
비트는 소모되지 않고 재활용됩니다. 배포가 활성화되거나 타임아웃되면 그 비트는 이후 제안을 실을 수 있으며, BIP-9가 버그가 있는 소프트웨어를 먼저 걸러내기 위해 권장하는 휴지기를 거친 뒤에 그렇게 합니다. 이 명세는 또한 노드에게 자신이 인식하지 못하는 비트를 추적하고 알 수 없는 배포가 확정되면 크게 경고하도록 요구하는데, 업그레이드되지 않은 소프트웨어가 자신이 시행할 수 없는 규칙이 다가온다고 경고하는 방식이 바로 이것입니다.
확인할 수 있는 곳
BIP-9 자체의 매개변수에 따라 비트코인 메인넷에서 두 개의 배포가 실행되었으며, 이 BIP의 배포 목록은 그 둘을 모두 표로 정리하고 있습니다.
첫 번째 배포는 csv라는 이름으로 0번 비트를 사용했고 시작 시간은 2016-05-01, 만료는 2017-05-01이었으며, 블록 419,328에서 활성화되었습니다. 이 배포는 BIP-68, BIP-112, BIP-113을 묶은 것으로, BIP-9가 이전에 유효했던 트랜잭션을 무효로 만드는 변경으로 나열한 것 중 세 가지입니다. 두 번째 배포는 segwit라는 이름으로 1번 비트를 사용했고 구간은 2016-11-15부터 2017-11-15까지였으며, 놓칠 수도 있었던 마감 기한 안인 블록 481,824에서 활성화되었습니다.
이 체계는 채굴 인프라에서도 드러납니다. BIP-9는 getblocktemplate 호출을 확장하여, 이미 활성화된 배포의 이름을 나열하는 rules 배열, 대기 중인 각 배포의 이름을 그 비트에 대응시키는 vbavailable 객체, 서버가 요구하는 비트의 선택적 마스크인 vbrequired를 추가했습니다. 채굴 풀은 이 키들을 읽어 무엇을 신호할지 결정하며, 배포된 릴리스가 추적 사이트의 비율로 바뀌는 것이 바로 이 과정입니다.
버전 비트 vs 버전 2 블록
버전 2 블록은 버전 필드에 카운터를 담고, 버전 비트는 같은 4바이트에 비트 벡터를 담습니다. BIP-34에서는 이 필드를 정수로 비교했기 때문에 한 번에 하나의 업그레이드만 진행될 수 있었고, 성공할 때마다 유효한 블록이 사용할 수 있는 값이 영구적으로 소모되었습니다. BIP-9는 그 비용을 명시합니다. BIP-34, BIP-66, BIP-65 이후에는 버전 값이 0x7FFFFFFB개만 남았으므로, 어떤 비트 벡터 체계든 독립 배포가 30개로 제한됩니다. 대신 상위 3개 비트를 고정하면 남은 부분이 병렬로 작동하고 재사용할 수 있는 29개의 레인이 되었습니다.