저자: ZmnSCPxj
출처: https://delvingbitcoin.org/t/towards-ak-of-n-lightning-network-node/2395
소개
최근 " Nested MuSig2 " 논문이 발표되면서, 우리는 라이트닝 네트워크를 통합한 다중 서명 자체 보관 지갑을 만들 수 있을지 생각해 보기 시작했습니다.
구체적으로, 우리가 달성하고자 하는 것은 "심플 탭루트 채널"( PR995 ) 내에서 "중첩된 MuSig2"를 사용하여 원활한 다중 서명 라이트닝 네트워크 노드를 생성하는 것입니다.
하지만 먼저 이것을 생각해 보세요. 최종 사용자가 "k-of-n 멀티 서명 지갑을 원합니다"라고 말할 때 정확히 무엇을 의미하는 걸까요?
저는 최종 사용자의 핵심 요구사항이 다음과 같다고 생각합니다.
"k-of-n 다중 서명"에 관해 제가 바라는 것은, 만약 제가 N개의 기기를 소유하고 있다면, K개 미만의 기기가 해킹당하는 한 제 자금이 안전하다는 것입니다. 설령 일부 기기를 복구 불가능하게 분실하더라도, 해킹당한 기기의 수가 (N - K + 1)개 미만인 한 저는 계속해서 자금을 사용할 수 있기를 바랍니다.
어떻게 하면 이러한 열망을 실제 시나리오에서 "라이트닝 네트워크 지갑"으로 구현할 수 있을까요?
블록체인 내의 지갑은 스크립트를 사용하여 k-of-n 요구사항을 직접 표현할 수 있어 매우 간단하지만, 라이트닝 네트워크 지갑은 그렇지 못합니다. 라이트닝 네트워크 채널은 추가적인 복잡성을 가지고 있습니다. 이러한 복잡성 으로 인해 라이트닝 네트워크 BOLT 프로토콜을 수정해야 하며 , 이는 k-of-n 라이트닝 네트워크 지갑 자체뿐만 아니라 해당 채널(k-of-n 다중 서명을 지원할 수도 있고 지원하지 않을 수도 있음)에도 적용됩니다.
즉, k-of-n 멀티시그니처 라이트닝 월렛을 사용하려는 최종 사용자는 다음 조건을 충족해야 합니다.
- 수정된 라이트닝 네트워크 BOLT 프로토콜이 널리 채택되기를 기다리 거나 ,
- 이들은 게이트웨이 노드로부터 서비스를 받습니다(이 노드들은 개인 정보 보호 및 포워딩 수수료 수익 감소를 감수하고 수정된 라이트닝 네트워크 BOLT 프로토콜을 "일찍" 구현했습니다).
K-of-n 멀티시그니처 라이트닝 네트워크 노드의 주요 사용 사례는 대량 자금을 보유한 HODLer가 저축액을 활용하여 라이트닝 네트워크에 유동성을 공급함으로써 항상 안전성과 복원력을 보장하는 것입니다.
(역자 주: "HODLer"는 "holder"에서 파생된 문화적으로 중요한 용어입니다. 이하에서는 "holder"로 번역하겠습니다.)
하지만 수정된 라이트닝 네트워크 BOLT 프로토콜이 널리 채택되기 전까지는, 이러한 대규모 k-of-n 멀티시그니처 노드는 게이트웨이에만 연결할 수 있으며, 게이트웨이는 수정된 프로토콜과 아직 업그레이드되지 않은 네트워크 사이의 간극을 메워줍니다. 당연히 이러한 게이트웨이 노드는 수수료를 부과할 것이며, 부과 방식은 다양할 것입니다. 수수료를 부과하지 않는 게이트웨이 노드는 헤비홀더들로 인해 가용 유동성이 빠르게 고갈될 것입니다. 게이트웨이 노드 자체도 헤비홀더가 아니라면 유동성이 많지 않기 때문입니다. 하지만 헤비홀더라면 (우리의 가정에 따르면) 멀티시그니처 장치를 사용하고 싶어 할 것이고, 이는 역시 수정된 프로토콜을 지원하는 게이트웨이를 필요로 할 것입니다.
따라서 우리가 논의하는 적용 시나리오를 지원하기 위해서는, 수정된 프로토콜의 도입을 촉진하기 위해 프로토콜을 "조기에" 수정해야 하며, 이를 통해 대량의 암호화폐를 보유한 사람들이 자신의 저축을 활용하여 유동성을 공급할 수 있도록 해야 합니다.
신뢰도가 낮은 채널 적대자
일부에서는 "라이트닝 네트워크는 피해자가 키를 잃기 전에 채널 공격자도 먼저 해킹당해야 하므로 실제로 더 안전하다"고 주장할 수 있습니다.
이 생각 또한 매우 잘못되었습니다.
올바른 생각은 "터널 안의 상대방이 당신을 방해하기에 가장 좋은 위치를 차지했으므로, 터널 안의 상대방을 더욱 경계해야 한다"는 것입니다.
구체적으로 다음과 같은 상황을 상상해 보세요. 만약 여러분이 라이트닝 네트워크에 유동성을 제공하고 거래 수수료를 받고 싶어하는 고액 암호화폐 보유자라면, 누구든 여러분과 채널을 개설해 주기를 바랄 것입니다. 다른 사람들이 여러분과 채널을 개설할수록 라우팅 수수료를 벌 수 있는 기회가 더 많아지기 때문입니다!
만약 인터넷상의 낯선 사람들이 대규모 라우팅 노드와 채널을 설정하는 것을 허용하지 않고 , 소수의 신뢰할 수 있는 주체만 채널을 설정하도록 허용한다면, 다음과 같은 결과가 나올 것이라고 확신합니다.
어떤 이유에서든, 신중하게 선정된 이러한 "신뢰할 수 있는" 중개 파트너는 유동성 임대료 형태로 귀하가 얻은 거래 수수료를 되돌려 받거나, 귀하의 유동성 활용률이 낮다는 것을 알게 될 수도 있습니다.
사실, YaiJBOjA 같은 인터넷상의 낯선 사람들(농담입니다, 절대 제가 아닙니다)이 당신과 채널을 개설하도록 허용 해야 합니다 . 이는 잠재적인 도둑들이 당신의 채널의 적이 될 수 있다는 것을 의미합니다. 다른 사람들이 당신을 표적으로 삼도록 허용하는 것입니다.
그러므로 로컬 서명자만 신뢰할 수 있다고 가정 해야 하며 , 채널 공격자를 검증할 필요가 없어집니다. 보안은 누군가 뒤에서 공격하더라도 도둑을 막을 수 있을 만큼 강력해야 하며, 채널 공격자는 최고의 도둑이므로 그들 에게 의존해서는 안 됩니다.
설령 공격자가 자신의 자금만으로 당신과 채널을 개설하더라도, 채널 내 자신의 잔액(당신을 통해) 자신이 제어하는 다른 노드로 전송한 후, 채널에서 자금을 훔칠 수 있습니다 (물론 공격자가 자신의 잔액 모두 소진한 후에, 채널에 있는 자금은 당신의 것입니다). 만약 공격자가 충분한 수의 서명 생성기를 무력화시키거나, 당신의 다중 서명 체계의 취약점을 악용할 수 있다면, 당신의 자금을 탈취할 수 있습니다.
따라서 "모튼의 포크"는 다음과 같은 모양입니다.
- 서명 생성기의 보안을 우선시하지 않으면 인터넷상의 낯선 사람들이 당신의 자산을 훔칠 가능성이 있습니다.
- 인터넷에서 낯선 사람과의 관계를 피한다면 유동성을 효과적으로 활용할 수 없습니다(우선 수익을 창출할 수 없고, 자신이나 타인에게 아무런 이득도 가져다주지 못한 채 인터넷 핫월렛에 돈을 넣어두는 꼴이 됩니다).
(역자 주: "모튼의 갈림길"은 어느 길을 택하든 결국 죽음으로 이어지는 딜레마를 의미합니다.)
따라서 "모든 라이트닝 네트워크 채널에서 단일 루트 서명자 사용"보다 더 나은 보안 태세가 필요합니다.
다중 서명은 추가적인 차원입니다.
"하지만 제 서명자는 '신뢰할 수 있는 실행 환경(TEE)'에 배치되어 있고, 이 실행 환경은 '보안 칩(SE)'에서 실행되며, 이 보안 칩은 '물리적으로 위조 불가능한 함수(PUF)'를 사용하여 구현되어 있지 않습니까?"라고 말씀하실 수도 있습니다.
무엇보다도, PUF는 단순히 내부에 내장된 개인 키를 생성하는 데 사용되는 안전한 주사위 굴리기 절차일 뿐입니다. 칩 제조는 완벽한 공정이 될 수 없고 항상 불완전성이 존재하기 때문에 모든 칩 제조업체가 필연적으로 제공하는 SE의 디버그 인터페이스에 접근할 수 있다면, PUF는 어떠한 보호 기능도 제공하지 못합니다. 불완전성을 감지할 수 있는 동일한 디버그 인터페이스를 사용하여 내장된 개인 키를 이용해 실행된 계산의 중간 결과를 추출할 수도 있습니다. 결국, 이러한 중간 계산 회로도 올바르게 제조되었는지 확인해야 합니다. 현실적으로 모든 계산을 단일 회로로 수행할 수는 없으므로 이러한 중간 결과를 저장하기 위해 "플립플롭"이 필요합니다(그렇지 않으면 거대 하고 따라서 비싸고 느린 회로가 필요하게 됩니다. 플립플롭에 저장된 중간 결과 덕분에 곱셈기나 덧셈기와 같은 동일한 범용 회로를 계산의 여러 부분에서 재사용할 수 있기 때문입니다). 이 플립플롭은 제조업체에서 제조된 칩의 오류를 확인하기 위해 디버그 인터페이스("스캔 체인"이라고 함, 직접 찾아보세요)의 일부로도 사용됩니다.
중간 계산 결과를 저장하는 이러한 플립플롭은 PUF(퍼지풀 필드)에 위치할 수 없습니다 . 왜냐하면 이러한 플립플롭과 그 안에 기록된 회로가 설계와 정확히 동일해야 하기 때문입니다 . 그렇지 않으면 칩의 신뢰성이 떨어지게 됩니다. 또한 PUF는 사람들이 실질적으로 복제할 수 없도록 의도적으로 고장률을 높이는 영역입니다!
따라서 이러한 중간 계산을 사용하면 내장된 개인 키를 추출할 때 추측해야 하는 비트 수를 줄일 수 있습니다.
게다가, 제조업체들이 앞서 언급한 "제조업체 디버그 인터페이스/스캔 체인"에 접근할 수 있다는 점을 알아두는 것이 중요합니다. 그렇지 않았다면 "제조업체"라는 용어 자체가 존재하지 않았을 것입니다. 당신은 제조업체들이 당신이 그토록 숭배하는 PUF에 내장된 개인 키를 읽을 능력이 없다고 정말로 생각하십니까? "보안 칩"이 없는 Trezor 서명기를 사용하는 것이 훨씬 낫습니다. 왜냐하면 거기에 내장된 개인 키는 동전을 던지거나 주사위를 굴려서 직접 생성할 수 있기 때문입니다. 동전, 주사위, 그리고 당신이 실제로 제어하고 이해할 수 있는 다른 하드웨어를 사용하여 작업을 수행할 수 있습니다.
"신뢰할 수 있는 법 집행 환경"은 "당신의 여동생을 차단"할 뿐, "권위주의 정부를 차단" 하지는 않습니다 .
(출처: 저는 LCD(액정 디스플레이) 디스플레이 드라이버 ASIC을 설계해 왔습니다. 그 전에는 ASIC을 역설계하는 일을 했었는데, 회로를 이해하기 위해 금속층 하나하나를 (말 그대로) 갈아내고 현미경으로 사진을 찍곤 했습니다. 대만의 주요 칩 제조업체들이 상위 3대 Verilog 시뮬레이터 소프트웨어(Mentor, Synaptic, 그리고 세 번째는 굳이 알고 싶지 않으시다면, 저희는 예전에 Synaptic에서 일했었습니다)를 사용해서 설계한 전자 논리 회로만 인정한다는 사실을 알고 계셨나요? 이 중 하나로 시뮬레이션 결과를 제출하지 않으면 제조 요청조차 고려하지 않습니다. 그들은 Icarus Verilog를 완전히 불신해서 , 그 이름을 언급하기만 해도 답장조차 하지 않습니다.)
따라서 하드웨어를 소유하는 것은 그것이 "신뢰할 수 있는 실행 환경"이든, "보안 칩"이든, "물리적으로 위조 불가능한 기능"이든 상관없이 항상 개인 키를 소유하는 것과 같습니다. "소송에서 10건 중 9건은 소유가 승소로 이어진다"는 사실은 변하지 않습니다. 하드웨어가 공개되면 개인 키도 함께 공개됩니다.
역자 주: "소유는 법의 9/10을 이긴다"는 말은 문자 그대로 "소유는 법의 9/10을 이긴다"는 뜻으로, 소유권 분쟁 소송에서 현재 소유자가 승소할 확률이 매우 높다는 것을 의미합니다. 저자는 이 비유를 통해 "하드웨어(서명 생성기)를 소유하는 것"의 중요성을 강조합니다. 서명 생성기를 손에 넣은 적이 개인 키를 추출하는 것을 절대적으로 막을 수 있는 방법은 사실상 없기 때문에, 가장 중요한 것은 서명 생성기를 안전한 곳에 보관하여 적이 입수하지 못하도록 하는 것입니다.
더욱이, 어떤 상황이든 간에, 예를 들어 시중에서 쉽게 구할 수 있는 부품으로 조립한 간단한 트레저 서명기처럼 "완벽한" 전자 기기를 가지고 있다고 하더라도 (이러한 부품은 정말 흔하고 워낙 흔해서 공급망을 교체할 생각을 아무도 하지 않을 것이기 때문에 의심을 사지 않을 것입니다), 다중 서명 방식을 사용하는 것이 여전히 더 유리합니다. 왜냐하면 도둑이 당신의 자금을 훔치려면 여러 대의 전자 기기를 훔쳐야 하기 때문입니다.
다중 서명은 "신뢰할 수 있는 실행 환경"(공급업체가 개인 키를 훔치지 않겠다고 약속하는 환경)을 기반으로 하는 "보안" 장치든, 사용자가 완전히 제어하는 실제 장치든 관계없이 장치에 추가적인 보안 차원을 더합니다.
이 글 서두에서 언급했듯이, 다중 서명은 "내 자금을 불안정하게 만들려면 k개의 기기를 해킹해야 한다"는 것을 의미합니다. 물론, 이를 달성할 수 있다는 전제 하에 말입니다.
서명 수가 더 적은 대안
라이트닝 네트워크에 광범위한 변경을 요구하는 것 외에도, 다중 서명의 이점을 얻을 수 있는 다른 방법들이 있습니다.
예를 들어, 각 라이트닝 채널에는 양쪽 끝에 각각 하나씩, 전용 공개 키 쌍이 있습니다.
라이트닝 네트워크 프로토콜 자체는 "루트" 키(또는 노드 ID)로부터 각 채널의 공개 키를 도출하는 특정 방식을 명시하지 않습니다.
따라서 N명의 서명자를 준비해 두고, 채널이 열릴 때마다 그중 한 명을 선택하여 해당 채널에서 사용할 공개 키를 지정할 수 있습니다. 채널에서 사용하는 공개 키는 노드 ID와 무관하므로, 각 채널마다 원하는 서명자를 자유롭게 선택할 수 있습니다.
이 기능은 현재 라이트닝 네트워크와 완벽하게 호환되므로 프로토콜 변경이 필요 없으며 PR995 병합을 기다릴 필요도 없습니다.
이 방식에서는 서명자가 N명이고 그중 한 명이 해킹당하더라도 전체 채널의 1/N만 위험에 노출됩니다. 이는 서명자가 한 명뿐인 경우( 모든 채널이 리스크 에 노출되는 상황)보다 여전히 개선된 것입니다.
다음은 이러한 접근 방식의 예입니다: rotating-signer-provider .
이 접근 방식은 리스크 분산시켜 주기 때문에 즉시 적용 가능하고 실용적입니다. 여러 노드를 사용하는 것과 유사하지만, 여러 명의 독립적인 서명자가 자금을 관리하는 단일 대형 노드를 구성할 수 있다는 점이 다릅니다. 일반적으로 대형 노드는 라우팅 효율성이 뛰어나고 네트워크상의 많은 노드에서 선호되므로 라우팅 수수료 수익이 증가합니다.
BOLT 변경: 취소 키
진정한 k-of-n 멀티시그니처 라이트닝 노드를 구현하기 위해 BOLT에 반드시 필요한 변경 사항은 원격 측에서 커밋된 각 트랜잭션에 대한 해지 키를 생성하기 위해 샤체인을 사용해야 하는 요구 사항을 제거하는 것입니다.
이것이 왜 필요한가요?
거래소 통해 관리하기로 약속 한 자금과 관련된 실제 온체인 계약이 어떻게 생겼는지 다시 한번 생각해 보세요.
- 둘 중 하나를 선택하세요:
- 모든 조건이 충족되었습니다.
- 은폐 약속 계약은 철저한 검증을 거쳤습니다(일반적으로 최대 2주 소요).
- 서명
- 모든 조건이 충족되었습니다.
- 상대방 서명
- 취소 키
- 모든 조건이 충족되었습니다.
여기서 두 번째 부분이 핵심입니다.
약정 거래는 자금을 되찾을 수 있는 유일한 방법입니다. 예를 들어, 도둑이 자신의 돈으로 당신과 채널을 개설하고, 채널의 잔액 자신이 관리하는 다른 노드로 보낸 다음, 자신의 도난 노드를 종료할 수 있습니다. 이 경우 도둑은 더 이상 잃을 것이 없습니다(1% 보증금은 제외하지만, 이는 도난 비용으로 간주할 수 있습니다). 따라서 반드시 약정 거래 를 사용해야 합니다 . 그렇지 않으면 자금이 안전하지 않으며 , 사용할 수 없게 됩니다.
"취소"란 무엇인가요?
라이트닝 채널에서 사용되는 용어 중 상당수는 혼란스러울 수 있습니다.
- 페널티는 상대방이 이전 상태를 사용하여 일방적으로 채널을 닫을 때 취할 수 있는 보복 조치를 의미합니다. 이는 상대방이 커밋먼트 트랜잭션을 브로드캐스팅하고 확인했지만, 해당 트랜잭션이 이미 취소 된 경우에 적용됩니다.
- 일방적 폐쇄란 상태를 브로드캐스팅하고 그것이 채널의 최신 상태라고 주장하는 것을 의미합니다. 만약 이전에 해당 상태를 취소 했다면 (즉, 실제로는 최신 상태가 아니므로 주장이 잘못된 경우), 불이익을 받을 수 있습니다.
- 상태를 취소한다는 것은 해당 상태가 더 이상 유효하지 않다는 데 동의하는 것을 의미합니다. 이는 적에게 충분한 정보를 제공하여, 취소된 상태를 악용하여 일방적으로 채널을 폐쇄 할 경우, 적이 나중에 당신을 처벌 할 수 있도록 합니다.
그렇다면 이러한 일들은 언제 일어났을까요?
- 취소 :
- 이는 상태가 변경될 때마다, 즉 HTLC가 채널에 추가되거나 채널에서 제거될 때마다 발생합니다.
- 예를 들어, 현재 상태가 N이라고 가정해 보겠습니다. 당신과 상대방 모두 N+1로 이동하기로 동의했습니다. 이 과정을 "교대 핸드"라고 합니다.
- 상대방의 시그니처 상태는 N+1입니다.
- 이 시점에서 상태 N과 상태 N+1 모두 유효하며, 두 상태 모두 불이익 없이 일방적으로 채널을 폐쇄하는 데 사용할 수 있습니다.
- "손을 번갈아 잡는다"는 비유를 들자면, 지금 당신은 두 손으로 밧줄을 잡고 한 손은 위로, 한 손은 아래로 잡은 채 위로 올라가고 있습니다. 통로 안에서 전진할 때도 마찬가지입니다.
- 기존 상태 N을 취소합니다.
- 이 작업은 당신을 N+1 상태에 돌이킬 수 없이 고정시킵니다 . 왜냐하면 이제 N+1 상태만이 유일하게 유효한 상태이기 때문입니다.
- "손을 번갈아 쓰는" 비유를 들자면, 풀 때 아래쪽 손을 놓는 것과 같습니다.
- 상대방의 시그니처 상태는 N+1입니다.
- 어떤 시점이든 취소되지 않은 상태는 최대 두 개까지 존재할 수 있으며, 대부분의 경우 취소되지 않은 상태는 하나만 존재합니다.
- 일측 폐쇄 :
- 이는 약정 계약에 서명하기로 결정했을 때 발생합니다. 즉, 일반적인 대면 서명 절차에서 상대방의 서명에 자신의 서명을 더하고 이를 공개하는 것입니다.
- 오래된 상태 거래(및 해당 서명)를 재사용하는 것을 막을 수 있는 강력한 암호화 메커니즘은 없으며, 오직 한 가지 경제적 유인책만 존재합니다. 즉, 이미 취소한 오래된 커밋먼트 거래를 계속 사용하는 한, 채널에 있는 모든 자금을 잃게 되는 불이익을 받게 됩니다.
- 처벌하다 :
- 상대방이 이전(미완료) 상태로 채널을 닫는 것을 발견했을 때.
문제는 "일방적 폐쇄"나 "벌칙"이 아니라 "취소" 작업에 있습니다.
되돌리기 작업에는 "되돌리기 키"라는 것을 공격자에게 전달하는 과정이 필요합니다. 공격자는 자신의 서명과 이 되돌리기 키를 사용하여 일방적인 폐쇄에 대한 책임을 물어 이전 상태를 무효화할 수 있습니다.
K-of-N 폐지 키 문제
자, 한번 생각해 보세요.
- k-of-n 멀티시그니처 장치가 있다고 가정해 봅시다.
- 각 확정된 트랜잭션에 대한 해지 키를 어떻게 생성하나요?
- 공격자가 최신 인증서 폐기 키를 훔치려면 몇 대의 기기를 해킹해야 할까요?
이와 관련하여 가장 중요한 질문은 바로 " 폐기 키는 정확히 어떻게 생성되는가 ?"입니다.
답은 BOLT 사양을 참조하라는 것입니다. BOLT 사양에는 shachian을 사용해야 한다고 명시되어 있습니다.
문제는 이름에서 알 수 있듯이 shachain이 SHA2("sha")("chain")를 반복적으로 적용한다는 점입니다.
k-of-n SHA2 함수를 만드는 것은 불가능합니다. SHA2는 선형이 아니므로 k=n인 경우에도 k-of-n SHA2 함수를 만드는 것은 불가능합니다 .
설령 어떤 불가사의한 암호화 기술(비트 0과 1을 "동형 커밋먼트"로 인코딩하는 가상 회로를 사용하는 것)을 통해 k-of-n SHA2 함수를 생성하는 것이 가능하다고 하더라도, 샤체인의 중간 결과(즉, 반복 과정 중 SHA2 의 출력)를 보유하는 것 또한 마찬가지로 위험합니다. 왜냐하면 그것 역시 샤체인 반복 과정의 중간 결과이며, 결국에는 폐지 키가 되기 때문입니다 .
이러한 가상 회로는 반복을 통해 구현되므로 가상 회로의 여러 참여자가 중간 결과를 알 수 있습니다. 이러한 가상 회로 방식은 루트 입력만 보호하고 중간 결과는 보호하지 않습니다.
문제는 샤체인의 중간 결과가 바로 폐지 키라는 점입니다! 가상 회로는 폐지 키 체인의 루트를 보호하기 위해 0과 1로 이루어진 동형 암호화를 사용하는데, 이는 반복 과정의 중간 결과가 드러나야 하므로 무의미합니다. 이러한 중간 결과들이 바로 폐지 키 시퀀스를 구성하며 , 이 시퀀스에서 가장 최근 상태에 대한 폐지 키가 그중 하나입니다.
이러한 중간 결과를 보호하려면 전체 샤체인 반복 과정을 펼쳐서 거대한 가상 회로로 구현해야 합니다. 더 심각한 문제는 샤체인에서 중간 결과를 계산할 때마다 다른 가상 회로를 펼쳐야 한다는 것입니다. BOLT 사양에 따르면 이러한 계산 횟수는 최소 2¹⁰회에서 최대 2⁴⁸회에 달할 수 있습니다.
따라서, 다자간 연산을 포함하는 가상 회로 방식은 실현 가능하지 않을 수 있습니다.
(경고: 저는 암호학자가 아닙니다. 위의 내용에 대해서는 동형 암호화 및 다자간 연산에 대해 진정으로 이해하는 암호학자와 상담하십시오. 또한, 저는 샤체인에서 다자간 연산을 사용하지 않을 것입니다. 왜냐하면 제대로 작동하지 않을 것이라고 생각하며, 제 암호학 전문 지식으로는 실현 가능한 해결책을 찾기에 충분하지 않기 때문입니다.)
다시 한번 정리해 보겠습니다.
"k-of-n 다중 서명"에 관해 말씀드리자면, 제가 N개의 기기를 소유하고 있을 때 K개의 기기가 해킹당하지 않는 한 제 자금이 안전하게 보호되기를 바랍니다.
샤체인 반복의 루트 값이 모든 서명자에게 알려져 있다면, 그중 한 명이라도 해킹당할 경우(단 한 명 이라도 해킹당하면) 채널 공격자는 채널의 모든 자금을 직접 탈취할 수 있으므로 앞서 언급한 기대가 무너지게 됩니다.
샤체인 반복의 루트 값이 모든 서명자에게 알려지지 않고 k명의 서명자에게 분산되어 있는 경우, 어떤 장치가 반복적인 샤체인 반복을 실행하고 해지 키를 공격자에게 제공하게 될까요? 루트 키(또는 중간 상태)를 보유한 이 장치 하나가 손상되면, 해당 장치는 최신 해지 키를 보유한 것과 마찬가지가 되어 자금 탈취가 가능해집니다.
다시 한번 강조하지만, "k-of-n"의 중요성은 도둑이 최소한 k개의 장치를 해킹 해야 한다는 점에 있습니다. 단 하나의 장치만 해지 키를 보유하고 있더라도, 설령 일시적이라 할지라도, 해당 장치 하나만 해킹당해도 절도가 가능해집니다. 따라서 윤리적인 관점에서 볼 때, 이는 최종 사용자가 "k-of-n"이라고 말할 때 기대하는 바가 아니므로 "k-of-n 다중 서명"이라고 부를 수 없습니다 .
따라서 샤차인은 BOLT 사양에서 제거되어야 합니다.
BOLT 수정 제안
저는 " no_more_shachains "라는 이름의 " 특징 비트" 쌍을 추가할 것을 제안합니다. 이는 globalfeatures 특징 또는 localfeatures 특징이 될 수 있습니다.
- 특이사항: 공격자에 대한 샤체인 검증은 수행하지 않지만, 유효한 샤체인 폐지 키는 공격자에게 제공합니다.
- 이는 기존 샤체인을 계속 기대하고 업그레이드하지 않는 노드에 대한 하위 호환성을 제공합니다.
- 즉, 저장 공간을 O(1) 수준으로 압축하기 위해 shachain 가속 구조를 사용하는 대신 모든 해지 키를 저장한다는 의미입니다.
- 이를 통해 샤체인을 사용하지 않는 노드도 저와 채널을 개설할 수 있으며, 저 또한 샤체인을 필요로 하는 노드와 이러한 노드를 연결할 수 있습니다.
- 짝수 비트: 저는 유효한 샤키안 폐지 키를 제공하지 않을 것이며, 공격자가 제공한 샤키안 폐지 키의 유효성도 검증하지 않을 것입니다.
이 globalfeatures 비트는 k-of-n 멀티시그니처 노드가 안전하게 채널을 설정할 수 있는 다른 노드를 식별할 수 있도록 합니다. " BOLT8 연결 생성"은 "채널 생성"을 의미하는 것이 아니라, k-of-n 노드가 BOLT8 연결을 설정하고 가십 그래프를 다운로드한 다음 globalfeatures 에서 no_more_shachains 검색하는 것을 의미합니다.
그러면 k-of-n 라이트닝 노드는 짝수 비트를 활성화할 수 있고, 게이트웨이 노드는 홀수 비트를 활성화할 수 있습니다. 궁극적으로는 모든 노드가 최소한 홀수 비트를 활성화하고, 1-of-1 라이트닝 노드를 포함하여 그 사이에 짝수 비트를 사용하는 것이 목표입니다.
위 설계는 "홀수 비트 유지"라는 철학을 따릅니다. 즉, 기존 노드는 홀수 비트는 활성화되어 있지만 짝수 비트는 비활성화된 노드와도 상호 운용이 가능합니다. 홀수 비트가 활성화된 노드는 짝수 비트가 필요한 노드와도 상호 운용할 수 있습니다. k-of-n 노드는 짝수 비트 활성화가 필요하지만, 홀수 비트가 활성화된 노드와도 상호 운용이 가능합니다.
참고로, 홀수 비트만 활성화하더라도 기록이 긴 채널의 저장 용량이 세 배로 늘어나지만 , 채널 스플라이싱을 통해 이 데이터를 줄일 수 있습니다.
점유 공간이 세 배로 늘어난 이유는 다음과 같습니다.
- 고정된 약정 트랜잭션을 사용하면 상태 변경의 유일한 형태는 HTLC를 추가하고 제거하는 것입니다.
- 따라서 각 HTLC는 두 가지 상태 변화를 유발합니다.
- 각각의 과거 HTLC는 약 32바이트의 해시 데이터로 구성됩니다.
- 각 상태 변경에는 추가적인 해지 키가 필요합니다.
- 샤체인 방식은 일정한 양의 저장 공간만 필요로 하지만, 이 방식을 포기하면 선형적으로 증가하는 저장 공간이 필요하게 될 것입니다.
- 각 해지 키는 약 32바이트의 데이터로 구성됩니다(초기에는 공개 키이지만, 해지 후에는 공개 키를 개인 키로 대체할 수 있습니다).
- 따라서 HTLC를 저장하려면 해시 값을 저장하는 데 32바이트, 이 HTLC를 추가하는 커밋 트랜잭션에 대한 해지 키를 저장하는 데 32바이트, 그리고 이 HTLC를 제거하는 커밋 트랜잭션에 대한 해지 키를 저장하는 데 또 32바이트가 필요합니다.
- 이전에는 샤체인을 사용할 때 이 해시 값을 저장하는 데 32바이트만 필요했으므로 최종 채널 기록을 위한 저장 공간은 3배로 늘어납니다.
문제 없습니다: MuSig2 Nonce 알림
MuSig2는 2단계 프로토콜입니다.
- 1차 라운드에서는
R에 대한 투자가 교환되었습니다. - 그다음, 조각
s교환합니다.
구체적으로 말하자면, 탭루트 채널에서 "조각 서명 s 교환"하는 과정은 실제로 한쪽 당사자가 다른 쪽 당사자에게 조각 서명 s 보내는 것일 뿐입니다. 다른 쪽 당사자는 이 조각 서명 s 자신의 하드 드라이브에 저장합니다. 만약 다른 쪽 당사자가 이 상태를 이용하여 일방적으로 채널을 닫기로 결정하면, 자체적으로 s 생성하고, 두 서명을 합쳐 최종 서명 R, s 생성한 다음, 해당 서명과 트랜잭션을 블록체인에 브로드캐스트합니다.
중첩된 MuSig2 또한 기본적으로 동일한 2라운드 프로토콜이며, 중첩된 서명자는 각 라운드를 내부적으로 완료하고 결과를 집계 및 결합한 다음 상위 레벨에서 정보 교환을 수행합니다.
두 번의 서명 라운드가 있기 때문에 PR995는 다음 서명 세션에서 R 에 대한 nonce 입력을 보내기 위해 현재 교환 s 언제 사용해야 하는지 명시합니다. 이는 통신 왕복 횟수를 줄여주는데, 이는 지연 시간을 고려할 때 호주에 있는 동료들에게 중요한 사항입니다.
K-of-N의 MuSig2?
MuSig2(및 "중첩된 MuSig2")는 n-of-n 서명 프로토콜로 설계되었지만, "k-of-n" FROST 프로토콜은 실제로 MuSig2 서명 프로토콜의 여러 부분을 서명 과정에서 활용하는 검증 가능한 샤미르 비밀 분할 방식이라는 점을 지적하고 싶습니다. 즉, MuSig/MuSig2 키 조합 함수(MuSig2 서명 프로토콜과는 달리)를 사용하는 대신, FROST는 자체적인 다자간 계산 방식을 사용하여 저장해야 하는 일련의 "조각"을 생성합니다. 이 조각들은 각각 공동 서명자 한 명씩에 해당하며, 여기에 자신의 키 조각과 공동 공개 키가 포함됩니다.
FROST는 서명 시 MuSig2와 매우 유사한 방식을 사용합니다(따라서 메커니즘 관점에서 FROST와 "중첩된 MuSig2"를 결합하는 것이 가능 해야 합니다 . 그러나 "중첩된 MuSig2"의 보안 증명을 FROST-in-MuSig2로 확장할 수 있다고 보장할 수는 없습니다!).
서명할 때 온라인 서명자(k명의 공동 서명자)를 찾아야 하며, 모든 온라인 서명자는 MuSig2 서명 체계에 따라 R 에 대한 첫 번째 라운드 입력을 생성하고 서로 교환한 다음 두 번째 라운드 조각 서명 s 를 생성합니다.
문제는 PR995 제안에서 현재 서명 세션에 대한 두 번째 조각 서명 s 보낼 때마다 다음 서명 세션을 준비하기 위해 R 에 입력을 보내야 한다는 것 입니다.
예를 들어 다음과 같은 상황을 가정해 보겠습니다.
- 앨리스, 밥, 캐롤 이렇게 세 명의 서명자가 있으며, 이들은 2-of-3 라이트닝 노드를 구성합니다.
- 현재 서명 세션에서 앨리스와 밥은 온라인 상태입니다. 그들은
R에 대한 입력을 생성하고 처리한 다음, 결합된 결과를 공격자에게 보냅니다. - 하지만 다음 계약 체결 전에 앨리스는 마침내 닥쳐온 로봇 반란 중에 길을 잃은 총알에 맞아 사망했습니다.
- 밥이 캐럴을 깨웠다.
- 캐롤은 앨리스가 사용하는 비밀 논스 값을 모르기 때문에 앨리스와 밥의 논스를 합친 값을 사용하여 서명할 수 없습니다.
다행히 PR995 제안에서는 상대방이 다음 서명이 소멸될 때까지 nonce 입력값을 기억해야 한다고 명시하고 있지만, BOLT8 연결이 끊어지면 이 nonce는 폐기됩니다. 연결이 다시 설정되면 channel_reestablish 메시지를 전송하여 새로운 nonce를 보낼 수 있습니다.
따라서 위 시나리오에서 Bob과 Carol은 로봇의 반란을 무시하고 서명을 계속할 수 있습니다. 즉, 상대방 측에 직접 다시 연결한 다음, 미리 결합된 새로운 Bob+Carol nonce를 강제로 사용하게 하는 것입니다.
따라서, 본 논문에서 제시하는 k-of-n 다중 서명 방식에서는 논스 입력 라운드가 문제가 되지 않습니다.



