이 글을 다 읽고 나면, 당신은 Ordinals 각인에 대한 이해도가 99% 이상의 사람들을 초월하게 될 것입니다
저자: Ash Li, Noah Ho
Ordinals 프로토콜의 탄생으로 비트코인에 번호 매기기와 각인을 제공하게 되었고, 이는 비트코인 생태계의 제품 범위를 확장하고 새로운 활력을 불어넣었습니다. 본문에서는 Ordinal 프로토콜의 세부 사항을 깊이 탐구하며, 각 비트코인에 번호를 매기고 추적하는 방법과 각인과 번호 간의 관계를 설명합니다. 그러나 이 주제를 깊이 탐구하기 전에, 우리는 비트코인에 대한 기본 배경을 먼저 이해해야 하며, 이는 후속 내용을 더 잘 이해하는 데 도움이 될 것입니다.
이 글을 읽고 나면, 비트코인의 거래 메커니즘과 지불 모델을 이해하고, Ordinals가 각 사토시를 어떻게 번호 매기고 추적하는지, 그리고 각인이 어떻게 생성되고 거래되는지를 알게 될 것입니다. 또한, 다양한 유형의 지갑 간의 차이점도 이해할 수 있습니다.
1. 비트코인 배경
비트코인은 현금 거래 모델(cash system)을 채택하고 있으며, 그 지불 방식은 UTXO라는 모델에 기반하고 있어 전통적인 계좌 잔액 기반 모델과는 다릅니다. 예를 들어, 은행의 계좌 기입 모델 프로세스에서 A가 B에게 100원을 이체할 때, 은행은 세 가지 단계를 기록하며, 이 세 단계가 하나의 거래 과정을 구성합니다. 첫 번째 단계는 A의 계좌에서 100원을 차감하는 것이며, 이 단계의 기록 ID는 tid1입니다. 두 번째 단계는 100원을 B의 계좌에 입금하는 것이며, 이 단계의 기록 ID는 tid2입니다. 세 번째 단계는 A 계좌가 100원 감소하고 B 계좌가 100원 증가했음을 나타내는 이체 기록을 기록하는 것입니다. 이렇게 A와 B 간의 이체 관계가 기록되며, 미래에 조회 및 추적할 수 있습니다. 이제 UTXO와 지불 모델에 대한 소개를 통해 비트코인의 지불 방식을 설명하겠습니다.
UTXO
비트코인 블록체인에서 모든 잔액은 "미사용 거래 출력"(Unspent Transaction Output, UTXO)이라는 목록에 저장됩니다. 각 UTXO는 일정량의 비트코인과 이 비트코인의 소유자 정보를 포함하며, 사용 가능 여부를 표시합니다. 이를 소유자 이름이 적힌 현금 수표로 상상할 수 있으며, 소유자가 서명하면 사용 권한을 다른 사람에게 양도할 수 있습니다. 특정 주소에 대해 모든 UTXO 금액을 합치면 해당 주소 지갑의 잔액이 됩니다. 모든 UTXO를 순회함으로써 각 주소의 현재 잔액을 얻을 수 있습니다. 모든 UTXO 금액을 합산하면 현재 유통되고 있는 비트코인의 총량이 됩니다.
비트코인의 거래 구조에서 각 거래는 여러 개의 입력과 출력을 포함하며, 각 입력은 기존 UTXO에 대한 참조이고, 각 출력은 새로운 자금 수신 주소와 해당 금액을 지정합니다. 거래가 발행되면 입력 부분에서 참조하는 UTXO는 거래가 완료되기 전까지 잠금 상태가 되어 중복 사용을 방지합니다. 거래가 성공적으로 채굴자에 의해 블록에 포장되고 네트워크에서 확인되면 관련 UTXO 상태가 변경됩니다. 구체적으로, 거래 입력에 사용된 UTXO는 UTXO 목록에서 제거되어 소비되었음을 나타내고, 거래의 출력은 새로운 UTXO를 생성하여 UTXO 목록에 추가됩니다. 이는 구식 현금 수표가 사용된 후 무효화되고 새로운 현금 수표가 생성되어 새로운 소유자에게 귀속되는 것과 같습니다.
강조할 점은 각 UTXO는 한 거래에서만 사용될 수 있다는 것입니다. 입력으로 소비되면 UTXO 목록에서 영구적으로 제거됩니다. 동시에 새로 생성된 출력은 새로운 UTXO로 목록에 추가됩니다. UTXO 목록은 지속적으로 변화하며, 각 새로운 블록이 생성될 때마다 업데이트됩니다. 또한, 블록체인에서 거래 기록을 분석함으로써 특정 시점에서의 UTXO 목록 상태를 재구성할 수 있습니다.
또한, 거래의 총 입력 금액은 일반적으로 총 출력 금액을 약간 초과합니다. 이 차액은 거래 수수료(Transaction fee) 또는 네트워크 수수료(Network fee)라고 하며, 거래를 블록에 포장하는 책임이 있는 채굴자에게 인센티브로 제공됩니다. 네트워크 수수료의 크기는 거래의 복잡성과 비례하므로, 입력과 출력이 더 많은 거래는 일반적으로 더 높은 네트워크 수수료를 지불해야 합니다.
이제 비트코인의 거래 구조를 보다 구체적으로 이해하기 위해 구체적인 예를 통해 심층 분석하겠습니다. 비트코인의 거래 구조는 다음과 같으며, 여기서 vin과 vout 두 변수는 각각 비트코인 거래의 "입력"과 "출력"을 나타냅니다. 비트코인의 거래는 전통적인 계좌 잔액 모델처럼 계좌 형태의 데이터 변화를 기록하는 것이 아니라 입력과 출력을 통해 표현됩니다.
출처: https://github.com/bitcoin/bitcoin/blob/v22.0/src/primitives/transaction.h#L270
우리는 blockchain.com에서 무작위로 거래 기록을 선택하여 분석할 수 있으며, 아래 그림은 Hash ID가 0627052b6f28912f2703066a912ea577f2ce4da4caa5a5fbd8a57286c345c2f2인 거래를 보여줍니다. 이 거래는 하나의 입력과 두 개의 출력을 포함합니다.
bitcoin-cli의 getrawtransaction 및 decoderawtransaction 명령을 사용하여 위 거래의 기본 구조를 확인할 수 있습니다:
비트코인 네트워크에서 거래 출력은 두 가지 중요한 정보를 포함합니다: 주소(공개 키 해시)와 금액(비트코인 단위). 만약 거래의 출력이 다른 거래의 입력에서 사용되지 않았다면, 이 거래 출력은 미사용 거래 출력(UTXO)이라고 불립니다. UTXO에 있는 공개 키에 해당하는 개인 키를 소유한 사람은 이 UTXO를 사용할 권한이 있습니다.
위 코드의 "vin" 정보를 살펴보면, 이 거래에서 소비된 UTXO가 다른 거래(그 ID는 7957a…f6f18)의 0번째 출력에서 온 것임을 나타냅니다(하나의 거래의 출력은 여러 개일 수 있으며, 인덱스는 0부터 시작합니다). 우리는 역사 거래에서 이 UTXO의 금액(예: 0.1)을 찾아낼 수 있으며, 따라서 이 거래에서 사용자가 소비한 금액은 0.1 BTC입니다. 숫자 0.1은 거래에 명시적으로 기재할 필요가 없으며, UTXO 정보를 조회하여 얻을 수 있습니다. 이 거래의 "vout"에는 두 개의 출력이 있으며, 이 두 출력은 두 개의 새로운 UTXO에 해당하며, 새로운 잔액과 소유자를 나타냅니다. 이는 다른 거래가 이들을 입력으로 소비할 때까지 유지됩니다.
지불 모델
비트코인 네트워크의 지불 모델을 더 잘 이해하기 위해, A가 B에게 n 금액의 비트코인을 지불하는 과정을 예를 들어 설명하겠습니다. 아래 그림은 사용자 A가 사용자 B에게 3개의 비트코인을 보내는 과정을 보여줍니다.
사용자 A는 먼저 자신이 소유한 모든 UTXO 집합을 확인해야 하며, 이는 사용자 A가 지배할 수 있는 모든 비트코인입니다.
A는 이 집합에서 하나 이상의 UTXO를 거래의 입력으로 선택하며, 이 입력의 금액 합계는 m(2+0.8+0.5=3.3 BTC)로 지불해야 할 금액 n(3 BTC)보다 커야 합니다.
사용자 A는 거래에 두 개의 출력을 설정하며, 하나의 출력은 B의 주소로 n(3 BTC)을 지불하고, 다른 출력은 A 자신의 거스름돈 주소로 m-n-fee(3.3-3-0.001=0.299 BTC)을 지불합니다. 사용자의 지갑은 일반적으로 여러 주소로 구성되며, 일반적으로 각 주소는 한 번만 사용되며, 거스름돈은 기본적으로 새로운 주소로 반환됩니다.
채굴자가 이 거래를 블록에 포장하여 확인하면, B는 이 거래 정보를 받을 수 있습니다. 블록의 크기에는 상한선이 있으므로(약 1MB), 채굴자는 거래 수수료 비율(fee_rate=fee/size)이 높은 거래를 우선적으로 확인하여 최대 수수료 수익을 얻습니다. 우리는 mempool에서 실시간으로 채굴 거래 수수료 상황을 볼 수 있습니다. 만약 이체 과정에서 가장 빠른 확인을 원한다면, 높은 우선순위(High Priority)를 선택하거나 적절한 거래 수수료를 사용자 정의할 수 있습니다.
2. 사토시의 번호 매기기 및 추적
비트코인의 총량은 2100만 개이며, 각 비트코인은 10^8개의 사토시(Satoshi, Sat)를 포함합니다. 따라서 비트코인 네트워크에는 총 2100만 * 10^8개의 사토시가 존재합니다. Ordinals 프로토콜은 이러한 사토시를 구분하여 각 사토시에 고유한 번호를 매깁니다. 본 절에서는 이 프로토콜이 각 사토시에 고유한 번호를 매기는 방법과 그 위치를 추적하는 방법을 소개합니다. 또한 사토시의 희귀도 분류에 대해서도 간략히 설명합니다.
사토시의 번호 매기기
Ordinals 프로토콜에 따르면, 사토시의 번호는 채굴된 순서에 따라 결정됩니다. 아래 그림은 0번째 블록에서 채굴된 0번째 사토시의 표현 방식을 보여줍니다.
사토시의 표현 방식에는 여러 가지가 있습니다:
- 정수 기호: 예를 들어 2099994106992659는 해당 사토시가 채굴 순서에 따라 할당된 번호를 나타냅니다.
- 십진수 기호: 예를 들어 3891094.16797, 첫 번째 숫자는 해당 사토시를 채굴한 블록 높이를 나타내고, 두 번째 숫자는 블록 내에서의 사토시 번호를 나타냅니다.
- 도수 기호: 예를 들어 3°111094′214″16797‴, 첫 번째 숫자는 주기이며 0부터 시작하고, 두 번째 숫자는 반감기 시대의 블록 인덱스, 세 번째 숫자는 난이도 조정 기간의 블록 인덱스, 마지막 숫자는 블록 내의 사토시 인덱스입니다.
- 백분율 기호: 예를 들어 99.99971949060254%는 해당 사토시가 비트코인 공급량에서의 위치를 백분율로 나타냅니다.
- 이름: 예를 들어 Satoshi. 문자 a에서 z까지를 사용하여 번호를 인코딩한 이름입니다.
우리는 새로 채굴된 비트코인에 번호를 매기는 방법을 설명하기 위해 예를 들어 보겠습니다. 비트코인 블록체인의 795952번째 블록을 관찰하면, 그 안에 첫 번째 거래 Tx 3a1f…b177이 채굴자의 보상을 기록하고 있습니다(코인베이스 거래). 이 거래는 새로 채굴된 비트코인을 포함하고 있으며, 이는 채굴자의 패키지 보상과 거래 발신자가 채굴자에게 지불한 수수료로 구성됩니다. 아래 그림의 입력을 확인하면, 그 UTXO의 ID가 일련의 0과 블록 높이로 구성되어 있음을 알 수 있습니다. 출력 주소는 채굴자의 지갑 주소이며, 금액은 위의 보상과 수수료의 총합입니다.
우리는 채굴자에게 지급된 부분을 더 살펴보면, 주소, 금액 및 포함된 사토시의 분포 상황을 볼 수 있습니다. 앞서 언급한 바와 같이, 이들은 채굴 보상과 수수료를 포함하고 있습니다. 여기서 녹색의 sats 번호 정보 1941220000000000--1941220625000000은 채굴 보상으로 생성된 새로운 사토시이며, 나머지 712개의 사토시 기록은 해당 블록의 모든 수수료에 해당합니다.
우리는 Sat 1941220000000000 이 번호를 검증할 수 있습니다. 그것의 블록 번호는 795952이며, 십진수 기호(decimal)은 795952.0으로, 이는 해당 사토시를 채굴한 블록 높이가 795952이고, 블록 내에서의 사토시 번호는 0이며, 뒤의 희귀도(rarity) 표시는 일반적(uncommon)입니다. 우리는 후속 부분에서 이를 자세히 설명할 것입니다.
사토시의 흐름
모든 BTC는 채굴 보상으로 생성되므로, 이들은 모두 추적 가능합니다. 비트코인 계좌는 UTXO 모델을 사용합니다. 가정해 보겠습니다, 사용자 A가 100-110번째 사토시(10개의 사토시가 하나의 ID가 adc123인 UTXO에 저장됨)를 채굴했습니다. 사용자 A가 사용자 B에게 5개의 사토시를 지불하려고 할 때, 그는 ID가 abc123인 거래의 입력으로 선택하며, 그 중 5개는 사용자 B에게, 나머지 5개는 사용자 A에게 거스름돈으로 반환됩니다. 이 두 개의 5개 사토시는 하나의 집합으로, 각각 ID가 abc456과 abc789인 UTXO에 저장됩니다. 위의 UTXO ID와 사토시 수는 예시로 제시된 것이며, 실제 상황에서는 전송되는 사토시의 최소 제한이 546개이며 UTXO ID도 이 형태로 표현되지 않습니다.
위 거래에서 사용자 A의 10개의 사토시의 흐름 경로는 다음과 같습니다:
채굴로 10개의 사토시가 생성되며, 번호는 [100, 110)입니다. 이는 번호가 100부터 109까지의 사토시가 ID가 abc123인 UTXO에 저장되어 있으며, 소유자는 사용자 A입니다.
A가 이체를 수행할 때, 10개의 사토시는 두 개로 나뉘며, 각 5개의 사토시가 됩니다. 여기서는 "선입선출" 원칙이 적용되며, 즉 사토시의 번호 정렬은 거래 출력에서의 인덱스에 따라 결정됩니다. 출력 순서가 사용자 A 다음에 사용자 B라면, 사용자 A의 남은 5개의 사토시 번호는 [100, 105)이며, ID가 abc456인 UTXO에 저장되고, 사용자 B의 5개의 사토시 번호는 [105, 110)이며, ID가 abc789인 UTXO에 저장됩니다.
희귀도 (Rare Satoshi)
Ordinals 프로토콜의 파생 플레이로서, 사토시의 희귀도는 채굴 순서에 따라 정의될 수 있습니다. 이는 일부 특별한 사토시가 다른 희귀도를 가지게 만듭니다. 다음은 다양한 사토시의 희귀도 수준입니다:
- common 일반급: 블록의 첫 번째 사토시를 제외한 모든 사토시 (총 공급량 2100억)
- uncommon 우량급: 각 블록의 첫 번째 사토시 (총 공급량 6929999)
- rare 희귀급: 각 난이도 조정기의 첫 번째 사토시 (총 공급량 3437)
- epic 서사급: 각 반감기 후의 첫 번째 사토시 (총 공급량 32)
- legendary 전설급: 각 주기의 첫 번째 사토시 (총 공급량 5)
- mythic 신화급: 창세 블록의 첫 번째 사토시 (총 공급량 1)
이러한 희귀 사토시 개념은 비트코인 생태계에 더 많은 재미와 가치를 추가할 수 있습니다. 다양한 희귀도의 사토시는 시장에서 서로 다른 가치를 가질 수 있으며, 수집가와 투자자를 끌어들입니다.
각인 방식
Ordinals는 다른 비비트코인 체인의 NFT와 현저히 다릅니다. 그 중 가장 주요한 차이는 Ordinals의 메타데이터가 특정 위치에 저장되지 않는다는 것입니다. 대신, 이러한 메타데이터는 거래의 증인 데이터(witness data, witness field)에 삽입되며, 이것이 우리가 "각인(inscription)"이라고 부르는 이유입니다. 이러한 데이터는 특정 사토시에 "각인"처럼 새겨지며, 이 데이터는 특정 사토시에 부착됩니다. 이 각인 과정은 격리된 증인(Segregated Witness, SegWit)과 "Taproot로 지불"(Pay-to-Taproot, P2TR) 방식으로 구현되며, 여기에는 제출(commit)과 공개(reveal) 두 단계가 포함되어 있어 텍스트, 이미지 또는 비디오와 같은 모든 형태의 내용을 특정 사토시에 각인할 수 있습니다. 우리는 아래에서 OP_RETURN이라는 보다 직접적인 저장 방식과 그것이 왜 각인 수단으로 사용되지 않았는지를 설명할 것입니다. 동시에 격리된 증인과 Pay-to-Taproot가 무엇인지, 그리고 그들이 각인에서 어떤 역할을 하는지에 대해서도 설명할 것입니다. 마지막으로 각인 방식을 소개하겠습니다.
OP_RETURN
Bitcoin Core 클라이언트 0.9 버전에서 RETURN 연산자를 채택하여 궁극적으로 타협이 이루어졌습니다. RETURN은 개발자가 거래 출력에 80바이트의 비지급 데이터를 추가할 수 있도록 허용합니다. 의사 지급과는 달리, RETURN은 명확하게 검증 가능한 소비 불가능한 출력을 생성하며, 이러한 데이터는 UTXO 집합에 저장할 필요가 없습니다. RETURN 출력은 블록체인에 기록되며, 이는 디스크 공간을 소모하고 블록체인 규모의 증가를 초래하지만, UTXO 집합에 저장되지 않기 때문에 UTXO 메모리 풀의 팽창을 초래하지 않으며, 전체 노드의 비싼 메모리 비용을 증가시키지 않습니다.
비록 OPRETURN이 비트코인 블록체인에 정보를 저장하는 매우 직접적인 수단이지만, 잠재적인 각인 방식이기도 합니다. 그러나 OPRETURN의 제한으로 인해 메타데이터 저장을 처리하는 데 몇 가지 도전 과제가 있습니다. 첫째, OPRETURN은 80바이트의 데이터만 저장할 수 있으며, 더 많은 데이터를 저장해야 하는 경우 이 제한은 명백히 충족되지 않습니다. 둘째, OPRETURN 데이터는 거래 출력 부분에 저장되며, 비록 이 데이터가 UTXO 집합에 저장되지 않지만, 블록체인의 저장 공간을 차지하여 블록체인 규모의 증가를 초래합니다. 마지막으로, OP_RETURN을 사용하면 거래 수수료가 증가하게 되며, 이는 이러한 거래를 발행하기 위해 더 많은 수수료를 지불해야 함을 의미합니다.
격리된 증인
반면, SegWit이 제공하는 새로운 방법은 위의 문제를 극복할 수 있습니다. SegWit은 비트코인의 중요한 프로토콜 업그레이드로, 비트코인 핵심 개발자 Pieter Wuille에 의해 2015년에 제안되었으며, 2017년 0.16.0 버전에서 공식적으로 채택되었습니다. Segregated Witness에서 Segregated는 분리, 격리를 의미하며, Witness는 거래와 관련된 서명 데이터를 나타냅니다. 따라서 SegWit은 특정 거래 서명 데이터(증인 데이터)를 거래와 분리하는 것입니다.
서명과 거래 관련 데이터를 분리하는 주요 이점은 비트코인 블록에 저장되는 데이터의 크기를 줄이는 것입니다. 이렇게 하면 각 블록은 더 많은 거래를 저장할 수 있는 추가 용량을 가지게 되며, 이는 네트워크가 더 많은 거래를 처리할 수 있음을 의미하고, 발신자가 더 낮은 수수료를 지불하게 됩니다. 기술적으로는 스크립트 서명(scriptSig) 정보를 기본 구조(base block)에서 꺼내어 새로운 데이터 구조에 넣는 것입니다. 검증 작업을 수행하는 노드와 채굴자도 이 새로운 데이터 구조의 스크립트 서명을 검증하여 거래의 유효성을 보장합니다. Segwit 업그레이드는 거래 출력에 새로운 증인 필드를 도입하여 개인 정보 보호와 성능을 보장합니다. 비록 증인 데이터가 데이터 저장을 위해 설계된 것은 아니지만, 실제로는 각인 메타데이터와 같은 내용을 저장할 수 있는 기회를 제공합니다. 아래 그림을 통해 격리된 증인을 보다 명확하게 이해할 수 있습니다:
SegWit 전 -- 거래 구조의 설명(백분율 데이터 점유)
SegWit 후 -- 거래 구조의 설명(백분율 데이터 점유)
SegWit 전후의 거래 데이터 구조
Taproot
P2TR은 2021년에 진행된 Taproot 업그레이드에서 도입된 비트코인의 거래 출력 유형으로, 다양한 거래 조건을 블록체인에 보다 비공식적으로 저장할 수 있게 해줍니다. Ordinals의 각인에서 P2TR은 중요한 역할을 합니다. 각인은 본질적으로 특정 데이터 내용을 비트코인 거래에 삽입하는 것이며, Taproot 업그레이드, 특히 P2TR은 이러한 데이터 삽입을 더욱 유연하고 경제적으로 만들어 줍니다.
우선, Taproot 스크립트의 저장 방식 덕분에 우리는 Taproot 스크립트 경로 지출 스크립트에 각인 내용을 저장할 수 있으며, 이러한 스크립트는 내용 측면에서 거의 제한이 없으며, 증인 데이터의 할인 혜택을 얻을 수 있어 각인 내용을 상대적으로 경제적으로 저장할 수 있습니다. Taproot 스크립트의 소비는 이미 존재하는 Taproot 출력에서만 이루어질 수 있기 때문에, 각인은 두 단계의 제출/공개 프로세스를 채택합니다. 먼저, 제출 거래에서 각인 내용을 포함하는 스크립트의 Taproot 출력을 생성합니다. 그런 다음, 공개 거래에서 제출 거래에서 생성된 출력을 소비하여 체인에서 각인 내용을 공개합니다.
이러한 방식은 자원 소비를 크게 줄여줍니다. P2TR을 사용하지 않는 경우, 증인 정보는 거래의 출력에 저장됩니다. 따라서 이 출력이 소비되지 않는 한, 증인 정보는 UTXO 집합에 계속 저장됩니다. 반면, P2TR을 사용하면 증인 정보는 제출 단계에서 생성된 거래에 나타나지 않으므로 UTXO 집합에 기록되지 않습니다. 이 UTXO가 소비될 때만 증인 정보가 공개 단계의 거래 입력에 나타납니다. P2TR은 메타데이터가 비트코인 블록체인에 기록될 수 있도록 하지만, UTXO 집합에는 결코 나타나지 않습니다. UTXO 집합을 유지/수정하는 데 더 많은 자원이 필요하므로, 이 방법은 많은 자원을 절약할 수 있습니다.
각인
Ordinals 프로토콜은 SegWit을 활용하여 비트코인 네트워크에 콘텐츠를 작성하는 크기 제한을 완화하고, 각인 내용을 증인 데이터에 저장합니다. 이를 통해 최대 4MB의 메타데이터를 저장할 수 있습니다. Taproot는 비트코인 거래에 임의의 증인 데이터를 저장하는 것을 더욱 용이하게 만들어, Ordinals 개발자 Casey Rodarmor가 그가 설명한 "봉투"를 위해 구식 연산자(OPFALSE, OPIF, OP_PUSH)를 재사용하여 임의의 데이터를 "각인"으로 저장할 수 있게 합니다.
각인 프로세스는 다음 두 단계로 구성됩니다:
- 먼저, 제출 거래에서 각인 내용을 포함하는 스크립트의 Taproot 출력을 생성해야 합니다. 저장 형식은 Taproot이며, 이전 거래의 출력은 P2TR(Pay-To-Taproot)이고, 이후 거래의 입력에서는 증인의 Taproot 스크립트에 특정 형식의 내용을 삽입합니다; 먼저 문자열 ord를 스택에 넣어 각인이 다른 용도로 사용되지 않도록 모호성을 제거합니다. OPPUSH 1은 다음에 푸시되는 내용 유형을 포함하고, OPPUSH 0은 후속 데이터 푸시가 내용을 포함하도록 지시합니다. 대형 각인은 여러 번 데이터 푸시를 사용해야 하며, Taproot의 제한 중 하나는 단일 데이터 푸시가 520바이트를 초과할 수 없다는 것입니다. 이 시점에서 각인 데이터는 거래 출력의 UTXO에 연결되지만 공개되지 않습니다.
- 다음으로, 공개 거래에서 제출 거래에서 생성된 출력을 소비해야 합니다. 이 단계에서는 해당 각인에 해당하는 UTXO를 입력으로 사용하여 거래를 시작합니다. 이 시점에서 해당 각인 내용이 전체 네트워크에 공개됩니다.
위의 두 단계를 통해 각인 내용은 각인된 UTXO와 연결됩니다. 앞서 설명한 사토시의 위치에 따라, 각인은 그 입력의 UTXO에 해당하는 첫 번째 사토시에 수행되며, 각인 내용은 표시 거래의 입력에 포함됩니다. 앞서 설명한 사토시의 흐름과 추적에 대한 설명에 따라, 이 특별한 내용이 각인된 사토시는 이동, 구매, 판매, 분실 및 복구될 수 있습니다. 주의할 점은 각인을 반복해서는 안 되며, 그렇지 않으면 후속 각인은 무효가 됩니다.
우리는 BTC NFT 작은 이미지를 각인하는 예를 통해 이 과정을 자세히 설명할 것입니다. 이 과정은 이전에 언급한 제출(commit)과 공개(reveal) 두 단계를 포함합니다. 먼저, 첫 번째 거래의 Hash ID는 2ddf9…f585c입니다. 이 거래의 출력에는 증인 데이터가 포함되어 있지 않으며, 웹 페이지에도 관련 각인 정보가 없습니다.
다음으로, 두 번째 단계의 기록을 확인하면, 그 Hash ID는 e7454…7c0e1입니다. 여기에서 우리는 Ordinals 각인 정보, 즉 증인의 각인 내용을 볼 수 있습니다. 이 거래의 입력 주소는 이전 거래의 출력 주소이며, 출력의 0.00000546BTC(546 사토시)는 이 NFT를 자신의 주소로 전송하는 것입니다. 동시에, 우리는 Sat 1893640468329373에서 이 각인이 있는 사토시를 찾을 수 있습니다.
비트코인 지갑에서 우리는 이 자산을 볼 수 있습니다. 만약 이 NFT를 거래하고 싶다면, 다른 사람의 주소로 직접 전송하면 됩니다. 즉, 이 UTXO를 전송하여 각인의 흐름을 완료하는 것입니다.
4. 비트코인 지갑
Ordinals 생태계, 사토시의 흐름 및 각인 관련 지식을 이해한 후, 현재 BRC-20, ORC-20, BRC-721, GBRC-721 등 관련 파생 프로토콜의 출현으로 인해 우리는 해당 토큰 정보나 NFT 작은 이미지를 지원하고 표시할 수 있는 지갑이 필요합니다. 본 절에서는 다양한 비트코인 지갑 주소의 개념과 특징을 소개하겠습니다.
비트코인 주소는 1, 3 또는 bc1로 시작합니다. 전자 메일 주소와 마찬가지로, 이들은 다른 비트코인 사용자와 공유할 수 있으며, 이 사용자들은 이를 통해 비트코인을 자신의 지갑으로 직접 보낼 수 있습니다. 보안 관점에서 비트코인 주소는 민감한 내용을 포함하지 않습니다. 이는 어디서나 게시할 수 있으며, 계좌의 안전을 위협하지 않습니다. 전자 메일 주소와 달리, 우리는 필요에 따라 언제든지 새 주소를 생성할 수 있으며, 모든 주소는 자금을 직접 지갑으로 입금합니다. 사실, 많은 현대 지갑은 각 거래에 대해 새 주소를 자동으로 생성하여 개인 정보를 최대한 보호합니다. 지갑은 주소와 그 안의 자금을 잠금 해제하는 키의 집합입니다. 먼저 비트코인 지갑 주소가 어떻게 생성되는지 알아보겠습니다.
비트코인 개인 키와 공개 키
비트코인은 타원 곡선 Secp256k1을 사용하며, "개인 키"는 1에서 n−1 사이의 임의의 수이며, n은 매우 큰 수(256 비트)입니다. n은 과학적 표기법으로 약:
이 범위는 매우 넓어, 우리는 거의 다른 사람의 개인 키를 추측할 수 없습니다. 이 임의의 정수 개인 키는 256 비트로 표현될 수 있으며, 여러 인코딩 방식이 존재합니다. WIF, WIF-compressed 형태의 개인 키는 암호화되지 않으며, 원래의 "임의 정수"를 디코딩할 수 있습니다. 또 다른 방법은 BIP38로, 개인 키를 AES 알고리즘으로 암호화하는 것을 제안하며, 이 방식으로 얻은 개인 키는 6P로 시작하며, 이러한 개인 키는 다양한 비트코인 지갑에 가져오기 위해 비밀번호를 입력해야 합니다. 이것이 우리가 일반적으로 사용하는 개인 키입니다.
그 후, 우리는 타원 곡선 공식 K = kG를 사용하여 개인 키 k로 비트코인의 공개 키 K를 생성합니다. G는 Base Point로, secp256k1의 매개변수입니다. K의 두 좌표를 얻을 수 있으며, 이는 공개 키의 두 가지 표현 방식인 "Uncompressed format"과 "Compressed format"입니다.
- Uncompressed 형식은 두 좌표 x와 y를 직접 연결한 후, 앞에 0x04 접두사를 추가하는 것입니다.
- Compressed 형식은 y가 짝수일 때 02 x로 인코딩하고, y가 홀수일 때 03 x로 인코딩합니다.
비트코인 주소
비트코인의 다양한 유형의 주소는 아래 그림과 같이 네 가지 표현 방법이 있습니다:
출처: https://en.bitcoin.it/wiki/Invoice_address
1. 레거시 (P2PKH) 형식
예시: 1Fh7ajXabJBpZPZw8bjD3QU4CuQ3pRty9u
주소는 "1"로 시작하며, 비트코인의 초기 주소 형식으로 현재도 사용되고 있습니다. 공개 키를 해시 계산하여 얻어지며, P2PKH는 Pay To PubKey Hash(공개 키 해시에 지불)의 약자입니다.
2. 중첩된 SegWit (P2SH) 형식
예시: 3KF9nXowQ4asSGxRRzeiTpDjMuwM2nypAN
주소는 "3"로 시작하며, P2SH는 Pay To Script Hash(스크립트 해시에 지불)의 약자입니다. 이는 레거시 주소보다 더 복잡한 기능을 지원합니다. 중첩된 P2SH는 기존 P2SH 주소(3으로 시작)를 가져와 SegWit 주소와 함께 포장합니다.
3. 네이티브 SegWit (Bech32) 형식
예시: bc1qf3uwcxaz779nxedw0wry89v9cjh9w2xylnmqc3
BIP0173에서 bc1로 시작하는 주소가 제안되었으며, 이는 원주율 격리된 주소입니다. Bech32 인코딩 주소는 SegWit 전용 주소 형식으로 개발되었습니다. Bech32는 2017년 말 BIP173에서 정의되었으며, 이 형식의 주요 특징 중 하나는 대소문자를 구분하지 않는다는 것입니다(주소에는 0-9, az만 포함됨). 따라서 입력 시 혼동을 효과적으로 피할 수 있으며, 읽기 쉽습니다. 주소에 필요한 문자가 더 적기 때문에, 주소는 전통적인 Base58 대신 Base32 인코딩을 사용하여 계산이 더 편리하고 효율적입니다. 데이터는 QR 코드에 더 밀접하게 저장될 수 있습니다. Bech32는 더 높은 보안을 제공하며, 오류 감지 코드를 최적화하여 무효 주소가 발생할 가능성을 최소화합니다.
Bech32 주소는 SegWit와 호환됩니다. SegWit 주소를 P2SH 주소에 넣기 위해 추가 공간이 필요하지 않으므로 Bech32 형식 주소를 사용하면 수수료가 더 낮습니다. Bech32 주소는 이전의 Base58(Base58Check 인코딩을 사용하여 비트코인에서 바이트 배열을 사람에게 인코딩 가능한 문자열로 변환하는 데 사용됨) 주소에 비해 몇 가지 장점이 있습니다: QR 코드가 더 작고; 오류 방지가 더 좋으며; 더 안전하고; 대소문자를 구분하지 않으며; 소문자만 포함되어 있어 읽기, 입력 및 이해가 더 쉽습니다.
4. Taproot 형식(P2TR)
Bech32에는 단점이 있습니다: 주소의 마지막 문자가 p인 경우, p 바로 앞의 위치에 임의의 수의 문자 q를 삽입하거나 삭제해도 체크섬이 무효화되지 않습니다.
Bech32의 이러한 단점을 완화하기 위해 BIP0350에서 Bech32m 주소가 제안되었습니다:
- 버전 0의 원주율 격리된 주소는 이전 Bech32를 사용합니다.
- 버전 1(또는 그 이상의) 원주율 격리된 주소는 새로운 Bech32m을 사용합니다.
Bech32m 주소는 버전이 1일 때 항상 bc1p로 시작합니다(즉, Taproot 주소). 구체적으로, 로컬 격리된 주소와 마찬가지로, 지갑은 시드 문구와 비밀번호 문구로 구성될 수 있습니다. 이는 확장된 공개 키와 개인 키를 생성하는 데 사용되며, 계층적 결정론적 지갑에서 임의 경로의 주소를 파생하는 데 사용됩니다. 주로 BRC-20 및 BTC의 NFT 등을 저장하는 데 사용됩니다.
5. 우리에 대하여
Spectrum Labs는 블록체인 연구에 집중하는 석사 및 박사와 블록체인 산업 내부의 전문가들로 구성된 팀입니다. 우리는 블록체인 기술 및 그 응용에 대한 연구를 통해 사람들이 블록체인을 더 잘 이해할 수 있도록 돕고 있습니다. Spectrum Labs의 주요 사업에는 연구 보고서 작성, 강의 작성 및 도구 개발이 포함됩니다.
BTC NFT 중국어 커뮤니티는 전 세계 중국어 사용자 신인을 위한 BTC NFT 중국어 교류 광장입니다.