# 《Bitcoin Ordinals协议指导手册》第二篇：Ordinal BIP技术细节 

By [0xraft.eth](https://paragraph.com/@0xraft-eth) · 2023-05-07

---

![](https://storage.googleapis.com/papyrus_images/97a8250c5824dceb8be0302430d7f17b5f7f7a957d35fc30b44015339c999499.webp)

BIP: 名称待定

层: 应用

标题: Ordinal Numbers

作者: Casey Rodarmor [casey@rodarmor.com](mailto:casey@rodarmor.com)

Comments-Summary: No comments yet.

Comments-URI: [https://github.com/casey/ord/discussions/126](https://github.com/casey/ord/discussions/126)

状态: 草案

类型: 信息

创建日期: 2022–02–02

许可协议: 公开文档

**简介**
------

**摘要**

本文档定义了为聪分配序列号的方案。

**版权**

这项工作已被置于公共领域。

**动机**

比特币没有稳定、公共账户或身份的概念。地址是一次性的，钱包账户是私人的。此外，使用地址或公钥作为稳定标识符可以排除所有权转移或密钥轮换。

该提议的动机是希望提供比特币应用程序可以使用的稳定标识符。

**说明**
------

**设计**

每个聪都按照它被挖掘的顺序从0开始连续编号。这些数字叫做“序号数（ordinal numbers）”或“序号（ordinals）”，因为它们是数学意义上的序号，给出了每个聪在总供应量中的顺序。“序号”这个词非常明确，因为它没在比特币协议的其他地方使用。

根据交易输入和输出的大小、顺序，将交易中的“输入聪”序号按先进先出的顺序转移（transfer）到“输出聪”。

如使用与“ UTXO 集”中当前输出相同的交易 ID 挖掘交易，按照比特币核心的行为，新的交易输出则会取代旧的 UTXO 集条目，从而破坏包含在第一笔交易中任何未支出输出（unspent outputs）的聪。这条规则用于处理两对具有重复交易ID的主网交易，即区块 91812/91842 和 91722/91880 的 Coinbase 交易，这些交易是在 BIP-34 无法创建具有重复 ID 的交易之前开采的。

出于分配算法的目的，Coinbase 交易被认为具有与补贴大小相等的隐式输入，以及区块中每个付费交易（按照这些交易在区块中出现顺序）的输入。隐性补贴的输入包含了该区块新创造的聪。隐含的费用输入包含在区块交易中作为费用支付的聪。

少支付补贴并不会改变后续区块开采的聪序号。序号只取决于有多少聪可能被开采，而不是实际有多少聪。

**规范**

通过以下算法对聪进行编号和传输:

**#给定区块高度的补贴**

def subsidy(height):

return 50 \* 100\_000\_000 >> height // 210\_000

**#给定区块高度的第一个序号补贴**

def first\_ordinal(height):

start = 0

for height in range(height):

start += subsidy(height)

return start

**#在给定区块中分配序号**

def assign\_ordinals(block):

first = first\_ordinal(block.height)

last = first + subsidy(block.height)

coinbase\_ordinals = list(range(first, last))

for transaction in block.transactions\[1:\]:

ordinals = \[\]

for input in transaction.inputs:

ordinals.extend(input.ordinals)

for output in transaction.outputs:

output.ordinals = ordinals\[:output.value\]

del ordinals\[:output.value\]

coinbase\_ordinals.extend(ordinals)

for output in block.transaction\[0\].outputs:

output.ordinals = coinbase\_ordinals\[:output.value\]

del coinbase\_ordinals\[:output.value\]

**术语和符号**

一个聪点（satpoint）可用于指示聪在输出中的位置。一个聪点由一个输出点（outpoint）组成，即一个交易 ID 和输出索引，加上该输出中序号的偏移量。例如，如果正在讨论的聪在交易的第一个输出中位于偏移量 6，那么它的聪点为：

\`680df1e4d43016571e504b0b142ee43c5c0b83398a97bdcfd94ea6f287322d22:0:6\`

**讨论**
------

**基本原理**

序号被设计为独立于比特币协议的其他方面，因此可以与其他 L1 和应用程序层结合使用，即使是那些在设计时并未考虑序号的应用程序。

序号聪可以使用当前和未来的脚本类型来保护。它们可以被单签钱包、多签钱包、时间锁定和高度锁定以所有常用的方式持有。

通过为所有的聪分配序号而不需要明确的创建步骤，序号用户的匿名集就被最大化。

由于聪有一个包含它的输出，并且输出有一个控制它的公钥，因此聪的所有者可以通过使用与控制 UTXO 关联的地址对消息进行签名来响应挑战。 此外，通过将聪转移到新的输出，聪就可以转手，或者可以在不改变所有权的情况下轮换其私钥。

序号不需要对区块、交易或网络协议进行更改，因此可以立即采用或忽略序号，而不会影响现有用户。

序号没有显式的链上足迹。然而，一个合理的反对意见是，采用序号将增加对输出的需求，从而增加全节点必须跟踪的UTXO集的大小。请参阅下面的异议部分。

序号格式极其简单。上面的规范是15行代码。

序号是公平分配的。它们不是预先开采的，而是按比例分配给现有的比特币持有者。

序号是尽可能细颗粒度的，因为比特币无法跟踪“比聪小（sub-sat ）”值的所有权。

**传输和粉尘（Dust，最小值）限制**

任何“单聪”传输（transfer）都可以在单笔交易中完成，但由此产生的交易可能包含低于粉尘（Dust，最小值）限制的输出，因此是非标准的且难以包含在区块中。想象一个场景，Alice 拥有一个包含范围为聪\[0,10\]的输出，当前的粉尘限制是5聪，Alice 希望向 Bob 发送聪 4和6，但保留序号5。Alice 可以构造一个具有大小为5、1、5的三个输出的交易，分别包含聪\[0,4\]、5、\[6,10\]。第二个输出在灰尘限制之下，因此这样的交易将是非标准的。

这种传输（实际上任何传输）都可以通过将传输分成多个交易来完成，每笔交易执行一次或多次拆分，并根据需要在填充输出中合并。

也就是说，Alice可以在两笔交易中执行所需的传输。第一笔交易会发送聪 \[0,4\] 给 Bob，然后作为“零钱聪（change sat）”\[5,10\] 返回给 Alice。第二笔交易将以至少 4 聪的输出、找零输入和至少 1聪的额外输入，作为“输入”，并创建一个大小为 5 的输出到 Bob 的地址，其余的则作为零钱（change）“输出”。这两项交易都避免了创建任何非标准输出，但仍然完成了相同的所需聪的传输。

**异议**

隐私：序号是公开的，因此用户隐私会缺失。

使用序号的应用程序，要求这些序号为公开信息，所以使用序号应用程序的用户会缺失隐私。

可替代性：序号降低了比特币的可替代性，因为在交易中收到的序号可能带有一些公共历史记录。

由于所有人都可以任意发送聪，因此理性的人会认为聪的新持有者不能被理解为旧持有者，或者与旧持有者有任何特定关系。

拥堵：采用序号将增加交易需求，并推高费用。

由于比特币需要发展一个强大的收费市场，因此对该提案表示强烈支持。

UTXO 集膨胀：采用序号会增加对 UTXO 集中条目的需求，从而增加 UTXO 集的大小（size），需要所有全节点进行跟踪。

粉尘限制使输出值较小的输出变得困难，应该鼓励用户创建无灰尘输出，并在不再使用所含的聪时把它们清理掉。

**安全**

与聪相关联的公钥可能会发生变化，需要积极关注区块链来跟上密钥的变化，相较于其他静态公钥系统，这更要多加小心。然而，具有静态公钥的系统存在无法轮换密钥或无法易手的问题。

序号感知软件（Ordinal-aware software）必须避免在交易中无意地放弃有价值的聪，比如将其转让给不受控制的输出，或将其用作其他费用。

**隐私注意事项**

序号是可选项，不应影响现有用户的隐私。

序号本身是公开的，但这是那些想启用“序号”的应用程序的需求（需要启用公共标识符 public identifiers）。

序号感知软件不应该把所有的聪混合，因为可能有一些聪是公开可见的数据，另一些“序号聪”则是用于支付或储蓄的。一旦混淆，用户公开可见的数据将会关联与其匿名钱包的输出。

**可替代性考量**

由于聪可被任意发送，因此被传输的聪（包括有公开记录的聪），也应该被认为可以与其他没有公开记录的聪进行互换。

向后兼容性

序号是完全向后兼容的，不需要改变比特币网络

**缺点**
------

大索引的尺寸

支持与序号相关的快速查询索引构建起来很慢，而且会占用大量空间。

将 UTXO 映射到它们包含的序号的 O(1) 索引当前为 100 GiB。 包括花费输出在内的相同索引为 10 TiB。

支持将单个序号映射到包含它们的 UTXO 的相反映射的 O(1) 索引可能很难处理。然而，O(n) 索引则是快速且实用（ n 是序号易手的次数）。

大型位置证明

可以构造一个证明来证明一个特定的聪包含在一个特定的输出中，然而这些证明是很大的。这样的证明包括:

\- 区块头 — 创建聪的 Coinbase 交易的 Merkle 路径 — 创建聪的 Coinbase 交易 — 对于该聪的每次支出：

\-支出交易

在支出输入之前创建输入的交易，

确定前面输入的值，

确定聪的位置

\- 并且，如果聪被当作费用，则可以从其花费的区块中的所有先前交易、以及Coinbase交易，来确定聪在输出中的位置。

---

*Originally published on [0xraft.eth](https://paragraph.com/@0xraft-eth/bitcoin-ordinals-ordinal-bip)*
