作者:比特里里 | X:@lilyanna_btc
编辑:Sam
一、内存池狙击是什么?
既然要介绍防狙击,先科普下此前内存池狙击的原理。大部分的 Ordinals 和 Runes 交易市场,卖家挂单时用的 PSBT 签名类型都是 SIGHASH_SINGLE | ANYONECANPAY,只能约束一个 output(来确保自己能收到约定好的钱)
简单说就是卖家签名的时候只限定了要卖的东西(input 里自己的 ordinal)和要收到的金额(一个收款地址为卖家的、固定金额的 output),至于是谁付钱,ordinal 打给谁,都没有约束。
因为在卖家的利益角度讲,卖给谁都一样,只要这个交易里同时完成卖出和收钱的动作就好了。
也正是因为这个机制,一旦购买交易进入内存池,狙击手就可以解析出这个签名,通过给更高的费率,把这个交易的付款人和收货人替换为自己后,让矿工选择打包这笔高费率的交易,抛弃原买家的交易。
毕竟 input 能换,output 里的收货地址也能换,只要有利可图,狙击手们就会出手。
二、ME 的全内存池保护原理
ME 的这个全内存池保护(Total Mempool Protection, TMP)和以前的方案有什么不一样呢?
抛弃了导致内存池狙击的罪魁祸首,SIGHASH_SINGLE | ANYONECANPAY,新的流程里全部都是 SIGHASH_ALL,不再出现任何 SIGHASH_SINGLE 了。
一句话概括:这次收货地址定死了,你有本事抢着替原买家付钱,反正收货地址你换不了,即使换成你付钱,货也不会到你手里。
新的购买流程分三步
交易一:买家凑钱,把交易中自己要出的钱凑出来,多出来的钱找零给自己。这个凑的钱包含给卖家的商品价格、给 ME 的手续费,以及后面交易的网络费。
交易二:买家第一步的钱付出去,卖家收到钱,Ordinal(这次交易的货)打到 ME 的中间地址。卖家挂单的时候签的名就用在这里,签名的时候用 SIGHASH_ALL 把 output 限死,谁也替换不了,也无法新增其他 output(除非你让卖家重签一个新的交易,跟它冲突)
交易三:ME 发货,把这次交易涉及的 Ordinal 转到买家地址,交易结束。这一步其实是 ME 和买家的 2/2 双签,Bob 曾经质疑这里有中心化作恶风险,例如 ME 拒不发货。但后来这个疑惑得到了解答——在买家发起交易流程时,ME 就会先给出自己那部分的签名,所以这个风险也就不存在了。
三、什么时候能用上?
ME 表示 TMP 将在近期上线,上线后,可以用 TMP 方式购买的 Ordinal,将在列表中用盾牌的形式标出(目前线上还没有找到这种标识,还要等过两天正式升级)。
这两天大家看到挂单的时候签名已经和以前不一样了,应该是 ME 在为功能上线做准备。(因为 TMP 的切换,需要先从卖家逐渐改挂单方式开始,以前旧的挂单签名是无法直接切到 TMP 方式交易的)
实际上,这个方案和 Lifofifo 在 5 月提出的方案有很多相似之处,尤其是 SIGHASH_ALL 的使用。但这个方案通过 Tapscript 实现了更高级的方式,消除了很多中心化风险,更优越。
常见问题
1、为什么要先进行第一步(买家支付费用,拿回找零)?直接去第二步交易找零不行吗?
不可以,因为第二步的卖家挂单签名时用 SIGHASH_ALL 对所有 output 做了约束,因此无法再增加找零的 output。
2、为什么要多一个提取的第三步?第二步直接 Ordinal 打给买家不就好了?
卖家签名的时候还不知道买家是谁呢,但是需要提前先把收货地址确定了(因为要用 SIGHASH_ALL,而不是 SIGHASH_SINGLE),所以引入一个 ME 的中间地址来构造签名。在成交时再通过第三步打给买家。
3、采用这种方式以后,就不会被别人狙击了吗?
严谨来说,是不会被人「通过在内存池解析签名后用 RBF 来狙击」。理论上,如果 ME 在这个过程中,因为缓存或者其他原因,让两个买家先后签了同一个卖单,那么这两个买家依然是可能互相竞争的。但实践上,ME 没有做这件事的动机,这对它来说没有好处,相信 ME 会从各种机制上杜绝这种情况的发生。
4、TMP 上线以后,买家 / 卖家能取消订单吗?
在交易上链前,买家和卖家应该还是能通过自己构造冲突交易来 RBF 掉这笔订单的,所以这个取消订单的问题依然无法避免。(别问怎么取消订单,这个不教哈,请大家遵守交易秩序)
5、会不会出现交易已经上链,但是卡在第三步提取流程的情况?那不就卡在中间地址里了?
别看分三笔交易,实际上这三笔交易应该是一起推进内存池的,且构成 cpfp 共享费率,一起上链的,会在同区块内完成所有操作,不存在卡中间的情况。
6、这个过程中,如何保证买家地址在第一个交易和第三个交易中的一致?
ME 有提到构建交易的过程中用到了 Tapscript 来对用户白名单进行编码,这里的细节不做展开(一是在实际操作中大家也没什么感知,讲起来也比较枯燥,二是太复杂了,ME 放出来的信息也还不是太多,三是我实在学不动了……)
声明:
以上均为根据公开资料的个人理解,仅作科普用途,如果有不严谨的地方欢迎技术大佬们指正。功能正式上线后会再给大家补一个操作指南,到时候应该会更好理解一些。
参考:
https://x.com/rexzh0u/status/1848736537019601157
https://x.com/BobBodily/status/1848784860397351368
https://x.com/lifofifo/status/1787927430172115421
免责声明:本文仅供参考,不得被用作法律、税务、投资、理财或任何其他建议,不代表 RunesCC 立场。
《MiX: Memecoin Supercycle 叙事下的 Runes 符文》
《Memecoins 超级周期:一场颠覆传统加密叙事的革命》
《2 号符文 Decentralized 首场中文 AMA 回顾》
【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。