용어집 / 트랜잭션과 수수료
시퀀스 번호
별칭은 nSequence입니다.
- 시퀀스 번호란 무엇입니까?
- 시퀀스 번호는 모든 트랜잭션 입력에 붙는 4바이트 필드로, 수수료 대체를 신호하고, 록타임을 켜며, 상대 시간 잠금을 부호화할 수 있습니다.
BIP-68에 명시되어 있습니다.
서로 무관한 세 가지 역할이 하나의 필드를 공유하는 이유는 비트코인에 또 하나의 필드를 추가할 여유가 없었기 때문입니다. 새 버전마다 번호를 높이는 원시적인 결제 채널이라는 이 필드에 대한 사토시의 원래 계획은 채굴업자가 더 높은 번호를 선호하도록 강제하는 규칙이 없었기 때문에 2010년 무렵 포기되었습니다. 그 후 살아남은 것은 지갑의 트랜잭션이 어떻게 작동하는지를 결정하는 일련의 매직 값입니다.
작동 방식
시퀀스 번호를 읽는다는 것은 그것을 세 가지 별개의 규칙과 오래된 순서대로 대조한다는 뜻입니다.
최종 값. 시퀀스 번호 0xffffffff, 십진수 4,294,967,295는 입력을 최종으로 표시합니다. 트랜잭션의 모든 입력이 최종이면 록타임 필드는 완전히 무시됩니다. 초기 지갑의 기본값이었고, 이 필드를 한 번도 고려해 본 적 없는 소프트웨어가 만든 트랜잭션에서 여전히 보이는 값입니다.
대체 신호. BIP125는 범위의 낮은 쪽에 의미를 부여했습니다. 0xfffffffd 이하로 설정된 입력은 발신자가 더 높은 수수료를 지불하는 버전으로 트랜잭션을 대체할 수 있음을 알립니다. 값 0xfffffffe는 록타임을 활성화하면서 대체 신호는 보내지 않는 절묘한 지점에 있습니다. 이 구분은 힘을 거의 잃었습니다. Bitcoin Core가 2024년 10월의 버전 28.0부터 신호와 무관하게 대체를 중계해 왔기 때문입니다.
상대 시간 잠금. BIP68은 버전 2 이상을 선언하는 트랜잭션에 대해 하위 비트를 새로 해석했고, 이 규칙은 2016년 7월의 블록 419,328에서 강제할 수 있게 되었습니다. 비트 31이 꺼져 있으면 하위 16비트는 해당 입력이 사용하는 코인이 확인된 뒤 얼마나 시간이 지나야 하는지를 나타냅니다. 비트 22는 단위를 선택합니다. 꺼져 있으면 블록 단위이므로 최대 65,535블록, 대략 455일이고, 켜져 있으면 512초 단위이므로 상한은 약 388일입니다. 시계는 고정된 날짜가 아니라 부모 트랜잭션의 확인 시점부터 시작하며, 이는 두 사람 사이의 계약에 정확히 필요한 것입니다.
확인할 수 있는 곳
시퀀스 번호는 원시 트랜잭션 덤프에서는 열로, 지갑 소프트웨어에서는 체크박스로 나타나며, 두 화면이 같은 단어를 쓰는 경우는 드뭅니다.
입력을 디코딩하는 블록 탐색기는 각 입력 옆에 4294967293 같은 값을 표시합니다. 이는 0xfffffffd이며, 지갑이 대체 가능한 트랜잭션을 만들었다는 것을 알려줍니다. Bitcoin Core의 decoderawtransaction도 같은 값을 보여 주고, Sparrow와 Electrum은 그것을 숫자가 아니라 "replace by fee" 토글 뒤에 노출합니다.
라이트닝 네트워크가 가장 큰 실제 사용처입니다. 채널의 취소 지연, 즉 상대방이 오래된 상태를 게시했을 때 처벌받을 수 있는 기간은 이 필드를 통해 커밋먼트 트랜잭션의 입력에 적용되는 상대 시간 잠금입니다. 같은 메커니즘은 잠수함 스왑, 볼트 설계, 그리고 상대방이 행동할 공정한 기회를 가진 뒤에만 환불 경로를 사용할 수 있어야 하는 모든 계약의 기반이 됩니다.
시퀀스 번호 vs 록타임
시퀀스 번호는 입력마다 붙고, 록타임은 트랜잭션마다 붙습니다. 이것이 둘을 구분하는 가장 빠른 방법이며, 둘이 서로 다른 용도로 쓰이는 이유를 설명합니다.
록타임은 전체 트랜잭션에 하나의 절대적인 기한을 설정하며, 블록 높이나 실제 시각으로 표현되고, 사용되는 코인이 하루 된 것이든 5년 된 것이든 적용됩니다. 시퀀스 번호의 상대 시간 잠금은 해당 입력이 사용하는 특정 코인의 확인 시점부터 측정하므로, 입력마다 대기 기간을 따로 가질 수 있고, 언제 자금이 들어오든 같은 스크립트가 작동합니다. 두 필드는 또한 어색한 방식으로 서로에게 의존합니다. 록타임은 적어도 하나의 시퀀스 번호가 최종 값보다 낮을 때만 강제되므로, 모든 값을 0xffffffff로 설정하는 지갑은 다른 필드를 조용히 비활성화합니다.