# 漫评BTC生态(一):BRC-20的本质是一种新流动性范式 **Published by:** [mtyl.eth](https://paragraph.com/@mtyl/) **Published on:** 2023-12-13 **URL:** https://paragraph.com/@mtyl/btc-brc-20 ## Content 核心观点BRC-20的本质是一种新流动性范式以BRC-20为代表的铭文代币,在刚推出时并不受主流Web3社区认可。多数观点在技术分析中将其类比为Omni-USDT等早期比特币衍生资产协议,在市场分析中将其上涨归因为普通MEME币的逻辑(Fair Mint概念反VC,庄家拉盘,散户FOMO等)。但实质上,BRC-20所代表的是一种新的crypto资产流动性范式。 在早期,BRC-20的资产逻辑很像NFT。所有的参与者都只能在比特币的链上做交易,往往以“张”而不代币数量为单位打新、交易。更高的铸造成本让所有参与者的天然的初始成本就比较高,加上较高的交易费用和较长的等待时间,早期参与者在退出的时候往往会三思。而这种低流动性,也给了它相对虚高的地板价,进一步增强了持有人的信心。 正如Solana等新公链的NFT往往发展不如以太坊 NFT,对于一个新的早期资产,流动性太好、参与者可以轻易低价退出,对项目而言未必是一件好事。而生长于比特币链上的BRC-20,天然享有了早期较低的流动性 到了中后期,BRC-20的资产逻辑更像普通代币。因为它本身作为“代币”的可拆分性,使得每“张”BRC-20代币能够被拆分成更小单元、或者聚合成更大单位进行交易;而且它也能够上币安的大中心化交易所,等到真的上了币,那么在交易所用户视角的里面它和其它的代币就几乎没有区别了。 这种可拆分性、流动性随着项目发展阶段自适应的特点,是NFT所不具备的,也是BRC-20真正的杀手锏。在NFT牛市的时候,许多人都苦于头部NFT单价太高难以参与,而各种“NFT流动性解决方案”到目前也没有真正普遍成熟的。而如果从这个角度来看的话,BRC-20就可以看做是自带“碎片化”方案的NFT。本文说明和阅读导览正文部分具体分为三个部分:比特币交易与脚本技术原理Segwit和Taproot升级铭文:Ordinals协议与BRC-20等衍生协议全文较长、且前两部分主要是一些技术讲解,希望帮助读者从原理角度理解铭文。 如果读者更希望了解铭文相关的观点,对比特币基础技术不感兴趣,建议直接从第三部分开始看。一、比特币交易与脚本技术原理交易脚本的结构当一个人开始发送交易到比特币网络的时候,实际上他是委托了一个网络中的比特币节点、向比特币交易池子中广播了一段记载着这段交易信息的脚本。 交易脚本由以下四个部分组成:版本号、输入部分(输入数量、输入脚本)、输出部分(输出数量、输出脚本)、锁定时间。[nVersion] [nInputCount] [txInputs] [nOutputCount] [txOutputs] [nLockTime] 最经典的比特币交易范例拆解如下:01000000 // 4 bytes version /* input */ 01 // number of inputs e34ac1e2baac09c366fce1c2245536bda8f7db0f6685862aecf53ebd69f9a89c // tx id 00000000 // input index 00 // unlocking script length ffffffff // unlocking script /* input end */ /* output */ 02 // number of outputs a025260000000000 // amount 19 // locking script length 76a914d90d36e98f62968d2bc9bbd68107564a156a9bcf88ac // locking script 5062250000000000 // amount 19 // locking script length 76a91407bdb518fa2e6089fd810235cf1100c9c13d1fd288ac // locking script /* output end */ 00000000 // 4 bytes locktime 输出基础上交易输出就是一个不可分割可以让所有使用者花钱的比特币集合,也就是UTXO(未花费的交易输出):amount,这个输出是有多少比特币的意思,但单位是satoshi,比特币值的最小单位locking script,俗称“锁定脚本”,它确定这个输出要可以被花费所需要的足够的条件,就是一个锁来保护这个输出不会被其他人花费回到上面比特币的范例交易拆解来看,output 一开始会有1 byte大小的数据告诉我们总共有几个output,这边范例是2个,接下来 amount 的部分展示每笔output的数量。最后是锁定脚本locking script。输入一般会先有1个字节的大小告诉我们在这个交易中有多少个输入,可能不只是一个输入,因为有时候需要很多小额的UTXO要凑起来买一个贵的东西。 接下来就是告诉我们要去transaction id是多少的第几个输出找到这个UTXO。脚本语言基于栈的语言Script: 2 3 OP_ADD 5 OP_EQUAL比特币语言是图灵不完备的,主要是因为它不支持“循环”。 在图灵完备的语言中,如Python、Java或C++,程序员可以编写循环,使得一段代码可以反复执行,直到满足某个条件。然而,比特币脚本语言没有这个特性。 这样做的原因是安全性和预测性。在一个公开、无信任的网络中(如比特币),允许任意复杂的程序(尤其是那些可以无限运行的程序)可能会带来安全风险。恶意的攻击者可能会试图通过提交一个设计成无限循环的交易来拖慢或卡住网络。而因为比特币脚本语言是图灵不完备的,所以这种攻击是不可能的。 此外,由于比特币脚本语言的简单性,它可以更容易地进行形式化验证。这意味着,你可以通过检查一段脚本,来准确地预测它的行为,而无需实际执行它。这在设计安全和可靠的金融系统时非常重要。交易类型与脚本语言支付公钥哈希 (P2PKH)绝大部分的比特币交易都是采用这个脚本,就像是Alice的地址送钱给Bob的地址这种交易。P2PKH的锁定脚本会长的像这样OP_DUP OP_HASH160 <公钥散列> OP_EQUAL OP_CHECKSIG 上面的Public Key Hash其实就等同于拥有者的地址,只是还有没有做Base58Check编码的版本,这也是为什么他叫做P2PKH,因为他是付钱给Public Key Hash,说穿了就是付钱给一般的地址。而如果需要花费这个UTXO,输入的解锁脚本只要长的像<签名> <公钥> 所以我们把P2PKH的解锁脚本和锁定脚本接起来就会长这样。整个验证过程长这个样子:一开始先依顺序把签名和公钥推送上去堆栈。再来看DUP把栈顶的东西,也就是公钥,多次制作一次。接下来是HASH_160HASH160把stack最上面的公指针pop出来,做一次,再push返回stack上面。接下去遇到Public Key Hash,当然是直接push上去stack。P2PKH要在做两件事情你要给出公钥来证明,这个UTXO所属的地址就是你的,因为公钥可以生成唯一的地址(这边其实是Public Key Hash,但意思和地址一样拉)。除了给公钥还不够安全,你还要再给一个签名证明你手上握有密钉,因为签名的产品需要密钉,但试验证明却只需要公钉。支付公钥 (P2PK)他其实很简单就是简化版的P2PKH,他的locking script 长的像下面这样<公钥 A> OP_CHECKSIG 而他对应的解锁脚本长的像这样<私钥A签名> 他直接把公钥放在locking script了,所以你的unlocking script不用再给公钥了,给Signature来验证就好了。数据输出(OP_RETURN)第三个标准类型的交易叫做数据输出,他就是我们上面所说不能花钱的输出,它的用途是拿来记录的,因为区块链有公开透明不可被窥改的好的地方,因此这种状态的output 就产生了,纯的资料记录不用于转钱。而他的脚本(严格要说的是锁定脚本)就长这样OP_RETURN <数据> 他不能被解锁所以不会有解锁脚本,又因为这种输出不能被花费,所以他也不会计算UTXO,在记忆体里的那个资料库也不会有这种输出。 但是,OP_RETURN后数据的长度被限制在80字节,因为中本聪并不希望大家把BTC宝贵的区块空间单纯用来存数据。 最早的Omni-USDT就是利用这80个字节的OP_RETURN空间实现的,其技术原理和后来的BRC-20非常有许多类似之处。具体来说,每个Omni-USDT交易由OP_RETURN内的16字节表示,具体如下: Transaction version:交易版本。2个字节,值为0. Transaction type:交易类型。2个字节,‘简单发送’值为1. Currency identifier:货币标识符。4个字节,USDT值为0x1F(31). Amount to transfer:转账金额。8个字节。 结合具体实例做解析: 6f6d6e69000000000000001f000000174876e800 解析如下: 6f6d6e69:‘omni’对应的 ASCII 编码,因为交易备注与 omni 协议有关 0000:交易版本 0000:交易类型,代表‘简单发送’ 0000001f:31,代表 USDT 000000174876e800:USDT 转账金额,1000 00000000 最小单位 = 1000 USDT 但由于比特币链的效率和手续费的原因,以及以太坊等“新公链”的兴起,USDT等新币的主阵地逐渐转移到了其它链上。多重签名多签:现在有一个脚本他是由N个公钥组成的,而且如果要解锁他所保护的UTXO只需其中M个提供签名即可。而M在比特币里目前最大限制为15个公钥,他的锁定脚本长的像这样M <公钥 1> <公钥 2> ... <公钥 N> N OP_CHECKMULTISIG 例如 2–3 多重签名 就如下2 <公钥 A> <公钥 B> <公钥 C> 3 OP_CHECKMULTISIG 然后要解锁他的解锁脚本就会是OP_0 <签名 B> <签名 C> 支付给脚本哈希 (P2SH)从上面的多签来延展,如果现在是2–5的架构locking script会有多长,如果是3–7呢?locking script太长会造成什么负担?我们知道locking script是用来保护的保护 UTXO 不被盗用的,locking script 的增长会导向UTXO的肥大,而我们刚说过UTXO为了方方便会存在昂贵的记忆体里面,因此如果UTXO越来越大比特币节点对记忆体的消费也会越来越多凶猛,因此P2SH就登场了。 P2SH的作用其实就是把很长的locking script 做一次hash 之后来代替他,来缩小locking script, 把这部分移到Unlocking Script。简单来说差异如下图另外一个P2SH很重要的特点是,因为locking script现在夹住的是一个经过HASH160的产物,这个跟生成地址的过程是一样的,如果再把他做Base58检查编码,也可以得到一种地址,就是大家很常说的multisig地址,这种地址固定3开头,他跟一般的地址可以做到的事情一样,别人可以送钱到这个地址,而这个地址也可以转钱出去,差别只在这种地址 送钱的交易签名时需要redeem script并且可能不仅仅是一个签名的参与。 总结P2SH来说他有以下几个优点虽然input和output都会在区块链上,但是因为redeem script被放到input了,所以也只有等到被花费时才会增加区块链的大小,而不是现在就立即增加大小。他可以将送钱目标改成一种3开头的地址,而不是一个显示的多签地址,这样可以保护那些没有参与拿钱的人的隐私他可以让手续费的压力转移到拿钱的人身上二、Segwit和Taproot升级Segwit-BIP141简单理解:Segwit 就是想方设法地把 scriptSig 给移出去,从而实现区块扩容1MB→4MB 进一步理解: 中本聪之前的代码中写到,在审核统计区块大小的时候,每一个区块大小不超过1M。 隔离见证就是把脚本签名(scriptSig)信息从基本结构 (base block) 里拿出来,放在一个新的数据结构当中。做验证工作的节点和矿工也会验证这个新的数据结构里的脚本签名,以确保交易是有效的。 当审核统计区块大小不能超过1M的时候。脚本签大小不会被计算在内。因此这是一个软升级技术原理: BIP141选择在前一笔输出的locking script 动点手脚,只需要看到scriptPubKey是0x00开头,他就被赋予了新的意义。 P2WPKHwitness: <signature> <pubkey> scriptSig: (empty) scriptPubKey: 0 <20-byte-key-hash> (0x0014{20-byte-key-hash}) 全名是public key 被放入了witness program,因此输入的scriptSig就可以是空的。简单来说,scriptPubKey的开头为0让脚本引擎知道这是一个segwit交易,而接下来的20字节让脚本引擎更明确知道这是一个P2WPKH输出,因此脚本引擎就会去见证程序拿签名和公钥,最后的验证就和普通P2PKH一样了。 为什么旧版本能兼容: 如果你不升级,你看到的就是一个空的输出签名,表面含义是“这是个谁都能花的输出”。但你真想花的时候,大部分升级过的节点会检查你提供的签名脚本,这是旧版本客户端所无法提供的。 Segwit采用率已经达到了96%Taproot BIP340-342Taproot是2021年比特币的一次升级,它是基于Segwit的。 这次升级其实夹了三个主要的变化,而且其中因为要支持Schnorr签名,所以比特币的脚本系统势必要做一些改动(BIP- 342 ),在废弃一些低效率的操作码和新增加一些新的操作码的同时,Bitcoin Core 也顺便取消了 Bitcoin script size 的限制。(来自 BIP-342 维基) 从脚本视角上来看,Taproot继承了Segwit脚本,给了一个新的脚本version,如果看到新的版本号那么这就是Taproot脚本。 Taproot脚本取消了script size的限制,很大的增加比特币能做到的事。这个改动倒是给了把图片放上去比特币一个很好的解决方法,以下是Ordinals协议的脚本示例:<signature> OP_FALSE OP_IF OP_PUSH "ord" OP_1 OP_PUSH "text/plain;charset=utf-8" OP_0 OP_PUSH "Hello, world!" OP_ENDIF <公钥> 上面这段脚本拿掉中间全部的操作码跟数据的话,就是一般标准的签名,而中间这段脚本在做什么?OP_FALSE 会将一个空数组push到栈中,注意这边是有push东西的,只是它是空的。OP_IF 检查堆栈顶部,如果为真才会做接下来的事情,因为前面OP_FALSE 的动作,导致这个如果不会立。接下来是OP_PUSH … 等一系列操作都会被忽略,因为为上一个如果条件没有达成。OP_ENDIF 结束这个 if 块。可以看出来中间这些操作因为OP_IF 一定不会成立,所以实际上什么状态都没有改变,于是就可以把图片的完整资料都放在OP_IF里面而不是影响本比特币脚本的验证。因此在taproot升级后,脚本现在是没有多大限制了。所以只需要交易的大小关于块的大小 (4 MB),脚本你要多少都可以,也就是说我们可以达到类似OP_RETURN的效果,把无关的资料放上比特币,还没有 80 字节的大小限制。三、铭文:Ordinals协议与系列衍生协议(BRC-20等)Ordinals协议Ordinals 是一种允许在比特币区块链上铸造 NFT 的协议。其核心思路是:比特币区块链上每一个 satoshi 都是按照挖矿的时间顺序生成的,并且可以在每个 satoshi 上写入内容(文字、图片、视频等),这个写入的过程称为“铭刻”,因此Ordinals协议以及类似技术原理的协议也被统称为“铭文赛道”。可见,只要能够给每个 satoshi 进行编号,并允许它们被追踪和转移,那么写入每个 satoshi 上的内容都有了独一无二的编号,这就是通常大家通常所说的 NFT。 在这一思路下,Ordinals 就实现了以下两个关键功能: 1. 给 satoshi 创建一个编号系统(序数理论); 2. 给 satoshi 写入数据。 这一协议有以下几个特点:NFT 完全存储在比特币区块链上,无需侧链或生成其他 Token;NFT 与比特币区块链一样安全、去中心化、稳定。比特币 NFT 的具体细节可以通过查看其所对应的 satoshi 上的内容来发现,比如以 inscription 129490 为例,它里面包含了交易 id、NFT 所有人的地址、输出价值、satoshi 的编号、生成时间等信息。案例:inscription(铭文)129490 通过在比特币浏览器中输入 genesis transaction 的那串字符,可以找到该 satoshi 所在的交易区块。想象一下,比特币区块链就是这样由一个又一个区块组成的数字博物馆,而每一个比特币 NFT 都是陈列其中的数字文物。BRC-20BRC-20技术原理在 Ordinals 协议发布2个月后,推特用户 @domodata 在Ordinals协议上,又提出了一个比特币上的 Token 标准——BRC-20 标准。作者也直说,这个BRC-20中的“BRC”并不是什么东西的简写,完全就是仿造ERC-20的命名方式。但这种命名方式效果出其意料的好 —— 不仅直截了当的告诉大家这是一套在比特币上的代币发行标准,而且也给了大家“类似ERC-20”的想象空间。 BRC-20本质上是用了Ordinals刻录文本的功能,约定了一套用json文本记账代币的格式。具体来说,定了3个函数:Deploy部署{ "p": "brc-20", "op": "deploy", "tick": "ordi", "max": "21000000", "lim": "1000" } 部署铭文,tick字段用来表示代币名,max表示供应量,lim表示每次mint的最大数额。值得注意的是,BRC-20协议规定其代币名“tick”不能超过4个字符,这使得命名空间比较小,代币名遵循“先来先得”的原则。Mint{ "p": "brc-20", "op": "mint", "tick": "ordi", "amt": "1000" } 铸造铭文,填写tick字段用来表示代币名,amt表示该次mint的数额 3.转移 { "p": "brc-20", "op": "transfer", "tick": "ordi", "amt": "100", "to": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa" } 转移铭文,需要填写代币的、代号、数量和目的地址。 可以看出,BRC-20在链上表达的部分并不多,要搞清楚有关一个币的每个地址的具体持仓数量,是非常依赖于外部中心化解析的,因此相关基础设施的搭建是一个机会。Unisat和OKX钱包就很好的把握住了这个机会,及时地做出了BRC-20代币的钱包和交易所功能,既也让新入场的人有了成本更低的上手方式,也给自己带来了大量流量。BRC-20为什么火从技术角度来看,BRC-20也许并不能算是一个特别创新的技术。前文提到2013年的时候Omni协议就能发token,最早的USDT也是先在BTC上面发的。因此,在BRC-20刚出来的时候,许多人都认为这只是一种新的空气币,认为它和早年的Omni-USDT等协议并无不同,能火起来充其量只是一种新的MEME逻辑。 然而,事实并非如此。把BRC-20代币和普通MEME币、Omni-USDT等早期比特币代币做类比的人,往往忽略了BRC-20实际上是创造了一种新的流动性范式。 首先,所有通过BRC-20协议创建的代币都是“公平发售”(Fair Mint)的。之前无论是各种公链币还是各种ERC-20等标准的项目币,其在面向大众发售之前往往都已经给了项目方内部人员、VC投资机构等预留了大量的低筹码代币,导致散户在可以买筹码的时候往往要面对这些低筹码成本的出售。而对于BRC-20代币,哪怕是部署代币的人,在铸造代币的时候也需要一视同仁的缴纳比特币网络费用,使得没有人能够在早期攒下低筹码成本。这对在熊市中被项目方和机构“收割”了一年多的散户而言,是非常有吸引力的。从事实上来看,这也使得许多铭文代币在筹码分布上比较分散、健康。 但仅仅凭借Fair Mint这个特性并不够,因为在其它链上,通过智能合约也能够实现Fair Mint。 BRC-20的特殊之处在于,早期它像NFT的逻辑,所有的参与者都只能在比特币的链上做交易,更高的Mint成本让所有参与者的天然的初始成本就比较高,加上较高的交易费用和较长的等待时间,早期参与者在退出的时候往往会三思;而这种低流动性,也给了它相对虚高的地板价,进一步增强了持有人的信心。正如Solana等新公链的NFT往往发展不如以太坊 NFT,对于一个新的早期资产,流动性太好、参与者可以轻易低价退出,对项目而言未必是一件好事 而到了中后期,它本身作为“代币”的可拆分性,也让它能够被拆分成更小单元作为交易;而且它也能够上币安的大中心化交易所,等到真的上了币,那么在交易所用户视角的里面它和其它的代币就几乎没有区别了。这种可拆分性、流动性随着项目发展阶段自适应的特点,是NFT所不具备的,也是BRC-20真正的杀手锏。在NFT牛市的时候,许多人都苦于头部NFT单价太高难以参与,而各种“NFT流动性解决方案”到目前也没有真正普遍成熟的。而如果从这个角度来看的话,BRC-20就可以看做是自带“碎片化”方案的NFT。其它Ordinals衍生的资产协议在BRC-20生态爆发之后,很多人认为BRC-20并没有释放出Odinals本身可以做改进以支持更多功能,因此又出现了很多以类似结构命名的、以Ordinals协议为基础的资产协议,举例如下: ORC-20:该协议可以视为BRC-20的改良版,主要针对BRC-20存在的问题进行优化,比如其命名空间有限的问题、最大供应量不变的问题、以及潜在“双花”风险等。 BRC-420:该协议也是基于Ordinals,但主要是支持了更多类型的资产,可以2D图片甚至3D资产模型给铭刻到链上。另外,BRC-420也引入了版税功能,使得创作者能够分享到自己作品后续的收益。BRC-420协议还在一个持续完善的阶段,相关基础设施的搭建还并不成熟,但本身可以承载的东西更多、上限也更高。BRC-20在Web3社区内部的共识分裂在2021-2022年,Mass Adoption(为大众所采用)是Web3最大的主流叙事框架之一,在这个叙事框架下各种新公链、跨链方案、以太坊扩容方案、模块化区块链方案层出不穷,也受到了最多的关注。在那个时候,比特币由于其效率问题、应用承载问题,似乎已经淡出了主流Web3社区的视野,被看做是上个时代的OG才关注的老玩意。 而2023年BRC-20的火爆以及比特币生态的兴起,其实是对“Web3本质到底是什么”的一个拷问。毕竟BRC-20这种资产发行方式,服务的主要是Web3的散户,在技术、效率上是在“开倒车”,和Mass Adoption的叙事毫无关系,似乎更加印证了“Web3本质是赌场”这种偏cynical的观点。也有社区成员开始质疑Web3、Mass Adoption的概念本身,认为回归Crypto叙事行业会更好。 对于特别看中项目基本面、对行业的价值、Mass Adoption潜力的投资者而言,往往难以说服自己真正参与到BRC-20以及衍生协议里面来,更愿意去关注当下的其它相对“基本面更扎实”的热点,比如DePIN、Solana生态。直到现在,相关的讨论依然在继续。 ## Publication Information - [mtyl.eth](https://paragraph.com/@mtyl/): Publication homepage - [All Posts](https://paragraph.com/@mtyl/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@mtyl): Subscribe to updates - [Twitter](https://twitter.com/Mtyl_7th): Follow on Twitter