용어집 / 개발자 참고 자료
OP_DUP
- OP_DUP란 무엇입니까?
- OP_DUP는 스택 맨 위 항목을 복사해 두 번 사용할 수 있게 하며, 그래서 표준 pay-to-public-key-hash 스크립트는 공개 키를 해시하는 동시에 그 키에 대해 검증할 수 있습니다.
1바이트, 0x76이며 하는 일은 하나입니다. 비트코인 스크립트에는 변수가 없고 스택만 있습니다. 한 명령이 소비한 항목은 다음 명령이 실행되기 전에 사라지므로, 복제가 그것을 다시 사용하는 유일한 방법입니다. 이는 1로 시작하는 거의 모든 비트코인 주소를 보호하던 25바이트 스크립트의 동작 명령 4개 중 첫 번째입니다.
작동 방식
검증이 같은 공개 키를 서로 양립할 수 없는 두 목적에 필요로 하기 때문에 복제가 필요합니다. 출력은 해시에만 커밋했으므로, 키가 올바른 키임을 증명하려면 키를 해시해 비교해야 합니다. 그다음 서명 검사에는 키 자체가 필요하지만, 비교 과정에서 키가 소비되었을 것입니다.
레거시 지출 과정을 따라가 보겠습니다. 지출자의 데이터가 스택에 올라가고, 서명 위에 공개 키가 놓입니다. OP_DUP가 키의 두 번째 사본을 만듭니다. OP_HASH160은 사본을 20바이트 다이제스트로 바꿉니다. 출력이 커밋된 20바이트를 푸시하고, OP_EQUALVERIFY가 둘 다 소비하며 불일치가 있으면 전체 스크립트를 중단합니다. 그러면 OP_CHECKSIG가 원래 키와 서명을 마주하게 되는데, 이것이 정확히 필요한 것입니다. 다섯 단계, 분기 없음, 반복 없음, 매번 고정된 비용입니다.
이 옵코드는 비용이 큰 작업을 하지 않으면서 두 가지 상한에 포함됩니다. Taproot 이전 스크립트가 포함할 수 있는 201개의 동작 명령 중 하나이며, 여기서 만든 사본은 스택 전체에 걸친 1,000개 항목 한도에 포함됩니다. 단일 키 지출에서는 둘 다 문제되지 않지만, 반복 없는 조건 사슬 안에서 복제하는 스크립트에서는 둘 다 문제가 됩니다.
확인할 수 있는 곳
1로 시작하는 주소를 지출하는 트랜잭션을 보면 출력 스크립트가 OP_DUP로 시작합니다. 블록 탐색기는 이를 어셈블리 표현의 첫 토큰으로 표시합니다.
더 흥미로운 것은 이것이 나타나지 않으면서 실행되는 경우입니다. 네이티브 SegWit 단일 키 출력은 아무 로직도 포함하지 않고 버전 바이트와 20바이트 해시만 있습니다. 그러나 BIP-141은 노드에 그 해시로 고전적인 템플릿을 구성한 뒤 그대로 실행하라고 지시합니다. 따라서 이 옵코드는 네트워크의 모든 P2WPKH 지출에서 여전히 실행되지만 블록 어디에도 나타나지 않습니다. 예전에 그 바이트가 비용으로 치렀던 4개의 가중치 단위를 지불하지 않고도 같은 동작을 얻는 것입니다.
스크립트 해시 출력과 Taproot 키 경로 지출은 이를 완전히 건너뜁니다. P2SH 출력은 해시를 직접 비교하고, Taproot 키 지출은 스크립트 없이 출력 키에 대해 서명을 검증합니다. 이것은 SegWit과 Taproot가 실제로 한 일을 가장 작게 보여 주는 예입니다. 새로운 기능이라기보다는 같은 검사를 체인이 더 적은 바이트를 실어 나르면서 수행하도록 배열한 것입니다.