요즘은 한글로 블록체인 정보를 접하기 쉬워졌습니다. 블록체인 미디어는 물론이고, 슈퍼블록과 웨이브릿지 뉴스레터를 감사히 보고있습니다. 트위터에서 여러분이 블록체인을 풀어서 설명하며 a41과 쟁글도 빼놓을 수 없구요. 그럼에도 미사어구 속에서 판단은 여전히 어렵습니다. 논스클래식 영상을 보면 여러 프로젝트의 장점를 소개하며 엔지니어가 아니기 때문에 정확히는 모르겠다는 말을 하지만, 사실 엔지니어도 모르기는 마찬가지입니다. STM을 아는 소프트웨어 엔지니어가 얼마나 될까요. 2017년 합의 알고리즘 경연대회는 영지식 증명으로 옷을 갈아입었습니다. 정말로 하겠다는게 가능한지 가능하다면 저 팀이 할 수 있는지 파악하기는 어렵습니다.
뭘 발표할까 고민하다 이렇게 남들이 안하는 이야기를 꺼내는 것도 의미있겠다 생각이 들었습니다. 오늘은 구닥다리 취급을 받는 비트코인 이야기로 시작하겠습니다.
비트코인 NFT? Ordinals
올해초 비트코인 NFT가 갑자기 인기를 얻었습니다. NFT의 시초를 2012년 비트코인 colored coin으로 보는 의견도 있으니 새삼스럽지 않을지도 모릅니다. 먼저 비트코인 Ordinal Theory는 첫번째, 두번째하는 서수란 이름답게 비트코인의 가장 작은 단위인 사토시(1/100,000,000 비트코인)에 일련번호를 붙이는 방식입니다. 이걸 몰라도 비트코인은 동작하고, 오히려 비트코인 동작 방식에서 부수적으로 나온 성질입니다. Ordinal Theory를 말하려면 비트코인 트랜잭션을 알아야 합니다.
비트코인 트랜잭션에는 여러 입력과 출력이 있습니다. 여기서 입력과 출력을 동전으로 비유합니다. 트랜잭션은 입력 동전들을 녹여서 출력 동전들을 만듭니다. 이렇게 만든 출력 동전은 이후 다른 트랜잭션의 입력이 됩니다. 단, 동전에 자물쇠가 달렸기 때문에 아무 동전이나 사용할 수 없습니다. 동전을 보내는 사람은 받는 사람의 주소를 알기 때문에 받는 사람만 풀 수 있는 자물쇠를 달아둡니다. 동전을 받은 사람이 동전을 사용하려면, 즉, 다른 송금 트랜잭션의 입력으로 사용하려면, 열쇠가 필요합니다. 여기서 열쇠는 서명입니다. 서명은 개인키를 알아야만 만들 수 있기 때문에 주인만 동전을 사용할 수 있습니다.
이 동전은 애초에 채굴자가 채굴로 받은 블록보상에 기원합니다. 블록보상이 여러 트랜잭션을 거쳐 동전으로 나뉘고 합쳐집니다. 채굴자는 블록보상에 추가로 트랜잭션 수수료도 받습니다. 트랜잭션에서 입력들의 합을 출력들의 합으로 뺀만큼이 트랜잭션 수수료입니다.
이제 사토시에 일련번호를 붙일 수 있습니다. 제네시스 블록부터 블록보상에 순서대로 일련번호를 붙입니다. 트랜잭션은 새로운 사토시를 만들지 않고 대신 이미 있는 사토시를 다시 배열합니다. 첫 입력부터 하나씩 출력에 대응합니다. 남는 사토시는 (입력과 출력의 차) 트랜잭션 수수료이고, 채굴자에게 부여합니다. 이런 비트코인의 특성 때문에 hodl wave처럼 동전 보유 기간 분포 변화를 추적할 수 있습니다.
Ordinal Theory를 제안한 케이시 로더머(Casey Rodarmor)는 다양한 사토시 일련번호 표현법을 만들었습니다. 그중 하나가 시°분′초″삼‴ 입니다.
‘삼’은 블록보상에서 몇번째 사토시인지를 나타냅니다.
‘시’는 몇번째 사이클(6번 반감기 = 약 24년)
‘분’은 몇번째 반감기(블록 210,000개 = 약 4년)
‘초’는 몇번째 채굴난이도 조정(블록 2016개 = 약 2주)인지 보여줍니다.
케이시는 ‘시분초삼’를 토대로 희귀도(rarity, 등급)를 부여했습니다. 여기서 희귀도는 뒤에서 Inscription으로 올린 NFT 이미지의 희귀도가 아니라 케이시가 비트코인에 존재하는 (혹은 앞으로 존재할) 모든 사토시에 부여한 희귀도입니다.
‘삼’이 0이 아니면 common (2100조개)
‘삼’이 0이면 (즉, 블록보상의 첫번째 사토시) uncommon (693만개)
‘초’가 0이면 rare (3437개)
‘분’이 0이면 epic (32개)
‘분’과 ‘초’가 0이면 (즉, ‘시’가 증가할 때) legendary (5개)
‘시’가 0이면 mythic (1개, 사용할 수 없는 제네시스 블록 블록보상의 첫번째 사토시)입니다.
비트코인 역사에서 중요한 순간과 흥미로운 일련번호에 의미를 부여할 수도 있습니다.
Inscription
Inscription은 이렇게 일련번호를 붙인 사토시에 자료 꼬리표를 달아 블록체인에 새깁니다. 사람들은 이미지, 음악, 텍스트는 물론이고 동영상도 올리고 있습니다. colored coin과 mastercoin처럼 비트코인 초기에도 비슷한 시도가 있었습니다. 트랜잭션 출력에 새로운 동전과 자물쇠를 두는 대신 매우 소액의 동전과 자료를 기록합니다. 이 자료는 비트코인이 보기에는 아무 의미없는 낙서이지만, colored coin과 mastercoin은 자체 규칙에 따라 해석하여 동작했습니다. 그래서 마치 이더리움의 ERC20처럼 비트코인 위에 임의의 토큰을 발행할 수 있었습니다.
Inscription도 기본 원리는 동일합니다. 차이가 있다면, 과거에는 없었던 비트코인의 새로운 SegWit과 Taproot 기능을 활용하여 더 저렴하게 더 큰 자료를 저장할 수 있습니다. 또, colored coin과 mastercoin은 트랜잭션 출력을 풀 수 있는 열쇠가 애초에 없기 때문에 비트코인 트랜잭션 출력을 더 이상 다른 비트코인 트랜잭션의 입력으로 사용할 수 없었습니다. Inscription은 트랜잭션 출력에 자물쇠를 두고 알맞은 열쇠가 있다면 다른 주소로 송금하여 소유권을 이전할 수 있습니다.
SegWit과 Taproot
SegWit은 2017년에 있었던 비트코인의 가장 중대한 변화입니다. 블록 크기를 늘리며 트랜잭션 제일 앞에 버전을 기록하여 이후 비트코인을 쉽게 업그레이드할 수 있는 기반을 다졌습니다. 이전에 블록의 최대 크기가 1MB이고 여전히 이 한계가 커지지 않았지만, SegWit은 트랜잭션의 서명과 스크립트 부분을 1MB에 포함하지 않는 블록의 확장 영역에 기록합니다. 트랜잭션에서 큰 비중을 차지하던 부분을 옮겨서 블록에 더 많은 트랜잭션을 담을 수 있습니다. SegWit 기능이 없는 소프트웨어 입장에서 블록의 최대 크기는 여전히 1MB지만, SegWit 기능이 있는 업그레이드된 소프트웨어는 블록의 확장 영역(1MB 기본 영역을 거의 사용하지 않으면 이론상 4MB 정도까지 가능)을 추가로 다룰 수 있습니다. 그리고 트랜잭션 수수료를 계산할 때 확장 영역은 기존 블록의 1/4로 치기 때문에 수수료가 상대적으로 낮아져서 SegWit 도입을 유도합니다.
Inscription이 바로 이 SegWit의 확장 영역을 사용하기 때문에 동일한 크기 대비 1/4 수수료에 4MB에 가까운 자료를 체인에 업로드할 수 있습니다. (물론 4MB 정도 자료를 담은, 블록을 혼자 가득 채우는 트랜잭션은 급행 송금 트랜잭션들과 경쟁하여 수수료가 높아지기 때문에 비현실적입니다.)
Taproot는 2021년에 도입되었습니다. Taproot는 스크립트 부분을 일반 서명처럼 보이게 해서 트랜잭션 크기를 줄이고 자세한 스크립트 내용을 감춰서 프라이버시를 개선합니다. 서명 방식이 변경되어 서명 자체 크기도 약간 줄어듭니다 (71 → 64 바이트). Inscription도 이 변화에 도움을 받습니다.
이더리움에 단일 작품 NFT가 없지는 않지만 많은 경우 크립토펑크처럼 한 ERC721 스마트 컨트랙트에 정해진 개수만큼 NFT를 발행합니다. 반대로 비트코인펑크 홈페이지는 NFT를 모아서 보여주지만, Inscription은 단일 작품 NFT들 모음에 가깝습니다. 또, 크립토펑크를 만든 라바랩스의 Autoglyphs처럼 체인에 직접 자료를 담는 사례가 없는건 아니지만, 이더리움 NFT는 거의 대부분 자료의 URL만 저장합니다. 그래서 URL이 가리키는 파일이 사라지는 위험이 있습니다. Inscription은 체인에 직접 자료를 기록합니다.
케이시가 직접 만든 ord 프로그램을 사용하여 Inscription을 민팅하고, 다른 주소로 보내고 받을 수 있습니다. ord 프로그램은 비트코인 메인넷과 테스트넷(Signet)에서 동작합니다.
Inscription 때문에 비트코인 블록체인 크기가 커진다는 우려가 있습니다. 그러나 아직까지 Inscription 트랜잭션 수수료는 다른 비트코인 트랜잭션에 비해 (동일 크기 대비) 낮은 수준입니다. 그래서 일반적인 비트코인 송금 트랜잭션이 뜸해질 때 체인에 자리를 잡습니다. 4MB 최대 크기를 꽉 채워서 30년쯤 쌓여도 현재 이더리움 체인의 1/2 수준입니다. 물론 확장성의 대가로 빠르게 크기가 늘어나는 체인데이터는 블록체인이 풀어야 할 중요한 문제이고, 다음 기회에 이야기하겠습니다.
소프트포크
블록체인에 새로운 기능을 추가할 때 보통 하드포크(hard fork)를 진행합니다. 하드포크는 하드포크 이전과 이후 노드가 규칙이 달라져서 함께 합의를 이루지 못합니다. 그래서 업데이트할 때 모든 노드가 동시에 변경되야 합니다. POS 체인처럼 일정 비율의 합의가 필요한 경우 하드포크할 때 체인이 멈추는 경우가 흔하고, 노드 소프트웨어에 하드포크가 일어날 블록 번호와 다시 체인이 재개하기 전에 필요한 예상 준비 기간이 들어있기도 합니다. 게다가 노드뿐아니라 지갑과 블록 익스플로러, 거래소 입출금 시스템 등도 맞추어 변경해야 하기 때문에 큰 작업입니다.
한번에 적용하기 때문에 예상하지 못한 소프트웨어 버그로 체인이 멈추거나 포크하는 문제가 발생할 수 있습니다. 그래서 테스트넷에서 예행연습을 하지만, 인센티브가 부족한 테스트넷 참여율이 낮아서 제대로 된 테스트를 어렵습니다. 그나마 많이 참여하는 이더리움에서도 참여율 부족으로 테스트 지연이 보고되곤 합니다.
비트코인을 보면, 흥미롭게도 SegWit과 Taproot 같이 중대한 변화를 하드포크가 아닌 소프트포크(soft fork)로 진행했습니다. 새로운 변경안이 제안되고 비트코드 노드에 개발되어 포함되면, 채굴자가 블록을 만들 때 찬성과 반대를 블록에 1과 0으로 표시합니다. 찬성이 일정 비율(보통 95%)을 넘어가면 소프트포크가 적용됩니다. (자세한 규칙은 BIP 9, BIP 8, Speedy Trial 참고)
소프트포크는 소프트포크 이전 노드와 이후 노드가 서로 합의 규칙이 호환됩니다. 그래서 통계를 보면 전체 16,000개 가량 노드 중 2년 전 Taproot 소프트포크 이전 버전이 여전히 6% 정도 동작하고 있습니다. SegWit를 예로 들면, SegWit은 새로운 트랜잭션 형식을 추가하지만, 기존 노드 입장에서 이상한 트랜잭션이 아니라 말이 됩니다. 사실 기존 노드는 SegWit 트랜잭션 출력을 아무나 지불할 수 있다고 해석합니다. SegWit을 이해하는 새로운 노드는 SegWit 규칙에 따라 의도한 사람(보통 개인키를 아는 사람)만 사용할 수 있다고 해석합니다. 기존 노드는 SegWit 규칙에 어긋나는 (그러나 기존 노드 입장에서 유효한) 트랜잭션을 포함한 블록을 채굴할 수 있지만, SegWit 규칙을 적용하는 노드가 절대 다수이기 때문에 결국 SegWit 규칙을 만족하는 트랜잭션만 담은 블록이 우세하게 됩니다.
소프트포크는 소프트포크의 새로운 기능이 처음부터 있었다고 가정하고 처리할 수 있습니다. 결과가 같기 때문입니다. 그래서 비트코인 노드는 제네시스 블록부터 SegWit과 Taproot 규칙을 적용해 처리해도 되기 때문에 소프트웨어가 단순해집니다. 반면 하드포크가 있었던 체인을 처음부터 동기화하면, 처리하는 규칙을 중간에 변경해야 합니다. 노드 소프트웨어를 잘 만든 경우 노드 소프트웨어가 몇번 블록까지는 이 규칙을 적용하고 이후에는 다른 규칙을 알아서 적용하지만, 옛날 버전부터 버전을 올려가며 동기화해야 하는 경우도 흔합니다.
스마트 컨트랙트
앞에서 스크립트가 나왔습니다. 흔히 1세대 블록체인 비트코인은 단순 송금만 가능하고, 2세대 블록체인 이더리움에서 스마트 컨트랙트가 시작되었다고 듣곤 합니다. 그러나 비트코인에도 스크립트 기능이 있고, 다른 블록체인과 구별할 필요가 없기 때문에 이름이 그냥 스크립트입니다. 그림에서 자물쇠와 열쇠가 스크립트에 해당합니다.
상속할 때 성년이 되면 본인 서명으로 비트코인을 소비할 수 있지만, 그전에는 친척 중 한명과 변호사의 서명이 함께 필요한 복잡한 스크립트를 작성할 수도 있습니다. 보통 간단한 송금은 지갑이 알아서 표준 스크립트를 사용합니다. 자물쇠는 비트코인을 받는 주소와 몇가지 코드가 들어있고, 열쇠는 서명과 공개키입니다. 열쇠와 자물쇠를 연달아 실행하면, 공개키를 해시한 결과가 주소이고 공개키에 해당하는 개인키로 서명하였는지 검사합니다. 실행 결과가 성공이면, 트랜잭션은 해당 동전을 사용할 수 있습니다.
이더리움에서 저수준 EVM opcode로 프로그래밍하기 어렵기 때문에 고수준 솔리디티 언어로 프로그래밍하듯이 비트코인 스크립트를 직접 작성하는 대신 미니스크립트라는 고수준 언어를 사용할 수도 있습니다.