본문으로 건너뛰기
buybitcoinsmart

용어집 / 개발자 참고 자료

OP_EQUALVERIFY

OP_EQUALVERIFY란 무엇입니까?
OP_EQUALVERIFY는 스택 최상단의 두 항목을 비교하고, 두 값이 다르면 스크립트를 즉시 종료하며, 레거시 지출에서 올바른 공개 키를 제시했는지는 바로 이 방식으로 증명됩니다.

바이트 0x88은 비트코인의 가장 오래된 스크립트 템플릿 한가운데에 있는 검문소입니다. 검사를 통과하면 아무것도 남기지 않고, 실패하면 실행을 곧바로 멈춥니다. 따라서 잘못된 키를 제공한 입력은 결제 실패가 아니라 어떤 노드도 중계하지 않는 무효 트랜잭션이 됩니다. 지갑이 애초에 올바른 키로 서명했는지는 보통 이 지점에서 판가름납니다.

작동 방식

OP_EQUALVERIFY는 스택에서 두 항목을 꺼내 바이트 단위로 비교하고, 조용히 계속 진행하거나 스크립트를 끝냅니다.

레거시 지출에서 이 명령이 실행될 때 스택에는 20바이트 문자열 두 개가 들어 있습니다. 하나는 코인이 들어왔을 때, 어쩌면 몇 년 전에 출력이 확약한 지문입니다. 다른 하나는 지출자가 방금 제시한 공개 키의 지문입니다. 이 20바이트 중 단 한 비트만 달라도 평가가 끝나며, 여기서 회복할 방법은 없습니다. Bitcoin Script에는 예외 처리가 없고 두 번째 시도도 없습니다.

성공해도 스택에 아무것도 되돌려 놓지 않습니다. 융합된 형태가 존재하는 이유가 전부 여기에 있으며, 25바이트 pay-to-public-key-hash 스크립트가 아무도 원하지 않는 남은 불리언 값이 아니라 서명 검사로 끝날 수 있는 것도 그 때문입니다. Bitcoin Core의 인터프리터는 융합을 문자 그대로 구현합니다. 비교 케이스를 실행한 뒤 일반 단정 케이스로 그대로 이어지므로, 둘은 비슷한 두 경로가 아니라 하나의 코드 경로입니다.

이 패턴은 언어 전체에서 반복됩니다. 융합된 모든 verify 오피코드는 일반 대응 오피코드보다 바로 다음 바이트 값에 있습니다. 동등 비교는 0x87과 0x88, 서명 검사는 0xac과 0xad, 옛 멀티시그 오피코드는 0xae와 0xaf입니다. 다른 어떤 일이 일어나기 전에 조건이 성립해야 하는 곳에서 스크립트 작성자는 더 높은 바이트를 선택합니다.

확인할 수 있는 곳

OP_EQUALVERIFY를 가장 분명하게 만나는 곳은 블록 탐색기가 아니라 거부 메시지입니다.

주소와 일치하지 않는 키로 서명한 트랜잭션을 브로드캐스트하면 Bitcoin Core가 mandatory-script-verify-flag-failed로 응답하며, 뒤따르는 괄호 안에 실패한 OP_EQUALVERIFY 연산을 명시합니다. 실제로 이 오류는 거의 항상 한 가지를 뜻합니다. 서명 장치가 코인을 보유한 경로나 시드와 다른 경로 또는 다른 시드에서 키를 도출했다는 것입니다. 잘못된 도출 경로로 지갑을 복원한 뒤 지출을 시도하면 정확히 이 결과가 나옵니다.

디코딩한 스크립트에서도 분명히 드러납니다. 1로 시작하는 주소로 지급하는 모든 출력은 이 오피코드가 네 번째에 오는 다섯 토큰 스크립트로 표시되며, bitcoin-cli decodescript는 붙여 넣은 redeem script에 대해서도 같은 어셈블리를 출력합니다.

OP_EQUALVERIFY vs OP_VERIFY

OP_EQUALVERIFY는 단정이 결합된 특정 검사이고, OP_VERIFY는 단정 그 자체입니다. 일반 형태인 바이트 0x69는 자신이 검사하는 값을 무엇이 만들었는지 전혀 알지 못합니다. 항목 하나를 꺼내 그것이 참일 것을 요구할 뿐입니다. OP_EQUALVERIFY는 비교와 요구를 한 바이트 안에서 함께 수행하므로 둘을 따로 적는 일은 드뭅니다. 조건이 산술 연산, 타임록 검사 또는 단순한 동등 비교가 아닌 프리이미지 검사에서 나올 때는 일반 형태를 사용합니다. 두 바이트 문자열이 일치하는지가 정말로 문제일 때는 융합된 형태를 사용합니다. 단일 키 지출에서는 항상 그렇습니다.

혼동하기 쉬운 용어

자주 묻는 질문

트랜잭션을 브로드캐스트할 때 OP_EQUALVERIFY 오류가 나오는 것은 무엇을 뜻합니까?

지갑이 제시한 공개 키의 해시가 출력이 확약한 값과 일치하지 않는다는 뜻이므로, 서명은 검사조차 되지 않았습니다. 거의 항상 서명하는 지갑이 잘못된 도출 경로에 있거나 잘못된 시드에서 복원된 경우입니다.

OP_EQUAL 뒤에 OP_VERIFY를 쓰면 안 됩니까?

동작은 같지만 1바이트가 더 듭니다. 융합된 오피코드가 존재하는 이유는 그 비교와 중단의 쌍이 모든 레거시 단일 키 출력에 나타나고, 입력당 1바이트가 체인 전체에 걸쳐 누적되기 때문입니다.

관련 용어

개발자 참고 자료 분야의 다른 용어

이 페이지를 영어로 읽기