# BTC上的NFT(⼀) - Ordinal原理介绍

By [AKLabs](https://paragraph.com/@aklabs-2) · 2023-02-13

---

**最近BTC上的NFT刷爆了整个币圈，Ordinal Loops、Ordinal Punks、Bitcoin Rocks和Ordinal Penguins都是目前大热的项目。**

![https://www.ordinalhub.com/](https://storage.googleapis.com/papyrus_images/98f1c28104e1f4f4971e74499e85d9db19b6d474e6d2c4030153633af3e7e5e9.png)

https://www.ordinalhub.com/

下面我们就从原理上来剖析在BTC链上通过Ordinal发行NFT（Ordinal官方更愿意称为数字艺术品而不是NFT）的原理。

基本概念
----

在正式开始之前，我们先介绍一些基本概念

### 聪 (Satoshis)

Satoshis（以下简称sat）：也叫聪，是BTC的最小单位，1 BTC = 1 \* 10^9 sat

### 序数 (Ordinal)

Ordinal也叫序数，是对BTC链上每“挖”出来一个sat对其进行编号排序。因为BTC一共只能有2100万个，所以sats总量也被限制为 2.1 \* 10^7 \* 10^9 个。第一个区块中的第一个sat的序号为0，第二个sat的序号为1，第一个区块的最后一个sat的序号为 4,999,999,999，能被挖出来的最后一个sat的序号为20,999,999,999,999,999。下图是一个编号为[1440861821052292](https://ordinals.com/sat/1440861821052292)的sat

![](https://storage.googleapis.com/papyrus_images/9c30fb723cbffa799b8920ca5e28b8a9c62c4d03155e3362795ca5ac363047fe.png)

因为正常的sat序号过长了，所以又设计了不同的表示方法来表示这个序号

*   整数表示法：[2099993888271341](https://ordinals.com/sat/2099993888271341)，这个表示sat被“挖”出来的顺序分配
    
*   十进制表示法：[3879627.5570](https://ordinals.com/sat/3879627.5570)，整数部分表示的是区块高度，小数部分表示的是该sat在区块内的偏移量
    
*   度数表示法：[3°99627'843''5570'''](https://ordinals.com/sat/3%C2%B099627%E2%80%B2843%E2%80%B35570%E2%80%B4)，稍后解释
    
*   百分比表示法：[99.99970907530168%](https://ordinals.com/sat/99.99970907530168%25)，该sat在比特币供应量中的位置，以百分比表示
    
*   名字表示法：[stefans](https://ordinals.com/sat/stefans)，通过a-z这26个字母对整数表示法进行编码，这个编码规则是倒叙的，第1个sat的名字是[nvtdijuwxlp](https://ordinals.com/sat/nvtdijuwxlp)，最后一个sat的名字是[a](https://ordinals.com/sat/a)，所以越后面的sat，名字会越短。
    

### 未花费的输出 (UTXO)

UTXO：也叫未花费的输出，因为BTC网络不像以太坊，没有账户概念，地址的余额是根据历史的交易记录累计出来的，这里每一个历史交易记录都可以算作是一个UTXO。举个例子，A有5个BTC，要转账给B 4个BTC，那钱包会先找到这5个BTC的UTXO作为输入，然后输出是转给B的4个BTC，另外给自己找零1个BTC（如果这里给自己的找零为0.8BTC，则剩下的0.2BTC会默认给矿工作为矿工费），这4个BTC相对于B来说就是他的UTXO，如果B未来转账，就会先找到这个UTXO作为输入再转出去

### 铭文 (Inscriptions)

铭文刻有任意内容，创造了比特币原生的数字人工制品，通常被称为 NFT，铭文不需要侧链或单独的Token。铭刻是通过将要铭刻的sat发送到交易中来完成的，该交易会在链上显示铭文内容。然后，此内容与那个sat有着千丝万缕的联系，将其变成一个不可改变的数字艺术品，可以被追踪、转移、储存、购买、出售、丢弃和重新发现。这里的铭文就可以被称为BTC上的NFT了。

已经被铭刻的sat无法被修改，但是没有被铭刻的sat是可以在后续被铭刻的。所以**理论上**能在BTC网络上的铭文数量等于sats的数量。

任何人都可以铭刻任意的内容，可以是图片、音频、视频以及任何格式的内容等。这些内容是完全被记录在链上并且无法更改的。这些内容是通过脚本原生“附”在每个sat上的，然后可以使用比特币交易传输这些铭刻的sats，发送到指定的比特币地址，并保存在比特币的UTXO中。这些交易、地址和 UTXO 在所有方面都是正常的比特币交易、地址和 UTXO，除了为了发送单个 sat，交易必须根据序数理论控制输入和输出的顺序和值。

下面是一个简单的一段想要铭刻文字的脚本示例，当按照规范发送一笔交易并写入脚本后，这就成为了一个铭文：

    OP_FALSE
    OP_IF
      OP_PUSH "ord"
      OP_1
      OP_PUSH "text/plain;charset=utf-8"
      OP_0
      OP_PUSH "Hello world!"
    OP_ENDIF
    

### 稀有度 (Rarity)

因为每一个sat都被标记了序号，从0～20,999,999,999,999,999，加上比特币本身也会有一些周期性的事件，这些事件有些很常见，有些不太常见，所以我们可以人为给每个sat定义稀有度，这个sat的稀有度与铭文的稀有度无关，但是当一些铭文本来就是稀有的，且“附”到的sat也是稀有的，那可能会更大程度上赋予该铭文的价值。这些周期性事件是：

*   区块 (Blocks)：比特币链大约每10分钟产生一个新的区块
    
*   难度调整 (Difficulty adjustments)：每2,016个区块（大约每2周），比特币网络都会根据当前全网算力调整挖矿难度
    
*   减半 (Halvings)：每210,000个区块（大约每4年），每个区块中被创造出来的比特币数量就会减半
    
*   循环 (Cycles)：每6次减半，就会发生一个奇特的事情：减半和难度调整会同时发生，这个阶段被称为循环，大约每24年发生一次，目前我们还未经历第一个循环的结束，它大概在2032年发生
    

根据上面的一些周期性事件，我们给sat定义了以下稀有度级别：

*   普通 (common)：任何不是其区块的第一个sat的sat
    
*   不普通 (uncommon)：每个区块的第一个sat
    
*   稀有 (rare)：每个难度调整期的第一个sat
    
*   史诗 (epic)：每个减半周期的第一个sat
    
*   传奇 (legendary)：每个循环的第一个sat
    
*   神话 (mythic)：创世区块的第一个sat
    

因为有4个周期性事件，所以我们可以用度数法来一目了然地表示一个sat的序号，这样它的稀有度也能一目了然：

    A°B′C″D‴
    │ │ │ ╰─ sat在当前区块的位置（也可称为偏移量）
    │ │ ╰─── sat所在区块处于难度调整期的第几个区块
    │ ╰───── sat所在区块处于减半周期的第几个区块
    ╰─────── sat区块处于循环的第几个，从0开始
    

下面我们举一些例子：

**这是一个**[**普通**](https://ordinals.com/sat/1924963396167584)**的sat（这个sat刚好是一个铭文）**

![](https://storage.googleapis.com/papyrus_images/c56ac5b50c8bda707fe45778ea50b10a8376148039b045b16ce1f645e764a65d.png)

**这是一个**[**不普通**](https://ordinals.com/sat/0%C2%B0139941%E2%80%B21845%E2%80%B30%E2%80%B4)**的sat**

![](https://storage.googleapis.com/papyrus_images/cc4c129cfed179740025097ab13e8e7f68d36ce9899190356f7fccbb55c2a790.png)

**这是一个**[**稀有**](https://ordinals.com/sat/0%C2%B0201600%E2%80%B20%E2%80%B30%E2%80%B4)**的sat**

![](https://storage.googleapis.com/papyrus_images/af2490c21ed345aad2e9511f376dfe0e3e28d28918641375a97e96604057ed93.png)

**这是一个**[**史诗**](https://ordinals.com/sat/0%C2%B00%E2%80%B21008%E2%80%B30%E2%80%B4)**的sat**

![](https://storage.googleapis.com/papyrus_images/2337aac9fd62f345f2b2fbbaf50e04e164c3f47de8214e487bbcfb7645e7e83c.png)

**这是一个**[**传奇**](https://ordinals.com/sat/1%C2%B00%E2%80%B20%E2%80%B30%E2%80%B4)**的sat**

![](https://storage.googleapis.com/papyrus_images/b36a0adeecf5ed4dc30582d3901cbf678e74ad8d63441b1e4a07d23fbe7da221.png)

**这是一个**[**神话**](https://ordinals.com/sat/0)**的sat**

![](https://storage.googleapis.com/papyrus_images/bdd5387527145a00e84383aff5b9ac457e9a1d75a27c55568d24bcde5579f278.png)

按照稀有度的定义，我们可以知道当前所有sats中

**不同稀有度的总数量：**

*   普通 (common)：2.1 _\*_ 10^7 \* 10^9
    
*   不普通 (uncommon)：6,929,999
    
*   稀有 (rare)：3,437
    
*   史诗 (epic)：32
    
*   传奇 (legendary)：5
    
*   神话 (mythic)：1
    

**当前已经“挖”出来的sats的稀有度总数量：**

*   普通 (common)：1.9 \* 10^7 \* 10^9
    
*   不普通 (uncommon)：745,855
    
*   稀有 (rare)：369
    
*   史诗 (epic)：3
    
*   传奇 (legendary)：0
    
*   神话 (mythic)：1
    

铭刻和转移铭文
-------

上面内容就是Ordinal中涉及到的基本概念和原理，想要了解铭文和NFT的区别，还需要了解比特币链和以太坊的区别，他们在底层逻辑上有2个非常大的不同：

1.  比特币链没有账户概念而以太坊有，所以在比特币链上你地址上的BTC余额其实是累加你所有的UTXO而得到的。
    
2.  以太坊是图灵完备的智能合约，而比特币链上只有非图灵完备的脚本，在比特币链上可以完成的功能是非常有限的。
    

因为上面的区别，所以导致了：

1.  目前在比特币链上不能像以太坊上那样，通过部署一个智能合约，通过与合约交互获得NFT，而是通过执行一笔交易把铭文的内容通过脚本“附”到sat上，并且这个sat被保存在一个UTXO中。
    
2.  因为sat是BTC的最小单位，UTXO会包含这些sat（不可能存在有任何一个sat不属于一个UTXO），所以如果你拥有的铭文所在的UTXO被转走了，那你的铭文自然而然会被转移到其他地址
    
3.  很难通过去中心化的方式让它有合集（Collections）的概念，因为铭文是相对独立的，彼此之间并不知道互相的存在，如果想要建立合集，需要NFT发行方中心化地去定义
    

### 铭刻自己的铭文

了解了上面的原理，那铭刻铭文也相对简单了，其实就是通过发起一笔交易，通过支持Ordinal协议的钱包（目前是[Ordinals官方钱包](https://github.com/casey/ord/)）把你想要的文件通过脚本附加到一个sat上完成的。这笔交易的收款地址可以是你的付款地址，也可以是一个你指定的地址来接收这个UTXO，当你的收款地址收到这个UTXO的时候，那这个UTXO中的第一个sat将会是一个铭文。**除非你非常清楚自己要做什么，否则你接收铭文的地址请不要做任何交易**。下一篇文章我们会实际操作一下，教你如何在比特币链上铸造、发送和保管铭文。

### 铭刻其他项目的铭文

以太坊是通过与NFT项目方的智能合约交互获得NFT的，但比特币链不同于以太坊，目前无法通过与项目方发行的智能合约交互，通常是项目方在网站上公开他们的NFT文件（一般是图片），需要用户自己去下载对应要铭刻的NFT文件，然后根据上面的铭刻流程把内容上传到比特币链上，这样你就能得到这个项目的NFT（铭文）了。通过这个流程，很容易想到有个很关键的问题：如何防伪？

如果我上传的文件是被我修改过的，这可能是很细微的图片修改让肉眼无法识别，这样的文件是如何去防伪的？通常来说，项目方会在发布文件之前，把所有要发布的文件通过hash运算一次，得到一个hash值，然后再找到你上传的文件，做相同的hash操作，如果这个文件没有被修改，那他们的hash值是一样的；否则得到的hash值是不一样的，那这样项目方是不会承认这样的文件的，即你的NFT是假的。

因为没有智能合约的约束，文件也是自取的，所以任何人都可以在任何时间用相同的文件去制作铭文，那如何才能去确定哪一个铭文才是“正版”的呢？这时候项目方通常也会扫描所有被铭刻出来的铭文，先通过对比hash确认是自己项目的NFT，如果遇到同一张图片，会以最先被铭刻出来的为准。

其实能看得出来，这样的模式会带来一些防伪、确权和安全性问题。假如黑客事后也用相同文件铭刻了铭文，然后黑了项目方的网站，把对应铭文的编号指向黑客后铭刻的铭文，对于普通用户来说非常难去辨别真伪，也提高了门槛。

### 转移铭文

如果要转移你的铭文，只需要将该编号的sat对应的UTXO转到要接收该铭文的比特币地址即可。注意：因为这里要选择对应的UTXO，所以需要使用支持该功能的比特币钱包才行，否则用目前市面上的普通比特币钱包，造成的结果可能是无法预计的。对于不熟悉BTC原理的用户来说，通常建议的是如果一个地址接受到铭文了，就放在那里，不要做任何转账操作，以免铭文丢失，并且一个地址只接收一个铭文。

**关注AK Labs Twitter**

[https://twitter.com/0xAKLabs](https://twitter.com/0xAKLabs)

---

*Originally published on [AKLabs](https://paragraph.com/@aklabs-2/btc-nft-ordinal)*
