最近BTC上的NFT刷爆了整个币圈,Ordinal Loops、Ordinal Punks、Bitcoin Rocks和Ordinal Penguins都是目前大热的项目。
下面我们就从原理上来剖析在BTC链上通过Ordinal发行NFT(Ordinal官方更愿意称为数字艺术品而不是NFT)的原理。
在正式开始之前,我们先介绍一些基本概念
Satoshis(以下简称sat):也叫聪,是BTC的最小单位,1 BTC = 1 * 10^9 sat
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的sat
因为正常的sat序号过长了,所以又设计了不同的表示方法来表示这个序号
整数表示法:2099993888271341,这个表示sat被“挖”出来的顺序分配
十进制表示法:3879627.5570,整数部分表示的是区块高度,小数部分表示的是该sat在区块内的偏移量
度数表示法:3°99627'843''5570''',稍后解释
百分比表示法:99.99970907530168%,该sat在比特币供应量中的位置,以百分比表示
名字表示法:stefans,通过a-z这26个字母对整数表示法进行编码,这个编码规则是倒叙的,第1个sat的名字是nvtdijuwxlp,最后一个sat的名字是a,所以越后面的sat,名字会越短。
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作为输入再转出去
铭文刻有任意内容,创造了比特币原生的数字人工制品,通常被称为 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
因为每一个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开始
下面我们举一些例子:
这是一个普通的sat(这个sat刚好是一个铭文)
这是一个不普通的sat
这是一个稀有的sat
这是一个史诗的sat
这是一个传奇的sat
这是一个神话的sat
按照稀有度的定义,我们可以知道当前所有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个非常大的不同:
比特币链没有账户概念而以太坊有,所以在比特币链上你地址上的BTC余额其实是累加你所有的UTXO而得到的。
以太坊是图灵完备的智能合约,而比特币链上只有非图灵完备的脚本,在比特币链上可以完成的功能是非常有限的。
因为上面的区别,所以导致了:
目前在比特币链上不能像以太坊上那样,通过部署一个智能合约,通过与合约交互获得NFT,而是通过执行一笔交易把铭文的内容通过脚本“附”到sat上,并且这个sat被保存在一个UTXO中。
因为sat是BTC的最小单位,UTXO会包含这些sat(不可能存在有任何一个sat不属于一个UTXO),所以如果你拥有的铭文所在的UTXO被转走了,那你的铭文自然而然会被转移到其他地址
很难通过去中心化的方式让它有合集(Collections)的概念,因为铭文是相对独立的,彼此之间并不知道互相的存在,如果想要建立合集,需要NFT发行方中心化地去定义
了解了上面的原理,那铭刻铭文也相对简单了,其实就是通过发起一笔交易,通过支持Ordinal协议的钱包(目前是Ordinals官方钱包)把你想要的文件通过脚本附加到一个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