163 / 736NWC

Nostr Wallet Connect

앱에 Lightning 지갑 접근 권한을 제한적으로 주기

매번 지갑으로 전환하지 않고 앱에서 바로 창작자를 후원하고 싶나요? Nostr Wallet Connect는 둘을 연결합니다. 연결 여부만큼 중요한 것은 앱이 무엇을 할 수 있는지, 얼마를 쓸 수 있는지, 접근 권한을 어떻게 거두는지입니다.

Nostr Wallet Connect(NWC)는 NIP-47 문서에 정리된 공통 규칙입니다. 앱이 Nostr를 통해 Lightning 지갑에 요청을 보내도록 합니다. 릴레이(relay)라는 중계 서버는 암호화된 지시와 응답을 전달하며 비트코인 자체를 옮기지는 않습니다. 지갑 서비스가 권한과 결제 실행을 담당합니다.

안나는 팟캐스트를 듣다가 제작자에게 Lightning Network로 소액을 보내려 합니다. NWC를 쓰면 플레이어가 지갑에 직접 결제를 요청할 수 있습니다. 지갑 서비스는 연결 권한을 먼저 확인하고 허용된 요청을 실행합니다. NWC 자체는 누가 비트코인 키를 보관하는지 결정하지 않습니다. 반대편에는 안나의 자체 노드가 있을 수도, 자금을 대신 보관하는 서비스가 있을 수도 있습니다. 같은 “지갑 연결” 버튼도 자금에 대한 통제권은 크게 다를 수 있습니다. 부여한 권한에 따라서는 앱이 매 결제마다 새 확인을 받지 않고 행동할 수도 있습니다. [1] [2]

지갑은 대개 QR 코드나 텍스트 연결 문자열, 기술적으로 URI를 제공합니다. 여기에는 서비스의 공개키, 릴레이 주소, 그리고 이 클라이언트 연결의 개인키인 secret이 들어 있습니다. 지갑의 시드, 즉 출발점이 되는 비밀 값이나 복구 단어인 Seed Phrase는 아닙니다. 그렇다고 무해한 공개 링크도 아닙니다. 사용 가능한 사본을 얻은 사람은 같은 권한을 행사할 수 있습니다. 가능한 피해는 허용된 기능과 한도에 따라 달라집니다. 앱마다 연결을 따로 만들면 구분하고 개별적으로 철회할 수 있으며, 연결 사이의 연관성이 드러나는 것도 줄일 수 있습니다. [1]

어떤 앱은 잔액만 읽으면 되고, 어떤 앱은 돈도 보내야 합니다. 서로 다른 권한입니다. 공개 info 이벤트는 서비스가 지원하는 기능을 알리고, get_info는 특정 연결에서 사용 가능한 메서드를 돌려줍니다. 메서드는 이름 붙은 명령입니다. pay_invoice는 결제를 요청하고, make_invoice는 결제 요청서를 만들며, lookup_invoice는 상태를 조회하고, get_balance는 잔액을 읽습니다. get_info 자체도 기본 기능에 속합니다. 이력, 미리 만든 청구서 없이 지급하는 keysend, 알림은 선택적 확장입니다. 서버가 명령을 지원한다고 모든 연결 앱이 실행할 권한을 갖는 것은 아닙니다. [1] [3] [5]

안나는 플레이어에 제한된 예산만 주고 싶을 수 있습니다. 서비스가 지출, 메서드, 유효기간 제한을 제공한다면 서비스 자체가 이를 강제해야 합니다. 플레이어 화면에만 표시된 숫자는 다른 요청을 보내는 앱을 막지 못합니다. 한도가 일회성인지 갱신되는지, 수수료를 어떻게 계산하는지도 확인해야 합니다. 안나가 앱 사용을 중단하면 지갑 서비스에서 권한을 철회해야 합니다. 앱을 삭제하거나 로컬 연결만 지웠다고 접근 권한이 취소되었다고 볼 수는 없습니다. 철회는 미래의 요청을 막지만 이미 완료된 결제를 되돌리지는 않습니다. [1]

Lightning 청구서는 BOLT11 같은 형식의 결제 요청이지, 누군가 지불했다는 증거가 아닙니다. NIP-47은 금액과 수수료를 satoshi의 천분의 일인 msat로 나타냅니다. 1000 msat = 1 sat입니다. 단위를 혼동하면 금액이 천 배 달라집니다. make_invoice는 요청만 만듭니다. 성공한 pay_invoice는 preimage를 반환합니다. 이 값에서 해시라는 짧은 확인용 값을 계산합니다. 이 해시는 청구서의 결제 해시와 일치해야 하며, 반환된 preimage는 결제 완료의 증거가 됩니다. 오류 응답은 error를 사용합니다. 상태는 lookup_invoice로 조회할 수 있습니다. 앱은 메시지를 보냈다는 이유만으로 성공을 표시하지 말고 실제 결과를 처리해야 합니다. [1]

안나가 결제를 누르지만 응답이 오지 않습니다. Timeout, 즉 대기 시간이 끝났다는 사실만으로 돈이 어떻게 되었는지는 알 수 없습니다. NWC는 요청과 응답에 일시적인 이벤트를 사용하므로 릴레이 연결 해제나 서비스 중단으로 메시지가 사라질 수 있습니다. 하지만 결제는 이미 끝났고 응답만 사라졌을 수도 있습니다. 먼저 lookup_invoice나 지갑 자체에서 상태를 확인해야 합니다. 무응답이 실패 확인은 아닙니다. 새 요청을 원래 작업의 안전한 반복이라고 자동으로 판단할 수는 없습니다. 이전 결과부터 알아야 합니다. [1]

앱과 지갑은 암호화된 메시지를 주고받습니다. 현재의 방식 협상은 nip44_v2를 우선하고, 폐기된 nip04는 호환성을 위해 남겨 둡니다. encryption 태그가 없으면 이전 모드를 뜻합니다. 그러나 NIP-44는 장기 키가 나중에 유출되어도 과거 통신을 보호하는 forward secrecy를 제공하지 않습니다. 릴레이는 이벤트 종류, 태그, 연결 공개키와 시각도 볼 수 있습니다. 따라서 NWC에는 Nostr에서 게시물을 쓸 때 사용하는 주 신원 키를 쓰지 않아야 합니다. 키를 분리하면 결제와 공개 프로필의 연결을 줄일 수 있지만 완전한 익명성을 보장하지는 않습니다. [1] [4]

일반 사용자가 메시지 번호를 외울 필요는 없지만, 연동 기능을 개발할 때는 중요합니다. Info는 kind 13194, 요청은 23194, 응답은 23195를 사용합니다. kind는 이벤트 종류를 뜻합니다. p 태그는 상대방을 나타내고, 응답의 e 태그는 원래 요청을 가리킵니다. 클라이언트는 서명, 예상한 서비스 키, 요청과의 연결, 그리고 결과가 속한 명령 이름인 result_type을 검증합니다. 릴레이의 아무 메시지나 확인으로 받아들여서는 안 됩니다. 그렇지 않으면 다른 사람의 응답이나 다른 작업의 응답을 이번 결제 결과로 오해할 수 있습니다. [1]

더 정확히 이해하려면 이 항목과 함께 다음도 읽어 보세요 Nostr, Lightning Network, BOLT 11, 지갑, Private Key, Satoshi. 다음 항목에서도 이 글을 참조합니다 Nostr, BOLT 11.

DOC · 001NWC — NIP-47: Core protocol명세 DOC · 002NWC — Project overview1차 출처 DOC · 003NWC — Optional specifications명세 DOC · 004Nostr — NIP-44: Encrypted payloads명세 DOC · 005NWC-02 — Notifications명세
개정일: 1차 출처 우선 · 투자 조언이 아닙니다