Time:2023-08-02 Click:115
原文来自Twitter,作者 @AurtrianAjian from BTCStudy;经授权转载,不代表 Odaily 观点
我听过离谱的事情,但不知道你们可以这么离谱。 请停止参与 “BRC 20 ” 打新,并且,抵制它。
你不应该再参加,因为从技术上来说这种落后的东西必定会被淘汰。你应该抵制它,因为它会造成 UTXO 集的膨胀,其应用的实际后果已近乎粉尘攻击。
之前我已经写过,像 BRC 20 这样的东西压根不能被称为 “协议”,因为它根本无法保护使用它的用户。但当时我没有深入了解,我不知道它其实比我想象的还要离谱。从表面上看,BRC 20 定义了同质化代币的两种操作:“铸造(Mint)” 和 “转移(Transfer)” ……
在每一种操作的每一步中,都需要发起比特币交易并在交易输入中写入铭文(Inscription,通过输入的见证脚本在区块中写入数据)。但是,在 BRC 20 中,这些写入铭文的交易所形成的交易输出几乎没有任何意义。这就是问题所在。仔细看上面那份文档你会发现,其说法是:
“BRC 20 的余额状态可通过聚合所有这些函数的活动得出”;但是,所有这些函数的活动都是通过铭文表现出来的,没有任何一个函数的有效性要求花费特定的 UTXO(乃至特定的聪)。不论是你通过铸造还是转移获得了一些 token,在你后续需要转移这些 token 的时候,都不需要花费这笔让你获得这些 token 的交易。
也即这些 token 实际上并不附身于比特币 UTXO,它们的状态完全由已经写入区块的铭文(以及这些铭文的顺序)决定;改变这些 token 的状态不需要你拥有解锁某个 UTXO 的能力。(唯一需要 UTXO 关联的是转移操作的两步,详见下文)
这种设计对协议的安全性、经济性(可扩展性)和去中心化都有重大影响。首先,因为它不附身于 UTXO,自然也就无法依赖于 UTXO 本身的抗重复花费机制。BRC 20 整个建立在基于区块交易排序的 “先到先得” 原则上,没有这种 “先到先得” 作为最终的后盾,它就根本无法防止负余额这种重复花费形式。
但是,基于区块而不是 UTXO 的验证机制,也使得它不可能创造出一种轻量的验证机制。不论如何,你都需要全量的区块数据,来找出一个账户的状态。(但 RGB 和 Taro 这样基于 UTXO 的协议就不需要。它们只需要区块头)这也使得,能够负担余额计算、索引的节点,相比之下会更少,也即去中心化的特性更差。
也许是为了降低计算最新状态(识别假币)的负担,BRC 20 定义了一种奇怪的转移机制:不论你如何得到了一些 token,你的转移都必须分成两步:第一步,将一些 token 转化为 “可转移” 状态(并指定接收人);第二步,将这些 token 实际转移出去,并由此将第一步的 “转移铭文” 作废。你的下家也一样。
这样的机制当然也影响了用户体验和经济性。不论你可以从铭文机制中得到多少的折扣,多发一笔交易都足以把你得到的好处再吃回去。此外,这种奇怪的、不利用 UTXO 的机制,也使得这样的 token 在使用基于比特币 UTXO 的智能合约(闪电通道、DLC,等)的时候,先天增加了障碍,落后于最新一代的协议。
所以我说,BRC 20 是一种落后的技术。当新一代的代币发行协议能够实现轻量的客户端、经济代价更小而且更容易接入现有的比特币生态的时候,BRC 20 还停留在通过消耗区块空间来获得可编程性的程度。你可以想象,当 RGB 和 Taro 这样的协议的生态涌现的时候,等待 BRC 20 的结局是什么!
吊诡的是,虽然 BRC 20 的铸造和转移明明不需要 UTXO 上的关联,它却为铸造设计了一种 “限额” 机制 —— 在铸造代币的时候,单个 UTXO 所能铸造的代币数量,是可以指定上限的。你应该能猜到这是为了干什么。没错,这是为了适应 “打新” 这个场景中的公平性要求。
它不能让一个人用一个输出把所有的 token 都 mint 出来,所以设计了这样的限制。但试想,需要用 UTXO 来占位的时候,这些 UTXO 就必定是小额的 UTXO —— 你把资金切得越碎,能够得到的新 token 就越多。结果就是 UTXO 集的膨胀。
这些用来打新的 UTXO,被明确地规划成 546 聪(P2P KH 输出)/330 聪(P 2 TR 输出),也即仅仅持平于 bitcoin core 的粉尘输出限额。花费它们本身是不经济的, 后续的转移操作也不要求花费它们,那么,它们很可能会永远留在 UTXO 集中,造成 UTXO 集的不可逆的膨胀。
转移操作同样会留下 UTXO。虽然理论上不需要这些 UTXO 是小额的,但在当前的工程实现中,使用的依然是小额的 UTXO。并且,因为 BRC 20 不要求 UTXO 连贯花费的特性,被永远留在了 UTXO 集中。
图表显示,自 2023 年 4 月 23 号(BRC 20 开启交易的时候)以来,比特币的 UTXO 集已经从 5 GB 膨胀到了 6.8 GB。我尚无法证明所有的膨胀都跟 BRC 20 有关,但这段时间的增长曲线已经比原来的增长曲线陡得多。需要引起注意。
https://statoshi.info/d/000000009/unspent-transaction-output-set?orgId=1&from=now-5y&to=now&refresh=10m
抵制它。如果你是一个节点,你可以在节点的配置文件中增加这样一行:dustrelayfee= 0.00005 ,这会让粉尘输出的门槛提高 5 倍(该值的默认值是 0.00001 ,你可以酌情加减)。如果从前你的节点会转发带有粉尘输出的 BRC 20 交易,那么现在,你的节点将不再转发输出低于 2730 聪/1650 聪 的交易。
但是,如果这些交易能够进入区块,你的节点依然会保存这些交易以及它们的输出。如果你是一位开发者,请考虑开发识别 BRC 20 交易输出的过滤器,帮助我们将这些打新输出和转移输出从我们的 UTXO 集中删掉。我个人就会选择运行这样的过滤器。行动起来,保护比特币网络。