용어집 / 개발자 참고 자료
PaymentRequest
- PaymentRequest란 무엇입니까?
- PaymentRequest는 BIP70의 외곽 봉투입니다. 직렬화된 PaymentDetails 바이트 열과 인증서 체인, 서명을 함께 감싸므로, 지불하는 쪽이 누가 요청했는지 확인할 수 있었습니다.
BIP-70에 명시되어 있습니다.
PaymentRequest는 지갑이 문자열 대신 회사 이름을 표시하게 해 주던 메시지입니다. 이 메시지에는 다섯 개의 필드가 있었고, 중요한 두 개는 none, x509+sha256, x509+sha1 중 하나인 pki_type과 직렬화된 세부 정보에 대한 signature였습니다. 오늘날 지불하는 사람에게 이 교훈은 프로토콜이 사라진 뒤에도 남아 있습니다. 결제 화면에 표시되는 이름은 그것을 보증한 주체만큼만 신뢰할 수 있습니다.
작동 방식
상태: 폐기되었습니다. Bitcoin Core는 0.9.0부터 PaymentRequest 처리를 포함했고, 2020년 6월 3일에 0.20.0이 이를 제거했으며, 현재 유지 관리되는 지갑은 이 메시지를 해석하지 않습니다.
다섯 개의 필드는 다음 순서입니다.
payment_details_version, 기본값이 1인 32비트 정수입니다. 한 번도 증가되지 않았습니다.pki_type, 기본값이 "none"인 문자열입니다. 대안은 "x509+sha256"과 "x509+sha1"이었습니다.pki_data, 판매자의 리프 인증서를 맨 앞에 두고 그 뒤에 중간 인증서를 두는 X509Certificates 구조를 담습니다.serialized_payment_details, 필수 항목으로, 이 용어집의 다른 항목에서 설명하는 불투명한 바이트 열입니다.signature, 전체가 인증서 소유자로부터 왔음을 증명하는 바이트입니다.
서명 절차에는 작은 요령이 하나 있습니다. 판매자는 모든 필드를 채우고 signature를 비운 뒤 완전한 메시지를 직렬화하고, 그 해시를 계산하고, 리프 인증서에 해당하는 개인 키로 그 해시에 서명한 다음, 방금 비워 두었던 필드에 서명을 기록합니다. 검증자는 그 필드를 다시 비우고, 다시 직렬화한 뒤 확인합니다. 단순하고 자기 완결적이며, 인증서 외에는 아무것에도 의존하지 않습니다.
그 의존성이 문제였습니다. 인증서 체인을 검증하려면 지갑이 루트 인증서 저장소를 보유해야 했는데, 데스크톱 소프트웨어는 이를 운영 체제에서 물려받았고 모바일 소프트웨어는 이를 자주 잘못 처리했습니다. 올바른 구현이라 해도 어떤 인증 기관이 도메인 이름을 보증했다는 것만 증명했을 뿐이며, 루트 저장소에는 수백 개의 인증 기관이 들어 있어 그중 어느 것이든 임의의 이름에 대해 인증서를 발급할 수 있었습니다. 제공된 가장 약한 옵션인 x509+sha1은 특히 나쁘게 낡았습니다. BIP70이 작성된 지 4년 뒤인 2017년 2월 23일에 실용적인 SHA-1 충돌이 공개되었습니다.
확인할 수 있는 곳
PaymentRequest라는 이름은 여전히 두 곳에서 쓰이며, 그중 비트코인과 관련된 곳은 한 곳뿐입니다.
첫 번째는 보관된 코드와 문서로, BIP71 MIME 유형 application/bitcoin-paymentrequest가 판매자 서버가 반환한 응답을 표시했습니다. 두 번째는 현대 웹 플랫폼으로, PaymentRequest는 카드 및 저장된 결제 수단을 이용한 결제를 위한 브라우저 API를 가리키며 이 프로토콜과는 아무 관련이 없습니다. 오늘날 이 단어를 쓰는 개발자는 거의 확실히 브라우저 쪽을 뜻하며, 둘을 혼동하는 것이 오래된 비트코인 문서를 검색할 때 가장 흔한 실수입니다.
비트코인을 구매하는 사람에게 남는 결론은 결제에 신원이 어떻게 붙는가에 관한 것입니다. 거래소는 계좌와 KYC로 이를 해결하므로 플랫폼이 사용자가 누구인지 알고, 사용자는 플랫폼의 평판에 기댑니다. 자기 보관은 사용자가 직접 주소를 확인하게 함으로써 이를 해결합니다. BIP70은 웹의 인증서 시스템을 빌려오는 세 번째 경로를 시도했고, 그 경로는 닫혔습니다.
PaymentRequest vs PaymentDetails
PaymentRequest는 봉투이고, PaymentDetails는 그 안의 편지입니다. 봉투를 읽으면 누가 서명했고 어떤 인증서를 썼는지 알 수 있지만, 무엇을 요청하는지는 알 수 없습니다. 금액, 스크립트, 만료 시각, 메모는 모두 내부 메시지에 있으며, 이 메시지는 재인코딩으로 서명이 무효화되지 않도록 해석되지 않은 바이트 열 그대로 봉투 안에 들어 있습니다. 지갑은 두 번째 메시지의 무엇이든 신뢰하기 전에 첫 번째 메시지를 검증해야 했습니다.