용어집 / 개발자 참고 자료
MSG_WITNESS_TX
- MSG_WITNESS_TX란 무엇입니까?
- 위트니스 트랜잭션 요청은 getdata로 전송되며, 피어에게 지정된 트랜잭션을 서명 데이터를 제거하지 않고 그대로 붙인 채로 반환하라고 지시합니다.
BIP-144에 명시되어 있습니다.
txid로 트랜잭션을 MSG_WITNESS_TX로 요청하면 서명이 붙은 버전을 돌려받습니다. Bitcoin Core 0.21.0은 2021년 1월 14일에 출시되어 wtxid 릴레이를 추가했고, 위트니스 해시로 요청하는 MSG_WTX가 이 요청을 대부분 대체했습니다. 코인을 보내는 사람에게 돌아오는 이점은 조작된 서명이 더 이상 결제를 릴레이에서 사라지게 만들지 않는다는 것입니다.
작동 방식
모든 세그윗 트랜잭션에는 두 가지 신원이 있으며, MSG_WITNESS_TX가 존재하는 이유는 피어에게 둘 중 어느 것을 충족하라는 요청인지 알려야 하기 때문입니다.
txid는 위트니스를 제외한 트랜잭션(버전, 입력, 출력, 록타임)의 이중 SHA-256입니다. wtxid는 마커 바이트와 플래그 바이트, 위트니스 스택을 포함한 전체 직렬화에 대해 계산한 같은 해시입니다. 위트니스가 전혀 없는 트랜잭션에서는 둘이 같습니다. 코인베이스 트랜잭션의 경우 BIP141은 wtxid를 32바이트의 0으로 정의하며, 이는 위트니스 머클 루트가 매달릴 잘 정의된 대상을 갖도록 존재하는 특수한 경우입니다.
요청 코드는 0x40000001이며, 트랜잭션 유형 1에 위트니스 플래그 0x40000000을 더한 것입니다. 위트니스 플래그 없이 유형 1의 getdata를 보내면 피어는 위트니스가 제거된 바이트로 응답하는데, 이는 자금이 어디로 갔는지 확인하기에는 충분하지만 지출이 승인되었는지 검증하기에는 쓸모가 없습니다.
이 분리가 과거의 가단성 문제를 없앴습니다. 세그윗 이전에는 제3자가 서명을 다시 인코딩해 txid를 바꾸고, 송신자는 그 이름으로 더 이상 존재하지 않는 트랜잭션을 기다리게 만들 수 있었습니다. 서명을 txid 밖으로 옮긴 것이 그 문을 닫았고, 이것이 사전 서명된 라이트닝 채널 트랜잭션을 안전하게 신뢰할 수 있게 만든 요인입니다.
그다음 BIP339는 이 논리를 한 단계 더 나아가게 했습니다. verack 이전에 wtxidrelay 메시지를 보내는 피어는 인벤토리 유형 5를 사용해 wtxid로 트랜잭션을 알리며, Bitcoin Core는 0.21.0부터 이렇게 해왔습니다. 이점은 거부 캐시에 있습니다. 잘못된 위트니스를 한 번 거부한 노드는 같은 트랜잭션의 정상 사본도 더 이상 거부하지 않는데, 둘의 wtxid가 다르기 때문입니다. MSG_WITNESS_TX는 wtxid 릴레이를 협상하지 않은 피어를 위해 남아 있으며, 실제로는 그 릴리스보다 오래된 소프트웨어를 의미합니다.
확인할 수 있는 곳
txid와 wtxid를 나란히 볼 수 있는 가장 명확한 곳은 Bitcoin Core 자체의 트랜잭션 RPC 출력입니다.
모든 세그윗 지출에 대해 상세 출력으로 getrawtransaction을 호출하면 txid 필드와 hash 필드를 얻습니다. 두 값은 다릅니다. hash가 wtxid이며, 이 차이는 평범한 JSON 객체에서 위트니스 데이터의 유일한 가시적 흔적입니다. 블록 탐색기는 txid로 인덱싱하므로, 출금이 도착했는지 확인할 때 검색창에 붙여 넣을 값은 txid입니다.
네트워크상에서 getpeerinfo는 메시지를 유형별로 집계하며, 연결이 잘 된 노드라면 그 분석의 트랜잭션 요청은 혼합되어 있을 것입니다. 최신 피어에게는 MSG_WTX, 뒤처진 피어에게는 MSG_WITNESS_TX입니다.
이 중 구매자가 설정할 것은 없습니다. 이는 간접적으로 중요합니다. 거래소가 출금이 브로드캐스트되었다고 알렸는데 지갑에서 찾지 못한다면, 유용한 질문은 피어들이 어떤 직렬화를 교환했는지가 아니라 받은 txid가 멤풀에 도달했는지입니다.
MSG_WITNESS_TX vs MSG_TX
MSG_TX는 같은 트랜잭션을 지정하지만 모든 서명을 제거해 반환합니다. 이 형식은 세그윗 이전 노드가 이해했던 것이며, NODE_WITNESS를 한 번도 알리지 않은 피어에게 여전히 전송됩니다. 이 구분은 겉치레가 아닙니다. 위트니스가 제거된 버전을 받은 노드는 트랜잭션 구조는 확인할 수 있지만 검증할 수는 없어서, 멤풀에 안전하게 넣을 수도, 검증된 트랜잭션으로 다른 피어에 릴레이할 수도 없습니다. Bitcoin Core는 구형 형식만 사용하는 피어에게 세그윗 트랜잭션을 보내지 않습니다.