용어집 / 프로토콜과 업그레이드
SIGHASH_ANYPREVOUT
별칭은 APO입니다.
- SIGHASH_ANYPREVOUT란 무엇입니까?
- SIGHASH_ANYPREVOUT는 Taproot 스크립트를 위한 제안된 서명 방식으로, 서명 1개로 해당 서명이 만들어진 단일 코인이 아니라 일치하는 스크립트에 잠긴 모든 코인을 지출할 수 있게 합니다.
BIP-118에 명시되어 있습니다.
BIP-118은 일반 키에 추가된 플래그가 아니라, 0x01로 시작하는 33바이트의 새로운 공개 키 유형을 tapscript용으로 정의합니다. 2017년 2월에 배정되었으나 한 번도 활성화된 적이 없으며, 스크립트 경로 지출에서만 작동하고 키 경로 지출에서는 결코 작동하지 않습니다. 어떤 지갑도 이런 방식으로 서명할 수 없으므로, 메인넷에서 eltoo 채널을 약속하는 제품은 미래를 설명하는 것입니다.
작동 방식
상태: BIP-118은 Draft이며 2017-02-28에 배정되었고, BIP-340, BIP-341, BIP-342를 요구하며, 자체 Deployment 절은 TODO라고 적혀 있습니다. 아무것도 대체되지 않았는데, 아무것도 가동되지 않았기 때문입니다.
Taproot 서명은 지출되는 코인의 아웃포인트에 커밋하며, BIP-118이 수정하는 ANYONECANPAY 다이제스트에서 txid와 인덱스의 36바이트로 이를 코인 1개에 영구히 용접합니다. 서명되는 메시지에서 아웃포인트를 제거하면 서명은 코인을 지명하는 것을 멈추고 형태를 지명하기 시작하므로, 나중에 그 형태의 어떤 UTXO든 서명에 묶을 수 있습니다. BIP는 이를 동적 재결합(dynamic rebinding)이라고 부릅니다.
두 가지 변형이 정의되어 있으며, 두 변형의 차이는 무엇이 여전히 커밋되는가입니다.
- SIGHASH_ANYPREVOUT는 비트 값 0x40으로, 아웃포인트를 제거하지만 입력의 금액(8바이트), scriptPubKey(여기서는 항상 35바이트) 및 tapleaf 해시는 유지합니다. 그러면 서명은 같은 스크립트 아래 같은 값을 가진 모든 코인에 맞습니다.
- SIGHASH_ANYPREVOUTANYSCRIPT는 비트 값 0xc0으로, 금액과 scriptPubKey 및 tapleaf 해시도 제거합니다. 이는 해당 키가 충족할 수 있는 스크립트를 가진 모든 코인에 맞습니다.
옵트인은 서명할 때가 아니라 주소 생성 시에 이루어집니다. 이 키들은 tapscript 리프를 통해서만 작동하므로, 주소는 머클 트리에 그러한 리프를 담아야 하며, 지출되기 전까지는 다른 어떤 Taproot 주소와도 구별할 수 없습니다. 상수 하나가 둘을 분리합니다. key_version은 BIP-118 키의 경우 0x01이고 일반 tapscript 키의 경우 0x00이므로, 하나의 개인 키로 두 규칙 모두에서 유효한 서명을 만들 수 없습니다. 여섯 개의 새로운 hash_type 바이트가 유효한 값이 됩니다. 0x41, 0x42, 0x43, 0xc1, 0xc2, 0xc3입니다.
볼 수 있는 곳
SIGHASH_ANYPREVOUT는 어떤 메인넷 트랜잭션에도 나타나지 않으며, BIP-118은 이것이 존재하게 되더라도 "only be rarely used in practice"(실제로는 드물게만 사용될 것임)일 것으로 예상하는데, 스크립트 경로 지출이 더 무겁고 더 식별 가능하기 때문입니다.
이것이 작성된 설계는 오프체인 업데이트 방식인 eltoo입니다. 오프체인 프로토콜은 상대방이 어떤 오래된 상태를 공개하든 이에 응답해야 하며, 일반 서명은 응답하는 정확한 트랜잭션에 커밋하므로 나타날 수 있는 모든 상태마다 새 서명이 필요합니다. 반면 eltoo는 스크립트와 nLockTime을 사용해 서명을 비대칭으로 만들어, 더 나중 서명을 담은 트랜잭션이 더 이른 서명을 담은 트랜잭션을 지출할 수 있지만 그 반대는 결코 할 수 없게 하며, 업데이트 서명 1개를 상대방이 공개한 이전 업데이트 어느 것 위에도 적용할 수 있습니다.
이 이름은 하나의 정정을 기록합니다. Joseph Poon은 원래 Lightning 논문이 이를 제기한 뒤 2016년 2월에 이 아이디어를 SIGHASH_NOINPUT로 제안했으며, 이름 변경은 입력이 실제로 무시되는 것이 아님을 나타냅니다. nSequence는 항상 서명되며, SIGHASH_ANYPREVOUT에서는 스크립트와 금액도 서명됩니다.
BIP의 보안 절은 그 대가를 밝힙니다. 재전송입니다. ANYPREVOUT 서명은 같은 스크립트와 같은 값을 가진 다른 어떤 UTXO에도 재사용될 수 있고, ANYPREVOUTANYSCRIPT 서명은 스크립트 중 하나에서 그 키를 재사용하는 어떤 UTXO에도 재사용될 수 있으므로, 키 재사용은 프라이버시 문제에서 돈을 잃는 방법으로 바뀝니다. 이러한 트랜잭션은 낯선 사람에 의해서도 변경 가능합니다. 일치하는 입력을 제공할 수 있는 사람은 누구나 개인 키 없이 txid를 바꿀 수 있습니다.
SIGHASH_ANYPREVOUT vs SIGHASH_ANYONECANPAY
SIGHASH_ANYONECANPAY는 오늘날 네트워크에 존재하며 서명되는 입력을 제외한 모든 입력을 제거하고, SIGHASH_ANYPREVOUT는 그 살아남은 입력의 일부도 제거합니다. BIP-118은 자신의 다이제스트를 아웃포인트를 뺀 ANYONECANPAY 다이제스트라고 설명하는데, 한 줄 차이에 큰 결과가 따릅니다. ANYONECANPAY 서명은 재전송될 수 없는데, 그것이 지명하는 아웃포인트는 한 번만 지출될 수 있기 때문입니다. 그 커밋을 포기하면 재전송 보호는 서명이 아니라 그 위에 구축된 프로토콜에서 와야 합니다.