본문으로 건너뛰기
buybitcoinsmart

용어집 / 개발자 참고 자료

PaymentDetails

PaymentDetails란 무엇입니까?
PaymentDetails는 실제로 결제 내용을 기술한 BIP70 내부 메시지로, 어느 출력으로 지불할지, 얼마를 지불할지, 요청이 언제 만료되는지, 서명된 트랜잭션을 어디로 보낼지를 담고 있었습니다.

BIP-70에 명시되어 있습니다.

PaymentDetails는 판매자가 실제로 서명한 부분이었고, 바깥 봉투는 그것을 증명하는 인증서만 담고 있었습니다. 이 메시지는 7개 필드를 담고 있었습니다. 기본값이 main인 네트워크 이름, 출력 목록, 필수 타임스탬프, 선택적 만료 시각, 메모, 콜백 URL, 그리고 불투명한 merchant_data 바이트 덩어리입니다. 오늘날에는 BIP21 URI와 결제 페이지가 서명도 서버도 없이 같은 역할을 합니다.

작동 방식

상태: 역사적입니다. Bitcoin Core는 2020년 6월 3일에 버전 0.20.0에서 BIP70을 제거했으며, PaymentDetails에는 운영 중인 구현이 없습니다. 이 사이트에서 이를 다루는 이유는 필드 이름이 오래된 연동 가이드와 bitcoin.org 개발자 레퍼런스에 여전히 등장하기 때문입니다.

구조를 전달한 것은 JSON이 아니라 Protocol Buffers였습니다. 그 선택에는 잠시 짚어 볼 만한 이유가 있었습니다. 판매자는 PaymentDetails를 바이트 문자열로 직렬화하고 그 바이트를 중첩 메시지가 아니라 불투명한 필드로 바깥 PaymentRequest 안에 넣었습니다. 서명이 그 바이트 문자열을 대상으로 했기 때문에, 같은 필드를 다른 순서로 다시 인코딩하는 어떤 라이브러리도 유효한 서명을 무효로 만들 수 없었습니다.

7개 필드는 지시와 부기로 나뉘었습니다.

  • network, 기본값이 "main"인 문자열이며, 다른 정의된 값은 "test" 하나뿐입니다.
  • outputs, 반복되는 목록으로, 각 항목은 사토시 단위 금액과 스크립트를 짝지어 담습니다. 출력이 둘 이상인 것도 허용되었고, 판매자는 이를 활용해 고객에게 두 번 보내라고 요구하지 않고 한 번의 고객 결제를 핫월렛과 콜드 스토리지로 나누어 받았습니다.
  • time, 요청이 생성된 시각을 기록하는 필수 유닉스 타임스탬프입니다.
  • expires, 이 시각이 지나면 지갑이 요청을 거부해야 하는 선택적 유닉스 타임스탬프입니다. 판매자가 법정화폐 가격을 제시하고 정해진 기간 동안 그것을 보장할 수 있었기에, BIP70이 카드 단말기처럼 느껴지게 만든 필드가 바로 이것입니다.
  • memo, 지불자에게 표시되는 UTF-8 메모입니다.
  • payment_url, 지갑이 트랜잭션을 브로드캐스트한 뒤 자신의 Payment 메시지를 게시한 곳입니다.
  • merchant_data, 그대로 되돌려 받도록 한 불투명 바이트로, 판매자가 결제를 장바구니와 대조할 수 있게 했습니다.

필수였던 것은 time과 출력 스크립트뿐이었습니다. 나머지는 판매자가 생략할 수 있었고, 대부분 생략했습니다.

확인할 수 있는 곳

PaymentDetails 뒤에 있던 발상은 이 메시지보다 오래 살아남았고, 이것이 주목할 만한 점입니다.

가격 만료는 이제 지갑이 아니라 거래소에서 처리됩니다. 즉시 구매 화면에서 구매하면 옆에 카운트다운이 붙은 제시 가격을 받습니다. 카운트다운이 끝나면 제시 가격은 새 가격으로 다시 산출됩니다. 이것은 웹 앱에서 expires를 다시 구현한 것이며, 정확히 같은 방식으로 판매자를 변동성으로부터 보호합니다. 거래소 호가창에서의 주문 체결은 고정 가격을 아예 제시하지 않는다는 점에서 같은 일을 다른 방식으로 합니다.

메시지 전체에 해당하는 판매자 측의 대응물은 결제 소프트웨어의 인보이스 기록입니다. BTCPay Server 및 이와 비슷한 도구는 BIP21 URI를 생성하고, 설정된 분 동안 이를 열어 두며, 들어오는 트랜잭션을 내부 주문 식별자와 대조합니다. merchant_data가 바로 이 용도였습니다.

PaymentDetails vs 영수증

PaymentDetails는 요청이었고, BIP70에서의 영수증은 판매자가 나중에 돌려준 PaymentACK였습니다. 하나는 무엇이 일어나야 하는지를 기술했고, 다른 하나는 판매자가 그것이 일어난 것을 보았다고 확인했습니다. 둘 다 블록체인의 사실이 아니었고, 이것이 사람들이 과소평가한 한계입니다. 판매자의 서명된 확인은 그 판매자의 서버가 무언가를 말했다는 것만 증명할 뿐, 트랜잭션이 확인되었다는 것을 증명하지는 않습니다. 비트코인 결제를 정산하는 것은 영수증이 아니라 블록 확인입니다.

혼동하기 쉬운 용어

자주 묻는 질문

BIP70은 PaymentDetails를 중첩 메시지가 아니라 원시 바이트로 저장한 이유는 무엇입니까?

서명이 정확한 바이트 문자열을 대상으로 하게 하기 위해서입니다. Protocol Buffers는 같은 필드를 여러 가지 유효한 방식으로 다시 인코딩할 수 있는데, 직렬화된 바이트 덩어리에 서명하면 어떤 라이브러리도 이를 다시 직렬화하면서 유효한 서명을 우연히 깨뜨릴 수 없습니다.

관련 용어

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

이 페이지를 영어로 읽기