
BIP: 名称待定
层: 应用
标题: Ordinal Numbers
作者: Casey Rodarmor casey@rodarmor.com
Comments-Summary: No comments yet.
Comments-URI: 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交易,来确定聪在输出中的位置。
