Photo by Artūras Kokorevas

Sparrow Wallet (Bitcoin)

理论

UTXO 是什么

UTXO, 全称为Unspent Transaction Outputs, 即未花费的交易支出.

比特币中，任何一笔 transaction, 都有一个 input, 以及相应的 output

相较于 EVM 生态，BTC 更像是纸币，而 EVM 更像是银行 [👉 以下例子均不考虑实际 RMB 面额限制 👈]

举个例子，你有 100 元现金 RMB, 一张纸币，10 快钱转账给老王，gas 设置为 5, 那么最后你会剩下一张面额为 85 的 UTXO, 你的一张 100 元纸币，变成了一张面额为 85 的纸币

上面的花销中，100 元纸币就作为 tx 的 input, 而 output 分别是

85 (返回给自己的 UTXO), 会返回给你自己的钱包，

10 (这个 UTXO, 即面额为 10 的纸币) 是给到了对方的钱包

5 (面额为 5 的纸币) 是给到了矿工的钱包

后面你再花钱，只能花这 1 张纸币 (面额为 85). 作为交易的输入，去发起新的 transaction.

最后 你想给把自己面额 85 的 UTXO 拆掉，拆成 30+50, 那么你发起第二笔 tx, 接收方是自己，面额为 50. 那么，input 是 85 的 UTXO, output 有三个

自己发给自己，面额为的 50 的 UTXO

剩下的面额为 30 的 UTXO

还有面额为 5 的 UTXO 进了矿工的钱包

加速交易的两种方法

❤️ ❤️ ❤️ 不管你用 RBF 还是用 CPFP, 都需要确保自己 UTXO 的 Balance 是足够的，不然是无法加速的 ❤️ ❤️ ❤️

RBF, 全称为Replace-by-fee, 即未确认的 transaction, 可以用新的 transaction (并给予新 tx 更高的 gas) 来替代掉，

首先明确 只有是你自己的 UTXO 作为 input, 才能去发起 RBF 🍎

其次，来Here查看你的 tx 是否可以 RBF, 比如下面这一笔就可以进行 RBF

最后 举个例子来说明，RBF 是什么

同样以上面钱包里只有 30+50 这两笔 UTXO 来说，我新发起一笔 tx, 利用 50 的 UTXO 再次向老王转账 10, gas 设置为 5, 这笔 tx 记为 tx1

那么如果 tx1 成交，

那么我的钱包里应该会有两个 UTXO, 分别是 30, 35 这两张，前者是没动的 UTXO, 后者是 tx1 完成后返回来的 UTXO

老王钱包里则是 10+10, 两张 UTXO

矿工钱包是 5+5+5 三张 UTXO

但是我发起 tx1 之后，我想加速一下 (这里有两个方面)

我不想给老王钱了，想赖掉

那么这时候就可以用 RBF 来加速，发起一笔新的 tx, 称之为 tx2, tx2 是利用面额为 50 的这笔 UTXO, 给自己转 20, gas 设置为 10.

这笔 tx2 完成之后

我的钱包里会有 20 + 20 + 30, 这三张 UTXO

老王的钱包只有 10, 一张 UTXO

矿工的钱包里有 5+5+10, 三张 UTXO

tx2 会成交，因此可以赖掉给老王的转账 🍓

我嫌弃 gas 太低，想快点成交

同样可以用 RBF 进行交易，发起一笔新的 tx2, 利用面额为 50 的这笔 UTXO, 给老王转账 10, gas 设置为 10

那么 tx2 完成之后

我的钱包里会有 30+30 这两张

老王钱包里会有 10+10 这两张

矿工钱包里 则是 5+5+10, 这三张

CPFP, 全称为 Child Pays For Parent, 即利用发起一笔 gas 高的子交易，来加速父交易，

因为想要确认高 gas 的子交易，就一定要确认父交易

首先明白，所谓子交易指的是，子交易的 input, 用的是未能确认的父交易的 output.

即我发起 tx1, 给老王转账 100 gas 设置为 10. 100 作为 tx1 的 output.

老王想用我给他这 100 作为 input, 给老李转 50, 但是由于我的这笔 tx1 还没确认，因此他只能发起一笔子交易 tx2, gas 设置为 20, 来加速父交易.

这里的父交易即 tx1, 子交易即为 tx2.

实践

以Sparrow Wallet来说，启动 testnet >>>> Tools-->Restart Testnet

可以在测试网多玩一玩 ⚱

Connect, 连接区块的时候，可能不会很顺利，Clash 开 Direct 会好一些，如下图

领水合集

https://testnet-faucet.com/btc-testnet/

https://bitcoinfaucet.uo1.net/send.php

https://testnet-faucet.mempool.co/

面板介绍

介绍下左边的这几个面板

Transactions 指的是你作为接收方 或者 发送方的 tx

Send, 是给某个地址发送 BTC,

payto 字段是发送给谁

label 是标识字符，类似于注释

amount 是发送多少

Fee 这里，可以自己拖动来调节 gas, 最后的 Fee = tx 大小 * gas

Receive 这里，即你可以选择用某个地址 接受外部转账

Address 这里注意，这里面的 Address 都是你可以用的地址，由于一套助记词生成 N 多地址，所以这些地址都归属于你了，他们名下的 UTXO 你也都可以用，如果想用某个 UTXO, 直接选择该 UTXO, 然后 “Send Selected” 即可 如下图

UTXOs 这一栏，即你可以花的 UTXO, 与上面同理，想花哪个选中，选择小飞机图标即可，如下图

Setting 这一栏，就不过多叙述了 :walking:

BRF 实践

txB 替代 txA, 针对的是 “我嫌弃 gas 太低，想快点成交” 这种情况，大概原理如下

我首先发起 txA, 用 tb1qn2zt7xzc4nwe4m5rzg8jt4gr446h069vjunapj 地址中的一个面值为 1282sats 的 utxo (简称 U1), 给 tb1q66spu0n20ru23yhc6katlwu4j9xl4sn9yxrnwh 这个地址转账 1131sats, gas 花 151stas. (151 + 1131 = 1282)

后面发起 RBF, 即为 txB, 用上面的 U1 以及 另外一个面值为 1712sats 的 UTXO (简称 U2), 这两个 utxo, 作为 input, 给 tb1q66spu0n20ru23yhc6katlwu4j9xl4sn9yxrnwh 这个地址 转了 2610sats, gas 花了 384, (1282 + 1712 = 2610 + 384)

最后可见，txB 成交，而 txA 并没有成交

这一笔之所以用两个 UTXO, 是因为 U1 的 balance 不足以支撑 txB

txB 替代 txA, 针对的是 “我不想给老王钱了，想赖掉” 这种情况，大概原理如下

我发起 txA, 用 tb1qn2zt7xzc4nwe4m5rzg8jt4gr446h069vjunapj 地址中的一个面值为 8135sats 的 utxo (简称 U1), 给 tb1q4eqr370h7w37quke9nes5yc9ncnpctfpejv8df 地址转账 294sats, gas 为 158sats

后发起 txB, 同样用 U1, 给 tb1q4eqr370h7w37quke9nes5yc9ncnpctfpejv8df 转账 294sats, gas 为 748

最后 txB 成交，txA 没有成交

CPFP 实践

父交易 和 子交易, 大概经过如下

我首先发起父交易，即 tb1qn2zt7xzc4nwe4m5rzg8jt4gr446h069vjunapj (简称地址 A) 一张面额为 12281sats 的 UTXO (U1) 作为 input, 向 tb1q4eqr370h7w37quke9nes5yc9ncnpctfpejv8df (简称地址 B) 转账 1000sats, 其余的 11140sats 退回到 tb1qzk35rutqjcuj7la95hvvcdqkczjv7dqwtyh6ls (简称地址 C)

然后我用地址 C 收到的 11140sats, 发起向 tb1q80262jz5ytdfhj38ur4l7duect6qppc4j6unj7 (简称地址 D) 转账 1000sats 的子交易.

由于子交易的提速，所以父交易的有效费率 由 1.01-->1.43, 而子交易的有效费率 由 1.85-->1.43

再强调一点，玩 BRC20 的话，不要 RBF, 用 CPFP (至于为什么 我了解不多，不多说)

Sparrow 中，想发起加速的时候，Fee 和 amount 为什么标红？

如果有一个 utxo, 并不是自己发起的，只是别人给我的，并且这个 UTXO 的 value 只有 546, 那就是太小了，

换句话说，这个 UTXO 的余额 不足以支撑新 UTXO 的输入 以及 提升 gas 的费用 (即不足以支付 children)

感谢康纳和 alex 两位大哥的技术指导