Reading text-only. View on full site →

내 노드가 거부할 수 있는 것

2026-10-15 · articles · ko

Bitcoin Core 30은 11년 동안 이어진 OP_RETURN 80바이트 기본 한도를 사실상 없앴고, 반대편은 Knots로 옮겨 가 소프트포크까지 시도했다. 정책과 합의라는 두 층의 차이, 양쪽 주장에서 각각 맞는 부분, BIP-110 체인 분리와 그 뒤의 하드포크, 지금 블록에 실제로 들어가는 데이터의 양, 그리고 노드 운영자가 고를 수 있는 것과 고를 수 없는 것을 정리한다.


2026년 8월 8일 19시 35분(UTC), 높이 961,632의 블록이 채굴됐다. 평범한 블록이었다. 그런데 이 블록을 받은 노드 일부는 그것을 거부했다. 블록 헤더에 정해진 신호 비트가 켜져 있지 않다는 이유였다. 거부한 노드들은 자기들 쪽에서 신호를 켠 블록이 나오기를 기다렸고, 그 사슬은 몇 블록 만에 멈추다시피 했다. 이틀 뒤 BIP 저장소의 편집자는 그 제안의 상태를 Closed로 바꾸며 이렇게 적었다. 새 사슬로 갈라졌고, 멈췄다.

갈라져 나간 것은 BIP-110이라는 소프트포크를 켠 Bitcoin Knots 노드들이었다. 이 일은 한 줄의 설정값에서 시작됐다. OP_RETURN 출력에 담을 수 있는 데이터의 기본 한도, 80바이트다.

출력 하나를 버리는 방법

비트코인 거래의 출력은 보통 누군가가 나중에 쓸 수 있는 돈이다. 출력 스크립트가 잠금 조건이고, 그 조건을 푸는 사람이 코인을 가져간다. 스크립트 언어의 OP_RETURN은 이 구조를 일부러 부순다. 스크립트가 이 명령을 만나면 그 자리에서 실패하니, OP_RETURN으로 시작하는 출력은 누구도 쓸 수 없다. 쓸 수 없다는 것이 증명되므로 노드는 이 출력을 UTXO 세트, 곧 아직 쓰이지 않은 코인 목록에 넣지 않아도 된다. 출력의 금액은 보통 0이고, 명령 뒤에 붙은 바이트는 그냥 블록체인에 남는 데이터가 된다.

이 장치가 생긴 이유는 데이터를 막지 못했기 때문이다. 2014년 이전에도 사람들은 블록체인에 이미지와 문서를 넣었다. 가짜 주소로 소액을 보내 주소 자리에 데이터를 적는 방식이었다. 그런 출력은 누구도 쓸 수 없지만 노드는 그것을 증명할 길이 없으니, UTXO 세트에 영원히 남는다. 모든 풀노드가 메모리 가까이 들고 다녀야 하는 목록이 쓰레기로 불어나는 것이다.

2014년 3월 19일에 나온 Bitcoin Core 0.9.0이 처음으로 OP_RETURN 출력을 표준으로 중계했다. 릴리스 노트는 오해를 막으려고 따로 한 단락을 썼다.

This change is not an endorsement of storing data in the blockchain. The OP_RETURN change creates a provably-prunable output, to avoid data storage schemes - some of which were already deployed - that were storing arbitrary data such as images as forever-unspendable TX outputs, bloating bitcoin's UTXO database.

이 변경은 블록체인에 데이터를 저장하라는 승인이 아니며, 이미 쓰이고 있던 영원히 쓸 수 없는 출력 대신 지워도 되는 출력을 주려는 것이라는 뜻이다. 노트는 이어서 블록체인에 임의 데이터를 저장하는 것은 여전히 나쁜 생각이라고 덧붙였다. 한도는 처음에 80바이트로 병합됐다가 출시 직전 40바이트로 줄었고, 0.11.0(2015년)에서 다시 80바이트가 됐다. 0.12.0(2016년)부터는 출력 스크립트 전체를 기준으로 80바이트에 명령 몇 바이트를 더한 83바이트를 쟀다.

그 사이 0.10.0(2015년)에 설정 두 개가 들어갔다. OP_RETURN 중계 자체를 끄는 -datacarrier와 크기 한도를 바꾸는 -datacarriersize다. 두 옵션을 만든 사람은 Luke Dashjr였다. 2014년 그가 낸 PR의 설명은 짧다. 채굴자들이 통제하고 싶어 하는 것으로 보인다는 것이다. 11년 뒤 이 옵션은 논쟁의 한가운데에 선다.

막는 규칙과 받아 주는 규칙

이 논쟁을 읽으려면 노드가 가진 규칙이 두 층이라는 것부터 알아야 한다.

아래층은 합의 규칙이다. 블록이 유효한지를 정한다. 2,100만 개 상한, 서명 검증, 블록 무게 한도 같은 것들이다. 합의 규칙을 어긴 블록은 모든 노드가 거부하고, 이 규칙을 바꾸려면 소프트포크나 하드포크가 필요하다.

위층은 정책, 흔히 표준성(standardness)이라고 부르는 규칙이다. 아직 블록에 들어가지 않은 거래를 내 멤풀에 받아 둘지, 이웃 노드에 전달할지를 정한다. 최소 수수료율, 거래 크기, 그리고 OP_RETURN 크기가 여기에 속한다. 정책은 노드마다 다를 수 있고, 바꾸는 데 아무의 동의도 필요 없다.

중요한 사실은 OP_RETURN 크기에 합의 규칙상의 한도가 한 번도 없었다는 것이다. 80바이트를 넘는 OP_RETURN이 든 블록도 처음부터 유효했다. 80바이트 한도는 그런 거래를 "내 멤풀에 받지 않고 남에게 전하지 않겠다"는 뜻일 뿐, 채굴자가 그 거래를 블록에 넣으면 모든 노드는 그 블록을 받아들이고 저장했다. 정책은 거래가 채굴자에게 가는 길을 좁힐 수 있지만, 채굴된 뒤의 운명은 바꾸지 못한다.

2025년 봄에 일어난 일

2025년 4월 17일, Antoine Poinsot가 비트코인 개발자 메일링 리스트에 OP_RETURN 표준성 제한을 풀자는 글을 올렸다. 계기는 Citrea라는 프로젝트의 브리지였다. 이 브리지는 80바이트로는 모자라는 데이터를 비트코인에 남겨야 했고, 그래서 쓸 수 없는 탭루트 출력에 데이터를 나눠 담고 있었다. 0.9.0이 막으려던 바로 그 방식, UTXO 세트를 영원히 불리는 방식으로 돌아간 것이다. Poinsot의 논리는 이랬다. 한도가 쓸모 있는 일을 막지는 못하고, 데이터를 더 해로운 자리로 밀어낼 뿐이다.

열흘 뒤 Peter Todd가 한도와 설정 옵션을 통째로 지우는 PR을 냈다. 그는 이 한도가 쉽게 우회된다고 적었다. MARA의 Slipstream처럼 채굴자에게 거래를 직접 보내는 서비스가 있고, 한도 없이 중계하는 Libre Relay 같은 포크도 있다는 것이었다. 이 PR은 옵션을 남겨 두자는 의견이 모이면서 5월 12일 병합되지 않고 닫혔다. 대신 Greg Sanders가 낸 다른 PR이 6월 9일 병합됐다. 옵션은 남기되 기본값을 사실상 무제한으로 올리는 안이었다.

그 사이인 6월 6일, Bitcoin Core 기여자 31명이 중계 정책에 관한 공동 성명을 냈다.

Knowingly refusing to relay transactions that miners would include in blocks anyway forces users into alternate communication channels

채굴자가 어차피 블록에 넣을 거래를 알면서도 중계하지 않으면 사용자를 다른 통신 경로로 내몬다는 뜻이다. 성명은 이것이 비금융 데이터 사용을 지지하거나 용인하는 것이 아니라고 밝혔다. 0.9.0의 릴리스 노트와 같은 단서다.

옵션의 운명은 한 번 더 흔들렸다. 병합된 PR은 두 옵션을 폐지 예정(deprecated)으로 표시했는데, 이것이 나중에 노드 운영자의 선택권 자체를 없애려는 것으로 읽히며 반발을 키웠다. 9월 30일 폐지 예정 표시를 거두는 PR이 병합됐고, 이 수정은 출시판에도 들어갔다.

2025년 10월 10일 Bitcoin Core 30.0이 나왔다. 릴리스 노트의 해당 대목은 이렇다.

-datacarriersize is increased to 100,000 by default, which effectively uncaps the limit (as the maximum transaction size limit will be hit first). It can be overridden with -datacarriersize=83 to revert to the limit enforced in previous versions.

기본값이 100,000바이트로 올라 거래 크기 한도에 먼저 걸리니 사실상 한도가 없어진다는 것, 그리고 -datacarriersize=83을 주면 예전 한도로 돌아간다는 것이다. 한 거래에 OP_RETURN 출력을 여러 개 두는 것도 이때부터 허용됐고, 한도는 모든 OP_RETURN 출력의 합계에 적용된다.

양쪽이 각각 맞는 것

Core 쪽의 주장은 대부분 비용 계산이다. 세그윗 이후 증인(witness) 데이터는 무게를 4분의 1로 쳐 준다. 오디널스 인스크립션이 증인에 데이터를 넣는 이유가 이것이다. OP_RETURN은 출력에 있으니 같은 데이터를 넣는 데 네 배가 든다. 한도를 풀어도 데이터를 넣는 가장 싼 방법은 여전히 증인이고, 한도를 지켜도 그 길은 막히지 않는다. 한도가 막는 것은 OP_RETURN을 써야만 하는 경우뿐인데, 그런 사용자는 가짜 공개키나 쓸 수 없는 출력으로 옮겨 가 UTXO 세트를 불린다. 또 채굴되는 거래를 노드가 미리 받아 두지 못하면 손해가 생긴다. 새 블록이 오면 노드는 멤풀에 이미 있는 거래를 빼고 나머지만 받아 블록을 재구성하는데(compact block), 모르는 거래가 많을수록 전파가 느려진다. 수수료 추정도 실제 블록과 어긋난다. 채굴자에게 직접 보내는 경로가 커지면 그 경로를 운영할 수 있는 큰 채굴자에게 유리해진다.

Knots 쪽의 주장은 원칙에서 시작한다. Luke Dashjr는 Poinsot의 첫 글에 "utter insanity"라고 답했다. 고쳐야 할 것은 버그이지 남용을 받아들이는 것이 아니라는 것이다. 데이터 넣기가 실제로 우회된다고 해서 그것을 표준으로 인정하면, 비트코인이 데이터 저장소로 쓰여도 된다는 신호를 준다. 노드를 돌리는 사람은 자기 디스크에 저장되고 자기 회선으로 전달되는 것을 고를 권리가 있다. 불법 콘텐츠를 저장하게 될 법적 위험도 거론됐다. 이 위험에 대해서는 이미 증인과 유료 우회 경로로 가능한 일이라 한도와 무관하다는 반론, 법률가들이 과장된 우려라고 본다는 보도가 함께 나왔다.

두 주장은 서로 다른 질문에 답한다. Core는 "한도가 데이터를 줄이는가"를 물었고, 답은 거의 그렇지 않다였다. Knots는 "비트코인이 데이터를 환영하는가"를 물었고, 답은 아니다였다. 오디널스 논쟁이 그랬듯, 양쪽은 같은 사실을 보고 서로를 무책임하다고 불렀다.

정책에서 합의로

Core 30이 나올 무렵 Knots를 돌리는 공개 노드의 비율은 크게 올라 있었다. 집계 사이트들은 2025년 9월 한때 20%를 넘었다고 보고했다. 그러나 노드 수는 블록에 무엇이 들어갈지를 정하지 못한다. 그것은 채굴자가 정하고, 채굴자에게는 정책 필터를 우회하는 길이 열려 있다. 정책으로 지는 싸움을 합의로 옮기자는 제안이 나온 것은 그래서다.

BIP-110 「Reduced Data Temporary Softfork」는 2025년 12월 번호를 받았다. 1년 동안 한시적으로 합의 규칙을 좁히는 안이다. 새 출력 스크립트는 34바이트까지(OP_RETURN은 83바이트까지), 데이터를 미는 명령과 증인 항목은 256바이트까지로 묶고, 탭루트의 annex와 OP_SUCCESS, 스크립트 안의 OP_IF 실행을 무효로 한다. 활성화 이전에 만들어진 코인은 이 규칙에서 빠진다. 문서는 이 제한이 BitVM 같은 계약을 어렵게 할 수 있고, 그런 용도는 소프트포크가 끝날 때까지 기다려야 할 수 있다고 스스로 적었다.

Knots는 2026년 5월 9일 29.3 판에 이 소프트포크를 넣었다. 설정에서 켜야 하는 방식이었고, 이를 뺀 판도 따로 냈다. 활성화 방식은 일정 기간 신호를 모으다가 의무 기간에 들어가면 신호 없는 블록을 거부하는 것이었다. 의무 기간 직전 2016블록 가운데 신호를 넣은 블록은 51개, 약 2.5%였고 모두 OCEAN 풀이 캔 것이었다. 의무 기간 첫 블록이 앞에서 말한 961,632다. 해시파워 대부분이 따르지 않는 소프트포크는 다수 사슬을 바꾸지 못하고, 그것을 강제하는 노드만 떨어져 나간다.

Knots의 다음 판은 거기서 한 걸음 더 갔다. 2026년 9월 2일에 나온 29.4.1의 릴리스 노트는 8월 8일의 일을 이렇게 묘사한다.

On August 8th, most former miners abandoned Bitcoin en masse and together with other bad actors have been falsely promoting a new altcoin as "Bitcoin".

대부분의 채굴자가 비트코인을 버리고 새 알트코인을 "비트코인"이라고 속여 홍보하고 있다는 것이다. 이 판은 작업증명 알고리즘을 SHA-256에서 BLAKE2b로 바꾸는 하드포크를 담았고, 같은 시점에 BIP-110 규칙을 켰다. 기존 채굴 장비로는 이 사슬을 캘 수 없게 만든 것이다. 노트는 이것이 13년 만의 하위 호환되지 않는 변경이라고 적었다. 어느 쪽이 떠났는가에 대한 답은 양쪽이 정반대로 내지만, 사실관계는 하나다. 이 판을 돌리는 노드는 이제 다른 사슬을 검증한다.

지금 블록에 들어가는 것

2026년 10월 14일 오전부터 15일 오전까지(UTC) 채굴된 블록 144개(971,383~971,526)를 직접 파싱해 세어 보면, 전체 거래 694,840개 가운데 83바이트를 넘는 OP_RETURN을 가진 거래는 877개였다. 가장 큰 것은 15,507바이트, 다 합쳐 약 727KB다. OP_RETURN 바이트는 할인 없이 1바이트에 4무게 단위로 치니, 하루 블록 공간(블록당 400만 무게 단위)의 0.5% 남짓이다. 풀별로는 Foundry 332건, F2Pool 237건, ViaBTC 129건, SpiderPool 80건, MARA 67건이었고, AntPool은 31블록을 캐는 동안 0건이었다. 큰 OP_RETURN을 받는지는 풀마다 다르다. 이것 역시 정책이다.

노드 쪽 숫자는 세는 방법에 따라 다르다. 같은 날 coin.dance는 연결을 받는 공개 노드 25,453개 가운데 Knots를 4,074개(16.0%)로 집계했고, Luke Dashjr가 운영하는 집계는 연결을 받지 않는 노드 추정치까지 넣어 약 105,000개 중 12.8%로 보았다. 그 Knots 노드 가운데 BLAKE2b 하드포크 판을 돌리는 노드를 비트코인 노드로 셀지는 해석의 문제다. Bitcoin Core의 최신판은 2026년 7월 8일의 31.1이고, 31.0에는 OP_RETURN 정책 변경이 없었다.

내 노드가 고를 수 있는 것

노드를 직접 돌리는 사람에게 이 이야기가 남기는 것은 구체적이다.

Core 30 이후에도 -datacarriersize=83을 설정 파일에 적으면 예전 한도로 돌아간다. 폐지 예정 표시가 거둬졌으니 당분간 없어질 옵션도 아니다. 이 설정이 하는 일은 정확히 두 가지다. 큰 OP_RETURN 거래를 내 멤풀에 받지 않고, 이웃에게 전하지 않는다. 그 거래가 다른 경로로 채굴되면 내 노드는 그 블록을 받아 검증하고 저장한다. 블록이 올 때 그 거래를 새로 내려받아야 하니 블록 재구성이 조금 느려지고, 수수료 추정도 실제 블록과 조금 어긋난다. 디스크가 걱정이라면 한도보다 프루닝(prune)이 직접적인 수단이다. 오래된 블록을 지워 디스크 사용량을 정한 크기 아래로 묶는다.

정책은 내 멤풀을 지키고, 합의는 모두의 장부를 지킨다. 2014년 Luke Dashjr가 만든 옵션은 각자가 자기 멤풀을 고르게 해 주었고, 2025년 Core가 바꾼 것은 그 옵션의 기본값이었다. 2026년 BIP-110은 그 선택을 모두에게 강제하려 했고, 그러려면 해시파워가 따라와야 했다. 따라오지 않자 남은 길은 다른 사슬뿐이었다. 블록 크기 전쟁 때처럼, 비트코인의 규칙은 누군가 정해서 바뀌지 않고, 노드와 채굴자와 사용자가 각자 무엇을 돌리느냐로 정해진다. 내 노드가 거부할 수 있는 것은 내 노드로 들어오는 것뿐이다.

Read on the full site: https://learn.txid.uk/ko/articles/op-return-debate/